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:
-rw-r--r--CMakeLists.txt5
-rw-r--r--SConstruct21
-rw-r--r--bin/.blender/.Blanguages2
-rw-r--r--config/darwin-config.py6
-rw-r--r--config/linux2-config.py11
-rw-r--r--config/linuxcross-config.py2
-rw-r--r--config/openbsd3-config.py2
-rw-r--r--config/sunos5-config.py2
-rw-r--r--config/win32-mingw-config.py21
-rw-r--r--config/win32-vc-config.py2
-rw-r--r--doc/blender-scons.txt11
-rw-r--r--extern/SConscript3
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/README.txt0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTBBox.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTBitmapGlyph.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTBufferGlyph.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTFace.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTFont.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTGL.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTGLBitmapFont.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTGLBufferFont.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTGLOutlineFont.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTGLPixmapFont.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTGLPolygonFont.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTGLTextureFont.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTGlyph.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTGlyphContainer.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTLibrary.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTPixmapGlyph.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTPoint.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTSize.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/include/FTTextureGlyph.h0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTBitmapGlyph.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTBufferGlyph.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTFace.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTFont.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTGLBitmapFont.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTGLBufferFont.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTGLOutlineFont.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTGLPixmapFont.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTGLPolygonFont.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTGLTextureFont.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTGlyph.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTGlyphContainer.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTLibrary.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTPixmapGlyph.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTPoint.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTSize.cpp0
-rw-r--r--[-rwxr-xr-x]extern/bFTGL/src/FTTextureGlyph.cpp0
-rw-r--r--extern/bFTGL/src/FTVectoriser.cpp8
-rw-r--r--extern/bullet2/make/msvc_7_0/Bullet_vc7.vcproj12
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp261
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h83
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h2
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h40
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h5
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h10
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp56
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h100
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp13
-rw-r--r--extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h3
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp55
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h6
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h10
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp49
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h16
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp14
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h79
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp115
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h51
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp18
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h16
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp31
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h18
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp39
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h13
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp7
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h6
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp23
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h4
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp150
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.h5
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp55
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h10
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp13
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h8
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp11
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h8
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp16
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h13
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp15
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h50
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp58
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h35
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp146
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h60
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp36
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h31
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp26
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h19
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h11
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp16
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h24
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp38
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h26
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp22
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h46
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp48
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h6
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp26
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h32
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp4
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h9
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp299
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h36
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp7
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h10
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp22
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h16
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp714
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h288
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp52
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h44
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp13
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h8
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp19
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp53
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h6
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp8
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h4
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h3
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h2
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp6
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h57
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp27
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h43
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp26
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h16
-rw-r--r--extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h9
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp36
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h14
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h2
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h13
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp16
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h4
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h2
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp5
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp39
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h5
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h27
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp111
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp8
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h43
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h8
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp24
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h6
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h4
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp32
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h6
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp135
-rw-r--r--extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h12
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp286
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h123
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btConstraintSolver.h6
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp100
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.h57
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h30
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp78
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h12
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp35
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h11
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h18
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp7
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h13
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp846
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h37
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp58
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h7
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverBody.h71
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h63
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp12
-rw-r--r--extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h14
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp340
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h31
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h16
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp133
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h59
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp30
-rw-r--r--extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h6
-rw-r--r--extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp173
-rw-r--r--extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h57
-rw-r--r--extern/bullet2/src/BulletDynamics/Vehicle/btVehicleRaycaster.h4
-rw-r--r--extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.cpp13
-rw-r--r--extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h24
-rw-r--r--extern/bullet2/src/LinearMath/btAabbUtil2.h10
-rw-r--r--extern/bullet2/src/LinearMath/btAlignedAllocator.cpp27
-rw-r--r--extern/bullet2/src/LinearMath/btAlignedAllocator.h7
-rw-r--r--extern/bullet2/src/LinearMath/btAlignedObjectArray.h226
-rw-r--r--extern/bullet2/src/LinearMath/btDefaultMotionState.h7
-rw-r--r--extern/bullet2/src/LinearMath/btGeometryUtil.cpp45
-rw-r--r--extern/bullet2/src/LinearMath/btGeometryUtil.h6
-rw-r--r--extern/bullet2/src/LinearMath/btIDebugDraw.h35
-rw-r--r--extern/bullet2/src/LinearMath/btMatrix3x3.h217
-rw-r--r--extern/bullet2/src/LinearMath/btMotionState.h7
-rw-r--r--extern/bullet2/src/LinearMath/btPoint3.h2
-rw-r--r--extern/bullet2/src/LinearMath/btQuadWord.h30
-rw-r--r--extern/bullet2/src/LinearMath/btQuaternion.h79
-rw-r--r--extern/bullet2/src/LinearMath/btQuickprof.cpp2
-rw-r--r--extern/bullet2/src/LinearMath/btQuickprof.h131
-rw-r--r--extern/bullet2/src/LinearMath/btScalar.h76
-rw-r--r--extern/bullet2/src/LinearMath/btSimdMinMax.h2
-rw-r--r--extern/bullet2/src/LinearMath/btTransform.h39
-rw-r--r--extern/bullet2/src/LinearMath/btTransformUtil.h51
-rw-r--r--extern/bullet2/src/LinearMath/btVector3.h33
-rw-r--r--extern/bullet2/src/SConscript1
-rw-r--r--extern/bullet2/src/btBulletCollisionCommon.h1
-rw-r--r--extern/bullet2/src/btBulletDynamicsCommon.h1
-rw-r--r--[-rwxr-xr-x]extern/qhull/COPYING.txt0
-rw-r--r--[-rwxr-xr-x]extern/qhull/README.txt0
-rw-r--r--[-rwxr-xr-x]extern/qhull/REGISTER.txt0
-rw-r--r--[-rwxr-xr-x]extern/qhull/VisualC6/qhull.dsw0
-rw-r--r--[-rwxr-xr-x]extern/qhull/VisualC6/qhull/qhull.dsp0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/geom.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/io.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/mem.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/merge.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/poly.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/qhull.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/qhull_a.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/qset.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/stat.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/include/qhull/user.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/Makefile.txt0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/geom.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/geom.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/geom2.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/global.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/io.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/io.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/mem.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/mem.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/merge.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/merge.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/poly.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/poly.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/poly2.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qconvex.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qdelaun.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qhalf.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qhull.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qhull.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qhull_a.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qhull_interface.cpp0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qset.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qset.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/qvoronoi.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/rbox.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/stat.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/stat.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/unix.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/user.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/user.h0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/user_eg.c0
-rw-r--r--[-rwxr-xr-x]extern/qhull/src/user_eg2.c0
-rw-r--r--[-rwxr-xr-x]extern/solid/LICENSE_GPL.txt0
-rw-r--r--[-rwxr-xr-x]extern/solid/LICENSE_QPL.txt0
-rw-r--r--[-rwxr-xr-x]extern/solid/Makefile0
-rw-r--r--[-rwxr-xr-x]extern/solid/README.txt0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/broad/broad.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/complex/complex.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/convex/convex.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/dynamics/dynamics.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/gldemo/gldemo.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/mnm/mnm.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/physics/physics.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/sample/sample.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/solid.dsw0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/solid/solid.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/VisualC6/solid_dll/solid_dll.dsp0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/GEN_MinMax.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/GEN_random.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT/Interval.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT/Matrix3x3.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT/Quaternion.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT/Transform.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT/Tuple3.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT/Tuple4.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT/Vector3.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT_BBox.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT_Interval.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT_Matrix3x3.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT_Point3.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT_Quaternion.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT_Scalar.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT_Transform.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/MT_Vector3.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/SOLID.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/SOLID_broad.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/include/SOLID_types.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_AlgoTable.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_C-api.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_Encounter.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_Encounter.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_Object.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_Object.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_RespTable.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_RespTable.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_Response.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_Scene.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/DT_Scene.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/broad/BP_C-api.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/broad/BP_Endpoint.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/broad/BP_EndpointList.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/broad/BP_EndpointList.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/broad/BP_Proxy.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/broad/BP_Proxy.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/broad/BP_ProxyList.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/broad/BP_Scene.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/broad/BP_Scene.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/complex/DT_BBoxTree.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/complex/DT_BBoxTree.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/complex/DT_CBox.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/complex/DT_Complex.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/complex/DT_Complex.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Accuracy.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Accuracy.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Array.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Box.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Box.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Cone.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Cone.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Convex.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Convex.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Cylinder.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Cylinder.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Facet.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Facet.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_GJK.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Hull.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_IndexArray.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_LineSegment.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_LineSegment.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Minkowski.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_PenDepth.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_PenDepth.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Point.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Point.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Polyhedron.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Polyhedron.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Polytope.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Polytope.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Shape.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Sphere.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Sphere.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Transform.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Triangle.cpp0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_Triangle.h0
-rw-r--r--[-rwxr-xr-x]extern/solid/src/convex/DT_VertexBase.h0
-rw-r--r--extern/verse/Makefile3
-rw-r--r--extern/verse/dist/v_connection.c3
-rw-r--r--extern/verse/dist/v_network.c7
-rw-r--r--intern/action/ACT_Action.h141
-rw-r--r--intern/action/ACT_ActionC-Api.h193
-rw-r--r--intern/action/ACT_ActionStack.h185
-rw-r--r--intern/action/Makefile52
-rw-r--r--intern/action/doc/Doxyfile746
-rw-r--r--intern/action/intern/ACT_ActionC-Api.cpp134
-rw-r--r--intern/action/intern/ACT_ActionStack.cpp245
-rw-r--r--intern/action/intern/ACT_CallbackAction.h125
-rw-r--r--intern/action/make/msvc_6_0/action.dsp128
-rw-r--r--intern/action/make/msvc_6_0/action.dsw29
-rw-r--r--intern/action/make/msvc_7_0/action.sln21
-rw-r--r--intern/action/make/msvc_7_0/action.vcproj145
-rw-r--r--intern/action/test/action_c_test/ActionTest.c87
-rw-r--r--intern/action/test/action_c_test/make/msvc_6_0/action_c_test.dsp109
-rw-r--r--intern/action/test/action_c_test/make/msvc_6_0/action_c_test.dsw44
-rw-r--r--intern/action/test/action_cpp_test/ActionTest.cpp87
-rw-r--r--intern/action/test/action_cpp_test/TestAction.h58
-rw-r--r--intern/action/test/action_cpp_test/make/msvc_6_0/action_cpp_test.dsp105
-rw-r--r--intern/action/test/action_cpp_test/make/msvc_6_0/action_cpp_test.dsw44
-rw-r--r--intern/bmfont/BMF_Api.h36
-rw-r--r--intern/bmfont/intern/BMF_Api.cpp22
-rw-r--r--intern/bmfont/intern/BMF_BitmapFont.cpp114
-rw-r--r--intern/bmfont/intern/BMF_BitmapFont.h34
-rw-r--r--intern/boolop/intern/BOP_BSPNode.cpp2
-rw-r--r--intern/boolop/intern/BOP_Face.cpp10
-rw-r--r--intern/boolop/intern/BOP_Face.h13
-rw-r--r--intern/boolop/intern/BOP_Face2Face.cpp116
-rw-r--r--intern/boolop/intern/BOP_MathUtils.cpp68
-rw-r--r--intern/boolop/intern/BOP_MathUtils.h16
-rw-r--r--intern/boolop/intern/BOP_Merge.cpp6
-rw-r--r--intern/boolop/intern/BOP_Mesh.cpp45
-rw-r--r--intern/boolop/intern/BOP_Triangulator.cpp53
-rw-r--r--[-rwxr-xr-x]intern/bsp/extern/CSG_BooleanOps.h0
-rw-r--r--[-rwxr-xr-x]intern/bsp/intern/BSP_CSGException.h0
-rw-r--r--[-rwxr-xr-x]intern/bsp/intern/BSP_CSGMesh.cpp0
-rw-r--r--[-rwxr-xr-x]intern/bsp/intern/BSP_CSGMesh.h0
-rw-r--r--[-rwxr-xr-x]intern/bsp/intern/BSP_CSGMesh_CFIterator.h7
-rw-r--r--[-rwxr-xr-x]intern/bsp/intern/BSP_MeshPrimitives.cpp0
-rw-r--r--[-rwxr-xr-x]intern/bsp/intern/CSG_BooleanOps.cpp0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsp0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsw0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.h0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.h0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.h0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/BSP_TMesh.h0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/main.cpp0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/ply.h0
-rw-r--r--[-rwxr-xr-x]intern/bsp/test/BSP_GhostTest/plyfile.c0
-rw-r--r--intern/csg/SConscript8
-rw-r--r--intern/csg/extern/CSG_Interface.h434
-rw-r--r--intern/csg/intern/CSG_BBox.h206
-rw-r--r--intern/csg/intern/CSG_BBoxTree.cpp125
-rw-r--r--intern/csg/intern/CSG_BBoxTree.h135
-rw-r--r--intern/csg/intern/CSG_BlenderVProp.h94
-rw-r--r--intern/csg/intern/CSG_BooleanOp.h88
-rw-r--r--intern/csg/intern/CSG_BooleanOp.inl235
-rw-r--r--intern/csg/intern/CSG_CVertex.h104
-rw-r--r--intern/csg/intern/CSG_ConnectedMesh.h95
-rw-r--r--intern/csg/intern/CSG_ConnectedMeshWrapper.inl210
-rw-r--r--intern/csg/intern/CSG_GeometryBinder.h72
-rw-r--r--intern/csg/intern/CSG_IndexDefs.h42
-rw-r--r--intern/csg/intern/CSG_Math.h152
-rw-r--r--intern/csg/intern/CSG_Math.inl362
-rw-r--r--intern/csg/intern/CSG_Mesh.h66
-rw-r--r--intern/csg/intern/CSG_MeshCopier.h45
-rw-r--r--intern/csg/intern/CSG_MeshWrapper.h110
-rw-r--r--intern/csg/intern/CSG_MeshWrapper.inl150
-rw-r--r--intern/csg/intern/CSG_Polygon.h93
-rw-r--r--intern/csg/intern/CSG_SplitFunction.h188
-rw-r--r--intern/csg/intern/CSG_TreeQueries.h158
-rw-r--r--intern/csg/intern/CSG_Triangulate.h96
-rw-r--r--intern/csg/intern/CSG_Triangulate.inl232
-rw-r--r--intern/csg/intern/CSG_Vertex.h56
-rw-r--r--intern/csg/intern/MT_Line3.cpp81
-rw-r--r--intern/csg/intern/MT_Line3.h109
-rw-r--r--intern/csg/intern/blender/CSG_BlenderMesh.h45
-rw-r--r--intern/csg/intern/blender/CSG_BlenderVProp.cpp35
-rw-r--r--intern/csg/intern/blender/CSG_CsgOp.cpp257
-rw-r--r--intern/csg/intern/blender/CSG_CsgOp.h59
-rw-r--r--intern/csg/intern/blender/CSG_IndexDefs.h22
-rw-r--r--intern/csg/intern/blender/CSG_Interface.cpp193
-rw-r--r--intern/csg/intern/blender/CSG_Iterator.h199
-rw-r--r--intern/csg/intern/blender/CSG_MeshBuilder.h123
-rw-r--r--intern/csg/intern/blender/CSG_PropArray.h126
-rw-r--r--intern/csg/intern/blender/CSG_SimpleProp.cpp4
-rw-r--r--intern/csg/intern/blender/CSG_SimpleProp.h58
-rw-r--r--intern/csg/make/msvc60/csg.dsp234
-rw-r--r--intern/csg/make/msvc60/csg.dsw29
-rw-r--r--intern/elbeem/extern/elbeem.h2
-rw-r--r--intern/elbeem/intern/attributes.cpp1
-rw-r--r--intern/elbeem/intern/elbeem.h2
-rw-r--r--intern/elbeem/intern/isosurface.cpp5
-rw-r--r--intern/elbeem/intern/loop_tools.h81
-rw-r--r--intern/elbeem/intern/ntl_geometryobject.cpp2
-rw-r--r--intern/elbeem/intern/ntl_vector3dim.h3
-rw-r--r--intern/elbeem/intern/paraloopend.h42
-rw-r--r--intern/elbeem/intern/parametrizer.cpp2
-rw-r--r--intern/elbeem/intern/particletracer.cpp1
-rw-r--r--intern/elbeem/intern/simulation_object.cpp5
-rw-r--r--intern/elbeem/intern/solver_class.h5
-rw-r--r--intern/elbeem/intern/solver_init.cpp55
-rw-r--r--intern/elbeem/intern/solver_interface.cpp7
-rw-r--r--intern/elbeem/intern/solver_interface.h6
-rw-r--r--intern/elbeem/intern/solver_main.cpp19
-rw-r--r--intern/elbeem/intern/solver_util.cpp1
-rw-r--r--intern/elbeem/intern/utilities.cpp6
-rw-r--r--intern/elbeem/intern/utilities.h2
-rw-r--r--[-rwxr-xr-x]intern/ghost/doc/ghost_interface.cfg0
-rw-r--r--intern/ghost/intern/GHOST_DisplayManager.cpp2
-rw-r--r--[-rwxr-xr-x]intern/ghost/intern/GHOST_DisplayManagerX11.cpp0
-rw-r--r--[-rwxr-xr-x]intern/ghost/intern/GHOST_DisplayManagerX11.h0
-rw-r--r--intern/ghost/intern/GHOST_SystemWin32.cpp8
-rw-r--r--[-rwxr-xr-x]intern/ghost/intern/GHOST_SystemX11.cpp0
-rw-r--r--[-rwxr-xr-x]intern/ghost/intern/GHOST_SystemX11.h0
-rw-r--r--[-rwxr-xr-x]intern/ghost/intern/GHOST_WindowX11.cpp6
-rw-r--r--[-rwxr-xr-x]intern/ghost/intern/GHOST_WindowX11.h0
-rw-r--r--[-rwxr-xr-x]intern/ghost/test/Makefile0
-rw-r--r--[-rwxr-xr-x]intern/ghost/test/gears/GHOST_Test.cpp0
-rw-r--r--[-rwxr-xr-x]intern/ghost/test/gears/Makefile0
-rw-r--r--[-rwxr-xr-x]intern/ghost/test/multitest/MultiTest.c0
-rw-r--r--intern/iksolver/extern/IK_solver.h2
-rw-r--r--intern/iksolver/intern/IK_QJacobian.cpp3
-rw-r--r--intern/iksolver/intern/IK_QJacobian.h4
-rw-r--r--intern/iksolver/intern/IK_QJacobianSolver.cpp172
-rw-r--r--intern/iksolver/intern/IK_QJacobianSolver.h26
-rw-r--r--intern/iksolver/intern/IK_QSegment.cpp41
-rw-r--r--intern/iksolver/intern/IK_QSegment.h9
-rw-r--r--intern/iksolver/intern/IK_QTask.h9
-rw-r--r--intern/iksolver/intern/IK_Solver.cpp35
-rw-r--r--intern/keymaker/Makefile92
-rw-r--r--intern/keymaker/blenkey.h83
-rw-r--r--intern/keymaker/key.c496
-rw-r--r--intern/keymaker/key_internal.h92
-rw-r--r--intern/keymaker/keyloader.c319
-rw-r--r--intern/keymaker/make/msvc_6_0/blenkey.dsp134
-rw-r--r--intern/keymaker/make/msvc_6_0/blenkey.dsw29
-rw-r--r--intern/keymaker/make/msvc_7_0/blenkey.sln21
-rw-r--r--intern/keymaker/make/msvc_7_0/blenkey.vcproj282
-rw-r--r--intern/keymaker/mt19937int.c134
-rw-r--r--intern/keymaker/python/key_pyc.h154
-rw-r--r--intern/make/msvc_7_0/intern.sln15
-rw-r--r--intern/memutil/MEM_CacheLimiter.h3
-rw-r--r--[-rwxr-xr-x]intern/moto/include/MT_Matrix3x3.h0
-rw-r--r--[-rwxr-xr-x]intern/moto/include/MT_Matrix4x4.h0
-rw-r--r--[-rwxr-xr-x]intern/moto/include/MT_MinMax.h0
-rw-r--r--[-rwxr-xr-x]intern/moto/include/MT_Scalar.h0
-rw-r--r--[-rwxr-xr-x]intern/moto/include/MT_Stream.h0
-rw-r--r--[-rwxr-xr-x]intern/moto/include/MT_Tuple2.h0
-rw-r--r--[-rwxr-xr-x]intern/moto/include/MT_Tuple3.h0
-rw-r--r--[-rwxr-xr-x]intern/moto/include/MT_Tuple4.h0
-rw-r--r--intern/moto/include/MT_Vector3.h1
-rw-r--r--intern/moto/include/MT_Vector4.h1
-rw-r--r--intern/moto/include/MT_assert.h2
-rw-r--r--[-rwxr-xr-x]intern/moto/include/MT_random.h0
-rw-r--r--intern/moto/intern/MT_Assert.cpp2
-rw-r--r--[-rwxr-xr-x]intern/moto/intern/MT_CmMatrix4x4.cpp0
-rw-r--r--[-rwxr-xr-x]intern/moto/intern/MT_random.cpp0
-rw-r--r--[-rwxr-xr-x]intern/moto/make/msvc_6_0/MoTo.dsp0
-rw-r--r--[-rwxr-xr-x]intern/moto/make/msvc_6_0/MoTo.dsw0
-rw-r--r--intern/opennl/extern/ONL_opennl.h35
-rw-r--r--intern/opennl/intern/opennl.c524
-rw-r--r--intern/string/intern/STR_String.cpp1
-rw-r--r--po/Makefile7
-rw-r--r--projectfiles/blender/src/BL_src.dsp4
-rw-r--r--projectfiles/blender/src/BL_src_cre.dsp4
-rw-r--r--projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj20
-rw-r--r--projectfiles_vc7/blender/blenlib/BLI_blenlib.vcproj6
-rw-r--r--projectfiles_vc7/blender/ftfont/FTF_ftfont.vcproj4
-rw-r--r--projectfiles_vc7/blender/imbuf/BL_imbuf.vcproj77
-rw-r--r--projectfiles_vc7/blender/nodes/nodes.vcproj21
-rw-r--r--projectfiles_vc7/blender/render/BRE_render.vcproj5
-rw-r--r--projectfiles_vc7/blender/src/BL_src.vcproj35
-rw-r--r--projectfiles_vc7/blender/src/BL_src_cre.vcproj4
-rw-r--r--release/Makefile98
-rw-r--r--release/datafiles/blenderbuttonsbin67487 -> 64418 bytes
-rw-r--r--release/datafiles/preview.blendbin459544 -> 444636 bytes
-rw-r--r--release/datafiles/prviconsbin0 -> 13732 bytes
-rw-r--r--release/datafiles/splash.jpgbin0 -> 79258 bytes
-rw-r--r--release/scripts/3ds_import.py15
-rw-r--r--release/scripts/DirectX8Importer.py231
-rw-r--r--[-rwxr-xr-x]release/scripts/IDPropBrowser.py0
-rw-r--r--release/scripts/ac3d_import.py2
-rw-r--r--release/scripts/add_mesh_empty.py13
-rw-r--r--release/scripts/bpymodules/BPyMesh.py2
-rw-r--r--release/scripts/bpymodules/BPyMessages.py2
-rw-r--r--release/scripts/bpymodules/BPyObject.py2
-rw-r--r--release/scripts/bpymodules/BPyRender.py2
-rw-r--r--[-rwxr-xr-x]release/scripts/bpymodules/BPyWindow.py0
-rw-r--r--[-rwxr-xr-x]release/scripts/bpymodules/mesh_gradient.py0
-rw-r--r--release/scripts/bvh_import.py4
-rw-r--r--release/scripts/console.py35
-rw-r--r--release/scripts/export_fbx.py2352
-rw-r--r--release/scripts/export_obj.py20
-rw-r--r--release/scripts/flt_defaultp.py1
-rw-r--r--[-rwxr-xr-x]release/scripts/flt_export.py1485
-rw-r--r--release/scripts/flt_filewalker.py9
-rw-r--r--[-rwxr-xr-x]release/scripts/flt_import.py1581
-rw-r--r--release/scripts/flt_palettemanager.py388
-rw-r--r--release/scripts/flt_properties.py619
-rw-r--r--release/scripts/flt_toolbar.py594
-rw-r--r--release/scripts/image_auto_layout.py57
-rw-r--r--release/scripts/image_billboard.py35
-rw-r--r--release/scripts/import_dxf.py7039
-rw-r--r--release/scripts/import_obj.py2
-rw-r--r--release/scripts/lightwave_import.py186
-rw-r--r--[-rwxr-xr-x]release/scripts/mesh_boneweight_copy.py0
-rw-r--r--release/scripts/mesh_edges2curves.py9
-rw-r--r--release/scripts/mesh_skin.py2
-rw-r--r--release/scripts/mesh_unfolder.py194
-rw-r--r--release/scripts/mesh_wire.py27
-rw-r--r--[-rwxr-xr-x]release/scripts/object_cookie_cutter.py0
-rw-r--r--[-rwxr-xr-x]release/scripts/object_random_loc_sz_rot.py65
-rw-r--r--release/scripts/ply_import.py8
-rw-r--r--release/scripts/scripttemplate_pyconstraint.py114
-rw-r--r--release/scripts/uv_export.py64
-rw-r--r--release/scripts/uv_seams_from_islands.py7
-rw-r--r--release/scripts/uvcalc_follow_active_coords.py12
-rw-r--r--release/scripts/uvcalc_from_adjacent.py129
-rw-r--r--release/scripts/uvcalc_lightmap.py15
-rw-r--r--release/scripts/uvcalc_quad_clickproj.py11
-rw-r--r--release/scripts/uvcalc_smart_project.py3
-rw-r--r--[-rwxr-xr-x]release/scripts/vertexpaint_gradient.py0
-rw-r--r--release/scripts/vertexpaint_selfshadow_ao.py11
-rw-r--r--release/scripts/vrml97_export.py8
-rw-r--r--release/scripts/weightpaint_average.py121
-rw-r--r--[-rwxr-xr-x]release/scripts/weightpaint_gradient.py0
-rw-r--r--release/scripts/weightpaint_invert.py95
-rw-r--r--release/scripts/weightpaint_normalize.py126
-rw-r--r--release/scripts/wizard_curve2tree.py3879
-rw-r--r--[-rwxr-xr-x]release/text/blender.html0
-rw-r--r--source/Makefile21
-rw-r--r--source/blender/SConscript3
-rw-r--r--source/blender/avi/intern/options.c4
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h28
-rw-r--r--source/blender/blenkernel/BKE_action.h17
-rw-r--r--source/blender/blenkernel/BKE_armature.h4
-rw-r--r--source/blender/blenkernel/BKE_bad_level_calls.h23
-rw-r--r--source/blender/blenkernel/BKE_blender.h4
-rw-r--r--source/blender/blenkernel/BKE_constraint.h135
-rw-r--r--source/blender/blenkernel/BKE_customdata.h6
-rw-r--r--source/blender/blenkernel/BKE_deform.h1
-rw-r--r--source/blender/blenkernel/BKE_displist.h2
-rw-r--r--source/blender/blenkernel/BKE_global.h19
-rw-r--r--source/blender/blenkernel/BKE_icons.h75
-rw-r--r--source/blender/blenkernel/BKE_idprop.h1
-rw-r--r--source/blender/blenkernel/BKE_image.h2
-rw-r--r--source/blender/blenkernel/BKE_key.h1
-rw-r--r--source/blender/blenkernel/BKE_lattice.h4
-rw-r--r--source/blender/blenkernel/BKE_main.h1
-rw-r--r--source/blender/blenkernel/BKE_mesh.h17
-rw-r--r--source/blender/blenkernel/BKE_modifier.h19
-rw-r--r--source/blender/blenkernel/BKE_node.h14
-rw-r--r--source/blender/blenkernel/BKE_object.h6
-rw-r--r--source/blender/blenkernel/BKE_particle.h254
-rw-r--r--source/blender/blenkernel/BKE_pointcache.h48
-rw-r--r--source/blender/blenkernel/BKE_softbody.h13
-rw-r--r--source/blender/blenkernel/BKE_texture.h3
-rw-r--r--source/blender/blenkernel/BKE_utildefines.h6
-rw-r--r--source/blender/blenkernel/BKE_verse.h33
-rw-r--r--source/blender/blenkernel/CMakeLists.txt1
-rw-r--r--source/blender/blenkernel/SConscript4
-rw-r--r--source/blender/blenkernel/bad_level_call_stubs/Makefile4
-rw-r--r--source/blender/blenkernel/bad_level_call_stubs/stubs.c46
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c345
-rw-r--r--source/blender/blenkernel/intern/Makefile10
-rw-r--r--source/blender/blenkernel/intern/action.c148
-rw-r--r--source/blender/blenkernel/intern/anim.c276
-rw-r--r--source/blender/blenkernel/intern/armature.c802
-rw-r--r--source/blender/blenkernel/intern/blender.c7
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c4
-rw-r--r--source/blender/blenkernel/intern/colortools.c8
-rw-r--r--source/blender/blenkernel/intern/constraint.c4918
-rw-r--r--source/blender/blenkernel/intern/curve.c36
-rw-r--r--source/blender/blenkernel/intern/customdata.c128
-rw-r--r--source/blender/blenkernel/intern/deform.c26
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c246
-rw-r--r--source/blender/blenkernel/intern/displist.c4
-rw-r--r--source/blender/blenkernel/intern/effect.c6
-rw-r--r--source/blender/blenkernel/intern/exotic.c21
-rw-r--r--source/blender/blenkernel/intern/icons.c169
-rw-r--r--source/blender/blenkernel/intern/idprop.c61
-rw-r--r--source/blender/blenkernel/intern/image.c318
-rw-r--r--source/blender/blenkernel/intern/ipo.c222
-rw-r--r--source/blender/blenkernel/intern/key.c40
-rw-r--r--source/blender/blenkernel/intern/library.c28
-rw-r--r--source/blender/blenkernel/intern/material.c17
-rw-r--r--source/blender/blenkernel/intern/mesh.c40
-rw-r--r--source/blender/blenkernel/intern/modifier.c1796
-rw-r--r--source/blender/blenkernel/intern/node.c9
-rw-r--r--source/blender/blenkernel/intern/object.c432
-rw-r--r--source/blender/blenkernel/intern/particle.c2978
-rw-r--r--source/blender/blenkernel/intern/particle_system.c4371
-rw-r--r--source/blender/blenkernel/intern/pointcache.c185
-rw-r--r--source/blender/blenkernel/intern/scene.c22
-rw-r--r--source/blender/blenkernel/intern/softbody.c607
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c512
-rw-r--r--source/blender/blenkernel/intern/texture.c24
-rw-r--r--source/blender/blenkernel/intern/verse_geometry_node.c547
-rw-r--r--source/blender/blenkernel/intern/world.c11
-rw-r--r--source/blender/blenkernel/intern/writeavi.c5
-rw-r--r--source/blender/blenkernel/intern/writeffmpeg.c41
-rw-r--r--source/blender/blenlib/BLI_arithb.h1024
-rw-r--r--source/blender/blenlib/BLI_blenlib.h30
-rw-r--r--source/blender/blenlib/BLI_editVert.h9
-rw-r--r--source/blender/blenlib/BLI_fnmatch.h69
-rw-r--r--source/blender/blenlib/BLI_kdtree.h (renamed from intern/action/test/action_c_test/TestAction.c)56
-rw-r--r--source/blender/blenlib/BLI_storage_types.h3
-rw-r--r--source/blender/blenlib/intern/BLI_kdtree.c327
-rw-r--r--source/blender/blenlib/intern/Makefile4
-rw-r--r--source/blender/blenlib/intern/arithb.c1042
-rw-r--r--source/blender/blenlib/intern/fnmatch.c250
-rw-r--r--source/blender/blenlib/intern/storage.c11
-rw-r--r--source/blender/blenlib/intern/threads.c34
-rw-r--r--source/blender/blenlib/intern/util.c319
-rw-r--r--source/blender/blenloader/BLO_readfile.h19
-rw-r--r--source/blender/blenloader/intern/Makefile4
-rw-r--r--source/blender/blenloader/intern/readblenentry.c66
-rw-r--r--source/blender/blenloader/intern/readfile.c1000
-rw-r--r--source/blender/blenloader/intern/writefile.c206
-rw-r--r--source/blender/blenpluginapi/iff.h2
-rw-r--r--source/blender/blenpluginapi/intern/Makefile4
-rw-r--r--source/blender/ftfont/CMakeLists.txt2
-rw-r--r--source/blender/ftfont/FTF_Api.h16
-rw-r--r--source/blender/ftfont/SConscript2
-rw-r--r--source/blender/ftfont/intern/FTF_Api.cpp32
-rw-r--r--source/blender/ftfont/intern/FTF_TTFont.cpp8
-rw-r--r--source/blender/ftfont/intern/FTF_TTFont.h11
-rw-r--r--source/blender/ftfont/intern/Makefile5
-rw-r--r--source/blender/imbuf/IMB_imbuf.h27
-rw-r--r--source/blender/imbuf/IMB_imbuf_types.h12
-rw-r--r--source/blender/imbuf/IMB_thumbs.h74
-rw-r--r--source/blender/imbuf/SConscript3
-rw-r--r--source/blender/imbuf/intern/IMB_anim.h4
-rw-r--r--source/blender/imbuf/intern/IMB_imginfo.h85
-rw-r--r--source/blender/imbuf/intern/IMB_jpeg.h2
-rw-r--r--source/blender/imbuf/intern/Makefile7
-rw-r--r--source/blender/imbuf/intern/allocimbuf.c5
-rw-r--r--source/blender/imbuf/intern/anim.c73
-rw-r--r--source/blender/imbuf/intern/cineon/Makefile4
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.cpp523
-rw-r--r--source/blender/imbuf/intern/dds/BlockDXT.h227
-rw-r--r--source/blender/imbuf/intern/dds/Color.h99
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.cpp310
-rw-r--r--source/blender/imbuf/intern/dds/ColorBlock.h115
-rw-r--r--source/blender/imbuf/intern/dds/Common.h (renamed from intern/action/intern/ACT_Action.cpp)56
-rw-r--r--source/blender/imbuf/intern/dds/DirectDrawSurface.cpp924
-rw-r--r--source/blender/imbuf/intern/dds/DirectDrawSurface.h162
-rw-r--r--source/blender/imbuf/intern/dds/Image.cpp132
-rw-r--r--source/blender/imbuf/intern/dds/Image.h103
-rw-r--r--source/blender/imbuf/intern/dds/Makefile (renamed from intern/action/intern/Makefile)35
-rw-r--r--source/blender/imbuf/intern/dds/SConscript19
-rw-r--r--source/blender/imbuf/intern/dds/Stream.cpp99
-rw-r--r--source/blender/imbuf/intern/dds/Stream.h (renamed from intern/action/test/action_c_test/TestAction.h)40
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.cpp132
-rw-r--r--source/blender/imbuf/intern/dds/dds_api.h (renamed from intern/keymaker/mt19937int.h)31
-rw-r--r--source/blender/imbuf/intern/divers.c2
-rw-r--r--source/blender/imbuf/intern/imageprocess.c226
-rw-r--r--source/blender/imbuf/intern/imginfo.c158
-rw-r--r--source/blender/imbuf/intern/jpeg.c2
-rw-r--r--source/blender/imbuf/intern/md5.c361
-rw-r--r--source/blender/imbuf/intern/md5.h116
-rw-r--r--source/blender/imbuf/intern/openexr/Makefile4
-rw-r--r--source/blender/imbuf/intern/png.c39
-rw-r--r--source/blender/imbuf/intern/radiance_hdr.c29
-rw-r--r--source/blender/imbuf/intern/readimage.c11
-rw-r--r--source/blender/imbuf/intern/rectop.c82
-rw-r--r--source/blender/imbuf/intern/rotate.c32
-rw-r--r--source/blender/imbuf/intern/thumbs.c459
-rw-r--r--source/blender/imbuf/intern/util.c15
-rw-r--r--source/blender/imbuf/intern/writeimage.c10
-rw-r--r--source/blender/include/BDR_drawaction.h25
-rw-r--r--source/blender/include/BDR_drawmesh.h3
-rw-r--r--source/blender/include/BDR_editcurve.h3
-rw-r--r--source/blender/include/BDR_editface.h4
-rw-r--r--source/blender/include/BDR_editobject.h2
-rw-r--r--source/blender/include/BDR_sculptmode.h23
-rw-r--r--source/blender/include/BIF_butspace.h33
-rw-r--r--source/blender/include/BIF_drawimage.h9
-rw-r--r--source/blender/include/BIF_drawseq.h1
-rw-r--r--source/blender/include/BIF_editaction.h63
-rw-r--r--source/blender/include/BIF_editarmature.h11
-rw-r--r--source/blender/include/BIF_editconstraint.h14
-rw-r--r--source/blender/include/BIF_editmesh.h28
-rw-r--r--source/blender/include/BIF_editparticle.h92
-rw-r--r--source/blender/include/BIF_editseq.h64
-rw-r--r--source/blender/include/BIF_editsima.h32
-rw-r--r--source/blender/include/BIF_editsound.h2
-rw-r--r--source/blender/include/BIF_editview.h1
-rw-r--r--source/blender/include/BIF_filelist.h86
-rw-r--r--source/blender/include/BIF_fsmenu.h7
-rw-r--r--source/blender/include/BIF_imasel.h25
-rw-r--r--source/blender/include/BIF_interface.h1
-rw-r--r--source/blender/include/BIF_interface_icons.h3
-rw-r--r--source/blender/include/BIF_language.h3
-rw-r--r--source/blender/include/BIF_meshlaplacian.h87
-rw-r--r--source/blender/include/BIF_meshtools.h1
-rw-r--r--source/blender/include/BIF_poseobject.h2
-rw-r--r--source/blender/include/BIF_resources.h23
-rw-r--r--source/blender/include/BIF_space.h6
-rw-r--r--source/blender/include/BIF_spacetypes.h3
-rw-r--r--[-rwxr-xr-x]source/blender/include/BIF_transform.h9
-rw-r--r--source/blender/include/BSE_drawimasel.h35
-rw-r--r--source/blender/include/BSE_editaction_types.h2
-rw-r--r--source/blender/include/BSE_editipo.h26
-rw-r--r--source/blender/include/BSE_filesel.h2
-rw-r--r--source/blender/include/BSE_node.h1
-rw-r--r--source/blender/include/BSE_sequence.h18
-rw-r--r--source/blender/include/BSE_time.h3
-rw-r--r--source/blender/include/BSE_trans_types.h1
-rw-r--r--source/blender/include/BSE_view.h1
-rw-r--r--source/blender/include/blendef.h121
-rw-r--r--source/blender/include/butspace.h48
-rw-r--r--source/blender/include/datatoc.h3
-rw-r--r--source/blender/include/editmesh.h2
-rw-r--r--source/blender/include/interface.h2
-rw-r--r--source/blender/include/multires.h3
-rw-r--r--source/blender/include/mydevice.h2
-rw-r--r--[-rwxr-xr-x]source/blender/include/transform.h74
-rw-r--r--source/blender/makesdna/DNA_ID.h28
-rw-r--r--source/blender/makesdna/DNA_action_types.h134
-rw-r--r--source/blender/makesdna/DNA_armature_types.h26
-rw-r--r--source/blender/makesdna/DNA_camera_types.h2
-rw-r--r--source/blender/makesdna/DNA_constraint_types.h351
-rw-r--r--source/blender/makesdna/DNA_curve_types.h18
-rw-r--r--source/blender/makesdna/DNA_customdata_types.h4
-rw-r--r--source/blender/makesdna/DNA_group_types.h4
-rw-r--r--source/blender/makesdna/DNA_image_types.h10
-rw-r--r--source/blender/makesdna/DNA_ipo_types.h58
-rw-r--r--source/blender/makesdna/DNA_key_types.h4
-rw-r--r--source/blender/makesdna/DNA_lamp_types.h34
-rw-r--r--source/blender/makesdna/DNA_material_types.h44
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h26
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h11
-rw-r--r--source/blender/makesdna/DNA_modifier_types.h91
-rw-r--r--source/blender/makesdna/DNA_nla_types.h10
-rw-r--r--source/blender/makesdna/DNA_node_types.h24
-rw-r--r--source/blender/makesdna/DNA_object_force.h56
-rw-r--r--source/blender/makesdna/DNA_object_types.h38
-rw-r--r--source/blender/makesdna/DNA_particle_types.h432
-rw-r--r--source/blender/makesdna/DNA_scene_types.h125
-rw-r--r--source/blender/makesdna/DNA_screen_types.h4
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h36
-rw-r--r--source/blender/makesdna/DNA_space_types.h217
-rw-r--r--source/blender/makesdna/DNA_texture_types.h24
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h126
-rw-r--r--source/blender/makesdna/DNA_view2d_types.h4
-rw-r--r--source/blender/makesdna/DNA_view3d_types.h12
-rw-r--r--source/blender/makesdna/DNA_world_types.h15
-rw-r--r--source/blender/makesdna/intern/Makefile4
-rw-r--r--source/blender/makesdna/intern/makesdna.c6
-rw-r--r--source/blender/nodes/CMP_node.h8
-rw-r--r--source/blender/nodes/SHD_node.h4
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_blur.c131
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_crop.c119
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_defocus.c9
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_glare.c498
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_invert.c2
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c192
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_math.c40
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_normalize.c113
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_scale.c6
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_texture.c18
-rw-r--r--source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c173
-rw-r--r--source/blender/nodes/intern/CMP_nodes/Makefile4
-rw-r--r--source/blender/nodes/intern/CMP_util.c593
-rw-r--r--source/blender/nodes/intern/CMP_util.h40
-rw-r--r--source/blender/nodes/intern/Makefile4
-rw-r--r--source/blender/nodes/intern/SHD_nodes/Makefile4
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c94
-rw-r--r--source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c105
-rw-r--r--source/blender/python/BPY_extern.h30
-rw-r--r--source/blender/python/BPY_interface.c578
-rw-r--r--source/blender/python/SConscript3
-rw-r--r--source/blender/python/api2_2x/Armature.c337
-rw-r--r--source/blender/python/api2_2x/BGL.c4
-rw-r--r--source/blender/python/api2_2x/BezTriple.c25
-rw-r--r--source/blender/python/api2_2x/Blender.c2
-rw-r--r--source/blender/python/api2_2x/Bone.c92
-rw-r--r--source/blender/python/api2_2x/Bone.h1
-rw-r--r--source/blender/python/api2_2x/Camera.c71
-rw-r--r--source/blender/python/api2_2x/Constraint.c789
-rw-r--r--source/blender/python/api2_2x/CurNurb.c28
-rw-r--r--source/blender/python/api2_2x/Curve.c182
-rw-r--r--source/blender/python/api2_2x/Draw.c238
-rw-r--r--source/blender/python/api2_2x/Draw.h8
-rw-r--r--source/blender/python/api2_2x/Effect.c264
-rw-r--r--source/blender/python/api2_2x/Font.c10
-rw-r--r--source/blender/python/api2_2x/Geometry.c39
-rw-r--r--[-rwxr-xr-x]source/blender/python/api2_2x/Group.c2
-rw-r--r--[-rwxr-xr-x]source/blender/python/api2_2x/Group.h0
-rw-r--r--source/blender/python/api2_2x/Image.c106
-rw-r--r--source/blender/python/api2_2x/Ipo.c12
-rw-r--r--source/blender/python/api2_2x/Ipocurve.c27
-rw-r--r--source/blender/python/api2_2x/Key.c102
-rw-r--r--source/blender/python/api2_2x/Lamp.c215
-rw-r--r--source/blender/python/api2_2x/Lattice.c10
-rw-r--r--source/blender/python/api2_2x/Makefile8
-rw-r--r--source/blender/python/api2_2x/Material.c500
-rw-r--r--source/blender/python/api2_2x/Mathutils.c4
-rw-r--r--source/blender/python/api2_2x/Mesh.c724
-rw-r--r--source/blender/python/api2_2x/Metaball.c17
-rw-r--r--source/blender/python/api2_2x/Modifier.c8
-rw-r--r--source/blender/python/api2_2x/NLA.c24
-rw-r--r--source/blender/python/api2_2x/NMesh.c38
-rw-r--r--source/blender/python/api2_2x/Noise.c2
-rw-r--r--source/blender/python/api2_2x/Object.c210
-rw-r--r--source/blender/python/api2_2x/Pose.c125
-rw-r--r--source/blender/python/api2_2x/Scene.c67
-rw-r--r--source/blender/python/api2_2x/Sound.c51
-rw-r--r--source/blender/python/api2_2x/SurfNurb.c20
-rw-r--r--source/blender/python/api2_2x/Text.c26
-rw-r--r--source/blender/python/api2_2x/Text3d.c2
-rw-r--r--source/blender/python/api2_2x/Texture.c437
-rw-r--r--source/blender/python/api2_2x/Types.c2
-rw-r--r--source/blender/python/api2_2x/Window.c163
-rw-r--r--source/blender/python/api2_2x/World.c72
-rw-r--r--source/blender/python/api2_2x/bpy_config.c19
-rw-r--r--source/blender/python/api2_2x/bpy_data.c6
-rw-r--r--source/blender/python/api2_2x/doc/Armature.py10
-rw-r--r--source/blender/python/api2_2x/doc/BGL.py15
-rw-r--r--source/blender/python/api2_2x/doc/Blender.py2
-rw-r--r--source/blender/python/api2_2x/doc/Constraint.py57
-rw-r--r--source/blender/python/api2_2x/doc/Curve.py8
-rw-r--r--source/blender/python/api2_2x/doc/Draw.py3
-rw-r--r--source/blender/python/api2_2x/doc/Geometry.py7
-rw-r--r--source/blender/python/api2_2x/doc/Ipo.py10
-rw-r--r--source/blender/python/api2_2x/doc/Key.py38
-rw-r--r--source/blender/python/api2_2x/doc/Mesh.py49
-rw-r--r--source/blender/python/api2_2x/doc/Modifier.py6
-rw-r--r--source/blender/python/api2_2x/doc/Pose.py14
-rw-r--r--source/blender/python/api2_2x/doc/Render.py10
-rw-r--r--source/blender/python/api2_2x/doc/Scene.py2
-rw-r--r--source/blender/python/api2_2x/doc/Text3d.py4
-rw-r--r--source/blender/python/api2_2x/doc/Texture.py8
-rw-r--r--source/blender/python/api2_2x/doc/Window.py28
-rw-r--r--source/blender/python/api2_2x/doc/epy_docgen-3.sh12
-rw-r--r--source/blender/python/api2_2x/euler.c2
-rw-r--r--source/blender/python/api2_2x/gen_library.c15
-rw-r--r--source/blender/python/api2_2x/gen_library.h2
-rw-r--r--source/blender/python/api2_2x/gen_utils.c44
-rw-r--r--source/blender/python/api2_2x/gen_utils.h1
-rw-r--r--source/blender/python/api2_2x/logic.c52
-rw-r--r--source/blender/python/api2_2x/matrix.c19
-rw-r--r--source/blender/python/api2_2x/quat.c2
-rw-r--r--source/blender/python/api2_2x/rgbTuple.c40
-rw-r--r--source/blender/python/api2_2x/sceneRender.c72
-rw-r--r--source/blender/python/api2_2x/sceneSequence.c73
-rw-r--r--source/blender/python/api2_2x/sceneSequence.h2
-rw-r--r--source/blender/python/api2_2x/vector.c2
-rw-r--r--source/blender/python/api2_2x/windowTheme.c14
-rw-r--r--source/blender/quicktime/apple/quicktime_export.c41
-rw-r--r--source/blender/quicktime/apple/quicktime_import.c19
-rw-r--r--source/blender/radiosity/intern/source/Makefile4
-rw-r--r--source/blender/readblenfile/intern/Makefile4
-rw-r--r--source/blender/readblenfile/stub/Makefile4
-rw-r--r--source/blender/readblenfile/test/Makefile4
-rw-r--r--source/blender/render/extern/include/RE_raytrace.h90
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h6
-rw-r--r--source/blender/render/extern/include/RE_shader_ext.h2
-rw-r--r--source/blender/render/intern/include/render_types.h38
-rw-r--r--source/blender/render/intern/include/rendercore.h8
-rw-r--r--source/blender/render/intern/include/renderdatabase.h2
-rw-r--r--source/blender/render/intern/source/Makefile5
-rw-r--r--source/blender/render/intern/source/convertblender.c983
-rw-r--r--source/blender/render/intern/source/envmap.c5
-rw-r--r--source/blender/render/intern/source/imagetexture.c9
-rw-r--r--source/blender/render/intern/source/pipeline.c20
-rw-r--r--source/blender/render/intern/source/ray.c2469
-rw-r--r--source/blender/render/intern/source/rayshade.c2020
-rw-r--r--source/blender/render/intern/source/raytrace.c1353
-rw-r--r--source/blender/render/intern/source/rendercore.c15
-rw-r--r--source/blender/render/intern/source/renderdatabase.c147
-rw-r--r--source/blender/render/intern/source/shadeinput.c4
-rw-r--r--source/blender/render/intern/source/shadeoutput.c71
-rw-r--r--source/blender/render/intern/source/texture.c19
-rw-r--r--source/blender/src/CMakeLists.txt4
-rw-r--r--source/blender/src/Makefile12
-rw-r--r--source/blender/src/SConscript6
-rw-r--r--source/blender/src/blenderbuttons.c4125
-rw-r--r--source/blender/src/booleanops.c16
-rw-r--r--source/blender/src/butspace.c2
-rw-r--r--source/blender/src/buttons_editing.c785
-rw-r--r--source/blender/src/buttons_object.c3026
-rw-r--r--source/blender/src/buttons_scene.c107
-rw-r--r--source/blender/src/buttons_shading.c687
-rw-r--r--source/blender/src/drawaction.c1144
-rw-r--r--source/blender/src/drawarmature.c166
-rw-r--r--source/blender/src/drawimage.c1338
-rw-r--r--source/blender/src/drawimasel.c1352
-rw-r--r--source/blender/src/drawipo.c150
-rw-r--r--source/blender/src/drawmesh.c457
-rw-r--r--source/blender/src/drawnla.c31
-rw-r--r--source/blender/src/drawnode.c400
-rw-r--r--source/blender/src/drawobject.c1586
-rw-r--r--source/blender/src/drawscene.c11
-rw-r--r--source/blender/src/drawscript.c8
-rw-r--r--source/blender/src/drawseq.c224
-rw-r--r--source/blender/src/drawsound.c10
-rw-r--r--source/blender/src/drawtime.c228
-rw-r--r--source/blender/src/drawview.c306
-rw-r--r--source/blender/src/edit.c199
-rw-r--r--source/blender/src/editaction.c1161
-rw-r--r--source/blender/src/editarmature.c982
-rw-r--r--source/blender/src/editconstraint.c522
-rw-r--r--source/blender/src/editcurve.c270
-rw-r--r--source/blender/src/editdeform.c12
-rw-r--r--source/blender/src/editface.c644
-rw-r--r--source/blender/src/editimasel.c1328
-rw-r--r--source/blender/src/editipo.c1970
-rw-r--r--source/blender/src/editipo_lib.c74
-rw-r--r--source/blender/src/editipo_mods.c23
-rw-r--r--source/blender/src/editkey.c9
-rw-r--r--source/blender/src/editmesh.c47
-rw-r--r--source/blender/src/editmesh_add.c31
-rw-r--r--source/blender/src/editmesh_lib.c231
-rw-r--r--source/blender/src/editmesh_loop.c7
-rw-r--r--source/blender/src/editmesh_mods.c835
-rw-r--r--source/blender/src/editmesh_tools.c407
-rw-r--r--source/blender/src/editnla.c397
-rw-r--r--source/blender/src/editnode.c60
-rw-r--r--source/blender/src/editobject.c409
-rw-r--r--source/blender/src/editparticle.c2999
-rw-r--r--source/blender/src/editscreen.c37
-rw-r--r--source/blender/src/editseq.c1500
-rw-r--r--source/blender/src/editsima.c1842
-rw-r--r--source/blender/src/editsound.c25
-rw-r--r--source/blender/src/edittime.c78
-rw-r--r--source/blender/src/editview.c177
-rw-r--r--source/blender/src/filelist.c1135
-rw-r--r--source/blender/src/filesel.c311
-rw-r--r--source/blender/src/fluidsim.c4
-rw-r--r--source/blender/src/fsmenu.c257
-rw-r--r--source/blender/src/ghostwinlay.c2
-rw-r--r--source/blender/src/glutil.c21
-rw-r--r--source/blender/src/hddaudio.c2
-rw-r--r--source/blender/src/header_action.c344
-rw-r--r--source/blender/src/header_buttonswin.c3
-rw-r--r--source/blender/src/header_filesel.c11
-rw-r--r--source/blender/src/header_image.c262
-rw-r--r--source/blender/src/header_imasel.c131
-rw-r--r--source/blender/src/header_info.c19
-rw-r--r--source/blender/src/header_ipo.c69
-rw-r--r--source/blender/src/header_nla.c55
-rw-r--r--source/blender/src/header_seq.c153
-rw-r--r--source/blender/src/header_sound.c6
-rw-r--r--source/blender/src/header_text.c134
-rw-r--r--source/blender/src/header_time.c10
-rw-r--r--source/blender/src/header_view3d.c833
-rw-r--r--source/blender/src/headerbuttons.c77
-rw-r--r--source/blender/src/imagepaint.c3
-rw-r--r--source/blender/src/imasel.c861
-rw-r--r--source/blender/src/interface.c44
-rw-r--r--source/blender/src/interface_draw.c44
-rw-r--r--source/blender/src/interface_icons.c320
-rw-r--r--source/blender/src/interface_panel.c7
-rw-r--r--source/blender/src/language.c77
-rw-r--r--source/blender/src/meshlaplacian.c1838
-rw-r--r--source/blender/src/meshtools.c95
-rw-r--r--source/blender/src/multires.c13
-rw-r--r--source/blender/src/outliner.c249
-rw-r--r--source/blender/src/parametrizer.c70
-rw-r--r--source/blender/src/poseobject.c287
-rw-r--r--source/blender/src/preview.blend.c25478
-rw-r--r--source/blender/src/prvicons.c436
-rw-r--r--source/blender/src/renderwin.c11
-rw-r--r--source/blender/src/resources.c20
-rw-r--r--source/blender/src/retopo.c24
-rw-r--r--source/blender/src/sculptmode-stroke.c279
-rw-r--r--source/blender/src/sculptmode.c176
-rw-r--r--source/blender/src/seqaudio.c28
-rw-r--r--source/blender/src/seqeffects.c232
-rw-r--r--source/blender/src/sequence.c761
-rw-r--r--source/blender/src/space.c1024
-rw-r--r--source/blender/src/spacetypes.c15
-rw-r--r--source/blender/src/splash.jpg.c9702
-rw-r--r--source/blender/src/toets.c32
-rw-r--r--source/blender/src/toolbox.c30
-rw-r--r--[-rwxr-xr-x]source/blender/src/transform.c1135
-rw-r--r--[-rwxr-xr-x]source/blender/src/transform_constraints.c80
-rw-r--r--[-rwxr-xr-x]source/blender/src/transform_conversions.c1486
-rw-r--r--[-rwxr-xr-x]source/blender/src/transform_generics.c300
-rw-r--r--source/blender/src/transform_manipulator.c30
-rw-r--r--[-rwxr-xr-x]source/blender/src/transform_numinput.c0
-rw-r--r--source/blender/src/transform_snap.c120
-rw-r--r--source/blender/src/unwrapper.c125
-rw-r--r--source/blender/src/usiblender.c56
-rw-r--r--source/blender/src/view.c81
-rw-r--r--source/blender/src/vpaint.c48
-rw-r--r--source/blender/src/writeimage.c5
-rw-r--r--source/blender/verify/intern/Makefile4
-rw-r--r--source/blender/yafray/intern/Makefile4
-rw-r--r--[-rwxr-xr-x]source/blender/yafray/intern/api.cpp0
-rw-r--r--[-rwxr-xr-x]source/blender/yafray/intern/export_File.cpp0
-rw-r--r--[-rwxr-xr-x]source/blender/yafray/intern/export_File.h0
-rw-r--r--source/creator/Makefile4
-rw-r--r--source/creator/buildinfo.c1
-rw-r--r--source/creator/creator.c30
-rw-r--r--source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp6
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp23
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h3
-rw-r--r--[-rwxr-xr-x]source/gameengine/BlenderRoutines/SConscript0
-rw-r--r--source/gameengine/Converter/BL_ActionActuator.cpp3
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp8
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.cpp2
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp17
-rw-r--r--[-rwxr-xr-x]source/gameengine/Converter/SConscript0
-rw-r--r--[-rwxr-xr-x]source/gameengine/Expressions/SConscript0
-rw-r--r--[-rwxr-xr-x]source/gameengine/GameLogic/SConscript0
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.cpp23
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.h3
-rw-r--r--source/gameengine/GamePlayer/ghost/GPG_ghost.cpp29
-rw-r--r--[-rwxr-xr-x]source/gameengine/Ketsji/KXNetwork/SConscript0
-rw-r--r--source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp3
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h2
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.cpp6
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp4
-rw-r--r--source/gameengine/Ketsji/KX_PythonInit.cpp27
-rw-r--r--source/gameengine/Ketsji/KX_VehicleWrapper.cpp7
-rw-r--r--[-rwxr-xr-x]source/gameengine/Network/LoopBackNetwork/SConscript0
-rw-r--r--[-rwxr-xr-x]source/gameengine/Network/SConscript0
-rw-r--r--[-rwxr-xr-x]source/gameengine/Physics/BlOde/SConscript0
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp5
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp68
-rw-r--r--[-rwxr-xr-x]source/gameengine/Physics/Dummy/SConscript0
-rw-r--r--[-rwxr-xr-x]source/gameengine/Physics/Sumo/SConscript0
-rw-r--r--[-rwxr-xr-x]source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.cpp0
-rw-r--r--[-rwxr-xr-x]source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.h0
-rw-r--r--source/gameengine/Physics/common/PHY_DynamicTypes.h1
-rw-r--r--[-rwxr-xr-x]source/gameengine/Physics/common/SConscript0
-rw-r--r--source/gameengine/Rasterizer/RAS_IRasterizer.h9
-rw-r--r--source/gameengine/Rasterizer/RAS_IRenderTools.h5
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp2
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp3
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp16
-rw-r--r--source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h20
-rw-r--r--[-rwxr-xr-x]source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript0
-rw-r--r--[-rwxr-xr-x]source/gameengine/Rasterizer/SConscript0
-rw-r--r--[-rwxr-xr-x]source/gameengine/SceneGraph/SConscript0
-rw-r--r--source/gameengine/SceneGraph/SG_Node.h2
-rw-r--r--source/kernel/gen_messaging/intern/Makefile4
-rw-r--r--source/nan_compile.mk36
-rw-r--r--source/nan_definitions.mk20
-rw-r--r--tools/Blender.py11
-rwxr-xr-xtools/btools.py7
1111 files changed, 107928 insertions, 62544 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 978b3cd339e..0227c51f39d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -144,6 +144,7 @@ IF(UNIX)
/opt/local/include/freetype2
/opt/csw/include/freetype2
/opt/include/freetype2
+ NO_DEFAULT_PATH
)
SET(FREETYPE_LIB freetype)
@@ -239,7 +240,11 @@ IF(WIN32)
SET(OPENEXR ${LIBDIR}/openexr)
SET(OPENEXR_INC ${OPENEXR}/include ${OPENEXR}/include/IlmImf ${OPENEXR}/include/Iex ${OPENEXR}/include/Imath)
SET(OPENEXR_LIB Iex Half IlmImf Imath IlmThread)
+ IF (MSVC80)
+ SET(OPENEXR_LIBPATH ${OPENEXR}/lib_vs2005)
+ ELSE (MSVC80)
SET(OPENEXR_LIBPATH ${OPENEXR}/lib_msvc)
+ ENDIF(MSVC80)
SET(QUICKTIME ${LIBDIR}/QTDevWin)
SET(QUICKTIME_INC ${QUICKTIME}/CIncludes)
diff --git a/SConstruct b/SConstruct
index 900049e0acc..2cacb91d103 100644
--- a/SConstruct
+++ b/SConstruct
@@ -241,13 +241,16 @@ if 'clean' in B.targets:
do_clean = True
if not quickie and do_clean:
- print B.bc.HEADER+'Cleaning...'+B.bc.ENDC
- dirs = os.listdir(B.root_build_dir)
- for dir in dirs:
- if os.path.isdir(B.root_build_dir + dir) == 1:
- print "clean dir %s"%(B.root_build_dir+dir)
- shutil.rmtree(B.root_build_dir+dir)
- print B.bc.OKGREEN+'...done'+B.bc.ENDC
+ if os.path.exists(B.root_build_dir):
+ print B.bc.HEADER+'Cleaning...'+B.bc.ENDC
+ dirs = os.listdir(B.root_build_dir)
+ for dir in dirs:
+ if os.path.isdir(B.root_build_dir + dir) == 1:
+ print "clean dir %s"%(B.root_build_dir+dir)
+ shutil.rmtree(B.root_build_dir+dir)
+ print B.bc.OKGREEN+'...done'+B.bc.ENDC
+ else:
+ print B.bc.HEADER+'Already Clean, nothing to do.'+B.bc.ENDC
Exit()
if not os.path.isdir ( B.root_build_dir):
@@ -429,7 +432,9 @@ if not env['WITH_BF_GAMEENGINE']:
Depends(nsiscmd, allinstall)
Default(B.program_list)
-Default(installtarget)
+
+if not env['WITHOUT_BF_INSTALL']:
+ Default(installtarget)
#------------ RELEASE
# TODO: zipup the installation
diff --git a/bin/.blender/.Blanguages b/bin/.blender/.Blanguages
index be5e397b149..b50b3097eca 100644
--- a/bin/.blender/.Blanguages
+++ b/bin/.blender/.Blanguages
@@ -9,7 +9,7 @@ French:fr_FR
Spanish:es_ES
Catalan:ca_ES
Czech:cs_CZ
-Brazilian Portuguese:pt_br
+Brazilian Portuguese:pt_BR
Simplified Chinese:zh_CN
Russian:ru_RU
Croatian:hr_HR
diff --git a/config/darwin-config.py b/config/darwin-config.py
index 86135a3f46f..5a2fc93c52d 100644
--- a/config/darwin-config.py
+++ b/config/darwin-config.py
@@ -48,10 +48,12 @@ WITH_BF_FMOD = 'false'
BF_FMOD = LIBDIR + '/fmod'
WITH_BF_OPENEXR = 'true'
-BF_OPENEXR = '/usr/local'
-BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR'
+BF_OPENEXR = '${LCGDIR}/openexr'
+BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/OpenEXR'
BF_OPENEXR_LIB = ' Iex Half IlmImf Imath IlmThread'
+BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
+WITH_BF_DDS = 'true'
WITH_BF_JPEG = 'true'
BF_JPEG = LIBDIR + '/jpeg'
diff --git a/config/linux2-config.py b/config/linux2-config.py
index a041f518ba7..4bf7e755c49 100644
--- a/config/linux2-config.py
+++ b/config/linux2-config.py
@@ -32,6 +32,8 @@ BF_OPENEXR = '/usr'
BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR'
BF_OPENEXR_LIB = 'Half IlmImf Iex Imath '
+WITH_BF_DDS = 'true'
+
WITH_BF_JPEG = 'true'
BF_JPEG = '/usr'
BF_JPEG_INC = '${BF_JPEG}/include'
@@ -113,11 +115,14 @@ BF_ICONV_LIB = 'iconv'
BF_ICONV_LIBPATH = '${BF_ICONV}/lib'
# enable ffmpeg support
-WITH_BF_FFMPEG = 'false' # -DWITH_FFMPEG
-BF_FFMPEG = '/usr'
+WITH_BF_FFMPEG = 'true' # -DWITH_FFMPEG
+BF_FFMPEG = '#extern/ffmpeg'
+BF_FFMPEG_LIB = ''
+# Uncomment the following two lines to use system's ffmpeg
+# BF_FFMPEG = '/usr'
+# BF_FFMPEG_LIB = 'avformat avcodec swscale avutil'
BF_FFMPEG_INC = '${BF_FFMPEG}/include'
BF_FFMPEG_LIBPATH='${BF_FFMPEG}/lib'
-BF_FFMPEG_LIB = 'avformat avcodec avutil'
# Mesa Libs should go here if your using them as well....
WITH_BF_STATICOPENGL = 'false'
diff --git a/config/linuxcross-config.py b/config/linuxcross-config.py
index 1c2288a8430..e6c4e8769b4 100644
--- a/config/linuxcross-config.py
+++ b/config/linuxcross-config.py
@@ -39,6 +39,8 @@ BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/OpenEXR'
BF_OPENEXR_LIB = ' Half IlmImf Iex '
BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
+WITH_BF_DDS = 'true'
+
WITH_BF_JPEG = 'true'
BF_JPEG = LIBDIR + '/jpeg'
BF_JPEG_INC = '${BF_JPEG}/include'
diff --git a/config/openbsd3-config.py b/config/openbsd3-config.py
index b3579d4ac65..f7f254973af 100644
--- a/config/openbsd3-config.py
+++ b/config/openbsd3-config.py
@@ -28,6 +28,8 @@ BF_OPENEXR = '/usr/local'
BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR'
BF_OPENEXR_LIB = 'Half IlmImf Iex Imath '
+WITH_BF_DDS = 'true'
+
WITH_BF_JPEG = 'true'
BF_JPEG = '/usr/local'
BF_JPEG_INC = '${BF_JPEG}/include'
diff --git a/config/sunos5-config.py b/config/sunos5-config.py
index 7939e210993..b3ca0e267ff 100644
--- a/config/sunos5-config.py
+++ b/config/sunos5-config.py
@@ -29,6 +29,8 @@ BF_OPENEXR_INC = ['${BF_OPENEXR}/include', '${BF_OPENEXR}/include/OpenEXR' ]
BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
BF_OPENEXR_LIB = 'Half IlmImf Iex Imath '
+WITH_BF_DDS = 'true'
+
WITH_BF_JPEG = 'true'
BF_JPEG = '/usr/local'
BF_JPEG_INC = '${BF_JPEG}/include'
diff --git a/config/win32-mingw-config.py b/config/win32-mingw-config.py
index 95c096c4bac..54d8e0c6ffd 100644
--- a/config/win32-mingw-config.py
+++ b/config/win32-mingw-config.py
@@ -42,6 +42,8 @@ BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/OpenEXR'
BF_OPENEXR_LIB = ' Half IlmImf Iex '
BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib'
+WITH_BF_DDS = 'true'
+
WITH_BF_JPEG = 'true'
BF_JPEG = LIBDIR + '/jpeg'
BF_JPEG_INC = '${BF_JPEG}/include'
@@ -60,7 +62,6 @@ BF_TIFF_INC = '${BF_TIFF}/include'
WITH_BF_ZLIB = 'true'
BF_ZLIB = LIBDIR + '/zlib'
BF_ZLIB_INC = '${BF_ZLIB}/include'
-#BF_ZLIB_LIB = 'z'
BF_ZLIB_LIBPATH = '${BF_ZLIB}/lib'
WITH_BF_INTERNATIONAL = 'true'
@@ -109,9 +110,6 @@ WITH_BF_YAFRAY = 'true'
#BF_MOZILLA_LIB =
# Will fall back to look in BF_MOZILLA_INC/nspr and BF_MOZILLA_LIB
# if this is not set.
-#
-# Be paranoid regarding library creation (do not update archives)
-#BF_PARANOID = 'true'
# enable freetype2 support for text objects
BF_FREETYPE = LIBDIR + '/gcc/freetype'
@@ -141,8 +139,6 @@ BF_OPENGL_LIB_STATIC = [ '${BF_OPENGL}/lib/libGL.a', '${BF_OPENGL}/lib/libGLU.a'
##
CC = 'gcc'
CXX = 'g++'
-##ifeq ($CPU),alpha)
-## CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing -mieee
CCFLAGS = [ '-pipe', '-funsigned-char', '-fno-strict-aliasing' ]
@@ -150,21 +146,12 @@ CPPFLAGS = [ '-DXP_UNIX', '-DWIN32', '-DFREE_WINDOWS' ]
CXXFLAGS = ['-pipe', '-mwindows', '-funsigned-char', '-fno-strict-aliasing' ]
REL_CFLAGS = [ '-O2' ]
REL_CCFLAGS = [ '-O2' ]
-##BF_DEPEND = 'true'
-##
-##AR = ar
-##ARFLAGS = ruv
-##ARFLAGSQUIET = ru
-##
+
C_WARN = [ '-Wall' , '-Wno-char-subscripts', '-Wdeclaration-after-statement' ]
CC_WARN = [ '-Wall' ]
-##FIX_STUBS_WARNINGS = -Wno-unused
-
-LLIBS = ['-lshell32', '-lshfolder', '-ldxguid', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz'] #'-lutil', '-lc', '-lm', '-ldl', '-lpthread']
-##LOPTS = --dynamic
-##DYNLDFLAGS = -shared $(LDFLAGS)
+LLIBS = ['-lshell32', '-lshfolder', '-ldxguid', '-lgdi32', '-lmsvcrt', '-lwinmm', '-lmingw32', '-lm', '-lws2_32', '-lz', '-lstdc++']
BF_DEBUG = 'false'
BF_DEBUG_FLAGS= '-g'
diff --git a/config/win32-vc-config.py b/config/win32-vc-config.py
index feaa97f887a..d1a63022ac8 100644
--- a/config/win32-vc-config.py
+++ b/config/win32-vc-config.py
@@ -50,6 +50,8 @@ BF_OPENEXR_INC = '${BF_OPENEXR}/include ${BF_OPENEXR}/include/IlmImf ${BF_OPENEX
BF_OPENEXR_LIB = ' Iex Half IlmImf Imath IlmThread '
BF_OPENEXR_LIBPATH = '${BF_OPENEXR}/lib_msvc'
+WITH_BF_DDS = 'true'
+
WITH_BF_JPEG = 'true'
BF_JPEG = LIBDIR + '/jpeg'
BF_JPEG_INC = '${BF_JPEG}/include'
diff --git a/doc/blender-scons.txt b/doc/blender-scons.txt
index 73aa7add7a6..8c71c31db0c 100644
--- a/doc/blender-scons.txt
+++ b/doc/blender-scons.txt
@@ -160,6 +160,17 @@ $Id$
for example, setting BF_QUICKDEBUG won't overwrite the contents of BF_DEBUG_LIBS.
+ Not installing
+ --------------
+
+ If you dont want to install the build result, you can use the following option either
+ on the commandline or in your user-config.py :
+
+ WITHOUT_BF_INSTALL='true'
+
+ by default, this is set to 'false', and so the build is installed
+
+
Supported toolset
-----------------
diff --git a/extern/SConscript b/extern/SConscript
index 0cdf9676862..924b7f54507 100644
--- a/extern/SConscript
+++ b/extern/SConscript
@@ -13,3 +13,6 @@ if env['WITH_BF_INTERNATIONAL']:
if env['WITH_BF_VERSE']:
SConscript(['verse/dist/SConstruct'])
+
+if env['WITH_BF_FFMPEG'] and env['BF_FFMPEG_LIB'] == '':
+ SConscript(['ffmpeg/SConscript']);
diff --git a/extern/bFTGL/README.txt b/extern/bFTGL/README.txt
index a679d86c22e..a679d86c22e 100755..100644
--- a/extern/bFTGL/README.txt
+++ b/extern/bFTGL/README.txt
diff --git a/extern/bFTGL/include/FTBBox.h b/extern/bFTGL/include/FTBBox.h
index 7ff530166ca..7ff530166ca 100755..100644
--- a/extern/bFTGL/include/FTBBox.h
+++ b/extern/bFTGL/include/FTBBox.h
diff --git a/extern/bFTGL/include/FTBitmapGlyph.h b/extern/bFTGL/include/FTBitmapGlyph.h
index 89154a97fac..89154a97fac 100755..100644
--- a/extern/bFTGL/include/FTBitmapGlyph.h
+++ b/extern/bFTGL/include/FTBitmapGlyph.h
diff --git a/extern/bFTGL/include/FTBufferGlyph.h b/extern/bFTGL/include/FTBufferGlyph.h
index 9795f4de5d4..9795f4de5d4 100755..100644
--- a/extern/bFTGL/include/FTBufferGlyph.h
+++ b/extern/bFTGL/include/FTBufferGlyph.h
diff --git a/extern/bFTGL/include/FTFace.h b/extern/bFTGL/include/FTFace.h
index 26bb3966462..26bb3966462 100755..100644
--- a/extern/bFTGL/include/FTFace.h
+++ b/extern/bFTGL/include/FTFace.h
diff --git a/extern/bFTGL/include/FTFont.h b/extern/bFTGL/include/FTFont.h
index 5b3d9e46f68..5b3d9e46f68 100755..100644
--- a/extern/bFTGL/include/FTFont.h
+++ b/extern/bFTGL/include/FTFont.h
diff --git a/extern/bFTGL/include/FTGL.h b/extern/bFTGL/include/FTGL.h
index e92bd526012..e92bd526012 100755..100644
--- a/extern/bFTGL/include/FTGL.h
+++ b/extern/bFTGL/include/FTGL.h
diff --git a/extern/bFTGL/include/FTGLBitmapFont.h b/extern/bFTGL/include/FTGLBitmapFont.h
index 12feae00cb6..12feae00cb6 100755..100644
--- a/extern/bFTGL/include/FTGLBitmapFont.h
+++ b/extern/bFTGL/include/FTGLBitmapFont.h
diff --git a/extern/bFTGL/include/FTGLBufferFont.h b/extern/bFTGL/include/FTGLBufferFont.h
index 2f74b5cdef9..2f74b5cdef9 100755..100644
--- a/extern/bFTGL/include/FTGLBufferFont.h
+++ b/extern/bFTGL/include/FTGLBufferFont.h
diff --git a/extern/bFTGL/include/FTGLOutlineFont.h b/extern/bFTGL/include/FTGLOutlineFont.h
index a7f4b23092d..a7f4b23092d 100755..100644
--- a/extern/bFTGL/include/FTGLOutlineFont.h
+++ b/extern/bFTGL/include/FTGLOutlineFont.h
diff --git a/extern/bFTGL/include/FTGLPixmapFont.h b/extern/bFTGL/include/FTGLPixmapFont.h
index f781ddf68dd..f781ddf68dd 100755..100644
--- a/extern/bFTGL/include/FTGLPixmapFont.h
+++ b/extern/bFTGL/include/FTGLPixmapFont.h
diff --git a/extern/bFTGL/include/FTGLPolygonFont.h b/extern/bFTGL/include/FTGLPolygonFont.h
index 54e624a1893..54e624a1893 100755..100644
--- a/extern/bFTGL/include/FTGLPolygonFont.h
+++ b/extern/bFTGL/include/FTGLPolygonFont.h
diff --git a/extern/bFTGL/include/FTGLTextureFont.h b/extern/bFTGL/include/FTGLTextureFont.h
index f0575143f4b..f0575143f4b 100755..100644
--- a/extern/bFTGL/include/FTGLTextureFont.h
+++ b/extern/bFTGL/include/FTGLTextureFont.h
diff --git a/extern/bFTGL/include/FTGlyph.h b/extern/bFTGL/include/FTGlyph.h
index c38d51e728e..c38d51e728e 100755..100644
--- a/extern/bFTGL/include/FTGlyph.h
+++ b/extern/bFTGL/include/FTGlyph.h
diff --git a/extern/bFTGL/include/FTGlyphContainer.h b/extern/bFTGL/include/FTGlyphContainer.h
index de668b61dbd..de668b61dbd 100755..100644
--- a/extern/bFTGL/include/FTGlyphContainer.h
+++ b/extern/bFTGL/include/FTGlyphContainer.h
diff --git a/extern/bFTGL/include/FTLibrary.h b/extern/bFTGL/include/FTLibrary.h
index 1e5ed6b1a08..1e5ed6b1a08 100755..100644
--- a/extern/bFTGL/include/FTLibrary.h
+++ b/extern/bFTGL/include/FTLibrary.h
diff --git a/extern/bFTGL/include/FTPixmapGlyph.h b/extern/bFTGL/include/FTPixmapGlyph.h
index 9d43d6c58b3..9d43d6c58b3 100755..100644
--- a/extern/bFTGL/include/FTPixmapGlyph.h
+++ b/extern/bFTGL/include/FTPixmapGlyph.h
diff --git a/extern/bFTGL/include/FTPoint.h b/extern/bFTGL/include/FTPoint.h
index bb1772c4c18..bb1772c4c18 100755..100644
--- a/extern/bFTGL/include/FTPoint.h
+++ b/extern/bFTGL/include/FTPoint.h
diff --git a/extern/bFTGL/include/FTSize.h b/extern/bFTGL/include/FTSize.h
index 31f6bb66db1..31f6bb66db1 100755..100644
--- a/extern/bFTGL/include/FTSize.h
+++ b/extern/bFTGL/include/FTSize.h
diff --git a/extern/bFTGL/include/FTTextureGlyph.h b/extern/bFTGL/include/FTTextureGlyph.h
index 389e6f778da..389e6f778da 100755..100644
--- a/extern/bFTGL/include/FTTextureGlyph.h
+++ b/extern/bFTGL/include/FTTextureGlyph.h
diff --git a/extern/bFTGL/src/FTBitmapGlyph.cpp b/extern/bFTGL/src/FTBitmapGlyph.cpp
index 5db33f10c79..5db33f10c79 100755..100644
--- a/extern/bFTGL/src/FTBitmapGlyph.cpp
+++ b/extern/bFTGL/src/FTBitmapGlyph.cpp
diff --git a/extern/bFTGL/src/FTBufferGlyph.cpp b/extern/bFTGL/src/FTBufferGlyph.cpp
index 27310103152..27310103152 100755..100644
--- a/extern/bFTGL/src/FTBufferGlyph.cpp
+++ b/extern/bFTGL/src/FTBufferGlyph.cpp
diff --git a/extern/bFTGL/src/FTFace.cpp b/extern/bFTGL/src/FTFace.cpp
index 0385e234d6c..0385e234d6c 100755..100644
--- a/extern/bFTGL/src/FTFace.cpp
+++ b/extern/bFTGL/src/FTFace.cpp
diff --git a/extern/bFTGL/src/FTFont.cpp b/extern/bFTGL/src/FTFont.cpp
index c06d883104b..c06d883104b 100755..100644
--- a/extern/bFTGL/src/FTFont.cpp
+++ b/extern/bFTGL/src/FTFont.cpp
diff --git a/extern/bFTGL/src/FTGLBitmapFont.cpp b/extern/bFTGL/src/FTGLBitmapFont.cpp
index 7e982a608da..7e982a608da 100755..100644
--- a/extern/bFTGL/src/FTGLBitmapFont.cpp
+++ b/extern/bFTGL/src/FTGLBitmapFont.cpp
diff --git a/extern/bFTGL/src/FTGLBufferFont.cpp b/extern/bFTGL/src/FTGLBufferFont.cpp
index b8af0fcb05f..b8af0fcb05f 100755..100644
--- a/extern/bFTGL/src/FTGLBufferFont.cpp
+++ b/extern/bFTGL/src/FTGLBufferFont.cpp
diff --git a/extern/bFTGL/src/FTGLOutlineFont.cpp b/extern/bFTGL/src/FTGLOutlineFont.cpp
index b9fd187e862..b9fd187e862 100755..100644
--- a/extern/bFTGL/src/FTGLOutlineFont.cpp
+++ b/extern/bFTGL/src/FTGLOutlineFont.cpp
diff --git a/extern/bFTGL/src/FTGLPixmapFont.cpp b/extern/bFTGL/src/FTGLPixmapFont.cpp
index 2654b85e31e..2654b85e31e 100755..100644
--- a/extern/bFTGL/src/FTGLPixmapFont.cpp
+++ b/extern/bFTGL/src/FTGLPixmapFont.cpp
diff --git a/extern/bFTGL/src/FTGLPolygonFont.cpp b/extern/bFTGL/src/FTGLPolygonFont.cpp
index 2d4dfa1f26a..2d4dfa1f26a 100755..100644
--- a/extern/bFTGL/src/FTGLPolygonFont.cpp
+++ b/extern/bFTGL/src/FTGLPolygonFont.cpp
diff --git a/extern/bFTGL/src/FTGLTextureFont.cpp b/extern/bFTGL/src/FTGLTextureFont.cpp
index 92f14be50f2..92f14be50f2 100755..100644
--- a/extern/bFTGL/src/FTGLTextureFont.cpp
+++ b/extern/bFTGL/src/FTGLTextureFont.cpp
diff --git a/extern/bFTGL/src/FTGlyph.cpp b/extern/bFTGL/src/FTGlyph.cpp
index c68632949c2..c68632949c2 100755..100644
--- a/extern/bFTGL/src/FTGlyph.cpp
+++ b/extern/bFTGL/src/FTGlyph.cpp
diff --git a/extern/bFTGL/src/FTGlyphContainer.cpp b/extern/bFTGL/src/FTGlyphContainer.cpp
index 2c1881bbfff..2c1881bbfff 100755..100644
--- a/extern/bFTGL/src/FTGlyphContainer.cpp
+++ b/extern/bFTGL/src/FTGlyphContainer.cpp
diff --git a/extern/bFTGL/src/FTLibrary.cpp b/extern/bFTGL/src/FTLibrary.cpp
index 29ab5ae2693..29ab5ae2693 100755..100644
--- a/extern/bFTGL/src/FTLibrary.cpp
+++ b/extern/bFTGL/src/FTLibrary.cpp
diff --git a/extern/bFTGL/src/FTPixmapGlyph.cpp b/extern/bFTGL/src/FTPixmapGlyph.cpp
index b051a06b6e3..b051a06b6e3 100755..100644
--- a/extern/bFTGL/src/FTPixmapGlyph.cpp
+++ b/extern/bFTGL/src/FTPixmapGlyph.cpp
diff --git a/extern/bFTGL/src/FTPoint.cpp b/extern/bFTGL/src/FTPoint.cpp
index e4678bc9564..e4678bc9564 100755..100644
--- a/extern/bFTGL/src/FTPoint.cpp
+++ b/extern/bFTGL/src/FTPoint.cpp
diff --git a/extern/bFTGL/src/FTSize.cpp b/extern/bFTGL/src/FTSize.cpp
index 5fb8ffba157..5fb8ffba157 100755..100644
--- a/extern/bFTGL/src/FTSize.cpp
+++ b/extern/bFTGL/src/FTSize.cpp
diff --git a/extern/bFTGL/src/FTTextureGlyph.cpp b/extern/bFTGL/src/FTTextureGlyph.cpp
index b8267dcce89..b8267dcce89 100755..100644
--- a/extern/bFTGL/src/FTTextureGlyph.cpp
+++ b/extern/bFTGL/src/FTTextureGlyph.cpp
diff --git a/extern/bFTGL/src/FTVectoriser.cpp b/extern/bFTGL/src/FTVectoriser.cpp
index bb133d025b4..82dcb0c0f51 100644
--- a/extern/bFTGL/src/FTVectoriser.cpp
+++ b/extern/bFTGL/src/FTVectoriser.cpp
@@ -5,8 +5,12 @@
#define CALLBACK
#endif
-#ifdef __APPLE_CC__
- typedef GLvoid (*GLUTesselatorFunction)(...);
+#if defined(__APPLE_CC__)
+ #if __APPLE_CC__ >= 5465
+ typedef GLvoid (*GLUTesselatorFunction)();
+ #else
+ typedef GLvoid (*GLUTesselatorFunction)(...);
+ #endif
#elif defined( __mips ) || defined( __linux__ ) || defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __sun ) || defined (__CYGWIN__)
typedef GLvoid (*GLUTesselatorFunction)();
#elif defined ( WIN32)
diff --git a/extern/bullet2/make/msvc_7_0/Bullet_vc7.vcproj b/extern/bullet2/make/msvc_7_0/Bullet_vc7.vcproj
index c282c496e87..87a1e4546d1 100644
--- a/extern/bullet2/make/msvc_7_0/Bullet_vc7.vcproj
+++ b/extern/bullet2/make/msvc_7_0/Bullet_vc7.vcproj
@@ -347,6 +347,12 @@ ECHO Done
Name="ConstraintSolver"
Filter="">
<File
+ RelativePath="..\..\src\BulletDynamics\ConstraintSolver\btConeTwistConstraint.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\BulletDynamics\ConstraintSolver\btConeTwistConstraint.h">
+ </File>
+ <File
RelativePath="..\..\src\BulletDynamics\ConstraintSolver\btConstraintSolver.h">
</File>
<File
@@ -681,6 +687,12 @@ ECHO Done
RelativePath="..\..\src\BulletCollision\CollisionShapes\btBvhTriangleMeshShape.h">
</File>
<File
+ RelativePath="..\..\src\BulletCollision\CollisionShapes\btCapsuleShape.cpp">
+ </File>
+ <File
+ RelativePath="..\..\src\BulletCollision\CollisionShapes\btCapsuleShape.h">
+ </File>
+ <File
RelativePath="..\..\src\BulletCollision\CollisionShapes\btCollisionMargin.h">
</File>
<File
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp
index b05285ca727..be4a11506df 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp
@@ -21,9 +21,34 @@
#include <assert.h>
+#ifdef DEBUG_BROADPHASE
+#include <stdio.h>
+void btAxisSweep3::debugPrintAxis(int axis, bool checkCardinality)
+{
+ int numEdges = m_pHandles[0].m_maxEdges[axis];
+ printf("SAP Axis %d, numEdges=%d\n",axis,numEdges);
+
+ int i;
+ for (i=0;i<numEdges+1;i++)
+ {
+ Edge* pEdge = m_pEdges[axis] + i;
+ Handle* pHandlePrev = getHandle(pEdge->m_handle);
+ int handleIndex = pEdge->IsMax()? pHandlePrev->m_maxEdges[axis] : pHandlePrev->m_minEdges[axis];
+ char beginOrEnd;
+ beginOrEnd=pEdge->IsMax()?'E':'B';
+ printf(" [%c,h=%d,p=%x,i=%d]\n",beginOrEnd,pEdge->m_handle,pEdge->m_pos,handleIndex);
+ }
+
+ if (checkCardinality)
+ assert(numEdges == m_numHandles*2+1);
+}
+#endif //DEBUG_BROADPHASE
+
+
btBroadphaseProxy* btAxisSweep3::createProxy( const btVector3& min, const btVector3& max,int shapeType,void* userPtr,short int collisionFilterGroup,short int collisionFilterMask)
{
- unsigned short handleId = addHandle(min,max, userPtr,collisionFilterGroup,collisionFilterMask);
+ (void)shapeType;
+ BP_FP_INT_TYPE handleId = addHandle(min,max, userPtr,collisionFilterGroup,collisionFilterMask);
Handle* handle = getHandle(handleId);
@@ -40,6 +65,7 @@ void btAxisSweep3::setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,con
{
Handle* handle = static_cast<Handle*>(proxy);
updateHandle(handle->m_handleId,aabbMin,aabbMax);
+
}
@@ -50,10 +76,11 @@ void btAxisSweep3::setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,con
btAxisSweep3::btAxisSweep3(const btPoint3& worldAabbMin,const btPoint3& worldAabbMax, int maxHandles)
:btOverlappingPairCache()
{
+ m_invalidPair = 0;
//assert(bounds.HasVolume());
// 1 handle is reserved as sentinel
- assert(maxHandles > 1 && maxHandles < 32767);
+ btAssert(maxHandles > 1 && maxHandles < BP_MAX_HANDLES);
// init bounds
m_worldAabbMin = worldAabbMin;
@@ -61,7 +88,9 @@ btAxisSweep3::btAxisSweep3(const btPoint3& worldAabbMin,const btPoint3& worldAab
btVector3 aabbSize = m_worldAabbMax - m_worldAabbMin;
- m_quantize = btVector3(65535.0f,65535.0f,65535.0f) / aabbSize;
+ BP_FP_INT_TYPE maxInt = BP_HANDLE_SENTINEL;
+
+ m_quantize = btVector3(btScalar(maxInt),btScalar(maxInt),btScalar(maxInt)) / aabbSize;
// allocate handles buffer and put all handles on free list
m_pHandles = new Handle[maxHandles];
@@ -71,7 +100,7 @@ btAxisSweep3::btAxisSweep3(const btPoint3& worldAabbMin,const btPoint3& worldAab
// handle 0 is reserved as the null index, and is also used as the sentinel
m_firstFreeHandle = 1;
{
- for (int i = m_firstFreeHandle; i < maxHandles; i++)
+ for (BP_FP_INT_TYPE i = m_firstFreeHandle; i < maxHandles; i++)
m_pHandles[i].SetNextFree(i + 1);
m_pHandles[maxHandles - 1].SetNextFree(0);
}
@@ -94,9 +123,14 @@ btAxisSweep3::btAxisSweep3(const btPoint3& worldAabbMin,const btPoint3& worldAab
m_pEdges[axis][0].m_pos = 0;
m_pEdges[axis][0].m_handle = 0;
- m_pEdges[axis][1].m_pos = 0xffff;
+ m_pEdges[axis][1].m_pos = BP_HANDLE_SENTINEL;
m_pEdges[axis][1].m_handle = 0;
+#ifdef DEBUG_BROADPHASE
+ debugPrintAxis(axis);
+#endif //DEBUG_BROADPHASE
+
}
+
}
btAxisSweep3::~btAxisSweep3()
@@ -107,43 +141,36 @@ btAxisSweep3::~btAxisSweep3()
delete[] m_pHandles;
}
-void btAxisSweep3::quantize(unsigned short* out, const btPoint3& point, int isMax) const
+void btAxisSweep3::quantize(BP_FP_INT_TYPE* out, const btPoint3& point, int isMax) const
{
btPoint3 clampedPoint(point);
- /*
- if (isMax)
- clampedPoint += btVector3(10,10,10);
- else
- {
- clampedPoint -= btVector3(10,10,10);
- }
- */
+
clampedPoint.setMax(m_worldAabbMin);
clampedPoint.setMin(m_worldAabbMax);
btVector3 v = (clampedPoint - m_worldAabbMin) * m_quantize;
- out[0] = (unsigned short)(((int)v.getX() & 0xfffc) | isMax);
- out[1] = (unsigned short)(((int)v.getY() & 0xfffc) | isMax);
- out[2] = (unsigned short)(((int)v.getZ() & 0xfffc) | isMax);
+ out[0] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v.getX() & BP_HANDLE_MASK) | isMax);
+ out[1] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v.getY() & BP_HANDLE_MASK) | isMax);
+ out[2] = (BP_FP_INT_TYPE)(((BP_FP_INT_TYPE)v.getZ() & BP_HANDLE_MASK) | isMax);
}
-unsigned short btAxisSweep3::allocHandle()
+BP_FP_INT_TYPE btAxisSweep3::allocHandle()
{
assert(m_firstFreeHandle);
- unsigned short handle = m_firstFreeHandle;
+ BP_FP_INT_TYPE handle = m_firstFreeHandle;
m_firstFreeHandle = getHandle(handle)->GetNextFree();
m_numHandles++;
return handle;
}
-void btAxisSweep3::freeHandle(unsigned short handle)
+void btAxisSweep3::freeHandle(BP_FP_INT_TYPE handle)
{
assert(handle > 0 && handle < m_maxHandles);
@@ -155,15 +182,15 @@ void btAxisSweep3::freeHandle(unsigned short handle)
-unsigned short btAxisSweep3::addHandle(const btPoint3& aabbMin,const btPoint3& aabbMax, void* pOwner,short int collisionFilterGroup,short int collisionFilterMask)
+BP_FP_INT_TYPE btAxisSweep3::addHandle(const btPoint3& aabbMin,const btPoint3& aabbMax, void* pOwner,short int collisionFilterGroup,short int collisionFilterMask)
{
// quantize the bounds
- unsigned short min[3], max[3];
+ BP_FP_INT_TYPE min[3], max[3];
quantize(min, aabbMin, 0);
quantize(max, aabbMax, 1);
// allocate a handle
- unsigned short handle = allocHandle();
+ BP_FP_INT_TYPE handle = allocHandle();
assert(handle!= 0xcdcd);
Handle* pHandle = getHandle(handle);
@@ -175,11 +202,13 @@ unsigned short btAxisSweep3::addHandle(const btPoint3& aabbMin,const btPoint3& a
pHandle->m_collisionFilterMask = collisionFilterMask;
// compute current limit of edge arrays
- int limit = m_numHandles * 2;
+ BP_FP_INT_TYPE limit = m_numHandles * 2;
+
// insert new edges just inside the max boundary edge
- for (int axis = 0; axis < 3; axis++)
+ for (BP_FP_INT_TYPE axis = 0; axis < 3; axis++)
{
+
m_pHandles[0].m_maxEdges[axis] += 2;
m_pEdges[axis][limit + 1] = m_pEdges[axis][limit - 1];
@@ -202,14 +231,14 @@ unsigned short btAxisSweep3::addHandle(const btPoint3& aabbMin,const btPoint3& a
sortMinDown(2, pHandle->m_minEdges[2], true);
sortMaxDown(2, pHandle->m_maxEdges[2], true);
- //PrintAxis(1);
return handle;
}
-void btAxisSweep3::removeHandle(unsigned short handle)
+void btAxisSweep3::removeHandle(BP_FP_INT_TYPE handle)
{
+
Handle* pHandle = getHandle(handle);
//explicitly remove the pairs containing the proxy
@@ -220,42 +249,145 @@ void btAxisSweep3::removeHandle(unsigned short handle)
// compute current limit of edge arrays
int limit = m_numHandles * 2;
+
int axis;
for (axis = 0;axis<3;axis++)
{
- Edge* pEdges = m_pEdges[axis];
- int maxEdge= pHandle->m_maxEdges[axis];
- pEdges[maxEdge].m_pos = 0xffff;
- int minEdge = pHandle->m_minEdges[axis];
- pEdges[minEdge].m_pos = 0xffff;
+ m_pHandles[0].m_maxEdges[axis] -= 2;
}
// remove the edges by sorting them up to the end of the list
for ( axis = 0; axis < 3; axis++)
{
Edge* pEdges = m_pEdges[axis];
- int max = pHandle->m_maxEdges[axis];
- pEdges[max].m_pos = 0xffff;
+ BP_FP_INT_TYPE max = pHandle->m_maxEdges[axis];
+ pEdges[max].m_pos = BP_HANDLE_SENTINEL;
sortMaxUp(axis,max,false);
-
- int i = pHandle->m_minEdges[axis];
- pEdges[i].m_pos = 0xffff;
+
+
+ BP_FP_INT_TYPE i = pHandle->m_minEdges[axis];
+ pEdges[i].m_pos = BP_HANDLE_SENTINEL;
+
sortMinUp(axis,i,false);
pEdges[limit-1].m_handle = 0;
- pEdges[limit-1].m_pos = 0xffff;
+ pEdges[limit-1].m_pos = BP_HANDLE_SENTINEL;
+
+#ifdef DEBUG_BROADPHASE
+ debugPrintAxis(axis,false);
+#endif //DEBUG_BROADPHASE
+
}
+
// free the handle
freeHandle(handle);
}
+extern int gOverlappingPairs;
+
+
+void btAxisSweep3::refreshOverlappingPairs()
+{
+
+}
+void btAxisSweep3::processAllOverlappingPairs(btOverlapCallback* callback)
+{
+
+ //perform a sort, to find duplicates and to sort 'invalid' pairs to the end
+ m_overlappingPairArray.heapSort(btBroadphasePairSortPredicate());
+
+ //remove the 'invalid' ones
+#ifdef USE_POPBACK_REMOVAL
+ while (m_invalidPair>0)
+ {
+ m_invalidPair--;
+ m_overlappingPairArray.pop_back();
+ }
+#else
+ m_overlappingPairArray.resize(m_overlappingPairArray.size() - m_invalidPair);
+ m_invalidPair = 0;
+#endif
+
+
+ int i;
+
+ btBroadphasePair previousPair;
+ previousPair.m_pProxy0 = 0;
+ previousPair.m_pProxy1 = 0;
+ previousPair.m_algorithm = 0;
+
+
+ for (i=0;i<m_overlappingPairArray.size();i++)
+ {
+
+ btBroadphasePair& pair = m_overlappingPairArray[i];
+
+ bool isDuplicate = (pair == previousPair);
+
+ previousPair = pair;
+
+ bool needsRemoval = false;
+
+ if (!isDuplicate)
+ {
+ bool hasOverlap = testOverlap(pair.m_pProxy0,pair.m_pProxy1);
+
+ if (hasOverlap)
+ {
+ needsRemoval = callback->processOverlap(pair);
+ } else
+ {
+ needsRemoval = true;
+ }
+ } else
+ {
+ //remove duplicate
+ needsRemoval = true;
+ //should have no algorithm
+ btAssert(!pair.m_algorithm);
+ }
+
+ if (needsRemoval)
+ {
+ cleanOverlappingPair(pair);
+
+ // m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1);
+ // m_overlappingPairArray.pop_back();
+ pair.m_pProxy0 = 0;
+ pair.m_pProxy1 = 0;
+ m_invalidPair++;
+ gOverlappingPairs--;
+ }
+
+ }
+}
+
+
+bool btAxisSweep3::testOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1)
+{
+ const Handle* pHandleA = static_cast<Handle*>(proxy0);
+ const Handle* pHandleB = static_cast<Handle*>(proxy1);
+
+ //optimization 1: check the array index (memory address), instead of the m_pos
+
+ for (int axis = 0; axis < 3; axis++)
+ {
+ if (pHandleA->m_maxEdges[axis] < pHandleB->m_minEdges[axis] ||
+ pHandleB->m_maxEdges[axis] < pHandleA->m_minEdges[axis])
+ {
+ return false;
+ }
+ }
+ return true;
+}
+
bool btAxisSweep3::testOverlap(int ignoreAxis,const Handle* pHandleA, const Handle* pHandleB)
{
//optimization 1: check the array index (memory address), instead of the m_pos
@@ -272,7 +404,7 @@ bool btAxisSweep3::testOverlap(int ignoreAxis,const Handle* pHandleA, const Hand
}
}
- //optimization 2: only 2 axis need to be tested
+ //optimization 2: only 2 axis need to be tested (conflicts with 'delayed removal' optimization)
/*for (int axis = 0; axis < 3; axis++)
{
@@ -287,7 +419,7 @@ bool btAxisSweep3::testOverlap(int ignoreAxis,const Handle* pHandleA, const Hand
return true;
}
-void btAxisSweep3::updateHandle(unsigned short handle, const btPoint3& aabbMin,const btPoint3& aabbMax)
+void btAxisSweep3::updateHandle(BP_FP_INT_TYPE handle, const btPoint3& aabbMin,const btPoint3& aabbMax)
{
// assert(bounds.IsFinite());
//assert(bounds.HasVolume());
@@ -295,15 +427,15 @@ void btAxisSweep3::updateHandle(unsigned short handle, const btPoint3& aabbMin,c
Handle* pHandle = getHandle(handle);
// quantize the new bounds
- unsigned short min[3], max[3];
+ BP_FP_INT_TYPE min[3], max[3];
quantize(min, aabbMin, 0);
quantize(max, aabbMax, 1);
// update changed edges
for (int axis = 0; axis < 3; axis++)
{
- unsigned short emin = pHandle->m_minEdges[axis];
- unsigned short emax = pHandle->m_maxEdges[axis];
+ BP_FP_INT_TYPE emin = pHandle->m_minEdges[axis];
+ BP_FP_INT_TYPE emax = pHandle->m_maxEdges[axis];
int dmin = (int)min[axis] - (int)m_pEdges[axis][emin].m_pos;
int dmax = (int)max[axis] - (int)m_pEdges[axis][emax].m_pos;
@@ -324,14 +456,22 @@ void btAxisSweep3::updateHandle(unsigned short handle, const btPoint3& aabbMin,c
if (dmax < 0)
sortMaxDown(axis, emax);
+
+#ifdef DEBUG_BROADPHASE
+ debugPrintAxis(axis);
+#endif //DEBUG_BROADPHASE
}
- //PrintAxis(1);
+
}
+
+
+
// sorting a min edge downwards can only ever *add* overlaps
-void btAxisSweep3::sortMinDown(int axis, unsigned short edge, bool updateOverlaps)
+void btAxisSweep3::sortMinDown(int axis, BP_FP_INT_TYPE edge, bool updateOverlaps)
{
+
Edge* pEdge = m_pEdges[axis] + edge;
Edge* pPrev = pEdge - 1;
Handle* pHandleEdge = getHandle(pEdge->m_handle);
@@ -368,16 +508,21 @@ void btAxisSweep3::sortMinDown(int axis, unsigned short edge, bool updateOverlap
pEdge--;
pPrev--;
}
+
+#ifdef DEBUG_BROADPHASE
+ debugPrintAxis(axis);
+#endif //DEBUG_BROADPHASE
+
}
// sorting a min edge upwards can only ever *remove* overlaps
-void btAxisSweep3::sortMinUp(int axis, unsigned short edge, bool updateOverlaps)
+void btAxisSweep3::sortMinUp(int axis, BP_FP_INT_TYPE edge, bool updateOverlaps)
{
Edge* pEdge = m_pEdges[axis] + edge;
Edge* pNext = pEdge + 1;
Handle* pHandleEdge = getHandle(pEdge->m_handle);
- while (pEdge->m_pos > pNext->m_pos)
+ while (pNext->m_handle && (pEdge->m_pos >= pNext->m_pos))
{
Handle* pHandleNext = getHandle(pNext->m_handle);
@@ -386,10 +531,12 @@ void btAxisSweep3::sortMinUp(int axis, unsigned short edge, bool updateOverlaps)
// if next edge is maximum remove any overlap between the two handles
if (updateOverlaps)
{
+ /*
Handle* handle0 = getHandle(pEdge->m_handle);
Handle* handle1 = getHandle(pNext->m_handle);
btBroadphasePair tmpPair(*handle0,*handle1);
removeOverlappingPair(tmpPair);
+ */
}
@@ -410,11 +557,14 @@ void btAxisSweep3::sortMinUp(int axis, unsigned short edge, bool updateOverlaps)
pEdge++;
pNext++;
}
+
+
}
// sorting a max edge downwards can only ever *remove* overlaps
-void btAxisSweep3::sortMaxDown(int axis, unsigned short edge, bool updateOverlaps)
+void btAxisSweep3::sortMaxDown(int axis, BP_FP_INT_TYPE edge, bool updateOverlaps)
{
+
Edge* pEdge = m_pEdges[axis] + edge;
Edge* pPrev = pEdge - 1;
Handle* pHandleEdge = getHandle(pEdge->m_handle);
@@ -428,6 +578,8 @@ void btAxisSweep3::sortMaxDown(int axis, unsigned short edge, bool updateOverlap
// if previous edge was a minimum remove any overlap between the two handles
if (updateOverlaps)
{
+ //this is done during the overlappingpairarray iteration/narrowphase collision
+ /*
Handle* handle0 = getHandle(pEdge->m_handle);
Handle* handle1 = getHandle(pPrev->m_handle);
btBroadphasePair* pair = findPair(handle0,handle1);
@@ -437,6 +589,8 @@ void btAxisSweep3::sortMaxDown(int axis, unsigned short edge, bool updateOverlap
{
removeOverlappingPair(*pair);
}
+ */
+
}
// update edge reference in other handle
@@ -456,16 +610,22 @@ void btAxisSweep3::sortMaxDown(int axis, unsigned short edge, bool updateOverlap
pEdge--;
pPrev--;
}
+
+
+#ifdef DEBUG_BROADPHASE
+ debugPrintAxis(axis);
+#endif //DEBUG_BROADPHASE
+
}
// sorting a max edge upwards can only ever *add* overlaps
-void btAxisSweep3::sortMaxUp(int axis, unsigned short edge, bool updateOverlaps)
+void btAxisSweep3::sortMaxUp(int axis, BP_FP_INT_TYPE edge, bool updateOverlaps)
{
Edge* pEdge = m_pEdges[axis] + edge;
Edge* pNext = pEdge + 1;
Handle* pHandleEdge = getHandle(pEdge->m_handle);
- while (pEdge->m_pos > pNext->m_pos)
+ while (pNext->m_handle && (pEdge->m_pos >= pNext->m_pos))
{
Handle* pHandleNext = getHandle(pNext->m_handle);
@@ -496,4 +656,5 @@ void btAxisSweep3::sortMaxUp(int axis, unsigned short edge, bool updateOverlaps)
pEdge++;
pNext++;
}
+
}
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h
index ebbbe01bbe6..57bbb368672 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h
@@ -19,11 +19,29 @@
#ifndef AXIS_SWEEP_3_H
#define AXIS_SWEEP_3_H
-#include "LinearMath/btPoint3.h"
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btPoint3.h"
+#include "../../LinearMath/btVector3.h"
#include "btOverlappingPairCache.h"
#include "btBroadphaseProxy.h"
+
+//Enable BP_USE_FIXEDPOINT_INT_32 if you need more then 32767 objects
+//#define BP_USE_FIXEDPOINT_INT_32 1
+
+#ifdef BP_USE_FIXEDPOINT_INT_32
+ #define BP_FP_INT_TYPE unsigned int
+ #define BP_MAX_HANDLES 1500000 //arbitrary maximum number of handles
+ #define BP_HANDLE_SENTINEL 0x7fffffff
+ #define BP_HANDLE_MASK 0xfffffffe
+#else
+ #define BP_FP_INT_TYPE unsigned short int
+ #define BP_MAX_HANDLES 32767
+ #define BP_HANDLE_SENTINEL 0xffff
+ #define BP_HANDLE_MASK 0xfffe
+#endif //BP_USE_FIXEDPOINT_INT_32
+
+//#define DEBUG_BROADPHASE 1
+
/// btAxisSweep3 is an efficient implementation of the 3d axis sweep and prune broadphase.
/// It uses arrays rather then lists for storage of the 3 axis. Also it operates using integer coordinates instead of floats.
/// The testOverlap check is optimized to check the array index, rather then the actual AABB coordinates/pos
@@ -36,10 +54,10 @@ public:
class Edge
{
public:
- unsigned short m_pos; // low bit is min/max
- unsigned short m_handle;
+ BP_FP_INT_TYPE m_pos; // low bit is min/max
+ BP_FP_INT_TYPE m_handle;
- unsigned short IsMax() const {return m_pos & 1;}
+ BP_FP_INT_TYPE IsMax() const {return m_pos & 1;}
};
public:
@@ -48,14 +66,14 @@ public:
public:
// indexes into the edge arrays
- unsigned short m_minEdges[3], m_maxEdges[3]; // 6 * 2 = 12
- unsigned short m_handleId;
- unsigned short m_pad;
+ BP_FP_INT_TYPE m_minEdges[3], m_maxEdges[3]; // 6 * 2 = 12
+ BP_FP_INT_TYPE m_handleId;
+ BP_FP_INT_TYPE m_pad;
//void* m_pOwner; this is now in btBroadphaseProxy.m_clientObject
- inline void SetNextFree(unsigned short next) {m_minEdges[0] = next;}
- inline unsigned short GetNextFree() const {return m_minEdges[0];}
+ inline void SetNextFree(BP_FP_INT_TYPE next) {m_minEdges[0] = next;}
+ inline BP_FP_INT_TYPE GetNextFree() const {return m_minEdges[0];}
}; // 24 bytes + 24 for Edge structures = 44 bytes total per entry
@@ -65,51 +83,56 @@ private:
btVector3 m_quantize; // scaling factor for quantization
- int m_numHandles; // number of active handles
+ BP_FP_INT_TYPE m_numHandles; // number of active handles
int m_maxHandles; // max number of handles
Handle* m_pHandles; // handles pool
- unsigned short m_firstFreeHandle; // free handles list
+ BP_FP_INT_TYPE m_firstFreeHandle; // free handles list
Edge* m_pEdges[3]; // edge arrays for the 3 axes (each array has m_maxHandles * 2 + 2 sentinel entries)
+ int m_invalidPair;
// allocation/deallocation
- unsigned short allocHandle();
- void freeHandle(unsigned short handle);
+ BP_FP_INT_TYPE allocHandle();
+ void freeHandle(BP_FP_INT_TYPE handle);
bool testOverlap(int ignoreAxis,const Handle* pHandleA, const Handle* pHandleB);
- //Overlap* AddOverlap(unsigned short handleA, unsigned short handleB);
- //void RemoveOverlap(unsigned short handleA, unsigned short handleB);
+#ifdef DEBUG_BROADPHASE
+ void debugPrintAxis(int axis,bool checkCardinality=true);
+#endif //DEBUG_BROADPHASE
- void quantize(unsigned short* out, const btPoint3& point, int isMax) const;
+ //Overlap* AddOverlap(BP_FP_INT_TYPE handleA, BP_FP_INT_TYPE handleB);
+ //void RemoveOverlap(BP_FP_INT_TYPE handleA, BP_FP_INT_TYPE handleB);
- void sortMinDown(int axis, unsigned short edge, bool updateOverlaps = true);
- void sortMinUp(int axis, unsigned short edge, bool updateOverlaps = true);
- void sortMaxDown(int axis, unsigned short edge, bool updateOverlaps = true);
- void sortMaxUp(int axis, unsigned short edge, bool updateOverlaps = true);
+ void quantize(BP_FP_INT_TYPE* out, const btPoint3& point, int isMax) const;
+
+ void sortMinDown(int axis, BP_FP_INT_TYPE edge, bool updateOverlaps = true);
+ void sortMinUp(int axis, BP_FP_INT_TYPE edge, bool updateOverlaps = true);
+ void sortMaxDown(int axis, BP_FP_INT_TYPE edge, bool updateOverlaps = true);
+ void sortMaxUp(int axis, BP_FP_INT_TYPE edge, bool updateOverlaps = true);
public:
btAxisSweep3(const btPoint3& worldAabbMin,const btPoint3& worldAabbMax, int maxHandles = 16384);
virtual ~btAxisSweep3();
- virtual void refreshOverlappingPairs()
- {
- //this is replace by sweep and prune
- }
+ virtual void refreshOverlappingPairs();
- unsigned short addHandle(const btPoint3& aabbMin,const btPoint3& aabbMax, void* pOwner,short int collisionFilterGroup,short int collisionFilterMask);
- void removeHandle(unsigned short handle);
- void updateHandle(unsigned short handle, const btPoint3& aabbMin,const btPoint3& aabbMax);
- inline Handle* getHandle(unsigned short index) const {return m_pHandles + index;}
+ BP_FP_INT_TYPE addHandle(const btPoint3& aabbMin,const btPoint3& aabbMax, void* pOwner,short int collisionFilterGroup,short int collisionFilterMask);
+ void removeHandle(BP_FP_INT_TYPE handle);
+ void updateHandle(BP_FP_INT_TYPE handle, const btPoint3& aabbMin,const btPoint3& aabbMax);
+ inline Handle* getHandle(BP_FP_INT_TYPE index) const {return m_pHandles + index;}
+ void processAllOverlappingPairs(btOverlapCallback* callback);
//Broadphase Interface
virtual btBroadphaseProxy* createProxy( const btVector3& min, const btVector3& max,int shapeType,void* userPtr ,short int collisionFilterGroup,short int collisionFilterMask);
virtual void destroyProxy(btBroadphaseProxy* proxy);
virtual void setAabb(btBroadphaseProxy* proxy,const btVector3& aabbMin,const btVector3& aabbMax);
+ bool testOverlap(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
};
-#endif //AXIS_SWEEP_3_H
+#endif
+
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
index 0c0bfe4f7b9..b6ace03c07a 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h
@@ -21,7 +21,7 @@ subject to the following restrictions:
struct btDispatcherInfo;
class btDispatcher;
struct btBroadphaseProxy;
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btVector3.h"
///BroadphaseInterface for aabb-overlapping object pairs
class btBroadphaseInterface
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
index b279022c802..40d9748ffa9 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h
@@ -16,6 +16,7 @@ subject to the following restrictions:
#ifndef BROADPHASE_PROXY_H
#define BROADPHASE_PROXY_H
+#include "../../LinearMath/btScalar.h" //for SIMD_FORCE_INLINE
/// btDispatcher uses these types
@@ -33,6 +34,7 @@ enum BroadphaseNativeTypes
IMPLICIT_CONVEX_SHAPES_START_HERE,
SPHERE_SHAPE_PROXYTYPE,
MULTI_SPHERE_SHAPE_PROXYTYPE,
+ CAPSULE_SHAPE_PROXYTYPE,
CONE_SHAPE_PROXYTYPE,
CONVEX_SHAPE_PROXYTYPE,
CYLINDER_SHAPE_PROXYTYPE,
@@ -71,7 +73,7 @@ struct btBroadphaseProxy
KinematicFilter = 4,
DebrisFilter = 8,
SensorTrigger = 16,
- AllFilter = DefaultFilter | StaticFilter | KinematicFilter | DebrisFilter | SensorTrigger,
+ AllFilter = DefaultFilter | StaticFilter | KinematicFilter | DebrisFilter | SensorTrigger
};
//Usually the client btCollisionObject or Rigidbody class
@@ -113,7 +115,8 @@ struct btBroadphaseProxy
return (proxyType == STATIC_PLANE_PROXYTYPE);
}
-};
+}
+;
class btCollisionAlgorithm;
@@ -128,14 +131,16 @@ struct btBroadphasePair
:
m_pProxy0(0),
m_pProxy1(0),
- m_algorithm(0)
+ m_algorithm(0),
+ m_userInfo(0)
{
}
btBroadphasePair(const btBroadphasePair& other)
: m_pProxy0(other.m_pProxy0),
m_pProxy1(other.m_pProxy1),
- m_algorithm(other.m_algorithm)
+ m_algorithm(other.m_algorithm),
+ m_userInfo(other.m_userInfo)
{
}
btBroadphasePair(btBroadphaseProxy& proxy0,btBroadphaseProxy& proxy1)
@@ -154,6 +159,7 @@ struct btBroadphasePair
}
m_algorithm = 0;
+ m_userInfo = 0;
}
@@ -161,15 +167,37 @@ struct btBroadphasePair
btBroadphaseProxy* m_pProxy1;
mutable btCollisionAlgorithm* m_algorithm;
-};
+ mutable void* m_userInfo;
+};
+/*
//comparison for set operation, see Solid DT_Encounter
-inline bool operator<(const btBroadphasePair& a, const btBroadphasePair& b)
+SIMD_FORCE_INLINE bool operator<(const btBroadphasePair& a, const btBroadphasePair& b)
{
return a.m_pProxy0 < b.m_pProxy0 ||
(a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 < b.m_pProxy1);
}
+*/
+
+
+class btBroadphasePairSortPredicate
+{
+ public:
+
+ bool operator() ( const btBroadphasePair& a, const btBroadphasePair& b )
+ {
+ return a.m_pProxy0 > b.m_pProxy0 ||
+ (a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 > b.m_pProxy1) ||
+ (a.m_pProxy0 == b.m_pProxy0 && a.m_pProxy1 == b.m_pProxy1 && a.m_algorithm > b.m_algorithm);
+ }
+};
+
+
+SIMD_FORCE_INLINE bool operator==(const btBroadphasePair& a, const btBroadphasePair& b)
+{
+ return (a.m_pProxy0 == b.m_pProxy0) && (a.m_pProxy1 == b.m_pProxy1);
+}
#endif //BROADPHASE_PROXY_H
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
index f9e22057058..55cec386a7b 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h
@@ -16,6 +16,8 @@ subject to the following restrictions:
#ifndef COLLISION_ALGORITHM_H
#define COLLISION_ALGORITHM_H
+#include "../../LinearMath/btScalar.h"
+
struct btBroadphaseProxy;
class btDispatcher;
class btManifoldResult;
@@ -34,6 +36,7 @@ struct btCollisionAlgorithmConstructionInfo
btCollisionAlgorithmConstructionInfo(btDispatcher* dispatcher,int temp)
:m_dispatcher(dispatcher)
{
+ (void)temp;
}
btDispatcher* m_dispatcher;
@@ -66,7 +69,7 @@ public:
virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) = 0;
- virtual float calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) = 0;
+ virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) = 0;
};
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h
index c7714f592c4..3d958cc8fef 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btDispatcher.h
@@ -16,6 +16,8 @@ subject to the following restrictions:
#ifndef _DISPATCHER_H
#define _DISPATCHER_H
+#include "../../LinearMath/btScalar.h"
+
class btCollisionAlgorithm;
struct btBroadphaseProxy;
class btRigidBody;
@@ -34,10 +36,10 @@ struct btDispatcherInfo
DISPATCH_CONTINUOUS
};
btDispatcherInfo()
- :m_timeStep(0.f),
+ :m_timeStep(btScalar(0.)),
m_stepCount(0),
m_dispatchFunc(DISPATCH_DISCRETE),
- m_timeOfImpact(1.f),
+ m_timeOfImpact(btScalar(1.)),
m_useContinuous(false),
m_debugDraw(0),
m_enableSatConvex(false),
@@ -46,10 +48,10 @@ struct btDispatcherInfo
{
}
- float m_timeStep;
+ btScalar m_timeStep;
int m_stepCount;
int m_dispatchFunc;
- float m_timeOfImpact;
+ btScalar m_timeOfImpact;
bool m_useContinuous;
class btIDebugDraw* m_debugDraw;
bool m_enableSatConvex;
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
index 5e3fa633589..60f0a41a9d7 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
@@ -24,7 +24,8 @@ subject to the following restrictions:
int gOverlappingPairs = 0;
btOverlappingPairCache::btOverlappingPairCache():
-m_blockedForChanges(false)
+m_blockedForChanges(false),
+m_overlapFilterCallback(0)
//m_NumOverlapBroadphasePair(0)
{
}
@@ -39,15 +40,15 @@ btOverlappingPairCache::~btOverlappingPairCache()
void btOverlappingPairCache::removeOverlappingPair(btBroadphasePair& findPair)
{
- std::set<btBroadphasePair>::iterator it = m_overlappingPairSet.find(findPair);
-// assert(it != m_overlappingPairSet.end());
-
- if (it != m_overlappingPairSet.end())
+ int findIndex = m_overlappingPairArray.findLinearSearch(findPair);
+ if (findIndex < m_overlappingPairArray.size())
{
gOverlappingPairs--;
- btBroadphasePair* pair = (btBroadphasePair*)(&(*it));
- cleanOverlappingPair(*pair);
- m_overlappingPairSet.erase(it);
+ btBroadphasePair& pair = m_overlappingPairArray[findIndex];
+ cleanOverlappingPair(pair);
+
+ m_overlappingPairArray.swap(findIndex,m_overlappingPairArray.size()-1);
+ m_overlappingPairArray.pop_back();
}
}
@@ -78,7 +79,7 @@ void btOverlappingPairCache::addOverlappingPair(btBroadphaseProxy* proxy0,btBroa
btBroadphasePair pair(*proxy0,*proxy1);
- m_overlappingPairSet.insert(pair);
+ m_overlappingPairArray.push_back(pair);
gOverlappingPairs++;
}
@@ -93,13 +94,15 @@ void btOverlappingPairCache::addOverlappingPair(btBroadphaseProxy* proxy0,btBroa
return 0;
btBroadphasePair tmpPair(*proxy0,*proxy1);
- std::set<btBroadphasePair>::iterator it = m_overlappingPairSet.find(tmpPair);
- if ((it == m_overlappingPairSet.end()))
- return 0;
+ int findIndex = m_overlappingPairArray.findLinearSearch(tmpPair);
- //assert(it != m_overlappingPairSet.end());
- btBroadphasePair* pair = (btBroadphasePair*)(&(*it));
- return pair;
+ if (findIndex < m_overlappingPairArray.size())
+ {
+ //assert(it != m_overlappingPairSet.end());
+ btBroadphasePair* pair = &m_overlappingPairArray[findIndex];
+ return pair;
+ }
+ return 0;
}
@@ -170,30 +173,23 @@ void btOverlappingPairCache::removeOverlappingPairsContainingProxy(btBroadphaseP
void btOverlappingPairCache::processAllOverlappingPairs(btOverlapCallback* callback)
{
- std::set<btBroadphasePair>::iterator it = m_overlappingPairSet.begin();
- for (; !(it==m_overlappingPairSet.end());)
+
+ int i;
+
+ for (i=0;i<m_overlappingPairArray.size();)
{
- btBroadphasePair* pair = (btBroadphasePair*)(&(*it));
+ btBroadphasePair* pair = &m_overlappingPairArray[i];
if (callback->processOverlap(*pair))
{
cleanOverlappingPair(*pair);
- std::set<btBroadphasePair>::iterator it2 = it;
- //why does next line not compile under OS X??
-#ifdef MAC_OSX_FIXED_STL_SET
- it2++;
- it = m_overlappingPairSet.erase(it);
- assert(it == it2);
-#else
- it++;
- m_overlappingPairSet.erase(it2);
-#endif //MAC_OSX_FIXED_STL_SET
-
+ m_overlappingPairArray.swap(i,m_overlappingPairArray.size()-1);
+ m_overlappingPairArray.pop_back();
gOverlappingPairs--;
} else
{
- it++;
+ i++;
}
}
}
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
index bc62961bf3c..a81fe3264df 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h
@@ -20,65 +20,101 @@ subject to the following restrictions:
#include "btBroadphaseInterface.h"
#include "btBroadphaseProxy.h"
-#include "LinearMath/btPoint3.h"
-#include <set>
+#include "../../LinearMath/btPoint3.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
struct btOverlapCallback
{
-virtual ~btOverlapCallback()
-{
-}
+ virtual ~btOverlapCallback()
+ {}
//return true for deletion of the pair
virtual bool processOverlap(btBroadphasePair& pair) = 0;
};
+struct btOverlapFilterCallback
+{
+ virtual ~btOverlapFilterCallback()
+ {}
+ // return true when pairs need collision
+ virtual bool needBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const = 0;
+};
+
///btOverlappingPairCache maintains the objects with overlapping AABB
///Typically managed by the Broadphase, Axis3Sweep or btSimpleBroadphase
class btOverlappingPairCache : public btBroadphaseInterface
{
- //avoid brute-force finding all the time
- std::set<btBroadphasePair> m_overlappingPairSet;
-
- //during the dispatch, check that user doesn't destroy/create proxy
- bool m_blockedForChanges;
-
- public:
+ protected:
+ //avoid brute-force finding all the time
+ btAlignedObjectArray<btBroadphasePair> m_overlappingPairArray;
+
+ //during the dispatch, check that user doesn't destroy/create proxy
+ bool m_blockedForChanges;
- btOverlappingPairCache();
- virtual ~btOverlappingPairCache();
+ //if set, use the callback instead of the built in filter in needBroadphaseCollision
+ btOverlapFilterCallback* m_overlapFilterCallback;
+ public:
+
+ btOverlappingPairCache();
+ virtual ~btOverlappingPairCache();
- void processAllOverlappingPairs(btOverlapCallback*);
+ virtual void processAllOverlappingPairs(btOverlapCallback*);
- void removeOverlappingPair(btBroadphasePair& pair);
+ void removeOverlappingPair(btBroadphasePair& pair);
- void cleanOverlappingPair(btBroadphasePair& pair);
-
- void addOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
+ void cleanOverlappingPair(btBroadphasePair& pair);
+
+ void addOverlappingPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
- btBroadphasePair* findPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
+ btBroadphasePair* findPair(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1);
+
-
- void cleanProxyFromPairs(btBroadphaseProxy* proxy);
+ void cleanProxyFromPairs(btBroadphaseProxy* proxy);
- void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy);
+ void removeOverlappingPairsContainingProxy(btBroadphaseProxy* proxy);
- inline bool needsBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const
- {
- bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
- collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
-
- return collides;
- }
+ inline bool needsBroadphaseCollision(btBroadphaseProxy* proxy0,btBroadphaseProxy* proxy1) const
+ {
+ if (m_overlapFilterCallback)
+ return m_overlapFilterCallback->needBroadphaseCollision(proxy0,proxy1);
+
+ bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
+ collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
+
+ return collides;
+ }
+
-
- virtual void refreshOverlappingPairs() =0;
+ virtual void refreshOverlappingPairs() =0;
+ btBroadphasePair* getOverlappingPairArrayPtr()
+ {
+ return &m_overlappingPairArray[0];
+ }
+ const btBroadphasePair* getOverlappingPairArrayPtr() const
+ {
+ return &m_overlappingPairArray[0];
+ }
+ int getNumOverlappingPairs() const
+ {
+ return m_overlappingPairArray.size();
+ }
+
+ btOverlapFilterCallback* getOverlapFilterCallback()
+ {
+ return m_overlapFilterCallback;
+ }
+
+ void setOverlapFilterCallback(btOverlapFilterCallback* callback)
+ {
+ m_overlapFilterCallback = callback;
+ }
};
#endif //OVERLAPPING_PAIR_CACHE_H
+
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
index 6281e93eeb4..30bcbe0c5f1 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
@@ -20,7 +20,7 @@ subject to the following restrictions:
#include "LinearMath/btVector3.h"
#include "LinearMath/btTransform.h"
#include "LinearMath/btMatrix3x3.h"
-#include <vector>
+#include <new>
void btSimpleBroadphase::validate()
@@ -85,8 +85,8 @@ btBroadphaseProxy* btSimpleBroadphase::createProxy( const btVector3& min, cons
btSimpleBroadphaseProxy* proxy1 = &m_proxies[0];
- int index = proxy - proxy1;
- assert(index == freeIndex);
+ int index = int(proxy - proxy1);
+ btAssert(index == freeIndex);
m_pProxies[m_numProxies] = proxy;
m_numProxies++;
@@ -100,7 +100,8 @@ class RemovingOverlapCallback : public btOverlapCallback
protected:
virtual bool processOverlap(btBroadphasePair& pair)
{
- assert(0);
+ (void)pair;
+ btAssert(0);
return false;
}
};
@@ -131,8 +132,8 @@ void btSimpleBroadphase::destroyProxy(btBroadphaseProxy* proxyOrg)
btSimpleBroadphaseProxy* proxy0 = static_cast<btSimpleBroadphaseProxy*>(proxyOrg);
btSimpleBroadphaseProxy* proxy1 = &m_proxies[0];
- int index = proxy0 - proxy1;
- assert (index < m_maxProxies);
+ int index = int(proxy0 - proxy1);
+ btAssert (index < m_maxProxies);
m_freeProxies[--m_firstFreeProxy] = index;
removeOverlappingPairsContainingProxy(proxyOrg);
diff --git a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
index 281677081d7..fb155e7047c 100644
--- a/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
+++ b/extern/bullet2/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h
@@ -31,6 +31,7 @@ struct btSimpleBroadphaseProxy : public btBroadphaseProxy
:btBroadphaseProxy(userPtr,collisionFilterGroup,collisionFilterMask),
m_min(minpt),m_max(maxpt)
{
+ (void)shapeType;
}
@@ -40,6 +41,8 @@ struct btSimpleBroadphaseProxy : public btBroadphaseProxy
class btSimpleBroadphase : public btOverlappingPairCache
{
+protected:
+
btSimpleBroadphaseProxy* m_proxies;
int* m_freeProxies;
int m_firstFreeProxy;
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
index 0d76b1013f9..81133670f0c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
@@ -13,6 +13,7 @@ subject to the following restrictions:
3. This notice may not be removed or altered from any source distribution.
*/
+#include "LinearMath/btScalar.h"
#include "SphereTriangleDetector.h"
#include "BulletCollision/CollisionShapes/btTriangleShape.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
@@ -28,13 +29,14 @@ m_triangle(triangle)
void SphereTriangleDetector::getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw)
{
+ (void)debugDraw;
const btTransform& transformA = input.m_transformA;
const btTransform& transformB = input.m_transformB;
btVector3 point,normal;
- btScalar timeOfImpact = 1.f;
- btScalar depth = 0.f;
-// output.m_distance = 1e30f;
+ btScalar timeOfImpact = btScalar(1.);
+ btScalar depth = btScalar(0.);
+// output.m_distance = btScalar(1e30);
//move sphere into triangle space
btTransform sphereInTr = transformB.inverseTimes(transformA);
@@ -45,19 +47,19 @@ void SphereTriangleDetector::getClosestPoints(const ClosestPointInput& input,Res
}
-#define MAX_OVERLAP 0.f
+#define MAX_OVERLAP btScalar(0.)
// See also geometrictools.com
// Basic idea: D = |p - (lo + t0*lv)| where t0 = lv . (p - lo) / lv . lv
-float SegmentSqrDistance(const btVector3& from, const btVector3& to,const btVector3 &p, btVector3 &nearest) {
+btScalar SegmentSqrDistance(const btVector3& from, const btVector3& to,const btVector3 &p, btVector3 &nearest) {
btVector3 diff = p - from;
btVector3 v = to - from;
- float t = v.dot(diff);
+ btScalar t = v.dot(diff);
if (t > 0) {
- float dotVV = v.dot(v);
+ btScalar dotVV = v.dot(v);
if (t < dotVV) {
t /= dotVV;
diff -= t*v;
@@ -80,7 +82,7 @@ bool SphereTriangleDetector::facecontains(const btVector3 &p,const btVector3* ve
}
///combined discrete/continuous sphere-triangle
-bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, float &timeOfImpact)
+bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, btScalar &timeOfImpact)
{
const btVector3* vertices = &m_triangle->getVertexPtr(0);
@@ -92,25 +94,25 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
btVector3 normal = (vertices[1]-vertices[0]).cross(vertices[2]-vertices[0]);
normal.normalize();
btVector3 p1ToCentre = c - vertices[0];
- float distanceFromPlane = p1ToCentre.dot(normal);
+ btScalar distanceFromPlane = p1ToCentre.dot(normal);
- if (distanceFromPlane < 0.f)
+ if (distanceFromPlane < btScalar(0.))
{
//triangle facing the other way
- distanceFromPlane *= -1.f;
- normal *= -1.f;
+ distanceFromPlane *= btScalar(-1.);
+ normal *= btScalar(-1.);
}
///todo: move this gContactBreakingThreshold into a proper structure
- extern float gContactBreakingThreshold;
+ extern btScalar gContactBreakingThreshold;
- float contactMargin = gContactBreakingThreshold;
+ btScalar contactMargin = gContactBreakingThreshold;
bool isInsideContactPlane = distanceFromPlane < r + contactMargin;
bool isInsideShellPlane = distanceFromPlane < r;
- float deltaDotNormal = delta.dot(normal);
- if (!isInsideShellPlane && deltaDotNormal >= 0.0f)
+ btScalar deltaDotNormal = delta.dot(normal);
+ if (!isInsideShellPlane && deltaDotNormal >= btScalar(0.0))
return false;
// Check for contact / intersection
@@ -123,7 +125,7 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
contactPoint = c - normal*distanceFromPlane;
} else {
// Could be inside one of the contact capsules
- float contactCapsuleRadiusSqr = (r + contactMargin) * (r + contactMargin);
+ btScalar contactCapsuleRadiusSqr = (r + contactMargin) * (r + contactMargin);
btVector3 nearestOnEdge;
for (int i = 0; i < m_triangle->getNumEdges(); i++) {
@@ -132,7 +134,7 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
m_triangle->getEdge(i,pa,pb);
- float distanceSqr = SegmentSqrDistance(pa,pb,c, nearestOnEdge);
+ btScalar distanceSqr = SegmentSqrDistance(pa,pb,c, nearestOnEdge);
if (distanceSqr < contactCapsuleRadiusSqr) {
// Yep, we're inside a capsule
hasContact = true;
@@ -145,25 +147,22 @@ bool SphereTriangleDetector::collide(const btVector3& sphereCenter,btVector3 &po
if (hasContact) {
btVector3 contactToCentre = c - contactPoint;
- float distanceSqr = contactToCentre.length2();
+ btScalar distanceSqr = contactToCentre.length2();
if (distanceSqr < (r - MAX_OVERLAP)*(r - MAX_OVERLAP)) {
- float distance = btSqrt(distanceSqr);
- if (1)
- {
- resultNormal = contactToCentre;
- resultNormal.normalize();
- }
+ btScalar distance = btSqrt(distanceSqr);
+ resultNormal = contactToCentre;
+ resultNormal.normalize();
point = contactPoint;
depth = -(r-distance);
return true;
}
- if (delta.dot(contactToCentre) >= 0.0f)
+ if (delta.dot(contactToCentre) >= btScalar(0.0))
return false;
// Moving towards the contact point -> collision
point = contactPoint;
- timeOfImpact = 0.0f;
+ timeOfImpact = btScalar(0.0);
return true;
}
@@ -189,7 +188,7 @@ bool SphereTriangleDetector::pointInTriangle(const btVector3 vertices[], const b
btVector3 edge2_normal( edge2.cross(normal));
btVector3 edge3_normal( edge3.cross(normal));
- float r1, r2, r3;
+ btScalar r1, r2, r3;
r1 = edge1_normal.dot( p1_to_p );
r2 = edge2_normal.dot( p2_to_p );
r3 = edge3_normal.dot( p3_to_p );
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
index 8fedba19922..b32806a6846 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h
@@ -16,8 +16,8 @@ subject to the following restrictions:
#ifndef SPHERE_TRIANGLE_DETECTOR_H
#define SPHERE_TRIANGLE_DETECTOR_H
-#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h"
-#include "LinearMath/btPoint3.h"
+#include "../NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h"
+#include "../../LinearMath/btPoint3.h"
class btSphereShape;
@@ -36,7 +36,7 @@ struct SphereTriangleDetector : public btDiscreteCollisionDetectorInterface
private:
- bool collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, float &timeOfImpact);
+ bool collide(const btVector3& sphereCenter,btVector3 &point, btVector3& resultNormal, btScalar& depth, btScalar &timeOfImpact);
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/btCollisionCreateFunc.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h
index 1eaa4a0fd50..d51a59af7f0 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h
@@ -16,9 +16,8 @@ subject to the following restrictions:
#ifndef COLLISION_CREATE_FUNC
#define COLLISION_CREATE_FUNC
-#include <vector>
-
-typedef std::vector<class btCollisionObject*> btCollisionObjectArray;
+#include "../../LinearMath/btAlignedObjectArray.h"
+typedef btAlignedObjectArray<class btCollisionObject*> btCollisionObjectArray;
class btCollisionAlgorithm;
class btCollisionObject;
@@ -35,8 +34,11 @@ struct btCollisionAlgorithmCreateFunc
}
virtual ~btCollisionAlgorithmCreateFunc(){};
- virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
+ virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& , btCollisionObject* body0,btCollisionObject* body1)
{
+
+ (void)body0;
+ (void)body1;
return 0;
}
};
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
index 309c1890b40..b535fac6563 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
@@ -25,7 +25,6 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h"
#include "BulletCollision/CollisionShapes/btCollisionShape.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
-#include <algorithm>
#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h"
int gNumManifold = 0;
@@ -33,16 +32,17 @@ int gNumManifold = 0;
#include <stdio.h>
-btCollisionDispatcher::btCollisionDispatcher(bool noDefaultAlgorithms)
-:m_useIslands(true),
-m_convexConvexCreateFunc(0),
+btCollisionDispatcher::btCollisionDispatcher(bool noDefaultAlgorithms):
m_count(0),
+m_useIslands(true),
+m_convexConvexCreateFunc(0),
m_convexConcaveCreateFunc(0),
m_swappedConvexConcaveCreateFunc(0),
m_compoundCreateFunc(0),
m_swappedCompoundCreateFunc(0),
m_emptyCreateFunc(0)
{
+ (void)noDefaultAlgorithms;
int i;
setNearCallback(defaultNearCallback);
@@ -56,11 +56,14 @@ m_emptyCreateFunc(0)
}
}
}
-
+//if you want to not link with the default collision algorithms, you can
+//define BT_EXCLUDE_DEFAULT_COLLISIONALGORITHM_REGISTRATION
+//in your Bullet library build system
+#ifndef BT_EXCLUDE_DEFAULT_COLLISIONALGORITHM_REGISTRATION
btCollisionDispatcher::btCollisionDispatcher ():
- m_useIslands(true),
- m_count(0)
+ m_count(0),
+ m_useIslands(true)
{
int i;
@@ -86,6 +89,9 @@ btCollisionDispatcher::btCollisionDispatcher ():
};
+#endif //BT_EXCLUDE_DEFAULT_COLLISIONALGORITHM_REGISTRATION
+
+
void btCollisionDispatcher::registerCollisionCreateFunc(int proxyType0, int proxyType1, btCollisionAlgorithmCreateFunc *createFunc)
{
m_doubleDispatch[proxyType0][proxyType1] = createFunc;
@@ -129,20 +135,17 @@ void btCollisionDispatcher::releaseManifold(btPersistentManifold* manifold)
gNumManifold--;
//printf("releaseManifold: gNumManifold %d\n",gNumManifold);
-
clearManifold(manifold);
- std::vector<btPersistentManifold*>::iterator i =
- std::find(m_manifoldsPtr.begin(), m_manifoldsPtr.end(), manifold);
- if (!(i == m_manifoldsPtr.end()))
+ ///todo: this can be improved a lot, linear search might be slow part!
+ int findIndex = m_manifoldsPtr.findLinearSearch(manifold);
+ if (findIndex < m_manifoldsPtr.size())
{
- std::swap(*i, m_manifoldsPtr.back());
+ m_manifoldsPtr.swap(findIndex,m_manifoldsPtr.size()-1);
m_manifoldsPtr.pop_back();
delete manifold;
-
}
-
}
@@ -164,6 +167,8 @@ btCollisionAlgorithm* btCollisionDispatcher::findAlgorithm(btCollisionObject* bo
}
+#ifndef BT_EXCLUDE_DEFAULT_COLLISIONALGORITHM_REGISTRATION
+
btCollisionAlgorithmCreateFunc* btCollisionDispatcher::internalFindCreateFunc(int proxyType0,int proxyType1)
{
@@ -197,6 +202,8 @@ btCollisionAlgorithmCreateFunc* btCollisionDispatcher::internalFindCreateFunc(in
return m_emptyCreateFunc;
}
+#endif //BT_EXCLUDE_DEFAULT_COLLISIONALGORITHM_REGISTRATION
+
#ifndef USE_DISPATCH_REGISTRY_ARRAY
@@ -266,6 +273,8 @@ bool btCollisionDispatcher::needsCollision(btCollisionObject* body0,btCollisionO
if ((!body0->isActive()) && (!body1->isActive()))
needsCollision = false;
+ else if (!body0->checkCollideWith(body1))
+ needsCollision = false;
return needsCollision ;
@@ -288,6 +297,16 @@ public:
{
}
+ btCollisionPairCallback& operator=(btCollisionPairCallback& other)
+ {
+ m_dispatchInfo = other.m_dispatchInfo;
+ m_dispatcher = other.m_dispatcher;
+ return *this;
+ }
+
+ virtual ~btCollisionPairCallback() {}
+
+
virtual bool processOverlap(btBroadphasePair& pair)
{
(*m_dispatcher->getNearCallback())(pair,*m_dispatcher,m_dispatchInfo);
@@ -337,7 +356,7 @@ void btCollisionDispatcher::defaultNearCallback(btBroadphasePair& collisionPair,
} else
{
//continuous collision detection query, time of impact (toi)
- float toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0,colObj1,dispatchInfo,&contactPointResult);
+ btScalar toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0,colObj1,dispatchInfo,&contactPointResult);
if (dispatchInfo.m_timeOfImpact > toi)
dispatchInfo.m_timeOfImpact = toi;
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
index 77c09b618ec..ca5aba8f01c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h
@@ -16,13 +16,13 @@ subject to the following restrictions:
#ifndef COLLISION__DISPATCHER_H
#define COLLISION__DISPATCHER_H
-#include "BulletCollision/BroadphaseCollision/btDispatcher.h"
-#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
+#include "../BroadphaseCollision/btDispatcher.h"
+#include "../NarrowPhaseCollision/btPersistentManifold.h"
-#include "BulletCollision/CollisionDispatch/btManifoldResult.h"
-
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
+#include "../CollisionDispatch/btManifoldResult.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
class btIDebugDraw;
class btOverlappingPairCache;
@@ -41,8 +41,9 @@ typedef void (*btNearCallback)(btBroadphasePair& collisionPair, btCollisionDispa
///Time of Impact, Closest Points and Penetration Depth.
class btCollisionDispatcher : public btDispatcher
{
+ int m_count;
- std::vector<btPersistentManifold*> m_manifoldsPtr;
+ btAlignedObjectArray<btPersistentManifold*> m_manifoldsPtr;
bool m_useIslands;
@@ -68,7 +69,6 @@ class btCollisionDispatcher : public btDispatcher
public:
-
///registerCollisionCreateFunc allows registration of custom/alternative collision create functions
void registerCollisionCreateFunc(int proxyType0,int proxyType1, btCollisionAlgorithmCreateFunc* createFunc);
@@ -92,8 +92,6 @@ public:
return m_manifoldsPtr[index];
}
- int m_count;
-
///the default constructor creates/register default collision algorithms, for convex, compound and concave shape support
btCollisionDispatcher ();
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp
index 13fa0b5baa9..d4c0a4e8cb3 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp
@@ -20,15 +20,19 @@ btCollisionObject::btCollisionObject()
m_collisionShape(0),
m_collisionFlags(0),
m_activationState1(1),
- m_deactivationTime(0.f),
+ m_deactivationTime(btScalar(0.)),
m_userObjectPointer(0),
- m_hitFraction(1.f),
- m_ccdSweptSphereRadius(0.f),
- m_ccdSquareMotionThreshold(0.f)
+ m_hitFraction(btScalar(1.)),
+ m_ccdSweptSphereRadius(btScalar(0.)),
+ m_ccdSquareMotionThreshold(btScalar(0.)),
+ m_checkCollideWith(false)
{
}
+btCollisionObject::~btCollisionObject()
+{
+}
void btCollisionObject::setActivationState(int newState)
{
@@ -46,7 +50,7 @@ void btCollisionObject::activate(bool forceActivation)
if (forceActivation || !(m_collisionFlags & (CF_STATIC_OBJECT|CF_KINEMATIC_OBJECT)))
{
setActivationState(ACTIVE_TAG);
- m_deactivationTime = 0.f;
+ m_deactivationTime = btScalar(0.);
}
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
index 9a0129ac29c..9fb6a67c4a3 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionObject.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef COLLISION_OBJECT_H
#define COLLISION_OBJECT_H
-#include "LinearMath/btTransform.h"
+#include "../../LinearMath/btTransform.h"
//island management, m_activationState1
#define ACTIVE_TAG 1
@@ -27,21 +27,19 @@ subject to the following restrictions:
struct btBroadphaseProxy;
class btCollisionShape;
-#include "LinearMath/btMotionState.h"
+#include "../../LinearMath/btMotionState.h"
/// 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.
/// They can be added to the btCollisionWorld.
-class btCollisionObject
+ATTRIBUTE_ALIGNED16(class) btCollisionObject
{
protected:
btTransform m_worldTransform;
- btBroadphaseProxy* m_broadphaseHandle;
- btCollisionShape* m_collisionShape;
///m_interpolationWorldTransform is used for CCD and interpolation
///it can be either previous or future (predicted) transform
@@ -50,12 +48,16 @@ protected:
//without destroying the continuous interpolated motion (which uses this interpolation velocities)
btVector3 m_interpolationLinearVelocity;
btVector3 m_interpolationAngularVelocity;
+ btBroadphaseProxy* m_broadphaseHandle;
+ btCollisionShape* m_collisionShape;
int m_collisionFlags;
int m_islandTag1;
+ int m_companionId;
+
int m_activationState1;
- float m_deactivationTime;
+ btScalar m_deactivationTime;
btScalar m_friction;
btScalar m_restitution;
@@ -67,13 +69,23 @@ protected:
void* m_internalOwner;
///time of impact calculation
- float m_hitFraction;
+ btScalar m_hitFraction;
///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
- float m_ccdSweptSphereRadius;
+ btScalar m_ccdSweptSphereRadius;
/// Don't do continuous collision detection if square motion (in one step) is less then m_ccdSquareMotionThreshold
- float m_ccdSquareMotionThreshold;
+ btScalar m_ccdSquareMotionThreshold;
+
+ /// If some object should have elaborate collision filtering by sub-classes
+ bool m_checkCollideWith;
+
+ char m_pad[7];
+
+ virtual bool checkCollideWithOverride(btCollisionObject* co)
+ {
+ return true;
+ }
public:
@@ -82,7 +94,7 @@ public:
CF_STATIC_OBJECT= 1,
CF_KINEMATIC_OBJECT= 2,
CF_NO_CONTACT_RESPONSE = 4,
- CF_CUSTOM_MATERIAL_CALLBACK = 8,//this allows per-triangle material (friction/restitution)
+ CF_CUSTOM_MATERIAL_CALLBACK = 8//this allows per-triangle material (friction/restitution)
};
@@ -114,6 +126,7 @@ public:
btCollisionObject();
+ virtual ~btCollisionObject();
void setCollisionShape(btCollisionShape* collisionShape)
{
@@ -137,11 +150,11 @@ public:
void setActivationState(int newState);
- void setDeactivationTime(float time)
+ void setDeactivationTime(btScalar time)
{
m_deactivationTime = time;
}
- float getDeactivationTime() const
+ btScalar getDeactivationTime() const
{
return m_deactivationTime;
}
@@ -155,19 +168,19 @@ public:
return ((getActivationState() != ISLAND_SLEEPING) && (getActivationState() != DISABLE_SIMULATION));
}
- void setRestitution(float rest)
+ void setRestitution(btScalar rest)
{
m_restitution = rest;
}
- float getRestitution() const
+ btScalar getRestitution() const
{
return m_restitution;
}
- void setFriction(float frict)
+ void setFriction(btScalar frict)
{
m_friction = frict;
}
- float getFriction() const
+ btScalar getFriction() const
{
return m_friction;
}
@@ -251,12 +264,22 @@ public:
m_islandTag1 = tag;
}
- const float getHitFraction() const
+ const int getCompanionId() const
+ {
+ return m_companionId;
+ }
+
+ void setCompanionId(int id)
+ {
+ m_companionId = id;
+ }
+
+ const btScalar getHitFraction() const
{
return m_hitFraction;
}
- void setHitFraction(float hitFraction)
+ void setHitFraction(btScalar hitFraction)
{
m_hitFraction = hitFraction;
}
@@ -273,25 +296,25 @@ public:
}
///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
- float getCcdSweptSphereRadius() const
+ btScalar getCcdSweptSphereRadius() const
{
return m_ccdSweptSphereRadius;
}
///Swept sphere radius (0.0 by default), see btConvexConvexAlgorithm::
- void setCcdSweptSphereRadius(float radius)
+ void setCcdSweptSphereRadius(btScalar radius)
{
m_ccdSweptSphereRadius = radius;
}
- float getCcdSquareMotionThreshold() const
+ btScalar getCcdSquareMotionThreshold() const
{
return m_ccdSquareMotionThreshold;
}
/// Don't do continuous collision detection if square motion (in one step) is less then m_ccdSquareMotionThreshold
- void setCcdSquareMotionThreshold(float ccdSquareMotionThreshold)
+ void setCcdSquareMotionThreshold(btScalar ccdSquareMotionThreshold)
{
m_ccdSquareMotionThreshold = ccdSquareMotionThreshold;
}
@@ -308,6 +331,16 @@ public:
m_userObjectPointer = userPointer;
}
-};
+ inline bool checkCollideWith(btCollisionObject* co)
+ {
+ if (m_checkCollideWith)
+ return checkCollideWithOverride(co);
+
+ return true;
+ }
+
+
+}
+;
#endif //COLLISION_OBJECT_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
index fa1561973fb..b49036a5b50 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
@@ -17,6 +17,8 @@ subject to the following restrictions:
#include "btCollisionDispatcher.h"
#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
#include "BulletCollision/CollisionShapes/btCollisionShape.h"
+#include "BulletCollision/CollisionShapes/btConvexShape.h"
+
#include "BulletCollision/CollisionShapes/btSphereShape.h" //for raycasting
#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h" //for raycasting
#include "BulletCollision/NarrowPhaseCollision/btRaycastCallback.h"
@@ -31,7 +33,6 @@ subject to the following restrictions:
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h"
-#include <algorithm>
btCollisionWorld::btCollisionWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache, int stackSize)
:m_dispatcher1(dispatcher),
@@ -50,13 +51,10 @@ btCollisionWorld::~btCollisionWorld()
delete m_stackAlloc;
//clean up remaining objects
- std::vector<btCollisionObject*>::iterator i;
-
- for (i=m_collisionObjects.begin();
- !(i==m_collisionObjects.end()); i++)
-
+ int i;
+ for (i=0;i<m_collisionObjects.size();i++)
{
- btCollisionObject* collisionObject= (*i);
+ btCollisionObject* collisionObject= m_collisionObjects[i];
btBroadphaseProxy* bp = collisionObject->getBroadphaseHandle();
if (bp)
@@ -89,9 +87,7 @@ void btCollisionWorld::addCollisionObject(btCollisionObject* collisionObject,sho
{
//check that the object isn't already added
- std::vector<btCollisionObject*>::iterator i = std::find(m_collisionObjects.begin(), m_collisionObjects.end(), collisionObject);
- assert(i == m_collisionObjects.end());
-
+ btAssert( m_collisionObjects.findLinearSearch(collisionObject) == m_collisionObjects.size());
m_collisionObjects.push_back(collisionObject);
@@ -125,13 +121,13 @@ void btCollisionWorld::performDiscreteCollisionDetection()
{
btDispatcherInfo& dispatchInfo = getDispatchInfo();
- BEGIN_PROFILE("performDiscreteCollisionDetection");
+ BEGIN_PROFILE("perform Broadphase Collision Detection");
//update aabb (of all moved objects)
btVector3 aabbMin,aabbMax;
- for (size_t i=0;i<m_collisionObjects.size();i++)
+ for (int i=0;i<m_collisionObjects.size();i++)
{
m_collisionObjects[i]->getCollisionShape()->getAabb(m_collisionObjects[i]->getWorldTransform(),aabbMin,aabbMax);
m_broadphasePairCache->setAabb(m_collisionObjects[i]->getBroadphaseHandle(),aabbMin,aabbMax);
@@ -139,6 +135,11 @@ void btCollisionWorld::performDiscreteCollisionDetection()
m_broadphasePairCache->refreshOverlappingPairs();
+
+ END_PROFILE("perform Broadphase Collision Detection");
+
+ BEGIN_PROFILE("performDiscreteCollisionDetection");
+
btDispatcher* dispatcher = getDispatcher();
if (dispatcher)
dispatcher->dispatchAllCollisionPairs(m_broadphasePairCache,dispatchInfo);
@@ -169,39 +170,53 @@ void btCollisionWorld::removeCollisionObject(btCollisionObject* collisionObject)
}
- std::vector<btCollisionObject*>::iterator i = std::find(m_collisionObjects.begin(), m_collisionObjects.end(), collisionObject);
-
- if (!(i == m_collisionObjects.end()))
- {
- std::swap(*i, m_collisionObjects.back());
- m_collisionObjects.pop_back();
- }
+ //swapremove
+ m_collisionObjects.remove(collisionObject);
+
}
+
+
void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans,
btCollisionObject* collisionObject,
const btCollisionShape* collisionShape,
const btTransform& colObjWorldTransform,
- RayResultCallback& resultCallback)
+ RayResultCallback& resultCallback,short int collisionFilterMask)
+{
+
+ btSphereShape pointShape(btScalar(0.0));
+ pointShape.setMargin(0.f);
+
+ objectQuerySingle(&pointShape,rayFromTrans,rayToTrans,
+ collisionObject,
+ collisionShape,
+ colObjWorldTransform,
+ resultCallback,collisionFilterMask);
+}
+
+void btCollisionWorld::objectQuerySingle(const btConvexShape* castShape,const btTransform& rayFromTrans,const btTransform& rayToTrans,
+ btCollisionObject* collisionObject,
+ const btCollisionShape* collisionShape,
+ const btTransform& colObjWorldTransform,
+ RayResultCallback& resultCallback,short int collisionFilterMask)
{
- btSphereShape pointShape(0.0f);
if (collisionShape->isConvex())
{
btConvexCast::CastResult castResult;
- castResult.m_fraction = 1.f;//??
+ castResult.m_fraction = btScalar(1.);//??
btConvexShape* convexShape = (btConvexShape*) collisionShape;
btVoronoiSimplexSolver simplexSolver;
- btSubsimplexConvexCast convexCaster(&pointShape,convexShape,&simplexSolver);
- //GjkConvexCast convexCaster(&pointShape,convexShape,&simplexSolver);
- //ContinuousConvexCollision convexCaster(&pointShape,convexShape,&simplexSolver,0);
+ btSubsimplexConvexCast convexCaster(castShape,convexShape,&simplexSolver);
+ //GjkConvexCast convexCaster(castShape,convexShape,&simplexSolver);
+ //ContinuousConvexCollision convexCaster(castShape,convexShape,&simplexSolver,0);
if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,colObjWorldTransform,colObjWorldTransform,castResult))
{
//add hit
- if (castResult.m_normal.length2() > 0.0001f)
+ if (castResult.m_normal.length2() > btScalar(0.0001))
{
castResult.m_normal.normalize();
if (castResult.m_fraction < resultCallback.m_closestHitFraction)
@@ -252,7 +267,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
}
- virtual float reportHit(const btVector3& hitNormalLocal, float hitFraction, int partId, int triangleIndex )
+ virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex )
{
btCollisionWorld::LocalShapeInfo shapeInfo;
shapeInfo.m_shapePart = partId;
@@ -294,11 +309,11 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
btTransform childTrans = compoundShape->getChildTransform(i);
const btCollisionShape* childCollisionShape = compoundShape->getChildShape(i);
btTransform childWorldTrans = colObjWorldTransform * childTrans;
- rayTestSingle(rayFromTrans,rayToTrans,
+ objectQuerySingle(castShape, rayFromTrans,rayToTrans,
collisionObject,
childCollisionShape,
childWorldTrans,
- resultCallback);
+ resultCallback, collisionFilterMask);
}
@@ -308,7 +323,7 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
}
}
-void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback)
+void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback,short int collisionFilterMask)
{
@@ -321,28 +336,26 @@ void btCollisionWorld::rayTest(const btVector3& rayFromWorld, const btVector3& r
/// go over all objects, and if the ray intersects their aabb, do a ray-shape query using convexCaster (CCD)
- std::vector<btCollisionObject*>::iterator iter;
-
- for (iter=m_collisionObjects.begin();
- !(iter==m_collisionObjects.end()); iter++)
+ int i;
+ for (i=0;i<m_collisionObjects.size();i++)
{
-
- btCollisionObject* collisionObject= (*iter);
-
- //RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
- btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
- collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax);
-
- float hitLambda = 1.f; //could use resultCallback.m_closestHitFraction, but needs testing
- btVector3 hitNormal;
- if (btRayAabb(rayFromWorld,rayToWorld,collisionObjectAabbMin,collisionObjectAabbMax,hitLambda,hitNormal))
- {
- rayTestSingle(rayFromTrans,rayToTrans,
- collisionObject,
- collisionObject->getCollisionShape(),
- collisionObject->getWorldTransform(),
- resultCallback);
-
+ btCollisionObject* collisionObject= m_collisionObjects[i];
+ //only perform raycast if filterMask matches
+ if(collisionObject->getBroadphaseHandle()->m_collisionFilterGroup & collisionFilterMask) {
+ //RigidcollisionObject* collisionObject = ctrl->GetRigidcollisionObject();
+ btVector3 collisionObjectAabbMin,collisionObjectAabbMax;
+ collisionObject->getCollisionShape()->getAabb(collisionObject->getWorldTransform(),collisionObjectAabbMin,collisionObjectAabbMax);
+
+ btScalar hitLambda = btScalar(1.); //could use resultCallback.m_closestHitFraction, but needs testing
+ btVector3 hitNormal;
+ if (btRayAabb(rayFromWorld,rayToWorld,collisionObjectAabbMin,collisionObjectAabbMax,hitLambda,hitNormal))
+ {
+ rayTestSingle(rayFromTrans,rayToTrans,
+ collisionObject,
+ collisionObject->getCollisionShape(),
+ collisionObject->getWorldTransform(),
+ resultCallback);
+ }
}
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
index bd09d8c4d5d..b6d80233ab7 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCollisionWorld.h
@@ -53,9 +53,9 @@ subject to the following restrictions:
* 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-2006 Erwin Coumans, some contributions Copyright Gino van den Bergen, Christer Ericson, Simon Hobbs, Ricardo Padrela, F Richter(res), Stephane Redon
+ * Copyright (C) 2005-2007 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, Dave Eberle, Dirk Gregorius, Erin Catto, Dave Eberle, Adam Moravanszky,
- * Pierre Terdiman, Kenny Erleben, Russell Smith, Oliver Strunk, Jan Paul van Waveren.
+ * Pierre Terdiman, Kenny Erleben, Russell Smith, Oliver Strunk, Jan Paul van Waveren, Marten Svanfeldt.
*
*/
@@ -66,16 +66,14 @@ subject to the following restrictions:
class btStackAlloc;
class btCollisionShape;
+class btConvexShape;
class btBroadphaseInterface;
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btTransform.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btTransform.h"
#include "btCollisionObject.h"
#include "btCollisionDispatcher.h" //for definition of btCollisionObjectArray
-#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h"
-
-#include <vector>
-
-
+#include "../BroadphaseCollision/btOverlappingPairCache.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
///CollisionWorld is interface and container for the collision detection
class btCollisionWorld
@@ -84,7 +82,7 @@ class btCollisionWorld
protected:
- std::vector<btCollisionObject*> m_collisionObjects;
+ btAlignedObjectArray<btCollisionObject*> m_collisionObjects;
btDispatcher* m_dispatcher1;
@@ -137,18 +135,18 @@ public:
LocalRayResult(btCollisionObject* collisionObject,
LocalShapeInfo* localShapeInfo,
const btVector3& hitNormalLocal,
- float hitFraction)
+ btScalar hitFraction)
:m_collisionObject(collisionObject),
- m_localShapeInfo(m_localShapeInfo),
+ m_localShapeInfo(localShapeInfo),
m_hitNormalLocal(hitNormalLocal),
m_hitFraction(hitFraction)
{
}
- btCollisionObject* m_collisionObject;
+ btCollisionObject* m_collisionObject;
LocalShapeInfo* m_localShapeInfo;
- const btVector3& m_hitNormalLocal;
- float m_hitFraction;
+ btVector3 m_hitNormalLocal;
+ btScalar m_hitFraction;
};
@@ -158,17 +156,17 @@ public:
virtual ~RayResultCallback()
{
}
- float m_closestHitFraction;
+ btScalar m_closestHitFraction;
bool HasHit()
{
- return (m_closestHitFraction < 1.f);
+ return (m_closestHitFraction < btScalar(1.));
}
RayResultCallback()
- :m_closestHitFraction(1.f)
+ :m_closestHitFraction(btScalar(1.))
{
}
- virtual float AddSingleResult(LocalRayResult& rayResult) = 0;
+ virtual btScalar AddSingleResult(LocalRayResult& rayResult) = 0;
};
struct ClosestRayResultCallback : public RayResultCallback
@@ -187,7 +185,7 @@ public:
btVector3 m_hitPointWorld;
btCollisionObject* m_collisionObject;
- virtual float AddSingleResult(LocalRayResult& rayResult)
+ virtual btScalar AddSingleResult(LocalRayResult& rayResult)
{
//caller already does the filter on the m_closestHitFraction
@@ -211,16 +209,23 @@ public:
/// rayTest performs a raycast 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 returned by the callback.
- void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback);
+ void rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback, short int collisionFilterMask=-1);
/// 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.
/// This allows more customization.
- void rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans,
+ static void rayTestSingle(const btTransform& rayFromTrans,const btTransform& rayToTrans,
+ btCollisionObject* collisionObject,
+ const btCollisionShape* collisionShape,
+ const btTransform& colObjWorldTransform,
+ RayResultCallback& resultCallback, short int collisionFilterMask=-1);
+
+ /// objectQuerySingle performs a collision detection query and calls the resultCallback. It is used internally by rayTest.
+ static void objectQuerySingle(const btConvexShape* castShape, const btTransform& rayFromTrans,const btTransform& rayToTrans,
btCollisionObject* collisionObject,
const btCollisionShape* collisionShape,
const btTransform& colObjWorldTransform,
- RayResultCallback& resultCallback);
+ RayResultCallback& resultCallback, short int collisionFilterMask=-1);
void addCollisionObject(btCollisionObject* collisionObject,short int collisionFilterGroup=1,short int collisionFilterMask=1);
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
index 43887d26a45..92f4c8b28a6 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
@@ -77,9 +77,9 @@ void btCompoundCollisionAlgorithm::processCollision (btCollisionObject* body0,bt
btTransform orgTrans = colObj->getWorldTransform();
btCollisionShape* orgShape = colObj->getCollisionShape();
- btTransform childTrans = compoundShape->getChildTransform(i);
- btTransform newChildWorldTrans = orgTrans*childTrans ;
- colObj->setWorldTransform( newChildWorldTrans );
+ const btTransform& childTrans = compoundShape->getChildTransform(i);
+ //btTransform newChildWorldTrans = orgTrans*childTrans ;
+ colObj->setWorldTransform( orgTrans*childTrans );
//the contactpoint is still projected back using the original inverted worldtrans
colObj->setCollisionShape( childShape );
m_childCollisionAlgorithms[i]->processCollision(colObj,otherObj,dispatchInfo,resultOut);
@@ -89,7 +89,7 @@ void btCompoundCollisionAlgorithm::processCollision (btCollisionObject* body0,bt
}
}
-float btCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
{
btCollisionObject* colObj = m_isSwapped? body1 : body0;
@@ -106,7 +106,7 @@ float btCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* bod
//then use each overlapping node AABB against Tree0
//and vise versa.
- float hitFraction = 1.f;
+ btScalar hitFraction = btScalar(1.);
int numChildren = m_childCollisionAlgorithms.size();
int i;
@@ -119,12 +119,12 @@ float btCompoundCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* bod
btTransform orgTrans = colObj->getWorldTransform();
btCollisionShape* orgShape = colObj->getCollisionShape();
- btTransform childTrans = compoundShape->getChildTransform(i);
- btTransform newChildWorldTrans = orgTrans*childTrans ;
- colObj->setWorldTransform( newChildWorldTrans );
+ const btTransform& childTrans = compoundShape->getChildTransform(i);
+ //btTransform newChildWorldTrans = orgTrans*childTrans ;
+ colObj->setWorldTransform( orgTrans*childTrans );
colObj->setCollisionShape( childShape );
- float frac = m_childCollisionAlgorithms[i]->calculateTimeOfImpact(colObj,otherObj,dispatchInfo,resultOut);
+ btScalar frac = m_childCollisionAlgorithms[i]->calculateTimeOfImpact(colObj,otherObj,dispatchInfo,resultOut);
if (frac<hitFraction)
{
hitFraction = frac;
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h
index fe2d8628656..7091b233b46 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h
@@ -16,21 +16,21 @@ subject to the following restrictions:
#ifndef COMPOUND_COLLISION_ALGORITHM_H
#define COMPOUND_COLLISION_ALGORITHM_H
-#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
-#include "BulletCollision/BroadphaseCollision/btDispatcher.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
+#include "../BroadphaseCollision/btCollisionAlgorithm.h"
+#include "../BroadphaseCollision/btDispatcher.h"
+#include "../BroadphaseCollision/btBroadphaseInterface.h"
-#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
+#include "../NarrowPhaseCollision/btPersistentManifold.h"
class btDispatcher;
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
-#include <vector>
+#include "../BroadphaseCollision/btBroadphaseProxy.h"
#include "btCollisionCreateFunc.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
/// btCompoundCollisionAlgorithm supports collision between CompoundCollisionShapes and other collision shapes
/// Place holder, not fully implemented yet
class btCompoundCollisionAlgorithm : public btCollisionAlgorithm
{
- std::vector<btCollisionAlgorithm*> m_childCollisionAlgorithms;
+ btAlignedObjectArray<btCollisionAlgorithm*> m_childCollisionAlgorithms;
bool m_isSwapped;
public:
@@ -41,7 +41,7 @@ public:
virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
- float calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
struct CreateFunc :public btCollisionAlgorithmCreateFunc
{
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
index 06adb3a04c8..24ceacfd40d 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
m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]),tr(triangle[0]),color);
//btVector3 center = triangle[0] + triangle[1]+triangle[2];
- //center *= 0.333333f;
+ //center *= btScalar(0.333333);
//m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[0]),tr(center),color);
//m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[1]),tr(center),color);
//m_dispatchInfoPtr->m_debugDraw->drawLine(tr(triangle[2]),tr(center),color);
@@ -134,7 +134,7 @@ void btConvexTriangleCallback::processTriangle(btVector3* triangle,int partId, i
-void btConvexTriangleCallback::setTimeStepAndCounters(float collisionMarginTriangle,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btConvexTriangleCallback::setTimeStepAndCounters(btScalar collisionMarginTriangle,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
{
m_dispatchInfoPtr = &dispatchInfo;
m_collisionMarginTriangle = collisionMarginTriangle;
@@ -146,7 +146,7 @@ void btConvexTriangleCallback::setTimeStepAndCounters(float collisionMarginTrian
btCollisionShape* convexShape = static_cast<btCollisionShape*>(m_convexBody->getCollisionShape());
//CollisionShape* triangleShape = static_cast<btCollisionShape*>(triBody->m_collisionShape);
convexShape->getAabb(convexInTriangleSpace,m_aabbMin,m_aabbMax);
- float extraMargin = collisionMarginTriangle;
+ btScalar extraMargin = collisionMarginTriangle;
btVector3 extra(extraMargin,extraMargin,extraMargin);
m_aabbMax += extra;
@@ -176,7 +176,7 @@ void btConvexConcaveCollisionAlgorithm::processCollision (btCollisionObject* bod
if (convexBody->getCollisionShape()->isConvex())
{
- float collisionMarginTriangle = concaveShape->getMargin();
+ btScalar collisionMarginTriangle = concaveShape->getMargin();
resultOut->setPersistentManifold(m_btConvexTriangleCallback.m_manifoldPtr);
m_btConvexTriangleCallback.setTimeStepAndCounters(collisionMarginTriangle,dispatchInfo,resultOut);
@@ -196,9 +196,10 @@ void btConvexConcaveCollisionAlgorithm::processCollision (btCollisionObject* bod
}
-float btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
{
-
+ (void)resultOut;
+ (void)dispatchInfo;
btCollisionObject* convexbody = m_isSwapped ? body1 : body0;
btCollisionObject* triBody = m_isSwapped ? body0 : body1;
@@ -207,10 +208,10 @@ float btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject
//only perform CCD above a certain threshold, this prevents blocking on the long run
//because object in a blocked ccd state (hitfraction<1) get their linear velocity halved each frame...
- float squareMot0 = (convexbody->getInterpolationWorldTransform().getOrigin() - convexbody->getWorldTransform().getOrigin()).length2();
+ btScalar squareMot0 = (convexbody->getInterpolationWorldTransform().getOrigin() - convexbody->getWorldTransform().getOrigin()).length2();
if (squareMot0 < convexbody->getCcdSquareMotionThreshold())
{
- return 1.f;
+ return btScalar(1.);
}
//const btVector3& from = convexbody->m_worldTransform.getOrigin();
@@ -227,11 +228,11 @@ float btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject
btTransform m_ccdSphereToTrans;
btTransform m_meshTransform;
- float m_ccdSphereRadius;
- float m_hitFraction;
+ btScalar m_ccdSphereRadius;
+ btScalar m_hitFraction;
- LocalTriangleSphereCastCallback(const btTransform& from,const btTransform& to,float ccdSphereRadius,float hitFraction)
+ LocalTriangleSphereCastCallback(const btTransform& from,const btTransform& to,btScalar ccdSphereRadius,btScalar hitFraction)
:m_ccdSphereFromTrans(from),
m_ccdSphereToTrans(to),
m_ccdSphereRadius(ccdSphereRadius),
@@ -242,6 +243,8 @@ float btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex)
{
+ (void)partId;
+ (void)triangleIndex;
//do a swept sphere for now
btTransform ident;
ident.setIdentity();
@@ -276,11 +279,11 @@ float btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject
rayAabbMin.setMin(convexToLocal.getOrigin());
btVector3 rayAabbMax = convexFromLocal.getOrigin();
rayAabbMax.setMax(convexToLocal.getOrigin());
- float ccdRadius0 = convexbody->getCcdSweptSphereRadius();
+ btScalar ccdRadius0 = convexbody->getCcdSweptSphereRadius();
rayAabbMin -= btVector3(ccdRadius0,ccdRadius0,ccdRadius0);
rayAabbMax += btVector3(ccdRadius0,ccdRadius0,ccdRadius0);
- float curHitFraction = 1.f; //is this available?
+ btScalar curHitFraction = btScalar(1.); //is this available?
LocalTriangleSphereCastCallback raycastCallback(convexFromLocal,convexToLocal,
convexbody->getCcdSweptSphereRadius(),curHitFraction);
@@ -304,6 +307,6 @@ float btConvexConcaveCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject
}
}
- return 1.f;
+ return btScalar(1.);
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h
index afcb38c94ef..4915b6c20c8 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h
@@ -16,13 +16,13 @@ subject to the following restrictions:
#ifndef CONVEX_CONCAVE_COLLISION_ALGORITHM_H
#define CONVEX_CONCAVE_COLLISION_ALGORITHM_H
-#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
-#include "BulletCollision/BroadphaseCollision/btDispatcher.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h"
-#include "BulletCollision/CollisionShapes/btTriangleCallback.h"
-#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
+#include "../BroadphaseCollision/btCollisionAlgorithm.h"
+#include "../BroadphaseCollision/btDispatcher.h"
+#include "../BroadphaseCollision/btBroadphaseInterface.h"
+#include "../CollisionShapes/btTriangleCallback.h"
+#include "../NarrowPhaseCollision/btPersistentManifold.h"
class btDispatcher;
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h"
#include "btCollisionCreateFunc.h"
///For each triangle in the concave mesh that overlaps with the AABB of a convex (m_convexProxy), processTriangle is called.
@@ -38,7 +38,7 @@ class btConvexTriangleCallback : public btTriangleCallback
btDispatcher* m_dispatcher;
const btDispatcherInfo* m_dispatchInfoPtr;
- float m_collisionMarginTriangle;
+ btScalar m_collisionMarginTriangle;
public:
int m_triangleCount;
@@ -47,7 +47,7 @@ int m_triangleCount;
btConvexTriangleCallback(btDispatcher* dispatcher,btCollisionObject* body0,btCollisionObject* body1,bool isSwapped);
- void setTimeStepAndCounters(float collisionMarginTriangle,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ void setTimeStepAndCounters(btScalar collisionMarginTriangle,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
virtual ~btConvexTriangleCallback();
@@ -86,7 +86,7 @@ public:
virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
- float calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
void clearCache();
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
index 09457aea3e9..9105fe20b49 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
@@ -43,23 +43,9 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h"
-#ifdef WIN32
-#if _MSC_VER >= 1310
-//only use SIMD Hull code under Win32
-#ifdef TEST_HULL
-#define USE_HULL 1
-#endif //TEST_HULL
-#endif //_MSC_VER
-#endif //WIN32
-#ifdef USE_HULL
-#include "NarrowPhaseCollision/Hull.h"
-#include "NarrowPhaseCollision/HullContactCollector.h"
-
-
-#endif //USE_HULL
btConvexConvexAlgorithm::CreateFunc::CreateFunc()
@@ -76,6 +62,14 @@ btConvexConvexAlgorithm::CreateFunc::CreateFunc(btSimplexSolverInterface* simp
m_pdSolver = pdSolver;
}
+btConvexConvexAlgorithm::CreateFunc::~CreateFunc()
+{
+ if (m_ownsSolvers){
+ delete m_simplexSolver;
+ delete m_pdSolver;
+ }
+}
+
btConvexConvexAlgorithm::btConvexConvexAlgorithm(btPersistentManifold* mf,const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* body0,btCollisionObject* body1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver)
: btCollisionAlgorithm(ci),
m_gjkPairDetector(0,0,simplexSolver,pdSolver),
@@ -83,6 +77,9 @@ m_ownManifold (false),
m_manifoldPtr(mf),
m_lowLevelOfDetail(false)
{
+ (void)body0;
+ (void)body1;
+
}
@@ -147,7 +144,7 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
input.m_maximumDistanceSquared*= input.m_maximumDistanceSquared;
input.m_stackAlloc = dispatchInfo.m_stackAllocator;
-// input.m_maximumDistanceSquared = 1e30f;
+// input.m_maximumDistanceSquared = btScalar(1e30);
input.m_transformA = body0->getWorldTransform();
input.m_transformB = body1->getWorldTransform();
@@ -160,24 +157,26 @@ void btConvexConvexAlgorithm ::processCollision (btCollisionObject* body0,btColl
bool disableCcd = false;
-float btConvexConvexAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btConvexConvexAlgorithm::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,
- float resultFraction = 1.f;
+ btScalar resultFraction = btScalar(1.);
- float squareMot0 = (col0->getInterpolationWorldTransform().getOrigin() - col0->getWorldTransform().getOrigin()).length2();
- float squareMot1 = (col1->getInterpolationWorldTransform().getOrigin() - col1->getWorldTransform().getOrigin()).length2();
+ 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;
if (disableCcd)
- return 1.f;
+ return btScalar(1.);
//An adhoc way of testing the Continuous Collision Detection algorithms
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
index ccfe6d5b8cb..cbea9a92b75 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h
@@ -16,11 +16,11 @@ subject to the following restrictions:
#ifndef CONVEX_CONVEX_ALGORITHM_H
#define CONVEX_CONVEX_ALGORITHM_H
-#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
-#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h"
-#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
-#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h"
+#include "../BroadphaseCollision/btCollisionAlgorithm.h"
+#include "../NarrowPhaseCollision/btGjkPairDetector.h"
+#include "../NarrowPhaseCollision/btPersistentManifold.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h"
+#include "../NarrowPhaseCollision/btVoronoiSimplexSolver.h"
#include "btCollisionCreateFunc.h"
class btConvexPenetrationDepthSolver;
@@ -44,7 +44,7 @@ public:
virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
- virtual float calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
void setLowLevelOfDetail(bool useLowLevel);
@@ -62,6 +62,7 @@ public:
CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver);
CreateFunc();
+ virtual ~CreateFunc();
virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
{
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp
index 9bc106564af..936054387c4 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp
@@ -22,14 +22,13 @@ btEmptyAlgorithm::btEmptyAlgorithm(const btCollisionAlgorithmConstructionInfo& c
{
}
-void btEmptyAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+void btEmptyAlgorithm::processCollision (btCollisionObject* ,btCollisionObject* ,const btDispatcherInfo& ,btManifoldResult* )
{
-
}
-float btEmptyAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btEmptyAlgorithm::calculateTimeOfImpact(btCollisionObject* ,btCollisionObject* ,const btDispatcherInfo& ,btManifoldResult* )
{
- return 1.f;
+ return btScalar(1.);
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h
index e0e136250ac..b1a193d2cfd 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h
@@ -15,7 +15,7 @@ subject to the following restrictions:
#ifndef EMPTY_ALGORITH
#define EMPTY_ALGORITH
-#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
+#include "../BroadphaseCollision/btCollisionAlgorithm.h"
#include "btCollisionCreateFunc.h"
#define ATTRIBUTE_ALIGNED(a)
@@ -31,12 +31,14 @@ public:
virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
- virtual float calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
struct CreateFunc :public btCollisionAlgorithmCreateFunc
{
virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1)
{
+ (void)body0;
+ (void)body1;
return new btEmptyAlgorithm(ci);
}
};
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp
index cd22f3dd91e..490acc0b611 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp
@@ -27,7 +27,7 @@ inline btScalar calculateCombinedFriction(const btCollisionObject* body0,const b
{
btScalar friction = body0->getFriction() * body1->getFriction();
- const btScalar MAX_FRICTION = 10.f;
+ const btScalar MAX_FRICTION = btScalar(10.);
if (friction < -MAX_FRICTION)
friction = -MAX_FRICTION;
if (friction > MAX_FRICTION)
@@ -53,7 +53,7 @@ btManifoldResult::btManifoldResult(btCollisionObject* body0,btCollisionObject* b
}
-void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,float depth)
+void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
{
assert(m_manifoldPtr);
//order in manifold needs to match
@@ -63,15 +63,22 @@ void btManifoldResult::addContactPoint(const btVector3& normalOnBInWorld,const b
bool isSwapped = m_manifoldPtr->getBody0() != m_body0;
- btTransform transAInv = isSwapped? m_rootTransB.inverse() : m_rootTransA.inverse();
- btTransform transBInv = isSwapped? m_rootTransA.inverse() : m_rootTransB.inverse();
-
btVector3 pointA = pointInWorld + normalOnBInWorld * depth;
- btVector3 localA = transAInv(pointA );
- btVector3 localB = transBInv(pointInWorld);
- btManifoldPoint newPt(localA,localB,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);
int insertIndex = m_manifoldPtr->getCacheEntry(newPt);
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h
index 3d70689e3eb..77192625513 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btManifoldResult.h
@@ -23,7 +23,7 @@ class btManifoldPoint;
#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h"
-#include "LinearMath/btTransform.h"
+#include "../../LinearMath/btTransform.h"
typedef bool (*ContactAddedCallback)(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1);
extern ContactAddedCallback gContactAddedCallback;
@@ -68,7 +68,7 @@ public:
m_index1=index1;
}
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,float depth);
+ virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth);
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
index 06a5f95143e..ac2e8554c3a 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
@@ -8,8 +8,7 @@
#include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
#include <stdio.h>
-#include <algorithm>
-
+#include "LinearMath/btQuickprof.h"
btSimulationIslandManager::btSimulationIslandManager()
{
@@ -33,7 +32,7 @@ void btSimulationIslandManager::findUnions(btDispatcher* dispatcher)
for (int i=0;i<dispatcher->getNumManifolds();i++)
{
const btPersistentManifold* manifold = dispatcher->getManifoldByIndexInternal(i);
- //static objects (invmass 0.f) don't merge !
+ //static objects (invmass btScalar(0.)) don't merge !
const btCollisionObject* colObj0 = static_cast<const btCollisionObject*>(manifold->getBody0());
const btCollisionObject* colObj1 = static_cast<const btCollisionObject*>(manifold->getBody1());
@@ -57,16 +56,15 @@ void btSimulationIslandManager::updateActivationState(btCollisionWorld* colWorld
// put the index into m_controllers into m_tag
{
- std::vector<btCollisionObject*>::iterator i;
int index = 0;
- for (i=colWorld->getCollisionObjectArray().begin();
- !(i==colWorld->getCollisionObjectArray().end()); i++)
+ int i;
+ for (i=0;i<colWorld->getCollisionObjectArray().size(); i++)
{
-
- btCollisionObject* collisionObject= (*i);
+ btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
collisionObject->setIslandTag(index);
- collisionObject->setHitFraction(1.f);
+ collisionObject->setCompanionId(-1);
+ collisionObject->setHitFraction(btScalar(1.));
index++;
}
@@ -88,20 +86,19 @@ void btSimulationIslandManager::storeIslandActivationState(btCollisionWorld* col
{
- std::vector<btCollisionObject*>::iterator i;
-
int index = 0;
- for (i=colWorld->getCollisionObjectArray().begin();
- !(i==colWorld->getCollisionObjectArray().end()); i++)
+ int i;
+ for (i=0;i<colWorld->getCollisionObjectArray().size();i++)
{
- btCollisionObject* collisionObject= (*i);
-
+ btCollisionObject* collisionObject= colWorld->getCollisionObjectArray()[i];
if (collisionObject->mergesSimulationIslands())
{
collisionObject->setIslandTag( m_unionFind.find(index) );
+ collisionObject->setCompanionId(-1);
} else
{
collisionObject->setIslandTag(-1);
+ collisionObject->setCompanionId(-2);
}
index++;
}
@@ -118,13 +115,21 @@ inline int getIslandId(const btPersistentManifold* lhs)
}
-bool btPersistentManifoldSortPredicate(const btPersistentManifold* lhs, const btPersistentManifold* rhs)
+
+
+/// function object that routes calls to operator<
+class btPersistentManifoldSortPredicate
{
- int rIslandId0,lIslandId0;
- rIslandId0 = getIslandId(rhs);
- lIslandId0 = getIslandId(lhs);
- return lIslandId0 < rIslandId0;
-}
+ public:
+
+ SIMD_FORCE_INLINE bool operator() ( const btPersistentManifold* lhs, const btPersistentManifold* rhs )
+ {
+ return getIslandId(lhs) < getIslandId(rhs);
+ }
+};
+
+
+
//
@@ -132,6 +137,22 @@ bool btPersistentManifoldSortPredicate(const btPersistentManifold* lhs, const bt
//
void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,btCollisionObjectArray& collisionObjects, IslandCallback* callback)
{
+
+
+
+ /*if (0)
+ {
+ int maxNumManifolds = dispatcher->getNumManifolds();
+ btCollisionDispatcher* colDis = (btCollisionDispatcher*)dispatcher;
+ btPersistentManifold** manifold = colDis->getInternalManifoldPointer();
+ callback->ProcessIsland(&collisionObjects[0],collisionObjects.size(),manifold,maxNumManifolds, 0);
+ return;
+ }
+ */
+
+
+ BEGIN_PROFILE("islandUnionFindAndHeapSort");
+
//we are going to sort the unionfind array, and store the element id in the size
//afterwards, we clean unionfind, to make sure no-one uses it anymore
@@ -139,9 +160,11 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
int numElem = getUnionFind().getNumElements();
int endIslandIndex=1;
+ int startIslandIndex;
+
//update the sleeping state for bodies, if all are sleeping
- for (int startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex)
+ for ( startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex)
{
int islandId = getUnionFind().getElement(startIslandIndex).m_id;
for (endIslandIndex = startIslandIndex+1;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++)
@@ -224,7 +247,7 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
}
}
- std::vector<btPersistentManifold*> islandmanifold;
+ btAlignedObjectArray<btPersistentManifold*> islandmanifold;
int i;
int maxNumManifolds = dispatcher->getNumManifolds();
islandmanifold.reserve(maxNumManifolds);
@@ -261,63 +284,74 @@ void btSimulationIslandManager::buildAndProcessIslands(btDispatcher* dispatcher,
// Sort manifolds, based on islands
// Sort the vector using predicate and std::sort
- std::sort(islandmanifold.begin(), islandmanifold.end(), btPersistentManifoldSortPredicate);
+ //std::sort(islandmanifold.begin(), islandmanifold.end(), btPersistentManifoldSortPredicate);
+
+ //we should do radix sort, it it much faster (O(n) instead of O (n log2(n))
+ islandmanifold.heapSort(btPersistentManifoldSortPredicate());
//now process all active islands (sets of manifolds for now)
int startManifoldIndex = 0;
int endManifoldIndex = 1;
- int islandId;
+ //int islandId;
+
+ END_PROFILE("islandUnionFindAndHeapSort");
+
+ btAlignedObjectArray<btCollisionObject*> islandBodies;
- //traverse the simulation islands, and call the solver, unless all objects are sleeping/deactivated
- for (int startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex)
- {
- int islandId = getUnionFind().getElement(startIslandIndex).m_id;
-
-
- bool islandSleeping = false;
+ //traverse the simulation islands, and call the solver, unless all objects are sleeping/deactivated
+ for ( startIslandIndex=0;startIslandIndex<numElem;startIslandIndex = endIslandIndex)
+ {
+ int islandId = getUnionFind().getElement(startIslandIndex).m_id;
+
+
+ bool islandSleeping = false;
for (endIslandIndex = startIslandIndex;(endIslandIndex<numElem) && (getUnionFind().getElement(endIslandIndex).m_id == islandId);endIslandIndex++)
{
int i = getUnionFind().getElement(endIslandIndex).m_sz;
btCollisionObject* colObj0 = collisionObjects[i];
+ islandBodies.push_back(colObj0);
if (!colObj0->isActive())
islandSleeping = true;
}
- //find the accompanying contact manifold for this islandId
- int numIslandManifolds = 0;
- btPersistentManifold** startManifold = 0;
+ //find the accompanying contact manifold for this islandId
+ int numIslandManifolds = 0;
+ btPersistentManifold** startManifold = 0;
- if (startManifoldIndex<numManifolds)
- {
- int curIslandId = getIslandId(islandmanifold[startManifoldIndex]);
- if (curIslandId == islandId)
- {
- startManifold = &islandmanifold[startManifoldIndex];
-
- for (endManifoldIndex = startManifoldIndex+1;(endManifoldIndex<numManifolds) && (islandId == getIslandId(islandmanifold[endManifoldIndex]));endManifoldIndex++)
- {
+ if (startManifoldIndex<numManifolds)
+ {
+ int curIslandId = getIslandId(islandmanifold[startManifoldIndex]);
+ if (curIslandId == islandId)
+ {
+ startManifold = &islandmanifold[startManifoldIndex];
+
+ for (endManifoldIndex = startManifoldIndex+1;(endManifoldIndex<numManifolds) && (islandId == getIslandId(islandmanifold[endManifoldIndex]));endManifoldIndex++)
+ {
- }
- /// Process the actual simulation, only if not sleeping/deactivated
- numIslandManifolds = endManifoldIndex-startManifoldIndex;
- }
+ }
+ /// Process the actual simulation, only if not sleeping/deactivated
+ numIslandManifolds = endManifoldIndex-startManifoldIndex;
+ }
- }
+ }
- if (!islandSleeping)
- {
- callback->ProcessIsland(startManifold,numIslandManifolds, islandId);
- }
+ if (!islandSleeping)
+ {
+ callback->ProcessIsland(&islandBodies[0],islandBodies.size(),startManifold,numIslandManifolds, islandId);
+ }
+
+ if (numIslandManifolds)
+ {
+ startManifoldIndex = endManifoldIndex;
+ }
- if (numIslandManifolds)
- {
- startManifoldIndex = endManifoldIndex;
- }
- }
+ islandBodies.resize(0);
+ }
+
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.h
index 68d9b8038d6..d91ed1c20eb 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.h
@@ -16,9 +16,10 @@ subject to the following restrictions:
#ifndef SIMULATION_ISLAND_MANAGER_H
#define SIMULATION_ISLAND_MANAGER_H
-#include "BulletCollision/CollisionDispatch/btUnionFind.h"
+#include "../CollisionDispatch/btUnionFind.h"
#include "btCollisionCreateFunc.h"
+class btCollisionObject;
class btCollisionWorld;
class btDispatcher;
@@ -49,7 +50,7 @@ public:
{
virtual ~IslandCallback() {};
- virtual void ProcessIsland(class btPersistentManifold** manifolds,int numManifolds, int islandId) = 0;
+ virtual void ProcessIsland(btCollisionObject** bodies,int numBodies,class btPersistentManifold** manifolds,int numManifolds, int islandId) = 0;
};
void buildAndProcessIslands(btDispatcher* dispatcher,btCollisionObjectArray& collisionObjects, IslandCallback* callback);
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp
index 1423c335407..05556bd34e2 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp
@@ -50,6 +50,8 @@ btSphereBoxCollisionAlgorithm::~btSphereBoxCollisionAlgorithm()
void btSphereBoxCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
{
+ (void)dispatchInfo;
+ (void)resultOut;
if (!m_manifoldPtr)
return;
@@ -64,7 +66,7 @@ void btSphereBoxCollisionAlgorithm::processCollision (btCollisionObject* body0,b
btVector3 sphereCenter = sphereObj->getWorldTransform().getOrigin();
btScalar radius = sphere0->getRadius();
- float dist = getSphereDistance(boxObj,pOnBox,pOnSphere,sphereCenter,radius);
+ btScalar dist = getSphereDistance(boxObj,pOnBox,pOnSphere,sphereCenter,radius);
if (dist < SIMD_EPSILON)
{
@@ -81,10 +83,15 @@ void btSphereBoxCollisionAlgorithm::processCollision (btCollisionObject* body0,b
}
-float btSphereBoxCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btSphereBoxCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
{
+ (void)resultOut;
+ (void)dispatchInfo;
+ (void)col0;
+ (void)col1;
+
//not yet
- return 1.f;
+ return btScalar(1.);
}
@@ -117,14 +124,14 @@ btScalar btSphereBoxCollisionAlgorithm::getSphereDistance(btCollisionObject* box
/////////////////////////////////////////////////
btVector3 tmp, prel, n[6], normal, v3P;
- btScalar fSep = 10000000.0f, fSepThis;
+ btScalar fSep = btScalar(10000000.0), fSepThis;
- n[0].setValue( -1.0f, 0.0f, 0.0f );
- n[1].setValue( 0.0f, -1.0f, 0.0f );
- n[2].setValue( 0.0f, 0.0f, -1.0f );
- n[3].setValue( 1.0f, 0.0f, 0.0f );
- n[4].setValue( 0.0f, 1.0f, 0.0f );
- n[5].setValue( 0.0f, 0.0f, 1.0f );
+ n[0].setValue( btScalar(-1.0), btScalar(0.0), btScalar(0.0) );
+ n[1].setValue( btScalar(0.0), btScalar(-1.0), btScalar(0.0) );
+ n[2].setValue( btScalar(0.0), btScalar(0.0), btScalar(-1.0) );
+ n[3].setValue( btScalar(1.0), btScalar(0.0), btScalar(0.0) );
+ n[4].setValue( btScalar(0.0), btScalar(1.0), btScalar(0.0) );
+ n[5].setValue( btScalar(0.0), btScalar(0.0), btScalar(1.0) );
// convert point in local space
prel = m44T.invXform( sphereCenter);
@@ -136,7 +143,7 @@ btScalar btSphereBoxCollisionAlgorithm::getSphereDistance(btCollisionObject* box
for (int i=0;i<6;i++)
{
int j = i<3? 0:1;
- if ( (fSepThis = ((v3P-bounds[j]) .dot(n[i]))) > 0.0f )
+ if ( (fSepThis = ((v3P-bounds[j]) .dot(n[i]))) > btScalar(0.0) )
{
v3P = v3P - n[i]*fSepThis;
bFound = true;
@@ -154,9 +161,9 @@ btScalar btSphereBoxCollisionAlgorithm::getSphereDistance(btCollisionObject* box
pointOnBox = v3P + normal*margins;
v3PointOnSphere = prel - normal*fRadius;
- if ( ((v3PointOnSphere - pointOnBox) .dot (normal)) > 0.0f )
+ if ( ((v3PointOnSphere - pointOnBox) .dot (normal)) > btScalar(0.0) )
{
- return 1.0f;
+ return btScalar(1.0);
}
// transform back in world space
@@ -171,7 +178,7 @@ btScalar btSphereBoxCollisionAlgorithm::getSphereDistance(btCollisionObject* box
{
fSep = - btSqrt(fSeps2);
normal = (pointOnBox-v3PointOnSphere);
- normal *= 1.f/fSep;
+ normal *= btScalar(1.)/fSep;
}
return fSep;
@@ -185,10 +192,10 @@ btScalar btSphereBoxCollisionAlgorithm::getSphereDistance(btCollisionObject* box
bounds[0] = boundsVec[0];
bounds[1] = boundsVec[1];
- if ( fPenetration <= 0.0f )
+ if ( fPenetration <= btScalar(0.0) )
return (fPenetration-margins);
else
- return 1.0f;
+ return btScalar(1.0);
}
btScalar btSphereBoxCollisionAlgorithm::getSpherePenetration( btCollisionObject* boxObj,btVector3& pointOnBox, btVector3& v3PointOnSphere, const btVector3& sphereCenter, btScalar fRadius, const btVector3& aabbMin, const btVector3& aabbMax)
@@ -200,14 +207,14 @@ btScalar btSphereBoxCollisionAlgorithm::getSpherePenetration( btCollisionObject*
bounds[1] = aabbMax;
btVector3 p0, tmp, prel, n[6], normal;
- btScalar fSep = -10000000.0f, fSepThis;
+ btScalar fSep = btScalar(-10000000.0), fSepThis;
- n[0].setValue( -1.0f, 0.0f, 0.0f );
- n[1].setValue( 0.0f, -1.0f, 0.0f );
- n[2].setValue( 0.0f, 0.0f, -1.0f );
- n[3].setValue( 1.0f, 0.0f, 0.0f );
- n[4].setValue( 0.0f, 1.0f, 0.0f );
- n[5].setValue( 0.0f, 0.0f, 1.0f );
+ n[0].setValue( btScalar(-1.0), btScalar(0.0), btScalar(0.0) );
+ n[1].setValue( btScalar(0.0), btScalar(-1.0), btScalar(0.0) );
+ n[2].setValue( btScalar(0.0), btScalar(0.0), btScalar(-1.0) );
+ n[3].setValue( btScalar(1.0), btScalar(0.0), btScalar(0.0) );
+ n[4].setValue( btScalar(0.0), btScalar(1.0), btScalar(0.0) );
+ n[5].setValue( btScalar(0.0), btScalar(0.0), btScalar(1.0) );
const btTransform& m44T = boxObj->getWorldTransform();
@@ -219,7 +226,7 @@ btScalar btSphereBoxCollisionAlgorithm::getSpherePenetration( btCollisionObject*
for (int i=0;i<6;i++)
{
int j = i<3 ? 0:1;
- if ( (fSepThis = ((prel-bounds[j]) .dot( n[i]))-fRadius) > 0.0f ) return 1.0f;
+ if ( (fSepThis = ((prel-bounds[j]) .dot( n[i]))-fRadius) > btScalar(0.0) ) return btScalar(1.0);
if ( fSepThis > fSep )
{
p0 = bounds[j]; normal = (btVector3&)n[i];
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h
index 68915a43e6f..07592909200 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h
@@ -16,11 +16,11 @@ subject to the following restrictions:
#ifndef SPHERE_BOX_COLLISION_ALGORITHM_H
#define SPHERE_BOX_COLLISION_ALGORITHM_H
-#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
-#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
+#include "../BroadphaseCollision/btCollisionAlgorithm.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h"
+#include "../CollisionDispatch/btCollisionCreateFunc.h"
class btPersistentManifold;
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btVector3.h"
/// btSphereBoxCollisionAlgorithm provides sphere-box collision detection.
/// Other features are frame-coherency (persistent data) and collision response.
@@ -38,7 +38,7 @@ public:
virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
- virtual float calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
btScalar getSphereDistance( btCollisionObject* boxObj,btVector3& v3PointOnBox, btVector3& v3PointOnSphere, const btVector3& v3SphereCenter, btScalar fRadius );
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp
index eb05bf974c5..424ff432f84 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp
@@ -41,6 +41,8 @@ btSphereSphereCollisionAlgorithm::~btSphereSphereCollisionAlgorithm()
void btSphereSphereCollisionAlgorithm::processCollision (btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
{
+ (void)dispatchInfo;
+
if (!m_manifoldPtr)
return;
@@ -48,7 +50,7 @@ void btSphereSphereCollisionAlgorithm::processCollision (btCollisionObject* col0
btSphereShape* sphere1 = (btSphereShape*)col1->getCollisionShape();
btVector3 diff = col0->getWorldTransform().getOrigin()- col1->getWorldTransform().getOrigin();
- float len = diff.length();
+ btScalar len = diff.length();
btScalar radius0 = sphere0->getRadius();
btScalar radius1 = sphere1->getRadius();
@@ -71,8 +73,13 @@ void btSphereSphereCollisionAlgorithm::processCollision (btCollisionObject* col0
}
-float btSphereSphereCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btSphereSphereCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
{
+ (void)col0;
+ (void)col1;
+ (void)dispatchInfo;
+ (void)resultOut;
+
//not yet
- return 1.f;
+ return btScalar(1.);
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h
index 8b08d015aec..7a19ff31edf 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h
@@ -16,9 +16,9 @@ subject to the following restrictions:
#ifndef SPHERE_SPHERE_COLLISION_ALGORITHM_H
#define SPHERE_SPHERE_COLLISION_ALGORITHM_H
-#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
-#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
+#include "../BroadphaseCollision/btCollisionAlgorithm.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h"
+#include "../CollisionDispatch/btCollisionCreateFunc.h"
class btPersistentManifold;
/// btSphereSphereCollisionAlgorithm provides sphere-sphere collision detection.
@@ -37,7 +37,7 @@ public:
virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
- virtual float calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
virtual ~btSphereSphereCollisionAlgorithm();
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
index 6f74c488659..b011b707e3f 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
@@ -56,7 +56,7 @@ void btSphereTriangleCollisionAlgorithm::processCollision (btCollisionObject* co
SphereTriangleDetector detector(sphere,triangle);
btDiscreteCollisionDetectorInterface::ClosestPointInput input;
- input.m_maximumDistanceSquared = 1e30f;//todo: tighter bounds
+ input.m_maximumDistanceSquared = btScalar(1e30);//todo: tighter bounds
input.m_transformA = col0->getWorldTransform();
input.m_transformB = col1->getWorldTransform();
@@ -64,8 +64,13 @@ void btSphereTriangleCollisionAlgorithm::processCollision (btCollisionObject* co
}
-float btSphereTriangleCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
+btScalar btSphereTriangleCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* col0,btCollisionObject* col1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut)
{
+ (void)resultOut;
+ (void)dispatchInfo;
+ (void)col0;
+ (void)col1;
+
//not yet
- return 1.f;
+ return btScalar(1.);
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h
index 82e4c5b37f1..57c6e6af619 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h
@@ -16,9 +16,9 @@ subject to the following restrictions:
#ifndef SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
#define SPHERE_TRIANGLE_COLLISION_ALGORITHM_H
-#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
-#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h"
+#include "../BroadphaseCollision/btCollisionAlgorithm.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h"
+#include "../CollisionDispatch/btCollisionCreateFunc.h"
class btPersistentManifold;
/// btSphereSphereCollisionAlgorithm provides sphere-sphere collision detection.
@@ -38,7 +38,7 @@ public:
virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
- virtual float calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
+ virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut);
virtual ~btSphereTriangleCollisionAlgorithm();
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp b/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp
index 046f348a147..62254335796 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.cpp
@@ -15,7 +15,6 @@ subject to the following restrictions:
#include "btUnionFind.h"
#include <assert.h>
-#include <algorithm>
@@ -50,11 +49,16 @@ void btUnionFind::reset(int N)
}
}
-bool btUnionFindElementSortPredicate(const btElement& lhs, const btElement& rhs)
+
+class btUnionFindElementSortPredicate
{
- return lhs.m_id < rhs.m_id;
-}
+ public:
+ bool operator() ( const btElement& lhs, const btElement& rhs )
+ {
+ return lhs.m_id < rhs.m_id;
+ }
+};
///this is a special operation, destroying the content of btUnionFind.
///it sorts the elements, based on island id, in order to make it easy to iterate over islands
@@ -71,7 +75,9 @@ void btUnionFind::sortIslands()
}
// Sort the vector using predicate and std::sort
- std::sort(m_elements.begin(), m_elements.end(), btUnionFindElementSortPredicate);
+ //std::sort(m_elements.begin(), m_elements.end(), btUnionFindElementSortPredicate);
+ //perhaps use radix sort?
+ m_elements.heapSort(btUnionFindElementSortPredicate());
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h b/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h
index b1baca9ff15..236cc33b94f 100644
--- a/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h
+++ b/extern/bullet2/src/BulletCollision/CollisionDispatch/btUnionFind.h
@@ -16,7 +16,10 @@ subject to the following restrictions:
#ifndef UNION_FIND_H
#define UNION_FIND_H
-#include <vector>
+#include "../../LinearMath/btAlignedObjectArray.h"
+
+ #define USE_PATH_COMPRESSION 1
+
struct btElement
{
int m_id;
@@ -29,7 +32,7 @@ struct btElement
class btUnionFind
{
private:
- std::vector<btElement> m_elements;
+ btAlignedObjectArray<btElement> m_elements;
public:
@@ -78,6 +81,7 @@ class btUnionFind
if (i == j)
return;
+#ifndef USE_PATH_COMPRESSION
//weighted quick union, this keeps the 'trees' balanced, and keeps performance of unite O( log(n) )
if (m_elements[i].m_sz < m_elements[j].m_sz)
{
@@ -87,6 +91,9 @@ class btUnionFind
{
m_elements[j].m_id = i; m_elements[i].m_sz += m_elements[j].m_sz;
}
+#else
+ m_elements[i].m_id = j; m_elements[j].m_sz += m_elements[i].m_sz;
+#endif //USE_PATH_COMPRESSION
}
int find(int x)
@@ -97,7 +104,7 @@ class btUnionFind
while (x != m_elements[x].m_id)
{
//not really a reason not to use path compression, and it flattens the trees/improves find performance dramatically
- #define USE_PATH_COMPRESSION 1
+
#ifdef USE_PATH_COMPRESSION
//
m_elements[x].m_id = m_elements[m_elements[x].m_id].m_id;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp
index b5f80de4557..636b0046c13 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.cpp
@@ -42,17 +42,16 @@ void btBoxShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabb
void btBoxShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
{
- //float margin = 0.f;
+ //btScalar margin = btScalar(0.);
btVector3 halfExtents = getHalfExtents();
- btScalar lx=2.f*(halfExtents.x());
- btScalar ly=2.f*(halfExtents.y());
- btScalar lz=2.f*(halfExtents.z());
-
- inertia[0] = mass/(12.0f) * (ly*ly + lz*lz);
- inertia[1] = mass/(12.0f) * (lx*lx + lz*lz);
- inertia[2] = mass/(12.0f) * (lx*lx + ly*ly);
+ 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/btBoxShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h
index ee451a9b6c0..bc42f146c7c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBoxShape.h
@@ -17,10 +17,10 @@ subject to the following restrictions:
#define OBB_BOX_MINKOWSKI_H
#include "btPolyhedralConvexShape.h"
-#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
-#include "LinearMath/btPoint3.h"
-#include "LinearMath/btSimdMinMax.h"
+#include "btCollisionMargin.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h"
+#include "../../LinearMath/btPoint3.h"
+#include "../../LinearMath/btSimdMinMax.h"
///btBoxShape implements both a feature based (vertex/edge/plane) and implicit (getSupportingVertex) Box
class btBoxShape: public btPolyhedralConvexShape
@@ -41,9 +41,9 @@ public:
btVector3 halfExtents = getHalfExtents();
btVector3 supVertex;
- supVertex = btPoint3(vec.x() < btScalar(0.0f) ? -halfExtents.x() : halfExtents.x(),
- vec.y() < btScalar(0.0f) ? -halfExtents.y() : halfExtents.y(),
- vec.z() < btScalar(0.0f) ? -halfExtents.z() : halfExtents.z());
+ supVertex = btPoint3(vec.x() < btScalar(0.0) ? -halfExtents.x() : halfExtents.x(),
+ vec.y() < btScalar(0.0) ? -halfExtents.y() : halfExtents.y(),
+ vec.z() < btScalar(0.0) ? -halfExtents.z() : halfExtents.z());
return supVertex;
}
@@ -54,9 +54,9 @@ public:
btVector3 margin(getMargin(),getMargin(),getMargin());
halfExtents -= margin;
- return btVector3(vec.x() < btScalar(0.0f) ? -halfExtents.x() : halfExtents.x(),
- vec.y() < btScalar(0.0f) ? -halfExtents.y() : halfExtents.y(),
- vec.z() < btScalar(0.0f) ? -halfExtents.z() : halfExtents.z());
+ return btVector3(vec.x() < btScalar(0.0) ? -halfExtents.x() : halfExtents.x(),
+ vec.y() < btScalar(0.0) ? -halfExtents.y() : halfExtents.y(),
+ vec.z() < btScalar(0.0) ? -halfExtents.z() : halfExtents.z());
}
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
@@ -69,9 +69,9 @@ public:
for (int i=0;i<numVectors;i++)
{
const btVector3& vec = vectors[i];
- supportVerticesOut[i].setValue(vec.x() < btScalar(0.0f) ? -halfExtents.x() : halfExtents.x(),
- vec.y() < btScalar(0.0f) ? -halfExtents.y() : halfExtents.y(),
- vec.z() < btScalar(0.0f) ? -halfExtents.z() : halfExtents.z());
+ supportVerticesOut[i].setValue(vec.x() < btScalar(0.0) ? -halfExtents.x() : halfExtents.x(),
+ vec.y() < btScalar(0.0) ? -halfExtents.y() : halfExtents.y(),
+ vec.z() < btScalar(0.0) ? -halfExtents.z() : halfExtents.z());
}
}
@@ -132,27 +132,27 @@ public:
switch (i)
{
case 0:
- plane.setValue(1.f,0.f,0.f);
+ plane.setValue(btScalar(1.),btScalar(0.),btScalar(0.));
plane[3] = -halfExtents.x();
break;
case 1:
- plane.setValue(-1.f,0.f,0.f);
+ plane.setValue(btScalar(-1.),btScalar(0.),btScalar(0.));
plane[3] = -halfExtents.x();
break;
case 2:
- plane.setValue(0.f,1.f,0.f);
+ plane.setValue(btScalar(0.),btScalar(1.),btScalar(0.));
plane[3] = -halfExtents.y();
break;
case 3:
- plane.setValue(0.f,-1.f,0.f);
+ plane.setValue(btScalar(0.),btScalar(-1.),btScalar(0.));
plane[3] = -halfExtents.y();
break;
case 4:
- plane.setValue(0.f,0.f,1.f);
+ plane.setValue(btScalar(0.),btScalar(0.),btScalar(1.));
plane[3] = -halfExtents.z();
break;
case 5:
- plane.setValue(0.f,0.f,-1.f);
+ plane.setValue(btScalar(0.),btScalar(0.),btScalar(-1.));
plane[3] = -halfExtents.z();
break;
default:
@@ -265,22 +265,22 @@ public:
switch (index)
{
case 0:
- penetrationVector.setValue(1.f,0.f,0.f);
+ penetrationVector.setValue(btScalar(1.),btScalar(0.),btScalar(0.));
break;
case 1:
- penetrationVector.setValue(-1.f,0.f,0.f);
+ penetrationVector.setValue(btScalar(-1.),btScalar(0.),btScalar(0.));
break;
case 2:
- penetrationVector.setValue(0.f,1.f,0.f);
+ penetrationVector.setValue(btScalar(0.),btScalar(1.),btScalar(0.));
break;
case 3:
- penetrationVector.setValue(0.f,-1.f,0.f);
+ penetrationVector.setValue(btScalar(0.),btScalar(-1.),btScalar(0.));
break;
case 4:
- penetrationVector.setValue(0.f,0.f,1.f);
+ penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(1.));
break;
case 5:
- penetrationVector.setValue(0.f,0.f,-1.f);
+ penetrationVector.setValue(btScalar(0.),btScalar(0.),btScalar(-1.));
break;
default:
assert(0);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
index 3bd0a317545..8da554ef14d 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
@@ -18,21 +18,53 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h"
#include "BulletCollision/CollisionShapes/btOptimizedBvh.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)
-:btTriangleMeshShape(meshInterface)
+btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression)
+:btTriangleMeshShape(meshInterface),m_useQuantizedAabbCompression(useQuantizedAabbCompression)
{
//construct bvh from meshInterface
#ifndef DISABLE_BVH
m_bvh = new btOptimizedBvh();
- m_bvh->build(meshInterface);
+ btVector3 bvhAabbMin,bvhAabbMax;
+ meshInterface->calculateAabbBruteForce(bvhAabbMin,bvhAabbMax);
+ m_bvh->build(meshInterface,m_useQuantizedAabbCompression,bvhAabbMin,bvhAabbMax);
#endif //DISABLE_BVH
}
+btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression,const btVector3& bvhAabbMin,const btVector3& bvhAabbMax)
+:btTriangleMeshShape(meshInterface),m_useQuantizedAabbCompression(useQuantizedAabbCompression)
+{
+ //construct bvh from meshInterface
+#ifndef DISABLE_BVH
+
+ m_bvh = new btOptimizedBvh();
+ m_bvh->build(meshInterface,m_useQuantizedAabbCompression,bvhAabbMin,bvhAabbMax);
+
+#endif //DISABLE_BVH
+
+}
+
+void btBvhTriangleMeshShape::partialRefitTree(const btVector3& aabbMin,const btVector3& aabbMax)
+{
+ m_bvh->refitPartial( m_meshInterface,aabbMin,aabbMax );
+
+ m_localAabbMin.setMin(aabbMin);
+ m_localAabbMax.setMax(aabbMax);
+}
+
+
+void btBvhTriangleMeshShape::refitTree()
+{
+ m_bvh->refit( m_meshInterface );
+
+ recalcLocalAabb();
+}
+
btBvhTriangleMeshShape::~btBvhTriangleMeshShape()
{
delete m_bvh;
@@ -63,7 +95,7 @@ void btBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,co
{
}
- virtual void processNode(const btOptimizedBvhNode* node)
+ virtual void processNode(int nodeSubPart, int nodeTriangleIndex)
{
const unsigned char *vertexbase;
int numverts;
@@ -84,19 +116,21 @@ void btBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,co
indexstride,
numfaces,
indicestype,
- node->m_subPart);
+ nodeSubPart);
- int* gfxbase = (int*)(indexbase+node->m_triangleIndex*indexstride);
-
+ int* gfxbase = (int*)(indexbase+nodeTriangleIndex*indexstride);
+
const btVector3& meshScaling = m_meshInterface->getScaling();
for (int j=2;j>=0;j--)
{
int graphicsindex = gfxbase[j];
+
+
#ifdef DEBUG_TRIANGLE_MESH
printf("%d ,",graphicsindex);
#endif //DEBUG_TRIANGLE_MESH
- float* graphicsbase = (float*)(vertexbase+graphicsindex*stride);
+ btScalar* graphicsbase = (btScalar*)(vertexbase+graphicsindex*stride);
m_triangle[j] = btVector3(
graphicsbase[0]*meshScaling.getX(),
@@ -107,8 +141,8 @@ void btBvhTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,co
#endif //DEBUG_TRIANGLE_MESH
}
- m_callback->processTriangle(m_triangle,node->m_subPart,node->m_triangleIndex);
- m_meshInterface->unLockReadOnlyVertexBase(node->m_subPart);
+ m_callback->processTriangle(m_triangle,nodeSubPart,nodeTriangleIndex);
+ m_meshInterface->unLockReadOnlyVertexBase(nodeSubPart);
}
};
@@ -130,8 +164,10 @@ void btBvhTriangleMeshShape::setLocalScaling(const btVector3& scaling)
{
btTriangleMeshShape::setLocalScaling(scaling);
delete m_bvh;
+ ///m_localAabbMin/m_localAabbMax is already re-calculated in btTriangleMeshShape. We could just scale aabb, but this needs some more work
m_bvh = new btOptimizedBvh();
- m_bvh->build(m_meshInterface);
//rebuild the bvh...
+ m_bvh->build(m_meshInterface,m_useQuantizedAabbCompression,m_localAabbMin,m_localAabbMax);
+
}
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
index 59a27e8641a..4914d9f959c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h
@@ -16,20 +16,26 @@ subject to the following restrictions:
#ifndef BVH_TRIANGLE_MESH_SHAPE_H
#define BVH_TRIANGLE_MESH_SHAPE_H
-#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h"
-#include "BulletCollision/CollisionShapes/btOptimizedBvh.h"
+#include "btTriangleMeshShape.h"
+#include "btOptimizedBvh.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.
-class btBvhTriangleMeshShape : public btTriangleMeshShape
+ATTRIBUTE_ALIGNED16(class) btBvhTriangleMeshShape : public btTriangleMeshShape
{
btOptimizedBvh* m_bvh;
-
-
+ bool m_useQuantizedAabbCompression;
+ bool m_pad[12];////need padding due to alignment
+
public:
- btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface);
+ btBvhTriangleMeshShape() :btTriangleMeshShape(0) {};
+ btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression);
+
+ ///optionally pass in a larger bvh aabb, used for quantization. This allows for deformations within this aabb
+ btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface, bool useQuantizedAabbCompression,const btVector3& bvhAabbMin,const btVector3& bvhAabbMax);
+
virtual ~btBvhTriangleMeshShape();
@@ -44,6 +50,10 @@ public:
virtual void processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
+ void refitTree();
+
+ ///for a fast incremental refit of parts of the tree. Note: the entire AABB of the tree will become more conservative, it never shrinks
+ void partialRefitTree(const btVector3& aabbMin,const btVector3& aabbMax);
//debugging
virtual char* getName()const {return "BVHTRIANGLEMESH";}
@@ -51,8 +61,15 @@ public:
virtual void setLocalScaling(const btVector3& scaling);
-
-
-};
+ btOptimizedBvh* getOptimizedBvh()
+ {
+ return m_bvh;
+ }
+ bool usesQuantizedAabbCompression() const
+ {
+ return m_useQuantizedAabbCompression;
+ }
+}
+;
#endif //BVH_TRIANGLE_MESH_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp
new file mode 100644
index 00000000000..b7e15172da2
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp
@@ -0,0 +1,146 @@
+/*
+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 "btCapsuleShape.h"
+
+#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
+#include "LinearMath/btQuaternion.h"
+
+btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height)
+{
+ m_implicitShapeDimensions.setValue(radius,0.5f*height,radius);
+}
+
+
+ btVector3 btCapsuleShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
+{
+
+ btVector3 supVec(0,0,0);
+
+ btScalar 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;
+ }
+
+ btVector3 vtx;
+ btScalar newDot;
+
+ btScalar radius = getRadius();
+
+
+ {
+ btVector3 pos(0,getHalfHeight(),0);
+ vtx = pos +vec*m_localScaling*(radius) - vec * getMargin();
+ newDot = vec.dot(vtx);
+ if (newDot > maxDot)
+ {
+ maxDot = newDot;
+ supVec = vtx;
+ }
+ }
+ {
+ btVector3 pos(0,-getHalfHeight(),0);
+ vtx = pos +vec*m_localScaling*(radius) - vec * getMargin();
+ newDot = vec.dot(vtx);
+ if (newDot > maxDot)
+ {
+ maxDot = newDot;
+ supVec = vtx;
+ }
+ }
+
+ return supVec;
+
+}
+
+ void btCapsuleShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
+{
+
+
+ btScalar radius = getRadius();
+
+ for (int j=0;j<numVectors;j++)
+ {
+ btScalar maxDot(btScalar(-1e30));
+ const btVector3& vec = vectors[j];
+
+ btVector3 vtx;
+ btScalar newDot;
+ {
+ btVector3 pos(0,getHalfHeight(),0);
+ vtx = pos +vec*m_localScaling*(radius) - vec * getMargin();
+ newDot = vec.dot(vtx);
+ if (newDot > maxDot)
+ {
+ maxDot = newDot;
+ supportVerticesOut[j] = vtx;
+ }
+ }
+ {
+ btVector3 pos(0,-getHalfHeight(),0);
+ vtx = pos +vec*m_localScaling*(radius) - vec * getMargin();
+ newDot = vec.dot(vtx);
+ if (newDot > maxDot)
+ {
+ maxDot = newDot;
+ supportVerticesOut[j] = vtx;
+ }
+ }
+
+ }
+}
+
+
+void btCapsuleShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
+{
+ //as an approximation, take the inertia of the box that bounds the spheres
+
+ btTransform ident;
+ ident.setIdentity();
+
+
+ btScalar radius = getRadius();
+
+ btVector3 halfExtents(radius,radius+getHalfHeight(),radius);
+
+ btScalar margin = CONVEX_DISTANCE_MARGIN;
+
+ 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);
+
+}
+
+
+
+
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h
new file mode 100644
index 00000000000..27da8adefa5
--- /dev/null
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCapsuleShape.h
@@ -0,0 +1,60 @@
+/*
+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_CAPSULE_SHAPE_H
+#define BT_CAPSULE_SHAPE_H
+
+#include "btConvexShape.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types
+
+
+///btCapsuleShape represents a capsule around the Y axis
+///A more general solution that can represent capsules is the btMultiSphereShape
+class btCapsuleShape : public btConvexShape
+{
+
+public:
+ btCapsuleShape(btScalar radius,btScalar height);
+
+ ///CollisionShape Interface
+ virtual void calculateLocalInertia(btScalar mass,btVector3& inertia);
+
+ /// btConvexShape Interface
+ virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
+
+ virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
+
+ virtual int getShapeType() const { return CAPSULE_SHAPE_PROXYTYPE; }
+
+ virtual char* getName()const
+ {
+ return "CapsuleShape";
+ }
+
+ btScalar getRadius() const
+ {
+ return m_implicitShapeDimensions.getX();
+ }
+
+ btScalar getHalfHeight() const
+ {
+ return m_implicitShapeDimensions.getY();
+ }
+
+};
+
+
+
+#endif //BT_CAPSULE_SHAPE_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h
index 377f0e506a2..4730264d3df 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionMargin.h
@@ -18,7 +18,7 @@ subject to the following restrictions:
//used by Gjk and some other algorithms
-#define CONVEX_DISTANCE_MARGIN 0.04f// 0.1f//;//0.01f
+#define CONVEX_DISTANCE_MARGIN btScalar(0.04)// btScalar(0.1)//;//btScalar(0.01)
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp
index 5474a201c37..81d82428f4c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.cpp
@@ -15,6 +15,16 @@ subject to the following restrictions:
#include "BulletCollision/CollisionShapes/btCollisionShape.h"
+
+/*
+ Make sure this dummy function never changes so that it
+ can be used by probes that are checking whether the
+ library is actually installed.
+*/
+extern "C" void btBulletCollisionProbe () {}
+
+
+
void btCollisionShape::getBoundingSphere(btVector3& center,btScalar& radius) const
{
btTransform tr;
@@ -23,14 +33,14 @@ void btCollisionShape::getBoundingSphere(btVector3& center,btScalar& radius) con
getAabb(tr,aabbMin,aabbMax);
- radius = (aabbMax-aabbMin).length()*0.5f;
- center = (aabbMin+aabbMax)*0.5f;
+ radius = (aabbMax-aabbMin).length()*btScalar(0.5);
+ center = (aabbMin+aabbMax)*btScalar(0.5);
}
-float btCollisionShape::getAngularMotionDisc() const
+btScalar btCollisionShape::getAngularMotionDisc() const
{
btVector3 center;
- float disc;
+ btScalar disc;
getBoundingSphere(center,disc);
disc += (center).length();
return disc;
@@ -41,25 +51,25 @@ void btCollisionShape::calculateTemporalAabb(const btTransform& curTrans,const b
//start with static aabb
getAabb(curTrans,temporalAabbMin,temporalAabbMax);
- float temporalAabbMaxx = temporalAabbMax.getX();
- float temporalAabbMaxy = temporalAabbMax.getY();
- float temporalAabbMaxz = temporalAabbMax.getZ();
- float temporalAabbMinx = temporalAabbMin.getX();
- float temporalAabbMiny = temporalAabbMin.getY();
- float temporalAabbMinz = temporalAabbMin.getZ();
+ btScalar temporalAabbMaxx = temporalAabbMax.getX();
+ btScalar temporalAabbMaxy = temporalAabbMax.getY();
+ btScalar temporalAabbMaxz = temporalAabbMax.getZ();
+ btScalar temporalAabbMinx = temporalAabbMin.getX();
+ btScalar temporalAabbMiny = temporalAabbMin.getY();
+ btScalar temporalAabbMinz = temporalAabbMin.getZ();
// add linear motion
btVector3 linMotion = linvel*timeStep;
//todo: simd would have a vector max/min operation, instead of per-element access
- if (linMotion.x() > 0.f)
+ if (linMotion.x() > btScalar(0.))
temporalAabbMaxx += linMotion.x();
else
temporalAabbMinx += linMotion.x();
- if (linMotion.y() > 0.f)
+ if (linMotion.y() > btScalar(0.))
temporalAabbMaxy += linMotion.y();
else
temporalAabbMiny += linMotion.y();
- if (linMotion.z() > 0.f)
+ if (linMotion.z() > btScalar(0.))
temporalAabbMaxz += linMotion.z();
else
temporalAabbMinz += linMotion.z();
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h
index 7b2a00a1c57..96268734a83 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCollisionShape.h
@@ -16,18 +16,18 @@ subject to the following restrictions:
#ifndef COLLISION_SHAPE_H
#define COLLISION_SHAPE_H
-#include "LinearMath/btTransform.h"
-#include "LinearMath/btVector3.h"
-#include <LinearMath/btMatrix3x3.h>
-#include "LinearMath/btPoint3.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" //for the shape types
+#include "../../LinearMath/btTransform.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btMatrix3x3.h"
+#include "../../LinearMath/btPoint3.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h" //for the shape types
///btCollisionShape provides interface for collision shapes that can be shared among btCollisionObjects.
class btCollisionShape
{
public:
- btCollisionShape() :m_tempDebug(0)
+ btCollisionShape()
{
}
virtual ~btCollisionShape()
@@ -40,14 +40,15 @@ public:
virtual void getBoundingSphere(btVector3& center,btScalar& radius) const;
///getAngularMotionDisc returns the maximus radius needed for Conservative Advancement to handle time-of-impact with rotations.
- virtual float getAngularMotionDisc() const;
+ virtual btScalar getAngularMotionDisc() const;
- virtual int getShapeType() const=0;
///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);
+#ifndef __SPU__
+
inline bool isPolyhedral() const
{
return btBroadphaseProxy::isPolyhedral(getShapeType());
@@ -72,20 +73,20 @@ public:
return btBroadphaseProxy::isInfinite(getShapeType());
}
+ virtual int getShapeType() const=0;
virtual void setLocalScaling(const btVector3& scaling) =0;
virtual const btVector3& getLocalScaling() const =0;
-
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) = 0;
+
//debugging support
virtual char* getName()const =0 ;
- const char* getExtraDebugInfo() const { return m_tempDebug;}
- void setExtraDebugInfo(const char* extraDebugInfo) { m_tempDebug = extraDebugInfo;}
- const char * m_tempDebug;
-//endif debugging support
+#endif //__SPU__
+
+
- virtual void setMargin(float margin) = 0;
- virtual float getMargin() const = 0;
+ virtual void setMargin(btScalar margin) = 0;
+ virtual btScalar getMargin() const = 0;
};
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp
index 88ae8c7dfd4..a4712b3e925 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.cpp
@@ -20,11 +20,11 @@ subject to the following restrictions:
btCompoundShape::btCompoundShape()
-:m_localAabbMin(1e30f,1e30f,1e30f),
-m_localAabbMax(-1e30f,-1e30f,-1e30f),
+:m_localAabbMin(btScalar(1e30),btScalar(1e30),btScalar(1e30)),
+m_localAabbMax(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30)),
m_aabbTree(0),
-m_collisionMargin(0.f),
-m_localScaling(1.f,1.f,1.f)
+m_collisionMargin(btScalar(0.)),
+m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.))
{
}
@@ -60,8 +60,8 @@ void btCompoundShape::addChildShape(const btTransform& localTransform,btCollisio
///getAabb's default implementation is brute force, expected derived classes to implement a fast dedicated version
void btCompoundShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
{
- btVector3 localHalfExtents = 0.5f*(m_localAabbMax-m_localAabbMin);
- btVector3 localCenter = 0.5f*(m_localAabbMax+m_localAabbMin);
+ btVector3 localHalfExtents = btScalar(0.5)*(m_localAabbMax-m_localAabbMin);
+ btVector3 localCenter = btScalar(0.5)*(m_localAabbMax+m_localAabbMin);
btMatrix3x3 abs_b = trans.getBasis().absolute();
@@ -84,15 +84,15 @@ void btCompoundShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
btVector3 aabbMin,aabbMax;
getAabb(ident,aabbMin,aabbMax);
- btVector3 halfExtents = (aabbMax-aabbMin)*0.5f;
+ btVector3 halfExtents = (aabbMax-aabbMin)*btScalar(0.5);
- btScalar lx=2.f*(halfExtents.x());
- btScalar ly=2.f*(halfExtents.y());
- btScalar lz=2.f*(halfExtents.z());
+ btScalar lx=btScalar(2.)*(halfExtents.x());
+ btScalar ly=btScalar(2.)*(halfExtents.y());
+ btScalar lz=btScalar(2.)*(halfExtents.z());
- inertia[0] = mass/(12.0f) * (ly*ly + lz*lz);
- inertia[1] = mass/(12.0f) * (lx*lx + lz*lz);
- inertia[2] = mass/(12.0f) * (lx*lx + ly*ly);
+ inertia[0] = mass/(btScalar(12.0)) * (ly*ly + lz*lz);
+ inertia[1] = mass/(btScalar(12.0)) * (lx*lx + lz*lz);
+ inertia[2] = mass/(btScalar(12.0)) * (lx*lx + ly*ly);
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h
index 84188bc8b76..86dc1f80947 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCompoundShape.h
@@ -18,12 +18,11 @@ subject to the following restrictions:
#include "btCollisionShape.h"
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btTransform.h"
-#include "LinearMath/btMatrix3x3.h"
-#include <vector>
-#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
-#include "LinearMath/btAlignedObjectArray.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btTransform.h"
+#include "../../LinearMath/btMatrix3x3.h"
+#include "btCollisionMargin.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
class btOptimizedBvh;
@@ -59,11 +58,11 @@ public:
return m_childShapes[index];
}
- btTransform getChildTransform(int index)
+ btTransform& getChildTransform(int index)
{
return m_childTransforms[index];
}
- const btTransform getChildTransform(int index) const
+ const btTransform& getChildTransform(int index) const
{
return m_childTransforms[index];
}
@@ -85,11 +84,11 @@ public:
virtual int getShapeType() const { return COMPOUND_SHAPE_PROXYTYPE;}
- virtual void setMargin(float margin)
+ virtual void setMargin(btScalar margin)
{
m_collisionMargin = margin;
}
- virtual float getMargin() const
+ virtual btScalar getMargin() const
{
return m_collisionMargin;
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp
index 7cd35a91860..5103500a012 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.cpp
@@ -17,7 +17,7 @@ subject to the following restrictions:
#include "btConcaveShape.h"
-btConcaveShape::btConcaveShape() : m_collisionMargin(0.f)
+btConcaveShape::btConcaveShape() : m_collisionMargin(btScalar(0.))
{
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h
index 2bbba88bc44..73f974e4ee9 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConcaveShape.h
@@ -16,9 +16,8 @@ subject to the following restrictions:
#ifndef CONCAVE_SHAPE_H
#define CONCAVE_SHAPE_H
-#include "BulletCollision/CollisionShapes/btCollisionShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
-
+#include "btCollisionShape.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types
#include "btTriangleCallback.h"
@@ -27,7 +26,7 @@ subject to the following restrictions:
class btConcaveShape : public btCollisionShape
{
protected:
- float m_collisionMargin;
+ btScalar m_collisionMargin;
public:
btConcaveShape();
@@ -36,10 +35,10 @@ public:
virtual void processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const = 0;
- virtual float getMargin() const {
+ virtual btScalar getMargin() const {
return m_collisionMargin;
}
- virtual void setMargin(float collisionMargin)
+ virtual void setMargin(btScalar collisionMargin)
{
m_collisionMargin = collisionMargin;
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp
index 46232b3187c..207b3024bc3 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.cpp
@@ -24,7 +24,7 @@ m_height(height)
{
setConeUpIndex(1);
btVector3 halfExtents;
- m_sinAngle = (m_radius / sqrt(m_radius * m_radius + m_height * m_height));
+ m_sinAngle = (m_radius / btSqrt(m_radius * m_radius + m_height * m_height));
}
btConeShapeZ::btConeShapeZ (btScalar radius,btScalar height):
@@ -67,15 +67,15 @@ void btConeShape::setConeUpIndex(int upIndex)
btVector3 btConeShape::coneLocalSupport(const btVector3& v) const
{
- float halfHeight = m_height * 0.5f;
+ btScalar halfHeight = m_height * btScalar(0.5);
if (v[m_coneIndices[1]] > v.length() * m_sinAngle)
{
btVector3 tmp;
- tmp[m_coneIndices[0]] = 0.f;
+ tmp[m_coneIndices[0]] = btScalar(0.);
tmp[m_coneIndices[1]] = halfHeight;
- tmp[m_coneIndices[2]] = 0.f;
+ tmp[m_coneIndices[2]] = btScalar(0.);
return tmp;
}
else {
@@ -90,9 +90,9 @@ btVector3 btConeShape::coneLocalSupport(const btVector3& v) const
}
else {
btVector3 tmp;
- tmp[m_coneIndices[0]] = 0.f;
+ tmp[m_coneIndices[0]] = btScalar(0.);
tmp[m_coneIndices[1]] = -halfHeight;
- tmp[m_coneIndices[2]] = 0.f;
+ tmp[m_coneIndices[2]] = btScalar(0.);
return tmp;
}
}
@@ -117,12 +117,12 @@ void btConeShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVect
btVector3 btConeShape::localGetSupportingVertex(const btVector3& vec) const
{
btVector3 supVertex = coneLocalSupport(vec);
- if ( getMargin()!=0.f )
+ if ( getMargin()!=btScalar(0.) )
{
btVector3 vecnorm = vec;
if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
{
- vecnorm.setValue(-1.f,-1.f,-1.f);
+ vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
}
vecnorm.normalize();
supVertex+= getMargin() * vecnorm;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h
index 52d925fe714..3ccda5b12c6 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConeShape.h
@@ -17,16 +17,16 @@ subject to the following restrictions:
#define CONE_MINKOWSKI_H
#include "btConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types
///btConeShape implements a Cone shape, around the Y axis
class btConeShape : public btConvexShape
{
- float m_sinAngle;
- float m_radius;
- float m_height;
+ btScalar m_sinAngle;
+ btScalar m_radius;
+ btScalar m_height;
int m_coneIndices[3];
btVector3 coneLocalSupport(const btVector3& v) const;
@@ -38,8 +38,8 @@ public:
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const;
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
- float getRadius() const { return m_radius;}
- float getHeight() const { return m_height;}
+ btScalar getRadius() const { return m_radius;}
+ btScalar getHeight() const { return m_height;}
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia)
@@ -49,17 +49,17 @@ public:
btVector3 aabbMin,aabbMax;
getAabb(identity,aabbMin,aabbMax);
- btVector3 halfExtents = (aabbMax-aabbMin)*0.5f;
+ btVector3 halfExtents = (aabbMax-aabbMin)*btScalar(0.5);
- float margin = getMargin();
+ btScalar margin = getMargin();
- btScalar lx=2.f*(halfExtents.x()+margin);
- btScalar ly=2.f*(halfExtents.y()+margin);
- btScalar lz=2.f*(halfExtents.z()+margin);
+ btScalar lx=btScalar(2.)*(halfExtents.x()+margin);
+ btScalar ly=btScalar(2.)*(halfExtents.y()+margin);
+ btScalar lz=btScalar(2.)*(halfExtents.z()+margin);
const btScalar x2 = lx*lx;
const btScalar y2 = ly*ly;
const btScalar z2 = lz*lz;
- const btScalar scaledmass = mass * 0.08333333f;
+ const btScalar scaledmass = mass * btScalar(0.08333333);
inertia = scaledmass * (btVector3(y2+z2,x2+z2,x2+y2));
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
index 5af6e5f03d9..deb3954b5c3 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
@@ -19,7 +19,7 @@ subject to the following restrictions:
-btConvexHullShape ::btConvexHullShape (const float* points,int numPoints,int stride)
+btConvexHullShape ::btConvexHullShape (const btScalar* points,int numPoints,int stride)
{
m_points.resize(numPoints);
@@ -30,26 +30,37 @@ btConvexHullShape ::btConvexHullShape (const float* points,int numPoints,int str
btPoint3* point = (btPoint3*)(pointsBaseAddress + i*stride);
m_points[i] = point[0];
}
+
+ recalcLocalAabb();
+
+}
+
+
+void btConvexHullShape::addPoint(const btPoint3& point)
+{
+ m_points.push_back(point);
+ recalcLocalAabb();
+
}
btVector3 btConvexHullShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
{
- btVector3 supVec(0.f,0.f,0.f);
- btScalar newDot,maxDot = -1e30f;
+ btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
+ btScalar newDot,maxDot = btScalar(-1e30);
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
- if (lenSqr < 0.0001f)
+ if (lenSqr < btScalar(0.0001))
{
vec.setValue(1,0,0);
} else
{
- float rlen = 1.f / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
vec *= rlen;
}
- for (size_t i=0;i<m_points.size();i++)
+ for (int i=0;i<m_points.size();i++)
{
btPoint3 vtx = m_points[i] * m_localScaling;
@@ -70,10 +81,10 @@ void btConvexHullShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const
{
for (int i=0;i<numVectors;i++)
{
- supportVerticesOut[i][3] = -1e30f;
+ supportVerticesOut[i][3] = btScalar(-1e30);
}
}
- for (size_t i=0;i<m_points.size();i++)
+ for (int i=0;i<m_points.size();i++)
{
btPoint3 vtx = m_points[i] * m_localScaling;
@@ -101,12 +112,12 @@ btVector3 btConvexHullShape::localGetSupportingVertex(const btVector3& vec)const
{
btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
- if ( getMargin()!=0.f )
+ if ( getMargin()!=btScalar(0.) )
{
btVector3 vecnorm = vec;
if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
{
- vecnorm.setValue(-1.f,-1.f,-1.f);
+ vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
}
vecnorm.normalize();
supVertex+= getMargin() * vecnorm;
@@ -153,13 +164,14 @@ int btConvexHullShape::getNumPlanes() const
return 0;
}
-void btConvexHullShape::getPlane(btVector3& planeNormal,btPoint3& planeSupport,int i ) const
+void btConvexHullShape::getPlane(btVector3& ,btPoint3& ,int ) const
{
- assert(0);
+
+ btAssert(0);
}
//not yet
-bool btConvexHullShape::isInside(const btPoint3& pt,btScalar tolerance) const
+bool btConvexHullShape::isInside(const btPoint3& ,btScalar ) const
{
assert(0);
return false;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h
index beea0e63201..3fd5e382525 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h
@@ -17,29 +17,37 @@ subject to the following restrictions:
#define CONVEX_HULL_SHAPE_H
#include "btPolyhedralConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
-
-
-#include "LinearMath/btAlignedObjectArray.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#include "../../LinearMath/btAlignedObjectArray.h"
///ConvexHullShape implements an implicit (getSupportingVertex) Convex Hull of a Point Cloud (vertices)
///No connectivity is needed. localGetSupportingVertex iterates linearly though all vertices.
///on modern hardware, due to cache coherency this isn't that bad. Complex algorithms tend to trash the cash.
///(memory is much slower then the cpu)
-class btConvexHullShape : public btPolyhedralConvexShape
+ATTRIBUTE_ALIGNED16(class) btConvexHullShape : public btPolyhedralConvexShape
{
btAlignedObjectArray<btPoint3> m_points;
public:
- ///this constructor optionally takes in a pointer to points. Each point is assumed to be 3 consecutive float (x,y,z), the striding defines the number of bytes between each point, in memory.
+
+
+ ///this constructor optionally takes in a pointer to points. Each point is assumed to be 3 consecutive btScalar (x,y,z), the striding defines the number of bytes between each point, in memory.
///It is easier to not pass any points in the constructor, and just add one point at a time, using addPoint.
///btConvexHullShape make an internal copy of the points.
- btConvexHullShape(const float* points=0,int numPoints=0, int stride=sizeof(btPoint3));
+ btConvexHullShape(const btScalar* points=0,int numPoints=0, int stride=sizeof(btPoint3));
+
+ void addPoint(const btPoint3& point);
- void addPoint(const btPoint3& point)
+ btPoint3* getPoints()
{
- m_points.push_back(point);
+ return &m_points[0];
}
+
+ int getNumPoints()
+ {
+ return m_points.size();
+ }
+
virtual btVector3 localGetSupportingVertex(const btVector3& vec)const;
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp
index 9537235ff8a..7edf1ea6db8 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.cpp
@@ -15,8 +15,9 @@ subject to the following restrictions:
#include "btConvexShape.h"
+
btConvexShape::btConvexShape()
-: m_localScaling(1.f,1.f,1.f),
+: m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)),
m_collisionMargin(CONVEX_DISTANCE_MARGIN)
{
}
@@ -35,35 +36,42 @@ void btConvexShape::getAabbSlow(const btTransform& trans,btVector3&minAabb,btVec
btScalar margin = getMargin();
for (int i=0;i<3;i++)
{
- btVector3 vec(0.f,0.f,0.f);
- vec[i] = 1.f;
+ btVector3 vec(btScalar(0.),btScalar(0.),btScalar(0.));
+ vec[i] = btScalar(1.);
btVector3 sv = localGetSupportingVertex(vec*trans.getBasis());
btVector3 tmp = trans(sv);
maxAabb[i] = tmp[i]+margin;
- vec[i] = -1.f;
+ vec[i] = btScalar(-1.);
tmp = trans(localGetSupportingVertex(vec*trans.getBasis()));
minAabb[i] = tmp[i]-margin;
}
};
+
btVector3 btConvexShape::localGetSupportingVertex(const btVector3& vec)const
- {
+{
+#ifndef __SPU__
+
btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
- if ( getMargin()!=0.f )
+ if ( getMargin()!=btScalar(0.) )
{
btVector3 vecnorm = vec;
if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
{
- vecnorm.setValue(-1.f,-1.f,-1.f);
+ vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
}
vecnorm.normalize();
supVertex+= getMargin() * vecnorm;
}
return supVertex;
+#else
+ return btVector3(0,0,0);
+#endif //__SPU__
+
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h
index 0de334b3521..746f383dfc7 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexShape.h
@@ -18,11 +18,10 @@ subject to the following restrictions:
#include "btCollisionShape.h"
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btTransform.h"
-#include "LinearMath/btMatrix3x3.h"
-#include <vector>
-#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btTransform.h"
+#include "../../LinearMath/btMatrix3x3.h"
+#include "btCollisionMargin.h"
//todo: get rid of this btConvexCastResult thing!
struct btConvexCastResult;
@@ -31,9 +30,9 @@ struct btConvexCastResult;
/// btConvexShape is an abstract shape interface.
/// The explicit part provides plane-equations, the implicit part provides GetClosestPoint interface.
/// used in combination with GJK or btConvexCast
-class btConvexShape : public btCollisionShape
+ATTRIBUTE_ALIGNED16(class) btConvexShape : public btCollisionShape
{
-
+
protected:
//local scaling. collisionMargin is not scaled !
@@ -43,14 +42,27 @@ protected:
btScalar m_collisionMargin;
+ btScalar m_padding[2];
+
+
+
+
public:
btConvexShape();
+ virtual ~btConvexShape()
+ {
+
+ }
+
+
virtual btVector3 localGetSupportingVertex(const btVector3& vec)const;
+#ifndef __SPU__
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec) const= 0;
//notice that the vectors should be unit length
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const= 0;
+#endif //#ifndef __SPU__
const btVector3& getImplicitShapeDimensions() const
{
@@ -74,12 +86,21 @@ public:
return m_localScaling;
}
+ const btVector3& getLocalScalingNV() const
+ {
+ return m_localScaling;
+ }
- virtual void setMargin(float margin)
+ virtual void setMargin(btScalar margin)
{
m_collisionMargin = margin;
}
- virtual float getMargin() const
+ virtual btScalar getMargin() const
+ {
+ return m_collisionMargin;
+ }
+
+ btScalar getMarginNV() const
{
return m_collisionMargin;
}
@@ -91,12 +112,15 @@ public:
virtual void getPreferredPenetrationDirection(int index, btVector3& penetrationVector) const
{
- assert(0);
+ (void)penetrationVector;
+ (void)index;
+ btAssert(0);
}
-};
+}
+;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
index 9d8e7e1408e..614ec977793 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
@@ -22,6 +22,7 @@ subject to the following restrictions:
btConvexTriangleMeshShape ::btConvexTriangleMeshShape (btStridingMeshInterface* meshInterface)
:m_stridingMesh(meshInterface)
{
+ recalcLocalAabb();
}
@@ -39,14 +40,17 @@ public:
btVector3 m_supportVecLocal;
LocalSupportVertexCallback(const btVector3& supportVecLocal)
- : m_supportVertexLocal(0.f,0.f,0.f),
- m_maxDot(-1e30f),
+ : m_supportVertexLocal(btScalar(0.),btScalar(0.),btScalar(0.)),
+ m_maxDot(btScalar(-1e30)),
m_supportVecLocal(supportVecLocal)
{
}
virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
{
+ (void)triangleIndex;
+ (void)partId;
+
for (int i=0;i<3;i++)
{
btScalar dot = m_supportVecLocal.dot(triangle[i]);
@@ -71,21 +75,21 @@ public:
btVector3 btConvexTriangleMeshShape::localGetSupportingVertexWithoutMargin(const btVector3& vec0)const
{
- btVector3 supVec(0.f,0.f,0.f);
+ btVector3 supVec(btScalar(0.),btScalar(0.),btScalar(0.));
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
- if (lenSqr < 0.0001f)
+ if (lenSqr < btScalar(0.0001))
{
vec.setValue(1,0,0);
} else
{
- float rlen = 1.f / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
vec *= rlen;
}
LocalSupportVertexCallback supportCallback(vec);
- btVector3 aabbMax(1e30f,1e30f,1e30f);
+ btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
m_stridingMesh->InternalProcessAllTriangles(&supportCallback,-aabbMax,aabbMax);
supVec = supportCallback.GetSupportVertexLocal();
@@ -98,7 +102,7 @@ void btConvexTriangleMeshShape::batchedUnitVectorGetSupportingVertexWithoutMargi
{
for (int i=0;i<numVectors;i++)
{
- supportVerticesOut[i][3] = -1e30f;
+ supportVerticesOut[i][3] = btScalar(-1e30);
}
}
@@ -109,7 +113,7 @@ void btConvexTriangleMeshShape::batchedUnitVectorGetSupportingVertexWithoutMargi
{
const btVector3& vec = vectors[j];
LocalSupportVertexCallback supportCallback(vec);
- btVector3 aabbMax(1e30f,1e30f,1e30f);
+ btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
m_stridingMesh->InternalProcessAllTriangles(&supportCallback,-aabbMax,aabbMax);
supportVerticesOut[j] = supportCallback.GetSupportVertexLocal();
}
@@ -122,12 +126,12 @@ btVector3 btConvexTriangleMeshShape::localGetSupportingVertex(const btVector3& v
{
btVector3 supVertex = localGetSupportingVertexWithoutMargin(vec);
- if ( getMargin()!=0.f )
+ if ( getMargin()!=btScalar(0.) )
{
btVector3 vecnorm = vec;
if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
{
- vecnorm.setValue(-1.f,-1.f,-1.f);
+ vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
}
vecnorm.normalize();
supVertex+= getMargin() * vecnorm;
@@ -157,14 +161,14 @@ int btConvexTriangleMeshShape::getNumEdges() const
return 0;
}
-void btConvexTriangleMeshShape::getEdge(int i,btPoint3& pa,btPoint3& pb) const
+void btConvexTriangleMeshShape::getEdge(int ,btPoint3& ,btPoint3& ) const
{
- assert(0);
+ btAssert(0);
}
-void btConvexTriangleMeshShape::getVertex(int i,btPoint3& vtx) const
+void btConvexTriangleMeshShape::getVertex(int ,btPoint3& ) const
{
- assert(0);
+ btAssert(0);
}
int btConvexTriangleMeshShape::getNumPlanes() const
@@ -172,15 +176,15 @@ int btConvexTriangleMeshShape::getNumPlanes() const
return 0;
}
-void btConvexTriangleMeshShape::getPlane(btVector3& planeNormal,btPoint3& planeSupport,int i ) const
+void btConvexTriangleMeshShape::getPlane(btVector3& ,btPoint3& ,int ) const
{
- assert(0);
+ btAssert(0);
}
//not yet
-bool btConvexTriangleMeshShape::isInside(const btPoint3& pt,btScalar tolerance) const
+bool btConvexTriangleMeshShape::isInside(const btPoint3& ,btScalar ) const
{
- assert(0);
+ btAssert(0);
return false;
}
@@ -189,5 +193,13 @@ bool btConvexTriangleMeshShape::isInside(const btPoint3& pt,btScalar tolerance)
void btConvexTriangleMeshShape::setLocalScaling(const btVector3& scaling)
{
m_stridingMesh->setScaling(scaling);
+
+ recalcLocalAabb();
+
}
+
+const btVector3& btConvexTriangleMeshShape::getLocalScaling() const
+{
+ return m_stridingMesh->getScaling();
+} \ No newline at end of file
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
index 86e871c6c0b..34ee7af744c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h
@@ -3,9 +3,8 @@
#include "btPolyhedralConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types
-#include <vector>
/// btConvexTriangleMeshShape is a convex hull of a triangle mesh. If you just have a point cloud, you can use btConvexHullShape instead.
/// It uses the btStridingMeshInterface instead of a point cloud. This can avoid the duplication of the triangle mesh data.
@@ -40,7 +39,8 @@ public:
virtual bool isInside(const btPoint3& pt,btScalar tolerance) const;
- void setLocalScaling(const btVector3& scaling);
+ virtual void setLocalScaling(const btVector3& scaling);
+ virtual const btVector3& getLocalScaling() const;
};
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp
index 16b263474f0..1666afb3b88 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.cpp
@@ -16,23 +16,33 @@ subject to the following restrictions:
#include "LinearMath/btPoint3.h"
btCylinderShape::btCylinderShape (const btVector3& halfExtents)
-:btBoxShape(halfExtents)
+:btBoxShape(halfExtents),
+m_upAxis(1)
{
-
+ recalcLocalAabb();
}
btCylinderShapeX::btCylinderShapeX (const btVector3& halfExtents)
:btCylinderShape(halfExtents)
{
+ m_upAxis = 0;
+ recalcLocalAabb();
}
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);
+}
inline btVector3 CylinderLocalSupportX(const btVector3& halfExtents,const btVector3& v)
@@ -46,8 +56,8 @@ const int ZZ = 2;
// extents of the cylinder is: X,Y is for radius, and Z for height
- float radius = halfExtents[XX];
- float halfHeight = halfExtents[cylinderUpAxis];
+ btScalar radius = halfExtents[XX];
+ btScalar halfHeight = halfExtents[cylinderUpAxis];
btVector3 tmp;
@@ -87,8 +97,8 @@ const int YY = 1;
const int ZZ = 2;
- float radius = halfExtents[XX];
- float halfHeight = halfExtents[cylinderUpAxis];
+ btScalar radius = halfExtents[XX];
+ btScalar halfHeight = halfExtents[cylinderUpAxis];
btVector3 tmp;
@@ -124,8 +134,8 @@ const int ZZ = 1;
// extents of the cylinder is: X,Y is for radius, and Z for height
- float radius = halfExtents[XX];
- float halfHeight = halfExtents[cylinderUpAxis];
+ btScalar radius = halfExtents[XX];
+ btScalar halfHeight = halfExtents[cylinderUpAxis];
btVector3 tmp;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h
index bb0e4298abc..c78890c887a 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btCylinderShape.h
@@ -17,22 +17,23 @@ subject to the following restrictions:
#define CYLINDER_MINKOWSKI_H
#include "btBoxShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
-#include "LinearMath/btVector3.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#include "../../LinearMath/btVector3.h"
/// implements cylinder shape interface
class btCylinderShape : public btBoxShape
{
+protected:
+
+ int m_upAxis;
+
public:
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
- {
- getAabbSlow(t,aabbMin,aabbMax);
- }
+ void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
@@ -44,12 +45,12 @@ public:
btVector3 supVertex;
supVertex = localGetSupportingVertexWithoutMargin(vec);
- if ( getMargin()!=0.f )
+ if ( getMargin()!=btScalar(0.) )
{
btVector3 vecnorm = vec;
if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
{
- vecnorm.setValue(-1.f,-1.f,-1.f);
+ vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
}
vecnorm.normalize();
supVertex+= getMargin() * vecnorm;
@@ -66,12 +67,12 @@ public:
return CYLINDER_SHAPE_PROXYTYPE;
}
- virtual int getUpAxis() const
+ int getUpAxis() const
{
- return 1;
+ return m_upAxis;
}
- virtual float getRadius() const
+ virtual btScalar getRadius() const
{
return getHalfExtents().getX();
}
@@ -93,17 +94,14 @@ public:
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
- virtual int getUpAxis() const
- {
- return 0;
- }
+
//debugging
virtual char* getName()const
{
return "CylinderX";
}
- virtual float getRadius() const
+ virtual btScalar getRadius() const
{
return getHalfExtents().getY();
}
@@ -128,7 +126,7 @@ public:
return "CylinderZ";
}
- virtual float getRadius() const
+ virtual btScalar getRadius() const
{
return getHalfExtents().getX();
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp
index c63f4a9c571..dcc486f194b 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.cpp
@@ -40,9 +40,9 @@ void btEmptyShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aa
}
-void btEmptyShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
+void btEmptyShape::calculateLocalInertia(btScalar ,btVector3& )
{
- assert(0);
+ btAssert(0);
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h
index c16149e55fb..8ec53444976 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btEmptyShape.h
@@ -18,11 +18,10 @@ subject to the following restrictions:
#include "btConcaveShape.h"
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btTransform.h"
-#include "LinearMath/btMatrix3x3.h"
-#include <vector>
-#include "BulletCollision/CollisionShapes/btCollisionMargin.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btTransform.h"
+#include "../../LinearMath/btMatrix3x3.h"
+#include "btCollisionMargin.h"
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
index 57132ee9512..94be43c88e2 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
@@ -18,9 +18,66 @@ subject to the following restrictions:
#include "LinearMath/btTransformUtil.h"
-btHeightfieldTerrainShape::btHeightfieldTerrainShape()
-:m_localScaling(0.f,0.f,0.f)
+btHeightfieldTerrainShape::btHeightfieldTerrainShape(int width,int length,void* heightfieldData,btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges)
+:m_localScaling(btScalar(1.),btScalar(1.),btScalar(1.)),
+m_width(width),
+m_length(length),
+m_heightfieldDataUnknown(heightfieldData),
+m_maxHeight(maxHeight),
+m_upAxis(upAxis),
+m_useFloatData(useFloatData),
+m_flipQuadEdges(flipQuadEdges),
+m_useDiamondSubdivision(false)
{
+
+
+ btScalar quantizationMargin = 1.f;
+
+ //enlarge the AABB to avoid division by zero when initializing the quantization values
+ btVector3 clampValue(quantizationMargin,quantizationMargin,quantizationMargin);
+
+ btVector3 halfExtents(0,0,0);
+
+ switch (m_upAxis)
+ {
+ case 0:
+ {
+ halfExtents.setValue(
+ m_maxHeight,
+ m_width,
+ m_length);
+ break;
+ }
+ case 1:
+ {
+ halfExtents.setValue(
+ m_width,
+ m_maxHeight,
+ m_length);
+ break;
+ };
+ case 2:
+ {
+ halfExtents.setValue(
+ m_width,
+ m_length,
+ m_maxHeight
+ );
+ break;
+ }
+ default:
+ {
+ //need to get valid m_upAxis
+ btAssert(0);
+ }
+ }
+
+ halfExtents*= btScalar(0.5);
+
+ m_localAabbMin = -halfExtents - clampValue;
+ m_localAabbMax = halfExtents + clampValue;
+ btVector3 aabbSize = m_localAabbMax - m_localAabbMin;
+
}
@@ -32,54 +89,244 @@ btHeightfieldTerrainShape::~btHeightfieldTerrainShape()
void btHeightfieldTerrainShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
{
+/*
aabbMin.setValue(-1e30f,-1e30f,-1e30f);
aabbMax.setValue(1e30f,1e30f,1e30f);
+*/
+
+ btVector3 halfExtents = (m_localAabbMax-m_localAabbMin)* m_localScaling * btScalar(0.5);
+
+ btMatrix3x3 abs_b = t.getBasis().absolute();
+ btPoint3 center = t.getOrigin();
+ btVector3 extent = btVector3(abs_b[0].dot(halfExtents),
+ abs_b[1].dot(halfExtents),
+ abs_b[2].dot(halfExtents));
+ extent += btVector3(getMargin(),getMargin(),getMargin());
+ aabbMin = center - extent;
+ aabbMax = center + extent;
+
+
+}
+
+btScalar btHeightfieldTerrainShape::getHeightFieldValue(int x,int y) const
+{
+ btScalar val = 0.f;
+ if (m_useFloatData)
+ {
+ val = m_heightfieldDataFloat[(y*m_width)+x];
+ } else
+ {
+ //assume unsigned short int
+ unsigned char heightFieldValue = m_heightfieldDataUnsignedChar[(y*m_width)+x];
+ val = heightFieldValue* (m_maxHeight/btScalar(65535));
+ }
+ return val;
}
-void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+
+void btHeightfieldTerrainShape::getVertex(int x,int y,btVector3& vertex) const
{
- btVector3 halfExtents = (aabbMax - aabbMin) * 0.5f;
- btScalar radius = halfExtents.length();
- btVector3 center = (aabbMax + aabbMin) * 0.5f;
+ btAssert(x>=0);
+ btAssert(y>=0);
+ btAssert(x<m_width);
+ btAssert(y<m_length);
+
+
+ btScalar height = getHeightFieldValue(x,y);
+
+ switch (m_upAxis)
+ {
+ case 0:
+ {
+ vertex.setValue(
+ height,
+ (-m_width/2 ) + x,
+ (-m_length/2 ) + y
+ );
+ break;
+ }
+ case 1:
+ {
+ vertex.setValue(
+ (-m_width/2 ) + x,
+ height,
+ (-m_length/2 ) + y
+ );
+ break;
+ };
+ case 2:
+ {
+ vertex.setValue(
+ (-m_width/2 ) + x,
+ (-m_length/2 ) + y,
+ height
+ );
+ break;
+ }
+ default:
+ {
+ //need to get valid m_upAxis
+ btAssert(0);
+ }
+ }
+
+ vertex*=m_localScaling;
- //TODO
- //this is where the triangles are generated, given AABB and plane equation (normal/constant)
-/*
- btVector3 tangentDir0,tangentDir1;
+}
+
+
+void btHeightfieldTerrainShape::quantizeWithClamp(int* out, const btVector3& point) const
+{
+
+
+ btVector3 clampedPoint(point);
+ clampedPoint.setMax(m_localAabbMin);
+ clampedPoint.setMin(m_localAabbMax);
+
+ btVector3 v = (clampedPoint );// * m_quantization;
+
+ out[0] = (int)(v.getX());
+ out[1] = (int)(v.getY());
+ out[2] = (int)(v.getZ());
+ //correct for
+
+}
+
+
+void btHeightfieldTerrainShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
+{
+ (void)callback;
+ (void)aabbMax;
+ (void)aabbMin;
- //tangentDir0/tangentDir1 can be precalculated
- btPlaneSpace1(m_planeNormal,tangentDir0,tangentDir1);
+ //quantize the aabbMin and aabbMax, and adjust the start/end ranges
- btVector3 supVertex0,supVertex1;
+ int quantizedAabbMin[3];
+ int quantizedAabbMax[3];
- btVector3 projectedCenter = center - (m_planeNormal.dot(center) - m_planeConstant)*m_planeNormal;
+ btVector3 localAabbMin = aabbMin*btVector3(1.f/m_localScaling[0],1.f/m_localScaling[1],1.f/m_localScaling[2]);
+ btVector3 localAabbMax = aabbMax*btVector3(1.f/m_localScaling[0],1.f/m_localScaling[1],1.f/m_localScaling[2]);
+
+ quantizeWithClamp(quantizedAabbMin, localAabbMin);
+ quantizeWithClamp(quantizedAabbMax, localAabbMax);
+
- btVector3 triangle[3];
- triangle[0] = projectedCenter + tangentDir0*radius + tangentDir1*radius;
- triangle[1] = projectedCenter + tangentDir0*radius - tangentDir1*radius;
- triangle[2] = projectedCenter - tangentDir0*radius - tangentDir1*radius;
- callback->processTriangle(triangle,0,0);
+ int startX=0;
+ int endX=m_width-1;
+ int startJ=0;
+ int endJ=m_length-1;
- triangle[0] = projectedCenter - tangentDir0*radius - tangentDir1*radius;
- triangle[1] = projectedCenter - tangentDir0*radius + tangentDir1*radius;
- triangle[2] = projectedCenter + tangentDir0*radius + tangentDir1*radius;
+ switch (m_upAxis)
+ {
+ case 0:
+ {
+ quantizedAabbMin[1]+=m_width/2-1;
+ quantizedAabbMax[1]+=m_width/2+1;
+ quantizedAabbMin[2]+=m_length/2-1;
+ quantizedAabbMax[2]+=m_length/2+1;
- callback->processTriangle(triangle,0,1);
-*/
+ if (quantizedAabbMin[1]>startX)
+ startX = quantizedAabbMin[1];
+ if (quantizedAabbMax[1]<endX)
+ endX = quantizedAabbMax[1];
+ if (quantizedAabbMin[2]>startJ)
+ startJ = quantizedAabbMin[2];
+ if (quantizedAabbMax[2]<endJ)
+ endJ = quantizedAabbMax[2];
+ break;
+ }
+ case 1:
+ {
+ quantizedAabbMin[0]+=m_width/2-1;
+ quantizedAabbMax[0]+=m_width/2+1;
+ quantizedAabbMin[2]+=m_length/2-1;
+ quantizedAabbMax[2]+=m_length/2+1;
+
+ if (quantizedAabbMin[0]>startX)
+ startX = quantizedAabbMin[0];
+ if (quantizedAabbMax[0]<endX)
+ endX = quantizedAabbMax[0];
+ if (quantizedAabbMin[2]>startJ)
+ startJ = quantizedAabbMin[2];
+ if (quantizedAabbMax[2]<endJ)
+ endJ = quantizedAabbMax[2];
+ break;
+ };
+ case 2:
+ {
+ quantizedAabbMin[0]+=m_width/2-1;
+ quantizedAabbMax[0]+=m_width/2+1;
+ quantizedAabbMin[1]+=m_length/2-1;
+ quantizedAabbMax[1]+=m_length/2+1;
+
+ if (quantizedAabbMin[0]>startX)
+ startX = quantizedAabbMin[0];
+ if (quantizedAabbMax[0]<endX)
+ endX = quantizedAabbMax[0];
+ if (quantizedAabbMin[1]>startJ)
+ startJ = quantizedAabbMin[1];
+ if (quantizedAabbMax[1]<endJ)
+ endJ = quantizedAabbMax[1];
+ break;
+ }
+ default:
+ {
+ //need to get valid m_upAxis
+ btAssert(0);
+ }
+ }
+
+
+
+
+ for(int j=startJ; j<endJ; j++)
+ {
+ for(int x=startX; x<endX; x++)
+ {
+ btVector3 vertices[3];
+ if (m_flipQuadEdges || (m_useDiamondSubdivision && ((j+x) & 1)))
+ {
+ //first triangle
+ getVertex(x,j,vertices[0]);
+ getVertex(x+1,j,vertices[1]);
+ getVertex(x+1,j+1,vertices[2]);
+ callback->processTriangle(vertices,x,j);
+ //second triangle
+ getVertex(x,j,vertices[0]);
+ getVertex(x+1,j+1,vertices[1]);
+ getVertex(x,j+1,vertices[2]);
+ callback->processTriangle(vertices,x,j);
+ } else
+ {
+ //first triangle
+ getVertex(x,j,vertices[0]);
+ getVertex(x,j+1,vertices[1]);
+ getVertex(x+1,j,vertices[2]);
+ callback->processTriangle(vertices,x,j);
+ //second triangle
+ getVertex(x+1,j,vertices[0]);
+ getVertex(x,j+1,vertices[1]);
+ getVertex(x+1,j+1,vertices[2]);
+ callback->processTriangle(vertices,x,j);
+ }
+ }
+ }
+
+
}
-void btHeightfieldTerrainShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
+void btHeightfieldTerrainShape::calculateLocalInertia(btScalar ,btVector3& inertia)
{
//moving concave objects not supported
- inertia.setValue(0.f,0.f,0.f);
+ inertia.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
}
void btHeightfieldTerrainShape::setLocalScaling(const btVector3& scaling)
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
index e4cc9d42d59..49f3e106733 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef HEIGHTFIELD_TERRAIN_SHAPE_H
#define HEIGHTFIELD_TERRAIN_SHAPE_H
-#include "BulletCollision/CollisionShapes/btConcaveShape.h"
+#include "btConcaveShape.h"
///btHeightfieldTerrainShape simulates a 2D heightfield terrain
class btHeightfieldTerrainShape : public btConcaveShape
@@ -25,16 +25,46 @@ protected:
btVector3 m_localAabbMin;
btVector3 m_localAabbMax;
- //todo: terrain data
+ ///terrain data
+ int m_width;
+ int m_length;
+ btScalar m_maxHeight;
+ union
+ {
+ unsigned char* m_heightfieldDataUnsignedChar;
+ btScalar* m_heightfieldDataFloat;
+ void* m_heightfieldDataUnknown;
+ };
+
+ bool m_useFloatData;
+ bool m_flipQuadEdges;
+ bool m_useDiamondSubdivision;
+ int m_upAxis;
+
btVector3 m_localScaling;
+ virtual btScalar getHeightFieldValue(int x,int y) const;
+ void quantizeWithClamp(int* out, const btVector3& point) const;
+ void getVertex(int x,int y,btVector3& vertex) const;
+
+ inline bool testQuantizedAabbAgainstQuantizedAabb(int* aabbMin1, int* aabbMax1,const int* aabbMin2,const int* aabbMax2) const
+ {
+ bool overlap = true;
+ overlap = (aabbMin1[0] > aabbMax2[0] || aabbMax1[0] < aabbMin2[0]) ? false : overlap;
+ overlap = (aabbMin1[2] > aabbMax2[2] || aabbMax1[2] < aabbMin2[2]) ? false : overlap;
+ overlap = (aabbMin1[1] > aabbMax2[1] || aabbMax1[1] < aabbMin2[1]) ? false : overlap;
+ return overlap;
+ }
+
public:
- btHeightfieldTerrainShape();
+ btHeightfieldTerrainShape(int width,int height,void* heightfieldData, btScalar maxHeight,int upAxis,bool useFloatData,bool flipQuadEdges);
virtual ~btHeightfieldTerrainShape();
+ void setUseDiamondSubdivision(bool useDiamondSubdivision=true) { m_useDiamondSubdivision = useDiamondSubdivision;}
+
virtual int getShapeType() const
{
return TERRAIN_SHAPE_PROXYTYPE;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
index 4bf8c478a53..015314bc09f 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
@@ -16,7 +16,7 @@ subject to the following restrictions:
#include "btMinkowskiSumShape.h"
-btMinkowskiSumShape::btMinkowskiSumShape(btConvexShape* shapeA,btConvexShape* shapeB)
+btMinkowskiSumShape::btMinkowskiSumShape(const btConvexShape* shapeA,const btConvexShape* shapeB)
:m_shapeA(shapeA),
m_shapeB(shapeB)
{
@@ -43,7 +43,7 @@ void btMinkowskiSumShape::batchedUnitVectorGetSupportingVertexWithoutMargin(cons
-float btMinkowskiSumShape::getMargin() const
+btScalar btMinkowskiSumShape::getMargin() const
{
return m_shapeA->getMargin() + m_shapeB->getMargin();
}
@@ -51,6 +51,7 @@ float btMinkowskiSumShape::getMargin() const
void btMinkowskiSumShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
{
- assert(0);
+ (void)mass;
+ btAssert(0);
inertia.setValue(0,0,0);
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
index e974f57a4c2..198faaff9f9 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h
@@ -17,7 +17,7 @@ subject to the following restrictions:
#define MINKOWSKI_SUM_SHAPE_H
#include "btConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types
/// btMinkowskiSumShape represents implicit (getSupportingVertex) based minkowski sum of two convex implicit shapes.
class btMinkowskiSumShape : public btConvexShape
@@ -25,12 +25,12 @@ class btMinkowskiSumShape : public btConvexShape
btTransform m_transA;
btTransform m_transB;
- btConvexShape* m_shapeA;
- btConvexShape* m_shapeB;
+ const btConvexShape* m_shapeA;
+ const btConvexShape* m_shapeB;
public:
- btMinkowskiSumShape(btConvexShape* shapeA,btConvexShape* shapeB);
+ btMinkowskiSumShape(const btConvexShape* shapeA,const btConvexShape* shapeB);
virtual btVector3 localGetSupportingVertexWithoutMargin(const btVector3& vec)const;
@@ -48,7 +48,7 @@ public:
virtual int getShapeType() const { return MINKOWSKI_SUM_SHAPE_PROXYTYPE; }
- virtual float getMargin() const;
+ virtual btScalar getMargin() const;
const btConvexShape* getShapeA() const { return m_shapeA;}
const btConvexShape* getShapeB() const { return m_shapeB;}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
index fde4d95da14..6015a618082 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
@@ -20,7 +20,7 @@ subject to the following restrictions:
btMultiSphereShape::btMultiSphereShape (const btVector3& inertiaHalfExtents,const btVector3* positions,const btScalar* radi,int numSpheres)
:m_inertiaHalfExtents(inertiaHalfExtents)
{
- float startMargin = 1e30f;
+ btScalar startMargin = btScalar(1e30);
m_numSpheres = numSpheres;
for (int i=0;i<m_numSpheres;i++)
@@ -42,17 +42,17 @@ btMultiSphereShape::btMultiSphereShape (const btVector3& inertiaHalfExtents,cons
int i;
btVector3 supVec(0,0,0);
- btScalar maxDot(-1e30f);
+ btScalar maxDot(btScalar(-1e30));
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
- if (lenSqr < 0.0001f)
+ if (lenSqr < btScalar(0.0001))
{
vec.setValue(1,0,0);
} else
{
- float rlen = 1.f / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
vec *= rlen;
}
@@ -84,7 +84,7 @@ btMultiSphereShape::btMultiSphereShape (const btVector3& inertiaHalfExtents,cons
for (int j=0;j<numVectors;j++)
{
- btScalar maxDot(-1e30f);
+ btScalar maxDot(btScalar(-1e30));
const btVector3& vec = vectors[j];
@@ -126,17 +126,17 @@ void btMultiSphereShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
// getAabb(ident,aabbMin,aabbMax);
- btVector3 halfExtents = m_inertiaHalfExtents;//(aabbMax - aabbMin)* 0.5f;
+ btVector3 halfExtents = m_inertiaHalfExtents;//(aabbMax - aabbMin)* btScalar(0.5);
- float margin = CONVEX_DISTANCE_MARGIN;
+ btScalar margin = CONVEX_DISTANCE_MARGIN;
- btScalar lx=2.f*(halfExtents[0]+margin);
- btScalar ly=2.f*(halfExtents[1]+margin);
- btScalar lz=2.f*(halfExtents[2]+margin);
+ 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 * 0.08333333f;
+ const btScalar scaledmass = mass * btScalar(.08333333);
inertia[0] = scaledmass * (y2+z2);
inertia[1] = scaledmass * (x2+z2);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h
index 2dde9d3855a..1897b474057 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btMultiSphereShape.h
@@ -17,7 +17,7 @@ subject to the following restrictions:
#define MULTI_SPHERE_MINKOWSKI_H
#include "btConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types
#define MAX_NUM_SPHERES 5
@@ -46,6 +46,20 @@ public:
virtual void batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const;
+ int getSphereCount() const
+ {
+ return m_numSpheres;
+ }
+
+ const btVector3& getSpherePosition(int index) const
+ {
+ return m_localPositions[index];
+ }
+
+ btScalar getSphereRadius(int index) const
+ {
+ return m_radi[index];
+ }
virtual int getShapeType() const { return MULTI_SPHERE_SHAPE_PROXYTYPE; }
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
index 37f15e1dcc4..44438a24455 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
@@ -16,89 +16,373 @@ subject to the following restrictions:
#include "btOptimizedBvh.h"
#include "btStridingMeshInterface.h"
#include "LinearMath/btAabbUtil2.h"
+#include "LinearMath/btIDebugDraw.h"
-btOptimizedBvh::btOptimizedBvh() :m_rootNode1(0), m_numNodes(0)
+
+btOptimizedBvh::btOptimizedBvh() : m_useQuantization(false),
+ m_traversalMode(TRAVERSAL_STACKLESS_CACHE_FRIENDLY)
+ //m_traversalMode(TRAVERSAL_STACKLESS)
+ //m_traversalMode(TRAVERSAL_RECURSIVE)
{
}
-void btOptimizedBvh::build(btStridingMeshInterface* triangles)
+void btOptimizedBvh::build(btStridingMeshInterface* triangles, bool useQuantizedAabbCompression, const btVector3& bvhAabbMin, const btVector3& bvhAabbMax)
{
- //int countTriangles = 0;
+ m_useQuantization = useQuantizedAabbCompression;
-
// NodeArray triangleNodes;
struct NodeTriangleCallback : public btInternalTriangleIndexCallback
{
+
NodeArray& m_triangleNodes;
+ NodeTriangleCallback& operator=(NodeTriangleCallback& other)
+ {
+ m_triangleNodes = other.m_triangleNodes;
+ return *this;
+ }
+
NodeTriangleCallback(NodeArray& triangleNodes)
:m_triangleNodes(triangleNodes)
{
-
}
virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
{
-
btOptimizedBvhNode node;
- node.m_aabbMin = btVector3(1e30f,1e30f,1e30f);
- node.m_aabbMax = btVector3(-1e30f,-1e30f,-1e30f);
- node.m_aabbMin.setMin(triangle[0]);
- node.m_aabbMax.setMax(triangle[0]);
- node.m_aabbMin.setMin(triangle[1]);
- node.m_aabbMax.setMax(triangle[1]);
- node.m_aabbMin.setMin(triangle[2]);
- node.m_aabbMax.setMax(triangle[2]);
+ btVector3 aabbMin,aabbMax;
+ aabbMin.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ aabbMax.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ aabbMin.setMin(triangle[0]);
+ aabbMax.setMax(triangle[0]);
+ aabbMin.setMin(triangle[1]);
+ aabbMax.setMax(triangle[1]);
+ aabbMin.setMin(triangle[2]);
+ aabbMax.setMax(triangle[2]);
+
+ //with quantization?
+ node.m_aabbMinOrg = aabbMin;
+ node.m_aabbMaxOrg = aabbMax;
node.m_escapeIndex = -1;
- node.m_leftChild = 0;
- node.m_rightChild = 0;
-
-
+
//for child nodes
node.m_subPart = partId;
node.m_triangleIndex = triangleIndex;
+ m_triangleNodes.push_back(node);
+ }
+ };
+ struct QuantizedNodeTriangleCallback : public btInternalTriangleIndexCallback
+ {
+ QuantizedNodeArray& m_triangleNodes;
+ const btOptimizedBvh* m_optimizedTree; // for quantization
+
+ QuantizedNodeTriangleCallback& operator=(QuantizedNodeTriangleCallback& other)
+ {
+ m_triangleNodes = other.m_triangleNodes;
+ m_optimizedTree = other.m_optimizedTree;
+ return *this;
+ }
+
+ QuantizedNodeTriangleCallback(QuantizedNodeArray& triangleNodes,const btOptimizedBvh* tree)
+ :m_triangleNodes(triangleNodes),m_optimizedTree(tree)
+ {
+ }
+
+ virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
+ {
+ btAssert(partId==0);
+ //negative indices are reserved for escapeIndex
+ btAssert(triangleIndex>=0);
+
+ btQuantizedBvhNode node;
+ btVector3 aabbMin,aabbMax;
+ aabbMin.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ aabbMax.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ aabbMin.setMin(triangle[0]);
+ aabbMax.setMax(triangle[0]);
+ aabbMin.setMin(triangle[1]);
+ aabbMax.setMax(triangle[1]);
+ aabbMin.setMin(triangle[2]);
+ aabbMax.setMax(triangle[2]);
+
+ m_optimizedTree->quantizeWithClamp(&node.m_quantizedAabbMin[0],aabbMin);
+ m_optimizedTree->quantizeWithClamp(&node.m_quantizedAabbMax[0],aabbMax);
+
+ node.m_escapeIndexOrTriangleIndex = triangleIndex;
-
m_triangleNodes.push_back(node);
}
};
+
+
+
+ int numLeafNodes = 0;
+ if (m_useQuantization)
+ {
- NodeTriangleCallback callback(m_leafNodes);
+ //initialize quantization values
+ setQuantizationValues(bvhAabbMin,bvhAabbMax);
+
+ QuantizedNodeTriangleCallback callback(m_quantizedLeafNodes,this);
+
+
+ triangles->InternalProcessAllTriangles(&callback,m_bvhAabbMin,m_bvhAabbMax);
- btVector3 aabbMin(-1e30f,-1e30f,-1e30f);
- btVector3 aabbMax(1e30f,1e30f,1e30f);
+ //now we have an array of leafnodes in m_leafNodes
+ numLeafNodes = m_quantizedLeafNodes.size();
- triangles->InternalProcessAllTriangles(&callback,aabbMin,aabbMax);
- //now we have an array of leafnodes in m_leafNodes
+ m_quantizedContiguousNodes.resize(2*numLeafNodes);
+
+
+ } else
+ {
+ NodeTriangleCallback callback(m_leafNodes);
+
+ btVector3 aabbMin(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+
+ triangles->InternalProcessAllTriangles(&callback,aabbMin,aabbMax);
+
+ //now we have an array of leafnodes in m_leafNodes
+ numLeafNodes = m_leafNodes.size();
+
+ m_contiguousNodes.resize(2*numLeafNodes);
+ }
- m_contiguousNodes = new btOptimizedBvhNode[2*m_leafNodes.size()];
m_curNodeIndex = 0;
- m_rootNode1 = buildTree(m_leafNodes,0,m_leafNodes.size());
+ buildTree(0,numLeafNodes);
+
+ ///if the entire tree is small then subtree size, we need to create a header info for the tree
+ if(m_useQuantization && !m_SubtreeHeaders.size())
+ {
+ btBvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
+ subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[0]);
+ subtree.m_rootNodeIndex = 0;
+ subtree.m_subtreeSize = m_quantizedContiguousNodes[0].isLeafNode() ? 1 : m_quantizedContiguousNodes[0].getEscapeIndex();
+ }
+}
+
+
+
+void btOptimizedBvh::refitPartial(btStridingMeshInterface* meshInterface,const btVector3& aabbMin,const btVector3& aabbMax)
+{
+ //incrementally initialize quantization values
+ btAssert(m_useQuantization);
+
+ btAssert(aabbMin.getX() > m_bvhAabbMin.getX());
+ btAssert(aabbMin.getY() > m_bvhAabbMin.getY());
+ btAssert(aabbMin.getZ() > m_bvhAabbMin.getZ());
+
+ btAssert(aabbMax.getX() < m_bvhAabbMax.getX());
+ btAssert(aabbMax.getY() < m_bvhAabbMax.getY());
+ btAssert(aabbMax.getZ() < m_bvhAabbMax.getZ());
+
+ ///we should update all quantization values, using updateBvhNodes(meshInterface);
+ ///but we only update chunks that overlap the given aabb
+
+ unsigned short quantizedQueryAabbMin[3];
+ unsigned short quantizedQueryAabbMax[3];
+
+ quantizeWithClamp(&quantizedQueryAabbMin[0],aabbMin);
+ quantizeWithClamp(&quantizedQueryAabbMax[0],aabbMax);
+ int i;
+ for (i=0;i<this->m_SubtreeHeaders.size();i++)
+ {
+ btBvhSubtreeInfo& subtree = m_SubtreeHeaders[i];
- ///create the leafnodes first
-// btOptimizedBvhNode* leafNodes = new btOptimizedBvhNode;
+ bool overlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,subtree.m_quantizedAabbMin,subtree.m_quantizedAabbMax);
+ if (overlap)
+ {
+ updateBvhNodes(meshInterface,subtree.m_rootNodeIndex,subtree.m_rootNodeIndex+subtree.m_subtreeSize,i);
+
+ subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[subtree.m_rootNodeIndex]);
+ }
+ }
+
}
+///just for debugging, to visualize the individual patches/subtrees
+#ifdef DEBUG_PATCH_COLORS
+btVector3 color[4]=
+{
+ btVector3(255,0,0),
+ btVector3(0,255,0),
+ btVector3(0,0,255),
+ btVector3(0,255,255)
+};
+#endif //DEBUG_PATCH_COLORS
+
+
+void btOptimizedBvh::updateBvhNodes(btStridingMeshInterface* meshInterface,int firstNode,int endNode,int index)
+{
+ (void)index;
+
+ btAssert(m_useQuantization);
+
+ int nodeSubPart=0;
+
+ //get access info to trianglemesh data
+ const unsigned char *vertexbase;
+ int numverts;
+ PHY_ScalarType type;
+ int stride;
+ const unsigned char *indexbase;
+ int indexstride;
+ int numfaces;
+ PHY_ScalarType indicestype;
+ meshInterface->getLockedReadOnlyVertexIndexBase(&vertexbase,numverts, type,stride,&indexbase,indexstride,numfaces,indicestype,nodeSubPart);
+
+ btVector3 triangleVerts[3];
+ btVector3 aabbMin,aabbMax;
+ const btVector3& meshScaling = meshInterface->getScaling();
+
+ int i;
+ for (i=endNode-1;i>=firstNode;i--)
+ {
+
+
+ btQuantizedBvhNode& curNode = m_quantizedContiguousNodes[i];
+ if (curNode.isLeafNode())
+ {
+ //recalc aabb from triangle data
+ int nodeTriangleIndex = curNode.getTriangleIndex();
+ //triangles->getLockedReadOnlyVertexIndexBase(vertexBase,numVerts,
+
+ int* gfxbase = (int*)(indexbase+nodeTriangleIndex*indexstride);
+
+
+ for (int j=2;j>=0;j--)
+ {
+
+ int graphicsindex = gfxbase[j];
+ btScalar* graphicsbase = (btScalar*)(vertexbase+graphicsindex*stride);
+#ifdef DEBUG_PATCH_COLORS
+ btVector3 mycolor = color[index&3];
+ graphicsbase[8] = mycolor.getX();
+ graphicsbase[9] = mycolor.getY();
+ graphicsbase[10] = mycolor.getZ();
+#endif //DEBUG_PATCH_COLORS
+
+
+ triangleVerts[j] = btVector3(
+ graphicsbase[0]*meshScaling.getX(),
+ graphicsbase[1]*meshScaling.getY(),
+ graphicsbase[2]*meshScaling.getZ());
+ }
+
+
+
+ aabbMin.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ aabbMax.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ aabbMin.setMin(triangleVerts[0]);
+ aabbMax.setMax(triangleVerts[0]);
+ aabbMin.setMin(triangleVerts[1]);
+ aabbMax.setMax(triangleVerts[1]);
+ aabbMin.setMin(triangleVerts[2]);
+ aabbMax.setMax(triangleVerts[2]);
+
+ quantizeWithClamp(&curNode.m_quantizedAabbMin[0],aabbMin);
+ quantizeWithClamp(&curNode.m_quantizedAabbMax[0],aabbMax);
+
+ } else
+ {
+ //combine aabb from both children
+
+ btQuantizedBvhNode* leftChildNode = &m_quantizedContiguousNodes[i+1];
+
+ btQuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? &m_quantizedContiguousNodes[i+2] :
+ &m_quantizedContiguousNodes[i+1+leftChildNode->getEscapeIndex()];
+
+
+ {
+ for (int i=0;i<3;i++)
+ {
+ curNode.m_quantizedAabbMin[i] = leftChildNode->m_quantizedAabbMin[i];
+ if (curNode.m_quantizedAabbMin[i]>rightChildNode->m_quantizedAabbMin[i])
+ curNode.m_quantizedAabbMin[i]=rightChildNode->m_quantizedAabbMin[i];
+
+ curNode.m_quantizedAabbMax[i] = leftChildNode->m_quantizedAabbMax[i];
+ if (curNode.m_quantizedAabbMax[i] < rightChildNode->m_quantizedAabbMax[i])
+ curNode.m_quantizedAabbMax[i] = rightChildNode->m_quantizedAabbMax[i];
+ }
+ }
+ }
+
+ }
+
+ meshInterface->unLockReadOnlyVertexBase(nodeSubPart);
+
+
+}
+
+void btOptimizedBvh::setQuantizationValues(const btVector3& bvhAabbMin,const btVector3& bvhAabbMax,btScalar quantizationMargin)
+{
+ //enlarge the AABB to avoid division by zero when initializing the quantization values
+ btVector3 clampValue(quantizationMargin,quantizationMargin,quantizationMargin);
+ m_bvhAabbMin = bvhAabbMin - clampValue;
+ m_bvhAabbMax = bvhAabbMax + clampValue;
+ btVector3 aabbSize = m_bvhAabbMax - m_bvhAabbMin;
+ m_bvhQuantization = btVector3(btScalar(65535.0),btScalar(65535.0),btScalar(65535.0)) / aabbSize;
+}
+
+
+void btOptimizedBvh::refit(btStridingMeshInterface* meshInterface)
+{
+ if (m_useQuantization)
+ {
+ //calculate new aabb
+ btVector3 aabbMin,aabbMax;
+ meshInterface->calculateAabbBruteForce(aabbMin,aabbMax);
+
+ setQuantizationValues(aabbMin,aabbMax);
+
+ updateBvhNodes(meshInterface,0,m_curNodeIndex,0);
+
+ ///now update all subtree headers
+
+ int i;
+ for (i=0;i<m_SubtreeHeaders.size();i++)
+ {
+ btBvhSubtreeInfo& subtree = m_SubtreeHeaders[i];
+ subtree.setAabbFromQuantizeNode(m_quantizedContiguousNodes[subtree.m_rootNodeIndex]);
+ }
+
+ } else
+ {
+
+ }
+}
+
+
+
btOptimizedBvh::~btOptimizedBvh()
{
- if (m_contiguousNodes)
- delete []m_contiguousNodes;
}
-btOptimizedBvhNode* btOptimizedBvh::buildTree (NodeArray& leafNodes,int startIndex,int endIndex)
+#ifdef DEBUG_TREE_BUILDING
+int gStackDepth = 0;
+int gMaxStackDepth = 0;
+#endif //DEBUG_TREE_BUILDING
+
+void btOptimizedBvh::buildTree (int startIndex,int endIndex)
{
- btOptimizedBvhNode* internalNode;
+#ifdef DEBUG_TREE_BUILDING
+ gStackDepth++;
+ if (gStackDepth > gMaxStackDepth)
+ gMaxStackDepth = gStackDepth;
+#endif //DEBUG_TREE_BUILDING
+
int splitAxis, splitIndex, i;
int numIndices =endIndex-startIndex;
@@ -108,96 +392,172 @@ btOptimizedBvhNode* btOptimizedBvh::buildTree (NodeArray& leafNodes,int startInd
if (numIndices==1)
{
- return new (&m_contiguousNodes[m_curNodeIndex++]) btOptimizedBvhNode(leafNodes[startIndex]);
+#ifdef DEBUG_TREE_BUILDING
+ gStackDepth--;
+#endif //DEBUG_TREE_BUILDING
+
+ assignInternalNodeFromLeafNode(m_curNodeIndex,startIndex);
+
+ m_curNodeIndex++;
+ return;
}
//calculate Best Splitting Axis and where to split it. Sort the incoming 'leafNodes' array within range 'startIndex/endIndex'.
- splitAxis = calcSplittingAxis(leafNodes,startIndex,endIndex);
+ splitAxis = calcSplittingAxis(startIndex,endIndex);
- splitIndex = sortAndCalcSplittingIndex(leafNodes,startIndex,endIndex,splitAxis);
+ splitIndex = sortAndCalcSplittingIndex(startIndex,endIndex,splitAxis);
- internalNode = &m_contiguousNodes[m_curNodeIndex++];
+ int internalNodeIndex = m_curNodeIndex;
- internalNode->m_aabbMax.setValue(-1e30f,-1e30f,-1e30f);
- internalNode->m_aabbMin.setValue(1e30f,1e30f,1e30f);
+ setInternalNodeAabbMax(m_curNodeIndex,btVector3(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30)));
+ setInternalNodeAabbMin(m_curNodeIndex,btVector3(btScalar(1e30),btScalar(1e30),btScalar(1e30)));
for (i=startIndex;i<endIndex;i++)
{
- internalNode->m_aabbMax.setMax(leafNodes[i].m_aabbMax);
- internalNode->m_aabbMin.setMin(leafNodes[i].m_aabbMin);
+ mergeInternalNodeAabb(m_curNodeIndex,getAabbMin(i),getAabbMax(i));
}
+ m_curNodeIndex++;
//internalNode->m_escapeIndex;
- internalNode->m_leftChild = buildTree(leafNodes,startIndex,splitIndex);
- internalNode->m_rightChild = buildTree(leafNodes,splitIndex,endIndex);
+
+ int leftChildNodexIndex = m_curNodeIndex;
+
+ //build left child tree
+ buildTree(startIndex,splitIndex);
+
+ int rightChildNodexIndex = m_curNodeIndex;
+ //build right child tree
+ buildTree(splitIndex,endIndex);
+
+#ifdef DEBUG_TREE_BUILDING
+ gStackDepth--;
+#endif //DEBUG_TREE_BUILDING
+
+ int escapeIndex = m_curNodeIndex - curIndex;
+
+ if (m_useQuantization)
+ {
+ //escapeIndex is the number of nodes of this subtree
+ const int sizeQuantizedNode =sizeof(btQuantizedBvhNode);
+ const int treeSizeInBytes = escapeIndex * sizeQuantizedNode;
+ if (treeSizeInBytes > MAX_SUBTREE_SIZE_IN_BYTES)
+ {
+ updateSubtreeHeaders(leftChildNodexIndex,rightChildNodexIndex);
+ }
+ }
+
+ setInternalNodeEscapeIndex(internalNodeIndex,escapeIndex);
- internalNode->m_escapeIndex = m_curNodeIndex - curIndex;
- return internalNode;
}
-int btOptimizedBvh::sortAndCalcSplittingIndex(NodeArray& leafNodes,int startIndex,int endIndex,int splitAxis)
+void btOptimizedBvh::updateSubtreeHeaders(int leftChildNodexIndex,int rightChildNodexIndex)
+{
+ btAssert(m_useQuantization);
+
+ btQuantizedBvhNode& leftChildNode = m_quantizedContiguousNodes[leftChildNodexIndex];
+ int leftSubTreeSize = leftChildNode.isLeafNode() ? 1 : leftChildNode.getEscapeIndex();
+ int leftSubTreeSizeInBytes = leftSubTreeSize * sizeof(btQuantizedBvhNode);
+
+ btQuantizedBvhNode& rightChildNode = m_quantizedContiguousNodes[rightChildNodexIndex];
+ int rightSubTreeSize = rightChildNode.isLeafNode() ? 1 : rightChildNode.getEscapeIndex();
+ int rightSubTreeSizeInBytes = rightSubTreeSize * sizeof(btQuantizedBvhNode);
+
+ if(leftSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
+ {
+ btBvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
+ subtree.setAabbFromQuantizeNode(leftChildNode);
+ subtree.m_rootNodeIndex = leftChildNodexIndex;
+ subtree.m_subtreeSize = leftSubTreeSize;
+ }
+
+ if(rightSubTreeSizeInBytes <= MAX_SUBTREE_SIZE_IN_BYTES)
+ {
+ btBvhSubtreeInfo& subtree = m_SubtreeHeaders.expand();
+ subtree.setAabbFromQuantizeNode(rightChildNode);
+ subtree.m_rootNodeIndex = rightChildNodexIndex;
+ subtree.m_subtreeSize = rightSubTreeSize;
+ }
+}
+
+
+int btOptimizedBvh::sortAndCalcSplittingIndex(int startIndex,int endIndex,int splitAxis)
{
int i;
int splitIndex =startIndex;
int numIndices = endIndex - startIndex;
- float splitValue;
+ btScalar splitValue;
- btVector3 means(0.f,0.f,0.f);
+ btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
for (i=startIndex;i<endIndex;i++)
{
- btVector3 center = 0.5f*(leafNodes[i].m_aabbMax+leafNodes[i].m_aabbMin);
+ btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
means+=center;
}
- means *= (1.f/(float)numIndices);
+ means *= (btScalar(1.)/(btScalar)numIndices);
splitValue = means[splitAxis];
//sort leafNodes so all values larger then splitValue comes first, and smaller values start from 'splitIndex'.
for (i=startIndex;i<endIndex;i++)
{
- btVector3 center = 0.5f*(leafNodes[i].m_aabbMax+leafNodes[i].m_aabbMin);
+ btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
if (center[splitAxis] > splitValue)
{
//swap
- btOptimizedBvhNode tmp = leafNodes[i];
- leafNodes[i] = leafNodes[splitIndex];
- leafNodes[splitIndex] = tmp;
+ swapLeafNodes(i,splitIndex);
splitIndex++;
}
}
- if ((splitIndex==startIndex) || (splitIndex == (endIndex-1)))
+
+ //if the splitIndex causes unbalanced trees, fix this by using the center in between startIndex and endIndex
+ //otherwise the tree-building might fail due to stack-overflows in certain cases.
+ //unbalanced1 is unsafe: it can cause stack overflows
+ //bool unbalanced1 = ((splitIndex==startIndex) || (splitIndex == (endIndex-1)));
+
+ //unbalanced2 should work too: always use center (perfect balanced trees)
+ //bool unbalanced2 = true;
+
+ //this should be safe too:
+ int rangeBalancedIndices = numIndices/3;
+ bool unbalanced = ((splitIndex<=(startIndex+rangeBalancedIndices)) || (splitIndex >=(endIndex-1-rangeBalancedIndices)));
+
+ if (unbalanced)
{
splitIndex = startIndex+ (numIndices>>1);
}
+
+ bool unbal = (splitIndex==startIndex) || (splitIndex == (endIndex));
+ btAssert(!unbal);
+
return splitIndex;
}
-int btOptimizedBvh::calcSplittingAxis(NodeArray& leafNodes,int startIndex,int endIndex)
+int btOptimizedBvh::calcSplittingAxis(int startIndex,int endIndex)
{
int i;
- btVector3 means(0.f,0.f,0.f);
- btVector3 variance(0.f,0.f,0.f);
+ btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
+ btVector3 variance(btScalar(0.),btScalar(0.),btScalar(0.));
int numIndices = endIndex-startIndex;
for (i=startIndex;i<endIndex;i++)
{
- btVector3 center = 0.5f*(leafNodes[i].m_aabbMax+leafNodes[i].m_aabbMin);
+ btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
means+=center;
}
- means *= (1.f/(float)numIndices);
+ means *= (btScalar(1.)/(btScalar)numIndices);
for (i=startIndex;i<endIndex;i++)
{
- btVector3 center = 0.5f*(leafNodes[i].m_aabbMax+leafNodes[i].m_aabbMin);
+ btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
btVector3 diff2 = center-means;
diff2 = diff2 * diff2;
variance += diff2;
}
- variance *= (1.f/ ((float)numIndices-1) );
+ variance *= (btScalar(1.)/ ((btScalar)numIndices-1) );
return variance.maxAxis();
}
@@ -208,11 +568,83 @@ void btOptimizedBvh::reportAabbOverlappingNodex(btNodeOverlapCallback* nodeCallb
{
//either choose recursive traversal (walkTree) or stackless (walkStacklessTree)
- //walkTree(m_rootNode1,nodeCallback,aabbMin,aabbMax);
- walkStacklessTree(m_rootNode1,nodeCallback,aabbMin,aabbMax);
+ if (m_useQuantization)
+ {
+ ///quantize query AABB
+ unsigned short int quantizedQueryAabbMin[3];
+ unsigned short int quantizedQueryAabbMax[3];
+ quantizeWithClamp(quantizedQueryAabbMin,aabbMin);
+ quantizeWithClamp(quantizedQueryAabbMax,aabbMax);
+
+ switch (m_traversalMode)
+ {
+ case TRAVERSAL_STACKLESS:
+ walkStacklessQuantizedTree(nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax,0,m_curNodeIndex);
+ break;
+ case TRAVERSAL_STACKLESS_CACHE_FRIENDLY:
+ walkStacklessQuantizedTreeCacheFriendly(nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+ break;
+ case TRAVERSAL_RECURSIVE:
+ {
+ const btQuantizedBvhNode* rootNode = &m_quantizedContiguousNodes[0];
+ walkRecursiveQuantizedTreeAgainstQueryAabb(rootNode,nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+ }
+ break;
+ default:
+ //unsupported
+ btAssert(0);
+ }
+ } else
+ {
+ walkStacklessTree(nodeCallback,aabbMin,aabbMax);
+ }
}
+
+int maxIterations = 0;
+
+void btOptimizedBvh::walkStacklessTree(btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const
+{
+ btAssert(!m_useQuantization);
+
+ const btOptimizedBvhNode* rootNode = &m_contiguousNodes[0];
+ int escapeIndex, curIndex = 0;
+ int walkIterations = 0;
+ bool aabbOverlap, isLeafNode;
+
+ while (curIndex < m_curNodeIndex)
+ {
+ //catch bugs in tree data
+ assert (walkIterations < m_curNodeIndex);
+
+ walkIterations++;
+ aabbOverlap = TestAabbAgainstAabb2(aabbMin,aabbMax,rootNode->m_aabbMinOrg,rootNode->m_aabbMaxOrg);
+ isLeafNode = rootNode->m_escapeIndex == -1;
+
+ if (isLeafNode && aabbOverlap)
+ {
+ nodeCallback->processNode(rootNode->m_subPart,rootNode->m_triangleIndex);
+ }
+
+ if (aabbOverlap || isLeafNode)
+ {
+ rootNode++;
+ curIndex++;
+ } else
+ {
+ escapeIndex = rootNode->m_escapeIndex;
+ rootNode += escapeIndex;
+ curIndex += escapeIndex;
+ }
+ }
+ if (maxIterations < walkIterations)
+ maxIterations = walkIterations;
+
+}
+
+/*
+///this was the original recursive traversal, before we optimized towards stackless traversal
void btOptimizedBvh::walkTree(btOptimizedBvhNode* rootNode,btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const
{
bool isLeafNode, aabbOverlap = TestAabbAgainstAabb2(aabbMin,aabbMax,rootNode->m_aabbMin,rootNode->m_aabbMax);
@@ -230,27 +662,82 @@ void btOptimizedBvh::walkTree(btOptimizedBvhNode* rootNode,btNodeOverlapCallback
}
}
+*/
-int maxIterations = 0;
+void btOptimizedBvh::walkRecursiveQuantizedTreeAgainstQueryAabb(const btQuantizedBvhNode* currentNode,btNodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax) const
+{
+ btAssert(m_useQuantization);
+
+ bool aabbOverlap, isLeafNode;
-void btOptimizedBvh::walkStacklessTree(btOptimizedBvhNode* rootNode,btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const
+ aabbOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,currentNode->m_quantizedAabbMin,currentNode->m_quantizedAabbMax);
+ isLeafNode = currentNode->isLeafNode();
+
+ if (aabbOverlap)
+ {
+ if (isLeafNode)
+ {
+ nodeCallback->processNode(0,currentNode->getTriangleIndex());
+ } else
+ {
+ //process left and right children
+ const btQuantizedBvhNode* leftChildNode = currentNode+1;
+ walkRecursiveQuantizedTreeAgainstQueryAabb(leftChildNode,nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+
+ const btQuantizedBvhNode* rightChildNode = leftChildNode->isLeafNode() ? leftChildNode+1:leftChildNode+leftChildNode->getEscapeIndex();
+ walkRecursiveQuantizedTreeAgainstQueryAabb(rightChildNode,nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax);
+ }
+ }
+}
+
+
+
+
+
+
+
+void btOptimizedBvh::walkStacklessQuantizedTree(btNodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax,int startNodeIndex,int endNodeIndex) const
{
- int escapeIndex, curIndex = 0;
+ btAssert(m_useQuantization);
+
+ int curIndex = startNodeIndex;
int walkIterations = 0;
+ int subTreeSize = endNodeIndex - startNodeIndex;
+
+ const btQuantizedBvhNode* rootNode = &m_quantizedContiguousNodes[startNodeIndex];
+ int escapeIndex;
+
bool aabbOverlap, isLeafNode;
- while (curIndex < m_curNodeIndex)
+ while (curIndex < endNodeIndex)
{
+
+//#define VISUALLY_ANALYZE_BVH 1
+#ifdef VISUALLY_ANALYZE_BVH
+ //some code snippet to debugDraw aabb, to visually analyze bvh structure
+ static int drawPatch = 0;
+ //need some global access to a debugDrawer
+ extern btIDebugDraw* debugDrawerPtr;
+ if (curIndex==drawPatch)
+ {
+ btVector3 aabbMin,aabbMax;
+ aabbMin = unQuantize(rootNode->m_quantizedAabbMin);
+ aabbMax = unQuantize(rootNode->m_quantizedAabbMax);
+ btVector3 color(1,0,0);
+ debugDrawerPtr->drawAabb(aabbMin,aabbMax,color);
+ }
+#endif//VISUALLY_ANALYZE_BVH
+
//catch bugs in tree data
- assert (walkIterations < m_curNodeIndex);
+ assert (walkIterations < subTreeSize);
walkIterations++;
- aabbOverlap = TestAabbAgainstAabb2(aabbMin,aabbMax,rootNode->m_aabbMin,rootNode->m_aabbMax);
- isLeafNode = (!rootNode->m_leftChild && !rootNode->m_rightChild);
+ aabbOverlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,rootNode->m_quantizedAabbMin,rootNode->m_quantizedAabbMax);
+ isLeafNode = rootNode->isLeafNode();
if (isLeafNode && aabbOverlap)
{
- nodeCallback->processNode(rootNode);
+ nodeCallback->processNode(0,rootNode->getTriangleIndex());
}
if (aabbOverlap || isLeafNode)
@@ -259,21 +746,100 @@ void btOptimizedBvh::walkStacklessTree(btOptimizedBvhNode* rootNode,btNodeOverla
curIndex++;
} else
{
- escapeIndex = rootNode->m_escapeIndex;
+ escapeIndex = rootNode->getEscapeIndex();
rootNode += escapeIndex;
curIndex += escapeIndex;
}
-
}
-
if (maxIterations < walkIterations)
maxIterations = walkIterations;
}
+//This traversal can be called from Playstation 3 SPU
+void btOptimizedBvh::walkStacklessQuantizedTreeCacheFriendly(btNodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax) const
+{
+ btAssert(m_useQuantization);
+
+ int i;
+
+
+ for (i=0;i<this->m_SubtreeHeaders.size();i++)
+ {
+ const btBvhSubtreeInfo& subtree = m_SubtreeHeaders[i];
+
+ bool overlap = testQuantizedAabbAgainstQuantizedAabb(quantizedQueryAabbMin,quantizedQueryAabbMax,subtree.m_quantizedAabbMin,subtree.m_quantizedAabbMax);
+ if (overlap)
+ {
+ walkStacklessQuantizedTree(nodeCallback,quantizedQueryAabbMin,quantizedQueryAabbMax,
+ subtree.m_rootNodeIndex,
+ subtree.m_rootNodeIndex+subtree.m_subtreeSize);
+ }
+ }
+}
+
+
+
void btOptimizedBvh::reportSphereOverlappingNodex(btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const
{
+ (void)nodeCallback;
+ (void)aabbMin;
+ (void)aabbMax;
+ //not yet, please use aabb
+ btAssert(0);
+}
+
+
+void btOptimizedBvh::quantizeWithClamp(unsigned short* out, const btVector3& point) const
+{
+
+ btAssert(m_useQuantization);
+
+ btVector3 clampedPoint(point);
+ clampedPoint.setMax(m_bvhAabbMin);
+ clampedPoint.setMin(m_bvhAabbMax);
+
+ btVector3 v = (clampedPoint - m_bvhAabbMin) * m_bvhQuantization;
+ out[0] = (unsigned short)(v.getX()+0.5f);
+ out[1] = (unsigned short)(v.getY()+0.5f);
+ out[2] = (unsigned short)(v.getZ()+0.5f);
+}
+
+btVector3 btOptimizedBvh::unQuantize(const unsigned short* vecIn) const
+{
+ btVector3 vecOut;
+ vecOut.setValue(
+ (btScalar)(vecIn[0]) / (m_bvhQuantization.getX()),
+ (btScalar)(vecIn[1]) / (m_bvhQuantization.getY()),
+ (btScalar)(vecIn[2]) / (m_bvhQuantization.getZ()));
+ vecOut += m_bvhAabbMin;
+ return vecOut;
+}
+
+void btOptimizedBvh::swapLeafNodes(int i,int splitIndex)
+{
+ if (m_useQuantization)
+ {
+ btQuantizedBvhNode tmp = m_quantizedLeafNodes[i];
+ m_quantizedLeafNodes[i] = m_quantizedLeafNodes[splitIndex];
+ m_quantizedLeafNodes[splitIndex] = tmp;
+ } else
+ {
+ btOptimizedBvhNode tmp = m_leafNodes[i];
+ m_leafNodes[i] = m_leafNodes[splitIndex];
+ m_leafNodes[splitIndex] = tmp;
+ }
}
+void btOptimizedBvh::assignInternalNodeFromLeafNode(int internalNode,int leafNodeIndex)
+{
+ if (m_useQuantization)
+ {
+ m_quantizedContiguousNodes[internalNode] = m_quantizedLeafNodes[leafNodeIndex];
+ } else
+ {
+ m_contiguousNodes[internalNode] = m_leafNodes[leafNodeIndex];
+ }
+}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
index cb76cb23340..d5159586344 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
@@ -17,103 +17,313 @@ subject to the following restrictions:
#define OPTIMIZED_BVH_H
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btVector3.h"
//http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrf__m128.asp
-#include <vector>
-
class btStridingMeshInterface;
-/// btOptimizedBvhNode contains both internal and leaf node information.
-/// It hasn't been optimized yet for storage. Some obvious optimizations are:
-/// Removal of the pointers (can already be done, they are not used for traversal)
-/// and storing aabbmin/max as quantized integers.
-/// 'subpart' doesn't need an integer either. It allows to re-use graphics triangle
-/// meshes stored in a non-uniform way (like batches/subparts of triangle-fans
-ATTRIBUTE_ALIGNED16 (struct btOptimizedBvhNode)
-{
+//Note: currently we have 16 bytes per quantized node
+#define MAX_SUBTREE_SIZE_IN_BYTES 2048
- btVector3 m_aabbMin;
- btVector3 m_aabbMax;
-//these 2 pointers are obsolete, the stackless traversal just uses the escape index
- btOptimizedBvhNode* m_leftChild;
- btOptimizedBvhNode* m_rightChild;
+///btQuantizedBvhNode is a compressed aabb node, 16 bytes.
+///Node can be used for leafnode or internal node. Leafnodes can point to 32-bit triangle index (non-negative range).
+ATTRIBUTE_ALIGNED16 (struct) btQuantizedBvhNode
+{
+
+ //12 bytes
+ unsigned short int m_quantizedAabbMin[3];
+ unsigned short int m_quantizedAabbMax[3];
+ //4 bytes
+ int m_escapeIndexOrTriangleIndex;
+
+ bool isLeafNode() const
+ {
+ //skipindex is negative (internal node), triangleindex >=0 (leafnode)
+ return (m_escapeIndexOrTriangleIndex >= 0);
+ }
+ int getEscapeIndex() const
+ {
+ btAssert(!isLeafNode());
+ return -m_escapeIndexOrTriangleIndex;
+ }
+ int getTriangleIndex() const
+ {
+ btAssert(isLeafNode());
+ return m_escapeIndexOrTriangleIndex;
+ }
+}
+;
+/// btOptimizedBvhNode contains both internal and leaf node information.
+/// Total node size is 44 bytes / node. You can use the compressed version of 16 bytes.
+ATTRIBUTE_ALIGNED16 (struct) btOptimizedBvhNode
+{
+ //32 bytes
+ btVector3 m_aabbMinOrg;
+ btVector3 m_aabbMaxOrg;
+
+ //4
int m_escapeIndex;
+ //8
//for child nodes
int m_subPart;
int m_triangleIndex;
+ int m_padding[5];//bad, due to alignment
+
};
+
+///btBvhSubtreeInfo provides info to gather a subtree of limited size
+ATTRIBUTE_ALIGNED16(class) btBvhSubtreeInfo
+{
+public:
+ //12 bytes
+ unsigned short int m_quantizedAabbMin[3];
+ unsigned short int m_quantizedAabbMax[3];
+ //4 bytes, points to the root of the subtree
+ int m_rootNodeIndex;
+ //4 bytes
+ int m_subtreeSize;
+ int m_padding[3];
+
+
+ void setAabbFromQuantizeNode(const btQuantizedBvhNode& quantizedNode)
+ {
+ m_quantizedAabbMin[0] = quantizedNode.m_quantizedAabbMin[0];
+ m_quantizedAabbMin[1] = quantizedNode.m_quantizedAabbMin[1];
+ m_quantizedAabbMin[2] = quantizedNode.m_quantizedAabbMin[2];
+ m_quantizedAabbMax[0] = quantizedNode.m_quantizedAabbMax[0];
+ m_quantizedAabbMax[1] = quantizedNode.m_quantizedAabbMax[1];
+ m_quantizedAabbMax[2] = quantizedNode.m_quantizedAabbMax[2];
+ }
+}
+;
+
+
class btNodeOverlapCallback
{
public:
virtual ~btNodeOverlapCallback() {};
- virtual void processNode(const btOptimizedBvhNode* node) = 0;
+ virtual void processNode(int subPart, int triangleIndex) = 0;
};
-#include "LinearMath/btAlignedAllocator.h"
-#include "LinearMath/btAlignedObjectArray.h"
+#include "../../LinearMath/btAlignedAllocator.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
-//typedef std::vector< unsigned , allocator_type > container_type;
-const unsigned size = (1 << 20);
-typedef btAlignedAllocator< btOptimizedBvhNode , size > allocator_type;
-//typedef btAlignedObjectArray<btOptimizedBvhNode, allocator_type> NodeArray;
+///for code readability:
typedef btAlignedObjectArray<btOptimizedBvhNode> NodeArray;
+typedef btAlignedObjectArray<btQuantizedBvhNode> QuantizedNodeArray;
+typedef btAlignedObjectArray<btBvhSubtreeInfo> BvhSubtreeInfoArray;
///OptimizedBvh store an AABB tree that can be quickly traversed on CPU (and SPU,GPU in future)
-class btOptimizedBvh
+ATTRIBUTE_ALIGNED16(class) btOptimizedBvh
{
NodeArray m_leafNodes;
+ NodeArray m_contiguousNodes;
- btOptimizedBvhNode* m_rootNode1;
+ QuantizedNodeArray m_quantizedLeafNodes;
+
+ QuantizedNodeArray m_quantizedContiguousNodes;
- btOptimizedBvhNode* m_contiguousNodes;
int m_curNodeIndex;
- int m_numNodes;
+ //quantization data
+ bool m_useQuantization;
+ btVector3 m_bvhAabbMin;
+ btVector3 m_bvhAabbMax;
+ btVector3 m_bvhQuantization;
+ enum btTraversalMode
+ {
+ TRAVERSAL_STACKLESS = 0,
+ TRAVERSAL_STACKLESS_CACHE_FRIENDLY,
+ TRAVERSAL_RECURSIVE
+ };
-public:
- btOptimizedBvh();
+ btTraversalMode m_traversalMode;
- virtual ~btOptimizedBvh();
- void build(btStridingMeshInterface* triangles);
- btOptimizedBvhNode* buildTree (NodeArray& leafNodes,int startIndex,int endIndex);
- int calcSplittingAxis(NodeArray& leafNodes,int startIndex,int endIndex);
+ BvhSubtreeInfoArray m_SubtreeHeaders;
+
+
+ ///two versions, one for quantized and normal nodes. This allows code-reuse while maintaining readability (no template/macro!)
+ ///this might be refactored into a virtual, it is usually not calculated at run-time
+ void setInternalNodeAabbMin(int nodeIndex, const btVector3& aabbMin)
+ {
+ if (m_useQuantization)
+ {
+ quantizeWithClamp(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[0] ,aabbMin);
+ } else
+ {
+ m_contiguousNodes[nodeIndex].m_aabbMinOrg = aabbMin;
+
+ }
+ }
+ void setInternalNodeAabbMax(int nodeIndex,const btVector3& aabbMax)
+ {
+ if (m_useQuantization)
+ {
+ quantizeWithClamp(&m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[0],aabbMax);
+ } else
+ {
+ m_contiguousNodes[nodeIndex].m_aabbMaxOrg = aabbMax;
+ }
+ }
+
+ btVector3 getAabbMin(int nodeIndex) const
+ {
+ if (m_useQuantization)
+ {
+ return unQuantize(&m_quantizedLeafNodes[nodeIndex].m_quantizedAabbMin[0]);
+ }
+ //non-quantized
+ return m_leafNodes[nodeIndex].m_aabbMinOrg;
+
+ }
+ btVector3 getAabbMax(int nodeIndex) const
+ {
+ if (m_useQuantization)
+ {
+ return unQuantize(&m_quantizedLeafNodes[nodeIndex].m_quantizedAabbMax[0]);
+ }
+ //non-quantized
+ return m_leafNodes[nodeIndex].m_aabbMaxOrg;
+
+ }
+
+ void setQuantizationValues(const btVector3& bvhAabbMin,const btVector3& bvhAabbMax,btScalar quantizationMargin=btScalar(1.0));
+
+ void setInternalNodeEscapeIndex(int nodeIndex, int escapeIndex)
+ {
+ if (m_useQuantization)
+ {
+ m_quantizedContiguousNodes[nodeIndex].m_escapeIndexOrTriangleIndex = -escapeIndex;
+ }
+ else
+ {
+ m_contiguousNodes[nodeIndex].m_escapeIndex = escapeIndex;
+ }
+
+ }
+
+ void mergeInternalNodeAabb(int nodeIndex,const btVector3& newAabbMin,const btVector3& newAabbMax)
+ {
+ if (m_useQuantization)
+ {
+ unsigned short int quantizedAabbMin[3];
+ unsigned short int quantizedAabbMax[3];
+ quantizeWithClamp(quantizedAabbMin,newAabbMin);
+ quantizeWithClamp(quantizedAabbMax,newAabbMax);
+ for (int i=0;i<3;i++)
+ {
+ if (m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[i] > quantizedAabbMin[i])
+ m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMin[i] = quantizedAabbMin[i];
+
+ if (m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[i] < quantizedAabbMax[i])
+ m_quantizedContiguousNodes[nodeIndex].m_quantizedAabbMax[i] = quantizedAabbMax[i];
+
+ }
+ } else
+ {
+ //non-quantized
+ m_contiguousNodes[nodeIndex].m_aabbMinOrg.setMin(newAabbMin);
+ m_contiguousNodes[nodeIndex].m_aabbMaxOrg.setMax(newAabbMax);
+ }
+ }
+
+ void swapLeafNodes(int firstIndex,int secondIndex);
+
+ void assignInternalNodeFromLeafNode(int internalNode,int leafNodeIndex);
+
+protected:
- int sortAndCalcSplittingIndex(NodeArray& leafNodes,int startIndex,int endIndex,int splitAxis);
- void walkTree(btOptimizedBvhNode* rootNode,btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const;
+
+ void buildTree (int startIndex,int endIndex);
+
+ int calcSplittingAxis(int startIndex,int endIndex);
+
+ int sortAndCalcSplittingIndex(int startIndex,int endIndex,int splitAxis);
- void walkStacklessTree(btOptimizedBvhNode* rootNode,btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const;
+ void walkStacklessTree(btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const;
+
+ void walkStacklessQuantizedTree(btNodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax,int startNodeIndex,int endNodeIndex) const;
+
+ ///tree traversal designed for small-memory processors like PS3 SPU
+ void walkStacklessQuantizedTreeCacheFriendly(btNodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax) const;
+
+ ///use the 16-byte stackless 'skipindex' node tree to do a recursive traversal
+ void walkRecursiveQuantizedTreeAgainstQueryAabb(const btQuantizedBvhNode* currentNode,btNodeOverlapCallback* nodeCallback,unsigned short int* quantizedQueryAabbMin,unsigned short int* quantizedQueryAabbMax) const;
+
+ ///use the 16-byte stackless 'skipindex' node tree to do a recursive traversal
+ void walkRecursiveQuantizedTreeAgainstQuantizedTree(const btQuantizedBvhNode* treeNodeA,const btQuantizedBvhNode* treeNodeB,btNodeOverlapCallback* nodeCallback) const;
- //OptimizedBvhNode* GetRootNode() { return m_rootNode1;}
+ inline bool testQuantizedAabbAgainstQuantizedAabb(unsigned short int* aabbMin1,unsigned short int* aabbMax1,const unsigned short int* aabbMin2,const unsigned short int* aabbMax2) const
+ {
+ bool overlap = true;
+ overlap = (aabbMin1[0] > aabbMax2[0] || aabbMax1[0] < aabbMin2[0]) ? false : overlap;
+ overlap = (aabbMin1[2] > aabbMax2[2] || aabbMax1[2] < aabbMin2[2]) ? false : overlap;
+ overlap = (aabbMin1[1] > aabbMax2[1] || aabbMax1[1] < aabbMin2[1]) ? false : overlap;
+ return overlap;
+ }
+
+ void updateSubtreeHeaders(int leftChildNodexIndex,int rightChildNodexIndex);
+
+public:
+ btOptimizedBvh();
+
+ virtual ~btOptimizedBvh();
- int getNumNodes() { return m_numNodes;}
+ void build(btStridingMeshInterface* triangles,bool useQuantizedAabbCompression, const btVector3& bvhAabbMin, const btVector3& bvhAabbMax);
void reportAabbOverlappingNodex(btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const;
void reportSphereOverlappingNodex(btNodeOverlapCallback* nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const;
+ void quantizeWithClamp(unsigned short* out, const btVector3& point) const;
+
+ btVector3 unQuantize(const unsigned short* vecIn) const;
-};
+ ///setTraversalMode let's you choose between stackless, recursive or stackless cache friendly tree traversal. Note this is only implemented for quantized trees.
+ void setTraversalMode(btTraversalMode traversalMode)
+ {
+ m_traversalMode = traversalMode;
+ }
+
+ void refit(btStridingMeshInterface* triangles);
+
+ void refitPartial(btStridingMeshInterface* triangles,const btVector3& aabbMin, const btVector3& aabbMax);
+
+ void updateBvhNodes(btStridingMeshInterface* meshInterface,int firstNode,int endNode,int index);
+
+
+ QuantizedNodeArray& getQuantizedNodeArray()
+ {
+ return m_quantizedContiguousNodes;
+ }
+
+ BvhSubtreeInfoArray& getSubtreeInfoArray()
+ {
+ return m_SubtreeHeaders;
+ }
+
+}
+;
#endif //OPTIMIZED_BVH_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
index 6f2272cc454..bbc4ba62af6 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
@@ -16,7 +16,10 @@ subject to the following restrictions:
#include <BulletCollision/CollisionShapes/btPolyhedralConvexShape.h>
btPolyhedralConvexShape::btPolyhedralConvexShape()
-:m_optionalHull(0)
+:m_localAabbMin(1,1,1),
+m_localAabbMax(-1,-1,-1),
+m_isLocalAabbValid(false),
+m_optionalHull(0)
{
}
@@ -28,16 +31,16 @@ btVector3 btPolyhedralConvexShape::localGetSupportingVertexWithoutMargin(const b
int i;
btVector3 supVec(0,0,0);
- btScalar maxDot(-1e30f);
+ btScalar maxDot(btScalar(-1e30));
btVector3 vec = vec0;
btScalar lenSqr = vec.length2();
- if (lenSqr < 0.0001f)
+ if (lenSqr < btScalar(0.0001))
{
vec.setValue(1,0,0);
} else
{
- float rlen = 1.f / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
vec *= rlen;
}
@@ -68,7 +71,7 @@ void btPolyhedralConvexShape::batchedUnitVectorGetSupportingVertexWithoutMargin(
for (i=0;i<numVectors;i++)
{
- supportVerticesOut[i][3] = -1e30f;
+ supportVerticesOut[i][3] = btScalar(-1e30);
}
for (int j=0;j<numVectors;j++)
@@ -96,23 +99,50 @@ void btPolyhedralConvexShape::calculateLocalInertia(btScalar mass,btVector3& ine
{
//not yet, return box inertia
- float margin = getMargin();
+ btScalar margin = getMargin();
btTransform ident;
ident.setIdentity();
btVector3 aabbMin,aabbMax;
getAabb(ident,aabbMin,aabbMax);
- btVector3 halfExtents = (aabbMax-aabbMin)*0.5f;
+ btVector3 halfExtents = (aabbMax-aabbMin)*btScalar(0.5);
- btScalar lx=2.f*(halfExtents.x()+margin);
- btScalar ly=2.f*(halfExtents.y()+margin);
- btScalar lz=2.f*(halfExtents.z()+margin);
+ btScalar lx=btScalar(2.)*(halfExtents.x()+margin);
+ btScalar ly=btScalar(2.)*(halfExtents.y()+margin);
+ btScalar lz=btScalar(2.)*(halfExtents.z()+margin);
const btScalar x2 = lx*lx;
const btScalar y2 = ly*ly;
const btScalar z2 = lz*lz;
- const btScalar scaledmass = mass * 0.08333333f;
+ const btScalar scaledmass = mass * btScalar(0.08333333);
inertia = scaledmass * (btVector3(y2+z2,x2+z2,x2+y2));
}
+
+
+void btPolyhedralConvexShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
+{
+ getNonvirtualAabb(trans,aabbMin,aabbMax,getMargin());
+}
+
+
+
+
+void btPolyhedralConvexShape::recalcLocalAabb()
+{
+ m_isLocalAabbValid = true;
+
+ 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;
+ }
+}
+
+
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
index a404504ba86..c35f7512663 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h
@@ -16,15 +16,20 @@ subject to the following restrictions:
#ifndef BU_SHAPE
#define BU_SHAPE
-#include <LinearMath/btPoint3.h>
-#include <LinearMath/btMatrix3x3.h>
-#include <BulletCollision/CollisionShapes/btConvexShape.h>
+#include "../../LinearMath/btPoint3.h"
+#include "../../LinearMath/btMatrix3x3.h"
+#include "btConvexShape.h"
///PolyhedralConvexShape is an interface class for feature based (vertex/edge/face) convex shapes.
class btPolyhedralConvexShape : public btConvexShape
{
+protected:
+ btVector3 m_localAabbMin;
+ btVector3 m_localAabbMax;
+ bool m_isLocalAabbValid;
+
public:
btPolyhedralConvexShape();
@@ -36,6 +41,39 @@ public:
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia);
+ inline void getNonvirtualAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax, btScalar margin) const
+ {
+
+ //lazy evaluation of local aabb
+ btAssert(m_isLocalAabbValid);
+
+ btAssert(m_localAabbMin.getX() <= m_localAabbMax.getX());
+ btAssert(m_localAabbMin.getY() <= m_localAabbMax.getY());
+ btAssert(m_localAabbMin.getZ() <= m_localAabbMax.getZ());
+
+
+ btVector3 localHalfExtents = btScalar(0.5)*(m_localAabbMax-m_localAabbMin);
+ btVector3 localCenter = btScalar(0.5)*(m_localAabbMax+m_localAabbMin);
+
+ btMatrix3x3 abs_b = trans.getBasis().absolute();
+
+ btPoint3 center = trans(localCenter);
+
+ btVector3 extent = btVector3(abs_b[0].dot(localHalfExtents),
+ abs_b[1].dot(localHalfExtents),
+ abs_b[2].dot(localHalfExtents));
+ extent += btVector3(margin,margin,margin);
+
+ aabbMin = center - extent;
+ aabbMax = center + extent;
+
+
+ }
+
+
+ virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const;
+
+ void recalcLocalAabb();
virtual int getNumVertices() const = 0 ;
virtual int getNumEdges() const = 0;
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp
index 39e458c0f22..ca65dd03f3e 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.cpp
@@ -26,14 +26,17 @@ btSphereShape ::btSphereShape (btScalar radius)
btVector3 btSphereShape::localGetSupportingVertexWithoutMargin(const btVector3& vec)const
{
- return btVector3(0.f,0.f,0.f);
+ (void)vec;
+ return btVector3(btScalar(0.),btScalar(0.),btScalar(0.));
}
void btSphereShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
{
+ (void)vectors;
+
for (int i=0;i<numVectors;i++)
{
- supportVerticesOut[i].setValue(0.f,0.f,0.f);
+ supportVerticesOut[i].setValue(btScalar(0.),btScalar(0.),btScalar(0.));
}
}
@@ -46,7 +49,7 @@ btVector3 btSphereShape::localGetSupportingVertex(const btVector3& vec)const
btVector3 vecnorm = vec;
if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
{
- vecnorm.setValue(-1.f,-1.f,-1.f);
+ vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
}
vecnorm.normalize();
supVertex+= getMargin() * vecnorm;
@@ -67,8 +70,8 @@ void btSphereShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& a
void btSphereShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
{
- btScalar elem = 0.4f * mass * getMargin()*getMargin();
- inertia[0] = inertia[1] = inertia[2] = elem;
+ btScalar elem = btScalar(0.4) * mass * getMargin()*getMargin();
+ inertia.setValue(elem,elem,elem);
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h
index 2db6a872b40..66521664087 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btSphereShape.h
@@ -17,10 +17,10 @@ subject to the following restrictions:
#define SPHERE_MINKOWSKI_H
#include "btConvexShape.h"
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" // for the types
+#include "../BroadphaseCollision/btBroadphaseProxy.h" // for the types
///btSphereShape implements an implicit (getSupportingVertex) Sphere
-class btSphereShape : public btConvexShape
+ATTRIBUTE_ALIGNED16(class) btSphereShape : public btConvexShape
{
@@ -45,11 +45,11 @@ public:
//debugging
virtual char* getName()const {return "SPHERE";}
- virtual void setMargin(float margin)
+ virtual void setMargin(btScalar margin)
{
btConvexShape::setMargin(margin);
}
- virtual float getMargin() const
+ virtual btScalar getMargin() const
{
//to improve gjk behaviour, use radius+margin as the full margin, so never get into the penetration case
//this means, non-uniform scaling is not supported anymore
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
index 8c7022ba83b..4fbaafa1b93 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
@@ -21,7 +21,7 @@ subject to the following restrictions:
btStaticPlaneShape::btStaticPlaneShape(const btVector3& planeNormal,btScalar planeConstant)
:m_planeNormal(planeNormal),
m_planeConstant(planeConstant),
-m_localScaling(0.f,0.f,0.f)
+m_localScaling(btScalar(0.),btScalar(0.),btScalar(0.))
{
}
@@ -34,16 +34,19 @@ btStaticPlaneShape::~btStaticPlaneShape()
void btStaticPlaneShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const
{
- btVector3 infvec (1e30f,1e30f,1e30f);
+ (void)t;
+ /*
+ btVector3 infvec (btScalar(1e30),btScalar(1e30),btScalar(1e30));
btVector3 center = m_planeNormal*m_planeConstant;
aabbMin = center + infvec*m_planeNormal;
aabbMax = aabbMin;
aabbMin.setMin(center - infvec*m_planeNormal);
aabbMax.setMax(center - infvec*m_planeNormal);
+ */
- aabbMin.setValue(-1e30f,-1e30f,-1e30f);
- aabbMax.setValue(1e30f,1e30f,1e30f);
+ aabbMin.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ aabbMax.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
}
@@ -53,9 +56,9 @@ void btStaticPlaneShape::getAabb(const btTransform& t,btVector3& aabbMin,btVecto
void btStaticPlaneShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
{
- btVector3 halfExtents = (aabbMax - aabbMin) * 0.5f;
+ btVector3 halfExtents = (aabbMax - aabbMin) * btScalar(0.5);
btScalar radius = halfExtents.length();
- btVector3 center = (aabbMax + aabbMin) * 0.5f;
+ btVector3 center = (aabbMax + aabbMin) * btScalar(0.5);
//this is where the triangles are generated, given AABB and plane equation (normal/constant)
@@ -85,9 +88,11 @@ void btStaticPlaneShape::processAllTriangles(btTriangleCallback* callback,const
void btStaticPlaneShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
{
+ (void)mass;
+
//moving concave objects not supported
- inertia.setValue(0.f,0.f,0.f);
+ inertia.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
}
void btStaticPlaneShape::setLocalScaling(const btVector3& scaling)
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h
index 65b30e1ff06..f59cc0c3347 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef STATIC_PLANE_SHAPE_H
#define STATIC_PLANE_SHAPE_H
-#include "BulletCollision/CollisionShapes/btConcaveShape.h"
+#include "btConcaveShape.h"
///StaticPlaneShape simulates an 'infinite' plane by dynamically reporting triangles approximated by intersection of the plane with the AABB.
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
index 76b5859be7e..03ca1ae7736 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
@@ -23,6 +23,8 @@ btStridingMeshInterface::~btStridingMeshInterface()
void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleIndexCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
{
+ (void)aabbMin;
+ (void)aabbMax;
int numtotalphysicsverts = 0;
int part,graphicssubparts = getNumSubParts();
const unsigned char * vertexbase;
@@ -33,7 +35,7 @@ void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleInde
int stride,numverts,numtriangles;
int gfxindex;
btVector3 triangle[3];
- float* graphicsbase;
+ btScalar* graphicsbase;
btVector3 meshScaling = getScaling();
@@ -50,11 +52,11 @@ void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleInde
for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
{
int* tri_indices= (int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
+ graphicsbase = (btScalar*)(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);
+ graphicsbase = (btScalar*)(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);
+ 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);
}
@@ -65,11 +67,11 @@ void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleInde
for (gfxindex=0;gfxindex<numtriangles;gfxindex++)
{
short int* tri_indices= (short int*)(indexbase+gfxindex*indexstride);
- graphicsbase = (float*)(vertexbase+tri_indices[0]*stride);
+ graphicsbase = (btScalar*)(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);
+ graphicsbase = (btScalar*)(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);
+ 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);
}
@@ -83,3 +85,40 @@ void btStridingMeshInterface::InternalProcessAllTriangles(btInternalTriangleInde
}
}
+void btStridingMeshInterface::calculateAabbBruteForce(btVector3& aabbMin,btVector3& aabbMax)
+{
+
+ struct AabbCalculationCallback : public btInternalTriangleIndexCallback
+ {
+ btVector3 m_aabbMin;
+ btVector3 m_aabbMax;
+
+ AabbCalculationCallback()
+ {
+ m_aabbMin.setValue(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ m_aabbMax.setValue(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
+ }
+
+ virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex)
+ {
+ (void)partId;
+ (void)triangleIndex;
+
+ m_aabbMin.setMin(triangle[0]);
+ m_aabbMax.setMax(triangle[0]);
+ m_aabbMin.setMin(triangle[1]);
+ m_aabbMax.setMax(triangle[1]);
+ m_aabbMin.setMin(triangle[2]);
+ m_aabbMax.setMax(triangle[2]);
+ }
+ };
+
+ //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));
+ InternalProcessAllTriangles(&aabbCallback,aabbMin,aabbMax);
+
+ aabbMin = aabbCallback.m_aabbMin;
+ aabbMax = aabbCallback.m_aabbMax;
+} \ No newline at end of file
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h
index 830cbb28200..d7b354b7855 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef STRIDING_MESHINTERFACE_H
#define STRIDING_MESHINTERFACE_H
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btVector3.h"
#include "btTriangleCallback.h"
/// PHY_ScalarType enumerates possible scalar types.
@@ -38,7 +38,7 @@ class btStridingMeshInterface
btVector3 m_scaling;
public:
- btStridingMeshInterface() :m_scaling(1.f,1.f,1.f)
+ btStridingMeshInterface() :m_scaling(btScalar(1.),btScalar(1.),btScalar(1.))
{
}
@@ -49,6 +49,8 @@ class btStridingMeshInterface
void InternalProcessAllTriangles(btInternalTriangleIndexCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const;
+ ///brute force method to calculate aabb
+ void calculateAabbBruteForce(btVector3& aabbMin,btVector3& aabbMax);
/// get read and write access to a subpart of a triangle mesh
/// this subpart has a continuous array of vertices and indices
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
index 7cb40c4fac1..3aa1eda9964 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
@@ -58,6 +58,8 @@ btBU_Simplex1to4::btBU_Simplex1to4(const btPoint3& pt0,const btPoint3& pt1,const
void btBU_Simplex1to4::addVertex(const btPoint3& pt)
{
m_vertices[m_numVertices++] = pt;
+
+ recalcLocalAabb();
}
@@ -176,17 +178,17 @@ int btBU_Simplex1to4::getNumPlanes() const
}
-void btBU_Simplex1to4::getPlane(btVector3& planeNormal,btPoint3& planeSupport,int i) const
+void btBU_Simplex1to4::getPlane(btVector3&, btPoint3& ,int ) const
{
}
-int btBU_Simplex1to4::getIndex(int i) const
+int btBU_Simplex1to4::getIndex(int ) const
{
return 0;
}
-bool btBU_Simplex1to4::isInside(const btPoint3& pt,btScalar tolerance) const
+bool btBU_Simplex1to4::isInside(const btPoint3& ,btScalar ) const
{
return false;
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h
index 9e17a248f84..94bc4ec0fa5 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTetrahedronShape.h
@@ -17,8 +17,8 @@ subject to the following restrictions:
#define BU_SIMPLEX_1TO4_SHAPE
-#include <BulletCollision/CollisionShapes/btPolyhedralConvexShape.h>
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
+#include "btPolyhedralConvexShape.h"
+#include "../BroadphaseCollision/btBroadphaseProxy.h"
///BU_Simplex1to4 implements feature based and implicit simplex of up to 4 vertices (tetrahedron, triangle, line, vertex).
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h
index 9a623403846..3805c519d22 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleBuffer.h
@@ -17,8 +17,7 @@ subject to the following restrictions:
#define BT_TRIANGLE_BUFFER_H
#include "btTriangleCallback.h"
-//#include <vector>
-#include "LinearMath/btAlignedObjectArray.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
struct btTriangle
{
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h
index 7b2337498ec..fbb87bc4fd8 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleCallback.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef TRIANGLE_CALLBACK_H
#define TRIANGLE_CALLBACK_H
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btVector3.h"
class btTriangleCallback
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
index 7400d372bee..00847861cf1 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
@@ -15,15 +15,15 @@ subject to the following restrictions:
#include "btTriangleIndexVertexArray.h"
-btTriangleIndexVertexArray::btTriangleIndexVertexArray(int numTriangles,int* triangleIndexBase,int triangleIndexStride,int numVertices,float* vertexBase,int vertexStride)
+btTriangleIndexVertexArray::btTriangleIndexVertexArray(int numTriangles,int* triangleIndexBase,int triangleIndexStride,int numVertices,btScalar* vertexBase,int vertexStride)
{
btIndexedMesh mesh;
mesh.m_numTriangles = numTriangles;
- mesh.m_triangleIndexBase = triangleIndexBase;
+ mesh.m_triangleIndexBase = (const unsigned char *)triangleIndexBase;
mesh.m_triangleIndexStride = triangleIndexStride;
mesh.m_numVertices = numVertices;
- mesh.m_vertexBase = vertexBase;
+ mesh.m_vertexBase = (const unsigned char *)vertexBase;
mesh.m_vertexStride = vertexStride;
addIndexedMesh(mesh);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
index 3ec827c03d9..6ab6a762b39 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h
@@ -17,40 +17,44 @@ subject to the following restrictions:
#define BT_TRIANGLE_INDEX_VERTEX_ARRAY_H
#include "btStridingMeshInterface.h"
-#include <LinearMath/btAlignedObjectArray.h>
+#include "../../LinearMath/btAlignedObjectArray.h"
///IndexedMesh indexes into existing vertex and index arrays, in a similar way OpenGL glDrawElements
///instead of the number of indices, we pass the number of triangles
///todo: explain with pictures
-struct btIndexedMesh
- {
- int m_numTriangles;
- int* m_triangleIndexBase;
- int m_triangleIndexStride;
- int m_numVertices;
- float* m_vertexBase;
- int m_vertexStride;
- };
+ATTRIBUTE_ALIGNED16( struct) btIndexedMesh
+{
+ int m_numTriangles;
+ const unsigned char * m_triangleIndexBase;
+ int m_triangleIndexStride;
+ int m_numVertices;
+ const unsigned char * m_vertexBase;
+ int m_vertexStride;
+ int pad[2];
+}
+;
+
+
+typedef btAlignedObjectArray<btIndexedMesh> IndexedMeshArray;
///TriangleIndexVertexArray allows to use multiple meshes, by indexing into existing triangle/index arrays.
///Additional meshes can be added using addIndexedMesh
///No duplcate is made of the vertex/index data, it only indexes into external vertex/index arrays.
///So keep those arrays around during the lifetime of this btTriangleIndexVertexArray.
-class btTriangleIndexVertexArray : public btStridingMeshInterface
+ATTRIBUTE_ALIGNED16( class) btTriangleIndexVertexArray : public btStridingMeshInterface
{
- btAlignedObjectArray<btIndexedMesh> m_indexedMeshes;
+ IndexedMeshArray m_indexedMeshes;
+ int m_pad[3];
public:
-
-
btTriangleIndexVertexArray()
{
}
//just to be backwards compatible
- btTriangleIndexVertexArray(int numTriangleIndices,int* triangleIndexBase,int triangleIndexStride,int numVertices,float* vertexBase,int vertexStride);
+ btTriangleIndexVertexArray(int numTriangleIndices,int* triangleIndexBase,int triangleIndexStride,int numVertices,btScalar* vertexBase,int vertexStride);
void addIndexedMesh(const btIndexedMesh& mesh)
{
@@ -64,19 +68,30 @@ public:
/// unLockVertexBase finishes the access to a subpart of the triangle mesh
/// make a call to unLockVertexBase when the read and write access (using getLockedVertexIndexBase) is finished
- virtual void unLockVertexBase(int subpart) {}
+ virtual void unLockVertexBase(int subpart) {(void)subpart;}
- virtual void unLockReadOnlyVertexBase(int subpart) const {}
+ virtual void unLockReadOnlyVertexBase(int subpart) const {(void)subpart;}
/// getNumSubParts returns the number of seperate subparts
/// each subpart has a continuous array of vertices and indices
virtual int getNumSubParts() const {
return (int)m_indexedMeshes.size();
}
-
- virtual void preallocateVertices(int numverts){}
- virtual void preallocateIndices(int numindices){}
-};
+ IndexedMeshArray& getIndexedMeshArray()
+ {
+ return m_indexedMeshes;
+ }
+
+ const IndexedMeshArray& getIndexedMeshArray() const
+ {
+ return m_indexedMeshes;
+ }
+
+ virtual void preallocateVertices(int numverts){(void) numverts;}
+ virtual void preallocateIndices(int numindices){(void) numindices;}
+
+}
+;
#endif //BT_TRIANGLE_INDEX_VERTEX_ARRAY_H
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp
index 489fe1bbcaa..98c54ef45f8 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp
@@ -16,7 +16,6 @@ subject to the following restrictions:
#include "btTriangleMesh.h"
#include <assert.h>
-static int myindices[3] = {0,1,2};
btTriangleMesh::btTriangleMesh ()
{
@@ -25,31 +24,31 @@ btTriangleMesh::btTriangleMesh ()
void btTriangleMesh::getLockedVertexIndexBase(unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart)
{
- numverts = 3;
- *vertexbase = (unsigned char*)&m_triangles[subpart];
+ (void)subpart;
+ numverts = m_vertices.size();
+ *vertexbase = (unsigned char*)&m_vertices[0];
type = PHY_FLOAT;
stride = sizeof(btVector3);
-
- numfaces = 1;
- *indexbase = (unsigned char*) &myindices[0];
+ numfaces = m_indices.size()/3;
+ *indexbase = (unsigned char*) &m_indices[0];
indicestype = PHY_INTEGER;
- indexstride = sizeof(int);
+ indexstride = 3*sizeof(int);
}
void btTriangleMesh::getLockedReadOnlyVertexIndexBase(const unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,const unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart) const
{
- numverts = 3;
- *vertexbase = (unsigned char*)&m_triangles[subpart];
+ (void)subpart;
+ numverts = m_vertices.size();
+ *vertexbase = (unsigned char*)&m_vertices[0];
type = PHY_FLOAT;
stride = sizeof(btVector3);
-
- numfaces = 1;
- *indexbase = (unsigned char*) &myindices[0];
+ numfaces = m_indices.size()/3;
+ *indexbase = (unsigned char*) &m_indices[0];
indicestype = PHY_INTEGER;
- indexstride = sizeof(int);
+ indexstride = 3*sizeof(int);
}
@@ -57,5 +56,5 @@ void btTriangleMesh::getLockedReadOnlyVertexIndexBase(const unsigned char **vert
int btTriangleMesh::getNumSubParts() const
{
- return m_triangles.size();
+ return 1;
}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
index 1be03d70436..525f5336b48 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMesh.h
@@ -17,42 +17,37 @@ subject to the following restrictions:
#ifndef TRIANGLE_MESH_H
#define TRIANGLE_MESH_H
-#include "BulletCollision/CollisionShapes/btStridingMeshInterface.h"
-#include <LinearMath/btVector3.h>
-#include "LinearMath/btAlignedObjectArray.h"
-struct btMyTriangle
-{
- btVector3 m_vert0;
- btVector3 m_vert1;
- btVector3 m_vert2;
-};
+#include "btStridingMeshInterface.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
///TriangleMesh provides storage for a concave triangle mesh. It can be used as data for the btTriangleMeshShape.
class btTriangleMesh : public btStridingMeshInterface
{
- btAlignedObjectArray<btMyTriangle> m_triangles;
+ btAlignedObjectArray<btVector3> m_vertices;
+ btAlignedObjectArray<int> m_indices;
public:
btTriangleMesh ();
void addTriangle(const btVector3& vertex0,const btVector3& vertex1,const btVector3& vertex2)
{
- btMyTriangle tri;
- tri.m_vert0 = vertex0;
- tri.m_vert1 = vertex1;
- tri.m_vert2 = vertex2;
- m_triangles.push_back(tri);
+ int curIndex = m_indices.size();
+ m_vertices.push_back(vertex0);
+ m_vertices.push_back(vertex1);
+ m_vertices.push_back(vertex2);
+
+ m_indices.push_back(curIndex++);
+ m_indices.push_back(curIndex++);
+ m_indices.push_back(curIndex++);
}
int getNumTriangles() const
{
- return m_triangles.size();
+ return m_indices.size() / 3;
}
- const btMyTriangle& getTriangle(int index) const
- {
- return m_triangles[index];
- }
+
//StridingMeshInterface interface implementation
@@ -62,16 +57,16 @@ class btTriangleMesh : public btStridingMeshInterface
/// unLockVertexBase finishes the access to a subpart of the triangle mesh
/// make a call to unLockVertexBase when the read and write access (using getLockedVertexIndexBase) is finished
- virtual void unLockVertexBase(int subpart) {}
+ virtual void unLockVertexBase(int subpart) {(void) subpart;}
- virtual void unLockReadOnlyVertexBase(int subpart) const {}
+ virtual void unLockReadOnlyVertexBase(int subpart) const { (void) subpart;}
/// getNumSubParts returns the number of seperate subparts
/// each subpart has a continuous array of vertices and indices
virtual int getNumSubParts() const;
- virtual void preallocateVertices(int numverts){}
- virtual void preallocateIndices(int numindices){}
+ virtual void preallocateVertices(int numverts){(void) numverts;}
+ virtual void preallocateIndices(int numindices){(void) numindices;}
};
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
index cd2bf7261d1..ed81897b515 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
@@ -40,8 +40,8 @@ btTriangleMeshShape::~btTriangleMeshShape()
void btTriangleMeshShape::getAabb(const btTransform& trans,btVector3& aabbMin,btVector3& aabbMax) const
{
- btVector3 localHalfExtents = 0.5f*(m_localAabbMax-m_localAabbMin);
- btVector3 localCenter = 0.5f*(m_localAabbMax+m_localAabbMin);
+ btVector3 localHalfExtents = btScalar(0.5)*(m_localAabbMax-m_localAabbMin);
+ btVector3 localCenter = btScalar(0.5)*(m_localAabbMax+m_localAabbMin);
btMatrix3x3 abs_b = trans.getBasis().absolute();
@@ -62,11 +62,11 @@ void btTriangleMeshShape::recalcLocalAabb()
{
for (int i=0;i<3;i++)
{
- btVector3 vec(0.f,0.f,0.f);
- vec[i] = 1.f;
+ 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] = -1.f;
+ vec[i] = btScalar(-1.);
tmp = localGetSupportingVertex(vec);
m_localAabbMin[i] = tmp[i]-m_collisionMargin;
}
@@ -85,7 +85,7 @@ public:
btVector3 m_supportVecLocal;
SupportVertexCallback(const btVector3& supportVecWorld,const btTransform& trans)
- : m_supportVertexLocal(0.f,0.f,0.f), m_worldTrans(trans) ,m_maxDot(-1e30f)
+ : m_supportVertexLocal(btScalar(0.),btScalar(0.),btScalar(0.)), m_worldTrans(trans) ,m_maxDot(btScalar(-1e30))
{
m_supportVecLocal = supportVecWorld * m_worldTrans.getBasis();
@@ -93,6 +93,8 @@ public:
virtual void processTriangle( btVector3* triangle,int partId, int triangleIndex)
{
+ (void)partId;
+ (void)triangleIndex;
for (int i=0;i<3;i++)
{
btScalar dot = m_supportVecLocal.dot(triangle[i]);
@@ -138,8 +140,7 @@ const btVector3& btTriangleMeshShape::getLocalScaling() const
void btTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const
{
-
- struct FilteredCallback : public btInternalTriangleIndexCallback
+ struct FilteredCallback : public btInternalTriangleIndexCallback
{
btTriangleCallback* m_callback;
btVector3 m_aabbMin;
@@ -167,18 +168,19 @@ void btTriangleMeshShape::processAllTriangles(btTriangleCallback* callback,const
FilteredCallback filterCallback(callback,aabbMin,aabbMax);
m_meshInterface->InternalProcessAllTriangles(&filterCallback,aabbMin,aabbMax);
-
}
+
void btTriangleMeshShape::calculateLocalInertia(btScalar mass,btVector3& inertia)
{
+ (void)mass;
//moving concave objects not supported
- assert(0);
- inertia.setValue(0.f,0.f,0.f);
+ btAssert(0);
+ inertia.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
}
@@ -191,7 +193,7 @@ btVector3 btTriangleMeshShape::localGetSupportingVertex(const btVector3& vec) co
SupportVertexCallback supportCallback(vec,ident);
- btVector3 aabbMax(1e30f,1e30f,1e30f);
+ btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
processAllTriangles(&supportCallback,-aabbMax,aabbMax);
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h
index 4bf000f0c8d..e6173e47640 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h
@@ -16,17 +16,17 @@ subject to the following restrictions:
#ifndef TRIANGLE_MESH_SHAPE_H
#define TRIANGLE_MESH_SHAPE_H
-#include "BulletCollision/CollisionShapes/btConcaveShape.h"
-#include "BulletCollision/CollisionShapes/btStridingMeshInterface.h"
+#include "btConcaveShape.h"
+#include "btStridingMeshInterface.h"
///Concave triangle mesh. Uses an interface to access the triangles to allow for sharing graphics/physics triangles.
class btTriangleMeshShape : public btConcaveShape
{
protected:
- btStridingMeshInterface* m_meshInterface;
btVector3 m_localAabbMin;
btVector3 m_localAabbMax;
+ btStridingMeshInterface* m_meshInterface;
public:
@@ -58,6 +58,16 @@ public:
virtual void setLocalScaling(const btVector3& scaling);
virtual const btVector3& getLocalScaling() const;
+ btStridingMeshInterface* getMeshInterface()
+ {
+ return m_meshInterface;
+ }
+
+ const btStridingMeshInterface* getMeshInterface() const
+ {
+ return m_meshInterface;
+ }
+
//debugging
virtual char* getName()const {return "TRIANGLEMESH";}
diff --git a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h
index 3284a599ea7..c2e240c051c 100644
--- a/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h
+++ b/extern/bullet2/src/BulletCollision/CollisionShapes/btTriangleShape.h
@@ -17,7 +17,7 @@ subject to the following restrictions:
#define OBB_TRIANGLE_MINKOWSKI_H
#include "btConvexShape.h"
-#include "BulletCollision/CollisionShapes/btBoxShape.h"
+#include "btBoxShape.h"
class btTriangleShape : public btPolyhedralConvexShape
{
@@ -57,6 +57,7 @@ public:
getVertex((i+1)%3,pb);
}
+
virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax)const
{
// btAssert(0);
@@ -110,14 +111,16 @@ public:
virtual void getPlaneEquation(int i, btVector3& planeNormal,btPoint3& planeSupport) const
{
+ (void)i;
calcNormal(planeNormal);
planeSupport = m_vertices1[0];
}
virtual void calculateLocalInertia(btScalar mass,btVector3& inertia)
{
+ (void)mass;
btAssert(0);
- inertia.setValue(0.f,0.f,0.f);
+ inertia.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
}
virtual bool isInside(const btPoint3& pt,btScalar tolerance) const
@@ -166,7 +169,7 @@ public:
{
calcNormal(penetrationVector);
if (index)
- penetrationVector *= -1.f;
+ penetrationVector *= btScalar(-1.);
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
index ae3ce42e77f..2c565734e97 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
@@ -49,28 +49,28 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
/// compute linear and angular velocity for this interval, to interpolate
btVector3 linVelA,angVelA,linVelB,angVelB;
- btTransformUtil::calculateVelocity(fromA,toA,1.f,linVelA,angVelA);
- btTransformUtil::calculateVelocity(fromB,toB,1.f,linVelB,angVelB);
+ btTransformUtil::calculateVelocity(fromA,toA,btScalar(1.),linVelA,angVelA);
+ btTransformUtil::calculateVelocity(fromB,toB,btScalar(1.),linVelB,angVelB);
btScalar boundingRadiusA = m_convexA->getAngularMotionDisc();
btScalar boundingRadiusB = m_convexB->getAngularMotionDisc();
btScalar maxAngularProjectedVelocity = angVelA.length() * boundingRadiusA + angVelB.length() * boundingRadiusB;
- float radius = 0.001f;
+ btScalar radius = btScalar(0.001);
- btScalar lambda = 0.f;
+ btScalar lambda = btScalar(0.);
btVector3 v(1,0,0);
int maxIter = MAX_ITERATIONS;
btVector3 n;
- n.setValue(0.f,0.f,0.f);
+ n.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
bool hasResult = false;
btVector3 c;
- float lastLambda = lambda;
- //float epsilon = 0.001f;
+ btScalar lastLambda = lambda;
+ //btScalar epsilon = btScalar(0.001);
int numIter = 0;
//first solution, using GJK
@@ -79,8 +79,8 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
btTransform identityTrans;
identityTrans.setIdentity();
- btSphereShape raySphere(0.0f);
- raySphere.setMargin(0.f);
+ btSphereShape raySphere(btScalar(0.0));
+ raySphere.setMargin(btScalar(0.));
// result.drawCoordSystem(sphereTr);
@@ -116,23 +116,23 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
if (numIter > maxIter)
return false; //todo: report a failure
- float dLambda = 0.f;
+ btScalar dLambda = btScalar(0.);
//calculate safe moving fraction from distance / (linear+rotational velocity)
- //float clippedDist = GEN_min(angularConservativeRadius,dist);
- //float clippedDist = dist;
+ //btScalar clippedDist = GEN_min(angularConservativeRadius,dist);
+ //btScalar clippedDist = dist;
- float projectedLinearVelocity = (linVelB-linVelA).dot(n);
+ btScalar projectedLinearVelocity = (linVelB-linVelA).dot(n);
dLambda = dist / (projectedLinearVelocity+ maxAngularProjectedVelocity);
lambda = lambda + dLambda;
- if (lambda > 1.f)
+ if (lambda > btScalar(1.))
return false;
- if (lambda < 0.f)
+ if (lambda < btScalar(0.))
return false;
//todo: next check with relative epsilon
@@ -159,7 +159,7 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
gjk.getClosestPoints(input,pointCollector,0);
if (pointCollector.m_hasResult)
{
- if (pointCollector.m_distance < 0.f)
+ if (pointCollector.m_distance < btScalar(0.))
{
//degenerate ?!
result.m_fraction = lastLambda;
@@ -188,9 +188,9 @@ bool btContinuousConvexCollision::calcTimeOfImpact(
//todo:
//if movement away from normal, discard result
btVector3 move = transBLocalTo.getOrigin() - transBLocalFrom.getOrigin();
- if (result.m_fraction < 1.f)
+ if (result.m_fraction < btScalar(1.))
{
- if (move.dot(result.m_normal) <= 0.f)
+ if (move.dot(result.m_normal) <= btScalar(0.))
{
}
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h
index 4258d829cca..3101b59993d 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h
@@ -17,11 +17,11 @@ subject to the following restrictions:
#ifndef CONVEX_CAST_H
#define CONVEX_CAST_H
-#include <LinearMath/btTransform.h>
-#include <LinearMath/btVector3.h>
-#include <LinearMath/btScalar.h>
+#include "../../LinearMath/btTransform.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btScalar.h"
class btMinkowskiSumShape;
-#include "LinearMath/btIDebugDraw.h"
+#include "../../LinearMath/btIDebugDraw.h"
/// btConvexCast is an interface for Casting
class btConvexCast
@@ -37,11 +37,11 @@ public:
{
//virtual bool addRayResult(const btVector3& normal,btScalar fraction) = 0;
- virtual void DebugDraw(btScalar fraction) {}
- virtual void drawCoordSystem(const btTransform& trans) {}
+ virtual void DebugDraw(btScalar fraction) {(void)fraction;}
+ virtual void drawCoordSystem(const btTransform& trans) {(void)trans;}
CastResult()
- :m_fraction(1e30f),
+ :m_fraction(btScalar(1e30)),
m_debugDrawer(0)
{
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
index 188c8258c8e..7caeba4be45 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h
@@ -21,7 +21,7 @@ class btStackAlloc;
class btVector3;
#include "btSimplexSolverInterface.h"
class btConvexShape;
-#include "LinearMath/btPoint3.h"
+#include "../../LinearMath/btPoint3.h"
class btTransform;
///ConvexPenetrationDepthSolver provides an interface for penetration depth calculation.
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
index e9db97d1b13..15000c1ab61 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h
@@ -16,8 +16,8 @@ subject to the following restrictions:
#ifndef DISCRETE_COLLISION_DETECTOR1_INTERFACE_H
#define DISCRETE_COLLISION_DETECTOR1_INTERFACE_H
-#include "LinearMath/btTransform.h"
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btTransform.h"
+#include "../../LinearMath/btVector3.h"
class btStackAlloc;
/// This interface is made to be used by an iterative approach to do TimeOfImpact calculations
@@ -30,19 +30,18 @@ struct btDiscreteCollisionDetectorInterface
struct Result
{
- void operator delete(void* ptr) {};
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;
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,float depth)=0;
+ virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)=0;
};
struct ClosestPointInput
{
ClosestPointInput()
- :m_maximumDistanceSquared(1e30f),
+ :m_maximumDistanceSquared(btScalar(1e30)),
m_stackAlloc(0)
{
}
@@ -69,13 +68,13 @@ struct btStorageResult : public btDiscreteCollisionDetectorInterface::Result
btVector3 m_closestPointInB;
btScalar m_distance; //negative means penetration !
- btStorageResult() : m_distance(1e30f)
+ btStorageResult() : m_distance(btScalar(1e30))
{
}
virtual ~btStorageResult() {};
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,float depth)
+ virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
{
if (depth < m_distance)
{
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp
index bf465b61857..93edffeafd6 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp
@@ -60,9 +60,9 @@ bool btGjkConvexCast::calcTimeOfImpact(
- float radius = 0.01f;
+ btScalar radius = btScalar(0.01);
- btScalar lambda = 0.f;
+ btScalar lambda = btScalar(0.);
btVector3 s = rayFromLocalA.getOrigin();
btVector3 r = rayToLocalA.getOrigin()-rayFromLocalA.getOrigin();
btVector3 x = s;
@@ -71,7 +71,7 @@ bool btGjkConvexCast::calcTimeOfImpact(
bool hasResult = false;
btVector3 c;
- float lastLambda = lambda;
+ btScalar lastLambda = lambda;
//first solution, using GJK
@@ -81,8 +81,8 @@ bool btGjkConvexCast::calcTimeOfImpact(
btTransform identityTrans;
identityTrans.setIdentity();
- btSphereShape raySphere(0.0f);
- raySphere.setMargin(0.f);
+ btSphereShape raySphere(btScalar(0.0));
+ raySphere.setMargin(btScalar(0.));
btTransform sphereTr;
sphereTr.setIdentity();
@@ -112,7 +112,7 @@ bool btGjkConvexCast::calcTimeOfImpact(
if (dist < radius)
{
//penetration
- lastLambda = 1.f;
+ lastLambda = btScalar(1.);
}
//not close enough
@@ -143,7 +143,7 @@ bool btGjkConvexCast::calcTimeOfImpact(
gjk.getClosestPoints(input,pointCollector,0);
if (pointCollector.m_hasResult)
{
- if (pointCollector.m_distance < 0.f)
+ if (pointCollector.m_distance < btScalar(0.))
{
//degeneracy, report a hit
result.m_fraction = lastLambda;
@@ -160,7 +160,7 @@ bool btGjkConvexCast::calcTimeOfImpact(
}
- if (lastLambda < 1.f)
+ if (lastLambda < btScalar(1.))
{
result.m_fraction = lastLambda;
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h
index 66b34b88363..3905c45e6d6 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h
@@ -18,9 +18,9 @@ subject to the following restrictions:
#ifndef GJK_CONVEX_CAST_H
#define GJK_CONVEX_CAST_H
-#include <BulletCollision/CollisionShapes/btCollisionMargin.h>
+#include "../CollisionShapes/btCollisionMargin.h"
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btVector3.h"
#include "btConvexCast.h"
class btConvexShape;
class btMinkowskiSumShape;
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h
index 359829f8f31..759b30bb17f 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpa.h
@@ -21,7 +21,7 @@ Nov.2006
#ifndef _05E48D53_04E0_49ad_BB0A_D74FE62E7366_
#define _05E48D53_04E0_49ad_BB0A_D74FE62E7366_
-#include "BulletCollision/CollisionShapes/btConvexShape.h"
+#include "../CollisionShapes/btConvexShape.h"
class btStackAlloc;
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
index 3d252751c9a..87330493b60 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
@@ -26,8 +26,11 @@ bool btGjkEpaPenetrationDepthSolver::calcPenDepth( btSimplexSolverInterface& sim
class btIDebugDraw* debugDraw, btStackAlloc* stackAlloc )
{
+ (void)debugDraw;
+ (void)v;
+ (void)simplexSolver;
- const btScalar radialmargin(0.f);
+ const btScalar radialmargin(btScalar(0.));
btGjkEpaSolver::sResults results;
if(btGjkEpaSolver::Collide( pConvexA,transformA,
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
index 0ce04dcfad8..f1f3f7f7f6c 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
@@ -27,7 +27,7 @@ subject to the following restrictions:
#endif
//must be above the machine epsilon
-#define REL_ERROR2 1.0e-6f
+#define REL_ERROR2 btScalar(1.0e-6)
//temp globals, to improve GJK/EPA/penetration calculations
int gNumDeepPenetrationChecks = 0;
@@ -36,7 +36,7 @@ int gNumGjkChecks = 0;
btGjkPairDetector::btGjkPairDetector(btConvexShape* objectA,btConvexShape* objectB,btSimplexSolverInterface* simplexSolver,btConvexPenetrationDepthSolver* penetrationDepthSolver)
-:m_cachedSeparatingAxis(0.f,0.f,1.f),
+:m_cachedSeparatingAxis(btScalar(0.),btScalar(0.),btScalar(1.)),
m_penetrationDepthSolver(penetrationDepthSolver),
m_simplexSolver(simplexSolver),
m_minkowskiA(objectA),
@@ -49,25 +49,25 @@ m_catchDegeneracies(1)
void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result& output,class btIDebugDraw* debugDraw)
{
- btScalar distance=0.f;
- btVector3 normalInB(0.f,0.f,0.f);
+ btScalar distance=btScalar(0.);
+ btVector3 normalInB(btScalar(0.),btScalar(0.),btScalar(0.));
btVector3 pointOnA,pointOnB;
btTransform localTransA = input.m_transformA;
btTransform localTransB = input.m_transformB;
- btVector3 positionOffset = (localTransA.getOrigin() + localTransB.getOrigin()) * 0.5f;
+ btVector3 positionOffset = (localTransA.getOrigin() + localTransB.getOrigin()) * btScalar(0.5);
localTransA.getOrigin() -= positionOffset;
localTransB.getOrigin() -= positionOffset;
- float marginA = m_minkowskiA->getMargin();
- float marginB = m_minkowskiB->getMargin();
+ btScalar marginA = m_minkowskiA->getMargin();
+ btScalar marginB = m_minkowskiB->getMargin();
gNumGjkChecks++;
//for CCD we don't use margins
if (m_ignoreMargin)
{
- marginA = 0.f;
- marginB = 0.f;
+ marginA = btScalar(0.);
+ marginB = btScalar(0.);
}
m_curIter = 0;
@@ -83,7 +83,7 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
{
btScalar squaredDistance = SIMD_INFINITY;
- btScalar delta = 0.f;
+ btScalar delta = btScalar(0.);
btScalar margin = marginA + marginB;
@@ -91,7 +91,8 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
m_simplexSolver->reset();
- while (true)
+ for ( ; ; )
+ //while (true)
{
btVector3 seperatingAxisInA = (-m_cachedSeparatingAxis)* input.m_transformA.getBasis();
@@ -120,12 +121,12 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
break;
}
// are we getting any closer ?
- float f0 = squaredDistance - delta;
- float f1 = squaredDistance * REL_ERROR2;
+ btScalar f0 = squaredDistance - delta;
+ btScalar f1 = squaredDistance * REL_ERROR2;
if (f0 <= f1)
{
- if (f0 <= 0.f)
+ if (f0 <= btScalar(0.))
{
m_degenerateSimplex = 2;
}
@@ -191,7 +192,7 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
{
m_simplexSolver->compute_points(pointOnA, pointOnB);
normalInB = pointOnA-pointOnB;
- float lenSqr = m_cachedSeparatingAxis.length2();
+ btScalar lenSqr = m_cachedSeparatingAxis.length2();
//valid normal
if (lenSqr < 0.0001)
{
@@ -199,14 +200,14 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
}
if (lenSqr > SIMD_EPSILON*SIMD_EPSILON)
{
- float rlen = 1.f / btSqrt(lenSqr );
+ btScalar rlen = btScalar(1.) / btSqrt(lenSqr );
normalInB *= rlen; //normalize
btScalar s = btSqrt(squaredDistance);
btAssert(s > btScalar(0.0));
pointOnA -= m_cachedSeparatingAxis * (marginA / s);
pointOnB += m_cachedSeparatingAxis * (marginB / s);
- distance = ((1.f/rlen) - margin);
+ distance = ((btScalar(1.)/rlen) - margin);
isValid = true;
m_lastUsedMethod = 1;
@@ -243,11 +244,11 @@ void btGjkPairDetector::getClosestPoints(const ClosestPointInput& input,Result&
if (isValid2)
{
btVector3 tmpNormalInB = tmpPointOnB-tmpPointOnA;
- float lenSqr = tmpNormalInB.length2();
+ btScalar lenSqr = tmpNormalInB.length2();
if (lenSqr > (SIMD_EPSILON*SIMD_EPSILON))
{
tmpNormalInB /= btSqrt(lenSqr);
- float distance2 = -(tmpPointOnA-tmpPointOnB).length();
+ btScalar distance2 = -(tmpPointOnA-tmpPointOnB).length();
//only replace valid penetrations when the result is deeper (check)
if (!isValid || (distance2 < distance))
{
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
index 09c1669bd78..af0fe32f6c7 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h
@@ -20,9 +20,8 @@ subject to the following restrictions:
#define GJK_PAIR_DETECTOR_H
#include "btDiscreteCollisionDetectorInterface.h"
-#include "LinearMath/btPoint3.h"
-
-#include <BulletCollision/CollisionShapes/btCollisionMargin.h>
+#include "../../LinearMath/btPoint3.h"
+#include "../CollisionShapes/btCollisionMargin.h"
class btConvexShape;
#include "btSimplexSolverInterface.h"
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
index 00a9206fef0..f6a893151da 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h
@@ -16,8 +16,8 @@ subject to the following restrictions:
#ifndef MANIFOLD_CONTACT_POINT_H
#define MANIFOLD_CONTACT_POINT_H
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btTransformUtil.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btTransformUtil.h"
@@ -29,7 +29,8 @@ class btManifoldPoint
{
public:
btManifoldPoint()
- :m_userPersistentData(0)
+ :m_userPersistentData(0),
+ m_lifeTime(0)
{
}
@@ -40,8 +41,8 @@ class btManifoldPoint
m_localPointB( pointB ),
m_normalWorldOnB( normal ),
m_distance1( distance ),
- m_combinedFriction(0.f),
- m_combinedRestitution(0.f),
+ m_combinedFriction(btScalar(0.)),
+ m_combinedRestitution(btScalar(0.)),
m_userPersistentData(0),
m_lifeTime(0)
{
@@ -58,16 +59,16 @@ class btManifoldPoint
btVector3 m_positionWorldOnA;
btVector3 m_normalWorldOnB;
- float m_distance1;
- float m_combinedFriction;
- float m_combinedRestitution;
+ btScalar m_distance1;
+ btScalar m_combinedFriction;
+ btScalar m_combinedRestitution;
- void* m_userPersistentData;
+ mutable void* m_userPersistentData;
int m_lifeTime;//lifetime of the contactpoint in frames
- float getDistance() const
+ btScalar getDistance() const
{
return m_distance1;
}
@@ -76,17 +77,17 @@ class btManifoldPoint
return m_lifeTime;
}
- btVector3 getPositionWorldOnA() {
+ const btVector3& getPositionWorldOnA() const {
return m_positionWorldOnA;
// return m_positionWorldOnB + m_normalWorldOnB * m_distance1;
}
- const btVector3& getPositionWorldOnB()
+ const btVector3& getPositionWorldOnB() const
{
return m_positionWorldOnB;
}
- void setDistance(float dist)
+ void setDistance(btScalar dist)
{
m_distance1 = dist;
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
index de6749a9b72..c4bab3a134a 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
@@ -25,48 +25,48 @@ subject to the following restrictions:
#define NUM_UNITSPHERE_POINTS 42
static btVector3 sPenetrationDirections[NUM_UNITSPHERE_POINTS+MAX_PREFERRED_PENETRATION_DIRECTIONS*2] =
{
-btVector3(0.000000f , -0.000000f,-1.000000f),
-btVector3(0.723608f , -0.525725f,-0.447219f),
-btVector3(-0.276388f , -0.850649f,-0.447219f),
-btVector3(-0.894426f , -0.000000f,-0.447216f),
-btVector3(-0.276388f , 0.850649f,-0.447220f),
-btVector3(0.723608f , 0.525725f,-0.447219f),
-btVector3(0.276388f , -0.850649f,0.447220f),
-btVector3(-0.723608f , -0.525725f,0.447219f),
-btVector3(-0.723608f , 0.525725f,0.447219f),
-btVector3(0.276388f , 0.850649f,0.447219f),
-btVector3(0.894426f , 0.000000f,0.447216f),
-btVector3(-0.000000f , 0.000000f,1.000000f),
-btVector3(0.425323f , -0.309011f,-0.850654f),
-btVector3(-0.162456f , -0.499995f,-0.850654f),
-btVector3(0.262869f , -0.809012f,-0.525738f),
-btVector3(0.425323f , 0.309011f,-0.850654f),
-btVector3(0.850648f , -0.000000f,-0.525736f),
-btVector3(-0.525730f , -0.000000f,-0.850652f),
-btVector3(-0.688190f , -0.499997f,-0.525736f),
-btVector3(-0.162456f , 0.499995f,-0.850654f),
-btVector3(-0.688190f , 0.499997f,-0.525736f),
-btVector3(0.262869f , 0.809012f,-0.525738f),
-btVector3(0.951058f , 0.309013f,0.000000f),
-btVector3(0.951058f , -0.309013f,0.000000f),
-btVector3(0.587786f , -0.809017f,0.000000f),
-btVector3(0.000000f , -1.000000f,0.000000f),
-btVector3(-0.587786f , -0.809017f,0.000000f),
-btVector3(-0.951058f , -0.309013f,-0.000000f),
-btVector3(-0.951058f , 0.309013f,-0.000000f),
-btVector3(-0.587786f , 0.809017f,-0.000000f),
-btVector3(-0.000000f , 1.000000f,-0.000000f),
-btVector3(0.587786f , 0.809017f,-0.000000f),
-btVector3(0.688190f , -0.499997f,0.525736f),
-btVector3(-0.262869f , -0.809012f,0.525738f),
-btVector3(-0.850648f , 0.000000f,0.525736f),
-btVector3(-0.262869f , 0.809012f,0.525738f),
-btVector3(0.688190f , 0.499997f,0.525736f),
-btVector3(0.525730f , 0.000000f,0.850652f),
-btVector3(0.162456f , -0.499995f,0.850654f),
-btVector3(-0.425323f , -0.309011f,0.850654f),
-btVector3(-0.425323f , 0.309011f,0.850654f),
-btVector3(0.162456f , 0.499995f,0.850654f)
+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))
};
@@ -78,6 +78,9 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
)
{
+ (void)stackAlloc;
+ (void)v;
+
struct btIntermediateResult : public btDiscreteCollisionDetectorInterface::Result
{
@@ -88,13 +91,17 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
btVector3 m_normalOnBInWorld;
btVector3 m_pointInWorld;
- float m_depth;
+ btScalar m_depth;
bool m_hasResult;
virtual void setShapeIdentifiers(int partId0,int index0, int partId1,int index1)
{
+ (void)partId0;
+ (void)index0;
+ (void)partId1;
+ (void)index1;
}
- void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,float depth)
+ void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
{
m_normalOnBInWorld = normalOnBInWorld;
m_pointInWorld = pointInWorld;
@@ -104,7 +111,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
};
//just take fixed number of orientation, and sample the penetration depth in that direction
- float minProj = 1e30f;
+ btScalar minProj = btScalar(1e30);
btVector3 minNorm;
btVector3 minVertex;
btVector3 minA,minB;
@@ -180,7 +187,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
pWorld = transA(pInA);
qWorld = transB(qInB);
w = qWorld - pWorld;
- float delta = norm.dot(w);
+ btScalar delta = norm.dot(w);
//find smallest delta
if (delta < minProj)
{
@@ -234,7 +241,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
pWorld = transA(pInA);
qWorld = transB(qInB);
w = qWorld - pWorld;
- float delta = norm.dot(w);
+ btScalar delta = norm.dot(w);
//find smallest delta
if (delta < minProj)
{
@@ -251,7 +258,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
minA += minNorm*convexA->getMargin();
minB -= minNorm*convexB->getMargin();
//no penetration
- if (minProj < 0.f)
+ if (minProj < btScalar(0.))
return false;
minProj += (convexA->getMargin() + convexB->getMargin());
@@ -268,7 +275,7 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
debugDraw->drawLine(minA,minB,color);
color = btVector3 (1,1,1);
btVector3 vec = minB-minA;
- float prj2 = minNorm.dot(vec);
+ btScalar prj2 = minNorm.dot(vec);
debugDraw->drawLine(minA,minA+(minNorm*minProj),color);
}
@@ -292,16 +299,16 @@ bool btMinkowskiPenetrationDepthSolver::calcPenDepth(btSimplexSolverInterface& s
input.m_transformA = displacedTrans;
input.m_transformB = transB;
- input.m_maximumDistanceSquared = 1e30f;//minProj;
+ input.m_maximumDistanceSquared = btScalar(1e30);//minProj;
btIntermediateResult res;
gjkdet.getClosestPoints(input,res,debugDraw);
- float correctedMinNorm = minProj - res.m_depth;
+ btScalar correctedMinNorm = minProj - res.m_depth;
//the penetration depth is over-estimated, relax it
- float penetration_relaxation= 1.f;
+ btScalar penetration_relaxation= btScalar(1.);
minNorm*=penetration_relaxation;
if (res.m_hasResult)
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
index ee2be163063..08cb3ed334d 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
@@ -18,7 +18,7 @@ subject to the following restrictions:
#include "LinearMath/btTransform.h"
#include <assert.h>
-float gContactBreakingThreshold = 0.02f;
+btScalar gContactBreakingThreshold = btScalar(0.02);
ContactDestroyedCallback gContactDestroyedCallback = 0;
@@ -100,7 +100,7 @@ int btPersistentManifold::sortCachedPoints(const btManifoldPoint& pt)
int maxPenetrationIndex = -1;
#define KEEP_DEEPEST_POINT 1
#ifdef KEEP_DEEPEST_POINT
- float maxPenetration = pt.getDistance();
+ btScalar maxPenetration = pt.getDistance();
for (int i=0;i<4;i++)
{
if (m_pointCache[i].getDistance() < maxPenetration)
@@ -111,7 +111,7 @@ int btPersistentManifold::sortCachedPoints(const btManifoldPoint& pt)
}
#endif //KEEP_DEEPEST_POINT
- btScalar res0(0.f),res1(0.f),res2(0.f),res3(0.f);
+ btScalar res0(btScalar(0.)),res1(btScalar(0.)),res2(btScalar(0.)),res3(btScalar(0.));
if (maxPenetrationIndex != 0)
{
btVector3 a0 = pt.m_localPointA-m_pointCache[1].m_localPointA;
@@ -193,7 +193,7 @@ void btPersistentManifold::AddManifoldPoint(const btManifoldPoint& newPoint)
replaceContactPoint(newPoint,insertIndex);
}
-float btPersistentManifold::getContactBreakingThreshold() const
+btScalar btPersistentManifold::getContactBreakingThreshold() const
{
return gContactBreakingThreshold;
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
index c2372b648f6..a5918b84db3 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h
@@ -17,14 +17,14 @@ subject to the following restrictions:
#define PERSISTENT_MANIFOLD_H
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btTransform.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btTransform.h"
#include "btManifoldPoint.h"
struct btCollisionResult;
///contact breaking and merging threshold
-extern float gContactBreakingThreshold;
+extern btScalar gContactBreakingThreshold;
typedef bool (*ContactDestroyedCallback)(void* userPersistentData);
extern ContactDestroyedCallback gContactDestroyedCallback;
@@ -36,7 +36,7 @@ extern ContactDestroyedCallback gContactDestroyedCallback;
///btPersistentManifold maintains contact points, and reduces them to 4.
///It does contact filtering/contact reduction.
-class btPersistentManifold
+ATTRIBUTE_ALIGNED16( class) btPersistentManifold
{
btManifoldPoint m_pointCache[MANIFOLD_CACHE_SIZE];
@@ -97,7 +97,7 @@ public:
}
/// todo: get this margin from the current physics / collision environment
- float getContactBreakingThreshold() const;
+ btScalar getContactBreakingThreshold() const;
int getCacheEntry(const btManifoldPoint& newPoint) const;
@@ -108,18 +108,36 @@ public:
clearUserCache(m_pointCache[index]);
int lastUsedIndex = getNumContacts() - 1;
- m_pointCache[index] = m_pointCache[lastUsedIndex];
- //get rid of duplicated userPersistentData pointer
- m_pointCache[lastUsedIndex].m_userPersistentData = 0;
+// m_pointCache[index] = m_pointCache[lastUsedIndex];
+ if(index != lastUsedIndex)
+ {
+ m_pointCache[index] = m_pointCache[lastUsedIndex];
+ //get rid of duplicated userPersistentData pointer
+ m_pointCache[lastUsedIndex].m_userPersistentData = 0;
+ }
+
+ btAssert(m_pointCache[lastUsedIndex].m_userPersistentData==0);
m_cachedPoints--;
}
void replaceContactPoint(const btManifoldPoint& newPoint,int insertIndex)
{
- assert(validContactDistance(newPoint));
+ btAssert(validContactDistance(newPoint));
- clearUserCache(m_pointCache[insertIndex]);
+#define MAINTAIN_PERSISTENCY 1
+#ifdef MAINTAIN_PERSISTENCY
+ int lifeTime = m_pointCache[insertIndex].getLifeTime();
+ btAssert(lifeTime>=0);
+ void* cache = m_pointCache[insertIndex].m_userPersistentData;
m_pointCache[insertIndex] = newPoint;
+
+ m_pointCache[insertIndex].m_userPersistentData = cache;
+ m_pointCache[insertIndex].m_lifeTime = lifeTime;
+#else
+ clearUserCache(m_pointCache[insertIndex]);
+ m_pointCache[insertIndex] = newPoint;
+
+#endif
}
bool validContactDistance(const btManifoldPoint& pt) const
@@ -133,7 +151,10 @@ public:
-};
+}
+;
+
+
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h
index a51e2d5e13b..6262f44b9f1 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h
@@ -31,16 +31,20 @@ struct btPointCollector : public btDiscreteCollisionDetectorInterface::Result
bool m_hasResult;
btPointCollector ()
- : m_distance(1e30f),m_hasResult(false)
+ : m_distance(btScalar(1e30)),m_hasResult(false)
{
}
virtual void setShapeIdentifiers(int partId0,int index0, int partId1,int index1)
{
+ (void)partId0;
+ (void)index0;
+ (void)partId1;
+ (void)index1;
//??
}
- virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,float depth)
+ virtual void addContactPoint(const btVector3& normalOnBInWorld,const btVector3& pointInWorld,btScalar depth)
{
if (depth< m_distance)
{
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
index 88ee005792c..31b91467777 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
@@ -20,7 +20,7 @@ btTriangleRaycastCallback::btTriangleRaycastCallback(const btVector3& from,const
:
m_from(from),
m_to(to),
- m_hitFraction(1.f)
+ m_hitFraction(btScalar(1.))
{
}
@@ -40,19 +40,19 @@ void btTriangleRaycastCallback::processTriangle(btVector3* triangle,int partId,
btVector3 triangleNormal; triangleNormal = v10.cross( v20 );
- const float dist = vert0.dot(triangleNormal);
- float dist_a = triangleNormal.dot(m_from) ;
+ const btScalar dist = vert0.dot(triangleNormal);
+ btScalar dist_a = triangleNormal.dot(m_from) ;
dist_a-= dist;
- float dist_b = triangleNormal.dot(m_to);
+ btScalar dist_b = triangleNormal.dot(m_to);
dist_b -= dist;
- if ( dist_a * dist_b >= 0.0f)
+ if ( dist_a * dist_b >= btScalar(0.0) )
{
return ; // same sign
}
- const float proj_length=dist_a-dist_b;
- const float distance = (dist_a)/(proj_length);
+ const btScalar proj_length=dist_a-dist_b;
+ const btScalar distance = (dist_a)/(proj_length);
// Now we have the intersection point on the plane, we'll see if it's inside the triangle
// Add an epsilon as a tolerance for the raycast,
// in case the ray hits exacly on the edge of the triangle.
@@ -62,27 +62,27 @@ void btTriangleRaycastCallback::processTriangle(btVector3* triangle,int partId,
{
- float edge_tolerance =triangleNormal.length2();
- edge_tolerance *= -0.0001f;
+ btScalar edge_tolerance =triangleNormal.length2();
+ edge_tolerance *= btScalar(-0.0001);
btVector3 point; point.setInterpolate3( m_from, m_to, distance);
{
btVector3 v0p; v0p = vert0 - point;
btVector3 v1p; v1p = vert1 - point;
btVector3 cp0; cp0 = v0p.cross( v1p );
- if ( (float)(cp0.dot(triangleNormal)) >=edge_tolerance)
+ if ( (btScalar)(cp0.dot(triangleNormal)) >=edge_tolerance)
{
btVector3 v2p; v2p = vert2 - point;
btVector3 cp1;
cp1 = v1p.cross( v2p);
- if ( (float)(cp1.dot(triangleNormal)) >=edge_tolerance)
+ if ( (btScalar)(cp1.dot(triangleNormal)) >=edge_tolerance)
{
btVector3 cp2;
cp2 = v2p.cross(v0p);
- if ( (float)(cp2.dot(triangleNormal)) >=edge_tolerance)
+ if ( (btScalar)(cp2.dot(triangleNormal)) >=edge_tolerance)
{
if ( dist_a > 0 )
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
index fbb51d30522..a0bbc9f8fe9 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef RAYCAST_TRI_CALLBACK_H
#define RAYCAST_TRI_CALLBACK_H
-#include "BulletCollision/CollisionShapes/btTriangleCallback.h"
+#include "../CollisionShapes/btTriangleCallback.h"
struct btBroadphaseProxy;
@@ -28,13 +28,13 @@ public:
btVector3 m_from;
btVector3 m_to;
- float m_hitFraction;
+ btScalar m_hitFraction;
btTriangleRaycastCallback(const btVector3& from,const btVector3& to);
virtual void processTriangle(btVector3* triangle, int partId, int triangleIndex);
- virtual float reportHit(const btVector3& hitNormalLocal, float hitFraction, int partId, int triangleIndex ) = 0;
+ virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex ) = 0;
};
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h
index cf65f46505b..58393b2eab9 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h
@@ -18,8 +18,8 @@ subject to the following restrictions:
#ifndef SIMPLEX_SOLVER_INTERFACE_H
#define SIMPLEX_SOLVER_INTERFACE_H
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btPoint3.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btPoint3.h"
#define NO_VIRTUAL_INTERFACE 1
#ifdef NO_VIRTUAL_INTERFACE
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
index dc995ca1f72..687738b7fa9 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
@@ -20,7 +20,7 @@ subject to the following restrictions:
#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h"
-btSubsimplexConvexCast::btSubsimplexConvexCast (btConvexShape* convexA,btConvexShape* convexB,btSimplexSolverInterface* simplexSolver)
+btSubsimplexConvexCast::btSubsimplexConvexCast (const btConvexShape* convexA,const btConvexShape* convexB,btSimplexSolverInterface* simplexSolver)
:m_simplexSolver(simplexSolver),
m_convexA(convexA),m_convexB(convexB)
{
@@ -28,8 +28,11 @@ m_convexA(convexA),m_convexB(convexB)
///Typically the conservative advancement reaches solution in a few iterations, clip it to 32 for degenerate cases.
///See discussion about this here http://continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=565
+#ifdef BT_USE_DOUBLE_PRECISION
+#define MAX_ITERATIONS 64
+#else
#define MAX_ITERATIONS 32
-
+#endif
bool btSubsimplexConvexCast::calcTimeOfImpact(
const btTransform& fromA,
const btTransform& toA,
@@ -52,9 +55,9 @@ bool btSubsimplexConvexCast::calcTimeOfImpact(
convex->setTransformB(btTransform(rayFromLocalA.getBasis()));
- //float radius = 0.01f;
+ //btScalar radius = btScalar(0.01);
- btScalar lambda = 0.f;
+ btScalar lambda = btScalar(0.);
//todo: need to verify this:
//because of minkowski difference, we need the inverse direction
@@ -69,27 +72,30 @@ bool btSubsimplexConvexCast::calcTimeOfImpact(
int maxIter = MAX_ITERATIONS;
btVector3 n;
- n.setValue(0.f,0.f,0.f);
+ n.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
bool hasResult = false;
btVector3 c;
- float lastLambda = lambda;
-
+ btScalar lastLambda = lambda;
- float dist2 = v.length2();
- float epsilon = 0.0001f;
+ btScalar dist2 = v.length2();
+#ifdef BT_USE_DOUBLE_PRECISION
+ btScalar epsilon = btScalar(0.0001);
+#else
+ btScalar epsilon = btScalar(0.0001);
+#endif //BT_USE_DOUBLE_PRECISION
btVector3 w,p;
- float VdotR;
+ btScalar VdotR;
while ( (dist2 > epsilon) && maxIter--)
{
p = convex->localGetSupportingVertex( v);
w = x - p;
- float VdotW = v.dot(w);
+ btScalar VdotW = v.dot(w);
- if ( VdotW > 0.f)
+ if ( VdotW > btScalar(0.))
{
VdotR = v.dot(r);
@@ -117,7 +123,7 @@ bool btSubsimplexConvexCast::calcTimeOfImpact(
//printf("numverts = %i\n",m_simplexSolver->numVertices());
} else
{
- dist2 = 0.f;
+ dist2 = btScalar(0.);
}
}
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h
index a2a3193b090..05662db5d23 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h
@@ -28,12 +28,12 @@ class btConvexShape;
class btSubsimplexConvexCast : public btConvexCast
{
btSimplexSolverInterface* m_simplexSolver;
- btConvexShape* m_convexA;
- btConvexShape* m_convexB;
+ const btConvexShape* m_convexA;
+ const btConvexShape* m_convexB;
public:
- btSubsimplexConvexCast (btConvexShape* shapeA,btConvexShape* shapeB,btSimplexSolverInterface* simplexSolver);
+ btSubsimplexConvexCast (const btConvexShape* shapeA,const btConvexShape* shapeB,btSimplexSolverInterface* simplexSolver);
//virtual ~btSubsimplexConvexCast();
///SimsimplexConvexCast calculateTimeOfImpact calculates the time of impact+normal for the linear cast (sweep) between two moving objects.
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
index 23d66a3bbc8..105b7eccefa 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
@@ -70,7 +70,7 @@ void btVoronoiSimplexSolver::reset()
m_cachedValidClosest = false;
m_numVertices = 0;
m_needsUpdate = true;
- m_lastW = btVector3(1e30f,1e30f,1e30f);
+ m_lastW = btVector3(btScalar(1e30),btScalar(1e30),btScalar(1e30));
m_cachedBC.reset();
}
@@ -109,7 +109,7 @@ bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
m_cachedP2 = m_simplexPointsQ[0];
m_cachedV = m_cachedP1-m_cachedP2; //== m_simplexVectorW[0]
m_cachedBC.reset();
- m_cachedBC.setBarycentricCoordinates(1.f,0.f,0.f,0.f);
+ m_cachedBC.setBarycentricCoordinates(btScalar(1.),btScalar(0.),btScalar(0.),btScalar(0.));
m_cachedValidClosest = m_cachedBC.isValid();
break;
};
@@ -120,13 +120,13 @@ bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
const btVector3& to = m_simplexVectorW[1];
btVector3 nearest;
- btVector3 p (0.f,0.f,0.f);
+ btVector3 p (btScalar(0.),btScalar(0.),btScalar(0.));
btVector3 diff = p - from;
btVector3 v = to - from;
- float t = v.dot(diff);
+ btScalar t = v.dot(diff);
if (t > 0) {
- float dotVV = v.dot(v);
+ btScalar dotVV = v.dot(v);
if (t < dotVV) {
t /= dotVV;
diff -= t*v;
@@ -156,38 +156,36 @@ bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
m_cachedValidClosest = m_cachedBC.isValid();
break;
}
- case 3:
- {
- //closest point origin from triangle
- btVector3 p (0.f,0.f,0.f);
-
- const btVector3& a = m_simplexVectorW[0];
- const btVector3& b = m_simplexVectorW[1];
- const btVector3& c = m_simplexVectorW[2];
+ case 3:
+ {
+ //closest point origin from triangle
+ btVector3 p (btScalar(0.),btScalar(0.),btScalar(0.));
- closestPtPointTriangle(p,a,b,c,m_cachedBC);
- m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2] +
- m_simplexPointsP[3] * m_cachedBC.m_barycentricCoords[3];
+ const btVector3& a = m_simplexVectorW[0];
+ const btVector3& b = m_simplexVectorW[1];
+ const btVector3& c = m_simplexVectorW[2];
- m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] +
- m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
- m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2] +
- m_simplexPointsQ[3] * m_cachedBC.m_barycentricCoords[3];
+ closestPtPointTriangle(p,a,b,c,m_cachedBC);
+ m_cachedP1 = m_simplexPointsP[0] * m_cachedBC.m_barycentricCoords[0] +
+ m_simplexPointsP[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsP[2] * m_cachedBC.m_barycentricCoords[2];
- m_cachedV = m_cachedP1-m_cachedP2;
+ m_cachedP2 = m_simplexPointsQ[0] * m_cachedBC.m_barycentricCoords[0] +
+ m_simplexPointsQ[1] * m_cachedBC.m_barycentricCoords[1] +
+ m_simplexPointsQ[2] * m_cachedBC.m_barycentricCoords[2];
- reduceVertices (m_cachedBC.m_usedVertices);
- m_cachedValidClosest = m_cachedBC.isValid();
+ m_cachedV = m_cachedP1-m_cachedP2;
- break;
+ reduceVertices (m_cachedBC.m_usedVertices);
+ m_cachedValidClosest = m_cachedBC.isValid();
+
+ break;
}
case 4:
{
- btVector3 p (0.f,0.f,0.f);
+ btVector3 p (btScalar(0.),btScalar(0.),btScalar(0.));
const btVector3& a = m_simplexVectorW[0];
const btVector3& b = m_simplexVectorW[1];
@@ -222,7 +220,7 @@ bool btVoronoiSimplexSolver::updateClosestVectorAndPoints()
{
m_cachedValidClosest = true;
//degenerate case == false, penetration = true + zero
- m_cachedV.setValue(0.f,0.f,0.f);
+ m_cachedV.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
}
break;
}
@@ -256,7 +254,7 @@ bool btVoronoiSimplexSolver::closest(btVector3& v)
btScalar btVoronoiSimplexSolver::maxVertex()
{
int i, numverts = numVertices();
- btScalar maxV = 0.f;
+ btScalar maxV = btScalar(0.);
for (i=0;i<numverts;i++)
{
btScalar curLen2 = m_simplexVectorW[i].length2();
@@ -288,7 +286,7 @@ bool btVoronoiSimplexSolver::inSimplex(const btVector3& w)
{
bool found = false;
int i, numverts = numVertices();
- //btScalar maxV = 0.f;
+ //btScalar maxV = btScalar(0.);
//w is in the current (reduced) simplex
for (i=0;i<numverts;i++)
@@ -335,9 +333,9 @@ bool btVoronoiSimplexSolver::closestPtPointTriangle(const btPoint3& p, const btP
btVector3 ab = b - a;
btVector3 ac = c - a;
btVector3 ap = p - a;
- float d1 = ab.dot(ap);
- float d2 = ac.dot(ap);
- if (d1 <= 0.0f && d2 <= 0.0f)
+ btScalar d1 = ab.dot(ap);
+ btScalar d2 = ac.dot(ap);
+ if (d1 <= btScalar(0.0) && d2 <= btScalar(0.0))
{
result.m_closestPointOnSimplex = a;
result.m_usedVertices.usedVertexA = true;
@@ -347,9 +345,9 @@ bool btVoronoiSimplexSolver::closestPtPointTriangle(const btPoint3& p, const btP
// Check if P in vertex region outside B
btVector3 bp = p - b;
- float d3 = ab.dot(bp);
- float d4 = ac.dot(bp);
- if (d3 >= 0.0f && d4 <= d3)
+ btScalar d3 = ab.dot(bp);
+ btScalar d4 = ac.dot(bp);
+ if (d3 >= btScalar(0.0) && d4 <= d3)
{
result.m_closestPointOnSimplex = b;
result.m_usedVertices.usedVertexB = true;
@@ -358,9 +356,9 @@ bool btVoronoiSimplexSolver::closestPtPointTriangle(const btPoint3& p, const btP
return true; // b; // barycentric coordinates (0,1,0)
}
// Check if P in edge region of AB, if so return projection of P onto AB
- float vc = d1*d4 - d3*d2;
- if (vc <= 0.0f && d1 >= 0.0f && d3 <= 0.0f) {
- float v = d1 / (d1 - d3);
+ btScalar vc = d1*d4 - d3*d2;
+ if (vc <= btScalar(0.0) && d1 >= btScalar(0.0) && d3 <= btScalar(0.0)) {
+ btScalar v = d1 / (d1 - d3);
result.m_closestPointOnSimplex = a + v * ab;
result.m_usedVertices.usedVertexA = true;
result.m_usedVertices.usedVertexB = true;
@@ -371,9 +369,9 @@ bool btVoronoiSimplexSolver::closestPtPointTriangle(const btPoint3& p, const btP
// Check if P in vertex region outside C
btVector3 cp = p - c;
- float d5 = ab.dot(cp);
- float d6 = ac.dot(cp);
- if (d6 >= 0.0f && d5 <= d6)
+ btScalar d5 = ab.dot(cp);
+ btScalar d6 = ac.dot(cp);
+ if (d6 >= btScalar(0.0) && d5 <= d6)
{
result.m_closestPointOnSimplex = c;
result.m_usedVertices.usedVertexC = true;
@@ -382,9 +380,9 @@ bool btVoronoiSimplexSolver::closestPtPointTriangle(const btPoint3& p, const btP
}
// Check if P in edge region of AC, if so return projection of P onto AC
- float vb = d5*d2 - d1*d6;
- if (vb <= 0.0f && d2 >= 0.0f && d6 <= 0.0f) {
- float w = d2 / (d2 - d6);
+ btScalar vb = d5*d2 - d1*d6;
+ if (vb <= btScalar(0.0) && d2 >= btScalar(0.0) && d6 <= btScalar(0.0)) {
+ btScalar w = d2 / (d2 - d6);
result.m_closestPointOnSimplex = a + w * ac;
result.m_usedVertices.usedVertexA = true;
result.m_usedVertices.usedVertexC = true;
@@ -394,9 +392,9 @@ bool btVoronoiSimplexSolver::closestPtPointTriangle(const btPoint3& p, const btP
}
// Check if P in edge region of BC, if so return projection of P onto BC
- float va = d3*d6 - d5*d4;
- if (va <= 0.0f && (d4 - d3) >= 0.0f && (d5 - d6) >= 0.0f) {
- float w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
+ btScalar va = d3*d6 - d5*d4;
+ if (va <= btScalar(0.0) && (d4 - d3) >= btScalar(0.0) && (d5 - d6) >= btScalar(0.0)) {
+ btScalar w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
result.m_closestPointOnSimplex = b + w * (c - b);
result.m_usedVertices.usedVertexB = true;
@@ -407,9 +405,9 @@ bool btVoronoiSimplexSolver::closestPtPointTriangle(const btPoint3& p, const btP
}
// P inside face region. Compute Q through its barycentric coordinates (u,v,w)
- float denom = 1.0f / (va + vb + vc);
- float v = vb * denom;
- float w = vc * denom;
+ btScalar denom = btScalar(1.0) / (va + vb + vc);
+ btScalar v = vb * denom;
+ btScalar w = vc * denom;
result.m_closestPointOnSimplex = a + ab * v + ac * w;
result.m_usedVertices.usedVertexA = true;
@@ -418,7 +416,7 @@ bool btVoronoiSimplexSolver::closestPtPointTriangle(const btPoint3& p, const btP
result.setBarycentricCoordinates(1-v-w,v,w);
return true;
-// return a + ab * v + ac * w; // = u*a + v*b + w*c, u = va * denom = 1.0f - v - w
+// return a + ab * v + ac * w; // = u*a + v*b + w*c, u = va * denom = btScalar(1.0) - v - w
}
@@ -431,18 +429,26 @@ int btVoronoiSimplexSolver::pointOutsideOfPlane(const btPoint3& p, const btPoint
{
btVector3 normal = (b-a).cross(c-a);
- float signp = (p - a).dot(normal); // [AP AB AC]
- float signd = (d - a).dot( normal); // [AD AB AC]
+ btScalar signp = (p - a).dot(normal); // [AP AB AC]
+ btScalar signd = (d - a).dot( normal); // [AD AB AC]
#ifdef CATCH_DEGENERATE_TETRAHEDRON
- if (signd * signd < (1e-4f * 1e-4f))
+#ifdef BT_USE_DOUBLE_PRECISION
+if (signd * signd < (btScalar(1e-8) * btScalar(1e-8)))
+ {
+ return -1;
+ }
+#else
+ if (signd * signd < (btScalar(1e-4) * btScalar(1e-4)))
{
// printf("affine dependent/degenerate\n");//
return -1;
}
#endif
+
+#endif
// Points on opposite sides if expression signs are opposite
- return signp * signd < 0.f;
+ return signp * signd < btScalar(0.);
}
@@ -475,14 +481,14 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btPoint3& p, const
}
- float bestSqDist = FLT_MAX;
+ btScalar bestSqDist = FLT_MAX;
// If point outside face abc then compute closest point on abc
if (pointOutsideABC)
{
closestPtPointTriangle(p, a, b, c,tempResult);
btPoint3 q = tempResult.m_closestPointOnSimplex;
- float sqDist = (q - p).dot( q - p);
+ btScalar sqDist = (q - p).dot( q - p);
// Update best closest point if (squared) distance is less than current best
if (sqDist < bestSqDist) {
bestSqDist = sqDist;
@@ -510,13 +516,14 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btPoint3& p, const
btPoint3 q = tempResult.m_closestPointOnSimplex;
//convert result bitmask!
- float sqDist = (q - p).dot( q - p);
+ btScalar sqDist = (q - p).dot( q - p);
if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
finalResult.m_usedVertices.reset();
finalResult.m_usedVertices.usedVertexA = tempResult.m_usedVertices.usedVertexA;
+
finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexC;
finalResult.setBarycentricCoordinates(
@@ -537,15 +544,16 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btPoint3& p, const
btPoint3 q = tempResult.m_closestPointOnSimplex;
//convert result bitmask!
- float sqDist = (q - p).dot( q - p);
+ btScalar sqDist = (q - p).dot( q - p);
if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
finalResult.m_usedVertices.reset();
finalResult.m_usedVertices.usedVertexA = tempResult.m_usedVertices.usedVertexA;
- finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexC;
+
+ finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.setBarycentricCoordinates(
tempResult.m_barycentricCoords[VERTA],
tempResult.m_barycentricCoords[VERTC],
@@ -563,15 +571,16 @@ bool btVoronoiSimplexSolver::closestPtPointTetrahedron(const btPoint3& p, const
closestPtPointTriangle(p, b, d, c,tempResult);
btPoint3 q = tempResult.m_closestPointOnSimplex;
//convert result bitmask!
- float sqDist = (q - p).dot( q - p);
+ btScalar sqDist = (q - p).dot( q - p);
if (sqDist < bestSqDist)
{
bestSqDist = sqDist;
finalResult.m_closestPointOnSimplex = q;
finalResult.m_usedVertices.reset();
+ //
finalResult.m_usedVertices.usedVertexB = tempResult.m_usedVertices.usedVertexA;
- finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.m_usedVertices.usedVertexC = tempResult.m_usedVertices.usedVertexC;
+ finalResult.m_usedVertices.usedVertexD = tempResult.m_usedVertices.usedVertexB;
finalResult.setBarycentricCoordinates(
0,
diff --git a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
index 8b743996915..356d335bc93 100644
--- a/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
+++ b/extern/bullet2/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h
@@ -55,7 +55,7 @@ struct btSubSimplexClosestResult
//stores the simplex vertex-usage, using the MASK,
// if m_usedVertices & MASK then the related vertex is used
btUsageBitfield m_usedVertices;
- float m_barycentricCoords[4];
+ btScalar m_barycentricCoords[4];
bool m_degenerate;
void reset()
@@ -66,15 +66,15 @@ struct btSubSimplexClosestResult
}
bool isValid()
{
- bool valid = (m_barycentricCoords[0] >= 0.f) &&
- (m_barycentricCoords[1] >= 0.f) &&
- (m_barycentricCoords[2] >= 0.f) &&
- (m_barycentricCoords[3] >= 0.f);
+ bool valid = (m_barycentricCoords[0] >= btScalar(0.)) &&
+ (m_barycentricCoords[1] >= btScalar(0.)) &&
+ (m_barycentricCoords[2] >= btScalar(0.)) &&
+ (m_barycentricCoords[3] >= btScalar(0.));
return valid;
}
- void setBarycentricCoordinates(float a=0.f,float b=0.f,float c=0.f,float d=0.f)
+ void setBarycentricCoordinates(btScalar a=btScalar(0.),btScalar b=btScalar(0.),btScalar c=btScalar(0.),btScalar d=btScalar(0.))
{
m_barycentricCoords[0] = a;
m_barycentricCoords[1] = b;
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
new file mode 100644
index 00000000000..12a33d7851e
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp
@@ -0,0 +1,286 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+btConeTwistConstraint is Copyright (c) 2007 Starbreeze Studios
+
+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.
+
+Written by: Marcus Hennix
+*/
+
+
+#include "btConeTwistConstraint.h"
+#include "BulletDynamics/Dynamics/btRigidBody.h"
+#include "LinearMath/btTransformUtil.h"
+#include "LinearMath/btSimdMinMax.h"
+#include <new>
+
+btConeTwistConstraint::btConeTwistConstraint()
+{
+}
+
+
+btConeTwistConstraint::btConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,
+ const btTransform& rbAFrame,const btTransform& rbBFrame)
+ :btTypedConstraint(rbA,rbB),m_rbAFrame(rbAFrame),m_rbBFrame(rbBFrame),
+ m_angularOnly(false)
+{
+ // flip axis for correct angles
+ m_rbBFrame.getBasis()[1][0] *= btScalar(-1.);
+ m_rbBFrame.getBasis()[1][1] *= btScalar(-1.);
+ m_rbBFrame.getBasis()[1][2] *= btScalar(-1.);
+
+ m_swingSpan1 = btScalar(1e30);
+ m_swingSpan2 = btScalar(1e30);
+ m_twistSpan = btScalar(1e30);
+ m_biasFactor = 0.3f;
+ m_relaxationFactor = 1.0f;
+
+ m_solveTwistLimit = false;
+ m_solveSwingLimit = false;
+
+}
+
+btConeTwistConstraint::btConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame)
+ :btTypedConstraint(rbA),m_rbAFrame(rbAFrame),
+ m_angularOnly(false)
+{
+ m_rbBFrame = m_rbAFrame;
+
+ // flip axis for correct angles
+ m_rbBFrame.getBasis()[1][0] *= btScalar(-1.);
+ m_rbBFrame.getBasis()[1][1] *= btScalar(-1.);
+ m_rbBFrame.getBasis()[1][2] *= btScalar(-1.);
+
+ m_rbBFrame.getBasis()[2][0] *= btScalar(-1.);
+ m_rbBFrame.getBasis()[2][1] *= btScalar(-1.);
+ m_rbBFrame.getBasis()[2][2] *= btScalar(-1.);
+
+ m_swingSpan1 = btScalar(1e30);
+ m_swingSpan2 = btScalar(1e30);
+ m_twistSpan = btScalar(1e30);
+ m_biasFactor = 0.3f;
+ m_relaxationFactor = 1.0f;
+
+ m_solveTwistLimit = false;
+ m_solveSwingLimit = false;
+
+}
+
+void btConeTwistConstraint::buildJacobian()
+{
+ m_appliedImpulse = btScalar(0.);
+
+ //set bias, sign, clear accumulator
+ m_swingCorrection = btScalar(0.);
+ m_twistLimitSign = btScalar(0.);
+ m_solveTwistLimit = false;
+ m_solveSwingLimit = false;
+ m_accTwistLimitImpulse = btScalar(0.);
+ m_accSwingLimitImpulse = btScalar(0.);
+
+ if (!m_angularOnly)
+ {
+ btVector3 pivotAInW = m_rbA.getCenterOfMassTransform()*m_rbAFrame.getOrigin();
+ btVector3 pivotBInW = m_rbB.getCenterOfMassTransform()*m_rbBFrame.getOrigin();
+ btVector3 relPos = pivotBInW - pivotAInW;
+
+ btVector3 normal[3];
+ if (relPos.length2() > SIMD_EPSILON)
+ {
+ normal[0] = relPos.normalized();
+ }
+ else
+ {
+ normal[0].setValue(btScalar(1.0),0,0);
+ }
+
+ btPlaneSpace1(normal[0], normal[1], normal[2]);
+
+ for (int i=0;i<3;i++)
+ {
+ new (&m_jac[i]) btJacobianEntry(
+ m_rbA.getCenterOfMassTransform().getBasis().transpose(),
+ m_rbB.getCenterOfMassTransform().getBasis().transpose(),
+ pivotAInW - m_rbA.getCenterOfMassPosition(),
+ pivotBInW - m_rbB.getCenterOfMassPosition(),
+ normal[i],
+ m_rbA.getInvInertiaDiagLocal(),
+ m_rbA.getInvMass(),
+ m_rbB.getInvInertiaDiagLocal(),
+ m_rbB.getInvMass());
+ }
+ }
+
+ btVector3 b1Axis1,b1Axis2,b1Axis3;
+ btVector3 b2Axis1,b2Axis2;
+
+ b1Axis1 = getRigidBodyA().getCenterOfMassTransform().getBasis() * this->m_rbAFrame.getBasis().getColumn(0);
+ b2Axis1 = getRigidBodyB().getCenterOfMassTransform().getBasis() * this->m_rbBFrame.getBasis().getColumn(0);
+
+ btScalar swing1=btScalar(0.),swing2 = btScalar(0.);
+
+ // Get Frame into world space
+ if (m_swingSpan1 >= btScalar(0.05f))
+ {
+ b1Axis2 = getRigidBodyA().getCenterOfMassTransform().getBasis() * this->m_rbAFrame.getBasis().getColumn(1);
+ swing1 = btAtan2Fast( b2Axis1.dot(b1Axis2),b2Axis1.dot(b1Axis1) );
+ }
+
+ if (m_swingSpan2 >= btScalar(0.05f))
+ {
+ b1Axis3 = getRigidBodyA().getCenterOfMassTransform().getBasis() * this->m_rbAFrame.getBasis().getColumn(2);
+ swing2 = btAtan2Fast( b2Axis1.dot(b1Axis3),b2Axis1.dot(b1Axis1) );
+ }
+
+ btScalar RMaxAngle1Sq = 1.0f / (m_swingSpan1*m_swingSpan1);
+ btScalar RMaxAngle2Sq = 1.0f / (m_swingSpan2*m_swingSpan2);
+ btScalar EllipseAngle = btFabs(swing1)* RMaxAngle1Sq + btFabs(swing2) * RMaxAngle2Sq;
+
+ if (EllipseAngle > 1.0f)
+ {
+ m_swingCorrection = EllipseAngle-1.0f;
+ m_solveSwingLimit = true;
+
+ // Calculate necessary axis & factors
+ m_swingAxis = b2Axis1.cross(b1Axis2* b2Axis1.dot(b1Axis2) + b1Axis3* b2Axis1.dot(b1Axis3));
+ m_swingAxis.normalize();
+
+ btScalar swingAxisSign = (b2Axis1.dot(b1Axis1) >= 0.0f) ? 1.0f : -1.0f;
+ m_swingAxis *= swingAxisSign;
+
+ m_kSwing = btScalar(1.) / (getRigidBodyA().computeAngularImpulseDenominator(m_swingAxis) +
+ getRigidBodyB().computeAngularImpulseDenominator(m_swingAxis));
+
+ }
+
+ // Twist limits
+ if (m_twistSpan >= btScalar(0.))
+ {
+ btVector3 b2Axis2 = getRigidBodyB().getCenterOfMassTransform().getBasis() * this->m_rbBFrame.getBasis().getColumn(1);
+ btQuaternion rotationArc = shortestArcQuat(b2Axis1,b1Axis1);
+ btVector3 TwistRef = quatRotate(rotationArc,b2Axis2);
+ btScalar twist = btAtan2Fast( TwistRef.dot(b1Axis3), TwistRef.dot(b1Axis2) );
+
+ btScalar lockedFreeFactor = (m_twistSpan > btScalar(0.05f)) ? m_limitSoftness : btScalar(0.);
+ if (twist <= -m_twistSpan*lockedFreeFactor)
+ {
+ m_twistCorrection = -(twist + m_twistSpan);
+ m_solveTwistLimit = true;
+
+ m_twistAxis = (b2Axis1 + b1Axis1) * 0.5f;
+ m_twistAxis.normalize();
+ m_twistAxis *= -1.0f;
+
+ m_kTwist = btScalar(1.) / (getRigidBodyA().computeAngularImpulseDenominator(m_twistAxis) +
+ getRigidBodyB().computeAngularImpulseDenominator(m_twistAxis));
+
+ } else
+ if (twist > m_twistSpan*lockedFreeFactor)
+ {
+ m_twistCorrection = (twist - m_twistSpan);
+ m_solveTwistLimit = true;
+
+ m_twistAxis = (b2Axis1 + b1Axis1) * 0.5f;
+ m_twistAxis.normalize();
+
+ m_kTwist = btScalar(1.) / (getRigidBodyA().computeAngularImpulseDenominator(m_twistAxis) +
+ getRigidBodyB().computeAngularImpulseDenominator(m_twistAxis));
+
+ }
+ }
+}
+
+void btConeTwistConstraint::solveConstraint(btScalar timeStep)
+{
+
+ btVector3 pivotAInW = m_rbA.getCenterOfMassTransform()*m_rbAFrame.getOrigin();
+ btVector3 pivotBInW = m_rbB.getCenterOfMassTransform()*m_rbBFrame.getOrigin();
+
+ btScalar tau = btScalar(0.3);
+ btScalar damping = btScalar(1.);
+
+ //linear part
+ if (!m_angularOnly)
+ {
+ btVector3 rel_pos1 = pivotAInW - m_rbA.getCenterOfMassPosition();
+ btVector3 rel_pos2 = pivotBInW - m_rbB.getCenterOfMassPosition();
+
+ btVector3 vel1 = m_rbA.getVelocityInLocalPoint(rel_pos1);
+ btVector3 vel2 = m_rbB.getVelocityInLocalPoint(rel_pos2);
+ 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;
+ m_rbA.applyImpulse(impulse_vector, pivotAInW - m_rbA.getCenterOfMassPosition());
+ m_rbB.applyImpulse(-impulse_vector, pivotBInW - m_rbB.getCenterOfMassPosition());
+ }
+ }
+
+ {
+ ///solve angular part
+ const btVector3& angVelA = getRigidBodyA().getAngularVelocity();
+ const btVector3& angVelB = getRigidBodyB().getAngularVelocity();
+
+ // solve swing limit
+ if (m_solveSwingLimit)
+ {
+ btScalar amplitude = ((angVelB - angVelA).dot( m_swingAxis )*m_relaxationFactor*m_relaxationFactor + m_swingCorrection*(btScalar(1.)/timeStep)*m_biasFactor);
+ btScalar impulseMag = amplitude * m_kSwing;
+
+ // Clamp the accumulated impulse
+ btScalar temp = m_accSwingLimitImpulse;
+ m_accSwingLimitImpulse = btMax(m_accSwingLimitImpulse + impulseMag, 0.0f );
+ impulseMag = m_accSwingLimitImpulse - temp;
+
+ btVector3 impulse = m_swingAxis * impulseMag;
+
+ m_rbA.applyTorqueImpulse(impulse);
+ m_rbB.applyTorqueImpulse(-impulse);
+
+ }
+
+ // solve twist limit
+ if (m_solveTwistLimit)
+ {
+ btScalar amplitude = ((angVelB - angVelA).dot( m_twistAxis )*m_relaxationFactor*m_relaxationFactor + m_twistCorrection*(btScalar(1.)/timeStep)*m_biasFactor );
+ btScalar impulseMag = amplitude * m_kTwist;
+
+ // Clamp the accumulated impulse
+ btScalar temp = m_accTwistLimitImpulse;
+ m_accTwistLimitImpulse = btMax(m_accTwistLimitImpulse + impulseMag, 0.0f );
+ impulseMag = m_accTwistLimitImpulse - temp;
+
+ btVector3 impulse = m_twistAxis * impulseMag;
+
+ m_rbA.applyTorqueImpulse(impulse);
+ m_rbB.applyTorqueImpulse(-impulse);
+
+ }
+
+ }
+
+}
+
+void btConeTwistConstraint::updateRHS(btScalar timeStep)
+{
+ (void)timeStep;
+
+}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
new file mode 100644
index 00000000000..874669c80b3
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h
@@ -0,0 +1,123 @@
+/*
+Bullet Continuous Collision Detection and Physics Library
+btConeTwistConstraint is Copyright (c) 2007 Starbreeze Studios
+
+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.
+
+Written by: Marcus Hennix
+*/
+
+
+
+#ifndef CONETWISTCONSTRAINT_H
+#define CONETWISTCONSTRAINT_H
+
+#include "../../LinearMath/btVector3.h"
+#include "btJacobianEntry.h"
+#include "btTypedConstraint.h"
+
+class btRigidBody;
+
+
+///btConeTwistConstraint can be used to simulate ragdoll joints (upper arm, leg etc)
+class btConeTwistConstraint : public btTypedConstraint
+{
+ btJacobianEntry m_jac[3]; //3 orthogonal linear constraints
+
+ btTransform m_rbAFrame;
+ btTransform m_rbBFrame;
+
+ btScalar m_limitSoftness;
+ btScalar m_biasFactor;
+ btScalar m_relaxationFactor;
+
+ btScalar m_swingSpan1;
+ btScalar m_swingSpan2;
+ btScalar m_twistSpan;
+
+ btVector3 m_swingAxis;
+ btVector3 m_twistAxis;
+
+ btScalar m_kSwing;
+ btScalar m_kTwist;
+
+ btScalar m_twistLimitSign;
+ btScalar m_swingCorrection;
+ btScalar m_twistCorrection;
+
+ btScalar m_accSwingLimitImpulse;
+ btScalar m_accTwistLimitImpulse;
+
+ bool m_angularOnly;
+ bool m_solveTwistLimit;
+ bool m_solveSwingLimit;
+
+
+public:
+
+ btConeTwistConstraint(btRigidBody& rbA,btRigidBody& rbB,const btTransform& rbAFrame, const btTransform& rbBFrame);
+
+ btConeTwistConstraint(btRigidBody& rbA,const btTransform& rbAFrame);
+
+ btConeTwistConstraint();
+
+ virtual void buildJacobian();
+
+ virtual void solveConstraint(btScalar timeStep);
+
+ void updateRHS(btScalar timeStep);
+
+ const btRigidBody& getRigidBodyA() const
+ {
+ return m_rbA;
+ }
+ const btRigidBody& getRigidBodyB() const
+ {
+ return m_rbB;
+ }
+
+ void setAngularOnly(bool angularOnly)
+ {
+ m_angularOnly = angularOnly;
+ }
+
+ void setLimit(btScalar _swingSpan1,btScalar _swingSpan2,btScalar _twistSpan, btScalar _softness = 0.8f, btScalar _biasFactor = 0.3f, btScalar _relaxationFactor = 1.0f)
+ {
+ m_swingSpan1 = _swingSpan1;
+ m_swingSpan2 = _swingSpan2;
+ m_twistSpan = _twistSpan;
+
+ m_limitSoftness = _softness;
+ m_biasFactor = _biasFactor;
+ m_relaxationFactor = _relaxationFactor;
+ }
+
+ const btTransform& getAFrame() { return m_rbAFrame; };
+ const btTransform& getBFrame() { return m_rbBFrame; };
+
+ inline int getSolveTwistLimit()
+ {
+ return m_solveTwistLimit;
+ }
+
+ inline int getSolveSwingLimit()
+ {
+ return m_solveTwistLimit;
+ }
+
+ inline btScalar getTwistLimitSign()
+ {
+ return m_twistLimitSign;
+ }
+
+};
+
+#endif //CONETWISTCONSTRAINT_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConstraintSolver.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConstraintSolver.h
index ce90f798c04..7e8458c2c7b 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConstraintSolver.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btConstraintSolver.h
@@ -16,12 +16,16 @@ subject to the following restrictions:
#ifndef CONSTRAINT_SOLVER_H
#define CONSTRAINT_SOLVER_H
+#include "../../LinearMath/btScalar.h"
+
class btPersistentManifold;
class btRigidBody;
+class btCollisionObject;
class btTypedConstraint;
struct btContactSolverInfo;
struct btBroadphaseProxy;
class btIDebugDraw;
+class btStackAlloc;
/// btConstraintSolver provides solver interface
class btConstraintSolver
@@ -31,7 +35,7 @@ public:
virtual ~btConstraintSolver() {}
- virtual float solveGroup(btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints, const btContactSolverInfo& info,class btIDebugDraw* debugDrawer = 0) = 0;
+ virtual btScalar solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints, const btContactSolverInfo& info,class btIDebugDraw* debugDrawer, btStackAlloc* stackAlloc) = 0;
};
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
index 1b85a0eea42..bb3fe832592 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp
@@ -30,13 +30,17 @@ subject to the following restrictions:
//bilateral constraint between two dynamic objects
void resolveSingleBilateral(btRigidBody& body1, const btVector3& pos1,
btRigidBody& body2, const btVector3& pos2,
- btScalar distance, const btVector3& normal,btScalar& impulse ,float timeStep)
+ btScalar distance, const btVector3& normal,btScalar& impulse ,btScalar timeStep)
{
- float normalLenSqr = normal.length2();
- ASSERT2(fabs(normalLenSqr) < 1.1f);
- if (normalLenSqr > 1.1f)
+ (void)timeStep;
+ (void)distance;
+
+
+ btScalar normalLenSqr = normal.length2();
+ ASSERT2(btFabs(normalLenSqr) < btScalar(1.1));
+ if (normalLenSqr > btScalar(1.1))
{
- impulse = 0.f;
+ impulse = btScalar(0.);
return;
}
btVector3 rel_pos1 = pos1 - body1.getCenterOfMassPosition();
@@ -54,24 +58,24 @@ void resolveSingleBilateral(btRigidBody& body1, const btVector3& pos1,
body2.getInvInertiaDiagLocal(),body2.getInvMass());
btScalar jacDiagAB = jac.getDiagonal();
- btScalar jacDiagABInv = 1.f / jacDiagAB;
+ btScalar jacDiagABInv = btScalar(1.) / jacDiagAB;
btScalar rel_vel = jac.getRelativeVelocity(
body1.getLinearVelocity(),
body1.getCenterOfMassTransform().getBasis().transpose() * body1.getAngularVelocity(),
body2.getLinearVelocity(),
body2.getCenterOfMassTransform().getBasis().transpose() * body2.getAngularVelocity());
- float a;
+ btScalar a;
a=jacDiagABInv;
rel_vel = normal.dot(vel);
//todo: move this into proper structure
- btScalar contactDamping = 0.2f;
+ btScalar contactDamping = btScalar(0.2);
#ifdef ONLY_USE_LINEAR_MASS
- btScalar massTerm = 1.f / (body1.getInvMass() + body2.getInvMass());
+ btScalar massTerm = btScalar(1.) / (body1.getInvMass() + body2.getInvMass());
impulse = - contactDamping * rel_vel * massTerm;
#else
btScalar velocityImpulse = -contactDamping * rel_vel * jacDiagABInv;
@@ -82,19 +86,20 @@ void resolveSingleBilateral(btRigidBody& body1, const btVector3& pos1,
//response between two dynamic objects with friction
-float resolveSingleCollision(
+btScalar resolveSingleCollision(
btRigidBody& body1,
btRigidBody& body2,
btManifoldPoint& contactPoint,
const btContactSolverInfo& solverInfo)
{
- const btVector3& pos1 = contactPoint.getPositionWorldOnA();
- const btVector3& pos2 = contactPoint.getPositionWorldOnB();
+ 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();
+ //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);
@@ -102,11 +107,11 @@ float resolveSingleCollision(
btScalar rel_vel;
rel_vel = normal.dot(vel);
- btScalar Kfps = 1.f / solverInfo.m_timeStep ;
+ btScalar Kfps = btScalar(1.) / solverInfo.m_timeStep ;
- // float damping = solverInfo.m_damping ;
- float Kerp = solverInfo.m_erp;
- float Kcor = Kerp *Kfps;
+ // btScalar damping = solverInfo.m_damping ;
+ btScalar Kerp = solverInfo.m_erp;
+ btScalar Kcor = Kerp *Kfps;
btConstraintPersistentData* cpd = (btConstraintPersistentData*) contactPoint.m_userPersistentData;
assert(cpd);
@@ -121,9 +126,9 @@ float resolveSingleCollision(
btScalar normalImpulse = penetrationImpulse+velocityImpulse;
// See Erin Catto's GDC 2006 paper: Clamp the accumulated impulse
- float oldNormalImpulse = cpd->m_appliedImpulse;
- float sum = oldNormalImpulse + normalImpulse;
- cpd->m_appliedImpulse = 0.f > sum ? 0.f: sum;
+ btScalar oldNormalImpulse = cpd->m_appliedImpulse;
+ btScalar sum = oldNormalImpulse + normalImpulse;
+ cpd->m_appliedImpulse = btScalar(0.) > sum ? btScalar(0.): sum;
normalImpulse = cpd->m_appliedImpulse - oldNormalImpulse;
@@ -145,13 +150,15 @@ float resolveSingleCollision(
}
-float resolveSingleFriction(
+btScalar resolveSingleFriction(
btRigidBody& body1,
btRigidBody& body2,
btManifoldPoint& contactPoint,
const btContactSolverInfo& solverInfo)
{
+ (void)solverInfo;
+
const btVector3& pos1 = contactPoint.getPositionWorldOnA();
const btVector3& pos2 = contactPoint.getPositionWorldOnB();
@@ -161,11 +168,11 @@ float resolveSingleFriction(
btConstraintPersistentData* cpd = (btConstraintPersistentData*) contactPoint.m_userPersistentData;
assert(cpd);
- float combinedFriction = cpd->m_friction;
+ btScalar combinedFriction = cpd->m_friction;
btScalar limit = cpd->m_appliedImpulse * combinedFriction;
- if (cpd->m_appliedImpulse>0.f)
+ if (cpd->m_appliedImpulse>btScalar(0.))
//friction
{
//apply friction in the 2 tangential directions
@@ -183,7 +190,7 @@ float resolveSingleFriction(
// calculate j that moves us to zero relative velocity
j1 = -vrel * cpd->m_jacDiagABInvTangent0;
- float oldTangentImpulse = cpd->m_accumulatedTangentImpulse0;
+ btScalar oldTangentImpulse = cpd->m_accumulatedTangentImpulse0;
cpd->m_accumulatedTangentImpulse0 = oldTangentImpulse + j1;
GEN_set_min(cpd->m_accumulatedTangentImpulse0, limit);
GEN_set_max(cpd->m_accumulatedTangentImpulse0, -limit);
@@ -197,7 +204,7 @@ float resolveSingleFriction(
// calculate j that moves us to zero relative velocity
j2 = -vrel * cpd->m_jacDiagABInvTangent1;
- float oldTangentImpulse = cpd->m_accumulatedTangentImpulse1;
+ btScalar oldTangentImpulse = cpd->m_accumulatedTangentImpulse1;
cpd->m_accumulatedTangentImpulse1 = oldTangentImpulse + j2;
GEN_set_min(cpd->m_accumulatedTangentImpulse1, limit);
GEN_set_max(cpd->m_accumulatedTangentImpulse1, -limit);
@@ -226,13 +233,15 @@ float resolveSingleFriction(
}
-float resolveSingleFrictionOriginal(
+btScalar resolveSingleFrictionOriginal(
btRigidBody& body1,
btRigidBody& body2,
btManifoldPoint& contactPoint,
const btContactSolverInfo& solverInfo)
{
+ (void)solverInfo;
+
const btVector3& pos1 = contactPoint.getPositionWorldOnA();
const btVector3& pos2 = contactPoint.getPositionWorldOnB();
@@ -242,10 +251,10 @@ float resolveSingleFrictionOriginal(
btConstraintPersistentData* cpd = (btConstraintPersistentData*) contactPoint.m_userPersistentData;
assert(cpd);
- float combinedFriction = cpd->m_friction;
+ btScalar combinedFriction = cpd->m_friction;
btScalar limit = cpd->m_appliedImpulse * combinedFriction;
- //if (contactPoint.m_appliedImpulse>0.f)
+ //if (contactPoint.m_appliedImpulse>btScalar(0.))
//friction
{
//apply friction in the 2 tangential directions
@@ -260,7 +269,7 @@ float resolveSingleFrictionOriginal(
// calculate j that moves us to zero relative velocity
btScalar j = -vrel * cpd->m_jacDiagABInvTangent0;
- float total = cpd->m_accumulatedTangentImpulse0 + j;
+ btScalar total = cpd->m_accumulatedTangentImpulse0 + j;
GEN_set_min(total, limit);
GEN_set_max(total, -limit);
j = total - cpd->m_accumulatedTangentImpulse0;
@@ -280,7 +289,7 @@ float resolveSingleFrictionOriginal(
// calculate j that moves us to zero relative velocity
btScalar j = -vrel * cpd->m_jacDiagABInvTangent1;
- float total = cpd->m_accumulatedTangentImpulse1 + j;
+ btScalar total = cpd->m_accumulatedTangentImpulse1 + j;
GEN_set_min(total, limit);
GEN_set_max(total, -limit);
j = total - cpd->m_accumulatedTangentImpulse1;
@@ -295,7 +304,7 @@ float resolveSingleFrictionOriginal(
//velocity + friction
//response between two dynamic objects with friction
-float resolveSingleCollisionCombined(
+btScalar resolveSingleCollisionCombined(
btRigidBody& body1,
btRigidBody& body2,
btManifoldPoint& contactPoint,
@@ -315,11 +324,11 @@ float resolveSingleCollisionCombined(
btScalar rel_vel;
rel_vel = normal.dot(vel);
- btScalar Kfps = 1.f / solverInfo.m_timeStep ;
+ btScalar Kfps = btScalar(1.) / solverInfo.m_timeStep ;
- //float damping = solverInfo.m_damping ;
- float Kerp = solverInfo.m_erp;
- float Kcor = Kerp *Kfps;
+ //btScalar damping = solverInfo.m_damping ;
+ btScalar Kerp = solverInfo.m_erp;
+ btScalar Kcor = Kerp *Kfps;
btConstraintPersistentData* cpd = (btConstraintPersistentData*) contactPoint.m_userPersistentData;
assert(cpd);
@@ -334,9 +343,9 @@ float resolveSingleCollisionCombined(
btScalar normalImpulse = penetrationImpulse+velocityImpulse;
// See Erin Catto's GDC 2006 paper: Clamp the accumulated impulse
- float oldNormalImpulse = cpd->m_appliedImpulse;
- float sum = oldNormalImpulse + normalImpulse;
- cpd->m_appliedImpulse = 0.f > sum ? 0.f: sum;
+ btScalar oldNormalImpulse = cpd->m_appliedImpulse;
+ btScalar sum = oldNormalImpulse + normalImpulse;
+ cpd->m_appliedImpulse = btScalar(0.) > sum ? btScalar(0.): sum;
normalImpulse = cpd->m_appliedImpulse - oldNormalImpulse;
@@ -367,7 +376,7 @@ float resolveSingleCollisionCombined(
btVector3 lat_vel = vel - normal * rel_vel;
btScalar lat_rel_vel = lat_vel.length();
- float combinedFriction = cpd->m_friction;
+ btScalar combinedFriction = cpd->m_friction;
if (cpd->m_appliedImpulse > 0)
if (lat_rel_vel > SIMD_EPSILON)
@@ -390,12 +399,19 @@ float resolveSingleCollisionCombined(
return normalImpulse;
}
-float resolveSingleFrictionEmpty(
+
+btScalar resolveSingleFrictionEmpty(
btRigidBody& body1,
btRigidBody& body2,
btManifoldPoint& contactPoint,
const btContactSolverInfo& solverInfo)
{
- return 0.f;
+ (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 d88ba0d8ed4..0834deddeac 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactConstraint.h
@@ -19,8 +19,8 @@ subject to the following restrictions:
//todo: make into a proper class working with the iterative constraint solver
class btRigidBody;
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btScalar.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btScalar.h"
struct btContactSolverInfo;
class btManifoldPoint;
@@ -33,7 +33,7 @@ enum {
};
-typedef float (*ContactSolverFunc)(btRigidBody& body1,
+typedef btScalar (*ContactSolverFunc)(btRigidBody& body1,
btRigidBody& body2,
class btManifoldPoint& contactPoint,
const btContactSolverInfo& info);
@@ -42,15 +42,15 @@ typedef float (*ContactSolverFunc)(btRigidBody& body1,
struct btConstraintPersistentData
{
inline btConstraintPersistentData()
- :m_appliedImpulse(0.f),
- m_prevAppliedImpulse(0.f),
- m_accumulatedTangentImpulse0(0.f),
- m_accumulatedTangentImpulse1(0.f),
- m_jacDiagABInv(0.f),
+ :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(0.f),
- m_friction(0.f),
- m_penetration(0.f),
+ m_restitution(btScalar(0.)),
+ m_friction(btScalar(0.)),
+ m_penetration(btScalar(0.)),
m_contactSolverFunc(0),
m_frictionSolverFunc(0)
{
@@ -58,18 +58,18 @@ struct btConstraintPersistentData
/// total applied impulse during most recent frame
- float m_appliedImpulse;
- float m_prevAppliedImpulse;
- float m_accumulatedTangentImpulse0;
- float m_accumulatedTangentImpulse1;
+ btScalar m_appliedImpulse;
+ btScalar m_prevAppliedImpulse;
+ btScalar m_accumulatedTangentImpulse0;
+ btScalar m_accumulatedTangentImpulse1;
- float m_jacDiagABInv;
- float m_jacDiagABInvTangent0;
- float m_jacDiagABInvTangent1;
+ btScalar m_jacDiagABInv;
+ btScalar m_jacDiagABInvTangent0;
+ btScalar m_jacDiagABInvTangent1;
int m_persistentLifeTime;
- float m_restitution;
- float m_friction;
- float m_penetration;
+ btScalar m_restitution;
+ btScalar m_friction;
+ btScalar m_penetration;
btVector3 m_frictionWorldTangential0;
btVector3 m_frictionWorldTangential1;
@@ -91,19 +91,28 @@ struct btConstraintPersistentData
///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 ,float timeStep);
+ btScalar distance, const btVector3& normal,btScalar& impulse ,btScalar timeStep);
///contact constraint resolution:
///calculate and apply impulse to satisfy non-penetration and non-negative relative velocity constraint
///positive distance = separation, negative distance = penetration
-float resolveSingleCollision(
+btScalar resolveSingleCollision(
btRigidBody& body1,
btRigidBody& body2,
btManifoldPoint& contactPoint,
const btContactSolverInfo& info);
-float resolveSingleFriction(
+btScalar resolveSingleFriction(
+ btRigidBody& body1,
+ btRigidBody& body2,
+ btManifoldPoint& contactPoint,
+ const btContactSolverInfo& solverInfo
+ );
+
+
+
+btScalar resolveSingleCollisionCombined(
btRigidBody& body1,
btRigidBody& body2,
btManifoldPoint& contactPoint,
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
index ed1ba6ac1ba..c3c73e300f4 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h
@@ -22,25 +22,25 @@ struct btContactSolverInfo
inline btContactSolverInfo()
{
- m_tau = 0.6f;
- m_damping = 1.0f;
- m_friction = 0.3f;
- m_restitution = 0.f;
- m_maxErrorReduction = 20.f;
+ m_tau = btScalar(0.6);
+ m_damping = btScalar(1.0);
+ m_friction = btScalar(0.3);
+ m_restitution = btScalar(0.);
+ m_maxErrorReduction = btScalar(20.);
m_numIterations = 10;
- m_erp = 0.4f;
- m_sor = 1.3f;
+ m_erp = btScalar(0.4);
+ m_sor = btScalar(1.3);
}
- float m_tau;
- float m_damping;
- float m_friction;
- float m_timeStep;
- float m_restitution;
+ btScalar m_tau;
+ btScalar m_damping;
+ btScalar m_friction;
+ btScalar m_timeStep;
+ btScalar m_restitution;
int m_numIterations;
- float m_maxErrorReduction;
- float m_sor;
- float m_erp;
+ btScalar m_maxErrorReduction;
+ btScalar m_sor;
+ btScalar m_erp;
};
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
index b2132a8d4f3..747d10d1f8b 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
@@ -17,8 +17,9 @@ subject to the following restrictions:
#include "btGeneric6DofConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
+#include <new>
-static const btScalar kSign[] = { 1.0f, -1.0f, 1.0f };
+static const btScalar kSign[] = { btScalar(1.0), btScalar(-1.0), btScalar(1.0) };
static const int kAxisA[] = { 1, 0, 0 };
static const int kAxisB[] = { 2, 2, 1 };
#define GENERIC_D6_DISABLE_WARMSTARTING 1
@@ -38,9 +39,9 @@ btGeneric6DofConstraint::btGeneric6DofConstraint(btRigidBody& rbA, btRigidBody&
//so start all locked
for (int i=0; i<6;++i)
{
- m_lowerLimit[i] = 0.0f;
- m_upperLimit[i] = 0.0f;
- m_accumulatedImpulse[i] = 0.0f;
+ m_lowerLimit[i] = btScalar(0.0);
+ m_upperLimit[i] = btScalar(0.0);
+ m_accumulatedImpulse[i] = btScalar(0.0);
}
}
@@ -83,7 +84,7 @@ void btGeneric6DofConstraint::buildJacobian()
//optionally disable warmstarting
#ifdef GENERIC_D6_DISABLE_WARMSTARTING
- m_accumulatedImpulse[i] = 0.f;
+ m_accumulatedImpulse[i] = btScalar(0.);
#endif //GENERIC_D6_DISABLE_WARMSTARTING
// Apply accumulated impulse
@@ -115,7 +116,7 @@ void btGeneric6DofConstraint::buildJacobian()
m_rbB.getInvInertiaDiagLocal());
#ifdef GENERIC_D6_DISABLE_WARMSTARTING
- m_accumulatedImpulse[i + 3] = 0.f;
+ m_accumulatedImpulse[i + 3] = btScalar(0.);
#endif //GENERIC_D6_DISABLE_WARMSTARTING
// Apply accumulated impulse
@@ -127,7 +128,7 @@ void btGeneric6DofConstraint::buildJacobian()
}
}
-float getMatrixElem(const btMatrix3x3& mat,int index)
+btScalar getMatrixElem(const btMatrix3x3& mat,int index)
{
int row = index%3;
int col = index / 3;
@@ -143,9 +144,9 @@ bool MatrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz)
/// 0..8
- if (getMatrixElem(mat,2) < 1.0f)
+ if (getMatrixElem(mat,2) < btScalar(1.0))
{
- if (getMatrixElem(mat,2) > -1.0f)
+ if (getMatrixElem(mat,2) > btScalar(-1.0))
{
xyz[0] = btAtan2(-getMatrixElem(mat,5),getMatrixElem(mat,8));
xyz[1] = btAsin(getMatrixElem(mat,2));
@@ -157,7 +158,7 @@ bool MatrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz)
// WARNING. Not unique. XA - ZA = -atan2(r10,r11)
xyz[0] = -btAtan2(getMatrixElem(mat,3),getMatrixElem(mat,4));
xyz[1] = -SIMD_HALF_PI;
- xyz[2] = 0.0f;
+ xyz[2] = btScalar(0.0);
return false;
}
}
@@ -167,16 +168,17 @@ bool MatrixToEulerXYZ(const btMatrix3x3& mat,btVector3& xyz)
xyz[0] = btAtan2(getMatrixElem(mat,3),getMatrixElem(mat,4));
xyz[1] = SIMD_HALF_PI;
xyz[2] = 0.0;
- return false;
+
}
- return false;
+
+ return false;
}
void btGeneric6DofConstraint::solveConstraint(btScalar timeStep)
{
- btScalar tau = 0.1f;
- btScalar damping = 1.0f;
+ btScalar tau = btScalar(0.1);
+ btScalar damping = btScalar(1.0);
btVector3 pivotAInW = m_rbA.getCenterOfMassTransform() * m_frameInA.getOrigin();
btVector3 pivotBInW = m_rbB.getCenterOfMassTransform() * m_frameInB.getOrigin();
@@ -199,7 +201,7 @@ void btGeneric6DofConstraint::solveConstraint(btScalar timeStep)
localNormalInA[i] = 1;
btVector3 normalWorld = m_rbA.getCenterOfMassTransform().getBasis() * localNormalInA;
- btScalar jacDiagABInv = 1.f / m_jacLinear[i].getDiagonal();
+ btScalar jacDiagABInv = btScalar(1.) / m_jacLinear[i].getDiagonal();
//velocity error (first order error)
btScalar rel_vel = m_jacLinear[i].getRelativeVelocity(m_rbA.getLinearVelocity(),angvelA,
@@ -207,8 +209,8 @@ void btGeneric6DofConstraint::solveConstraint(btScalar timeStep)
//positional error (zeroth order error)
btScalar depth = -(pivotAInW - pivotBInW).dot(normalWorld);
- btScalar lo = -1e30f;
- btScalar hi = 1e30f;
+ btScalar lo = btScalar(-1e30);
+ btScalar hi = btScalar(1e30);
//handle the limits
if (m_lowerLimit[i] < m_upperLimit[i])
@@ -217,14 +219,14 @@ void btGeneric6DofConstraint::solveConstraint(btScalar timeStep)
if (depth > m_upperLimit[i])
{
depth -= m_upperLimit[i];
- lo = 0.f;
+ lo = btScalar(0.);
} else
{
if (depth < m_lowerLimit[i])
{
depth -= m_lowerLimit[i];
- hi = 0.f;
+ hi = btScalar(0.);
} else
{
continue;
@@ -234,9 +236,9 @@ void btGeneric6DofConstraint::solveConstraint(btScalar timeStep)
}
btScalar normalImpulse= (tau*depth/timeStep - damping*rel_vel) * jacDiagABInv;
- float oldNormalImpulse = m_accumulatedImpulse[i];
- float sum = oldNormalImpulse + normalImpulse;
- m_accumulatedImpulse[i] = sum > hi ? 0.f : sum < lo ? 0.f : sum;
+ btScalar oldNormalImpulse = m_accumulatedImpulse[i];
+ btScalar sum = oldNormalImpulse + normalImpulse;
+ m_accumulatedImpulse[i] = sum > hi ? btScalar(0.) : sum < lo ? btScalar(0.) : sum;
normalImpulse = m_accumulatedImpulse[i] - oldNormalImpulse;
btVector3 impulse_vector = normalWorld * normalImpulse;
@@ -267,7 +269,7 @@ void btGeneric6DofConstraint::solveConstraint(btScalar timeStep)
btVector3 angvelA = m_rbA.getCenterOfMassTransform().getBasis().transpose() * m_rbA.getAngularVelocity();
btVector3 angvelB = m_rbB.getCenterOfMassTransform().getBasis().transpose() * m_rbB.getAngularVelocity();
- btScalar jacDiagABInv = 1.f / m_jacAng[i].getDiagonal();
+ btScalar jacDiagABInv = btScalar(1.) / m_jacAng[i].getDiagonal();
//velocity error (first order error)
btScalar rel_vel = m_jacAng[i].getRelativeVelocity(m_rbA.getLinearVelocity(),angvelA,
@@ -279,27 +281,27 @@ void btGeneric6DofConstraint::solveConstraint(btScalar timeStep)
btScalar rel_pos = kSign[i] * axisA.dot(axisB);
- btScalar lo = -1e30f;
- btScalar hi = 1e30f;
+ btScalar lo = btScalar(-1e30);
+ btScalar hi = btScalar(1e30);
//handle the twist limit
if (m_lowerLimit[i+3] < m_upperLimit[i+3])
{
//clamp the values
- btScalar loLimit = m_upperLimit[i+3] > -3.1415 ? m_lowerLimit[i+3] : -1e30f;
- btScalar hiLimit = m_upperLimit[i+3] < 3.1415 ? m_upperLimit[i+3] : 1e30f;
+ btScalar loLimit = m_lowerLimit[i+3] > -3.1415 ? m_lowerLimit[i+3] : btScalar(-1e30);
+ btScalar hiLimit = m_upperLimit[i+3] < 3.1415 ? m_upperLimit[i+3] : btScalar(1e30);
- float projAngle = -2.f*xyz[i];
+ btScalar projAngle = btScalar(-1.)*xyz[i];
if (projAngle < loLimit)
{
- hi = 0.f;
+ hi = btScalar(0.);
rel_pos = (loLimit - projAngle);
} else
{
if (projAngle > hiLimit)
{
- lo = 0.f;
+ lo = btScalar(0.);
rel_pos = (hiLimit - projAngle);
} else
{
@@ -311,9 +313,9 @@ void btGeneric6DofConstraint::solveConstraint(btScalar timeStep)
//impulse
btScalar normalImpulse= -(tau*rel_pos/timeStep + damping*rel_vel) * jacDiagABInv;
- float oldNormalImpulse = m_accumulatedImpulse[i+3];
- float sum = oldNormalImpulse + normalImpulse;
- m_accumulatedImpulse[i+3] = sum > hi ? 0.f : sum < lo ? 0.f : sum;
+ btScalar oldNormalImpulse = m_accumulatedImpulse[i+3];
+ btScalar sum = oldNormalImpulse + normalImpulse;
+ m_accumulatedImpulse[i+3] = sum > hi ? btScalar(0.) : sum < lo ? btScalar(0.) : sum;
normalImpulse = m_accumulatedImpulse[i+3] - oldNormalImpulse;
// Dirk: Not needed - we could actually project onto Jacobian entry here (same as above)
@@ -328,12 +330,13 @@ void btGeneric6DofConstraint::solveConstraint(btScalar timeStep)
void btGeneric6DofConstraint::updateRHS(btScalar timeStep)
{
+ (void)timeStep;
}
btScalar btGeneric6DofConstraint::computeAngle(int axis) const
{
- btScalar angle;
+ btScalar angle = btScalar(0.f);
switch (axis)
{
@@ -375,9 +378,12 @@ btScalar btGeneric6DofConstraint::computeAngle(int axis) const
angle = btAtan2( s, c );
}
break;
- default: assert ( 0 ) ; break ;
+ default:
+ btAssert ( 0 ) ;
+
+ break ;
}
- return angle;
+ return angle;
}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
index 329048b5737..b114e54fa69 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
@@ -16,9 +16,8 @@ subject to the following restrictions:
#ifndef GENERIC_6DOF_CONSTRAINT_H
#define GENERIC_6DOF_CONSTRAINT_H
-#include "LinearMath/btVector3.h"
-
-#include "BulletDynamics/ConstraintSolver/btJacobianEntry.h"
+#include "../../LinearMath/btVector3.h"
+#include "btJacobianEntry.h"
#include "btTypedConstraint.h"
class btRigidBody;
@@ -41,12 +40,19 @@ class btGeneric6DofConstraint : public btTypedConstraint
btScalar m_accumulatedImpulse[6];
+ btGeneric6DofConstraint& operator=(btGeneric6DofConstraint& other)
+ {
+ btAssert(0);
+ (void) other;
+ return *this;
+ }
public:
btGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB );
btGeneric6DofConstraint();
+
virtual void buildJacobian();
virtual void solveConstraint(btScalar timeStep);
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
index f72278e2cbf..27e30987549 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp
@@ -17,7 +17,7 @@ subject to the following restrictions:
#include "btHingeConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
#include "LinearMath/btTransformUtil.h"
-
+#include <new>
btHingeConstraint::btHingeConstraint():
m_enableAngularMotor(false)
@@ -49,7 +49,7 @@ m_enableAngularMotor(false)
void btHingeConstraint::buildJacobian()
{
- m_appliedImpulse = 0.f;
+ m_appliedImpulse = btScalar(0.);
btVector3 normal(0,0,0);
@@ -115,8 +115,8 @@ void btHingeConstraint::solveConstraint(btScalar timeStep)
btVector3 pivotBInW = m_rbB.getCenterOfMassTransform()*m_pivotInB;
btVector3 normal(0,0,0);
- btScalar tau = 0.3f;
- btScalar damping = 1.f;
+ btScalar tau = btScalar(0.3);
+ btScalar damping = btScalar(1.);
//linear part
if (!m_angularOnly)
@@ -124,7 +124,7 @@ void btHingeConstraint::solveConstraint(btScalar timeStep)
for (int i=0;i<3;i++)
{
normal[i] = 1;
- btScalar jacDiagABInv = 1.f / m_jac[i].getDiagonal();
+ btScalar jacDiagABInv = btScalar(1.) / m_jac[i].getDiagonal();
btVector3 rel_pos1 = pivotAInW - m_rbA.getCenterOfMassPosition();
btVector3 rel_pos2 = pivotBInW - m_rbB.getCenterOfMassPosition();
@@ -165,27 +165,27 @@ void btHingeConstraint::solveConstraint(btScalar timeStep)
btVector3 velrelOrthog = angAorthog-angBorthog;
{
//solve orthogonal angular velocity correction
- float relaxation = 1.f;
- float len = velrelOrthog.length();
- if (len > 0.00001f)
+ btScalar relaxation = btScalar(1.);
+ btScalar len = velrelOrthog.length();
+ if (len > btScalar(0.00001))
{
btVector3 normal = velrelOrthog.normalized();
- float denom = getRigidBodyA().computeAngularImpulseDenominator(normal) +
+ btScalar denom = getRigidBodyA().computeAngularImpulseDenominator(normal) +
getRigidBodyB().computeAngularImpulseDenominator(normal);
// scale for mass and relaxation
//todo: expose this 0.9 factor to developer
- velrelOrthog *= (1.f/denom) * 0.9f;
+ velrelOrthog *= (btScalar(1.)/denom) * btScalar(0.9);
}
//solve angular positional correction
- btVector3 angularError = -axisA.cross(axisB) *(1.f/timeStep);
- float len2 = angularError.length();
- if (len2>0.00001f)
+ btVector3 angularError = -axisA.cross(axisB) *(btScalar(1.)/timeStep);
+ btScalar len2 = angularError.length();
+ if (len2>btScalar(0.00001))
{
btVector3 normal2 = angularError.normalized();
- float denom2 = getRigidBodyA().computeAngularImpulseDenominator(normal2) +
+ btScalar denom2 = getRigidBodyA().computeAngularImpulseDenominator(normal2) +
getRigidBodyB().computeAngularImpulseDenominator(normal2);
- angularError *= (1.f/denom2) * relaxation;
+ angularError *= (btScalar(1.)/denom2) * relaxation;
}
m_rbA.applyTorqueImpulse(-velrelOrthog+angularError);
@@ -204,10 +204,10 @@ void btHingeConstraint::solveConstraint(btScalar timeStep)
btScalar desiredMotorVel = m_motorTargetVelocity;
btScalar motor_relvel = desiredMotorVel - projRelVel;
- float denom3 = getRigidBodyA().computeAngularImpulseDenominator(axisA) +
+ btScalar denom3 = getRigidBodyA().computeAngularImpulseDenominator(axisA) +
getRigidBodyB().computeAngularImpulseDenominator(axisA);
- btScalar unclippedMotorImpulse = (1.f/denom3) * motor_relvel;;
+ btScalar unclippedMotorImpulse = (btScalar(1.)/denom3) * motor_relvel;;
//todo: should clip against accumulated impulse
btScalar clippedMotorImpulse = unclippedMotorImpulse > m_maxMotorImpulse ? m_maxMotorImpulse : unclippedMotorImpulse;
clippedMotorImpulse = clippedMotorImpulse < -m_maxMotorImpulse ? -m_maxMotorImpulse : clippedMotorImpulse;
@@ -223,6 +223,7 @@ void btHingeConstraint::solveConstraint(btScalar timeStep)
void btHingeConstraint::updateRHS(btScalar timeStep)
{
+ (void)timeStep;
}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h
index 553ec135c8a..5c1ceafbc5b 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h
@@ -16,9 +16,8 @@ subject to the following restrictions:
#ifndef HINGECONSTRAINT_H
#define HINGECONSTRAINT_H
-#include "LinearMath/btVector3.h"
-
-#include "BulletDynamics/ConstraintSolver/btJacobianEntry.h"
+#include "../../LinearMath/btVector3.h"
+#include "btJacobianEntry.h"
#include "btTypedConstraint.h"
class btRigidBody;
@@ -38,8 +37,8 @@ class btHingeConstraint : public btTypedConstraint
bool m_angularOnly;
- float m_motorTargetVelocity;
- float m_maxMotorImpulse;
+ btScalar m_motorTargetVelocity;
+ btScalar m_maxMotorImpulse;
bool m_enableAngularMotor;
public:
@@ -70,7 +69,7 @@ public:
m_angularOnly = angularOnly;
}
- void enableAngularMotor(bool enableMotor,float targetVelocity,float maxMotorImpulse)
+ void enableAngularMotor(bool enableMotor,btScalar targetVelocity,btScalar maxMotorImpulse)
{
m_enableAngularMotor = enableMotor;
m_motorTargetVelocity = targetVelocity;
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h
index 384e4f7bab5..aae3ed0373f 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h
@@ -16,8 +16,8 @@ subject to the following restrictions:
#ifndef JACOBIAN_ENTRY_H
#define JACOBIAN_ENTRY_H
-#include "LinearMath/btVector3.h"
-#include "BulletDynamics/Dynamics/btRigidBody.h"
+#include "../../LinearMath/btVector3.h"
+#include "../Dynamics/btRigidBody.h"
//notes:
@@ -50,7 +50,7 @@ public:
m_1MinvJt = inertiaInvB * m_bJ;
m_Adiag = massInvA + m_0MinvJt.dot(m_aJ) + massInvB + m_1MinvJt.dot(m_bJ);
- btAssert(m_Adiag > 0.0f);
+ btAssert(m_Adiag > btScalar(0.0));
}
//angular constraint between two different rigidbodies
@@ -59,7 +59,7 @@ public:
const btMatrix3x3& world2B,
const btVector3& inertiaInvA,
const btVector3& inertiaInvB)
- :m_linearJointAxis(btVector3(0.f,0.f,0.f))
+ :m_linearJointAxis(btVector3(btScalar(0.),btScalar(0.),btScalar(0.)))
{
m_aJ= world2A*jointAxis;
m_bJ = world2B*-jointAxis;
@@ -67,7 +67,7 @@ public:
m_1MinvJt = inertiaInvB * m_bJ;
m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
- btAssert(m_Adiag > 0.0f);
+ btAssert(m_Adiag > btScalar(0.0));
}
//angular constraint between two different rigidbodies
@@ -75,7 +75,7 @@ public:
const btVector3& axisInB,
const btVector3& inertiaInvA,
const btVector3& inertiaInvB)
- : m_linearJointAxis(btVector3(0.f,0.f,0.f))
+ : m_linearJointAxis(btVector3(btScalar(0.),btScalar(0.),btScalar(0.)))
, m_aJ(axisInA)
, m_bJ(-axisInB)
{
@@ -83,7 +83,7 @@ public:
m_1MinvJt = inertiaInvB * m_bJ;
m_Adiag = m_0MinvJt.dot(m_aJ) + m_1MinvJt.dot(m_bJ);
- btAssert(m_Adiag > 0.0f);
+ btAssert(m_Adiag > btScalar(0.0));
}
//constraint on one rigidbody
@@ -98,10 +98,10 @@ public:
m_aJ= world2A*(rel_pos1.cross(jointAxis));
m_bJ = world2A*(rel_pos2.cross(-jointAxis));
m_0MinvJt = inertiaInvA * m_aJ;
- m_1MinvJt = btVector3(0.f,0.f,0.f);
+ m_1MinvJt = btVector3(btScalar(0.),btScalar(0.),btScalar(0.));
m_Adiag = massInvA + m_0MinvJt.dot(m_aJ);
- btAssert(m_Adiag > 0.0f);
+ btAssert(m_Adiag > btScalar(0.0));
}
btScalar getDiagonal() const { return m_Adiag; }
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
index d15bdaad790..aacb0a3ea66 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp
@@ -16,7 +16,7 @@ subject to the following restrictions:
#include "btPoint2PointConstraint.h"
#include "BulletDynamics/Dynamics/btRigidBody.h"
-
+#include <new>
@@ -39,7 +39,7 @@ btPoint2PointConstraint::btPoint2PointConstraint(btRigidBody& rbA,const btVector
void btPoint2PointConstraint::buildJacobian()
{
- m_appliedImpulse = 0.f;
+ m_appliedImpulse = btScalar(0.);
btVector3 normal(0,0,0);
@@ -76,7 +76,7 @@ void btPoint2PointConstraint::solveConstraint(btScalar timeStep)
for (int i=0;i<3;i++)
{
normal[i] = 1;
- btScalar jacDiagABInv = 1.f / m_jac[i].getDiagonal();
+ btScalar jacDiagABInv = btScalar(1.) / m_jac[i].getDiagonal();
btVector3 rel_pos1 = pivotAInW - m_rbA.getCenterOfMassPosition();
btVector3 rel_pos2 = pivotBInW - m_rbB.getCenterOfMassPosition();
@@ -110,6 +110,7 @@ void btPoint2PointConstraint::solveConstraint(btScalar timeStep)
void btPoint2PointConstraint::updateRHS(btScalar timeStep)
{
+ (void)timeStep;
}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
index 8aae8d74ce7..71da8ac0347 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h
@@ -16,9 +16,8 @@ subject to the following restrictions:
#ifndef POINT2POINTCONSTRAINT_H
#define POINT2POINTCONSTRAINT_H
-#include "LinearMath/btVector3.h"
-
-#include "BulletDynamics/ConstraintSolver/btJacobianEntry.h"
+#include "../../LinearMath/btVector3.h"
+#include "btJacobianEntry.h"
#include "btTypedConstraint.h"
class btRigidBody;
@@ -26,12 +25,12 @@ class btRigidBody;
struct btConstraintSetting
{
btConstraintSetting() :
- m_tau(0.3f),
- m_damping(1.f)
+ m_tau(btScalar(0.3)),
+ m_damping(btScalar(1.))
{
}
- float m_tau;
- float m_damping;
+ btScalar m_tau;
+ btScalar m_damping;
};
/// point to point constraint between two rigidbodies each with a pivotpoint that descibes the 'ballsocket' location in local space
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
index eaf172b9395..14b36ad44fd 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp
@@ -24,7 +24,13 @@ subject to the following restrictions:
#include "btJacobianEntry.h"
#include "LinearMath/btMinMax.h"
#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
+#include <new>
+#include "LinearMath/btStackAlloc.h"
+#include "LinearMath/btQuickprof.h"
+#include "btSolverBody.h"
+#include "btSolverConstraint.h"
+#include "LinearMath/btAlignedObjectArray.h"
#ifdef USE_PROFILE
#include "LinearMath/btQuickprof.h"
@@ -36,24 +42,26 @@ int gTotalContactPoints = 0;
struct btOrderIndex
{
- short int m_manifoldIndex;
- short int m_pointIndex;
+ int m_manifoldIndex;
+ int m_pointIndex;
};
+
+
#define SEQUENTIAL_IMPULSE_MAX_SOLVER_POINTS 16384
static btOrderIndex gOrder[SEQUENTIAL_IMPULSE_MAX_SOLVER_POINTS];
-static unsigned long btSeed2 = 0;
-unsigned long btRand2()
+
+
+unsigned long btSequentialImpulseConstraintSolver::btRand2()
{
- btSeed2 = (1664525L*btSeed2 + 1013904223L) & 0xffffffff;
- return btSeed2;
+ m_btSeed2 = (1664525L*m_btSeed2 + 1013904223L) & 0xffffffff;
+ return m_btSeed2;
}
-
//See ODE: adam's all-int straightforward(?) dRandInt (0..n-1)
-int btRandInt2 (int n)
+int btSequentialImpulseConstraintSolver::btRandInt2 (int n)
{
// seems good; xor-fold and modulus
const unsigned long un = n;
@@ -82,15 +90,7 @@ int btRandInt2 (int n)
-int btRandIntWrong (int n)
-{
- float a = float(n) / 4294967296.0f;
-// printf("n = %d\n",n);
-// printf("a = %f\n",a);
- int res = (int) (float(btRand2()) * a);
-// printf("res=%d\n",res);
- return res;
-}
+
bool MyContactDestroyedCallback(void* userPersistentData)
{
@@ -102,18 +102,12 @@ bool MyContactDestroyedCallback(void* userPersistentData)
return true;
}
-btSequentialImpulseConstraintSolver3::btSequentialImpulseConstraintSolver3()
-{
- btSeed2 = 0;
- setSolverMode(SOLVER_RANDMIZE_ORDER);
-}
btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver()
-:m_solverMode(SOLVER_USE_WARMSTARTING)
+:m_solverMode(SOLVER_RANDMIZE_ORDER | SOLVER_CACHE_FRIENDLY), //not using SOLVER_USE_WARMSTARTING,
+m_btSeed2(0)
{
- btSeed2 = 0;
-
gContactDestroyedCallback = &MyContactDestroyedCallback;
//initialize default friction/contact funcs
@@ -127,35 +121,487 @@ btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver()
}
}
-/// btSequentialImpulseConstraintSolver Sequentially applies impulses
-float btSequentialImpulseConstraintSolver3::solveGroup(btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+
+void initSolverBody(btSolverBody* solverBody, btRigidBody* rigidbody)
+{
+/* int size = sizeof(btSolverBody);
+ int sizeofrb = sizeof(btRigidBody);
+ int sizemanifold = sizeof(btPersistentManifold);
+ int sizeofmp = sizeof(btManifoldPoint);
+ int sizeofPersistData = sizeof (btConstraintPersistentData);
+*/
+
+ solverBody->m_angularVelocity = rigidbody->getAngularVelocity();
+ solverBody->m_centerOfMassPosition = rigidbody->getCenterOfMassPosition();
+ solverBody->m_friction = rigidbody->getFriction();
+// solverBody->m_invInertiaWorld = rigidbody->getInvInertiaTensorWorld();
+ solverBody->m_invMass = rigidbody->getInvMass();
+ solverBody->m_linearVelocity = rigidbody->getLinearVelocity();
+ solverBody->m_originalBody = rigidbody;
+ solverBody->m_angularFactor = rigidbody->getAngularFactor();
+}
+
+btScalar penetrationResolveFactor = btScalar(0.9);
+btScalar restitutionCurve(btScalar rel_vel, btScalar restitution)
+{
+ btScalar rest = restitution * -rel_vel;
+ return rest;
+}
+
+
+
+
+
+
+//velocity + friction
+//response between two dynamic objects with friction
+SIMD_FORCE_INLINE btScalar resolveSingleCollisionCombinedCacheFriendly(
+ btSolverBody& body1,
+ btSolverBody& body2,
+ btSolverConstraint& contactConstraint,
+ const btContactSolverInfo& solverInfo)
+{
+ (void)solverInfo;
+
+ btScalar normalImpulse(0.f);
+ {
+ if (contactConstraint.m_penetration < 0.f)
+ return 0.f;
+
+ // Optimized version of projected relative velocity, use precomputed cross products with normal
+ // body1.getVelocityInLocalPoint(contactConstraint.m_rel_posA,vel1);
+ // body2.getVelocityInLocalPoint(contactConstraint.m_rel_posB,vel2);
+ // btVector3 vel = vel1 - vel2;
+ // btScalar rel_vel = contactConstraint.m_contactNormal.dot(vel);
+
+ btScalar rel_vel;
+ btScalar vel1Dotn = contactConstraint.m_contactNormal.dot(body1.m_linearVelocity)
+ + contactConstraint.m_relpos1CrossNormal.dot(body1.m_angularVelocity);
+ btScalar vel2Dotn = contactConstraint.m_contactNormal.dot(body2.m_linearVelocity)
+ + contactConstraint.m_relpos2CrossNormal.dot(body2.m_angularVelocity);
+
+ rel_vel = vel1Dotn-vel2Dotn;
+
+
+ btScalar positionalError = contactConstraint.m_penetration;
+ btScalar velocityError = contactConstraint.m_restitution - rel_vel;// * damping;
+
+ btScalar penetrationImpulse = positionalError * contactConstraint.m_jacDiagABInv;
+ btScalar velocityImpulse = velocityError * contactConstraint.m_jacDiagABInv;
+ btScalar normalImpulse = penetrationImpulse+velocityImpulse;
+
+ // See Erin Catto's GDC 2006 paper: Clamp the accumulated impulse
+ btScalar oldNormalImpulse = contactConstraint.m_appliedImpulse;
+ btScalar sum = oldNormalImpulse + normalImpulse;
+ contactConstraint.m_appliedImpulse = btScalar(0.) > sum ? btScalar(0.): sum;
+
+ btScalar oldVelocityImpulse = contactConstraint.m_appliedVelocityImpulse;
+ btScalar velocitySum = oldVelocityImpulse + velocityImpulse;
+ contactConstraint.m_appliedVelocityImpulse = btScalar(0.) > velocitySum ? btScalar(0.): velocitySum;
+
+ normalImpulse = contactConstraint.m_appliedImpulse - oldNormalImpulse;
+
+ if (body1.m_invMass)
+ {
+ body1.internalApplyImpulse(contactConstraint.m_contactNormal*body1.m_invMass,
+ contactConstraint.m_angularComponentA,normalImpulse);
+ }
+ if (body2.m_invMass)
+ {
+ body2.internalApplyImpulse(contactConstraint.m_contactNormal*body2.m_invMass,
+ contactConstraint.m_angularComponentB,-normalImpulse);
+ }
+
+ }
+
+
+
+ return normalImpulse;
+}
+
+
+#ifndef NO_FRICTION_TANGENTIALS
+
+SIMD_FORCE_INLINE btScalar resolveSingleFrictionCacheFriendly(
+ btSolverBody& body1,
+ btSolverBody& body2,
+ btSolverConstraint& contactConstraint,
+ const btContactSolverInfo& solverInfo,
+ btScalar appliedNormalImpulse)
{
+ (void)solverInfo;
+
- btContactSolverInfo info = infoGlobal;
+ const btScalar combinedFriction = contactConstraint.m_friction;
+
+ const btScalar limit = appliedNormalImpulse * combinedFriction;
+
+ if (appliedNormalImpulse>btScalar(0.))
+ //friction
+ {
+
+ btScalar j1;
+ {
- int numiter = infoGlobal.m_numIterations;
-#ifdef USE_PROFILE
- btProfiler::beginBlock("solve");
-#endif //USE_PROFILE
+ btScalar rel_vel;
+ const btScalar vel1Dotn = contactConstraint.m_contactNormal.dot(body1.m_linearVelocity)
+ + contactConstraint.m_relpos1CrossNormal.dot(body1.m_angularVelocity);
+ const btScalar vel2Dotn = contactConstraint.m_contactNormal.dot(body2.m_linearVelocity)
+ + contactConstraint.m_relpos2CrossNormal.dot(body2.m_angularVelocity);
+ rel_vel = vel1Dotn-vel2Dotn;
+
+ // calculate j that moves us to zero relative velocity
+ j1 = -rel_vel * contactConstraint.m_jacDiagABInv;
+ btScalar oldTangentImpulse = contactConstraint.m_appliedImpulse;
+ contactConstraint.m_appliedImpulse = oldTangentImpulse + j1;
+ GEN_set_min(contactConstraint.m_appliedImpulse, limit);
+ GEN_set_max(contactConstraint.m_appliedImpulse, -limit);
+ j1 = contactConstraint.m_appliedImpulse - oldTangentImpulse;
- int totalPoints = 0;
+ }
+
+ if (body1.m_invMass)
+ {
+ body1.internalApplyImpulse(contactConstraint.m_contactNormal*body1.m_invMass,contactConstraint.m_angularComponentA,j1);
+ }
+ if (body2.m_invMass)
+ {
+ body2.internalApplyImpulse(contactConstraint.m_contactNormal*body2.m_invMass,contactConstraint.m_angularComponentB,-j1);
+ }
+
+ }
+ return 0.f;
+}
+#else
+
+//velocity + friction
+//response between two dynamic objects with friction
+btScalar resolveSingleFrictionCacheFriendly(
+ btSolverBody& body1,
+ btSolverBody& body2,
+ btSolverConstraint& contactConstraint,
+ const btContactSolverInfo& solverInfo)
+{
+
+ btVector3 vel1;
+ btVector3 vel2;
+ btScalar normalImpulse(0.f);
+
{
- int j;
- for (j=0;j<numManifolds;j++)
+ const btVector3& normal = contactConstraint.m_contactNormal;
+ if (contactConstraint.m_penetration < 0.f)
+ return 0.f;
+
+
+ body1.getVelocityInLocalPoint(contactConstraint.m_rel_posA,vel1);
+ body2.getVelocityInLocalPoint(contactConstraint.m_rel_posB,vel2);
+ btVector3 vel = vel1 - vel2;
+ btScalar rel_vel;
+ rel_vel = normal.dot(vel);
+
+ btVector3 lat_vel = vel - normal * rel_vel;
+ btScalar lat_rel_vel = lat_vel.length2();
+
+ btScalar combinedFriction = contactConstraint.m_friction;
+ const btVector3& rel_pos1 = contactConstraint.m_rel_posA;
+ const btVector3& rel_pos2 = contactConstraint.m_rel_posB;
+
+
+ //if (contactConstraint.m_appliedVelocityImpulse > 0.f)
+ if (lat_rel_vel > SIMD_EPSILON*SIMD_EPSILON)
{
- btPersistentManifold* manifold = manifoldPtr[j];
- prepareConstraints(manifold,info,debugDrawer);
+ lat_rel_vel = btSqrt(lat_rel_vel);
+
+ lat_vel /= lat_rel_vel;
+ btVector3 temp1 = body1.m_invInertiaWorld * rel_pos1.cross(lat_vel);
+ btVector3 temp2 = body2.m_invInertiaWorld * rel_pos2.cross(lat_vel);
+ btScalar friction_impulse = lat_rel_vel /
+ (body1.m_invMass + body2.m_invMass + lat_vel.dot(temp1.cross(rel_pos1) + temp2.cross(rel_pos2)));
+ btScalar normal_impulse = contactConstraint.m_appliedVelocityImpulse * combinedFriction;
+
+ GEN_set_min(friction_impulse, normal_impulse);
+ GEN_set_max(friction_impulse, -normal_impulse);
+ body1.applyImpulse(lat_vel * -friction_impulse, rel_pos1);
+ body2.applyImpulse(lat_vel * friction_impulse, rel_pos2);
+ }
+ }
+
+ return normalImpulse;
+}
+
+#endif //NO_FRICTION_TANGENTIALS
+
+btAlignedObjectArray<btSolverBody> tmpSolverBodyPool;
+btAlignedObjectArray<btSolverConstraint> tmpSolverConstraintPool;
+btAlignedObjectArray<btSolverConstraint> tmpSolverFrictionConstraintPool;
+
+
+btScalar btSequentialImpulseConstraintSolver::solveGroupCacheFriendly(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc)
+{
+ (void)stackAlloc;
+ (void)debugDrawer;
+
+ if (!(numConstraints + numManifolds))
+ {
+// printf("empty\n");
+ return 0.f;
+ }
+
+ BEGIN_PROFILE("refreshManifolds");
+
+ int i;
+ for (i=0;i<numManifolds;i++)
+ {
+ btPersistentManifold* manifold = manifoldPtr[i];
+ btRigidBody* rb0 = (btRigidBody*)manifold->getBody0();
+ btRigidBody* rb1 = (btRigidBody*)manifold->getBody1();
- for (int p=0;p<manifoldPtr[j]->getNumContacts();p++)
+ manifold->refreshContactPoints(rb0->getCenterOfMassTransform(),rb1->getCenterOfMassTransform());
+
+ }
+
+ END_PROFILE("refreshManifolds");
+
+
+ BEGIN_PROFILE("gatherSolverData");
+
+ //int sizeofSB = sizeof(btSolverBody);
+ //int sizeofSC = sizeof(btSolverConstraint);
+
+
+ //if (1)
+ {
+ //if m_stackAlloc, try to pack bodies/constraints to speed up solving
+// btBlock* sablock;
+// sablock = stackAlloc->beginBlock();
+
+ // int memsize = 16;
+// unsigned char* stackMemory = stackAlloc->allocate(memsize);
+
+
+ //todo: use stack allocator for this temp memory
+ int minReservation = numManifolds*2;
+
+ tmpSolverBodyPool.reserve(minReservation);
+
+ {
+ for (int i=0;i<numBodies;i++)
{
- gOrder[totalPoints].m_manifoldIndex = j;
- gOrder[totalPoints].m_pointIndex = p;
- totalPoints++;
+ btRigidBody* rb = btRigidBody::upcast(bodies[i]);
+ if (rb && (rb->getIslandTag() >= 0))
+ {
+ btAssert(rb->getCompanionId() < 0);
+ int solverBodyId = tmpSolverBodyPool.size();
+ btSolverBody& solverBody = tmpSolverBodyPool.expand();
+ initSolverBody(&solverBody,rb);
+ rb->setCompanionId(solverBodyId);
+ }
+ }
+ }
+
+
+ tmpSolverConstraintPool.reserve(minReservation);
+ tmpSolverFrictionConstraintPool.reserve(minReservation);
+ {
+ int i;
+
+ for (i=0;i<numManifolds;i++)
+ {
+ btPersistentManifold* manifold = manifoldPtr[i];
+ btRigidBody* rb0 = (btRigidBody*)manifold->getBody0();
+ btRigidBody* rb1 = (btRigidBody*)manifold->getBody1();
+
+
+ int solverBodyIdA=-1;
+ int solverBodyIdB=-1;
+
+ if (manifold->getNumContacts())
+ {
+
+
+
+ if (rb0->getIslandTag() >= 0)
+ {
+ solverBodyIdA = rb0->getCompanionId();
+ } else
+ {
+ //create a static body
+ solverBodyIdA = tmpSolverBodyPool.size();
+ btSolverBody& solverBody = tmpSolverBodyPool.expand();
+ initSolverBody(&solverBody,rb0);
+ }
+
+ if (rb1->getIslandTag() >= 0)
+ {
+ solverBodyIdB = rb1->getCompanionId();
+ } else
+ {
+ //create a static body
+ solverBodyIdB = tmpSolverBodyPool.size();
+ btSolverBody& solverBody = tmpSolverBodyPool.expand();
+ initSolverBody(&solverBody,rb1);
+ }
+ }
+
+ for (int j=0;j<manifold->getNumContacts();j++)
+ {
+
+ btManifoldPoint& cp = manifold->getContactPoint(j);
+
+ int frictionIndex = tmpSolverConstraintPool.size();
+
+ if (cp.getDistance() <= btScalar(0.))
+ {
+
+ const btVector3& pos1 = cp.getPositionWorldOnA();
+ const btVector3& pos2 = cp.getPositionWorldOnB();
+
+ btVector3 rel_pos1 = pos1 - rb0->getCenterOfMassPosition();
+ btVector3 rel_pos2 = pos2 - rb1->getCenterOfMassPosition();
+
+
+ btScalar relaxation = 1.f;
+
+ {
+ btSolverConstraint& solverConstraint = tmpSolverConstraintPool.expand();
+
+ solverConstraint.m_solverBodyIdA = solverBodyIdA;
+ solverConstraint.m_solverBodyIdB = solverBodyIdB;
+ solverConstraint.m_constraintType = btSolverConstraint::BT_SOLVER_CONTACT_1D;
+
+
+
+ {
+ //can be optimized, the cross products are already calculated
+ btScalar denom0 = rb0->computeImpulseDenominator(pos1,cp.m_normalWorldOnB);
+ btScalar denom1 = rb1->computeImpulseDenominator(pos2,cp.m_normalWorldOnB);
+ btScalar denom = relaxation/(denom0+denom1);
+ solverConstraint.m_jacDiagABInv = denom;
+ }
+
+ solverConstraint.m_contactNormal = cp.m_normalWorldOnB;
+ solverConstraint.m_relpos1CrossNormal = rel_pos1.cross(cp.m_normalWorldOnB);
+ solverConstraint.m_relpos2CrossNormal = rel_pos2.cross(cp.m_normalWorldOnB);
+
+
+ btVector3 vel1 = rb0->getVelocityInLocalPoint(rel_pos1);
+ btVector3 vel2 = rb1->getVelocityInLocalPoint(rel_pos2);
+
+ btVector3 vel = vel1 - vel2;
+ btScalar rel_vel;
+ rel_vel = cp.m_normalWorldOnB.dot(vel);
+
+
+ solverConstraint.m_penetration = cp.getDistance();///btScalar(infoGlobal.m_numIterations);
+ solverConstraint.m_friction = cp.m_combinedFriction;
+ btScalar rest = restitutionCurve(rel_vel, cp.m_combinedRestitution);
+ if (rest <= btScalar(0.))
+ {
+ rest = 0.f;
+ };
+
+ btScalar penVel = -solverConstraint.m_penetration/infoGlobal.m_timeStep;
+ if (rest > penVel)
+ {
+ rest = btScalar(0.);
+ }
+ solverConstraint.m_restitution = rest;
+
+ solverConstraint.m_penetration *= -(infoGlobal.m_erp/infoGlobal.m_timeStep);
+
+ solverConstraint.m_appliedImpulse = 0.f;
+ solverConstraint.m_appliedVelocityImpulse = 0.f;
+
+
+ btVector3 torqueAxis0 = rel_pos1.cross(cp.m_normalWorldOnB);
+ solverConstraint.m_angularComponentA = rb0->getInvInertiaTensorWorld()*torqueAxis0;
+ btVector3 torqueAxis1 = rel_pos2.cross(cp.m_normalWorldOnB);
+ solverConstraint.m_angularComponentB = rb1->getInvInertiaTensorWorld()*torqueAxis1;
+ }
+
+ //create 2 '1d axis' constraints for 2 tangential friction directions
+
+ //re-calculate friction direction every frame, todo: check if this is really needed
+ btVector3 frictionTangential0a, frictionTangential1b;
+
+ btPlaneSpace1(cp.m_normalWorldOnB,frictionTangential0a,frictionTangential1b);
+
+ {
+ btSolverConstraint& solverConstraint = tmpSolverFrictionConstraintPool.expand();
+ solverConstraint.m_contactNormal = frictionTangential0a;
+
+ solverConstraint.m_solverBodyIdA = solverBodyIdA;
+ solverConstraint.m_solverBodyIdB = solverBodyIdB;
+ solverConstraint.m_constraintType = btSolverConstraint::BT_SOLVER_FRICTION_1D;
+ solverConstraint.m_frictionIndex = frictionIndex;
+
+ solverConstraint.m_friction = cp.m_combinedFriction;
+
+ solverConstraint.m_appliedImpulse = btScalar(0.);
+ solverConstraint.m_appliedVelocityImpulse = 0.f;
+
+ btScalar denom0 = rb0->computeImpulseDenominator(pos1,solverConstraint.m_contactNormal);
+ btScalar denom1 = rb1->computeImpulseDenominator(pos2,solverConstraint.m_contactNormal);
+ btScalar denom = relaxation/(denom0+denom1);
+ solverConstraint.m_jacDiagABInv = denom;
+
+ {
+ btVector3 ftorqueAxis0 = rel_pos1.cross(solverConstraint.m_contactNormal);
+ solverConstraint.m_relpos1CrossNormal = ftorqueAxis0;
+ solverConstraint.m_angularComponentA = rb0->getInvInertiaTensorWorld()*ftorqueAxis0;
+ }
+ {
+ btVector3 ftorqueAxis0 = rel_pos2.cross(solverConstraint.m_contactNormal);
+ solverConstraint.m_relpos2CrossNormal = ftorqueAxis0;
+ solverConstraint.m_angularComponentB = rb1->getInvInertiaTensorWorld()*ftorqueAxis0;
+ }
+
+ }
+
+
+ {
+
+ btSolverConstraint& solverConstraint = tmpSolverFrictionConstraintPool.expand();
+ solverConstraint.m_contactNormal = frictionTangential1b;
+
+ solverConstraint.m_solverBodyIdA = solverBodyIdA;
+ solverConstraint.m_solverBodyIdB = solverBodyIdB;
+ solverConstraint.m_constraintType = btSolverConstraint::BT_SOLVER_FRICTION_1D;
+ solverConstraint.m_frictionIndex = frictionIndex;
+
+ solverConstraint.m_friction = cp.m_combinedFriction;
+
+ solverConstraint.m_appliedImpulse = btScalar(0.);
+ solverConstraint.m_appliedVelocityImpulse = 0.f;
+
+ btScalar denom0 = rb0->computeImpulseDenominator(pos1,solverConstraint.m_contactNormal);
+ btScalar denom1 = rb1->computeImpulseDenominator(pos2,solverConstraint.m_contactNormal);
+ btScalar denom = relaxation/(denom0+denom1);
+ solverConstraint.m_jacDiagABInv = denom;
+ {
+ btVector3 ftorqueAxis1 = rel_pos1.cross(solverConstraint.m_contactNormal);
+ solverConstraint.m_relpos1CrossNormal = ftorqueAxis1;
+ solverConstraint.m_angularComponentA = rb0->getInvInertiaTensorWorld()*ftorqueAxis1;
+ }
+ {
+ btVector3 ftorqueAxis1 = rel_pos2.cross(solverConstraint.m_contactNormal);
+ solverConstraint.m_relpos2CrossNormal = ftorqueAxis1;
+ solverConstraint.m_angularComponentB = rb1->getInvInertiaTensorWorld()*ftorqueAxis1;
+ }
+ }
+
+ }
+ }
}
}
}
+ END_PROFILE("gatherSolverData");
+
+ BEGIN_PROFILE("prepareConstraints");
+
+ btContactSolverInfo info = infoGlobal;
{
int j;
@@ -166,21 +612,57 @@ float btSequentialImpulseConstraintSolver3::solveGroup(btPersistentManifold** ma
}
}
- //should traverse the contacts random order...
- int iteration;
+ btAlignedObjectArray<int> gOrderTmpConstraintPool;
+ btAlignedObjectArray<int> gOrderFrictionConstraintPool;
+ int numConstraintPool = tmpSolverConstraintPool.size();
+ int numFrictionPool = tmpSolverFrictionConstraintPool.size();
+
+ ///todo: use stack allocator for such temporarily memory, same for solver bodies/constraints
+ gOrderTmpConstraintPool.resize(numConstraintPool);
+ gOrderFrictionConstraintPool.resize(numFrictionPool);
{
- for ( iteration = 0;iteration<numiter-1;iteration++)
+ int i;
+ for (i=0;i<numConstraintPool;i++)
+ {
+ gOrderTmpConstraintPool[i] = i;
+ }
+ for (i=0;i<numFrictionPool;i++)
{
+ gOrderFrictionConstraintPool[i] = i;
+ }
+ }
+
+
+
+
+ END_PROFILE("prepareConstraints");
+
+
+ BEGIN_PROFILE("solveConstraints");
+
+ //should traverse the contacts random order...
+ int iteration;
+ {
+ for ( iteration = 0;iteration<info.m_numIterations;iteration++)
+ {
+
int j;
if (m_solverMode & SOLVER_RANDMIZE_ORDER)
{
if ((iteration & 7) == 0) {
- for (j=0; j<totalPoints; ++j) {
- btOrderIndex tmp = gOrder[j];
+ for (j=0; j<numConstraintPool; ++j) {
+ int tmp = gOrderTmpConstraintPool[j];
int swapi = btRandInt2(j+1);
- gOrder[j] = gOrder[swapi];
- gOrder[swapi] = tmp;
+ gOrderTmpConstraintPool[j] = gOrderTmpConstraintPool[swapi];
+ gOrderTmpConstraintPool[swapi] = tmp;
+ }
+
+ for (j=0; j<numFrictionPool; ++j) {
+ int tmp = gOrderFrictionConstraintPool[j];
+ int swapi = btRandInt2(j+1);
+ gOrderFrictionConstraintPool[j] = gOrderFrictionConstraintPool[swapi];
+ gOrderFrictionConstraintPool[swapi] = tmp;
}
}
}
@@ -188,38 +670,102 @@ float btSequentialImpulseConstraintSolver3::solveGroup(btPersistentManifold** ma
for (j=0;j<numConstraints;j++)
{
btTypedConstraint* constraint = constraints[j];
+ ///todo: use solver bodies, so we don't need to copy from/to btRigidBody
+
+ if ((constraint->getRigidBodyA().getIslandTag() >= 0) && (constraint->getRigidBodyA().getCompanionId() >= 0))
+ {
+ tmpSolverBodyPool[constraint->getRigidBodyA().getCompanionId()].writebackVelocity();
+ }
+ if ((constraint->getRigidBodyB().getIslandTag() >= 0) && (constraint->getRigidBodyB().getCompanionId() >= 0))
+ {
+ tmpSolverBodyPool[constraint->getRigidBodyB().getCompanionId()].writebackVelocity();
+ }
+
constraint->solveConstraint(info.m_timeStep);
+
+ if ((constraint->getRigidBodyA().getIslandTag() >= 0) && (constraint->getRigidBodyA().getCompanionId() >= 0))
+ {
+ tmpSolverBodyPool[constraint->getRigidBodyA().getCompanionId()].readVelocity();
+ }
+ if ((constraint->getRigidBodyB().getIslandTag() >= 0) && (constraint->getRigidBodyB().getCompanionId() >= 0))
+ {
+ tmpSolverBodyPool[constraint->getRigidBodyB().getCompanionId()].readVelocity();
+ }
+
}
- for (j=0;j<totalPoints;j++)
{
- btPersistentManifold* manifold = manifoldPtr[gOrder[j].m_manifoldIndex];
- solve( (btRigidBody*)manifold->getBody0(),
- (btRigidBody*)manifold->getBody1()
- ,manifold->getContactPoint(gOrder[j].m_pointIndex),info,iteration,debugDrawer);
+ int numPoolConstraints = tmpSolverConstraintPool.size();
+ for (j=0;j<numPoolConstraints;j++)
+ {
+ btSolverConstraint& solveManifold = tmpSolverConstraintPool[gOrderTmpConstraintPool[j]];
+ resolveSingleCollisionCombinedCacheFriendly(tmpSolverBodyPool[solveManifold.m_solverBodyIdA],
+ tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold,info);
+ }
}
-
- for (j=0;j<totalPoints;j++)
+
{
- btPersistentManifold* manifold = manifoldPtr[gOrder[j].m_manifoldIndex];
- solveFriction((btRigidBody*)manifold->getBody0(),
- (btRigidBody*)manifold->getBody1(),manifold->getContactPoint(gOrder[j].m_pointIndex),info,iteration,debugDrawer);
+ int numFrictionPoolConstraints = tmpSolverFrictionConstraintPool.size();
+ for (j=0;j<numFrictionPoolConstraints;j++)
+ {
+ btSolverConstraint& solveManifold = tmpSolverFrictionConstraintPool[gOrderFrictionConstraintPool[j]];
+ btScalar appliedNormalImpulse = tmpSolverConstraintPool[solveManifold.m_frictionIndex].m_appliedImpulse;
+
+ resolveSingleFrictionCacheFriendly(tmpSolverBodyPool[solveManifold.m_solverBodyIdA],
+ tmpSolverBodyPool[solveManifold.m_solverBodyIdB],solveManifold,info,appliedNormalImpulse);
+ }
}
+
+
+
}
}
-#ifdef USE_PROFILE
- btProfiler::endBlock("solve");
-#endif //USE_PROFILE
+ for ( i=0;i<tmpSolverBodyPool.size();i++)
+ {
+ tmpSolverBodyPool[i].writebackVelocity();
+ }
+
+ END_PROFILE("solveConstraints");
+
+// printf("tmpSolverConstraintPool.size() = %i\n",tmpSolverConstraintPool.size());
+
+/*
+ printf("tmpSolverBodyPool.size() = %i\n",tmpSolverBodyPool.size());
+ printf("tmpSolverConstraintPool.size() = %i\n",tmpSolverConstraintPool.size());
+ printf("tmpSolverFrictionConstraintPool.size() = %i\n",tmpSolverFrictionConstraintPool.size());
+
+
+ printf("tmpSolverBodyPool.capacity() = %i\n",tmpSolverBodyPool.capacity());
+ printf("tmpSolverConstraintPool.capacity() = %i\n",tmpSolverConstraintPool.capacity());
+ printf("tmpSolverFrictionConstraintPool.capacity() = %i\n",tmpSolverFrictionConstraintPool.capacity());
+*/
+
+ tmpSolverBodyPool.resize(0);
+ tmpSolverConstraintPool.resize(0);
+ tmpSolverFrictionConstraintPool.resize(0);
+
return 0.f;
}
-
/// btSequentialImpulseConstraintSolver Sequentially applies impulses
-float btSequentialImpulseConstraintSolver::solveGroup(btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer)
+btScalar btSequentialImpulseConstraintSolver::solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc)
{
+
+ if (getSolverMode() & SOLVER_CACHE_FRIENDLY)
+ {
+ //you need to provide at least some bodies
+ //btSimpleDynamicsWorld needs to switch off SOLVER_CACHE_FRIENDLY
+ btAssert(bodies);
+ btAssert(numBodies);
+ return solveGroupCacheFriendly(bodies,numBodies,manifoldPtr, numManifolds,constraints,numConstraints,infoGlobal,debugDrawer,stackAlloc);
+ }
+
+
+ BEGIN_PROFILE("prepareConstraints");
+
btContactSolverInfo info = infoGlobal;
int numiter = infoGlobal.m_numIterations;
@@ -227,21 +773,25 @@ float btSequentialImpulseConstraintSolver::solveGroup(btPersistentManifold** man
btProfiler::beginBlock("solve");
#endif //USE_PROFILE
+ int totalPoints = 0;
+
+
{
- int j;
+ short j;
for (j=0;j<numManifolds;j++)
{
btPersistentManifold* manifold = manifoldPtr[j];
prepareConstraints(manifold,info,debugDrawer);
- for (int p=0;p<manifoldPtr[j]->getNumContacts();p++)
+
+ for (short p=0;p<manifoldPtr[j]->getNumContacts();p++)
{
- //interleaving here gives better results
- solve( (btRigidBody*)manifold->getBody0(),
- (btRigidBody*)manifold->getBody1()
- ,manifoldPtr[j]->getContactPoint(p),info,0,debugDrawer);
+ gOrder[totalPoints].m_manifoldIndex = j;
+ gOrder[totalPoints].m_pointIndex = p;
+ totalPoints++;
}
}
}
+
{
int j;
for (j=0;j<numConstraints;j++)
@@ -251,66 +801,77 @@ float btSequentialImpulseConstraintSolver::solveGroup(btPersistentManifold** man
}
}
+ END_PROFILE("prepareConstraints");
+
+
+ BEGIN_PROFILE("solveConstraints");
+
//should traverse the contacts random order...
int iteration;
- for ( iteration = 0;iteration<numiter-1;iteration++)
{
- int j;
-
- for (j=0;j<numConstraints;j++)
+ for ( iteration = 0;iteration<numiter;iteration++)
{
- btTypedConstraint* constraint = constraints[j];
- constraint->solveConstraint(info.m_timeStep);
- }
+ int j;
+ if (m_solverMode & SOLVER_RANDMIZE_ORDER)
+ {
+ if ((iteration & 7) == 0) {
+ for (j=0; j<totalPoints; ++j) {
+ btOrderIndex tmp = gOrder[j];
+ int swapi = btRandInt2(j+1);
+ gOrder[j] = gOrder[swapi];
+ gOrder[swapi] = tmp;
+ }
+ }
+ }
- for (j=0;j<numManifolds;j++)
- {
- btPersistentManifold* manifold = manifoldPtr[j];
- for (int p=0;p<manifold->getNumContacts();p++)
+ for (j=0;j<numConstraints;j++)
{
+ btTypedConstraint* constraint = constraints[j];
+ constraint->solveConstraint(info.m_timeStep);
+ }
+
+ for (j=0;j<totalPoints;j++)
+ {
+ btPersistentManifold* manifold = manifoldPtr[gOrder[j].m_manifoldIndex];
solve( (btRigidBody*)manifold->getBody0(),
(btRigidBody*)manifold->getBody1()
- ,manifold->getContactPoint(p),info,iteration,debugDrawer);
+ ,manifold->getContactPoint(gOrder[j].m_pointIndex),info,iteration,debugDrawer);
}
- }
-
- }
-
- for ( iteration = 0;iteration<numiter-1;iteration++)
- {
- int j;
- for (j=0;j<numManifolds;j++)
- {
- btPersistentManifold* manifold = manifoldPtr[j];
- for (int p=0;p<manifold->getNumContacts();p++)
+
+ for (j=0;j<totalPoints;j++)
{
+ btPersistentManifold* manifold = manifoldPtr[gOrder[j].m_manifoldIndex];
solveFriction((btRigidBody*)manifold->getBody0(),
- (btRigidBody*)manifold->getBody1(),manifold->getContactPoint(p),info,iteration,debugDrawer);
+ (btRigidBody*)manifold->getBody1(),manifold->getContactPoint(gOrder[j].m_pointIndex),info,iteration,debugDrawer);
}
}
}
-
+ END_PROFILE("solveConstraints");
+
+
#ifdef USE_PROFILE
btProfiler::endBlock("solve");
#endif //USE_PROFILE
- return 0.f;
-}
-float penetrationResolveFactor = 0.9f;
-btScalar restitutionCurve(btScalar rel_vel, btScalar restitution)
-{
- btScalar rest = restitution * -rel_vel;
- return rest;
+
+ return btScalar(0.);
}
+
+
+
+
+
void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifold* manifoldPtr, const btContactSolverInfo& info,btIDebugDraw* debugDrawer)
{
+ (void)debugDrawer;
+
btRigidBody* body0 = (btRigidBody*)manifoldPtr->getBody0();
btRigidBody* body1 = (btRigidBody*)manifoldPtr->getBody1();
@@ -327,7 +888,7 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol
for (int i=0;i<numpoints ;i++)
{
btManifoldPoint& cp = manifoldPtr->getContactPoint(i);
- if (cp.getDistance() <= 0.f)
+ if (cp.getDistance() <= btScalar(0.))
{
const btVector3& pos1 = cp.getPositionWorldOnA();
const btVector3& pos2 = cp.getPositionWorldOnB();
@@ -376,7 +937,7 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol
}
assert(cpd);
- cpd->m_jacDiagABInv = 1.f / jacDiagAB;
+ cpd->m_jacDiagABInv = btScalar(1.) / jacDiagAB;
//Dependent on Rigidbody A and B types, fetch the contact/friction response func
//perhaps do a similar thing for friction/restutution combiner funcs...
@@ -390,14 +951,14 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol
btScalar rel_vel;
rel_vel = cp.m_normalWorldOnB.dot(vel);
- float combinedRestitution = cp.m_combinedRestitution;
+ btScalar combinedRestitution = cp.m_combinedRestitution;
- cpd->m_penetration = cp.getDistance();
+ cpd->m_penetration = cp.getDistance();///btScalar(info.m_numIterations);
cpd->m_friction = cp.m_combinedFriction;
cpd->m_restitution = restitutionCurve(rel_vel, combinedRestitution);
- if (cpd->m_restitution <= 0.) //0.f)
+ if (cpd->m_restitution <= btScalar(0.))
{
- cpd->m_restitution = 0.0f;
+ cpd->m_restitution = btScalar(0.0);
};
@@ -408,18 +969,18 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol
if (cpd->m_restitution > penVel)
{
- cpd->m_penetration = 0.f;
+ cpd->m_penetration = btScalar(0.);
}
- float relaxation = info.m_damping;
+ btScalar relaxation = info.m_damping;
if (m_solverMode & SOLVER_USE_WARMSTARTING)
{
cpd->m_appliedImpulse *= relaxation;
} else
{
- cpd->m_appliedImpulse =0.f;
+ cpd->m_appliedImpulse =btScalar(0.);
}
//for friction
@@ -432,12 +993,12 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol
#define NO_FRICTION_WARMSTART 1
#ifdef NO_FRICTION_WARMSTART
- cpd->m_accumulatedTangentImpulse0 = 0.f;
- cpd->m_accumulatedTangentImpulse1 = 0.f;
+ cpd->m_accumulatedTangentImpulse0 = btScalar(0.);
+ cpd->m_accumulatedTangentImpulse1 = btScalar(0.);
#endif //NO_FRICTION_WARMSTART
- float denom0 = body0->computeImpulseDenominator(pos1,cpd->m_frictionWorldTangential0);
- float denom1 = body1->computeImpulseDenominator(pos2,cpd->m_frictionWorldTangential0);
- float denom = relaxation/(denom0+denom1);
+ btScalar denom0 = body0->computeImpulseDenominator(pos1,cpd->m_frictionWorldTangential0);
+ btScalar denom1 = body1->computeImpulseDenominator(pos2,cpd->m_frictionWorldTangential0);
+ btScalar denom = relaxation/(denom0+denom1);
cpd->m_jacDiagABInvTangent0 = denom;
@@ -492,16 +1053,54 @@ void btSequentialImpulseConstraintSolver::prepareConstraints(btPersistentManifol
}
}
-float btSequentialImpulseConstraintSolver::solve(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer)
+
+btScalar btSequentialImpulseConstraintSolver::solveCombinedContactFriction(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer)
{
+ btScalar maxImpulse = btScalar(0.);
+
+ {
+
+ btVector3 color(0,1,0);
+ {
+ if (cp.getDistance() <= btScalar(0.))
+ {
- float maxImpulse = 0.f;
+ if (iter == 0)
+ {
+ if (debugDrawer)
+ debugDrawer->drawContactPoint(cp.m_positionWorldOnB,cp.m_normalWorldOnB,cp.getDistance(),cp.getLifeTime(),color);
+ }
+
+ {
+
+ //btConstraintPersistentData* cpd = (btConstraintPersistentData*) cp.m_userPersistentData;
+ btScalar impulse = resolveSingleCollisionCombined(
+ *body0,*body1,
+ cp,
+ info);
+
+ if (maxImpulse < impulse)
+ maxImpulse = impulse;
+
+ }
+ }
+ }
+ }
+ return maxImpulse;
+}
+
+
+
+btScalar btSequentialImpulseConstraintSolver::solve(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer)
+{
+
+ btScalar maxImpulse = btScalar(0.);
{
btVector3 color(0,1,0);
{
- if (cp.getDistance() <= 0.f)
+ if (cp.getDistance() <= btScalar(0.))
{
if (iter == 0)
@@ -513,7 +1112,7 @@ float btSequentialImpulseConstraintSolver::solve(btRigidBody* body0,btRigidBody*
{
btConstraintPersistentData* cpd = (btConstraintPersistentData*) cp.m_userPersistentData;
- float impulse = cpd->m_contactSolverFunc(
+ btScalar impulse = cpd->m_contactSolverFunc(
*body0,*body1,
cp,
info);
@@ -528,16 +1127,19 @@ float btSequentialImpulseConstraintSolver::solve(btRigidBody* body0,btRigidBody*
return maxImpulse;
}
-float btSequentialImpulseConstraintSolver::solveFriction(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer)
+btScalar btSequentialImpulseConstraintSolver::solveFriction(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer)
{
+ (void)debugDrawer;
+ (void)iter;
+
{
btVector3 color(0,1,0);
{
- if (cp.getDistance() <= 0.f)
+ if (cp.getDistance() <= btScalar(0.))
{
btConstraintPersistentData* cpd = (btConstraintPersistentData*) cp.m_userPersistentData;
@@ -552,5 +1154,5 @@ float btSequentialImpulseConstraintSolver::solveFriction(btRigidBody* body0,btRi
}
- return 0.f;
+ return btScalar(0.);
}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
index 0989a86e2cd..13e70c41be4 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h
@@ -18,7 +18,6 @@ subject to the following restrictions:
#include "btConstraintSolver.h"
class btIDebugDraw;
-
#include "btContactConstraint.h"
@@ -31,8 +30,8 @@ class btSequentialImpulseConstraintSolver : public btConstraintSolver
{
protected:
- float solve(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer);
- float solveFriction(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer);
+ btScalar solve(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer);
+ btScalar solveFriction(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer);
void prepareConstraints(btPersistentManifold* manifoldPtr, const btContactSolverInfo& info,btIDebugDraw* debugDrawer);
ContactSolverFunc m_contactDispatch[MAX_CONTACT_SOLVER_TYPES][MAX_CONTACT_SOLVER_TYPES];
@@ -40,6 +39,8 @@ protected:
//choose between several modes, different friction model etc.
int m_solverMode;
+ ///m_btSeed2 is used for re-arranging the constraint rows. improves convergence/quality of friction
+ unsigned long m_btSeed2;
public:
@@ -47,7 +48,8 @@ public:
{
SOLVER_RANDMIZE_ORDER = 1,
SOLVER_FRICTION_SEPARATE = 2,
- SOLVER_USE_WARMSTARTING = 4
+ SOLVER_USE_WARMSTARTING = 4,
+ SOLVER_CACHE_FRIENDLY = 8
};
btSequentialImpulseConstraintSolver();
@@ -68,7 +70,12 @@ public:
virtual ~btSequentialImpulseConstraintSolver() {}
- virtual float solveGroup(btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& info, btIDebugDraw* debugDrawer=0);
+ virtual btScalar solveGroup(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& info, btIDebugDraw* debugDrawer, btStackAlloc* stackAlloc);
+
+ virtual btScalar solveGroupCacheFriendly(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifoldPtr, int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& infoGlobal,btIDebugDraw* debugDrawer,btStackAlloc* stackAlloc);
+
+ btScalar solveCombinedContactFriction(btRigidBody* body0,btRigidBody* body1, btManifoldPoint& cp, const btContactSolverInfo& info,int iter,btIDebugDraw* debugDrawer);
+
void setSolverMode(int mode)
{
@@ -79,20 +86,24 @@ public:
{
return m_solverMode;
}
-};
-
-/// Small variation on btSequentialImpulseConstraintSolver: warmstarting, separate friction, non-randomized ordering
-class btSequentialImpulseConstraintSolver3 : public btSequentialImpulseConstraintSolver
-{
-public:
- btSequentialImpulseConstraintSolver3();
+ unsigned long btRand2();
- virtual float solveGroup(btPersistentManifold** manifold,int numManifolds,btTypedConstraint** constraints,int numConstraints,const btContactSolverInfo& info, btIDebugDraw* debugDrawer=0);
+ int btRandInt2 (int n);
+ void setRandSeed(unsigned long seed)
+ {
+ m_btSeed2 = seed;
+ }
+ unsigned long getRandSeed() const
+ {
+ return m_btSeed2;
+ }
};
+
+
#endif //SEQUENTIAL_IMPULSE_CONSTRAINT_SOLVER_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp
index edca6c8fa08..0c7dbd668bb 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp
@@ -43,12 +43,18 @@ void btSolve2LinearConstraint::resolveUnilateralPairConstraint(
btScalar depthB, const btVector3& normalB,
btScalar& imp0,btScalar& imp1)
{
+ (void)linvelA;
+ (void)linvelB;
+ (void)angvelB;
+ (void)angvelA;
- imp0 = 0.f;
- imp1 = 0.f;
- btScalar len = fabs(normalA.length())-1.f;
- if (fabs(len) >= SIMD_EPSILON)
+
+ imp0 = btScalar(0.);
+ imp1 = btScalar(0.);
+
+ btScalar len = btFabs(normalA.length()) - btScalar(1.);
+ if (btFabs(len) >= SIMD_EPSILON)
return;
btAssert(len < SIMD_EPSILON);
@@ -67,7 +73,7 @@ void btSolve2LinearConstraint::resolveUnilateralPairConstraint(
const btScalar vel1 = normalB.dot(body1->getVelocityInLocalPoint(rel_posB1)-body2->getVelocityInLocalPoint(rel_posB1));
// btScalar penetrationImpulse = (depth*contactTau*timeCorrection) * massTerm;//jacDiagABInv
- btScalar massTerm = 1.f / (invMassA + invMassB);
+ btScalar massTerm = btScalar(1.) / (invMassA + invMassB);
// calculate rhs (or error) terms
@@ -87,7 +93,7 @@ void btSolve2LinearConstraint::resolveUnilateralPairConstraint(
btScalar nonDiag = jacA.getNonDiagonal(jacB,invMassA,invMassB);
- btScalar invDet = 1.0f / (jacA.getDiagonal() * jacB.getDiagonal() - nonDiag * nonDiag );
+ btScalar invDet = btScalar(1.0) / (jacA.getDiagonal() * jacB.getDiagonal() - nonDiag * nonDiag );
//imp0 = dv0 * jacA.getDiagonal() * invDet + dv1 * -nonDiag * invDet;
//imp1 = dv1 * jacB.getDiagonal() * invDet + dv0 * - nonDiag * invDet;
@@ -126,11 +132,18 @@ void btSolve2LinearConstraint::resolveBilateralPairConstraint(
btScalar& imp0,btScalar& imp1)
{
- imp0 = 0.f;
- imp1 = 0.f;
+ (void)linvelA;
+ (void)linvelB;
+ (void)angvelA;
+ (void)angvelB;
+
+
- btScalar len = fabs(normalA.length())-1.f;
- if (fabs(len) >= SIMD_EPSILON)
+ imp0 = btScalar(0.);
+ imp1 = btScalar(0.);
+
+ btScalar len = btFabs(normalA.length()) - btScalar(1.);
+ if (btFabs(len) >= SIMD_EPSILON)
return;
btAssert(len < SIMD_EPSILON);
@@ -164,7 +177,7 @@ void btSolve2LinearConstraint::resolveBilateralPairConstraint(
btScalar nonDiag = jacA.getNonDiagonal(jacB,invMassA,invMassB);
- btScalar invDet = 1.0f / (jacA.getDiagonal() * jacB.getDiagonal() - nonDiag * nonDiag );
+ btScalar invDet = btScalar(1.0) / (jacA.getDiagonal() * jacB.getDiagonal() - nonDiag * nonDiag );
//imp0 = dv0 * jacA.getDiagonal() * invDet + dv1 * -nonDiag * invDet;
//imp1 = dv1 * jacB.getDiagonal() * invDet + dv0 * - nonDiag * invDet;
@@ -178,41 +191,41 @@ void btSolve2LinearConstraint::resolveBilateralPairConstraint(
//[jA nD] * [imp0] = [dv0]
//[nD jB] [imp1] [dv1]
- if ( imp0 > 0.0f)
+ if ( imp0 > btScalar(0.0))
{
- if ( imp1 > 0.0f )
+ if ( imp1 > btScalar(0.0) )
{
//both positive
}
else
{
- imp1 = 0.f;
+ imp1 = btScalar(0.);
// now imp0>0 imp1<0
imp0 = dv0 / jacA.getDiagonal();
- if ( imp0 > 0.0f )
+ if ( imp0 > btScalar(0.0) )
{
} else
{
- imp0 = 0.f;
+ imp0 = btScalar(0.);
}
}
}
else
{
- imp0 = 0.f;
+ imp0 = btScalar(0.);
imp1 = dv1 / jacB.getDiagonal();
- if ( imp1 <= 0.0f )
+ if ( imp1 <= btScalar(0.0) )
{
- imp1 = 0.f;
+ imp1 = btScalar(0.);
// now imp0>0 imp1<0
imp0 = dv0 / jacA.getDiagonal();
- if ( imp0 > 0.0f )
+ if ( imp0 > btScalar(0.0) )
{
} else
{
- imp0 = 0.f;
+ imp0 = btScalar(0.);
}
} else
{
@@ -221,7 +234,7 @@ void btSolve2LinearConstraint::resolveBilateralPairConstraint(
}
-
+/*
void btSolve2LinearConstraint::resolveAngularConstraint( const btMatrix3x3& invInertiaAWS,
const btScalar invMassA,
const btVector3& linvelA,const btVector3& angvelA,
@@ -238,4 +251,5 @@ void btSolve2LinearConstraint::resolveAngularConstraint( const btMatrix3x3& invI
{
}
+*/
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h
index 639e4c9433f..e7d26645c6a 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h
@@ -16,8 +16,8 @@ subject to the following restrictions:
#ifndef SOLVE_2LINEAR_CONSTRAINT_H
#define SOLVE_2LINEAR_CONSTRAINT_H
-#include "LinearMath/btMatrix3x3.h"
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btMatrix3x3.h"
+#include "../../LinearMath/btVector3.h"
class btRigidBody;
@@ -85,7 +85,7 @@ public:
btScalar depthB, const btVector3& normalB,
btScalar& imp0,btScalar& imp1);
-
+/*
void resolveAngularConstraint( const btMatrix3x3& invInertiaAWS,
const btScalar invMassA,
const btVector3& linvelA,const btVector3& angvelA,
@@ -100,6 +100,7 @@ public:
btScalar depthB, const btVector3& normalB,
btScalar& imp0,btScalar& imp1);
+*/
};
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverBody.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverBody.h
new file mode 100644
index 00000000000..0ab536f42b3
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverBody.h
@@ -0,0 +1,71 @@
+/*
+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_SOLVER_BODY_H
+#define BT_SOLVER_BODY_H
+
+class btRigidBody;
+#include "LinearMath/btVector3.h"
+#include "LinearMath/btMatrix3x3.h"
+
+
+
+
+ATTRIBUTE_ALIGNED16 (struct) btSolverBody
+{
+ btVector3 m_centerOfMassPosition;
+ btVector3 m_linearVelocity;
+ btVector3 m_angularVelocity;
+ btRigidBody* m_originalBody;
+ float m_invMass;
+ float m_friction;
+ float m_angularFactor;
+
+ inline void getVelocityInLocalPoint(const btVector3& rel_pos, btVector3& velocity ) const
+ {
+ velocity = m_linearVelocity + m_angularVelocity.cross(rel_pos);
+ }
+
+ //Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position
+ inline void internalApplyImpulse(const btVector3& linearComponent, const btVector3& angularComponent,btScalar impulseMagnitude)
+ {
+ m_linearVelocity += linearComponent*impulseMagnitude;
+ m_angularVelocity += angularComponent*impulseMagnitude*m_angularFactor;
+ }
+
+ void writebackVelocity()
+ {
+ if (m_invMass)
+ {
+ m_originalBody->setLinearVelocity(m_linearVelocity);
+ m_originalBody->setAngularVelocity(m_angularVelocity);
+ }
+ }
+
+ void readVelocity()
+ {
+ if (m_invMass)
+ {
+ m_linearVelocity = m_originalBody->getLinearVelocity();
+ m_angularVelocity = m_originalBody->getAngularVelocity();
+ }
+ }
+
+
+
+
+};
+
+#endif //BT_SOLVER_BODY_H
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h
new file mode 100644
index 00000000000..f1f40ffdf19
--- /dev/null
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btSolverConstraint.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_SOLVER_CONSTRAINT_H
+#define BT_SOLVER_CONSTRAINT_H
+
+class btRigidBody;
+#include "LinearMath/btVector3.h"
+#include "LinearMath/btMatrix3x3.h"
+
+//#define NO_FRICTION_TANGENTIALS 1
+
+///1D constraint along a normal axis between bodyA and bodyB. It can be combined to solve contact and friction constraints.
+ATTRIBUTE_ALIGNED16 (struct) btSolverConstraint
+{
+ btVector3 m_relpos1CrossNormal;
+ btVector3 m_relpos2CrossNormal;
+ btVector3 m_contactNormal;
+ btVector3 m_angularComponentA;
+ btVector3 m_angularComponentB;
+
+ btScalar m_appliedVelocityImpulse;
+ int m_solverBodyIdA;
+ int m_solverBodyIdB;
+ btScalar m_friction;
+ btScalar m_restitution;
+ btScalar m_jacDiagABInv;
+ btScalar m_penetration;
+ btScalar m_appliedImpulse;
+
+ int m_constraintType;
+ int m_frictionIndex;
+ int m_unusedPadding[2];
+
+ enum btSolverConstraintType
+ {
+ BT_SOLVER_CONTACT_1D = 0,
+ BT_SOLVER_FRICTION_1D
+ };
+};
+
+
+
+
+
+
+#endif //BT_SOLVER_CONSTRAINT_H
+
+
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
index cb3fa72d440..a15b3e026cd 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp
@@ -24,18 +24,18 @@ btTypedConstraint::btTypedConstraint()
m_userConstraintId(-1),
m_rbA(s_fixed),
m_rbB(s_fixed),
-m_appliedImpulse(0.f)
+m_appliedImpulse(btScalar(0.))
{
- s_fixed.setMassProps(0.f,btVector3(0.f,0.f,0.f));
+ s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
}
btTypedConstraint::btTypedConstraint(btRigidBody& rbA)
: m_userConstraintType(-1),
m_userConstraintId(-1),
m_rbA(rbA),
m_rbB(s_fixed),
-m_appliedImpulse(0.f)
+m_appliedImpulse(btScalar(0.))
{
- s_fixed.setMassProps(0.f,btVector3(0.f,0.f,0.f));
+ s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
}
@@ -45,9 +45,9 @@ btTypedConstraint::btTypedConstraint(btRigidBody& rbA,btRigidBody& rbB)
m_userConstraintId(-1),
m_rbA(rbA),
m_rbB(rbB),
-m_appliedImpulse(0.f)
+m_appliedImpulse(btScalar(0.))
{
- s_fixed.setMassProps(0.f,btVector3(0.f,0.f,0.f));
+ s_fixed.setMassProps(btScalar(0.),btVector3(btScalar(0.),btScalar(0.),btScalar(0.)));
}
diff --git a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h
index bc25eaa759c..dfee6e80d0e 100644
--- a/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h
+++ b/extern/bullet2/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h
@@ -17,19 +17,25 @@ subject to the following restrictions:
#define TYPED_CONSTRAINT_H
class btRigidBody;
-#include "LinearMath/btScalar.h"
+#include "../../LinearMath/btScalar.h"
///TypedConstraint is the baseclass for Bullet constraints and vehicles
class btTypedConstraint
{
int m_userConstraintType;
int m_userConstraintId;
-
+
+ btTypedConstraint& operator=(btTypedConstraint& other)
+ {
+ btAssert(0);
+ (void) other;
+ return *this;
+ }
protected:
btRigidBody& m_rbA;
btRigidBody& m_rbB;
- float m_appliedImpulse;
+ btScalar m_appliedImpulse;
public:
@@ -81,7 +87,7 @@ public:
{
return m_userConstraintId;
}
- float getAppliedImpulse()
+ btScalar getAppliedImpulse()
{
return m_appliedImpulse;
}
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
index fc37cf2e3c3..29719ec9a3e 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp
@@ -16,7 +16,6 @@ subject to the following restrictions:
#include "btDiscreteDynamicsWorld.h"
-
//collision detection
#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h"
#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h"
@@ -31,15 +30,17 @@ subject to the following restrictions:
#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
//for debug rendering
-#include "BulletCollision/CollisionShapes/btCompoundShape.h"
-#include "BulletCollision/CollisionShapes/btSphereShape.h"
#include "BulletCollision/CollisionShapes/btBoxShape.h"
-#include "BulletCollision/CollisionShapes/btCylinderShape.h"
+#include "BulletCollision/CollisionShapes/btCapsuleShape.h"
+#include "BulletCollision/CollisionShapes/btCompoundShape.h"
#include "BulletCollision/CollisionShapes/btConeShape.h"
-#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h"
-#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.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 "LinearMath/btIDebugDraw.h"
@@ -54,8 +55,6 @@ subject to the following restrictions:
-#include <algorithm>
-
btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver)
@@ -63,7 +62,7 @@ btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(btDispatcher* dispatcher,btOver
m_constraintSolver(constraintSolver? constraintSolver: new btSequentialImpulseConstraintSolver),
m_debugDrawer(0),
m_gravity(0,-10,0),
-m_localTime(1.f/60.f),
+m_localTime(btScalar(1.)/btScalar(60.)),
m_profileTimings(0)
{
m_islandManager = new btSimulationIslandManager();
@@ -81,10 +80,10 @@ btDiscreteDynamicsWorld::~btDiscreteDynamicsWorld()
delete m_constraintSolver;
}
-void btDiscreteDynamicsWorld::saveKinematicState(float timeStep)
+void btDiscreteDynamicsWorld::saveKinematicState(btScalar timeStep)
{
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for (int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -110,27 +109,27 @@ void btDiscreteDynamicsWorld::synchronizeMotionStates()
{
//todo: iterate over awake simulation islands!
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe)
{
- btVector3 color(255.f,255.f,255.f);
+ btVector3 color(btScalar(255.),btScalar(255.),btScalar(255.));
switch(colObj->getActivationState())
{
case ACTIVE_TAG:
- color = btVector3(255.f,255.f,255.f); break;
+ color = btVector3(btScalar(255.),btScalar(255.),btScalar(255.)); break;
case ISLAND_SLEEPING:
- color = btVector3(0.f,255.f,0.f);break;
+ color = btVector3(btScalar(0.),btScalar(255.),btScalar(0.));break;
case WANTS_DEACTIVATION:
- color = btVector3(0.f,255.f,255.f);break;
+ color = btVector3(btScalar(0.),btScalar(255.),btScalar(255.));break;
case DISABLE_DEACTIVATION:
- color = btVector3(255.f,0.f,0.f);break;
+ color = btVector3(btScalar(255.),btScalar(0.),btScalar(0.));break;
case DISABLE_SIMULATION:
- color = btVector3(255.f,255.f,0.f);break;
+ color = btVector3(btScalar(255.),btScalar(255.),btScalar(0.));break;
default:
{
- color = btVector3(255.f,0.f,0.f);
+ color = btVector3(btScalar(255.),btScalar(0.),btScalar(0.));
}
};
@@ -139,7 +138,10 @@ void btDiscreteDynamicsWorld::synchronizeMotionStates()
btRigidBody* body = btRigidBody::upcast(colObj);
if (body && body->getMotionState() && !body->isStaticOrKinematicObject())
{
- if (body->getActivationState() != ISLAND_SLEEPING)
+ //we need to call the update at least once, even for sleeping objects
+ //otherwise the 'graphics' transform never updates properly
+ //so todo: add 'dirty' flag
+ //if (body->getActivationState() != ISLAND_SLEEPING)
{
btTransform interpolatedTransform;
btTransformUtil::integrateTransform(body->getInterpolationWorldTransform(),
@@ -152,7 +154,7 @@ void btDiscreteDynamicsWorld::synchronizeMotionStates()
if (getDebugDrawer() && getDebugDrawer()->getDebugMode() & btIDebugDraw::DBG_DrawWireframe)
{
- for (unsigned int i=0;i<this->m_vehicles.size();i++)
+ for ( int i=0;i<this->m_vehicles.size();i++)
{
for (int v=0;v<m_vehicles[i]->getNumWheels();v++)
{
@@ -188,7 +190,7 @@ void btDiscreteDynamicsWorld::synchronizeMotionStates()
}
-int btDiscreteDynamicsWorld::stepSimulation( float timeStep,int maxSubSteps, float fixedTimeStep)
+int btDiscreteDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, btScalar fixedTimeStep)
{
int numSimulationSubSteps = 0;
@@ -243,7 +245,7 @@ int btDiscreteDynamicsWorld::stepSimulation( float timeStep,int maxSubSteps, flo
return numSimulationSubSteps;
}
-void btDiscreteDynamicsWorld::internalSingleStepSimulation(float timeStep)
+void btDiscreteDynamicsWorld::internalSingleStepSimulation(btScalar timeStep)
{
startProfiling(timeStep);
@@ -291,7 +293,7 @@ void btDiscreteDynamicsWorld::internalSingleStepSimulation(float timeStep)
void btDiscreteDynamicsWorld::setGravity(const btVector3& gravity)
{
m_gravity = gravity;
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -318,19 +320,32 @@ void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body)
if (body->getCollisionShape())
{
bool isDynamic = !(body->isStaticObject() || body->isKinematicObject());
- short collisionFilterGroup = isDynamic? btBroadphaseProxy::DefaultFilter : btBroadphaseProxy::StaticFilter;
- short collisionFilterMask = isDynamic? btBroadphaseProxy::AllFilter : btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter;
+ short collisionFilterGroup = isDynamic? short(btBroadphaseProxy::DefaultFilter) : short(btBroadphaseProxy::StaticFilter);
+ short collisionFilterMask = isDynamic? short(btBroadphaseProxy::AllFilter) : short(btBroadphaseProxy::AllFilter ^ btBroadphaseProxy::StaticFilter);
addCollisionObject(body,collisionFilterGroup,collisionFilterMask);
}
}
+void btDiscreteDynamicsWorld::addRigidBody(btRigidBody* body, short group, short mask)
+{
+ if (!body->isStaticOrKinematicObject())
+ {
+ body->setGravity(m_gravity);
+ }
+
+ if (body->getCollisionShape())
+ {
+ addCollisionObject(body,group,mask);
+ }
+}
+
-void btDiscreteDynamicsWorld::updateVehicles(float timeStep)
+void btDiscreteDynamicsWorld::updateVehicles(btScalar timeStep)
{
BEGIN_PROFILE("updateVehicles");
- for (unsigned int i=0;i<m_vehicles.size();i++)
+ for ( int i=0;i<m_vehicles.size();i++)
{
btRaycastVehicle* vehicle = m_vehicles[i];
vehicle->updateVehicle( timeStep);
@@ -338,11 +353,11 @@ void btDiscreteDynamicsWorld::updateVehicles(float timeStep)
END_PROFILE("updateVehicles");
}
-void btDiscreteDynamicsWorld::updateActivationState(float timeStep)
+void btDiscreteDynamicsWorld::updateActivationState(btScalar timeStep)
{
BEGIN_PROFILE("updateActivationState");
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -370,18 +385,21 @@ void btDiscreteDynamicsWorld::updateActivationState(float timeStep)
END_PROFILE("updateActivationState");
}
-void btDiscreteDynamicsWorld::addConstraint(btTypedConstraint* constraint)
+void btDiscreteDynamicsWorld::addConstraint(btTypedConstraint* constraint,bool disableCollisionsBetweenLinkedBodies)
{
m_constraints.push_back(constraint);
+ if (disableCollisionsBetweenLinkedBodies)
+ {
+ constraint->getRigidBodyA().addConstraintRef(constraint);
+ constraint->getRigidBodyB().addConstraintRef(constraint);
+ }
}
void btDiscreteDynamicsWorld::removeConstraint(btTypedConstraint* constraint)
{
- std::vector<btTypedConstraint*>::iterator cit = std::find(m_constraints.begin(),m_constraints.end(),constraint);
- if (!(cit==m_constraints.end()))
- {
- m_constraints.erase(cit);
- }
+ m_constraints.remove(constraint);
+ constraint->getRigidBodyA().removeConstraintRef(constraint);
+ constraint->getRigidBodyB().removeConstraintRef(constraint);
}
void btDiscreteDynamicsWorld::addVehicle(btRaycastVehicle* vehicle)
@@ -391,11 +409,7 @@ void btDiscreteDynamicsWorld::addVehicle(btRaycastVehicle* vehicle)
void btDiscreteDynamicsWorld::removeVehicle(btRaycastVehicle* vehicle)
{
- std::vector<btRaycastVehicle*>::iterator vit = std::find(m_vehicles.begin(),m_vehicles.end(),vehicle);
- if (!(vit==m_vehicles.end()))
- {
- m_vehicles.erase(vit);
- }
+ m_vehicles.remove(vehicle);
}
inline int btGetConstraintIslandId(const btTypedConstraint* lhs)
@@ -409,19 +423,26 @@ inline int btGetConstraintIslandId(const btTypedConstraint* lhs)
}
-static bool btSortConstraintOnIslandPredicate(const btTypedConstraint* lhs, const btTypedConstraint* rhs)
+
+class btSortConstraintOnIslandPredicate
{
- int rIslandId0,lIslandId0;
- rIslandId0 = btGetConstraintIslandId(rhs);
- lIslandId0 = btGetConstraintIslandId(lhs);
- return lIslandId0 < rIslandId0;
-}
+ public:
+
+ bool operator() ( const btTypedConstraint* lhs, const btTypedConstraint* rhs )
+ {
+ int rIslandId0,lIslandId0;
+ rIslandId0 = btGetConstraintIslandId(rhs);
+ lIslandId0 = btGetConstraintIslandId(lhs);
+ return lIslandId0 < rIslandId0;
+ }
+};
+
+
+
void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
{
- BEGIN_PROFILE("solveConstraints");
-
struct InplaceSolverIslandCallback : public btSimulationIslandManager::IslandCallback
{
@@ -430,7 +451,7 @@ void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
btTypedConstraint** m_sortedConstraints;
int m_numConstraints;
btIDebugDraw* m_debugDrawer;
-
+ btStackAlloc* m_stackAlloc;
InplaceSolverIslandCallback(
@@ -438,17 +459,25 @@ void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
btConstraintSolver* solver,
btTypedConstraint** sortedConstraints,
int numConstraints,
- btIDebugDraw* debugDrawer)
+ btIDebugDraw* debugDrawer,
+ btStackAlloc* stackAlloc)
:m_solverInfo(solverInfo),
m_solver(solver),
m_sortedConstraints(sortedConstraints),
m_numConstraints(numConstraints),
- m_debugDrawer(debugDrawer)
+ m_debugDrawer(debugDrawer),
+ m_stackAlloc(stackAlloc)
{
}
- virtual void ProcessIsland(btPersistentManifold** manifolds,int numManifolds, int islandId)
+ InplaceSolverIslandCallback& operator=(InplaceSolverIslandCallback& other)
+ {
+ btAssert(0);
+ (void)other;
+ return *this;
+ }
+ virtual void ProcessIsland(btCollisionObject** bodies,int numBodies,btPersistentManifold** manifolds,int numManifolds, int islandId)
{
//also add all non-contact constraints/joints for this island
btTypedConstraint** startConstraint = 0;
@@ -473,36 +502,35 @@ void btDiscreteDynamicsWorld::solveConstraints(btContactSolverInfo& solverInfo)
}
}
- m_solver->solveGroup( manifolds, numManifolds,startConstraint,numCurConstraints,m_solverInfo,m_debugDrawer);
+ m_solver->solveGroup( bodies,numBodies,manifolds, numManifolds,startConstraint,numCurConstraints,m_solverInfo,m_debugDrawer,m_stackAlloc);
}
};
-
-
-
-
//sorted version of all btTypedConstraint, based on islandId
- std::vector<btTypedConstraint*> sortedConstraints;
+ btAlignedObjectArray<btTypedConstraint*> sortedConstraints;
sortedConstraints.resize( m_constraints.size());
int i;
for (i=0;i<getNumConstraints();i++)
{
sortedConstraints[i] = m_constraints[i];
}
+
+// assert(0);
+
- std::sort(sortedConstraints.begin(),sortedConstraints.end(),btSortConstraintOnIslandPredicate);
+
+ sortedConstraints.heapSort(btSortConstraintOnIslandPredicate());
btTypedConstraint** constraintsPtr = getNumConstraints() ? &sortedConstraints[0] : 0;
- InplaceSolverIslandCallback solverCallback( solverInfo, m_constraintSolver, constraintsPtr,sortedConstraints.size(), m_debugDrawer);
+ InplaceSolverIslandCallback solverCallback( solverInfo, m_constraintSolver, constraintsPtr,sortedConstraints.size(), m_debugDrawer,m_stackAlloc);
/// solve all the constraints for this island
m_islandManager->buildAndProcessIslands(getCollisionWorld()->getDispatcher(),getCollisionWorld()->getCollisionObjectArray(),&solverCallback);
- END_PROFILE("solveConstraints");
}
@@ -545,37 +573,6 @@ void btDiscreteDynamicsWorld::calculateSimulationIslands()
}
-static void DrawAabb(btIDebugDraw* debugDrawer,const btVector3& from,const btVector3& to,const btVector3& color)
-{
-
- btVector3 halfExtents = (to-from)* 0.5f;
- btVector3 center = (to+from) *0.5f;
- int i,j;
-
- btVector3 edgecoord(1.f,1.f,1.f),pa,pb;
- for (i=0;i<4;i++)
- {
- for (j=0;j<3;j++)
- {
- pa = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],
- edgecoord[2]*halfExtents[2]);
- pa+=center;
-
- int othercoord = j%3;
- edgecoord[othercoord]*=-1.f;
- pb = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],
- edgecoord[2]*halfExtents[2]);
- pb+=center;
-
- debugDrawer->drawLine(pa,pb,color);
- }
- edgecoord = btVector3(-1.f,-1.f,-1.f);
- if (i<3)
- edgecoord[i]*=-1.f;
- }
-
-
-}
void btDiscreteDynamicsWorld::updateAabbs()
{
@@ -583,7 +580,7 @@ void btDiscreteDynamicsWorld::updateAabbs()
btVector3 colorvec(1,0,0);
btTransform predictedTrans;
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
@@ -594,34 +591,33 @@ void btDiscreteDynamicsWorld::updateAabbs()
{
btPoint3 minAabb,maxAabb;
colObj->getCollisionShape()->getAabb(colObj->getWorldTransform(), minAabb,maxAabb);
- btSimpleBroadphase* bp = (btSimpleBroadphase*)m_broadphasePairCache;
+ btBroadphaseInterface* bp = (btBroadphaseInterface*)m_broadphasePairCache;
//moving objects should be moderately sized, probably something wrong if not
- if ( colObj->isStaticObject() || ((maxAabb-minAabb).length2() < 1e12f))
+ if ( colObj->isStaticObject() || ((maxAabb-minAabb).length2() < btScalar(1e12)))
{
bp->setAabb(body->getBroadphaseHandle(),minAabb,maxAabb);
} else
{
//something went wrong, investigate
//this assert is unwanted in 3D modelers (danger of loosing work)
- assert(0);
body->setActivationState(DISABLE_SIMULATION);
static bool reportMe = true;
- if (reportMe)
+ if (reportMe && m_debugDrawer)
{
reportMe = false;
- printf("Overflow in AABB, object removed from simulation \n");
- printf("If you can reproduce this, please email bugs@continuousphysics.com\n");
- printf("Please include above information, your Platform, version of OS.\n");
- printf("Thanks.\n");
+ m_debugDrawer->reportErrorWarning("Overflow in AABB, object removed from simulation");
+ m_debugDrawer->reportErrorWarning("If you can reproduce this, please email bugs@continuousphysics.com\n");
+ m_debugDrawer->reportErrorWarning("Please include above information, your Platform, version of OS.\n");
+ m_debugDrawer->reportErrorWarning("Thanks.\n");
}
}
if (m_debugDrawer && (m_debugDrawer->getDebugMode() & btIDebugDraw::DBG_DrawAabb))
{
- DrawAabb(m_debugDrawer,minAabb,maxAabb,colorvec);
+ m_debugDrawer->drawAabb(minAabb,maxAabb,colorvec);
}
}
}
@@ -630,11 +626,11 @@ void btDiscreteDynamicsWorld::updateAabbs()
END_PROFILE("updateAabbs");
}
-void btDiscreteDynamicsWorld::integrateTransforms(float timeStep)
+void btDiscreteDynamicsWorld::integrateTransforms(btScalar timeStep)
{
BEGIN_PROFILE("integrateTransforms");
btTransform predictedTrans;
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -652,10 +648,10 @@ void btDiscreteDynamicsWorld::integrateTransforms(float timeStep)
-void btDiscreteDynamicsWorld::predictUnconstraintMotion(float timeStep)
+void btDiscreteDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
{
BEGIN_PROFILE("predictUnconstraintMotion");
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -676,8 +672,9 @@ void btDiscreteDynamicsWorld::predictUnconstraintMotion(float timeStep)
}
-void btDiscreteDynamicsWorld::startProfiling(float timeStep)
+void btDiscreteDynamicsWorld::startProfiling(btScalar timeStep)
{
+ (void)timeStep;
#ifdef USE_QUICKPROF
@@ -724,10 +721,10 @@ class DebugDrawcallback : public btTriangleCallback, public btInternalTriangleIn
public:
- DebugDrawcallback(btIDebugDraw* debugDrawer,const btTransform& worldTrans,const btVector3& color)
- : m_debugDrawer(debugDrawer),
- m_worldTrans(worldTrans),
- m_color(color)
+ DebugDrawcallback(btIDebugDraw* debugDrawer,const btTransform& worldTrans,const btVector3& color) :
+ m_debugDrawer(debugDrawer),
+ m_color(color),
+ m_worldTrans(worldTrans)
{
}
@@ -738,6 +735,9 @@ public:
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];
@@ -748,10 +748,42 @@ public:
}
};
-
+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)
{
@@ -771,25 +803,63 @@ void btDiscreteDynamicsWorld::debugDrawObject(const btTransform& worldTransform,
case SPHERE_SHAPE_PROXYTYPE:
{
const btSphereShape* sphereShape = static_cast<const btSphereShape*>(shape);
- float radius = sphereShape->getMargin();//radius doesn't include the margin, so draw with margin
- btVector3 start = worldTransform.getOrigin();
- getDebugDrawer()->drawLine(start,start+worldTransform.getBasis() * btVector3(radius,0,0),color);
- getDebugDrawer()->drawLine(start,start+worldTransform.getBasis() * btVector3(0,radius,0),color);
- getDebugDrawer()->drawLine(start,start+worldTransform.getBasis() * btVector3(0,0,radius),color);
- //drawSphere
+ 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();
+
+ // Draw the ends
+ {
+ btTransform childTransform = worldTransform;
+ childTransform.getOrigin() = worldTransform * btVector3(0,halfHeight,0);
+ debugDrawSphere(radius, childTransform, color);
+ }
+
+ {
+ btTransform childTransform = worldTransform;
+ childTransform.getOrigin() = worldTransform * btVector3(0,-halfHeight,0);
+ debugDrawSphere(radius, childTransform, color);
+ }
+
+ // Draw some additional lines
+ btVector3 start = worldTransform.getOrigin();
+ getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(-radius,halfHeight,0),start+worldTransform.getBasis() * btVector3(-radius,-halfHeight,0), color);
+ getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(radius,halfHeight,0),start+worldTransform.getBasis() * btVector3(radius,-halfHeight,0), color);
+ getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(0,halfHeight,-radius),start+worldTransform.getBasis() * btVector3(0,-halfHeight,-radius), color);
+ getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(0,halfHeight,radius),start+worldTransform.getBasis() * btVector3(0,-halfHeight,radius), color);
+
+ break;
+ }
case CONE_SHAPE_PROXYTYPE:
{
const btConeShape* coneShape = static_cast<const btConeShape*>(shape);
- float radius = coneShape->getRadius();//+coneShape->getMargin();
- float height = coneShape->getHeight();//+coneShape->getMargin();
+ btScalar radius = coneShape->getRadius();//+coneShape->getMargin();
+ btScalar height = coneShape->getHeight();//+coneShape->getMargin();
btVector3 start = worldTransform.getOrigin();
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(0.f,0.f,0.5f*height),start+worldTransform.getBasis() * btVector3(radius,0.f,-0.5f*height),color);
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(0.f,0.f,0.5f*height),start+worldTransform.getBasis() * btVector3(-radius,0.f,-0.5f*height),color);
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(0.f,0.f,0.5f*height),start+worldTransform.getBasis() * btVector3(0.f,radius,-0.5f*height),color);
- getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(0.f,0.f,0.5f*height),start+worldTransform.getBasis() * btVector3(0.f,-radius,-0.5f*height),color);
+ getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(btScalar(0.),btScalar(0.),btScalar(0.5)*height),start+worldTransform.getBasis() * btVector3(radius,btScalar(0.),btScalar(-0.5)*height),color);
+ getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(btScalar(0.),btScalar(0.),btScalar(0.5)*height),start+worldTransform.getBasis() * btVector3(-radius,btScalar(0.),btScalar(-0.5)*height),color);
+ getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(btScalar(0.),btScalar(0.),btScalar(0.5)*height),start+worldTransform.getBasis() * btVector3(btScalar(0.),radius,btScalar(-0.5)*height),color);
+ getDebugDrawer()->drawLine(start+worldTransform.getBasis() * btVector3(btScalar(0.),btScalar(0.),btScalar(0.5)*height),start+worldTransform.getBasis() * btVector3(btScalar(0.),-radius,btScalar(-0.5)*height),color);
break;
}
@@ -797,8 +867,8 @@ void btDiscreteDynamicsWorld::debugDrawObject(const btTransform& worldTransform,
{
const btCylinderShape* cylinder = static_cast<const btCylinderShape*>(shape);
int upAxis = cylinder->getUpAxis();
- float radius = cylinder->getRadius();
- float halfHeight = cylinder->getHalfExtents()[upAxis];
+ btScalar radius = cylinder->getRadius();
+ btScalar halfHeight = cylinder->getHalfExtents()[upAxis];
btVector3 start = worldTransform.getOrigin();
btVector3 offsetHeight(0,0,0);
offsetHeight[upAxis] = halfHeight;
@@ -811,15 +881,13 @@ void btDiscreteDynamicsWorld::debugDrawObject(const btTransform& worldTransform,
default:
{
- if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
+ if (shape->isConcave())
{
- btTriangleMeshShape* concaveMesh = (btTriangleMeshShape*) shape;
- //btVector3 aabbMax(1e30f,1e30f,1e30f);
- //btVector3 aabbMax(100,100,100);//1e30f,1e30f,1e30f);
-
+ btConcaveShape* concaveMesh = (btConcaveShape*) shape;
+
//todo pass camera, for some culling
- btVector3 aabbMax(1e30f,1e30f,1e30f);
- btVector3 aabbMin(-1e30f,-1e30f,-1e30f);
+ 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);
@@ -830,8 +898,8 @@ void btDiscreteDynamicsWorld::debugDrawObject(const btTransform& worldTransform,
{
btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape;
//todo: pass camera for some culling
- btVector3 aabbMax(1e30f,1e30f,1e30f);
- btVector3 aabbMin(-1e30f,-1e30f,-1e30f);
+ btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30));
+ btVector3 aabbMin(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30));
//DebugDrawcallback drawCallback;
DebugDrawcallback drawCallback(getDebugDrawer(),worldTransform,color);
convexMesh->getStridingMesh()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax);
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h b/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
index 8575f8506f1..83b90bfeebc 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h
@@ -23,12 +23,12 @@ class btOverlappingPairCache;
class btConstraintSolver;
class btSimulationIslandManager;
class btTypedConstraint;
-#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
+#include "../ConstraintSolver/btContactSolverInfo.h"
class btRaycastVehicle;
class btIDebugDraw;
+#include "../../LinearMath/btAlignedObjectArray.h"
-#include <vector>
///btDiscreteDynamicsWorld provides discrete rigid body simulation
///those classes replace the obsolete CcdPhysicsEnvironment/CcdPhysicsController
@@ -40,14 +40,14 @@ protected:
btSimulationIslandManager* m_islandManager;
- std::vector<btTypedConstraint*> m_constraints;
+ btAlignedObjectArray<btTypedConstraint*> m_constraints;
btIDebugDraw* m_debugDrawer;
btVector3 m_gravity;
//for variable timesteps
- float m_localTime;
+ btScalar m_localTime;
//for variable timesteps
bool m_ownsIslandManager;
@@ -56,30 +56,31 @@ protected:
btContactSolverInfo m_solverInfo;
- std::vector<btRaycastVehicle*> m_vehicles;
+ btAlignedObjectArray<btRaycastVehicle*> m_vehicles;
int m_profileTimings;
- void predictUnconstraintMotion(float timeStep);
+ void predictUnconstraintMotion(btScalar timeStep);
- void integrateTransforms(float timeStep);
+ void integrateTransforms(btScalar timeStep);
void calculateSimulationIslands();
void solveConstraints(btContactSolverInfo& solverInfo);
- void updateActivationState(float timeStep);
+ void updateActivationState(btScalar timeStep);
- void updateVehicles(float timeStep);
+ void updateVehicles(btScalar timeStep);
- void startProfiling(float timeStep);
+ void startProfiling(btScalar timeStep);
- virtual void internalSingleStepSimulation( float timeStep);
+ virtual void internalSingleStepSimulation( btScalar timeStep);
void synchronizeMotionStates();
- void saveKinematicState(float timeStep);
+ void saveKinematicState(btScalar timeStep);
+ void debugDrawSphere(btScalar radius, const btTransform& transform, const btVector3& color);
public:
@@ -90,11 +91,11 @@ public:
virtual ~btDiscreteDynamicsWorld();
///if maxSubSteps > 0, it will interpolate motion between fixedTimeStep's
- virtual int stepSimulation( float timeStep,int maxSubSteps=1, float fixedTimeStep=1.f/60.f);
+ virtual int stepSimulation( btScalar timeStep,int maxSubSteps=1, btScalar fixedTimeStep=btScalar(1.)/btScalar(60.));
virtual void updateAabbs();
- void addConstraint(btTypedConstraint* constraint);
+ void addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies=false);
void removeConstraint(btTypedConstraint* constraint);
@@ -131,6 +132,8 @@ public:
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);
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h b/extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h
index 617ed98d2af..65b63fad4b5 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btDynamicsWorld.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef BT_DYNAMICS_WORLD_H
#define BT_DYNAMICS_WORLD_H
-#include "BulletCollision/CollisionDispatch/btCollisionWorld.h"
+#include "../../BulletCollision/CollisionDispatch/btCollisionWorld.h"
class btTypedConstraint;
class btRaycastVehicle;
class btConstraintSolver;
@@ -39,17 +39,17 @@ class btDynamicsWorld : public btCollisionWorld
///stepSimulation proceeds the simulation over timeStep units
///if maxSubSteps > 0, it will interpolate time steps
- virtual int stepSimulation( float timeStep,int maxSubSteps=1, float fixedTimeStep=1.f/60.f)=0;
+ virtual int stepSimulation( btScalar timeStep,int maxSubSteps=1, btScalar fixedTimeStep=btScalar(1.)/btScalar(60.))=0;
virtual void updateAabbs() = 0;
- virtual void addConstraint(btTypedConstraint* constraint) {};
+ virtual void addConstraint(btTypedConstraint* constraint, bool disableCollisionsBetweenLinkedBodies=false) { (void)constraint;};
- virtual void removeConstraint(btTypedConstraint* constraint) {};
+ virtual void removeConstraint(btTypedConstraint* constraint) {(void)constraint;};
- virtual void addVehicle(btRaycastVehicle* vehicle) {};
+ virtual void addVehicle(btRaycastVehicle* vehicle) {(void)vehicle;};
- virtual void removeVehicle(btRaycastVehicle* vehicle) {};
+ virtual void removeVehicle(btRaycastVehicle* vehicle) {(void)vehicle;};
virtual void setDebugDrawer(btIDebugDraw* debugDrawer) = 0;
@@ -68,9 +68,9 @@ class btDynamicsWorld : public btCollisionWorld
virtual int getNumConstraints() const { return 0; }
- virtual btTypedConstraint* getConstraint(int index) { return 0; }
+ virtual btTypedConstraint* getConstraint(int index) { (void)index; return 0; }
- virtual const btTypedConstraint* getConstraint(int index) const { return 0; }
+ virtual const btTypedConstraint* getConstraint(int index) const { (void)index; return 0; }
};
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp
index 705c023d3a0..02cf44d0cfa 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.cpp
@@ -16,28 +16,29 @@ subject to the following restrictions:
#include "btRigidBody.h"
#include "BulletCollision/CollisionShapes/btConvexShape.h"
#include "LinearMath/btMinMax.h"
-#include <LinearMath/btTransformUtil.h>
-#include <LinearMath/btMotionState.h>
+#include "LinearMath/btTransformUtil.h"
+#include "LinearMath/btMotionState.h"
+#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
-float gLinearAirDamping = 1.f;
+btScalar gLinearAirDamping = btScalar(1.);
//'temporarily' global variables
-float gDeactivationTime = 2.f;
+btScalar gDeactivationTime = btScalar(2.);
bool gDisableDeactivation = false;
-float gLinearSleepingThreshold = 0.8f;
-float gAngularSleepingThreshold = 1.0f;
+btScalar gLinearSleepingThreshold = btScalar(0.8);
+btScalar gAngularSleepingThreshold = btScalar(1.0);
static int uniqueId = 0;
-btRigidBody::btRigidBody(float mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia,btScalar linearDamping,btScalar angularDamping,btScalar friction,btScalar restitution)
+btRigidBody::btRigidBody(btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia,btScalar linearDamping,btScalar angularDamping,btScalar friction,btScalar restitution)
:
- m_gravity(0.0f, 0.0f, 0.0f),
- m_totalForce(0.0f, 0.0f, 0.0f),
- m_totalTorque(0.0f, 0.0f, 0.0f),
- m_linearVelocity(0.0f, 0.0f, 0.0f),
- m_angularVelocity(0.f,0.f,0.f),
- m_angularFactor(1.f),
- m_linearDamping(0.f),
- m_angularDamping(0.5f),
+ m_linearVelocity(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
+ m_angularVelocity(btScalar(0.),btScalar(0.),btScalar(0.)),
+ m_angularFactor(btScalar(1.)),
+ m_gravity(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
+ m_totalForce(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
+ m_totalTorque(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
+ m_linearDamping(btScalar(0.)),
+ m_angularDamping(btScalar(0.5)),
m_optionalMotionState(motionState),
m_contactSolverType(0),
m_frictionSolverType(0)
@@ -72,15 +73,15 @@ btRigidBody::btRigidBody(float mass, btMotionState* motionState, btCollisionShap
}
#ifdef OBSOLETE_MOTIONSTATE_LESS
-btRigidBody::btRigidBody( float mass,const btTransform& worldTransform,btCollisionShape* collisionShape,const btVector3& localInertia,btScalar linearDamping,btScalar angularDamping,btScalar friction,btScalar restitution)
+btRigidBody::btRigidBody( btScalar mass,const btTransform& worldTransform,btCollisionShape* collisionShape,const btVector3& localInertia,btScalar linearDamping,btScalar angularDamping,btScalar friction,btScalar restitution)
:
- m_gravity(0.0f, 0.0f, 0.0f),
- m_totalForce(0.0f, 0.0f, 0.0f),
- m_totalTorque(0.0f, 0.0f, 0.0f),
- m_linearVelocity(0.0f, 0.0f, 0.0f),
- m_angularVelocity(0.f,0.f,0.f),
- m_linearDamping(0.f),
- m_angularDamping(0.5f),
+ m_gravity(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
+ m_totalForce(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
+ m_totalTorque(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
+ m_linearVelocity(btScalar(0.0), btScalar(0.0), btScalar(0.0)),
+ m_angularVelocity(btScalar(0.),btScalar(0.),btScalar(0.)),
+ m_linearDamping(btScalar(0.)),
+ m_angularDamping(btScalar(0.5)),
m_optionalMotionState(0),
m_contactSolverType(0),
m_frictionSolverType(0)
@@ -110,16 +111,18 @@ btRigidBody::btRigidBody( float mass,const btTransform& worldTransform,btCollisi
#endif //OBSOLETE_MOTIONSTATE_LESS
+
+
//#define EXPERIMENTAL_JITTER_REMOVAL 1
#ifdef EXPERIMENTAL_JITTER_REMOVAL
//Bullet 2.20b has experimental damping code to reduce jitter just before objects fall asleep/deactivate
//doesn't work very well yet (value 0 disabled this damping)
//note there this influences deactivation thresholds!
-float gClippedAngvelThresholdSqr = 0.01f;
-float gClippedLinearThresholdSqr = 0.01f;
+btScalar gClippedAngvelThresholdSqr = btScalar(0.01);
+btScalar gClippedLinearThresholdSqr = btScalar(0.01);
#endif //EXPERIMENTAL_JITTER_REMOVAL
-float gJitterVelocityDampingFactor = 1.f;
+btScalar gJitterVelocityDampingFactor = btScalar(0.7);
void btRigidBody::predictIntegratedTransform(btScalar timeStep,btTransform& predictedTransform)
{
@@ -144,7 +147,7 @@ void btRigidBody::predictIntegratedTransform(btScalar timeStep,btTransform& pred
void btRigidBody::saveKinematicState(btScalar timeStep)
{
//todo: clamp to some (user definable) safe minimum timestep, to limit maximum angular/linear velocities
- if (timeStep != 0.f)
+ if (timeStep != btScalar(0.))
{
//if we use motionstate to synchronize world transforms, get the new kinematic/animated world transform
if (getMotionState())
@@ -169,9 +172,9 @@ void btRigidBody::getAabb(btVector3& aabbMin,btVector3& aabbMax) const
void btRigidBody::setGravity(const btVector3& acceleration)
{
- if (m_inverseMass != 0.0f)
+ if (m_inverseMass != btScalar(0.0))
{
- m_gravity = acceleration * (1.0f / m_inverseMass);
+ m_gravity = acceleration * (btScalar(1.0) / m_inverseMass);
}
}
@@ -182,8 +185,8 @@ void btRigidBody::setGravity(const btVector3& acceleration)
void btRigidBody::setDamping(btScalar lin_damping, btScalar ang_damping)
{
- m_linearDamping = GEN_clamped(lin_damping, 0.0f, 1.0f);
- m_angularDamping = GEN_clamped(ang_damping, 0.0f, 1.0f);
+ 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));
}
@@ -198,36 +201,36 @@ void btRigidBody::applyForces(btScalar step)
applyCentralForce(m_gravity);
- m_linearVelocity *= GEN_clamped((1.f - step * gLinearAirDamping * m_linearDamping), 0.0f, 1.0f);
- m_angularVelocity *= GEN_clamped((1.f - step * m_angularDamping), 0.0f, 1.0f);
+ m_linearVelocity *= GEN_clamped((btScalar(1.) - step * gLinearAirDamping * m_linearDamping), (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
+ m_angularVelocity *= GEN_clamped((btScalar(1.) - step * m_angularDamping), (btScalar)btScalar(0.0), (btScalar)btScalar(1.0));
#define FORCE_VELOCITY_DAMPING 1
#ifdef FORCE_VELOCITY_DAMPING
- float speed = m_linearVelocity.length();
+ btScalar speed = m_linearVelocity.length();
if (speed < m_linearDamping)
{
- float dampVel = 0.005f;
+ btScalar dampVel = btScalar(0.005);
if (speed > dampVel)
{
btVector3 dir = m_linearVelocity.normalized();
m_linearVelocity -= dir * dampVel;
} else
{
- m_linearVelocity.setValue(0.f,0.f,0.f);
+ m_linearVelocity.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
}
}
- float angSpeed = m_angularVelocity.length();
+ btScalar angSpeed = m_angularVelocity.length();
if (angSpeed < m_angularDamping)
{
- float angDampVel = 0.005f;
+ btScalar angDampVel = btScalar(0.005);
if (angSpeed > angDampVel)
{
btVector3 dir = m_angularVelocity.normalized();
m_angularVelocity -= dir * angDampVel;
} else
{
- m_angularVelocity.setValue(0.f,0.f,0.f);
+ m_angularVelocity.setValue(btScalar(0.),btScalar(0.),btScalar(0.));
}
}
#endif //FORCE_VELOCITY_DAMPING
@@ -242,19 +245,19 @@ void btRigidBody::proceedToTransform(const btTransform& newTrans)
void btRigidBody::setMassProps(btScalar mass, const btVector3& inertia)
{
- if (mass == 0.f)
+ if (mass == btScalar(0.))
{
m_collisionFlags |= btCollisionObject::CF_STATIC_OBJECT;
- m_inverseMass = 0.f;
+ m_inverseMass = btScalar(0.);
} else
{
m_collisionFlags &= (~btCollisionObject::CF_STATIC_OBJECT);
- m_inverseMass = 1.0f / mass;
+ m_inverseMass = btScalar(1.0) / mass;
}
- m_invInertiaLocal.setValue(inertia[0] != 0.0f ? 1.0f / inertia[0]: 0.0f,
- inertia[1] != 0.0f ? 1.0f / inertia[1]: 0.0f,
- inertia[2] != 0.0f ? 1.0f / inertia[2]: 0.0f);
+ 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));
}
@@ -276,7 +279,7 @@ void btRigidBody::integrateVelocities(btScalar step)
#define MAX_ANGVEL SIMD_HALF_PI
/// clamp angular velocity. collision calculations will fail on higher angular velocities
- float angvel = m_angularVelocity.length();
+ btScalar angvel = m_angularVelocity.length();
if (angvel*step > MAX_ANGVEL)
{
m_angularVelocity *= (MAX_ANGVEL/step) /angvel;
@@ -295,7 +298,14 @@ btQuaternion btRigidBody::getOrientation() const
void btRigidBody::setCenterOfMassTransform(const btTransform& xform)
{
- m_interpolationWorldTransform = m_worldTransform;
+
+ if (isStaticOrKinematicObject())
+ {
+ m_interpolationWorldTransform = m_worldTransform;
+ } else
+ {
+ m_interpolationWorldTransform = xform;
+ }
m_interpolationLinearVelocity = getLinearVelocity();
m_interpolationAngularVelocity = getAngularVelocity();
m_worldTransform = xform;
@@ -303,4 +313,33 @@ void btRigidBody::setCenterOfMassTransform(const btTransform& xform)
}
+bool btRigidBody::checkCollideWithOverride(btCollisionObject* co)
+{
+ btRigidBody* otherRb = btRigidBody::upcast(co);
+ if (!otherRb)
+ return true;
+ for (int i = 0; i < m_constraintRefs.size(); ++i)
+ {
+ btTypedConstraint* c = m_constraintRefs[i];
+ if (&c->getRigidBodyA() == otherRb || &c->getRigidBodyB() == otherRb)
+ return false;
+ }
+
+ return true;
+}
+
+void btRigidBody::addConstraintRef(btTypedConstraint* c)
+{
+ int index = m_constraintRefs.findLinearSearch(c);
+ if (index == m_constraintRefs.size())
+ m_constraintRefs.push_back(c);
+
+ m_checkCollideWith = true;
+}
+
+void btRigidBody::removeConstraintRef(btTypedConstraint* c)
+{
+ m_constraintRefs.remove(c);
+ m_checkCollideWith = m_constraintRefs.size() > 0;
+} \ No newline at end of file
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h
index 43869363cdf..0707595d48e 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btRigidBody.h
@@ -16,26 +16,23 @@ subject to the following restrictions:
#ifndef RIGIDBODY_H
#define RIGIDBODY_H
-#include <vector>
-#include <LinearMath/btPoint3.h>
-#include <LinearMath/btTransform.h>
-#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
-
-
-#include "BulletCollision/CollisionDispatch/btCollisionObject.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
+#include "../../LinearMath/btPoint3.h"
+#include "../../LinearMath/btTransform.h"
+#include "../../BulletCollision/BroadphaseCollision/btBroadphaseProxy.h"
+#include "../../BulletCollision/CollisionDispatch/btCollisionObject.h"
class btCollisionShape;
class btMotionState;
+class btTypedConstraint;
+extern btScalar gLinearAirDamping;
-extern float gLinearAirDamping;
-extern bool gUseEpa;
-
-extern float gDeactivationTime;
+extern btScalar gDeactivationTime;
extern bool gDisableDeactivation;
-extern float gLinearSleepingThreshold;
-extern float gAngularSleepingThreshold;
+extern btScalar gLinearSleepingThreshold;
+extern btScalar gAngularSleepingThreshold;
/// btRigidBody class for btRigidBody Dynamics
@@ -61,14 +58,17 @@ class btRigidBody : public btCollisionObject
//m_optionalMotionState allows to automatic synchronize the world transform for active objects
btMotionState* m_optionalMotionState;
+ //keep track of typed constraints referencing this rigid body
+ btAlignedObjectArray<btTypedConstraint*> m_constraintRefs;
+
public:
#ifdef OBSOLETE_MOTIONSTATE_LESS
//not supported, please use btMotionState
- btRigidBody(float mass, const btTransform& worldTransform, btCollisionShape* collisionShape, const btVector3& localInertia=btVector3(0,0,0),btScalar linearDamping=0.f,btScalar angularDamping=0.f,btScalar friction=0.5f,btScalar restitution=0.f);
+ btRigidBody(btScalar mass, const btTransform& worldTransform, btCollisionShape* collisionShape, const btVector3& localInertia=btVector3(0,0,0),btScalar linearDamping=btScalar(0.),btScalar angularDamping=btScalar(0.),btScalar friction=btScalar(0.5),btScalar restitution=btScalar(0.));
#endif //OBSOLETE_MOTIONSTATE_LESS
- btRigidBody(float mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia=btVector3(0,0,0),btScalar linearDamping=0.f,btScalar angularDamping=0.f,btScalar friction=0.5f,btScalar restitution=0.f);
+ btRigidBody(btScalar mass, btMotionState* motionState, btCollisionShape* collisionShape, const btVector3& localInertia=btVector3(0,0,0),btScalar linearDamping=btScalar(0.),btScalar angularDamping=btScalar(0.),btScalar friction=btScalar(0.5),btScalar restitution=btScalar(0.));
void proceedToTransform(const btTransform& newTrans);
@@ -157,7 +157,7 @@ public:
void applyImpulse(const btVector3& impulse, const btVector3& rel_pos)
{
- if (m_inverseMass != 0.f)
+ if (m_inverseMass != btScalar(0.))
{
applyCentralImpulse(impulse);
if (m_angularFactor)
@@ -168,9 +168,9 @@ public:
}
//Optimization for the iterative solver: avoid calculating constant terms involving inertia, normal, relative position
- inline void internalApplyImpulse(const btVector3& linearComponent, const btVector3& angularComponent,float impulseMagnitude)
+ inline void internalApplyImpulse(const btVector3& linearComponent, const btVector3& angularComponent,btScalar impulseMagnitude)
{
- if (m_inverseMass != 0.f)
+ if (m_inverseMass != btScalar(0.))
{
m_linearVelocity += linearComponent*impulseMagnitude;
if (m_angularFactor)
@@ -182,8 +182,8 @@ public:
void clearForces()
{
- m_totalForce.setValue(0.0f, 0.0f, 0.0f);
- m_totalTorque.setValue(0.0f, 0.0f, 0.0f);
+ m_totalForce.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
+ m_totalTorque.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0));
}
void updateInertiaTensor();
@@ -238,7 +238,7 @@ public:
- inline float computeImpulseDenominator(const btPoint3& pos, const btVector3& normal) const
+ inline btScalar computeImpulseDenominator(const btPoint3& pos, const btVector3& normal) const
{
btVector3 r0 = pos - getCenterOfMassPosition();
@@ -250,13 +250,13 @@ public:
}
- inline float computeAngularImpulseDenominator(const btVector3& axis) const
+ inline btScalar computeAngularImpulseDenominator(const btVector3& axis) const
{
btVector3 vec = axis * getInvInertiaTensorWorld();
return axis.dot(vec);
}
- inline void updateDeactivation(float timeStep)
+ inline void updateDeactivation(btScalar timeStep)
{
if ( (getActivationState() == ISLAND_SLEEPING) || (getActivationState() == DISABLE_DEACTIVATION))
return;
@@ -267,7 +267,7 @@ public:
m_deactivationTime += timeStep;
} else
{
- m_deactivationTime=0.f;
+ m_deactivationTime=btScalar(0.);
setActivationState(0);
}
@@ -280,7 +280,7 @@ public:
return false;
//disable deactivation
- if (gDisableDeactivation || (gDeactivationTime == 0.f))
+ if (gDisableDeactivation || (gDeactivationTime == btScalar(0.)))
return false;
if ( (getActivationState() == ISLAND_SLEEPING) || (getActivationState() == WANTS_DEACTIVATION))
@@ -328,11 +328,11 @@ public:
int m_contactSolverType;
int m_frictionSolverType;
- void setAngularFactor(float angFac)
+ void setAngularFactor(btScalar angFac)
{
m_angularFactor = angFac;
}
- float getAngularFactor() const
+ btScalar getAngularFactor() const
{
return m_angularFactor;
}
@@ -343,6 +343,11 @@ public:
return (getBroadphaseProxy() != 0);
}
+ virtual bool checkCollideWithOverride(btCollisionObject* co);
+
+ void addConstraintRef(btTypedConstraint* c);
+ void removeConstraintRef(btTypedConstraint* c);
+
int m_debugBodyId;
};
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp b/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
index fe0124c041a..4ebcb8e7517 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp
@@ -22,6 +22,14 @@ subject to the following restrictions:
#include "BulletDynamics/ConstraintSolver/btContactSolverInfo.h"
+/*
+ Make sure this dummy function never changes so that it
+ can be used by probes that are checking whether the
+ library is actually installed.
+*/
+extern "C" void btBulletDynamicsProbe () {}
+
+
btSimpleDynamicsWorld::btSimpleDynamicsWorld(btDispatcher* dispatcher,btOverlappingPairCache* pairCache,btConstraintSolver* constraintSolver)
@@ -41,8 +49,12 @@ btSimpleDynamicsWorld::~btSimpleDynamicsWorld()
delete m_constraintSolver;
}
-int btSimpleDynamicsWorld::stepSimulation( float timeStep,int maxSubSteps, float fixedTimeStep)
+int btSimpleDynamicsWorld::stepSimulation( btScalar timeStep,int maxSubSteps, btScalar fixedTimeStep)
{
+ (void)fixedTimeStep;
+ (void)maxSubSteps;
+
+
///apply gravity, predict motion
predictUnconstraintMotion(timeStep);
@@ -63,7 +75,7 @@ int btSimpleDynamicsWorld::stepSimulation( float timeStep,int maxSubSteps, floa
btContactSolverInfo infoGlobal;
infoGlobal.m_timeStep = timeStep;
- m_constraintSolver->solveGroup(manifoldPtr, numManifolds,0,0,infoGlobal,m_debugDrawer);
+ m_constraintSolver->solveGroup(0,0,manifoldPtr, numManifolds,0,0,infoGlobal,m_debugDrawer, m_stackAlloc);
}
///integrate transforms
@@ -81,7 +93,7 @@ int btSimpleDynamicsWorld::stepSimulation( float timeStep,int maxSubSteps, floa
void btSimpleDynamicsWorld::setGravity(const btVector3& gravity)
{
m_gravity = gravity;
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -110,7 +122,7 @@ void btSimpleDynamicsWorld::addRigidBody(btRigidBody* body)
void btSimpleDynamicsWorld::updateAabbs()
{
btTransform predictedTrans;
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -127,10 +139,10 @@ void btSimpleDynamicsWorld::updateAabbs()
}
}
-void btSimpleDynamicsWorld::integrateTransforms(float timeStep)
+void btSimpleDynamicsWorld::integrateTransforms(btScalar timeStep)
{
btTransform predictedTrans;
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -147,9 +159,9 @@ void btSimpleDynamicsWorld::integrateTransforms(float timeStep)
-void btSimpleDynamicsWorld::predictUnconstraintMotion(float timeStep)
+void btSimpleDynamicsWorld::predictUnconstraintMotion(btScalar timeStep)
{
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
@@ -172,7 +184,7 @@ void btSimpleDynamicsWorld::predictUnconstraintMotion(float timeStep)
void btSimpleDynamicsWorld::synchronizeMotionStates()
{
//todo: iterate over awake simulation islands!
- for (unsigned int i=0;i<m_collisionObjects.size();i++)
+ for ( int i=0;i<m_collisionObjects.size();i++)
{
btCollisionObject* colObj = m_collisionObjects[i];
btRigidBody* body = btRigidBody::upcast(colObj);
diff --git a/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h b/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
index cdc0c5559f6..25f4ccd8e68 100644
--- a/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
+++ b/extern/bullet2/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h
@@ -37,9 +37,9 @@ protected:
btIDebugDraw* m_debugDrawer;
- void predictUnconstraintMotion(float timeStep);
+ void predictUnconstraintMotion(btScalar timeStep);
- void integrateTransforms(float timeStep);
+ void integrateTransforms(btScalar timeStep);
btVector3 m_gravity;
@@ -53,7 +53,7 @@ public:
virtual ~btSimpleDynamicsWorld();
///maxSubSteps/fixedTimeStep for interpolation is currently ignored for btSimpleDynamicsWorld, use btDiscreteDynamicsWorld instead
- virtual int stepSimulation( float timeStep,int maxSubSteps=1, float fixedTimeStep=1.f/60.f);
+ virtual int stepSimulation( btScalar timeStep,int maxSubSteps=1, btScalar fixedTimeStep=btScalar(1.)/btScalar(60.));
virtual void setDebugDrawer(btIDebugDraw* debugDrawer)
{
diff --git a/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp b/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp
index c85fead5334..d53de7f3687 100644
--- a/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp
+++ b/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp
@@ -18,6 +18,7 @@
#include "BulletDynamics/Dynamics/btDynamicsWorld.h"
#include "btVehicleRaycaster.h"
#include "btWheelInfo.h"
+#include "LinearMath/btMinMax.h"
#include "BulletDynamics/ConstraintSolver/btContactConstraint.h"
@@ -28,7 +29,7 @@ static btRigidBody s_fixedObject( 0,0,0);
btRaycastVehicle::btRaycastVehicle(const btVehicleTuning& tuning,btRigidBody* chassis, btVehicleRaycaster* raycaster )
:m_vehicleRaycaster(raycaster),
-m_pitchControl(0.f)
+m_pitchControl(btScalar(0.))
{
m_chassisBody = chassis;
m_indexRightAxis = 0;
@@ -40,8 +41,9 @@ m_pitchControl(0.f)
void btRaycastVehicle::defaultInit(const btVehicleTuning& tuning)
{
- m_currentVehicleSpeedKmHour = 0.f;
- m_steeringValue = 0.f;
+ (void)tuning;
+ m_currentVehicleSpeedKmHour = btScalar(0.);
+ m_steeringValue = btScalar(0.);
}
@@ -105,12 +107,12 @@ void btRaycastVehicle::updateWheelTransform( int wheelIndex , bool interpolatedT
// up.normalize();
//rotate around steering over de wheelAxleWS
- float steering = wheel.m_steering;
+ btScalar steering = wheel.m_steering;
btQuaternion steeringOrn(up,steering);//wheel.m_steering);
btMatrix3x3 steeringMat(steeringOrn);
- btQuaternion rotatingOrn(right,wheel.m_rotation);
+ btQuaternion rotatingOrn(right,-wheel.m_rotation);
btMatrix3x3 rotatingMat(rotatingOrn);
btMatrix3x3 basis2(
@@ -133,11 +135,11 @@ void btRaycastVehicle::resetSuspension()
{
btWheelInfo& wheel = m_wheelInfo[i];
wheel.m_raycastInfo.m_suspensionLength = wheel.getSuspensionRestLength();
- wheel.m_suspensionRelativeVelocity = 0.0f;
+ wheel.m_suspensionRelativeVelocity = btScalar(0.0);
wheel.m_raycastInfo.m_contactNormalWS = - wheel.m_raycastInfo.m_wheelDirectionWS;
- //wheel_info.setContactFriction(0.0f);
- wheel.m_clippedInvContactDotSuspension = 1.0f;
+ //wheel_info.setContactFriction(btScalar(0.0));
+ wheel.m_clippedInvContactDotSuspension = btScalar(1.0);
}
}
@@ -170,7 +172,7 @@ btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
wheel.m_raycastInfo.m_contactPointWS = source + rayvector;
const btVector3& target = wheel.m_raycastInfo.m_contactPointWS;
- btScalar param = 0.f;
+ btScalar param = btScalar(0.);
btVehicleRaycaster::btVehicleRaycasterResult rayResults;
@@ -195,8 +197,8 @@ btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
wheel.m_raycastInfo.m_suspensionLength = hitDistance - wheel.m_wheelsRadius;
//clamp on max suspension travel
- float minSuspensionLength = wheel.getSuspensionRestLength() - wheel.m_maxSuspensionTravelCm*0.01f;
- float maxSuspensionLength = wheel.getSuspensionRestLength()+ wheel.m_maxSuspensionTravelCm*0.01f;
+ btScalar minSuspensionLength = wheel.getSuspensionRestLength() - wheel.m_maxSuspensionTravelCm*btScalar(0.01);
+ btScalar maxSuspensionLength = wheel.getSuspensionRestLength()+ wheel.m_maxSuspensionTravelCm*btScalar(0.01);
if (wheel.m_raycastInfo.m_suspensionLength < minSuspensionLength)
{
wheel.m_raycastInfo.m_suspensionLength = minSuspensionLength;
@@ -217,14 +219,14 @@ btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
btScalar projVel = wheel.m_raycastInfo.m_contactNormalWS.dot( chassis_velocity_at_contactPoint );
- if ( denominator >= -0.1f)
+ if ( denominator >= btScalar(-0.1))
{
- wheel.m_suspensionRelativeVelocity = 0.0f;
- wheel.m_clippedInvContactDotSuspension = 1.0f / 0.1f;
+ wheel.m_suspensionRelativeVelocity = btScalar(0.0);
+ wheel.m_clippedInvContactDotSuspension = btScalar(1.0) / btScalar(0.1);
}
else
{
- btScalar inv = -1.f / denominator;
+ btScalar inv = btScalar(-1.) / denominator;
wheel.m_suspensionRelativeVelocity = projVel * inv;
wheel.m_clippedInvContactDotSuspension = inv;
}
@@ -233,9 +235,9 @@ btScalar btRaycastVehicle::rayCast(btWheelInfo& wheel)
{
//put wheel info as in rest position
wheel.m_raycastInfo.m_suspensionLength = wheel.getSuspensionRestLength();
- wheel.m_suspensionRelativeVelocity = 0.0f;
+ wheel.m_suspensionRelativeVelocity = btScalar(0.0);
wheel.m_raycastInfo.m_contactNormalWS = - wheel.m_raycastInfo.m_wheelDirectionWS;
- wheel.m_clippedInvContactDotSuspension = 1.0f;
+ wheel.m_clippedInvContactDotSuspension = btScalar(1.0);
}
return depth;
@@ -267,7 +269,7 @@ void btRaycastVehicle::updateVehicle( btScalar step )
}
- m_currentVehicleSpeedKmHour = 3.6f * getRigidBody()->getLinearVelocity().length();
+ m_currentVehicleSpeedKmHour = btScalar(3.6) * getRigidBody()->getLinearVelocity().length();
const btTransform& chassisTrans = getChassisWorldTransform();
@@ -276,9 +278,9 @@ void btRaycastVehicle::updateVehicle( btScalar step )
chassisTrans.getBasis()[1][m_indexForwardAxis],
chassisTrans.getBasis()[2][m_indexForwardAxis]);
- if (forwardW.dot(getRigidBody()->getLinearVelocity()) < 0.f)
+ if (forwardW.dot(getRigidBody()->getLinearVelocity()) < btScalar(0.))
{
- m_currentVehicleSpeedKmHour *= -1.f;
+ m_currentVehicleSpeedKmHour *= btScalar(-1.);
}
//
@@ -300,9 +302,9 @@ void btRaycastVehicle::updateVehicle( btScalar step )
//apply suspension force
btWheelInfo& wheel = m_wheelInfo[i];
- float suspensionForce = wheel.m_wheelsSuspensionForce;
+ btScalar suspensionForce = wheel.m_wheelsSuspensionForce;
- float gMaxSuspensionForce = 6000.f;
+ btScalar gMaxSuspensionForce = btScalar(6000.);
if (suspensionForce > gMaxSuspensionForce)
{
suspensionForce = gMaxSuspensionForce;
@@ -347,7 +349,7 @@ void btRaycastVehicle::updateVehicle( btScalar step )
wheel.m_rotation += wheel.m_deltaRotation;
}
- wheel.m_deltaRotation *= 0.99f;//damping of rotation when not in contact
+ wheel.m_deltaRotation *= btScalar(0.99);//damping of rotation when not in contact
}
@@ -394,17 +396,18 @@ btWheelInfo& btRaycastVehicle::getWheelInfo(int index)
return m_wheelInfo[index];
}
-void btRaycastVehicle::setBrake(float brake,int wheelIndex)
+void btRaycastVehicle::setBrake(btScalar brake,int wheelIndex)
{
btAssert((wheelIndex >= 0) && (wheelIndex < getNumWheels()));
- getWheelInfo(wheelIndex).m_brake;
+ getWheelInfo(wheelIndex).m_brake = brake;
}
void btRaycastVehicle::updateSuspension(btScalar deltaTime)
{
+ (void)deltaTime;
- btScalar chassisMass = 1.f / m_chassisBody->getInvMass();
+ btScalar chassisMass = btScalar(1.) / m_chassisBody->getInvMass();
for (int w_it=0; w_it<getNumWheels(); w_it++)
{
@@ -429,7 +432,7 @@ void btRaycastVehicle::updateSuspension(btScalar deltaTime)
btScalar projected_rel_vel = wheel_info.m_suspensionRelativeVelocity;
{
btScalar susp_damping;
- if ( projected_rel_vel < 0.0f )
+ if ( projected_rel_vel < btScalar(0.0) )
{
susp_damping = wheel_info.m_wheelsDampingCompression;
}
@@ -443,20 +446,77 @@ void btRaycastVehicle::updateSuspension(btScalar deltaTime)
// RESULT
wheel_info.m_wheelsSuspensionForce = force * chassisMass;
- if (wheel_info.m_wheelsSuspensionForce < 0.f)
+ if (wheel_info.m_wheelsSuspensionForce < btScalar(0.))
{
- wheel_info.m_wheelsSuspensionForce = 0.f;
+ wheel_info.m_wheelsSuspensionForce = btScalar(0.);
}
}
else
{
- wheel_info.m_wheelsSuspensionForce = 0.0f;
+ wheel_info.m_wheelsSuspensionForce = btScalar(0.0);
}
}
}
-float sideFrictionStiffness2 = 1.0f;
+
+struct btWheelContactPoint
+{
+ btRigidBody* m_body0;
+ btRigidBody* m_body1;
+ btVector3 m_frictionPositionWorld;
+ btVector3 m_frictionDirectionWorld;
+ btScalar m_jacDiagABInv;
+ btScalar m_maxImpulse;
+
+
+ btWheelContactPoint(btRigidBody* body0,btRigidBody* body1,const btVector3& frictionPosWorld,const btVector3& frictionDirectionWorld, btScalar maxImpulse)
+ :m_body0(body0),
+ m_body1(body1),
+ m_frictionPositionWorld(frictionPosWorld),
+ m_frictionDirectionWorld(frictionDirectionWorld),
+ m_maxImpulse(maxImpulse)
+ {
+ btScalar denom0 = body0->computeImpulseDenominator(frictionPosWorld,frictionDirectionWorld);
+ btScalar denom1 = body1->computeImpulseDenominator(frictionPosWorld,frictionDirectionWorld);
+ btScalar relaxation = 1.f;
+ m_jacDiagABInv = relaxation/(denom0+denom1);
+ }
+
+
+
+};
+
+btScalar calcRollingFriction(btWheelContactPoint& contactPoint)
+{
+
+ btScalar j1=0.f;
+
+ const btVector3& contactPosWorld = contactPoint.m_frictionPositionWorld;
+
+ btVector3 rel_pos1 = contactPosWorld - contactPoint.m_body0->getCenterOfMassPosition();
+ btVector3 rel_pos2 = contactPosWorld - contactPoint.m_body1->getCenterOfMassPosition();
+
+ btScalar maxImpulse = contactPoint.m_maxImpulse;
+
+ btVector3 vel1 = contactPoint.m_body0->getVelocityInLocalPoint(rel_pos1);
+ btVector3 vel2 = contactPoint.m_body1->getVelocityInLocalPoint(rel_pos2);
+ btVector3 vel = vel1 - vel2;
+
+ btScalar vrel = contactPoint.m_frictionDirectionWorld.dot(vel);
+
+ // calculate j that moves us to zero relative velocity
+ j1 = -vrel * contactPoint.m_jacDiagABInv;
+ GEN_set_min(j1, maxImpulse);
+ GEN_set_max(j1, -maxImpulse);
+
+ return j1;
+}
+
+
+
+
+btScalar sideFrictionStiffness2 = btScalar(1.0);
void btRaycastVehicle::updateFriction(btScalar timeStep)
{
@@ -481,8 +541,8 @@ void btRaycastVehicle::updateFriction(btScalar timeStep)
class btRigidBody* groundObject = (class btRigidBody*) wheelInfo.m_raycastInfo.m_groundObject;
if (groundObject)
numWheelsOnGround++;
- sideImpulse[i] = 0.f;
- forwardImpulse[i] = 0.f;
+ sideImpulse[i] = btScalar(0.);
+ forwardImpulse[i] = btScalar(0.);
}
@@ -517,7 +577,7 @@ void btRaycastVehicle::updateFriction(btScalar timeStep)
resolveSingleBilateral(*m_chassisBody, wheelInfo.m_raycastInfo.m_contactPointWS,
*groundObject, wheelInfo.m_raycastInfo.m_contactPointWS,
- 0.f, axle[i],sideImpulse[i],timeStep);
+ btScalar(0.), axle[i],sideImpulse[i],timeStep);
sideImpulse[i] *= sideFrictionStiffness2;
@@ -527,7 +587,7 @@ void btRaycastVehicle::updateFriction(btScalar timeStep)
}
}
- btScalar sideFactor = 1.f;
+ btScalar sideFactor = btScalar(1.);
btScalar fwdFactor = 0.5;
bool sliding = false;
@@ -537,25 +597,46 @@ void btRaycastVehicle::updateFriction(btScalar timeStep)
btWheelInfo& wheelInfo = m_wheelInfo[wheel];
class btRigidBody* groundObject = (class btRigidBody*) wheelInfo.m_raycastInfo.m_groundObject;
+ btScalar rollingFriction = 0.f;
- forwardImpulse[wheel] = 0.f;
- m_wheelInfo[wheel].m_skidInfo= 1.f;
+ if (groundObject)
+ {
+ if (wheelInfo.m_engineForce != 0.f)
+ {
+ rollingFriction = wheelInfo.m_engineForce* timeStep;
+ } else
+ {
+ btScalar defaultRollingFrictionImpulse = 0.f;
+ btScalar maxImpulse = wheelInfo.m_brake ? wheelInfo.m_brake : defaultRollingFrictionImpulse;
+ btWheelContactPoint contactPt(m_chassisBody,groundObject,wheelInfo.m_raycastInfo.m_contactPointWS,forwardWS[wheel],maxImpulse);
+ rollingFriction = calcRollingFriction(contactPt);
+ }
+ }
+
+ //switch between active rolling (throttle), braking and non-active rolling friction (no throttle/break)
+
+
+
+
+ forwardImpulse[wheel] = btScalar(0.);
+ m_wheelInfo[wheel].m_skidInfo= btScalar(1.);
if (groundObject)
{
- m_wheelInfo[wheel].m_skidInfo= 1.f;
+ m_wheelInfo[wheel].m_skidInfo= btScalar(1.);
btScalar maximp = wheelInfo.m_wheelsSuspensionForce * timeStep * wheelInfo.m_frictionSlip;
btScalar maximpSide = maximp;
btScalar maximpSquared = maximp * maximpSide;
+
- forwardImpulse[wheel] = wheelInfo.m_engineForce* timeStep;
+ forwardImpulse[wheel] = rollingFriction;//wheelInfo.m_engineForce* timeStep;
- float x = (forwardImpulse[wheel] ) * fwdFactor;
- float y = (sideImpulse[wheel] ) * sideFactor;
+ btScalar x = (forwardImpulse[wheel] ) * fwdFactor;
+ btScalar y = (sideImpulse[wheel] ) * sideFactor;
- float impulseSquared = (x*x + y*y);
+ btScalar impulseSquared = (x*x + y*y);
if (impulseSquared > maximpSquared)
{
@@ -577,9 +658,9 @@ void btRaycastVehicle::updateFriction(btScalar timeStep)
{
for (int wheel = 0;wheel < getNumWheels(); wheel++)
{
- if (sideImpulse[wheel] != 0.f)
+ if (sideImpulse[wheel] != btScalar(0.))
{
- if (m_wheelInfo[wheel].m_skidInfo< 1.f)
+ if (m_wheelInfo[wheel].m_skidInfo< btScalar(1.))
{
forwardImpulse[wheel] *= m_wheelInfo[wheel].m_skidInfo;
sideImpulse[wheel] *= m_wheelInfo[wheel].m_skidInfo;
@@ -597,11 +678,11 @@ void btRaycastVehicle::updateFriction(btScalar timeStep)
btVector3 rel_pos = wheelInfo.m_raycastInfo.m_contactPointWS -
m_chassisBody->getCenterOfMassPosition();
- if (forwardImpulse[wheel] != 0.f)
+ if (forwardImpulse[wheel] != btScalar(0.))
{
m_chassisBody->applyImpulse(forwardWS[wheel]*(forwardImpulse[wheel]),rel_pos);
}
- if (sideImpulse[wheel] != 0.f)
+ if (sideImpulse[wheel] != btScalar(0.))
{
class btRigidBody* groundObject = (class btRigidBody*) m_wheelInfo[wheel].m_raycastInfo.m_groundObject;
diff --git a/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h b/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h
index fa961e468d7..f4249599615 100644
--- a/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h
+++ b/extern/bullet2/src/BulletDynamics/Vehicle/btRaycastVehicle.h
@@ -11,11 +11,11 @@
#ifndef RAYCASTVEHICLE_H
#define RAYCASTVEHICLE_H
-#include "BulletDynamics/Dynamics/btRigidBody.h"
-#include "BulletDynamics/ConstraintSolver/btTypedConstraint.h"
+#include "../Dynamics/btRigidBody.h"
+#include "../ConstraintSolver/btTypedConstraint.h"
#include "btVehicleRaycaster.h"
class btDynamicsWorld;
-#include "LinearMath/btAlignedObjectArray.h"
+#include "../../LinearMath/btAlignedObjectArray.h"
#include "btWheelInfo.h"
class btVehicleTuning;
@@ -29,18 +29,18 @@ public:
public:
btVehicleTuning()
- :m_suspensionStiffness(5.88f),
- m_suspensionCompression(0.83f),
- m_suspensionDamping(0.88f),
- m_maxSuspensionTravelCm(500.f),
- m_frictionSlip(10.5f)
+ :m_suspensionStiffness(btScalar(5.88)),
+ m_suspensionCompression(btScalar(0.83)),
+ m_suspensionDamping(btScalar(0.88)),
+ m_maxSuspensionTravelCm(btScalar(500.)),
+ m_frictionSlip(btScalar(10.5))
{
}
- float m_suspensionStiffness;
- float m_suspensionCompression;
- float m_suspensionDamping;
- float m_maxSuspensionTravelCm;
- float m_frictionSlip;
+ btScalar m_suspensionStiffness;
+ btScalar m_suspensionCompression;
+ btScalar m_suspensionDamping;
+ btScalar m_maxSuspensionTravelCm;
+ btScalar m_frictionSlip;
};
private:
@@ -48,9 +48,9 @@ private:
btScalar m_tau;
btScalar m_damping;
btVehicleRaycaster* m_vehicleRaycaster;
- float m_pitchControl;
- float m_steeringValue;
- float m_currentVehicleSpeedKmHour;
+ btScalar m_pitchControl;
+ btScalar m_steeringValue;
+ btScalar m_currentVehicleSpeedKmHour;
btRigidBody* m_chassisBody;
@@ -105,9 +105,9 @@ public:
void updateWheelTransformsWS(btWheelInfo& wheel , bool interpolatedTransform = true);
- void setBrake(float brake,int wheelIndex);
+ void setBrake(btScalar brake,int wheelIndex);
- void setPitchControl(float pitch)
+ void setPitchControl(btScalar pitch)
{
m_pitchControl = pitch;
}
@@ -142,6 +142,26 @@ public:
return m_indexForwardAxis;
}
+
+ ///Worldspace forward vector
+ btVector3 getForwardVector() const
+ {
+ const btTransform& chassisTrans = getChassisWorldTransform();
+
+ btVector3 forwardW (
+ chassisTrans.getBasis()[0][m_indexForwardAxis],
+ chassisTrans.getBasis()[1][m_indexForwardAxis],
+ chassisTrans.getBasis()[2][m_indexForwardAxis]);
+
+ return forwardW;
+ }
+
+ ///Velocity of vehicle (positive if velocity vector has same direction as foward vector)
+ btScalar getCurrentSpeedKmHour() const
+ {
+ return m_currentVehicleSpeedKmHour;
+ }
+
virtual void setCoordinateSystem(int rightIndex,int upIndex,int forwardIndex)
{
m_indexRightAxis = rightIndex;
@@ -156,6 +176,7 @@ public:
virtual void solveConstraint(btScalar timeStep)
{
+ (void)timeStep;
//not yet
}
diff --git a/extern/bullet2/src/BulletDynamics/Vehicle/btVehicleRaycaster.h b/extern/bullet2/src/BulletDynamics/Vehicle/btVehicleRaycaster.h
index 5be3693fe73..64a47fcaada 100644
--- a/extern/bullet2/src/BulletDynamics/Vehicle/btVehicleRaycaster.h
+++ b/extern/bullet2/src/BulletDynamics/Vehicle/btVehicleRaycaster.h
@@ -11,7 +11,7 @@
#ifndef VEHICLE_RAYCASTER_H
#define VEHICLE_RAYCASTER_H
-#include "LinearMath/btVector3.h"
+#include "../../LinearMath/btVector3.h"
/// btVehicleRaycaster is provides interface for between vehicle simulation and raycasting
struct btVehicleRaycaster
@@ -21,7 +21,7 @@ virtual ~btVehicleRaycaster()
}
struct btVehicleRaycasterResult
{
- btVehicleRaycasterResult() :m_distFraction(-1.f){};
+ btVehicleRaycasterResult() :m_distFraction(btScalar(-1.)){};
btVector3 m_hitPointInWorld;
btVector3 m_hitNormalInWorld;
btScalar m_distFraction;
diff --git a/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.cpp b/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.cpp
index 43baf56edbc..ef93c16fffc 100644
--- a/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.cpp
+++ b/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.cpp
@@ -21,6 +21,7 @@ btScalar btWheelInfo::getSuspensionRestLength() const
void btWheelInfo::updateWheel(const btRigidBody& chassis,RaycastInfo& raycastInfo)
{
+ (void)raycastInfo;
if (m_raycastInfo.m_isInContact)
@@ -31,14 +32,14 @@ void btWheelInfo::updateWheel(const btRigidBody& chassis,RaycastInfo& raycastInf
btVector3 relpos = m_raycastInfo.m_contactPointWS - chassis.getCenterOfMassPosition();
chassis_velocity_at_contactPoint = chassis.getVelocityInLocalPoint( relpos );
btScalar projVel = m_raycastInfo.m_contactNormalWS.dot( chassis_velocity_at_contactPoint );
- if ( project >= -0.1f)
+ if ( project >= btScalar(-0.1))
{
- m_suspensionRelativeVelocity = 0.0f;
- m_clippedInvContactDotSuspension = 1.0f / 0.1f;
+ m_suspensionRelativeVelocity = btScalar(0.0);
+ m_clippedInvContactDotSuspension = btScalar(1.0) / btScalar(0.1);
}
else
{
- btScalar inv = -1.f / project;
+ btScalar inv = btScalar(-1.) / project;
m_suspensionRelativeVelocity = projVel * inv;
m_clippedInvContactDotSuspension = inv;
}
@@ -48,8 +49,8 @@ void btWheelInfo::updateWheel(const btRigidBody& chassis,RaycastInfo& raycastInf
else // Not in contact : position wheel in a nice (rest length) position
{
m_raycastInfo.m_suspensionLength = this->getSuspensionRestLength();
- m_suspensionRelativeVelocity = 0.0f;
+ m_suspensionRelativeVelocity = btScalar(0.0);
m_raycastInfo.m_contactNormalWS = -m_raycastInfo.m_wheelDirectionWS;
- m_clippedInvContactDotSuspension = 1.0f;
+ m_clippedInvContactDotSuspension = btScalar(1.0);
}
}
diff --git a/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h b/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h
index 83a3b114ab9..2e349b3fde4 100644
--- a/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h
+++ b/extern/bullet2/src/BulletDynamics/Vehicle/btWheelInfo.h
@@ -11,8 +11,8 @@
#ifndef WHEEL_INFO_H
#define WHEEL_INFO_H
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btTransform.h"
+#include "../../LinearMath/btVector3.h"
+#include "../../LinearMath/btTransform.h"
class btRigidBody;
@@ -25,10 +25,10 @@ struct btWheelInfoConstructionInfo
btScalar m_maxSuspensionTravelCm;
btScalar m_wheelRadius;
- float m_suspensionStiffness;
- float m_wheelsDampingCompression;
- float m_wheelsDampingRelaxation;
- float m_frictionSlip;
+ btScalar m_suspensionStiffness;
+ btScalar m_wheelsDampingCompression;
+ btScalar m_wheelsDampingRelaxation;
+ btScalar m_frictionSlip;
bool m_bIsFrontWheel;
};
@@ -92,12 +92,12 @@ struct btWheelInfo
m_wheelDirectionCS = ci.m_wheelDirectionCS;
m_wheelAxleCS = ci.m_wheelAxleCS;
m_frictionSlip = ci.m_frictionSlip;
- m_steering = 0.f;
- m_engineForce = 0.f;
- m_rotation = 0.f;
- m_deltaRotation = 0.f;
- m_brake = 0.f;
- m_rollInfluence = 0.1f;
+ m_steering = btScalar(0.);
+ m_engineForce = btScalar(0.);
+ m_rotation = btScalar(0.);
+ m_deltaRotation = btScalar(0.);
+ m_brake = btScalar(0.);
+ m_rollInfluence = btScalar(0.1);
m_bIsFrontWheel = ci.m_bIsFrontWheel;
}
diff --git a/extern/bullet2/src/LinearMath/btAabbUtil2.h b/extern/bullet2/src/LinearMath/btAabbUtil2.h
index 2eacb8e242b..429163c8138 100644
--- a/extern/bullet2/src/LinearMath/btAabbUtil2.h
+++ b/extern/bullet2/src/LinearMath/btAabbUtil2.h
@@ -17,8 +17,8 @@ subject to the following restrictions:
#ifndef AABB_UTIL2
#define AABB_UTIL2
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btSimdMinMax.h"
+#include "btVector3.h"
+#include "btSimdMinMax.h"
#define btMin(a,b) ((a < b ? a : b))
@@ -73,8 +73,8 @@ SIMD_FORCE_INLINE bool btRayAabb(const btVector3& rayFrom,
const btVector3& aabbMax,
btScalar& param, btVector3& normal)
{
- btVector3 aabbHalfExtent = (aabbMax-aabbMin)* 0.5f;
- btVector3 aabbCenter = (aabbMax+aabbMin)* 0.5f;
+ btVector3 aabbHalfExtent = (aabbMax-aabbMin)* btScalar(0.5);
+ btVector3 aabbCenter = (aabbMax+aabbMin)* btScalar(0.5);
btVector3 source = rayFrom - aabbCenter;
btVector3 target = rayTo - aabbCenter;
int sourceOutcode = btOutcode(source,aabbHalfExtent);
@@ -110,7 +110,7 @@ SIMD_FORCE_INLINE bool btRayAabb(const btVector3& rayFrom,
}
bit<<=1;
}
- normSign = -1.f;
+ normSign = btScalar(-1.);
}
if (lambda_enter <= lambda_exit)
{
diff --git a/extern/bullet2/src/LinearMath/btAlignedAllocator.cpp b/extern/bullet2/src/LinearMath/btAlignedAllocator.cpp
index 19b811b0ce8..1f5877fa37e 100644
--- a/extern/bullet2/src/LinearMath/btAlignedAllocator.cpp
+++ b/extern/bullet2/src/LinearMath/btAlignedAllocator.cpp
@@ -16,7 +16,7 @@ subject to the following restrictions:
#include "btAlignedAllocator.h"
-#if defined (WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
+#if defined (BT_HAS_ALIGNED_ALOCATOR)
#include <malloc.h>
void* btAlignedAlloc (int size, int alignment)
@@ -31,6 +31,26 @@ void btAlignedFree (void* ptr)
#else
+#ifdef __CELLOS_LV2__
+
+#include <stdlib.h>
+
+int numAllocs = 0;
+int numFree = 0;
+
+void* btAlignedAlloc (int size, int alignment)
+{
+ numAllocs++;
+ return memalign(alignment, size);
+}
+
+void btAlignedFree (void* ptr)
+{
+ numFree++;
+ free(ptr);
+}
+
+#else
///todo
///will add some multi-platform version that works without _aligned_malloc/_aligned_free
@@ -41,7 +61,10 @@ void* btAlignedAlloc (int size, int alignment)
void btAlignedFree (void* ptr)
{
- delete ptr;
+ delete [] (char*) ptr;
}
+#endif //
#endif
+
+
diff --git a/extern/bullet2/src/LinearMath/btAlignedAllocator.h b/extern/bullet2/src/LinearMath/btAlignedAllocator.h
index 159399ce7d4..07585717f45 100644
--- a/extern/bullet2/src/LinearMath/btAlignedAllocator.h
+++ b/extern/bullet2/src/LinearMath/btAlignedAllocator.h
@@ -36,11 +36,13 @@ class btAlignedAllocator {
typedef btAlignedAllocator< T , Alignment > self_type;
public:
+
//just going down a list:
btAlignedAllocator() {}
-
+ /*
btAlignedAllocator( const self_type & ) {}
-
+ */
+
template < typename Other >
btAlignedAllocator( const btAlignedAllocator< Other , Alignment > & ) {}
@@ -53,6 +55,7 @@ public:
pointer address ( reference ref ) const { return &ref; }
const_pointer address ( const_reference ref ) const { return &ref; }
pointer allocate ( size_type n , const_pointer * hint = 0 ) {
+ (void)hint;
return reinterpret_cast< pointer >(btAlignedAlloc( sizeof(value_type) * n , Alignment ));
}
void construct ( pointer ptr , const value_type & value ) { new (ptr) value_type( value ); }
diff --git a/extern/bullet2/src/LinearMath/btAlignedObjectArray.h b/extern/bullet2/src/LinearMath/btAlignedObjectArray.h
index 3bfdb36f4c7..8bef5eb5d06 100644
--- a/extern/bullet2/src/LinearMath/btAlignedObjectArray.h
+++ b/extern/bullet2/src/LinearMath/btAlignedObjectArray.h
@@ -20,18 +20,37 @@ subject to the following restrictions:
#include "btScalar.h" // has definitions like SIMD_FORCE_INLINE
#include "btAlignedAllocator.h"
+///If the platform doesn't support placement new, you can disable BT_USE_PLACEMENT_NEW
+///then the btAlignedObjectArray doesn't support objects with virtual methods, and non-trivial constructors/destructors
+///You can enable BT_USE_MEMCPY, then swapping elements in the array will use memcpy instead of operator=
+///see discussion here: http://continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1231 and
+///http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1240
+
+#define BT_USE_PLACEMENT_NEW 1
+//#define BT_USE_MEMCPY 1 //disable, because it is cumbersome to find out for each platform where memcpy is defined. It can be in <memory.h> or <string.h> or otherwise...
+
+#ifdef BT_USE_MEMCPY
+#include <memory.h>
+#include <string.h>
+#endif //BT_USE_MEMCPY
+
+#ifdef BT_USE_PLACEMENT_NEW
+#include <new> //for placement new
+#endif //BT_USE_PLACEMENT_NEW
+
+
///btAlignedObjectArray uses a subset of the stl::vector interface for its methods
///It is developed to replace stl::vector to avoid STL alignment issues to add SIMD/SSE data
template <typename T>
//template <class T>
class btAlignedObjectArray
{
+ btAlignedAllocator<T , 16> m_allocator;
+
int m_size;
int m_capacity;
T* m_data;
- btAlignedAllocator<T , 16> m_allocator;
-
protected:
SIMD_FORCE_INLINE int allocSize(int size)
{
@@ -40,8 +59,12 @@ class btAlignedObjectArray
SIMD_FORCE_INLINE void copy(int start,int end, T* dest)
{
int i;
- for (i=0;i<m_size;++i)
+ for (i=start;i<end;++i)
+#ifdef BT_USE_PLACEMENT_NEW
+ new (&dest[i]) T(m_data[i]);
+#else
dest[i] = m_data[i];
+#endif //BT_USE_PLACEMENT_NEW
}
SIMD_FORCE_INLINE void init()
@@ -53,7 +76,7 @@ class btAlignedObjectArray
SIMD_FORCE_INLINE void destroy(int first,int last)
{
int i;
- for (i=0; i<m_size;i++)
+ for (i=first; i<last;i++)
{
m_data[i].~T();
}
@@ -74,6 +97,8 @@ class btAlignedObjectArray
}
}
+
+
public:
@@ -123,17 +148,50 @@ class btAlignedObjectArray
m_data[m_size].~T();
}
- SIMD_FORCE_INLINE void resize(int newsize)
+ SIMD_FORCE_INLINE void resize(int newsize, const T& fillData=T())
{
- if (newsize > size())
+ int curSize = size();
+
+ if (newsize < size())
+ {
+ for(int i = curSize; i < newsize; i++)
+ {
+ m_data[i].~T();
+ }
+ } else
{
- reserve(newsize);
+ if (newsize > size())
+ {
+ reserve(newsize);
+ }
+#ifdef BT_USE_PLACEMENT_NEW
+ for (int i=curSize;i<newsize;i++)
+ {
+ new ( &m_data[i]) T(fillData);
+ }
+#endif //BT_USE_PLACEMENT_NEW
+
}
m_size = newsize;
}
+ SIMD_FORCE_INLINE T& expand( const T& fillValue=T())
+ {
+ int sz = size();
+ if( sz == capacity() )
+ {
+ reserve( allocSize(size()) );
+ }
+ m_size++;
+#ifdef BT_USE_PLACEMENT_NEW
+ new (&m_data[sz]) T(fillValue); //use the in-place new (not really allocating heap memory)
+#endif
+
+ return m_data[sz];
+ }
+
SIMD_FORCE_INLINE void push_back(const T& _Val)
{
@@ -143,8 +201,12 @@ class btAlignedObjectArray
reserve( allocSize(size()) );
}
- m_data[size()] = _Val;
- //::new ( m_data[m_size] ) T(_Val);
+#ifdef BT_USE_PLACEMENT_NEW
+ new ( &m_data[m_size] ) T(_Val);
+#else
+ m_data[size()] = _Val;
+#endif //BT_USE_PLACEMENT_NEW
+
m_size++;
}
@@ -154,24 +216,152 @@ class btAlignedObjectArray
{ // determine new minimum length of allocated storage
if (capacity() < _Count)
{ // not enough room, reallocate
- if (capacity() < _Count)
- {
- T* s = (T*)allocate(_Count);
+ T* s = (T*)allocate(_Count);
+
+ copy(0, size(), s);
+
+ destroy(0,size());
- copy(0, size(), s);
+ deallocate();
+
+ m_data = s;
+
+ m_capacity = _Count;
+
+ }
+ }
- destroy(0,size());
- deallocate();
+ class less
+ {
+ public:
- m_data = s;
-
- m_capacity = _Count;
+ bool operator() ( const T& a, const T& b )
+ {
+ return ( a < b );
+ }
+ };
+
+ ///heap sort from http://www.csse.monash.edu.au/~lloyd/tildeAlgDS/Sort/Heap/
+ template <typename L>
+ void downHeap(T *pArr, int k, int n,L CompareFunc)
+ {
+ /* PRE: a[k+1..N] is a heap */
+ /* POST: a[k..N] is a heap */
+
+ T temp = pArr[k - 1];
+ /* k has child(s) */
+ while (k <= n/2)
+ {
+ int child = 2*k;
+
+ if ((child < n) && CompareFunc(pArr[child - 1] , pArr[child]))
+ {
+ child++;
+ }
+ /* pick larger child */
+ if (CompareFunc(temp , pArr[child - 1]))
+ {
+ /* move child up */
+ pArr[k - 1] = pArr[child - 1];
+ k = child;
}
+ else
+ {
+ break;
+ }
+ }
+ pArr[k - 1] = temp;
+ } /*downHeap*/
+
+ void swap(int index0,int index1)
+ {
+#ifdef BT_USE_MEMCPY
+ char temp[sizeof(T)];
+ memcpy(temp,&m_data[index0],sizeof(T));
+ memcpy(&m_data[index0],&m_data[index1],sizeof(T));
+ memcpy(&m_data[index1],temp,sizeof(T));
+#else
+ T temp = m_data[index0];
+ m_data[index0] = m_data[index1];
+ m_data[index1] = temp;
+#endif //BT_USE_PLACEMENT_NEW
+
+ }
+
+ template <typename L>
+ void heapSort(L CompareFunc)
+ {
+ /* sort a[0..N-1], N.B. 0 to N-1 */
+ int k;
+ int n = m_size;
+ for (k = n/2; k > 0; k--)
+ {
+ downHeap(m_data, k, n, CompareFunc);
+ }
+
+ /* a[1..N] is now a heap */
+ while ( n>=1 )
+ {
+ swap(0,n-1); /* largest of a[0..n-1] */
+
+
+ n = n - 1;
+ /* restore a[1..i-1] heap */
+ downHeap(m_data, 1, n, CompareFunc);
+ }
+ }
+
+ ///non-recursive binary search, assumes sorted array
+ int findBinarySearch(const T& key) const
+ {
+ int first = 0;
+ int last = size();
+
+ //assume sorted array
+ while (first <= last) {
+ int mid = (first + last) / 2; // compute mid point.
+ if (key > m_data[mid])
+ first = mid + 1; // repeat search in top half.
+ else if (key < m_data[mid])
+ last = mid - 1; // repeat search in bottom half.
+ else
+ return mid; // found it. return position /////
+ }
+ return size(); // failed to find key
+ }
+
+
+ int findLinearSearch(const T& key) const
+ {
+ int index=size();
+ int i;
+
+ for (i=0;i<size();i++)
+ {
+ if (m_data[i] == key)
+ {
+ index = i;
+ break;
}
}
+ return index;
+ }
+
+ void remove(const T& key)
+ {
+
+ int findIndex = findLinearSearch(key);
+ if (findIndex<size())
+ {
+ swap( findIndex,size()-1);
+ pop_back();
+ }
+ }
};
#endif //BT_OBJECT_ARRAY__
+
+
diff --git a/extern/bullet2/src/LinearMath/btDefaultMotionState.h b/extern/bullet2/src/LinearMath/btDefaultMotionState.h
index 6b85b37fb9e..d4ec8e8879c 100644
--- a/extern/bullet2/src/LinearMath/btDefaultMotionState.h
+++ b/extern/bullet2/src/LinearMath/btDefaultMotionState.h
@@ -31,12 +31,7 @@ struct btDefaultMotionState : public btMotionState
m_graphicsWorldTrans = centerOfMassWorldTrans * m_centerOfMassOffset ;
}
- ///Bullet gives a callback for objects that are about to be deactivated (put asleep)
- /// You can intercept this callback for your own bookkeeping.
- ///Also you can return false to disable deactivation for this object this frame.
- virtual bool deactivationCallback(void* userPointer) {
- return true;
- }
+
};
diff --git a/extern/bullet2/src/LinearMath/btGeometryUtil.cpp b/extern/bullet2/src/LinearMath/btGeometryUtil.cpp
index 5036894b2b3..3d0fb122a6b 100644
--- a/extern/bullet2/src/LinearMath/btGeometryUtil.cpp
+++ b/extern/bullet2/src/LinearMath/btGeometryUtil.cpp
@@ -16,14 +16,23 @@ subject to the following restrictions:
#include "btGeometryUtil.h"
-bool btGeometryUtil::isPointInsidePlanes(const btAlignedObjectArray<btVector3>& planeEquations, const btVector3& point, float margin)
+
+/*
+ Make sure this dummy function never changes so that it
+ can be used by probes that are checking whether the
+ library is actually installed.
+*/
+extern "C" void btBulletMathProbe () {}
+
+
+bool btGeometryUtil::isPointInsidePlanes(const btAlignedObjectArray<btVector3>& planeEquations, const btVector3& point, btScalar margin)
{
int numbrushes = planeEquations.size();
for (int i=0;i<numbrushes;i++)
{
const btVector3& N1 = planeEquations[i];
- float dist = float(N1.dot(point))+float(N1[3])-margin;
- if (dist>0.f)
+ btScalar dist = btScalar(N1.dot(point))+btScalar(N1[3])-margin;
+ if (dist>btScalar(0.))
{
return false;
}
@@ -33,14 +42,14 @@ bool btGeometryUtil::isPointInsidePlanes(const btAlignedObjectArray<btVector3>&
}
-bool btGeometryUtil::areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray<btVector3>& vertices, float margin)
+bool btGeometryUtil::areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray<btVector3>& vertices, btScalar margin)
{
int numvertices = vertices.size();
for (int i=0;i<numvertices;i++)
{
const btVector3& N1 = vertices[i];
- float dist = float(planeNormal.dot(N1))+float(planeNormal[3])-margin;
- if (dist>0.f)
+ btScalar dist = btScalar(planeNormal.dot(N1))+btScalar(planeNormal[3])-margin;
+ if (dist>btScalar(0.))
{
return false;
}
@@ -54,7 +63,7 @@ bool notExist(const btVector3& planeEquation,const btAlignedObjectArray<btVector
for (int i=0;i<numbrushes;i++)
{
const btVector3& N1 = planeEquations[i];
- if (planeEquation.dot(N1) > 0.999f)
+ if (planeEquation.dot(N1) > btScalar(0.999))
{
return false;
}
@@ -83,11 +92,11 @@ void btGeometryUtil::getPlaneEquationsFromVertices(btAlignedObjectArray<btVector
btVector3 planeEquation,edge0,edge1;
edge0 = N2-N1;
edge1 = N3-N1;
- float normalSign = 1.f;
+ btScalar normalSign = btScalar(1.);
for (int ww=0;ww<2;ww++)
{
planeEquation = normalSign * edge0.cross(edge1);
- if (planeEquation.length2() > 0.0001f)
+ if (planeEquation.length2() > btScalar(0.0001))
{
planeEquation.normalize();
if (notExist(planeEquation,planeEquationsOut))
@@ -95,13 +104,13 @@ void btGeometryUtil::getPlaneEquationsFromVertices(btAlignedObjectArray<btVector
planeEquation[3] = -planeEquation.dot(N1);
//check if inside, and replace supportingVertexOut if needed
- if (areVerticesBehindPlane(planeEquation,vertices,0.01f))
+ if (areVerticesBehindPlane(planeEquation,vertices,btScalar(0.01)))
{
planeEquationsOut.push_back(planeEquation);
}
}
}
- normalSign = -1.f;
+ normalSign = btScalar(-1.);
}
}
@@ -132,9 +141,9 @@ void btGeometryUtil::getVerticesFromPlaneEquations(const btAlignedObjectArray<bt
btVector3 n3n1; n3n1 = N3.cross(N1);
btVector3 n1n2; n1n2 = N1.cross(N2);
- if ( ( n2n3.length2() > 0.0001f ) &&
- ( n3n1.length2() > 0.0001f ) &&
- ( n1n2.length2() > 0.0001f ) )
+ if ( ( n2n3.length2() > btScalar(0.0001) ) &&
+ ( n3n1.length2() > btScalar(0.0001) ) &&
+ ( n1n2.length2() > btScalar(0.0001) ) )
{
//point P out of 3 plane equations:
@@ -143,10 +152,10 @@ void btGeometryUtil::getVerticesFromPlaneEquations(const btAlignedObjectArray<bt
// N1 . ( N2 * N3 )
- float quotient = (N1.dot(n2n3));
- if (btFabs(quotient) > 0.000001f)
+ btScalar quotient = (N1.dot(n2n3));
+ if (btFabs(quotient) > btScalar(0.000001))
{
- quotient = -1.f / quotient;
+ quotient = btScalar(-1.) / quotient;
n2n3 *= N1[3];
n3n1 *= N2[3];
n1n2 *= N3[3];
@@ -156,7 +165,7 @@ void btGeometryUtil::getVerticesFromPlaneEquations(const btAlignedObjectArray<bt
potentialVertex *= quotient;
//check if inside, and replace supportingVertexOut if needed
- if (isPointInsidePlanes(planeEquations,potentialVertex,0.01f))
+ if (isPointInsidePlanes(planeEquations,potentialVertex,btScalar(0.01)))
{
verticesOut.push_back(potentialVertex);
}
diff --git a/extern/bullet2/src/LinearMath/btGeometryUtil.h b/extern/bullet2/src/LinearMath/btGeometryUtil.h
index 018ffa72296..766cd75c383 100644
--- a/extern/bullet2/src/LinearMath/btGeometryUtil.h
+++ b/extern/bullet2/src/LinearMath/btGeometryUtil.h
@@ -28,11 +28,11 @@ class btGeometryUtil
static void getVerticesFromPlaneEquations(const btAlignedObjectArray<btVector3>& planeEquations , btAlignedObjectArray<btVector3>& verticesOut );
- static bool isInside(const btAlignedObjectArray<btVector3>& vertices, const btVector3& planeNormal, float margin);
+ static bool isInside(const btAlignedObjectArray<btVector3>& vertices, const btVector3& planeNormal, btScalar margin);
- static bool isPointInsidePlanes(const btAlignedObjectArray<btVector3>& planeEquations, const btVector3& point, float margin);
+ static bool isPointInsidePlanes(const btAlignedObjectArray<btVector3>& planeEquations, const btVector3& point, btScalar margin);
- static bool areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray<btVector3>& vertices, float margin);
+ static bool areVerticesBehindPlane(const btVector3& planeNormal, const btAlignedObjectArray<btVector3>& vertices, btScalar margin);
};
diff --git a/extern/bullet2/src/LinearMath/btIDebugDraw.h b/extern/bullet2/src/LinearMath/btIDebugDraw.h
index 86db735ce94..5f40ca39157 100644
--- a/extern/bullet2/src/LinearMath/btIDebugDraw.h
+++ b/extern/bullet2/src/LinearMath/btIDebugDraw.h
@@ -28,7 +28,7 @@ DEALINGS IN THE SOFTWARE.
#ifndef IDEBUG_DRAW__H
#define IDEBUG_DRAW__H
-#include "LinearMath/btVector3.h"
+#include "btVector3.h"
class btIDebugDraw
@@ -56,14 +56,45 @@ class btIDebugDraw
virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)=0;
- virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,float distance,int lifeTime,const btVector3& color)=0;
+ virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color)=0;
+
+ virtual void reportErrorWarning(const char* warningString) = 0;
virtual void setDebugMode(int debugMode) =0;
virtual int getDebugMode() const = 0;
+ inline void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color)
+ {
+ btVector3 halfExtents = (to-from)* 0.5f;
+ btVector3 center = (to+from) *0.5f;
+ int i,j;
+
+ btVector3 edgecoord(1.f,1.f,1.f),pa,pb;
+ for (i=0;i<4;i++)
+ {
+ for (j=0;j<3;j++)
+ {
+ pa = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],
+ edgecoord[2]*halfExtents[2]);
+ pa+=center;
+
+ int othercoord = j%3;
+ edgecoord[othercoord]*=-1.f;
+ pb = btVector3(edgecoord[0]*halfExtents[0], edgecoord[1]*halfExtents[1],
+ edgecoord[2]*halfExtents[2]);
+ pb+=center;
+
+ drawLine(pa,pb,color);
+ }
+ edgecoord = btVector3(-1.f,-1.f,-1.f);
+ if (i<3)
+ edgecoord[i]*=-1.f;
+ }
+ }
};
+
#endif //IDEBUG_DRAW__H
diff --git a/extern/bullet2/src/LinearMath/btMatrix3x3.h b/extern/bullet2/src/LinearMath/btMatrix3x3.h
index c3cc90a82c7..94f53c3c0a5 100644
--- a/extern/bullet2/src/LinearMath/btMatrix3x3.h
+++ b/extern/bullet2/src/LinearMath/btMatrix3x3.h
@@ -16,10 +16,10 @@ subject to the following restrictions:
#ifndef btMatrix3x3_H
#define btMatrix3x3_H
-#include "LinearMath/btScalar.h"
+#include "btScalar.h"
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btQuaternion.h"
+#include "btVector3.h"
+#include "btQuaternion.h"
class btMatrix3x3 {
@@ -45,12 +45,29 @@ class btMatrix3x3 {
zx, zy, zz);
}
- btVector3 getColumn(int i) const
+ 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];
+ }
+
+ 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;
+ }
+
+ SIMD_FORCE_INLINE btVector3 getColumn(int i) const
{
return btVector3(m_el[0][i],m_el[1][i],m_el[2][i]);
}
+
- const btVector3& getRow(int i) const
+
+ SIMD_FORCE_INLINE const btVector3& getRow(int i) const
{
return m_el[i];
}
@@ -58,13 +75,13 @@ class btMatrix3x3 {
SIMD_FORCE_INLINE btVector3& operator[](int i)
{
- assert(0 <= i && i < 3);
+ btFullAssert(0 <= i && i < 3);
return m_el[i];
}
- const btVector3& operator[](int i) const
+ SIMD_FORCE_INLINE const btVector3& operator[](int i) const
{
- assert(0 <= i && i < 3);
+ btFullAssert(0 <= i && i < 3);
return m_el[i];
}
@@ -73,41 +90,30 @@ class btMatrix3x3 {
void setFromOpenGLSubMatrix(const btScalar *m)
{
- m_el[0][0] = (m[0]);
- m_el[1][0] = (m[1]);
- m_el[2][0] = (m[2]);
- m_el[0][1] = (m[4]);
- m_el[1][1] = (m[5]);
- m_el[2][1] = (m[6]);
- m_el[0][2] = (m[8]);
- m_el[1][2] = (m[9]);
- m_el[2][2] = (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]);
+
}
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][0] = btScalar(xx);
- m_el[0][1] = btScalar(xy);
- m_el[0][2] = btScalar(xz);
- m_el[1][0] = btScalar(yx);
- m_el[1][1] = btScalar(yy);
- m_el[1][2] = btScalar(yz);
- m_el[2][0] = btScalar(zx);
- m_el[2][1] = btScalar(zy);
- m_el[2][2] = btScalar(zz);
+ m_el[0].setValue(xx,xy,xz);
+ m_el[1].setValue(yx,yy,yz);
+ m_el[2].setValue(zx,zy,zz);
}
void setRotation(const btQuaternion& q)
{
btScalar d = q.length2();
- assert(d != btScalar(0.0));
+ btFullAssert(d != btScalar(0.0));
btScalar s = btScalar(2.0) / d;
- btScalar xs = q[0] * s, ys = q[1] * s, zs = q[2] * s;
- btScalar wx = q[3] * xs, wy = q[3] * ys, wz = q[3] * zs;
- btScalar xx = q[0] * xs, xy = q[0] * ys, xz = q[0] * zs;
- btScalar yy = q[1] * ys, yz = q[1] * zs, zz = q[2] * zs;
+ 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));
@@ -168,90 +174,88 @@ class btMatrix3x3 {
void getOpenGLSubMatrix(btScalar *m) const
{
- m[0] = btScalar(m_el[0][0]);
- m[1] = btScalar(m_el[1][0]);
- m[2] = btScalar(m_el[2][0]);
+ 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][1]);
- m[5] = btScalar(m_el[1][1]);
- m[6] = btScalar(m_el[2][1]);
+ 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][2]);
- m[9] = btScalar(m_el[1][2]);
- m[10] = btScalar(m_el[2][2]);
+ 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);
}
void getRotation(btQuaternion& q) const
{
- btScalar trace = m_el[0][0] + m_el[1][1] + m_el[2][2];
+ btScalar trace = m_el[0].x() + m_el[1].y() + m_el[2].z();
+ btScalar temp[4];
if (trace > btScalar(0.0))
{
btScalar s = btSqrt(trace + btScalar(1.0));
- q[3] = s * btScalar(0.5);
+ temp[3]=(s * btScalar(0.5));
s = btScalar(0.5) / s;
- q[0] = (m_el[2][1] - m_el[1][2]) * s;
- q[1] = (m_el[0][2] - m_el[2][0]) * s;
- q[2] = (m_el[1][0] - m_el[0][1]) * 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
{
- int i = m_el[0][0] < m_el[1][1] ?
- (m_el[1][1] < m_el[2][2] ? 2 : 1) :
- (m_el[0][0] < m_el[2][2] ? 2 : 0);
+ 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));
- q[i] = s * btScalar(0.5);
+ temp[i] = s * btScalar(0.5);
s = btScalar(0.5) / s;
- q[3] = (m_el[k][j] - m_el[j][k]) * s;
- q[j] = (m_el[j][i] + m_el[i][j]) * s;
- q[k] = (m_el[k][i] + m_el[i][k]) * 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]);
}
-
-
void getEuler(btScalar& yaw, btScalar& pitch, btScalar& roll) const
{
- pitch = btScalar(btAsin(-m_el[2][0]));
- if (pitch < SIMD_2_PI)
+
+ if (btScalar(m_el[1].z()) < btScalar(1))
{
- if (pitch > SIMD_2_PI)
+ if (btScalar(m_el[1].z()) > -btScalar(1))
{
- yaw = btScalar(btAtan2(m_el[1][0], m_el[0][0]));
- roll = btScalar(btAtan2(m_el[2][1], m_el[2][2]));
+ yaw = btScalar(btAtan2(m_el[1].x(), m_el[0].x()));
+ pitch = btScalar(btAsin(-m_el[1].y()));
+ roll = btScalar(btAtan2(m_el[2].y(), m_el[2].z()));
}
else
{
- yaw = btScalar(-btAtan2(-m_el[0][1], m_el[0][2]));
+ yaw = btScalar(-btAtan2(-m_el[0].y(), m_el[0].z()));
+ pitch = SIMD_HALF_PI;
roll = btScalar(0.0);
}
}
else
{
- yaw = btScalar(btAtan2(-m_el[0][1], m_el[0][2]));
+ yaw = btScalar(btAtan2(-m_el[0].y(), m_el[0].z()));
+ pitch = -SIMD_HALF_PI;
roll = btScalar(0.0);
}
}
-
- btVector3 getScaling() const
- {
- return btVector3(m_el[0][0] * m_el[0][0] + m_el[1][0] * m_el[1][0] + m_el[2][0] * m_el[2][0],
- m_el[0][1] * m_el[0][1] + m_el[1][1] * m_el[1][1] + m_el[2][1] * m_el[2][1],
- m_el[0][2] * m_el[0][2] + m_el[1][2] * m_el[1][2] + m_el[2][2] * m_el[2][2]);
- }
+
+
btMatrix3x3 scaled(const btVector3& s) const
{
- return btMatrix3x3(m_el[0][0] * s[0], m_el[0][1] * s[1], m_el[0][2] * s[2],
- m_el[1][0] * s[0], m_el[1][1] * s[1], m_el[1][2] * s[2],
- m_el[2][0] * s[0], m_el[2][1] * s[1], m_el[2][2] * s[2]);
+ 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());
}
btScalar determinant() const;
@@ -263,10 +267,20 @@ class btMatrix3x3 {
btMatrix3x3 transposeTimes(const btMatrix3x3& m) const;
btMatrix3x3 timesTranspose(const btMatrix3x3& m) const;
- btScalar tdot(int c, const btVector3& v) const
+ SIMD_FORCE_INLINE btScalar tdotx(const btVector3& v) const
{
- return m_el[0][c] * v[0] + m_el[1][c] * v[1] + m_el[2][c] * v[2];
+ 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();
+ }
+
+
protected:
btScalar cofac(int r1, int c1, int r2, int c2) const
@@ -280,9 +294,9 @@ class btMatrix3x3 {
SIMD_FORCE_INLINE btMatrix3x3&
btMatrix3x3::operator*=(const btMatrix3x3& m)
{
- setValue(m.tdot(0, m_el[0]), m.tdot(1, m_el[0]), m.tdot(2, m_el[0]),
- m.tdot(0, m_el[1]), m.tdot(1, m_el[1]), m.tdot(2, m_el[1]),
- m.tdot(0, m_el[2]), m.tdot(1, m_el[2]), m.tdot(2, m_el[2]));
+ 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;
}
@@ -297,17 +311,17 @@ class btMatrix3x3 {
btMatrix3x3::absolute() const
{
return btMatrix3x3(
- btFabs(m_el[0][0]), btFabs(m_el[0][1]), btFabs(m_el[0][2]),
- btFabs(m_el[1][0]), btFabs(m_el[1][1]), btFabs(m_el[1][2]),
- btFabs(m_el[2][0]), btFabs(m_el[2][1]), btFabs(m_el[2][2]));
+ 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][0], m_el[1][0], m_el[2][0],
- m_el[0][1], m_el[1][1], m_el[2][1],
- m_el[0][2], m_el[1][2], m_el[2][2]);
+ 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
@@ -323,26 +337,26 @@ class btMatrix3x3 {
{
btVector3 co(cofac(1, 1, 2, 2), cofac(1, 2, 2, 0), cofac(1, 0, 2, 1));
btScalar det = (*this)[0].dot(co);
- assert(det != btScalar(0.0f));
- btScalar s = btScalar(1.0f) / det;
- return btMatrix3x3(co[0] * s, cofac(0, 2, 2, 1) * s, cofac(0, 1, 1, 2) * s,
- co[1] * s, cofac(0, 0, 2, 2) * s, cofac(0, 2, 1, 0) * s,
- co[2] * s, cofac(0, 1, 2, 0) * s, cofac(0, 0, 1, 1) * s);
+ 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][0] * m[0][0] + m_el[1][0] * m[1][0] + m_el[2][0] * m[2][0],
- m_el[0][0] * m[0][1] + m_el[1][0] * m[1][1] + m_el[2][0] * m[2][1],
- m_el[0][0] * m[0][2] + m_el[1][0] * m[1][2] + m_el[2][0] * m[2][2],
- m_el[0][1] * m[0][0] + m_el[1][1] * m[1][0] + m_el[2][1] * m[2][0],
- m_el[0][1] * m[0][1] + m_el[1][1] * m[1][1] + m_el[2][1] * m[2][1],
- m_el[0][1] * m[0][2] + m_el[1][1] * m[1][2] + m_el[2][1] * m[2][2],
- m_el[0][2] * m[0][0] + m_el[1][2] * m[1][0] + m_el[2][2] * m[2][0],
- m_el[0][2] * m[0][1] + m_el[1][2] * m[1][1] + m_el[2][2] * m[2][1],
- m_el[0][2] * m[0][2] + m_el[1][2] * m[1][2] + m_el[2][2] * m[2][2]);
+ 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].x());
}
SIMD_FORCE_INLINE btMatrix3x3
@@ -365,19 +379,19 @@ class btMatrix3x3 {
SIMD_FORCE_INLINE btVector3
operator*(const btVector3& v, const btMatrix3x3& m)
{
- return btVector3(m.tdot(0, v), m.tdot(1, v), m.tdot(2, v));
+ 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.tdot(0, m1[0]), m2.tdot(1, m1[0]), m2.tdot(2, m1[0]),
- m2.tdot(0, m1[1]), m2.tdot(1, m1[1]), m2.tdot(2, m1[1]),
- m2.tdot(0, m1[2]), m2.tdot(1, m1[2]), m2.tdot(2, m1[2]));
+ 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],
@@ -390,6 +404,7 @@ class btMatrix3x3 {
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]);
}
+*/
#endif
diff --git a/extern/bullet2/src/LinearMath/btMotionState.h b/extern/bullet2/src/LinearMath/btMotionState.h
index a9e212d3c71..1975e5ff900 100644
--- a/extern/bullet2/src/LinearMath/btMotionState.h
+++ b/extern/bullet2/src/LinearMath/btMotionState.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef BT_MOTIONSTATE_H
#define BT_MOTIONSTATE_H
-#include "LinearMath/btTransform.h"
+#include "btTransform.h"
///btMotionState allows the dynamics world to synchronize the updated world transforms with graphics
///For optimizations, potentially only moving objects get synchronized (using setWorldPosition/setWorldOrientation)
@@ -34,10 +34,7 @@ class btMotionState
//Bullet only calls the update of worldtransform for active objects
virtual void setWorldTransform(const btTransform& worldTrans)=0;
- //future: when Bullet makes attempt to deactivate object, you can intercept this callback (return false to disable deactivation for this object this frame)
- virtual bool deactivationCallback(void* userPointer) {
- return true;
- }
+
};
#endif //BT_MOTIONSTATE_H
diff --git a/extern/bullet2/src/LinearMath/btPoint3.h b/extern/bullet2/src/LinearMath/btPoint3.h
index 4be7e9015bb..a2020e26d12 100644
--- a/extern/bullet2/src/LinearMath/btPoint3.h
+++ b/extern/bullet2/src/LinearMath/btPoint3.h
@@ -17,7 +17,7 @@ subject to the following restrictions:
#ifndef btPoint3_H
#define btPoint3_H
-#include "LinearMath/btVector3.h"
+#include "btVector3.h"
typedef btVector3 btPoint3;
diff --git a/extern/bullet2/src/LinearMath/btQuadWord.h b/extern/bullet2/src/LinearMath/btQuadWord.h
index 4331b668210..961ac484d20 100644
--- a/extern/bullet2/src/LinearMath/btQuadWord.h
+++ b/extern/bullet2/src/LinearMath/btQuadWord.h
@@ -16,12 +16,13 @@ subject to the following restrictions:
#ifndef SIMD_QUADWORD_H
#define SIMD_QUADWORD_H
-#include "LinearMath/btScalar.h"
+#include "btScalar.h"
-ATTRIBUTE_ALIGNED16 (class btQuadWord)
+///btQuadWord is base-class for vectors, points
+class btQuadWord
{
protected:
btScalar m_x;
@@ -31,8 +32,8 @@ ATTRIBUTE_ALIGNED16 (class btQuadWord)
public:
- SIMD_FORCE_INLINE btScalar& operator[](int i) { return (&m_x)[i]; }
- SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_x)[i]; }
+// SIMD_FORCE_INLINE btScalar& operator[](int i) { return (&m_x)[i]; }
+// SIMD_FORCE_INLINE const btScalar& operator[](int i) const { return (&m_x)[i]; }
SIMD_FORCE_INLINE const btScalar& getX() const { return m_x; }
@@ -40,11 +41,13 @@ ATTRIBUTE_ALIGNED16 (class btQuadWord)
SIMD_FORCE_INLINE const btScalar& getZ() const { return m_z; }
- SIMD_FORCE_INLINE void setX(float x) { m_x = x;};
+ SIMD_FORCE_INLINE void setX(btScalar x) { m_x = x;};
- SIMD_FORCE_INLINE void setY(float y) { m_y = y;};
+ SIMD_FORCE_INLINE void setY(btScalar y) { m_y = y;};
- SIMD_FORCE_INLINE void setZ(float z) { m_z = z;};
+ SIMD_FORCE_INLINE void setZ(btScalar z) { m_z = z;};
+
+ SIMD_FORCE_INLINE void setW(btScalar w) { m_unusedW = w;};
SIMD_FORCE_INLINE const btScalar& x() const { return m_x; }
@@ -52,15 +55,18 @@ ATTRIBUTE_ALIGNED16 (class btQuadWord)
SIMD_FORCE_INLINE const btScalar& z() const { return m_z; }
+ SIMD_FORCE_INLINE const btScalar& w() const { return m_unusedW; }
+
- operator btScalar *() { return &m_x; }
- operator const btScalar *() const { return &m_x; }
+ SIMD_FORCE_INLINE operator btScalar *() { return &m_x; }
+ SIMD_FORCE_INLINE operator const btScalar *() const { return &m_x; }
SIMD_FORCE_INLINE void setValue(const btScalar& x, const btScalar& y, const btScalar& z)
{
m_x=x;
m_y=y;
m_z=z;
+ m_unusedW = 0.f;
}
/* void getValue(btScalar *m) const
@@ -78,15 +84,15 @@ ATTRIBUTE_ALIGNED16 (class btQuadWord)
m_unusedW=w;
}
- SIMD_FORCE_INLINE btQuadWord() :
- m_x(0.f),m_y(0.f),m_z(0.f),m_unusedW(0.f)
+ SIMD_FORCE_INLINE btQuadWord()
+ // :m_x(btScalar(0.)),m_y(btScalar(0.)),m_z(btScalar(0.)),m_unusedW(btScalar(0.))
{
}
SIMD_FORCE_INLINE btQuadWord(const btScalar& x, const btScalar& y, const btScalar& z)
:m_x(x),m_y(y),m_z(z)
//todo, remove this in release/simd ?
- ,m_unusedW(0.f)
+ ,m_unusedW(btScalar(0.))
{
}
diff --git a/extern/bullet2/src/LinearMath/btQuaternion.h b/extern/bullet2/src/LinearMath/btQuaternion.h
index aec25a54955..50334970ba6 100644
--- a/extern/bullet2/src/LinearMath/btQuaternion.h
+++ b/extern/bullet2/src/LinearMath/btQuaternion.h
@@ -17,7 +17,7 @@ subject to the following restrictions:
#ifndef SIMD__QUATERNION_H_
#define SIMD__QUATERNION_H_
-#include "LinearMath/btVector3.h"
+#include "btVector3.h"
class btQuaternion : public btQuadWord {
public:
@@ -68,13 +68,13 @@ public:
btQuaternion& operator+=(const btQuaternion& q)
{
- m_x += q.x(); m_y += q.y(); m_z += q.z(); m_unusedW += q[3];
+ m_x += q.x(); m_y += q.y(); m_z += q.z(); m_unusedW += q.m_unusedW;
return *this;
}
btQuaternion& operator-=(const btQuaternion& q)
{
- m_x -= q.x(); m_y -= q.y(); m_z -= q.z(); m_unusedW -= q[3];
+ m_x -= q.x(); m_y -= q.y(); m_z -= q.z(); m_unusedW -= q.m_unusedW;
return *this;
}
@@ -87,16 +87,16 @@ public:
btQuaternion& operator*=(const btQuaternion& q)
{
- setValue(m_unusedW * q.x() + m_x * q[3] + m_y * q.z() - m_z * q.y(),
- m_unusedW * q.y() + m_y * q[3] + m_z * q.x() - m_x * q.z(),
- m_unusedW * q.z() + m_z * q[3] + m_x * q.y() - m_y * q.x(),
- m_unusedW * q[3] - m_x * q.x() - m_y * q.y() - m_z * q.z());
+ setValue(m_unusedW * q.x() + m_x * q.m_unusedW + m_y * q.z() - m_z * q.y(),
+ m_unusedW * q.y() + m_y * q.m_unusedW + m_z * q.x() - m_x * q.z(),
+ m_unusedW * q.z() + m_z * q.m_unusedW + m_x * q.y() - m_y * q.x(),
+ m_unusedW * q.m_unusedW - m_x * q.x() - m_y * q.y() - m_z * q.z());
return *this;
}
btScalar dot(const btQuaternion& q) const
{
- return m_x * q.x() + m_y * q.y() + m_z * q.z() + m_unusedW * q[3];
+ return m_x * q.x() + m_y * q.y() + m_z * q.z() + m_unusedW * q.m_unusedW;
}
btScalar length2() const
@@ -150,7 +150,7 @@ public:
btScalar getAngle() const
{
- btScalar s = 2.f * btAcos(m_unusedW);
+ btScalar s = btScalar(2.) * btAcos(m_unusedW);
return s;
}
@@ -165,20 +165,20 @@ public:
operator+(const btQuaternion& q2) const
{
const btQuaternion& q1 = *this;
- return btQuaternion(q1.x() + q2.x(), q1.y() + q2.y(), q1.z() + q2.z(), q1[3] + q2[3]);
+ return btQuaternion(q1.x() + q2.x(), q1.y() + q2.y(), q1.z() + q2.z(), q1.m_unusedW + q2.m_unusedW);
}
SIMD_FORCE_INLINE btQuaternion
operator-(const btQuaternion& q2) const
{
const btQuaternion& q1 = *this;
- return btQuaternion(q1.x() - q2.x(), q1.y() - q2.y(), q1.z() - q2.z(), q1[3] - q2[3]);
+ return btQuaternion(q1.x() - q2.x(), q1.y() - q2.y(), q1.z() - q2.z(), q1.m_unusedW - q2.m_unusedW);
}
SIMD_FORCE_INLINE btQuaternion operator-() const
{
const btQuaternion& q2 = *this;
- return btQuaternion( - q2.x(), - q2.y(), - q2.z(), - q2[3]);
+ return btQuaternion( - q2.x(), - q2.y(), - q2.z(), - q2.m_unusedW);
}
SIMD_FORCE_INLINE btQuaternion farthest( const btQuaternion& qd) const
@@ -202,7 +202,7 @@ public:
return btQuaternion((m_x * s0 + q.x() * s1) * d,
(m_y * s0 + q.y() * s1) * d,
(m_z * s0 + q.z() * s1) * d,
- (m_unusedW * s0 + q[3] * s1) * d);
+ (m_unusedW * s0 + q.m_unusedW * s1) * d);
}
else
{
@@ -212,6 +212,7 @@ public:
SIMD_FORCE_INLINE const btScalar& getW() const { return m_unusedW; }
+
};
@@ -219,7 +220,7 @@ public:
SIMD_FORCE_INLINE btQuaternion
operator-(const btQuaternion& q)
{
- return btQuaternion(-q.x(), -q.y(), -q.z(), -q[3]);
+ return btQuaternion(-q.x(), -q.y(), -q.z(), -q.w());
}
@@ -227,27 +228,27 @@ operator-(const btQuaternion& q)
SIMD_FORCE_INLINE btQuaternion
operator*(const btQuaternion& q1, const btQuaternion& q2) {
- return btQuaternion(q1[3] * q2.x() + q1.x() * q2[3] + q1.y() * q2.z() - q1.z() * q2.y(),
- q1[3] * q2.y() + q1.y() * q2[3] + q1.z() * q2.x() - q1.x() * q2.z(),
- q1[3] * q2.z() + q1.z() * q2[3] + q1.x() * q2.y() - q1.y() * q2.x(),
- q1[3] * q2[3] - q1.x() * q2.x() - q1.y() * q2.y() - q1.z() * q2.z());
+ return btQuaternion(q1.w() * q2.x() + q1.x() * q2.w() + q1.y() * q2.z() - q1.z() * q2.y(),
+ q1.w() * q2.y() + q1.y() * q2.w() + q1.z() * q2.x() - q1.x() * q2.z(),
+ q1.w() * q2.z() + q1.z() * q2.w() + q1.x() * q2.y() - q1.y() * q2.x(),
+ q1.w() * q2.w() - q1.x() * q2.x() - q1.y() * q2.y() - q1.z() * q2.z());
}
SIMD_FORCE_INLINE btQuaternion
operator*(const btQuaternion& q, const btVector3& w)
{
- return btQuaternion( q[3] * w.x() + q.y() * w.z() - q.z() * w.y(),
- q[3] * w.y() + q.z() * w.x() - q.x() * w.z(),
- q[3] * w.z() + q.x() * w.y() - q.y() * w.x(),
+ return btQuaternion( q.w() * w.x() + q.y() * w.z() - q.z() * w.y(),
+ q.w() * w.y() + q.z() * w.x() - q.x() * w.z(),
+ q.w() * w.z() + q.x() * w.y() - q.y() * w.x(),
-q.x() * w.x() - q.y() * w.y() - q.z() * w.z());
}
SIMD_FORCE_INLINE btQuaternion
operator*(const btVector3& w, const btQuaternion& q)
{
- return btQuaternion( w.x() * q[3] + w.y() * q.z() - w.z() * q.y(),
- w.y() * q[3] + w.z() * q.x() - w.x() * q.z(),
- w.z() * q[3] + w.x() * q.y() - w.y() * q.x(),
+ return btQuaternion( w.x() * q.w() + w.y() * q.z() - w.z() * q.y(),
+ w.y() * q.w() + w.z() * q.x() - w.x() * q.z(),
+ w.z() * q.w() + w.x() * q.y() - w.y() * q.x(),
-w.x() * q.x() - w.y() * q.y() - w.z() * q.z());
}
@@ -283,6 +284,36 @@ slerp(const btQuaternion& q1, const btQuaternion& q2, const btScalar& t)
return q1.slerp(q2, t);
}
+SIMD_FORCE_INLINE btVector3
+quatRotate(btQuaternion& rotation, btVector3& v)
+{
+ btQuaternion q = rotation * v;
+ q *= rotation.inverse();
+ return btVector3(q.getX(),q.getY(),q.getZ());
+}
+
+SIMD_FORCE_INLINE btQuaternion
+shortestArcQuat(btVector3& v0,btVector3& v1) // Game Programming Gems 2.10. make sure v0,v1 are normalized
+{
+ btVector3 c = v0.cross(v1);
+ 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
+
+ btScalar s = btSqrt((1.0f + d) * 2.0f);
+ btScalar rs = 1.0f / s;
+
+ return btQuaternion(c.getX()*rs,c.getY()*rs,c.getZ()*rs,s * 0.5f);
+}
+
+SIMD_FORCE_INLINE btQuaternion
+shortestArcQuatNormalize(btVector3& v0,btVector3& v1)
+{
+ v0.normalize();
+ v1.normalize();
+ return shortestArcQuat(v0,v1);
+}
#endif
diff --git a/extern/bullet2/src/LinearMath/btQuickprof.cpp b/extern/bullet2/src/LinearMath/btQuickprof.cpp
index 4d013a65853..37a0c8c3be5 100644
--- a/extern/bullet2/src/LinearMath/btQuickprof.cpp
+++ b/extern/bullet2/src/LinearMath/btQuickprof.cpp
@@ -27,7 +27,7 @@ subject to the following restrictions:
// Note: We must declare these private static variables again here to
// avoid link errors.
bool btProfiler::mEnabled = false;
-hidden::Clock btProfiler::mClock;
+btClock btProfiler::mClock;
unsigned long int btProfiler::mCurrentCycleStartMicroseconds = 0;
unsigned long int btProfiler::mLastCycleDurationMicroseconds = 0;
std::map<std::string, hidden::ProfileBlock*> btProfiler::mProfileBlocks;
diff --git a/extern/bullet2/src/LinearMath/btQuickprof.h b/extern/bullet2/src/LinearMath/btQuickprof.h
index ec560c8e33e..a885967c5fa 100644
--- a/extern/bullet2/src/LinearMath/btQuickprof.h
+++ b/extern/bullet2/src/LinearMath/btQuickprof.h
@@ -22,17 +22,17 @@ subject to the following restrictions:
#ifndef QUICK_PROF_H
#define QUICK_PROF_H
-#define USE_QUICKPROF 1
+#include "btScalar.h"
-#ifdef USE_QUICKPROF
+//#define USE_QUICKPROF 1
+//Don't use quickprof for now, because it contains STL. TODO: replace STL by Bullet container classes.
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <map>
+//if you don't need btClock, you can comment next line
+#define USE_BT_CLOCK 1
-#ifdef __PPU__
+#ifdef USE_BT_CLOCK
+#ifdef __CELLOS_LV2__
#include <sys/sys_time.h>
#include <stdio.h>
typedef uint64_t __int64;
@@ -43,47 +43,30 @@ typedef uint64_t __int64;
#endif
#if defined(WIN32) || defined(_WIN32)
- #define USE_WINDOWS_TIMERS
+
+ #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)
-namespace hidden
-{
- /// A simple data structure representing a single timed block
- /// of code.
- struct ProfileBlock
- {
- ProfileBlock()
- {
- currentBlockStartMicroseconds = 0;
- currentCycleTotalMicroseconds = 0;
- lastCycleTotalMicroseconds = 0;
- totalMicroseconds = 0;
- }
-
- /// The starting time (in us) of the current block update.
- unsigned long int currentBlockStartMicroseconds;
-
- /// The accumulated time (in us) spent in this block during the
- /// current profiling cycle.
- unsigned long int currentCycleTotalMicroseconds;
-
- /// The accumulated time (in us) spent in this block during the
- /// past profiling cycle.
- unsigned long int lastCycleTotalMicroseconds;
-
- /// The total accumulated time (in us) spent in this block.
- unsigned long int totalMicroseconds;
- };
- class Clock
+/// basic clock
+class btClock
{
public:
- Clock()
+ btClock()
{
#ifdef USE_WINDOWS_TIMERS
QueryPerformanceFrequency(&mClockFrequency);
@@ -91,7 +74,7 @@ namespace hidden
reset();
}
- ~Clock()
+ ~btClock()
{
}
@@ -103,7 +86,7 @@ namespace hidden
mStartTick = GetTickCount();
mPrevElapsedTime = 0;
#else
-#ifdef __PPU__
+#ifdef __CELLOS_LV2__
typedef uint64_t __int64;
typedef __int64 ClockSize;
@@ -111,14 +94,14 @@ namespace hidden
__asm __volatile__( "mftb %0" : "=r" (newTime) : : "memory");
mStartTime = newTime;
#else
- gettimeofday(&mStartTime, NULL);
+ gettimeofday(&mStartTime, 0);
#endif
#endif
}
/// Returns the time in ms since the last call to reset or since
- /// the Clock was created.
+ /// the btClock was created.
unsigned long int getTimeMilliseconds()
{
#ifdef USE_WINDOWS_TIMERS
@@ -156,7 +139,7 @@ namespace hidden
return msecTicks;
#else
-#ifdef __PPU__
+#ifdef __CELLOS_LV2__
__int64 freq=sys_time_get_timebase_frequency();
double dFreq=((double) freq) / 1000.0;
typedef uint64_t __int64;
@@ -168,10 +151,10 @@ namespace hidden
#else
struct timeval currentTime;
- gettimeofday(&currentTime, NULL);
+ gettimeofday(&currentTime, 0);
return (currentTime.tv_sec - mStartTime.tv_sec) * 1000 +
(currentTime.tv_usec - mStartTime.tv_usec) / 1000;
-#endif //__PPU__
+#endif //__CELLOS_LV2__
#endif
}
@@ -214,7 +197,7 @@ namespace hidden
return usecTicks;
#else
-#ifdef __PPU__
+#ifdef __CELLOS_LV2__
__int64 freq=sys_time_get_timebase_frequency();
double dFreq=((double) freq)/ 1000000.0;
typedef uint64_t __int64;
@@ -226,10 +209,10 @@ namespace hidden
#else
struct timeval currentTime;
- gettimeofday(&currentTime, NULL);
+ gettimeofday(&currentTime, 0);
return (currentTime.tv_sec - mStartTime.tv_sec) * 1000000 +
(currentTime.tv_usec - mStartTime.tv_usec);
-#endif//__PPU__
+#endif//__CELLOS_LV2__
#endif
}
@@ -240,14 +223,58 @@ namespace hidden
LONGLONG mPrevElapsedTime;
LARGE_INTEGER mStartTime;
#else
-#ifdef __PPU__
+#ifdef __CELLOS_LV2__
uint64_t mStartTime;
#else
struct timeval mStartTime;
#endif
-#endif //__PPU__
+#endif //__CELLOS_LV2__
+
+ };
+
+#endif //USE_BT_CLOCK
+
+#ifdef USE_QUICKPROF
+
+
+#include <iostream>
+#include <fstream>
+#include <string>
+#include <map>
+
+
+
+
+namespace hidden
+{
+ /// A simple data structure representing a single timed block
+ /// of code.
+ struct ProfileBlock
+ {
+ ProfileBlock()
+ {
+ currentBlockStartMicroseconds = 0;
+ currentCycleTotalMicroseconds = 0;
+ lastCycleTotalMicroseconds = 0;
+ totalMicroseconds = 0;
+ }
+
+ /// The starting time (in us) of the current block update.
+ unsigned long int currentBlockStartMicroseconds;
+
+ /// The accumulated time (in us) spent in this block during the
+ /// current profiling cycle.
+ unsigned long int currentCycleTotalMicroseconds;
+
+ /// The accumulated time (in us) spent in this block during the
+ /// past profiling cycle.
+ unsigned long int lastCycleTotalMicroseconds;
+
+ /// The total accumulated time (in us) spent in this block.
+ unsigned long int totalMicroseconds;
};
+
};
/// A static class that manages timing for a set of profiling blocks.
@@ -336,6 +363,7 @@ public:
/// Prints an error message to standard output.
inline static void printError(const std::string& msg)
{
+ //btAssert(0);
std::cout << "[QuickProf error] " << msg << std::endl;
}
@@ -343,7 +371,7 @@ public:
static bool mEnabled;
/// The clock used to time profile blocks.
- static hidden::Clock mClock;
+ static btClock mClock;
/// The starting time (in us) of the current profiling cycle.
static unsigned long int mCurrentCycleStartMicroseconds;
@@ -681,3 +709,4 @@ std::string btProfiler::createStatsString(BlockTimingMethod method)
#endif //QUICK_PROF_H
+
diff --git a/extern/bullet2/src/LinearMath/btScalar.h b/extern/bullet2/src/LinearMath/btScalar.h
index dd76fb2de1a..01ad93e786a 100644
--- a/extern/bullet2/src/LinearMath/btScalar.h
+++ b/extern/bullet2/src/LinearMath/btScalar.h
@@ -25,21 +25,40 @@ subject to the following restrictions:
#ifdef WIN32
- #if defined(__MINGW32__) || defined(__CYGWIN__)
+ #if defined(__MINGW32__) || defined(__CYGWIN__) || (defined (_MSC_VER) && _MSC_VER < 1300)
#define SIMD_FORCE_INLINE inline
#define ATTRIBUTE_ALIGNED16(a) a
#else
+ #define BT_HAS_ALIGNED_ALOCATOR
#pragma warning(disable:4530)
#pragma warning(disable:4996)
#pragma warning(disable:4786)
#define SIMD_FORCE_INLINE __forceinline
#define ATTRIBUTE_ALIGNED16(a) __declspec(align(16)) a
+ #ifdef _XBOX
+ #define BT_USE_VMX128
+ #else
+ #define BT_USE_SSE
+ #endif
#endif //__MINGW32__
#include <assert.h>
#define btAssert assert
+ //btFullAssert is optional, slows down a lot
+ #define btFullAssert(x)
#else
+#if defined (__CELLOS_LV2__)
+ #define SIMD_FORCE_INLINE inline
+ #define ATTRIBUTE_ALIGNED16(a) a __attribute__ ((aligned (16)))
+ #ifndef assert
+ #include <assert.h>
+ #endif
+ #define btAssert assert
+ //btFullAssert is optional, slows down a lot
+ #define btFullAssert(x)
+#else
+
//non-windows systems
#define SIMD_FORCE_INLINE inline
@@ -48,16 +67,28 @@ subject to the following restrictions:
#include <assert.h>
#endif
#define btAssert assert
+ //btFullAssert is optional, slows down a lot
+ #define btFullAssert(x)
+#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
+#if defined(BT_USE_DOUBLE_PRECISION)
+typedef double btScalar;
+#else
+typedef float btScalar;
+#endif
-typedef float btScalar;
-///older compilers (gcc 3.x) and Sun needs double versions of srqt etc.
-///exclude Apple Intel (it's assumed to be a Macbook or newer Intel Dual Core processor)
-#if defined (__sun) || defined (__sun__) || defined (__sparc) || (defined (__APPLE__) && ! defined (__i386__))
-//use slow double float precision operation on those platforms
+#if defined(BT_USE_DOUBLE_PRECISION) || defined(BT_FORCE_DOUBLE_FUNCTIONS)
SIMD_FORCE_INLINE btScalar btSqrt(btScalar x) { return sqrt(x); }
SIMD_FORCE_INLINE btScalar btFabs(btScalar x) { return fabs(x); }
@@ -89,14 +120,35 @@ SIMD_FORCE_INLINE btScalar btPow(btScalar x,btScalar y) { return powf(x,y); }
#endif
+#define SIMD_2_PI btScalar(6.283185307179586232)
+#define SIMD_PI (SIMD_2_PI * btScalar(0.5))
+#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 SIMD_2_PI 6.283185307179586232f
-#define SIMD_PI (SIMD_2_PI * btScalar(0.5f))
-#define SIMD_HALF_PI (SIMD_2_PI * btScalar(0.25f))
-#define SIMD_RADS_PER_DEG (SIMD_2_PI / btScalar(360.0f))
-#define SIMD_DEGS_PER_RAD (btScalar(360.0f) / SIMD_2_PI)
+#ifdef BT_USE_DOUBLE_PRECISION
+#define SIMD_EPSILON DBL_EPSILON
+#define SIMD_INFINITY DBL_MAX
+#else
#define SIMD_EPSILON FLT_EPSILON
#define SIMD_INFINITY FLT_MAX
+#endif
+
+SIMD_FORCE_INLINE btScalar btAtan2Fast(btScalar y, btScalar x)
+{
+ btScalar coeff_1 = SIMD_PI / 4.0f;
+ btScalar coeff_2 = 3.0f * coeff_1;
+ btScalar abs_y = btFabs(y);
+ btScalar angle;
+ if (x >= 0.0f) {
+ btScalar r = (x - abs_y) / (x + abs_y);
+ angle = coeff_1 - coeff_1 * r;
+ } else {
+ btScalar r = (x + abs_y) / (abs_y - x);
+ angle = coeff_2 - coeff_1 * r;
+ }
+ return (y < 0.0f) ? -angle : angle;
+}
SIMD_FORCE_INLINE bool btFuzzyZero(btScalar x) { return btFabs(x) < SIMD_EPSILON; }
@@ -117,7 +169,7 @@ SIMD_FORCE_INLINE btScalar btAtan2(btScalar x, btScalar y) { return atan2f(x, y)
*/
SIMD_FORCE_INLINE int btIsNegative(btScalar x) {
- return x < 0.0f ? 1 : 0;
+ return x < btScalar(0.0) ? 1 : 0;
}
SIMD_FORCE_INLINE btScalar btRadians(btScalar x) { return x * SIMD_RADS_PER_DEG; }
diff --git a/extern/bullet2/src/LinearMath/btSimdMinMax.h b/extern/bullet2/src/LinearMath/btSimdMinMax.h
index 2731c8b09f3..75e83f3c53f 100644
--- a/extern/bullet2/src/LinearMath/btSimdMinMax.h
+++ b/extern/bullet2/src/LinearMath/btSimdMinMax.h
@@ -16,7 +16,7 @@ subject to the following restrictions:
#ifndef SIMD_MINMAX_H
#define SIMD_MINMAX_H
-#include "LinearMath/btScalar.h"
+#include "btScalar.h"
template <class T>
SIMD_FORCE_INLINE const T& btMin(const T& a, const T& b) {
diff --git a/extern/bullet2/src/LinearMath/btTransform.h b/extern/bullet2/src/LinearMath/btTransform.h
index 3f9a48407c7..2d55fec83a4 100644
--- a/extern/bullet2/src/LinearMath/btTransform.h
+++ b/extern/bullet2/src/LinearMath/btTransform.h
@@ -17,8 +17,8 @@ subject to the following restrictions:
#ifndef btTransform_H
#define btTransform_H
-#include "LinearMath/btVector3.h"
-#include "LinearMath/btMatrix3x3.h"
+#include "btVector3.h"
+#include "btMatrix3x3.h"
///btTransform supports rigid transforms (only translation and rotation, no scaling/shear)
@@ -42,23 +42,38 @@ public:
m_origin(c)
{}
+ SIMD_FORCE_INLINE btTransform (const btTransform& other)
+ : m_basis(other.m_basis),
+ m_origin(other.m_origin)
+ {
+ }
+
+ SIMD_FORCE_INLINE btTransform& operator=(const btTransform& other)
+ {
+ m_basis = other.m_basis;
+ m_origin = other.m_origin;
+ return *this;
+ }
+
SIMD_FORCE_INLINE void mult(const btTransform& t1, const btTransform& t2) {
m_basis = t1.m_basis * t2.m_basis;
m_origin = t1(t2.m_origin);
}
- void multInverseLeft(const btTransform& t1, const btTransform& t2) {
+/* void multInverseLeft(const btTransform& t1, const btTransform& t2) {
btVector3 v = t2.m_origin - t1.m_origin;
m_basis = btMultTransposeLeft(t1.m_basis, t2.m_basis);
m_origin = v * t1.m_basis;
}
+ */
+
SIMD_FORCE_INLINE btVector3 operator()(const btVector3& x) const
{
- return btVector3(m_basis[0].dot(x) + m_origin[0],
- m_basis[1].dot(x) + m_origin[1],
- m_basis[2].dot(x) + m_origin[2]);
+ return btVector3(m_basis[0].dot(x) + m_origin.x(),
+ m_basis[1].dot(x) + m_origin.y(),
+ m_basis[2].dot(x) + m_origin.z());
}
SIMD_FORCE_INLINE btVector3 operator*(const btVector3& x) const
@@ -88,18 +103,16 @@ public:
void setFromOpenGLMatrix(const btScalar *m)
{
m_basis.setFromOpenGLSubMatrix(m);
- m_origin[0] = m[12];
- m_origin[1] = m[13];
- m_origin[2] = m[14];
+ m_origin.setValue(m[12],m[13],m[14]);
}
void getOpenGLMatrix(btScalar *m) const
{
m_basis.getOpenGLSubMatrix(m);
- m[12] = m_origin[0];
- m[13] = m_origin[1];
- m[14] = m_origin[2];
- m[15] = btScalar(1.0f);
+ m[12] = m_origin.x();
+ m[13] = m_origin.y();
+ m[14] = m_origin.z();
+ m[15] = btScalar(1.0);
}
SIMD_FORCE_INLINE void setOrigin(const btVector3& origin)
diff --git a/extern/bullet2/src/LinearMath/btTransformUtil.h b/extern/bullet2/src/LinearMath/btTransformUtil.h
index 39fa830f4df..bc42fd166b6 100644
--- a/extern/bullet2/src/LinearMath/btTransformUtil.h
+++ b/extern/bullet2/src/LinearMath/btTransformUtil.h
@@ -16,48 +16,40 @@ subject to the following restrictions:
#ifndef SIMD_TRANSFORM_UTIL_H
#define SIMD_TRANSFORM_UTIL_H
-#include "LinearMath/btTransform.h"
-#define ANGULAR_MOTION_THRESHOLD 0.5f*SIMD_HALF_PI
+#include "btTransform.h"
+#define ANGULAR_MOTION_THRESHOLD btScalar(0.5)*SIMD_HALF_PI
#define SIMDSQRT12 btScalar(0.7071067811865475244008443621048490)
-#define btRecipSqrt(x) ((float)(1.0f/btSqrt(float(x)))) /* reciprocal square root */
+#define btRecipSqrt(x) ((btScalar)(btScalar(1.0)/btSqrt(btScalar(x)))) /* reciprocal square root */
inline btVector3 btAabbSupport(const btVector3& halfExtents,const btVector3& supportDir)
{
- return btVector3(supportDir.x() < btScalar(0.0f) ? -halfExtents.x() : halfExtents.x(),
- supportDir.y() < btScalar(0.0f) ? -halfExtents.y() : halfExtents.y(),
- supportDir.z() < btScalar(0.0f) ? -halfExtents.z() : halfExtents.z());
+ return btVector3(supportDir.x() < btScalar(0.0) ? -halfExtents.x() : halfExtents.x(),
+ supportDir.y() < btScalar(0.0) ? -halfExtents.y() : halfExtents.y(),
+ supportDir.z() < btScalar(0.0) ? -halfExtents.z() : halfExtents.z());
}
inline void btPlaneSpace1 (const btVector3& n, btVector3& p, btVector3& q)
{
- if (btFabs(n[2]) > SIMDSQRT12) {
+ 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[0] = 0;
- p[1] = -n[2]*k;
- p[2] = n[1]*k;
+ p.setValue(0,-n[2]*k,n[1]*k);
// set q = n x p
- q[0] = a*k;
- q[1] = -n[0]*p[2];
- q[2] = n[0]*p[1];
+ q.setValue(a*k,-n[0]*p[2],n[0]*p[1]);
}
else {
// choose p in x-y plane
- btScalar a = n[0]*n[0] + n[1]*n[1];
+ btScalar a = n.x()*n.x() + n.y()*n.y();
btScalar k = btRecipSqrt (a);
- p[0] = -n[1]*k;
- p[1] = n[0]*k;
- p[2] = 0;
+ p.setValue(-n.y()*k,n.x()*k,0);
// set q = n x p
- q[0] = -n[2]*p[1];
- q[1] = n[2]*p[0];
- q[2] = a*k;
+ q.setValue(-n.z()*p.y(),n.z()*p.x(),a*k);
}
}
@@ -74,9 +66,9 @@ public:
predictedTransform.setOrigin(curTrans.getOrigin() + linvel * timeStep);
// #define QUATERNION_DERIVATIVE
#ifdef QUATERNION_DERIVATIVE
- btQuaternion orn = curTrans.getRotation();
- orn += (angvel * orn) * (timeStep * 0.5f);
- orn.normalize();
+ btQuaternion predictedOrn = curTrans.getRotation();
+ predictedOrn += (angvel * predictedOrn) * (timeStep * btScalar(0.5));
+ predictedOrn.normalize();
#else
//exponential map
btVector3 axis;
@@ -87,20 +79,21 @@ public:
fAngle = ANGULAR_MOTION_THRESHOLD / timeStep;
}
- if ( fAngle < 0.001f )
+ if ( fAngle < btScalar(0.001) )
{
// use Taylor's expansions of sync function
- axis = angvel*( 0.5f*timeStep-(timeStep*timeStep*timeStep)*(0.020833333333f)*fAngle*fAngle );
+ axis = angvel*( btScalar(0.5)*timeStep-(timeStep*timeStep*timeStep)*(btScalar(0.020833333333))*fAngle*fAngle );
}
else
{
// sync(fAngle) = sin(c*fAngle)/t
- axis = angvel*( btSin(0.5f*fAngle*timeStep)/fAngle );
+ axis = angvel*( btSin(btScalar(0.5)*fAngle*timeStep)/fAngle );
}
- btQuaternion dorn (axis.x(),axis.y(),axis.z(),btCos( fAngle*timeStep*0.5f ));
+ btQuaternion dorn (axis.x(),axis.y(),axis.z(),btCos( fAngle*timeStep*btScalar(0.5) ));
btQuaternion orn0 = curTrans.getRotation();
btQuaternion predictedOrn = dorn * orn0;
+ predictedOrn.normalize();
#endif
predictedTransform.setRotation(predictedOrn);
}
@@ -130,11 +123,11 @@ public:
angle = dorn.getAngle();
axis = btVector3(dorn.x(),dorn.y(),dorn.z());
- axis[3] = 0.f;
+ axis[3] = btScalar(0.);
//check for axis length
btScalar len = axis.length2();
if (len < SIMD_EPSILON*SIMD_EPSILON)
- axis = btVector3(1.f,0.f,0.f);
+ axis = btVector3(btScalar(1.),btScalar(0.),btScalar(0.));
else
axis /= btSqrt(len);
}
diff --git a/extern/bullet2/src/LinearMath/btVector3.h b/extern/bullet2/src/LinearMath/btVector3.h
index 5a35652ecd3..74d41ad2a19 100644
--- a/extern/bullet2/src/LinearMath/btVector3.h
+++ b/extern/bullet2/src/LinearMath/btVector3.h
@@ -19,11 +19,10 @@ subject to the following restrictions:
#include "btQuadWord.h"
-
-///btVector3 is 16byte aligned, and has an extra unused component m_w
-///this extra component can be used by derived classes (Quaternion?) or by user
-class btVector3 : public btQuadWord {
-
+///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
+class btVector3 : public btQuadWord {
public:
SIMD_FORCE_INLINE btVector3() {}
@@ -31,7 +30,7 @@ public:
SIMD_FORCE_INLINE btVector3(const btScalar& x, const btScalar& y, const btScalar& z)
- :btQuadWord(x,y,z,0.f)
+ :btQuadWord(x,y,z,btScalar(0.))
{
}
@@ -64,7 +63,7 @@ public:
SIMD_FORCE_INLINE btVector3& operator/=(const btScalar& s)
{
- assert(s != btScalar(0.0));
+ btFullAssert(s != btScalar(0.0));
return *this *= btScalar(1.0) / s;
}
@@ -99,7 +98,7 @@ public:
SIMD_FORCE_INLINE btScalar angle(const btVector3& v) const
{
btScalar s = btSqrt(length2() * v.length2());
- assert(s != btScalar(0.0));
+ btFullAssert(s != btScalar(0.0));
return btAcos(dot(v) / s);
}
@@ -148,10 +147,10 @@ public:
SIMD_FORCE_INLINE void setInterpolate3(const btVector3& v0, const btVector3& v1, btScalar rt)
{
- btScalar s = 1.0f - rt;
- m_x = s * v0[0] + rt * v1.x();
- m_y = s * v0[1] + rt * v1.y();
- m_z = s * v0[2] + rt * v1.z();
+ btScalar s = btScalar(1.0) - rt;
+ m_x = s * v0.x() + rt * v1.x();
+ m_y = s * v0.y() + rt * v1.y();
+ m_z = s * v0.z() + rt * v1.z();
//don't do the unused w component
// m_co[3] = s * v0[3] + rt * v1[3];
}
@@ -213,7 +212,7 @@ operator*(const btScalar& s, const btVector3& v)
SIMD_FORCE_INLINE btVector3
operator/(const btVector3& v, const btScalar& s)
{
- assert(s != btScalar(0.0));
+ btFullAssert(s != btScalar(0.0));
return v * (btScalar(1.0) / s);
}
@@ -271,7 +270,7 @@ lerp(const btVector3& v1, const btVector3& v2, const btScalar& t)
SIMD_FORCE_INLINE bool operator==(const btVector3& p1, const btVector3& p2)
{
- return p1[0] == p2[0] && p1[1] == p2[1] && p1[2] == p2[2];
+ return p1.x() == p2.x() && p1.y() == p2.y() && p1.z() == p2.z();
}
SIMD_FORCE_INLINE btScalar btVector3::distance2(const btVector3& v) const
@@ -327,13 +326,13 @@ public:
- float getW() const { return m_unusedW;}
+ btScalar getW() const { return m_unusedW;}
SIMD_FORCE_INLINE int maxAxis4() const
{
int maxIndex = -1;
- float maxVal = -1e30f;
+ btScalar maxVal = btScalar(-1e30);
if (m_x > maxVal)
{
maxIndex = 0;
@@ -366,7 +365,7 @@ public:
SIMD_FORCE_INLINE int minAxis4() const
{
int minIndex = -1;
- float minVal = 1e30f;
+ btScalar minVal = btScalar(1e30);
if (m_x < minVal)
{
minIndex = 0;
diff --git a/extern/bullet2/src/SConscript b/extern/bullet2/src/SConscript
index 1220be1b654..6280c49066d 100644
--- a/extern/bullet2/src/SConscript
+++ b/extern/bullet2/src/SConscript
@@ -29,6 +29,7 @@ bulletdyn_src = ["BulletDynamics/ConstraintSolver/btContactConstraint.cpp",
"BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp",
"BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp",
"BulletDynamics/ConstraintSolver/btTypedConstraint.cpp",
+ "BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp",
"BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp",
"BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp",
"BulletDynamics/Dynamics/btRigidBody.cpp",
diff --git a/extern/bullet2/src/btBulletCollisionCommon.h b/extern/bullet2/src/btBulletCollisionCommon.h
index 834dca09e47..8417ccc671f 100644
--- a/extern/bullet2/src/btBulletCollisionCommon.h
+++ b/extern/bullet2/src/btBulletCollisionCommon.h
@@ -25,6 +25,7 @@ subject to the following restrictions:
///Collision Shapes
#include "BulletCollision/CollisionShapes/btBoxShape.h"
#include "BulletCollision/CollisionShapes/btSphereShape.h"
+#include "BulletCollision/CollisionShapes/btCapsuleShape.h"
#include "BulletCollision/CollisionShapes/btCylinderShape.h"
#include "BulletCollision/CollisionShapes/btConeShape.h"
#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h"
diff --git a/extern/bullet2/src/btBulletDynamicsCommon.h b/extern/bullet2/src/btBulletDynamicsCommon.h
index 89211d230fd..25f016cba8a 100644
--- a/extern/bullet2/src/btBulletDynamicsCommon.h
+++ b/extern/bullet2/src/btBulletDynamicsCommon.h
@@ -25,6 +25,7 @@ subject to the following restrictions:
#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h"
#include "BulletDynamics/ConstraintSolver/btHingeConstraint.h"
+#include "BulletDynamics/ConstraintSolver/btConeTwistConstraint.h"
#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h"
diff --git a/extern/qhull/COPYING.txt b/extern/qhull/COPYING.txt
index 1334eba6d0b..1334eba6d0b 100755..100644
--- a/extern/qhull/COPYING.txt
+++ b/extern/qhull/COPYING.txt
diff --git a/extern/qhull/README.txt b/extern/qhull/README.txt
index 9ef958a1f47..9ef958a1f47 100755..100644
--- a/extern/qhull/README.txt
+++ b/extern/qhull/README.txt
diff --git a/extern/qhull/REGISTER.txt b/extern/qhull/REGISTER.txt
index 767eb1c0cda..767eb1c0cda 100755..100644
--- a/extern/qhull/REGISTER.txt
+++ b/extern/qhull/REGISTER.txt
diff --git a/extern/qhull/VisualC6/qhull.dsw b/extern/qhull/VisualC6/qhull.dsw
index 96c68d8e34c..96c68d8e34c 100755..100644
--- a/extern/qhull/VisualC6/qhull.dsw
+++ b/extern/qhull/VisualC6/qhull.dsw
diff --git a/extern/qhull/VisualC6/qhull/qhull.dsp b/extern/qhull/VisualC6/qhull/qhull.dsp
index 6e059b0994c..6e059b0994c 100755..100644
--- a/extern/qhull/VisualC6/qhull/qhull.dsp
+++ b/extern/qhull/VisualC6/qhull/qhull.dsp
diff --git a/extern/qhull/include/qhull/geom.h b/extern/qhull/include/qhull/geom.h
index 32440cff56f..32440cff56f 100755..100644
--- a/extern/qhull/include/qhull/geom.h
+++ b/extern/qhull/include/qhull/geom.h
diff --git a/extern/qhull/include/qhull/io.h b/extern/qhull/include/qhull/io.h
index 351d56b3708..351d56b3708 100755..100644
--- a/extern/qhull/include/qhull/io.h
+++ b/extern/qhull/include/qhull/io.h
diff --git a/extern/qhull/include/qhull/mem.h b/extern/qhull/include/qhull/mem.h
index e9ebd1bb9bc..e9ebd1bb9bc 100755..100644
--- a/extern/qhull/include/qhull/mem.h
+++ b/extern/qhull/include/qhull/mem.h
diff --git a/extern/qhull/include/qhull/merge.h b/extern/qhull/include/qhull/merge.h
index 7fc2afa5967..7fc2afa5967 100755..100644
--- a/extern/qhull/include/qhull/merge.h
+++ b/extern/qhull/include/qhull/merge.h
diff --git a/extern/qhull/include/qhull/poly.h b/extern/qhull/include/qhull/poly.h
index 294ec9527fc..294ec9527fc 100755..100644
--- a/extern/qhull/include/qhull/poly.h
+++ b/extern/qhull/include/qhull/poly.h
diff --git a/extern/qhull/include/qhull/qhull.h b/extern/qhull/include/qhull/qhull.h
index 896ec1e9c18..896ec1e9c18 100755..100644
--- a/extern/qhull/include/qhull/qhull.h
+++ b/extern/qhull/include/qhull/qhull.h
diff --git a/extern/qhull/include/qhull/qhull_a.h b/extern/qhull/include/qhull/qhull_a.h
index d4e69b071be..d4e69b071be 100755..100644
--- a/extern/qhull/include/qhull/qhull_a.h
+++ b/extern/qhull/include/qhull/qhull_a.h
diff --git a/extern/qhull/include/qhull/qset.h b/extern/qhull/include/qhull/qset.h
index 6c0ff758de4..6c0ff758de4 100755..100644
--- a/extern/qhull/include/qhull/qset.h
+++ b/extern/qhull/include/qhull/qset.h
diff --git a/extern/qhull/include/qhull/stat.h b/extern/qhull/include/qhull/stat.h
index 1dae54ed21d..1dae54ed21d 100755..100644
--- a/extern/qhull/include/qhull/stat.h
+++ b/extern/qhull/include/qhull/stat.h
diff --git a/extern/qhull/include/qhull/user.h b/extern/qhull/include/qhull/user.h
index 79558967a52..79558967a52 100755..100644
--- a/extern/qhull/include/qhull/user.h
+++ b/extern/qhull/include/qhull/user.h
diff --git a/extern/qhull/src/Makefile.txt b/extern/qhull/src/Makefile.txt
index e87b66b49bc..e87b66b49bc 100755..100644
--- a/extern/qhull/src/Makefile.txt
+++ b/extern/qhull/src/Makefile.txt
diff --git a/extern/qhull/src/geom.c b/extern/qhull/src/geom.c
index ca4bcaf2541..ca4bcaf2541 100755..100644
--- a/extern/qhull/src/geom.c
+++ b/extern/qhull/src/geom.c
diff --git a/extern/qhull/src/geom.h b/extern/qhull/src/geom.h
index 32440cff56f..32440cff56f 100755..100644
--- a/extern/qhull/src/geom.h
+++ b/extern/qhull/src/geom.h
diff --git a/extern/qhull/src/geom2.c b/extern/qhull/src/geom2.c
index bd58ce1282b..bd58ce1282b 100755..100644
--- a/extern/qhull/src/geom2.c
+++ b/extern/qhull/src/geom2.c
diff --git a/extern/qhull/src/global.c b/extern/qhull/src/global.c
index d3e141aa985..d3e141aa985 100755..100644
--- a/extern/qhull/src/global.c
+++ b/extern/qhull/src/global.c
diff --git a/extern/qhull/src/io.c b/extern/qhull/src/io.c
index 9b0ccdd0b24..9b0ccdd0b24 100755..100644
--- a/extern/qhull/src/io.c
+++ b/extern/qhull/src/io.c
diff --git a/extern/qhull/src/io.h b/extern/qhull/src/io.h
index 351d56b3708..351d56b3708 100755..100644
--- a/extern/qhull/src/io.h
+++ b/extern/qhull/src/io.h
diff --git a/extern/qhull/src/mem.c b/extern/qhull/src/mem.c
index 72934626684..72934626684 100755..100644
--- a/extern/qhull/src/mem.c
+++ b/extern/qhull/src/mem.c
diff --git a/extern/qhull/src/mem.h b/extern/qhull/src/mem.h
index e9ebd1bb9bc..e9ebd1bb9bc 100755..100644
--- a/extern/qhull/src/mem.h
+++ b/extern/qhull/src/mem.h
diff --git a/extern/qhull/src/merge.c b/extern/qhull/src/merge.c
index 34ecda1865f..34ecda1865f 100755..100644
--- a/extern/qhull/src/merge.c
+++ b/extern/qhull/src/merge.c
diff --git a/extern/qhull/src/merge.h b/extern/qhull/src/merge.h
index 7fc2afa5967..7fc2afa5967 100755..100644
--- a/extern/qhull/src/merge.h
+++ b/extern/qhull/src/merge.h
diff --git a/extern/qhull/src/poly.c b/extern/qhull/src/poly.c
index 6319e43d66a..6319e43d66a 100755..100644
--- a/extern/qhull/src/poly.c
+++ b/extern/qhull/src/poly.c
diff --git a/extern/qhull/src/poly.h b/extern/qhull/src/poly.h
index 294ec9527fc..294ec9527fc 100755..100644
--- a/extern/qhull/src/poly.h
+++ b/extern/qhull/src/poly.h
diff --git a/extern/qhull/src/poly2.c b/extern/qhull/src/poly2.c
index 713faab8bed..713faab8bed 100755..100644
--- a/extern/qhull/src/poly2.c
+++ b/extern/qhull/src/poly2.c
diff --git a/extern/qhull/src/qconvex.c b/extern/qhull/src/qconvex.c
index 67b78646e50..67b78646e50 100755..100644
--- a/extern/qhull/src/qconvex.c
+++ b/extern/qhull/src/qconvex.c
diff --git a/extern/qhull/src/qdelaun.c b/extern/qhull/src/qdelaun.c
index 0e49d9c381e..0e49d9c381e 100755..100644
--- a/extern/qhull/src/qdelaun.c
+++ b/extern/qhull/src/qdelaun.c
diff --git a/extern/qhull/src/qhalf.c b/extern/qhull/src/qhalf.c
index a2b3875dd7f..a2b3875dd7f 100755..100644
--- a/extern/qhull/src/qhalf.c
+++ b/extern/qhull/src/qhalf.c
diff --git a/extern/qhull/src/qhull.c b/extern/qhull/src/qhull.c
index dc835bb4f28..dc835bb4f28 100755..100644
--- a/extern/qhull/src/qhull.c
+++ b/extern/qhull/src/qhull.c
diff --git a/extern/qhull/src/qhull.h b/extern/qhull/src/qhull.h
index 896ec1e9c18..896ec1e9c18 100755..100644
--- a/extern/qhull/src/qhull.h
+++ b/extern/qhull/src/qhull.h
diff --git a/extern/qhull/src/qhull_a.h b/extern/qhull/src/qhull_a.h
index d4e69b071be..d4e69b071be 100755..100644
--- a/extern/qhull/src/qhull_a.h
+++ b/extern/qhull/src/qhull_a.h
diff --git a/extern/qhull/src/qhull_interface.cpp b/extern/qhull/src/qhull_interface.cpp
index 6ecc640e82b..6ecc640e82b 100755..100644
--- a/extern/qhull/src/qhull_interface.cpp
+++ b/extern/qhull/src/qhull_interface.cpp
diff --git a/extern/qhull/src/qset.c b/extern/qhull/src/qset.c
index 9e78464c07e..9e78464c07e 100755..100644
--- a/extern/qhull/src/qset.c
+++ b/extern/qhull/src/qset.c
diff --git a/extern/qhull/src/qset.h b/extern/qhull/src/qset.h
index 6c0ff758de4..6c0ff758de4 100755..100644
--- a/extern/qhull/src/qset.h
+++ b/extern/qhull/src/qset.h
diff --git a/extern/qhull/src/qvoronoi.c b/extern/qhull/src/qvoronoi.c
index ebeb7367b87..ebeb7367b87 100755..100644
--- a/extern/qhull/src/qvoronoi.c
+++ b/extern/qhull/src/qvoronoi.c
diff --git a/extern/qhull/src/rbox.c b/extern/qhull/src/rbox.c
index 1c288bddc96..1c288bddc96 100755..100644
--- a/extern/qhull/src/rbox.c
+++ b/extern/qhull/src/rbox.c
diff --git a/extern/qhull/src/stat.c b/extern/qhull/src/stat.c
index ede0323cb88..ede0323cb88 100755..100644
--- a/extern/qhull/src/stat.c
+++ b/extern/qhull/src/stat.c
diff --git a/extern/qhull/src/stat.h b/extern/qhull/src/stat.h
index 1dae54ed21d..1dae54ed21d 100755..100644
--- a/extern/qhull/src/stat.h
+++ b/extern/qhull/src/stat.h
diff --git a/extern/qhull/src/unix.c b/extern/qhull/src/unix.c
index 5ec5feab16c..5ec5feab16c 100755..100644
--- a/extern/qhull/src/unix.c
+++ b/extern/qhull/src/unix.c
diff --git a/extern/qhull/src/user.c b/extern/qhull/src/user.c
index 94b31aaf99f..94b31aaf99f 100755..100644
--- a/extern/qhull/src/user.c
+++ b/extern/qhull/src/user.c
diff --git a/extern/qhull/src/user.h b/extern/qhull/src/user.h
index 79558967a52..79558967a52 100755..100644
--- a/extern/qhull/src/user.h
+++ b/extern/qhull/src/user.h
diff --git a/extern/qhull/src/user_eg.c b/extern/qhull/src/user_eg.c
index 97e4aa7a89a..97e4aa7a89a 100755..100644
--- a/extern/qhull/src/user_eg.c
+++ b/extern/qhull/src/user_eg.c
diff --git a/extern/qhull/src/user_eg2.c b/extern/qhull/src/user_eg2.c
index 1eb42ccfe8a..1eb42ccfe8a 100755..100644
--- a/extern/qhull/src/user_eg2.c
+++ b/extern/qhull/src/user_eg2.c
diff --git a/extern/solid/LICENSE_GPL.txt b/extern/solid/LICENSE_GPL.txt
index 07db89585a2..07db89585a2 100755..100644
--- a/extern/solid/LICENSE_GPL.txt
+++ b/extern/solid/LICENSE_GPL.txt
diff --git a/extern/solid/LICENSE_QPL.txt b/extern/solid/LICENSE_QPL.txt
index 3fca00466e2..3fca00466e2 100755..100644
--- a/extern/solid/LICENSE_QPL.txt
+++ b/extern/solid/LICENSE_QPL.txt
diff --git a/extern/solid/Makefile b/extern/solid/Makefile
index ed5a1359cf4..ed5a1359cf4 100755..100644
--- a/extern/solid/Makefile
+++ b/extern/solid/Makefile
diff --git a/extern/solid/README.txt b/extern/solid/README.txt
index 348d92b35cb..348d92b35cb 100755..100644
--- a/extern/solid/README.txt
+++ b/extern/solid/README.txt
diff --git a/extern/solid/VisualC6/broad/broad.dsp b/extern/solid/VisualC6/broad/broad.dsp
index 1161d68fcd6..1161d68fcd6 100755..100644
--- a/extern/solid/VisualC6/broad/broad.dsp
+++ b/extern/solid/VisualC6/broad/broad.dsp
diff --git a/extern/solid/VisualC6/complex/complex.dsp b/extern/solid/VisualC6/complex/complex.dsp
index 74ea67b9e23..74ea67b9e23 100755..100644
--- a/extern/solid/VisualC6/complex/complex.dsp
+++ b/extern/solid/VisualC6/complex/complex.dsp
diff --git a/extern/solid/VisualC6/convex/convex.dsp b/extern/solid/VisualC6/convex/convex.dsp
index ec9caace9d9..ec9caace9d9 100755..100644
--- a/extern/solid/VisualC6/convex/convex.dsp
+++ b/extern/solid/VisualC6/convex/convex.dsp
diff --git a/extern/solid/VisualC6/dynamics/dynamics.dsp b/extern/solid/VisualC6/dynamics/dynamics.dsp
index 9659cbf8a56..9659cbf8a56 100755..100644
--- a/extern/solid/VisualC6/dynamics/dynamics.dsp
+++ b/extern/solid/VisualC6/dynamics/dynamics.dsp
diff --git a/extern/solid/VisualC6/gldemo/gldemo.dsp b/extern/solid/VisualC6/gldemo/gldemo.dsp
index f3cde286161..f3cde286161 100755..100644
--- a/extern/solid/VisualC6/gldemo/gldemo.dsp
+++ b/extern/solid/VisualC6/gldemo/gldemo.dsp
diff --git a/extern/solid/VisualC6/mnm/mnm.dsp b/extern/solid/VisualC6/mnm/mnm.dsp
index 2df6d951794..2df6d951794 100755..100644
--- a/extern/solid/VisualC6/mnm/mnm.dsp
+++ b/extern/solid/VisualC6/mnm/mnm.dsp
diff --git a/extern/solid/VisualC6/physics/physics.dsp b/extern/solid/VisualC6/physics/physics.dsp
index dd69b6a35b2..dd69b6a35b2 100755..100644
--- a/extern/solid/VisualC6/physics/physics.dsp
+++ b/extern/solid/VisualC6/physics/physics.dsp
diff --git a/extern/solid/VisualC6/sample/sample.dsp b/extern/solid/VisualC6/sample/sample.dsp
index c6e0423cd04..c6e0423cd04 100755..100644
--- a/extern/solid/VisualC6/sample/sample.dsp
+++ b/extern/solid/VisualC6/sample/sample.dsp
diff --git a/extern/solid/VisualC6/solid.dsw b/extern/solid/VisualC6/solid.dsw
index 397cc4bf371..397cc4bf371 100755..100644
--- a/extern/solid/VisualC6/solid.dsw
+++ b/extern/solid/VisualC6/solid.dsw
diff --git a/extern/solid/VisualC6/solid/solid.dsp b/extern/solid/VisualC6/solid/solid.dsp
index 4ac7459c2f9..4ac7459c2f9 100755..100644
--- a/extern/solid/VisualC6/solid/solid.dsp
+++ b/extern/solid/VisualC6/solid/solid.dsp
diff --git a/extern/solid/VisualC6/solid_dll/solid_dll.dsp b/extern/solid/VisualC6/solid_dll/solid_dll.dsp
index eed092502e0..eed092502e0 100755..100644
--- a/extern/solid/VisualC6/solid_dll/solid_dll.dsp
+++ b/extern/solid/VisualC6/solid_dll/solid_dll.dsp
diff --git a/extern/solid/include/GEN_MinMax.h b/extern/solid/include/GEN_MinMax.h
index 9ea961cfe4f..9ea961cfe4f 100755..100644
--- a/extern/solid/include/GEN_MinMax.h
+++ b/extern/solid/include/GEN_MinMax.h
diff --git a/extern/solid/include/GEN_random.h b/extern/solid/include/GEN_random.h
index 4690a05511a..4690a05511a 100755..100644
--- a/extern/solid/include/GEN_random.h
+++ b/extern/solid/include/GEN_random.h
diff --git a/extern/solid/include/MT/Interval.h b/extern/solid/include/MT/Interval.h
index c6ba2fc1681..c6ba2fc1681 100755..100644
--- a/extern/solid/include/MT/Interval.h
+++ b/extern/solid/include/MT/Interval.h
diff --git a/extern/solid/include/MT/Matrix3x3.h b/extern/solid/include/MT/Matrix3x3.h
index 85e0d4cac84..85e0d4cac84 100755..100644
--- a/extern/solid/include/MT/Matrix3x3.h
+++ b/extern/solid/include/MT/Matrix3x3.h
diff --git a/extern/solid/include/MT/Quaternion.h b/extern/solid/include/MT/Quaternion.h
index a925f21cd5d..a925f21cd5d 100755..100644
--- a/extern/solid/include/MT/Quaternion.h
+++ b/extern/solid/include/MT/Quaternion.h
diff --git a/extern/solid/include/MT/Transform.h b/extern/solid/include/MT/Transform.h
index b80dc1bc18b..b80dc1bc18b 100755..100644
--- a/extern/solid/include/MT/Transform.h
+++ b/extern/solid/include/MT/Transform.h
diff --git a/extern/solid/include/MT/Tuple3.h b/extern/solid/include/MT/Tuple3.h
index 52ea33b7f58..52ea33b7f58 100755..100644
--- a/extern/solid/include/MT/Tuple3.h
+++ b/extern/solid/include/MT/Tuple3.h
diff --git a/extern/solid/include/MT/Tuple4.h b/extern/solid/include/MT/Tuple4.h
index 6930541271e..6930541271e 100755..100644
--- a/extern/solid/include/MT/Tuple4.h
+++ b/extern/solid/include/MT/Tuple4.h
diff --git a/extern/solid/include/MT/Vector3.h b/extern/solid/include/MT/Vector3.h
index b569c003f59..b569c003f59 100755..100644
--- a/extern/solid/include/MT/Vector3.h
+++ b/extern/solid/include/MT/Vector3.h
diff --git a/extern/solid/include/MT_BBox.h b/extern/solid/include/MT_BBox.h
index b5dc537e0d9..b5dc537e0d9 100755..100644
--- a/extern/solid/include/MT_BBox.h
+++ b/extern/solid/include/MT_BBox.h
diff --git a/extern/solid/include/MT_Interval.h b/extern/solid/include/MT_Interval.h
index 25ebfd0a67d..25ebfd0a67d 100755..100644
--- a/extern/solid/include/MT_Interval.h
+++ b/extern/solid/include/MT_Interval.h
diff --git a/extern/solid/include/MT_Matrix3x3.h b/extern/solid/include/MT_Matrix3x3.h
index f7572f90fa2..f7572f90fa2 100755..100644
--- a/extern/solid/include/MT_Matrix3x3.h
+++ b/extern/solid/include/MT_Matrix3x3.h
diff --git a/extern/solid/include/MT_Point3.h b/extern/solid/include/MT_Point3.h
index ca84f652b65..ca84f652b65 100755..100644
--- a/extern/solid/include/MT_Point3.h
+++ b/extern/solid/include/MT_Point3.h
diff --git a/extern/solid/include/MT_Quaternion.h b/extern/solid/include/MT_Quaternion.h
index ca860db711c..ca860db711c 100755..100644
--- a/extern/solid/include/MT_Quaternion.h
+++ b/extern/solid/include/MT_Quaternion.h
diff --git a/extern/solid/include/MT_Scalar.h b/extern/solid/include/MT_Scalar.h
index 663a1f1839c..663a1f1839c 100755..100644
--- a/extern/solid/include/MT_Scalar.h
+++ b/extern/solid/include/MT_Scalar.h
diff --git a/extern/solid/include/MT_Transform.h b/extern/solid/include/MT_Transform.h
index 66f92428054..66f92428054 100755..100644
--- a/extern/solid/include/MT_Transform.h
+++ b/extern/solid/include/MT_Transform.h
diff --git a/extern/solid/include/MT_Vector3.h b/extern/solid/include/MT_Vector3.h
index d50e80dc287..d50e80dc287 100755..100644
--- a/extern/solid/include/MT_Vector3.h
+++ b/extern/solid/include/MT_Vector3.h
diff --git a/extern/solid/include/SOLID.h b/extern/solid/include/SOLID.h
index 96d40f1ea6b..96d40f1ea6b 100755..100644
--- a/extern/solid/include/SOLID.h
+++ b/extern/solid/include/SOLID.h
diff --git a/extern/solid/include/SOLID_broad.h b/extern/solid/include/SOLID_broad.h
index 74e4214fa67..74e4214fa67 100755..100644
--- a/extern/solid/include/SOLID_broad.h
+++ b/extern/solid/include/SOLID_broad.h
diff --git a/extern/solid/include/SOLID_types.h b/extern/solid/include/SOLID_types.h
index 630594e447f..630594e447f 100755..100644
--- a/extern/solid/include/SOLID_types.h
+++ b/extern/solid/include/SOLID_types.h
diff --git a/extern/solid/src/DT_AlgoTable.h b/extern/solid/src/DT_AlgoTable.h
index 0749ca7fdd9..0749ca7fdd9 100755..100644
--- a/extern/solid/src/DT_AlgoTable.h
+++ b/extern/solid/src/DT_AlgoTable.h
diff --git a/extern/solid/src/DT_C-api.cpp b/extern/solid/src/DT_C-api.cpp
index ac16deda87d..ac16deda87d 100755..100644
--- a/extern/solid/src/DT_C-api.cpp
+++ b/extern/solid/src/DT_C-api.cpp
diff --git a/extern/solid/src/DT_Encounter.cpp b/extern/solid/src/DT_Encounter.cpp
index 36de33154a3..36de33154a3 100755..100644
--- a/extern/solid/src/DT_Encounter.cpp
+++ b/extern/solid/src/DT_Encounter.cpp
diff --git a/extern/solid/src/DT_Encounter.h b/extern/solid/src/DT_Encounter.h
index f20ea3936b0..f20ea3936b0 100755..100644
--- a/extern/solid/src/DT_Encounter.h
+++ b/extern/solid/src/DT_Encounter.h
diff --git a/extern/solid/src/DT_Object.cpp b/extern/solid/src/DT_Object.cpp
index ed43a7bdaf2..ed43a7bdaf2 100755..100644
--- a/extern/solid/src/DT_Object.cpp
+++ b/extern/solid/src/DT_Object.cpp
diff --git a/extern/solid/src/DT_Object.h b/extern/solid/src/DT_Object.h
index 78beee2ab57..78beee2ab57 100755..100644
--- a/extern/solid/src/DT_Object.h
+++ b/extern/solid/src/DT_Object.h
diff --git a/extern/solid/src/DT_RespTable.cpp b/extern/solid/src/DT_RespTable.cpp
index 20fbfc06aac..20fbfc06aac 100755..100644
--- a/extern/solid/src/DT_RespTable.cpp
+++ b/extern/solid/src/DT_RespTable.cpp
diff --git a/extern/solid/src/DT_RespTable.h b/extern/solid/src/DT_RespTable.h
index 9a17f562937..9a17f562937 100755..100644
--- a/extern/solid/src/DT_RespTable.h
+++ b/extern/solid/src/DT_RespTable.h
diff --git a/extern/solid/src/DT_Response.h b/extern/solid/src/DT_Response.h
index e58d9bb9944..e58d9bb9944 100755..100644
--- a/extern/solid/src/DT_Response.h
+++ b/extern/solid/src/DT_Response.h
diff --git a/extern/solid/src/DT_Scene.cpp b/extern/solid/src/DT_Scene.cpp
index 56cea1633ca..56cea1633ca 100755..100644
--- a/extern/solid/src/DT_Scene.cpp
+++ b/extern/solid/src/DT_Scene.cpp
diff --git a/extern/solid/src/DT_Scene.h b/extern/solid/src/DT_Scene.h
index 9b061910312..9b061910312 100755..100644
--- a/extern/solid/src/DT_Scene.h
+++ b/extern/solid/src/DT_Scene.h
diff --git a/extern/solid/src/broad/BP_C-api.cpp b/extern/solid/src/broad/BP_C-api.cpp
index 43e1172927b..43e1172927b 100755..100644
--- a/extern/solid/src/broad/BP_C-api.cpp
+++ b/extern/solid/src/broad/BP_C-api.cpp
diff --git a/extern/solid/src/broad/BP_Endpoint.h b/extern/solid/src/broad/BP_Endpoint.h
index 8de6e67ce65..8de6e67ce65 100755..100644
--- a/extern/solid/src/broad/BP_Endpoint.h
+++ b/extern/solid/src/broad/BP_Endpoint.h
diff --git a/extern/solid/src/broad/BP_EndpointList.cpp b/extern/solid/src/broad/BP_EndpointList.cpp
index aa094ffeb0a..aa094ffeb0a 100755..100644
--- a/extern/solid/src/broad/BP_EndpointList.cpp
+++ b/extern/solid/src/broad/BP_EndpointList.cpp
diff --git a/extern/solid/src/broad/BP_EndpointList.h b/extern/solid/src/broad/BP_EndpointList.h
index 6154991ed3d..6154991ed3d 100755..100644
--- a/extern/solid/src/broad/BP_EndpointList.h
+++ b/extern/solid/src/broad/BP_EndpointList.h
diff --git a/extern/solid/src/broad/BP_Proxy.cpp b/extern/solid/src/broad/BP_Proxy.cpp
index e8007df240d..e8007df240d 100755..100644
--- a/extern/solid/src/broad/BP_Proxy.cpp
+++ b/extern/solid/src/broad/BP_Proxy.cpp
diff --git a/extern/solid/src/broad/BP_Proxy.h b/extern/solid/src/broad/BP_Proxy.h
index b4500ddca44..b4500ddca44 100755..100644
--- a/extern/solid/src/broad/BP_Proxy.h
+++ b/extern/solid/src/broad/BP_Proxy.h
diff --git a/extern/solid/src/broad/BP_ProxyList.h b/extern/solid/src/broad/BP_ProxyList.h
index 2f449777d2d..2f449777d2d 100755..100644
--- a/extern/solid/src/broad/BP_ProxyList.h
+++ b/extern/solid/src/broad/BP_ProxyList.h
diff --git a/extern/solid/src/broad/BP_Scene.cpp b/extern/solid/src/broad/BP_Scene.cpp
index c0cd83ba311..c0cd83ba311 100755..100644
--- a/extern/solid/src/broad/BP_Scene.cpp
+++ b/extern/solid/src/broad/BP_Scene.cpp
diff --git a/extern/solid/src/broad/BP_Scene.h b/extern/solid/src/broad/BP_Scene.h
index ef55374c43b..ef55374c43b 100755..100644
--- a/extern/solid/src/broad/BP_Scene.h
+++ b/extern/solid/src/broad/BP_Scene.h
diff --git a/extern/solid/src/complex/DT_BBoxTree.cpp b/extern/solid/src/complex/DT_BBoxTree.cpp
index 4f10f61f2e2..4f10f61f2e2 100755..100644
--- a/extern/solid/src/complex/DT_BBoxTree.cpp
+++ b/extern/solid/src/complex/DT_BBoxTree.cpp
diff --git a/extern/solid/src/complex/DT_BBoxTree.h b/extern/solid/src/complex/DT_BBoxTree.h
index 3d9da6e34ba..3d9da6e34ba 100755..100644
--- a/extern/solid/src/complex/DT_BBoxTree.h
+++ b/extern/solid/src/complex/DT_BBoxTree.h
diff --git a/extern/solid/src/complex/DT_CBox.h b/extern/solid/src/complex/DT_CBox.h
index 7fc7c5df4db..7fc7c5df4db 100755..100644
--- a/extern/solid/src/complex/DT_CBox.h
+++ b/extern/solid/src/complex/DT_CBox.h
diff --git a/extern/solid/src/complex/DT_Complex.cpp b/extern/solid/src/complex/DT_Complex.cpp
index 023383a8427..023383a8427 100755..100644
--- a/extern/solid/src/complex/DT_Complex.cpp
+++ b/extern/solid/src/complex/DT_Complex.cpp
diff --git a/extern/solid/src/complex/DT_Complex.h b/extern/solid/src/complex/DT_Complex.h
index ae08a05d4c9..ae08a05d4c9 100755..100644
--- a/extern/solid/src/complex/DT_Complex.h
+++ b/extern/solid/src/complex/DT_Complex.h
diff --git a/extern/solid/src/convex/DT_Accuracy.cpp b/extern/solid/src/convex/DT_Accuracy.cpp
index 113275b0dbd..113275b0dbd 100755..100644
--- a/extern/solid/src/convex/DT_Accuracy.cpp
+++ b/extern/solid/src/convex/DT_Accuracy.cpp
diff --git a/extern/solid/src/convex/DT_Accuracy.h b/extern/solid/src/convex/DT_Accuracy.h
index 9759a6fd4c5..9759a6fd4c5 100755..100644
--- a/extern/solid/src/convex/DT_Accuracy.h
+++ b/extern/solid/src/convex/DT_Accuracy.h
diff --git a/extern/solid/src/convex/DT_Array.h b/extern/solid/src/convex/DT_Array.h
index 1694f884e53..1694f884e53 100755..100644
--- a/extern/solid/src/convex/DT_Array.h
+++ b/extern/solid/src/convex/DT_Array.h
diff --git a/extern/solid/src/convex/DT_Box.cpp b/extern/solid/src/convex/DT_Box.cpp
index 0b46f566fe8..0b46f566fe8 100755..100644
--- a/extern/solid/src/convex/DT_Box.cpp
+++ b/extern/solid/src/convex/DT_Box.cpp
diff --git a/extern/solid/src/convex/DT_Box.h b/extern/solid/src/convex/DT_Box.h
index ace9634b5e3..ace9634b5e3 100755..100644
--- a/extern/solid/src/convex/DT_Box.h
+++ b/extern/solid/src/convex/DT_Box.h
diff --git a/extern/solid/src/convex/DT_Cone.cpp b/extern/solid/src/convex/DT_Cone.cpp
index 1dd6a7ddbbe..1dd6a7ddbbe 100755..100644
--- a/extern/solid/src/convex/DT_Cone.cpp
+++ b/extern/solid/src/convex/DT_Cone.cpp
diff --git a/extern/solid/src/convex/DT_Cone.h b/extern/solid/src/convex/DT_Cone.h
index 85e416877dd..85e416877dd 100755..100644
--- a/extern/solid/src/convex/DT_Cone.h
+++ b/extern/solid/src/convex/DT_Cone.h
diff --git a/extern/solid/src/convex/DT_Convex.cpp b/extern/solid/src/convex/DT_Convex.cpp
index 3be47f6ed02..3be47f6ed02 100755..100644
--- a/extern/solid/src/convex/DT_Convex.cpp
+++ b/extern/solid/src/convex/DT_Convex.cpp
diff --git a/extern/solid/src/convex/DT_Convex.h b/extern/solid/src/convex/DT_Convex.h
index dd620ac8b98..dd620ac8b98 100755..100644
--- a/extern/solid/src/convex/DT_Convex.h
+++ b/extern/solid/src/convex/DT_Convex.h
diff --git a/extern/solid/src/convex/DT_Cylinder.cpp b/extern/solid/src/convex/DT_Cylinder.cpp
index cff5ebcefb1..cff5ebcefb1 100755..100644
--- a/extern/solid/src/convex/DT_Cylinder.cpp
+++ b/extern/solid/src/convex/DT_Cylinder.cpp
diff --git a/extern/solid/src/convex/DT_Cylinder.h b/extern/solid/src/convex/DT_Cylinder.h
index 2a0c07fd579..2a0c07fd579 100755..100644
--- a/extern/solid/src/convex/DT_Cylinder.h
+++ b/extern/solid/src/convex/DT_Cylinder.h
diff --git a/extern/solid/src/convex/DT_Facet.cpp b/extern/solid/src/convex/DT_Facet.cpp
index 87ae5c3e0be..87ae5c3e0be 100755..100644
--- a/extern/solid/src/convex/DT_Facet.cpp
+++ b/extern/solid/src/convex/DT_Facet.cpp
diff --git a/extern/solid/src/convex/DT_Facet.h b/extern/solid/src/convex/DT_Facet.h
index 873706346b8..873706346b8 100755..100644
--- a/extern/solid/src/convex/DT_Facet.h
+++ b/extern/solid/src/convex/DT_Facet.h
diff --git a/extern/solid/src/convex/DT_GJK.h b/extern/solid/src/convex/DT_GJK.h
index d8f44acf85e..d8f44acf85e 100755..100644
--- a/extern/solid/src/convex/DT_GJK.h
+++ b/extern/solid/src/convex/DT_GJK.h
diff --git a/extern/solid/src/convex/DT_Hull.h b/extern/solid/src/convex/DT_Hull.h
index a5bf56ae59d..a5bf56ae59d 100755..100644
--- a/extern/solid/src/convex/DT_Hull.h
+++ b/extern/solid/src/convex/DT_Hull.h
diff --git a/extern/solid/src/convex/DT_IndexArray.h b/extern/solid/src/convex/DT_IndexArray.h
index 95551fa8483..95551fa8483 100755..100644
--- a/extern/solid/src/convex/DT_IndexArray.h
+++ b/extern/solid/src/convex/DT_IndexArray.h
diff --git a/extern/solid/src/convex/DT_LineSegment.cpp b/extern/solid/src/convex/DT_LineSegment.cpp
index 6c7ccf6b9b7..6c7ccf6b9b7 100755..100644
--- a/extern/solid/src/convex/DT_LineSegment.cpp
+++ b/extern/solid/src/convex/DT_LineSegment.cpp
diff --git a/extern/solid/src/convex/DT_LineSegment.h b/extern/solid/src/convex/DT_LineSegment.h
index 979ff8a18a9..979ff8a18a9 100755..100644
--- a/extern/solid/src/convex/DT_LineSegment.h
+++ b/extern/solid/src/convex/DT_LineSegment.h
diff --git a/extern/solid/src/convex/DT_Minkowski.h b/extern/solid/src/convex/DT_Minkowski.h
index e90fed6a8e0..e90fed6a8e0 100755..100644
--- a/extern/solid/src/convex/DT_Minkowski.h
+++ b/extern/solid/src/convex/DT_Minkowski.h
diff --git a/extern/solid/src/convex/DT_PenDepth.cpp b/extern/solid/src/convex/DT_PenDepth.cpp
index e1c5c9a3949..e1c5c9a3949 100755..100644
--- a/extern/solid/src/convex/DT_PenDepth.cpp
+++ b/extern/solid/src/convex/DT_PenDepth.cpp
diff --git a/extern/solid/src/convex/DT_PenDepth.h b/extern/solid/src/convex/DT_PenDepth.h
index 97b3c6c0e0e..97b3c6c0e0e 100755..100644
--- a/extern/solid/src/convex/DT_PenDepth.h
+++ b/extern/solid/src/convex/DT_PenDepth.h
diff --git a/extern/solid/src/convex/DT_Point.cpp b/extern/solid/src/convex/DT_Point.cpp
index 770fe7775b7..770fe7775b7 100755..100644
--- a/extern/solid/src/convex/DT_Point.cpp
+++ b/extern/solid/src/convex/DT_Point.cpp
diff --git a/extern/solid/src/convex/DT_Point.h b/extern/solid/src/convex/DT_Point.h
index b35d158ee53..b35d158ee53 100755..100644
--- a/extern/solid/src/convex/DT_Point.h
+++ b/extern/solid/src/convex/DT_Point.h
diff --git a/extern/solid/src/convex/DT_Polyhedron.cpp b/extern/solid/src/convex/DT_Polyhedron.cpp
index f48ac6e4b6d..f48ac6e4b6d 100755..100644
--- a/extern/solid/src/convex/DT_Polyhedron.cpp
+++ b/extern/solid/src/convex/DT_Polyhedron.cpp
diff --git a/extern/solid/src/convex/DT_Polyhedron.h b/extern/solid/src/convex/DT_Polyhedron.h
index 58c991bd152..58c991bd152 100755..100644
--- a/extern/solid/src/convex/DT_Polyhedron.h
+++ b/extern/solid/src/convex/DT_Polyhedron.h
diff --git a/extern/solid/src/convex/DT_Polytope.cpp b/extern/solid/src/convex/DT_Polytope.cpp
index e757c3bfdb4..e757c3bfdb4 100755..100644
--- a/extern/solid/src/convex/DT_Polytope.cpp
+++ b/extern/solid/src/convex/DT_Polytope.cpp
diff --git a/extern/solid/src/convex/DT_Polytope.h b/extern/solid/src/convex/DT_Polytope.h
index c715598defe..c715598defe 100755..100644
--- a/extern/solid/src/convex/DT_Polytope.h
+++ b/extern/solid/src/convex/DT_Polytope.h
diff --git a/extern/solid/src/convex/DT_Shape.h b/extern/solid/src/convex/DT_Shape.h
index d48942fe515..d48942fe515 100755..100644
--- a/extern/solid/src/convex/DT_Shape.h
+++ b/extern/solid/src/convex/DT_Shape.h
diff --git a/extern/solid/src/convex/DT_Sphere.cpp b/extern/solid/src/convex/DT_Sphere.cpp
index 3f2443dcf53..3f2443dcf53 100755..100644
--- a/extern/solid/src/convex/DT_Sphere.cpp
+++ b/extern/solid/src/convex/DT_Sphere.cpp
diff --git a/extern/solid/src/convex/DT_Sphere.h b/extern/solid/src/convex/DT_Sphere.h
index 92386a66f3a..92386a66f3a 100755..100644
--- a/extern/solid/src/convex/DT_Sphere.h
+++ b/extern/solid/src/convex/DT_Sphere.h
diff --git a/extern/solid/src/convex/DT_Transform.h b/extern/solid/src/convex/DT_Transform.h
index a976d48d22b..a976d48d22b 100755..100644
--- a/extern/solid/src/convex/DT_Transform.h
+++ b/extern/solid/src/convex/DT_Transform.h
diff --git a/extern/solid/src/convex/DT_Triangle.cpp b/extern/solid/src/convex/DT_Triangle.cpp
index 1917910b39d..1917910b39d 100755..100644
--- a/extern/solid/src/convex/DT_Triangle.cpp
+++ b/extern/solid/src/convex/DT_Triangle.cpp
diff --git a/extern/solid/src/convex/DT_Triangle.h b/extern/solid/src/convex/DT_Triangle.h
index 4192b5629ac..4192b5629ac 100755..100644
--- a/extern/solid/src/convex/DT_Triangle.h
+++ b/extern/solid/src/convex/DT_Triangle.h
diff --git a/extern/solid/src/convex/DT_VertexBase.h b/extern/solid/src/convex/DT_VertexBase.h
index 37646fdd935..37646fdd935 100755..100644
--- a/extern/solid/src/convex/DT_VertexBase.h
+++ b/extern/solid/src/convex/DT_VertexBase.h
diff --git a/extern/verse/Makefile b/extern/verse/Makefile
index 91ab4d26eaa..2e88ee2223f 100644
--- a/extern/verse/Makefile
+++ b/extern/verse/Makefile
@@ -34,6 +34,7 @@ DIR = $(OCGDIR)/$(SOURCEDIR)
DIRS = dist
include nan_subdirs.mk
+include nan_compile.mk
include nan_link.mk
DISTDIR = dist
@@ -53,5 +54,5 @@ install: all debug
ifeq ($(OS),darwin)
ranlib $(NAN_VERSE)/lib/libverse.a
endif
- $(CC) $(LDFLAGS) -o $(DIR)/verse$(EXT) $(DIR)/libverse.a $(LIBS) $(SLIBS) $(LLIBS) $(DADD) $(LOPTS)
+ $(CCC) $(LDFLAGS) -o $(DIR)/verse$(EXT) $(DIR)/libverse.a $(LIBS) $(SLIBS) $(LLIBS) $(DADD) $(LOPTS)
@$(CP) $(DIR)/verse$(EXT) $(OCGDIR)/bin
diff --git a/extern/verse/dist/v_connection.c b/extern/verse/dist/v_connection.c
index 2a97ec66ed1..3bfafad5660 100644
--- a/extern/verse/dist/v_connection.c
+++ b/extern/verse/dist/v_connection.c
@@ -275,7 +275,8 @@ boolean v_con_callback_update(void)
{
static unsigned int seconds;
boolean output = FALSE;
- unsigned int size, connection, s;
+ size_t size;
+ unsigned int connection, s;
VNetInPacked *p;
v_n_get_current_time(&s, NULL);
diff --git a/extern/verse/dist/v_network.c b/extern/verse/dist/v_network.c
index 47bf7d970f3..3d67218bb7e 100644
--- a/extern/verse/dist/v_network.c
+++ b/extern/verse/dist/v_network.c
@@ -37,6 +37,10 @@ typedef char boolean;
#include "v_cmd_gen.h"
#include "v_network.h"
+#if !defined socklen_t
+#define socklen_t int
+#endif
+
#define TRUE 1
#define FALSE 0
@@ -209,7 +213,8 @@ unsigned int v_n_wait_for_incoming(unsigned int microseconds)
int v_n_receive_data(VNetworkAddress *address, char *data, size_t length)
{
struct sockaddr_in address_in;
- size_t from_length = sizeof address_in, len;
+ socklen_t from_length = sizeof address_in;
+ size_t len;
if(v_n_socket_create() == -1)
return 0;
diff --git a/intern/action/ACT_Action.h b/intern/action/ACT_Action.h
deleted file mode 100644
index 876ca2bc6b9..00000000000
--- a/intern/action/ACT_Action.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
-
-#ifndef _H_ACT_ACTION_H_
-#define _H_ACT_ACTION_H_
-
-#include "MEM_RefCounted.h"
-#include "STR_String.h"
-
-/**
- * An action that can be applied or undone.
- * Virtual base class for actions with a name.
- * An action object inherits the shared object reference count mechanism.
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
-
-class ACT_Action : public MEM_RefCounted {
-public:
- /**
- * Constructs an action with the given name .
- * @param name the name of the action.
- * @param applied state of the action after creation.
- */
- ACT_Action(const STR_String& name, bool applied = false);
-
- /**
- * Returns the name of the action.
- * @param name the name of the action.
- */
- inline virtual void getName(STR_String& name) const;
-
- /**
- * Returns the name of the action as a pointer to the data of the string.
- * @return pointer to the name of the action.
- */
- inline virtual char* getName();
-
- /**
- * Sets the name of the action.
- * @param name the name of the action.
- */
- inline virtual void setName(const STR_String& name);
-
- /**
- * Returns whether this action is applied.
- * @return whether this action is applied.
- */
- inline virtual bool getIsApplied() const;
-
-
- /**
- * Call this member to apply an action.
- * Child classes should override the doApply member to implement apply functionality.
- * @see doApply.
- */
- virtual void apply();
-
- /**
- * Call this member to undo an action .
- * Child classes should override the doUndo member to implement undo functionality.
- * @see doApply()
- */
- virtual void undo();
-
-protected:
- /**
- * Implementations should overload this method to provide the apply functionality.
- */
- virtual void doApply() = 0;
-
- /**
- * Implementations should overload this method to provide the undo functionality.
- */
- virtual void doUndo() = 0;
-
- /** Name of this action */
- STR_String m_name;
- /** Is this action already applied? */
- bool m_applied;
-};
-
-
-void ACT_Action::getName(STR_String& name) const
-{
- name = m_name;
-}
-
-char* ACT_Action::getName()
-{
- return m_name.Ptr();
-}
-
-void ACT_Action::setName(const STR_String& name)
-{
- m_name = name;
-}
-
-inline bool ACT_Action::getIsApplied() const
-{
- return m_applied;
-}
-
-#endif // _H_ACT_ACTION_H_
-
diff --git a/intern/action/ACT_ActionC-Api.h b/intern/action/ACT_ActionC-Api.h
deleted file mode 100644
index 64f279a2df6..00000000000
--- a/intern/action/ACT_ActionC-Api.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * Interface for C access to actions.
- * @author Maarten Gribnau
- * @date April, 25, 2001
- */
-
-#ifndef _H_ACT_ACTION_C_API
-#define _H_ACT_ACTION_C_API
-
-#include "MEM_RefCountedC-Api.h"
-
-/** A pointer to an action object. */
-typedef MEM_TRefCountedObjectPtr ACT_ActionPtr;
-/** A pointer to an action stack object. */
-typedef MEM_TObjectPtr ACT_ActionStackPtr;
-
-
-/** A pointer to user data passed by the callbacks. */
-typedef void* ACT_ActionUserDataPtr;
-
-/**
- * An action apply callback routine.
- * @param action The action that should be applied.
- * @param userData The pointer to the user data provided when the action was created.
- */
-typedef void (*ACT_ActionApplyProcPtr)(ACT_ActionPtr action, ACT_ActionUserDataPtr userData);
-
-/**
- * An action undo callback routine.
- * @param action The action that should be undone.
- * @param userData The pointer to the user data provided when the action was created.
- */
-typedef void (*ACT_ActionUndoProcPtr)(ACT_ActionPtr action, ACT_ActionUserDataPtr userData);
-
-/**
- * An action dispose callback routine.
- * @param action The action that is disposed.
- * @param userData The pointer to the user data provided when the action was created.
- */
-typedef void (*ACT_ActionDisposeProcPtr)(ACT_ActionPtr action, ACT_ActionUserDataPtr userData);
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * An action is a shared object that can be applied or undone.
- */
-
-/**
- * Creates a new action.
- * This is an action that calls the given callbacks when it needs to be applied or undone.
- * @param name The name of the action.
- * @param isApplied Indication as to whether the action is already applied (0 = not applied).
- * @param userData Pointer passed to the apply/undo callbacks.
- * @param applyProc Pointer to the callback invoked when the action needs to be applied.
- * @param undoProc Pointer to the callback invoked when the action needs to be undone.
- * @return The new action (null in case of error).
- */
-extern ACT_ActionPtr ACT_ActionCreate(
- char* name,
- int isApplied,
- ACT_ActionUserDataPtr userData,
- ACT_ActionApplyProcPtr applyProc,
- ACT_ActionUndoProcPtr undoProc,
- ACT_ActionDisposeProcPtr disposeProc);
-
-/**
- * Returns the name of an action.
- * @return The name of the action (null in case of error).
- */
-extern char* ACT_ActionGetName(ACT_ActionPtr action);
-
-
-
-/**
- * An action stack stores actions and implements undo/redo functionality.
- */
-
-/**
- * Creates a new action stack.
- * @param stackSize The maximum number of actions on the stack.
- * @return The new stack (or NULL in case of error).
- */
-extern ACT_ActionStackPtr ACT_ActionStackCreate(unsigned int stackSize);
-
-/**
- * Disposes an action stack.
- * @param stack The appropriate stack.
- */
-extern void ACT_ActionStackDispose(ACT_ActionStackPtr stack);
-
-/**
- * Returns the current depth of the stack.
- * @param stack The appropriate stack.
- * @return the current stack depth.
- */
-extern unsigned int ACT_ActionStackGetStackDepth(ACT_ActionStackPtr stack);
-
-/**
- * Returns the current maximum depth of the stack.
- * @param stack The appropriate stack.
- * @return the maximum stack depth.
- */
-extern unsigned int ACT_ActionStackGetMaxStackDepth(ACT_ActionStackPtr stack);
-
-/**
- * Sets new maximum depth of the stack.
- * @param stack The appropriate stack.
- * @param maxStackDepth The new stack depth.
- */
-extern void ACT_ActionStackSetMaxStackDepth(ACT_ActionStackPtr stack, unsigned int maxStackDepth);
-
-/**
- * Pushes an action on the stack.
- * If the action has not been applied yet, it will be applied here.
- * This will increase the reference count of the action.
- * If there is not enough capacity, the action at the bottom of the stack is removed (and its reference count decreased).
- * @param stack The appropriate stack.
- * @param action the action that is pushed onto the stack.
- */
-extern void ACT_ActionStackPush(ACT_ActionStackPtr stack, ACT_ActionPtr action);
-
-/**
- * Returns pointer to the current undo item.
- * @param stack The appropriate stack.
- * @return The action scheduled for undo (0 if there is none).
- */
-extern ACT_ActionStackPtr ACT_ActionStackPeekUndo(ACT_ActionStackPtr stack);
-
-/**
- * Returns pointer to the current redo item.
- * @param stack The appropriate stack.
- * @return The action scheduled for redo (0 if there is none).
- */
-extern ACT_ActionStackPtr ACT_ActionStackPeekRedo(ACT_ActionStackPtr stack);
-
-/**
- * Undos the current action.
- * @param stack The appropriate stack.
- * This will move the current undo index down (if the stack depth allows it).
- */
-extern void ACT_ActionStackUndo(ACT_ActionStackPtr stack);
-
-/**
- * Redos the current action.
- * @param stack The appropriate stack.
- * This will move the action index up (if the stack depth allows it).
- */
-extern void ACT_ActionStackRedo(ACT_ActionStackPtr stack);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // _H_ACT_ACTION_C_API
-
diff --git a/intern/action/ACT_ActionStack.h b/intern/action/ACT_ActionStack.h
deleted file mode 100644
index 421dca76e59..00000000000
--- a/intern/action/ACT_ActionStack.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
-
-#ifndef _H_ACT_ACTIONSTACK
-#define _H_ACT_ACTIONSTACK
-
-#include "ACT_Action.h"
-#include <deque>
-
-
-/**
- * A stack with actions that implements undo/redo capabilities.
- * A stack can grow to a maximum number of actions by pushing actions on the stack.
- * By calling undo and redo the apply and undo members of the actions on the stack are called.
- * In addition, this will move the stackIndex up and down the stack.
- * When a new action is pushed onto the stack, the actions above the current action are removed from the stack.
- * Actions pushed onto the stack are applied if they are not applied already.
- * @todo implement error handling (e.g. memory errors)
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
-
-class ACT_ActionStack {
-public:
- /**
- * Constructs an action stack.
- */
- ACT_ActionStack(unsigned int maxStackDepth = 1);
-
- /**
- * Destructs an action stack.
- */
- virtual ~ACT_ActionStack();
-
- /**
- * Returns the current depth of the stack.
- * @return the current stack depth.
- */
- virtual unsigned int getStackDepth() const;
-
- /**
- * Returns the current maximum depth of the stack.
- * @return the maximum stack depth.
- */
- virtual unsigned int getMaxStackDepth() const;
-
- /**
- * Sets new maximum depth of the stack.
- * @param maxStackDepth The new stack depth.
- */
- virtual void setMaxStackDepth(unsigned int maxStackDepth);
-
- /**
- * Pushes an action on the stack.
- * If the action has not been applied yet, it will be applied here.
- * This will increase the reference count of the action.
- * If there is not enough capacity, the action at the bottom of the stack is removed (and its reference count decreased).
- * @param action the action that is pushed onto the stack.
- */
- virtual void push(ACT_Action& action);
-
- /**
- * Returns pointer to the current undo item.
- * @return The action scheduled for undo (0 if there is none).
- */
- virtual ACT_Action* peekUndo();
-
- /**
- * Returns pointer to the current redo item.
- * @return The action scheduled for redo (0 if there is none).
- */
- virtual ACT_Action* peekRedo();
-
- /**
- * Flushes the action stack.
- * All actions are removed from the stack and their reference counts decreased.
- */
- virtual void flush();
-
- /**
- * Returns whether we can undo the current action.
- * @return Indication of the possibility to undo.
- */
- virtual bool canUndo() const;
-
- /**
- * Undos the current action.
- * This will move the current undo index down (if the stack depth allows it).
- */
- virtual void undo();
-
- /**
- * Returns whether we can redo the current action.
- * @return Indication of the possibility to redo.
- */
- virtual bool canRedo() const;
-
- /**
- * Redos the current action.
- * This will move the action index up (if the stack depth allows it).
- */
- virtual void redo();
-
-protected:
- /**
- * Removes <i>numActions</i> actions from the back of the stack.
- * @param numActions number of items to remove.
- * @return the number of actions removed.
- */
- virtual unsigned int popBack(unsigned int numActions = 1);
-
- /**
- * Removes <i>numActions</i> actions from the front of the stack.
- * @param numActions number of items to remove.
- * @return the number of actions removed.
- */
- virtual unsigned int popFront(unsigned int numActions = 1);
-
- /**
- * Returns the index of the current undo action.
- * @param index The index of the action.
- * @return Indication as to whether the index is valid (==true).
- */
- virtual bool getUndoIndex(unsigned int& index) const;
-
- /**
- * Returns the index of the current redo action.
- * @param index The index of the action.
- * @return Indication as to whether the index is valid (==true).
- */
- virtual bool getRedoIndex(unsigned int& index) const;
-
- /** The maximum depth of this stack. */
- unsigned int m_maxStackDepth;
- /** The index of the current undo action in the stack. */
- unsigned int m_undoIndex;
- /** Is the index of the current undo action in the stack valid? */
- bool m_undoIndexValid;
- /** The index of the current redo action in the stack. */
- unsigned int m_redoIndex;
- /** Is the index of the current redo action in the stack valid? */
- bool m_redoIndexValid;
- /** The stack with actions. */
- deque<ACT_Action*> m_stack;
-};
-
-
-#endif // _H_ACT_ACTIONSTACK
-
diff --git a/intern/action/Makefile b/intern/action/Makefile
deleted file mode 100644
index ed1cfccfc52..00000000000
--- a/intern/action/Makefile
+++ /dev/null
@@ -1,52 +0,0 @@
-#
-# $Id$
-#
-# ***** BEGIN GPL/BL DUAL 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. The Blender
-# Foundation also sells licenses for use in proprietary software under
-# the Blender License. See http://www.blender.org/BL/ for information
-# about this.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Hans Lambermont
-#
-# ***** END GPL/BL DUAL LICENSE BLOCK *****
-# action main makefile.
-#
-
-include nan_definitions.mk
-
-LIBNAME = action
-SOURCEDIR = intern/$(LIBNAME)
-DIR = $(OCGDIR)/$(SOURCEDIR)
-DIRS = intern
-TESTDIRS = test
-
-include nan_subdirs.mk
-
-install: all debug
- @[ -d $(NAN_ACTION) ] || mkdir $(NAN_ACTION)
- @[ -d $(NAN_ACTION)/include ] || mkdir $(NAN_ACTION)/include
- @[ -d $(NAN_ACTION)/lib ] || mkdir $(NAN_ACTION)/lib
- @[ -d $(NAN_ACTION)/lib/debug ] || mkdir $(NAN_ACTION)/lib/debug
- @../tools/cpifdiff.sh $(DIR)/libaction.a $(NAN_ACTION)/lib/
- @../tools/cpifdiff.sh $(DIR)/debug/libaction.a $(NAN_ACTION)/lib/debug/
- @../tools/cpifdiff.sh *.h $(NAN_ACTION)/include/
-
diff --git a/intern/action/doc/Doxyfile b/intern/action/doc/Doxyfile
deleted file mode 100644
index 2cc9de2d97c..00000000000
--- a/intern/action/doc/Doxyfile
+++ /dev/null
@@ -1,746 +0,0 @@
-# Doxyfile 1.2.4
-
-# This file describes the settings to be used by doxygen for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# General configuration options
-#---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-PROJECT_NAME = foundation
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY =
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese,
-# Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian,
-# Polish, Portuguese and Slovene.
-
-OUTPUT_LANGUAGE = English
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC = YES
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these class will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF = YES
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. It is allowed to use relative paths in the argument list.
-
-STRIP_FROM_PATH =
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS = NO
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a class diagram (in Html and LaTeX) for classes with base or
-# super classes. Setting the tag to NO turns the diagrams off.
-
-CLASS_DIAGRAMS = YES
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-
-SOURCE_BROWSER = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower case letters. If set to YES upper case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# users are adviced to set this option to NO.
-
-CASE_SENSE_NAMES = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS = YES
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explict @brief command for a brief description.
-
-JAVADOC_AUTOBRIEF = YES
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# reimplements.
-
-INHERIT_DOCS = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE = 8
-
-# The ENABLE_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS =
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST = YES
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES =
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text.
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT = ../extern ../intern
-
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-FILE_PATTERNS = *.h *.cpp *.c
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# 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 =
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-
-EXCLUDE_PATTERNS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS =
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-
-INPUT_FILTER =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse.
-
-FILTER_SOURCE_FILES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX = NO
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT = html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet
-
-HTML_STYLESHEET =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
-DISABLE_INDEX = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side pannel will be
-# generated containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript and frames is required (for instance Netscape 4.0+
-# or Internet explorer 4.0+).
-
-GENERATE_TREEVIEW = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH = 250
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT = latex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS = NO
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimised for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using a WORD or other.
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assigments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION = .3
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation. Warning: This feature
-# is still experimental and very incomplete.
-
-GENERATE_XML = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH = ../../generic/extern
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed.
-
-PREDEFINED =
-
-# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED =
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tagfiles.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS = NO
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT = NO
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to
-# YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other
-# documented files.
-
-INCLUDE_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to
-# YES then doxygen will generate a graph for each documented header file showing
-# the documented files that directly or indirectly include this file
-
-INCLUDED_BY_GRAPH = YES
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY = YES
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found on the path.
-
-DOT_PATH =
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_WIDTH = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT = 1024
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND = YES
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE = NO
-
-# The CGI_NAME tag should be the name of the CGI script that
-# starts the search engine (doxysearch) with the correct parameters.
-# A script with this name will be generated by doxygen.
-
-CGI_NAME = search.cgi
-
-# The CGI_URL tag should be the absolute URL to the directory where the
-# cgi binaries are located. See the documentation of your http daemon for
-# details.
-
-CGI_URL =
-
-# The DOC_URL tag should be the absolute URL to the directory where the
-# documentation is located. If left blank the absolute path to the
-# documentation, with file:// prepended to it, will be used.
-
-DOC_URL =
-
-# The DOC_ABSPATH tag should be the absolute path to the directory where the
-# documentation is located. If left blank the directory on the local machine
-# will be used.
-
-DOC_ABSPATH =
-
-# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
-# is installed.
-
-BIN_ABSPATH = c:\program files\doxygen\bin
-
-# The EXT_DOC_PATHS tag can be used to specify one or more paths to
-# documentation generated for other projects. This allows doxysearch to search
-# the documentation for these projects as well.
-
-EXT_DOC_PATHS =
diff --git a/intern/action/intern/ACT_ActionC-Api.cpp b/intern/action/intern/ACT_ActionC-Api.cpp
deleted file mode 100644
index 7fcd1d7b60a..00000000000
--- a/intern/action/intern/ACT_ActionC-Api.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date April, 25, 2001
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "ACT_ActionC-Api.h"
-
-#include "ACT_ActionStack.h"
-#include "ACT_CallbackAction.h"
-
-
-ACT_ActionPtr ACT_ActionCreate(
- char* name,
- int isApplied,
- ACT_ActionUserDataPtr data,
- ACT_ActionApplyProcPtr applyProc,
- ACT_ActionUndoProcPtr undoProc,
- ACT_ActionDisposeProcPtr disposeProc)
-{
- STR_String tmp (name);
- ACT_CallbackAction* action = new ACT_CallbackAction(tmp, isApplied != 0, data, applyProc, undoProc, disposeProc);
- return (ACT_ActionPtr) action;
-}
-
-
-char* ACT_ActionGetName(ACT_ActionPtr action)
-{
- return action ? ((ACT_Action*)action)->getName() : 0;
-}
-
-
-ACT_ActionStackPtr ACT_ActionStackCreate(unsigned int stackSize)
-{
- return ((ACT_ActionStackPtr) (new ACT_ActionStack (stackSize)));
-}
-
-
-void ACT_ActionStackDispose(ACT_ActionStackPtr stack)
-{
- if (stack) {
- delete (ACT_ActionStack*) stack;
- }
-}
-
-
-unsigned int ACT_ActionStackGetStackDepth(ACT_ActionStackPtr stack)
-{
- return stack ? ((ACT_ActionStack*)stack)->getStackDepth() : 0;
-}
-
-unsigned int ACT_ActionStackGetMaxStackDepth(ACT_ActionStackPtr stack)
-{
- return stack ? ((ACT_ActionStack*)stack)->getMaxStackDepth() : 0;
-}
-
-void ACT_ActionStackSetMaxStackDepth(ACT_ActionStackPtr stack, unsigned int maxStackDepth)
-{
- if (stack) {
- ((ACT_ActionStack*)stack)->setMaxStackDepth(maxStackDepth);
- }
-}
-
-void ACT_ActionStackPush(ACT_ActionStackPtr stack, ACT_ActionPtr action)
-{
- if (stack && action) {
- ((ACT_ActionStack*)stack)->push(*((ACT_Action*)action));
- }
-}
-
-
-ACT_ActionStackPtr ACT_ActionStackPeekUndo(ACT_ActionStackPtr stack)
-{
- return (ACT_ActionStackPtr) (stack ? ((ACT_ActionStack*)stack)->peekUndo() : 0);
-}
-
-
-ACT_ActionStackPtr ACT_ActionStackPeekRedo(ACT_ActionStackPtr stack)
-{
- return (ACT_ActionStackPtr) (stack ? ((ACT_ActionStack*)stack)->peekRedo() : 0);
-}
-
-
-void ACT_ActionStackUndo(ACT_ActionStackPtr stack)
-{
- if (stack) {
- ((ACT_ActionStack*)stack)->undo();
- }
-}
-
-
-void ACT_ActionStackRedo(ACT_ActionStackPtr stack)
-{
- if (stack) {
- ((ACT_ActionStack*)stack)->redo();
- }
-}
diff --git a/intern/action/intern/ACT_ActionStack.cpp b/intern/action/intern/ACT_ActionStack.cpp
deleted file mode 100644
index 2025f744958..00000000000
--- a/intern/action/intern/ACT_ActionStack.cpp
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "ACT_ActionStack.h"
-
-
-ACT_ActionStack::ACT_ActionStack(unsigned int maxStackDepth)
- : m_maxStackDepth(maxStackDepth),
- m_undoIndex(0), m_undoIndexValid(false),
- m_redoIndex(0), m_redoIndexValid(false)
-{
-}
-
-
-ACT_ActionStack::~ACT_ActionStack()
-{
- flush();
-}
-
-
-unsigned int ACT_ActionStack::getStackDepth() const
-{
- return m_stack.size();
-}
-
-
-unsigned int ACT_ActionStack::getMaxStackDepth() const
-{
- return m_maxStackDepth;
-}
-
-
-void ACT_ActionStack::setMaxStackDepth(unsigned int maxStackDepth)
-{
- if (maxStackDepth != m_maxStackDepth) {
- if (maxStackDepth) {
- unsigned int size = m_stack.size();
- if (maxStackDepth < size) {
- // New max stack size is smaller than current stack size, need to shrink stack
- unsigned int numRemove = size - maxStackDepth;
- if (m_undoIndex >= maxStackDepth) {
- // Pop items from the front (throw away undo steps)
- popFront(numRemove);
- m_undoIndex -= numRemove;
- m_redoIndex = m_undoIndex + 1;
- m_redoIndexValid = m_redoIndexValid && (maxStackDepth > 1);
- }
- else {
- // Pop items from the back (throw away redo steps)
- popBack(numRemove);
- m_redoIndexValid = m_redoIndexValid && (m_redoIndex < maxStackDepth);
- }
- }
- }
- else {
- // New stack size is zero
- flush();
- }
- m_maxStackDepth = maxStackDepth;
- }
-}
-
-
-void ACT_ActionStack::push(ACT_Action& action)
-{
- if (m_maxStackDepth) {
- unsigned int size = m_stack.size();
- if (m_redoIndexValid) {
- // Remove items after the current action (throw away redo steps)
- popBack(size - m_redoIndex);
- }
- else if (size >= m_maxStackDepth) {
- // Remove items from the front (throw away undo steps)
- popFront(m_maxStackDepth - size + 1);
- }
-
- // Store the action
- if (!action.getIsApplied()) {
- action.apply();
- }
- action.incRef();
- m_stack.push_back(&action);
-
- // Update action indices
- m_redoIndex = m_stack.size();
- m_redoIndexValid = false;
- m_undoIndex = m_redoIndex - 1;
- m_undoIndexValid = true;
- }
-}
-
-
-ACT_Action* ACT_ActionStack::peekUndo()
-{
- unsigned int i;
- return getUndoIndex(i) ? m_stack[i] : 0;
-}
-
-
-ACT_Action* ACT_ActionStack::peekRedo()
-{
- unsigned int i;
- return getRedoIndex(i) ? m_stack[i] : 0;
-}
-
-
-void ACT_ActionStack::flush()
-{
- popBack(m_stack.size());
- m_undoIndex = 0;
- m_undoIndexValid = false;
- m_redoIndex = 0;
- m_redoIndexValid = false;
-}
-
-
-bool ACT_ActionStack::canUndo() const
-{
- unsigned int i;
- return getUndoIndex(i);
-}
-
-
-void ACT_ActionStack::undo()
-{
- ACT_Action* action = peekUndo();
- if (action) {
- action->undo();
-
- // Update action indices
- m_redoIndex = m_undoIndex;
- m_redoIndexValid = true;
- if (m_undoIndex) {
- m_undoIndex--;
- }
- else {
- m_undoIndexValid = false;
- }
- }
-}
-
-
-bool ACT_ActionStack::canRedo() const
-{
- unsigned int i;
- return getRedoIndex(i);
-}
-
-
-void ACT_ActionStack::redo()
-{
- ACT_Action* action = peekRedo();
- if (action) {
- action->apply();
-
- // Update action indices
- m_undoIndex = m_redoIndex;
- m_undoIndexValid = true;
- m_redoIndex++;
- m_redoIndexValid = m_redoIndex < m_stack.size();
- }
-}
-
-
-unsigned int ACT_ActionStack::popFront(unsigned int numActions)
-{
- unsigned int numRemoved = 0;
-
- while (numActions-- && m_stack.size()) {
- ACT_Action* action = m_stack[0];
- action->decRef();
- m_stack.pop_front();
- numRemoved++;
- }
- return numRemoved;
-}
-
-
-unsigned int ACT_ActionStack::popBack(unsigned int numActions)
-{
- unsigned int numRemoved = 0;
- unsigned int size;
-
- while (numActions-- && (size = m_stack.size())) {
- ACT_Action* action = m_stack[size-1];
- action->decRef();
- m_stack.pop_back();
- numRemoved++;
- }
- return numRemoved;
-}
-
-
-bool ACT_ActionStack::getUndoIndex(unsigned int& i) const
-{
- i = m_undoIndex;
- return m_undoIndexValid;
-}
-
-
-bool ACT_ActionStack::getRedoIndex(unsigned int& i) const
-{
- i = m_redoIndex;
- return m_redoIndexValid;
-}
diff --git a/intern/action/intern/ACT_CallbackAction.h b/intern/action/intern/ACT_CallbackAction.h
deleted file mode 100644
index 148a77f13ed..00000000000
--- a/intern/action/intern/ACT_CallbackAction.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date June 17, 2001
- */
-
-#ifndef _H_ACT_CALLBACK_ACTION_H
-#define _H_ACT_CALLBACK_ACTION_H
-
-#include "ACT_Action.h"
-#include "ACT_ActionC-Api.h"
-
-
-/**
- * An action implementation that uses callbacks for undo and redo.
- * @author Maarten Gribnau
- * @date June 17, 2001
- */
-
-class ACT_CallbackAction : public ACT_Action {
-public:
- /**
- * Constructs an action with the given name .
- * @param name The name of the action.
- * @param applied State of the action after creation.
- * @param data Pointer to user data passed to the callbacks.
- * @param applyProc Callback invoked for apply action.
- * @param undoProc Callback invoked for undo action.
- */
- ACT_CallbackAction(
- STR_String& name,
- bool applied,
- ACT_ActionUserDataPtr data,
- ACT_ActionApplyProcPtr applyProc,
- ACT_ActionUndoProcPtr undoProc,
- ACT_ActionDisposeProcPtr disposeProc)
- : ACT_Action(name, applied), m_userData(data), m_applyProc(applyProc), m_undoProc(undoProc), m_disposeProc(disposeProc)
- {
- }
-
- /**
- * Default destructor.
- * Will call the dispose callback.
- */
- virtual ~ACT_CallbackAction()
- {
- // Should assert
- m_disposeProc((ACT_ActionPtr)this, m_userData);
- }
-
-
-protected:
- /**
- * Calls the appropriate callback.
- */
- inline virtual void doApply();
-
- /**
- * Calls the appropriate callback.
- */
- inline virtual void doUndo();
-
- /** User data supplied at creation and passed to the callbacks. */
- ACT_ActionUserDataPtr m_userData;
-
- /** Callback invoked for apply action. */
- ACT_ActionApplyProcPtr m_applyProc;
-
- /** Callback invoked for undo action. */
- ACT_ActionApplyProcPtr m_undoProc;
-
- /** Callback invoked when the action is disposed. */
- ACT_ActionDisposeProcPtr m_disposeProc;
-};
-
-
-inline void ACT_CallbackAction::doApply()
-{
- // Should assert
- m_applyProc((ACT_ActionPtr)this, m_userData);
-}
-
-
-inline void ACT_CallbackAction::doUndo()
-{
- // Should assert
- m_undoProc((ACT_ActionPtr)this, m_userData);
-}
-
-
-#endif // _H_ACT_CALLBACK_ACTION_H
-
diff --git a/intern/action/make/msvc_6_0/action.dsp b/intern/action/make/msvc_6_0/action.dsp
deleted file mode 100644
index 3ea450b19a7..00000000000
--- a/intern/action/make/msvc_6_0/action.dsp
+++ /dev/null
@@ -1,128 +0,0 @@
-# Microsoft Developer Studio Project File - Name="action" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=action - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "action.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "action.mak" CFG="action - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "action - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "action - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "action - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "../../../../../obj/windows/intern/action/"
-# PROP Intermediate_Dir "../../../../../obj/windows/intern/action/"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "../.." /I "../../../../lib/windows/memutil/include/" /I "../../../../lib/windows/string/include/" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ELSEIF "$(CFG)" == "action - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "../../../../../obj/windows/intern/action/debug"
-# PROP Intermediate_Dir "../../../../../obj/windows/intern/action/debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../.." /I "../../../../lib/windows/memutil/include/" /I "../../../../lib/windows/string/include/" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ENDIF
-
-# Begin Target
-
-# Name "action - Win32 Release"
-# Name "action - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\..\intern\ACT_Action.cpp
-# End Source File
-# Begin Source File
-
-SOURCE="..\..\intern\ACT_ActionC-Api.cpp"
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\ACT_ActionStack.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Group "intern"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\intern\ACT_CallbackAction.h
-# End Source File
-# End Group
-# Begin Group "extern"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\ACT_Action.h
-# End Source File
-# Begin Source File
-
-SOURCE="..\..\ACT_ActionC-Api.h"
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\ACT_ActionStack.h
-# End Source File
-# End Group
-# End Group
-# End Target
-# End Project
diff --git a/intern/action/make/msvc_6_0/action.dsw b/intern/action/make/msvc_6_0/action.dsw
deleted file mode 100644
index f93cbb896fd..00000000000
--- a/intern/action/make/msvc_6_0/action.dsw
+++ /dev/null
@@ -1,29 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "action"=".\action.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/intern/action/make/msvc_7_0/action.sln b/intern/action/make/msvc_7_0/action.sln
deleted file mode 100644
index 3ab830940c8..00000000000
--- a/intern/action/make/msvc_7_0/action.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "action", "action.vcproj", "{FA745D82-2D98-4843-8B72-874AB3622A8C}"
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- ConfigName.0 = Debug
- ConfigName.1 = Release
- EndGlobalSection
- GlobalSection(ProjectDependencies) = postSolution
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {FA745D82-2D98-4843-8B72-874AB3622A8C}.Debug.ActiveCfg = Debug|Win32
- {FA745D82-2D98-4843-8B72-874AB3622A8C}.Debug.Build.0 = Debug|Win32
- {FA745D82-2D98-4843-8B72-874AB3622A8C}.Release.ActiveCfg = Release|Win32
- {FA745D82-2D98-4843-8B72-874AB3622A8C}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/intern/action/make/msvc_7_0/action.vcproj b/intern/action/make/msvc_7_0/action.vcproj
deleted file mode 100644
index 04af58a8d52..00000000000
--- a/intern/action/make/msvc_7_0/action.vcproj
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding = "Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.00"
- Name="action"
- SccProjectName=""
- SccLocalPath="">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Debug|Win32"
- OutputDirectory=".\../../../../../obj/windows/intern/action/debug"
- IntermediateDirectory=".\../../../../../obj/windows/intern/action/debug"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="../..,../../../../lib/windows/memutil/include/,../../../../lib/windows/string/include/"
- PreprocessorDefinitions="WIN32,_DEBUG,_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="5"
- UsePrecompiledHeader="2"
- PrecompiledHeaderFile=".\../../../../../obj/windows/intern/action/debug/action.pch"
- AssemblerListingLocation=".\../../../../../obj/windows/intern/action/debug/"
- ObjectFile=".\../../../../../obj/windows/intern/action/debug/"
- ProgramDataBaseFileName=".\../../../../../obj/windows/intern/action/debug/"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="4"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile=".\../../../../../obj/windows/intern/action/debug\action.lib"
- SuppressStartupBanner="TRUE"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Release|Win32"
- OutputDirectory=".\../../../../../obj/windows/intern/action"
- IntermediateDirectory=".\../../../../../obj/windows/intern/action"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="../..,../../../../lib/windows/memutil/include/,../../../../lib/windows/string/include/"
- PreprocessorDefinitions="WIN32,NDEBUG,_LIB"
- StringPooling="TRUE"
- RuntimeLibrary="4"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- PrecompiledHeaderFile=".\../../../../../obj/windows/intern/action/action.pch"
- AssemblerListingLocation=".\../../../../../obj/windows/intern/action/"
- ObjectFile=".\../../../../../obj/windows/intern/action/"
- ProgramDataBaseFileName=".\../../../../../obj/windows/intern/action/"
- WarningLevel="3"
- SuppressStartupBanner="TRUE"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile=".\../../../../../obj/windows/intern/action\action.lib"
- SuppressStartupBanner="TRUE"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- </Configuration>
- </Configurations>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
- <File
- RelativePath="..\..\intern\ACT_Action.cpp">
- </File>
- <File
- RelativePath="..\..\intern\ACT_ActionC-Api.cpp">
- </File>
- <File
- RelativePath="..\..\intern\ACT_ActionStack.cpp">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl">
- <Filter
- Name="intern"
- Filter="">
- <File
- RelativePath="..\..\intern\ACT_CallbackAction.h">
- </File>
- </Filter>
- <Filter
- Name="extern"
- Filter="">
- <File
- RelativePath="..\..\ACT_Action.h">
- </File>
- <File
- RelativePath="..\..\ACT_ActionC-Api.h">
- </File>
- <File
- RelativePath="..\..\ACT_ActionStack.h">
- </File>
- </Filter>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/intern/action/test/action_c_test/ActionTest.c b/intern/action/test/action_c_test/ActionTest.c
deleted file mode 100644
index 8f169528204..00000000000
--- a/intern/action/test/action_c_test/ActionTest.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "ACT_ActionC-Api.h"
-#include "TestAction.h"
-
-int main(int argc, char *argv[])
-{
- ACT_ActionStackPtr stack = ACT_ActionStackCreate (3);
- ACT_ActionPtr action = ACT_ActionCreate("action1", 0, 0, printApplied, printUndone, printDisposed);
- ACT_ActionStackPush(stack, action);
- MEM_RefCountedDecRef(action);
- action = ACT_ActionCreate("action2", 0, 0, printApplied, printUndone, printDisposed);
- ACT_ActionStackPush(stack, action);
- MEM_RefCountedDecRef(action);
- action = ACT_ActionCreate("action3", 0, 0, printApplied, printUndone, printDisposed);
- ACT_ActionStackPush(stack, action);
- MEM_RefCountedDecRef(action);
-
- ACT_ActionStackUndo(stack);
- ACT_ActionStackUndo(stack);
- ACT_ActionStackUndo(stack);
- ACT_ActionStackRedo(stack);
- ACT_ActionStackRedo(stack);
- ACT_ActionStackRedo(stack);
-
- ACT_ActionStackSetMaxStackDepth(stack, 1);
- ACT_ActionStackUndo(stack);
- ACT_ActionStackRedo(stack);
- ACT_ActionStackSetMaxStackDepth(stack, 5);
- ACT_ActionStackUndo(stack);
- ACT_ActionStackRedo(stack);
-
- action = ACT_ActionCreate("action4", 0, 0, printApplied, printUndone, printDisposed);
- ACT_ActionStackPush(stack, action);
- MEM_RefCountedDecRef(action);
- ACT_ActionStackUndo(stack);
- action = ACT_ActionCreate("action5", 0, 0, printApplied, printUndone, printDisposed);
- ACT_ActionStackPush(stack, action);
- MEM_RefCountedDecRef(action);
- ACT_ActionStackUndo(stack);
- ACT_ActionStackUndo(stack);
- ACT_ActionStackRedo(stack);
- ACT_ActionStackRedo(stack);
-
- return 0;
-}
diff --git a/intern/action/test/action_c_test/make/msvc_6_0/action_c_test.dsp b/intern/action/test/action_c_test/make/msvc_6_0/action_c_test.dsp
deleted file mode 100644
index 807024f20be..00000000000
--- a/intern/action/test/action_c_test/make/msvc_6_0/action_c_test.dsp
+++ /dev/null
@@ -1,109 +0,0 @@
-# Microsoft Developer Studio Project File - Name="action_c_test" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=action_c_test - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "action_c_test.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "action_c_test.mak" CFG="action_c_test - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "action_c_test - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "action_c_test - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "action_c_test - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "../../../../../../../obj/windows/intern/action/test"
-# PROP Intermediate_Dir "../../../../../../../obj/windows/intern/action/test"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "../../../.." /I "../../../../../../lib/windows/memutil/include/" /I "../../../../../../lib/windows/string/include/" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib string.lib memutil.lib /nologo /subsystem:console /machine:I386 /libpath:"../../../../../../lib/windows/memutil/lib" /libpath:"../../../../../../lib/windows/string/lib"
-
-!ELSEIF "$(CFG)" == "action_c_test - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "../../../../../../../obj/windows/intern/action/test/debug"
-# PROP Intermediate_Dir "../../../../../../../obj/windows/intern/action/test/debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../.." /I "../../../../../../lib/windows/memutil/include/" /I "../../../../../../lib/windows/string/include/" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib string.lib memutil.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"../../../../../../lib/windows/memutil/lib/debug" /libpath:"../../../../../../lib/windows/string/lib/debug"
-
-!ENDIF
-
-# Begin Target
-
-# Name "action_c_test - Win32 Release"
-# Name "action_c_test - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\..\ActionTest.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\TestAction.c
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\..\TestAction.h
-# End Source File
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
diff --git a/intern/action/test/action_c_test/make/msvc_6_0/action_c_test.dsw b/intern/action/test/action_c_test/make/msvc_6_0/action_c_test.dsw
deleted file mode 100644
index 688f24e4d53..00000000000
--- a/intern/action/test/action_c_test/make/msvc_6_0/action_c_test.dsw
+++ /dev/null
@@ -1,44 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "action"="..\..\..\..\make\msvc_6_0\action.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "action_c_test"=".\action_c_test.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name action
- End Project Dependency
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/intern/action/test/action_cpp_test/ActionTest.cpp b/intern/action/test/action_cpp_test/ActionTest.cpp
deleted file mode 100644
index 55173bafb7b..00000000000
--- a/intern/action/test/action_cpp_test/ActionTest.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "ACT_ActionStack.h"
-#include "TestAction.h"
-
-int main()
-{
- ACT_ActionStack testStack (3);
- TestAction* testAction = new TestAction (STR_String("action1"));
- testStack.push(*testAction);
- testAction->decRef();
- testAction = new TestAction (STR_String("action2"));
- testStack.push(*testAction);
- testAction->decRef();
- testAction = new TestAction (STR_String("action3"));
- testStack.push(*testAction);
- testAction->decRef();
-
- testStack.undo();
- testStack.undo();
- testStack.undo();
- testStack.redo();
- testStack.redo();
- testStack.redo();
-
- testStack.setMaxStackDepth(1);
- testStack.undo();
- testStack.redo();
- testStack.setMaxStackDepth(5);
- testStack.undo();
- testStack.redo();
-
- testAction = new TestAction (STR_String("action4"));
- testStack.push(*testAction);
- testAction->decRef();
- testStack.undo();
- testAction = new TestAction (STR_String("action5"));
- testStack.push(*testAction);
- testAction->decRef();
- testStack.undo();
- testStack.undo();
- testStack.redo();
- testStack.redo();
-
- return 0;
-}
diff --git a/intern/action/test/action_cpp_test/TestAction.h b/intern/action/test/action_cpp_test/TestAction.h
deleted file mode 100644
index 3cd5ed893ad..00000000000
--- a/intern/action/test/action_cpp_test/TestAction.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
-
-#ifndef _H_ACT_TESTACTION
-#define _H_ACT_TESTACTION
-
-#include "ACT_Action.h"
-
-#include <iostream>
-
-class TestAction : public ACT_Action
-{
-public:
- TestAction(const STR_String& name) : ACT_Action(name) {}
- virtual ~TestAction() { cout << m_name.Ptr() << ": deleted\n"; }
-protected:
- virtual void doApply() { cout << m_name.Ptr() << ": applied\n"; }
- virtual void doUndo() { cout << m_name.Ptr() << ": undone\n"; }
-};
-
-#endif // _H_ACT_TESTACTION
-
diff --git a/intern/action/test/action_cpp_test/make/msvc_6_0/action_cpp_test.dsp b/intern/action/test/action_cpp_test/make/msvc_6_0/action_cpp_test.dsp
deleted file mode 100644
index bc0c40b6d36..00000000000
--- a/intern/action/test/action_cpp_test/make/msvc_6_0/action_cpp_test.dsp
+++ /dev/null
@@ -1,105 +0,0 @@
-# Microsoft Developer Studio Project File - Name="action_cpp_test" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=action_cpp_test - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "action_cpp_test.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "action_cpp_test.mak" CFG="action_cpp_test - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "action_cpp_test - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "action_cpp_test - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "action_cpp_test - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "../../../../../../../obj/windows/intern/action/test"
-# PROP Intermediate_Dir "../../../../../../../obj/windows/intern/action/test"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "../../../.." /I "../../../../../../lib/windows/memutil/include/" /I "../../../../../../lib/windows/string/include/" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib string.lib memutil.lib /nologo /subsystem:console /machine:I386 /libpath:"../../../../../../lib/windows/memutil/lib" /libpath:"../../../../../../lib/windows/string/lib"
-
-!ELSEIF "$(CFG)" == "action_cpp_test - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "../../../../../../../obj/windows/intern/action/test/debug"
-# PROP Intermediate_Dir "../../../../../../../obj/windows/intern/action/test/debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../.." /I "../../../../../../lib/windows/memutil/include/" /I "../../../../../../lib/windows/string/include/" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib string.lib memutil.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"../../../../../../lib/windows/memutil/lib/debug" /libpath:"../../../../../../lib/windows/string/lib/debug"
-
-!ENDIF
-
-# Begin Target
-
-# Name "action_cpp_test - Win32 Release"
-# Name "action_cpp_test - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\..\ActionTest.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\..\TestAction.h
-# End Source File
-# End Group
-# Begin Group "Resource Files"
-
-# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
-# End Group
-# End Target
-# End Project
diff --git a/intern/action/test/action_cpp_test/make/msvc_6_0/action_cpp_test.dsw b/intern/action/test/action_cpp_test/make/msvc_6_0/action_cpp_test.dsw
deleted file mode 100644
index 0a9d7374379..00000000000
--- a/intern/action/test/action_cpp_test/make/msvc_6_0/action_cpp_test.dsw
+++ /dev/null
@@ -1,44 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "action"="..\..\..\..\make\msvc_6_0\action.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "action_cpp_test"=".\action_cpp_test.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name action
- End Project Dependency
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/intern/bmfont/BMF_Api.h b/intern/bmfont/BMF_Api.h
index 001a9788920..1b4a4ee3129 100644
--- a/intern/bmfont/BMF_Api.h
+++ b/intern/bmfont/BMF_Api.h
@@ -89,13 +89,30 @@ int BMF_GetCharacterWidth(BMF_Font* font, char c);
int BMF_GetStringWidth(BMF_Font* font, char* str);
/**
+ * Returns the bounding box of a string of characters.
+ * @param font The font to use.
+ * @param str The string.
+ * @param llx Lower left x coord
+ * @param lly Lower left y coord
+ * @param urx Upper right x coord
+ * @param ury Upper right y coord
+ */
+void BMF_GetStringBoundingBox(BMF_Font* font, char* str, float*llx, float *lly, float *urx, float *ury);
+
+
+/**
* Returns the bounding box of the font. The width and
* height represent the bounding box of the union of
* all glyps. The minimum and maximum values of the
* box represent the extent of the font and its positioning
* about the origin.
*/
-void BMF_GetBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r);
+void BMF_GetFontBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r);
+
+/**
+ * Same as GetFontBoundingBox but only returns the height
+ */
+int BMF_GetFontHeight(BMF_Font* font);
/**
* Convert the given @a font to a texture, and return the GL texture
@@ -122,6 +139,23 @@ int BMF_GetFontTexture(BMF_Font* font);
*/
void BMF_DrawStringTexture(BMF_Font* font, char* string, float x, float y, float z);
+ /**
+ * Draw the given @a string at the point @a xpos, @a ypos using
+ * char and float buffers.
+ *
+ * @param string The c-string to draw.
+ * @param xpos The x coordinate to start drawing at.
+ * @param ypos The y coordinate to start drawing at.
+ * @param fgcol The forground color.
+ * @param bgcol The background color.
+ * @param buf Unsigned char image buffer, when NULL to not operate on it.
+ * @param fbuf float image buffer, when NULL to not operate on it.
+ * @param w image buffer width.
+ * @param h image buffer height.
+ */
+void BMF_DrawStringBuf(BMF_Font* font, char *str, int posx, int posy, float *col, unsigned char *buf, float *fbuf, int w, int h);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/intern/bmfont/intern/BMF_Api.cpp b/intern/bmfont/intern/BMF_Api.cpp
index 46776b08ba0..eaa8ffb939d 100644
--- a/intern/bmfont/intern/BMF_Api.cpp
+++ b/intern/bmfont/intern/BMF_Api.cpp
@@ -150,11 +150,24 @@ int BMF_GetStringWidth(BMF_Font* font, char* str)
return ((BMF_BitmapFont*)font)->GetStringWidth(str);
}
+void BMF_GetStringBoundingBox(BMF_Font* font, char* str, float*llx, float *lly, float *urx, float *ury){
+ if (!font){
+ *llx = *lly = *urx = *ury = 0;
+ }else{
+ ((BMF_BitmapFont*)font)->GetStringBoundingBox(str, llx, lly, urx, ury);
+ }
+}
-void BMF_GetBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r)
+void BMF_GetFontBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r)
{
if (!font) return;
- ((BMF_BitmapFont*)font)->GetBoundingBox(*xmin_r, *ymin_r, *xmax_r, *ymax_r);
+ ((BMF_BitmapFont*)font)->GetFontBoundingBox(*xmin_r, *ymin_r, *xmax_r, *ymax_r);
+}
+
+int BMF_GetFontHeight(BMF_Font* font)
+{
+ if (!font) return -1;
+ return ((BMF_BitmapFont*)font)->GetFontHeight();
}
int BMF_GetFontTexture(BMF_Font* font) {
@@ -166,3 +179,8 @@ void BMF_DrawStringTexture(BMF_Font* font, char *string, float x, float y, float
if (!font) return;
((BMF_BitmapFont*)font)->DrawStringTexture(string, x, y, z);
}
+
+void BMF_DrawStringBuf(BMF_Font* font, char *str, int posx, int posy, float *col, unsigned char *buf, float *fbuf, int w, int h) {
+ if (!font) return;
+ ((BMF_BitmapFont*)font)->DrawStringBuf(str, posx, posy, col, buf, fbuf, w, h);
+}
diff --git a/intern/bmfont/intern/BMF_BitmapFont.cpp b/intern/bmfont/intern/BMF_BitmapFont.cpp
index bbba2c978dd..2ea14b4b203 100644
--- a/intern/bmfont/intern/BMF_BitmapFont.cpp
+++ b/intern/bmfont/intern/BMF_BitmapFont.cpp
@@ -35,6 +35,11 @@
* Copyright (C) 2001 NaN Technologies B.V.
*/
+
+#include <stdio.h>
+
+
+
#include <string.h>
#ifdef HAVE_CONFIG_H
@@ -107,7 +112,7 @@ int BMF_BitmapFont::GetStringWidth(char* str)
return length;
}
-void BMF_BitmapFont::GetBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax)
+void BMF_BitmapFont::GetFontBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax)
{
xMin = m_fontData->xmin;
yMin = m_fontData->ymin;
@@ -115,6 +120,32 @@ void BMF_BitmapFont::GetBoundingBox(int & xMin, int & yMin, int & xMax, int & yM
yMax = m_fontData->ymax;
}
+int BMF_BitmapFont::GetFontHeight( void )
+{
+ return m_fontData->ymax - m_fontData->ymin;
+}
+
+void BMF_BitmapFont::GetStringBoundingBox(char* str, float*llx, float *lly, float *urx, float *ury)
+{
+ unsigned char c;
+ int length = 0;
+ int ascent = 0;
+ int descent = 0;
+
+ while ( (c = (unsigned char) *str++) ) {
+ length += m_fontData->chars[c].advance;
+ int d = m_fontData->chars[c].yorig;
+ int a = m_fontData->chars[c].height - m_fontData->chars[c].yorig;
+ if(a > ascent) ascent = a;
+ if(d > descent) descent = d;
+ }
+ *llx = (float)0;
+ *lly = (float)-descent;
+ *urx = (float)length;
+ *ury = (float)ascent;
+}
+
+
int BMF_BitmapFont::GetTexture()
{
int fWidth = m_fontData->xmax - m_fontData->xmin;
@@ -208,3 +239,84 @@ void BMF_BitmapFont::DrawStringTexture(char *str, float x, float y, float z)
}
glEnd();
}
+
+#define FTOCHAR(val) val<=0.0f?0: (val>=1.0f?255: (char)(255.0f*val))
+void BMF_BitmapFont::DrawStringBuf(char *str, int posx, int posy, float *col, unsigned char *buf, float *fbuf, int w, int h)
+{
+ int x, y;
+
+ if (buf==0 && fbuf==0)
+ return;
+
+ /*offset for font*/
+ posx -= m_fontData->xmin;
+ posy -= m_fontData->ymin;
+
+ if (buf) {
+ unsigned char colch[4];
+ unsigned char *max, *pixel;
+ unsigned char c;
+
+ for (x=0; x<4; x++) {
+ colch[x] = FTOCHAR(col[x]);
+ }
+
+ max = buf + (4 * (w * h));
+ while ((c = (unsigned char) *str++)) {
+ BMF_CharData & cd = m_fontData->chars[c];
+ if (cd.data_offset != -1) {
+ for (y = 0; y < cd.height; y++) {
+ unsigned char* chrRow = &m_fontData->bitmap_data[cd.data_offset + ((cd.width+7)/8)*y];
+ for (x = cd.xorig; x < cd.width; x++) {
+ pixel = buf + 4 * (((posy + y - cd.yorig) * w) + (posx + x));
+ if ((pixel < max) && (pixel > buf)) {
+ int byteIdx = x/8;
+ int bitIdx = 7 - (x%8);
+
+ if (chrRow[byteIdx]&(1<<bitIdx)) {
+ pixel[0] = colch[0];
+ pixel[1] = colch[1];
+ pixel[2] = colch[2];
+ pixel[4] = 1; /*colch[3];*/
+
+ }
+ }
+ }
+ }
+ }
+ posx += cd.advance;
+ }
+ }
+
+ if (fbuf) {
+ float *pixel, *max;
+ unsigned char c;
+ int x, y;
+
+ max = fbuf + (4 * (w * h));
+
+ while ((c = (unsigned char) *str++)) {
+ BMF_CharData & cd = m_fontData->chars[c];
+ if (cd.data_offset != -1) {
+ for (y = 0; y < cd.height; y++) {
+ unsigned char* chrRow = &m_fontData->bitmap_data[cd.data_offset + ((cd.width+7)/8)*y];
+ for (x = cd.xorig; x < cd.width; x++) {
+ pixel = fbuf + 4 * (((posy + y - cd.yorig) * w) + (posx + x));
+ if ((pixel < max) && (pixel > fbuf)) {
+ int byteIdx = x/8;
+ int bitIdx = 7 - (x%8);
+
+ if (chrRow[byteIdx]&(1<<bitIdx)) {
+ pixel[0] = col[0];
+ pixel[1] = col[1];
+ pixel[2] = col[2];
+ pixel[3] = 1; /*col[3];*/
+ }
+ }
+ }
+ }
+ }
+ posx += cd.advance;
+ }
+ }
+}
diff --git a/intern/bmfont/intern/BMF_BitmapFont.h b/intern/bmfont/intern/BMF_BitmapFont.h
index 30cfd650353..986de2bb399 100644
--- a/intern/bmfont/intern/BMF_BitmapFont.h
+++ b/intern/bmfont/intern/BMF_BitmapFont.h
@@ -76,7 +76,24 @@ public:
* box represent the extent of the font and its positioning
* about the origin.
*/
- void GetBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax);
+ void GetFontBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax);
+
+ /**
+ * Return the bounding box height of the font.
+ */
+ int GetFontHeight(void);
+
+ /**
+ * Returns the bounding box of a string of characters.
+ * @param font The font to use.
+ * @param str The string.
+ * @param llx Lower left x coord
+ * @param lly Lower left y coord
+ * @param urx Upper right x coord
+ * @param ury Upper right y coord
+ */
+ void GetStringBoundingBox(char* str, float*llx, float *lly, float *urx, float *ury);
+
/**
* Convert the font to a texture, and return the GL texture
@@ -101,6 +118,21 @@ public:
*/
void DrawStringTexture(char* string, float x, float y, float z);
+ /**
+ * Draw the given @a string at the point @a xpos, @a ypos using
+ * char and float buffers.
+ *
+ * @param string The c-string to draw.
+ * @param xpos The x coordinate to start drawing at.
+ * @param ypos The y coordinate to start drawing at.
+ * @param col The forground color.
+ * @param buf Unsigned char image buffer, when NULL to not operate on it.
+ * @param fbuf float image buffer, when NULL to not operate on it.
+ * @param w image buffer width.
+ * @param h image buffer height.
+ */
+ void DrawStringBuf(char *str, int posx, int posy, float *col, unsigned char *buf, float *fbuf, int w, int h);
+
protected:
/** Pointer to the font data. */
BMF_FontData* m_fontData;
diff --git a/intern/boolop/intern/BOP_BSPNode.cpp b/intern/boolop/intern/BOP_BSPNode.cpp
index 646e8c22bd3..68a20d7a5a4 100644
--- a/intern/boolop/intern/BOP_BSPNode.cpp
+++ b/intern/boolop/intern/BOP_BSPNode.cpp
@@ -98,7 +98,7 @@ unsigned int BOP_BSPNode::addFace(BOP_BSPPoints pts,
// classify each line segment, looking for endpoints which lie on different
// sides of the hyperplane.
- BOP_IT_BSPPoints ptsEnd = pts.end();
+ ptsEnd = pts.end();
for(BOP_IT_BSPPoints itp=pts.begin();itp!=ptsEnd;itp++){
MT_Point3 npoint= *itp;
BOP_TAG ntag = testPoint(npoint);
diff --git a/intern/boolop/intern/BOP_Face.cpp b/intern/boolop/intern/BOP_Face.cpp
index 80c917f2838..ebe34237d4f 100644
--- a/intern/boolop/intern/BOP_Face.cpp
+++ b/intern/boolop/intern/BOP_Face.cpp
@@ -44,6 +44,8 @@ BOP_Face::BOP_Face(MT_Plane3 plane, BOP_Index originalFace)
m_plane = plane;
m_tag = UNCLASSIFIED;
m_originalFace = originalFace;
+ m_split = 0;
+ m_bbox = NULL;
}
/**
@@ -197,6 +199,14 @@ bool BOP_Face3::getNextVertex(BOP_Index v, BOP_Index &w)
*/
void BOP_Face3::replaceVertexIndex(BOP_Index oldIndex, BOP_Index newIndex)
{
+ /* if the old index really exists, and new index also exists already,
+ * don't create an edge with both vertices == newIndex */
+
+ if( (m_indexs[0] == oldIndex || m_indexs[1] == oldIndex || m_indexs[2] == oldIndex) &&
+ (m_indexs[0] == newIndex || m_indexs[1] == newIndex || m_indexs[2] == newIndex) ) {
+ setTAG(BROKEN);
+ }
+
if (m_indexs[0] == oldIndex) m_indexs[0] = newIndex;
else if (m_indexs[1] == oldIndex) m_indexs[1] = newIndex;
else if (m_indexs[2] == oldIndex) m_indexs[2] = newIndex;
diff --git a/intern/boolop/intern/BOP_Face.h b/intern/boolop/intern/BOP_Face.h
index 7db5ab1fe5c..1d854ec00ca 100644
--- a/intern/boolop/intern/BOP_Face.h
+++ b/intern/boolop/intern/BOP_Face.h
@@ -34,6 +34,7 @@
#include "BOP_Tag.h"
#include "MT_Plane3.h"
#include "BOP_Indexs.h"
+#include "BOP_BBox.h"
#include <iostream>
#include <vector>
using namespace std;
@@ -53,10 +54,12 @@ private:
protected:
BOP_Index m_indexs[4];
unsigned int m_size;
+ unsigned int m_split;
+ BOP_BBox *m_bbox;
public:
BOP_Face(MT_Plane3 plane, BOP_Index originalFace);
- virtual ~BOP_Face(){};
+ virtual ~BOP_Face(){if (m_bbox) delete m_bbox;};
inline MT_Plane3 getPlane() const {return m_plane;};
inline void setPlane(const MT_Plane3 plane) {m_plane = plane;};
inline BOP_TAG getTAG() const {return m_tag;};
@@ -65,7 +68,15 @@ public:
inline void setOriginalFace(const BOP_Index originalFace) {m_originalFace=originalFace;};
inline BOP_Index getVertex(unsigned int i) const {return m_indexs[i];};
inline void setVertex(const BOP_Index idx, const BOP_Index i) {m_indexs[idx]=i;};
+ inline unsigned int getSplit() const {return m_split;};
+ inline void setSplit(const unsigned int i) {m_split=i;};
+
void invert();
+ inline void setBBox(const MT_Point3& p1,const MT_Point3& p2,const MT_Point3& p3) {
+ m_bbox = new BOP_BBox(p1, p2, p3);};
+ inline BOP_BBox *getBBox() {return m_bbox;};
+ inline void freeBBox(){if (m_bbox!=NULL) {delete m_bbox; m_bbox=NULL;} };
+
inline unsigned int size() const {return m_size;};
virtual bool getEdgeIndex(BOP_Index v1, BOP_Index v2, unsigned int &e) = 0;
diff --git a/intern/boolop/intern/BOP_Face2Face.cpp b/intern/boolop/intern/BOP_Face2Face.cpp
index 7e2b6bd7b2f..ef67e5dd24b 100644
--- a/intern/boolop/intern/BOP_Face2Face.cpp
+++ b/intern/boolop/intern/BOP_Face2Face.cpp
@@ -1,4 +1,7 @@
/**
+ *
+ * $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -23,7 +26,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Marc Freixas, Ken Hughes
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
@@ -144,9 +147,18 @@ void BOP_mergeVertexs(BOP_Mesh *mesh, unsigned int firstFace);
* @param mesh mesh that contains the faces, edges and vertices
* @param facesA set of faces from object A
* @param facesB set of faces from object B
+ *
+ * Two optimizations were added here:
+ * 1) keep the bounding box for a face once it's created; this is
+ * especially important for B faces, since they were being created and
+ * recreated over and over
+ * 2) associate a "split" index in the faceB vector with each A face; when
+ * an A face is split, we will not need to recheck any B faces have
+ * already been checked against that original A face
*/
+
void BOP_Face2Face(BOP_Mesh *mesh, BOP_Faces *facesA, BOP_Faces *facesB)
-{
+{
for(unsigned int idxFaceA=0;idxFaceA<facesA->size();idxFaceA++) {
BOP_Face *faceA = (*facesA)[idxFaceA];
MT_Plane3 planeA = faceA->getPlane();
@@ -154,23 +166,33 @@ void BOP_Face2Face(BOP_Mesh *mesh, BOP_Faces *facesA, BOP_Faces *facesB)
MT_Point3 p2 = mesh->getVertex(faceA->getVertex(1))->getPoint();
MT_Point3 p3 = mesh->getVertex(faceA->getVertex(2))->getPoint();
- BOP_BBox boxA(p1,p2,p3);
-
- for(unsigned int idxFaceB=0;
+ /* get (or create) bounding box for face A */
+ if( faceA->getBBox() == NULL )
+ faceA->setBBox(p1,p2,p3);
+ BOP_BBox *boxA = faceA->getBBox();
+
+ /* start checking B faces with the previously stored split index */
+
+ for(unsigned int idxFaceB=faceA->getSplit();
idxFaceB<facesB->size() && (faceA->getTAG() != BROKEN) && (faceA->getTAG() != PHANTOM);) {
BOP_Face *faceB = (*facesB)[idxFaceB];
+ faceA->setSplit(idxFaceB);
if ((faceB->getTAG() != BROKEN) && (faceB->getTAG() != PHANTOM)) {
- BOP_BBox boxB(mesh->getVertex(faceB->getVertex(0))->getPoint(),
- mesh->getVertex(faceB->getVertex(1))->getPoint(),
- mesh->getVertex(faceB->getVertex(2))->getPoint());
- if (boxA.intersect(boxB)) {
+ /* get (or create) bounding box for face B */
+ if( faceB->getBBox() == NULL )
+ faceB->setBBox(mesh->getVertex(faceB->getVertex(0))->getPoint(),
+ mesh->getVertex(faceB->getVertex(1))->getPoint(),
+ mesh->getVertex(faceB->getVertex(2))->getPoint());
+ BOP_BBox *boxB = faceB->getBBox();
+
+ if (boxA->intersect(*boxB)) {
MT_Plane3 planeB = faceB->getPlane();
if (BOP_containsPoint(planeB,p1) &&
BOP_containsPoint(planeB,p2) &&
BOP_containsPoint(planeB,p3)) {
if (BOP_orientation(planeB,planeA)>0) {
- BOP_intersectCoplanarFaces(mesh,facesB,faceA,faceB,false);
+ BOP_intersectCoplanarFaces(mesh,facesB,faceA,faceB,false);
}
}
else {
@@ -178,10 +200,7 @@ void BOP_Face2Face(BOP_Mesh *mesh, BOP_Faces *facesA, BOP_Faces *facesB)
}
}
}
- if (faceB->getTAG()==BROKEN){
- facesB->erase(facesB->begin()+idxFaceB);
- }else
- idxFaceB++;
+ idxFaceB++;
}
}
@@ -385,56 +404,11 @@ void BOP_mergeVertexs(BOP_Mesh *mesh, unsigned int firstFace)
for(unsigned int idxFace = firstFace; idxFace < numFaces; idxFace++) {
BOP_Face *face = mesh->getFace(idxFace);
if ((face->getTAG() != BROKEN) && (face->getTAG() != PHANTOM)) {
- BOP_Index v1 = face->getVertex(0);
- BOP_Index v2 = face->getVertex(1);
- BOP_Index v3 = face->getVertex(2);
- MT_Point3 vertex1 = mesh->getVertex(v1)->getPoint();
- MT_Point3 vertex2 = mesh->getVertex(v2)->getPoint();
- MT_Point3 vertex3 = mesh->getVertex(v3)->getPoint();
- int dist12 = BOP_comp(vertex1,vertex2);
- int dist13 = BOP_comp(vertex1,vertex3);
- int dist23 = BOP_comp(vertex2,vertex3);
-
- if (dist12 == 0) {
- if (dist13 == 0) {
- // v1 ~= v2 , v1 ~= v3 , v2 ~= v3
- mesh->replaceVertexIndex(v2,v1);
- mesh->replaceVertexIndex(v3,v1);
- }
- else {
- if (dist23 == 0) {
- mesh->replaceVertexIndex(v1,v2);
- mesh->replaceVertexIndex(v3,v2);
- }
- else {
- mesh->replaceVertexIndex(v1,v2);
- }
- }
- }
- else {
- if (dist13 == 0) {
- // v1 ~= v3
- if (dist23 == 0) {
- mesh->replaceVertexIndex(v1,v3);
- mesh->replaceVertexIndex(v2,v3);
- }
- else {
- mesh->replaceVertexIndex(v1,v3);
- }
- }
- else {
- if (dist23 == 0) {
- // v2 ~= v3
- mesh->replaceVertexIndex(v2,v3);
- } else {
- // all differents
- if (BOP_collinear(vertex1,vertex2,vertex3)) {
- // collinear triangle
- face->setTAG(PHANTOM);
- }
- }
- }
- }
+ MT_Point3 vertex1 = mesh->getVertex(face->getVertex(0))->getPoint();
+ MT_Point3 vertex2 = mesh->getVertex(face->getVertex(1))->getPoint();
+ MT_Point3 vertex3 = mesh->getVertex(face->getVertex(2))->getPoint();
+ if (BOP_collinear(vertex1,vertex2,vertex3)) // collinear triangle
+ face->setTAG(PHANTOM);
}
}
}
@@ -507,7 +481,7 @@ void BOP_mergeSort(MT_Point3 *points, unsigned int *face, unsigned int &size, bo
if (size == 2) {
// Trivial case, only test the merge ...
- if (BOP_comp(0,points[0].distance(points[1]))==0) {
+ if (BOP_fuzzyZero(points[0].distance(points[1]))) {
face[0] = 3;
size--;
}
@@ -592,8 +566,8 @@ void BOP_mergeSort(MT_Point3 *points, unsigned int *face, unsigned int &size, bo
// Merge data
MT_Scalar d1 = sortedPoints[1].distance(sortedPoints[0]);
MT_Scalar d2 = sortedPoints[1].distance(sortedPoints[2]);
- if (BOP_comp(0,d1)==0 && sortedFaces[1] != sortedFaces[0]) {
- if (BOP_comp(0,d2)==0 && sortedFaces[1] != sortedFaces[2]) {
+ if (BOP_fuzzyZero(d1) && sortedFaces[1] != sortedFaces[0]) {
+ if (BOP_fuzzyZero(d2) && sortedFaces[1] != sortedFaces[2]) {
if (d1 < d2) {
// merge 0 and 1
sortedFaces[0] = 3;
@@ -605,7 +579,7 @@ void BOP_mergeSort(MT_Point3 *points, unsigned int *face, unsigned int &size, bo
if (size == 3) {
// merge 1 and 2 ???
d1 = sortedPoints[1].distance(sortedPoints[2]);
- if (BOP_comp(0,d1)==0 && sortedFaces[1] != sortedFaces[2]) {
+ if (BOP_fuzzyZero(d1) && sortedFaces[1] != sortedFaces[2]) {
// merge!
sortedFaces[1] = 3;
size--;
@@ -633,7 +607,7 @@ void BOP_mergeSort(MT_Point3 *points, unsigned int *face, unsigned int &size, bo
if (size == 3) {
// merge 1 i 2 ???
d1 = sortedPoints[1].distance(sortedPoints[2]);
- if (BOP_comp(0,d1)==0 && sortedFaces[1] != sortedFaces[2]) {
+ if (BOP_fuzzyZero(d1) && sortedFaces[1] != sortedFaces[2]) {
// merge!
sortedFaces[1] = 3;
size--;
@@ -642,7 +616,7 @@ void BOP_mergeSort(MT_Point3 *points, unsigned int *face, unsigned int &size, bo
}
}
else {
- if (BOP_comp(0,d2)==0 && sortedFaces[1] != sortedFaces[2]) {
+ if (BOP_fuzzyZero(d2) && sortedFaces[1] != sortedFaces[2]) {
// merge 1 and 2
sortedFaces[1] = 3;
for(i = 2; i<size-1;i++) {
@@ -653,7 +627,7 @@ void BOP_mergeSort(MT_Point3 *points, unsigned int *face, unsigned int &size, bo
}
else if (size == 4) {
d1 = sortedPoints[2].distance(sortedPoints[3]);
- if (BOP_comp(0,d1)==0 && sortedFaces[2] != sortedFaces[3]) {
+ if (BOP_fuzzyZero(d1) && sortedFaces[2] != sortedFaces[3]) {
// merge 2 and 3
sortedFaces[2] = 3;
size--;
diff --git a/intern/boolop/intern/BOP_MathUtils.cpp b/intern/boolop/intern/BOP_MathUtils.cpp
index 7a0210247eb..e0d96b465ee 100644
--- a/intern/boolop/intern/BOP_MathUtils.cpp
+++ b/intern/boolop/intern/BOP_MathUtils.cpp
@@ -1,4 +1,7 @@
/**
+ *
+ * $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -23,7 +26,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Marc Freixas, Ken Hughes
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
@@ -40,9 +43,38 @@ using namespace std;
*/
int BOP_comp(const MT_Scalar A, const MT_Scalar B)
{
+#ifndef VAR_EPSILON
if (A >= B + BOP_EPSILON) return 1;
else if (B >= A + BOP_EPSILON) return -1;
else return 0;
+#else
+ int expA, expB;
+ float mant;
+ frexp(A, &expA); /* get exponents of each number */
+ frexp(B, &expB);
+
+ if(expA < expB) /* find the larger exponent */
+ expA = expB;
+ mant = frexp((A-B), &expB); /* get exponent of the difference */
+ /* mantissa will only be zero is (A-B) is really zero; otherwise, also
+ * also allow a "reasonably" small exponent or "reasonably large"
+ * difference in exponents to be considers "close to zero" */
+ if( mant == 0 || expB < -30 || expA - expB > 31) return 0;
+ else if( mant > 0) return 1;
+ else return -1;
+#endif
+}
+
+/**
+ * Compares a scalar with EPSILON accuracy.
+ * @param A scalar
+ * @return 1 if A > 0, -1 if A < 0, 0 otherwise
+ */
+int BOP_comp0(const MT_Scalar A)
+{
+ if (A >= BOP_EPSILON) return 1;
+ else if (0 >= A + BOP_EPSILON) return -1;
+ else return 0;
}
/**
@@ -53,6 +85,7 @@ int BOP_comp(const MT_Scalar A, const MT_Scalar B)
*/
int BOP_comp(const MT_Tuple3& A, const MT_Tuple3& B)
{
+#ifndef VAR_EPSILON
if (A.x() >= (B.x() + BOP_EPSILON)) return 1;
else if (B.x() >= (A.x() + BOP_EPSILON)) return -1;
else if (A.y() >= (B.y() + BOP_EPSILON)) return 1;
@@ -60,6 +93,13 @@ int BOP_comp(const MT_Tuple3& A, const MT_Tuple3& B)
else if (A.z() >= (B.z() + BOP_EPSILON)) return 1;
else if (B.z() >= (A.z() + BOP_EPSILON)) return -1;
else return 0;
+#else
+ int result = BOP_comp(A.x(), B.x());
+ if (result != 0) return result;
+ result = BOP_comp(A.y(), B.y());
+ if (result != 0) return result;
+ return BOP_comp(A.z(), B.z());
+#endif
}
/**
@@ -113,12 +153,20 @@ bool BOP_between(const MT_Point3& p1, const MT_Point3& p2, const MT_Point3& p3)
*/
bool BOP_collinear(const MT_Point3& p1, const MT_Point3& p2, const MT_Point3& p3)
{
+ if( BOP_comp(p1,p2) == 0 || BOP_comp(p2,p3) == 0 ) return true;
+
MT_Vector3 v1 = p2 - p1;
MT_Vector3 v2 = p3 - p2;
-
+
+ /* normalize vectors before taking their cross product, so its length
+ * has some actual meaning */
+ // if(MT_fuzzyZero(v1.length()) || MT_fuzzyZero(v2.length())) return true;
+ v1.normalize();
+ v2.normalize();
+
MT_Vector3 w = v1.cross(v2);
- return (BOP_comp(w.x(),0.0) == 0) && (BOP_comp(w.y(),0.0) == 0) && (BOP_comp(w.z(),0.0) == 0);
+ return (BOP_fuzzyZero(w.x()) && BOP_fuzzyZero(w.y()) && BOP_fuzzyZero(w.z()));
}
/**
@@ -184,17 +232,17 @@ bool BOP_intersect(const MT_Vector3& vL1, const MT_Point3& pL1, const MT_Vector3
MT_Scalar t = -1;
MT_Scalar den = (vL1.y()*vL2.x() - vL1.x() * vL2.y());
- if (BOP_comp(den,0)) {
+ if (!BOP_fuzzyZero(den)) {
t = (pL2.y()*vL1.x() - vL1.y()*pL2.x() + pL1.x()*vL1.y() - pL1.y()*vL1.x()) / den ;
}
else {
den = (vL1.y()*vL2.z() - vL1.z() * vL2.y());
- if (BOP_comp(den,0)) {
+ if (!BOP_fuzzyZero(den)) {
t = (pL2.y()*vL1.z() - vL1.y()*pL2.z() + pL1.z()*vL1.y() - pL1.y()*vL1.z()) / den ;
}
else {
den = (vL1.x()*vL2.z() - vL1.z() * vL2.x());
- if (BOP_comp(den,0)) {
+ if (!BOP_fuzzyZero(den)) {
t = (pL2.x()*vL1.z() - vL1.x()*pL2.z() + pL1.z()*vL1.x() - pL1.x()*vL1.z()) / den ;
}
else {
@@ -318,7 +366,7 @@ MT_Scalar BOP_orientation(const MT_Plane3& p1, const MT_Plane3& p2)
int BOP_classify(const MT_Point3& p, const MT_Plane3& plane)
{
// Compare plane - point distance with zero
- return BOP_comp(plane.signedDistance(p),0);
+ return BOP_comp0(plane.signedDistance(p));
}
/**
@@ -360,7 +408,7 @@ MT_Point3 BOP_intersectPlane(const MT_Plane3& plane, const MT_Point3& p1, const
*/
bool BOP_containsPoint(const MT_Plane3& plane, const MT_Point3& point)
{
- return BOP_comp(plane.signedDistance(point),0) == 0;
+ return BOP_fuzzyZero(plane.signedDistance(point));
}
/**
@@ -416,8 +464,8 @@ MT_Scalar BOP_EpsilonDistance(const MT_Point3& p0, const MT_Point3& p1, const MT
MT_Scalar d1 = p0.distance(q);
MT_Scalar d;
- if (BOP_comp(d0,0)==0) d = 1.0;
- else if (BOP_comp(d1,0)==0) d = 0.0;
+ if (BOP_fuzzyZero(d0)) d = 1.0;
+ else if (BOP_fuzzyZero(d1)) d = 0.0;
else d = d1 / d0;
return d;
}
diff --git a/intern/boolop/intern/BOP_MathUtils.h b/intern/boolop/intern/BOP_MathUtils.h
index 61458bd8a78..3cff2d6a23b 100644
--- a/intern/boolop/intern/BOP_MathUtils.h
+++ b/intern/boolop/intern/BOP_MathUtils.h
@@ -1,4 +1,7 @@
/**
+ *
+ * $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -23,7 +26,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Marc Freixas, Ken Hughes
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
@@ -36,16 +39,23 @@
#include "MT_Point3.h"
#include "MT_Plane3.h"
+/* define this to give better precision comparisons */
+#define VAR_EPSILON
+
+#ifndef VAR_EPSILON
const MT_Scalar BOP_EPSILON(1.0e-5);
+#else
+const MT_Scalar BOP_EPSILON(9.3132257461547852e-10); /* ~= 2**-30 */
+#endif
inline int BOP_sign(MT_Scalar x) {
return x < 0.0 ? -1 : x > 0.0 ? 1 : 0;
}
inline MT_Scalar BOP_abs(MT_Scalar x) { return fabs(x); }
-inline bool BOP_fuzzyZero(MT_Scalar x) { return BOP_abs(x) < BOP_EPSILON; }
-
int BOP_comp(const MT_Scalar A, const MT_Scalar B);
int BOP_comp(const MT_Tuple3& A, const MT_Tuple3& B);
+int BOP_comp0(const MT_Scalar A);
+inline bool BOP_fuzzyZero(MT_Scalar x) { return BOP_comp0(x) == 0; }
int BOP_exactComp(const MT_Scalar A, const MT_Scalar B);
int BOP_exactComp(const MT_Tuple3& A, const MT_Tuple3& B);
bool BOP_between(const MT_Point3& p1, const MT_Point3& p2, const MT_Point3& p3);
diff --git a/intern/boolop/intern/BOP_Merge.cpp b/intern/boolop/intern/BOP_Merge.cpp
index fb5bfbc0e7b..c2b1a2db2b7 100644
--- a/intern/boolop/intern/BOP_Merge.cpp
+++ b/intern/boolop/intern/BOP_Merge.cpp
@@ -1,4 +1,7 @@
/**
+ *
+ * $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -23,7 +26,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Marc Freixas, Ken Hughes
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
@@ -592,6 +595,7 @@ bool BOP_Merge::createQuads()
// Get mesh faces
BOP_Faces faces = m_mesh->getFaces();
+
// Merge mesh triangles
const BOP_IT_Faces facesIEnd = (faces.end()-1);
diff --git a/intern/boolop/intern/BOP_Mesh.cpp b/intern/boolop/intern/BOP_Mesh.cpp
index 3b194ef72d4..0b70cc61533 100644
--- a/intern/boolop/intern/BOP_Mesh.cpp
+++ b/intern/boolop/intern/BOP_Mesh.cpp
@@ -681,6 +681,23 @@ unsigned int BOP_Mesh::getNumFaces(BOP_TAG tag)
}
/**
+ * Marks faces which bad edges as BROKEN (invalid face, no further processing).
+ * @param edge edge which is being replaced
+ * @param mesh mesh containing faces
+ */
+
+static void removeBrokenFaces( BOP_Edge *edge, BOP_Mesh *mesh )
+{
+ BOP_Faces m_faces = mesh->getFaces();
+
+ BOP_Indexs edgeFaces = edge->getFaces();
+ const BOP_IT_Indexs edgeFacesEnd = edgeFaces.end();
+ for(BOP_IT_Indexs idxFace=edgeFaces.begin();idxFace!=edgeFacesEnd;
+ idxFace++)
+ m_faces[*idxFace]->setTAG(BROKEN);
+}
+
+/**
* Replaces a vertex index.
* @param oldIndex old vertex index
* @param newIndex new vertex index
@@ -695,9 +712,6 @@ BOP_Index BOP_Mesh::replaceVertexIndex(BOP_Index oldIndex, BOP_Index newIndex)
BOP_Vertex *newVertex = m_vertexs[newIndex];
BOP_Indexs oldEdges = oldVertex->getEdges();
- BOP_Index edgeIdx=0;
- bool found = false;
-
// Update faces to the newIndex
BOP_IT_Indexs oldEdgesEnd = oldEdges.end();
for(oldEdgeIndex=oldEdges.begin();oldEdgeIndex!=oldEdgesEnd;
@@ -706,14 +720,9 @@ BOP_Index BOP_Mesh::replaceVertexIndex(BOP_Index oldIndex, BOP_Index newIndex)
if ((edge->getVertex1()==oldIndex && edge->getVertex2()==newIndex) ||
(edge->getVertex2()==oldIndex && edge->getVertex1()==newIndex)) {
// Remove old edge ==> set edge faces to BROKEN
- BOP_Indexs edgeFaces = edge->getFaces();
- const BOP_IT_Indexs edgeFacesEnd = edgeFaces.end();
- for(BOP_IT_Indexs idxFace=edgeFaces.begin();idxFace!=edgeFacesEnd;
- idxFace++) {
- m_faces[*idxFace]->setTAG(BROKEN);
- }
- edgeIdx = *oldEdgeIndex;
- found = true;
+ removeBrokenFaces( edge, this );
+ oldVertex->removeEdge(*oldEdgeIndex);
+ newVertex->removeEdge(*oldEdgeIndex);
}
else {
BOP_Indexs faces = edge->getFaces();
@@ -724,10 +733,6 @@ BOP_Index BOP_Mesh::replaceVertexIndex(BOP_Index oldIndex, BOP_Index newIndex)
}
}
}
- if (found) {
- oldVertex->removeEdge(edgeIdx);
- newVertex->removeEdge(edgeIdx);
- }
oldEdgesEnd = oldEdges.end();
for(oldEdgeIndex=oldEdges.begin();oldEdgeIndex!=oldEdgesEnd;
@@ -739,6 +744,10 @@ BOP_Index BOP_Mesh::replaceVertexIndex(BOP_Index oldIndex, BOP_Index newIndex)
v1 = (v1==oldIndex?edge->getVertex2():v1);
if ((edge2 = getEdge(newIndex,v1)) == NULL) {
edge->replaceVertexIndex(oldIndex,newIndex);
+ if ( edge->getVertex1() == edge->getVertex2() ) {
+ removeBrokenFaces( edge, this );
+ oldVertex->removeEdge(*oldEdgeIndex);
+ }
#ifdef HASH
rehashVertex(oldIndex,newIndex,v1);
#endif
@@ -754,6 +763,11 @@ BOP_Index BOP_Mesh::replaceVertexIndex(BOP_Index oldIndex, BOP_Index newIndex)
BOP_Vertex *oppositeVertex = m_vertexs[v1];
oppositeVertex->removeEdge(*oldEdgeIndex);
edge->replaceVertexIndex(oldIndex,newIndex);
+ if ( edge->getVertex1() == edge->getVertex2() ) {
+ removeBrokenFaces( edge, this );
+ oldVertex->removeEdge(*oldEdgeIndex);
+ newVertex->removeEdge(*oldEdgeIndex);
+ }
#ifdef HASH
rehashVertex(oldIndex,newIndex,v1);
#endif
@@ -1063,3 +1077,4 @@ void BOP_Mesh::updatePlanes()
face->setPlane(plane);
}
}
+
diff --git a/intern/boolop/intern/BOP_Triangulator.cpp b/intern/boolop/intern/BOP_Triangulator.cpp
index ad23e69d8c0..fd7b3154195 100644
--- a/intern/boolop/intern/BOP_Triangulator.cpp
+++ b/intern/boolop/intern/BOP_Triangulator.cpp
@@ -90,8 +90,11 @@ void BOP_triangulateA(BOP_Mesh *mesh, BOP_Faces *faces, BOP_Face * face, BOP_Ind
BOP_addFace(mesh, faces, face1, face->getTAG());
BOP_addFace(mesh, faces, face2, face->getTAG());
+ face1->setSplit(face->getSplit());
+ face2->setSplit(face->getSplit());
face->setTAG(BROKEN);
+ face->freeBBox();
}
/**
@@ -122,7 +125,11 @@ void BOP_triangulateB(BOP_Mesh* mesh, BOP_Faces* faces, BOP_Face* face, BOP_Inde
BOP_addFace(mesh,faces,face1,face->getTAG());
BOP_addFace(mesh,faces,face2,face->getTAG());
BOP_addFace(mesh,faces,face3,face->getTAG());
+ face1->setSplit(face->getSplit());
+ face2->setSplit(face->getSplit());
+ face3->setSplit(face->getSplit());
face->setTAG(BROKEN);
+ face->freeBBox();
}
@@ -180,26 +187,33 @@ void BOP_triangulateC_split(BOP_Mesh* mesh, BOP_Faces* faces, BOP_Face* face,
{
BOP_Index v = BOP_getTriangleVertex(mesh, v1, v2, v4, v5);
BOP_Index w = (v == v4 ? v5 : v4);
+ BOP_Face *face1 = new BOP_Face3(v1, v, w, face->getPlane(), face->getOriginalFace());
+ BOP_Face *face2 = new BOP_Face3(v1, v2, v, face->getPlane(), face->getOriginalFace());
+ BOP_Face *face3 = new BOP_Face3(v1, w, v3, face->getPlane(), face->getOriginalFace());
// v1 v w defines the nice triangle in the correct order
// v1 v2 v defines one lateral triangle in the correct order
// v1 w v3 defines the other lateral triangle in the correct order
// w v v2 v3 defines the quad in the correct order
- BOP_addFace(mesh, faces, new BOP_Face3(v1, v, w, face->getPlane(),
- face->getOriginalFace()), face->getTAG());
- BOP_addFace(mesh, faces, new BOP_Face3(v1, v2, v, face->getPlane(),
- face->getOriginalFace()), face->getTAG());
- BOP_addFace(mesh, faces, new BOP_Face3(v1, w, v3, face->getPlane(),
- face->getOriginalFace()), face->getTAG());
+ BOP_addFace(mesh, faces, face1, face->getTAG());
+ BOP_addFace(mesh, faces, face2, face->getTAG());
+ BOP_addFace(mesh, faces, face3, face->getTAG());
+
+ face1->setSplit(face->getSplit());
+ face2->setSplit(face->getSplit());
+ face3->setSplit(face->getSplit());
BOP_Face *faces45[2];
BOP_splitQuad(mesh, face->getPlane(), v2, v3, w, v, faces45, face->getOriginalFace());
BOP_addFace(mesh, faces, faces45[0], face->getTAG());
BOP_addFace(mesh, faces, faces45[1], face->getTAG());
+ faces45[0]->setSplit(face->getSplit());
+ faces45[1]->setSplit(face->getSplit());
face->setTAG(BROKEN);
+ face->freeBBox();
}
@@ -254,15 +268,19 @@ void BOP_triangulateD_split(BOP_Mesh* mesh, BOP_Faces* faces, BOP_Face* face,
{
BOP_Index v = BOP_getNearestVertex(mesh, v1, v4, v5);
BOP_Index w = (v == v4 ? v5 : v4);
+ BOP_Face *face1 = new BOP_Face3(v1, v, v3, face->getPlane(), face->getOriginalFace());
+ BOP_Face *face2 = new BOP_Face3(v, w, v3, face->getPlane(), face->getOriginalFace());
+ BOP_Face *face3 = new BOP_Face3(w, v2, v3, face->getPlane(), face->getOriginalFace());
- BOP_addFace(mesh, faces, new BOP_Face3(v1, v, v3, face->getPlane(),
- face->getOriginalFace()), face->getTAG());
- BOP_addFace(mesh, faces, new BOP_Face3(v, w, v3, face->getPlane(),
- face->getOriginalFace()), face->getTAG());
- BOP_addFace(mesh, faces, new BOP_Face3(w, v2, v3, face->getPlane(),
- face->getOriginalFace()), face->getTAG());
-
+ BOP_addFace(mesh, faces, face1, face->getTAG());
+ BOP_addFace(mesh, faces, face2, face->getTAG());
+ BOP_addFace(mesh, faces, face3, face->getTAG());
+ face1->setSplit(face->getSplit());
+ face2->setSplit(face->getSplit());
+ face3->setSplit(face->getSplit());
+
face->setTAG(BROKEN);
+ face->freeBBox();
}
@@ -328,7 +346,11 @@ void BOP_triangulateE(BOP_Mesh* mesh, BOP_Faces* faces, BOP_Face* face,
BOP_addFace(mesh, faces, face1, face->getTAG());
BOP_addFace(mesh, faces, faces23[0], face->getTAG());
BOP_addFace(mesh, faces, faces23[1], face->getTAG());
+ face1->setSplit(face->getSplit());
+ faces23[0]->setSplit(face->getSplit());
+ faces23[1]->setSplit(face->getSplit());
face->setTAG(BROKEN);
+ face->freeBBox();
}
/**
@@ -380,8 +402,13 @@ void BOP_triangulateF(BOP_Mesh* mesh, BOP_Faces* faces, BOP_Face* face,
BOP_addFace(mesh, faces, faces12[1], face->getTAG());
BOP_addFace(mesh, faces, faces34[0], face->getTAG());
BOP_addFace(mesh, faces, faces34[1], face->getTAG());
+ faces12[0]->setSplit(face->getSplit());
+ faces12[1]->setSplit(face->getSplit());
+ faces34[0]->setSplit(face->getSplit());
+ faces34[1]->setSplit(face->getSplit());
face->setTAG(BROKEN);
+ face->freeBBox();
}
/**
diff --git a/intern/bsp/extern/CSG_BooleanOps.h b/intern/bsp/extern/CSG_BooleanOps.h
index 1e862568cda..1e862568cda 100755..100644
--- a/intern/bsp/extern/CSG_BooleanOps.h
+++ b/intern/bsp/extern/CSG_BooleanOps.h
diff --git a/intern/bsp/intern/BSP_CSGException.h b/intern/bsp/intern/BSP_CSGException.h
index c2d79630be2..c2d79630be2 100755..100644
--- a/intern/bsp/intern/BSP_CSGException.h
+++ b/intern/bsp/intern/BSP_CSGException.h
diff --git a/intern/bsp/intern/BSP_CSGMesh.cpp b/intern/bsp/intern/BSP_CSGMesh.cpp
index 5da39c8d551..5da39c8d551 100755..100644
--- a/intern/bsp/intern/BSP_CSGMesh.cpp
+++ b/intern/bsp/intern/BSP_CSGMesh.cpp
diff --git a/intern/bsp/intern/BSP_CSGMesh.h b/intern/bsp/intern/BSP_CSGMesh.h
index 47903520157..47903520157 100755..100644
--- a/intern/bsp/intern/BSP_CSGMesh.h
+++ b/intern/bsp/intern/BSP_CSGMesh.h
diff --git a/intern/bsp/intern/BSP_CSGMesh_CFIterator.h b/intern/bsp/intern/BSP_CSGMesh_CFIterator.h
index 6863bf38cfc..010f62159a5 100755..100644
--- a/intern/bsp/intern/BSP_CSGMesh_CFIterator.h
+++ b/intern/bsp/intern/BSP_CSGMesh_CFIterator.h
@@ -125,7 +125,8 @@ BSP_CSGMeshVertexIt_Construct(
BSP_CSGMesh_VertexIt * v_it = new BSP_CSGMesh_VertexIt;
v_it->mesh = mesh;
- v_it->pos = &mesh->VertexSet()[0];
+ if( output->num_elements > 0 )
+ v_it->pos = &mesh->VertexSet()[0];
output->it = v_it;
};
@@ -257,11 +258,11 @@ BSP_CSGMesh_FaceIt_Construct(
BSP_CSGMesh_FaceIt * f_it = new BSP_CSGMesh_FaceIt;
f_it->mesh = mesh;
- f_it->pos = &mesh->FaceSet()[0];
+ if( output->num_elements > 0 )
+ f_it->pos = &mesh->FaceSet()[0];
f_it->face_triangle = 0;
output->it = f_it;
-
};
diff --git a/intern/bsp/intern/BSP_MeshPrimitives.cpp b/intern/bsp/intern/BSP_MeshPrimitives.cpp
index 54db5851be3..54db5851be3 100755..100644
--- a/intern/bsp/intern/BSP_MeshPrimitives.cpp
+++ b/intern/bsp/intern/BSP_MeshPrimitives.cpp
diff --git a/intern/bsp/intern/CSG_BooleanOps.cpp b/intern/bsp/intern/CSG_BooleanOps.cpp
index c6f4c5d34d0..c6f4c5d34d0 100755..100644
--- a/intern/bsp/intern/CSG_BooleanOps.cpp
+++ b/intern/bsp/intern/CSG_BooleanOps.cpp
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsp b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsp
index aaa45273845..aaa45273845 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsp
+++ b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsp
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsw b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsw
index 802fba84bef..802fba84bef 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsw
+++ b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest.dsw
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp
index ec34b104e4a..ec34b104e4a 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp
+++ b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.cpp
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.h b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.h
index 042c73174a6..042c73174a6 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.h
+++ b/intern/bsp/test/BSP_GhostTest/BSP_GhostTest3D.h
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp b/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp
index 4f5f5d46535..4f5f5d46535 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp
+++ b/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.cpp
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.h b/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.h
index 314b9691137..314b9691137 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.h
+++ b/intern/bsp/test/BSP_GhostTest/BSP_MeshDrawer.h
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp b/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp
index f148250f1aa..f148250f1aa 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp
+++ b/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.cpp
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.h b/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.h
index d2e9b8cd2cc..d2e9b8cd2cc 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.h
+++ b/intern/bsp/test/BSP_GhostTest/BSP_PlyLoader.h
diff --git a/intern/bsp/test/BSP_GhostTest/BSP_TMesh.h b/intern/bsp/test/BSP_GhostTest/BSP_TMesh.h
index eeb4df3d0d9..eeb4df3d0d9 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/BSP_TMesh.h
+++ b/intern/bsp/test/BSP_GhostTest/BSP_TMesh.h
diff --git a/intern/bsp/test/BSP_GhostTest/main.cpp b/intern/bsp/test/BSP_GhostTest/main.cpp
index 6b0e0d66234..6b0e0d66234 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/main.cpp
+++ b/intern/bsp/test/BSP_GhostTest/main.cpp
diff --git a/intern/bsp/test/BSP_GhostTest/ply.h b/intern/bsp/test/BSP_GhostTest/ply.h
index 7947d224c5f..7947d224c5f 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/ply.h
+++ b/intern/bsp/test/BSP_GhostTest/ply.h
diff --git a/intern/bsp/test/BSP_GhostTest/plyfile.c b/intern/bsp/test/BSP_GhostTest/plyfile.c
index fd808aa0889..fd808aa0889 100755..100644
--- a/intern/bsp/test/BSP_GhostTest/plyfile.c
+++ b/intern/bsp/test/BSP_GhostTest/plyfile.c
diff --git a/intern/csg/SConscript b/intern/csg/SConscript
deleted file mode 100644
index 84d718e5b67..00000000000
--- a/intern/csg/SConscript
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/python
-Import('env')
-
-sources = env.Glob('intern/*.cpp') + env.Glob('intern/*.inl')
-
-incs = 'intern ../container ../moto/include ../memutil intern/blender extern'
-
-env.BlenderLib ('blender_BSP', sources, Split(incs) , [], libtype='blender', priority=15)
diff --git a/intern/csg/extern/CSG_Interface.h b/intern/csg/extern/CSG_Interface.h
deleted file mode 100644
index 44b01c6f500..00000000000
--- a/intern/csg/extern/CSG_Interface.h
+++ /dev/null
@@ -1,434 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-#ifndef CSG_BOOLEANOPS_H
-#define CSG_BOOLEANOPS_H
-
-
-/**
- * @section Interface structures for CSG module.
- * This interface falls into 2 categories.
- * The first section deals with an abstract mesh description
- * between blender and this module. The second deals with
- * the module functions.
- * The CSG module needs to know about the following entities:
- */
-
-/**
- * CSG_IFace -- an interface polygon structure.
- * vertex_index is a fixed size array of 4 elements containing indices into
- * an abstract vertex container. 3 or 4 of these elements may be used to
- * describe either quads or triangles.
- * vertex_number is the number of vertices in this face - either 3 or 4.
- * vertex_colors is an array of {r,g,b} triplets one for each vertex index.
- * tex_coords is an array of {u,v} triplets one for each vertex index.
- * user_data is a pointer to arbitary data of fixed width ,
- * this data is copied around with the face, and duplicated if a face is
- * split. Contains things like material index.
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if 0
-typedef struct {
- int vertex_index[4];
- int vertex_number;
-
- void *user_face_vertex_data[4];
- void *user_face_data;
-} CSG_IFace;
-#else
-
-/**
- * The following structs are much better to use than the crazy
- * abstract type above. It's a value type an allows the CSG
- * module to directly access mesh properties which is very useful
- * for debugging etc.
- */
-
-typedef struct
-{
- int m_vertexIndex;
- float m_uv[2];
- float m_color[4];
- short m_normal[3];
-} CSG_IFaceVertexData;
-
-typedef struct
-{
- struct Material *m_material;
-
- /* assorted tface flags */
- void *m_tpage;
- char m_flag, m_transp;
- short m_mode, m_tile;
-} CSG_IFaceData;
-
-typedef struct
-{
- CSG_IFaceVertexData m_vertexData[4];
- int m_vertexNumber;
-
- CSG_IFaceData m_faceData;
-
-} CSG_IFace;
-
-#endif
-
-/**
- * CSG_IVertex -- an interface vertex structure.
- * position is the location of the vertex in 3d space.
- */
-
-typedef struct {
- float position[3];
-} CSG_IVertex;
-
-
-/**
- * @section Iterator abstraction.
- *
- * The CSG module asks blender to fill in an instance of the above
- * structure, and requests blender to move up and down (iterate) through
- * it's face and vertex containers.
- *
- * An iterator supports the following functions.
- * int IsDone(iterator *it) -- returns true if the iterator has reached
- * the end of it's container.
- *
- * void Fill(iterator *it,DataType *data) -- Return the contents of the
- * container at the current iterator position.
- *
- * void Step(iterator *it) -- increment the iterator to the next position
- * in the container.
- *
- * The iterator is used in the following manner.
- *
- * MyIterator * iterator = ...
- * DataType data;
- *
- * while (!IsDone(iterator)) {
- * Fill(iterator,&data);
- * //process information pointed to by data
- * ...
- * Step(iterator);
- * }
- *
- * The CSG module does not want to know about the implementation of these
- * functions so we use the c function ptr mechanism to hide them. Our
- * iterator descriptor now looks like this.
- */
-
-typedef void* CSG_IteratorPtr;
-
-typedef int (*CSG_FaceItDoneFunc)(CSG_IteratorPtr it);
-typedef void (*CSG_FaceItFillFunc)(CSG_IteratorPtr it,CSG_IFace *face);
-typedef void (*CSG_FaceItStepFunc)(CSG_IteratorPtr it);
-typedef void (*CSG_FaceItResetFunc)(CSG_IteratorPtr it);
-
-typedef struct CSG_FaceIteratorDescriptor {
- CSG_IteratorPtr it;
- CSG_FaceItDoneFunc Done;
- CSG_FaceItFillFunc Fill;
- CSG_FaceItStepFunc Step;
- CSG_FaceItResetFunc Reset;
- unsigned int num_elements;
-} CSG_FaceIteratorDescriptor;
-
-/**
- * Similarly to walk through the vertex arrays we have.
- */
-typedef int (*CSG_VertexItDoneFunc)(CSG_IteratorPtr it);
-typedef void (*CSG_VertexItFillFunc)(CSG_IteratorPtr it,CSG_IVertex *face);
-typedef void (*CSG_VertexItStepFunc)(CSG_IteratorPtr it);
-typedef void (*CSG_VertexItResetFunc)(CSG_IteratorPtr it);
-
-typedef struct CSG_VertexIteratorDescriptor {
- CSG_IteratorPtr it;
- CSG_VertexItDoneFunc Done;
- CSG_VertexItFillFunc Fill;
- CSG_VertexItStepFunc Step;
- CSG_VertexItResetFunc Reset;
- unsigned int num_elements;
-} CSG_VertexIteratorDescriptor;
-
-/**
- * The actual iterator structures are not exposed to the CSG module, they
- * will contain datatypes specific to blender.
- */
-
-/**
- * @section CSG Module interface functions.
- *
- * The functions below are to be used in the following way:
- *
- * // Create a boolean operation handle
- * CSG_BooleanOperation *operation = CSG_NewBooleanFunction();
- * if (operation == NULL) {
- * // deal with low memory exception
- * }
- *
- * // Describe each mesh operand to the module.
- * // NOTE: example properties!
- * CSG_MeshPropertyDescriptor propA,propB;
- * propA.user_data_size = 0;
- * propA.user_face_vertex_data = 0;
- * propB.user_face_vertex_data = 0;
- * propB.user_data_size = 0;
- *
- * // Get the output properties of the mesh.
- * CSG_MeshPropertyDescriptor output_properties;
- * output_properties = CSG_DescibeOperands(
- * operation,
- * propA,
- * propB
- * );
- *
- * // Report to the user if they will loose any data!
- * ...
- *
- * // Get some mesh iterators for your mesh data structures
- * CSG_FaceIteratorDescriptor obA_faces = ...
- * CSG_VertexIteratorDescriptor obA_verts = ...
- *
- * // same for object B
- * CSG_FaceIteratorDescriptor obB_faces = ...
- * CSG_VertexIteratorDescriptor obB_verts = ...
- *
- * // perform the operation...!
- *
- * int success = CSG_PerformBooleanOperation(
- * operation,
- * e_csg_intersection,
- * obA_faces,
- * obA_vertices,
- * obB_faces,
- * obB_vertices
- * );
- *
- * // if the operation failes report miserable faiulre to user
- * // and clear up data structures.
- * if (!success) {
- * ...
- * CSG_FreeBooleanOperation(operation);
- * return;
- * }
- *
- * // read the new mesh vertices back from the module
- * // and assign to your own mesh structure.
- *
- * // First we need to create a CSG_IVertex so the module can fill it in.
- * CSG_IVertex vertex;
- * CSG_VertexIteratorDescriptor * verts_it = CSG_OutputVertexDescriptor(operation);
- *
- * // initialize your vertex container with the number of verts (verts_it->num_elements)
- *
- * while (!verts_it->Done(verts_it->it)) {
- * verts_it->Fill(verts_it->it,&vertex);
- *
- * // create a new vertex of your own type and add it
- * // to your mesh structure.
- * verts_it->Step(verts_it->it);
- * }
- * // Free the vertex iterator
- * CSG_FreeVertexDescriptor(verts_it);
- *
- * // similarly for faces.
- * CSG_IFace face;
- *
- * // you may need to reserve some memory in face->user_data here.
- *
- * // initialize your face container with the number of faces (faces_it->num_elements)
- *
- * CSG_FaceIteratorDescriptor * faces_it = CSG_OutputFaceDescriptor(operation);
- *
- * while (!faces_it->Done(faces_it->it)) {
- * faces_it->Fill(faces_it->it,&face);
- *
- * // create a new face of your own type and add it
- * // to your mesh structure.
- * faces_it->Step(&faces_it->it);
- * }
- *
- * // Free the face iterator
- * CSG_FreeVertexDescriptor(faces_it);
- *
- * // that's it free the operation.
- *
- * CSG_FreeBooleanOperation(operation);
- * return;
- *
- */
-
-/**
- * Description of boolean operation type.
- */
-
-typedef enum {
- e_csg_union,
- e_csg_intersection,
- e_csg_difference,
- e_csg_classify
-} CSG_OperationType;
-
-/**
- * 'Handle' into the CSG module that identifies a particular CSG operation.
- * the pointer CSG_info containers module specific data, and should not
- * be touched in anyway outside of the module.
- */
-
-typedef struct {
- void *CSG_info;
-} CSG_BooleanOperation;
-
-/**
- * Return a ptr to a CSG_BooleanOperation object allocated
- * on the heap. The CSG module owns the memory associated with
- * the returned ptr, use CSG_FreeBooleanOperation() to free this memory.
- */
- CSG_BooleanOperation *
-CSG_NewBooleanFunction(
- void
-);
-
-/**
- * The user data is handled by the BSP modules through
- * the following function which is called whenever the
- * module needs new face vertex properties (when a face is split).
- * d1,d2 are pointers to existing vertex face data. dnew is
- * a pointer to an allocated but unfilled area of user data of
- * size user_face_vertex_data_size in the CSG_MeshPropertyDescriptor
- * returned by a call to the above function. Epsilon is the relative
- * distance (between [0,1]) of the new vertex and the vertex associated
- * with d1. Use epsilon to interpolate the face vertex data in d1 and d2
- * and fill dnew
- */
-
-typedef int (*CSG_InterpolateUserFaceVertexDataFunc)(
- const CSG_IFaceVertexData *d1,
- const CSG_IFaceVertexData * d2,
- CSG_IFaceVertexData *dnew,
- double epsilon
-);
-
-
-/**
- * Attempt to perform a boolean operation between the 2 objects of the
- * desired type. This may fail due to an internal error or lack of memory.
- * In this case 0 is returned, otehrwise 1 is returned indicating success.
- * @param operation is a 'handle' into the CSG_Module created by CSG_NewBooleanFunction()
- * @param op_type is the operation to perform.
- * @param obAFaces is an iterator over the faces of objectA,
- * @param obAVertices is an iterator over the vertices of objectA
- * @param obAFaces is an iterator over the faces of objectB,
- * @param obAVertices is an iterator over the vertices of objectB
- * @param interp_func the face_vertex data interpolation function.(see above)
- *
- * All iterators must be valid and pointing to the first element in their
- * respective containers.
- */
- int
-CSG_PerformBooleanOperation(
- CSG_BooleanOperation * operation,
- CSG_OperationType op_type,
- CSG_FaceIteratorDescriptor obAFaces,
- CSG_VertexIteratorDescriptor obAVertices,
- CSG_FaceIteratorDescriptor obBFaces,
- CSG_VertexIteratorDescriptor obBVertices,
- CSG_InterpolateUserFaceVertexDataFunc interp_func
-);
-
-/**
- * If the a boolean operation was successful, you may access the results
- * through the following functions.
- *
- * CSG_OuputFaceDescriptor() returns a ptr to a CSG_FaceIteratorDesciptor
- * allocated on the heap and owned by the CSG module. The iterator is
- * positioned at the start of the internal face container.
- * CSG_OutputVertexDescriptor() returns a ptr to a CSG_VertexIteratorDescriptor
- * allocated on the heap and owned by the CSG module. The iterator is
- * positioned at the start of the internal vertex container.
- * There is no function to rewind an iterator but you may obtain more
- * than one
- * iterator at a time. Please use the function CSG_FreeFaceIterator()
- * and CSG_FreeVertexIterator to free internal memory allocated for these
- * iterators.
- *
- * If the last operation was not successful, these functions return NULL.
- */
- int
-CSG_OutputFaceDescriptor(
- CSG_BooleanOperation * operation,
- CSG_FaceIteratorDescriptor * output
-);
-
- int
-CSG_OutputVertexDescriptor(
- CSG_BooleanOperation * operation,
- CSG_VertexIteratorDescriptor *output
-);
-
-/**
- * Clean up functions.
- * Free internal memory associated with CSG interface structures. You must
- * call these functions on any structures created by the module, even if
- * subsequent operations did not succeed.
- */
- void
-CSG_FreeVertexDescriptor(
- CSG_VertexIteratorDescriptor * v_descriptor
-);
-
- void
-CSG_FreeFaceDescriptor(
- CSG_FaceIteratorDescriptor * f_descriptor
-);
-
-/**
- * Free the memory associated with a boolean operation.
- * NOTE any iterator descriptor describing the output will become
- * invalid after this call and should be freed immediately.
- */
- void
-CSG_FreeBooleanOperation(
- CSG_BooleanOperation *operation
-);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
-#endif
-
diff --git a/intern/csg/intern/CSG_BBox.h b/intern/csg/intern/CSG_BBox.h
deleted file mode 100644
index 4d17b935a80..00000000000
--- a/intern/csg/intern/CSG_BBox.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
-The following BBox class is a lightly modfied version of what
-is found in Free Solid 2.0
-*/
-
-/*
- SOLID - Software Library for Interference Detection
- Copyright (C) 1997-1998 Gino van den Bergen
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to gino@win.tue.nl,
- or write to:
- Gino van den Bergen
- Department of Mathematics and Computing Science
- Eindhoven University of Technology
- P.O. Box 513, 5600 MB Eindhoven, The Netherlands
-*/
-
-#ifndef _BBOX_H_
-#define _BBOX_H_
-
-#include "MT_Point3.h"
-#include "MT_Vector3.h"
-#include "MT_MinMax.h"
-
-class BBox {
-public:
- BBox() {}
-
- BBox(
- const MT_Point3& mini,
- const MT_Point3& maxi
- ) { SetValue(mini,maxi); }
-
- const MT_Point3&
- Center(
- ) const {
- return m_center;
- }
-
- const MT_Vector3&
- Extent(
- ) const {
- return m_extent;
- }
-
- MT_Point3&
- Center(
- ) {
- return m_center;
- }
-
- MT_Vector3&
- Extent(
- ) {
- return m_extent;
- }
-
- void
- SetValue(
- const MT_Point3& mini,
- const MT_Point3& maxi
- ) {
- m_extent = (maxi-mini)/2;
- m_center = mini+m_extent;
- }
-
- void
- Enclose(
- const BBox& a,
- const BBox& b
- ) {
- MT_Point3 lower(
- MT_min(a.Lower(0), b.Lower(0)),
- MT_min(a.Lower(1), b.Lower(1)),
- MT_min(a.Lower(2), b.Lower(2))
- );
- MT_Point3 upper(
- MT_max(a.Upper(0), b.Upper(0)),
- MT_max(a.Upper(1), b.Upper(1)),
- MT_max(a.Upper(2), b.Upper(2))
- );
- SetValue(lower, upper);
- }
-
- void
- SetEmpty() {
- m_center.setValue(0, 0, 0);
- m_extent.setValue(-MT_INFINITY,-MT_INFINITY,-MT_INFINITY);
- }
-
- void
- Include (
- const MT_Point3& p
- ) {
- MT_Point3 lower(
- MT_min(Lower(0), p[0]),
- MT_min(Lower(1), p[1]),
- MT_min(Lower(2), p[2])
- );
- MT_Point3 upper(
- MT_max(Upper(0), p[0]),
- MT_max(Upper(1), p[1]),
- MT_max(Upper(2), p[2])
- );
- SetValue(lower, upper);
- }
-
- void
- Include (
- const BBox& b
- ) {
- Enclose(*this, b);
- }
-
- MT_Scalar
- Lower(
- int i
- ) const {
- return m_center[i] - m_extent[i];
- }
- MT_Scalar
- Upper(
- int i
- ) const {
- return m_center[i] + m_extent[i];
- }
-
- MT_Point3
- Lower(
- ) const {
- return m_center - m_extent;
- }
- MT_Point3
- Upper(
- ) const {
- return m_center + m_extent;
- }
-
- MT_Scalar
- Size(
- ) const {
- return MT_max(MT_max(m_extent[0], m_extent[1]), m_extent[2]);
- }
-
- int
- LongestAxis(
- ) const {
- return m_extent.closestAxis();
- }
-
- bool
- IntersectXRay(
- const MT_Point3& xBase
- ) const {
- if (xBase[0] <= Upper(0))
- {
- if (xBase[1] <= Upper(1) && xBase[1] >= Lower(1))
- {
- if (xBase[2] <= Upper(2) && xBase[2] >= Lower(2))
- {
- return true;
- }
- }
- }
- return false;
- }
-
-
-
-
- friend bool intersect(const BBox& a, const BBox& b);
-
-private:
- MT_Point3 m_center;
- MT_Vector3 m_extent;
-};
-
-inline
- bool
-intersect(
- const BBox& a,
- const BBox& b
-) {
- return
- MT_abs(a.m_center[0] - b.m_center[0]) <= a.m_extent[0] + b.m_extent[0] &&
- MT_abs(a.m_center[1] - b.m_center[1]) <= a.m_extent[1] + b.m_extent[1] &&
- MT_abs(a.m_center[2] - b.m_center[2]) <= a.m_extent[2] + b.m_extent[2];
-}
-
-#endif
-
-
diff --git a/intern/csg/intern/CSG_BBoxTree.cpp b/intern/csg/intern/CSG_BBoxTree.cpp
deleted file mode 100644
index 503c3e7f2d4..00000000000
--- a/intern/csg/intern/CSG_BBoxTree.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- SOLID - Software Library for Interference Detection
- Copyright (C) 1997-1998 Gino van den Bergen
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to gino@win.tue.nl,
- or write to:
- Gino van den Bergen
- Department of Mathematics and Computing Science
- Eindhoven University of Technology
- P.O. Box 513, 5600 MB Eindhoven, The Netherlands
-*/
-
-#include "CSG_BBoxTree.h"
-#include <algorithm>
-
-
-using namespace std;
-
-
-BBoxInternal::
-BBoxInternal(
- int n, LeafPtr leafIt
-)
-{
- m_tag = INTERNAL;
- m_bbox.SetEmpty();
-
- int i;
- for (i=0;i<n;i++) {
- m_bbox.Include(leafIt[i].m_bbox);
- }
-}
-// Construct a BBoxInternal from a list of BBoxLeaf nodes.
-// Recursive function that does the longest axis median point
-// fit.
-
-void BBoxTree::
-BuildTree(
- LeafPtr leaves, int numLeaves
-) {
- m_branch = 0;
- m_leaves = leaves;
- m_numLeaves = numLeaves;
- m_internals = new BBoxInternal[numLeaves];
-
- RecursiveTreeBuild(m_numLeaves,m_leaves);
-}
-
- void
-BBoxTree::
-RecursiveTreeBuild(
- int n, LeafPtr leafIt
-){
- m_internals[m_branch] = BBoxInternal(n,leafIt);
- BBoxInternal& aBBox = m_internals[m_branch];
-
- m_branch++;
-
- int axis = aBBox.m_bbox.LongestAxis();
- int i = 0, mid = n;
-
- // split the leaves into two groups those that are < bbox.getCenter()[axis]
- // and those that are >=
- // smart bit about this code is it does the grouping in place.
- while (i < mid)
- {
- if (leafIt[i].m_bbox.Center()[axis] < aBBox.m_bbox.Center()[axis])
- {
- ++i;
- } else {
- --mid;
- swap(leafIt[i], leafIt[mid]);
- }
- }
-
- // all of the nodes were on one side of the box center
- // I'm not sure if this case ever gets reached?
- if (mid == 0 || mid == n)
- {
- mid = n / 2;
- }
-
- if (mid >= 2)
- {
- aBBox.rson = m_internals + m_branch;
- RecursiveTreeBuild(mid,leafIt);
- } else {
- aBBox.rson = leafIt;
- }
- if (n - mid >= 2) {
- aBBox.lson = m_internals + m_branch;
- RecursiveTreeBuild(n - mid, leafIt + mid);
- } else {
- aBBox.lson = leafIt + mid;
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/intern/csg/intern/CSG_BBoxTree.h b/intern/csg/intern/CSG_BBoxTree.h
deleted file mode 100644
index a9013ccf329..00000000000
--- a/intern/csg/intern/CSG_BBoxTree.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
- * I've modified some very nice bounding box tree code from
- * Gino van der Bergen's Free Solid Library below. It's basically
- * the same code - but I've hacked out the transformation stuff as
- * I didn't understand it. I've also made it far less elegant!
- *
- */
-
-/*
- SOLID - Software Library for Interference Detection
- Copyright (C) 1997-1998 Gino van den Bergen
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to gino@win.tue.nl,
- or write to:
- Gino van den Bergen
- Department of Mathematics and Computing Science
- Eindhoven University of Technology
- P.O. Box 513, 5600 MB Eindhoven, The Netherlands
-*/
-
-#ifndef _BBOXTREE_H_
-#define _BBOXTREE_H_
-
-#include "CSG_BBox.h"
-#include "MT_Line3.h"
-#include "CSG_IndexDefs.h"
-
-#include <vector>
-
-/**
- * Tree structure
- */
-
-class BBoxNode
-{
-public:
- enum TagType { LEAF, INTERNAL };
-
- BBox m_bbox;
- TagType m_tag;
-};
-
-
-class BBoxLeaf : public BBoxNode
-{
-public:
- int m_polyIndex;
-
- BBoxLeaf() {}
-
- BBoxLeaf(int polyIndex, const BBox& bbox)
- : m_polyIndex(polyIndex)
- {
- m_bbox = bbox;
- m_tag = LEAF;
- }
-
-};
-
-
-typedef BBoxLeaf* LeafPtr;
-typedef BBoxNode* NodePtr;
-
-
-class BBoxInternal : public BBoxNode
-{
-public:
- NodePtr lson;
- NodePtr rson;
-
- BBoxInternal() {}
- BBoxInternal(
- int n, LeafPtr leafIt
- );
-
-};
-
-typedef BBoxInternal* InternalPtr;
-
-
-class BBoxTree
-{
-public :
- BBoxTree() {};
-
- const NodePtr RootNode() const {
- return m_internals;
- }
-
- ~BBoxTree() {
- delete[] m_leaves;
- delete[] m_internals;
- }
-
- // tree takes ownership of the leaves.
- void BuildTree(LeafPtr leaves, int numLeaves);
-
-private :
-
- void RecursiveTreeBuild(
- int n, LeafPtr leafIt
- );
-
- int m_branch;
-
- LeafPtr m_leaves;
- InternalPtr m_internals;
- int m_numLeaves;
-};
-
-
-
-
-
-#endif
-
-
-
-
-
-
diff --git a/intern/csg/intern/CSG_BlenderVProp.h b/intern/csg/intern/CSG_BlenderVProp.h
deleted file mode 100644
index 72cad752c31..00000000000
--- a/intern/csg/intern/CSG_BlenderVProp.h
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef CSG_BlenderVProp_H
-#define CSG_BlenderVProp_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-// A vertex property that stores a CSG_IFaceVertexData structure defined
-// in the interface between the CSG module and blender CSG_Interface.h!
-
-#include "CSG_Interface.h"
-#include "MT_Scalar.h"
-
-class BlenderVProp
-{
-public :
- // You must set the interpolation function ptr
- // before using this class.
-
- static CSG_InterpolateUserFaceVertexDataFunc InterpFunc;
-
-private :
-
- CSG_IFaceVertexData m_data;
-
-public :
-
- BlenderVProp(const int& vIndex)
- {
- m_data.m_vertexIndex = vIndex;
- }
-
- BlenderVProp(
- const int& vIndex,
- const BlenderVProp& p1,
- const BlenderVProp& p2,
- const MT_Scalar& epsilon
- ){
- m_data.m_vertexIndex = vIndex;
- InterpFunc(&(p1.m_data),&(p2.m_data),&m_data,epsilon);
- }
-
-
- BlenderVProp(
- ) {};
-
- // Default copy constructor and assignment operator are fine.
-
- // Support conversion to an integer
- ///////////////////////////////////
- operator int(
- ) const {
- return m_data.m_vertexIndex;
- }
-
- // and assignment from an integer.
- //////////////////////////////////
- BlenderVProp&
- operator = (
- int i
- ) {
- m_data.m_vertexIndex = i;
- return *this;
- }
-
- // return a reference to our data
- const CSG_IFaceVertexData& Data() const {
- return m_data;
- }
-
- CSG_IFaceVertexData& Data() {
- return m_data;
- }
-
-
-};
-
-#endif \ No newline at end of file
diff --git a/intern/csg/intern/CSG_BooleanOp.h b/intern/csg/intern/CSG_BooleanOp.h
deleted file mode 100644
index ff293799286..00000000000
--- a/intern/csg/intern/CSG_BooleanOp.h
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef CSG_BOOLEANOP_H
-#define CSG_BOOLEANOP_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "CSG_IndexDefs.h"
-#include "CSG_BBoxTree.h"
-
-template <typename CMesh, typename TMesh> class BooleanOp
-{
-public :
-
- // unimplemented
- ////////////////
- BooleanOp();
- BooleanOp(const BooleanOp&);
- BooleanOp& operator = (const BooleanOp&);
-
- //helpers
- /////////
-
- static
- void
- BuildSplitGroup(
- const TMesh& meshA,
- const TMesh& meshB,
- const BBoxTree& treeA,
- const BBoxTree& treeB,
- OverlapTable& aOverlapsB,
- OverlapTable& bOverlapsA
- );
-
- // Split mesh with mesh2, table is an OverlapTable containing the polygons
- // of mesh2 that intersect with polygons of mesh.
- // if preserve is true this function will aim to reduce the number of
- // T-junctions created.
-
- static
- void
- PartitionMesh(
- CMesh & mesh,
- const TMesh & mesh2,
- const OverlapTable& table
- );
-
- // Classify meshB with respect to meshA, uses a BBox tree of meshA
- // to drastically improve speed!
- static
- void
- ClassifyMesh(
- const TMesh& meshA,
- const BBoxTree& aTree,
- CMesh& meshB
- );
-
- static
- void
- ExtractClassification(
- CMesh& meshA,
- TMesh& newMesh,
- int classification,
- bool reverse
- );
-
-
-};
-
-#include "CSG_BooleanOp.inl"
-
-#endif
diff --git a/intern/csg/intern/CSG_BooleanOp.inl b/intern/csg/intern/CSG_BooleanOp.inl
deleted file mode 100644
index 9309d4ffbb5..00000000000
--- a/intern/csg/intern/CSG_BooleanOp.inl
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-#include "CSG_Math.h"
-#include "CSG_BBoxTree.h"
-#include "CSG_TreeQueries.h"
-
-using namespace std;
-
-template <typename CMesh, typename TMesh>
- void
-BooleanOp<CMesh,TMesh>::
-BuildSplitGroup(
- const TMesh& meshA,
- const TMesh& meshB,
- const BBoxTree& treeA,
- const BBoxTree& treeB,
- OverlapTable& aOverlapsB,
- OverlapTable& bOverlapsA
-) {
-
- aOverlapsB = OverlapTable(meshB.Polys().size());
- bOverlapsA = OverlapTable(meshA.Polys().size());
-
- // iterate through the polygons of A and then B
- // and mark each
- TreeIntersector<TMesh>(treeA,treeB,&aOverlapsB,&bOverlapsA,&meshA,&meshB);
-
-}
-
-template <typename CMesh, typename TMesh>
- void
-BooleanOp<CMesh,TMesh>::
-PartitionMesh(
- CMesh & mesh,
- const TMesh & mesh2,
- const OverlapTable& table
-) {
-
- // iterate through the overlap table.
- int i;
-
- MT_Scalar onEpsilon(1e-4);
-
- for (i = 0; i < table.size(); i++)
- {
- if (table[i].size())
- {
- // current list of fragments - initially contains
- // just the to-be-split polygon index
- PIndexList fragments;
- fragments.push_back(i);
-
- // iterate through the splitting polygons.
- int j;
- for (j =0 ; j <table[i].size(); ++j)
- {
- PIndexList newFragments;
-
- // find the splitting plane
- MT_Plane3 splitPlane = mesh2.Polys()[table[i][j]].Plane();
-
- // iterate through the current fragments and split them
- // with the new plane, adding the resulting fragments to
- // the newFragments list.
- int k;
- for (k = 0; k < fragments.size(); ++k)
- {
- int newInFragment;
- int newOutFragment;
-
- CMesh::TGBinder pg1(mesh,fragments[k]);
- TMesh::TGBinder pg2(mesh2,table[i][j]);
-
- const MT_Plane3& fragPlane = mesh.Polys()[fragments[k]].Plane();
-
- if (CSG_PolygonIntersector<CMesh::TGBinder,TMesh::TGBinder >::
- IntersectPolygons(pg1,pg2,fragPlane,splitPlane))
- {
- mesh.SplitPolygon(fragments[k],splitPlane,newInFragment,newOutFragment,onEpsilon);
-
- if (-1 != newInFragment) newFragments.push_back(newInFragment);
- if (-1 != newOutFragment) newFragments.push_back(newOutFragment);
- } else {
- // this fragment was not split by this polygon but it may be split by a subsequent
- // polygon in the list
- newFragments.push_back(fragments[k]);
- }
-
- }
-
- fragments = newFragments;
- }
- }
- }
-}
-
-template <typename CMesh, typename TMesh>
- void
-BooleanOp<CMesh,TMesh>::
-ClassifyMesh(
- const TMesh& meshA,
- const BBoxTree& aTree,
- CMesh& meshB
-) {
-
- // walk through all of the polygons of meshB. Create a
- // ray in the direction of the polygons normal emintaing from the
- // mid point of the polygon
-
- // Do a ray test with all of the polygons of MeshA
- // Find the nearest intersection point and record the polygon index
-
- // If there were no intersections then the ray is outside.
- // If there was an intersection and the dot product of the ray and normal
- // of the intersected polygon from meshA is +ve then we are on the inside
- // else outside.
-
- int i;
- for (i = 0; i < meshB.Polys().size(); i++)
- {
- CMesh::TGBinder pg(meshB,i);
-
- MT_Line3 midPointRay = CSG_Math<CMesh::TGBinder >::PolygonMidPointRay(pg,meshB.Polys()[i].Plane());
-
- MT_Line3 midPointXRay(midPointRay.Origin(),MT_Vector3(1,0,0));
-
- int aPolyIndex(-1);
-
- RayTreeIntersector<TMesh>(aTree,&meshA,midPointXRay,aPolyIndex);
-
- if (-1 != aPolyIndex)
- {
- if (meshA.Polys()[aPolyIndex].Plane().signedDistance(midPointXRay.Origin()) < 0)
- {
- meshB.Polys()[i].Classification()= 1;
- } else {
- meshB.Polys()[i].Classification()= 2;
- }
- } else {
- meshB.Polys()[i].Classification()= 2;
- }
- }
-}
-
-
-template <typename CMesh, typename TMesh>
- void
-BooleanOp<CMesh,TMesh>::
-ExtractClassification(
- CMesh& meshA,
- TMesh& newMesh,
- int classification,
- bool reverse
-){
-
- int i;
- for (i = 0; i < meshA.Polys().size(); ++i)
- {
- CMesh::Polygon& meshAPolygon = meshA.Polys()[i];
- if (meshAPolygon.Classification() == classification)
- {
- newMesh.Polys().push_back(meshAPolygon);
- TMesh::Polygon& newPolygon = newMesh.Polys().back();
-
- if (reverse) newPolygon.Reverse();
-
- // iterate through the vertices of the new polygon
- // and find a new place for them in the new mesh (if they arent already there)
-
- int j;
- for (j=0; j< newPolygon.Size(); j++)
- {
- if (meshA.Verts()[newPolygon[j]].VertexMap() == -1)
- {
- // this is the first time we have visited this vertex
- // copy it over to the new mesh.
- newMesh.Verts().push_back(meshA.Verts()[newPolygon[j]]);
- // and record it's position in the new mesh for the next time we visit it.
- meshA.Verts()[newPolygon[j]].VertexMap() = newMesh.Verts().size() -1;
- }
- newPolygon.VertexProps(j) = meshA.Verts()[newPolygon[j]].VertexMap();
- }
- }
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/intern/csg/intern/CSG_CVertex.h b/intern/csg/intern/CSG_CVertex.h
deleted file mode 100644
index fd0a7b098b5..00000000000
--- a/intern/csg/intern/CSG_CVertex.h
+++ /dev/null
@@ -1,104 +0,0 @@
-#ifndef CSG_CVertex_H
-#define CSG_CVertex_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include <algorithm>
-#include "CSG_IndexDefs.h"
-#include "CSG_Vertex.h"
-// This class extends an existing vertex by connecting
-// them with their polygons through the PIndexList member.
-//
-// This extra information allows us to perform local
-// mesh topology queries
-//
-// These queries are availble through the ConnectedMesh class.
-
-class CVertex : public VertexBase
-{
-private :
-
- // polygons using this vertex
- PIndexList m_polygons;
-
-public :
-
- CVertex()
- :VertexBase(),m_polygons()
- {
- };
-
- // have to change VertexBase and all functions to
- // use Pos() rather than m_pos;
-
- CVertex(const VertexBase& vertex)
- :VertexBase(vertex),m_polygons()
- {}
-
- // Value type model
- ///////////////////
- CVertex(const CVertex& other)
- : VertexBase(other), m_polygons(other.m_polygons)
- {}
-
- CVertex& operator = (const CVertex& other)
- {
- m_pos = other.Pos();
- m_vertexMap = other.m_vertexMap;
- m_polygons = other.m_polygons;
-
- return *this;
- }
-
-
- CVertex& operator = (const VertexBase& other)
- {
- m_pos= other.Pos();
- return *this;
- }
-
-
- ~CVertex(){};
-
- // Our special connected vertex functions.
- //////////////////////////////////////////
-
- const PIndexList& Polys() const { return m_polygons;}
- PIndexList& Polys() { return m_polygons;}
-
- int & operator[] (const int & i) { return m_polygons[i];}
-
- const int & operator[] (const int& i) const { return m_polygons[i];}
-
- void AddPoly(int polyIndex) {m_polygons.push_back(polyIndex);}
-
- void RemovePolygon(int polyIndex)
- {
- PIndexIt foundIt = std::find(m_polygons.begin(),m_polygons.end(),polyIndex);
- if (foundIt != m_polygons.end()) {
- std::swap(m_polygons.back(), *foundIt);
- m_polygons.pop_back();
- }
- }
-};
-
-
-#endif
diff --git a/intern/csg/intern/CSG_ConnectedMesh.h b/intern/csg/intern/CSG_ConnectedMesh.h
deleted file mode 100644
index 6cf73ef2240..00000000000
--- a/intern/csg/intern/CSG_ConnectedMesh.h
+++ /dev/null
@@ -1,95 +0,0 @@
-#ifndef CSG_ConnectedMesh_H
-#define CSG_ConnectedMesh_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "CSG_GeometryBinder.h"
-#include "MT_Plane3.h"
-
-template <typename TMesh> class ConnectedMeshWrapper
-{
-public :
-
- typedef TMesh::Polygon Polygon;
- typedef TMesh::Vertex Vertex;
-
- typedef TMesh::Polygon::TVProp VProp;
-
- typedef TMesh::VLIST VLIST;
- typedef TMesh::PLIST PLIST;
-
- typedef PolygonGeometry<ConnectedMeshWrapper> TGBinder;
-
- typedef ConnectedMeshWrapper<TMesh> MyType;
-
-private :
- TMesh& m_mesh;
-
- unsigned int m_uniqueEdgeTestId;
-
-public :
-
- // Mesh Template interface
- //////////////////////////
- VLIST& Verts() {return m_mesh.Verts();}
- const VLIST& Verts() const {return m_mesh.Verts();}
-
- PLIST& Polys() {return m_mesh.Polys();}
- const PLIST& Polys() const {return m_mesh.Polys();}
-
- // Mesh Wrapper functions
- /////////////////////////
-
- ConnectedMeshWrapper(TMesh& mesh):
- m_mesh(mesh),m_uniqueEdgeTestId(0) {};
-
- void BuildVertexPolyLists();
-
- void DisconnectPolygon(int polyIndex);
-
- void ConnectPolygon(int polyIndex);
-
- //return the polygons neibouring the given edge.
- void EdgePolygons(int v1, int v2, PIndexList& polys);
-
- void InsertVertexAlongEdge(int v1,int v2, const VProp& prop);
-
- void
- SplitPolygon(
- const int p1Index,
- const MT_Plane3& plane,
- int& inPiece,
- int& outPiece,
- const MT_Scalar onEpsilon
- );
-
- ~ConnectedMeshWrapper(){};
-};
-
-#include "CSG_ConnectedMeshWrapper.inl"
-
-#endif
-
-
-
-
-
-
diff --git a/intern/csg/intern/CSG_ConnectedMeshWrapper.inl b/intern/csg/intern/CSG_ConnectedMeshWrapper.inl
deleted file mode 100644
index 5d6cc11cc48..00000000000
--- a/intern/csg/intern/CSG_ConnectedMeshWrapper.inl
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-#include <algorithm>
-#include <iterator>
-#include "CSG_SplitFunction.h"
-
-// Define functors things that bind a function to an object,
-// for the templated split polygon code.
-
-template <typename CMesh> class SplitFunctionBindor
-{
-private :
- CMesh& m_mesh;
-
-public :
-
- SplitFunctionBindor(CMesh& mesh):m_mesh(mesh) {};
-
- void DisconnectPolygon(int polyIndex){
- m_mesh.DisconnectPolygon(polyIndex);
- }
-
- void ConnectPolygon(int polygonIndex) {
- m_mesh.ConnectPolygon(polygonIndex);
- }
-
- void InsertVertexAlongEdge(int lastIndex,int newIndex,const CMesh::VProp& prop) {
- m_mesh.InsertVertexAlongEdge(lastIndex,newIndex,prop);
- }
-
- ~SplitFunctionBindor(){};
-};
-
-
-template <typename TMesh>
- void
-ConnectedMeshWrapper<TMesh>::
-BuildVertexPolyLists(
-) {
- int i;
- for (i=0; i < Polys().size(); i++)
- {
- ConnectPolygon(i);
- }
-}
-
-template <typename TMesh>
- void
-ConnectedMeshWrapper<TMesh>::
-DisconnectPolygon(
- int polyIndex
-){
- const Polygon& poly = Polys()[polyIndex];
-
- int j;
- for (j=0;j<poly.Verts().size(); j++)
- {
- Verts()[poly[j]].RemovePolygon(polyIndex);
- }
-}
-
-template <typename TMesh>
- void
-ConnectedMeshWrapper<TMesh>::
-ConnectPolygon(
- int polyIndex
-){
- const Polygon& poly = Polys()[polyIndex];
-
- int j;
- for (j=0;j<poly.Verts().size(); j++)
- {
- Verts()[poly[j]].AddPoly(polyIndex);
- }
-}
-
-template <typename TMesh>
- void
-ConnectedMeshWrapper<TMesh>::
-EdgePolygons(
- int v1,
- int v2,
- PIndexList& polys
-) {
- ++m_uniqueEdgeTestId;
-
- Vertex& vb1 = Verts()[v1];
- int i;
- for (i=0;i < vb1.Polys().size(); ++i)
- {
- Polys()[vb1[i]].Classification() = m_uniqueEdgeTestId;
- }
-
- Vertex& vb2 = Verts()[v2];
- int j;
- for (j=0;j < vb2.Polys().size(); ++j)
- {
- if (Polys()[vb2[j]].Classification() == m_uniqueEdgeTestId)
- {
- polys.push_back(vb2[j]);
- }
- }
-}
-
-template <typename TMesh>
- void
-ConnectedMeshWrapper<TMesh>::
-InsertVertexAlongEdge(
- int v1,
- int v2,
- const VProp& prop
-) {
-
- PIndexList npolys;
- EdgePolygons(v1,v2,npolys);
-
- // iterate through the neighbouting polygons of
- // this edge and insert the vertex into the polygon
-
- int newVertex = int(prop);
-
- int i;
- for (i=0;i < npolys.size(); i++)
- {
- // find the first vertex index in this polygon
- Polygon::TVPropList& polyVerts = Polys()[npolys[i]].Verts();
-
- Polygon::TVPropIt v1pos = std::find(polyVerts.begin(),polyVerts.end(),v1);
-
- // this should never be false!
- if (v1pos != polyVerts.end())
- {
- // v2 must be either side of this pos
- Polygon::TVPropIt prevPos = (v1pos == polyVerts.begin()) ? polyVerts.end()-1 : v1pos-1;
- Polygon::TVPropIt nextPos = (v1pos == polyVerts.end()-1) ? polyVerts.begin() : v1pos+1;
-
- if (*prevPos == v2) {
- polyVerts.insert(v1pos,prop);
- } else
- if (*nextPos == v2) {
- polyVerts.insert(nextPos,prop);
- } else {
- //assert(false);
- }
-
- Verts()[newVertex].AddPoly(npolys[i]);
- } else {
- assert(false);
- }
- }
-}
-
-
-template <typename TMesh>
- void
-ConnectedMeshWrapper<TMesh>::
-SplitPolygon(
- const int p1Index,
- const MT_Plane3& plane,
- int& inPiece,
- int& outPiece,
- const MT_Scalar onEpsilon
-){
-
- SplitFunctionBindor<MyType> functionBindor(*this);
-
- SplitFunction<MyType,SplitFunctionBindor<MyType> > splitFunction(*this,functionBindor);
- splitFunction.SplitPolygon(p1Index,plane,inPiece,outPiece,onEpsilon);
-}
-
-#if 0
-template <class TPolygon, class TVertex>
- void
-Mesh::
-printMesh(
- std::ostream& stream
-) {
-
- int i;
- for (i =0; i < m_polys.size(); i++)
- {
- std::ostream_iterator<int> streamIt(stream," ");
- std::copy(m_polys[i].Verts().begin(),m_polys[i].Verts().end(),streamIt);
- stream << "\n";
- }
-}
-
-#endif
-
-
-
-
diff --git a/intern/csg/intern/CSG_GeometryBinder.h b/intern/csg/intern/CSG_GeometryBinder.h
deleted file mode 100644
index 2977ac65971..00000000000
--- a/intern/csg/intern/CSG_GeometryBinder.h
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef CSG_GEOMETRY_BINDER_H
-#define CSG_GEOMETRY_BINDER_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-// This class binds the geometry of a polygon
-// to the polygon itself it provides just one
-// operator [int i] that returns the vertex position
-// of the ith vertex in the polygon.
-
-// Its a model of a geometry binder primarily used by the CSG_Math
-// template class to compute geometric information about a mesh.
-
-#include "MT_Point3.h"
-
-
-template <typename TMesh> class PolygonGeometry
-{
-public :
-
- typedef typename TMesh::Polygon TPolygon;
-
- PolygonGeometry(const TMesh& mesh, int pIndex)
- : m_poly(mesh.Polys()[pIndex]),m_mesh(mesh)
- {};
-
- PolygonGeometry(const TMesh& mesh,const TPolygon& poly)
- : m_poly(poly),m_mesh(mesh)
- {};
-
- const MT_Point3& operator[] (int i) const {
- return m_mesh.Verts()[m_poly[i]].Pos();
- };
-
- int Size() const { return m_poly.Size();}
-
- ~PolygonGeometry(){};
-
-private :
-
- PolygonGeometry(const PolygonGeometry& other) {};
- PolygonGeometry& operator = (PolygonGeometry& other) { return *this;}
-
- const TMesh& m_mesh;
- const TPolygon& m_poly;
-
-};
-
-#endif
-
-
-
-
-
diff --git a/intern/csg/intern/CSG_IndexDefs.h b/intern/csg/intern/CSG_IndexDefs.h
deleted file mode 100644
index 2e1e05a5eb4..00000000000
--- a/intern/csg/intern/CSG_IndexDefs.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef CSG_INDEXDEFS_H
-#define CSG_INDEXDEFS_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-//typdefs for lists and things in the CSG library
-
-#include <vector>
-
-typedef std::vector<int> PIndexList;
-typedef PIndexList::iterator PIndexIt;
-typedef PIndexList::const_iterator const_PIndexIt;
-
-typedef std::vector<int> VIndexList;
-typedef VIndexList::iterator VIndexIt;
-typedef VIndexList::const_iterator const_VIndexIt;
-
-typedef std::vector< PIndexList > OverlapTable;
-
-
-
-#endif
-
-
diff --git a/intern/csg/intern/CSG_Math.h b/intern/csg/intern/CSG_Math.h
deleted file mode 100644
index 0c41e3d63ae..00000000000
--- a/intern/csg/intern/CSG_Math.h
+++ /dev/null
@@ -1,152 +0,0 @@
-#ifndef __CSG_MATH_H
-#define __CSG_MATH_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "MT_Plane3.h"
-#include "MT_Matrix3x3.h"
-#include "MT_Line3.h"
-#include "CSG_BBox.h"
-
-// useful geometry functions.
-/////////////////////////////
-
-const int cofacTable[3][2] = {{1,2},{0,2},{0,1}};
-
-class CSG_Geometry
-{
-public :
-
- static bool Intersect(
- const MT_Plane3& p1,
- const MT_Plane3& p2,
- MT_Line3& output
- );
-
- // Return intersection of line1 and line 2 in the plane formed by the given
- // standard axis. Intersection l1Param is the intersection parameter of line1.
- static bool Intersect2D(
- const MT_Line3& l1,
- const MT_Line3& l2,
- int majAxis,
- MT_Scalar& l1Param
- );
-
- static bool Intersect2DBoundsCheck(
- const MT_Line3& l1,
- const MT_Line3& l2,
- int majAxis,
- MT_Scalar& l1Param,
- MT_Scalar& l2Param
- );
-
- static bool Intersect2DNoBoundsCheck(
- const MT_Line3& l1,
- const MT_Line3& l2,
- int majAxis,
- MT_Scalar& l1Param,
- MT_Scalar& l2Param
- );
-
- static int ComputeClassification(
- const MT_Scalar& distance,
- const MT_Scalar& epsilon
- );
-};
-
-// The template parameter TGBinder is a model of a Geometry Binder concept
-// see CSG_GeometryBinder.h for an example.
-
-template <typename TGBinder> class CSG_Math
-{
-public :
-
- static bool IntersectPolyWithLine2D(
- const MT_Line3& l,
- const TGBinder& p1,
- const MT_Plane3& plane,
- MT_Scalar& a,
- MT_Scalar& b
- );
-
- static bool InstersectPolyWithLine3D(
- const MT_Line3& l,
- const TGBinder& p1,
- const MT_Plane3& plane,
- MT_Scalar& a
- );
-
- static bool PointInPolygonTest3D(
- const TGBinder& p1,
- const MT_Plane3& plane,
- const MT_Point3& origin,
- const MT_Point3& pointOnPlane
- );
-
- // Return the mid-point of the given polygon index.
- static MT_Point3 PolygonMidPoint(
- const TGBinder& p1
- );
-
- static MT_Line3 PolygonMidPointRay(
- const TGBinder& p1,
- const MT_Plane3& plane
- );
-
- static MT_Plane3 ComputePlane(
- const TGBinder &p1
- );
-
- // Return a bounding box of the given polygon index.
- static BBox FitBBox(
- const TGBinder& p1
- );
-
- // Return which side of the polygon the plane is on.
- // 0 == 0n
- // 1 == in
- // 2 == out
- // 3 == Straddle
- static int WhichSide(
- const TGBinder& p1,
- const MT_Plane3& plane1
- );
-
-};
-
-template <class TGBinderA, class TGBinderB> class CSG_PolygonIntersector
-{
-public :
-
- static bool IntersectPolygons (
- const TGBinderA& p1,
- const TGBinderB& p2,
- const MT_Plane3& plane1,
- const MT_Plane3& plane2
- );
-
-};
-
-
-#include "CSG_Math.inl"
-
-#endif
-
diff --git a/intern/csg/intern/CSG_Math.inl b/intern/csg/intern/CSG_Math.inl
deleted file mode 100644
index 73483ea41d6..00000000000
--- a/intern/csg/intern/CSG_Math.inl
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-#include "CSG_Math.h"
-#include "MT_minmax.h"
-#include "MT_Point2.h"
-#include "MT_Vector2.h"
-#include "MT_Plane3.h"
-
-#include <vector>
-
-using namespace std;
-
-inline bool CSG_Geometry::Intersect(
- const MT_Plane3& p1,
- const MT_Plane3& p2,
- MT_Line3& output
-) {
- MT_Matrix3x3 mat;
- mat[0] = p1.Normal();
- mat[1] = p2.Normal();
- mat[2] = mat[0].cross(mat[1]);
-
- if (mat[2].fuzzyZero())
- {
- return false;
- }
-
- MT_Vector3 aPoint(-p1.Scalar(),-p2.Scalar(),0);
-
- output = MT_Line3(MT_Point3(0,0,0) + mat.inverse()*aPoint ,mat[2]);
-
- assert(MT_fuzzyZero(p1.signedDistance(output.Origin())));
- assert(MT_fuzzyZero(p2.signedDistance(output.Origin())));
-
-
- return true;
-}
-
-inline bool CSG_Geometry::Intersect2DNoBoundsCheck(
- const MT_Line3& l1,
- const MT_Line3& l2,
- int majAxis,
- MT_Scalar& l1Param,
- MT_Scalar& l2Param
-){
- int ind1 = cofacTable[majAxis][0];
- int ind2 = cofacTable[majAxis][1];
-
- MT_Scalar Zx = l2.Origin()[ind1] - l1.Origin()[ind1];
- MT_Scalar Zy = l2.Origin()[ind2] - l1.Origin()[ind2];
-
- MT_Scalar det = l1.Direction()[ind1]*l2.Direction()[ind2] -
- l2.Direction()[ind1]*l1.Direction()[ind2];
-
- if (MT_fuzzyZero(det))
- {
- return false;
- }
-
- l1Param = (l2.Direction()[ind2]*Zx - l2.Direction()[ind1]*Zy)/det;
- l2Param = -(-l1.Direction()[ind2]*Zx + l1.Direction()[ind1]*Zy)/det;
-
- return true;
-}
-
-
-inline bool CSG_Geometry::Intersect2DBoundsCheck(
- const MT_Line3& l1,
- const MT_Line3& l2,
- int majAxis,
- MT_Scalar& l1Param,
- MT_Scalar& l2Param
-) {
-
- bool isect = Intersect2DNoBoundsCheck(l1,l2,majAxis,l1Param,l2Param);
- if (!isect) return false;
-
- return l1.IsParameterOnLine(l1Param) && l2.IsParameterOnLine(l2Param);
-}
-
-
-//IMplementation of CSG_Math
-////////////////////////////
-
-template<typename TGBinder>
-inline bool CSG_Math<TGBinder>::IntersectPolyWithLine2D(
- const MT_Line3& l,
- const TGBinder& p1,
- const MT_Plane3& plane,
- MT_Scalar& a,
- MT_Scalar& b
-){
- int majAxis = plane.Normal().closestAxis();
- int lastInd = p1.Size()-1;
-
- b = (-MT_INFINITY);
- a = (MT_INFINITY);
-
- MT_Scalar isectParam(0);
- MT_Scalar isectParam2(0);
-
- int i;
- int j = lastInd;
- int isectsFound(0);
- for (i=0;i<=lastInd; j=i,i++ )
- {
- MT_Line3 testLine(p1[j],p1[i]);
- if ( CSG_Geometry::Intersect2DBoundsCheck(l,testLine,majAxis,isectParam,isectParam2))
- {
- ++isectsFound;
- b = MT_max(isectParam,b);
- a = MT_min(isectParam,a);
- }
- }
-
- return (isectsFound > 0);
-}
-
-template<typename TGBinder>
-inline bool CSG_Math<TGBinder>::InstersectPolyWithLine3D(
- const MT_Line3& l,
- const TGBinder& p1,
- const MT_Plane3& plane,
- MT_Scalar& a
-){
- // First compute intersection parameter t
- MT_Scalar determinant = l.Direction().dot(plane.Normal());
-
- // they are coplanar but we're not interested in that right?
- if (MT_fuzzyZero(determinant)) return false;
-
- a = -plane.Scalar() - plane.Normal().dot(l.Origin());
- a /= determinant;
-
- // intersection point is behind the ray.
- if (a <= 0 ) return false;
-
-
- // check if line is bounded and if t lies in bounds.
- if (!l.IsParameterOnLine(a)) return false;
-
- // calculate the point on the plane
- MT_Point3 pointOnPlane = l.Origin() + l.Direction()*a;
-
- assert(MT_fuzzyZero(plane.signedDistance(pointOnPlane)));
-
- // make sure the intersection point is within the polygon
- return PointInPolygonTest3D(p1,plane,l.Origin(),pointOnPlane);
-}
-
-
-
-template<typename TGBinder>
-inline bool CSG_Math<TGBinder>::PointInPolygonTest3D(
- const TGBinder& p1,
- const MT_Plane3& plane,
- const MT_Point3& origin,
- const MT_Point3& pointOnPlane
-) {
- // Form planes with the edges of the polygon and the origin.
- // make sure that origin is inside all these planes.
-
- // ONe small detail we have to first workout which side the origin
- // is wrt the plane of the polygon.
-
- bool discardSign = plane.signedDistance(origin) < 0 ? true : false;
-
- const int polySize = p1.Size();
-
- MT_Point3 lastPoint = p1[polySize-1];
-
- int i;
- for (i=0;i<polySize; ++i)
- {
- const MT_Point3& aPoint = p1[i];
-
- MT_Plane3 testPlane(origin,lastPoint,aPoint);
- if ((testPlane.signedDistance(pointOnPlane) <= 0) == discardSign)
- {
- return false;
- }
- lastPoint = aPoint;
- }
- return true;
-}
-
-// return 0 = on
-// return 1 = in
-// return 2 = out
-
-inline int CSG_Geometry::ComputeClassification(
- const MT_Scalar& distance,
- const MT_Scalar& epsilon
-) {
- if (MT_abs(distance) < epsilon)
- {
- return 0;
- } else {
- return distance < 0 ? 1 : 2;
- }
-}
-
-// Return the mid-point of the given polygon index.
-template <typename TGBinder>
-inline MT_Point3 CSG_Math<TGBinder>::PolygonMidPoint(
- const TGBinder& p1
-){
-
- MT_Point3 midPoint(0,0,0);
-
- int i;
- for (i=0; i < p1.Size(); i++)
- {
- midPoint += p1[i];
- }
-
- return MT_Point3(midPoint[0]/i,midPoint[1]/i,midPoint[2]/i);
-}
-
-template <typename TGBinder>
-int CSG_Math<TGBinder>::WhichSide(
- const TGBinder& p1,
- const MT_Plane3& plane1
-){
-
- int output = 0;
- int i;
- for (i=0; i<p1.Size(); i++)
- {
- MT_Scalar signedDistance = plane1.signedDistance(p1[i]);
- if (!MT_fuzzyZero(signedDistance))
- {
- signedDistance < 0 ? (output |= 1) : (output |=2);
- }
- }
- return output;
-
-}
-
-
-template <typename TGBinder>
-inline MT_Line3 CSG_Math<TGBinder>::PolygonMidPointRay(
- const TGBinder& p1,
- const MT_Plane3& plane
-){
- return MT_Line3(PolygonMidPoint(p1),plane.Normal(),true,false);
-}
-
-template <typename TGBinder>
-inline MT_Plane3 CSG_Math<TGBinder>::ComputePlane(
- const TGBinder &poly
-){
- assert(poly.Size() >= 3);
- MT_Point3 plast(poly[poly.Size()-1]);
- MT_Point3 pivot;
- MT_Vector3 edge;
- int j;
- for (j=0; j < poly.Size(); j++)
- {
- pivot = poly[j];
- edge = pivot - plast;
- if (!edge.fuzzyZero()) break;
- }
-
- for (; j < poly.Size(); j++)
- {
- MT_Vector3 v2 = poly[j] - pivot;
- MT_Vector3 v3 = edge.cross(v2);
- if (!v3.fuzzyZero())
- {
- return MT_Plane3(v3,pivot);
- }
- }
-
- return MT_Plane3();
-
-}
-
-template <typename TGBinder>
-inline BBox CSG_Math<TGBinder>::FitBBox(
- const TGBinder& p1
-) {
- BBox bbox;
- bbox.SetEmpty();
-
- for (int i = 0; i < p1.Size(); ++i) {
- bbox.Include(p1[i]);
- }
- return bbox;
-}
-
-// we now have enough machinary to intersect 3d polygons
-// Compute line of intersect
-// Intersect line with each edge in PolygonB record min and max intersection parameters
-// Do same for PolygonB. If range of intersections overlap then polys overlap.
-
-// Does not yet deal with 2d case.
-
-template<typename TGBinderA, typename TGBinderB>
-inline bool CSG_PolygonIntersector<TGBinderA,TGBinderB>::IntersectPolygons (
- const TGBinderA& p1,
- const TGBinderB& p2,
- const MT_Plane3& plane1,
- const MT_Plane3& plane2
-){
- MT_Line3 intersectLine;
- if (!CSG_Geometry::Intersect(plane1,plane2,intersectLine))
- {
- // parrallel planes
- return false;
- }
- // check intersection of polygons with intersectLine
- MT_Scalar p1A,p1B;
- MT_Scalar p2A,p2B;
- if (
- !CSG_Math<TGBinderA>::IntersectPolyWithLine2D(intersectLine,p1,plane1,p1A,p1B) ||
- !CSG_Math<TGBinderB>::IntersectPolyWithLine2D(intersectLine,p2,plane2,p2A,p2B)
- ) {
- return false;
- }
-
- // see if intersections overlap.
-
- MT_Scalar maxOMin = MT_max(p1A,p2A);
- MT_Scalar minOMax = MT_min(p1B,p2B);
-
- return (maxOMin <= minOMax);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/intern/csg/intern/CSG_Mesh.h b/intern/csg/intern/CSG_Mesh.h
deleted file mode 100644
index bd687824484..00000000000
--- a/intern/csg/intern/CSG_Mesh.h
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef __MESH_H
-#define __MESH_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "CSG_GeometryBinder.h"
-#include <vector>
-
-// Simple vertex polygon container class
-//--------------------------------------
-
-template <typename TPolygon, typename TVertex> class Mesh
-{
-public :
- typedef std::vector<TVertex> VLIST;
- typedef std::vector<TPolygon> PLIST;
-
- typedef TPolygon Polygon;
- typedef TVertex Vertex;
-
- typedef PolygonGeometry<Mesh> TGBinder;
-
-private :
-
- VLIST m_verts;
- PLIST m_polys;
-
- MT_Point3 m_bBoxMin;
- MT_Point3 m_bBoxMax;
-
-
-public :
-
- Mesh():
- m_verts(),
- m_polys()
- {};
-
- VLIST& Verts() {return m_verts;}
- const VLIST& Verts() const {return m_verts;}
-
- PLIST& Polys() {return m_polys;}
- const PLIST& Polys() const {return m_polys;}
-
- ~Mesh() {}
-};
-
-#endif
diff --git a/intern/csg/intern/CSG_MeshCopier.h b/intern/csg/intern/CSG_MeshCopier.h
deleted file mode 100644
index 4acf4440df6..00000000000
--- a/intern/csg/intern/CSG_MeshCopier.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef CSG_MeshCopier_H
-#define CSG_MeshCopier_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-
-template <typename MeshA, typename MeshB> class MeshCopier
-{
-public :
-
- static void Copy(const MeshA& source, MeshB& output)
- {
- int vertexNum = source.Verts().size();
- int polyNum = source.Polys().size();
-
- output.Verts() = MeshB::VLIST(vertexNum);
- output.Polys() = MeshB::PLIST(polyNum);
-
- std::copy(source.Verts().begin(),source.Verts().end(),output.Verts().begin());
- std::copy(source.Polys().begin(),source.Polys().end(),output.Polys().begin());
-
- }
-
-};
-
-#endif
-
diff --git a/intern/csg/intern/CSG_MeshWrapper.h b/intern/csg/intern/CSG_MeshWrapper.h
deleted file mode 100644
index b557dde37c9..00000000000
--- a/intern/csg/intern/CSG_MeshWrapper.h
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef CSG_MESH_WRAPPER_H
-#define CSG_MESH_WRAPPER_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-// This class wraps a mesh providing
-// simple mesh functions required by the CSG library.
-// TMesh is a model of a mesh and as such should have the
-// following public typedefs and functions
-//
-// TMesh::Vertex the vertex type
-// TMesh::Polygon the polygon type.
-// TMesh::VLIST an stl container of Vertex objects
-// TMesh::PLIST an stl container of Polygon objects
-//
-// VLIST& Verts();
-// const VLIST& Verts();
-//
-// PLIST& Polys();
-// const PLIST& Polys();
-
-#include "CSG_GeometryBinder.h"
-#include "MT_Transform.h"
-#include "CSG_BBox.h"
-
-#include <vector>
-
-template <typename TMesh> class MeshWrapper
-{
-public :
-
- typedef TMesh::Polygon Polygon;
- typedef TMesh::Vertex Vertex;
-
- typedef TMesh::VLIST VLIST;
- typedef TMesh::PLIST PLIST;
-
- typedef PolygonGeometry<MeshWrapper> TGBinder;
-
- typedef MeshWrapper<TMesh> MyType;
-
-private :
- TMesh& m_mesh;
-
-public :
-
- // Mesh Template interface
- //////////////////////////
-
- VLIST& Verts() {return m_mesh.Verts();}
- const VLIST& Verts() const {return m_mesh.Verts();}
-
- PLIST& Polys() {return m_mesh.Polys();}
- const PLIST& Polys() const {return m_mesh.Polys();}
-
- // Mesh Wrapper functions
- /////////////////////////
-
- MeshWrapper(TMesh& mesh)
- : m_mesh(mesh)
- {}
-
- void ComputePlanes();
-
- void BurnTransform(const MT_Transform& t);
-
- BBox ComputeBBox() const;
-
- // Triangulate this mesh - does not preserve vertex->polygon information.
- void Triangulate();
-
- // Split the polygon at position p1Index in the mesh mesh1 into 2 pieces.
- // Remove the polygon p1 and add the 2 pieces (along with the 2 new vertices)
- // to the mesh. Returns the index of the 2 new pieces in the mesh.(either of [but never both] which can be
- // -1 if there was nothing to split.
-
- void SplitPolygon(
- const int p1Index,
- const MT_Plane3& plane,
- int& inPiece,
- int& outPiece,
- const MT_Scalar onEpsilon
- );
-
-
- ~MeshWrapper(){};
-
-};
-
-#include "CSG_MeshWrapper.inl"
-
-#endif \ No newline at end of file
diff --git a/intern/csg/intern/CSG_MeshWrapper.inl b/intern/csg/intern/CSG_MeshWrapper.inl
deleted file mode 100644
index 7a9a141e92a..00000000000
--- a/intern/csg/intern/CSG_MeshWrapper.inl
+++ /dev/null
@@ -1,150 +0,0 @@
-// Implementation of MeshWrapper template class.
-////////////////////////////////////////////////
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-#include "CSG_Math.h"
-#include "CSG_Triangulate.h"
-#include "CSG_SplitFunction.h"
-
-template <typename TMesh>
-void MeshWrapper<TMesh>::ComputePlanes()
-{
- PLIST& polyList = Polys();
-
- int i;
- for (i=0;i < polyList.size(); i++)
- {
- TGBinder binder(m_mesh,i);
- polyList[i].SetPlane(CSG_Math<TGBinder>::ComputePlane(binder));
- }
-}
-
-template <typename TMesh>
-void MeshWrapper<TMesh>::BurnTransform(const MT_Transform& t)
-{
- VLIST& vertexList = Verts();
-
- int i;
- for (i=0;i<vertexList.size(); i++)
- {
- vertexList[i].Pos() = t * vertexList[i].Pos();
- }
- ComputePlanes();
-
-}
-
-template <typename TMesh>
-BBox MeshWrapper<TMesh>::ComputeBBox() const
-{
- const VLIST& vertexList = Verts();
-
- BBox bbox;
- bbox.SetEmpty();
-
- int i;
- for (i=0;i<vertexList.size(); i++)
- {
- bbox.Include(vertexList[i].Pos());
- }
- return bbox;
-
-}
-
-
-template <typename TMesh>
-void MeshWrapper<TMesh>::Triangulate()
-{
- vector<Polygon> newPolys;
-
- CSG_Triangulate<TGBinder> triangulator;
- int i;
- for (i=0; i< Polys().size(); ++i)
- {
- TGBinder pg(m_mesh,i);
- const Polygon& poly = Polys()[i];
-
- if (pg.Size() >= 4)
- {
- VIndexList triangleList;
-
- if (triangulator.Process(pg,poly.Plane(),triangleList))
- {
-
- // translate the triangle list into the real vertex properties
- int tSize = triangleList.size();
- Polygon::TVPropList triangleProps(tSize);
-
- int j;
- for (j=0; j < tSize; j++)
- {
- triangleProps[j] = poly.VertexProps(triangleList[j]);
- }
-
- // iterate through the new triangles
- for (j=0; j < tSize; j+=3)
- {
- // copy the polygon
- newPolys.push_back(poly);
- newPolys.back().Verts().clear();
-
- // copy the relevant triangle indices
- newPolys.back().Verts().assign(triangleProps.begin() + j,triangleProps.begin() + j +3);
- }
-
- }
- } else {
- if (pg.Size() >= 3) {
- newPolys.push_back(poly);
- }
- }
- }
-
- // replace our polygons with the new ones.
- Polys() = newPolys;
-};
-
-template<typename TMesh>
-void MeshWrapper<TMesh>::SplitPolygon(
- const int p1Index,
- const MT_Plane3& plane,
- int& inPiece,
- int& outPiece,
- const MT_Scalar onEpsilon
-){
-
- DefaultSplitFunctionBindor<TMesh::Polygon::TVProp> defaultSplitFunction;
-
- SplitFunction<MyType,DefaultSplitFunctionBindor<TMesh::Polygon::TVProp> > splitFunction(*this,defaultSplitFunction);
- splitFunction.SplitPolygon(p1Index,plane,inPiece,outPiece,onEpsilon);
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/intern/csg/intern/CSG_Polygon.h b/intern/csg/intern/CSG_Polygon.h
deleted file mode 100644
index 8332977da71..00000000000
--- a/intern/csg/intern/CSG_Polygon.h
+++ /dev/null
@@ -1,93 +0,0 @@
-#ifndef __POLYGON_H
-#define __POLYGON_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "CSG_IndexDefs.h"
-
-#include <algorithm>
-#include "MT_Plane3.h"
-#include "MT_Point3.h"
-
-template <typename AVProp, typename AFProp> class PolygonBase
-{
-public :
-
- // The per vertex properties
- typedef AVProp TVProp;
-
- // The per face properties
- typedef AFProp TFProp;
-
- typedef std::vector<TVProp> TVPropList;
- typedef TVPropList::iterator TVPropIt;
-
- // Functions required by the CSG library
- ////////////////////////////////////////
-
- PolygonBase():m_fProp(){}
-
- const TVPropList& Verts() const { return m_verts;}
- TVPropList& Verts() { return m_verts;}
-
- int Size() const { return m_verts.size();}
-
- int operator[](int i) const {return m_verts[i];}
-
- const TVProp& VertexProps(int i) const { return m_verts[i];}
- TVProp& VertexProps(int i) { return m_verts[i];}
-
- void SetPlane(const MT_Plane3& plane) { m_plane = plane;}
-
- const MT_Plane3& Plane() const { return m_plane;}
- MT_Vector3 Normal() const { return m_plane.Normal();}
-
- int & Classification() { return m_classification;}
- const int& Classification() const { return m_classification;}
-
- // Reverse this polygon.
- void Reverse()
- {
- std::reverse(m_verts.begin(),m_verts.end());
- m_plane.Invert();
- }
-
- // Our functions
- ////////////////
-
- TFProp& FProp(){ return m_fProp;}
- const TFProp& FProp() const { return m_fProp;}
-
- ~PolygonBase() {}
-
-private :
-
- TVPropList m_verts;
- MT_Plane3 m_plane;
-
- TFProp m_fProp;
-
- // gross waste of bits! 1 = in, 2 = out;
- int m_classification;
-
-};
-
-#endif \ No newline at end of file
diff --git a/intern/csg/intern/CSG_SplitFunction.h b/intern/csg/intern/CSG_SplitFunction.h
deleted file mode 100644
index 70929a3d4ec..00000000000
--- a/intern/csg/intern/CSG_SplitFunction.h
+++ /dev/null
@@ -1,188 +0,0 @@
-#ifndef CCG_SplitFunction_H
-#define CCG_SplitFunction_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-// This class contains the all important split function.
-// It's a bit of weird definition but doing it like this
-// means we don't have to copy any code between implementations
-// that preserve mesh connectivity and those that introduce T junctions.
-
-template <typename TMesh, typename TSplitFunctionBindor> class SplitFunction
-{
-private :
-
- TMesh& m_mesh;
- TSplitFunctionBindor& m_functionBindor;
-
-public :
-
- SplitFunction( TMesh& mesh, TSplitFunctionBindor& functionBindor)
- : m_mesh(mesh), m_functionBindor(functionBindor)
- {};
-
- void
- SplitPolygon(
- const int p1Index,
- const MT_Plane3& plane,
- int& inPiece,
- int& outPiece,
- const MT_Scalar onEpsilon
- ){
-
- const TMesh::Polygon& p = m_mesh.Polys()[p1Index];
- TMesh::Polygon inP(p),outP(p);
-
- inP.Verts().clear();
- outP.Verts().clear();
-
- // Disconnect the polygon from the mesh.
- m_functionBindor.DisconnectPolygon(p1Index);
-
- int lastIndex = p.Verts().back();
- MT_Point3 lastVertex = m_mesh.Verts()[lastIndex].Pos();
-
- int lastClassification = CSG_Geometry::ComputeClassification(plane.signedDistance(lastVertex),onEpsilon);
- int totalClassification(lastClassification);
-
- // iterate through the vertex indices of the to-be-split polygon
-
- int i;
- int j=p.Size()-1;
- for (i = 0; i < p.Size(); j = i, ++i)
- {
- int newIndex = p[i];
- MT_Point3 aVertex = m_mesh.Verts()[newIndex].Pos();
- int newClassification = CSG_Geometry::ComputeClassification(plane.signedDistance(aVertex),onEpsilon);
-
- // if neither the new vertex nor the old vertex were on and they differ
- if ((newClassification != lastClassification) && newClassification && lastClassification)
- {
- // create new vertex
- int newVertexIndex = m_mesh.Verts().size();
- m_mesh.Verts().push_back(TMesh::Vertex());
-
- // work out new vertex position.
- MT_Vector3 v = aVertex - lastVertex;
- MT_Scalar sideA = plane.signedDistance(lastVertex);
-
- MT_Scalar epsilon = -sideA/plane.Normal().dot(v);
- m_mesh.Verts().back().Pos() = lastVertex + (v * epsilon);
-
- // Make a new VertexProp
- TMesh::Polygon::TVProp splitProp(newVertexIndex,p.VertexProps(j),p.VertexProps(i),epsilon);
-
-
- // add new index to both polygons.
- inP.Verts().push_back( splitProp );
- outP.Verts().push_back( splitProp );
-
- // insert vertex into any neighbouring polygons of this edge
- m_functionBindor.InsertVertexAlongEdge(lastIndex,newIndex,splitProp);
-
- }
-
- Classify(inP.Verts(),outP.Verts(),newClassification,p.VertexProps(i));
- lastClassification = newClassification;
- totalClassification |= newClassification;
- lastVertex = aVertex;
- lastIndex = newIndex;
- }
-
- if (totalClassification == 3)
- {
- // replace polygon p with the inpiece and add the outPiece to the back
- // of the mesh. we just replace the vertices as the normal will be the same.
-
- inPiece = p1Index;
- outPiece = m_mesh.Polys().size();
-
- m_mesh.Polys()[p1Index] = inP;
- m_mesh.Polys().push_back( outP );
-
- m_functionBindor.ConnectPolygon(inPiece);
- m_functionBindor.ConnectPolygon(outPiece);
-
- } else {
-
- // remember to connect back the original polygon!
- m_functionBindor.ConnectPolygon(p1Index);
-
- // dont touch the mesh but just return the index of the original polygon
- if (totalClassification == 1)
- {
- inPiece = p1Index;
- outPiece = -1;
- } else {
- outPiece = p1Index;
- inPiece = -1;
- }
- }
- }
-
-
- void Classify(
- TMesh::Polygon::TVPropList &inGroup,
- TMesh::Polygon::TVPropList &outGroup,
- int classification,
- TMesh::Polygon::TVProp prop
- ) {
- switch (classification)
- {
- case 0 :
- inGroup.push_back(prop);
- outGroup.push_back(prop);
- break;
- case 1 :
- inGroup.push_back(prop);
- break;
- case 2 :
- outGroup.push_back(prop);
- break;
- default :
- break;
- }
- }
-
- ~SplitFunction() {};
-};
-
-
-template <typename PROP> class DefaultSplitFunctionBindor
-{
-public :
-
- DefaultSplitFunctionBindor() {};
-
- void DisconnectPolygon(int){
- }
-
- void ConnectPolygon(int) {
- }
-
- void InsertVertexAlongEdge(int,int,const PROP& ) {
- }
-
- ~DefaultSplitFunctionBindor(){};
-};
-
-
-#endif \ No newline at end of file
diff --git a/intern/csg/intern/CSG_TreeQueries.h b/intern/csg/intern/CSG_TreeQueries.h
deleted file mode 100644
index 1b79d2ca36d..00000000000
--- a/intern/csg/intern/CSG_TreeQueries.h
+++ /dev/null
@@ -1,158 +0,0 @@
-#ifndef CSG_TREEQUERIES_H
-#define CSG_TREEQUERIES_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "CSG_IndexDefs.h"
-#include "CSG_BBoxTree.h"
-#include "CSG_Math.h"
-
-template <typename TMesh> class TreeIntersector
-{
-public :
-
- TreeIntersector(
- const BBoxTree& a,
- const BBoxTree& b,
- OverlapTable *aOverlapsB,
- OverlapTable *bOverlapsA,
- const TMesh* meshA,
- const TMesh* meshB
- ) {
- m_aOverlapsB = aOverlapsB;
- m_bOverlapsA = bOverlapsA;
- m_meshA = meshA;
- m_meshB = meshB;
-
- MarkIntersectingPolygons(a.RootNode(),b.RootNode());
- }
-
-private :
-
- void MarkIntersectingPolygons(const BBoxNode*a,const BBoxNode *b)
- {
- if (!intersect(a->m_bbox, b->m_bbox)) return;
- if (a->m_tag == BBoxNode::LEAF && b->m_tag == BBoxNode::LEAF)
- {
- const BBoxLeaf *la = (const BBoxLeaf *)a;
- const BBoxLeaf *lb = (const BBoxLeaf *)b;
-
- PolygonGeometry<TMesh> pg1(*m_meshA,la->m_polyIndex);
- PolygonGeometry<TMesh> pg2(*m_meshB,lb->m_polyIndex);
-
- if (CSG_PolygonIntersector<PolygonGeometry<TMesh>,PolygonGeometry<TMesh> >::
- IntersectPolygons(pg1,pg2,
- m_meshA->Polys()[la->m_polyIndex].Plane(),
- m_meshB->Polys()[lb->m_polyIndex].Plane()
- )
- ) {
- (*m_aOverlapsB)[lb->m_polyIndex].push_back(la->m_polyIndex);
- (*m_bOverlapsA)[la->m_polyIndex].push_back(lb->m_polyIndex);
- }
- } else
- if ( a->m_tag == BBoxNode::LEAF ||
- (b->m_tag != BBoxNode::LEAF && a->m_bbox.Size() < b->m_bbox.Size())
- ) {
- MarkIntersectingPolygons(a,((const BBoxInternal *)b)->lson);
- MarkIntersectingPolygons(a,((const BBoxInternal *)b)->rson);
- } else {
- MarkIntersectingPolygons(((const BBoxInternal *)a)->lson,b);
- MarkIntersectingPolygons(((const BBoxInternal *)a)->rson,b);
- }
- }
-
- // Temporaries held through recursive intersection
- OverlapTable* m_aOverlapsB;
- OverlapTable* m_bOverlapsA;
- const TMesh* m_meshA;
- const TMesh* m_meshB;
-
-};
-
-template<typename TMesh> class RayTreeIntersector
-{
-public:
-
- RayTreeIntersector(
- const BBoxTree& a,
- const TMesh* meshA,
- const MT_Line3& xRay,
- int& polyIndex
- ):
- m_meshA(meshA),
- m_polyIndex(-1),
- m_lastIntersectValue(MT_INFINITY)
- {
- FindIntersectingPolygons(a.RootNode(),xRay);
- polyIndex = m_polyIndex;
- }
-
-
-private :
-
- void FindIntersectingPolygons(const BBoxNode*a,const MT_Line3& xRay)
- {
- if ((xRay.Origin().x() + m_lastIntersectValue < a->m_bbox.Lower(0)) ||
- !a->m_bbox.IntersectXRay(xRay.Origin())
- ) {
- // ray does not intersect this box.
- return;
- }
-
- if (a->m_tag == BBoxNode::LEAF)
- {
- const BBoxLeaf *la = (const BBoxLeaf *)a;
- MT_Scalar testParameter(0);
-
- PolygonGeometry<TMesh> pg(*m_meshA,la->m_polyIndex);
-
- if (
- CSG_Math<PolygonGeometry<TMesh> >::InstersectPolyWithLine3D(
- xRay,pg,m_meshA->Polys()[la->m_polyIndex].Plane(),testParameter
- )
- ) {
- if (testParameter < m_lastIntersectValue)
- {
- m_lastIntersectValue = testParameter;
- m_polyIndex = la->m_polyIndex;
- }
- }
- } else {
- FindIntersectingPolygons(((const BBoxInternal*)a)->lson,xRay);
- FindIntersectingPolygons(((const BBoxInternal*)a)->rson,xRay);
- }
- }
-
- const TMesh* m_meshA;
-
- MT_Scalar m_lastIntersectValue;
- int m_polyIndex;
-};
-
-
-
-
-
-
-
-
-
-#endif
diff --git a/intern/csg/intern/CSG_Triangulate.h b/intern/csg/intern/CSG_Triangulate.h
deleted file mode 100644
index 95c0b602ddf..00000000000
--- a/intern/csg/intern/CSG_Triangulate.h
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef TRIANGULATE_H
-#define TRIANGULATE_H
-
-/*****************************************************************/
-/** Static class to triangulate any contour/polygon efficiently **/
-/** You should replace Vector2d with whatever your own Vector **/
-/** class might be. Does not support polygons with holes. **/
-/** Uses STL vectors to represent a dynamic array of vertices. **/
-/** This code snippet was submitted to FlipCode.com by **/
-/** John W. Ratcliff (jratcliff@verant.com) on July 22, 2000 **/
-/** I did not write the original code/algorithm for this **/
-/** this triangulator, in fact, I can't even remember where I **/
-/** found it in the first place. However, I did rework it into **/
-/** the following black-box static class so you can make easy **/
-/** use of it in your own code. Simply replace Vector2d with **/
-/** whatever your own Vector implementation might be. **/
-/*****************************************************************/
-
-#include "CSG_IndexDefs.h"
-#include <vector> // Include STL vector class.
-class MT_Plane3;
-
-template <typename PGBinder> class CSG_Triangulate
-{
-public:
-
- CSG_Triangulate(
- );
-
- // triangulate a contour/polygon, places results in STL vector
- // as series of triangles. IT uses the major axis of the normal
- // to turn it into a 2d problem.
-
- // Should chaange this to accept a point array and a list of
- // indices into that point array. Result should be indices of those
- // indices.
- //
- // MT_Point3 global_array
- // vector<BSP_VertexInd> polygon
- // result is vector<int> into polygon.
-
- bool
- Process(
- const PGBinder& contour,
- const MT_Plane3 &normal,
- VIndexList &result
- );
-
- ~CSG_Triangulate(
- );
-
-private:
-
- // compute area of a contour/polygon
- MT_Scalar
- Area(
- const PGBinder& contour
- );
-
- // decide if point Px/Py is inside triangle defined by
- // (Ax,Ay) (Bx,By) (Cx,Cy)
-
- bool
- InsideTriangle(
- MT_Scalar Ax, MT_Scalar Ay,
- MT_Scalar Bx, MT_Scalar By,
- MT_Scalar Cx, MT_Scalar Cy,
- MT_Scalar Px, MT_Scalar Py
- );
-
-
- bool
- Snip(
- const PGBinder& contour,
- int u,
- int v,
- int w,
- int n,
- int *V
- );
-
- int m_xi;
- int m_yi;
- int m_zi;
-
- // Temporary storage
-
- VIndexList m_V;
-
-};
-
-#include "CSG_Triangulate.inl"
-
-#endif
-
-
diff --git a/intern/csg/intern/CSG_Triangulate.inl b/intern/csg/intern/CSG_Triangulate.inl
deleted file mode 100644
index d7f12201af3..00000000000
--- a/intern/csg/intern/CSG_Triangulate.inl
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-#include "MT_Plane3.h"
-#include "MT_Point3.h"
-
-static const MT_Scalar EPSILON = MT_Scalar(1e-10);
-
-template <typename PGBinder>
-CSG_Triangulate<PGBinder>::
-CSG_Triangulate(
-):
- m_xi(0),
- m_yi(1)
-{
-}
-
-template <typename PGBinder>
-CSG_Triangulate<PGBinder>::
-~CSG_Triangulate(
-){
-}
-
-
-template <typename PGBinder>
- MT_Scalar
-CSG_Triangulate<PGBinder>::
-Area(
- const PGBinder& contour
-){
-
- int n = contour.Size();
- MT_Scalar A(0.0);
-
- for(int p=n-1,q=0; q<n; p=q++)
- {
- A+= contour[p][m_xi]*contour[q][m_yi] -
- contour[q][m_xi]*contour[p][m_yi];
- }
- return A*MT_Scalar(0.5);
-}
-
-/*
- InsideTriangle decides if a point P is Inside of the triangle
- defined by A, B, C.
- Or within an epsilon of it.
-*/
-
-template <typename PGBinder>
- bool
-CSG_Triangulate<PGBinder>::
-InsideTriangle(
- MT_Scalar Ax, MT_Scalar Ay,
- MT_Scalar Bx, MT_Scalar By,
- MT_Scalar Cx, MT_Scalar Cy,
- MT_Scalar Px, MT_Scalar Py
-){
- MT_Scalar ax, ay, bx, by, cx, cy, apx, apy, bpx, bpy, cpx, cpy;
- MT_Scalar cCROSSap, bCROSScp, aCROSSbp;
-
- ax = Cx - Bx; ay = Cy - By;
- bx = Ax - Cx; by = Ay - Cy;
- cx = Bx - Ax; cy = By - Ay;
- apx= Px - Ax; apy= Py - Ay;
- bpx= Px - Bx; bpy= Py - By;
- cpx= Px - Cx; cpy= Py - Cy;
-
- aCROSSbp = ax*bpy - ay*bpx;
- cCROSSap = cx*apy - cy*apx;
- bCROSScp = bx*cpy - by*cpx;
-
- return ((aCROSSbp >= -EPSILON) && (bCROSScp >= -EPSILON) && (cCROSSap >= -EPSILON));
-};
-
-template <typename PGBinder>
- bool
-CSG_Triangulate<PGBinder>::
-Snip(
- const PGBinder& contour,
- int u,int v,
- int w,int n,
- int *V
-){
- MT_Scalar Ax, Ay, Bx, By, Cx, Cy;
-
- Ax = contour[V[u]][m_xi];
- Ay = contour[V[u]][m_yi];
-
- Bx = contour[V[v]][m_xi];
- By = contour[V[v]][m_yi];
-
- Cx = contour[V[w]][m_xi];
- Cy = contour[V[w]][m_yi];
-
- // Snip is passes if the area of the candidate triangle is
- // greater than 2*epsilon
- // And if none of the remaining vertices are inside the polygon
- // or within an epsilon of the boundary,
-
- if ( EPSILON > (((Bx-Ax)*(Cy-Ay)) - ((By-Ay)*(Cx-Ax))) ) return false;
-#if 1
- // this check is only needed for non-convex polygons
- // well yeah but convex to me and you is not necessarily convex to opengl.
- int p;
- MT_Scalar Px,Py;
-
- for (p=0;p<n;p++)
- {
- if( (p == u) || (p == v) || (p == w) ) continue;
- Px = contour[V[p]][m_xi];
- Py = contour[V[p]][m_yi];
- if (InsideTriangle(Ax,Ay,Bx,By,Cx,Cy,Px,Py)) return false;
- }
-#endif
- return true;
-}
-
-template <typename PGBinder>
- bool
-CSG_Triangulate<PGBinder>::
-Process(
- const PGBinder& contour,
- const MT_Plane3 &normal,
- VIndexList &result
-){
-
- // Choose major axis of normal and assign
- // 'projection' indices m_xi,m_yi;
-
- int maj_axis = normal.Normal().closestAxis();
-
- if (maj_axis == 0) {
- m_xi = 1; m_yi = 2;
- } else
- if (maj_axis == 1) {
- m_xi = 0; m_yi = 2;
- } else {
- m_xi = 0; m_yi = 1;
- }
- m_zi = maj_axis;
-
- /* initialize list of Vertices in polygon */
-
- int n = contour.Size();
- if ( n < 3 ) return false;
-
- /* we want a counter-clockwise polygon in V */
- /* to true but we also nead to preserve the winding order
- of polygons going into the routine. We keep track of what
- we did with a little bool */
- bool is_flipped = false;
-
- if ( 0.0f < Area(contour) ) {
- for (int v=0; v<n; v++) m_V.push_back(v);
- } else {
- for(int v=0; v<n; v++) m_V.push_back((n-1)-v);
- is_flipped = true;
- }
-
- int nv = n;
-
- /* remove nv-2 Vertices, creating 1 triangle every time */
- int count = 2*nv; /* error detection */
-
- for(int m=0, v=nv-1; nv>2; )
- {
- /* if we loop, it is probably a non-simple polygon */
- if (0 >= (count--))
- {
- //** Triangulate: ERROR - probable bad polygon!
- m_V.clear();
- return false;
- }
-
- /* three consecutive vertices in current polygon, <u,v,w> */
- int u = v ; if (nv <= u) u = 0; /* previous */
- v = u+1; if (nv <= v) v = 0; /* new v */
- int w = v+1; if (nv <= w) w = 0; /* next */
-
- /* Try and snip this triangle off from the
- current polygon.*/
-
- if ( Snip(contour,u,v,w,nv,m_V.begin()) )
- {
- int a,b,c,s,t;
-
- /* true names of the vertices */
- a = m_V[u]; b = m_V[v]; c = m_V[w];
-
- /* output Triangle indices*/
- if (is_flipped) {
- result.push_back( c );
- result.push_back( b );
- result.push_back( a );
- } else {
- result.push_back( a );
- result.push_back( b );
- result.push_back( c );
- }
-
- m++;
-
- /* remove v from remaining polygon */
- for(s=v,t=v+1;t<nv;s++,t++) m_V[s] = m_V[t]; nv--;
-
- /* resest error detection counter */
- count = 2*nv;
- }
- }
-
- m_V.clear();
- return true;
-}
-
-
diff --git a/intern/csg/intern/CSG_Vertex.h b/intern/csg/intern/CSG_Vertex.h
deleted file mode 100644
index bb39dbceab5..00000000000
--- a/intern/csg/intern/CSG_Vertex.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef __VERTEX_H
-#define __VERTEX_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "MT_Point3.h"
-#include <algorithm>
-#include "CSG_IndexDefs.h"
-
-
-class VertexBase
-{
-protected:
-
- // Map to this vertex position in the classified Mesh
- // or -1 if this vertex has not yet been used.
- int m_vertexMap;
-
- MT_Point3 m_pos;
-
-public :
-
- VertexBase():m_vertexMap(-1) {};
-
- // Regular vertex model
- //////////////////////
- const MT_Point3& Pos() const { return m_pos;}
- MT_Point3& Pos() {return m_pos;}
-
- int & VertexMap() { return m_vertexMap;}
- const int & VertexMap() const { return m_vertexMap;}
-
- ~VertexBase(){};
-};
-
-#endif
-
-
diff --git a/intern/csg/intern/MT_Line3.cpp b/intern/csg/intern/MT_Line3.cpp
deleted file mode 100644
index 199eaea3390..00000000000
--- a/intern/csg/intern/MT_Line3.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-//implementation of MT_Line3
-/////////////////////////////
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "MT_Line3.h"
-
-MT_Line3::MT_Line3()
-:
- m_origin(0,0,0),
- m_dir(1,0,0)
-{
- m_bounds[0] = false;
- m_bounds[1] = false;
-
- m_params[0] = 0;
- m_params[1] = 1;
-}
-
-
-MT_Line3::MT_Line3(
- const MT_Point3& p1,
- const MT_Point3& p2
-):
- m_origin(p1),
- m_dir(p2-p1)
-{
- m_bounds[0] = true;
- m_bounds[1] = true;
- m_params[0] = 0;
- m_params[1] = 1;
-}
-
-// construct infinite line from p1 in direction v
-MT_Line3::MT_Line3(
- const MT_Point3& p1,
- const MT_Vector3& v
-):
- m_origin(p1),
- m_dir(v)
-{
- m_bounds[0] = false;
- m_bounds[1] = false;
- m_params[0] = 0;
- m_params[1] = 1;
-}
-
-MT_Line3::MT_Line3(
- const MT_Point3& p1,
- const MT_Vector3& v,
- bool bound1,
- bool bound2
-):
- m_origin(p1),
- m_dir(v)
-{
- m_bounds[0] = bound1;
- m_bounds[1] = bound2;
- m_params[0] = 0;
- m_params[1] = 1;
-}
-
-
diff --git a/intern/csg/intern/MT_Line3.h b/intern/csg/intern/MT_Line3.h
deleted file mode 100644
index e36f3995b91..00000000000
--- a/intern/csg/intern/MT_Line3.h
+++ /dev/null
@@ -1,109 +0,0 @@
-#ifndef __CGS_LINE_H
-#define __CGS_LINE_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "MT_Point3.h"
-#include "MT_Vector3.h"
-
-class MT_Line3
-{
-public :
-
- MT_Line3();
-
- // construct closed line segment from p1 -> p2
- MT_Line3(const MT_Point3& p1, const MT_Point3& p2);
-
- // construct infinite line from p1 in direction v
- MT_Line3(const MT_Point3& p1, const MT_Vector3& v);
-
- MT_Line3(const MT_Point3& p1, const MT_Vector3& v, bool bound1, bool bound2);
-
- // return an infinite ray from the point p1 in the direction v
- static MT_Line3 InfiniteRay(const MT_Point3& p1, const MT_Vector3& v);
-
- // return direction of line
- const MT_Vector3& Direction() const { return m_dir;}
-
- // return a point on the line
- const MT_Point3& Origin() const { return m_origin;}
-
- bool Bounds(int i) const {
- return (i == 0 ? m_bounds[0] : m_bounds[1]);
- }
-
- bool & Bounds(int i) {
- return (i == 0 ? m_bounds[0] : m_bounds[1]);
- }
-
- const MT_Scalar& Param(int i) const {
- return (i == 0 ? m_params[0] : m_params[1]);
- }
-
- MT_Scalar& Param(int i){
- return (i == 0 ? m_params[0] : m_params[1]);
- }
-
- // Return the smallest Vector from the point to the line
- // does not take into account bounds of line.
- MT_Vector3 UnboundSmallestVector(const MT_Point3& point) const
- {
- MT_Vector3 diff(m_origin-point);
- return diff - m_dir * diff.dot(m_dir);
- }
-
- // Return the closest parameter of the line to the
- // point.
- MT_Scalar UnboundClosestParameter(const MT_Point3& point) const
- {
- MT_Vector3 diff(m_origin-point);
- return diff.dot(m_dir);
- }
-
- MT_Scalar UnboundDistance(const MT_Point3& point) const
- {
- return UnboundSmallestVector(point).length();
- }
-
- // Return true if the line parameter t is actually within the line bounds.
- bool IsParameterOnLine(const MT_Scalar &t) const
- {
- return ((m_params[0]-MT_EPSILON < t) || (!m_bounds[0])) && ((m_params[1] > t+MT_EPSILON) || (!m_bounds[1]));
-// return ((m_params[0] < t) || (!m_bounds[0])) && ((m_params[1] > t ) || (!m_bounds[1]));
- }
-
-
-private :
-
- bool m_bounds[2];
-
- MT_Scalar m_params[2];
- MT_Point3 m_origin;
- MT_Vector3 m_dir;
-
-};
-
-
-
-
-
-#endif \ No newline at end of file
diff --git a/intern/csg/intern/blender/CSG_BlenderMesh.h b/intern/csg/intern/blender/CSG_BlenderMesh.h
deleted file mode 100644
index 1f7a841d1e2..00000000000
--- a/intern/csg/intern/blender/CSG_BlenderMesh.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef CSG_BlenderMesh_H
-#define CSG_BlenderMesh_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-//typedefs for types used to represent blender meshes in the CSG library
-
-#include "CSG_IndexDefs.h"
-#include "CSG_ConnectedMesh.h"
-
-#include "CSG_Vertex.h"
-#include "CSG_CVertex.h"
-#include "CSG_Polygon.h"
-#include "CSG_Mesh.h"
-#include "CSG_MeshWrapper.h"
-#include "CSG_Interface.h"
-#include "CSG_BlenderVProp.h"
-
-typedef PolygonBase<BlenderVProp,CSG_IFaceData> TestPolygon;
-
-typedef Mesh<TestPolygon,VertexBase> AMesh;
-typedef Mesh<TestPolygon,CVertex > AConnectedMesh;
-
-typedef MeshWrapper<AMesh> AMeshWrapper;
-typedef ConnectedMeshWrapper<AConnectedMesh> AConnectedMeshWrapper;
-
-#endif \ No newline at end of file
diff --git a/intern/csg/intern/blender/CSG_BlenderVProp.cpp b/intern/csg/intern/blender/CSG_BlenderVProp.cpp
deleted file mode 100644
index 6acbdf25e6f..00000000000
--- a/intern/csg/intern/blender/CSG_BlenderVProp.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-#include "CSG_Interface.h"
-#include "CSG_BlenderVProp.h"
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-#pragma warning( disable : 4786 )
-
-int NoFunc(
- const CSG_IFaceVertexData*,
- const CSG_IFaceVertexData*,
- CSG_IFaceVertexData*,
- double
-){
- return 0;
-}
-
-
-CSG_InterpolateUserFaceVertexDataFunc BlenderVProp::InterpFunc = &NoFunc; \ No newline at end of file
diff --git a/intern/csg/intern/blender/CSG_CsgOp.cpp b/intern/csg/intern/blender/CSG_CsgOp.cpp
deleted file mode 100644
index 1ff84ab0f3b..00000000000
--- a/intern/csg/intern/blender/CSG_CsgOp.cpp
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-#pragma warning( disable : 4786 )
-
-#include "CSG_CsgOp.h"
-#include "CSG_BooleanOp.h"
-#include "CSG_BBoxTree.h"
-#include "CSG_Math.h"
-#include "CSG_GeometryBinder.h"
-#include "CSG_MeshCopier.h"
-
-#include "MEM_SmartPtr.h"
-
-using namespace std;
-
- void
-BuildTree(
- const AMesh& mesh,
- BBoxTree& tree
-) {
- int numLeaves = mesh.Polys().size();
-
- BBoxLeaf *aLeaves = new BBoxLeaf[numLeaves];
-
- int i;
- for (i=0;i< mesh.Polys().size(); i++)
- {
- PolygonGeometry<AMesh> pg(mesh,i);
- aLeaves[i] = BBoxLeaf(i,CSG_Math<PolygonGeometry<AMesh> >::FitBBox(pg) );
- }
-
- tree.BuildTree(aLeaves,numLeaves);
-}
-
-
- void
-ExtractClassificationPreserve(
- const AMesh& meshA,
- const AMesh& meshB,
- const BBoxTree& aTree,
- const BBoxTree& bTree,
- const OverlapTable& aOverlapsB,
- const OverlapTable& bOverlapsA,
- int aClassification,
- int bClassification,
- bool reverseA,
- bool reverseB,
- AMesh& output
-){
-
- // Now we need to make a copy of each mesh and then partition each of those
- // copies with respect to the original meshes.
- AConnectedMesh meshAPartitioned;
- AConnectedMesh meshBPartitioned;
-
- MeshCopier<AMesh,AConnectedMesh>::Copy(meshA,meshAPartitioned);
- MeshCopier<AMesh,AConnectedMesh>::Copy(meshB,meshBPartitioned);
-
- AConnectedMeshWrapper meshAWrapper(meshAPartitioned);
- AConnectedMeshWrapper meshBWrapper(meshBPartitioned);
-
- meshAWrapper.BuildVertexPolyLists();
- meshBWrapper.BuildVertexPolyLists();
- // Partition meshA wrt to meshB
- BooleanOp<AConnectedMeshWrapper,AMesh>::PartitionMesh(meshAWrapper,meshB,bOverlapsA);
- // and now meshB wrt meshA
- BooleanOp<AConnectedMeshWrapper,AMesh>::PartitionMesh(meshBWrapper,meshA,aOverlapsB);
-
- // Classify the partioned meshes wrt to the originals.
- BooleanOp<AConnectedMesh,AMesh>::ClassifyMesh(meshB,bTree,meshAPartitioned);
- BooleanOp<AConnectedMesh,AMesh>::ClassifyMesh(meshA,aTree,meshBPartitioned);
-
- // Extract the classification we want from both meshes
- BooleanOp<AConnectedMesh,AMesh>::ExtractClassification(meshAPartitioned, output,aClassification,reverseA);
- BooleanOp<AConnectedMesh,AMesh>::ExtractClassification(meshBPartitioned, output,bClassification,reverseB);
-}
-
- void
-ExtractClassification(
- const AMesh& meshA,
- const AMesh& meshB,
- const BBoxTree& aTree,
- const BBoxTree& bTree,
- const OverlapTable& aOverlapsB,
- const OverlapTable& bOverlapsA,
- int aClassification,
- int bClassification,
- bool reverseA,
- bool reverseB,
- AMesh& output
-){
- // Now we need to make a copy of each mesh and then partition each of those
- // copies with respect to the original meshes.
- AMesh meshAPartitioned(meshA);
- AMesh meshBPartitioned(meshB);
-
- AMeshWrapper meshAWrapper(meshAPartitioned);
- AMeshWrapper meshBWrapper(meshBPartitioned);
-
- // Partition meshA wrt to meshB
- BooleanOp<AMeshWrapper,AMesh>::PartitionMesh(meshAWrapper,meshB,bOverlapsA);
- // and now meshB wrt meshA
- BooleanOp<AMeshWrapper,AMesh>::PartitionMesh(meshBWrapper,meshA,aOverlapsB);
-
- // Classify the partioned meshes wrt to the originals.
- BooleanOp<AMesh,AMesh>::ClassifyMesh(meshB,bTree,meshAPartitioned);
- BooleanOp<AMesh,AMesh>::ClassifyMesh(meshA,aTree,meshBPartitioned);
-
- // Extract the classification we want from both meshes
- BooleanOp<AMesh,AMesh>::ExtractClassification(meshAPartitioned, output,aClassification,reverseA);
- BooleanOp<AMesh,AMesh>::ExtractClassification(meshBPartitioned, output,bClassification,reverseB);
-}
-
- AMesh *
-CsgOp::
-Intersect(
- const AMesh& meshA,
- const AMesh& meshB,
- bool preserve
-){
- // assumes they occups the same space and their planes have
- // been computed.
-
- // First thing is to build a BBoxTree for each mesh.
- BBoxTree aTree,bTree;
- BuildTree(meshA,aTree);
- BuildTree(meshB,bTree);
-
- // Build the overlap tables - they tell us which polygons from
- // meshA overlap with those of meshB and vice versa
- OverlapTable bOverlapsA(meshA.Polys().size());
- OverlapTable aOverlapsB(meshB.Polys().size());
-
- BooleanOp<AMesh,AMesh>::BuildSplitGroup(meshA,meshB,aTree,bTree,aOverlapsB,bOverlapsA);
-
- // Create a new mesh for the output
- MEM_SmartPtr<AMesh> output = new AMesh;
- if (output == NULL) return NULL;
-
- if (preserve)
- {
- ExtractClassificationPreserve(meshA,meshB,aTree,bTree,aOverlapsB,bOverlapsA,1,1,false,false,output.Ref());
- } else {
- ExtractClassification(meshA,meshB,aTree,bTree,aOverlapsB,bOverlapsA,1,1,false,false,output.Ref());
- }
-
-#if 1
- // Triangulate the result
- AMeshWrapper outputWrapper(output.Ref());
- outputWrapper.Triangulate();
-#endif
- return output.Release();
-}
-
-
- AMesh *
-CsgOp::
-Union(
- const AMesh& meshA,
- const AMesh& meshB,
- bool preserve
-){
- // assumes they occups the same space and their planes have
- // been computed.
-
- // First thing is to build a BBoxTree for each mesh.
- BBoxTree aTree,bTree;
- BuildTree(meshA,aTree);
- BuildTree(meshB,bTree);
-
- // Build the overlap tables - they tell us which polygons from
- // meshA overlap with those of meshB and vice versa
- OverlapTable bOverlapsA(meshA.Polys().size());
- OverlapTable aOverlapsB(meshB.Polys().size());
-
- BooleanOp<AMesh,AMesh>::BuildSplitGroup(meshA,meshB,aTree,bTree,aOverlapsB,bOverlapsA);
-
- // Create a new mesh for the output
- MEM_SmartPtr<AMesh> output = new AMesh;
- if (output == NULL) return NULL;
-
- if (preserve)
- {
- ExtractClassificationPreserve(meshA,meshB,aTree,bTree,aOverlapsB,bOverlapsA,2,2,false,false,output.Ref());
- } else {
- ExtractClassification(meshA,meshB,aTree,bTree,aOverlapsB,bOverlapsA,2,2,false,false,output.Ref());
- }
-
-#if 1
- // Triangulate the result
- AMeshWrapper outputWrapper(output.Ref());
- outputWrapper.Triangulate();
-#endif
- return output.Release();
-}
-
- AMesh *
-CsgOp::
-Difference(
- const AMesh& meshA,
- const AMesh& meshB,
- bool preserve
-){
-
- // assumes they occups the same space and their planes have
- // been computed.
-
- // First thing is to build a BBoxTree for each mesh.
- BBoxTree aTree,bTree;
- BuildTree(meshA,aTree);
- BuildTree(meshB,bTree);
-
- // Build the overlap tables - they tell us which polygons from
- // meshA overlap with those of meshB and vice versa
- OverlapTable bOverlapsA(meshA.Polys().size());
- OverlapTable aOverlapsB(meshB.Polys().size());
-
- BooleanOp<AMesh,AMesh>::BuildSplitGroup(meshA,meshB,aTree,bTree,aOverlapsB,bOverlapsA);
-
- // Create a new mesh for the output
- MEM_SmartPtr<AMesh> output = new AMesh;
- if (output == NULL) return NULL;
-
- if (preserve)
- {
- ExtractClassificationPreserve(meshA,meshB,aTree,bTree,aOverlapsB,bOverlapsA,2,1,false,true,output.Ref());
- } else {
- ExtractClassification(meshA,meshB,aTree,bTree,aOverlapsB,bOverlapsA,2,1,false,true,output.Ref());
- }
-
-#if 1
- // Triangulate the result
- AMeshWrapper outputWrapper(output.Ref());
- outputWrapper.Triangulate();
-#endif
- return output.Release();
-}
-
-
diff --git a/intern/csg/intern/blender/CSG_CsgOp.h b/intern/csg/intern/blender/CSG_CsgOp.h
deleted file mode 100644
index 3b0e8b33766..00000000000
--- a/intern/csg/intern/blender/CSG_CsgOp.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef CSG_CsgOp_h
-#define CSG_CsgOp_h
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "CSG_BlenderMesh.h"
-
-
-class CsgOp
-{
-public :
-
- static
- AMesh *
- Intersect(
- const AMesh& meshA,
- const AMesh& meshB,
- bool preserve
- );
-
- static
- AMesh *
- Union(
- const AMesh& meshA,
- const AMesh& meshB,
- bool preserve
- );
-
- static
- AMesh *
- Difference(
- const AMesh& meshA,
- const AMesh& meshB,
- bool preserve
- );
-
-
-};
-
-
-#endif \ No newline at end of file
diff --git a/intern/csg/intern/blender/CSG_IndexDefs.h b/intern/csg/intern/blender/CSG_IndexDefs.h
deleted file mode 100644
index f385537d0ac..00000000000
--- a/intern/csg/intern/blender/CSG_IndexDefs.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef CSG_INDEXDEFS_H
-#define CSG_INDEXDEFS_H
-
-//typdefs for lists and things in the CSG library
-
-#include <vector>
-
-typedef std::vector<int> PIndexList;
-typedef PIndexList::iterator PIndexIt;
-typedef PIndexList::const_iterator const_PIndexIt;
-
-typedef std::vector<int> VIndexList;
-typedef VIndexList::iterator VIndexIt;
-typedef VIndexList::const_iterator const_VIndexIt;
-
-typedef std::vector< PIndexList > OverlapTable;
-
-
-
-#endif
-
-
diff --git a/intern/csg/intern/blender/CSG_Interface.cpp b/intern/csg/intern/blender/CSG_Interface.cpp
deleted file mode 100644
index 8b6415f1b3a..00000000000
--- a/intern/csg/intern/blender/CSG_Interface.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-/**
- * Implementation of external C api for CSG lib .
- */
-#pragma warning( disable : 4786 )
-
-#include "CSG_Interface.h"
-#include "CSG_Iterator.h"
-#include "CSG_BlenderMesh.h"
-#include "CSG_MeshBuilder.h"
-#include "CSG_CsgOp.h"
-
-#include "MEM_SmartPtr.h"
-
-struct CSG_MeshInfo {
- MEM_SmartPtr<AMesh> output_mesh;
-};
-
- CSG_BooleanOperation *
-CSG_NewBooleanFunction(
- void
-){
- CSG_MeshInfo * mesh_info = new CSG_MeshInfo;
- CSG_BooleanOperation * output = new CSG_BooleanOperation;
-
- if (mesh_info==NULL || output==NULL) return NULL;
-
- mesh_info->output_mesh = NULL;
- output->CSG_info = mesh_info;
-
- return output;
-}
-
- int
-CSG_PerformBooleanOperation(
- CSG_BooleanOperation * operation,
- CSG_OperationType op_type,
- CSG_FaceIteratorDescriptor obAFaces,
- CSG_VertexIteratorDescriptor obAVertices,
- CSG_FaceIteratorDescriptor obBFaces,
- CSG_VertexIteratorDescriptor obBVertices,
- CSG_InterpolateUserFaceVertexDataFunc interp_func
-){
-
- if (operation == NULL) return 0;
-
- CSG_MeshInfo * mesh_info = static_cast<CSG_MeshInfo *>(operation->CSG_info);
- if (mesh_info == NULL) return 0;
-
- obAFaces.Reset(obAFaces.it);
- obBFaces.Reset(obBFaces.it);
- obAVertices.Reset(obAVertices.it);
- obBVertices.Reset(obBVertices.it);
-
- MEM_SmartPtr<AMesh> outputMesh;
-
- try {
- // Build the individual meshes
- // set the face data size
- BlenderVProp::InterpFunc = interp_func;
-
- MEM_SmartPtr<AMesh> obA = MeshBuilder::NewMesh(obAFaces,obAVertices);
-
- MEM_SmartPtr<AMesh> obB = MeshBuilder::NewMesh(obBFaces,obBVertices);
-
- if (
- obA == NULL ||
- obB == NULL
- ) {
- return 0;
- }
-
- // build normals
- AMeshWrapper aMeshWrap(obA.Ref()), bMeshWrap(obB.Ref());
- aMeshWrap.ComputePlanes();
- bMeshWrap.ComputePlanes();
-
- // translate enums!
-
- switch(op_type) {
- case e_csg_union :
- case e_csg_classify :
- outputMesh = CsgOp::Union(obA.Ref(),obB.Ref(),true);
- break;
- case e_csg_intersection :
- outputMesh = CsgOp::Intersect(obA.Ref(),obB.Ref(),true);
- break;
- case e_csg_difference :
- outputMesh = CsgOp::Difference(obA.Ref(),obB.Ref(),true);
- break;
- default :
- return 0;
- }
- }
- catch(...) {
- return 0;
- }
-
- // set the output mesh
- mesh_info->output_mesh = outputMesh;
-
- return 1;
-}
-
- int
-CSG_OutputFaceDescriptor(
- CSG_BooleanOperation * operation,
- CSG_FaceIteratorDescriptor * output
-){
- if (operation == NULL) return 0;
- CSG_MeshInfo * mesh_info = static_cast<CSG_MeshInfo *>(operation->CSG_info);
-
- if (mesh_info == NULL) return 0;
- if (mesh_info->output_mesh == NULL) return 0;
-
- AMesh_FaceIt_Construct(mesh_info->output_mesh,output);
- return 1;
-}
-
-
- int
-CSG_OutputVertexDescriptor(
- CSG_BooleanOperation * operation,
- CSG_VertexIteratorDescriptor *output
-){
- if (operation == NULL) return 0;
- CSG_MeshInfo * mesh_info = static_cast<CSG_MeshInfo *>(operation->CSG_info);
-
- if (mesh_info == NULL) return 0;
- if (mesh_info->output_mesh == NULL) return 0;
-
- AMesh_VertexIt_Construct(mesh_info->output_mesh,output);
- return 1;
-}
-
- void
-CSG_FreeVertexDescriptor(
- CSG_VertexIteratorDescriptor * v_descriptor
-){
- AMesh_VertexIt_Destruct(v_descriptor);
-}
-
-
- void
-CSG_FreeFaceDescriptor(
- CSG_FaceIteratorDescriptor * f_descriptor
-){
- AMesh_FaceIt_Destruct(f_descriptor);
-}
-
-
- void
-CSG_FreeBooleanOperation(
- CSG_BooleanOperation *operation
-){
- if (operation != NULL) {
- CSG_MeshInfo * mesh_info = static_cast<CSG_MeshInfo *>(operation->CSG_info);
- delete(mesh_info);
- delete(operation);
- }
-}
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/intern/csg/intern/blender/CSG_Iterator.h b/intern/csg/intern/blender/CSG_Iterator.h
deleted file mode 100644
index e349229be9e..00000000000
--- a/intern/csg/intern/blender/CSG_Iterator.h
+++ /dev/null
@@ -1,199 +0,0 @@
-
-#ifndef CSG_Iterator_H
-#define CSG_Iterator_H
-
-#include "CSG_BlenderMesh.h"
-#include "CSG_Interface.h"
-
-#include "MEM_SmartPtr.h"
-/**
- * This class defines 2 C style iterators over a CSG mesh, one for
- * vertices and 1 for faces. They conform to the iterator interface
- * defined in CSG_BooleanOps.h
- */
-
-struct AMesh_VertexIt {
- AMesh* mesh;
- AMesh::VLIST::const_iterator pos;
-};
-
-
-static
- void
-AMesh_VertexIt_Destruct(
- CSG_VertexIteratorDescriptor * vIterator
-) {
- delete ((AMesh_VertexIt *)(vIterator->it));
- vIterator->it = NULL;
- vIterator->Done = NULL;
- vIterator->Fill = NULL;
- vIterator->Reset = NULL;
- vIterator->Step = NULL;
- vIterator->num_elements = 0;
-};
-
-
-static
- int
-AMesh_VertexIt_Done(
- CSG_IteratorPtr it
-) {
- // assume CSG_IteratorPtr is of the correct type.
- AMesh_VertexIt * vertex_it = (AMesh_VertexIt *)it;
-
- if (vertex_it->pos < vertex_it->mesh->Verts().end() ) return 0;
- return 1;
-};
-
-static
- void
-AMesh_VertexIt_Fill(
- CSG_IteratorPtr it,
- CSG_IVertex *vert
-) {
- // assume CSG_IteratorPtr is of the correct type.
- AMesh_VertexIt * vertex_it = (AMesh_VertexIt *)it;
-
- vertex_it->pos->Pos().getValue(vert->position);
-};
-
-static
- void
-AMesh_VertexIt_Step(
- CSG_IteratorPtr it
-) {
- // assume CSG_IteratorPtr is of the correct type.
- AMesh_VertexIt * vertex_it = (AMesh_VertexIt *)it;
-
- ++(vertex_it->pos);
-};
-
-static
- void
-AMesh_VertexIt_Reset(
- CSG_IteratorPtr it
-) {
- // assume CSG_IteratorPtr is of the correct type.
- AMesh_VertexIt * vertex_it = (AMesh_VertexIt *)it;
- vertex_it->pos = vertex_it->mesh->Verts().begin();
-};
-
-static
- void
-AMesh_VertexIt_Construct(
- AMesh *mesh,
- CSG_VertexIteratorDescriptor *output
-){
- // user should have insured mesh is not equal to NULL.
-
- output->Done = AMesh_VertexIt_Done;
- output->Fill = AMesh_VertexIt_Fill;
- output->Step = AMesh_VertexIt_Step;
- output->Reset = AMesh_VertexIt_Reset;
- output->num_elements = mesh->Verts().size();
-
- AMesh_VertexIt * v_it = new AMesh_VertexIt;
- v_it->mesh = mesh;
- v_it->pos = mesh->Verts().begin();
- output->it = v_it;
-};
-
-
-/**
- * Face iterator.
- */
-
-struct AMesh_FaceIt {
- AMesh* mesh;
- AMesh::PLIST::const_iterator pos;
-};
-
-
-static
- void
-AMesh_FaceIt_Destruct(
- CSG_FaceIteratorDescriptor *fIterator
-) {
- delete ((AMesh_FaceIt *)(fIterator->it));
- fIterator->it = NULL;
- fIterator->Done = NULL;
- fIterator->Fill = NULL;
- fIterator->Reset = NULL;
- fIterator->Step = NULL;
- fIterator->num_elements = 0;
-};
-
-
-static
- int
-AMesh_FaceIt_Done(
- CSG_IteratorPtr it
-) {
- // assume CSG_IteratorPtr is of the correct type.
- AMesh_FaceIt * face_it = (AMesh_FaceIt *)it;
-
- return face_it->pos >= face_it->mesh->Polys().end();
-};
-
-static
- void
-AMesh_FaceIt_Fill(
- CSG_IteratorPtr it,
- CSG_IFace *face
-){
- // assume CSG_IteratorPtr is of the correct type.
- AMesh_FaceIt * face_it = (AMesh_FaceIt *)it;
-
- face->m_vertexData[0] = face_it->pos->VertexProps(0).Data();
- face->m_vertexData[1] = face_it->pos->VertexProps(1).Data();
- face->m_vertexData[2] = face_it->pos->VertexProps(2).Data();
-
- face->m_vertexNumber =3;
- face->m_faceData = face_it->pos->FProp();
-};
-
-static
- void
-AMesh_FaceIt_Step(
- CSG_IteratorPtr it
-) {
- // assume CSG_IteratorPtr is of the correct type.
- AMesh_FaceIt * face_it = (AMesh_FaceIt *)it;
- face_it->pos++;
-};
-
-static
- void
-AMesh_FaceIt_Reset(
- CSG_IteratorPtr it
-) {
- // assume CSG_IteratorPtr is of the correct type.
- AMesh_FaceIt * f_it = (AMesh_FaceIt *)it;
- f_it->pos = f_it->mesh->Polys().begin();
-};
-
-static
- void
-AMesh_FaceIt_Construct(
- AMesh * mesh,
- CSG_FaceIteratorDescriptor *output
-) {
-
- output->Done = AMesh_FaceIt_Done;
- output->Fill = AMesh_FaceIt_Fill;
- output->Step = AMesh_FaceIt_Step;
- output->Reset = AMesh_FaceIt_Reset;
-
- output->num_elements = mesh->Polys().size();
-
- AMesh_FaceIt * f_it = new AMesh_FaceIt;
- f_it->mesh = mesh;
- f_it->pos = mesh->Polys().begin();
-
- output->it = f_it;
-
-};
-
-
-#endif
-
diff --git a/intern/csg/intern/blender/CSG_MeshBuilder.h b/intern/csg/intern/blender/CSG_MeshBuilder.h
deleted file mode 100644
index 5d65acdab50..00000000000
--- a/intern/csg/intern/blender/CSG_MeshBuilder.h
+++ /dev/null
@@ -1,123 +0,0 @@
-#ifndef CSG_MeshBuilder_H
-#define CSG_MeshBuilder_H
-/*
- CSGLib - Software Library for Constructive Solid Geometry
- Copyright (C) 2003-2004 Laurence Bourn
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This library 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
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- Please send remarks, questions and bug reports to laurencebourn@hotmail.com
-*/
-
-#include "CSG_IndexDefs.h"
-#include "CSG_Vertex.h"
-#include "CSG_Polygon.h"
-#include "CSG_Interface.h"
-#include "CSG_BlenderMesh.h"
-
-// build a mesh from external c interface to this module
-////////////////////////////////////////////////////////
-
-class MeshBuilder
-{
-
-public :
-
- // You must have set the size of the SimpleProps data ptr size
- // before calling this function.
-
- static AMesh* NewMesh(
- CSG_FaceIteratorDescriptor obBFaces,
- CSG_VertexIteratorDescriptor obBVertices
- ) {
-
- AMesh *output = new AMesh();
-
- // first get the vertices.
- AMesh::VLIST& verts = output->Verts();
-
- verts.reserve(obBVertices.num_elements);
-
- obBVertices.Reset(obBFaces.it);
-
- CSG_IVertex iVert;
-
- while (!obBVertices.Done(obBVertices.it))
- {
- obBVertices.Fill(obBVertices.it,&iVert);
-
- AMesh::Vertex aVertex;
- aVertex.Pos().setValue(iVert.position);
- verts.push_back(aVertex);
-
- obBVertices.Step(obBVertices.it);
- }
-
- // now for the faces
- ////////////////////
-
- AMesh::PLIST &faces = output->Polys();
- faces.reserve(obBFaces.num_elements);
-
- CSG_IFace iFace;
-
- while (!obBFaces.Done(obBFaces.it))
- {
- obBFaces.Fill(obBFaces.it,&iFace);
-
- AMesh::Polygon aPolygon;
- aPolygon.FProp() = iFace.m_faceData;
-
- int i;
- for (i=0;i < 3; i++)
- {
- AMesh::Polygon::TVProp vProp;
- vProp.Data() = iFace.m_vertexData[i];
- aPolygon.Verts().push_back(vProp);
- }
- faces.push_back(aPolygon);
-
- if (iFace.m_vertexNumber == 4)
- {
- AMesh::Polygon::TVProp vProp[3];
- vProp[0].Data() = iFace.m_vertexData[2];
- vProp[1].Data() = iFace.m_vertexData[3];
- vProp[2].Data() = iFace.m_vertexData[0];
-
- aPolygon.VertexProps(0) = vProp[0];
- aPolygon.VertexProps(1) = vProp[1];
- aPolygon.VertexProps(2) = vProp[2];
-
- faces.push_back(aPolygon);
- }
-
- obBFaces.Step(obBFaces.it);
- }
-
- return output;
- }
-};
-
-
-#endif
-
-
-
-
-
-
-
-
- \ No newline at end of file
diff --git a/intern/csg/intern/blender/CSG_PropArray.h b/intern/csg/intern/blender/CSG_PropArray.h
deleted file mode 100644
index 7e28a2a417e..00000000000
--- a/intern/csg/intern/blender/CSG_PropArray.h
+++ /dev/null
@@ -1,126 +0,0 @@
-#ifndef CSG_IndexProp_H
-#define CSG_IndexProp_H
-
-#include <vector>
-#include <memory.h>
-// Face and vertex props that are contained in a seperate array
-// (PropArray) and indexed through a VProp compliant thing.
-
-typedef int (*CSG_InterpFunc)(const void *d1, const void * d2, void *dnew, float epsilon);
-
-class IndexProp
-{
-private :
-
- int m_vIndex;
- int m_size;
- unsigned char *m_data;
- mutable CSG_InterpFunc m_interpFunc;
-
-public :
-
- IndexProp(const int& vIndex)
- : m_vIndex(vIndex),
- m_size(0),
- m_data(0)
- {};
-
- IndexProp(
- const int& vIndex,
- const IndexProp& p1,
- const IndexProp& p2,
- const MT_Scalar& epsilon
- ):
- m_vIndex(vIndex),
- m_data(0)
- {
- SetInterpFunc(p1.m_interpFunc);
- SetSize(p1.m_size);
- m_interpFunc(p1.m_data,p2.m_data,m_data,(float)epsilon);
- }
-
- IndexProp(const IndexProp& other)
- : m_vIndex(other.m_vIndex),
- m_data(0),
- m_interpFunc(other.m_interpFunc)
- {
- SetInterpFunc(other.m_interpFunc);
- SetSize(other.m_size);
- memcpy(m_data,other.m_data,m_size);
- }
-
- IndexProp(
- ): m_vIndex(-1),
- m_size(0),
- m_data(0)
- {};
-
- // Support conversion to an integer
- ///////////////////////////////////
- operator int(
- ) const {
- return m_vIndex;
- }
-
- // and assignment from an integer.
- //////////////////////////////////
- IndexProp&
- operator = (
- int i
- ) {
- m_vIndex = i;
- return *this;
- }
-
- IndexProp&
- operator = (
- const IndexProp& other
- ) {
- m_vIndex = other.m_vIndex;
- m_data = 0;
- SetSize(other.m_size);
- SetInterpFunc(other.m_interpFunc);
- memcpy(m_data,other.m_data,m_size);
- return *this;
- }
-
- // Our local functions
- //////////////////////
-
- void SetInterpFunc(CSG_InterpFunc interpFunc)
- {
- m_interpFunc = interpFunc;
- }
-
- void SetSize(int size)
- {
- delete[] m_data;
- m_data = new unsigned char[size];
- m_size = size;
- }
-
- int Size() const {
- return m_size;
- }
-
- void CopyData(const void * userData)
- {
- memcpy(m_data,userData,m_size);
- }
-
- void Create(int size, const void * userData, CSG_InterpFunc interpFunc)
- {
- SetInterpFunc(interpFunc);
- SetSize(size);
- CopyData(userData);
- }
-
- const unsigned char * GetData() const { return m_data;}
-
- ~IndexProp() {
- delete[] m_data;
- };
-};
-
-
-#endif \ No newline at end of file
diff --git a/intern/csg/intern/blender/CSG_SimpleProp.cpp b/intern/csg/intern/blender/CSG_SimpleProp.cpp
deleted file mode 100644
index 2c8f0eedae9..00000000000
--- a/intern/csg/intern/blender/CSG_SimpleProp.cpp
+++ /dev/null
@@ -1,4 +0,0 @@
-#include "CSG_SimpleProp.h"
-
-
-int SimpleProp::s_size = 4; \ No newline at end of file
diff --git a/intern/csg/intern/blender/CSG_SimpleProp.h b/intern/csg/intern/blender/CSG_SimpleProp.h
deleted file mode 100644
index dc8ab45c6d8..00000000000
--- a/intern/csg/intern/blender/CSG_SimpleProp.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef CSG_SIMPLEPROP_H
-#define CSG_SIMPLEPROP_H
-
-// Simple face prop contains a fixed size piece of memory
-// initiated by the client and copied round through this
-// value type by the CSG library.
-#include <memory.h>
-
-class SimpleProp
-{
-private :
-
- static int s_size;
- unsigned char * m_data;
-
-public :
-
- static void SetSize(int size) {
- s_size = size;
- }
-
- static int Size() {
- return s_size;
- }
-
- SimpleProp()
- : m_data(new unsigned char[s_size])
- {}
-
- SimpleProp(const SimpleProp& other)
- : m_data(new unsigned char[s_size])
- {
- memcpy(m_data,other.m_data,s_size);
- }
-
- SimpleProp& operator = (const SimpleProp& other)
- {
- memcpy(m_data,other.m_data,s_size);
- return *this;
- }
-
- void SetData(const void * data)
- {
- memcpy(m_data,data,s_size);
- }
-
- const unsigned char * Data() const {
- return m_data;
- }
-
-
- ~SimpleProp()
- {
- delete[] m_data;
- }
-};
-
-#endif \ No newline at end of file
diff --git a/intern/csg/make/msvc60/csg.dsp b/intern/csg/make/msvc60/csg.dsp
deleted file mode 100644
index ae67f505bc3..00000000000
--- a/intern/csg/make/msvc60/csg.dsp
+++ /dev/null
@@ -1,234 +0,0 @@
-# Microsoft Developer Studio Project File - Name="csg" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=csg - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "csg.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "csg.mak" CFG="csg - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "csg - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "csg - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "csg - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\..\..\obj\windows\intern\bsp\"
-# PROP Intermediate_Dir "..\..\..\..\obj\windows\intern\bsp\"
-# PROP Target_Dir ""
-LINK32=link.exe -lib
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /G6 /MT /W3 /GX /I "../../intern/blender" /I "../../extern" /I "../../intern" /I "../../../../../lib/windows/memutil/include" /I "../.." /I "../../../../../lib/windows/moto/include" /I"..\..\..\moto\include" /I"..\..\..\memutil" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c
-# ADD BASE RSC /l 0x413 /d "NDEBUG"
-# ADD RSC /l 0x413 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\..\..\..\obj\windows\intern\bsp\libbsp.lib"
-# Begin Special Build Tool
-SOURCE="$(InputPath)"
-PostBuild_Cmds=ECHO Copying header files XCOPY /E /Y ..\..\extern\*.h ..\..\..\..\..\lib\windows\bsp\include\ ECHO Copying lib XCOPY /E /Y ..\..\..\..\obj\windows\intern\bsp\*.lib ..\..\..\..\lib\windows\bsp\lib\*.a ECHO Done
-# End Special Build Tool
-
-!ELSEIF "$(CFG)" == "csg - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\..\..\obj\windows\intern\bsp\debug\"
-# PROP Intermediate_Dir "..\..\..\..\obj\windows\intern\bsp\debug\"
-# PROP Target_Dir ""
-LINK32=link.exe -lib
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "../../intern/blender" /I "../../extern" /I "../../intern" /I "../../../../../lib/windows/memutil/include" /I "../.." /I "../../../../../lib/windows/moto/include" /I"..\..\..\moto\include" /I"..\..\..\memutil" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FD /GZ /c
-# ADD BASE RSC /l 0x413 /d "_DEBUG"
-# ADD RSC /l 0x413 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\..\..\..\obj\windows\intern\bsp\debug\libbsp.lib"
-# Begin Special Build Tool
-SOURCE="$(InputPath)"
-PostBuild_Cmds=ECHO Copying header files XCOPY /E /Y ..\..\extern\*.h ..\..\..\..\..\lib\windows\bsp\include\ ECHO Copying lib XCOPY /E /Y ..\..\..\..\obj\windows\intern\bsp\debug\*.lib ..\..\..\..\..\lib\windows\bsp\lib\debug\*.a ECHO Copying Debug info. XCOPY /E /Y ..\..\..\..\obj\windows\intern\bsp\debug\vc60.* ..\..\..\..\..\lib\windows\bsp\lib\debug\ ECHO Done
-# End Special Build Tool
-
-!ENDIF
-
-# Begin Target
-
-# Name "csg - Win32 Release"
-# Name "csg - Win32 Debug"
-# Begin Group "AABBTree"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_BBox.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_BBoxTree.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_BBoxTree.h
-# End Source File
-# End Group
-# Begin Group "inlines"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_ConnectedMeshWrapper.inl
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_Math.inl
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_Triangulate.inl
-# End Source File
-# End Group
-# Begin Group "blender"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\intern\blender\CSG_BlenderMesh.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\blender\CSG_BlenderVProp.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_BlenderVProp.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\blender\CSG_CsgOp.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\blender\CSG_CsgOp.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\blender\CSG_Interface.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\extern\CSG_Interface.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\blender\CSG_MeshBuilder.h
-# End Source File
-# End Group
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_BooleanOp.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_BooleanOp.inl
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_ConnectedMesh.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_CVertex.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_GeometryBinder.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_IndexDefs.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_Math.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_Mesh.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_MeshCopier.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_MeshWrapper.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_MeshWrapper.inl
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_Polygon.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_SplitFunction.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_TreeQueries.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_Triangulate.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\CSG_Vertex.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\MT_Line3.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\intern\MT_Line3.h
-# End Source File
-# End Target
-# End Project
diff --git a/intern/csg/make/msvc60/csg.dsw b/intern/csg/make/msvc60/csg.dsw
deleted file mode 100644
index 7f9bd29b97a..00000000000
--- a/intern/csg/make/msvc60/csg.dsw
+++ /dev/null
@@ -1,29 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "csg"=.\csg.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/intern/elbeem/extern/elbeem.h b/intern/elbeem/extern/elbeem.h
index b3feda8bbe8..2a594dd07e6 100644
--- a/intern/elbeem/extern/elbeem.h
+++ b/intern/elbeem/extern/elbeem.h
@@ -154,7 +154,7 @@ typedef struct elbeemMesh {
short volumeInitType;
/* name of the mesh, mostly for debugging */
- char *name;
+ const char *name;
} elbeemMesh;
// API functions
diff --git a/intern/elbeem/intern/attributes.cpp b/intern/elbeem/intern/attributes.cpp
index 890d6e75c9e..464486f2500 100644
--- a/intern/elbeem/intern/attributes.cpp
+++ b/intern/elbeem/intern/attributes.cpp
@@ -103,6 +103,7 @@ void AttributeList::readMat4Gfx(string name, ntlMat4Gfx defaultValue, string sou
// set that a parameter can be given, and will be ignored...
bool AttributeList::ignoreParameter(string name, string source) {
+ name = source = ("");
return false;
}
diff --git a/intern/elbeem/intern/elbeem.h b/intern/elbeem/intern/elbeem.h
index b3feda8bbe8..2a594dd07e6 100644
--- a/intern/elbeem/intern/elbeem.h
+++ b/intern/elbeem/intern/elbeem.h
@@ -154,7 +154,7 @@ typedef struct elbeemMesh {
short volumeInitType;
/* name of the mesh, mostly for debugging */
- char *name;
+ const char *name;
} elbeemMesh;
// API functions
diff --git a/intern/elbeem/intern/isosurface.cpp b/intern/elbeem/intern/isosurface.cpp
index 9646e8581da..9925565b85d 100644
--- a/intern/elbeem/intern/isosurface.cpp
+++ b/intern/elbeem/intern/isosurface.cpp
@@ -13,11 +13,6 @@
#include <algorithm>
#include <stdio.h>
-// sirdude fix for solaris
-#if !defined(linux) && (defined (__sparc) || defined (__sparc__))
-#include <ieeefp.h>
-#endif
-
// just use default rounding for platforms where its not available
#ifndef round
#define round(x) (x)
diff --git a/intern/elbeem/intern/loop_tools.h b/intern/elbeem/intern/loop_tools.h
index 3c15a609210..70ecb9ce3e0 100644
--- a/intern/elbeem/intern/loop_tools.h
+++ b/intern/elbeem/intern/loop_tools.h
@@ -54,15 +54,84 @@
-#define unused_GRID_REGION_END() \
- } /* main_region */ \
- // end unusedGRID_REGION_END
-
// -----------------------------------------------------------------------------------
#else // PARALLEL==1
-#include "paraloop.h"
+//#include "paraloop.h"
+#define PERFORM_USQRMAXCHECK USQRMAXCHECK(usqr,ux,uy,uz, calcMaxVlen, calcMxvx,calcMxvy,calcMxvz);
+#define LIST_EMPTY(x) calcListEmpty.push_back( x );
+#define LIST_FULL(x) calcListFull.push_back( x );
+#define FSGR_ADDPART(x) calcListParts.push_back( x );
+
+
+// parallel region
+//was: # pragma omp parallel default(shared)
+#if COMPRESSGRIDS!=1
+ // requires compressed grids...!
+ ERROR!
+#endif
+
+// loop start
+#define GRID_REGION_START() \
+ { \
+ \
+ \
+ if(mSizez<2) { \
+ mPanic = 1; \
+ errFatal("ParaLoop::2D","Not valid...!", SIMWORLD_GENERICERROR); \
+ } \
+ \
+ \
+ vector<LbmPoint> calcListFull; \
+ vector<LbmPoint> calcListEmpty; \
+ vector<ParticleObject> calcListParts; \
+ LbmFloat calcMxvx, calcMxvy, calcMxvz, calcMaxVlen; \
+ calcMxvx = calcMxvy = calcMxvz = calcMaxVlen = 0.0; \
+ calcListEmpty.reserve(mListEmpty.capacity() / omp_get_num_threads() ); \
+ calcListFull.reserve( mListFull.capacity() / omp_get_num_threads() ); \
+ calcListParts.reserve(mSizex); \
+ \
+ \
+ const int id = omp_get_thread_num(); \
+ const int Nthrds = omp_get_num_threads(); \
+ \
+ \
+ \
+ \
+ \
+ int kdir = 1; \
+ \
+ int kstart=getForZMinBnd(), kend=getForZMaxBnd(mMaxRefine); \
+ if(gridLoopBound>0){ kstart=getForZMin1(); kend=getForZMax1(mMaxRefine); } \
+ LbmFloat *ccel = NULL, *tcel = NULL; \
+ CellFlagType *pFlagSrc=NULL, *pFlagDst=NULL; \
+ \
+ \
+ if(mLevel[mMaxRefine].setCurr==1) { \
+ kdir = -1; \
+ int temp = kend; \
+ kend = kstart-1; \
+ kstart = temp-1; \
+ } \
+ \
+ const int Nj = mLevel[mMaxRefine].lSizey; \
+ int jstart = 0+( id * (Nj / Nthrds) ); \
+ int jend = 0+( (id+1) * (Nj / Nthrds) ); \
+ if( ((Nj/Nthrds) *Nthrds) != Nj) { \
+ errMsg("LbmFsgrSolver","Invalid domain size Nj="<<Nj<<" Nthrds="<<Nthrds); \
+ } \
+ \
+ if(jstart<gridLoopBound) jstart = gridLoopBound; \
+ if(jend>mLevel[mMaxRefine].lSizey-gridLoopBound) jend = mLevel[mMaxRefine].lSizey-gridLoopBound; \
+ \
+ debMsgStd("ParaLoop::OMP",DM_MSG,"Thread:"<<id<<" i:"<<istart<<"-"<<iend<<" j:"<<jstart<<"-"<<jend<<", k:"<<kstart<<"-"<<kend<<" ", 1); \
+ \
+
+
+
+
+// para GRID LOOP END is parainc3
#endif // PARALLEL==1
@@ -101,9 +170,11 @@
+
// old loop for COMPRESSGRIDS==0
#define old__GRID_LOOP_START() \
for(int k=kstart;k<kend;++k) { \
for(int j=1;j<mLevel[lev].lSizey-1;++j) { \
for(int i=0;i<mLevel[lev].lSizex-2; ) {
+
diff --git a/intern/elbeem/intern/ntl_geometryobject.cpp b/intern/elbeem/intern/ntl_geometryobject.cpp
index bc004b656f5..f2ebd572682 100644
--- a/intern/elbeem/intern/ntl_geometryobject.cpp
+++ b/intern/elbeem/intern/ntl_geometryobject.cpp
@@ -83,7 +83,7 @@ bool ntlGeometryObject::checkIsAnimated() {
/* Init attributes etc. of this object */
/*****************************************************************************/
#define GEOINIT_STRINGS 9
-static char *initStringStrs[GEOINIT_STRINGS] = {
+static const char *initStringStrs[GEOINIT_STRINGS] = {
"fluid",
"bnd_no","bnd_noslip",
"bnd_free","bnd_freeslip",
diff --git a/intern/elbeem/intern/ntl_vector3dim.h b/intern/elbeem/intern/ntl_vector3dim.h
index d6a7557f69d..27c3be0d71f 100644
--- a/intern/elbeem/intern/ntl_vector3dim.h
+++ b/intern/elbeem/intern/ntl_vector3dim.h
@@ -22,6 +22,7 @@
#include <math.h>
#include <string.h>
#include <stdio.h>
+#include <stdlib.h>
// hack for MSVC6.0 compiler
#ifdef _MSC_VER
@@ -202,7 +203,7 @@ private:
//! global string for formatting vector output in utilities.cpp
-extern char *globVecFormatStr;
+extern const char *globVecFormatStr;
/*************************************************************************
Outputs the object in human readable form using the format
diff --git a/intern/elbeem/intern/paraloopend.h b/intern/elbeem/intern/paraloopend.h
new file mode 100644
index 00000000000..6bb224b625a
--- /dev/null
+++ b/intern/elbeem/intern/paraloopend.h
@@ -0,0 +1,42 @@
+
+// same as grid loop_end + barrier
+
+ } // i
+ int i=0; //dummy
+ ADVANCE_POINTERS(2*gridLoopBound);
+ } // j
+
+# if COMPRESSGRIDS==1
+# if PARALLEL==1
+ //frintf(stderr," (id=%d k=%d) ",id,k);
+#pragma omp barrier
+# endif // PARALLEL==1
+# else // COMPRESSGRIDS==1
+ int i=0; //dummy
+ ADVANCE_POINTERS(mLevel[lev].lSizex*2);
+# endif // COMPRESSGRIDS==1
+
+} // all cell loop k,j,i
+
+#pragma omp critical
+{
+ if(doReduce) {
+ // synchronize global vars
+ for(int j=0; j<calcListFull.size() ; j++) mListFull.push_back( calcListFull[j] );
+ for(int j=0; j<calcListEmpty.size(); j++) mListEmpty.push_back( calcListEmpty[j] );
+ for(int j=0; j<calcListParts.size(); j++) mpParticles->addFullParticle( calcListParts[j] );
+ if(calcMaxVlen>mMaxVlen) {
+ mMxvx = calcMxvx;
+ mMxvy = calcMxvy;
+ mMxvz = calcMxvz;
+ mMaxVlen = calcMaxVlen;
+ }
+ if(0) {debMsgStd("OMP_CRIT",DM_MSG, "reduce id"<<id<<" curr: "<<mMaxVlen<<"|"<<mMxvx<<","<<mMxvy<<","<<mMxvz<<
+ " calc[ "<<calcMaxVlen<<"|"<<calcMxvx<<","<<calcMxvy<<","<<calcMxvz<<"] " ,4 ); }
+ }
+} // critical
+
+
+} /* main_region */
+ //?lobOutstrForce = true;
+
diff --git a/intern/elbeem/intern/parametrizer.cpp b/intern/elbeem/intern/parametrizer.cpp
index 0bbdc2ee363..dca0b48d265 100644
--- a/intern/elbeem/intern/parametrizer.cpp
+++ b/intern/elbeem/intern/parametrizer.cpp
@@ -14,7 +14,7 @@
#define DEBUG_PARAMCHANNELS 0
/*! param seen debug string array */
-char *ParamStrings[] = {
+const char *ParamStrings[] = {
"RelaxTime",
"Reynolds",
"Viscosity",
diff --git a/intern/elbeem/intern/particletracer.cpp b/intern/elbeem/intern/particletracer.cpp
index c537a893c27..819fcdd0b9a 100644
--- a/intern/elbeem/intern/particletracer.cpp
+++ b/intern/elbeem/intern/particletracer.cpp
@@ -325,6 +325,7 @@ void ParticleTracer::getTriangles(double time, vector<ntlTriangle> *triangles,
// suppress warnings...
vertices = NULL; triangles = NULL;
normals = NULL; objectId = 0;
+ time = 0.;
#else // ELBEEM_PLUGIN
int pcnt = 0;
// currently not used in blender
diff --git a/intern/elbeem/intern/simulation_object.cpp b/intern/elbeem/intern/simulation_object.cpp
index 19bdb119681..9b47ae696af 100644
--- a/intern/elbeem/intern/simulation_object.cpp
+++ b/intern/elbeem/intern/simulation_object.cpp
@@ -68,6 +68,7 @@ SimulationObject::~SimulationObject()
/*! init tree for certain geometry init */
/*****************************************************************************/
void SimulationObject::initGeoTree() {
+ // unused!! overriden by solver interface
if(mpGlob == NULL) {
errFatal("SimulationObject::initGeoTree error","Requires globals!", SIMWORLD_INITERROR);
return;
@@ -79,7 +80,7 @@ void SimulationObject::initGeoTree() {
char treeFlag = (1<<(mGeoInitId+4));
mpGiTree = new ntlTree( 20, 4, // warning - fixed values for depth & maxtriangles here...
scene, treeFlag );
- exit(1); // unused!? overriden by solver interface
+ // unused!! overriden by solver interface
}
/*****************************************************************************/
@@ -309,7 +310,7 @@ void SimulationObject::step( void )
// dont advance for stopped time
mpLbm->step();
mTime += mpParam->getTimestep();
-//if(mTime>0.001) { errMsg("DEBUG!!!!!!!!","quit mlsu..."); exit(1); } // PROFILE DEBUG TEST!
+ //if(mTime>0.001) { errMsg("DEBUG!!!!!!!!","quit mlsu..."); xit(1); } // PROFILE DEBUG TEST!
}
if(mpLbm->getPanic()) mPanic = true;
diff --git a/intern/elbeem/intern/solver_class.h b/intern/elbeem/intern/solver_class.h
index e6b1ad4ed53..d46f065adfd 100644
--- a/intern/elbeem/intern/solver_class.h
+++ b/intern/elbeem/intern/solver_class.h
@@ -99,10 +99,9 @@
#define LBM_INLINED inline
// sirdude fix for solaris
-#if !defined(linux) && (defined (__sparc) || defined (__sparc__))
-#include <ieeefp.h>
+#if !defined(linux) && defined(sun)
#ifndef expf
-#define expf exp
+#define expf(x) exp((double)(x))
#endif
#endif
diff --git a/intern/elbeem/intern/solver_init.cpp b/intern/elbeem/intern/solver_init.cpp
index abec4a89c89..c953d2f47da 100644
--- a/intern/elbeem/intern/solver_init.cpp
+++ b/intern/elbeem/intern/solver_init.cpp
@@ -655,6 +655,7 @@ bool LbmFsgrSolver::initializeSolverMemory()
int orgSz = mSizez;
double sizeReduction = 1.0;
double memEstFromFunc = -1.0;
+ double memEstFine = -1.0;
string memreqStr("");
bool firstMInit = true;
int minitTries=0;
@@ -672,7 +673,7 @@ bool LbmFsgrSolver::initializeSolverMemory()
firstMInit=false;
calculateMemreqEstimate( mSizex, mSizey, mSizez,
- mMaxRefine, mFarFieldSize, &memEstFromFunc, &memreqStr );
+ mMaxRefine, mFarFieldSize, &memEstFromFunc, &memEstFine, &memreqStr );
double memLimit;
string memLimStr("-");
@@ -685,13 +686,36 @@ bool LbmFsgrSolver::initializeSolverMemory()
memLimit = 16.0* 1024.0*1024.0*1024.0;
memLimStr = string("16GB");
}
- if(memEstFromFunc>memLimit) {
+
+ // restrict max. chunk of 1 mem block to 1GB for windos
+ bool memBlockAllocProblem = false;
+ double maxWinMemChunk = 1100.*1024.*1024.;
+ double maxMacMemChunk = 1200.*1024.*1024.;
+ double maxDefaultMemChunk = 2.*1024.*1024.*1024.;
+ //std::cerr<<" memEstFine "<< memEstFine <<" maxWin:" <<maxWinMemChunk <<" maxMac:" <<maxMacMemChunk ; // DEBUG
+#ifdef WIN32
+ if(memEstFine> maxWinMemChunk) {
+ memBlockAllocProblem = true;
+ }
+#endif // WIN32
+#ifdef __APPLE__
+ if(memEstFine> maxMacMemChunk) {
+ memBlockAllocProblem = true;
+ }
+#endif // Mac
+ if(sizeof(void *)==4 && memEstFine>maxDefaultMemChunk) {
+ // max memory chunk for 32bit systems 2gig
+ memBlockAllocProblem = true;
+ }
+
+ if(memEstFromFunc>memLimit || memBlockAllocProblem) {
sizeReduction *= 0.9;
mSizex = (int)(orgSx * sizeReduction);
mSizey = (int)(orgSy * sizeReduction);
mSizez = (int)(orgSz * sizeReduction);
debMsgStd("LbmFsgrSolver::initialize",DM_WARNING,"initGridSizes: memory limit exceeded "<<
//memEstFromFunc<<"/"<<memLimit<<", "<<
+ //memEstFine<<"/"<<maxWinMemChunk<<", "<<
memreqStr<<"/"<<memLimStr<<", "<<
"retrying: "<<PRINT_VEC(mSizex,mSizey,mSizez)<<" org:"<<PRINT_VEC(orgSx,orgSy,orgSz)
, 3 );
@@ -778,10 +802,6 @@ bool LbmFsgrSolver::initializeSolverMemory()
mLevel[ mMaxRefine ].simCellSize = mpParam->getCellSize();
mLevel[ mMaxRefine ].lcellfactor = 1.0;
LONGINT rcellSize = ((mLevel[mMaxRefine].lSizex*mLevel[mMaxRefine].lSizey*mLevel[mMaxRefine].lSizez) *dTotalNum);
- // +4 for safety ?
- mLevel[ mMaxRefine ].mprsFlags[0] = new CellFlagType[ rcellSize/dTotalNum +4 ];
- mLevel[ mMaxRefine ].mprsFlags[1] = new CellFlagType[ rcellSize/dTotalNum +4 ];
- ownMemCheck += 2 * sizeof(CellFlagType) * (rcellSize/dTotalNum +4);
#if COMPRESSGRIDS==0
mLevel[ mMaxRefine ].mprsCells[0] = new LbmFloat[ rcellSize +4 ];
@@ -789,11 +809,34 @@ bool LbmFsgrSolver::initializeSolverMemory()
ownMemCheck += 2 * sizeof(LbmFloat) * (rcellSize+4);
#else // COMPRESSGRIDS==0
LONGINT compressOffset = (mLevel[mMaxRefine].lSizex*mLevel[mMaxRefine].lSizey*dTotalNum*2);
+ // D int tmp = ( (rcellSize +compressOffset +4)/(1024*1024) )*4;
+ // D printf("Debug MEMMMM excee: %d\n", tmp);
mLevel[ mMaxRefine ].mprsCells[1] = new LbmFloat[ rcellSize +compressOffset +4 ];
mLevel[ mMaxRefine ].mprsCells[0] = mLevel[ mMaxRefine ].mprsCells[1]+compressOffset;
ownMemCheck += sizeof(LbmFloat) * (rcellSize +compressOffset +4);
#endif // COMPRESSGRIDS==0
+ if(!mLevel[ mMaxRefine ].mprsCells[1] || !mLevel[ mMaxRefine ].mprsCells[0]) {
+ errFatal("LbmFsgrSolver::initialize","Fatal: Couldnt allocate memory (1)! Aborting...",SIMWORLD_INITERROR);
+ return false;
+ }
+
+ // +4 for safety ?
+ mLevel[ mMaxRefine ].mprsFlags[0] = new CellFlagType[ rcellSize/dTotalNum +4 ];
+ mLevel[ mMaxRefine ].mprsFlags[1] = new CellFlagType[ rcellSize/dTotalNum +4 ];
+ ownMemCheck += 2 * sizeof(CellFlagType) * (rcellSize/dTotalNum +4);
+ if(!mLevel[ mMaxRefine ].mprsFlags[1] || !mLevel[ mMaxRefine ].mprsFlags[0]) {
+ errFatal("LbmFsgrSolver::initialize","Fatal: Couldnt allocate memory (2)! Aborting...",SIMWORLD_INITERROR);
+
+#if COMPRESSGRIDS==0
+ delete[] mLevel[ mMaxRefine ].mprsCells[0];
+ delete[] mLevel[ mMaxRefine ].mprsCells[1];
+#else // COMPRESSGRIDS==0
+ delete[] mLevel[ mMaxRefine ].mprsCells[1];
+#endif // COMPRESSGRIDS==0
+ return false;
+ }
+
LbmFloat lcfdimFac = 8.0;
if(LBMDIM==2) lcfdimFac = 4.0;
for(int i=mMaxRefine-1; i>=0; i--) {
diff --git a/intern/elbeem/intern/solver_interface.cpp b/intern/elbeem/intern/solver_interface.cpp
index 8dcfa495b95..d25850a003b 100644
--- a/intern/elbeem/intern/solver_interface.cpp
+++ b/intern/elbeem/intern/solver_interface.cpp
@@ -141,7 +141,7 @@ void initGridSizes(int &sizex, int &sizey, int &sizez,
void calculateMemreqEstimate( int resx,int resy,int resz,
int refine, float farfield,
- double *reqret, string *reqstr) {
+ double *reqret, double *reqretFine, string *reqstr) {
// debug estimation?
const bool debugMemEst = true;
// COMPRESSGRIDS define is not available here, make sure it matches
@@ -149,6 +149,7 @@ void calculateMemreqEstimate( int resx,int resy,int resz,
// make sure we can handle bid numbers here... all double
double memCnt = 0.0;
double ddTotalNum = (double)dTotalNum;
+ if(reqretFine) *reqretFine = -1.;
double currResx = (double)resx;
double currResy = (double)resy;
@@ -158,10 +159,12 @@ void calculateMemreqEstimate( int resx,int resy,int resz,
if(debugMemEst) debMsgStd("calculateMemreqEstimate",DM_MSG,"res:"<<PRINT_VEC(currResx,currResy,currResz)<<" rcellSize:"<<rcellSize<<" mc:"<<memCnt, 10);
if(!useGridComp) {
memCnt += (double)(sizeof(LbmFloat) * (rcellSize +4.0) *2.0);
+ if(reqretFine) *reqretFine = (double)(sizeof(LbmFloat) * (rcellSize +4.0) *2.0);
if(debugMemEst) debMsgStd("calculateMemreqEstimate",DM_MSG," no-comp, mc:"<<memCnt, 10);
} else {
double compressOffset = (double)(currResx*currResy*ddTotalNum*2.0);
memCnt += (double)(sizeof(LbmFloat) * (rcellSize+compressOffset +4.0));
+ if(reqretFine) *reqretFine = (double)(sizeof(LbmFloat) * (rcellSize+compressOffset +4.0));
if(debugMemEst) debMsgStd("calculateMemreqEstimate",DM_MSG," w-comp, mc:"<<memCnt, 10);
}
for(int i=refine-1; i>=0; i--) {
@@ -186,7 +189,7 @@ void calculateMemreqEstimate( int resx,int resy,int resz,
// cpdata init check missing...
double memd = memCnt;
- char *sizeStr = "";
+ const char *sizeStr = "";
const double sfac = 1024.0;
if(memd>sfac){ memd /= sfac; sizeStr="KB"; }
if(memd>sfac){ memd /= sfac; sizeStr="MB"; }
diff --git a/intern/elbeem/intern/solver_interface.h b/intern/elbeem/intern/solver_interface.h
index 1dfdf156ee5..c3dc4983cac 100644
--- a/intern/elbeem/intern/solver_interface.h
+++ b/intern/elbeem/intern/solver_interface.h
@@ -21,7 +21,7 @@
#if LBM_USE_GUI==1
#define USE_GLUTILITIES
// for debug display
-#include <GL/gl.h>
+//#include <GL/gl.h>
#include "../gui/guifuncs.h"
#endif
@@ -596,8 +596,10 @@ class LbmSolverInterface
void initGridSizes(int &mSizex, int &mSizey, int &mSizez,
ntlVec3Gfx &mvGeoStart, ntlVec3Gfx &mvGeoEnd,
int mMaxRefine, bool parallel);
+// return the amount of memory required in total (reqret)
+// and for the finest grid only (reqretFine, can be NULL)
void calculateMemreqEstimate(int resx,int resy,int resz, int refine,
- float farfieldsize, double *reqret, string *reqstr);
+ float farfieldsize, double *reqret, double *reqretFine, string *reqstr);
//! helper function to convert flag to string (for debuggin)
string convertCellFlagType2String( CellFlagType flag );
diff --git a/intern/elbeem/intern/solver_main.cpp b/intern/elbeem/intern/solver_main.cpp
index bced75ab444..afc883972e2 100644
--- a/intern/elbeem/intern/solver_main.cpp
+++ b/intern/elbeem/intern/solver_main.cpp
@@ -11,6 +11,7 @@
#include "solver_relax.h"
#include "particletracer.h"
#include "loop_tools.h"
+#include <stdlib.h>
/*****************************************************************************/
/*! perform a single LBM step */
@@ -374,7 +375,11 @@ LbmFsgrSolver::mainLoop(int lev)
const int gridLoopBound=1;
GRID_REGION_INIT();
#if PARALLEL==1
-#include "paraloopstart.h"
+#pragma omp parallel default(shared) \
+ reduction(+: \
+ calcCurrentMass,calcCurrentVolume, \
+ calcCellsFilled,calcCellsEmptied, \
+ calcNumUsedCells )
GRID_REGION_START();
#else // PARALLEL==1
GRID_REGION_START();
@@ -1111,7 +1116,11 @@ LbmFsgrSolver::preinitGrids()
GRID_REGION_INIT();
#if PARALLEL==1
-#include "paraloopstart.h"
+#pragma omp parallel default(shared) \
+ reduction(+: \
+ calcCurrentMass,calcCurrentVolume, \
+ calcCellsFilled,calcCellsEmptied, \
+ calcNumUsedCells )
#endif // PARALLEL==1
GRID_REGION_START();
GRID_LOOP_START();
@@ -1144,7 +1153,11 @@ LbmFsgrSolver::standingFluidPreinit()
GRID_REGION_INIT();
#if PARALLEL==1
-#include "paraloopstart.h"
+#pragma omp parallel default(shared) \
+ reduction(+: \
+ calcCurrentMass,calcCurrentVolume, \
+ calcCellsFilled,calcCellsEmptied, \
+ calcNumUsedCells )
#endif // PARALLEL==1
GRID_REGION_START();
diff --git a/intern/elbeem/intern/solver_util.cpp b/intern/elbeem/intern/solver_util.cpp
index 43be8af46df..a6685babe68 100644
--- a/intern/elbeem/intern/solver_util.cpp
+++ b/intern/elbeem/intern/solver_util.cpp
@@ -15,6 +15,7 @@
#include "ntl_world.h"
#include "simulation_object.h"
+#include <stdlib.h>
#include <zlib.h>
#ifndef sqrtf
#define sqrtf sqrt
diff --git a/intern/elbeem/intern/utilities.cpp b/intern/elbeem/intern/utilities.cpp
index ad827efa2fc..551c4d0d384 100644
--- a/intern/elbeem/intern/utilities.cpp
+++ b/intern/elbeem/intern/utilities.cpp
@@ -55,7 +55,7 @@ int isSimworldOk(void) {
char gElbeemErrorString[256] = {'-','\0' };
// access elbeem simulator error string
-void setElbeemErrorString(char* set) {
+void setElbeemErrorString(const char* set) {
strncpy(gElbeemErrorString, set, 256);
}
char* getElbeemErrorString(void) { return gElbeemErrorString; }
@@ -76,7 +76,7 @@ int globalFirstEnvCheck = 0;
void resetGlobalColorSetting() { globalColorSetting = DEF_globalColorSetting; }
// global string for formatting vector output, TODO test!?
-char *globVecFormatStr = "V[%f,%f,%f]";
+const char *globVecFormatStr = "V[%f,%f,%f]";
// global mp on/off switch
@@ -481,7 +481,7 @@ double elbeemEstimateMemreq(int res,
double memreq = -1.0;
string memreqStr("");
// ignore farfield for now...
- calculateMemreqEstimate(resx,resy,resz, refine, 0., &memreq, &memreqStr );
+ calculateMemreqEstimate(resx,resy,resz, refine, 0., &memreq, NULL, &memreqStr );
if(retstr) {
// copy at max. 32 characters
diff --git a/intern/elbeem/intern/utilities.h b/intern/elbeem/intern/utilities.h
index 4d887c3f99b..825e92251fe 100644
--- a/intern/elbeem/intern/utilities.h
+++ b/intern/elbeem/intern/utilities.h
@@ -45,7 +45,7 @@ int getElbeemState(void);
int isSimworldOk(void);
// access elbeem simulator error string
-void setElbeemErrorString(char* set);
+void setElbeemErrorString(const char* set);
char* getElbeemErrorString(void);
diff --git a/intern/ghost/doc/ghost_interface.cfg b/intern/ghost/doc/ghost_interface.cfg
index ebe4153ea3b..ebe4153ea3b 100755..100644
--- a/intern/ghost/doc/ghost_interface.cfg
+++ b/intern/ghost/doc/ghost_interface.cfg
diff --git a/intern/ghost/intern/GHOST_DisplayManager.cpp b/intern/ghost/intern/GHOST_DisplayManager.cpp
index b36143ee1a9..f806daee86b 100644
--- a/intern/ghost/intern/GHOST_DisplayManager.cpp
+++ b/intern/ghost/intern/GHOST_DisplayManager.cpp
@@ -116,7 +116,7 @@ GHOST_DisplayManager::getDisplaySetting(
GHOST_TUns8 numDisplays;
success = getNumDisplays(numDisplays);
if (success == GHOST_kSuccess) {
- if (display < numDisplays && index < m_settings[display].size()) {
+ if (display < numDisplays && ((GHOST_TUns8)index < m_settings[display].size())) {
setting = m_settings[display][index];
}
else {
diff --git a/intern/ghost/intern/GHOST_DisplayManagerX11.cpp b/intern/ghost/intern/GHOST_DisplayManagerX11.cpp
index 9695e24e737..9695e24e737 100755..100644
--- a/intern/ghost/intern/GHOST_DisplayManagerX11.cpp
+++ b/intern/ghost/intern/GHOST_DisplayManagerX11.cpp
diff --git a/intern/ghost/intern/GHOST_DisplayManagerX11.h b/intern/ghost/intern/GHOST_DisplayManagerX11.h
index 18226a25e74..18226a25e74 100755..100644
--- a/intern/ghost/intern/GHOST_DisplayManagerX11.h
+++ b/intern/ghost/intern/GHOST_DisplayManagerX11.h
diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp
index ec6d0d355b5..835f7da3038 100644
--- a/intern/ghost/intern/GHOST_SystemWin32.cpp
+++ b/intern/ghost/intern/GHOST_SystemWin32.cpp
@@ -54,7 +54,7 @@
#define WM_MOUSEWHEEL 0x020A
#endif // WM_MOUSEWHEEL
#ifndef WHEEL_DELTA
-#define WHEEL_DELTA 120 /* Value for rolling one detent */
+#define WHEEL_DELTA 120 /* Value for rolling one detent, (old convention! MS changed it) */
#endif // WHEEL_DELTA
@@ -479,7 +479,11 @@ GHOST_EventWheel* GHOST_SystemWin32::processWheelEvent(GHOST_IWindow *window, WP
{
// short fwKeys = LOWORD(wParam); // key flags
int zDelta = (short) HIWORD(wParam); // wheel rotation
- zDelta /= WHEEL_DELTA;
+
+ // zDelta /= WHEEL_DELTA;
+ // temporary fix below: microsoft now has added more precision, making the above division not work
+ if (zDelta <= 0 ) zDelta= -1; else zDelta= 1;
+
// short xPos = (short) LOWORD(lParam); // horizontal position of pointer
// short yPos = (short) HIWORD(lParam); // vertical position of pointer
return new GHOST_EventWheel (getSystem()->getMilliSeconds(), window, zDelta);
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index 14383ad3624..14383ad3624 100755..100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
diff --git a/intern/ghost/intern/GHOST_SystemX11.h b/intern/ghost/intern/GHOST_SystemX11.h
index c8d8d73404a..c8d8d73404a 100755..100644
--- a/intern/ghost/intern/GHOST_SystemX11.h
+++ b/intern/ghost/intern/GHOST_SystemX11.h
diff --git a/intern/ghost/intern/GHOST_WindowX11.cpp b/intern/ghost/intern/GHOST_WindowX11.cpp
index 056b5756587..30fa30e59e6 100755..100644
--- a/intern/ghost/intern/GHOST_WindowX11.cpp
+++ b/intern/ghost/intern/GHOST_WindowX11.cpp
@@ -38,6 +38,11 @@
#include <X11/cursorfont.h>
#include <X11/Xatom.h>
+#if defined(__sun__) || defined( __sun ) || defined (__sparc) || defined (__sparc__)
+#include <strings.h>
+#endif
+
+
// For obscure full screen mode stuuf
// lifted verbatim from blut.
@@ -168,6 +173,7 @@ GHOST_WindowX11(
if (m_visual == NULL) {
// barf : no visual meeting these requirements could be found.
+ printf("%s:%d: X11 glxChooseVisual() failed for OpenGL, verify working openGL system!\n", __FILE__, __LINE__);
return;
}
diff --git a/intern/ghost/intern/GHOST_WindowX11.h b/intern/ghost/intern/GHOST_WindowX11.h
index 0de4f65acd1..0de4f65acd1 100755..100644
--- a/intern/ghost/intern/GHOST_WindowX11.h
+++ b/intern/ghost/intern/GHOST_WindowX11.h
diff --git a/intern/ghost/test/Makefile b/intern/ghost/test/Makefile
index ded21c32cc6..ded21c32cc6 100755..100644
--- a/intern/ghost/test/Makefile
+++ b/intern/ghost/test/Makefile
diff --git a/intern/ghost/test/gears/GHOST_Test.cpp b/intern/ghost/test/gears/GHOST_Test.cpp
index 3abdd3977eb..3abdd3977eb 100755..100644
--- a/intern/ghost/test/gears/GHOST_Test.cpp
+++ b/intern/ghost/test/gears/GHOST_Test.cpp
diff --git a/intern/ghost/test/gears/Makefile b/intern/ghost/test/gears/Makefile
index b7966b4d157..b7966b4d157 100755..100644
--- a/intern/ghost/test/gears/Makefile
+++ b/intern/ghost/test/gears/Makefile
diff --git a/intern/ghost/test/multitest/MultiTest.c b/intern/ghost/test/multitest/MultiTest.c
index e81fb3c034e..e81fb3c034e 100755..100644
--- a/intern/ghost/test/multitest/MultiTest.c
+++ b/intern/ghost/test/multitest/MultiTest.c
diff --git a/intern/iksolver/extern/IK_solver.h b/intern/iksolver/extern/IK_solver.h
index 8626ca22beb..bf53a9e3724 100644
--- a/intern/iksolver/extern/IK_solver.h
+++ b/intern/iksolver/extern/IK_solver.h
@@ -158,6 +158,8 @@ void IK_FreeSolver(IK_Solver *solver);
void IK_SolverAddGoal(IK_Solver *solver, IK_Segment *tip, float goal[3], float weight);
void IK_SolverAddGoalOrientation(IK_Solver *solver, IK_Segment *tip, float goal[][3], float weight);
+void IK_SolverSetPoleVectorConstraint(IK_Solver *solver, IK_Segment *tip, float goal[3], float polegoal[3], float poleangle, int getangle);
+float IK_SolverGetPoleAngle(IK_Solver *solver);
int IK_Solve(IK_Solver *solver, float tolerance, int max_iterations);
diff --git a/intern/iksolver/intern/IK_QJacobian.cpp b/intern/iksolver/intern/IK_QJacobian.cpp
index 03c5f9500be..1dd4d086aa8 100644
--- a/intern/iksolver/intern/IK_QJacobian.cpp
+++ b/intern/iksolver/intern/IK_QJacobian.cpp
@@ -42,11 +42,10 @@ IK_QJacobian::~IK_QJacobian()
{
}
-void IK_QJacobian::ArmMatrices(int dof, int task_size, int tasks)
+void IK_QJacobian::ArmMatrices(int dof, int task_size)
{
m_dof = dof;
m_task_size = task_size;
- m_tasks = tasks;
m_jacobian.newsize(task_size, dof);
m_jacobian = 0;
diff --git a/intern/iksolver/intern/IK_QJacobian.h b/intern/iksolver/intern/IK_QJacobian.h
index b80db1d8f53..3e20e4a9fd0 100644
--- a/intern/iksolver/intern/IK_QJacobian.h
+++ b/intern/iksolver/intern/IK_QJacobian.h
@@ -49,7 +49,7 @@ public:
~IK_QJacobian();
// Call once to initialize
- void ArmMatrices(int dof, int task_size, int tasks);
+ void ArmMatrices(int dof, int task_size);
void SetDoFWeight(int dof, MT_Scalar weight);
// Iteratively called
@@ -75,7 +75,7 @@ private:
void InvertSDLS();
void InvertDLS();
- int m_dof, m_task_size, m_tasks;
+ int m_dof, m_task_size;
bool m_transpose;
// the jacobian matrix and it's null space projector
diff --git a/intern/iksolver/intern/IK_QJacobianSolver.cpp b/intern/iksolver/intern/IK_QJacobianSolver.cpp
index 7cfdcccc2ad..17750a7195f 100644
--- a/intern/iksolver/intern/IK_QJacobianSolver.cpp
+++ b/intern/iksolver/intern/IK_QJacobianSolver.cpp
@@ -30,9 +30,47 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+#include <stdio.h>
#include "IK_QJacobianSolver.h"
+#include "MT_Quaternion.h"
//#include "analyze.h"
+IK_QJacobianSolver::IK_QJacobianSolver()
+{
+ m_poleconstraint = false;
+ m_getpoleangle = false;
+ m_rootmatrix.setIdentity();
+}
+
+MT_Scalar IK_QJacobianSolver::ComputeScale()
+{
+ std::vector<IK_QSegment*>::iterator seg;
+ float length = 0.0f;
+
+ for (seg = m_segments.begin(); seg != m_segments.end(); seg++)
+ length += (*seg)->MaxExtension();
+
+ if(length == 0.0f)
+ return 1.0f;
+ else
+ return 1.0f/length;
+}
+
+void IK_QJacobianSolver::Scale(float scale, std::list<IK_QTask*>& tasks)
+{
+ std::list<IK_QTask*>::iterator task;
+ std::vector<IK_QSegment*>::iterator seg;
+
+ for (task = tasks.begin(); task != tasks.end(); task++)
+ (*task)->Scale(scale);
+
+ for (seg = m_segments.begin(); seg != m_segments.end(); seg++)
+ (*seg)->Scale(scale);
+
+ m_rootmatrix.getOrigin() *= scale;
+ m_goal *= scale;
+ m_polegoal *= scale;
+}
void IK_QJacobianSolver::AddSegmentList(IK_QSegment *seg)
{
@@ -48,7 +86,7 @@ bool IK_QJacobianSolver::Setup(IK_QSegment *root, std::list<IK_QTask*>& tasks)
m_segments.clear();
AddSegmentList(root);
- // assing each segment a unique id for the jacobian
+ // assign each segment a unique id for the jacobian
std::vector<IK_QSegment*>::iterator seg;
int num_dof = 0;
@@ -106,9 +144,9 @@ bool IK_QJacobianSolver::Setup(IK_QSegment *root, std::list<IK_QTask*>& tasks)
}
// set matrix sizes
- m_jacobian.ArmMatrices(num_dof, primary_size, primary);
+ m_jacobian.ArmMatrices(num_dof, primary_size);
if (secondary > 0)
- m_jacobian_sub.ArmMatrices(num_dof, secondary_size, secondary);
+ m_jacobian_sub.ArmMatrices(num_dof, secondary_size);
// set dof weights
int i;
@@ -120,6 +158,109 @@ bool IK_QJacobianSolver::Setup(IK_QSegment *root, std::list<IK_QTask*>& tasks)
return true;
}
+void IK_QJacobianSolver::SetPoleVectorConstraint(IK_QSegment *tip, MT_Vector3& goal, MT_Vector3& polegoal, float poleangle, bool getangle)
+{
+ m_poleconstraint = true;
+ m_poletip = tip;
+ m_goal = goal;
+ m_polegoal = polegoal;
+ m_poleangle = (getangle)? 0.0f: poleangle;
+ m_getpoleangle = getangle;
+}
+
+static MT_Scalar safe_acos(MT_Scalar f)
+{
+ // acos that does not return NaN with rounding errors
+ if (f <= -1.0f) return MT_PI;
+ else if (f >= 1.0f) return 0.0;
+ else return acos(f);
+}
+
+static MT_Vector3 normalize(const MT_Vector3& v)
+{
+ // a sane normalize function that doesn't give (1, 0, 0) in case
+ // of a zero length vector, like MT_Vector3.normalize
+ MT_Scalar len = v.length();
+ return MT_fuzzyZero(len)? MT_Vector3(0, 0, 0): v/len;
+}
+
+static float angle(const MT_Vector3& v1, const MT_Vector3& v2)
+{
+ return safe_acos(v1.dot(v2));
+}
+
+void IK_QJacobianSolver::ConstrainPoleVector(IK_QSegment *root, std::list<IK_QTask*>& tasks)
+{
+ // this function will be called before and after solving. calling it before
+ // solving gives predictable solutions by rotating towards the solution,
+ // and calling it afterwards ensures the solution is exact.
+
+ if(!m_poleconstraint)
+ return;
+
+ // disable pole vector constraint in case of multiple position tasks
+ std::list<IK_QTask*>::iterator task;
+ int positiontasks = 0;
+
+ for (task = tasks.begin(); task != tasks.end(); task++)
+ if((*task)->PositionTask())
+ positiontasks++;
+
+ if (positiontasks >= 2) {
+ m_poleconstraint = false;
+ return;
+ }
+
+ // get positions and rotations
+ root->UpdateTransform(m_rootmatrix);
+
+ const MT_Vector3 rootpos = root->GlobalStart();
+ const MT_Vector3 endpos = m_poletip->GlobalEnd();
+ const MT_Matrix3x3& rootbasis = root->GlobalTransform().getBasis();
+
+ // construct "lookat" matrices (like gluLookAt), based on a direction and
+ // an up vector, with the direction going from the root to the end effector
+ // and the up vector going from the root to the pole constraint position.
+ MT_Vector3 dir = normalize(endpos - rootpos);
+ MT_Vector3 rootx= rootbasis.getColumn(0);
+ MT_Vector3 rootz= rootbasis.getColumn(2);
+ MT_Vector3 up = rootx*cos(m_poleangle) + rootz*sin(m_poleangle);
+
+ // in post, don't rotate towards the goal but only correct the pole up
+ MT_Vector3 poledir = (m_getpoleangle)? dir: normalize(m_goal - rootpos);
+ MT_Vector3 poleup = normalize(m_polegoal - rootpos);
+
+ MT_Matrix3x3 mat, polemat;
+
+ mat[0] = normalize(MT_cross(dir, up));
+ mat[1] = MT_cross(mat[0], dir);
+ mat[2] = -dir;
+
+ polemat[0] = normalize(MT_cross(poledir, poleup));
+ polemat[1] = MT_cross(polemat[0], poledir);
+ polemat[2] = -poledir;
+
+ if(m_getpoleangle) {
+ // we compute the pole angle that to rotate towards the target
+ m_poleangle = angle(mat[1], polemat[1]);
+
+ if(rootz.dot(mat[1]*cos(m_poleangle) + mat[0]*sin(m_poleangle)) > 0.0f)
+ m_poleangle = -m_poleangle;
+
+ // solve again, with the pole angle we just computed
+ m_getpoleangle = false;
+ ConstrainPoleVector(root, tasks);
+ }
+ else {
+ // now we set as root matrix the difference between the current and
+ // desired rotation based on the pole vector constraint. we use
+ // transpose instead of inverse because we have orthogonal matrices
+ // anyway, and in case of a singular matrix we don't get NaN's.
+ MT_Transform trans(MT_Point3(0, 0, 0), polemat.transposed()*mat);
+ m_rootmatrix = trans*m_rootmatrix;
+ }
+}
+
bool IK_QJacobianSolver::UpdateAngles(MT_Scalar& norm)
{
// assing each segment a unique id for the jacobian
@@ -182,15 +323,20 @@ bool IK_QJacobianSolver::Solve(
const int max_iterations
)
{
+ float scale = ComputeScale();
+ bool solved = false;
//double dt = analyze_time();
- if (!Setup(root, tasks))
- return false;
+ Scale(scale, tasks);
+
+ ConstrainPoleVector(root, tasks);
+
+ root->UpdateTransform(m_rootmatrix);
// iterate
for (int iterations = 0; iterations < max_iterations; iterations++) {
// update transform
- root->UpdateTransform(MT_Transform::Identity());
+ root->UpdateTransform(m_rootmatrix);
std::list<IK_QTask*>::iterator task;
@@ -212,7 +358,7 @@ bool IK_QJacobianSolver::Solve(
m_jacobian.SubTask(m_jacobian_sub);
}
catch (...) {
- printf("IK Exception\n");
+ fprintf(stderr, "IK Exception\n");
return false;
}
@@ -231,12 +377,18 @@ bool IK_QJacobianSolver::Solve(
// check for convergence
if (norm < 1e-3) {
- //analyze_add_run(iterations, analyze_time()-dt);
- return true;
+ solved = true;
+ break;
}
}
+ if(m_poleconstraint)
+ root->PrependBasis(m_rootmatrix.getBasis());
+
+ Scale(1.0f/scale, tasks);
+
//analyze_add_run(max_iterations, analyze_time()-dt);
- return false;
+
+ return solved;
}
diff --git a/intern/iksolver/intern/IK_QJacobianSolver.h b/intern/iksolver/intern/IK_QJacobianSolver.h
index adf95eb82dc..9ad46cd0aa6 100644
--- a/intern/iksolver/intern/IK_QJacobianSolver.h
+++ b/intern/iksolver/intern/IK_QJacobianSolver.h
@@ -43,6 +43,7 @@
#include <list>
#include "MT_Vector3.h"
+#include "MT_Transform.h"
#include "IK_QJacobian.h"
#include "IK_QSegment.h"
#include "IK_QTask.h"
@@ -50,11 +51,18 @@
class IK_QJacobianSolver
{
public:
- IK_QJacobianSolver() {};
+ IK_QJacobianSolver();
~IK_QJacobianSolver() {};
- // returns true if converged, false if max number of iterations was used
+ // setup pole vector constraint
+ void SetPoleVectorConstraint(IK_QSegment *tip, MT_Vector3& goal,
+ MT_Vector3& polegoal, float poleangle, bool getangle);
+ float GetPoleAngle() { return m_poleangle; };
+
+ // call setup once before solving, if it fails don't solve
+ bool Setup(IK_QSegment *root, std::list<IK_QTask*>& tasks);
+ // returns true if converged, false if max number of iterations was used
bool Solve(
IK_QSegment *root,
std::list<IK_QTask*> tasks,
@@ -64,8 +72,11 @@ public:
private:
void AddSegmentList(IK_QSegment *seg);
- bool Setup(IK_QSegment *root, std::list<IK_QTask*>& tasks);
bool UpdateAngles(MT_Scalar& norm);
+ void ConstrainPoleVector(IK_QSegment *root, std::list<IK_QTask*>& tasks);
+
+ MT_Scalar ComputeScale();
+ void Scale(float scale, std::list<IK_QTask*>& tasks);
private:
@@ -75,6 +86,15 @@ private:
bool m_secondary_enabled;
std::vector<IK_QSegment*> m_segments;
+
+ MT_Transform m_rootmatrix;
+
+ bool m_poleconstraint;
+ bool m_getpoleangle;
+ MT_Vector3 m_goal;
+ MT_Vector3 m_polegoal;
+ float m_poleangle;
+ IK_QSegment *m_poletip;
};
#endif
diff --git a/intern/iksolver/intern/IK_QSegment.cpp b/intern/iksolver/intern/IK_QSegment.cpp
index cf9e1615d8c..a5217ed91d6 100644
--- a/intern/iksolver/intern/IK_QSegment.cpp
+++ b/intern/iksolver/intern/IK_QSegment.cpp
@@ -236,6 +236,18 @@ IK_QSegment::IK_QSegment(int num_DoF, bool translational)
m_orig_translation = m_translation;
}
+void IK_QSegment::Reset()
+{
+ m_locked[0] = m_locked[1] = m_locked[2] = false;
+
+ m_basis = m_orig_basis;
+ m_translation = m_orig_translation;
+ SetBasis(m_basis);
+
+ for (IK_QSegment *seg = m_child; seg; seg = seg->m_sibling)
+ seg->Reset();
+}
+
void IK_QSegment::SetTransform(
const MT_Vector3& start,
const MT_Matrix3x3& rest_basis,
@@ -326,6 +338,21 @@ void IK_QSegment::UpdateTransform(const MT_Transform& global)
seg->UpdateTransform(m_global_transform);
}
+void IK_QSegment::PrependBasis(const MT_Matrix3x3& mat)
+{
+ m_basis = m_rest_basis.inverse() * mat * m_rest_basis * m_basis;
+}
+
+void IK_QSegment::Scale(float scale)
+{
+ m_start *= scale;
+ m_translation *= scale;
+ m_orig_translation *= scale;
+ m_global_start *= scale;
+ m_global_transform.getOrigin() *= scale;
+ m_max_extension *= scale;
+}
+
// IK_QSphericalSegment
IK_QSphericalSegment::IK_QSphericalSegment()
@@ -1009,3 +1036,17 @@ void IK_QTranslateSegment::SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax)
m_limit[axis]= true;
}
+void IK_QTranslateSegment::Scale(float scale)
+{
+ int i;
+
+ IK_QSegment::Scale(scale);
+
+ for (i = 0; i < 3; i++) {
+ m_min[0] *= scale;
+ m_max[1] *= scale;
+ }
+
+ m_new_translation *= scale;
+}
+
diff --git a/intern/iksolver/intern/IK_QSegment.h b/intern/iksolver/intern/IK_QSegment.h
index e406585bc8b..3c5df463468 100644
--- a/intern/iksolver/intern/IK_QSegment.h
+++ b/intern/iksolver/intern/IK_QSegment.h
@@ -165,6 +165,13 @@ public:
virtual void SetBasis(const MT_Matrix3x3& basis) { m_basis = basis; }
+ // functions needed for pole vector constraint
+ void PrependBasis(const MT_Matrix3x3& mat);
+ void Reset();
+
+ // scale
+ virtual void Scale(float scale);
+
protected:
// num_DoF: number of degrees of freedom
@@ -331,6 +338,8 @@ public:
void SetWeight(int axis, MT_Scalar weight);
void SetLimit(int axis, MT_Scalar lmin, MT_Scalar lmax);
+ void Scale(float scale);
+
private:
int m_axis[3];
bool m_axis_enabled[3], m_limit[3];
diff --git a/intern/iksolver/intern/IK_QTask.h b/intern/iksolver/intern/IK_QTask.h
index 0e00925d908..f2fd34119a1 100644
--- a/intern/iksolver/intern/IK_QTask.h
+++ b/intern/iksolver/intern/IK_QTask.h
@@ -75,6 +75,10 @@ public:
virtual MT_Scalar Distance() const=0;
+ virtual bool PositionTask() const { return false; }
+
+ virtual void Scale(float scale) {}
+
protected:
int m_id;
int m_size;
@@ -97,6 +101,9 @@ public:
MT_Scalar Distance() const;
+ bool PositionTask() const { return true; }
+ void Scale(float scale) { m_goal *= scale; m_clamp_length *= scale; }
+
private:
MT_Vector3 m_goal;
MT_Scalar m_clamp_length;
@@ -133,6 +140,8 @@ public:
MT_Scalar Distance() const;
+ void Scale(float scale) { m_goal_center *= scale; m_distance *= scale; }
+
private:
MT_Scalar ComputeTotalMass(const IK_QSegment *segment);
MT_Vector3 ComputeCenter(const IK_QSegment *segment);
diff --git a/intern/iksolver/intern/IK_Solver.cpp b/intern/iksolver/intern/IK_Solver.cpp
index 919eeb739ce..140c35c8c46 100644
--- a/intern/iksolver/intern/IK_Solver.cpp
+++ b/intern/iksolver/intern/IK_Solver.cpp
@@ -41,7 +41,7 @@ using namespace std;
class IK_QSolver {
public:
- IK_QSolver() {};
+ IK_QSolver() : root(NULL) {};
IK_QJacobianSolver solver;
IK_QSegment *root;
@@ -197,13 +197,12 @@ void IK_SetStiffness(IK_Segment *seg, IK_SegmentAxis axis, float stiffness)
if (stiffness < 0.0)
return;
- if (stiffness > 0.99)
- stiffness = 0.99;
+ if (stiffness > 0.999)
+ stiffness = 0.999;
IK_QSegment *qseg = (IK_QSegment*)seg;
MT_Scalar weight = 1.0-stiffness;
-
if (axis >= IK_TRANS_X) {
if(!qseg->Translational())
if(qseg->Composite() && qseg->Composite()->Translational())
@@ -318,6 +317,31 @@ void IK_SolverAddGoalOrientation(IK_Solver *solver, IK_Segment *tip, float goal[
qsolver->tasks.push_back(orient);
}
+void IK_SolverSetPoleVectorConstraint(IK_Solver *solver, IK_Segment *tip, float goal[3], float polegoal[3], float poleangle, int getangle)
+{
+ if (solver == NULL || tip == NULL)
+ return;
+
+ IK_QSolver *qsolver = (IK_QSolver*)solver;
+ IK_QSegment *qtip = (IK_QSegment*)tip;
+
+ MT_Vector3 qgoal(goal);
+ MT_Vector3 qpolegoal(polegoal);
+
+ qsolver->solver.SetPoleVectorConstraint(
+ qtip, qgoal, qpolegoal, poleangle, getangle);
+}
+
+float IK_SolverGetPoleAngle(IK_Solver *solver)
+{
+ if (solver == NULL)
+ return 0.0f;
+
+ IK_QSolver *qsolver = (IK_QSolver*)solver;
+
+ return qsolver->solver.GetPoleAngle();
+}
+
void IK_SolverAddCenterOfMass(IK_Solver *solver, IK_Segment *root, float goal[3], float weight)
{
if (solver == NULL || root == NULL)
@@ -346,6 +370,9 @@ int IK_Solve(IK_Solver *solver, float tolerance, int max_iterations)
std::list<IK_QTask*>& tasks = qsolver->tasks;
MT_Scalar tol = tolerance;
+ if(!jacobian.Setup(root, tasks))
+ return 0;
+
bool result = jacobian.Solve(root, tasks, tol, max_iterations);
return ((result)? 1: 0);
diff --git a/intern/keymaker/Makefile b/intern/keymaker/Makefile
deleted file mode 100644
index 703482a851b..00000000000
--- a/intern/keymaker/Makefile
+++ /dev/null
@@ -1,92 +0,0 @@
-#
-# $Id$
-# ***** BEGIN GPL/BL DUAL 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. The Blender
-# Foundation also sells licenses for use in proprietary software under
-# the Blender License. See http://www.blender.org/BL/ for information
-# about this.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
-# All rights reserved.
-#
-# The Original Code is: all of this file.
-#
-# Contributor(s): Hans Lambermont
-#
-# ***** END GPL/BL DUAL LICENSE BLOCK *****
-# blender keyreader-library makefile
-#
-
-LIBNAME = blenkey
-SOURCEDIR = intern/$(LIBNAME)
-DIR = $(OCGDIR)/$(SOURCEDIR)
-CSRCS = mt19937int.c key.c
-
-ALLTARGETS = $(OBJS)
-
-include nan_compile.mk
-
-CFLAGS += $(LEVEL_2_C_WARNINGS)
-
-CPPFLAGS += -I$(NAN_OPENSSL)/include -Ipython/
-
-include nan_link.mk
-
-# OBJS is for the library, set by nan_compile.mk
-LOADER_OBJS = $(DIR)/$(DEBUG_DIR)keyloader.o
-
-ifneq ($(OS),windows)
- LIBS = $(NAN_OPENSSL)/lib/libcrypto.a
-else
- ifeq ($(FREE_WINDOWS),true)
- LIBS = $(NAN_OPENSSL)/lib/libcrypto.a
- else
- LIBS = $(NAN_OPENSSL)/lib/libeay32.lib
- LIBS += advapi32.lib gdi32.lib
- endif
-endif
-
-all debug:: link
-
-link: $(DIR)/$(DEBUG_DIR)keyloader
-
-strip:
- ifneq ($(OS),windows)
- strip keyloader
- @ls -la keyloader
- else
- @ls -la keyloader.exe
- endif
-
-install: all debug
- @[ -d $(LCGDIR)/$(LIBNAME) ] || mkdir $(LCGDIR)/$(LIBNAME)
- @[ -d $(LCGDIR)/$(LIBNAME)/include ] || mkdir $(LCGDIR)/$(LIBNAME)/include
- @[ -d $(LCGDIR)/$(LIBNAME)/lib ] || mkdir $(LCGDIR)/$(LIBNAME)/lib
- @../tools/cpifdiff.sh blenkey.h $(LCGDIR)/$(LIBNAME)/include/
- @../tools/cpifdiff.sh $(LIB_a) $(LCGDIR)/$(LIBNAME)/lib/
-ifeq ($(OS),darwin)
- ranlib $(LCGDIR)/$(LIBNAME)/lib/lib$(LIBNAME).a
-endif
-
-$(DIR)/$(DEBUG_DIR)keyloader: $(LOADER_OBJS) $(LIB_a)
- $(CC) $(LDFLAGS) -o $@ $(LOADER_OBJS) $(LIB_a) $(LIBS)
-
-clean::
- $(RM) $(DIR)/key* $(DIR)/debug/key*
- $(RM) $(DIR)/nan* $(DIR)/debug/nan*
-
-tags:
- etags *.c *.h
diff --git a/intern/keymaker/blenkey.h b/intern/keymaker/blenkey.h
deleted file mode 100644
index e504fdf62b8..00000000000
--- a/intern/keymaker/blenkey.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * Blender Key loader library external interface
- */
-
-#ifndef BLENKEY_H
-#define BLENKEY_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef unsigned char byte;
-
-typedef struct UserStructType {
- char name[100];
- char email[100];
- char shopid[100];
- unsigned long reldate;
- int keytype; /* 1 = Individual, 2 = Corporate, 3 = Unlimited */
- int keylevel; /* key disclosure level, starts at 1 */
- int keyformat; /* if we change the keyformat, up BLENKEYFORMAT */
-} UserStruct;
-
-char *Hexify(byte *in, unsigned int length);
-byte *DeHexify(char *in);
-
-byte checkfunc0(byte a, byte b);
-byte checkfunc1(byte a, byte b);
-byte checkfunc2(byte a, byte b);
-byte checkfunc3(byte a, byte b);
-byte checkfunc4(byte a, byte b);
-
-/* the byte size of the checksum datablock
-#define MAXBYTEDATABLOCK 1000 */
-
-#define BLENKEYMAGIC "0ce0ba52"
-#define BLENKEYSEPERATOR "---+++---"
-#define BLENKEYFORMAT 1
-
-
-int ReadKeyFile(char *filename, UserStruct *User,
- char **Priv, char **Pub, byte **Byte, char **Python);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* BLENKEY_H */
-
diff --git a/intern/keymaker/key.c b/intern/keymaker/key.c
deleted file mode 100644
index 413ee8b448c..00000000000
--- a/intern/keymaker/key.c
+++ /dev/null
@@ -1,496 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/* ex:ts=4 */
-
-/**
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * Blender Key loader library
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "blenkey.h" /* external interface */
-#include "key_internal.h"
-
-char *Hexify(byte *in, unsigned int length) {
- unsigned int i;
- char Tstring[3];
- char *out = malloc((2*length + 1) * sizeof(char));
- sprintf(out, "%02X", in[0]);
- for (i=1; i<length; i++) {
- sprintf(Tstring, "%02X", in[i]);
- strcat(out, Tstring);
- }
- return (out);
-}
-
-byte *DeHexify(char *in) {
- size_t len = strlen(in);
- byte *out = malloc((len/2) * sizeof(byte));
- unsigned int hexedbyte;
- unsigned int i;
- char *inp = in;
- byte *outp = out;
- for (i=0; i<(len/2); i++) {
- sscanf(inp, "%2x", &hexedbyte);
- inp += 2;
- *outp = (byte) hexedbyte;
- outp++;
- }
- /* printf("\nlen=%d, string=[%s]\n", len, Hexify(out, len/2)); */
- return (out);
-}
-
-int from_hex(char c) {
- return (c<'A') ? (c-'0') : (c-'A'+10);
-}
-
-/* 5 ReadHex helper functions ------------------------------------------
- read one Hex byte (two characters) and skip newlines if necessary */
-byte ReadHexByteFp(FILE *fh, int *newlinetracker) {
- unsigned char a;
- unsigned char a1, a2;
- /* read 2 bytes hexcode of ascii data type */
- fread(&a1, 1, 1, fh);
- fread(&a2, 1, 1, fh);
- a = 16 * (from_hex(a1)) + (from_hex(a2));
- /*printf("Char[%d] = %02X\n", *newlinetracker, a); */
- *newlinetracker += 2;
- /* skip the newlines */
- if (*newlinetracker == 72) {
- fseek(fh, 1, SEEK_CUR);
- *newlinetracker = 0;
- /*printf("LastChar = %02X\n", a); */
- }
- return((byte) a);
-}
-byte ReadHexByteCp(char **from) {
- int a;
- /* read 2 bytes hexcode of ascii data type */
- sscanf(*from, "%2x", &a);
- /*printf("Char = %02X\n", a); */
- *from += 2;
- return((byte) a);
-}
-/* Generic hex2int */
-int HexToInt(int a) {
- if (a == 0x20) /* space, count as 0 ;-) */
- return 0;
- else
- return(a - '0');
-}
-/* Note: this is only to be used for the header type */
-int HexToIntFp(FILE *fh, int *newlinetracker) {
- byte a = ReadHexByteFp(fh, newlinetracker);
- if (DEBUG) printf("%02X = %d\n", a, a); /* note: no HexToInt here */
- return(a);
-}
-int HexToIntCp(char **from) {
- byte a = ReadHexByteCp(from);
- if (DEBUG) printf("%02X = %d\n", a, a); /* note: no HexToInt here */
- return(a);
-}
-/* Note: this is only to be used for the header length */
-int Hex5ToInt(byte a, byte b, byte c, byte d, byte e) {
- return(HexToInt((int) a) * 10000 +
- HexToInt((int) b) * 1000 +
- HexToInt((int) c) * 100 +
- HexToInt((int) d) * 10 +
- HexToInt((int) e));
-}
-/* Note: this is only to be used for the header length */
-int Hex5ToIntFp(FILE *fh, int *newlinetracker) {
- byte a = ReadHexByteFp(fh, newlinetracker),
- b = ReadHexByteFp(fh, newlinetracker),
- c = ReadHexByteFp(fh, newlinetracker),
- d = ReadHexByteFp(fh, newlinetracker),
- e = ReadHexByteFp(fh, newlinetracker);
- if (DEBUG) printf("\n%02X%02X%02X%02X%02X = %d\n", a, b, c, d, e,
- Hex5ToInt(a, b, c, d, e));
- return(Hex5ToInt(a, b, c, d, e));
-}
-int Hex5ToIntCp(char **from) {
- byte a = ReadHexByteCp(from),
- b = ReadHexByteCp(from),
- c = ReadHexByteCp(from),
- d = ReadHexByteCp(from),
- e = ReadHexByteCp(from);
- if (DEBUG) printf("\n%02X%02X%02X%02X%02X = %d\n", a, b, c, d, e,
- Hex5ToInt(a, b, c, d, e));
- return(Hex5ToInt(a, b, c, d, e));
-}
-/* --------------------------------------------------------------------- */
-
-/* return the biggest */
-byte checkfunc0(byte a, byte b) {
- if (a > b) return a;
- else return b;
-}
-/* return |a-b| */
-byte checkfunc1(byte a, byte b) {
- if (a > b) return a - b;
- else return b - a;
-}
-/* return the sum mod 256 */
-byte checkfunc2(byte a, byte b) {
- return ((a + b) % 256);
-}
-/* return the multiplication mod 256 */
-byte checkfunc3(byte a, byte b) {
- return ((a * b) % 256);
-}
-/* return a/b or 0 */
-byte checkfunc4(byte a, byte b) {
- if (b != 0) return (a / b);
- else return 0;
-}
-
-char *scan_ascii(FILE *fh, UserStruct *User) {
- long ascii_size;
- char *ascii_data = NULL;
- char *mdhex = NULL;
- byte md[RIPEMD160_DIGEST_LENGTH];
- char string[1024];
- char dosnewlines = 0;
- int lines = 0;
- int oldftell;
-
- /* NOTE: fscanf is notorious for its buffer overflows. This must be
- fixed some day, consider this a proof-of-concept version. */
-
- fscanf(fh, "%1000[^\n]", string);
- sscanf(string, "%*s %s %s %lu %d %d %d",
- User->email,
- User->shopid,
- &User->reldate,
- &User->keytype,
- &User->keylevel,
- &User->keyformat);
-
- if (User->keyformat <= BLENKEYFORMAT) {
- if (DEBUG) printf(
- "Email:[%s] ShopID:[%s] RelDate:[%lu] KeyType[%d] KeyLevel[%d]\n",
- User->email, User->shopid, User->reldate, User->keytype,
- User->keylevel);
-
- /* read /n/n
- check if we're reading dow newlines...
- */
- oldftell = ftell(fh);
- getc(fh);
- if ((ftell(fh) - oldftell) == 2) {
- /* yes ! */
- dosnewlines = 1;
- }
- getc(fh);
-
- fscanf(fh, "%1000[^\n]", string);
- strncpy(User->name, string, sizeof(User->name) - 1);
-
- if (DEBUG) printf("Name:[%s]\n", User->name);
-
- getc(fh);
-
- /* 4 lines read uptil now... */
- lines = 4;
-
- while (getc(fh) != EOF) {
- fscanf(fh, "%1000[^\n]", string);
- lines++;
- /* if (DEBUG) printf("%s\n", string); */
- if (strcmp(string, BLENKEYSEPERATOR) == 0) {
- getc(fh);
- break;
- }
- }
-
- /* fh now points at the start of the datablock */
- ascii_size = ftell(fh);
-
- if (dosnewlines) {
- /* if we were reading on dos
- ftell will also count the ^M 's in the file;
- substract them
- */
- ascii_size -= lines;
- }
-
- ascii_data = malloc((ascii_size+1) * sizeof(char));
- fseek(fh, 0, SEEK_SET);
- fread(ascii_data, sizeof(char), ascii_size, fh);
- ascii_data[ascii_size] = '\0';
-
- if (DEBUG)
- printf("asciiblock is %ld bytes long:\n[%s]\n", ascii_size, ascii_data);
-
- /* calculate the hash checksum */
- RIPEMD160(ascii_data, ascii_size, md);
- free(ascii_data);
- mdhex = Hexify(md, RIPEMD160_DIGEST_LENGTH);
- }
-
- return(mdhex);
-}
-
-char *ReadHexCryptedData(FILE *fh, int *newlinetracker) {
- int HexCryptedDataLength = Hex5ToIntFp(fh, newlinetracker);
- int DataType = HexToIntFp(fh, newlinetracker);
- char *HexCryptedData = malloc((HexCryptedDataLength+1) * sizeof(char));
- int i;
-
- if (DataType != 1) {
- /* printf("Error: unexpected datatype for HexCryptedData\n"); */
- free(HexCryptedData);
- HexCryptedData = 0;
- } else {
- for (i=0; i<(HexCryptedDataLength/2); i++) {
- sprintf(HexCryptedData+2*i, "%02X", ReadHexByteFp(fh, newlinetracker));
- }
- }
-
- return(HexCryptedData);
-}
-
-char *ReadHexCryptedKey(FILE *fh, int *newlinetracker) {
- int HexCryptedKeyLength = Hex5ToIntFp(fh, newlinetracker);
- int DataType = HexToIntFp(fh, newlinetracker);
- char *HexCryptedKey = malloc((HexCryptedKeyLength+1) * sizeof(char));
- int i;
-
- if (DataType != 2) {
- /* printf("Error: unexpected datatype for HexCryptedKey\n"); */
- free(HexCryptedKey);
- HexCryptedKey = 0;
- } else {
- for (i=0; i<(HexCryptedKeyLength/2); i++) {
- sprintf(HexCryptedKey+2*i, "%02X", ReadHexByteFp(fh, newlinetracker));
- }
- }
-
- return(HexCryptedKey);
-}
-
-/* NOTE: CHANGE THIS INTO A KEY OF OUR OWN */
-void LoadRSApubKey(RSA *Pub) {
- static unsigned char n[] =
-"\xD1\x12\x0C\x6A\x34\x0A\xCF\x4C\x6B\x34\xA9\x3C\xDD\x1A\x2A\x68"
-"\x34\xE5\xB4\xA2\x08\xE8\x9F\xCE\x76\xEF\x4B\x92\x9B\x99\xB4\x57"
-"\x72\x95\x78\x1D\x9E\x21\x1B\xF9\x5C\x1B\x0E\xC9\xD0\x89\x75\x28"
-"\x08\x13\x6A\xD8\xA9\xC2\xA4\x31\x91\x53\x5A\xB9\x26\x71\x8C\x05";
- static unsigned char e[] =
-"\x01\x00\x01";
-/*
- static unsigned char e[] = "\x11";
- static unsigned char n[] =
-"\x00\xAA\x36\xAB\xCE\x88\xAC\xFD\xFF\x55\x52\x3C\x7F\xC4\x52\x3F"
-"\x90\xEF\xA0\x0D\xF3\x77\x4A\x25\x9F\x2E\x62\xB4\xC5\xD9\x9C\xB5"
-"\xAD\xB3\x00\xA0\x28\x5E\x53\x01\x93\x0E\x0C\x70\xFB\x68\x76\x93"
-"\x9C\xE6\x16\xCE\x62\x4A\x11\xE0\x08\x6D\x34\x1E\xBC\xAC\xA0\xA1"
-"\xF5";
-*/
-
- Pub->e = BN_bin2bn(e, sizeof(e)-1, Pub->e);
- Pub->n = BN_bin2bn(n, sizeof(n)-1, Pub->n);
-}
-
-byte *RSADecryptKey(char *HexCryptedKey) {
- byte *CryptedKey = NULL;
- byte *Key = NULL;
- int KeyLen;
- int CryptedKeyLen = strlen(HexCryptedKey)/2;
- RSA *Pub = NULL;
-
- /* Load RSA public key */
- Pub = RSA_new();
- if (Pub == NULL) {
- /* printf("Error in RSA_new\n"); */
- } else {
- LoadRSApubKey(Pub);
-
- Key = malloc(RSA_size(Pub) * sizeof(byte));
-
- CryptedKey = DeHexify(HexCryptedKey);
-
- KeyLen = RSA_public_decrypt(CryptedKeyLen, CryptedKey, Key, Pub,
- RSA_PKCS1_PADDING);
- if (DEBUG)
- printf("CryptedKeyLen = %d, KeyLen = %d\n", CryptedKeyLen, KeyLen);
- if (KeyLen == -1) {
-#ifndef NDEBUG
- printf("Error in RSA_public_decrypt: %s\n", ERR_error_string(ERR_get_error(), NULL));
-#endif
- free(Key);
- Key = NULL;
- }
- }
-
- return (Key);
-}
-
-char *DeCryptDatablock(byte *CryptKey, int keylen, char *HexCryptedData) {
- RC4_KEY key;
- byte *CryptedData = DeHexify(HexCryptedData);
- unsigned int datalen = strlen(HexCryptedData)/2;
- char *KeyDataString = malloc(datalen * sizeof(char));
-
- RC4_set_key(&key, keylen, CryptKey);
- RC4(&key, datalen, CryptedData, KeyDataString);
- free(CryptedData);
-
- return(KeyDataString);
-}
-
-char *get_from_datablock(char **DataPtr, char *TypeString) {
- int tstringsize = Hex5ToIntCp(DataPtr);
- int tstringtype = HexToIntCp(DataPtr);
- char *HexString = NULL;
-
- if (atoi(TypeString) != tstringtype) {
- /* printf("Unexpected type %d, expected %s\n", tstringtype, TypeString); */
- } else {
- HexString = malloc((tstringsize+1) * sizeof(char));
-
- strncpy(HexString, *DataPtr, tstringsize);
- *DataPtr += tstringsize;
- HexString[tstringsize] = '\0';
- }
-
- return(HexString);
-}
-
-int ReadKeyFile(char *filename, UserStruct *User,
- char **Priv, char **Pub, byte **Byte, char **Python) {
- FILE *rawkeyfile;
- char *HexAsciiHash = NULL, *HexCryptedData = NULL, *HexCryptedKey =
- NULL;
- int newlinetracker = 0; /* line position, counts from 0-71 */
- byte *CryptKey = NULL;
- char *KeyDataString = NULL;
- char *KeyDataPtr = NULL;
- char *HexByte = NULL;
- char *mdhex = NULL;
- int ret_val = 1;
-
- if ((rawkeyfile = fopen(filename, "rb")) == NULL) {
- /* printf("error, cannot read %s\n", filename); */
- } else {
- /* Scan and interpret the ASCII part */
- HexAsciiHash = scan_ascii(rawkeyfile, User);
- if (DEBUG) printf("\nHexHash: %s\n", HexAsciiHash);
-
- /* Read the HexCryptedData */
- HexCryptedData = ReadHexCryptedData(rawkeyfile, &newlinetracker);
- if (DEBUG) printf("\nHexCryptedData: %s\n", HexCryptedData);
-
- /* Read the HexCryptedKey */
- HexCryptedKey = ReadHexCryptedKey(rawkeyfile, &newlinetracker);
- if (DEBUG) printf("\nHexCryptedKey: %s\n", HexCryptedKey);
-
- /* close keyfile */
- fclose(rawkeyfile);
-
- if (HexAsciiHash && HexCryptedKey && HexCryptedData) {
- /* Decrypt HexCryptedKey */
- CryptKey = RSADecryptKey(HexCryptedKey);
-
- if (CryptKey) {
- /* Decrypt HexCryptedData */
- KeyDataString = DeCryptDatablock(CryptKey, 16, HexCryptedData);
- free(CryptKey);
- CryptKey = NULL;
-
- if (KeyDataString) {
- if (DEBUG) printf("\nKeyDataString: %s\n", KeyDataString);
-
- /* Extract data from KeyDataString */
- KeyDataPtr = KeyDataString;
- mdhex = get_from_datablock(&KeyDataPtr, "01");
- *Priv = get_from_datablock(&KeyDataPtr, "02");
- *Pub = get_from_datablock(&KeyDataPtr, "03");
- HexByte = get_from_datablock(&KeyDataPtr, "04");
- if (HexByte) {
- *Byte = DeHexify(HexByte);
- free(HexByte);
- HexByte = NULL;
-
- *Python = get_from_datablock(&KeyDataPtr, "05");
-
- /* Check ascii hash */
- if (strcmp(mdhex, HexAsciiHash) != 0) {
- /* printf("Ascii part checksums do not match !\n");
- printf("found: %s\n", mdhex);
- printf("check: %s\n", HexAsciiHash);
- */
- ret_val = 2;
- } else {
- if (DEBUG) printf("\nThe ascii part checksum matches\n");
- /* everything ok ! */
- ret_val = 0;
- }
- free(mdhex);
- mdhex = NULL;
- }
-
- free(KeyDataString);
- KeyDataString = NULL;
- }
- }
- }
-
- /* cleanup */
-
- if (HexAsciiHash) {
- free(HexAsciiHash);
- HexAsciiHash = NULL;
- }
-
- if (HexCryptedKey) {
- free(HexCryptedKey);
- HexCryptedKey = NULL;
- }
-
- if (HexCryptedData) {
- free(HexCryptedData);
- HexCryptedData = NULL;
- }
- }
-
- return (ret_val);
-}
-
diff --git a/intern/keymaker/key_internal.h b/intern/keymaker/key_internal.h
deleted file mode 100644
index 2bd60b9e9d8..00000000000
--- a/intern/keymaker/key_internal.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/* ex:ts=4 */
-
-/**
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * Blender Key loader library internal stuff
- */
-
-#include "openssl/rand.h"
-#include "openssl/rsa.h"
-#include "openssl/ripemd.h"
-#include "openssl/rc4.h"
-#include "openssl/err.h"
-#include "blenkey.h"
-
-#include "mt19937int.h" /* Mersenne Twister (under artistic license) */
-
-#define MAXASCIIBLOCK 1000
-#define MAXBYTEDATABLOCK 1000
-
-#ifdef NDEBUG
- #define DEBUG 0
-#else
- #define DEBUG 1
-#endif
-
-/* keyloader and keymaker internal prototypes */
-int from_hex(char c);
-byte ReadHexByteFp(FILE *fh, int *newlinetracker);
-byte ReadHexByteCp(char **from);
-int HexToInt(int a);
-int HexToIntFp(FILE *fh, int *newlinetracker);
-int HexToIntCp(char **from);
-int Hex5ToInt(byte a, byte b, byte c, byte d, byte e);
-int Hex5ToIntFp(FILE *fh, int *newlinetracker);
-int Hex5ToIntCp(char **from);
-void pub_priv_test(char *HexPriv, char *HexPub);
-int main(int argc, char **argv);
-
-/* keyloader only internal prototypes */
-char *scan_ascii(FILE *fh, UserStruct *User);
-char *ReadHexCryptedData(FILE *fh, int *newlinetracker);
-char *ReadHexCryptedKey(FILE *fh, int *newlinetracker);
-void LoadRSApubKey(RSA *Pub);
-byte *RSADecryptKey(char *HexCryptedKey);
-char *DeCryptDatablock(byte *CryptKey, int keylen, char *HexCryptedData);
-char *get_from_datablock(char **DataPtr, char *TypeString);
-int Check_All_Byte_Calculus_Data(char *KeyBytePtr);
-
-/* keymaker only internal prototypes */
-void usage(void);
-char *Create_Ascii_Part(int argc, char **argv);
-void Create_User_RSA_Keys(unsigned int keylength,
- char **rsaPrivString, char **rsaPubString);
-char *Create_Byte_Calculus_Data(void);
-byte *CreateCryptKey(unsigned int size);
-char *CryptDatablock(byte *CryptKey, int keylen, char *KeyDataString);
-char *RSACryptKey(RSA *rsa, byte *CryptKey, int KeyLen);
-void add_to_datablock(char **DataString, char *HexString, char *TypeString);
-void LoadRSAprivKey(RSA *Priv);
-
diff --git a/intern/keymaker/keyloader.c b/intern/keymaker/keyloader.c
deleted file mode 100644
index 878ed319cb5..00000000000
--- a/intern/keymaker/keyloader.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/* ex:ts=4 */
-
-/**
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * Blender Key Read-tester
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "key_pyc.h" /* the Python byte code */
-#include "blenkey.h" /* the external interface */
-#include "key_internal.h"
-
-#define TESTReadKeyFile 1
-
-int Check_All_Byte_Calculus_Data(char *KeyBytePtr) {
- int i;
-
- /* create some unique number arrays */
- int NoRealRandomArray[MAXBYTEDATABLOCK];
-
- typedef byte (*funcpoin)(byte, byte);
- funcpoin checkfunc[] = {&checkfunc0, &checkfunc1, &checkfunc2,
- &checkfunc3, &checkfunc4};
-
- byte *KeyByteData = DeHexify(KeyBytePtr);
-
- /* first create a fixed seed random number generator */
- sgenrand(666); /* seed it fixed */
-
- /* initialize arrays with unique numbers */
- for (i=0; i<MAXBYTEDATABLOCK; i++) {
- NoRealRandomArray[i] = i;
- }
- /* then stir the unique number lists */
- for (i=0; i<MAXBYTEDATABLOCK; i++) {
- unsigned long randswap = genrand();
- int swap1 = (int) (randswap % MAXBYTEDATABLOCK);
- int swap2 = (int) ((randswap>>16) % MAXBYTEDATABLOCK);
- int store = NoRealRandomArray[swap1];
- /* printf("%lu %d %d\n", randswap, swap1, swap2); */
- NoRealRandomArray[swap1] = NoRealRandomArray[swap2];
- NoRealRandomArray[swap2] = store;
- }
- if (DEBUG) {
- printf("\nFixed seed unique number random data: ");
- for (i=0; i<MAXBYTEDATABLOCK; i++) {
- printf("%d ", NoRealRandomArray[i]);
- }
- printf("\n\n");
- }
-
- /* check our byte calculus functions on the random data */
- for (i=0; i<(MAXBYTEDATABLOCK-3); i+=3) {
- if (DEBUG) {
- char *Pcheckfunc[] = {"max", " - ", " + ", " * ", " / "};
- printf("[%3d]=[%3d]%s[%3d] ",
- NoRealRandomArray[i], NoRealRandomArray[i+1],
- Pcheckfunc[NoRealRandomArray[i]%5], NoRealRandomArray[i+2]);
- printf("%3d%s%3d: %3d == %3d\n",
- KeyByteData[NoRealRandomArray[i+1]],
- Pcheckfunc[NoRealRandomArray[i]%5],
- KeyByteData[NoRealRandomArray[i+2]],
- KeyByteData[NoRealRandomArray[i]],
- checkfunc[(NoRealRandomArray[i]%5)](
- KeyByteData[NoRealRandomArray[i+1]],
- KeyByteData[NoRealRandomArray[i+2]]));
- }
- if (KeyByteData[NoRealRandomArray[i]] !=
- checkfunc[(NoRealRandomArray[i]%5)](
- KeyByteData[NoRealRandomArray[i+1]],
- KeyByteData[NoRealRandomArray[i+2]])) {
- printf("\nByte Checksum failed !\n");
- return (1);
- }
- }
- return (0);
-}
-
-void pub_priv_test(char *HexPriv, char *HexPub)
-{
- RSA *rsa = NULL;
- /* static unsigned char rsa_e[] = "\x11"; */
- static unsigned char rsa_e[] = "\x01\x00\x01";
- byte cryptKey[16];
- byte *cryptedKey;
- byte *pubKey, *privKey;
- int pubKeyLen, privKeyLen;
- int deCryptKeyLen;
- unsigned char *deCryptKey;
- int cryptKeyLen = 16;
- int cryptedKeyLen;
-
- strcpy(cryptKey, "abcdefghijklmno");
-
- pubKey = DeHexify(HexPub);
- pubKeyLen = strlen(HexPub) / 2;
-
- privKey = DeHexify(HexPriv);
- privKeyLen = strlen(HexPriv) / 2;
-
- rsa = RSA_new();
- if (rsa == NULL) {
- fprintf(stderr, "Error in RSA_new\n");
- exit(1);
- }
- rsa->e = BN_bin2bn(rsa_e, sizeof(rsa_e)-1, rsa->e);
- rsa->n = BN_bin2bn(pubKey, pubKeyLen, rsa->n);
- rsa->d = BN_bin2bn(privKey, privKeyLen, rsa->d);
-
- fprintf(stderr, "NOTE e %d, n %d, d %d rsa_size %d\n",
- sizeof(rsa_e)-1, pubKeyLen, privKeyLen, RSA_size(rsa));
-
- cryptedKey = malloc(RSA_size(rsa) * sizeof(byte));
- cryptedKeyLen = RSA_private_encrypt(cryptKeyLen, cryptKey,
- cryptedKey, rsa, RSA_PKCS1_PADDING);
-
- deCryptKey = malloc(RSA_size(rsa) * sizeof(unsigned char));
- deCryptKeyLen = RSA_public_decrypt(cryptedKeyLen, cryptedKey,
- deCryptKey, rsa, RSA_PKCS1_PADDING);
- if (deCryptKeyLen == -1) {
- printf("Error in RSA_public_decrypt: %s\n",
- ERR_error_string(ERR_get_error(), NULL));
- exit(1);
- } else {
- printf("RSA_public_decrypt test SUCCEEDED\n");
- }
-
-}
-
-#ifdef TESTReadKeyFile
-int main(int argc, char **argv) {
- int result;
- UserStruct User;
- char *HexPriv = NULL, *HexPub = NULL, *HexPython = NULL;
- byte *Byte = NULL;
- byte *PythonData = NULL;
- int PythonLength;
- char *HexByte = NULL;
-
- if (argc != 2) {
- printf("usage: %s keyfile\n", argv[0]);
- exit(1);
- }
-
- result = ReadKeyFile(argv[1], &User, &HexPriv, &HexPub, &Byte, &HexPython);
- if (result != 0) {
- printf("\nReadKeyFile error %d\n", result);
- exit(result);
- } else {
- printf("\nReadKeyFile OK\n");
- }
-
- /* just print the rsaPrivString and rsaPubString */
- if (DEBUG) printf("\nrsaPrivString: %s\n", HexPriv);
- if (DEBUG) printf("\nrsaPubString: %s\n", HexPub);
-
- /* try to private encrypt-public decrypt something */
- if (DEBUG) pub_priv_test(HexPriv, HexPub);
-
- /* check all the Byte checksums
- rehexify it for our Check_All_Byte_Calculus_Data function ... */
- HexByte = Hexify(Byte, 1000);
- if (Check_All_Byte_Calculus_Data(HexByte) != 0) {
- printf("\nByte_Calculus_Data checksums do not match !\n");
- exit(1);
- } else {
- if (DEBUG) printf("\nThe Byte Calculus Data checksums match\n");
- }
-
- /* Check the KeyPythonPtr */
- PythonLength = strlen(HexPython)/2;
- PythonData = DeHexify(HexPython);
- if (memcmp(PythonData, g_keycode, PythonLength) != 0) {
- printf("\nPython Byte code datablocks do not match !\n");
- exit(1);
- } else {
- if (DEBUG) printf("\nThe Python Byte code datablock matches\n");
- }
-
- return(0);
-}
-#else
-int main(int argc, char **argv) {
- FILE *rawkeyfile;
- char *AsciiHash;
- char *HexCryptedData, *HexCryptedKey;
- int newlinetracker = 0; /* line position, counts from 0-71 */
- byte *CryptKey;
- char *KeyDataString;
- char *KeyDataPtr;
- char *mdhex;
- char *rsaPrivString;
- char *rsaPubString;
- char *KeyBytePtr;
- char *KeyPythonPtr;
- byte *PythonData;
- int PythonLength;
- UserStruct User;
-
- if (argc != 2) {
- printf("usage: %s keyfile\n", argv[0]);
- exit(1);
- }
-
- /* open keyfile for reading */
- if ((rawkeyfile = fopen(argv[1], "r")) == NULL) {
- printf("error, cannot read %s\n", argv[1]);
- exit(1);
- }
-
- /* Scan and interpret the ASCII part */
- AsciiHash = scan_ascii(rawkeyfile, &User);
- if (DEBUG) printf("\nHexHash: %s\n", AsciiHash);
-
- /* Read the HexCryptedData */
- HexCryptedData = ReadHexCryptedData(rawkeyfile, &newlinetracker);
- if (DEBUG) printf("\nHexCryptedData: %s\n", HexCryptedData);
-
- /* Read the HexCryptedKey */
- HexCryptedKey = ReadHexCryptedKey(rawkeyfile, &newlinetracker);
- if (DEBUG) printf("\nHexCryptedKey: %s\n", HexCryptedKey);
-
- /* close keyfile */
- fclose(rawkeyfile);
-
- /* Decrypt HexCryptedKey */
- CryptKey = RSADecryptKey(HexCryptedKey);
-
- /* Decrypt HexCryptedData */
- KeyDataString = DeCryptDatablock(CryptKey, 16, HexCryptedData);
- free(CryptKey);
- free(HexCryptedData);
- free(HexCryptedKey);
- if (DEBUG) printf("\nKeyDataString: %s\n", KeyDataString);
-
- /* Extract data from KeyDataString */
- KeyDataPtr = KeyDataString;
-
- mdhex = get_from_datablock(&KeyDataPtr, "01");
- rsaPrivString = get_from_datablock(&KeyDataPtr, "02");
- rsaPubString = get_from_datablock(&KeyDataPtr, "03");
- KeyBytePtr = get_from_datablock(&KeyDataPtr, "04");
- KeyPythonPtr = get_from_datablock(&KeyDataPtr, "05");
- free(KeyDataString);
-
- /* Check ascii hash */
- if (strcmp(mdhex, AsciiHash) != 0) {
- printf("Ascii part checksums do not match !\n");
- printf("found: %s\n", mdhex);
- printf("check: %s\n", AsciiHash);
- exit(1);
- } else {
- if (DEBUG) printf("\nThe ascii part checksum matches\n");
- }
-
- /* just print the rsaPrivString and rsaPubString */
- if (DEBUG) printf("\nrsaPrivString: %s\n", rsaPrivString);
- if (DEBUG) printf("\nrsaPubString: %s\n", rsaPubString);
-
- /* check all the Byte checksums */
- if (Check_All_Byte_Calculus_Data(KeyBytePtr) != 0) {
- printf("Byte_Calculus_Data checksums do not match !\n");
- exit(1);
- } else {
- if (DEBUG) printf("\nThe Byte Calculus Data checksums match\n");
- }
-
- /* Check the KeyPythonPtr */
- PythonLength = strlen(KeyPythonPtr)/2;
- PythonData = DeHexify(KeyPythonPtr);
- if (memcmp(PythonData, g_keycode, PythonLength) != 0) {
- printf("Python Byte code datablocks do not match !\n");
- exit(1);
- } else {
- if (DEBUG) printf("\nThe Python Byte code datablock matches\n");
- }
-
- return(0);
-}
-#endif
diff --git a/intern/keymaker/make/msvc_6_0/blenkey.dsp b/intern/keymaker/make/msvc_6_0/blenkey.dsp
deleted file mode 100644
index 4cc63f9fc24..00000000000
--- a/intern/keymaker/make/msvc_6_0/blenkey.dsp
+++ /dev/null
@@ -1,134 +0,0 @@
-# Microsoft Developer Studio Project File - Name="blenkey" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=blenkey - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "blenkey.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "blenkey.mak" CFG="blenkey - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "blenkey - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "blenkey - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "blenkey - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "..\..\..\..\obj\windows\intern\blenkey\"
-# PROP Intermediate_Dir "..\..\..\..\obj\windows\intern\blenkey\"
-# PROP Target_Dir ""
-LINK32=link.exe -lib
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\.." /I "..\..\..\..\..\lib\windows\openssl\include" /I "..\..\python" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\..\..\..\obj\windows\intern\blenkey\libblenkey.lib"
-# Begin Special Build Tool
-SOURCE="$(InputPath)"
-PostBuild_Cmds=ECHO Copying header files XCOPY /Y ..\..\blenkey.h ..\..\..\..\..\lib\windows\blenkey\include\ ECHO Copying lib XCOPY /Y ..\..\..\..\obj\windows\intern\blenkey\*.lib ..\..\..\..\..\lib\windows\blenkey\lib\*.a ECHO Done
-# End Special Build Tool
-
-!ELSEIF "$(CFG)" == "blenkey - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "..\..\..\..\obj\windows\intern\blenkey\debug"
-# PROP Intermediate_Dir "..\..\..\..\obj\windows\intern\blenkey\debug"
-# PROP Target_Dir ""
-LINK32=link.exe -lib
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\..\..\..\lib\windows\openssl\include" /I "..\..\python" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo /out:"..\..\..\..\obj\windows\intern\blenkey\debug\libblenkey.lib"
-# Begin Special Build Tool
-SOURCE="$(InputPath)"
-PostBuild_Cmds=ECHO Copying header files XCOPY /Y ..\..\blenkey.h ..\..\..\..\..\lib\windows\blenkey\include\ ECHO Copying lib XCOPY /Y ..\..\..\..\obj\windows\intern\blenkey\debug\*.lib ..\..\..\..\..\lib\windows\blenkey\lib\debug\*.a
-# End Special Build Tool
-
-!ENDIF
-
-# Begin Target
-
-# Name "blenkey - Win32 Release"
-# Name "blenkey - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\..\key.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\keyloader.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\mt19937int.c
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Group "intern"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\key_internal.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\..\mt19937int.h
-# End Source File
-# End Group
-# Begin Group "extern"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=..\..\blenkey.h
-# End Source File
-# End Group
-# End Group
-# End Target
-# End Project
diff --git a/intern/keymaker/make/msvc_6_0/blenkey.dsw b/intern/keymaker/make/msvc_6_0/blenkey.dsw
deleted file mode 100644
index 4d97144c6ed..00000000000
--- a/intern/keymaker/make/msvc_6_0/blenkey.dsw
+++ /dev/null
@@ -1,29 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "blenkey"=".\blenkey.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/intern/keymaker/make/msvc_7_0/blenkey.sln b/intern/keymaker/make/msvc_7_0/blenkey.sln
deleted file mode 100644
index 5ddf040506e..00000000000
--- a/intern/keymaker/make/msvc_7_0/blenkey.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 7.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blenkey", "blenkey.vcproj", "{E8AF94A5-15FC-432C-9FFD-68D9CD642488}"
-EndProject
-Global
- GlobalSection(SolutionConfiguration) = preSolution
- ConfigName.0 = Debug
- ConfigName.1 = Release
- EndGlobalSection
- GlobalSection(ProjectDependencies) = postSolution
- EndGlobalSection
- GlobalSection(ProjectConfiguration) = postSolution
- {E8AF94A5-15FC-432C-9FFD-68D9CD642488}.Debug.ActiveCfg = Debug|Win32
- {E8AF94A5-15FC-432C-9FFD-68D9CD642488}.Debug.Build.0 = Debug|Win32
- {E8AF94A5-15FC-432C-9FFD-68D9CD642488}.Release.ActiveCfg = Release|Win32
- {E8AF94A5-15FC-432C-9FFD-68D9CD642488}.Release.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- EndGlobalSection
- GlobalSection(ExtensibilityAddIns) = postSolution
- EndGlobalSection
-EndGlobal
diff --git a/intern/keymaker/make/msvc_7_0/blenkey.vcproj b/intern/keymaker/make/msvc_7_0/blenkey.vcproj
deleted file mode 100644
index df24f3da382..00000000000
--- a/intern/keymaker/make/msvc_7_0/blenkey.vcproj
+++ /dev/null
@@ -1,282 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
- ProjectType="Visual C++"
- Version="7.10"
- Name="blenkey"
- SccProjectName=""
- SccLocalPath="">
- <Platforms>
- <Platform
- Name="Win32"/>
- </Platforms>
- <Configurations>
- <Configuration
- Name="Blender Debug|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_7\intern\blenkey\debug"
- IntermediateDirectory="..\..\..\..\..\build\msvc_7\intern\blenkey\debug"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..;..\..\python;..\..\..\..\..\lib\windows\openssl\include"
- PreprocessorDefinitions="WIN32,_DEBUG,_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="1"
- UsePrecompiledHeader="2"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\intern\blenkey\debug\blenkey.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_7\intern\blenkey\debug\"
- ObjectFile="..\..\..\..\..\build\msvc_7\intern\blenkey\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\intern\blenkey\debug\"
- WarningLevel="2"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_7\libs\intern\debug\libblenkey.lib"
- SuppressStartupBanner="TRUE"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying BLENKEY files library (debug target) to lib tree"
- CommandLine="ECHO Copying header files
-IF NOT EXIST ..\..\..\..\..\build\msvc_7\intern\blenkey\include MKDIR ..\..\..\..\..\build\msvc_7\intern\blenkey\include
-XCOPY /Y ..\..\blenkey.h ..\..\..\..\..\build\msvc_7\intern\blenkey\include
-ECHO Done
-"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="Blender Release|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_7\intern\blenkey"
- IntermediateDirectory="..\..\..\..\..\build\msvc_7\intern\blenkey"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..;..\..\python;..\..\..\..\..\lib\windows\openssl\include"
- PreprocessorDefinitions="WIN32,NDEBUG,_LIB"
- StringPooling="TRUE"
- RuntimeLibrary="0"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\intern\blenkey\blenkey.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_7\intern\blenkey\"
- ObjectFile="..\..\..\..\..\build\msvc_7\intern\blenkey\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\intern\blenkey\"
- WarningLevel="2"
- SuppressStartupBanner="TRUE"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_7\libs\intern\libblenkey.lib"
- SuppressStartupBanner="TRUE"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying BLENKEY files library to lib tree"
- CommandLine="ECHO Copying header files
-IF NOT EXIST ..\..\..\..\..\build\msvc_7\intern\blenkey\include MKDIR ..\..\..\..\..\build\msvc_7\intern\blenkey\include
-XCOPY /Y ..\..\blenkey.h ..\..\..\..\..\build\msvc_7\intern\blenkey\include
-ECHO Done
-"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="3DPlugin Release|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll"
- IntermediateDirectory="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..;..\..\python;..\..\..\..\..\lib\windows\openssl\include"
- PreprocessorDefinitions="WIN32,NDEBUG,_LIB"
- StringPooling="TRUE"
- RuntimeLibrary="2"
- EnableFunctionLevelLinking="TRUE"
- UsePrecompiledHeader="2"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\blenkey.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\"
- ObjectFile="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\"
- WarningLevel="2"
- SuppressStartupBanner="TRUE"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_7\libs\intern\mtdll\libblenkey.lib"
- SuppressStartupBanner="TRUE"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying BLENKEY files library to lib tree"
- CommandLine="ECHO Copying header files
-IF NOT EXIST ..\..\..\..\..\build\msvc_7\intern\blenkey\include MKDIR ..\..\..\..\..\build\msvc_7\intern\blenkey\include
-XCOPY /Y ..\..\blenkey.h ..\..\..\..\..\build\msvc_7\intern\blenkey\include
-ECHO Done
-"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="NDEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- <Configuration
- Name="3DPlugin Debug|Win32"
- OutputDirectory="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\debug"
- IntermediateDirectory="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\debug"
- ConfigurationType="4"
- UseOfMFC="0"
- ATLMinimizesCRunTimeLibraryUsage="FALSE"
- CharacterSet="2">
- <Tool
- Name="VCCLCompilerTool"
- Optimization="0"
- AdditionalIncludeDirectories="..\..;..\..\python;..\..\..\..\..\lib\windows\openssl\include"
- PreprocessorDefinitions="WIN32,_DEBUG,_LIB"
- BasicRuntimeChecks="3"
- RuntimeLibrary="3"
- UsePrecompiledHeader="2"
- PrecompiledHeaderFile="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\debug\blenkey.pch"
- AssemblerListingLocation="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\debug\"
- ObjectFile="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\debug\"
- ProgramDataBaseFileName="..\..\..\..\..\build\msvc_7\intern\blenkey\mtdll\debug\"
- WarningLevel="2"
- SuppressStartupBanner="TRUE"
- DebugInformationFormat="3"
- CompileAs="0"/>
- <Tool
- Name="VCCustomBuildTool"/>
- <Tool
- Name="VCLibrarianTool"
- OutputFile="..\..\..\..\..\build\msvc_7\libs\intern\mtdll\debug\libblenkey.lib"
- SuppressStartupBanner="TRUE"/>
- <Tool
- Name="VCMIDLTool"/>
- <Tool
- Name="VCPostBuildEventTool"
- Description="Copying BLENKEY files library (debug target) to lib tree"
- CommandLine="ECHO Copying header files
-IF NOT EXIST ..\..\..\..\..\build\msvc_7\intern\blenkey\include MKDIR ..\..\..\..\..\build\msvc_7\intern\blenkey\include
-XCOPY /Y ..\..\blenkey.h ..\..\..\..\..\build\msvc_7\intern\blenkey\include
-ECHO Done
-"/>
- <Tool
- Name="VCPreBuildEventTool"/>
- <Tool
- Name="VCPreLinkEventTool"/>
- <Tool
- Name="VCResourceCompilerTool"
- PreprocessorDefinitions="_DEBUG"
- Culture="1033"/>
- <Tool
- Name="VCWebServiceProxyGeneratorTool"/>
- <Tool
- Name="VCXMLDataGeneratorTool"/>
- <Tool
- Name="VCManagedWrapperGeneratorTool"/>
- <Tool
- Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
- </Configuration>
- </Configurations>
- <References>
- </References>
- <Files>
- <Filter
- Name="Source Files"
- Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
- <File
- RelativePath="..\..\key.c">
- </File>
- <File
- RelativePath="..\..\keyloader.c">
- </File>
- <File
- RelativePath="..\..\mt19937int.c">
- </File>
- </Filter>
- <Filter
- Name="Header Files"
- Filter="h;hpp;hxx;hm;inl">
- <Filter
- Name="intern"
- Filter="">
- <File
- RelativePath="..\..\key_internal.h">
- </File>
- <File
- RelativePath="..\..\mt19937int.h">
- </File>
- </Filter>
- <Filter
- Name="extern"
- Filter="">
- <File
- RelativePath="..\..\blenkey.h">
- </File>
- </Filter>
- </Filter>
- </Files>
- <Globals>
- </Globals>
-</VisualStudioProject>
diff --git a/intern/keymaker/mt19937int.c b/intern/keymaker/mt19937int.c
deleted file mode 100644
index 9481a48aade..00000000000
--- a/intern/keymaker/mt19937int.c
+++ /dev/null
@@ -1,134 +0,0 @@
-/* A C-program for MT19937: Integer version (1999/10/28) */
-
-/* genrand() generates one pseudorandom unsigned integer (32bit) */
-/* which is uniformly distributed among 0 to 2^32-1 for each */
-/* call. sgenrand(seed) sets initial values to the working area */
-/* of 624 words. Before genrand(), sgenrand(seed) must be */
-/* called once. (seed is any 32-bit integer.) */
-/* Coded by Takuji Nishimura, considering the suggestions by */
-/* Topher Cooper and Marc Rieffel in July-Aug. 1997. */
-
-/* This library is free software under the Artistic license: */
-/* see the file COPYING distributed together with this code. */
-/* For the verification of the code, its output sequence file */
-/* mt19937int.out is attached (2001/4/2) */
-
-/* Copyright (C) 1997, 1999 Makoto Matsumoto and Takuji Nishimura. */
-/* Any feedback is very welcome. For any question, comments, */
-/* see http://www.math.keio.ac.jp/matumoto/emt.html or email */
-/* matumoto@math.keio.ac.jp */
-
-/* REFERENCE */
-/* M. Matsumoto and T. Nishimura, */
-/* "Mersenne Twister: A 623-Dimensionally Equidistributed Uniform */
-/* Pseudo-Random Number Generator", */
-/* ACM Transactions on Modeling and Computer Simulation, */
-/* Vol. 8, No. 1, January 1998, pp 3--30. */
-
-#include<stdio.h>
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include "mt19937int.h"
-
-/* Period parameters */
-#define N 624
-#define M 397
-#define MATRIX_A 0x9908b0df /* constant vector a */
-#define UPPER_MASK 0x80000000 /* most significant w-r bits */
-#define LOWER_MASK 0x7fffffff /* least significant r bits */
-
-/* Tempering parameters */
-#define TEMPERING_MASK_B 0x9d2c5680
-#define TEMPERING_MASK_C 0xefc60000
-#define TEMPERING_SHIFT_U(y) (y >> 11)
-#define TEMPERING_SHIFT_S(y) (y << 7)
-#define TEMPERING_SHIFT_T(y) (y << 15)
-#define TEMPERING_SHIFT_L(y) (y >> 18)
-
-static unsigned long mt[N]; /* the array for the state vector */
-static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */
-
-/* Initializing the array with a seed */
-void sgenrand(signed long seed)
-{
- int i;
-
- for (i=0;i<N;i++) {
- mt[i] = seed & 0xffff0000;
- seed = 69069 * seed + 1;
- mt[i] |= (seed & 0xffff0000) >> 16;
- seed = 69069 * seed + 1;
- }
- mti = N;
-}
-
-/* Initialization by "sgenrand()" is an example. Theoretically, */
-/* there are 2^19937-1 possible states as an intial state. */
-/* This function allows to choose any of 2^19937-1 ones. */
-/* Essential bits in "seed_array[]" is following 19937 bits: */
-/* (seed_array[0]&UPPER_MASK), seed_array[1], ..., seed_array[N-1]. */
-/* (seed_array[0]&LOWER_MASK) is discarded. */
-/* Theoretically, */
-/* (seed_array[0]&UPPER_MASK), seed_array[1], ..., seed_array[N-1] */
-/* can take any values except all zeros. */
-void lsgenrand(unsigned long *seed_array)
- /* the length of seed_array[] must be at least N */
-{
- int i;
-
- for (i=0;i<N;i++)
- mt[i] = seed_array[i];
- mti=N;
-}
-
-unsigned long genrand()
-{
- unsigned long y;
- static unsigned long mag01[2]={0x0, MATRIX_A};
- /* mag01[x] = x * MATRIX_A for x=0,1 */
-
- if (mti >= N) { /* generate N words at one time */
- int kk;
-
- if (mti == N+1) /* if sgenrand() has not been called, */
- sgenrand(4357); /* a default initial seed is used */
-
- for (kk=0;kk<N-M;kk++) {
- y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
- mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1];
- }
- for (;kk<N-1;kk++) {
- y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
- mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1];
- }
- y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
- mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1];
-
- mti = 0;
- }
-
- y = mt[mti++];
- y ^= TEMPERING_SHIFT_U(y);
- y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B;
- y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C;
- y ^= TEMPERING_SHIFT_L(y);
-
- return y;
-}
-
-/* This main() outputs first 1000 generated numbers. */
-/*
-main()
-{
- int i;
-
- sgenrand(4357);
- for (i=0; i<1000; i++) {
- printf("%10lu ", genrand());
- if (i%5==4) printf("\n");
- }
-}
-*/
diff --git a/intern/keymaker/python/key_pyc.h b/intern/keymaker/python/key_pyc.h
deleted file mode 100644
index 16dd15f6e86..00000000000
--- a/intern/keymaker/python/key_pyc.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * $Id$
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-/* generated by keygen.py -- don't edit !! */
-
-
-#define KEYCODELEN 1157
-static unsigned char g_keycode[] = {
- 0x63,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x73,
- 0xb3,0x00,0x00,0x00,0x7f,0x00,0x00,0x7f,0x02,0x00,
- 0x64,0x00,0x00,0x6b,0x00,0x00,0x5a,0x00,0x00,0x7f,
- 0x06,0x00,0x64,0x01,0x00,0x84,0x00,0x00,0x5a,0x01,
- 0x00,0x7f,0x09,0x00,0x64,0x02,0x00,0x84,0x00,0x00,
- 0x5a,0x02,0x00,0x7f,0x11,0x00,0x64,0x03,0x00,0x84,
- 0x00,0x00,0x5a,0x03,0x00,0x7f,0x1c,0x00,0x65,0x00,
- 0x00,0x69,0x04,0x00,0x83,0x00,0x00,0x5a,0x05,0x00,
- 0x7f,0x1d,0x00,0x7f,0x21,0x00,0x65,0x00,0x00,0x69,
- 0x06,0x00,0x83,0x00,0x00,0x5a,0x07,0x00,0x7f,0x22,
- 0x00,0x65,0x08,0x00,0x65,0x07,0x00,0x83,0x01,0x00,
- 0x5a,0x09,0x00,0x7f,0x23,0x00,0x65,0x03,0x00,0x65,
- 0x09,0x00,0x83,0x01,0x00,0x01,0x7f,0x24,0x00,0x78,
- 0x39,0x00,0x65,0x0a,0x00,0x65,0x07,0x00,0x83,0x01,
- 0x00,0x64,0x04,0x00,0x7f,0x24,0x00,0x72,0x26,0x00,
- 0x5a,0x0b,0x00,0x7f,0x25,0x00,0x65,0x00,0x00,0x69,
- 0x0c,0x00,0x65,0x09,0x00,0x65,0x0b,0x00,0x19,0x65,
- 0x00,0x00,0x69,0x0d,0x00,0x65,0x0b,0x00,0x83,0x01,
- 0x00,0x83,0x02,0x00,0x01,0x71,0x82,0x00,0x57,0x64,
- 0x00,0x00,0x53,0x28,0x05,0x00,0x00,0x00,0x4e,0x63,
- 0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x73,0x1c,
- 0x00,0x00,0x00,0x7f,0x06,0x00,0x7f,0x07,0x00,0x7f,
- 0x08,0x00,0x7c,0x00,0x00,0x7c,0x01,0x00,0x7c,0x02,
- 0x00,0x66,0x03,0x00,0x61,0x03,0x00,0x64,0x00,0x00,
- 0x53,0x28,0x01,0x00,0x00,0x00,0x4e,0x28,0x04,0x00,
- 0x00,0x00,0x73,0x01,0x00,0x00,0x00,0x61,0x73,0x01,
- 0x00,0x00,0x00,0x62,0x73,0x01,0x00,0x00,0x00,0x63,
- 0x73,0x05,0x00,0x00,0x00,0x5f,0x73,0x65,0x65,0x64,
- 0x28,0x03,0x00,0x00,0x00,0x73,0x01,0x00,0x00,0x00,
- 0x61,0x73,0x01,0x00,0x00,0x00,0x62,0x73,0x01,0x00,
- 0x00,0x00,0x63,0x73,0x08,0x00,0x00,0x00,0x3c,0x73,
- 0x74,0x72,0x69,0x6e,0x67,0x3e,0x73,0x04,0x00,0x00,
- 0x00,0x73,0x65,0x65,0x64,0x06,0x00,0x73,0x04,0x00,
- 0x00,0x00,0x03,0x01,0x03,0x01,0x63,0x00,0x00,0x03,
- 0x00,0x03,0x00,0x03,0x00,0x73,0x70,0x00,0x00,0x00,
- 0x7f,0x09,0x00,0x7f,0x0a,0x00,0x7f,0x0b,0x00,0x74,
- 0x00,0x00,0x5c,0x03,0x00,0x7d,0x00,0x00,0x7d,0x01,
- 0x00,0x7d,0x02,0x00,0x7f,0x0c,0x00,0x64,0x01,0x00,
- 0x7c,0x00,0x00,0x14,0x64,0x02,0x00,0x16,0x7d,0x00,
- 0x00,0x7f,0x0d,0x00,0x64,0x03,0x00,0x7c,0x01,0x00,
- 0x14,0x64,0x04,0x00,0x16,0x7d,0x01,0x00,0x7f,0x0e,
- 0x00,0x64,0x05,0x00,0x7c,0x02,0x00,0x14,0x64,0x06,
- 0x00,0x16,0x7d,0x02,0x00,0x7f,0x0f,0x00,0x7c,0x00,
- 0x00,0x7c,0x01,0x00,0x7c,0x02,0x00,0x66,0x03,0x00,
- 0x61,0x00,0x00,0x7f,0x10,0x00,0x7c,0x00,0x00,0x7c,
- 0x01,0x00,0x17,0x7c,0x02,0x00,0x17,0x53,0x64,0x00,
- 0x00,0x53,0x28,0x07,0x00,0x00,0x00,0x4e,0x69,0xab,
- 0x00,0x00,0x00,0x69,0x3d,0x76,0x00,0x00,0x69,0xac,
- 0x00,0x00,0x00,0x69,0x63,0x76,0x00,0x00,0x69,0xaa,
- 0x00,0x00,0x00,0x69,0x73,0x76,0x00,0x00,0x28,0x04,
- 0x00,0x00,0x00,0x73,0x05,0x00,0x00,0x00,0x5f,0x73,
- 0x65,0x65,0x64,0x73,0x01,0x00,0x00,0x00,0x61,0x73,
- 0x01,0x00,0x00,0x00,0x62,0x73,0x01,0x00,0x00,0x00,
- 0x63,0x28,0x03,0x00,0x00,0x00,0x73,0x01,0x00,0x00,
- 0x00,0x61,0x73,0x01,0x00,0x00,0x00,0x62,0x73,0x01,
- 0x00,0x00,0x00,0x63,0x73,0x08,0x00,0x00,0x00,0x3c,
- 0x73,0x74,0x72,0x69,0x6e,0x67,0x3e,0x73,0x09,0x00,
- 0x00,0x00,0x72,0x61,0x6e,0x64,0x6f,0x6d,0x69,0x7a,
- 0x65,0x09,0x00,0x73,0x0e,0x00,0x00,0x00,0x03,0x01,
- 0x03,0x01,0x12,0x01,0x11,0x01,0x11,0x01,0x11,0x01,
- 0x12,0x01,0x63,0x01,0x00,0x06,0x00,0x06,0x00,0x03,
- 0x00,0x73,0x8b,0x00,0x00,0x00,0x7f,0x11,0x00,0x7f,
- 0x13,0x00,0x74,0x00,0x00,0x7c,0x00,0x00,0x83,0x01,
- 0x00,0x7d,0x01,0x00,0x7f,0x14,0x00,0x78,0x6f,0x00,
- 0x74,0x03,0x00,0x7c,0x01,0x00,0x83,0x01,0x00,0x64,
- 0x01,0x00,0x7f,0x14,0x00,0x72,0x5c,0x00,0x7d,0x02,
- 0x00,0x7f,0x15,0x00,0x7c,0x01,0x00,0x7c,0x02,0x00,
- 0x18,0x7d,0x03,0x00,0x7f,0x16,0x00,0x74,0x06,0x00,
- 0x74,0x07,0x00,0x83,0x00,0x00,0x7c,0x03,0x00,0x16,
- 0x83,0x01,0x00,0x7d,0x04,0x00,0x7f,0x17,0x00,0x7c,
- 0x00,0x00,0x7c,0x02,0x00,0x19,0x7d,0x05,0x00,0x7f,
- 0x18,0x00,0x7c,0x00,0x00,0x7c,0x02,0x00,0x7c,0x04,
- 0x00,0x17,0x19,0x7c,0x00,0x00,0x7c,0x02,0x00,0x3c,
- 0x7f,0x19,0x00,0x7c,0x05,0x00,0x7c,0x00,0x00,0x7c,
- 0x02,0x00,0x7c,0x04,0x00,0x17,0x3c,0x71,0x24,0x00,
- 0x57,0x64,0x00,0x00,0x53,0x28,0x02,0x00,0x00,0x00,
- 0x4e,0x69,0x00,0x00,0x00,0x00,0x28,0x0a,0x00,0x00,
- 0x00,0x73,0x03,0x00,0x00,0x00,0x6c,0x65,0x6e,0x73,
- 0x04,0x00,0x00,0x00,0x6c,0x69,0x73,0x74,0x73,0x04,
- 0x00,0x00,0x00,0x73,0x69,0x7a,0x65,0x73,0x06,0x00,
- 0x00,0x00,0x78,0x72,0x61,0x6e,0x67,0x65,0x73,0x01,
- 0x00,0x00,0x00,0x69,0x73,0x04,0x00,0x00,0x00,0x6c,
- 0x65,0x66,0x74,0x73,0x03,0x00,0x00,0x00,0x69,0x6e,
- 0x74,0x73,0x09,0x00,0x00,0x00,0x72,0x61,0x6e,0x64,
- 0x6f,0x6d,0x69,0x7a,0x65,0x73,0x01,0x00,0x00,0x00,
- 0x72,0x73,0x03,0x00,0x00,0x00,0x74,0x6d,0x70,0x28,
- 0x06,0x00,0x00,0x00,0x73,0x04,0x00,0x00,0x00,0x6c,
- 0x69,0x73,0x74,0x73,0x04,0x00,0x00,0x00,0x73,0x69,
- 0x7a,0x65,0x73,0x01,0x00,0x00,0x00,0x69,0x73,0x04,
- 0x00,0x00,0x00,0x6c,0x65,0x66,0x74,0x73,0x01,0x00,
- 0x00,0x00,0x72,0x73,0x03,0x00,0x00,0x00,0x74,0x6d,
- 0x70,0x73,0x08,0x00,0x00,0x00,0x3c,0x73,0x74,0x72,
- 0x69,0x6e,0x67,0x3e,0x73,0x04,0x00,0x00,0x00,0x73,
- 0x74,0x69,0x72,0x11,0x00,0x73,0x10,0x00,0x00,0x00,
- 0x03,0x02,0x0f,0x01,0x12,0x00,0x09,0x01,0x0d,0x01,
- 0x16,0x01,0x0d,0x01,0x15,0x01,0x69,0x00,0x00,0x00,
- 0x00,0x28,0x0e,0x00,0x00,0x00,0x73,0x04,0x00,0x00,
- 0x00,0x70,0x72,0x6f,0x74,0x73,0x04,0x00,0x00,0x00,
- 0x73,0x65,0x65,0x64,0x73,0x09,0x00,0x00,0x00,0x72,
- 0x61,0x6e,0x64,0x6f,0x6d,0x69,0x7a,0x65,0x73,0x04,
- 0x00,0x00,0x00,0x73,0x74,0x69,0x72,0x73,0x07,0x00,
- 0x00,0x00,0x67,0x65,0x74,0x73,0x65,0x65,0x64,0x73,
- 0x05,0x00,0x00,0x00,0x5f,0x73,0x65,0x65,0x64,0x73,
- 0x06,0x00,0x00,0x00,0x67,0x65,0x74,0x6c,0x65,0x6e,
- 0x73,0x01,0x00,0x00,0x00,0x6e,0x73,0x05,0x00,0x00,
- 0x00,0x72,0x61,0x6e,0x67,0x65,0x73,0x04,0x00,0x00,
- 0x00,0x6c,0x69,0x73,0x74,0x73,0x06,0x00,0x00,0x00,
- 0x78,0x72,0x61,0x6e,0x67,0x65,0x73,0x01,0x00,0x00,
- 0x00,0x69,0x73,0x06,0x00,0x00,0x00,0x73,0x65,0x74,
- 0x70,0x74,0x72,0x73,0x06,0x00,0x00,0x00,0x67,0x65,
- 0x74,0x70,0x74,0x72,0x28,0x00,0x00,0x00,0x00,0x73,
- 0x08,0x00,0x00,0x00,0x3c,0x73,0x74,0x72,0x69,0x6e,
- 0x67,0x3e,0x73,0x01,0x00,0x00,0x00,0x3f,0x02,0x00,
- 0x73,0x16,0x00,0x00,0x00,0x0f,0x04,0x0c,0x03,0x0c,
- 0x08,0x0c,0x0b,0x0f,0x01,0x03,0x04,0x0f,0x01,0x0f,
- 0x01,0x0d,0x01,0x12,0x00,0x09,0x01
-};
-
diff --git a/intern/make/msvc_7_0/intern.sln b/intern/make/msvc_7_0/intern.sln
index 146a0297dc1..5fdb4ca95d0 100644
--- a/intern/make/msvc_7_0/intern.sln
+++ b/intern/make/msvc_7_0/intern.sln
@@ -8,7 +8,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "build_install_all", "build_
{B093415D-C0F6-4E76-8F5A-6BC1917BCE9E} = {B093415D-C0F6-4E76-8F5A-6BC1917BCE9E}
{E784098D-3ED8-433A-9353-9679415DDDC5} = {E784098D-3ED8-433A-9353-9679415DDDC5}
{76D90B92-ECC7-409C-9F98-A8814B90F3C0} = {76D90B92-ECC7-409C-9F98-A8814B90F3C0}
- {121EC196-8E8A-4937-B0BD-0F114C87D55E} = {121EC196-8E8A-4937-B0BD-0F114C87D55E}
{542A9FA1-B7FF-441C-AE15-054DB31D3488} = {542A9FA1-B7FF-441C-AE15-054DB31D3488}
{213356A9-3A1F-41DA-9819-1297BCD17DEE} = {213356A9-3A1F-41DA-9819-1297BCD17DEE}
{51A348C1-8684-4D67-B980-97B1FC74159B} = {51A348C1-8684-4D67-B980-97B1FC74159B}
@@ -24,10 +23,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MoTo", "..\..\moto\make\msv
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blenkey", "..\..\keymaker\make\msvc_7_0\blenkey.vcproj", "{121EC196-8E8A-4937-B0BD-0F114C87D55E}"
- ProjectSection(ProjectDependencies) = postProject
- EndProjectSection
-EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bmfont", "..\..\bmfont\make\msvc_7_0\bmfont.vcproj", "{E784098D-3ED8-433A-9353-9679415DDDC5}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
@@ -110,6 +105,8 @@ Global
Blender Debug = Blender Debug
Blender Release = Blender Release
EndGlobalSection
+ GlobalSection(ProjectDependencies) = postSolution
+ EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{02110D03-59DB-4571-8787-72B3C03B2F2D}.3DPlugin Debug.ActiveCfg = 3DPlugin Debug|Win32
{02110D03-59DB-4571-8787-72B3C03B2F2D}.3DPlugin Debug.Build.0 = 3DPlugin Debug|Win32
@@ -127,14 +124,6 @@ Global
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.Blender Debug.Build.0 = Blender Debug|Win32
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.Blender Release.ActiveCfg = Blender Release|Win32
{4B6AFCC5-968C-424A-8F20-76E41B3BEF74}.Blender Release.Build.0 = Blender Release|Win32
- {121EC196-8E8A-4937-B0BD-0F114C87D55E}.3DPlugin Debug.ActiveCfg = 3DPlugin Debug|Win32
- {121EC196-8E8A-4937-B0BD-0F114C87D55E}.3DPlugin Debug.Build.0 = 3DPlugin Debug|Win32
- {121EC196-8E8A-4937-B0BD-0F114C87D55E}.3DPlugin Release.ActiveCfg = 3DPlugin Release|Win32
- {121EC196-8E8A-4937-B0BD-0F114C87D55E}.3DPlugin Release.Build.0 = 3DPlugin Release|Win32
- {121EC196-8E8A-4937-B0BD-0F114C87D55E}.Blender Debug.ActiveCfg = Blender Debug|Win32
- {121EC196-8E8A-4937-B0BD-0F114C87D55E}.Blender Debug.Build.0 = Blender Debug|Win32
- {121EC196-8E8A-4937-B0BD-0F114C87D55E}.Blender Release.ActiveCfg = Blender Release|Win32
- {121EC196-8E8A-4937-B0BD-0F114C87D55E}.Blender Release.Build.0 = Blender Release|Win32
{E784098D-3ED8-433A-9353-9679415DDDC5}.3DPlugin Debug.ActiveCfg = 3DPlugin Debug|Win32
{E784098D-3ED8-433A-9353-9679415DDDC5}.3DPlugin Debug.Build.0 = 3DPlugin Debug|Win32
{E784098D-3ED8-433A-9353-9679415DDDC5}.3DPlugin Release.ActiveCfg = 3DPlugin Release|Win32
diff --git a/intern/memutil/MEM_CacheLimiter.h b/intern/memutil/MEM_CacheLimiter.h
index c1c805b6310..13fb6b23446 100644
--- a/intern/memutil/MEM_CacheLimiter.h
+++ b/intern/memutil/MEM_CacheLimiter.h
@@ -68,6 +68,7 @@ extern "C" {
extern int MEM_CacheLimiter_get_maximum();
// this is rather _ugly_!
extern int mem_in_use;
+ extern int mmap_in_use;
};
#endif
@@ -148,7 +149,7 @@ public:
return;
}
for (iterator it = queue.begin();
- it != queue.end() && mem_in_use > max;) {
+ it != queue.end() && mem_in_use + mmap_in_use > max;) {
iterator jt = it;
++it;
(*jt)->destroy_if_possible();
diff --git a/intern/moto/include/MT_Matrix3x3.h b/intern/moto/include/MT_Matrix3x3.h
index fb899a7da96..fb899a7da96 100755..100644
--- a/intern/moto/include/MT_Matrix3x3.h
+++ b/intern/moto/include/MT_Matrix3x3.h
diff --git a/intern/moto/include/MT_Matrix4x4.h b/intern/moto/include/MT_Matrix4x4.h
index fc930055524..fc930055524 100755..100644
--- a/intern/moto/include/MT_Matrix4x4.h
+++ b/intern/moto/include/MT_Matrix4x4.h
diff --git a/intern/moto/include/MT_MinMax.h b/intern/moto/include/MT_MinMax.h
index 06f8a8d18c8..06f8a8d18c8 100755..100644
--- a/intern/moto/include/MT_MinMax.h
+++ b/intern/moto/include/MT_MinMax.h
diff --git a/intern/moto/include/MT_Scalar.h b/intern/moto/include/MT_Scalar.h
index 5cf9f76e592..5cf9f76e592 100755..100644
--- a/intern/moto/include/MT_Scalar.h
+++ b/intern/moto/include/MT_Scalar.h
diff --git a/intern/moto/include/MT_Stream.h b/intern/moto/include/MT_Stream.h
index 49378eceb18..49378eceb18 100755..100644
--- a/intern/moto/include/MT_Stream.h
+++ b/intern/moto/include/MT_Stream.h
diff --git a/intern/moto/include/MT_Tuple2.h b/intern/moto/include/MT_Tuple2.h
index 84280bec50a..84280bec50a 100755..100644
--- a/intern/moto/include/MT_Tuple2.h
+++ b/intern/moto/include/MT_Tuple2.h
diff --git a/intern/moto/include/MT_Tuple3.h b/intern/moto/include/MT_Tuple3.h
index 271e323aab5..271e323aab5 100755..100644
--- a/intern/moto/include/MT_Tuple3.h
+++ b/intern/moto/include/MT_Tuple3.h
diff --git a/intern/moto/include/MT_Tuple4.h b/intern/moto/include/MT_Tuple4.h
index 9a484dbedde..9a484dbedde 100755..100644
--- a/intern/moto/include/MT_Tuple4.h
+++ b/intern/moto/include/MT_Tuple4.h
diff --git a/intern/moto/include/MT_Vector3.h b/intern/moto/include/MT_Vector3.h
index 41291e915be..c35a9d47234 100644
--- a/intern/moto/include/MT_Vector3.h
+++ b/intern/moto/include/MT_Vector3.h
@@ -51,6 +51,7 @@
class MT_Vector3 : public MT_Tuple3 {
public:
+ virtual ~MT_Vector3() {}
MT_Vector3() {}
MT_Vector3(const float *v) : MT_Tuple3(v) {}
MT_Vector3(const double *v) : MT_Tuple3(v) {}
diff --git a/intern/moto/include/MT_Vector4.h b/intern/moto/include/MT_Vector4.h
index fa91abf2a84..5f1ee99d584 100644
--- a/intern/moto/include/MT_Vector4.h
+++ b/intern/moto/include/MT_Vector4.h
@@ -52,6 +52,7 @@
class MT_Vector4 : public MT_Tuple4 {
public:
+ virtual ~MT_Vector4() {}
MT_Vector4() {}
MT_Vector4(const float *v) : MT_Tuple4(v) {}
MT_Vector4(const double *v) : MT_Tuple4(v) {}
diff --git a/intern/moto/include/MT_assert.h b/intern/moto/include/MT_assert.h
index c20f5699ea3..54aea403cda 100644
--- a/intern/moto/include/MT_assert.h
+++ b/intern/moto/include/MT_assert.h
@@ -48,7 +48,7 @@
// file, line, predicate form the message to ask, *do_assert should be set
// to 0 to ignore.
// returns 1 to break, false to ignore
-MT_CDECL int MT_QueryAssert(char *file, int line, char *predicate, int *do_assert);
+MT_CDECL int MT_QueryAssert(const char *file, int line, const char *predicate, int *do_assert);
#ifdef NDEBUG
diff --git a/intern/moto/include/MT_random.h b/intern/moto/include/MT_random.h
index 8a578fa7d09..8a578fa7d09 100755..100644
--- a/intern/moto/include/MT_random.h
+++ b/intern/moto/include/MT_random.h
diff --git a/intern/moto/intern/MT_Assert.cpp b/intern/moto/intern/MT_Assert.cpp
index 999e3da5842..c16c43f2045 100644
--- a/intern/moto/intern/MT_Assert.cpp
+++ b/intern/moto/intern/MT_Assert.cpp
@@ -45,7 +45,7 @@
// Query the user if they want to break/abort the program, ignore the assert, or ignore all future
// occurance of the assert.
-int MT_QueryAssert(char *file, int line, char *predicate, int *do_assert)
+int MT_QueryAssert(const char *file, int line, const char *predicate, int *do_assert)
{
#ifdef _WIN32
if (*do_assert)
diff --git a/intern/moto/intern/MT_CmMatrix4x4.cpp b/intern/moto/intern/MT_CmMatrix4x4.cpp
index 64ff3512c7a..64ff3512c7a 100755..100644
--- a/intern/moto/intern/MT_CmMatrix4x4.cpp
+++ b/intern/moto/intern/MT_CmMatrix4x4.cpp
diff --git a/intern/moto/intern/MT_random.cpp b/intern/moto/intern/MT_random.cpp
index 0c46211c3e8..0c46211c3e8 100755..100644
--- a/intern/moto/intern/MT_random.cpp
+++ b/intern/moto/intern/MT_random.cpp
diff --git a/intern/moto/make/msvc_6_0/MoTo.dsp b/intern/moto/make/msvc_6_0/MoTo.dsp
index 23224fc7fa8..23224fc7fa8 100755..100644
--- a/intern/moto/make/msvc_6_0/MoTo.dsp
+++ b/intern/moto/make/msvc_6_0/MoTo.dsp
diff --git a/intern/moto/make/msvc_6_0/MoTo.dsw b/intern/moto/make/msvc_6_0/MoTo.dsw
index bc76539dd6c..bc76539dd6c 100755..100644
--- a/intern/moto/make/msvc_6_0/MoTo.dsw
+++ b/intern/moto/make/msvc_6_0/MoTo.dsw
diff --git a/intern/opennl/extern/ONL_opennl.h b/intern/opennl/extern/ONL_opennl.h
index 345cf0dc717..be76aa95eac 100644
--- a/intern/opennl/extern/ONL_opennl.h
+++ b/intern/opennl/extern/ONL_opennl.h
@@ -79,20 +79,16 @@ typedef void* NLContext;
#define NL_SYSTEM 0x0
#define NL_MATRIX 0x1
-#define NL_ROW 0x2
/* Solver Parameters */
-#define NL_SOLVER 0x100
-#define NL_NB_VARIABLES 0x101
-#define NL_LEAST_SQUARES 0x102
-#define NL_SYMMETRIC 0x106
-#define NL_ERROR 0x108
-
-/* Row parameters */
-
-#define NL_RIGHT_HAND_SIDE 0x500
-#define NL_ROW_SCALING 0x501
+#define NL_SOLVER 0x100
+#define NL_NB_VARIABLES 0x101
+#define NL_LEAST_SQUARES 0x102
+#define NL_SYMMETRIC 0x106
+#define NL_ERROR 0x108
+#define NL_NB_ROWS 0x110
+#define NL_NB_RIGHT_HAND_SIDES 0x112 /* 4 max */
/* Contexts */
@@ -106,9 +102,6 @@ NLContext nlGetCurrent(void);
void nlSolverParameterf(NLenum pname, NLfloat param);
void nlSolverParameteri(NLenum pname, NLint param);
-void nlRowParameterf(NLenum pname, NLfloat param);
-void nlRowParameteri(NLenum pname, NLint param);
-
void nlGetBooleanv(NLenum pname, NLboolean* params);
void nlGetFloatv(NLenum pname, NLfloat* params);
void nlGetIntergerv(NLenum pname, NLint* params);
@@ -119,8 +112,8 @@ NLboolean nlIsEnabled(NLenum pname);
/* Variables */
-void nlSetVariable(NLuint index, NLfloat value);
-NLfloat nlGetVariable(NLuint index);
+void nlSetVariable(NLuint rhsindex, NLuint index, NLfloat value);
+NLfloat nlGetVariable(NLuint rhsindex, NLuint index);
void nlLockVariable(NLuint index);
void nlUnlockVariable(NLuint index);
NLboolean nlVariableIsLocked(NLuint index);
@@ -129,12 +122,16 @@ NLboolean nlVariableIsLocked(NLuint index);
void nlBegin(NLenum primitive);
void nlEnd(NLenum primitive);
-void nlCoefficient(NLuint index, NLfloat value);
-/* Setting random elements matrix/vector - not for least squares! */
+/* Setting elements in matrix/vector */
void nlMatrixAdd(NLuint row, NLuint col, NLfloat value);
-void nlRightHandSideAdd(NLuint index, NLfloat value);
+void nlRightHandSideAdd(NLuint rhsindex, NLuint index, NLfloat value);
+void nlRightHandSideSet(NLuint rhsindex, NLuint index, NLfloat value);
+
+/* Multiply */
+
+void nlMatrixMultiply(NLfloat *x, NLfloat *y);
/* Solve */
diff --git a/intern/opennl/intern/opennl.c b/intern/opennl/intern/opennl.c
index c5518731c6b..2d30da075d3 100644
--- a/intern/opennl/intern/opennl.c
+++ b/intern/opennl/intern/opennl.c
@@ -207,10 +207,6 @@ static void __nlRowColumnAppend(__NLRowColumn* c, NLint index, NLfloat value) {
c->size++;
}
-static void __nlRowColumnZero(__NLRowColumn* c) {
- c->size = 0;
-}
-
static void __nlRowColumnClear(__NLRowColumn* c) {
c->size = 0;
c->capacity = 0;
@@ -432,48 +428,98 @@ static void __nlSparseMatrixMult(__NLSparseMatrix* A, NLfloat* x, NLfloat* y) {
}
}
+/* ****************** Routines for least squares ******************* */
+
+static void __nlSparseMatrix_square(
+ __NLSparseMatrix* AtA, __NLSparseMatrix *A
+) {
+ NLuint m = A->m;
+ NLuint n = A->n;
+ NLuint i, j0, j1;
+ __NLRowColumn *Ri = NULL;
+ __NLCoeff *c0 = NULL, *c1 = NULL;
+ float value;
+
+ __nlSparseMatrixConstruct(AtA, n, n, A->storage);
+
+ for(i=0; i<m; i++) {
+ Ri = &(A->row[i]);
+
+ for(j0=0; j0<Ri->size; j0++) {
+ c0 = &(Ri->coeff[j0]);
+ for(j1=0; j1<Ri->size; j1++) {
+ c1 = &(Ri->coeff[j1]);
+
+ value = c0->value*c1->value;
+ __nlSparseMatrixAdd(AtA, c0->index, c1->index, value);
+ }
+ }
+ }
+}
+
+static void __nlSparseMatrix_transpose_mult_rows(
+ __NLSparseMatrix* A, NLfloat* x, NLfloat* y
+) {
+ NLuint m = A->m;
+ NLuint n = A->n;
+ NLuint i,ij;
+ __NLRowColumn* Ri = NULL;
+ __NLCoeff* c = NULL;
+
+ __NL_CLEAR_ARRAY(NLfloat, y, n);
+
+ for(i=0; i<m; i++) {
+ Ri = &(A->row[i]);
+ for(ij=0; ij<Ri->size; ij++) {
+ c = &(Ri->coeff[ij]);
+ y[c->index] += c->value * x[i];
+ }
+ }
+}
+
/************************************************************************************/
/* NLContext data structure */
typedef void(*__NLMatrixFunc)(float* x, float* y);
typedef struct {
- NLfloat value;
+ NLfloat value[4];
NLboolean locked;
NLuint index;
+ __NLRowColumn *a;
} __NLVariable;
#define __NL_STATE_INITIAL 0
#define __NL_STATE_SYSTEM 1
#define __NL_STATE_MATRIX 2
-#define __NL_STATE_ROW 3
-#define __NL_STATE_MATRIX_CONSTRUCTED 4
-#define __NL_STATE_SYSTEM_CONSTRUCTED 5
-#define __NL_STATE_SYSTEM_SOLVED 7
+#define __NL_STATE_MATRIX_CONSTRUCTED 3
+#define __NL_STATE_SYSTEM_CONSTRUCTED 4
+#define __NL_STATE_SYSTEM_SOLVED 5
typedef struct {
- NLenum state;
+ NLenum state;
+ NLuint n;
+ NLuint m;
__NLVariable* variable;
- NLuint n;
+ NLfloat* b;
+ NLfloat* Mtb;
__NLSparseMatrix M;
- __NLRowColumn af;
- __NLRowColumn al;
+ __NLSparseMatrix MtM;
NLfloat* x;
- NLfloat* b;
- NLfloat right_hand_side;
- NLuint nb_variables;
- NLuint current_row;
+ NLuint nb_variables;
+ NLuint nb_rows;
NLboolean least_squares;
NLboolean symmetric;
+ NLuint nb_rhs;
NLboolean solve_again;
NLboolean alloc_M;
- NLboolean alloc_af;
- NLboolean alloc_al;
+ NLboolean alloc_MtM;
NLboolean alloc_variable;
NLboolean alloc_x;
NLboolean alloc_b;
- NLfloat error;
- __NLMatrixFunc matrix_vector_prod;
+ NLboolean alloc_Mtb;
+ NLfloat error;
+ __NLMatrixFunc matrix_vector_prod;
struct __NLSuperLUContext {
NLboolean alloc_slu;
@@ -493,8 +539,8 @@ static void __nlMatrixVectorProd_default(NLfloat* x, NLfloat* y) {
NLContext nlNewContext(void) {
__NLContext* result = __NL_NEW(__NLContext);
result->state = __NL_STATE_INITIAL;
- result->right_hand_side = 0.0;
result->matrix_vector_prod = __nlMatrixVectorProd_default;
+ result->nb_rhs = 1;
nlMakeCurrent(result);
return result;
}
@@ -503,27 +549,34 @@ static void __nlFree_SUPERLU(__NLContext *context);
void nlDeleteContext(NLContext context_in) {
__NLContext* context = (__NLContext*)(context_in);
+ int i;
+
if(__nlCurrentContext == context) {
__nlCurrentContext = NULL;
}
if(context->alloc_M) {
__nlSparseMatrixDestroy(&context->M);
}
- if(context->alloc_af) {
- __nlRowColumnDestroy(&context->af);
- }
- if(context->alloc_al) {
- __nlRowColumnDestroy(&context->al);
+ if(context->alloc_MtM) {
+ __nlSparseMatrixDestroy(&context->MtM);
}
if(context->alloc_variable) {
- __NL_DELETE_ARRAY(context->variable);
- }
- if(context->alloc_x) {
- __NL_DELETE_ARRAY(context->x);
+ for(i=0; i<context->nb_variables; i++) {
+ if(context->variable[i].a) {
+ __nlRowColumnDestroy(context->variable[i].a);
+ __NL_DELETE(context->variable[i].a);
+ }
+ }
}
if(context->alloc_b) {
__NL_DELETE_ARRAY(context->b);
}
+ if(context->alloc_Mtb) {
+ __NL_DELETE_ARRAY(context->Mtb);
+ }
+ if(context->alloc_x) {
+ __NL_DELETE_ARRAY(context->x);
+ }
if (context->slu.alloc_slu) {
__nlFree_SUPERLU(context);
}
@@ -561,12 +614,19 @@ void nlSolverParameterf(NLenum pname, NLfloat param) {
__nl_assert(param > 0);
__nlCurrentContext->nb_variables = (NLuint)param;
} break;
+ case NL_NB_ROWS: {
+ __nl_assert(param > 0);
+ __nlCurrentContext->nb_rows = (NLuint)param;
+ } break;
case NL_LEAST_SQUARES: {
__nlCurrentContext->least_squares = (NLboolean)param;
} break;
case NL_SYMMETRIC: {
__nlCurrentContext->symmetric = (NLboolean)param;
- }
+ } break;
+ case NL_NB_RIGHT_HAND_SIDES: {
+ __nlCurrentContext->nb_rhs = (NLuint)param;
+ } break;
default: {
__nl_assert_not_reached;
} break;
@@ -580,32 +640,21 @@ void nlSolverParameteri(NLenum pname, NLint param) {
__nl_assert(param > 0);
__nlCurrentContext->nb_variables = (NLuint)param;
} break;
+ case NL_NB_ROWS: {
+ __nl_assert(param > 0);
+ __nlCurrentContext->nb_rows = (NLuint)param;
+ } break;
case NL_LEAST_SQUARES: {
__nlCurrentContext->least_squares = (NLboolean)param;
} break;
case NL_SYMMETRIC: {
__nlCurrentContext->symmetric = (NLboolean)param;
- }
- default: {
- __nl_assert_not_reached;
} break;
- }
-}
-
-void nlRowParameterf(NLenum pname, NLfloat param) {
- __nlCheckState(__NL_STATE_MATRIX);
- switch(pname) {
- case NL_RIGHT_HAND_SIDE: {
- __nlCurrentContext->right_hand_side = param;
+ case NL_NB_RIGHT_HAND_SIDES: {
+ __nlCurrentContext->nb_rhs = (NLuint)param;
} break;
- }
-}
-
-void nlRowParameteri(NLenum pname, NLint param) {
- __nlCheckState(__NL_STATE_MATRIX);
- switch(pname) {
- case NL_RIGHT_HAND_SIDE: {
- __nlCurrentContext->right_hand_side = (NLfloat)param;
+ default: {
+ __nl_assert_not_reached;
} break;
}
}
@@ -629,6 +678,9 @@ void nlGetFloatv(NLenum pname, NLfloat* params) {
case NL_NB_VARIABLES: {
*params = (NLfloat)(__nlCurrentContext->nb_variables);
} break;
+ case NL_NB_ROWS: {
+ *params = (NLfloat)(__nlCurrentContext->nb_rows);
+ } break;
case NL_LEAST_SQUARES: {
*params = (NLfloat)(__nlCurrentContext->least_squares);
} break;
@@ -649,6 +701,9 @@ void nlGetIntergerv(NLenum pname, NLint* params) {
case NL_NB_VARIABLES: {
*params = (NLint)(__nlCurrentContext->nb_variables);
} break;
+ case NL_NB_ROWS: {
+ *params = (NLint)(__nlCurrentContext->nb_rows);
+ } break;
case NL_LEAST_SQUARES: {
*params = (NLint)(__nlCurrentContext->least_squares);
} break;
@@ -692,16 +747,16 @@ NLboolean nlIsEnabled(NLenum pname) {
/************************************************************************************/
/* Get/Set Lock/Unlock variables */
-void nlSetVariable(NLuint index, NLfloat value) {
+void nlSetVariable(NLuint rhsindex, NLuint index, NLfloat value) {
__nlCheckState(__NL_STATE_SYSTEM);
__nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1);
- __nlCurrentContext->variable[index].value = value;
+ __nlCurrentContext->variable[index].value[rhsindex] = value;
}
-NLfloat nlGetVariable(NLuint index) {
+NLfloat nlGetVariable(NLuint rhsindex, NLuint index) {
__nl_assert(__nlCurrentContext->state != __NL_STATE_INITIAL);
__nl_parano_range_assert(index, 0, __nlCurrentContext->nb_variables - 1);
- return __nlCurrentContext->variable[index].value;
+ return __nlCurrentContext->variable[index].value[rhsindex];
}
void nlLockVariable(NLuint index) {
@@ -726,27 +781,41 @@ NLboolean nlVariableIsLocked(NLuint index) {
/* System construction */
static void __nlVariablesToVector() {
- NLuint i;
- __nl_assert(__nlCurrentContext->alloc_x);
- __nl_assert(__nlCurrentContext->alloc_variable);
- for(i=0; i<__nlCurrentContext->nb_variables; i++) {
- __NLVariable* v = &(__nlCurrentContext->variable[i]);
+ __NLContext *context = __nlCurrentContext;
+ NLuint i, j, nb_rhs;
+
+ __nl_assert(context->alloc_x);
+ __nl_assert(context->alloc_variable);
+
+ nb_rhs= context->nb_rhs;
+
+ for(i=0; i<context->nb_variables; i++) {
+ __NLVariable* v = &(context->variable[i]);
if(!v->locked) {
- __nl_assert(v->index < __nlCurrentContext->n);
- __nlCurrentContext->x[v->index] = v->value;
+ __nl_assert(v->index < context->n);
+
+ for(j=0; j<nb_rhs; j++)
+ context->x[context->n*j + v->index] = v->value[j];
}
}
}
static void __nlVectorToVariables() {
- NLuint i;
- __nl_assert(__nlCurrentContext->alloc_x);
- __nl_assert(__nlCurrentContext->alloc_variable);
- for(i=0; i<__nlCurrentContext->nb_variables; i++) {
- __NLVariable* v = &(__nlCurrentContext->variable[i]);
+ __NLContext *context = __nlCurrentContext;
+ NLuint i, j, nb_rhs;
+
+ __nl_assert(context->alloc_x);
+ __nl_assert(context->alloc_variable);
+
+ nb_rhs= context->nb_rhs;
+
+ for(i=0; i<context->nb_variables; i++) {
+ __NLVariable* v = &(context->variable[i]);
if(!v->locked) {
- __nl_assert(v->index < __nlCurrentContext->n);
- v->value = __nlCurrentContext->x[v->index];
+ __nl_assert(v->index < context->n);
+
+ for(j=0; j<nb_rhs; j++)
+ v->value[j] = context->x[context->n*j + v->index];
}
}
}
@@ -760,8 +829,8 @@ static void __nlBeginSystem() {
__nlTransition(__NL_STATE_INITIAL, __NL_STATE_SYSTEM);
__nlCurrentContext->variable = __NL_NEW_ARRAY(
- __NLVariable, __nlCurrentContext->nb_variables
- );
+ __NLVariable, __nlCurrentContext->nb_variables);
+
__nlCurrentContext->alloc_variable = NL_TRUE;
}
}
@@ -772,159 +841,161 @@ static void __nlEndSystem() {
static void __nlBeginMatrix() {
NLuint i;
- NLuint n = 0;
+ NLuint m = 0, n = 0;
NLenum storage = __NL_ROWS;
+ __NLContext *context = __nlCurrentContext;
__nlTransition(__NL_STATE_SYSTEM, __NL_STATE_MATRIX);
- if (!__nlCurrentContext->solve_again) {
- for(i=0; i<__nlCurrentContext->nb_variables; i++) {
- if(!__nlCurrentContext->variable[i].locked)
- __nlCurrentContext->variable[i].index = n++;
+ if (!context->solve_again) {
+ for(i=0; i<context->nb_variables; i++) {
+ if(context->variable[i].locked) {
+ context->variable[i].index = ~0;
+ context->variable[i].a = __NL_NEW(__NLRowColumn);
+ __nlRowColumnConstruct(context->variable[i].a);
+ }
else
- __nlCurrentContext->variable[i].index = ~0;
+ context->variable[i].index = n++;
}
- __nlCurrentContext->n = n;
-
- /* a least squares problem results in a symmetric matrix */
- if(__nlCurrentContext->least_squares)
- __nlCurrentContext->symmetric = NL_TRUE;
+ m = (context->nb_rows == 0)? n: context->nb_rows;
- if(__nlCurrentContext->symmetric)
- storage = (storage | __NL_SYMMETRIC);
+ context->m = m;
+ context->n = n;
- /* SuperLU storage does not support symmetric storage */
- storage = (storage & ~__NL_SYMMETRIC);
+ __nlSparseMatrixConstruct(&context->M, m, n, storage);
+ context->alloc_M = NL_TRUE;
- __nlSparseMatrixConstruct(&__nlCurrentContext->M, n, n, storage);
- __nlCurrentContext->alloc_M = NL_TRUE;
+ context->b = __NL_NEW_ARRAY(NLfloat, m*context->nb_rhs);
+ context->alloc_b = NL_TRUE;
- __nlCurrentContext->x = __NL_NEW_ARRAY(NLfloat, n);
- __nlCurrentContext->alloc_x = NL_TRUE;
-
- __nlCurrentContext->b = __NL_NEW_ARRAY(NLfloat, n);
- __nlCurrentContext->alloc_b = NL_TRUE;
+ context->x = __NL_NEW_ARRAY(NLfloat, n*context->nb_rhs);
+ context->alloc_x = NL_TRUE;
}
else {
/* need to recompute b only, A is not constructed anymore */
- __NL_CLEAR_ARRAY(NLfloat, __nlCurrentContext->b, __nlCurrentContext->n);
+ __NL_CLEAR_ARRAY(NLfloat, context->b, context->m*context->nb_rhs);
}
__nlVariablesToVector();
+}
- __nlRowColumnConstruct(&__nlCurrentContext->af);
- __nlCurrentContext->alloc_af = NL_TRUE;
- __nlRowColumnConstruct(&__nlCurrentContext->al);
- __nlCurrentContext->alloc_al = NL_TRUE;
+static void __nlEndMatrixRHS(NLuint rhs) {
+ __NLContext *context = __nlCurrentContext;
+ __NLVariable *variable;
+ __NLRowColumn *a;
+ NLfloat *b, *Mtb;
+ NLuint i, j;
- __nlCurrentContext->current_row = 0;
+ b = context->b + context->m*rhs;
+ Mtb = context->Mtb + context->n*rhs;
+
+ for(i=0; i<__nlCurrentContext->nb_variables; i++) {
+ variable = &(context->variable[i]);
+
+ if(variable->locked) {
+ a = variable->a;
+
+ for(j=0; j<a->size; j++) {
+ b[a->coeff[j].index] -= a->coeff[j].value*variable->value[rhs];
+ }
+ }
+ }
+
+ if(context->least_squares)
+ __nlSparseMatrix_transpose_mult_rows(&context->M, b, Mtb);
}
static void __nlEndMatrix() {
+ __NLContext *context = __nlCurrentContext;
+ NLuint i;
+
__nlTransition(__NL_STATE_MATRIX, __NL_STATE_MATRIX_CONSTRUCTED);
- __nlRowColumnDestroy(&__nlCurrentContext->af);
- __nlCurrentContext->alloc_af = NL_FALSE;
- __nlRowColumnDestroy(&__nlCurrentContext->al);
- __nlCurrentContext->alloc_al = NL_FALSE;
-
-#if 0
- if(!__nlCurrentContext->least_squares) {
- __nl_assert(
- __nlCurrentContext->current_row ==
- __nlCurrentContext->n
- );
+ if(context->least_squares) {
+ if(!__nlCurrentContext->solve_again) {
+ __nlSparseMatrix_square(&context->MtM, &context->M);
+ context->alloc_MtM = NL_TRUE;
+
+ context->Mtb =
+ __NL_NEW_ARRAY(NLfloat, context->n*context->nb_rhs);
+ context->alloc_Mtb = NL_TRUE;
+ }
}
-#endif
-}
-static void __nlBeginRow() {
- __nlTransition(__NL_STATE_MATRIX, __NL_STATE_ROW);
- __nlRowColumnZero(&__nlCurrentContext->af);
- __nlRowColumnZero(&__nlCurrentContext->al);
+ for(i=0; i<context->nb_rhs; i++)
+ __nlEndMatrixRHS(i);
}
-static void __nlEndRow() {
- __NLRowColumn* af = &__nlCurrentContext->af;
- __NLRowColumn* al = &__nlCurrentContext->al;
- __NLSparseMatrix* M = &__nlCurrentContext->M;
- NLfloat* b = __nlCurrentContext->b;
- NLuint nf = af->size;
- NLuint nl = al->size;
- NLuint current_row = __nlCurrentContext->current_row;
- NLuint i;
- NLuint j;
- NLfloat S;
- __nlTransition(__NL_STATE_ROW, __NL_STATE_MATRIX);
-
- if(__nlCurrentContext->least_squares) {
- if (!__nlCurrentContext->solve_again) {
- for(i=0; i<nf; i++) {
- for(j=0; j<nf; j++) {
- __nlSparseMatrixAdd(
- M, af->coeff[i].index, af->coeff[j].index,
- af->coeff[i].value * af->coeff[j].value
- );
- }
- }
- }
+void nlMatrixAdd(NLuint row, NLuint col, NLfloat value)
+{
+ __NLContext *context = __nlCurrentContext;
- S = -__nlCurrentContext->right_hand_side;
- for(j=0; j<nl; j++)
- S += al->coeff[j].value;
+ __nlCheckState(__NL_STATE_MATRIX);
- for(i=0; i<nf; i++)
- b[ af->coeff[i].index ] -= af->coeff[i].value * S;
- } else {
- if (!__nlCurrentContext->solve_again) {
- for(i=0; i<nf; i++) {
- __nlSparseMatrixAdd(
- M, current_row, af->coeff[i].index, af->coeff[i].value
- );
- }
- }
- b[current_row] = -__nlCurrentContext->right_hand_side;
- for(i=0; i<nl; i++) {
- b[current_row] -= al->coeff[i].value;
- }
+ if(context->solve_again)
+ return;
+
+ if (!context->least_squares && context->variable[row].locked);
+ else if (context->variable[col].locked) {
+ if(!context->least_squares)
+ row = context->variable[row].index;
+ __nlRowColumnAppend(context->variable[col].a, row, value);
+ }
+ else {
+ __NLSparseMatrix* M = &context->M;
+
+ if(!context->least_squares)
+ row = context->variable[row].index;
+ col = context->variable[col].index;
+
+ __nl_range_assert(row, 0, context->m - 1);
+ __nl_range_assert(col, 0, context->n - 1);
+
+ __nlSparseMatrixAdd(M, row, col, value);
}
- __nlCurrentContext->current_row++;
- __nlCurrentContext->right_hand_side = 0.0;
}
-void nlMatrixAdd(NLuint row, NLuint col, NLfloat value)
+void nlRightHandSideAdd(NLuint rhsindex, NLuint index, NLfloat value)
{
- __NLSparseMatrix* M = &__nlCurrentContext->M;
+ __NLContext *context = __nlCurrentContext;
+ NLfloat* b = context->b;
+
__nlCheckState(__NL_STATE_MATRIX);
- __nl_range_assert(row, 0, __nlCurrentContext->n - 1);
- __nl_range_assert(col, 0, __nlCurrentContext->nb_variables - 1);
- __nl_assert(!__nlCurrentContext->least_squares);
- __nlSparseMatrixAdd(M, row, col, value);
+ if(context->least_squares) {
+ __nl_range_assert(index, 0, context->m - 1);
+ b[rhsindex*context->m + index] += value;
+ }
+ else {
+ if(!context->variable[index].locked) {
+ index = context->variable[index].index;
+ __nl_range_assert(index, 0, context->m - 1);
+
+ b[rhsindex*context->m + index] += value;
+ }
+ }
}
-void nlRightHandSideAdd(NLuint index, NLfloat value)
+void nlRightHandSideSet(NLuint rhsindex, NLuint index, NLfloat value)
{
- NLfloat* b = __nlCurrentContext->b;
+ __NLContext *context = __nlCurrentContext;
+ NLfloat* b = context->b;
__nlCheckState(__NL_STATE_MATRIX);
- __nl_range_assert(index, 0, __nlCurrentContext->n - 1);
- __nl_assert(!__nlCurrentContext->least_squares);
- b[index] += value;
-}
+ if(context->least_squares) {
+ __nl_range_assert(index, 0, context->m - 1);
+ b[rhsindex*context->m + index] = value;
+ }
+ else {
+ if(!context->variable[index].locked) {
+ index = context->variable[index].index;
+ __nl_range_assert(index, 0, context->m - 1);
-void nlCoefficient(NLuint index, NLfloat value) {
- __NLVariable* v;
- unsigned int zero= 0;
- __nlCheckState(__NL_STATE_ROW);
- __nl_range_assert(index, zero, __nlCurrentContext->nb_variables - 1);
- v = &(__nlCurrentContext->variable[index]);
- if(v->locked)
- __nlRowColumnAppend(&(__nlCurrentContext->al), 0, value*v->value);
- else
- __nlRowColumnAppend(&(__nlCurrentContext->af), v->index, value);
+ b[rhsindex*context->m + index] = value;
+ }
+ }
}
void nlBegin(NLenum prim) {
@@ -935,9 +1006,6 @@ void nlBegin(NLenum prim) {
case NL_MATRIX: {
__nlBeginMatrix();
} break;
- case NL_ROW: {
- __nlBeginRow();
- } break;
default: {
__nl_assert_not_reached;
}
@@ -952,9 +1020,6 @@ void nlEnd(NLenum prim) {
case NL_MATRIX: {
__nlEndMatrix();
} break;
- case NL_ROW: {
- __nlEndRow();
- } break;
default: {
__nl_assert_not_reached;
}
@@ -969,7 +1034,7 @@ void nlEnd(NLenum prim) {
static NLboolean __nlFactorize_SUPERLU(__NLContext *context, NLint *permutation) {
/* OpenNL Context */
- __NLSparseMatrix* M = &(context->M);
+ __NLSparseMatrix* M = (context->least_squares)? &context->MtM: &context->M;
NLuint n = context->n;
NLuint nnz = __nlSparseMatrixNNZ(M); /* number of non-zero coeffs */
@@ -986,7 +1051,6 @@ static NLboolean __nlFactorize_SUPERLU(__NLContext *context, NLint *permutation)
superlu_options_t options;
/* Temporary variables */
- __NLRowColumn* Ri = NULL;
NLuint i, jj, count;
__nl_assert(!(M->storage & __NL_SYMMETRIC));
@@ -1049,7 +1113,7 @@ static NLboolean __nlFactorize_SUPERLU(__NLContext *context, NLint *permutation)
/* Cleanup */
Destroy_SuperMatrix_Store(&At);
- Destroy_SuperMatrix_Store(&AtP);
+ Destroy_CompCol_Permuted(&AtP);
__NL_DELETE_ARRAY(etree);
__NL_DELETE_ARRAY(xa);
@@ -1065,31 +1129,33 @@ static NLboolean __nlFactorize_SUPERLU(__NLContext *context, NLint *permutation)
static NLboolean __nlInvert_SUPERLU(__NLContext *context) {
/* OpenNL Context */
- NLfloat* b = context->b;
+ NLfloat* b = (context->least_squares)? context->Mtb: context->b;
NLfloat* x = context->x;
- NLuint n = context->n;
+ NLuint n = context->n, j;
/* SuperLU variables */
SuperMatrix B;
NLint info;
- /* Create superlu array for B */
- sCreate_Dense_Matrix(
- &B, n, 1, b, n,
- SLU_DN, /* Fortran-type column-wise storage */
- SLU_S, /* floats */
- SLU_GE /* general */
- );
+ for(j=0; j<context->nb_rhs; j++, b+=n, x+=n) {
+ /* Create superlu array for B */
+ sCreate_Dense_Matrix(
+ &B, n, 1, b, n,
+ SLU_DN, /* Fortran-type column-wise storage */
+ SLU_S, /* floats */
+ SLU_GE /* general */
+ );
- /* Forward/Back substitution to compute x */
- sgstrs(TRANS, &(context->slu.L), &(context->slu.U),
- context->slu.perm_c, context->slu.perm_r, &B,
- &(context->slu.stat), &info);
+ /* Forward/Back substitution to compute x */
+ sgstrs(TRANS, &(context->slu.L), &(context->slu.U),
+ context->slu.perm_c, context->slu.perm_r, &B,
+ &(context->slu.stat), &info);
- if(info == 0)
- memcpy(x, ((DNformat*)B.Store)->nzval, sizeof(*x)*n);
+ if(info == 0)
+ memcpy(x, ((DNformat*)B.Store)->nzval, sizeof(*x)*n);
- Destroy_SuperMatrix_Store(&B);
+ Destroy_SuperMatrix_Store(&B);
+ }
return (info == 0);
}
@@ -1108,15 +1174,18 @@ static void __nlFree_SUPERLU(__NLContext *context) {
}
void nlPrintMatrix(void) {
- __NLSparseMatrix* M = &(__nlCurrentContext->M);
- float *b = __nlCurrentContext->b;
+ __NLContext *context = __nlCurrentContext;
+ __NLSparseMatrix* M = &(context->M);
+ __NLSparseMatrix* MtM = &(context->MtM);
+ float *b = context->b;
NLuint i, jj, k;
- NLuint n = __nlCurrentContext->n;
+ NLuint m = context->m;
+ NLuint n = context->n;
__NLRowColumn* Ri = NULL;
- float *value = malloc(sizeof(*value)*n);
+ float *value = malloc(sizeof(*value)*(n+m));
printf("A:\n");
- for(i=0; i<n; i++) {
+ for(i=0; i<m; i++) {
Ri = &(M->row[i]);
memset(value, 0.0, sizeof(*value)*n);
@@ -1128,10 +1197,35 @@ void nlPrintMatrix(void) {
printf("\n");
}
- printf("b:\n");
- for(i=0; i<n; i++)
- printf("%f ", b[i]);
- printf("\n");
+ for(k=0; k<context->nb_rhs; k++) {
+ printf("b (%d):\n", k);
+ for(i=0; i<n; i++)
+ printf("%f ", b[context->n*k + i]);
+ printf("\n");
+ }
+
+ if(context->alloc_MtM) {
+ printf("AtA:\n");
+ for(i=0; i<n; i++) {
+ Ri = &(MtM->row[i]);
+
+ memset(value, 0.0, sizeof(*value)*m);
+ for(jj=0; jj<Ri->size; jj++)
+ value[Ri->coeff[jj].index] = Ri->coeff[jj].value;
+
+ for (k = 0; k<n; k++)
+ printf("%.3f ", value[k]);
+ printf("\n");
+ }
+
+ for(k=0; k<context->nb_rhs; k++) {
+ printf("Mtb (%d):\n", k);
+ for(i=0; i<n; i++)
+ printf("%f ", context->Mtb[context->n*k + i]);
+ printf("\n");
+ }
+ printf("\n");
+ }
free(value);
}
diff --git a/intern/string/intern/STR_String.cpp b/intern/string/intern/STR_String.cpp
index c243bc28224..af8f0d11445 100644
--- a/intern/string/intern/STR_String.cpp
+++ b/intern/string/intern/STR_String.cpp
@@ -41,6 +41,7 @@
#include <stdarg.h>
#include <stdlib.h>
#include <ctype.h>
+#include <string.h>
#include "STR_String.h"
/*-------------------------------------------------------------------------------------------------
diff --git a/po/Makefile b/po/Makefile
index 21ec6a662ff..b7288c0e64c 100644
--- a/po/Makefile
+++ b/po/Makefile
@@ -36,7 +36,12 @@ SOURCEDIR = blender/po
include nan_definitions.mk
-LINGUAS = ar bg ca cs de es fr hr it ja nl pl pt_br ro ru sr sr@Latn sv uk zh_CN
+ifeq ($(INTERNTIONAL),true)
+ LINGUAS = ar bg ca cs de es fr hr it ja nl pl pt_BR ro ru sr sr@Latn sv uk zh_CN
+else
+ LINGUAS =
+endif
+
ifeq ($(OS), darwin)
DIR = $(OCGDIR)/bin/blender.app/Contents/Resources/locale/$@/LC_MESSAGES/
else
diff --git a/projectfiles/blender/src/BL_src.dsp b/projectfiles/blender/src/BL_src.dsp
index d55a732a072..d6a1c3945e9 100644
--- a/projectfiles/blender/src/BL_src.dsp
+++ b/projectfiles/blender/src/BL_src.dsp
@@ -43,7 +43,7 @@ RSC=rc.exe
LINK32=link.exe -lib
MTL=midl.exe
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\..\lib\windows\sdl\include\\" /I "..\..\..\source\blender\img" /I "..\..\..\source\blender\renderui" /I "..\..\..\..\lib\windows\soundsystem\include\\" /I "..\..\..\..\lib\windows\python\include\python2.0\\" /I "..\..\..\..\lib\windows\bmfont\include" /I "..\..\..\source\blender\ftfont" /I "..\..\..\..\lib\windows\guardedalloc\include" /I "..\..\..\source\blender\renderconverter" /I "..\..\..\source\blender\verify" /I "..\..\..\source\blender\readstreamglue" /I "..\..\..\source\gameengine\soundsystem\snd_openal" /I "..\..\..\source\blender\imbuf" /I "..\..\..\source\blender\blenloader" /I "..\..\..\source\blender\quicktime" /I "..\..\..\source\kernel\gen_system" /I "..\..\..\source\blender\blenkernel" /I "..\..\..\source\blender\blenlib" /I "..\..\..\source\blender\misc" /I "..\..\..\source\blender\python" /I "..\..\..\source\blender\radiosity\extern\include" /I "..\..\..\source\blender\render\extern\include" /I "..\..\..\source\blender\include" /I "..\..\..\source\blender" /I "..\..\..\source\blender\makesdna" /I "..\..\..\source\gameengine\network" /I "..\..\..\..\lib\windows\decimation\include" /I "..\..\..\source\blender\blenpluginapi\\" /I "..\..\..\..\lib\windows\blenkey\include" /I "..\..\..\..\lib\windows\ghost\include" /I "..\..\..\..\lib\windows\bsp\include" /I "..\..\..\..\lib\windows\opennl\include" /I "..\..\..\intern\elbeem\extern" /I "..\..\..\..\lib\windows\memutil\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_CONSOLE" /D "xGAMEBLENDER" /D "WITH_QUICKTIME" /D "INTERNATIONAL" /FR /J /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\..\lib\windows\sdl\include\\" /I "..\..\..\source\blender\img" /I "..\..\..\source\blender\renderui" /I "..\..\..\..\lib\windows\soundsystem\include\\" /I "..\..\..\..\lib\windows\python\include\python2.0\\" /I "..\..\..\..\lib\windows\bmfont\include" /I "..\..\..\source\blender\ftfont" /I "..\..\..\..\lib\windows\guardedalloc\include" /I "..\..\..\source\blender\renderconverter" /I "..\..\..\source\blender\verify" /I "..\..\..\source\blender\readstreamglue" /I "..\..\..\source\gameengine\soundsystem\snd_openal" /I "..\..\..\source\blender\imbuf" /I "..\..\..\source\blender\blenloader" /I "..\..\..\source\blender\quicktime" /I "..\..\..\source\kernel\gen_system" /I "..\..\..\source\blender\blenkernel" /I "..\..\..\source\blender\blenlib" /I "..\..\..\source\blender\misc" /I "..\..\..\source\blender\python" /I "..\..\..\source\blender\radiosity\extern\include" /I "..\..\..\source\blender\render\extern\include" /I "..\..\..\source\blender\include" /I "..\..\..\source\blender" /I "..\..\..\source\blender\makesdna" /I "..\..\..\source\gameengine\network" /I "..\..\..\..\lib\windows\decimation\include" /I "..\..\..\source\blender\blenpluginapi\\" /I "..\..\..\..\lib\windows\blenkey\include" /I "..\..\..\..\lib\windows\ghost\include" /I "..\..\..\..\lib\windows\bsp\include" /I "..\..\..\..\lib\windows\opennl\include" /I "..\..\..\intern\elbeem\extern" /I "..\..\..\..\lib\windows\memutil\include" /I "..\..\..\..\lib\windows\pthreads\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_CONSOLE" /D "xGAMEBLENDER" /D "WITH_QUICKTIME" /D "INTERNATIONAL" /FR /J /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
@@ -68,7 +68,7 @@ LIB32=link.exe -lib
LINK32=link.exe -lib
MTL=midl.exe
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\..\..\..\lib\windows\sdl\include\\" /I "..\..\..\source\blender\img" /I "..\..\..\source\blender\renderui" /I "..\..\..\..\lib\windows\soundsystem\include\\" /I "..\..\..\..\lib\windows\python\include\python2.0\\" /I "..\..\..\..\lib\windows\bmfont\include" /I "..\..\..\source\blender\ftfont" /I "..\..\..\..\lib\windows\guardedalloc\include" /I "..\..\..\source\blender\renderconverter" /I "..\..\..\source\blender\verify" /I "..\..\..\source\blender\readstreamglue" /I "..\..\..\source\gameengine\soundsystem\snd_openal" /I "..\..\..\source\blender\imbuf" /I "..\..\..\source\blender\blenloader" /I "..\..\..\source\blender\quicktime" /I "..\..\..\source\kernel\gen_system" /I "..\..\..\source\blender\blenkernel" /I "..\..\..\source\blender\blenlib" /I "..\..\..\source\blender\misc" /I "..\..\..\source\blender\python" /I "..\..\..\source\blender\radiosity\extern\include" /I "..\..\..\source\blender\render\extern\include" /I "..\..\..\source\blender\include" /I "..\..\..\source\blender" /I "..\..\..\source\blender\makesdna" /I "..\..\..\source\gameengine\network" /I "..\..\..\..\lib\windows\decimation\include" /I "..\..\..\source\blender\blenpluginapi\\" /I "..\..\..\..\lib\windows\blenkey\include" /I "..\..\..\..\lib\windows\ghost\include" /I "..\..\..\..\lib\windows\bsp\include" /I "..\..\..\..\lib\windows\opennl\include" /I "..\..\..\intern\elbeem\extern" /I "..\..\..\..\lib\windows\memutil\include" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_CONSOLE" /D "xGAMEBLENDER" /D "WITH_QUICKTIME" /D "INTERNATIONAL" /U "_DEBUG" /J /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\..\..\..\lib\windows\sdl\include\\" /I "..\..\..\source\blender\img" /I "..\..\..\source\blender\renderui" /I "..\..\..\..\lib\windows\soundsystem\include\\" /I "..\..\..\..\lib\windows\python\include\python2.0\\" /I "..\..\..\..\lib\windows\bmfont\include" /I "..\..\..\source\blender\ftfont" /I "..\..\..\..\lib\windows\guardedalloc\include" /I "..\..\..\source\blender\renderconverter" /I "..\..\..\source\blender\verify" /I "..\..\..\source\blender\readstreamglue" /I "..\..\..\source\gameengine\soundsystem\snd_openal" /I "..\..\..\source\blender\imbuf" /I "..\..\..\source\blender\blenloader" /I "..\..\..\source\blender\quicktime" /I "..\..\..\source\kernel\gen_system" /I "..\..\..\source\blender\blenkernel" /I "..\..\..\source\blender\blenlib" /I "..\..\..\source\blender\misc" /I "..\..\..\source\blender\python" /I "..\..\..\source\blender\radiosity\extern\include" /I "..\..\..\source\blender\render\extern\include" /I "..\..\..\source\blender\include" /I "..\..\..\source\blender" /I "..\..\..\source\blender\makesdna" /I "..\..\..\source\gameengine\network" /I "..\..\..\..\lib\windows\decimation\include" /I "..\..\..\source\blender\blenpluginapi\\" /I "..\..\..\..\lib\windows\blenkey\include" /I "..\..\..\..\lib\windows\ghost\include" /I "..\..\..\..\lib\windows\bsp\include" /I "..\..\..\..\lib\windows\opennl\include" /I "..\..\..\intern\elbeem\extern" /I "..\..\..\..\lib\windows\memutil\include" /I "..\..\..\..\lib\windows\pthreads\include" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_CONSOLE" /D "xGAMEBLENDER" /D "WITH_QUICKTIME" /D "INTERNATIONAL" /U "_DEBUG" /J /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
diff --git a/projectfiles/blender/src/BL_src_cre.dsp b/projectfiles/blender/src/BL_src_cre.dsp
index ea1992c33d4..1705b45a96f 100644
--- a/projectfiles/blender/src/BL_src_cre.dsp
+++ b/projectfiles/blender/src/BL_src_cre.dsp
@@ -42,7 +42,7 @@ RSC=rc.exe
# PROP Target_Dir ""
LINK32=link.exe -lib
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\..\lib\windows\guardedalloc\include" /I "..\..\..\source\blender\renderui" /I "..\..\..\source\gameengine\soundsystem\\" /I "..\..\..\..\lib\windows\python\include\python2.2\\" /I "..\..\..\source\blender\renderconverter" /I "..\..\..\source\blender\verify" /I "..\..\..\source\blender\readstreamglue" /I "..\..\..\source\gameengine\soundsystem\snd_openal" /I "..\..\..\source\blender\imbuf" /I "..\..\..\source\blender\blenloader" /I "..\..\..\source\kernel\gen_system" /I "..\..\..\source\blender\blenkernel" /I "..\..\..\source\blender\blenlib" /I "..\..\..\source\blender\misc" /I "..\..\..\source\blender\python" /I "..\..\..\source\blender\radiosity\extern\include" /I "..\..\..\source\blender\render\extern\include" /I "..\..\..\source\blender\include" /I "..\..\..\source\blender" /I "..\..\..\source\blender\makesdna" /I "..\..\..\source\gameengine\network" /I "..\..\..\..\lib\windows\decimation\include" /I "..\..\..\source\blender\blenpluginapi\\" /I "..\..\..\..\lib\windows\blenkey\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_CONSOLE" /D "NAN_GAME" /D "GAME" /J /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\..\..\lib\windows\guardedalloc\include" /I "..\..\..\source\blender\renderui" /I "..\..\..\source\gameengine\soundsystem\\" /I "..\..\..\..\lib\windows\python\include\python2.2\\" /I "..\..\..\source\blender\renderconverter" /I "..\..\..\source\blender\verify" /I "..\..\..\source\blender\readstreamglue" /I "..\..\..\source\gameengine\soundsystem\snd_openal" /I "..\..\..\source\blender\imbuf" /I "..\..\..\source\blender\blenloader" /I "..\..\..\source\kernel\gen_system" /I "..\..\..\source\blender\blenkernel" /I "..\..\..\source\blender\blenlib" /I "..\..\..\source\blender\misc" /I "..\..\..\source\blender\python" /I "..\..\..\source\blender\radiosity\extern\include" /I "..\..\..\source\blender\render\extern\include" /I "..\..\..\source\blender\include" /I "..\..\..\source\blender" /I "..\..\..\source\blender\makesdna" /I "..\..\..\source\gameengine\network" /I "..\..\..\..\lib\windows\decimation\include" /I "..\..\..\source\blender\blenpluginapi\\" /I "..\..\..\..\lib\windows\blenkey\include" /I "..\..\..\..\lib\windows\pthreads\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_CONSOLE" /D "NAN_GAME" /D "GAME" /J /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
@@ -66,7 +66,7 @@ LIB32=link.exe -lib
# PROP Target_Dir ""
LINK32=link.exe -lib
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\..\..\..\lib\windows\guardedalloc\include" /I "..\..\..\source\blender\renderui" /I "..\..\..\source\gameengine\soundsystem\\" /I "..\..\..\..\lib\windows\python\include\python2.2\\" /I "..\..\..\source\blender\renderconverter" /I "..\..\..\source\blender\verify" /I "..\..\..\source\blender\readstreamglue" /I "..\..\..\source\gameengine\soundsystem\snd_openal" /I "..\..\..\source\blender\imbuf" /I "..\..\..\source\blender\blenloader" /I "..\..\..\source\kernel\gen_system" /I "..\..\..\source\blender\blenkernel" /I "..\..\..\source\blender\blenlib" /I "..\..\..\source\blender\misc" /I "..\..\..\source\blender\python" /I "..\..\..\source\blender\radiosity\extern\include" /I "..\..\..\source\blender\render\extern\include" /I "..\..\..\source\blender\include" /I "..\..\..\source\blender" /I "..\..\..\source\blender\makesdna" /I "..\..\..\source\gameengine\network" /I "..\..\..\..\lib\windows\decimation\include" /I "..\..\..\source\blender\blenpluginapi\\" /I "..\..\..\..\lib\windows\blenkey\include" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_CONSOLE" /D "NAN_GAME" /D "GAME" /U "_DEBUG" /J /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\..\..\..\lib\windows\guardedalloc\include" /I "..\..\..\source\blender\renderui" /I "..\..\..\source\gameengine\soundsystem\\" /I "..\..\..\..\lib\windows\python\include\python2.2\\" /I "..\..\..\source\blender\renderconverter" /I "..\..\..\source\blender\verify" /I "..\..\..\source\blender\readstreamglue" /I "..\..\..\source\gameengine\soundsystem\snd_openal" /I "..\..\..\source\blender\imbuf" /I "..\..\..\source\blender\blenloader" /I "..\..\..\source\kernel\gen_system" /I "..\..\..\source\blender\blenkernel" /I "..\..\..\source\blender\blenlib" /I "..\..\..\source\blender\misc" /I "..\..\..\source\blender\python" /I "..\..\..\source\blender\radiosity\extern\include" /I "..\..\..\source\blender\render\extern\include" /I "..\..\..\source\blender\include" /I "..\..\..\source\blender" /I "..\..\..\source\blender\makesdna" /I "..\..\..\source\gameengine\network" /I "..\..\..\..\lib\windows\decimation\include" /I "..\..\..\source\blender\blenpluginapi\\" /I "..\..\..\..\lib\windows\blenkey\include" /I "..\..\..\..\lib\windows\pthreads\include" /D "WIN32" /D "_MBCS" /D "_LIB" /D "_CONSOLE" /D "NAN_GAME" /D "GAME" /U "_DEBUG" /J /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
diff --git a/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj b/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
index 55732a1dda7..8f473c85976 100644
--- a/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
+++ b/projectfiles_vc7/blender/blenkernel/BKE_blenkernel.vcproj
@@ -73,8 +73,8 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_7\intern\bsp\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\elbeem\include;..\..\..\..\build\msvc_7\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_7\extern\verse\include"
- PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_FREETYPE2;WITH_VERSE;WITH_OPENEXR"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_7\intern\bmfont\include;..\..\..\..\build\msvc_7\intern\bsp\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\elbeem\include;..\..\..\..\build\msvc_7\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_7\extern\verse\include"
+ PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_FREETYPE2;WITH_VERSE;WITH_OPENEXR;WITH_DDS"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
DefaultCharIsUnsigned="TRUE"
@@ -125,8 +125,8 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_7\intern\bsp\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\elbeem\include;..\..\..\..\build\msvc_7\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_7\extern\verse\include"
- PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_FREETYPE2;UNWRAPPER;WITH_VERSE;WITH_OPENEXR"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\zlib\include;..\..\..\..\build\msvc_7\intern\bmfont\include;..\..\..\..\build\msvc_7\intern\bsp\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\elbeem\include;..\..\..\..\build\msvc_7\intern\iksolver\include;..\..\..\source\blender;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\include;..\..\..\source\blender\python;..\..\..\source\blender\blenlib;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenloader;..\..\..\source\kernel\gen_system;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\gameengine\SoundSystem;..\..\..\..\build\msvc_7\extern\verse\include"
+ PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_FREETYPE2;UNWRAPPER;WITH_VERSE;WITH_OPENEXR;WITH_DDS"
StringPooling="TRUE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="TRUE"
@@ -435,6 +435,15 @@
RelativePath="..\..\..\source\blender\blenkernel\intern\packedFile.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\intern\particle.c">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\blenkernel\intern\particle_system.c">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\blenkernel\intern\pointcache.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\intern\property.c">
</File>
<File
@@ -625,6 +634,9 @@
RelativePath="..\..\..\source\blender\blenkernel\BKE_plugin_types.h">
</File>
<File
+ RelativePath="..\..\..\source\blender\blenkernel\BKE_pointcache.h">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenkernel\BKE_property.h">
</File>
<File
diff --git a/projectfiles_vc7/blender/blenlib/BLI_blenlib.vcproj b/projectfiles_vc7/blender/blenlib/BLI_blenlib.vcproj
index f7038e610f1..0951c40d891 100644
--- a/projectfiles_vc7/blender/blenlib/BLI_blenlib.vcproj
+++ b/projectfiles_vc7/blender/blenlib/BLI_blenlib.vcproj
@@ -365,6 +365,9 @@
RelativePath="..\..\..\source\blender\blenlib\intern\fileops.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\blenlib\intern\fnmatch.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenlib\intern\freetypefont.c">
</File>
<File
@@ -435,6 +438,9 @@
RelativePath="..\..\..\source\blender\blenlib\intern\BLI_fileops.h">
</File>
<File
+ RelativePath="..\..\..\source\blender\blenlib\BLI_fnmatch.h">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\blenlib\BLI_ghash.h">
</File>
<File
diff --git a/projectfiles_vc7/blender/ftfont/FTF_ftfont.vcproj b/projectfiles_vc7/blender/ftfont/FTF_ftfont.vcproj
index ad0f5d83ced..ef756c7b67f 100644
--- a/projectfiles_vc7/blender/ftfont/FTF_ftfont.vcproj
+++ b/projectfiles_vc7/blender/ftfont/FTF_ftfont.vcproj
@@ -21,7 +21,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\freetype\include;..\..\..\..\build\msvc_7\extern\ftgl\include;..\..\..\..\lib\windows\gettext\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\freetype\include;..\..\..\..\build\msvc_7\extern\ftgl\include;..\..\..\..\lib\windows\gettext\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\include"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WCHAR_T16;HAVE_LC_MESSAGES;FTGL_LIBRARY_STATIC"
StringPooling="TRUE"
RuntimeLibrary="0"
@@ -74,7 +74,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\freetype\include;..\..\..\..\build\msvc_7\extern\ftgl\include;..\..\..\..\lib\windows\gettext\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\freetype\include;..\..\..\..\build\msvc_7\extern\ftgl\include;..\..\..\..\lib\windows\gettext\include;..\..\..\source\blender\blenlib;..\..\..\source\blender\makesdna;..\..\..\source\blender\include"
PreprocessorDefinitions="WIN32,_DEBUG,_LIB,WCHAR_T16,HAVE_LC_MESSAGES,FTGL_LIBRARY_STATIC"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
diff --git a/projectfiles_vc7/blender/imbuf/BL_imbuf.vcproj b/projectfiles_vc7/blender/imbuf/BL_imbuf.vcproj
index 61c0a857da1..b7518c0bc82 100644
--- a/projectfiles_vc7/blender/imbuf/BL_imbuf.vcproj
+++ b/projectfiles_vc7/blender/imbuf/BL_imbuf.vcproj
@@ -21,8 +21,8 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\build\msvc_7\intern\memutil\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr"
- PreprocessorDefinitions="_DEBUG,WIN32,_LIB,WITH_QUICKTIME;WITH_OPENEXR"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\build\msvc_7\intern\memutil\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds"
+ PreprocessorDefinitions="_DEBUG;WIN32;_LIB;WITH_QUICKTIME;WITH_OPENEXR;WITH_DDS"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
DefaultCharIsUnsigned="TRUE"
@@ -176,8 +176,8 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\build\msvc_7\intern\memutil\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr"
- PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_QUICKTIME;WITH_OPENEXR"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\jpeg\include;..\..\..\..\lib\windows\zlib\include;..\..\..\..\lib\windows\png\include;..\..\..\..\lib\windows\tiff\include;..\..\..\..\lib\windows\openexr\include;..\..\..\..\lib\windows\openexr\include\Iex;..\..\..\..\lib\windows\openexr\include\Imath;..\..\..\..\lib\windows\openexr\include\IlmImf;..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\build\msvc_7\intern\memutil\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\source\blender\avi;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\include;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\blenloader;..\..\..\source\blender\makesdna;..\..\..\source\blender\imbuf\intern;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\imbuf\intern\openexr;..\..\..\source\blender\imbuf\intern\dds"
+ PreprocessorDefinitions="NDEBUG;WIN32;_LIB;WITH_QUICKTIME;WITH_OPENEXR;WITH_DDS"
StringPooling="TRUE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="TRUE"
@@ -383,12 +383,18 @@
RelativePath="..\..\..\source\blender\imbuf\intern\imageprocess.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\imbuf\intern\imginfo.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\imbuf\intern\iris.c">
</File>
<File
RelativePath="..\..\..\source\blender\imbuf\intern\jpeg.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\imbuf\intern\md5.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\imbuf\intern\openexr\openexr_api.cpp">
</File>
<File
@@ -419,6 +425,9 @@
RelativePath="..\..\..\source\blender\imbuf\intern\targa.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\imbuf\intern\thumbs.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\imbuf\intern\tiff.c">
</File>
<File
@@ -481,6 +490,60 @@
</File>
</Filter>
</Filter>
+ <Filter
+ Name="dds"
+ Filter="">
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\BlockDXT.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\ColorBlock.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\dds_api.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\DirectDrawSurface.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\Image.cpp">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\Stream.cpp">
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="">
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\BlockDXT.h">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\Color.h">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\ColorBlock.h">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\Common.h">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\dds_api.h">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\DirectDrawSurface.h">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\Image.h">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\imbuf\intern\dds\Stream.h">
+ </File>
+ </Filter>
+ </Filter>
</Filter>
<Filter
Name="Header Files"
@@ -534,6 +597,9 @@
RelativePath="..\..\..\source\blender\imbuf\IMB_imbuf_types.h">
</File>
<File
+ RelativePath="..\..\..\source\blender\imbuf\intern\IMB_imginfo.h">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_iris.h">
</File>
<File
@@ -549,6 +615,9 @@
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_targa.h">
</File>
<File
+ RelativePath="..\..\..\source\blender\imbuf\IMB_thumbs.h">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\imbuf\intern\IMB_tiff.h">
</File>
<File
diff --git a/projectfiles_vc7/blender/nodes/nodes.vcproj b/projectfiles_vc7/blender/nodes/nodes.vcproj
index 410b160a679..04403630664 100644
--- a/projectfiles_vc7/blender/nodes/nodes.vcproj
+++ b/projectfiles_vc7/blender/nodes/nodes.vcproj
@@ -240,6 +240,9 @@
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_composite.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_crop.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_curves.c">
</File>
<File
@@ -264,6 +267,9 @@
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_gamma.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_glare.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_hueSatVal.c">
</File>
<File
@@ -276,6 +282,9 @@
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_invert.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_lensdist.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_lummaMatte.c">
</File>
<File
@@ -294,6 +303,9 @@
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_normal.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_normalize.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_outputFile.c">
</File>
<File
@@ -327,6 +339,9 @@
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_texture.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_tonemap.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\nodes\intern\CMP_nodes\CMP_translate.c">
</File>
<File
@@ -358,6 +373,9 @@
RelativePath="..\..\..\source\blender\nodes\intern\SHD_nodes\SHD_geom.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\nodes\intern\SHD_nodes\SHD_hueSatVal.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\nodes\intern\SHD_nodes\SHD_invert.c">
</File>
<File
@@ -382,6 +400,9 @@
RelativePath="..\..\..\source\blender\nodes\intern\SHD_nodes\SHD_rgb.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\nodes\intern\SHD_nodes\SHD_sepcombRGB.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\nodes\intern\SHD_nodes\SHD_squeeze.c">
</File>
<File
diff --git a/projectfiles_vc7/blender/render/BRE_render.vcproj b/projectfiles_vc7/blender/render/BRE_render.vcproj
index c04d456fc33..2383f41b69b 100644
--- a/projectfiles_vc7/blender/render/BRE_render.vcproj
+++ b/projectfiles_vc7/blender/render/BRE_render.vcproj
@@ -146,7 +146,10 @@
RelativePath="..\..\..\source\blender\render\intern\source\pixelshading.c">
</File>
<File
- RelativePath="..\..\..\source\blender\render\intern\source\ray.c">
+ RelativePath="..\..\..\source\blender\render\intern\source\rayshade.c">
+ </File>
+ <File
+ RelativePath="..\..\..\source\blender\render\intern\source\raytrace.c">
</File>
<File
RelativePath="..\..\..\source\blender\render\intern\source\rendercore.c">
diff --git a/projectfiles_vc7/blender/src/BL_src.vcproj b/projectfiles_vc7/blender/src/BL_src.vcproj
index af367ac2ce3..6cc8f27f398 100644
--- a/projectfiles_vc7/blender/src/BL_src.vcproj
+++ b/projectfiles_vc7/blender/src/BL_src.vcproj
@@ -21,8 +21,8 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\..\build\msvc_7\intern\bsp\include;..\..\..\..\build\msvc_7\intern\ghost\include;..\..\..\..\build\msvc_7\intern\elbeem\include;..\..\..\..\build\msvc_7\intern\opennl\include;..\..\..\..\build\msvc_7\intern\bmfont\include;..\..\..\..\build\msvc_7\intern\blenkey\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\memutil\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\build\msvc_7\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_7\extern\verse\include"
- PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER=1;WITH_QUICKTIME;INTERNATIONAL;WITH_VERSE;WITH_OPENEXR"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\..\build\msvc_7\intern\bsp\include;..\..\..\..\build\msvc_7\intern\ghost\include;..\..\..\..\build\msvc_7\intern\elbeem\include;..\..\..\..\build\msvc_7\intern\opennl\include;..\..\..\..\build\msvc_7\intern\bmfont\include;..\..\..\..\build\msvc_7\intern\blenkey\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\memutil\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\build\msvc_7\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_7\extern\verse\include;..\..\..\..\lib\windows\pthreads\include"
+ PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER=1;WITH_QUICKTIME;INTERNATIONAL;WITH_VERSE;WITH_OPENEXR;WITH_DDS"
StringPooling="TRUE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="TRUE"
@@ -73,8 +73,8 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\..\build\msvc_7\intern\bsp\include;..\..\..\..\build\msvc_7\intern\ghost\include;..\..\..\..\build\msvc_7\intern\elbeem\include;..\..\..\..\build\msvc_7\intern\opennl\include;..\..\..\..\build\msvc_7\intern\bmfont\include;..\..\..\..\build\msvc_7\intern\blenkey\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\memutil\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\build\msvc_7\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_7\extern\verse\include"
- PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER;WITH_QUICKTIME;INTERNATIONAL;WITH_VERSE;WITH_OPENEXR"
+ AdditionalIncludeDirectories="..\..\..\..\lib\windows\QTDevWin\CIncludes;..\..\..\..\lib\windows\sdl\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\..\build\msvc_7\intern\bsp\include;..\..\..\..\build\msvc_7\intern\ghost\include;..\..\..\..\build\msvc_7\intern\elbeem\include;..\..\..\..\build\msvc_7\intern\opennl\include;..\..\..\..\build\msvc_7\intern\bmfont\include;..\..\..\..\build\msvc_7\intern\blenkey\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\memutil\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\build\msvc_7\intern\soundsystem\include;..\..\..\source\blender;..\..\..\source\blender\img;..\..\..\source\blender\verify;..\..\..\source\blender\ftfont;..\..\..\source\blender\misc;..\..\..\source\blender\imbuf;..\..\..\source\blender\blenlib;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\quicktime;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\nodes;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\renderconverter;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\build\msvc_7\extern\verse\include;..\..\..\..\lib\windows\pthreads\include"
+ PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CONSOLE;GAMEBLENDER;WITH_QUICKTIME;INTERNATIONAL;WITH_VERSE;WITH_OPENEXR;WITH_DDS"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
DefaultCharIsUnsigned="TRUE"
@@ -308,6 +308,9 @@
RelativePath="..\..\..\source\blender\src\editoops.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\src\editparticle.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\src\editscreen.c">
</File>
<File
@@ -329,12 +332,18 @@
RelativePath="..\..\..\source\blender\src\eventdebug.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\src\filelist.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\src\filesel.c">
</File>
<File
RelativePath="..\..\..\source\blender\src\fluidsim.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\src\fsmenu.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\src\ghostwinlay.c">
</File>
<File
@@ -425,6 +434,9 @@
RelativePath="..\..\..\source\blender\src\mainqueue.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\src\meshlaplacian.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\src\meshtools.c">
</File>
<File
@@ -461,6 +473,9 @@
RelativePath="..\..\..\source\blender\src\previewrender.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\src\prvicons.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\src\renderwin.c">
</File>
<File
@@ -476,6 +491,9 @@
RelativePath="..\..\..\source\blender\src\screendump.c">
</File>
<File
+ RelativePath="..\..\..\source\blender\src\sculptmode-stroke.c">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\src\sculptmode.c">
</File>
<File
@@ -660,6 +678,9 @@
RelativePath="..\..\..\source\blender\include\BIF_editoops.h">
</File>
<File
+ RelativePath="..\..\..\source\blender\include\BIF_editparticle.h">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\include\BIF_editsca.h">
</File>
<File
@@ -675,6 +696,9 @@
RelativePath="..\..\..\source\blender\include\BIF_editview.h">
</File>
<File
+ RelativePath="..\..\..\source\blender\include\BIF_filelist.h">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\include\BIF_fsmenu.h">
</File>
<File
@@ -705,6 +729,9 @@
RelativePath="..\..\..\source\blender\include\BIF_mainqueue.h">
</File>
<File
+ RelativePath="..\..\..\source\blender\include\BIF_meshlaplacian.h">
+ </File>
+ <File
RelativePath="..\..\..\source\blender\include\BIF_meshtools.h">
</File>
<File
diff --git a/projectfiles_vc7/blender/src/BL_src_cre.vcproj b/projectfiles_vc7/blender/src/BL_src_cre.vcproj
index 1f0b4e9e8d4..70de861c91c 100644
--- a/projectfiles_vc7/blender/src/BL_src_cre.vcproj
+++ b/projectfiles_vc7/blender/src/BL_src_cre.vcproj
@@ -21,7 +21,7 @@
<Tool
Name="VCCLCompilerTool"
Optimization="0"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_7\intern\blenkey\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\source\blender;..\..\..\source\blender\misc;..\..\..\source\blender\verify;..\..\..\source\blender\blenlib;..\..\..\source\blender\imbuf;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem;..\..\..\source\gameengine\soundsystem\snd_openal"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_7\intern\blenkey\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\source\blender;..\..\..\source\blender\misc;..\..\..\source\blender\verify;..\..\..\source\blender\blenlib;..\..\..\source\blender\imbuf;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\lib\windows\pthreads\include"
PreprocessorDefinitions="_DEBUG,WIN32,_LIB,_CONSOLE,NAN_GAME,GAME"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
@@ -74,7 +74,7 @@
<Tool
Name="VCCLCompilerTool"
InlineFunctionExpansion="1"
- AdditionalIncludeDirectories="..\..\..\..\build\msvc_7\intern\blenkey\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\source\blender;..\..\..\source\blender\misc;..\..\..\source\blender\verify;..\..\..\source\blender\blenlib;..\..\..\source\blender\imbuf;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem;..\..\..\source\gameengine\soundsystem\snd_openal"
+ AdditionalIncludeDirectories="..\..\..\..\build\msvc_7\intern\blenkey\include;..\..\..\..\build\msvc_7\intern\decimation\include;..\..\..\..\build\msvc_7\intern\guardedalloc\include;..\..\..\..\lib\windows\python\include\python2.5;..\..\..\source\blender;..\..\..\source\blender\misc;..\..\..\source\blender\verify;..\..\..\source\blender\blenlib;..\..\..\source\blender\imbuf;..\..\..\source\blender\python;..\..\..\source\blender\include;..\..\..\source\blender\renderui;..\..\..\source\blender\blenloader;..\..\..\source\blender\blenkernel;..\..\..\source\blender\makesdna;..\..\..\source\blender\blenpluginapi;..\..\..\source\blender\readstreamglue;..\..\..\source\blender\renderconverter;..\..\..\source\blender\render\extern\include;..\..\..\source\blender\radiosity\extern\include;..\..\..\source\kernel\gen_system;..\..\..\source\gameengine\network;..\..\..\source\gameengine\soundsystem;..\..\..\source\gameengine\soundsystem\snd_openal;..\..\..\..\lib\windows\pthreads\include"
PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CONSOLE;NAN_GAME;GAME"
StringPooling="TRUE"
RuntimeLibrary="0"
diff --git a/release/Makefile b/release/Makefile
index 2791982a6fa..c55e62be003 100644
--- a/release/Makefile
+++ b/release/Makefile
@@ -33,52 +33,56 @@ include nan_definitions.mk
export VERSION := $(shell cat VERSION)
-BLENDNAME=blender-$(VERSION)-$(CONFIG_GUESS)$(TYPE)
+BLENDNAME=blender-$(VERSION)-$(CONFIG_GUESS)-py$(NAN_PYTHON_VERSION)$(TYPE)
export DISTDIR=$(NAN_OBJDIR)/$(BLENDNAME)
export CONFDIR=$(DISTDIR)/.blender
+ifeq ($(OS),beos)
+ TAR="zip"
+ TARFLAGS="-ry9"
+ EXT0=""
+ EXT1=".zip"
+ COMPRESS=""
+ EXT2=""
+ NOPLUGINS="true"
+endif
+
+ifeq ($(OS),$(findstring $(OS), "freebsd irix linux openbsd solaris"))
+ TAR="tar"
+ TARFLAGS="cf"
+ EXT0=""
+ EXT1=".tar"
+ COMPRESS="bzip2"
+ COMPRESSFLAGS="-f"
+ EXT2=".bz2"
+endif
+
+ifeq ($(OS),windows)
+ TAR="zip"
+ TARFLAGS="-r9"
+ EXT0=".exe"
+ EXT1=".zip"
+ NOPLUGINS="true"
+ NOSTRIP="true"
+endif
+
+ifeq ($(OS),darwin)
+ TAR="tar"
+ TARFLAGS="cf"
+ EXT0=".app"
+ EXT1=".tar"
+ COMPRESS="bzip2"
+ COMPRESSFLAGS="-f"
+ EXT2=".bz2"
+endif
release: all
all:
- ifeq ($(OS),beos)
- @$(MAKE) pkg TYPE="" TAR="zip -ry9" EXT1=".zip" NOPLUGINS="true"
- endif
- ifeq ($(OS),freebsd)
- @$(MAKE) pkg TYPE="" TAR="tar cf" EXT1=".tar" \
- COMPRESS="bzip2 -f" EXT2=".bz2"
- endif
- ifeq ($(OS),irix)
- @$(MAKE) pkg TYPE="" TAR="tar cf" EXT1=".tar" \
- COMPRESS="bzip2 -f" EXT2=".bz2"
- endif
- ifeq ($(OS),linux)
- ifeq ($(CPU),alpha)
- @$(MAKE) pkg TYPE="" TAR="tar cf" EXT1=".tar" \
- COMPRESS="bzip2 -f" EXT2=".bz2"
- else
- @$(MAKE) pkg TYPE="" TAR="tar cf" EXT1=".tar" \
- COMPRESS="bzip2 -f" EXT2=".bz2"
- @$(MAKE) pkg TYPE="-static" TAR="tar cf" EXT1=".tar" \
- COMPRESS="bzip2 -f" EXT2=".bz2"
- endif
- endif
- ifeq ($(OS),openbsd)
- @$(MAKE) pkg TYPE="-static" TAR="tar cf" EXT1=".tar" \
- COMPRESS="bzip2 -f" EXT2=".bz2"
- endif
- ifeq ($(OS),solaris)
- @$(MAKE) pkg TYPE="" TAR="tar cf" EXT1=".tar" \
- COMPRESS="bzip2 -f" EXT2=".bz2"
- endif
- ifeq ($(OS),windows)
- @$(MAKE) pkg TYPE="" TAR="zip -r9" EXT0=".exe" EXT1=".zip" \
- NOPLUGINS="true" NOSTRIP="true"
- endif
- ifeq ($(OS),darwin)
- @$(MAKE) pkg TYPE="" TAR="tar cf" EXT0"=.app" EXT1=".tar" \
- COMPRESS="bzip2 -f" EXT2=".bz2"
- endif
+ @$(MAKE) pkg TYPE=""
+ifeq ($(WITH_BF_STATICOPENGL), true)
+ @$(MAKE) pkg TYPE="-static"
+endif
# OS independent targets below:
@@ -112,8 +116,9 @@ install: package
ifneq ($(OS), darwin)
@[ ! -d $(OCGDIR)/bin/.blender ] || \
cp -r $(OCGDIR)/bin/.blender $(DISTDIR)
- cp $(NANBLENDERHOME)/bin/.blender/.Blanguages $(CONFDIR)
- cp $(NANBLENDERHOME)/bin/.blender/.bfont.ttf $(CONFDIR)
+ @rm -rf $(DISTDIR)/.svn $(DISTDIR)/*/.svn $(DISTDIR)/*/*/.svn
+ @cp $(NANBLENDERHOME)/bin/.blender/.Blanguages $(CONFDIR)
+ @cp $(NANBLENDERHOME)/bin/.blender/.bfont.ttf $(CONFDIR)
endif
@echo "----> Copy blender$(EXT0) executable"
ifeq ($(TYPE),-static)
@@ -137,7 +142,7 @@ ifneq ($(NOPLUGINS),true)
@cp ../source/blender/blenpluginapi/*.h $(DISTDIR)/plugins/include/
@chmod 755 $(DISTDIR)/plugins/bmake
@$(MAKE) -C $(DISTDIR)/plugins all > /dev/null || exit 1;
- @rm -fr $(DISTDIR)/plugins/CVS $(DISTDIR)/plugins/*/CVS \
+ @rm -fr $(DISTDIR)/plugins/.svn $(DISTDIR)/plugins/*/.svn \
$(DISTDIR)/plugins/*/*.o
#on OS X the plugins move to the installation directory
@@ -151,7 +156,7 @@ endif
@echo "----> Copy python infrastructure"
@[ ! -d scripts ] || cp -r scripts $(CONFDIR)/scripts
- @[ ! -d $(CONFDIR)/scripts ] || rm -fr $(CONFDIR)/scripts/CVS
+ @[ ! -d $(CONFDIR)/scripts ] || rm -fr $(CONFDIR)/scripts/.svn $(CONFDIR)/scripts/*/.svn $(CONFDIR)/scripts/*/*/.svn
ifeq ($(OS),darwin)
@echo "----> Move .blender to .app/Contents/MacOS/"
@@ -178,12 +183,11 @@ pkg: install
@echo "----> Create distribution file $(BLENDNAME)$(EXT1)"
@#enable the next sleep if you get 'tar file changed while reading'
@#sleep 10
- @cd $(NAN_OBJDIR) && \
- rm -f $(VERSION)/$(BLENDNAME)$(EXT1)* && \
- $(TAR) $(VERSION)/$(BLENDNAME)$(EXT1) $(BLENDNAME)
+ rm -f $(NAN_OBJDIR)/$(VERSION)/$(BLENDNAME)$(EXT1)*
+ @cd $(NAN_OBJDIR) && $(TAR) $(TARFLAGS) $(VERSION)/$(BLENDNAME)$(EXT1) $(BLENDNAME)
ifdef COMPRESS
@echo "----> Compressing distribution to $(BLENDNAME)$(EXT1)$(EXT2)"
- @$(COMPRESS) $(NAN_OBJDIR)/$(VERSION)/$(BLENDNAME)$(EXT1)
+ @$(COMPRESS) $(COMPRESSFLAGS) $(NAN_OBJDIR)/$(VERSION)/$(BLENDNAME)$(EXT1)
endif
@#echo "****> Clean up temporary distribution directory"
@rm -fr $(DISTDIR)
diff --git a/release/datafiles/blenderbuttons b/release/datafiles/blenderbuttons
index 7c2db223c74..d447b3b4f2c 100644
--- a/release/datafiles/blenderbuttons
+++ b/release/datafiles/blenderbuttons
Binary files differ
diff --git a/release/datafiles/preview.blend b/release/datafiles/preview.blend
index 8d67a88f679..c39c26b063d 100644
--- a/release/datafiles/preview.blend
+++ b/release/datafiles/preview.blend
Binary files differ
diff --git a/release/datafiles/prvicons b/release/datafiles/prvicons
new file mode 100644
index 00000000000..de3980f9676
--- /dev/null
+++ b/release/datafiles/prvicons
Binary files differ
diff --git a/release/datafiles/splash.jpg b/release/datafiles/splash.jpg
new file mode 100644
index 00000000000..da88c0b8eaa
--- /dev/null
+++ b/release/datafiles/splash.jpg
Binary files differ
diff --git a/release/scripts/3ds_import.py b/release/scripts/3ds_import.py
index 56acc50e38d..07da4df1603 100644
--- a/release/scripts/3ds_import.py
+++ b/release/scripts/3ds_import.py
@@ -1,7 +1,7 @@
#!BPY
"""
Name: '3D Studio (.3ds)...'
-Blender: 241
+Blender: 244
Group: 'Import'
Tooltip: 'Import from 3DS file format (.3ds)'
"""
@@ -382,7 +382,7 @@ def process_next_chunk(file, previous_chunk, importedObjects, IMAGE_SEARCH):
# +1 because of DUMMYVERT
face_mapping= bmesh.faces.extend( [ [ bmesh_verts[ myVertMapping[vindex]+1] for vindex in myContextMesh_facels[fIdx]] for fIdx in faces ], indexList=True )
- if contextMeshUV or img:
+ if bmesh.faces and (contextMeshUV or img):
bmesh.faceUV= 1
for ii, i in enumerate(faces):
@@ -945,6 +945,7 @@ if __name__=='__main__' and not DEBUG:
#load_3ds('/metavr/convert/vehicle/truck_002/TruckTanker1.3DS', False)
#load_3ds('/metavr/archive/convert/old/arranged_3ds_to_hpx-2/only-need-engine-trains/Engine2.3DS', False)
'''
+
else:
# DEBUG ONLY
TIME= Blender.sys.time()
@@ -956,6 +957,11 @@ else:
file= open('/tmp/temp3ds_list', 'r')
lines= file.readlines()
file.close()
+ # sort by filesize for faster testing
+ lines_size = [(os.path.getsize(f[:-1]), f[:-1]) for f in lines]
+ lines_size.sort()
+ lines = [f[1] for f in lines_size]
+
def between(v,a,b):
if v <= max(a,b) and v >= min(a,b):
@@ -963,8 +969,8 @@ else:
return False
for i, _3ds in enumerate(lines):
- if between(i, 1,200):
- _3ds= _3ds[:-1]
+ if between(i, 650,800):
+ #_3ds= _3ds[:-1]
print 'Importing', _3ds, '\nNUMBER', i, 'of', len(lines)
_3ds_file= _3ds.split('/')[-1].split('\\')[-1]
newScn= Blender.Scene.New(_3ds_file)
@@ -972,4 +978,5 @@ else:
load_3ds(_3ds, False)
print 'TOTAL TIME: %.6f' % (Blender.sys.time() - TIME)
+
''' \ No newline at end of file
diff --git a/release/scripts/DirectX8Importer.py b/release/scripts/DirectX8Importer.py
index 7e6a8429759..0dda654944d 100644
--- a/release/scripts/DirectX8Importer.py
+++ b/release/scripts/DirectX8Importer.py
@@ -2,7 +2,7 @@
""" Registration info for Blender menus:
Name: 'DirectX(.x)...'
-Blender: 240
+Blender: 244
Group: 'Import'
Tip: 'Import from DirectX text file format format.'
@@ -25,7 +25,7 @@ Tip: 'Import from DirectX text file format format.'
# Grab the latest version here :www.omariben.too.it
import bpy
import Blender
-from Blender import NMesh,Object,Material,Texture,Image,Draw
+from Blender import Mesh,Object,Material,Texture,Image,Draw
class xImport:
@@ -41,13 +41,16 @@ class xImport:
lines = self.lines
print "importing into Blender ..."
scene = bpy.data.scenes.active
- mesh = NMesh.GetRaw()
+
+ mesh_indicies = {} # the index of each 'Mesh' is used as the key for those meshes indicies
+ context_indicies = None # will raise an error if used!
+
+
#Get the line of Texture Coords
nr_uv_ind = 0
#Get Materials
nr_fac_mat = 0
- idx = 0
i = -1
mat_list = []
tex_list = []
@@ -56,31 +59,33 @@ class xImport:
l = line.strip()
words = line.split()
if words[0] == "Material" :
- idx += 1
- self.writeMaterials(j, idx, mat_list, tex_list)
+ #context_indicies["Material"] = j
+ self.loadMaterials(j, mat_list, tex_list)
elif words[0] == "MeshTextureCoords" :
- nr_uv_ind = j
+ context_indicies["MeshTextureCoords"] = j
+ #nr_uv_ind = j
elif words[0] == "MeshMaterialList" :
- nr_fac_mat = j + 2
+ context_indicies["MeshMaterialList"] = j+2
+ #nr_fac_mat = j + 2
elif words[0] == "Mesh": # Avoid a second loop
- mesh_line_indicies.append(j)
-
- #Create The Mesh
- for nr_vr_ind in mesh_line_indicies:
- self.writeVertices(nr_vr_ind, mesh, nr_uv_ind, nr_fac_mat, tex_list)
-
- mesh.setMaterials(mat_list)
- if nr_fac_mat:
- self.writeMeshMaterials(nr_fac_mat, mesh)
- NMesh.PutRaw(mesh,"Mesh",1)
-
+ context_indicies = mesh_indicies[j] = {'MeshTextureCoords':0, 'MeshMaterialList':0}
+
+ for mesh_index, value in mesh_indicies.iteritems():
+ mesh = Mesh.New()
+ self.loadVertices(mesh_index, mesh, value['MeshTextureCoords'], value['MeshMaterialList'], tex_list)
+
+ mesh.materials = mat_list[:16]
+ if value['MeshMaterialList']:
+ self.loadMeshMaterials(value['MeshMaterialList'], mesh)
+ scene.objects.new(mesh)
+
self.file.close()
print "... finished"
#------------------------------------------------------------------------------
# CREATE THE MESH
#------------------------------------------------------------------------------
- def writeVertices(self, nr_vr_ind, mesh, nr_uv, nr_fac_mat, tex_list):
+ def loadVertices(self, nr_vr_ind, mesh, nr_uv, nr_fac_mat, tex_list):
v_ind = nr_vr_ind + 1
lin = self.lines[v_ind]
if lin :
@@ -92,7 +97,6 @@ class xImport:
lin_c = self.CleanLine(lin)
nr_vert = int((lin_c.split()[0]))
- vx_array = range(v_ind + 1, (v_ind + nr_vert +1))
#--------------------------------------------------
nr_fac_li = v_ind + nr_vert +1
lin_f = self.lines[nr_fac_li]
@@ -105,136 +109,80 @@ class xImport:
lin_fc = self.CleanLine(lin_f)
nr_face = int((lin_fc.split()[0]))
- fac_array = range(nr_fac_li + 1, (nr_fac_li + nr_face + 1))
#Get Coordinates
- for l in vx_array:
+ verts_list = [(0,0,0)] # WARNING - DUMMY VERT - solves EEKADOODLE ERROR
+ for l in xrange(v_ind + 1, (v_ind + nr_vert +1)):
line_v = self.lines[l]
lin_v = self.CleanLine(line_v)
words = lin_v.split()
if len(words)==3:
- mesh.verts.append(NMesh.Vert(float(words[0]),float(words[1]),float(words[2])))
-
+ verts_list.append((float(words[0]),float(words[1]),float(words[2])))
+
+ mesh.verts.extend(verts_list)
+ del verts_list
+
+ face_list = []
#Make Faces
i = 0
mesh_verts = mesh.verts
- for f in fac_array:
+ for f in xrange(nr_fac_li + 1, (nr_fac_li + nr_face + 1)):
i += 1
line_f = self.lines[f]
lin_f = self.CleanLine(line_f)
+
+ # +1 for dummy vert only!
words = lin_f.split()
if len(words) == 5:
- f= NMesh.Face([\
- mesh_verts[int(words[1])],
- mesh_verts[int(words[2])],
- mesh_verts[int(words[3])],
- mesh_verts[int(words[4])]])
-
- mesh.faces.append(f)
- if nr_uv :
- uv = []
- #---------------------------------
- l1_uv = self.lines[nr_uv + 2 + int(words[1])]
- fixed_l1_uv = self.CleanLine(l1_uv)
- w1 = fixed_l1_uv.split()
- uv_1 = (float(w1[0]), -float(w1[1]))
- uv.append(uv_1)
- #---------------------------------
- l2_uv = self.lines[nr_uv + 2 + int(words[2])]
- fixed_l2_uv = self.CleanLine(l2_uv)
- w2 = fixed_l2_uv.split()
- uv_2 = (float(w2[0]), -float(w2[1]))
- uv.append(uv_2)
- #---------------------------------
- l3_uv = self.lines[nr_uv + 2 + int(words[3])]
- fixed_l3_uv = self.CleanLine(l3_uv)
- w3 = fixed_l3_uv.split()
- uv_3 = (float(w3[0]), -float(w3[1]))
- uv.append(uv_3)
- #---------------------------------
- l4_uv = self.lines[nr_uv + 2 + int(words[4])]
- fixed_l4_uv = self.CleanLine(l4_uv)
- w4 = fixed_l4_uv.split()
- uv_4 = (float(w4[0]), -float(w4[1]))
- uv.append(uv_4)
- #---------------------------------
- f.uv = uv
- if nr_fac_mat :
- fac_line = self.lines[nr_fac_mat + i]
- fixed_fac = self.CleanLine(fac_line)
- w_tex = int(fixed_fac.split()[0])
- name_tex = tex_list[w_tex]
- if name_tex :
- name_file = Blender.sys.join(my_path,name_tex)
- try:
- img = Image.Load(name_file)
- f.image = img
- except:
- #Draw.PupMenu("No image to load")
- #print "No image " + name_tex + " to load"
- pass
-
+ face_list.append((1+int(words[1]), 1+int(words[2]), 1+int(words[3]), 1+int(words[4])))
elif len(words) == 4:
- f=NMesh.Face([\
- mesh_verts[int(words[1])],\
- mesh_verts[int(words[2])],\
- mesh_verts[int(words[3])]])
-
- mesh.faces.append(f)
- if nr_uv :
- uv = []
- #---------------------------------
- l1_uv = self.lines[nr_uv + 2 + int(words[1])]
- fixed_l1_uv = self.CleanLine(l1_uv)
- w1 = fixed_l1_uv.split()
- uv_1 = (float(w1[0]), -float(w1[1]))
- uv.append(uv_1)
- #---------------------------------
- l2_uv = self.lines[nr_uv + 2 + int(words[2])]
- fixed_l2_uv = self.CleanLine(l2_uv)
- w2 = fixed_l2_uv.split()
- uv_2 = (float(w2[0]), -float(w2[1]))
- uv.append(uv_2)
- #---------------------------------
- l3_uv = self.lines[nr_uv + 2 + int(words[3])]
- fixed_l3_uv = self.CleanLine(l3_uv)
- w3 = fixed_l3_uv.split()
- uv_3 = (float(w3[0]), -float(w3[1]))
- uv.append(uv_3)
- #---------------------------------
- f.uv = uv
- if nr_fac_mat :
- fac_line = self.lines[nr_fac_mat + i]
- fixed_fac = self.CleanLine(fac_line)
- w_tex = int(fixed_fac.split()[0])
- name_tex = tex_list[w_tex]
- if name_tex :
- name_file = Blender.sys.join(my_path ,name_tex)
- try:
- img = Image.Load(name_file)
- f.image = img
- except:
- #Draw.PupMenu("No image to load")
- #print "No image " + name_tex + " to load"
- pass
-
-
-
-
+ face_list.append((1+int(words[1]), 1+int(words[2]), 1+int(words[3])))
+
+ mesh.faces.extend(face_list)
+ del face_list
+
+ if nr_uv :
+ mesh.faceUV = True
+ for f in mesh.faces:
+ fuv = f.uv
+ for ii, v in enumerate(f):
+ # _u, _v = self.CleanLine(self.lines[nr_uv + 2 + v.index]).split()
+
+ # Use a dummy vert
+ _u, _v = self.CleanLine(self.lines[nr_uv + 1 + v.index]).split()
+
+ fuv[ii].x = float(_u)
+ fuv[ii].y = float(_v)
+
+ if nr_fac_mat :
+ fac_line = self.lines[nr_fac_mat + i]
+ fixed_fac = self.CleanLine(fac_line)
+ w_tex = int(fixed_fac.split()[0])
+ f.image = tex_list[w_tex]
+
+ # remove dummy vert
+ mesh.verts.delete([0,])
+
def CleanLine(self,line):
- fix_line = line.replace(";", " ")
- fix_1_line = fix_line.replace('"', ' ')
- fix_2_line = fix_1_line.replace("{", " ")
- fix_3_line = fix_2_line.replace("}", " ")
- fix_4_line = fix_3_line.replace(",", " ")
- fix_5_line = fix_4_line.replace("'", " ")
- return fix_5_line
+ return line.replace(\
+ ";", " ").replace(\
+ '"', ' ').replace(\
+ "{", " ").replace(\
+ "}", " ").replace(\
+ ",", " ").replace(\
+ "'", " ")
#------------------------------------------------------------------
# CREATE MATERIALS
#------------------------------------------------------------------
- def writeMaterials(self, nr_mat, idx, mat_list, tex_list):
- name = "Material_" + str(idx)
- mat = Material.New(name)
+ def loadMaterials(self, nr_mat, mat_list, tex_list):
+
+ def load_image(name):
+ try:
+ return Image.Load(Blender.sys.join(my_path,name))
+ except:
+ return None
+
+ mat = bpy.data.materials.new()
line = self.lines[nr_mat + 1]
fixed_line = self.CleanLine(line)
words = fixed_line.split()
@@ -244,35 +192,33 @@ class xImport:
l = self.lines[nr_mat + 5]
fix_3_line = self.CleanLine(l)
tex_n = fix_3_line.split()
-
+
if tex_n and tex_n[0] == "TextureFilename" :
if len(tex_n) > 1:
- tex_list.append(tex_n[1])
+ tex_list.append(load_image(tex_n[1]))
if len(tex_n) <= 1 :
l_succ = self.lines[nr_mat + 6]
fix_3_succ = self.CleanLine(l_succ)
tex_n_succ = fix_3_succ.split()
- tex_list.append(tex_n_succ[0])
+ tex_list.append(load_image(tex_n_succ[0]))
else :
- tex_name = None
- tex_list.append(tex_name)
+ tex_list.append(None) # no texture for this index
return mat_list, tex_list
#------------------------------------------------------------------
# SET MATERIALS
#------------------------------------------------------------------
- def writeMeshMaterials(self, nr_fc_mat, mesh):
+ def loadMeshMaterials(self, nr_fc_mat, mesh):
for face in mesh.faces:
nr_fc_mat += 1
line = self.lines[nr_fc_mat]
fixed_line = self.CleanLine(line)
wrd = fixed_line.split()
mat_idx = int(wrd[0])
- face.materialIndex = mat_idx
-
+ face.mat = mat_idx
#------------------------------------------------------------------
# MAIN
@@ -286,4 +232,7 @@ arg = __script__['arg']
if __name__ == '__main__':
Blender.Window.FileSelector(my_callback, "Import DirectX", "*.x")
-# my_callback('/directxterrain.x')
+
+#my_callback('/fe/x/directxterrain.x')
+#my_callback('/fe/x/Male_Normal_MAX.X')
+#my_callback('/fe/x/male_ms3d.x')
diff --git a/release/scripts/IDPropBrowser.py b/release/scripts/IDPropBrowser.py
index 2a14760270a..2a14760270a 100755..100644
--- a/release/scripts/IDPropBrowser.py
+++ b/release/scripts/IDPropBrowser.py
diff --git a/release/scripts/ac3d_import.py b/release/scripts/ac3d_import.py
index d538838fdf3..9a7004e4b4d 100644
--- a/release/scripts/ac3d_import.py
+++ b/release/scripts/ac3d_import.py
@@ -679,6 +679,8 @@ class AC3DImport:
baseimgname = bsys.basename(objtex)
if bsys.exists(objtex) == 1:
texfname = objtex
+ elif bsys.exists(bsys.join(self.importdir, objtex)):
+ texfname = bsys.join(self.importdir, objtex)
else:
if baseimgname.find('\\') > 0:
baseimgname = bsys.basename(objtex.replace('\\','/'))
diff --git a/release/scripts/add_mesh_empty.py b/release/scripts/add_mesh_empty.py
new file mode 100644
index 00000000000..537bd1e2c3d
--- /dev/null
+++ b/release/scripts/add_mesh_empty.py
@@ -0,0 +1,13 @@
+#!BPY
+"""
+Name: 'Empty mesh'
+Blender: 243
+Group: 'AddMesh'
+"""
+import BPyAddMesh
+import Blender
+
+def main():
+ BPyAddMesh.add_mesh_simple('EmptyMesh', [], [], [])
+
+main() \ No newline at end of file
diff --git a/release/scripts/bpymodules/BPyMesh.py b/release/scripts/bpymodules/BPyMesh.py
index 70fc1a87a52..415c2a12c69 100644
--- a/release/scripts/bpymodules/BPyMesh.py
+++ b/release/scripts/bpymodules/BPyMesh.py
@@ -56,7 +56,7 @@ def meshWeight2List(me):
if not len_groupNames:
# no verts? return a vert aligned empty list
- return [[] for i in xrange(len(me.verts))]
+ return [[] for i in xrange(len(me.verts))], []
else:
vWeightList= [[0.0]*len_groupNames for i in xrange(len(me.verts))]
diff --git a/release/scripts/bpymodules/BPyMessages.py b/release/scripts/bpymodules/BPyMessages.py
index 0ff8e178ac1..8ee1aa6c707 100644
--- a/release/scripts/bpymodules/BPyMessages.py
+++ b/release/scripts/bpymodules/BPyMessages.py
@@ -11,6 +11,8 @@ def Error_NoMeshUvActive():
Draw.PupMenu('Error%t|Active object is not a mesh with texface')
def Error_NoMeshMultiresEdit():
Draw.PupMenu('Error%t|Unable to complete action with multires enabled')
+def Error_NoMeshFaces():
+ Draw.PupMenu('Error%t|Mesh has no faces')
# File I/O messages
def Error_NoFile(path):
diff --git a/release/scripts/bpymodules/BPyObject.py b/release/scripts/bpymodules/BPyObject.py
index 7de2c4113f9..54ff949218d 100644
--- a/release/scripts/bpymodules/BPyObject.py
+++ b/release/scripts/bpymodules/BPyObject.py
@@ -10,7 +10,7 @@ def getObjectArmature(ob):
arm = ob.parent
if arm and arm.type == 'Armature' and ob.parentType == Blender.Object.ParentTypes.ARMATURE:
- arm
+ return arm
for m in ob.modifiers:
if m.type== Blender.Modifier.Types.ARMATURE:
diff --git a/release/scripts/bpymodules/BPyRender.py b/release/scripts/bpymodules/BPyRender.py
index bb5ef628356..e335ee7f6a8 100644
--- a/release/scripts/bpymodules/BPyRender.py
+++ b/release/scripts/bpymodules/BPyRender.py
@@ -91,7 +91,7 @@ def imageFromObjectsOrtho(objects, path, width, height, smooth, alpha= True, cam
render_cam_ob= Object.New('Camera')
render_cam_ob.link(render_cam_data)
render_scn.link(render_cam_ob)
- render_scn.setCurrentCamera(render_cam_ob)
+ render_scn.objects.camera = render_cam_ob
render_cam_data.type= 'ortho'
diff --git a/release/scripts/bpymodules/BPyWindow.py b/release/scripts/bpymodules/BPyWindow.py
index f48f5dfc0ad..f48f5dfc0ad 100755..100644
--- a/release/scripts/bpymodules/BPyWindow.py
+++ b/release/scripts/bpymodules/BPyWindow.py
diff --git a/release/scripts/bpymodules/mesh_gradient.py b/release/scripts/bpymodules/mesh_gradient.py
index 936f4958467..936f4958467 100755..100644
--- a/release/scripts/bpymodules/mesh_gradient.py
+++ b/release/scripts/bpymodules/mesh_gradient.py
diff --git a/release/scripts/bvh_import.py b/release/scripts/bvh_import.py
index d027956a507..2093ac109f7 100644
--- a/release/scripts/bvh_import.py
+++ b/release/scripts/bvh_import.py
@@ -110,7 +110,7 @@ def eulerRotate(x,y,z, rot_order):
def read_bvh(file_path, GLOBAL_SCALE=1.0):
# File loading stuff
# Open the file for importing
- file = open(file_path, 'r')
+ file = open(file_path, 'rU')
# Seperate into a list of lists, each line a list of words.
file_lines = file.readlines()
@@ -354,7 +354,7 @@ def bvh_node_dict2objects(bvh_nodes, IMPORT_START_FRAME= 1, IMPORT_LOOP= False):
bvh_node.temp.rot= rx*DEG2RAD,ry*DEG2RAD,rz*DEG2RAD
- bvh_node.temp.insertIpoKey(Blender.Object.IpoKeys.LOCROT)
+ bvh_node.temp.insertIpoKey(Blender.Object.IpoKeyTypes.LOCROT)
scn.update(1)
return objects
diff --git a/release/scripts/console.py b/release/scripts/console.py
index e253e3c9857..7d9d8be5e9e 100644
--- a/release/scripts/console.py
+++ b/release/scripts/console.py
@@ -285,6 +285,8 @@ def runUserCode(__USER_CODE_STRING__):
# Try and run the user entered line(s)
try:
# Load all variabls from global dict to local space.
+ __TMP_VAR_NAME__ = __TMP_VAR__ = '' # so as not to raise an error when del'ing
+
for __TMP_VAR_NAME__, __TMP_VAR__ in __CONSOLE_VAR_DICT__.items():
exec('%s%s' % (__TMP_VAR_NAME__,'=__TMP_VAR__'))
del __TMP_VAR_NAME__
@@ -295,7 +297,8 @@ def runUserCode(__USER_CODE_STRING__):
# Flush global dict, allow the user to remove items.
__CONSOLE_VAR_DICT__ = {}
-
+
+ __TMP_VAR_NAME__ = '' # so as not to raise an error when del'ing
# Write local veriables to global __CONSOLE_VAR_DICT__
for __TMP_VAR_NAME__ in dir():
if __TMP_VAR_NAME__ != '__FILE_LIKE_STRING__' and\
@@ -715,6 +718,15 @@ def draw_gui():
else:
BGL.glColor3f(1, 1, 0)
+ if consoleLineIdx == 1: # user input
+ BGL.glRasterPos2i(margin, (__FONT_SIZES__[__FONT_SIZE__][1] * (consoleLineIdx-__CONSOLE_LINE_OFFSET__)) - 8)
+ Draw.Text(cmdBuffer[-consoleLineIdx].cmd, __FONT_SIZES__[__FONT_SIZE__][0])
+ else:
+ BGL.glRasterPos2i(margin, (__FONT_SIZES__[__FONT_SIZE__][1] * ((consoleLineIdx-__CONSOLE_LINE_OFFSET__)+wrapLineIndex)) - 8)
+ Draw.Text(cmdBuffer[-consoleLineIdx].cmd, __FONT_SIZES__[__FONT_SIZE__][0])
+
+ # Wrapping is totally slow, can even hang blender - dont do it!
+ '''
if consoleLineIdx == 1: # NEVER WRAP THE USER INPUT
BGL.glRasterPos2i(margin, (__FONT_SIZES__[__FONT_SIZE__][1] * (consoleLineIdx-__CONSOLE_LINE_OFFSET__)) - 8)
# BUG, LARGE TEXT DOSENT DISPLAY
@@ -751,7 +763,7 @@ def draw_gui():
BGL.glRasterPos2i(margin, (__FONT_SIZES__[__FONT_SIZE__][1] * ((consoleLineIdx-__CONSOLE_LINE_OFFSET__)+wrapLineIndex)) - 8)
Draw.Text(cmdBuffer[-consoleLineIdx].cmd, __FONT_SIZES__[__FONT_SIZE__][0])
-
+ '''
consoleLineIdx += 1
@@ -774,8 +786,9 @@ histIndex = cursor = -1 # How far back from the first letter are we? - in curren
# Autoexec, startup code.
scriptDir = Get('scriptsdir')
+console_autoexec = None
if scriptDir:
- if scriptDir.endswith(Blender.sys.sep):
+ if not scriptDir.endswith(Blender.sys.sep):
scriptDir += Blender.sys.sep
console_autoexec = '%s%s' % (scriptDir, 'console_autoexec.py')
@@ -788,7 +801,10 @@ if scriptDir:
except:
cmdBuffer.append(cmdLine('...console_autoexec.py could not write, this is ok', 1, None))
scriptDir = None # make sure we only use this for console_autoexec.py
-
+
+ if not sys.exists(console_autoexec):
+ console_autoexec = None
+
else:
cmdBuffer.append(cmdLine('...Using existing console_autoexec.py in scripts dir', 1, None))
@@ -802,7 +818,8 @@ def include_console(includeFile):
# Execute an external py file as if local
exec(include(includeFile))
-
+
+def standard_imports():
# Write local to global __CONSOLE_VAR_DICT__ for reuse,
for ls in (dir(), dir(Blender)):
for __TMP_VAR_NAME__ in ls:
@@ -810,10 +827,12 @@ def include_console(includeFile):
exec('%s%s' % ('__CONSOLE_VAR_DICT__[__TMP_VAR_NAME__]=', __TMP_VAR_NAME__))
exec('%s%s' % ('__CONSOLE_VAR_DICT__["bpy"]=', 'bpy'))
-
-if scriptDir:
+
+if scriptDir and console_autoexec:
include_console(console_autoexec) # pass the blender module
+standard_imports() # import Blender and bpy
+
#-end autoexec-----------------------------------------------------------------#
@@ -827,4 +846,4 @@ def main():
Draw.Register(draw_gui, handle_event, handle_button_event)
if __name__ == '__main__':
- main() \ No newline at end of file
+ main()
diff --git a/release/scripts/export_fbx.py b/release/scripts/export_fbx.py
index a4a4787d5f3..99d036b38bc 100644
--- a/release/scripts/export_fbx.py
+++ b/release/scripts/export_fbx.py
@@ -1,7 +1,7 @@
#!BPY
"""
Name: 'Autodesk FBX (.fbx)...'
-Blender: 243
+Blender: 244
Group: 'Export'
Tooltip: 'Selection to an ASCII Autodesk FBX '
"""
@@ -12,13 +12,8 @@ __version__ = "1.1"
__bpydoc__ = """\
This script is an exporter to the FBX file format.
-Usage:
-
-Select the objects you wish to export and run this script from "File->Export" menu.
-All objects that can be represented as a mesh (mesh, curve, metaball, surface, text3d)
-will be exported as mesh data.
+http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_fbx
"""
-
# --------------------------------------------------------------------------
# FBX Export v0.1 by Campbell Barton (AKA Ideasman)
# --------------------------------------------------------------------------
@@ -41,57 +36,470 @@ will be exported as mesh data.
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------
+try:
+ import time
+ # import os # only needed for batch export, nbot used yet
+except:
+ time = None # use this to check if they have python modules installed
+
+# for python 2.3 support
+try:
+ set()
+except:
+ try:
+ from sets import Set as set
+ except:
+ set = None # so it complains you dont have a !
+
+# os is only needed for batch 'own dir' option
+try:
+ import os
+except:
+ os = None
+
import Blender
+import bpy
+from Blender.Mathutils import Matrix, Vector, RotationMatrix
+
import BPyObject
import BPyMesh
import BPySys
import BPyMessages
-import time
-from math import degrees, atan, pi
-# Used to add the scene name into the filename without using odd chars
+import sys
+
+## This was used to make V, but faster not to do all that
+##valid = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_,.()[]{}'
+##v = range(255)
+##for c in valid: v.remove(ord(c))
+v = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,42,43,47,58,59,60,61,62,63,64,92,94,96,124,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254]
+invalid = ''.join([chr(i) for i in v])
+def cleanName(name):
+ for ch in invalid: name = name.replace(ch, '_')
+ return name
+del v, i
+
+
+def copy_file(source, dest):
+ file = open(source, 'rb')
+ data = file.read()
+ file.close()
+
+ file = open(dest, 'wb')
+ file.write(data)
+ file.close()
+
+
+def copy_images(dest_dir, textures):
+ if not dest_dir.endswith(Blender.sys.sep):
+ dest_dir += Blender.sys.sep
+
+ image_paths = set()
+ for img in textures:
+ image_paths.add(Blender.sys.expandpath(img.filename))
+
+ # Now copy images
+ copyCount = 0
+ for image_path in image_paths:
+ if Blender.sys.exists(image_path):
+ # Make a name for the target path.
+ dest_image_path = dest_dir + image_path.split('\\')[-1].split('/')[-1]
+ if not Blender.sys.exists(dest_image_path): # Image isnt alredy there
+ print '\tCopying "%s" > "%s"' % (image_path, dest_image_path)
+ try:
+ copy_file(image_path, dest_image_path)
+ copyCount+=1
+ except:
+ print '\t\tWarning, file failed to copy, skipping.'
+
+ print '\tCopied %d images' % copyCount
+
+mtx4_identity = Matrix()
+
+# testing
+mtx_x90 = RotationMatrix( 90, 3, 'x') # used
+#mtx_x90n = RotationMatrix(-90, 3, 'x')
+#mtx_y90 = RotationMatrix( 90, 3, 'y')
+#mtx_y90n = RotationMatrix(-90, 3, 'y')
+#mtx_z90 = RotationMatrix( 90, 3, 'z')
+#mtx_z90n = RotationMatrix(-90, 3, 'z')
+
+#mtx4_x90 = RotationMatrix( 90, 4, 'x')
+mtx4_x90n = RotationMatrix(-90, 4, 'x') # used
+#mtx4_y90 = RotationMatrix( 90, 4, 'y')
+mtx4_y90n = RotationMatrix(-90, 4, 'y') # used
+mtx4_z90 = RotationMatrix( 90, 4, 'z') # used
+mtx4_z90n = RotationMatrix(-90, 4, 'z') # used
+
+def strip_path(p):
+ return p.split('\\')[-1].split('/')[-1]
+
+# Used to add the scene name into the filename without using odd chars
sane_name_mapping_ob = {}
sane_name_mapping_mat = {}
sane_name_mapping_tex = {}
+sane_name_mapping_take = {}
+sane_name_mapping_group = {}
-def strip_path(p):
- return p.split('\\')[-1].split('/')[-1]
+# Make sure reserved names are not used
+sane_name_mapping_ob['Scene'] = 'Scene_'
+sane_name_mapping_ob['blend_root'] = 'blend_root_'
+
+def increment_string(t):
+ name = t
+ num = ''
+ while name and name[-1].isdigit():
+ num = name[-1] + num
+ name = name[:-1]
+ if num: return '%s%d' % (name, int(num)+1)
+ else: return name + '_0'
+
+
+# todo - Disallow the name 'Scene' and 'blend_root' - it will bugger things up.
def sane_name(data, dct):
- if not data: return None
+ #if not data: return None
name = data.name
- try: return dct[name]
- except: pass
+
+ # dont cache, only ever call once for each data type now,
+ # so as to avoid namespace collision between types - like with objects <-> bones
+ #try: return dct[name]
+ #except: pass
orig_name = name
- name = BPySys.cleanName(name)
+ if not name:
+ name = 'unnamed' # blank string, ASKING FOR TROUBLE!
+ else:
+ #name = BPySys.cleanName(name)
+ name = cleanName(name) # use our own
+
+ while name in dct.itervalues(): name = increment_string(name)
+
dct[orig_name] = name
return name
def sane_obname(data): return sane_name(data, sane_name_mapping_ob)
def sane_matname(data): return sane_name(data, sane_name_mapping_mat)
def sane_texname(data): return sane_name(data, sane_name_mapping_tex)
+def sane_takename(data): return sane_name(data, sane_name_mapping_take)
+def sane_groupname(data): return sane_name(data, sane_name_mapping_group)
+
-# May use this later
-"""
-# Auto class, use for datastorage only, a like a dictionary but with limited slots
-def auto_class(slots):
- exec('class container_class(object): __slots__=%s' % slots)
- return container_class
-"""
+def mat4x4str(mat):
+ return '%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,%.15f' % tuple([ f for v in mat for f in v ])
+
+def meshNormalizedWeights(me):
+ try: # account for old bad BPyMesh
+ groupNames, vWeightList = BPyMesh.meshWeight2List(me)
+ except:
+ return [],[]
+
+ if not groupNames:
+ return [],[]
+
+ for i, vWeights in enumerate(vWeightList):
+ tot = 0.0
+ for w in vWeights:
+ tot+=w
+
+ if tot:
+ for j, w in enumerate(vWeights):
+ vWeights[j] = w/tot
+
+ return groupNames, vWeightList
+
header_comment = \
'''; FBX 6.1.0 project file
; Created by Blender FBX Exporter
-; for support mail cbarton@metavr.com
+; for support mail: ideasman42@gmail.com
; ----------------------------------------------------
'''
-def write_header(file):
+# This func can be called with just the filename
+def write(filename, batch_objects = None, \
+ EXP_OBS_SELECTED = True,
+ EXP_MESH = True,
+ EXP_MESH_APPLY_MOD = True,
+ EXP_MESH_HQ_NORMALS = False,
+ EXP_ARMATURE = True,
+ EXP_LAMP = True,
+ EXP_CAMERA = True,
+ EXP_EMPTY = True,
+ EXP_IMAGE_COPY = False,
+ GLOBAL_MATRIX = Matrix(),
+ ANIM_ENABLE = True,
+ ANIM_OPTIMIZE = True,
+ ANIM_OPTIMIZE_PRECISSION = 6,
+ ANIM_ACTION_ALL = False,
+ BATCH_ENABLE = False,
+ BATCH_GROUP = True,
+ BATCH_SCENE = False,
+ BATCH_FILE_PREFIX = '',
+ BATCH_OWN_DIR = False
+ ):
+
+ # ----------------- Batch support!
+ if BATCH_ENABLE:
+ if os == None: BATCH_OWN_DIR = False
+
+ fbxpath = filename
+
+ # get the path component of filename
+ tmp_exists = Blender.sys.exists(fbxpath)
+
+ if tmp_exists != 2: # a file, we want a path
+ while fbxpath and fbxpath[-1] not in ('/', '\\'):
+ fbxpath = fbxpath[:-1]
+ if not filename:
+ Draw.PupMenu('Error%t|Directory does not exist!')
+ return
+
+ tmp_exists = Blender.sys.exists(fbxpath)
+
+ if tmp_exists != 2:
+ Draw.PupMenu('Error%t|Directory does not exist!')
+ return
+
+ if not fbxpath.endswith(Blender.sys.sep):
+ fbxpath += Blender.sys.sep
+ del tmp_exists
+
+
+ if BATCH_GROUP:
+ data_seq = bpy.data.groups
+ else:
+ data_seq = bpy.data.scenes
+
+ # call this function within a loop with BATCH_ENABLE == False
+ orig_sce = bpy.data.scenes.active
+
+
+ new_fbxpath = fbxpath # own dir option modifies, we need to keep an original
+ for data in data_seq: # scene or group
+ newname = BATCH_FILE_PREFIX + BPySys.cleanName(data.name)
+
+
+ if BATCH_OWN_DIR:
+ new_fbxpath = fbxpath + newname + Blender.sys.sep
+ # path may alredy exist
+ # TODO - might exist but be a file. unlikely but should probably account for it.
+
+ if Blender.sys.exists(new_fbxpath) == 0:
+ os.mkdir(new_fbxpath)
+
+
+ filename = new_fbxpath + newname + '.fbx'
+
+ print '\nBatch exporting %s as...\n\t"%s"' % (data, filename)
+
+ if BATCH_GROUP: #group
+ # group, so objects update properly, add a dummy scene.
+ sce = bpy.data.scenes.new()
+ sce.Layers = (1<<20) -1
+ bpy.data.scenes.active = sce
+ for ob_base in data.objects:
+ sce.objects.link(ob_base)
+
+ sce.update(1)
+
+ # TODO - BUMMER! Armatures not in the group wont animate the mesh
+
+ else:# scene
+
+
+ data_seq.active = data
+
+
+ # Call self with modified args
+ # Dont pass batch options since we alredy usedt them
+ write(filename, data.objects,
+ False,
+ EXP_MESH,
+ EXP_MESH_APPLY_MOD,
+ EXP_MESH_HQ_NORMALS,
+ EXP_ARMATURE,
+ EXP_LAMP,
+ EXP_CAMERA,
+ EXP_EMPTY,
+ EXP_IMAGE_COPY,
+ GLOBAL_MATRIX,
+ ANIM_ENABLE,
+ ANIM_OPTIMIZE,
+ ANIM_OPTIMIZE_PRECISSION,
+ ANIM_ACTION_ALL
+ )
+
+ if BATCH_GROUP:
+ # remove temp group scene
+ bpy.data.scenes.unlink(sce)
+
+ bpy.data.scenes.active = orig_sce
+
+ return # so the script wont run after we have batch exported.
+
+ # end batch support
+
+
+ # ----------------------------------------------
+ # storage classes
+ class my_bone_class:
+ __slots__ =(\
+ 'blenName',\
+ 'blenBone',\
+ 'blenMeshes',\
+ 'restMatrix',\
+ 'parent',\
+ 'blenName',\
+ 'fbxName',\
+ 'fbxArm',\
+ '__pose_bone',\
+ '__anim_poselist')
+
+ def __init__(self, blenBone, fbxArm):
+
+ # This is so 2 armatures dont have naming conflicts since FBX bones use object namespace
+ self.fbxName = sane_obname(blenBone)
+
+ self.blenName = blenBone.name
+ self.blenBone = blenBone
+ self.blenMeshes = {} # fbxMeshObName : mesh
+ self.fbxArm = fbxArm
+ self.restMatrix = blenBone.matrix['ARMATURESPACE']
+
+ # not used yet
+ # self.restMatrixInv = self.restMatrix.copy().invert()
+ # self.restMatrixLocal = None # set later, need parent matrix
+
+ self.parent = None
+
+ # not public
+ pose = fbxArm.blenObject.getPose()
+ self.__pose_bone = pose.bones[self.blenName]
+
+ # store a list if matricies here, (poseMatrix, head, tail)
+ # {frame:posematrix, frame:posematrix, ...}
+ self.__anim_poselist = {}
+
+ '''
+ def calcRestMatrixLocal(self):
+ if self.parent:
+ self.restMatrixLocal = self.restMatrix * self.parent.restMatrix.copy().invert()
+ else:
+ self.restMatrixLocal = self.restMatrix.copy()
+ '''
+ def setPoseFrame(self, f):
+ # cache pose info here, frame must be set beforehand
+
+ # Didnt end up needing head or tail, if we do - here it is.
+ '''
+ self.__anim_poselist[f] = (\
+ self.__pose_bone.poseMatrix.copy(),\
+ self.__pose_bone.head.copy(),\
+ self.__pose_bone.tail.copy() )
+ '''
+
+ self.__anim_poselist[f] = self.__pose_bone.poseMatrix.copy()
+
+ # get pose from frame.
+ def getPoseMatrix(self, f):# ----------------------------------------------
+ return self.__anim_poselist[f]
+ '''
+ def getPoseHead(self, f):
+ #return self.__pose_bone.head.copy()
+ return self.__anim_poselist[f][1].copy()
+ def getPoseTail(self, f):
+ #return self.__pose_bone.tail.copy()
+ return self.__anim_poselist[f][2].copy()
+ '''
+ # end
+
+ def getAnimParRelMatrix(self, frame):
+ #arm_mat = self.fbxArm.matrixWorld
+ #arm_mat = self.fbxArm.parRelMatrix()
+ if not self.parent:
+ #return mtx4_z90 * (self.getPoseMatrix(frame) * arm_mat) # dont apply arm matrix anymore
+ return mtx4_z90 * self.getPoseMatrix(frame)
+ else:
+ #return (mtx4_z90 * ((self.getPoseMatrix(frame) * arm_mat))) * (mtx4_z90 * (self.parent.getPoseMatrix(frame) * arm_mat)).invert()
+ return (mtx4_z90 * (self.getPoseMatrix(frame))) * (mtx4_z90 * self.parent.getPoseMatrix(frame)).invert()
+
+ # we need thes because cameras and lights modified rotations
+ def getAnimParRelMatrixRot(self, frame):
+ return self.getAnimParRelMatrix(frame)
+
+ def flushAnimData(self):
+ self.__anim_poselist.clear()
+
+
+ class my_object_generic:
+ # Other settings can be applied for each type - mesh, armature etc.
+ def __init__(self, ob, matrixWorld = None):
+ self.fbxName = sane_obname(ob)
+ self.blenObject = ob
+ self.fbxGroupNames = []
+ self.fbxParent = None # set later on IF the parent is in the selection.
+ if matrixWorld: self.matrixWorld = matrixWorld * GLOBAL_MATRIX
+ else: self.matrixWorld = ob.matrixWorld * GLOBAL_MATRIX
+ self.__anim_poselist = {} # we should only access this
+
+ def parRelMatrix(self):
+ if self.fbxParent:
+ return self.matrixWorld * self.fbxParent.matrixWorld.copy().invert()
+ else:
+ return self.matrixWorld
+
+ def setPoseFrame(self, f):
+ self.__anim_poselist[f] = self.blenObject.matrixWorld.copy()
+
+ def getAnimParRelMatrix(self, frame):
+ if self.fbxParent:
+ #return (self.__anim_poselist[frame] * self.fbxParent.__anim_poselist[frame].copy().invert() ) * GLOBAL_MATRIX
+ return (self.__anim_poselist[frame] * GLOBAL_MATRIX) * (self.fbxParent.__anim_poselist[frame] * GLOBAL_MATRIX).invert()
+ else:
+ return self.__anim_poselist[frame] * GLOBAL_MATRIX
+
+ def getAnimParRelMatrixRot(self, frame):
+ type = self.blenObject.type
+ if self.fbxParent:
+ matrix_rot = (((self.__anim_poselist[frame] * GLOBAL_MATRIX) * (self.fbxParent.__anim_poselist[frame] * GLOBAL_MATRIX).invert())).rotationPart()
+ else:
+ matrix_rot = (self.__anim_poselist[frame] * GLOBAL_MATRIX).rotationPart()
+
+ # Lamps need to be rotated
+ if type =='Lamp':
+ matrix_rot = mtx_x90 * matrix_rot
+ elif ob and type =='Camera':
+ y = Vector(0,1,0) * matrix_rot
+ matrix_rot = matrix_rot * RotationMatrix(90, 3, 'r', y)
+
+ return matrix_rot
+
+ # ----------------------------------------------
+
+
+
+
+
+ print '\nFBX export starting...', filename
+ start_time = Blender.sys.time()
+ try:
+ file = open(filename, 'w')
+ except:
+ return False
+
+ sce = bpy.data.scenes.active
+ world = sce.world
+
+
+ # ---------------------------- Write the header first
file.write(header_comment)
- curtime = time.localtime()[0:6]
+ if time:
+ curtime = time.localtime()[0:6]
+ else:
+ curtime = [0,0,0,0,0,0]
#
file.write(\
'''FBXHeaderExtension: {
@@ -115,49 +523,78 @@ def write_header(file):
file.write('\nCreationTime: "%.4i-%.2i-%.2i %.2i:%.2i:%.2i:000"' % curtime)
file.write('\nCreator: "Blender3D version %.2f"' % Blender.Get('version'))
-
-
-
-
-def write_scene(file, sce, world):
- def write_object_tx(ob, loc, matrix):
+ pose_items = [] # list of (fbxName, matrix) to write pose data for, easier to collect allong the way
+
+ # --------------- funcs for exporting
+ def object_tx(ob, loc, matrix, matrix_mod = None):
'''
- We have loc to set the location if non blender objects that have a location
+ Matrix mod is so armature objects can modify their bone matricies
'''
-
- if ob and not matrix: matrix = ob.matrixWorld
- matrix_rot = matrix
- #if matrix:
- # matrix = matrix_scale * matrix
-
- if matrix:
- loc = tuple(matrix.translationPart())
- scale = tuple(matrix.scalePart())
+ if isinstance(ob, Blender.Types.BoneType):
+
+ # we know we have a matrix
+ # matrix = mtx4_z90 * (ob.matrix['ARMATURESPACE'] * matrix_mod)
+ matrix = mtx4_z90 * ob.matrix['ARMATURESPACE'] # dont apply armature matrix anymore
+
+ parent = ob.parent
+ if parent:
+ #par_matrix = mtx4_z90 * (parent.matrix['ARMATURESPACE'] * matrix_mod)
+ par_matrix = mtx4_z90 * parent.matrix['ARMATURESPACE'] # dont apply armature matrix anymore
+ matrix = matrix * par_matrix.copy().invert()
+
+ matrix_rot = matrix.rotationPart()
+
+ loc = tuple(matrix.translationPart())
+ scale = tuple(matrix.scalePart())
+ rot = tuple(matrix_rot.toEuler())
- matrix_rot = matrix.rotationPart()
- # Lamps need to be rotated
- if ob and ob.type =='Lamp':
- matrix_rot = Blender.Mathutils.RotationMatrix(90, 4, 'x') * matrix
- rot = tuple(matrix_rot.toEuler())
- elif ob and ob.type =='Camera':
- y = Blender.Mathutils.Vector(0,1,0) * matrix_rot
- matrix_rot = matrix_rot * Blender.Mathutils.RotationMatrix(90, 3, 'r', y)
- rot = tuple(matrix_rot.toEuler())
- else:
- rot = tuple(matrix_rot.toEuler())
else:
- if not loc:
- loc = 0,0,0
- scale = 1,1,1
- rot = 0,0,0
+ # This is bad because we need the parent relative matrix from the fbx parent (if we have one), dont use anymore
+ #if ob and not matrix: matrix = ob.matrixWorld * GLOBAL_MATRIX
+ if ob and not matrix: raise "error: this should never happen!"
+
+ matrix_rot = matrix
+ #if matrix:
+ # matrix = matrix_scale * matrix
+
+ if matrix:
+ loc = tuple(matrix.translationPart())
+ scale = tuple(matrix.scalePart())
+
+ matrix_rot = matrix.rotationPart()
+ # Lamps need to be rotated
+ if ob and ob.type =='Lamp':
+ matrix_rot = mtx_x90 * matrix_rot
+ rot = tuple(matrix_rot.toEuler())
+ elif ob and ob.type =='Camera':
+ y = Vector(0,1,0) * matrix_rot
+ matrix_rot = matrix_rot * RotationMatrix(90, 3, 'r', y)
+ rot = tuple(matrix_rot.toEuler())
+ else:
+ rot = tuple(matrix_rot.toEuler())
+ else:
+ if not loc:
+ loc = 0,0,0
+ scale = 1,1,1
+ rot = 0,0,0
+
+ return loc, rot, scale, matrix, matrix_rot
+
+ def write_object_tx(ob, loc, matrix, matrix_mod= None):
+ '''
+ We have loc to set the location if non blender objects that have a location
+
+ matrix_mod is only used for bones at the moment
+ '''
+ loc, rot, scale, matrix, matrix_rot = object_tx(ob, loc, matrix, matrix_mod)
file.write('\n\t\t\tProperty: "Lcl Translation", "Lcl Translation", "A+",%.15f,%.15f,%.15f' % loc)
file.write('\n\t\t\tProperty: "Lcl Rotation", "Lcl Rotation", "A+",%.15f,%.15f,%.15f' % rot)
file.write('\n\t\t\tProperty: "Lcl Scaling", "Lcl Scaling", "A+",%.15f,%.15f,%.15f' % scale)
return loc, rot, scale, matrix, matrix_rot
- def write_object_props(ob=None, loc=None, matrix=None):
+ def write_object_props(ob=None, loc=None, matrix=None, matrix_mod=None):
# if the type is 0 its an empty otherwise its a mesh
# only difference at the moment is one has a color
file.write('''
@@ -165,16 +602,16 @@ def write_scene(file, sce, world):
Property: "QuaternionInterpolate", "bool", "",0
Property: "Visibility", "Visibility", "A+",1''')
- loc, rot, scale, matrix, matrix_rot = write_object_tx(ob, loc, matrix)
+ loc, rot, scale, matrix, matrix_rot = write_object_tx(ob, loc, matrix, matrix_mod)
- # Rotation order
- # eEULER_XYZ
+ # Rotation order, note, for FBX files Iv loaded normal order is 1
+ # setting to zero.
+ # eEULER_XYZ = 0
# eEULER_XZY
# eEULER_YZX
# eEULER_YXZ
# eEULER_ZXY
- # eEULER_ZYX
-
+ # eEULER_ZYX
file.write('''
Property: "RotationOffset", "Vector3D", "",0,0,0
@@ -190,7 +627,7 @@ def write_scene(file, sce, world):
Property: "TranslationMaxX", "bool", "",0
Property: "TranslationMaxY", "bool", "",0
Property: "TranslationMaxZ", "bool", "",0
- Property: "RotationOrder", "enum", "",1
+ Property: "RotationOrder", "enum", "",0
Property: "RotationSpaceForLimitOnly", "bool", "",0
Property: "AxisLen", "double", "",10
Property: "PreRotation", "Vector3D", "",0,0,0
@@ -240,7 +677,7 @@ def write_scene(file, sce, world):
Property: "Show", "bool", "",1
Property: "NegativePercentShapeSupport", "bool", "",1
Property: "DefaultAttributeIndex", "int", "",0''')
- if ob:
+ if ob and type(ob) != Blender.Types.BoneType:
# Only mesh objects have color
file.write('\n\t\t\tProperty: "Color", "Color", "A",0.8,0.8,0.8')
file.write('\n\t\t\tProperty: "Size", "double", "",100')
@@ -248,6 +685,42 @@ def write_scene(file, sce, world):
return loc, rot, scale, matrix, matrix_rot
+
+ # -------------------------------------------- Armatures
+ #def write_bone(bone, name, matrix_mod):
+ def write_bone(my_bone):
+ file.write('\n\tModel: "Model::%s", "Limb" {' % my_bone.fbxName)
+ file.write('\n\t\tVersion: 232')
+
+ #poseMatrix = write_object_props(my_bone.blenBone, None, None, my_bone.fbxArm.parRelMatrix())[3]
+ poseMatrix = write_object_props(my_bone.blenBone)[3] # dont apply bone matricies anymore
+ pose_items.append( (my_bone.fbxName, poseMatrix) )
+
+
+ # file.write('\n\t\t\tProperty: "Size", "double", "",%.6f' % ((my_bone.blenData.head['ARMATURESPACE'] - my_bone.blenData.tail['ARMATURESPACE']) * my_bone.fbxArm.parRelMatrix()).length)
+ file.write('\n\t\t\tProperty: "Size", "double", "",1')
+
+ #((my_bone.blenData.head['ARMATURESPACE'] * my_bone.fbxArm.matrixWorld) - (my_bone.blenData.tail['ARMATURESPACE'] * my_bone.fbxArm.parRelMatrix())).length)
+
+ """
+ file.write('\n\t\t\tProperty: "LimbLength", "double", "",%.6f' %\
+ ((my_bone.blenBone.head['ARMATURESPACE'] - my_bone.blenBone.tail['ARMATURESPACE']) * my_bone.fbxArm.parRelMatrix()).length)
+ """
+
+ file.write('\n\t\t\tProperty: "LimbLength", "double", "",%.6f' %\
+ (my_bone.blenBone.head['ARMATURESPACE'] - my_bone.blenBone.tail['ARMATURESPACE']).length)
+
+ #file.write('\n\t\t\tProperty: "LimbLength", "double", "",1')
+ file.write('\n\t\t\tProperty: "Color", "ColorRGB", "",0.8,0.8,0.8')
+ file.write('\n\t\t\tProperty: "Color", "Color", "A",0.8,0.8,0.8')
+ file.write('\n\t\t}')
+ file.write('\n\t\tMultiLayer: 0')
+ file.write('\n\t\tMultiTake: 1')
+ file.write('\n\t\tShading: Y')
+ file.write('\n\t\tCulling: "CullingOff"')
+ file.write('\n\t\tTypeFlags: "Skeleton"')
+ file.write('\n\t}')
+
def write_camera_switch():
file.write('''
Model: "Model::Camera Switcher", "CameraSwitcher" {
@@ -370,7 +843,7 @@ def write_scene(file, sce, world):
write_camera_dummy('Producer Right', (4000,0,0), 1, 30000, 1, (0,1,0))
write_camera_dummy('Producer Left', (-4000,0,0), 1, 30000, 1, (0,1,0))
- def write_camera(ob, name):
+ def write_camera(my_cam):
'''
Write a blender camera
'''
@@ -379,11 +852,11 @@ def write_scene(file, sce, world):
height = render.sizeY
aspect = float(width)/height
- data = ob.data
+ data = my_cam.blenObject.data
- file.write('\n\tModel: "Model::%s", "Camera" {' % name )
+ file.write('\n\tModel: "Model::%s", "Camera" {' % my_cam.fbxName )
file.write('\n\t\tVersion: 232')
- loc, rot, scale, matrix, matrix_rot = write_object_props(ob)
+ loc, rot, scale, matrix, matrix_rot = write_object_props(my_cam.blenObject, None, my_cam.parRelMatrix())
file.write('\n\t\t\tProperty: "Roll", "Roll", "A+",0')
file.write('\n\t\t\tProperty: "FieldOfView", "FieldOfView", "A+",%.6f' % data.angle)
@@ -471,8 +944,8 @@ def write_scene(file, sce, world):
file.write('\n\t\tTypeFlags: "Camera"')
file.write('\n\t\tGeometryVersion: 124')
file.write('\n\t\tPosition: %.6f,%.6f,%.6f' % loc)
- file.write('\n\t\tUp: %.6f,%.6f,%.6f' % tuple(Blender.Mathutils.Vector(0,1,0) * matrix_rot) )
- file.write('\n\t\tLookAt: %.6f,%.6f,%.6f' % tuple(Blender.Mathutils.Vector(0,0,-1)*matrix_rot) )
+ file.write('\n\t\tUp: %.6f,%.6f,%.6f' % tuple(Vector(0,1,0) * matrix_rot) )
+ file.write('\n\t\tLookAt: %.6f,%.6f,%.6f' % tuple(Vector(0,0,-1)*matrix_rot) )
#file.write('\n\t\tUp: 0,0,0' )
#file.write('\n\t\tLookAt: 0,0,0' )
@@ -483,12 +956,12 @@ def write_scene(file, sce, world):
file.write('\n\t\tCameraOrthoZoom: 1')
file.write('\n\t}')
- def write_light(ob, name):
- light = ob.data
- file.write('\n\tModel: "Model::%s", "Light" {' % name)
+ def write_light(my_light):
+ light = my_light.blenObject.data
+ file.write('\n\tModel: "Model::%s", "Light" {' % my_light.fbxName)
file.write('\n\t\tVersion: 232')
- write_object_props(ob)
+ write_object_props(my_light.blenObject, None, my_light.parRelMatrix())
# Why are these values here twice?????? - oh well, follow the holy sdk's output
@@ -499,7 +972,20 @@ def write_scene(file, sce, world):
#eSPOT
light_type = light.type
if light_type > 3: light_type = 0
-
+
+ mode = light.mode
+ if mode & Blender.Lamp.Modes.RayShadow or mode & Blender.Lamp.Modes.Shadows:
+ do_shadow = 1
+ else:
+ do_shadow = 0
+
+ if mode & Blender.Lamp.Modes.OnlyShadow or (mode & Blender.Lamp.Modes.NoDiffuse and mode & Blender.Lamp.Modes.NoSpecular):
+ do_light = 0
+ else:
+ do_light = 1
+
+ scale = abs(GLOBAL_MATRIX.scalePart()[0]) # scale is always uniform in this case
+
file.write('\n\t\t\tProperty: "LightType", "enum", "",%i' % light_type)
file.write('\n\t\t\tProperty: "CastLightOnObject", "bool", "",1')
file.write('\n\t\t\tProperty: "DrawVolumetricLight", "bool", "",1')
@@ -507,15 +993,15 @@ def write_scene(file, sce, world):
file.write('\n\t\t\tProperty: "DrawFrontFacingVolumetricLight", "bool", "",0')
file.write('\n\t\t\tProperty: "GoboProperty", "object", ""')
file.write('\n\t\t\tProperty: "Color", "Color", "A+",1,1,1')
- file.write('\n\t\t\tProperty: "Intensity", "Intensity", "A+",%.2f' % (light.energy*100))
- file.write('\n\t\t\tProperty: "Cone angle", "Cone angle", "A+",%.2f' % light.spotSize)
+ file.write('\n\t\t\tProperty: "Intensity", "Intensity", "A+",%.2f' % (min(light.energy*100, 200))) # clamp below 200
+ file.write('\n\t\t\tProperty: "Cone angle", "Cone angle", "A+",%.2f' % (light.spotSize * scale))
file.write('\n\t\t\tProperty: "Fog", "Fog", "A+",50')
file.write('\n\t\t\tProperty: "Color", "Color", "A",%.2f,%.2f,%.2f' % tuple(light.col))
- file.write('\n\t\t\tProperty: "Intensity", "Intensity", "A+",%.2f' % (light.energy*100))
- file.write('\n\t\t\tProperty: "Cone angle", "Cone angle", "A+",%.2f' % light.spotSize)
+ file.write('\n\t\t\tProperty: "Intensity", "Intensity", "A+",%.2f' % (min(light.energy*100, 200))) # clamp below 200
+ file.write('\n\t\t\tProperty: "Cone angle", "Cone angle", "A+",%.2f' % (light.spotSize * scale))
file.write('\n\t\t\tProperty: "Fog", "Fog", "A+",50')
file.write('\n\t\t\tProperty: "LightType", "enum", "",%i' % light_type)
- file.write('\n\t\t\tProperty: "CastLightOnObject", "bool", "",1')
+ file.write('\n\t\t\tProperty: "CastLightOnObject", "bool", "",%i' % do_light)
file.write('\n\t\t\tProperty: "DrawGroundProjection", "bool", "",1')
file.write('\n\t\t\tProperty: "DrawFrontFacingVolumetricLight", "bool", "",0')
file.write('\n\t\t\tProperty: "DrawVolumetricLight", "bool", "",1')
@@ -528,7 +1014,7 @@ def write_scene(file, sce, world):
file.write('\n\t\t\tProperty: "EnableFarAttenuation", "bool", "",0')
file.write('\n\t\t\tProperty: "FarAttenuationStart", "double", "",0')
file.write('\n\t\t\tProperty: "FarAttenuationEnd", "double", "",0')
- file.write('\n\t\t\tProperty: "CastShadows", "bool", "",0')
+ file.write('\n\t\t\tProperty: "CastShadows", "bool", "",%i' % do_shadow)
file.write('\n\t\t\tProperty: "ShadowColor", "ColorRGBA", "",0,0,0,1')
file.write('\n\t\t}')
file.write('\n\t\tMultiLayer: 0')
@@ -539,12 +1025,36 @@ def write_scene(file, sce, world):
file.write('\n\t\tGeometryVersion: 124')
file.write('\n\t}')
- # Material Settings
- if world:
- world_amb = world.getAmb()
- else:
- world_amb = (0,0,0) # Default value
+ # matrixOnly is not used at the moment
+ def write_null(my_null = None, fbxName = None, matrixOnly = None):
+ # ob can be null
+ if not fbxName: fbxName = my_null.fbxName
+
+ file.write('\n\tModel: "Model::%s", "Null" {' % fbxName)
+ file.write('\n\t\tVersion: 232')
+
+ # only use this for the root matrix at the moment
+ if matrixOnly:
+ poseMatrix = write_object_props(None, None, matrixOnly)[3]
+
+ else: # all other Null's
+ if my_null: poseMatrix = write_object_props(my_null.blenObject, None, my_null.parRelMatrix())[3]
+ else: poseMatrix = write_object_props()[3]
+
+ pose_items.append((fbxName, poseMatrix))
+
+ file.write('''
+ }
+ MultiLayer: 0
+ MultiTake: 1
+ Shading: Y
+ Culling: "CullingOff"
+ TypeFlags: "Null"
+ }''')
+ # Material Settings
+ if world: world_amb = world.getAmb()
+ else: world_amb = (0,0,0) # Default value
def write_material(matname, mat):
file.write('\n\tMaterial: "Material::%s", "" {' % matname)
@@ -561,6 +1071,7 @@ def write_scene(file, sce, world):
mat_hard = (float(mat.hard)-1)/5.10
mat_spec = mat.spec/2.0
mat_alpha = mat.alpha
+ mat_emit = mat.emit
mat_shadeless = mat.mode & Blender.Material.Modes.SHADELESS
if mat_shadeless:
mat_shader = 'Lambert'
@@ -578,6 +1089,7 @@ def write_scene(file, sce, world):
mat_hard = 20.0
mat_spec = 0.2
mat_alpha = 1.0
+ mat_emit = 0.0
mat_shadeless = False
mat_shader = 'Phong'
@@ -588,27 +1100,27 @@ def write_scene(file, sce, world):
file.write('\n\t\tProperties60: {')
file.write('\n\t\t\tProperty: "ShadingModel", "KString", "", "%s"' % mat_shader)
file.write('\n\t\t\tProperty: "MultiLayer", "bool", "",0')
- file.write('\n\t\t\tProperty: "EmissiveColor", "ColorRGB", "",0,0,0')
- file.write('\n\t\t\tProperty: "EmissiveFactor", "double", "",1')
+ file.write('\n\t\t\tProperty: "EmissiveColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_cold) # emit and diffuse color are he same in blender
+ file.write('\n\t\t\tProperty: "EmissiveFactor", "double", "",%.4f' % mat_dif)
- file.write('\n\t\t\tProperty: "AmbientColor", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_colamb)
- file.write('\n\t\t\tProperty: "AmbientFactor", "double", "",%.1f' % mat_amb)
- file.write('\n\t\t\tProperty: "DiffuseColor", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_cold)
- file.write('\n\t\t\tProperty: "DiffuseFactor", "double", "",%.1f' % mat_dif)
+ file.write('\n\t\t\tProperty: "AmbientColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_colamb)
+ file.write('\n\t\t\tProperty: "AmbientFactor", "double", "",%.4f' % mat_amb)
+ file.write('\n\t\t\tProperty: "DiffuseColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_cold)
+ file.write('\n\t\t\tProperty: "DiffuseFactor", "double", "",%.4f' % mat_emit)
file.write('\n\t\t\tProperty: "Bump", "Vector3D", "",0,0,0')
file.write('\n\t\t\tProperty: "TransparentColor", "ColorRGB", "",1,1,1')
- file.write('\n\t\t\tProperty: "TransparencyFactor", "double", "",0')
+ file.write('\n\t\t\tProperty: "TransparencyFactor", "double", "",%.4f' % (1.0 - mat_alpha))
if not mat_shadeless:
- file.write('\n\t\t\tProperty: "SpecularColor", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_cols)
- file.write('\n\t\t\tProperty: "SpecularFactor", "double", "",%.1f' % mat_spec)
+ file.write('\n\t\t\tProperty: "SpecularColor", "ColorRGB", "",%.4f,%.4f,%.4f' % mat_cols)
+ file.write('\n\t\t\tProperty: "SpecularFactor", "double", "",%.4f' % mat_spec)
file.write('\n\t\t\tProperty: "ShininessExponent", "double", "",80.0')
file.write('\n\t\t\tProperty: "ReflectionColor", "ColorRGB", "",0,0,0')
file.write('\n\t\t\tProperty: "ReflectionFactor", "double", "",1')
- file.write('\n\t\t\tProperty: "Emissive", "Vector3D", "",0,0,0')
- file.write('\n\t\t\tProperty: "Ambient", "Vector3D", "",%.1f,%.1f,%.1f' % mat_colamb)
- file.write('\n\t\t\tProperty: "Diffuse", "Vector3D", "",%.1f,%.1f,%.1f' % mat_cold)
+ file.write('\n\t\t\tProperty: "Emissive", "ColorRGB", "",0,0,0')
+ file.write('\n\t\t\tProperty: "Ambient", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_colamb)
+ file.write('\n\t\t\tProperty: "Diffuse", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_cold)
if not mat_shadeless:
- file.write('\n\t\t\tProperty: "Specular", "Vector3D", "",%.1f,%.1f,%.1f' % mat_cols)
+ file.write('\n\t\t\tProperty: "Specular", "ColorRGB", "",%.1f,%.1f,%.1f' % mat_cols)
file.write('\n\t\t\tProperty: "Shininess", "double", "",%.1f' % mat_hard)
file.write('\n\t\t\tProperty: "Opacity", "double", "",%.1f' % mat_alpha)
if not mat_shadeless:
@@ -669,15 +1181,21 @@ def write_scene(file, sce, world):
Property: "Rotation", "Vector", "A+",0,0,0
Property: "Scaling", "Vector", "A+",1,1,1''')
file.write('\n\t\t\tProperty: "Texture alpha", "Number", "A+",%i' % num)
+
+
+ # WrapModeU/V 0==rep, 1==clamp, TODO add support
file.write('''
Property: "TextureTypeUse", "enum", "",0
Property: "CurrentTextureBlendMode", "enum", "",1
Property: "UseMaterial", "bool", "",0
Property: "UseMipMap", "bool", "",0
Property: "CurrentMappingType", "enum", "",0
- Property: "UVSwap", "bool", "",0
- Property: "WrapModeU", "enum", "",0
- Property: "WrapModeV", "enum", "",0
+ Property: "UVSwap", "bool", "",0''')
+
+ file.write('\n\t\t\tProperty: "WrapModeU", "enum", "",%i' % tex.clampX)
+ file.write('\n\t\t\tProperty: "WrapModeV", "enum", "",%i' % tex.clampY)
+
+ file.write('''
Property: "TextureRotationPivot", "Vector3D", "",0,0,0
Property: "TextureScalingPivot", "Vector3D", "",0,0,0
Property: "VideoProperty", "object", ""
@@ -698,194 +1216,143 @@ def write_scene(file, sce, world):
Texture_Alpha_Source: "None"
Cropping: 0,0,0,0
}''')
-
- ob_meshes = []
- ob_lights = []
- ob_cameras = []
- materials = {}
- textures = {}
- armatures = [] # We should export standalone armatures also
- armatures_totbones = 0 # we need this because each bone is a model
- for ob_base in sce.objects.context:
- for ob, mtx in BPyObject.getDerivedObjects(ob_base):
- #for ob in [ob_base,]:
- ob_type = ob.type
- if ob_type == 'Camera':
- ob_cameras.append((sane_obname(ob), ob))
- elif ob_type == 'Lamp':
- ob_lights.append((sane_obname(ob), ob))
-
- else:
- if ob_type == 'Mesh': me = ob.getData(mesh=1)
- else: me = BPyMesh.getMeshFromObject(ob)
-
- if me:
- mats = me.materials
- for mat in mats:
- # 2.44 use mat.lib too for uniqueness
- if mat: materials[mat.name] = mat
-
- if me.faceUV:
- uvlayer_orig = me.activeUVLayer
- for uvlayer in me.getUVLayerNames():
- me.activeUVLayer = uvlayer
- for f in me.faces:
- img = f.image
- if img: textures[img.name] = img
-
- me.activeUVLayer = uvlayer_orig
-
- arm = BPyObject.getObjectArmature(ob)
-
- if arm:
- armname = sane_obname(arm)
- bones = arm.bones.values()
- armatures_totbones += len(bones)
- armatures.append((arm, armname, bones))
- else:
- armname = None
-
- #### me.transform(ob.matrixWorld) # Export real ob coords.
- #### High Quality, not realy needed for now.
- #BPyMesh.meshCalcNormals(me) # high quality normals nice for realtime engines.
- ob_meshes.append( (sane_obname(ob), ob, mtx, me, mats, arm, armname) )
-
- del ob_type
-
- materials = [(sane_matname(mat), mat) for mat in materials.itervalues()]
- textures = [(sane_texname(img), img) for img in textures.itervalues()]
- materials.sort() # sort by name
- textures.sort()
-
- if not materials:
- materials = [('null', None)]
-
- material_mapping = {} # blen name : index
- if textures:
- texture_mapping_local = {None:0} # ditto
- i = 0
- for texname, tex in textures:
- texture_mapping_local[tex.name] = i
- i+=1
- textures.insert(0, ('_empty_', None))
-
- i = 0
- for matname, mat in materials:
- if mat: mat = mat.name
- material_mapping[mat] = i
- i+=1
-
- camera_count = 8
- file.write('''
-
-; Object definitions
-;------------------------------------------------------------------
-Definitions: {
- Version: 100
- Count: %i''' % (\
- 1+1+camera_count+\
- len(ob_meshes)+\
- len(ob_lights)+\
- len(ob_cameras)+\
- len(armatures)+\
- armatures_totbones+\
- len(materials)+\
- (len(textures)*2))) # add 1 for the root model 1 for global settings
-
- file.write('''
- ObjectType: "Model" {
- Count: %i
- }''' % (\
- 1+camera_count+\
- len(ob_meshes)+\
- len(ob_lights)+\
- len(ob_cameras)+\
- len(armatures)+\
- armatures_totbones)) # add 1 for the root model
-
- file.write('''
- ObjectType: "Geometry" {
- Count: %i
- }''' % len(ob_meshes))
-
- if materials:
- file.write('''
- ObjectType: "Material" {
- Count: %i
- }''' % len(materials))
-
- if textures:
- file.write('''
- ObjectType: "Texture" {
- Count: %i
- }''' % len(textures)) # add 1 for an empty tex
+ def write_deformer_skin(obname):
+ '''
+ Each mesh has its own deformer
+ '''
+ file.write('\n\tDeformer: "Deformer::Skin %s", "Skin" {' % obname)
file.write('''
- ObjectType: "Video" {
- Count: %i
- }''' % len(textures)) # add 1 for an empty tex
-
- file.write('''
- ObjectType: "GlobalSettings" {
- Count: 1
- }
-}
-''')
-
- file.write(\
-'''
-; Object properties
-;------------------------------------------------------------------
-
-Objects: {''')
-
- # To comply with other FBX FILES
- write_camera_switch()
-
- # Write the null object
- file.write('''
- Model: "Model::blend_root", "Null" {
- Version: 232''')
- write_object_props()
-
- file.write('''
- }
+ Version: 100
MultiLayer: 0
- MultiTake: 1
- Shading: Y
- Culling: "CullingOff"
- TypeFlags: "Null"
+ Type: "Skin"
+ Properties60: {
+ }
+ Link_DeformAcuracy: 50
}''')
- for obname, ob in ob_cameras:
- write_camera(ob, obname)
-
- for obname, ob in ob_lights:
- write_light(ob, obname)
+ # in the example was 'Bip01 L Thigh_2'
+ def write_sub_deformer_skin(my_mesh, my_bone, weights):
+
+ '''
+ Each subdeformer is spesific to a mesh, but the bone it links to can be used by many sub-deformers
+ So the SubDeformer needs the mesh-object name as a prefix to make it unique
+
+ Its possible that there is no matching vgroup in this mesh, in that case no verts are in the subdeformer,
+ a but silly but dosnt really matter
+ '''
+ file.write('\n\tDeformer: "SubDeformer::Cluster %s %s", "Cluster" {' % (my_mesh.fbxName, my_bone.fbxName))
+
+ file.write('''
+ Version: 100
+ MultiLayer: 0
+ Type: "Cluster"
+ Properties60: {
+ Property: "SrcModel", "object", ""
+ Property: "SrcModelReference", "object", ""
+ }
+ UserData: "", ""''')
+
+ # Support for bone parents
+ if my_mesh.fbxBoneParent:
+ if my_mesh.fbxBoneParent == my_bone:
+ # TODO - this is a bit lazy, we could have a simple write loop
+ # for this case because all weights are 1.0 but for now this is ok
+ # Parent Bones arent used all that much anyway.
+ vgroup_data = [(j, 1.0) for j in xrange(len(my_mesh.blenData.verts))]
+ else:
+ # This bone is not a parent of this mesh object, no weights
+ vgroup_data = []
+
+ else:
+ # Normal weight painted mesh
+ if my_bone.blenName in weights[0]:
+ # Before we used normalized wright list
+ #vgroup_data = me.getVertsFromGroup(bone.name, 1)
+ group_index = weights[0].index(my_bone.blenName)
+ vgroup_data = [(j, weight[group_index]) for j, weight in enumerate(weights[1]) if weight[group_index]]
+ else:
+ vgroup_data = []
+
+ file.write('\n\t\tIndexes: ')
+
+ i = -1
+ for vg in vgroup_data:
+ if i == -1:
+ file.write('%i' % vg[0])
+ i=0
+ else:
+ if i==23:
+ file.write('\n\t\t')
+ i=0
+ file.write(',%i' % vg[0])
+ i+=1
+
+ file.write('\n\t\tWeights: ')
+ i = -1
+ for vg in vgroup_data:
+ if i == -1:
+ file.write('%.8f' % vg[1])
+ i=0
+ else:
+ if i==38:
+ file.write('\n\t\t')
+ i=0
+ file.write(',%.8f' % vg[1])
+ i+=1
+
+ if my_mesh.fbxParent:
+ # TODO FIXME, this case is broken in some cases. skinned meshes just shouldnt have parents where possible!
+ m = mtx4_z90 * (my_bone.restMatrix * my_bone.fbxArm.matrixWorld.copy() * my_mesh.matrixWorld.copy().invert() )
+ else:
+ # Yes! this is it... - but dosnt work when the mesh is a.
+ m = mtx4_z90 * (my_bone.restMatrix * my_bone.fbxArm.matrixWorld.copy() * my_mesh.matrixWorld.copy().invert() )
+
+ #m = mtx4_z90 * my_bone.restMatrix
+ matstr = mat4x4str(m)
+ matstr_i = mat4x4str(m.invert())
+
+ file.write('\n\t\tTransform: %s' % matstr_i) # THIS IS __NOT__ THE GLOBAL MATRIX AS DOCUMENTED :/
+ file.write('\n\t\tTransformLink: %s' % matstr)
+ file.write('\n\t}')
- for obname, ob, mtx, me, mats, arm, armname in ob_meshes:
- file.write('\n\tModel: "Model::%s", "Mesh" {' % sane_obname(ob))
+ def write_mesh(my_mesh):
+
+ me = my_mesh.blenData
+
+ # if there are non NULL materials on this mesh
+ if [mat for mat in my_mesh.blenMaterials if mat]: do_materials = True
+ else: do_materials = False
+
+ if my_mesh.blenTextures: do_textures = True
+ else: do_textures = False
+
+
+ file.write('\n\tModel: "Model::%s", "Mesh" {' % my_mesh.fbxName)
file.write('\n\t\tVersion: 232') # newline is added in write_object_props
- write_object_props(ob, None, mtx)
+
+ write_object_props(my_mesh.blenObject, None, my_mesh.parRelMatrix())
+
file.write('\n\t\t}')
file.write('\n\t\tMultiLayer: 0')
file.write('\n\t\tMultiTake: 1')
file.write('\n\t\tShading: Y')
file.write('\n\t\tCulling: "CullingOff"')
+
# Write the Real Mesh data here
file.write('\n\t\tVertices: ')
i=-1
+
for v in me.verts:
if i==-1:
- file.write('%.6f,%.6f,%.6f' % tuple(v.co))
- i=0
+ file.write('%.6f,%.6f,%.6f' % tuple(v.co)); i=0
else:
if i==7:
- file.write('\n\t\t')
- i=0
+ file.write('\n\t\t'); i=0
file.write(',%.6f,%.6f,%.6f'% tuple(v.co))
i+=1
+
file.write('\n\t\tPolygonVertexIndex: ')
i=-1
for f in me.faces:
@@ -932,22 +1399,20 @@ Objects: {''')
MappingInformationType: "ByVertice"
ReferenceInformationType: "Direct"
Normals: ''')
-
+
i=-1
for v in me.verts:
if i==-1:
- file.write('%.15f,%.15f,%.15f' % tuple(v.no))
- i=0
+ file.write('%.15f,%.15f,%.15f' % tuple(v.no)); i=0
else:
if i==2:
- file.write('\n ')
- i=0
+ file.write('\n '); i=0
file.write(',%.15f,%.15f,%.15f' % tuple(v.no))
i+=1
file.write('\n\t\t}')
-
# Write VertexColor Layers
+ # note, no programs seem to use this info :/
collayers = []
if me.vertexColors:
collayers = me.getColorLayerNames()
@@ -1043,32 +1508,47 @@ Objects: {''')
file.write('\n\t\t}')
- if textures:
+ if do_textures:
file.write('\n\t\tLayerElementTexture: %i {' % uvindex)
file.write('\n\t\t\tVersion: 101')
file.write('\n\t\t\tName: "%s"' % uvlayer)
- file.write('''
- MappingInformationType: "ByPolygon"
- ReferenceInformationType: "IndexToDirect"
- BlendMode: "Translucent"
- TextureAlpha: 1
- TextureId: ''')
- i=-1
- for f in me.faces:
- img_key = f.image
- if img_key: img_key = img_key.name
+ if len(my_mesh.blenTextures) == 1:
+ file.write('\n\t\t\tMappingInformationType: "AllSame"')
+ else:
+ file.write('\n\t\t\tMappingInformationType: "ByPolygon"')
+
+ file.write('\n\t\t\tReferenceInformationType: "IndexToDirect"')
+ file.write('\n\t\t\tBlendMode: "Translucent"')
+ file.write('\n\t\t\tTextureAlpha: 1')
+ file.write('\n\t\t\tTextureId: ')
+
+ if len(my_mesh.blenTextures) == 1:
+ file.write('0')
+ else:
+ #texture_mapping_local = {None:0}
+ texture_mapping_local = {None:-1}
- if i==-1:
- i=0
- file.write( '%s' % texture_mapping_local[img_key])
- else:
- if i==55:
- file.write('\n ')
- i=0
+ i = 0 # 1 for dummy
+ for tex in my_mesh.blenTextures:
+ texture_mapping_local[tex] = i
+ i+=1
+
+ i=-1
+ for f in me.faces:
+ img_key = f.image
- file.write(',%s' % texture_mapping_local[img_key])
- i+=1
+ if i==-1:
+ i=0
+ file.write( '%s' % texture_mapping_local[img_key])
+ else:
+ if i==55:
+ file.write('\n ')
+ i=0
+
+ file.write(',%s' % texture_mapping_local[img_key])
+ i+=1
+
else:
file.write('''
LayerElementTexture: 0 {
@@ -1085,44 +1565,50 @@ Objects: {''')
# Done with UV/textures.
- if materials:
- file.write('''
- LayerElementMaterial: 0 {
- Version: 101
- Name: ""
- MappingInformationType: "ByPolygon"
- ReferenceInformationType: "IndexToDirect"
- Materials: ''')
-
- # Build a material mapping for this
- material_mapping_local = {} # local-index : global index.
- for i, mat in enumerate(mats):
- if mat:
- material_mapping_local[i] = material_mapping[mat.name]
- else:
- material_mapping_local[i] = 0 # None material is zero for now.
+ if do_materials:
+ file.write('\n\t\tLayerElementMaterial: 0 {')
+ file.write('\n\t\t\tVersion: 101')
+ file.write('\n\t\t\tName: ""')
- if not material_mapping_local:
- material_mapping_local[0] = 0
+ if len(my_mesh.blenMaterials) == 1:
+ file.write('\n\t\t\tMappingInformationType: "AllSame"')
+ else:
+ file.write('\n\t\t\tMappingInformationType: "ByPolygon"')
- len_material_mapping_local = len(material_mapping_local)
+ file.write('\n\t\t\tReferenceInformationType: "IndexToDirect"')
+ file.write('\n\t\t\tMaterials: ')
- i=-1
- for f in me.faces:
- f_mat = f.mat
- if f_mat >= len_material_mapping_local:
- f_mat = 0
+ if len(my_mesh.blenMaterials) == 1:
+ file.write('0')
+ else:
+ # Build a material mapping for this
+ #material_mapping_local = [0] * 16 # local-index : global index.
+ material_mapping_local = [-1] * 16 # local-index : global index.
+ i= 0 # 1
+ for j, mat in enumerate(my_mesh.blenMaterials):
+ if mat:
+ material_mapping_local[j] = i
+ i+=1
+ # else leave as -1
- if i==-1:
- i=0
- file.write( '%s' % material_mapping_local[f_mat])
- else:
- if i==55:
- file.write('\n\t\t\t\t')
- i=0
+ len_material_mapping_local = len(material_mapping_local)
+
+ i=-1
+ for f in me.faces:
+ f_mat = f.mat
+ if f_mat >= len_material_mapping_local:
+ f_mat = 0
- file.write(',%s' % material_mapping_local[f_mat])
- i+=1
+ if i==-1:
+ i=0
+ file.write( '%s' % (material_mapping_local[f_mat]))
+ else:
+ if i==55:
+ file.write('\n\t\t\t\t')
+ i=0
+
+ file.write(',%s' % (material_mapping_local[f_mat]))
+ i+=1
file.write('\n\t\t}')
@@ -1134,7 +1620,7 @@ Objects: {''')
TypedIndex: 0
}''')
- if materials:
+ if do_materials:
file.write('''
LayerElement: {
Type: "LayerElementMaterial"
@@ -1142,7 +1628,7 @@ Objects: {''')
}''')
# Always write this
- if textures:
+ if do_textures:
file.write('''
LayerElement: {
Type: "LayerElementTexture"
@@ -1179,7 +1665,7 @@ Objects: {''')
file.write('\n\t\t\t\tTypedIndex: %i' % i)
file.write('\n\t\t\t}')
- if textures:
+ if do_textures:
file.write('''
LayerElement: {
@@ -1206,7 +1692,425 @@ Objects: {''')
file.write('\n\t\t\t\tTypedIndex: %i' % i)
file.write('\n\t\t\t}')
file.write('\n\t\t}')
- file.write('\n\t}')
+ file.write('\n\t}')
+
+ def write_group(name):
+ file.write('\n\tGroupSelection: "GroupSelection::%s", "Default" {' % name)
+
+ file.write('''
+ Properties60: {
+ Property: "MultiLayer", "bool", "",0
+ Property: "Pickable", "bool", "",1
+ Property: "Transformable", "bool", "",1
+ Property: "Show", "bool", "",1
+ }
+ MultiLayer: 0
+ }''')
+
+
+ # add meshes here to clear because they are not used anywhere.
+ meshes_to_clear = []
+
+ ob_meshes = []
+ ob_lights = []
+ ob_cameras = []
+ # in fbx we export bones as children of the mesh
+ # armatures not a part of a mesh, will be added to ob_arms
+ ob_bones = []
+ ob_arms = []
+ ob_null = [] # emptys
+
+ # List of types that have blender objects (not bones)
+ ob_all_typegroups = [ob_meshes, ob_lights, ob_cameras, ob_arms, ob_null]
+
+ groups = [] # blender groups, only add ones that have objects in the selections
+ materials = {}
+ textures = {}
+
+ tmp_ob_type = ob_type = None # incase no objects are exported, so as not to raise an error
+
+ # if EXP_OBS_SELECTED is false, use sceens objects
+ if not batch_objects:
+ if EXP_OBS_SELECTED: tmp_objects = sce.objects.context
+ else: tmp_objects = sce.objects
+ else:
+ tmp_objects = batch_objects
+
+ if EXP_ARMATURE:
+ # This is needed so applying modifiers dosnt apply the armature deformation, its also needed
+ # ...so mesh objects return their rest worldspace matrix when bone-parents are exported as weighted meshes.
+ # set every armature to its rest, backup the original values so we done mess up the scene
+ ob_arms_orig_rest = [arm.restPosition for arm in bpy.data.armatures]
+
+ for arm in bpy.data.armatures:
+ arm.restPosition = True
+
+ if ob_arms_orig_rest:
+ for ob_base in bpy.data.objects:
+ #if ob_base.type == 'Armature':
+ ob_base.makeDisplayList()
+
+ # This causes the makeDisplayList command to effect the mesh
+ Blender.Set('curframe', Blender.Get('curframe'))
+
+
+ for ob_base in tmp_objects:
+ for ob, mtx in BPyObject.getDerivedObjects(ob_base):
+ #for ob in [ob_base,]:
+ tmp_ob_type = ob.type
+ if tmp_ob_type == 'Camera':
+ if EXP_CAMERA:
+ ob_cameras.append(my_object_generic(ob, mtx))
+ elif tmp_ob_type == 'Lamp':
+ if EXP_LAMP:
+ ob_lights.append(my_object_generic(ob, mtx))
+ elif tmp_ob_type == 'Armature':
+ if EXP_ARMATURE:
+ # TODO - armatures dont work in dupligroups!
+ if ob not in ob_arms: ob_arms.append(ob)
+ # ob_arms.append(ob) # replace later. was "ob_arms.append(sane_obname(ob), ob)"
+ elif tmp_ob_type == 'Empty':
+ if EXP_EMPTY:
+ ob_null.append(my_object_generic(ob, mtx))
+ elif EXP_MESH:
+ origData = True
+ if tmp_ob_type != 'Mesh':
+ me = bpy.data.meshes.new()
+ try: me.getFromObject(ob)
+ except: me = None
+ if me:
+ meshes_to_clear.append( me )
+ mats = me.materials
+ origData = False
+ else:
+ # Mesh Type!
+ if EXP_MESH_APPLY_MOD:
+ me = bpy.data.meshes.new()
+ me.getFromObject(ob)
+
+ # so we keep the vert groups
+ if EXP_ARMATURE:
+ orig_mesh = ob.getData(mesh=1)
+ if orig_mesh.getVertGroupNames():
+ ob.copy().link(me)
+ # If new mesh has no vgroups we can try add if verts are teh same
+ if not me.getVertGroupNames(): # vgroups were not kept by the modifier
+ if len(me.verts) == len(orig_mesh.verts):
+ groupNames, vWeightDict = BPyMesh.meshWeight2Dict(orig_mesh)
+ BPyMesh.dict2MeshWeight(me, groupNames, vWeightDict)
+
+ # print ob, me, me.getVertGroupNames()
+ meshes_to_clear.append( me )
+ origData = False
+ mats = me.materials
+ else:
+ me = ob.getData(mesh=1)
+ mats = me.materials
+
+ # Support object colors
+ tmp_colbits = ob.colbits
+ if tmp_colbits:
+ tmp_ob_mats = ob.getMaterials(1) # 1 so we get None's too.
+ for i in xrange(16):
+ if tmp_colbits & (1<<i):
+ mats[i] = tmp_ob_mats[i]
+ del tmp_ob_mats
+ del tmp_colbits
+
+
+ if me:
+ # This WILL modify meshes in blender if EXP_MESH_APPLY_MOD is disabled.
+ # so strictly this is bad. but only in rare cases would it have negative results
+ # say with dupliverts the objects would rotate a bit differently
+ if EXP_MESH_HQ_NORMALS:
+ BPyMesh.meshCalcNormals(me) # high quality normals nice for realtime engines.
+
+ for mat in mats:
+ # 2.44 use mat.lib too for uniqueness
+ if mat: materials[mat] = mat
+
+ texture_mapping_local = {}
+ if me.faceUV:
+ uvlayer_orig = me.activeUVLayer
+ for uvlayer in me.getUVLayerNames():
+ me.activeUVLayer = uvlayer
+ for f in me.faces:
+ img = f.image
+ textures[img] = texture_mapping_local[img] = img
+
+ me.activeUVLayer = uvlayer_orig
+
+ if EXP_ARMATURE:
+ armob = BPyObject.getObjectArmature(ob)
+ blenParentBoneName = None
+
+ # Note - Fixed in BPyObject but for now just copy the function because testers wont have up to date modukes,
+ # TODO - remove this for 2.45 release since getObjectArmature has been fixed
+ if (not armob) and ob.parent and ob.parent.type == 'Armature' and ob.parentType == Blender.Object.ParentTypes.ARMATURE:
+ armob = ob.parent
+
+ # parent bone - special case
+ if (not armob) and ob.parent and ob.parent.type == 'Armature' and ob.parentType == Blender.Object.ParentTypes.BONE:
+ armob = ob.parent
+ blenParentBoneName = ob.parentbonename
+
+
+ if armob and armob not in ob_arms:
+ ob_arms.append(armob)
+
+ else:
+ blenParentBoneName = armob = None
+
+ my_mesh = my_object_generic(ob, mtx)
+ my_mesh.blenData = me
+ my_mesh.origData = origData
+ my_mesh.blenMaterials = mats
+ my_mesh.blenTextures = texture_mapping_local.values()
+
+ # if only 1 null texture then empty the list
+ if len(my_mesh.blenTextures) == 1 and my_mesh.blenTextures[0] == None:
+ my_mesh.blenTextures = []
+
+ my_mesh.fbxArm = armob # replace with my_object_generic armature instance later
+ my_mesh.fbxBoneParent = blenParentBoneName # replace with my_bone instance later
+
+ ob_meshes.append( my_mesh )
+
+ if EXP_ARMATURE:
+ # now we have the meshes, restore the rest arm position
+ for i, arm in enumerate(bpy.data.armatures):
+ arm.restPosition = ob_arms_orig_rest[i]
+
+ if ob_arms_orig_rest:
+ for ob_base in bpy.data.objects:
+ if ob_base.type == 'Armature':
+ ob_base.makeDisplayList()
+ # This causes the makeDisplayList command to effect the mesh
+ Blender.Set('curframe', Blender.Get('curframe'))
+
+ del tmp_ob_type, tmp_objects
+
+ # now we have collected all armatures, add bones
+ for i, ob in enumerate(ob_arms):
+
+ ob_arms[i] = my_arm = my_object_generic(ob)
+
+ my_arm.fbxBones = []
+ my_arm.blenData = ob.data
+ my_arm.blenAction = ob.action
+ my_arm.blenActionList = []
+
+ # fbxName, blenderObject, my_bones, blenderActions
+ #ob_arms[i] = fbxArmObName, ob, arm_my_bones, (ob.action, [])
+
+ for bone in my_arm.blenData.bones.values():
+ my_bone = my_bone_class(bone, my_arm)
+ my_arm.fbxBones.append( my_bone )
+ ob_bones.append( my_bone )
+
+ # add the meshes to the bones and replace the meshes armature with own armature class
+ #for obname, ob, mtx, me, mats, arm, armname in ob_meshes:
+ for my_mesh in ob_meshes:
+ # Replace
+ # ...this could be sped up with dictionary mapping but its unlikely for
+ # it ever to be a bottleneck - (would need 100+ meshes using armatures)
+ if my_mesh.fbxArm:
+ for my_arm in ob_arms:
+ if my_arm.blenObject == my_mesh.fbxArm:
+ my_mesh.fbxArm = my_arm
+ break
+
+ for my_bone in ob_bones:
+
+ # The mesh uses this bones armature!
+ if my_bone.fbxArm == my_mesh.fbxArm:
+ my_bone.blenMeshes[my_mesh.fbxName] = me
+
+
+ # parent bone: replace bone names with our class instances
+ # my_mesh.fbxBoneParent is None or a blender bone name initialy, replacing if the names match.
+ if my_mesh.fbxBoneParent == my_bone.blenName:
+ my_mesh.fbxBoneParent = my_bone
+
+ bone_deformer_count = 0 # count how many bones deform a mesh
+ my_bone_blenParent = None
+ for my_bone in ob_bones:
+ my_bone_blenParent = my_bone.blenBone.parent
+ if my_bone_blenParent:
+ for my_bone_parent in ob_bones:
+ # Note 2.45rc2 you can compare bones normally
+ if my_bone_blenParent.name == my_bone_parent.blenName and my_bone.fbxArm == my_bone_parent.fbxArm:
+ my_bone.parent = my_bone_parent
+ break
+
+ # Not used at the moment
+ # my_bone.calcRestMatrixLocal()
+ bone_deformer_count += len(my_bone.blenMeshes)
+
+ del my_bone_blenParent
+
+
+ # Build blenObject -> fbxObject mapping
+ # this is needed for groups as well as fbxParenting
+ bpy.data.objects.tag = False
+ tmp_obmapping = {}
+ for ob_generic in ob_all_typegroups:
+ for ob_base in ob_generic:
+ ob_base.blenObject.tag = True
+ tmp_obmapping[ob_base.blenObject] = ob_base
+
+ # Build Groups from objects we export
+ for blenGroup in bpy.data.groups:
+ fbxGroupName = None
+ for ob in blenGroup.objects:
+ if ob.tag:
+ if fbxGroupName == None:
+ fbxGroupName = sane_groupname(blenGroup)
+ groups.append((fbxGroupName, blenGroup))
+
+ tmp_obmapping[ob].fbxGroupNames.append(fbxGroupName) # also adds to the objects fbxGroupNames
+
+ groups.sort() # not really needed
+
+ # Assign parents using this mapping
+ for ob_generic in ob_all_typegroups:
+ for my_ob in ob_generic:
+ parent = my_ob.blenObject.parent
+ if parent and parent.tag: # does it exist and is it in the mapping
+ my_ob.fbxParent = tmp_obmapping[parent]
+
+
+ del tmp_obmapping
+ # Finished finding groups we use
+
+
+ materials = [(sane_matname(mat), mat) for mat in materials.itervalues() if mat]
+ textures = [(sane_texname(img), img) for img in textures.itervalues() if img]
+ materials.sort() # sort by name
+ textures.sort()
+
+ camera_count = 8
+ file.write('''
+
+; Object definitions
+;------------------------------------------------------------------
+
+Definitions: {
+ Version: 100
+ Count: %i''' % (\
+ 1+1+camera_count+\
+ len(ob_meshes)+\
+ len(ob_lights)+\
+ len(ob_cameras)+\
+ len(ob_arms)+\
+ len(ob_null)+\
+ len(ob_bones)+\
+ bone_deformer_count+\
+ len(materials)+\
+ (len(textures)*2))) # add 1 for the root model 1 for global settings
+
+ del bone_deformer_count
+
+ file.write('''
+ ObjectType: "Model" {
+ Count: %i
+ }''' % (\
+ 1+camera_count+\
+ len(ob_meshes)+\
+ len(ob_lights)+\
+ len(ob_cameras)+\
+ len(ob_arms)+\
+ len(ob_null)+\
+ len(ob_bones))) # add 1 for the root model
+
+ file.write('''
+ ObjectType: "Geometry" {
+ Count: %i
+ }''' % len(ob_meshes))
+
+ if materials:
+ file.write('''
+ ObjectType: "Material" {
+ Count: %i
+ }''' % len(materials))
+
+ if textures:
+ file.write('''
+ ObjectType: "Texture" {
+ Count: %i
+ }''' % len(textures)) # add 1 for an empty tex
+ file.write('''
+ ObjectType: "Video" {
+ Count: %i
+ }''' % len(textures)) # add 1 for an empty tex
+
+ tmp = 0
+ # Add deformer nodes
+ for my_mesh in ob_meshes:
+ if my_mesh.fbxArm:
+ tmp+=1
+
+ # Add subdeformers
+ for my_bone in ob_bones:
+ tmp += len(my_bone.blenMeshes)
+
+ if tmp:
+ file.write('''
+ ObjectType: "Deformer" {
+ Count: %i
+ }''' % tmp)
+ del tmp
+
+ # we could avoid writing this possibly but for now just write it
+
+ file.write('''
+ ObjectType: "Pose" {
+ Count: 1
+ }''')
+
+ if groups:
+ file.write('''
+ ObjectType: "GroupSelection" {
+ Count: %i
+ }''' % len(groups))
+
+ file.write('''
+ ObjectType: "GlobalSettings" {
+ Count: 1
+ }
+}''')
+
+ file.write('''
+
+; Object properties
+;------------------------------------------------------------------
+
+Objects: {''')
+
+ # To comply with other FBX FILES
+ write_camera_switch()
+
+ # Write the null object
+ write_null(None, 'blend_root')# , GLOBAL_MATRIX)
+
+ for my_null in ob_null:
+ write_null(my_null)
+
+ for my_arm in ob_arms:
+ write_null(my_arm)
+
+ for my_cam in ob_cameras:
+ write_camera(my_cam)
+
+ for my_light in ob_lights:
+ write_light(my_light)
+
+ for my_mesh in ob_meshes:
+ write_mesh(my_mesh)
+
+ #for bonename, bone, obname, me, armob in ob_bones:
+ for my_bone in ob_bones:
+ write_bone(my_bone)
write_camera_default()
@@ -1221,6 +2125,51 @@ Objects: {''')
write_texture(texname, tex, i)
i+=1
+ for groupname, group in groups:
+ write_group(groupname)
+
+ # NOTE - c4d and motionbuilder dont need normalized weights, but deep-exploration 5 does and (max?) do.
+
+ # Write armature modifiers
+ # TODO - add another MODEL? - because of this skin definition.
+ for my_mesh in ob_meshes:
+ if my_mesh.fbxArm:
+ write_deformer_skin(my_mesh.fbxName)
+
+ # Get normalized weights for temorary use
+ if my_mesh.fbxBoneParent:
+ weights = None
+ else:
+ weights = meshNormalizedWeights(my_mesh.blenData)
+
+ #for bonename, bone, obname, bone_mesh, armob in ob_bones:
+ for my_bone in ob_bones:
+ if me in my_bone.blenMeshes.itervalues():
+ write_sub_deformer_skin(my_mesh, my_bone, weights)
+
+ # Write pose's really weired, only needed when an armature and mesh are used together
+ # each by themselves dont need pose data. for now only pose meshes and bones
+
+ file.write('''
+ Pose: "Pose::BIND_POSES", "BindPose" {
+ Type: "BindPose"
+ Version: 100
+ Properties60: {
+ }
+ NbPoseNodes: ''')
+ file.write(str(len(pose_items)))
+
+
+ for fbxName, matrix in pose_items:
+ file.write('\n\t\tPoseNode: {')
+ file.write('\n\t\t\tNode: "Model::%s"' % fbxName )
+ if matrix: file.write('\n\t\t\tMatrix: %s' % mat4x4str(matrix))
+ else: file.write('\n\t\t\tMatrix: %s' % mat4x4str(mtx4_identity))
+ file.write('\n\t\t}')
+
+ file.write('\n\t}')
+
+
# Finish Writing Objects
# Write global settings
file.write('''
@@ -1233,7 +2182,7 @@ Objects: {''')
Property: "FrontAxisSign", "int", "",1
Property: "CoordAxis", "int", "",0
Property: "CoordAxisSign", "int", "",1
- Property: "UnitScaleFactor", "double", "",1
+ Property: "UnitScaleFactor", "double", "",100
}
}
''')
@@ -1247,14 +2196,26 @@ Objects: {''')
Relations: {''')
file.write('\n\tModel: "Model::blend_root", "Null" {\n\t}')
- for obname, ob in ob_cameras:
- file.write('\n\tModel: "Model::%s", "Camera" {\n\t}' % obname)
+
+ for my_null in ob_null:
+ file.write('\n\tModel: "Model::%s", "Null" {\n\t}' % my_null.fbxName)
+
+ for my_arm in ob_arms:
+ file.write('\n\tModel: "Model::%s", "Null" {\n\t}' % my_arm.fbxName)
+
+ for my_mesh in ob_meshes:
+ file.write('\n\tModel: "Model::%s", "Mesh" {\n\t}' % my_mesh.fbxName)
+
+ # TODO - limbs can have the same name for multiple armatures, should prefix.
+ #for bonename, bone, obname, me, armob in ob_bones:
+ for my_bone in ob_bones:
+ file.write('\n\tModel: "Model::%s", "Limb" {\n\t}' % my_bone.fbxName)
- for obname, ob in ob_lights:
- file.write('\n\tModel: "Model::%s", "Light" {\n\t}' % obname)
+ for my_cam in ob_cameras:
+ file.write('\n\tModel: "Model::%s", "Camera" {\n\t}' % my_cam.fbxName)
- for obname, ob, mtx, me, mats, arm, armname in ob_meshes:
- file.write('\n\tModel: "Model::%s", "Mesh" {\n\t}' % obname)
+ for my_light in ob_lights:
+ file.write('\n\tModel: "Model::%s", "Light" {\n\t}' % my_light.fbxName)
file.write('''
Model: "Model::Producer Perspective", "Camera" {
@@ -1283,6 +2244,23 @@ Relations: {''')
for texname, tex in textures:
file.write('\n\tVideo: "Video::%s", "Clip" {\n\t}' % texname)
+ # deformers - modifiers
+ for my_mesh in ob_meshes:
+ if my_mesh.fbxArm:
+ file.write('\n\tDeformer: "Deformer::Skin %s", "Skin" {\n\t}' % my_mesh.fbxName)
+
+ #for bonename, bone, obname, me, armob in ob_bones:
+ for my_bone in ob_bones:
+ for fbxMeshObName in my_bone.blenMeshes: # .keys() - fbxMeshObName
+ # is this bone effecting a mesh?
+ file.write('\n\tDeformer: "SubDeformer::Cluster %s %s", "Cluster" {\n\t}' % (fbxMeshObName, my_bone.fbxName))
+
+ # This should be at the end
+ # file.write('\n\tPose: "Pose::BIND_POSES", "BindPose" {\n\t}')
+
+ for groupname, group in groups:
+ file.write('\n\tGroupSelection: "GroupSelection::%s", "Default" {\n\t}' % groupname)
+
file.write('\n}')
file.write('''
@@ -1290,64 +2268,357 @@ Relations: {''')
;------------------------------------------------------------------
Connections: {''')
+
+ # NOTE - The FBX SDK dosnt care about the order but some importers DO!
+ # for instance, defining the material->mesh connection
+ # before the mesh->blend_root crashes cinema4d
+
# write the fake root node
file.write('\n\tConnect: "OO", "Model::blend_root", "Model::Scene"')
- for obname, ob in ob_cameras:
- file.write('\n\tConnect: "OO", "Model::%s", "Model::blend_root"' % obname)
-
- for obname, ob in ob_lights:
- file.write('\n\tConnect: "OO", "Model::%s", "Model::blend_root"' % obname)
-
- for obname, ob, mtx, me, mats, arm, armname in ob_meshes:
- file.write('\n\tConnect: "OO", "Model::%s", "Model::blend_root"' % obname)
+ for ob_generic in ob_all_typegroups: # all blender 'Object's we support
+ for my_ob in ob_generic:
+ if my_ob.fbxParent:
+ file.write('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_ob.fbxName, my_ob.fbxParent.fbxName))
+ else:
+ file.write('\n\tConnect: "OO", "Model::%s", "Model::blend_root"' % my_ob.fbxName)
- for obname, ob, mtx, me, mats, arm, armname in ob_meshes:
- # Connect all materials to all objects, not good form but ok for now.
- for mat in mats:
- file.write('\n\tConnect: "OO", "Material::%s", "Model::%s"' % (sane_matname(mat), obname))
+ if materials:
+ for my_mesh in ob_meshes:
+ # Connect all materials to all objects, not good form but ok for now.
+ for mat in my_mesh.blenMaterials:
+ if mat:
+ file.write('\n\tConnect: "OO", "Material::%s", "Model::%s"' % (sane_name_mapping_mat[mat.name], my_mesh.fbxName))
if textures:
- for obname, ob, mtx, me, mats, arm, armname in ob_meshes:
- for texname, tex in textures:
- file.write('\n\tConnect: "OO", "Texture::%s", "Model::%s"' % (texname, obname))
+ for my_mesh in ob_meshes:
+ if my_mesh.blenTextures:
+ # file.write('\n\tConnect: "OO", "Texture::_empty_", "Model::%s"' % my_mesh.fbxName)
+ for tex in my_mesh.blenTextures:
+ if tex:
+ file.write('\n\tConnect: "OO", "Texture::%s", "Model::%s"' % (sane_name_mapping_tex[tex.name], my_mesh.fbxName))
for texname, tex in textures:
file.write('\n\tConnect: "OO", "Video::%s", "Texture::%s"' % (texname, texname))
+ for my_mesh in ob_meshes:
+ if my_mesh.fbxArm:
+ file.write('\n\tConnect: "OO", "Deformer::Skin %s", "Model::%s"' % (my_mesh.fbxName, my_mesh.fbxName))
+
+ #for bonename, bone, obname, me, armob in ob_bones:
+ for my_bone in ob_bones:
+ for fbxMeshObName in my_bone.blenMeshes: # .keys()
+ file.write('\n\tConnect: "OO", "SubDeformer::Cluster %s %s", "Deformer::Skin %s"' % (fbxMeshObName, my_bone.fbxName, fbxMeshObName))
+
+ # limbs -> deformers
+ # for bonename, bone, obname, me, armob in ob_bones:
+ for my_bone in ob_bones:
+ for fbxMeshObName in my_bone.blenMeshes: # .keys()
+ file.write('\n\tConnect: "OO", "Model::%s", "SubDeformer::Cluster %s %s"' % (my_bone.fbxName, fbxMeshObName, my_bone.fbxName))
+
+
+ #for bonename, bone, obname, me, armob in ob_bones:
+ for my_bone in ob_bones:
+ # Always parent to armature now
+ if my_bone.parent:
+ file.write('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_bone.fbxName, my_bone.parent.fbxName) )
+ else:
+ # the armature object is written as an empty and all root level bones connect to it
+ file.write('\n\tConnect: "OO", "Model::%s", "Model::%s"' % (my_bone.fbxName, my_bone.fbxArm.fbxName) )
+
+ # groups
+ if groups:
+ for ob_generic in ob_all_typegroups:
+ for ob_base in ob_generic:
+ for fbxGroupName in ob_base.fbxGroupNames:
+ file.write('\n\tConnect: "OO", "Model::%s", "GroupSelection::%s"' % (ob_base.fbxName, fbxGroupName))
+
+ for my_arm in ob_arms:
+ file.write('\n\tConnect: "OO", "Model::%s", "Model::blend_root"' % my_arm.fbxName)
+
file.write('\n}')
- # Clear mesh data Only when writing with modifiers applied
- #for obname, ob, me, mats, arm, armname in objects:
- # me.verts = None
+ # Needed for scene footer as well as animation
+ render = sce.render
+
+ # from the FBX sdk
+ #define KTIME_ONE_SECOND KTime (K_LONGLONG(46186158000))
+ def fbx_time(t):
+ # 0.5 + val is the same as rounding.
+ return int(0.5 + ((t/fps) * 46186158000))
+
+ fps = float(render.fps)
+ start = render.sFrame
+ end = render.eFrame
+ if end < start: start, end = end, start
+ if start==end: ANIM_ENABLE = False
+
+ # animations for these object types
+ ob_anim_lists = ob_bones, ob_meshes, ob_null, ob_cameras, ob_lights, ob_arms
+
+ if ANIM_ENABLE and [tmp for tmp in ob_anim_lists if tmp]:
+
+ frame_orig = Blender.Get('curframe')
+
+ if ANIM_OPTIMIZE:
+ ANIM_OPTIMIZE_PRECISSION_FLOAT = 0.1 ** ANIM_OPTIMIZE_PRECISSION
+
+ # default action, when no actions are avaioable
+ tmp_actions = [None] # None is the default action
+ blenActionDefault = None
+ action_lastcompat = None
+
+ if ANIM_ACTION_ALL:
+ bpy.data.actions.tag = False
+ tmp_actions = list(bpy.data.actions)
+
+
+ # find which actions are compatible with the armatures
+ # blenActions is not yet initialized so do it now.
+ tmp_act_count = 0
+ for my_arm in ob_arms:
+
+ # get the default name
+ if not blenActionDefault:
+ blenActionDefault = my_arm.blenAction
+
+ arm_bone_names = set([my_bone.blenName for my_bone in my_arm.fbxBones])
+
+ for action in tmp_actions:
+
+ action_chan_names = arm_bone_names.intersection( set(action.getChannelNames()) )
+
+ if action_chan_names: # at least one channel matches.
+ my_arm.blenActionList.append(action)
+ action.tag = True
+ tmp_act_count += 1
+
+ # incase there is no actions applied to armatures
+ action_lastcompat = action
+
+ if tmp_act_count:
+ # unlikely to ever happen but if no actions applied to armatures, just use the last compatible armature.
+ if not blenActionDefault:
+ blenActionDefault = action_lastcompat
+
+ del action_lastcompat
+
+ file.write('''
+;Takes and animation section
+;----------------------------------------------------
+Takes: {''')
+
+ if blenActionDefault:
+ file.write('\n\tCurrent: "%s"' % sane_takename(blenActionDefault))
+ else:
+ file.write('\n\tCurrent: "Default Take"')
+
+ for blenAction in tmp_actions:
+ # we have tagged all actious that are used be selected armatures
+ if blenAction:
+ if blenAction.tag:
+ print '\taction: "%s" exporting...' % blenAction.name
+ else:
+ print '\taction: "%s" has no armature using it, skipping' % blenAction.name
+ continue
+
+ if blenAction == None:
+ # Warning, this only accounts for tmp_actions being [None]
+ file.write('\n\tTake: "Default Take" {')
+ act_start = start
+ act_end = end
+ else:
+ # use existing name
+ if blenAction == blenActionDefault: # have we alredy got the name
+ file.write('\n\tTake: "%s" {' % sane_name_mapping_take[blenAction.name])
+ else:
+ file.write('\n\tTake: "%s" {' % sane_takename(blenAction))
+
+ tmp = blenAction.getFrameNumbers()
+ if tmp:
+ act_start = min(tmp)
+ act_end = max(tmp)
+ del tmp
+ else:
+ # Fallback on this, theres not much else we can do? :/
+ # when an action has no length
+ act_start = start
+ act_end = end
+
+ # Set the action active
+ for my_bone in ob_arms:
+ if blenAction in my_bone.blenActionList:
+ ob.action = blenAction
+ # print '\t\tSetting Action!', blenAction
+ # sce.update(1)
+
+ file.write('\n\t\tFileName: "Default_Take.tak"') # ??? - not sure why this is needed
+ file.write('\n\t\tLocalTime: %i,%i' % (fbx_time(act_start-1), fbx_time(act_end-1))) # ??? - not sure why this is needed
+ file.write('\n\t\tReferenceTime: %i,%i' % (fbx_time(act_start-1), fbx_time(act_end-1))) # ??? - not sure why this is needed
+
+ file.write('''
-def write_footer(file, sce, world):
+ ;Models animation
+ ;----------------------------------------------------''')
+
+
+ # set pose data for all bones
+ # do this here incase the action changes
+ '''
+ for my_bone in ob_bones:
+ my_bone.flushAnimData()
+ '''
+ i = act_start
+ while i <= act_end:
+ Blender.Set('curframe', i)
+ for ob_generic in ob_anim_lists:
+ for my_ob in ob_generic:
+ #Blender.Window.RedrawAll()
+ if ob_generic == ob_meshes and my_ob.fbxArm:
+ # We cant animate armature meshes!
+ pass
+ else:
+ my_ob.setPoseFrame(i)
+
+ i+=1
+
+
+ #for bonename, bone, obname, me, armob in ob_bones:
+ for ob_generic in (ob_bones, ob_meshes, ob_null, ob_cameras, ob_lights, ob_arms):
+
+ for my_ob in ob_generic:
+
+ if ob_generic == ob_meshes and my_ob.fbxArm:
+ # do nothing,
+ pass
+ else:
+
+ file.write('\n\t\tModel: "Model::%s" {' % my_ob.fbxName) # ??? - not sure why this is needed
+ file.write('\n\t\t\tVersion: 1.1')
+ file.write('\n\t\t\tChannel: "Transform" {')
+
+ context_bone_anim_mats = [ (my_ob.getAnimParRelMatrix(frame), my_ob.getAnimParRelMatrixRot(frame)) for frame in xrange(act_start, act_end+1) ]
+
+ # ----------------
+ # ----------------
+ for TX_LAYER, TX_CHAN in enumerate('TRS'): # transform, rotate, scale
+
+ if TX_CHAN=='T': context_bone_anim_vecs = [mtx[0].translationPart() for mtx in context_bone_anim_mats]
+ elif TX_CHAN=='R': context_bone_anim_vecs = [mtx[1].toEuler() for mtx in context_bone_anim_mats]
+ else: context_bone_anim_vecs = [mtx[0].scalePart() for mtx in context_bone_anim_mats]
+
+ file.write('\n\t\t\t\tChannel: "%s" {' % TX_CHAN) # translation
+
+ for i in xrange(3):
+ # Loop on each axis of the bone
+ file.write('\n\t\t\t\t\tChannel: "%s" {'% ('XYZ'[i])) # translation
+ file.write('\n\t\t\t\t\t\tDefault: %.15f' % context_bone_anim_vecs[0][i] )
+ file.write('\n\t\t\t\t\t\tKeyVer: 4005')
+
+ if not ANIM_OPTIMIZE:
+ # Just write all frames, simple but in-eficient
+ file.write('\n\t\t\t\t\t\tKeyCount: %i' % (1 + act_end - act_start))
+ file.write('\n\t\t\t\t\t\tKey: ')
+ frame = act_start
+ while frame <= act_end:
+ if frame!=act_start:
+ file.write(',')
+
+ # Curve types are
+ # C,n is for bezier? - linear is best for now so we can do simple keyframe removal
+ file.write('\n\t\t\t\t\t\t\t%i,%.15f,C,n' % (fbx_time(frame-1), context_bone_anim_vecs[frame-act_start][i] ))
+ #file.write('\n\t\t\t\t\t\t\t%i,%.15f,L' % (fbx_time(frame-1), context_bone_anim_vecs[frame-act_start][i] ))
+ frame+=1
+ else:
+ # remove unneeded keys, j is the frame, needed when some frames are removed.
+ context_bone_anim_keys = [ (vec[i], j) for j, vec in enumerate(context_bone_anim_vecs) ]
+
+ # last frame to fisrt frame, missing 1 frame on either side.
+ # removeing in a backwards loop is faster
+ for j in xrange( (act_end-act_start)-1, 0, -1 ):
+ # Is this key reduenant?
+ if abs(context_bone_anim_keys[j][0] - context_bone_anim_keys[j-1][0]) < ANIM_OPTIMIZE_PRECISSION_FLOAT and\
+ abs(context_bone_anim_keys[j][0] - context_bone_anim_keys[j+1][0]) < ANIM_OPTIMIZE_PRECISSION_FLOAT:
+ del context_bone_anim_keys[j]
+
+ if len(context_bone_anim_keys) == 2 and context_bone_anim_keys[0][0] == context_bone_anim_keys[1][0]:
+ # This axis has no moton, its okay to skip KeyCount and Keys in this case
+ pass
+ else:
+ # We only need to write these if there is at least one
+ file.write('\n\t\t\t\t\t\tKeyCount: %i' % len(context_bone_anim_keys))
+ file.write('\n\t\t\t\t\t\tKey: ')
+ for val, frame in context_bone_anim_keys:
+ if frame != context_bone_anim_keys[0][1]: # not the first
+ file.write(',')
+ # frame is alredy one less then blenders frame
+ file.write('\n\t\t\t\t\t\t\t%i,%.15f,C,n' % (fbx_time(frame), val ))
+ #file.write('\n\t\t\t\t\t\t\t%i,%.15f,L' % (fbx_time(frame), val ))
+
+ if i==0: file.write('\n\t\t\t\t\t\tColor: 1,0,0')
+ elif i==1: file.write('\n\t\t\t\t\t\tColor: 0,1,0')
+ elif i==2: file.write('\n\t\t\t\t\t\tColor: 0,0,1')
+
+ file.write('\n\t\t\t\t\t}')
+ file.write('\n\t\t\t\t\tLayerType: %i' % (TX_LAYER+1) )
+ file.write('\n\t\t\t\t}')
+
+ # ---------------
+
+ file.write('\n\t\t\t}')
+ file.write('\n\t\t}')
+
+ # end the take
+ file.write('\n\t}')
+
+ # end action loop. set original actions
+ # do this after every loop incase actions effect eachother.
+ for my_bone in ob_arms:
+ my_bone.blenObject.action = my_bone.blenAction
+
+ file.write('\n}')
+
+ Blender.Set('curframe', frame_orig)
+
+ else:
+ # no animation
+ file.write('\n;Takes and animation section')
+ file.write('\n;----------------------------------------------------')
+ file.write('\n')
+ file.write('\nTakes: {')
+ file.write('\n\tCurrent: ""')
+ file.write('\n}')
- tuple(world.hor)
- tuple(world.amb)
- has_mist = world.mode & 1
+ # write meshes animation
+ #for obname, ob, mtx, me, mats, arm, armname in ob_meshes:
+
- mist_intense, mist_start, mist_end, mist_height = world.mist
+ # Clear mesh data Only when writing with modifiers applied
+ for me in meshes_to_clear:
+ me.verts = None
- render = sce.render
- file.write('\n;Takes and animation section')
- file.write('\n;----------------------------------------------------')
- file.write('\n')
- file.write('\nTakes: {')
- file.write('\n\tCurrent: ""')
- file.write('\n}')
+
+ # --------------------------- Footer
+ if world:
+ has_mist = world.mode & 1
+ mist_intense, mist_start, mist_end, mist_height = world.mist
+ world_hor = world.hor
+ else:
+ has_mist = mist_intense = mist_start = mist_end = mist_height = 0
+ world_hor = 0,0,0
+
file.write('\n;Version 5 settings')
file.write('\n;------------------------------------------------------------------')
file.write('\n')
file.write('\nVersion5: {')
file.write('\n\tAmbientRenderSettings: {')
file.write('\n\t\tVersion: 101')
- file.write('\n\t\tAmbientLightColor: %.1f,%.1f,%.1f,0' % tuple(world.amb))
+ file.write('\n\t\tAmbientLightColor: %.1f,%.1f,%.1f,0' % tuple(world_amb))
file.write('\n\t}')
file.write('\n\tFogOptions: {')
file.write('\n\t\tFlogEnable: %i' % has_mist)
@@ -1355,15 +2626,15 @@ def write_footer(file, sce, world):
file.write('\n\t\tFogDensity: %.3f' % mist_intense)
file.write('\n\t\tFogStart: %.3f' % mist_start)
file.write('\n\t\tFogEnd: %.3f' % mist_end)
- file.write('\n\t\tFogColor: %.1f,%.1f,%.1f,1' % tuple(world.hor))
+ file.write('\n\t\tFogColor: %.1f,%.1f,%.1f,1' % tuple(world_hor))
file.write('\n\t}')
file.write('\n\tSettings: {')
- file.write('\n\t\tFrameRate: "%i"' % render.fps)
+ file.write('\n\t\tFrameRate: "%i"' % int(fps))
file.write('\n\t\tTimeFormat: 1')
file.write('\n\t\tSnapOnFrames: 0')
file.write('\n\t\tReferenceTimeIndex: -1')
- file.write('\n\t\tTimeLineStartTime: %i' % render.sFrame)
- file.write('\n\t\tTimeLineStopTime: %i' % render.eFrame)
+ file.write('\n\t\tTimeLineStartTime: %i' % fbx_time(start-1))
+ file.write('\n\t\tTimeLineStopTime: %i' % fbx_time(end-1))
file.write('\n\t}')
file.write('\n\tRendererSetting: {')
file.write('\n\t\tDefaultCamera: "Producer Perspective"')
@@ -1377,24 +2648,329 @@ def write_footer(file, sce, world):
sane_name_mapping_mat.clear()
sane_name_mapping_tex.clear()
+ ob_arms[:] = []
+ ob_bones[:] = []
+ ob_cameras[:] = []
+ ob_lights[:] = []
+ ob_meshes[:] = []
+ ob_null[:] = []
+
+
+ # copy images if enabled
+ if EXP_IMAGE_COPY:
+ copy_images( Blender.sys.dirname(filename), [ tex[1] for tex in textures if tex[1] != None ])
+
+ print 'export finished in %.4f sec.' % (Blender.sys.time() - start_time)
+ return True
+
-import bpy
-def write_ui(filename):
- if not filename.lower().endswith('.fbx'):
- filename += '.fbx'
+# --------------------------------------------
+# UI Function - not a part of the exporter.
+# this is to seperate the user interface from the rest of the exporter.
+from Blender import Draw, Window
+EVENT_NONE = 0
+EVENT_EXIT = 1
+EVENT_REDRAW = 2
+EVENT_FILESEL = 3
+
+GLOBALS = {}
+
+# export opts
+
+def do_redraw(e,v): GLOBALS['EVENT'] = e
+
+# toggle between these 2, only allow one on at once
+def do_obs_sel(e,v):
+ GLOBALS['EVENT'] = e
+ GLOBALS['EXP_OBS_SCENE'].val = 0
+ GLOBALS['EXP_OBS_SELECTED'].val = 1
+
+def do_obs_sce(e,v):
+ GLOBALS['EVENT'] = e
+ GLOBALS['EXP_OBS_SCENE'].val = 1
+ GLOBALS['EXP_OBS_SELECTED'].val = 0
+
+def do_obs_sce(e,v):
+ GLOBALS['EVENT'] = e
+ GLOBALS['EXP_OBS_SCENE'].val = 1
+ GLOBALS['EXP_OBS_SELECTED'].val = 0
+
+def do_batch_type_grp(e,v):
+ GLOBALS['EVENT'] = e
+ GLOBALS['BATCH_GROUP'].val = 1
+ GLOBALS['BATCH_SCENE'].val = 0
+
+def do_batch_type_sce(e,v):
+ GLOBALS['EVENT'] = e
+ GLOBALS['BATCH_GROUP'].val = 0
+ GLOBALS['BATCH_SCENE'].val = 1
+
+def do_anim_act_all(e,v):
+ GLOBALS['EVENT'] = e
+ GLOBALS['ANIM_ACTION_ALL'][0].val = 1
+ GLOBALS['ANIM_ACTION_ALL'][1].val = 0
+
+def do_anim_act_cur(e,v):
+ if GLOBALS['BATCH_ENABLE'].val and GLOBALS['BATCH_GROUP'].val:
+ Draw.PupMenu('Warning%t|Cant use this with batch export group option')
+ else:
+ GLOBALS['EVENT'] = e
+ GLOBALS['ANIM_ACTION_ALL'][0].val = 0
+ GLOBALS['ANIM_ACTION_ALL'][1].val = 1
+
+def fbx_ui_exit(e,v):
+ GLOBALS['EVENT'] = e
+
+def do_help(e,v):
+ url = 'http://wiki.blender.org/index.php/Scripts/Manual/Export/autodesk_fbx'
+ print 'Trying to open web browser with documentation at this address...'
+ print '\t' + url
- #if not BPyMessages.Warning_SaveOver(filename):
- # return
- sce = bpy.data.scenes.active
- world = sce.world
+ try:
+ import webbrowser
+ webbrowser.open(url)
+ except:
+ print '...could not open a browser window.'
+
+
+
+# run when export is pressed
+#def fbx_ui_write(e,v):
+def fbx_ui_write(filename):
+
+ # Dont allow overwriting files when saving normally
+ if not GLOBALS['BATCH_ENABLE'].val:
+ if not BPyMessages.Warning_SaveOver(filename):
+ return
+
+ GLOBALS['EVENT'] = EVENT_EXIT
+
+ # Keep the order the same as above for simplicity
+ # the [] is a dummy arg used for objects
Blender.Window.WaitCursor(1)
- file = open(filename, 'w')
- write_header(file)
- write_scene(file, sce, world)
- write_footer(file, sce, world)
+
+ # Make the matrix
+ GLOBAL_MATRIX = mtx4_identity
+ GLOBAL_MATRIX[0][0] = GLOBAL_MATRIX[1][1] = GLOBAL_MATRIX[2][2] = GLOBALS['_SCALE'].val
+ if GLOBALS['_XROT90'].val: GLOBAL_MATRIX = GLOBAL_MATRIX * mtx4_x90n
+ if GLOBALS['_YROT90'].val: GLOBAL_MATRIX = GLOBAL_MATRIX * mtx4_y90n
+ if GLOBALS['_ZROT90'].val: GLOBAL_MATRIX = GLOBAL_MATRIX * mtx4_z90n
+
+ ret = write(\
+ filename, None,\
+ GLOBALS['EXP_OBS_SELECTED'].val,\
+ GLOBALS['EXP_MESH'].val,\
+ GLOBALS['EXP_MESH_APPLY_MOD'].val,\
+ GLOBALS['EXP_MESH_HQ_NORMALS'].val,\
+ GLOBALS['EXP_ARMATURE'].val,\
+ GLOBALS['EXP_LAMP'].val,\
+ GLOBALS['EXP_CAMERA'].val,\
+ GLOBALS['EXP_EMPTY'].val,\
+ GLOBALS['EXP_IMAGE_COPY'].val,\
+ GLOBAL_MATRIX,\
+ GLOBALS['ANIM_ENABLE'].val,\
+ GLOBALS['ANIM_OPTIMIZE'].val,\
+ GLOBALS['ANIM_OPTIMIZE_PRECISSION'].val,\
+ GLOBALS['ANIM_ACTION_ALL'][0].val,\
+ GLOBALS['BATCH_ENABLE'].val,\
+ GLOBALS['BATCH_GROUP'].val,\
+ GLOBALS['BATCH_SCENE'].val,\
+ GLOBALS['BATCH_FILE_PREFIX'].val,\
+ GLOBALS['BATCH_OWN_DIR'].val,\
+ )
+
Blender.Window.WaitCursor(0)
+ GLOBALS.clear()
+
+ if ret == False:
+ Draw.PupMenu('Error%t|Path cannot be written to!')
+
+
+def fbx_ui():
+ # Only to center the UI
+ x,y = GLOBALS['MOUSE']
+ x-=180; y-=0 # offset... just to get it centered
+
+ Draw.Label('Export Objects...', x+20,y+165, 200, 20)
+
+ if not GLOBALS['BATCH_ENABLE'].val:
+ Draw.BeginAlign()
+ GLOBALS['EXP_OBS_SELECTED'] = Draw.Toggle('Selected Objects', EVENT_REDRAW, x+20, y+145, 160, 20, GLOBALS['EXP_OBS_SELECTED'].val, 'Export selected objects on visible layers', do_obs_sel)
+ GLOBALS['EXP_OBS_SCENE'] = Draw.Toggle('Scene Objects', EVENT_REDRAW, x+180, y+145, 160, 20, GLOBALS['EXP_OBS_SCENE'].val, 'Export all objects in this scene', do_obs_sce)
+ Draw.EndAlign()
+
+ Draw.BeginAlign()
+ GLOBALS['_SCALE'] = Draw.Number('Scale:', EVENT_NONE, x+20, y+120, 140, 20, GLOBALS['_SCALE'].val, 0.01, 1000.0, 'Scale all data, (Note! some imports dont support scaled armatures)')
+ GLOBALS['_XROT90'] = Draw.Toggle('Rot X90', EVENT_NONE, x+160, y+120, 60, 20, GLOBALS['_XROT90'].val, 'Rotate all objects 90 degrese about the X axis')
+ GLOBALS['_YROT90'] = Draw.Toggle('Rot Y90', EVENT_NONE, x+220, y+120, 60, 20, GLOBALS['_YROT90'].val, 'Rotate all objects 90 degrese about the Y axis')
+ GLOBALS['_ZROT90'] = Draw.Toggle('Rot Z90', EVENT_NONE, x+280, y+120, 60, 20, GLOBALS['_ZROT90'].val, 'Rotate all objects 90 degrese about the Z axis')
+ Draw.EndAlign()
+
+ y -= 35
+
+ Draw.BeginAlign()
+ GLOBALS['EXP_EMPTY'] = Draw.Toggle('Empty', EVENT_NONE, x+20, y+120, 60, 20, GLOBALS['EXP_EMPTY'].val, 'Export empty objects')
+ GLOBALS['EXP_CAMERA'] = Draw.Toggle('Camera', EVENT_NONE, x+80, y+120, 60, 20, GLOBALS['EXP_CAMERA'].val, 'Export camera objects')
+ GLOBALS['EXP_LAMP'] = Draw.Toggle('Lamp', EVENT_NONE, x+140, y+120, 60, 20, GLOBALS['EXP_LAMP'].val, 'Export lamp objects')
+ GLOBALS['EXP_ARMATURE'] = Draw.Toggle('Armature', EVENT_NONE, x+200, y+120, 60, 20, GLOBALS['EXP_ARMATURE'].val, 'Export armature objects')
+ GLOBALS['EXP_MESH'] = Draw.Toggle('Mesh', EVENT_REDRAW, x+260, y+120, 80, 20, GLOBALS['EXP_MESH'].val, 'Export mesh objects', do_redraw) #, do_axis_z)
+ Draw.EndAlign()
+
+ if GLOBALS['EXP_MESH'].val:
+ # below mesh but
+ Draw.BeginAlign()
+ GLOBALS['EXP_MESH_APPLY_MOD'] = Draw.Toggle('Modifiers', EVENT_NONE, x+260, y+100, 80, 20, GLOBALS['EXP_MESH_APPLY_MOD'].val, 'Apply modifiers to mesh objects') #, do_axis_z)
+ GLOBALS['EXP_MESH_HQ_NORMALS'] = Draw.Toggle('HQ Normals', EVENT_NONE, x+260, y+80, 80, 20, GLOBALS['EXP_MESH_HQ_NORMALS'].val, 'Generate high quality normals') #, do_axis_z)
+ Draw.EndAlign()
+
+ GLOBALS['EXP_IMAGE_COPY'] = Draw.Toggle('Copy Image Files', EVENT_NONE, x+20, y+80, 160, 20, GLOBALS['EXP_IMAGE_COPY'].val, 'Copy image files to the destination path') #, do_axis_z)
+
+
+ Draw.Label('Export Armature Animation...', x+20,y+45, 300, 20)
+
+ GLOBALS['ANIM_ENABLE'] = Draw.Toggle('Enable Animation', EVENT_REDRAW, x+20, y+25, 160, 20, GLOBALS['ANIM_ENABLE'].val, 'Export keyframe animation', do_redraw)
+ if GLOBALS['ANIM_ENABLE'].val:
+ Draw.BeginAlign()
+ GLOBALS['ANIM_OPTIMIZE'] = Draw.Toggle('Optimize Keyframes', EVENT_REDRAW, x+20, y+0, 160, 20, GLOBALS['ANIM_OPTIMIZE'].val, 'Remove double keyframes', do_redraw)
+ if GLOBALS['ANIM_OPTIMIZE'].val:
+ GLOBALS['ANIM_OPTIMIZE_PRECISSION'] = Draw.Number('Precission: ', EVENT_NONE, x+180, y+0, 160, 20, GLOBALS['ANIM_OPTIMIZE_PRECISSION'].val, 3, 16, 'Tolerence for comparing double keyframes (higher for greater accuracy)')
+ Draw.EndAlign()
+
+ Draw.BeginAlign()
+ GLOBALS['ANIM_ACTION_ALL'][1] = Draw.Toggle('Current Action', EVENT_REDRAW, x+20, y-25, 160, 20, GLOBALS['ANIM_ACTION_ALL'][1].val, 'Use actions currently applied to the armatures (use scene start/end frame)', do_anim_act_cur)
+ GLOBALS['ANIM_ACTION_ALL'][0] = Draw.Toggle('All Actions', EVENT_REDRAW, x+180,y-25, 160, 20, GLOBALS['ANIM_ACTION_ALL'][0].val, 'Use all actions for armatures', do_anim_act_all)
+ Draw.EndAlign()
+
+
+ Draw.Label('Export Batch...', x+20,y-60, 300, 20)
+ GLOBALS['BATCH_ENABLE'] = Draw.Toggle('Enable Batch', EVENT_REDRAW, x+20, y-80, 160, 20, GLOBALS['BATCH_ENABLE'].val, 'Automate exporting multiple scenes or groups to files', do_redraw)
+
+ if GLOBALS['BATCH_ENABLE'].val:
+ Draw.BeginAlign()
+ GLOBALS['BATCH_GROUP'] = Draw.Toggle('Group > File', EVENT_REDRAW, x+20, y-105, 160, 20, GLOBALS['BATCH_GROUP'].val, 'Export each group as an FBX file', do_batch_type_grp)
+ GLOBALS['BATCH_SCENE'] = Draw.Toggle('Scene > File', EVENT_REDRAW, x+180, y-105, 160, 20, GLOBALS['BATCH_SCENE'].val, 'Export each scene as an FBX file', do_batch_type_sce)
+
+ # Own dir requires OS module
+ if os:
+ GLOBALS['BATCH_OWN_DIR'] = Draw.Toggle('Own Dir', EVENT_NONE, x+20, y-125, 80, 20, GLOBALS['BATCH_OWN_DIR'].val, 'Create a dir for each exported file')
+ GLOBALS['BATCH_FILE_PREFIX'] = Draw.String('Prefix: ', EVENT_NONE, x+100, y-125, 240, 20, GLOBALS['BATCH_FILE_PREFIX'].val, 64, 'Prefix each file with this name ')
+ else:
+ GLOBALS['BATCH_FILE_PREFIX'] = Draw.String('Prefix: ', EVENT_NONE, x+20, y-125, 320, 20, GLOBALS['BATCH_FILE_PREFIX'].val, 64, 'Prefix each file with this name ')
+
+
+ Draw.EndAlign()
+ #y+=80
+
+ '''
+ Draw.BeginAlign()
+ GLOBALS['FILENAME'] = Draw.String('path: ', EVENT_NONE, x+20, y-170, 300, 20, GLOBALS['FILENAME'].val, 64, 'Prefix each file with this name ')
+ Draw.PushButton('..', EVENT_FILESEL, x+320, y-170, 20, 20, 'Select the path', do_redraw)
+ '''
+ # Until batch is added
+ #
+
+
+ #Draw.BeginAlign()
+ Draw.PushButton('Online Help', EVENT_REDRAW, x+20, y-160, 100, 20, 'Open online help in a browser window', do_help)
+ Draw.PushButton('Cancel', EVENT_EXIT, x+130, y-160, 100, 20, 'Exit the exporter', fbx_ui_exit)
+ Draw.PushButton('Export', EVENT_FILESEL, x+240, y-160, 100, 20, 'Export the fbx file', do_redraw)
+
+ #Draw.PushButton('Export', EVENT_EXIT, x+180, y-160, 160, 20, 'Export the fbx file', fbx_ui_write)
+ #Draw.EndAlign()
+
+ # exit when mouse out of the view?
+ # GLOBALS['EVENT'] = EVENT_EXIT
+
+#def write_ui(filename):
+def write_ui():
+
+ # globals
+ GLOBALS['EVENT'] = 2
+ #GLOBALS['MOUSE'] = Window.GetMouseCoords()
+ GLOBALS['MOUSE'] = [i/2 for i in Window.GetScreenSize()]
+ GLOBALS['FILENAME'] = ''
+ '''
+ # IF called from the fileselector
+ if filename == None:
+ GLOBALS['FILENAME'] = filename # Draw.Create(Blender.sys.makename(ext='.fbx'))
+ else:
+ GLOBALS['FILENAME'].val = filename
+ '''
+ GLOBALS['EXP_OBS_SELECTED'] = Draw.Create(1) # dont need 2 variables but just do this for clarity
+ GLOBALS['EXP_OBS_SCENE'] = Draw.Create(0)
+
+ GLOBALS['EXP_MESH'] = Draw.Create(1)
+ GLOBALS['EXP_MESH_APPLY_MOD'] = Draw.Create(1)
+ GLOBALS['EXP_MESH_HQ_NORMALS'] = Draw.Create(0)
+ GLOBALS['EXP_ARMATURE'] = Draw.Create(1)
+ GLOBALS['EXP_LAMP'] = Draw.Create(1)
+ GLOBALS['EXP_CAMERA'] = Draw.Create(1)
+ GLOBALS['EXP_EMPTY'] = Draw.Create(1)
+ GLOBALS['EXP_IMAGE_COPY'] = Draw.Create(0)
+ # animation opts
+ GLOBALS['ANIM_ENABLE'] = Draw.Create(1)
+ GLOBALS['ANIM_OPTIMIZE'] = Draw.Create(1)
+ GLOBALS['ANIM_OPTIMIZE_PRECISSION'] = Draw.Create(6) # decimal places
+ GLOBALS['ANIM_ACTION_ALL'] = [Draw.Create(0), Draw.Create(1)] # not just the current action
+
+ # batch export options
+ GLOBALS['BATCH_ENABLE'] = Draw.Create(0)
+ GLOBALS['BATCH_GROUP'] = Draw.Create(1) # cant have both of these enabled at once.
+ GLOBALS['BATCH_SCENE'] = Draw.Create(0) # see above
+ GLOBALS['BATCH_FILE_PREFIX'] = Draw.Create(Blender.sys.makename(ext='_').split('\\')[-1].split('/')[-1])
+ GLOBALS['BATCH_OWN_DIR'] = Draw.Create(0)
+ # done setting globals
+
+ # Used by the user interface
+ GLOBALS['_SCALE'] = Draw.Create(1.0)
+ GLOBALS['_XROT90'] = Draw.Create(True)
+ GLOBALS['_YROT90'] = Draw.Create(False)
+ GLOBALS['_ZROT90'] = Draw.Create(False)
+
+ # horrible ugly hack so tooltips draw, dosnt always work even
+ # Fixed in Draw.UIBlock for 2.45rc2, but keep this until 2.45 is released
+ Window.SetKeyQualifiers(0)
+ while Window.GetMouseButtons(): Blender.sys.sleep(10)
+ for i in xrange(100): Window.QHandle(i)
+ # END HORRID HACK
+
+ # best not do move the cursor
+ # Window.SetMouseCoords(*[i/2 for i in Window.GetScreenSize()])
+
+ # hack so the toggle buttons redraw. this is not nice at all
+ while GLOBALS['EVENT'] != EVENT_EXIT:
+
+ if GLOBALS['BATCH_ENABLE'].val and GLOBALS['BATCH_GROUP'].val and GLOBALS['ANIM_ACTION_ALL'][1].val:
+ #Draw.PupMenu("Warning%t|Cant batch export groups with 'Current Action' ")
+ GLOBALS['ANIM_ACTION_ALL'][0].val = 1
+ GLOBALS['ANIM_ACTION_ALL'][1].val = 0
+
+ if GLOBALS['EVENT'] == EVENT_FILESEL:
+ if GLOBALS['BATCH_ENABLE'].val:
+ txt = 'Batch FBX Dir'
+ name = Blender.sys.expandpath('//')
+ else:
+ txt = 'Export FBX'
+ name = Blender.sys.makename(ext='.fbx')
+
+ Blender.Window.FileSelector(fbx_ui_write, txt, name)
+ #fbx_ui_write('/test.fbx')
+ break
+
+ Draw.UIBlock(fbx_ui)
+
+
+ # GLOBALS.clear()
+#test = [write_ui]
if __name__ == '__main__':
- Blender.Window.FileSelector(write_ui, 'Export FBX', Blender.sys.makename(ext='.fbx'))
- #write_ui('/test.fbx')
+ # Cant call the file selector first because of a bug in the interface that crashes it.
+ # Blender.Window.FileSelector(write_ui, 'Export FBX', Blender.sys.makename(ext='.fbx'))
+ #write('/scratch/test.fbx')
+ #write_ui('/scratch/test.fbx')
+
+ if not set:
+ Draw.PupMenu('Error%t|A full install of python2.3 or python 2.4+ is needed to run this script.')
+ else:
+ write_ui()
diff --git a/release/scripts/export_obj.py b/release/scripts/export_obj.py
index 9f371e9a218..101a1ab1e84 100644
--- a/release/scripts/export_obj.py
+++ b/release/scripts/export_obj.py
@@ -512,8 +512,8 @@ def write_ui(filename):
if not filename.lower().endswith('.obj'):
filename += '.obj'
- #if not BPyMessages.Warning_SaveOver(filename):
- # return
+ if not BPyMessages.Warning_SaveOver(filename):
+ return
EXPORT_APPLY_MODIFIERS = Draw.Create(1)
EXPORT_ROTX90 = Draw.Create(1)
@@ -629,14 +629,14 @@ def write_ui(filename):
full_path= ''.join(context_name)
- if BPyMessages.Warning_SaveOver(full_path):
- # EXPORT THE FILE.
- write(full_path, export_objects,\
- EXPORT_TRI, EXPORT_EDGES, EXPORT_NORMALS,\
- EXPORT_NORMALS_HQ, EXPORT_UV, EXPORT_MTL,\
- EXPORT_COPY_IMAGES, EXPORT_APPLY_MODIFIERS,\
- EXPORT_ROTX90, EXPORT_BLEN_OBS,\
- EXPORT_GROUP_BY_OB, EXPORT_GROUP_BY_MAT, EXPORT_MORPH_TARGET)
+ # erm... bit of a problem here, this can overwrite files when exporting frames. not too bad.
+ # EXPORT THE FILE.
+ write(full_path, export_objects,\
+ EXPORT_TRI, EXPORT_EDGES, EXPORT_NORMALS,\
+ EXPORT_NORMALS_HQ, EXPORT_UV, EXPORT_MTL,\
+ EXPORT_COPY_IMAGES, EXPORT_APPLY_MODIFIERS,\
+ EXPORT_ROTX90, EXPORT_BLEN_OBS,\
+ EXPORT_GROUP_BY_OB, EXPORT_GROUP_BY_MAT, EXPORT_MORPH_TARGET)
Blender.Set('curframe', orig_frame)
diff --git a/release/scripts/flt_defaultp.py b/release/scripts/flt_defaultp.py
new file mode 100644
index 00000000000..5dca8ba63d7
--- /dev/null
+++ b/release/scripts/flt_defaultp.py
@@ -0,0 +1 @@
+pal = [-256,0,16711680,-16777216,-19529984,-19726592,-19923200,-20119808,-20316416,-20578560,-20840704,-21102848,-21364992,-21692672,-22020352,-22413568,-22806784,-23200000,-23658752,-24117504,-24641792,-25166080,-25755904,-26411264,-27066624,-27787520,-28573952,-29425920,-30343424,-31326464,-32375040,-33489152,-354550016,-371458304,-388366592,-405274880,-422183168,-439156992,-456130816,-473104640,-506855680,-540672256,-574488832,-608305408,-642121984,-676004096,-709886208,-760611072,-811335936,-862060800,-912851200,-980418816,-1048051968,-1115685120,-1183383808,-1267925248,-1352466688,-1453850880,-1555300608,-1656815872,-1775173888,-1893597440,-2028863744,2130771712,-1010376448,-1043996416,-1077681920,-1111367424,-1145052928,-1178738432,-1229201152,-1279663872,-1330126592,-1380654848,-1431183104,-1498488576,-1565794048,-1633165056,-1700536064,-1784684288,-1868832512,-1969823488,-2070814464,2123096320,2005262592,1887428864,1752752384,1601298688,1449779456,1281417472,1096278272,911073536,709026048,490201344,254533888,2023680,-1380857856,-1397700608,-1431320576,-1464940544,-1498560512,-1532180480,-1565865984,-1599551488,-1650014208,-1700476928,-1750939648,-1801402368,-1851865088,-1919170560,-1986476032,-2053781504,-2121086976,2089797632,2005649408,1904723968,1803798528,1686030336,1568262144,1450493952,1315883008,1164494848,1013041152,844810240,659736576,457885696,239192064,3655680,-1767919872,-1784762624,-1801605376,-1818448128,-1852068096,-1885688064,-1919308032,-1952928000,-1986547968,-2020167936,-2070565120,-2120962304,2123542272,2073079552,2022616832,1955376896,1888136960,1820897024,1736879872,1652797184,1568714496,1467854592,1366994688,1249357568,1131654912,997175040,862695168,711372544,560049920,391950080,207007488,5287680,2139657728,2122880512,2106103296,2089326080,2072548864,2055771648,2022217216,1988662784,1955108352,1921553920,1887933952,1854313984,1803916800,1753519616,1703122432,1652725248,1602328064,1535153664,1467979264,1400804864,1316853248,1232901632,1148950016,1048221184,947426816,846632448,729060864,611489280,477140480,326014464,174888448,6919680,1837268224,1820491008,1803713792,1786936576,1770159360,1753382144,1736604928,1719827712,1686273280,1652718848,1619164416,1585609984,1552055552,1518501120,1468169472,1417837824,1367506176,1317174528,1266842880,1199734016,1132625152,1065516288,998407424,914521344,830635264,729971968,629308672,528645376,411204864,293764352,159546624,8551680,-2086957824,-2103735040,-2120512256,-2137289472,2140900608,2107346176,2073791744,2040237056,2006682368,1973127680,1939572992,1906018304,1855686400,1805354496,1755022592,1704690688,1654358784,1587249664,1520140544,1453031424,1369145088,1285258496,1201371904,1100708096,1000044288,882603264,765162240,630943744,496725248,345729536,177956608,10183680,-1699438080,-1716215552,-1732993024,-1766547712,-1800102400,-1833657088,-1867211776,-1900766464,-1934321152,-1967875840,-2018207744,-2068539904,-2118872064,2125763072,2058653696,1991544320,1924434944,1857325568,1773438720,1689551872,1588887808,1488223744,1387559424,1270117888,1152676352,1018457600,884238592,733242368,565468672,397694976,213144064,11815680,-1311918848,-1345473536,-1379028224,-1412582912,-1446137600,-1479692544,-1513247488,-1546802432,-1597134592,-1647466752,-1697798912,-1748131072,-1798463488,-1865573120,-1932682752,-1999792384,-2083679232,2127400960,2043513856,1942849536,1842184960,1724743168,1607301376,1473082112,1338862848,1187866112,1020092160,852317952,667766528,466437632,248331264,13447680,-924399104,-957954048,-991508992,-1025063936,-1058618880,-1092173824,-1142505984,-1192838144,-1243170560,-1293502976,-1343835392,-1410945024,-1478054656,-1545164544,-1629051648,-1712938752,-1796826112,-1897490688,-1998155264,-2098820096,2078705152,1961262848,1827043328,1676046336,1525049344,1357274880,1172722944,971393792,753287168,518403072,283518720,15079680,-570434304,-603989248,-637544192,-671099136,-704654080,-754986496,-805318912,-855651328,-905983744,-973093632,-1040203520,-1107313408,-1174423296,-1258310656,-1342198016,-1442862848,-1543527680,-1644192512,-1761634816,-1879077120,-2013296896,2147450624,1996453376,1828678656,1660903936,1476351744,1275022080,1056914944,822030336,570368256,301928704,16711680,-503325440,-536880384,-570435328,-603990272,-637545216,-671100416,-721432832,-771765248,-822097664,-872430336,-922763008,-989872896,-1056982784,-1124092928,-1191203072,-1275090688,-1358978304,-1459643136,-1560308224,-1660973312,-1778415872,-1895858432,-2030078464,2113891328,1962893824,1795118848,1610566400,1426013696,1224683520,1006575872,771690752,520028160,-452993792,-469771520,-503326464,-536881408,-570436352,-603991552,-637546752,-671101952,-721434368,-771767040,-822099712,-872432384,-922765056,-989875200,-1056985344,-1124095744,-1191206144,-1275093760,-1358981632,-1459646720,-1560312064,-1677754624,-1795197440,-1912640512,-2046860800,2097108736,1946110720,1778335232,1593782272,1392451840,1174343936,939458560,-419439360,-436217088,-452994816,-469772544,-503327488,-536882688,-570437888,-603993088,-637548288,-671103744,-721436416,-771769088,-822101760,-872434688,-922767616,-989878016,-1056988416,-1124098816,-1207986688,-1291874560,-1375762688,-1476428032,-1577093632,-1694536704,-1811979776,-1946200320,-2080421120,2063547904,1912549376,1744773376,1560219904,1358888960,-385884928,-402662656,-419440384,-436218112,-452995840,-469773824,-503329024,-536884224,-570439424,-603994880,-637550336,-671105792,-721438464,-771771392,-822104320,-872437504,-922770688,-989881088,-1056991744,-1124102400,-1191213312,-1275101440,-1358989824,-1459655680,-1560321536,-1677764864,-1795208448,-1912652288,-2046873600,2097094912,1946095872,1778319360,-335553280,-352331008,-369108736,-385886464,-402664192,-419442176,-436220160,-452998144,-486553344,-520108800,-553664256,-587219712,-620775168,-654330880,-687886592,-738219776,-788552960,-838886144,-889219584,-939553024,-1006663936,-1073774848,-1140886016,-1224774656,-1308663296,-1392552192,-1493218560,-1593885184,-1711329280,-1828773632,-1962995456,-2097217536,-285221632,-301999360,-318777088,-335554816,-352332544,-369110528,-385888512,-402666496,-419444480,-436222720,-453000960,-469779200,-503334656,-536890368,-570446080,-604002048,-637558016,-671113984,-721447424,-771780864,-822114560,-872448256,-922782208,-989893632,-1057005056,-1124116736,-1191228672,-1275118080,-1359007744,-1459674880,-1560342272,-1677787136,-234889984,-234890496,-251668224,-268445952,-285223680,-302001664,-318779648,-335557632,-352335616,-369113856,-385892096,-402670336,-419448576,-436227072,-453005568,-469784320,-503340288,-536896256,-570452480,-604008704,-637565184,-671121664,-704678400,-755012608,-805346816,-855681280,-906016000,-973128192,-1040240640,-1107353344,-1174466304,-1258356736,-234889984,-234890496,-234891008,-234891520,-234892032,-234892800,-234893568,-234894336,-234895104,-251673344,-268451584,-285229824,-302008064,-318786560,-335565056,-352343808,-369122560,-385901312,-402680320,-419459328,-436238592,-453017856,-486574592,-520131584,-553688576,-587245824,-620803328,-654361088,-687919104,-738254592,-788590336,-838926336,-234889984,-234890496,-234891008,-234891520,-234892032,-234892800,-234893568,-234894336,-234895104,-234896128,-234897152,-234898176,-234899200,-234900480,-234901760,-234903296,-234904832,-234906368,-234908160,-234909952,-234912000,-251691264,-268470784,-285250560,-302030336,-318810368,-335590656,-352371200,-369152000,-385933056,-402714368,-419495936,-8960,-9472,-9984,-10496,-11008,-11776,-12544,-13312,-14080,-15104,-16128,-17152,-18176,-19456,-20736,-22272,-23808,-25344,-27136,-28928,-30976,-33024,-35328,-37888,-40448,-43264,-46336,-49664,-53248,-57088,-61184,-65536,-926464,-926976,-927488,-928000,-928512,-929280,-930048,-930816,-931584,-932608,-933632,-934656,-935680,-936960,-938240,-939776,-941312,-1008384,-1075712,-1143040,-1210624,-1278208,-1346048,-1414144,-1482240,-1550592,-1619200,-1688064,-1757184,-1826560,-1896192,-2031616,-926464,-926976,-927488,-928000,-928512,-929280,-930048,-996352,-1062656,-1129216,-1195776,-1262336,-1328896,-1395712,-1462528,-1529600,-1596672,-1663744,-1731072,-1798400,-1865984,-1999104,-2132480,-2266112,-2399744,-2533632,-2667776,-2867712,-3067904,-3268352,-3469056,-3670016,-926464,-992512,-1058560,-1124608,-1190656,-1256960,-1323264,-1389568,-1455872,-1522432,-1588992,-1655552,-1722112,-1788928,-1855744,-1988352,-2120960,-2253568,-2386432,-2519296,-2652416,-2785536,-2984448,-3183616,-3382784,-3582208,-3847424,-4112896,-4378624,-4644608,-4976384,-5308416,-1188608,-1254656,-1320704,-1386752,-1452800,-1519104,-1585408,-1651712,-1718016,-1784576,-1851136,-1983232,-2115328,-2247680,-2380032,-2512640,-2645248,-2777856,-2976256,-3174656,-3373312,-3571968,-3836416,-4101120,-4365824,-4630784,-4961536,-5292544,-5689344,-6086400,-6483712,-6946816,-1385216,-1451264,-1517312,-1583360,-1649408,-1715712,-1782016,-1848320,-1980160,-2112256,-2244352,-2376448,-2508544,-2640896,-2838784,-3036928,-3235072,-3433216,-3631616,-3895552,-4159744,-4423936,-4688384,-5018624,-5348864,-5744896,-6141184,-6537728,-7000064,-7462656,-7991040,-8585216,-1581824,-1647872,-1713920,-1779968,-1846016,-1977856,-2109696,-2241536,-2373376,-2505472,-2637568,-2769664,-2967296,-3165184,-3363072,-3561216,-3759360,-4023040,-4286976,-4550912,-4880640,-5210368,-5540352,-5936128,-6331904,-6793472,-7255296,-7782912,-8310784,-8904448,-9563904,-10223616,-1712896,-1778944,-1844992,-1976576,-2108160,-2240000,-2371840,-2503680,-2635520,-2767616,-2965248,-3162880,-3360512,-3558400,-3821824,-4085504,-4349184,-4612864,-4942336,-5271808,-5667072,-6062336,-6457856,-6919168,-7380480,-7907584,-8434944,-9028096,-9687040,-10346240,-11071232,-11862016,-1843968,-1975552,-2107136,-2238720,-2370304,-2502144,-2633984,-2765824,-2963200,-3160832,-3358464,-3556096,-3753728,-4017152,-4280576,-4544256,-4873472,-5202688,-5532160,-5927168,-6322432,-6783232,-7244288,-7771136,-8297984,-8890624,-9549056,-10207744,-10932224,-11722496,-12578560,-13500416,-1975040,-2106624,-2238208,-2369792,-2501376,-2633216,-2830592,-3027968,-3225344,-3422976,-3620608,-3883776,-4146944,-4410368,-4673792,-5003008,-5332224,-5726976,-6121984,-6582528,-7043328,-7504128,-8030720,-8623104,-9215488,-9873664,-10597632,-11387392,-12242944,-13164288,-14085888,-15138816,-2237184,-2368768,-2500352,-2631936,-2763520,-2960896,-3158272,-3355648,-3553024,-3816192,-4079360,-4342528,-4605696,-4934656,-5263616,-5658368,-6053120,-6447872,-6908416,-7368960,-7895296,-8421632,-9013760,-9671680,-10329600,-11053312,-11842816,-12698112,-13619200,-14606080,-15658752,-16777216] \ No newline at end of file
diff --git a/release/scripts/flt_export.py b/release/scripts/flt_export.py
index 283c24a3ad0..d2e90bc27b8 100755..100644
--- a/release/scripts/flt_export.py
+++ b/release/scripts/flt_export.py
@@ -1,45 +1,25 @@
#!BPY
""" Registration info for Blender menus:
Name: 'OpenFlight (.flt)...'
-Blender: 237
+Blender: 245
Group: 'Export'
Tip: 'Export to OpenFlight v16.0 (.flt)'
"""
-__author__ = "Greg MacDonald"
-__version__ = "1.2 10/20/05"
+__author__ = "Greg MacDonald, Geoffrey Bantle"
+__version__ = "2.0 11/21/07"
__url__ = ("blender", "elysiun", "Author's homepage, http://sourceforge.net/projects/blight/")
__bpydoc__ = """\
This script exports v16.0 OpenFlight files. OpenFlight is a
registered trademark of MultiGen-Paradigm, Inc.
-Run from "File->Export" menu.
-
-Options are available from Blender's "Scripts Config Editor," accessible through
-the "Scripts->System" menu from the scripts window.
-
-Features:<br>
-* Heirarchy retained.<br>
-* Normals retained.<br>
-* First texture exported.<br>
-* Diffuse material color is exported as the face color, material color, or both
-depending on the option settings.<br>
-* Double sided faces are exported as two faces.<br>
-* Object transforms exported.
-
-Things To Be Aware Of:<br>
-* Object names are exported, not mesh or data names.
-* Material indices that don't have a material associated with them will confuse the
-exporter. If a warning appears about this, correct it by deleting the offending
-material indices in Blender.
-
-What's Not Handled:<br>
-* Animations.<br>
-* Vetex colors.<br>
+Feature overview and more availible at:
+http://wiki.blender.org/index.php/Scripts/Manual/Export/openflight_flt
"""
# flt_export.py is an OpenFlight exporter for blender.
-# Copyright (C) 2005 Greg MacDonald
+#
+# Copyright (C) 2005 Greg MacDonald, 2007 Blender Foundation.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -56,29 +36,87 @@ What's Not Handled:<br>
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
import Blender
+from Blender import Modifier
+import os.path
+import flt_properties
+import flt_defaultp as defaultp
from flt_filewalker import FltOut
+from flt_filewalker import FileFinder
+from flt_properties import *
+import shutil
+
+FF = FileFinder()
+records = process_recordDefs()
class ExporterOptions:
def __init__(self):
- self.defaults = { 'Diffuse Color To OpenFlight Material': False,
- 'Diffuse Color To OpenFlight Face': True}
+ self.verbose = 1
+ self.tolerance = 0.001
+ self.writevcol = True
- d = Blender.Registry.GetKey('flt_export', True)
+ #new stuff
+ self.export_shading = 0
+ self.shading_default = 45.0
+ self.basepath = os.path.dirname(Blender.Get('filename'))
+ self.scale = 1.0
- if d == None or d.keys() != self.defaults.keys():
- d = self.defaults
- Blender.Registry.SetKey('flt_export', d, True)
+ #set externals path
+ if(os.path.exists(os.path.join(self.basepath,'externals'))):
+ self.externalspath = os.path.join(self.basepath,'externals')
+ else:
+ self.externalspath = self.basepath
- self.verbose = 1
- self.tolerance = 0.001
- self.use_mat_color = d['Diffuse Color To OpenFlight Material']
- self.use_face_color = d['Diffuse Color To OpenFlight Face']
+ self.doxrefs = 1
+
+ #texture options
+ if(os.path.exists(os.path.join(self.basepath,'textures'))):
+ self.texturespath = os.path.join(self.basepath,'textures')
+ else:
+ self.texturespath = self.basepath
+
+ #misc
+ self.write_attrib_files = 0
+ self.copy_textures = 0
+ self.export_transform = 0
+ self.flattenmesh = False
+ self.xapp = 1
+ reg = Blender.Registry.GetKey('flt_export',1)
+ if(reg and 'xappath' in reg.keys()):
+ self.xappath = reg['xappath']
+ else:
+ self.xappath = ''
options = ExporterOptions()
+tex_files = dict() #a list of (possibly) modified texture path names
+
+tex_layers = ['Layer0', 'Layer1', 'Layer2', 'Layer3', 'Layer4', 'Layer5', 'Layer6', 'Layer7']
+mask = 2147483648
+mtexmasks = []
+for i in xrange(7):
+ mtexmasks.append(mask)
+ mask = mask / 2
FLOAT_TOLERANCE = options.tolerance
+#need to move all this stuff to flt_properties.py.
identity_matrix = [[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]]
+alltypes = [2,4,11,73,63,111]
+childtypes = {
+ 2 : [111,2,73,4,14,63],
+ 4 : [111],
+ 73 : [111,2,73,4,14,63],
+ 63 : [],
+ 14 : [111,2,73,4,14,63],
+ 111 : []
+}
+recordlen = {
+ 2: 44,
+ 4: 28,
+ 73: 80,
+ 63: 216,
+ 14: 384,
+ 111: 156
+}
def is_identity(m):
for i in xrange(4):
@@ -102,13 +140,47 @@ class MaterialDesc:
self.alpha = 1.0 # Range is [0.0, 1.0]
class VertexDesc:
- def __init__(self, co=None, no=None, uv=None):
+ def __init__(self, co=None, no=None, uv=None, fltindex=None,cindex=None):
if co: self.x, self.y, self.z = tuple(co)
else: self.x = self.y = self.z = 0.0
if no: self.nx, self.ny, self.nz = tuple(no)
else: self.nx = self.ny = self.nz = 0.0
if uv: self.u, self.v = tuple(uv)
else: self.u = self.v = 0.0
+ if cindex: self.cindex = cindex
+ else: self.cindex = 127
+ self.fltindex = fltindex
+ self.accum = 0
+
+class shadowVert:
+ def __init__(self,bvert,object,world,normal):
+ global options
+
+ self.co = Blender.Mathutils.Vector(bvert.co[0],bvert.co[1],bvert.co[2])
+ #if world:
+ # vec = self.co
+ # vec = Blender.Mathutils.Vector(vec[0] * options.scale, vec[1] * options.scale, vec[2] * options.scale) #scale
+ # self.co = Blender.Mathutils.TranslationMatrix(vec) * (self.co * object.getMatrix('worldspace'))
+
+ if normal:
+ #if world:
+ # self.no = Blender.Mathutils.Vector(normal * object.getMatrix('worldspace')).normalize()
+ #else:
+ self.no = Blender.Mathutils.Vector(normal[0],normal[1],normal[2])
+
+ else:
+ #if world:
+ #self.no = Blender.Mathutils.Vector(bvert.no * object.getMatrix('worldspace')).normalize()
+ #else:
+ self.no = Blender.Mathutils.Vector(bvert.no[0],bvert.no[1],bvert.no[2])
+
+ #do scaling factor
+ #if options.scale != 1.0:
+ #self.co[0] = self.co[0] * options.scale
+ #self.co[1] = self.co[1] * options.scale
+ #self.co[2] = self.co[2] * options.scale
+
+ self.index = bvert.index
class GlobalResourceRepository:
def new_face_name(self):
@@ -121,44 +193,98 @@ class GlobalResourceRepository:
def request_vertex_desc(self, i):
return self.vertex_lst[i]
- def request_vertex_index(self, desc):
- match = None
- for i, v in enumerate(self.vertex_lst):
- if\
- abs(v.x - desc.x) > FLOAT_TOLERANCE or\
- abs(v.y - desc.y) > FLOAT_TOLERANCE or\
- abs(v.z - desc.z) > FLOAT_TOLERANCE or\
- abs(v.nx - desc.nx) > FLOAT_TOLERANCE or\
- abs(v.ny - desc.ny) > FLOAT_TOLERANCE or\
- abs(v.nz - desc.nz) > FLOAT_TOLERANCE or\
- abs(v.u - desc.u) > FLOAT_TOLERANCE or\
- abs(v.v - desc.v) > FLOAT_TOLERANCE:
- pass
- else:
- match = i
- break
+ def request_vertex_index(self, object, mesh, face, vfindex, uvok,cindex):
- if match != None:
- return match
+ flatShadeNorm = None
+
+ if type(face) is list:
+ vertex = face[vfindex]
+ elif str(type(face)) == "<type " + "'Blender MVert'>":
+ vertex = face
+ elif str(type(face)) == "<type " + "'Blender MEdge'>":
+ if vfindex == 1:
+ vertex = face.v1
+ elif vfindex == 2:
+ vertex = face.v2
+ elif str(type(face)) == "<type " + "'Blender MFace'>":
+ if not face.smooth:
+ flatShadeNorm = face.no
+ vertex = face.v[vfindex]
+ else:
+ return None
+
+ if not self.namehash.has_key(object.name):
+ self.namehash[object.name] = dict()
+ indexhash = self.namehash[object.name]
+
+ #export in global space? THIS HAS BEEN MADE REDUNDANT... REMOVE ME
+ if not options.export_transform:
+ vertex = shadowVert(vertex,object,True,flatShadeNorm)
else:
- self.vertex_lst.append(desc)
- return len(self.vertex_lst) - 1
-
- def request_texture_index(self, filename):
+ vertex = shadowVert(vertex,object,False,flatShadeNorm)
+
+
+ #Check to see if this vertex has been visited before. If not, add
+ if not indexhash.has_key(vertex.index):
+ if uvok:
+ newvdesc = VertexDesc(vertex.co, vertex.no, face.uv[vfindex], self.nextvindex,cindex=cindex)
+ else:
+ newvdesc = VertexDesc(co=vertex.co, no=vertex.no,fltindex=self.nextvindex,cindex=cindex)
+
+ indexhash[vertex.index] = [newvdesc]
+ self.vertex_lst.append(newvdesc)
+ self.nextvindex = self.nextvindex + 1
+ return newvdesc.fltindex
+
+ else:
+ desclist = indexhash[vertex.index]
+ if uvok:
+ faceu = face.uv[vfindex][0]
+ facev = face.uv[vfindex][1]
+ else:
+ faceu = 0.0
+ facev = 0.0
+ for vdesc in desclist:
+ if\
+ abs(vdesc.x - vertex.co[0]) > FLOAT_TOLERANCE or\
+ abs(vdesc.y - vertex.co[1]) > FLOAT_TOLERANCE or\
+ abs(vdesc.z - vertex.co[2]) > FLOAT_TOLERANCE or\
+ abs(vdesc.nx - vertex.no[0]) > FLOAT_TOLERANCE or\
+ abs(vdesc.ny - vertex.no[1]) > FLOAT_TOLERANCE or\
+ abs(vdesc.nz - vertex.no[2]) > FLOAT_TOLERANCE or\
+ vdesc.cindex != cindex or\
+ abs(vdesc.u - faceu) > FLOAT_TOLERANCE or\
+ abs(vdesc.v - facev) > FLOAT_TOLERANCE:
+ pass
+ else:
+ return vdesc.fltindex
+
+ #if we get this far, we didnt find a match. Add a new one and return
+ if uvok:
+ newvdesc = VertexDesc(vertex.co, vertex.no, face.uv[vfindex], self.nextvindex,cindex=cindex)
+ else:
+ newvdesc = VertexDesc(co=vertex.co, no=vertex.no,fltindex=self.nextvindex,cindex=cindex)
+ indexhash[vertex.index].append(newvdesc)
+ self.vertex_lst.append(newvdesc)
+ self.nextvindex = self.nextvindex + 1
+ return newvdesc.fltindex
+
+
+ def request_texture_index(self, image):
match = None
for i in xrange(len(self.texture_lst)):
- if self.texture_lst[i] != filename:
+ if self.texture_lst[i] != image:
continue
match = i
break
if match != None:
return match
else:
- self.texture_lst.append(filename)
+ self.texture_lst.append(image)
return len(self.texture_lst) - 1
def request_texture_filename(self, index):
- return self.texture_lst[index]
+ return Blender.sys.expandpath(self.texture_lst[index].getFilename())
def texture_count(self):
return len(self.texture_lst)
@@ -239,7 +365,11 @@ class GlobalResourceRepository:
return len(self.color_lst)
def __init__(self):
+ #Vertex handling
self.vertex_lst = []
+ self.nextvindex = 0
+ self.namehash = dict()
+
self.texture_lst = []
self.material_lst = []
self.color_lst = [[255, 255, 255]]
@@ -253,7 +383,6 @@ class Node:
if self.object:
if options.verbose >= 2:
print '\t' * level[0], self.name, self.object.type
-
level[0] += 1
for child in self.children:
@@ -288,183 +417,530 @@ class Node:
self.header.fw.write_ushort(length+5) # Length of record
self.header.fw.write_string(name, length+1) # name + zero terminator
+ def write_comment(self,comment):
+ length = len(comment)
+ if length >= 65535:
+ comment = comment[:65530]
+ length = len(comment)
+
+ pad = (length % 4) - 1
+ if pad < 0:
+ pad = None
+ reclength = length + 5
+ else:
+ reclength = length + 5 + pad
+
+ self.header.fw.write_short(31) # Comment Opcode
+ self.header.fw.write_ushort(reclength) # Length of record is 4 + comment length + null terminator + pad
+ self.header.fw.write_string(comment,length+1) # comment + zero terminator
+ if pad:
+ self.header.fw.pad(pad) # pad to multiple of 4 bytes
+
# Initialization sets up basic tree structure.
- def __init__(self, parent, header, object, object_lst):
+ def __init__(self, parent, header, object,props):
+ global options
+
self.header = header
self.object = object
if object:
self.name = self.object.name
- self.matrix = self.object.getMatrix('localspace')
+ if not options.export_transform:
+ oloc = Blender.Mathutils.Vector(object.getLocation('worldspace'))
+ vec = Blender.Mathutils.Vector(oloc[0] * options.scale, oloc[1] * options.scale, oloc[2] * options.scale) #scale
+ self.matrix = self.object.getMatrix('worldspace') * Blender.Mathutils.TranslationMatrix(vec - oloc)
+ else:
+ self.matrix = self.object.getMatrix('localspace') #do matrix mult here.
+ self.props = props
+ self.child_objects = self.header.parenthash[object.name]
else:
self.name = 'no name'
self.matrix = None
-
+ self.props = None
+ self.child_objects = self.header.child_objects
+
self.children = []
self.parent = parent
if parent:
parent.children.append(self)
-
- left_over = object_lst[:]
- self.child_objects = []
-
- # Add children to child list and remove from left_over list.
- # Pop is faster then remove
- i = len(object_lst)
- while i:
- i-=1
- if object_lst[i].parent == object:
- self.child_objects.append(left_over.pop(i))
-
# Spawn children.
- self.has_object_child = False # For Database class.
for child in self.child_objects:
- if child.type == 'Mesh':
- BlenderMesh(self, header, child, left_over)
- self.has_object_child = True
- else: # Treat all non meshes as emptys
- BlenderEmpty(self, header, child, left_over)
-
+ if(not child.restrictDisplay):
+ childprops = None
+ type = None
+ if not child.properties.has_key('FLT'):
+ if child.type == 'Empty':
+ if child.DupGroup:
+ childprops = FLTXRef.copy()
+ type = 63
+ else:
+ childprops = FLTGroup.copy()
+ type = 2
+ elif child.type == 'Mesh':
+ if self.header.childhash[child.name] or not child.parent:
+ childprops = FLTGroup.copy()
+ type = 2
+ else:
+ childprops = FLTObject.copy()
+ type = 4
+
+ else:
+ childprops = dict()
+ for prop in child.properties['FLT']:
+ childprops[prop] = child.properties['FLT'][prop]
+ type = child.properties['FLT']['type']
+
+ if type in self.childtypes and type in alltypes:
+ Newnode = FLTNode(self,header,child,childprops,type)
+ if child.type == 'Mesh':
+ self.header.mnodes.append(Newnode)
class FaceDesc:
def __init__(self):
self.vertex_index_lst = []
+ self.mface = None
self.texture_index = -1
self.material_index = -1
self.color_index = 127
-
-class BlenderMesh(Node):
- def blender_export(self):
- Node.blender_export(self)
-
- mesh = self.object.getData()
- mesh_hasuv = mesh.hasFaceUV()
- # Gather materials and textures.
- tex_index_lst = []
- mat_index_lst = []
- color_index_lst = []
- materials = mesh.getMaterials()
-
- if not materials:
- materials = [Blender.Material.New()]
-
- for mat in materials:
- # Gather Color.
- if options.use_face_color:
- color_index_lst.append(self.header.GRR.request_color_index(mat.getRGBCol()))
+ self.renderstyle = 0
+ self.twoside = 0
+ self.name = None #uses next FLT name if not set... fix resolution of conflicts!
+
+ #Multi-Tex info. Dosn't include first UV Layer!
+ self.uvlayer = list() #list of list of tuples for UV coordinates.
+ self.images = list() #list of texture indices for seperate UV layers
+ self.mtex = list()
+ self.subface = None #can either be 'Push' or 'Pop'
+
+def edge_get_othervert(vert, edge):
+ if edge.v1 == vert:
+ return edge.v2
+ elif edge.v2 == vert:
+ return edge.v1
+ return None
+
+class FLTNode(Node):
+ def walkLoop(self, targetvert, startvert, startedge, edgelist, visited, vedges, closeloop):
+ loop = [targetvert]
+
+ curvert = startvert
+ curedge = startedge
+ visited[curedge] = True
+ found = False
+
+ while not found:
+ loop.append(curvert)
+ disk = vedges[curvert.index]
+ if not closeloop:
+ if len(disk) == 1:
+ visited[curedge] = True
+ break
else:
- color_index_lst.append(127) # white
- # Gather Texture.
- mtex_lst = mat.getTextures()
-
- index = -1
- mtex = mtex_lst[0] # Not doing multi-texturing at the moment.
- if mtex != None:
- tex = mtex_lst[0].tex
- if tex != None:
- image = tex.getImage()
- if image != None:
- filename = image.getFilename()
- index = self.header.GRR.request_texture_index(filename)
-
- tex_index_lst.append(index)
-
- # Gather Material
- mat_desc = MaterialDesc()
- mat_desc.name = mat.name
- mat_desc.alpha = mat.getAlpha()
- mat_desc.shininess = mat.getSpec() * 64.0 # 2.0 => 128.0
- if options.use_mat_color:
- mat_desc.diffuse = mat.getRGBCol()
+ if len(disk) < 2: #what?
+ visited[curedge] = True
+ return None
+
+ if disk[0] == curedge:
+ curedge = disk[1]
else:
- mat_desc.diffuse = [1.0, 1.0, 1.0]
+ curedge = disk[0]
+ if curedge.v1.index == curvert.index:
+ curvert = curedge.v2
+ else:
+ curvert = curedge.v1
- mat_desc.specular = mat.getSpecCol()
- amb = mat.getAmb()
- mat_desc.ambient = [amb, amb, amb]
- emit = mat.getEmit()
- mat_desc.emissive = [emit, emit, emit]
+ visited[curedge] = True
+
+ if(curvert == targetvert):
+ found = True
+
+ return loop
+
+ def buildVertFaces(self,vertuse):
+ for vert in self.exportmesh.verts:
+ if vertuse[vert.index][0] == False and vertuse[vert.index][1] == 0:
+ face_desc = FaceDesc()
+ face_desc.vertex_index_lst.append(self.header.GRR.request_vertex_index(self.object, self.exportmesh, vert, 0,0,0))
+ face_desc.renderstyle = 3
+ face_desc.color_index = 227
+ self.face_lst.append(face_desc)
- mat_index_lst.append(self.header.GRR.request_material_index(mat_desc))
+ def buildEdgeFaces(self,vertuse):
+ for edge in self.exportmesh.edges:
+ v1 = vertuse[edge.v1.index]
+ v2 = vertuse[edge.v2.index]
+ if v1[0] == False and v2[0] == False:
+ if v1[1] == 1 and v2[1] == 1:
+ face_desc = FaceDesc()
+ face_desc.vertex_index_lst.append(self.header.GRR.request_vertex_index(self.object, self.exportmesh, edge, 1, 0,0))
+ face_desc.vertex_index_lst.append(self.header.GRR.request_vertex_index(self.object, self.exportmesh, edge, 2, 0,0))
+ face_desc.renderstyle = 3
+ face_desc.color_index = 227
+ self.face_lst.append(face_desc)
+
+
+ def vertwalk(self, startvert, loop, disk, visited):
+ visited[startvert] = True
+ for edge in disk[startvert]:
+ othervert = edge_get_othervert(startvert, edge)
+ if not visited[othervert]:
+ loop.append(othervert)
+ self.vertwalk(othervert,loop,disk,visited)
+
+ def buildOpenFacesNew(self, vertuse):
+ wireverts = list()
+ wiredges = list()
+ visited = dict()
+ disk = dict()
+ loops = list()
+
+ for edge in self.exportmesh.edges:
+ v1 = vertuse[edge.v1.index]
+ v2 = vertuse[edge.v2.index]
+ if v1[0] == False and v2[0] == False:
+ if v1[1] < 3 and v2[1] < 3:
+ wireverts.append(edge.v1)
+ wireverts.append(edge.v2)
+ wiredges.append(edge)
+
+ #build disk data
+ for vert in wireverts:
+ visited[vert] = False
+ disk[vert] = list()
+ for edge in wiredges:
+ disk[edge.v1].append(edge)
+ disk[edge.v2].append(edge)
+
+ #first pass: do open faces
+ for vert in wireverts:
+ if not visited[vert] and vertuse[vert.index][1] == 1:
+ visited[vert] = True
+ loop = [vert]
+ othervert = edge_get_othervert(vert, disk[vert][0])
+ self.vertwalk(othervert, loop, disk, visited)
+ if len(loop) > 2: loops.append( ('Open', loop) )
+
+ for vert in wireverts:
+ if not visited[vert]:
+ visited[vert] = True
+ loop = [vert]
+ othervert = edge_get_othervert(vert,disk[vert][0])
+ self.vertwalk(othervert, loop, disk, visited)
+ if len(loop) > 2: loops.append( ('closed', loop) )
+
+ #now go through the loops and append.
+ for l in loops:
+ (type, loop) = l
+ face_desc = FaceDesc()
+ for i,vert in enumerate(loop):
+ face_desc.vertex_index_lst.append(self.header.GRR.request_vertex_index(self.object,self.exportmesh,loop,i,0,0))
+ if type == 'closed':
+ face_desc.renderstyle = 2
+ else:
+ face_desc.renderstyle = 3
+ face_desc.color_index = 227
+ self.face_lst.append(face_desc)
- # Faces described as lists of indices into the GRR's vertex_lst.
- for face in mesh.faces:
-
- face_v = face.v # Faster access
-
- # Create vertex description list for each face.
- if mesh_hasuv:
- vertex_lst = [VertexDesc(v.co, v.no, face.uv[i]) for i, v in enumerate(face_v)]
- else:
- vertex_lst = [VertexDesc(v.co, v.no) for i, v in enumerate(face_v)]
+ def sortFLTFaces(self,a,b):
+ aindex = a.getProperty("FLT_ORIGINDEX")
+ bindex = b.getProperty("FLT_ORIGINDEX")
+
+ if aindex > bindex:
+ return 1
+ elif aindex < bindex:
+ return -1
+ return 0
+
+ def buildNormFaces(self):
+
+ global options
+ meshlayers = self.exportmesh.getUVLayerNames()
+ oldlayer = self.exportmesh.activeUVLayer
+ uvok = 0
+ subfaceok = 0
+ subfacelevel = 0
+
+ #special case
+ if self.exportmesh.faceUV and len(meshlayers) == 1:
+ uvok = 1
+ elif self.exportmesh.faceUV and tex_layers[0] in meshlayers:
+ self.exportmesh.activeUVLayer = tex_layers[0]
+ uvok = 1
+
+ #Sort faces according to the subfaces/FLT indices
+ if "FLT_ORIGINDEX" in self.exportmesh.faces.properties and "FLT_SFLEVEL" in self.exportmesh.faces.properties:
+ exportfaces = list()
+ for face in self.exportmesh.faces:
+ exportfaces.append(face)
+ exportfaces.sort(self.sortFLTFaces)
+ subfaceok = 1
+ else:
+ exportfaces = self.exportmesh.faces
+ # Faces described as lists of indices into the GRR's vertex_lst.
+ for face in exportfaces:
+ descs = list()
+ #first we export the face as normal
index_lst = []
- for vert_desc in vertex_lst:
- index_lst.append(self.header.GRR.request_vertex_index(vert_desc))
-
+ face_v = face.verts
+ for i, v in enumerate(face_v):
+ index_lst.append(self.header.GRR.request_vertex_index(self.object,self.exportmesh,face,i,uvok,0))
face_desc = FaceDesc()
face_desc.vertex_index_lst = index_lst
+ face_desc.mface = face
+ descs.append(face_desc)
- if face.materialIndex < len(materials):
- face_desc.color_index = color_index_lst[face.materialIndex]
- face_desc.texture_index = tex_index_lst[face.materialIndex]
- face_desc.material_index = mat_index_lst[face.materialIndex]
- else:
- if options.verbose >=1:
- print 'Warning: Missing material for material index. Materials will not be imported correctly. Fix by deleting abandoned material indices in Blender.'
+ #deal with subfaces
+ if subfaceok:
+ fsflevel = face.getProperty("FLT_SFLEVEL")
+ for face_desc in descs:
+ if fsflevel > subfacelevel:
+ face_desc.subface = 'Push'
+ subfacelevel = fsflevel
+ elif fsflevel < subfacelevel:
+ face_desc.subface = 'Pop'
+ subfacelevel = fsflevel
+
+
+ if uvok and (face.mode & Blender.Mesh.FaceModes.TWOSIDE):
+ face_desc.renderstyle = 1
+ for face_desc in descs:
+ if "FLT_COL" in self.exportmesh.faces.properties:
+ color_index = face.getProperty("FLT_COL")
+# if(color_index < 127):
+# color_index = 127 #sanity check for face color indices
+ if(color_index == 0):
+ color_index = 127
+ face_desc.color_index = color_index
+ else:
+ face_desc.color_index = 127
+ if "FLT_ID" in self.exportmesh.faces.properties:
+ face_desc.name = face.getProperty("FLT_ID") #need better solution than this.
+
+ self.face_lst.append(face_desc)
+ if uvok:
+ self.exportmesh.activeUVLayer = oldlayer
- self.face_lst.append(face_desc)
+ def buildTexData(self):
+
+ meshlayers = self.exportmesh.getUVLayerNames()
+ oldlayer = self.exportmesh.activeUVLayer
+ uvok = 0
+
+ if self.exportmesh.faceUV and len(meshlayers) == 1:
+ uvok = 1
+ if self.exportmesh.faceUV and tex_layers[0] in meshlayers:
+ self.exportmesh.activeUVLayer = tex_layers[0]
+ uvok = 1
+
+ if uvok:
+ #do base layer. UVs have been stored on vertices directly already.
+ for i, face in enumerate(self.face_lst):
+ if face.mface:
+ mface = face.mface
+ image = mface.image
+ if image != None and mface.mode & Blender.Mesh.FaceModes["TEX"]:
+ index = self.header.GRR.request_texture_index(image)
+ else:
+ index = -1
+ face.texture_index = index
+
+ for i, face in enumerate(self.face_lst):
+ if face.mface:
+ mface_v = face.mface.v
+ for v in mface_v:
+ face.uvlayer.append([])
- # Export double sided face as 2 faces with opposite orientations.
- if mesh_hasuv and face.mode & Blender.NMesh.FaceModes['TWOSIDE']:
- # Create vertex description list for each face. they have a face mode, so we know they have a UV too.
- vertex_lst = [VertexDesc(v.co, -v.no, face.uv[i]) for i, v in enumerate(face_v)]
- vertex_lst.reverse() # Reversing flips the face.
+ for layername in tex_layers[1:]:
+ if layername in meshlayers:
+ self.exportmesh.activeUVLayer=layername
+ for i, face in enumerate(self.face_lst):
+ if face.mface:
+
+ face.mtex.append(layername)
+ mface = face.mface
+ mface_v = mface.v
+ image = mface.image
+
+ if image != None and mface.mode & Blender.Mesh.FaceModes["TEX"]:
+ index = self.header.GRR.request_texture_index(image)
+ face.images.append(index)
+ else:
+ face.images.append(-1)
+
+ for j, v in enumerate(mface_v):
+ face.uvlayer[j].append(tuple(mface.uv[j]))
+ if uvok:
+ self.exportmesh.activeUVLayer = oldlayer
+ def blender_export(self):
+ global options
+ Node.blender_export(self)
+ if self.opcode == 111:
+ self.exportmesh = Blender.Mesh.New()
+ self.exportmesh.getFromObject(self.object.name)
+
+ for vert in self.exportmesh.verts:
+ if not options.export_transform:
+ vec = vert.co
+ vec = Blender.Mathutils.Vector(vec[0] * options.scale, vec[1] * options.scale, vec[2] * options.scale) #scale
+ vert.co = Blender.Mathutils.TranslationMatrix(vec) * (vert.co * self.object.getMatrix('worldspace'))
- index_lst = []
- for vert_desc in vertex_lst:
- index_lst.append(self.header.GRR.request_vertex_index(vert_desc))
+ if options.scale != 1.0:
+ vert.co = vert.co * options.scale
+
+ if("FLT_VCOL") in self.mesh.verts.properties:
+ for v in self.exportmesh.verts:
+ self.vert_lst.append(self.header.GRR.request_vertex_index(self.object,self.exportmesh,v,0,0,v.getProperty("FLT_VCOL")))
+ else:
+ for v in self.mesh.verts:
+ self.vert_lst.append(self.header.GRR.request_vertex_index(self.object,self.mesh,v,0,0,127))
+
+
+
+ elif self.mesh:
+ orig_mesh = self.object.getData(mesh=True)
+ self.exportmesh = Blender.Mesh.New()
+ default = None
+
+
+ if options.export_shading:
+ mods = self.object.modifiers
+ hasedsplit = False
+ for mod in mods:
+ if mod.type == Blender.Modifier.Types.EDGESPLIT:
+ hasedsplit = True
+ break
+ if not hasedsplit:
+ default = mods.append(Modifier.Types.EDGESPLIT)
+ default[Modifier.Settings.EDGESPLIT_ANGLE] = options.shading_default
+ default[Modifier.Settings.EDGESPLIT_FROM_ANGLE] = True
+ default[Modifier.Settings.EDGESPLIT_FROM_SHARP] = False
+ self.object.makeDisplayList()
+
+ self.exportmesh.getFromObject(self.object.name)
+
+ #recalculate vertex positions
+ for vert in self.exportmesh.verts:
+ if not options.export_transform:
+ vec = vert.co
+ vec = Blender.Mathutils.Vector(vec[0] * options.scale, vec[1] * options.scale, vec[2] * options.scale) #scale
+ vert.co = Blender.Mathutils.TranslationMatrix(vec) * (vert.co * self.object.getMatrix('worldspace'))
- face_desc = FaceDesc()
- face_desc.vertex_index_lst = index_lst
- if face.materialIndex < len(materials):
- face_desc.color_index = color_index_lst[face.materialIndex]
- face_desc.texture_index = tex_index_lst[face.materialIndex]
- face_desc.material_index = mat_index_lst[face.materialIndex]
- else:
- if options.verbose >=1:
- print 'Error: No material for material index. Delete abandoned material indices in Blender.'
-
- self.face_lst.append(face_desc)
+ if options.scale != 1.0:
+ vert.co = vert.co * options.scale
+
+ flipped = self.object.getMatrix('worldspace').determinant()
+
+ if not options.export_transform:
+ self.exportmesh.calcNormals()
+
+
+ if default:
+ #remove modifier from list
+ mods.remove(default)
+ self.object.makeDisplayList()
+
+ #build some adjacency data
+ vertuse = list()
+ wiredges = list()
+ openends = list()
+ for v in self.exportmesh.verts:
+ vertuse.append([False,0])
+
+ #build face incidence data
+ for face in self.exportmesh.faces:
+ for i, v in enumerate(face.verts):
+ vertuse[v.index][0] = True
+
+ for edge in self.exportmesh.edges: #count valance
+ vertuse[edge.v1.index][1] = vertuse[edge.v1.index][1] + 1
+ vertuse[edge.v2.index][1] = vertuse[edge.v2.index][1] + 1
+
+ #create all face types
+ self.buildVertFaces(vertuse)
+ self.buildEdgeFaces(vertuse)
+ self.buildOpenFacesNew(vertuse)
+ self.buildNormFaces()
+ self.buildTexData()
+
+ if not options.export_transform:
+ if flipped < 0:
+ for vdesc in self.header.GRR.vertex_lst:
+ vdesc.accum = 0
+ for face in self.face_lst:
+ face.vertex_index_lst.reverse()
+ for vert in face.vertex_index_lst:
+ self.header.GRR.vertex_lst[vert].accum = 1
+
+ for vdesc in self.header.GRR.vertex_lst:
+ if vdesc.accum:
+ vdesc.nx = vdesc.nx * -1
+ vdesc.ny = vdesc.ny * -1
+ vdesc.nz = vdesc.nz * -1
+
def write_faces(self):
+ sublevel = 0
for face_desc in self.face_lst:
- face_name = self.header.GRR.new_face_name()
+ if face_desc.name:
+ face_name = face_desc.name
+ else:
+ face_name = self.header.GRR.new_face_name()
+ #grab the alpha value.
+ alpha = 0
+ if face_desc.texture_index > -1:
+ try:
+ typestring = os.path.splitext(self.header.GRR.texture_lst[face_desc.texture_index].getFilename())[1]
+ if typestring == '.inta' or typestring == '.rgba':
+ alpha = 1
+ except:
+ pass
+
+ if not alpha:
+ for index in face_desc.images:
+ try:
+ typestring = os.path.splitext(self.header.GRR.texture_lst[index].getFilename())[1]
+ if typestring == '.inta' or typestring == '.rgba':
+ alpha = 1
+ except:
+ pass
+
+ if face_desc.subface:
+ if face_desc.subface == 'Push':
+ self.header.fw.write_short(19)
+ self.header.fw.write_ushort(4)
+ sublevel += 1
+ else:
+ self.header.fw.write_short(20)
+ self.header.fw.write_ushort(4)
+ sublevel -= 1
self.header.fw.write_short(5) # Face opcode
self.header.fw.write_ushort(80) # Length of record
self.header.fw.write_string(face_name, 8) # ASCII ID
self.header.fw.write_int(-1) # IR color code
- self.header.fw.write_short(0) # Relative priority
- self.header.fw.write_char(0) # Draw type
+ self.header.fw.write_short(0) # Relative priority
+ self.header.fw.write_char(face_desc.renderstyle) # Draw type
self.header.fw.write_char(0) # Draw textured white.
self.header.fw.write_ushort(0) # Color name index
self.header.fw.write_ushort(0) # Alt color name index
self.header.fw.write_char(0) # Reserved
- self.header.fw.write_char(1) # Template
+ self.header.fw.write_char(alpha) # Template
self.header.fw.write_short(-1) # Detail tex pat index
self.header.fw.write_short(face_desc.texture_index) # Tex pattern index
self.header.fw.write_short(face_desc.material_index) # material index
self.header.fw.write_short(0) # SMC code
- self.header.fw.write_short(0) # Feature code
+ self.header.fw.write_short(0) # Feature code
self.header.fw.write_int(0) # IR material code
self.header.fw.write_ushort(0) # transparency 0 = opaque
self.header.fw.write_uchar(0) # LOD generation control
self.header.fw.write_uchar(0) # line style index
- self.header.fw.write_int(0x00000000) # Flags
+ self.header.fw.write_int(0) # Flags
self.header.fw.write_uchar(2) # Light mode
+ #self.header.fw.write_uchar(3) # Light mode
+
self.header.fw.pad(7) # Reserved
- self.header.fw.write_uint(-1) # Packed color
- self.header.fw.write_uint(-1) # Packed alt color
+ self.header.fw.write_uint(0) # Packed color
+ self.header.fw.write_uint(0) # Packed alt color
self.header.fw.write_short(-1) # Tex map index
self.header.fw.write_short(0) # Reserved
self.header.fw.write_uint(face_desc.color_index) # Color index
@@ -473,7 +949,24 @@ class BlenderMesh(Node):
self.header.fw.write_short(-1) # Shader index
self.write_longid(face_name)
-
+
+
+ #Write Multitexture field if appropriate
+ mtex = len(face_desc.mtex)
+ if mtex:
+ uvmask = 0
+ for layername in face_desc.mtex:
+ mask = mtexmasks[tex_layers.index(layername)-1]
+ uvmask |= mask
+ self.header.fw.write_ushort(52) # MultiTexture Opcode
+ self.header.fw.write_ushort(8 + (mtex * 8)) # Length
+ self.header.fw.write_uint(uvmask) # UV mask
+ for i in xrange(mtex):
+ self.header.fw.write_ushort(face_desc.images[i]) # Tex pattern index
+ self.header.fw.write_ushort(0) # Tex effect
+ self.header.fw.write_ushort(0) # Tex Mapping index
+ self.header.fw.write_ushort(0) # Tex data. User defined
+
self.write_push()
# Vertex list record
@@ -484,72 +977,95 @@ class BlenderMesh(Node):
for vert_index in face_desc.vertex_index_lst:
# Offset into vertex palette
self.header.fw.write_int(vert_index*64+8)
-
+
+ #UV list record
+ if mtex:
+ #length = 8 + (numverts * multitex * 8)
+ self.header.fw.write_ushort(53) # UV List Ocode
+ self.header.fw.write_ushort(8 + (num_verts*mtex*8)) # Record Length
+ self.header.fw.write_uint(uvmask) # UV mask
+ for i, vert_index in enumerate(face_desc.vertex_index_lst):
+ for uv in face_desc.uvlayer[i]:
+ self.header.fw.write_float(uv[0]) #U coordinate
+ self.header.fw.write_float(uv[1]) #V coordinate
self.write_pop()
+ #clean up faces at the end of meshes....
+ if sublevel:
+ self.header.fw.write_short(20)
+ self.header.fw.write_ushort(4)
+
+ def write_lps(self):
+ # Vertex list record
+ self.write_push()
+ self.header.fw.write_short(72) # Vertex list opcode
+ num_verts = len(self.vert_lst)
+ self.header.fw.write_ushort(4*num_verts+4) # Length of record
+ for vert_index in self.vert_lst:
+ # Offset into vertex palette
+ self.header.fw.write_int(vert_index*64+8)
+ self.write_pop()
def write(self):
- if self.open_flight_type == 'Object':
- self.header.fw.write_short(4) # Object opcode
- self.header.fw.write_ushort(28) # Length of record
- self.header.fw.write_string(self.name, 8) # ASCII ID
- self.header.fw.pad(16)
-
- self.write_longid(self.name)
+ self.header.fw.write_short(self.opcode)
+ self.header.fw.write_ushort(recordlen[self.opcode])
+ exportdict = FLT_Records[self.opcode].copy()
+ for key in exportdict.keys():
+ if self.props.has_key(key):
+ exportdict[key] = self.props[key]
+
+ if self.opcode == 63 and options.externalspath:
+ try:
+ exportdict['3t200!filename'] = os.path.join(options.externalspath,self.object.DupGroup.name+'.flt')
+ self.header.xrefnames.append(self.object.DupGroup.name)
+ except:
+ pass
+
+ for key in records[self.opcode]:
+ (type,length,propname) = records[self.opcode][key]
+ write_prop(self.header.fw,type,exportdict[propname],length)
+
+ if self.props.has_key('comment'):
+ self.write_comment(self.props['comment'])
+ self.write_longid(self.name) #fix this!
+
+ if options.export_transform or self.opcode == 63:
+ #writing transform matrix....
self.write_matrix()
-
+
+ if self.opcode == 111:
+ self.write_lps()
+ elif self.face_lst != [] or self.children:
+ self.write_push()
if self.face_lst != []:
- self.write_push()
-
+ #self.write_push()
self.write_faces()
+ #self.write_pop()
- self.write_pop()
- else:
- self.header.fw.write_short(2) # Group opcode
- self.header.fw.write_ushort(44) # Length of record
- self.header.fw.write_string(self.name, 8) # ASCII ID
- self.header.fw.pad(32)
-
- self.write_longid(self.name)
-
- # Because a group can contain faces as well as children.
- self.write_push()
-
- self.write_faces()
-
- for child in self.children:
- child.write()
-
+ if self.children:
+ #self.write_push()
+ for child in self.children:
+ child.write()
+ #self.write_pop()
self.write_pop()
-
- def __init__(self, parent, header, object, object_lst):
- Node.__init__(self, parent, header, object, object_lst)
- self.face_lst = []
-
- if self.children:
- self.open_flight_type= 'Group'
- else: # Empty list.
- self.open_flight_type = 'Object'
-
-class BlenderEmpty(Node):
- def write(self):
- self.header.fw.write_short(2) # Group opcode
- self.header.fw.write_ushort(44) # Length of record
- self.header.fw.write_string(self.name, 8) # ASCII ID
- self.header.fw.pad(32)
-
- self.write_longid(self.name)
-
- self.write_matrix()
+ def __init__(self, parent, header, object,props,type):
+ self.opcode = type #both these next two lines need to be in the node class....
+ self.childtypes = childtypes[self.opcode]
+ Node.__init__(self, parent, header, object,props)
+ self.face_lst = []
+ self.vert_lst = [] #for light points.
+ self.mesh = None
+ self.uvlayer = 0
+ self.flipx = False
+ self.flipy = False
+ self.flipz = False
- if self.children: # != []
- self.write_push()
-
- for child in self.children:
- child.write()
- self.write_pop()
+ if self.object.type == 'Mesh':
+ self.mesh = self.object.getData(mesh=True)
+ if(self.mesh.faceUV):
+ self.uvLayer = len(self.mesh.getUVLayerNames())
class Database(Node):
def write_header(self):
@@ -568,8 +1084,19 @@ class Database(Node):
self.fw.write_int(0) # projection type, 0 = flat earth
self.fw.pad(30)
self.fw.write_short(1) # double precision
- self.fw.pad(140)
+ self.fw.write_int(100) # database origin type
+ self.fw.pad(88)
+ try:
+ self.fw.write_double(self.header.scene.properties['FLT']['origin lat']) #database origin lattitude
+ except:
+ self.fw.write_double(0)
+ try:
+ self.fw.write_double(self.header.scene.properties['FLT']['origin lon']) #database origin longitude
+ except:
+ self.fw.write_double(0)
+ self.fw.pad(32)
self.fw.write_int(0) # ellipsoid model, 0 = WSG 1984
+
self.fw.pad(52)
def write_vert_pal(self):
@@ -579,14 +1106,13 @@ class Database(Node):
self.fw.write_short(67) # Vertex palette opcode.
self.fw.write_short(8) # Length of record
self.fw.write_int(self.GRR.vertex_count() * 64 + 8) # Length of everything.
-
# Write records for individual vertices.
for i in xrange(self.GRR.vertex_count()):
desc = self.GRR.request_vertex_desc(i)
self.fw.write_short(70) # Vertex with color normal and uv opcode.
self.fw.write_ushort(64) # Length of record
- self.fw.write_ushort(0) # Color name index
- self.fw.write_short(0x2000) # Flags set to no color
+ self.fw.write_ushort(0) # Color name index
+ self.fw.write_short(0x20000000) # Flags
self.fw.write_double(desc.x)
self.fw.write_double(desc.y)
self.fw.write_double(desc.z)
@@ -595,16 +1121,19 @@ class Database(Node):
self.fw.write_float(desc.nz)
self.fw.write_float(desc.u)
self.fw.write_float(desc.v)
- self.fw.pad(12)
+ self.fw.pad(4)
+ self.fw.write_uint(desc.cindex)
+ self.fw.pad(4)
def write_tex_pal(self):
if options.verbose >= 2:
print 'Writing texture palette.'
# Write record for texture palette
- for i in xrange(self.GRR.texture_count()):
+ for i, img in enumerate(self.GRR.texture_lst):
+ filename = tex_files[img.name]
self.fw.write_short(64) # Texture palette opcode.
self.fw.write_short(216) # Length of record
- self.fw.write_string(self.GRR.request_texture_filename(i), 200) # Filename
+ self.fw.write_string(filename, 200) # Filename
self.fw.write_int(i) # Texture index
self.fw.write_int(0) # X
self.fw.write_int(0) # Y
@@ -641,13 +1170,17 @@ class Database(Node):
self.fw.write_short(32) # Color palette opcode.
self.fw.write_short(4228) # Length of record
self.fw.pad(128)
- count = self.GRR.color_count()
+ try:
+ cpalette = self.scene.properties['FLT']['Color Palette']
+ except:
+ cpalette = defaultp.pal
+ count = len(cpalette)
for i in xrange(count):
- col = self.GRR.request_max_color(i)
- self.fw.write_uchar(255) # alpha
- self.fw.write_uchar(col[2]) # b
- self.fw.write_uchar(col[1]) # g
- self.fw.write_uchar(col[0]) # r
+ color = struct.unpack('>BBBB',struct.pack('>I',cpalette[i]))
+ self.fw.write_uchar(color[3]) # alpha
+ self.fw.write_uchar(color[2]) # b
+ self.fw.write_uchar(color[1]) # g
+ self.fw.write_uchar(color[0]) # r
self.fw.pad(max(4096-count*4, 0))
def write(self):
@@ -657,66 +1190,428 @@ class Database(Node):
self.write_mat_pal()
self.write_col_pal()
- # Wrap everything in a group if it has an object child.
- if self.has_object_child:
- self.header.fw.write_short(2) # Group opcode
- self.header.fw.write_ushort(44) # Length of record
- self.header.fw.write_string('g1', 8) # ASCII ID
- self.header.fw.pad(32)
-
self.write_push()
-
- for child in self.children:
- child.write()
-
+
+ if options.flattenmesh:
+ self.mnodes.reverse()
+ for mnode in self.mnodes:
+ mnode.write_faces()
+ else:
+ for child in self.children:
+ child.write()
self.write_pop()
+
+ def export_textures(self,texturepath):
+ for i in xrange(self.GRR.texture_count()):
+ texture = self.GRR.texture_lst[i]
+
+ if options.copy_textures:
+ filename = os.path.normpath(os.path.join(options.texturespath, os.path.basename(self.GRR.request_texture_filename(i))))
+ else:
+ filename = os.path.normpath(self.GRR.request_texture_filename(i))
+
+ tex_files[texture.name] = filename
+ def blender_export(self):
+ Node.blender_export(self)
+ self.export_textures(self)
+ return self.xrefnames
def __init__(self, scene, fw):
self.fw = fw
+ self.opcode = 1
+ self.childtypes = [73,14,2,63]
self.scene = scene
- self.all_objects = list(scene.objects)
- self.GRR = GlobalResourceRepository()
+ self.childhash = dict()
+ self.parenthash = dict()
+ self.child_objects = list()
+ self.mnodes = list()
+ self.xrefnames = list()
+ for i in self.scene.objects:
+ self.parenthash[i.name] = list()
+ self.childhash[i.name] = False
+ for i in self.scene.objects:
+ if i.parent:
+ self.childhash[i.parent.name] = True
+ self.parenthash[i.parent.name].append(i)
+ else:
+ self.child_objects.append(i)
- Node.__init__(self, None, self, None, self.all_objects)
+ self.GRR = GlobalResourceRepository()
+ Node.__init__(self, None, self, None,None)
-def fs_callback(filename):
- Blender.Window.WaitCursor(True)
-
- if Blender.sys.exists(filename):
- r = Blender.Draw.PupMenu('Overwrite ' + filename + '?%t|Yes|No')
- if r != 1:
- if options.verbose >= 1:
- print 'Export cancelled.'
- return
-
- time1 = Blender.sys.time() # Start timing
+def write_attribute_files():
+ for imgname in tex_files:
+ blentex = Blender.Image.Get(imgname)
+ exportdict = FLT_Records['Image'].copy()
+
+ if blentex.properties.has_key('FLT'):
+ for key in exportdict.keys():
+ if blentex.properties.has_key(key):
+ exportdict[key] = blentex.properties['FLT'][key]
+
+ # ClampX/Y override
+ if blentex.clampX:
+ exportdict['11i!WrapU'] = 1
+ if blentex.clampY:
+ exportdict['12i!WrapV'] = 1
+
+ exportdict['16i!Enviorment'] = 0
+
+ # File type
+ typecode = 0
+ try:
+ typestring = os.path.splitext(blentex.getFilename())[1]
+
+ if typestring == '.rgba':
+ typecode = 5
+ elif typestring == '.rgb':
+ typecode = 4
+ elif typestring == '.inta':
+ typecode = 3
+ elif typestring == '.int':
+ typecode = 2
+ except:
+ pass
+
+ exportdict['7i!File Format'] = typecode
+
+ fw = FltOut(tex_files[imgname] + '.attr')
+ size = blentex.getSize()
+ fw.write_int(size[0])
+ fw.write_int(size[1])
+ for key in records['Image']:
+ (type,length,propname) = records['Image'][key]
+ write_prop(fw,type,exportdict[propname],length)
+ fw.close_file()
+
+#globals used by the scene export function
+exportlevel = None
+xrefsdone = None
+
+def dbexport_internal(scene):
+ global exportlevel
+ global xrefsdone
+ global options
+
+ if exportlevel == 0 or not options.externalspath:
+ fname = os.path.join(options.basepath,scene.name + '.flt')
+ else:
+ fname = os.path.join(options.externalspath,scene.name + '.flt')
- fw = FltOut(filename)
-
- db = Database(Blender.Scene.GetCurrent(), fw)
+ fw = FltOut(fname)
+ db = Database(scene,fw)
if options.verbose >= 1:
- print 'Pass 1: Exporting from Blender.\n'
-
- db.blender_export()
+ print 'Pass 1: Exporting ', scene.name,'.flt from Blender.\n'
+ xreflist = db.blender_export()
if options.verbose >= 1:
- print 'Pass 2: Writing %s\n' % filename
-
+ print 'Pass 2: Writing %s\n' % fname
db.write()
-
fw.close_file()
+
+ if options.doxrefs:
+ for xname in xreflist:
+ try:
+ xrefscene = Blender.Scene.Get(xname)
+ except:
+ xrefscene = None
+ if xrefscene and xname not in xrefsdone:
+ xrefsdone.append(xname)
+ exportlevel+=1
+ dbexport_internal(xrefscene)
+ exportlevel-=1
+ return fname
+#main database export function
+def dbexport():
+ global exportlevel
+ global xrefsdone
+ exportlevel = 0
+ xrefsdone = list()
+
+ Blender.Window.WaitCursor(True)
+ time1 = Blender.sys.time() # Start timing
+
if options.verbose >= 1:
+ print '\nOpenFlight Exporter'
+ print 'Version:', __version__
+ print 'Author: Greg MacDonald, Geoffrey Bantle'
+ print __url__[2]
+ print
+
+ fname = dbexport_internal(Blender.Scene.GetCurrent())
+ if options.verbose >=1:
print 'Done in %.4f sec.\n' % (Blender.sys.time() - time1)
-
Blender.Window.WaitCursor(False)
+
+ #optional: Copy textures
+ if options.copy_textures:
+ for imgname in tex_files:
+ #Check to see if texture exists in target directory
+ if not os.path.exists(tex_files[imgname]):
+ #Get original Blender file name
+ origpath = Blender.sys.expandpath(Blender.Image.Get(imgname).getFilename())
+ #copy original to new
+ shutil.copyfile(origpath,tex_files[imgname])
+
+ #optional: Write attribute files
+ if options.write_attrib_files:
+ write_attribute_files()
+
+ if options.xapp:
+ cmd= options.xappath + " " + fname
+ status = os.system(cmd)
+
+
+#Begin UI code
+FLTExport = None
+FLTClose = None
+FLTLabel = None
+
+FLTBaseLabel = None
+FLTTextureLabel = None
+FLTXRefLabel = None
+
+FLTBaseString = None
+FLTTextureString = None
+FLTXRefString = None
+
+FLTBasePath = None
+FLTTexturePath = None
+FLTXRefPath = None
+
+FLTShadeExport = None
+FLTShadeDefault = None
+
+FLTCopyTex = None
+FLTDoXRef = None
+FLTGlobal = None
+
+FLTScale = None
+
+FLTXAPP = None
+FLTXAPPath = None
+FLTXAPPString = None
+FLTXAPPLabel = None
+FLTXAPPChooser = None
+
+FLTAttrib = None
+
+def setshadingangle(ID,val):
+ global options
+ options.shading_default = val
+def setBpath(fname):
+ global options
+ options.basepath = os.path.dirname(fname)
+ #update xref and textures path too....
+ if(os.path.exists(os.path.join(options.basepath,'externals'))):
+ options.externalspath = os.path.join(options.basepath,'externals')
+ if(os.path.exists(os.path.join(options.texturespath,'textures'))):
+ options.texturespath = os.path.join(options.basepath,'textures')
+def setexportscale(ID,val):
+ global options
+ options.scale = val
+
+def setTpath(fname):
+ global options
+ options.texturespath = os.path.dirname(fname)
+def setXpath(fname):
+ global options
+ options.externalspath = os.path.dirname(fname)
+def setXApath(fname):
+ global options
+ options.xappath = fname
+ d = dict()
+ d['xappath'] = options.xappath
+ Blender.Registry.SetKey('flt_export', d, 1)
+def event(evt, val):
+ x = 1
+def but_event(evt):
+ global options
+
+ global FLTExport
+ global FLTClose
+ global FLTLabel
+
+ global FLTBaseLabel
+ global FLTTextureLabel
+ global FLTXRefLabel
+
+ global FLTBaseString
+ global FLTTextureString
+ global FLTXRefString
+
+ global FLTBasePath
+ global FLTTexturePath
+ global FLTXRefPath
+
+ global FLTShadeExport
+ global FLTShadeDefault
+
+ global FLTCopyTex
+ global FLTDoXRef
+ global FLTGlobal
+
+ global FLTScale
+
+
+ global FLTXAPP
+ global FLTXAPPath
+ global FLTXAPPString
+ global FLTXAPPLabel
+ global FLTXAPPChooser
+
+ global FLTAttrib
+
+
+
+ #choose base path for export
+ if evt == 4:
+ Blender.Window.FileSelector(setBpath, "DB Root", options.basepath)
+
+ #choose XREF path
+ if evt == 6:
+ Blender.Window.FileSelector(setXpath,"DB Externals",options.externalspath)
+
+ #choose texture path
+ if evt == 8:
+ Blender.Window.FileSelector(setTpath,"DB Textures",options.texturespath)
+
+ #export shading toggle
+ if evt == 9:
+ options.export_shading = FLTShadeExport.val
+ #export Textures
+ if evt == 11:
+ options.copy_textures = FLTCopyTex.val
+ #export XRefs
+ if evt == 13:
+ options.doxrefs = FLTDoXRef.val
+ #export Transforms
+ if evt == 12:
+ options.export_transform = FLTGlobal.val
+
+ if evt == 14:
+ options.xapp = FLTXAPP.val
+ if evt == 16:
+ Blender.Window.FileSelector(setXApath,"External Application",options.xappath)
+ if evt == 20:
+ options.write_attrib_files = FLTAttrib.val
+
+ #Export DB
+ if evt == 1:
+ dbexport()
+
+ #exit
+ if evt == 2:
+ Draw.Exit()
+
+from Blender.BGL import *
+from Blender import Draw
+def gui():
+
+ global options
+
+ global FLTExport
+ global FLTClose
+ global FLTLabel
+
+ global FLTBaseLabel
+ global FLTTextureLabel
+ global FLTXRefLabel
+
+ global FLTBaseString
+ global FLTTextureString
+ global FLTXRefString
+
+ global FLTBasePath
+ global FLTTexturePath
+ global FLTXRefPath
+
+ global FLTShadeExport
+ global FLTShadeDefault
+
+ global FLTCopyTex
+ global FLTDoXRef
+ global FLTGlobal
+
+ global FLTScale
+
+ global FLTXAPP
+ global FLTXAPPath
+ global FLTXAPPString
+ global FLTXAPPLabel
+ global FLTXAPPChooser
+
+ global FLTAttrib
+
+ glClearColor(0.880,0.890,0.730,1.0 )
+ glClear(GL_COLOR_BUFFER_BIT)
+
+ areas = Blender.Window.GetScreenInfo()
+ curarea = Blender.Window.GetAreaID()
+ curRect = None
+
+ for area in areas:
+ if area['id'] == curarea:
+ curRect = area['vertices']
+ break
+
+ width = curRect[2] - curRect[0]
+ height = curRect[3] - curRect[1]
+ #draw from top to bottom....
+ cx = 50
+ #Draw Title Bar...
+ #glRasterPos2d(cx, curRect[3]-100)
+ #FLTLabel = Draw.Text("FLT Exporter V2.0",'large')
+ cy = height - 80
+
+ #base path
+ FLTBaseLabel = Draw.Label("Base Path:",cx,cy,100,20)
+ FLTBaseString = Draw.String("",3,cx+100,cy,300,20,options.basepath,255,"Folder to export to")
+ FLTBaseChooser = Draw.PushButton("...",4,cx+400,cy,20,20,"Choose Folder")
+
+ cy = cy-40
+
+ #externals path
+ FLTXRefLabel = Draw.Label("XRefs:",cx,cy,100,20)
+ FLTXRefString = Draw.String("",5,cx+100,cy,300,20,options.externalspath,255,"Folder for external references")
+ FLTXRefChooser = Draw.PushButton("...",6,cx+400,cy,20,20,"Choose Folder")
+ cy = cy-40
+ #Textures path
+ FLTTextureLabel = Draw.Label("Textures:",cx,cy,100,20)
+ FLTTextureString = Draw.String("",7,cx+100,cy,300,20,options.texturespath,255,"Folder for texture files")
+ FLTTextureChooser = Draw.PushButton("...",8,cx+400,cy,20,20,"Choose Folder")
+ cy=cy-40
+ #External application path
+ FLTXAPPLabel = Draw.Label("XApp:",cx,cy,100,20)
+ FLTXAPPString = Draw.String("",15,cx+100,cy,300,20,options.xappath,255,"External application to launch when done")
+ FLTXAPPChooser = Draw.PushButton("...",16,cx+400, cy,20,20,"Choose Folder")
+
+ cy = cy-60
+ #Shading Options
+ FLTShadeExport = Draw.Toggle("Default Shading",9,cx,cy,100,20,options.export_shading,"Turn on export of custom shading")
+ FLTShadDefault = Draw.Number("",10,cx + 120,cy,100,20,options.shading_default,0.0,180.0,"Default shading angle for objects with no custom shading assigned",setshadingangle)
+
+ cy = cy-40
+ FLTScale = Draw.Number("Export Scale",14,cx,cy,220,20,options.scale,0.0,100.0,"Export scaling factor",setexportscale)
+
+ cy = cy-40
+ #misc Options
+ FLTCopyTex = Draw.Toggle("Copy Textures",11,cx,cy,220,20,options.copy_textures,"Copy textures to folder indicated above")
+ cy = cy-40
+ FLTGlobal = Draw.Toggle("Export Transforms",12,cx,cy,220,20,options.export_transform,"If unchecked, Global coordinates are used (recommended)")
+ cy = cy-40
+ FLTDoXRef = Draw.Toggle("Export XRefs", 13,cx,cy,220,20,options.doxrefs,"Export External references (only those below current scene!)")
+ cy = cy-40
+ FLTXAPP = Draw.Toggle("Launch External App", 14, cx,cy,220,20,options.xapp,"Launch External Application on export")
+ cy = cy-40
+ FLTAttrib = Draw.Toggle("Write Attribute Files", 20, cx, cy, 220,20,options.write_attrib_files, "Write Texture Attribute files")
+ #FLTXAPPATH = Draw.String("",15,cx,cy,300,20,options.xappath,255,"External application path")
+
-if options.verbose >= 1:
- print '\nOpenFlight Exporter'
- print 'Version:', __version__
- print 'Author: Greg MacDonald'
- print __url__[2]
- print
+ #Draw export/close buttons
+ FLTExport = Draw.PushButton("Export",1,cx,20,100,20,"Export to FLT")
+ FLTClose = Draw.PushButton("Close", 2, cx+120,20,100,20,"Close window")
-fname = Blender.sys.makename(ext=".flt")
-Blender.Window.FileSelector(fs_callback, "Export OpenFlight v16.0", fname)
+
+Draw.Register(gui,event,but_event) \ No newline at end of file
diff --git a/release/scripts/flt_filewalker.py b/release/scripts/flt_filewalker.py
index 442c9728e91..4a9b86c45d2 100644
--- a/release/scripts/flt_filewalker.py
+++ b/release/scripts/flt_filewalker.py
@@ -17,6 +17,11 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+__bpydoc__ ="""\
+File read/write module used by OpenFlight I/O and tool scripts. OpenFlight is a
+registered trademark of MultiGen-Paradigm, Inc.
+"""
+
import Blender
from struct import *
import re
@@ -199,7 +204,9 @@ class FltOut:
self.file.close()
def __init__(self, filename):
- self.file = open(filename, 'wb')
+ self.file = open(filename, 'wb')
+ self.filename = filename
+
class FileFinder:
def add_file_to_search_path(self, filename):
diff --git a/release/scripts/flt_import.py b/release/scripts/flt_import.py
index ca0db650447..220fc9f355c 100755..100644
--- a/release/scripts/flt_import.py
+++ b/release/scripts/flt_import.py
@@ -1,72 +1,26 @@
#!BPY
""" Registration info for Blender menus:
Name: 'OpenFlight (.flt)...'
-Blender: 238
+Blender: 245
Group: 'Import'
Tip: 'Import OpenFlight (.flt)'
"""
-__author__ = "Greg MacDonald, Campbell Barton"
-__version__ = "1.2 10/20/05"
+__author__ = "Greg MacDonald, Campbell Barton, Geoffrey Bantle"
+__version__ = "2.0 11/21/07"
__url__ = ("blender", "elysiun", "Author's homepage, http://sourceforge.net/projects/blight/")
__bpydoc__ = """\
This script imports OpenFlight files into Blender. OpenFlight is a
registered trademark of MultiGen-Paradigm, Inc.
-Run from "File->Import" menu.
-
-Options are available from Blender's "Scripts Config Editor," accessible through
-the "Scripts->System" menu from the scripts window.
-
-All global_prefs are toggle switches that let the user choose what is imported. Most
-are straight-forward, but one option could be a source of confusion. The
-"Diffuse Color From Face" option when set pulls the diffuse color from the face
-colors. Otherwise the diffuse color comes from the material. What may be
-confusing is that this global_prefs only works if the "Diffuse Color" option is set.
-
-New Features:<br>
-* Importer is 14 times faster.<br>
-* External triangle module is no longer required, but make sure the importer
-has a 3d View screen open while its running or triangulation won't work.<br>
-* Should be able to import all versions of flight files.
-
-Features:<br>
-* Heirarchy retained.<br>
-* First texture imported.<br>
-* Colors imported from face or material.<br>
-* LOD seperated out into different layers.<br>
-* Asks for location of unfound textures or external references.<br>
-* Searches Blender's texture directory in the user preferences panel.<br>
-* Triangles with more than 4 verts are triangulated if the Triangle python
-module is installed.<br>
-* Matrix transforms imported.<br>
-* External references to whole files are imported.
-
-Things To Be Aware Of:<br>
-* Each new color and face attribute creates a new material and there are only a maximum of 16
-materials per object.<br>
-* For triangulated faces, normals must be recomputed outward manually by typing
-CTRL+N in edit mode.<br>
-* You can change global_prefs only after an initial import.<br>
-* External references are imported as geometry and will be exported that way.<br>
-* A work around for not using the Triangle python module is to simply to
-triangulate in Creator before importing. This is only necessary if your
-model contains 5 or more vertices.<br>
-* You have to manually blend the material color with the texture color.
-
-What's Not Handled:<br>
-* Special texture repeating modes.<br>
-* Replications and instancing.<br>
-* Comment and attribute fields.<br>
-* Light points.<br>
-* Animations.<br>
-* External references to a node within a file.<br>
-* Multitexturing.<br>
-* Vetex colors.<br>
+Feature overview and more availible at:
+http://wiki.blender.org/index.php/Scripts/Manual/Import/openflight_flt
+
+Note: This file is a grab-bag of old and new code. It needs some cleanup still.
"""
# flt_import.py is an OpenFlight importer for blender.
-# Copyright (C) 2005 Greg MacDonald
+# Copyright (C) 2005 Greg MacDonald, 2007 Blender Foundation
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -87,15 +41,33 @@ import os
import BPyMesh
import BPyImage
import flt_filewalker
+import flt_properties
+reload(flt_properties)
+from flt_properties import *
-Vector= Blender.Mathutils.Vector
+#Globals. Should Clean these up and minimize their usage.
-def col_to_gray(c):
- return 0.3*c[0] + 0.59*c[1] + 0.11*c[2]
+typecodes = ['c','C','s','S','i','I','f','d','t']
+records = dict()
+
+FLTBaseLabel = None
+FLTBaseString = None
+FLTBaseChooser = None
+FLTExport = None
+FLTClose = None
+FLTDoXRef = None
+FLTScale = None
+FLTShadeImport = None
+FLTAttrib = None
+
+Vector= Blender.Mathutils.Vector
+FLOAT_TOLERANCE = 0.01
+FF = flt_filewalker.FileFinder()
+current_layer = 0x01
global_prefs = dict()
-global_prefs['verbose']= 1
+global_prefs['verbose']= 4
global_prefs['get_texture'] = True
global_prefs['get_diffuse'] = True
global_prefs['get_specular'] = False
@@ -105,8 +77,41 @@ global_prefs['get_ambient'] = False
global_prefs['get_shininess'] = True
global_prefs['color_from_face'] = True
global_prefs['fltfile']= ''
+global_prefs['smoothshading'] = 1
+global_prefs['doxrefs'] = 1
+global_prefs['scale'] = 1.0
+global_prefs['attrib'] = 0
msg_once = False
+throw_back_opcodes = [2, 73, 4, 11, 96, 14, 91, 98, 63,111] # Opcodes that indicate its time to return control to parent.
+do_not_report_opcodes = [76, 78, 79, 80, 81, 82, 94, 83, 33, 112, 100, 101, 102, 97, 31, 103, 104, 117, 118, 120, 121, 124, 125]
+
+#Process FLT record definitions
+for record in FLT_Records:
+ props = dict()
+ for prop in FLT_Records[record]:
+ position = ''
+ slice = 0
+ (format,name) = prop.split('!')
+ for i in format:
+ if i not in typecodes:
+ position = position + i
+ slice = slice + 1
+ else:
+ break
+ type = format[slice:]
+ length = type[1:]
+ if len(length) == 0:
+ length = 1
+ else:
+ type = type[0]
+ length = int(length)
+
+ props[int(position)] = (type,length,prop)
+ records[record] = props
+
+def col_to_gray(c):
+ return 0.3*c[0] + 0.59*c[1] + 0.11*c[2]
class MaterialDesc:
# Was going to use int(f*1000.0) instead of round(f,3), but for some reason
# round produces better results, as in less dups.
@@ -185,16 +190,14 @@ class VertexDesc:
self.y = 0.0
self.z = 0.0
- ''' # IGNORE_NORMALS
+
self.nx = 0.0
- self.ny = 1.0
+ self.ny = 0.0
self.nz = 0.0
- '''
+
self.uv= Vector(0,0)
- self.r = 1.0
- self.g = 1.0
- self.b = 1.0
- self.a = 1.0
+ self.cindex = 127 #default/lowest
+ self.cnorm = False
class LightPointAppDesc:
def make_key(self):
@@ -222,7 +225,7 @@ class LightPointAppDesc:
self.props.update({'LOD scale': 0.0})
class GlobalResourceRepository:
- def request_lightpoint_app(self, desc):
+ def request_lightpoint_app(self, desc, scene):
match = self.light_point_app.get(desc.make_key())
if match:
@@ -231,7 +234,7 @@ class GlobalResourceRepository:
# Create empty and fill with properties.
name = desc.props['type'] + ': ' + desc.props['id']
object = Blender.Object.New('Empty', name)
- scene.link(object)
+ scene.objects.link(object)
object.Layers= current_layer
object.sel= 1
@@ -306,6 +309,9 @@ class GlobalResourceRepository:
return tex
def __init__(self):
+
+ #list of scenes xrefs belong to.
+ self.xrefs = dict()
# material
self.mat_dict = dict()
mat_lst = Blender.Material.Get()
@@ -341,108 +347,6 @@ class GlobalResourceRepository:
# light point
self.light_point_app = dict()
-# Globals
-GRR = GlobalResourceRepository()
-FF = flt_filewalker.FileFinder()
-scene = Blender.Scene.GetCurrent() # just hope they dont chenge scenes once the file selector pops up.
-current_layer = 0x01
-
-
-# Opcodes that indicate its time to return control to parent.
-throw_back_opcodes = [2, 73, 4, 11, 96, 14, 91, 98, 63]
-do_not_report_opcodes = [76, 78, 79, 80, 81, 82, 94, 83, 33, 112, 100, 101, 102, 97, 31, 103, 104, 117, 118, 120, 121, 124, 125]
-
-opcode_name = { 0: 'db',
- 1: 'head',
- 2: 'grp',
- 4: 'obj',
- 5: 'face',
- 10: 'push',
- 11: 'pop',
- 14: 'dof',
- 19: 'push sub',
- 20: 'pop sub',
- 21: 'push ext',
- 22: 'pop ext',
- 23: 'cont',
- 31: 'comment',
- 32: 'color pal',
- 33: 'long id',
- 49: 'matrix',
- 50: 'vector',
- 52: 'multi-tex',
- 53: 'uv lst',
- 55: 'bsp',
- 60: 'rep',
- 61: 'inst ref',
- 62: 'inst def',
- 63: 'ext ref',
- 64: 'tex pal',
- 67: 'vert pal',
- 68: 'vert w col',
- 69: 'vert w col & norm',
- 70: 'vert w col, norm & uv',
- 71: 'vert w col & uv',
- 72: 'vert lst',
- 73: 'lod',
- 74: 'bndin box',
- 76: 'rot edge',
- 78: 'trans',
- 79: 'scl',
- 80: 'rot pnt',
- 81: 'rot and/or scale pnt',
- 82: 'put',
- 83: 'eyepoint & trackplane pal',
- 84: 'mesh',
- 85: 'local vert pool',
- 86: 'mesh prim',
- 87: 'road seg',
- 88: 'road zone',
- 89: 'morph vert lst',
- 90: 'link pal',
- 91: 'snd',
- 92: 'rd path',
- 93: 'snd pal',
- 94: 'gen matrix',
- 95: 'txt',
- 96: 'sw',
- 97: 'line styl pal',
- 98: 'clip reg',
- 100: 'ext',
- 101: 'light src',
- 102: 'light src pal',
- 103: 'reserved',
- 104: 'reserved',
- 105: 'bndin sph',
- 106: 'bndin cyl',
- 107: 'bndin hull',
- 108: 'bndin vol cntr',
- 109: 'bndin vol orient',
- 110: 'rsrvd',
- 111: 'light pnt',
- 112: 'tex map pal',
- 113: 'mat pal',
- 114: 'name tab',
- 115: 'cat',
- 116: 'cat dat',
- 117: 'rsrvd',
- 118: 'rsrvd',
- 119: 'bounding hist',
- 120: 'rsrvd',
- 121: 'rsrvd',
- 122: 'push attrib',
- 123: 'pop attrib',
- 124: 'rsrvd',
- 125: 'rsrvd',
- 126: 'curv',
- 127: 'road const',
- 128: 'light pnt appear pal',
- 129: 'light pnt anim pal',
- 130: 'indexed lp',
- 131: 'lp sys',
- 132: 'indx str',
- 133: 'shdr pal'}
-
class Handler:
def in_throw_back_lst(self, opcode):
return opcode in self.throw_back_lst
@@ -487,11 +391,11 @@ class Node:
print '-', self.props['comment'],
print
-
+
for child in self.children:
child.blender_import()
-
- # Import comment.
+
+# Import comment.
# if self.props['comment'] != '':
# name = 'COMMENT: ' + self.props['id']
# t = Blender.Text.New(name)
@@ -568,8 +472,8 @@ class Node:
else:
if global_prefs['verbose'] >= 3:
print p + ' ignored'
- elif global_prefs['verbose'] >= 1 and not opcode in do_not_report_opcodes and opcode in opcode_name:
- print opcode_name[opcode], 'not handled'
+ elif global_prefs['verbose'] >= 1 and not opcode in do_not_report_opcodes and opcode in opcode_name:
+ print 'not handled'
def get_level(self):
return self.level
@@ -581,7 +485,19 @@ class Node:
def parse_comment(self):
self.props['comment'] = self.header.fw.read_string(self.header.fw.get_length()-4)
return True
-
+
+ def parse_record(self):
+ self.props['type'] = self.opcode
+ props = records[self.opcode]
+ propkeys = props.keys()
+ propkeys.sort()
+ for position in propkeys:
+ (type,length,name) = props[position]
+ self.props[name] = read_prop(self.header.fw,type,length)
+ try: #remove me!
+ self.props['id'] = self.props['3t8!id']
+ except:
+ pass
def __init__(self, parent, header):
self.root_handler = Handler()
self.child_handler = Handler()
@@ -647,20 +563,16 @@ class VertexPalette(Node):
return v
def parse_vertex_post_common(self, v):
- if not v.flags & 0x2000: # 0x2000 = no color
- if v.flags & 0x1000: # 0x1000 = packed color
- v.a = self.header.fw.read_uchar()
- v.b = self.header.fw.read_uchar()
- v.g = self.header.fw.read_uchar()
- v.r = self.header.fw.read_uchar()
- else:
- self.header.fw.read_ahead(4)
-
- color_index = self.header.fw.read_uint()
- v.r, v.g, v.b, v.a= self.header.get_color(color_index)
-
+ #if not v.flags & 0x2000: # 0x2000 = no color
+ #if v.flags & 0x1000: # 0x1000 = packed color
+ # v.a = self.header.fw.read_uchar()
+ # v.b = self.header.fw.read_uchar()
+ # v.g = self.header.fw.read_uchar()
+ # v.r = self.header.fw.read_uchar()
+ #else:
+ self.header.fw.read_ahead(4) #skip packed color
+ v.cindex = self.header.fw.read_uint()
self.vert_desc_lst.append(v)
-
return True
def parse_vertex_c(self):
@@ -672,16 +584,10 @@ class VertexPalette(Node):
def parse_vertex_cn(self):
v = self.parse_vertex_common()
-
- '''
+ v.cnorm = True
v.nx = self.header.fw.read_float()
v.ny = self.header.fw.read_float()
v.nz = self.header.fw.read_float()
- '''
- # Just to advance
- self.header.fw.read_float()
- self.header.fw.read_float()
- self.header.fw.read_float()
self.parse_vertex_post_common(v)
@@ -698,15 +604,10 @@ class VertexPalette(Node):
def parse_vertex_cnuv(self):
v = self.parse_vertex_common()
- '''
+ v.cnorm = True
v.nx = self.header.fw.read_float()
v.ny = self.header.fw.read_float()
v.nz = self.header.fw.read_float()
- '''
- # Just to advance
- self.header.fw.read_float()
- self.header.fw.read_float()
- self.header.fw.read_float()
v.uv[:] = self.header.fw.read_float(), self.header.fw.read_float()
@@ -721,89 +622,370 @@ class InterNode(Node):
def __init__(self):
self.object = None
self.mesh = None
- self.isMesh = False
+ self.hasMesh = False
self.faceLs= []
self.matrix = None
-
- def blender_import_my_faces(self):
+ self.vis = True
+ self.hasmtex = False
+ self.uvlayers = dict()
+ self.blayernames = dict()
+ self.subfacelevel = 0
+
+ mask = 2147483648
+ for i in xrange(7):
+ self.uvlayers[mask] = False
+ mask = mask / 2
+
+ def blender_import_my_faces(self):
+
# Add the verts onto the mesh
- mesh = self.mesh
blender_verts= self.header.vert_pal.blender_verts
vert_desc_lst= self.header.vert_pal.vert_desc_lst
- vert_list= [ i for flt_face in self.faceLs for i in flt_face.indices]
-
- mesh.verts.extend([blender_verts[i] for i in vert_list])
-
+ vert_list= [ i for flt_face in self.faceLs for i in flt_face.indices] #splitting faces apart. Is this a good thing?
+ face_edges= []
+ face_verts= []
+ self.mesh.verts.extend([blender_verts[i] for i in vert_list])
new_faces= []
new_faces_props= []
ngon= BPyMesh.ngon
vert_index= 1
+
+ #add vertex color layer for baked face colors.
+ self.mesh.addColorLayer("FLT_Fcol")
+ self.mesh.activeColorLayer = "FLT_Fcol"
+
+ FLT_OrigIndex = 0
for flt_face in self.faceLs:
- material_index= flt_face.blen_mat_idx
- image= flt_face.blen_image
-
+ if flt_face.tex_index != -1:
+ try:
+ image= self.header.tex_pal[flt_face.tex_index][1]
+ except KeyError:
+ image= None
+ else:
+ image= None
face_len= len(flt_face.indices)
+ #create dummy uvert dicts
+ if len(flt_face.uverts) == 0:
+ for i in xrange(face_len):
+ flt_face.uverts.append(dict())
+ #May need to patch up MTex info
+ if self.hasmtex:
+ #For every layer in mesh, there should be corresponding layer in the face
+ for mask in self.uvlayers.keys():
+ if self.uvlayers[mask]:
+ if not flt_face.uvlayers.has_key(mask): #Does the face have this layer?
+ #Create Layer info for this face
+ flt_face.uvlayers[mask] = dict()
+ flt_face.uvlayers[mask]['texture index'] = -1
+ flt_face.uvlayers[mask]['texture enviorment'] = 3
+ flt_face.uvlayers[mask]['texture mapping'] = 0
+ flt_face.uvlayers[mask]['texture data'] = 0
+
+ #now go through and create dummy uvs for this layer
+ for uvert in flt_face.uverts:
+ uv = Vector(0.0,0.0)
+ uvert[mask] = uv
+
# Get the indicies in reference to the mesh.
-
uvs= [vert_desc_lst[j].uv for j in flt_face.indices]
- if face_len <=4: # tri or quad
+ if face_len == 1:
+ pass
+ elif face_len == 2:
+ face_edges.append((vert_index, vert_index+1))
+ elif flt_face.props['draw type'] == 2 or flt_face.props['draw type'] == 3:
+ i = 0
+ while i < (face_len-1):
+ face_edges.append((vert_index + i, vert_index + i + 1))
+ i = i + 1
+ if flt_face.props['draw type'] == 2:
+ face_edges.append((vert_index + i,vert_index))
+ elif face_len == 3 or face_len == 4: # tri or quad
+ #if face_len == 1:
+ # pass
+ #if face_len == 2:
+ # face_edges.append((vert_index, vert_index+1))
new_faces.append( [i+vert_index for i in xrange(face_len)] )
- new_faces_props.append((material_index, image, uvs))
+ new_faces_props.append((None, image, uvs, flt_face.uverts, flt_face.uvlayers, flt_face.color_index, flt_face.props,FLT_OrigIndex,0, flt_face.subfacelevel))
else: # fgon
mesh_face_indicies = [i+vert_index for i in xrange(face_len)]
- tri_ngons= ngon(mesh, mesh_face_indicies)
+ tri_ngons= ngon(self.mesh, mesh_face_indicies)
new_faces.extend([ [mesh_face_indicies[t] for t in tri] for tri in tri_ngons])
- new_faces_props.extend( [ (material_index, image, (uvs[tri[0]], uvs[tri[1]], uvs[tri[2]]) ) for tri in tri_ngons ] )
+ new_faces_props.extend( [ (None, image, (uvs[tri[0]], uvs[tri[1]], uvs[tri[2]]), [flt_face.uverts[tri[0]], flt_face.uverts[tri[1]], flt_face.uverts[tri[2]]], flt_face.uvlayers, flt_face.color_index, flt_face.props,FLT_OrigIndex,1, flt_face.subfacelevel) for tri in tri_ngons ])
vert_index+= face_len
-
- mesh.faces.extend(new_faces)
-
- try: mesh.faceUV= True
- except: pass
-
- for i, f in enumerate(mesh.faces):
- f.mat, f.image, f.uv= new_faces_props[i]
-
+ FLT_OrigIndex+=1
+
+ self.mesh.faces.extend(new_faces)
+ self.mesh.edges.extend(face_edges)
+
+ #add in the FLT_ORIGINDEX layer
+ if len(self.mesh.faces):
+ try: self.mesh.faceUV= True
+ except: pass
+
+ if self.mesh.faceUV == True:
+ self.mesh.renameUVLayer(self.mesh.activeUVLayer, 'Layer0')
+
+ #create name layer for faces
+ self.mesh.faces.addPropertyLayer("FLT_ID",Blender.Mesh.PropertyTypes["STRING"])
+ #create layer for face color indices
+ self.mesh.faces.addPropertyLayer("FLT_COL",Blender.Mesh.PropertyTypes["INT"])
+ #create index layer for faces. This is needed by both FGONs and subfaces
+ self.mesh.faces.addPropertyLayer("FLT_ORIGINDEX",Blender.Mesh.PropertyTypes["INT"])
+ #create temporary FGON flag layer. Delete after remove doubles
+ self.mesh.faces.addPropertyLayer("FLT_FGON",Blender.Mesh.PropertyTypes["INT"])
+ self.mesh.faces.addPropertyLayer("FLT_SFLEVEL", Blender.Mesh.PropertyTypes["INT"])
+
+ for i, f in enumerate(self.mesh.faces):
+ f.transp |= Blender.Mesh.FaceTranspModes["ALPHA"] #fix this!
+ f.mode |= Blender.Mesh.FaceModes["LIGHT"]
+ props = new_faces_props[i]
+ #f.mat = props[0]
+ f.image = props[1]
+ f.uv = props[2]
+ #set vertex colors
+ color = self.header.get_color(props[5])
+ if not color:
+ color = [255,255,255,255]
+ for mcol in f.col:
+ mcol.a = color[3]
+ mcol.r = color[0]
+ mcol.g = color[1]
+ mcol.b = color[2]
+
+ f.setProperty("FLT_SFLEVEL", props[9])
+ f.setProperty("FLT_ORIGINDEX",i)
+ f.setProperty("FLT_ID",props[6]['id'])
+ #if props[5] > 13199:
+ # print "Warning, invalid color index read in! Using default!"
+ # f.setProperty("FLT_COL",127)
+ #else:
+ if(1): #uh oh....
+ value = struct.unpack('>i',struct.pack('>I',props[5]))[0]
+ f.setProperty("FLT_COL",value)
+
+ #if props[8]:
+ # f.setProperty("FLT_FGON",1)
+ #else:
+ # f.setProperty("FLT_FGON",0)
+
+
+ #Create multitex layers, if present.
+ actuvlayer = self.mesh.activeUVLayer
+ if(self.hasmtex):
+ #For every multi-tex layer, we have to add a new UV layer to the mesh
+ for i,mask in enumerate(reversed(sorted(self.uvlayers))):
+ if self.uvlayers[mask]:
+ self.blayernames[mask] = "Layer" + str(i+1)
+ self.mesh.addUVLayer(self.blayernames[mask])
+
+ #Cycle through availible multi-tex layers and add face UVS
+ for mask in self.uvlayers:
+ if self.uvlayers[mask]:
+ self.mesh.activeUVLayer = self.blayernames[mask]
+ for j, f in enumerate(self.mesh.faces):
+ f.transp |= Blender.Mesh.FaceTranspModes["ALPHA"]
+ f.mode |= Blender.Mesh.FaceModes["LIGHT"]
+ props = new_faces_props[j]
+ uvlayers = props[4]
+ if uvlayers.has_key(mask): #redundant
+ uverts = props[3]
+ for k, uv in enumerate(f.uv):
+ uv[0] = uverts[k][mask][0]
+ uv[1] = uverts[k][mask][1]
+
+ uvlayer = uvlayers[mask]
+ tex_index = uvlayer['texture index']
+ if tex_index != -1:
+ try:
+ f.image = self.header.tex_pal[tex_index][1]
+ except KeyError:
+ f.image = None
+
+ if global_prefs['smoothshading'] == True and len(self.mesh.faces):
+ #We need to store per-face vertex normals in the faces as UV layers and delete them later.
+ self.mesh.addUVLayer("FLTNorm1")
+ self.mesh.addUVLayer("FLTNorm2")
+ self.mesh.activeUVLayer = "FLTNorm1"
+ for f in self.mesh.faces:
+ f.smooth = 1
+ #grab the X and Y components of normal and store them in UV
+ for i, uv in enumerate(f.uv):
+ vert = f.v[i].index
+ vert_desc = vert_desc_lst[vert_list[vert-1]]
+ if vert_desc.cnorm:
+ uv[0] = vert_desc.nx
+ uv[1] = vert_desc.ny
+ else:
+ uv[0] = 0.0
+ uv[1] = 0.0
+
+ #Now go through and populate the second UV Layer with the z component
+ self.mesh.activeUVLayer = "FLTNorm2"
+ for f in self.mesh.faces:
+ for i, uv in enumerate(f.uv):
+ vert = f.v[i].index
+ vert_desc = vert_desc_lst[vert_list[vert-1]]
+ if vert_desc.cnorm:
+ uv[0] = vert_desc.nz
+ uv[1] = 0.0
+ else:
+ uv[0] = 0.0
+ uv[1] = 0.0
+
+
+
+ #Finally, go through, remove dummy vertex, remove doubles and add edgesplit modifier.
+ Blender.Mesh.Mode(Blender.Mesh.SelectModes['VERTEX'])
+ self.mesh.verts.delete(0) # remove the dummy vert
+ self.mesh.sel= 1
+ self.header.scene.update(1) #slow!
+ self.mesh.remDoubles(0.0001)
+
+ edgeHash = dict()
+
+ for edge in self.mesh.edges:
+ edgeHash[edge.key] = edge.index
+
+
+ if global_prefs['smoothshading'] == True and len(self.mesh.faces):
+
+ #rip out the custom vertex normals from the mesh and place them in a face aligned list. Easier to compare this way.
+ facenorms = []
+ self.mesh.activeUVLayer = "FLTNorm1"
+ for face in self.mesh.faces:
+ facenorm = []
+ for uv in face.uv:
+ facenorm.append(Vector(uv[0],uv[1],0.0))
+ facenorms.append(facenorm)
+ self.mesh.activeUVLayer = "FLTNorm2"
+ for i, face in enumerate(self.mesh.faces):
+ facenorm = facenorms[i]
+ for j, uv in enumerate(face.uv):
+ facenorm[j][2] = uv[0]
+ self.mesh.removeUVLayer("FLTNorm1")
+ self.mesh.removeUVLayer("FLTNorm2")
+
+ #find hard edges
+ #store edge data for lookup by faces
+ #edgeHash = dict()
+ #for edge in self.mesh.edges:
+ # edgeHash[edge.key] = edge.index
+
+ edgeNormHash = dict()
+ #make sure to align the edgenormals to key value!
+ for i, face in enumerate(self.mesh.faces):
+
+ facenorm = facenorms[i]
+ faceEdges = []
+ faceEdges.append((face.v[0].index,face.v[1].index,facenorm[0],facenorm[1],face.edge_keys[0]))
+ faceEdges.append((face.v[1].index,face.v[2].index,facenorm[1],facenorm[2],face.edge_keys[1]))
+ if len(face.v) == 3:
+ faceEdges.append((face.v[2].index,face.v[0].index,facenorm[2],facenorm[0],face.edge_keys[2]))
+ elif len(face.v) == 4:
+ faceEdges.append((face.v[2].index,face.v[3].index,facenorm[2],facenorm[3],face.edge_keys[2]))
+ faceEdges.append((face.v[3].index,face.v[0].index,facenorm[3],facenorm[0],face.edge_keys[3]))
+
+ #check to see if edgeNormal has been placed in the edgeNormHash yet
+ #this is a redundant test, and should be optimized to not be called as often as it is.
+ for j, faceEdge in enumerate(faceEdges):
+ #the value we are looking for is (faceEdge[2],faceEdge[3])
+ hashvalue = (faceEdge[2],faceEdge[3])
+ if (faceEdge[0],faceEdge[1]) != faceEdge[4]:
+ hashvalue = (hashvalue[1],hashvalue[0])
+ assert (faceEdge[1],faceEdge[0]) == faceEdge[4]
+ if edgeNormHash.has_key(faceEdge[4]):
+ #compare value in the hash, if different, mark as sharp
+ edgeNorm = edgeNormHash[faceEdge[4]]
+ if\
+ abs(hashvalue[0][0] - edgeNorm[0][0]) > FLOAT_TOLERANCE or\
+ abs(hashvalue[0][1] - edgeNorm[0][1]) > FLOAT_TOLERANCE or\
+ abs(hashvalue[0][2] - edgeNorm[0][2]) > FLOAT_TOLERANCE or\
+ abs(hashvalue[1][0] - edgeNorm[1][0]) > FLOAT_TOLERANCE or\
+ abs(hashvalue[1][1] - edgeNorm[1][1]) > FLOAT_TOLERANCE or\
+ abs(hashvalue[1][2] - edgeNorm[1][2]) > FLOAT_TOLERANCE:
+ edge = self.mesh.edges[edgeHash[faceEdge[4]]]
+ edge.flag |= Blender.Mesh.EdgeFlags.SHARP
+
+ else:
+ edgeNormHash[faceEdge[4]] = hashvalue
+
+ #add in edgesplit modifier
+ mod = self.object.modifiers.append(Blender.Modifier.Types.EDGESPLIT)
+ mod[Blender.Modifier.Settings.EDGESPLIT_FROM_SHARP] = True
+ mod[Blender.Modifier.Settings.EDGESPLIT_FROM_ANGLE] = False
+
+ if(actuvlayer):
+ self.mesh.activeUVLayer = actuvlayer
+
def blender_import(self):
-# name = self.props['type'] + ': ' + self.props['id']
+ if self.vis and self.parent:
+ self.vis = self.parent.vis
name = self.props['id']
- if self.isMesh:
- self.object = Blender.Object.New('Mesh', name)
- #self.mesh = self.object.getData()
+
+ if self.hasMesh:
self.mesh = Blender.Mesh.New()
- self.mesh.verts.extend( Vector() ) # DUMMYVERT
- self.object.link(self.mesh)
+ self.mesh.name = 'FLT_FaceList'
+ self.mesh.fakeUser = True
+ self.mesh.verts.extend( Vector()) #DUMMYVERT
+ self.object = self.header.scene.objects.new(self.mesh)
else:
- self.object = Blender.Object.New('Empty', name)
+ self.object = self.header.scene.objects.new('Empty')
- if self.parent:
- self.parent.object.makeParent([self.object])
+ self.object.name = name
+ self.header.group.objects.link(self.object)
- scene.link(self.object)
- self.object.Layer = current_layer
- self.object.sel = 1
+ #id props import
+ self.object.properties['FLT'] = dict()
+ for key in self.props:
+ try:
+ self.object.properties['FLT'][key] = self.props[key]
+ except: #horrible...
+ pass
+ if self.parent and self.parent.object and (self.header.scene == self.parent.header.scene):
+ self.parent.object.makeParent([self.object])
+
+ if self.vis == False:
+ self.object.restrictDisplay = True
+ self.object.restrictRender = True
+
+ else: #check for LOD children and set the proper flags
+ lodlist = list()
+ for child in self.children:
+ if child.props.has_key('type') and child.props['type'] == 73:
+ lodlist.append(child)
+
+ def LODmin(a,b):
+ if a.props['5d!switch in'] < b.props['5d!switch in']:
+ return a
+ return b
+
+ min= None
+ if len(lodlist) > 1:
+ for lod in lodlist:
+ lod.vis = False
+ min = lodlist[0]
+ for i in xrange(len(lodlist)):
+ min= LODmin(min,lodlist[i])
+ min.vis = True
+
+ if self.matrix:
+ self.object.setMatrix(self.matrix)
+
Node.blender_import(self) # Attach faces to self.faceLs
- if self.isMesh:
+ if self.hasMesh:
# Add all my faces into the mesh at once
self.blender_import_my_faces()
-
- if self.matrix:
- self.object.setMatrix(self.matrix)
-
- # Attach properties
- #for name, value in self.props.items():
- # self.object.addProperty(name, value)
-
+
def parse_face(self):
- child = Face(self)
+ child = Face(self, self.subfacelevel)
child.parse()
return True
@@ -838,6 +1020,11 @@ class InterNode(Node):
child.parse()
return True
+ def parse_dof(self):
+ child = DOF(self)
+ child.parse()
+ return True
+
def parse_indexed_light_point(self):
child = IndexedLightPoint(self)
child.parse()
@@ -857,32 +1044,42 @@ class InterNode(Node):
m[i].append(f)
self.matrix = Blender.Mathutils.Matrix(m[0], m[1], m[2], m[3])
-EDGE_FGON= Blender.Mesh.EdgeFlags['FGON']
-FACE_TEX= Blender.Mesh.FaceModes['TEX']
+ def parse_subpush(self):
+ self.parse_push()
+ self.subfacelevel+= 1
+ return True
+ def parse_subpop(self):
+ self.parse_pop()
+ self.subfacelevel -= 1
+ return True
+
+
class Face(Node):
- def __init__(self, parent):
+ def __init__(self, parent,subfacelevel):
Node.__init__(self, parent, parent.header)
self.root_handler.set_handler({31: self.parse_comment,
- 10: self.parse_push})
+ 10: self.parse_push,
+ 52: self.parse_multitex})
self.root_handler.set_throw_back_lst(throw_back_opcodes)
self.child_handler.set_handler({72: self.parse_vertex_list,
10: self.parse_push,
- 11: self.parse_pop})
+ 11: self.parse_pop,
+ 53: self.parse_uvlist})
if parent:
- parent.isMesh = True
+ parent.hasMesh = True
- self.indices = list() # face verts here
+ self.subfacelevel = subfacelevel
+ self.indices = list() # face verts here
+ self.uvlayers = dict() # MultiTexture layers keyed to layer bitmask.
+ self.uverts = list() # Vertex aligned list of dictionaries keyed to layer bitmask.
+ self.uvmask = 0 # Bitfield read from MTex record
self.comment = ''
- self.props = dict.fromkeys(['ir color', 'priority',
- 'draw type', 'texture white', 'template billboard',
- 'smc', 'fid', 'ir material', 'lod generation control',
- 'flags', 'light mode'])
-
- self.header.fw.read_ahead(8) # face id
+ self.props = dict()
+ self.props['id'] = self.header.fw.read_string(8)
# Load face.
self.props['ir color'] = self.header.fw.read_int()
self.props['priority'] = self.header.fw.read_short()
@@ -919,186 +1116,14 @@ class Face(Node):
self.alt_color_index = self.header.fw.read_uint()
#self.header.fw.read_ahead(2)
#self.shader_index = self.header.fw.read_short()
-
-
- """
- def blender_import_face(self, material_index, image):
-
-
- mesh = self.parent.mesh
- face_len= len(self.indices)
-
- mesh_vert_len_orig= len(mesh.verts)
- mesh.verts.extend([ self.header.vert_pal.blender_verts[i] for i in self.indices])
-
- # Exception for an edge
- if face_len==2:
- mesh.edges.extend((mesh.verts[-1], mesh.verts[-2]))
- return
-
-
- mesh_face_indicies = range(mesh_vert_len_orig, mesh_vert_len_orig+face_len)
-
- #print mesh_face_indicies , 'mesh_face_indicies '
-
- # First we need to triangulate NGONS
- if face_len>4:
- tri_indicies = [[i+mesh_vert_len_orig for i in t] for t in BPyMesh.ngon(mesh, mesh_face_indicies) ] # use range because the verts are in order.
- else:
- tri_indicies= [mesh_face_indicies] # can be a quad but thats ok
-
- # Extend face or ngon
-
- mesh.faces.extend(tri_indicies)
- #print mesh.faces, 'mesh.faces'
- mesh.faceUV= True
-
- # Now set UVs
- for i in xrange(len(mesh.faces)-len(tri_indicies), len(mesh.faces)):
- f= mesh.faces[i]
- f_v= f.v
- for j, uv in enumerate(f.uv):
- vertex_index_flt= self.indices[f_v[j].index - mesh_vert_len_orig]
-
- vert_desc = self.header.vert_pal.vert_desc_lst[vertex_index_flt]
- uv.x, uv.y= vert_desc.u, vert_desc.v
-
- # Only a bug in 2.42, fixed in cvs
- for c in f.col:
- c.r=c.g=c.b= 255
-
- f.mat = material_index
- if image:
- f.image = image
- else:
- f.mode &= ~FACE_TEX
-
- # FGon
-
- if face_len>4:
- # Add edges we know are not fgon
- end_index= len(mesh.verts)
- start_index= end_index - len(self.indices)
- edge_dict= dict([ ((i, i+1), None) for i in xrange(start_index, end_index-1)])
- edge_dict[(start_index, end_index)]= None # wish this was a set
-
- fgon_edges= {}
- for tri in tri_indicies:
- for i in (0,1,2):
- i1= tri[i]
- i2= tri[i-1]
-
- # Sort
- if i1>i2:
- i1,i2= i2,i1
-
- if not edge_dict.has_key( (i1,i2) ): # if this works its an edge vert
- fgon_edges[i1,i2]= None
-
-
- # Now set fgon flags
- for ed in mesh.edges:
- i1= ed.v1.index
- i2= ed.v2.index
- if i1>i2:
- i1,i2= i2,i1
-
- if fgon_edges.has_key( (i1,i2) ):
- # This is an edge tagged for fgonning?
- fgon_edges[i1, i2]
- ed.flag |= EDGE_FGON
- del fgon_edges[i1, i2] # make later searches faster?
-
- if not fgon_edges:
- break
- """
-
+
def parse_comment(self):
self.comment = self.header.fw.read_string(self.header.fw.get_length()-4)
return True
- # returns a tuple (material, image) where material is the blender material and
- # image is the blender image or None.
- def create_blender_material(self):
- # Create face material.
- mat_desc = MaterialDesc()
-
- if self.mat_index != -1:
- if not self.mat_index in self.header.mat_desc_pal:
- if global_prefs['verbose'] >= 1:
- #print 'Warning: Material index', self.mat_index, 'not in material palette.'
- pass
- else:
- mat_pal_desc = self.header.mat_desc_pal[self.mat_index]
- mat_desc.alpha = mat_pal_desc.alpha * self.alpha # combine face and mat alphas
- mat_desc.ambient = mat_pal_desc.ambient
- mat_desc.diffuse = mat_pal_desc.diffuse
- mat_desc.specular = mat_pal_desc.specular
- mat_desc.emissive = mat_pal_desc.emissive
- mat_desc.shininess = mat_pal_desc.shininess
- else:
- # if no material get alpha from just face.
- mat_desc.alpha = self.alpha
-
- # Color.
- if global_prefs['color_from_face']:
- color = None
- if not self.props['flags'] & 0x40000000:
- if self.props['flags'] & 0x10000000: # packed color
- color = self.packed_color
- else:
- color = self.header.get_color(self.color_index)
-
- if color:
- r = float(color[0])/255.0
- g = float(color[1])/255.0
- b = float(color[2])/255.0
- mat_desc.diffuse = [r, g, b]
-
- # Texture
- image = None
- if self.tex_index != -1 and self.tex_index in self.header.bl_tex_pal:
- mat_desc.tex0 = self.header.bl_tex_pal[self.tex_index]
- if mat_desc.tex0:
- mat_desc.name = FF.strip_path(self.header.tex_pal[self.tex_index])
- image = mat_desc.tex0.image
-
- # OpenFlight Face Attributes
- mat_desc.face_props = self.props
-
- # Get material.
- mat = GRR.request_mat(mat_desc)
-
- # Add material to mesh.
- mesh = self.parent.mesh
-
- # Return where it is in the mesh for faces.
- mesh_materials= mesh.materials
-
- material_index= -1
- for i,m in enumerate(mesh_materials):
- if m.name==mat.name:
- material_index= i
- break
-
- if material_index==-1:
- material_index= len(mesh_materials)
- if material_index==16:
- material_index= 15
- if global_prefs['verbose'] >= 1:
- print 'Warning: Too many materials per mesh object. Only a maximum of 16 ' + \
- 'allowed. Using 16th material instead.'
-
- else:
- mesh_materials.append(mat)
- mesh.materials= mesh_materials
-
- return (material_index, image)
-
-
def blender_import(self):
vert_count = len(self.indices)
- if vert_count < 3:
+ if vert_count < 1:
if global_prefs['verbose'] >= 2:
print 'Warning: Ignoring face with no vertices.'
return
@@ -1106,18 +1131,21 @@ class Face(Node):
# Assign material and image
self.parent.faceLs.append(self)
- self.blen_mat_idx, self.blen_image= self.create_blender_material()
-
-
-
+ #need to store comment in mesh prop layer!
# Store comment info in parent.
- if self.comment != '':
- if self.parent.props['comment'] != '':
- self.parent.props['comment'] += '\n\nFrom Face:\n' + self.comment
- else:
- self.parent.props['comment'] = self.comment
-
+ #if self.comment != '':
+ # if self.parent.props['comment'] != '':
+ # self.parent.props['comment'] += '\n\nFrom Face:\n' + self.comment
+ # else:
+ # self.parent.props['comment'] = self.comment
+
+ if self.uvlayers:
+ #Make sure that the mesh knows about the layers that this face uses
+ self.parent.hasmtex = True
+ for mask in self.uvlayers.keys():
+ self.parent.uvlayers[mask] = True
+
def parse_vertex_list(self):
length = self.header.fw.get_length()
fw = self.header.fw
@@ -1138,8 +1166,49 @@ class Face(Node):
' to vertex index.' % byte_offset
'''
return True
-
-
+
+ def parse_multitex(self):
+ #Parse MultiTex Record.
+ length = self.header.fw.get_length()
+ fw = self.header.fw
+ #num layers == (length - 8) / 4
+ uvmask = fw.read_uint()
+ mask = 2147483648
+ for i in xrange(7):
+ if mask & uvmask:
+ uvlayer = dict()
+ self.uvlayers[mask] = uvlayer
+ mask = mask / 2
+
+ #read in record for each individual layer.
+ for key in reversed(sorted(self.uvlayers)):
+ uvlayer = self.uvlayers[key]
+ uvlayer['texture index'] = fw.read_ushort()
+ uvlayer['texture enviorment'] = fw.read_ushort()
+ uvlayer['texture mapping'] = fw.read_ushort()
+ uvlayer['texture data'] = fw.read_ushort()
+
+ self.uvmask = uvmask
+
+ def parse_uvlist(self):
+ #for each uvlayer, add uv vertices
+ length = self.header.fw.get_length()
+ fw = self.header.fw
+ uvmask = fw.read_uint()
+ if uvmask != self.uvmask: #This should never happen!
+ fw.read_ahead(self.length - 4) #potentially unnessecary?
+ else:
+ #need to store in uvverts dictionary for each vertex.
+ totverts = len(self.indices)
+ for i in xrange(totverts):
+ uvert = dict()
+ for key in reversed(sorted(self.uvlayers)):
+ uv = Vector(0.0,0.0)
+ uv[0] = fw.read_float()
+ uv[1] = fw.read_float()
+ uvert[key] = uv
+ self.uverts.append(uvert)
+
class Object(InterNode):
def __init__(self, parent):
Node.__init__(self, parent, parent.header)
@@ -1152,15 +1221,15 @@ class Object(InterNode):
self.root_handler.set_throw_back_lst(throw_back_opcodes)
self.child_handler.set_handler({5: self.parse_face,
- #130: self.parse_indexed_light_point,
- #111: self.parse_inline_light_point,
+ 19: self.parse_subpush,
+ 20: self.parse_subpop,
+ 111: self.parse_inline_light_point,
10: self.parse_push,
11: self.parse_pop})
- self.props['type'] = 'Object'
- self.props['id'] = self.header.fw.read_string(8)
-
-
+ self.props = dict()
+ self.props['comment'] = ''
+ self.parse_record()
class Group(InterNode):
def __init__(self, parent):
@@ -1174,15 +1243,16 @@ class Group(InterNode):
self.root_handler.set_throw_back_lst(throw_back_opcodes)
self.child_handler.set_handler({5: self.parse_face,
- #130: self.parse_indexed_light_point,
- #111: self.parse_inline_light_point,
+ 19: self.parse_subpush,
+ 20: self.parse_subpop,
+ 111: self.parse_inline_light_point,
2: self.parse_group,
73: self.parse_lod,
4: self.parse_object,
10: self.parse_push,
11: self.parse_pop,
96: self.parse_unhandled,
- 14: self.parse_unhandled,
+ 14: self.parse_dof,
91: self.parse_unhandled,
98: self.parse_unhandled,
63: self.parse_xref})
@@ -1190,20 +1260,48 @@ class Group(InterNode):
'special2', 'significance', 'layer code', 'loop count',
'loop duration', 'last frame duration'])
- self.props['type'] = 'Group'
self.props['comment'] = ''
- self.props['id'] = self.header.fw.read_string(8)
- self.props['priority'] = self.header.fw.read_short()
- self.header.fw.read_ahead(2)
- self.props['flags'] = self.header.fw.read_int()
- self.props['special1'] = self.header.fw.read_short()
- self.props['special2'] = self.header.fw.read_short()
- self.props['significance'] = self.header.fw.read_short()
- self.props['layer code'] = self.header.fw.read_char()
- self.header.fw.read_ahead(5)
- self.props['loop count'] = self.header.fw.read_int()
- self.props['loop duration'] = self.header.fw.read_float()
- self.props['last frame duration'] = self.header.fw.read_float()
+ self.parse_record()
+
+ #self.props['type'] = str(self.opcode) + ':' + opcode_name[self.opcode]
+ #props = records[self.opcode]
+ #propkeys = props.keys()
+ #propkeys.sort()
+ #for position in propkeys:
+ # (type,length,name) = props[position]
+ # self.props[name] = read_prop(self.header.fw,type,length)
+ #self.props['id'] = self.props['3t8!id']
+
+class DOF(InterNode):
+ def blender_import(self):
+ InterNode.blender_import(self)
+
+ def __init__(self, parent):
+ Node.__init__(self, parent, parent.header)
+ InterNode.__init__(self)
+
+ self.root_handler.set_handler({33: self.parse_long_id,
+ 31: self.parse_comment,
+ 10: self.parse_push,
+ 49: self.parse_matrix})
+ self.root_handler.set_throw_back_lst(throw_back_opcodes)
+
+ self.child_handler.set_handler({#130: self.parse_indexed_light_point,
+ 111: self.parse_inline_light_point,
+ 2: self.parse_group,
+ 73: self.parse_lod,
+ 4: self.parse_object,
+ 10: self.parse_push,
+ 11: self.parse_pop,
+ 96: self.parse_unhandled,
+ 14: self.parse_dof,
+ 91: self.parse_unhandled,
+ 98: self.parse_unhandled,
+ 63: self.parse_xref})
+ self.props = dict()
+ self.props['comment'] = ''
+ self.parse_record()
+
class XRef(InterNode):
def parse(self):
@@ -1214,31 +1312,66 @@ class XRef(InterNode):
def __init__(self, parent):
Node.__init__(self, parent, parent.header)
InterNode.__init__(self)
-
+
self.root_handler.set_handler({49: self.parse_matrix})
self.root_handler.set_throw_back_lst(throw_back_opcodes)
- xref_filename = self.header.fw.read_string(200)
- filename = FF.find(xref_filename)
+ self.props = dict()
+ self.props['comment'] = ''
+ self.parse_record()
- self.props['type'] = 'XRef'
+ xref_filename = self.props['3t200!filename']
+ self.props['id'] = 'X: ' + Blender.sys.splitext(Blender.sys.basename(xref_filename))[0] #this is really wrong as well....
- if filename != None:
- self.xref = Database(filename, self)
- self.props['id'] = 'X: ' + Blender.sys.splitext(Blender.sys.basename(filename))[0]
+ if global_prefs['doxrefs'] and os.path.exists(xref_filename) and not self.header.grr.xrefs.has_key(xref_filename):
+ self.xref = Database(xref_filename, self.header.grr, self)
+ self.header.grr.xrefs[xref_filename] = self.xref
else:
self.xref = None
- self.props['id'] = 'X: broken'
+
+
+ def blender_import(self):
+ #name = self.props['type'] + ': ' + self.props['id']
+ name = self.props['id']
+ self.object = self.header.scene.objects.new('Empty')
+ self.object.name = name
+ self.object.enableDupGroup = True
+ self.header.group.objects.link(self.object)
+
+ #for broken links its ok to leave this empty! they purely for visual purposes anyway.....
+ try:
+ self.object.DupGroup = self.header.grr.xrefs[self.props['3t200!filename']].group
+ except:
+ pass
+
+ if self.parent and self.parent.object:
+ self.parent.object.makeParent([self.object])
+ #id props import
+ self.object.properties['FLT'] = dict()
+ for key in self.props:
+ try:
+ self.object.properties['FLT'][key] = self.props[key]
+ except: #horrible...
+ pass
+
+ self.object.Layer = current_layer
+ self.object.sel = 1
+ if self.matrix:
+ self.object.setMatrix(self.matrix)
+ Node.blender_import(self)
+
+
class LOD(InterNode):
def blender_import(self):
- self.move_to_next_layer()
+ #self.move_to_next_layer()
InterNode.blender_import(self)
-
+ #self.object.properties['FLT'] = self.props.copy()
+
def __init__(self, parent):
Node.__init__(self, parent, parent.header)
InterNode.__init__(self)
-
+
self.root_handler.set_handler({33: self.parse_long_id,
31: self.parse_comment,
10: self.parse_push,
@@ -1246,18 +1379,20 @@ class LOD(InterNode):
self.root_handler.set_throw_back_lst(throw_back_opcodes)
self.child_handler.set_handler({2: self.parse_group,
+ 111: self.parse_inline_light_point,
73: self.parse_lod,
4: self.parse_object,
10: self.parse_push,
11: self.parse_pop,
96: self.parse_unhandled, # switch
- 14: self.parse_unhandled, # DOF
+ 14: self.parse_dof, # DOF
91: self.parse_unhandled, # sound
98: self.parse_unhandled, # clip
63: self.parse_xref})
- self.props['type'] = 'LOD'
- self.props['id'] = self.header.fw.read_string(8)
+ self.props = dict()
+ self.props['comment'] = ''
+ self.parse_record()
class InlineLightPoint(InterNode):
def __init__(self, parent):
@@ -1274,119 +1409,49 @@ class InlineLightPoint(InterNode):
11: self.parse_pop})
self.indices = list()
-
- self.props = dict.fromkeys(['id', 'type', 'comment', 'draw order', 'appearance'])
- self.app_props = dict()
-
+ self.props = dict()
self.props['comment'] = ''
- self.props['type'] = 'Light Point'
- self.props['id'] = self.header.fw.read_string(8)
-
- self.app_props.update({'smc': self.header.fw.read_short()})
- self.app_props.update({'fid': self.header.fw.read_short()})
- self.app_props.update({'back color: a': self.header.fw.read_uchar()})
- self.app_props.update({'back color: b': self.header.fw.read_uchar()})
- self.app_props.update({'back color: g': self.header.fw.read_uchar()})
- self.app_props.update({'back color: r': self.header.fw.read_uchar()})
- self.app_props.update({'display mode': self.header.fw.read_int()})
- self.app_props.update({'intensity': self.header.fw.read_float()})
- self.app_props.update({'back intensity': self.header.fw.read_float()})
- self.app_props.update({'minimum defocus': self.header.fw.read_float()})
- self.app_props.update({'maximum defocus': self.header.fw.read_float()})
- self.app_props.update({'fading mode': self.header.fw.read_int()})
- self.app_props.update({'fog punch mode': self.header.fw.read_int()})
- self.app_props.update({'directional mode': self.header.fw.read_int()})
- self.app_props.update({'range mode': self.header.fw.read_int()})
- self.app_props.update({'min pixel size': self.header.fw.read_float()})
- self.app_props.update({'max pixel size': self.header.fw.read_float()})
- self.app_props.update({'actual size': self.header.fw.read_float()})
- self.app_props.update({'trans falloff pixel size': self.header.fw.read_float()})
- self.app_props.update({'trans falloff exponent': self.header.fw.read_float()})
- self.app_props.update({'trans falloff scalar': self.header.fw.read_float()})
- self.app_props.update({'trans falloff clamp': self.header.fw.read_float()})
- self.app_props.update({'fog scalar': self.header.fw.read_float()})
- self.app_props.update({'fog intensity': self.header.fw.read_float()})
- self.app_props.update({'size threshold': self.header.fw.read_float()})
- self.app_props.update({'directionality': self.header.fw.read_int()})
- self.app_props.update({'horizontal lobe angle': self.header.fw.read_float()})
- self.app_props.update({'vertical lobe angle': self.header.fw.read_float()})
- self.app_props.update({'lobe roll angle': self.header.fw.read_float()})
- self.app_props.update({'dir falloff exponent': self.header.fw.read_float()})
- self.app_props.update({'dir ambient intensity': self.header.fw.read_float()})
- self.header.fw.read_ahead(12) # Animation settings.
- self.app_props.update({'significance': self.header.fw.read_float()})
- self.props['draw order'] = self.header.fw.read_int()
- self.app_props.update({'flags': self.header.fw.read_int()})
- #self.fw.read_ahead(12) # More animation settings.
-
- # return dictionary: lp_app name => index list
- def group_points(self, props):
-
- name_to_indices = {}
-
- for i in self.indices:
- vert_desc = self.header.vert_pal.vert_desc_lst[i]
- app_desc = LightPointAppDesc()
- app_desc.props.update(props)
- # add vertex normal and color
- app_desc.props.update({'nx': vert_desc.nx})
- app_desc.props.update({'ny': vert_desc.ny})
- app_desc.props.update({'nz': vert_desc.nz})
-
- app_desc.props.update({'r': vert_desc.r})
- app_desc.props.update({'g': vert_desc.g})
- app_desc.props.update({'b': vert_desc.b})
- app_desc.props.update({'a': vert_desc.a})
-
- app_name = GRR.request_lightpoint_app(app_desc)
+ self.parse_record()
- if name_to_indices.get(app_name):
- name_to_indices[app_name].append(i)
- else:
- name_to_indices.update({app_name: [i]})
-
- return name_to_indices
def blender_import(self):
- name = '%s: %s' % (self.props['type'], self.props['id'])
+
- name_to_indices = self.group_points(self.app_props)
+ name = self.props['id']
+ self.mesh= Blender.Mesh.New()
+ self.mesh.name = 'FLT_LP'
+ self.object = self.header.scene.objects.new(self.mesh)
+ self.object.name = name
+ #self.mesh.verts.extend(Vector() ) # DUMMYVERT
+ self.object.Layer = current_layer
+ self.object.sel= 1
+
+ self.object.properties['FLT'] = dict()
+ for key in self.props:
+ try:
+ self.object.properties['FLT'][key] = self.props[key]
+ except: #horrible...
+ pass
+
+ if self.parent and self.parent.object and self.header.scene == self.parent.header.scene:
+ self.parent.object.makeParent([self.object])
- for app_name, indices in name_to_indices.iteritems():
- self.object = Blender.Object.New('Mesh', name)
- #self.mesh = self.object.getData()
- self.mesh= Blender.Mesh.New()
- self.mesh.verts.extend( Vector() ) # DUMMYVERT
- self.object.link(self.mesh)
+ if self.matrix:
+ self.object.setMatrix(self.matrix)
- if self.parent:
- self.parent.object.makeParent([self.object])
-
- for i in indices:
- vert = self.header.vert_pal.blender_verts[i]
- self.mesh.verts.append(vert)
-
- scene.link(self.object)
- self.object.Layer = current_layer
- self.object.sel= 1
-
- if self.matrix:
- self.object.setMatrix(self.matrix)
+ self.mesh.verts.extend([self.header.vert_pal.blender_verts[i] for i in self.indices])
+
+ #add color index information.
+ self.mesh.verts.addPropertyLayer("FLT_VCOL",Blender.Mesh.PropertyTypes["INT"])
+ for i, vindex in enumerate(self.indices):
+ vdesc = self.header.vert_pal.vert_desc_lst[vindex]
+ v = self.mesh.verts[i]
+ v.setProperty("FLT_VCOL",vdesc.cindex)
+ #for i, v in enumerate(self.mesh.verts):
+ # vdesc = self.header.vert_pal.vert_desc_lst[i]
+ # v.setProperty("FLT_VCOL",vdesc.cindex)
+ self.mesh.update()
- # Import comment.
- if self.props['comment'] != '':
- name = 'COMMENT: ' + self.props['id']
- t = Blender.Text.New(name)
- t.write(self.props['comment'])
- self.props['comment'] = name
-
- # Attach properties.
- self.props.update({'appearance': app_name})
- for name, value in self.props.iteritems():
- self.object.addProperty(name, value)
-
- self.mesh.update()
-
def parse_vertex_list(self):
length = self.header.fw.get_length()
fw = self.header.fw
@@ -1432,7 +1497,7 @@ class IndexedLightPoint(InterNode):
app_desc.props.update({'b': vert_desc.b})
app_desc.props.update({'a': vert_desc.a})
- app_name = GRR.request_lightpoint_app(app_desc)
+ app_name = self.header.grr.request_lightpoint_app(app_desc, self.header.scene)
if name_to_indices.get(app_name):
name_to_indices[app_name].append(i)
@@ -1448,7 +1513,6 @@ class IndexedLightPoint(InterNode):
for app_name, indices in name_to_indices.iteritems():
self.object = Blender.Object.New('Mesh', name)
- #self.mesh = self.object.getData()
self.mesh= Blender.Mesh.New()
self.mesh.verts.extend( Vector() ) # DUMMYVERT
self.object.link(self.mesh)
@@ -1460,7 +1524,7 @@ class IndexedLightPoint(InterNode):
vert = self.header.vert_pal.blender_verts[i]
self.mesh.verts.append(vert)
- scene.link(self.object)
+ self.header.scene.objects.link(self.object)
self.object.Layer = current_layer
@@ -1543,7 +1607,7 @@ class Unhandled(InterNode):
10: self.parse_push,
11: self.parse_pop,
96: self.parse_unhandled, # switch
- 14: self.parse_unhandled, # DOF
+ 14: self.parse_dof, # DOF
91: self.parse_unhandled, # sound
98: self.parse_unhandled, # clip
63: self.parse_xref})
@@ -1552,30 +1616,31 @@ class Unhandled(InterNode):
class Database(InterNode):
def blender_import(self):
- self.tex_pal = dict(self.tex_pal_lst)
- del self.tex_pal_lst
-
- # Setup Textures
- bl_tex_pal_lst = list()
- for i in self.tex_pal.iterkeys():
- path_filename = FF.find(self.tex_pal[i])
+ for key in self.tex_pal.keys():
+ path_filename= FF.find(self.tex_pal[key][0])
if path_filename != None:
- img = GRR.request_image(path_filename)
+ img = self.grr.request_image(path_filename)
if img:
- tex = GRR.request_texture(img)
- tex.setName(FF.strip_path(self.tex_pal[i]))
- bl_tex_pal_lst.append( (i, tex) )
- else:
- bl_tex_pal_lst.append( (i, None) )
+ self.tex_pal[key][1] = img
elif global_prefs['verbose'] >= 1:
- print 'Warning: Unable to find', self.tex_pal[i]
-
- self.bl_tex_pal = dict(bl_tex_pal_lst)
-
- # Setup Materials
- self.mat_desc_pal = dict(self.mat_desc_pal_lst)
-
- InterNode.blender_import(self)
+ print 'Warning: Unable to find', self.tex_pal[key][0]
+
+ self.scene.properties['FLT'] = dict()
+ for key in self.props:
+ try:
+ self.scene.properties['FLT'][key] = self.props[key]
+ except: #horrible...
+ pass
+
+ self.scene.properties['FLT']['Main'] = 0
+ self.scene.properties['FLT']['Filename'] = self.bname
+
+ #import color palette
+ carray = list()
+ for color in self.col_pal:
+ carray.append(struct.unpack('>i',struct.pack('>BBBB',color[0],color[1],color[2],color[3]))[0])
+ self.scene.properties['FLT']['Color Palette'] = carray
+ Node.blender_import(self)
def parse_appearance_palette(self):
props = dict()
@@ -1696,9 +1761,10 @@ class Database(InterNode):
return True
def get_color(self, color_index):
+ color = None
index = color_index / 128
intensity = float(color_index - 128.0 * index) / 127.0
-
+
if index >= 0 and index <= 1023:
brightest = self.col_pal[index]
r = int(brightest[0] * intensity)
@@ -1707,7 +1773,7 @@ class Database(InterNode):
a = int(brightest[3])
color = [r, g, b, a]
-
+
return color
def parse_color_palette(self):
@@ -1728,15 +1794,56 @@ class Database(InterNode):
def parse_texture_palette(self):
name = self.fw.read_string(200)
index = self.fw.read_int()
- self.tex_pal_lst.append( (index, name) )
+ self.tex_pal[index]= [name, None]
return True
-
- def __init__(self, filename, parent=None):
+
+ def read_attribute_files(self):
+ for tex in self.tex_pal.keys():
+ [name,image] = self.tex_pal[tex]
+ basename = os.path.basename(name)
+ if(image):
+ basename = basename + ".attr"
+ dirname = os.path.dirname(Blender.sys.expandpath(image.getFilename())) #can't rely on original info stored in pallette since it might be relative link
+ newpath = os.path.join(dirname, basename)
+ if os.path.exists(newpath) and not image.properties.has_key('FLT'):
+ fw = flt_filewalker.FltIn(newpath)
+ fw.read_ahead(8) #We dont care what the attribute file says about x/y dimensions
+ image.properties['FLT']={}
+
+ #need to steal code from parse records....
+ props = records['Image']
+ propkeys = props.keys()
+ propkeys.sort()
+ for position in propkeys:
+ (type,length,name) = props[position]
+ image.properties['FLT'][name] = read_prop(fw,type,length)
+ fw.close_file()
+
+ #copy clamp settings
+ wrap = image.properties['FLT']['10i!Wrap']
+ wrapu = image.properties['FLT']['11i!WrapU']
+ wrapv = image.properties['FLT']['12i!WrapV']
+
+ if wrapu == 3 or wrapv == 3:
+ wrapuv = (wrap,wrap)
+ else:
+ wrapuv = (wrapu, wrapv)
+ image.clampX = wrapuv[0]
+ image.clampY = wrapuv[1]
+
+ elif not os.path.exists(newpath):
+ print "Cannot read attribute file:" + newpath
+
+ def __init__(self, filename, grr, parent=None):
if global_prefs['verbose'] >= 1:
print 'Parsing:', filename
print
self.fw = flt_filewalker.FltIn(filename)
+ self.filename = filename
+ self.bname = os.path.splitext(os.path.basename(filename))[0]
+ self.grr = grr
+
Node.__init__(self, parent, self)
InterNode.__init__(self)
@@ -1753,23 +1860,26 @@ class Database(InterNode):
self.root_handler.set_throw_back_lst(throw_back_opcodes)
self.child_handler.set_handler({#130: self.parse_indexed_light_point,
- #111: self.parse_inline_light_point,
+ 111: self.parse_inline_light_point,
2: self.parse_group,
73: self.parse_lod,
4: self.parse_object,
10: self.parse_push,
11: self.parse_pop,
96: self.parse_unhandled,
- 14: self.parse_unhandled,
+ 14: self.parse_dof,
91: self.parse_unhandled,
98: self.parse_unhandled,
63: self.parse_xref})
+ self.scene = Blender.Scene.New(self.bname)
+ self.group = Blender.Group.New(self.bname)
+
self.vert_pal = None
self.lightpoint_appearance_pal = dict()
self.tex_pal = dict()
- self.tex_pal_lst = list()
- self.bl_tex_pal = dict()
+ #self.tex_pal_lst = list()
+ #self.bl_tex_pal = dict()
self.col_pal = list()
self.mat_desc_pal_lst = list()
self.mat_desc_pal = dict()
@@ -1778,7 +1888,70 @@ class Database(InterNode):
'sw lon', 'ne lat', 'ne lon', 'origin lat', 'origin lon', 'lambert lat1',
'lambert lat2', 'ellipsoid model', 'utm zone', 'radius', 'major axis', 'minor axis'])
-def select_file(filename):
+
+def clearparent(root,childhash):
+ for child in childhash[root]:
+ clearparent(child,childhash)
+ root.clrParent(2,0)
+
+def fixscale(root,childhash):
+ for child in childhash[root]:
+ fixscale(child,childhash)
+ location = Blender.Mathutils.Vector(root.getLocation('worldspace'))
+ if location[0] != 0.0 and location[1] != 0.0 and location[2] != 0.0:
+ #direction = Blender.Mathutils.Vector(0-location[0],0-location[1],0-location[2]) #reverse vector
+ smat = Blender.Mathutils.ScaleMatrix(global_prefs['scale'],4)
+ root.setLocation(location * smat)
+ #if its a mesh, we need to scale all of its vertices too
+ if root.type == 'Mesh':
+ smat = Blender.Mathutils.ScaleMatrix(global_prefs['scale'],4)
+ rmesh = root.getData(mesh=True)
+ for v in rmesh.verts:
+ v.co = v.co * smat
+
+
+def reparent(root,childhash,sce):
+ for child in childhash[root]:
+ reparent(child,childhash,sce)
+
+ root.makeParent(childhash[root])
+ sce.update(1)
+
+def update_scene(root,sdone):
+ for object in root.objects:
+ if object.DupGroup:
+ try:
+ child = Blender.Scene.Get(object.DupGroup.name)
+ except:
+ child = None
+ if child and child not in sdone:
+ update_scene(child,sdone)
+ root.makeCurrent()
+ #create a list of children for each object
+ childhash = dict()
+ for object in root.objects:
+ childhash[object] = list()
+
+ for object in root.objects:
+ if object.parent:
+ childhash[object.parent].append(object)
+
+ for object in root.objects:
+ if not object.parent:
+ #recursivley go through and clear all the children of their transformation, starting at deepest level first.
+ clearparent(object,childhash)
+ #now fix the location of everything
+ fixscale(object,childhash)
+ #now fix the parenting
+ reparent(object,childhash,root)
+
+ for object in root.objects:
+ object.makeDisplayList()
+ root.update(1)
+ sdone.append(root)
+
+
+def select_file(filename, grr):
if not Blender.sys.exists(filename):
msg = 'Error: File ' + filename + ' does not exist.'
Blender.Draw.PupMenu(msg)
@@ -1801,13 +1974,12 @@ def select_file(filename):
global_prefs['get_ambient'] = False
global_prefs['get_shininess'] = True
global_prefs['color_from_face'] = True
+ global_prefs['log to blender'] = True
+
+
- # Start loading the file,
- # first set the context
Blender.Window.WaitCursor(True)
Blender.Window.EditMode(0)
- for ob in scene.objects:
- ob.sel=0
FF.add_file_to_search_path(filename)
@@ -1817,7 +1989,7 @@ def select_file(filename):
print
load_time = Blender.sys.time()
- db = Database(filename)
+ db = Database(filename,grr)
db.parse()
load_time = Blender.sys.time() - load_time
@@ -1828,23 +2000,15 @@ def select_file(filename):
import_time = Blender.sys.time()
db.blender_import()
- import_time = Blender.sys.time() - import_time
-
- Blender.Window.ViewLayer(range(1,21))
-
- # FIX UP AFTER DUMMY VERT AND REMOVE DOUBLES
- Blender.Mesh.Mode(Blender.Mesh.SelectModes['VERTEX'])
- for ob in scene.objects.context:
- if ob.type=='Mesh':
- me=ob.getData(mesh=1)
- me.verts.delete(0) # remove the dummy vert
- me.sel= 1
- me.remDoubles(0.0001)
+ if global_prefs['attrib']:
+ print "reading attribute files"
+ db.read_attribute_files()
+ Blender.Window.ViewLayer(range(1,21))
- Blender.Window.RedrawAll()
-
+ update_scene(db.scene,[])
+ import_time = Blender.sys.time() - import_time
if global_prefs['verbose'] >= 1:
print 'Done.'
print
@@ -1854,37 +2018,112 @@ def select_file(filename):
Blender.Window.WaitCursor(False)
+def setimportscale(ID,val):
+ global global_prefs
+ global_prefs['scale'] = val
+def setBpath(fname):
+ global_prefs['fltfile'] = fname
-if global_prefs['verbose'] >= 1:
- print
- print 'OpenFlight Importer'
- print 'Version:', __version__
- print 'Author: Greg MacDonald'
- print __url__[2]
- print
+def event(evt,val):
+ pass
+def but_event(evt):
+
+ global FLTBaseLabel
+ global FLTBaseString
+ global FLTBaseChooser
+ global FLTExport
+ global FLTClose
+
+ global FLTDoXRef
+ global FLTShadeImport
+ global FLTAttrib
+
+ #Import DB
+ if evt == 1:
+ if global_prefs['verbose'] >= 1:
+ print
+ print 'OpenFlight Importer'
+ print 'Version:', __version__
+ print 'Author: Greg MacDonald, Campbell Barton, Geoffrey Bantle'
+ print __url__[2]
+ print
+
+ GRR = GlobalResourceRepository()
+ select_file(global_prefs['fltfile'], GRR)
+ #choose base path for export
+ if evt == 4:
+ Blender.Window.FileSelector(setBpath, "DB Root", global_prefs['fltfile'])
+ #Import custom shading?
+ if evt == 9:
+ global_prefs['smoothshading'] = FLTShadeImport.val
+ #Import Image attribute files
+ if evt == 10:
+ global_prefs['attrib'] = FLTAttrib.val
+ #export XRefs
+ if evt == 13:
+ global_prefs['doxrefs'] = FLTDoXRef.val
+
+ if evt == 2:
+ Draw.Exit()
+
-if __name__ == '__main__':
- Blender.Window.FileSelector(select_file, "Import OpenFlight", "*.flt")
- #select_file('/fe/flt/helnwsflt/helnws.flt')
- #select_file('/fe/flt/Container_006.flt')
- #select_file('/fe/flt/NaplesORIGINALmesh.flt')
- #select_file('/Anti_tank_D30.flt')
- #select_file('/metavr/file_examples/flt/cherrypoint/CherryPoint_liter_runway.flt')
+
+from Blender.BGL import *
+from Blender import Draw
+def gui():
+
+ global FLTBaseLabel
+ global FLTBaseString
+ global FLTBaseChooser
-"""
-TIME= Blender.sys.time()
-import os
-PATH= 'c:\\flt_test'
-for FNAME in os.listdir(PATH):
- if FNAME.lower().endswith('.flt'):
- FPATH= os.path.join(PATH, FNAME)
- newScn= Blender.Scene.New(FNAME)
- newScn.makeCurrent()
- scene= newScn
- select_file(FPATH)
-
-print 'TOTAL TIME: %.6f' % (Blender.sys.time() - TIME)
-"""
- \ No newline at end of file
+ global FLTExport
+ global FLTClose
+
+ global FLTDoXRef
+ global FLTShadeImport
+
+ global FLTAttrib
+
+
+ glClearColor(0.772,0.832,0.847,1.0)
+ glClear(GL_COLOR_BUFFER_BIT)
+
+ areas = Blender.Window.GetScreenInfo()
+ curarea = Blender.Window.GetAreaID()
+ curRect = None
+
+ for area in areas:
+ if area['id'] == curarea:
+ curRect = area['vertices']
+ break
+
+ width = curRect[2] - curRect[0]
+ height = curRect[3] - curRect[1]
+ cx = 50
+ cy = height - 80
+
+ FLTBaseLabel = Draw.Label("Base file:",cx,cy,100,20)
+ FLTBaseString = Draw.String("",3,cx+100,cy,300,20,global_prefs['fltfile'],255,"Root DB file")
+ FLTBaseChooser = Draw.PushButton("...",4,cx+400,cy,20,20,"Choose Folder")
+
+ cy = cy-40
+ FLTScale = Draw.Number("Import Scale",14,cx,cy,220,20,global_prefs['scale'],0.0,100.0,"Export scaleing factor",setimportscale)
+
+ cy = cy-40
+ FLTDoXRef = Draw.Toggle("Import XRefs", 13,cx,cy,220,20,global_prefs['doxrefs'],"Import External references")
+
+ cy = cy-40
+ FLTShadeImport = Draw.Toggle("Import Custom Shading",9,cx,cy,220,20,global_prefs['smoothshading'],"Import custom shading via edgesplit modifiers")
+
+ cy = cy-40
+ FLTAttrib = Draw.Toggle("Import Attribute Files", 10,cx,cy,220,20,global_prefs['attrib'],"Import Image Attribute files")
+
+ cy = cy - 40
+ FLTExport = Draw.PushButton("Import",1,cx,20,100,20,"Import FLT Database")
+ FLTClose = Draw.PushButton("Close",2,cx+120,20,100,20,"Close Window")
+
+
+
+Draw.Register(gui,event,but_event) \ No newline at end of file
diff --git a/release/scripts/flt_palettemanager.py b/release/scripts/flt_palettemanager.py
new file mode 100644
index 00000000000..c641a0a4f08
--- /dev/null
+++ b/release/scripts/flt_palettemanager.py
@@ -0,0 +1,388 @@
+#!BPY
+
+"""
+Name: 'FLT Palette Manager'
+Blender: 240
+Group: 'Misc'
+Tooltip: 'Manage FLT colors'
+"""
+
+__author__ = "Geoffrey Bantle"
+__version__ = "1.0 11/21/2007"
+__email__ = ('scripts', 'Author, ')
+__url__ = ('blender', 'elysiun')
+
+__bpydoc__ ="""\
+
+This script manages colors in OpenFlight databases. OpenFlight is a
+registered trademark of MultiGen-Paradigm, Inc.
+
+Todo:
+-Figure out whats causing the PC speaker to beep when initializing...
+
+Feature overview and more availible at:
+http://wiki.blender.org/index.php/Scripts/Manual/FLTools
+"""
+
+# --------------------------------------------------------------------------
+# flt_palettemanager.py version 0.1 2005/04/08
+# --------------------------------------------------------------------------
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# Copyright (C) 2007: Blender Foundation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+# --------------------------------------------------------------------------
+
+import Blender.Draw as Draw
+from Blender.BGL import *
+import Blender
+import flt_properties
+import flt_defaultp as defaultp
+from flt_properties import *
+
+
+palette_size = 12
+palette_x = 0
+palette_y = 0
+
+colors = list()
+curint = 1.0
+curswatch = 0
+#make a default palette, not very useful.
+cinc = 1.0 / 1024.0
+cstep = 0.0
+picker = None
+ptt = ""
+for i in xrange(1024):
+ colors.append([cstep,cstep,cstep])
+ cstep = cstep + cinc
+def update_state():
+ state = dict()
+ state["activeScene"] = Blender.Scene.getCurrent()
+ state["activeObject"] = state["activeScene"].getActiveObject()
+ state["activeMesh"] = None
+ if state["activeObject"] and state["activeObject"].type == 'Mesh':
+ state["activeMesh"] = state["activeObject"].getData(mesh=True)
+
+ state["activeFace"] = None
+ if state["activeMesh"]:
+ if state["activeMesh"].faceUV and state["activeMesh"].activeFace != None:
+ state["activeFace"] = state["activeMesh"].faces[state["activeMesh"].activeFace]
+
+ return state
+
+def pack_face_index(index, intensity):
+ return ((127*intensity)+(128*index))
+def unpack_face_index(face_index):
+ index = face_index / 128
+ intensity = float(face_index - 128.0 * index) / 127.0
+ return(index,intensity)
+
+def event(evt,val):
+ global palette_size
+ global palette_x
+ global palette_y
+ global colors
+ global curint
+ global curswatch
+
+ areas = Blender.Window.GetScreenInfo()
+ curarea = Blender.Window.GetAreaID()
+ curRect = None
+ editmode = 0
+
+ for area in areas:
+ if area['id'] == curarea:
+ curRect = area['vertices']
+ break
+
+ if evt == Draw.LEFTMOUSE:
+ mval = Blender.Window.GetMouseCoords()
+ rastx = mval[0] - curRect[0]
+ rasty = mval[1] - curRect[1]
+
+ swatchx = (rastx -palette_x) / palette_size #+state["palette_x"]
+ swatchy = (rasty -palette_y) / palette_size #+state["palette_y"]
+ if rastx > palette_x and rastx < (palette_x + palette_size * 32) and rasty > palette_y and rasty < (palette_y+ palette_size* 32):
+ if swatchx < 32 and swatchy < 32:
+ curswatch = (swatchx * 32) + swatchy
+ Draw.Redraw(1)
+
+ elif swatchy < 34 and swatchx < 32:
+ curint = 1.0 - (float(rastx-palette_x)/(palette_size*32.0))
+ Draw.Redraw(1)
+
+ #copy current color and intensity to selected faces.
+ elif evt == Draw.CKEY:
+
+ if Blender.Window.EditMode():
+ Blender.Window.EditMode(0)
+ editmode = 1
+ state = update_state()
+
+ #retrieve color from palette
+ color = struct.unpack('>BBBB',struct.pack('>I',colors[curswatch]))
+ actmesh = state["activeMesh"]
+ if actmesh:
+ if(Blender.Window.GetKeyQualifiers() != Blender.Window.Qual["CTRL"]):
+ selfaces = list()
+ for face in actmesh.faces:
+ if face.sel:
+ selfaces.append(face)
+
+ if not "FLT_COL" in actmesh.faces.properties:
+ actmesh.faces.addPropertyLayer("FLT_COL",Blender.Mesh.PropertyTypes["INT"])
+ for face in actmesh.faces:
+ face.setProperty("FLT_COL",127) #default
+ try:
+ actmesh.activeColorLayer = "FLT_Fcol"
+ except:
+ actmesh.addColorLayer("FLT_Fcol")
+ actmesh.activeColorLayer = "FLT_Fcol"
+
+
+ for face in selfaces:
+ #First append packed index + color and store in face property
+ face.setProperty("FLT_COL",int(pack_face_index(curswatch,curint)))
+ #Save baked color to face vertex colors
+ for col in face.col:
+ col.r = int(color[0] * curint)
+ col.g = int(color[1] * curint)
+ col.b = int(color[2] * curint)
+ col.a = int(color[3] * curint)
+ else:
+ if Blender.Mesh.Mode() == Blender.Mesh.SelectModes['VERTEX']:
+ if not 'FLT_VCOL' in actmesh.verts.properties:
+ actmesh.verts.addPropertyLayer("FLT_VCOL",Blender.Mesh.PropertyTypes["INT"])
+ for vert in actmesh.verts:
+ vert.setProperty("FLT_VCOL",127)
+ else:
+ for vert in actmesh.verts:
+ if vert.sel:
+ vert.setProperty("FLT_VCOL",int(pack_face_index(curswatch,curint)))
+
+ if editmode:
+ Blender.Window.EditMode(1)
+
+ Blender.Window.RedrawAll()
+
+ #grab color and intensity from active face
+ elif evt == Draw.VKEY:
+ if Blender.Window.EditMode():
+ Blender.Window.EditMode(0)
+ editmode = 1
+ state = update_state()
+
+ actmesh = state["activeMesh"]
+ activeFace = state["activeFace"]
+
+
+ if activeFace:
+ if not "FLT_COL" in actmesh.faces.properties:
+ actmesh.faces.addPropertyLayer("FLT_COL",Blender.Mesh.PropertyTypes["INT"])
+ for face in actmesh.faces:
+ face.setProperty("FLT_COL",127) #default
+ try:
+ actmesh.activeColorLayer = "FLT_Fcol"
+ except:
+ actmesh.addColorLayer("FLT_Fcol")
+ actmesh.activeColorLayer = "FLT_Fcol"
+ tcol = activeFace.getProperty("FLT_COL")
+ (index,intensity) = unpack_face_index(tcol)
+ curswatch = index
+ curint = intensity
+
+ if editmode:
+ Blender.Window.EditMode(1)
+
+ Blender.Window.RedrawAll()
+
+ elif evt == Draw.ESCKEY:
+ Draw.Exit()
+
+ if editmode:
+ Blender.Window.EditMode(1)
+
+def update_all():
+ global colors
+ state = update_state()
+ #update the baked FLT colors for all meshes.
+ for object in state["activeScene"].objects:
+ if object.type == "Mesh":
+ mesh = object.getData(mesh=True)
+ if 'FLT_COL' in mesh.faces.properties:
+ mesh.activeColorLayer = "FLT_Fcol"
+ for face in mesh.faces:
+ (index,intensity) = unpack_face_index(face.getProperty('FLT_COL'))
+ color = struct.unpack('>BBBB',struct.pack('>I',colors[index]))
+ #update the vertex colors for this face
+ for col in face.col:
+ col.r = int(color[0] * intensity)
+ col.g = int(color[1] * intensity)
+ col.b = int(color[2] * intensity)
+ col.a = 255
+
+
+def but_event(evt):
+ global palette_size
+ global palette_x
+ global palette_y
+ global colors
+ global curint
+ global curswatch
+ global picker
+ state = update_state()
+
+ if evt == 1:
+ if picker.val:
+ rval = (int(picker.val[0]*255),int(picker.val[1]*255),int(picker.val[2]*255),255)
+ rval = struct.pack('>BBBB',rval[0],rval[1],rval[2],rval[3])
+ rval = struct.unpack('>i',rval)
+ colors[curswatch] = rval[0]
+ #go cd through all meshes and update their FLT colors
+ update_all()
+
+ Draw.Redraw(1)
+def init_pal():
+ global palette_size
+ global palette_x
+ global palette_y
+ global colors
+ global curint
+ global curswatch
+
+ state = update_state()
+
+ if not state["activeScene"].properties.has_key('FLT'):
+ state["activeScene"].properties['FLT'] = dict()
+
+ try:
+ colors = state["activeScene"].properties['FLT']['Color Palette']
+ except:
+ state["activeScene"].properties['FLT']['Color Palette'] = defaultp.pal
+ colors = state["activeScene"].properties['FLT']['Color Palette']
+
+def draw_palette():
+ global palette_size
+ global palette_x
+ global palette_y
+ global colors
+ global curint
+ global curswatch
+ global picker
+
+ state = update_state()
+ init_pal()
+
+ ssize = palette_size
+ xpos = palette_x
+ cid = 0
+
+ highlight = [(palette_x,palette_y),(palette_x+palette_size,palette_y),(palette_x+palette_size,palette_y+palette_size),(palette_x,palette_y+palette_size)]
+ for x in xrange(32):
+ ypos = palette_y
+ for y in xrange(32):
+ color = struct.unpack('>BBBB',struct.pack('>I',colors[cid]))
+ glColor3f(color[0]/255.0,color[1]/255.0,color[2]/255.0)
+ glBegin(GL_POLYGON)
+ glVertex2i(xpos,ypos)
+ glVertex2i(xpos+ssize,ypos)
+ glVertex2i(xpos+ssize,ypos+ssize)
+ glVertex2i(xpos,ypos+ssize)
+ glEnd()
+
+ if curswatch == cid:
+ highlight[0] = (xpos,ypos)
+ highlight[1] = (xpos+ssize,ypos)
+ highlight[2] = (xpos+ssize,ypos+ssize)
+ highlight[3] = (xpos,ypos+ssize)
+
+ glColor3f(0.0,0.0,0.0)
+ glBegin(GL_LINE_LOOP)
+ glVertex2i(xpos,ypos)
+ glVertex2i(xpos+ssize,ypos)
+ glVertex2i(xpos+ssize,ypos+ssize)
+ glVertex2i(xpos,ypos+ssize)
+ glVertex2i(xpos,ypos)
+ glEnd()
+
+
+ cid = cid + 1
+ ypos = ypos + ssize
+
+ xpos = xpos + ssize
+
+ #draw intensity gradient
+ color = struct.unpack('>BBBB',struct.pack('>I',colors[curswatch]))
+ color = [color[0]/255.0,color[1]/255.0,color[2]/255.0]
+ colsteps = [color[0]/255.0,color[1]/255.0,color[2]/255.0]
+ stripwidth = (palette_size * 32.0) / 256
+ strippad = palette_size / 2.0
+
+ xpos = palette_x
+ grady = (palette_y + (palette_size * 32.0)) + strippad
+ for x in xrange(256):
+ color[0] = color[0] - colsteps[0]
+ color[1] = color[1] - colsteps[1]
+ color[2] = color[2] - colsteps[2]
+
+ glColor3f(color[0], color[1] ,color[2])
+ glBegin(GL_POLYGON)
+ glVertex2f(xpos,grady)
+ glVertex2f(xpos+stripwidth,grady)
+ glVertex2f(xpos+stripwidth,grady+palette_size)
+ glVertex2f(xpos,grady+palette_size)
+ glEnd()
+ xpos = xpos + stripwidth
+
+ #draw intensity slider bar
+ #xposition == 512 - ((curint) * 512)
+ xpos = ((palette_size*32) * (1.0 - curint)) + palette_x
+ glColor3f(1.0,1.0,1.0)
+ glBegin(GL_LINE_LOOP)
+ glVertex2i(xpos-6,grady-1)
+ glVertex2i(xpos+6,grady-1)
+ glVertex2i(xpos+6,grady+palette_size+1)
+ glVertex2i(xpos-6,grady+palette_size+1)
+ #glVertex2i(xpos-6,grady+7)
+ glEnd()
+
+ #draw color picker
+ color = struct.unpack('>BBBB',struct.pack('>I',colors[curswatch]))
+ pickcol = (color[0]/255.0,color[1]/255.0,color[2]/255.0)
+ picker = Blender.Draw.ColorPicker(1,highlight[0][0]+1,highlight[0][1]+1,ssize-2,ssize-2,pickcol,ptt)
+
+ #draw highlight swatch
+ glColor3f(1.0,1.0,1.0)
+ glBegin(GL_LINE_LOOP)
+ glVertex2i(highlight[0][0],highlight[0][1])
+ glVertex2i(highlight[1][0],highlight[1][1])
+ glVertex2i(highlight[2][0],highlight[2][1])
+ glVertex2i(highlight[3][0],highlight[3][1])
+ glVertex2i(highlight[0][0],highlight[0][1])
+ glEnd()
+
+def gui():
+ glClearColor(0.5,0.5,0.5,1.0)
+ glClear(GL_COLOR_BUFFER_BIT)
+ draw_palette()
+
+
+init_pal()
+Draw.Register(gui,event,but_event)
+
diff --git a/release/scripts/flt_properties.py b/release/scripts/flt_properties.py
new file mode 100644
index 00000000000..07bcc8def1d
--- /dev/null
+++ b/release/scripts/flt_properties.py
@@ -0,0 +1,619 @@
+#!BPY
+# flt_properties.py. For setting default OpenFLight ID property types
+# Copyright (C) 2007 Blender Foundation
+#
+# 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.
+
+__bpydoc__ ="""\
+Utility functions and data defintions used by OpenFlight I/O and tool scripts. OpenFlight is a
+registered trademark of MultiGen-Paradigm, Inc.
+"""
+
+
+import struct
+
+bitsLSB = [2147483648]
+for i in xrange(31):
+ bitsLSB.append(bitsLSB[-1]/2)
+bitsRSB = bitsLSB[:]
+bitsRSB.reverse()
+
+def pack_color(col):
+ return struct.pack('>B',col[3]) + struct.pack('>B',col[2]) + struct.pack('>B',col[1]) + struct.pack('>B',col[0])
+
+def unpack_color(col):
+ string = struct.pack('>I', col)
+ r = struct.unpack('>B',string[3:4])
+ g = struct.unpack('>B',string[2:3])
+ b = struct.unpack('>B',string[1:2])
+ a = struct.unpack('>B',string[0:1])
+ return [r,g,b,a]
+
+def reverse_bits(len,num):
+ bitbucket = list()
+ rval = 0
+
+ for i in xrange(len):
+ if num & bitsRSB[i]:
+ bitbucket.append(1)
+ else:
+ bitbucket.append(0)
+
+ bitbucket.reverse()
+
+ for i, bit in enumerate(bitbucket):
+ if bit:
+ rval |= bitsLSB[i]
+
+ return rval
+
+
+opcode_name = { 0: 'db',
+ 1: 'head',
+ 2: 'grp',
+ 4: 'obj',
+ 5: 'face',
+ 10: 'push',
+ 11: 'pop',
+ 14: 'dof',
+ 19: 'push sub',
+ 20: 'pop sub',
+ 21: 'push ext',
+ 22: 'pop ext',
+ 23: 'cont',
+ 31: 'comment',
+ 32: 'color pal',
+ 33: 'long id',
+ 49: 'matrix',
+ 50: 'vector',
+ 52: 'multi-tex',
+ 53: 'uv lst',
+ 55: 'bsp',
+ 60: 'rep',
+ 61: 'inst ref',
+ 62: 'inst def',
+ 63: 'ext ref',
+ 64: 'tex pal',
+ 67: 'vert pal',
+ 68: 'vert w col',
+ 69: 'vert w col & norm',
+ 70: 'vert w col, norm & uv',
+ 71: 'vert w col & uv',
+ 72: 'vert lst',
+ 73: 'lod',
+ 74: 'bndin box',
+ 76: 'rot edge',
+ 78: 'trans',
+ 79: 'scl',
+ 80: 'rot pnt',
+ 81: 'rot and/or scale pnt',
+ 82: 'put',
+ 83: 'eyepoint & trackplane pal',
+ 84: 'mesh',
+ 85: 'local vert pool',
+ 86: 'mesh prim',
+ 87: 'road seg',
+ 88: 'road zone',
+ 89: 'morph vert lst',
+ 90: 'link pal',
+ 91: 'snd',
+ 92: 'rd path',
+ 93: 'snd pal',
+ 94: 'gen matrix',
+ 95: 'txt',
+ 96: 'sw',
+ 97: 'line styl pal',
+ 98: 'clip reg',
+ 100: 'ext',
+ 101: 'light src',
+ 102: 'light src pal',
+ 103: 'reserved',
+ 104: 'reserved',
+ 105: 'bndin sph',
+ 106: 'bndin cyl',
+ 107: 'bndin hull',
+ 108: 'bndin vol cntr',
+ 109: 'bndin vol orient',
+ 110: 'rsrvd',
+ 111: 'light pnt',
+ 112: 'tex map pal',
+ 113: 'mat pal',
+ 114: 'name tab',
+ 115: 'cat',
+ 116: 'cat dat',
+ 117: 'rsrvd',
+ 118: 'rsrvd',
+ 119: 'bounding hist',
+ 120: 'rsrvd',
+ 121: 'rsrvd',
+ 122: 'push attrib',
+ 123: 'pop attrib',
+ 124: 'rsrvd',
+ 125: 'rsrvd',
+ 126: 'curv',
+ 127: 'road const',
+ 128: 'light pnt appear pal',
+ 129: 'light pnt anim pal',
+ 130: 'indexed lp',
+ 131: 'lp sys',
+ 132: 'indx str',
+ 133: 'shdr pal'}
+
+
+typecodes = ['c','C','s','S','i','I','f','d','t']
+
+FLT_GRP = 2
+FLT_OBJ = 4
+FLT_LOD = 73
+FLT_XRF = 63
+FLT_DOF = 14
+FLT_ILP = 111
+FLT_DB = 1
+FLT_FCE = 5
+
+#not actual opcodes
+FLT_NUL = 0
+FLT_EXP = -1
+
+#valid childtypes for each FLT node type
+FLT_CHILDTYPES = {
+ FLT_GRP : [111,2,73,4,14,63],
+ FLT_OBJ : [111],
+ FLT_LOD : [111,2,73,4,14,63],
+ FLT_XRF : [],
+ FLT_DOF : [111,2,73,4,14,63],
+ FLT_ILP : []
+}
+
+#List of nodes that can have faces as children
+FLT_FACETYPES = [
+ FLT_GRP,
+ FLT_OBJ,
+ FLT_LOD,
+ FLT_DOF
+]
+
+def write_prop(fw,type,value,length):
+ if type == 'c':
+ fw.write_char(value)
+ elif type == 'C':
+ fw.write_uchar(value)
+ elif type == 's':
+ fw.write_short(value)
+ elif type == 'S':
+ fw.write_ushort(value)
+ elif type == 'i':
+ fw.write_int(value)
+ elif type == 'I':
+ fw.write_uint(value)
+ elif type == 'd':
+ fw.write_double(value)
+ elif type == 'f':
+ fw.write_float(value)
+ elif type == 't':
+ fw.write_string(value,length)
+
+def read_prop(fw,type,length):
+ rval = None
+ if type == 'c':
+ rval = fw.read_char()
+ elif type == 'C':
+ rval = fw.read_uchar()
+ elif type == 's':
+ rval = fw.read_short()
+ elif type == 'S':
+ rval = fw.read_ushort()
+ elif type == 'i':
+ rval = fw.read_int()
+ elif type == 'I':
+ rval = fw.read_uint()
+ elif type == 'd':
+ rval = fw.read_double()
+ elif type == 'f':
+ rval = fw.read_float()
+ elif type == 't':
+ rval = fw.read_string(length)
+ return rval
+
+FLTGroup = {
+ '3t8!id' : 'G',
+ '4s!priority' : 0,
+ '5s!reserved1' : 0,
+ '6i!flags' : 0,
+ '7s!special1' : 0,
+ '8s!special2' : 0,
+ '9s!significance' : 0,
+ '10c!layer code' : 0,
+ '11c!reserved2' : 0,
+ '12i!reserved3' : 0,
+ '13i!loop count' : 0,
+ '14f!loop duration' : 0,
+ '15f!last frame duration' : 0
+}
+FLTGroupDisplay = [5,11,12]
+
+FLTObject = {
+ '3t8!id' : 'O',
+ '4I!flags' : 0,
+ '5s!priority' : 0,
+ '6S!transp' : 0,
+ '7s!SFX1' : 0,
+ '8s!SFX2' : 0,
+ '9s!significance' : 0,
+ '10s!reserved' : 0
+}
+FLTObjectDisplay = [10]
+
+FLTLOD = {
+ '3t8!id' : 'L',
+ '4i!reserved' : 0,
+ '5d!switch in' : 0,
+ '6d!switch out' : 0,
+ '7s!sfx ID1' : 0,
+ '8s!sfx ID2' : 0,
+ '9I!flags' : 0,
+ '10d!X co' : 0,
+ '11d!Y co' : 0,
+ '12d!Z co' : 0,
+ '13d!Transition' : 0,
+ '14d!Sig Size' : 0
+}
+FLTLODDisplay = [4]
+
+FLTInlineLP = {
+ '3t8!id' : 'Lp',
+ '4s!smc' : 0,
+ '5s!fid' : 0,
+ '6C!back color: a' : 255,
+ '7C!back color: b' : 255,
+ '8C!back color: g' : 255,
+ '9C!back color: r' : 255,
+ '10i!display mode' : 255,
+ '11f!intensity' : 1.0,
+ '12f!back intensity' : 0.0,
+ '13f!minimum defocus' : 0.0,
+ '14f!maximum defocus' : 1.0,
+ '15i!fading mode' : 0,
+ '16i!fog punch mode' : 0,
+ '17i!directional mode' : 1,
+ '18i!range mode' : 0,
+ '19f!min pixel size' : 1.0,
+ '20f!max pixel size' : 1024,
+ '21f!actual size' : 0.25,
+ '22f!trans falloff pixel size' : 0.25,
+ '23f!trans falloff exponent' : 1.0,
+ '24f!trans falloff scalar' : 1.0,
+ '25f!trans falloff clamp' : 1.0,
+ '26f!fog scalar' : 0.25,
+ '27f!fog intensity' : 1.0,
+ '28f!size threshold' : 0.1,
+ '29i!directionality' : 0,
+ '30f!horizontal lobe angle' : 180.0,
+ '31f!vertical lobe angle' : 180.0,
+ '32f!lobe roll angle' : 0.0,
+ '33f!dir falloff exponent' : 1.0,
+ '34f!dir ambient intensity' : 0.1,
+ '35f!anim period' : 0,
+ '36f!anim phase' : 0,
+ '37f!anim enabled' : 0,
+ '38f!significance' : 0.0,
+ '39i!draw order' : 0,
+ '40I!flags' : 813875616,
+ '41f!roti' : 0,
+ '42f!rotj' : 0,
+ '43f!rotk' : 0
+}
+
+FLTInlineLPDisplay = [35,36,37,41,42,43]
+
+FLTXRef = {
+ '3t200!filename' : '', #we dont actually use this value on export
+ '4i!reserved' : 0,
+ '5I!flag' : -478150656,
+ '6s!bbox' : 0,
+ '7s!reserved' : 0
+}
+
+FLTXRefDisplay = [4,7,3]
+
+FLTDOF = {
+ '3t8!id' : 'D',
+ '4i!reserved' : 0,
+ '5d!ORIGX' : 0.0,
+ '6d!ORIGY' : 0.0,
+ '7d!ORIGZ' : 0.0,
+ '8d!XAXIS-X' : 10.0,
+ '9d!XAXIS-Y' : 0.0,
+ '10d!XAXIS-Z' : 0.0,
+ '11d!XYPLANE-X' : 0.0,
+ '12d!XYPLANE-Y' : 10.0,
+ '13d!XZPLANE-Z' : 0.0,
+ '14d!ZMIN' : 0.0,
+ '15d!ZMAX' : 0.0,
+ '16d!ZCUR' : 0.0,
+ '17d!ZSTEP' : 0.0,
+ '18d!YMIN' : 0.0,
+ '19d!YMAX' : 0.0,
+ '20d!YCUR' : 0.0,
+ '21d!YSTEP' : 0.0,
+ '22d!XMIN' : 0.0,
+ '23d!XMAX' : 0.0,
+ '24d!XCUR' : 0.0,
+ '25d!XSTEP' : 0.0,
+ '26d!PITCH-MIN' : 0.0,
+ '27d!PITCH-MAX' : 0.0,
+ '28d!PITCH-CUR' : 0.0,
+ '29d!PITCH-STEP' : 0.0,
+ '30d!ROLL-MIN' : 0.0,
+ '31d!ROLL-MAX' : 0.0,
+ '32d!ROLL-CUR' : 0.0,
+ '33d!ROLL-STEP' : 0.0,
+ '34d!YAW-MIN' : 0.0,
+ '35d!YAW-MAX' : 0.0,
+ '36d!YAW-CUR' : 0.0,
+ '37d!YAW-STEP' : 0.0,
+ '38d!ZSIZE-MIN' : 0.0,
+ '39d!ZSIZE-MAX' : 0.0,
+ '40d!ZSIZE-CUR' : 1.0,
+ '41d!ZSIZE-STEP' : 0.0,
+ '42d!YSIZE-MIN' : 0.0,
+ '43d!YSIZE-MAX' : 0.0,
+ '44d!YSIZE-CUR' : 1.0,
+ '45d!YSIZE-STEP' : 0.0,
+ '46d!XSIZE-MIN' : 0.0,
+ '47d!XSIZE-MAX' : 0.0,
+ '48d!XSIZE-CUR' : 1.0,
+ '49d!XSIZE-STEP' : 0.0,
+ '50I!FLAG' : 1897582,
+ '51i!reserved2' : 0
+}
+
+FLTDOFDisplay = [4]
+
+FLTImage = {
+ '3i!RealU Direction' : 0,
+ '4i!RealV Direction' : 0,
+ '5i!UpX' : 0,
+ '6i!UpY' : 0,
+ '7i!File Format' : 0,
+ '8i!Min Filter' : 1,
+ '9i!Mag Filter' : 1,
+ '10i!Wrap' : 0,
+ '11i!WrapU' : 0,
+ '12i!WrapV' : 0,
+ '13i!Modified' : 0,
+ '14i!PivotX' : 0,
+ '15i!PivotY' : 0,
+ '16i!Enviorment' : 0,
+ '17i!WhiteAlpha' : 0,
+ '18i!reserved1' : 0,
+ '19i!reserved2' : 0,
+ '20i!reserved3' : 0,
+ '21i!reserved4' : 0,
+ '22i!reserved5' : 0,
+ '23i!reserved6' : 0,
+ '24i!reserved7' : 0,
+ '25i!reserved8' : 0,
+ '26i!reserved9' : 0,
+ '27d!RealU Direction' : 0,
+ '28d!RealV Direction' : 0,
+ '29i!Origin' : 0,
+ '30i!Kernel no.' : 0,
+ '31i!Internal Format' : 0,
+ '32i!External Format' : 0,
+ '33i!MipMap Filter?' : 0,
+ '34f!MMF1' : 0.0,
+ '35f!MMF2' : 0.0,
+ '36f!MMF3' : 0.0,
+ '37f!MMF4' : 0.0,
+ '38f!MMF5' : 0.0,
+ '39f!MMF6' : 0.0,
+ '40f!MMF7' : 0.0,
+ '41f!MMF8' : 0.0,
+ '42i!Tex CPs?' : 0,
+ '43f!LOD0 CP' : 0.0,
+ '44f!Scale0 CP' : 0.0,
+ '45f!LOD1 CP' : 0.0,
+ '46f!Scale1 CP' : 0.0,
+ '47f!LOD2 CP' : 0.0,
+ '48f!Scale2 CP' : 0.0,
+ '49f!LOD3 CP' : 0.0,
+ '50f!Scale3 CP' : 0.0,
+ '51f!LOD4 CP' : 0.0,
+ '52f!Scale4 CP' : 0.0,
+ '53f!LOD5 CP' : 0.0,
+ '54f!Scale5 CP' : 0.0,
+ '55f!LOD6 CP' : 0.0,
+ '56f!Scale6 CP' : 0.0,
+ '57f!LOD7 CP' : 0.0,
+ '58f!Scale7 CP' : 0.0,
+ '59f!Control Clamp' : 0.0,
+ '60i!Mag Alpha Filter' : 0,
+ '61i!Mag Color Filter' : 0,
+ '62f!reserved10' : 0,
+ '63f!reserved11' : 0,
+ '64f!reserved12' : 0,
+ '65f!reserved13' : 0,
+ '66f!reserved14' : 0,
+ '67f!reserved15' : 0,
+ '68f!reserved16' : 0,
+ '69f!reserved17' : 0,
+ '70f!reserved18' : 0,
+ '71d!Lambert Central' : 0.0,
+ '72d!Lambert Upper' : 0.0,
+ '73d!Lambert Lower' : 0.0,
+ '74d!reserved19' : 0,
+ '75f!reserved20' : 0,
+ '76f!reserved21' : 0,
+ '77f!reserved22' : 0,
+ '78f!reserved23' : 0,
+ '79f!reserved24' : 0,
+ '80i!Tex Detail?' : 0,
+ '81i!Tex J' : 0,
+ '82i!Tex K' : 0,
+ '83i!Tex M' : 0,
+ '84i!Tex N' : 0,
+ '85i!Tex Scramble' : 0,
+ '86i!Tex Tile?' : 0,
+ '87f!Tex Tile LLU' : 0.0,
+ '88f!Tex Tile LLV' : 0.0,
+ '89f!Tex Tile URU' : 0.0,
+ '90f!Tex Tile URV' : 0.0,
+ '91i!Projection' : 0,
+ '92i!Earth Model' : 0,
+ '93i!reserved25' : 0,
+ '94i!UTM Zone' : 0,
+ '95i!Image Origin' : 0,
+ '96i!GPU' : 0,
+ '97i!reserved26' : 0,
+ '98i!reserved27' : 0,
+ '99i!GPU Hemi' : 0,
+ '100i!reserved41' : 0,
+ '101i!reserved42' : 0,
+ '102i!reserved43' : 0,
+ '103i!Cubemap' : 0,
+ '104t588!reserved44' : '',
+ '105t512!Comments' : '',
+ '106i!reserved28' : 0,
+ '107i!reserved29' : 0,
+ '108i!reserved30' : 0,
+ '109i!reserved31' : 0,
+ '110i!reserved32' : 0,
+ '111i!reserved33' : 0,
+ '112i!reserved34' : 0,
+ '113i!reserved35' : 0,
+ '114i!reserved36' : 0,
+ '115i!reserved37' : 0,
+ '116i!reserved38' : 0,
+ '117i!reserved39' : 0,
+ '118i!reserved40' : 0,
+ '119i!reserved45' : 0,
+ '120i!Format Version' : 0,
+ '121i!GPU num' : 0,
+}
+
+FLTImageDisplay = [18,19,29,21,22,23,24,25,26,62,63,64,65,66,67,68,69,70,74,75,76,77,78,79,93,97,98,102,114]
+
+FLTHeader = {
+ '3t8!id' : 'db',
+ '4i!version' : 1620,
+ '5i!editversion' : 0,
+ '6t32!date' : 0,
+ '7s!NGID' : 0,
+ '8s!NLID' : 0,
+ '9s!NOID' : 0,
+ '10s!NFID' : 0,
+ '11s!UMULT' : 1,
+ '12c!units' : 0,
+ '13c!set white' : 0,
+ '14I!flags' : 0x80000000,
+ '15i!reserved1' : 0,
+ '16i!reserved2' : 0,
+ '17i!reserved3' : 0,
+ '18i!reserved4' : 0,
+ '19i!reserved5' : 0,
+ '20i!reserved6' : 0,
+ '21i!projection type' : 0,
+ '22i!reserved7' : 0,
+ '23i!reserved8' : 0,
+ '24i!reserved9' : 0,
+ '25i!reserved10' : 0,
+ '26i!reserved11' : 0,
+ '27i!reserved12' : 0,
+ '28i!reserved13' : 0,
+ '29s!NDID' : 0,
+ '30s!vstore' : 1,
+ '31i!origin' : 0,
+ '32d!sw x' : 0,
+ '33d!sw y' : 0,
+ '34d!dx' : 0,
+ '35d!dy' : 0,
+ '36s!NSID' : 0,
+ '37s!NPID' : 0,
+ '38i!reserved14' : 0,
+ '39i!reserved15' : 0,
+ '40s!NCID' : 0,
+ '41s!NTID' : 0,
+ '42s!NBID' : 0,
+ '43s!NWID' : 0,
+ '44i!reserved14' : 0,
+ '45d!sw lat' : 0,
+ '46d!sw lon' : 0,
+ '47d!ne lat' : 0,
+ '48d!ne lon' : 0,
+ '49d!origin lat' : 0,
+ '50d!origin lon' : 0,
+ '51d!lambert lat1' : 0,
+ '52d!lambert lat2' : 0,
+ '53s!NLSID' : 0,
+ '54s!NLPID' : 0,
+ '55s!NRID' : 0,
+ '56s!NCATID' : 0,
+ '57s!reserved15' : 0,
+ '58s!reserved16' : 0,
+ '59s!reserved17' : 0,
+ '60s!reserved18' : 0,
+ '61i!ellipsoid model' : 1,
+ '62s!NAID' : 0,
+ '63s!NCVID' : 0,
+ '64s!utm zone' : 0,
+ '65t6!reserved19' : 0,
+ '66d!dz' : 0,
+ '67d!radius' : 0,
+ '68S!NMID' : 0,
+ '69S!NLPSID' : 0,
+ '70i!reserved20' : 0,
+ '71d!major axis' : 0,
+ '72d!minor axis' : 0,
+}
+
+FLT_Records = {
+ 2 : FLTGroup,
+ 4 : FLTObject,
+ 73 : FLTLOD,
+ 63 : FLTXRef,
+ 14 : FLTDOF,
+ 1 : FLTHeader,
+ 111 : FLTInlineLP,
+ 'Image' : FLTImage
+}
+
+def process_recordDefs():
+ records = dict()
+ for record in FLT_Records:
+ props = dict()
+ for prop in FLT_Records[record]:
+ position = ''
+ slice = 0
+ (format,name) = prop.split('!')
+ for i in format:
+ if i not in typecodes:
+ position = position + i
+ slice = slice + 1
+ else:
+ break
+ type = format[slice:]
+ length = type[1:]
+ if len(length) == 0:
+ length = 1
+ else:
+ type = type[0]
+ length = int(length)
+
+ props[int(position)] = (type,length,prop)
+ records[record] = props
+ return records
+
+
diff --git a/release/scripts/flt_toolbar.py b/release/scripts/flt_toolbar.py
new file mode 100644
index 00000000000..d8a4aa8b4a0
--- /dev/null
+++ b/release/scripts/flt_toolbar.py
@@ -0,0 +1,594 @@
+#!BPY
+
+"""
+Name: 'FLT Toolbar'
+Blender: 240
+Group: 'Misc'
+Tooltip: 'Tools for working with FLT databases'
+"""
+
+__author__ = "Geoffrey Bantle"
+__version__ = "1.0 11/21/07"
+__email__ = ('scripts', 'Author, ')
+__url__ = ('blender', 'elysiun')
+
+__bpydoc__ ="""\
+This script provides tools for working with OpenFlight databases in Blender. OpenFlight is a
+registered trademark of MultiGen-Paradigm, Inc.
+
+Feature overview and more availible at:
+http://wiki.blender.org/index.php/Scripts/Manual/FLTools
+"""
+
+# --------------------------------------------------------------------------
+# flt_palettemanager.py version 0.1 2005/04/08
+# --------------------------------------------------------------------------
+# ***** BEGIN GPL LICENSE BLOCK *****
+#
+# Copyright (C) 2007: Blender Foundation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+# --------------------------------------------------------------------------
+
+import Blender.Draw as Draw
+from Blender.BGL import *
+import Blender
+import flt_properties
+reload(flt_properties)
+from flt_properties import *
+
+xrefprefix = ""
+xrefstack = list()
+vofsstack = list()
+vquatstack = list()
+prop_w = 256
+prop_h = 256
+
+
+#event codes
+evcode = {
+ "XREF_MAKE" : 100,
+ "XREF_EDIT" : 101,
+ "XREF_FILE" : 102,
+ "XREF_PICK" : 103,
+ "XREF_SELECT" : 104,
+ "XREF_POP" : 105,
+ "XREF_PREFIX" : 106,
+ "FACE_NAME" : 200,
+ "FACE_MAKESUB" : 201,
+ "FACE_KILLSUB" : 202,
+ "FACE_SELSUB" : 203,
+ "SCENE_UPDATE" : 303,
+ "IDPROP_COPY" : 501,
+ "IDPROP_KILL" : 502,
+ "CLIGHT_MAKE" : 700
+}
+
+XREF_PREFIX = None
+XREF_MAKE = None
+XREF_EDIT = None
+XREF_SELECT = None
+XREF_POP = None
+FACE_MAKESUB = None
+FACE_SELSUB = None
+FACE_KILLSUB = None
+IDPROP_KILL = None
+IDPROP_COPY = None
+SCENE_UPDATE = None
+CLIGHT_MAKE = None
+
+def update_state():
+ state = dict()
+ state["activeScene"] = Blender.Scene.getCurrent()
+ state["activeObject"] = state["activeScene"].getActiveObject()
+ if state["activeObject"] and not state["activeObject"].sel:
+ state["activeObject"] = None
+ state["activeMesh"] = None
+ if state["activeObject"] and state["activeObject"].type == 'Mesh':
+ state["activeMesh"] = state["activeObject"].getData(mesh=True)
+
+ state["activeFace"] = None
+ if state["activeMesh"]:
+ if state["activeMesh"].faceUV and state["activeMesh"].activeFace != None:
+ state["activeFace"] = state["activeMesh"].faces[state["activeMesh"].activeFace]
+
+ #update editmode
+ state["editmode"] = Blender.Window.EditMode()
+
+ return state
+def pack_face_index(index, intensity):
+ return ((127*intensity)+(128*index))
+def unpack_face_index(face_index):
+ index = face_index / 128
+ intensity = float(face_index - 128.0 * index) / 127.0
+ return(index,intensity)
+
+def idprops_append(object, typecode, props):
+ object.properties["FLT"] = dict()
+ object.properties["FLT"]['type'] = typecode
+ for prop in props:
+ object.properties["FLT"][prop] = props[prop]
+ object.properties["FLT"]['3t8!id'] = object.name
+
+def idprops_kill(object):
+ state = update_state()
+ if object and object.properties.has_key('FLT'):
+ object.properties.pop('FLT')
+
+def idprops_copy(source):
+ state = update_state()
+ if source.properties.has_key('FLT'):
+ for object in state["activeScene"].objects:
+ if object.sel and object != source and (state["activeScene"].Layers & object.Layers):
+ idprops_kill(object)
+ object.properties['FLT'] = dict()
+ for key in source.properties['FLT']:
+ object.properties['FLT'][key] = source.properties['FLT'][key]
+
+def update_all():
+ state = update_state()
+ #update the baked FLT colors for all meshes.
+ for object in state["activeScene"].objects:
+ if object.type == "Mesh":
+ mesh = object.getData(mesh=True)
+ if 'FLT_COL' in mesh.faces.properties:
+ mesh.activeColorLayer = "FLT_Fcol"
+ for face in mesh.faces:
+ (index,intensity) = unpack_face_index(face.getProperty('FLT_COL'))
+ color = struct.unpack('>BBBB',struct.pack('>I',state["colors"][index]))
+ #update the vertex colors for this face
+ for col in face.col:
+ col.r = int(color[0] * intensity)
+ col.g = int(color[1] * intensity)
+ col.b = int(color[2] * intensity)
+ col.a = 255
+
+
+#Change this to find the deep parent
+def xref_create():
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+
+ state = update_state()
+
+ def findchildren(object):
+ children = list()
+ for candidate in state["activeScene"].objects:
+ if candidate.parent == object:
+ children.append(candidate)
+ retlist = list(children)
+ for child in children:
+ retlist = retlist + findchildren(child)
+ return retlist
+
+ actObject = state["activeObject"]
+ if actObject and xrefprefix:
+ scenenames = list()
+ for scene in Blender.Scene.Get():
+ scenenames.append(scene.name)
+
+ if xrefprefix in scenenames:
+ #build a unique name for the xref...
+ suffix = 1
+ found = False
+ while not found:
+ candidate = xrefprefix + str(suffix)
+ if not candidate in scenenames:
+ xrefname = candidate
+ found = True
+ suffix+=1
+ else:
+ xrefname = xrefprefix
+ #create our XRef node
+ xnode = state["activeScene"].objects.new('Empty')
+ xnode.name = 'X:' + xrefname
+ xnode.properties['FLT'] = dict()
+ for prop in FLTXRef:
+ xnode.properties['FLT'][prop] = FLTXRef[prop]
+ xnode.properties['FLT']['3t200!filename'] = xrefname + '.flt'
+ xnode.properties['FLT']['type'] = 63
+ xnode.enableDupGroup = True
+ xnode.DupGroup = Blender.Group.New(xrefname) #this is dangerous... be careful!
+
+ #copy rot and loc of actObject
+ xnode.setLocation(actObject.getLocation())
+ xnode.setEuler(actObject.getEuler())
+
+ #build the new scene
+ xrefscene = Blender.Scene.New(xrefname)
+ xrefscene.properties['FLT'] = dict()
+ xrefscene.properties['FLT']['Filename'] = xrefname
+ xrefscene.properties['FLT']['Main'] = 0
+
+ #find the children of actObject so that we can add them to the group
+ linkobjects = findchildren(actObject)
+ linkobjects.append(actObject)
+ for object in linkobjects:
+ xrefscene.objects.link(object)
+ state["activeScene"].objects.unlink(object)
+ xnode.DupGroup.objects.link(object)
+ #clear rotation of actObject and location
+ actObject.setLocation(0.0,0.0,0.0)
+ actObject.setEuler(0.0,0.0,0.0)
+
+ xrefscene.update(1)
+ state["activeScene"].update(1)
+
+def xref_edit():
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+
+ state = update_state()
+
+ actObject = state["activeObject"]
+
+ if actObject and actObject.type == 'Empty' and actObject.DupGroup:
+# if actObject.properties.has_key('FLT') and actObject.properties['FLT']['type'] == 63:
+ for FLTscene in Blender.Scene.Get():
+ if FLTscene.properties.has_key('FLT') and FLTscene.name == actObject.DupGroup.name:
+ actObject.sel = 0
+ xrefstack.append(state["activeScene"])
+ vofsstack.append(Blender.Window.GetViewOffset())
+ vquatstack.append(Blender.Window.GetViewQuat())
+ FLTscene.makeCurrent()
+ Blender.Window.SetViewOffset(0.0,0.0,0.0)
+
+def xref_finish():
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+
+ state = update_state()
+ if xrefstack:
+ scene = xrefstack.pop()
+ Blender.Window.SetViewQuat(vquatstack.pop())
+ Blender.Window.SetViewOffset(vofsstack.pop())
+ scene.makeCurrent()
+
+
+def sortSub(a,b):
+ aindex = a.getProperty("FLT_ORIGINDEX")
+ bindex = b.getProperty("FLT_ORIGINDEX")
+
+ if aindex > bindex:
+ return 1
+ elif aindex < bindex:
+ return -1
+ return 0
+
+def subface_make():
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+
+ editmode = 0
+ if Blender.Window.EditMode():
+ Blender.Window.EditMode(0)
+ editmode = 1
+
+ state = update_state()
+
+ actmesh = state["activeMesh"]
+ activeFace = state["activeFace"]
+ if actmesh:
+ if not "FLT_ORIGINDEX" in actmesh.faces.properties:
+ actmesh.faces.addPropertyLayer("FLT_ORIGINDEX",Blender.Mesh.PropertyTypes["INT"])
+ for i, face in enumerate(actmesh.faces):
+ face.setProperty("FLT_ORIGINDEX",i)
+ if not "FLT_SFLEVEL" in actmesh.faces.properties:
+ actmesh.faces.addPropertyLayer("FLT_SFLEVEL",Blender.Mesh.PropertyTypes["INT"])
+
+ #attach the subfaces to the active face. Note, this doesnt really work 100 percent properly yet, just enough for one level!
+ if activeFace:
+ #steps:
+ #remove actface and selected faces from the facelist
+ #quicksort facelist
+ #append actface and subfaces to end of facelist.
+ #generate new indices
+ facelist = list()
+ sublist = list()
+ for face in actmesh.faces:
+ facelist.append(face)
+ for face in facelist:
+ if face == activeFace:
+ face.setProperty("FLT_SFLEVEL",0)
+ sublist.insert(0,face)
+ elif face.sel:
+ face.setProperty("FLT_SFLEVEL",1)
+ sublist.append(face)
+ for face in sublist:
+ facelist.remove(face)
+ facelist.sort(sortSub)
+ for face in sublist:
+ facelist.append(face)
+ for i, face in enumerate(facelist):
+ face.setProperty("FLT_ORIGINDEX",i)
+ else:
+ pass
+
+ if editmode:
+ Blender.Window.EditMode(1)
+
+def subface_kill():
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+
+ editmode = 0
+ if Blender.Window.EditMode():
+ Blender.Window.EditMode(0)
+ editmode = 1
+ state = update_state()
+
+ actmesh = state["activeMesh"]
+ if actmesh:
+ if "FLT_ORIGINDEX" in actmesh.faces.properties and "FLT_SFLEVEL" in actmesh.faces.properties:
+ for i,face in enumerate(actmesh.faces):
+ face.setProperty("FLT_ORIGINDEX",i)
+ face.setProperty("FLT_SFLEVEL",0)
+ if editmode:
+ Blender.Window.EditMode(1)
+
+def subface_select():
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+
+ editmode = 0
+ if Blender.Window.EditMode():
+ Blender.Window.EditMode(0)
+ editmode = 1
+ state = update_state()
+
+ actmesh = state["activeMesh"]
+ activeFace = state["activeFace"]
+ if actmesh and activeFace:
+ if "FLT_ORIGINDEX" in actmesh.faces.properties and "FLT_SFLEVEL" in actmesh.faces.properties:
+ facelist = list()
+ actIndex = None
+ sublevel = None
+ for face in actmesh.faces:
+ facelist.append(face)
+ facelist.sort(sortSub)
+ for i, face in enumerate(facelist):
+ if face == activeFace:
+ actIndex = i
+ sublevel = face.getProperty("FLT_SFLEVEL")+1
+ break
+ leftover = facelist[actIndex+1:]
+ for face in leftover:
+ if face.getProperty("FLT_SFLEVEL") == sublevel:
+ face.sel = 1
+ else:
+ break
+ if editmode:
+ Blender.Window.EditMode(1)
+
+def select_by_typecode(typecode):
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+
+ state = update_state()
+
+ for object in state["activeScene"].objects:
+ if object.properties.has_key('FLT') and object.properties['FLT']['type'] == typecode and state["activeScene"].Layers & object.Layers:
+ object.select(1)
+def clight_make():
+ state = update_state()
+ actmesh = state["activeMesh"]
+ actobj = state["activeObject"]
+
+ if actobj and actmesh:
+ actobj.properties['FLT'] = dict()
+ actobj.properties['FLT']['type'] = 111
+ for prop in FLTInlineLP:
+ actobj.properties['FLT'][prop] = FLTInlineLP[prop]
+
+ actmesh.verts.addPropertyLayer("FLT_VCOL", Blender.Mesh.PropertyTypes["INT"])
+ for v in actmesh.verts:
+ v.setProperty("FLT_VCOL", 67295)
+
+def event(evt,val):
+ if evt == Draw.ESCKEY:
+ Draw.Exit()
+
+def but_event(evt):
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+ global evcode
+
+ state = update_state()
+
+ #do Xref buttons
+ if evt == evcode["XREF_PREFIX"]:
+ xrefprefix = XREF_PREFIX.val
+ if evt == evcode["XREF_EDIT"]:
+ xref_edit()
+ if evt == evcode["XREF_SELECT"]:
+ select_by_typecode(63)
+ if evt == evcode["XREF_MAKE"]:
+ xref_create()
+ #do scene buttons
+ if evt == evcode["SCENE_UPDATE"]:
+ update_all()
+ #do face buttons
+ if evt == evcode["FACE_MAKESUB"]:
+ subface_make()
+ if evt== evcode["FACE_KILLSUB"]:
+ subface_kill()
+ if evt== evcode["FACE_SELSUB"]:
+ subface_select()
+ #common buttons
+ if evt == evcode["IDPROP_KILL"]:
+ if state["activeObject"]:
+ idprops_kill(state["activeObject"])
+ if evt == evcode["IDPROP_COPY"]:
+ if state["activeObject"]:
+ idprops_copy(state["activeObject"])
+ if evt == evcode["XREF_POP"]:
+ xref_finish()
+ if evt == evcode["CLIGHT_MAKE"]:
+ clight_make()
+ Draw.Redraw(1)
+ Blender.Window.RedrawAll()
+
+
+def box(x,y,w,h,c,mode):
+ glColor3f(c[0],c[1],c[2])
+ if mode == "outline":
+ glBegin(GL_LINE_LOOP)
+ else:
+ glBegin(GL_POLYGON)
+ glVertex2i(x,y)
+ glVertex2i(x+w,y)
+ glVertex2i(x+w,y+h)
+ glVertex2i(x,y+h)
+ glEnd()
+
+def draw_postcommon(x,y,finaly):
+ global sheetlabel
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+ global evcode
+
+ state = update_state()
+
+ width = prop_w
+ height = prop_h
+
+ #draw the header
+ glColor3f(0.15,0.15,0.15)
+ glBegin(GL_POLYGON)
+ glVertex2i(x-1,y)
+ glVertex2i(x+width+1,y)
+ glVertex2i(x+width+1,y-25)
+ glVertex2i(x-1,y-25)
+ glEnd()
+ glColor3f(1,1,1)
+ glRasterPos2i(x,y-20)
+ sheetlabel = Blender.Draw.Text("FLT Tools Panel")
+ #draw the box outline
+ glColor3f(0,0,0)
+ glBegin(GL_LINE_LOOP)
+ glVertex2i(x-1,y)
+ glVertex2i(x+1+width,y)
+ glVertex2i(x+1+width,finaly-1)
+ glVertex2i(x-1,finaly-1)
+ glEnd()
+ return finaly
+
+
+def draw_propsheet(x,y):
+ global XREF_PREFIX
+ global XREF_MAKE
+ global XREF_EDIT
+ global XREF_SELECT
+ global XREF_POP
+ global FACE_MAKESUB
+ global FACE_SELSUB
+ global FACE_KILLSUB
+ global IDPROP_KILL
+ global IDPROP_COPY
+ global SCENE_UPDATE
+ global CLIGHT_MAKE
+ global xrefprefix
+ global xrefstack
+ global vofsstack
+ global vquatstack
+ global prop_w
+ global prop_h
+ global evcode
+
+ state = update_state()
+
+ width = prop_w
+ height = prop_h
+ origx = x
+ origy = y
+
+ #draw Xref tools
+ y = y-20
+ XREF_PREFIX = Blender.Draw.String("XRef Name:",evcode["XREF_PREFIX"],x,y,width,20,xrefprefix,18,"Xref prefix name, Actual name is generated from this")
+ y = y-20
+ XREF_MAKE = Blender.Draw.PushButton("Make XRef",evcode["XREF_MAKE"],x,y,width,20,"Make External Reference")
+ y = y-20
+ XREF_EDIT = Blender.Draw.PushButton("Edit XRef",evcode["XREF_EDIT"],x,y,width,20,"Edit External Reference")
+ y = y-20
+ XREF_SELECT = Blender.Draw.PushButton("Select XRefs",evcode["XREF_SELECT"],x,y,width,20,"Select External References")
+ y = y - 20
+ XREF_POP = Blender.Draw.PushButton("Return to previous scene",evcode["XREF_POP"],x,y,width,20,"Go up one level in xref hierarchy")
+
+ #Draw facetools
+ y = y-20
+ FACE_MAKESUB = Blender.Draw.PushButton("Make Subfaces",evcode["FACE_MAKESUB"],x,y,width,20,"Make subfaces")
+ y = y-20
+ FACE_SELSUB = Blender.Draw.PushButton("Select Subfaces",evcode["FACE_SELSUB"],x,y,width,20,"Select subfaces")
+ y = y-20
+ FACE_KILLSUB = Blender.Draw.PushButton("Kill Subfaces",evcode["FACE_KILLSUB"],x,y,width,20,"Kill subfaces")
+
+ #Draw ID Property tools
+ y = y - 20
+ IDPROP_KILL = Blender.Draw.PushButton("Delete ID props",evcode["IDPROP_KILL"],x,y,width,20,"Delete ID props")
+ y = y - 20
+ IDPROP_COPY = Blender.Draw.PushButton("Copy to selected",evcode["IDPROP_COPY"],x,y,width,20, "Copy from active to all selected")
+
+ y= y - 20
+ CLIGHT_MAKE = Blender.Draw.PushButton("Make Light Point", evcode["CLIGHT_MAKE"],x,y,width,20,"Create inline light points from current mesh")
+ #General tools
+ y = y-20
+ SCENE_UPDATE = Blender.Draw.PushButton("Update All",evcode["SCENE_UPDATE"],x,y,width,20,"Update all vertex colors")
+ draw_postcommon(origx, origy,y)
+
+def gui():
+ #draw the propsheet/toolbox.
+ psheety = 256
+ #psheetx = psheety + 10
+ draw_propsheet(0,psheety)
+Draw.Register(gui,event,but_event)
+
diff --git a/release/scripts/image_auto_layout.py b/release/scripts/image_auto_layout.py
index a4a9e82955f..19ee396c3b1 100644
--- a/release/scripts/image_auto_layout.py
+++ b/release/scripts/image_auto_layout.py
@@ -42,7 +42,6 @@ This is usefull for game models where 1 image is faster then many, and saves the
# Function to find all the images we use
import Blender as B
-import boxpack2d
from Blender.Mathutils import Vector, RotationMatrix
from Blender.Scene import Render
import BPyMathutils
@@ -162,9 +161,10 @@ class faceGroup(object):
self.ymin= ymin - (PREF_IMAGE_MARGIN/size[1])
self.box_pack=[\
- image.name,\
+ 0.0, 0.0,\
size[0]*(self.xmax - self.xmin),\
- size[1]*(self.ymax - self.ymin)]
+ size[1]*(self.ymax - self.ymin),\
+ image.name]
'''
# default.
@@ -194,8 +194,8 @@ class faceGroup(object):
# X Is flipped :/
#offset_x= (1-(self.box_pack[1]/d)) - (((self.xmax-self.xmin) * self.image.size[0])/d)
- offset_x= self.box_pack[1]/width
- offset_y= self.box_pack[2]/height
+ offset_x= self.box_pack[0]/width
+ offset_y= self.box_pack[1]/height
for f in self.faces:
for uv in f.uv:
@@ -204,7 +204,11 @@ class faceGroup(object):
uv.y= offset_y+ (((uv_rot.y-self.ymin) * self.size[1])/height)
def consolidate_mesh_images(mesh_list, scn, PREF_IMAGE_PATH, PREF_IMAGE_SIZE, PREF_KEEP_ASPECT, PREF_IMAGE_MARGIN): #, PREF_SIZE_FROM_UV=True):
- '''Main packing function'''
+ '''
+ Main packing function
+
+ All meshes from mesh_list must have faceUV else this function will fail.
+ '''
face_groups= {}
for me in mesh_list:
@@ -224,11 +228,11 @@ def consolidate_mesh_images(mesh_list, scn, PREF_IMAGE_PATH, PREF_IMAGE_SIZE, PR
face_groups[image.name]= faceGroup(mesh_list, image, size, PREF_IMAGE_MARGIN)
if not face_groups:
- B.Draw.PupMenu('No Images found in mesh. aborting.')
+ B.Draw.PupMenu('No Images found in mesh(es). Aborting!')
return
if len(face_groups)<2:
- B.Draw.PupMenu('Only 1 image found|Select a mesh using 2 or more images.')
+ B.Draw.PupMenu('Only 1 image found|Select a mesh(es) using 2 or more images.')
return
'''
@@ -286,7 +290,7 @@ def consolidate_mesh_images(mesh_list, scn, PREF_IMAGE_PATH, PREF_IMAGE_SIZE, PR
render_cam_ob= B.Object.New('Camera')
render_cam_ob.link(render_cam_data)
render_scn.link(render_cam_ob)
- render_scn.setCurrentCamera(render_cam_ob)
+ render_scn.objects.camera = render_cam_ob
render_cam_data.type= 'ortho'
render_cam_data.scale= 1.0
@@ -299,8 +303,7 @@ def consolidate_mesh_images(mesh_list, scn, PREF_IMAGE_PATH, PREF_IMAGE_SIZE, PR
# List to send to to boxpack function.
boxes2Pack= [ fg.box_pack for fg in face_groups.itervalues()]
-
- packWidth, packHeight, packedLs = boxpack2d.boxPackIter(boxes2Pack)
+ packWidth, packHeight = B.Geometry.BoxPack2D(boxes2Pack)
if PREF_KEEP_ASPECT:
packWidth= packHeight= max(packWidth, packHeight)
@@ -308,17 +311,17 @@ def consolidate_mesh_images(mesh_list, scn, PREF_IMAGE_PATH, PREF_IMAGE_SIZE, PR
# packedLs is a list of [(anyUniqueID, left, bottom, width, height)...]
# Re assign the face groups boxes to the face_group.
- for box in packedLs:
- face_groups[ box[0] ].box_pack= box # box[0] is the ID (image name)
+ for box in boxes2Pack:
+ face_groups[ box[4] ].box_pack= box # box[4] is the ID (image name)
# Add geometry to the mesh
for fg in face_groups.itervalues():
# Add verts clockwise from the bottom left.
- _x= fg.box_pack[1] / packWidth
- _y= fg.box_pack[2] / packHeight
- _w= fg.box_pack[3] / packWidth
- _h= fg.box_pack[4] / packHeight
+ _x= fg.box_pack[0] / packWidth
+ _y= fg.box_pack[1] / packHeight
+ _w= fg.box_pack[2] / packWidth
+ _h= fg.box_pack[3] / packHeight
render_me.verts.extend([\
Vector(_x, _y, 0),\
@@ -374,10 +377,11 @@ def consolidate_mesh_images(mesh_list, scn, PREF_IMAGE_PATH, PREF_IMAGE_SIZE, PR
for fg in face_groups.itervalues():
fg.move2packed(packWidth, packHeight)
-
+
scn.makeCurrent()
- B.Scene.Unlink(render_scn)
render_me.verts= None # free a tiny amount of memory.
+ B.Scene.Unlink(render_scn)
+ target_image.makeCurrent()
def main():
@@ -422,10 +426,23 @@ def main():
if PREF_ALL_SEL_OBS:
mesh_list= [ob.getData(mesh=1) for ob in scn_objects.context if ob.type=='Mesh']
# Make sure we have no doubles- dict by name, then get the values back.
- mesh_list= dict([(me.name, me) for me in mesh_list]).values()
+
+ for me in mesh_list: me.tag = False
+
+ mesh_list_new = []
+ for me in mesh_list:
+ if me.faceUV and me.tag==False:
+ me.tag = True
+ mesh_list_new.append(me)
+
+ # replace list with possible doubles
+ mesh_list = mesh_list_new
else:
mesh_list= [ob.getData(mesh=1)]
+ if not mesh_list[0].faceUV:
+ B.Draw.PupMenu('Error, active mesh has no images, Aborting!')
+ return
consolidate_mesh_images(mesh_list, scn, PREF_IMAGE_PATH, PREF_IMAGE_SIZE, PREF_KEEP_ASPECT, PREF_IMAGE_MARGIN)
B.Window.RedrawAll()
diff --git a/release/scripts/image_billboard.py b/release/scripts/image_billboard.py
index 2ca1d9d46e4..b1cd9d38891 100644
--- a/release/scripts/image_billboard.py
+++ b/release/scripts/image_billboard.py
@@ -48,11 +48,8 @@ Usage
import Blender as B
import BPyMathutils
-# reload(BPyMathutils)
+import bpy
import BPyRender
-reload(BPyRender)
-import boxpack2d
-# reload(boxpack2d) # for developing.
from Blender.Scene import Render
import os
@@ -60,11 +57,11 @@ Vector= B.Mathutils.Vector
def alpha_mat(image):
# returns a material useable for
- mtl= B.Material.New()
+ mtl= bpy.data.materials.new()
mtl.mode |= (B.Material.Modes.SHADELESS | B.Material.Modes.ZTRANSP | B.Material.Modes.FULLOSA )
mtl.alpha= 0.0 # so image sets the alpha
- tex= B.Texture.New()
+ tex= bpy.data.textures.new()
tex.type= B.Texture.Types.IMAGE
image.antialias = True
tex.setImageFlags('InterPol', 'UseAlpha')
@@ -126,7 +123,7 @@ def save_billboard(PREF_IMAGE_PATH):
camera_matrix= BPyMathutils.plane2mat(plane)
tmp_path= '%s_%d' % (PREF_IMAGE_PATH, i)
img= BPyRender.imageFromObjectsOrtho(ob_sel, tmp_path, PREF_TILE_RES.val, PREF_TILE_RES.val, PREF_AA.val, PREF_ALPHA.val, camera_matrix)
- # img.reload()
+ img.reload()
#img.pack() # se we can keep overwriting the path
#img.filename= ""
@@ -143,24 +140,25 @@ def save_billboard(PREF_IMAGE_PATH):
h= ((plane[1]-plane[2]).length + (plane[3]-plane[0]).length)/2
face_data.append( (f, img, rot90) )
- boxes2Pack.append( (i, h, w) )
+ boxes2Pack.append( [0.0,0.0,h, w, i] )
if PREF_IMG_PACK.val:
# pack the quads into a square
+ packWidth, packHeight = B.Geometry.BoxPack2D(boxes2Pack)
- packWidth, packHeight, packedLs = boxpack2d.boxPackIter(boxes2Pack)
render_obs= []
# Add geometry to the mesh
- for box in packedLs:
- i= box[0]
+ for box in boxes2Pack:
+ i= box[4]
orig_f, img, rot90= face_data[i]
# New Mesh and Object
render_mat= alpha_mat(img)
- render_me= B.Mesh.New()
+ render_me= bpy.data.meshes.new()
+
render_ob= B.Object.New('Mesh')
render_me.materials= [render_mat]
render_ob.link(render_me)
@@ -168,10 +166,10 @@ def save_billboard(PREF_IMAGE_PATH):
render_obs.append(render_ob)
# Add verts clockwise from the bottom left.
- _x= box[1] / packWidth
- _y= box[2] / packHeight
- _w= box[3] / packWidth
- _h= box[4] / packHeight
+ _x= box[0] / packWidth
+ _y= box[1] / packHeight
+ _w= box[2] / packWidth
+ _h= box[3] / packHeight
render_me.verts.extend([\
@@ -224,12 +222,11 @@ def save_billboard(PREF_IMAGE_PATH):
def main():
- scn= B.Scene.GetCurrent()
+ scn= bpy.data.scenes.active
ob_sel= list(scn.objects.context)
PREF_KEEP_ASPECT= False
-
# Error Checking
if len(ob_sel) < 2:
B.Draw.PupMenu("Error%t|Select 2 mesh objects")
@@ -257,8 +254,6 @@ def main():
return
-
-
# Get user input
block = [\
'Image Pixel Size',\
diff --git a/release/scripts/import_dxf.py b/release/scripts/import_dxf.py
index a4e4e69b366..2a1081420e4 100644
--- a/release/scripts/import_dxf.py
+++ b/release/scripts/import_dxf.py
@@ -1,54 +1,197 @@
#!BPY
-# """
-# Name: 'Drawing eXchange Format (.dxf)'
-# Blender: 243
-# Group: 'Import'
-# Tooltip: 'Import DXF file.'
-# """
-__author__ = 'Kitsu (Ed Blake)'
-__version__ = '0.9 1/2007'
-__url__ = ["elysiun.com", "BlenderArtists.org"]
-__email__ = ["Kitsune_e@yahoo.com"]
+"""
+Name: 'Autodesk DXF (.dxf)'
+Blender: 244
+Group: 'Import'
+Tooltip: 'Import for DXF geometry data (Drawing eXchange Format).'
+"""
+__author__ = 'Kitsu(Ed Blake) & migius(Remigiusz Fiedler)'
+__version__ = '1.0.11 - 2007.11.17 by migius'
+__url__ = ["http://blenderartists.org/forum/showthread.php?t=84319",
+ "http://wiki.blender.org/index.php/Scripts/Manual/Import/DXF-3D"]
+__email__ = ["Kitsune_e(at)yahoo.com", "migius(at)4d-vectors.de"]
__bpydoc__ = """\
-This is a Blender import script for dxf files.
-
-This script imports the dxf Geometery from dxf versions 2007 and earlier.
-
-Supported:<br>
- At this time only mesh based imports are supported.<br>
- Future support for all curve import is planned.<br>
- <br>
-Currently Supported DXF Ojects:<br>
- Lines<br>
- LightWeight polylines<br>
- True polylines<br>
- Text<br>
- Mtext<br>
- Circles<br>
- Arcs<br>
- Ellipses<br>
- Blocks<br>
- 3Dfaces<br>
-
-Known issues:<br>
- Does not convert perfectly between Object Coordinate System (OCS)
- and World Coordinate System (WCS). Only rudimentary support for
- true polylines have been implimented - splines/fitted curves/
- 3d plines/polymeshes are not supported.
- No support for most 3d entities. Doesn't support the new style object
- visability. There are problems importing some curves/arcs/circles.
-
-Notes:<br>
- This is primarally a 2d drawing release. Currently only support for
- 3d faces has been added.
- Blocks are created on layer 19 then referenced at each insert point. The
- insert point is designated with a small 3d crosshair. This handle does not render.
+This script imports DXF objects (2d/3d) into Blender.
+
+This script imports 2d and 3d Geometery from DXFr12 format files.
+This version is focused on import of 3d-objects.
+
+Supported DXF Objects:
+LINE,
+POINT,
+SOLID,
+TRACE,
+TEXT,
+INSERT (=block),
+MINSERT (=arrays of blocks),
+CIRCLE,
+ARC,
+3DFACE,
+2d-POLYLINE (=plane, incl. arc, variable-width, curve, spline),
+3d-POLYLINE (=non-plane polylines),
+3d-POLYMESH,
+3d-POLYFACE
+
+under construction, partly supported DXF>r12 Objects:
+LWPOLYLINE (LightWeight), MLINE, MTEXT, ELLIPSE
+
+Unsupported DXF Objects:
+DXF r12: DIMENSION, XREF (External Reference),
+DXF>r12: SPLINE, GROUP, RAY/XLINE, LEADER, 3DSOLID, BODY, REGION, dynamic BLOCK
+
+Supported Properties:
+Hierarchy: Entire DXF BLOCKs hierarchy is preserved after import into Blender
+visibility, frozen,
+COLOR, LAYER,
+thickness, width,
+(todo: grouped, XDATA)
+It is recommended to use DXF-object properties for coding Blender materials.
+
+Notes:
+- Recommend that you run 'RemoveDoubles' on each imported mesh after using this script
+- Blocks are created on layer 19 then referenced at each insert point.
+- Big DXF-files (over 1500 objects) decrease import performance. The problem is not the inefficiency of python-scripting but Blenders performance in creating new objects in his database - probably a database management problem.
+
+TODO:
+- the new style object visibility
+- support for real 3d-solids (ACIS)
+- (to see more, search for "-todo-" in script)
+
+"""
+
+"""
+History:
+ v1.0 - 2007.11. by migius: "full 3d"-release
+ planned tasks:
+ -- command-line-mode/batch-mode
+ -- in-place-editing for dupliGroups
+ -- filtering of unused/not-inserted BLOCKs
+ -- support for MLine
+ -- support for Ellipse
+ -- support for Mtext
+ -- blender_object.ID.properties[dxf_layer_name]
+ -- better support for long dxf-layer-names
+ -- Configuration files(.ini) should/can handle various material setups
+ -- added f_layerFilter
+ -- to-check: obj/mat/group/_mapping-idea from ideasman42:
+ -- curves: added "fill/non-fill" option for closed curves: CIRCLEs,ELLIPSEs,POLYLINEs
+ -- bug:? object = Object.Get(obname) -> = SCENE.getChildren(obname)
+ -- "normalize Z" option to correct non-planar figures
+ -- LINEs need "width" in 3d-space incl vGroups
+ -- support width_force for LINEs/ELLIPSEs = "solidify"
+ -- bug: dxf-files without layer-section missing layersmap{}
+ -- color BYLAYER=256,BYBLOCK=0
+ -- blocknames conventions length
+ v1.0.11: 2007.11.17 by migius
+ c4 added "analyze DXF-file" UI-option: print LAYER/BLOCK-dependences into a textfile
+ c3 human-formating of data in INI-Files
+ c2 added "caps" for closed Bezier-curves
+ c2 added "set elevation" UI-option
+ c1 rewrite POLYLINE2d-arc-segments Bezier-interpreter
+ b9 many bugs fixed
+ b9 rewrite POLYLINE2d-arc-segments trimming (clean-trim)
+ b8 added "import from frozen layers" UI-option
+ b8 added "import from paper space" UI-option
+ b8 support Bezier curves for LINEs incl.thickness(0.0-10.0)
+ b8 added meshSmooth_on for circle/arc/polyline
+ b8 added vertexGroups for circle/arc
+ b7 added width_force for ARCs/CIRCLEs = "thin_box" option
+ b3 cleanup code, rename f_drawArc/Bulg->f_calcArc/Bulg
+ b2 fixing material assignment by LAYER+COLOR
+ b1 fixing Bezier curves representation of POLYLINEs-arc-segments
+ b0 added global_scale_presets: "yard/feet/inch to meter"
+ v1.0.10: 2007.10.18 by migius
+ a6 bugfix CircleDrawCaps for OSX
+ a5 added two "curve_res" UI-buttons for Bezier curves representation
+ a5 improved Bezier curves representation of circles/arcs: correct handlers
+ a4 first try to fix malformed endpoints of Blender curves of imported ARCs and POLYLINE-arc segments.
+ a3 bugfix: open POLYLINEs with end_point.loc==start_point.loc
+ a2 bugfix: f_transform for OCS=(0,0,-1) oriented objects
+ a1 added "fill_on" option to draw top and bottom sides of CIRCLEs and ELLIPSEs
+ a1 rewrite f_CIRCLE.Draw: from Mesh.Primitive to Mesh
+ a1 bugfix "newScene"-mode: Cylinders/Arcs were drawn at <0,0,0>location
+ beta09: 2007.09.02 by migius
+ g5 redesign UI: grouping of buttons
+ g3 update multi-import-mode: <*.*> button
+ g- added multi-import-mode: (path/*) for importing many dxf-files at once
+ g- added import into newScene
+ g- redesign UI: user presets, into newScene-import
+ f- cleanup code
+ f- bugfix: thickness for Bezier/Bsplines into Blender-curves
+ f- BlenderWiki documentation, on-line Manual
+ f- added import POLYLINE-Bsplines into Blender-NURBSCurves
+ f- added import POLYLINE-arc-segments into Blender-BezierCurves
+ f- added import POLYLINE-Bezier-curves into Blender-Curves
+ d5 rewrite: Optimization Levels, added 'directDrawing'
+ d4 added: f_set_thick(cntrolled by ini-parameters)
+ d4 bugfix: face-normals in objects with minus thickness
+ d4 added: placeholder'Empty'-size in f_Insert.draw
+ d3 rewrite f_Text.Draw: added support for all Text's parameters
+ d2 redesign: progressbar
+ e- tuning by ideasman42: better use of the Py API.
+ c- tuning by ideasman42
+ b- rewrite f_Text.Draw rotation/transform
+ b- bugfix: POLYLINE-segment-intersection more reliable now
+ b- bugfix: circle:_thic, 'Empties':no material_assignment
+ b- added material assignment (from layer and/or color)
+ a- added empty, cylinder and UVsphere for POINTs
+ a- added support for 2d-POLYLINE: splines, fitted curves, fitted surfaces
+ a- redesign f_Drawer for block_definitions
+ a- rewrite import into Blender-Curve-Object
+ beta08: 2007.07.27 by migius
+ l- bugfix: solid_vgroups, clean:scene.objects.new()
+ l- redesign UI to standard Draw.Register+FileSelector, advanced_config_option
+ k- bugfix UI:fileSelect() for MacOSX os.listdir()
+ k- added reset/save/load for config-data
+ k- redesign keywords/drawTypes/Draw.Create_Buttons
+ j- new interface using UIBlock() with own FileSelector, cause Window.FileSelector() too buggy
+ i- rewritten Class:Settings for better config-parameter management
+ h- bugfix: face-normals in objects with minus thickness
+ h- added Vertex-Groups in polylines and solids generated Meshes, for easier material assignment
+ h- beautify code, whitespace->tabs
+ h- added settings.thic_force switch for forcing thickness
+ h- added one Object/Mesh for all simple-entities from the same Layer,
+ sorted in Vertex-Groups(color_name) (fewer objects = better import performance)
+ g- rewrote: insert-point-handle-object is a small tetrahedron
+ e- bugfix: closed-polymesh3d
+ - rewrote: startUI, type_map.keys, f_drawer, for all class_f_draw(added "settings" as attribut)
+ - added 2d/3d-support for Polyline_Width incl. angle intersection
+ beta07: 2007.06.19 by migius
+ - added 3d-support for LWPolylines
+ - added 2d/3d-support for Points
+ beta06: 2007.06.15 by migius
+ - cleanup code
+ - added 2d/3d-support for MINSERT=BlockArray in f_drawer, added f_rotXY_Vec
+ beta05: 2007.06.14 by migius
+ - added 2d/3d-support for 3d-PolyLine, PolyMesh and PolyFace
+ - added Global-Scale for size control of imported scenes
+ beta04: 2007.06.12 by migius
+ - rewrote the f_calcBulge for correct import the arc-segments of Polylines
+ beta03: 2007.06.10 by migius
+ - rewrote interface
+ beta02: 2007.06.09 by migius
+ - added 3d-support for Arcs and Circles
+ - added support for Object_Thickness(=height)
+ beta01: 2007.06.08 by migius
+ - added 3d-support for Blocks/Inserts within nested-structures
+ - rewrote f_transform for correct 3d-location/3d-rotation
+ - added 3d-support Lines, 3dFaces
+ - added 2d+3d-support for Solids and Traces
+
+ v0.9 - 2007.01 by kitsu: (for 2.43)
+ -
+
+ v0.8 - 2006.12 by kitsu:
+ -
+
+ v0.5b - 2006.10 by kitsu: (for 2.42a)
+ -
"""
# --------------------------------------------------------------------------
-# DXF Import v0.9 by Ed Blake (AKA Kitsu)
+# DXF Import v1.0 by Ed Blake (AKA kitsu) and Remigiusz Fiedler (AKA migius)
# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK *****
#
@@ -70,2195 +213,4683 @@ Notes:<br>
# --------------------------------------------------------------------------
import Blender
+#import bpy
from Blender import *
-Sys = sys
+#from Blender.Mathutils import Vector, Matrix
+#import BPyMessages
-from dxfReader import readDXF, get_name, get_layer
+from dxfReader import readDXF
+#from dxfReader import get_name, get_layer
from dxfReader import Object as dxfObject
from dxfColorMap import color_map
+
from math import *
try:
- import os
- if os.name:# != 'mac':
- import psyco
- psyco.log()
- psyco.full(memory=100)
- psyco.profile(0.05, memory=100)
- psyco.profile(0.2)
+ import os
+ if os.name:# != 'mac':
+ import psyco
+ psyco.log(Blender.Get('tempdir')+"/blender.log-psyco")
+ #psyco.log()
+ psyco.full(memory=100)
+ psyco.profile(0.05, memory=100)
+ psyco.profile(0.2)
+ #print 'psyco imported'
except ImportError:
- pass
+ #print 'psyco not imported'
+ pass
+
+print '\n\n\n\n'
+print 'Import DXF to Blender *** start ***' #---------------------
-SCENE = Scene.GetCurrent()
+SCENE = None
WORLDX = Mathutils.Vector((1,0,0))
+WORLDY = Mathutils.Vector((1,1,0))
+WORLDZ = Mathutils.Vector((0,0,1))
+
+G_SCALE = 1.0 #(0.0001-1000) global scaling factor for all dxf data
+MIN_DIST = 0.001 #cut-off value for sort out short-distance polyline-"duoble_vertex"
+ARC_RESOLUTION = 64 #(4-500) arc/circle resolution - number of segments
+ARC_RADIUS = 1.0 #(0.01-100) arc/circle radius for number of segments algorithm
+CURV_RESOLUTION = 12 #(3-50) Bezier curves resolution
+CURVARC_RESOLUTION = 4 #(3-32) resolution of circle represented as Bezier curve
+THIN_RESOLUTION = 8 #(4-64) thin_cylinder arc_resolution - number of segments
+MIN_THICK = MIN_DIST * 10.0 #minimal thickness by forced thickness
+MIN_WIDTH = MIN_DIST * 10.0 #minimal width by forced width
+TRIM_LIMIT = 3.0 #limit for triming of polylines-wide-segments (values:0.0 - 5.0)
+ELEVATION = 0.0 #standard elevation = coordinate Z
+
+TARGET_LAYER = 3 #target blender_layer
+GROUP_BYLAYER = 0 #(0/1) all entities from same layer import into one blender-group
+
+FILENAME_MAX = 180 #max length of path+file_name string (FILE_MAXDIR + FILE_MAXFILE)
+MAX_NAMELENGTH = 17 #max_effective_obnamelength in blender =21=17+(.001)
+INIFILE_DEFAULT_NAME = 'importDXF'
+INIFILE_EXTENSION = '.ini'
+INIFILE_HEADER = 'ImportDXF.py ver.1.0 config data'
+INFFILE_HEADER = 'ImportDXF.py ver.1.0 analyze of DXF-data'
+
AUTO = BezTriple.HandleTypes.AUTO
-BYLAYER=256
+FREE = BezTriple.HandleTypes.FREE
+VECT = BezTriple.HandleTypes.VECT
+ALIGN = BezTriple.HandleTypes.ALIGN
+cur_COUNTER = 0 #counter for progress_bar
+
+
"""This module provides wrapper objects for dxf entities.
-
- The wrappers expect a "dxf object" as input. The dxf object is
- an object with a type and a data attribute. Type is a lowercase
- string matching the 0 code of a dxf entity. Data is a list containing
- dxf objects or lists of [code, data] pairs.
-
- This module is not general, and is only for dxf import.
+
+ The wrappers expect a "dxf object" as input. The dxf object is
+ an object with a type and a data attribute. Type is a lowercase
+ string matching the 0 code of a dxf entity. Data is a list containing
+ dxf objects or lists of [code, data] pairs.
+
+ This module is not general, and is only for dxf import.
"""
# from Stani's dxf writer v1.1 (c)www.stani.be (GPL)
#---color values
-BYBLOCK=0
-BYLAYER=256
+BYBLOCK = 0
+BYLAYER = 256
-#---block-type flags (bit coded values, may be combined):
-ANONYMOUS =1 # This is an anonymous block generated by hatching, associative dimensioning, other internal operations, or an application
+#---block-type flags (bit coded values, may be combined):
+ANONYMOUS =1 # This is an anonymous block generated by hatching, associative dimensioning, other internal operations, or an application
NON_CONSTANT_ATTRIBUTES =2 # This block has non-constant attribute definitions (this bit is not set if the block has any attribute definitions that are constant, or has no attribute definitions at all)
-XREF =4 # This block is an external reference (xref)
-XREF_OVERLAY =8 # This block is an xref overlay
-EXTERNAL =16 # This block is externally dependent
-RESOLVED =32 # This is a resolved external reference, or dependent of an external reference (ignored on input)
-REFERENCED =64 # This definition is a referenced external reference (ignored on input)
+XREF =4 # This block is an external reference (xref)
+XREF_OVERLAY =8 # This block is an xref overlay
+EXTERNAL =16 # This block is externally dependent
+RESOLVED =32 # This is a resolved external reference, or dependent of an external reference (ignored on input)
+REFERENCED =64 # This definition is a referenced external reference (ignored on input)
+
+#---polyline flags
+CLOSED =1 # This is a closed polyline (or a polygon mesh closed in the M direction)
+CURVE_FIT =2 # Curve-fit vertices have been added
+SPLINE_FIT =4 # Spline-fit vertices have been added
+POLYLINE_3D =8 # This is a 3D polyline
+POLYGON_MESH =16 # This is a 3D polygon mesh
+CLOSED_N =32 # The polygon mesh is closed in the N direction
+POLYFACE_MESH =64 # The polyline is a polyface mesh
+CONTINOUS_LINETYPE_PATTERN =128 # The linetype pattern is generated continuously around the vertices of this polyline
+
+#---text flags
+#horizontal
+LEFT = 0
+CENTER = 1
+RIGHT = 2
+ALIGNED = 3 #if vertical alignment = 0
+MIDDLE = 4 #if vertical alignment = 0
+FIT = 5 #if vertical alignment = 0
+#vertical
+BASELINE = 0
+BOTTOM = 1
+MIDDLE = 2
+TOP = 3
#---mtext flags
#attachment point
-TOP_LEFT = 1
-TOP_CENTER = 2
-TOP_RIGHT = 3
-MIDDLE_LEFT = 4
+TOP_LEFT = 1
+TOP_CENTER = 2
+TOP_RIGHT = 3
+MIDDLE_LEFT = 4
MIDDLE_CENTER = 5
-MIDDLE_RIGHT = 6
-BOTTOM_LEFT = 7
+MIDDLE_RIGHT = 6
+BOTTOM_LEFT = 7
BOTTOM_CENTER = 8
-BOTTOM_RIGHT = 9
+BOTTOM_RIGHT = 9
#drawing direction
-LEFT_RIGHT = 1
-TOP_BOTTOM = 3
-BY_STYLE = 5 #the flow direction is inherited from the associated text style
-#line spacing style (optional):
-AT_LEAST = 1 #taller characters will override
-EXACT = 2 #taller characters will not override
+LEFT_RIGHT = 1
+TOP_BOTTOM = 3
+BY_STYLE = 5 #the flow direction is inherited from the associated text style
+#line spacing style (optional):
+AT_LEAST = 1 #taller characters will override
+EXACT = 2 #taller characters will not override
-#---polyline flags
-CLOSED =1 # This is a closed polyline (or a polygon mesh closed in the M direction)
-CURVE_FIT =2 # Curve-fit vertices have been added
-SPLINE_FIT =4 # Spline-fit vertices have been added
-POLYLINE_3D =8 # This is a 3D polyline
-POLYGON_MESH =16 # This is a 3D polygon mesh
-CLOSED_N =32 # The polygon mesh is closed in the N direction
-POLYFACE_MESH =64 # The polyline is a polyface mesh
-CONTINOUS_LINETYPE_PATTERN =128 # The linetype pattern is generated continuously around the vertices of this polyline
-#---text flags
-#horizontal
-LEFT = 0
-CENTER = 1
-RIGHT = 2
-ALIGNED = 3 #if vertical alignment = 0
-MIDDLE = 4 #if vertical alignment = 0
-FIT = 5 #if vertical alignment = 0
-#vertical
-BASELINE = 0
-BOTTOM = 1
-MIDDLE = 2
-TOP = 3
-class Layer:
- """Class for objects representing dxf layers."""
-
- def __init__(self, obj, name=None, color=None, frozen=None):
- """Expects an entity object of type line as input."""
- self.type = obj.type
- self.data = obj.data[:]
-
- if name:
- self.name = name
- else:
- self.name = obj.get_type(2)[0]
- if color:
- self.color = color
- else:
- self.color = obj.get_type(62)[0]
- if frozen:
- self.frozen = frozen
- else:
- self.flags = obj.get_type(70)[0]
- self.frozen = self.flags&1
-
- def __repr__(self):
- return "%s: name - %s, color - %s" %(self.__class__.__name__, self.name, self.color)
-
-
-
-class Line:
- """Class for objects representing dxf lines."""
-
- def __init__(self, obj):
- """Expects an entity object of type line as input."""
- if not obj.type == 'line':
- raise TypeError, "Wrong type %s for line object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.points = self.get_points(obj.data)
-
-
-
-
- def get_points(self, data):
- """Gets start and end points for a line type object.
-
- Lines have a fixed number of points (two) and fixed codes for each value.
- """
-
- # start x, y, z and end x, y, z = 0
- sx, sy, sz, ex, ey, ez = 0, 0, 0, 0, 0, 0
- for item in data:
- if item[0] == 10: # 10 = x
- sx = item[1]
- elif item[0] == 20: # 20 = y
- sy = item[1]
- elif item[0] == 30: # 30 = z
- sz = item[1]
- elif item[0] == 11: # 11 = x
- ex = item[1]
- elif item[0] == 21: # 21 = y
- ey = item[1]
- elif item[0] == 31: # 31 = z
- ez = item[1]
- return [[sx, sy, sz], [ex, ey, ez]]
-
-
-
- def __repr__(self):
- return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
-
-
- def draw(self, curves=False):
- """Do all the specific things needed to import lines into Blender."""
- # Generate the geometery
- points = self.points
- edges = [[0, 1]]
-
- me = Mesh.New('line') # create a new mesh
-
- me.verts.extend(points) # add vertices to mesh
- me.edges.extend(edges) # add edges to the mesh
-
- # Now Create an object
- ob = Object.New('Mesh', 'line') # link mesh to an object
- ob.link(me)
-
- return ob
-
-
-
-
-class LWpolyline:
- """Class for objects representing dxf LWpolylines."""
-
- def __init__(self, obj):
- """Expects an entity object of type lwpolyline as input."""
- if not obj.type == 'lwpolyline':
- raise TypeError, "Wrong type %s for polyline object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- # required data
- self.num_points = obj.get_type(90)[0]
-
- # optional data (with defaults)
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- self.elevation = obj.get_type(38)
- if self.elevation:
- self.elevation = self.elevation[0]
- else:
- self.elevation = 0
-
- self.flags = obj.get_type(70)
- if self.flags:
- self.flags = self.flags[0]
- else:
- self.flags = 0
-
- self.closed = self.flags&1 # byte coded, 1 = closed, 128 = plinegen
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.points = self.get_points(obj.data)
- self.extrusion = self.get_extrusion(obj.data)
-
-
-
-
-
-
- def get_points(self, data):
- """Gets points for a polyline type object.
-
- Polylines have no fixed number of verts, and
- each vert can have a number of properties.
- Verts should be coded as
- 10:xvalue
- 20:yvalue
- 40:startwidth or 0
- 41:endwidth or 0
- 42:bulge or 0
- for each vert
- """
- num = self.num_points
- point = None
- points = []
- for item in data:
- if item[0] == 10: # 10 = x
- if point:
- points.append(point)
- point = Vertex()
- point.x = item[1]
- elif item[0] == 20: # 20 = y
- point.y = item[1]
- elif item[0] == 40: # 40 = start width
- point.swidth = item[1]
- elif item[0] == 41: # 41 = end width
- point.ewidth = item[1]
- elif item[0] == 42: # 42 = bulge
- point.bulge = item[1]
- points.append(point)
- return points
-
-
- def get_extrusion(self, data):
- """Find the axis of extrusion.
-
- Used to get the objects Object Coordinate System (ocs).
- """
- vec = [0,0,1]
- for item in data:
- if item[0] == 210: # 210 = x
- vec[0] = item[1]
- elif item[0] == 220: # 220 = y
- vec[1] = item[1]
- elif item[0] == 230: # 230 = z
- vec[2] = item[1]
- return vec
-
-
- def __repr__(self):
- return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
-
-
- def draw(self, curves=False):
- """Do all the specific things needed to import plines into Blender."""
- # Generate the geometery
- points = []
- for i in range(len(self.points)):
- point = self.points[i]
- if not point.bulge:
- points.append(point.loc)
- elif point.bulge and i < len(self.points)-1:# > 0:
- center, radius, start, end = solveBulge(point, self.points[i+1])
- #print center, radius, start, end
- verts, nosense = drawArc(center, radius, start, end)
- verts.pop(0) # remove first
- verts.pop() #remove last
- if point.bulge >= 0:
- verts.reverse()
- points.extend(verts)
- edges = [[num, num+1] for num in range(len(points)-1)]
- if self.closed:
- edges.append([len(self.points)-1, 0])
-
- me = Mesh.New('lwpline') # create a new mesh
-
- me.verts.extend(points) # add vertices to mesh
- me.edges.extend(edges) # add edges to the mesh
-
- # Now Create an object
- ob = Object.New('Mesh', 'lwpline') # link mesh to an object
- ob.link(me)
- transform(self.extrusion, ob)
- ob.LocZ = self.elevation
-
- return ob
-
-
-
-class Polyline:
- """Class for objects representing dxf LWpolylines."""
-
- def __init__(self, obj):
- """Expects an entity object of type polyline as input."""
- if not obj.type == 'polyline':
- raise TypeError, "Wrong type %s for polyline object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
- self.points = []
-
- # optional data (with defaults)
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- self.elevation = obj.get_type(30)
- if self.elevation:
- self.elevation = self.elevation[0]
- else:
- self.elevation = 0
-
- self.flags = obj.get_type(70)
- if self.flags:
- self.flags = self.flags[0]
- else:
- self.flags = 0
-
- self.closed = self.flags&1 # byte coded, 1 = closed, 128 = plinegen
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.extrusion = self.get_extrusion(obj.data)
-
-
-
-
-
- def get_extrusion(self, data):
- """Find the axis of extrusion.
-
- Used to get the objects Object Coordinate System (ocs).
- """
- vec = [0,0,1]
- for item in data:
- if item[0] == 210: # 210 = x
- vec[0] = item[1]
- elif item[0] == 220: # 220 = y
- vec[1] = item[1]
- elif item[0] == 230: # 230 = z
- vec[2] = item[1]
- return vec
-
-
- def __repr__(self):
- return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
-
-
- def draw(self, curves=False):
- """Do all the specific things needed to import plines into Blender."""
- # Generate the geometery
- points = []
- for i in range(len(self.points)):
- point = self.points[i]
- if not point.bulge:
- points.append(point.loc)
- elif point.bulge and i < len(self.points)-1:# > 0:
- center, radius, start, end = solveBulge(point, self.points[i+1])
- #print center, radius, start, end
- verts, nosense = drawArc(center, radius, start, end)
- verts.pop(0) # remove first
- verts.pop() #remove last
- if point.bulge >= 0:
- verts.reverse()
- points.extend(verts)
- edges = [[num, num+1] for num in range(len(points)-1)]
- if self.closed:
- edges.append([len(self.points)-1, 0])
-
- me = Mesh.New('pline') # create a new mesh
-
- me.verts.extend(points) # add vertices to mesh
- me.edges.extend(edges) # add edges to the mesh
-
- # Now Create an object
- ob = Object.New('Mesh', 'pline') # link mesh to an object
- ob.link(me)
- transform(self.extrusion, ob)
- ob.LocZ = self.elevation
-
- return ob
-
-
-
-
-class Vertex(object):
- """Generic vertex object used by polylines (and maybe others)."""
-
- def __init__(self, obj=None):
- """Initializes vertex data.
-
- The optional obj arg is an entity object of type vertex.
- """
- self.loc = [0,0,0]
- self.bulge = 0
- self.swidth = 0
- self.ewidth = 0
- self.flags = 0
-
- if obj is not None:
- if not obj.type == 'vertex':
- raise TypeError, "Wrong type %s for vertex object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- self.get_props(obj.data)
-
-
- def get_props(self, data):
- """Gets coords for a vertex type object.
-
- Each vert can have a number of properties.
- Verts should be coded as
- 10:xvalue
- 20:yvalue
- 40:startwidth or 0
- 41:endwidth or 0
- 42:bulge or 0
- """
- for item in data:
- if item[0] == 10: # 10 = x
- self.x = item[1]
- elif item[0] == 20: # 20 = y
- self.y = item[1]
- elif item[0] == 30: # 30 = z
- self.z = item[1]
- elif item[0] == 40: # 40 = start width
- self.swidth = item[1]
- elif item[0] == 41: # 41 = end width
- self.ewidth = item[1]
- elif item[0] == 42: # 42 = bulge
- self.bulge = item[1]
- elif item[0] == 70: # 70 = vert flags
- self.flags = item[1]
-
-
- def __len__(self):
- return 3
-
-
- def __getitem__(self, key):
- return self.loc[key]
-
-
- def __setitem__(self, key, value):
- if key in [0,1,2]:
- self.loc[key]
-
-
- def __iter__(self):
- return self.loc.__iter__()
-
-
- def __str__(self):
- return str(self.loc)
-
-
- def __repr__(self):
- return "Vertex %s, swidth=%s, ewidth=%s, bulge=%s" %(self.loc, self.swidth, self.ewidth, self.bulge)
-
-
- def getx(self):
- return self.loc[0]
-
- def setx(self, value):
- self.loc[0] = value
-
- x = property(getx, setx)
-
-
- def gety(self):
- return self.loc[1]
-
- def sety(self, value):
- self.loc[1] = value
-
- y = property(gety, sety)
-
-
- def getz(self):
- return self.loc[2]
-
- def setz(self, value):
- self.loc[2] = value
-
- z = property(getz, setz)
-
-
-
-class Text:
- """Class for objects representing dxf Text."""
-
- def __init__(self, obj):
- """Expects an entity object of type text as input."""
- if not obj.type == 'text':
- raise TypeError, "Wrong type %s for text object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- # required data
- self.height = obj.get_type(40)[0]
- self.value = obj.get_type(1)[0] # The text string value
-
- # optional data (with defaults)
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- self.rotation = obj.get_type(50) # radians?
- if not self.rotation:
- self.rotation = 0
- else:
- self.rotation = self.rotation[0]
-
- self.width_factor = obj.get_type(41) # Scaling factor along local x axis
- if not self.width_factor:
- self.width_factor = 1
- else:
- self.width_factor = self.width_factor[0]
-
- self.oblique = obj.get_type(51) # skew in degrees -90 <= oblique <= 90
- if not self.oblique:
- self.oblique = 0
- else:
- self.oblique = self.oblique[0]
-
- self.halignment = obj.get_type(72) # horiz. alignment
- if not self.halignment: # 0=left, 1=center, 2=right, 3=aligned, 4=middle, 5=fit
- self.halignment = 0
- else:
- self.halignment = self.halignment[0]
-
- self.valignment = obj.get_type(73) # vert. alignment
- if not self.valignment: # 0=baseline, 1=bottom, 2=middle, 3=top
- self.valignment = 0
- else:
- self.valignment = self.valignment[0]
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.loc = self.get_loc(obj.data, self.halignment, self.valignment)
- self.extrusion = self.get_extrusion(obj.data)
-
-
-
-
- def get_loc(self, data, halign, valign):
- """Gets adjusted location for text type objects.
-
- If group 72 and/or 73 values are nonzero then the first alignment point values
- are ignored and AutoCAD calculates new values based on the second alignment
- point and the length and height of the text string itself (after applying the
- text style). If the 72 and 73 values are zero or missing, then the second
- alignment point is meaningless.
-
- I don't know how to calc text size...
- """
- # bottom left x, y, z and justification x, y, z = 0
- x, y, z, jx, jy, jz = 0, 0, 0, 0, 0, 0
- for item in data:
- if item[0] == 10: # 10 = x
- x = item[1]
- elif item[0] == 20: # 20 = y
- y = item[1]
- elif item[0] == 30: # 30 = z
- z = item[1]
- elif item[0] == 11: # 11 = x
- jx = item[1]
- elif item[0] == 21: # 21 = y
- jy = item[1]
- elif item[0] == 31: # 31 = z
- jz = item[1]
-
- if halign or valign:
- x, y, z = jx, jy, jz
- return [x, y, z]
-
- def get_extrusion(self, data):
- """Find the axis of extrusion.
-
- Used to get the objects Object Coordinate System (ocs).
- """
- vec = [0,0,1]
- for item in data:
- if item[0] == 210: # 210 = x
- vec[0] = item[1]
- elif item[0] == 220: # 220 = y
- vec[1] = item[1]
- elif item[0] == 230: # 230 = z
- vec[2] = item[1]
- return vec
-
-
- def __repr__(self):
- return "%s: layer - %s, value - %s" %(self.__class__.__name__, self.layer, self.value)
-
-
- def draw(self, curves=False):
- """Do all the specific things needed to import texts into Blender."""
- # Generate the geometery
- txt = Text3d.New("text")
- txt.setSize(1)
- txt.setShear(self.oblique/90)
- txt.setExtrudeDepth(0.5)
- if self.halignment == 0:
- align = Text3d.LEFT
- elif self.halignment == 1:
- align = Text3d.MIDDLE
- elif self.halignment == 2:
- align = Text3d.RIGHT
- elif self.halignment == 3:
- align = Text3d.FLUSH
- else:
- align = Text3d.MIDDLE
- txt.setAlignment(align)
- txt.setText(self.value)
-
- # Now Create an object
- ob = Object.New('Text', 'text') # link mesh to an object
- ob.link(txt)
-
- transform(self.extrusion, ob)
-
- # move the object center to the text location
- ob.loc = tuple(self.loc)
- # scale it to the text size
- ob.SizeX = self.height*self.width_factor
- ob.SizeY = self.height
- ob.SizeZ = self.height
- # and rotate it around z
- ob.RotZ = radians(self.rotation)
-
- return ob
-
-
-
-
-class Mtext:
- """Class for objects representing dxf Mtext."""
-
- def __init__(self, obj):
- """Expects an entity object of type mtext as input."""
- if not obj.type == 'mtext':
- raise TypeError, "Wrong type %s for mtext object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- # required data
- self.height = obj.get_type(40)[0]
- self.width = obj.get_type(41)[0]
- self.alignment = obj.get_type(71)[0] # alignment 1=TL, 2=TC, 3=TR, 4=ML, 5=MC, 6=MR, 7=BL, 8=BC, 9=BR
- self.value = self.get_text(obj.data) # The text string value
-
- # optional data (with defaults)
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- self.rotation = obj.get_type(50) # radians
- if not self.rotation:
- self.rotation = 0
- else:
- self.rotation = self.rotation[0]
-
- self.width_factor = obj.get_type(42) # Scaling factor along local x axis
- if not self.width_factor:
- self.width_factor = 1
- else:
- self.width_factor = self.width_factor[0]
-
- self.line_space = obj.get_type(44) # percentage of default
- if not self.line_space:
- self.line_space = 1
- else:
- self.line_space = self.line_space[0]
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.loc = self.get_loc(obj.data)
- self.extrusion = self.get_extrusion(obj.data)
-
-
-
-
-
- def get_text(self, data):
- """Reconstructs mtext data from dxf codes."""
- primary = ''
- secondary = []
- for item in data:
- if item[0] == 1: # There should be only one primary...
- primary = item[1]
- elif item[0] == 3: # There may be any number of extra strings (in order)
- secondary.append(item[1])
- if not primary:
- #raise ValueError, "Empty Mtext Object!"
- string = "Empty Mtext Object!"
- if not secondary:
- string = primary.replace(r'\P', '\n')
- else:
- string = ''.join(secondary)+primary
- string = string.replace(r'\P', '\n')
- return string
- def get_loc(self, data):
- """Gets location for a mtext type objects.
-
- Mtext objects have only one point indicating location.
- """
- loc = [0,0,0]
- for item in data:
- if item[0] == 10: # 10 = x
- loc[0] = item[1]
- elif item[0] == 20: # 20 = y
- loc[1] = item[1]
- elif item[0] == 30: # 30 = z
- loc[2] = item[1]
- return loc
-
-
-
-
- def get_extrusion(self, data):
- """Find the axis of extrusion.
-
- Used to get the objects Object Coordinate System (ocs).
- """
- vec = [0,0,1]
- for item in data:
- if item[0] == 210: # 210 = x
- vec[0] = item[1]
- elif item[0] == 220: # 220 = y
- vec[1] = item[1]
- elif item[0] == 230: # 230 = z
- vec[2] = item[1]
- return vec
-
-
- def __repr__(self):
- return "%s: layer - %s, value - %s" %(self.__class__.__name__, self.layer, self.value)
-
-
- def draw(self, curves=False):
- """Do all the specific things needed to import mtexts into Blender."""
- # Generate the geometery
- txt = Text3d.New("mtext")
- txt.setSize(1)
- # Blender doesn't give access to its text object width currently
- # only to the text3d's curve width...
- #txt.setWidth(text.width/10)
- txt.setLineSeparation(self.line_space)
- txt.setExtrudeDepth(0.5)
- txt.setText(self.value)
-
- # Now Create an object
- ob = Object.New('Text', 'mtext') # link mesh to an object
- ob.link(txt)
-
- transform(self.extrusion, ob)
-
- # move the object center to the text location
- ob.loc = tuple(self.loc)
- # scale it to the text size
- ob.SizeX = self.height*self.width_factor
- ob.SizeY = self.height
- ob.SizeZ = self.height
- # and rotate it around z
- ob.RotZ = radians(self.rotation)
-
- return ob
-
-
-
-
-
-
-class Circle:
- """Class for objects representing dxf Circles."""
-
- def __init__(self, obj):
- """Expects an entity object of type circle as input."""
- if not obj.type == 'circle':
- raise TypeError, "Wrong type %s for circle object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- # required data
- self.radius = obj.get_type(40)[0]
-
- # optional data (with defaults)
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.loc = self.get_loc(obj.data)
- self.extrusion = self.get_extrusion(obj.data)
-
-
-
-
-
- def get_loc(self, data):
- """Gets the center location for circle type objects.
-
- Circles have a single coord location.
- """
- loc = [0, 0, 0]
- for item in data:
- if item[0] == 10: # 10 = x
- loc[0] = item[1]
- elif item[0] == 20: # 20 = y
- loc[1] = item[1]
- elif item[0] == 30: # 30 = z
- loc[2] = item[1]
- return loc
-
-
-
- def get_extrusion(self, data):
- """Find the axis of extrusion.
-
- Used to get the objects Object Coordinate System (ocs).
- """
- vec = [0,0,1]
- for item in data:
- if item[0] == 210: # 210 = x
- vec[0] = item[1]
- elif item[0] == 220: # 220 = y
- vec[1] = item[1]
- elif item[0] == 230: # 230 = z
- vec[2] = item[1]
- return vec
-
-
- def __repr__(self):
- return "%s: layer - %s, radius - %s" %(self.__class__.__name__, self.layer, self.radius)
-
-
- def draw(self, curves=False):
- """Do all the specific things needed to import circles into Blender."""
- # Generate the geometery
- # Now Create an object
- if curves:
- ob = drawCurveCircle(self)
- else:
- center = self.loc
- radius = self.radius
-
- circ = 2 * pi * radius
- if circ < 65: # if circumfrance is too small
- verts = 32 # set a fixed number of 32 verts
- else:
- verts = circ/.5 # figure out how many verts we need
- if verts > 100: # Blender only accepts values
- verts = 100 # [3:100]
-
- c = Mesh.Primitives.Circle(int(verts), radius*2)
-
- ob = Object.New('Mesh', 'circle')
- ob.link(c) # link curve data with this object
-
- ob.loc = tuple(center)
- transform(self.extrusion, ob)
-
- return ob
-
-
-
-
-class Arc:
- """Class for objects representing dxf arcs."""
-
- def __init__(self, obj):
- """Expects an entity object of type arc as input."""
- if not obj.type == 'arc':
- raise TypeError, "Wrong type %s for arc object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- # required data
- self.radius = obj.get_type(40)[0]
- self.start_angle = obj.get_type(50)[0]
- self.end_angle = obj.get_type(51)[0]
-
- # optional data (with defaults)
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.loc = self.get_loc(obj.data)
- self.extrusion = self.get_extrusion(obj.data)
-
-
-
-
-
- def get_loc(self, data):
- """Gets the center location for arc type objects.
-
- Arcs have a single coord location.
- """
- loc = [0, 0, 0]
- for item in data:
- if item[0] == 10: # 10 = x
- loc[0] = item[1]
- elif item[0] == 20: # 20 = y
- loc[1] = item[1]
- elif item[0] == 30: # 30 = z
- loc[2] = item[1]
- return loc
-
-
-
- def get_extrusion(self, data):
- """Find the axis of extrusion.
-
- Used to get the objects Object Coordinate System (ocs).
- """
- vec = [0,0,1]
- for item in data:
- if item[0] == 210: # 210 = x
- vec[0] = item[1]
- elif item[0] == 220: # 220 = y
- vec[1] = item[1]
- elif item[0] == 230: # 230 = z
- vec[2] = item[1]
- return vec
-
-
- def __repr__(self):
- return "%s: layer - %s, radius - %s" %(self.__class__.__name__, self.layer, self.radius)
-
-
- def draw(self, curves=False):
- """Do all the specific things needed to import arcs into Blender."""
- # Generate the geometery
- # Now Create an object
- if curves:
- ob = drawCurveArc(self)
- else:
- center = self.loc
- radius = self.radius
- start = self.start_angle
- end = self.end_angle
- verts, edges = drawArc(None, radius, start, end)
-
- a = Mesh.New('arc')
-
- a.verts.extend(verts) # add vertices to mesh
- a.edges.extend(edges) # add edges to the mesh
-
- ob = Object.New('Mesh', 'arc')
- ob.link(a) # link curve data with this object
- ob.loc = tuple(center)
- ob.RotX = radians(180)
-
- transform(self.extrusion, ob)
- ob.size = (1,1,1)
-
- return ob
-
-
-class BlockRecord:
- """Class for objects representing dxf block_records."""
-
- def __init__(self, obj):
- """Expects an entity object of type block_record as input."""
- if not obj.type == 'block_record':
- raise TypeError, "Wrong type %s for block_record object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- # required data
- self.name = obj.get_type(2)[0]
-
- # optional data (with defaults)
- self.insertion_units = obj.get_type(70)
- if not self.insertion_units:
- self.insertion_units = None
- else:
- self.insertion_units = self.insertion_units[0]
-
- self.insert_units = obj.get_type(1070)
- if not self.insert_units:
- self.insert_units = None
- else:
- self.insert_units = self.insert_units[0]
-
-
-
-
-
-
- def __repr__(self):
- return "%s: name - %s, insert units - %s" %(self.__class__.__name__, self.name, self.insertion_units)
-
-
-
-
-class Block:
- """Class for objects representing dxf blocks."""
-
- def __init__(self, obj):
- """Expects an entity object of type block as input."""
- if not obj.type == 'block':
- raise TypeError, "Wrong type %s for block object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
- self.name = obj.name
-
- # required data
- self.flags = obj.get_type(70)[0]
- self.entities = dxfObject('block_contents')
- self.entities.data = objectify([ent for ent in obj.data if type(ent) != list])
-
- # optional data (with defaults)
- self.path = obj.get_type(1)
- if self.path:
- self.path = self.path[0]
- else:
- self.path = ''
-
- self.discription = obj.get_type(4)
- if self.discription:
- self.discription = self.discription[0]
- else:
- self.discription = ''
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.loc = self.get_loc(obj.data)
-
-
-
-
- def get_loc(self, data):
- """Gets the insert point of the block."""
- loc = [0, 0, 0]
- for item in data:
- if type(item) != list:
- continue
- if item[0] == 10: # 10 = x
- loc[0] = item[1]
- elif item[0] == 20: # 20 = y
- loc[1] = item[1]
- elif item[0] == 30: # 30 = z
- loc[2] = item[1]
- return loc
-
-
-
- def __repr__(self):
- return "%s: name - %s, description - %s, xref-path - %s" %(self.__class__.__name__, self.name, self.discription, self.path)
-
-
-
-
-class Insert:
- """Class for objects representing dxf inserts."""
-
- def __init__(self, obj):
- """Expects an entity object of type insert as input."""
- if not obj.type == 'insert':
- raise TypeError, "Wrong type %s for insert object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- # required data
- self.block = obj.get_type(2)[0]
-
- # optional data (with defaults)
- self.rotation = obj.get_type(50)
- if self.rotation:
- self.rotation = self.rotation[0]
- else:
- self.rotation = 0
-
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.loc = self.get_loc(obj.data)
- self.scale = self.get_scale(obj.data)
- self.rows, self.columns = self.get_array(obj.data)
- self.extrusion = self.get_extrusion(obj.data)
-
-
-
-
-
- def get_loc(self, data):
- """Gets the center location for circle type objects.
-
- Circles have a single coord location.
- """
- loc = [0, 0, 0]
- for item in data:
- if item[0] == 10: # 10 = x
- loc[0] = item[1]
- elif item[0] == 20: # 20 = y
- loc[1] = item[1]
- elif item[0] == 30: # 30 = z
- loc[2] = item[1]
- return loc
-
-
-
- def get_scale(self, data):
- """Gets the x/y/z scale factor for the block.
- """
- scale = [1, 1, 1]
- for item in data:
- if item[0] == 41: # 41 = x scale
- scale[0] = item[1]
- elif item[0] == 42: # 42 = y scale
- scale[1] = item[1]
- elif item[0] == 43: # 43 = z scale
- scale[2] = item[1]
- return scale
-
-
-
- def get_array(self, data):
- """Returns the pair (row number, row spacing), (column number, column spacing)."""
- columns = 1
- rows = 1
- cspace = 0
- rspace = 0
- for item in data:
- if item[0] == 70: # 70 = columns
- columns = item[1]
- elif item[0] == 71: # 71 = rows
- rows = item[1]
- if item[0] == 44: # 44 = columns
- cspace = item[1]
- elif item[0] == 45: # 45 = rows
- rspace = item[1]
- return (rows, rspace), (columns, cspace)
-
-
-
- def get_extrusion(self, data):
- """Find the axis of extrusion.
-
- Used to get the objects Object Coordinate System (ocs).
- """
- vec = [0,0,1]
- for item in data:
- if item[0] == 210: # 210 = x
- vec[0] = item[1]
- elif item[0] == 220: # 220 = y
- vec[1] = item[1]
- elif item[0] == 230: # 230 = z
- vec[2] = item[1]
- return vec
-
-
- def __repr__(self):
- return "%s: layer - %s, block - %s" %(self.__class__.__name__, self.layer, self.block)
-
-
- def draw(self, handle, settings):
- """Do all the specific things needed to import blocks into Blender.
-
- Blocks are made of three objects:
- the block_record in the tables section
- the block in the blocks section
- the insert object in the entities section
-
- block_records give the insert units, blocks provide the objects drawn in the
- block, and the insert object gives the location/scale/rotation of the block
- instances. To draw a block you must first get a group with all the
- blocks entities drawn in it, then scale the entities to match the world
- units, then dupligroup that data to an object matching each insert object."""
-
- # Create an object
- ob = Object.New('Mesh', self.block)
- ob.link(handle) # Give the object a handle
-
- if settings.drawTypes['blocks']:
- # get our block group
- block = settings.blocks(self.block)
-
- ob.DupGroup = block
- ob.enableDupGroup = True
-
- ob.loc = tuple(self.loc)
- transform(self.extrusion, ob)
- ob.RotZ += radians(self.rotation)
- ob.size = tuple(self.scale)
-
- return ob
-
-
-
-
-class Ellipse:
- """Class for objects representing dxf ellipses."""
-
- def __init__(self, obj):
- """Expects an entity object of type ellipse as input."""
- if not obj.type == 'ellipse':
- raise TypeError, "Wrong type %s for ellipse object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- # required data
- self.ratio = obj.get_type(40)[0]
- self.start_angle = obj.get_type(41)[0]
- self.end_angle = obj.get_type(42)[0]
-
- # optional data (with defaults)
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.loc = self.get_loc(obj.data)
- self.major = self.get_major(obj.data)
- self.extrusion = self.get_extrusion(obj.data)
- self.radius = sqrt(self.major[0]**2 + self.major[0]**2 + self.major[0]**2)
-
-
-
-
- def get_loc(self, data):
- """Gets the center location for arc type objects.
-
- Arcs have a single coord location.
- """
- loc = [0, 0, 0]
- for item in data:
- if item[0] == 10: # 10 = x
- loc[0] = item[1]
- elif item[0] == 20: # 20 = y
- loc[1] = item[1]
- elif item[0] == 30: # 30 = z
- loc[2] = item[1]
- return loc
-
-
-
- def get_major(self, data):
- """Gets the major axis for ellipse type objects.
-
- The ellipse major axis defines the rotation of the ellipse and its radius.
- """
- loc = [0, 0, 0]
- for item in data:
- if item[0] == 11: # 11 = x
- loc[0] = item[1]
- elif item[0] == 21: # 21 = y
- loc[1] = item[1]
- elif item[0] == 31: # 31 = z
- loc[2] = item[1]
- return loc
-
-
-
- def get_extrusion(self, data):
- """Find the axis of extrusion.
-
- Used to get the objects Object Coordinate System (ocs).
- """
- vec = [0,0,1]
- for item in data:
- if item[0] == 210: # 210 = x
- vec[0] = item[1]
- elif item[0] == 220: # 220 = y
- vec[1] = item[1]
- elif item[0] == 230: # 230 = z
- vec[2] = item[1]
- return vec
-
-
- def __repr__(self):
- return "%s: layer - %s, radius - %s" %(self.__class__.__name__, self.layer, self.radius)
-
-
- def draw(self, curves=False):
- """Do all the specific things needed to import ellipses into Blender."""
- # Generate the geometery
- # Now Create an object
- if curves:
- ob = drawCurveArc(self)
- else:
- major = Mathutils.Vector(self.major)
- delta = Mathutils.AngleBetweenVecs(major, WORLDX)
- center = self.loc
- radius = major.length
- start = degrees(self.start_angle)
- end = degrees(self.end_angle)
- verts, edges = drawArc(None, radius, start, end)
-
- e = Mesh.New('ellipse')
-
- e.verts.extend(verts) # add vertices to mesh
- e.edges.extend(edges) # add edges to the mesh
-
-
- ob = Object.New('Mesh', 'arc')
- ob.link(e) # link curve data with this object
- ob.loc = tuple(center)
- ob.SizeY = self.ratio
- #ob.RotZ = radians(delta)
- ob.RotX = radians(180)
-
-
- transform(self.extrusion, ob)
- ob.RotZ = radians(delta)
-
- return ob
-
-
-
-class Face:
- """Class for objects representing dxf 3d faces."""
-
- def __init__(self, obj):
- """Expects an entity object of type 3dfaceplot as input."""
- if not obj.type == '3dface':
- raise TypeError, "Wrong type %s for 3dface object!" %obj.type
- self.type = obj.type
- self.data = obj.data[:]
-
- # optional data (with defaults)
- self.space = obj.get_type(67)
- if self.space:
- self.space = self.space[0]
- else:
- self.space = 0
-
- self.color_index = obj.get_type(62)
- if self.color_index:
- self.color_index = self.color_index[0]
- else:
- self.color_index = BYLAYER
-
- discard, self.layer = get_layer(obj.data)
- obj.data.remove(discard)
- self.points = self.get_points(obj.data)
-
-
-
-
- def get_points(self, data):
- """Gets 3-4 points for a 3d face type object.
-
- Faces have three or optionally four verts.
- """
-
- a = [0, 0, 0]
- b = [0, 0, 0]
- c = [0, 0, 0]
- d = False
- for item in data:
- # ----------- a -------------
- if item[0] == 10: # 10 = x
- a[0] = item[1]
- elif item[0] == 20: # 20 = y
- a[1] = item[1]
- elif item[0] == 30: # 30 = z
- a[2] = item[1]
- # ----------- b -------------
- elif item[0] == 11: # 11 = x
- b[0] = item[1]
- elif item[0] == 21: # 21 = y
- b[1] = item[1]
- elif item[0] == 31: # 31 = z
- b[2] = item[1]
- # ----------- c -------------
- elif item[0] == 12: # 12 = x
- c[0] = item[1]
- elif item[0] == 22: # 22 = y
- c[1] = item[1]
- elif item[0] == 32: # 32 = z
- c[2] = item[1]
- # ----------- d -------------
- elif item[0] == 13: # 13 = x
- d = [0, 0, 0]
- d[0] = item[1]
- elif item[0] == 23: # 23 = y
- d[1] = item[1]
- elif item[0] == 33: # 33 = z
- d[2] = item[1]
- out = [a,b,c]
- if d:
- out.append(d)
- return out
-
-
- def __repr__(self):
- return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
-
-
- def draw(self, curves=False):
- """Do all the specific things needed to import 3d faces into Blender."""
- # Generate the geometery
- points = self.points
- if len(self.points) > 3:
- faces = [[0, 1, 2, 3]]
- else:
- faces = [[0, 1, 2]]
-
- me = Mesh.New('3dface') # create a new mesh
-
- me.verts.extend(points) # add vertices to mesh
- me.faces.extend(faces) # add faces to the mesh
-
- # Now Create an object
- ob = Object.New('Mesh', '3dface') # link mesh to an object
- ob.link(me)
-
- return ob
-
-
-
-# type to object map
+
+class Layer: #-----------------------------------------------------------------
+ """Class for objects representing dxf LAYERs.
+ """
+ def __init__(self, obj, name=None, color=None, frozen=None):
+ """Expects an object of type layer as input.
+ """
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ if name:
+ self.name = name
+ #self.bfname = name #--todo---see layernamesmap in f_getLayersmap ---
+ else:
+ self.name = obj.get_type(2)[0] #layer name of object
+
+ if color:
+ self.color = color
+ else:
+ self.color = obj.get_type(62)[0] #color of object
+
+ if frozen:
+ self.frozen = frozen
+ else:
+ self.flags = obj.get_type(70)[0]
+ self.frozen = self.flags & 1
+
+
+ def __repr__(self):
+ return "%s: name - %s, color - %s" %(self.__class__.__name__, self.name, self.color)
+
+
+
+def getit(obj, typ, default=None): #------------------------------------------
+ """Universal procedure for geting data from list/objects.
+ """
+ it = default
+ if type(obj) == list: #if obj is a list, then searching in a list
+ for item in obj:
+ #print 'deb:getit item, type(item)', item, type(item)
+ try:
+ if item[0] == typ:
+ it = item[1]
+ break #as soon as the first found
+ except:
+ # --todo-- I found one case where item was a text instance
+ # that failed with no __getitem__
+ pass
+ else: #else searching in Object with get_type-Methode
+ item = obj.get_type(typ)
+ if item:
+ it = item[0]
+ #print 'deb:getit:typ, it', typ, it #----------
+ return it
+
+
+
+def get_extrusion(data): #-------------------------------------------------
+ """Find the axis of extrusion.
+
+ Used to get from object_data the objects Object_Coordinate_System (ocs).
+ """
+ #print 'deb:get_extrusion: data: \n', data #---------------
+ vec = [0,0,1]
+ vec[0] = getit(data, 210, 0) # 210 = x
+ vec[1] = getit(data, 220, 0) # 220 = y
+ vec[2] = getit(data, 230, 1) # 230 = z
+ #print 'deb:get_extrusion: vec: ', vec #---------------
+ return vec
+
+
+
+class Solid: #-----------------------------------------------------------------
+ """Class for objects representing dxf SOLID or TRACE.
+ """
+ def __init__(self, obj):
+ """Expects an entity object of type solid or trace as input.
+ """
+ if obj.type == 'trace':
+ obj.type = 'solid'
+ if not obj.type == 'solid':
+ raise TypeError, "Wrong type \'%s\' for solid/trace object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ self.space = getit(obj, 67, 0)
+ self.thic = getit(obj, 39, 0)
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.layer = getit(obj.data, 8, None)
+ self.extrusion = get_extrusion(obj.data)
+ self.points = self.get_points(obj.data)
+
+
+
+ def get_points(self, data):
+ """Gets start and end points for a solid type object.
+
+ Solids have 3 or 4 points and fixed codes for each value.
+ """
+
+ # start x, y, z and end x, y, z = 0
+ a = [0, 0, 0]
+ b = [0, 0, 0]
+ c = [0, 0, 0]
+ d = [0, 0, 0]
+ a[0] = getit(data, 10, None) # 10 = x
+ a[1] = getit(data, 20, None) # 20 = y
+ a[2] = getit(data, 30, 0) # 30 = z
+ b[0] = getit(data, 11, None)
+ b[1] = getit(data, 21, None)
+ b[2] = getit(data, 31, 0)
+ c[0] = getit(data, 12, None)
+ c[1] = getit(data, 22, None)
+ c[2] = getit(data, 32, 0)
+ out = [a,b,c]
+
+ d[0] = getit(data, 13, None)
+ if d[0] != None:
+ d[1] = getit(data, 23, None)
+ d[2] = getit(data, 33, 0)
+ out.append(d)
+ #print 'deb:solid.vertices:---------\n', out #-----------------------
+ return out
+
+
+ def __repr__(self):
+ return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
+
+
+ def draw(self, settings):
+ """for SOLID: generate Blender_geometry.
+ """
+ points = self.points
+ if not points: return
+ edges, faces = [], []
+ l = len(self.points)
+
+ obname = 'so_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+
+ vg_left, vg_right, vg_top, vg_bottom, vg_start, vg_end = [], [], [], [], [], []
+ thic = set_thick(self.thic, settings)
+ if thic != 0:
+ thic_points = [[v[0], v[1], v[2] + thic] for v in points[:]]
+ if thic < 0.0:
+ thic_points.extend(points)
+ points = thic_points
+ else:
+ points.extend(thic_points)
+
+ if l == 4:
+ faces = [[0,1,3,2], [4,6,7,5], [0,4,5,1],
+ [1,5,7,3], [3,7,6,2], [2,6,4,0]]
+ vg_left = [2,6,4,0]
+ vg_right = [1,5,7,3]
+ vg_top = [4,6,7,5]
+ vg_bottom = [0,1,3,2]
+ vg_start = [0,4,5,1]
+ vg_end = [3,7,6,2]
+ elif l == 3:
+ faces = [[0,1,2], [3,5,4], [0,3,4,1], [1,4,5,2], [2,5,3,0]]
+ vg_top = [3,4,5]
+ vg_bottom = [0,1,2]
+ vg_left = [2,5,3,0]
+ vg_right = [1,4,5,2]
+ vg_start = [0,3,4,1]
+ elif l == 2: faces = [[0,1,3,2]]
+ else:
+ if l == 4: faces = [[0,1,3,2]]
+ elif l == 3: faces = [[0,1,2]]
+ elif l == 2: edges = [[0,1]]
+
+
+
+ me = Mesh.New(obname) # create a new mesh
+ me.verts.extend(points) # add vertices to mesh
+ if faces: me.faces.extend(faces) # add faces to the mesh
+ if edges: me.edges.extend(edges) # add faces to the mesh
+
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ if settings.var['vGroup_on']:
+ # each MeshSide becomes vertexGroup for easier material assignment ---------------------
+ replace = Blender.Mesh.AssignModes.ADD #or .AssignModes.ADD/REPLACE
+ if vg_left: me.addVertGroup('side.left') ; me.assignVertsToGroup('side.left', vg_left, 1.0, replace)
+ if vg_right:me.addVertGroup('side.right') ; me.assignVertsToGroup('side.right', vg_right, 1.0, replace)
+ if vg_top: me.addVertGroup('side.top') ; me.assignVertsToGroup('side.top', vg_top, 1.0, replace)
+ if vg_bottom:me.addVertGroup('side.bottom'); me.assignVertsToGroup('side.bottom',vg_bottom, 1.0, replace)
+ if vg_start:me.addVertGroup('side.start') ; me.assignVertsToGroup('side.start', vg_start, 1.0, replace)
+ if vg_end: me.addVertGroup('side.end') ; me.assignVertsToGroup('side.end', vg_end, 1.0, replace)
+
+ transform(self.extrusion, 0, ob)
+
+ return ob
+
+
+
+
+class Line: #-----------------------------------------------------------------
+ """Class for objects representing dxf LINEs.
+ """
+ def __init__(self, obj):
+ """Expects an entity object of type line as input.
+ """
+ if not obj.type == 'line':
+ raise TypeError, "Wrong type \'%s\' for line object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ self.space = getit(obj, 67, 0)
+ self.thic = getit(obj, 39, 0)
+ #print 'deb:self.thic: ', self.thic #---------------------
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.layer = getit(obj.data, 8, None)
+ self.extrusion = get_extrusion(obj.data)
+ self.points = self.get_points(obj.data)
+
+
+ def get_points(self, data):
+ """Gets start and end points for a line type object.
+
+ Lines have a fixed number of points (two) and fixed codes for each value.
+ """
+ # start x,y,z and end x,y,z = 0
+ a = [0, 0, 0]
+ b = [0, 0, 0]
+ a[0] = getit(data, 10, None) # 10 = x
+ a[1] = getit(data, 20, None) # 20 = y
+ a[2] = getit(data, 30, 0) # 30 = z
+ b[0] = getit(data, 11, None)
+ b[1] = getit(data, 21, None)
+ b[2] = getit(data, 31, 0)
+ out = [a,b]
+ return out
+
+
+ def __repr__(self):
+ return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
+
+
+ def draw(self, settings):
+ """for LINE: generate Blender_geometry.
+ """
+ # Generate the geometery
+ #settings.var['curves_on']=False
+
+ points = self.points
+ thic = set_thick(self.thic, settings)
+ width = 0.0
+ if settings.var['lines_as'] == 4: # as thin_box
+ thic = settings.var['thick_min']
+ width = settings.var['width_min']
+ if settings.var['lines_as'] == 3: # as thin cylinder
+ cyl_rad = 0.5 * settings.var['width_min']
+
+ if settings.var['curves_on']: # LINE curve representation-------------------------
+ obname = 'li_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+
+ c = Curve.New(obname) # create new curve data
+ curve = c.appendNurb(BezTriple.New(points[0]))
+ curve.append(BezTriple.New(points[1]))
+ for point in curve:
+ point.handleTypes = [VECT, VECT]
+ curve.flagU = 0 # 0 sets the curve not cyclic=open
+ c.update() #important for handles calculation
+
+ ob = SCENE.objects.new(c) # create a new curve_object
+
+ #if False: # --todo-- better support for 210-group
+ if thic != 0.0: #hack: Blender2.45 curve-extrusion
+ t = thic * 0.5
+ if abs(t) > 5.0: t = 5.0 * cmp(t,0) # Blender2.45 accepts only (0.0 - 5.0)
+ e = self.extrusion
+ c.setExt1(abs(t)) # curve-extrusion
+ ob.LocX += t * e[0]
+ ob.LocY += t * e[1]
+ ob.LocZ += t * e[2]
+ #c.setExt1(1.0) # curve-extrusion: Blender2.45 accepts only (0.0 - 5.0)
+ #ob.LocZ = t + self.loc[2]
+ #ob.SizeZ *= abs(t)
+ return ob
+
+ else: # LINE mesh representation ------------------------------
+ global activObjectLayer
+ global activObjectName
+ #print 'deb:draw:line.ob IN activObjectName: ', activObjectName #---------------------
+
+ if activObjectLayer == self.layer and settings.var['one_mesh_on']:
+ obname = activObjectName
+ #print 'deb:line.draw obname from activObjectName: ', obname #---------------------
+ ob = Object.Get(obname) # open an existing mesh_object
+ #ob = SCENE.getChildren(obname) # open an existing mesh_object
+ me = Mesh.Get(ob.name) # open objects mesh data
+ else:
+ obname = 'li_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ activObjectName = ob.name
+ activObjectLayer = self.layer
+ #print ('deb:line.draw new line.ob+mesh:"%s" created!' %ob.name) #---------------------
+
+ faces, edges = [], []
+ n = len(me.verts)
+
+ #if settings.var['width_force']: #--todo-----------
+
+ if thic != 0:
+ t, e = thic, self.extrusion
+ #print 'deb:thic, extr: ', t, e #---------------------
+ points.extend([[v[0]+t*e[0], v[1]+t*e[1], v[2]+t*e[2]] for v in points[:]])
+ faces = [[0+n, 1+n, 3+n, 2+n]]
+ else:
+ edges = [[0+n, 1+n]]
+
+ me.verts.extend(points) # adds vertices to global mesh
+ if faces: me.faces.extend(faces) # add faces to the mesh
+ if edges: me.edges.extend(edges) # add faces to the mesh
+
+ if settings.var['vGroup_on']:
+ # entities with the same color build one vertexGroup for easier material assignment ----
+ ob.link(me) # link mesh to that object
+ vG_name = 'color_%s' %self.color_index
+ if edges: faces = edges
+ replace = Blender.Mesh.AssignModes.ADD #or .AssignModes.REPLACE or ADD
+ try:
+ me.assignVertsToGroup(vG_name, faces[0], 1.0, replace)
+ #print 'deb: existed vGroup:', vG_name #---------------------
+ except:
+ me.addVertGroup(vG_name)
+ me.assignVertsToGroup(vG_name, faces[0], 1.0, replace)
+ #print 'deb: create new vGroup:', vG_name #---------------------
+
+
+ #print 'deb:draw:line.ob OUT activObjectName: ', activObjectName #---------------------
+ return ob
+
+
+
+class Point: #-----------------------------------------------------------------
+ """Class for objects representing dxf POINTs.
+ """
+ def __init__(self, obj):
+ """Expects an entity object of type point as input.
+ """
+ if not obj.type == 'point':
+ raise TypeError, "Wrong type %s for point object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ self.space = getit(obj, 67, 0)
+ self.thic = getit(obj, 39, 0)
+ #print 'deb:self.thic: ', self.thic #---------------------
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.layer = getit(obj.data, 8, None)
+ self.extrusion = get_extrusion(obj.data)
+ self.points = self.get_points(obj.data)
+
+
+ def get_points(self, data):
+ """Gets coordinates for a point type object.
+
+ Points have fixed codes for each value.
+ """
+ a = [0, 0, 0]
+ a[0] = getit(data, 10, None) # 10 = x
+ a[1] = getit(data, 20, None) # 20 = y
+ a[2] = getit(data, 30, 0) # 30 = z
+ out = [a]
+ return out
+
+
+ def __repr__(self):
+ return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
+
+
+ def draw(self, settings):
+ """for POINT: generate Blender_geometry.
+ """
+ points = self.points
+ obname = 'po_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ points_as = settings.var['points_as']
+ thic = settings.var['thick_min']
+ if thic < settings.var['dist_min']: thic = settings.var['dist_min']
+
+ if points_as in [1,3,4]:
+ if points_as == 1: # as 'empty'
+ c = 'Empty'
+ if points_as == 3: # as 'thin sphere'
+ res = settings.var['thin_res']
+ c = Mesh.Primitives.UVsphere(res,res,thic)
+ if points_as == 4: # as 'thin box'
+ c = Mesh.Primitives.Cube(thic)
+ ob = SCENE.objects.new(c, obname) # create a new object
+ transform(self.extrusion, 0, ob)
+ ob.loc = tuple(points[0])
+
+ elif points_as == 2: # as 'vertex'
+ global activObjectLayer
+ global activObjectName
+ #print 'deb:draw:point.ob IN activObjectName: ', activObjectName #---------------------
+ if activObjectLayer == self.layer and settings.var['one_mesh_on']:
+ obname = activObjectName
+ #print 'deb:draw:point.ob obname from activObjectName: ', obname #---------------------
+ ob = Object.Get(obname) # open an existing mesh_object
+ #ob = SCENE.getChildren(obname) # open an existing mesh_object
+ me = Mesh.Get(ob.name) # open objects mesh data
+ else:
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ activObjectName = ob.name
+ activObjectLayer = self.layer
+ #print ('deb:draw:point new point.ob+mesh:"%s" created!' %ob.name) #---------------------
+ me.verts.extend(points) # add vertices to mesh
+
+ return ob
+
+
+
+
+class LWpolyline: #-----------------------------------------------------------------
+ """Class for objects representing dxf LWPOLYLINEs.
+ """
+ def __init__(self, obj):
+ """Expects an entity object of type lwpolyline as input.
+ """
+ #print 'deb:LWpolyline.START:----------------' #------------------------
+ if not obj.type == 'lwpolyline':
+ raise TypeError, "Wrong type %s for polyline object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ # required data
+ self.num_points = obj.get_type(90)[0]
+
+ # optional data (with defaults)
+ self.space = getit(obj, 67, 0)
+
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.elevation = getit(obj, 30, 0)
+ self.thic = getit(obj, 39, 0)
+ self.flags = getit(obj, 70, 0)
+
+ self.closed = self.flags&1 # byte coded, 1 = closed, 128 = plinegen
+
+ self.layer = getit(obj.data, 8, None)
+ self.points = self.get_points(obj.data)
+ self.extrusion = get_extrusion(obj.data)
+
+ #print 'deb:LWpolyline.obj.data:\n', obj.data #------------------------
+ #print 'deb:LWpolyline.ENDinit:----------------' #------------------------
+
+
+ def get_points(self, data):
+ """Gets points for a polyline type object.
+
+ LW-Polylines have no fixed number of verts, and
+ each vert can have a number of properties.
+ Verts should be coded as
+ 10:xvalue
+ 20:yvalue
+ 40:startwidth or 0
+ 41:endwidth or 0
+ 42:bulge or 0
+ for each vert
+ """
+ num = self.num_points
+ point = None
+ points = []
+ for item in data:
+ if item[0] == 10: # 10 = x
+ if point:
+ points.append(point)
+ point = Vertex()
+ point.x = item[1]
+ elif item[0] == 20: # 20 = y
+ point.y = item[1]
+ elif item[0] == 40: # 40 = start width
+ point.swidth = item[1]
+ elif item[0] == 41: # 41 = end width
+ point.ewidth = item[1]
+ elif item[0] == 42: # 42 = bulge
+ point.bulge = item[1]
+ points.append(point)
+ return points
+
+
+
+ def __repr__(self):
+ return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
+
+
+ def draw(self, settings):
+ """for LWPOLYLINE: generate Blender_geometry.
+ """
+ #print 'deb:LWpolyline.draw.START:----------------' #------------------------
+ points = []
+ obname = 'lw_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ #settings.var['curves_on'] == True
+ #print 'deb:index_len: ', len(self.points) #------------------
+ for i, point in enumerate(self.points):
+ #print 'deb:index: ', i #------------------
+ if not point.bulge:
+ points.append(point.loc)
+ elif point.bulge and not self.closed and i == len(self.points)-1:
+ points.append(point.loc)
+ elif point.bulge: #
+ if i == len(self.points)-1:
+ point2 = self.points[0]
+ else:
+ point2 = self.points[i+1]
+ arc_res = settings.var['arc_res']/sqrt(settings.var['arc_rad'])
+ verts, center = calcBulge(point, point2, arc_res)
+# if i == len(self.points)-1:
+# if self.closed:
+# verts.pop() #remove last(=first) vertex
+# else:
+# verts.pop() #remove last vertex, because this point will be writen as the next vertex
+ points.extend(verts)
+
+ thic = self.thic
+ if settings.var['thick_force'] and thic == 0: thic = settings.var['thick_min']
+ if settings.var['thick_on'] and thic != 0:
+ len1 = len(points)
+ points.extend([[point[0], point[1], point[2]+thic] for point in points])
+ faces = []
+ #print 'deb:len1:', len1 #-----------------------
+ faces = [[num, num+1, num+len1+1, num+len1] for num in xrange(len1 - 1)]
+ if self.closed:
+ faces.append([len1-1, 0, len1, 2*len1-1])
+ #print 'deb:faces_list:\n', faces #-----------------------
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ me.verts.extend(points) # add vertices to mesh
+ me.faces.extend(faces) # add faces to the mesh
+ else:
+ edges = [[num, num+1] for num in xrange(len(points)-1)]
+ if self.closed:
+ edges.append([len(points)-1, 0])
+ #print 'deb:edges_list:\n', edges #-----------------------
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ me.verts.extend(points) # add vertices to mesh
+ me.edges.extend(edges) # add edges to the mesh
+
+ ob.LocZ = self.elevation
+ transform(self.extrusion, 0, ob)
+
+ #print 'deb:LWpolyline.draw.END:----------------' #------------------------
+ return ob
+
+
+
+class Polyline: #-----------------------------------------------------------------
+ """Class for objects representing dxf POLYLINEs.
+ """
+ def __init__(self, obj):
+ """Expects an entity object of type polyline as input.
+ """
+ #print 'deb:polyline.init.START:----------------' #------------------------
+ if not obj.type == 'polyline':
+ raise TypeError, "Wrong type %s for polyline object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+ #print 'deb:polyline.obj.data[:]:\n', obj.data[:] #------------------------
+ self.points = []
+
+ # optional data (with defaults)
+ self.space = getit(obj, 67, 0)
+ self.elevation = getit(obj, 30, 0)
+ #print 'deb:elevation: ', self.elevation #---------------
+ self.thic = getit(obj, 39, 0)
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.flags = getit(obj, 70, 0)
+ self.closed = self.flags & 1 # closed in the M direction
+ self.curved = self.flags & 2 # Bezier-curve-fit vertices have been added
+ self.spline = self.flags & 4 # Bspline-fit vertices have been added
+ self.poly3d = self.flags & 8 # 3D-polyline
+ self.plmesh = self.flags & 16 # 3D-polygon mesh
+ self.closeN = self.flags & 32 # closed in the N direction
+ self.plface = self.flags & 64 # 3D-polyface mesh
+ self.contin = self.flags & 128 # the linetype pattern is generated continuously
+
+ if self.poly3d or self.plface or self.plmesh:
+ self.poly2d = False # its not a 2D-polyline
+ else:
+ self.poly2d = True # it is a 2D-polyline
+
+ self.swidth = getit(obj, 40, 0) # default start width
+ self.ewidth = getit(obj, 41, 0) # default end width
+ #self.bulge = getit(obj, 42, None) # bulge of the segment
+ self.vectorsM = getit(obj, 71, None) # PolyMesh: expansion in M-direction / PolyFace: number of the vertices
+ self.vectorsN = getit(obj, 72, None) # PolyMesh: expansion in M-direction / PolyFace: number of faces
+ #self.resolM = getit(obj, 73, None) # resolution of surface in M direction
+ #self.resolN = getit(obj, 74, None) # resolution of surface in N direction
+ self.curvetyp = getit(obj, 75, 0) # type of curve/surface: 0=None/5=Quadric/6=Cubic/8=Bezier
+ self.curvNormal = False
+ self.curvQBspline = False
+ self.curvCBspline = False
+ self.curvBezier = False
+ if self.curvetyp == 0: self.curvNormal = True
+ elif self.curvetyp == 5: self.curvQBspline = True
+ elif self.curvetyp == 6: self.curvCBspline = True
+ elif self.curvetyp == 8: self.curvBezier = True
+
+ self.layer = getit(obj.data, 8, None)
+ self.extrusion = get_extrusion(obj.data)
+
+ self.points = [] #list with vertices coordinats
+ self.faces = [] #list with vertices assigment to faces
+ #print 'deb:polyline.init.ENDinit:----------------' #------------
+
+
+
+ def __repr__(self):
+ return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
+
+
+
+ def draw(self, settings): #-------------%%%% DRAW POLYLINE %%%---------------
+ """for POLYLINE: generate Blender_geometry.
+ """
+ ob = []
+ if self.plface: #---- 3dPolyFace - mesh with free topology
+ ob = self.drawPlFace(settings)
+ elif self.plmesh: #---- 3dPolyMesh - mesh with ortogonal topology
+ ob = self.drawPlMesh(settings)
+ #---- 2dPolyline - plane polyline with arc/wide/thic segments
+ #---- 3dPolyline - non-plane polyline (thin segments = without arc/wide/thic)
+ elif self.poly2d or self.poly3d:
+ if settings.var['curves_on']: # and self.spline:
+ ob = self.drawPolyCurve(settings)
+ else:
+ ob = self.drawPoly2d(settings)
+ return ob
+
+
+
+ def drawPlFace(self, settings): #---- 3dPolyFace - mesh with free topology
+ """Generate the geometery of polyface.
+ """
+ #print 'deb:polyface.draw.START:----------------' #------------------------
+ points = []
+ faces = []
+ #print 'deb:len of pointsList ====== ', len(self.points) #------------------------
+ for point in self.points:
+ if point.face:
+ faces.append(point.face)
+ else:
+ points.append(point.loc)
+
+
+ #print 'deb:len of points_list:\n', len(points) #-----------------------
+ #print 'deb:points_list:\n', points #-----------------------
+ #print 'deb:faces_list:\n', faces #-----------------------
+ obname = 'pf_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ me.verts.extend(points) # add vertices to mesh
+ me.faces.extend(faces) # add faces to the mesh
+
+ if settings.var['meshSmooth_on']: # ----------------------
+ for i in xrange(len(faces)):
+ me.faces[i].smooth = True
+ #me.Mode(AUTOSMOOTH)
+ transform(self.extrusion, 0, ob)
+ #print 'deb:polyface.draw.END:----------------' #------------------------
+ return ob
+
+
+
+ def drawPlMesh(self, settings): #---- 3dPolyMesh - mesh with orthogonal topology
+ """Generate the geometery of polymesh.
+ """
+ #print 'deb:polymesh.draw.START:----------------' #------------------------
+ #points = []
+ #print 'deb:len of pointsList ====== ', len(self.points) #------------------------
+ faces = []
+ m = self.vectorsM
+ n = self.vectorsN
+ for j in xrange(m - 1):
+ for i in xrange(n - 1):
+ nn = j * n
+ faces.append([nn+i, nn+i+1, nn+n+i+1, nn+n+i])
+
+ if self.closed: #mesh closed in N-direction
+ nn = (m-1)*n
+ for i in xrange(n - 1):
+ faces.append([nn+i, nn+i+1, i+1, i])
+
+ if self.closeN: #mesh closed in M-direction
+ for j in xrange(m-1):
+ nn = j * n
+ faces.append([nn+n-1, nn, nn+n, nn+n-1+n])
+
+ if self.closed and self.closeN: #mesh closed in M/N-direction
+ faces.append([ (n*m)-1, (m-1)*n, 0, n-1])
+
+ #print 'deb:len of points_list:\n', len(points) #-----------------------
+ #print 'deb:faces_list:\n', faces #-----------------------
+ obname = 'pm_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ me.verts.extend([point.loc for point in self.points]) # add vertices to mesh
+ me.faces.extend(faces) # add faces to the mesh
+
+ if settings.var['meshSmooth_on']: # ----------------------
+ for i in xrange(len(faces)):
+ me.faces[i].smooth = True
+ #me.Mode(AUTOSMOOTH)
+
+ transform(self.extrusion, 0, ob)
+ #print 'deb:polymesh.draw.END:----------------' #------------------------
+ return ob
+
+
+ def drawPolyCurve(self, settings): #---- Polyline - draw as Blender-curve
+ """Generate the geometery of polyline as Blender-curve.
+ """
+ #print 'deb:polyline2dCurve.draw.START:----------------' #---
+ if len(self.points) < 2:
+ #print 'deb:drawPoly2d exit, cause POLYLINE has less than 2 vertices' #---------
+ return
+
+ if self.spline: pline_typ = 'ps' # Polyline-nurbSpline
+ elif self.curved: pline_typ = 'pc' # Polyline-bezierCurve
+ else: pline_typ = 'pl' # Polyline
+ obname = '%s_%s' %(pline_typ, self.layer) # create object_name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ d_points = []
+
+ if settings.var['Z_force_on']:
+ self.elevation = settings.var['Z_elev']
+ for point in self.points:
+ point.loc[2] = self.elevation
+ d_points.append(point)
+ else: #for DXFr10-format: update all points[].loc[2] == None -> 0.0
+ for point in self.points:
+ if point.loc[2] == None:
+ point.loc[2] = self.elevation
+ d_points.append(point)
+
+ thic = set_thick(self.thic, settings)
+ if thic != 0.0: #hack: Blender<2.45 curve-extrusion
+ LocZ = d_points[0].loc[2]
+ temp_points = []
+ for point in d_points:
+ point.loc[2] = 0.0
+ temp_points.append(point)
+ d_points = temp_points
+
+ #print 'deb:polyline2dCurve.draw d_points=', d_points #---------------
+ pline = Curve.New(obname) # create new curve data
+ #pline.setResolu(24) #--todo-----
+
+ if False: #self.spline: # NURBSplines-----FAKE(with Bezier)-----
+ #print 'deb:polyline2dCurve.draw self.spline!' #---------------
+ curve = pline.appendNurb(BezTriple.New(d_points[0]))
+ for p in d_points[1:]:
+ curve.append(BezTriple.New(p))
+ for point in curve:
+ point.handleTypes = [AUTO, AUTO]
+ if self.closed:
+ curve.flagU = 1 # Set curve cyclic=close
+ else:
+ curve.flagU = 0 # Set curve not cyclic=open
+ curve[0].handleTypes = [FREE, ALIGN] #remi--todo-----
+ curve[-1].handleTypes = [ALIGN, FREE] #remi--todo-----
+
+ elif self.spline: # NURBSplines-----OK-----
+ #print 'deb:polyline2dCurve.draw self.spline!' #---------------
+ weight1 = 0.5
+ weight2 = 1.0
+ # generate middlepoints except start/end-segments ---
+ if self.curvQBspline:
+ temp_points = []
+ point = d_points[0].loc
+ point.append(weight1)
+ temp_points.append(point)
+ for i in xrange(1,len(d_points)-2):
+ point1 = d_points[i].loc
+ point2 = d_points[i+1].loc
+ mpoint = list((Mathutils.Vector(point1) + Mathutils.Vector(point2)) * 0.5)
+ mpoint.append(weight2)
+ point1.append(weight1)
+ temp_points.append(point1)
+ temp_points.append(mpoint)
+ point2.append(weight1)
+ temp_points.append(point2)
+ point = d_points[-1].loc
+ point.append(weight1)
+ temp_points.append(point)
+ d_points = temp_points
+ else:
+ temp_points = []
+ for d in d_points:
+ d = d.loc
+ d.append(weight1)
+ temp_points.append(d)
+ d_points = temp_points
+
+ if not self.closed:
+ # generate extended startpoint and endpoint------
+ point1 = Mathutils.Vector(d_points[0][:3])
+ point2 = Mathutils.Vector(d_points[1][:3])
+ startpoint = list(point1 - point2 + point1)
+ startpoint.append(weight1)
+ point1 = Mathutils.Vector(d_points[-1][:3])
+ point2 = Mathutils.Vector(d_points[-2][:3])
+ endpoint = list(point1 - point2 + point1)
+ endpoint.append(weight1)
+ temp_points = []
+ temp_points.append(startpoint)
+ temp_points.extend(d_points)
+ d_points = temp_points
+ d_points.append(endpoint)
+
+ point = d_points[0]
+ curve = pline.appendNurb(point)
+ curve.setType(4) #NURBS curve
+ for point in d_points[1:]:
+ curve.append(point)
+ if self.closed:
+ curve.flagU = 1 # Set curve cyclic=close
+ else:
+ curve.flagU = 0 # Set curve not cyclic=open
+
+ elif self.curved: #--Bezier-curves---OK-------
+ #print 'deb:polyline2dCurve.draw self.curved!' #---------------
+ curve = pline.appendNurb(BezTriple.New(d_points[0]))
+ for p in d_points[1:]:
+ curve.append(BezTriple.New(p))
+ for point in curve:
+ point.handleTypes = [AUTO, AUTO]
+ if self.closed:
+ curve.flagU = 1 # Set curve cyclic=close
+ else:
+ curve.flagU = 0 # Set curve not cyclic=open
+ curve[0].handleTypes = [FREE, ALIGN] #remi--todo-----
+ curve[-1].handleTypes = [ALIGN, FREE] #remi--todo-----
+
+ else: #--straight line- and arc-segments----OK------
+ #print 'deb:polyline2dCurve.draw curve:', curve #-----
+ points = []
+ arc_res = settings.var['curve_arc']
+ prevHandleType = VECT
+ #d_points.append(d_points[0]) #------ first vertex added at the end of list --------
+ #curve.setType(0) #polygon_type of Blender_curve
+ for i in xrange(len(d_points)):
+ point1 = d_points[i]
+ #point2 = d_points[i+1]
+ if False: #-----outdated!- standard calculation ----------------------------------
+ if point1.bulge and (i < len(d_points)-2 or self.closed):
+ verts, center = calcBulge(point1, point2, arc_res, triples=False)
+ if i == 0: curve = pline.appendNurb(BezTriple.New(verts[0]))
+ else: curve.append(BezTriple.New(verts[0]))
+ curve[-1].handleTypes = [VECT, VECT] #--todo--calculation of bezier-tangents
+ for p in verts[1:]:
+ curve.append(BezTriple.New(p))
+ curve[-1].handleTypes = [AUTO, AUTO]
+ else:
+ if i == 0: curve = pline.appendNurb(BezTriple.New(point1.loc))
+ else: curve.append(BezTriple.New(point1.loc))
+ curve[-1].handleTypes = [VECT, VECT] #--todo--calculation of bezier-tangents
+
+ elif True: #----- optimised Bezier-Handles calculation --------------------------------
+ #print 'deb:drawPlineCurve: i:', i #---------
+ if point1.bulge and not (i == len(d_points)-1 and point1.bulge and not self.closed):
+ if i == len(d_points)-1: point2 = d_points[0]
+ else: point2 = d_points[i+1]
+
+
+ # calculate additional points for bulge
+ VectorTriples = calcBulge(point1, point2, arc_res, triples=True)
+
+ if prevHandleType == FREE:
+ #print 'deb:drawPlineCurve: VectorTriples[0]:', VectorTriples[0] #---------
+ VectorTriples[0][:3] = prevHandleVect
+ #print 'deb:drawPlineCurve: VectorTriples[0]:', VectorTriples[0] #---------
+
+ if i == 0: curve = pline.appendNurb(BezTriple.New(VectorTriples[0]))
+ else: curve.append(BezTriple.New(VectorTriples[0]))
+ curve[-1].handleTypes = [prevHandleType, FREE]
+
+ for p in VectorTriples[1:-1]:
+ curve.append(BezTriple.New(p))
+ curve[-1].handleTypes = [FREE, FREE]
+
+ prevHandleVect = VectorTriples[-1][:3]
+ prevHandleType = FREE
+ #print 'deb:drawPlineCurve: prevHandleVect:', prevHandleVect #---------
+ else:
+ #print 'deb:drawPlineCurve: else' #----------
+ if prevHandleType == FREE:
+ VectorTriples = prevHandleVect + list(point1) + list(point1)
+ #print 'deb:drawPlineCurve: VectorTriples:', VectorTriples #---------
+ curve.append(BezTriple.New(VectorTriples))
+ curve[-1].handleTypes = [FREE, VECT]
+ prevHandleType = VECT
+ else:
+ if i == 0: curve = pline.appendNurb(BezTriple.New(point1.loc))
+ else: curve.append(BezTriple.New(point1.loc))
+ curve[-1].handleTypes = [VECT, VECT]
+
+
+
+ #print 'deb:drawPlineCurve: curve[-1].vec[0]', curve[-1].vec[0] #----------
+
+ if self.closed:
+ curve.flagU = 1 # Set curve cyclic=close
+ if prevHandleType == FREE:
+ #print 'deb:drawPlineCurve:closed curve[0].vec:', curve[0].vec #----------
+ #print 'deb:drawPlineCurve:closed curve[0].handleTypes:', curve[0].handleTypes #----------
+ prevHandleType2 = curve[0].handleTypes[1]
+ p0h1,p0,p0h2 = curve[0].vec
+ #print 'deb:drawPlineCurve:closed p0h1:', p0h1 #----------
+ p0h1 = prevHandleVect
+ #p0h1 = [0,0,0]
+ #print 'deb:drawPlineCurve:closed p0h1:', p0h1 #----------
+ #curve[0].vec = [p0h1,p0,p0h2]
+ curve.__setitem__(0,BezTriple.New(p0h1+p0+p0h2))
+
+ curve[0].handleTypes = [FREE,prevHandleType2]
+ #print 'deb:drawPlineCurve:closed curve[0].vec:', curve[0].vec #----------
+ #print 'deb:drawPlineCurve:closed curve[0].handleTypes:', curve[0].handleTypes #----------
+ else:
+ curve[0].handleTypes[0] = VECT
+ else:
+ curve.flagU = 0 # Set curve not cyclic=open
+
+ if settings.var['fill_on']:
+ pline.setFlag(6) # 2+4 set top and button caps
+ else:
+ pline.setFlag(pline.getFlag() & ~6) # dont set top and button caps
+
+ pline.update()
+ ob = SCENE.objects.new(pline) # create a new curve_object
+
+ if thic != 0.0: #hack: Blender<2.45 curve-extrusion
+ thic = thic * 0.5
+ pline.setExt1(1.0) # curve-extrusion accepts only (0.0 - 2.0)
+ ob.LocZ = thic + LocZ
+
+ transform(self.extrusion, 0, ob)
+ if thic != 0.0:
+ ob.SizeZ *= abs(thic)
+
+ #print 'deb:polyline2dCurve.draw.END:----------------' #-----
+ return ob
+
+
+ def drawPoly2d(self, settings): #---- 2dPolyline - plane lines/arcs with wide/thic
+ """Generate the geometery of regular polyline.
+ """
+ #print 'deb:polyline2d.draw.START:----------------' #------------------------
+ points = []
+ d_points = []
+ swidths = []
+ ewidths = []
+ swidth_default = self.swidth #default start width of POLYLINEs segments
+ ewidth_default = self.ewidth #default end width of POLYLINEs segments
+ thic = set_thick(self.thic, settings)
+ if self.spline: pline_typ = 'ps'
+ elif self.curved: pline_typ = 'pc'
+ else: pline_typ = 'pl'
+ obname = '%s_%s' %(pline_typ, self.layer) # create object_name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+
+ if len(self.points) < 2:
+ #print 'deb:drawPoly2d exit, cause POLYLINE has less than 2 vertices' #---------
+ return
+
+ if settings.var['Z_force_on']:
+ self.elevation = settings.var['Z_elev']
+ for point in self.points:
+ point.loc[2] = self.elevation
+ d_points.append(point)
+ else: #for DXFr10-format: update all non-existing LocZ points[].loc[2] == None -> 0.0 elevation
+ for point in self.points:
+ if point.loc[2] == None:
+ point.loc[2] = self.elevation
+ d_points.append(point)
+ #print 'deb:drawPoly2d len of d_pointsList ====== ', len(d_points) #------------------------
+ #print 'deb:drawPoly2d d_pointsList ======:\n ', d_points #------------------------
+
+
+ #if closed polyline, add duplic of the first vertex at the end of pointslist
+ if self.closed: #new_b8
+ if d_points[-1].loc != d_points[0].loc: # if not equal, then set the first at the end of pointslist
+ d_points.append(d_points[0])
+ else:
+ if d_points[-1].loc == d_points[0].loc: # if equal, then set to closed, and modify the last point
+ d_points[-1] = d_points[0]
+ self.closed = True
+ #print 'deb:drawPoly2d len of d_pointsList ====== ', len(d_points) #------------------------
+ #print 'deb:drawPoly2d d_pointsList ======:\n ', d_points #------------------------
+
+
+ # routine to sort out of "double.vertices" ------------------------------------
+ minimal_dist = settings.var['dist_min'] * 0.1
+ temp_points = []
+ for i in xrange(len(d_points)-1):
+ point = d_points[i]
+ point2 = d_points[i+1]
+ #print 'deb:double.vertex p1,p2', point, point2 #------------------------
+ delta = Mathutils.Vector(point2.loc) - Mathutils.Vector(point.loc)
+ if delta.length > minimal_dist:
+ temp_points.append(point)
+ #else: print 'deb:drawPoly2d double.vertex sort out!' #------------------------
+ temp_points.append(d_points[-1]) #------ incl. last vertex -------------
+ #if self.closed: temp_points.append(d_points[1]) #------ loop start vertex -------------
+ d_points = temp_points #-----vertex.list without "double.vertices"
+ #print 'deb:drawPoly2d d_pointsList =after DV-outsorting=====:\n ', d_points #------------------------
+
+ #print 'deb:drawPoly2d len of d_pointsList ====== ', len(d_points) #------------------------
+ if len(d_points) < 2: #if too few vertex, then return
+ #print 'deb:drawPoly2d corrupted Vertices' #---------
+ return
+
+ # analyze of straight- and bulge-segments
+ # generation of additional points for bulge segments
+ arc_res = settings.var['arc_res']/sqrt(settings.var['arc_rad'])
+ wide_segment_exist = False
+ bulg_points = [] # for each point set None (or center for arc-subPoints)
+ for i in xrange(len(d_points)-1):
+ point1 = d_points[i]
+ point2 = d_points[i+1]
+ #print 'deb:drawPoly2d_bulg tocalc.point1:', point1 #------------------------
+ #print 'deb:drawPoly2d_bulg tocalc.point2:', point2 #------------------------
+
+ swidth = point1.swidth
+ ewidth = point1.ewidth
+ if swidth == None: swidth = swidth_default
+ if ewidth == None: ewidth = ewidth_default
+ if swidth != 0.0 or ewidth != 0.0: wide_segment_exist = True
+
+ if settings.var['width_force']: # force minimal width for thin segments
+ width_min = settings.var['width_min']
+ if swidth < width_min: swidth = width_min
+ if ewidth < width_min: ewidth = width_min
+ if not settings.var['width_on']: # then force minimal width for all segments
+ swidth = width_min
+ ewidth = width_min
+
+ #if point1.bulge and (i < (len(d_points)-1) or self.closed):
+ if point1.bulge and i < (len(d_points)-1): #10_b8
+ verts, center = calcBulge(point1, point2, arc_res) #calculate additional points for bulge
+ points.extend(verts)
+ delta_width = (ewidth - swidth) / len(verts)
+ width_list = [swidth + (delta_width * ii) for ii in xrange(len(verts)+1)]
+ swidths.extend(width_list[:-1])
+ ewidths.extend(width_list[1:])
+ bulg_list = [center for ii in xrange(len(verts))]
+ #the last point in bulge has index False for better indexing of bulg_end!
+ bulg_list[-1] = None
+ bulg_points.extend(bulg_list)
+
+ else:
+ points.append(point1.loc)
+ swidths.append(swidth)
+ ewidths.append(ewidth)
+ bulg_points.append(None)
+ points.append(d_points[-1].loc)
+
+
+ #--calculate width_vectors: left-side- and right-side-points ----------------
+ # 1.level:IF width ---------------------------------------
+ if (settings.var['width_on'] and wide_segment_exist) or settings.var['width_force']:
+ #new_b8 points.append(d_points[0].loc) #temporarly add first vertex at the end (for better loop)
+ dist_min05 = 0.5 * settings.var['dist_min'] #minimal width for zero_witdh
+
+ pointsLs = [] # list of left-start-points
+ pointsLe = [] # list of left-end-points
+ pointsRs = [] # list of right-start-points
+ pointsRe = [] # list of right-end-points
+ pointsW = [] # list of all border-points
+ #rotMatr90 = Mathutils.Matrix(rotate 90 degree around Z-axis) = normalvectorXY
+ rotMatr90 = Mathutils.Matrix([0, -1, 0], [1, 0, 0], [0, 0, 1])
+ bulg_in = False
+ last_bulg_point = False
+ for i in xrange(len(points)-1):
+ point1 = points[i]
+ point2 = points[i+1]
+ point1vec = Mathutils.Vector(point1)
+ point2vec = Mathutils.Vector(point2)
+ swidth05 = swidths[i] * 0.5
+ ewidth05 = ewidths[i] * 0.5
+ if swidth05 == 0: swidth05 = dist_min05
+ if ewidth05 == 0: ewidth05 = dist_min05
+ normal_vector = rotMatr90 * (point2vec-point1vec).normalize()
+ if last_bulg_point:
+ last_bulg_point = False
+ bulg_in = True
+ elif bulg_points[i] != None:
+ centerVec = Mathutils.Vector(bulg_points[i])
+ if bulg_points[i+1] == None: last_bulg_point = True
+ bulg_in = True
+ else: bulg_in = False
+
+ if bulg_in:
+ #makes clean intersections for arc-segments
+ radius1vec = point1vec - centerVec
+ radius2vec = point2vec - centerVec
+ angle = Mathutils.AngleBetweenVecs(normal_vector, radius1vec)
+ if angle < 90.0:
+ normal_vector1 = radius1vec.normalize()
+ normal_vector2 = radius2vec.normalize()
+ else:
+ normal_vector1 = - radius1vec.normalize()
+ normal_vector2 = - radius2vec.normalize()
+
+ swidth05vec = swidth05 * normal_vector1
+ ewidth05vec = ewidth05 * normal_vector2
+ pointsLs.append(point1vec + swidth05vec) #vertex left start
+ pointsRs.append(point1vec - swidth05vec) #vertex right start
+ pointsLe.append(point2vec + ewidth05vec) #vertex left end
+ pointsRe.append(point2vec - ewidth05vec) #vertex right end
+
+ else:
+ swidth05vec = swidth05 * normal_vector
+ ewidth05vec = ewidth05 * normal_vector
+ pointsLs.append(point1vec + swidth05vec) #vertex left start
+ pointsRs.append(point1vec - swidth05vec) #vertex right start
+ pointsLe.append(point2vec + ewidth05vec) #vertex left end
+ pointsRe.append(point2vec - ewidth05vec) #vertex right end
+
+ # additional last point is also calculated
+ #pointsLs.append(pointsLs[0])
+ #pointsRs.append(pointsRs[0])
+ #pointsLe.append(pointsLe[0])
+ #pointsRe.append(pointsRe[0])
+
+ pointsLc, pointsRc = [], [] # lists Left/Right corners = intersection points
+
+ # 2.level:IF width and corner-trim
+ if settings.var['pl_trim_on']: #optional clean corner-intersections
+ # loop preset
+ # set STARTpoints of the first point points[0]
+ if not self.closed:
+ pointsLc.append(pointsLs[0])
+ pointsRc.append(pointsRs[0])
+ else:
+ pointsLs.append(pointsLs[0])
+ pointsRs.append(pointsRs[0])
+ pointsLe.append(pointsLe[0])
+ pointsRe.append(pointsRe[0])
+ points.append(points[0])
+ vecL3, vecL4 = pointsLs[0], pointsLe[0]
+ vecR3, vecR4 = pointsRs[0], pointsRe[0]
+ lenL = len(pointsLs)-1
+ #print 'deb:drawPoly2d pointsLs():\n', pointsLs #----------------
+ #print 'deb:drawPoly2d lenL, len.pointsLs():', lenL,',', len(pointsLs) #----------------
+ bulg_in = False
+ last_bulg_point = False
+
+ # LOOP: makes (ENDpoints[i],STARTpoints[i+1])
+ for i in xrange(lenL):
+ if bulg_points[i] != None:
+ if bulg_points[i+1] == None: #makes clean intersections for arc-segments
+ last_bulg_point = True
+ if not bulg_in:
+ bulg_in = True
+ #pointsLc.extend((points[i], pointsLs[i]))
+ #pointsRc.extend((points[i], pointsRs[i]))
+ vecL1, vecL2 = vecL3, vecL4
+ vecR1, vecR2 = vecR3, vecR4
+ vecL3, vecL4 = pointsLs[i+1], pointsLe[i+1]
+ vecR3, vecR4 = pointsRs[i+1], pointsRe[i+1]
+ #compute left- and right-cornerpoints
+ #cornerpointL = Geometry.LineIntersect2D(vec1, vec2, vec3, vec4)
+ cornerpointL = Mathutils.LineIntersect(vecL1, vecL2, vecL3, vecL4)
+ cornerpointR = Mathutils.LineIntersect(vecR1, vecR2, vecR3, vecR4)
+ #print 'deb:drawPoly2d cornerpointL: ', cornerpointL #-------------
+ #print 'deb:drawPoly2d cornerpointR: ', cornerpointR #-------------
+
+ # IF not cornerpoint THEN check if identic start-endpoints (=collinear segments)
+ if cornerpointL == None or cornerpointR == None:
+ if vecL2 == vecL3 and vecR2 == vecR3:
+ #print 'deb:drawPoly2d pointVec: ####### identic ##########' #----------------
+ pointsLc.append(pointsLe[i])
+ pointsRc.append(pointsRe[i])
+ else:
+ pointsLc.extend((pointsLe[i],points[i+1],pointsLs[i+1]))
+ pointsRc.extend((pointsRe[i],points[i+1],pointsRs[i+1]))
+ else:
+ cornerpointL = cornerpointL[0] # because Mathutils.LineIntersect() -> (pkt1,pkt2)
+ cornerpointR = cornerpointR[0]
+ #print 'deb:drawPoly2d cornerpointL: ', cornerpointL #-------------
+ #print 'deb:drawPoly2d cornerpointR: ', cornerpointR #-------------
+ pointVec0 = Mathutils.Vector(points[i])
+ pointVec = Mathutils.Vector(points[i+1])
+ pointVec2 = Mathutils.Vector(points[i+2])
+ #print 'deb:drawPoly2d pointVec0: ', pointVec0 #-------------
+ #print 'deb:drawPoly2d pointVec: ', pointVec #-------------
+ #print 'deb:drawPoly2d pointVec2: ', pointVec2 #-------------
+ # if diststance(cornerL-center-cornerR) < limiter * (seg1_endWidth + seg2_startWidth)
+ max_cornerDist = (vecL2 - vecR2).length + (vecL3 - vecR3).length
+ is_cornerDist = (cornerpointL - pointVec).length + (cornerpointR - pointVec).length
+ #corner_angle = Mathutils.AngleBetweenVecs((pointVec0 - pointVec),(pointVec - pointVec2))
+ #print 'deb:drawPoly2d corner_angle: ', corner_angle #-------------
+ #print 'deb:drawPoly2d max_cornerDist, is_cornerDist: ', max_cornerDist, is_cornerDist #-------------
+ #if abs(corner_angle) < 90.0:
+ # intersection --------- limited by TRIM_LIMIT (1.0 - 5.0)
+ if is_cornerDist < max_cornerDist * settings.var['pl_trim_max']:
+ # clean corner intersection
+ pointsLc.append(cornerpointL)
+ pointsRc.append(cornerpointR)
+ elif False: # the standard no-intersection
+ # --todo-- not optimal, because produces X-face
+ pointsLc.extend((pointsLe[i],pointsLs[i+1]))
+ pointsRc.extend((pointsRe[i],pointsRs[i+1]))
+ elif False: # --todo-- the optimised non-intersection
+ if (cornerpointL - vecL1).length < (cornerpointR - vecR1).length:
+ left_angle = True
+ else:
+ left_angle = False
+ limit_dist = settings.var['dist_min']
+ if left_angle: # if left turning angle
+ print 'deb:drawPoly2d it is left turning angle' #-------------
+ # to avoid triangelface/doubleVertex
+ delta1 = (cornerpointL - vecL1).normalize() * limit_dist
+ delta4 = (cornerpointL - vecL4).normalize() * limit_dist
+ pointsLc.extend((cornerpointL - delta1, cornerpointL - delta4))
+ pointsRc.extend((pointsRe[i],pointsRs[i+1]))
+ else: # if right turning angle
+ print 'deb:drawPoly2d right turning angle' #-------------
+ delta1 = (cornerpointR - vecR1).normalize() * limit_dist
+ delta4 = (cornerpointR - vecR4).normalize() * limit_dist
+ pointsRc.extend((cornerpointR - delta1, cornerpointR - delta4))
+ pointsLc.extend((pointsLe[i],pointsLs[i+1]))
+ else:
+ pointsLc.extend((pointsLe[i],points[i+1],pointsLs[i+1]))
+ pointsRc.extend((pointsRe[i],points[i+1],pointsRs[i+1]))
+ if not self.closed:
+ pointsLc.append(pointsLe[-1])
+ pointsRc.append(pointsRe[-1])
+
+ # 2.level:IF width but no-trim
+ else:
+ # loop preset
+ # set STARTpoints of the first point points[0]
+ if not self.closed:
+ pointsLc.append(pointsLs[0])
+ pointsRc.append(pointsRs[0])
+ else:
+ pointsLs.append(pointsLs[0])
+ pointsRs.append(pointsRs[0])
+ pointsLe.append(pointsLe[0])
+ pointsRe.append(pointsRe[0])
+ points.append(points[0])
+ vecL3, vecL4 = pointsLs[0], pointsLe[0]
+ vecR3, vecR4 = pointsRs[0], pointsRe[0]
+ lenL = len(pointsLs)-1
+ #print 'deb:drawPoly2d pointsLs():\n', pointsLs #----------------
+ #print 'deb:drawPoly2d lenL, len.pointsLs():', lenL,',', len(pointsLs) #----------------
+ bulg_in = False
+ last_bulg_point = False
+
+ # LOOP: makes (ENDpoints[i],STARTpoints[i+1])
+ for i in xrange(lenL):
+ vecL1, vecL2 = vecL3, vecL4
+ vecR1, vecR2 = vecR3, vecR4
+ vecL3, vecL4 = pointsLs[i+1], pointsLe[i+1]
+ vecR3, vecR4 = pointsRs[i+1], pointsRe[i+1]
+ if bulg_points[i] != None:
+ #compute left- and right-cornerpoints
+ if True:
+ cornerpointL = Mathutils.LineIntersect(vecL1, vecL2, vecL3, vecL4)
+ cornerpointR = Mathutils.LineIntersect(vecR1, vecR2, vecR3, vecR4)
+ pointsLc.append(cornerpointL[0])
+ pointsRc.append(cornerpointR[0])
+ else:
+ pointVec = Mathutils.Vector(point[i])
+
+ else: # IF non-bulg
+ pointsLc.extend((pointsLe[i],points[i+1],pointsLs[i+1]))
+ pointsRc.extend((pointsRe[i],points[i+1],pointsRs[i+1]))
+ if not self.closed:
+ pointsLc.append(pointsLe[-1])
+ pointsRc.append(pointsRe[-1])
+
+ len1 = len(pointsLc)
+ #print 'deb:drawPoly2d len1:', len1 #-----------------------
+ #print 'deb:drawPoly2d len1 len(pointsLc),len(pointsRc):', len(pointsLc),len(pointsRc) #-----------------------
+ pointsW = pointsLc + pointsRc # all_points_List = left_side + right_side
+ #print 'deb:drawPoly2d pointsW():\n', pointsW #----------------
+
+ # 2.level:IF width and thickness ---------------------
+ if thic != 0:
+ thic_pointsW = []
+ thic_pointsW.extend([[point[0], point[1], point[2]+thic] for point in pointsW])
+ if thic < 0.0:
+ thic_pointsW.extend(pointsW)
+ pointsW = thic_pointsW
+ else:
+ pointsW.extend(thic_pointsW)
+ faces = []
+ f_start, f_end = [], []
+ f_bottom = [[num, num+1, len1+num+1, len1+num] for num in xrange(len1-1)]
+ f_top = [[num, len1+num, len1+num+1, num+1] for num in xrange(len1+len1, len1+len1+len1-1)]
+ f_left = [[num, len1+len1+num, len1+len1+num+1, num+1] for num in xrange(len1-1)]
+ f_right = [[num, num+1, len1+len1+num+1, len1+len1+num] for num in xrange(len1, len1+len1-1)]
+
+ if self.closed:
+ f_bottom.append([len1-1, 0, len1, len1+len1-1]) #bottom face
+ f_top.append( [len1+len1+len1-1, len1+len1+len1+len1-1, len1+len1+len1, len1+len1+0]) #top face
+ f_left.append( [0, len1-1, len1+len1+len1-1, len1+len1]) #left face
+ f_right.append( [len1, len1+len1+len1, len1+len1+len1+len1-1, len1+len1-1]) #right face
+ else:
+ f_start = [[0, len1, len1+len1+len1, len1+len1]]
+ f_end = [[len1+len1-1, 0+len1-1, len1+len1+len1-1, len1+len1+len1+len1-1]]
+
+ faces = f_left + f_right + f_bottom + f_top + f_start + f_end
+ #faces = f_bottom + f_top
+ #faces = f_left + f_right + f_start + f_end
+ #print 'deb:faces_list:\n', faces #-----------------------
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ me.verts.extend(pointsW) # add vertices to mesh
+ me.faces.extend(faces) # add faces to the mesh
+
+ # each MeshSide becomes vertexGroup for easier material assignment ---------------------
+ # The mesh must first be linked to an object so the method knows which object to update.
+ # This is because vertex groups in Blender are stored in the object -- not in the mesh,
+ # which may be linked to more than one object.
+ if settings.var['vGroup_on']:
+ # each MeshSide becomes vertexGroup for easier material assignment ---------------------
+ replace = Blender.Mesh.AssignModes.REPLACE #or .AssignModes.ADD
+ vg_left, vg_right, vg_top, vg_bottom = [], [], [], []
+ for v in f_left: vg_left.extend(v)
+ for v in f_right: vg_right.extend(v)
+ for v in f_top: vg_top.extend(v)
+ for v in f_bottom: vg_bottom.extend(v)
+ me.addVertGroup('side.left') ; me.assignVertsToGroup('side.left', list(set(vg_left)), 1.0, replace)
+ me.addVertGroup('side.right') ; me.assignVertsToGroup('side.right', list(set(vg_right)), 1.0, replace)
+ me.addVertGroup('side.top') ; me.assignVertsToGroup('side.top', list(set(vg_top)), 1.0, replace)
+ me.addVertGroup('side.bottom'); me.assignVertsToGroup('side.bottom',list(set(vg_bottom)), 1.0, replace)
+ if not self.closed:
+ me.addVertGroup('side.start'); me.assignVertsToGroup('side.start', f_start[0], 1.0, replace)
+ me.addVertGroup('side.end') ; me.assignVertsToGroup('side.end', f_end[0], 1.0, replace)
+
+ if settings.var['meshSmooth_on']: # left and right side become smooth ----------------------
+ #if self.spline or self.curved:
+ if True:
+ smooth_len = len(f_left) + len(f_right)
+ for i in xrange(smooth_len):
+ me.faces[i].smooth = True
+ #me.Modes(AUTOSMOOTH)
+
+ # 2.level:IF width, but no-thickness ---------------------
+ else:
+ faces = []
+ faces = [[num, len1+num, len1+num+1, num+1] for num in xrange(len1 - 1)]
+ if self.closed:
+ faces.append([len1, 0, len1-1, len1+len1-1])
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ me.verts.extend(pointsW) # add vertices to mesh
+ me.faces.extend(faces) # add faces to the mesh
+
+
+ # 1.level:IF no-width, but thickness ---------------------
+ elif thic != 0:
+ len1 = len(points)
+ thic_points = []
+ thic_points.extend([[point[0], point[1], point[2]+thic] for point in points])
+ if thic < 0.0:
+ thic_points.extend(points)
+ points = thic_points
+ else:
+ points.extend(thic_points)
+ faces = []
+ faces = [[num, num+1, num+len1+1, num+len1] for num in xrange(len1 - 1)]
+ if self.closed:
+ faces.append([len1-1, 0, len1, 2*len1-1])
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ me.verts.extend(points) # add vertices to mesh
+ me.faces.extend(faces) # add faces to the mesh
+
+ if settings.var['meshSmooth_on']: # left and right side become smooth ----------------------
+ #if self.spline or self.curved:
+ if True:
+ for i in xrange(len(faces)):
+ me.faces[i].smooth = True
+ #me.Modes(AUTOSMOOTH)
+
+ # 1.level:IF no-width and no-thickness ---------------------
+ else:
+ edges = [[num, num+1] for num in xrange(len(points)-1)]
+ if self.closed:
+ edges.append([len(points)-1, 0])
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ me.verts.extend(points) # add vertices to mesh
+ me.edges.extend(edges) # add edges to the mesh
+
+ transform(self.extrusion, 0, ob)
+ #print 'deb:polyline.draw.END:----------------' #-----------------------
+ return ob
+
+
+
+
+class Vertex(object): #-----------------------------------------------------------------
+ """Generic vertex object used by POLYLINEs (and maybe others).
+ """
+
+ def __init__(self, obj=None):
+ """Initializes vertex data.
+
+ The optional obj arg is an entity object of type vertex.
+ """
+ #print 'deb:Vertex.init.START:----------------' #-----------------------
+ self.loc = [0,0,0]
+ self.face = []
+ self.swidth = 0
+ self.ewidth = 0
+ self.bulge = 0
+ if obj is not None:
+ if not obj.type == 'vertex':
+ raise TypeError, "Wrong type %s for vertex object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+ self.get_props(obj.data)
+ #print 'deb:Vertex.init.END:----------------' #------------------------
+
+
+ def get_props(self, data):
+ """Gets coords for a VERTEX type object.
+
+ Each vert can have a number of properties.
+ Verts should be coded as
+ 10:xvalue
+ 20:yvalue
+ 40:startwidth or 0
+ 41:endwidth or 0
+ 42:bulge or 0
+ """
+ self.x = getit(data, 10, None)
+ self.y = getit(data, 20, None)
+ self.z = getit(data, 30, None)
+
+ self.flags = getit(data, 70, 0) # flags
+ self.curved = self.flags&1 # Bezier-curve-fit:additional-vertex
+ self.curv_t = self.flags&2 # Bezier-curve-fit:tangent exists
+ self.spline = self.flags&8 # Bspline-fit:additional-vertex
+ self.splin2 = self.flags&16 # Bspline-fit:control-vertex
+ self.poly3d = self.flags&32 # polyline3d:control-vertex
+ self.plmesh = self.flags&64 # polymesh3d:control-vertex
+ self.plface = self.flags&128 # polyface
+
+ # if PolyFace.Vertex with Face_definition
+ if self.curv_t:
+ self.curv_tangent = getit(data, 50, None) # curve_tangent
+
+ if self.plface and not self.plmesh:
+ v1 = getit(data, 71, 0) # polyface:Face.vertex 1.
+ v2 = getit(data, 72, 0) # polyface:Face.vertex 2.
+ v3 = getit(data, 73, 0) # polyface:Face.vertex 3.
+ v4 = getit(data, 74, None) # polyface:Face.vertex 4.
+ self.face = [abs(v1)-1,abs(v2)-1,abs(v3)-1]
+ if v4 != None:
+ self.face.append(abs(v4)-1)
+ else: #--parameter for polyline2d
+ self.swidth = getit(data, 40, None) # start width
+ self.ewidth = getit(data, 41, None) # end width
+ self.bulge = getit(data, 42, 0) # bulge of segment
+
+
+ def __len__(self):
+ return 3
+
+
+ def __getitem__(self, key):
+ return self.loc[key]
+
+
+ def __setitem__(self, key, value):
+ if key in [0,1,2]:
+ self.loc[key]
+
+
+ def __iter__(self):
+ return self.loc.__iter__()
+
+
+ def __str__(self):
+ return str(self.loc)
+
+
+ def __repr__(self):
+ return "Vertex %s, swidth=%s, ewidth=%s, bulge=%s, face=%s" %(self.loc, self.swidth, self.ewidth, self.bulge, self.face)
+
+
+ def getx(self):
+ return self.loc[0]
+ def setx(self, value):
+ self.loc[0] = value
+ x = property(getx, setx)
+
+
+ def gety(self):
+ return self.loc[1]
+ def sety(self, value):
+ self.loc[1] = value
+ y = property(gety, sety)
+
+
+ def getz(self):
+ return self.loc[2]
+ def setz(self, value):
+ self.loc[2] = value
+ z = property(getz, setz)
+
+
+
+class Text: #-----------------------------------------------------------------
+ """Class for objects representing dxf TEXT.
+ """
+ def __init__(self, obj):
+ """Expects an entity object of type text as input.
+ """
+ if not obj.type == 'text':
+ raise TypeError, "Wrong type %s for text object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ # required data
+ self.height = 1.7 * obj.get_type(40)[0] #text.height
+ self.value = obj.get_type(1)[0] #The text string value
+
+ # optional data (with defaults)
+ self.space = getit(obj, 67, 0)
+ self.color_index = getit(obj, 62, BYLAYER)
+ self.thic = getit(obj, 39, 0)
+
+ self.rotation = getit(obj, 50, 0) # radians
+ self.width_factor = getit(obj, 41, 1) # Scaling factor along local x axis
+ self.oblique = getit(obj, 51, 0) # oblique angle: skew in degrees -90 <= oblique <= 90
+
+ #self.style = getit(obj, 7, 'STANDARD') # --todo---- Text style name (optional, default = STANDARD)
+
+ #Text generation flags (optional, default = 0):
+ #2 = backward (mirrored in X),
+ #4 = upside down (mirrored in Y)
+ self.flags = getit(obj, 71, 0)
+ self.mirrorX, self.mirrorY = 1.0, 1.0
+ if self.flags&2: self.mirrorX = - 1.0
+ if self.flags&4: self.mirrorY = - 1.0
+
+ # vertical.alignment: 0=baseline, 1=bottom, 2=middle, 3=top
+ self.valignment = getit(obj, 73, 0)
+ #Horizontal text justification type (optional, default = 0) integer codes (not bit-coded)
+ #0=left, 1=center, 2=right
+ #3=aligned, 4=middle, 5=fit
+ self.halignment = getit(obj, 72, 0)
+
+ self.layer = getit(obj.data, 8, None)
+ self.loc1, self.loc2 = self.get_loc(obj.data)
+ if self.loc2[0] != None and self.halignment != 5:
+ self.loc = self.loc2
+ else:
+ self.loc = self.loc1
+ self.extrusion = get_extrusion(obj.data)
+
+
+
+ def get_loc(self, data):
+ """Gets adjusted location for text type objects.
+
+ If group 72 and/or 73 values are nonzero then the first alignment point values
+ are ignored and AutoCAD calculates new values based on the second alignment
+ point and the length and height of the text string itself (after applying the
+ text style). If the 72 and 73 values are zero or missing, then the second
+ alignment point is meaningless.
+ I don't know how to calc text size...
+ """
+ # bottom left x, y, z and justification x, y, z = 0
+ #x, y, z, jx, jy, jz = 0, 0, 0, 0, 0, 0
+ x = getit(data, 10, None) #First alignment point (in OCS).
+ y = getit(data, 20, None)
+ z = getit(data, 30, 0.0)
+ jx = getit(data, 11, None) #Second alignment point (in OCS).
+ jy = getit(data, 21, None)
+ jz = getit(data, 31, 0.0)
+ return [x, y, z],[jx, jy, jz]
+
+
+ def __repr__(self):
+ return "%s: layer - %s, value - %s" %(self.__class__.__name__, self.layer, self.value)
+
+
+ def draw(self, settings):
+ """for TEXTs: generate Blender_geometry.
+ """
+ obname = 'tx_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ txt = Text3d.New(obname)
+ ob = SCENE.objects.new(txt) # create a new text_object
+
+ txt.setText(self.value)
+ txt.setSize(1.0) #Blender<2.45 accepts only (0.0 - 5.0)
+ #txt.setSize(self.height)
+ #txt.setWidth(self.bold)
+ #setLineSeparation(sep)
+ txt.setShear(self.oblique/90)
+
+ thic = set_thick(self.thic, settings)
+ if thic != 0.0:
+ thic = self.thic * 0.5
+ self.loc[2] += thic
+ txt.setExtrudeDepth(1.0) #Blender<2.45 accepts only (0.1 - 10.0)
+ if self.halignment == 0:
+ align = Text3d.LEFT
+ elif self.halignment == 1:
+ align = Text3d.MIDDLE
+ elif self.halignment == 2:
+ align = Text3d.RIGHT
+ else:
+ align = Text3d.LEFT
+ txt.setAlignment(align)
+
+ if self.valignment == 1:
+ txt.setYoffset(0.0)
+ elif self.valignment == 2:
+ txt.setYoffset(- self.height * 0.5)
+ elif self.valignment == 3:
+ txt.setYoffset(- self.height)
+
+ # move the object center to the text location
+ ob.loc = tuple(self.loc)
+ transform(self.extrusion, self.rotation, ob)
+
+ # flip it and scale it to the text width
+ ob.SizeX *= self.height * self.width_factor * self.mirrorX
+ ob.SizeY *= self.height * self.mirrorY
+ if thic != 0.0: ob.SizeZ *= abs(thic)
+ return ob
+
+
+
+def set_thick(thickness, settings):
+ """Set thickness relative to settings variables.
+
+ Set thickness relative to settings variables:
+ 'thick_on','thick_force','thick_min'.
+ Accepted also minus values of thickness
+ python trick: sign(x)=cmp(x,0)
+ """
+ if settings.var['thick_force']:
+ if settings.var['thick_on']:
+ if abs(thickness) < settings.var['thick_min']:
+ thic = settings.var['thick_min'] * cmp(thickness,0)
+ else: thic = thickness
+ else: thic = settings.var['thick_min']
+ else:
+ if settings.var['thick_on']: thic = thickness
+ else: thic = 0.0
+ return thic
+
+
+
+
+class Mtext: #-----------------------------------------------------------------
+ """Class for objects representing dxf MTEXT.
+ """
+
+ def __init__(self, obj):
+ """Expects an entity object of type mtext as input.
+ """
+ if not obj.type == 'mtext':
+ raise TypeError, "Wrong type %s for mtext object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ # required data
+ self.height = obj.get_type(40)[0]
+ self.width = obj.get_type(41)[0]
+ self.alignment = obj.get_type(71)[0] # alignment 1=TL, 2=TC, 3=TR, 4=ML, 5=MC, 6=MR, 7=BL, 8=BC, 9=BR
+ self.value = self.get_text(obj.data) # The text string value
+
+ # optional data (with defaults)
+ self.space = getit(obj, 67, 0)
+ self.color_index = getit(obj, 62, BYLAYER)
+ self.rotation = getit(obj, 50, 0) # radians
+
+ self.width_factor = getit(obj, 42, 1) # Scaling factor along local x axis
+ self.line_space = getit(obj, 44, 1) # percentage of default
+
+ self.layer = getit(obj.data, 8, None)
+ self.loc = self.get_loc(obj.data)
+ self.extrusion = get_extrusion(obj.data)
+
+
+ def get_text(self, data):
+ """Reconstructs mtext data from dxf codes.
+ """
+ primary = ''
+ secondary = []
+ for item in data:
+ if item[0] == 1: # There should be only one primary...
+ primary = item[1]
+ elif item[0] == 3: # There may be any number of extra strings (in order)
+ secondary.append(item[1])
+ if not primary:
+ #raise ValueError, "Empty Mtext Object!"
+ string = "Empty Mtext Object!"
+ if not secondary:
+ string = primary.replace(r'\P', '\n')
+ else:
+ string = ''.join(secondary)+primary
+ string = string.replace(r'\P', '\n')
+ return string
+
+
+ def get_loc(self, data):
+ """Gets location for a mtext type objects.
+
+ Mtext objects have only one point indicating
+ """
+ loc = [0, 0, 0]
+ loc[0] = getit(data, 10, None)
+ loc[1] = getit(data, 20, None)
+ loc[2] = getit(data, 30, 0.0)
+ return loc
+
+
+ def __repr__(self):
+ return "%s: layer - %s, value - %s" %(self.__class__.__name__, self.layer, self.value)
+
+
+ def draw(self, settings):
+ """for MTEXTs: generate Blender_geometry.
+ """
+ # Now Create an object
+ obname = 'tm_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ txt = Text3d.New(obname)
+ ob = SCENE.objects.new(txt) # create a new text_object
+
+ txt.setSize(1)
+ # Blender doesn't give access to its text object width currently
+ # only to the text3d's curve width...
+ #txt.setWidth(text.width/10)
+ txt.setLineSeparation(self.line_space)
+ txt.setExtrudeDepth(0.5)
+ txt.setText(self.value)
+
+ # scale it to the text size
+ ob.SizeX = self.height * self.width_factor
+ ob.SizeY = self.height
+ ob.SizeZ = self.height
+
+ # move the object center to the text location
+ ob.loc = tuple(self.loc)
+ transform(self.extrusion, self.rotation, ob)
+
+ return ob
+
+
+
+
+class Circle: #-----------------------------------------------------------------
+ """Class for objects representing dxf CIRCLEs.
+ """
+
+ def __init__(self, obj):
+ """Expects an entity object of type circle as input.
+ """
+ if not obj.type == 'circle':
+ raise TypeError, "Wrong type %s for circle object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ # required data
+ self.radius = obj.get_type(40)[0]
+
+ # optional data (with defaults)
+ self.space = getit(obj, 67, 0)
+ self.thic = getit(obj, 39, 0)
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.layer = getit(obj.data, 8, None)
+ self.loc = self.get_loc(obj.data)
+ self.extrusion = get_extrusion(obj.data)
+
+
+
+ def get_loc(self, data):
+ """Gets the center location for circle type objects.
+
+ Circles have a single coord location.
+ """
+ loc = [0, 0, 0]
+ loc[0] = getit(data, 10, None)
+ loc[1] = getit(data, 20, None)
+ loc[2] = getit(data, 30, 0.0)
+ return loc
+
+
+
+ def __repr__(self):
+ return "%s: layer - %s, radius - %s" %(self.__class__.__name__, self.layer, self.radius)
+
+
+ def draw(self, settings):
+ """for CIRCLE: generate Blender_geometry.
+ """
+ obname = 'ci_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ radius = self.radius
+
+ thic = set_thick(self.thic, settings)
+ if settings.var['curves_on']:
+ if False: # universal version
+ arc_res = 4 # ONLY 4 works well for point.handleTypes = [AUTO, AUTO]
+ start, end = 0.0, 360.0
+ verts = calcArc(None, radius, start, end, arc_res, True)
+ c = Curve.New(obname) # create new curve data
+ curve = c.appendNurb(BezTriple.New(verts[0]))
+ for p in verts[1:-1]:
+ curve.append(BezTriple.New(p))
+ for point in curve:
+ point.handleTypes = [AUTO, AUTO]
+ elif True: # universal version
+ arc_res = settings.var['curve_arc']
+ #arc_res = 3
+ start, end = 0.0, 360.0
+ VectorTriples = calcArc(None, radius, start, end, arc_res, True)
+ c = Curve.New(obname) # create new curve data
+ curve = c.appendNurb(BezTriple.New(VectorTriples[0]))
+ for p in VectorTriples[1:-1]:
+ curve.append(BezTriple.New(p))
+ for point in curve:
+ point.handleTypes = [FREE, FREE]
+ else: # standard version
+ c = Curve.New(obname) # create new curve data
+ p1 = (0, -radius, 0)
+ p2 = (radius, 0, 0)
+ p3 = (0, radius, 0)
+ p4 = (-radius, 0, 0)
+
+ p1 = BezTriple.New(p1)
+ p2 = BezTriple.New(p2)
+ p3 = BezTriple.New(p3)
+ p4 = BezTriple.New(p4)
+
+ curve = c.appendNurb(p1)
+ curve.append(p2)
+ curve.append(p3)
+ curve.append(p4)
+ for point in curve:
+ point.handleTypes = [AUTO, AUTO]
+
+ curve.flagU = 1 # 1 sets the curve cyclic=closed
+ if settings.var['fill_on']:
+ c.setFlag(6) # 2+4 set top and button caps
+ else:
+ c.setFlag(c.getFlag() & ~6) # dont set top and button caps
+
+ c.update()
+
+ #remi --todo-----to check---------------------------
+ ob = SCENE.objects.new(c) # create a new curve_object
+ ob.loc = tuple(self.loc)
+ if thic != 0.0: #hack: Blender<2.45 curve-extrusion
+ thic = thic * 0.5
+ c.setExt1(1.0) # curve-extrusion accepts only (0.0 - 2.0)
+ ob.LocZ = thic + self.loc[2]
+ transform(self.extrusion, 0, ob)
+ if thic != 0.0:
+ ob.SizeZ *= abs(thic)
+ return ob
+
+ elif False: # create a new mesh_object with buildin_circle_primitive
+ verts_num = settings.var['arc_res'] * sqrt(radius / settings.var['arc_rad'])
+ if verts_num > 100: verts_num = 100 # Blender accepts only values [3:500]
+ if verts_num < 4: verts_num = 4 # Blender accepts only values [3:500]
+ if thic != 0:
+ loc2 = thic * 0.5 #-----blenderAPI draw Cylinder with 2*thickness
+ self.loc[2] += loc2 #---new location for the basis of cylinder
+ #print 'deb:circleDraw:self.loc2:', self.loc #-----------------------
+ c = Mesh.Primitives.Cylinder(int(verts_num), radius*2, abs(thic))
+ else:
+ c = Mesh.Primitives.Circle(int(verts_num), radius*2)
+
+ #c.update()
+ ob = SCENE.objects.new(c, obname) # create a new circle_mesh_object
+ ob.loc = tuple(self.loc)
+ transform(self.extrusion, 0, ob)
+ return ob
+
+ else: # draw CIRCLE as mesh -----------------------------------------------
+ cir = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(cir) # create a new circle_object
+ # set a number of segments in entire circle
+ arc_res = settings.var['arc_res'] * sqrt(radius) / sqrt(settings.var['arc_rad'])
+ start, end = 0.0 , 360.0
+ verts = calcArc(None, radius, start, end, arc_res, False)
+ verts = verts[:-1] #list without last point/edge (cause by circle it is equal to the first point)
+ #print 'deb:circleDraw:edges:', edges #---------------
+ if thic != 0:
+ len1 = len(verts)
+ thic_verts = []
+ thic_verts.extend([[point[0], point[1], point[2]+thic] for point in verts])
+ if thic < 0.0:
+ thic_verts.extend(verts)
+ verts = thic_verts
+ else:
+ verts.extend(thic_verts)
+ faces = []
+ f_band = [[num, num+1, num+len1+1, num+len1] for num in xrange(len1 - 1)]
+ #f_band = [[num, num+1, num+len1+1, num+len1] for num in xrange(len1)]
+ f_band.append([len1 - 1, 0, len1, len1 + len1 -1])
+ faces = f_band
+ smooth_len = len(f_band)
+ if settings.var['fill_on']:
+ if thic < 0.0:
+ verts.append([0,0,thic]) #center of top side
+ verts.append([0,0,0]) #center of bottom side
+ else:
+ verts.append([0,0,0]) #center of bottom side
+ verts.append([0,0,thic]) #center of top side
+ center1 = len(verts)-2
+ center2 = len(verts)-1
+ f_bottom = [[num+1, num, center1] for num in xrange(len1 - 1)]
+ f_bottom.append([0, len1 - 1, center1])
+ f_top = [[num+len1, num+1+len1, center2] for num in xrange(len1 - 1)]
+ f_top.append([len1-1+len1, 0+len1, center2])
+ #print 'deb:circleDraw:verts:', verts #---------------
+ faces = f_band + f_bottom + f_top
+ #print 'deb:circleDraw:faces:', faces #---------------
+ cir.verts.extend(verts) # add vertices to mesh
+ cir.faces.extend(faces) # add faces to the mesh
+
+ if settings.var['meshSmooth_on']: # left and right side become smooth ----------------------
+ for i in xrange(smooth_len):
+ cir.faces[i].smooth = True
+ # each MeshSide becomes vertexGroup for easier material assignment ---------------------
+ if settings.var['vGroup_on']:
+ # each MeshSide becomes vertexGroup for easier material assignment ---------------------
+ replace = Blender.Mesh.AssignModes.REPLACE #or .AssignModes.ADD
+ vg_band, vg_top, vg_bottom = [], [], []
+ for v in f_band: vg_band.extend(v)
+ cir.addVertGroup('side.band') ; cir.assignVertsToGroup('side.band', list(set(vg_band)), 1.0, replace)
+ if settings.var['fill_on']:
+ for v in f_top: vg_top.extend(v)
+ for v in f_bottom: vg_bottom.extend(v)
+ cir.addVertGroup('side.top') ; cir.assignVertsToGroup('side.top', list(set(vg_top)), 1.0, replace)
+ cir.addVertGroup('side.bottom'); cir.assignVertsToGroup('side.bottom',list(set(vg_bottom)), 1.0, replace)
+
+ else: # if thic == 0
+ if settings.var['fill_on']:
+ len1 = len(verts)
+ verts.append([0,0,0]) #center of circle
+ center1 = len1
+ faces = []
+ faces.extend([[num, num+1, center1] for num in xrange(len1)])
+ faces.append([len1-1, 0, center1])
+ #print 'deb:circleDraw:verts:', verts #---------------
+ #print 'deb:circleDraw:faces:', faces #---------------
+ cir.verts.extend(verts) # add vertices to mesh
+ cir.faces.extend(faces) # add faces to the mesh
+ else:
+ cir.verts.extend(verts) # add vertices to mesh
+ edges = [[num, num+1] for num in xrange(len(verts))]
+ edges[-1][1] = 0 # it points the "new" last edge to the first vertex
+ cir.edges.extend(edges) # add edges to the mesh
+
+ ob.loc = tuple(self.loc)
+ transform(self.extrusion, 0, ob)
+ return ob
+
+
+
+
+class Arc: #-----------------------------------------------------------------
+ """Class for objects representing dxf ARCs.
+ """
+
+ def __init__(self, obj):
+ """Expects an entity object of type arc as input.
+ """
+ if not obj.type == 'arc':
+ raise TypeError, "Wrong type %s for arc object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ # required data
+ self.radius = obj.get_type(40)[0]
+ self.start_angle = obj.get_type(50)[0]
+ self.end_angle = obj.get_type(51)[0]
+
+ # optional data (with defaults)
+ self.space = getit(obj, 67, 0)
+ self.thic = getit(obj, 39, 0)
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.layer = getit(obj.data, 8, None)
+ self.loc = self.get_loc(obj.data)
+ self.extrusion = get_extrusion(obj.data)
+ #print 'deb:Arc__init__: center, radius, start, end:\n', self.loc, self.radius, self.start_angle, self.end_angle #---------
+
+
+
+ def get_loc(self, data):
+ """Gets the center location for arc type objects.
+
+ Arcs have a single coord location.
+ """
+ loc = [0, 0, 0]
+ loc[0] = getit(data, 10, None)
+ loc[1] = getit(data, 20, None)
+ loc[2] = getit(data, 30, 0.0)
+ return loc
+
+
+
+ def __repr__(self):
+ return "%s: layer - %s, radius - %s" %(self.__class__.__name__, self.layer, self.radius)
+
+
+ def draw(self, settings):
+ """for ARC: generate Blender_geometry.
+ """
+ obname = 'ar_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+
+ center = self.loc
+ radius = self.radius
+ start = self.start_angle
+ end = self.end_angle
+ #print 'deb:calcArcPoints:\n center, radius, start, end:\n', center, radius, start, end #---------
+ thic = set_thick(self.thic, settings)
+ width = 0.0
+ if settings.var['lines_as'] == 4: # as thin_box
+ thic = settings.var['thick_min']
+ width = settings.var['width_min']
+ if settings.var['lines_as'] == 3: # as thin cylinder
+ cyl_rad = 0.5 * settings.var['width_min']
+
+ if settings.var['curves_on']: # draw ARC as curve -------------
+ arc_res = settings.var['curve_arc']
+ triples = True
+ VectorTriples = calcArc(None, radius, start, end, arc_res, triples)
+ arc = Curve.New(obname) # create new curve data
+ curve = arc.appendNurb(BezTriple.New(VectorTriples[0]))
+ for p in VectorTriples[1:]:
+ curve.append(BezTriple.New(p))
+ for point in curve:
+ point.handleTypes = [FREE, FREE]
+ curve.flagU = 0 # 0 sets the curve not cyclic=open
+ arc.update() #important for handles calculation
+
+ ob = SCENE.objects.new(arc) # create a new curve_object
+ ob.loc = tuple(self.loc)
+ if thic != 0.0: #hack: Blender<2.45 curve-extrusion
+ thic = thic * 0.5
+ arc.setExt1(1.0) # curve-extrusion: Blender2.45 accepts only (0.0 - 5.0)
+ ob.LocZ = thic + self.loc[2]
+ transform(self.extrusion, 0, ob)
+ if thic != 0.0:
+ ob.SizeZ *= abs(thic)
+ return ob
+
+ else: # draw ARC as mesh --------------------
+ arc = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(arc) # create a new arc_object
+ # set a number of segments in entire circle
+ arc_res = settings.var['arc_res'] * sqrt(radius) / sqrt(settings.var['arc_rad'])
+
+ verts = calcArc(None, radius, start, end, arc_res, False)
+ #verts = [list(point) for point in verts]
+ len1 = len(verts)
+ #print 'deb:len1:', len1 #-----------------------
+ if width != 0:
+ if False:
+ radius_out = radius + (0.5 * width)
+ radius_in = radius - (0.5 * width)
+ if radius_in <= 0.0:
+ radius_in = settings.var['dist_min']
+ #radius_in = 0.0
+ verts_in = []
+ verts_out = []
+ for point in verts:
+ pointVec = Mathutils.Vector(point)
+ pointVec = pointVec.normalize()
+ verts_in.append(list(radius_in * pointVec)) #vertex inside
+ verts_out.append(list(radius_out * pointVec)) #vertex outside
+ verts = verts_in + verts_out
+ else:
+ radius_out = radius + (0.5 * width)
+ radius_in = radius - (0.5 * width)
+ if radius_in <= 0.0:
+ radius_in = settings.var['dist_min']
+ #radius_in = 0.0
+ verts_in = []
+ verts_out = []
+ for point in verts:
+ pointVec = Mathutils.Vector(point)
+ pointVec = pointVec.normalize()
+ verts_in.append(list(radius_in * pointVec)) #vertex inside
+ verts_out.append(list(radius_out * pointVec)) #vertex outside
+ verts = verts_in + verts_out
+
+ #print 'deb:verts:', verts #---------------------
+ if thic != 0:
+ thic_verts = []
+ thic_verts.extend([[point[0], point[1], point[2]+thic] for point in verts])
+ if thic < 0.0:
+ thic_verts.extend(verts)
+ verts = thic_verts
+ else:
+ verts.extend(thic_verts)
+ f_bottom = [[num, num+1, len1+num+1, len1+num] for num in xrange(len1-1)]
+ f_top = [[num, len1+num, len1+num+1, num+1] for num in xrange(len1+len1, len1+len1+len1-1)]
+ f_left = [[num, len1+len1+num, len1+len1+num+1, num+1] for num in xrange(len1-1)]
+ f_right = [[num, num+1, len1+len1+num+1, len1+len1+num] for num in xrange(len1, len1+len1-1)]
+ f_start = [[0, len1, len1+len1+len1, len1+len1]]
+ f_end = [[len1+len1-1, 0+len1-1, len1+len1+len1-1, len1+len1+len1+len1-1]]
+ faces = f_left + f_right + f_bottom + f_top + f_start + f_end
+
+ arc.verts.extend(verts) # add vertices to mesh
+ arc.faces.extend(faces) # add faces to the mesh
+
+ if settings.var['meshSmooth_on']: # left and right side become smooth ----------------------
+ smooth_len = len(f_left) + len(f_right)
+ for i in xrange(smooth_len):
+ arc.faces[i].smooth = True
+ # each MeshSide becomes vertexGroup for easier material assignment ---------------------
+ if settings.var['vGroup_on']:
+ # each MeshSide becomes vertexGroup for easier material assignment ---------------------
+ replace = Blender.Mesh.AssignModes.REPLACE #or .AssignModes.ADD
+ vg_left, vg_right, vg_top, vg_bottom = [], [], [], []
+ for v in f_left: vg_left.extend(v)
+ for v in f_right: vg_right.extend(v)
+ for v in f_top: vg_top.extend(v)
+ for v in f_bottom: vg_bottom.extend(v)
+ arc.addVertGroup('side.left') ; arc.assignVertsToGroup('side.left', list(set(vg_left)), 1.0, replace)
+ arc.addVertGroup('side.right') ; arc.assignVertsToGroup('side.right', list(set(vg_right)), 1.0, replace)
+ arc.addVertGroup('side.top') ; arc.assignVertsToGroup('side.top', list(set(vg_top)), 1.0, replace)
+ arc.addVertGroup('side.bottom'); arc.assignVertsToGroup('side.bottom',list(set(vg_bottom)), 1.0, replace)
+ arc.addVertGroup('side.start'); arc.assignVertsToGroup('side.start', f_start[0], 1.0, replace)
+ arc.addVertGroup('side.end') ; arc.assignVertsToGroup('side.end', f_end[0], 1.0, replace)
+
+
+ else: # if thick=0 - draw only flat ring
+ faces = [[num, len1+num, len1+num+1, num+1] for num in xrange(len1 - 1)]
+ arc.verts.extend(verts) # add vertices to mesh
+ arc.faces.extend(faces) # add faces to the mesh
+
+ elif thic != 0:
+ thic_verts = []
+ thic_verts.extend([[point[0], point[1], point[2]+thic] for point in verts])
+ if thic < 0.0:
+ thic_verts.extend(verts)
+ verts = thic_verts
+ else:
+ verts.extend(thic_verts)
+ faces = []
+ #print 'deb:len1:', len1 #-----------------------
+ #print 'deb:verts:', verts #---------------------
+ faces = [[num, num+1, num+len1+1, num+len1] for num in xrange(len1 - 1)]
+
+ arc.verts.extend(verts) # add vertices to mesh
+ arc.faces.extend(faces) # add faces to the mesh
+ if settings.var['meshSmooth_on']: # left and right side become smooth ----------------------
+ for i in xrange(len(faces)):
+ arc.faces[i].smooth = True
+
+ else:
+ edges = [[num, num+1] for num in xrange(len(verts)-1)]
+ arc.verts.extend(verts) # add vertices to mesh
+ arc.edges.extend(edges) # add edges to the mesh
+
+ #arc.update()
+ #ob = SCENE.objects.new(arc) # create a new arc_object
+ #ob.link(arc)
+ ob.loc = tuple(center)
+ #ob.loc = Mathutils.Vector(ob.loc)
+ transform(self.extrusion, 0, ob)
+ #ob.size = (1,1,1)
+ return ob
+
+
+class BlockRecord: #-----------------------------------------------------------------
+ """Class for objects representing dxf block_records.
+ """
+
+ def __init__(self, obj):
+ """Expects an entity object of type block_record as input.
+ """
+ if not obj.type == 'block_record':
+ raise TypeError, "Wrong type %s for block_record object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ # required data
+ self.name = getit(obj, 2, None)
+
+ # optional data (with defaults)
+ self.insertion_units = getit(obj, 70, None)
+ self.insert_units = getit(obj, 1070, None)
+ """code 1070 Einfügeeinheiten:
+ 0 = Keine Einheiten; 1 = Zoll; 2 = Fuß; 3 = Meilen; 4 = Millimeter;
+ 5 = Zentimeter; 6 = Meter; 7 = Kilometer; 8 = Mikrozoll;
+ 9 = Mils; 10 = Yard; 11 = Angstrom; 12 = Nanometer;
+ 13 = Mikrons; 14 = Dezimeter; 15 = Dekameter;
+ 16 = Hektometer; 17 = Gigameter; 18 = Astronomische Einheiten;
+ 19 = Lichtjahre; 20 = Parsecs
+ """
+
+
+ def __repr__(self):
+ return "%s: name - %s, insert units - %s" %(self.__class__.__name__, self.name, self.insertion_units)
+
+
+
+
+class Block: #-----------------------------------------------------------------
+ """Class for objects representing dxf BLOCKs.
+ """
+
+ def __init__(self, obj):
+ """Expects an entity object of type block as input.
+ """
+ if not obj.type == 'block':
+ raise TypeError, "Wrong type %s for block object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+ self.name = obj.name
+
+ # required data
+ self.flags = obj.get_type(70)[0]
+ self.entities = dxfObject('block_contents') #creates empty entities_container for this block
+ self.entities.data = objectify([ent for ent in obj.data if type(ent) != list])
+
+ # optional data (with defaults)
+ self.path = getit(obj, 1, '')
+ self.discription = getit(obj, 4, '')
+
+ self.layer = getit(obj.data, 8, None)
+ self.loc = self.get_loc(obj.data)
+
+
+ def get_loc(self, data):
+ """Gets the insert point of the block.
+ """
+ loc = [0, 0, 0]
+ loc[0] = getit(data, 10, None) # 10 = x
+ loc[1] = getit(data, 20, None) # 20 = y
+ loc[2] = getit(data, 30, 0.0) # 30 = z
+ return loc
+
+
+ def __repr__(self):
+ return "%s: name - %s, description - %s, xref-path - %s" %(self.__class__.__name__, self.name, self.discription, self.path)
+
+
+
+
+class Insert: #-----------------------------------------------------------------
+ """Class for objects representing dxf INSERTs.
+ """
+
+ def __init__(self, obj):
+ """Expects an entity object of type insert as input.
+ """
+ if not obj.type == 'insert':
+ raise TypeError, "Wrong type %s for insert object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ # required data
+ self.blockname = obj.get_type(2)[0]
+
+ # optional data (with defaults)
+ self.rotation = getit(obj, 50, 0)
+ self.space = getit(obj, 67, 0)
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.layer = getit(obj.data, 8, None)
+ self.loc = self.get_loc(obj.data)
+ self.scale = self.get_scale(obj.data)
+ self.rows, self.columns = self.get_array(obj.data)
+ self.extrusion = get_extrusion(obj.data)
+
+
+
+ def get_loc(self, data):
+ """Gets the origin location of the insert.
+ """
+ loc = [0, 0, 0]
+ loc[0] = getit(data, 10, 0.0)
+ loc[1] = getit(data, 20, 0.0)
+ loc[2] = getit(data, 30, 0.0)
+ return loc
+
+
+
+ def get_scale(self, data):
+ """Gets the x/y/z scale factors of the insert.
+ """
+ scale = [1, 1, 1]
+ scale[0] = getit(data, 41, 1.0)
+ scale[1] = getit(data, 42, 1.0)
+ scale[2] = getit(data, 43, 1.0)
+ return scale
+
+
+
+ def get_array(self, data):
+ """Returns the pair (row number, row spacing), (column number, column spacing).
+ """
+ columns = getit(data, 70, 1)
+ rows = getit(data, 71, 1)
+ cspace = getit(data, 44, 0.0)
+ rspace = getit(data, 45, 0.0)
+ return (rows, rspace), (columns, cspace)
+
+
+
+ def __repr__(self):
+ return "%s: layer - %s, blockname - %s" %(self.__class__.__name__, self.layer, self.blockname)
+
+
+ def draw(self, settings, deltaloc):
+ """for INSERT(block): draw empty-marker for duplicated Blender_Group.
+
+ Blocks are made of three objects:
+ the block_record in the tables section
+ the block in the blocks section
+ the insert object (one or more) in the entities section
+ block_record gives the insert units,
+ block provides the objects drawn in the block,
+ insert object gives the location/scale/rotation of the block instances.
+ """
+
+ obname = settings.blocknamesmap[self.blockname]
+ obname = 'in_%s' %obname # create object name from block name
+ #obname = obname[:MAX_NAMELENGTH]
+
+ if settings.drawTypes['insert']: #if insert_drawType activated
+ ob = SCENE.objects.new('Empty', obname) # create a new empty_object
+ empty_size = 1.0 * settings.var['g_scale']
+ if empty_size < 0.01: empty_size = 0.01 #Blender limits (0.01-10.0)
+ elif empty_size > 10.0: empty_size = 10.0
+ ob.drawSize = empty_size
+
+ # get our block_def-group
+ block = settings.blocks(self.blockname)
+ ob.DupGroup = block
+ ob.enableDupGroup = True
+
+ #print 'deb:draw.block.deltaloc:', deltaloc #--------------------
+ ob.loc = tuple(self.loc)
+ if deltaloc:
+ deltaloc = rotXY_Vec(self.rotation, deltaloc)
+ #print 'deb:draw.block.loc:', deltaloc #--------------------
+ ob.loc = [ob.loc[0]+deltaloc[0], ob.loc[1]+deltaloc[1], ob.loc[2]+deltaloc[2]]
+ transform(self.extrusion, self.rotation, ob)
+ ob.size = tuple(self.scale)
+ return ob
+
+
+
+
+class Ellipse: #-----------------------------------------------------------------
+ """Class for objects representing dxf ELLIPSEs.
+ """
+
+ def __init__(self, obj):
+ """Expects an entity object of type ellipse as input.
+ """
+ if not obj.type == 'ellipse':
+ raise TypeError, "Wrong type %s for ellipse object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ # required data
+ self.ratio = obj.get_type(40)[0]
+ self.start_angle = obj.get_type(41)[0]
+ self.end_angle = obj.get_type(42)[0]
+
+ # optional data (with defaults)
+ self.space = getit(obj, 67, 0)
+ self.thic = getit(obj, 39, 0.0)
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.layer = getit(obj.data, 8, None)
+ self.loc = self.get_loc(obj.data)
+ self.major = self.get_major(obj.data)
+ self.extrusion = get_extrusion(obj.data)
+ self.radius = sqrt(self.major[0]**2 + self.major[0]**2 + self.major[0]**2)
+
+
+ def get_loc(self, data):
+ """Gets the center location for arc type objects.
+
+ Arcs have a single coord location.
+ """
+ loc = [0.0, 0.0, 0.0]
+ loc[0] = getit(data, 10, 0.0)
+ loc[1] = getit(data, 20, 0.0)
+ loc[2] = getit(data, 30, 0.0)
+ return loc
+
+
+ def get_major(self, data):
+ """Gets the major axis for ellipse type objects.
+
+ The ellipse major axis defines the rotation of the ellipse and its radius.
+ """
+ loc = [0.0, 0.0, 0.0]
+ loc[0] = getit(data, 11, 0.0)
+ loc[1] = getit(data, 21, 0.0)
+ loc[2] = getit(data, 31, 0.0)
+ return loc
+
+
+ def __repr__(self):
+ return "%s: layer - %s, radius - %s" %(self.__class__.__name__, self.layer, self.radius)
+
+
+ def draw(self, settings):
+ """for ELLIPSE: generate Blender_geometry.
+ """
+ # Generate the geometery
+ center = self.loc
+ thic = set_thick(self.thic, settings)
+
+ if settings.var['curves_on']:
+ ob = drawCurveArc(self)
+ else:
+ obname = 'el_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+
+ major = Mathutils.Vector(self.major)
+ #remi--todo----AngleBetweenVecs makes abs(value)!-----
+ delta = Mathutils.AngleBetweenVecs(major, WORLDX)
+ radius = major.length
+ start = degrees(self.start_angle)
+ end = degrees(self.end_angle)
+
+ # set a number of segments in entire circle
+ arc_res = settings.var['arc_res'] * sqrt(radius) / sqrt(settings.var['arc_rad'])
+ verts = calcArc(None, radius, start, end, arc_res, False)
+ #verts = [list(point) for point in verts]
+ if thic != 0:
+ len1 = len(verts)
+ thic_verts = []
+ thic_verts.extend([[point[0], point[1], point[2]+thic] for point in verts])
+ if thic < 0.0:
+ thic_verts.extend(verts)
+ verts = thic_verts
+ else:
+ verts.extend(thic_verts)
+ faces = []
+ #print 'deb:len1:', len1 #-----------------------
+ #print 'deb:verts:', verts #----------------------
+ faces = [[num, num+1, num+len1+1, num+len1] for num in xrange(len1 - 1)]
+
+ me.verts.extend(verts) # add vertices to mesh
+ me.faces.extend(faces) # add faces to the mesh
+ else:
+ edges = [[num, num+1] for num in xrange(len(verts)-1)]
+ me.verts.extend(verts) # add vertices to mesh
+ me.edges.extend(edges) # add edges to the mesh
+
+ ob.loc = tuple(center)
+ ob.SizeY = self.ratio
+ transform(self.extrusion, 0, ob)
+
+ return ob
+
+
+
+class Face: #-----------------------------------------------------------------
+ """Class for objects representing dxf 3DFACEs.
+ """
+
+ def __init__(self, obj):
+ """Expects an entity object of type 3dfaceplot as input.
+ """
+ if not obj.type == '3dface':
+ raise TypeError, "Wrong type %s for 3dface object!" %obj.type
+ self.type = obj.type
+ self.data = obj.data[:]
+
+ # optional data (with defaults)
+ self.space = getit(obj, 67, 0)
+ self.color_index = getit(obj, 62, BYLAYER)
+
+ self.layer = getit(obj.data, 8, None)
+ self.points = self.get_points(obj.data)
+
+
+ def get_points(self, data):
+ """Gets 3-4 points for a 3d face type object.
+
+ Faces have three or optionally four verts.
+ """
+ a = [0, 0, 0]
+ b = [0, 0, 0]
+ c = [0, 0, 0]
+ d = [0, 0, 0]
+ a[0] = getit(data, 10, None) # 10 = x
+ a[1] = getit(data, 20, None) # 20 = y
+ a[2] = getit(data, 30, 0.0) # 30 = z
+ b[0] = getit(data, 11, None)
+ b[1] = getit(data, 21, None)
+ b[2] = getit(data, 31, 0.0)
+ c[0] = getit(data, 12, None)
+ c[1] = getit(data, 22, None)
+ c[2] = getit(data, 32, 0.0)
+ out = [a,b,c]
+
+ d[0] = getit(data, 13, None)
+ if d[0] != None:
+ d[1] = getit(data, 23, None)
+ d[2] = getit(data, 33, 0.0)
+ out.append(d)
+
+ #if len(out) < 4: print '3dface with only 3 vertices:\n',a,b,c,d #-----------------
+ return out
+
+
+ def __repr__(self):
+ return "%s: layer - %s, points - %s" %(self.__class__.__name__, self.layer, self.points)
+
+
+ def draw(self, settings):
+ """for 3DFACE: generate Blender_geometry.
+ """
+ # Generate the geometery
+ points = self.points
+
+ global activObjectLayer
+ global activObjectName
+ #print 'deb:draw:face.ob IN activObjectName: ', activObjectName #---------------------
+
+ if activObjectLayer == self.layer and settings.var['one_mesh_on']:
+ obname = activObjectName
+ #print 'deb:face.draw obname from activObjectName: ', obname #---------------------
+ ob = Object.Get(obname) # open an existing mesh_object
+ #ob = SCENE.getChildren(obname) # open an existing mesh_object
+ else:
+ obname = 'fa_%s' %self.layer # create object name from layer name
+ obname = obname[:MAX_NAMELENGTH]
+ me = Mesh.New(obname) # create a new mesh
+ ob = SCENE.objects.new(me) # create a new mesh_object
+ activObjectName = ob.name
+ activObjectLayer = self.layer
+ #print ('deb:except. new face.ob+mesh:"%s" created!' %ob.name) #---------------------
+
+ me = Mesh.Get(ob.name) # open objects mesh data
+ faces, edges = [], []
+ n = len(me.verts)
+ if len(self.points) == 4:
+ faces = [[0+n,1+n,2+n,3+n]]
+ elif len(self.points) == 3:
+ faces = [[0+n,1+n,2+n]]
+ elif len(self.points) == 2:
+ edges = [[0+n,1+n]]
+
+ me.verts.extend(points) # add vertices to mesh
+ if faces: me.faces.extend(faces) # add faces to the mesh
+ if edges: me.edges.extend(edges) # add faces to the mesh
+ if settings.var['vGroup_on']:
+ # entities with the same color build one vertexGroup for easier material assignment ---------------------
+ ob.link(me) # link mesh to that object
+ vG_name = 'color_%s' %self.color_index
+ if edges: faces = edges
+ replace = Blender.Mesh.AssignModes.ADD #or .AssignModes.REPLACE or ADD
+ try:
+ me.assignVertsToGroup(vG_name, faces[0], 1.0, replace)
+ #print 'deb: existed vGroup:', vG_name #---------------------
+ except:
+ me.addVertGroup(vG_name)
+ me.assignVertsToGroup(vG_name, faces[0], 1.0, replace)
+ #print 'deb: create new vGroup:', vG_name #--------------------
+
+ #print 'deb:draw:face.ob OUT activObjectName: ', activObjectName #---------------------
+ return ob
+
+
+#---------------------------------------------------------------------------------------
+# type to object maping (sorted-dictionary for f_obiectify ONLY!, format={'key':Class} )
type_map = {
- 'line':Line,
- 'lwpolyline':LWpolyline,
- 'text':Text,
- 'mtext':Mtext,
- 'circle':Circle,
- 'arc':Arc,
- 'layer':Layer,
- 'block_record':BlockRecord,
- 'block':Block,
- 'insert':Insert,
- 'ellipse':Ellipse,
- '3dface':Face
+ 'layer':Layer,
+ 'block_record':BlockRecord,
+ 'block':Block,
+ 'insert':Insert,
+ 'point':Point,
+ '3dface':Face,
+ 'line':Line,
+# 'mline':MLine,
+ 'polyline':Polyline,
+ 'lwpolyline':LWpolyline,
+# 'region':Region,
+ 'trace':Solid,
+ 'solid':Solid,
+ 'text':Text,
+ 'mtext':Mtext,
+ 'circle':Circle,
+ 'ellipse':Ellipse,
+ 'arc':Arc
}
-def objectify(data):
- """Expects a section type object's data as input.
-
- Maps object data to the correct object type.
- """
- objects = [] # colector for finished objects
- known_types = type_map.keys() # so we don't have to call foo.keys() every iteration
- index = 0
- while index < len(data):
- item = data[index]
- if type(item) != list and item.type in known_types:
- # proccess the object and append the resulting object
- objects.append(type_map[item.type](item))
- elif type(item) != list and item.type == 'table':
- item.data = objectify(item.data) # tables have sub-objects
- objects.append(item)
- elif type(item) != list and item.type == 'polyline':
- pline = Polyline(item)
- while 1:
- index += 1
- item = data[index]
- if item.type == 'vertex':
- v = Vertex(item)
- pline.points.append(v)
- elif item.type == 'seqend':
- break
- else:
- print "Error: non-vertex found before seqend!"
- index -= 1
- break
- objects.append(pline)
- else:
- # we will just let the data pass un-harrased
- objects.append(item)
- index += 1
- return objects
-
-class MatColors:
- """A smart container for color based materials.
-
- This class is a wrapper around a dictionary mapping color indicies to materials.
- When called with a color index it returns a material corrisponding to that index.
- Behind the scenes it checks if that index is in its keys, and if not it creates
- a new material. It then adds the new index:material pair to its dict and returns
- the material.
- """
-
- def __init__(self, map):
- """Expects a dictionary mapping layer names to color idices."""
- self.map = map
- self.colors = {}
-
-
- def __call__(self, color=None):
- """Return the material associated with color.
-
- If a layer name is provided the color of that layer is used.
- """
- if not color:
- color = 0
- if type(color) == str: # Layer name
- try:
- color = self.map[color].color # color = layer_map[name].color
- except KeyError:
- layer = Layer(name=color, color=0, frozen=False)
- self.map[color] = layer
- color = 0
- color = abs(color)
- if color not in self.colors.keys():
- self.add(color)
- return self.colors[color]
-
-
-
-
- def add(self, color):
- """Create a new material using the provided color index."""
- global color_map
- mat = Material.New('ColorIndex-%s' %color)
- mat.setRGBCol(color_map[color])
- mat.setMode("Shadeless", "Wire")
- self.colors[color] = mat
-
-
-
-
-class Blocks:
- """A smart container for blocks.
-
- This class is a wrapper around a dictionary mapping block names to Blender data blocks.
- When called with a name string it returns a block corrisponding to that name.
- Behind the scenes it checks if that name is in its keys, and if not it creates
- a new data block. It then adds the new name:block pair to its dict and returns
- the block.
- """
-
- def __init__(self, map, settings):
- """Expects a dictionary mapping block names to block objects."""
- self.map = map
- self.settings = settings
- self.blocks = {}
-
-
- def __call__(self, name=None):
- """Return the data block associated with name.
-
- If no name is provided return self.blocks.
- """
- if not name:
- return self.blocks
- if name not in self.blocks.keys():
- self.add(name)
- return self.blocks[name]
-
-
-
- def add(self, name):
- """Create a new block group for the block with name."""
- write = self.settings.write
- group = Group.New(name)
- block = self.map[name]
- write("\nDrawing %s block entities..." %name)
- drawEntities(block.entities, self.settings, group)
- write("Done!")
- self.blocks[name] = group
-
-
-
-
-
-class Settings:
- """A container for all the import settings and objects used by the draw functions.
-
- This is like a collection of globally accessable persistant properties and functions.
- """
- # Optimization constants
- MIN = 0
- MID = 1
- PRO = 2
- MAX = 3
-
- def __init__(self, drawing, curves, optimization, **kwds):
- """Given the drawing initialize all the important settings used by the draw functions."""
- self.curves = curves
- self.optimization = optimization
- print "Setting optimization level %s!" %optimization
- self.drawTypes = kwds
- self.layers = True
- self.blocks = True
-
- # First sort out all the sections
- sections = dict([(item.name, item) for item in drawing.data])
-
- # The header section may be omited
- if 'header' in sections.keys():
- self.write("Found header!")
- else:
- self.write("File contains no header!")
-
- # The tables section may be partialy or completely missing.
- if 'tables' in sections.keys():
- self.write("Found tables!")
- tables = dict([(item.name, item) for item in sections["tables"].data])
- if 'layer' in tables.keys():
- self.write("Found layers!")
- # Read the layers table and get the layer colors
- self.colors = getLayers(drawing)
- else:
- self.write("File contains no layers table!")
- self.layers = False
- self.colors = MatColors({})
- else:
- self.write("File contains no tables!")
- self.write("File contains no layers table!")
- self.layers = False
- self.colors = MatColors({})
-
- # The blocks section may be omited
- if 'blocks' in sections.keys():
- self.write("Found blocks!")
- # Read the block definitions and build our block object
- if self.drawTypes['blocks']:
- self.blocks = getBlocks(drawing, self)
- else:
- self.write("File contains no blocks!")
- self.drawTypes['blocks'] = False
- def write(self, text, newline=True):
- """Wraps the built-in print command in a optimization check."""
- if self.optimization <= self.MID:
- if newline:
- print text
- else:
- print text,
-
- def redraw(self):
- """Update Blender if optimization level is low enough."""
- if self.optimization <= self.MIN:
- Blender.Redraw()
-
-
- def progress(self, done, text):
- """Wrapper for Blender.Window.DrawProgressBar."""
- if self.optimization <= self.PRO:
- Window.DrawProgressBar(done, text)
-
-
- def isOff(self, name):
- """Given a layer name look up the layer object and return its visable status."""
- # colors are negative if layer is off
- try:
- layer = self.colors.map[name]
- except KeyError:
- return False
-
- if layer.frozen or layer.color < 0:
- return True
- else:
- return False
-
-
-
-
-def main(filename=None):
- editmode = Window.EditMode() # are we in edit mode? If so ...
- if editmode: Window.EditMode(0) # leave edit mode before
- Window.WaitCursor(True) # Let the user know we are thinking
-
- try:
- if not filename:
- print "DXF import: error, no file selected. Attempting to load default file."
- try:
- filename = Sys.expandpath(r".\examples\big-test.dxf")
- except IOError:
- print "DXF import: error finding default test file, exiting..."
- return None
- drawing = readDXF(filename, objectify)
- drawDrawing(drawing)
- finally:
- # restore state even if things didn't work
- Window.WaitCursor(False)
- if editmode: Window.EditMode(1) # and put things back how we fond them
-
-def getOCS(az):
- """An implimentation of the Arbitrary Axis Algorithm."""
- # world x, y, and z axis
- wx = WORLDX
- wy = Mathutils.Vector((0,1,0))
- wz = Mathutils.Vector((0,0,1))
-
- #decide if we need to transform our coords
- if az[0] == 0 and az[1] == 0:
- return False
- # elif abs(az[0]) < 0.0001 or abs(az[1]) < 0.0001:
- # return False
- az = Mathutils.Vector(az)
-
- cap = 0.015625 # square polar cap value (1/64.0)
- if abs(az.x) < cap and abs(az.y) < cap:
- ax = Mathutils.CrossVecs(wy, az)
- else:
- ax = Mathutils.CrossVecs(wz, az)
- ax = ax.normalize()
- ay = Mathutils.CrossVecs(az, ax)
- ay = ay.normalize()
- return ax, ay, az
-
-def transform(normal, obj):
- """Use the calculated ocs to determine the objects location/orientation in space.
-
- Quote from dxf docs:
- The elevation value stored with an entity and output in DXF files is a sum
- of the Z-coordinate difference between the UCS XY plane and the OCS XY
- plane, and the elevation value that the user specified at the time the entity
- was drawn.
- """
- ocs = getOCS(normal)
- if ocs:
- #print ocs
- x, y, z = ocs
- x = x.resize4D()
- y = y.resize4D()
- z = -z.resize4D()
- x.w = 0
- y.w = 0
- z.w = 0
- o = Mathutils.Vector(obj.loc)
- o = o.resize4D()
- mat = Mathutils.Matrix(x, y, z, o)
- obj.setMatrix(mat)
-
-def getLayers(drawing):
- """Build a dictionary of name:color pairs for the given drawing."""
- tables = drawing.tables
- for table in tables.data:
- if table.name == 'layer':
- layers = table
- break
- map = {}
- for item in layers.data:
- if type(item) != list and item.type == 'layer':
- map[item.name] = item
- colors = MatColors(map)
- return colors
-def getBlocks(drawing, settings):
- """Build a dictionary of name:block pairs for the given drawing."""
- map = {}
- for item in drawing.blocks.data:
- if type(item) != list and item.type == 'block':
- try:
- map[item.name] = item
- except KeyError:
- # annon block
- print "Cannot map %s - %s!" %(item.name, item)
- blocks = Blocks(map, settings)
- return blocks
-def drawDrawing(drawing):
- """Given a drawing object recreate the drawing in Blender."""
- print "Getting settings..."
- Window.WaitCursor(False)
- #width, height = Window.GetScreenSize()
- Window.SetMouseCoords()
-
- # Create a PupBlock to get user preferences
- lines = Draw.Create(1)
- arcs = Draw.Create(1)
- circles = Draw.Create(1)
- polylines = Draw.Create(1)
- text = Draw.Create(1)
- blocks = Draw.Create(1)
- faces = Draw.Create(1)
- optim = Draw.Create(1)
-
- block = []
- block.append("Draw Options:")
- block.append(("Lines", lines, "Toggle drawing of lines"))
- block.append(("Arcs", arcs, "Toggle drawing of arcs"))
- block.append(("Circles", circles, "Toggle drawing of circles"))
- block.append(("Polylines", polylines, "Toggle drawing of polylines"))
- block.append(("Text", text, "Toggle drawing of text"))
- block.append(("Blocks", blocks, "Toggle drawing of blocks"))
- block.append(("Faces", faces, "Toggle drawing of faces"))
- block.append("Update Optimization:")
- block.append(("Level: ", optim, 0, 3))
-
- retval = Draw.PupBlock("DXF Import", block)
-
- Window.WaitCursor(True) # Let the user know we are thinking
- # The settings object controls how dxf entities are drawn
- settings = Settings(drawing, curves=False,
- optimization=int(optim.val),
- lines=bool(lines.val),
- arcs=bool(arcs.val),
- circles=bool(circles.val),
- polylines=bool(polylines.val),
- text=bool(text.val),
- blocks=bool(blocks.val),
- faces=bool(faces.val)
- )
-
- settings.write("Drawings entities...")
- # Draw all the know entity types in the current scene
- drawEntities(drawing.entities, settings)
-
- # Set the visable layers
- SCENE.setLayers([i+1 for i in range(18)])
- Blender.Redraw(-1)
- settings.write("Done!")
-
-
-def drawEntities(entities, settings, group=None):
- """Draw every kind of thing in the entity list.
-
- If provided 'group' is the Blender group new entities are to be added to.
- """
- for _type in type_map.keys():
- # for each known type get a list of that type and call the associated draw function
- drawer(_type, entities.get_type(_type), settings, group)
-
-
-def drawer(_type, entities, settings, group):
- """Call with a list of entities and a settings object to generate Blender geometry."""
- if entities:
- # Break out early if settings says we aren't drawing the current type
- block = False
- skip = False
- if _type == 'block_record':
- skip = True
- if _type == 'line' and not settings.drawTypes['lines']:
- skip = True
- elif _type == 'arc' and not settings.drawTypes['arcs']:
- skip = True
- elif _type == 'circle' and not settings.drawTypes['circles']:
- skip = True
- elif _type in ['lwpolyline', 'polyline'] and not settings.drawTypes['polylines']:
- skip = True
- elif _type in ['text', 'mtext'] and not settings.drawTypes['text']:
- skip = True
- elif _type == 'insert':
- if not settings.drawTypes['blocks']:
- skip = True
- block = True
- elif _type == '3dface' and not settings.drawTypes['faces']:
- skip = True
- if skip:
- settings.write("Skipping %s type entities!" %_type)
- return
-
- message = "Drawing %ss..." %_type
- settings.write(message, False)
- settings.progress(0, message)
-
- if block:
- # create one 'handle' data block to use with all blocks
- handle = Mesh.New('insert')
- handle.verts.extend(
- [(-0.01,0,0),
- (0.01,0,0),
- (0,-0.01,0),
- (0,0.01,0),
- (0,0,-0.01),
- (0,0,0.01)]
- )
- handle.edges.extend([(0,1),(2,3),(4,5)])
-
- # For now we only want model-space objects
- entities = [entity for entity in entities if entity.space == 0]
-
- if group:
- block_def = True
- else:
- block_def = False
-
- tot = len(entities)
- cur = 1.0
- for entity in entities:
- settings.write('\b.', False)
- settings.progress(cur/tot, message)
- cur += 1
-
- # First get the layer group
- if not block_def:
- group = getGroup('layer %s' %entity.layer) # add overhead just to make things a little cleaner
-
- if block:
- ob = entity.draw(handle, settings)
- else:
- ob = entity.draw(settings.curves)
-
- setColor(entity, ob, settings)
- # Link it to the scene and add it to the correct group
- SCENE.link(ob)
- setGroup(group, ob)
-
- # Set the visability
- if settings.isOff(entity.layer):
- ob.layers = [20]
- elif block_def:
- ob.layers = [19]
- else:
- ob.layers = [i+1 for i in range(20)]
-
- # # Set the visability
- # if settings.isOff(entity.layer) or block_def:
- # ob.restrictDisplay = True
- # ob.restrictRender = True
-
- settings.redraw()
- message = "\nFinished drawing %ss!" %entities[0].type
- settings.write(message)
- settings.progress(1, message)
-
-
-def getGroup(name):
- """Returns a Blender group object."""
- try:
- group = Group.Get(name)
- except: # What is the exception?
- group = Group.New(name)
- return group
-def setColor(entity, ob, settings):
- # Set the color
- if entity.color_index == BYLAYER:
- mat = settings.colors(entity.layer)
- else:
- mat = settings.colors(entity.color_index)
- try:
- ob.setMaterials([mat])
- except ValueError:
- settings.write("material error - %s!" %mat)
- ob.colbits = 0x01 # Set OB materials.
-def setGroup(group, it):
- try:
- group.objects.link(it)
- except:
- group.objects.append(it)
-
-def solveBulge(p1, p2):
- """return the center, radius, start angle, and end angle given two points.
-
- Needs to take into account bulge sign.
- negative = clockwise
- positive = counter-clockwise
-
- to find center given two points, and arc angle
- calculate radius
- Cord = sqrt(start^2 + end^2)
- S = (bulge*Cord)/2
- radius = ((Cord/2)^2+S^2)/2*S
- angle of arc = 4*atan( bulge )
- angle from p1 to center is (180-angle)/2
- get vector pointing from p1 to p2 (p2 - p1)
- normalize it and multiply by radius
- rotate around p1 by angle to center point to center.
-
- start angle = angle between (center - p1) and worldX
- end angle = start angle + angle of arc
- """
- bulge = p1.bulge
- p2 = Mathutils.Vector(p2.loc)
- p1 = Mathutils.Vector(p1.loc)
- cord = p2 - p1 # vector from p1 to p2
- clength = cord.length
- s = (bulge * clength)/2 # sagitta (height)
- radius = abs(((clength/2)**2 + s**2)/(2*s)) # magic formula
- angle = abs(degrees(4*atan(bulge))) # theta (included angle)
- delta = (180 - angle)/2 # the angle from cord to center
- if bulge > 0:
- delta = -delta
- radial = cord.normalize() * radius # a radius length vector aligned with cord
- rmat = Mathutils.RotationMatrix(delta, 3, 'Z')
- center = p1 + (rmat * radial) # rotate radial by delta degrees, then add to p1 to find center
- if bulge < 0:
- sv = (p1 - center) # start from point 2
- else:
- sv = (p2 - center) # start from point 1
- start = Mathutils.AngleBetweenVecs(sv, WORLDX) # start angle is the angle between the first leg of the section and the x axis
- # The next bit is my cludge to figure out if start should be negative
- rmat = Mathutils.RotationMatrix(start, 3, 'Z')
- rstart = rmat * sv
- if Mathutils.AngleBetweenVecs(rstart, WORLDX) < start:
- start = -start
- # the end angle is just 'angle' more than start angle
- end = start + angle
- return list(center), radius, start, end
-def drawArc(center, radius, start, end, step=0.5):
- """Draw a mesh arc with the given parameters."""
- # center is currently set by object
-
- # if start > end:
- # start = start - 360
- if end > 360:
- end = end%360
- startmatrix = Mathutils.RotationMatrix(start, 3, "Z")
- startpoint = startmatrix * Mathutils.Vector((radius, 0, 0))
- endmatrix = Mathutils.RotationMatrix(end, 3, "Z")
- endpoint = endmatrix * Mathutils.Vector((radius, 0, 0))
- points = [startpoint]
-
- if end < start:
- end +=360
-
- delta = end - start
- length = radians(delta) * radius
- if radius < step*10: # if circumfrance is too small
- pieces = int(delta/10) # set a fixed step of 10 degrees
- else:
- pieces = int(length/step) # figure out how many pieces we need for our arc
- if pieces == 0: # stupid way to avoid a div by zero error
- pieces = 1 # what would be a smarter way to fix this?
- step = delta/pieces # set step so pieces * step = degrees in arc
-
- stepmatrix = Mathutils.RotationMatrix(step, 3, "Z")
- point = Mathutils.Vector(startpoint)
- for i in range(int(pieces)):
- point = stepmatrix * point
- points.append(point)
- points.append(endpoint)
-
- if center:
- points = [[point[0]+center[0], point[1]+center[1], point[2]+center[2]] for point in points]
- edges = [[num, num+1] for num in range(len(points)-1)]
-
- return points, edges
-# Here are some alternate drawing functions for creating curve geometery.
-
-def drawCurveCircle(circle):
- """Given a dxf circle object return a blender circle object using curves."""
- c = Curve.New('circle') # create new curve data
-
- center = circle.loc
- radius = circle.radius
-
- p1 = (0, -radius, 0)
- p2 = (radius, 0, 0)
- p3 = (0, radius, 0)
- p4 = (-radius, 0, 0)
-
- p1 = BezTriple.New(p1)
- p2 = BezTriple.New(p2)
- p3 = BezTriple.New(p3)
- p4 = BezTriple.New(p4)
-
- curve = c.appendNurb(p1)
- curve.append(p2)
- curve.append(p3)
- curve.append(p4)
- for point in curve:
- point.handleTypes = [AUTO, AUTO]
- curve.flagU = 1 # Set curve cyclic
- c.update()
-
- ob = Object.New('Curve', 'circle') # make curve object
- return ob
-
-def drawCurveArc(arc):
- """Given a dxf circle object return a blender circle object using curves."""
- if start > end:
- start = start - 360
- startmatrix = Mathutils.RotationMatrix(start, 3, "Z")
- startpoint = startmatrix * Mathutils.Vector((radius, 0, 0))
- endmatrix = Mathutils.RotationMatrix(end, 3, "Z")
- endpoint = endmatrix * Mathutils.Vector((radius, 0, 0))
- # Note: handles must be tangent to arc and of correct length...
-
- a = Curve.New('arc') # create new curve data
-
- center = circle.loc
- radius = circle.radius
-
- p1 = (0, -radius, 0)
- p2 = (radius, 0, 0)
- p3 = (0, radius, 0)
- p4 = (-radius, 0, 0)
-
- p1 = BezTriple.New(p1)
- p2 = BezTriple.New(p2)
- p3 = BezTriple.New(p3)
- p4 = BezTriple.New(p4)
-
- curve = a.appendNurb(p1)
- curve.append(p2)
- curve.append(p3)
- curve.append(p4)
- for point in curve:
- point.handleTypes = [AUTO, AUTO]
- curve.flagU = 1 # Set curve cyclic
- a.update()
-
- ob = Object.New('Curve', 'arc') # make curve object
- return ob
+
+
+def objectify(data): #-----------------------------------------------------------------
+ """Expects a section type object's data as input.
+
+ Maps object data to the correct object type.
+ """
+ #print 'deb:objectify start %%%%%%%%%%%' #---------------
+ objects = [] # colector for finished objects
+ known_types = type_map.keys() # so we don't have to call foo.keys() every iteration
+ curves_on = GUI_A['curves_on'].val
+ index = 0
+ while index < len(data):
+ item = data[index]
+ #print 'deb:objectify item: \n', item #------------
+ if type(item) != list and item.type == 'table':
+ item.data = objectify(item.data) # tables have sub-objects
+ objects.append(item)
+ elif type(item) != list and item.type == 'polyline': #remi --todo-----------
+ #print 'deb:gosub Polyline\n' #-------------
+ pline = Polyline(item)
+ while 1:
+ index += 1
+ item = data[index]
+ if item.type == 'vertex':
+ #print 'deb:objectify gosub Vertex--------' #-------------
+ v = Vertex(item)
+ if pline.spline: # Bspline-curve
+ # then for Blender-mesh filter only additional_vertices
+ # OR
+ # then for Blender-curve filter only spline_control_vertices
+ if (v.spline and not curves_on) or (curves_on and v.splin2): #correct for real NURBS-import
+ #if (v.spline and not curves_on) or (curves_on and not v.splin2): #fake for Bezier-emulation of NURBS-import
+ pline.points.append(v)
+ elif pline.curved: # Bezier-curve
+ # then for Blender-mesh filter only curve_additional_vertices
+ # OR
+ # then for Blender-curve filter curve_control_vertices
+ if not curves_on or (curves_on and not v.curved):
+ pline.points.append(v)
+ else:
+ pline.points.append(v)
+ elif item.type == 'seqend':
+ #print 'deb:objectify it is seqEND ---------\n' #-------------
+ break
+ else:
+ print "Error: non-vertex found before seqend!"
+ index -= 1 #so go back one step
+ break
+ objects.append(pline)
+ elif type(item) != list and item.type in known_types:
+ # proccess the object and append the resulting object
+ objects.append(type_map[item.type](item))
+ else:
+ # we will just let the data pass un-harrased
+ objects.append(item)
+ index += 1
+ #print 'deb:objectify objects:\n', objects #------------
+ #print 'deb:objectify END %%%%%%%%' #------------
+ return objects
+
+
+
+class MatColors: #-----------------------------------------------------------------
+ """A smart container for dxf-color based materials.
+
+ This class is a wrapper around a dictionary mapping dxf-color indicies to materials.
+ When called with a color_index
+ it returns a material corresponding to that index.
+ Behind the scenes it checks if that index is in its keys, and if not it creates
+ a new material. It then adds the new index:material pair to its dict and returns
+ the material.
+ """
+
+ def __init__(self, layersmap):
+ """Expects a map - a dictionary mapping layer names to layers.
+ """
+ #self.layersmap = layersmap # a dictionary of layername:layerobject
+ self.colMaterials = {} # a dictionary of color_index:blender_material
+ #print 'deb:init_MatColors argument.map: ', map #------------------
+
+
+ def __call__(self, color=None):
+ """Return the material associated with color.
+
+ If a layer name is provided, the color of that layer is used.
+ """
+ if color == None:
+ color = 256 # color 256=BYLAYER
+ if type(color) == str: # looking for color of LAYER named "color"
+ #--todo---bug with ARC from ARC-T0.DXF layer="T-3DARC-1"-----
+ #print 'deb:color is string:--------: ', color
+ #try:
+ #color = self.layersmap[color].color
+ #print 'deb:color=self.map[color].color:', color #------------------
+ #except KeyError:
+ #layer = Layer(name=color, color=256, frozen=False)
+ #self.layersmap[color] = layer
+ #color = 0
+ color = layersmap[color].color
+ if color == 0: # color 0 = BYBLOCK
+ #--todo-- should looking for color of paret-BLOCK
+ #color = layersmap[color].color
+ pass
+ color = abs(color) # cause the value could be nagative = means the layer is turned off
+ if color not in self.colMaterials.keys():
+ self.add(color)
+ return self.colMaterials[color]
+
+
+ def add(self, color):
+ """Create a new material 'ColorNr-N' using the provided color index-N.
+ """
+ #global color_map #--todo-- has not to be global?
+ mat = Material.New('ColorNr-%s' %color)
+ mat.setRGBCol(color_map[color])
+ #mat.mode |= Material.Modes.SHADELESS #--todo--
+ #mat.mode |= Material.Modes.WIRE
+# try: mat.setMode('Shadeless', 'Wire') #work-around for 2.45rc-bug
+# except: pass
+ self.colMaterials[color] = mat
+
+
+
+class MatLayers: #-----------------------------------------------------------------
+ """A smart container for dxf-layer based materials.
+
+ This class is a wrapper around a dictionary mapping dxf-layer names to materials.
+ When called with a layer name it returns a material corrisponding to that.
+ Behind the scenes it checks if that layername is in its keys, and if not it creates
+ a new material. It then adds the new layername:material pair to its dict and returns
+ the material.
+ """
+
+ def __init__(self, layersmap):
+ """Expects a map - a dictionary mapping layer names to layers.
+ """
+ #self.layersmap = layersmap # a dictionary of layername:layer
+ self.layMaterials = {} # a dictionary of layer_name:blender_material
+ #print 'deb:init_MatLayers argument.map: ', map #------------------
+
+
+ def __call__(self, layername=None, color=None):
+ """Return the material associated with dxf-layer.
+
+ If a dxf-layername is not provided, create a new material
+ """
+ #global layernamesmap
+ layername_short = layername
+ if layername in layernamesmap.keys():
+ layername_short = layernamesmap[layername]
+ colorlayername = str(color) + layername_short
+ if colorlayername not in self.layMaterials.keys():
+ self.add(layername, color, colorlayername)
+ return self.layMaterials[colorlayername]
+
+
+ def add(self, layername, color, colorlayername):
+ """Create a new material 'layername'.
+ """
+ try: mat = Material.Get('L-%s' %colorlayername)
+ except: mat = Material.New('L-%s' %colorlayername)
+ #print 'deb:MatLayers material: ', mat #----------
+ #global settings
+ #print 'deb:MatLayers material_from: ', settings.var['material_from'] #----------
+ if settings.var['material_from'] == 3: mat_color = color
+ elif layersmap: mat_color = layersmap[layername].color
+ else: mat_color = 3
+ #print 'deb:MatLayers color: ', color #-----------
+ #print 'deb:MatLayers mat_color: ', mat_color #-----------
+ mat.setRGBCol(color_map[mat_color])
+ mat.mode |= Material.Modes.SHADELESS
+ mat.mode |= Material.Modes.WIRE
+# try: mat.setMode('Shadeless', 'Wire') #work-around for 2.45rc-bug
+# except: pass
+ self.layMaterials[colorlayername] = mat
+
+
+
+
+class Blocks: #-----------------------------------------------------------------
+ """A smart container for blocks.
+
+ This class is a wrapper around a dictionary mapping block names to Blender data blocks.
+ When called with a name string it returns a block corresponding to that name.
+ Behind the scenes it checks if that name is in its keys, and if not it creates
+ a new data block. It then adds the new name:block_data pair to its dict and returns
+ the block.
+ """
+
+ def __init__(self, blocksmap, settings):
+ """Expects a dictionary mapping block_name:block_data.
+ """
+ self.blocksmap = blocksmap #a dictionary mapping block_name:block_data
+ self.settings = settings
+ self.blocks = {} #container for blocks
+
+
+ def __call__(self, name=None):
+ """Return the data block associated with that block_name.
+
+ If that name is not in its keys, it creates a new data block.
+ If no name is provided return entire self.blocks container.
+ """
+ if name == None:
+ return self.blocks
+ if name not in self.blocks.keys():
+ self.addBlock(name)
+ return self.blocks[name]
+
+
+ def addBlock(self, name):
+ """Create a new 'block group' for the block name.
+ """
+
+ block_def = Group.New('bl_%s' %name) # Blender groupObject contains definition of BLOCK
+ block = self.blocksmap[name]
+ self.settings.write("\nDrawing block:\'%s\' ..." % name)
+ drawEntities(block.entities, self.settings, block_def)
+ self.settings.write("Drawing block:\'%s\' done!" %name)
+ self.blocks[name] = block_def
+
+
+
+
+
+class Settings: #-----------------------------------------------------------------
+ """A container for all the import settings and objects used by the draw functions.
+
+ This is like a collection of globally accessable persistant properties and functions.
+ """
+ # Optimization constants
+ MIN = 0
+ MID = 1
+ PRO = 2
+ MAX = 3
+
+ def __init__(self, keywords, drawTypes):
+ """initialize all the important settings used by the draw functions.
+ """
+ self.obj_number = 1 #global object_number for progress_bar
+
+ self.var = dict(keywords) #a dictionary of (key_variable:Value) control parameter
+ self.drawTypes = dict(drawTypes) #a dictionary of (entity_type:True/False) = import on/off for this entity_type
+
+ self.var['colorFilter_on'] = False #deb:remi------------
+ self.acceptedColors = [0,2,3,4,5,6,7,8,9,
+ 10 ]
+
+ self.var['layerFilter_on'] = False #deb:remi------------
+ self.acceptedLayers = ['3',
+ '0'
+ ]
+
+ self.var['blockFilter_on'] = False #deb:remi------------
+ self.acceptedBlocks = ['BOX01',
+ 'BOX02'
+ ]
+
+
+ def update(self, keywords, drawTypes):
+ """update all the important settings used by the draw functions.
+ """
+
+ for k, v in keywords.iteritems():
+ self.var[k] = v
+ #print 'deb:settings_update var %s= %s' %(k, self.var[k]) #--------------
+ for t, v in drawTypes.iteritems():
+ self.drawTypes[t] = v
+ #print 'deb:settings_update drawType %s= %s' %(t, self.drawTypes[t]) #--------------
+
+ #print 'deb:self.drawTypes', self.drawTypes #---------------
+
+
+ def validate(self, drawing):
+ """Given the drawing, build dictionaries of Layers, Colors and Blocks.
+ """
+
+ #de: paßt die distance parameter an globalScale
+ if self.var['g_scale'] != 1:
+ self.var['dist_min'] = self.var['dist_min'] / self.var['g_scale']
+ self.var['thick_min'] = self.var['thick_min'] / self.var['g_scale']
+ self.var['width_min'] = self.var['width_min'] / self.var['g_scale']
+ self.var['arc_rad'] = self.var['arc_rad'] / self.var['g_scale']
+
+ # First sort out all the section_items
+ sections = dict([(item.name, item) for item in drawing.data])
+
+ # The section:header may be omited
+ if 'header' in sections.keys():
+ self.write("Found section:header!")
+ else:
+ self.write("File contains no section:header!")
+
+ # The section:tables may be partialy or completely missing.
+ self.layersTable = False
+ self.colMaterials = MatColors({}) #A container for dxf-color based materials
+ self.layMaterials = MatLayers({}) #A container for dxf-layer based materials
+ #self.collayMaterials = MatColLayers({}) #A container for dxf-color+layer based materials
+ global layersmap, layernamesmap
+ layersmap, layernamesmap = {}, {}
+ if 'tables' in sections.keys():
+ self.write("Found section:tables!")
+ # First sort out all the tables
+ tables = dict([(item.name, item) for item in sections["tables"].data])
+ if 'layer' in tables.keys():
+ self.write("Found table:layers!")
+ self.layersTable = True
+ # Read the layers table and get the layer colors
+ layersmap, layernamesmap = getLayersmap(drawing)
+ self.colMaterials = MatColors(layersmap)
+ self.layMaterials = MatLayers(layersmap)
+ else:
+ self.write("File contains no table:layers!")
+ else:
+ self.write("File contains no section:tables!")
+ self.write("File contains no table:layers!")
+
+ # The section:blocks may be omited
+ if 'blocks' in sections.keys():
+ self.write("Found section:blocks!")
+ # Read the block definitions and build our block object
+ if self.drawTypes['insert']: #if drawing of type 'Insert' activated
+ blocksmap, self.blocknamesmap, self.obj_number = getBlocksmap(drawing) #Build a dictionary of blockname:block_data pairs
+ self.blocks = Blocks(blocksmap, self) # initiates container for blocks_data
+
+ #print 'deb: self.obj_number', self.obj_number #----------
+ else:
+ self.write("File contains no section:blocks!")
+ self.drawTypes['insert'] = False
+
+ # The section:entities
+ if 'entities' in sections.keys():
+ self.write("Found section:entities!")
+
+ self.obj_number += len(drawing.entities.data)
+ #print 'deb: self.obj_number', self.obj_number #----------
+ self.obj_number = 1.0 / self.obj_number
+
+
+ def write(self, text, newline=True):
+ """Wraps the built-in print command in a optimization check.
+ """
+ if self.var['optimization'] <= self.MID:
+ if newline:
+ print text
+ else:
+ print text,
+
+
+ def redraw(self):
+ """Update Blender if optimization level is low enough.
+ """
+ if self.var['optimization'] <= self.MIN:
+ Blender.Redraw()
+
+
+ def progress(self, done, text):
+ """Wrapper for Blender.Window.DrawProgressBar.
+ """
+ if self.var['optimization'] <= self.PRO:
+ progressbar = done * self.obj_number
+ Window.DrawProgressBar(progressbar, text)
+ #print 'deb:drawer done, progressbar: ', done, progressbar #-----------------------
+
+ def layer_isOff(self, layername): # no more used -------
+ """Given a layer name, and return its visible status.
+ """
+ # if layer is off then color_index is negative
+ if layersmap[layername].color < 0: return True
+ #print 'deb:layer_isOff: layer is ON' #---------------
+ return False
+
+
+ def layer_isFrozen(self, layername): # no more used -------
+ """Given a layer name, and return its frozen status.
+ """
+ if layersmap[layername].frozen: return True
+ #print 'deb:layer_isFrozen: layer is not FROZEN' #---------------
+ return False
+
+
+
+def analyzeDXF(dxfFile): #---------------------------------------
+ """list LAYER and BLOCK dependences into textfile
+
+ """
+ Window.WaitCursor(True) # Let the user know we are thinking
+ print 'start reading DXF file: %s.' % dxfFile
+ time1 = Blender.sys.time() #time marker1
+ drawing = readDXF(dxfFile, objectify)
+ print 'finished reading DXF file in %.4f sec.' % (Blender.sys.time()-time1)
+ Window.WaitCursor(False)
+
+ # First sort out all the section_items
+ sections = dict([(item.name, item) for item in drawing.data])
+
+ # The section:header may be omited
+ if 'header' in sections.keys(): print "Found section:header!"
+ else: print "File contains no section:header!"
+
+ # The section:tables may be partialy or completely missing.
+ layersTable = False
+ global layersmap
+ layersmap = {}
+ if 'tables' in sections.keys():
+ print "Found section:tables!"
+ for table in drawing.tables.data:
+ if table.name == 'layer':
+ print "Found table:layers!"
+ layers = table
+ break
+ if layers:
+ layersmap = {}
+ for item in layers.data:
+ if type(item) != list and item.type == 'layer':
+ #print dir(item)
+ layersmap[item.name] = [item.color, item.frozen]
+ #print 'deb:analyzeDXF: layersmap=' , layersmap #-------------
+ layersmap_str = '#list of LAYERs: layername, layercolor, frozen\n'
+
+ key_list = layersmap.keys()
+ key_list.sort()
+ for key in key_list:
+ #for layer_name, layer_data in layersmap.iteritems():
+ layer_name, layer_data = key, layersmap[key]
+ layer_str = '\'%s\': col=%s' %(layer_name,layer_data[0])#-------------
+ if layer_data[1]: layer_str += ', frozen'
+ layersmap_str += layer_str + '\n'
+ #print 'deb:analyzeDXF: layersmap_str=\n' , layersmap_str #-------------
+ else:
+ print "File contains no table:layers!"
+ else:
+ print "File contains no section:tables!"
+ print "File contains no table:layers!"
+
+ # The section:blocks may be omited
+ if 'blocks' in sections.keys():
+ print "Found section:blocks!"
+ blocksmap = {}
+ for item in drawing.blocks.data:
+ #print 'deb:getBlocksmap item=' ,item #--------
+ #print 'deb:getBlocksmap item.entities=' ,item.entities #--------
+ #print 'deb:getBlocksmap item.entities.data=' ,item.entities.data #--------
+ if type(item) != list and item.type == 'block':
+ insertList = []
+ for item2 in item.entities.data:
+ if type(item2) != list and item2.type == 'insert':
+ #print dir(item2)
+ item2str = [item2.blockname, item2.layer, item2.color_index, item2.scale, item2.space]
+ insertList.append(item2str)
+ try:
+ blocksmap[item.name] = insertList
+ except KeyError:
+ # annon block
+ print 'Cannot map "%s" - "%s" as Block!' %(item.name, item)
+ #print 'deb:analyzeDXF: blocksmap=' , blocksmap #-------------
+ blocksmap_str = '#list of BLOCKs: child, layer, color, scale, space\n'
+ key_list = blocksmap.keys()
+ key_list.sort()
+ for key in key_list:
+ #for block_name, block_data in blocksmap.iteritems():
+ block_name, block_data = key, blocksmap[key]
+ block_str = '\''+block_name + '\':\n' #-------------
+ blocksmap_str += block_str
+ if block_data:
+ for block_item in block_data:
+ block_data_str = ' - %s\n' %block_item
+ blocksmap_str += block_data_str
+ #print 'deb:analyzeDXF: blocksmap_str=\n' , blocksmap_str #-------------
+ else:
+ print "File contains no section:blocks!"
+
+ output_str = '%s\n%s' %(layersmap_str, blocksmap_str)
+ infFile = dxfFile[:-4] + '_DXF.inf' # replace last char:'.dxf' with '.INF'
+ try:
+ f = file(infFile, 'w')
+ f.write(INFFILE_HEADER + '\n# this is a comment line\n')
+ f.write(output_str)
+ f.close()
+ Draw.PupMenu('DXF importer: INF-file: Done!%t|see listing of DXF-model saved in:|' + '\'%s\'' %infFile)
+ except:
+ Draw.PupMenu('DXF importer: INF-file: Error!%t|failure by writing to ' + '\'%s\'|no listings saved!' %infFile)
+
+
+
+
+
+def main(dxfFile): #---------------#############################-----------
+ #print 'deb:filename:', filename #--------------
+ global SCENE
+ editmode = Window.EditMode() # are we in edit mode? If so ...
+ if editmode:
+ Window.EditMode(0) # leave edit mode before
+
+ #SCENE = bpy.data.scenes.active
+ #SCENE.objects.selected = [] # deselect all
+
+ global cur_COUNTER #counter for progress_bar
+ cur_COUNTER = 0
+
+ try:
+ print "Getting settings..."
+ global GUI_A, GUI_B
+ if GUI_A['g_scale_on'].val:
+ if GUI_A['g_scale_as'].val == 6: #scale inches to meters
+ GUI_A['g_scale'].val = 0.02540
+ elif GUI_A['g_scale_as'].val == 7: #scale feets to meters
+ GUI_A['g_scale'].val = 0.30480
+ elif GUI_A['g_scale_as'].val == 8: #scale yards to meters
+ GUI_A['g_scale'].val = 0.91440
+ else: GUI_A['g_scale'].val = 10.0 ** int(GUI_A['g_scale_as'].val)
+ else:
+ GUI_A['g_scale'].val = 1.0
+
+ keywords = {}
+ drawTypes = {}
+ for k, v in GUI_A.iteritems():
+ keywords[k] = v.val
+ for k, v in GUI_B.iteritems():
+ drawTypes[k] = v.val
+ #print 'deb:startUInew keywords: ', keywords #--------------
+ #print 'deb:startUInew drawTypes: ', drawTypes #--------------
+
+ # The settings object controls how dxf entities are drawn
+ settings.update(keywords, drawTypes)
+ #print 'deb:settings.var:\n', settings.var #-----------------------
+
+ if not settings:
+ #Draw.PupMenu('DXF importer: EXIT!%t')
+ #print '\nDXF Import: terminated by user!'
+ print '\nDXF Import: terminated, cause settings failure!'
+ Window.WaitCursor(False)
+ if editmode: Window.EditMode(1) # and put things back how we fond them
+ return None
+
+ #no more used dxfFile = dxfFileName.val
+ #print 'deb: dxfFile file: ', dxfFile #----------------------
+ if dxfFile.lower().endswith('.dxf') and sys.exists(dxfFile):
+ Window.WaitCursor(True) # Let the user know we are thinking
+ print 'start reading DXF file: %s.' % dxfFile
+ time1 = Blender.sys.time() #time marker1
+ drawing = readDXF(dxfFile, objectify)
+ print 'finished reading DXF file in %.4f sec.' % (Blender.sys.time()-time1)
+ Window.WaitCursor(False)
+ else:
+ if UI_MODE: Draw.PupMenu('DXF importer: EXIT----------!%t| no valid DXF-file selected!')
+ print "DXF importer: error, no DXF-file selected. Abort!"
+ Window.WaitCursor(False)
+ if editmode: Window.EditMode(1) # and put things back how we fond them
+ return None
+
+ settings.validate(drawing)
+
+ Window.WaitCursor(True) # Let the user know we are thinking
+ settings.write("\n\nDrawing entities...")
+
+ # Draw all the know entity types in the current scene
+ global oblist
+ oblist = [] # a list of all created AND linked objects for final f_globalScale
+ time2 = Blender.sys.time() #time marker2
+
+ drawEntities(drawing.entities, settings)
+
+ #print 'deb:drawEntities after: oblist:', oblist #-----------------------
+ if oblist: # and settings.var['g_scale'] != 1:
+ globalScale(oblist, settings.var['g_scale'])
+
+ # Set the visable layers
+ SCENE.setLayers([i+1 for i in range(18)])
+ SCENE.update(1)
+ #Blender.Redraw(-1)
+ SCENE.objects.selected = [i[0] for i in oblist] #select only the imported objects
+ #SCENE.objects.selected = SCENE.objects #select all objects in current scene
+ Blender.Redraw()
+
+ time_text = Blender.sys.time() - time2
+ Window.WaitCursor(False)
+ message = 'DXF Import to Blender: done in %.4f sec. --------------------' % time_text
+ settings.progress(1.0/settings.obj_number, 'DXF import done!')
+ print message
+ #settings.write(message)
+ if UI_MODE: Draw.PupMenu('DXF importer: Done!|finished in %.4f sec.' % time_text)
+
+ finally:
+ # restore state even if things didn't work
+ #print 'deb:drawEntities finally!' #-----------------------
+ Window.WaitCursor(False)
+ if editmode: Window.EditMode(1) # and put things back how we fond them
+
+
+
+def getOCS(az): #-----------------------------------------------------------------
+ """An implimentation of the Arbitrary Axis Algorithm.
+ """
+ #decide if we need to transform our coords
+ if az[0] == 0 and az[1] == 0:
+ if az[2] == 1.0:
+ return False
+ elif az[2] == -1.0:
+ ax = Mathutils.Vector(-1.0, 0, 0)
+ ay = Mathutils.Vector(0, 1.0, 0)
+ az = Mathutils.Vector(0, 0, -1.0)
+ return ax, ay, az
+ #elif abs(az[0]) < 0.0001 and abs(az[1]) < 0.0001:
+ # return False
+
+ az = Mathutils.Vector(az)
+
+ cap = 0.015625 # square polar cap value (1/64.0)
+ if abs(az.x) < cap and abs(az.y) < cap:
+ ax = Mathutils.CrossVecs(WORLDY, az)
+ else:
+ ax = Mathutils.CrossVecs(WORLDZ, az)
+ ax = ax.normalize()
+ ay = Mathutils.CrossVecs(az, ax)
+ ay = ay.normalize()
+ return ax, ay, az
+
+
+
+def transform(normal, rotation, obj): #--------------------------------------------
+ """Use the calculated ocs to determine the objects location/orientation in space.
+
+ Quote from dxf docs:
+ The elevation value stored with an entity and output in DXF files is a sum
+ of the Z-coordinate difference between the UCS XY plane and the OCS XY
+ plane, and the elevation value that the user specified at the time the entity
+ was drawn.
+ """
+ ma = Mathutils.Matrix([1,0,0],[0,1,0],[0,0,1])
+ o = Mathutils.Vector(obj.loc)
+ ocs = getOCS(normal)
+ if ocs:
+ ma = Mathutils.Matrix(ocs[0], ocs[1], ocs[2])
+ o = ma.invert() * o
+ ma = Mathutils.Matrix(ocs[0], ocs[1], ocs[2])
+
+ if rotation != 0:
+ g = radians(-rotation)
+ rmat = Mathutils.Matrix([cos(g), -sin(g), 0], [sin(g), cos(g), 0], [0, 0, 1])
+ ma = rmat * ma
+
+ obj.setMatrix(ma)
+ obj.loc = o
+ #print 'deb:new obj.matrix:\n', obj.getMatrix() #--------------------
+
+
+
+def rotXY_Vec(rotation, vec): #----------------------------------------------------
+ """Rotate vector vec in XY-plane. vec must be in radians
+ """
+ if rotation != 0:
+ o = Mathutils.Vector(vec)
+ g = radians(-rotation)
+ vec = o * Mathutils.Matrix([cos(g), -sin(g), 0], [sin(g), cos(g), 0], [0, 0, 1])
+ return vec
+
+
+
+def getLayersmap(drawing): #------------------------------------------------------
+ """Build two dictionaries: 1.layername:layer pairs and 2.layername:layername_short
+ """
+ tables = drawing.tables
+ for table in tables.data:
+ if table.name == 'layer':
+ layers = table
+ break
+ layersmap = {}
+ layernamesmap = {}
+ for item in layers.data:
+ if type(item) != list and item.type == 'layer':
+ layersmap[item.name] = item
+ layername_short = item.name[:MAX_NAMELENGTH-1]
+ i = 0 #sufix for layernames cause Blender-objectnames-limits
+ while layername_short in layernamesmap.keys():
+ i += 1
+ suffix = str(i)
+ layername_short = layername_short[:-2] + suffix
+ layernamesmap[item.name] = layername_short
+ return layersmap, layernamesmap
+
+
+
+def getBlocksmap(drawing): #--------------------------------------------------------
+ """Build a dictionary of blockname:block_data pairs and 2.blockname:blockname_short pairs
+ """
+ blocksmap = {}
+ blocksmap_short = {}
+ blocknamesmap = {}
+ obj_number = 0
+ for item in drawing.blocks.data:
+ #print 'deb:getBlocksmap item=' ,item #--------
+ #print 'deb:getBlocksmap item.entities=' ,item.entities #--------
+ #print 'deb:getBlocksmap item.entities.data=' ,item.entities.data #--------
+ if type(item) != list and item.type == 'block':
+ obj_number += len(item.entities.data)
+ try:
+ blocksmap[item.name] = item
+ except KeyError:
+ # annon block
+ print 'Cannot map "%s" - "%s" as Block!' %(item.name, item)
+
+ blockname_short = item.name[:MAX_NAMELENGTH-1]
+ i = 0 #sufix for blockname cause Blender-objectnamelength-limit
+ while blockname_short in blocknamesmap.keys():
+ i += 1
+ suffix = str(i)
+ blockname_short = blockname_short[:-2] + suffix
+ blocknamesmap[item.name] = blockname_short
+
+ return blocksmap, blocknamesmap, obj_number
+
+
+
+def drawEntities(entities, settings, block_def=None): #----------------------------------------
+ """Draw every kind of thing in the entity list.
+
+ If provided 'block_def': the entities are to be added to the Blender 'group'.
+ """
+ for _type in type_map.keys():
+ #print 'deb:drawEntities_type:', _type #------------------
+ # for each known type get a list of that type and call the associated draw function
+ drawer(_type, entities.get_type(_type), settings, block_def)
+
+
+def drawer(_type, entities, settings, block_def): #------------------------------------------
+ """Call with a list of entities and a settings object to generate Blender geometry.
+
+ If 'block_def': the entities are to be added to the Blender 'group'.
+ """
+ #print 'deb:drawer _type, entities:\n ', _type, entities #-----------------------
+
+ if entities:
+ # Break out early if settings says we aren't drawing the current dxf-type
+ global cur_COUNTER #counter for progress_bar
+ group = None
+ #print 'deb:drawer.check:_type: ', _type #--------------------
+ if _type == '3dface':_type = 'face' # hack, while python_variable_name can not beginn with a nummber
+ if not settings.drawTypes[_type] or _type == 'block_record':
+ message = 'Skipping dxf\'%ss\' entities' %_type
+ settings.write(message, True)
+ cur_COUNTER += len(entities)
+ settings.progress(cur_COUNTER, message)
+ return
+ #print 'deb:drawer.todo:_type:', _type #-----------------------
+ #print 'deb:drawer entities:\n ', entities #-----------------------
+
+ len_temp = len(entities)
+ # filtering only model-space enitities (no paper-space enitities)
+ if settings.var['paper_space_on']:
+ entities = [entity for entity in entities if entity.space != 0]
+ else:
+ entities = [entity for entity in entities if entity.space == 0]
+
+ # filtering only objects with color from acceptedColorsList
+ if settings.var['colorFilter_on']:
+ entities = [entity for entity in entities if entity.color in settings.acceptedColors]
+
+ # filtering only objects on layers from acceptedLayersList
+ if settings.var['layerFilter_on']:
+ #entities = [entity for entity in entities if entity.layer[0] in ['M','3','0'] and not entity.layer.endswith('H')]
+ entities = [entity for entity in entities if entity.layer in settings.acceptedLayers]
+
+ # filtering only objects on not-frozen layers
+ if layersmap and not settings.var['layFrozen_on']:
+ entities = [entity for entity in entities if not layersmap[entity.layer].frozen]
+
+ global activObjectLayer, activObjectName
+ activObjectLayer = ''
+ activObjectName = ''
+
+ message = "Drawing dxf\'%ss\'..." %_type
+ cur_COUNTER += len_temp - len(entities)
+ settings.write(message, False)
+ settings.progress(cur_COUNTER, message)
+ if len(entities) > 0.1 / settings.obj_number:
+ show_progress = int(0.03 / settings.obj_number)
+ else: show_progress = 0
+ cur_temp = 0
+
+ #print 'deb:drawer cur_COUNTER: ', cur_COUNTER #-----------------------
+
+ for entity in entities: #----loop-------------------------------------
+ settings.write('\b.', False)
+ cur_COUNTER += 1
+ if show_progress:
+ cur_temp += 1
+ if cur_temp == show_progress:
+ settings.progress(cur_COUNTER, message)
+ cur_temp = 0
+ #print 'deb:drawer show_progress=',show_progress #-----------------------
+
+ # get the layer group (just to make things a little cleaner)
+ if settings.var['group_bylayer_on'] and not block_def:
+ group = getGroup('l:%s' % layernamesmap[entity.layer])
+
+ if _type == 'insert': #---- INSERT and MINSERT=array ------------------------
+ #print 'deb:insert entity.loc:', entity.loc #----------------
+ columns = entity.columns[0]
+ coldist = entity.columns[1]
+ rows = entity.rows[0]
+ rowdist = entity.rows[1]
+ deltaloc = [0,0,0]
+ #print 'deb:insert columns, rows:', columns, rows #-----------
+ for col in xrange(columns):
+ deltaloc[0] = col * coldist
+ for row in xrange(rows):
+ deltaloc[1] = row * rowdist
+ #print 'deb:insert col=%s, row=%s,deltaloc=%s' %(col, row, deltaloc) #------
+ ob = entity.draw(settings, deltaloc) #-----draw BLOCK----------
+ setObjectProperties(ob, group, entity, settings, block_def)
+ if ob:
+ if settings.var['optimization'] <= settings.MIN:
+ if settings.var['g_scale'] != 1: globalScaleOne(ob, True, settings.var['g_scale'])
+ settings.redraw()
+ else: oblist.append((ob, True))
+
+ else: #---draw entities except BLOCKs/INSERTs---------------------
+ alt_obname = activObjectName
+ ob = entity.draw(settings)
+ if ob and ob.name != alt_obname:
+ setObjectProperties(ob, group, entity, settings, block_def)
+ if settings.var['optimization'] <= settings.MIN:
+ if settings.var['g_scale'] != 1: globalScaleOne(ob, False, settings.var['g_scale'])
+ settings.redraw()
+ else: oblist.append((ob, False))
+
+ #print 'deb:Finished drawing:', entities[0].type #------------------------
+ message = "\nDrawing dxf\'%ss\' done!" % _type
+ settings.write(message, True)
+
+
+
+def globalScale(oblist, SCALE): #---------------------------------------------------------
+ """Global_scale for list of all imported objects.
+
+ oblist is a list of pairs (ob, insertFlag), where insertFlag=True/False
+ """
+ #print 'deb:globalScale.oblist: ---------%\n', oblist #---------------------
+ for l in oblist:
+ ob, insertFlag = l[0], l[1]
+ globalScaleOne(ob, insertFlag, SCALE)
+
+
+def globalScaleOne(ob, insertFlag, SCALE): #---------------------------------------------------------
+ """Global_scale imported object.
+ """
+ #print 'deb:globalScaleOne ob: ', ob #---------------------
+ SCALE_MAT= Mathutils.Matrix([SCALE,0,0,0],[0,SCALE,0,0],[0,0,SCALE,0],[0,0,0,1])
+ if insertFlag: # by BLOCKs/INSERTs only insert-point must be scaled------------
+ ob.loc = Mathutils.Vector(ob.loc) * SCALE_MAT
+ else: # entire scaling for all other imported objects ------------
+ ob.setMatrix(ob.matrixWorld*SCALE_MAT)
+
+
+
+def setObjectProperties(ob, group, entity, settings, block_def): #-----------------------
+ """Link object to scene.
+ """
+
+ if not ob: #remi--todo-----------------------
+ message = "\nObject \'%s\' not found!" %entity
+ settings.write(message)
+ return
+
+ if group:
+ setGroup(group, ob) # if object belongs to group
+
+ if block_def: # if object belongs to BLOCK_def - Move it to layer nr19
+ setGroup(block_def, ob)
+ #print 'deb:setObjectProperties \'%s\' set to block_def_group!' %ob.name #---------
+ ob.layers = [19]
+ else:
+ #ob.layers = [i+1 for i in xrange(20)] #remi--todo------------
+ ob.layers = [settings.var['target_layer']]
+
+ # Set material for any objects except empties
+ if ob.type != 'Empty':
+ setMaterial_from(entity, ob, settings, block_def)
+
+ # Set the visibility
+ #if settings.layer_isOff(entity.layer):
+ if layersmap and layersmap[entity.layer].color < 0: # color is negative if layer is off
+ #ob.layers = [20] #remi--todo-------------
+ ob.restrictDisplay = True
+ ob.restrictRender = True
+
+ #print 'deb:\n---------linking Object %s!' %ob.name #----------
+
+
+
+def getGroup(name): #-----------------------------------------------------------------
+ """Returns a Blender group-object.
+ """
+ try:
+ group = Group.Get(name)
+ except: # What is the exception?
+ group = Group.New(name)
+ return group
+
+
+def setGroup(group, ob): #------------------------------------------------------------
+ """Assigns object to Blender group.
+ """
+ try:
+ group.objects.link(ob)
+ except:
+ group.objects.append(ob) #remi?---------------
+
+
+
+def setMaterial_from(entity, ob, settings, block_def): #------------------------------------------------
+ """ Set Blender-material for the object controled by item.
+
+ Set Blender-material for the object
+ - controlled by settings.var['material_from']
+ """
+ if settings.var['material_from'] == 1: # 1= material from color
+ if entity.color_index == BYLAYER:
+ mat = settings.colMaterials(entity.layer)
+ elif entity.color_index == BYBLOCK:
+ #--todo-- looking for block.color_index
+ #mat = settings.colMaterials(block.color_index)
+ mat = settings.colMaterials(entity.color_index)
+ else:
+ mat = settings.colMaterials(entity.color_index)
+
+ elif settings.var['material_from'] == 2: # 2= material from layer_name
+ mat = settings.layMaterials(layername=entity.layer)
+
+ elif settings.var['material_from'] == 3: # 3= material from layer+color
+ mat = settings.layMaterials(layername=entity.layer, color=entity.color_index)
+
+# elif settings.var['material_from'] == 4: # 4= material from block_name
+
+# elif settings.var['material_from'] == 5: # 5= material from XDATA
+
+# elif settings.var['material_from'] == 6: # 6= material from INI-file
+
+ else: # set neutral material
+ try:
+ mat = Material.Get('dxf-neutral')
+ except:
+ mat = Material.New('dxf-neutral')
+ mat.mode |= Material.Modes.SHADELESS
+ mat.mode |= Material.Modes.WIRE
+# try:mat.setMode('Shadeless', 'Wire') #work-around for 2.45rc1-bug
+# except: pass
+ try:
+ #print 'deb:material mat:', mat #-----------
+ ob.setMaterials([mat]) #assigns Blender-material to object
+ except ValueError:
+ settings.write("material error - \'%s\'!" %mat)
+ ob.colbits = 0x01 # Set OB materials.
+
+
+
+def calcBulge(p1, p2, arc_res, triples=False): #-------------------------------------------------
+ """given startpoint, endpoint and bulge of arc, returns points/segments of its representation.
+
+ Needs to take into account bulge sign.
+ negative = clockwise
+ positive = counter-clockwise
+
+ to find center given two points, and arc angle
+ calculate radius
+ Cord = sqrt(start^2 + end^2)
+ S = (bulge*Cord)/2
+ radius = ((Cord/2)^2+S^2)/2*S
+ angle of arc = 4*atan( bulge )
+ angle from p1 to center is (180-angle)/2
+ get vector pointing from p1 to p2 (p2 - p1)
+ normalize it and multiply by radius
+ rotate around p1 by angle to center, point to center.
+ start angle = angle between (center - p1) and worldX
+ end angle = angle between (center - p2) and worldX
+
+ calculate the center, radius, start angle, and end angle
+ returns points/segments of its mesh representation
+ incl.startpoint, without endpoint
+ """
+
+ bulge = p1.bulge
+ p1 = Mathutils.Vector(p1.loc)
+ p2 = Mathutils.Vector(p2.loc)
+ cord = p2 - p1 # vector from p1 to p2
+ clength = cord.length
+ s = (bulge * clength)/2.0 # sagitta (height)
+ radius = abs(((clength/2.0)**2.0 + s**2.0)/(2.0*s)) # magic formula
+ angle = (degrees(4.0*atan(bulge))) # theta (included angle)
+ radial = cord.normalize() * radius # a radius length vector aligned with cord
+ delta = (180.0 - abs(angle))/2.0 # the angle from cord to center
+ if bulge < 0: delta = -delta
+ rmat = Mathutils.RotationMatrix(-delta, 3, 'Z')
+ center = p1 + (rmat * radial) # rotate radial by delta degrees, then add to p1 to find center
+ #length = radians(abs(angle)) * radius
+ #print 'deb:calcBulge:\n angle, delta: ', angle, delta #----------------
+ #print 'deb:center, radius: ', center, radius #----------------------
+ startpoint = p1 - center
+ endpoint = p2 - center
+ #print 'deb:calcBulg: startpoint:', startpoint #---------
+ #print 'deb:calcBulg: endpoint:', endpoint #---------
+
+ if not triples: #IF mesh-representation -----------
+ if arc_res > 1024: arc_res = 1024
+ elif arc_res < 4: arc_res = 4
+ pieces = int(abs(angle)/(360.0/arc_res)) # set a fixed step of ARC_RESOLUTION
+ if pieces < 3: pieces = 3
+ else: #IF curve-representation -------------------------------
+ if arc_res > 32: arc_res = 32
+ elif arc_res < 3: arc_res = 3
+ pieces = int(abs(angle)/(360.0/arc_res)) # set a fixed step of ARC_RESOLUTION
+ if pieces < 2: pieces = 2
+
+ step = angle/pieces # set step so pieces * step = degrees in arc
+ stepmatrix = Mathutils.RotationMatrix(-step, 3, "Z")
+
+ if not triples: #IF mesh-representation -----------
+ points = [startpoint]
+ point = startpoint
+ for i in xrange(int(pieces)-1): #fast (but not so acurate as: vector * RotMatrix(-step*i,3,"Z")
+ point = stepmatrix * point
+ points.append(point)
+ points = [ point+center for point in points]
+ # vector to point convertion:
+ points = [list(point) for point in points]
+ return points, list(center)
+
+ else: #IF curve-representation -------------------------------
+ # correct Bezier curves representation for free segmented circles/arcs
+ step2 = radians(step * 0.5)
+ bulg = radius * (1 - cos(step2))
+ deltaY = 4.0 * bulg / (3.0 * sin(step2) )
+ #print 'deb:calcArcCurve: bulg, deltaY:\n', bulg, deltaY #---------
+ #print 'deb:calcArcCurve: step:\n', step #---------
+
+ #org handler0 = Mathutils.Vector(0.0, -deltaY, 0.0)
+ #handler = startmatrix * handler0
+ #endhandler = endmatrix * handler0
+ rotMatr90 = Mathutils.Matrix([0, -1, 0], [1, 0, 0], [0, 0, 1])
+ handler = rotMatr90 * startpoint
+ handler = - deltaY * handler.normalize()
+ endhandler = rotMatr90 * endpoint
+ endhandler = - deltaY * endhandler.normalize()
+
+ points = [startpoint]
+ handlers1 = [startpoint + handler]
+ handlers2 = [startpoint - handler]
+ point = Mathutils.Vector(startpoint)
+ for i in xrange(int(pieces)-1):
+ point = stepmatrix * point
+ handler = stepmatrix * handler
+ handler1 = point + handler
+ handler2 = point - handler
+ points.append(point)
+ handlers1.append(handler1)
+ handlers2.append(handler2)
+ points.append(endpoint)
+ handlers1.append(endpoint + endhandler)
+ handlers2.append(endpoint - endhandler)
+
+ points = [point + center for point in points]
+ handlers1 = [point + center for point in handlers1]
+ handlers2 = [point + center for point in handlers2]
+
+ VectorTriples = [list(h1)+list(p)+list(h2) for h1,p,h2 in zip(handlers1, points, handlers2)]
+ #print 'deb:calcBulgCurve: handlers1:\n', handlers1 #---------
+ #print 'deb:calcBulgCurve: points:\n', points #---------
+ #print 'deb:calcBulgCurve: handlers2:\n', handlers2 #---------
+ #print 'deb:calcBulgCurve: VectorTriples:\n', VectorTriples #---------
+ return VectorTriples
+
+
+
+
+def calcArc(center, radius, start, end, arc_res, triples): #-----------------------------------------
+ """calculate Points (or BezierTriples) for ARC/CIRCLEs representation.
+
+ Given parameters of the ARC/CIRCLE,
+ returns points/segments (or BezierTriples) and centerPoint
+ """
+ # center is currently set by object
+ # if start > end: start = start - 360
+ if end > 360: end = end % 360.0
+
+ startmatrix = Mathutils.RotationMatrix(-start, 3, "Z")
+ startpoint = startmatrix * Mathutils.Vector(radius, 0, 0)
+ endmatrix = Mathutils.RotationMatrix(-end, 3, "Z")
+ endpoint = endmatrix * Mathutils.Vector(radius, 0, 0)
+
+ if end < start: end +=360.0
+ angle = end - start
+ #length = radians(angle) * radius
+
+ if not triples: #IF mesh-representation -----------
+ if arc_res > 1024: arc_res = 1024
+ elif arc_res < 4: arc_res = 4
+ pieces = int(abs(angle)/(360.0/arc_res)) # set a fixed step of ARC_RESOLUTION
+ if pieces < 3: pieces = 3
+ step = angle/pieces # set step so pieces * step = degrees in arc
+ stepmatrix = Mathutils.RotationMatrix(-step, 3, "Z")
+
+ points = [startpoint]
+ point = startpoint
+ for i in xrange(int(pieces)-1):
+ point = stepmatrix * point
+ points.append(point)
+ points.append(endpoint)
+
+ if center:
+ centerVec = Mathutils.Vector(center)
+ #points = [point + centerVec for point in points()]
+ points = [point + centerVec for point in points]
+ # vector to point convertion:
+ points = [list(point) for point in points]
+ return points
+
+ else: #IF curve-representation ---------------
+ if arc_res > 32: arc_res = 32
+ elif arc_res < 3: arc_res = 3
+ pieces = int(abs(angle)/(360.0/arc_res)) # set a fixed step of ARC_RESOLUTION
+ if pieces < 2: pieces = 2
+ step = angle/pieces # set step so pieces * step = degrees in arc
+ stepmatrix = Mathutils.RotationMatrix(-step, 3, "Z")
+
+ # correct Bezier curves representation for free segmented circles/arcs
+ step2 = radians(step * 0.5)
+ bulg = radius * (1 - cos(step2))
+ deltaY = 4.0 * bulg / (3.0 * sin(step2) )
+ #print 'deb:calcArcCurve: bulg, deltaY:\n', bulg, deltaY #---------
+ #print 'deb:calcArcCurve: step:\n', step #---------
+ handler0 = Mathutils.Vector(0.0, -deltaY, 0.0)
+
+ points = [startpoint]
+ handler = startmatrix * handler0
+ endhandler = endmatrix * handler0
+ handlers1 = [startpoint + handler]
+ handlers2 = [startpoint - handler]
+ point = Mathutils.Vector(startpoint)
+ for i in xrange(int(pieces)-1):
+ point = stepmatrix * point
+ handler = stepmatrix * handler
+ handler1 = point + handler
+ handler2 = point - handler
+ points.append(point)
+ handlers1.append(handler1)
+ handlers2.append(handler2)
+ points.append(endpoint)
+ handlers1.append(endpoint + endhandler)
+ handlers2.append(endpoint - endhandler)
+ VectorTriples = [list(h1)+list(p)+list(h2) for h1,p,h2 in zip(handlers1, points, handlers2)]
+ #print 'deb:calcArcCurve: handlers1:\n', handlers1 #---------
+ #print 'deb:calcArcCurve: points:\n', points #---------
+ #print 'deb:calcArcCurve: handlers2:\n', handlers2 #---------
+ #print 'deb:calcArcCurve: VectorTriples:\n', VectorTriples #---------
+ return VectorTriples
+
+
+def drawCurveCircle(circle): #--- no more used --------------------------------------------
+ """Given a dxf circle object return a blender circle object using curves.
+ """
+ c = Curve.New('circle') # create new curve data
+ center = circle.loc
+ radius = circle.radius
+
+ p1 = (0, -radius, 0)
+ p2 = (radius, 0, 0)
+ p3 = (0, radius, 0)
+ p4 = (-radius, 0, 0)
+
+ p1 = BezTriple.New(p1)
+ p2 = BezTriple.New(p2)
+ p3 = BezTriple.New(p3)
+ p4 = BezTriple.New(p4)
+
+ curve = c.appendNurb(p1)
+ curve.append(p2)
+ curve.append(p3)
+ curve.append(p4)
+ for point in curve:
+ point.handleTypes = [AUTO, AUTO]
+ curve.flagU = 1 # Set curve cyclic
+ c.update()
+
+ ob = Object.New('Curve', 'circle') # make curve object
+ return ob
+
+
+def drawCurveArc(self): #---- only for ELLIPSE -------------------------------------------------------------
+ """Given a dxf ELLIPSE object return a blender_curve.
+ """
+ center = self.loc
+ radius = self.radius
+ start = self.start_angle
+ end = self.end_angle
+
+ if start > end:
+ start = start - 360.0
+ startmatrix = Mathutils.RotationMatrix(start, 3, "Z")
+ startpoint = startmatrix * Mathutils.Vector((radius, 0, 0))
+ endmatrix = Mathutils.RotationMatrix(end, 3, "Z")
+ endpoint = endmatrix * Mathutils.Vector((radius, 0, 0))
+ # Note: handles must be tangent to arc and of correct length...
+
+ a = Curve.New('arc') # create new curve data
+
+ p1 = (0, -radius, 0)
+ p2 = (radius, 0, 0)
+ p3 = (0, radius, 0)
+ p4 = (-radius, 0, 0)
+
+ p1 = BezTriple.New(p1)
+ p2 = BezTriple.New(p2)
+ p3 = BezTriple.New(p3)
+ p4 = BezTriple.New(p4)
+
+ curve = a.appendNurb(p1)
+ curve.append(p2)
+ curve.append(p3)
+ curve.append(p4)
+ for point in curve:
+ point.handleTypes = [AUTO, AUTO]
+ curve.flagU = 1 # Set curve cyclic
+ a.update()
+
+ ob = Object.New('Curve', 'arc') # make curve object
+ return ob
+
+
+
+
+# GUI STUFF -----#################################################-----------------
+from Blender.BGL import *
+
+EVENT_NONE = 1
+EVENT_START = 2
+EVENT_REDRAW = 3
+EVENT_LOAD_INI = 4
+EVENT_SAVE_INI = 5
+EVENT_PRESET = 6
+EVENT_CHOOSE_INI = 7
+EVENT_CHOOSE_DXF = 8
+EVENT_HELP = 9
+EVENT_CONFIG = 10
+EVENT_PRESETS = 11
+EVENT_DXF_DIR = 12
+EVENT_LIST = 13
+EVENT_PRESET2D = 20
+EVENT_EXIT = 100
+GUI_EVENT = EVENT_NONE
+
+GUI_A = {} # GUI-buttons dictionary for parameter
+GUI_B = {} # GUI-buttons dictionary for drawingTypes
+
+# settings default, initialize ------------------------
+
+points_as_menu = "convert to: %t|empty %x1|mesh.vertex %x2|thin sphere %x3|thin box %x4"
+lines_as_menu = "convert to: %t|*edge %x1|mesh %x2|*thin cylinder %x3|*thin box %x4"
+mlines_as_menu = "convert to: %t|*edge %x1|*mesh %x2|*thin cylinder %x3|*thin box %x4"
+plines_as_menu = "convert to: %t|*edge %x1|mesh %x2|*thin cylinder %x3|*thin box %x4"
+plines3_as_menu = "convert to: %t|*edge %x1|mesh %x2|*thin cylinder %x3|*thin box %x4"
+plmesh_as_menu = "convert to: %t|mesh %x1"
+solids_as_menu = "convert to: %t|mesh %x1"
+blocks_as_menu = "convert to: %t|dupl.group %x1|*real.group %x2|*exploded %x3"
+texts_as_menu = "convert to: %t|text %x1|*mesh %x2"
+material_from_menu= "material from: %t|*LINESTYLE %x7|COLOR %x1|LAYER %x2|*LAYER+COLOR %x3|*BLOCK %x4|*XDATA %x5|*INI-File %x6"
+g_scale_list = "scale factor: %t|yard to m %x8|feet to m %x7|inch to m %x6|x 1000 %x3|x 100 %x2|x 10 %x1|x 1 %x0|x 0.1 %x-1|cm to m %x-2|mm to m %x-3|x 0.0001 %x-4|x 0.00001 %x-5"
+
+dxfFileName = Draw.Create("")
+iniFileName = Draw.Create(INIFILE_DEFAULT_NAME + INIFILE_EXTENSION)
+user_preset = 0
+config_UI = Draw.Create(0) #switch_on/off extended config_UI
+
+keywords_org = {
+ 'curves_on' : 0,
+ 'optimization': 2,
+ 'one_mesh_on': 1,
+ 'vGroup_on' : 1,
+ 'dummy_on' : 0,
+ 'newScene_on' : 1,
+ 'target_layer' : TARGET_LAYER,
+ 'group_bylayer_on' : GROUP_BYLAYER,
+ 'g_scale' : float(G_SCALE),
+ 'g_scale_as': int(log10(G_SCALE)), # 0,
+ 'g_scale_on': 1,
+ 'thick_on' : 1,
+ 'thick_min' : float(MIN_THICK),
+ 'thick_force': 0,
+ 'width_on' : 1,
+ 'width_min' : float(MIN_WIDTH),
+ 'width_force': 0,
+ 'dist_on' : 1,
+ 'dist_min' : float(MIN_DIST),
+ 'dist_force': 0,
+ 'material_on': 1,
+ 'material_from': 2,
+ 'pl_3d' : 1,
+ 'fill_on' : 1,
+ 'meshSmooth_on': 1,
+ 'curve_res' : CURV_RESOLUTION,
+ 'curve_arc' : CURVARC_RESOLUTION,
+ 'arc_res' : ARC_RESOLUTION,
+ 'arc_rad' : ARC_RADIUS,
+ 'thin_res' : THIN_RESOLUTION,
+ 'pl_trim_max' : TRIM_LIMIT,
+ 'pl_trim_on': 1,
+ 'paper_space_on': 0,
+ 'layFrozen_on': 0,
+ 'Z_force_on': 0,
+ 'Z_elev': float(ELEVATION),
+ 'points_as' : 2,
+ 'lines_as' : 2,
+ 'mlines_as' : 2,
+ 'plines_as' : 2,
+ 'plines3_as': 2,
+ 'plmesh_as' : 1,
+ 'solids_as' : 1,
+ 'blocks_as' : 1,
+ 'texts_as' : 1
+ }
+
+drawTypes_org = {
+ 'point' : 1,
+ 'line' : 1,
+ 'arc' : 1,
+ 'circle': 1,
+ 'ellipse': 0,
+ 'mline' : 0,
+ 'polyline': 1,
+ 'plmesh': 1,
+ 'pline3': 1,
+ 'lwpolyline': 1,
+ 'text' : 1,
+ 'mtext' : 0,
+ 'block' : 1,
+ 'insert': 1,
+ 'face' : 1,
+ 'solid' : 1,
+ 'trace' : 1
+ }
+
+# creating of GUI-buttons
+# GUI_A - GUI-buttons dictionary for parameter
+# GUI_B - GUI-buttons dictionary for drawingTypes
+for k, v in keywords_org.iteritems():
+ GUI_A[k] = Draw.Create(v)
+for k, v in drawTypes_org.iteritems():
+ GUI_B[k] = Draw.Create(v)
+#print 'deb:init GUI_A: ', GUI_A #---------------
+#print 'deb:init GUI_B: ', GUI_B #---------------
+# initialize settings-object controls how dxf entities are drawn
+settings = Settings(keywords_org, drawTypes_org)
+
+
+
+def saveConfig(): #remi--todo-----------------------------------------------
+ """Save settings/config/materials from GUI to INI-file.
+
+ Write all config data to INI-file.
+ """
+ global iniFileName
+
+ iniFile = iniFileName.val
+ #print 'deb:saveConfig inifFile: ', inifFile #----------------------
+ if iniFile.lower().endswith(INIFILE_EXTENSION):
+ output_str = '[%s,%s]' %(GUI_A, GUI_B)
+ if output_str =='None':
+ Draw.PupMenu('DXF importer: INI-file: Alert!%t|no config-data present to save!')
+ else:
+ #if BPyMessages.Warning_SaveOver(iniFile): #<- remi find it too abstarct
+ if sys.exists(iniFile):
+ f = file(iniFile, 'r'); header_str = f.readline(); f.close()
+ if header_str.startswith(INIFILE_HEADER[0:12]):
+ if Draw.PupMenu(' OK ? %t|SAVE OVER: ' + '\'%s\'' %iniFile) == 1:
+ save_ok = True
+ elif Draw.PupMenu(' OK ? %t|SAVE OVER: ' + '\'%s\'' %iniFile +
+ '|Alert: this file has no valid ImportDXF-format| ! it may belong to another aplication !') == 1:
+ save_ok = True
+ else: save_ok = False
+ else: save_ok = True
+
+ if save_ok:
+ # replace: ',' -> ',\n'
+ # replace: '{' -> '\n{\n'
+ # replace: '}' -> '\n}\n'
+ output_str = ',\n'.join(output_str.split(','))
+ output_str = '\n}'.join(output_str.split('}'))
+ output_str = '{\n'.join(output_str.split('{'))
+ try:
+ f = file(iniFile, 'w')
+ f.write(INIFILE_HEADER + '\n# this is a comment line\n')
+ f.write(output_str)
+ f.close()
+ Draw.PupMenu('DXF importer: INI-file: Done!%t|config-data saved in ' + '\'%s\'' %iniFile)
+ except:
+ Draw.PupMenu('DXF importer: INI-file: Error!%t|failure by writing to ' + '\'%s\'|no config-data saved!' %iniFile)
+
+ else:
+ Draw.PupMenu('DXF importer: INI-file: Alert!%t|no valid name/extension for INI-file selected!')
+ print "DXF importer: Alert!: no valid INI-file selected."
+ if not iniFile:
+ if dxfFileName.val.lower().endswith('.dxf'):
+ iniFileName.val = dxfFileName.val[0:-4] + INIFILE_EXTENSION
+
+
+def loadConfig(): #remi--todo-----------------------------------------------
+ """Load settings/config/materials from INI-file.
+
+ Read material-assignements from config-file.
+ """
+ #070724 buggy Window.FileSelector(loadConfigFile, 'Load config data from INI-file', inifilename)
+ global iniFileName, GUI_A, GUI_B
+
+ iniFile = iniFileName.val
+ #print 'deb:loadConfig iniFile: ', iniFile #----------------------
+ if iniFile.lower().endswith(INIFILE_EXTENSION) and sys.exists(iniFile):
+ f = file(iniFile, 'r')
+ header_str = f.readline()
+ if not header_str.startswith(INIFILE_HEADER):
+ f.close()
+ Draw.PupMenu('DXF importer: INI-file: Alert!%t|no valid header in INI-file: ' + '\'%s\'' %iniFile)
+ else:
+ data_str = f.read()
+ f.close()
+ print 'deb:loadConfig data_str from %s: \n' %iniFile , data_str #--------------------------
+ data = eval(data_str)
+ for k, v in data[0].iteritems():
+ try:
+ GUI_A[k].val = v
+ except:
+ GUI_A[k] = Draw.Create(v)
+ for k, v in data[1].iteritems():
+ try:
+ GUI_B[k].val = v
+ except:
+ GUI_B[k] = Draw.Create(v)
+ else:
+ Draw.PupMenu('DXF importer: INI-file: Alert!%t|no valid INI-file selected!')
+ print "DXF importer: Alert!: no valid INI-file selected."
+ if not iniFileName:
+ if dxfFileName.val.lower().endswith('.dxf'):
+ iniFileName.val = dxfFileName.val[0:-4] + INIFILE_EXTENSION
+
+
+
+def resetDefaultConfig(): #-----------------------------------------------
+ """Resets settings/config/materials to defaults.
+
+ """
+ global GUI_A, GUI_B
+ #print 'deb:lresetDefaultConfig keywords_org: \n', keywords_org #---------
+ for k, v in keywords_org.iteritems():
+ GUI_A[k].val = v
+ for k, v in drawTypes_org.iteritems():
+ GUI_B[k].val = v
+
+
+def resetDefaultConfig_2D(): #-----------------------------------------------
+ """Sets settings/config/materials to defaults 2D.
+
+ """
+ resetDefaultConfig()
+ global GUI_A, GUI_B
+ keywords2d = {
+ 'curves_on' : 0,
+ 'one_mesh_on': 1,
+ 'vGroup_on' : 1,
+ 'thick_on' : 0,
+ 'thick_force': 0,
+ 'width_on' : 1,
+ 'width_force': 0,
+ 'dist_on' : 1,
+ 'dist_force': 0,
+ 'pl_3d' : 0,
+ 'fill_on' : 0,
+ 'pl_trim_on': 1,
+ 'Z_force_on': 0,
+ 'meshSmooth_on': 0,
+ 'points_as' : 2,
+ 'lines_as' : 2,
+ 'mlines_as' : 2,
+ 'plines_as' : 2,
+ 'solids_as' : 1,
+ 'blocks_as' : 1,
+ 'texts_as' : 1
+ }
+
+ drawTypes2d = {
+ 'point' : 1,
+ 'line' : 1,
+ 'arc' : 1,
+ 'circle': 1,
+ 'ellipse': 0,
+ 'mline' : 0,
+ 'polyline': 1,
+ 'plmesh': 0,
+ 'pline3': 0,
+ 'lwpolyline': 1,
+ 'text' : 1,
+ 'mtext' : 0,
+ 'block' : 1,
+ 'insert': 1,
+ 'face' : 0,
+ 'solid' : 1,
+ 'trace' : 1
+ }
+
+ for k, v in keywords2d.iteritems():
+ GUI_A[k].val = v
+ for k, v in drawTypes2d.iteritems():
+ GUI_B[k].val = v
+
+
+
+def draw_UI(): #-----------------------------------------------------------------
+ """ Draw startUI and setup Settings.
+ """
+ global GUI_A, GUI_B #__version__
+ global user_preset, iniFileName, dxfFileName, config_UI
+
+ # This is for easy layout changes
+ but_0c = 70 #button 1.column width
+ but_1c = 70 #button 1.column width
+ but_2c = 70 #button 2.column
+ but_3c = 70 #button 3.column
+ menu_margin = 10
+ butt_margin = 10
+ menu_w = (3 * butt_margin) + but_0c + but_1c + but_2c + but_3c #menu width
+
+ simple_menu_h = 110
+ extend_menu_h = 400
+ y = simple_menu_h # y is menu upper.y
+ if config_UI.val: y += extend_menu_h
+ x = 20 #menu left.x
+ but0c = x + menu_margin #buttons 0.column position.x
+ but1c = but0c + but_0c + butt_margin
+ but2c = but1c + but_1c + butt_margin
+ but3c = but2c + but_2c + butt_margin
+
+ # Here starts menu -----------------------------------------------------
+ #glClear(GL_COLOR_BUFFER_BIT)
+ #glRasterPos2d(8, 125)
+
+ colorbox(x, y+20, x+menu_w+menu_margin*2, menu_margin)
+ Draw.Label("DXF Importer ver." + __version__, but0c, y, menu_w, 20)
+
+ if config_UI.val:
+ y -= 30
+ Draw.BeginAlign()
+ GUI_B['point'] = Draw.Toggle('POINT', EVENT_NONE, but0c, y, but_0c+but_1c, 20, GUI_B['point'].val, "support dxf-POINT on/off")
+ Draw.Label('-->', but2c, y, but_2c, 20)
+ GUI_A['points_as'] = Draw.Menu(points_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['points_as'].val, "select target Blender-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['line'] = Draw.Toggle('LINE.ARC.CIRCLE', EVENT_NONE, but0c, y, but_0c+but_1c, 20, GUI_B['line'].val, "support dxf-LINE,ARC,CIRCLE,ELLIPSE on/off")
+ Draw.Label('-->', but2c, y, but_2c, 20)
+ GUI_A['lines_as'] = Draw.Menu(lines_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['lines_as'].val, "select target Blender-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['mline'] = Draw.Toggle('*MLINE', EVENT_NONE, but0c, y, but_0c+but_1c, 20, GUI_B['mline'].val, "(*wip)support dxf-MLINE on/off")
+ Draw.Label('-->', but2c, y, but_2c, 20)
+ GUI_A['mlines_as'] = Draw.Menu(mlines_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['mlines_as'].val, "select target Blender-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['polyline'] = Draw.Toggle('2D-POLYLINE', EVENT_NONE, but0c, y, but_0c+but_1c, 20, GUI_B['polyline'].val, "support dxf-2D-POLYLINE on/off")
+ Draw.Label('-->', but2c, y, but_2c, 20)
+ GUI_A['plines_as'] = Draw.Menu(plines_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['plines_as'].val, "select target Blender-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['pline3'] = Draw.Toggle('3D-POLYLINE', EVENT_NONE, but0c, y, but_0c+but_1c, 20, GUI_B['pline3'].val, "support dxf-3D-POLYLINE on/off")
+ Draw.Label('-->', but2c, y, but_2c, 20)
+ GUI_A['plines3_as'] = Draw.Menu(plines3_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['plines3_as'].val, "select target Blender-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['plmesh'] = Draw.Toggle('POLYMESH/-FACE', EVENT_NONE, but0c, y, but_0c+but_1c, 20, GUI_B['plmesh'].val, "support dxf-POLYMESH/POLYFACE on/off")
+ Draw.Label('-->', but2c, y, but_2c, 20)
+ GUI_A['plmesh_as'] = Draw.Menu(plmesh_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['plmesh_as'].val, "select target Blender-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['solid'] = Draw.Toggle('3DFACE.SOLID.TRACE', EVENT_NONE, but0c, y, but_0c+but_1c, 20, GUI_B['solid'].val, "support dxf-3DFACE, SOLID and TRACE on/off")
+ Draw.Label('-->', but2c, y, but_2c, 20)
+ GUI_A['solids_as'] = Draw.Menu(solids_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['solids_as'].val, "select target Blender-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['text'] = Draw.Toggle('TEXT', EVENT_NONE, but0c, y, but_0c, 20, GUI_B['text'].val, "support dxf-TEXT on/off")
+ GUI_B['mtext'] = Draw.Toggle('*MTEXT', EVENT_NONE, but1c, y, but_1c-butt_margin, 20, GUI_B['mtext'].val, "(*wip)support dxf-MTEXT on/off")
+ Draw.Label('-->', but2c, y, but_2c, 20)
+ GUI_A['texts_as'] = Draw.Menu(texts_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['texts_as'].val, "select target Blender-object")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_B['block'] = Draw.Toggle('BLOCK', EVENT_NONE, but0c, y, but_0c, 20, GUI_B['block'].val, "support dxf-BLOCK and ARRAY on/off")
+ GUI_A['dummy_on'] = Draw.Toggle('*XREF', EVENT_NONE, but1c, y, but_1c-butt_margin, 20, GUI_A['dummy_on'].val, "(*wip)support XREF-BLOCK on/off")
+ Draw.Label('-->', but2c, y, but_2c, 20)
+ GUI_A['blocks_as'] = Draw.Menu(blocks_as_menu, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['blocks_as'].val, "select target Blender-object")
+ Draw.EndAlign()
+
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_A['dummy_on'] = Draw.Toggle('*views', EVENT_NONE, but0c, y, but_0c-25, 20, GUI_A['dummy_on'].val, "(*wip)support VIEWPORTs on/off")
+ GUI_A['dummy_on'] = Draw.Toggle('*cams', EVENT_NONE, but1c-25, y, but_1c-25, 20, GUI_A['dummy_on'].val, "(*wip)support CAMERAs on/off")
+ GUI_A['dummy_on'] = Draw.Toggle('*lights', EVENT_NONE, but1c+25, y, but_1c-25, 20, GUI_A['dummy_on'].val, "(*wip)support LIGHTs on/off")
+ Draw.EndAlign()
+ Draw.BeginAlign()
+ GUI_A['material_on'] = Draw.Toggle('material', EVENT_NONE, but2c, y, but_2c-20, 20, GUI_A['material_on'].val, "support for material assignment on/off")
+ GUI_A['material_from'] = Draw.Menu(material_from_menu, EVENT_NONE, but3c-20, y, but_3c+20, 20, GUI_A['material_from'].val, "material assignment from?")
+ Draw.EndAlign()
+
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_A['paper_space_on'] = Draw.Toggle('paperSpace', EVENT_NONE, but0c, y, but_0c+20, 20, GUI_A['paper_space_on'].val, "import from paper space only on/off")
+ GUI_A['layFrozen_on'] = Draw.Toggle('frozen', EVENT_NONE, but1c+20, y, but_1c-20, 20, GUI_A['layFrozen_on'].val, "import also from frozen layers on/off")
+ #GUI_A['dummy_on'] = Draw.Toggle('-', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['dummy_on'].val, "dummy on/off")
+ Draw.EndAlign()
+ Draw.BeginAlign()
+ GUI_A['g_scale_on'] = Draw.Toggle('glob.Scale', EVENT_NONE, but2c, y, but_2c, 20, GUI_A['g_scale_on'].val, "scaling all DXF objects on/off")
+ GUI_A['g_scale_as'] = Draw.Menu(g_scale_list, EVENT_NONE, but3c, y, but_3c, 20, GUI_A['g_scale_as'].val, "10^ factor for scaling the DXFdata")
+ Draw.EndAlign()
+
+
+ y -= 30
+ GUI_A['group_bylayer_on'] = Draw.Toggle('oneGroup', EVENT_NONE, but0c, y, but_0c, 20, GUI_A['group_bylayer_on'].val, "grouping entities from the same layer on/off")
+ GUI_A['vGroup_on'] = Draw.Toggle('vGroups', EVENT_NONE, but1c, y, but_1c, 20, GUI_A['vGroup_on'].val, "support Blender-VertexGroups on/off")
+ Draw.BeginAlign()
+ GUI_A['Z_force_on'] = Draw.Toggle('*elevation', EVENT_NONE, but2c, y, but_2c, 20, GUI_A['Z_force_on'].val, "*set objects Z-coordinates to elevation on/off")
+ GUI_A['Z_elev'] = Draw.Number('', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['Z_elev'].val, -1000, 1000, "set default elevation(Z)")
+ Draw.EndAlign()
+
+
+ y -= 20
+ Draw.BeginAlign()
+ GUI_A['meshSmooth_on'] = Draw.Toggle('smooth', EVENT_NONE, but0c, y, but_0c-20, 20, GUI_A['meshSmooth_on'].val, "mesh smooth for circles/arcsegments on/off")
+ GUI_A['pl_trim_on'] = Draw.Toggle('trim', EVENT_NONE, but1c-20, y, 32, 20, GUI_A['pl_trim_on'].val, "intersection of POLYLINE-wide-segments on/off")
+ GUI_A['pl_trim_max'] = Draw.Number('', EVENT_NONE, but1c+12, y, but_1c-12, 20, GUI_A['pl_trim_max'].val, 0, 5, "limit for intersection of POLYLINE-wide-segments: 0.0-5.0")
+ Draw.EndAlign()
+ Draw.BeginAlign()
+ GUI_A['dist_on'] = Draw.Toggle('dist.:', EVENT_NONE, but2c, y, but_2c-20, 20, GUI_A['dist_on'].val, "support distance on/off")
+ GUI_A['dist_force'] = Draw.Toggle('F', EVENT_NONE, but2c+but_2c-20, y, 20, 20, GUI_A['dist_force'].val, "force minimal distance on/off")
+ GUI_A['dist_min'] = Draw.Number('', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['dist_min'].val, 0, 10, "minimal length/distance (double.vertex removing)")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+# GUI_A['thin_res'] = Draw.Number('thin:', EVENT_NONE, but0c, y, but_0c, 20, GUI_A['thin_res'].val, 4, 64, "thin cylinder resolution - number of segments (4-64)")
+ GUI_A['arc_rad'] = Draw.Number('bR:', EVENT_NONE, but0c, y, but_0c, 20, GUI_A['arc_rad'].val, 0.01, 100, "basis radius for arc/circle resolution (0.01-100)")
+ GUI_A['arc_res'] = Draw.Number('', EVENT_NONE, but1c, y, but_1c/2, 20, GUI_A['arc_res'].val, 3, 500, "arc/circle resolution - number of segments (3-500)")
+ GUI_A['fill_on'] = Draw.Toggle('caps', EVENT_NONE, but1c+but_1c/2, y, but_1c/2, 20, GUI_A['fill_on'].val, "draws top and bottom caps of CYLINDERs/closed curves on/off")
+ Draw.EndAlign()
+ Draw.BeginAlign()
+ GUI_A['thick_on'] = Draw.Toggle('thick:', EVENT_NONE, but2c, y, but_2c-20, 20, GUI_A['thick_on'].val, "support thickness on/off")
+ GUI_A['thick_force'] = Draw.Toggle('F', EVENT_NONE, but2c+but_2c-20, y, 20, 20, GUI_A['thick_force'].val, "force minimal thickness on/off")
+ GUI_A['thick_min'] = Draw.Number('', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['thick_min'].val, 0, 10, "minimal thickness")
+ Draw.EndAlign()
+
+
+ y -= 20
+ Draw.BeginAlign()
+ #GUI_A['group_bylayer_on'] = Draw.Toggle('oneGroup', EVENT_NONE, but0c, y, but_0c, 20, GUI_A['group_bylayer_on'].val, "grouping entities from the same layer on/off")
+ GUI_A['curves_on'] = Draw.Toggle('to Curves', EVENT_NONE, but0c, y, but_0c, 20, GUI_A['curves_on'].val, "drawing LINE/ARC/POLYLINE into Blender-Curves instead of Meshes on/off")
+ GUI_A['curve_arc'] = Draw.Number('', EVENT_NONE, but1c, y, but_1c/2, 20, GUI_A['curve_arc'].val, 3, 32, "Bezier circle resolution - number of segments: 3-32")
+ GUI_A['curve_res'] = Draw.Number('', EVENT_NONE, but1c+but_1c/2, y, but_1c/2, 20, GUI_A['curve_res'].val, 3, 50, "Bezier curve resolution: 3-50")
+ Draw.EndAlign()
+ Draw.BeginAlign()
+ GUI_A['width_on'] = Draw.Toggle('width:', EVENT_NONE, but2c, y, but_2c-20, 20, GUI_A['width_on'].val, "support width on/off")
+ GUI_A['width_force'] = Draw.Toggle('F', EVENT_NONE, but2c+but_2c-20, y, 20, 20, GUI_A['width_force'].val, "force minimal width on/off")
+ GUI_A['width_min'] = Draw.Number('', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['width_min'].val, 0, 10, "minimal width")
+ Draw.EndAlign()
+
+ y -= 30
+ #GUI_A['dummy_on'] = Draw.Toggle(' - ', EVENT_NONE, but0c, y, but_0c, 20, GUI_A['dummy_on'].val, "reserved")
+ GUI_A['one_mesh_on'] = Draw.Toggle('oneMesh', EVENT_NONE, but0c, y, but_0c, 20, GUI_A['one_mesh_on'].val, "draw DXF-entities into one mesh-object. Recommended for big DXF-files. on/off")
+ GUI_A['newScene_on'] = Draw.Toggle('newScene', EVENT_NONE, but1c, y, but_1c, 20, GUI_A['newScene_on'].val, "creates new Blender-Scene for each import on/off")
+ GUI_A['target_layer'] = Draw.Number('layer', EVENT_NONE, but2c, y, but_2c, 20, GUI_A['target_layer'].val, 1, 18, "imports into this Blender-layer (<19> reserved for block_definitions)")
+ GUI_A['optimization'] = Draw.Number('optim:', EVENT_NONE, but3c, y, but_3c, 20, GUI_A['optimization'].val, 0, 3, "Optimization Level: 0=Debug/directDrawing, 1=Verbose, 2=ProgressBar, 3=silentMode/fastest")
+
+ y -= 30
+ Draw.BeginAlign()
+ Draw.PushButton('INI file >', EVENT_CHOOSE_INI, but0c, y, but_0c, 20, 'Select INI-file from project directory')
+ iniFileName = Draw.String(' :', EVENT_NONE, but1c, y, menu_w-but_0c-butt_margin, 20, iniFileName.val, FILENAME_MAX, "write here the name of the INI-file")
+ Draw.EndAlign()
+
+ y -= 20
+ Draw.BeginAlign()
+ Draw.PushButton('Presets', EVENT_PRESETS, but0c, y, but_0c, 20, "tipist for Preset-INI-files")
+ Draw.PushButton('Load', EVENT_LOAD_INI, but1c, y, but_1c, 20, ' Loads configuration from ini-file: %s' % iniFileName.val)
+ Draw.PushButton('Save', EVENT_SAVE_INI, but2c, y, but_2c, 20, 'Saves configuration to ini-file: %s' % iniFileName.val)
+# user_preset = Draw.Number('preset:', EVENT_PRESETS, but2c, y, but_2c, 20, user_preset.val, 0, 5, "call user Preset-INI-files")
+ Draw.PushButton('2D', EVENT_PRESET2D, but3c, y, but_3c/2, 20, 'resets configuration to 2D-defaults')
+ Draw.PushButton('3D', EVENT_PRESET, but3c+but_3c/2, y, but_3c/2, 20, 'resets configuration to 3D-defaults')
+ Draw.EndAlign()
+
+
+ y -= 30
+ Draw.BeginAlign()
+ Draw.PushButton('DXFfile >', EVENT_CHOOSE_DXF, but0c, y, but_0c, 20, 'Select DXF-file from project directory')
+ dxfFileName = Draw.String(' :', EVENT_NONE, but1c, y, but_1c+but_2c+but_3c-20, 20, dxfFileName.val, FILENAME_MAX, "type the name of DXF-file or * for multi-import")
+ Draw.PushButton('*.*', EVENT_DXF_DIR, but3c+but_3c-20, y, 20, 20, 'Set asterisk * as filter')
+ Draw.EndAlign()
+
+
+ y -= 50
+ Draw.BeginAlign()
+ Draw.PushButton('EXIT', EVENT_EXIT, but0c, y, but_0c, 40, '' )
+ Draw.PushButton('HELP', EVENT_HELP, but1c, y, but_1c-20, 20, 'calls BlenderWiki for Manual, Updates and Support.')
+ Draw.PushButton('?', EVENT_LIST, but1c+but_1c-20, y, 20, 20, 'analyze DXF-file: print listing of LAYERs and BLOCKs into the text-file.INF')
+ Draw.PushButton('START IMPORT', EVENT_START, but2c, y, but_2c+but_3c+butt_margin, 40, 'Start the import procedure')
+ Draw.EndAlign()
+
+ config_UI = Draw.Toggle('CONFIG', EVENT_CONFIG, but1c-butt_margin/2, y+20, but_1c+butt_margin, 20, config_UI.val, 'Advanced configuration on/off' )
+
+ y -= 20
+ Draw.BeginAlign()
+ Draw.Label(' ', but0c-menu_margin, y, menu_margin, 20)
+ Draw.Label("*) parts under construction", but0c, y, menu_w, 20)
+ Draw.Label(' ', but0c+menu_w, y, menu_margin, 20)
+ Draw.EndAlign()
+
+#-- END GUI Stuf-----------------------------------------------------
+
+def colorbox(x,y,xright,bottom):
+ glColor3f(0.75, 0.75, 0.75)
+ glRecti(x + 1, y + 1, xright - 1, bottom - 1)
+
+def dxf_callback(input_filename):
+ global dxfFileName
+ dxfFileName.val=input_filename
+
+def ini_callback(input_texture):
+ global iniFileName
+ iniFileName.val=input_texture
+
+def event(evt, val):
+ if evt in (Draw.QKEY, Draw.ESCKEY) and not val:
+ Blender.Draw.Exit()
+
+def bevent(evt):
+# global EVENT_NONE,EVENT_LOAD_DXF,EVENT_LOAD_INI,EVENT_SAVE_INI,EVENT_EXIT
+ global config_UI, user_preset
+
+ ######### Manages GUI events
+ if (evt==EVENT_EXIT):
+ Blender.Draw.Exit()
+ elif (evt==EVENT_CHOOSE_INI):
+ Window.FileSelector(ini_callback, "INI-file Selection", '*.ini')
+ elif (evt==EVENT_CONFIG):
+ Draw.Redraw()
+ elif (evt==EVENT_PRESET):
+ resetDefaultConfig()
+ Draw.Redraw()
+ elif (evt==EVENT_PRESET2D):
+ resetDefaultConfig_2D()
+ Draw.Redraw()
+ elif (evt==EVENT_PRESETS):
+ user_preset += 1
+ if user_preset > 5: user_preset = 1
+ iniFileName.val = INIFILE_DEFAULT_NAME + str(user_preset) + INIFILE_EXTENSION
+ Draw.Redraw()
+ elif (evt==EVENT_LIST):
+ dxfFile = dxfFileName.val
+ if dxfFile.lower().endswith('.dxf') and sys.exists(dxfFile):
+ analyzeDXF(dxfFile)
+ else:
+ Draw.PupMenu('DXF importer: Alert!%t|no valid DXF-file selected!')
+ print "DXF importer: error, no valid DXF-file selected! try again"
+ Draw.Redraw()
+ elif (evt==EVENT_HELP):
+ try:
+ import webbrowser
+ webbrowser.open('http://wiki.blender.org/index.php?title=Scripts/Manual/Import/DXF-3D')
+ except:
+ Draw.PupMenu('DXF importer: HELP Alert!%t|no connection to manual-page on Blender-Wiki! try:|\
+http://wiki.blender.org/index.php?title=Scripts/Manual/Import/DXF-3D')
+ Draw.Redraw()
+ elif (evt==EVENT_LOAD_INI):
+ loadConfig()
+ Draw.Redraw()
+ elif (evt==EVENT_SAVE_INI):
+ saveConfig()
+ Draw.Redraw()
+ elif (evt==EVENT_DXF_DIR):
+ dxfFile = dxfFileName.val
+ dxfPathName = ''
+ if '/' in dxfFile:
+ dxfPathName = '/'.join(dxfFile.split('/')[:-1]) + '/'
+ elif '\\' in dxfFile:
+ dxfPathName = '\\'.join(dxfFile.split('\\')[:-1]) + '\\'
+ dxfFileName.val = dxfPathName + '*.dxf'
+ global GUI_A
+ GUI_A['newScene_on'].val = 1
+ Draw.Redraw()
+ elif (evt==EVENT_CHOOSE_DXF):
+ Window.FileSelector(dxf_callback, "DXF-file Selection", '*.dxf')
+ elif (evt==EVENT_START):
+ dxfFile = dxfFileName.val
+ #print 'deb: dxfFile file: ', dxfFile #----------------------
+ if dxfFile.lower().endswith('*.dxf'):
+ if Draw.PupMenu('DXF importer: OK?|will import all DXF-files from:|%s' % dxfFile) == 1:
+ global UI_MODE
+ UI_MODE = False
+ multi_import(dxfFile[:-5]) # cut last char:'*.dxf'
+ Draw.Exit()
+ else:
+ Draw.Redraw()
+ elif dxfFile.lower().endswith('.dxf') and sys.exists(dxfFile):
+ print '\nStandard Mode: active'
+ if GUI_A['newScene_on'].val:
+ _dxf_file = dxfFile.split('/')[-1].split('\\')[-1]
+ _dxf_file = _dxf_file[:-4] # cut last char:'.dxf'
+ _dxf_file = _dxf_file[:MAX_NAMELENGTH] #? [-MAX_NAMELENGTH:])
+ global SCENE
+ SCENE = Blender.Scene.New(_dxf_file)
+ SCENE.makeCurrent()
+ #or so? Blender.Scene.makeCurrent(_dxf_file)
+ #sce = bpy.data.scenes.new(_dxf_file)
+ #bpy.data.scenes.active = sce
+ else:
+ SCENE = Blender.Scene.GetCurrent()
+ SCENE.objects.selected = [] # deselect all
+ main(dxfFile)
+ #SCENE.objects.selected = SCENE.objects
+ #Window.RedrawAll()
+ #Blender.Redraw()
+ #Draw.Redraw()
+ else:
+ Draw.PupMenu('DXF importer: Alert!%t|no valid DXF-file selected!')
+ print "DXF importer: error, no valid DXF-file selected! try again"
+ Draw.Redraw()
+
+
+
+
+def multi_import(DIR):
+ """Imports all DXF-files from directory DIR.
+
+ """
+ global SCENE
+ batchTIME = Blender.sys.time()
+ #if #DIR == "": DIR = os.path.curdir
+ if DIR == "": DIR = Blender.sys.dirname(Blender.Get('filename'))
+ print 'Multifile Mode: searching for DXF-files in %s' %DIR
+ files = \
+ [sys.join(DIR, f) for f in os.listdir(DIR) if f.lower().endswith('.dxf')]
+ if not files:
+ print '...None DXF-files found. Abort!'
+ return
+
+ i = 0
+ for dxfFile in files:
+ i += 1
+ print '\nImporting', dxfFile, ' NUMBER', i, 'of', len(files)
+ if GUI_A['newScene_on'].val:
+ _dxf_file = dxfFile.split('/')[-1].split('\\')[-1]
+ _dxf_file = _dxf_file[:-4] # cut last char:'.dxf'
+ _dxf_file = _dxf_file[:MAX_NAMELENGTH] #? [-MAX_NAMELENGTH:])
+ SCENE = Blender.Scene.New(_dxf_file)
+ SCENE.makeCurrent()
+ #or so? Blender.Scene.makeCurrent(_dxf_file)
+ #sce = bpy.data.scenes.new(_dxf_file)
+ #bpy.data.scenes.active = sce
+ else:
+ SCENE = Blender.Scene.GetCurrent()
+ SCENE.objects.selected = [] # deselect all
+ main(dxfFile)
+ #Blender.Redraw()
+
+ print 'TOTAL TIME: %.6f' % (Blender.sys.time() - batchTIME)
+
+
if __name__ == "__main__":
- Window.FileSelector(main, 'Import a DXF file', '*.dxf')
+ UI_MODE = True
+ Draw.Register(draw_UI, event, bevent)
+
+
+"""
+if 1:
+ # DEBUG ONLY
+ UI_MODE = False
+ TIME= Blender.sys.time()
+ #DIR = '/dxf_r12_testfiles/'
+ DIR = '/metavr/'
+ import os
+ print 'Searching for files'
+ os.system('find %s -iname "*.dxf" > /tmp/tempdxf_list' % DIR)
+ # os.system('find /storage/ -iname "*.dxf" > /tmp/tempdxf_list')
+ print '...Done'
+ file= open('/tmp/tempdxf_list', 'r')
+ lines= file.readlines()
+ file.close()
+ # sort by filesize for faster testing
+ lines_size = [(os.path.getsize(f[:-1]), f[:-1]) for f in lines]
+ lines_size.sort()
+ lines = [f[1] for f in lines_size]
+
+ for i, _dxf in enumerate(lines):
+ if i >= 70:
+ #if 1:
+ print 'Importing', _dxf, '\nNUMBER', i, 'of', len(lines)
+ if True:
+ _dxf_file= _dxf.split('/')[-1].split('\\')[-1]
+ _dxf_file = _dxf_file[:-4] # cut last char:'.dxf'
+ _dxf_file = _dxf_file[:MAX_NAMELENGTH] #? [-MAX_NAMELENGTH:])
+ sce = bpy.data.scenes.new(_dxf_file)
+ bpy.data.scenes.active = sce
+ dxfFileName.val = _dxf
+ main(_dxf)
+
+ print 'TOTAL TIME: %.6f' % (Blender.sys.time() - TIME)
+"""
diff --git a/release/scripts/import_obj.py b/release/scripts/import_obj.py
index 753d8816ff9..30c4c410434 100644
--- a/release/scripts/import_obj.py
+++ b/release/scripts/import_obj.py
@@ -535,7 +535,7 @@ def get_float_func(filepath):
find the float function for this obj file
- weather to replace commas or not
'''
- file= open(filepath, 'r')
+ file= open(filepath, 'rU')
for line in file: #.xreadlines():
if line.startswith('v'): # vn vt v
if ',' in line:
diff --git a/release/scripts/lightwave_import.py b/release/scripts/lightwave_import.py
index 63506a6dc1a..24e072f018a 100644
--- a/release/scripts/lightwave_import.py
+++ b/release/scripts/lightwave_import.py
@@ -693,7 +693,7 @@ def read_clip(lwochunk, dir_part):
i = i + 6 + subchunklen
#end loop on surf chunks
###if DEBUG: print "read image:%s" % clip_dict
- if clip_dict.has_key('XREF'):
+ if 'XREF' in clip_dict: # has_key
###if DEBUG: print "Cross-reference: no image pre-allocated."
return clip_dict
#look for images
@@ -985,7 +985,8 @@ def read_surfs(lwochunk, surf_list, tag_list):
if uvname: # != "":
my_dict['UVNAME'] = uvname #theoretically there could be a number of them: only one used per surf
- if not(my_dict.has_key('g_IMAG')) and (rr.has_key('CHAN')) and (rr.has_key('OPAC')) and (rr.has_key('IMAG')):
+ # all are dictionaries - so testing keys
+ if not('g_IMAG' in my_dict) and ('CHAN' in rr) and ('OPAC' in rr) and ('IMAG' in rr):
if (rr['CHAN'] == 'COLR') and (rr['OPAC'] == 0):
my_dict['g_IMAG'] = rr['IMAG'] #do not set anything, just save image object for later assignment
subchunklen = 0 #force ending
@@ -1005,40 +1006,6 @@ def read_surfs(lwochunk, surf_list, tag_list):
###if DEBUG: print "-> Material pre-allocated."
return my_dict
-
-
-def reduce_face(verts, face):
- TriangleArea= Blender.Mathutils.TriangleArea
- Vector= Blender.Mathutils.Vector
- ####if DEBUG: print len(face), face
- # wants indicies local to the face
- len_face= len(face)
- if len_face==3:
- return [face]
- elif len_face==4:
- vecs= [Vector(verts[i]) for i in face]
- # Get the convave quad area
- a1= TriangleArea(vecs[0], vecs[1], vecs[2])
- a2= TriangleArea(vecs[0], vecs[2], vecs[3])
-
- a3= TriangleArea(vecs[0], vecs[1], vecs[3])
- a4= TriangleArea(vecs[1], vecs[2], vecs[3])
-
- if abs((a1+a2) - (a3+a4)) < (a1+a2+a3+a4)/100: # Not convace
- ####if DEBUG: print 'planer'
- return [[0,1,2,3]]
- if a1+a2<a3+a4:
- return [[0,1,2], [0,2,3]]
- else:
- return [[0,1,3], [1,2,3]]
-
- else: # 5+
- ####if DEBUG: print 'SCANFILL...', len(face)
- ngons= BPyMesh.ngon(verts, face, PREF_FIX_LOOPS= True)
- return ngons
-
-
-
# =========================
# === Recalculate Faces ===
# =========================
@@ -1109,7 +1076,7 @@ def my_create_mesh(clip_list, surf, objspec_list, current_facelist, objname, not
pass
msh.mode |= Blender.Mesh.Modes.AUTOSMOOTH #smooth it anyway
- if surf.has_key('SMAN'):
+ if 'SMAN' in surf: # has_key
#not allowed mixed mode mesh (all the mesh is smoothed and all with the same angle)
#only one smoothing angle will be active! => take the max one
msh.degr = min(80, int(surf['SMAN']/3.1415926535897932384626433832795*180.0)) #lwo in radians - blender in degrees
@@ -1119,12 +1086,8 @@ def my_create_mesh(clip_list, surf, objspec_list, current_facelist, objname, not
except:
img= None
-
#uv_flag = ((surf.has_key('UVNAME')) and (uvcoords_dict.has_key(surf['UVNAME'])) and (img != None))
- uv_flag = ((surf.has_key('UVNAME')) and (uvcoords_dict.has_key(surf['UVNAME'])))
-
-
-
+ uv_flag = (('UVNAME' in surf) and (surf['UVNAME'] in uvcoords_dict))
###if DEBUG: print "\n#===================================================================#"
###if DEBUG: print "Processing Object: %s" % objname
@@ -1186,55 +1149,50 @@ def my_create_mesh(clip_list, surf, objspec_list, current_facelist, objname, not
uvs.append(default_uv)
return uvs
-
+ cur_face
for i in cur_ptag_faces_indexes:
cur_face = complete_facelist[i]
numfaceverts = len(cur_face)
if numfaceverts == 2: edges.append((vertex_map[cur_face[0]], vertex_map[cur_face[1]]))
- elif numfaceverts == 3:
- rev_face = (cur_face[2], cur_face[1], cur_face[0])
+ elif numfaceverts == 3 or numfaceverts == 4:
+ rev_face = [__i for __i in reversed(cur_face)]
face_data.append( [vertex_map[j] for j in rev_face] )
if uv_flag: face_uvs.append(tmp_get_face_uvs(rev_face, i))
-
- elif numfaceverts > 3:
- meta_faces= reduce_face(complete_vertlist, cur_face) # Indices of triangles
+ elif numfaceverts > 4:
+ meta_faces= BPyMesh.ngon(complete_vertlist, cur_face, PREF_FIX_LOOPS= True)
edge_face_count = {}
for mf in meta_faces:
- # ###if DEBUG: print meta_faces
+ # These will always be tri's since they are scanfill faces
+ mf = cur_face[mf[2]], cur_face[mf[1]], cur_face[mf[0]]
+ face_data.append( [vertex_map[j] for j in mf] )
- if len(mf) == 3: #triangle
- mf = cur_face[mf[2]], cur_face[mf[1]], cur_face[mf[0]]
- face_data.append( [vertex_map[j] for j in mf] )
-
- if uv_flag: face_uvs.append(tmp_get_face_uvs(mf, i))
-
- #if USE_FGON:
- if len(meta_faces) > 1:
- mf = face_data[-1] # reuse mf
- for i in xrange(3):
- v1= mf[i]
- v2= mf[i-1]
- if v1!=v2:
- if v1>v2:
- v2,v1= v1,v2
- try:
- edge_face_count[v1,v2]+= 1
- except:
- edge_face_count[v1,v2]= 0
+ if uv_flag: face_uvs.append(tmp_get_face_uvs(mf, i))
+
+ #if USE_FGON:
+ if len(meta_faces) > 1:
+ mf = face_data[-1] # reuse mf
+ for j in xrange(3):
+ v1= mf[j]
+ v2= mf[j-1]
+ if v1!=v2:
+ if v1>v2:
+ v2,v1= v1,v2
+ try:
+ edge_face_count[v1,v2]+= 1
+ except:
+ edge_face_count[v1,v2]= 0
- else: #quads
- mf= cur_face[mf[3]], cur_face[mf[2]], cur_face[mf[1]], cur_face[mf[0]]
- face_data.append( [vertex_map[j] for j in mf] )
- if uv_flag: face_uvs.append(tmp_get_face_uvs(mf, i))
+
if edge_face_count:
edges_fgon.extend( [vert_key for vert_key, count in edge_face_count.iteritems() if count] )
-
- msh.edges.extend(edges)
+ if edges:
+ msh.edges.extend(edges)
+
face_mapping_removed = msh.faces.extend(face_data, indexList=True)
- if surf.has_key('TRAN') or (mat and mat.alpha<1.0): # incase mat is null
+ if 'TRAN' in surf or (mat and mat.alpha<1.0): # incase mat is null
transp_flag = True
else:
transp_flag = False
@@ -1347,7 +1305,7 @@ def create_objects(clip_list, objspec_list, surf_list):
def lookup_imag(clip_list, ima_id):
for ii in clip_list:
if ii and ii['ID'] == ima_id:
- if ii.has_key('XREF'):
+ if 'XREF' in ii: # has_key
#cross reference - recursively look for images
return lookup_imag(clip_list, ii['XREF'])
else:
@@ -1415,7 +1373,7 @@ def create_blok(surf, mat, clip_list, obj_size, obj_pos):
#if not blok['ENAB']:
# ###if DEBUG: print "***Image is not ENABled! Quitting this block"
# break
- if not(blok.has_key('IMAG')):
+ if not('IMAG' in blok): # has_key
###if DEBUG: print "***No IMAGE for this block? Quitting"
break #extract out the image index within the clip_list
if blok['IMAG'] == 0: blok['IMAG'] = lastimag #experimental ....
@@ -1434,13 +1392,13 @@ def create_blok(surf, mat, clip_list, obj_size, obj_pos):
tname += "+"
else:
tname += "x" #let's signal when should not be enabled
- if blok.has_key('CHAN'):
+ if 'CHAN' in blok: # has_key
tname += blok['CHAN']
newtex = bpy.data.textures.new(tname)
newtex.setType('Image') # make it anu image texture
newtex.image = img
#how does it extends beyond borders
- if blok.has_key('WRAP'):
+ if 'WRAP' in blok: # has_key
if (blok['WRAP'] == 3) or (blok['WRAP'] == 2):
newtex.setExtend('Extend')
elif (blok['WRAP'] == 1):
@@ -1457,35 +1415,35 @@ def create_blok(surf, mat, clip_list, obj_size, obj_pos):
nega = False
mapflag = Blender.Texture.MapTo.COL #default to color
maptype = Blender.Texture.Mappings.FLAT
- if blok.has_key('CHAN'):
- if blok['CHAN'] == 'COLR' and blok.has_key('OPACVAL'):
+ if 'CHAN' in blok: # has_key
+ if blok['CHAN'] == 'COLR' and 'OPACVAL' in blok: # has_key
colfac = blok['OPACVAL']
# Blender needs this to be clamped
colfac = max(0.0, min(1.0, colfac))
###if DEBUG: print "!!!Set Texture -> MapTo -> Col = %.3f" % colfac
if blok['CHAN'] == 'BUMP':
mapflag = Blender.Texture.MapTo.NOR
- if blok.has_key('OPACVAL'): norfac = blok['OPACVAL']
+ if 'OPACVAL' in blok: norfac = blok['OPACVAL'] # has_key
###if DEBUG: print "!!!Set Texture -> MapTo -> Nor = %.3f" % norfac
if blok['CHAN'] == 'LUMI':
mapflag = Blender.Texture.MapTo.EMIT
- if blok.has_key('OPACVAL'): dvar = blok['OPACVAL']
+ if 'OPACVAL' in blok: dvar = blok['OPACVAL'] # has_key
###if DEBUG: print "!!!Set Texture -> MapTo -> DVar = %.3f" % dvar
if blok['CHAN'] == 'DIFF':
mapflag = Blender.Texture.MapTo.REF
- if blok.has_key('OPACVAL'): dvar = blok['OPACVAL']
+ if 'OPACVAL' in blok: dvar = blok['OPACVAL'] # has_key
###if DEBUG: print "!!!Set Texture -> MapTo -> DVar = %.3f" % dvar
if blok['CHAN'] == 'SPEC':
mapflag = Blender.Texture.MapTo.SPEC
- if blok.has_key('OPACVAL'): dvar = blok['OPACVAL']
+ if 'OPACVAL' in blok: dvar = blok['OPACVAL'] # has_key
###if DEBUG: print "!!!Set Texture -> MapTo -> DVar = %.3f" % dvar
if blok['CHAN'] == 'TRAN':
mapflag = Blender.Texture.MapTo.ALPHA
- if blok.has_key('OPACVAL'): dvar = blok['OPACVAL']
+ if 'OPACVAL' in blok: dvar = blok['OPACVAL'] # has_key
###if DEBUG: print "!!!Set Texture -> MapTo -> DVar = %.3f" % dvar
alphaflag = 1
nega = True
- if blok.has_key('NEGA'):
+ if 'NEGA' in blok: # has_key
###if DEBUG: print "!!!Watch-out: effect of this texture channel must be INVERTED!"
nega = not nega
@@ -1498,7 +1456,7 @@ def create_blok(surf, mat, clip_list, obj_size, obj_pos):
'Texture Displacement',
'Additive']
set_blendmode = 7 #default additive
- if blok.has_key('OPAC'):
+ if 'OPAC' in blok: # has_key
set_blendmode = blok['OPAC']
if set_blendmode == 5: #transparency
newtex.imageFlags |= Blender.Texture.ImageFlags.CALCALPHA
@@ -1509,7 +1467,7 @@ def create_blok(surf, mat, clip_list, obj_size, obj_pos):
axis = [Blender.Texture.Proj.X, Blender.Texture.Proj.Y, Blender.Texture.Proj.Z]
size = [1.0] * 3
ofs = [0.0] * 3
- if blok.has_key('PROJ'):
+ if 'PROJ' in blok: # has_key
if blok['PROJ'] == 0: #0 - Planar
###if DEBUG: print "!!!Flat projection"
coordflag = Blender.Texture.TexCo.ORCO
@@ -1598,44 +1556,44 @@ def update_material(clip_list, objspec, surf_list):
break
#mat = Blender.Material.New(surf['NAME'])
#surf['g_MAT'] = mat
- if surf.has_key('COLR'):
+ if 'COLR' in surf: # has_key
mat.rgbCol = surf['COLR']
- if surf.has_key('LUMI'):
+ if 'LUMI' in surf:
mat.setEmit(surf['LUMI'])
- if surf.has_key('GVAL'):
+ if 'GVAL' in surf: # has_key
mat.setAdd(surf['GVAL'])
- if surf.has_key('SPEC'):
- mat.setSpec(surf['SPEC']) #it should be * 2 but seems to be a bit higher lwo [0.0, 1.0] - blender [0.0, 2.0]
- if surf.has_key('DIFF'):
- mat.setRef(surf['DIFF']) #lwo [0.0, 1.0] - blender [0.0, 1.0]
- if surf.has_key('GLOS'): #lwo [0.0, 1.0] - blender [0, 255]
- glo = int(371.67 * surf['GLOS'] - 42.334) #linear mapping - seems to work better than exp mapping
- if glo <32: glo = 32 #clamped to 32-255
+ if 'SPEC' in surf: # has_key
+ mat.setSpec(surf['SPEC']) #it should be * 2 but seems to be a bit higher lwo [0.0, 1.0] - blender [0.0, 2.0]
+ if 'DIFF' in surf: # has_key
+ mat.setRef(surf['DIFF']) #lwo [0.0, 1.0] - blender [0.0, 1.0]
+ if 'GLOS' in surf: # has_key #lwo [0.0, 1.0] - blender [0, 255]
+ glo = int(371.67 * surf['GLOS'] - 42.334) #linear mapping - seems to work better than exp mapping
+ if glo <32: glo = 32 #clamped to 32-255
if glo >255: glo = 255
mat.setHardness(glo)
- if surf.has_key('TRNL'):
+ if 'TRNL' in surf: # has_key
mat.setTranslucency(surf['TRNL']) #NOT SURE ABOUT THIS lwo [0.0, 1.0] - blender [0.0, 1.0]
- mm = mat.getMode()
+ mm = mat.mode
mm |= Blender.Material.Modes.TRANSPSHADOW
- if surf.has_key('REFL'):
+ if 'REFL' in surf: # has_key
mat.setRayMirr(surf['REFL']) #lwo [0.0, 1.0] - blender [0.0, 1.0]
mm |= Blender.Material.Modes.RAYMIRROR
- if surf.has_key('TRAN'):
+ if 'TRAN' in surf: # has_key
mat.setAlpha(1.0-surf['TRAN']) #lwo [0.0, 1.0] - blender [1.0, 0.0]
mm |= Blender.Material.Modes.RAYTRANSP
- if surf.has_key('RIND'):
+ if 'RIND' in surf: # has_key
s = surf['RIND']
if s < 1.0: s = 1.0
if s > 3.0: s = 3.0
mat.setIOR(s) #clipped to blender [1.0, 3.0]
mm |= Blender.Material.Modes.RAYTRANSP
- if surf.has_key('BLOK') and surf['BLOK'] != []:
+ if 'BLOK' in surf and surf['BLOK'] != []:
#update the material according to texture.
alphaflag = create_blok(surf, mat, clip_list, obj_size, obj_pos)
if alphaflag:
mm |= Blender.Material.Modes.RAYTRANSP
- mat.setMode(mm)
+ mat.mode = mm
#finished setting up the material
#end if exist SURF
#end loop on materials (SURFs)
@@ -1676,12 +1634,13 @@ def main():
return
Blender.Window.FileSelector(read, "Import LWO", '*.lwo')
+
if __name__=='__main__':
main()
-"""
-# Cams debugging lwo loader
+# Cams debugging lwo loader
+"""
TIME= Blender.sys.time()
import os
print 'Searching for files'
@@ -1690,6 +1649,12 @@ os.system('find /fe/lwo/Objects/ -follow -iname "*.lwo" > /tmp/templwo_list')
print '...Done'
file= open('/tmp/templwo_list', 'r')
lines= file.readlines()
+
+# sort by filesize for faster testing
+lines_size = [(os.path.getsize(f[:-1]), f[:-1]) for f in lines]
+lines_size.sort()
+lines = [f[1] for f in lines_size]
+
file.close()
def between(v,a,b):
@@ -1706,8 +1671,9 @@ for i, _lwo in enumerate(lines):
#if between(i, 525, 550):
#if i > 1635:
#if i != 1519: # 730
- if i>125:
- _lwo= _lwo[:-1]
+ if i>141:
+ #if 1:
+ # _lwo= _lwo[:-1]
print 'Importing', _lwo, '\nNUMBER', i, 'of', len(lines)
_lwo_file= _lwo.split('/')[-1].split('\\')[-1]
newScn= bpy.data.scenes.new(_lwo_file)
diff --git a/release/scripts/mesh_boneweight_copy.py b/release/scripts/mesh_boneweight_copy.py
index 8aa9a1e3213..8aa9a1e3213 100755..100644
--- a/release/scripts/mesh_boneweight_copy.py
+++ b/release/scripts/mesh_boneweight_copy.py
diff --git a/release/scripts/mesh_edges2curves.py b/release/scripts/mesh_edges2curves.py
index fdf61298ebc..84f3cc41779 100644
--- a/release/scripts/mesh_edges2curves.py
+++ b/release/scripts/mesh_edges2curves.py
@@ -39,17 +39,8 @@ Supported:<br>
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------
-
from Blender import *
-def edkey(ed):
- i1 = ed.v1.index
- i2 = ed.v2.index
- if i1>i2:
- return (i2,i1), ed
- else:
- return (i1,i2), ed
-
def polysFromMesh(me):
# a polyline is 2
#polylines are a list
diff --git a/release/scripts/mesh_skin.py b/release/scripts/mesh_skin.py
index fdb721bc9f3..a554e128b41 100644
--- a/release/scripts/mesh_skin.py
+++ b/release/scripts/mesh_skin.py
@@ -628,7 +628,7 @@ def main():
try: me.faces.delete(1, [ f for f in me.faces if f.sel ])
except: pass
- me.faces.extend(faces)
+ me.faces.extend(faces, smooth = True)
print '\nSkin done in %.4f sec.' % (Blender.sys.time()-time1)
diff --git a/release/scripts/mesh_unfolder.py b/release/scripts/mesh_unfolder.py
index 8ebf1777c2e..906e0f0a300 100644
--- a/release/scripts/mesh_unfolder.py
+++ b/release/scripts/mesh_unfolder.py
@@ -1,10 +1,10 @@
#!BPY
"""
Name: 'Unfold'
-Blender: 243
+Blender: 245
Group: 'Mesh'
Tip: 'Unfold meshes to create nets'
-Version: v2.2.4
+Version: v2.5
Author: Matthew Chadwick
"""
import Blender
@@ -18,16 +18,18 @@ try:
from math import *
import sys
import random
- from decimal import *
import xml.sax, xml.sax.handler, xml.sax.saxutils
+
+ # annoying but need so classes dont raise errors
+ xml_sax_handler_ContentHandler = xml.sax.handler.ContentHandler
except:
- print "One of the Python modules required can't be found."
- print sys.exc_info()[1]
- traceback.print_exc(file=sys.stdout)
-
+ Draw.PupMenu('Error%t|A full python installation is required to run this script.')
+ xml = None
+ xml_sax_handler_ContentHandler = type(0)
+
__author__ = 'Matthew Chadwick'
-__version__ = '2.2.4 24032007'
+__version__ = '2.5 06102007'
__url__ = ["http://celeriac.net/unfolder/", "blender", "blenderartist"]
__email__ = ["post at cele[remove this text]riac.net", "scripts"]
__bpydoc__ = """\
@@ -79,7 +81,7 @@ class FacesAndEdges:
self.edgeFaces[key].append(face)
def findTakenAdjacentFace(self, bface, edge):
return self.findAdjacentFace(bface, edge)
- # find the first untaken (non-selected) adjacent face in the list of adjacent faces for the given edge
+ # find the first untaken (non-selected) adjacent face in the list of adjacent faces for the given edge (allows for manifold meshes too)
def findAdjacentFace(self, bface, edge):
faces = self.edgeFaces[edge.key()]
for i in xrange(len(faces)):
@@ -107,84 +109,7 @@ class FacesAndEdges:
if(bface!=None):
bface.sel= True
self.nfaces+=1
-
-
-class IntersectionResult:
- def __init__(self, rn, rd, v=None):
- self.v = v
- self.rd = rd
- self.rn = rn
- def intersected(self):
- return not(not(self.v))
- def isParallel(self):
- return (self.rd==0)
- def isColinear(self):
- return (self.rn==0)
- def intersection(self):
- return self.v
-
-# represents a line segment between two points [p1, p2]. the points are [x,y]
-class LineSegment:
- def __init__(self, p):
- self.p = p
- def intersects(self, s):
- rn = ((self.p[0].y-s.p[0].y)*(s.p[1].x-s.p[0].x)-(self.p[0].x-s.p[0].x)*(s.p[1].y-s.p[0].y))
- rd = ((self.p[1].x-self.p[0].x)*(s.p[1].y-s.p[0].y)-(self.p[1].y-self.p[0].y)*(s.p[1].x-s.p[0].x))
- # need an epsilon closeTo() here
- if(rd<0.0000001 or rn==0.0):
- return IntersectionResult(rn,rd)
- r = rn/rd
- s = ((self.p[0].y-s.p[0].y)*(self.p[1].x-self.p[0].x)-(self.p[0].x-s.p[0].x)*(self.p[1].y-self.p[0].y)) / rd
- i = (0.0<=r and r<=1.0 and 0.0<=s and s<=1.0)
- if not(i):
- return None
- ix = self.p[0].x + r*(self.p[1].x - self.p[0].x)
- iy = self.p[0].y + r*(self.p[1].y - self.p[0].y)
- t = 0.0001
- if ( abs(ix-self.p[0].x)>t and abs(iy-self.p[0].x)>t and abs(ix-self.p[1].x)>t and abs(iy-self.p[1].y)>t ):
- return IntersectionResult( rn, rd,Vector([ix,iy,0.0]))
- else:
- return None
-
-class LineSegments:
- def __init__(self, face):
- self.face = face
- def segmentAt(self, i):
- if(i>self.face.nPoints()-1):
- return None
- if(i==self.face.nPoints()-1):
- j = 0
- else:
- j = i+1
- return LineSegment([ self.face.v[i], self.face.v[j] ])
- def iterateSegments(self, something):
- results = []
- for i in xrange(self.face.nPoints()):
- results.extend(something.haveSegment(self.segmentAt(i)))
- return results
- def compareSegments(self, something, segment):
- results = []
- for i in xrange(self.face.nPoints()):
- results.append(something.compareSegments([self.segmentAt(i), segment]))
- return results
-
-class FaceOverlapTest:
- def __init__(self, face1, face2):
- self.faces = [face1, face2]
- self.segments = [ LineSegments(self.faces[0]), LineSegments(self.faces[1]) ]
- def suspectsOverlap(self):
- tests = self.segments[0].iterateSegments(self)
- gi = 0
- for i in tests:
- if( i!=None and i.intersected() ):
- gi+=1
- return gi>0
- def haveSegment(self, segment):
- return self.segments[1].compareSegments(self, segment)
- def compareSegments(self, segments):
- return segments[0].intersects(segments[1])
-
# A fold between two faces with a common edge
class Fold:
@@ -398,7 +323,7 @@ class Net:
if(len(ff.v)<3):
raise Exception("This mesh contains an isolated edge - it must consist only of faces")
testFace = Poly.fromVectors( [ Vector([0.0,0.0,0.0]), Vector([0.0,1.0,0.0]), Vector([1.0,1.0,0.0]) ] )
- # hmmm
+ # hmmm. I honestly can't remember why this needs to be done, but it does.
u=0
v=1
w=2
@@ -412,6 +337,7 @@ class Net:
xyFold = Fold(None, xyFace, refFace, Edge(xyFace.v[0], xyFace.v[1] ))
self.refFold = Fold(xyFold, refFace, ff, Edge(refFace.v[0], refFace.v[1] ))
self.refFold.srcFace = self.firstFace
+ # prepare to grow the trees
trunk = Tree(self, None, self.refFold)
trunk.generations = self.generations
self.firstPoly = ff
@@ -423,6 +349,7 @@ class Net:
self.folds.append(self.refFold)
trunk.grow()
i = 0
+ # keep the trees growing while they can
while(self.myFacesVisited<len(self.src.faces) and len(self.branches) > 0):
if self.edgeIteratorClass==RandomEdgeIterator:
i = random.randint(0,len(self.branches)-1)
@@ -459,11 +386,12 @@ class Net:
for afold in folds:
mdf = afold.unfoldedFace()
if(afold!=fold):
- it1 = FaceOverlapTest(mf, mdf)
- it2 = FaceOverlapTest(mdf, mf)
- overlap = (it1.suspectsOverlap() or it2.suspectsOverlap())
+ # currently need to get agreement from both polys because
+ # a touch by a vertex of one the other's edge is acceptable &
+ # they disagree on that
+ intersects = mf.intersects2D(mdf) and mdf.intersects2D(mf)
inside = ( mdf.containsAnyOf(mf) or mf.containsAnyOf(mdf) )
- if( overlap or inside or mdf.overlays(mf)):
+ if( intersects or inside or mdf.overlays(mf)):
c.append(afold)
return c
def getOverlapsBetweenGL(self, fold, folds):
@@ -644,9 +572,9 @@ class Net:
overlaps = self.report()
attempts+=1
return attempts
- def unfoldSelected(feedback=None, netName=None):
+ def fromSelected(feedback=None, netName=None):
return Net.createNet(Blender.Object.GetSelected()[0], feedback, netName)
- unfoldSelected = staticmethod(unfoldSelected)
+ fromSelected = staticmethod(fromSelected)
def clone(self, object=None):
if(object==None):
object = self.object
@@ -823,7 +751,7 @@ class Curvature(EdgeIterator):
g += f.dihedralAngle()
self.gooodness = g
-
+
class Edge:
def __init__(self, v1=None, v2=None, mEdge=None, i=-1):
self.idx = i
@@ -891,6 +819,23 @@ class Edge:
return +1
else:
return -1
+ # Does the given segment intersect this, for overlap detection.
+ # endpoints are allowed to touch the line segment
+ def intersects2D(self, s):
+ if(self.matches(s)):
+ return False
+ else:
+ i = Geometry.LineIntersect2D(self.v1, self.v2, s.v1, s.v2)
+ if(i!=None):
+ i.resize4D()
+ i.z = self.v1.z # hack to put the point on the same plane as this edge for comparison
+ return(i!=None and not(self.endsWith(i)))
+ def matches(self, s):
+ return ( (self.v1==s.v1 and self.v2==s.v2) or (self.v2==s.v1 and self.v1==s.v2) )
+ # Is the given point on the end of this segment ? 10-5 seems to an acceptable limit for closeness in Blender
+ def endsWith(self, aPoint, e=0.0001):
+ return ( (self.v1-aPoint).length < e or (self.v2-aPoint).length < e )
+
class Poly:
ids = -1
@@ -899,6 +844,7 @@ class Poly:
self.v = []
self.id = Poly.ids
self.boundz = None
+ self.edges = None
def getID(self):
return self.id
def normal(self):
@@ -910,6 +856,21 @@ class Poly:
q = a-c
q.resize3D()
return CrossVecs(p,q)
+ def makeEdges(self):
+ self.edges = []
+ for i in xrange(self.nPoints()):
+ self.edges.append(Edge( self.v[i % self.nPoints()], self.v[ (i+1) % self.nPoints()] ))
+ def edgeAt(self, i):
+ if(self.edges==None):
+ self.makeEdges()
+ return self.edges[i]
+ def intersects2D(self, poly):
+ for i in xrange(self.nPoints()):
+ edge = self.edgeAt(i)
+ for j in xrange(poly.nPoints()):
+ if edge.intersects2D(poly.edgeAt(j)):
+ return True
+ return False
def isBad(self):
badness = 0
for vv in self.v:
@@ -1031,8 +992,7 @@ class Poly:
def toString(self):
return self.v
# This is the BEST algorithm for point-in-polygon detection.
- # It's by W. Randolph Franklin. It's also very beautiful (looks even better in C).
- # All the others are shite; they give false positives.
+ # It's by W. Randolph Franklin.
# returns 1 for inside, 1 or 0 for edges
def contains(self, tp):
c = 0
@@ -1114,6 +1074,7 @@ class SVGExporter:
def export(self):
self.net.unfoldTo(1)
bb = self.object.getBoundBox()
+ print bb
self.vxmin = bb[0][0]
self.vymin = bb[0][1]
self.vxmax = bb[7][0]
@@ -1141,14 +1102,14 @@ class SVGExporter:
self.addPolys()
self.e.endElement("clipPath")
def addUVImage(self):
- image = Blender.Image.GetCurrent()
+ image = Blender.Image.GetCurrent() #hmm - how to determine the desired image ?
if image==None:
return
ifn = image.getFilename()
- #ifn = self.filename.replace(".svg", ".jpg")
- #image.setFilename(ifn)
- #ifn = ifn[ifn.rfind("/")+1:]
- #image.save()
+ ifn = self.filename.replace(".svg", ".jpg")
+ image.setFilename(ifn)
+ ifn = ifn[ifn.rfind("/")+1:]
+ image.save()
atts = {}
atts["clip-path"] = "url(#netClip)"
atts["xlink:href"] = ifn
@@ -1242,7 +1203,7 @@ class SVGExporter:
traceback.print_exc(file=sys.stdout)
fileSelected = staticmethod(fileSelected)
-
+# for importing nets saved by the above exporter
class NetHandler(xml.sax.handler.ContentHandler):
def __init__(self, net):
self.net = net
@@ -1413,7 +1374,7 @@ class GUI:
while(s):# and search < searchLimit):
if(net!=None):
name = net.des.name
- net = Net.unfoldSelected(self, name)
+ net = Net.fromSelected(self, name)
net.setAvoidsOverlaps(not(self.overlaps.val))
print
print "Unfolding selected object"
@@ -1516,6 +1477,14 @@ class GUI:
else:
self.nOverlaps = 0
Draw.Redraw(1)
+ if(evt==233):
+ f1 = Poly.fromBlenderFace(Blender.Object.GetSelected()[0].getData().faces[0])
+ f2 = Poly.fromBlenderFace(Blender.Object.GetSelected()[1].getData().faces[0])
+ print
+ print Blender.Object.GetSelected()[0].getName()
+ print Blender.Object.GetSelected()[1].getName()
+ print f1.intersects2D(f2)
+ print f2.intersects2D(f1)
if(evt==714):
Net.unfoldAll(self)
Draw.Redraw(1)
@@ -1567,6 +1536,7 @@ class GUI:
Draw.Button("Unfold", 1, l.nx(), l.ny(), l.cw, l.ch, "Unfold selected mesh to net")
Draw.Button("save", 104, l.nx(), l.ny(), l.cw, l.ch, "Save net as SVG")
Draw.Button("load", 107, l.nx(), l.ny(), l.cw, l.ch, "Load net from SVG")
+ #Draw.Button("test", 233, l.nx(), l.ny(), l.cw, l.ch, "test")
# unfolding enthusiasts - try uncommenting this
self.ancestors = Draw.Number("depth", 654, l.nx(), l.ny(), cw, ch, self.ancestors.val, 0, 9999, "depth of branching 0=diffuse")
#self.noise = Draw.Number("noise", 631, l.nx(), l.ny(), cw, ch, self.noise.val, 0.0, 1.0, "noisyness of branching")
@@ -1574,7 +1544,7 @@ class GUI:
options = "order %t|random %x0|brightest %x1|curvature %x2|winding %x3| 1010 %x4|largest %x5"
self.shape = Draw.Menu(options, 713, l.nx(), l.ny(), cw, ch, self.shape.val, "shape of net")
Draw.Button("exit", 6, l.nx(), l.ny(), l.cw, l.ch, "exit")
- BGL.glClearColor(0.5, 0.5, 0.5, 1)
+ BGL.glClearColor(0.3, 0.3, 0.3, 1)
BGL.glColor3f(0.3,0.3,0.3)
l.newLine()
BGL.glRasterPos2i(32, 100)
@@ -1601,10 +1571,12 @@ class FlowLayout:
self.y-=self.ch+self.margin
self.x = self.margin
-try:
- sys.setrecursionlimit(10000)
- gui = GUI()
- gui.makeStandardGUI()
- #gui.makePopupGUI()
-except:
- traceback.print_exc(file=sys.stdout)
+# if xml is None, then dont bother running the script
+if xml:
+ try:
+ sys.setrecursionlimit(10000)
+ gui = GUI()
+ gui.makeStandardGUI()
+ #gui.makePopupGUI()
+ except:
+ traceback.print_exc(file=sys.stdout)
diff --git a/release/scripts/mesh_wire.py b/release/scripts/mesh_wire.py
index 35cfa325497..bd38c47a9b9 100644
--- a/release/scripts/mesh_wire.py
+++ b/release/scripts/mesh_wire.py
@@ -44,6 +44,7 @@ from BPyMathutils import angleToLength
import mesh_solidify
import BPyMessages
+reload(BPyMessages)
import bpy
@@ -219,9 +220,7 @@ def solid_wire(ob_orig, me_orig, sce, PREF_THICKNESS, PREF_SOLID, PREF_SHARP, PR
for ii in vusers:
co += me.verts[ii].co
co /= len(vusers)
-
-
-
+
me.faces.delete(1, range(len(me.faces)))
me.faces.extend(new_faces)
@@ -245,6 +244,18 @@ def main():
BPyMessages.Error_NoMeshActive()
return
+ # Saves the editmode state and go's out of
+ # editmode if its enabled, we cant make
+ # changes to the mesh data while in editmode.
+ is_editmode = Window.EditMode()
+ Window.EditMode(0)
+
+ me = ob_act.getData(mesh=1) # old NMesh api is default
+ if len(me.faces)==0:
+ BPyMessages.Error_NoMeshFaces()
+ if is_editmode: Window.EditMode(1)
+ return
+
# Create the variables.
PREF_THICK = Blender.Draw.Create(0.005)
PREF_SOLID = Blender.Draw.Create(1)
@@ -259,16 +270,10 @@ def main():
]
if not Blender.Draw.PupBlock('Solid Wireframe', pup_block):
+ if is_editmode: Window.EditMode(1)
return
- # Saves the editmode state and go's out of
- # editmode if its enabled, we cant make
- # changes to the mesh data while in editmode.
- is_editmode = Window.EditMode()
- Window.EditMode(0)
-
Window.WaitCursor(1)
- me = ob_act.getData(mesh=1) # old NMesh api is default
t = sys.time()
# Run the mesh editing function
@@ -282,4 +287,4 @@ def main():
# This lets you can import the script without running it
if __name__ == '__main__':
- main() \ No newline at end of file
+ main()
diff --git a/release/scripts/object_cookie_cutter.py b/release/scripts/object_cookie_cutter.py
index 2a6e0ad6b2e..2a6e0ad6b2e 100755..100644
--- a/release/scripts/object_cookie_cutter.py
+++ b/release/scripts/object_cookie_cutter.py
diff --git a/release/scripts/object_random_loc_sz_rot.py b/release/scripts/object_random_loc_sz_rot.py
index 13c42e859d7..1af0dc7218a 100755..100644
--- a/release/scripts/object_random_loc_sz_rot.py
+++ b/release/scripts/object_random_loc_sz_rot.py
@@ -33,46 +33,67 @@ This script randomizes the selected objects location/size/rotation.
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------
+'''
+30 Jun 07 - ZanQdo:
+ - Properly coded axis toggles for Loc random (didn't work at all)
+ - Made Rot input values meaningful (45 will give max 45 degres of rotation)
+ - Pumped up the Scale value limit
+ - Made Scale input values meaningful (15 will give max 15 units bigger model)
+'''
+
from Blender import Draw, Scene
from Blender.Mathutils import Rand
-def rnd():
- return Rand()-0.5
+def rnd(flag):
+ Random = Rand()
+ if flag == "LOC":
+ return (Random - 0.5) * 2
+ elif flag == "ROT":
+ return (Random - 0.5) * 0.035
+ elif flag == "SIZE":
+ return (Random - 0.5) * 1.8
def randomize(sel, PREF_LOC, PREF_SIZE, PREF_ROT, PREF_LINK_AXIS, PREF_X_AXIS, PREF_Y_AXIS, PREF_Z_AXIS):
for ob in sel:
if PREF_LOC:
if PREF_LINK_AXIS:
- rand = PREF_LOC*rnd()
+ rand = PREF_LOC*rnd("LOC")
ob.loc = (ob.LocX+(rand*PREF_X_AXIS), ob.LocY+(rand*PREF_Y_AXIS), ob.LocZ+(rand*PREF_Z_AXIS))
else:
- ob.loc = (ob.LocX+(PREF_LOC*rnd()), ob.LocY+(PREF_LOC*rnd()), ob.LocZ+(PREF_LOC*rnd()))
-
+ if PREF_X_AXIS: x= PREF_LOC*rnd("LOC")
+ else: x= 0
+ if PREF_Y_AXIS: y= PREF_LOC*rnd("LOC")
+ else: y= 0
+ if PREF_Z_AXIS: z= PREF_LOC*rnd("LOC")
+ else: z= 0
+ ob.loc = (ob.LocX+x, ob.LocY+y, ob.LocZ+z)
+
if PREF_SIZE:
if PREF_LINK_AXIS:
- rand = 1 + (PREF_SIZE*rnd())
+ rand = PREF_SIZE*rnd("SIZE")
if PREF_X_AXIS: x= rand
- else: x= 1
+ else: x= 0
if PREF_Y_AXIS: y= rand
- else: y= 1
+ else: y= 0
if PREF_Z_AXIS: z= rand
- else: z= 1
- ob.size = (ob.SizeX*x, ob.SizeY*y, ob.SizeZ*z)
+ else: z= 0
+
else:
- if PREF_X_AXIS: x= 1+ PREF_SIZE*rnd()
- else: x= 1
- if PREF_Y_AXIS: y= 1+ PREF_SIZE*rnd()
- else: y= 1
- if PREF_Z_AXIS: z= 1+ PREF_SIZE*rnd()
- else: z= 1
+ if PREF_X_AXIS: x= PREF_SIZE*rnd("SIZE")
+ else: x= 0
+ if PREF_Y_AXIS: y= PREF_SIZE*rnd("SIZE")
+ else: y= 0
+ if PREF_Z_AXIS: z= PREF_SIZE*rnd("SIZE")
+ else: z= 0
- ob.size = (ob.SizeX*x, ob.SizeY*y, ob.SizeZ*z)
+ ob.size = (abs(ob.SizeX+x), abs(ob.SizeY+y), abs(ob.SizeZ+z))
+
if PREF_ROT:
if PREF_LINK_AXIS:
- rand = PREF_ROT*rnd()
+ rand = PREF_ROT*rnd("ROT")
ob.rot = (ob.RotX+rand, ob.RotY+rand, ob.RotZ+rand)
else:
- ob.rot = (ob.RotX+(PREF_X_AXIS*PREF_ROT*rnd()), ob.RotY+(PREF_Y_AXIS*PREF_ROT*rnd()), ob.RotZ+(PREF_Z_AXIS*PREF_ROT*rnd()))
+ ob.rot = (ob.RotX+(PREF_X_AXIS*PREF_ROT*rnd("ROT")), ob.RotY+(PREF_Y_AXIS*PREF_ROT*rnd("ROT")), ob.RotZ+(PREF_Z_AXIS*PREF_ROT*rnd("ROT")))
def main():
@@ -89,9 +110,9 @@ def main():
PREF_Z_AXIS= Draw.Create(1)
pup_block = [\
- ('loc:', PREF_LOC, 0.0, 10.0, 'Amount to randomize the location'),\
- ('size:', PREF_SIZE, 0.0, 10.0, 'Amount to randomize the size'),\
- ('rot:', PREF_ROT, 0.0, 10.0, 'Amount to randomize the rotation'),\
+ ('loc:', PREF_LOC, 0.0, 100.0, 'Amount to randomize the location'),\
+ ('size:', PREF_SIZE, 0.0, 100.0, 'Amount to randomize the size'),\
+ ('rot:', PREF_ROT, 0.0, 360.0, 'Amount to randomize the rotation'),\
'',\
('Link Axis', PREF_LINK_AXIS, 'Use the same random value for each objects XYZ'),\
('X Axis', PREF_X_AXIS, 'Enable X axis randomization'),\
diff --git a/release/scripts/ply_import.py b/release/scripts/ply_import.py
index a1118d8356d..6b96777102a 100644
--- a/release/scripts/ply_import.py
+++ b/release/scripts/ply_import.py
@@ -199,10 +199,14 @@ def read(filename):
obj = obj_spec.load(format_specs[format], file)
except IOError, (errno, strerror):
- file.close()
+ try: file.close()
+ except: pass
+
return None
- file.close()
+ try: file.close()
+ except: pass
+
return (obj_spec, obj);
diff --git a/release/scripts/scripttemplate_pyconstraint.py b/release/scripts/scripttemplate_pyconstraint.py
new file mode 100644
index 00000000000..68aa9194435
--- /dev/null
+++ b/release/scripts/scripttemplate_pyconstraint.py
@@ -0,0 +1,114 @@
+#!BPY
+"""
+Name: 'Script Constraint'
+Blender: 245
+Group: 'ScriptTemplate'
+Tooltip: 'Add a new script for custom constraints'
+"""
+
+from Blender import Window
+import bpy
+
+script_data = \
+"""#BPYCONSTRAINT
+'''
+ PyConstraint template, access this in the "add constraint" scripts submenu.
+ Add docstring here
+'''
+
+import Blender
+from Blender import Draw
+from Blender import Mathutils
+import math
+
+'''
+ This variable specifies the number of targets
+ that this constraint can use
+'''
+NUM_TARGETS = 1
+
+
+'''
+ This function is called to evaluate the constraint
+ obmatrix: (Matrix) copy of owner's 'ownerspace' matrix
+ targetmatrices: (List) list of copies of the 'targetspace' matrices of the targets (where applicable)
+ idprop: (IDProperties) wrapped data referring to this
+ constraint instance's idproperties
+'''
+def doConstraint(obmatrix, targetmatrices, idprop):
+ # Separate out the tranformation components for easy access.
+ obloc = obmatrix.translationPart() # Translation
+ obrot = obmatrix.toEuler() # Rotation
+ obsca = obmatrix.scalePart() # Scale
+
+ # Define user-settable parameters.\
+ # Must also be defined in getSettings().
+ if not idprop.has_key('user_toggle'): idprop['user_toggle'] = 1
+ if not idprop.has_key('user_slider'): idprop['user_slider'] = 1.0
+
+
+ # Do stuff here, changing obloc, obrot, and obsca.
+
+
+ # Convert back into a matrix for loc, scale, rotation,
+ mtxloc = Mathutils.TranslationMatrix( obloc )
+ mtxrot = obrot.toMatrix().resize4x4()
+ mtxsca = Mathutils.Matrix([obsca[0],0,0,0], [0,obsca[1],0,0], [0,0,obsca[2],0], [0,0,0,1])
+
+ # Recombine the separate elements into a transform matrix.
+ outputmatrix = mtxsca * mtxrot * mtxloc
+
+ # Return the new matrix.
+ return outputmatrix
+
+
+
+'''
+ This function manipulates the matrix of a target prior to sending it to doConstraint()
+ target_object: wrapped data, representing the target object
+ subtarget_bone: wrapped data, representing the subtarget pose-bone/vertex-group (where applicable)
+ target_matrix: (Matrix) the transformation matrix of the target
+ id_properties_of_constraint: (IDProperties) wrapped idproperties
+'''
+def doTarget(target_object, subtarget_bone, target_matrix, id_properties_of_constraint):
+ return target_matrix
+
+
+'''
+ This function draws a pupblock that lets the user set
+ the values of custom settings the constraint defines.
+ This function is called when the user presses the settings button.
+ idprop: (IDProperties) wrapped data referring to this
+ constraint instance's idproperties
+'''
+def getSettings(idprop):
+ # Define user-settable parameters.
+ # Must also be defined in getSettings().
+ if not idprop.has_key('user_toggle'): idprop['user_toggle'] = 1
+ if not idprop.has_key('user_slider'): idprop['user_slider'] = 1.0
+
+ # create temporary vars for interface
+ utoggle = Draw.Create(idprop['user_toggle'])
+ uslider = Draw.Create(idprop['user_slider'])
+
+
+ # define and draw pupblock
+ block = []
+ block.append("Buttons: ")
+ block.append(("Toggle", utoggle, "This is a toggle button."))
+ block.append("More buttons: ")
+ block.append(("Slider", uslider, 0.0000001, 1000.0, "This is a number field."))
+
+ retval = Draw.PupBlock("Constraint Template", block)
+
+ # update id-property values after user changes settings
+ if (retval):
+ idprop['user_toggle']= utoggle.val
+ idprop['user_slider']= uslider.val
+
+"""
+
+new_text = bpy.data.texts.new('pyconstraint_template.py')
+new_text.write(script_data)
+bpy.data.texts.active = new_text
+Window.RedrawAll()
diff --git a/release/scripts/uv_export.py b/release/scripts/uv_export.py
index f32b5b4fc12..5977a3b76f6 100644
--- a/release/scripts/uv_export.py
+++ b/release/scripts/uv_export.py
@@ -9,7 +9,7 @@ Tooltip: 'Export the UV face layout of the selected object to a .TGA or .SVG fil
__author__ = "Martin 'theeth' Poirier"
__url__ = ("http://www.blender.org", "http://blenderartists.org/")
-__version__ = "2.4"
+__version__ = "2.5"
__bpydoc__ = """\
This script exports the UV face layout of the selected mesh object to
@@ -96,6 +96,11 @@ Notes:<br>See change logs in scripts for a list of contributors.
# Version 2.4
# Port from NMesh to Mesh by Daniel Salazar (zanqdo)
# --------------------------
+# Version 2.5
+# Fixed some old off by one rasterizing errors (didn't render points at 1.0 in the UV scale properly).
+# Fixed wire drawing for non 1 wire size (didn't wrap or stretch properly
+# and would often raise exceptions)
+# --------------------------
FullPython = False
@@ -178,12 +183,16 @@ def ExportCallback(f):
time1= Blender.sys.time()
- if obj.type != "Mesh":
+ if not obj or obj.type != "Mesh":
BPyMessages.Error_NoMeshActive()
return
-
+
+ is_editmode = Blender.Window.EditMode()
+ if is_editmode: Blender.Window.EditMode(0)
+
mesh = obj.getData(mesh=1)
if not mesh.faceUV:
+ if is_editmode: Blender.Window.EditMode(1)
BPyMessages.Error_NoMeshUvActive()
return
@@ -202,6 +211,8 @@ def ExportCallback(f):
UVFaces = ExtractUVFaces(mesh, bAllFaces.val)
+ if is_editmode: Blender.Window.EditMode(1)
+
if not bSVG.val:
print "TGA export is running..."
UV_Export_TGA(UVFaces, bSize.val, bWSize.val, bWrap.val, name)
@@ -322,7 +333,7 @@ def UV_Export_TGA(vList, size, wsize, wrap, file):
step = 0
- img = Buffer(size+1,size+1)
+ img = Buffer(size,size)
if wrap:
wrapSize = size
@@ -333,15 +344,16 @@ def UV_Export_TGA(vList, size, wsize, wrap, file):
for f in vList:
for v in f:
x = int(v[0] * size)
- maxx = max (x, maxx)
- minx = min (x, minx)
+ maxx = max (x + wsize - 1, maxx)
+ minx = min (x - wsize + 1, minx)
y = int(v[1] * size)
- maxy = max (y, maxy)
- miny = min (y, miny)
+ maxy = max (y + wsize - 1, maxy)
+ miny = min (y - wsize + 1, miny)
wrapSize = max (maxx - minx + 1, maxy - miny + 1)
scale = float (size) / float (wrapSize)
+ max_index = size - 1 # max index of the buffer (height or width)
fnum = 0
fcnt = len (vList)
@@ -361,31 +373,31 @@ def UV_Export_TGA(vList, size, wsize, wrap, file):
if step:
try:
for t in xrange(step):
- x = int(floor((co1[0] + t*(co2[0]-co1[0])/step) * size))
- y = int(floor((co1[1] + t*(co2[1]-co1[1])/step) * size))
+ x = int(floor((co1[0] + t*(co2[0]-co1[0])/step) * max_index))
+ y = int(floor((co1[1] + t*(co2[1]-co1[1])/step) * max_index))
- if wrap:
- x = x % wrapSize
- y = y % wrapSize
- else:
- x = int ((x - minx) * scale)
- y = int ((y - miny) * scale)
-
- co = x * 1 + y * 1 * size;
-
- img[co] = 0
- if wsize > 1:
- for x in range(-1*wsize + 1,wsize):
- for y in range(-1*wsize,wsize):
- img[co + 1 * x + y * 1 * size] = 0
+ for dx in range(-1*wsize + 1, wsize):
+ if wrap:
+ wx = (x + dx) % wrapSize
+ else:
+ wx = int ((x - minx + dx) * scale)
+
+ for dy in range(-1*wsize + 1, wsize):
+ if wrap:
+ wy = (y + dy) % wrapSize
+ else:
+ wy = int ((y - miny + dy) * scale)
+
+ co = wx * 1 + wy * 1 * size
+ img[co] = 0
except OverflowError:
if not extreme_warning:
print "Skipping extremely long UV edges, check your layout for excentric values"
extreme_warning = True
for v in f:
- x = int(v[0] * size)
- y = int(v[1] * size)
+ x = int(v[0] * max_index)
+ y = int(v[1] * max_index)
if wrap:
x = x % wrapSize
diff --git a/release/scripts/uv_seams_from_islands.py b/release/scripts/uv_seams_from_islands.py
index dd27aab4ce9..241f38fc4aa 100644
--- a/release/scripts/uv_seams_from_islands.py
+++ b/release/scripts/uv_seams_from_islands.py
@@ -37,7 +37,6 @@ def seams_from_islands(me):
# add seams
SEAM = Mesh.EdgeFlags.SEAM
for ed in me.edges:
- print len(set(edge_uvs[ed.key]))
if len(set(edge_uvs[ed.key])) > 1:
ed.flag |= SEAM
@@ -59,7 +58,7 @@ def main():
# editmode if its enabled, we cant make
# changes to the mesh data while in editmode.
is_editmode = Window.EditMode()
- if is_editmode: Window.EditMode(1)
+ if is_editmode: Window.EditMode(0)
Window.WaitCursor(1)
@@ -68,8 +67,10 @@ def main():
# Run the mesh editing function
seams_from_islands(me)
+ if is_editmode: Window.EditMode(1)
+
# Timing the script is a good way to be aware on any speed hits when scripting
- print 'My Script finished in %.2f seconds' % (sys.time()-t)
+ print 'UV Seams from Islands finished in %.2f seconds' % (sys.time()-t)
Window.WaitCursor(0)
diff --git a/release/scripts/uvcalc_follow_active_coords.py b/release/scripts/uvcalc_follow_active_coords.py
index c97e7168d2f..2a79d0d05df 100644
--- a/release/scripts/uvcalc_follow_active_coords.py
+++ b/release/scripts/uvcalc_follow_active_coords.py
@@ -51,6 +51,11 @@ def extend():
Draw.PupMenu('ERROR: No mesh object.')
return
+ # Toggle Edit mode
+ is_editmode = Window.EditMode()
+ if is_editmode:
+ Window.EditMode(0)
+
me = ob.getData(mesh=1)
me_verts = me.verts
@@ -233,7 +238,12 @@ def extend():
face_modes[i] = 2 # dont search again
print sys.time() - t
- me.update()
+
+ if is_editmode:
+ Window.EditMode(1)
+ else:
+ me.update()
+
Window.RedrawAll()
Window.WaitCursor(0)
diff --git a/release/scripts/uvcalc_from_adjacent.py b/release/scripts/uvcalc_from_adjacent.py
deleted file mode 100644
index 32bbd9e08e6..00000000000
--- a/release/scripts/uvcalc_from_adjacent.py
+++ /dev/null
@@ -1,129 +0,0 @@
-#!BPY
-"""
-Name: 'UVs from unselected adjacent'
-Blender: 242
-Group: 'UVCalculation'
-Tooltip: 'Assign UVs to selected faces from surrounding unselected faces.'
-"""
-__author__ = "Campbell Barton"
-__url__ = ("blender", "elysiun")
-__version__ = "1.0 2006/02/07"
-
-__bpydoc__ = """\
-This script sets the UV mapping and image of selected faces from adjacent unselected faces.
-
-Use this script in face select mode for texturing between textured faces.
-"""
-
-# ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# ***** END GPL LICENCE BLOCK *****
-# --------------------------------------------------------------------------
-
-
-from Blender import *
-import bpy
-
-def mostUsedImage(imageList): # Returns the image most used in the list.
- if not imageList:
- return None
- elif len(imageList) < 3:
- return imageList[0]
-
- # 3+ Images, Get the most used image for surrounding faces.
- imageCount = {}
- for image in imageList:
- if image:
- image_key= image.name
- else:
- image_key = None
-
- try:
- imageCount[image_key]['imageCount'] +=1 # an extra user of this image
- except:
- imageCount[image_key] = {'imageCount':1, 'blenderImage':image} # start with 1 user.
-
- # Now a list of tuples, (imageName, {imageCount, image})
- imageCount = imageCount.items()
-
- try: imageCount.sort(key=lambda a: a[1])
- except: imageCount.sort(lambda a,b: cmp(a[1], b[1]))
-
-
- return imageCount[-1][1]['blenderImage']
-
-
-def main():
- scn = bpy.data.scenes.active
- ob = scn.objects.active
- if ob == None or ob.type != 'Mesh':
- Draw.PupMenu('ERROR: No mesh object in face select mode.')
- return
- me = ob.getData(mesh=1)
-
- if not me.faceUV:
- Draw.PupMenu('ERROR: No mesh object in face select mode.')
- return
-
- selfaces = [f for f in me.faces if f.sel]
- unselfaces = [f for f in me.faces if not f.sel if not f.hide]
-
- # Gather per Vert UV and Image, store in vertUvAverage
- vertUvAverage = [[[],[]] for i in xrange(len(me.verts))]
-
- for f in unselfaces: # Unselected faces only.
- fuv = f.uv
- for i,v in enumerate(f):
- vertUvAverage[v.index][0].append(fuv[i])
- vertUvAverage[v.index][1].append(f.image)
-
- # Average per vectex UV coords
- for vertUvData in vertUvAverage:
- uvList = vertUvData[0]
- if uvList:
- # Convert from a list of vectors into 1 vector.
- vertUvData[0] = reduce(lambda a,b: a+b, uvList, Mathutils.Vector(0,0)) * (1.0/len(uvList))
- else:
- vertUvData[0] = None
-
-
-
- # Assign to selected faces
- TEX_FLAG = Mesh.FaceModes['TEX']
- for f in selfaces:
- uvlist = []
- imageList = []
- for i,v in enumerate(f):
- uv, vImages = vertUvAverage[v.index]
- uvlist.append( uv )
- imageList.extend(vImages)
-
- if None not in uvlist:
- # all the faces images used by this faces vert. some faces will be added twice but thats ok.
- # Get the most used image and assign to the face.
- image = mostUsedImage(imageList)
- f.uv = uvlist
-
- if image:
- f.image = image
- f.mode |= TEX_FLAG
- Window.RedrawAll()
-
-if __name__ == '__main__':
- main() \ No newline at end of file
diff --git a/release/scripts/uvcalc_lightmap.py b/release/scripts/uvcalc_lightmap.py
index a4269149203..af9acb09e17 100644
--- a/release/scripts/uvcalc_lightmap.py
+++ b/release/scripts/uvcalc_lightmap.py
@@ -221,7 +221,11 @@ PREF_MARGIN_DIV= 512):
else:
face_groups = []
- for me in meshes:
+ for me in meshes:
+ # Add face UV if it does not exist.
+ # All new faces are selected.
+ me.faceUV = True
+
if PREF_SEL_ONLY:
faces = [f for f in me.faces if f.sel]
else:
@@ -540,6 +544,12 @@ def main():
Draw.PupMenu('Error%t|No mesh objects selected.')
return
+ # Toggle Edit mode
+ is_editmode = Window.EditMode()
+ if is_editmode:
+ Window.EditMode(0)
+
+
Window.WaitCursor(1)
lightmap_uvpack(meshes,\
PREF_SEL_ONLY.val,\
@@ -550,6 +560,9 @@ def main():
PREF_BOX_DIV.val,\
int(1/(PREF_MARGIN_DIV.val/100)))
+ if is_editmode:
+ Window.EditMode(1)
+
Window.WaitCursor(0)
if __name__ == '__main__':
diff --git a/release/scripts/uvcalc_quad_clickproj.py b/release/scripts/uvcalc_quad_clickproj.py
index 67b58885f9d..791fd661cc9 100644
--- a/release/scripts/uvcalc_quad_clickproj.py
+++ b/release/scripts/uvcalc_quad_clickproj.py
@@ -80,6 +80,10 @@ def main():
if not ob or ob.type!='Mesh':
return
+ is_editmode = Window.EditMode()
+ if is_editmode:
+ Window.EditMode(0)
+
mousedown_wait() # so the menu items clicking dosnt trigger the mouseclick
Window.DrawProgressBar (0.0, '')
@@ -100,10 +104,8 @@ def main():
mouse_buttons = Window.GetMouseButtons()
-
Window.DrawProgressBar (0.2, '(2 of 3 ) Click confirms the U coords')
-
mousedown_wait()
obmat= ob.matrixWorld
@@ -112,7 +114,7 @@ def main():
if not mouseInView or not OriginA:
return
-
+
me = ob.getData(mesh=1)
# Get the face under the mouse
@@ -255,6 +257,9 @@ def main():
Window.Redraw(Window.Types.VIEW3D)
Window.SetCursorPos(*orig_cursor)
+ if is_editmode:
+ Window.EditMode(1)
+
Window.RedrawAll()
if __name__=='__main__':
diff --git a/release/scripts/uvcalc_smart_project.py b/release/scripts/uvcalc_smart_project.py
index b10b69285e0..49d52d12d47 100644
--- a/release/scripts/uvcalc_smart_project.py
+++ b/release/scripts/uvcalc_smart_project.py
@@ -1121,6 +1121,9 @@ def main():
print "Smart Projection time: %.2f" % (sys.time() - time1)
# Window.DrawProgressBar(0.9, "Smart Projections done, time: %.2f sec." % (sys.time() - time1))
+ if is_editmode:
+ Window.EditMode(1)
+
Window.DrawProgressBar(1.0, "")
Window.WaitCursor(0)
Window.RedrawAll()
diff --git a/release/scripts/vertexpaint_gradient.py b/release/scripts/vertexpaint_gradient.py
index d0b7de329df..d0b7de329df 100755..100644
--- a/release/scripts/vertexpaint_gradient.py
+++ b/release/scripts/vertexpaint_gradient.py
diff --git a/release/scripts/vertexpaint_selfshadow_ao.py b/release/scripts/vertexpaint_selfshadow_ao.py
index c083bc9e8b0..7a6f4f9176d 100644
--- a/release/scripts/vertexpaint_selfshadow_ao.py
+++ b/release/scripts/vertexpaint_selfshadow_ao.py
@@ -39,6 +39,7 @@ and optionaly blur the shading to remove artifacts from spesific edges.
# --------------------------------------------------------------------------
from Blender import Scene, Draw, sys, Window, Mathutils, Mesh
+import bpy
import BPyMesh
@@ -135,10 +136,10 @@ def vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PRE
Window.WaitCursor(0)
def main():
- scn= Scene.GetCurrent()
- ob= scn.getActiveObject()
+ sce= bpy.data.scenes.active
+ ob= sce.objects.active
- if not ob or ob.getType() != 'Mesh':
+ if not ob or ob.type != 'Mesh':
Draw.PupMenu('Error, no active mesh object, aborting.')
return
@@ -174,8 +175,8 @@ def main():
PREF_SHADOW_ONLY= PREF_SHADOW_ONLY.val
PREF_SEL_ONLY= PREF_SEL_ONLY.val
- if not me.faceUV:
- me.faceUV= 1
+ if not me.vertexColors:
+ me.vertexColors= 1
t= sys.time()
vertexFakeAO(me, PREF_BLUR_ITERATIONS, PREF_BLUR_RADIUS, PREF_MIN_EDLEN, PREF_CLAMP_CONCAVE, PREF_CLAMP_CONVEX, PREF_SHADOW_ONLY, PREF_SEL_ONLY)
diff --git a/release/scripts/vrml97_export.py b/release/scripts/vrml97_export.py
index b5afacbe272..57ffd243bfc 100644
--- a/release/scripts/vrml97_export.py
+++ b/release/scripts/vrml97_export.py
@@ -656,10 +656,10 @@ class VRML2Export:
self.writeMaterial(mater, self.cleanStr(mater.name,''))
if (mater.mode & Blender.Material.Modes['TEXFACE']):
if image != None:
- self.writeImageTexture(image.name)
+ self.writeImageTexture(image.name, image.filename)
else:
if image != None:
- self.writeImageTexture(image.name)
+ self.writeImageTexture(image.name, image.filename)
self.writeIndented("}\n", -1)
@@ -837,7 +837,7 @@ class VRML2Export:
self.writeIndented("transparency %s\n" % (round(transp,self.cp)))
self.writeIndented("}\n",-1)
- def writeImageTexture(self, name):
+ def writeImageTexture(self, name, filename):
if self.texNames.has_key(name):
self.writeIndented("texture USE %s\n" % self.cleanStr(name))
self.texNames[name] += 1
@@ -846,7 +846,7 @@ class VRML2Export:
self.writeIndented("texture DEF %s ImageTexture {\n" % \
self.cleanStr(name), 1)
self.writeIndented('url "%s"\n' % \
- name.split("\\")[-1].split("/")[-1])
+ filename.split("\\")[-1].split("/")[-1])
self.writeIndented("}\n",-1)
self.texNames[name] = 1
diff --git a/release/scripts/weightpaint_average.py b/release/scripts/weightpaint_average.py
new file mode 100644
index 00000000000..4e8830256b2
--- /dev/null
+++ b/release/scripts/weightpaint_average.py
@@ -0,0 +1,121 @@
+#!BPY
+"""
+Name: 'Vertex Groups Island Average'
+Blender: 243
+Group: 'WeightPaint'
+Tooltip: 'Average the vertex weights for each connected set of verts'
+"""
+
+# --------------------------------------------------------------------------
+# ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+# --------------------------------------------------------------------------
+import Blender
+from Blender import Scene, Mesh, Window, sys, Draw
+from BPyMesh import meshWeight2List, list2MeshWeight, mesh2linkedFaces
+
+import BPyMessages
+import bpy
+
+def faceGroups2VertSets(face_groups):
+ ''' Return the face groups as sets of vert indicies '''
+ return [set([v.index for f in fg for v in f]) for fg in face_groups]
+
+
+def vgroup_average(ob_orig, me, sce, PREF_ALL_VGROUPS=True):
+ if not me.getVertGroupNames():
+ return
+
+ weight_names, weight_list = meshWeight2List(me)
+
+ weight_names_len = len(weight_names)
+ vgroup_dummy = [0.0] * weight_names_len
+ vgroup_range = range(weight_names_len)
+
+ if not PREF_ALL_VGROUPS:
+ weight_active_index = weight_names.index(me.activeGroup)
+
+ for vert_set in faceGroups2VertSets( mesh2linkedFaces(me) ):
+ if not vert_set:
+ continue
+
+
+ if PREF_ALL_VGROUPS:
+ # We need to average the vgroups
+ collected_group = vgroup_dummy[:]
+ for i in vert_set:
+ vert_group = weight_list[i] # get the original weight
+ weight_list[i] = collected_group # replace with the collected group
+
+ for j in vgroup_range: # iter through the vgroups
+ collected_group[j] += vert_group[j]
+
+ for j in vgroup_range:
+ collected_group[j] /= len(vert_set)
+ else:
+ # Active group only
+ vert_weight = 0.0
+ for i in vert_set:
+ vert_weight += weight_list[i][weight_active_index]
+
+ vert_weight /= len(vert_set)
+
+ for i in vert_set:
+ weight_list[i][weight_active_index] = vert_weight
+
+ list2MeshWeight(me, weight_names, weight_list)
+
+def main():
+
+ # Gets the current scene, there can be many scenes in 1 blend file.
+ sce = bpy.data.scenes.active
+
+ # Get the active object, there can only ever be 1
+ # and the active object is always the editmode object.
+ ob_act = sce.objects.active
+
+ if not ob_act or ob_act.type != 'Mesh':
+ BPyMessages.Error_NoMeshActive()
+ return
+
+ # Saves the editmode state and go's out of
+ # editmode if its enabled, we cant make
+ # changes to the mesh data while in editmode.
+ is_editmode = Window.EditMode()
+ Window.EditMode(0)
+
+ PREF_ALL_VGROUPS = Draw.PupMenu("All Groups?%t|All Groups%x1|Active Group Only%x0")
+ if PREF_ALL_VGROUPS==-1:
+ return
+
+ Window.WaitCursor(1)
+ me = ob_act.getData(mesh=1) # old NMesh api is default
+ t = sys.time()
+
+ # Run the mesh editing function
+ vgroup_average(ob_act, me, sce, PREF_ALL_VGROUPS)
+
+ # Timing the script is a good way to be aware on any speed hits when scripting
+ print 'Average VGroups in %.2f seconds' % (sys.time()-t)
+ Window.WaitCursor(0)
+ if is_editmode: Window.EditMode(1)
+
+
+# This lets you can import the script without running it
+if __name__ == '__main__':
+ main() \ No newline at end of file
diff --git a/release/scripts/weightpaint_gradient.py b/release/scripts/weightpaint_gradient.py
index a2bff999610..a2bff999610 100755..100644
--- a/release/scripts/weightpaint_gradient.py
+++ b/release/scripts/weightpaint_gradient.py
diff --git a/release/scripts/weightpaint_invert.py b/release/scripts/weightpaint_invert.py
new file mode 100644
index 00000000000..cdae83a9d50
--- /dev/null
+++ b/release/scripts/weightpaint_invert.py
@@ -0,0 +1,95 @@
+#!BPY
+"""
+Name: 'Invert Active Group'
+Blender: 245
+Group: 'WeightPaint'
+Tooltip: 'Invert the active vertex group'
+"""
+
+# --------------------------------------------------------------------------
+# ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+# --------------------------------------------------------------------------
+import Blender
+from Blender import Scene, Mesh, Window, sys
+
+import BPyMessages
+import bpy
+
+def vgroup_invert(ob_orig, me):
+ if not me.getVertGroupNames():
+ return
+ group_act = me.activeGroup
+ if group_act == None:
+ return
+
+ group_data = me.getVertsFromGroup(group_act, 1)
+
+ weights= [1.0] * len(me.verts) # 1.0 - initialize inverted
+
+ group_data = me.getVertsFromGroup(group_act, 1) # (i,w) tuples.
+
+ me.removeVertGroup(group_act) # messes up the active group.
+ for i,w in group_data:
+ weights[i] = 1.0-w
+
+ me.addVertGroup(group_act)
+
+ rep = Blender.Mesh.AssignModes.REPLACE
+ vertList= [None]
+ for i,weight in enumerate(weights):
+ vertList[0] = i
+ me.assignVertsToGroup(group_act, vertList, weight, rep)
+
+ me.activeGroup = group_act
+ me.update()
+
+def main():
+
+ # Gets the current scene, there can be many scenes in 1 blend file.
+ sce = bpy.data.scenes.active
+
+ # Get the active object, there can only ever be 1
+ # and the active object is always the editmode object.
+ ob_act = sce.objects.active
+
+ if not ob_act or ob_act.type != 'Mesh':
+ BPyMessages.Error_NoMeshActive()
+ return
+
+ # Saves the editmode state and go's out of
+ # editmode if its enabled, we cant make
+ # changes to the mesh data while in editmode.
+ is_editmode = Window.EditMode()
+ Window.EditMode(0)
+
+ Window.WaitCursor(1)
+ me = ob_act.getData(mesh=1) # old NMesh api is default
+ t = sys.time()
+
+ # Run the mesh editing function
+ vgroup_invert(ob_act, me)
+
+ # Timing the script is a good way to be aware on any speed hits when scripting
+ print 'Invert VGroup in %.2f seconds' % (sys.time()-t)
+ Window.WaitCursor(0)
+ if is_editmode: Window.EditMode(1)
+
+# This lets you can import the script without running it
+if __name__ == '__main__':
+ main() \ No newline at end of file
diff --git a/release/scripts/weightpaint_normalize.py b/release/scripts/weightpaint_normalize.py
index 204868a79fc..1f6c3d201aa 100644
--- a/release/scripts/weightpaint_normalize.py
+++ b/release/scripts/weightpaint_normalize.py
@@ -40,54 +40,100 @@ proportion of the veighting is unchanged.
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------
-from Blender import Scene, Draw
+from Blender import Scene, Draw, Object, Modifier
import BPyMesh
SMALL_NUM= 0.000001
-def actWeightNormalize(me, PREF_PEAKWEIGHT, PREF_KEEP_PROPORTION):
+
+def getArmatureGroups(ob, me):
+
+ arm_obs = []
+
+ arm = ob.parent
+ if arm and arm.type == 'Armature' and ob.parentType == Object.ParentTypes.ARMATURE:
+ arm_obs.append(arm)
+
+ for m in ob.modifiers:
+ if m.type== Modifier.Types.ARMATURE:
+ arm = m[Modifier.Settings.OBJECT]
+ if arm:
+ arm_obs.append(arm)
+
+ # convert to a dict and back, should be a set! :/ - python 2.3 dosnt like.
+ return dict([ (bonename, None) for arm in arm_obs for bonename in arm.data.bones.keys() ]).keys()
+
+
+
+def actWeightNormalize(me, ob, PREF_PEAKWEIGHT, PREF_ACTIVE_ONLY, PREF_ARMATURE_ONLY, PREF_KEEP_PROPORTION):
groupNames, vWeightDict= BPyMesh.meshWeight2Dict(me)
new_weight= max_weight= -1.0
act_group= me.activeGroup
- vWeightDictUsed=[False] * len(vWeightDict)
-
- for i, wd in enumerate(vWeightDict):
- try:
- new_weight= wd[act_group]
- if new_weight > max_weight:
- max_weight= new_weight
- vWeightDictUsed[i]=wd
- except:
- pass
-
- if max_weight < SMALL_NUM or new_weight == -1:
- Draw.PupMenu('No verts to normalize. exiting.')
- return
+ if PREF_ACTIVE_ONLY:
+ normalizeGroups = [act_group]
+ else:
+ normalizeGroups = groupNames[:]
- if abs(max_weight-PREF_PEAKWEIGHT) < SMALL_NUM:
- Draw.PupMenu('Vert Weights are alredy normalized.')
- return
+ if PREF_ARMATURE_ONLY:
+
+ armature_groups = getArmatureGroups(ob, me)
+
+ i = len(normalizeGroups)
+ while i:
+ i-=1
+ if not normalizeGroups[i] in armature_groups:
+ del normalizeGroups[i]
- max_weight= max_weight/PREF_PEAKWEIGHT
- if PREF_KEEP_PROPORTION:
- # TODO, PROPORTIONAL WEIGHT SCALING.
- for wd in vWeightDictUsed:
- if wd: # not false.
- if len(wd) == 1:
- # Only 1 group for thsi vert. Simple
- wd[act_group] /= max_weight
- else:
- # More then 1 group. will need to scale all users evenly.
- local_maxweight= max(wd.itervalues()) / PREF_PEAKWEIGHT
- for weight in wd.iterkeys():
- wd[weight] /= local_maxweight
-
+ for act_group in normalizeGroups:
+ vWeightDictUsed=[False] * len(vWeightDict)
+
+ for i, wd in enumerate(vWeightDict):
+ try:
+ new_weight= wd[act_group]
+ if new_weight > max_weight:
+ max_weight= new_weight
+ vWeightDictUsed[i]=wd
+ except:
+ pass
- else: # Simple, just scale the weights up.
- for wd in vWeightDictUsed:
- if wd: # not false.
- wd[act_group] /= max_weight
+ # These can be skipped for now, they complicate things when using multiple vgroups,
+ '''
+ if max_weight < SMALL_NUM or new_weight == -1:
+ Draw.PupMenu('No verts to normalize. exiting.')
+ #return
+
+ if abs(max_weight-PREF_PEAKWEIGHT) < SMALL_NUM:
+ Draw.PupMenu('Vert Weights are alredy normalized.')
+ #return
+ '''
+ max_weight= max_weight/PREF_PEAKWEIGHT
+
+ if PREF_KEEP_PROPORTION:
+ # TODO, PROPORTIONAL WEIGHT SCALING.
+ for wd in vWeightDictUsed:
+ if wd: # not false.
+ if len(wd) == 1:
+ # Only 1 group for thsi vert. Simple
+ wd[act_group] /= max_weight
+ else:
+ # More then 1 group. will need to scale all users evenly.
+ if PREF_ARMATURE_ONLY:
+ local_maxweight= max([v for k, v in wd.iteritems() if k in armature_groups]) / PREF_PEAKWEIGHT
+ if local_maxweight > 0.0:
+ # So groups that are not used in any bones are ignored.
+ for weight in wd.iterkeys():
+ if weight in armature_groups:
+ wd[weight] /= local_maxweight
+ else:
+ local_maxweight= max(wd.itervalues()) / PREF_PEAKWEIGHT
+ for weight in wd.iterkeys():
+ wd[weight] /= local_maxweight
+
+ else: # Simple, just scale the weights up. we alredy know this is in an armature group (if needed)
+ for wd in vWeightDictUsed:
+ if wd: # not false.
+ wd[act_group] /= max_weight
# Copy weights back to the mesh.
BPyMesh.dict2MeshWeight(me, groupNames, vWeightDict)
@@ -104,17 +150,21 @@ def main():
me= ob.getData(mesh=1)
PREF_PEAKWEIGHT= Draw.Create(1.0)
+ PREF_ACTIVE_ONLY= Draw.Create(1)
PREF_KEEP_PROPORTION= Draw.Create(1)
+ PREF_ARMATURE_ONLY= Draw.Create(0)
pup_block= [\
('Peak Weight:', PREF_PEAKWEIGHT, 0.01, 1.0, 'Upper weight for normalizing.'),\
+ ('Active Only', PREF_ACTIVE_ONLY, 'Only Normalize groups that have matching bones in an armature (when an armature is used).'),\
('Proportional', PREF_KEEP_PROPORTION, 'Scale other weights so verts (Keep weights with other groups in proportion).'),\
+ ('Armature Only', PREF_ARMATURE_ONLY, 'Only Normalize groups that have matching bones in an armature (when an armature is used).'),\
]
if not Draw.PupBlock('Clean Selected Meshes...', pup_block):
return
- actWeightNormalize(me, PREF_PEAKWEIGHT.val, PREF_KEEP_PROPORTION.val)
+ actWeightNormalize(me, ob, PREF_PEAKWEIGHT.val, PREF_ACTIVE_ONLY.val, PREF_ARMATURE_ONLY.val, PREF_KEEP_PROPORTION.val)
if __name__=='__main__':
main() \ No newline at end of file
diff --git a/release/scripts/wizard_curve2tree.py b/release/scripts/wizard_curve2tree.py
new file mode 100644
index 00000000000..497597262a8
--- /dev/null
+++ b/release/scripts/wizard_curve2tree.py
@@ -0,0 +1,3879 @@
+#!BPY
+"""
+Name: 'Tree from Curves'
+Blender: 245
+Group: 'Wizards'
+Tip: 'Generate trees from curve shapes'
+"""
+
+__author__ = "Campbell Barton"
+__url__ = ['www.blender.org', 'blenderartists.org']
+__version__ = "0.1"
+
+__bpydoc__ = """\
+
+"""
+
+# --------------------------------------------------------------------------
+# Tree from Curves v0.1 by Campbell Barton (AKA Ideasman42)
+# --------------------------------------------------------------------------
+# ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+# --------------------------------------------------------------------------
+
+import bpy
+import Blender
+import BPyMesh
+from Blender.Mathutils import Vector, Matrix, CrossVecs, AngleBetweenVecs, LineIntersect, TranslationMatrix, ScaleMatrix, RotationMatrix, Rand
+from Blender.Geometry import ClosestPointOnLine
+
+GLOBALS = {}
+GLOBALS['non_bez_error'] = 0
+
+# Copied from blender, we could wrap this! - BKE_curve.c
+# But probably not toooo bad in python
+def forward_diff_bezier(q0, q1, q2, q3, pointlist, steps, axis):
+ f= float(steps)
+ rt0= q0
+ rt1= 3.0*(q1-q0)/f
+ f*= f
+ rt2= 3.0*(q0-2.0*q1+q2)/f
+ f*= steps
+ rt3= (q3-q0+3.0*(q1-q2))/f
+
+ q0= rt0
+ q1= rt1+rt2+rt3
+ q2= 2*rt2+6*rt3
+ q3= 6*rt3
+ if axis == None:
+ for a in xrange(steps+1):
+ pointlist[a] = q0
+ q0+= q1
+ q1+= q2
+ q2+= q3;
+
+ else:
+ for a in xrange(steps+1):
+ pointlist[a][axis] = q0
+ q0+= q1
+ q1+= q2
+ q2+= q3;
+
+def points_from_bezier_seg(steps, pointlist, radlist, bez1_vec, bez2_vec, radius1, radius2):
+
+ # x,y,z,axis
+ for ii in (0,1,2):
+ forward_diff_bezier(bez1_vec[1][ii], bez1_vec[2][ii], bez2_vec[0][ii], bez2_vec[1][ii], pointlist, steps, ii)
+
+ # radius - no axis, Copied from blenders BBone roll interpolation.
+ forward_diff_bezier(radius1, radius1 + 0.390464*(radius2-radius1), radius2 - 0.390464*(radius2-radius1), radius2, radlist, steps, None)
+
+
+def debug_pt(co):
+ Blender.Window.SetCursorPos(tuple(co))
+ Blender.Window.RedrawAll()
+ print 'debugging', co
+
+def freshMesh(mesh):
+ '''
+ Utility function to get a new mesh or clear the existing one, but dont clear everything.
+ '''
+ if mesh:
+ materials = mesh.materials
+ mesh.verts = None
+ for group in mesh.getVertGroupNames():
+ mesh.removeVertGroup(group)
+
+ # Add materials back
+ mesh.materials = materials
+ else:
+ mesh = bpy.data.meshes.new()
+
+ return mesh
+
+def getObFromName(name):
+ if name:
+ try: return bpy.data.objects[name]
+ except: return None
+ else:
+ return None
+
+def getGroupFromName(name):
+ if name:
+ try: return bpy.data.groups[name]
+ except: return None
+ else:
+ return None
+
+def closestVecIndex(vec, vecls):
+ best= -1
+ best_dist = 100000000
+ for i, vec_test in enumerate(vecls):
+ # Dont use yet, we may want to tho
+ if vec_test: # Seems odd, but use this so we can disable some verts in the list.
+ dist = (vec-vec_test).length
+ if dist < best_dist:
+ best = i
+ best_dist = dist
+
+ return best
+
+IRATIONAL_NUM = 22.0/7.0
+def next_random_num(rnd):
+ '''
+ return a random number between 0.0 and 1.0
+ '''
+ rnd[0] += (rnd[0] * IRATIONAL_NUM) % 1
+ # prevent
+ if rnd[0] > 1000000:
+ rnd[0]-=1000000
+ return rnd[0] % 1
+
+eul = 0.00001
+
+class tree:
+ def __init__(self):
+ self.branches_all = []
+ self.branches_root = []
+ self.branches_twigs = []
+ self.mesh = None
+ self.armature = None
+ self.objectCurve = None
+ self.objectCurveMat = None
+ self.objectCurveIMat = None
+
+ self.objectTwigBounds = None # use for twigs only at the moment.
+ self.objectTwigBoundsIMat = None
+ self.objectTwigBoundsMesh = None
+
+ self.objectLeafBounds = None
+ self.objectLeafBoundsIMat = None
+ self.objectLeafBoundsMesh = None
+
+ self.limbScale = 1.0
+
+ self.debug_objects = []
+ self.steps = 6 # defalt, curve overwrites
+
+ def __repr__(self):
+ s = ''
+ s += '[Tree]'
+ s += ' limbScale: %.6f' % self.limbScale
+ s += ' object: %s' % self.objectCurve
+
+ for brch in self.branches_root:
+ s += str(brch)
+ return s
+
+ def fromCurve(self, objectCurve):
+ # Now calculate the normals
+ self.objectCurve = objectCurve
+ self.objectCurveMat = objectCurve.matrixWorld
+ self.objectCurveIMat = self.objectCurveMat.copy().invert()
+ curve = objectCurve.data
+ self.steps = curve.resolu # curve resolution
+
+ # Set the curve object scale
+ if curve.bevob:
+ # A bit of a hack to guess the size of the curve object if you have one.
+ bb = curve.bevob.boundingBox
+ # self.limbScale = (bb[0] - bb[7]).length / 2.825 # THIS IS GOOD WHEN NON SUBSURRFED
+ self.limbScale = (bb[0] - bb[7]).length / 1.8
+ elif curve.ext2 != 0.0:
+ self.limbScale = curve.ext2 * 1.5
+
+ # forward_diff_bezier will fill in the blanks
+ # nice we can reuse these for every curve segment :)
+ pointlist = [[None, None, None] for i in xrange(self.steps+1)]
+ radlist = [ None for i in xrange(self.steps+1) ]
+
+
+ for spline in curve:
+
+ if len(spline) < 2: # Ignore single point splines
+ continue
+
+ if spline.type != 1: # 0 poly, 1 bez, 4 nurbs
+ GLOBALS['non_bez_error'] = 1
+ continue
+
+
+ brch = branch()
+ self.branches_all.append(brch)
+
+ bez_list = list(spline)
+ for i in xrange(1, len(bez_list)):
+ bez1 = bez_list[i-1]
+ bez2 = bez_list[i]
+ points_from_bezier_seg(self.steps, pointlist, radlist, bez1.vec, bez2.vec, bez1.radius, bez2.radius)
+ bpoints = [ bpoint(brch, Vector(pointlist[ii]), Vector(), radlist[ii] * self.limbScale) for ii in xrange(len(pointlist)) ]
+
+ # remove endpoint for all but the last
+ if i != len(bez_list)-1:
+ bpoints.pop()
+
+ brch.bpoints.extend(bpoints)
+
+ # Finalize once point data is there
+ brch.calcData()
+
+ # Sort from big to small, so big branches get priority
+ self.branches_all.sort( key = lambda brch: -brch.bpoints[0].radius )
+
+
+ def closestBranchPt(self, co):
+ best_brch = None
+ best_pt = None
+ best_dist = 10000000000
+ for brch in self.branches_all:
+ for pt in brch.bpoints:
+ # if pt.inTwigBounds: # only find twigs, give different results for leaves
+ l = (pt.co-co).length
+ if l < best_dist:
+ best_dist = l
+ best_brch = brch
+ best_pt = pt
+ return best_brch, best_pt
+
+ def setTwigBounds(self, objectMesh):
+ self.objectTwigBounds = objectMesh
+ self.objectTwigBoundsMesh = objectMesh.getData(mesh=1)
+ self.objectTwigBoundsIMat = objectMesh.matrixWorld.copy().invert()
+
+ for brch in self.branches_all:
+ brch.calcTwigBounds(self)
+
+ def setLeafBounds(self, objectMesh):
+ self.objectLeafBounds = objectMesh
+ self.objectLeafBoundsMesh = objectMesh.getData(mesh=1)
+ self.objectLeafBoundsIMat = objectMesh.matrixWorld.copy().invert()
+
+ def isPointInTwigBounds(self, co, selected_only=False):
+ return self.objectTwigBoundsMesh.pointInside(co * self.objectCurveMat * self.objectTwigBoundsIMat, selected_only)
+
+ def isPointInLeafBounds(self, co, selected_only=False):
+ return self.objectLeafBoundsMesh.pointInside(co * self.objectCurveMat * self.objectLeafBoundsIMat, selected_only)
+
+ def resetTags(self, value):
+ for brch in self.branches_all:
+ brch.tag = value
+
+ def buildConnections( self,\
+ sloppy = 1.0,\
+ connect_base_trim = 1.0,\
+ do_twigs = False,\
+ twig_ratio = 2.0,\
+ twig_select_mode = 0,\
+ twig_select_factor = 0.5,\
+ twig_scale = 0.8,\
+ twig_scale_width = 1.0,\
+ twig_random_orientation = 180,\
+ twig_random_angle = 33,\
+ twig_recursive=True,\
+ twig_recursive_limit=3,\
+ twig_ob_bounds=None,\
+ twig_ob_bounds_prune=True,\
+ twig_ob_bounds_prune_taper=1.0,\
+ twig_placement_maxradius=10.0,\
+ twig_placement_maxtwig=0,\
+ twig_follow_parent=0.0,\
+ twig_follow_x=0.0,\
+ twig_follow_y=0.0,\
+ twig_follow_z=0.0,\
+ do_variation = 0,\
+ variation_seed = 1,\
+ variation_orientation = 0.0,\
+ variation_scale = 0.0,\
+ do_twigs_fill = 0,\
+ twig_fill_levels=4,\
+ twig_fill_rand_scale=0.0,\
+ twig_fill_fork_angle_max=60.0,\
+ twig_fill_radius_min=0.1,\
+ twig_fill_radius_factor=0.75,\
+ twig_fill_shape_type=0,\
+ twig_fill_shape_rand=0.0,\
+ twig_fill_shape_power=0.3,\
+ ):
+ '''
+ build tree data - fromCurve must run first
+ '''
+
+
+ # Sort the branchs by the first radius, so big branchs get joins first
+ ### self.branches_all.sort( key = lambda brch: brch.bpoints[0].radius )
+
+ #self.branches_all.reverse()
+
+ # Connect branches
+ for i in xrange(len(self.branches_all)):
+ brch_i = self.branches_all[i]
+
+ for j in xrange(len(self.branches_all)):
+ if i != j:
+ # See if any of the points match this branch
+ # see if Branch 'i' is the child of branch 'j'
+
+ brch_j = self.branches_all[j]
+
+ if not brch_j.inParentChain(brch_i): # So we dont make cyclic tree!
+
+ pt_best_j, dist = brch_j.findClosest(brch_i.bpoints[0].co)
+
+ # Check its in range, allow for a bit out - hense the sloppy
+ if dist < pt_best_j.radius * sloppy:
+ brch_i.parent_pt = pt_best_j
+ pt_best_j.childCount += 1 # dont remove me
+
+ brch_i.baseTrim(connect_base_trim)
+
+ '''
+ if pt_best_j.childCount>4:
+ raise "ERROR"
+ '''
+
+ # addas a member of best_j.children later when we have the geometry info available.
+
+ #### print "Found Connection!!!", i, j
+ break # go onto the next branch
+
+ """
+ children = [brch_child for brch_child in pt.children]
+ if children:
+ # This pt is one side of the segment, pt.next joins this segment.
+ # calculate the median point the 2 segments would spanal
+ # Once this is done we need to adjust 2 things
+ # 1) move both segments up/down so they match the branches best.
+ # 2) set the spacing of the segments around the point.
+
+
+ # First try to get the ideal some space around each joint
+ # the spacing shoule be an average of
+ for brch.bpoints:
+ """
+
+ '''
+ for brch in self.branches_all:
+ brch.checkPointList()
+ '''
+
+ # Variations - use for making multiple versions of the same tree.
+ if do_variation:
+ irational_num = 22.0/7.0 # use to make the random number more odd
+ rnd = [variation_seed]
+
+ # Add children temporarily
+ for brch in self.branches_all:
+ if brch.parent_pt:
+ rnd_rot = ((next_random_num(rnd) * variation_orientation) - 0.5) * 720
+ mat_orientation = RotationMatrix(rnd_rot, 3, 'r', brch.parent_pt.no)
+ rnd_sca = 1 + ((next_random_num(rnd)-0.5)* variation_scale )
+ mat_scale = Matrix([rnd_sca,0,0],[0,rnd_sca,0],[0,0,rnd_sca])
+ # mat_orientation = RotationMatrix(0, 3, 'r', brch.parent_pt.no)
+ brch.transformRecursive(self, mat_scale * mat_orientation, brch.parent_pt.co)
+
+ if (do_twigs or do_twigs_fill) and twig_ob_bounds: # Only spawn twigs inside this mesh
+ self.setTwigBounds(twig_ob_bounds)
+
+ # Important we so this with existing parent/child but before connecting and calculating verts.
+ if do_twigs:
+
+ # scale values down
+ twig_random_orientation= twig_random_orientation/360.0
+ twig_random_angle= twig_random_angle/360.0
+
+ irational_num = 22.0/7.0 # use to make the random number more odd
+
+ if not twig_recursive:
+ twig_recursive_limit = 0
+
+ self.buildTwigs(twig_ratio, twig_select_mode, twig_select_factor)
+
+ branches_twig_attached = []
+
+ # This wont add all! :/
+ brch_twig_index = 0
+ brch_twig_index_LAST = -1 # use this to prevent in inf loop, since its possible we cant place every branch
+ while brch_twig_index < len(self.branches_twigs) and brch_twig_index_LAST != brch_twig_index:
+ ###print "While"
+ ### print brch_twig_index, len(self.branches_twigs) # if this dosnt change, quit the while
+
+ brch_twig_index_LAST = brch_twig_index
+
+ # new twigs have been added, recalculate
+ branches_twig_sort = [brch.bestTwigSegment() for brch in self.branches_all]
+ branches_twig_sort.sort() # this will sort the branches with best braches for adding twigs to at the start of the list
+
+ for tmp_sortval, twig_pt_index, brch_parent in branches_twig_sort: # tmp_sortval is not used.
+ if twig_pt_index != -1 and \
+ (twig_recursive_limit == 0 or brch_parent.generation < twig_recursive_limit) and \
+ (twig_placement_maxtwig == 0 or brch_parent.twig_count < twig_placement_maxtwig) and \
+ brch_parent.bpoints[twig_pt_index].radius < twig_placement_maxradius:
+
+ if brch_twig_index >= len(self.branches_twigs):
+ break
+
+ brch_twig = self.branches_twigs[brch_twig_index]
+ parent_pt = brch_parent.bpoints[twig_pt_index]
+
+ brch_twig.parent_pt = parent_pt
+ parent_pt.childCount += 1
+
+ # Scale this twig using this way...
+ # The size of the parent, scaled by the parent point's radius,
+ # ...compared to the parent branch;s root point radius.
+ # Also take into account the length of the parent branch
+ # Use this for pretend random numbers too.
+ scale = twig_scale * (parent_pt.branch.bpoints[0].radius / brch_twig.bpoints[0].radius) * (parent_pt.radius / parent_pt.branch.bpoints[0].radius)
+
+ # Random orientation
+ # THIS IS NOT RANDOM - Dont be real random so we can always get re-produceale results.
+ if twig_random_orientation: rnd1 = (((irational_num * scale * 10000000) % 360) - 180) * twig_random_orientation
+ else: rnd1 = 0.0
+ if twig_random_angle: rnd2 = (((irational_num * scale * 66666666) % 360) - 180) * twig_random_angle
+ else: rnd2 = 0.0
+
+ # Align this with the existing branch
+ angle = AngleBetweenVecs(zup, parent_pt.no)
+ cross = CrossVecs(zup, parent_pt.no)
+ mat_align = RotationMatrix(angle, 3, 'r', cross)
+
+ # Use the bend on the point to work out which way to make the branch point!
+ if parent_pt.prev: cross = CrossVecs(parent_pt.no, parent_pt.prev.no - parent_pt.no)
+ else: cross = CrossVecs(parent_pt.no, parent_pt.next.no - parent_pt.no)
+
+ if parent_pt.branch.parent_pt:
+ angle = AngleBetweenVecs(parent_pt.branch.parent_pt.no, parent_pt.no)
+ else:
+ # Should add a UI for this... only happens when twigs come off a root branch
+ angle = 66
+
+ mat_branch_angle = RotationMatrix(angle+rnd1, 3, 'r', cross)
+ mat_scale = Matrix([scale,0,0],[0,scale,0],[0,0,scale])
+
+ mat_orientation = RotationMatrix(rnd2, 3, 'r', parent_pt.no)
+
+ if twig_scale_width != 1.0:
+ # adjust length - no radius adjusting
+ for pt in brch_twig.bpoints:
+ pt.radius *= twig_scale_width
+
+ brch_twig.transform(mat_scale * mat_branch_angle * mat_align * mat_orientation, parent_pt.co)
+
+ # Follow the parent normal
+ if twig_follow_parent or twig_follow_x or twig_follow_y or twig_follow_z:
+
+ vecs = []
+ brch_twig_len = float(len(brch_twig.bpoints))
+
+ if twig_follow_parent:
+ no = parent_pt.no.copy() * twig_follow_parent
+ else:
+ no = Vector()
+
+ no.x += twig_follow_x
+ no.y += twig_follow_y
+ no.z += twig_follow_z
+
+ for i, pt in enumerate(brch_twig.bpoints):
+ if pt.prev:
+ fac = i / brch_twig_len
+
+ # Scale this value
+ fac_inv = 1-fac
+
+ no_orig = pt.co - pt.prev.co
+ len_orig = no_orig.length
+
+ no_new = (fac_inv * no_orig) + (fac * no)
+ no_new.length = len_orig
+
+ # Mix the 2 normals
+ vecs.append(no_new)
+
+ # Apply the coords
+ for i, pt in enumerate(brch_twig.bpoints):
+ if pt.prev:
+ pt.co = pt.prev.co + vecs[i-1]
+
+ brch_twig.calcPointExtras()
+
+
+ # When using a bounding mesh, clip and calculate points in bounds.
+ #print "Attempting to trim base"
+ brch_twig.baseTrim(connect_base_trim)
+
+ if twig_ob_bounds and (twig_ob_bounds_prune or twig_recursive):
+ brch_twig.calcTwigBounds(self)
+
+ # we would not have been but here if the bounds were outside
+ if twig_ob_bounds_prune:
+ brch_twig.boundsTrim()
+ if twig_ob_bounds_prune_taper != 1.0:
+ # taper to a point. we could use some nice taper algo here - just linear atm.
+
+ brch_twig.taper(twig_ob_bounds_prune_taper)
+
+ # Make sure this dosnt mess up anything else
+
+ brch_twig_index += 1
+
+ # Add to the branches
+ #self.branches_all.append(brch_twig)
+ if len(brch_twig.bpoints) > 2:
+ branches_twig_attached.append(brch_twig)
+ brch_twig.generation = brch_parent.generation + 1
+ brch_parent.twig_count += 1
+ else:
+ # Dont add the branch
+ parent_pt.childCount -= 1
+
+ # Watch This! - move 1 tab down for no recursive twigs
+ if twig_recursive:
+ self.branches_all.extend(branches_twig_attached)
+ branches_twig_attached = []
+
+ if not twig_recursive:
+ self.branches_all.extend(branches_twig_attached)
+ branches_twig_attached = []
+
+
+ if do_twigs_fill and twig_ob_bounds:
+ self.twigFill(\
+ twig_fill_levels,\
+ twig_fill_rand_scale,\
+ twig_fill_fork_angle_max,\
+ twig_fill_radius_min,\
+ twig_fill_radius_factor,\
+ twig_fill_shape_type,\
+ twig_fill_shape_rand,\
+ twig_fill_shape_power,\
+ )
+
+ ### self.branches_all.sort( key = lambda brch: brch.parent_pt != None )
+
+ # Calc points with dependancies
+ # detect circular loops!!! - TODO
+ #### self.resetTags(False) # NOT NEEDED NOW
+ done_nothing = False
+ while done_nothing == False:
+ done_nothing = True
+
+ for brch in self.branches_all:
+
+ if brch.tag == False and (brch.parent_pt == None or brch.parent_pt.branch.tag == True):
+ # Assign this to a spesific side of the parents point
+ # we know this is a child but not which side it should be attached to.
+ if brch.parent_pt:
+
+ child_locs = [\
+ brch.parent_pt.childPointUnused(0),\
+ brch.parent_pt.childPointUnused(1),\
+ brch.parent_pt.childPointUnused(2),\
+ brch.parent_pt.childPointUnused(3)]
+
+ best_idx = closestVecIndex(brch.bpoints[0].co, child_locs)
+
+ # best_idx could be -1 if all childPoint's are used however we check for this and dont allow it to happen.
+ #if best_idx==-1:
+ # raise "Error"z
+ brch.parent_pt.children[best_idx] = brch
+
+ for pt in brch.bpoints:
+ pt.calcVerts()
+
+ done_nothing = False
+ brch.tag = True
+
+ '''
+ for i in xrange(len(self.branches_all)):
+ brch_i = self.branches_all[i]
+ print brch_i.myindex,
+ print 'tag', brch_i.tag,
+ print 'parent is',
+ if brch_i.parent_pt:
+ print brch_i.parent_pt.branch.myindex
+ else:
+ print None
+ '''
+
+ def optimizeSpacing(self, seg_density=0.5, seg_density_angle=20.0, seg_density_radius=0.3, joint_compression=1.0, joint_smooth=1.0):
+ '''
+ Optimize spacing, taking branch hierarchy children into account,
+ can add or subdivide segments so branch joins dont look horrible.
+ '''
+ for brch in self.branches_all:
+ brch.evenJointDistrobution(joint_compression)
+
+ # Correct points that were messed up from sliding
+ # This happens when one point is pushed past another and the branch gets an overlaping line
+ for brch in self.branches_all:
+ brch.fixOverlapError(joint_smooth)
+
+
+ # Collapsing
+ for brch in self.branches_all:
+ brch.collapsePoints(seg_density, seg_density_angle, seg_density_radius, joint_smooth)
+ '''
+ for brch in self.branches_all:
+ brch.branchReJoin()
+ '''
+
+ def twigFill(self_tree,\
+ twig_fill_levels,\
+ twig_fill_rand_scale,\
+ twig_fill_fork_angle_max,\
+ twig_fill_radius_min,\
+ twig_fill_radius_factor,\
+ twig_fill_shape_type,\
+ twig_fill_shape_rand,\
+ twig_fill_shape_power,\
+ ):
+ '''
+ Fill with twigs, this function uses its own class 'segment'
+
+ twig_fill_shape_type;
+ 0 - no child smoothing
+ 1 - smooth one child
+ 2 - smooth both children
+
+ '''
+
+ segments_all = []
+ segments_level = []
+
+ # Only for testing
+ def preview_curve():
+ TWIG_WIDTH_MAX = 1.0
+ TWIG_WIDTH_MIN = 0.1
+ cu = bpy.data.curves["cu"]
+ # remove all curves
+ while len(cu):
+ del cu[0]
+ # return
+
+ cu.setFlag(1)
+ cu.ext2 = 0.01
+
+ WIDTH_STEP = (TWIG_WIDTH_MAX-TWIG_WIDTH_MIN) / twig_fill_levels
+
+ for i, seg in enumerate(segments_all):
+
+ # 1 is the base and 2 is the tail
+
+ p1_h2 = seg.getHeadHandle() # isnt used
+ p1_co = seg.headCo
+ p1_h1 = seg.getHeadHandle()
+
+ p2_h1 = seg.getTailHandle()
+
+ p2_co = seg.tailCo
+ p2_h2 = seg.tailCo # isnt used
+
+ bez1 = Blender.BezTriple.New([ p1_h1[0], p1_h1[1], p1_h1[2], p1_co[0], p1_co[1], p1_co[2], p1_h2[0], p1_h2[1], p1_h2[2] ])
+ bez2 = Blender.BezTriple.New([ p2_h1[0], p2_h1[1], p2_h1[2], p2_co[0], p2_co[1], p2_co[2], p2_h2[0], p2_h2[1], p2_h2[2] ])
+ bez1.handleTypes = bez2.handleTypes = [Blender.BezTriple.HandleTypes.FREE, Blender.BezTriple.HandleTypes.FREE]
+
+ bez1.radius = TWIG_WIDTH_MIN + (WIDTH_STEP * (seg.levelFromLeaf+1))
+ bez2.radius = TWIG_WIDTH_MIN + (WIDTH_STEP * seg.levelFromLeaf)
+
+ cunurb = cu.appendNurb(bez1)
+ cunurb.append(bez2)
+
+ # This sucks
+ for bez in cunurb:
+ bez.handleTypes = [Blender.BezTriple.HandleTypes.FREE, Blender.BezTriple.HandleTypes.FREE]
+
+ ### cc = sce.objects.new( cu )
+ cu.update()
+
+
+ def mergeCo(parentCo, ch1Co, ch2Co, twig_fill_shape_rand):
+ if twig_fill_shape_rand==0.0:
+ return (parentCo + ch1Co + ch2Co) / 3.0
+ else:
+ w1 = Rand(0.0, twig_fill_shape_rand) + (1-twig_fill_shape_rand)
+ w2 = Rand(0.0, twig_fill_shape_rand) + (1-twig_fill_shape_rand)
+ w3 = Rand(0.0, twig_fill_shape_rand) + (1-twig_fill_shape_rand)
+ wtot = w1+w2+w3
+ w1=w1/wtot
+ w2=w2/wtot
+ w3=w3/wtot
+
+ # return (parentCo*w1 + ch1Co*w2 + ch2Co*w2)
+ co1 = (parentCo * w1) + (ch1Co * (1.0-w1))
+ co2 = (ch1Co * w2) + (ch2Co * (1.0-w2))
+ co3 = (ch2Co * w3) + (parentCo * (1.0-w3))
+
+ return (co1 + co2 + co3) / 3.0
+
+
+
+ class segment:
+ def __init__(self, level):
+ self.headCo = Vector()
+ self.tailCo = Vector()
+ self.parent = None
+ self.mergeCount = 0
+ self.levelFromLeaf = level # how far we are from the leaf in levels
+ self.levelFromRoot = -1 # set later, assume root bone
+ self.children = []
+ segments_all.append(self)
+
+ if level >= len(segments_level): segments_level.append([self])
+ else: segments_level[level].append(self)
+
+ self.brothers = []
+ self.no = Vector() # only endpoints have these
+ self.id = len(segments_all)
+ self.bpt = None # branch point for root segs only
+
+ def getHeadHandle(self):
+ """
+ For Bezier only
+ """
+
+ if not self.parent:
+ return self.headCo
+
+ if twig_fill_shape_type == 0: # no smoothing
+ return self.headCo
+ elif twig_fill_shape_type == 1:
+ if self.parent.children[1] == self:
+ return self.headCo
+ # 2 - always do both
+
+
+ # Y shape with curve? optional
+
+ # we have a parent but it has no handle direction, easier
+ if not self.parent.parent: no = self.parent.headCo - self.parent.tailCo
+ else: no = self.parent.parent.headCo-self.parent.tailCo
+
+ no.length = self.getLength() * twig_fill_shape_power
+ # Ok we have to account for the parents handle
+ return self.headCo - no
+ # return self.headCo - Vector(1, 0,0)
+
+ def getTailHandle(self):
+ """
+ For Bezier only
+ """
+ if self.parent:
+ no = self.parent.headCo-self.tailCo
+ no.length = self.getLength() * twig_fill_shape_power
+ return self.tailCo + no
+ else:
+ return self.tailCo # isnt used
+
+ def getRootSeg(self):
+ seg = self
+ while seg.parent:
+ seg = seg.parent
+
+ return seg
+
+ def calcBrothers(self):
+ # Run on children first
+ self.brothers.extend( \
+ [seg_child_sibling.parent \
+ for seg_child in self.children \
+ for seg_child_sibling in seg_child.brothers \
+ if seg_child_sibling.parent not in (self, None)]\
+ )
+ #print self.brothers
+
+ def calcLevelFromRoot(self):
+ if self.parent:
+ self.levelFromRoot = self.parent.levelFromRoot + 1
+
+ for seg_child in self.children:
+ seg_child.calcLevelFromRoot()
+
+ def transform(self, matrix):
+ self.headCo = self.headCo * matrix
+ self.tailCo = self.tailCo * matrix
+
+ if self.children:
+ ch1 = self.children[0]
+ ch2 = self.children[1]
+
+ ch1.transform(matrix)
+ ch2.transform(matrix)
+
+ def scale(self, scale, cent=None):
+ # scale = 0.9
+ #matrix = Matrix([scale,0,0],[0,scale,0],[0,0,scale]).resize4x4()
+ #self.transform(matrix)
+ if cent == None: # first iter
+ cent = self.headCo
+ self.tailCo = ((self.tailCo-cent) * scale) + cent
+ else:
+ self.headCo = ((self.headCo-cent) * scale) + cent
+ self.tailCo = ((self.tailCo-cent) * scale) + cent
+
+ if self.children:
+ self.children[0].scale(scale, cent)
+ self.children[1].scale(scale, cent)
+
+ def recalcChildLoc(self):
+ if not self.children:
+ return
+ ch1 = self.children[0]
+ ch2 = self.children[1]
+ new_mid = mergeCo(self.headCo, ch1.tailCo, ch2.tailCo, twig_fill_shape_rand)
+ self.tailCo[:] = ch1.headCo[:] = ch2.headCo[:] = new_mid
+
+ ch1.recalcChildLoc()
+ ch2.recalcChildLoc()
+
+ def merge(self, other):
+ """
+ Merge other into self and make a new segment
+ """
+
+ #new_head = (self.headCo + self.tailCo + other.headCo + other.tailCo) * 0.25
+ self.parent = other.parent = segment(self.levelFromLeaf + 1)
+
+ self.parent.tailCo = (self.headCo + self.tailCo + other.tailCo) / 3.0
+ self.parent.headCo[:] = self.headCo
+ self.parent.bpt = self.bpt
+ self.bpt = None
+
+ # isect = LineIntersect(self.headCo, self.tailCo, other.headCo, other.tailCo)
+ # new_head = (isect[0]+isect[1]) * 0.5
+
+ self.mergeCount += 1
+ other.mergeCount += 1
+
+ self.parent.children.extend([ self, other ])
+
+ self.parent.recalcChildLoc()
+ # print 'merging', self.id, other.id
+
+ def findBestMerge(self, twig_fill_fork_angle_max):
+ # print "findBestMerge"
+ if self.parent != None:
+ return
+
+ best_dist = 1000000
+ best_seg = None
+ for seg_list in (self.brothers, segments_level[self.levelFromLeaf]):
+ #for seg_list in (segments_level[self.levelFromLeaf],):
+
+ # only use all other segments if we cant find any from our brothers
+ if seg_list == segments_level[self.levelFromLeaf] and best_seg != None:
+ break
+
+ for seg in seg_list:
+ # 2 ppoint join
+ if seg != self and seg.mergeCount == 0 and seg.parent == None:
+
+ # find the point they would join
+ test_dist = (self.tailCo - seg.tailCo).length
+ if test_dist < best_dist:
+ if twig_fill_fork_angle_max > 179:
+ best_dist = test_dist
+ best_seg = seg
+ else:
+ # Work out if the desired angle range is ok.
+ mco = mergeCo( self.headCo, self.tailCo, seg.tailCo, 0.0 ) # we dont want the random value for this test
+ ang = AngleBetweenVecs(self.tailCo-mco, seg.tailCo-mco)
+ if ang < twig_fill_fork_angle_max:
+ best_dist = test_dist
+ best_seg = seg
+ return best_seg
+
+ def getNormal(self):
+ return (self.headCo - self.tailCo).normalize()
+
+ def getLength(self):
+ return (self.headCo - self.tailCo).length
+
+ def toMatrix(self, LEAF_SCALE, LEAF_RANDSCALE, LEAF_RANDVEC):
+ if LEAF_RANDSCALE: scale = LEAF_SCALE * Rand(1.0-LEAF_RANDSCALE, 1.0+LEAF_RANDSCALE)
+ else: scale = LEAF_SCALE * 1.0
+
+ if LEAF_RANDVEC: rand_vec = Vector( Rand(-1, 1), Rand(-1, 1), Rand(-1, 1) ).normalize() * LEAF_RANDVEC
+ else: rand_vec = Vector( )
+
+ return Matrix([scale,0,0],[0,scale,0],[0,0,scale]).resize4x4() * (self.no + rand_vec).toTrackQuat('x', 'z').toMatrix().resize4x4() * TranslationMatrix(self.tailCo)
+
+ def distripute_seg_on_mesh(me__, face_group):
+ """
+ add segment endpoints
+ """
+
+ vert_segment_mapping = {}
+ for f in face_group:
+ for v in f:
+ i = v.index
+ if i not in vert_segment_mapping:
+ vert_segment_mapping[i] = len(segments_all)
+ v.sel = True
+ seg = segment(0)
+ seg.tailCo = v.co.copy() # headCo undefined atm.
+ seg.no = v.no
+
+ # Build connectivity
+ for ed in me__.edges:
+ if ed.v1.sel and ed.v2.sel:
+ i1,i2 = ed.key
+ i1 = vert_segment_mapping[i1]
+ i2 = vert_segment_mapping[i2]
+
+ segments_all[i1].brothers.append( segments_all[i2] )
+ segments_all[i2].brothers.append( segments_all[i1] )
+
+ # Dont need to return anything, added when created.
+
+ def find_leaf_attach_point(seg, interior_points, twig_fill_rand_scale):
+ """
+ Can only run on end nodes that have normals set
+ """
+ best_dist = 1000000000.0
+ best_point = None
+
+ co = seg.tailCo
+
+ for pt in interior_points:
+ # line from the point to the seg endpoint
+ line_normal = seg.tailCo - pt.co
+ l = line_normal.length
+
+ cross1 = CrossVecs( seg.no, line_normal )
+ cross2 = CrossVecs( pt.no, line_normal )
+
+ angle_line = min(AngleBetweenVecs(cross1, cross2), AngleBetweenVecs(cross1, -cross2))
+ angle_leaf_no_diff = min(AngleBetweenVecs(line_normal, seg.no), AngleBetweenVecs(line_normal, -seg.no))
+
+ # BEST_ANG=66.0
+ # angle = 66.0 # min(AngleBetweenVecs(v2_co-v1_co, leaf.co-cc), AngleBetweenVecs(v1_co-v2_co, leaf.co-cc))
+ # print angle, angle2
+ # l = (l * ((1+abs(angle-BEST_ANG))**2 )) / (1+angle_line)
+ l = angle_leaf_no_diff * angle_line * l
+
+ if l < best_dist:
+ best_pt = pt
+ best_co = pt.co.copy()
+
+ best_dist = l
+
+ # twig_fill_rand_scale
+ seg.headCo = best_co.copy()
+
+ if twig_fill_rand_scale:
+ seg_dir = seg.tailCo - seg.headCo
+ seg_dir.length = seg_dir.length * ( 1.0 - Rand(0.0, twig_fill_rand_scale) )
+ seg.tailCo = seg.headCo + seg_dir
+
+ seg.bpt = best_pt
+ # END Twig code, next add them
+
+
+ """
+ Uses a reversed approch, fill in twigs from a bounding mesh
+ """
+ # print "twig_fill_fork_angle_max"
+ # twig_fill_fork_angle_max = 60.0 #
+ # forward_diff_bezier will fill in the blanks
+ # nice we can reuse these for every curve segment :)
+ pointlist = [[None, None, None] for i in xrange(self_tree.steps+1)]
+ radlist = [ None for i in xrange(self_tree.steps+1) ]
+
+ orig_branch_count = len(self_tree.branches_all)
+
+ for face_group in BPyMesh.mesh2linkedFaces(self_tree.objectTwigBoundsMesh):
+ # Set the selection to do point inside.
+ self_tree.objectTwigBoundsMesh.sel = False
+ for f in face_group: f.sel = True
+
+ interior_points = []
+ interior_normal = Vector()
+ for i, brch in enumerate(self_tree.branches_all):
+
+ if i == orig_branch_count:
+ break # no need to check new branches are inside us
+
+ for pt in brch.bpoints:
+ if self_tree.isPointInTwigBounds(pt.co, True): # selected_only
+ interior_points.append(pt)
+ interior_normal += pt.no * pt.radius
+
+ segments_all[:] = []
+ segments_level[:] = []
+
+ if interior_points:
+ # Ok, we can add twigs now
+ distripute_seg_on_mesh( self_tree.objectTwigBoundsMesh, face_group )
+
+ for seg in segments_level[0]: # only be zero segments
+ find_leaf_attach_point(seg, interior_points, twig_fill_rand_scale)
+
+ # Try sorting by other properties! this is ok for now
+ for segments_level_current in segments_level:
+ segments_level_current.sort( key = lambda seg: -(seg.headCo-seg.tailCo).length )
+
+ for level in xrange(twig_fill_levels):
+ if len(segments_level) > level:
+ for seg in segments_level[level]:
+ # print level, seg.brothers
+ if seg.mergeCount == 0:
+ seg_merge = seg.findBestMerge(twig_fill_fork_angle_max)
+ if seg_merge:
+ seg.merge( seg_merge )
+
+ if len(segments_level) > level+1:
+ for seg in segments_level[level+1]:
+ seg.calcBrothers()
+
+ # Randomize scale recursively
+ # This way sucks, just randomize starting lengths
+ """
+ if twig_fill_rand_scale != 0.0: # 0.0 - 1.0
+ for seg in segments_all:
+ #if seg.levelFromLeaf == 0:
+ if 1:
+ sca = 1.0 + Rand(-twig_fill_rand_scale, twig_fill_rand_scale)
+ # print sca, 'SCALE'
+ seg.scale(sca)
+ """
+
+ for seg in segments_all:
+ if seg.parent == None:
+ seg.levelFromRoot = 0
+ seg.calcLevelFromRoot()
+
+ for i, seg in enumerate(segments_all):
+
+ # 1 is the base and 2 is the tail
+
+ #p1_h1 = seg.getHeadHandle()
+ p1_co = seg.headCo.copy()
+ p1_h2 = seg.getHeadHandle() # isnt used
+
+ p2_h1 = seg.getTailHandle()
+ p2_co = seg.tailCo.copy()
+ #p2_h2 = seg.getTailHandle() # isnt used
+
+ # Make a branch from this data!
+
+ brch = branch()
+ self_tree.branches_all.append(brch)
+
+ # ============================= do this per bez pair
+ bez1_vec = (None, p1_co, p1_h2)
+ bez2_vec = (p2_h1, p2_co, None)
+
+ seg_root = seg.getRootSeg()
+ if seg_root.levelFromLeaf:
+ # print seg_root.levelFromLeaf, seg.levelFromRoot
+ WIDTH_STEP = ((seg_root.bpt.radius * twig_fill_radius_factor)-twig_fill_radius_min) / seg_root.levelFromLeaf
+
+ radius1 = twig_fill_radius_min + (WIDTH_STEP * (seg.levelFromLeaf+1))
+ radius2 = twig_fill_radius_min + (WIDTH_STEP * seg.levelFromLeaf)
+ else:
+ radius1 = seg_root.bpt.radius
+ radius2 = twig_fill_radius_min
+
+ points_from_bezier_seg(self_tree.steps, pointlist, radlist, bez1_vec, bez2_vec, radius1, radius2)
+
+ # dont apply self_tree.limbScale here! - its alredy done
+ bpoints = [ bpoint(brch, Vector(pointlist[ii]), Vector(), radlist[ii]) for ii in xrange(len(pointlist)) ]
+
+ # remove endpoint for all but the last
+ #if i != len(bez_list)-1:
+ # bpoints.pop()
+
+ brch.bpoints.extend(bpoints)
+ # =============================
+
+ # Finalize once point data is there
+ brch.calcData()
+ #
+ #preview_curve()
+
+
+ def buildTwigs(self, twig_ratio, twig_select_mode, twig_select_factor):
+
+ ratio_int = int(len(self.branches_all) * twig_ratio)
+ if ratio_int == 0:
+ return
+
+ # So we only mix branches of similar lengths
+ branches_sorted = self.branches_all[:]
+
+ # Get the branches based on our selection method!
+ if twig_select_mode==0:
+ branches_sorted.sort( key = lambda brch: brch.getLength())
+ elif twig_select_mode==1:
+ branches_sorted.sort( key = lambda brch:-brch.getLength())
+ elif twig_select_mode==2:
+ branches_sorted.sort( key = lambda brch:brch.getStraightness())
+ elif twig_select_mode==3:
+ branches_sorted.sort( key = lambda brch:-brch.getStraightness())
+
+ factor_int = int(len(self.branches_all) * twig_select_factor)
+ branches_sorted[factor_int:] = [] # remove the last part of the list
+
+ branches_sorted.sort( key = lambda brch: len(brch.bpoints))
+
+ branches_new = []
+ #for i in xrange(ratio_int):
+ tot_twigs = 0
+
+ step = 1
+ while tot_twigs < ratio_int and step < len(branches_sorted):
+ # Make branches from the existing
+ for j in xrange(step, len(branches_sorted)):
+ brch = branches_sorted[j-step].mixToNew(branches_sorted[j], None)
+ branches_new.append( brch )
+ tot_twigs +=1
+
+ if tot_twigs > ratio_int:
+ break
+
+ ### print "TwigCount", len(branches_new), ratio_int
+
+ self.branches_twigs = branches_new
+
+ def toDebugDisplay(self):
+ '''
+ Should be able to call this at any time to see whats going on, dosnt work so nice ATM.
+ '''
+ sce = bpy.data.scenes.active
+
+ for ob in self.debug_objects:
+ for ob in sce.objects:
+ sce.objects.unlink(ob)
+
+ for branch_index, brch in enumerate(self.branches_all):
+ pt_index = 0
+ for pt_index, pt in enumerate(brch.bpoints):
+ name = '%.3d_%.3d' % (branch_index, pt_index)
+ if pt.next==None:
+ name += '_end'
+ if pt.prev==None:
+ name += '_start'
+
+ ob = sce.objects.new('Empty', name)
+ self.debug_objects.append(ob)
+ mat = ScaleMatrix(pt.radius, 4) * TranslationMatrix(pt.co)
+ ob.setMatrix(mat)
+ ob.setDrawMode(8) # drawname
+ Blender.Window.RedrawAll()
+
+
+
+ def toMesh(self, mesh=None, do_uv=True, do_uv_keep_vproportion=True, do_uv_vnormalize=False, do_uv_uscale=False, uv_image = None, uv_x_scale=1.0, uv_y_scale=4.0, do_uv_blend_layer= False, do_cap_ends=False):
+ self.mesh = freshMesh(mesh)
+ totverts = 0
+
+ for brch in self.branches_all:
+ totverts += len(brch.bpoints)
+
+ self.mesh.verts.extend( [ (0.0,0.0,0.0) ] * ((totverts * 4)+1) ) # +1 is a dummy vert
+ verts = self.mesh.verts
+
+ # Assign verts to points, 4 verts for each point.
+ i = 1 # dummy vert, should be 0
+ for brch in self.branches_all:
+ for pt in brch.bpoints:
+ pt.verts[0] = verts[i]
+ pt.verts[1] = verts[i+1]
+ pt.verts[2] = verts[i+2]
+ pt.verts[3] = verts[i+3]
+ i+=4
+
+ # Do this again because of collapsing
+ # pt.calcVerts(brch)
+
+ # roll the tube so quads best meet up to their branches.
+ for brch in self.branches_all:
+ #for pt in brch.bpoints:
+ if brch.parent_pt:
+
+ # Use temp lists for gathering an average
+ if brch.parent_pt.roll_angle == None:
+ brch.parent_pt.roll_angle = [brch.getParentQuadAngle()]
+ # More then 2 branches use this point, add to the list
+ else:
+ brch.parent_pt.roll_angle.append( brch.getParentQuadAngle() )
+
+ # average the temp lists into floats
+ for brch in self.branches_all:
+ #for pt in brch.bpoints:
+ if brch.parent_pt and type(brch.parent_pt.roll_angle) == list:
+ # print brch.parent_pt.roll_angle
+ f = 0.0
+ for val in brch.parent_pt.roll_angle:
+ f += val
+ brch.parent_pt.roll_angle = f/len(brch.parent_pt.roll_angle)
+
+ # set the roll of all the first segments that have parents,
+ # this is because their roll is set from their parent quad and we dont want them to roll away from that.
+ for brch in self.branches_all:
+ if brch.parent_pt:
+ # if the first joint has a child then apply half the roll
+ # theres no correct solition here, but this seems ok
+ if brch.bpoints[0].roll_angle != None:
+ #brch.bpoints[0].roll_angle *= 0.5
+ #brch.bpoints[0].roll_angle = 0.0
+ #brch.bpoints[1].roll_angle = 0.0
+ brch.bpoints[0].roll_angle = 0
+ pass
+ else:
+ # our roll was set from the branches parent and needs no changing
+ # set it to zero so the following functions know to interpolate.
+ brch.bpoints[0].roll_angle = 25.0
+ #brch.bpoints[1].roll_angle = 0.0
+
+ '''
+ Now interpolate the roll!
+ The method used here is a little odd.
+
+ * first loop up the branch and set each points value to the "last defined" value and record the steps
+ since the last defined value
+ * Do the same again but backwards
+
+ now for each undefined value we have 1 or 2 values, if its 1 its simple we just use that value
+ ( no interpolation ), if there are 2 then we use the offsets from each end to work out the interpolation.
+
+ one up, one back, and another to set the values, so 3 loops all up.
+ '''
+ #### print "scan up the branch..."
+ for brch in self.branches_all:
+ last_value = None
+ last_index = -1
+ for i in xrange(len(brch.bpoints)):
+ pt = brch.bpoints[i]
+ if type(pt.roll_angle) in (float, int):
+ last_value = pt.roll_angle
+ last_index = i
+ else:
+ if type(last_value) in (float, int):
+ # Assign a list, because there may be a connecting roll value from another joint
+ pt.roll_angle = [(last_value, i-last_index)]
+
+ #### print "scan down the branch..."
+ last_value = None
+ last_index = -1
+ for i in xrange(len(brch.bpoints)-1, -1, -1): # same as above but reverse
+ pt = brch.bpoints[i]
+ if type(pt.roll_angle) in (float, int):
+ last_value = pt.roll_angle
+ last_index = i
+ else:
+ if last_value != None:
+ if type(pt.roll_angle) == list:
+ pt.roll_angle.append((last_value, last_index-i))
+ else:
+ #pt.roll_angle = [(last_value, last_index-i)]
+
+ # Dont bother assigning a list because we wont need to add to it later
+ pt.roll_angle = last_value
+
+ # print "looping ,...."
+ ### print "assigning/interpolating roll values"
+ for pt in brch.bpoints:
+
+ # print "this roll IS", pt.roll_angle
+
+ if pt.roll_angle == None:
+ continue
+ elif type(pt.roll_angle) in (float, int):
+ pass
+ elif len(pt.roll_angle) == 1:
+ pt.roll_angle = pt.roll_angle[0][0]
+ else:
+ # interpolate
+ tot = pt.roll_angle[0][1] + pt.roll_angle[1][1]
+ pt.roll_angle = \
+ (pt.roll_angle[0][0] * (tot - pt.roll_angle[0][1]) +\
+ pt.roll_angle[1][0] * (tot - pt.roll_angle[1][1])) / tot
+
+ #### print pt.roll_angle, 'interpolated roll'
+
+ pt.roll(pt.roll_angle)
+
+ # Done with temp average list. now we know the best roll for each branch.
+
+ # mesh the data
+ for brch in self.branches_all:
+ for pt in brch.bpoints:
+ pt.toMesh(self.mesh)
+
+ #faces_extend = [ face for brch in self.branches_all for pt in brch.bpoints for face in pt.faces if face ]
+
+
+
+ faces_extend = []
+ for brch in self.branches_all:
+ if brch.parent_pt:
+ faces_extend.extend(brch.faces)
+ for pt in brch.bpoints:
+ for face in pt.faces:
+ if face:
+ faces_extend.append(face)
+
+ if do_cap_ends:
+ # TODO - UV map and image?
+ faces_extend.extend([ brch.bpoints[-1].verts for brch in self.branches_all ])
+
+ faces = self.mesh.faces
+
+ faces.extend(faces_extend, smooth=True)
+
+ if do_uv:
+ # Assign the faces back
+ face_index = 0
+ for brch in self.branches_all:
+ if brch.parent_pt:
+ for i in (0,1,2,3):
+ face = brch.faces[i] = faces[face_index+i]
+ face_index +=4
+
+ for pt in brch.bpoints:
+ for i in (0,1,2,3):
+ if pt.faces[i]:
+ pt.faces[i] = faces[face_index]
+ face_index +=1
+
+ #if self.mesh.faces:
+ # self.mesh.faceUV = True
+ mesh.addUVLayer( 'base' )
+
+ # rename the uv layer
+ #mesh.renameUVLayer(mesh.getUVLayerNames()[0], 'base')
+
+ for brch in self.branches_all:
+
+ uv_x_scale_branch = 1.0
+ if do_uv_uscale:
+ uv_x_scale_branch = 0.0
+ for pt in brch.bpoints:
+ uv_x_scale_branch += pt.radius
+
+ uv_x_scale_branch = uv_x_scale_branch / len(brch.bpoints)
+ # uv_x_scale_branch = brch.bpoints[0].radius
+
+ if do_uv_vnormalize:
+ uv_normalize = []
+
+ def uvmap_faces(my_faces, y_val, y_size):
+ '''
+ Accept a branch or pt faces
+ '''
+ uv_ls = [None, None, None, None]
+ for i in (0,1,2,3):
+ if my_faces[i]:
+ if uv_image:
+ my_faces[i].image = uv_image
+ uvs = my_faces[i].uv
+ else:
+ # Use these for calculating blending values
+ uvs = [Vector(0,0), Vector(0,0), Vector(0,0), Vector(0,0)]
+
+ uv_ls[i] = uvs
+
+ x1 = i*0.25 * uv_x_scale * uv_x_scale_branch
+ x2 = (i+1)*0.25 * uv_x_scale * uv_x_scale_branch
+
+ uvs[3].x = x1;
+ uvs[3].y = y_val+y_size
+
+ uvs[0].x = x1
+ uvs[0].y = y_val
+
+ uvs[1].x = x2
+ uvs[1].y = y_val
+
+ uvs[2].x = x2
+ uvs[2].y = y_val+y_size
+
+ if do_uv_vnormalize:
+ uv_normalize.extend(uvs)
+
+ return uv_ls
+
+ # Done uvmap_faces
+
+ y_val = 0.0
+
+ if brch.parent_pt:
+ y_size = (brch.getParentFaceCent() - brch.bpoints[0].co).length
+
+ if do_uv_keep_vproportion:
+ y_size = y_size / ((brch.bpoints[0].radius + brch.parent_pt.radius)/2) * uv_y_scale
+
+ brch.uv = uvmap_faces(brch.faces, 0.0, y_size)
+
+ y_val += y_size
+
+ for pt in brch.bpoints:
+ if pt.next:
+ y_size = (pt.co-pt.next.co).length
+ # scale the uvs by the radius, avoids stritching.
+ if do_uv_keep_vproportion:
+ y_size = y_size / pt.radius * uv_y_scale
+ pt.uv = uvmap_faces(pt.faces, y_val, y_size)
+ y_val += y_size
+
+
+ if do_uv_vnormalize and uv_normalize:
+ # Use yscale here so you can choose to have half the normalized value say.
+ vscale = (1/uv_normalize[-1].y) * uv_y_scale
+ for uv in uv_normalize:
+ uv.y *= vscale
+
+
+
+ # Done with UV mapping the first layer! now map the blend layers
+ if do_uv_blend_layer:
+
+
+
+ # Set up the blend UV layer - this is simply the blending for branch joints
+ mesh.addUVLayer( 'blend' )
+ mesh.activeUVLayer = 'blend'
+
+ # Set all faces to be on full blend
+ for f in mesh.faces:
+ for uv in f.uv:
+ uv.y = uv.x = 0.0
+
+ for brch in self.branches_all:
+ if brch.parent_pt:
+ for f in brch.faces:
+ if f:
+ uvs = f.uv
+ uvs[0].x = uvs[1].x = uvs[2].x = uvs[3].x = 0.0
+ uvs[0].y = uvs[1].y = 1.0 # swap these? - same as inverting the blend
+ uvs[2].y = uvs[3].y = 0.0
+
+ # Set up the join UV layer, this overlays nice blended
+ mesh.addUVLayer( 'join' )
+ mesh.activeUVLayer = 'join'
+
+ # Set all faces to be on full blend
+ for f in mesh.faces:
+ for uv in f.uv:
+ uv.y = uv.x = 0.0
+
+ for brch in self.branches_all:
+ if brch.parent_pt:
+ # The UV's that this branch would cover if it was a face,
+ uvs_base = brch.parent_pt.uv[brch.getParentQuadIndex()]
+
+ uvs_base_mid = Vector(0,0)
+ for uv in uvs_base:
+ uvs_base_mid += uv
+
+ uvs_base_mid *= 0.25
+
+ # TODO - Factor scale and distance in here
+ ## uvs_base_small = [(uv+uvs_base_mid)*0.5 for uv in uvs_base]
+ uvs_base_small = [uvs_base_mid, uvs_base_mid, uvs_base_mid, uvs_base_mid]
+
+ if brch.faces[0]:
+ f = brch.faces[0]
+ uvs = f.uv
+ uvs[0][:] = uvs_base[0]
+ uvs[1][:] = uvs_base[1]
+
+ uvs[2][:] = uvs_base_small[1]
+ uvs[3][:] = uvs_base_small[0]
+
+ if brch.faces[1]:
+ f = brch.faces[1]
+ uvs = f.uv
+ uvs[0][:] = uvs_base[1]
+ uvs[1][:] = uvs_base[2]
+
+ uvs[2][:] = uvs_base_small[2]
+ uvs[3][:] = uvs_base_small[1]
+
+ if brch.faces[2]:
+ f = brch.faces[2]
+ uvs = f.uv
+ uvs[0][:] = uvs_base[2]
+ uvs[1][:] = uvs_base[3]
+
+ uvs[2][:] = uvs_base_small[3]
+ uvs[3][:] = uvs_base_small[2]
+
+ if brch.faces[3]:
+ f = brch.faces[3]
+ uvs = f.uv
+ uvs[0][:] = uvs_base[3]
+ uvs[1][:] = uvs_base[0]
+
+ uvs[2][:] = uvs_base_small[0]
+ uvs[3][:] = uvs_base_small[3]
+
+ mesh.activeUVLayer = 'base' # just so people dont get worried the texture is not there - dosnt effect rendering.
+ else:
+ # no UV's
+ pass
+
+ if do_cap_ends:
+ # de-select end points for
+ i = len(faces)-1
+
+ cap_end_face_start = len(faces) - len(self.branches_all)
+
+ j = 0
+ for i in xrange(cap_end_face_start, len(faces)):
+ self.branches_all[j].face_cap = faces[i]
+ faces[i].sel = 0
+
+ # default UV's are ok for now :/
+ if do_uv and uv_image:
+ faces[i].image = uv_image
+
+ j +=1
+
+ # set edge crease for capped ends.
+ for ed in self.mesh.edges:
+ if ed.v1.sel==False and ed.v2.sel==False:
+ ed.crease = 255
+ ed.sel = True # so its all selected still
+
+ del faces_extend
+
+ return self.mesh
+
+ def toLeafMesh(self, mesh_leaf,\
+ leaf_branch_limit = 0.5,\
+ leaf_branch_limit_rand = 0.8,\
+ leaf_size = 0.5,\
+
+ leaf_fill=True,\
+ leaf_fill_count=1000,\
+ leaf_fill_ob_bounds=None,\
+
+ leaf_dupliface=False,\
+ leaf_dupliface_fromgroup=None,\
+ ):
+
+ '''
+ return a mesh with leaves seperate from the tree
+
+ Add to the existing mesh.
+ '''
+
+ # first collect stats, we want to know the average radius and total segments
+ #radius = [(pt.radius for pt in self.branches_all for pt in brch.bpoints for pt in brch.bpoints]
+ mesh_leaf = freshMesh(mesh_leaf)
+ self.mesh_leaf = mesh_leaf
+
+ # Fill an object with leaves, kind of primitive but useful at times.
+ if leaf_fill and leaf_fill_count and leaf_fill_ob_bounds:
+
+ self.setLeafBounds(leaf_fill_ob_bounds)
+
+ # Get bounds
+
+ xmin = ymin = zmin = 10000000
+ xmax = ymax = zmax =-10000000
+
+ for v in self.objectLeafBoundsMesh.verts:
+ x,y,z = tuple(v.co)
+
+ if x < xmin: xmin = x
+ if y < ymin: ymin = y
+ if z < zmin: zmin = z
+
+ if x > xmax: xmax = x
+ if y > ymax: ymax = y
+ if z > zmax: zmax = z
+
+ verts_extend = []
+ faces_extend = []
+
+ i = leaf_fill_count
+ while i:
+ # randomize branch values for leaves for now.
+ vec = Vector(Rand(xmin, xmax), Rand(ymin, ymax), Rand(zmin, zmax))
+
+ if self.objectLeafBoundsMesh.pointInside(vec):
+ vec = (vec * self.objectLeafBoundsIMat) * self.objectCurveIMat
+
+ # Find the closest branch
+ brch_close, pt_close = self.closestBranchPt(vec)
+
+ no = pt_close.co - vec
+ #cross = CrossVecs(no, zup)
+ cross = CrossVecs(no, pt_close.no)
+ cross.length = leaf_size
+
+ vec2 = vec - cross
+ vec1 = vec + cross
+
+ vec3 = vec - cross
+ vec4 = vec + cross
+
+
+ no_pt = pt_close.no.copy()
+ no_pt.length = leaf_size
+ vec3 += no_pt
+ vec4 += no_pt
+
+ '''
+ no_pt = pt_close.no.copy()
+ no_pt.length = leaf_size
+ vec3 += no_pt
+ vec4 += no_pt
+ '''
+
+ faces_extend.append([len(verts_extend), len(verts_extend)+1, len(verts_extend)+2, len(verts_extend)+3])
+ verts_extend.extend([vec1, vec2, vec3, vec4])
+ i-=1
+
+ self.mesh_leaf.verts.extend(verts_extend)
+ self.mesh_leaf.faces.extend(faces_extend)
+
+
+ elif leaf_dupliface and leaf_dupliface_fromgroup:
+
+ totpoints = 0
+ radius = 0.0
+ max_radius = 0.0
+ for brch in self.branches_all:
+ for pt in brch.bpoints:
+ radius += pt.radius
+ if pt.radius > max_radius:
+ max_radius = pt.radius
+
+ #totpoints += len(brch.bpoints)
+
+ radius_max = max_radius * leaf_branch_limit
+
+
+ verts_extend = []
+ faces_extend = []
+
+ co1,co2,co3,co4 = Vector(),Vector(),Vector(),Vector()
+
+ rnd_seed = [1.0] # could have seed as an input setting
+
+ for brch in self.branches_all:
+
+ # quick test, do we need leaves on this branch?
+ if brch.bpoints[-1].radius > radius_max:
+ continue
+
+
+ count = 0
+ for pt in brch.bpoints:
+ if leaf_branch_limit_rand:
+ # (-1 : +1) * leaf_branch_limit_rand
+ rnd = 1 + (((next_random_num(rnd_seed) - 0.5) * 2 ) * leaf_branch_limit_rand)
+ else:
+ rnd = 1.0
+
+ if pt.childCount == 0 and (pt.radius * rnd) < radius_max:
+ # Ok we can add a leaf here. set the co's correctly
+ co1[:] = pt.co
+ co2[:] = pt.co
+ co3[:] = pt.co
+ co4[:] = pt.co
+
+
+ cross_leafdir = CrossVecs( zup, pt.no )
+ cross_leafdir.length = (leaf_size/2) ### * pt.radius
+
+
+ # Rotate the
+ # Align this with the existing branch
+ rotate = RotationMatrix( (next_random_num(rnd_seed)-0.5) * 360, 3, 'r', pt.no )
+
+ cross_leafdir = cross_leafdir * rotate
+
+ #cross_leafwidth = CrossVecs(pt.no, cross_leafdir)
+
+ # Facing up
+ cross_leafwidth_up = CrossVecs(zup, cross_leafdir).normalize() * leaf_size * pt.radius
+ cross_leafwidth_aligned = pt.no
+
+ #cross_leafwidth = (cross_leafwidth_up + cross_leafwidth_aligned)/2
+ cross_leafwidth = cross_leafwidth_aligned
+
+ cross_leafwidth.length = (leaf_size/2) ### *pt.radius
+
+ # base width
+ co1 += cross_leafdir
+ co2 += cross_leafdir
+ co3 -= cross_leafdir
+ co4 -= cross_leafdir
+
+ # base hight allong the branch
+ co2 += cross_leafwidth
+ co3 += cross_leafwidth
+
+ co1 -= cross_leafwidth
+ co4 -= cross_leafwidth
+
+
+
+ i = len(verts_extend)
+ faces_extend.append( (i,i+1,i+2,i+3) )
+ verts_extend.extend([tuple(co1), tuple(co2), tuple(co3), tuple(co4)])
+ count += 1
+
+ # setup dupli's
+
+ leaf_dupliface_fromgroup
+
+ self.mesh_leaf.verts.extend(verts_extend)
+ self.mesh_leaf.faces.extend(faces_extend)
+
+
+
+
+
+
+
+
+ '''
+ if 0:
+ totpoints = 0
+ radius = 0.0
+ max_radius = 0.0
+ for brch in self.branches_all:
+ for pt in brch.bpoints:
+ radius += pt.radius
+ if pt.radius > max_radius:
+ max_radius = pt.radius
+
+ #totpoints += len(brch.bpoints)
+
+ radius_max = max_radius * leaf_branch_limit
+
+
+ verts_extend = []
+ faces_extend = []
+
+ co1,co2,co3,co4 = Vector(),Vector(),Vector(),Vector()
+
+ for brch in self.branches_all:
+
+ # quick test, do we need leaves on this branch?
+ if brch.bpoints[-1].radius > radius_max:
+ continue
+
+ count = 0
+ for pt in brch.bpoints:
+ if pt.childCount == 0 and pt.radius < radius_max:
+ # Ok we can add a leaf here. set the co's correctly
+ co1[:] = pt.co
+ co2[:] = pt.co
+ co3[:] = pt.co
+ co4[:] = pt.co
+
+ cross_leafdir = CrossVecs( zup, pt.no )
+ cross_leafdir.length = leaf_size
+
+
+ #cross_leafwidth = CrossVecs(pt.no, cross_leafdir)
+
+ # Facing up
+ cross_leafwidth_up = CrossVecs(zup, cross_leafdir).normalize() * leaf_size
+ cross_leafwidth_aligned = pt.no
+
+ #cross_leafwidth = (cross_leafwidth_up + cross_leafwidth_aligned)/2
+ cross_leafwidth = cross_leafwidth_aligned
+
+ cross_leafwidth.length = leaf_size/2
+
+ if count % 2:
+ cross_leafwidth.negate()
+ cross_leafdir.negate()
+
+ co1 += cross_leafdir
+ co2 += cross_leafdir
+
+ co2 += cross_leafwidth
+ co3 += cross_leafwidth
+
+ co1 -= cross_leafwidth
+ co4 -= cross_leafwidth
+
+
+ i = len(verts_extend)
+ faces_extend.append( (i,i+1,i+2,i+3) )
+ verts_extend.extend([tuple(co1), tuple(co2), tuple(co3), tuple(co4)])
+ count += 1
+
+ self.mesh_leaf.verts.extend(verts_extend)
+ self.mesh_leaf.faces.extend(faces_extend)
+ '''
+
+ return self.mesh_leaf
+
+
+ def toArmature(self, ob_arm, armature):
+
+ armature.drawType = Blender.Armature.STICK
+ armature.makeEditable() # enter editmode
+
+ # Assume toMesh has run
+ self.armature = armature
+ for bonename in armature.bones.keys():
+ del armature.bones[bonename]
+
+
+ group_names = []
+
+ for i, brch in enumerate(self.branches_all):
+
+ # get a list of parent points to make into bones. use parents and endpoints
+ bpoints_parent = [pt for pt in brch.bpoints if pt.childCount or pt.prev == None or pt.next == None]
+ bpbone_last = None
+ for j in xrange(len(bpoints_parent)-1):
+
+ # bone container class
+ bpoints_parent[j].bpbone = bpbone = bpoint_bone()
+ bpbone.name = '%i_%i' % (i,j) # must be unique
+ group_names.append(bpbone.name)
+
+ bpbone.editbone = Blender.Armature.Editbone() # automatically added to the armature
+ self.armature.bones[bpbone.name] = bpbone.editbone
+
+ bpbone.editbone.head = bpoints_parent[j].co
+ bpbone.editbone.head = bpoints_parent[j].co
+ bpbone.editbone.tail = bpoints_parent[j+1].co
+
+ # parent the chain.
+ if bpbone_last:
+ bpbone.editbone.parent = bpbone_last.editbone
+ bpbone.editbone.options = [Blender.Armature.CONNECTED]
+
+ bpbone_last = bpbone
+
+ for brch in self.branches_all:
+ if brch.parent_pt: # We must have a parent
+
+ # find the bone in the parent chain to use for the parent of this
+ parent_pt = brch.parent_pt
+ bpbone_parent = None
+ while parent_pt:
+ bpbone_parent = parent_pt.bpbone
+ if bpbone_parent:
+ break
+
+ parent_pt = parent_pt.prev
+
+
+ if bpbone_parent:
+ brch.bpoints[0].bpbone.editbone.parent = bpbone_parent.editbone
+ else: # in rare cases this may not work. should be verry rare but check anyway.
+ print 'this is really odd... look into the bug.'
+
+ self.armature.update() # exit editmode
+
+ # Skin the mesh
+ if self.mesh:
+ for group in group_names:
+ self.mesh.addVertGroup(group)
+
+ for brch in self.branches_all:
+ vertList = []
+ group = '' # dummy
+
+ for pt in brch.bpoints:
+ if pt.bpbone:
+ if vertList:
+ self.mesh.assignVertsToGroup(group, vertList, 1.0, Blender.Mesh.AssignModes.ADD)
+
+ vertList = []
+ group = pt.bpbone.name
+
+ vertList.extend( [v.index for v in pt.verts] )
+
+ if vertList:
+ self.mesh.assignVertsToGroup(group, vertList, 1.0, Blender.Mesh.AssignModes.ADD)
+
+ return self.armature
+
+ def toAction(self, ob_arm, texture, anim_speed=1.0, anim_magnitude=1.0, anim_speed_size_scale=True, anim_offset_scale=1.0):
+ # Assume armature
+ action = ob_arm.action
+ if not action:
+ action = bpy.data.actions.new()
+ action.fakeUser = False # so we dont get masses of bad data
+ ob_arm.action = action
+
+ # Blender.Armature.NLA.ob_arm.
+ pose = ob_arm.getPose()
+
+ for pose_bone in pose.bones.values():
+ pose_bone.insertKey(ob_arm, 0, [Blender.Object.Pose.ROT], True)
+
+ # Now get all the IPO's
+
+ ipo_dict = action.getAllChannelIpos()
+ # print ipo_dict
+
+ # Sicne its per frame, it increases very fast. scale it down a bit
+ anim_speed = anim_speed/100
+
+ # When we have the same trees next to eachother, they will animate the same way unless we give each its own texture or offset settings.
+ # We can use the object's location as a factor - this also will have the advantage? of seeing the animation move across the tree's
+ # allow a scale so the difference between tree textures can be adjusted.
+ anim_offset = self.objectCurve.matrixWorld.translationPart() * anim_offset_scale
+
+ anim_speed_final = anim_speed
+ # Assign drivers to them all
+ for name, ipo in ipo_dict.iteritems():
+ tex_str = 'b.Texture.Get("%s")' % texture.name
+
+ if anim_speed_size_scale:
+ # Adjust the speed by the bone size.
+ # get the point from the name. a bit ugly but works fine ;) - Just dont mess the index up!
+ lookup = [int(val) for val in name.split('_')]
+ pt = self.branches_all[ lookup[0] ].bpoints[ lookup[1] ]
+ anim_speed_final = anim_speed / (1+pt.radius)
+
+ cu = ipo[Blender.Ipo.PO_QUATX]
+ try: cu.delBezier(0)
+ except: pass
+ cu.driver = 2 # Python expression
+ cu.driverExpression = '%.3f*(%s.evaluate(((b.Get("curframe")*%.3f)+%.3f,%.3f,%.3f)).w-0.5)' % (anim_magnitude, tex_str, anim_speed_final, anim_offset.x, anim_offset.y, anim_offset.z)
+
+ cu = ipo[Blender.Ipo.PO_QUATY]
+ try: cu.delBezier(0)
+ except: pass
+ cu.driver = 2 # Python expression
+ cu.driverExpression = '%.3f*(%s.evaluate((%.3f,(b.Get("curframe")*%.3f)+%.3f,%.3f)).w-0.5)' % (anim_magnitude, tex_str, anim_offset.x, anim_speed_final, anim_offset.y, anim_offset.z)
+
+ cu = ipo[Blender.Ipo.PO_QUATZ]
+ try: cu.delBezier(0)
+ except: pass
+ cu.driver = 2 # Python expression
+ cu.driverExpression = '%.3f*(%s.evaluate((%.3f,%.3f,(b.Get("curframe")*%.3f)+%.3f)).w-0.5)' % (anim_magnitude, tex_str, anim_offset.x, anim_offset.y, anim_speed_final, anim_offset.z)
+
+xyzup = Vector(1,1,1).normalize()
+xup = Vector(1,0,0)
+yup = Vector(0,1,0)
+zup = Vector(0,0,1)
+
+class bpoint_bone:
+ def __init__(self):
+ self.name = None
+ self.editbone = None
+ self.blenbone = None
+ self.posebone = None
+
+class bpoint(object):
+ ''' The point in the middle of the branch, not the mesh points
+ '''
+ __slots__ = 'branch', 'co', 'no', 'radius', 'vecs', 'verts', 'children', 'faces', 'uv', 'next', 'prev', 'childCount', 'bpbone', 'roll_angle', 'nextMidCo', 'childrenMidCo', 'childrenMidRadius', 'targetCos', 'inTwigBounds'
+ def __init__(self, brch, co, no, radius):
+ self.branch = brch
+ self.co = co
+ self.no = no
+ self.radius = radius
+ self.vecs = [None, None, None, None] # 4 for now
+ self.verts = [None, None, None, None]
+ self.children = [None, None, None, None] # child branches, dont fill in faces here
+ self.faces = [None, None, None, None]
+ self.uv = None # matching faces, except - UV's are calculated even if there is no face, this is so we can calculate the blending UV's
+ self.next = None
+ self.prev = None
+ self.childCount = 0
+ self.bpbone = None # bpoint_bone instance
+
+ # when set, This is the angle we need to roll to best face our branches
+ # the roll that is set may be interpolated if we are between 2 branches that need to roll.
+ # Set to None means that the roll will be left default (from parent)
+ self.roll_angle = None
+
+
+ # The location between this and the next point,
+ # if we want to be tricky we can try make this not just a simple
+ # inbetween and use the normals to have some curvature
+ self.nextMidCo = None
+
+ # Similar to above, median point of all children
+ self.childrenMidCo = None
+
+ # Similar as above, but for radius
+ self.childrenMidRadius = None
+
+ # Target locations are used when you want to move the point to a new location but there are
+ # more then 1 influence, build up a list and then apply
+ self.targetCos = []
+
+ # When we use twig bounding mesh, store if this point is in the bounding mesh. Assume true unless we set to false and do the test
+ self.inTwigBounds = True
+
+ def __repr__(self):
+ s = ''
+ s += '\t\tco:', self.co
+ s += '\t\tno:', self.no
+ s += '\t\tradius:', self.radius
+ s += '\t\tchildren:', [(child != False) for child in self.children]
+ return s
+
+ def makeLast(self):
+ self.next = None
+ self.nextMidCo = None
+ self.childrenMidCo = None
+
+ def setCo(self, co):
+ self.co[:] = co
+ self.calcNextMidCo()
+ self.calcNormal()
+
+ if self.prev:
+ self.prev.calcNextMidCo()
+ self.prev.calcNormal()
+ self.prev.calcChildrenMidData()
+
+ if self.next:
+ self.prev.calcNormal()
+
+ self.calcChildrenMidData()
+
+
+ def nextLength(self):
+ return (self.co-self.next.co).length
+ def prevLength(self):
+ return (self.co-self.prev.co).length
+
+ def hasOverlapError(self):
+ if self.prev == None:
+ return False
+ if self.next == None:
+ return False
+ '''
+ # see if this point sits on the line between its siblings.
+ co, fac = ClosestPointOnLine(self.co, self.prev.co, self.next.co)
+
+ if fac >= 0.0 and fac <= 1.0:
+ return False # no overlap, we are good
+ else:
+ return True # error, some overlap
+ '''
+
+
+ # Alternate method, maybe better
+ ln = self.nextLength()
+ lp = self.prevLength()
+ ls = (self.prev.co-self.next.co).length
+
+ # Are we overlapping? the length from our next or prev is longer then the next-TO-previous?
+ if ln>ls or lp>ls:
+ return True
+ else:
+ return False
+
+
+ def applyTargetLocation(self):
+ if not self.targetCos:
+ return False
+ elif len(self.targetCos) == 1:
+ self.setCo(self.targetCos[0])
+ else:
+ co_all = Vector()
+ for co in self.targetCos:
+ co_all += co
+
+ self.setCo(co_all / len(self.targetCos))
+ self.targetCos[:] = []
+ return True
+
+ def calcNextMidCo(self):
+ if not self.next:
+ return None
+
+ # be tricky later.
+ self.nextMidCo = (self.co + self.next.co) * 0.5
+
+ def calcNormal(self):
+ if self.prev == None:
+ self.no = (self.next.co - self.co).normalize()
+ elif self.next == None:
+ self.no = (self.co - self.prev.co).normalize()
+ else:
+ self.no = (self.next.co - self.prev.co).normalize()
+
+ def calcChildrenMidData(self):
+ '''
+ Calculate childrenMidCo & childrenMidRadius
+ This is a bit tricky, we need to find a point between this and the next,
+ the medium of all children, this point will be on the line between this and the next.
+ '''
+ if not self.next:
+ return None
+
+ # factor between this and the next point
+ radius = factor = factor_i = 0.0
+
+ count = 0
+ for brch in self.children:
+ if brch: # we dont need the co at teh moment.
+ co, fac = ClosestPointOnLine(brch.bpoints[0].co, self.co, self.next.co)
+ factor_i += fac
+ count += 1
+
+ radius += brch.bpoints[0].radius
+
+ if not count:
+ return
+
+ # interpolate points
+ factor_i = factor_i/count
+ factor = 1-factor_i
+
+ self.childrenMidCo = (self.co * factor) + (self.next.co * factor_i)
+ self.childrenMidRadius = radius
+
+ #debug_pt(self.childrenMidCo)
+
+ def getAbsVec(self, index):
+ # print self.vecs, index
+ return self.co + self.vecs[index]
+
+ def slide(self, factor):
+ '''
+ Slides the segment up and down using the prev and next points
+ '''
+ self.setCo(self.slideCo(factor))
+
+ def slideCo(self, factor):
+ if self.prev == None or self.next == None or factor==0.0:
+ return
+
+ if factor < 0.0:
+ prev_co = self.prev.co
+ co = self.co
+
+ ofs = co-prev_co
+ ofs.length = abs(factor)
+ self.co - ofs
+
+ return self.co - ofs
+ else:
+ next_co = self.next.co
+ co = self.co
+
+ ofs = co-next_co
+ ofs.length = abs(factor)
+
+ return self.co - ofs
+
+
+ def collapseDown(self):
+ '''
+ Collapse the next point into this one
+ '''
+
+ # self.next.next == None check is so we dont shorten the final length of branches.
+ if self.next == None or self.next.next == None or self.childCount or self.next.childCount:
+ return False
+
+ self.branch.bpoints.remove(self.next)
+ self.next = self.next.next # skip
+ self.next.prev = self
+
+ # Watch this place - must update all data thats needed. roll is not calculaetd yet.
+ self.calcNextMidCo()
+ return True
+
+ def collapseUp(self):
+ '''
+ Collapse the previous point into this one
+ '''
+
+ # self.next.next == None check is so we dont shorten the final length of branches.
+ if self.prev == None or self.prev.prev == None or self.prev.childCount or self.prev.prev.childCount:
+ return False
+
+ self.branch.bpoints.remove(self.prev)
+ self.prev = self.prev.prev # skip
+ self.prev.next = self
+
+ # Watch this place - must update all data thats needed. roll is not calculaetd yet.
+ self.prev.calcNextMidCo()
+ return True
+
+
+ def smooth(self, factor, factor_joint):
+ '''
+ Blend this point into the other 2 points
+ '''
+ if self.next == None or self.prev == None:
+ return False
+
+ if self.childCount or self.prev.childCount:
+ factor = factor_joint;
+
+ if factor==0.0:
+ return False;
+
+ radius = (self.next.radius + self.prev.radius)/2.0
+ no = (self.next.no + self.prev.no).normalize()
+
+ # do a line intersect to work out the best location
+ '''
+ cos = LineIntersect( self.next.co, self.next.co+self.next.no,\
+ self.prev.co, self.prev.co+self.prev.no)
+ if cos == None:
+ co = (self.prev.co + self.next.co)/2.0
+ else:
+ co = (cos[0]+cos[1])/2.0
+ '''
+ # Above can give odd results every now and then
+ co = (self.prev.co + self.next.co)/2.0
+
+ # Now apply
+ factor_i = 1.0-factor
+ self.setCo(self.co*factor_i + co*factor)
+ self.radius = self.radius*factor_i + radius*factor
+
+ return True
+
+ def childPoint(self, index):
+ '''
+ Returns the middle point for any children between this and the next edge
+ '''
+ if self.next == None:
+ raise 'Error'
+
+ if index == 0: return (self.getAbsVec(0) + self.next.getAbsVec(1)) / 2
+ if index == 1: return (self.getAbsVec(1) + self.next.getAbsVec(2)) / 2
+ if index == 2: return (self.getAbsVec(2) + self.next.getAbsVec(3)) / 2
+ if index == 3: return (self.getAbsVec(3) + self.next.getAbsVec(0)) / 2
+
+ def childPointUnused(self, index):
+ '''
+ Same as above but return None when the point is alredy used.
+ '''
+ if self.children[index]:
+ return None
+ return self.childPoint(index)
+
+
+ def roll(self, angle):
+ '''
+ Roll the quad about its normal
+ use for aurienting the sides of a quad to meet a branch that stems from here...
+ '''
+
+ mat = RotationMatrix(angle, 3, 'r', self.no)
+ for i in xrange(4):
+ self.vecs[i] = self.vecs[i] * mat
+
+
+ def toMesh(self, mesh):
+ self.verts[0].co = self.getAbsVec(0)
+ self.verts[1].co = self.getAbsVec(1)
+ self.verts[2].co = self.getAbsVec(2)
+ self.verts[3].co = self.getAbsVec(3)
+
+ if not self.next:
+ return
+
+ if self.prev == None and self.branch.parent_pt:
+ # join from parent branch
+
+ # which side are we of the parents quad
+ index = self.branch.parent_pt.children.index(self.branch)
+
+ # collect the points we are to merge into between the parent its next point
+ if index==0: verts = [self.branch.parent_pt.verts[0], self.branch.parent_pt.verts[1], self.branch.parent_pt.next.verts[1], self.branch.parent_pt.next.verts[0]]
+ if index==1: verts = [self.branch.parent_pt.verts[1], self.branch.parent_pt.verts[2], self.branch.parent_pt.next.verts[2], self.branch.parent_pt.next.verts[1]]
+ if index==2: verts = [self.branch.parent_pt.verts[2], self.branch.parent_pt.verts[3], self.branch.parent_pt.next.verts[3], self.branch.parent_pt.next.verts[2]]
+ if index==3: verts = [self.branch.parent_pt.verts[3], self.branch.parent_pt.verts[0], self.branch.parent_pt.next.verts[0], self.branch.parent_pt.next.verts[3]]
+
+
+ # Watchout for overlapping faces!
+ self.branch.faces[:] =\
+ [verts[0], verts[1], self.verts[1], self.verts[0]],\
+ [verts[1], verts[2], self.verts[2], self.verts[1]],\
+ [verts[2], verts[3], self.verts[3], self.verts[2]],\
+ [verts[3], verts[0], self.verts[0], self.verts[3]]
+
+ # normal join, parents or no parents
+ if not self.children[0]: self.faces[0] = [self.verts[0], self.verts[1], self.next.verts[1], self.next.verts[0]]
+ if not self.children[1]: self.faces[1] = [self.verts[1], self.verts[2], self.next.verts[2], self.next.verts[1]]
+ if not self.children[2]: self.faces[2] = [self.verts[2], self.verts[3], self.next.verts[3], self.next.verts[2]]
+ if not self.children[3]: self.faces[3] = [self.verts[3], self.verts[0], self.next.verts[0], self.next.verts[3]]
+
+ def calcVerts(self):
+ if self.prev == None:
+ if self.branch.parent_pt:
+ cross = CrossVecs(self.no, self.branch.getParentFaceCent() - self.branch.parent_pt.getAbsVec( self.branch.getParentQuadIndex() ))
+ else:
+ # parentless branch - for best results get a cross thats not the same as the normal, in rare cases this happens.
+
+ # Was just doing
+ # cross = zup
+ # which works most of the time, but no verticle lines
+
+ if AngleBetweenVecs(self.no, zup) > 1.0: cross = zup
+ elif AngleBetweenVecs(self.no, yup) > 1.0: cross = yup
+ else: cross = xup
+
+ else:
+ cross = CrossVecs(self.prev.vecs[0], self.no)
+
+ self.vecs[0] = Blender.Mathutils.CrossVecs(self.no, cross)
+ self.vecs[0].length = abs(self.radius)
+ mat = RotationMatrix(90, 3, 'r', self.no)
+ self.vecs[1] = self.vecs[0] * mat
+ self.vecs[2] = self.vecs[1] * mat
+ self.vecs[3] = self.vecs[2] * mat
+
+ def hasChildren(self):
+ '''
+ Use .childCount where possible, this does the real check
+ '''
+ if self.children.count(None) == 4:
+ return False
+ else:
+ return True
+
+class branch:
+ def __init__(self):
+ self.bpoints = []
+ self.parent_pt = None
+ self.tag = False # have we calculated our points
+ self.face_cap = None
+ self.length = -1
+ # self.totchildren = 0
+ # Bones per branch
+ self.faces = [None, None, None, None]
+ self.uv = None # face uvs can be fake, always 4
+ self.bones = []
+ self.generation = 0 # use to limit twig reproduction
+ self.twig_count = 0 # count the number of twigs - so as to limit how many twigs a branch gets
+ # self.myindex = -1
+ ### self.segment_spacing_scale = 1.0 # use this to scale up the spacing - so small twigs dont get WAY too many polys
+
+ def __repr__(self):
+ s = ''
+ s += '\tbranch'
+ s += '\tbpoints:', len(self.bpoints)
+ for pt in brch.bpoints:
+ s += str(self.pt)
+
+ def getNormal(self):
+ return (self.bpoints[-1].co - self.bpoints[0].co).normalize()
+
+ def getParentAngle(self):
+ if self.parent_pt:
+ return AngleBetweenVecs(self.parent_pt.no, self.bpoints[0].no )
+ else:
+ return 45.0
+
+ def getParentRadiusRatio(self):
+ if self.parent_pt:
+ return self.bpoints[0].radius / self.parent_pt.radius
+ else:
+ return 0.8
+
+ def getLength(self):
+ return (self.bpoints[0].co - self.bpoints[-1].co).length
+
+ def getStraightness(self):
+ straight = 0.0
+ pt = self.bpoints[0]
+ while pt.next:
+ straight += AngleBetweenVecs(pt.no, pt.next.no)
+ pt = pt.next
+ return straight
+
+
+ '''
+ def calcTotChildren(self):
+ for pt in self.bpoints:
+ self.totchildren += pt.childCount
+ '''
+ def calcData(self):
+ '''
+ Finalize once point data is there
+ '''
+ self.calcPointLinkedList()
+ self.calcPointExtras()
+
+ def calcPointLinkedList(self):
+ for i in xrange(1, len(self.bpoints)-1):
+ self.bpoints[i].next = self.bpoints[i+1]
+ self.bpoints[i].prev = self.bpoints[i-1]
+
+ self.bpoints[0].next = self.bpoints[1]
+ self.bpoints[-1].prev = self.bpoints[-2]
+
+ def calcPointExtras(self):
+ '''
+ Run on a new branch or after transforming an existing one.
+ '''
+ for pt in self.bpoints:
+ pt.calcNormal()
+ pt.calcNextMidCo()
+
+ def calcTwigBounds(self, tree):
+ '''
+ Check if out points are
+ '''
+ for pt in self.bpoints:
+ pt.inTwigBounds = tree.isPointInTwigBounds(pt.co)
+ #if pt.inTwigBounds:
+ # debug_pt(pt.co)
+
+ def baseTrim(self, connect_base_trim):
+ # if 1) dont remove the whole branch, maybe an option but later
+ # if 2) we are alredy a parent, cant remove me now.... darn :/ not nice...
+ # could do this properly but it would be slower and its a corner case.
+ #
+ # if 3) this point is within the branch, remove it.
+ # Scale this value by the difference in radius, a low trim looks better when the parent is a lot bigger..
+ #
+
+ while len(self.bpoints)>2 and\
+ self.bpoints[0].childCount == 0 and\
+ (self.parent_pt.nextMidCo - self.bpoints[0].co).length < ((self.parent_pt.radius + self.parent_pt.next.radius)/4) + (self.bpoints[0].radius * connect_base_trim):
+ # Note /4 - is a bit odd, since /2 is correct, but /4 lets us have more tight joints by default
+
+
+ del self.bpoints[0]
+ self.bpoints[0].prev = None
+
+ def boundsTrim(self):
+ '''
+ depends on calcTwigBounds running first. - also assumes no children assigned yet! make sure this is always the case.
+ '''
+ trim = False
+ for i, pt in enumerate(self.bpoints):
+ if not pt.inTwigBounds:
+ trim = True
+ break
+
+ # We must have at least 2 points to be a valid branch. this will be a stump :/
+ if not trim or i < 3:
+ self.bpoints = [] #
+ return
+
+ # Shorten the point list
+ self.bpoints = self.bpoints[:i]
+ self.bpoints[-1].makeLast()
+
+ def taper(self, twig_ob_bounds_prune_taper = 0.0):
+ l = float(len( self.bpoints ))
+ for i, pt in enumerate(self.bpoints):
+ pt.radius *= (((l-i)/l) + (twig_ob_bounds_prune_taper*(i/l)) )
+
+ def getParentBranch(self):
+ if not self.parent_pt:
+ return None
+ return self.parent_pt.branch
+
+ def getParentQuadAngle(self):
+ '''
+ The angle off we are from our parent quad,
+ '''
+ # used to roll the parent so its faces us better
+
+ # Warning this can be zero sometimes, see the try below for the error
+ parent_normal = self.getParentFaceCent() - self.parent_pt.nextMidCo
+
+
+ self_normal = self.bpoints[1].co - self.parent_pt.co
+ # We only want the angle in relation to the parent points normal
+ # modify self_normal to make this so
+ cross = CrossVecs(self_normal, self.parent_pt.no)
+ self_normal = CrossVecs(self.parent_pt.no, cross) # CHECK
+
+ #try: angle = AngleBetweenVecs(parent_normal, self_normal)
+ #except: return 0.0
+ angle = AngleBetweenVecs(parent_normal, self_normal)
+
+
+ # see if we need to rotate positive or negative
+ # USE DOT PRODUCT!
+ cross = CrossVecs(parent_normal, self_normal)
+ if AngleBetweenVecs(cross, self.parent_pt.no) > 90:
+ angle = -angle
+
+ return angle
+
+ def getParentQuadIndex(self):
+ return self.parent_pt.children.index(self)
+ def getParentFaceCent(self):
+ return self.parent_pt.childPoint( self.getParentQuadIndex() )
+
+ def findClosest(self, co):
+ '''
+ Find the closest point that can bare a child
+ '''
+
+
+ ''' # this dosnt work, but could.
+ best = None
+ best_dist = 100000000
+ for pt in self.bpoints:
+ if pt.next:
+ co_on_line, fac = ClosestPointOnLine(co, pt.co, pt.next.co)
+ print fac
+ if fac >= 0.0 and fac <= 1.0:
+ return pt, (co-co_on_line).length
+
+ return best, best_dist
+ '''
+ best = None
+ best_dist = 100000000
+ for pt in self.bpoints:
+ if pt.nextMidCo and pt.childCount < 4:
+ dist = (pt.nextMidCo-co).length
+ if dist < best_dist:
+ best = pt
+ best_dist = dist
+
+ return best, best_dist
+
+ def inParentChain(self, brch):
+ '''
+ See if this branch is a parent of self or in the chain
+ '''
+
+ self_parent_lookup = self.getParentBranch()
+ while self_parent_lookup:
+ if self_parent_lookup == brch:
+ return True
+ self_parent_lookup = self_parent_lookup.getParentBranch()
+
+ return False
+
+ def transform(self, mat, loc=None, scale=None):
+ if scale==None:
+ scale = (xyzup * mat).length
+
+ for pt in self.bpoints:
+ if loc:
+ pt.co = (pt.co * mat) + loc
+ else:
+ pt.co = pt.co * mat
+ pt.radius *= scale
+
+ for pt in self.bpoints:
+ self.calcPointExtras()
+
+ def translate(self, co):
+ '''
+ Simply move the twig on the branch
+ '''
+ ofs = self.bpoints[0].co-co
+ for pt in self.bpoints:
+ pt.co -= ofs
+
+ def transformRecursive(self, tree, mat3x3, cent, scale=None):
+
+ if scale==None:
+ # incase this is a translation matrix
+ scale = ((xyzup * mat3x3) - (Vector(0,0,0) * mat3x3)).length
+
+ for pt in self.bpoints: pt.co = ((pt.co-cent) * mat3x3) + cent
+ #for pt in self.bpoints: pt.co = (pt.co * mat3x3)
+ for pt in self.bpoints: self.calcPointExtras()
+
+
+ for brch in tree.branches_all:
+ if brch.parent_pt:
+ if brch.parent_pt.branch == self:
+
+ brch.transformRecursive(tree, mat3x3, cent, scale)
+
+ '''
+ for pt in self.bpoints:
+ for brch in pt.children:
+ if brch:
+ brch.transformRecursive(mat3x3, cent, scale)
+ '''
+ def bestTwigSegment(self):
+ '''
+ Return the most free part on the branch to place a new twig
+ return (sort_value, best_index, self)
+ '''
+
+ # loop up and down the branch - counding how far from the last parent segment we are
+ spacing1 = [0] * (len(self.bpoints)-1)
+ spacing2 = spacing1[:]
+
+ step_from_parent = 0
+ for i in xrange(len(spacing1)): # -1 because the last pt cant have kits
+
+ if self.bpoints[i].childCount or self.bpoints[i].inTwigBounds==False:
+ step_from_parent = 0
+ else:
+ step_from_parent += 1
+
+ spacing1[i] += step_from_parent # -1 because the last pt cant have kits
+
+ best_index = -1
+ best_val = -1
+ step_from_parent = 0
+ for i in xrange(len(spacing1)-1, -1, -1):
+
+ if self.bpoints[i].childCount or self.bpoints[i].inTwigBounds==False:
+ step_from_parent = 0
+ else:
+ step_from_parent += 1
+
+ spacing2[i] += step_from_parent
+
+ # inTwigBounds is true by default, when twigBounds are used it can be false
+ if self.bpoints[i].childCount < 4 and self.bpoints[i].inTwigBounds:
+ # Dont allow to assign more verts then 4
+ val = spacing1[i] * spacing2[i]
+ if val > best_val:
+ best_val = val
+ best_index = i
+
+ #if best_index == -1:
+ # raise "Error"
+
+ # This value is only used for sorting, so the lower the value - the sooner it gets a twig.
+ #sort_val = -best_val + (1/self.getLength())
+ sort_val=self.getLength()
+
+ return sort_val, best_index, self
+
+ def evenPointDistrobution(self, factor=1.0, factor_joint=1.0):
+ '''
+ Redistribute points that are not evenly distributed
+ factor is between 0.0 and 1.0
+ '''
+
+ for pt in self.bpoints:
+ if pt.next and pt.prev and pt.childCount == 0 and pt.prev.childCount == 0:
+ w1 = pt.nextLength()
+ w2 = pt.prevLength()
+ wtot = w1+w2
+ if wtot > 0.0:
+ w1=w1/wtot
+ #w2=w2/wtot
+ w1 = abs(w1-0.5)*2 # make this from 0.0 to 1.0, where 0 is the middle and 1.0 is as far out of the middle as possible.
+ # print "%.6f" % w1
+ pt.smooth(w1*factor, w1*factor_joint)
+
+ def fixOverlapError(self, joint_smooth=1.0):
+ # Keep fixing until no hasOverlapError left to fix.
+ error = True
+ while error:
+ error = False
+ for pt in self.bpoints:
+ if pt.prev and pt.next:
+ if pt.hasOverlapError():
+ if pt.smooth(1.0, joint_smooth): # if we cant fix then dont bother trying again.
+ error = True
+
+ def evenJointDistrobution(self, joint_compression = 1.0):
+ # See if we need to evaluate this branch at all
+ if len(self.bpoints) <= 2: # Rare but in this case we cant do anything
+ return
+ has_children = False
+ for pt in self.bpoints:
+ if pt.childCount:
+ has_children = True
+ break
+
+ if not has_children:
+ return
+
+ # OK, we have children, so we have some work to do...
+ # center each segment
+
+ # work out the median location of all points children.
+ for pt in self.bpoints:
+ pt.calcChildrenMidData()
+
+ for pt in self.bpoints:
+ pt.targetCos = []
+ if pt.childrenMidCo:
+ # Move this and the next segment to be around the child point.
+ # TODO - factor in the branch angle, be careful with this - close angles can have extreme values.
+ co = pt.slideCo( (pt.childrenMidCo - pt.co).length - (pt.childrenMidRadius * joint_compression) )
+ if co:
+ pt.targetCos.append( co )
+
+ co = pt.next.slideCo((pt.childrenMidRadius * joint_compression) - (pt.childrenMidCo - pt.next.co).length )
+ if co:
+ pt.next.targetCos.append( co )
+
+ for pt in self.bpoints:
+ pt.applyTargetLocation()
+
+ def collapsePoints(self, seg_density=0.5, seg_density_angle=20.0, seg_density_radius=0.3, smooth_joint=1.0):
+
+ collapse = True
+ while collapse:
+ collapse = False
+ pt = self.bpoints[0]
+ while pt:
+ # Collapse angles greater then 90. they are useually artifacts
+
+ if pt.prev and pt.next and pt.prev.childCount == 0:
+ if (pt.radius + pt.prev.radius) != 0.0 and abs(pt.radius - pt.prev.radius) / (pt.radius + pt.prev.radius) < seg_density_radius:
+ ang = AngleBetweenVecs(pt.no, pt.prev.no)
+ if seg_density_angle == 180 or ang > 90 or ang < seg_density_angle:
+ ## if (pt.prev.nextMidCo-pt.co).length < ((pt.radius + pt.prev.radius)/2) * seg_density:
+ if (pt.prev.nextMidCo-pt.co).length < seg_density or ang > 90:
+ pt_save = pt.prev
+ if pt.next.collapseUp(): # collapse this point
+ collapse = True
+ pt = pt_save # so we never reference a removed point
+
+ if pt.childCount == 0 and pt.next: #if pt.childrenMidCo == None:
+ if (pt.radius + pt.next.radius) != 0.0 and abs(pt.radius - pt.next.radius) / (pt.radius + pt.next.radius) < seg_density_radius:
+ ang = AngleBetweenVecs(pt.no, pt.next.no)
+ if seg_density_angle == 180 or ang > 90 or ang < seg_density_angle:
+ # do here because we only want to run this on points with no children,
+ # Are we closer theto eachother then the radius?
+ ## if (pt.nextMidCo-pt.co).length < ((pt.radius + pt.next.radius)/2) * seg_density:
+ if (pt.nextMidCo-pt.co).length < seg_density or ang > 90:
+ if pt.collapseDown():
+ collapse = True
+
+ pt = pt.next
+ ## self.checkPointList()
+ self.evenPointDistrobution(1.0, smooth_joint)
+
+ for pt in self.bpoints:
+ pt.calcNormal()
+ pt.calcNextMidCo()
+
+ def branchReJoin(self):
+ '''
+ Not needed but nice to run after collapsing incase segments moved a lot
+ '''
+ if not self.parent_pt:
+ return # nothing to do
+
+ # see if the next segment is closer now (after collapsing)
+ parent_pt = self.parent_pt
+ root_pt = self.bpoints[0]
+
+ #try:
+ index = parent_pt.children.index(self)
+ #except:
+ #print "This is bad!, but not being able to re-join isnt that big a deal"
+
+ current_dist = (parent_pt.nextMidCo - root_pt.co).length
+
+ # TODO - Check size of new area is ok to move into
+
+ if parent_pt.next and parent_pt.next.next and parent_pt.next.children[index] == None:
+ # We can go here if we want, see if its better
+ if current_dist > (parent_pt.next.nextMidCo - root_pt.co).length:
+ self.parent_pt.children[index] = None
+ self.parent_pt.childCount -= 1
+
+ self.parent_pt = parent_pt.next
+ self.parent_pt.children[index] = self
+ self.parent_pt.childCount += 1
+ return
+
+ if parent_pt.prev and parent_pt.prev.children[index] == None:
+ # We can go here if we want, see if its better
+ if current_dist > (parent_pt.prev.nextMidCo - root_pt.co).length:
+ self.parent_pt.children[index] = None
+ self.parent_pt.childCount -= 1
+
+ self.parent_pt = parent_pt.prev
+ self.parent_pt.children[index] = self
+ self.parent_pt.childCount += 1
+ return
+
+ def checkPointList(self):
+ '''
+ Error checking. use to check if collapsing worked.
+ '''
+ p_link = self.bpoints[0]
+ i = 0
+ while p_link:
+ if self.bpoints[i] != p_link:
+ raise "Error"
+
+ if p_link.prev and p_link.prev != self.bpoints[i-1]:
+ raise "Error Prev"
+
+ if p_link.next and p_link.next != self.bpoints[i+1]:
+ raise "Error Next"
+
+ p_link = p_link.next
+ i+=1
+
+ def mixToNew(self, other, BLEND_MODE):
+ '''
+ Generate a new branch based on 2 existing ones
+ These branches will point 'zup' - aurient 'xup' and have a tip length of 1.0
+ '''
+
+ # Lets be lazy! - if the branches are different sizes- use the shortest.
+ # brch1 is always smaller
+
+ brch1 = self
+ brch2 = other
+ if len(brch1.bpoints) > len(brch2.bpoints):
+ brch1, brch2 = brch2, brch1
+
+ if len(brch1.bpoints) == 1:
+ return None
+
+ co_start = brch1.bpoints[0].co
+ cos1 = [ pt.co - co_start for pt in brch1.bpoints ]
+
+ co_start = brch2.bpoints[0].co
+ if len(brch1.bpoints) == len(brch2.bpoints):
+ cos2 = [ pt.co - co_start for pt in brch2.bpoints ]
+ else: # truncate the points
+ cos2 = [ brch2.bpoints[i].co - co_start for i in xrange(len(brch1.bpoints)) ]
+
+ scales = []
+ for cos_ls in (cos1, cos2):
+ cross = CrossVecs(cos_ls[-1], zup)
+ mat = RotationMatrix(AngleBetweenVecs(cos_ls[-1], zup), 3, 'r', cross)
+ cos_ls[:] = [co*mat for co in cos_ls]
+
+ # point z-up
+
+ # Now they are both pointing the same way aurient the curves to be rotated the same way
+ xy_nor = Vector(0,0,0)
+ for co in cos_ls:
+ xy_nor.x += co.x
+ xy_nor.y += co.y
+ cross = CrossVecs(xy_nor, xup)
+
+ # Also scale them here so they are 1.0 tall always
+ scale = 1.0/(cos_ls[0]-cos_ls[-1]).length
+ mat = RotationMatrix(AngleBetweenVecs(xy_nor, xup), 3, 'r', cross) * Matrix([scale,0,0],[0,scale,0],[0,0,scale])
+ cos_ls[:] = [co*mat for co in cos_ls]
+
+ scales.append(scale)
+
+ # Make the new branch
+ new_brch = branch()
+ for i in xrange(len(cos1)):
+ new_brch.bpoints.append( bpoint(new_brch, (cos1[i]+cos2[i])*0.5, Vector(), (brch1.bpoints[i].radius*scales[0] + brch2.bpoints[i].radius*scales[1])/2) )
+
+ new_brch.calcData()
+ return new_brch
+
+
+ def toMesh(self):
+ pass
+
+
+
+
+
+# No GUI code above this! ------------------------------------------------------
+
+# PREFS - These can be saved on the object's id property. use 'tree2curve' slot
+from Blender import Draw
+import BPyWindow
+ID_SLOT_NAME = 'Curve2Tree'
+
+EVENT_NONE = 0
+EVENT_EXIT = 1
+EVENT_UPDATE = 2
+EVENT_UPDATE_AND_UI = 2
+EVENT_REDRAW = 3
+
+
+# Prefs for each tree
+PREFS = {}
+PREFS['connect_sloppy'] = Draw.Create(1.0)
+PREFS['connect_base_trim'] = Draw.Create(1.0)
+PREFS['seg_density'] = Draw.Create(0.5)
+PREFS['seg_density_angle'] = Draw.Create(20.0)
+PREFS['seg_density_radius'] = Draw.Create(0.3)
+PREFS['seg_joint_compression'] = Draw.Create(1.0)
+PREFS['seg_joint_smooth'] = Draw.Create(2.0)
+PREFS['image_main'] = Draw.Create('')
+PREFS['do_uv'] = Draw.Create(0)
+PREFS['uv_x_scale'] = Draw.Create(4.0)
+PREFS['uv_y_scale'] = Draw.Create(1.0)
+PREFS['do_material'] = Draw.Create(0)
+PREFS['material_use_existing'] = Draw.Create(1)
+PREFS['material_texture'] = Draw.Create(1)
+PREFS['material_stencil'] = Draw.Create(1)
+PREFS['do_subsurf'] = Draw.Create(1)
+PREFS['do_cap_ends'] = Draw.Create(0)
+PREFS['do_uv_keep_vproportion'] = Draw.Create(1)
+PREFS['do_uv_vnormalize'] = Draw.Create(0)
+PREFS['do_uv_uscale'] = Draw.Create(0)
+PREFS['do_armature'] = Draw.Create(0)
+PREFS['do_anim'] = Draw.Create(1)
+try: PREFS['anim_tex'] = Draw.Create([tex for tex in bpy.data.textures][0].name)
+except: PREFS['anim_tex'] = Draw.Create('')
+
+PREFS['anim_speed'] = Draw.Create(0.2)
+PREFS['anim_magnitude'] = Draw.Create(0.2)
+PREFS['anim_speed_size_scale'] = Draw.Create(1)
+PREFS['anim_offset_scale'] = Draw.Create(1.0)
+
+PREFS['do_twigs_fill'] = Draw.Create(0)
+PREFS['twig_fill_levels'] = Draw.Create(4)
+
+PREFS['twig_fill_rand_scale'] = Draw.Create(0.0)
+PREFS['twig_fill_fork_angle_max'] = Draw.Create(60.0)
+PREFS['twig_fill_radius_min'] = Draw.Create(0.001)
+PREFS['twig_fill_radius_factor'] = Draw.Create(0.75)
+PREFS['twig_fill_shape_type'] = Draw.Create(0)
+PREFS['twig_fill_shape_rand'] = Draw.Create(0.0)
+PREFS['twig_fill_shape_power'] = Draw.Create(0.3)
+
+PREFS['do_twigs'] = Draw.Create(0)
+PREFS['twig_ratio'] = Draw.Create(2.0)
+PREFS['twig_select_mode'] = Draw.Create(0)
+PREFS['twig_select_factor'] = Draw.Create(0.5)
+PREFS['twig_scale'] = Draw.Create(0.8)
+PREFS['twig_scale_width'] = Draw.Create(1.0)
+PREFS['twig_random_orientation'] = Draw.Create(180)
+PREFS['twig_random_angle'] = Draw.Create(33)
+PREFS['twig_recursive'] = Draw.Create(1)
+PREFS['twig_recursive_limit'] = Draw.Create(3)
+PREFS['twig_ob_bounds'] = Draw.Create('') # WATCH out, used for do_twigs_fill AND do_twigs
+PREFS['twig_ob_bounds_prune'] = Draw.Create(1)
+PREFS['twig_ob_bounds_prune_taper'] = Draw.Create(1.0)
+PREFS['twig_placement_maxradius'] = Draw.Create(10.0)
+PREFS['twig_placement_maxtwig'] = Draw.Create(4)
+PREFS['twig_follow_parent'] = Draw.Create(0.0)
+PREFS['twig_follow_x'] = Draw.Create(0.0)
+PREFS['twig_follow_y'] = Draw.Create(0.0)
+PREFS['twig_follow_z'] = Draw.Create(0.0)
+
+PREFS['do_leaf'] = Draw.Create(0)
+PREFS['leaf_fill'] = Draw.Create(1)
+PREFS['leaf_fill_count'] = Draw.Create(1000)
+PREFS['leaf_fill_ob_bounds'] = Draw.Create('')
+
+PREFS['leaf_branch_limit'] = Draw.Create(0.25)
+PREFS['leaf_branch_limit_rand'] = Draw.Create(0.1)
+PREFS['leaf_size'] = Draw.Create(0.5)
+
+PREFS['leaf_dupliface'] = Draw.Create(0)
+PREFS['leaf_dupliface_fromgroup'] = Draw.Create('')
+
+PREFS['do_variation'] = Draw.Create(0)
+PREFS['variation_seed'] = Draw.Create(1)
+PREFS['variation_orientation'] = Draw.Create(0.0)
+PREFS['variation_scale'] = Draw.Create(0.0)
+
+GLOBAL_PREFS = {}
+GLOBAL_PREFS['realtime_update'] = Draw.Create(0)
+
+
+def getContextCurveObjects():
+ sce = bpy.data.scenes.active
+ objects = []
+ ob_act = sce.objects.active
+ for ob in sce.objects.context:
+ if ob == ob_act: ob_act = None
+
+ if ob.type != 'Curve':
+ ob = ob.parent
+ if not ob or ob.type != 'Curve':
+ continue
+ objects.append(ob)
+
+ # Alredy delt with
+
+
+ # Add the active, important when using localview or local layers
+ if ob_act:
+ ob = ob_act
+ if ob.type != 'Curve':
+ ob = ob.parent
+ if not ob or ob.type != 'Curve':
+ pass
+ else:
+ objects.append(ob)
+
+ return objects
+
+
+def Prefs2Dict(prefs, new_prefs):
+ '''
+ Make a copy with no button settings
+ '''
+ new_prefs.clear()
+ for key, val in prefs.items():
+ try: new_prefs[key] = val.val
+ except: new_prefs[key] = val
+ return new_prefs
+
+def Dict2Prefs(prefs, new_prefs):
+ '''
+ Make a copy with button settings
+ '''
+ for key in prefs: # items would be nice for id groups
+ val = prefs[key]
+ ok = True
+
+ try:
+ # If we have this setting allredy but its a different type, use the old setting (converting int's to floats for instance)
+ new_val = new_prefs[key] # this may fail, thats ok
+ if (type(new_val)==Blender.Types.ButtonType) and (type(new_val.val) != type(val)):
+ ok = False
+ except:
+ pass
+
+ if ok:
+ try:
+ new_prefs[key] = Blender.Draw.Create( val )
+ except:
+ new_prefs[key] = val
+
+ return new_prefs
+
+def Prefs2IDProp(idprop, prefs):
+ new_prefs = {}
+ Prefs2Dict(prefs, new_prefs)
+ try: del idprop[ID_SLOT_NAME]
+ except: pass
+
+ idprop[ID_SLOT_NAME] = new_prefs
+
+def IDProp2Prefs(idprop, prefs):
+ try:
+ prefs = idprop[ID_SLOT_NAME]
+ except:
+ return False
+ Dict2Prefs(prefs, PREFS)
+ return True
+
+def buildTree(ob_curve, single=False):
+ '''
+ Must be a curve object, write to a child mesh
+ Must check this is a curve object!
+ '''
+ print 'Curve2Tree, starting...'
+ # if were only doing 1 object, just use the current prefs
+ prefs = {}
+
+ if single or not (IDProp2Prefs(ob_curve.properties, prefs)):
+ prefs = PREFS
+
+
+ # Check prefs are ok.
+
+
+ sce = bpy.data.scenes.active
+
+ def getObChild(parent, obtype):
+ try:
+ return [ _ob for _ob in sce.objects if _ob.type == obtype if _ob.parent == parent ][0]
+ except:
+ return None
+
+ def newObChild(parent, obdata):
+
+ ob_new = bpy.data.scenes.active.objects.new(obdata)
+ # ob_new.Layers = parent.Layers
+
+ # new object settings
+ parent.makeParent([ob_new])
+ ob_new.setMatrix(Matrix())
+ ob_new.sel = 0
+ return ob_new
+
+ def hasModifier(modtype):
+ return len([mod for mod in ob_mesh.modifiers if mod.type == modtype]) > 0
+
+
+ sce = bpy.data.scenes.active
+
+ if PREFS['image_main'].val:
+ try: image = bpy.data.images[PREFS['image_main'].val]
+ except: image = None
+ else: image = None
+
+ # Get the mesh child
+
+ print '\treading blenders curves...',
+ time1 = Blender.sys.time()
+
+ t = tree()
+ t.fromCurve(ob_curve)
+ if not t.branches_all:
+ return # Empty curve? - may as well not throw an error
+
+ time2 = Blender.sys.time() # time print
+ """
+ print '%.4f sec' % (time2-time1)
+ if PREFS['do_twigs'].val:
+ print '\tbuilding twigs...',
+ t.buildTwigs(ratio=PREFS['twig_ratio'].val)
+ time3 = Blender.sys.time() # time print
+ print '%.4f sec' % (time3 - time2)
+ """
+ if 0: pass
+ else:
+ time3 = Blender.sys.time() # time print
+
+ print '\tconnecting branches...',
+
+ twig_ob_bounds = getObFromName(PREFS['twig_ob_bounds'].val)
+
+ t.buildConnections(\
+ sloppy = PREFS['connect_sloppy'].val,\
+ connect_base_trim = PREFS['connect_base_trim'].val,\
+ do_twigs = PREFS['do_twigs'].val,\
+ twig_ratio = PREFS['twig_ratio'].val,\
+ twig_select_mode = PREFS['twig_select_mode'].val,\
+ twig_select_factor = PREFS['twig_select_factor'].val,\
+ twig_scale = PREFS['twig_scale'].val,\
+ twig_scale_width = PREFS['twig_scale_width'].val,\
+ twig_random_orientation = PREFS['twig_random_orientation'].val,\
+ twig_random_angle = PREFS['twig_random_angle'].val,\
+ twig_recursive = PREFS['twig_recursive'].val,\
+ twig_recursive_limit = PREFS['twig_recursive_limit'].val,\
+ twig_ob_bounds = twig_ob_bounds,\
+ twig_ob_bounds_prune = PREFS['twig_ob_bounds_prune'].val,\
+ twig_ob_bounds_prune_taper = PREFS['twig_ob_bounds_prune_taper'].val,\
+ twig_placement_maxradius = PREFS['twig_placement_maxradius'].val,\
+ twig_placement_maxtwig = PREFS['twig_placement_maxtwig'].val,\
+ twig_follow_parent = PREFS['twig_follow_parent'].val,\
+ twig_follow_x = PREFS['twig_follow_x'].val,\
+ twig_follow_y = PREFS['twig_follow_y'].val,\
+ twig_follow_z = PREFS['twig_follow_z'].val,\
+ do_variation = PREFS['do_variation'].val,\
+ variation_seed = PREFS['variation_seed'].val,\
+ variation_orientation = PREFS['variation_orientation'].val,\
+ variation_scale = PREFS['variation_scale'].val,\
+ do_twigs_fill = PREFS['do_twigs_fill'].val,\
+ twig_fill_levels = PREFS['twig_fill_levels'].val,\
+ twig_fill_rand_scale = PREFS['twig_fill_rand_scale'].val,\
+ twig_fill_fork_angle_max = PREFS['twig_fill_fork_angle_max'].val,\
+ twig_fill_radius_min = PREFS['twig_fill_radius_min'].val,\
+ twig_fill_radius_factor = PREFS['twig_fill_radius_factor'].val,\
+ twig_fill_shape_type = PREFS['twig_fill_shape_type'].val,\
+ twig_fill_shape_rand = PREFS['twig_fill_shape_rand'].val,\
+ twig_fill_shape_power = PREFS['twig_fill_shape_power'].val,\
+ )
+
+ time4 = Blender.sys.time() # time print
+ print '%.4f sec' % (time4-time3)
+ print '\toptimizing point spacing...',
+
+ t.optimizeSpacing(\
+ seg_density=PREFS['seg_density'].val,\
+ seg_density_angle=PREFS['seg_density_angle'].val,\
+ seg_density_radius=PREFS['seg_density_radius'].val,\
+ joint_compression = PREFS['seg_joint_compression'].val,\
+ joint_smooth = PREFS['seg_joint_smooth'].val\
+ )
+
+ time5 = Blender.sys.time() # time print
+ print '%.4f sec' % (time5-time4)
+ print '\tbuilding mesh...',
+
+ ob_mesh = getObChild(ob_curve, 'Mesh')
+ if not ob_mesh:
+ # New object
+ mesh = bpy.data.meshes.new('tree_' + ob_curve.name)
+ ob_mesh = newObChild(ob_curve, mesh)
+ # do subsurf later
+
+ else:
+ # Existing object
+ mesh = ob_mesh.getData(mesh=1)
+ ob_mesh.setMatrix(Matrix())
+
+ # Do we need a do_uv_blend_layer?
+ if PREFS['material_stencil'].val and PREFS['material_texture'].val:
+ do_uv_blend_layer = True
+ else:
+ do_uv_blend_layer = False
+
+ mesh = t.toMesh(mesh,\
+ do_uv = PREFS['do_uv'].val,\
+ uv_image = image,\
+ do_uv_keep_vproportion = PREFS['do_uv_keep_vproportion'].val,\
+ do_uv_vnormalize = PREFS['do_uv_vnormalize'].val,\
+ do_uv_uscale = PREFS['do_uv_uscale'].val,\
+ uv_x_scale = PREFS['uv_x_scale'].val,\
+ uv_y_scale = PREFS['uv_y_scale'].val,\
+ do_uv_blend_layer = do_uv_blend_layer,\
+ do_cap_ends = PREFS['do_cap_ends'].val
+ )
+
+ if PREFS['do_leaf'].val:
+ ob_leaf = getObChild(ob_mesh, 'Mesh')
+ if not ob_leaf: # New object
+ mesh_leaf = bpy.data.meshes.new('leaf_' + ob_curve.name)
+ ob_leaf = newObChild(ob_mesh, mesh_leaf)
+ else:
+ mesh_leaf = ob_leaf.getData(mesh=1)
+ ob_leaf.setMatrix(Matrix())
+
+ leaf_dupliface_fromgroup = getGroupFromName(PREFS['leaf_dupliface_fromgroup'].val)
+
+ leaf_fill_ob_bounds = getObFromName(PREFS['leaf_fill_ob_bounds'].val)
+
+ mesh_leaf = t.toLeafMesh(mesh_leaf,\
+ leaf_branch_limit = PREFS['leaf_branch_limit'].val,\
+ leaf_branch_limit_rand = PREFS['leaf_branch_limit_rand'].val,\
+ leaf_size = PREFS['leaf_size'].val,\
+
+ leaf_fill = PREFS['leaf_fill'].val,\
+ leaf_fill_count = PREFS['leaf_fill_count'].val,\
+ leaf_fill_ob_bounds = leaf_fill_ob_bounds,\
+
+ leaf_dupliface = PREFS['leaf_dupliface'].val,\
+ leaf_dupliface_fromgroup = leaf_dupliface_fromgroup,\
+ )
+
+ if PREFS['leaf_dupliface'].val and leaf_dupliface_fromgroup:
+ ob_leaf.enableDupFaces = True
+ ob_leaf.enableDupFacesScale = True
+ for ob_group in leaf_dupliface_fromgroup.objects:
+ pass
+
+ ob_leaf.makeParent([ob_group])
+ else:
+ ob_leaf.enableDupFaces = False
+
+ mesh.calcNormals()
+
+ if PREFS['do_material'].val:
+
+ materials = mesh.materials
+ if PREFS['material_use_existing'].val and materials:
+ t.material = materials[0]
+ else:
+ t.material = bpy.data.materials.new(ob_curve.name)
+ mesh.materials = [t.material]
+
+ if PREFS['material_texture'].val:
+
+ # Set up the base image texture
+ t.texBase = bpy.data.textures.new('base_' + ob_curve.name)
+ t.material.setTexture(0, t.texBase, Blender.Texture.TexCo.UV, Blender.Texture.MapTo.COL)
+ t.texBase.type = Blender.Texture.Types.IMAGE
+ if image:
+ t.texBase.image = image
+ t.texBaseMTex = t.material.getTextures()[0]
+ t.texBaseMTex.uvlayer = 'base'
+
+ if PREFS['material_stencil'].val:
+ # Set up the blend texture
+ t.texBlend = bpy.data.textures.new('blend_' + ob_curve.name)
+ t.material.setTexture(1, t.texBlend, Blender.Texture.TexCo.UV, 0) # map to None
+ t.texBlend.type = Blender.Texture.Types.BLEND
+ t.texBlend.flags |= Blender.Texture.Flags.FLIPBLEND
+ t.texBlendMTex = t.material.getTextures()[1]
+ t.texBlendMTex.stencil = True
+ t.texBlendMTex.uvlayer = 'blend'
+
+
+ # Now make the texture for the stencil to blend, can reuse texBase here, jus tdifferent settings for the mtex
+ t.material.setTexture(2, t.texBase, Blender.Texture.TexCo.UV, Blender.Texture.MapTo.COL)
+ t.texJoinMTex = t.material.getTextures()[2]
+ t.texJoinMTex.uvlayer = 'join'
+
+ # Add a UV layer for blending
+
+
+
+
+ time6 = Blender.sys.time() # time print
+ print '%.4f sec' % (time6-time5)
+
+ # Do armature stuff....
+ if PREFS['do_armature'].val:
+
+ print '\tbuilding armature & animation...',
+
+ ob_arm = getObChild(ob_curve, 'Armature')
+ if ob_arm:
+ armature = ob_arm.data
+ ob_arm.setMatrix(Matrix())
+ else:
+ armature = bpy.data.armatures.new()
+ ob_arm = newObChild(ob_curve, armature)
+
+ t.toArmature(ob_arm, armature)
+
+ # Add the modifier.
+ if not hasModifier(Blender.Modifier.Types.ARMATURE):
+ mod = ob_mesh.modifiers.append(Blender.Modifier.Types.ARMATURE)
+
+ # TODO - assigne object anyway, even if an existing modifier exists.
+ mod[Blender.Modifier.Settings.OBJECT] = ob_arm
+
+ if PREFS['do_anim'].val:
+ try:
+ tex = bpy.data.textures[PREFS['anim_tex'].val]
+ except:
+ tex = None
+ Blender.Draw.PupMenu('error no texture, cannot animate bones')
+
+ if tex:
+ t.toAction(ob_arm, tex,\
+ anim_speed = PREFS['anim_speed'].val,\
+ anim_magnitude = PREFS['anim_magnitude'].val,\
+ anim_speed_size_scale= PREFS['anim_speed_size_scale'].val,\
+ anim_offset_scale=PREFS['anim_offset_scale'].val
+ )
+
+ time7 = Blender.sys.time() # time print
+ print '%.4f sec\n' % (time7-time6)
+ else:
+ time7 = Blender.sys.time() # time print
+
+ print 'done in %.4f sec' % (time7 - time1)
+
+ # Add subsurf last it needed. so armature skinning is done first.
+ # Do subsurf?
+ if PREFS['do_subsurf'].val:
+ if not hasModifier(Blender.Modifier.Types.SUBSURF):
+ mod = ob_mesh.modifiers.append(Blender.Modifier.Types.SUBSURF)
+
+ #ob_mesh.makeDisplayList()
+ #mesh.update()
+ bpy.data.scenes.active.update()
+
+def do_pref_read(e=0,v=0, quiet=False):
+ '''
+ We dont care about e and v values, only there because its a callback
+ '''
+ sce = bpy.data.scenes.active
+ ob = sce.objects.active
+
+ if not ob:
+ if not quiet:
+ Blender.Draw.PupMenu('No active curve object')
+ return
+
+ if ob.type != 'Curve':
+ ob = ob.parent
+
+ if ob == None or ob.type != 'Curve':
+ if not quiet:
+ Blender.Draw.PupMenu('No active curve object')
+ return
+
+ if not IDProp2Prefs(ob.properties, PREFS):
+ if not quiet:
+ Blender.Draw.PupMenu('Curve object has no settings stored on it')
+ return
+
+ Blender.Draw.Redraw()
+
+def do_pref_write(e,v):
+
+ objects = getContextCurveObjects()
+ if not objects:
+ Blender.Draw.PupMenu('No curve objects selected')
+ return
+
+ for ob in objects:
+ Prefs2IDProp(ob.properties, PREFS)
+
+def do_pref_clear(e,v):
+ objects = getContextCurveObjects()
+ if not objects:
+ Blender.Draw.PupMenu('No curve objects selected')
+ return
+
+ for ob in objects:
+ try: del idprop[ID_SLOT_NAME]
+ except: pass
+
+def do_tex_check(e,v):
+ if not v: return
+ try:
+ bpy.data.textures[v]
+ except:
+ PREFS['anim_tex'].val = ''
+ Draw.PupMenu('Texture dosnt exist!')
+ Draw.Redraw()
+
+def do_ob_check(e,v):
+ if not v: return
+ try:
+ bpy.data.objects[v]
+ except:
+ # PREFS['twig_ob_bounds'].val = ''
+ Draw.PupMenu('Object dosnt exist!')
+ Draw.Redraw()
+
+def do_group_check(e,v):
+ if not v: return
+ try:
+ bpy.data.groups[v]
+ except:
+ # PREFS['leaf_dupliface_fromgroup'].val = ''
+ Draw.PupMenu('dosnt exist!')
+ Draw.Redraw()
+
+# Button callbacks
+def do_active_image(e,v):
+ img = bpy.data.images.active
+ if img:
+ PREFS['image_main'].val = img.name
+ else:
+ PREFS['image_main'].val = ''
+
+# Button callbacks
+def do_tree_generate__real():
+ sce = bpy.data.scenes.active
+ objects = getContextCurveObjects()
+
+ if not objects:
+ Draw.PupMenu('Select one or more curve objects or a mesh/armature types with curve parents')
+
+ is_editmode = Blender.Window.EditMode()
+ if is_editmode:
+ Blender.Window.EditMode(0, '', 0)
+ Blender.Window.WaitCursor(1)
+
+ for ob in objects:
+ buildTree(ob, len(objects)==1)
+
+ Blender.Window.WaitCursor(0)
+ if is_editmode:
+ Blender.Window.EditMode(1, '', 0)
+
+ Blender.Window.RedrawAll()
+
+
+# Profile
+# Had to do this to get it to work in ubuntu "sudo aptitude install python-profiler"
+'''
+import hotshot
+import profile
+from hotshot import stats
+'''
+def do_tree_generate(e,v):
+
+ do_tree_generate__real()
+ '''
+ prof = hotshot.Profile("hotshot_edi_stats")
+ prof.runcall(do_tree_generate__real)
+ prof.close()
+ s = stats.load("hotshot_edi_stats")
+ s.sort_stats("time").print_stats()
+ '''
+ if GLOBALS['non_bez_error']:
+ Blender.Draw.PupMenu('Error%t|Nurbs and Poly curve types cant be used!')
+ GLOBALS['non_bez_error'] = 0
+
+
+
+def evt(e,val):
+ pass
+
+def bevt(e):
+
+ if e==EVENT_NONE:
+ return
+
+ if e == EVENT_UPDATE or e == EVENT_UPDATE_AND_UI:
+ if GLOBAL_PREFS['realtime_update'].val:
+ do_tree_generate(0,0) # values dont matter
+
+ if e == EVENT_REDRAW or e == EVENT_UPDATE_AND_UI:
+ Draw.Redraw()
+ if e == EVENT_EXIT:
+ Draw.Exit()
+ pass
+
+def gui():
+ MARGIN = 4
+ rect = BPyWindow.spaceRect()
+ but_width = int((rect[2]-MARGIN*2)/4.0) # 72
+ # Clamp
+ if but_width>100: but_width = 100
+ but_height = 17
+
+ x=MARGIN
+ y=rect[3]-but_height-MARGIN
+ xtmp = x
+
+ Blender.Draw.BeginAlign()
+ PREFS['do_twigs_fill'] = Draw.Toggle('Fill Twigs',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['do_twigs_fill'].val, 'Generate child branches based existing branches'); xtmp += but_width*2;
+ if PREFS['do_twigs_fill'].val:
+
+ PREFS['twig_fill_levels'] = Draw.Number('Generations', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_fill_levels'].val, 1, 32, 'How many generations to make for filled twigs'); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+ # WARNING USED IN 2 PLACES!! - see below
+ PREFS['twig_ob_bounds'] = Draw.String('OB Bound: ', EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['twig_ob_bounds'].val, 64, 'Only grow twigs inside this mesh object', do_ob_check); xtmp += but_width*2;
+ PREFS['twig_fill_rand_scale'] = Draw.Number('Randomize Scale', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_fill_rand_scale'].val, 0.0, 1.0, 'Randomize twig scale from the bounding mesh'); xtmp += but_width*2;
+
+ y-=but_height
+ xtmp = x
+
+ PREFS['twig_fill_radius_min'] = Draw.Number('Min Radius', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_fill_radius_min'].val, 0.0, 1.0, 'Radius at endpoints of all twigs'); xtmp += but_width*2;
+ PREFS['twig_fill_radius_factor'] = Draw.Number('Inherit Scale', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_fill_radius_factor'].val, 0.0, 1.0, 'What attaching to branches, scale the radius by this value for filled twigs'); xtmp += but_width*2;
+
+ y-=but_height
+ xtmp = x
+
+ #PREFS['twig_fill_shape_type'] = Draw.Number('Shape Type', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_fill_shape_type'].val, 0.0, 1.0, 'Shape used for the fork'); xtmp += but_width*2;
+ PREFS['twig_fill_shape_type'] = Draw.Menu('Join Type%t|Even%x0|Smooth One Child%x1|Smooth Both Children%x2',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['twig_fill_shape_type'].val, 'Select the wat twigs '); xtmp += but_width*2;
+ PREFS['twig_fill_fork_angle_max'] = Draw.Number('Shape Max Ang', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_fill_fork_angle_max'].val, 0.0, 180.0, 'Maximum fork angle'); xtmp += but_width*2;
+
+ y-=but_height
+ xtmp = x
+
+ PREFS['twig_fill_shape_rand'] = Draw.Number('Shape Rand', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_fill_shape_rand'].val, 0.0, 1.0, 'Randomize the shape of forks'); xtmp += but_width*2;
+ PREFS['twig_fill_shape_power'] = Draw.Number('Shape Strength', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_fill_shape_power'].val, 0.0, 1.0, 'Strength of curves'); xtmp += but_width*2;
+
+ Blender.Draw.EndAlign()
+
+ y-=but_height+MARGIN
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+
+
+ # ---------- ---------- ---------- ----------
+ Blender.Draw.BeginAlign()
+ PREFS['do_twigs'] = Draw.Toggle('Grow Twigs',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['do_twigs'].val, 'Generate child branches based existing branches'); xtmp += but_width*2;
+ if PREFS['do_twigs'].val:
+
+ PREFS['twig_ratio'] = Draw.Number('Twig Multiply', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_ratio'].val, 0.01, 500.0, 'How many twigs to generate per branch'); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+ PREFS['twig_select_mode'] = Draw.Menu('Branch Selection Method%t|From Short%x0|From Long%x1|From Straight%x2|From Bent%x3|',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['twig_select_mode'].val, 'Select branches to use as twigs based on this attribute'); xtmp += but_width*2;
+ PREFS['twig_select_factor'] = Draw.Number('From Factor', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_select_factor'].val, 0.0, 16, 'Select branches, lower value is more strict and will give you less variation'); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+ PREFS['twig_recursive'] = Draw.Toggle('Recursive Twigs',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['twig_recursive'].val, 'Recursively add twigs into eachother'); xtmp += but_width*2;
+ PREFS['twig_recursive_limit'] = Draw.Number('Generations', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_recursive_limit'].val, 0.0, 16, 'Number of generations allowed, 0 is inf'); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+
+ PREFS['twig_scale'] = Draw.Number('Twig Scale', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_scale'].val, 0.01, 10.0, 'Scale down twigs in relation to their parents each generation'); xtmp += but_width*2;
+ PREFS['twig_scale_width'] = Draw.Number('Twig Scale Width', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_scale_width'].val, 0.01, 20.0, 'Scale the twig length only (not thickness)'); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+
+ PREFS['twig_random_orientation'] = Draw.Number('Rand Orientation', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_random_orientation'].val, 0.0, 360.0, 'Random rotation around the parent'); xtmp += but_width*2;
+ PREFS['twig_random_angle'] = Draw.Number('Rand Angle', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_random_angle'].val, 0.0, 360.0, 'Random rotation to the parent joint'); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+
+ PREFS['twig_placement_maxradius'] = Draw.Number('Place Max Radius', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_placement_maxradius'].val, 0.0, 50.0, 'Only place twigs on branches below this radius'); xtmp += but_width*2;
+ PREFS['twig_placement_maxtwig'] = Draw.Number('Place Max Count', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['twig_placement_maxtwig'].val, 0.0, 50.0, 'Limit twig placement to this many per branch'); xtmp += but_width*2;
+
+ y-=but_height
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ PREFS['twig_follow_parent'] = Draw.Number('ParFollow', EVENT_UPDATE, xtmp, y, but_width, but_height, PREFS['twig_follow_parent'].val, 0.0, 10.0, 'Follow the parent branch'); xtmp += but_width;
+ PREFS['twig_follow_x'] = Draw.Number('Grav X', EVENT_UPDATE, xtmp, y, but_width, but_height, PREFS['twig_follow_x'].val, -10.0, 10.0, 'Twigs gravitate on the X axis'); xtmp += but_width;
+ PREFS['twig_follow_y'] = Draw.Number('Grav Y', EVENT_UPDATE, xtmp, y, but_width, but_height, PREFS['twig_follow_y'].val, -10.0, 10.0, 'Twigs gravitate on the Y axis'); xtmp += but_width;
+ PREFS['twig_follow_z'] = Draw.Number('Grav Z', EVENT_UPDATE, xtmp, y, but_width, but_height, PREFS['twig_follow_z'].val, -10.0, 10.0, 'Twigs gravitate on the Z axis'); xtmp += but_width;
+
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+ # WARNING USED IN 2 PLACES!!
+ PREFS['twig_ob_bounds'] = Draw.String('OB Bound: ', EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['twig_ob_bounds'].val, 64, 'Only grow twigs inside this mesh object', do_ob_check); xtmp += but_width*2;
+
+ if PREFS['twig_ob_bounds_prune'].val:
+ but_width_tmp = but_width
+ else:
+ but_width_tmp = but_width*2
+
+ PREFS['twig_ob_bounds_prune'] = Draw.Toggle('Prune',EVENT_UPDATE_AND_UI, xtmp, y, but_width_tmp, but_height, PREFS['twig_ob_bounds_prune'].val, 'Prune twigs to the mesh object bounds'); xtmp += but_width_tmp;
+ if PREFS['twig_ob_bounds_prune'].val:
+ PREFS['twig_ob_bounds_prune_taper'] = Draw.Number('Taper', EVENT_UPDATE_AND_UI, xtmp, y, but_width, but_height, PREFS['twig_ob_bounds_prune_taper'].val, 0.0, 1.0, 'Taper pruned branches to a point'); xtmp += but_width;
+
+ #PREFS['image_main'] = Draw.String('IM: ', EVENT_UPDATE, xtmp, y, but_width*3, but_height, PREFS['image_main'].val, 64, 'Image to apply to faces'); xtmp += but_width*3;
+ #Draw.PushButton('Use Active', EVENT_UPDATE, xtmp, y, but_width, but_height, 'Get the image from the active image window', do_active_image); xtmp += but_width;
+ Blender.Draw.EndAlign()
+
+ y-=but_height+MARGIN
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+
+
+ Blender.Draw.BeginAlign()
+ PREFS['do_leaf'] = Draw.Toggle('Generate Leaves',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['do_leaf'].val, 'Generate a separate leaf mesh'); xtmp += but_width*2;
+
+ if PREFS['do_leaf'].val:
+ PREFS['leaf_size'] = Draw.Number('Size', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_size'].val, 0.001, 10.0, 'size of the leaf'); xtmp += but_width*2;
+
+ if PREFS['leaf_fill'].val == 0:
+ but_width_tmp = but_width*2
+ else:
+ but_width_tmp = but_width*4
+
+ # ---------- ---------- ---------- ----------
+ y-=but_height
+ xtmp = x
+
+ if PREFS['leaf_fill'].val == 1:
+ but_width_tmp = but_width*2
+ else:
+ but_width_tmp = but_width*4
+
+ PREFS['leaf_fill'] = Draw.Toggle('Fill Object', EVENT_UPDATE_AND_UI, xtmp, y, but_width_tmp, but_height, PREFS['leaf_fill'].val, 'Fill an object with leaves'); xtmp += but_width_tmp;
+ if PREFS['leaf_fill'].val:
+ PREFS['leaf_fill_ob_bounds'] = Draw.String('OB Bound: ', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_fill_ob_bounds'].val, 64, 'Fill this object with leaves', do_ob_check); xtmp += but_width*2;
+
+ # ---------- ---------- ---------- ----------
+ y-=but_height
+ xtmp = x
+
+ PREFS['leaf_fill_count'] = Draw.Number('Fill #', EVENT_UPDATE, xtmp, y, but_width*4, but_height, PREFS['leaf_fill_count'].val, 10, 100000, 'Number of leaves to fill in'); xtmp += but_width*4;
+
+
+ # ---------- ---------- ---------- ----------
+ y-=but_height
+ xtmp = x
+
+
+
+
+
+ if PREFS['leaf_dupliface'].val == 1:
+ but_width_tmp = but_width*2
+ else:
+ but_width_tmp = but_width*4
+ PREFS['leaf_dupliface'] = Draw.Toggle('DupliLeaf', EVENT_UPDATE_AND_UI, xtmp, y, but_width_tmp, but_height, PREFS['leaf_dupliface'].val, 'Create a Dupliface mesh'); xtmp += but_width_tmp;
+
+ if PREFS['leaf_dupliface'].val:
+ PREFS['leaf_dupliface_fromgroup'] = Draw.String('group: ', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_dupliface_fromgroup'].val, 64, 'Pick objects from this group to use as leaves', do_group_check); xtmp += but_width*2;
+
+ # ---------- ---------- ---------- ----------
+ y-=but_height
+ xtmp = x
+
+ # Dont use yet
+ PREFS['leaf_branch_limit'] = Draw.Number('Branch Limit', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_branch_limit'].val, 0.0, 1.0, 'Maximum thichness where a branch can bare leaves'); xtmp += but_width*2;
+ PREFS['leaf_branch_limit_rand'] = Draw.Number('Limit Random', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['leaf_branch_limit_rand'].val, 0.0, 1.0, 'Randomize the starting of leaves'); xtmp += but_width*2;
+
+ Blender.Draw.EndAlign()
+
+ y-=but_height+MARGIN
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+
+ Blender.Draw.BeginAlign()
+ if PREFS['do_uv'].val == 0: but_width_tmp = but_width*2
+ else: but_width_tmp = but_width*4
+ PREFS['do_uv'] = Draw.Toggle('Generate UVs',EVENT_UPDATE_AND_UI, xtmp, y, but_width_tmp, but_height, PREFS['do_uv'].val, 'Calculate UVs coords'); xtmp += but_width_tmp;
+
+ if PREFS['do_uv'].val:
+ # ---------- ---------- ---------- ----------
+ y-=but_height
+ xtmp = x
+
+ PREFS['do_uv_uscale'] = Draw.Toggle('U-Scale', EVENT_UPDATE, xtmp, y, but_width, but_height, PREFS['do_uv_uscale'].val, 'Scale the width according to the face size (will NOT tile)'); xtmp += but_width;
+ PREFS['do_uv_keep_vproportion'] = Draw.Toggle('V-Aspect', EVENT_UPDATE, xtmp, y, but_width, but_height, PREFS['do_uv_keep_vproportion'].val, 'Correct the UV aspect with the branch width'); xtmp += but_width;
+ PREFS['do_uv_vnormalize'] = Draw.Toggle('V-Normaize', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['do_uv_vnormalize'].val, 'Scale the UVs to fit onto the image verticaly'); xtmp += but_width*2;
+
+ y-=but_height
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ PREFS['uv_x_scale'] = Draw.Number('Scale U', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['uv_x_scale'].val, 0.01, 10.0, 'Edge loop spacing around branch join, lower value for less webed joins'); xtmp += but_width*2;
+ PREFS['uv_y_scale'] = Draw.Number('Scale V', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['uv_y_scale'].val, 0.01, 10.0, 'Edge loop spacing around branch join, lower value for less webed joins'); xtmp += but_width*2;
+
+ y-=but_height
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ PREFS['image_main'] = Draw.String('IM: ', EVENT_UPDATE, xtmp, y, but_width*3, but_height, PREFS['image_main'].val, 64, 'Image to apply to faces'); xtmp += but_width*3;
+ Draw.PushButton('Use Active', EVENT_UPDATE, xtmp, y, but_width, but_height, 'Get the image from the active image window', do_active_image); xtmp += but_width;
+ Blender.Draw.EndAlign()
+
+ y-=but_height+MARGIN
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ Blender.Draw.BeginAlign()
+ PREFS['do_material'] = Draw.Toggle('Generate Material',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['do_material'].val, 'Create material and textures (for seamless joints)'); xtmp += but_width*2;
+
+ if PREFS['do_material'].val:
+ PREFS['material_use_existing'] = Draw.Toggle('ReUse Existing',EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['material_use_existing'].val, 'Modify the textures of the existing material'); xtmp += but_width*2;
+
+ # ---------- ---------- ---------- ----------
+ y-=but_height
+ xtmp = x
+
+ PREFS['material_texture'] = Draw.Toggle('Texture', EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['material_texture'].val, 'Create an image texture for this material to use'); xtmp += but_width*2;
+ PREFS['material_stencil'] = Draw.Toggle('Blend Joints', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['material_stencil'].val, 'Use a second texture and UV layer to blend joints'); xtmp += but_width*2;
+ Blender.Draw.EndAlign()
+
+ y-=but_height+MARGIN
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ Blender.Draw.BeginAlign()
+ if PREFS['do_armature'].val == 0:
+ but_width_tmp = but_width*2
+ else:
+ but_width_tmp = but_width*4
+
+ Blender.Draw.BeginAlign()
+ PREFS['do_armature'] = Draw.Toggle('Generate Motion', EVENT_UPDATE_AND_UI, xtmp, y, but_width_tmp, but_height, PREFS['do_armature'].val, 'Generate Armatuer animation and apply to branches'); xtmp += but_width_tmp;
+
+ # ---------- ---------- ---------- ----------
+ if PREFS['do_armature'].val:
+ y-=but_height
+ xtmp = x
+
+ PREFS['do_anim'] = Draw.Toggle('Texture Anim', EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['do_anim'].val, 'Use a texture to animate the bones'); xtmp += but_width*2;
+
+ if PREFS['do_anim'].val:
+
+ PREFS['anim_tex'] = Draw.String('TEX: ', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['anim_tex'].val, 64, 'Texture to use for the IPO Driver animation', do_tex_check); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ PREFS['anim_speed'] = Draw.Number('Speed', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['anim_speed'].val, 0.001, 10.0, 'Animate the movement faster with a higher value'); xtmp += but_width*2;
+ PREFS['anim_magnitude'] = Draw.Number('Magnitude', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['anim_magnitude'].val, 0.001, 10.0, 'Animate with more motion with a higher value'); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ PREFS['anim_offset_scale'] = Draw.Number('Unique Offset Scale', EVENT_UPDATE, xtmp, y, but_width*4, but_height, PREFS['anim_offset_scale'].val, 0.001, 10.0, 'Use the curve object location as input into the texture so trees have more unique motion, a low value is less unique'); xtmp += but_width*4;
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+
+ PREFS['anim_speed_size_scale'] = Draw.Toggle('Branch Size Scales Speed', EVENT_UPDATE, xtmp, y, but_width*4, but_height, PREFS['anim_speed_size_scale'].val, 'Use the branch size as a factor when calculating speed'); xtmp += but_width*4;
+
+ Blender.Draw.EndAlign()
+
+ y-=but_height+MARGIN
+ xtmp = x
+
+
+
+
+ # ---------- ---------- ---------- ----------
+
+ Blender.Draw.BeginAlign()
+ PREFS['do_variation'] = Draw.Toggle('Generate Variation', EVENT_UPDATE_AND_UI, xtmp, y, but_width*2, but_height, PREFS['do_variation'].val, 'Create a variant by moving the branches'); xtmp += but_width*2;
+
+ # ---------- ---------- ---------- ----------
+ if PREFS['do_variation'].val:
+ PREFS['variation_seed'] = Draw.Number('Rand Seed', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['variation_seed'].val, 1, 100000, 'Change this to get a different variation'); xtmp += but_width*2;
+ y-=but_height
+ xtmp = x
+
+
+ PREFS['variation_orientation'] = Draw.Number('Orientation', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['variation_orientation'].val, 0, 1.0, 'Randomize rotation of the branch around its parent'); xtmp += but_width*2;
+ PREFS['variation_scale'] = Draw.Number('Scale', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['variation_scale'].val, 0.0, 1.0, 'Randomize the scale of branches'); xtmp += but_width*2;
+
+ Blender.Draw.EndAlign()
+
+ y-=but_height+(MARGIN*2)
+ xtmp = x
+
+
+
+ # ---------- ---------- ---------- ----------
+ Blender.Draw.BeginAlign()
+ PREFS['seg_density'] = Draw.Number('Segment Spacing',EVENT_UPDATE, xtmp, y, but_width*4, but_height, PREFS['seg_density'].val, 0.05, 10.0, 'Scale the limit points collapse, that are closer then the branch width'); xtmp += but_width*4;
+
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+ PREFS['seg_density_angle'] = Draw.Number('Angle Spacing', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['seg_density_angle'].val, 0.0, 180.0, 'Segments above this angle will not collapse (lower value for more detail)'); xtmp += but_width*2;
+ PREFS['seg_density_radius'] = Draw.Number('Radius Spacing', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['seg_density_radius'].val, 0.0, 1.0, 'Segments above this difference in radius will not collapse (lower value for more detail)'); xtmp += but_width*2;
+
+ y-=but_height
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ PREFS['seg_joint_compression'] = Draw.Number('Joint Width', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['seg_joint_compression'].val, 0.1, 2.0, 'Edge loop spacing around branch join, lower value for less webed joins'); xtmp += but_width*2;
+ PREFS['seg_joint_smooth'] = Draw.Number('Joint Smooth', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['seg_joint_smooth'].val, 0.0, 1.0, 'Edge loop spacing around branch join, lower value for less webed joins'); xtmp += but_width*2;
+
+ y-=but_height
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ PREFS['connect_sloppy'] = Draw.Number('Connect Limit',EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['connect_sloppy'].val, 0.1, 2.0, 'Strictness when connecting branches'); xtmp += but_width*2;
+ PREFS['connect_base_trim'] = Draw.Number('Trim Base', EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['connect_base_trim'].val, 0.0, 2.0, 'Trim branch base to better connect with parent branch'); xtmp += but_width*2;
+ Blender.Draw.EndAlign()
+ y-=but_height+MARGIN
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+ Blender.Draw.BeginAlign()
+ PREFS['do_cap_ends'] = Draw.Toggle('Cap Ends',EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['do_cap_ends'].val, 'Add faces onto branch endpoints'); xtmp += but_width*2;
+ PREFS['do_subsurf'] = Draw.Toggle('SubSurf',EVENT_UPDATE, xtmp, y, but_width*2, but_height, PREFS['do_subsurf'].val, 'Enable subsurf for newly generated objects'); xtmp += but_width*2;
+ Blender.Draw.EndAlign()
+ y-=but_height+MARGIN
+ xtmp = x
+
+
+ # ---------- ---------- ---------- ----------
+ Blender.Draw.BeginAlign()
+ Draw.PushButton('Read Active Prefs', EVENT_REDRAW, xtmp, y, but_width*2, but_height, 'Read the ID Property settings from the active curve object', do_pref_read); xtmp += but_width*2;
+ Draw.PushButton('Write Prefs to Sel', EVENT_NONE, xtmp, y, but_width*2, but_height, 'Save these settings in the ID Properties of all selected curve objects', do_pref_write); xtmp += but_width*2;
+
+ y-=but_height
+ xtmp = x
+
+ # ---------- ---------- ---------- ----------
+ Draw.PushButton('Clear Prefs from Sel', EVENT_NONE, xtmp, y, but_width*4, but_height, 'Remove settings from the selected curve aaobjects', do_pref_clear); xtmp += but_width*4;
+ Blender.Draw.EndAlign()
+
+ y-=but_height+MARGIN
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ Blender.Draw.BeginAlign()
+ Draw.PushButton('Exit', EVENT_EXIT, xtmp, y, but_width, but_height, '', do_active_image); xtmp += but_width;
+ Draw.PushButton('Generate from selection', EVENT_REDRAW, xtmp, y, but_width*3, but_height, 'Generate mesh', do_tree_generate); xtmp += but_width*3;
+ Blender.Draw.EndAlign()
+ y-=but_height+MARGIN
+ xtmp = x
+ # ---------- ---------- ---------- ----------
+
+ GLOBAL_PREFS['realtime_update'] = Draw.Toggle('Automatic Update', EVENT_UPDATE, xtmp, y, but_width*4, but_height, GLOBAL_PREFS['realtime_update'].val, 'Update automatically when settings change'); xtmp += but_width*4;
+
+
+
+if __name__ == '__main__':
+ # Read the active objects prefs on load. if they exist
+ do_pref_read(quiet=True)
+
+ Draw.Register(gui, evt, bevt)
diff --git a/release/text/blender.html b/release/text/blender.html
index c7e88fb7064..c7e88fb7064 100755..100644
--- a/release/text/blender.html
+++ b/release/text/blender.html
diff --git a/source/Makefile b/source/Makefile
index d2969f41301..f5e9e57fa55 100644
--- a/source/Makefile
+++ b/source/Makefile
@@ -56,6 +56,7 @@ ifdef NAN_BUILDINFO
BUILDINFO_C = $(SRCHOME)/creator/buildinfo.c
BUILD_DATE := $(shell date "+%Y-%m-%d")
BUILD_TIME := $(shell date "+%H:%M:%S")
+ BUILD_REV := $(shell svnversion)
endif
############# set pyplayerlib ##################
@@ -169,6 +170,10 @@ endif
COMLIB += $(OCGDIR)/blender/imbuf/cineon/$(DEBUG_DIR)libcineon.a
+ifeq ($(WITH_DDS), true)
+ COMLIB += $(OCGDIR)/blender/imbuf/dds/$(DEBUG_DIR)libdds.a
+endif
+
ifeq ($(WITH_FREETYPE2), true)
ifeq ($(OS), windows)
ifeq ($(FREE_WINDOWS), true)
@@ -540,7 +545,7 @@ endif
$(DIR)/$(DEBUG_DIR)bin/blenderstatic: $(OBJS) $(GRPLIB) $(COMLIB) $(PULIB)
@echo "****> Link $@"
ifdef NAN_BUILDINFO
- $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"static"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
+ $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"static"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
endif
mkdir -p $(DIR)/$(DEBUG_DIR)bin
$(CCC) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderstatic $(BUILDINFO_O) $(OBJS) $(GRPLIB) $(COMLIB) $(PULIB) $(PYLIB) $(LLIBS) $(SADD) $(LOPTS)
@@ -554,7 +559,7 @@ endif
$(DIR)/$(DEBUG_DIR)bin/blender$(EXT): $(OBJS) $(GRPLIB) $(COMLIB) $(PULIB)
@echo "****> Link $@"
ifdef NAN_BUILDINFO
- $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
+ $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
endif
mkdir -p $(DIR)/$(DEBUG_DIR)bin
$(CCC) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blender$(EXT) $(BUILDINFO_O) $(OBJS) $(GRPLIB) $(COMLIB) $(PULIB) $(PYLIB) $(LLIBS) $(DADD) $(LOPTS)
@@ -568,7 +573,7 @@ endif
$(DIR)/$(DEBUG_DIR)bin/blenderplayer$(EXT): $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB)
@echo "****> Link $@"
ifdef NAN_BUILDINFO
- $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
+ $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
endif
mkdir -p $(DIR)/$(DEBUG_DIR)bin
$(CCC) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderplayer$(EXT) $(BUILDINFO_O) $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB) $(PYPLAYERLIB) $(LLIBS) $(DADD) $(LOPTS)
@@ -582,7 +587,7 @@ endif
$(DIR)/$(DEBUG_DIR)bin/blenderdynplayer$(EXT): $(OBJS) $(COMLIB) $(SPLIB)
@echo "****> Link $@"
ifdef NAN_BUILDINFO
- $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
+ $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
endif
mkdir -p $(DIR)/$(DEBUG_DIR)bin
$(CCC) $(LDFLAGS) -o $(DIR)/$(DEBUG_DIR)bin/blenderdynplayer$(EXT) $(BUILDINFO_O) $(OBJS) $(SPLIB1) $(COMLIB) $(SPLIB) $(PYLIB) $(LLIBS) $(DADD) $(LOPTS)
@@ -596,7 +601,7 @@ endif
$(DIR)/$(DEBUG_DIR)bin/Blender3DPlugin$(SOEXT): $(PLUGAPPLIB_XPLINK)
@echo "****> Link $@"
ifdef NAN_BUILDINFO
- $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
+ $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
endif
mkdir -p $(DIR)/$(DEBUG_DIR)bin
$(CCC) $(DYNLDFLAGS) -o $@ $(PLUGAPPLIB_XPLINK) $(LOPTS)
@@ -612,7 +617,7 @@ DEFFILE = ./gameengine/GamePlayer/netscape/src/npB3DPlg.def
$(DIR)/$(DEBUG_DIR)npB3DPlg$(SOEXT): $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB)
@echo "****> Link $@"
ifdef NAN_BUILDINFO
- $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
+ $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
endif
# $(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PYLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS)
$(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PYLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS) /def:$(DEFFILE)
@@ -623,7 +628,7 @@ endif
$(DIR)/$(DEBUG_DIR)bin/npBlender3DPlugin$(SOEXT): $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB)
@echo "****> Link $@"
ifdef NAN_BUILDINFO
- $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
+ $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
endif
mkdir -p $(DIR)/$(DEBUG_DIR)bin
$(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGAPPLIB) $(COMLIB) $(SPLIB) $(PYLIB) $(PLUGREMLIB) $(LLIBS) $(DADD) $(LOPTS)
@@ -634,7 +639,7 @@ endif
$(DIR)/$(DEBUG_DIR)bin/npTestPlugin$(SOEXT): $(NSPLUGLIB)
@echo "****> Link $@"
ifdef NAN_BUILDINFO
- $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
+ $(CCC) $(REL_CFLAGS) -DBUILD_DATE='"$(BUILD_DATE)"' -DBUILD_TIME='"$(BUILD_TIME)"' -DBUILD_REV='"$(BUILD_REV)"' -DBUILD_PLATFORM='"$(CONFIG_GUESS)"' -DBUILD_TYPE='"dynamic"' $(BUILDINFO_C) -c -o $(BUILDINFO_O) -DNAN_BUILDINFO
endif
mkdir -p $(DIR)/$(DEBUG_DIR)bin
$(CCC) $(DYNLDFLAGS) -o $@ $(NSPLUGLIB) $(PLUGTESTLIB) $(LLIBS) $(DADD) $(LOPTS)
diff --git a/source/blender/SConscript b/source/blender/SConscript
index 410c2667ff7..56a661238f8 100644
--- a/source/blender/SConscript
+++ b/source/blender/SConscript
@@ -23,6 +23,9 @@ if env['WITH_BF_YAFRAY'] == 1:
if env['WITH_BF_INTERNATIONAL'] == 1:
SConscript (['ftfont/SConscript'])
+if env['WITH_BF_DDS'] == 1:
+ SConscript (['imbuf/intern/dds/SConscript'])
+
if env['WITH_BF_OPENEXR'] == 1:
SConscript (['imbuf/intern/openexr/SConscript'])
diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c
index a46688c8263..08c8cb254f0 100644
--- a/source/blender/avi/intern/options.c
+++ b/source/blender/avi/intern/options.c
@@ -99,8 +99,8 @@ AviError AVI_set_compress_option (AviMovie *movie, int option_type, int stream,
break;
case AVI_OPTION_FRAMERATE:
- if (1000000/(*((int *) opt_data)))
- movie->header->MicroSecPerFrame = 1000000/(*((int *) opt_data));
+ if (1000000/(*((double *) opt_data)))
+ movie->header->MicroSecPerFrame = 1000000/(*((double *) opt_data));
for (i=0; i < movie->header->Streams; i++) {
if (avi_get_format_type(movie->streams[i].format) == FCC("vids")) {
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 872717fdb9b..29fc1438c47 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -57,6 +57,7 @@ struct Mesh;
struct EditMesh;
struct ModifierData;
struct MCol;
+struct ColorBand;
/* number of sub-elements each mesh element has (for interpolation) */
#define SUB_ELEMS_VERT 0
@@ -69,6 +70,7 @@ struct DerivedMesh {
CustomData vertData, edgeData, faceData;
int numVertData, numEdgeData, numFaceData;
int needsFree; /* checked on ->release, is set to 0 for cached results */
+ int deformedOnly; /* set by modifier stack if only deformed from original */
/* Misc. Queries */
@@ -395,6 +397,9 @@ void DM_interp_face_data(struct DerivedMesh *source, struct DerivedMesh *dest,
void DM_swap_face_data(struct DerivedMesh *dm, int index, int *corner_indices);
+/* Temporary? A function to give a colorband to derivedmesh for vertexcolor ranges */
+void vDM_ColorBand_store(struct ColorBand *coba);
+
/* Simple function to get me->totvert amount of vertices/normals,
correctly deformed and subsurfered. Needed especially when vertexgroups are involved.
In use now by vertex/weigt paint and particles */
@@ -425,10 +430,33 @@ DerivedMesh *editmesh_get_derived_cage(CustomDataMask dataMask);
DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r,
CustomDataMask dataMask);
+/* returns an array of deform matrices for crazyspace correction, and the
+ number of modifiers left */
+int editmesh_get_first_deform_matrices(float (**deformmats)[3][3],
+ float (**deformcos)[3]);
+
void weight_to_rgb(float input, float *fr, float *fg, float *fb);
/* determines required DerivedMesh data according to view and edit modes */
CustomDataMask get_viewedit_datamask();
+/* repeate this pattern
+ X000X000
+ 00000000
+ 00X000X0
+ 00000000 */
+
+#define DM_FACE_STIPPLE \
+{ \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0 \
+}
+
#endif
diff --git a/source/blender/blenkernel/BKE_action.h b/source/blender/blenkernel/BKE_action.h
index e848ef0a11b..cbec4cf04fb 100644
--- a/source/blender/blenkernel/BKE_action.h
+++ b/source/blender/blenkernel/BKE_action.h
@@ -101,6 +101,9 @@ struct bPoseChannel *verify_pose_channel(struct bPose* pose,
/* sets constraint flags */
void update_pose_constraint_flags(struct bPose *pose);
+/* clears BONE_UNKEYED flags for frame changing */
+void framechange_poses_clear_unkeyed(void);
+
/**
* Allocate a new bAction on the heap and copy
* the contents of src into it. If src is NULL NULL is returned.
@@ -116,8 +119,12 @@ void calc_action_range(const struct bAction *act, float *start, float *end, int
/**
* Set the pose channels from the given action.
*/
-void extract_pose_from_action(struct bPose *pose, struct bAction *act,
- float ctime);
+void extract_pose_from_action(struct bPose *pose, struct bAction *act, float ctime);
+
+/**
+ * Get the effects of the given action using a workob
+ */
+void what_does_obaction(struct Object *ob, struct bAction *act, float cframe);
/**
* Iterate through the action channels of the action
@@ -153,11 +160,5 @@ float get_action_frame_inv(struct Object *ob, float cframe);
};
#endif
-/* nla strip->mode, for action blending */
-enum {
- POSE_BLEND = 0,
- POSE_ADD
-};
-
#endif
diff --git a/source/blender/blenkernel/BKE_armature.h b/source/blender/blenkernel/BKE_armature.h
index 37022d89ac1..fb527051a0d 100644
--- a/source/blender/blenkernel/BKE_armature.h
+++ b/source/blender/blenkernel/BKE_armature.h
@@ -80,7 +80,7 @@ void make_local_armature(struct bArmature *arm);
struct bArmature *copy_armature(struct bArmature *arm);
void bone_flip_name (char *name, int strip_number);
-struct bArmature* get_armature (struct Object* ob);
+struct bArmature *get_armature (struct Object *ob);
struct Bone *get_named_bone (struct bArmature *arm, const char *name);
float distfactor_to_bone (float vec[3], float b1[3], float b2[3], float rad1, float rad2, float rdist);
@@ -112,7 +112,7 @@ typedef struct Mat4 {
float mat[4][4];
} Mat4;
-Mat4 *b_bone_spline_setup(struct bPoseChannel *pchan);
+Mat4 *b_bone_spline_setup(struct bPoseChannel *pchan, int rest);
#ifdef __cplusplus
}
diff --git a/source/blender/blenkernel/BKE_bad_level_calls.h b/source/blender/blenkernel/BKE_bad_level_calls.h
index ddc18851a9f..7a838ff7614 100644
--- a/source/blender/blenkernel/BKE_bad_level_calls.h
+++ b/source/blender/blenkernel/BKE_bad_level_calls.h
@@ -63,6 +63,9 @@ struct Script;
struct Text;
struct IpoDriver; /* DNA_curve_types.h */
struct Object;
+struct bPythonConstraint;
+struct bConstraintOb;
+struct bConstraintTarget;
void BPY_do_pyscript (struct ID *id, short int event);
void BPY_clear_script (struct Script *script);
void BPY_free_compiled_text (struct Text *text);
@@ -72,6 +75,10 @@ float BPY_pydriver_eval(struct IpoDriver *driver);
void BPY_pydriver_update(void);
/* button python evaluation */
int BPY_button_eval(char *expr, double *value);
+/* pyconstraints */
+void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
+void BPY_pyconstraint_targets(struct bPythonConstraint *con, struct bConstraintTarget *ct);
+
/* writefile.c */
struct Oops;
@@ -179,6 +186,9 @@ void post_tag_change(struct VTag *vtag);
void post_taggroup_create(struct VTagGroup *vtaggroup);
char *verse_client_name(void);
void post_transform(struct VNode *vnode);
+void post_transform_pos(struct VNode *vnode);
+void post_transform_rot(struct VNode *vnode);
+void post_transform_scale(struct VNode *vnode);
void post_object_free_constraint(struct VNode *vnode);
void post_link_set(struct VLink *vlink);
void post_link_destroy(struct VLink *vlink);
@@ -215,5 +225,18 @@ void antialias_tagbuf(int xsize, int ysize, char *rectmove);
/* imagetexture.c */
void ibuf_sample(struct ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result);
+/* modifier.c */
+struct MeshDeformModifierData;
+
+void harmonic_coordinates_bind(struct MeshDeformModifierData *mmd,
+ float (*vertexcos)[3], int totvert, float cagemat[][4]);
+
+/* particle.c */
+struct ParticleSystem;
+
+void PE_free_particle_edit(struct ParticleSystem *psys);
+void PE_get_colors(char sel[4], char nosel[4]);
+void PE_recalc_world_cos(struct Object *ob, struct ParticleSystem *psys);
+
#endif
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index 4b9e10651cf..5cd905d07ac 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -43,8 +43,8 @@ extern "C" {
struct ListBase;
struct MemFile;
-#define BLENDER_VERSION 244
-#define BLENDER_SUBVERSION 2
+#define BLENDER_VERSION 245
+#define BLENDER_SUBVERSION 8
#define BLENDER_MINVERSION 240
#define BLENDER_MINSUBVERSION 0
diff --git a/source/blender/blenkernel/BKE_constraint.h b/source/blender/blenkernel/BKE_constraint.h
index 2bec643d5b0..aa8e9cf18f8 100644
--- a/source/blender/blenkernel/BKE_constraint.h
+++ b/source/blender/blenkernel/BKE_constraint.h
@@ -25,7 +25,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): 2007 - Joshua Leung (major recode)
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
@@ -34,42 +34,107 @@
#define BKE_CONSTRAINT_H
struct bConstraint;
-struct Object;
+struct bConstraintTarget;
struct ListBase;
+struct Object;
struct bConstraintChannel;
-struct bAction;
-struct bArmature;
-
-/* Function prototypes */
-void unique_constraint_name (struct bConstraint *con, struct ListBase *list);
-void *new_constraint_data (short type);
-void evaluate_constraint (struct bConstraint *constraint, struct Object *ob, short ownertype, void *ownerdata, float targetmat[][4]);
-void free_constraints (struct ListBase *conlist);
-void copy_constraints (struct ListBase *dst, struct ListBase *src);
-void copy_constraint_channels (ListBase *dst, ListBase *src);
-void clone_constraint_channels (struct ListBase *dst, struct ListBase *src);
-void relink_constraints (struct ListBase *list);
-void free_constraint_data (struct bConstraint *con);
-
-/* channels */
-struct bConstraintChannel *get_constraint_channel (ListBase *list, const char *name);
-struct bConstraintChannel *verify_constraint_channel (ListBase *list, const char *name);
-void free_constraint_channels (ListBase *chanbase);
-
-/* Gemeric functions */
-void do_constraint_channels (struct ListBase *conbase, struct ListBase *chanbase, float ctime);
-short get_constraint_target_matrix (struct bConstraint *con, short ownertype, void *ownerdata, float mat[][4], float size[3], float time);
-char constraint_has_target (struct bConstraint *con);
-struct Object *get_constraint_target(struct bConstraint *con, char **subtarget);
-void set_constraint_target(struct bConstraint *con, struct Object *ob, char *subtarget);
-
-
-/* Constraint target/owner types */
-#define TARGET_OBJECT 1 // string is ""
-#define TARGET_BONE 2 // string is bone-name
-#define TARGET_VERT 3 // string is "VE:#"
-#define TARGET_FACE 4 // string is "FA:#"
-#define TARGET_CV 5 // string is "CV:#"
+struct bPoseChannel;
+
+/* ---------------------------------------------------------------------------- */
+
+/* special struct for use in constraint evaluation */
+typedef struct bConstraintOb {
+ struct Object *ob; /* if pchan, then armature that it comes from, otherwise constraint owner */
+ struct bPoseChannel *pchan; /* pose channel that owns the constraints being evaluated */
+
+ float matrix[4][4]; /* matrix where constraints are accumulated + solved */
+ float startmat[4][4]; /* original matrix (before constraint solving) */
+
+ short type; /* type of owner */
+} bConstraintOb;
+
+/* ---------------------------------------------------------------------------- */
+
+/* Constraint Type-Info (shorthand in code = cti):
+ * This struct provides function pointers for runtime, so that functions can be
+ * written more generally (with fewer/no special exceptions for various constraints).
+ *
+ * Callers of these functions must check that they actually point to something useful,
+ * as some constraints don't define some of these.
+ *
+ * Warning: it is not too advisable to reorder order of members of this struct,
+ * as you'll have to edit quite a few ($NUM_CONSTRAINT_TYPES) of these
+ * structs.
+ */
+typedef struct bConstraintTypeInfo {
+ /* admin/ident */
+ short type; /* CONSTRAINT_TYPE_### */
+ short size; /* size in bytes of the struct */
+ char name[32]; /* name constraint in interface */
+ char structName[32]; /* name of struct for SDNA */
+
+ /* data management function pointers - special handling */
+ /* free any data that is allocated separately (optional) */
+ void (*free_data)(struct bConstraint *con);
+ /* adjust pointer to other ID-data using ID_NEW(), but not to targets (optional) */
+ void (*relink_data)(struct bConstraint *con);
+ /* copy any special data that is allocated separately (optional) */
+ void (*copy_data)(struct bConstraint *con, struct bConstraint *src);
+ /* set settings for data that will be used for bConstraint.data (memory already allocated) */
+ void (*new_data)(void *cdata);
+
+ /* target handling function pointers */
+ /* for multi-target constraints: return that list; otherwise make a temporary list */
+ void (*get_constraint_targets)(struct bConstraint *con, struct ListBase *list);
+ /* for single-target constraints only: flush data back to source data, and the free memory used */
+ void (*flush_constraint_targets)(struct bConstraint *con, struct ListBase *list, short nocopy);
+
+ /* evaluation */
+ /* set the ct->matrix for the given constraint target (at the given ctime) */
+ void (*get_target_matrix)(struct bConstraint *con, struct bConstraintOb *cob, struct bConstraintTarget *ct, float ctime);
+ /* evaluate the constraint for the given time */
+ void (*evaluate_constraint)(struct bConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
+} bConstraintTypeInfo;
+
+/* Function Prototypes for bConstraintTypeInfo's */
+bConstraintTypeInfo *constraint_get_typeinfo(struct bConstraint *con);
+bConstraintTypeInfo *get_constraint_typeinfo(int type);
+
+/* ---------------------------------------------------------------------------- */
+/* Useful macros for testing various common flag combinations */
+
+/* Constraint Target Macros */
+#define VALID_CONS_TARGET(ct) ((ct) && (ct->tar))
+
+
+/* ---------------------------------------------------------------------------- */
+
+/* Constraint function prototypes */
+void unique_constraint_name(struct bConstraint *con, struct ListBase *list);
+
+void free_constraints(struct ListBase *conlist);
+void copy_constraints(struct ListBase *dst, struct ListBase *src);
+void relink_constraints(struct ListBase *list);
+void free_constraint_data(struct bConstraint *con);
+
+
+/* Constraint Channel function prototypes */
+struct bConstraintChannel *get_constraint_channel(struct ListBase *list, const char *name);
+struct bConstraintChannel *verify_constraint_channel(struct ListBase *list, const char *name);
+void do_constraint_channels(struct ListBase *conbase, struct ListBase *chanbase, float ctime, short onlydrivers);
+void copy_constraint_channels(struct ListBase *dst, struct ListBase *src);
+void clone_constraint_channels(struct ListBase *dst, struct ListBase *src);
+void free_constraint_channels(struct ListBase *chanbase);
+
+/* Constraint Evaluation function prototypes */
+struct bConstraintOb *constraints_make_evalob(struct Object *ob, void *subdata, short datatype);
+void constraints_clear_evalob(struct bConstraintOb *cob);
+
+void constraint_mat_convertspace(struct Object *ob, struct bPoseChannel *pchan, float mat[][4], short from, short to);
+
+void get_constraint_target_matrix(struct bConstraint *con, int n, short ownertype, void *ownerdata, float mat[][4], float ctime);
+void solve_constraints(struct ListBase *conlist, struct bConstraintOb *cob, float ctime);
+
#endif
diff --git a/source/blender/blenkernel/BKE_customdata.h b/source/blender/blenkernel/BKE_customdata.h
index 4a486e6795f..d0535f1752e 100644
--- a/source/blender/blenkernel/BKE_customdata.h
+++ b/source/blender/blenkernel/BKE_customdata.h
@@ -185,6 +185,8 @@ int CustomData_get_layer_index(const struct CustomData *data, int type);
int CustomData_get_named_layer_index(const struct CustomData *data, int type, char *name);
int CustomData_get_active_layer_index(const struct CustomData *data, int type);
int CustomData_get_render_layer_index(const struct CustomData *data, int type);
+int CustomData_get_active_layer(const struct CustomData *data, int type);
+int CustomData_get_render_layer(const struct CustomData *data, int type);
/* copies the data from source to the data element at index in the first
* layer of type
@@ -207,6 +209,10 @@ void *CustomData_set_layer_n(const struct CustomData *data, int type, int n, voi
void CustomData_set_layer_active(struct CustomData *data, int type, int n);
void CustomData_set_layer_render(struct CustomData *data, int type, int n);
+/* same as above but works with an index from CustomData_get_layer_index */
+void CustomData_set_layer_active_index(struct CustomData *data, int type, int n);
+void CustomData_set_layer_render_index(struct CustomData *data, int type, int n);
+
/* adds flag to the layer flags */
void CustomData_set_layer_flag(struct CustomData *data, int type, int flag);
diff --git a/source/blender/blenkernel/BKE_deform.h b/source/blender/blenkernel/BKE_deform.h
index de0dddabfd3..67e2a8948d5 100644
--- a/source/blender/blenkernel/BKE_deform.h
+++ b/source/blender/blenkernel/BKE_deform.h
@@ -46,6 +46,7 @@ void copy_defgroups (struct ListBase *lb1, struct ListBase *lb2);
struct bDeformGroup *copy_defgroup (struct bDeformGroup *ingroup);
struct bDeformGroup *get_named_vertexgroup (Object *ob, char *name);
int get_defgroup_num (struct Object *ob, struct bDeformGroup *dg);
+int get_named_vertexgroup_num (Object *ob, char *name);
void unique_vertexgroup_name (struct bDeformGroup *dg, struct Object *ob);
#endif
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 979ed31fb20..2dc4de32132 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -123,5 +123,7 @@ void filldisplist(struct ListBase *dispbase, struct ListBase *to);
void fastshade_free_render(void);
+float calc_taper(struct Object *taperobj, int cur, int tot);
+
#endif
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h
index 98a0cb99942..e71145e8d79 100644
--- a/source/blender/blenkernel/BKE_global.h
+++ b/source/blender/blenkernel/BKE_global.h
@@ -175,21 +175,27 @@ typedef struct Global {
#define G_DRAWCREASES (1 << 19)
#define G_DRAWSEAMS (1 << 20)
#define G_HIDDENEDGES (1 << 21)
-
/* Measurement info Drawing */
#define G_DRAW_EDGELEN (1 << 22)
#define G_DRAW_FACEAREA (1 << 23)
#define G_DRAW_EDGEANG (1 << 24)
#define G_RECORDKEYS (1 << 25)
-
/*#ifdef WITH_VERSE*/
#define G_VERSE_CONNECTED (1 << 26)
#define G_DRAW_VERSE_DEBUG (1 << 27)
/*#endif*/
-
#define G_DRAWSHARP (1 << 28) /* draw edges with the sharp flag */
#define G_SCULPTMODE (1 << 29)
+#define G_PARTICLEEDIT (1 << 30)
+
+#define G_AUTOMATKEYS (1 << 30)
+#define G_HIDDENHANDLES (1 << 31) /* used for curves only */
+
+/* macro for testing face select mode
+ * Texture paint could be removed since selected faces are not used
+ * however hiding faces is useful */
+#define FACESEL_PAINT_TEST ((G.f&G_FACESELECT) && (G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT)))
/* G.fileflags */
@@ -238,9 +244,10 @@ typedef struct Global {
#define B_ENDIAN 0
/* G.moving, signals drawing in (3d) window to denote transform */
-#define G_TRANSFORM_OBJ 1
-#define G_TRANSFORM_EDIT 2
-#define G_TRANSFORM_MANIP 4
+#define G_TRANSFORM_OBJ 1
+#define G_TRANSFORM_EDIT 2
+#define G_TRANSFORM_MANIP 4
+#define G_TRANSFORM_PARTICLE 8
/* G.special1 */
diff --git a/source/blender/blenkernel/BKE_icons.h b/source/blender/blenkernel/BKE_icons.h
index 315c7dc7a53..737adea78be 100644
--- a/source/blender/blenkernel/BKE_icons.h
+++ b/source/blender/blenkernel/BKE_icons.h
@@ -1,34 +1,32 @@
/**
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
+* $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*
+* The Original Code is Copyright (C) 2006-2007 Blender Foundation.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): none yet.
+*
+* ***** END GPL LICENSE BLOCK *****
+*
+*/
#ifndef BKE_ICONS_H
#define BKE_ICONS_H
@@ -44,12 +42,13 @@ struct Icon
void *drawinfo;
void *obj;
short type;
- short changed;
DrawInfoFreeFP drawinfo_free;
};
typedef struct Icon Icon;
+struct PreviewImage;
+
void BKE_icons_init(int first_dyn_id);
/* return icon id for library object or create new icon if not found */
@@ -71,5 +70,19 @@ void BKE_icon_changed(int icon_id);
/* free all icons */
void BKE_icons_free();
+/* free the preview image */
+void BKE_previewimg_free(struct PreviewImage **prv);
+
+/* free the preview image belonging to the id */
+void BKE_previewimg_free_id(ID *id);
+
+/* create a new preview image */
+struct PreviewImage* BKE_previewimg_create() ;
+
+/* create a copy of the preview image */
+struct PreviewImage* BKE_previewimg_copy(struct PreviewImage *prv);
+
+/* retrieve existing or create new preview image */
+PreviewImage* BKE_previewimg_get(ID *id);
#endif /* BKE_ICONS_H */
diff --git a/source/blender/blenkernel/BKE_idprop.h b/source/blender/blenkernel/BKE_idprop.h
index 92b624f80ab..961cca511de 100644
--- a/source/blender/blenkernel/BKE_idprop.h
+++ b/source/blender/blenkernel/BKE_idprop.h
@@ -137,6 +137,7 @@ void IDP_FreeIterBeforeEnd(void *vself);
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);
+struct IDProperty *IDP_CopyProperty(struct IDProperty *prop);
/*
Allocate a new ID.
diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 58f96491a1b..b308342ac1e 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -46,6 +46,8 @@ struct anim;
/* call from library */
void free_image(struct Image *me);
+void BKE_stamp_info(struct ImBuf *ibuf);
+void BKE_stamp_buf(unsigned char *rect, float *rectf, int width, int height);
int BKE_write_ibuf(struct ImBuf *ibuf, char *name, int imtype, int subimtype, int quality);
void BKE_makepicstring(char *string, char *base, int frame, int imtype);
void BKE_add_image_extension(char *string, int imtype);
diff --git a/source/blender/blenkernel/BKE_key.h b/source/blender/blenkernel/BKE_key.h
index 94ba1cbd69d..5325b3a8bc1 100644
--- a/source/blender/blenkernel/BKE_key.h
+++ b/source/blender/blenkernel/BKE_key.h
@@ -59,6 +59,7 @@ int do_ob_key(struct Object *ob);
struct Key *ob_get_key(struct Object *ob);
struct KeyBlock *ob_get_keyblock(struct Object *ob);
+struct KeyBlock *key_get_keyblock(struct Key *key, int index);
#endif
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 55eb1d27cc0..bf505fa23d7 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -64,8 +64,8 @@ void lattice_deform_verts(struct Object *laOb, struct Object *target,
int numVerts, char *vgroup);
void armature_deform_verts(struct Object *armOb, struct Object *target,
struct DerivedMesh *dm, float (*vertexCos)[3],
- int numVerts, int deformflag,
- const char *defgrp_name);
+ float (*defMats)[3][3], int numVerts, int deformflag,
+ float (*prevCos)[3], const char *defgrp_name);
float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3];
void lattice_applyVertexCos(struct Object *ob, float (*vertexCos)[3]);
void lattice_calc_modifiers(struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_main.h b/source/blender/blenkernel/BKE_main.h
index 6e0f2fdb284..2cfa1dc5cc4 100644
--- a/source/blender/blenkernel/BKE_main.h
+++ b/source/blender/blenkernel/BKE_main.h
@@ -78,6 +78,7 @@ typedef struct Main {
ListBase action;
ListBase nodetree;
ListBase brush;
+ ListBase particle;
} Main;
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index 4ec62821455..a8e4969ad43 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -90,11 +90,16 @@ void mesh_calc_normals(struct MVert *mverts, int numVerts, struct MFace *mfaces,
/* Return a newly MEM_malloc'd array of all the mesh vertex locations
* (_numVerts_r_ may be NULL) */
float (*mesh_getVertexCos(struct Mesh *me, int *numVerts_r))[3];
+float (*mesh_getRefKeyCos(struct Mesh *me, int *numVerts_r))[3];
/* map from uv vertex to face (for select linked, stitch, uv suburf) */
-struct UvVertMap;
-typedef struct UvVertMap UvVertMap;
+/* UvVertMap */
+
+typedef struct UvVertMap {
+ struct UvMapVert **vert;
+ struct UvMapVert *buf;
+} UvVertMap;
typedef struct UvMapVert {
struct UvMapVert *next;
@@ -106,6 +111,14 @@ UvVertMap *make_uv_vert_map(struct MFace *mface, struct MTFace *tface, unsigned
UvMapVert *get_uv_map_vert(UvVertMap *vmap, unsigned int v);
void free_uv_vert_map(UvVertMap *vmap);
+
+/* functions for making menu's from customdata layers */
+int mesh_layers_menu_charlen(struct CustomData *data, int type); /* use this to work out how many chars to allocate */
+void mesh_layers_menu_concat(struct CustomData *data, int type, char *str);
+int mesh_layers_menu(struct CustomData *data, int type);
+
+
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h
index ce3f33bd35c..24da941db90 100644
--- a/source/blender/blenkernel/BKE_modifier.h
+++ b/source/blender/blenkernel/BKE_modifier.h
@@ -59,6 +59,12 @@ typedef enum {
eModifierTypeType_Constructive,
eModifierTypeType_Nonconstructive,
+
+ /* both deformVerts & applyModifier are valid calls
+ * used for particles modifier that doesn't actually modify the object
+ * unless it's a mesh and can be exploded -> curve can also emit particles
+ */
+ eModifierTypeType_DeformOrConstruct
} ModifierTypeType;
typedef enum {
@@ -81,8 +87,8 @@ typedef enum {
eModifierTypeFlag_RequiresOriginalData = (1<<5),
} ModifierTypeFlag;
-typedef void (*ObjectWalkFunc)(void *userData, Object *ob, Object **obpoin);
-typedef void (*IDWalkFunc)(void *userData, Object *ob, ID **idpoin);
+typedef void (*ObjectWalkFunc)(void *userData, struct Object *ob, struct Object **obpoin);
+typedef void (*IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin);
typedef struct ModifierTypeInfo {
/* The user visible name for this modifier */
@@ -125,6 +131,11 @@ typedef struct ModifierTypeInfo {
struct EditMesh *editData, struct DerivedMesh *derivedData,
float (*vertexCos)[3], int numVerts);
+ /* Set deform matrix per vertex for crazyspace correction */
+ void (*deformMatricesEM)(
+ struct ModifierData *md, struct Object *ob,
+ struct EditMesh *editData, struct DerivedMesh *derivedData,
+ float (*vertexCos)[3], float (*defMats)[3][3], int numVerts);
/********************* Non-deform modifier functions *********************/
@@ -257,6 +268,7 @@ void modifier_copyData(struct ModifierData *md, struct ModifierData *ta
int modifier_dependsOnTime(struct ModifierData *md);
int modifier_supportsMapping(struct ModifierData *md);
int modifier_couldBeCage(struct ModifierData *md);
+int modifier_isDeformer(struct ModifierData *md);
void modifier_setError(struct ModifierData *md, char *format, ...);
void modifiers_foreachObjectLink(struct Object *ob,
@@ -271,11 +283,14 @@ int modifiers_getCageIndex(struct Object *ob,
int *lastPossibleCageIndex_r);
int modifiers_isSoftbodyEnabled(struct Object *ob);
+int modifiers_isParticleEnabled(struct Object *ob);
struct Object *modifiers_isDeformedByArmature(struct Object *ob);
struct Object *modifiers_isDeformedByLattice(struct Object *ob);
int modifiers_usesArmature(struct Object *ob, struct bArmature *arm);
int modifiers_isDeformed(struct Object *ob);
+int modifiers_indexInObject(struct Object *ob, struct ModifierData *md);
+
/* Calculates and returns a linked list of CustomDataMasks indicating the
* data required by each modifier in the stack pointed to by md for correct
* evaluation, assuming the data indicated by dataMask is required at the
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 44266a1c854..2ffa1d205da 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -206,6 +206,9 @@ struct ShadeResult;
#define SH_NODE_SQUEEZE 117
#define SH_NODE_MATERIAL_EXT 118
#define SH_NODE_INVERT 119
+#define SH_NODE_SEPRGB 120
+#define SH_NODE_COMBRGB 121
+#define SH_NODE_HUE_SAT 122
/* custom defines options for Material node */
@@ -298,6 +301,12 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, str
#define CMP_NODE_BRIGHTCONTRAST 249
#define CMP_NODE_GAMMA 250
#define CMP_NODE_INVERT 251
+#define CMP_NODE_NORMALIZE 252
+#define CMP_NODE_CROP 253
+
+#define CMP_NODE_GLARE 301
+#define CMP_NODE_TONEMAP 302
+#define CMP_NODE_LENSDIST 303
/* channel toggles */
#define CMP_CHAN_RGB 1
@@ -316,8 +325,9 @@ void set_node_shader_lamp_loop(void (*lamp_loop_func)(struct ShadeInput *, str
#define CMP_FILT_SHADOW 6
/* scale node type, in custom1 */
-#define CMP_SCALE_RELATIVE 0
-#define CMP_SCALE_ABSOLUTE 1
+#define CMP_SCALE_RELATIVE 0
+#define CMP_SCALE_ABSOLUTE 1
+#define CMP_SCALE_SCENEPERCENT 2
/* the type definitions array */
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 52d529ea32d..6e363515f41 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -45,6 +45,7 @@ struct BoundBox;
struct View3D;
struct SoftBody;
struct Group;
+struct bAction;
void clear_workob(void);
void copy_baseflags(void);
@@ -63,6 +64,7 @@ int exist_object(struct Object *obtest);
void *add_camera(char *name);
struct Camera *copy_camera(struct Camera *cam);
void make_local_camera(struct Camera *cam);
+float dof_camera(struct Object *ob);
void *add_lamp(char *name);
struct Lamp *copy_lamp(struct Lamp *la);
void make_local_lamp(struct Lamp *la);
@@ -81,7 +83,7 @@ void set_mblur_offs(float blur);
void set_field_offs(float field);
void disable_speed_curve(int val);
-float bsystem_time(struct Object *ob, struct Object *par, float cfra, float ofs);
+float bsystem_time(struct Object *ob, float cfra, float ofs);
void object_to_mat3(struct Object *ob, float mat[][3]);
void object_to_mat4(struct Object *ob, float mat[][4]);
@@ -97,6 +99,7 @@ void where_is_object(struct Object *ob);
void where_is_object_simul(struct Object *ob);
void what_does_parent(struct Object *ob);
+
struct BoundBox *unit_boundbox(void);
void boundbox_set_from_min_max(struct BoundBox *bb, float min[3], float max[3]);
struct BoundBox *object_get_boundbox(struct Object *ob);
@@ -104,7 +107,6 @@ void object_boundbox_flag(struct Object *ob, int flag, int set);
void minmax_object(struct Object *ob, float *min, float *max);
void minmax_object_duplis(struct Object *ob, float *min, float *max);
void solve_tracking (struct Object *ob, float targetmat[][4]);
-void solve_constraints (struct Object *ob, short obtype, void *obdata, float ctime);
void object_handle_update(struct Object *ob);
diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h
new file mode 100644
index 00000000000..afed219dbc6
--- /dev/null
+++ b/source/blender/blenkernel/BKE_particle.h
@@ -0,0 +1,254 @@
+/* BKE_particle.h
+ *
+ *
+ * $Id: BKE_particle.h $
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef BKE_PARTICLE_H
+#define BKE_PARTICLE_H
+
+#include "DNA_particle_types.h"
+#include "DNA_object_types.h"
+
+struct ParticleSystemModifierData;
+struct ParticleSystem;
+struct ParticleKey;
+struct HairKey;
+
+struct Main;
+struct Group;
+struct Object;
+struct DerivedMesh;
+struct ModifierData;
+struct MTFace;
+struct MFace;
+struct MVert;
+struct IpoCurve;
+struct LinkNode;
+struct KDTree;
+
+typedef struct ParticleEffectorCache {
+ struct ParticleEffectorCache *next, *prev;
+ struct Object *ob;
+
+ /* precalculated variables for guides */
+ float firstloc[4], firstdir[3];
+ float *distances;
+ float *locations;
+ /* precalculated variables for deflection */
+ float ob_minmax[6];
+ float *face_minmax;
+ float *vert_cos;
+ /* precalculated variables for boids */
+ struct KDTree *tree;
+
+ short type, psys_nbr;
+
+ struct Object obcopy; /* for restoring transformation data */
+} ParticleEffectorCache;
+
+typedef struct ParticleReactEvent {
+ struct ParticleReactEvent *next, *prev;
+ int event, pa_num;
+ Object *ob;
+ struct ParticleSystem *psys;
+ struct ParticleKey state;
+
+ float time, size;
+}ParticleReactEvent;
+
+typedef struct ParticleTexture{
+ float ivel; /* used in reset */
+ float time, life, exist, size; /* used in init */
+ float pvel[3]; /* used in physics */
+ float length, clump, kink; /* used in path caching */
+} ParticleTexture;
+
+typedef struct BoidVecFunc{
+ void (*Addf)(float *v, float *v1, float *v2);
+ void (*Subf)(float *v, float *v1, float *v2);
+ void (*Mulf)(float *v, float f);
+ float (*Length)(float *v);
+ float (*Normalize)(float *v);
+ float (*Inpf)(float *v1, float *v2);
+ void (*Copyf)(float *v1, float *v2);
+} BoidVecFunc;
+
+typedef struct ParticleSeam{
+ float v0[3], v1[3];
+ float nor[3], dir[3], tan[3];
+ float length2;
+} ParticleSeam;
+
+typedef struct ParticleCacheKey{
+ float co[3];
+ float vel[3];
+ float rot[4];
+ float col[3];
+ int steps;
+} ParticleCacheKey;
+
+typedef struct ParticleEditKey{
+ float *co;
+ float *vel;
+ float *rot;
+ float *time;
+
+ float world_co[3];
+ float length;
+ short flag;
+} ParticleEditKey;
+
+typedef struct ParticleUndo {
+ struct ParticleUndo *next, *prev;
+ struct ParticleEditKey **keys;
+ struct KDTree *emitter_field;
+ struct ParticleData *particles;
+ float *emitter_cosnos;
+ int totpart, totkeys;
+ char name[64];
+} ParticleUndo;
+
+typedef struct ParticleEdit{
+ ListBase undo;
+ struct ParticleUndo *curundo;
+ struct KDTree *emitter_field;
+ ParticleEditKey **keys;
+ int *mirror_cache;
+ float *emitter_cosnos;
+
+ int totkeys;
+} ParticleEdit;
+
+/* ----------- functions needed outside particlesystem ---------------- */
+/* particle.c */
+int count_particles(struct ParticleSystem *psys);
+int count_particles_mod(struct ParticleSystem *psys, int totgr, int cur);
+int psys_count_keys(struct ParticleSystem *psys);
+char *psys_menu_string(struct Object *ob, int for_sb);
+
+struct ParticleSystem *psys_get_current(struct Object *ob);
+short psys_get_current_num(struct Object *ob);
+//struct ParticleSystem *psys_get(struct Object *ob, int index);
+struct ParticleData *psys_get_selected_particle(struct ParticleSystem *psys, int *index);
+struct ParticleKey *psys_get_selected_key(struct ParticleSystem *psys, int pa_index, int *key_index);
+void psys_change_act(void *ob_v, void *act_v);
+struct Object *psys_get_lattice(struct Object *ob, struct ParticleSystem *psys);
+void psys_disable_all(struct Object *ob);
+void psys_enable_all(struct Object *ob);
+int psys_ob_has_hair(struct Object *ob);
+int psys_in_edit_mode(struct ParticleSystem *psys);
+
+void psys_free_settings(struct ParticleSettings *part);
+void free_child_path_cache(struct ParticleSystem *psys);
+void psys_free_path_cache(struct ParticleSystem *psys);
+void free_hair(struct ParticleSystem *psys);
+void free_keyed_keys(struct ParticleSystem *psys);
+void psys_free(struct Object * ob, struct ParticleSystem * psys);
+
+void clear_particles_from_cache(struct Object *ob, struct ParticleSystem *psys, int cfra);
+//void psys_remove_from_particle_list(struct Object *ob, short nbr, struct ParticleSystem *psys);
+
+void psys_interpolate_uvs(struct MTFace *tface, int quad, float *uv, float *uvco);
+
+void copy_particle_key(struct ParticleKey *to, struct ParticleKey *from, int time);
+
+void psys_particle_on_emitter(struct Object *ob, struct ParticleSystemModifierData *psmd, int distr, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan);
+struct ParticleSystemModifierData *psys_get_modifier(struct Object *ob, struct ParticleSystem *psys);
+
+struct ParticleSettings *psys_new_settings(char *name, struct Main *main);
+struct ParticleSettings *psys_copy_settings(struct ParticleSettings *part);
+void psys_flush_settings(struct ParticleSettings *part, int event, int hair_recalc);
+
+void psys_find_parents(struct Object *ob, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys);
+
+void psys_cache_paths(struct Object *ob, struct ParticleSystem *psys, float cfra, int editupdate);
+void psys_cache_child_paths(struct Object *ob, struct ParticleSystem *psys, float cfra, int editupdate);
+int do_guide(struct ParticleKey *state, int pa_num, float time, struct ListBase *lb);
+float psys_get_size(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct IpoCurve *icu_size, struct ParticleSystem *psys, struct ParticleSettings *part, struct ParticleData *pa, float *vg_size);
+float psys_get_timestep(struct ParticleSettings *part);
+float psys_get_child_time(struct ParticleSystem *psys, int child_nbr, float cfra);
+float psys_get_child_size(struct ParticleSystem *psys, int child_nbr, float cfra, float *pa_time);
+void psys_get_particle_on_path(struct Object *ob, struct ParticleSystem *psys, int pa_num, struct ParticleKey *state, int vel);
+int psys_get_particle_state(struct Object *ob, struct ParticleSystem *psys, int p, struct ParticleKey *state, int always);
+
+/* particle_system.c */
+int psys_count_keyed_targets(struct Object *ob, struct ParticleSystem *psys);
+void psys_get_reactor_target(struct Object *ob, struct ParticleSystem *psys, struct Object **target_ob, struct ParticleSystem **target_psys);
+
+void psys_init_effectors(struct Object *obsrc, struct Group *group, struct ParticleSystem *psys);
+void psys_end_effectors(struct ParticleSystem *psys);
+
+void particle_system_update(struct Object *ob, struct ParticleSystem *psys);
+
+/* ----------- functions needed only inside particlesystem ------------ */
+/* particle.c */
+void psys_key_to_object(struct Object *ob, struct ParticleKey *key, float imat[][4]);
+//void psys_key_to_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key);
+//void psys_key_from_geometry(struct DerivedMesh *dm, struct ParticleData *pa, struct ParticleKey *key);
+//void psys_face_mat(struct DerivedMesh *dm, struct ParticleData *pa, float mat[][4]);
+void psys_vec_rot_to_face(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
+//void psys_vec_rot_from_face(struct DerivedMesh *dm, struct ParticleData *pa, float *vec);
+void psys_mat_hair_to_object(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
+void psys_mat_hair_to_global(struct Object *ob, struct DerivedMesh *dm, short from, struct ParticleData *pa, float hairmat[][4]);
+
+float *psys_cache_vgroup(struct DerivedMesh *dm, struct ParticleSystem *psys, int vgroup);
+void psys_get_texture(struct Object *ob, struct Material *ma, struct ParticleSystemModifierData *psmd, struct ParticleSystem *psys, struct ParticleData *pa, struct ParticleTexture *ptex, int event);
+void psys_interpolate_face(struct MVert *mvert, struct MFace *mface, struct MTFace *tface, float *uv, float *vec, float *nor, float *utan, float *vtan);
+float psys_interpolate_value_from_verts(struct DerivedMesh *dm, short from, int index, float *fw, float *values);
+void psys_get_from_key(struct ParticleKey *key, float *loc, float *vel, float *rot, float *time);
+
+int psys_intersect_dm(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);
+void psys_particle_on_dm(struct Object *ob, struct DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan);
+
+/* particle_system.c */
+void initialize_particle(struct ParticleData *pa, int p, struct Object *ob, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd);
+void reset_particle(struct ParticleData *pa, struct ParticleSystem *psys, struct ParticleSystemModifierData *psmd, struct Object *ob, float dtime, float cfra, float *vg_vel, float *vg_tan, float *vg_rot);
+
+int psys_particle_dm_face_lookup(struct Object *ob, struct DerivedMesh *dm, int index, float *fw, struct LinkNode *node);
+
+/* ParticleEffectorCache->type */
+#define PSYS_EC_EFFECTOR 1
+#define PSYS_EC_DEFLECT 2
+#define PSYS_EC_PARTICLE 4
+#define PSYS_EC_REACTOR 8
+
+/* ParticleEditKey->flag */
+#define PEK_SELECT 1
+#define PEK_TO_SELECT 2
+#define PEK_TAG 4
+#define PEK_HIDE 8
+
+/* index_dmcache */
+#define DMCACHE_NOTFOUND -1
+#define DMCACHE_ISCHILD -2
+
+#endif
diff --git a/source/blender/blenkernel/BKE_pointcache.h b/source/blender/blenkernel/BKE_pointcache.h
new file mode 100644
index 00000000000..46d240a4183
--- /dev/null
+++ b/source/blender/blenkernel/BKE_pointcache.h
@@ -0,0 +1,48 @@
+/*
+*
+* ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*
+* The Original Code is Copyright (C) 2006 Blender Foundation.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): Campbell Barton <ideasman42@gmail.com>
+*
+* ***** END GPL LICENSE BLOCK *****
+*/
+
+#ifndef BKE_POINTCACHE_H
+#define BKE_POINTCACHE_H
+
+#include "DNA_ID.h"
+
+/* options for clearing pointcache - used for BKE_ptcache_id_clear
+ Before and after are non inclusive (they wont remove the cfra) */
+#define PTCACHE_CLEAR_ALL 0
+#define PTCACHE_CLEAR_FRAME 1
+#define PTCACHE_CLEAR_BEFORE 2
+#define PTCACHE_CLEAR_AFTER 3
+
+#define PTCACHE_EXT ".bphys"
+#define PTCACHE_PATH "//pointcache/"
+
+int BKE_ptcache_id_filename(struct ID *id, char *filename, int cfra, int stack_index, short do_path, short do_ext);
+FILE * BKE_ptcache_id_fopen(struct ID *id, char mode, int cfra, int stack_index);
+void BKE_ptcache_id_clear(struct ID *id, char mode, int cfra, int stack_index);
+
+#endif
diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h
index 15200bf46f8..0f58b93730a 100644
--- a/source/blender/blenkernel/BKE_softbody.h
+++ b/source/blender/blenkernel/BKE_softbody.h
@@ -37,12 +37,25 @@
struct Object;
struct SoftBody;
+typedef struct BodyPoint {
+ float origS[3], origE[3], origT[3], pos[3], vec[3], force[3];
+ float goal;
+ float prevpos[3], prevvec[3], prevdx[3], prevdv[3]; /* used for Heun integration */
+ int nofsprings; int *springs;
+ float choke;
+ float colball;
+ short flag;
+ char octantflag;
+} BodyPoint;
+
/* allocates and initializes general main data */
extern struct SoftBody *sbNew(void);
/* frees internal data and softbody itself */
extern void sbFree(struct SoftBody *sb);
+extern void softbody_clear_cache(struct Object *ob, float framenr);
+
/* do one simul step, reading and writing vertex locs from given array */
extern void sbObjectStep(struct Object *ob, float framnr, float (*vertexCos)[3], int numVerts);
diff --git a/source/blender/blenkernel/BKE_texture.h b/source/blender/blenkernel/BKE_texture.h
index 83229ec35a2..902423482b1 100644
--- a/source/blender/blenkernel/BKE_texture.h
+++ b/source/blender/blenkernel/BKE_texture.h
@@ -52,8 +52,11 @@ int test_dlerr(const char *name, const char *symbol);
void open_plugin_tex(struct PluginTex *pit);
struct PluginTex *add_plugin_tex(char *str);
void free_plugin_tex(struct PluginTex *pit);
+
+void init_colorband(struct ColorBand *coba, int rangetype);
struct ColorBand *add_colorband(int rangetype);
int do_colorband(struct ColorBand *coba, float in, float out[4]);
+
void default_tex(struct Tex *tex);
struct Tex *add_texture(char *name);
void default_mtex(struct MTex *mtex);
diff --git a/source/blender/blenkernel/BKE_utildefines.h b/source/blender/blenkernel/BKE_utildefines.h
index 81dd2807812..f3f66190c31 100644
--- a/source/blender/blenkernel/BKE_utildefines.h
+++ b/source/blender/blenkernel/BKE_utildefines.h
@@ -57,6 +57,11 @@
#define ELEM6(a, b, c, d, e, f, g) ( ELEM(a, b, c) || ELEM4(a, d, e, f, g) )
#define ELEM7(a, b, c, d, e, f, g, h) ( ELEM3(a, b, c, d) || ELEM4(a, e, f, g, h) )
#define ELEM8(a, b, c, d, e, f, g, h, i) ( ELEM4(a, b, c, d, e) || ELEM4(a, f, g, h, i) )
+#define ELEM9(a, b, c, d, e, f, g, h, i, j) ( ELEM4(a, b, c, d, e) || ELEM5(a, f, g, h, i, j) )
+
+/* shift around elements */
+#define SHIFT3(type, a, b, c) { type tmp; tmp = a; a = c; c = b; b = tmp; }
+#define SHIFT4(type, a, b, c, d) { type tmp; tmp = a; a = d; d = c; c = b; b = tmp; }
/* string compare */
#define STREQ(str, a) ( strcmp((str), (a))==0 )
@@ -97,6 +102,7 @@
#define ABS(a) ( (a)<0 ? (-(a)) : (a) )
#define VECCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2);}
+#define VECCOPY2D(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1);}
#define QUATCOPY(v1,v2) {*(v1)= *(v2); *(v1+1)= *(v2+1); *(v1+2)= *(v2+2); *(v1+3)= *(v2+3);}
#define LONGCOPY(a, b, c) {int lcpc=c, *lcpa=(int *)a, *lcpb=(int *)b; while(lcpc-->0) *(lcpa++)= *(lcpb++);}
diff --git a/source/blender/blenkernel/BKE_verse.h b/source/blender/blenkernel/BKE_verse.h
index 8f8fb61100f..aba42302364 100644
--- a/source/blender/blenkernel/BKE_verse.h
+++ b/source/blender/blenkernel/BKE_verse.h
@@ -46,21 +46,12 @@ struct VerseEdge;
#define VEDHASH(a, b) ((a<b ? a : b) % VEDHASHSIZE)
/*
- * virtual data type (used only for retype)
- */
-typedef struct verse_parent {
- struct verse_parent *next, *prev;
- VLayerID layer_id;
- uint32 id;
-} verse_parent;
-
-/*
* verse data: 4 float value
*/
typedef struct quat_real32_item {
struct quat_real32_item *next, *prev;
- VLayerID layer_id;
- void *parent;
+ struct VLayer *vlayer; /* pointer at VerseLayer */
+ uint32 id; /* id of item */
real32 value[4];
} quat_real32_item;
@@ -69,8 +60,8 @@ typedef struct quat_real32_item {
*/
typedef struct quat_uint32_item {
struct quat_uint32_item *next, *prev;
- VLayerID layer_id;
- void *parent;
+ struct VLayer *vlayer; /* pointer at VerseLayer */
+ uint32 id; /* id of item */
uint32 value[4];
} quat_uint32_item;
@@ -79,8 +70,8 @@ typedef struct quat_uint32_item {
*/
typedef struct vec_real32_item {
struct vec_real32_item *next, *prev;
- VLayerID layer_id;
- void *parent;
+ struct VLayer *vlayer; /* pointer at VerseLayer */
+ uint32 id; /* id of item */
real32 value[3];
} vec_real32_item;
@@ -89,8 +80,8 @@ typedef struct vec_real32_item {
*/
typedef struct real32_item {
struct real32_item *next, *prev;
- VLayerID layer_id;
- void *parent;
+ struct VLayer *vlayer; /* pointer at VerseLayer */
+ uint32 id; /* id of item */
real32 value;
} real32_item;
@@ -99,8 +90,8 @@ typedef struct real32_item {
*/
typedef struct uint32_item {
struct uint32_item *next, *prev;
- VLayerID layer_id;
- void *parent;
+ struct VLayer *vlayer; /* pointer at VerseLayer */
+ uint32 id; /* id of item */
uint32 value;
} uint32_item;
@@ -109,8 +100,8 @@ typedef struct uint32_item {
*/
typedef struct uint8_item {
struct uint8_item *next, *prev;
- VLayerID layer_id;
- void *parent;
+ struct VLayer *vlayer; /* pointer at VerseLayer */
+ uint32 id; /* id of item */
uint8 value;
} uint8_item;
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index b8c23a6517d..c0776583a04 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -34,6 +34,7 @@ SET(INC
../python ../render/extern/include ../../../intern/decimation/extern
../imbuf ../avi ../../../intern/elbeem/extern
../../../intern/iksolver/extern ../blenloader ../quicktime
+ ../../../intern/bmfont
../nodes
${SDL_INC}
${ZLIB_INC}
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index d7b48105d3d..9ecc76046c7 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -7,6 +7,7 @@ incs = '. #/intern/guardedalloc ../include ../blenlib ../makesdna'
incs += ' ../python ../render/extern/include #/intern/decimation/extern'
incs += ' ../imbuf ../avi #/intern/elbeem/extern ../nodes'
incs += ' #/intern/iksolver/extern ../blenloader ../quicktime'
+incs += ' #/intern/bmfont'
incs += ' ' + env['BF_OPENGL_INC']
incs += ' ' + env['BF_ZLIB_INC']
@@ -27,6 +28,9 @@ if env['WITH_BF_VERSE']:
if env['WITH_BF_OPENEXR'] == 1:
defs += ' WITH_OPENEXR'
+if env['WITH_BF_DDS'] == 1:
+ defs += ' WITH_DDS'
+
if env['WITH_BF_FFMPEG'] == 1:
defs += ' WITH_FFMPEG'
incs += ' ' + env['BF_FFMPEG_INC']
diff --git a/source/blender/blenkernel/bad_level_call_stubs/Makefile b/source/blender/blenkernel/bad_level_call_stubs/Makefile
index 2d98ea5a1af..1d4db1037ea 100644
--- a/source/blender/blenkernel/bad_level_call_stubs/Makefile
+++ b/source/blender/blenkernel/bad_level_call_stubs/Makefile
@@ -39,10 +39,6 @@ include nan_compile.mk
CFLAGS += $(LEVEL_2_C_WARNINGS)
CFLAGS += $(FIX_STUBS_WARNINGS)
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CPPFLAGS += $(OGL_CPPFLAGS)
CPPFLAGS += -I../../makesdna
CPPFLAGS += -I../../include
diff --git a/source/blender/blenkernel/bad_level_call_stubs/stubs.c b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
index 344f763608c..7e1aca3bb20 100644
--- a/source/blender/blenkernel/bad_level_call_stubs/stubs.c
+++ b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
@@ -54,9 +54,14 @@ struct IpoCurve;
struct FluidsimSettings;
struct Render;
struct RenderResult;
+struct Object;
+struct bPythonConstraint;
+struct bConstraintOb;
+struct bConstraintTarget;
+struct ListBase;
char *getIpoCurveName( struct IpoCurve * icu );
-void insert_vert_ipo(struct IpoCurve *icu, float x, float y);
+void insert_vert_icu(struct IpoCurve *icu, float x, float y, short fast);
struct IpoCurve *verify_ipocurve(struct ID *id, short a, char *b, char *d, int e);
void elbeemDebugOut(char *msg);
void fluidsimSettingsFree(struct FluidsimSettings* sb);
@@ -80,7 +85,7 @@ char *getIpoCurveName( struct IpoCurve * icu )
return 0;
}
-void insert_vert_ipo(struct IpoCurve *icu, float x, float y)
+void insert_vert_icu(struct IpoCurve *icu, float x, float y, short fast)
{
}
@@ -124,6 +129,15 @@ int BPY_button_eval(char *expr, double *value)
return 0;
}
+/* PyConstraints - BPY_interface.c */
+void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets)
+{
+}
+void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct)
+{
+}
+
+
/* writefile.c */
/* struct Oops; */
void free_oops(struct Oops *oops){}
@@ -194,6 +208,9 @@ void IK_FreeSolver(IK_Solver *solver) {};
void IK_SolverAddGoal(IK_Solver *solver, IK_Segment *tip, float goal[3], float weight) {}
void IK_SolverAddGoalOrientation(IK_Solver *solver, IK_Segment *tip, float goal[][3], float weight) {}
+void IK_SolverSetPoleVectorConstraint(IK_Solver *solver, IK_Segment *tip, float goal[3], float polegoal[3], float poleangle, int getangle) {}
+float IK_SolverGetPoleAngle(IK_Solver *solver) { return 0.0f; }
+
int IK_Solve(IK_Solver *solver, float tolerance, int max_iterations) { return 0; }
/* exotic.c */
@@ -229,6 +246,8 @@ void fluidsimSettingsCopy(struct FluidsimSettings* sb) {}
/*new render funcs */
int externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta) { return 0; }
+void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg, int blendtype) {}
+float texture_value_blend(float tex, float out, float fact, float facg, int blendtype, int flip) { return 0; }
void RE_FreeRenderResult(struct RenderResult *rr) {}
void RE_GetResultImage(struct Render *re, struct RenderResult *rr) {}
@@ -307,6 +326,23 @@ void antialias_tagbuf(int xsize, int ysize, char *rectmove) {}
/* imagetexture.c stub */
void ibuf_sample(struct ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result) {}
-void update_for_newframe()
-{
-}
+void update_for_newframe() {}
+
+struct FileList;
+void BIF_filelist_freelib(struct FileList* filelist) {};
+
+/* edittime.c stub */
+TimeMarker *get_frame_marker(int frame){return 0;};
+
+/* editseq.c */
+Sequence *get_forground_frame_seq(int frame){return 0;};
+
+/* modifier.c stub */
+void harmonic_coordinates_bind(struct MeshDeformModifierData *mmd,
+ float (*vertexcos)[3], int totvert, float cagemat[][4]) {}
+
+/* particle.c */
+void PE_free_particle_edit(struct ParticleSystem *psys) {}
+void PE_get_colors(char sel[4], char nosel[4]) {}
+void PE_recalc_world_cos(struct Object *ob, struct ParticleSystem *psys) {}
+
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 5f8e9c7b207..5e688af14a4 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -51,9 +51,11 @@
#include "DNA_object_force.h"
#include "DNA_object_fluidsim.h" // N_T
#include "DNA_scene_types.h" // N_T
+#include "DNA_texture_types.h"
#include "DNA_view3d_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_particle_types.h"
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
@@ -61,20 +63,22 @@
#include "BLI_editVert.h"
#include "BLI_linklist.h"
-#include "BKE_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_customdata.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_deform.h"
#include "BKE_displist.h"
#include "BKE_effect.h"
#include "BKE_global.h"
+#include "BKE_key.h"
#include "BKE_material.h"
+#include "BKE_modifier.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
#include "BKE_subsurf.h"
-#include "BKE_deform.h"
-#include "BKE_modifier.h"
-#include "BKE_key.h"
+#include "BKE_texture.h"
+#include "BKE_utildefines.h"
+#include "BKE_particle.h"
#ifdef WITH_VERSE
#include "BKE_verse.h"
@@ -633,9 +637,10 @@ static void emDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *use
}
static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors)
{
+ GLubyte act_face_stipple[32*32/8] = DM_FACE_STIPPLE;
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
EditFace *efa;
- int i;
+ int i, draw;
if (emdm->vertexCos) {
EditVert *eve;
@@ -645,7 +650,13 @@ static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
int drawSmooth = (efa->flag & ME_SMOOTH);
- if(!setDrawOptions || setDrawOptions(userData, i, &drawSmooth)) {
+ draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
+ if(draw) {
+ if (draw==2) { /* enabled with stipple */
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(act_face_stipple);
+ }
+
glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
@@ -668,12 +679,20 @@ static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
}
}
glEnd();
+
+ if (draw==2)
+ glDisable(GL_POLYGON_STIPPLE);
}
}
} else {
for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
int drawSmooth = (efa->flag & ME_SMOOTH);
- if(!setDrawOptions || setDrawOptions(userData, i, &drawSmooth)) {
+ draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
+ if(draw) {
+ if (draw==2) { /* enabled with stipple */
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(act_face_stipple);
+ }
glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
@@ -696,11 +715,180 @@ static void emDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *us
}
}
glEnd();
+
+ if (draw==2)
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ }
+ }
+}
+
+static void emDM_drawFacesTex_common(DerivedMesh *dm,
+ int (*drawParams)(MTFace *tface, MCol *mcol, int matnr),
+ int (*drawParamsMapped)(void *userData, int index),
+ void *userData)
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditMesh *em= emdm->em;
+ float (*vertexCos)[3]= emdm->vertexCos;
+ float (*vertexNos)[3]= emdm->vertexNos;
+ EditFace *efa;
+ int i;
+
+ if (vertexCos) {
+ EditVert *eve;
+
+ for (i=0,eve=em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = (long) i++;
+
+ for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
+ MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ MCol *mcol= CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ unsigned char *cp= NULL;
+ int drawSmooth= (efa->flag & ME_SMOOTH);
+ int flag;
+
+ if(drawParams)
+ flag= drawParams(tf, mcol, efa->mat_nr);
+ else if(drawParamsMapped)
+ flag= drawParamsMapped(userData, i);
+ else
+ flag= 1;
+
+ if(flag != 0) { /* flag 0 == the face is hidden or invisible */
+ if (flag==1 && mcol)
+ cp= (unsigned char*)mcol;
+
+ glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+
+ glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+ if (!drawSmooth) {
+ glNormal3fv(emdm->faceNos[i]);
+
+ if(tf) glTexCoord2fv(tf->uv[0]);
+ if(cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+
+ if(tf) glTexCoord2fv(tf->uv[1]);
+ if(cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+
+ if(tf) glTexCoord2fv(tf->uv[2]);
+ if(cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+
+ if(efa->v4) {
+ if(tf) glTexCoord2fv(tf->uv[3]);
+ if(cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ } else {
+ if(tf) glTexCoord2fv(tf->uv[0]);
+ if(cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glNormal3fv(vertexNos[(int) efa->v1->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v1->tmp.l]);
+
+ if(tf) glTexCoord2fv(tf->uv[1]);
+ if(cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glNormal3fv(vertexNos[(int) efa->v2->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v2->tmp.l]);
+
+ if(tf) glTexCoord2fv(tf->uv[2]);
+ if(cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glNormal3fv(vertexNos[(int) efa->v3->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v3->tmp.l]);
+
+ if(efa->v4) {
+ if(tf) glTexCoord2fv(tf->uv[3]);
+ if(cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glNormal3fv(vertexNos[(int) efa->v4->tmp.l]);
+ glVertex3fv(vertexCos[(int) efa->v4->tmp.l]);
+ }
+ }
+ glEnd();
+ }
+ }
+ } else {
+ for (i=0,efa= em->faces.first; efa; i++,efa= efa->next) {
+ MTFace *tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ MCol *mcol= CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ unsigned char *cp= NULL;
+ int drawSmooth= (efa->flag & ME_SMOOTH);
+ int flag;
+
+ if(drawParams)
+ flag= drawParams(tf, mcol, efa->mat_nr);
+ else if(drawParamsMapped)
+ flag= drawParamsMapped(userData, i);
+ else
+ flag= 1;
+
+ if(flag != 0) { /* flag 0 == the face is hidden or invisible */
+ if (flag==1 && mcol)
+ cp= (unsigned char*)mcol;
+
+ glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+
+ glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+ if (!drawSmooth) {
+ glNormal3fv(efa->n);
+
+ if(tf) glTexCoord2fv(tf->uv[0]);
+ if(cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glVertex3fv(efa->v1->co);
+
+ if(tf) glTexCoord2fv(tf->uv[1]);
+ if(cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glVertex3fv(efa->v2->co);
+
+ if(tf) glTexCoord2fv(tf->uv[2]);
+ if(cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glVertex3fv(efa->v3->co);
+
+ if(efa->v4) {
+ if(tf) glTexCoord2fv(tf->uv[3]);
+ if(cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glVertex3fv(efa->v4->co);
+ }
+ } else {
+ if(tf) glTexCoord2fv(tf->uv[0]);
+ if(cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glNormal3fv(efa->v1->no);
+ glVertex3fv(efa->v1->co);
+
+ if(tf) glTexCoord2fv(tf->uv[1]);
+ if(cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glNormal3fv(efa->v2->no);
+ glVertex3fv(efa->v2->co);
+
+ if(tf) glTexCoord2fv(tf->uv[2]);
+ if(cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glNormal3fv(efa->v3->no);
+ glVertex3fv(efa->v3->co);
+
+ if(efa->v4) {
+ if(tf) glTexCoord2fv(tf->uv[3]);
+ if(cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glNormal3fv(efa->v4->no);
+ glVertex3fv(efa->v4->co);
+ }
+ }
+ glEnd();
}
}
}
}
+static void emDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
+{
+ emDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
+}
+
+static void emDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
+{
+ emDM_drawFacesTex_common(dm, NULL, setDrawOptions, userData);
+}
+
static void emDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
@@ -946,6 +1134,8 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em, Object *ob,
emdm->dm.drawMappedEdges = emDM_drawMappedEdges;
emdm->dm.drawMappedEdgesInterp = emDM_drawMappedEdgesInterp;
emdm->dm.drawMappedFaces = emDM_drawMappedFaces;
+ emdm->dm.drawMappedFacesTex = emDM_drawMappedFacesTex;
+ emdm->dm.drawFacesTex = emDM_drawFacesTex;
emdm->dm.drawUVEdges = emDM_drawUVEdges;
emdm->dm.release = emDM_release;
@@ -1614,7 +1804,7 @@ CustomDataMask get_viewedit_datamask()
ScrArea *sa;
/* check if we need tfaces & mcols due to face select or texture paint */
- if(G.f & G_FACESELECT || G.f & G_TEXTUREPAINT) {
+ if(FACESEL_PAINT_TEST || G.f & G_TEXTUREPAINT) {
mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
} else {
/* check if we need tfaces & mcols due to view mode */
@@ -1625,7 +1815,7 @@ CustomDataMask get_viewedit_datamask()
/* this includes normals for mesh_create_shadedColors */
mask |= CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_NORMAL;
}
- if(view->drawtype == OB_TEXTURE) {
+ if((view->drawtype == OB_TEXTURE) || ((view->drawtype == OB_SOLID) && (view->flag2 & V3D_SOLID_TEX))) {
mask |= CD_MASK_MTFACE | CD_MASK_MCOL;
}
}
@@ -1729,7 +1919,10 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
} else {
if(!fluidsimMeshUsed) {
/* default behaviour for meshes */
- deformedVerts = inputVertexCos;
+ if(inputVertexCos)
+ deformedVerts = inputVertexCos;
+ else
+ deformedVerts = mesh_getRefKeyCos(me, &numVerts);
} else {
/* the fluid sim mesh might have more vertices than the original
* one, so inputVertexCos shouldnt be used
@@ -1770,6 +1963,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
*/
if(mti->type == eModifierTypeType_OnlyDeform) {
+
/* No existing verts to deform, need to build them. */
if(!deformedVerts) {
if(dm) {
@@ -1811,9 +2005,12 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3],
/* set the DerivedMesh to only copy needed data */
DM_set_only_copy(dm, (CustomDataMask)curr->link);
-
- ndm = mti->applyModifier(md, ob, dm, useRenderParams,
- !inputVertexCos);
+
+ if(((CustomDataMask)curr->link) & CD_MASK_ORIGSPACE)
+ if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
+ CustomData_add_layer(&dm->faceData, CD_ORIGSPACE, CD_DEFAULT, NULL, dm->getNumFaces(dm));
+
+ ndm = mti->applyModifier(md, ob, dm, useRenderParams, !inputVertexCos);
if(ndm) {
/* if the modifier returned a new dm, release the old one */
@@ -1887,6 +2084,24 @@ static float (*editmesh_getVertexCos(EditMesh *em, int *numVerts_r))[3]
return cos;
}
+static int editmesh_modifier_is_enabled(ModifierData *md, DerivedMesh *dm)
+{
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
+
+ if((md->mode & required_mode) != required_mode) return 0;
+ if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
+ modifier_setError(md, "Internal error, modifier requires"
+ "original data (bad stack position).");
+ return 0;
+ }
+ if(mti->isDisabled && mti->isDisabled(md)) return 0;
+ if(!(mti->flags & eModifierTypeFlag_SupportsEditmode)) return 0;
+ if(md->mode & eModifierMode_DisableTemporary) return 0;
+
+ return 1;
+}
+
static void editmesh_calc_modifiers(DerivedMesh **cage_r,
DerivedMesh **final_r,
CustomDataMask dataMask)
@@ -1897,7 +2112,6 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r,
float (*deformedVerts)[3] = NULL;
DerivedMesh *dm;
int i, numVerts = 0, cageIndex = modifiers_getCageIndex(ob, NULL);
- int required_mode = eModifierMode_Realtime | eModifierMode_Editmode;
LinkNode *datamasks, *curr;
modifiers_clearErrors(ob);
@@ -1918,14 +2132,8 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r,
for(i = 0; md; i++, md = md->next, curr = curr->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- if((md->mode & required_mode) != required_mode) continue;
- if((mti->flags & eModifierTypeFlag_RequiresOriginalData) && dm) {
- modifier_setError(md, "Internal error, modifier requires"
- "original data (bad stack position).");
+ if(!editmesh_modifier_is_enabled(md, dm))
continue;
- }
- if(mti->isDisabled && mti->isDisabled(md)) continue;
- if(!(mti->flags & eModifierTypeFlag_SupportsEditmode)) continue;
/* How to apply modifier depends on (a) what we already have as
* a result of previous modifiers (could be a DerivedMesh or just
@@ -1980,6 +2188,10 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r,
/* set the DerivedMesh to only copy needed data */
DM_set_only_copy(dm, (CustomDataMask)curr->link);
+ if(((CustomDataMask)curr->link) & CD_MASK_ORIGSPACE)
+ if(!CustomData_has_layer(&dm->faceData, CD_ORIGSPACE))
+ CustomData_add_layer(&dm->faceData, CD_ORIGSPACE, CD_DEFAULT, NULL, dm->getNumFaces(dm));
+
ndm = mti->applyModifierEM(md, ob, em, dm);
if (ndm) {
@@ -2071,10 +2283,10 @@ void weight_to_rgb(float input, float *fr, float *fg, float *fb)
*fb= 0.0f;
}
}
-static void calc_weightpaint_vert_color(Object *ob, int vert, unsigned char *col)
+static void calc_weightpaint_vert_color(Object *ob, ColorBand *coba, int vert, unsigned char *col)
{
Mesh *me = ob->data;
- float fr, fg, fb, input = 0.0f;
+ float colf[4], input = 0.0f;
int i;
if (me->dvert) {
@@ -2085,29 +2297,41 @@ static void calc_weightpaint_vert_color(Object *ob, int vert, unsigned char *col
CLAMP(input, 0.0f, 1.0f);
- weight_to_rgb(input, &fr, &fg, &fb);
+ if(coba)
+ do_colorband(coba, input, colf);
+ else
+ weight_to_rgb(input, colf, colf+1, colf+2);
- col[3] = (unsigned char)(fr * 255.0f);
- col[2] = (unsigned char)(fg * 255.0f);
- col[1] = (unsigned char)(fb * 255.0f);
+ col[3] = (unsigned char)(colf[0] * 255.0f);
+ col[2] = (unsigned char)(colf[1] * 255.0f);
+ col[1] = (unsigned char)(colf[2] * 255.0f);
col[0] = 255;
}
+
+static ColorBand *stored_cb= NULL;
+
+void vDM_ColorBand_store(ColorBand *coba)
+{
+ stored_cb= coba;
+}
+
static unsigned char *calc_weightpaint_colors(Object *ob)
{
Mesh *me = ob->data;
MFace *mf = me->mface;
+ ColorBand *coba= stored_cb; /* warning, not a local var */
unsigned char *wtcol;
int i;
wtcol = MEM_callocN (sizeof (unsigned char) * me->totface*4*4, "weightmap");
memset(wtcol, 0x55, sizeof (unsigned char) * me->totface*4*4);
- for (i=0; i<me->totface; i++, mf++){
- calc_weightpaint_vert_color(ob, mf->v1, &wtcol[(i*4 + 0)*4]);
- calc_weightpaint_vert_color(ob, mf->v2, &wtcol[(i*4 + 1)*4]);
- calc_weightpaint_vert_color(ob, mf->v3, &wtcol[(i*4 + 2)*4]);
+ for (i=0; i<me->totface; i++, mf++) {
+ calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 0)*4]);
+ calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 1)*4]);
+ calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 2)*4]);
if (mf->v4)
- calc_weightpaint_vert_color(ob, mf->v4, &wtcol[(i*4 + 3)*4]);
+ calc_weightpaint_vert_color(ob, coba, mf->v4, &wtcol[(i*4 + 3)*4]);
}
return wtcol;
@@ -2146,7 +2370,7 @@ static void mesh_build_data(Object *ob, CustomDataMask dataMask)
if(ob!=G.obedit) {
Object *obact = G.scene->basact?G.scene->basact->object:NULL;
- int editing = (G.f & (G_FACESELECT|G_WEIGHTPAINT|G_VERTEXPAINT|G_TEXTUREPAINT));
+ int editing = (FACESEL_PAINT_TEST)|(G.f & G_PARTICLEEDIT);
int needMapping = editing && (ob==obact);
if( (G.f & G_WEIGHTPAINT) && ob==obact ) {
@@ -2461,6 +2685,61 @@ float *mesh_get_mapped_verts_nors(Object *ob)
return vertexcosnos;
}
+/* ********* crazyspace *************** */
+
+int editmesh_get_first_deform_matrices(float (**deformmats)[3][3], float (**deformcos)[3])
+{
+ Object *ob = G.obedit;
+ EditMesh *em = G.editMesh;
+ ModifierData *md;
+ DerivedMesh *dm;
+ int i, a, numleft = 0, numVerts = 0;
+ int cageIndex = modifiers_getCageIndex(ob, NULL);
+ float (*defmats)[3][3] = NULL, (*deformedVerts)[3] = NULL;
+
+ modifiers_clearErrors(ob);
+
+ dm = NULL;
+ md = ob->modifiers.first;
+
+ /* compute the deformation matrices and coordinates for the first
+ modifiers with on cage editing that are enabled and support computing
+ deform matrices */
+ for(i = 0; md && i <= cageIndex; i++, md = md->next) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+ if(!editmesh_modifier_is_enabled(md, dm))
+ continue;
+
+ if(mti->type==eModifierTypeType_OnlyDeform && mti->deformMatricesEM) {
+ if(!defmats) {
+ dm= getEditMeshDerivedMesh(em, ob, NULL);
+ deformedVerts= editmesh_getVertexCos(em, &numVerts);
+ defmats= MEM_callocN(sizeof(*defmats)*numVerts, "defmats");
+
+ for(a=0; a<numVerts; a++)
+ Mat3One(defmats[a]);
+ }
+
+ mti->deformMatricesEM(md, ob, em, dm, deformedVerts, defmats,
+ numVerts);
+ }
+ else
+ break;
+ }
+
+ for(; md && i <= cageIndex; md = md->next, i++)
+ if(editmesh_modifier_is_enabled(md, dm) && modifier_isDeformer(md))
+ numleft++;
+
+ if(dm)
+ dm->release(dm);
+
+ *deformmats= defmats;
+ *deformcos= deformedVerts;
+
+ return numleft;
+}
/* ************************* fluidsim bobj file handling **************************** */
diff --git a/source/blender/blenkernel/intern/Makefile b/source/blender/blenkernel/intern/Makefile
index a6b14a72690..89b91ed2a8f 100644
--- a/source/blender/blenkernel/intern/Makefile
+++ b/source/blender/blenkernel/intern/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd openbsd linux solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
# OpenGL and Python
@@ -64,6 +60,8 @@ CPPFLAGS += -I../../include
# to include the render stuff:
CPPFLAGS += -I../../render/extern/include
+# for image stamping
+CPPFLAGS += -I$(NAN_BMFONT)/include
# for sound
#CPPFLAGS += -I../../../kernel/gen_system
CPPFLAGS += $(NAN_SDLCFLAGS)
@@ -101,6 +99,10 @@ ifeq ($(WITH_OPENEXR), true)
CPPFLAGS += -DWITH_OPENEXR
endif
+ifeq ($(WITH_DDS), true)
+ CPPFLAGS += -DWITH_DDS
+endif
+
ifeq ($(WITH_QUICKTIME), true)
CPPFLAGS += -I../../quicktime
CPPFLAGS += -DWITH_QUICKTIME
diff --git a/source/blender/blenkernel/intern/action.c b/source/blender/blenkernel/intern/action.c
index aa9d3d30f98..e30d7dd4ac9 100644
--- a/source/blender/blenkernel/intern/action.c
+++ b/source/blender/blenkernel/intern/action.c
@@ -112,7 +112,6 @@ static void make_local_action_channels(bAction *act)
}
}
}
-
}
void make_local_action(bAction *act)
@@ -165,27 +164,27 @@ void make_local_action(bAction *act)
}
-void free_action(bAction *act)
+void free_action (bAction *act)
{
bActionChannel *chan;
/* Free channels */
- for (chan=act->chanbase.first; chan; chan=chan->next){
+ for (chan=act->chanbase.first; chan; chan=chan->next) {
if (chan->ipo)
chan->ipo->id.us--;
free_constraint_channels(&chan->constraintChannels);
}
if (act->chanbase.first)
- BLI_freelistN (&act->chanbase);
+ BLI_freelistN(&act->chanbase);
}
-bAction* copy_action(bAction *src)
+bAction *copy_action (bAction *src)
{
bAction *dst = NULL;
bActionChannel *dchan, *schan;
- if(!src) return NULL;
+ if (!src) return NULL;
dst= copy_libblock(src);
duplicatelist(&(dst->chanbase), &(src->chanbase));
@@ -225,12 +224,12 @@ bPoseChannel *verify_pose_channel(bPose* pose, const char* name)
{
bPoseChannel *chan;
- if (!pose){
+ if (!pose) {
return NULL;
}
/* See if this channel exists */
- for (chan=pose->chanbase.first; chan; chan=chan->next){
+ for (chan=pose->chanbase.first; chan; chan=chan->next) {
if (!strcmp (name, chan->name))
return chan;
}
@@ -239,7 +238,7 @@ bPoseChannel *verify_pose_channel(bPose* pose, const char* name)
chan = MEM_callocN(sizeof(bPoseChannel), "verifyPoseChannel");
strncpy (chan->name, name, 31);
- /* init vars to prevent mat errors */
+ /* init vars to prevent math errors */
chan->quat[0] = 1.0F;
chan->size[0] = chan->size[1] = chan->size[2] = 1.0F;
@@ -247,6 +246,8 @@ bPoseChannel *verify_pose_channel(bPose* pose, const char* name)
chan->limitmax[0]= chan->limitmax[1]= chan->limitmax[2]= 180.0f;
chan->stiffness[0]= chan->stiffness[1]= chan->stiffness[2]= 0.0f;
+ Mat4One(chan->constinv);
+
BLI_addtail (&pose->chanbase, chan);
return chan;
@@ -304,8 +305,10 @@ static void copy_pose_channel_data(bPoseChannel *pchan, const bPoseChannel *chan
pchan->flag= chan->flag;
con= chan->constraints.first;
- for(pcon= pchan->constraints.first; pcon; pcon= pcon->next)
+ for(pcon= pchan->constraints.first; pcon; pcon= pcon->next) {
pcon->enforce= con->enforce;
+ pcon->headtail= con->headtail;
+ }
}
/* checks for IK constraint, can do more constraints flags later */
@@ -350,6 +353,28 @@ void update_pose_constraint_flags(bPose *pose)
}
}
+/* Clears all BONE_UNKEYED flags for every pose channel in every pose
+ * This should only be called on frame changing, when it is acceptable to
+ * do this. Otherwise, these flags should not get cleared as poses may get lost.
+ */
+void framechange_poses_clear_unkeyed(void)
+{
+ Object *ob;
+ bPose *pose;
+ bPoseChannel *pchan;
+
+ /* This needs to be done for each object that has a pose */
+ // TODO: proxies may/may not be correctly handled here... (this needs checking)
+ for (ob= G.main->object.first; ob; ob= ob->id.next) {
+ /* we only need to do this on objects with a pose */
+ if ( (pose= ob->pose) ) {
+ for (pchan= pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (pchan->bone)
+ pchan->bone->flag &= ~BONE_UNKEYED;
+ }
+ }
+ }
+}
/* ************************ END Pose channels *************** */
@@ -456,10 +481,10 @@ static void blend_pose_strides(bPose *dst, bPose *src, float srcweight, short mo
float dstweight;
switch (mode){
- case POSE_BLEND:
+ case ACTSTRIPMODE_BLEND:
dstweight = 1.0F - srcweight;
break;
- case POSE_ADD:
+ case ACTSTRIPMODE_ADD:
dstweight = 1.0F;
break;
default :
@@ -561,10 +586,10 @@ void blend_poses(bPose *dst, bPose *src, float srcweight, short mode)
int i;
switch (mode){
- case POSE_BLEND:
+ case ACTSTRIPMODE_BLEND:
dstweight = 1.0F - srcweight;
break;
- case POSE_ADD:
+ case ACTSTRIPMODE_ADD:
dstweight = 1.0F;
break;
default :
@@ -580,10 +605,12 @@ void blend_poses(bPose *dst, bPose *src, float srcweight, short mode)
if (schan->flag & POSE_ROT) {
QUATCOPY(dquat, dchan->quat);
QUATCOPY(squat, schan->quat);
- if(mode==POSE_BLEND)
+ if(mode==ACTSTRIPMODE_BLEND)
QuatInterpol(dchan->quat, dquat, squat, srcweight);
- else
- QuatAdd(dchan->quat, dquat, squat, srcweight);
+ else {
+ QuatMulFac(squat, srcweight);
+ QuatMul(dchan->quat, dquat, squat);
+ }
NormalQuat (dchan->quat);
}
@@ -679,9 +706,15 @@ void extract_pose_from_action(bPose *pose, bAction *act, float ctime)
/* Copy the data from the action into the pose */
for (pchan= pose->chanbase.first; pchan; pchan=pchan->next) {
+ /* skip this pose channel if it has been tagged as having unkeyed poses */
+ if ((pchan->bone) && (pchan->bone->flag & BONE_UNKEYED))
+ continue;
+
+ /* get action channel and clear pchan-transform flags */
achan= get_action_channel(act, pchan->name);
pchan->flag &= ~(POSE_LOC|POSE_ROT|POSE_SIZE);
- if(achan) {
+
+ if (achan) {
ipo = achan->ipo;
if (ipo) {
/* Evaluates and sets the internal ipo value */
@@ -689,7 +722,8 @@ void extract_pose_from_action(bPose *pose, bAction *act, float ctime)
/* This call also sets the pchan flags */
execute_action_ipo(achan, pchan);
}
- do_constraint_channels(&pchan->constraints, &achan->constraintChannels, ctime);
+ /* 0 = do all ipos, not only drivers */
+ do_constraint_channels(&pchan->constraints, &achan->constraintChannels, ctime, 0);
}
}
@@ -789,7 +823,7 @@ static void extract_ipochannels_from_action(ListBase *lb, ID *id, bAction *act,
if(conchan && conchan->ipo) {
calc_ipo(conchan->ipo, ctime);
-
+
icu= conchan->ipo->curve.first; // only one ipo now
if(icu) {
nic= MEM_callocN(sizeof(NlaIpoChannel), "NlaIpoChannel constr");
@@ -823,10 +857,10 @@ static void blend_ipochannels(ListBase *dst, ListBase *src, float srcweight, int
float dstweight;
switch (mode){
- case POSE_BLEND:
+ case ACTSTRIPMODE_BLEND:
dstweight = 1.0F - srcweight;
break;
- case POSE_ADD:
+ case ACTSTRIPMODE_ADD:
dstweight = 1.0F;
break;
default :
@@ -1031,6 +1065,46 @@ static Object *get_parent_path(Object *ob)
/* ************** do the action ************ */
+/* For the calculation of the effects of an action at the given frame on an object
+ * This is currently only used for the action constraint
+ */
+void what_does_obaction (Object *ob, bAction *act, float cframe)
+{
+ ListBase tchanbase= {NULL, NULL};
+
+ clear_workob();
+ Mat4CpyMat4(workob.obmat, ob->obmat);
+ Mat4CpyMat4(workob.parentinv, ob->parentinv);
+ Mat4CpyMat4(workob.constinv, ob->constinv);
+ workob.parent= ob->parent;
+ workob.track= ob->track;
+
+ workob.trackflag= ob->trackflag;
+ workob.upflag= ob->upflag;
+
+ workob.partype= ob->partype;
+ workob.par1= ob->par1;
+ workob.par2= ob->par2;
+ workob.par3= ob->par3;
+
+ workob.constraints.first = ob->constraints.first;
+ workob.constraints.last = ob->constraints.last;
+
+ strcpy(workob.parsubstr, ob->parsubstr);
+
+ /* extract_ipochannels_from_action needs id's! */
+ workob.action= act;
+
+ extract_ipochannels_from_action(&tchanbase, &ob->id, act, "Object", bsystem_time(&workob, cframe, 0.0));
+
+ if (tchanbase.first) {
+ execute_ipochannels(&tchanbase);
+ BLI_freelistN(&tchanbase);
+ }
+}
+
+/* ----- nla, etc. --------- */
+
static void do_nla(Object *ob, int blocktype)
{
bPose *tpose= NULL;
@@ -1039,7 +1113,7 @@ static void do_nla(Object *ob, int blocktype)
bActionStrip *strip, *striplast=NULL, *stripfirst=NULL;
float striptime, frametime, length, actlength;
float blendfac, stripframe;
- float scene_cfra= G.scene->r.cfra;
+ float scene_cfra= frame_to_float(G.scene->r.cfra);
int doit, dostride;
if(blocktype==ID_AR) {
@@ -1069,10 +1143,10 @@ static void do_nla(Object *ob, int blocktype)
}
}
if(strip==NULL) { /* extend */
- if(stripfirst)
- scene_cfra= stripfirst->start;
- else if(striplast)
+ if(striplast)
scene_cfra= striplast->end;
+ else if(stripfirst)
+ scene_cfra= stripfirst->start;
}
/* and now go over all strips */
@@ -1109,7 +1183,7 @@ static void do_nla(Object *ob, int blocktype)
if(cu->path) {
/* Find the position on the path */
- ctime= bsystem_time(ob, parent, scene_cfra, 0.0);
+ ctime= bsystem_time(ob, scene_cfra, 0.0);
if(calc_ipo_spec(cu->ipo, CU_SPEED, &ctime)==0) {
/* correct for actions not starting on zero */
@@ -1131,7 +1205,7 @@ static void do_nla(Object *ob, int blocktype)
}
frametime = (striptime * actlength) + strip->actstart;
- frametime= bsystem_time(ob, 0, frametime, 0.0);
+ frametime= bsystem_time(ob, frametime, 0.0);
if(blocktype==ID_AR) {
extract_pose_from_action (tpose, strip->act, frametime);
@@ -1182,7 +1256,7 @@ static void do_nla(Object *ob, int blocktype)
frametime = actlength * (strip->repeat-(int)strip->repeat);
if(frametime<=0.000001f) frametime= actlength; /* rounding errors... */
- frametime= bsystem_time(ob, 0, frametime+strip->actstart, 0.0);
+ frametime= bsystem_time(ob, frametime+strip->actstart, 0.0);
if(blocktype==ID_AR)
extract_pose_from_action (tpose, strip->act, frametime);
@@ -1251,12 +1325,11 @@ static void do_nla(Object *ob, int blocktype)
void do_all_pose_actions(Object *ob)
{
-
- // only to have safe calls from editor
+ /* only to have safe calls from editor */
if(ob==NULL) return;
if(ob->type!=OB_ARMATURE || ob->pose==NULL) return;
- if(ob->pose->flag & POSE_LOCKED) { // no actions to execute while transform
+ if(ob->pose->flag & POSE_LOCKED) { /* no actions to execute while transform */
if(ob->pose->flag & POSE_DO_UNLOCK)
ob->pose->flag &= ~(POSE_LOCKED|POSE_DO_UNLOCK);
}
@@ -1265,11 +1338,14 @@ void do_all_pose_actions(Object *ob)
cframe= get_action_frame(ob, cframe);
- extract_pose_from_action (ob->pose, ob->action, bsystem_time(ob, 0, cframe, 0.0));
+ extract_pose_from_action (ob->pose, ob->action, bsystem_time(ob, cframe, 0.0));
}
else if(ob->nlastrips.first) {
do_nla(ob, ID_AR);
}
+
+ /* clear POSE_DO_UNLOCK flags that might have slipped through (just in case) */
+ ob->pose->flag &= ~POSE_DO_UNLOCK;
}
/* called from where_is_object */
@@ -1286,9 +1362,9 @@ void do_all_object_actions(Object *ob)
cframe= get_action_frame(ob, cframe);
- extract_ipochannels_from_action(&tchanbase, &ob->id, ob->action, "Object", bsystem_time(ob, 0, cframe, 0.0));
+ extract_ipochannels_from_action(&tchanbase, &ob->id, ob->action, "Object", bsystem_time(ob, cframe, 0.0));
if(key)
- extract_ipochannels_from_action(&tchanbase, &key->id, ob->action, "Shape", bsystem_time(ob, 0, cframe, 0.0));
+ extract_ipochannels_from_action(&tchanbase, &key->id, ob->action, "Shape", bsystem_time(ob, cframe, 0.0));
if(tchanbase.first) {
execute_ipochannels(&tchanbase);
@@ -1299,5 +1375,3 @@ void do_all_object_actions(Object *ob)
do_nla(ob, ID_OB);
}
}
-
-
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 0019308a569..43168733b3f 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -38,6 +38,7 @@
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
+#include "BLI_rand.h"
#include "DNA_listBase.h"
#include "DNA_curve_types.h"
@@ -47,6 +48,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_view3d_types.h"
#include "DNA_vfont_types.h"
@@ -60,8 +62,10 @@
#include "BKE_global.h"
#include "BKE_ipo.h"
#include "BKE_key.h"
+#include "BKE_lattice.h"
#include "BKE_main.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_utildefines.h"
#include "BKE_bad_level_calls.h"
@@ -384,8 +388,12 @@ static void vertex_dupli__mapFunc(void *userData, int index, float *co, float *n
VECCOPY(obmat[3], vec);
if(vdd->par->transflag & OB_DUPLIROT) {
-
- vec[0]= -no_f[0]; vec[1]= -no_f[1]; vec[2]= -no_f[2];
+ if(no_f) {
+ vec[0]= -no_f[0]; vec[1]= -no_f[1]; vec[2]= -no_f[2];
+ }
+ else if(no_s) {
+ vec[0]= -no_s[0]; vec[1]= -no_s[1]; vec[2]= -no_s[2];
+ }
q2= vectoquat(vec, vdd->ob->trackflag, vdd->ob->upflag);
@@ -559,134 +567,143 @@ static void face_duplilist(ListBase *lb, Scene *sce, Object *par)
dm->release(dm);
}
-
-
-static void particle_duplilist(ListBase *lb, Scene *sce, Object *par, PartEff *paf)
+static void new_particle_duplilist(ListBase *lb, Scene *sce, Object *par, ParticleSystem *psys)
{
- Object *ob, copyob;
- Base *base;
- Particle *pa;
- float ctime, vec1[3];
- float vec[3], tmat[4][4], mat[3][3];
- float *q2;
- int lay, a, counter; /* counter is used to find in render the indexed object */
-
- pa= paf->keys;
- if(pa==NULL || (G.rendering && paf->disp!=100)) {
- build_particle_system(par);
- pa= paf->keys;
- if(pa==NULL) return;
- }
-
- ctime= bsystem_time(par, 0, (float)G.scene->r.cfra, 0.0);
+ GroupObject *go;
+ Object *ob, **oblist=0;
+ ParticleSettings *part;
+ ParticleData *pa;
+ ParticleKey state;
+ float ctime, pa_time;
+ float tmat[4][4], mat[3][3], obrotmat[3][3], parotmat[3][3], size=0.0;
+ float xvec[3] = {-1.0, 0.0, 0.0}, *q;
+ int lay, a, k, step_nbr = 0, counter;
+ int totpart, totchild, totgroup=0, pa_num;
+
+ if(psys==0) return;
+ part=psys->part;
+
+ if(part==0) return;
+
+ ctime = bsystem_time(par, (float)G.scene->r.cfra, 0.0);
+
+ totpart = psys->totpart;
+ totchild = psys->totchild;
+
+ BLI_srandom(31415926 + psys->seed);
+
lay= G.scene->lay;
+ if((part->draw_as == PART_DRAW_OB && part->dup_ob) ||
+ (part->draw_as == PART_DRAW_GR && part->dup_group && part->dup_group->gobject.first)) {
- for(base= sce->base.first; base; base= base->next) {
- if(base->object->type>0 && (base->lay & lay) && G.obedit!=base->object) {
- ob= base->object->parent;
- while(ob) {
- if(ob==par) {
-
- ob= base->object;
- /* temp copy, to have ipos etc to work OK */
- copyob= *ob;
-
- /* don't want parent animation to apply on past object positions */
- if(!(paf->flag & PAF_STATIC))
- ob->parent= NULL;
-
- for(a=0, pa= paf->keys, counter=0; a<paf->totpart; a++, pa+=paf->totkey, counter++) {
-
- if(paf->flag & PAF_STATIC) {
- float mtime;
-
- where_is_particle(paf, pa, pa->time, vec1);
- mtime= pa->time+pa->lifetime;
-
- for(ctime= pa->time; ctime<mtime; ctime+=paf->staticstep, counter++) {
-
- /* make sure hair grows until the end.. */
- if(ctime>pa->time+pa->lifetime) ctime= pa->time+pa->lifetime;
-
- /* to give ipos in object correct offset */
- where_is_object_time(ob, ctime-pa->time);
-
- where_is_particle(paf, pa, ctime, vec); // makes sure there's always a vec
- Mat4MulVecfl(par->obmat, vec);
-
- if(paf->stype==PAF_VECT) {
- where_is_particle(paf, pa, ctime+1.0, vec1); // makes sure there's always a vec
- Mat4MulVecfl(par->obmat, vec1);
-
- VecSubf(vec1, vec1, vec);
- q2= vectoquat(vec1, ob->trackflag, ob->upflag);
-
- QuatToMat3(q2, mat);
- Mat4CpyMat4(tmat, ob->obmat);
- Mat4MulMat43(ob->obmat, tmat, mat);
- }
-
- VECCOPY(ob->obmat[3], vec);
- /* put object back in original state, so it cam be restored OK */
- Mat4CpyMat4(tmat, ob->obmat);
- Mat4CpyMat4(ob->obmat, copyob.obmat);
- new_dupli_object(lb, ob, tmat, par->lay, counter);
- }
- }
- else { // non static particles
-
- if((paf->flag & PAF_UNBORN)==0 && ctime < pa->time) continue;
- if((paf->flag & PAF_DIED)==0 && ctime > pa->time+pa->lifetime) continue;
+ if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) && part->draw & PART_DRAW_KEYS)
+ step_nbr = part->keys_step;
+ else
+ step_nbr = 0;
- //if(ctime < pa->time+pa->lifetime) {
+ psys->lattice = psys_get_lattice(par, psys);
- /* to give ipos in object correct offset, ob->parent is NULLed */
- where_is_object_time(ob, ctime-pa->time);
-
- where_is_particle(paf, pa, ctime, vec);
- if(paf->stype==PAF_VECT) {
-
- /* if particle died, we use previous position */
- if(ctime > pa->time+pa->lifetime) {
- where_is_particle(paf, pa, pa->time+pa->lifetime-1.0f, vec1);
- VecSubf(vec1, vec, vec1);
- }
- else {
- where_is_particle(paf, pa, ctime+1.0f, vec1);
- VecSubf(vec1, vec1, vec);
- }
- q2= vectoquat(vec1, ob->trackflag, ob->upflag);
-
- QuatToMat3(q2, mat);
- Mat4CpyMat4(tmat, ob->obmat);
- Mat4MulMat43(ob->obmat, tmat, mat);
- }
+ if(part->draw_as==PART_DRAW_GR) {
+ group_handle_recalc_and_update(par, part->dup_group);
- VECCOPY(ob->obmat[3], vec);
-
- /* put object back in original state, so it can be restored OK */
- Mat4CpyMat4(tmat, ob->obmat);
- Mat4CpyMat4(ob->obmat, copyob.obmat);
- new_dupli_object(lb, ob, tmat, par->lay, counter);
- }
+ go= part->dup_group->gobject.first;
+ while(go) {
+ go=go->next;
+ totgroup++;
+ }
+
+ oblist= MEM_callocN(totgroup*sizeof(Object *), "dupgroup object list");
+ go= part->dup_group->gobject.first;
+ for(a=0; a<totgroup; a++, go=go->next)
+ oblist[a]=go->ob;
+ }
+
+ if(totchild==0 || part->draw & PART_DRAW_PARENT)
+ a=0;
+ else
+ a=totpart;
+
+ for(pa=psys->particles,counter=0; a<totpart+totchild; a++,pa++,counter++) {
+ if(a<totpart) {
+ if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP)) continue;
+
+ pa_num=pa->num;
+
+ pa_time=pa->time;
+
+ size=pa->size;
+ }
+ else {
+ /* TODO: figure these two out */
+ pa_num = a;
+ pa_time = psys->particles[psys->child[a - totpart].parent].time;
+
+ size=psys_get_child_size(psys, a - totpart, ctime, 0);
+ }
+
+ if(part->draw_as==PART_DRAW_GR) {
+ if(part->draw&PART_DRAW_RAND_GR)
+ ob = oblist[BLI_rand() % totgroup];
+ else if(part->from==PART_FROM_PARTICLE)
+ ob = oblist[pa_num % totgroup];
+ else
+ ob = oblist[a % totgroup];
+ }
+ else
+ ob = part->dup_ob;
+
+ for(k=0; k<=step_nbr; k++, counter++) {
+ if(step_nbr) {
+ state.time = (float)k / (float)step_nbr;
+ psys_get_particle_on_path(par, psys, a, &state, 0);
+ }
+ else {
+ state.time = -1.0;
+ if(psys_get_particle_state(par, psys, a, &state, 0) == 0)
+ continue;
+ }
+
+ QuatToMat3(state.rot, parotmat);
+
+ if(part->draw_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
+ for(go= part->dup_group->gobject.first; go; go= go->next) {
+
+ Mat4CpyMat4(tmat, go->ob->obmat);
+ Mat4MulMat43(tmat, go->ob->obmat, parotmat);
+ Mat4MulFloat3((float *)tmat, size);
+
+ VECADD(tmat[3], go->ob->obmat[3], state.co);
+
+ new_dupli_object(lb, go->ob, tmat, par->lay, counter);
}
- /* temp copy, to have ipos etc to work OK */
- *ob= copyob;
+ }
+ else {
+ /* to give ipos in object correct offset */
+ where_is_object_time(ob, ctime-pa_time);
- break;
+ q = vectoquat(xvec, ob->trackflag, ob->upflag);
+ QuatToMat3(q, obrotmat);
+
+ Mat3MulMat3(mat, parotmat, obrotmat);
+ Mat4CpyMat4(tmat, ob->obmat);
+ Mat4MulMat43(tmat, ob->obmat, mat);
+ Mat4MulFloat3((float *)tmat, size);
+
+ VECCOPY(tmat[3], state.co);
+
+ new_dupli_object(lb, ob, tmat, par->lay, counter);
}
- ob= ob->parent;
}
}
}
-
- if(G.rendering && paf->disp!=100) {
- MEM_freeN(paf->keys);
- paf->keys= NULL;
+ if(oblist)
+ MEM_freeN(oblist);
+
+ if(psys->lattice) {
+ end_latt_deform();
+ psys->lattice = 0;
}
-
-
}
static Object *find_family_object(Object **obar, char *family, char ch)
@@ -767,13 +784,14 @@ ListBase *object_duplilist(Scene *sce, Object *ob)
duplilist->first= duplilist->last= NULL;
if(ob->transflag & OB_DUPLI) {
- if(ob->transflag & OB_DUPLIVERTS) {
+ if(ob->transflag & OB_DUPLIPARTS) {
+ ParticleSystem *psys = ob->particlesystem.first;
+ for(; psys; psys=psys->next)
+ new_particle_duplilist(duplilist, sce, ob, psys);
+ }
+ else if(ob->transflag & OB_DUPLIVERTS) {
if(ob->type==OB_MESH) {
- PartEff *paf;
- if( (paf=give_parteff(ob)) )
- particle_duplilist(duplilist, sce, ob, paf);
- else
- vertex_duplilist(duplilist, sce, ob);
+ vertex_duplilist(duplilist, sce, ob);
}
else if(ob->type==OB_FONT) {
font_duplilist(duplilist, ob);
@@ -819,14 +837,18 @@ int count_duplilist(Object *ob)
if(ob->transflag & OB_DUPLIVERTS) {
if(ob->type==OB_MESH) {
if(ob->transflag & OB_DUPLIVERTS) {
- PartEff *paf;
- if( (paf=give_parteff(ob)) ) {
- return paf->totpart;
- }
- else {
+ ParticleSystem *psys = ob->particlesystem.first;
+ int pdup=0;
+
+ for(; psys; psys=psys->next)
+ pdup += psys->totpart;
+
+ if(pdup==0){
Mesh *me= ob->data;
return me->totvert;
}
+ else
+ return pdup;
}
}
}
diff --git a/source/blender/blenkernel/intern/armature.c b/source/blender/blenkernel/intern/armature.c
index 669724bd250..59786afd999 100644
--- a/source/blender/blenkernel/intern/armature.c
+++ b/source/blender/blenkernel/intern/armature.c
@@ -404,17 +404,38 @@ static void equalize_bezier(float *data, int desired)
/* returns pointer to static array, filled with desired amount of bone->segments elements */
/* this calculation is done within unit bone space */
-Mat4 *b_bone_spline_setup(bPoseChannel *pchan)
+Mat4 *b_bone_spline_setup(bPoseChannel *pchan, int rest)
{
static Mat4 bbone_array[MAX_BBONE_SUBDIV];
+ static Mat4 bbone_rest_array[MAX_BBONE_SUBDIV];
+ Mat4 *result_array= (rest)? bbone_rest_array: bbone_array;
bPoseChannel *next, *prev;
Bone *bone= pchan->bone;
- float h1[3], h2[3], length, hlength1, hlength2, roll;
- float mat3[3][3], imat[4][4];
+ float h1[3], h2[3], scale[3], length, hlength1, hlength2, roll1=0.0f, roll2;
+ float mat3[3][3], imat[4][4], posemat[4][4], scalemat[4][4], iscalemat[4][4];
float data[MAX_BBONE_SUBDIV+1][4], *fp;
- int a;
-
+ int a, doscale= 0;
+
length= bone->length;
+
+ if(!rest) {
+ /* check if we need to take non-uniform bone scaling into account */
+ scale[0]= VecLength(pchan->pose_mat[0]);
+ scale[1]= VecLength(pchan->pose_mat[1]);
+ scale[2]= VecLength(pchan->pose_mat[2]);
+
+ if(fabs(scale[0] - scale[1]) > 1e-6f || fabs(scale[1] - scale[2]) > 1e-6f) {
+ Mat4One(scalemat);
+ scalemat[0][0]= scale[0];
+ scalemat[1][1]= scale[1];
+ scalemat[2][2]= scale[2];
+ Mat4Invert(iscalemat, scalemat);
+
+ length *= scale[1];
+ doscale = 1;
+ }
+ }
+
hlength1= bone->ease1*length*0.390464f; // 0.5*sqrt(2)*kappa, the handle length for near-perfect circles
hlength2= bone->ease2*length*0.390464f;
@@ -430,32 +451,75 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan)
first point = (0,0,0)
last point = (0, length, 0) */
- Mat4Invert(imat, pchan->pose_mat);
+ if(rest) {
+ Mat4Invert(imat, pchan->bone->arm_mat);
+ }
+ else if(doscale) {
+ Mat4CpyMat4(posemat, pchan->pose_mat);
+ Mat4Ortho(posemat);
+ Mat4Invert(imat, posemat);
+ }
+ else
+ Mat4Invert(imat, pchan->pose_mat);
if(prev) {
+ float difmat[4][4], result[3][3], imat3[3][3];
+
/* transform previous point inside this bone space */
- VECCOPY(h1, prev->pose_head);
+ if(rest)
+ VECCOPY(h1, prev->bone->arm_head)
+ else
+ VECCOPY(h1, prev->pose_head)
Mat4MulVecfl(imat, h1);
- /* if previous bone is B-bone too, use average handle direction */
- if(prev->bone->segments>1) h1[1]-= length;
+
+ if(prev->bone->segments>1) {
+ /* if previous bone is B-bone too, use average handle direction */
+ h1[1]-= length;
+ roll1= 0.0f;
+ }
+
Normalize(h1);
VecMulf(h1, -hlength1);
+
+ if(prev->bone->segments==1) {
+ /* find the previous roll to interpolate */
+ if(rest)
+ Mat4MulMat4(difmat, prev->bone->arm_mat, imat);
+ else
+ Mat4MulMat4(difmat, prev->pose_mat, imat);
+ Mat3CpyMat4(result, difmat); // the desired rotation at beginning of next bone
+
+ vec_roll_to_mat3(h1, 0.0f, mat3); // the result of vec_roll without roll
+
+ Mat3Inv(imat3, mat3);
+ Mat3MulMat3(mat3, result, imat3); // the matrix transforming vec_roll to desired roll
+
+ roll1= atan2(mat3[2][0], mat3[2][2]);
+ }
}
else {
h1[0]= 0.0f; h1[1]= hlength1; h1[2]= 0.0f;
+ roll1= 0.0f;
}
if(next) {
float difmat[4][4], result[3][3], imat3[3][3];
/* transform next point inside this bone space */
- VECCOPY(h2, next->pose_tail);
+ if(rest)
+ VECCOPY(h2, next->bone->arm_tail)
+ else
+ VECCOPY(h2, next->pose_tail)
Mat4MulVecfl(imat, h2);
/* if next bone is B-bone too, use average handle direction */
if(next->bone->segments>1);
else h2[1]-= length;
+ Normalize(h2);
/* find the next roll to interpolate as well */
- Mat4MulMat4(difmat, next->pose_mat, imat);
+ if(rest)
+ Mat4MulMat4(difmat, next->bone->arm_mat, imat);
+ else
+ Mat4MulMat4(difmat, next->pose_mat, imat);
Mat3CpyMat4(result, difmat); // the desired rotation at beginning of next bone
vec_roll_to_mat3(h2, 0.0f, mat3); // the result of vec_roll without roll
@@ -463,18 +527,16 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan)
Mat3Inv(imat3, mat3);
Mat3MulMat3(mat3, imat3, result); // the matrix transforming vec_roll to desired roll
- roll= atan2(mat3[2][0], mat3[2][2]);
+ roll2= atan2(mat3[2][0], mat3[2][2]);
/* and only now negate handle */
- Normalize(h2);
VecMulf(h2, -hlength2);
-
}
else {
h2[0]= 0.0f; h2[1]= -hlength2; h2[2]= 0.0f;
- roll= 0.0;
+ roll2= 0.0;
}
-
+
/* make curve */
if(bone->segments > MAX_BBONE_SUBDIV)
bone->segments= MAX_BBONE_SUBDIV;
@@ -482,7 +544,7 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan)
forward_diff_bezier(0.0, h1[0], h2[0], 0.0, data[0], MAX_BBONE_SUBDIV, 4);
forward_diff_bezier(0.0, h1[1], length + h2[1], length, data[0]+1, MAX_BBONE_SUBDIV, 4);
forward_diff_bezier(0.0, h1[2], h2[2], 0.0, data[0]+2, MAX_BBONE_SUBDIV, 4);
- forward_diff_bezier(0.0, 0.390464f*roll, (1.0f-0.390464f)*roll, roll, data[0]+3, MAX_BBONE_SUBDIV, 4);
+ forward_diff_bezier(roll1, roll1 + 0.390464f*(roll2-roll1), roll2 - 0.390464f*(roll2-roll1), roll2, data[0]+3, MAX_BBONE_SUBDIV, 4);
equalize_bezier(data[0], bone->segments); // note: does stride 4!
@@ -490,53 +552,93 @@ Mat4 *b_bone_spline_setup(bPoseChannel *pchan)
for(a=0, fp= data[0]; a<bone->segments; a++, fp+=4) {
VecSubf(h1, fp+4, fp);
vec_roll_to_mat3(h1, fp[3], mat3); // fp[3] is roll
- Mat4CpyMat3(bbone_array[a].mat, mat3);
- VECCOPY(bbone_array[a].mat[3], fp);
+
+ Mat4CpyMat3(result_array[a].mat, mat3);
+ VECCOPY(result_array[a].mat[3], fp);
+
+ if(doscale) {
+ /* correct for scaling when this matrix is used in scaled space */
+ Mat4MulSerie(result_array[a].mat, iscalemat, result_array[a].mat,
+ scalemat, NULL, NULL, NULL, NULL, NULL);
+ }
}
- return bbone_array;
+ return result_array;
}
/* ************ Armature Deform ******************* */
-static void pchan_b_bone_defmats(bPoseChannel *pchan)
+static void pchan_b_bone_defmats(bPoseChannel *pchan, int use_quaternion, int rest_def)
{
Bone *bone= pchan->bone;
- Mat4 *b_bone= b_bone_spline_setup(pchan);
+ Mat4 *b_bone= b_bone_spline_setup(pchan, 0);
+ Mat4 *b_bone_rest= (rest_def)? NULL: b_bone_spline_setup(pchan, 1);
Mat4 *b_bone_mats;
+ DualQuat *b_bone_dual_quats= NULL;
+ float tmat[4][4];
int a;
- pchan->b_bone_mats=b_bone_mats= MEM_mallocN((1+bone->segments)*sizeof(Mat4), "BBone defmats");
+ /* allocate b_bone matrices and dual quats */
+ b_bone_mats= MEM_mallocN((1+bone->segments)*sizeof(Mat4), "BBone defmats");
+ pchan->b_bone_mats= b_bone_mats;
+
+ if(use_quaternion) {
+ b_bone_dual_quats= MEM_mallocN((bone->segments)*sizeof(DualQuat), "BBone dqs");
+ pchan->b_bone_dual_quats= b_bone_dual_quats;
+ }
- /* first matrix is the inverse arm_mat, to bring points in local bone space */
+ /* first matrix is the inverse arm_mat, to bring points in local bone space
+ for finding out which segment it belongs to */
Mat4Invert(b_bone_mats[0].mat, bone->arm_mat);
-
- /* then we multiply the bbone_mats with arm_mat */
+
+ /* then we make the b_bone_mats:
+ - first transform to local bone space
+ - translate over the curve to the bbone mat space
+ - transform with b_bone matrix
+ - transform back into global space */
+ Mat4One(tmat);
+
for(a=0; a<bone->segments; a++) {
- Mat4MulMat4(b_bone_mats[a+1].mat, b_bone[a].mat, bone->arm_mat);
+ if(b_bone_rest)
+ Mat4Invert(tmat, b_bone_rest[a].mat);
+ else
+ tmat[3][1] = -a*(bone->length/(float)bone->segments);
+
+ Mat4MulSerie(b_bone_mats[a+1].mat, pchan->chan_mat, bone->arm_mat,
+ b_bone[a].mat, tmat, b_bone_mats[0].mat, NULL, NULL, NULL);
+
+ if(use_quaternion)
+ Mat4ToDQuat(bone->arm_mat, b_bone_mats[a+1].mat, &b_bone_dual_quats[a]);
}
}
-static void b_bone_deform(bPoseChannel *pchan, Bone *bone, float *defpos)
+static void b_bone_deform(bPoseChannel *pchan, Bone *bone, float *co, DualQuat *dq, float defmat[][3])
{
Mat4 *b_bone= pchan->b_bone_mats;
- float segment;
+ float (*mat)[4]= b_bone[0].mat;
+ float segment, y;
int a;
- /* need to transform defpos back to bonespace */
- Mat4MulVecfl(b_bone[0].mat, defpos);
+ /* need to transform co back to bonespace, only need y */
+ y= mat[0][1]*co[0] + mat[1][1]*co[1] + mat[2][1]*co[2] + mat[3][1];
/* now calculate which of the b_bones are deforming this */
segment= bone->length/((float)bone->segments);
- a= (int) (defpos[1]/segment);
+ a= (int)(y/segment);
- /* note; by clamping it extends deform at endpoints, goes best with straight joints in restpos. */
+ /* note; by clamping it extends deform at endpoints, goes best with
+ straight joints in restpos. */
CLAMP(a, 0, bone->segments-1);
- /* since the bbone mats translate from (0.0.0) on the curve, we subtract */
- defpos[1] -= ((float)a)*segment;
-
- Mat4MulVecfl(b_bone[a+1].mat, defpos);
+ if(dq) {
+ DQuatCpyDQuat(dq, &((DualQuat*)pchan->b_bone_dual_quats)[a]);
+ }
+ else {
+ Mat4MulVecfl(b_bone[a+1].mat, co);
+
+ if(defmat)
+ Mat3CpyMat4(defmat, b_bone[a+1].mat);
+ }
}
/* using vec with dist to bone b1 - b2 */
@@ -590,12 +692,25 @@ float distfactor_to_bone (float vec[3], float b1[3], float b2[3], float rad1, fl
}
}
-static float dist_bone_deform(bPoseChannel *pchan, float *vec, float *co)
+static void pchan_deform_mat_add(bPoseChannel *pchan, float weight, float bbonemat[][3], float mat[][3])
+{
+ float wmat[3][3];
+
+ if(pchan->bone->segments>1)
+ Mat3CpyMat3(wmat, bbonemat);
+ else
+ Mat3CpyMat4(wmat, pchan->chan_mat);
+
+ Mat3MulFloat((float*)wmat, weight);
+ Mat3AddMat3(mat, mat, wmat);
+}
+
+static float dist_bone_deform(bPoseChannel *pchan, float *vec, DualQuat *dq, float mat[][3], float *co)
{
Bone *bone= pchan->bone;
- float fac;
- float cop[3];
- float contrib=0.0;
+ float fac, contrib=0.0;
+ float cop[3], bbonemat[3][3];
+ DualQuat bbonedq;
if(bone==NULL) return 0.0f;
@@ -603,62 +718,95 @@ static float dist_bone_deform(bPoseChannel *pchan, float *vec, float *co)
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.0) {
fac*=bone->weight;
contrib= fac;
if(contrib>0.0) {
+ if(vec) {
+ if(bone->segments>1)
+ // applies on cop and bbonemat
+ b_bone_deform(pchan, bone, cop, NULL, (mat)?bbonemat:NULL);
+ else
+ Mat4MulVecfl(pchan->chan_mat, cop);
- VECCOPY (cop, co);
-
- if(bone->segments>1)
- b_bone_deform(pchan, bone, cop); // applies on cop
-
- Mat4MulVecfl(pchan->chan_mat, cop);
-
- VecSubf (cop, cop, co); // Make this a delta from the base position
- cop[0]*=fac; cop[1]*=fac; cop[2]*=fac;
- VecAddf (vec, vec, cop);
+ // Make this a delta from the base position
+ VecSubf (cop, cop, co);
+ cop[0]*=fac; cop[1]*=fac; cop[2]*=fac;
+ VecAddf (vec, vec, cop);
+
+ if(mat)
+ pchan_deform_mat_add(pchan, fac, bbonemat, mat);
+ }
+ else {
+ if(bone->segments>1) {
+ b_bone_deform(pchan, bone, cop, &bbonedq, NULL);
+ DQuatAddWeighted(dq, &bbonedq, fac);
+ }
+ else
+ DQuatAddWeighted(dq, pchan->dual_quat, fac);
+ }
}
}
return contrib;
}
-static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, float *co, float *contrib)
+static void pchan_bone_deform(bPoseChannel *pchan, float weight, float *vec, DualQuat *dq, float mat[][3], float *co, float *contrib)
{
- float cop[3];
+ float cop[3], bbonemat[3][3];
+ DualQuat bbonedq;
if (!weight)
return;
- VECCOPY (cop, co);
-
- if(pchan->bone->segments>1)
- b_bone_deform(pchan, pchan->bone, cop); // applies on cop
-
- Mat4MulVecfl(pchan->chan_mat, cop);
-
- vec[0]+=(cop[0]-co[0])*weight;
- vec[1]+=(cop[1]-co[1])*weight;
- vec[2]+=(cop[2]-co[2])*weight;
+ VECCOPY(cop, co);
+
+ if(vec) {
+ if(pchan->bone->segments>1)
+ // applies on cop and bbonemat
+ b_bone_deform(pchan, pchan->bone, cop, NULL, (mat)?bbonemat:NULL);
+ else
+ Mat4MulVecfl(pchan->chan_mat, cop);
+
+ vec[0]+=(cop[0]-co[0])*weight;
+ vec[1]+=(cop[1]-co[1])*weight;
+ vec[2]+=(cop[2]-co[2])*weight;
+
+ if(mat)
+ pchan_deform_mat_add(pchan, weight, bbonemat, mat);
+ }
+ else {
+ if(pchan->bone->segments>1) {
+ b_bone_deform(pchan, pchan->bone, cop, &bbonedq, NULL);
+ DQuatAddWeighted(dq, &bbonedq, weight);
+ }
+ else
+ DQuatAddWeighted(dq, pchan->dual_quat, weight);
+ }
(*contrib)+=weight;
}
void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
- float (*vertexCos)[3], int numVerts, int deformflag,
- const char *defgrp_name)
+ float (*vertexCos)[3], float (*defMats)[3][3],
+ int numVerts, int deformflag,
+ float (*prevCos)[3], const char *defgrp_name)
{
bPoseChannel *pchan, **defnrToPC = NULL;
MDeformVert *dverts = NULL;
bDeformGroup *dg;
+ DualQuat *dualquats= NULL;
float obinv[4][4], premat[4][4], postmat[4][4];
int use_envelope = deformflag & ARM_DEF_ENVELOPE;
+ int use_quaternion = deformflag & ARM_DEF_QUATERNION;
+ int bbone_rest_def = deformflag & ARM_DEF_B_BONE_REST;
+ int invert_vgroup= deformflag & ARM_DEF_INVERT_VGROUP;
int numGroups = 0; /* safety for vertexgroup index overflow */
int i, target_totvert = 0; /* safety for vertexgroup overflow */
int use_dverts = 0;
int armature_def_nr = -1;
+ int totchan;
if(armOb == G.obedit) return;
@@ -669,11 +817,23 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
/* bone defmats are already in the channels, chan_mat */
- /* initialize B_bone matrices */
+ /* initialize B_bone matrices and dual quaternions */
+ if(use_quaternion) {
+ totchan= BLI_countlist(&armOb->pose->chanbase);
+ dualquats= MEM_callocN(sizeof(DualQuat)*totchan, "dualquats");
+ }
+
+ totchan= 0;
for(pchan = armOb->pose->chanbase.first; pchan; pchan = pchan->next) {
- if(!(pchan->bone->flag & BONE_NO_DEFORM))
+ if(!(pchan->bone->flag & BONE_NO_DEFORM)) {
if(pchan->bone->segments > 1)
- pchan_b_bone_defmats(pchan);
+ pchan_b_bone_defmats(pchan, use_quaternion, bbone_rest_def);
+
+ if(use_quaternion) {
+ pchan->dual_quat= &dualquats[totchan++];
+ Mat4ToDQuat(pchan->bone->arm_mat, pchan->chan_mat, pchan->dual_quat);
+ }
+ }
}
/* get the def_nr for the overall armature vertex group if present */
@@ -722,13 +882,28 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
for(i = 0; i < numVerts; i++) {
MDeformVert *dvert;
- float *co = vertexCos[i];
- float vec[3];
+ DualQuat sumdq, *dq = NULL;
+ float *co, dco[3];
+ float sumvec[3], summat[3][3];
+ float *vec = NULL, (*smat)[3] = NULL;
float contrib = 0.0f;
- float armature_weight = 1.0f; /* default to 1 if no overall def group */
+ float armature_weight = 1.0f; /* default to 1 if no overall def group */
+ float prevco_weight = 1.0f; /* weight for optional cached vertexcos */
int j;
- vec[0] = vec[1] = vec[2] = 0.0f;
+ if(use_quaternion) {
+ memset(&sumdq, 0, sizeof(DualQuat));
+ dq= &sumdq;
+ }
+ else {
+ sumvec[0] = sumvec[1] = sumvec[2] = 0.0f;
+ vec= sumvec;
+
+ if(defMats) {
+ Mat3Clr((float*)summat);
+ smat = summat;
+ }
+ }
if(use_dverts || armature_def_nr >= 0) {
if(dm) dvert = dm->getVertData(dm, i, CD_MDEFORMVERT);
@@ -745,11 +920,22 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
break;
}
}
+ /* hackish: the blending factor can be used for blending with prevCos too */
+ if(prevCos) {
+ if(invert_vgroup)
+ prevco_weight= 1.0f-armature_weight;
+ else
+ prevco_weight= armature_weight;
+ armature_weight= 1.0f;
+ }
}
/* check if there's any point in calculating for this vert */
if(armature_weight == 0.0f) continue;
+ /* get the coord we work on */
+ co= prevCos?prevCos[i]:vertexCos[i];
+
/* Apply the object's matrix */
Mat4MulVecfl(premat, co);
@@ -772,7 +958,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
bone->rad_tail,
bone->dist);
}
- pchan_bone_deform(pchan, weight, vec, co, &contrib);
+ pchan_bone_deform(pchan, weight, vec, dq, smat, co, &contrib);
}
}
/* if there are vertexgroups but not groups with bones
@@ -782,7 +968,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
for(pchan = armOb->pose->chanbase.first; pchan;
pchan = pchan->next) {
if(!(pchan->bone->flag & BONE_NO_DEFORM))
- contrib += dist_bone_deform(pchan, vec, co);
+ contrib += dist_bone_deform(pchan, vec, dq, smat, co);
}
}
}
@@ -790,19 +976,61 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
for(pchan = armOb->pose->chanbase.first; pchan;
pchan = pchan->next) {
if(!(pchan->bone->flag & BONE_NO_DEFORM))
- contrib += dist_bone_deform(pchan, vec, co);
+ contrib += dist_bone_deform(pchan, vec, dq, smat, co);
}
}
/* actually should be EPSILON? weight values and contrib can be like 10e-39 small */
if(contrib > 0.0001f) {
- VecMulf(vec, armature_weight / contrib);
- VecAddf(co, vec, co);
+ if(use_quaternion) {
+ DQuatNormalize(dq, contrib);
+
+ if(armature_weight != 1.0f) {
+ VECCOPY(dco, co);
+ DQuatMulVecfl(dq, dco, (defMats)? summat: NULL);
+ VecSubf(dco, dco, co);
+ VecMulf(dco, armature_weight);
+ VecAddf(co, co, dco);
+ }
+ else
+ DQuatMulVecfl(dq, co, (defMats)? summat: NULL);
+
+ smat = summat;
+ }
+ else {
+ VecMulf(vec, armature_weight/contrib);
+ VecAddf(co, vec, co);
+ }
+
+ if(defMats) {
+ float pre[3][3], post[3][3], tmpmat[3][3];
+
+ Mat3CpyMat4(pre, premat);
+ Mat3CpyMat4(post, postmat);
+ Mat3CpyMat3(tmpmat, defMats[i]);
+
+ if(!use_quaternion) /* quaternion already is scale corrected */
+ Mat3MulFloat((float*)smat, armature_weight/contrib);
+
+ Mat3MulSerie(defMats[i], tmpmat, pre, smat, post,
+ NULL, NULL, NULL, NULL);
+ }
}
+
/* always, check above code */
Mat4MulVecfl(postmat, co);
+
+
+ /* interpolate with previous modifier position using weight group */
+ if(prevCos) {
+ float mw= 1.0f - prevco_weight;
+ vertexCos[i][0]= prevco_weight*vertexCos[i][0] + mw*co[0];
+ vertexCos[i][1]= prevco_weight*vertexCos[i][1] + mw*co[1];
+ vertexCos[i][2]= prevco_weight*vertexCos[i][2] + mw*co[2];
+ }
}
+ if(dualquats) MEM_freeN(dualquats);
if(defnrToPC) MEM_freeN(defnrToPC);
/* free B_bone matrices */
@@ -811,6 +1039,12 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm,
MEM_freeN(pchan->b_bone_mats);
pchan->b_bone_mats = NULL;
}
+ if(pchan->b_bone_dual_quats) {
+ MEM_freeN(pchan->b_bone_dual_quats);
+ pchan->b_bone_dual_quats = NULL;
+ }
+
+ pchan->dual_quat = NULL;
}
}
@@ -1070,7 +1304,6 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
bPose *pose= ob->pose, *frompose= from->pose;
bPoseChannel *pchan, *pchanp, pchanw;
bConstraint *con;
- char *str;
if(frompose==NULL) return;
@@ -1096,14 +1329,27 @@ static void pose_proxy_synchronize(Object *ob, Object *from, int layer_protected
/* constraints, set target ob pointer to own object */
copy_constraints(&pchanw.constraints, &pchanp->constraints);
-
- for(con= pchanw.constraints.first; con; con= con->next) {
- if(from==get_constraint_target(con, &str))
- set_constraint_target(con, ob, NULL);
+
+ for (con= pchanw.constraints.first; con; con= con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar == from)
+ ct->tar = ob;
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
+ }
}
/* free stuff from current channel */
- if(pchan->path) MEM_freeN(pchan->path);
+ if (pchan->path) MEM_freeN(pchan->path);
free_constraints(&pchan->constraints);
/* the final copy */
@@ -1321,7 +1567,7 @@ static void execute_posetree(Object *ob, PoseTree *tree)
float goalrot[3][3], goalpos[3];
float rootmat[4][4], imat[4][4];
float goal[4][4], goalinv[4][4];
- float size[3], irest_basis[3][3], full_basis[3][3];
+ float irest_basis[3][3], full_basis[3][3];
float end_pose[4][4], world_pose[4][4];
float length, basis[3][3], rest_basis[3][3], start[3], *ikstretch=NULL;
int a, flag, hasstretch=0;
@@ -1329,7 +1575,7 @@ static void execute_posetree(Object *ob, PoseTree *tree)
IK_Segment *seg, *parent, **iktree, *iktarget;
IK_Solver *solver;
PoseTarget *target;
- bKinematicConstraint *data;
+ bKinematicConstraint *data, *poleangledata=NULL;
Bone *bone;
if (tree->totchannel == 0)
@@ -1417,7 +1663,7 @@ static void execute_posetree(Object *ob, PoseTree *tree)
if(tree->stretch && (pchan->ikstretch > 0.0)) {
float ikstretch = pchan->ikstretch*pchan->ikstretch;
- IK_SetStiffness(seg, IK_TRANS_Y, MIN2(1.0-ikstretch, 0.99));
+ IK_SetStiffness(seg, IK_TRANS_Y, MIN2(1.0-ikstretch, 0.999));
IK_SetLimit(seg, IK_TRANS_Y, 0.001, 1e10);
}
}
@@ -1440,53 +1686,88 @@ static void execute_posetree(Object *ob, PoseTree *tree)
Mat4MulMat4 (imat, rootmat, ob->obmat);
Mat4Invert (goalinv, imat);
- for(target=tree->targets.first; target; target=target->next) {
- data= (bKinematicConstraint*)target->con->data;
-
- /* 1.0=ctime, we pass on object for auto-ik */
- get_constraint_target_matrix(target->con, TARGET_BONE, ob, rootmat, size, 1.0);
+ for (target=tree->targets.first; target; target=target->next) {
+ float polepos[3];
+ int poleconstrain= 0;
+ data= (bKinematicConstraint*)target->con->data;
+
+ /* 1.0=ctime, we pass on object for auto-ik (owner-type here is object, even though
+ * strictly speaking, it is a posechannel)
+ */
+ get_constraint_target_matrix(target->con, 0, CONSTRAINT_OBTYPE_OBJECT, ob, rootmat, 1.0);
+
/* and set and transform goal */
Mat4MulMat4(goal, rootmat, goalinv);
-
+
VECCOPY(goalpos, goal[3]);
Mat3CpyMat4(goalrot, goal);
+
+ /* same for pole vector target */
+ if(data->poletar) {
+ get_constraint_target_matrix(target->con, 1, CONSTRAINT_OBTYPE_OBJECT, ob, rootmat, 1.0);
+
+ if(data->flag & CONSTRAINT_IK_SETANGLE) {
+ /* don't solve IK when we are setting the pole angle */
+ break;
+ }
+ else {
+ Mat4MulMat4(goal, rootmat, goalinv);
+ VECCOPY(polepos, goal[3]);
+ poleconstrain= 1;
+
+ if(data->flag & CONSTRAINT_IK_GETANGLE) {
+ poleangledata= data;
+ data->flag &= ~CONSTRAINT_IK_GETANGLE;
+ }
+ }
+ }
/* do we need blending? */
- if(target->con->enforce!=1.0) {
+ if (target->con->enforce!=1.0) {
float q1[4], q2[4], q[4];
float fac= target->con->enforce;
float mfac= 1.0-fac;
pchan= tree->pchan[target->tip];
-
+
/* end effector in world space */
Mat4CpyMat4(end_pose, pchan->pose_mat);
VECCOPY(end_pose[3], pchan->pose_tail);
Mat4MulSerie(world_pose, goalinv, ob->obmat, end_pose, 0, 0, 0, 0, 0);
-
+
/* blend position */
goalpos[0]= fac*goalpos[0] + mfac*world_pose[3][0];
goalpos[1]= fac*goalpos[1] + mfac*world_pose[3][1];
goalpos[2]= fac*goalpos[2] + mfac*world_pose[3][2];
-
+
/* blend rotation */
Mat3ToQuat(goalrot, q1);
Mat4ToQuat(world_pose, q2);
QuatInterpol(q, q1, q2, mfac);
QuatToMat3(q, goalrot);
}
-
+
iktarget= iktree[target->tip];
-
- if(data->weight != 0.0)
+
+ if(data->weight != 0.0) {
+ if(poleconstrain)
+ IK_SolverSetPoleVectorConstraint(solver, iktarget, goalpos,
+ polepos, data->poleangle*M_PI/180, (poleangledata == data));
IK_SolverAddGoal(solver, iktarget, goalpos, data->weight);
- if((data->flag & CONSTRAINT_IK_ROT) && (data->orientweight != 0.0) && (data->flag & CONSTRAINT_IK_AUTO)==0)
- IK_SolverAddGoalOrientation(solver, iktarget, goalrot, data->orientweight);
+ }
+ if((data->flag & CONSTRAINT_IK_ROT) && (data->orientweight != 0.0))
+ if((data->flag & CONSTRAINT_IK_AUTO)==0)
+ IK_SolverAddGoalOrientation(solver, iktarget, goalrot,
+ data->orientweight);
}
/* solve */
IK_Solve(solver, 0.0f, tree->iterations);
+
+ if(poleangledata)
+ poleangledata->poleangle= IK_SolverGetPoleAngle(solver)*180/M_PI;
+
IK_FreeSolver(solver);
/* gather basis changes */
@@ -1603,220 +1884,46 @@ static void where_is_ik_bone(bPoseChannel *pchan, float ik_mat[][3]) // nr = t
pchan->flag |= POSE_DONE;
}
-static void do_local_constraint(bPoseChannel *pchan, bConstraint *con)
+/* NLA strip modifiers */
+static void do_strip_modifiers(Object *armob, Bone *bone, bPoseChannel *pchan)
{
- switch(con->type) {
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data= con->data;
- float fac= con->enforce;
+ bActionModifier *amod;
+ bActionStrip *strip, *strip2;
+ float scene_cfra= G.scene->r.cfra;
+ int do_modif;
+
+ for (strip=armob->nlastrips.first; strip; strip=strip->next) {
+ do_modif=0;
+
+ if (scene_cfra>=strip->start && scene_cfra<=strip->end)
+ do_modif=1;
+
+ if ((scene_cfra > strip->end) && (strip->flag & ACTSTRIP_HOLDLASTFRAME)) {
+ do_modif=1;
- if(data->tar && data->subtarget[0]) {
- bPoseChannel *pchant= get_pose_channel(data->tar->pose, data->subtarget);
- if(pchant) {
- float loc[3];
-
- /* copy location of tip of bone? */
- if (data->flag & LOCLIKE_TIP) {
- float mat[4][4], tmat[4][4];
-
- Mat4One(tmat);
- VECCOPY(tmat[3], pchant->pose_tail);
-
- armature_mat_pose_to_delta(mat, tmat, pchant->bone->arm_mat);
- VECCOPY(loc, mat[3]);
- }
- else
- VECCOPY(loc, pchant->loc);
-
- /* do offsets? */
- if (data->flag & LOCLIKE_OFFSET)
- VecAddf(loc, loc, pchan->loc);
-
- if (data->flag & LOCLIKE_X)
- pchan->loc[0]= FloatLerpf(loc[0], pchan->loc[0], fac);
- if (data->flag & LOCLIKE_Y)
- pchan->loc[1]= FloatLerpf(loc[1], pchan->loc[1], fac);
- if (data->flag & LOCLIKE_Z)
- pchan->loc[2]= FloatLerpf(loc[2], pchan->loc[2], fac);
- if (data->flag & LOCLIKE_X_INVERT)
- pchan->loc[0]= FloatLerpf(pchant->loc[0], pchan->loc[0], -fac);
- if (data->flag & LOCLIKE_Y_INVERT)
- pchan->loc[1]= FloatLerpf(pchant->loc[1], pchan->loc[1], -fac);
- if (data->flag & LOCLIKE_Z_INVERT)
- pchan->loc[2]= FloatLerpf(pchant->loc[2], pchan->loc[2], -fac);
- }
- }
- }
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data= con->data;
- if(data->tar && data->subtarget[0]) {
- bPoseChannel *pchant= get_pose_channel(data->tar->pose, data->subtarget);
- if(pchant) {
- if(data->flag != (ROTLIKE_X|ROTLIKE_Y|ROTLIKE_Z)) {
- float eul[3], eult[3], euln[3];
- float fac= con->enforce;
-
- QuatToEul(pchan->quat, eul);
- QuatToEul(pchant->quat, eult);
- VECCOPY(euln, eul);
-
- if(data->flag & ROTLIKE_X) euln[0]= FloatLerpf(eult[0], eul[0], fac);
- if(data->flag & ROTLIKE_Y) euln[1]= FloatLerpf(eult[1], eul[1], fac);
- if(data->flag & ROTLIKE_Z) euln[2]= FloatLerpf(eult[2], eul[2], fac);
- if(data->flag & ROTLIKE_X_INVERT) euln[0]= FloatLerpf(eult[0], eul[0], -fac);
- if(data->flag & ROTLIKE_Y_INVERT) euln[1]= FloatLerpf(eult[1], eul[1], -fac);
- if(data->flag & ROTLIKE_Z_INVERT) euln[2]= FloatLerpf(eult[2], eul[2], -fac);
-
- compatible_eul(eul, euln);
- EulToQuat(euln, pchan->quat);
- }
- else {
- QuatInterpol(pchan->quat, pchan->quat, pchant->quat, con->enforce);
- }
+ /* if there are any other strips active, ignore modifiers for this strip -
+ * 'hold' option should only hold action modifiers if there are
+ * no other active strips */
+ for (strip2=strip->next; strip2; strip2=strip2->next) {
+ if (strip2 == strip) continue;
+
+ if (scene_cfra>=strip2->start && scene_cfra<=strip2->end) {
+ if (!(strip2->flag & ACTSTRIP_MUTE))
+ do_modif=0;
}
}
- }
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data= con->data;
- float fac= con->enforce;
- if(data->tar && data->subtarget[0]) {
- bPoseChannel *pchant= get_pose_channel(data->tar->pose, data->subtarget);
- if(pchant) {
- if (data->flag & SIZELIKE_X)
- pchan->size[0]= FloatLerpf(pchant->size[0], pchan->size[0], fac);
- if (data->flag & SIZELIKE_Y)
- pchan->size[1]= FloatLerpf(pchant->size[1], pchan->size[1], fac);
- if (data->flag & SIZELIKE_Z)
- pchan->size[2]= FloatLerpf(pchant->size[2], pchan->size[2], fac);
+ /* if there are any later, activated, strips with 'hold' set, they take precedence,
+ * so ignore modifiers for this strip */
+ for (strip2=strip->next; strip2; strip2=strip2->next) {
+ if (scene_cfra < strip2->start) continue;
+ if ((strip2->flag & ACTSTRIP_HOLDLASTFRAME) && !(strip2->flag & ACTSTRIP_MUTE)) {
+ do_modif=0;
}
}
}
- break;
- case CONSTRAINT_TYPE_LOCLIMIT:
- {
- bLocLimitConstraint *data= con->data;
- float fac= con->enforce;
-
- if (data->flag & LIMIT_XMIN) {
- if(pchan->loc[0] < data->xmin)
- pchan->loc[0] = FloatLerpf(data->xmin, pchan->loc[0], fac);
- }
- if (data->flag & LIMIT_XMAX) {
- if (pchan->loc[0] > data->xmax)
- pchan->loc[0] = FloatLerpf(data->xmax, pchan->loc[0], fac);
- }
- if (data->flag & LIMIT_YMIN) {
- if(pchan->loc[1] < data->ymin)
- pchan->loc[1] = FloatLerpf(data->ymin, pchan->loc[1], fac);
- }
- if (data->flag & LIMIT_YMAX) {
- if (pchan->loc[1] > data->ymax)
- pchan->loc[1] = FloatLerpf(data->ymax, pchan->loc[1], fac);
- }
- if (data->flag & LIMIT_ZMIN) {
- if(pchan->loc[2] < data->zmin)
- pchan->loc[2] = FloatLerpf(data->zmin, pchan->loc[2], fac);
- }
- if (data->flag & LIMIT_ZMAX) {
- if (pchan->loc[2] > data->zmax)
- pchan->loc[2] = FloatLerpf(data->zmax, pchan->loc[2], fac);
- }
- }
- break;
- case CONSTRAINT_TYPE_ROTLIMIT:
- {
- bRotLimitConstraint *data = con->data;
- float eul[3];
- float fac= con->enforce;
-
- QuatToEul(pchan->quat, eul);
-
- /* eulers: radians to degrees! */
- eul[0] = (eul[0] / (2*M_PI) * 360);
- eul[1] = (eul[1] / (2*M_PI) * 360);
- eul[2] = (eul[2] / (2*M_PI) * 360);
-
- /* limiting of euler values... */
- if (data->flag & LIMIT_XROT) {
- if (eul[0] < data->xmin)
- eul[0] = FloatLerpf(data->xmin, eul[0], fac);
-
- if (eul[0] > data->xmax)
- eul[0] = FloatLerpf(data->xmax, eul[0], fac);
- }
- if (data->flag & LIMIT_YROT) {
- if (eul[1] < data->ymin)
- eul[1] = FloatLerpf(data->ymin, eul[1], fac);
-
- if (eul[1] > data->ymax)
- eul[1] = FloatLerpf(data->ymax, eul[1], fac);
- }
- if (data->flag & LIMIT_ZROT) {
- if (eul[2] < data->zmin)
- eul[2] = FloatLerpf(data->zmin, eul[2], fac);
-
- if (eul[2] > data->zmax)
- eul[2] = FloatLerpf(data->zmax, eul[2], fac);
- }
-
- /* eulers: degrees to radians ! */
- eul[0] = (eul[0] / 360 * (2*M_PI));
- eul[1] = (eul[1] / 360 * (2*M_PI));
- eul[2] = (eul[2] / 360 * (2*M_PI));
-
- /* convert back */
- EulToQuat(eul, pchan->quat);
- }
- break;
- case CONSTRAINT_TYPE_SIZELIMIT:
- {
- bSizeLimitConstraint *data= con->data;
- float fac= con->enforce;
-
- if (data->flag & LIMIT_XMIN) {
- if(pchan->size[0] < data->xmin)
- pchan->size[0] = FloatLerpf(data->xmin, pchan->size[0], fac);
- }
- if (data->flag & LIMIT_XMAX) {
- if (pchan->size[0] > data->xmax)
- pchan->size[0] = FloatLerpf(data->xmax, pchan->size[0], fac);
- }
- if (data->flag & LIMIT_YMIN) {
- if(pchan->size[1] < data->ymin)
- pchan->size[1] = FloatLerpf(data->ymin, pchan->size[1], fac);
- }
- if (data->flag & LIMIT_YMAX) {
- if (pchan->size[1] > data->ymax)
- pchan->size[1] = FloatLerpf(data->ymax, pchan->size[1], fac);
- }
- if (data->flag & LIMIT_ZMIN) {
- if(pchan->size[2] < data->zmin)
- pchan->size[2] = FloatLerpf(data->zmin, pchan->size[2], fac);
- }
- if (data->flag & LIMIT_ZMAX) {
- if (pchan->size[2] > data->zmax)
- pchan->size[2] = FloatLerpf(data->zmax, pchan->size[2], fac);
- }
- }
- break;
- }
-}
-
-static void do_strip_modifiers(Object *armob, Bone *bone, bPoseChannel *pchan)
-{
- bActionModifier *amod;
- bActionStrip *strip;
- float scene_cfra= G.scene->r.cfra;
-
- for (strip=armob->nlastrips.first; strip; strip=strip->next) {
- if(scene_cfra>=strip->start && scene_cfra<=strip->end) {
-
+
+ if (do_modif) {
/* temporal solution to prevent 2 strips accumulating */
if(scene_cfra==strip->end && strip->next && strip->next->start==scene_cfra)
continue;
@@ -1906,32 +2013,16 @@ static void where_is_pose_bone(Object *ob, bPoseChannel *pchan, float ctime)
{
Bone *bone, *parbone;
bPoseChannel *parchan;
- float vec[3], quat[4];
- int did_local= 0; /* copying quaternion should be limited, chan_calc_mat() normalizes quat */
+ float vec[3];
/* set up variables for quicker access below */
bone= pchan->bone;
parbone= bone->parent;
parchan= pchan->parent;
-
- /* Do local constraints, these only work on the channel data (loc rot size) */
- QUATCOPY(quat, pchan->quat);
- if(pchan->constraints.first) {
- bConstraint *con;
- for(con=pchan->constraints.first; con; con= con->next) {
- if(con->flag & CONSTRAINT_LOCAL) {
- do_local_constraint(pchan, con);
- did_local= 1;
- }
- }
- }
/* this gives a chan_mat with actions (ipos) results */
chan_calc_mat(pchan);
- if(did_local)
- QUATCOPY(pchan->quat, quat); /* local constraint hack. bad! */
-
/* construct the posemat based on PoseChannels, that we do before applying constraints */
/* pose_mat(b)= pose_mat(b-1) * yoffs(b-1) * d_root(b) * bone_mat(b) * chan_mat(b) */
@@ -1961,6 +2052,21 @@ static void where_is_pose_bone(Object *ob, bPoseChannel *pchan, float ctime)
Mat4MulSerie(pchan->pose_mat, tmat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
}
+ else if(bone->flag & BONE_NO_SCALE) {
+ float orthmat[4][4], vec[3];
+
+ /* get the official transform, but we only use the vector from it (optimize...) */
+ Mat4MulSerie(pchan->pose_mat, parchan->pose_mat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
+ VECCOPY(vec, pchan->pose_mat[3]);
+
+ /* do this again, but with an ortho-parent matrix */
+ Mat4CpyMat4(orthmat, parchan->pose_mat);
+ Mat4Ortho(orthmat);
+ Mat4MulSerie(pchan->pose_mat, orthmat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
+
+ /* copy correct transform */
+ VECCOPY(pchan->pose_mat[3], vec);
+ }
else
Mat4MulSerie(pchan->pose_mat, parchan->pose_mat, offs_bone, pchan->chan_mat, NULL, NULL, NULL, NULL, NULL);
}
@@ -1970,44 +2076,33 @@ static void where_is_pose_bone(Object *ob, bPoseChannel *pchan, float ctime)
VecAddf(pchan->pose_mat[3], pchan->pose_mat[3], ob->pose->cyclic_offset);
}
+ /* do NLA strip modifiers - i.e. curve follow */
do_strip_modifiers(ob, bone, pchan);
/* Do constraints */
- if(pchan->constraints.first) {
- static Object conOb;
- static int initialized= 0;
+ if (pchan->constraints.first) {
+ bConstraintOb *cob;
+ /* make a copy of location of PoseChannel for later */
VECCOPY(vec, pchan->pose_mat[3]);
- /* Build a workob to pass the bone to the constraint solver */
- if(initialized==0) {
- memset(&conOb, 0, sizeof(Object));
- initialized= 1;
- }
- conOb.size[0]= conOb.size[1]= conOb.size[2]= 1.0;
- conOb.data = ob->data;
- conOb.type = ob->type;
- conOb.parent = ob; // ik solver retrieves the armature that way !?!?!?!
- conOb.pose= ob->pose; // needed for retrieving pchan
- conOb.trackflag = ob->trackflag;
- conOb.upflag = ob->upflag;
-
- /* Collect the constraints from the pose (listbase copy) */
- conOb.constraints = pchan->constraints;
-
- /* conOb.obmat takes bone to worldspace */
- Mat4MulMat4 (conOb.obmat, pchan->pose_mat, ob->obmat);
+ /* prepare PoseChannel for Constraint solving
+ * - makes a copy of matrix, and creates temporary struct to use
+ */
+ cob= constraints_make_evalob(ob, pchan, CONSTRAINT_OBTYPE_BONE);
- /* Solve */
- solve_constraints (&conOb, TARGET_BONE, (void*)pchan, ctime); // ctime doesnt alter objects
+ /* Solve PoseChannel's Constraints */
+ solve_constraints(&pchan->constraints, cob, ctime); // ctime doesnt alter objects
- /* Take out of worldspace */
- Mat4MulMat4 (pchan->pose_mat, conOb.obmat, ob->imat);
+ /* cleanup after Constraint Solving
+ * - applies matrix back to pchan, and frees temporary struct used
+ */
+ constraints_clear_evalob(cob);
/* prevent constraints breaking a chain */
- if(pchan->bone->flag & BONE_CONNECTED)
+ if(pchan->bone->flag & BONE_CONNECTED) {
VECCOPY(pchan->pose_mat[3], vec);
-
+ }
}
/* calculate head */
@@ -2016,7 +2111,6 @@ static void where_is_pose_bone(Object *ob, bPoseChannel *pchan, float ctime)
VECCOPY(vec, pchan->pose_mat[1]);
VecMulf(vec, bone->length);
VecAddf(pchan->pose_tail, pchan->pose_head, vec);
-
}
/* This only reads anim data from channels, and writes to channels */
@@ -2027,7 +2121,7 @@ void where_is_pose (Object *ob)
Bone *bone;
bPoseChannel *pchan;
float imat[4][4];
- float ctime= bsystem_time(ob, NULL, (float)G.scene->r.cfra, 0.0); /* not accurate... */
+ float ctime= bsystem_time(ob, (float)G.scene->r.cfra, 0.0); /* not accurate... */
arm = get_armature(ob);
diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index cad8d3b0861..9845f571126 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -266,7 +266,7 @@ static void clear_global(void)
free_vertexpaint();
- G.f &= ~(G_WEIGHTPAINT + G_VERTEXPAINT + G_FACESELECT);
+ G.f &= ~(G_WEIGHTPAINT + G_VERTEXPAINT + G_FACESELECT + G_PARTICLEEDIT);
}
/* make sure path names are correct for OS */
@@ -409,8 +409,9 @@ static void setup_app_data(BlendFileData *bfd, char *filename)
/* there's an onload scriptlink to execute in screenmain */
mainqenter(ONLOAD_SCRIPT, 1);
}
-
- strcpy(G.sce, filename);
+ if (G.sce != filename) /* these are the same at times, should never copy to the same location */
+ strcpy(G.sce, filename);
+
strcpy(G.main->name, filename); /* is guaranteed current file */
MEM_freeN(bfd);
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 2d5f5f091c3..6a856307916 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -751,6 +751,7 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *ob)
/* this does a referenced copy, the only new layers being ORIGINDEX */
DM_init(dm, mesh->totvert, mesh->totedge, mesh->totface);
+ dm->deformedOnly = 1;
CustomData_merge(&mesh->vdata, &dm->vertData, CD_MASK_MESH, CD_REFERENCE,
mesh->totvert);
@@ -798,6 +799,8 @@ DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *me)
MFace *mface = cddm->mface;
int i, *index;
+ dm->deformedOnly = 1;
+
CustomData_merge(&em->vdata, &dm->vertData, CD_MASK_DERIVEDMESH,
CD_CALLOC, dm->numVertData);
/* CustomData_merge(&em->edata, &dm->edgeData, CD_MASK_DERIVEDMESH,
@@ -889,6 +892,7 @@ DerivedMesh *CDDM_copy(DerivedMesh *source)
/* this initializes dm, and copies all non mvert/medge/mface layers */
DM_from_template(dm, source, numVerts, numEdges, numFaces);
+ dm->deformedOnly = source->deformedOnly;
CustomData_copy_data(&source->vertData, &dm->vertData, 0, 0, numVerts);
CustomData_copy_data(&source->edgeData, &dm->edgeData, 0, 0, numEdges);
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index fda31d9e7c0..83b014cdd63 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -62,12 +62,18 @@ CurveMapping *curvemapping_add(int tot, float minx, float miny, float maxx, floa
{
CurveMapping *cumap;
int a;
+ float clipminx, clipminy, clipmaxx, clipmaxy;
cumap= MEM_callocN(sizeof(CurveMapping), "new curvemap");
cumap->flag= CUMA_DO_CLIP;
if(tot==4) cumap->cur= 3; /* rhms, hack for 'col' curve? */
- BLI_init_rctf(&cumap->curr, minx, maxx, miny, maxy);
+ clipminx = MIN2(minx, maxx);
+ clipminy = MIN2(miny, maxy);
+ clipmaxx = MAX2(minx, maxx);
+ clipmaxy = MAX2(miny, maxy);
+
+ BLI_init_rctf(&cumap->curr, clipminx, clipmaxx, clipminy, clipmaxy);
cumap->clipr= cumap->curr;
cumap->white[0]= cumap->white[1]= cumap->white[2]= 1.0f;
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 97f5ed18cbe..2dc488f8377 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -25,7 +25,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): 2007, Joshua Leung, major recode
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
@@ -45,19 +45,29 @@
#include "DNA_object_types.h"
#include "DNA_action_types.h"
#include "DNA_curve_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_lattice_types.h"
#include "DNA_scene_types.h"
+#include "DNA_text_types.h"
#include "BKE_utildefines.h"
#include "BKE_action.h"
-#include "BKE_anim.h" // for the curve calculation part
+#include "BKE_anim.h" /* for the curve calculation part */
#include "BKE_armature.h"
#include "BKE_blender.h"
#include "BKE_constraint.h"
#include "BKE_displist.h"
+#include "BKE_deform.h"
+#include "BKE_DerivedMesh.h" /* for geometry targets */
+#include "BKE_cdderivedmesh.h" /* for geometry targets */
#include "BKE_object.h"
#include "BKE_ipo.h"
#include "BKE_global.h"
#include "BKE_library.h"
+#include "BKE_idprop.h"
+
+
+#include "BPY_extern.h"
#include "blendef.h"
@@ -69,35 +79,19 @@
#define M_PI 3.14159265358979323846
#endif
-/* used by object.c */
-void Mat4BlendMat4(float [][4], float [][4], float [][4], float );
-
-/* Local function prototypes */
-/* ********************* Data level ****************** */
-
-void free_constraint_data (bConstraint *con)
-{
- if (con->data) {
- /* any constraint-type specific stuff here */
-
- MEM_freeN(con->data);
- }
-}
-
-void free_constraints (ListBase *conlist)
-{
- bConstraint *con;
-
- /* Do any specific freeing */
- for (con=conlist->first; con; con=con->next) {
- free_constraint_data(con);
- }
-
- /* Free the whole list */
- BLI_freelistN(conlist);
-}
+/* ******************* Constraint Channels ********************** */
+/* Constraint Channels exist in one of two places:
+ * - Under Action Channels in an Action (act->chanbase->achan->constraintChannels)
+ * - Under Object without object-level action yet (ob->constraintChannels)
+ *
+ * The main purpose that constraint channels serve is to act as a link
+ * between an IPO-block which
+ */
+/* ------------ Data Management ----------- */
+
+/* Free constraint channels, and reduce the number of users of the related ipo-blocks */
void free_constraint_channels (ListBase *chanbase)
{
bConstraintChannel *chan;
@@ -111,117 +105,14 @@ void free_constraint_channels (ListBase *chanbase)
BLI_freelistN(chanbase);
}
-void relink_constraints (struct ListBase *list)
-{
- bConstraint *con;
-
- for (con = list->first; con; con=con->next) {
- switch (con->type) {
- case CONSTRAINT_TYPE_KINEMATIC:
- {
- bKinematicConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- {
- bLockTrackConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- {
- bRigidBodyJointConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data;
- data = con->data;
-
- ID_NEW(data->tar);
- }
- break;
- }
- }
-}
-
+/* Make a copy of the constraint channels from dst to src, and also give the
+ * new constraint channels their own copy of the original's IPO.
+ */
void copy_constraint_channels (ListBase *dst, ListBase *src)
{
bConstraintChannel *dchan, *schan;
- dst->first=dst->last=NULL;
+ dst->first = dst->last = NULL;
duplicatelist(dst, src);
for (dchan=dst->first, schan=src->first; dchan; dchan=dchan->next, schan=schan->next) {
@@ -229,11 +120,14 @@ void copy_constraint_channels (ListBase *dst, ListBase *src)
}
}
+/* Make a copy of the constraint channels from dst to src, but make the
+ * new constraint channels use the same IPO-data as their twin.
+ */
void clone_constraint_channels (ListBase *dst, ListBase *src)
{
bConstraintChannel *dchan, *schan;
- dst->first=dst->last=NULL;
+ dst->first = dst->last = NULL;
duplicatelist(dst, src);
for (dchan=dst->first, schan=src->first; dchan; dchan=dchan->next, schan=schan->next) {
@@ -241,664 +135,919 @@ void clone_constraint_channels (ListBase *dst, ListBase *src)
}
}
-void copy_constraints (ListBase *dst, ListBase *src)
-{
- bConstraint *con;
-
- dst->first= dst->last= NULL;
-
- duplicatelist (dst, src);
-
- for (con = dst->first; con; con=con->next) {
- con->data = MEM_dupallocN (con->data);
- }
-}
+/* ------------- Constraint Channel Tools ------------ */
-
-/* **************** Editor Functions **************** */
-
-char constraint_has_target (bConstraint *con)
+/* Find the constraint channel with a given name */
+bConstraintChannel *get_constraint_channel (ListBase *list, const char name[])
{
- switch (con->type) {
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_KINEMATIC:
- {
- bKinematicConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- {
- bLockTrackConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- {
- bRigidBodyJointConstraint *data = con->data;
- if (data->tar)
- return 1;
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data = con->data;
- if (data->tar)
- return 1;
+ bConstraintChannel *chan;
+
+ for (chan = list->first; chan; chan=chan->next) {
+ if (!strcmp(name, chan->name)) {
+ return chan;
}
- break;
}
- // Unknown types or CONSTRAINT_TYPE_NULL or no target
- return 0;
+
+ return NULL;
}
-Object *get_constraint_target(bConstraint *con, char **subtarget)
+/* Find or create a new constraint channel */
+bConstraintChannel *verify_constraint_channel (ListBase *list, const char name[])
{
- /* If the target for this constraint is target, return a pointer
- * to the name for this constraints subtarget ... NULL otherwise
- */
- switch (con->type) {
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_KINEMATIC:
- {
- bKinematicConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- {
- bLockTrackConstraint *data = con->data;
- *subtarget= data->subtarget;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data = con->data;
- *subtarget= NULL;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data = con->data;
- *subtarget= data->subtarget;
- return (data->tar);
- }
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- {
- bRigidBodyJointConstraint *data = con->data;
- *subtarget= NULL;
- return data->tar;
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data = con->data;
- *subtarget= NULL;
- return data->tar;
- }
- break;
- default:
- *subtarget= NULL;
- break;
+ bConstraintChannel *chan;
+
+ chan= get_constraint_channel(list, name);
+
+ if (chan == NULL) {
+ chan= MEM_callocN(sizeof(bConstraintChannel), "new constraint channel");
+ BLI_addtail(list, chan);
+ strcpy(chan->name, name);
}
- return NULL;
+ return chan;
}
-void set_constraint_target(bConstraint *con, Object *ob, char *subtarget)
+/* --------- Constraint Channel Evaluation/Execution --------- */
+
+/* IPO-system call: calculate IPO-block for constraint channels, and flush that
+ * info onto the corresponding constraint.
+ */
+void do_constraint_channels (ListBase *conbase, ListBase *chanbase, float ctime, short onlydrivers)
{
- /* Set the target for this constraint */
- switch (con->type) {
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *data = con->data;
- data->tar= ob;
- if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data = con->data;
- data->tar= ob;
- if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data = con->data;
- data->tar= ob;
- if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data = con->data;
- data->tar= ob;
- if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_KINEMATIC:
- {
- bKinematicConstraint *data = con->data;
- data->tar= ob;
- if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *data = con->data;
- data->tar= ob;
- if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- {
- bLockTrackConstraint *data = con->data;
- data->tar= ob;
- if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data = con->data;
- data->tar= ob;
- }
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data = con->data;
- data->tar= ob;
- if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- {
- bRigidBodyJointConstraint *data = con->data;
- data->tar= ob;
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *data = (bMinMaxConstraint*)con->data;
- data->tar= ob;
- if(subtarget) BLI_strncpy(data->subtarget, subtarget, 32);
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data = con->data;
- data->tar= ob;
+ bConstraint *con;
+ bConstraintChannel *chan;
+ IpoCurve *icu= NULL;
+
+ /* for each Constraint, calculate its Influence from the corresponding ConstraintChannel */
+ for (con=conbase->first; con; con=con->next) {
+ chan = get_constraint_channel(chanbase, con->name);
+
+ if (chan && chan->ipo) {
+ calc_ipo(chan->ipo, ctime);
+
+ for (icu=chan->ipo->curve.first; icu; icu=icu->next) {
+ if (!onlydrivers || icu->driver) {
+ switch (icu->adrcode) {
+ case CO_ENFORCE:
+ {
+ /* Influence is clamped to 0.0f -> 1.0f range */
+ con->enforce = CLAMPIS(icu->curval, 0.0f, 1.0f);
+ }
+ break;
+ case CO_HEADTAIL:
+ {
+ con->headtail = icu->curval;
+ }
+ break;
+ }
+ }
+ }
}
- break;
}
}
+/* ************************ Constraints - General Utilities *************************** */
+/* These functions here don't act on any specific constraints, and are therefore should/will
+ * not require any of the special function-pointers afforded by the relevant constraint
+ * type-info structs.
+ */
+
+/* -------------- Naming -------------- */
+
+/* Find the first available, non-duplicate name for a given constraint */
void unique_constraint_name (bConstraint *con, ListBase *list)
{
- char tempname[64];
- int number;
- char *dot;
- int exists = 0;
bConstraint *curcon;
+ char tempname[64];
+ int number = 1, exists = 0;
+ char *dot;
/* See if we are given an empty string */
if (con->name[0] == '\0') {
/* give it default name first */
- strcpy (con->name, "Const");
+ strcpy(con->name, "Const");
}
/* See if we even need to do this */
- for (curcon = list->first; curcon; curcon=curcon->next){
- if (curcon!=con){
- if (!strcmp(curcon->name, con->name)){
+ if (list == NULL)
+ return;
+
+ for (curcon = list->first; curcon; curcon=curcon->next) {
+ if (curcon != con) {
+ if (!strcmp(curcon->name, con->name)) {
exists = 1;
break;
}
}
}
- if (!exists)
+ if (exists == 0)
return;
/* Strip off the suffix */
- dot=strchr(con->name, '.');
+ dot = strchr(con->name, '.');
if (dot)
*dot=0;
- for (number = 1; number <=999; number++){
- sprintf (tempname, "%s.%03d", con->name, number);
+ for (number = 1; number <= 999; number++) {
+ sprintf(tempname, "%s.%03d", con->name, number);
exists = 0;
- for (curcon=list->first; curcon; curcon=curcon->next){
- if (con!=curcon){
- if (!strcmp (curcon->name, tempname)){
+ for (curcon=list->first; curcon; curcon=curcon->next) {
+ if (con != curcon) {
+ if (strcmp(curcon->name, tempname)==0) {
exists = 1;
break;
}
}
}
- if (!exists){
- strcpy (con->name, tempname);
+ if (exists == 0) {
+ strcpy(con->name, tempname);
return;
}
}
}
-void *new_constraint_data (short type)
+/* ----------------- Evaluation Loop Preparation --------------- */
+
+/* package an object/bone for use in constraint evaluation */
+/* This function MEM_calloc's a bConstraintOb struct, that will need to be freed after evaluation */
+bConstraintOb *constraints_make_evalob (Object *ob, void *subdata, short datatype)
{
- void *result;
+ bConstraintOb *cob;
- switch (type) {
- case CONSTRAINT_TYPE_KINEMATIC:
- {
- bKinematicConstraint *data;
- data = MEM_callocN(sizeof(bKinematicConstraint), "kinematicConstraint");
-
- data->weight= (float)1.0;
- data->orientweight= (float)1.0;
- data->iterations = 500;
- data->flag= CONSTRAINT_IK_TIP|CONSTRAINT_IK_STRETCH|CONSTRAINT_IK_POS;
-
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *data;
- data = MEM_callocN(sizeof(bTrackToConstraint), "tracktoConstraint");
-
- data->reserved1 = TRACK_Y;
- data->reserved2 = UP_Z;
-
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *data;
- data = MEM_callocN(sizeof(bMinMaxConstraint), "minmaxConstraint");
-
- data->minmaxflag = TRACK_Z;
- data->offset = 0.0f;
- data->cache[0] = data->cache[1] = data->cache[2] = 0.0f;
- data->flag = 0;
+ /* create regardless of whether we have any data! */
+ cob= MEM_callocN(sizeof(bConstraintOb), "bConstraintOb");
+
+ /* based on type of available data */
+ switch (datatype) {
+ case CONSTRAINT_OBTYPE_OBJECT:
+ {
+ /* disregard subdata... calloc should set other values right */
+ if (ob) {
+ cob->ob = ob;
+ cob->type = datatype;
+ Mat4CpyMat4(cob->matrix, ob->obmat);
+ }
+ else
+ Mat4One(cob->matrix);
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data;
- data = MEM_callocN(sizeof(bRotateLikeConstraint), "rotlikeConstraint");
- data->flag = ROTLIKE_X|ROTLIKE_Y|ROTLIKE_Z;
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data;
- data = MEM_callocN(sizeof(bLocateLikeConstraint), "loclikeConstraint");
- data->flag = LOCLIKE_X|LOCLIKE_Y|LOCLIKE_Z;
- result = data;
+ Mat4CpyMat4(cob->startmat, cob->matrix);
}
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
+ break;
+ case CONSTRAINT_OBTYPE_BONE:
{
- bSizeLikeConstraint *data;
- data = MEM_callocN(sizeof(bLocateLikeConstraint), "sizelikeConstraint");
- data->flag |= SIZELIKE_X|SIZELIKE_Y|SIZELIKE_Z;
- result = data;
+ /* only set if we have valid bone, otherwise default */
+ if (ob && subdata) {
+ cob->ob = ob;
+ cob->pchan = (bPoseChannel *)subdata;
+ cob->type = datatype;
+
+ /* matrix in world-space */
+ Mat4MulMat4(cob->matrix, cob->pchan->pose_mat, ob->obmat);
+ }
+ else
+ Mat4One(cob->matrix);
+
+ Mat4CpyMat4(cob->startmat, cob->matrix);
}
- break;
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *data;
- data = MEM_callocN(sizeof(bActionConstraint), "actionConstraint");
- data->local= 1;
+ break;
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- {
- bLockTrackConstraint *data;
- data = MEM_callocN(sizeof(bLockTrackConstraint), "locktrackConstraint");
-
- data->trackflag = TRACK_Y;
- data->lockflag = LOCK_Z;
-
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data;
- data = MEM_callocN(sizeof(bFollowPathConstraint), "followpathConstraint");
-
- data->trackflag = TRACK_Y;
- data->upflag = UP_Z;
- data->offset = 0;
- data->followflag = 0;
-
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data;
- data = MEM_callocN(sizeof(bStretchToConstraint), "StretchToConstraint");
+ default: /* other types not yet handled */
+ Mat4One(cob->matrix);
+ Mat4One(cob->startmat);
+ break;
+ }
+
+ return cob;
+}
- data->volmode = 0;
- data->plane = 0;
- data->orglength = 0.0;
- data->bulge = 1.0;
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_LOCLIMIT:
- {
- bLocLimitConstraint *data;
- data = MEM_callocN(sizeof(bLocLimitConstraint), "LocLimitConstraint");
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_ROTLIMIT:
- {
- bRotLimitConstraint *data;
- data = MEM_callocN(sizeof(bRotLimitConstraint), "RotLimitConstraint");
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_SIZELIMIT:
- {
- bSizeLimitConstraint *data;
- data = MEM_callocN(sizeof(bSizeLimitConstraint), "SizeLimitConstraint");
- result = data;
- }
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- {
- bRigidBodyJointConstraint *data;
- int i;
- Base *base_iter;
-
- data = MEM_callocN(sizeof(bRigidBodyJointConstraint), "RigidBodyToConstraint");
- base_iter = G.scene->base.first;
- while( base_iter && !data->tar ) {
- if( ( ( base_iter->flag & SELECT ) &&
-// ( base_iter->lay & G.vd->lay ) ) &&
- ( base_iter != G.scene->basact ) )
- )
- data->tar=base_iter->object;
- base_iter = base_iter->next;
- }
- data->type=1;
- data->pivX=0.0;
- data->pivY=0.0;
- data->pivZ=0.0;
- data->axX=0.0;
- data->axY=0.0;
- data->axZ=0.0;
- for (i=0;i<6;i++)
- {
- data->minLimit[i]=0.0;
- data->maxLimit[i]=0.0;
+/* cleanup after constraint evaluation */
+void constraints_clear_evalob (bConstraintOb *cob)
+{
+ float delta[4][4], imat[4][4];
+
+ /* prevent crashes */
+ if (cob == NULL)
+ return;
+
+ /* calculate delta of constraints evaluation */
+ Mat4Invert(imat, cob->startmat);
+ Mat4MulMat4(delta, cob->matrix, imat);
+
+ /* copy matrices back to source */
+ switch (cob->type) {
+ case CONSTRAINT_OBTYPE_OBJECT:
+ {
+ /* cob->ob might not exist! */
+ if (cob->ob) {
+ /* copy new ob-matrix back to owner */
+ Mat4CpyMat4(cob->ob->obmat, cob->matrix);
+
+ /* copy inverse of delta back to owner */
+ Mat4Invert(cob->ob->constinv, delta);
}
- data->extraFz=0.0;
- result = data;
}
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
+ break;
+ case CONSTRAINT_OBTYPE_BONE:
{
- bClampToConstraint *data;
- data = MEM_callocN(sizeof(bClampToConstraint), "ClampToConstraint");
- result = data;
+ /* cob->ob or cob->pchan might not exist */
+ if (cob->ob && cob->pchan) {
+ /* copy new pose-matrix back to owner */
+ Mat4MulMat4(cob->pchan->pose_mat, cob->matrix, cob->ob->imat);
+
+ /* copy inverse of delta back to owner */
+ Mat4Invert(cob->pchan->constinv, delta);
+ }
}
- break;
-
- default:
- result = NULL;
- break;
+ break;
}
-
- return result;
+
+ /* free tempolary struct */
+ MEM_freeN(cob);
}
-bConstraintChannel *get_constraint_channel (ListBase *list, const char *name)
-{
- bConstraintChannel *chan;
+/* -------------- Space-Conversion API -------------- */
- for (chan = list->first; chan; chan=chan->next) {
- if (!strcmp(name, chan->name)) {
- return chan;
+/* This function is responsible for the correct transformations/conversions
+ * of a matrix from one space to another for constraint evaluation.
+ * For now, this is only implemented for Objects and PoseChannels.
+ */
+void constraint_mat_convertspace (Object *ob, bPoseChannel *pchan, float mat[][4], short from, short to)
+{
+ float tempmat[4][4];
+ float diff_mat[4][4];
+ float imat[4][4];
+
+ /* prevent crashes in these unlikely events */
+ if (ob==NULL || mat==NULL) return;
+ /* optimise trick - check if need to do anything */
+ if (from == to) return;
+
+ /* are we dealing with pose-channels or objects */
+ if (pchan) {
+ /* pose channels */
+ switch (from) {
+ case CONSTRAINT_SPACE_WORLD: /* ---------- FROM WORLDSPACE ---------- */
+ {
+ /* world to pose */
+ if (to==CONSTRAINT_SPACE_POSE || to==CONSTRAINT_SPACE_LOCAL || to==CONSTRAINT_SPACE_PARLOCAL) {
+ Mat4Invert(imat, ob->obmat);
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(mat, tempmat, imat);
+ }
+
+ /* pose to local */
+ if (to == CONSTRAINT_SPACE_LOCAL) {
+ /* call self with slightly different values */
+ constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to);
+ }
+ /* pose to local + parent */
+ else if (to == CONSTRAINT_SPACE_PARLOCAL) {
+ /* call self with slightly different values */
+ constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to);
+ }
+ }
+ break;
+ case CONSTRAINT_SPACE_POSE: /* ---------- FROM POSESPACE ---------- */
+ {
+ /* pose to world */
+ if (to == CONSTRAINT_SPACE_WORLD) {
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(mat, tempmat, ob->obmat);
+ }
+ /* pose to local */
+ else if (to == CONSTRAINT_SPACE_LOCAL) {
+ if (pchan->bone) {
+ if (pchan->parent) {
+ float offs_bone[4][4];
+
+ /* construct offs_bone the same way it is done in armature.c */
+ Mat4CpyMat3(offs_bone, pchan->bone->bone_mat);
+ VECCOPY(offs_bone[3], pchan->bone->head);
+ offs_bone[3][1]+= pchan->bone->parent->length;
+
+ if (pchan->bone->flag & BONE_HINGE) {
+ /* pose_mat = par_pose-space_location * chan_mat */
+ float tmat[4][4];
+
+ /* the rotation of the parent restposition */
+ Mat4CpyMat4(tmat, pchan->bone->parent->arm_mat);
+
+ /* the location of actual parent transform */
+ VECCOPY(tmat[3], offs_bone[3]);
+ offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
+ Mat4MulVecfl(pchan->parent->pose_mat, tmat[3]);
+
+ Mat4MulMat4(diff_mat, offs_bone, tmat);
+ Mat4Invert(imat, diff_mat);
+ }
+ else {
+ /* pose_mat = par_pose_mat * bone_mat * chan_mat */
+ Mat4MulMat4(diff_mat, offs_bone, pchan->parent->pose_mat);
+ Mat4Invert(imat, diff_mat);
+ }
+ }
+ else {
+ /* pose_mat = chan_mat * arm_mat */
+ Mat4Invert(imat, pchan->bone->arm_mat);
+ }
+
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(mat, tempmat, imat);
+ }
+ }
+ /* pose to local with parent */
+ else if (to == CONSTRAINT_SPACE_PARLOCAL) {
+ if (pchan->bone) {
+ Mat4Invert(imat, pchan->bone->arm_mat);
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(mat, tempmat, imat);
+ }
+ }
+ }
+ break;
+ case CONSTRAINT_SPACE_LOCAL: /* ------------ FROM LOCALSPACE --------- */
+ {
+ /* local to pose */
+ if (to==CONSTRAINT_SPACE_POSE || to==CONSTRAINT_SPACE_WORLD) {
+ /* do inverse procedure that was done for pose to local */
+ if (pchan->bone) {
+ /* we need the posespace_matrix = local_matrix + (parent_posespace_matrix + restpos) */
+ if (pchan->parent) {
+ float offs_bone[4][4];
+
+ /* construct offs_bone the same way it is done in armature.c */
+ Mat4CpyMat3(offs_bone, pchan->bone->bone_mat);
+ VECCOPY(offs_bone[3], pchan->bone->head);
+ offs_bone[3][1]+= pchan->bone->parent->length;
+
+ if (pchan->bone->flag & BONE_HINGE) {
+ /* pose_mat = par_pose-space_location * chan_mat */
+ float tmat[4][4];
+
+ /* the rotation of the parent restposition */
+ Mat4CpyMat4(tmat, pchan->bone->parent->arm_mat);
+
+ /* the location of actual parent transform */
+ VECCOPY(tmat[3], offs_bone[3]);
+ offs_bone[3][0]= offs_bone[3][1]= offs_bone[3][2]= 0.0f;
+ Mat4MulVecfl(pchan->parent->pose_mat, tmat[3]);
+
+ Mat4MulMat4(diff_mat, offs_bone, tmat);
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(mat, tempmat, diff_mat);
+ }
+ else {
+ /* pose_mat = par_pose_mat * bone_mat * chan_mat */
+ Mat4MulMat4(diff_mat, offs_bone, pchan->parent->pose_mat);
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(mat, tempmat, diff_mat);
+ }
+ }
+ else {
+ Mat4CpyMat4(diff_mat, pchan->bone->arm_mat);
+
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(mat, tempmat, diff_mat);
+ }
+ }
+ }
+ /* local to world */
+ if (to == CONSTRAINT_SPACE_WORLD) {
+ /* call self with slightly different values */
+ constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to);
+ }
+ }
+ break;
+ case CONSTRAINT_SPACE_PARLOCAL: /* -------------- FROM LOCAL WITH PARENT ---------- */
+ {
+ /* local to pose */
+ if (to==CONSTRAINT_SPACE_POSE || to==CONSTRAINT_SPACE_WORLD) {
+ if (pchan->bone) {
+ Mat4CpyMat4(diff_mat, pchan->bone->arm_mat);
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(mat, diff_mat, tempmat);
+ }
+ }
+ /* local to world */
+ if (to == CONSTRAINT_SPACE_WORLD) {
+ /* call self with slightly different values */
+ constraint_mat_convertspace(ob, pchan, mat, CONSTRAINT_SPACE_POSE, to);
+ }
+ }
+ break;
+ }
+ }
+ else {
+ /* objects */
+ if (from==CONSTRAINT_SPACE_WORLD && to==CONSTRAINT_SPACE_LOCAL) {
+ /* check if object has a parent - otherwise this won't work */
+ if (ob->parent) {
+ /* 'subtract' parent's effects from owner */
+ Mat4MulMat4(diff_mat, ob->parentinv, ob->parent->obmat);
+ Mat4Invert(imat, diff_mat);
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(mat, tempmat, imat);
+ }
+ }
+ else if (from==CONSTRAINT_SPACE_LOCAL && to==CONSTRAINT_SPACE_WORLD) {
+ /* check that object has a parent - otherwise this won't work */
+ if (ob->parent) {
+ /* 'add' parent's effect back to owner */
+ Mat4CpyMat4(tempmat, mat);
+ Mat4MulMat4(diff_mat, ob->parentinv, ob->parent->obmat);
+ Mat4MulMat4(mat, tempmat, diff_mat);
+ }
}
}
- return NULL;
}
-/* finds or creates new constraint channel */
-bConstraintChannel *verify_constraint_channel (ListBase *list, const char *name)
+/* ------------ General Target Matrix Tools ---------- */
+
+/* function that sets the given matrix based on given vertex group in mesh */
+static void contarget_get_mesh_mat (Object *ob, char *substring, float mat[][4])
{
- bConstraintChannel *chan;
+ DerivedMesh *dm;
+ float vec[3] = {0.0f, 0.0f, 0.0f}, tvec[3];
+ float normal[3] = {0.0f, 0.0f, 0.0f}, plane[3];
+ float imat[3][3], tmat[3][3];
+ int dgroup;
- chan= get_constraint_channel (list, name);
- if(chan==NULL) {
- chan= MEM_callocN(sizeof(bConstraintChannel), "new constraint chan");
- BLI_addtail(list, chan);
- strcpy(chan->name, name);
+ /* initialize target matrix using target matrix */
+ Mat4CpyMat4(mat, ob->obmat);
+
+ /* get index of vertex group */
+ dgroup = get_named_vertexgroup_num(ob, substring);
+ if (dgroup < 0) return;
+
+ /* get DerivedMesh */
+ if (G.obedit && G.editMesh) {
+ /* we are in editmode, so get a special derived mesh */
+ dm = CDDM_from_editmesh(G.editMesh, ob->data);
+ }
+ else {
+ /* when not in EditMode, this should exist */
+ dm = (DerivedMesh *)ob->derivedFinal;
}
- return chan;
+ /* only continue if there's a valid DerivedMesh */
+ if (dm) {
+ MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ int *index = (int *)dm->getVertDataArray(dm, CD_ORIGINDEX);
+ int numVerts = dm->getNumVerts(dm);
+ int i, j, count = 0;
+ float co[3], nor[3];
+
+ /* check that dvert and index are valid pointers (just in case) */
+ if (dvert && index) {
+ /* get the average of all verts with that are in the vertex-group */
+ for (i = 0; i < numVerts; i++, index++) {
+ for (j = 0; j < dvert[i].totweight; j++) {
+ /* does this vertex belong to nominated vertex group? */
+ if (dvert[i].dw[j].def_nr == dgroup) {
+ dm->getVertCo(dm, i, co);
+ dm->getVertNo(dm, i, nor);
+ VecAddf(vec, vec, co);
+ VecAddf(normal, normal, nor);
+ count++;
+ break;
+ }
+
+ }
+ }
+
+
+ /* calculate averages of normal and coordinates */
+ if (count > 0) {
+ VecMulf(vec, 1.0f / count);
+ VecMulf(normal, 1.0f / count);
+ }
+
+
+ /* derive the rotation from the average normal:
+ * - code taken from transform_manipulator.c,
+ * calc_manipulator_stats, V3D_MANIP_NORMAL case
+ */
+ /* we need the transpose of the inverse for a normal... */
+ Mat3CpyMat4(imat, ob->obmat);
+
+ Mat3Inv(tmat, imat);
+ Mat3Transp(tmat);
+ Mat3MulVecfl(tmat, normal);
+
+ Normalize(normal);
+ VECCOPY(plane, tmat[1]);
+
+ VECCOPY(tmat[2], normal);
+ Crossf(tmat[0], normal, plane);
+ Crossf(tmat[1], tmat[2], tmat[0]);
+
+ Mat4CpyMat3(mat, tmat);
+ Mat4Ortho(mat);
+
+
+ /* apply the average coordinate as the new location */
+ VecMat4MulVecfl(tvec, ob->obmat, vec);
+ VECCOPY(mat[3], tvec);
+ }
+ }
+
+ /* free temporary DerivedMesh created (in EditMode case) */
+ if (G.editMesh) {
+ if (dm) dm->release(dm);
+ }
}
-
-/* ***************** Evaluating ********************* */
-
-/* does ipos only */
-void do_constraint_channels (ListBase *conbase, ListBase *chanbase, float ctime)
+/* function that sets the given matrix based on given vertex group in lattice */
+static void contarget_get_lattice_mat (Object *ob, char *substring, float mat[][4])
{
- bConstraint *con;
- bConstraintChannel *chan;
- IpoCurve *icu=NULL;
+ Lattice *lt= (Lattice *)ob->data;
- for (con=conbase->first; con; con=con->next) {
- chan = get_constraint_channel(chanbase, con->name);
- if (chan && chan->ipo){
- calc_ipo(chan->ipo, ctime);
- for (icu=chan->ipo->curve.first; icu; icu=icu->next){
- switch (icu->adrcode){
- case CO_ENFORCE:
- con->enforce = icu->curval;
- if (con->enforce<0.0f) con->enforce= 0.0f;
- else if (con->enforce>1.0f) con->enforce= 1.0f;
- break;
- }
+ DispList *dl = find_displist(&ob->disp, DL_VERTS);
+ float *co = dl?dl->verts:NULL;
+ BPoint *bp = lt->def;
+
+ MDeformVert *dvert = lt->dvert;
+ int tot_verts= lt->pntsu*lt->pntsv*lt->pntsw;
+ float vec[3]= {0.0f, 0.0f, 0.0f}, tvec[3];
+ int dgroup=0, grouped=0;
+ int i, n;
+
+ /* initialize target matrix using target matrix */
+ Mat4CpyMat4(mat, ob->obmat);
+
+ /* get index of vertex group */
+ dgroup = get_named_vertexgroup_num(ob, substring);
+ if (dgroup < 0) return;
+ if (dvert == NULL) return;
+
+ /* 1. Loop through control-points checking if in nominated vertex-group.
+ * 2. If it is, add it to vec to find the average point.
+ */
+ for (i=0; i < tot_verts; i++, dvert++) {
+ for (n= 0; n < dvert->totweight; n++) {
+ /* found match - vert is in vgroup */
+ if (dvert->dw[n].def_nr == dgroup) {
+ /* copy coordinates of point to temporary vector, then add to find average */
+ if (co)
+ memcpy(tvec, co, 3*sizeof(float));
+ else
+ memcpy(tvec, bp->vec, 3*sizeof(float));
+
+ VecAddf(vec, vec, tvec);
+ grouped++;
+
+ break;
}
}
+
+ /* advance pointer to coordinate data */
+ if (co) co+= 3;
+ else bp++;
}
+
+ /* find average location, then multiply by ob->obmat to find world-space location */
+ if (grouped)
+ VecMulf(vec, 1.0f / grouped);
+ VecMat4MulVecfl(tvec, ob->obmat, vec);
+
+ /* copy new location to matrix */
+ VECCOPY(mat[3], tvec);
}
-void Mat4BlendMat4(float out[][4], float dst[][4], float src[][4], float srcweight)
+/* generic function to get the appropriate matrix for most target cases */
+/* The cases where the target can be object data have not been implemented */
+static void constraint_target_to_mat4 (Object *ob, char *substring, float mat[][4], short from, short to, float headtail)
{
- float squat[4], dquat[4], fquat[4];
- float ssize[3], dsize[3], fsize[4];
- float sloc[3], dloc[3], floc[3];
- float mat3[3][3], dstweight;
- float qmat[3][3], smat[3][3];
- int i;
+ /* Case OBJECT */
+ if (!strlen(substring)) {
+ Mat4CpyMat4(mat, ob->obmat);
+ constraint_mat_convertspace(ob, NULL, mat, from, to);
+ }
+ /* Case VERTEXGROUP */
+ /* Current method just takes the average location of all the points in the
+ * VertexGroup, and uses that as the location value of the targets. Where
+ * possible, the orientation will also be calculated, by calculating an
+ * 'average' vertex normal, and deriving the rotaation from that.
+ *
+ * NOTE: EditMode is not currently supported, and will most likely remain that
+ * way as constraints can only really affect things on object/bone level.
+ */
+ else if (ob->type == OB_MESH) {
+ contarget_get_mesh_mat(ob, substring, mat);
+ constraint_mat_convertspace(ob, NULL, mat, from, to);
+ }
+ else if (ob->type == OB_LATTICE) {
+ contarget_get_lattice_mat(ob, substring, mat);
+ constraint_mat_convertspace(ob, NULL, mat, from, to);
+ }
+ /* Case BONE */
+ else {
+ bPoseChannel *pchan;
+
+ pchan = get_pose_channel(ob->pose, substring);
+ if (pchan) {
+ /* Multiply the PoseSpace accumulation/final matrix for this
+ * PoseChannel by the Armature Object's Matrix to get a worldspace
+ * matrix.
+ */
+ if (headtail < 0.000001) {
+ /* skip length interpolation if set to head */
+ Mat4MulMat4(mat, pchan->pose_mat, ob->obmat);
+ }
+ else {
+ float tempmat[4][4], loc[3];
+
+ /* interpolate along length of bone */
+ VecLerpf(loc, pchan->pose_head, pchan->pose_tail, headtail);
+
+ /* use interpolated distance for subtarget */
+ Mat4CpyMat4(tempmat, pchan->pose_mat);
+ VecCopyf(tempmat[3], loc);
+
+ Mat4MulMat4(mat, tempmat, ob->obmat);
+ }
+ }
+ else
+ Mat4CpyMat4(mat, ob->obmat);
+
+ /* convert matrix space as required */
+ constraint_mat_convertspace(ob, pchan, mat, from, to);
+ }
+}
- dstweight = 1.0F-srcweight;
+/* ************************* Specific Constraints ***************************** */
+/* Each constraint defines a set of functions, which will be called at the appropriate
+ * times. In addition to this, each constraint should have a type-info struct, where
+ * its functions are attached for use.
+ */
+
+/* Template for type-info data:
+ * - make a copy of this when creating new constraints, and just change the functions
+ * pointed to as necessary
+ * - although the naming of functions doesn't matter, it would help for code
+ * readability, to follow the same naming convention as is presented here
+ * - any functions that a constraint doesn't need to define, don't define
+ * for such cases, just use NULL
+ * - these should be defined after all the functions have been defined, so that
+ * forward-definitions/prototypes don't need to be used!
+ * - keep this copy #if-def'd so that future constraints can get based off this
+ */
+#if 0
+static bConstraintTypeInfo CTI_CONSTRNAME = {
+ CONSTRAINT_TYPE_CONSTRNAME, /* type */
+ sizeof(bConstrNameConstraint), /* size */
+ "ConstrName", /* name */
+ "bConstrNameConstraint", /* struct name */
+ constrname_free, /* free data */
+ constrname_relink, /* relink data */
+ constrname_copy, /* copy data */
+ constrname_new_data, /* new data */
+ constrname_get_tars, /* get constraint targets */
+ constrname_flush_tars, /* flush constraint targets */
+ constrname_get_tarmat, /* get target matrix */
+ constrname_evaluate /* evaluate */
+};
+#endif
- Mat3CpyMat4(mat3, dst);
- Mat3ToQuat(mat3, dquat);
- Mat3ToSize(mat3, dsize);
- VECCOPY (dloc, dst[3]);
+/* This function should be used for the get_target_matrix member of all
+ * constraints that are not picky about what happens to their target matrix.
+ */
+static void default_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+{
+ if (VALID_CONS_TARGET(ct))
+ constraint_target_to_mat4(ct->tar, ct->subtarget, ct->matrix, CONSTRAINT_SPACE_WORLD, ct->space, con->headtail);
+ else if (ct)
+ Mat4One(ct->matrix);
+}
- Mat3CpyMat4(mat3, src);
- Mat3ToQuat(mat3, squat);
- Mat3ToSize(mat3, ssize);
- VECCOPY (sloc, src[3]);
+/* This following macro should be used for all standard single-target *_get_tars functions
+ * to save typing and reduce maintainance woes.
+ * (Hopefully all compilers will be happy with the lines with just a space on them. Those are
+ * really just to help this code easier to read)
+ */
+#define SINGLETARGET_GET_TARS(con, datatar, datasubtarget, ct, list) \
+ { \
+ ct= MEM_callocN(sizeof(bConstraintTarget), "tempConstraintTarget"); \
+ \
+ ct->tar= datatar; \
+ strcpy(ct->subtarget, datasubtarget); \
+ ct->space= con->tarspace; \
+ ct->flag= CONSTRAINT_TAR_TEMP; \
+ \
+ if (ct->tar) { \
+ if ((ct->tar->type==OB_ARMATURE) && (ct->subtarget[0])) ct->type = CONSTRAINT_OBTYPE_BONE; \
+ else if (ELEM(ct->tar->type, OB_MESH, OB_LATTICE) && (ct->subtarget[0])) ct->type = CONSTRAINT_OBTYPE_VERT; \
+ else ct->type = CONSTRAINT_OBTYPE_OBJECT; \
+ } \
+ \
+ BLI_addtail(list, ct); \
+ }
- /* Do the actual blend */
- for (i=0; i<3; i++){
- floc[i] = (dloc[i]*dstweight) + (sloc[i]*srcweight);
- fsize[i] = 1.0f + ((dsize[i]-1.0f)*dstweight) + ((ssize[i]-1.0f)*srcweight);
- fquat[i+1] = (dquat[i+1]*dstweight) + (squat[i+1]*srcweight);
+/* This following macro should be used for all standard single-target *_get_tars functions
+ * to save typing and reduce maintainance woes. It does not do the subtarget related operations
+ * (Hopefully all compilers will be happy with the lines with just a space on them. Those are
+ * really just to help this code easier to read)
+ */
+#define SINGLETARGETNS_GET_TARS(con, datatar, ct, list) \
+ { \
+ ct= MEM_callocN(sizeof(bConstraintTarget), "tempConstraintTarget"); \
+ \
+ ct->tar= datatar; \
+ ct->space= con->tarspace; \
+ ct->flag= CONSTRAINT_TAR_TEMP; \
+ \
+ if (ct->tar) ct->type = CONSTRAINT_OBTYPE_OBJECT; \
+ \
+ BLI_addtail(list, ct); \
+ }
+
+/* This following macro should be used for all standard single-target *_flush_tars functions
+ * to save typing and reduce maintainance woes.
+ * (Hopefully all compilers will be happy with the lines with just a space on them. Those are
+ * really just to help this code easier to read)
+ */
+#define SINGLETARGET_FLUSH_TARS(con, datatar, datasubtarget, ct, list, nocopy) \
+ { \
+ if (ct) { \
+ if (nocopy == 0) { \
+ datatar= ct->tar; \
+ strcpy(datasubtarget, ct->subtarget); \
+ con->tarspace= ct->space; \
+ } \
+ \
+ BLI_freelinkN(list, ct); \
+ } \
}
- /* Do one more iteration for the quaternions only and normalize the quaternion if needed */
- fquat[0] = 1.0f + ((dquat[0]-1.0f)*dstweight) + ((squat[0]-1.0f)*srcweight);
- NormalQuat (fquat);
+/* This following macro should be used for all standard single-target *_flush_tars functions
+ * to save typing and reduce maintainance woes. It does not do the subtarget related operations
+ * (Hopefully all compilers will be happy with the lines with just a space on them. Those are
+ * really just to help this code easier to read)
+ */
+#define SINGLETARGETNS_FLUSH_TARS(con, datatar, ct, list, nocopy) \
+ { \
+ if (ct) { \
+ if (nocopy == 0) { \
+ datatar= ct->tar; \
+ con->tarspace= ct->space; \
+ } \
+ \
+ BLI_freelinkN(list, ct); \
+ } \
+ }
+
+/* --------- ChildOf Constraint ------------ */
- QuatToMat3(fquat, qmat);
- SizeToMat3(fsize, smat);
+static void childof_new_data (void *cdata)
+{
+ bChildOfConstraint *data= (bChildOfConstraint *)cdata;
+
+ data->flag = (CHILDOF_LOCX | CHILDOF_LOCY | CHILDOF_LOCZ |
+ CHILDOF_ROTX |CHILDOF_ROTY | CHILDOF_ROTZ |
+ CHILDOF_SIZEX | CHILDOF_SIZEY | CHILDOF_SIZEZ);
+ Mat4One(data->invmat);
+}
- Mat3MulMat3(mat3, qmat, smat);
- Mat4CpyMat3(out, mat3);
- VECCOPY (out[3], floc);
+static void childof_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bChildOfConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
}
-static void constraint_target_to_mat4 (Object *ob, const char *substring, float mat[][4], float size[3])
+static void childof_flush_tars (bConstraint *con, ListBase *list, short nocopy)
{
+ if (con && list) {
+ bChildOfConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
- /* Case OBJECT */
- if (!strlen(substring)) {
- Mat4CpyMat4 (mat, ob->obmat);
- VECCOPY (size, ob->size); // whats this for, hack! (ton)
+static void childof_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bChildOfConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ /* only evaluate if there is a target */
+ if (VALID_CONS_TARGET(ct)) {
+ float parmat[4][4], invmat[4][4], tempmat[4][4];
+ float loc[3], eul[3], size[3];
+ float loco[3], eulo[3], sizo[3];
+
+ /* get offset (parent-inverse) matrix */
+ Mat4CpyMat4(invmat, data->invmat);
+
+ /* extract components of both matrices */
+ VECCOPY(loc, ct->matrix[3]);
+ Mat4ToEul(ct->matrix, eul);
+ Mat4ToSize(ct->matrix, size);
+
+ VECCOPY(loco, invmat[3]);
+ Mat4ToEul(invmat, eulo);
+ Mat4ToSize(invmat, sizo);
+
+ /* disable channels not enabled */
+ if (!(data->flag & CHILDOF_LOCX)) loc[0]= loco[0]= 0.0f;
+ if (!(data->flag & CHILDOF_LOCY)) loc[1]= loco[1]= 0.0f;
+ if (!(data->flag & CHILDOF_LOCZ)) loc[2]= loco[2]= 0.0f;
+ if (!(data->flag & CHILDOF_ROTX)) eul[0]= eulo[0]= 0.0f;
+ if (!(data->flag & CHILDOF_ROTY)) eul[1]= eulo[1]= 0.0f;
+ if (!(data->flag & CHILDOF_ROTZ)) eul[2]= eulo[2]= 0.0f;
+ if (!(data->flag & CHILDOF_SIZEX)) size[0]= sizo[0]= 1.0f;
+ if (!(data->flag & CHILDOF_SIZEY)) size[1]= sizo[1]= 1.0f;
+ if (!(data->flag & CHILDOF_SIZEZ)) size[2]= sizo[2]= 1.0f;
+
+ /* make new target mat and offset mat */
+ LocEulSizeToMat4(ct->matrix, loc, eul, size);
+ LocEulSizeToMat4(invmat, loco, eulo, sizo);
+
+ /* multiply target (parent matrix) by offset (parent inverse) to get
+ * the effect of the parent that will be exherted on the owner
+ */
+ Mat4MulMat4(parmat, invmat, ct->matrix);
+
+ /* now multiply the parent matrix by the owner matrix to get the
+ * the effect of this constraint (i.e. owner is 'parented' to parent)
+ */
+ Mat4CpyMat4(tempmat, cob->matrix);
+ Mat4MulMat4(cob->matrix, tempmat, parmat);
}
- /* Case BONE */
- else {
- bPoseChannel *pchan;
- float bsize[3]={1, 1, 1};
+}
- pchan = get_pose_channel(ob->pose, substring);
- if (pchan){
- /**
- * Multiply the objectspace bonematrix by the skeletons's global
- * transform to obtain the worldspace transformation of the target
- */
- Mat4MulMat4 (mat, pchan->pose_mat, ob->obmat);
- }
- else
- Mat4CpyMat4 (mat, ob->obmat);
+static bConstraintTypeInfo CTI_CHILDOF = {
+ CONSTRAINT_TYPE_CHILDOF, /* type */
+ sizeof(bChildOfConstraint), /* size */
+ "ChildOf", /* name */
+ "bChildOfConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ childof_new_data, /* new data */
+ childof_get_tars, /* get constraint targets */
+ childof_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get a target matrix */
+ childof_evaluate /* evaluate */
+};
+
+/* -------- TrackTo Constraint ------- */
+
+static void trackto_new_data (void *cdata)
+{
+ bTrackToConstraint *data= (bTrackToConstraint *)cdata;
+
+ data->reserved1 = TRACK_Y;
+ data->reserved2 = UP_Z;
+}
+
+static void trackto_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bTrackToConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
+}
- VECCOPY(size, bsize); // whats this for, hack! (ton)
+static void trackto_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bTrackToConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
}
}
-/* stupid little cross product function, 0:x, 1:y, 2:z axes */
-static int basis_cross(int n, int m)
+static int basis_cross (int n, int m)
{
- if(n-m == 1) return 1;
- if(n-m == -1) return -1;
- if(n-m == 2) return -1;
- if(n-m == -2) return 1;
- else return 0;
+ switch (n-m) {
+ case 1:
+ case -2:
+ return 1;
+
+ case -1:
+ case 2:
+ return -1;
+
+ default:
+ return 0;
+ }
}
-static void vectomat(float *vec, float *target_up, short axis, short upflag, short flags, float m[][3])
+static void vectomat (float *vec, float *target_up, short axis, short upflag, short flags, float m[][3])
{
float n[3];
float u[3]; /* vector specifying the up axis */
@@ -906,19 +1055,18 @@ static void vectomat(float *vec, float *target_up, short axis, short upflag, sho
float right[3];
float neg = -1;
int right_index;
-
+
VecCopyf(n, vec);
- if(Normalize(n) == 0.0) {
+ if (Normalize(n) == 0.0) {
n[0] = 0.0;
n[1] = 0.0;
n[2] = 1.0;
}
- if(axis > 2) axis -= 3;
+ if (axis > 2) axis -= 3;
else VecMulf(n,-1);
/* n specifies the transformation of the track axis */
-
- if(flags & TARGET_Z_UP) {
+ if (flags & TARGET_Z_UP) {
/* target Z axis is the global up axis */
u[0] = target_up[0];
u[1] = target_up[1];
@@ -936,7 +1084,7 @@ static void vectomat(float *vec, float *target_up, short axis, short upflag, sho
VecSubf(proj, u, proj); /* then onto the plane */
/* proj specifies the transformation of the up axis */
- if(Normalize(proj) == 0.0) { /* degenerate projection */
+ if (Normalize(proj) == 0.0) { /* degenerate projection */
proj[0] = 0.0;
proj[1] = 1.0;
proj[2] = 0.0;
@@ -946,24 +1094,24 @@ static void vectomat(float *vec, float *target_up, short axis, short upflag, sho
Crossf(right, proj, n);
Normalize(right);
- if(axis != upflag) {
+ if (axis != upflag) {
right_index = 3 - axis - upflag;
- neg = (float) basis_cross(axis, upflag);
-
+ neg = (float)basis_cross(axis, upflag);
+
/* account for up direction, track direction */
m[right_index][0] = neg * right[0];
m[right_index][1] = neg * right[1];
m[right_index][2] = neg * right[2];
-
+
m[upflag][0] = proj[0];
m[upflag][1] = proj[1];
m[upflag][2] = proj[2];
-
+
m[axis][0] = n[0];
m[axis][1] = n[1];
m[axis][2] = n[2];
}
-
+ /* identity matrix - don't do anything if the two axes are the same */
else {
m[0][0]= m[1][1]= m[2][2]= 1.0;
m[0][1]= m[0][2]= m[0][3]= 0.0;
@@ -973,1316 +1121,2288 @@ static void vectomat(float *vec, float *target_up, short axis, short upflag, sho
}
-/* called during solve_constraints */
-/* also for make_parent, to find correct inverse of "follow path" */
-/* warning, ownerdata is void... is not Bone anymore, but PoseChannel or Object */
-/* ctime is global time, uncorrected for local bsystem_time */
-short get_constraint_target_matrix (bConstraint *con, short ownertype, void* ownerdata, float mat[][4], float size[3], float ctime)
+static void trackto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
{
- short valid=0;
+ bTrackToConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ if (VALID_CONS_TARGET(ct)) {
+ float size[3], vec[3];
+ float totmat[3][3];
+ float tmat[4][4];
+
+ /* Get size property, since ob->size is only the object's own relative size, not its global one */
+ Mat4ToSize(cob->matrix, size);
+
+ /* Clear the object's rotation */
+ cob->matrix[0][0]=size[0];
+ cob->matrix[0][1]=0;
+ cob->matrix[0][2]=0;
+ cob->matrix[1][0]=0;
+ cob->matrix[1][1]=size[1];
+ cob->matrix[1][2]=0;
+ cob->matrix[2][0]=0;
+ cob->matrix[2][1]=0;
+ cob->matrix[2][2]=size[2];
+
+ /* targetmat[2] instead of ownermat[2] is passed to vectomat
+ * for backwards compatability it seems... (Aligorith)
+ */
+ VecSubf(vec, cob->matrix[3], ct->matrix[3]);
+ vectomat(vec, ct->matrix[2],
+ (short)data->reserved1, (short)data->reserved2,
+ data->flags, totmat);
+
+ Mat4CpyMat4(tmat, cob->matrix);
+ Mat4MulMat34(cob->matrix, totmat, tmat);
+ }
+}
- switch (con->type){
- case CONSTRAINT_TYPE_NULL:
- {
- Mat4One(mat);
- }
- break;
- case CONSTRAINT_TYPE_ACTION:
- {
- if (ownertype == TARGET_BONE) {
- extern void chan_calc_mat(bPoseChannel *chan);
- bActionConstraint *data = (bActionConstraint*)con->data;
- bPose *pose;
- bPoseChannel *pchan, *tchan;
- float tempmat3[3][3];
- float eul[3];
- float s,t;
-
- Mat4One(mat); // return mat
-
- if (data->tar==NULL) return 0;
-
- /* need proper check for bone... */
- if(data->subtarget[0]) {
- pchan = get_pose_channel(data->tar->pose, data->subtarget);
- if (pchan) {
- float arm_mat[3][3], pose_mat[3][3]; /* arm mat should be bone mat! bug... */
-
- Mat3CpyMat4(arm_mat, pchan->bone->arm_mat);
- Mat3CpyMat4(pose_mat, pchan->pose_mat);
-
- /* new; true local rotation constraint */
- if(data->local) {
- float diff_mat[3][3], par_mat[3][3], ipar_mat[3][3];
- /* we need the local rotation = current rotation - (parent rotation + restpos) */
-
- if (pchan->parent) {
- Mat3CpyMat4(par_mat, pchan->parent->pose_mat);
- Mat3MulMat3(diff_mat, par_mat, arm_mat);
-
- Mat3Inv(ipar_mat, diff_mat);
- }
- else {
- Mat3Inv(ipar_mat, arm_mat);
- }
-
- Mat3MulMat3(tempmat3, ipar_mat, pose_mat);
- }
- else { /* we use the deform mat, for backwards compatibility */
- float imat[3][3];
-
- Mat3Inv(imat, arm_mat);
- Mat3MulMat3(tempmat3, pose_mat, imat);
- }
- }
- else Mat3One(tempmat3);
- }
- else {
- float ans[4][4];
-
- constraint_target_to_mat4(data->tar, data->subtarget, ans, size);
- /* extract rotation, is in global world coordinates */
- Mat3CpyMat4(tempmat3, ans);
- }
-
- Mat3ToEul(tempmat3, eul);
- eul[0]*=(float)(180.0/M_PI);
- eul[1]*=(float)(180.0/M_PI);
- eul[2]*=(float)(180.0/M_PI);
-
- /* Target defines the animation */
- s = (eul[data->type]-data->min)/(data->max-data->min);
- if (s<0)
- s=0;
- if (s>1)
- s=1;
+static bConstraintTypeInfo CTI_TRACKTO = {
+ CONSTRAINT_TYPE_TRACKTO, /* type */
+ sizeof(bTrackToConstraint), /* size */
+ "TrackTo", /* name */
+ "bTrackToConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ trackto_new_data, /* new data */
+ trackto_get_tars, /* get constraint targets */
+ trackto_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get target matrix */
+ trackto_evaluate /* evaluate */
+};
+
+/* --------- Inverse-Kinemetics --------- */
+
+static void kinematic_new_data (void *cdata)
+{
+ bKinematicConstraint *data= (bKinematicConstraint *)cdata;
+
+ data->weight= (float)1.0;
+ data->orientweight= (float)1.0;
+ data->iterations = 500;
+ data->flag= CONSTRAINT_IK_TIP|CONSTRAINT_IK_STRETCH|CONSTRAINT_IK_POS;
+}
- t = ( s * (data->end-data->start)) + data->start;
+static void kinematic_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bKinematicConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ SINGLETARGET_GET_TARS(con, data->poletar, data->polesubtarget, ct, list)
+ }
+}
- /* Get the appropriate information from the action, we make temp pose */
- pose = MEM_callocN(sizeof(bPose), "pose");
-
- pchan = ownerdata;
- tchan= verify_pose_channel(pose, pchan->name);
- extract_pose_from_action (pose, data->act, t);
-
- chan_calc_mat(tchan);
-
- Mat4CpyMat4(mat, tchan->chan_mat);
+static void kinematic_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bKinematicConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ ct= ct->next;
+ SINGLETARGET_FLUSH_TARS(con, data->poletar, data->polesubtarget, ct, list, nocopy)
+ }
+}
- /* Clean up */
- free_pose_channels(pose);
- MEM_freeN(pose);
- }
+static void kinematic_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+{
+ bKinematicConstraint *data= con->data;
+
+ if (VALID_CONS_TARGET(ct))
+ constraint_target_to_mat4(ct->tar, ct->subtarget, ct->matrix, CONSTRAINT_SPACE_WORLD, ct->space, con->headtail);
+ else if (ct) {
+ if (data->flag & CONSTRAINT_IK_AUTO) {
+ Object *ob= cob->ob;
+ if (ob == NULL) {
+ Mat4One(ct->matrix);
+ }
+ else {
+ float vec[3];
+ /* move grabtarget into world space */
+ VECCOPY(vec, data->grabtarget);
+ Mat4MulVecfl(ob->obmat, vec);
+ Mat4CpyMat4(ct->matrix, ob->obmat);
+ VECCOPY(ct->matrix[3], vec);
+ }
}
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data = (bLocateLikeConstraint*)con->data;
- Object *ob= data->tar;
+ else
+ Mat4One(ct->matrix);
+ }
+}
+
+static bConstraintTypeInfo CTI_KINEMATIC = {
+ CONSTRAINT_TYPE_KINEMATIC, /* type */
+ sizeof(bKinematicConstraint), /* size */
+ "IK", /* name */
+ "bKinematicConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ kinematic_new_data, /* new data */
+ kinematic_get_tars, /* get constraint targets */
+ kinematic_flush_tars, /* flush constraint targets */
+ kinematic_get_tarmat, /* get target matrix */
+ NULL /* evaluate - solved as separate loop */
+};
+
+/* -------- Follow-Path Constraint ---------- */
+
+static void followpath_new_data (void *cdata)
+{
+ bFollowPathConstraint *data= (bFollowPathConstraint *)cdata;
+
+ data->trackflag = TRACK_Y;
+ data->upflag = UP_Z;
+ data->offset = 0;
+ data->followflag = 0;
+}
+
+static void followpath_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bFollowPathConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints without subtargets */
+ SINGLETARGETNS_GET_TARS(con, data->tar, ct, list)
+ }
+}
+
+static void followpath_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bFollowPathConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGETNS_FLUSH_TARS(con, data->tar, ct, list, nocopy)
+ }
+}
+
+static void followpath_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+{
+ bFollowPathConstraint *data= con->data;
+
+ if (VALID_CONS_TARGET(ct)) {
+ Curve *cu= ct->tar->data;
+ float q[4], vec[4], dir[3], *quat, x1;
+ float totmat[4][4];
+ float curvetime;
+
+ Mat4One(totmat);
+ Mat4One(ct->matrix);
+
+ /* note: when creating constraints that follow path, the curve gets the CU_PATH set now,
+ * currently for paths to work it needs to go through the bevlist/displist system (ton)
+ */
+
+ /* only happens on reload file, but violates depsgraph still... fix! */
+ if (cu->path==NULL || cu->path->data==NULL)
+ makeDispListCurveTypes(ct->tar, 0);
+
+ if (cu->path && cu->path->data) {
+ curvetime= bsystem_time(ct->tar, (float)ctime, 0.0) - data->offset;
- if (data->tar) {
- if (strlen(data->subtarget)) {
- bPoseChannel *pchan;
- float tmat[4][4];
- float bsize[3]={1, 1, 1};
+ if (calc_ipo_spec(cu->ipo, CU_SPEED, &curvetime)==0) {
+ curvetime /= cu->pathlen;
+ CLAMP(curvetime, 0.0, 1.0);
+ }
+
+ if ( where_on_path(ct->tar, curvetime, vec, dir) ) {
+ if (data->followflag) {
+ quat= vectoquat(dir, (short) data->trackflag, (short) data->upflag);
- pchan = get_pose_channel(ob->pose, data->subtarget);
- if (pchan) {
- Mat4CpyMat4(tmat, pchan->pose_mat);
-
- if (data->flag & LOCLIKE_TIP)
- VECCOPY(tmat[3], pchan->pose_tail);
-
- Mat4MulMat4 (mat, tmat, ob->obmat);
- }
- else
- Mat4CpyMat4 (mat, ob->obmat);
+ Normalize(dir);
+ q[0]= (float)cos(0.5*vec[3]);
+ x1= (float)sin(0.5*vec[3]);
+ q[1]= -x1*dir[0];
+ q[2]= -x1*dir[1];
+ q[3]= -x1*dir[2];
+ QuatMul(quat, q, quat);
- VECCOPY(size, bsize); // what's this hack for?
- }
- else {
- Mat4CpyMat4 (mat, ob->obmat);
- VECCOPY(size, data->tar->size); // what's this hack for?
+ QuatToMat4(quat, totmat);
}
- valid=1;
+ VECCOPY(totmat[3], vec);
+
+ Mat4MulSerie(ct->matrix, ct->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
}
- else
- Mat4One (mat);
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *data = (bMinMaxConstraint*)con->data;
+ }
+ }
+ else if (ct)
+ Mat4One(ct->matrix);
+}
- if (data->tar){
- constraint_target_to_mat4(data->tar, data->subtarget, mat, size);
- valid=1;
- }
- else
- Mat4One (mat);
- }
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data;
- data = (bRotateLikeConstraint*)con->data;
+static void followpath_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bConstraintTarget *ct= targets->first;
+
+ /* only evaluate if there is a target */
+ if (VALID_CONS_TARGET(ct)) {
+ float obmat[4][4];
+ float size[3], obsize[3];
+
+ /* get Object local transform (loc/rot/size) to determine transformation from path */
+ //object_to_mat4(ob, obmat);
+ Mat4CpyMat4(obmat, cob->matrix); // FIXME!!!
+
+ /* get scaling of object before applying constraint */
+ Mat4ToSize(cob->matrix, size);
+
+ /* apply targetmat - containing location on path, and rotation */
+ Mat4MulSerie(cob->matrix, ct->matrix, obmat, NULL, NULL, NULL, NULL, NULL, NULL);
+
+ /* un-apply scaling caused by path */
+ Mat4ToSize(cob->matrix, obsize);
+ if (obsize[0])
+ VecMulf(cob->matrix[0], size[0] / obsize[0]);
+ if (obsize[1])
+ VecMulf(cob->matrix[1], size[1] / obsize[1]);
+ if (obsize[2])
+ VecMulf(cob->matrix[2], size[2] / obsize[2]);
+ }
+}
- if (data->tar){
- constraint_target_to_mat4(data->tar, data->subtarget, mat, size);
- valid=1;
- }
- else
- Mat4One (mat);
- }
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data;
- data = (bSizeLikeConstraint*)con->data;
+static bConstraintTypeInfo CTI_FOLLOWPATH = {
+ CONSTRAINT_TYPE_FOLLOWPATH, /* type */
+ sizeof(bFollowPathConstraint), /* size */
+ "Follow Path", /* name */
+ "bFollowPathConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ followpath_new_data, /* new data */
+ followpath_get_tars, /* get constraint targets */
+ followpath_flush_tars, /* flush constraint targets */
+ followpath_get_tarmat, /* get target matrix */
+ followpath_evaluate /* evaluate */
+};
+
+/* --------- Limit Location --------- */
+
+
+static void loclimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bLocLimitConstraint *data = con->data;
+
+ if (data->flag & LIMIT_XMIN) {
+ if (cob->matrix[3][0] < data->xmin)
+ cob->matrix[3][0] = data->xmin;
+ }
+ if (data->flag & LIMIT_XMAX) {
+ if (cob->matrix[3][0] > data->xmax)
+ cob->matrix[3][0] = data->xmax;
+ }
+ if (data->flag & LIMIT_YMIN) {
+ if (cob->matrix[3][1] < data->ymin)
+ cob->matrix[3][1] = data->ymin;
+ }
+ if (data->flag & LIMIT_YMAX) {
+ if (cob->matrix[3][1] > data->ymax)
+ cob->matrix[3][1] = data->ymax;
+ }
+ if (data->flag & LIMIT_ZMIN) {
+ if (cob->matrix[3][2] < data->zmin)
+ cob->matrix[3][2] = data->zmin;
+ }
+ if (data->flag & LIMIT_ZMAX) {
+ if (cob->matrix[3][2] > data->zmax)
+ cob->matrix[3][2] = data->zmax;
+ }
+}
- if (data->tar){
- constraint_target_to_mat4(data->tar, data->subtarget, mat, size);
- valid=1;
- }
- else
- Mat4One (mat);
- }
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *data;
- data = (bTrackToConstraint*)con->data;
+static bConstraintTypeInfo CTI_LOCLIMIT = {
+ CONSTRAINT_TYPE_LOCLIMIT, /* type */
+ sizeof(bLocLimitConstraint), /* size */
+ "Limit Location", /* name */
+ "bLocLimitConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ NULL, /* new data */
+ NULL, /* get constraint targets */
+ NULL, /* flush constraint targets */
+ NULL, /* get target matrix */
+ loclimit_evaluate /* evaluate */
+};
+
+/* -------- Limit Rotation --------- */
+
+static void rotlimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bRotLimitConstraint *data = con->data;
+ float loc[3];
+ float eul[3];
+ float size[3];
+
+ VECCOPY(loc, cob->matrix[3]);
+ Mat4ToSize(cob->matrix, size);
+
+ Mat4ToEul(cob->matrix, eul);
+
+ /* eulers: radians to degrees! */
+ eul[0] = (eul[0] / M_PI * 180);
+ eul[1] = (eul[1] / M_PI * 180);
+ eul[2] = (eul[2] / M_PI * 180);
+
+ /* limiting of euler values... */
+ if (data->flag & LIMIT_XROT) {
+ if (eul[0] < data->xmin)
+ eul[0] = data->xmin;
+
+ if (eul[0] > data->xmax)
+ eul[0] = data->xmax;
+ }
+ if (data->flag & LIMIT_YROT) {
+ if (eul[1] < data->ymin)
+ eul[1] = data->ymin;
+
+ if (eul[1] > data->ymax)
+ eul[1] = data->ymax;
+ }
+ if (data->flag & LIMIT_ZROT) {
+ if (eul[2] < data->zmin)
+ eul[2] = data->zmin;
+
+ if (eul[2] > data->zmax)
+ eul[2] = data->zmax;
+ }
+
+ /* eulers: degrees to radians ! */
+ eul[0] = (eul[0] / 180 * M_PI);
+ eul[1] = (eul[1] / 180 * M_PI);
+ eul[2] = (eul[2] / 180 * M_PI);
+
+ LocEulSizeToMat4(cob->matrix, loc, eul, size);
+}
- if (data->tar){
- constraint_target_to_mat4(data->tar, data->subtarget, mat, size);
- valid=1;
- }
- else
- Mat4One (mat);
- }
- break;
- case CONSTRAINT_TYPE_KINEMATIC:
- {
- bKinematicConstraint *data;
- data = (bKinematicConstraint*)con->data;
+static bConstraintTypeInfo CTI_ROTLIMIT = {
+ CONSTRAINT_TYPE_ROTLIMIT, /* type */
+ sizeof(bRotLimitConstraint), /* size */
+ "Limit Rotation", /* name */
+ "bRotLimitConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ NULL, /* new data */
+ NULL, /* get constraint targets */
+ NULL, /* flush constraint targets */
+ NULL, /* get target matrix */
+ rotlimit_evaluate /* evaluate */
+};
+
+/* --------- Limit Scaling --------- */
+
+
+static void sizelimit_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bSizeLimitConstraint *data = con->data;
+ float obsize[3], size[3];
+
+ Mat4ToSize(cob->matrix, size);
+ Mat4ToSize(cob->matrix, obsize);
+
+ if (data->flag & LIMIT_XMIN) {
+ if (size[0] < data->xmin)
+ size[0] = data->xmin;
+ }
+ if (data->flag & LIMIT_XMAX) {
+ if (size[0] > data->xmax)
+ size[0] = data->xmax;
+ }
+ if (data->flag & LIMIT_YMIN) {
+ if (size[1] < data->ymin)
+ size[1] = data->ymin;
+ }
+ if (data->flag & LIMIT_YMAX) {
+ if (size[1] > data->ymax)
+ size[1] = data->ymax;
+ }
+ if (data->flag & LIMIT_ZMIN) {
+ if (size[2] < data->zmin)
+ size[2] = data->zmin;
+ }
+ if (data->flag & LIMIT_ZMAX) {
+ if (size[2] > data->zmax)
+ size[2] = data->zmax;
+ }
+
+ if (obsize[0])
+ VecMulf(cob->matrix[0], size[0]/obsize[0]);
+ if (obsize[1])
+ VecMulf(cob->matrix[1], size[1]/obsize[1]);
+ if (obsize[2])
+ VecMulf(cob->matrix[2], size[2]/obsize[2]);
+}
- if (data->tar){
- constraint_target_to_mat4(data->tar, data->subtarget, mat, size);
- valid=1;
- }
- else if (data->flag & CONSTRAINT_IK_AUTO) {
- Object *ob= ownerdata;
-
- if(ob==NULL)
- Mat4One(mat);
- else {
- float vec[3];
- /* move grabtarget into world space */
- VECCOPY(vec, data->grabtarget);
- Mat4MulVecfl(ob->obmat, vec);
- Mat4CpyMat4(mat, ob->obmat);
- VECCOPY(mat[3], vec);
- }
- }
- else
- Mat4One (mat);
- }
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- {
- bLockTrackConstraint *data;
- data = (bLockTrackConstraint*)con->data;
+static bConstraintTypeInfo CTI_SIZELIMIT = {
+ CONSTRAINT_TYPE_SIZELIMIT, /* type */
+ sizeof(bSizeLimitConstraint), /* size */
+ "Limit Scaling", /* name */
+ "bSizeLimitConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ NULL, /* new data */
+ NULL, /* get constraint targets */
+ NULL, /* flush constraint targets */
+ NULL, /* get target matrix */
+ sizelimit_evaluate /* evaluate */
+};
+
+/* ----------- Copy Location ------------- */
+
+static void loclike_new_data (void *cdata)
+{
+ bLocateLikeConstraint *data= (bLocateLikeConstraint *)cdata;
+
+ data->flag = LOCLIKE_X|LOCLIKE_Y|LOCLIKE_Z;
+}
- if (data->tar){
- constraint_target_to_mat4(data->tar, data->subtarget, mat, size);
- valid=1;
- }
- else
- Mat4One (mat);
- }
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data;
- data = (bFollowPathConstraint*)con->data;
+static void loclike_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bLocateLikeConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
+}
- if (data->tar){
- Curve *cu;
- float q[4], vec[4], dir[3], *quat, x1, totmat[4][4];
- float curvetime;
+static void loclike_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bLocateLikeConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
- Mat4One (totmat);
- Mat4One (mat);
+static void loclike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bLocateLikeConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ if (VALID_CONS_TARGET(ct)) {
+ float offset[3] = {0.0f, 0.0f, 0.0f};
+
+ if (data->flag & LOCLIKE_OFFSET)
+ VECCOPY(offset, cob->matrix[3]);
+
+ if (data->flag & LOCLIKE_X) {
+ cob->matrix[3][0] = ct->matrix[3][0];
+
+ if (data->flag & LOCLIKE_X_INVERT) cob->matrix[3][0] *= -1;
+ cob->matrix[3][0] += offset[0];
+ }
+ if (data->flag & LOCLIKE_Y) {
+ cob->matrix[3][1] = ct->matrix[3][1];
+
+ if (data->flag & LOCLIKE_Y_INVERT) cob->matrix[3][1] *= -1;
+ cob->matrix[3][1] += offset[1];
+ }
+ if (data->flag & LOCLIKE_Z) {
+ cob->matrix[3][2] = ct->matrix[3][2];
+
+ if (data->flag & LOCLIKE_Z_INVERT) cob->matrix[3][2] *= -1;
+ cob->matrix[3][2] += offset[2];
+ }
+ }
+}
- cu= data->tar->data;
+static bConstraintTypeInfo CTI_LOCLIKE = {
+ CONSTRAINT_TYPE_LOCLIKE, /* type */
+ sizeof(bLocateLikeConstraint), /* size */
+ "Copy Location", /* name */
+ "bLocateLikeConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ loclike_new_data, /* new data */
+ loclike_get_tars, /* get constraint targets */
+ loclike_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get target matrix */
+ loclike_evaluate /* evaluate */
+};
+
+/* ----------- Copy Rotation ------------- */
+
+static void rotlike_new_data (void *cdata)
+{
+ bRotateLikeConstraint *data= (bRotateLikeConstraint *)cdata;
+
+ data->flag = ROTLIKE_X|ROTLIKE_Y|ROTLIKE_Z;
+}
- /* note; when creating constraints that follow path, the curve gets the CU_PATH set now,
- currently for paths to work it needs to go through the bevlist/displist system (ton) */
-
- if(cu->path==NULL || cu->path->data==NULL) /* only happens on reload file, but violates depsgraph still... fix! */
- makeDispListCurveTypes(data->tar, 0);
- if(cu->path && cu->path->data) {
-
- curvetime= bsystem_time(data->tar, data->tar->parent, (float)ctime, 0.0) - data->offset;
+static void rotlike_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bRotateLikeConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
+}
- if(calc_ipo_spec(cu->ipo, CU_SPEED, &curvetime)==0) {
- curvetime /= cu->pathlen;
- CLAMP(curvetime, 0.0, 1.0);
- }
+static void rotlike_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bRotateLikeConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
- if(where_on_path(data->tar, curvetime, vec, dir) ) {
+static void rotlike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bRotateLikeConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ if (VALID_CONS_TARGET(ct)) {
+ float loc[3];
+ float eul[3], obeul[3];
+ float size[3];
+
+ VECCOPY(loc, cob->matrix[3]);
+ Mat4ToSize(cob->matrix, size);
+
+ Mat4ToEul(ct->matrix, eul);
+ Mat4ToEul(cob->matrix, obeul);
+
+ if ((data->flag & ROTLIKE_X)==0)
+ eul[0] = obeul[0];
+ else {
+ if (data->flag & ROTLIKE_OFFSET)
+ euler_rot(eul, obeul[0], 'x');
+
+ if (data->flag & ROTLIKE_X_INVERT)
+ eul[0] *= -1;
+ }
+
+ if ((data->flag & ROTLIKE_Y)==0)
+ eul[1] = obeul[1];
+ else {
+ if (data->flag & ROTLIKE_OFFSET)
+ euler_rot(eul, obeul[1], 'y');
+
+ if (data->flag & ROTLIKE_Y_INVERT)
+ eul[1] *= -1;
+ }
+
+ if ((data->flag & ROTLIKE_Z)==0)
+ eul[2] = obeul[2];
+ else {
+ if (data->flag & ROTLIKE_OFFSET)
+ euler_rot(eul, obeul[2], 'z');
+
+ if (data->flag & ROTLIKE_Z_INVERT)
+ eul[2] *= -1;
+ }
+
+ compatible_eul(eul, obeul);
+ LocEulSizeToMat4(cob->matrix, loc, eul, size);
+ }
+}
- if(data->followflag){
- quat= vectoquat(dir, (short) data->trackflag, (short) data->upflag);
+static bConstraintTypeInfo CTI_ROTLIKE = {
+ CONSTRAINT_TYPE_ROTLIKE, /* type */
+ sizeof(bRotateLikeConstraint), /* size */
+ "Copy Rotation", /* name */
+ "bRotateLikeConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ rotlike_new_data, /* new data */
+ rotlike_get_tars, /* get constraint targets */
+ rotlike_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get target matrix */
+ rotlike_evaluate /* evaluate */
+};
+
+/* ---------- Copy Scaling ---------- */
+
+static void sizelike_new_data (void *cdata)
+{
+ bSizeLikeConstraint *data= (bSizeLikeConstraint *)cdata;
+
+ data->flag = SIZELIKE_X|SIZELIKE_Y|SIZELIKE_Z;
+}
- Normalize(dir);
- q[0]= (float)cos(0.5*vec[3]);
- x1= (float)sin(0.5*vec[3]);
- q[1]= -x1*dir[0];
- q[2]= -x1*dir[1];
- q[3]= -x1*dir[2];
- QuatMul(quat, q, quat);
-
+static void sizelike_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bSizeLikeConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
+}
- QuatToMat4(quat, totmat);
- }
- VECCOPY(totmat[3], vec);
+static void sizelike_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bSizeLikeConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
- Mat4MulSerie(mat, data->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
- }
- }
- valid=1;
+static void sizelike_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bSizeLikeConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ if (VALID_CONS_TARGET(ct)) {
+ float obsize[3], size[3];
+
+ Mat4ToSize(ct->matrix, size);
+ Mat4ToSize(cob->matrix, obsize);
+
+ if ((data->flag & SIZELIKE_X) && (obsize[0] != 0)) {
+ if (data->flag & SIZELIKE_OFFSET) {
+ size[0] += (obsize[0] - 1.0f);
+ VecMulf(cob->matrix[0], size[0] / obsize[0]);
}
else
- Mat4One (mat);
+ VecMulf(cob->matrix[0], size[0] / obsize[0]);
}
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data;
- data = (bStretchToConstraint*)con->data;
-
- if (data->tar){
- constraint_target_to_mat4(data->tar, data->subtarget, mat, size);
- valid = 1;
+ if ((data->flag & SIZELIKE_Y) && (obsize[1] != 0)) {
+ if (data->flag & SIZELIKE_OFFSET) {
+ size[1] += (obsize[1] - 1.0f);
+ VecMulf(cob->matrix[1], size[1] / obsize[1]);
}
else
- Mat4One (mat);
+ VecMulf(cob->matrix[1], size[1] / obsize[1]);
}
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data;
- data = (bClampToConstraint*)con->data;
-
- if (data->tar) {
- Curve *cu= data->tar->data;
-
- /* note; when creating constraints that follow path, the curve gets the CU_PATH set now,
- currently for paths to work it needs to go through the bevlist/displist system (ton) */
-
- if(cu->path==NULL || cu->path->data==NULL) /* only happens on reload file, but violates depsgraph still... fix! */
- makeDispListCurveTypes(data->tar, 0);
+ if ((data->flag & SIZELIKE_Z) && (obsize[2] != 0)) {
+ if (data->flag & SIZELIKE_OFFSET) {
+ size[2] += (obsize[2] - 1.0f);
+ VecMulf(cob->matrix[2], size[2] / obsize[2]);
}
-
- Mat4One (mat);
+ else
+ VecMulf(cob->matrix[2], size[2] / obsize[2]);
}
- break;
-
- default:
- Mat4One(mat);
- break;
}
+}
+
+static bConstraintTypeInfo CTI_SIZELIKE = {
+ CONSTRAINT_TYPE_SIZELIKE, /* type */
+ sizeof(bSizeLikeConstraint), /* size */
+ "Copy Scale", /* name */
+ "bSizeLikeConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ sizelike_new_data, /* new data */
+ sizelike_get_tars, /* get constraint targets */
+ sizelike_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get target matrix */
+ sizelike_evaluate /* evaluate */
+};
+
+/* ----------- Python Constraint -------------- */
+
+static void pycon_free (bConstraint *con)
+{
+ bPythonConstraint *data= con->data;
+
+ /* id-properties */
+ IDP_FreeProperty(data->prop);
+ MEM_freeN(data->prop);
+
+ /* multiple targets */
+ BLI_freelistN(&data->targets);
+}
- return valid;
+static void pycon_relink (bConstraint *con)
+{
+ bPythonConstraint *data= con->data;
+
+ ID_NEW(data->text);
}
-/* only called during solve_constraints */
-/* bone constraints create a fake object to work on, then ob is a workob */
-/* if ownerdata is set, it's the posechannel */
-void evaluate_constraint (bConstraint *constraint, Object *ob, short ownertype, void *ownerdata, float targetmat[][4])
+static void pycon_copy (bConstraint *con, bConstraint *srccon)
{
- float M_oldmat[4][4];
- float M_identity[4][4];
+ bPythonConstraint *pycon = (bPythonConstraint *)con->data;
+ bPythonConstraint *opycon = (bPythonConstraint *)srccon->data;
- if (!constraint || !ob)
- return;
+ pycon->prop = IDP_CopyProperty(opycon->prop);
+ duplicatelist(&pycon->targets, &opycon->targets);
+}
- Mat4One (M_identity);
+static void pycon_new_data (void *cdata)
+{
+ bPythonConstraint *data= (bPythonConstraint *)cdata;
- switch (constraint->type) {
- case CONSTRAINT_TYPE_NULL:
- case CONSTRAINT_TYPE_KINEMATIC: /* removed */
- break;
+ /* everything should be set correctly by calloc, except for the prop->type constant.*/
+ data->prop = MEM_callocN(sizeof(IDProperty), "PyConstraintProps");
+ data->prop->type = IDP_GROUP;
+}
+
+static void pycon_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bPythonConstraint *data= con->data;
+
+ list->first = data->targets.first;
+ list->last = data->targets.last;
+ }
+}
+
+/* Whether this approach is maintained remains to be seen (aligorith) */
+static void pycon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+{
+ bPythonConstraint *data= con->data;
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *data;
- float temp[4][4];
+ if (VALID_CONS_TARGET(ct)) {
+ /* special exception for curves - depsgraph issues */
+ if (ct->tar->type == OB_CURVE) {
+ Curve *cu= ct->tar->data;
- data = constraint->data;
- Mat4CpyMat4 (temp, ob->obmat);
-
- Mat4MulMat4(ob->obmat, targetmat, temp);
+ /* this check is to make sure curve objects get updated on file load correctly.*/
+ if (cu->path==NULL || cu->path->data==NULL) /* only happens on reload file, but violates depsgraph still... fix! */
+ makeDispListCurveTypes(ct->tar, 0);
}
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data;
- float offset[3] = {0.0f, 0.0f, 0.0f};
+
+ /* firstly calculate the matrix the normal way, then let the py-function override
+ * this matrix if it needs to do so
+ */
+ constraint_target_to_mat4(ct->tar, ct->subtarget, ct->matrix, CONSTRAINT_SPACE_WORLD, ct->space, con->headtail);
+ BPY_pyconstraint_target(data, ct);
+ }
+ else if (ct)
+ Mat4One(ct->matrix);
+}
- data = constraint->data;
-
- if (data->flag & LOCLIKE_OFFSET)
- VECCOPY(offset, ob->obmat[3]);
-
- if (data->flag & LOCLIKE_X) {
- ob->obmat[3][0] = targetmat[3][0];
-
- if(data->flag & LOCLIKE_X_INVERT) ob->obmat[3][0] *= -1;
- ob->obmat[3][0] += offset[0];
- }
- if (data->flag & LOCLIKE_Y) {
- ob->obmat[3][1] = targetmat[3][1];
-
- if(data->flag & LOCLIKE_Y_INVERT) ob->obmat[3][1] *= -1;
- ob->obmat[3][1] += offset[1];
- }
- if (data->flag & LOCLIKE_Z) {
- ob->obmat[3][2] = targetmat[3][2];
-
- if(data->flag & LOCLIKE_Z_INVERT) ob->obmat[3][2] *= -1;
- ob->obmat[3][2] += offset[2];
- }
+static void pycon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bPythonConstraint *data= con->data;
+
+/* currently removed, until I this can be re-implemented for multiple targets */
+#if 0
+ /* Firstly, run the 'driver' function which has direct access to the objects involved
+ * Technically, this is potentially dangerous as users may abuse this and cause dependency-problems,
+ * but it also allows certain 'clever' rigging hacks to work.
+ */
+ BPY_pyconstraint_driver(data, cob, targets);
+#endif
+
+ /* Now, run the actual 'constraint' function, which should only access the matrices */
+ BPY_pyconstraint_eval(data, cob, targets);
+}
+
+static bConstraintTypeInfo CTI_PYTHON = {
+ CONSTRAINT_TYPE_PYTHON, /* type */
+ sizeof(bPythonConstraint), /* size */
+ "Script", /* name */
+ "bPythonConstraint", /* struct name */
+ pycon_free, /* free data */
+ pycon_relink, /* relink data */
+ pycon_copy, /* copy data */
+ pycon_new_data, /* new data */
+ pycon_get_tars, /* get constraint targets */
+ NULL, /* flush constraint targets */
+ pycon_get_tarmat, /* get target matrix */
+ pycon_evaluate /* evaluate */
+};
+
+/* -------- Action Constraint ----------- */
+
+static void actcon_relink (bConstraint *con)
+{
+ bActionConstraint *data= con->data;
+ ID_NEW(data->act);
+}
+
+static void actcon_new_data (void *cdata)
+{
+ bActionConstraint *data= (bActionConstraint *)cdata;
+
+ /* set type to 20 (Loc X), as 0 is Rot X for backwards compatability */
+ data->type = 20;
+}
+
+static void actcon_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bActionConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
+}
+
+static void actcon_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bActionConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
+
+static void actcon_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+{
+ extern void chan_calc_mat(bPoseChannel *chan);
+ bActionConstraint *data = con->data;
+
+ if (VALID_CONS_TARGET(ct)) {
+ float tempmat[4][4], vec[3];
+ float s, t;
+ short axis;
+
+ /* initialise return matrix */
+ Mat4One(ct->matrix);
+
+ /* get the transform matrix of the target */
+ constraint_target_to_mat4(ct->tar, ct->subtarget, tempmat, CONSTRAINT_SPACE_WORLD, ct->space, con->headtail);
+
+ /* determine where in transform range target is */
+ /* data->type is mapped as follows for backwards compatability:
+ * 00,01,02 - rotation (it used to be like this)
+ * 10,11,12 - scaling
+ * 20,21,22 - location
+ */
+ if (data->type < 10) {
+ /* extract rotation (is in whatever space target should be in) */
+ Mat4ToEul(tempmat, vec);
+ vec[0] *= (float)(180.0/M_PI);
+ vec[1] *= (float)(180.0/M_PI);
+ vec[2] *= (float)(180.0/M_PI);
+ axis= data->type;
+ }
+ else if (data->type < 20) {
+ /* extract scaling (is in whatever space target should be in) */
+ Mat4ToSize(tempmat, vec);
+ axis= data->type - 10;
+ }
+ else {
+ /* extract location */
+ VECCOPY(vec, tempmat[3]);
+ axis= data->type - 20;
}
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data;
- float loc[3];
- float eul[3], obeul[3];
- float size[3];
+
+ /* Target defines the animation */
+ s = (vec[axis]-data->min) / (data->max-data->min);
+ CLAMP(s, 0, 1);
+ t = ( s * (data->end-data->start)) + data->start;
+
+ /* Get the appropriate information from the action */
+ if (cob->type == CONSTRAINT_OBTYPE_BONE) {
+ bPose *pose;
+ bPoseChannel *pchan, *tchan;
- data = constraint->data;
+ /* make a temporary pose and evaluate using that */
+ pose = MEM_callocN(sizeof(bPose), "pose");
- VECCOPY(loc, ob->obmat[3]);
- Mat4ToSize(ob->obmat, size);
+ pchan = cob->pchan;
+ tchan= verify_pose_channel(pose, pchan->name);
+ extract_pose_from_action(pose, data->act, t);
- Mat4ToEul(targetmat, eul);
- Mat4ToEul(ob->obmat, obeul);
-
- if(data->flag != (ROTLIKE_X|ROTLIKE_Y|ROTLIKE_Z)) {
- if(!(data->flag & ROTLIKE_X)) {
- eul[0]= obeul[0];
- }
- if(!(data->flag & ROTLIKE_Y)) {
- eul[1]= obeul[1];
- }
- if(!(data->flag & ROTLIKE_Z)) {
- eul[2]= obeul[2];
- }
- compatible_eul(eul, obeul);
- }
+ chan_calc_mat(tchan);
- if((data->flag & ROTLIKE_X) && (data->flag & ROTLIKE_X_INVERT))
- eul[0]*=-1;
- if((data->flag & ROTLIKE_Y) && (data->flag & ROTLIKE_Y_INVERT))
- eul[1]*=-1;
- if((data->flag & ROTLIKE_Z) && (data->flag & ROTLIKE_Z_INVERT))
- eul[2]*=-1;
+ Mat4CpyMat4(ct->matrix, tchan->chan_mat);
- LocEulSizeToMat4(ob->obmat, loc, eul, size);
+ /* Clean up */
+ free_pose_channels(pose);
+ MEM_freeN(pose);
}
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data;
- float obsize[3], size[3];
-
- data = constraint->data;
-
- Mat4ToSize(targetmat, size);
- Mat4ToSize(ob->obmat, obsize);
-
- if (data->flag & SIZELIKE_X && obsize[0] != 0)
- VecMulf(ob->obmat[0], size[0] / obsize[0]);
- if (data->flag & SIZELIKE_Y && obsize[1] != 0)
- VecMulf(ob->obmat[1], size[1] / obsize[1]);
- if (data->flag & SIZELIKE_Z && obsize[2] != 0)
- VecMulf(ob->obmat[2], size[2] / obsize[2]);
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *data;
- float val1, val2;
- int index;
- float obmat[4][4],imat[4][4],tarmat[4][4],tmat[4][4];
+ else if (cob->type == CONSTRAINT_OBTYPE_OBJECT) {
+ /* evaluate using workob */
+ what_does_obaction(cob->ob, data->act, t);
+ object_to_mat4(&workob, ct->matrix);
+ }
+ else {
+ /* behaviour undefined... */
+ puts("Error: unknown owner type for Action Constraint");
+ }
+ }
+}
- data = constraint->data;
-
- Mat4CpyMat4(obmat,ob->obmat);
- Mat4CpyMat4(tarmat,targetmat);
-
- if (data->flag&MINMAX_USEROT) {
- /* take rotation of target into account by doing the transaction in target's localspace */
- Mat4Invert(imat,tarmat);
- Mat4MulMat4(tmat,obmat,imat);
- Mat4CpyMat4(obmat,tmat);
- Mat4One(tarmat);
- }
+static void actcon_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bConstraintTarget *ct= targets->first;
+
+ if (VALID_CONS_TARGET(ct)) {
+ float temp[4][4];
+
+ /* Nice and simple... we just need to multiply the matrices, as the get_target_matrix
+ * function has already taken care of everything else.
+ */
+ Mat4CpyMat4(temp, cob->matrix);
+ Mat4MulMat4(cob->matrix, ct->matrix, temp);
+ }
+}
- switch (data->minmaxflag) {
- case TRACK_Z:
- val1 = tarmat[3][2];
- val2 = obmat[3][2]-data->offset;
- index = 2;
- break;
- case TRACK_Y:
- val1 = tarmat[3][1];
- val2 = obmat[3][1]-data->offset;
- index = 1;
- break;
- case TRACK_X:
- val1 = tarmat[3][0];
- val2 = obmat[3][0]-data->offset;
- index = 0;
- break;
- case TRACK_nZ:
- val2 = tarmat[3][2];
- val1 = obmat[3][2]-data->offset;
- index = 2;
- break;
- case TRACK_nY:
- val2 = tarmat[3][1];
- val1 = obmat[3][1]-data->offset;
- index = 1;
- break;
- case TRACK_nX:
- val2 = tarmat[3][0];
- val1 = obmat[3][0]-data->offset;
- index = 0;
- break;
- default:
- return;
- }
-
- if (val1 > val2) {
- obmat[3][index] = tarmat[3][index] + data->offset;
- if (data->flag & MINMAX_STICKY) {
- if (data->flag & MINMAX_STUCK) {
- VECCOPY(obmat[3], data->cache);
- }
- else {
- VECCOPY(data->cache, obmat[3]);
- data->flag|=MINMAX_STUCK;
- }
- }
- if (data->flag & MINMAX_USEROT) {
- /* get out of localspace */
- Mat4MulMat4(tmat,obmat,targetmat);
- Mat4CpyMat4(ob->obmat,tmat);
- }
- else {
- VECCOPY(ob->obmat[3],obmat[3]);
- }
- }
- else {
- data->flag&=~MINMAX_STUCK;
- }
-
- }
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *data;
- float size[3];
- float vec[3];
- float totmat[3][3];
- float tmat[4][4];
+static bConstraintTypeInfo CTI_ACTION = {
+ CONSTRAINT_TYPE_ACTION, /* type */
+ sizeof(bActionConstraint), /* size */
+ "Action", /* name */
+ "bActionConstraint", /* struct name */
+ NULL, /* free data */
+ actcon_relink, /* relink data */
+ NULL, /* copy data */
+ actcon_new_data, /* new data */
+ actcon_get_tars, /* get constraint targets */
+ actcon_flush_tars, /* flush constraint targets */
+ actcon_get_tarmat, /* get target matrix */
+ actcon_evaluate /* evaluate */
+};
+
+/* --------- Locked Track ---------- */
+
+static void locktrack_new_data (void *cdata)
+{
+ bLockTrackConstraint *data= (bLockTrackConstraint *)cdata;
+
+ data->trackflag = TRACK_Y;
+ data->lockflag = LOCK_Z;
+}
- data=(bTrackToConstraint*)constraint->data;
-
- if (data->tar) {
- /* Get size property, since ob->size is only the object's own relative size, not its global one */
- Mat4ToSize (ob->obmat, size);
-
- Mat4CpyMat4 (M_oldmat, ob->obmat);
-
- // Clear the object's rotation
- ob->obmat[0][0]=size[0];
- ob->obmat[0][1]=0;
- ob->obmat[0][2]=0;
- ob->obmat[1][0]=0;
- ob->obmat[1][1]=size[1];
- ob->obmat[1][2]=0;
- ob->obmat[2][0]=0;
- ob->obmat[2][1]=0;
- ob->obmat[2][2]=size[2];
+static void locktrack_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bLockTrackConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
+}
+
+static void locktrack_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bLockTrackConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
+
+static void locktrack_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bLockTrackConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
-
- VecSubf(vec, ob->obmat[3], targetmat[3]);
- vectomat(vec, targetmat[2],
- (short)data->reserved1, (short)data->reserved2,
- data->flags, totmat);
-
- Mat4CpyMat4(tmat, ob->obmat);
-
- Mat4MulMat34(ob->obmat, totmat, tmat);
- }
- }
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
+ if (VALID_CONS_TARGET(ct)) {
+ float vec[3],vec2[3];
+ float totmat[3][3];
+ float tmpmat[3][3];
+ float invmat[3][3];
+ float tmat[4][4];
+ float mdet;
+
+ /* Vector object -> target */
+ VecSubf(vec, ct->matrix[3], cob->matrix[3]);
+ switch (data->lockflag){
+ case LOCK_X: /* LOCK X */
{
- bLockTrackConstraint *data;
- float vec[3],vec2[3];
- float totmat[3][3];
- float tmpmat[3][3];
- float invmat[3][3];
- float tmat[4][4];
- float mdet;
-
- data=(bLockTrackConstraint*)constraint->data;
-
- if (data->tar) {
- Mat4CpyMat4 (M_oldmat, ob->obmat);
-
- /* Vector object -> target */
- VecSubf(vec, targetmat[3], ob->obmat[3]);
- switch (data->lockflag){
- case LOCK_X: /* LOCK X */
- {
- switch (data->trackflag){
- case TRACK_Y: /* LOCK X TRACK Y */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[0]);
- VecSubf(totmat[1], vec, vec2);
- Normalize(totmat[1]);
-
- /* the x axis is fixed*/
- totmat[0][0] = ob->obmat[0][0];
- totmat[0][1] = ob->obmat[0][1];
- totmat[0][2] = ob->obmat[0][2];
- Normalize(totmat[0]);
-
- /* the z axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[2], totmat[0], totmat[1]);
- }
- break;
- case TRACK_Z: /* LOCK X TRACK Z */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[0]);
- VecSubf(totmat[2], vec, vec2);
- Normalize(totmat[2]);
-
- /* the x axis is fixed*/
- totmat[0][0] = ob->obmat[0][0];
- totmat[0][1] = ob->obmat[0][1];
- totmat[0][2] = ob->obmat[0][2];
- Normalize(totmat[0]);
-
- /* the z axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[1], totmat[2], totmat[0]);
- }
- break;
- case TRACK_nY: /* LOCK X TRACK -Y */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[0]);
- VecSubf(totmat[1], vec, vec2);
- Normalize(totmat[1]);
- VecMulf(totmat[1],-1);
-
- /* the x axis is fixed*/
- totmat[0][0] = ob->obmat[0][0];
- totmat[0][1] = ob->obmat[0][1];
- totmat[0][2] = ob->obmat[0][2];
- Normalize(totmat[0]);
-
- /* the z axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[2], totmat[0], totmat[1]);
- }
- break;
- case TRACK_nZ: /* LOCK X TRACK -Z */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[0]);
- VecSubf(totmat[2], vec, vec2);
- Normalize(totmat[2]);
- VecMulf(totmat[2],-1);
-
- /* the x axis is fixed*/
- totmat[0][0] = ob->obmat[0][0];
- totmat[0][1] = ob->obmat[0][1];
- totmat[0][2] = ob->obmat[0][2];
- Normalize(totmat[0]);
-
- /* the z axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[1], totmat[2], totmat[0]);
- }
- break;
- default:
- {
- totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
- totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
- totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
- }
- break;
- }
- }
+ switch (data->trackflag) {
+ case TRACK_Y: /* LOCK X TRACK Y */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[0]);
+ VecSubf(totmat[1], vec, vec2);
+ Normalize(totmat[1]);
+
+ /* the x axis is fixed */
+ totmat[0][0] = cob->matrix[0][0];
+ totmat[0][1] = cob->matrix[0][1];
+ totmat[0][2] = cob->matrix[0][2];
+ Normalize(totmat[0]);
+
+ /* the z axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[2], totmat[0], totmat[1]);
+ }
break;
- case LOCK_Y: /* LOCK Y */
- {
- switch (data->trackflag){
- case TRACK_X: /* LOCK Y TRACK X */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[1]);
- VecSubf(totmat[0], vec, vec2);
- Normalize(totmat[0]);
-
- /* the y axis is fixed*/
- totmat[1][0] = ob->obmat[1][0];
- totmat[1][1] = ob->obmat[1][1];
- totmat[1][2] = ob->obmat[1][2];
- Normalize(totmat[1]);
-
- /* the z axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[2], totmat[0], totmat[1]);
- }
- break;
- case TRACK_Z: /* LOCK Y TRACK Z */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[1]);
- VecSubf(totmat[2], vec, vec2);
- Normalize(totmat[2]);
-
- /* the y axis is fixed*/
- totmat[1][0] = ob->obmat[1][0];
- totmat[1][1] = ob->obmat[1][1];
- totmat[1][2] = ob->obmat[1][2];
- Normalize(totmat[1]);
-
- /* the z axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[0], totmat[1], totmat[2]);
- }
- break;
- case TRACK_nX: /* LOCK Y TRACK -X */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[1]);
- VecSubf(totmat[0], vec, vec2);
- Normalize(totmat[0]);
- VecMulf(totmat[0],-1);
-
- /* the y axis is fixed*/
- totmat[1][0] = ob->obmat[1][0];
- totmat[1][1] = ob->obmat[1][1];
- totmat[1][2] = ob->obmat[1][2];
- Normalize(totmat[1]);
-
- /* the z axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[2], totmat[0], totmat[1]);
- }
- break;
- case TRACK_nZ: /* LOCK Y TRACK -Z */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[1]);
- VecSubf(totmat[2], vec, vec2);
- Normalize(totmat[2]);
- VecMulf(totmat[2],-1);
-
- /* the y axis is fixed*/
- totmat[1][0] = ob->obmat[1][0];
- totmat[1][1] = ob->obmat[1][1];
- totmat[1][2] = ob->obmat[1][2];
- Normalize(totmat[1]);
-
- /* the z axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[0], totmat[1], totmat[2]);
- }
- break;
- default:
- {
- totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
- totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
- totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
- }
- break;
- }
- }
+ case TRACK_Z: /* LOCK X TRACK Z */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[0]);
+ VecSubf(totmat[2], vec, vec2);
+ Normalize(totmat[2]);
+
+ /* the x axis is fixed */
+ totmat[0][0] = cob->matrix[0][0];
+ totmat[0][1] = cob->matrix[0][1];
+ totmat[0][2] = cob->matrix[0][2];
+ Normalize(totmat[0]);
+
+ /* the z axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[1], totmat[2], totmat[0]);
+ }
break;
- case LOCK_Z: /* LOCK Z */
- {
- switch (data->trackflag){
- case TRACK_X: /* LOCK Z TRACK X */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[2]);
- VecSubf(totmat[0], vec, vec2);
- Normalize(totmat[0]);
-
- /* the z axis is fixed*/
- totmat[2][0] = ob->obmat[2][0];
- totmat[2][1] = ob->obmat[2][1];
- totmat[2][2] = ob->obmat[2][2];
- Normalize(totmat[2]);
-
- /* the x axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[1], totmat[2], totmat[0]);
- }
- break;
- case TRACK_Y: /* LOCK Z TRACK Y */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[2]);
- VecSubf(totmat[1], vec, vec2);
- Normalize(totmat[1]);
-
- /* the z axis is fixed*/
- totmat[2][0] = ob->obmat[2][0];
- totmat[2][1] = ob->obmat[2][1];
- totmat[2][2] = ob->obmat[2][2];
- Normalize(totmat[2]);
-
- /* the x axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[0], totmat[1], totmat[2]);
- }
- break;
- case TRACK_nX: /* LOCK Z TRACK -X */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[2]);
- VecSubf(totmat[0], vec, vec2);
- Normalize(totmat[0]);
- VecMulf(totmat[0],-1);
-
- /* the z axis is fixed*/
- totmat[2][0] = ob->obmat[2][0];
- totmat[2][1] = ob->obmat[2][1];
- totmat[2][2] = ob->obmat[2][2];
- Normalize(totmat[2]);
+ case TRACK_nY: /* LOCK X TRACK -Y */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[0]);
+ VecSubf(totmat[1], vec, vec2);
+ Normalize(totmat[1]);
+ VecMulf(totmat[1],-1);
+
+ /* the x axis is fixed */
+ totmat[0][0] = cob->matrix[0][0];
+ totmat[0][1] = cob->matrix[0][1];
+ totmat[0][2] = cob->matrix[0][2];
+ Normalize(totmat[0]);
+
+ /* the z axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[2], totmat[0], totmat[1]);
+ }
+ break;
+ case TRACK_nZ: /* LOCK X TRACK -Z */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[0]);
+ VecSubf(totmat[2], vec, vec2);
+ Normalize(totmat[2]);
+ VecMulf(totmat[2],-1);
- /* the x axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[1], totmat[2], totmat[0]);
- }
- break;
- case TRACK_nY: /* LOCK Z TRACK -Y */
- {
- /* Projection of Vector on the plane */
- Projf(vec2, vec, ob->obmat[2]);
- VecSubf(totmat[1], vec, vec2);
- Normalize(totmat[1]);
- VecMulf(totmat[1],-1);
-
- /* the z axis is fixed*/
- totmat[2][0] = ob->obmat[2][0];
- totmat[2][1] = ob->obmat[2][1];
- totmat[2][2] = ob->obmat[2][2];
- Normalize(totmat[2]);
+ /* the x axis is fixed */
+ totmat[0][0] = cob->matrix[0][0];
+ totmat[0][1] = cob->matrix[0][1];
+ totmat[0][2] = cob->matrix[0][2];
+ Normalize(totmat[0]);
- /* the x axis gets mapped onto
- a third orthogonal vector */
- Crossf(totmat[0], totmat[1], totmat[2]);
- }
- break;
- default:
- {
- totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
- totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
- totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
- }
- break;
- }
- }
+ /* the z axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[1], totmat[2], totmat[0]);
+ }
break;
default:
- {
- totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
- totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
- totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
- }
- break;
- }
- /* Block to keep matrix heading */
- tmpmat[0][0] = ob->obmat[0][0];tmpmat[0][1] = ob->obmat[0][1];tmpmat[0][2] = ob->obmat[0][2];
- tmpmat[1][0] = ob->obmat[1][0];tmpmat[1][1] = ob->obmat[1][1];tmpmat[1][2] = ob->obmat[1][2];
- tmpmat[2][0] = ob->obmat[2][0];tmpmat[2][1] = ob->obmat[2][1];tmpmat[2][2] = ob->obmat[2][2];
- Normalize(tmpmat[0]);
- Normalize(tmpmat[1]);
- Normalize(tmpmat[2]);
- Mat3Inv(invmat,tmpmat);
- Mat3MulMat3(tmpmat,totmat,invmat);
- totmat[0][0] = tmpmat[0][0];totmat[0][1] = tmpmat[0][1];totmat[0][2] = tmpmat[0][2];
- totmat[1][0] = tmpmat[1][0];totmat[1][1] = tmpmat[1][1];totmat[1][2] = tmpmat[1][2];
- totmat[2][0] = tmpmat[2][0];totmat[2][1] = tmpmat[2][1];totmat[2][2] = tmpmat[2][2];
-
- Mat4CpyMat4(tmat, ob->obmat);
-
- mdet = Det3x3( totmat[0][0],totmat[0][1],totmat[0][2],
- totmat[1][0],totmat[1][1],totmat[1][2],
- totmat[2][0],totmat[2][1],totmat[2][2]);
- if (mdet==0)
{
totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
}
-
- /* apply out transformaton to the object */
- Mat4MulMat34(ob->obmat, totmat, tmat);
- }
- }
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- {
- bFollowPathConstraint *data;
- float obmat[4][4];
- float size[3], obsize[3];
-
- data=(bFollowPathConstraint*)constraint->data;
-
- if (data->tar) {
- /* get Object local transform (loc/rot/size) to determine transformation from path */
- object_to_mat4(ob, obmat);
-
- /* get scaling of object before applying constraint */
- Mat4ToSize(ob->obmat, size);
-
- /* apply targetmat - containing location on path, and rotation */
- Mat4MulSerie(ob->obmat, targetmat, obmat, NULL, NULL, NULL, NULL, NULL, NULL);
-
- /* un-apply scaling caused by path */
- Mat4ToSize(ob->obmat, obsize);
- if (obsize[0] != 0)
- VecMulf(ob->obmat[0], size[0] / obsize[0]);
- if (obsize[1] != 0)
- VecMulf(ob->obmat[1], size[1] / obsize[1]);
- if (obsize[2] != 0)
- VecMulf(ob->obmat[2], size[2] / obsize[2]);
+ break;
}
}
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data;
- float size[3],scale[3],vec[3],xx[3],zz[3],orth[3];
- float totmat[3][3];
- float tmat[4][4];
- float dist;
-
- data=(bStretchToConstraint*)constraint->data;
- Mat4ToSize (ob->obmat, size);
-
- if (data->tar) {
- /* store X orientation before destroying obmat */
- xx[0] = ob->obmat[0][0];
- xx[1] = ob->obmat[0][1];
- xx[2] = ob->obmat[0][2];
- Normalize(xx);
-
- /* store Z orientation before destroying obmat */
- zz[0] = ob->obmat[2][0];
- zz[1] = ob->obmat[2][1];
- zz[2] = ob->obmat[2][2];
- Normalize(zz);
-
- VecSubf(vec, ob->obmat[3], targetmat[3]);
- vec[0] /= size[0];
- vec[1] /= size[1];
- vec[2] /= size[2];
-
- dist = Normalize(vec);
- //dist = VecLenf( ob->obmat[3], targetmat[3]);
-
- if (data->orglength == 0) data->orglength = dist;
- if (data->bulge ==0) data->bulge = 1.0;
-
- scale[1] = dist/data->orglength;
- switch (data->volmode) {
- /* volume preserving scaling */
- case VOLUME_XZ :
- scale[0] = 1.0f - (float)sqrt(data->bulge) + (float)sqrt(data->bulge*(data->orglength/dist));
- scale[2] = scale[0];
- break;
- case VOLUME_X:
- scale[0] = 1.0f + data->bulge * (data->orglength /dist - 1);
- scale[2] = 1.0;
- break;
- case VOLUME_Z:
- scale[0] = 1.0;
- scale[2] = 1.0f + data->bulge * (data->orglength /dist - 1);
- break;
- /* don't care for volume */
- case NO_VOLUME:
- scale[0] = 1.0;
- scale[2] = 1.0;
- break;
- default: /* should not happen, but in case*/
- return;
- } /* switch (data->volmode) */
-
- /* Clear the object's rotation and scale */
- ob->obmat[0][0]=size[0]*scale[0];
- ob->obmat[0][1]=0;
- ob->obmat[0][2]=0;
- ob->obmat[1][0]=0;
- ob->obmat[1][1]=size[1]*scale[1];
- ob->obmat[1][2]=0;
- ob->obmat[2][0]=0;
- ob->obmat[2][1]=0;
- ob->obmat[2][2]=size[2]*scale[2];
-
- VecSubf(vec, ob->obmat[3], targetmat[3]);
- Normalize(vec);
- /* new Y aligns object target connection*/
- totmat[1][0] = -vec[0];
- totmat[1][1] = -vec[1];
- totmat[1][2] = -vec[2];
- switch (data->plane) {
- case PLANE_X:
- /* build new Z vector */
- /* othogonal to "new Y" "old X! plane */
- Crossf(orth, vec, xx);
- Normalize(orth);
-
- /* new Z*/
- totmat[2][0] = orth[0];
- totmat[2][1] = orth[1];
- totmat[2][2] = orth[2];
-
- /* we decided to keep X plane*/
- Crossf(xx,orth, vec);
- Normalize(xx);
- totmat[0][0] = xx[0];
- totmat[0][1] = xx[1];
- totmat[0][2] = xx[2];
- break;
- case PLANE_Z:
- /* build new X vector */
- /* othogonal to "new Y" "old Z! plane */
- Crossf(orth, vec, zz);
- Normalize(orth);
-
- /* new X */
- totmat[0][0] = -orth[0];
- totmat[0][1] = -orth[1];
- totmat[0][2] = -orth[2];
-
- /* we decided to keep Z */
- Crossf(zz,orth, vec);
- Normalize(zz);
- totmat[2][0] = zz[0];
- totmat[2][1] = zz[1];
- totmat[2][2] = zz[2];
- break;
- } /* switch (data->plane) */
-
- Mat4CpyMat4(tmat, ob->obmat);
-
- Mat4MulMat34(ob->obmat, totmat, tmat);
- }
- }
- break;
- case CONSTRAINT_TYPE_LOCLIMIT:
+ break;
+ case LOCK_Y: /* LOCK Y */
{
- bLocLimitConstraint *data;
-
- data = constraint->data;
-
- /* limit location relative to origin or parent */
- if ((data->flag2 & LIMIT_NOPARENT) && ob->parent) {
- /* limiting relative to parent */
- float parmat[4][4]; /* matrix of parent */
- float objLoc[3], parLoc[3]; /* location of object, and location of parent */
- float relLoc[3]; /* objLoc - parLoc*/
-
- /* get matrix of parent */
- Mat4CpyMat4(parmat, ob->parent->obmat);
-
- /* get locations as vectors */
- objLoc[0] = ob->obmat[3][0];
- objLoc[1] = ob->obmat[3][1];
- objLoc[2] = ob->obmat[3][2];
-
- parLoc[0] = parmat[3][0];
- parLoc[1] = parmat[3][1];
- parLoc[2] = parmat[3][2];
-
- /* get relative location of obj from parent */
- VecSubf(relLoc, objLoc, parLoc);
-
- /* limiting location */
- if (data->flag & LIMIT_XMIN) {
- if(relLoc[0] < data->xmin)
- ob->obmat[3][0] = (parLoc[0]+data->xmin);
- }
- if (data->flag & LIMIT_XMAX) {
- if (relLoc[0] > data->xmax)
- ob->obmat[3][0] = (parLoc[0]+data->xmax);
- }
- if (data->flag & LIMIT_YMIN) {
- if(relLoc[1] < data->ymin)
- ob->obmat[3][1] = (parLoc[1]+data->ymin);
- }
- if (data->flag & LIMIT_YMAX) {
- if (relLoc[1] > data->ymax)
- ob->obmat[3][1] = (parLoc[1]+data->ymax);
- }
- if (data->flag & LIMIT_ZMIN) {
- if(relLoc[2] < data->zmin)
- ob->obmat[3][2] = (parLoc[2]+data->zmin);
- }
- if (data->flag & LIMIT_ZMAX) {
- if (relLoc[2] > data->zmax)
- ob->obmat[3][2] = (parLoc[2]+data->zmax);
- }
- } else {
- /* limiting relative to origin */
- if (data->flag & LIMIT_XMIN) {
- if(ob->obmat[3][0] < data->xmin)
- ob->obmat[3][0] = data->xmin;
- }
- if (data->flag & LIMIT_XMAX) {
- if (ob->obmat[3][0] > data->xmax)
- ob->obmat[3][0] = data->xmax;
+ switch (data->trackflag) {
+ case TRACK_X: /* LOCK Y TRACK X */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[1]);
+ VecSubf(totmat[0], vec, vec2);
+ Normalize(totmat[0]);
+
+ /* the y axis is fixed */
+ totmat[1][0] = cob->matrix[1][0];
+ totmat[1][1] = cob->matrix[1][1];
+ totmat[1][2] = cob->matrix[1][2];
+ Normalize(totmat[1]);
+
+ /* the z axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[2], totmat[0], totmat[1]);
}
- if (data->flag & LIMIT_YMIN) {
- if(ob->obmat[3][1] < data->ymin)
- ob->obmat[3][1] = data->ymin;
+ break;
+ case TRACK_Z: /* LOCK Y TRACK Z */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[1]);
+ VecSubf(totmat[2], vec, vec2);
+ Normalize(totmat[2]);
+
+ /* the y axis is fixed */
+ totmat[1][0] = cob->matrix[1][0];
+ totmat[1][1] = cob->matrix[1][1];
+ totmat[1][2] = cob->matrix[1][2];
+ Normalize(totmat[1]);
+
+ /* the z axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[0], totmat[1], totmat[2]);
}
- if (data->flag & LIMIT_YMAX) {
- if (ob->obmat[3][1] > data->ymax)
- ob->obmat[3][1] = data->ymax;
+ break;
+ case TRACK_nX: /* LOCK Y TRACK -X */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[1]);
+ VecSubf(totmat[0], vec, vec2);
+ Normalize(totmat[0]);
+ VecMulf(totmat[0],-1);
+
+ /* the y axis is fixed */
+ totmat[1][0] = cob->matrix[1][0];
+ totmat[1][1] = cob->matrix[1][1];
+ totmat[1][2] = cob->matrix[1][2];
+ Normalize(totmat[1]);
+
+ /* the z axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[2], totmat[0], totmat[1]);
}
- if (data->flag & LIMIT_ZMIN) {
- if(ob->obmat[3][2] < data->zmin)
- ob->obmat[3][2] = data->zmin;
+ break;
+ case TRACK_nZ: /* LOCK Y TRACK -Z */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[1]);
+ VecSubf(totmat[2], vec, vec2);
+ Normalize(totmat[2]);
+ VecMulf(totmat[2],-1);
+
+ /* the y axis is fixed */
+ totmat[1][0] = cob->matrix[1][0];
+ totmat[1][1] = cob->matrix[1][1];
+ totmat[1][2] = cob->matrix[1][2];
+ Normalize(totmat[1]);
+
+ /* the z axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[0], totmat[1], totmat[2]);
}
- if (data->flag & LIMIT_ZMAX) {
- if (ob->obmat[3][2] > data->zmax)
- ob->obmat[3][2] = data->zmax;
+ break;
+ default:
+ {
+ totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
+ totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
+ totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
}
+ break;
}
}
- break;
- case CONSTRAINT_TYPE_ROTLIMIT:
+ break;
+ case LOCK_Z: /* LOCK Z */
{
- bRotLimitConstraint *data;
- float loc[3];
- float eul[3];
- float size[3];
-
- data = constraint->data;
-
- VECCOPY(loc, ob->obmat[3]);
- Mat4ToSize(ob->obmat, size);
-
- Mat4ToEul(ob->obmat, eul);
-
- /* eulers: radians to degrees! */
- eul[0] = (eul[0] / M_PI * 180);
- eul[1] = (eul[1] / M_PI * 180);
- eul[2] = (eul[2] / M_PI * 180);
-
- /* limiting of euler values... */
- if (data->flag & LIMIT_XROT) {
- if (eul[0] < data->xmin)
- eul[0] = data->xmin;
+ switch (data->trackflag) {
+ case TRACK_X: /* LOCK Z TRACK X */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[2]);
+ VecSubf(totmat[0], vec, vec2);
+ Normalize(totmat[0]);
- if (eul[0] > data->xmax)
- eul[0] = data->xmax;
- }
- if (data->flag & LIMIT_YROT) {
- if (eul[1] < data->ymin)
- eul[1] = data->ymin;
+ /* the z axis is fixed */
+ totmat[2][0] = cob->matrix[2][0];
+ totmat[2][1] = cob->matrix[2][1];
+ totmat[2][2] = cob->matrix[2][2];
+ Normalize(totmat[2]);
- if (eul[1] > data->ymax)
- eul[1] = data->ymax;
- }
- if (data->flag & LIMIT_ZROT) {
- if (eul[2] < data->zmin)
- eul[2] = data->zmin;
+ /* the x axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[1], totmat[2], totmat[0]);
+ }
+ break;
+ case TRACK_Y: /* LOCK Z TRACK Y */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[2]);
+ VecSubf(totmat[1], vec, vec2);
+ Normalize(totmat[1]);
- if (eul[2] > data->zmax)
- eul[2] = data->zmax;
- }
-
- /* eulers: degrees to radians ! */
- eul[0] = (eul[0] / 180 * M_PI);
- eul[1] = (eul[1] / 180 * M_PI);
- eul[2] = (eul[2] / 180 * M_PI);
-
- LocEulSizeToMat4(ob->obmat, loc, eul, size);
- }
- break;
- case CONSTRAINT_TYPE_SIZELIMIT:
- {
- bSizeLimitConstraint *data;
- float obsize[3], size[3];
- int clearNegScale=0;
-
- data = constraint->data;
-
- Mat4ToSize(ob->obmat, size);
- Mat4ToSize(ob->obmat, obsize);
-
- if (data->flag & LIMIT_XMIN) {
- if (ob->transflag & OB_NEG_SCALE) {
- size[0] *= -1;
+ /* the z axis is fixed */
+ totmat[2][0] = cob->matrix[2][0];
+ totmat[2][1] = cob->matrix[2][1];
+ totmat[2][2] = cob->matrix[2][2];
+ Normalize(totmat[2]);
+
+ /* the x axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[0], totmat[1], totmat[2]);
+ }
+ break;
+ case TRACK_nX: /* LOCK Z TRACK -X */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[2]);
+ VecSubf(totmat[0], vec, vec2);
+ Normalize(totmat[0]);
+ VecMulf(totmat[0],-1);
- if (size[0] < data->xmin) {
- size[0] = data->xmin;
- clearNegScale += 1;
- }
- } else {
- if (size[0] < data->xmin)
- size[0] = data->xmin;
- }
- }
- if (data->flag & LIMIT_XMAX) {
- if (size[0] > data->xmax)
- size[0] = data->xmax;
- }
- if (data->flag & LIMIT_YMIN) {
- if (ob->transflag & OB_NEG_SCALE) {
- size[1] *= -1;
+ /* the z axis is fixed */
+ totmat[2][0] = cob->matrix[2][0];
+ totmat[2][1] = cob->matrix[2][1];
+ totmat[2][2] = cob->matrix[2][2];
+ Normalize(totmat[2]);
- if (size[1] < data->ymin) {
- size[1] = data->ymin;
- clearNegScale += 1;
- }
- } else {
- if (size[1] < data->ymin)
- size[1] = data->ymin;
- }
- }
- if (data->flag & LIMIT_YMAX) {
- if (size[1] > data->ymax)
- size[1] = data->ymax;
- }
- if (data->flag & LIMIT_ZMIN) {
- if (ob->transflag & OB_NEG_SCALE) {
- size[2] *= -1;
+ /* the x axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[1], totmat[2], totmat[0]);
+ }
+ break;
+ case TRACK_nY: /* LOCK Z TRACK -Y */
+ {
+ /* Projection of Vector on the plane */
+ Projf(vec2, vec, cob->matrix[2]);
+ VecSubf(totmat[1], vec, vec2);
+ Normalize(totmat[1]);
+ VecMulf(totmat[1],-1);
- if (size[2] < data->zmin) {
- size[2] = data->zmin;
- clearNegScale += 1;
- }
- } else {
- if (size[2] < data->zmin)
- size[2] = data->zmin;
- }
- }
- if (data->flag & LIMIT_ZMAX) {
- if (size[2] > data->zmax)
- size[2] = data->zmax;
+ /* the z axis is fixed */
+ totmat[2][0] = cob->matrix[2][0];
+ totmat[2][1] = cob->matrix[2][1];
+ totmat[2][2] = cob->matrix[2][2];
+ Normalize(totmat[2]);
+
+ /* the x axis gets mapped onto a third orthogonal vector */
+ Crossf(totmat[0], totmat[1], totmat[2]);
+ }
+ break;
+ default:
+ {
+ totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
+ totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
+ totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
+ }
+ break;
}
-
- if (clearNegScale != 0) {
- ob->transflag &= ~OB_NEG_SCALE; /* is this how we remove that flag? */
+ }
+ break;
+ default:
+ {
+ totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
+ totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
+ totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
}
-
- VecMulf(ob->obmat[0], size[0]/obsize[0]);
- VecMulf(ob->obmat[1], size[1]/obsize[1]);
- VecMulf(ob->obmat[2], size[2]/obsize[2]);
+ break;
}
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- {
+ /* Block to keep matrix heading */
+ tmpmat[0][0] = cob->matrix[0][0];tmpmat[0][1] = cob->matrix[0][1];tmpmat[0][2] = cob->matrix[0][2];
+ tmpmat[1][0] = cob->matrix[1][0];tmpmat[1][1] = cob->matrix[1][1];tmpmat[1][2] = cob->matrix[1][2];
+ tmpmat[2][0] = cob->matrix[2][0];tmpmat[2][1] = cob->matrix[2][1];tmpmat[2][2] = cob->matrix[2][2];
+ Normalize(tmpmat[0]);
+ Normalize(tmpmat[1]);
+ Normalize(tmpmat[2]);
+ Mat3Inv(invmat, tmpmat);
+ Mat3MulMat3(tmpmat, totmat, invmat);
+ totmat[0][0] = tmpmat[0][0];totmat[0][1] = tmpmat[0][1];totmat[0][2] = tmpmat[0][2];
+ totmat[1][0] = tmpmat[1][0];totmat[1][1] = tmpmat[1][1];totmat[1][2] = tmpmat[1][2];
+ totmat[2][0] = tmpmat[2][0];totmat[2][1] = tmpmat[2][1];totmat[2][2] = tmpmat[2][2];
+
+ Mat4CpyMat4(tmat, cob->matrix);
+
+ mdet = Det3x3( totmat[0][0],totmat[0][1],totmat[0][2],
+ totmat[1][0],totmat[1][1],totmat[1][2],
+ totmat[2][0],totmat[2][1],totmat[2][2]);
+ if (mdet==0) {
+ totmat[0][0] = 1;totmat[0][1] = 0;totmat[0][2] = 0;
+ totmat[1][0] = 0;totmat[1][1] = 1;totmat[1][2] = 0;
+ totmat[2][0] = 0;totmat[2][1] = 0;totmat[2][2] = 1;
+ }
+
+ /* apply out transformaton to the object */
+ Mat4MulMat34(cob->matrix, totmat, tmat);
+ }
+}
+static bConstraintTypeInfo CTI_LOCKTRACK = {
+ CONSTRAINT_TYPE_LOCKTRACK, /* type */
+ sizeof(bLockTrackConstraint), /* size */
+ "Locked Track", /* name */
+ "bLockTrackConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ locktrack_new_data, /* new data */
+ locktrack_get_tars, /* get constraint targets */
+ locktrack_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get target matrix */
+ locktrack_evaluate /* evaluate */
+};
+
+/* ---------- Stretch To ------------ */
+
+static void stretchto_new_data (void *cdata)
+{
+ bStretchToConstraint *data= (bStretchToConstraint *)cdata;
+
+ data->volmode = 0;
+ data->plane = 0;
+ data->orglength = 0.0;
+ data->bulge = 1.0;
+}
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- bClampToConstraint *data;
- Curve *cu;
- float obmat[4][4], targetMatrix[4][4], ownLoc[3];
- float curveMin[3], curveMax[3];
+static void stretchto_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bStretchToConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
+}
+
+static void stretchto_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bStretchToConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
+
+static void stretchto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bStretchToConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ /* only evaluate if there is a target */
+ if (VALID_CONS_TARGET(ct)) {
+ float size[3], scale[3], vec[3], xx[3], zz[3], orth[3];
+ float totmat[3][3];
+ float tmat[4][4];
+ float dist;
+
+ /* store scaling before destroying obmat */
+ Mat4ToSize(cob->matrix, size);
+
+ /* store X orientation before destroying obmat */
+ xx[0] = cob->matrix[0][0];
+ xx[1] = cob->matrix[0][1];
+ xx[2] = cob->matrix[0][2];
+ Normalize(xx);
+
+ /* store Z orientation before destroying obmat */
+ zz[0] = cob->matrix[2][0];
+ zz[1] = cob->matrix[2][1];
+ zz[2] = cob->matrix[2][2];
+ Normalize(zz);
+
+ VecSubf(vec, cob->matrix[3], ct->matrix[3]);
+ vec[0] /= size[0];
+ vec[1] /= size[1];
+ vec[2] /= size[2];
+
+ dist = Normalize(vec);
+ //dist = VecLenf( ob->obmat[3], targetmat[3]);
+
+ /* data->orglength==0 occurs on first run, and after 'R' button is clicked */
+ if (data->orglength == 0)
+ data->orglength = dist;
+ if (data->bulge == 0)
+ data->bulge = 1.0;
+
+ scale[1] = dist/data->orglength;
+ switch (data->volmode) {
+ /* volume preserving scaling */
+ case VOLUME_XZ :
+ scale[0] = 1.0f - (float)sqrt(data->bulge) + (float)sqrt(data->bulge*(data->orglength/dist));
+ scale[2] = scale[0];
+ break;
+ case VOLUME_X:
+ scale[0] = 1.0f + data->bulge * (data->orglength /dist - 1);
+ scale[2] = 1.0;
+ break;
+ case VOLUME_Z:
+ scale[0] = 1.0;
+ scale[2] = 1.0f + data->bulge * (data->orglength /dist - 1);
+ break;
+ /* don't care for volume */
+ case NO_VOLUME:
+ scale[0] = 1.0;
+ scale[2] = 1.0;
+ break;
+ default: /* should not happen, but in case*/
+ return;
+ } /* switch (data->volmode) */
+
+ /* Clear the object's rotation and scale */
+ cob->matrix[0][0]=size[0]*scale[0];
+ cob->matrix[0][1]=0;
+ cob->matrix[0][2]=0;
+ cob->matrix[1][0]=0;
+ cob->matrix[1][1]=size[1]*scale[1];
+ cob->matrix[1][2]=0;
+ cob->matrix[2][0]=0;
+ cob->matrix[2][1]=0;
+ cob->matrix[2][2]=size[2]*scale[2];
+
+ VecSubf(vec, cob->matrix[3], ct->matrix[3]);
+ Normalize(vec);
+
+ /* new Y aligns object target connection*/
+ totmat[1][0] = -vec[0];
+ totmat[1][1] = -vec[1];
+ totmat[1][2] = -vec[2];
+ switch (data->plane) {
+ case PLANE_X:
+ /* build new Z vector */
+ /* othogonal to "new Y" "old X! plane */
+ Crossf(orth, vec, xx);
+ Normalize(orth);
- data = constraint->data;
+ /* new Z*/
+ totmat[2][0] = orth[0];
+ totmat[2][1] = orth[1];
+ totmat[2][2] = orth[2];
- /* prevent crash if user deletes curve */
- if ((data->tar == NULL) || (data->tar->type != OB_CURVE) )
- return;
- else
- cu= data->tar->data;
+ /* we decided to keep X plane*/
+ Crossf(xx, orth, vec);
+ Normalize(xx);
+ totmat[0][0] = xx[0];
+ totmat[0][1] = xx[1];
+ totmat[0][2] = xx[2];
+ break;
+ case PLANE_Z:
+ /* build new X vector */
+ /* othogonal to "new Y" "old Z! plane */
+ Crossf(orth, vec, zz);
+ Normalize(orth);
- Mat4CpyMat4(obmat, ob->obmat);
- Mat4One(targetMatrix);
- VECCOPY(ownLoc, obmat[3]);
+ /* new X */
+ totmat[0][0] = -orth[0];
+ totmat[0][1] = -orth[1];
+ totmat[0][2] = -orth[2];
- INIT_MINMAX(curveMin, curveMax)
- minmax_object(data->tar, curveMin, curveMax);
+ /* we decided to keep Z */
+ Crossf(zz, orth, vec);
+ Normalize(zz);
+ totmat[2][0] = zz[0];
+ totmat[2][1] = zz[1];
+ totmat[2][2] = zz[2];
+ break;
+ } /* switch (data->plane) */
+
+ Mat4CpyMat4(tmat, cob->matrix);
+ Mat4MulMat34(cob->matrix, totmat, tmat);
+ }
+}
+
+static bConstraintTypeInfo CTI_STRETCHTO = {
+ CONSTRAINT_TYPE_STRETCHTO, /* type */
+ sizeof(bStretchToConstraint), /* size */
+ "Stretch To", /* name */
+ "bStretchToConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ stretchto_new_data, /* new data */
+ stretchto_get_tars, /* get constraint targets */
+ stretchto_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get target matrix */
+ stretchto_evaluate /* evaluate */
+};
+
+/* ---------- Floor ------------ */
+
+static void minmax_new_data (void *cdata)
+{
+ bMinMaxConstraint *data= (bMinMaxConstraint *)cdata;
+
+ data->minmaxflag = TRACK_Z;
+ data->offset = 0.0f;
+ data->cache[0] = data->cache[1] = data->cache[2] = 0.0f;
+ data->flag = 0;
+}
+
+static void minmax_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bMinMaxConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
+}
+
+static void minmax_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bMinMaxConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
+
+static void minmax_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bMinMaxConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ /* only evaluate if there is a target */
+ if (VALID_CONS_TARGET(ct)) {
+ float obmat[4][4], imat[4][4], tarmat[4][4], tmat[4][4];
+ float val1, val2;
+ int index;
+
+ Mat4CpyMat4(obmat, cob->matrix);
+ Mat4CpyMat4(tarmat, ct->matrix);
+
+ if (data->flag & MINMAX_USEROT) {
+ /* take rotation of target into account by doing the transaction in target's localspace */
+ Mat4Invert(imat, tarmat);
+ Mat4MulMat4(tmat, obmat, imat);
+ Mat4CpyMat4(obmat, tmat);
+ Mat4One(tarmat);
+ }
+
+ switch (data->minmaxflag) {
+ case TRACK_Z:
+ val1 = tarmat[3][2];
+ val2 = obmat[3][2]-data->offset;
+ index = 2;
+ break;
+ case TRACK_Y:
+ val1 = tarmat[3][1];
+ val2 = obmat[3][1]-data->offset;
+ index = 1;
+ break;
+ case TRACK_X:
+ val1 = tarmat[3][0];
+ val2 = obmat[3][0]-data->offset;
+ index = 0;
+ break;
+ case TRACK_nZ:
+ val2 = tarmat[3][2];
+ val1 = obmat[3][2]-data->offset;
+ index = 2;
+ break;
+ case TRACK_nY:
+ val2 = tarmat[3][1];
+ val1 = obmat[3][1]-data->offset;
+ index = 1;
+ break;
+ case TRACK_nX:
+ val2 = tarmat[3][0];
+ val1 = obmat[3][0]-data->offset;
+ index = 0;
+ break;
+ default:
+ return;
+ }
+
+ if (val1 > val2) {
+ obmat[3][index] = tarmat[3][index] + data->offset;
+ if (data->flag & MINMAX_STICKY) {
+ if (data->flag & MINMAX_STUCK) {
+ VECCOPY(obmat[3], data->cache);
+ }
+ else {
+ VECCOPY(data->cache, obmat[3]);
+ data->flag |= MINMAX_STUCK;
+ }
+ }
+ if (data->flag & MINMAX_USEROT) {
+ /* get out of localspace */
+ Mat4MulMat4(tmat, obmat, ct->matrix);
+ Mat4CpyMat4(cob->matrix, tmat);
+ }
+ else {
+ VECCOPY(cob->matrix[3], obmat[3]);
+ }
+ }
+ else {
+ data->flag &= ~MINMAX_STUCK;
+ }
+ }
+}
+
+static bConstraintTypeInfo CTI_MINMAX = {
+ CONSTRAINT_TYPE_MINMAX, /* type */
+ sizeof(bMinMaxConstraint), /* size */
+ "Floor", /* name */
+ "bMinMaxConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ minmax_new_data, /* new data */
+ minmax_get_tars, /* get constraint targets */
+ minmax_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get target matrix */
+ minmax_evaluate /* evaluate */
+};
+
+/* ------- RigidBody Joint ---------- */
+
+static void rbj_new_data (void *cdata)
+{
+ bRigidBodyJointConstraint *data= (bRigidBodyJointConstraint *)cdata;
+
+ // removed code which set target of this constraint
+ data->type=1;
+}
+
+static void rbj_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bRigidBodyJointConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints without subtargets */
+ SINGLETARGETNS_GET_TARS(con, data->tar, ct, list)
+ }
+}
+
+static void rbj_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bRigidBodyJointConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGETNS_FLUSH_TARS(con, data->tar, ct, list, nocopy)
+ }
+}
+
+static bConstraintTypeInfo CTI_RIGIDBODYJOINT = {
+ CONSTRAINT_TYPE_RIGIDBODYJOINT, /* type */
+ sizeof(bRigidBodyJointConstraint), /* size */
+ "RigidBody Joint", /* name */
+ "bRigidBodyJointConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ rbj_new_data, /* new data */
+ rbj_get_tars, /* get constraint targets */
+ rbj_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get target matrix */
+ NULL /* evaluate - this is not solved here... is just an interface for game-engine */
+};
+
+/* -------- Clamp To ---------- */
+
+static void clampto_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bClampToConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints without subtargets */
+ SINGLETARGETNS_GET_TARS(con, data->tar, ct, list)
+ }
+}
+
+static void clampto_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bClampToConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGETNS_FLUSH_TARS(con, data->tar, ct, list, nocopy)
+ }
+}
+
+static void clampto_get_tarmat (bConstraint *con, bConstraintOb *cob, bConstraintTarget *ct, float ctime)
+{
+ if (VALID_CONS_TARGET(ct)) {
+ Curve *cu= ct->tar->data;
+
+ /* note: when creating constraints that follow path, the curve gets the CU_PATH set now,
+ * currently for paths to work it needs to go through the bevlist/displist system (ton)
+ */
+
+ /* only happens on reload file, but violates depsgraph still... fix! */
+ if (cu->path==NULL || cu->path->data==NULL)
+ makeDispListCurveTypes(ct->tar, 0);
+ }
+
+ /* technically, this isn't really needed for evaluation, but we don't know what else
+ * might end up calling this...
+ */
+ if (ct)
+ Mat4One(ct->matrix);
+}
+
+static void clampto_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bClampToConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ /* only evaluate if there is a target and it is a curve */
+ if (VALID_CONS_TARGET(ct) && (ct->tar->type == OB_CURVE)) {
+ Curve *cu= data->tar->data;
+ float obmat[4][4], targetMatrix[4][4], ownLoc[3];
+ float curveMin[3], curveMax[3];
+
+ Mat4CpyMat4(obmat, cob->matrix);
+ Mat4One(targetMatrix);
+ VECCOPY(ownLoc, obmat[3]);
+
+ INIT_MINMAX(curveMin, curveMax)
+ minmax_object(ct->tar, curveMin, curveMax);
+
+ /* get targetmatrix */
+ if (cu->path && cu->path->data) {
+ float vec[4], dir[3], totmat[4][4];
+ float curvetime;
+ short clamp_axis;
- /* get targetmatrix */
- if(cu->path && cu->path->data) {
- float vec[4], dir[3], totmat[4][4];
- float curvetime;
- short clamp_axis;
+ /* find best position on curve */
+ /* 1. determine which axis to sample on? */
+ if (data->flag == CLAMPTO_AUTO) {
+ float size[3];
+ VecSubf(size, curveMax, curveMin);
+
+ /* find axis along which the bounding box has the greatest
+ * extent. Otherwise, default to the x-axis, as that is quite
+ * frequently used.
+ */
+ if ((size[2]>size[0]) && (size[2]>size[1]))
+ clamp_axis= CLAMPTO_Z - 1;
+ else if ((size[1]>size[0]) && (size[1]>size[2]))
+ clamp_axis= CLAMPTO_Y - 1;
+ else
+ clamp_axis = CLAMPTO_X - 1;
+ }
+ else
+ clamp_axis= data->flag - 1;
+
+ /* 2. determine position relative to curve on a 0-1 scale based on bounding box */
+ if (data->flag2 & CLAMPTO_CYCLIC) {
+ /* cyclic, so offset within relative bounding box is used */
+ float len= (curveMax[clamp_axis] - curveMin[clamp_axis]);
+ float offset;
- /* find best position on curve */
- /* 1. determine which axis to sample on? */
- if (data->flag==CLAMPTO_AUTO) {
- float size[3];
- VecSubf(size, curveMax, curveMin);
+ /* find bounding-box range where target is located */
+ if (ownLoc[clamp_axis] < curveMin[clamp_axis]) {
+ /* bounding-box range is before */
+ offset= curveMin[clamp_axis];
+
+ while (ownLoc[clamp_axis] < offset)
+ offset -= len;
- /* find axis along which the bounding box has the greatest
- * extent. Otherwise, default to the x-axis, as that is quite
- * frequently used.
- */
- if ((size[2]>size[0]) && (size[2]>size[1]))
- clamp_axis= CLAMPTO_Z;
- else if ((size[1]>size[0]) && (size[1]>size[2]))
- clamp_axis= CLAMPTO_Y;
- else
- clamp_axis = CLAMPTO_X;
+ /* now, we calculate as per normal, except using offset instead of curveMin[clamp_axis] */
+ curvetime = (ownLoc[clamp_axis] - offset) / (len);
}
- else
- clamp_axis= data->flag;
+ else if (ownLoc[clamp_axis] > curveMax[clamp_axis]) {
+ /* bounding-box range is after */
+ offset= curveMax[clamp_axis];
+
+ while (ownLoc[clamp_axis] > offset) {
+ if ((offset + len) > ownLoc[clamp_axis])
+ break;
+ else
+ offset += len;
+ }
- /* 2. determine position relative to curve on a 0-1 scale */
- if (clamp_axis > 0) clamp_axis--;
+ /* now, we calculate as per normal, except using offset instead of curveMax[clamp_axis] */
+ curvetime = (ownLoc[clamp_axis] - offset) / (len);
+ }
+ else {
+ /* as the location falls within bounds, just calculate */
+ curvetime = (ownLoc[clamp_axis] - curveMin[clamp_axis]) / (len);
+ }
+ }
+ else {
+ /* no cyclic, so position is clamped to within the bounding box */
if (ownLoc[clamp_axis] <= curveMin[clamp_axis])
curvetime = 0.0;
else if (ownLoc[clamp_axis] >= curveMax[clamp_axis])
curvetime = 1.0;
else
- curvetime = (ownLoc[clamp_axis] - curveMin[clamp_axis]) / (curveMax[clamp_axis] - curveMin[clamp_axis]); // umm
+ curvetime = (ownLoc[clamp_axis] - curveMin[clamp_axis]) / (curveMax[clamp_axis] - curveMin[clamp_axis]);
+ }
+
+ /* 3. position on curve */
+ if (where_on_path(ct->tar, curvetime, vec, dir) ) {
+ Mat4One(totmat);
+ VECCOPY(totmat[3], vec);
- /* 3. position on curve */
- if(where_on_path(data->tar, curvetime, vec, dir) ) {
- Mat4One(totmat);
- VECCOPY(totmat[3], vec);
+ Mat4MulSerie(targetMatrix, ct->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
+ }
+ }
+
+ /* obtain final object position */
+ VECCOPY(cob->matrix[3], targetMatrix[3]);
+ }
+}
+
+static bConstraintTypeInfo CTI_CLAMPTO = {
+ CONSTRAINT_TYPE_CLAMPTO, /* type */
+ sizeof(bClampToConstraint), /* size */
+ "Clamp To", /* name */
+ "bClampToConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ NULL, /* new data */
+ clampto_get_tars, /* get constraint targets */
+ clampto_flush_tars, /* flush constraint targets */
+ clampto_get_tarmat, /* get target matrix */
+ clampto_evaluate /* evaluate */
+};
+
+/* ---------- Transform Constraint ----------- */
+
+static void transform_new_data (void *cdata)
+{
+ bTransformConstraint *data= (bTransformConstraint *)cdata;
+
+ data->map[0]= 0;
+ data->map[1]= 1;
+ data->map[2]= 2;
+}
+
+static void transform_get_tars (bConstraint *con, ListBase *list)
+{
+ if (con && list) {
+ bTransformConstraint *data= con->data;
+ bConstraintTarget *ct;
+
+ /* standard target-getting macro for single-target constraints */
+ SINGLETARGET_GET_TARS(con, data->tar, data->subtarget, ct, list)
+ }
+}
+
+static void transform_flush_tars (bConstraint *con, ListBase *list, short nocopy)
+{
+ if (con && list) {
+ bTransformConstraint *data= con->data;
+ bConstraintTarget *ct= list->first;
+
+ /* the following macro is used for all standard single-target constraints */
+ SINGLETARGET_FLUSH_TARS(con, data->tar, data->subtarget, ct, list, nocopy)
+ }
+}
+
+static void transform_evaluate (bConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ bTransformConstraint *data= con->data;
+ bConstraintTarget *ct= targets->first;
+
+ /* only evaluate if there is a target */
+ if (VALID_CONS_TARGET(ct)) {
+ float loc[3], eul[3], size[3];
+ float dvec[3], sval[3];
+ short i;
+
+ /* obtain target effect */
+ switch (data->from) {
+ case 2: /* scale */
+ Mat4ToSize(ct->matrix, dvec);
+ break;
+ case 1: /* rotation */
+ Mat4ToEul(ct->matrix, dvec);
+ break;
+ default: /* location */
+ VecCopyf(dvec, ct->matrix[3]);
+ break;
+ }
+
+ /* extract components of owner's matrix */
+ VECCOPY(loc, cob->matrix[3]);
+ Mat4ToEul(cob->matrix, eul);
+ Mat4ToSize(cob->matrix, size);
+
+ /* determine where in range current transforms lie */
+ if (data->expo) {
+ for (i=0; i<3; i++) {
+ if (data->from_max[i] - data->from_min[i])
+ sval[i]= (dvec[i] - data->from_min[i]) / (data->from_max[i] - data->from_min[i]);
+ else
+ sval[i]= 0.0f;
+ }
+ }
+ else {
+ /* clamp transforms out of range */
+ for (i=0; i<3; i++) {
+ CLAMP(dvec[i], data->from_min[i], data->from_max[i]);
+ if (data->from_max[i] - data->from_min[i])
+ sval[i]= (dvec[i] - data->from_min[i]) / (data->from_max[i] - data->from_min[i]);
+ else
+ sval[i]= 0.0f;
+ }
+ }
+
+ /* convert radian<->degree */
+ if (data->from==1 && data->to==0) {
+ /* from radians to degrees */
+ for (i=0; i<3; i++)
+ sval[i] = sval[i] / M_PI * 180;
+ }
+ else if (data->from==0 && data->to==1) {
+ /* from degrees to radians */
+ for (i=0; i<3; i++)
+ sval[i] = sval[i] / 180 * M_PI;
+ }
+
+ /* apply transforms */
+ switch (data->to) {
+ case 2: /* scaling */
+ for (i=0; i<3; i++)
+ size[i]= data->to_min[i] + (sval[data->map[i]] * (data->to_max[i] - data->to_min[i]));
+ break;
+ case 1: /* rotation */
+ for (i=0; i<3; i++) {
+ float tmin, tmax;
+
+ /* convert destination min/max ranges from degrees to radians */
+ tmin= data->to_min[i] / M_PI * 180;
+ tmax= data->to_max[i] / M_PI * 180;
- Mat4MulSerie(targetMatrix, data->tar->obmat, totmat, NULL, NULL, NULL, NULL, NULL, NULL);
+ eul[i]= tmin + (sval[data->map[i]] * (tmax - tmin));
+ }
+ break;
+ default: /* location */
+ /* get new location */
+ for (i=0; i<3; i++)
+ loc[i]= (data->to_min[i] + (sval[data->map[i]] * (data->to_max[i] - data->to_min[i])));
+
+ /* add original location back on (so that it can still be moved) */
+ VecAddf(loc, cob->matrix[3], loc);
+ break;
+ }
+
+ /* apply to matrix */
+ LocEulSizeToMat4(cob->matrix, loc, eul, size);
+ }
+}
+
+static bConstraintTypeInfo CTI_TRANSFORM = {
+ CONSTRAINT_TYPE_TRANSFORM, /* type */
+ sizeof(bTransformConstraint), /* size */
+ "Transform", /* name */
+ "bTransformConstraint", /* struct name */
+ NULL, /* free data */
+ NULL, /* relink data */
+ NULL, /* copy data */
+ transform_new_data, /* new data */
+ transform_get_tars, /* get constraint targets */
+ transform_flush_tars, /* flush constraint targets */
+ default_get_tarmat, /* get a target matrix */
+ transform_evaluate /* evaluate */
+};
+
+/* ************************* Constraints Type-Info *************************** */
+/* All of the constraints api functions use bConstraintTypeInfo structs to carry out
+ * and operations that involve constraint specifc code.
+ */
+
+/* These globals only ever get directly accessed in this file */
+static bConstraintTypeInfo *constraintsTypeInfo[NUM_CONSTRAINT_TYPES+1];
+static short CTI_INIT= 1; /* when non-zero, the list needs to be updated */
+
+/* This function only gets called when CTI_INIT is non-zero */
+static void constraints_init_typeinfo () {
+ constraintsTypeInfo[0]= NULL; /* 'Null' Constraint */
+ constraintsTypeInfo[1]= &CTI_CHILDOF; /* ChildOf Constraint */
+ constraintsTypeInfo[2]= &CTI_TRACKTO; /* TrackTo Constraint */
+ constraintsTypeInfo[3]= &CTI_KINEMATIC; /* IK Constraint */
+ constraintsTypeInfo[4]= &CTI_FOLLOWPATH; /* Follow-Path Constraint */
+ constraintsTypeInfo[5]= &CTI_ROTLIMIT; /* Limit Rotation Constraint */
+ constraintsTypeInfo[6]= &CTI_LOCLIMIT; /* Limit Location Constraint */
+ constraintsTypeInfo[7]= &CTI_SIZELIMIT; /* Limit Scaling Constraint */
+ constraintsTypeInfo[8]= &CTI_ROTLIKE; /* Copy Rotation Constraint */
+ constraintsTypeInfo[9]= &CTI_LOCLIKE; /* Copy Location Constraint */
+ constraintsTypeInfo[10]= &CTI_SIZELIKE; /* Copy Scaling Constraint */
+ constraintsTypeInfo[11]= &CTI_PYTHON; /* Python/Script Constraint */
+ constraintsTypeInfo[12]= &CTI_ACTION; /* Action Constraint */
+ constraintsTypeInfo[13]= &CTI_LOCKTRACK; /* Locked-Track Constraint */
+ constraintsTypeInfo[14]= NULL; /* 'Distance Limit' Constraint */
+ constraintsTypeInfo[15]= &CTI_STRETCHTO; /* StretchTo Constaint */
+ constraintsTypeInfo[16]= &CTI_MINMAX; /* Floor Constraint */
+ constraintsTypeInfo[17]= &CTI_RIGIDBODYJOINT; /* RigidBody Constraint */
+ constraintsTypeInfo[18]= &CTI_CLAMPTO; /* ClampTo Constraint */
+ constraintsTypeInfo[19]= &CTI_TRANSFORM; /* Transformation Constraint */
+}
+
+/* This function should be used for getting the appropriate type-info when only
+ * a constraint type is known
+ */
+bConstraintTypeInfo *get_constraint_typeinfo (int type)
+{
+ /* initialise the type-info list? */
+ if (CTI_INIT) {
+ constraints_init_typeinfo();
+ CTI_INIT = 0;
+ }
+
+ /* only return for valid types */
+ if ( (type >= CONSTRAINT_TYPE_NULL) &&
+ (type <= NUM_CONSTRAINT_TYPES ) )
+ {
+ /* there shouldn't be any segfaults here... */
+ return constraintsTypeInfo[type];
+ }
+ else {
+ printf("No valid constraint type-info data available. Type = %i \n", type);
+ }
+
+ return NULL;
+}
+
+/* This function should always be used to get the appropriate type-info, as it
+ * has checks which prevent segfaults in some weird cases.
+ */
+bConstraintTypeInfo *constraint_get_typeinfo (bConstraint *con)
+{
+ /* only return typeinfo for valid constraints */
+ if (con)
+ return get_constraint_typeinfo(con->type);
+ else
+ return NULL;
+}
+
+/* ************************* General Constraints API ************************** */
+/* The functions here are called by various parts of Blender. Very few (should be none if possible)
+ * constraint-specific code should occur here.
+ */
+
+/* ---------- Data Management ------- */
+
+/* Free data of a specific constraint if it has any info */
+void free_constraint_data (bConstraint *con)
+{
+ if (con->data) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+
+ /* perform any special freeing constraint may have */
+ if (cti && cti->free_data)
+ cti->free_data(con);
+
+ /* free constraint data now */
+ MEM_freeN(con->data);
+ }
+}
+
+/* Free all constraints from a constraint-stack */
+void free_constraints (ListBase *conlist)
+{
+ bConstraint *con;
+
+ /* Free constraint data and also any extra data */
+ for (con= conlist->first; con; con= con->next) {
+ free_constraint_data(con);
+ }
+
+ /* Free the whole list */
+ BLI_freelistN(conlist);
+}
+
+/* Reassign links that constraints have to other data (called during file loading?) */
+void relink_constraints (ListBase *conlist)
+{
+ bConstraint *con;
+ bConstraintTarget *ct;
+
+ for (con= conlist->first; con; con= con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+
+ if (cti) {
+ /* relink any targets */
+ if (cti->get_constraint_targets) {
+ ListBase targets = {NULL, NULL};
+
+ cti->get_constraint_targets(con, &targets);
+ for (ct= targets.first; ct; ct= ct->next) {
+ ID_NEW(ct->tar);
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
+ }
+
+ /* relink any other special data */
+ if (cti->relink_data)
+ cti->relink_data(con);
+ }
+ }
+}
+
+/* duplicate all of the constraints in a constraint stack */
+void copy_constraints (ListBase *dst, ListBase *src)
+{
+ bConstraint *con, *srccon;
+
+ dst->first= dst->last= NULL;
+ duplicatelist(dst, src);
+
+ for (con=dst->first, srccon=src->first; con; srccon=srccon->next, con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+
+ /* make a new copy of the constraint's data */
+ con->data = MEM_dupallocN(con->data);
+
+ /* only do specific constraints if required */
+ if (cti && cti->copy_data)
+ cti->copy_data(con, srccon);
+ }
+}
+
+/* -------- Target-Matrix Stuff ------- */
+
+/* This function is a relic from the prior implementations of the constraints system, when all
+ * constraints either had one or no targets. It used to be called during the main constraint solving
+ * loop, but is now only used for the remaining cases for a few constraints.
+ *
+ * None of the actual calculations of the matricies should be done here! Also, this function is
+ * not to be used by any new constraints, particularly any that have multiple targets.
+ */
+void get_constraint_target_matrix (bConstraint *con, int n, short ownertype, void *ownerdata, float mat[][4], float ctime)
+{
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintOb *cob;
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ /* make 'constraint-ob' */
+ cob= MEM_callocN(sizeof(bConstraintOb), "tempConstraintOb");
+ cob->type= ownertype;
+ switch (ownertype) {
+ case CONSTRAINT_OBTYPE_OBJECT: /* it is usually this case */
+ {
+ cob->ob= (Object *)ownerdata;
+ cob->pchan= NULL;
+ if (cob->ob) {
+ Mat4CpyMat4(cob->matrix, cob->ob->obmat);
+ Mat4CpyMat4(cob->startmat, cob->matrix);
+ }
+ else {
+ Mat4One(cob->matrix);
+ Mat4One(cob->startmat);
+ }
+ }
+ break;
+ case CONSTRAINT_OBTYPE_BONE: /* this may occur in some cases */
+ {
+ cob->ob= NULL; /* this might not work at all :/ */
+ cob->pchan= (bPoseChannel *)ownerdata;
+ if (cob->pchan) {
+ Mat4CpyMat4(cob->matrix, cob->pchan->pose_mat);
+ Mat4CpyMat4(cob->startmat, cob->matrix);
+ }
+ else {
+ Mat4One(cob->matrix);
+ Mat4One(cob->startmat);
}
}
+ break;
+ }
+
+ /* get targets - we only need the first one though (and there should only be one) */
+ cti->get_constraint_targets(con, &targets);
+
+ /* only calculate the target matrix on the first target */
+ ct= (bConstraintTarget *)targets.first;
+ while(ct && n-- > 0)
+ ct= ct->next;
+
+ if (ct) {
+ if (cti->get_target_matrix)
+ cti->get_target_matrix(con, cob, ct, ctime);
+ Mat4CpyMat4(mat, ct->matrix);
+ }
+
+ /* free targets + 'constraint-ob' */
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 1);
+ MEM_freeN(cob);
+ }
+ else {
+ /* invalid constraint - perhaps... */
+ Mat4One(mat);
+ }
+}
+
+/* ---------- Evaluation ----------- */
+
+/* This function is called whenever constraints need to be evaluated. Currently, all
+ * constraints that can be evaluated are everytime this gets run.
+ *
+ * constraints_make_evalob and constraints_clear_evalob should be called before and
+ * after running this function, to sort out cob
+ */
+void solve_constraints (ListBase *conlist, bConstraintOb *cob, float ctime)
+{
+ bConstraint *con;
+ float solution[4][4], delta[4][4];
+ float oldmat[4][4], imat[4][4];
+ float enf;
+
+ /* check that there is a valid constraint object to evaluate */
+ if (cob == NULL)
+ return;
+
+ /* loop over available constraints, solving and blending them */
+ for (con= conlist->first; con; con= con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+
+ /* these we can skip completely (invalid constraints...) */
+ if (cti == NULL) continue;
+ if (con->flag & CONSTRAINT_DISABLE) continue;
+ /* these constraints can't be evaluated anyway */
+ if (cti->evaluate_constraint == NULL) continue;
+ /* influence == 0 should be ignored */
+ if (con->enforce == 0.0f) continue;
+
+ /* influence of constraint
+ * - value should have been set from IPO's/Constraint Channels already
+ */
+ enf = con->enforce;
+
+ /* move owner matrix into right space */
+ constraint_mat_convertspace(cob->ob, cob->pchan, cob->matrix, CONSTRAINT_SPACE_WORLD, con->ownspace);
+ Mat4CpyMat4(oldmat, cob->matrix);
+
+ /* prepare targets for constraint solving */
+ if (cti->get_constraint_targets) {
+ bConstraintTarget *ct;
+
+ /* get targets
+ * - constraints should use ct->matrix, not directly accessing values
+ * - ct->matrix members have not yet been calculated here!
+ */
+ cti->get_constraint_targets(con, &targets);
- /* obtain final object position */
- VECCOPY(ob->obmat[3], targetMatrix[3]);
+ /* set matrices
+ * - calculate if possible, otherwise just initialise as identity matrix
+ */
+ if (cti->get_target_matrix) {
+ for (ct= targets.first; ct; ct= ct->next)
+ cti->get_target_matrix(con, cob, ct, ctime);
+ }
+ else {
+ for (ct= targets.first; ct; ct= ct->next)
+ Mat4One(ct->matrix);
+ }
+ }
+
+ /* Solve the constraint */
+ cti->evaluate_constraint(con, cob, &targets);
+
+ /* clear targets after use
+ * - this should free temp targets but no data should be copied back
+ * as constraints may have done some nasty things to it...
+ */
+ if (cti->flush_constraint_targets) {
+ cti->flush_constraint_targets(con, &targets, 1);
}
- break;
- default:
- printf ("Error: Unknown constraint type\n");
- break;
+
+ /* Interpolate the enforcement, to blend result of constraint into final owner transform */
+ /* 1. Remove effects of original matrix from constraint solution ==> delta */
+ Mat4Invert(imat, oldmat);
+ Mat4CpyMat4(solution, cob->matrix);
+ Mat4MulMat4(delta, solution, imat);
+
+ /* 2. If constraint influence is not full strength, then interpolate
+ * identity_matrix --> delta_matrix to get the effect the constraint actually exerts
+ */
+ if (enf < 1.0) {
+ float identity[4][4];
+ Mat4One(identity);
+ Mat4BlendMat4(delta, identity, delta, enf);
+ }
+
+ /* 3. Now multiply the delta by the matrix in use before the evaluation */
+ Mat4MulMat4(cob->matrix, delta, oldmat);
+
+ /* 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/curve.c b/source/blender/blenkernel/intern/curve.c
index 769c31ad8a9..6676bf0e03f 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -1445,7 +1445,7 @@ static void alfa_bezpart(BezTriple *prevbezt, BezTriple *bezt, Nurb *nu, float *
for(a=0; a<resolu; a++, fac+= dfac) {
- set_four_ipo(fac, t, KEY_LINEAR);
+ set_four_ipo(fac, t, nu->tilt_interp);
data_a[a]= t[0]*pprev->alfa + t[1]*prevbezt->alfa + t[2]*bezt->alfa + t[3]*next->alfa;
}
@@ -2351,6 +2351,8 @@ void sethandlesNurb(short code)
/* code==2: set vectorhandle */
/* code==3 (HD_ALIGN) it toggle, vectorhandles become HD_FREE */
/* code==4: sets icu flag to become IPO_AUTO_HORIZ, horizontal extremes on auto-handles */
+ /* code==5: Set align, like 3 but no toggle */
+ /* code==6: Clear align, like 3 but no toggle */
Nurb *nu;
BezTriple *bezt;
short a, ok=0;
@@ -2381,22 +2383,28 @@ void sethandlesNurb(short code)
/* there is 1 handle not FREE: FREE it all, else make ALIGNED */
nu= editNurb.first;
- while(nu) {
- if( (nu->type & 7)==1) {
- bezt= nu->bezt;
- a= nu->pntsu;
- while(a--) {
- if(bezt->f1 && bezt->h1) ok= 1;
- if(bezt->f3 && bezt->h2) ok= 1;
- if(ok) break;
- bezt++;
+ if (code == 5) {
+ ok = HD_ALIGN;
+ } else if (code == 6) {
+ ok = HD_FREE;
+ } else {
+ /* Toggle */
+ while(nu) {
+ if( (nu->type & 7)==1) {
+ bezt= nu->bezt;
+ a= nu->pntsu;
+ while(a--) {
+ if(bezt->f1 && bezt->h1) ok= 1;
+ if(bezt->f3 && bezt->h2) ok= 1;
+ if(ok) break;
+ bezt++;
+ }
}
+ nu= nu->next;
}
- nu= nu->next;
+ if(ok) ok= HD_FREE;
+ else ok= HD_ALIGN;
}
- if(ok) ok= HD_FREE;
- else ok= HD_ALIGN;
-
nu= editNurb.first;
while(nu) {
if( (nu->type & 7)==1) {
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index 2c8199f90f3..aa0dc10f4e0 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -271,7 +271,7 @@ static void layerSwap_tface(void *data, int *corner_indices)
static void layerDefault_tface(void *data, int count)
{
- static MTFace default_tf = {{{0, 1}, {0, 0}, {1, 0}, {1, 1}}, NULL,
+ static MTFace default_tf = {{{0, 0}, {1, 0}, {1, 1}, {0, 1}}, NULL,
0, 0, TF_DYNAMIC, 0, 0};
MTFace *tf = (MTFace*)data;
int i;
@@ -280,6 +280,83 @@ static void layerDefault_tface(void *data, int count)
tf[i] = default_tf;
}
+static void layerCopy_origspace_face(const void *source, void *dest, int count)
+{
+ const OrigSpaceFace *source_tf = (const OrigSpaceFace*)source;
+ OrigSpaceFace *dest_tf = (OrigSpaceFace*)dest;
+ int i;
+
+ for(i = 0; i < count; ++i)
+ dest_tf[i] = source_tf[i];
+}
+
+static void layerInterp_origspace_face(void **sources, float *weights,
+ float *sub_weights, int count, void *dest)
+{
+ OrigSpaceFace *osf = dest;
+ int i, j, k;
+ float uv[4][2];
+ float *sub_weight;
+
+ if(count <= 0) return;
+
+ memset(uv, 0, sizeof(uv));
+
+ sub_weight = sub_weights;
+ for(i = 0; i < count; ++i) {
+ float weight = weights ? weights[i] : 1;
+ OrigSpaceFace *src = sources[i];
+
+ for(j = 0; j < 4; ++j) {
+ if(sub_weights) {
+ for(k = 0; k < 4; ++k, ++sub_weight) {
+ float w = (*sub_weight) * weight;
+ float *tmp_uv = src->uv[k];
+
+ uv[j][0] += tmp_uv[0] * w;
+ uv[j][1] += tmp_uv[1] * w;
+ }
+ } else {
+ uv[j][0] += src->uv[j][0] * weight;
+ uv[j][1] += src->uv[j][1] * weight;
+ }
+ }
+ }
+
+ *osf = *(OrigSpaceFace *)sources[0];
+ for(j = 0; j < 4; ++j) {
+ osf->uv[j][0] = uv[j][0];
+ osf->uv[j][1] = uv[j][1];
+ }
+}
+
+static void layerSwap_origspace_face(void *data, int *corner_indices)
+{
+ OrigSpaceFace *osf = data;
+ float uv[4][2];
+ int j;
+
+ for(j = 0; j < 4; ++j) {
+ uv[j][0] = osf->uv[corner_indices[j]][0];
+ uv[j][1] = osf->uv[corner_indices[j]][1];
+ }
+ memcpy(osf->uv, uv, sizeof(osf->uv));
+}
+
+static void layerDefault_origspace_face(void *data, int count)
+{
+ static OrigSpaceFace default_osf = {{{0, 0}, {1, 0}, {1, 1}, {0, 1}}};
+ OrigSpaceFace *osf = (OrigSpaceFace*)data;
+ int i;
+
+ for(i = 0; i < count; i++)
+ osf[i] = default_osf;
+}
+/* --------- */
+
+
+
+
static void layerInterp_mcol(void **sources, float *weights,
float *sub_weights, int count, void *dest)
{
@@ -370,11 +447,13 @@ const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
{sizeof(MFloatProperty), "MFloatProperty",1,"Float",NULL,NULL,NULL,NULL},
{sizeof(MIntProperty), "MIntProperty",1,"Int",NULL,NULL,NULL,NULL},
{sizeof(MStringProperty), "MStringProperty",1,"String",NULL,NULL,NULL,NULL},
+ {sizeof(OrigSpaceFace), "OrigSpaceFace", 1, "UVTex", layerCopy_origspace_face, NULL,
+ layerInterp_origspace_face, layerSwap_origspace_face, layerDefault_origspace_face},
};
const char *LAYERTYPENAMES[CD_NUMTYPES] = {
"CDMVert", "CDMSticky", "CDMDeformVert", "CDMEdge", "CDMFace", "CDMTFace",
- "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty","CDMIntProperty","CDMStringProperty"};
+ "CDMCol", "CDOrigIndex", "CDNormal", "CDFlags","CDMFloatProperty","CDMIntProperty","CDMStringProperty", "CDOrigSpace"};
const CustomDataMask CD_MASK_BAREMESH =
CD_MASK_MVERT | CD_MASK_MEDGE | CD_MASK_MFACE;
@@ -387,7 +466,8 @@ const CustomDataMask CD_MASK_EDITMESH =
CD_MASK_MCOL|CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR;
const CustomDataMask CD_MASK_DERIVEDMESH =
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
- CD_MASK_MCOL | CD_MASK_ORIGINDEX;
+ CD_MASK_MCOL | CD_MASK_ORIGINDEX |
+ CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_ORIGSPACE;
static const LayerTypeInfo *layerType_getInfo(int type)
{
@@ -544,6 +624,29 @@ int CustomData_get_render_layer_index(const CustomData *data, int type)
return -1;
}
+int CustomData_get_active_layer(const CustomData *data, int type)
+{
+ int i;
+
+ for(i=0; i < data->totlayer; ++i)
+ if(data->layers[i].type == type)
+ return data->layers[i].active;
+
+ return -1;
+}
+
+int CustomData_get_render_layer(const CustomData *data, int type)
+{
+ int i;
+
+ for(i=0; i < data->totlayer; ++i)
+ if(data->layers[i].type == type)
+ return data->layers[i].active_rnd;
+
+ return -1;
+}
+
+
void CustomData_set_layer_active(CustomData *data, int type, int n)
{
int i;
@@ -562,6 +665,25 @@ void CustomData_set_layer_render(CustomData *data, int type, int n)
data->layers[i].active_rnd = n;
}
+/* for using with an index from CustomData_get_active_layer_index and CustomData_get_render_layer_index */
+void CustomData_set_layer_active_index(CustomData *data, int type, int n)
+{
+ int i;
+
+ for(i=0; i < data->totlayer; ++i)
+ if(data->layers[i].type == type)
+ data->layers[i].active = n-i;
+}
+
+void CustomData_set_layer_render_index(CustomData *data, int type, int n)
+{
+ int i;
+
+ for(i=0; i < data->totlayer; ++i)
+ if(data->layers[i].type == type)
+ data->layers[i].active_rnd = n-i;
+}
+
void CustomData_set_layer_flag(struct CustomData *data, int type, int flag)
{
diff --git a/source/blender/blenkernel/intern/deform.c b/source/blender/blenkernel/intern/deform.c
index aa6220e88bc..9356ba14071 100644
--- a/source/blender/blenkernel/intern/deform.c
+++ b/source/blender/blenkernel/intern/deform.c
@@ -113,14 +113,31 @@ bDeformGroup *get_named_vertexgroup (Object *ob, char *name)
return NULL;
}
-int get_defgroup_num (Object *ob, bDeformGroup *dg)
+int get_named_vertexgroup_num (Object *ob, char *name)
+{
+ /* Return the location of the named deform group within the list of
+ * deform groups. This function is a combination of get_defgroup_num and
+ * get_named_vertexgroup. The other two could be called instead, but that
+ * require looping over the vertexgroups twice.
+ */
+ bDeformGroup *curdef;
+ int def_nr;
+
+ for (curdef=ob->defbase.first, def_nr=0; curdef; curdef=curdef->next, def_nr++) {
+ if (!strcmp(curdef->name, name))
+ return def_nr;
+ }
+
+ return -1;
+}
+
+int get_defgroup_num (Object *ob, bDeformGroup *dg)
{
/* Fetch the location of this deform group
* within the linked list of deform groups.
* (this number is stored in the deform
* weights of the deform verts to link them
- * to this deform group) deform deform
- * deform blah blah deform
+ * to this deform group).
*/
bDeformGroup *eg;
@@ -129,8 +146,7 @@ int get_defgroup_num (Object *ob, bDeformGroup *dg)
eg = ob->defbase.first;
def_nr = 0;
- /* loop through all deform groups
- */
+ /* loop through all deform groups */
while (eg != NULL) {
/* if the current deform group is
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index a71ed731b07..924f544285e 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -44,6 +44,7 @@
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
+#include "DNA_camera_types.h"
#include "DNA_ID.h"
#include "DNA_effect_types.h"
#include "DNA_group_types.h"
@@ -56,6 +57,7 @@
#include "DNA_object_force.h"
#include "DNA_object_fluidsim.h"
#include "DNA_oops_types.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -71,8 +73,9 @@
#include "BKE_mball.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
-#include "BKE_scene.h"
+#include "BKE_particle.h"
#include "BKE_utildefines.h"
+#include "BKE_scene.h"
#include "MEM_guardedalloc.h"
#include "blendef.h"
@@ -347,10 +350,12 @@ static void dag_add_driver_relation(Ipo *ipo, DagForest *dag, DagNode *node, int
static void build_dag_object(DagForest *dag, DagNode *scenenode, Object *ob, int mask)
{
bConstraint *con;
+ bConstraintChannel *conchan;
DagNode * node;
DagNode * node2;
DagNode * node3;
Key *key;
+ ParticleSystem *psys;
int addtoroot= 1;
node = dag_get_node(dag, ob);
@@ -366,25 +371,34 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Object *ob, int
if (ob->pose){
bPoseChannel *pchan;
bConstraint *con;
- Object * target;
- char *subtarget;
- for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next){
- for (con = pchan->constraints.first; con; con=con->next){
- if (constraint_has_target(con)) {
+ for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ for (con = pchan->constraints.first; con; con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
- target = get_constraint_target(con, &subtarget);
- if (target!=ob) {
- // fprintf(stderr,"armature %s target :%s \n", ob->id.name, target->id.name);
- node3 = dag_get_node(dag, target);
-
- if(subtarget && subtarget[0])
- dag_add_relation(dag,node3,node, DAG_RL_OB_DATA|DAG_RL_DATA_DATA);
- else
- dag_add_relation(dag,node3,node, DAG_RL_OB_DATA);
-
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar && ct->tar != ob) {
+ // fprintf(stderr,"armature %s target :%s \n", ob->id.name, target->id.name);
+ node3 = dag_get_node(dag, ct->tar);
+
+ if (ct->subtarget[0])
+ dag_add_relation(dag,node3,node, DAG_RL_OB_DATA|DAG_RL_DATA_DATA);
+ else if(ELEM(con->type, CONSTRAINT_TYPE_FOLLOWPATH, CONSTRAINT_TYPE_CLAMPTO))
+ dag_add_relation(dag,node3,node, DAG_RL_DATA_DATA|DAG_RL_OB_DATA);
+ else
+ dag_add_relation(dag,node3,node, DAG_RL_OB_DATA);
+ }
}
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 1);
}
+
}
}
}
@@ -398,9 +412,12 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Object *ob, int
if(key && key->ipo)
dag_add_driver_relation(key->ipo, dag, node, 1);
+ for (conchan=ob->constraintChannels.first; conchan; conchan=conchan->next)
+ if(conchan->ipo)
+ dag_add_driver_relation(conchan->ipo, dag, node, 0);
+
if(ob->action) {
bActionChannel *chan;
- bConstraintChannel *conchan;
for (chan = ob->action->chanbase.first; chan; chan=chan->next){
if(chan->ipo)
dag_add_driver_relation(chan->ipo, dag, node, 1);
@@ -477,7 +494,13 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Object *ob, int
dag_add_relation(dag, node, node2, DAG_RL_DATA_DATA|DAG_RL_OB_OB);
/* inverted relation, so addtoroot shouldn't be set to zero */
}
-
+ if (ob->type==OB_CAMERA) {
+ Camera *cam = (Camera *)ob->data;
+ if (cam->dof_ob) {
+ node2 = dag_get_node(dag, cam->dof_ob);
+ dag_add_relation(dag,node2,node,DAG_RL_OB_OB);
+ }
+ }
if (ob->transflag & OB_DUPLI) {
if((ob->transflag & OB_DUPLIGROUP) && ob->dup_group) {
GroupObject *go;
@@ -566,22 +589,85 @@ static void build_dag_object(DagForest *dag, DagNode *scenenode, Object *ob, int
}
}
}
+
+ psys= ob->particlesystem.first;
+ if(psys) {
+ ParticleEffectorCache *nec;
+
+ for(; psys; psys=psys->next) {
+ ParticleSettings *part= psys->part;
+
+ dag_add_relation(dag, node, node, DAG_RL_OB_DATA);
+
+ if(part->phystype==PART_PHYS_KEYED && psys->keyed_ob &&
+ BLI_findlink(&psys->keyed_ob->particlesystem,psys->keyed_psys-1)) {
+ node2 = dag_get_node(dag, psys->keyed_ob);
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA);
+ }
+
+ if(psys->effectors.first)
+ psys_end_effectors(psys);
+ psys_init_effectors(ob,psys->part->eff_group,psys);
+
+ if(psys->effectors.first) {
+ for(nec= psys->effectors.first; nec; nec= nec->next) {
+ Object *ob1= nec->ob;
+
+ if(nec->type & PSYS_EC_EFFECTOR) {
+ node2 = dag_get_node(dag, ob1);
+ if(ob1->pd->forcefield==PFIELD_GUIDE)
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA|DAG_RL_OB_DATA);
+ else
+ dag_add_relation(dag, node2, node, DAG_RL_OB_DATA);
+ }
+ else if(nec->type & PSYS_EC_DEFLECT) {
+ node2 = dag_get_node(dag, ob1);
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA|DAG_RL_OB_DATA);
+ }
+ else if(nec->type & PSYS_EC_PARTICLE) {
+ node2 = dag_get_node(dag, ob1);
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_DATA);
+ }
+
+ if(nec->type & PSYS_EC_REACTOR) {
+ node2 = dag_get_node(dag, ob1);
+ dag_add_relation(dag, node, node2, DAG_RL_DATA_DATA);
+ }
+ }
+ }
+ }
+ }
- for (con = ob->constraints.first; con; con=con->next){
- if (constraint_has_target(con)) {
- char *str;
- Object *obt= get_constraint_target(con, &str);
+ for (con = ob->constraints.first; con; con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
- node2 = dag_get_node(dag, obt);
- if(con->type==CONSTRAINT_TYPE_FOLLOWPATH)
- dag_add_relation(dag, node2, node, DAG_RL_DATA_OB|DAG_RL_OB_OB);
- else {
- if(obt->type==OB_ARMATURE && str[0])
- dag_add_relation(dag, node2, node, DAG_RL_DATA_OB|DAG_RL_OB_OB);
+ for (ct= targets.first; ct; ct= ct->next) {
+ Object *obt;
+
+ if (ct->tar)
+ obt= ct->tar;
else
- dag_add_relation(dag, node2, node, DAG_RL_OB_OB);
+ continue;
+
+ node2 = dag_get_node(dag, obt);
+ if (ELEM(con->type, CONSTRAINT_TYPE_FOLLOWPATH, CONSTRAINT_TYPE_CLAMPTO))
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_OB|DAG_RL_OB_OB);
+ else {
+ if (ELEM3(obt->type, OB_ARMATURE, OB_MESH, OB_LATTICE) && (ct->subtarget[0]))
+ dag_add_relation(dag, node2, node, DAG_RL_DATA_OB|DAG_RL_OB_OB);
+ else
+ dag_add_relation(dag, node2, node, DAG_RL_OB_OB);
+ }
+ addtoroot = 0;
}
- addtoroot = 0;
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 1);
}
}
@@ -1705,10 +1791,23 @@ static void dag_object_time_update_flags(Object *ob)
if(ob->ipo) ob->recalc |= OB_RECALC_OB;
else if(ob->constraints.first) {
bConstraint *con;
- for (con = ob->constraints.first; con; con=con->next){
- if (constraint_has_target(con)) {
- ob->recalc |= OB_RECALC_OB;
- break;
+ for (con = ob->constraints.first; con; con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar) {
+ ob->recalc |= OB_RECALC_OB;
+ break;
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 1);
}
}
}
@@ -1765,6 +1864,8 @@ static void dag_object_time_update_flags(Object *ob)
ob->recalc |= OB_RECALC_DATA; // NT FSPARTICLE
}
}
+ if(ob->particlesystem.first)
+ ob->recalc |= OB_RECALC_DATA;
break;
case OB_CURVE:
case OB_SURF:
@@ -1794,6 +1895,17 @@ static void dag_object_time_update_flags(Object *ob)
if(ob->transflag & OB_DUPLI) ob->recalc |= OB_RECALC_DATA;
break;
}
+
+ if(ob->particlesystem.first) {
+ ParticleSystem *psys= ob->particlesystem.first;
+
+ for(; psys; psys=psys->next) {
+ if(psys->flag & PSYS_ENABLED) {
+ ob->recalc |= OB_RECALC_DATA;
+ break;
+ }
+ }
+ }
}
}
@@ -2063,42 +2175,50 @@ void DAG_pose_sort(Object *ob)
dag_add_parent_relation(dag, node2, node, 0);
addtoroot = 0;
}
- for (con = pchan->constraints.first; con; con=con->next){
- if (constraint_has_target(con)) {
- char *subtarget;
- Object *target = get_constraint_target(con, &subtarget);
+ for (con = pchan->constraints.first; con; con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
- if (target==ob && subtarget) {
- bPoseChannel *target= get_pose_channel(ob->pose, subtarget);
- if(target) {
- node2= dag_get_node(dag, target);
- dag_add_relation(dag, node2, node, 0);
- dag_add_parent_relation(dag, node2, node, 0);
-
- if(con->type==CONSTRAINT_TYPE_KINEMATIC) {
- bKinematicConstraint *data = (bKinematicConstraint*)con->data;
- bPoseChannel *parchan;
- int segcount= 0;
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar==ob && ct->subtarget[0]) {
+ bPoseChannel *target= get_pose_channel(ob->pose, ct->subtarget);
+ if (target) {
+ node2= dag_get_node(dag, target);
+ dag_add_relation(dag, node2, node, 0);
+ dag_add_parent_relation(dag, node2, node, 0);
- /* exclude tip from chain? */
- if(!(data->flag & CONSTRAINT_IK_TIP))
- parchan= pchan->parent;
- else
- parchan= pchan;
-
- /* Walk to the chain's root */
- while (parchan){
- node3= dag_get_node(dag, parchan);
- dag_add_relation(dag, node2, node3, 0);
- dag_add_parent_relation(dag, node2, node3, 0);
+ if (con->type==CONSTRAINT_TYPE_KINEMATIC) {
+ bKinematicConstraint *data = (bKinematicConstraint *)con->data;
+ bPoseChannel *parchan;
+ int segcount= 0;
- segcount++;
- if(segcount==data->rootbone || segcount>255) break; // 255 is weak
- parchan= parchan->parent;
+ /* exclude tip from chain? */
+ if(!(data->flag & CONSTRAINT_IK_TIP))
+ parchan= pchan->parent;
+ else
+ parchan= pchan;
+
+ /* Walk to the chain's root */
+ while (parchan) {
+ node3= dag_get_node(dag, parchan);
+ dag_add_relation(dag, node2, node3, 0);
+ dag_add_parent_relation(dag, node2, node3, 0);
+
+ segcount++;
+ if (segcount==data->rootbone || segcount>255) break; // 255 is weak
+ parchan= parchan->parent;
+ }
}
}
}
}
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 1);
}
}
if (addtoroot == 1 ) {
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 30a4c8c3433..f410167c2ac 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -1098,7 +1098,7 @@ void curve_to_filledpoly(Curve *cu, ListBase *nurb, ListBase *dispbase)
- first point left, last point right
- based on subdivided points in original curve, not on points in taper curve (still)
*/
-static float calc_taper(Object *taperobj, int cur, int tot)
+float calc_taper(Object *taperobj, int cur, int tot)
{
Curve *cu;
DispList *dl;
@@ -1256,7 +1256,7 @@ void curve_calc_modifiers_post(Object *ob, ListBase *nurb, ListBase *dispbase, i
if ((md->mode & required_mode) != required_mode) continue;
if (mti->isDisabled && mti->isDisabled(md)) continue;
- if (mti->type!=eModifierTypeType_OnlyDeform) continue;
+ if (mti->type!=eModifierTypeType_OnlyDeform && mti->type!=eModifierTypeType_DeformOrConstruct) continue;
for (dl=dispbase->first; dl; dl=dl->next) {
mti->deformVerts(md, ob, NULL, (float(*)[3]) dl->verts, (dl->type==DL_INDEX3)?dl->nr:dl->parts*dl->nr);
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index f42d0fa79e2..1b345616888 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -799,7 +799,7 @@ static int pdDoDeflection(RNG *rng, float opco[3], float npco[3], float opno[3],
// t= 0.5; // this is labda of line, can use it optimize quad intersection
// sorry but no .. see below (BM)
- if( LineIntersectsTriangle(opco, npco, nv1, nv2, nv3, &t) ) {
+ if( LineIntersectsTriangle(opco, npco, nv1, nv2, nv3, &t, NULL) ) {
if (t < min_t) {
deflected = 1;
deflected_now = 1;
@@ -810,7 +810,7 @@ static int pdDoDeflection(RNG *rng, float opco[3], float npco[3], float opno[3],
// it might give a smaller t on (close to) the edge .. this is numerics not esoteric maths :)
// note: the 2 triangles don't need to share a plane ! (BM)
if (mface->v4) {
- if( LineIntersectsTriangle(opco, npco, nv1, nv3, nv4, &t2) ) {
+ if( LineIntersectsTriangle(opco, npco, nv1, nv3, nv4, &t2, NULL) ) {
if (t2 < min_t) {
deflected = 1;
deflected_now = 2;
@@ -1686,7 +1686,9 @@ void build_particle_system(Object *ob)
float *volengths= NULL, *folengths= NULL;
int deform=0, a, totpart, paf_sta, paf_end;
int waitcursor_set= 0, totvert, totface, curface, curvert;
+#ifndef DISABLE_ELBEEM
int readMask, activeParts, fileParts;
+#endif
/* return conditions */
if(ob->type!=OB_MESH) return;
diff --git a/source/blender/blenkernel/intern/exotic.c b/source/blender/blenkernel/intern/exotic.c
index fe52a3fc198..0f1f8c6078a 100644
--- a/source/blender/blenkernel/intern/exotic.c
+++ b/source/blender/blenkernel/intern/exotic.c
@@ -3025,7 +3025,7 @@ void write_vrml(char *str)
/* FIRST: write all the datablocks */
- fprintf(fp, "#VRML V1.0 ascii\n\n# Blender V2.0\n\n# 'Switch' is used as a hack, to ensure it is not part of the drawing\n\n");
+ fprintf(fp, "#VRML V1.0 ascii\n\n# Blender V%d\n\n# 'Switch' is used as a hack, to ensure it is not part of the drawing\n\n", G.version);
fprintf(fp, "Separator {\n");
fprintf(fp, "Switch {\n");
@@ -3037,9 +3037,16 @@ void write_vrml(char *str)
ma= ma->id.next;
}
+ /* only write meshes we're using in this scene */
+ flag_listbase_ids(&G.main->mesh, LIB_DOIT, 0);
+
+ for(base= G.scene->base.first; base; base= base->next)
+ if(base->object->type== OB_MESH)
+ ((ID *)base->object->data)->flag |= LIB_DOIT;
+
me= G.main->mesh.first;
while(me) {
- if(me->id.us) {
+ if(me->id.flag & LIB_DOIT) { /* is the mesh used in this scene ? */
write_mesh_vrml(fp, me);
}
me= me->id.next;
@@ -3342,10 +3349,18 @@ void write_dxf(char *str)
write_group(0, "SECTION");
write_group(2, "BLOCKS");
+
+ /* only write meshes we're using in this scene */
+ flag_listbase_ids(&G.main->mesh, LIB_DOIT, 0);
+
+ for(base= G.scene->base.first; base; base= base->next)
+ if(base->object->type== OB_MESH)
+ ((ID *)base->object->data)->flag |= LIB_DOIT;
+
/* Write all the meshes */
me= G.main->mesh.first;
while(me) {
- if(me->id.us) {
+ if(me->id.flag & LIB_DOIT) { /* is the mesh used in this scene ? */
write_mesh_dxf(fp, me);
}
me= me->id.next;
diff --git a/source/blender/blenkernel/intern/icons.c b/source/blender/blenkernel/intern/icons.c
index ee37a4ec9f9..f144d2badd1 100644
--- a/source/blender/blenkernel/intern/icons.c
+++ b/source/blender/blenkernel/intern/icons.c
@@ -1,34 +1,32 @@
/**
- * $Id$
- *
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
+* $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*
+* The Original Code is Copyright (C) 2006-2007 Blender Foundation.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): none yet.
+*
+* ***** END GPL LICENSE BLOCK *****
+*
+*/
#include <math.h>
#include <stdlib.h>
@@ -41,6 +39,11 @@
#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
+#include "DNA_image_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_world_types.h"
#include "BLI_ghash.h"
@@ -111,6 +114,101 @@ void BKE_icons_free()
gIcons = NULL;
}
+struct PreviewImage* BKE_previewimg_create()
+{
+ PreviewImage* prv_img = NULL;
+ int i;
+
+ prv_img = MEM_callocN(sizeof(PreviewImage), "img_prv");
+
+ for (i=0; i<PREVIEW_MIPMAPS; ++i) {
+ prv_img->changed[i] = 1;
+ }
+ return prv_img;
+}
+
+void BKE_previewimg_free(PreviewImage **prv)
+{
+ if(prv && (*prv)) {
+ int i;
+
+ for (i=0; i<PREVIEW_MIPMAPS;++i) {
+ if ((*prv)->rect[i]) {
+ MEM_freeN((*prv)->rect[i]);
+ (*prv)->rect[i] = NULL;
+ }
+ }
+ MEM_freeN((*prv));
+ *prv = NULL;
+ }
+}
+
+struct PreviewImage* BKE_previewimg_copy(PreviewImage *prv)
+{
+ PreviewImage* prv_img = NULL;
+ int i;
+
+ if (prv) {
+ prv_img = MEM_dupallocN(prv);
+ for (i=0; i < PREVIEW_MIPMAPS; ++i) {
+ if (prv->rect[i]) {
+ prv_img->rect[i] = MEM_dupallocN(prv->rect[i]);
+ } else {
+ prv_img->rect[i] = NULL;
+ }
+ }
+ }
+ return prv_img;
+}
+
+void BKE_previewimg_free_id(ID *id)
+{
+ if (GS(id->name) == ID_MA) {
+ Material *mat = (Material*)id;
+ BKE_previewimg_free(&mat->preview);
+ } else if (GS(id->name) == ID_TE) {
+ Tex *tex = (Tex*)id;
+ BKE_previewimg_free(&tex->preview);
+ } else if (GS(id->name) == ID_WO) {
+ World *wo = (World*)id;
+ BKE_previewimg_free(&wo->preview);
+ } else if (GS(id->name) == ID_LA) {
+ Lamp *la = (Lamp*)id;
+ BKE_previewimg_free(&la->preview);
+ } else if (GS(id->name) == ID_IM) {
+ Image *img = (Image*)id;
+ BKE_previewimg_free(&img->preview);
+ }
+}
+
+PreviewImage* BKE_previewimg_get(ID *id)
+{
+ PreviewImage* prv_img = NULL;
+
+ if (GS(id->name) == ID_MA) {
+ Material *mat = (Material*)id;
+ if (!mat->preview) mat->preview = BKE_previewimg_create();
+ prv_img = mat->preview;
+ } else if (GS(id->name) == ID_TE) {
+ Tex *tex = (Tex*)id;
+ if (!tex->preview) tex->preview = BKE_previewimg_create();
+ prv_img = tex->preview;
+ } else if (GS(id->name) == ID_WO) {
+ World *wo = (World*)id;
+ if (!wo->preview) wo->preview = BKE_previewimg_create();
+ prv_img = wo->preview;
+ } else if (GS(id->name) == ID_LA) {
+ Lamp *la = (Lamp*)id;
+ if (!la->preview) la->preview = BKE_previewimg_create();
+ prv_img = la->preview;
+ } else if (GS(id->name) == ID_IM) {
+ Image *img = (Image*)id;
+ if (!img->preview) img->preview = BKE_previewimg_create();
+ prv_img = img->preview;
+ }
+
+ return prv_img;
+}
void BKE_icon_changed(int id)
{
@@ -122,7 +220,15 @@ void BKE_icon_changed(int id)
if (icon)
{
- icon->changed = 1;
+ PreviewImage *prv = BKE_previewimg_get((ID*)icon->obj);
+
+ /* all previews changed */
+ if (prv) {
+ int i;
+ for (i=0; i<PREVIEW_MIPMAPS; ++i) {
+ prv->changed[i] = 1;
+ }
+ }
}
}
@@ -151,7 +257,6 @@ int BKE_icon_getid(struct ID* id)
/* next two lines make sure image gets created */
new_icon->drawinfo = 0;
new_icon->drawinfo_free = 0;
- new_icon->changed = 1;
BLI_ghash_insert(gIcons, (void *)id->icon_id, new_icon);
diff --git a/source/blender/blenkernel/intern/idprop.c b/source/blender/blenkernel/intern/idprop.c
index 4ff4073fdbe..bf2a3aae11a 100644
--- a/source/blender/blenkernel/intern/idprop.c
+++ b/source/blender/blenkernel/intern/idprop.c
@@ -104,6 +104,31 @@ void IDP_ResizeArray(IDProperty *prop, int newlen)
MEM_freeN(prop->data.pointer);
}
+
+ static IDProperty *idp_generic_copy(IDProperty *prop)
+ {
+ IDProperty *newp = MEM_callocN(sizeof(IDProperty), "IDProperty array dup");
+
+ strncpy(newp->name, prop->name, MAX_IDPROP_NAME);
+ newp->type = prop->type;
+ newp->flag = prop->flag;
+ newp->data.val = prop->data.val;
+
+ return newp;
+ }
+
+IDProperty *IDP_CopyArray(IDProperty *prop)
+{
+ IDProperty *newp = idp_generic_copy(prop);
+
+ if (prop->data.pointer) newp->data.pointer = MEM_dupallocN(prop->data.pointer);
+ newp->len = prop->len;
+ newp->subtype = prop->subtype;
+ newp->totallen = prop->totallen;
+
+ return newp;
+}
+
/*taken from readfile.c*/
#define SWITCH_LONGINT(a) { \
char s_i, *p_i; \
@@ -116,6 +141,19 @@ void IDP_ResizeArray(IDProperty *prop, int newlen)
/* ---------- String Type ------------ */
+IDProperty *IDP_CopyString(IDProperty *prop)
+{
+ IDProperty *newp = idp_generic_copy(prop);
+
+ if (prop->data.pointer) newp->data.pointer = MEM_dupallocN(prop->data.pointer);
+ newp->len = prop->len;
+ newp->subtype = prop->subtype;
+ newp->totallen = prop->totallen;
+
+ return newp;
+}
+
+
void IDP_AssignString(IDProperty *prop, char *st)
{
int stlen;
@@ -154,7 +192,7 @@ void IDP_FreeString(IDProperty *prop)
}
-/*-------- ID Type -------*/
+/*-------- ID Type, not in use yet -------*/
void IDP_LinkID(IDProperty *prop, ID *id)
{
@@ -171,6 +209,17 @@ void IDP_UnlinkID(IDProperty *prop)
/*-------- Group Functions -------*/
/*checks if a property with the same name as prop exists, and if so replaces it.*/
+IDProperty *IDP_CopyGroup(IDProperty *prop)
+{
+ IDProperty *newp = idp_generic_copy(prop), *link;
+
+ for (link=prop->data.group.first; link; link=link->next) {
+ BLI_addtail(&newp->data.group, IDP_CopyProperty(link));
+ }
+
+ return newp;
+}
+
void IDP_ReplaceInGroup(IDProperty *group, IDProperty *prop)
{
IDProperty *loop;
@@ -274,6 +323,7 @@ void IDP_FreeGroup(IDProperty *prop)
for (loop=prop->data.group.first; loop; loop=next)
{
next = loop->next;
+ BLI_remlink(&prop->data.group, loop);
IDP_FreeProperty(loop);
MEM_freeN(loop);
}
@@ -281,6 +331,15 @@ void IDP_FreeGroup(IDProperty *prop)
/*-------- Main Functions --------*/
+IDProperty *IDP_CopyProperty(IDProperty *prop)
+{
+ switch (prop->type) {
+ case IDP_GROUP: return IDP_CopyGroup(prop);
+ case IDP_STRING: return IDP_CopyString(prop);
+ case IDP_ARRAY: return IDP_CopyArray(prop);
+ default: return idp_generic_copy(prop);
+ }
+}
IDProperty *IDP_GetProperties(ID *id, int create_if_needed)
{
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 21fa38fd83d..bb60c221839 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -52,6 +52,7 @@
#include "DNA_image_types.h"
#include "DNA_packedFile_types.h"
#include "DNA_scene_types.h"
+#include "DNA_camera_types.h"
#include "DNA_texture_types.h"
#include "DNA_userdef_types.h"
@@ -70,6 +71,8 @@
#include "BKE_texture.h"
#include "BKE_utildefines.h"
+#include "BIF_editseq.h"
+
#include "PIL_time.h"
#include "RE_pipeline.h"
@@ -77,6 +80,12 @@
/* bad level; call to free_realtime_image */
#include "BKE_bad_level_calls.h"
+/* for stamp drawing to an image */
+#include "BMF_Api.h"
+
+#include "blendef.h"
+#include "BSE_time.h"
+
/* max int, to indicate we don't store sequences in ibuf */
#define IMA_NO_INDEX 0x7FEFEFEF
@@ -206,12 +215,6 @@ static void image_free_buffers(Image *ima)
if(ima->anim) IMB_free_anim(ima->anim);
ima->anim= NULL;
- if (ima->preview) {
- MEM_freeN(ima->preview->rect);
- MEM_freeN(ima->preview);
- ima->preview = NULL;
- }
-
if(ima->rr) {
RE_FreeRenderResult(ima->rr);
ima->rr= NULL;
@@ -233,6 +236,10 @@ void free_image(Image *ima)
}
BKE_icon_delete(&ima->id);
ima->id.icon_id = 0;
+ if (ima->preview) {
+ BKE_previewimg_free(&ima->preview);
+ }
+
}
/* only image block itself */
@@ -245,6 +252,7 @@ static Image *image_alloc(const char *name, short source, short type)
ima->ok= IMA_OK;
ima->xrep= ima->yrep= 1;
+ ima->aspx= ima->aspy= 1.0;
ima->gen_x= 256; ima->gen_y= 256;
ima->gen_type= 1; /* no defines yet? */
@@ -335,7 +343,7 @@ Image *BKE_add_image_file(const char *name)
/* first search an identical image */
for(ima= G.main->image.first; ima; ima= ima->id.next) {
- if(ima->source!=IMA_SRC_VIEWER) {
+ if(ima->source!=IMA_SRC_VIEWER && ima->source!=IMA_SRC_GENERATED) {
BLI_strncpy(strtest, ima->name, sizeof(ima->name));
BLI_convertstringcode(strtest, G.sce, G.scene->r.cfra);
@@ -633,6 +641,10 @@ int BKE_imtype_to_ftype(int imtype)
return RADHDR;
else if (imtype==R_PNG)
return PNG;
+#ifdef WITH_DDS
+ else if (imtype==R_DDS)
+ return DDS;
+#endif
else if (imtype==R_BMP)
return BMP;
else if (imtype==R_TIFF)
@@ -663,6 +675,10 @@ int BKE_ftype_to_imtype(int ftype)
return R_RADHDR;
else if (ftype & PNG)
return R_PNG;
+#ifdef WITH_DDS
+ else if (ftype & DDS)
+ return R_DDS;
+#endif
else if (ftype & BMP)
return R_BMP;
else if (ftype & TIF)
@@ -719,6 +735,12 @@ void BKE_add_image_extension(char *string, int imtype)
if(!BLI_testextensie(string, ".png"))
extension= ".png";
}
+#ifdef WITH_DDS
+ else if(imtype==R_DDS) {
+ if(!BLI_testextensie(string, ".dds"))
+ extension= ".dds";
+ }
+#endif
else if(imtype==R_RAWTGA) {
if(!BLI_testextensie(string, ".tga"))
extension= ".tga";
@@ -757,6 +779,278 @@ void BKE_add_image_extension(char *string, int imtype)
strcat(string, extension);
}
+/* could allow access externally - 512 is for long names, 64 is for id names */
+typedef struct StampData {
+ char file[512];
+ char note[512];
+ char date[512];
+ char marker[512];
+ char time[512];
+ char frame[512];
+ char camera[64];
+ char scene[64];
+ char strip[64];
+} StampData;
+
+static void stampdata(StampData *stamp_data, int do_prefix)
+{
+ char text[256];
+
+#ifndef WIN32
+ struct tm *tl;
+ time_t t;
+#else
+ char sdate[9];
+#endif /* WIN32 */
+
+ if (G.scene->r.stamp & R_STAMP_FILENAME) {
+ if (do_prefix) sprintf(stamp_data->file, "File %s", G.sce);
+ else sprintf(stamp_data->file, "%s", G.sce);
+ stamp_data->note[0] = '\0';
+ } else {
+ stamp_data->file[0] = '\0';
+ }
+
+ if (G.scene->r.stamp & R_STAMP_NOTE) {
+ if (do_prefix) sprintf(stamp_data->note, "Note %s", G.scene->r.stamp_udata);
+ else sprintf(stamp_data->note, "%s", G.scene->r.stamp_udata);
+ } else {
+ stamp_data->note[0] = '\0';
+ }
+
+ if (G.scene->r.stamp & R_STAMP_DATE) {
+#ifdef WIN32
+ _strdate (sdate);
+ sprintf (text, "%s", sdate);
+#else
+ t = time (NULL);
+ tl = localtime (&t);
+ sprintf (text, "%04d-%02d-%02d", tl->tm_year+1900, tl->tm_mon+1, tl->tm_mday);
+#endif /* WIN32 */
+ if (do_prefix) sprintf(stamp_data->date, "Date %s", text);
+ else sprintf(stamp_data->date, "%s", text);
+ } else {
+ stamp_data->date[0] = '\0';
+ }
+
+ if (G.scene->r.stamp & R_STAMP_MARKER) {
+ TimeMarker *marker = get_frame_marker(CFRA);
+
+ if (marker) strcpy(text, marker->name);
+ else strcpy(text, "<none>");
+
+ if (do_prefix) sprintf(stamp_data->marker, "Marker %s", text);
+ else sprintf(stamp_data->marker, "%s", text);
+ } else {
+ stamp_data->marker[0] = '\0';
+ }
+
+ if (G.scene->r.stamp & R_STAMP_TIME) {
+ int h, m, s, f;
+ h= m= s= f= 0;
+ f = (int)(G.scene->r.cfra % G.scene->r.frs_sec);
+ s = (int)(G.scene->r.cfra / G.scene->r.frs_sec);
+
+ if (s) {
+ m = (int)(s / 60);
+ s %= 60;
+
+ if (m) {
+ h = (int)(m / 60);
+ m %= 60;
+ }
+ }
+
+ if (G.scene->r.frs_sec < 100)
+ sprintf (text, "%02d:%02d:%02d.%02d", h, m, s, f);
+ else
+ sprintf (text, "%02d:%02d:%02d.%03d", h, m, s, f);
+
+ if (do_prefix) sprintf(stamp_data->time, "Time %s", text);
+ else sprintf(stamp_data->time, "%s", text);
+ } else {
+ stamp_data->time[0] = '\0';
+ }
+
+ if (G.scene->r.stamp & R_STAMP_FRAME) {
+ char format[32];
+ if (do_prefix) sprintf(format, "Frame %%0%di\n", 1 + (int) log10(G.scene->r.efra));
+ else sprintf(format, "%%0%di\n", 1 + (int) log10(G.scene->r.efra));
+ sprintf (stamp_data->frame, format, G.scene->r.cfra);
+ } else {
+ stamp_data->frame[0] = '\0';
+ }
+
+ if (G.scene->r.stamp & R_STAMP_CAMERA) {
+ if (do_prefix) sprintf(stamp_data->camera, "Camera %s", ((Camera *) G.scene->camera)->id.name+2);
+ else sprintf(stamp_data->camera, "%s", ((Camera *) G.scene->camera)->id.name+2);
+ } else {
+ stamp_data->camera[0] = '\0';
+ }
+
+ if (G.scene->r.stamp & R_STAMP_SCENE) {
+ if (do_prefix) sprintf(stamp_data->scene, "Scene %s", G.scene->id.name+2);
+ else sprintf(stamp_data->scene, "%s", G.scene->id.name+2);
+ } else {
+ stamp_data->scene[0] = '\0';
+ }
+
+ if (G.scene->r.stamp & R_STAMP_SEQSTRIP) {
+ Sequence *seq = get_forground_frame_seq(CFRA);
+
+ if (seq) strcpy(text, seq->name+2);
+ else strcpy(text, "<none>");
+
+ if (do_prefix) sprintf(stamp_data->strip, "Strip %s", text);
+ else sprintf(stamp_data->strip, "%s", text);
+ } else {
+ stamp_data->strip[0] = '\0';
+ }
+}
+
+void BKE_stamp_buf(unsigned char *rect, float *rectf, int width, int height)
+{
+ struct StampData stamp_data;
+
+ int x=1,y=1;
+ int font_height;
+ int text_width;
+ int text_pad;
+ struct BMF_Font *font;
+
+ if (!rect && !rectf)
+ return;
+
+ stampdata(&stamp_data, 1);
+
+ switch (G.scene->r.stamp_font_id) {
+ case 1: /* tiny */
+ font = BMF_GetFont(BMF_kHelveticaBold8);
+ break;
+ case 2: /* small */
+ font = BMF_GetFont(BMF_kHelveticaBold10);
+ break;
+ case 3: /* medium */
+ font = BMF_GetFont(BMF_kScreen12);
+ break;
+ case 0: /* large - default */
+ font = BMF_GetFont(BMF_kScreen15);
+ break;
+ case 4: /* huge */
+ font = BMF_GetFont(BMF_kHelveticaBold14);
+ break;
+ default:
+ font = NULL;
+ break;
+ }
+
+ font_height = BMF_GetFontHeight(font);
+ /* All texts get halfspace+1 pixel on each side and 1 pix
+ above and below as padding against their backing rectangles */
+ text_pad = BMF_GetStringWidth(font, " ");
+
+ x = 1; /* Inits for everyone, text position, so 1 for padding, not 0 */
+ y = height - font_height - 1; /* Also inits for everyone, notice padding pixel */
+
+ if (stamp_data.file[0]) {
+ /* Top left corner */
+ text_width = BMF_GetStringWidth(font, stamp_data.file);
+ buf_rectfill_area(rect, rectf, width, height, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
+ BMF_DrawStringBuf(font, stamp_data.file, x+(text_pad/2), y, G.scene->r.fg_stamp, rect, rectf, width, height);
+ y -= font_height+2; /* Top and bottom 1 pix padding each */
+ }
+
+ /* Top left corner, below File */
+ if (stamp_data.note[0]) {
+ text_width = BMF_GetStringWidth(font, stamp_data.note);
+ buf_rectfill_area(rect, rectf, width, height, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
+ BMF_DrawStringBuf(font, stamp_data.note, x+(text_pad/2), y, G.scene->r.fg_stamp, rect, rectf, width, height);
+ y -= font_height+2; /* Top and bottom 1 pix padding each */
+ }
+
+ /* Top left corner, below File (or Note) */
+ if (stamp_data.date[0]) {
+ text_width = BMF_GetStringWidth(font, stamp_data.date);
+ buf_rectfill_area(rect, rectf, width, height, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
+ BMF_DrawStringBuf(font, stamp_data.date, x+(text_pad/2), y, G.scene->r.fg_stamp, rect, rectf, width, height);
+ }
+
+ /* Bottom left corner, leaving space for timing */
+ if (stamp_data.marker[0]) {
+ x = 1;
+ y = font_height+2+1; /* 2 for padding in TIME|FRAME fields below and 1 for padding in this one */
+ text_width = BMF_GetStringWidth(font, stamp_data.marker);
+ buf_rectfill_area(rect, rectf, width, height, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
+ BMF_DrawStringBuf(font, stamp_data.marker, x+(text_pad/2), y, G.scene->r.fg_stamp, rect, rectf, width, height);
+ }
+
+ /* Left bottom corner */
+ if (stamp_data.time[0]) {
+ x = 1;
+ y = 1;
+ text_width = BMF_GetStringWidth(font, stamp_data.time);
+ buf_rectfill_area(rect, rectf, width, height, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
+ BMF_DrawStringBuf(font, stamp_data.time, x+(text_pad/2), y, G.scene->r.fg_stamp, rect, rectf, width, height);
+ x += text_width+text_pad+2; /* Both sides have 1 pix additional padding each */
+ }
+
+ if (stamp_data.frame[0]) {
+ text_width = BMF_GetStringWidth(font, stamp_data.frame);
+ /* Left bottom corner (after SMPTE if exists) */
+ if (!stamp_data.time[0]) x = 1;
+ y = 1;
+ buf_rectfill_area(rect, rectf, width, height, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
+ BMF_DrawStringBuf(font, stamp_data.frame, x+(text_pad/2), y, G.scene->r.fg_stamp, rect, rectf, width, height);
+ }
+
+ if (stamp_data.camera[0]) {
+ text_width = BMF_GetStringWidth(font, stamp_data.camera);
+ /* Center of bottom edge */
+ x = (width/2) - (BMF_GetStringWidth(font, stamp_data.camera)/2);
+ y = 1;
+ buf_rectfill_area(rect, rectf, width, height, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
+ BMF_DrawStringBuf(font, stamp_data.camera, x+(text_pad/2), y, G.scene->r.fg_stamp, rect, rectf, width, height);
+ }
+
+ if (stamp_data.scene[0]) {
+ text_width = BMF_GetStringWidth(font, stamp_data.scene);
+ /* Bottom right corner */
+ x = width - (text_width+1+text_pad);
+ y = 1;
+ buf_rectfill_area(rect, rectf, width, height, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
+ BMF_DrawStringBuf(font, stamp_data.scene, x+(text_pad/2), y, G.scene->r.fg_stamp, rect, rectf, width, height);
+ }
+
+ if (stamp_data.strip[0]) {
+ text_width = BMF_GetStringWidth(font, stamp_data.strip);
+ /* Top right corner */
+ x = width - (text_width+1+text_pad);
+ y = height - font_height - 1;
+ buf_rectfill_area(rect, rectf, width, height, G.scene->r.bg_stamp, x-1, y-1, x+text_width+text_pad+1, y+font_height+1);
+ BMF_DrawStringBuf(font, stamp_data.strip, x+(text_pad/2), y, G.scene->r.fg_stamp, rect, rectf, width, height);
+ }
+
+}
+
+void BKE_stamp_info(struct ImBuf *ibuf)
+{
+ struct StampData stamp_data;
+
+ if (!ibuf) return;
+
+ /* fill all the data values, no prefix */
+ stampdata(&stamp_data, 0);
+
+ if (stamp_data.file[0]) IMB_imginfo_change_field (ibuf, "File", stamp_data.file);
+ if (stamp_data.note[0]) IMB_imginfo_change_field (ibuf, "Note", stamp_data.note);
+ if (stamp_data.date[0]) IMB_imginfo_change_field (ibuf, "Date", stamp_data.date);
+ if (stamp_data.marker[0]) IMB_imginfo_change_field (ibuf, "Marker", stamp_data.marker);
+ if (stamp_data.time[0]) IMB_imginfo_change_field (ibuf, "Time", stamp_data.time);
+ if (stamp_data.frame[0]) IMB_imginfo_change_field (ibuf, "Frame", stamp_data.frame);
+ if (stamp_data.camera[0]) IMB_imginfo_change_field (ibuf, "Camera", stamp_data.camera);
+ if (stamp_data.scene[0]) IMB_imginfo_change_field (ibuf, "Scene", stamp_data.scene);
+ if (stamp_data.strip[0]) IMB_imginfo_change_field (ibuf, "Strip", stamp_data.strip);
+}
int BKE_write_ibuf(ImBuf *ibuf, char *name, int imtype, int subimtype, int quality)
{
@@ -771,6 +1065,11 @@ int BKE_write_ibuf(ImBuf *ibuf, char *name, int imtype, int subimtype, int quali
else if ((imtype==R_PNG)) {
ibuf->ftype= PNG;
}
+#ifdef WITH_DDS
+ else if ((imtype==R_DDS)) {
+ ibuf->ftype= DDS;
+ }
+#endif
else if ((imtype==R_BMP)) {
ibuf->ftype= BMP;
}
@@ -812,6 +1111,9 @@ int BKE_write_ibuf(ImBuf *ibuf, char *name, int imtype, int subimtype, int quali
}
BLI_make_existing_file(name);
+
+ if(G.scene->r.scemode & R_STAMP_INFO)
+ BKE_stamp_info(ibuf);
ok = IMB_saveiff(ibuf, name, IB_rect | IB_zbuf | IB_zbuffloat);
if (ok == 0) {
@@ -1236,7 +1538,7 @@ static ImBuf *image_load_image_file(Image *ima, ImageUser *iuser, int cfra)
BLI_convertstringcode(str, G.sce, cfra);
/* read ibuf */
- ibuf = IMB_loadiffname(str, IB_rect|IB_multilayer);
+ ibuf = IMB_loadiffname(str, IB_rect|IB_multilayer|IB_imginfo);
}
if (ibuf) {
diff --git a/source/blender/blenkernel/intern/ipo.c b/source/blender/blenkernel/intern/ipo.c
index 08924ac96d5..03a34df090a 100644
--- a/source/blender/blenkernel/intern/ipo.c
+++ b/source/blender/blenkernel/intern/ipo.c
@@ -52,6 +52,7 @@
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
+#include "DNA_particle_types.h"
#include "DNA_sequence_types.h"
#include "DNA_scene_types.h"
#include "DNA_sound_types.h"
@@ -85,7 +86,7 @@
*/
int co_ar[CO_TOTIPO]= {
- CO_ENFORCE
+ CO_ENFORCE, CO_HEADTAIL
};
int ob_ar[OB_TOTIPO]= {
@@ -93,7 +94,7 @@ int ob_ar[OB_TOTIPO]= {
OB_ROT_X, OB_ROT_Y, OB_ROT_Z, OB_DROT_X, OB_DROT_Y, OB_DROT_Z,
OB_SIZE_X, OB_SIZE_Y, OB_SIZE_Z, OB_DSIZE_X, OB_DSIZE_Y, OB_DSIZE_Z,
OB_LAY, OB_TIME, OB_COL_R, OB_COL_G, OB_COL_B, OB_COL_A,
- OB_PD_FSTR, OB_PD_FFALL, OB_PD_SDAMP, OB_PD_RDAMP, OB_PD_PERM
+ OB_PD_FSTR, OB_PD_FFALL, OB_PD_SDAMP, OB_PD_RDAMP, OB_PD_PERM, OB_PD_FMAXD
};
int ac_ar[AC_TOTIPO]= {
@@ -180,6 +181,12 @@ int fluidsim_ar[FLUIDSIM_TOTIPO]= {
FLUIDSIM_ACTIVE
};
+int part_ar[PART_TOTIPO]= {
+ PART_EMIT_FREQ, PART_EMIT_LIFE, PART_EMIT_VEL, PART_EMIT_AVE, PART_EMIT_SIZE,
+ PART_AVE, PART_SIZE, PART_DRAG, PART_BROWN, PART_DAMP, PART_LENGTH, PART_CLUMP,
+ PART_GRAV_X, PART_GRAV_Y, PART_GRAV_Z, PART_KINK_AMP, PART_KINK_FREQ, PART_KINK_SHAPE,
+ PART_BB_TILT
+};
float frame_to_float(int cfra) /* see also bsystem_time in object.c */
@@ -751,6 +758,46 @@ void berekenx(float *f, float *o, int b)
}
}
+#define TFM_WITHOUT_BONE 1
+
+static void posechannel_get_local_transform(bPoseChannel *pchan, float *quat, float *eul, float *size, int flag)
+{
+ float pose_mat[3][3];
+ float diff_mat[3][3], ipar_mat[3][3];
+
+ /* we need the local transform = current transform - (parent transform + bone transform) */
+
+ Mat3CpyMat4(pose_mat, pchan->pose_mat);
+
+ if (pchan->parent) {
+
+ if(flag & TFM_WITHOUT_BONE) {
+ float par_mat[3][3];
+ Mat3CpyMat4(par_mat, pchan->parent->pose_mat);
+ Mat3MulMat3(diff_mat, par_mat, pchan->bone->bone_mat);
+ }
+ else
+ Mat3CpyMat4(diff_mat, pchan->parent->pose_mat);
+
+ Mat3Inv(ipar_mat, diff_mat);
+ }
+ else {
+ if(flag & TFM_WITHOUT_BONE)
+ Mat3Inv(ipar_mat, pchan->bone->bone_mat);
+ else
+ Mat3One(ipar_mat);
+ }
+
+ Mat3MulMat3(diff_mat, ipar_mat, pose_mat);
+
+ if(quat)
+ Mat3ToQuat(diff_mat, quat);
+ if(eul)
+ Mat3ToEul(diff_mat, eul);
+ if(size)
+ Mat3ToSize(diff_mat, size);
+}
+
/* has to return a float value */
static float eval_driver(IpoDriver *driver, float ipotime)
{
@@ -802,48 +849,51 @@ static float eval_driver(IpoDriver *driver, float ipotime)
else { /* ID_AR */
bPoseChannel *pchan= get_pose_channel(ob->pose, driver->name);
if(pchan && pchan->bone) {
- float pose_mat[3][3];
- float diff_mat[3][3], par_mat[3][3], ipar_mat[3][3];
- float eul[3], size[3];
-
- /* we need the local transform = current transform - (parent transform + bone transform) */
-
- Mat3CpyMat4(pose_mat, pchan->pose_mat);
- if (pchan->parent) {
- Mat3CpyMat4(par_mat, pchan->parent->pose_mat);
- Mat3MulMat3(diff_mat, par_mat, pchan->bone->bone_mat);
-
- Mat3Inv(ipar_mat, diff_mat);
+ /* rotation difference is not a simple driver (i.e. value drives value), but the angle between 2 bones is driving stuff... which is useful */
+ if(driver->adrcode==OB_ROT_DIFF) {
+ bPoseChannel *pchan2= get_pose_channel(ob->pose, driver->name+DRIVER_NAME_OFFS);
+ if(pchan2 && pchan2->bone) {
+ float q1[4], q2[4], quat[4], angle;
+
+ Mat4ToQuat(pchan->pose_mat, q1);
+ Mat4ToQuat(pchan2->pose_mat, q2);
+ // posechannel_get_local_transform(pchan , q1, NULL, NULL, 0);
+ // posechannel_get_local_transform(pchan2, q2, NULL, NULL, 0);
+
+ QuatInv(q1);
+ QuatMul(quat, q1, q2);
+ angle = 2.0f * (saacos(quat[0]));
+ angle= ABS(angle);
+
+ return angle>M_PI?2.0f*M_PI-angle:angle;
+ }
}
else {
- Mat3Inv(ipar_mat, pchan->bone->bone_mat);
- }
-
- Mat3MulMat3(diff_mat, ipar_mat, pose_mat);
-
- Mat3ToEul(diff_mat, eul);
- Mat3ToSize(diff_mat, size);
-
- switch(driver->adrcode) {
- case OB_LOC_X:
- return pchan->loc[0];
- case OB_LOC_Y:
- return pchan->loc[1];
- case OB_LOC_Z:
- return pchan->loc[2];
- case OB_ROT_X:
- return eul[0]/(M_PI_2/9.0);
- case OB_ROT_Y:
- return eul[1]/(M_PI_2/9.0);
- case OB_ROT_Z:
- return eul[2]/(M_PI_2/9.0);
- case OB_SIZE_X:
- return size[0];
- case OB_SIZE_Y:
- return size[1];
- case OB_SIZE_Z:
- return size[2];
+ float eul[3], size[3];
+
+ posechannel_get_local_transform(pchan, NULL, eul, size, TFM_WITHOUT_BONE);
+
+ switch(driver->adrcode) {
+ case OB_LOC_X:
+ return pchan->loc[0];
+ case OB_LOC_Y:
+ return pchan->loc[1];
+ case OB_LOC_Z:
+ return pchan->loc[2];
+ case OB_ROT_X:
+ return eul[0]/(M_PI_2/9.0);
+ case OB_ROT_Y:
+ return eul[1]/(M_PI_2/9.0);
+ case OB_ROT_Z:
+ return eul[2]/(M_PI_2/9.0);
+ case OB_SIZE_X:
+ return size[0];
+ case OB_SIZE_Y:
+ return size[1];
+ case OB_SIZE_Z:
+ return size[2];
+ }
}
}
}
@@ -995,10 +1045,13 @@ void calc_ipo(Ipo *ipo, float ctime)
IpoCurve *icu;
if(ipo==NULL) return;
+ if(ipo->muteipo) return;
for(icu= ipo->curve.first; icu; icu= icu->next) {
- if(icu->driver || (icu->flag & IPO_LOCK)==0)
- calc_icu(icu, ctime);
+ if(icu->driver || (icu->flag & IPO_LOCK)==0) {
+ if((icu->flag & IPO_MUTE)==0)
+ calc_icu(icu, ctime);
+ }
}
}
@@ -1185,6 +1238,7 @@ void *get_ipo_poin(ID *id, IpoCurve *icu, int *type)
Lamp *la;
Sequence *seq;
World *wo;
+ ParticleSettings *part;
*type= IPO_FLOAT;
@@ -1262,6 +1316,9 @@ void *get_ipo_poin(ID *id, IpoCurve *icu, int *type)
case OB_PD_PERM:
if(ob->pd) poin= &(ob->pd->pdef_perm);
break;
+ case OB_PD_FMAXD:
+ if(ob->pd) poin= &(ob->pd->maxdist);
+ break;
}
}
else if( GS(id->name)==ID_MA) {
@@ -1514,13 +1571,54 @@ void *get_ipo_poin(ID *id, IpoCurve *icu, int *type)
poin= &(snd->attenuation); break;
}
}
-
+ else if( GS(id->name)==ID_PA) {
+
+ part= (ParticleSettings *)id;
+
+ switch(icu->adrcode) {
+ case PART_EMIT_FREQ:
+ case PART_EMIT_LIFE:
+ case PART_EMIT_VEL:
+ case PART_EMIT_AVE:
+ case PART_EMIT_SIZE:
+ poin= NULL; break;
+ case PART_CLUMP:
+ poin= &(part->clumpfac); break;
+ case PART_AVE:
+ poin= &(part->avefac); break;
+ case PART_SIZE:
+ poin= &(part->size); break;
+ case PART_DRAG:
+ poin= &(part->dragfac); break;
+ case PART_BROWN:
+ poin= &(part->brownfac); break;
+ case PART_DAMP:
+ poin= &(part->dampfac); break;
+ case PART_LENGTH:
+ poin= &(part->length); break;
+ case PART_GRAV_X:
+ poin= &(part->acc[0]); break;
+ case PART_GRAV_Y:
+ poin= &(part->acc[1]); break;
+ case PART_GRAV_Z:
+ poin= &(part->acc[2]); break;
+ case PART_KINK_AMP:
+ poin= &(part->kink_amp); break;
+ case PART_KINK_FREQ:
+ poin= &(part->kink_freq); break;
+ case PART_KINK_SHAPE:
+ poin= &(part->kink_shape); break;
+ case PART_BB_TILT:
+ poin= &(part->bb_tilt); break;
+ }
+ }
+
return poin;
}
void set_icu_vars(IpoCurve *icu)
{
-
+ /* defaults. 0.0 for y-extents makes these ignored */
icu->ymin= icu->ymax= 0.0;
icu->ipo= IPO_BEZ;
@@ -1809,6 +1907,37 @@ void set_icu_vars(IpoCurve *icu)
break;
}
}
+ else if(icu->blocktype==ID_PA){
+
+ switch(icu->adrcode) {
+ case PART_EMIT_LIFE:
+ case PART_SIZE:
+ case PART_KINK_FREQ:
+ case PART_EMIT_VEL:
+ case PART_EMIT_AVE:
+ case PART_EMIT_SIZE:
+ icu->ymin= 0.0;
+ break;
+ case PART_CLUMP:
+ case PART_DRAG:
+ case PART_DAMP:
+ case PART_LENGTH:
+ icu->ymin= 0.0;
+ icu->ymax= 1.0;
+ break;
+ case PART_KINK_SHAPE:
+ icu->ymin= -0.999;
+ icu->ymax= 0.999;
+ }
+ }
+ else if(icu->blocktype==ID_CO) {
+ icu->ymin= 0.0;
+ icu->ymax= 1.0f;
+ }
+
+ /* by default, slider limits will be icu->ymin and icu->ymax */
+ icu->slide_min= icu->ymin;
+ icu->slide_max= icu->ymax;
}
/* not for actions or constraints! */
@@ -1997,7 +2126,7 @@ void do_ob_ipo(Object *ob)
/* do not set ob->ctime here: for example when parent in invisible layer */
- ctime= bsystem_time(ob, 0, (float) G.scene->r.cfra, 0.0);
+ ctime= bsystem_time(ob, (float) G.scene->r.cfra, 0.0);
calc_ipo(ob->ipo, ctime);
@@ -2271,6 +2400,7 @@ void make_cfra_list(Ipo *ipo, ListBase *elems)
case OB_PD_SDAMP:
case OB_PD_RDAMP:
case OB_PD_PERM:
+ case OB_PD_FMAXD:
bezt= icu->bezt;
if(bezt) {
a= icu->totvert;
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 345bc522449..234a096edce 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -680,11 +680,15 @@ static void do_rel_key(int start, int end, int tot, char *basispoin, Key *key, i
/* only with value, and no difference allowed */
if(icuval!=0.0f && kb->totelem==tot) {
+ KeyBlock *refb;
float weight, *weights= kb->weights;
poin= basispoin;
- reffrom= key->refkey->data;
from= kb->data;
+ /* reference now can be any block */
+ refb= BLI_findlink(&key->block, kb->relative);
+ if(refb==NULL) continue;
+ reffrom= refb->data;
poin+= start*ofs[0];
reffrom+= key->elemsize*start; // key elemsize yes!
@@ -1025,7 +1029,7 @@ static int do_mesh_key(Object *ob, Mesh *me)
for(a=0; a<me->totvert; a+=step, cfra+= delta) {
- ctime= bsystem_time(0, 0, cfra, 0.0);
+ ctime= bsystem_time(0, cfra, 0.0);
if(calc_ipo_spec(me->key->ipo, KEY_SPEED, &ctime)==0) {
ctime /= 100.0;
CLAMP(ctime, 0.0, 1.0);
@@ -1060,7 +1064,7 @@ static int do_mesh_key(Object *ob, Mesh *me)
}
}
else {
- ctime= bsystem_time(ob, 0, G.scene->r.cfra, 0.0);
+ ctime= bsystem_time(ob, G.scene->r.cfra, 0.0);
if(calc_ipo_spec(me->key->ipo, KEY_SPEED, &ctime)==0) {
ctime /= 100.0;
@@ -1180,7 +1184,7 @@ static int do_curve_key(Curve *cu)
for(a=0; a<tot; a+=step, cfra+= delta) {
- ctime= bsystem_time(0, 0, cfra, 0.0);
+ ctime= bsystem_time(0, cfra, 0.0);
if(calc_ipo_spec(cu->key->ipo, KEY_SPEED, &ctime)==0) {
ctime /= 100.0;
CLAMP(ctime, 0.0, 1.0);
@@ -1202,7 +1206,7 @@ static int do_curve_key(Curve *cu)
}
else {
- ctime= bsystem_time(NULL, 0, (float)G.scene->r.cfra, 0.0);
+ ctime= bsystem_time(NULL, (float)G.scene->r.cfra, 0.0);
if(cu->key->type==KEY_RELATIVE) {
do_rel_cu_key(cu, ctime);
@@ -1244,7 +1248,7 @@ static int do_latt_key(Object *ob, Lattice *lt)
for(a=0; a<tot; a++, cfra+= delta) {
- ctime= bsystem_time(0, 0, cfra, 0.0);
+ ctime= bsystem_time(0, cfra, 0.0);
if(calc_ipo_spec(lt->key->ipo, KEY_SPEED, &ctime)==0) {
ctime /= 100.0;
CLAMP(ctime, 0.0, 1.0);
@@ -1261,7 +1265,7 @@ static int do_latt_key(Object *ob, Lattice *lt)
}
}
else {
- ctime= bsystem_time(NULL, 0, (float)G.scene->r.cfra, 0.0);
+ ctime= bsystem_time(NULL, (float)G.scene->r.cfra, 0.0);
if(lt->key->type==KEY_RELATIVE) {
KeyBlock *kb;
@@ -1342,7 +1346,7 @@ int do_ob_key(Object *ob)
if(ob->ipoflag & OB_ACTION_KEY)
do_all_object_actions(ob);
else {
- calc_ipo(key->ipo, bsystem_time(ob, 0, G.scene->r.cfra, 0.0));
+ calc_ipo(key->ipo, bsystem_time(ob, G.scene->r.cfra, 0.0));
execute_ipo((ID *)key, key->ipo);
}
@@ -1386,3 +1390,23 @@ KeyBlock *ob_get_keyblock(Object *ob)
return NULL;
}
+
+/* get the appropriate KeyBlock given an index */
+KeyBlock *key_get_keyblock(Key *key, int index)
+{
+ KeyBlock *kb;
+ int i;
+
+ if (key) {
+ kb= key->block.first;
+
+ for (i= 1; i < key->totkey; i++) {
+ kb= kb->next;
+
+ if (index==i)
+ return kb;
+ }
+ }
+
+ return NULL;
+}
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 0163cced795..e81d3bac655 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -78,6 +78,8 @@
#include "DNA_nla_types.h"
#include "DNA_effect_types.h"
#include "DNA_brush_types.h"
+#include "DNA_particle_types.h"
+#include "BKE_particle.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
@@ -194,6 +196,8 @@ ListBase *wich_libbase(Main *mainlib, short type)
return &(mainlib->nodetree);
case ID_BR:
return &(mainlib->brush);
+ case ID_PA:
+ return &(mainlib->particle);
}
return 0;
}
@@ -254,16 +258,17 @@ int set_listbasepointers(Main *main, ListBase **lb)
lb[18]= &(main->nodetree);
lb[19]= &(main->brush);
lb[20]= &(main->script);
+ lb[21]= &(main->particle);
- lb[21]= &(main->world);
- lb[22]= &(main->screen);
- lb[23]= &(main->object);
- lb[24]= &(main->scene);
- lb[25]= &(main->library);
+ lb[22]= &(main->world);
+ lb[23]= &(main->screen);
+ lb[24]= &(main->object);
+ lb[25]= &(main->scene);
+ lb[26]= &(main->library);
- lb[26]= NULL;
+ lb[27]= NULL;
- return 26;
+ return 27;
}
/* *********** ALLOC AND FREE *****************
@@ -359,6 +364,9 @@ static ID *alloc_libblock_notest(short type)
case ID_BR:
id = MEM_callocN(sizeof(Brush), "brush");
break;
+ case ID_PA:
+ id = MEM_callocN(sizeof(ParticleSettings), "ParticleSettings");
+ break;
}
return id;
}
@@ -409,7 +417,8 @@ void *copy_libblock(void *rt)
id->newid= idn;
idn->flag |= LIB_NEW;
-
+ if (id->properties) idn->properties = IDP_CopyProperty(id->properties);
+
return idn;
}
@@ -502,6 +511,9 @@ void free_libblock(ListBase *lb, void *idv)
case ID_BR:
free_brush((Brush *)id);
break;
+ case ID_PA:
+ psys_free_settings((ParticleSettings *)id);
+ break;
}
if (id->properties) {
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index 56b8307020a..49d3021090e 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -90,6 +90,7 @@ void free_material(Material *ma)
if(ma->ramp_col) MEM_freeN(ma->ramp_col);
if(ma->ramp_spec) MEM_freeN(ma->ramp_spec);
+ BKE_previewimg_free(&ma->preview);
BKE_icon_delete((struct ID*)ma);
ma->id.icon_id = 0;
@@ -139,6 +140,12 @@ void init_material(Material *ma)
ma->tx_falloff= 1.0;
ma->shad_alpha= 1.0f;
+ ma->gloss_mir = ma->gloss_tra= 1.0;
+ ma->samp_gloss_mir = ma->samp_gloss_tra= 18;
+ ma->adapt_thresh_mir = ma->adapt_thresh_tra = 0.005;
+ ma->dist_mir = 0.0;
+ ma->fadeto_mir = MA_RAYMIR_FADETOSKY;
+
ma->rampfac_col= 1.0;
ma->rampfac_spec= 1.0;
ma->pr_lamp= 3; /* two lamps, is bits */
@@ -159,6 +166,8 @@ void init_material(Material *ma)
ma->sss_back= 1.0f;
ma->mode= MA_TRACEBLE|MA_SHADBUF|MA_SHADOW|MA_RADIO|MA_RAYBIAS|MA_TANGENT_STR;
+
+ ma->preview = NULL;
}
Material *add_material(char *name)
@@ -196,6 +205,8 @@ Material *copy_material(Material *ma)
if(ma->ramp_col) man->ramp_col= MEM_dupallocN(ma->ramp_col);
if(ma->ramp_spec) man->ramp_spec= MEM_dupallocN(ma->ramp_spec);
+ if (ma->preview) man->preview = BKE_previewimg_copy(ma->preview);
+
if(ma->nodetree) {
man->nodetree= ntreeCopyTree(ma->nodetree, 0); /* 0 == full new tree */
}
@@ -746,9 +757,9 @@ int material_in_material(Material *parmat, Material *mat)
/* ****************** */
char colname_array[125][20]= {
-"Black","DarkRed","HalveRed","Red","Red",
+"Black","DarkRed","HalfRed","Red","Red",
"DarkGreen","DarkOlive","Brown","Chocolate","OrangeRed",
-"HalveGreen","GreenOlive","DryOlive","Goldenrod","DarkOrange",
+"HalfGreen","GreenOlive","DryOlive","Goldenrod","DarkOrange",
"LightGreen","Chartreuse","YellowGreen","Yellow","Gold",
"Green","LawnGreen","GreenYellow","LightOlive","Yellow",
"DarkBlue","DarkPurple","HotPink","VioletPink","RedPink",
@@ -756,7 +767,7 @@ char colname_array[125][20]= {
"SeaGreen","PaleGreen","GreenKhaki","LightBrown","LightSalmon",
"SpringGreen","PaleGreen","MediumOlive","YellowBrown","LightGold",
"LightGreen","LightGreen","LightGreen","GreenYellow","PaleYellow",
-"HalveBlue","DarkSky","HalveMagenta","VioletRed","DeepPink",
+"HalfBlue","DarkSky","HalfMagenta","VioletRed","DeepPink",
"SteelBlue","SkyBlue","Orchid","LightHotPink","HotPink",
"SeaGreen","SlateGray","MediumGrey","Burlywood","LightPink",
"SpringGreen","Aquamarine","PaleGreen","Khaki","PaleOrange",
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 4c6bfda1517..4e551e28885 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -486,16 +486,7 @@ static float *make_orco_mesh_internal(Object *ob, int render)
/* Get appropriate vertex coordinates */
if(me->key && me->texcomesh==0 && me->key->refkey) {
- KeyBlock *kb= me->key->refkey;
- float *fp= kb->data;
- totvert= MIN2(kb->totelem, me->totvert);
- vcos = MEM_callocN(sizeof(*vcos)*me->totvert, "orco mesh");
-
- for(a=0; a<totvert; a++, fp+=3) {
- vcos[a][0]= fp[0];
- vcos[a][1]= fp[1];
- vcos[a][2]= fp[2];
- }
+ vcos= mesh_getRefKeyCos(me, &totvert);
}
else {
MultiresLevel *lvl = NULL;
@@ -933,8 +924,8 @@ void nurbs_to_mesh(Object *ob)
index= dl->index;
while(a--) {
mface->v1= startvert+index[0];
- mface->v2= startvert+index[1];
- mface->v3= startvert+index[2];
+ mface->v2= startvert+index[2];
+ mface->v3= startvert+index[1];
mface->v4= 0;
test_index_face(mface, NULL, 0, 3);
@@ -1120,9 +1111,8 @@ float (*mesh_getVertexCos(Mesh *me, int *numVerts_r))[3]
float (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "vertexcos1");
if (numVerts_r) *numVerts_r = numVerts;
- for (i=0; i<numVerts; i++) {
+ for (i=0; i<numVerts; i++)
VECCOPY(cos[i], me->mvert[i].co);
- }
return cos;
#ifdef WITH_VERSE
@@ -1130,12 +1120,24 @@ float (*mesh_getVertexCos(Mesh *me, int *numVerts_r))[3]
#endif
}
-/* UvVertMap */
+float (*mesh_getRefKeyCos(Mesh *me, int *numVerts_r))[3]
+{
+ KeyBlock *kb;
+ float (*cos)[3] = NULL;
+ int totvert;
+
+ if(me->key && me->key->refkey) {
+ if(numVerts_r) *numVerts_r= me->totvert;
+ cos= MEM_mallocN(sizeof(*cos)*me->totvert, "vertexcos1");
-struct UvVertMap {
- struct UvMapVert **vert;
- struct UvMapVert *buf;
-};
+ kb= me->key->refkey;
+ totvert= MIN2(kb->totelem, me->totvert);
+
+ memcpy(cos, kb->data, sizeof(*cos)*totvert);
+ }
+
+ return cos;
+}
UvVertMap *make_uv_vert_map(struct MFace *mface, struct MTFace *tface, unsigned int totface, unsigned int totvert, int selected, float *limit)
{
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 707f050d56e..9336dde0151 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -41,12 +41,14 @@
#include "math.h"
#include "float.h"
-#include "BLI_blenlib.h"
-#include "BLI_rand.h"
#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_kdtree.h"
#include "BLI_linklist.h"
+#include "BLI_rand.h"
#include "BLI_edgehash.h"
#include "BLI_ghash.h"
+#include "BLI_memarena.h"
#include "MEM_guardedalloc.h"
@@ -58,6 +60,7 @@
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
#include "DNA_curve_types.h"
@@ -71,20 +74,24 @@
#include "BKE_main.h"
#include "BKE_anim.h"
#include "BKE_bad_level_calls.h"
+#include "BKE_curve.h"
#include "BKE_customdata.h"
#include "BKE_global.h"
-#include "BKE_utildefines.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_DerivedMesh.h"
#include "BKE_booleanops.h"
#include "BKE_displist.h"
#include "BKE_modifier.h"
#include "BKE_lattice.h"
+#include "BKE_library.h"
#include "BKE_subsurf.h"
#include "BKE_object.h"
#include "BKE_mesh.h"
#include "BKE_softbody.h"
#include "BKE_material.h"
+#include "BKE_particle.h"
+#include "BKE_pointcache.h"
+#include "BKE_utildefines.h"
#include "depsgraph_private.h"
#include "LOD_DependKludge.h"
@@ -237,12 +244,29 @@ static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest,
}
}
+static void modifier_vgroup_cache(ModifierData *md, float (*vertexCos)[3])
+{
+ md= md->next;
+ if(md) {
+ if(md->type==eModifierType_Armature) {
+ ArmatureModifierData *amd = (ArmatureModifierData*) md;
+ if(amd->multi)
+ amd->prevCos= MEM_dupallocN(vertexCos);
+ }
+ /* lattice/mesh modifier too */
+ }
+}
+
+
static void latticeModifier_deformVerts(
ModifierData *md, Object *ob, DerivedMesh *derivedData,
float (*vertexCos)[3], int numVerts)
{
LatticeModifierData *lmd = (LatticeModifierData*) md;
+
+ modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
+
lattice_deform_verts(lmd->object, ob, derivedData,
vertexCos, numVerts, lmd->name);
}
@@ -383,7 +407,7 @@ static DerivedMesh *buildModifier_applyModifier(ModifierData *md, Object *ob,
for(i = 0; i < maxFaces; ++i) faceMap[i] = i;
if (ob) {
- frac = bsystem_time(ob, 0, (float)G.scene->r.cfra,
+ frac = bsystem_time(ob, (float)G.scene->r.cfra,
bmd->start - 1.0f) / bmd->length;
} else {
frac = G.scene->r.cfra - bmd->start / bmd->length;
@@ -1229,6 +1253,7 @@ static void mirrorModifier_initData(ModifierData *md)
mmd->flag |= MOD_MIR_AXIS_X;
mmd->tolerance = 0.001;
+ mmd->mirror_ob = NULL;
}
static void mirrorModifier_copyData(ModifierData *md, ModifierData *target)
@@ -1239,12 +1264,37 @@ static void mirrorModifier_copyData(ModifierData *md, ModifierData *target)
tmmd->axis = mmd->axis;
tmmd->flag = mmd->flag;
tmmd->tolerance = mmd->tolerance;
+ tmmd->mirror_ob = mmd->mirror_ob;;
+}
+
+static void mirrorModifier_foreachObjectLink(
+ ModifierData *md, Object *ob,
+ void (*walk)(void *userData, Object *ob, Object **obpoin),
+ void *userData)
+{
+ MirrorModifierData *mmd = (MirrorModifierData*) md;
+
+ walk(userData, ob, &mmd->mirror_ob);
+}
+
+static void mirrorModifier_updateDepgraph(ModifierData *md, DagForest *forest,
+ Object *ob, DagNode *obNode)
+{
+ MirrorModifierData *mmd = (MirrorModifierData*) md;
+
+ if(mmd->mirror_ob) {
+ DagNode *latNode = dag_get_node(forest, mmd->mirror_ob);
+
+ dag_add_relation(forest, latNode, obNode,
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA);
+ }
}
static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
- DerivedMesh *dm,
- int initFlags,
- int axis)
+ Object *ob,
+ DerivedMesh *dm,
+ int initFlags,
+ int axis)
{
int i;
float tolerance = mmd->tolerance;
@@ -1254,6 +1304,7 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
int maxEdges = dm->getNumEdges(dm);
int maxFaces = dm->getNumFaces(dm);
int (*indexMap)[2];
+ float mtx[4][4], imtx[4][4];
numVerts = numEdges = numFaces = 0;
@@ -1261,13 +1312,28 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
result = CDDM_from_template(dm, maxVerts * 2, maxEdges * 2, maxFaces * 2);
+ if (mmd->mirror_ob) {
+ float obinv[4][4];
+
+ Mat4Invert(obinv, mmd->mirror_ob->obmat);
+ Mat4MulMat4(mtx, ob->obmat, obinv);
+ Mat4Invert(imtx, mtx);
+ }
+
for(i = 0; i < maxVerts; i++) {
MVert inMV;
MVert *mv = CDDM_get_vert(result, numVerts);
int isShared;
+ float co[3];
dm->getVert(dm, i, &inMV);
- isShared = ABS(inMV.co[axis])<=tolerance;
+
+ VecCopyf(co, inMV.co);
+
+ if (mmd->mirror_ob) {
+ VecMat4MulVecfl(co, mtx, co);
+ }
+ isShared = ABS(co[axis])<=tolerance;
/* Because the topology result (# of vertices) must be the same if
* the mesh data is overridden by vertex cos, have to calc sharedness
@@ -1281,7 +1347,12 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
indexMap[i][1] = !isShared;
if(isShared) {
- mv->co[axis] = 0;
+ co[axis] = 0;
+ if (mmd->mirror_ob) {
+ VecMat4MulVecfl(co, imtx, co);
+ }
+ VecCopyf(mv->co, co);
+
mv->flag |= ME_VERT_MERGED;
} else {
MVert *mv2 = CDDM_get_vert(result, numVerts);
@@ -1290,7 +1361,11 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
*mv2 = *mv;
numVerts++;
- mv2->co[axis] = -mv2->co[axis];
+ co[axis] = -co[axis];
+ if (mmd->mirror_ob) {
+ VecMat4MulVecfl(co, imtx, co);
+ }
+ VecCopyf(mv2->co, co);
}
}
@@ -1384,23 +1459,23 @@ static DerivedMesh *doMirrorOnAxis(MirrorModifierData *mmd,
}
static DerivedMesh *mirrorModifier__doMirror(MirrorModifierData *mmd,
- DerivedMesh *dm,
+ Object *ob, DerivedMesh *dm,
int initFlags)
{
DerivedMesh *result = dm;
/* check which axes have been toggled and mirror accordingly */
if(mmd->flag & MOD_MIR_AXIS_X) {
- result = doMirrorOnAxis(mmd, result, initFlags, 0);
+ result = doMirrorOnAxis(mmd, ob, result, initFlags, 0);
}
if(mmd->flag & MOD_MIR_AXIS_Y) {
DerivedMesh *tmp = result;
- result = doMirrorOnAxis(mmd, result, initFlags, 1);
+ result = doMirrorOnAxis(mmd, ob, result, initFlags, 1);
if(tmp != dm) tmp->release(tmp); /* free intermediate results */
}
if(mmd->flag & MOD_MIR_AXIS_Z) {
DerivedMesh *tmp = result;
- result = doMirrorOnAxis(mmd, result, initFlags, 2);
+ result = doMirrorOnAxis(mmd, ob, result, initFlags, 2);
if(tmp != dm) tmp->release(tmp); /* free intermediate results */
}
@@ -1414,7 +1489,7 @@ static DerivedMesh *mirrorModifier_applyModifier(
DerivedMesh *result;
MirrorModifierData *mmd = (MirrorModifierData*) md;
- result = mirrorModifier__doMirror(mmd, derivedData, 0);
+ result = mirrorModifier__doMirror(mmd, ob, derivedData, 0);
CDDM_calc_normals(result);
@@ -2453,7 +2528,42 @@ static void split_sharp_edges(SmoothMesh *mesh, float split_angle, int flags)
}
-static void split_single_verts(SmoothMesh *mesh)
+static int count_bridge_verts(SmoothMesh *mesh)
+{
+ int i, j, count = 0;
+
+ for(i = 0; i < mesh->num_faces; i++) {
+ SmoothFace *face = &mesh->faces[i];
+
+ for(j = 0; j < SMOOTHFACE_MAX_EDGES && face->edges[j]; j++) {
+ SmoothEdge *edge = face->edges[j];
+ SmoothEdge *next_edge;
+ SmoothVert *vert = edge->verts[1 - face->flip[j]];
+ int next = (j + 1) % SMOOTHFACE_MAX_EDGES;
+
+ /* wrap next around if at last edge */
+ if(!face->edges[next]) next = 0;
+
+ next_edge = face->edges[next];
+
+ /* if there are other faces sharing this vertex but not
+ * these edges, the vertex will be split, so count it
+ */
+ /* vert has to have at least one face (this one), so faces != 0 */
+ if(!edge->faces->next && !next_edge->faces->next
+ && vert->faces->next) {
+ count++;
+ }
+ }
+ }
+
+ /* each bridge vert will be counted once per face that uses it,
+ * so count is too high, but it's ok for now
+ */
+ return count;
+}
+
+static void split_bridge_verts(SmoothMesh *mesh)
{
int i,j;
@@ -2501,6 +2611,7 @@ static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd,
/* 2. count max number of elements to add */
tag_and_count_extra_edges(mesh, emd->split_angle, emd->flags, &max_edges);
max_verts = max_edges * 2 + mesh->max_verts;
+ max_verts += count_bridge_verts(mesh);
max_edges += mesh->max_edges;
/* 3. reallocate smoothmesh arrays & copy elements across */
@@ -2518,9 +2629,8 @@ static DerivedMesh *edgesplitModifier_do(EdgeSplitModifierData *emd,
printf("********** Post-edge-split **********\n");
smoothmesh_print(mesh);
#endif
-#if 1
- split_single_verts(mesh);
-#endif
+
+ split_bridge_verts(mesh);
#ifdef EDGESPLIT_DEBUG_1
printf("********** Post-vert-split **********\n");
@@ -2577,7 +2687,14 @@ static void displaceModifier_copyData(ModifierData *md, ModifierData *target)
DisplaceModifierData *dmd = (DisplaceModifierData*) md;
DisplaceModifierData *tdmd = (DisplaceModifierData*) target;
- *tdmd = *dmd;
+ tdmd->texture = dmd->texture;
+ tdmd->strength = dmd->strength;
+ tdmd->direction = dmd->direction;
+ strncpy(tdmd->defgrp_name, dmd->defgrp_name, 32);
+ tdmd->midlevel = dmd->midlevel;
+ tdmd->texmapping = dmd->texmapping;
+ tdmd->map_object = dmd->map_object;
+ strncpy(tdmd->uvlayer_name, dmd->uvlayer_name, 32);
}
CustomDataMask displaceModifier_requiredDataMask(ModifierData *md)
@@ -4323,11 +4440,11 @@ static void waveModifier_do(
MVert *mvert = NULL;
MDeformVert *dvert = NULL;
int defgrp_index;
- float ctime = bsystem_time(ob, 0, (float)G.scene->r.cfra, 0.0);
+ float ctime = bsystem_time(ob, (float)G.scene->r.cfra, 0.0);
float minfac =
(float)(1.0 / exp(wmd->width * wmd->narrow * wmd->width * wmd->narrow));
float lifefac = wmd->height;
- float (*tex_co)[3];
+ float (*tex_co)[3] = NULL;
if(wmd->flag & MOD_WAVE_NORM && ob->type == OB_MESH)
mvert = dm->getVertArray(dm);
@@ -4570,8 +4687,16 @@ static void armatureModifier_deformVerts(
{
ArmatureModifierData *amd = (ArmatureModifierData*) md;
- armature_deform_verts(amd->object, ob, derivedData, vertexCos, numVerts,
- amd->deformflag, amd->defgrp_name);
+ modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
+
+ armature_deform_verts(amd->object, ob, derivedData, vertexCos, NULL,
+ numVerts, amd->deformflag,
+ (float(*)[3])amd->prevCos, amd->defgrp_name);
+ /* free cache */
+ if(amd->prevCos) {
+ MEM_freeN(amd->prevCos);
+ amd->prevCos= NULL;
+ }
}
static void armatureModifier_deformVertsEM(
@@ -4583,8 +4708,24 @@ static void armatureModifier_deformVertsEM(
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
- armature_deform_verts(amd->object, ob, dm, vertexCos, numVerts,
- amd->deformflag, amd->defgrp_name);
+ armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, numVerts,
+ amd->deformflag, NULL, amd->defgrp_name);
+
+ if(!derivedData) dm->release(dm);
+}
+
+static void armatureModifier_deformMatricesEM(
+ ModifierData *md, Object *ob, EditMesh *editData,
+ DerivedMesh *derivedData, float (*vertexCos)[3],
+ float (*defMats)[3][3], int numVerts)
+{
+ ArmatureModifierData *amd = (ArmatureModifierData*) md;
+ DerivedMesh *dm = derivedData;
+
+ if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
+
+ armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
+ amd->deformflag, NULL, amd->defgrp_name);
if(!derivedData) dm->release(dm);
}
@@ -4849,7 +4990,7 @@ static DerivedMesh *booleanModifier_applyModifier(
/* we do a quick sanity check */
if(((Mesh *)ob->data)->totface > 3
&& bmd->object && ((Mesh *)bmd->object->data)->totface > 3) {
- DerivedMesh *result = NewBooleanDerivedMesh(ob, bmd->object,
+ DerivedMesh *result = NewBooleanDerivedMesh(bmd->object, ob,
1 + bmd->operation);
/* if new mesh returned, return it; otherwise there was
@@ -4863,6 +5004,1513 @@ static DerivedMesh *booleanModifier_applyModifier(
return derivedData;
}
+/* Particles */
+static void particleSystemModifier_initData(ModifierData *md)
+{
+ ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
+ psmd->psys= 0;
+ psmd->dm=0;
+
+}
+static void particleSystemModifier_freeData(ModifierData *md)
+{
+ ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
+
+ if(psmd->dm){
+ psmd->dm->needsFree = 1;
+ psmd->dm->release(psmd->dm);
+ psmd->dm=0;
+ }
+
+ psmd->psys->flag &= ~PSYS_ENABLED;
+ psmd->psys->flag |= PSYS_DELETE;
+}
+static void particleSystemModifier_copyData(ModifierData *md, ModifierData *target)
+{
+ ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
+ ParticleSystemModifierData *tpsmd= (ParticleSystemModifierData*) target;
+
+ tpsmd->dm = 0;
+ //tpsmd->facepa = 0;
+ tpsmd->flag = psmd->flag;
+ /* need to keep this to recognise a bit later in copy_object */
+ tpsmd->psys = psmd->psys;
+}
+
+CustomDataMask particleSystemModifier_requiredDataMask(ModifierData *md)
+{
+ ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
+ CustomDataMask dataMask = (1 << CD_MTFACE) + (1 << CD_MEDGE);
+ int i;
+
+ /* ask for vertexgroups if we need them */
+ for(i=0; i<PSYS_TOT_VG; i++){
+ if(psmd->psys->vgroup[i]){
+ dataMask |= (1 << CD_MDEFORMVERT);
+ break;
+ }
+ }
+
+ /* particles only need this if they are after a non deform modifier, and
+ * the modifier stack will only create them in that case. */
+ dataMask |= CD_MASK_ORIGSPACE;
+
+ return dataMask;
+}
+static int is_last_displist(Object *ob)
+{
+ Curve *cu = ob->data;
+ static int curvecount=0, totcurve=0;
+
+ if(curvecount==0){
+ DispList *dl;
+
+ totcurve=0;
+ for(dl=cu->disp.first; dl; dl=dl->next){
+ totcurve++;
+ }
+ }
+
+ curvecount++;
+
+ if(curvecount==totcurve){
+ curvecount=0;
+ return 1;
+ }
+
+ return 0;
+}
+/* saves the current emitter state for a particle system and calculates particles */
+static void particleSystemModifier_deformVerts(
+ ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ float (*vertexCos)[3], int numVerts)
+{
+ DerivedMesh *dm = derivedData;
+ ParticleSystemModifierData *psmd= (ParticleSystemModifierData*) md;
+ ParticleSystem * psys=0;
+ int totvert=0,totedge=0,totface=0,needsFree=0;
+
+ if(ob->particlesystem.first)
+ psys=psmd->psys;
+ else
+ return;
+
+ if((psys->flag&PSYS_ENABLED)==0)
+ return;
+
+ if(dm==0){
+ if(ob->type==OB_MESH){
+ dm = CDDM_from_mesh((Mesh*)(ob->data), ob);
+
+ CDDM_apply_vert_coords(dm, vertexCos);
+ //CDDM_calc_normals(dm);
+
+ needsFree=1;
+ }
+ else if(ELEM3(ob->type,OB_FONT,OB_CURVE,OB_SURF)){
+ Object *tmpobj;
+ Curve *tmpcu;
+
+ if(is_last_displist(ob)){
+ /* copies object and modifiers (but not the data) */
+ tmpobj= copy_object( ob );
+ tmpcu = (Curve *)tmpobj->data;
+ tmpcu->id.us--;
+
+ /* copies the data */
+ tmpobj->data = copy_curve( (Curve *) ob->data );
+
+ makeDispListCurveTypes( tmpobj, 1 );
+ nurbs_to_mesh( tmpobj );
+
+ dm = CDDM_from_mesh((Mesh*)(tmpobj->data), tmpobj);
+ //CDDM_calc_normals(dm);
+
+ free_libblock_us( &G.main->object, tmpobj );
+
+ needsFree=1;
+ }
+ else return;
+ }
+ else return;
+ }
+
+ /* clear old dm */
+ if(psmd->dm){
+ totvert=psmd->dm->getNumVerts(psmd->dm);
+ totedge=psmd->dm->getNumEdges(psmd->dm);
+ totface=psmd->dm->getNumFaces(psmd->dm);
+ psmd->dm->needsFree = 1;
+ psmd->dm->release(psmd->dm);
+ }
+
+ /* make new dm */
+ psmd->dm=CDDM_copy(dm);
+ CDDM_calc_normals(psmd->dm);
+
+ if(needsFree){
+ dm->needsFree = 1;
+ dm->release(dm);
+ }
+
+ /* protect dm */
+ psmd->dm->needsFree = 0;
+
+ /* report change in mesh structure */
+ if(psmd->dm->getNumVerts(psmd->dm)!=totvert ||
+ psmd->dm->getNumEdges(psmd->dm)!=totedge ||
+ psmd->dm->getNumFaces(psmd->dm)!=totface){
+ /* in file read dm hasn't really changed but just wasn't saved in file */
+ if(psmd->flag & eParticleSystemFlag_Loaded)
+ psmd->flag &= ~eParticleSystemFlag_Loaded;
+ else{
+ /* TODO PARTICLE - Added this so changing subsurf under hair updates it
+ should it be done elsewhere? - Campbell */
+ psys->recalc |= PSYS_RECALC_HAIR;
+ psys->recalc |= PSYS_DISTR;
+ psmd->flag |= eParticleSystemFlag_DM_changed;
+ }
+ }
+
+ if(psys){
+ particle_system_update(ob,psys);
+ psmd->flag |= eParticleSystemFlag_psys_updated;
+ psmd->flag &= ~eParticleSystemFlag_DM_changed;
+ }
+}
+
+static void particleSystemModifier_deformVertsEM(
+ ModifierData *md, Object *ob, EditMesh *editData,
+ DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+{
+ DerivedMesh *dm = derivedData;
+
+ if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
+
+ particleSystemModifier_deformVerts(md, ob, dm, vertexCos, numVerts);
+
+ if(!derivedData) dm->release(dm);
+}
+
+/* Particle Instance */
+static void particleInstanceModifier_initData(ModifierData *md)
+{
+ ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md;
+
+ pimd->flag = eParticleInstanceFlag_Parents|eParticleInstanceFlag_Unborn|
+ eParticleInstanceFlag_Alive|eParticleInstanceFlag_Dead;
+ pimd->psys = 1;
+
+}
+static void particleInstanceModifier_copyData(ModifierData *md, ModifierData *target)
+{
+ ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md;
+ ParticleInstanceModifierData *tpimd= (ParticleInstanceModifierData*) target;
+
+ tpimd->ob = pimd->ob;
+ tpimd->psys = pimd->psys;
+ tpimd->flag = pimd->flag;
+}
+
+static int particleInstanceModifier_dependsOnTime(ModifierData *md)
+{
+ return 0;
+}
+static void particleInstanceModifier_updateDepgraph(ModifierData *md, DagForest *forest,
+ Object *ob, DagNode *obNode)
+{
+ ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md;
+
+ if (pimd->ob) {
+ DagNode *curNode = dag_get_node(forest, pimd->ob);
+
+ dag_add_relation(forest, curNode, obNode,
+ DAG_RL_DATA_DATA | DAG_RL_OB_DATA);
+ }
+}
+
+static void particleInstanceModifier_foreachObjectLink(ModifierData *md, Object *ob,
+ ObjectWalkFunc walk, void *userData)
+{
+ ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md;
+
+ walk(userData, ob, &pimd->ob);
+}
+
+static DerivedMesh * particleInstanceModifier_applyModifier(
+ ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int useRenderParams, int isFinalCalc)
+{
+ DerivedMesh *dm = derivedData, *result;
+ ParticleInstanceModifierData *pimd= (ParticleInstanceModifierData*) md;
+ ParticleSystem * psys=0;
+ ParticleData *pa=0, *pars=0;
+ MFace *mface, *orig_mface;
+ MVert *mvert, *orig_mvert;
+ int i,totvert, totpart=0, totface, maxvert, maxface, first_particle=0;
+ short track=ob->trackflag%3, trackneg;
+ float max_co=0.0, min_co=0.0, temp_co[3];
+
+ trackneg=((ob->trackflag>2)?1:0);
+
+ if(pimd->ob==ob){
+ pimd->ob=0;
+ return derivedData;
+ }
+
+ if(pimd->ob){
+ psys = BLI_findlink(&pimd->ob->particlesystem,pimd->psys-1);
+ if(psys==0 || psys->totpart==0)
+ return derivedData;
+ }
+ else return derivedData;
+
+ if(pimd->flag & eParticleInstanceFlag_Parents)
+ totpart+=psys->totpart;
+ if(pimd->flag & eParticleInstanceFlag_Children){
+ if(totpart==0)
+ first_particle=psys->totpart;
+ totpart+=psys->totchild;
+ }
+
+ if(totpart==0)
+ return derivedData;
+
+ pars=psys->particles;
+
+ totvert=dm->getNumVerts(dm);
+ totface=dm->getNumFaces(dm);
+
+ maxvert=totvert*totpart;
+ maxface=totface*totpart;
+
+ psys->lattice=psys_get_lattice(ob, psys);
+
+ if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED)){
+ float co[3];
+ for(i=0; i< totvert; i++){
+ dm->getVertCo(dm,i,co);
+ if(i==0){
+ min_co=max_co=co[track];
+ }
+ else{
+ if(co[track]<min_co)
+ min_co=co[track];
+
+ if(co[track]>max_co)
+ max_co=co[track];
+ }
+ }
+ }
+
+ result = CDDM_from_template(dm, maxvert,dm->getNumEdges(dm)*totpart,maxface);
+
+ mvert=result->getVertArray(result);
+ orig_mvert=dm->getVertArray(dm);
+
+ for(i=0; i<maxvert; i++){
+ MVert *inMV;
+ MVert *mv = mvert + i;
+ ParticleKey state;
+
+ inMV = orig_mvert + i%totvert;
+ DM_copy_vert_data(dm, result, i%totvert, i, 1);
+ *mv = *inMV;
+
+ /*change orientation based on object trackflag*/
+ VECCOPY(temp_co,mv->co);
+ mv->co[0]=temp_co[track];
+ mv->co[1]=temp_co[(track+1)%3];
+ mv->co[2]=temp_co[(track+2)%3];
+
+ if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED) && pimd->flag & eParticleInstanceFlag_Path){
+ state.time=(mv->co[0]-min_co)/(max_co-min_co);
+ if(trackneg)
+ state.time=1.0f-state.time;
+ psys_get_particle_on_path(pimd->ob,psys,first_particle + i/totvert,&state,1);
+ }
+ else{
+ state.time=-1.0;
+ psys_get_particle_state(pimd->ob,psys,i/totvert,&state,1);
+ }
+
+ /*displace vertice to path location*/
+ if(pimd->flag & eParticleInstanceFlag_Path)
+ mv->co[0]=0.0;
+
+ QuatMulVecf(state.rot,mv->co);
+ VECADD(mv->co,mv->co,state.co);
+ }
+
+ mface=result->getFaceArray(result);
+ orig_mface=dm->getFaceArray(dm);
+
+ for(i=0; i<maxface; i++){
+ MFace *inMF;
+ MFace *mf = mface + i;
+
+ if(pimd->flag & eParticleInstanceFlag_Parents){
+ if(i/totface>=psys->totpart){
+ if(psys->part->childtype==PART_CHILD_PARTICLES)
+ pa=psys->particles+(psys->child+i/totface-psys->totpart)->parent;
+ else
+ pa=0;
+ }
+ else
+ pa=pars+i/totface;
+ }
+ else{
+ if(psys->part->childtype==PART_CHILD_PARTICLES)
+ pa=psys->particles+(psys->child+i/totface)->parent;
+ else
+ pa=0;
+ }
+
+ if(pa){
+ if(pa->alive==PARS_UNBORN && (pimd->flag&eParticleInstanceFlag_Unborn)==0) continue;
+ if(pa->alive==PARS_ALIVE && (pimd->flag&eParticleInstanceFlag_Alive)==0) continue;
+ if(pa->alive==PARS_DEAD && (pimd->flag&eParticleInstanceFlag_Dead)==0) continue;
+ }
+
+ inMF = orig_mface + i%totface;
+ DM_copy_face_data(dm, result, i%totface, i, 1);
+ *mf = *inMF;
+
+ mf->v1+=(i/totface)*totvert;
+ mf->v2+=(i/totface)*totvert;
+ mf->v3+=(i/totface)*totvert;
+ if(mf->v4)
+ mf->v4+=(i/totface)*totvert;
+ }
+
+ CDDM_calc_edges(result);
+ CDDM_calc_normals(result);
+
+ if(psys->lattice){
+ end_latt_deform();
+ psys->lattice=0;
+ }
+
+ return result;
+}
+static DerivedMesh *particleInstanceModifier_applyModifierEM(
+ ModifierData *md, Object *ob, EditMesh *editData,
+ DerivedMesh *derivedData)
+{
+ return particleInstanceModifier_applyModifier(md, ob, derivedData, 0, 1);
+}
+
+/* Explode */
+static void explodeModifier_initData(ModifierData *md)
+{
+ ExplodeModifierData *emd= (ExplodeModifierData*) md;
+
+ emd->facepa=0;
+ emd->flag |= eExplodeFlag_Unborn+eExplodeFlag_Alive+eExplodeFlag_Dead;
+}
+static void explodeModifier_freeData(ModifierData *md)
+{
+ ExplodeModifierData *emd= (ExplodeModifierData*) md;
+
+ if(emd->facepa) MEM_freeN(emd->facepa);
+}
+static void explodeModifier_copyData(ModifierData *md, ModifierData *target)
+{
+ ExplodeModifierData *emd= (ExplodeModifierData*) md;
+ ExplodeModifierData *temd= (ExplodeModifierData*) target;
+
+ temd->facepa = 0;
+ temd->flag = emd->flag;
+}
+static int explodeModifier_dependsOnTime(ModifierData *md)
+{
+ return 1;
+}
+CustomDataMask explodeModifier_requiredDataMask(ModifierData *md)
+{
+ ExplodeModifierData *emd= (ExplodeModifierData*) md;
+ CustomDataMask dataMask = 0;
+
+ if(emd->vgroup)
+ dataMask |= (1 << CD_MDEFORMVERT);
+
+ return dataMask;
+}
+
+/* this should really be put somewhere permanently */
+static float vert_weight(MDeformVert *dvert, int group)
+{
+ MDeformWeight *dw;
+ int i;
+
+ if(dvert) {
+ dw= dvert->dw;
+ for(i= dvert->totweight; i>0; i--, dw++) {
+ if(dw->def_nr == group) return dw->weight;
+ if(i==1) break; /*otherwise dw will point to somewhere it shouldn't*/
+ }
+ }
+ return 0.0;
+}
+
+static void explodeModifier_createFacepa(ExplodeModifierData *emd,
+ ParticleSystemModifierData *psmd,
+ Object *ob, DerivedMesh *dm)
+{
+ ParticleSystem *psys=psmd->psys;
+ MFace *fa=0, *mface=0;
+ MVert *mvert = 0;
+ ParticleData *pa;
+ KDTree *tree;
+ float center[3], co[3];
+ int *facepa=0,*vertpa=0,totvert=0,totface=0,totpart=0;
+ int i,p,v1,v2,v3,v4=0;
+
+ mvert = dm->getVertArray(dm);
+ mface = dm->getFaceArray(dm);
+ totface= dm->getNumFaces(dm);
+ totvert= dm->getNumVerts(dm);
+ totpart= psmd->psys->totpart;
+
+ BLI_srandom(psys->seed);
+
+ if(emd->facepa)
+ MEM_freeN(emd->facepa);
+
+ facepa = emd->facepa = MEM_callocN(sizeof(int)*totface, "explode_facepa");
+
+ vertpa = MEM_callocN(sizeof(int)*totvert, "explode_vertpa");
+
+ /* initialize all faces & verts to no particle */
+ for(i=0; i<totface; i++)
+ facepa[i]=totpart;
+
+ for (i=0; i<totvert; i++)
+ vertpa[i]=totpart;
+
+ /* set protected verts */
+ if(emd->vgroup){
+ MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ float val;
+ if(dvert){
+ for(i=0; i<totvert; i++){
+ val = BLI_frand();
+ val = (1.0f-emd->protect)*val + emd->protect*0.5f;
+ if(val < vert_weight(dvert+i,emd->vgroup-1))
+ vertpa[i] = -1;
+ }
+ }
+ }
+
+ /* make tree of emitter locations */
+ tree=BLI_kdtree_new(totpart);
+ for(p=0,pa=psys->particles; p<totpart; p++,pa++){
+ psys_particle_on_dm(ob,dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,0,0,0);
+ BLI_kdtree_insert(tree, p, co, NULL);
+ }
+ BLI_kdtree_balance(tree);
+
+ /* set face-particle-indexes to nearest particle to face center */
+ for(i=0,fa=mface; i<totface; i++,fa++){
+ VecAddf(center,mvert[fa->v1].co,mvert[fa->v2].co);
+ VecAddf(center,center,mvert[fa->v3].co);
+ if(fa->v4){
+ VecAddf(center,center,mvert[fa->v4].co);
+ VecMulf(center,0.25);
+ }
+ else
+ VecMulf(center,0.3333f);
+
+ p= BLI_kdtree_find_nearest(tree,center,NULL,NULL);
+
+ v1=vertpa[fa->v1];
+ v2=vertpa[fa->v2];
+ v3=vertpa[fa->v3];
+ if(fa->v4)
+ v4=vertpa[fa->v4];
+
+ if(v1>=0 && v2>=0 && v3>=0 && (fa->v4==0 || v4>=0))
+ facepa[i]=p;
+
+ if(v1>=0) vertpa[fa->v1]=p;
+ if(v2>=0) vertpa[fa->v2]=p;
+ if(v3>=0) vertpa[fa->v3]=p;
+ if(fa->v4 && v4>=0) vertpa[fa->v4]=p;
+ }
+
+ if(vertpa) MEM_freeN(vertpa);
+ BLI_kdtree_free(tree);
+}
+static DerivedMesh * explodeModifier_splitEdges(ExplodeModifierData *emd, DerivedMesh *dm){
+ DerivedMesh *splitdm;
+ MFace *mf=0,*df1=0,*df2=0,*df3=0;
+ MFace *mface=CDDM_get_faces(dm);
+ MVert *dupve, *mv;
+ int totvert=dm->getNumVerts(dm);
+ int totface=dm->getNumFaces(dm);
+
+ int *edgesplit = MEM_callocN(sizeof(int)*totvert*totvert,"explode_edgesplit");
+ int *facesplit = MEM_callocN(sizeof(int)*totface,"explode_edgesplit");
+ int *vertpa = MEM_callocN(sizeof(int)*totvert,"explode_vertpa2");
+ int *facepa = emd->facepa;
+ int *fs, totesplit=0,totfsplit=0,totin=0,curdupvert=0,curdupface=0,curdupin=0;
+ int i,j,v1,v2,v3,v4;
+
+ /* recreate vertpa from facepa calculation */
+ for (i=0,mf=mface; i<totface; i++,mf++) {
+ vertpa[mf->v1]=facepa[i];
+ vertpa[mf->v2]=facepa[i];
+ vertpa[mf->v3]=facepa[i];
+ if(mf->v4)
+ vertpa[mf->v4]=facepa[i];
+ }
+
+ /* mark edges for splitting and how to split faces */
+ for (i=0,mf=mface,fs=facesplit; i<totface; i++,mf++,fs++) {
+ if(mf->v4){
+ v1=vertpa[mf->v1];
+ v2=vertpa[mf->v2];
+ v3=vertpa[mf->v3];
+ v4=vertpa[mf->v4];
+
+ if(v1!=v2){
+ edgesplit[mf->v1*totvert+mf->v2]=edgesplit[mf->v2*totvert+mf->v1]=1;
+ (*fs)++;
+ }
+
+ if(v2!=v3){
+ edgesplit[mf->v2*totvert+mf->v3]=edgesplit[mf->v3*totvert+mf->v2]=1;
+ (*fs)++;
+ }
+
+ if(v3!=v4){
+ edgesplit[mf->v3*totvert+mf->v4]=edgesplit[mf->v4*totvert+mf->v3]=1;
+ (*fs)++;
+ }
+
+ if(v1!=v4){
+ edgesplit[mf->v1*totvert+mf->v4]=edgesplit[mf->v4*totvert+mf->v1]=1;
+ (*fs)++;
+ }
+
+ if(*fs==2){
+ if((v1==v2 && v3==v4) || (v1==v4 && v2==v3))
+ *fs=1;
+ else if(v1!=v2){
+ if(v1!=v4)
+ edgesplit[mf->v2*totvert+mf->v3]=edgesplit[mf->v3*totvert+mf->v2]=1;
+ else
+ edgesplit[mf->v3*totvert+mf->v4]=edgesplit[mf->v4*totvert+mf->v3]=1;
+ }
+ else{
+ if(v1!=v4)
+ edgesplit[mf->v1*totvert+mf->v2]=edgesplit[mf->v2*totvert+mf->v1]=1;
+ else
+ edgesplit[mf->v1*totvert+mf->v4]=edgesplit[mf->v4*totvert+mf->v1]=1;
+ }
+ }
+ }
+ }
+
+ /* count splits & reindex */
+ totesplit=totvert;
+ for(j=0; j<totvert; j++){
+ for(i=j+1; i<totvert; i++){
+ if(edgesplit[j*totvert+i])
+ edgesplit[j*totvert+i]=edgesplit[i*totvert+j]=totesplit++;
+ }
+ }
+ /* count new faces due to splitting */
+ for(i=0,fs=facesplit; i<totface; i++,fs++){
+ if(*fs==1)
+ totfsplit+=1;
+ else if(*fs==2)
+ totfsplit+=2;
+ else if(*fs==3)
+ totfsplit+=3;
+ else if(*fs==4){
+ totfsplit+=3;
+
+ mf=dm->getFaceData(dm,i,CD_MFACE);//CDDM_get_face(dm,i);
+
+ if(vertpa[mf->v1]!=vertpa[mf->v2] && vertpa[mf->v2]!=vertpa[mf->v3])
+ totin++;
+ }
+ }
+
+ splitdm= CDDM_from_template(dm, totesplit+totin, dm->getNumEdges(dm),totface+totfsplit);
+
+ /* copy new faces & verts (is it really this painful with custom data??) */
+ for(i=0; i<totvert; i++){
+ MVert source;
+ MVert *dest;
+ dm->getVert(dm, i, &source);
+ dest = CDDM_get_vert(splitdm, i);
+
+ DM_copy_vert_data(dm, splitdm, i, i, 1);
+ *dest = source;
+ }
+ for(i=0; i<totface; i++){
+ MFace source;
+ MFace *dest;
+ dm->getFace(dm, i, &source);
+ dest = CDDM_get_face(splitdm, i);
+
+ DM_copy_face_data(dm, splitdm, i, i, 1);
+ *dest = source;
+ }
+
+ /* override original facepa (original pointer is saved in caller function) */
+ facepa= MEM_callocN(sizeof(int)*(totface+totfsplit),"explode_facepa");
+ memcpy(facepa,emd->facepa,totface*sizeof(int));
+ emd->facepa=facepa;
+
+ /* create new verts */
+ curdupvert=totvert;
+ for(j=0; j<totvert; j++){
+ for(i=j+1; i<totvert; i++){
+ if(edgesplit[j*totvert+i]){
+ mv=CDDM_get_vert(splitdm,j);
+ dupve=CDDM_get_vert(splitdm,edgesplit[j*totvert+i]);
+
+ DM_copy_vert_data(splitdm,splitdm,j,edgesplit[j*totvert+i],1);
+
+ *dupve=*mv;
+
+ mv=CDDM_get_vert(splitdm,i);
+
+ VECADD(dupve->co,dupve->co,mv->co);
+ VecMulf(dupve->co,0.5);
+ }
+ }
+ }
+
+ /* create new faces */
+ curdupface=totface;
+ curdupin=totesplit;
+ for(i=0,fs=facesplit; i<totface; i++,fs++){
+ if(*fs){
+ mf=CDDM_get_face(splitdm,i);
+
+ v1=vertpa[mf->v1];
+ v2=vertpa[mf->v2];
+ v3=vertpa[mf->v3];
+ v4=vertpa[mf->v4];
+ /* ouch! creating new faces & remapping them to new verts is no fun */
+ if(*fs==1){
+ df1=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df1=*mf;
+ curdupface++;
+
+ if(v1==v2){
+ df1->v1=edgesplit[mf->v1*totvert+mf->v4];
+ df1->v2=edgesplit[mf->v2*totvert+mf->v3];
+ mf->v3=df1->v2;
+ mf->v4=df1->v1;
+ }
+ else{
+ df1->v1=edgesplit[mf->v1*totvert+mf->v2];
+ df1->v4=edgesplit[mf->v3*totvert+mf->v4];
+ mf->v2=df1->v1;
+ mf->v3=df1->v4;
+ }
+
+ facepa[i]=v1;
+ facepa[curdupface-1]=v3;
+
+ test_index_face(df1, &splitdm->faceData, curdupface, (df1->v4 ? 4 : 3));
+ }
+ if(*fs==2){
+ df1=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df1=*mf;
+ curdupface++;
+
+ df2=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df2=*mf;
+ curdupface++;
+
+ if(v1!=v2){
+ if(v1!=v4){
+ df1->v1=edgesplit[mf->v1*totvert+mf->v4];
+ df1->v2=edgesplit[mf->v1*totvert+mf->v2];
+ df2->v1=df1->v3=mf->v2;
+ df2->v3=df1->v4=mf->v4;
+ df2->v2=mf->v3;
+
+ mf->v2=df1->v2;
+ mf->v3=df1->v1;
+
+ df2->v4=mf->v4=0;
+
+ facepa[i]=v1;
+ }
+ else{
+ df1->v2=edgesplit[mf->v1*totvert+mf->v2];
+ df1->v3=edgesplit[mf->v2*totvert+mf->v3];
+ df1->v4=mf->v3;
+ df2->v2=mf->v3;
+ df2->v3=mf->v4;
+
+ mf->v1=df1->v2;
+ mf->v3=df1->v3;
+
+ df2->v4=mf->v4=0;
+
+ facepa[i]=v2;
+ }
+ facepa[curdupface-1]=facepa[curdupface-2]=v3;
+ }
+ else{
+ if(v1!=v4){
+ df1->v3=edgesplit[mf->v3*totvert+mf->v4];
+ df1->v4=edgesplit[mf->v1*totvert+mf->v4];
+ df1->v2=mf->v3;
+
+ mf->v1=df1->v4;
+ mf->v2=df1->v3;
+ mf->v3=mf->v4;
+
+ df2->v4=mf->v4=0;
+
+ facepa[i]=v4;
+ }
+ else{
+ df1->v3=edgesplit[mf->v2*totvert+mf->v3];
+ df1->v4=edgesplit[mf->v3*totvert+mf->v4];
+ df1->v1=mf->v4;
+ df1->v2=mf->v2;
+ df2->v3=mf->v4;
+
+ mf->v1=df1->v4;
+ mf->v2=df1->v3;
+
+ df2->v4=mf->v4=0;
+
+ facepa[i]=v3;
+ }
+
+ facepa[curdupface-1]=facepa[curdupface-2]=v1;
+ }
+
+ test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3));
+ test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3));
+ }
+ else if(*fs==3){
+ df1=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df1=*mf;
+ curdupface++;
+
+ df2=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df2=*mf;
+ curdupface++;
+
+ df3=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df3=*mf;
+ curdupface++;
+
+ if(v1==v2){
+ df2->v1=df1->v1=edgesplit[mf->v1*totvert+mf->v4];
+ df3->v1=df1->v2=edgesplit[mf->v2*totvert+mf->v3];
+ df3->v3=df2->v2=df1->v3=edgesplit[mf->v3*totvert+mf->v4];
+ df3->v2=mf->v3;
+ df2->v3=mf->v4;
+ df1->v4=df2->v4=df3->v4=0;
+
+ mf->v3=df1->v2;
+ mf->v4=df1->v1;
+
+ facepa[i]=facepa[curdupface-3]=v1;
+ facepa[curdupface-1]=v3;
+ facepa[curdupface-2]=v4;
+ }
+ else if(v2==v3){
+ df3->v1=df2->v3=df1->v1=edgesplit[mf->v1*totvert+mf->v4];
+ df2->v2=df1->v2=edgesplit[mf->v1*totvert+mf->v2];
+ df3->v2=df1->v3=edgesplit[mf->v3*totvert+mf->v4];
+
+ df3->v3=mf->v4;
+ df2->v1=mf->v1;
+ df1->v4=df2->v4=df3->v4=0;
+
+ mf->v1=df1->v2;
+ mf->v4=df1->v3;
+
+ facepa[i]=facepa[curdupface-3]=v2;
+ facepa[curdupface-1]=v4;
+ facepa[curdupface-2]=v1;
+ }
+ else if(v3==v4){
+ df3->v2=df2->v1=df1->v1=edgesplit[mf->v1*totvert+mf->v2];
+ df2->v3=df1->v2=edgesplit[mf->v2*totvert+mf->v3];
+ df3->v3=df1->v3=edgesplit[mf->v1*totvert+mf->v4];
+
+ df3->v1=mf->v1;
+ df2->v2=mf->v2;
+ df1->v4=df2->v4=df3->v4=0;
+
+ mf->v1=df1->v3;
+ mf->v2=df1->v2;
+
+ facepa[i]=facepa[curdupface-3]=v3;
+ facepa[curdupface-1]=v1;
+ facepa[curdupface-2]=v2;
+ }
+ else{
+ df3->v1=df1->v1=edgesplit[mf->v1*totvert+mf->v2];
+ df3->v3=df2->v1=df1->v2=edgesplit[mf->v2*totvert+mf->v3];
+ df2->v3=df1->v3=edgesplit[mf->v3*totvert+mf->v4];
+
+ df3->v2=mf->v2;
+ df2->v2=mf->v3;
+ df1->v4=df2->v4=df3->v4=0;
+
+ mf->v2=df1->v1;
+ mf->v3=df1->v3;
+
+ facepa[i]=facepa[curdupface-3]=v1;
+ facepa[curdupface-1]=v2;
+ facepa[curdupface-2]=v3;
+ }
+
+ test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3));
+ test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3));
+ test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3));
+ }
+ else if(*fs==4){
+ if(v1!=v2 && v2!=v3){
+
+ /* set new vert to face center */
+ mv=CDDM_get_vert(splitdm,mf->v1);
+ dupve=CDDM_get_vert(splitdm,curdupin);
+ DM_copy_vert_data(splitdm,splitdm,mf->v1,curdupin,1);
+ *dupve=*mv;
+
+ mv=CDDM_get_vert(splitdm,mf->v2);
+ VECADD(dupve->co,dupve->co,mv->co);
+ mv=CDDM_get_vert(splitdm,mf->v3);
+ VECADD(dupve->co,dupve->co,mv->co);
+ mv=CDDM_get_vert(splitdm,mf->v4);
+ VECADD(dupve->co,dupve->co,mv->co);
+ VecMulf(dupve->co,0.25);
+
+
+ df1=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df1=*mf;
+ curdupface++;
+
+ df2=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df2=*mf;
+ curdupface++;
+
+ df3=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df3=*mf;
+ curdupface++;
+
+ df1->v1=edgesplit[mf->v1*totvert+mf->v2];
+ df3->v2=df1->v3=edgesplit[mf->v2*totvert+mf->v3];
+
+ df2->v1=edgesplit[mf->v1*totvert+mf->v4];
+ df3->v4=df2->v3=edgesplit[mf->v3*totvert+mf->v4];
+
+ df3->v1=df2->v2=df1->v4=curdupin;
+
+ mf->v2=df1->v1;
+ mf->v3=curdupin;
+ mf->v4=df2->v1;
+
+ curdupin++;
+
+ facepa[i]=v1;
+ facepa[curdupface-3]=v2;
+ facepa[curdupface-2]=v3;
+ facepa[curdupface-1]=v4;
+
+ test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3));
+
+ test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3));
+ test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3));
+ }
+ else{
+ df1=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df1=*mf;
+ curdupface++;
+
+ df2=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df2=*mf;
+ curdupface++;
+
+ df3=CDDM_get_face(splitdm,curdupface);
+ DM_copy_face_data(splitdm,splitdm,i,curdupface,1);
+ *df3=*mf;
+ curdupface++;
+
+ if(v2==v3){
+ df1->v1=edgesplit[mf->v1*totvert+mf->v2];
+ df3->v1=df1->v2=df1->v3=edgesplit[mf->v2*totvert+mf->v3];
+ df2->v1=df1->v4=edgesplit[mf->v1*totvert+mf->v4];
+
+ df3->v3=df2->v3=edgesplit[mf->v3*totvert+mf->v4];
+
+ df3->v2=mf->v3;
+ df3->v4=0;
+
+ mf->v2=df1->v1;
+ mf->v3=df1->v4;
+ mf->v4=0;
+
+ facepa[i]=v1;
+ facepa[curdupface-3]=facepa[curdupface-2]=v2;
+ facepa[curdupface-1]=v3;
+ }
+ else{
+ df3->v1=df2->v1=df1->v2=edgesplit[mf->v1*totvert+mf->v2];
+ df2->v4=df1->v3=edgesplit[mf->v3*totvert+mf->v4];
+ df1->v4=edgesplit[mf->v1*totvert+mf->v4];
+
+ df3->v3=df2->v2=edgesplit[mf->v2*totvert+mf->v3];
+
+ df3->v4=0;
+
+ mf->v1=df1->v4;
+ mf->v2=df1->v3;
+ mf->v3=mf->v4;
+ mf->v4=0;
+
+ facepa[i]=v4;
+ facepa[curdupface-3]=facepa[curdupface-2]=v1;
+ facepa[curdupface-1]=v2;
+ }
+
+ test_index_face(df1, &splitdm->faceData, curdupface-3, (df1->v4 ? 4 : 3));
+ test_index_face(df1, &splitdm->faceData, curdupface-2, (df1->v4 ? 4 : 3));
+ test_index_face(df1, &splitdm->faceData, curdupface-1, (df1->v4 ? 4 : 3));
+ }
+ }
+
+ test_index_face(df1, &splitdm->faceData, i, (df1->v4 ? 4 : 3));
+ }
+ }
+
+ MEM_freeN(edgesplit);
+ MEM_freeN(facesplit);
+ MEM_freeN(vertpa);
+
+ return splitdm;
+
+}
+static DerivedMesh * explodeModifier_explodeMesh(ExplodeModifierData *emd,
+ ParticleSystemModifierData *psmd, Object *ob,
+ DerivedMesh *to_explode)
+{
+ DerivedMesh *explode, *dm=to_explode;
+ MFace *mf=0;
+ MVert *dupvert=0;
+ ParticleSettings *part=psmd->psys->part;
+ ParticleData *pa, *pars=psmd->psys->particles;
+ ParticleKey state;
+ float *vertco=0, imat[4][4];
+ float loc0[3], nor[3];
+ float timestep, cfra;
+ int *facepa=emd->facepa, *vertpa=0;
+ int totdup=0,totvert=0,totface=0,totpart=0;
+ int i, j, v, mindex=0;
+
+ totface= dm->getNumFaces(dm);
+ totvert= dm->getNumVerts(dm);
+ totpart= psmd->psys->totpart;
+
+ timestep= psys_get_timestep(part);
+
+ if(part->flag & PART_GLOB_TIME)
+ cfra=bsystem_time(0,(float)G.scene->r.cfra,0.0);
+ else
+ cfra=bsystem_time(ob,(float)G.scene->r.cfra,0.0);
+
+ /* table for vertice <-> particle relations (row totpart+1 is for yet unexploded verts) */
+ vertpa = MEM_callocN(sizeof(int)*(totpart+1)*totvert, "explode_vertpatab");
+ for(i=0; i<(totpart+1)*totvert; i++)
+ vertpa[i] = -1;
+
+ for (i=0; i<totface; i++) {
+ if(facepa[i]==totpart || cfra <= (pars+facepa[i])->time)
+ mindex = totpart*totvert;
+ else
+ mindex = facepa[i]*totvert;
+
+ mf=CDDM_get_face(dm,i);
+
+ /*set face vertices to exist in particle group*/
+ vertpa[mindex+mf->v1] = 1;
+ vertpa[mindex+mf->v2] = 1;
+ vertpa[mindex+mf->v3] = 1;
+ if(mf->v4)
+ vertpa[mindex+mf->v4] = 1;
+ }
+
+ /*make new vertice indexes & count total vertices after duplication*/
+ for(i=0; i<(totpart+1)*totvert; i++){
+ if(vertpa[i] != -1)
+ vertpa[i] = totdup++;
+ }
+
+ /*the final duplicated vertices*/
+ explode= CDDM_from_template(dm, totdup, 0,totface);
+ dupvert= CDDM_get_verts(explode);
+
+ /* getting back to object space */
+ Mat4Invert(imat,ob->obmat);
+
+ psmd->psys->lattice = psys_get_lattice(ob, psmd->psys);
+
+ /*duplicate & displace vertices*/
+ for(i=0, pa=pars; i<=totpart; i++, pa++){
+ if(i!=totpart){
+ psys_particle_on_emitter(ob, psmd,part->from,pa->num,-1,pa->fuv,pa->foffset,loc0,nor,0,0);
+ Mat4MulVecfl(ob->obmat,loc0);
+
+ state.time=cfra;
+ psys_get_particle_state(ob,psmd->psys,i,&state,1);
+ }
+
+ for(j=0; j<totvert; j++){
+ v=vertpa[i*totvert+j];
+ if(v != -1) {
+ MVert source;
+ MVert *dest;
+
+ dm->getVert(dm, j, &source);
+ dest = CDDM_get_vert(explode,v);
+
+ DM_copy_vert_data(dm,explode,j,v,1);
+ *dest = source;
+
+ if(i!=totpart){
+ vertco=CDDM_get_vert(explode,v)->co;
+
+ Mat4MulVecfl(ob->obmat,vertco);
+
+ VECSUB(vertco,vertco,loc0);
+
+ /* apply rotation, size & location */
+ QuatMulVecf(state.rot,vertco);
+ VecMulf(vertco,pa->size);
+ VECADD(vertco,vertco,state.co);
+
+ Mat4MulVecfl(imat,vertco);
+ }
+ }
+ }
+ }
+
+ /*map new vertices to faces*/
+ for (i=0; i<totface; i++) {
+ MFace source;
+ int orig_v4;
+
+ if(facepa[i]!=totpart)
+ {
+ pa=pars+facepa[i];
+
+ if(pa->alive==PARS_UNBORN && (emd->flag&eExplodeFlag_Unborn)==0) continue;
+ if(pa->alive==PARS_ALIVE && (emd->flag&eExplodeFlag_Alive)==0) continue;
+ if(pa->alive==PARS_DEAD && (emd->flag&eExplodeFlag_Dead)==0) continue;
+ }
+
+ dm->getFace(dm,i,&source);
+ mf=CDDM_get_face(explode,i);
+
+ orig_v4 = source.v4;
+
+ if(facepa[i]!=totpart && cfra <= pa->time)
+ mindex = totpart*totvert;
+ else
+ mindex = facepa[i]*totvert;
+
+ source.v1 = vertpa[mindex+source.v1];
+ source.v2 = vertpa[mindex+source.v2];
+ source.v3 = vertpa[mindex+source.v3];
+ if(source.v4)
+ source.v4 = vertpa[mindex+source.v4];
+
+ DM_copy_face_data(dm,explode,i,i,1);
+
+ *mf = source;
+
+ test_index_face(mf, &explode->faceData, i, (mf->v4 ? 4 : 3));
+ }
+
+
+ /* cleanup */
+ if(vertpa) MEM_freeN(vertpa);
+
+ /* finalization */
+ CDDM_calc_edges(explode);
+ CDDM_calc_normals(explode);
+
+ if(psmd->psys->lattice){
+ end_latt_deform();
+ psmd->psys->lattice=0;
+ }
+
+ return explode;
+}
+
+static ParticleSystemModifierData * explodeModifier_findPrecedingParticlesystem(Object *ob, ModifierData *emd)
+{
+ ModifierData *md;
+ ParticleSystemModifierData *psmd=0;
+
+ for (md=ob->modifiers.first; emd!=md; md=md->next){
+ if(md->type==eModifierType_ParticleSystem)
+ psmd= (ParticleSystemModifierData*) md;
+ }
+ return psmd;
+}
+static DerivedMesh * explodeModifier_applyModifier(
+ ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ int useRenderParams, int isFinalCalc)
+{
+ DerivedMesh *dm = derivedData;
+ ExplodeModifierData *emd= (ExplodeModifierData*) md;
+ ParticleSystemModifierData *psmd=explodeModifier_findPrecedingParticlesystem(ob,md);;
+
+ if(psmd){
+ ParticleSystem * psys=psmd->psys;
+
+ if(psys==0 || psys->totpart==0) return derivedData;
+ if(psys->part==0 || psys->particles==0) return derivedData;
+
+ /* 1. find faces to be exploded if needed */
+ if(emd->facepa==0 || psmd->flag&eParticleSystemFlag_Pars || emd->flag&eExplodeFlag_CalcFaces){
+ if(psmd->flag & eParticleSystemFlag_Pars)
+ psmd->flag &= ~eParticleSystemFlag_Pars;
+
+ if(emd->flag & eExplodeFlag_CalcFaces)
+ emd->flag &= ~eExplodeFlag_CalcFaces;
+
+ explodeModifier_createFacepa(emd,psmd,ob,derivedData);
+ }
+
+ /* 2. create new mesh */
+ if(emd->flag & eExplodeFlag_EdgeSplit){
+ int *facepa = emd->facepa;
+ DerivedMesh *splitdm=explodeModifier_splitEdges(emd,dm);
+ DerivedMesh *explode=explodeModifier_explodeMesh(emd,psmd,ob,splitdm);
+
+ MEM_freeN(emd->facepa);
+ emd->facepa=facepa;
+ splitdm->release(splitdm);
+ return explode;
+ }
+ else
+ return explodeModifier_explodeMesh(emd,psmd,ob,derivedData);
+ }
+ return derivedData;
+}
+/* MeshDeform */
+
+static void meshdeformModifier_initData(ModifierData *md)
+{
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+
+ mmd->gridsize= 5;
+}
+
+static void meshdeformModifier_freeData(ModifierData *md)
+{
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+
+ if(mmd->bindweights) MEM_freeN(mmd->bindweights);
+ if(mmd->bindcos) MEM_freeN(mmd->bindcos);
+ if(mmd->dyngrid) MEM_freeN(mmd->dyngrid);
+ if(mmd->dyninfluences) MEM_freeN(mmd->dyninfluences);
+ if(mmd->dynverts) MEM_freeN(mmd->dynverts);
+}
+
+static void meshdeformModifier_copyData(ModifierData *md, ModifierData *target)
+{
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+ MeshDeformModifierData *tmmd = (MeshDeformModifierData*) target;
+
+ tmmd->gridsize = mmd->gridsize;
+ tmmd->object = mmd->object;
+}
+
+CustomDataMask meshdeformModifier_requiredDataMask(ModifierData *md)
+{
+ MeshDeformModifierData *mmd = (MeshDeformModifierData *)md;
+ CustomDataMask dataMask = 0;
+
+ /* ask for vertexgroups if we need them */
+ if(mmd->defgrp_name[0]) dataMask |= (1 << CD_MDEFORMVERT);
+
+ return dataMask;
+}
+
+static int meshdeformModifier_isDisabled(ModifierData *md)
+{
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+
+ return !mmd->object;
+}
+
+static void meshdeformModifier_foreachObjectLink(
+ ModifierData *md, Object *ob,
+ void (*walk)(void *userData, Object *ob, Object **obpoin),
+ void *userData)
+{
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+
+ walk(userData, ob, &mmd->object);
+}
+
+static void meshdeformModifier_updateDepgraph(
+ ModifierData *md, DagForest *forest, Object *ob,
+ DagNode *obNode)
+{
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+
+ if (mmd->object) {
+ DagNode *curNode = dag_get_node(forest, mmd->object);
+
+ dag_add_relation(forest, curNode, obNode,
+ DAG_RL_DATA_DATA|DAG_RL_OB_DATA|DAG_RL_DATA_OB|DAG_RL_OB_OB);
+ }
+}
+
+static float meshdeform_dynamic_bind(MeshDeformModifierData *mmd, float (*dco)[3], float *vec)
+{
+ MDefCell *cell;
+ MDefInfluence *inf;
+ float gridvec[3], dvec[3], ivec[3], co[3], wx, wy, wz;
+ float weight, cageweight, totweight, *cageco;
+ int i, j, a, x, y, z, size;
+
+ co[0]= co[1]= co[2]= 0.0f;
+ totweight= 0.0f;
+ size= mmd->dyngridsize;
+
+ for(i=0; i<3; i++) {
+ gridvec[i]= (vec[i] - mmd->dyncellmin[i] - mmd->dyncellwidth*0.5f)/mmd->dyncellwidth;
+ ivec[i]= (int)gridvec[i];
+ dvec[i]= gridvec[i] - ivec[i];
+ }
+
+ for(i=0; i<8; i++) {
+ if(i & 1) { x= ivec[0]+1; wx= dvec[0]; }
+ else { x= ivec[0]; wx= 1.0f-dvec[0]; }
+
+ if(i & 2) { y= ivec[1]+1; wy= dvec[1]; }
+ else { y= ivec[1]; wy= 1.0f-dvec[1]; }
+
+ if(i & 4) { z= ivec[2]+1; wz= dvec[2]; }
+ else { z= ivec[2]; wz= 1.0f-dvec[2]; }
+
+ CLAMP(x, 0, size-1);
+ CLAMP(y, 0, size-1);
+ CLAMP(z, 0, size-1);
+
+ a= x + y*size + z*size*size;
+ weight= wx*wy*wz;
+
+ cell= &mmd->dyngrid[a];
+ inf= mmd->dyninfluences + cell->offset;
+ for(j=0; j<cell->totinfluence; j++, inf++) {
+ cageco= dco[inf->vertex];
+ cageweight= weight*inf->weight;
+ co[0] += cageweight*cageco[0];
+ co[1] += cageweight*cageco[1];
+ co[2] += cageweight*cageco[2];
+ totweight += cageweight;
+ }
+ }
+
+ VECCOPY(vec, co);
+
+ return totweight;
+}
+
+static void meshdeformModifier_do(
+ ModifierData *md, Object *ob, DerivedMesh *dm,
+ float (*vertexCos)[3], int numVerts)
+{
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+ float imat[4][4], cagemat[4][4], icagemat[4][4], iobmat[3][3];
+ float weight, totweight, fac, co[3], *weights, (*dco)[3], (*bindcos)[3];
+ int a, b, totvert, totcagevert, defgrp_index;
+ DerivedMesh *tmpdm, *cagedm;
+ MDeformVert *dvert = NULL;
+ MDeformWeight *dw;
+ MVert *cagemvert;
+
+ if(!mmd->object || (!mmd->bindcos && !mmd->needbind))
+ return;
+
+ /* get cage derivedmesh */
+ if(mmd->object == G.obedit) {
+ tmpdm= editmesh_get_derived_cage_and_final(&cagedm, 0);
+ if(tmpdm)
+ tmpdm->release(tmpdm);
+ }
+ else
+ cagedm= mesh_get_derived_final(mmd->object, CD_MASK_BAREMESH);
+
+ /* TODO: this could give inifinite loop for circular dependency */
+ if(!cagedm)
+ return;
+
+ /* compute matrices to go in and out of cage object space */
+ Mat4Invert(imat, (mmd->bindcos)? mmd->bindmat: mmd->object->obmat);
+ Mat4MulMat4(cagemat, ob->obmat, imat);
+ Mat4Invert(icagemat, cagemat);
+ Mat4Invert(imat, ob->obmat);
+ Mat3CpyMat4(iobmat, imat);
+
+ /* bind weights if needed */
+ if(!mmd->bindcos)
+ harmonic_coordinates_bind(mmd, vertexCos, numVerts, cagemat);
+
+ /* verify we have compatible weights */
+ totvert= numVerts;
+ totcagevert= cagedm->getNumVerts(cagedm);
+
+ if(mmd->totvert!=totvert || mmd->totcagevert!=totcagevert || !mmd->bindcos) {
+ cagedm->release(cagedm);
+ return;
+ }
+
+ /* setup deformation data */
+ cagemvert= cagedm->getVertArray(cagedm);
+ weights= mmd->bindweights;
+ bindcos= (float(*)[3])mmd->bindcos;
+
+ dco= MEM_callocN(sizeof(*dco)*totcagevert, "MDefDco");
+ for(a=0; a<totcagevert; a++) {
+ VECCOPY(co, cagemvert[a].co);
+ Mat4MulVecfl(mmd->object->obmat, co);
+ VECSUB(dco[a], co, bindcos[a]);
+ }
+
+ defgrp_index = -1;
+
+ if(mmd->defgrp_name[0]) {
+ bDeformGroup *def;
+
+ for(a=0, def=ob->defbase.first; def; def=def->next, a++) {
+ if(!strcmp(def->name, mmd->defgrp_name)) {
+ defgrp_index= a;
+ break;
+ }
+ }
+
+ if (defgrp_index >= 0)
+ dvert= dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ }
+
+ /* do deformation */
+ fac= 1.0f;
+
+ for(b=0; b<totvert; b++) {
+ if(mmd->flag & MOD_MDEF_DYNAMIC_BIND)
+ if(!mmd->dynverts[b])
+ continue;
+
+ if(dvert) {
+ for(dw=NULL, a=0; a<dvert[b].totweight; a++) {
+ if(dvert[b].dw[a].def_nr == defgrp_index) {
+ dw = &dvert[b].dw[a];
+ break;
+ }
+ }
+
+ if(mmd->flag & MOD_MDEF_INVERT_VGROUP) {
+ if(!dw) fac= 1.0f;
+ else if(dw->weight == 1.0f) continue;
+ else fac=1.0f-dw->weight;
+ }
+ else {
+ if(!dw) continue;
+ else fac= dw->weight;
+ }
+ }
+
+ if(mmd->flag & MOD_MDEF_DYNAMIC_BIND) {
+ VECCOPY(co, vertexCos[b]);
+ Mat4MulVecfl(cagemat, co);
+ totweight= meshdeform_dynamic_bind(mmd, dco, co);
+ }
+ else {
+ totweight= 0.0f;
+ co[0]= co[1]= co[2]= 0.0f;
+
+ for(a=0; a<totcagevert; a++) {
+ weight= weights[a + b*totcagevert];
+ co[0]+= weight*dco[a][0];
+ co[1]+= weight*dco[a][1];
+ co[2]+= weight*dco[a][2];
+ totweight += weight;
+ }
+ }
+
+ if(totweight > 0.0f) {
+ VecMulf(co, fac/totweight);
+ Mat3MulVecfl(iobmat, co);
+ VECADD(vertexCos[b], vertexCos[b], co);
+ }
+ }
+
+ /* release cage derivedmesh */
+ MEM_freeN(dco);
+ cagedm->release(cagedm);
+}
+
+static void meshdeformModifier_deformVerts(
+ ModifierData *md, Object *ob, DerivedMesh *derivedData,
+ float (*vertexCos)[3], int numVerts)
+{
+ DerivedMesh *dm;
+
+ if(!derivedData && ob->type==OB_MESH)
+ dm= CDDM_from_mesh(ob->data, ob);
+ else
+ dm= derivedData;
+
+ modifier_vgroup_cache(md, vertexCos); /* if next modifier needs original vertices */
+
+ meshdeformModifier_do(md, ob, dm, vertexCos, numVerts);
+
+ if(dm != derivedData)
+ dm->release(dm);
+}
+
+static void meshdeformModifier_deformVertsEM(
+ ModifierData *md, Object *ob, EditMesh *editData,
+ DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
+{
+ DerivedMesh *dm;
+
+ if(!derivedData && ob->type == OB_MESH)
+ dm = CDDM_from_editmesh(editData, ob->data);
+ else
+ dm = derivedData;
+
+ meshdeformModifier_do(md, ob, dm, vertexCos, numVerts);
+
+ if(dm != derivedData)
+ dm->release(dm);
+}
+
/***/
static ModifierTypeInfo typeArr[NUM_MODIFIER_TYPES];
@@ -4963,6 +6611,8 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
| eModifierTypeFlag_EnableInEditmode;
mti->initData = mirrorModifier_initData;
mti->copyData = mirrorModifier_copyData;
+ mti->foreachObjectLink = mirrorModifier_foreachObjectLink;
+ mti->updateDepgraph = mirrorModifier_updateDepgraph;
mti->applyModifier = mirrorModifier_applyModifier;
mti->applyModifierEM = mirrorModifier_applyModifierEM;
@@ -5060,6 +6710,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->updateDepgraph = armatureModifier_updateDepgraph;
mti->deformVerts = armatureModifier_deformVerts;
mti->deformVertsEM = armatureModifier_deformVertsEM;
+ mti->deformMatricesEM = armatureModifier_deformMatricesEM;
mti = INIT_TYPE(Hook);
mti->type = eModifierTypeType_OnlyDeform;
@@ -5090,6 +6741,56 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
mti->foreachObjectLink = booleanModifier_foreachObjectLink;
mti->updateDepgraph = booleanModifier_updateDepgraph;
+ mti = INIT_TYPE(MeshDeform);
+ mti->type = eModifierTypeType_OnlyDeform;
+ mti->flags = eModifierTypeFlag_AcceptsCVs
+ | eModifierTypeFlag_SupportsEditmode;
+ mti->initData = meshdeformModifier_initData;
+ mti->freeData = meshdeformModifier_freeData;
+ mti->copyData = meshdeformModifier_copyData;
+ mti->requiredDataMask = meshdeformModifier_requiredDataMask;
+ mti->isDisabled = meshdeformModifier_isDisabled;
+ mti->foreachObjectLink = meshdeformModifier_foreachObjectLink;
+ mti->updateDepgraph = meshdeformModifier_updateDepgraph;
+ mti->deformVerts = meshdeformModifier_deformVerts;
+ mti->deformVertsEM = meshdeformModifier_deformVertsEM;
+
+ mti = INIT_TYPE(ParticleSystem);
+ mti->type = eModifierTypeType_OnlyDeform;
+ mti->flags = eModifierTypeFlag_AcceptsMesh
+ |eModifierTypeFlag_SupportsEditmode
+ |eModifierTypeFlag_EnableInEditmode;
+ mti->initData = particleSystemModifier_initData;
+ mti->freeData = particleSystemModifier_freeData;
+ mti->copyData = particleSystemModifier_copyData;
+ mti->deformVerts = particleSystemModifier_deformVerts;
+ mti->deformVertsEM = particleSystemModifier_deformVertsEM;
+ mti->requiredDataMask = particleSystemModifier_requiredDataMask;
+
+ mti = INIT_TYPE(ParticleInstance);
+ mti->type = eModifierTypeType_Constructive;
+ mti->flags = eModifierTypeFlag_AcceptsMesh
+ | eModifierTypeFlag_SupportsMapping
+ | eModifierTypeFlag_SupportsEditmode
+ | eModifierTypeFlag_EnableInEditmode;
+ mti->initData = particleInstanceModifier_initData;
+ mti->copyData = particleInstanceModifier_copyData;
+ mti->dependsOnTime = particleInstanceModifier_dependsOnTime;
+ mti->foreachObjectLink = particleInstanceModifier_foreachObjectLink;
+ mti->applyModifier = particleInstanceModifier_applyModifier;
+ mti->applyModifierEM = particleInstanceModifier_applyModifierEM;
+ mti->updateDepgraph = particleInstanceModifier_updateDepgraph;
+
+ mti = INIT_TYPE(Explode);
+ mti->type = eModifierTypeType_Nonconstructive;
+ mti->flags = eModifierTypeFlag_AcceptsMesh;
+ mti->initData = explodeModifier_initData;
+ mti->freeData = explodeModifier_freeData;
+ mti->copyData = explodeModifier_copyData;
+ mti->dependsOnTime = explodeModifier_dependsOnTime;
+ mti->requiredDataMask = explodeModifier_requiredDataMask;
+ mti->applyModifier = explodeModifier_applyModifier;
+
typeArrInit = 0;
#undef INIT_TYPE
}
@@ -5261,6 +6962,7 @@ int modifiers_getCageIndex(Object *ob, int *lastPossibleCageIndex_r)
if (!(md->mode & eModifierMode_Editmode)) continue;
if (mti->isDisabled && mti->isDisabled(md)) continue;
if (!(mti->flags & eModifierTypeFlag_SupportsEditmode)) continue;
+ if (md->mode & eModifierMode_DisableTemporary) continue;
if (!modifier_supportsMapping(md))
break;
@@ -5281,6 +6983,13 @@ int modifiers_isSoftbodyEnabled(Object *ob)
return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
}
+int modifiers_isParticleEnabled(Object *ob)
+{
+ ModifierData *md = modifiers_findByType(ob, eModifierType_ParticleSystem);
+
+ return (md && md->mode & (eModifierMode_Realtime | eModifierMode_Render));
+}
+
LinkNode *modifiers_calcDataMasks(ModifierData *md, CustomDataMask dataMask)
{
LinkNode *dataMasks = NULL;
@@ -5440,20 +7149,37 @@ int modifiers_usesArmature(Object *ob, bArmature *arm)
return 0;
}
+int modifier_isDeformer(ModifierData *md)
+{
+ if (md->type==eModifierType_Armature)
+ return 1;
+ if (md->type==eModifierType_Curve)
+ return 1;
+ if (md->type==eModifierType_Lattice)
+ return 1;
+
+ return 0;
+}
+
int modifiers_isDeformed(Object *ob)
{
ModifierData *md = modifiers_getVirtualModifierList(ob);
for (; md; md=md->next) {
if(ob==G.obedit && (md->mode & eModifierMode_Editmode)==0);
- else {
- if (md->type==eModifierType_Armature)
- return 1;
- if (md->type==eModifierType_Curve)
- return 1;
- if (md->type==eModifierType_Lattice)
- return 1;
- }
+ else if(modifier_isDeformer(md))
+ return 1;
}
return 0;
}
+
+int modifiers_indexInObject(Object *ob, ModifierData *md_seek)
+{
+ int i= 0;
+ ModifierData *md;
+
+ for (md=ob->modifiers.first; (md && md_seek!=md); md=md->next, i++);
+ if (!md) return -1; /* modifier isnt in the object */
+ return i;
+}
+
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index e7b7b36aaa4..651115b7180 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -2331,6 +2331,7 @@ static void registerCompositNodes(ListBase *ntypelist)
nodeRegisterType(ntypelist, &cmp_node_normal);
nodeRegisterType(ntypelist, &cmp_node_curve_vec);
nodeRegisterType(ntypelist, &cmp_node_map_value);
+ nodeRegisterType(ntypelist, &cmp_node_normalize);
nodeRegisterType(ntypelist, &cmp_node_filter);
nodeRegisterType(ntypelist, &cmp_node_blur);
@@ -2362,8 +2363,13 @@ static void registerCompositNodes(ListBase *ntypelist)
nodeRegisterType(ntypelist, &cmp_node_rotate);
nodeRegisterType(ntypelist, &cmp_node_scale);
nodeRegisterType(ntypelist, &cmp_node_flip);
+ nodeRegisterType(ntypelist, &cmp_node_crop);
nodeRegisterType(ntypelist, &cmp_node_displace);
nodeRegisterType(ntypelist, &cmp_node_mapuv);
+
+ nodeRegisterType(ntypelist, &cmp_node_glare);
+ nodeRegisterType(ntypelist, &cmp_node_tonemap);
+ nodeRegisterType(ntypelist, &cmp_node_lensdist);
}
static void registerShaderNodes(ListBase *ntypelist)
@@ -2388,6 +2394,9 @@ static void registerShaderNodes(ListBase *ntypelist)
nodeRegisterType(ntypelist, &sh_node_rgb);
nodeRegisterType(ntypelist, &sh_node_texture);
nodeRegisterType(ntypelist, &sh_node_invert);
+ nodeRegisterType(ntypelist, &sh_node_seprgb);
+ nodeRegisterType(ntypelist, &sh_node_combrgb);
+ nodeRegisterType(ntypelist, &sh_node_hue_sat);
}
void init_nodesystem(void)
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 4cb6f64569f..d9b2ce84fa5 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -60,6 +60,7 @@
#include "DNA_object_force.h"
#include "DNA_object_fluidsim.h"
#include "DNA_oops_types.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -70,6 +71,7 @@
#include "BKE_armature.h"
#include "BKE_action.h"
+#include "BKE_colortools.h"
#include "BKE_deform.h"
#include "BKE_DerivedMesh.h"
#include "BKE_nla.h"
@@ -100,6 +102,7 @@
#include "BKE_mball.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_property.h"
#include "BKE_sca.h"
#include "BKE_scene.h"
@@ -163,6 +166,15 @@ void object_free_modifiers(Object *ob)
modifier_free(md);
}
+
+ /* particle modifiers were freed, so free the particlesystems as well */
+ while(ob->particlesystem.first){
+ ParticleSystem *psys = ob->particlesystem.first;
+
+ BLI_remlink(&ob->particlesystem,psys);
+
+ psys_free(ob,psys);
+ }
}
/* here we will collect all local displist stuff */
@@ -221,7 +233,6 @@ void free_object(Object *ob)
MEM_freeN(ob->pose);
}
free_effects(&ob->effect);
- BLI_freelistN(&ob->network);
free_properties(&ob->prop);
object_free_modifiers(ob);
@@ -235,7 +246,11 @@ void free_object(Object *ob)
BPY_free_scriptlink(&ob->scriptlink);
- if(ob->pd) MEM_freeN(ob->pd);
+ if(ob->pd){
+ if(ob->pd->tex)
+ ob->pd->tex->id.us--;
+ MEM_freeN(ob->pd);
+ }
if(ob->soft) sbFree(ob->soft);
if(ob->fluidsimSettings) fluidsimSettingsFree(ob->fluidsimSettings);
}
@@ -260,10 +275,10 @@ void unlink_object(Object *ob)
Tex *tex;
Ipo *ipo;
Group *group;
+ Camera *camera;
bConstraint *con;
bActionStrip *strip;
int a;
- char *str;
unlink_controllers(&ob->controllers);
unlink_actuators(&ob->actuators);
@@ -312,9 +327,23 @@ void unlink_object(Object *ob)
bPoseChannel *pchan;
for(pchan= obt->pose->chanbase.first; pchan; pchan= pchan->next) {
for (con = pchan->constraints.first; con; con=con->next) {
- if(ob==get_constraint_target(con, &str)) {
- set_constraint_target(con, NULL, NULL);
- obt->recalc |= OB_RECALC_DATA;
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar == ob) {
+ ct->tar = NULL;
+ strcpy(ct->subtarget, "");
+ obt->recalc |= OB_RECALC_DATA;
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
}
}
if(pchan->custom==ob)
@@ -325,9 +354,23 @@ void unlink_object(Object *ob)
sca_remove_ob_poin(obt, ob);
for (con = obt->constraints.first; con; con=con->next) {
- if(ob==get_constraint_target(con, &str)) {
- set_constraint_target(con, NULL, NULL);
- obt->recalc |= OB_RECALC_OB;
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar == ob) {
+ ct->tar = NULL;
+ strcpy(ct->subtarget, "");
+ obt->recalc |= OB_RECALC_DATA;
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
}
}
@@ -352,6 +395,47 @@ void unlink_object(Object *ob)
}
}
+ /* particle systems */
+ if(obt->particlesystem.first) {
+ ParticleSystem *tpsys= obt->particlesystem.first;
+ for(; tpsys; tpsys=tpsys->next) {
+ if(tpsys->keyed_ob==ob) {
+ ParticleSystem *psys= BLI_findlink(&ob->particlesystem,tpsys->keyed_psys-1);
+
+ if(psys && psys->keyed_ob) {
+ tpsys->keyed_ob= psys->keyed_ob;
+ tpsys->keyed_psys= psys->keyed_psys;
+ }
+ else
+ tpsys->keyed_ob= NULL;
+
+ obt->recalc |= OB_RECALC_DATA;
+ }
+
+ if(tpsys->target_ob==ob) {
+ tpsys->target_ob= NULL;
+ obt->recalc |= OB_RECALC_DATA;
+ }
+
+ if(tpsys->part->dup_ob==ob)
+ tpsys->part->dup_ob= NULL;
+
+ if(tpsys->part->flag&PART_STICKY) {
+ ParticleData *pa;
+ int p;
+
+ for(p=0,pa=tpsys->particles; p<tpsys->totpart; p++,pa++) {
+ if(pa->stick_ob==ob) {
+ pa->stick_ob= 0;
+ pa->flag &= ~PARS_STICKY;
+ }
+ }
+ }
+ }
+ if(ob->pd)
+ obt->recalc |= OB_RECALC_DATA;
+ }
+
obt= obt->id.next;
}
@@ -473,6 +557,15 @@ void unlink_object(Object *ob)
rem_from_group(group, ob);
group= group->id.next;
}
+
+ /* cameras */
+ camera= G.main->camera.first;
+ while(camera) {
+ if (camera->dof_ob==ob) {
+ camera->dof_ob = NULL;
+ }
+ camera= camera->id.next;
+ }
}
int exist_object(Object *obtest)
@@ -573,7 +666,23 @@ void make_local_camera(Camera *cam)
}
}
-
+/* get the camera's dof value, takes the dof object into account */
+float dof_camera(Object *ob)
+{
+ Camera *cam = (Camera *)ob->data;
+ if (ob->type != OB_CAMERA)
+ return 0.0;
+ if (cam->dof_ob) {
+ /* too simple, better to return the distance on the view axis only
+ * return VecLenf(ob->obmat[3], cam->dof_ob->obmat[3]); */
+
+ float mat[4][4];
+ Mat4Invert(ob->imat, ob->obmat);
+ Mat4MulMat4(mat, cam->dof_ob->obmat, ob->imat);
+ return fabs(mat[3][2]);
+ }
+ return cam->YF_dofdist;
+}
void *add_lamp(char *name)
{
@@ -599,7 +708,12 @@ void *add_lamp(char *name)
la->area_size=la->area_sizey=la->area_sizez= 1.0;
la->buffers= 1;
la->buftype= LA_SHADBUF_HALFWAY;
-
+ la->ray_samp_method = LA_SAMP_HALTON;
+ la->adapt_thresh = 0.001;
+ la->preview=NULL;
+ la->falloff_type = LA_FALLOFF_INVLINEAR;
+ la->curfalloff = curvemapping_add(1, 0.0f, 1.0f, 1.0f, 0.0f);
+ curvemapping_initialize(la->curfalloff);
return la;
}
@@ -618,8 +732,12 @@ Lamp *copy_lamp(Lamp *la)
}
}
+ lan->curfalloff = curvemapping_copy(la->curfalloff);
+
id_us_plus((ID *)lan->ipo);
+ if (la->preview) lan->preview = BKE_previewimg_copy(la->preview);
+
BPY_copy_scriptlink(&la->scriptlink);
return lan;
@@ -690,7 +808,7 @@ void free_lamp(Lamp *la)
/* scriptlinks */
BPY_free_scriptlink(&la->scriptlink);
-
+
for(a=0; a<MAX_MTEX; a++) {
mtex= la->mtex[a];
if(mtex && mtex->tex) mtex->tex->id.us--;
@@ -698,6 +816,9 @@ void free_lamp(Lamp *la)
}
la->ipo= 0;
+ curvemapping_free(la->curfalloff);
+
+ BKE_previewimg_free(&la->preview);
BKE_icon_delete(&la->id);
la->id.icon_id = 0;
}
@@ -772,6 +893,7 @@ Object *add_only_object(int type, char *name)
ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
+ Mat4One(ob->constinv);
Mat4One(ob->parentinv);
Mat4One(ob->obmat);
ob->dt= OB_SHADED;
@@ -850,13 +972,15 @@ void base_init_from_view3d(Base *base, View3D *v3d)
VECCOPY(ob->loc, G.scene->cursor);
}
- v3d->viewquat[0]= -v3d->viewquat[0];
- if (ob->transflag & OB_QUAT) {
- QUATCOPY(ob->quat, v3d->viewquat);
- } else {
- QuatToEul(v3d->viewquat, ob->rot);
+ if (U.flag & USER_ADD_VIEWALIGNED) {
+ v3d->viewquat[0]= -v3d->viewquat[0];
+ if (ob->transflag & OB_QUAT) {
+ QUATCOPY(ob->quat, v3d->viewquat);
+ } else {
+ QuatToEul(v3d->viewquat, ob->rot);
+ }
+ v3d->viewquat[0]= -v3d->viewquat[0];
}
- v3d->viewquat[0]= -v3d->viewquat[0];
}
SoftBody *copy_softbody(SoftBody *sb)
@@ -878,6 +1002,22 @@ SoftBody *copy_softbody(SoftBody *sb)
return sbn;
}
+ParticleSystem *copy_particlesystem(ParticleSystem *psys)
+{
+ ParticleSystem *psysn;
+
+ psysn= MEM_dupallocN(psys);
+ psysn->particles= MEM_dupallocN(psys->particles);
+
+ psysn->child= MEM_dupallocN(psys->child);
+
+ psysn->effectors.first= psysn->effectors.last= 0;
+
+ id_us_plus((ID *)psysn->part);
+
+ return psysn;
+}
+
static void copy_object_pose(Object *obn, Object *ob)
{
bPoseChannel *chan;
@@ -886,11 +1026,25 @@ static void copy_object_pose(Object *obn, Object *ob)
for (chan = obn->pose->chanbase.first; chan; chan=chan->next){
bConstraint *con;
- char *str;
+
chan->flag &= ~(POSE_LOC|POSE_ROT|POSE_SIZE);
- for(con= chan->constraints.first; con; con= con->next) {
- if(ob==get_constraint_target(con, &str))
- set_constraint_target(con, obn, NULL);
+
+ for (con= chan->constraints.first; con; con= con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar == ob)
+ ct->tar = obn;
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
+ }
}
}
}
@@ -899,6 +1053,7 @@ Object *copy_object(Object *ob)
{
Object *obn;
ModifierData *md;
+ ParticleSystem *psys;
int a;
obn= copy_libblock(ob);
@@ -920,8 +1075,6 @@ Object *copy_object(Object *ob)
BLI_addtail(&obn->modifiers, nmd);
}
- obn->network.first= obn->network.last= 0;
-
BPY_copy_scriptlink(&ob->scriptlink);
copy_properties(&obn->prop, &ob->prop);
@@ -951,7 +1104,11 @@ Object *copy_object(Object *ob)
obn->disp.first= obn->disp.last= NULL;
- if(ob->pd) obn->pd= MEM_dupallocN(ob->pd);
+ if(ob->pd){
+ obn->pd= MEM_dupallocN(ob->pd);
+ if(obn->pd->tex)
+ id_us_plus(&(obn->pd->tex->id));
+ }
obn->soft= copy_softbody(ob->soft);
/* NT copy fluid sim setting memory */
@@ -962,6 +1119,23 @@ Object *copy_object(Object *ob)
obn->fluidsimSettings->orgMesh = (Mesh *)obn->data;
}
}
+
+ obn->particlesystem.first= obn->particlesystem.last= NULL;
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ ParticleSystemModifierData *psmd;
+ ParticleSystem *npsys= copy_particlesystem(psys);
+
+ BLI_addtail(&obn->particlesystem, npsys);
+
+ /* need to update particle modifiers too */
+ for(md=obn->modifiers.first; md; md=md->next) {
+ if(md->type==eModifierType_ParticleSystem) {
+ psmd= (ParticleSystemModifierData*)md;
+ if(psmd->psys==psys)
+ psmd->psys= npsys;
+ }
+ }
+ }
obn->derivedDeform = NULL;
obn->derivedFinal = NULL;
@@ -1061,6 +1235,20 @@ void make_local_object(Object *ob)
/* *************** PROXY **************** */
+/* when you make proxy, ensure the exposed layers are extern */
+void armature_set_id_extern(Object *ob)
+{
+ bArmature *arm= ob->data;
+ bPoseChannel *pchan;
+ int lay= arm->layer_protected;
+
+ for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ if(!(pchan->bone->layer & lay))
+ id_lib_extern((ID *)pchan->custom);
+ }
+
+}
+
/* proxy rule: lib_object->proxy_from == the one we borrow from, set temporally while object_update */
/* local_object->proxy == pointer to library object, saved in files and read */
/* local_object->proxy_group == pointer to group dupli-object, saved in files and read */
@@ -1084,6 +1272,8 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
VECCOPY(ob->loc, gob->loc);
VECCOPY(ob->rot, gob->rot);
VECCOPY(ob->size, gob->size);
+
+ group_tag_recalc(gob->dup_group);
}
else {
VECCOPY(ob->loc, target->loc);
@@ -1106,6 +1296,8 @@ void object_make_proxy(Object *ob, Object *target, Object *gob)
copy_object_pose(ob, target); /* data copy, object pointers in constraints */
rest_pose(ob->pose); /* clear all transforms in channels */
armature_rebuild_pose(ob, ob->data); /* set all internal links */
+
+ armature_set_id_extern(ob);
}
}
@@ -1134,20 +1326,23 @@ void disable_speed_curve(int val)
}
/* ob can be NULL */
-float bsystem_time(Object *ob, Object *par, float cfra, float ofs)
+float bsystem_time(Object *ob, float cfra, float ofs)
{
/* returns float ( see frame_to_float in ipo.c) */
-
+
+ /* bluroffs and fieldoffs are ugly globals that are set by render */
cfra+= bluroffs+fieldoffs;
/* global time */
cfra*= G.scene->r.framelen;
- if(no_speed_curve==0) if(ob && ob->ipo) cfra= calc_ipo_time(ob->ipo, cfra);
-
- /* ofset frames */
- if(ob && (ob->ipoflag & OB_OFFS_PARENT)) {
- if((ob->partype & PARSLOW)==0) cfra-= ob->sf;
+ if (ob) {
+ if (no_speed_curve==0 && ob->ipo)
+ cfra= calc_ipo_time(ob->ipo, cfra);
+
+ /* ofset frames */
+ if ((ob->ipoflag & OB_OFFS_PARENT) && (ob->partype & PARSLOW)==0)
+ cfra-= ob->sf;
}
cfra-= ofs;
@@ -1238,7 +1433,7 @@ static void ob_parcurve(Object *ob, Object *par, float mat[][4])
}
/* catch exceptions: curve paths used as a duplicator */
else if(enable_cu_speed) {
- ctime= bsystem_time(ob, par, (float)G.scene->r.cfra, 0.0);
+ ctime= bsystem_time(ob, (float)G.scene->r.cfra, 0.0);
if(calc_ipo_spec(cu->ipo, CU_SPEED, &ctime)==0) {
ctime /= cu->pathlen;
@@ -1490,7 +1685,7 @@ void where_is_object_time(Object *ob, float ctime)
if(ob==NULL) return;
/* this is needed to be able to grab objects with ipos, otherwise it always freezes them */
- stime= bsystem_time(ob, 0, ctime, 0.0);
+ stime= bsystem_time(ob, ctime, 0.0);
if(stime != ob->ctime) {
ob->ctime= stime;
@@ -1502,12 +1697,14 @@ void where_is_object_time(Object *ob, float ctime)
else
do_all_object_actions(ob);
- /* do constraint ipos ..., note it needs stime */
- do_constraint_channels(&ob->constraints, &ob->constraintChannels, stime);
+ /* do constraint ipos ..., note it needs stime (0 = all ipos) */
+ do_constraint_channels(&ob->constraints, &ob->constraintChannels, stime, 0);
}
else {
/* but, the drivers have to be done */
if(ob->ipo) do_ob_ipodrivers(ob, ob->ipo, stime);
+ /* do constraint ipos ..., note it needs stime (1 = only drivers ipos) */
+ do_constraint_channels(&ob->constraints, &ob->constraintChannels, stime, 1);
}
if(ob->parent) {
@@ -1560,9 +1757,18 @@ void where_is_object_time(Object *ob, float ctime)
}
- /* constraints need ctime, not stime. it calls where_is_object_time and bsystem_time */
- solve_constraints (ob, TARGET_OBJECT, NULL, ctime);
-
+ /* solve constraints */
+ if (ob->constraints.first) {
+ bConstraintOb *cob;
+
+ cob= constraints_make_evalob(ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
+
+ /* constraints need ctime, not stime. Some call where_is_object_time and bsystem_time */
+ solve_constraints (&ob->constraints, cob, ctime);
+
+ constraints_clear_evalob(cob);
+ }
+
if(ob->scriptlink.totscript && !during_script()) {
if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript((ID *)ob, SCRIPT_REDRAW);
}
@@ -1728,132 +1934,26 @@ for a lamp that is the child of another object */
if(ob->track)
solve_tracking(ob, ob->track->obmat);
- solve_constraints(ob, TARGET_OBJECT, NULL, G.scene->r.cfra);
+ /* solve constraints */
+ if (ob->constraints.first) {
+ bConstraintOb *cob;
+
+ cob= constraints_make_evalob(ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
+ solve_constraints (&ob->constraints, cob, G.scene->r.cfra);
+ constraints_clear_evalob(cob);
+ }
/* WATCH IT!!! */
ob->ipo= ipo;
-
-}
-extern void Mat4BlendMat4(float out[][4], float dst[][4], float src[][4], float srcweight);
-
-void solve_constraints (Object *ob, short obtype, void *obdata, float ctime)
-{
- bConstraint *con;
- float tmat[4][4], focusmat[4][4], lastmat[4][4];
- int i, clear=1, tot=0;
- float a=0;
- float aquat[4], quat[4];
- float aloc[3], loc[3];
- float asize[3], size[3];
- float oldmat[4][4];
- float smat[3][3], rmat[3][3], mat[3][3];
- float enf;
-
- for (con = ob->constraints.first; con; con=con->next) {
- // inverse kinematics is solved seperate
- if (con->type==CONSTRAINT_TYPE_KINEMATIC) continue;
- // and this we can skip completely
- if (con->flag & CONSTRAINT_DISABLE) continue;
- // local constraints are handled in armature.c only
- if (con->flag & CONSTRAINT_LOCAL) continue;
-
- /* Clear accumulators if necessary*/
- if (clear) {
- clear= 0;
- a= 0;
- tot= 0;
- memset(aquat, 0, sizeof(float)*4);
- memset(aloc, 0, sizeof(float)*3);
- memset(asize, 0, sizeof(float)*3);
- }
-
- enf = con->enforce; // value from ipos (from action channels)
-
- /* Get the targetmat */
- get_constraint_target_matrix(con, obtype, obdata, tmat, size, ctime);
-
- Mat4CpyMat4(focusmat, tmat);
-
- /* Extract the components & accumulate */
- Mat4ToQuat(focusmat, quat);
- VECCOPY(loc, focusmat[3]);
- Mat3CpyMat4(mat, focusmat);
- Mat3ToSize(mat, size);
-
- a+= enf;
- tot++;
-
- for(i=0; i<3; i++) {
- aquat[i+1]+=(quat[i+1]) * enf;
- aloc[i]+=(loc[i]) * enf;
- asize[i]+=(size[i]-1.0f) * enf;
- }
- aquat[0]+=(quat[0])*enf;
- Mat4CpyMat4(lastmat, focusmat);
-
- /* removed for now, probably becomes option? (ton) */
-
- /* If the next constraint is not the same type (or there isn't one),
- * then evaluate the accumulator & request a clear */
- if (TRUE) { //(!con->next)||(con->next && con->next->type!=con->type)) {
- clear= 1;
- Mat4CpyMat4(oldmat, ob->obmat);
-
- /* If we have several inputs, do a blend of them */
- if (tot) {
- if (tot>1) {
- if (a) {
- for (i=0; i<3; i++) {
- asize[i]=1.0f + (asize[i]/(a));
- aloc[i]=(aloc[i]/a);
- }
-
- NormalQuat(aquat);
-
- QuatToMat3(aquat, rmat);
- SizeToMat3(asize, smat);
- Mat3MulMat3(mat, rmat, smat);
- Mat4CpyMat3(focusmat, mat);
- VECCOPY(focusmat[3], aloc);
-
- evaluate_constraint(con, ob, obtype, obdata, focusmat);
- }
-
- }
- /* If we only have one, blend with the current obmat */
- else {
- float solution[4][4];
- float delta[4][4];
- float imat[4][4];
- float identity[4][4];
-
- /* solve the constraint then blend it to the previous one */
- evaluate_constraint(con, ob, obtype, obdata, lastmat);
-
- Mat4CpyMat4 (solution, ob->obmat);
-
- /* Interpolate the enforcement */
- Mat4Invert (imat, oldmat);
- Mat4MulMat4 (delta, solution, imat);
-
- if (a<1.0) {
- Mat4One(identity);
- Mat4BlendMat4(delta, identity, delta, a);
- }
- Mat4MulMat4 (ob->obmat, delta, oldmat);
- }
- }
- }
- }
}
/* for calculation of the inverse parent transform, only used for editor */
void what_does_parent(Object *ob)
{
-
clear_workob();
Mat4One(workob.obmat);
Mat4One(workob.parentinv);
+ Mat4One(workob.constinv);
workob.parent= ob->parent;
workob.track= ob->track;
@@ -1868,7 +1968,7 @@ void what_does_parent(Object *ob)
workob.constraints.first = ob->constraints.first;
workob.constraints.last = ob->constraints.last;
- strcpy (workob.parsubstr, ob->parsubstr);
+ strcpy(workob.parsubstr, ob->parsubstr);
where_is_object(&workob);
}
@@ -2071,8 +2171,28 @@ void object_handle_update(Object *ob)
where_is_pose(ob);
}
}
+
+ if(ob->particlesystem.first) {
+ ParticleSystem *tpsys, *psys;
+
+ psys= ob->particlesystem.first;
+ while(psys) {
+ if(psys->flag & PSYS_ENABLED) {
+ particle_system_update(ob, psys);
+ psys= psys->next;
+ }
+ else if(psys->flag & PSYS_DELETE) {
+ tpsys=psys->next;
+ BLI_remlink(&ob->particlesystem, psys);
+ psys_free(ob,psys);
+ psys= tpsys;
+ }
+ else
+ psys= psys->next;
+ }
+ }
}
-
+
/* the no-group proxy case, we call update */
if(ob->proxy && ob->proxy_group==NULL) {
/* set pointer in library proxy target, for copying, but restore it */
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
new file mode 100644
index 00000000000..c0de1901f69
--- /dev/null
+++ b/source/blender/blenkernel/intern/particle.c
@@ -0,0 +1,2978 @@
+/* particle.c
+ *
+ *
+ * $Id: particle.c $
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_particle_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_force.h"
+#include "DNA_texture_types.h"
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_key_types.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+#include "BLI_kdtree.h"
+#include "BLI_linklist.h"
+#include "BLI_rand.h"
+
+#include "BKE_anim.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_lattice.h"
+#include "BKE_utildefines.h"
+#include "BKE_displist.h"
+#include "BKE_particle.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_ipo.h"
+#include "BKE_object.h"
+#include "BKE_softbody.h"
+#include "BKE_material.h"
+#include "BKE_key.h"
+#include "BKE_library.h"
+#include "BKE_depsgraph.h"
+#include "BKE_bad_level_calls.h"
+#include "BKE_modifier.h"
+
+#include "blendef.h"
+#include "RE_render_ext.h"
+
+static void key_from_object(Object *ob, ParticleKey *key);
+static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index,
+ float *fuv, float *orco, ParticleTexture *ptex, int event);
+
+/* few helpers for countall etc. */
+int count_particles(ParticleSystem *psys){
+ ParticleSettings *part=psys->part;
+ ParticleData *pa;
+ int tot=0,p;
+
+ for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++){
+ if(pa->alive == PARS_KILLED);
+ else if(pa->alive == PARS_UNBORN && (part->flag & PART_UNBORN)==0);
+ else if(pa->alive == PARS_DEAD && (part->flag & PART_DIED)==0);
+ else if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP));
+ else tot++;
+ }
+ return tot;
+}
+int count_particles_mod(ParticleSystem *psys, int totgr, int cur){
+ ParticleSettings *part=psys->part;
+ ParticleData *pa;
+ int tot=0,p;
+
+ for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++){
+ if(pa->alive == PARS_KILLED);
+ else if(pa->alive == PARS_UNBORN && (part->flag & PART_UNBORN)==0);
+ else if(pa->alive == PARS_DEAD && (part->flag & PART_DIED)==0);
+ else if(pa->flag & (PARS_UNEXIST+PARS_NO_DISP));
+ else if(p%totgr==cur) tot++;
+ }
+ return tot;
+}
+int psys_count_keys(ParticleSystem *psys)
+{
+ ParticleData *pa;
+ int i, totpart=psys->totpart, totkey=0;
+
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++)
+ totkey += pa->totkey;
+
+ return totkey;
+}
+/* remember to free the pointer returned from this! */
+char *psys_menu_string(Object *ob, int for_sb)
+{
+ ParticleSystem *psys;
+ DynStr *ds;
+ char *str, num[6];
+ int i;
+
+ ds = BLI_dynstr_new();
+
+ if(for_sb)
+ BLI_dynstr_append(ds, "|Object%x-1");
+
+ for(i=0,psys=ob->particlesystem.first; psys; i++,psys=psys->next){
+
+ BLI_dynstr_append(ds, "|");
+ sprintf(num,"%i. ",i+1);
+ BLI_dynstr_append(ds, num);
+ BLI_dynstr_append(ds, psys->part->id.name+2);
+ sprintf(num,"%%x%i",i+1);
+ BLI_dynstr_append(ds, num);
+ }
+
+ str = BLI_dynstr_get_cstring(ds);
+
+ BLI_dynstr_free(ds);
+
+ return str;
+}
+/************************************************/
+/* Getting stuff */
+/************************************************/
+/* get object's active particle system safely */
+ParticleSystem *psys_get_current(Object *ob)
+{
+ ParticleSystem *psys;
+ if(ob==0) return 0;
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next){
+ if(psys->flag & PSYS_CURRENT)
+ return psys;
+ }
+
+ return 0;
+}
+short psys_get_current_num(Object *ob)
+{
+ ParticleSystem *psys;
+ short i;
+
+ if(ob==0) return 0;
+
+ for(psys=ob->particlesystem.first, i=0; psys; psys=psys->next, i++)
+ if(psys->flag & PSYS_CURRENT)
+ return i;
+
+ return i;
+}
+/* change object's active particle system */
+void psys_change_act(void *ob_v, void *act_v)
+{
+ Object *ob = ob_v;
+ ParticleSystem *npsys, *psys;
+ short act = *((short*)act_v)-1;
+
+ if(act>=0){
+ npsys=BLI_findlink(&ob->particlesystem,act);
+ psys=psys_get_current(ob);
+
+ if(psys)
+ psys->flag &= ~PSYS_CURRENT;
+ if(npsys)
+ npsys->flag |= PSYS_CURRENT;
+ }
+}
+Object *psys_get_lattice(Object *ob, ParticleSystem *psys)
+{
+ Object *lattice=0;
+
+ if(!psys_in_edit_mode(psys)==0){
+
+ ModifierData *md = (ModifierData*)psys_get_modifier(ob,psys);
+
+ for(; md; md=md->next){
+ if(md->type==eModifierType_Lattice){
+ LatticeModifierData *lmd = (LatticeModifierData *)md;
+ lattice=lmd->object;
+ break;
+ }
+ }
+ if(lattice)
+ init_latt_deform(lattice,0);
+ }
+
+ return lattice;
+}
+void psys_disable_all(Object *ob)
+{
+ ParticleSystem *psys=ob->particlesystem.first;
+
+ for(; psys; psys=psys->next)
+ psys->flag &= ~PSYS_ENABLED;
+}
+void psys_enable_all(Object *ob)
+{
+ ParticleSystem *psys=ob->particlesystem.first;
+
+ for(; psys; psys=psys->next)
+ psys->flag |= PSYS_ENABLED;
+}
+int psys_ob_has_hair(Object *ob)
+{
+ ParticleSystem *psys = ob->particlesystem.first;
+
+ for(; psys; psys=psys->next)
+ if(psys->part->type == PART_HAIR)
+ return 1;
+
+ return 0;
+}
+int psys_in_edit_mode(ParticleSystem *psys)
+{
+ return ((G.f & G_PARTICLEEDIT) && psys==psys_get_current(OBACT) && psys->edit);
+}
+
+/************************************************/
+/* Freeing stuff */
+/************************************************/
+void psys_free_settings(ParticleSettings *part)
+{
+ if(part->pd)
+ MEM_freeN(part->pd);
+}
+void free_hair(ParticleSystem *psys)
+{
+ ParticleData *pa;
+ int i, totpart=psys->totpart;
+
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++) {
+ if(pa->hair)
+ MEM_freeN(pa->hair);
+ pa->hair = NULL;
+ }
+
+ psys->flag &= ~PSYS_HAIR_DONE;
+}
+void free_keyed_keys(ParticleSystem *psys)
+{
+ if(psys->particles && psys->particles->keys)
+ MEM_freeN(psys->particles->keys);
+}
+void free_child_path_cache(ParticleSystem *psys)
+{
+
+ if(psys->childcache){
+ if(psys->childcache[0])
+ MEM_freeN(psys->childcache[0]);
+
+ MEM_freeN(psys->childcache);
+
+ psys->childcache = NULL;
+ psys->totchildcache = 0;
+ }
+}
+void psys_free_path_cache(ParticleSystem *psys)
+{
+ if(psys->pathcache){
+ if(psys->pathcache[0])
+ MEM_freeN(psys->pathcache[0]);
+
+ MEM_freeN(psys->pathcache);
+
+ psys->pathcache = NULL;
+ psys->totcached = 0;
+ }
+ free_child_path_cache(psys);
+}
+/* free everything */
+void psys_free(Object *ob, ParticleSystem * psys)
+{
+ if(psys){
+ if(ob->particlesystem.first == NULL && G.f & G_PARTICLEEDIT)
+ G.f &= ~G_PARTICLEEDIT;
+
+ psys_free_path_cache(psys);
+
+ free_hair(psys);
+
+ free_keyed_keys(psys);
+
+ PE_free_particle_edit(psys);
+
+ if(psys->particles){
+ MEM_freeN(psys->particles);
+ psys->particles = 0;
+ psys->totpart = 0;
+ }
+
+ if(psys->child){
+ MEM_freeN(psys->child);
+ psys->child = 0;
+ psys->totchild = 0;
+ }
+
+ if(psys->effectors.first)
+ psys_end_effectors(psys);
+
+ if(psys->part){
+ psys->part->id.us--;
+ psys->part=0;
+ }
+
+ if(psys->soft){
+ sbFree(psys->soft);
+ psys->soft = 0;
+ }
+
+ MEM_freeN(psys);
+ }
+}
+
+/************************************************/
+/* Interpolated Particles */
+/************************************************/
+static float interpolate_particle_value(float v1, float v2, float v3, float v4, float *w, int four)
+{
+ float value;
+
+ value= w[0]*v1 + w[1]*v2 + w[2]*v3;
+ if(four)
+ value += w[3]*v4;
+
+ return value;
+}
+static void weighted_particle_vector(float *v1, float *v2, float *v3, float *v4, float *weights, float *vec)
+{
+ vec[0]= weights[0]*v1[0] + weights[1]*v2[0] + weights[2]*v3[0] + weights[3]*v4[0];
+ vec[1]= weights[0]*v1[1] + weights[1]*v2[1] + weights[2]*v3[1] + weights[3]*v4[1];
+ vec[2]= weights[0]*v1[2] + weights[1]*v2[2] + weights[2]*v3[2] + weights[3]*v4[2];
+}
+static void interpolate_particle(short type, ParticleKey keys[4], float dt, ParticleKey *result)
+{
+ float t[4];
+
+ if(type<0) {
+ VecfCubicInterpol(keys[1].co, keys[1].vel, keys[2].co, keys[2].vel, dt, result->co, result->vel);
+ }
+ else {
+ set_four_ipo(dt, t, type);
+
+ weighted_particle_vector(keys[0].co, keys[1].co, keys[2].co, keys[3].co, t, result->co);
+
+ //if(ve){
+ // if(dt>0.999f){
+ // set_four_ipo(dt+0.001f,t,ipo_type);
+ // weighted_particle_vector(key0->co,key1->co,key2->co,key3->co,t,temp);
+ // VECSUB(ve,temp,co);
+ // }
+ // else{
+ // set_four_ipo(dt-0.001f,t,ipo_type);
+ // weighted_particle_vector(key0->co,key1->co,key2->co,key3->co,t,temp);
+ // VECSUB(ve,co,temp);
+ // }
+ //}
+ }
+}
+
+
+
+/************************************************/
+/* Particles on a dm */
+/************************************************/
+/* interpolate a location on a face based on face coordinates */
+void psys_interpolate_face(MVert *mvert, MFace *mface, MTFace *tface, float *w, float *vec, float *nor, float *utan, float *vtan){
+ float *v1=0, *v2=0, *v3=0, *v4=0;
+ float e1[3],e2[3],s1,s2,t1,t2;
+ float *uv1, *uv2, *uv3, *uv4;
+ float n1[3], n2[3], n3[3], n4[3];
+ float tuv[4][2];
+
+ v1= (mvert+mface->v1)->co;
+ v2= (mvert+mface->v2)->co;
+ v3= (mvert+mface->v3)->co;
+ VECCOPY(n1,(mvert+mface->v1)->no);
+ VECCOPY(n2,(mvert+mface->v2)->no);
+ VECCOPY(n3,(mvert+mface->v3)->no);
+ Normalize(n1);
+ Normalize(n2);
+ Normalize(n3);
+
+ if(mface->v4) {
+ v4= (mvert+mface->v4)->co;
+ VECCOPY(n4,(mvert+mface->v4)->no);
+ Normalize(n4);
+
+ vec[0]= w[0]*v1[0] + w[1]*v2[0] + w[2]*v3[0] + w[3]*v4[0];
+ vec[1]= w[0]*v1[1] + w[1]*v2[1] + w[2]*v3[1] + w[3]*v4[1];
+ vec[2]= w[0]*v1[2] + w[1]*v2[2] + w[2]*v3[2] + w[3]*v4[2];
+
+ if(nor){
+ if(mface->flag & ME_SMOOTH){
+ nor[0]= w[0]*n1[0] + w[1]*n2[0] + w[2]*n3[0] + w[3]*n4[0];
+ nor[1]= w[0]*n1[1] + w[1]*n2[1] + w[2]*n3[1] + w[3]*n4[1];
+ nor[2]= w[0]*n1[2] + w[1]*n2[2] + w[2]*n3[2] + w[3]*n4[2];
+ }
+ else
+ CalcNormFloat4(v1,v2,v3,v4,nor);
+ }
+ }
+ else {
+ vec[0]= w[0]*v1[0] + w[1]*v2[0] + w[2]*v3[0];
+ vec[1]= w[0]*v1[1] + w[1]*v2[1] + w[2]*v3[1];
+ vec[2]= w[0]*v1[2] + w[1]*v2[2] + w[2]*v3[2];
+
+ if(nor){
+ if(mface->flag & ME_SMOOTH){
+ nor[0]= w[0]*n1[0] + w[1]*n2[0] + w[2]*n3[0];
+ nor[1]= w[0]*n1[1] + w[1]*n2[1] + w[2]*n3[1];
+ nor[2]= w[0]*n1[2] + w[1]*n2[2] + w[2]*n3[2];
+ }
+ else
+ CalcNormFloat(v1,v2,v3,nor);
+ }
+ }
+
+ /* calculate tangent vectors */
+ if(utan && vtan){
+ if(tface){
+ uv1= tface->uv[0];
+ uv2= tface->uv[1];
+ uv3= tface->uv[2];
+ uv4= tface->uv[3];
+ }
+ else{
+ uv1= tuv[0]; uv2= tuv[1]; uv3= tuv[2]; uv4= tuv[3];
+ spheremap(v1[0], v1[1], v1[2], uv1, uv1+1);
+ spheremap(v2[0], v2[1], v2[2], uv2, uv2+1);
+ spheremap(v3[0], v3[1], v3[2], uv3, uv3+1);
+ if(v4)
+ spheremap(v4[0], v4[1], v4[2], uv4, uv4+1);
+ }
+
+ if(v4){
+ s1= uv3[0] - uv1[0];
+ s2= uv4[0] - uv1[0];
+
+ t1= uv3[1] - uv1[1];
+ t2= uv4[1] - uv1[1];
+
+ VecSubf(e1, v3, v1);
+ VecSubf(e2, v4, v1);
+ }
+ else{
+ s1= uv2[0] - uv1[0];
+ s2= uv3[0] - uv1[0];
+
+ t1= uv2[1] - uv1[1];
+ t2= uv3[1] - uv1[1];
+
+ VecSubf(e1, v2, v1);
+ VecSubf(e2, v3, v1);
+ }
+
+ vtan[0] = (s1*e2[0] - s2*e1[0]);
+ vtan[1] = (s1*e2[1] - s2*e1[1]);
+ vtan[2] = (s1*e2[2] - s2*e1[2]);
+
+ utan[0] = (t1*e2[0] - t2*e1[0]);
+ utan[1] = (t1*e2[1] - t2*e1[1]);
+ utan[2] = (t1*e2[2] - t2*e1[2]);
+ }
+}
+void psys_interpolate_uvs(MTFace *tface, int quad, float *w, float *uvco){
+ float v10= tface->uv[0][0];
+ float v11= tface->uv[0][1];
+ float v20= tface->uv[1][0];
+ float v21= tface->uv[1][1];
+ float v30= tface->uv[2][0];
+ float v31= tface->uv[2][1];
+ float v40,v41;
+
+ if(quad) {
+ v40= tface->uv[3][0];
+ v41= tface->uv[3][1];
+
+ uvco[0]= w[0]*v10 + w[1]*v20 + w[2]*v30 + w[3]*v40;
+ uvco[1]= w[0]*v11 + w[1]*v21 + w[2]*v31 + w[3]*v41;
+ }
+ else {
+ uvco[0]= w[0]*v10 + w[1]*v20 + w[2]*v30;
+ uvco[1]= w[0]*v11 + w[1]*v21 + w[2]*v31;
+ }
+}
+float psys_interpolate_value_from_verts(DerivedMesh *dm, short from, int index, float *fw, float *values)
+{
+ if(values==0)
+ return 0.0;
+
+ switch(from){
+ case PART_FROM_VERT:
+ return values[index];
+ case PART_FROM_FACE:
+ case PART_FROM_VOLUME:
+ {
+ MFace *mf=dm->getFaceData(dm,index,CD_MFACE);
+ return interpolate_particle_value(values[mf->v1],values[mf->v2],values[mf->v3],values[mf->v4],fw,mf->v4);
+ }
+
+ }
+ return 0.0;
+}
+
+/* conversion of pa->fw to origspace layer coordinates */
+static void psys_w_to_origspace(float *w, float *uv)
+{
+ uv[0]= w[1] + w[2];
+ uv[1]= w[2] + w[3];
+}
+
+/* conversion of pa->fw to weights in face from origspace */
+static void psys_origspace_to_w(OrigSpaceFace *osface, int quad, float *w, float *neww)
+{
+ float v[4][3], co[3];
+
+ v[0][0]= osface->uv[0][0]; v[0][1]= osface->uv[0][1]; v[0][2]= 0.0f;
+ v[1][0]= osface->uv[1][0]; v[1][1]= osface->uv[1][1]; v[1][2]= 0.0f;
+ v[2][0]= osface->uv[2][0]; v[2][1]= osface->uv[2][1]; v[2][2]= 0.0f;
+
+ psys_w_to_origspace(w, co);
+ co[2]= 0.0f;
+
+ if(quad) {
+ v[3][0]= osface->uv[3][0]; v[3][1]= osface->uv[3][1]; v[3][2]= 0.0f;
+ MeanValueWeights(v, 4, co, neww);
+ }
+ else {
+ MeanValueWeights(v, 3, co, neww);
+ neww[3]= 0.0f;
+ }
+}
+
+/* find the derived mesh face for a particle, set the mf passed.
+This is slow, can be optimized but only for many lookups, return the face lookup index*/
+int psys_particle_dm_face_lookup(Object *ob, DerivedMesh *dm, int index, float *fw, struct LinkNode *node)
+{
+ Mesh *me= (Mesh*)ob->data;
+ MFace *mface;
+ OrigSpaceFace *osface;
+ int *origindex;
+ int quad, findex, totface;
+ float uv[2], (*faceuv)[2];
+
+ mface = dm->getFaceDataArray(dm, CD_MFACE);
+ origindex = dm->getFaceDataArray(dm, CD_ORIGINDEX);
+ osface = dm->getFaceDataArray(dm, CD_ORIGSPACE);
+
+ totface = dm->getNumFaces(dm);
+
+ if(osface==NULL || origindex==NULL) {
+ /* Assume we dont need osface data */
+ if (index <totface) {
+ printf("\tNO CD_ORIGSPACE, assuming not needed\n");
+ return index;
+ } else {
+ printf("\tNO CD_ORIGSPACE, error out of range\n");
+ return DMCACHE_NOTFOUND;
+ }
+ }
+ else if(index >= me->totface)
+ return DMCACHE_NOTFOUND; /* index not in the original mesh */
+
+ psys_w_to_origspace(fw, uv);
+
+ if(node) { /* we have a linked list of faces that we use, faster! */
+ for(;node; node=node->next) {
+ findex= (int)node->link;
+ faceuv= osface[findex].uv;
+ quad= mface[findex].v4;
+
+ /* check that this intersects - Its possible this misses :/ -
+ * could also check its not between */
+ if(quad) {
+ if(IsectPQ2Df(uv, faceuv[0], faceuv[1], faceuv[2], faceuv[3]))
+ return findex;
+ }
+ else if(IsectPT2Df(uv, faceuv[0], faceuv[1], faceuv[2]))
+ return findex;
+ }
+ }
+ else { /* if we have no node, try every face */
+ for(findex=0; findex<totface; findex++) {
+ if(origindex[findex] == index) {
+ faceuv= osface[findex].uv;
+ quad= mface[findex].v4;
+
+ /* check that this intersects - Its possible this misses :/ -
+ * could also check its not between */
+ if(quad) {
+ if(IsectPQ2Df(uv, faceuv[0], faceuv[1], faceuv[2], faceuv[3]))
+ return findex;
+ }
+ else if(IsectPT2Df(uv, faceuv[0], faceuv[1], faceuv[2]))
+ return findex;
+ }
+ }
+ }
+
+ return DMCACHE_NOTFOUND;
+}
+
+/* interprets particle data to get a point on a mesh in object space */
+#define PARTICLE_ERROR(_nor, _vec) _vec[0]=_vec[1]=_vec[2]=0.0; if(_nor){ _nor[0]=_nor[1]=0.0; _nor[2]=1.0; }
+void psys_particle_on_dm(Object *ob, DerivedMesh *dm, int from, int index, int index_dmcache, float *fw, float foffset, float *vec, float *nor, float *utan, float *vtan)
+{
+ if(index < 0){ /* 'no dm' error has happened! */
+ PARTICLE_ERROR(nor, vec);
+ return;
+ }
+
+ if (dm->deformedOnly || index_dmcache == DMCACHE_ISCHILD) {
+ /* this works for meshes with deform verts only - constructive modifiers wont work properly*/
+ float temp1[3];
+
+ if(index_dmcache == DMCACHE_ISCHILD && index >= dm->getNumFaces(dm)) {
+ PARTICLE_ERROR(nor, vec);
+ return;
+ }
+
+ if(from == PART_FROM_VERT) {
+ dm->getVertCo(dm,index,vec);
+ if(nor){
+ dm->getVertNo(dm,index,nor);
+ Normalize(nor);
+ }
+ }
+ else { /* PART_FROM_FACE / PART_FROM_VOLUME */
+ MFace *mface=dm->getFaceData(dm,index,CD_MFACE);
+ MTFace *mtface=0;
+ MVert *mvert=dm->getVertDataArray(dm,CD_MVERT);
+ int uv_index=CustomData_get_active_layer_index(&dm->faceData,CD_MTFACE);
+
+ if(uv_index>=0){
+ CustomDataLayer *layer=&dm->faceData.layers[uv_index];
+ mtface= &((MTFace*)layer->data)[index];
+ }
+
+ if(from==PART_FROM_VOLUME){
+ psys_interpolate_face(mvert,mface,mtface,fw,vec,temp1,utan,vtan);
+ if(nor)
+ VECCOPY(nor,temp1);
+ Normalize(temp1);
+ VecMulf(temp1,-foffset);
+ VECADD(vec,vec,temp1);
+ }
+ else
+ psys_interpolate_face(mvert,mface,mtface,fw,vec,nor,utan,vtan);
+ }
+ } else {
+ /* Need to support constructive modifiers, this is a bit more tricky
+ we need a customdata layer like UV's so we can position the particle */
+
+ /* Only face supported at the moment */
+ if (from==PART_FROM_FACE) {
+ /* find a face on the derived mesh that uses this face */
+ Mesh *me= (Mesh*)ob->data;
+ MVert *mvert;
+ MFace *mface;
+ MTFace *mtface;
+ OrigSpaceFace *osface;
+ int *origindex;
+ float fw_mod[4];
+ int i, totface;
+
+ mvert= dm->getVertDataArray(dm,CD_MVERT);
+
+ osface= dm->getFaceDataArray(dm, CD_ORIGSPACE);
+ origindex= dm->getFaceDataArray(dm, CD_ORIGINDEX);
+
+ /* For this to work we need origindex and OrigSpace coords */
+ if(origindex==NULL || osface==NULL || index>=me->totface) {
+ PARTICLE_ERROR(nor, vec);
+ return;
+ }
+
+ if (index_dmcache == DMCACHE_NOTFOUND)
+ i = psys_particle_dm_face_lookup(ob, dm, index, fw, (LinkNode*)NULL);
+ else
+ i = index_dmcache;
+
+ totface = dm->getNumFaces(dm);
+
+ /* Any time this happens, and the face has not been removed,
+ * its a BUG watch out for this error! */
+ if (i==-1) {
+ printf("Cannot find original face %i\n", index);
+ PARTICLE_ERROR(nor, vec);
+ return;
+ }
+ else if(i >= totface)
+ return;
+
+ mface= dm->getFaceData(dm, i, CD_MFACE);
+ mtface= dm->getFaceData(dm, i, CD_MTFACE);
+ osface += i;
+
+ /* we need to modify the original weights to become weights for
+ * the derived mesh face */
+ psys_origspace_to_w(osface, mface->v4, fw, fw_mod);
+ psys_interpolate_face(mvert,mface,mtface,fw_mod,vec,nor,utan,vtan);
+ }
+ else {
+ /* TODO PARTICLE - support verts and volume */
+ PARTICLE_ERROR(nor, vec);
+ }
+ }
+}
+#undef PARTICLE_ERROR
+
+ParticleSystemModifierData *psys_get_modifier(Object *ob, ParticleSystem *psys)
+{
+ ModifierData *md;
+ ParticleSystemModifierData *psmd;
+
+ for(md=ob->modifiers.first; md; md=md->next){
+ if(md->type==eModifierType_ParticleSystem){
+ psmd= (ParticleSystemModifierData*) md;
+ if(psmd->psys==psys){
+ return psmd;
+ }
+ }
+ }
+ return 0;
+}
+/************************************************/
+/* Particles on a shape */
+/************************************************/
+/* ready for future use */
+void psys_particle_on_shape(int distr, int index, float *fuv, float *vec, float *nor, float *utan, float *vtan)
+{
+ /* TODO */
+ float zerovec[3]={0.0f,0.0f,0.0f};
+ if(vec){
+ VECCOPY(vec,zerovec);
+ }
+ if(nor){
+ VECCOPY(nor,zerovec);
+ }
+ if(utan){
+ VECCOPY(utan,zerovec);
+ }
+ if(vtan){
+ VECCOPY(vtan,zerovec);
+ }
+}
+/************************************************/
+/* Particles on emitter */
+/************************************************/
+void psys_particle_on_emitter(Object *ob, ParticleSystemModifierData *psmd, int from, int index, int index_dmcache, float *fuv, float foffset, float *vec, float *nor, float *utan, float *vtan){
+ if(psmd){
+ if(psmd->psys->part->distr==PART_DISTR_GRID){
+ if(vec){
+ VECCOPY(vec,fuv);
+ }
+ return;
+ }
+ /* we cant use the num_dmcache */
+ psys_particle_on_dm(ob, psmd->dm,from,index,index_dmcache,fuv,foffset,vec,nor,utan,vtan);
+ }
+ else
+ psys_particle_on_shape(from,index,fuv,vec,nor,utan,vtan);
+
+}
+/************************************************/
+/* Path Cache */
+/************************************************/
+static void hair_to_particle(ParticleKey *key, HairKey *hkey)
+{
+ VECCOPY(key->co, hkey->co);
+ key->time = hkey->time;
+}
+static void bp_to_particle(ParticleKey *key, BodyPoint *bp, HairKey *hkey)
+{
+ VECCOPY(key->co, bp->pos);
+ key->time = hkey->time;
+}
+static float vert_weight(MDeformVert *dvert, int group)
+{
+ MDeformWeight *dw;
+ int i;
+
+ if(dvert) {
+ dw= dvert->dw;
+ for(i= dvert->totweight; i>0; i--, dw++) {
+ if(dw->def_nr == group) return dw->weight;
+ if(i==1) break; /*otherwise dw will point to somewhere it shouldn't*/
+ }
+ }
+ return 0.0;
+}
+static void do_prekink(ParticleKey *state, ParticleKey *par, float *par_rot, float time, float freq, float shape, float amplitude, short type, short axis, float obmat[][4])
+{
+ float vec[3]={0.0,0.0,0.0}, q1[4]={1,0,0,0},*q2;
+ float t;
+
+ CLAMP(time,0.0,1.0);
+
+ if(shape!=0.0f && type!=PART_KINK_BRAID) {
+ if(shape<0.0f)
+ time= (float)pow(time, 1.0+shape);
+ else
+ time= (float)pow(time, 1.0/(1.0-shape));
+ }
+
+ t=time;
+
+ t*=(float)M_PI*freq;
+
+ if(par==0) return;
+
+ switch(type){
+ case PART_KINK_CURL:
+ vec[axis]=1.0;
+ if(par_rot)
+ q2=par_rot;
+ else{
+ q2=vectoquat(par->vel,axis,(axis+1)%3);
+ }
+ QuatMulVecf(q2,vec);
+ VecMulf(vec,amplitude);
+ VECADD(state->co,state->co,vec);
+
+ VECSUB(vec,state->co,par->co);
+
+ if(t!=0.0)
+ VecRotToQuat(par->vel,t,q1);
+
+ QuatMulVecf(q1,vec);
+
+ VECADD(state->co,par->co,vec);
+ break;
+ case PART_KINK_RADIAL:
+ VECSUB(vec,state->co,par->co);
+
+ Normalize(vec);
+ VecMulf(vec,amplitude*(float)sin(t));
+
+ VECADD(state->co,state->co,vec);
+ break;
+ case PART_KINK_WAVE:
+ vec[axis]=1.0;
+ if(obmat)
+ Mat4MulVecfl(obmat,vec);
+
+ if(par_rot)
+ QuatMulVecf(par_rot,vec);
+
+ Projf(q1,vec,par->vel);
+
+ VECSUB(vec,vec,q1);
+ Normalize(vec);
+
+ VecMulf(vec,amplitude*(float)sin(t));
+
+ VECADD(state->co,state->co,vec);
+ break;
+ case PART_KINK_BRAID:
+ if(par){
+ float y_vec[3]={0.0,1.0,0.0};
+ float z_vec[3]={0.0,0.0,1.0};
+ float vec_from_par[3], vec_one[3], radius, state_co[3];
+ float inp_y,inp_z,length;
+
+ if(par_rot)
+ q2=par_rot;
+ else
+ q2=vectoquat(par->vel,axis,(axis+1)%3);
+ QuatMulVecf(q2,y_vec);
+ QuatMulVecf(q2,z_vec);
+
+ VECSUB(vec_from_par,state->co,par->co);
+ VECCOPY(vec_one,vec_from_par);
+ radius=Normalize(vec_one);
+
+ inp_y=Inpf(y_vec,vec_one);
+ inp_z=Inpf(z_vec,vec_one);
+
+ if(inp_y>0.5){
+ VECCOPY(state_co,y_vec);
+
+ VecMulf(y_vec,amplitude*(float)cos(t));
+ VecMulf(z_vec,amplitude/2.0f*(float)sin(2.0f*t));
+ }
+ else if(inp_z>0.0){
+ VECCOPY(state_co,z_vec);
+ VecMulf(state_co,(float)sin(M_PI/3.0f));
+ VECADDFAC(state_co,state_co,y_vec,-0.5f);
+
+ VecMulf(y_vec,-amplitude*(float)cos(t + M_PI/3.0f));
+ VecMulf(z_vec,amplitude/2.0f*(float)cos(2.0f*t + M_PI/6.0f));
+ }
+ else{
+ VECCOPY(state_co,z_vec);
+ VecMulf(state_co,-(float)sin(M_PI/3.0f));
+ VECADDFAC(state_co,state_co,y_vec,-0.5f);
+
+ VecMulf(y_vec,amplitude*(float)-sin(t+M_PI/6.0f));
+ VecMulf(z_vec,amplitude/2.0f*(float)-sin(2.0f*t+M_PI/3.0f));
+ }
+
+ VecMulf(state_co,amplitude);
+ VECADD(state_co,state_co,par->co);
+ VECSUB(vec_from_par,state->co,state_co);
+
+ length=Normalize(vec_from_par);
+ VecMulf(vec_from_par,MIN2(length,amplitude/2.0f));
+
+ VECADD(state_co,par->co,y_vec);
+ VECADD(state_co,state_co,z_vec);
+ VECADD(state_co,state_co,vec_from_par);
+
+ shape=(2.0f*(float)M_PI)*(1.0f+shape);
+
+ if(t<shape){
+ shape=t/shape;
+ shape=(float)sqrt((double)shape);
+ VecLerpf(state->co,state->co,state_co,shape);
+ }
+ else{
+ VECCOPY(state->co,state_co);
+ }
+ }
+ break;
+ //case PART_KINK_ROT:
+ // vec[axis]=1.0;
+
+ // QuatMulVecf(par->rot,vec);
+
+ // VecMulf(vec,amplitude*(float)sin(t));
+
+ // VECADD(state->co,state->co,vec);
+ // break;
+ }
+}
+static void do_postkink(ParticleKey *state, ParticleKey *par, float *par_rot, float time, float freq, float shape, float amplitude, short type, short axis, float obmat[][4])
+{
+ static ParticleKey first;
+ static float q[4];
+ float vec[3]={0.0,0.0,0.0};
+ float t;
+
+ CLAMP(time,0.0,1.0);
+
+ t=time;
+
+ t*=(float)M_PI*freq;
+
+ if(par==0) return;
+
+ switch(type){
+ case PART_KINK_ROLL:
+ if(time<(0.5+shape/2.0f)){
+ float *q2;
+ memcpy(&first,state,sizeof(ParticleKey));
+ Normalize(first.vel);
+ if(par_rot)
+ q2=par_rot;
+ else
+ q2=vectoquat(par->vel,axis,(axis+1)%3);
+ QUATCOPY(q,q2);
+ }
+ else{
+ float fac;
+ shape=0.5f+shape/2.0f;
+ t-=(float)M_PI*(shape*freq + 0.5f);
+
+ vec[axis]=1.0;
+
+ QuatMulVecf(q,vec);
+
+ fac=amplitude*(1.0f+((1.0f-time)/(1.0f-shape)*(float)sin(t)));
+ VECADDFAC(state->co,first.co,vec,fac);
+ fac=amplitude*((1.0f-time)/(1.0f-shape)*(float)cos(t));
+ VECADDFAC(state->co,state->co,first.vel,fac);
+ }
+ break;
+ }
+}
+static void do_clump(ParticleKey *state, ParticleKey *par, float time, float clumpfac, float clumppow, float pa_clump)
+{
+ if(par && clumpfac!=0.0){
+ float clump, cpow;
+
+ if(clumppow<0.0)
+ cpow=1.0f+clumppow;
+ else
+ cpow=1.0f+9.0f*clumppow;
+
+ if(clumpfac<0.0) /* 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);
+ VecLerpf(state->co,state->co,par->co,clump);
+ }
+}
+int do_guide(ParticleKey *state, int pa_num, float time, ListBase *lb)
+{
+ PartDeflect *pd;
+ ParticleEffectorCache *ec;
+ Object *eob;
+ Curve *cu;
+ ParticleKey key, par;
+
+ float effect[3]={0.0,0.0,0.0}, distance, f_force, mindist, totforce=0.0;
+ float guidevec[4], guidedir[3], rot2[4], temp[3], angle, pa_loc[3], pa_zero[3]={0.0f,0.0f,0.0f};
+ float veffect[3]={0.0,0.0,0.0}, guidetime;
+
+ effect[0]=effect[1]=effect[2]=0.0;
+
+ if(lb->first){
+ for(ec = lb->first; ec; ec= ec->next){
+ eob= ec->ob;
+ if(ec->type & PSYS_EC_EFFECTOR){
+ pd=eob->pd;
+ if(pd->forcefield==PFIELD_GUIDE){
+ cu = (Curve*)eob->data;
+
+ distance=ec->distances[pa_num];
+ mindist=pd->f_strength;
+
+ VECCOPY(pa_loc, ec->locations+3*pa_num);
+ VECCOPY(pa_zero,pa_loc);
+ VECADD(pa_zero,pa_zero,ec->firstloc);
+
+ guidetime=time/(1.0-pd->free_end);
+
+ /* WARNING: bails out with continue here */
+ if(((pd->flag & PFIELD_USEMAX) && distance>pd->maxdist) || guidetime>1.0f) continue;
+
+ if(guidetime>1.0f) continue;
+
+ /* calculate contribution factor for this guide */
+ f_force=1.0f;
+ if(distance<=mindist);
+ else if(pd->flag & PFIELD_USEMAX) {
+ if(mindist>=pd->maxdist) f_force= 0.0f;
+ else if(pd->f_power!=0.0f){
+ f_force= 1.0f - (distance-mindist)/(pd->maxdist - mindist);
+ f_force = (float)pow(f_force, pd->f_power);
+ }
+ }
+ else if(pd->f_power!=0.0f){
+ f_force= 1.0f/(1.0f + distance-mindist);
+ f_force = (float)pow(f_force, pd->f_power);
+ }
+
+ if(pd->flag & PFIELD_GUIDE_PATH_ADD)
+ where_on_path(eob, f_force*guidetime, guidevec, guidedir);
+ else
+ where_on_path(eob, guidetime, guidevec, guidedir);
+
+ Mat4MulVecfl(ec->ob->obmat,guidevec);
+ Mat4Mul3Vecfl(ec->ob->obmat,guidedir);
+
+ Normalize(guidedir);
+
+ if(guidetime!=0.0){
+ /* curve direction */
+ Crossf(temp, ec->firstdir, guidedir);
+ angle=Inpf(ec->firstdir,guidedir)/(VecLength(ec->firstdir));
+ angle=saacos(angle);
+ VecRotToQuat(temp,angle,rot2);
+ QuatMulVecf(rot2,pa_loc);
+
+ /* curve tilt */
+ VecRotToQuat(guidedir,guidevec[3]-ec->firstloc[3],rot2);
+ QuatMulVecf(rot2,pa_loc);
+
+ //q=vectoquat(guidedir, pd->kink_axis, (pd->kink_axis+1)%3);
+ //QuatMul(par.rot,rot2,q);
+ }
+ //else{
+ // par.rot[0]=1.0f;
+ // par.rot[1]=par.rot[2]=par.rot[3]=0.0f;
+ //}
+
+ /* curve taper */
+ if(cu->taperobj)
+ VecMulf(pa_loc,calc_taper(cu->taperobj,(int)(f_force*guidetime*100.0),100));
+ /* TODO */
+ //else{
+ ///* curve size*/
+ // calc_curve_subdiv_radius(cu,cu->nurb.first,((Nurb*)cu->nurb.first)->
+ //}
+ par.co[0]=par.co[1]=par.co[2]=0.0f;
+ VECCOPY(key.co,pa_loc);
+ do_prekink(&key, &par, 0, guidetime, pd->kink_freq, pd->kink_shape, pd->kink_amp, pd->kink, pd->kink_axis, 0);
+ do_clump(&key, &par, guidetime, pd->clump_fac, pd->clump_pow, 1.0f);
+ do_postkink(&key, &par, 0, guidetime, pd->kink_freq, pd->kink_shape, pd->kink_amp, pd->kink, pd->kink_axis, 0);
+ VECCOPY(pa_loc,key.co);
+
+ VECADD(pa_loc,pa_loc,guidevec);
+ VECSUB(pa_loc,pa_loc,pa_zero);
+ VECADDFAC(effect,effect,pa_loc,f_force);
+ VECADDFAC(veffect,veffect,guidedir,f_force);
+ totforce+=f_force;
+ }
+ }
+ }
+
+ if(totforce!=0.0){
+ if(totforce>1.0)
+ VecMulf(effect,1.0f/totforce);
+ CLAMP(totforce,0.0,1.0);
+ VECADD(effect,effect,pa_zero);
+ VecLerpf(state->co,state->co,effect,totforce);
+
+ Normalize(veffect);
+ VecMulf(veffect,VecLength(state->vel));
+ VECCOPY(state->vel,veffect);
+ return 1;
+ }
+ }
+ return 0;
+}
+static void do_rough(float *loc, float t, float fac, float size, float thres, ParticleKey *state)
+{
+ 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;
+
+ VECCOPY(rco,loc);
+ VecMulf(rco,t);
+ rough[0]=-1.0f+2.0f*BLI_gTurbulence(size, rco[0], rco[1], rco[2], 2,0,2);
+ rough[1]=-1.0f+2.0f*BLI_gTurbulence(size, rco[1], rco[2], rco[0], 2,0,2);
+ rough[2]=-1.0f+2.0f*BLI_gTurbulence(size, rco[2], rco[0], rco[1], 2,0,2);
+ VECADDFAC(state->co,state->co,rough,fac);
+}
+static void do_rough_end(float *loc, float t, float fac, float shape, ParticleKey *state, ParticleKey *par)
+{
+ float rough[3], rnor[3];
+ float roughfac;
+
+ roughfac=fac*(float)pow((double)t,shape);
+ VECCOPY(rough,loc);
+ rough[0]=-1.0f+2.0f*rough[0];
+ rough[1]=-1.0f+2.0f*rough[1];
+ rough[2]=-1.0f+2.0f*rough[2];
+ VecMulf(rough,roughfac);
+
+
+ if(par){
+ VECCOPY(rnor,par->vel);
+ }
+ else{
+ VECCOPY(rnor,state->vel);
+ }
+ Normalize(rnor);
+ Projf(rnor,rough,rnor);
+ VECSUB(rough,rough,rnor);
+
+ VECADD(state->co,state->co,rough);
+}
+static int check_path_length(int k, int p, ParticleCacheKey **cache, ParticleCacheKey *state, float length, float *dvec)
+{
+ static float max_length = 1.0, cur_length = 0.0;
+
+ if(k) {
+ if(cur_length + length > max_length){
+ //if(p<totparent){
+ // if(k<=(int)cache[totpart+p]->time){
+ // /* parents need to be calculated fully first so that they don't mess up their children */
+ // /* we'll make a note of where we got to though so that they're easy to finish later */
+ // state->time=(max_length-cur_length)/length;
+ // cache[totpart+p]->time=(float)k;
+ // }
+ //}
+ //else{
+ VecMulf(dvec, (max_length - cur_length) / length);
+ VECADD(state->co, (state - 1)->co, dvec);
+ cache[p]->steps = k;
+ /* something over the maximum step value */
+ return k=100000;
+ //}
+ }
+ else {
+ cur_length+=length;
+ }
+ }
+ else {/* reset signal */
+ max_length=length;
+ cur_length=0.0;
+ }
+ return k;
+}
+static void finalize_path_length(int p, ParticleCacheKey **cache)
+{
+ ParticleCacheKey *state = cache[p];
+ float dvec[3];
+ state += state->steps;
+
+ VECSUB(dvec, state->co, (state - 1)->co);
+ VecMulf(dvec, state->steps);
+ VECADD(state->co, (state - 1)->co, dvec);
+}
+static void offset_child(ChildParticle *cpa, ParticleKey *par, ParticleKey *child, float flat, float radius)
+{
+ VECCOPY(child->co,cpa->fuv);
+ VecMulf(child->co,radius);
+
+ child->co[0]*=flat;
+
+ VECCOPY(child->vel,par->vel);
+
+ QuatMulVecf(par->rot,child->co);
+
+ QUATCOPY(child->rot,par->rot);
+
+ VECADD(child->co,child->co,par->co);
+}
+float *psys_cache_vgroup(DerivedMesh *dm, ParticleSystem *psys, int vgroup)
+{
+ float *vg=0;
+
+ if(psys->vgroup[vgroup]){
+ MDeformVert *dvert = dm->getVertDataArray(dm, CD_MDEFORMVERT);
+ if(dvert){
+ int totvert=dm->getNumVerts(dm), i;
+ vg=MEM_callocN(sizeof(float)*totvert, "vg_cache");
+ if(psys->vg_neg&(1<<vgroup)){
+ for(i=0; i<totvert; i++)
+ vg[i]=1.0f-vert_weight(dvert+i,psys->vgroup[vgroup]-1);
+ }
+ else{
+ for(i=0; i<totvert; i++)
+ vg[i]=vert_weight(dvert+i,psys->vgroup[vgroup]-1);
+ }
+ }
+ }
+ return vg;
+}
+void psys_find_parents(Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys)
+{
+ ParticleSettings *part=psys->part;
+ KDTree *tree;
+ ChildParticle *cpa;
+ int p, totparent,totchild=psys->totchild;
+ float co[3], *orcos=0;
+ int from=PART_FROM_FACE;
+ totparent=(int)(totchild*part->parents*0.3);
+
+ tree=BLI_kdtree_new(totparent);
+
+ for(p=0,cpa=psys->child; p<totparent; p++,cpa++){
+ psys_particle_on_emitter(ob,psmd,from,cpa->num,-1,cpa->fuv,cpa->foffset,co,0,0,0);
+ BLI_kdtree_insert(tree, p, co, NULL);
+ }
+
+ BLI_kdtree_balance(tree);
+
+ for(; p<totchild; p++,cpa++){
+ psys_particle_on_emitter(ob,psmd,from,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co,0,0,0);
+ cpa->parent=BLI_kdtree_find_nearest(tree, co, NULL, NULL);
+ }
+
+ BLI_kdtree_free(tree);
+ if(orcos)
+ MEM_freeN(orcos);
+}
+void psys_cache_child_paths(Object *ob, ParticleSystem *psys, float cfra, int editupdate)
+{
+ ParticleSettings *part = psys->part;
+ ParticleEditSettings *pset = &G.scene->toolsettings->particle;
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
+ ParticleData *pa;
+ ChildParticle *cpa;
+ ParticleCacheKey **cache = psys->childcache, **pcache = psys->pathcache;
+ ParticleCacheKey *tcache, *state, *par=0, *key[4];
+ ParticleTexture ptex;
+ Material *ma = give_current_material(ob, part->omat);
+
+ float length, pa_length = 1.0, pa_clump = 1.0, pa_kink = 1.0;
+ float pa_rough1 = 1.0, pa_rough2 = 1.0, pa_roughe = 1.0;
+ float t, rough_t;
+ float dvec[3], orco[3], ornor[3], imat[4][4];
+ float *vg_length = 0, *vg_clump = 0, *vg_kink = 0;
+ float *vg_rough1 = 0, *vg_rough2 = 0, *vg_roughe = 0;
+ float cpa_1st[3];
+
+ int k, i, totparent=0, between=0, edit=0;
+ int steps = (int)pow(2.0,(double)part->draw_step);
+ int totchild = psys->totchild;
+ int cpa_num; short cpa_from;
+
+ if(part->flag & PART_ANIM_BRANCHING)
+ BLI_srandom(31415926 + psys->seed + (int)cfra);
+ else
+ BLI_srandom(31415926 + psys->seed);
+
+ /*---start figuring out what is actually wanted---*/
+ if(psys_in_edit_mode(psys)){
+ if(G.rendering==0 && (psys->edit==NULL || pset->flag & PE_SHOW_CHILD)==0)
+ totchild=0;
+ edit=1;
+ }
+
+ if(totchild && part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
+ totparent=(int)(totchild*part->parents*0.3);
+ /* part->parents could still be 0 so we can't test with totparent */
+ between=1;
+ }
+
+ if(G.rendering)
+ steps=(int)pow(2.0,(double)part->ren_step);
+ else if(part->flag & PART_CHILD_RENDER){
+ totchild=0;
+ }
+ else{
+ totchild=(int)((float)totchild*(float)part->disp/100.0f);
+ totparent=MIN2(totparent,totchild);
+ }
+
+ if(totchild==0) return;
+
+ if(editupdate && psys->childcache && !(part->flag & PART_BRANCHING) && totchild == psys->totchildcache) {
+ cache = psys->childcache;
+ }
+ else {
+ /* clear out old and create new empty path cache */
+ free_child_path_cache(psys);
+
+ cache = psys->childcache = MEM_callocN(totchild*sizeof(void *), "Child path cache array");
+ tcache = MEM_callocN(totchild * (steps + 1) * sizeof(ParticleCacheKey), "Child path cache");
+ for(i=0; i<totchild; i++)
+ cache[i] = tcache + i * (steps + 1);
+ }
+
+ psys->lattice = psys_get_lattice(ob,psys);
+
+ /* cache all relevant vertex groups if they exist */
+ if(part->from!=PART_FROM_PARTICLE){
+ vg_length = psys_cache_vgroup(psmd->dm,psys,PSYS_VG_LENGTH);
+ vg_clump = psys_cache_vgroup(psmd->dm,psys,PSYS_VG_CLUMP);
+ vg_kink = psys_cache_vgroup(psmd->dm,psys,PSYS_VG_KINK);
+ vg_rough1 = psys_cache_vgroup(psmd->dm,psys,PSYS_VG_ROUGH1);
+ vg_rough2 = psys_cache_vgroup(psmd->dm,psys,PSYS_VG_ROUGH2);
+ vg_roughe = psys_cache_vgroup(psmd->dm,psys,PSYS_VG_ROUGHE);
+ }
+
+ /* set correct ipo timing */
+ if(part->flag&PART_ABS_TIME && part->ipo){
+ calc_ipo(part->ipo, cfra);
+ execute_ipo((ID *)part, part->ipo);
+ }
+
+ Mat4Invert(imat,ob->obmat);
+
+ for(i=0,cpa=psys->child; i<totchild; i++, cpa++){
+ int guided=0;
+ float *cpa_fuv=0;
+ float branch_begin=0.0f, branch_end=0.0f, branch_prob=0.0f;
+ float branchfac, rough_rand=0.0f;
+
+ if(part->flag & PART_BRANCHING) {
+ branch_begin=BLI_frand();
+ branch_end=branch_begin+(1.0f-branch_begin)*BLI_frand();
+ branch_prob=BLI_frand();
+ rough_rand=BLI_frand();
+ }
+
+ if(i<psys->totpart){
+ branch_begin=0.0f;
+ branch_end=1.0f;
+ branch_prob=0.0f;
+ }
+
+ if(between){
+ int w, needupdate;
+ float foffset;
+
+ if(editupdate && !(part->flag & PART_BRANCHING)) {
+ needupdate= 0;
+ w= 0;
+ while(w<4 && cpa->pa[w]>=0) {
+ if(psys->particles[cpa->pa[w]].flag & PARS_EDIT_RECALC) {
+ needupdate= 1;
+ break;
+ }
+ w++;
+ }
+
+ if(!needupdate)
+ continue;
+ else
+ memset(cache[i], 0, sizeof(*cache[i])*(steps+1));
+ }
+
+ /* get parent paths */
+ w= 0;
+ while(w<4 && cpa->pa[w]>=0){
+ key[w] = pcache[cpa->pa[w]];
+ w++;
+ }
+
+ /* get the original coordinates (orco) for texture usage */
+ cpa_num = cpa->num;
+
+ foffset= cpa->foffset;
+ if(part->childtype == PART_CHILD_FACES)
+ foffset = -(2.0f + part->childspread);
+ cpa_fuv = cpa->fuv;
+ cpa_from = PART_FROM_FACE;
+
+ psys_particle_on_emitter(ob,psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,orco,ornor,0,0);
+
+ /* we need to save the actual root position of the child for positioning it accurately to the surface of the emitter */
+ VECCOPY(cpa_1st,orco);
+ Mat4MulVecfl(ob->obmat,cpa_1st);
+
+ pa=0;
+ }
+ else{
+ if(editupdate && !(part->flag & PART_BRANCHING)) {
+ if(!(psys->particles[cpa->parent].flag & PARS_EDIT_RECALC))
+ continue;
+
+ memset(cache[i], 0, sizeof(*cache[i])*(steps+1));
+ }
+
+ /* get the parent path */
+ key[0]=pcache[cpa->parent];
+
+ /* get the original coordinates (orco) for texture usage */
+ pa=psys->particles+cpa->parent;
+
+ cpa_from=part->from;
+ cpa_num=pa->num;
+ cpa_fuv=pa->fuv;
+
+ psys_particle_on_emitter(ob,psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,orco,ornor,0,0);
+ }
+
+ cache[i]->steps = steps;
+
+ /* correct child ipo timing */
+ if((part->flag&PART_ABS_TIME)==0 && part->ipo){
+ float dsta=part->end-part->sta;
+ calc_ipo(part->ipo, 100.0f*(cfra-(part->sta+dsta*cpa->rand[1]))/(part->lifetime*(1.0f - part->randlife*cpa->rand[0])));
+ execute_ipo((ID *)part, part->ipo);
+ }
+
+ /* get different child parameters from textures & vgroups */
+ ptex.length=part->length*(1.0f - part->randlength*cpa->rand[0]);
+ ptex.clump=1.0;
+ ptex.kink=1.0;
+
+ get_cpa_texture(psmd->dm,ma,cpa_num,cpa_fuv,orco,&ptex,MAP_PA_CACHE);
+
+ pa_length=ptex.length;
+ pa_clump=ptex.clump;
+ pa_kink=ptex.kink;
+ pa_rough1=1.0;
+ pa_rough2=1.0;
+ pa_roughe=1.0;
+
+ if(vg_length)
+ pa_length*=psys_interpolate_value_from_verts(psmd->dm,cpa_from,cpa_num,cpa_fuv,vg_length);
+ if(vg_clump)
+ pa_clump*=psys_interpolate_value_from_verts(psmd->dm,cpa_from,cpa_num,cpa_fuv,vg_clump);
+ if(vg_kink)
+ pa_kink*=psys_interpolate_value_from_verts(psmd->dm,cpa_from,cpa_num,cpa_fuv,vg_kink);
+ if(vg_rough1)
+ pa_rough1*=psys_interpolate_value_from_verts(psmd->dm,cpa_from,cpa_num,cpa_fuv,vg_rough1);
+ if(vg_rough2)
+ pa_rough2*=psys_interpolate_value_from_verts(psmd->dm,cpa_from,cpa_num,cpa_fuv,vg_rough2);
+ if(vg_roughe)
+ pa_roughe*=psys_interpolate_value_from_verts(psmd->dm,cpa_from,cpa_num,cpa_fuv,vg_roughe);
+
+ /* create the child path */
+ for(k=0,state=cache[i]; k<=steps; k++,state++){
+ t=(float)k/(float)steps;
+
+ if(between){
+ int w=0;
+
+ state->co[0] = state->co[1] = state->co[2] = 0.0f;
+ state->vel[0] = state->vel[1] = state->vel[2] = 0.0f;
+
+ //QUATCOPY(state->rot,key[0]->rot);
+
+ /* child position is the weighted sum of parent positions */
+ while(w<4 && cpa->pa[w]>=0){
+ state->co[0] += cpa->w[w] * key[w]->co[0];
+ state->co[1] += cpa->w[w] * key[w]->co[1];
+ state->co[2] += cpa->w[w] * key[w]->co[2];
+
+ state->vel[0] += cpa->w[w] * key[w]->vel[0];
+ state->vel[1] += cpa->w[w] * key[w]->vel[1];
+ state->vel[2] += cpa->w[w] * key[w]->vel[2];
+ key[w]++;
+ w++;
+ }
+ if(k==0){
+ /* calculate the offset between actual child root position and first position interpolated from parents */
+ VECSUB(cpa_1st,cpa_1st,state->co);
+ }
+ /* apply offset for correct positioning */
+ VECADD(state->co,state->co,cpa_1st);
+ }
+ else{
+ /* offset the child from the parent position */
+ offset_child(cpa, (ParticleKey*)key[0], (ParticleKey*)state, part->childflat, part->childrad);
+
+ key[0]++;
+ }
+
+ if(totparent){
+ if(i>=totparent)
+ par = cache[cpa->parent] + k;
+ else
+ par=0;
+ }
+ else if(cpa->parent>=0){
+ par=pcache[cpa->parent]+k;
+ }
+
+ /* apply different deformations to the child path */
+ if(part->flag & PART_CHILD_GUIDE)
+ guided = do_guide((ParticleKey*)state, i, t, &(psys->effectors)); //safe to cast, since only co and vel are used
+
+ if(guided==0){
+ if(part->kink)
+ do_prekink((ParticleKey*)state, (ParticleKey*)par, par->rot, t,
+ part->kink_freq * pa_kink, part->kink_shape, part->kink_amp, part->kink, part->kink_axis, ob->obmat);
+
+ do_clump((ParticleKey*)state, (ParticleKey*)par, t, part->clumpfac, part->clumppow, pa_clump);
+
+ if(part->kink)
+ do_postkink((ParticleKey*)state, (ParticleKey*)par, par->rot, t,
+ part->kink_freq * pa_kink, part->kink_shape, part->kink_amp, part->kink, part->kink_axis, ob->obmat);
+ }
+
+ if(part->flag & PART_BRANCHING && between == 0 && part->flag & PART_ANIM_BRANCHING)
+ rough_t = t * rough_rand;
+ else
+ rough_t = t;
+
+ if(part->rough1 != 0.0 && pa_rough1 != 0.0)
+ do_rough(orco, rough_t, pa_rough1*part->rough1, part->rough1_size, 0.0, (ParticleKey*)state);
+
+ if(part->rough2 != 0.0 && pa_rough2 != 0.0)
+ do_rough(cpa->rand, rough_t, pa_rough2*part->rough2, part->rough2_size, part->rough2_thres, (ParticleKey*)state);
+
+ if(part->rough_end != 0.0 && pa_roughe != 0.0)
+ do_rough_end(cpa->rand, rough_t, pa_roughe*part->rough_end, part->rough_end_shape, (ParticleKey*)state, (ParticleKey*)par);
+
+ if(part->flag & PART_BRANCHING && between==0){
+ if(branch_prob > part->branch_thres){
+ branchfac=0.0f;
+ }
+ else{
+ if(part->flag & PART_SYMM_BRANCHING){
+ if(t < branch_begin || t > branch_end)
+ branchfac=0.0f;
+ else{
+ if((t-branch_begin)/(branch_end-branch_begin)<0.5)
+ branchfac=2.0f*(t-branch_begin)/(branch_end-branch_begin);
+ else
+ branchfac=2.0f*(branch_end-t)/(branch_end-branch_begin);
+
+ CLAMP(branchfac,0.0f,1.0f);
+ }
+ }
+ else{
+ if(t < branch_begin){
+ branchfac=0.0f;
+ }
+ else{
+ branchfac=(t-branch_begin)/((1.0f-branch_begin)*0.5f);
+ CLAMP(branchfac,0.0f,1.0f);
+ }
+ }
+ }
+
+ if(i<psys->totpart){
+ VecLerpf(state->co, (pcache[i] + k)->co, state->co, branchfac);
+ }
+ else
+ VecLerpf(state->co, (cache[i - psys->totpart] + k)->co, state->co, branchfac);
+ }
+
+ /* we have to correct velocity because of kink & clump */
+ if(k>1){
+ VECSUB((state-1)->vel,state->co,(state-2)->co);
+ VecMulf((state-1)->vel,0.5);
+ }
+
+ /* check if path needs to be cut before actual end of data points */
+ if(k){
+ VECSUB(dvec,state->co,(state-1)->co);
+ if(part->flag&PART_ABS_LENGTH)
+ length=VecLength(dvec);
+ else
+ length=1.0f/(float)steps;
+
+ k=check_path_length(k,i,cache,state,length,dvec);
+ }
+ else{
+ /* initialize length calculation */
+ if(part->flag&PART_ABS_LENGTH)
+ check_path_length(0,0,0,0,part->abslength*pa_length,0);
+ else
+ check_path_length(0,0,0,0,pa_length,0);
+ }
+ }
+ }
+ /* now let's finalise the interpolated parents that we might have left half done before */
+ if(totchild) for(i=0,cpa=psys->child; i<totparent; i++, cpa++)
+ finalize_path_length(i,cache);
+
+ if(vg_length)
+ MEM_freeN(vg_length);
+ if(vg_clump)
+ MEM_freeN(vg_clump);
+ if(vg_kink)
+ MEM_freeN(vg_kink);
+ if(vg_rough1)
+ MEM_freeN(vg_rough1);
+ if(vg_rough2)
+ MEM_freeN(vg_roughe);
+ if(vg_roughe)
+ MEM_freeN(vg_roughe);
+
+ psys->totchildcache = totchild;
+
+ if(psys->lattice){
+ end_latt_deform();
+ psys->lattice=0;
+ }
+}
+/* Calculates paths ready for drawing/rendering. */
+/* -Usefull for making use of opengl vertex arrays for super fast strand drawing. */
+/* -Makes child strands possible and creates them too into the cache. */
+/* -Cached path data is also used to determine cut position for the editmode tool. */
+void psys_cache_paths(Object *ob, ParticleSystem *psys, float cfra, int editupdate)
+{
+ ParticleCacheKey *ca, **cache=psys->pathcache;
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
+ ParticleEditSettings *pset = &G.scene->toolsettings->particle;
+
+ ParticleData *pa;
+ ParticleKey keys[4], result, *kkey[2] = {NULL, NULL};
+ HairKey *hkey[2] = {NULL, NULL};
+
+ ParticleEdit *edit = 0;
+ ParticleEditKey *ekey = 0;
+
+ SoftBody *soft = 0;
+ BodyPoint *bp[2] = {NULL, NULL};
+
+ float birthtime = 0.0, dietime = 0.0;
+ float t, time, keytime, dfra = 1.0, frs_sec = G.scene->r.frs_sec;
+ float col[3] = {0.5f, 0.5f, 0.5f};
+ float prev_tangent[3], hairmat[4][4];
+ int k,i;
+ int steps = (int)pow(2.0, (double)psys->part->draw_step);
+ int totpart = psys->totpart;
+ char nosel[4], sel[4];
+ float sel_col[3];
+ float nosel_col[3];
+
+ /* we don't have anything valid to create paths from so let's quit here */
+ if((psys->flag & PSYS_HAIR_DONE)==0 && (psys->flag & PSYS_KEYED)==0)
+ return;
+
+ if(G.rendering)
+ steps = (int)pow(2.0, (double)psys->part->ren_step);
+ else if(psys_in_edit_mode(psys)){
+ edit=psys->edit;
+
+ //timed = edit->draw_timed;
+
+ PE_get_colors(sel,nosel);
+ if(pset->brushtype == PE_BRUSH_WEIGHT){
+ sel_col[0] = sel_col[1] = sel_col[2] = 1.0f;
+ nosel_col[0] = nosel_col[1] = nosel_col[2] = 0.0f;
+ }
+ else{
+ sel_col[0] = (float)sel[0] / 255.0f;
+ sel_col[1] = (float)sel[1] / 255.0f;
+ sel_col[2] = (float)sel[2] / 255.0f;
+ nosel_col[0] = (float)nosel[0] / 255.0f;
+ nosel_col[1] = (float)nosel[1] / 255.0f;
+ nosel_col[2] = (float)nosel[2] / 255.0f;
+ }
+ }
+
+ if(editupdate && psys->pathcache && totpart == psys->totcached) {
+ cache = psys->pathcache;
+ }
+ else {
+ /* clear out old and create new empty path cache */
+ psys_free_path_cache(psys);
+
+ /* allocate cache array for fast access and set pointers to contiguous mem block */
+ cache = psys->pathcache = MEM_callocN(MAX2(1, totpart) * sizeof(void *), "Path cache array");
+ cache[0] = MEM_callocN(totpart * (steps + 1) * sizeof(ParticleCacheKey), "Path cache");
+ for(i=1; i<totpart; i++)
+ cache[i] = cache[0] + i * (steps + 1);
+ }
+
+ if(edit==NULL && psys->soft && psys->softflag & OB_SB_ENABLE)
+ soft = psys->soft;
+
+ psys->lattice = psys_get_lattice(ob, psys);
+
+ /*---first main loop: create all actual particles' paths---*/
+ for(i=0,pa=psys->particles; i<totpart; i++, pa++){
+ if(psys && edit==NULL && (pa->flag & PARS_NO_DISP || pa->flag & PARS_UNEXIST)) {
+ if(soft)
+ bp[0] += pa->totkey; /* TODO use of initialized value? */
+ continue;
+ }
+
+ if(editupdate && !(pa->flag & PARS_EDIT_RECALC)) continue;
+ else memset(cache[i], 0, sizeof(*cache[i])*(steps+1));
+
+ cache[i]->steps = steps;
+
+ if(edit)
+ ekey = edit->keys[i];
+
+ /*--get the first data points--*/
+ if(psys->flag & PSYS_KEYED) {
+ kkey[0] = pa->keys;
+ kkey[1] = kkey[0] + 1;
+
+ birthtime = kkey[0]->time;
+ dietime = kkey[0][pa->totkey-1].time;
+ }
+ else {
+ hkey[0] = pa->hair;
+ hkey[1] = hkey[0] + 1;
+
+ birthtime = hkey[0]->time;
+ dietime = hkey[0][pa->totkey-1].time;
+
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
+ }
+
+ if(soft){
+ bp[0] = soft->bpoint + pa->bpi;
+ bp[1] = bp[0] + 1;
+ }
+
+ /*--interpolate actual path from data points--*/
+ for(k=0, ca=cache[i]; k<=steps; k++, ca++){
+ time = (float)k / (float)steps;
+
+ t = birthtime + time * (dietime - birthtime);
+
+ if(psys->flag & PSYS_KEYED) {
+ while(kkey[1]->time < t) {
+ kkey[1]++;
+ }
+
+ kkey[0] = kkey[1] - 1;
+ }
+ else {
+ while(hkey[1]->time < t) {
+ hkey[1]++;
+ bp[1]++;
+ }
+
+ hkey[0] = hkey[1] - 1;
+ }
+
+ if(soft) {
+ bp[0] = bp[1] - 1;
+ bp_to_particle(keys + 1, bp[0], hkey[0]);
+ bp_to_particle(keys + 2, bp[1], hkey[1]);
+ }
+ else if(psys->flag & PSYS_KEYED) {
+ memcpy(keys + 1, kkey[0], sizeof(ParticleKey));
+ memcpy(keys + 2, kkey[1], sizeof(ParticleKey));
+ }
+ else {
+ hair_to_particle(keys + 1, hkey[0]);
+ hair_to_particle(keys + 2, hkey[1]);
+ }
+
+
+ if((psys->flag & PSYS_KEYED)==0) {
+ if(soft) {
+ if(hkey[0] != pa->hair)
+ bp_to_particle(keys, bp[0] - 1, hkey[0] - 1);
+ else
+ bp_to_particle(keys, bp[0], hkey[0]);
+ }
+ else {
+ if(hkey[0] != pa->hair)
+ hair_to_particle(keys, hkey[0] - 1);
+ else
+ hair_to_particle(keys, hkey[0]);
+ }
+
+ if(soft) {
+ if(hkey[1] != pa->hair + pa->totkey - 1)
+ bp_to_particle(keys + 3, bp[1], hkey[1] + 1);
+ else
+ bp_to_particle(keys + 3, bp[1], hkey[1]);
+ }
+ else {
+ if(hkey[1] != pa->hair + pa->totkey - 1)
+ hair_to_particle(keys + 3, hkey[1] + 1);
+ else
+ hair_to_particle(keys + 3, hkey[1]);
+ }
+ }
+
+ dfra = keys[2].time - keys[1].time;
+
+ keytime = (t - keys[1].time) / dfra;
+
+ /* convert velocity to timestep size */
+ if(psys->flag & PSYS_KEYED){
+ VecMulf(keys[1].vel, dfra / frs_sec);
+ VecMulf(keys[2].vel, dfra / frs_sec);
+ }
+
+ /* now we should have in chronologiacl order k1<=k2<=t<=k3<=k4 with keytime between [0,1]->[k2,k3] (k1 & k4 used for cardinal & bspline interpolation)*/
+ interpolate_particle((psys->flag & PSYS_KEYED) ? -1 /* signal for cubic interpolation */
+ : ((psys->part->flag & PART_HAIR_BSPLINE) ? KEY_BSPLINE : KEY_CARDINAL)
+ ,keys, keytime, &result);
+
+
+ /* the velocity needs to be converted back from cubic interpolation */
+ if(psys->flag & PSYS_KEYED){
+ VecMulf(result.vel, frs_sec / dfra);
+ }
+ else if(soft==NULL) { /* softbody and keyed are allready in global space */
+ Mat4MulVecfl(hairmat, result.co);
+ }
+
+
+ /* apply guide curves to path data */
+ if(edit==0 && psys->effectors.first && (psys->part->flag & PART_CHILD_GUIDE)==0)
+ do_guide(&result, i, time, &psys->effectors);
+
+ /* figure out rotation */
+
+ if(k) {
+ float angle, tangent[3], normal[3], q[4];
+
+ if(k == 1) {
+ float *q2;
+
+ VECSUB(tangent, result.co, (ca - 1)->co);
+
+ q2 = vectoquat(tangent, OB_POSX, OB_POSZ);
+
+ QUATCOPY((ca - 1)->rot, q2);
+
+ VECCOPY(prev_tangent, tangent);
+ Normalize(prev_tangent);
+ }
+ else {
+ VECSUB(tangent, result.co, (ca - 1)->co);
+ Normalize(tangent);
+ angle = saacos(Inpf(tangent, prev_tangent));
+
+ if((angle > -0.000001) && (angle < 0.000001)){
+ QUATCOPY((ca - 1)->rot, (ca - 2)->rot);
+ }
+ else{
+ Crossf(normal, prev_tangent, tangent);
+ VecRotToQuat(normal, angle, q);
+ QuatMul((ca - 1)->rot, q, (ca - 2)->rot);
+ }
+
+ VECCOPY(prev_tangent, tangent);
+ }
+
+ if(k == steps) {
+ QUATCOPY(ca->rot, (ca - 1)->rot);
+ }
+ }
+
+ VECCOPY(ca->co, result.co);
+
+ if(k){
+ VECSUB(ca->vel, ca->co, (ca-1)->co);
+
+ if(k==1) {
+ VECCOPY((ca-1)->vel, ca->vel);
+ }
+
+ }
+
+
+ /* selection coloring in edit mode */
+ if(edit){
+ if(pset->brushtype==PE_BRUSH_WEIGHT){
+ if(k==steps)
+ VecLerpf(ca->col, nosel_col, sel_col, hkey[0]->weight);
+ else
+ VecLerpf(ca->col,nosel_col,sel_col,
+ (1.0f - keytime) * hkey[0]->weight + keytime * hkey[1]->weight);
+ }
+ else{
+ if((ekey + (hkey[0] - pa->hair))->flag & PEK_SELECT){
+ if((ekey + (hkey[1] - pa->hair))->flag & PEK_SELECT){
+ VECCOPY(ca->col, sel_col);
+ }
+ else{
+ VecLerpf(ca->col, sel_col, nosel_col, keytime);
+ }
+ }
+ else{
+ if((ekey + (hkey[1] - pa->hair))->flag & PEK_SELECT){
+ VecLerpf(ca->col, nosel_col, sel_col, keytime);
+ }
+ else{
+ VECCOPY(ca->col, nosel_col);
+ }
+ }
+ }
+ }
+ else{
+ VECCOPY(ca->col, col);
+ }
+
+ if(psys->lattice && edit==0)
+ calc_latt_deform(ca->co, 1.0f);
+ }
+ }
+
+ psys->totcached = totpart;
+
+ if(psys && psys->lattice){
+ end_latt_deform();
+ psys->lattice=0;
+ }
+}
+/************************************************/
+/* Particle Key handling */
+/************************************************/
+void copy_particle_key(ParticleKey *to, ParticleKey *from, int time){
+ if(time){
+ memcpy(to,from,sizeof(ParticleKey));
+ }
+ else{
+ float to_time=to->time;
+ memcpy(to,from,sizeof(ParticleKey));
+ to->time=to_time;
+ }
+ /*
+ VECCOPY(to->co,from->co);
+ VECCOPY(to->vel,from->vel);
+ QUATCOPY(to->rot,from->rot);
+ if(time)
+ to->time=from->time;
+ to->flag=from->flag;
+ to->sbw=from->sbw;
+ */
+}
+void psys_get_from_key(ParticleKey *key, float *loc, float *vel, float *rot, float *time){
+ if(loc) VECCOPY(loc,key->co);
+ if(vel) VECCOPY(vel,key->vel);
+ if(rot) QUATCOPY(rot,key->rot);
+ if(time) *time=key->time;
+}
+/*-------changing particle keys from space to another-------*/
+void psys_key_to_object(Object *ob, ParticleKey *key, float imat[][4]){
+ float q[4], imat2[4][4];
+
+ if(imat==0){
+ Mat4Invert(imat2,ob->obmat);
+ imat=imat2;
+ }
+
+ VECADD(key->vel,key->vel,key->co);
+
+ Mat4MulVecfl(imat,key->co);
+ Mat4MulVecfl(imat,key->vel);
+ Mat4ToQuat(imat,q);
+
+ VECSUB(key->vel,key->vel,key->co);
+ QuatMul(key->rot,q,key->rot);
+}
+static void key_from_object(Object *ob, ParticleKey *key){
+ float q[4];
+
+ VECADD(key->vel,key->vel,key->co);
+
+ Mat4MulVecfl(ob->obmat,key->co);
+ Mat4MulVecfl(ob->obmat,key->vel);
+ Mat4ToQuat(ob->obmat,q);
+
+ VECSUB(key->vel,key->vel,key->co);
+ QuatMul(key->rot,q,key->rot);
+}
+
+static void triatomat(float *v1, float *v2, float *v3, float (*uv)[2], float mat[][4])
+{
+ float det, w1, w2, d1[2], d2[2];
+
+ memset(mat, 0, sizeof(float)*4*4);
+ mat[3][3]= 1.0f;
+
+ /* first axis is the normal */
+ CalcNormFloat(v1, v2, v3, mat[2]);
+
+ /* second axis along (1, 0) in uv space */
+ if(uv) {
+ d1[0]= uv[1][0] - uv[0][0];
+ d1[1]= uv[1][1] - uv[0][1];
+ d2[0]= uv[2][0] - uv[0][0];
+ d2[1]= uv[2][1] - uv[0][1];
+
+ det = d2[0]*d1[1] - d2[1]*d1[0];
+
+ if(det != 0.0f) {
+ det= 1.0f/det;
+ w1= -d2[1]*det;
+ w2= d1[1]*det;
+
+ mat[1][0]= w1*(v2[0] - v1[0]) + w2*(v3[0] - v1[0]);
+ mat[1][1]= w1*(v2[1] - v1[1]) + w2*(v3[1] - v1[1]);
+ mat[1][2]= w1*(v2[2] - v1[2]) + w2*(v3[2] - v1[2]);
+ Normalize(mat[1]);
+ }
+ else
+ mat[1][0]= mat[1][1]= mat[1][2]= 0.0f;
+ }
+ else {
+ VecSubf(mat[1], v2, v1);
+ Normalize(mat[1]);
+ }
+
+ /* third as a cross product */
+ Crossf(mat[0], mat[1], mat[2]);
+}
+
+static void psys_face_mat(DerivedMesh *dm, ParticleData *pa, float mat[][4])
+{
+ float v1[3], v2[3], v3[3];
+ MFace *mface;
+ OrigSpaceFace *osface;
+
+ int i = pa->num_dmcache==DMCACHE_NOTFOUND ? pa->num : pa->num_dmcache;
+
+ if (i==-1 || i >= dm->getNumFaces(dm)) { Mat4One(mat); return; }
+ mface=dm->getFaceData(dm,i,CD_MFACE);
+ osface=dm->getFaceData(dm,i,CD_ORIGSPACE);
+
+ dm->getVertCo(dm,mface->v1,v1);
+ dm->getVertCo(dm,mface->v2,v2);
+ dm->getVertCo(dm,mface->v3,v3);
+
+ triatomat(v1, v2, v3, (osface)? osface->uv: NULL, mat);
+}
+void psys_mat_hair_to_object(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
+{
+ float vec[3];
+
+ psys_face_mat(dm, pa, hairmat);
+ psys_particle_on_dm(ob, dm, from, pa->num, pa->num_dmcache, pa->fuv, pa->foffset, vec, 0, 0, 0);
+ VECCOPY(hairmat[3],vec);
+}
+
+/*
+void psys_key_to_geometry(DerivedMesh *dm, ParticleData *pa, ParticleKey *key)
+{
+ float q[4], v1[3], v2[3], v3[3];
+
+ dm->getVertCo(dm,pa->verts[0],v1);
+ dm->getVertCo(dm,pa->verts[1],v2);
+ dm->getVertCo(dm,pa->verts[2],v3);
+
+ triatoquat(v1, v2, v3, q);
+
+ QuatInv(q);
+
+ VECSUB(key->co,key->co,v1);
+
+ VECADD(key->vel,key->vel,key->co);
+
+ QuatMulVecf(q, key->co);
+ QuatMulVecf(q, key->vel);
+
+ VECSUB(key->vel,key->vel,key->co);
+
+ QuatMul(key->rot,q,key->rot);
+}
+
+void psys_key_from_geometry(DerivedMesh *dm, ParticleData *pa, ParticleKey *key)
+{
+ float q[4], v1[3], v2[3], v3[3];
+
+ dm->getVertCo(dm,pa->verts[0],v1);
+ dm->getVertCo(dm,pa->verts[1],v2);
+ dm->getVertCo(dm,pa->verts[2],v3);
+
+ triatoquat(v1, v2, v3, q);
+
+ VECADD(key->vel,key->vel,key->co);
+
+ QuatMulVecf(q, key->co);
+ QuatMulVecf(q, key->vel);
+
+ VECSUB(key->vel,key->vel,key->co);
+
+ VECADD(key->co,key->co,v1);
+
+ QuatMul(key->rot,q,key->rot);
+}
+*/
+
+void psys_vec_rot_to_face(DerivedMesh *dm, ParticleData *pa, float *vec)//to_geometry(DerivedMesh *dm, ParticleData *pa, float *vec)
+{
+ float mat[4][4];
+
+ psys_face_mat(dm, pa, mat);
+ Mat4Transp(mat); /* cheap inverse for rotation matrix */
+ Mat4Mul3Vecfl(mat, vec);
+}
+
+/* unused */
+#if 0
+static void psys_vec_rot_from_face(DerivedMesh *dm, ParticleData *pa, float *vec)//from_geometry(DerivedMesh *dm, ParticleData *pa, float *vec)
+{
+ float q[4], v1[3], v2[3], v3[3];
+ /*
+ dm->getVertCo(dm,pa->verts[0],v1);
+ dm->getVertCo(dm,pa->verts[1],v2);
+ dm->getVertCo(dm,pa->verts[2],v3);
+ */
+ /* replace with this */
+ MFace *mface;
+ int i; // = psys_particle_dm_face_lookup(dm, pa->num, pa->fuv, pa->foffset, (LinkNode*)NULL);
+ i = pa->num_dmcache==DMCACHE_NOTFOUND ? pa->num : pa->num_dmcache;
+ if (i==-1 || i >= dm->getNumFaces(dm)) { vec[0] = vec[1] = 0; vec[2] = 1; return; }
+ mface=dm->getFaceData(dm,i,CD_MFACE);
+
+ dm->getVertCo(dm,mface->v1,v1);
+ dm->getVertCo(dm,mface->v2,v2);
+ dm->getVertCo(dm,mface->v3,v3);
+ /* done */
+
+ triatoquat(v1, v2, v3, q);
+
+ QuatMulVecf(q, vec);
+
+ //VECADD(vec,vec,v1);
+}
+#endif
+
+void psys_mat_hair_to_global(Object *ob, DerivedMesh *dm, short from, ParticleData *pa, float hairmat[][4])
+{
+ float facemat[4][4];
+
+ psys_mat_hair_to_object(ob, dm, from, pa, facemat);
+
+ Mat4MulMat4(hairmat, facemat, ob->obmat);
+}
+
+/************************************************/
+/* ParticleSettings handling */
+/************************************************/
+static void default_particle_settings(ParticleSettings *part)
+{
+ int i;
+
+ part->type= PART_EMITTER;
+ part->distr= PART_DISTR_JIT;
+ part->draw_as=PART_DRAW_DOT;
+ part->bb_uv_split=1;
+ part->bb_align=PART_BB_VIEW;
+ part->bb_split_offset=PART_BB_OFF_LINEAR;
+ part->flag=PART_REACT_MULTIPLE|PART_HAIR_GEOMETRY;
+
+ part->sta= 1.0;
+ part->end= 100.0;
+ part->lifetime= 50.0;
+ part->jitfac= 1.0;
+ part->totpart= 1000;
+ part->grid_res= 10;
+ part->timetweak= 1.0;
+ part->keyed_time= 0.5;
+ //part->userjit;
+
+ part->integrator= PART_INT_MIDPOINT;
+ part->phystype= PART_PHYS_NEWTON;
+ part->hair_step= 10;
+ part->keys_step= 5;
+ part->draw_step= 4;
+ part->ren_step= 6;
+ part->adapt_angle= 5;
+ part->adapt_pix= 3;
+ part->kink_axis= 2;
+ part->reactevent= PART_EVENT_DEATH;
+ part->disp=100;
+ part->from= PART_FROM_FACE;
+ part->length= 1.0;
+ part->rotfac= 1.0;
+ part->nbetween= 4;
+ part->boidneighbours= 5;
+
+ part->max_vel = 10.0f;
+ part->average_vel = 0.3f;
+ part->max_tan_acc = 0.2f;
+ part->max_lat_acc = 1.0f;
+
+ part->reactshape=1.0f;
+
+ part->mass=1.0;
+ part->size=1.0;
+ part->childsize=1.0;
+
+ part->child_nbr=10;
+ part->childrad=0.2f;
+ part->childflat=0.0f;
+ part->clumppow=0.0f;
+ part->kink_amp=0.2f;
+ part->kink_freq=2.0;
+
+ part->rough1_size=1.0;
+ part->rough2_size=1.0;
+ part->rough_end_shape=1.0;
+
+ part->draw_line[0]=0.5;
+
+ part->banking=1.0;
+ part->max_bank=1.0;
+
+ for(i=0; i<BOID_TOT_RULES; i++){
+ part->boidrule[i]=(char)i;
+ part->boidfac[i]=0.5;
+ }
+
+ part->ipo = NULL;
+}
+
+
+ParticleSettings *psys_new_settings(char *name, Main *main)
+{
+ ParticleSettings *part;
+
+ part= alloc_libblock(&main->particle, ID_PA, name);
+
+ default_particle_settings(part);
+
+ return part;
+}
+
+ParticleSettings *psys_copy_settings(ParticleSettings *part)
+{
+ ParticleSettings *partn;
+
+ partn= copy_libblock(part);
+ if(partn->pd) partn->pd= MEM_dupallocN(part->pd);
+
+ return partn;
+}
+
+void psys_make_local_settings(ParticleSettings *part)
+{
+ Object *ob;
+ ParticleSettings *par;
+ int local=0, lib=0;
+
+ /* - only lib users: do nothing
+ * - only local users: set flag
+ * - mixed: make copy
+ */
+
+ if(part->id.lib==0) return;
+ if(part->id.us==1) {
+ part->id.lib= 0;
+ part->id.flag= LIB_LOCAL;
+ new_id(0, (ID *)part, 0);
+ return;
+ }
+
+ /* test objects */
+ ob= G.main->object.first;
+ while(ob) {
+ ParticleSystem *psys=ob->particlesystem.first;
+ for(; psys; psys=psys->next){
+ if(psys->part==part) {
+ if(ob->id.lib) lib= 1;
+ else local= 1;
+ }
+ }
+ ob= ob->id.next;
+ }
+
+ if(local && lib==0) {
+ part->id.lib= 0;
+ part->id.flag= LIB_LOCAL;
+ new_id(0, (ID *)part, 0);
+ }
+ else if(local && lib) {
+
+ par= psys_copy_settings(part);
+ par->id.us= 0;
+
+ /* do objects */
+ ob= G.main->object.first;
+ while(ob) {
+ ParticleSystem *psys=ob->particlesystem.first;
+ for(; psys; psys=psys->next){
+ if(psys->part==part && ob->id.lib==0) {
+ psys->part= par;
+ par->id.us++;
+ part->id.us--;
+ }
+ }
+ ob= ob->id.next;
+ }
+ }
+}
+
+/* should be integrated to depgraph signals */
+void psys_flush_settings(ParticleSettings *part, int event, int hair_recalc)
+{
+ Base *base;
+ Object *ob, *tob;
+ ParticleSystem *psys;
+ int flush;
+
+ /* update all that have same particle settings */
+ for(base = G.scene->base.first; base; base= base->next) {
+ if(base->object->particlesystem.first) {
+ ob=base->object;
+ flush=0;
+ for(psys=ob->particlesystem.first; psys; psys=psys->next){
+ if(psys->part==part){
+ psys->recalc |= event;
+ if(hair_recalc)
+ psys->recalc |= PSYS_RECALC_HAIR;
+ flush++;
+ }
+ else if(psys->part->type==PART_REACTOR){
+ ParticleSystem *tpsys;
+ tob=psys->target_ob;
+ if(tob==0)
+ tob=ob;
+ tpsys=BLI_findlink(&tob->particlesystem,psys->target_psys-1);
+
+ if(tpsys && tpsys->part==part){
+ psys->flag |= event;
+ flush++;
+ }
+ }
+ }
+ if(flush)
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ }
+}
+/************************************************/
+/* Textures */
+/************************************************/
+static void get_cpa_texture(DerivedMesh *dm, Material *ma, int face_index, float *fw, float *orco, ParticleTexture *ptex, int event)
+{
+ MTex *mtex;
+ int m,setvars=0;
+ float value, rgba[4], texco[3];
+
+ if(ma) for(m=0; m<MAX_MTEX; m++){
+ mtex=ma->mtex[m];
+ if(mtex && (ma->septex & (1<<m))==0){
+ float var=mtex->varfac;
+ short blend=mtex->blendtype;
+ short neg=mtex->pmaptoneg;
+
+ if(mtex->texco & TEXCO_UV && fw){
+ int uv_index=CustomData_get_named_layer_index(&dm->faceData,CD_MTFACE,mtex->uvname);
+ if(uv_index<0){
+ uv_index=CustomData_get_active_layer_index(&dm->faceData,CD_MTFACE);
+ }
+ if(uv_index>=0){
+ CustomDataLayer *layer=&dm->faceData.layers[uv_index];
+ MTFace *mtface= &((MTFace*)layer->data)[face_index];
+ MFace *mf=dm->getFaceData(dm,face_index,CD_MFACE);
+ psys_interpolate_uvs(mtface,mf->v4,fw,texco);
+ texco[0]*=2.0;
+ texco[1]*=2.0;
+ texco[0]-=1.0;
+ texco[1]-=1.0;
+ }
+ else
+ VECCOPY(texco,orco);
+ }
+ else{
+ VECCOPY(texco,orco);
+ }
+ externtex(mtex, texco, &value, rgba, rgba+1, rgba+2, rgba+3);
+ if((event & mtex->pmapto) & MAP_PA_TIME){
+ if((setvars&MAP_PA_TIME)==0){
+ ptex->time=0.0;
+ setvars|=MAP_PA_TIME;
+ }
+ ptex->time= texture_value_blend(mtex->def_var,ptex->time,value,var,blend,neg & MAP_PA_TIME);
+ }
+ if((event & mtex->pmapto) & MAP_PA_LENGTH)
+ ptex->length= texture_value_blend(value,ptex->length,value,var,blend,neg & MAP_PA_LENGTH);
+ if((event & mtex->pmapto) & MAP_PA_CLUMP)
+ ptex->clump= texture_value_blend(value,ptex->clump,value,var,blend,neg & MAP_PA_CLUMP);
+ if((event & mtex->pmapto) & MAP_PA_KINK)
+ ptex->kink= texture_value_blend(value,ptex->kink,value,var,blend,neg & MAP_PA_CLUMP);
+ }
+ }
+ CLAMP(ptex->time,0.0,1.0);
+ CLAMP(ptex->length,0.0,1.0);
+ CLAMP(ptex->clump,0.0,1.0);
+ CLAMP(ptex->kink,0.0,1.0);
+}
+void psys_get_texture(Object *ob, Material *ma, ParticleSystemModifierData *psmd, ParticleSystem *psys, ParticleData *pa, ParticleTexture *ptex, int event)
+{
+ MTex *mtex;
+ int m;
+ float value, rgba[4], texco[3];
+ int setvars=0;
+
+ if(ma) for(m=0; m<MAX_MTEX; m++){
+ mtex=ma->mtex[m];
+ if(mtex && (ma->septex & (1<<m))==0){
+ float var=mtex->varfac;
+ short blend=mtex->blendtype;
+ short neg=mtex->pmaptoneg;
+
+ if(mtex->texco & TEXCO_UV){
+ int uv_index=CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,mtex->uvname);
+ if(uv_index<0){
+ uv_index=CustomData_get_active_layer_index(&psmd->dm->faceData,CD_MTFACE);
+ }
+ if(uv_index>=0){
+ CustomDataLayer *layer=&psmd->dm->faceData.layers[uv_index];
+ MTFace *mtface= &((MTFace*)layer->data)[pa->num];
+ MFace *mf=psmd->dm->getFaceData(psmd->dm,pa->num,CD_MFACE);
+ psys_interpolate_uvs(mtface,mf->v4,pa->fuv,texco);
+ texco[0]*=2.0;
+ texco[1]*=2.0;
+ texco[0]-=1.0;
+ texco[1]-=1.0;
+ }
+ else
+ //psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,pa->fuv,pa->foffset,texco,0,0,0);
+ /* <jahka> anyways I think it will be too small a difference to notice, so psys_get_texture should only know about the original mesh structure.. no dm needed anywhere */
+ psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,-1,pa->fuv,pa->foffset,texco,0,0,0);
+ }
+ else{
+ //psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,pa->fuv,pa->offset,texco,0,0,0);
+ /* ditto above */
+ psys_particle_on_emitter(ob,psmd,psys->part->from,pa->num,-1,pa->fuv,pa->foffset,texco,0,0,0);
+ }
+ externtex(mtex, texco, &value, rgba, rgba+1, rgba+2, rgba+3);
+
+ if((event & mtex->pmapto) & MAP_PA_TIME){
+ if((setvars&MAP_PA_TIME)==0){
+ ptex->time=0.0;
+ setvars|=MAP_PA_TIME;
+ }
+ ptex->time= texture_value_blend(mtex->def_var,ptex->time,value,var,blend,neg & MAP_PA_TIME);
+ }
+ if((event & mtex->pmapto) & MAP_PA_LIFE)
+ ptex->life= texture_value_blend(mtex->def_var,ptex->life,value,var,blend,neg & MAP_PA_LIFE);
+ if((event & mtex->pmapto) & MAP_PA_DENS)
+ ptex->exist= texture_value_blend(mtex->def_var,ptex->exist,value,var,blend,neg & MAP_PA_DENS);
+ if((event & mtex->pmapto) & MAP_PA_SIZE)
+ ptex->size= texture_value_blend(mtex->def_var,ptex->size,value,var,blend,neg & MAP_PA_SIZE);
+ if((event & mtex->pmapto) & MAP_PA_IVEL)
+ ptex->ivel= texture_value_blend(mtex->def_var,ptex->ivel,value,var,blend,neg & MAP_PA_IVEL);
+ if((event & mtex->pmapto) & MAP_PA_PVEL)
+ texture_rgb_blend(ptex->pvel,rgba,ptex->pvel,value,var,blend);
+ if((event & mtex->pmapto) & MAP_PA_LENGTH)
+ ptex->length= texture_value_blend(mtex->def_var,ptex->length,value,var,blend,neg & MAP_PA_LENGTH);
+ if((event & mtex->pmapto) & MAP_PA_CLUMP)
+ ptex->clump= texture_value_blend(mtex->def_var,ptex->clump,value,var,blend,neg & MAP_PA_CLUMP);
+ if((event & mtex->pmapto) & MAP_PA_KINK)
+ ptex->kink= texture_value_blend(mtex->def_var,ptex->kink,value,var,blend,neg & MAP_PA_CLUMP);
+ }
+ }
+ CLAMP(ptex->time,0.0,1.0);
+ CLAMP(ptex->life,0.0,1.0);
+ CLAMP(ptex->exist,0.0,1.0);
+ CLAMP(ptex->size,0.0,1.0);
+ CLAMP(ptex->ivel,0.0,1.0);
+ CLAMP(ptex->length,0.0,1.0);
+ CLAMP(ptex->clump,0.0,1.0);
+ CLAMP(ptex->kink,0.0,1.0);
+}
+/************************************************/
+/* Particle State */
+/************************************************/
+float psys_get_timestep(ParticleSettings *part)
+{
+ return 0.04f*part->timetweak;
+}
+/* part->size should be updated with possible ipo effection before this is called */
+float psys_get_size(Object *ob, Material *ma, ParticleSystemModifierData *psmd, IpoCurve *icu_size, ParticleSystem *psys, ParticleSettings *part, ParticleData *pa, float *vg_size)
+{
+ ParticleTexture ptex;
+ float size=1.0f;
+
+ if(ma && part->from!=PART_FROM_PARTICLE){
+ ptex.size=size;
+ psys_get_texture(ob,ma,psmd,psys,pa,&ptex,MAP_PA_SIZE);
+ size=ptex.size;
+ }
+
+ if(icu_size){
+ calc_icu(icu_size,pa->time);
+ size*=icu_size->curval;
+ }
+
+ if(vg_size)
+ size*=psys_interpolate_value_from_verts(psmd->dm,part->from,pa->num,pa->fuv,vg_size);
+
+ if(part->randsize!=0.0)
+ size*= 1.0f - part->randsize*pa->sizemul;
+
+ return size*part->size;
+}
+float psys_get_child_time(ParticleSystem *psys, int child_nbr, float cfra)
+{
+ ParticleSettings *part = psys->part;
+ ChildParticle *cpa=psys->child+child_nbr;
+
+ if(part->childtype==PART_CHILD_FACES){
+ float time;
+ int w=0;
+ time=0.0;
+ while(w<4 && cpa->pa[w]>=0){
+ time+=cpa->w[w]*(psys->particles+cpa->pa[w])->time;
+ w++;
+ }
+
+ return (cfra-time)/(part->lifetime*(1.0f-part->randlife*cpa->rand[1]));
+ }
+ else{
+ ParticleData *pa = psys->particles + cpa->parent;
+ return (cfra-pa->time)/pa->lifetime;
+ }
+}
+float psys_get_child_size(ParticleSystem *psys, int child_nbr, float cfra, float *pa_time)
+{
+ ParticleSettings *part = psys->part;
+ ChildParticle *cpa = psys->child + child_nbr;
+ float size, time;
+
+ if(part->childtype==PART_CHILD_FACES){
+ if(pa_time)
+ time=*pa_time;
+ else
+ time=psys_get_child_time(psys,child_nbr,cfra);
+
+ if((part->flag&PART_ABS_TIME)==0 && part->ipo){
+ calc_ipo(part->ipo, 100*time);
+ execute_ipo((ID *)part, part->ipo);
+ }
+ size=part->size;
+ }
+ else
+ size=psys->particles[cpa->parent].size;
+
+ size*=part->childsize;
+
+ if(part->childrandsize!=0.0)
+ size *= 1.0f - part->childrandsize*cpa->rand[2];
+
+ return size;
+}
+/* get's hair (or keyed) particles state at the "path time" specified in state->time */
+void psys_get_particle_on_path(Object *ob, ParticleSystem *psys, int p, ParticleKey *state, int vel)
+{
+ ParticleSettings *part = psys->part;
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
+ Material *ma = give_current_material(ob, part->omat);
+ ParticleData *pa;
+ ChildParticle *cpa;
+ ParticleTexture ptex;
+ ParticleKey tstate;
+ HairKey *hkey[2];
+ ParticleKey *par=0, keys[4];
+
+ float t, real_t, dfra, keytime;
+ float orco[3];
+ float imat[4][4], hairmat[4][4], cpa_1st[3];
+ float pa_clump = 0.0, pa_kink = 0.0;
+ int totparent = 0;
+ int totpart = psys->totpart;
+ int totchild = psys->totchild;
+ short between = 0, edit = 0;
+
+ float *cpa_fuv; int cpa_num; short cpa_from;
+
+ //if(psys_in_edit_mode(psys)){
+ // if((psys->edit_path->flag & PSYS_EP_SHOW_CHILD)==0)
+ // totchild=0;
+ // edit=1;
+ //}
+
+ if(G.rendering==0 && part->flag & PART_CHILD_RENDER)
+ totchild=0;
+
+ /* user want's cubic interpolation but only without sb it possible */
+ //if(interpolation==PART_INTER_CUBIC && baked && psys->softflag==OB_SB_ENABLE)
+ // interpolation=PART_INTER_BSPLINE;
+ //else if(baked==0) /* it doesn't make sense to use other types for keyed */
+ // interpolation=PART_INTER_CUBIC;
+
+ t=state->time;
+ CLAMP(t, 0.0, 1.0);
+
+ if(p<totpart){
+ pa = psys->particles + p;
+
+ if(pa->alive==PARS_DEAD && part->flag & PART_STICKY && pa->flag & PARS_STICKY && pa->stick_ob){
+ copy_particle_key(state,&pa->state,0);
+ key_from_object(pa->stick_ob,state);
+ return;
+ }
+
+ hkey[0] = pa->hair;
+ hkey[1] = pa->hair + 1;
+
+ real_t = hkey[0]->time + (hkey[0][pa->totkey-1].time - hkey[0]->time) * t;
+
+ while(hkey[1]->time < real_t)
+ hkey[1]++;
+
+ hkey[0] = hkey[1] - 1;
+
+ hair_to_particle(keys + 1, hkey[0]);
+ hair_to_particle(keys + 2, hkey[1]);
+
+ //if(soft){
+ // if(key[0] != sbel.keys)
+ // DB_copy_key(&k1,key[0]-1);
+ // else
+ // DB_copy_key(&k1,&k2);
+ //}
+ //else{
+ if(hkey[0] != pa->hair)
+ hair_to_particle(keys, hkey[0] - 1);
+ else
+ hair_to_particle(keys, hkey[0]);
+ //}
+
+ //if(soft){
+ // if(key[1] != sbel.keys + sbel.totkey-1)
+ // DB_copy_key(&k4,key[1]+1);
+ // else
+ // DB_copy_key(&k4,&k3);
+ //}
+ //else {
+ if(hkey[1] != pa->hair + pa->totkey - 1)
+ hair_to_particle(keys + 3, hkey[1] + 1);
+ else
+ hair_to_particle(keys + 3, hkey[1]);
+ //}
+
+ //psys_get_particle_on_path(bsys,p,t,bkey,ckey[0]);
+
+ //if(part->rotfrom==PART_ROT_KEYS)
+ // QuatInterpol(state->rot,k2.rot,k3.rot,keytime);
+ //else{
+ // /* TODO: different rotations */
+ // float nvel[3];
+ // float *q2;
+ // VECCOPY(nvel,state->vel);
+ // VecMulf(nvel,-1.0f);
+ // q2=vectoquat(nvel, OB_POSX, OB_POSZ);
+ // QUATCOPY(state->rot,q2);
+ //}
+
+ dfra = keys[2].time - keys[1].time;
+
+ keytime = (real_t - keys[1].time) / dfra;
+
+ interpolate_particle((psys->part->flag & PART_HAIR_BSPLINE) ? KEY_BSPLINE : KEY_CARDINAL
+ ,keys, keytime, state);
+
+ if((pa->flag & PARS_REKEY)==0) {
+ psys_mat_hair_to_global(ob, psmd->dm, part->from, pa, hairmat);
+ Mat4MulVecfl(hairmat, state->co);
+
+ if(psys->effectors.first && (part->flag & PART_CHILD_GUIDE)==0) {
+ do_guide(state, p, state->time, &psys->effectors);
+ /* TODO: proper velocity handling */
+ }
+
+ if(psys->lattice && edit==0)
+ calc_latt_deform(state->co,1.0f);
+ }
+ }
+ else if(totchild){
+ Mat4Invert(imat,ob->obmat);
+
+ cpa=psys->child+p-totpart;
+
+ if(totchild && part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
+ totparent=(int)(totchild*part->parents*0.3);
+ /* part->parents could still be 0 so we can't test with totparent */
+ between=1;
+ }
+ if(between){
+ int w = 0;
+ float foffset;
+
+ /* get parent states */
+ while(w<4 && cpa->pa[w]>=0){
+ keys[w].time = t;
+ psys_get_particle_on_path(ob, psys, cpa->pa[w], keys+w, 1);
+ w++;
+ }
+
+ /* get the original coordinates (orco) for texture usage */
+ cpa_num=cpa->num;
+
+ foffset= cpa->foffset;
+ if(part->childtype == PART_CHILD_FACES)
+ foffset = -(2.0f + part->childspread);
+ cpa_fuv = cpa->fuv;
+ cpa_from = PART_FROM_FACE;
+
+ psys_particle_on_emitter(ob,psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa->fuv,foffset,orco,0,0,0);
+
+ /* we need to save the actual root position of the child for positioning it accurately to the surface of the emitter */
+ VECCOPY(cpa_1st,orco);
+
+ //w=0;
+ //while(w<4 && cpa->pa[w]>=0){
+ // pa=psys->particles+cpa->pa[w];
+ // psys_particle_on_emitter(ob,psmd,part->from,pa->num,pa->fuv,pa->foffset,vec,0,0,0);
+ // cpa_1st[0] -= cpa->w[w]*vec[0];
+ // cpa_1st[1] -= cpa->w[w]*vec[1];
+ // cpa_1st[2] -= cpa->w[w]*vec[2];
+ // w++;
+ //}
+
+ Mat4MulVecfl(ob->obmat,cpa_1st);
+
+ pa=0;
+ }
+ else{
+ /* get the parent state */
+
+ keys->time = t;
+ psys_get_particle_on_path(ob,psys,cpa->parent,keys,1);
+
+ /* get the original coordinates (orco) for texture usage */
+ pa=psys->particles+cpa->parent;
+
+ cpa_from=part->from;
+ cpa_num=pa->num;
+ cpa_fuv=pa->fuv;
+
+ psys_particle_on_emitter(ob,psmd,cpa_from,cpa_num,DMCACHE_ISCHILD,cpa_fuv,pa->foffset,orco,0,0,0);
+ }
+
+ /* correct child ipo timing */
+ if((part->flag&PART_ABS_TIME)==0 && part->ipo){
+ calc_ipo(part->ipo, 100.0f*t);
+ execute_ipo((ID *)part, part->ipo);
+ }
+
+ /* get different child parameters from textures & vgroups */
+ ptex.clump=1.0;
+ ptex.kink=1.0;
+
+ get_cpa_texture(psmd->dm,ma,cpa_num,cpa_fuv,orco,&ptex,MAP_PA_CACHE-MAP_PA_LENGTH);
+
+ pa_clump=ptex.clump;
+ pa_kink=ptex.kink;
+
+ /* TODO: vertex groups */
+
+ if(between){
+ int w=0;
+
+ state->co[0] = state->co[1] = state->co[2] = 0.0f;
+ state->vel[0] = state->vel[1] = state->vel[2] = 0.0f;
+
+ /* child position is the weighted sum of parent positions */
+ while(w<4 && cpa->pa[w]>=0){
+ state->co[0] += cpa->w[w] * keys[w].co[0];
+ state->co[1] += cpa->w[w] * keys[w].co[1];
+ state->co[2] += cpa->w[w] * keys[w].co[2];
+
+ state->vel[0] += cpa->w[w] * keys[w].vel[0];
+ state->vel[1] += cpa->w[w] * keys[w].vel[1];
+ state->vel[2] += cpa->w[w] * keys[w].vel[2];
+ w++;
+ }
+ /* apply offset for correct positioning */
+ VECADD(state->co,state->co,cpa_1st);
+ }
+ else{
+ /* offset the child from the parent position */
+ offset_child(cpa, keys, state, part->childflat, part->childrad);
+ }
+
+ par = keys;
+ //if(totparent){
+ // if(p-totpart>=totparent){
+ // key.time=t;
+ // psys_get_particle_on_path(ob,psys,totpart+cpa->parent,&key,1);
+ // bti->convert_dynamic_key(bsys,&key,par,cpar);
+ // }
+ // else
+ // par=0;
+ //}
+ //else
+ // DB_get_key_on_path(bsys,cpa->parent,t,par,cpar);
+
+ /* apply different deformations to the child path */
+ if(part->kink)
+ do_prekink(state, par, par->rot, t, part->kink_freq * pa_kink, part->kink_shape,
+ part->kink_amp, part->kink, part->kink_axis, ob->obmat);
+
+ do_clump(state, par, t, part->clumpfac, part->clumppow, 1.0f);
+
+ if(part->kink)
+ do_postkink(state, par, par->rot, t, part->kink_freq * pa_kink, part->kink_shape,
+ part->kink_amp, part->kink, part->kink_axis, ob->obmat);
+
+ if(part->rough1 != 0.0)
+ do_rough(orco, t, part->rough1, part->rough1_size, 0.0, state);
+
+ if(part->rough2 != 0.0)
+ do_rough(cpa->rand, t, part->rough2, part->rough2_size, part->rough2_thres, state);
+
+ if(part->rough_end != 0.0)
+ do_rough_end(cpa->rand, t, part->rough_end, part->rough_end_shape, state, par);
+
+ if(vel){
+ if(t>=0.001f){
+ tstate.time=t-0.001f;
+ psys_get_particle_on_path(ob,psys,p,&tstate,0);
+ VECSUB(state->vel,state->co,tstate.co);
+ }
+ else{
+ tstate.time=t+0.001f;
+ psys_get_particle_on_path(ob,psys,p,&tstate,0);
+ VECSUB(state->vel,tstate.co,state->co);
+ }
+ }
+
+ }
+}
+/* gets particle's state at a time, returns 1 if particle exists and can be seen and 0 if not */
+int psys_get_particle_state(Object *ob, ParticleSystem *psys, int p, ParticleKey *state, int always){
+ ParticleSettings *part=psys->part;
+ ParticleData *pa=0;
+ float cfra;
+ int totpart=psys->totpart, between=0;
+
+ if(state->time>0)
+ cfra=state->time;
+ else
+ cfra=bsystem_time(0,(float)G.scene->r.cfra,0.0);
+
+ if(psys->totchild && p>=totpart){
+ if(G.rendering==0 && part->flag&PART_CHILD_RENDER)
+ return 0;
+ if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
+ between=1;
+ }
+ else
+ pa=psys->particles+(psys->child+p-totpart)->parent;
+ }
+ else
+ pa=psys->particles+p;
+
+ if(between){
+ state->time = psys_get_child_time(psys,p-totpart,cfra);
+
+ if(always==0)
+ if((state->time<0.0 && (part->flag & PART_UNBORN)==0)
+ || (state->time>1.0 && (part->flag & PART_DIED)==0))
+ return 0;
+ }
+ else{
+ if(pa->alive==PARS_KILLED) return 0;
+ if(always==0)
+ if((pa->alive==PARS_UNBORN && (part->flag & PART_UNBORN)==0)
+ || (pa->alive==PARS_DEAD && (part->flag & PART_DIED)==0))
+ return 0;
+ }
+
+ //if(bsys->flag & (BSYS_DONE|BSYS_KEYED)){
+ // if(between){
+ // //ChildParticle *cpa=psys->child+p-totpart;
+ // //state->time= (cfra-(part->sta+(part->end-part->sta)*cpa->rand[0]))/(part->lifetime*cpa->rand[1]);
+ // }
+ // else
+ // state->time= (cfra-pa->time)/(pa->dietime-pa->time);//pa->lifetime;
+
+ // psys_get_particle_on_path(ob,psys,p,state,1);
+ // return 1;
+ //}
+ //else{
+ //if(psys->totchild && p>=psys->totpart){
+ // ChildParticle *cpa=psys->child+p-psys->totpart;
+ // ParticleKey *key1, skey;
+ // float t=(cfra-pa->time)/pa->lifetime, clump;
+
+ // pa=psys->particles+cpa->parent;
+
+ // if(pa->alive==PARS_DEAD && part->flag&PART_STICKY && pa->flag&PARS_STICKY && pa->stick_ob){
+ // key1=&skey;
+ // copy_particle_key(key1,&pa->state,0);
+ // key_from_object(pa->stick_ob,key1);
+ // }
+ // else{
+ // key1=&pa->state;
+ // }
+ //
+ // offset_child(cpa, key1, state, part->childflat, part->childrad);
+ //
+ // CLAMP(t,0.0,1.0);
+ // if(part->kink) /* TODO: part->kink_freq*pa_kink */
+ // do_prekink(state,key1,t,part->kink_freq,part->kink_shape,part->kink_amp,part->kink,part->kink_axis,ob->obmat);
+ //
+ // /* TODO: pa_clump vgroup */
+ // do_clump(state,key1,t,part->clumpfac,part->clumppow,0);
+
+ // if(part->kink) /* TODO: part->kink_freq*pa_kink */
+ // do_postkink(state,key1,t,part->kink_freq,part->kink_shape,part->kink_amp,part->kink,part->kink_axis,ob->obmat);
+
+ //}
+ //else{
+ if (pa) { /* TODO PARTICLE - should this ever be NULL? - Campbell */
+ copy_particle_key(state,&pa->state,0);
+
+ if(pa->alive==PARS_DEAD && part->flag&PART_STICKY && pa->flag&PARS_STICKY && pa->stick_ob){
+ key_from_object(pa->stick_ob,state);
+ }
+
+ if(psys->lattice)
+ calc_latt_deform(state->co,1.0f);
+ }
+ //}
+
+ return 1;
+ //}
+}
+
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
new file mode 100644
index 00000000000..0bcf6be0a4a
--- /dev/null
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -0,0 +1,4371 @@
+/* particle_system.c
+ *
+ *
+ * $Id: particle_system.c $
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_particle_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_force.h"
+#include "DNA_object_types.h"
+#include "DNA_material_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_group_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_texture_types.h"
+
+#include "BLI_rand.h"
+#include "BLI_jitter.h"
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_kdtree.h"
+#include "BLI_linklist.h"
+
+#include "BKE_anim.h"
+#include "BKE_bad_level_calls.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_displist.h"
+
+#include "BKE_particle.h"
+#include "BKE_global.h"
+#include "BKE_utildefines.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_object.h"
+#include "BKE_material.h"
+#include "BKE_ipo.h"
+#include "BKE_softbody.h"
+#include "BKE_depsgraph.h"
+#include "BKE_lattice.h"
+#include "BKE_pointcache.h"
+#include "BKE_modifier.h"
+
+#include "BSE_headerbuttons.h"
+
+#include "blendef.h"
+
+#include "RE_shader_ext.h"
+
+/************************************************/
+/* Reacting to system events */
+/************************************************/
+
+static int get_current_display_percentage(ParticleSystem *psys)
+{
+ ParticleSettings *part=psys->part;
+
+ if(G.rendering || (part->child_nbr && part->childtype))
+ return 100;
+
+ if(part->phystype==PART_PHYS_KEYED){
+ if(psys->flag & PSYS_FIRST_KEYED)
+ return psys->part->disp;
+ else
+ return 100;
+ }
+ else
+ return psys->part->disp;
+}
+
+static void alloc_particles(ParticleSystem *psys, int new_totpart)
+{
+ ParticleData *newpars = 0, *pa;
+ int i, totpart, totsaved = 0;
+
+ if(new_totpart<0){
+ if(psys->part->distr==PART_DISTR_GRID){
+ totpart= psys->part->grid_res;
+ totpart*=totpart*totpart;
+ }
+ else
+ totpart=psys->part->totpart;
+ }
+ else
+ totpart=new_totpart;
+
+ if(totpart)
+ newpars= MEM_callocN(totpart*sizeof(ParticleData), "particles");
+ if(psys->particles){
+ totsaved=MIN2(psys->totpart,totpart);
+ /*save old pars*/
+ if(totsaved)
+ memcpy(newpars,psys->particles,totsaved*sizeof(ParticleData));
+
+ for(i=totsaved, pa=psys->particles+totsaved; i<psys->totpart; i++, pa++)
+ if(pa->hair) MEM_freeN(pa->hair);
+
+ MEM_freeN(psys->particles);
+ }
+ psys->particles=newpars;
+
+ if(psys->part->child_nbr && psys->part->childtype){
+ if(psys->child)
+ MEM_freeN(psys->child);
+ psys->child = NULL;
+ if(totpart)
+ psys->child= MEM_callocN(totpart*psys->part->child_nbr*sizeof(ChildParticle), "child_particles");
+ psys->totchild=totpart*psys->part->child_nbr;
+ }
+ else if(psys->child){
+ MEM_freeN(psys->child);
+ psys->child=0;
+ psys->totchild=0;
+ }
+
+ psys->totpart=totpart;
+}
+
+/* only run this if from == PART_FROM_FACE */
+static void psys_calc_dmfaces(Object *ob, DerivedMesh *dm, ParticleSystem *psys)
+{
+ /* use for building derived mesh face-origin info,
+ node - the allocated links - total derived mesh face count
+ node_array - is the array of nodes alligned with the base mesh's faces, so each original face can reference its derived faces
+ */
+ Mesh *me= (Mesh*)ob->data;
+ ParticleData *pa= 0;
+ int p;
+
+ /* CACHE LOCATIONS */
+ if(!dm->deformedOnly) {
+ /* Will use later to speed up subsurf/derivedmesh */
+
+ int tot_dm_face = dm->getNumFaces(dm);
+ int totface = me->totface;
+ int *origindex = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+ int i;
+ LinkNode *node, *node_dm_faces, **node_array;
+
+ node_dm_faces = node = MEM_callocN(sizeof(LinkNode)*tot_dm_face, "faceindicies");
+ node_array = MEM_callocN(sizeof(LinkNode *)*totface, "faceindicies array");
+
+ for(i=0; i < tot_dm_face; i++, origindex++, node++) {
+ node->link = (void *)i; // or use the index?
+ if(*origindex != -1) {
+ if(node_array[*origindex]) {
+ /* prepend */
+ node->next = node_array[*origindex];
+ node_array[*origindex] = node;
+ } else {
+ node_array[*origindex] = node;
+ }
+ }
+ }
+
+ /* cache the faces! */
+
+
+ for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++) {
+ //i = pa->num;
+ //if (i<totface) // should never happen
+ i = psys_particle_dm_face_lookup(ob, dm, pa->num, pa->fuv, node_array[pa->num]);
+ pa->num_dmcache = i;
+ }
+
+ //for (i=0; i < totface; i++) {
+ // i = psys_particle_dm_face_lookup(ob, dm, node_array[], fuv, (LinkNode*)NULL);
+ //}
+ MEM_freeN(node_array);
+ MEM_freeN(node_dm_faces);
+
+ } else {
+ /* set the num_dmcache to an invalid value, just incase */
+ /* TODO PARTICLE, make the following line unnecessary, each function should know to use the num or num_dmcache */
+
+ /*
+ for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++) {
+ pa->num_dmcache = pa->num;
+ }
+ */
+ for(p=0,pa=psys->particles; p<psys->totpart; p++,pa++) {
+ pa->num_dmcache = -1;
+ }
+ }
+}
+
+static void distribute_particles_in_grid(DerivedMesh *dm, ParticleSystem *psys)
+{
+ ParticleData *pa=0;
+ float min[3], max[3], delta[3], d;
+ MVert *mv, *mvert = dm->getVertDataArray(dm,0);
+ int totvert=dm->getNumVerts(dm), from=psys->part->from;
+ int i, j, k, p, res=psys->part->grid_res, size[3], axis;
+
+ mv=mvert;
+
+ /* find bounding box of dm */
+ VECCOPY(min,mv->co);
+ VECCOPY(max,mv->co);
+ mv++;
+
+ for(i=1; i<totvert; i++, mv++){
+ min[0]=MIN2(min[0],mv->co[0]);
+ min[1]=MIN2(min[1],mv->co[1]);
+ min[2]=MIN2(min[2],mv->co[2]);
+
+ max[0]=MAX2(max[0],mv->co[0]);
+ max[1]=MAX2(max[1],mv->co[1]);
+ max[2]=MAX2(max[2],mv->co[2]);
+ }
+
+ VECSUB(delta,max,min);
+
+ /* determine major axis */
+ axis = (delta[0]>=delta[1])?0:((delta[1]>=delta[2])?1:2);
+
+ d = delta[axis]/(float)res;
+
+ size[axis]=res;
+ size[(axis+1)%3]=(int)ceil(delta[(axis+1)%3]/d);
+ size[(axis+2)%3]=(int)ceil(delta[(axis+2)%3]/d);
+
+ /* float errors grrr.. */
+ size[(axis+1)%3] = MIN2(size[(axis+1)%3],res);
+ size[(axis+2)%3] = MIN2(size[(axis+2)%3],res);
+
+ min[0]+=d/2.0f;
+ min[1]+=d/2.0f;
+ min[2]+=d/2.0f;
+
+ for(i=0,p=0,pa=psys->particles; i<res; i++){
+ for(j=0; j<res; j++){
+ for(k=0; k<res; k++,p++,pa++){
+ pa->fuv[0]=min[0]+(float)i*d;
+ pa->fuv[1]=min[1]+(float)j*d;
+ pa->fuv[2]=min[2]+(float)k*d;
+ pa->flag |= PARS_UNEXIST;
+ pa->loop=0; /* abused in volume calculation */
+ }
+ }
+ }
+
+ /* enable particles near verts/edges/faces/inside surface */
+ if(from==PART_FROM_VERT){
+ float vec[3];
+
+ pa=psys->particles;
+
+ min[0]-=d/2.0f;
+ min[1]-=d/2.0f;
+ min[2]-=d/2.0f;
+
+ for(i=0,mv=mvert; i<totvert; i++,mv++){
+ VecSubf(vec,mv->co,min);
+ vec[0]/=delta[0];
+ vec[1]/=delta[1];
+ vec[2]/=delta[2];
+ (pa +((int)(vec[0]*(size[0]-1))*res
+ +(int)(vec[1]*(size[1]-1)))*res
+ +(int)(vec[2]*(size[2]-1)))->flag &= ~PARS_UNEXIST;
+ }
+ }
+ else if(ELEM(from,PART_FROM_FACE,PART_FROM_VOLUME)){
+ float co1[3], co2[3];
+
+ MFace *mface=0;
+ float v1[3], v2[3], v3[3], v4[4], lambda;
+ int a, a1, a2, a0mul, a1mul, a2mul, totface;
+ int amax= from==PART_FROM_FACE ? 3 : 1;
+
+ totface=dm->getNumFaces(dm);
+ mface=dm->getFaceDataArray(dm,CD_MFACE);
+
+ for(a=0; a<amax; a++){
+ if(a==0){ a0mul=res*res; a1mul=res; a2mul=1; }
+ else if(a==1){ a0mul=res; a1mul=1; a2mul=res*res; }
+ else{ a0mul=1; a1mul=res*res; a2mul=res; }
+
+ for(a1=0; a1<size[(a+1)%3]; a1++){
+ for(a2=0; a2<size[(a+2)%3]; a2++){
+ mface=dm->getFaceDataArray(dm,CD_MFACE);
+
+ pa=psys->particles + a1*a1mul + a2*a2mul;
+ VECCOPY(co1,pa->fuv);
+ co1[a]-=d/2.0f;
+ VECCOPY(co2,co1);
+ co2[a]+=delta[a] + 0.001f*d;
+ co1[a]-=0.001f*d;
+
+ /* lets intersect the faces */
+ for(i=0; i<totface; i++,mface++){
+ VECCOPY(v1,mvert[mface->v1].co);
+ VECCOPY(v2,mvert[mface->v2].co);
+ VECCOPY(v3,mvert[mface->v3].co);
+
+ if(AxialLineIntersectsTriangle(a,co1, co2, v2, v3, v1, &lambda)){
+ if(from==PART_FROM_FACE)
+ (pa+(int)(lambda*size[a])*a0mul)->flag &= ~PARS_UNEXIST;
+ else /* store number of intersections */
+ (pa+(int)(lambda*size[a])*a0mul)->loop++;
+ }
+
+ if(mface->v4){
+ VECCOPY(v4,mvert[mface->v4].co);
+
+ if(AxialLineIntersectsTriangle(a,co1, co2, v4, v1, v3, &lambda)){
+ if(from==PART_FROM_FACE)
+ (pa+(int)(lambda*size[a])*a0mul)->flag &= ~PARS_UNEXIST;
+ else
+ (pa+(int)(lambda*size[a])*a0mul)->loop++;
+ }
+ }
+ }
+
+ if(from==PART_FROM_VOLUME){
+ int in=pa->loop%2;
+ if(in) pa->loop++;
+ for(i=0; i<size[0]; i++){
+ if(in || (pa+i*a0mul)->loop%2)
+ (pa+i*a0mul)->flag &= ~PARS_UNEXIST;
+ /* odd intersections == in->out / out->in */
+ /* even intersections -> in stays same */
+ in=(in + (pa+i*a0mul)->loop) % 2;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(psys->part->flag & PART_GRID_INVERT){
+ for(i=0,pa=psys->particles; i<size[0]; i++){
+ for(j=0; j<size[1]; j++){
+ pa=psys->particles + res*(i*res + j);
+ for(k=0; k<size[2]; k++, pa++){
+ pa->flag ^= PARS_UNEXIST;
+ }
+ }
+ }
+ }
+}
+
+/* modified copy from effect.c */
+static void init_mv_jit(float *jit, int num, int seed2, float amount)
+{
+ RNG *rng;
+ float *jit2, x, rad1, rad2, rad3;
+ int i, num2;
+
+ if(num==0) return;
+
+ rad1= (float)(1.0/sqrt((float)num));
+ rad2= (float)(1.0/((float)num));
+ rad3= (float)sqrt((float)num)/((float)num);
+
+ rng = rng_new(31415926 + num + seed2);
+ x= 0;
+ num2 = 2 * num;
+ for(i=0; i<num2; i+=2) {
+
+ jit[i]= x + amount*rad1*(0.5f - rng_getFloat(rng));
+ jit[i+1]= i/(2.0f*num) + amount*rad1*(0.5f - rng_getFloat(rng));
+
+ jit[i]-= (float)floor(jit[i]);
+ jit[i+1]-= (float)floor(jit[i+1]);
+
+ x+= rad3;
+ x -= (float)floor(x);
+ }
+
+ jit2= MEM_mallocN(12 + 2*sizeof(float)*num, "initjit");
+
+ for (i=0 ; i<4 ; i++) {
+ BLI_jitterate1(jit, jit2, num, rad1);
+ BLI_jitterate1(jit, jit2, num, rad1);
+ BLI_jitterate2(jit, jit2, num, rad2);
+ }
+ MEM_freeN(jit2);
+ rng_free(rng);
+}
+
+static void psys_uv_to_w(float u, float v, int quad, float *w)
+{
+ float vert[4][3], co[3];
+
+ if(!quad) {
+ if(u+v > 1.0f)
+ v= 1.0f-v;
+ else
+ u= 1.0f-u;
+ }
+
+ vert[0][0]= 0.0f; vert[0][1]= 0.0f; vert[0][2]= 0.0f;
+ vert[1][0]= 1.0f; vert[1][1]= 0.0f; vert[1][2]= 0.0f;
+ vert[2][0]= 1.0f; vert[2][1]= 1.0f; vert[2][2]= 0.0f;
+
+ co[0]= u;
+ co[1]= v;
+ co[2]= 0.0f;
+
+ if(quad) {
+ vert[3][0]= 0.0f; vert[3][1]= 1.0f; vert[3][2]= 0.0f;
+ MeanValueWeights(vert, 4, co, w);
+ }
+ else {
+ MeanValueWeights(vert, 3, co, w);
+ w[3]= 0.0f;
+ }
+}
+
+static int binary_search_distribution(float *sum, int n, float value)
+{
+ int mid, low=0, high=n;
+
+ while(low <= high) {
+ mid= (low + high)/2;
+ if(sum[mid] <= value && value <= sum[mid+1])
+ return mid;
+ else if(sum[mid] > value)
+ high= mid - 1;
+ else if(sum[mid] < value)
+ low= mid + 1;
+ else
+ return mid;
+ }
+
+ return low;
+}
+
+/* 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! */
+
+/* This is to denote functionality that does not yet work with mesh - only derived mesh */
+#define ONLY_WORKING_WITH_PA_VERTS 0
+static void distribute_particles_on_dm(DerivedMesh *finaldm, Object *ob, ParticleSystem *psys, int from)
+{
+ Object *tob;
+ ParticleData *pa=0, *tpars=0, *tpa;
+ ParticleSettings *part;
+ ParticleSystem *tpsys;
+ ChildParticle *cpa=0;
+ KDTree *tree=0;
+ ParticleSeam *seams=0;
+ float *jit= NULL;
+ int p=0,i;
+ int no_distr=0, cfrom=0;
+ int tot=0, totpart, *index=0, children=0, totseam=0;
+ //int *vertpart=0;
+ int jitlevel= 1, intersect, distr;
+ float *weight=0,*sum=0,*jitoff=0;
+ float cur, maxweight=0.0,tweight;
+ float *v1, *v2, *v3, *v4, co[3], nor[3], co1[3], co2[3], nor1[3];
+ float cur_d, min_d;
+ DerivedMesh *dm= NULL;
+
+ if(ob==0 || psys==0 || psys->part==0)
+ return;
+
+ part=psys->part;
+ totpart=psys->totpart;
+ if(totpart==0)
+ return;
+
+ if (!finaldm->deformedOnly && !CustomData_has_layer( &finaldm->faceData, CD_ORIGINDEX ) ) {
+ error("Can't paint with the current modifier stack, disable destructive modifiers");
+ return;
+ }
+
+ BLI_srandom(31415926 + psys->seed);
+
+ if(from==PART_FROM_CHILD){
+ distr=PART_DISTR_RAND;
+ cpa=psys->child;
+ if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
+ dm= finaldm;
+ children=1;
+
+ tree=BLI_kdtree_new(totpart);
+
+ for(p=0,pa=psys->particles; p<totpart; p++,pa++){
+ psys_particle_on_dm(ob,dm,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co,nor,0,0);
+ BLI_kdtree_insert(tree, p, co, nor);
+ }
+
+ BLI_kdtree_balance(tree);
+
+ totpart=psys->totchild;
+ cfrom=from=PART_FROM_FACE;
+
+ if(part->flag&PART_CHILD_SEAMS){
+ MEdge *ed, *medge=dm->getEdgeDataArray(dm,CD_MEDGE);
+ MVert *mvert=dm->getVertDataArray(dm,CD_MVERT);
+ int totedge=dm->getNumEdges(dm);
+
+ for(p=0, ed=medge; p<totedge; p++,ed++)
+ if(ed->flag&ME_SEAM)
+ totseam++;
+
+ if(totseam){
+ ParticleSeam *cur_seam=seams=MEM_callocN(totseam*sizeof(ParticleSeam),"Child Distribution Seams");
+ float temp[3],temp2[3];
+
+ for(p=0, ed=medge; p<totedge; p++,ed++){
+ if(ed->flag&ME_SEAM){
+ VecCopyf(cur_seam->v0,(mvert+ed->v1)->co);
+ VecCopyf(cur_seam->v1,(mvert+ed->v2)->co);
+
+ VecSubf(cur_seam->dir,cur_seam->v1,cur_seam->v0);
+
+ cur_seam->length2=VecLength(cur_seam->dir);
+ cur_seam->length2*=cur_seam->length2;
+
+ temp[0]=(float)((mvert+ed->v1)->no[0]);
+ temp[1]=(float)((mvert+ed->v1)->no[1]);
+ temp[2]=(float)((mvert+ed->v1)->no[2]);
+ temp2[0]=(float)((mvert+ed->v2)->no[0]);
+ temp2[1]=(float)((mvert+ed->v2)->no[1]);
+ temp2[2]=(float)((mvert+ed->v2)->no[2]);
+
+ VecAddf(cur_seam->nor,temp,temp2);
+ Normalize(cur_seam->nor);
+
+ Crossf(cur_seam->tan,cur_seam->dir,cur_seam->nor);
+
+ Normalize(cur_seam->tan);
+
+ cur_seam++;
+ }
+ }
+ }
+
+ }
+ }
+ else{
+ /* no need to figure out distribution */
+ for(i=0; i<part->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=VecLength(cpa->fuv);
+ }
+
+ cpa->rand[0]=BLI_frand();
+ cpa->rand[1]=BLI_frand();
+ cpa->rand[2]=BLI_frand();
+
+ cpa->num=-1;
+ }
+ }
+
+ return;
+ }
+ }
+ else{
+ dm= CDDM_from_mesh((Mesh*)ob->data, ob);
+
+ /* special handling of grid distribution */
+ if(part->distr==PART_DISTR_GRID){
+ distribute_particles_in_grid(dm,psys);
+ dm->release(dm);
+ return;
+ }
+
+ distr=part->distr;
+ pa=psys->particles;
+ if(from==PART_FROM_VERT){
+ MVert *mv= dm->getVertDataArray(dm,0);
+ int totvert = dm->getNumVerts(dm);
+
+ tree=BLI_kdtree_new(totvert);
+
+ for(p=0; p<totvert; p++,mv++){
+ VECCOPY(co,mv->co);
+ BLI_kdtree_insert(tree,p,co,NULL);
+ }
+
+ BLI_kdtree_balance(tree);
+ }
+ }
+
+ /* 1. */
+ switch(from){
+ case PART_FROM_VERT:
+ tot = dm->getNumVerts(dm);
+ break;
+ case PART_FROM_VOLUME:
+ case PART_FROM_FACE:
+ tot = dm->getNumFaces(dm);
+ break;
+ case PART_FROM_PARTICLE:
+ if(psys->target_ob)
+ tob=psys->target_ob;
+ else
+ tob=ob;
+
+ if((tpsys=BLI_findlink(&tob->particlesystem,psys->target_psys-1))){
+ tpars=tpsys->particles;
+ tot=tpsys->totpart;
+ }
+ break;
+ }
+
+ if(tot==0){
+ no_distr=1;
+ if(children){
+ fprintf(stderr,"Particle child distribution error: Nothing to emit from!\n");
+ 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 {
+ 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(dm != finaldm) dm->release(dm);
+ return;
+ }
+
+ /* 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");
+
+ /* 2.1 */
+ if((part->flag&PART_EDISTR || children) && ELEM(from,PART_FROM_PARTICLE,PART_FROM_VERT)==0){
+ float totarea=0.0;
+
+ for(i=0; i<tot; i++){
+ MFace *mf=dm->getFaceData(dm,i,CD_MFACE);
+ MVert *mv1=dm->getVertData(dm,mf->v1,CD_MVERT);
+ MVert *mv2=dm->getVertData(dm,mf->v2,CD_MVERT);
+ MVert *mv3=dm->getVertData(dm,mf->v3,CD_MVERT);
+
+ if (mf->v4){
+ MVert *mv4=dm->getVertData(dm,mf->v4,CD_MVERT);
+ cur= AreaQ3Dfl(mv1->co,mv2->co,mv3->co,mv4->co);
+ }
+ else
+ cur= AreaT3Dfl(mv1->co,mv2->co,mv3->co);
+
+ if(cur>maxweight)
+ maxweight=cur;
+
+ weight[i]= cur;
+ totarea+=cur;
+ }
+
+ for(i=0; i<tot; i++)
+ 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;
+ 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);
+
+ 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->getFaceData(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;
+ }
+ }
+ MEM_freeN(vweight);
+ }
+ }
+
+ /* 3. */
+ sum[0]= 0.0f;
+ for(i=0;i<tot; i++)
+ sum[i+1]= sum[i]+weight[i];
+
+ if(part->flag&PART_TRAND){
+ float pos;
+
+ for(p=0; p<totpart; p++) {
+ pos= BLI_frand();
+ index[p]= binary_search_distribution(sum, tot, pos);
+ jitoff[index[p]]= pos;
+ }
+ }
+ else {
+ float step, pos;
+
+ step= (totpart <= 1)? 0.5f: 1.0f/(totpart-1);
+ pos= 0.0f;
+ i= 0;
+
+ for(p=0; p<totpart; p++, pos+=step) {
+ while((i < tot) && (pos > sum[i+1]))
+ i++;
+
+ index[p]= MIN2(tot-1, i);
+ jitoff[index[p]]= pos;
+ }
+ }
+
+ /* 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;
+ }
+
+ /* 4. */
+ if(distr==PART_DISTR_JIT && ELEM(from,PART_FROM_FACE,PART_FROM_VOLUME)) {
+ jitlevel= part->userjit;
+
+ if(jitlevel == 0) {
+ jitlevel= totpart/tot;
+ if(part->flag & PART_EDISTR) jitlevel*= 2; /* looks better in general, not very scietific */
+ if(jitlevel<3) jitlevel= 3;
+ //if(jitlevel>100) jitlevel= 100;
+ }
+
+ jit= MEM_callocN(2+ jitlevel*2*sizeof(float), "jit");
+
+ init_mv_jit(jit, jitlevel, psys->seed, part->jitfac);
+ BLI_array_randomize(jit, 2*sizeof(float), jitlevel, psys->seed); /* for custom jit or even distribution */
+ }
+
+ /* 5. */
+ if(children) from=PART_FROM_CHILD;
+ for(p=0,pa=psys->particles; p<totpart; p++,pa++,cpa++){
+ switch(from){
+ case PART_FROM_VERT:
+ /* TODO_PARTICLE - use original index */
+ pa->num=index[p];
+ pa->fuv[0] = 1.0f;
+ pa->fuv[1] = pa->fuv[2] = pa->fuv[3] = 0.0;
+ //pa->verts[0] = pa->verts[1] = pa->verts[2] = 0;
+
+#if ONLY_WORKING_WITH_PA_VERTS
+ if(tree){
+ KDTreeNearest ptn[3];
+ int w,maxw;
+
+ psys_particle_on_dm(ob,dm,from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0);
+ maxw = BLI_kdtree_find_n_nearest(tree,3,co1,NULL,ptn);
+
+ for(w=0; w<maxw; w++){
+ pa->verts[w]=ptn->num;
+ }
+ }
+#endif
+ break;
+ case PART_FROM_FACE:
+ case PART_FROM_VOLUME:
+ {
+ MFace *mface;
+ pa->num = i = index[p];
+ mface = dm->getFaceData(dm,i,CD_MFACE);
+
+ switch(distr){
+ case PART_DISTR_JIT:
+ jitoff[i] = fmod(jitoff[i],(float)jitlevel);
+ psys_uv_to_w(jit[2*(int)jitoff[i]], jit[2*(int)jitoff[i]+1], mface->v4, pa->fuv);
+ jitoff[i]++;
+ //jitoff[i]=(float)fmod(jitoff[i]+maxweight/weight[i],(float)jitlevel);
+ break;
+ case PART_DISTR_RAND:
+ psys_uv_to_w(BLI_frand(), BLI_frand(), mface->v4, pa->fuv);
+ break;
+ }
+ pa->foffset= 0.0f;
+
+ /*
+ pa->verts[0] = mface->v1;
+ pa->verts[1] = mface->v2;
+ pa->verts[2] = mface->v3;
+ */
+
+ /* experimental */
+ if(from==PART_FROM_VOLUME){
+ MVert *mvert=dm->getVertDataArray(dm,CD_MVERT);
+
+ tot=dm->getNumFaces(dm);
+
+ psys_interpolate_face(mvert,mface,0,pa->fuv,co1,nor,0,0);
+
+ Normalize(nor);
+ VecMulf(nor,-100.0);
+
+ VECADD(co2,co1,nor);
+
+ min_d=2.0;
+ intersect=0;
+
+ for(i=0,mface=dm->getFaceDataArray(dm,CD_MFACE); i<tot; i++,mface++){
+ if(i==pa->num) continue;
+
+ v1=mvert[mface->v1].co;
+ v2=mvert[mface->v2].co;
+ v3=mvert[mface->v3].co;
+
+ if(LineIntersectsTriangle(co1, co2, v2, v3, v1, &cur_d, 0)){
+ if(cur_d<min_d){
+ min_d=cur_d;
+ pa->foffset=cur_d*50.0f; /* to the middle of volume */
+ intersect=1;
+ }
+ }
+ if(mface->v4){
+ v4=mvert[mface->v4].co;
+
+ if(LineIntersectsTriangle(co1, co2, v4, v1, v3, &cur_d, 0)){
+ if(cur_d<min_d){
+ min_d=cur_d;
+ pa->foffset=cur_d*50.0f; /* to the middle of volume */
+ intersect=1;
+ }
+ }
+ }
+ }
+ if(intersect==0)
+ pa->foffset=0.0;
+ else switch(distr){
+ case PART_DISTR_JIT:
+ pa->foffset*= jit[2*(int)jitoff[i]];
+ break;
+ case PART_DISTR_RAND:
+ pa->foffset*=BLI_frand();
+ break;
+ }
+ }
+ break;
+ }
+ case PART_FROM_PARTICLE:
+
+ //pa->verts[0]=0; /* not applicable */
+ //pa->verts[1]=0;
+ //pa->verts[2]=0;
+
+ tpa=tpars+index[p];
+ pa->num=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=weight[index[p]];
+ weight[index[p]]+=maxweight;
+ break;
+ case PART_FROM_CHILD:
+ if(index[p]>=0){
+ MFace *mf;
+
+ mf=dm->getFaceData(dm,index[p],CD_MFACE);
+
+ //switch(distr){
+ // case PART_DISTR_JIT:
+ // i=index[p];
+ // psys_uv_to_w(jit[2*(int)jitoff[i]], jit[2*(int)jitoff[i]+1], mf->v4, cpa->fuv);
+ // jitoff[i]=(float)fmod(jitoff[i]+maxweight/weight[i],(float)jitlevel);
+ // break;
+ // case PART_DISTR_RAND:
+ psys_uv_to_w(BLI_frand(), BLI_frand(), mf->v4, cpa->fuv);
+ // break;
+ //}
+
+ cpa->rand[0] = BLI_frand();
+ cpa->rand[1] = BLI_frand();
+ cpa->rand[2] = BLI_frand();
+ cpa->num = index[p];
+
+ if(tree){
+ KDTreeNearest ptn[10];
+ int w,maxw, do_seams;
+ float maxd,mind,dd,totw=0.0;
+ int parent[10];
+ float pweight[10];
+
+ do_seams= (part->flag&PART_CHILD_SEAMS && seams);
+
+ psys_particle_on_dm(ob,dm,cfrom,cpa->num,DMCACHE_ISCHILD,cpa->fuv,cpa->foffset,co1,nor1,0,0);
+ maxw = BLI_kdtree_find_n_nearest(tree,(do_seams)?10:4,co1,nor1,ptn);
+
+ maxd=ptn[maxw-1].dist;
+ mind=ptn[0].dist;
+ dd=maxd-mind;
+
+ /* the weights here could be done better */
+ for(w=0; w<maxw; w++){
+ parent[w]=ptn[w].index;
+ pweight[w]=(float)pow(2.0,(double)(-6.0f*ptn[w].dist/maxd));
+ //totw+=cpa->w[w];
+ }
+ for(;w<10; w++){
+ parent[w]=-1;
+ pweight[w]=0.0f;
+ }
+ if(do_seams){
+ ParticleSeam *seam=seams;
+ float temp[3],temp2[3],tan[3];
+ float inp,cur_len,min_len=10000.0f;
+ int min_seam=0, near_vert=0;
+ /* find closest seam */
+ for(i=0; i<totseam; i++, seam++){
+ VecSubf(temp,co1,seam->v0);
+ inp=Inpf(temp,seam->dir)/seam->length2;
+ if(inp<0.0f){
+ cur_len=VecLenf(co1,seam->v0);
+ }
+ else if(inp>1.0f){
+ cur_len=VecLenf(co1,seam->v1);
+ }
+ else{
+ VecCopyf(temp2,seam->dir);
+ VecMulf(temp2,inp);
+ cur_len=VecLenf(temp,temp2);
+ }
+ if(cur_len<min_len){
+ min_len=cur_len;
+ min_seam=i;
+ if(inp<0.0f) near_vert=-1;
+ else if(inp>1.0f) near_vert=1;
+ else near_vert=0;
+ }
+ }
+ seam=seams+min_seam;
+
+ VecCopyf(temp,seam->v0);
+
+ if(near_vert){
+ if(near_vert==-1)
+ VecSubf(tan,co1,seam->v0);
+ else{
+ VecSubf(tan,co1,seam->v1);
+ VecCopyf(temp,seam->v1);
+ }
+
+ Normalize(tan);
+ }
+ else{
+ VecCopyf(tan,seam->tan);
+ VecSubf(temp2,co1,temp);
+ if(Inpf(tan,temp2)<0.0f)
+ VecMulf(tan,-1.0f);
+ }
+ for(w=0; w<maxw; w++){
+ VecSubf(temp2,ptn[w].co,temp);
+ if(Inpf(tan,temp2)<0.0f){
+ parent[w]=-1;
+ pweight[w]=0.0f;
+ }
+ }
+
+ }
+
+ for(w=0,i=0; w<maxw && i<4; w++){
+ if(parent[w]>=0){
+ cpa->pa[i]=parent[w];
+ cpa->w[i]=pweight[w];
+ totw+=pweight[w];
+ i++;
+ }
+ }
+ for(;i<4; i++){
+ cpa->pa[i]=-1;
+ cpa->w[i]=0.0f;
+ }
+
+ if(totw>0.0f) for(w=0; w<4; w++)
+ cpa->w[w]/=totw;
+
+ cpa->parent=cpa->pa[0];
+ }
+ }
+ else{
+ cpa->num=0;
+ cpa->fuv[0]=cpa->fuv[1]=cpa->fuv[2]=cpa->fuv[3]=0.0f;
+ cpa->pa[0]=cpa->pa[1]=cpa->pa[2]=cpa->pa[3]=0;
+ cpa->rand[0]=cpa->rand[1]=cpa->rand[2]=0.0f;
+ }
+ break;
+ }
+ }
+
+ /* 6. */
+ if(jit) MEM_freeN(jit);
+ if(sum) MEM_freeN(sum);
+ if(jitoff) MEM_freeN(jitoff);
+ if(weight){
+ MEM_freeN(weight);
+ weight=0;
+ }
+ if(index) MEM_freeN(index);
+ if(seams) MEM_freeN(seams);
+ //if(vertpart) MEM_freeN(vertpart);
+ BLI_kdtree_free(tree);
+
+ if (from == PART_FROM_FACE)
+ psys_calc_dmfaces(ob, finaldm, psys);
+
+ if(dm != finaldm) dm->release(dm);
+}
+
+/* ready for future use, to emit particles without geometry */
+static void distribute_particles_on_shape(Object *ob, ParticleSystem *psys, int from)
+{
+ ParticleData *pa;
+ int totpart=psys->totpart, p;
+
+ fprintf(stderr,"Shape emission not yet possible!\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;
+ }
+}
+static void distribute_particles(Object *ob, ParticleSystem *psys, int from)
+{
+ ParticleSystemModifierData *psmd=0;
+ int distr_error=0;
+ psmd=psys_get_modifier(ob,psys);
+
+ if(psmd){
+ if(psmd->dm)
+ distribute_particles_on_dm(psmd->dm,ob,psys,from);
+ else
+ distr_error=1;
+ }
+ else
+ distribute_particles_on_shape(ob,psys,from);
+
+ if(distr_error){
+ ParticleData *pa;
+ int totpart=psys->totpart, p;
+
+ fprintf(stderr,"Particle distribution error!\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;
+ }
+ }
+}
+/* set particle parameters that don't change during particle's life */
+void initialize_particle(ParticleData *pa, int p, Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd)
+{
+ ParticleSettings *part;
+ ParticleTexture ptex;
+ Material *ma=0;
+ IpoCurve *icu=0;
+ int totpart;
+ float rand,length;
+
+ part=psys->part;
+
+ totpart=psys->totpart;
+
+ ptex.life=ptex.size=ptex.exist=ptex.length=1.0;
+ ptex.time=(float)p/(float)totpart;
+
+ BLI_srandom(psys->seed+p);
+
+ if(part->from!=PART_FROM_PARTICLE){
+ ma=give_current_material(ob,part->omat);
+
+ /* TODO: needs some work to make most blendtypes generally usefull */
+ psys_get_texture(ob,ma,psmd,psys,pa,&ptex,MAP_PA_INIT);
+ }
+
+ pa->lifetime= part->lifetime*ptex.life;
+
+ if(part->type==PART_HAIR)
+ pa->time=0.0f;
+ else if(part->type==PART_REACTOR && (part->flag&PART_REACT_STA_END)==0)
+ pa->time=MAXFRAMEF;
+ else{
+ //icu=find_ipocurve(psys->part->ipo,PART_EMIT_TIME);
+ //if(icu){
+ // calc_icu(icu,100*ptex.time);
+ // ptex.time=icu->curval;
+ //}
+
+ pa->time= part->sta + (part->end - part->sta)*ptex.time;
+ }
+
+
+ if(part->type==PART_HAIR){
+ pa->lifetime=100.0f;
+ }
+ else{
+ icu=find_ipocurve(psys->part->ipo,PART_EMIT_LIFE);
+ if(icu){
+ calc_icu(icu,100*ptex.time);
+ pa->lifetime*=icu->curval;
+ }
+
+ /* need to get every rand even if we don't use them so that randoms don't affect eachother */
+ rand= BLI_frand();
+ if(part->randlife!=0.0)
+ pa->lifetime*= 1.0f - part->randlife*rand;
+ }
+
+ pa->dietime= pa->time+pa->lifetime;
+
+ pa->sizemul= BLI_frand();
+
+ rand= BLI_frand();
+
+ /* while loops are to have a spherical distribution (avoid cubic distribution) */
+ length=2.0f;
+ while(length>1.0){
+ pa->r_ve[0]=2.0f*(BLI_frand()-0.5f);
+ pa->r_ve[1]=2.0f*(BLI_frand()-0.5f);
+ pa->r_ve[2]=2.0f*(BLI_frand()-0.5f);
+ length=VecLength(pa->r_ve);
+ }
+
+ length=2.0f;
+ while(length>1.0){
+ pa->r_ave[0]=2.0f*(BLI_frand()-0.5f);
+ pa->r_ave[1]=2.0f*(BLI_frand()-0.5f);
+ pa->r_ave[2]=2.0f*(BLI_frand()-0.5f);
+ length=VecLength(pa->r_ave);
+ }
+
+ pa->r_rot[0]=2.0f*(BLI_frand()-0.5f);
+ pa->r_rot[1]=2.0f*(BLI_frand()-0.5f);
+ pa->r_rot[2]=2.0f*(BLI_frand()-0.5f);
+ pa->r_rot[3]=2.0f*(BLI_frand()-0.5f);
+
+ NormalQuat(pa->r_rot);
+
+ if(part->distr!=PART_DISTR_GRID){
+ /* any unique random number will do (r_ave[0]) */
+ if(ptex.exist < 0.5*(1.0+pa->r_ave[0]))
+ pa->flag |= PARS_UNEXIST;
+ else
+ pa->flag &= ~PARS_UNEXIST;
+ }
+
+ pa->loop=0;
+ /* we can't reset to -1 anymore since we've figured out correct index in distribute_particles */
+ /* usage other than straight after distribute has to handle this index by itself - jahka*/
+ //pa->num_dmcache = DMCACHE_NOTFOUND; /* assume we dont have a derived mesh face */
+}
+static void initialize_all_particles(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd)
+{
+ IpoCurve *icu=0;
+ ParticleData *pa;
+ int p, totpart=psys->totpart;
+
+ for(p=0, pa=psys->particles; p<totpart; p++, pa++)
+ initialize_particle(pa,p,ob,psys,psmd);
+
+ /* store the derived mesh face index for each particle */
+ //if(psys->part->from==PART_FROM_FACE)
+ // psys_calc_dmfaces(ob, psmd->dm, psys);
+
+ icu=find_ipocurve(psys->part->ipo,PART_EMIT_FREQ);
+ if(icu){
+ float time=psys->part->sta, end=psys->part->end;
+ float v1, v2, a=0.0f, t1,t2, d;
+
+ p=0;
+ pa=psys->particles;
+
+ calc_icu(icu,time);
+ v1=icu->curval;
+ if(v1<0.0f) v1=0.0f;
+
+ calc_icu(icu,time+1.0f);
+ v2=icu->curval;
+ if(v2<0.0f) v2=0.0f;
+
+ for(p=0, pa=psys->particles; p<totpart && time<end; p++, pa++){
+ while(a+0.5f*(v1+v2) < (float)(p+1) && time<end){
+ a+=0.5f*(v1+v2);
+ v1=v2;
+ time++;
+ calc_icu(icu,time+1.0f);
+ v2=icu->curval;
+ }
+ if(time<end){
+ if(v1==v2){
+ pa->time=time+((float)(p+1)-a)/v1;
+ }
+ else{
+ d=(float)sqrt(v1*v1-2.0f*(v2-v1)*(a-(float)(p+1)));
+ t1=(-v1+d)/(v2-v1);
+ t2=(-v1-d)/(v2-v1);
+
+ /* the root between 0-1 is the correct one */
+ if(t1>0.0f && t1<=1.0f)
+ pa->time=time+t1;
+ else
+ pa->time=time+t2;
+ }
+ }
+
+ pa->dietime = pa->time+pa->lifetime;
+ pa->flag &= ~PARS_UNEXIST;
+ }
+ for(; p<totpart; p++, pa++){
+ pa->flag |= PARS_UNEXIST;
+ }
+ }
+}
+/* sets particle to the emitter surface with initial velocity & rotation */
+void reset_particle(ParticleData *pa, ParticleSystem *psys, ParticleSystemModifierData *psmd, Object *ob,
+ float dtime, float cfra, float *vg_vel, float *vg_tan, float *vg_rot)
+{
+ ParticleSettings *part;
+ ParticleTexture ptex;
+ ParticleKey state;
+ IpoCurve *icu=0;
+ float fac, nor[3]={0,0,0},loc[3],tloc[3],vel[3]={0.0,0.0,0.0},rot[4],*q2=0;
+ float r_vel[3],r_ave[3],r_rot[4],p_vel[3]={0.0,0.0,0.0};
+ float x_vec[3]={1.0,0.0,0.0}, utan[3]={0.0,1.0,0.0}, vtan[3]={0.0,0.0,1.0};
+
+ float q_one[4]={1.0,0.0,0.0,0.0}, q_phase[4];
+ part=psys->part;
+
+ ptex.ivel=1.0;
+
+ if(part->from==PART_FROM_PARTICLE){
+ Object *tob;
+ ParticleSystem *tpsys=0;
+ float speed;
+
+ tob=psys->target_ob;
+ if(tob==0)
+ tob=ob;
+
+ tpsys=BLI_findlink(&tob->particlesystem,psys->target_psys-1);
+
+ /*TODO: get precise location of particle at birth*/
+
+ state.time=cfra;
+ psys_get_particle_state(tob,tpsys,pa->num,&state,1);
+ psys_get_from_key(&state,loc,nor,rot,0);
+
+ QuatMulVecf(rot,vtan);
+ QuatMulVecf(rot,utan);
+ VECCOPY(r_vel,pa->r_ve);
+ VECCOPY(r_rot,pa->r_rot);
+ VECCOPY(r_ave,pa->r_ave);
+
+ VECCOPY(p_vel,state.vel);
+ speed=Normalize(p_vel);
+ VecMulf(p_vel,Inpf(pa->r_ve,p_vel));
+ VECSUB(p_vel,pa->r_ve,p_vel);
+ Normalize(p_vel);
+ VecMulf(p_vel,speed);
+ }
+ else{
+ /* get precise emitter matrix if particle is born */
+ if(part->type!=PART_HAIR && pa->time < cfra && pa->time >= psys->cfra)
+ where_is_object_time(ob,pa->time);
+
+ /* get birth location from object */
+ psys_particle_on_emitter(ob,psmd,part->from,pa->num, pa->num_dmcache, pa->fuv,pa->foffset,loc,nor,utan,vtan);
+
+ /* save local coordinates for later */
+ VECCOPY(tloc,loc);
+
+ /* get possible textural influence */
+ psys_get_texture(ob,give_current_material(ob,part->omat),psmd,psys,pa,&ptex,MAP_PA_IVEL);
+
+ if(vg_vel){
+ ptex.ivel*=psys_interpolate_value_from_verts(psmd->dm,part->from,pa->num,pa->fuv,vg_vel);
+ }
+
+ /* particles live in global space so */
+ /* let's convert: */
+ /* -location */
+ Mat4MulVecfl(ob->obmat,loc);
+
+ /* -normal */
+ VECADD(nor,tloc,nor);
+ Mat4MulVecfl(ob->obmat,nor);
+ VECSUB(nor,nor,loc);
+ Normalize(nor);
+
+ /* -tangent */
+ if(part->tanfac!=0.0){
+ float phase=vg_rot?2.0f*(psys_interpolate_value_from_verts(psmd->dm,part->from,pa->num,pa->fuv,vg_rot)-0.5f):0.0f;
+ VecMulf(vtan,-(float)cos(M_PI*(part->tanphase+phase)));
+ fac=-(float)sin(M_PI*(part->tanphase+phase));
+ VECADDFAC(vtan,vtan,utan,fac);
+
+ VECADD(vtan,tloc,vtan);
+ Mat4MulVecfl(ob->obmat,vtan);
+ VECSUB(vtan,vtan,loc);
+
+ VECCOPY(utan,nor);
+ VecMulf(utan,Inpf(vtan,nor));
+ VECSUB(vtan,vtan,utan);
+
+ Normalize(vtan);
+ }
+
+
+ /* -velocity */
+ if(part->randfac!=0.0){
+ VECADD(r_vel,tloc,pa->r_ve);
+ Mat4MulVecfl(ob->obmat,r_vel);
+ VECSUB(r_vel,r_vel,loc);
+ Normalize(r_vel);
+ }
+
+ /* -angular velocity */
+ if(part->avemode==PART_AVE_RAND){
+ VECADD(r_ave,tloc,pa->r_ave);
+ Mat4MulVecfl(ob->obmat,r_ave);
+ VECSUB(r_ave,r_ave,loc);
+ Normalize(r_ave);
+ }
+
+ /* -rotation */
+ if(part->rotmode==PART_ROT_RAND){
+ QUATCOPY(r_rot,pa->r_rot);
+ Mat4ToQuat(ob->obmat,rot);
+ QuatMul(r_rot,r_rot,rot);
+ }
+ }
+ /* conversion done so now we apply new: */
+ /* -velocity from: */
+ /* *emitter velocity */
+ if(dtime!=0.0 && part->obfac!=0.0){
+ VECSUB(vel,loc,pa->state.co);
+ VecMulf(vel,part->obfac/dtime);
+ }
+
+ /* *emitter normal */
+ if(part->normfac!=0.0)
+ VECADDFAC(vel,vel,nor,part->normfac);
+
+ /* *emitter tangent */
+ if(part->tanfac!=0.0)
+ VECADDFAC(vel,vel,vtan,part->tanfac*(vg_tan?psys_interpolate_value_from_verts(psmd->dm,part->from,pa->num,pa->fuv,vg_tan):1.0f));
+
+ /* *texture */
+ /* TODO */
+
+ /* *random */
+ if(part->randfac!=0.0)
+ VECADDFAC(vel,vel,r_vel,part->randfac);
+
+ /* *particle */
+ if(part->partfac!=0.0)
+ VECADDFAC(vel,vel,p_vel,part->partfac);
+
+ icu=find_ipocurve(psys->part->ipo,PART_EMIT_VEL);
+ if(icu){
+ calc_icu(icu,100*((pa->time-part->sta)/(part->end-part->sta)));
+ ptex.ivel*=icu->curval;
+ }
+
+ VecMulf(vel,ptex.ivel);
+
+ VECCOPY(pa->state.vel,vel);
+
+ /* -location from emitter */
+ VECCOPY(pa->state.co,loc);
+
+ /* -rotation */
+ pa->state.rot[0]=1.0;
+ pa->state.rot[1]=pa->state.rot[2]=pa->state.rot[3]=0.0;
+
+ if(part->rotmode){
+ switch(part->rotmode){
+ case PART_ROT_NOR:
+ VecMulf(nor,-1.0);
+ q2= vectoquat(nor, OB_POSX, OB_POSZ);
+ VecMulf(nor,-1.0);
+ break;
+ case PART_ROT_VEL:
+ VecMulf(vel,-1.0);
+ q2= vectoquat(vel, OB_POSX, OB_POSZ);
+ VecMulf(vel,-1.0);
+ break;
+ case PART_ROT_RAND:
+ q2= r_rot;
+ break;
+ }
+ /* how much to rotate from rest position */
+ QuatInterpol(rot,q_one,q2,part->rotfac);
+
+ /* phase */
+ VecRotToQuat(x_vec,part->phasefac*(float)M_PI,q_phase);
+
+ /* combine amount & phase */
+ QuatMul(pa->state.rot,rot,q_phase);
+ }
+
+ /* -angular velocity */
+
+ pa->state.ave[0]=pa->state.ave[1]=pa->state.ave[2]=0.0;
+
+ if(part->avemode){
+ switch(part->avemode){
+ case PART_AVE_SPIN:
+ VECCOPY(pa->state.ave,vel);
+ break;
+ case PART_AVE_RAND:
+ VECCOPY(pa->state.ave,r_ave);
+ break;
+ }
+ Normalize(pa->state.ave);
+ VecMulf(pa->state.ave,part->avefac);
+
+ icu=find_ipocurve(psys->part->ipo,PART_EMIT_AVE);
+ if(icu){
+ calc_icu(icu,100*((pa->time-part->sta)/(part->end-part->sta)));
+ VecMulf(pa->state.ave,icu->curval);
+ }
+ }
+
+ pa->dietime=pa->time+pa->lifetime;
+
+ if(pa->time >= cfra)
+ pa->alive=PARS_UNBORN;
+
+ pa->state.time=cfra;
+
+ pa->stick_ob=0;
+ pa->flag&=~PARS_STICKY;
+}
+static void reset_all_particles(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float dtime, float cfra, int from)
+{
+ ParticleData *pa;
+ int p, totpart=psys->totpart;
+ float *vg_vel=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_VEL);
+ float *vg_tan=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_TAN);
+ float *vg_rot=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_ROT);
+
+ //if (psys->part->from == PART_FROM_FACE)
+ // psys_calc_dmfaces(ob, psmd->dm, psys);
+
+ for(p=from, pa=psys->particles+from; p<totpart; p++, pa++)
+ reset_particle(pa, psys, psmd, ob, dtime, cfra, vg_vel, vg_tan, vg_rot);
+
+ if(vg_vel)
+ MEM_freeN(vg_vel);
+}
+/************************************************/
+/* Keyed particles */
+/************************************************/
+/* a bit of an unintuitive function :) counts objects in a keyed chain and returns 1 if some of them were selected (used in drawing) */
+int psys_count_keyed_targets(Object *ob, ParticleSystem *psys)
+{
+ ParticleSystem *kpsys=psys,*tpsys;
+ ParticleSettings *tpart;
+ Object *kob=ob,*tob;
+ int select=ob->flag&SELECT;
+ short totkeyed=0;
+ Base *base;
+
+ ListBase lb;
+ lb.first=lb.last=0;
+
+ tob=psys->keyed_ob;
+ while(tob){
+ if((tpsys=BLI_findlink(&tob->particlesystem,kpsys->keyed_psys-1))){
+ tpart=tpsys->part;
+
+ if(tpart->phystype==PART_PHYS_KEYED){
+ if(lb.first){
+ for(base=lb.first;base;base=base->next){
+ if(tob==base->object){
+ fprintf(stderr,"Error: loop in keyed chain!\n");
+ BLI_freelistN(&lb);
+ return select;
+ }
+ }
+ }
+ base=MEM_callocN(sizeof(Base), "keyed base");
+ base->object=tob;
+ BLI_addtail(&lb,base);
+
+ if(tob->flag&SELECT)
+ select++;
+ kob=tob;
+ kpsys=tpsys;
+ tob=tpsys->keyed_ob;
+ totkeyed++;
+ }
+ else{
+ tob=0;
+ totkeyed++;
+ }
+ }
+ else
+ tob=0;
+ }
+ psys->totkeyed=totkeyed;
+ BLI_freelistN(&lb);
+ return select;
+}
+void set_keyed_keys(Object *ob, ParticleSystem *psys)
+{
+ Object *kob = ob;
+ ParticleSystem *kpsys = psys;
+ ParticleData *pa;
+ ParticleKey state;
+ int totpart = psys->totpart, i, k, totkeys = psys->totkeyed + 1;
+ float prevtime, nexttime, keyedtime;
+
+ /* no proper targets so let's clear and bail out */
+ if(psys->totkeyed==0){
+ free_keyed_keys(psys);
+ psys->flag &= ~PSYS_KEYED;
+ return;
+ }
+
+ if(totpart && psys->particles->totkey != totkeys){
+ free_keyed_keys(psys);
+
+ psys->particles->keys = MEM_callocN(psys->totpart * totkeys * sizeof(ParticleKey),"Keyed keys");
+
+ psys->particles->totkey = totkeys;
+
+ for(i=1, pa=psys->particles+1; i<totpart; i++,pa++){
+ pa->keys = (pa-1)->keys + totkeys;
+ pa->totkey = totkeys;
+ }
+ }
+
+ psys->flag &= ~PSYS_KEYED;
+ state.time=-1.0;
+
+ for(k=0; k<totkeys; k++){
+ for(i=0,pa=psys->particles; i<totpart; i++, pa++){
+ psys_get_particle_state(kob, kpsys, i%kpsys->totpart, pa->keys + k, 1);
+
+ if(k==0)
+ pa->keys->time = pa->time;
+ else if(k==totkeys-1)
+ (pa->keys + k)->time = pa->time + pa->lifetime;
+ else{
+ if(psys->flag & PSYS_KEYED_TIME){
+ prevtime = (pa->keys + k - 1)->time;
+ nexttime = pa->time + pa->lifetime;
+ keyedtime = kpsys->part->keyed_time;
+ (pa->keys + k)->time = (1.0f - keyedtime) * prevtime + keyedtime * nexttime;
+ }
+ else
+ (pa->keys+k)->time = pa->time + (float)k / (float)(totkeys - 1) * pa->lifetime;
+ }
+ }
+ if(kpsys->keyed_ob){
+ kob = kpsys->keyed_ob;
+ kpsys = BLI_findlink(&kob->particlesystem, kpsys->keyed_psys - 1);
+ }
+ }
+
+ psys->flag |= PSYS_KEYED;
+}
+/************************************************/
+/* Reactors */
+/************************************************/
+static void push_reaction(Object* ob, ParticleSystem *psys, int pa_num, int event, ParticleKey *state)
+{
+ Object *rob;
+ ParticleSystem *rpsys;
+ ParticleSettings *rpart;
+ ParticleData *pa;
+ ListBase *lb=&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=psys->particles+pa_num;
+ re= MEM_callocN(sizeof(ParticleReactEvent), "react event");
+ re->event=event;
+ re->pa_num = pa_num;
+ re->ob = ob;
+ re->psys = 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){
+ 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->alive=PARS_ALIVE;
+ pa->time=pa_time;
+ pa->dietime=pa->time+pa->lifetime;
+ }
+ }
+ else{
+ if(pa->alive==PARS_UNBORN){
+ pa->alive=PARS_ALIVE;
+ pa->time=re->time;
+ pa->dietime=pa->time+pa->lifetime;
+ }
+ }
+ }
+ }
+ else{
+ dist=VecLenf(pa->state.co, re->state.co);
+ if(dist <= re->size){
+ if(pa->alive==PARS_UNBORN){
+ pa->alive=PARS_ALIVE;
+ 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)
+ VecMulf(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)
+ VecMulf(pa->state.vel,(float)pow(1.0f-dist/re->size,part->reactshape));
+ }
+ }
+ }
+}
+void psys_get_reactor_target(Object *ob, ParticleSystem *psys, Object **target_ob, ParticleSystem **target_psys)
+{
+ Object *tob;
+
+ tob=psys->target_ob;
+ if(tob==0)
+ tob=ob;
+
+ *target_psys=BLI_findlink(&tob->particlesystem,psys->target_psys-1);
+ if(*target_psys)
+ *target_ob=tob;
+ else
+ *target_ob=0;
+}
+/************************************************/
+/* Point Cache */
+/************************************************/
+void clear_particles_from_cache(Object *ob, ParticleSystem *psys, int cfra)
+{
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
+ int stack_index = modifiers_indexInObject(ob,(ModifierData*)psmd);
+
+ BKE_ptcache_id_clear((ID *)ob, PTCACHE_CLEAR_ALL, cfra, stack_index);
+}
+static void write_particles_to_cache(Object *ob, ParticleSystem *psys, int cfra)
+{
+ FILE *fp = NULL;
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
+ ParticleData *pa;
+ int stack_index = modifiers_indexInObject(ob,(ModifierData*)psmd);
+ int i, totpart = psys->totpart;
+
+ if(totpart == 0) return;
+
+ fp = BKE_ptcache_id_fopen((ID *)ob, 'w', cfra, stack_index);
+ if(!fp) return;
+
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++)
+ fwrite(&pa->state, sizeof(ParticleKey), 1, fp);
+
+ fclose(fp);
+}
+static int get_particles_from_cache(Object *ob, ParticleSystem *psys, int cfra)
+{
+ FILE *fp = NULL;
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
+ ParticleData *pa;
+ int stack_index = modifiers_indexInObject(ob,(ModifierData*)psmd);
+ int i, totpart = psys->totpart, ret = 1;
+
+ if(totpart == 0) return 0;
+
+ fp = BKE_ptcache_id_fopen((ID *)ob, 'r', cfra, stack_index);
+ if(!fp)
+ ret = 0;
+ else {
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++)
+ if((fread(&pa->state, sizeof(ParticleKey), 1, fp)) != 1) {
+ ret = 0;
+ break;
+ }
+
+ fclose(fp);
+ }
+
+ return ret;
+}
+/************************************************/
+/* Effectors */
+/************************************************/
+static float effector_falloff(PartDeflect *pd, float *eff_velocity, float *vec_to_part)
+{
+ float eff_dir[3], temp[3];
+ float falloff=1.0, fac, r_fac;
+
+ VecCopyf(eff_dir,eff_velocity);
+ Normalize(eff_dir);
+
+ if(pd->flag & PFIELD_POSZ && Inpf(eff_dir,vec_to_part)<0.0f)
+ falloff=0.0f;
+ else switch(pd->falloff){
+ case PFIELD_FALL_SPHERE:
+ fac=VecLength(vec_to_part);
+ if(pd->flag&PFIELD_USEMAX && fac>pd->maxdist){
+ falloff=0.0f;
+ break;
+ }
+
+ if(pd->flag & PFIELD_USEMIN){
+ if(fac>pd->mindist)
+ fac+=1.0f-pd->mindist;
+ else
+ fac=1.0f;
+ }
+ else if(fac<0.001)
+ fac=0.001f;
+
+ falloff=1.0f/(float)pow((double)fac,(double)pd->f_power);
+ break;
+
+ case PFIELD_FALL_TUBE:
+ fac=Inpf(vec_to_part,eff_dir);
+ if(pd->flag&PFIELD_USEMAX && ABS(fac)>pd->maxdist){
+ falloff=0.0f;
+ break;
+ }
+
+ VECADDFAC(temp,vec_to_part,eff_dir,-fac);
+ r_fac=VecLength(temp);
+ if(pd->flag&PFIELD_USEMAXR && r_fac>pd->maxrad){
+ falloff=0.0f;
+ break;
+ }
+
+ fac=ABS(fac);
+
+
+ if(pd->flag & PFIELD_USEMIN){
+ if(fac>pd->mindist)
+ fac+=1.0f-pd->mindist;
+ else
+ fac=1.0f;
+ }
+ else if(fac<0.001)
+ fac=0.001f;
+
+ if(pd->flag & PFIELD_USEMINR){
+ if(r_fac>pd->minrad)
+ r_fac+=1.0f-pd->minrad;
+ else
+ r_fac=1.0f;
+ }
+ else if(r_fac<0.001)
+ r_fac=0.001f;
+
+ falloff=1.0f/((float)pow((double)fac,(double)pd->f_power)*(float)pow((double)r_fac,(double)pd->f_power_r));
+
+ break;
+ case PFIELD_FALL_CONE:
+ fac=Inpf(vec_to_part,eff_dir);
+ if(pd->flag&PFIELD_USEMAX && ABS(fac)>pd->maxdist){
+ falloff=0.0f;
+ break;
+ }
+ r_fac=saacos(fac/VecLength(vec_to_part))*180.0f/(float)M_PI;
+ if(pd->flag&PFIELD_USEMAXR && r_fac>pd->maxrad){
+ falloff=0.0f;
+ break;
+ }
+
+ if(pd->flag & PFIELD_USEMIN){
+ if(fac>pd->mindist)
+ fac+=1.0f-pd->mindist;
+ else
+ fac=1.0f;
+ }
+ else if(fac<0.001)
+ fac=0.001f;
+
+ if(pd->flag & PFIELD_USEMINR){
+ if(r_fac>pd->minrad)
+ r_fac+=1.0f-pd->minrad;
+ else
+ r_fac=1.0f;
+ }
+ else if(r_fac<0.001)
+ r_fac=0.001f;
+
+ falloff=1.0f/((float)pow((double)fac,(double)pd->f_power)*(float)pow((double)r_fac,(double)pd->f_power_r));
+
+ break;
+// case PFIELD_FALL_INSIDE:
+ //for(i=0; i<totface; i++,mface++){
+ // VECCOPY(v1,mvert[mface->v1].co);
+ // VECCOPY(v2,mvert[mface->v2].co);
+ // VECCOPY(v3,mvert[mface->v3].co);
+
+ // if(AxialLineIntersectsTriangle(a,co1, co2, v2, v3, v1, &lambda)){
+ // if(from==PART_FROM_FACE)
+ // (pa+(int)(lambda*size[a])*a0mul)->flag &= ~PARS_UNEXIST;
+ // else /* store number of intersections */
+ // (pa+(int)(lambda*size[a])*a0mul)->loop++;
+ // }
+ //
+ // if(mface->v4){
+ // VECCOPY(v4,mvert[mface->v4].co);
+
+ // if(AxialLineIntersectsTriangle(a,co1, co2, v4, v1, v3, &lambda)){
+ // if(from==PART_FROM_FACE)
+ // (pa+(int)(lambda*size[a])*a0mul)->flag &= ~PARS_UNEXIST;
+ // else
+ // (pa+(int)(lambda*size[a])*a0mul)->loop++;
+ // }
+ // }
+ //}
+
+// break;
+ }
+
+ return falloff;
+}
+static void do_physical_effector(short type, float force_val, float distance, float falloff, float size, float damp,
+ float *eff_velocity, float *vec_to_part, float *velocity, float *field, int planar)
+{
+ float mag_vec[3]={0,0,0};
+ float temp[3], temp2[3];
+ float eff_vel[3];
+
+ VecCopyf(eff_vel,eff_velocity);
+ Normalize(eff_vel);
+
+ switch(type){
+ case PFIELD_WIND:
+ VECCOPY(mag_vec,eff_vel);
+
+ VecMulf(mag_vec,force_val*falloff);
+ VecAddf(field,field,mag_vec);
+ break;
+
+ case PFIELD_FORCE:
+ if(planar)
+ Projf(mag_vec,vec_to_part,eff_vel);
+ else
+ VecCopyf(mag_vec,vec_to_part);
+
+ VecMulf(mag_vec,force_val*falloff);
+ VecAddf(field,field,mag_vec);
+ break;
+
+ case PFIELD_VORTEX:
+ Crossf(mag_vec,eff_vel,vec_to_part);
+ Normalize(mag_vec);
+
+ VecMulf(mag_vec,force_val*distance*falloff);
+ VecAddf(field,field,mag_vec);
+
+ break;
+ case PFIELD_MAGNET:
+ if(planar)
+ VecCopyf(temp,eff_vel);
+ else
+ /* magnetic field of a moving charge */
+ Crossf(temp,eff_vel,vec_to_part);
+
+ Crossf(temp2,velocity,temp);
+ VecAddf(mag_vec,mag_vec,temp2);
+
+ VecMulf(mag_vec,force_val*falloff);
+ VecAddf(field,field,mag_vec);
+ break;
+ case PFIELD_HARMONIC:
+ if(planar)
+ Projf(mag_vec,vec_to_part,eff_vel);
+ else
+ VecCopyf(mag_vec,vec_to_part);
+
+ VecMulf(mag_vec,force_val*falloff);
+ VecSubf(field,field,mag_vec);
+
+ VecCopyf(mag_vec,velocity);
+ /* 1.9 is an experimental value to get critical damping at damp=1.0 */
+ VecMulf(mag_vec,damp*1.9f*(float)sqrt(force_val));
+ VecSubf(field,field,mag_vec);
+ break;
+ case PFIELD_NUCLEAR:
+ /*pow here is root of cosine expression below*/
+ //rad=(float)pow(2.0,-1.0/power)*distance/size;
+ //VECCOPY(mag_vec,vec_to_part);
+ //Normalize(mag_vec);
+ //VecMulf(mag_vec,(float)cos(3.0*M_PI/2.0*(1.0-1.0/(pow(rad,power)+1.0)))/(rad+0.2f));
+ //VECADDFAC(field,field,mag_vec,force_val);
+ break;
+ }
+}
+static void do_texture_effector(Tex *tex, short mode, short is_2d, float nabla, short object, float *pa_co, float obmat[4][4], float force_val, float falloff, float *field)
+{
+ TexResult result[4];
+ float tex_co[3], strength, mag_vec[3];
+ int i;
+
+ if(tex==0) return;
+
+ for(i=0; i<4; i++)
+ result[i].nor=0;
+
+ strength= force_val*falloff;///(float)pow((double)distance,(double)power);
+
+ VECCOPY(tex_co,pa_co);
+
+ if(is_2d){
+ float fac=-Inpf(tex_co,obmat[2]);
+ VECADDFAC(tex_co,tex_co,obmat[2],fac);
+ }
+
+ if(object){
+ VecSubf(tex_co,tex_co,obmat[3]);
+ Mat4Mul3Vecfl(obmat,tex_co);
+ }
+
+ multitex_ext(tex, tex_co, NULL,NULL, 1, result);
+
+ if(mode==PFIELD_TEX_RGB){
+ mag_vec[0]= (0.5f-result->tr)*strength;
+ mag_vec[1]= (0.5f-result->tg)*strength;
+ mag_vec[2]= (0.5f-result->tb)*strength;
+ }
+ else{
+ strength/=nabla;
+
+ tex_co[0]+= nabla;
+ multitex_ext(tex, tex_co, NULL,NULL, 1, result+1);
+
+ tex_co[0]-= nabla;
+ tex_co[1]+= nabla;
+ multitex_ext(tex, tex_co, NULL,NULL, 1, result+2);
+
+ tex_co[1]-= nabla;
+ tex_co[2]+= nabla;
+ multitex_ext(tex, tex_co, NULL,NULL, 1, result+3);
+
+ if(mode==PFIELD_TEX_GRAD){
+ mag_vec[0]= (result[0].tin-result[1].tin)*strength;
+ mag_vec[1]= (result[0].tin-result[2].tin)*strength;
+ mag_vec[2]= (result[0].tin-result[3].tin)*strength;
+ }
+ else{ /*PFIELD_TEX_CURL*/
+ float dbdy,dgdz,drdz,dbdx,dgdx,drdy;
+
+ dbdy= result[2].tb-result[0].tb;
+ dgdz= result[3].tg-result[0].tg;
+ drdz= result[3].tr-result[0].tr;
+ dbdx= result[1].tb-result[0].tb;
+ dgdx= result[1].tg-result[0].tg;
+ drdy= result[2].tr-result[0].tr;
+
+ mag_vec[0]=(dbdy-dgdz)*strength;
+ mag_vec[1]=(drdz-dbdx)*strength;
+ mag_vec[2]=(dgdx-drdy)*strength;
+ }
+ }
+
+ if(is_2d){
+ float fac=-Inpf(mag_vec,obmat[2]);
+ VECADDFAC(mag_vec,mag_vec,obmat[2],fac);
+ }
+
+ VecAddf(field,field,mag_vec);
+}
+static void add_to_effectors(ListBase *lb, Object *ob, Object *obsrc, ParticleSystem *psys)
+{
+ ParticleEffectorCache *ec;
+ PartDeflect *pd= ob->pd;
+ short type=0,i;
+
+ if(pd && ob != obsrc){
+ if(pd->forcefield == PFIELD_GUIDE) {
+ if(ob->type==OB_CURVE) {
+ Curve *cu= ob->data;
+ if(cu->flag & CU_PATH) {
+ if(cu->path==NULL || cu->path->data==NULL)
+ makeDispListCurveTypes(ob, 0);
+ if(cu->path && cu->path->data) {
+ type |= PSYS_EC_EFFECTOR;
+ }
+ }
+ }
+ }
+ else if(pd->forcefield)
+ type |= PSYS_EC_EFFECTOR;
+ }
+
+ if(pd && pd->deflect)
+ type |= PSYS_EC_DEFLECT;
+
+ if(type){
+ ec= MEM_callocN(sizeof(ParticleEffectorCache), "effector cache");
+ ec->ob= ob;
+ ec->type=type;
+ ec->distances=0;
+ ec->locations=0;
+ BLI_addtail(lb, ec);
+ }
+
+ type=0;
+
+ /* add particles as different effectors */
+ if(ob->particlesystem.first){
+ ParticleSystem *epsys=ob->particlesystem.first;
+ ParticleSettings *epart=0;
+ Object *tob;
+
+ for(i=0; epsys; epsys=epsys->next,i++){
+ type=0;
+ if(epsys!=psys){
+ epart=epsys->part;
+
+ if(epsys->part->pd && epsys->part->pd->forcefield)
+ type=PSYS_EC_PARTICLE;
+
+ if(epart->type==PART_REACTOR) {
+ tob=epsys->target_ob;
+ if(tob==0)
+ tob=ob;
+ if(BLI_findlink(&tob->particlesystem,epsys->target_psys-1)==psys)
+ type|=PSYS_EC_REACTOR;
+ }
+
+ if(type){
+ ec= MEM_callocN(sizeof(ParticleEffectorCache), "effector cache");
+ ec->ob= ob;
+ ec->type=type;
+ ec->psys_nbr=i;
+ BLI_addtail(lb, ec);
+ }
+ }
+ }
+
+ }
+}
+void psys_init_effectors(Object *obsrc, Group *group, ParticleSystem *psys)
+{
+ ListBase *listb=&psys->effectors;
+ Base *base;
+ unsigned int layer= obsrc->lay;
+
+ listb->first=listb->last=0;
+
+ if(group) {
+ GroupObject *go;
+
+ for(go= group->gobject.first; go; go= go->next) {
+ if( (go->ob->lay & layer) && (go->ob->pd || go->ob->particlesystem.first)) {
+ add_to_effectors(listb, go->ob, obsrc, psys);
+ }
+ }
+ }
+ else {
+ for(base = G.scene->base.first; base; base= base->next) {
+ if( (base->lay & layer) && (base->object->pd || base->object->particlesystem.first)) {
+ add_to_effectors(listb, base->object, obsrc, psys);
+ }
+ }
+ }
+}
+
+void psys_end_effectors(ParticleSystem *psys)
+{
+ ListBase *lb=&psys->effectors;
+ if(lb->first) {
+ ParticleEffectorCache *ec;
+ for(ec= lb->first; ec; ec= ec->next){
+ if(ec->distances)
+ MEM_freeN(ec->distances);
+
+ if(ec->locations)
+ MEM_freeN(ec->locations);
+
+ if(ec->face_minmax)
+ MEM_freeN(ec->face_minmax);
+
+ if(ec->vert_cos)
+ MEM_freeN(ec->vert_cos);
+
+ if(ec->tree)
+ BLI_kdtree_free(ec->tree);
+ }
+
+ BLI_freelistN(lb);
+ }
+}
+
+static void precalc_effectors(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd)
+{
+ ListBase *lb=&psys->effectors;
+ ParticleEffectorCache *ec;
+ ParticleSettings *part=psys->part;
+ ParticleData *pa;
+ float vec2[3],loc[3],*co=0;
+ int p,totpart,totvert;
+
+ for(ec= lb->first; ec; ec= ec->next) {
+ PartDeflect *pd= ec->ob->pd;
+
+ if(ec->type==PSYS_EC_EFFECTOR && pd->forcefield==PFIELD_GUIDE && ec->ob->type==OB_CURVE
+ && part->phystype!=PART_PHYS_BOIDS) {
+ float vec[4];
+
+ where_on_path(ec->ob, 0.0, vec, vec2);
+
+ Mat4MulVecfl(ec->ob->obmat,vec);
+ Mat4Mul3Vecfl(ec->ob->obmat,vec2);
+
+ QUATCOPY(ec->firstloc,vec);
+ VECCOPY(ec->firstdir,vec2);
+
+ totpart=psys->totpart;
+
+ if(totpart){
+ ec->distances=MEM_callocN(totpart*sizeof(float),"particle distances");
+ ec->locations=MEM_callocN(totpart*3*sizeof(float),"particle locations");
+
+ for(p=0,pa=psys->particles; p<totpart; p++, pa++){
+ psys_particle_on_emitter(ob,psmd,part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,loc,0,0,0);
+ Mat4MulVecfl(ob->obmat,loc);
+ ec->distances[p]=VecLenf(loc,vec);
+ VECSUB(loc,loc,vec);
+ VECCOPY(ec->locations+3*p,loc);
+ }
+ }
+ }
+ else if(ec->type==PSYS_EC_DEFLECT){
+ DerivedMesh *dm;
+ MFace *mface=0;
+ MVert *mvert=0;
+ int i, totface;
+ float v1[3],v2[3],v3[3],v4[4], *min, *max;
+
+ if(ob==ec->ob)
+ dm=psmd->dm;
+ else{
+ psys_disable_all(ec->ob);
+
+ dm=mesh_get_derived_final(ec->ob,0);
+
+ psys_enable_all(ec->ob);
+ }
+
+ if(dm){
+ totvert=dm->getNumVerts(dm);
+ totface=dm->getNumFaces(dm);
+ mface=dm->getFaceDataArray(dm,CD_MFACE);
+ mvert=dm->getVertDataArray(dm,CD_MVERT);
+
+ /* Decide which is faster to calculate by the amount of*/
+ /* matrice multiplications needed to convert spaces. */
+ /* With size deflect we have to convert allways because */
+ /* the object can be scaled nonuniformly (sphere->ellipsoid). */
+ if(totvert<2*psys->totpart || part->flag & PART_SIZE_DEFL){
+ co=ec->vert_cos=MEM_callocN(sizeof(float)*3*totvert,"Particle deflection vert cos");
+ /* convert vert coordinates to global (particle) coordinates */
+ for(i=0; i<totvert; i++, co+=3){
+ VECCOPY(co,mvert[i].co);
+ Mat4MulVecfl(ec->ob->obmat,co);
+ }
+ co=ec->vert_cos;
+ }
+ else
+ ec->vert_cos=0;
+
+ INIT_MINMAX(ec->ob_minmax,ec->ob_minmax+3);
+
+ min=ec->face_minmax=MEM_callocN(sizeof(float)*6*totface,"Particle deflection face minmax");
+ max=min+3;
+
+ for(i=0; i<totface; i++,mface++,min+=6,max+=6){
+ if(co){
+ VECCOPY(v1,co+3*mface->v1);
+ VECCOPY(v2,co+3*mface->v2);
+ VECCOPY(v3,co+3*mface->v3);
+ }
+ else{
+ VECCOPY(v1,mvert[mface->v1].co);
+ VECCOPY(v2,mvert[mface->v2].co);
+ VECCOPY(v3,mvert[mface->v3].co);
+ }
+ INIT_MINMAX(min,max);
+ DO_MINMAX(v1,min,max);
+ DO_MINMAX(v2,min,max);
+ DO_MINMAX(v3,min,max);
+
+ if(mface->v4){
+ if(co){
+ VECCOPY(v4,co+3*mface->v4);
+ }
+ else{
+ VECCOPY(v4,mvert[mface->v4].co);
+ }
+ DO_MINMAX(v4,min,max);
+ }
+
+ DO_MINMAX(min,ec->ob_minmax,ec->ob_minmax+3);
+ DO_MINMAX(max,ec->ob_minmax,ec->ob_minmax+3);
+ }
+ }
+ else
+ ec->face_minmax=0;
+ }
+ else if(ec->type==PSYS_EC_PARTICLE){
+ if(psys->part->phystype==PART_PHYS_BOIDS){
+ Object *eob = ec->ob;
+ ParticleSystem *epsys;
+ ParticleSettings *epart;
+ ParticleData *epa;
+ ParticleKey state;
+ PartDeflect *pd;
+ int totepart, p;
+ epsys= BLI_findlink(&eob->particlesystem,ec->psys_nbr);
+ epart= epsys->part;
+ pd= epart->pd;
+ totepart= epsys->totpart;
+ if(pd->forcefield==PFIELD_FORCE && totepart){
+ KDTree *tree;
+
+ tree=BLI_kdtree_new(totepart);
+ ec->tree=tree;
+
+ for(p=0, epa=epsys->particles; p<totepart; p++,epa++)
+ if(epa->alive==PARS_ALIVE && psys_get_particle_state(eob,epsys,p,&state,0))
+ BLI_kdtree_insert(tree, p, state.co, NULL);
+
+ BLI_kdtree_balance(tree);
+ }
+ }
+ }
+ }
+}
+
+
+/* calculate forces that all effectors apply to a particle*/
+static void do_effectors(int pa_no, ParticleData *pa, ParticleKey *state, Object *ob, ParticleSystem *psys, float *force_field, float *vel,float framestep, float cfra)
+{
+ Object *eob;
+ ParticleSystem *epsys;
+ ParticleSettings *epart;
+ ParticleData *epa;
+ ParticleKey estate;
+ PartDeflect *pd;
+ ListBase *lb=&psys->effectors;
+ ParticleEffectorCache *ec;
+ float distance, vec_to_part[3];
+ float falloff;
+ int p;
+
+ /* check all effector objects for interaction */
+ if(lb->first){
+ for(ec = lb->first; ec; ec= ec->next){
+ eob= ec->ob;
+ if(ec->type & PSYS_EC_EFFECTOR){
+ pd=eob->pd;
+ if(psys->part->type!=PART_HAIR && psys->part->integrator)
+ where_is_object_time(eob,cfra);
+ /* Get IPO force strength and fall off values here */
+ //if (has_ipo_code(eob->ipo, OB_PD_FSTR))
+ // force_val = IPO_GetFloatValue(eob->ipo, OB_PD_FSTR, cfra);
+ //else
+ // force_val = pd->f_strength;
+
+ //if (has_ipo_code(eob->ipo, OB_PD_FFALL))
+ // ffall_val = IPO_GetFloatValue(eob->ipo, OB_PD_FFALL, cfra);
+ //else
+ // ffall_val = pd->f_power;
+
+ //if (has_ipo_code(eob->ipo, OB_PD_FMAXD))
+ // maxdist = IPO_GetFloatValue(eob->ipo, OB_PD_FMAXD, cfra);
+ //else
+ // maxdist = pd->maxdist;
+
+ /* use center of object for distance calculus */
+ //obloc= eob->obmat[3];
+ VecSubf(vec_to_part, state->co, eob->obmat[3]);
+ distance = VecLength(vec_to_part);
+
+ falloff=effector_falloff(pd,eob->obmat[2],vec_to_part);
+
+ if(falloff<=0.0f)
+ ; /* don't do anything */
+ else if(pd->forcefield==PFIELD_TEXTURE)
+ do_texture_effector(pd->tex, pd->tex_mode, pd->flag&PFIELD_TEX_2D, pd->tex_nabla,
+ pd->flag & PFIELD_TEX_OBJECT, state->co, eob->obmat,
+ pd->f_strength, falloff, force_field);
+ else
+ do_physical_effector(pd->forcefield,pd->f_strength,distance,
+ falloff,pd->f_dist,pd->f_damp,eob->obmat[2],vec_to_part,
+ pa->state.vel,force_field,pd->flag&PFIELD_PLANAR);
+ }
+ if(ec->type & PSYS_EC_PARTICLE){
+ int totepart;
+ epsys= BLI_findlink(&eob->particlesystem,ec->psys_nbr);
+ epart= epsys->part;
+ pd= epart->pd;
+ totepart= epsys->totpart;
+
+ if(pd->forcefield==PFIELD_HARMONIC){
+ /* every particle is mapped to only one harmonic effector particle */
+ p= pa_no%epsys->totpart;
+ totepart= p+1;
+ }
+ else{
+ p=0;
+ }
+
+ epsys->lattice=psys_get_lattice(ob,psys);
+
+ for(; p<totepart; p++){
+ epa = epsys->particles + p;
+ estate.time=-1.0;
+ if(psys_get_particle_state(eob,epsys,p,&estate,0)){
+ VECSUB(vec_to_part, state->co, estate.co);
+ distance = VecLength(vec_to_part);
+
+ //if(pd->forcefield==PFIELD_HARMONIC){
+ // //if(cfra < epa->time + radius){ /* radius is fade-in in ui */
+ // // eforce*=(cfra-epa->time)/radius;
+ // //}
+ //}
+ //else{
+ // /* Limit minimum distance to effector particle so that */
+ // /* the force is not too big */
+ // if (distance < 0.001) distance = 0.001f;
+ //}
+
+ falloff=effector_falloff(pd,estate.vel,vec_to_part);
+
+ if(falloff<=0.0f)
+ ; /* don't do anything */
+ else
+ do_physical_effector(pd->forcefield,pd->f_strength,distance,
+ falloff,epart->size,pd->f_damp,estate.vel,vec_to_part,
+ state->vel,force_field,0);
+ }
+ else if(pd->forcefield==PFIELD_HARMONIC && cfra-framestep <= epa->dietime && cfra>epa->dietime){
+ /* first step after key release */
+ psys_get_particle_state(eob,epsys,p,&estate,1);
+ VECADD(vel,vel,estate.vel);
+ /* TODO: add rotation handling here too */
+ }
+ }
+
+ if(epsys->lattice){
+ end_latt_deform();
+ epsys->lattice=0;
+ }
+ }
+ }
+ }
+}
+
+/************************************************/
+/* Newtonian physics */
+/************************************************/
+/* gathers all forces that effect particles and calculates a new state for the particle */
+static void apply_particle_forces(int pa_no, ParticleData *pa, Object *ob, ParticleSystem *psys, ParticleSettings *part, float timestep, float dfra, float cfra, ParticleKey *state)
+{
+ ParticleKey states[5], tkey;
+ float force[3],tvel[3],dx[4][3],dv[4][3];
+ float dtime=dfra*timestep, time, pa_mass=part->mass, fac, fra=psys->cfra;
+ int i, steps=1;
+
+ /* maintain angular velocity */
+ VECCOPY(state->ave,pa->state.ave);
+
+ if(part->flag & PART_SIZEMASS)
+ pa_mass*=pa->size;
+
+ switch(part->integrator){
+ case PART_INT_EULER:
+ steps=1;
+ break;
+ case PART_INT_MIDPOINT:
+ steps=2;
+ break;
+ case PART_INT_RK4:
+ steps=4;
+ break;
+ }
+
+ copy_particle_key(states,&pa->state,1);
+
+ for(i=0; i<steps; i++){
+ force[0]=force[1]=force[2]=0.0;
+ tvel[0]=tvel[1]=tvel[2]=0.0;
+ /* add effectors */
+ do_effectors(pa_no,pa,states+i,ob,psys,force,tvel,dfra,fra);
+
+ /* calculate air-particle interaction */
+ if(part->dragfac!=0.0f){
+ fac=-part->dragfac*pa->size*pa->size*VecLength(states[i].vel);
+ VECADDFAC(force,force,states[i].vel,fac);
+ }
+
+ /* 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;
+ }
+
+ /* force to acceleration*/
+ VecMulf(force,1.0f/pa_mass);
+
+ /* add global acceleration (gravitation) */
+ VECADD(force,force,part->acc);
+
+ //VecMulf(force,dtime);
+
+ /* calculate next state */
+ VECADD(states[i].vel,states[i].vel,tvel);
+
+ //VecMulf(force,0.5f*dt);
+ switch(part->integrator){
+ case PART_INT_EULER:
+ VECADDFAC(state->co,states->co,states->vel,dtime);
+ VECADDFAC(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=psys->cfra+0.5f*dfra;
+ }
+ else{
+ VECADDFAC(state->co,states->co,states[1].vel,dtime);
+ VECADDFAC(state->vel,states->vel,force,dtime);
+ }
+ break;
+ case PART_INT_RK4:
+ switch(i){
+ case 0:
+ VECCOPY(dx[0],states->vel);
+ VecMulf(dx[0],dtime);
+ VECCOPY(dv[0],force);
+ VecMulf(dv[0],dtime);
+
+ VECADDFAC(states[1].co,states->co,dx[0],0.5f);
+ VECADDFAC(states[1].vel,states->vel,dv[0],0.5f);
+ fra=psys->cfra+0.5f*dfra;
+ break;
+ case 1:
+ VECADDFAC(dx[1],states->vel,dv[0],0.5f);
+ VecMulf(dx[1],dtime);
+ VECCOPY(dv[1],force);
+ VecMulf(dv[1],dtime);
+
+ 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);
+ VecMulf(dx[2],dtime);
+ VECCOPY(dv[2],force);
+ VecMulf(dv[2],dtime);
+
+ 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]);
+ VecMulf(dx[3],dtime);
+ VECCOPY(dv[3],force);
+ VecMulf(dv[3],dtime);
+
+ VECADDFAC(state->co,states->co,dx[0],1.0f/6.0f);
+ VECADDFAC(state->co,state->co,dx[1],1.0f/3.0f);
+ VECADDFAC(state->co,state->co,dx[2],1.0f/3.0f);
+ VECADDFAC(state->co,state->co,dx[3],1.0f/6.0f);
+
+ VECADDFAC(state->vel,states->vel,dv[0],1.0f/6.0f);
+ VECADDFAC(state->vel,state->vel,dv[1],1.0f/3.0f);
+ VECADDFAC(state->vel,state->vel,dv[2],1.0f/3.0f);
+ VECADDFAC(state->vel,state->vel,dv[3],1.0f/6.0f);
+ }
+ break;
+ }
+ //VECADD(states[i+1].co,states[i+1].co,force);
+ }
+
+ /* damp affects final velocity */
+ if(part->dampfac!=0.0)
+ VecMulf(state->vel,1.0f-part->dampfac);
+
+ /* finally we do guides */
+ time=(cfra-pa->time)/pa->lifetime;
+ CLAMP(time,0.0,1.0);
+
+ VECCOPY(tkey.co,state->co);
+ VECCOPY(tkey.vel,state->vel);
+ tkey.time=state->time;
+ if(do_guide(&tkey,pa_no,time,&psys->effectors)){
+ VECCOPY(state->co,tkey.co);
+ /* guides don't produce valid velocity */
+ VECSUB(state->vel,tkey.co,pa->state.co);
+ VecMulf(state->vel,1.0f/dtime);
+ state->time=tkey.time;
+ }
+}
+static void rotate_particle(ParticleSettings *part, ParticleData *pa, float dfra, float timestep, ParticleKey *state)
+{
+ float rotfac, rot1[4], rot2[4]={1.0,0.0,0.0,0.0}, dtime=dfra*timestep;
+
+ if((part->flag & PART_ROT_DYN)==0){
+ if(ELEM(part->avemode,PART_AVE_SPIN,PART_AVE_VEL)){
+ float angle;
+ float len1 = VecLength(pa->state.vel);
+ float len2 = VecLength(state->vel);
+
+ if(len1==0.0f || len2==0.0f)
+ state->ave[0]=state->ave[1]=state->ave[2]=0.0f;
+ else{
+ Crossf(state->ave,pa->state.vel,state->vel);
+ Normalize(state->ave);
+ angle=Inpf(pa->state.vel,state->vel)/(len1*len2);
+ VecMulf(state->ave,saacos(angle)/dtime);
+ }
+ }
+
+ if(part->avemode == PART_AVE_SPIN)
+ VecRotToQuat(state->vel,dtime*part->avefac,rot2);
+ }
+
+ rotfac=VecLength(state->ave);
+ if(rotfac==0.0){ /* QuatOne (in VecRotToQuat) doesn't give unit quat [1,0,0,0]?? */
+ rot1[0]=1.0;
+ rot1[1]=rot1[2]=rot1[3]=0;
+ }
+ else{
+ VecRotToQuat(state->ave,rotfac*dtime,rot1);
+ }
+ QuatMul(state->rot,rot1,pa->state.rot);
+ QuatMul(state->rot,rot2,state->rot);
+
+ /* keep rotation quat in good health */
+ NormalQuat(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)
+{
+ 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];
+
+ MeanValueWeights(vert, 4, co, w);
+}
+
+/* check intersection with a derivedmesh */
+int psys_intersect_dm(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(ob,0);
+ if(dm==0)
+ mesh_get_derived_deform(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->getNumFaces(dm);
+ mface=dm->getFaceDataArray(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(AabbIntersectAabb(min,max,p_min,p_max)==0)
+ continue;
+ }
+ else{
+ VECCOPY(min, face_minmax+6*i);
+ VECCOPY(max, face_minmax+6*i+3);
+ if(AabbIntersectAabb(min,max,p_min,p_max)==0)
+ continue;
+ }
+
+ if(radius>0.0f){
+ if(SweepingSphereIntersectsTriangleUV(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(SweepingSphereIntersectsTriangleUV(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(LineIntersectsTriangle(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(LineIntersectsTriangle(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;
+ }
+ }
+ }
+ }
+ }
+ return intersect;
+}
+/* particle - mesh collision code */
+/* in addition to basic point to surface collisions handles friction & damping,*/
+/* angular momentum <-> linear momentum and swept sphere - mesh collisions */
+/* 1. check for all possible deflectors for closest intersection on particle path */
+/* 2. if deflection was found kill the particle or calculate new coordinates */
+static void deflect_particle(Object *pob, ParticleSystemModifierData *psmd, ParticleSystem *psys, ParticleSettings *part, ParticleData *pa, int p, float dfra, float cfra, ParticleKey *state, int *pa_die){
+ Object *ob, *min_ob;
+ MFace *mface;
+ MVert *mvert;
+ DerivedMesh *dm;
+ ListBase *lb=&psys->effectors;
+ ParticleEffectorCache *ec;
+ ParticleKey cstate;
+ float imat[4][4];
+ float co1[3],co2[3],def_loc[3],def_nor[3],unit_nor[3],def_tan[3],dvec[3],def_vel[3],dave[3],dvel[3];
+ float pa_minmax[6];
+ float min_w[4], zerovec[3]={0.0,0.0,0.0}, ipoint[3];
+ float min_d,dotprod,damp,frict,o_len,d_len,radius=-1.0f;
+ int min_face=0, intersect=1, through=0;
+ short deflections=0, global=0;
+
+ VECCOPY(def_loc,pa->state.co);
+ VECCOPY(def_vel,pa->state.vel);
+
+ /* 10 iterations to catch multiple deflections */
+ if(lb->first) while(deflections<10){
+ intersect=0;
+ global=0;
+ min_d=20000.0;
+ min_ob=NULL;
+ /* 1. */
+ for(ec=lb->first; ec; ec=ec->next){
+ if(ec->type & PSYS_EC_DEFLECT){
+ ob= ec->ob;
+
+ if(part->type!=PART_HAIR)
+ where_is_object_time(ob,cfra);
+
+ if(ob==pob){
+ dm=psmd->dm;
+ /* particles should not collide with emitter at birth */
+ if(pa->time < cfra && pa->time >= psys->cfra)
+ continue;
+ }
+ else
+ dm=0;
+
+ VECCOPY(co1,def_loc);
+ VECCOPY(co2,state->co);
+
+ if(ec->vert_cos==0){
+ /* convert particle coordinates to object coordinates */
+ Mat4Invert(imat,ob->obmat);
+
+ Mat4MulVecfl(imat,co1);
+ Mat4MulVecfl(imat,co2);
+ }
+
+ INIT_MINMAX(pa_minmax,pa_minmax+3);
+ DO_MINMAX(co1,pa_minmax,pa_minmax+3);
+ DO_MINMAX(co2,pa_minmax,pa_minmax+3);
+ if(part->flag&PART_SIZE_DEFL){
+ pa_minmax[0]-=pa->size;
+ pa_minmax[1]-=pa->size;
+ pa_minmax[2]-=pa->size;
+ pa_minmax[3]+=pa->size;
+ pa_minmax[4]+=pa->size;
+ pa_minmax[5]+=pa->size;
+
+ radius=pa->size;
+ }
+
+ if(ec->face_minmax==0 || AabbIntersectAabb(pa_minmax,pa_minmax+3,ec->ob_minmax,ec->ob_minmax+3))
+ if(psys_intersect_dm(ob,dm,ec->vert_cos,co1,co2,&min_d,&min_face,min_w,
+ ec->face_minmax,pa_minmax,radius,ipoint)){
+ min_ob=ob;
+ if(ec->vert_cos)
+ global=1;
+ else
+ global=0;
+ }
+ }
+ }
+
+ /* 2. */
+ if(min_ob){
+ BLI_srandom((int)cfra+p);
+ ob=min_ob;
+
+ if(ob==pob){
+ dm=psmd->dm;
+ }
+ else{
+ psys_disable_all(ob);
+
+ dm=mesh_get_derived_final(ob,0);
+
+ psys_enable_all(ob);
+ }
+
+ mface=dm->getFaceDataArray(dm,CD_MFACE);
+ mface+=min_face;
+ mvert=dm->getVertDataArray(dm,CD_MVERT);
+
+
+ /* permeability check */
+ if(BLI_frand()<ob->pd->pdef_perm)
+ through=1;
+ else
+ through=0;
+
+ if(through==0 && (part->flag & PART_DIE_ON_COL || ob->pd->flag & PDEFLE_KILL_PART)){
+ pa->dietime = cfra-(1.0f-min_d)*dfra;
+ VecLerpf(def_loc,co1,co2,min_d);
+
+ if(global==0)
+ Mat4MulVecfl(ob->obmat,def_loc);
+
+ VECCOPY(state->co,def_loc);
+ VecLerpf(state->vel,pa->state.vel,state->vel,min_d);
+ QuatInterpol(state->rot,pa->state.rot,state->rot,min_d);
+ VecLerpf(state->ave,pa->state.ave,state->ave,min_d);
+
+ *pa_die=1;
+
+ /* particle is dead so we don't need to calculate further */
+ deflections=10;
+
+ /* store for reactors */
+ copy_particle_key(&cstate,state,0);
+
+ if(part->flag & PART_STICKY){
+ pa->stick_ob=ob;
+ pa->flag |= PARS_STICKY;
+ //stick_particle_to_object(ob,pa,state);
+ }
+ }
+ else{
+ VecLerpf(def_loc,co1,co2,min_d);
+
+ if(radius>0.0f){
+ VECSUB(unit_nor,def_loc,ipoint);
+ }
+ else{
+ /* get deflection point & normal */
+ psys_interpolate_face(mvert,mface,0,min_w,ipoint,unit_nor,0,0);
+ if(global){
+ Mat4Mul3Vecfl(ob->obmat,unit_nor);
+ Mat4MulVecfl(ob->obmat,ipoint);
+ }
+ }
+
+ Normalize(unit_nor);
+
+ VECSUB(dvec,co1,co2);
+ /* scale to remaining length after deflection */
+ VecMulf(dvec,1.0f-min_d);
+
+ /* flip normal to face particle */
+ if(Inpf(unit_nor,dvec)<0.0f)
+ VecMulf(unit_nor,-1.0f);
+
+ /* store for easy velocity calculation */
+ o_len=VecLength(dvec);
+
+ /* project particle movement to normal & create tangent */
+ dotprod=Inpf(dvec,unit_nor);
+ VECCOPY(def_nor,unit_nor);
+ VecMulf(def_nor,dotprod);
+ VECSUB(def_tan,def_nor,dvec);
+
+ damp=ob->pd->pdef_damp+ob->pd->pdef_rdamp*2*(BLI_frand()-0.5f);
+
+ /* create location after deflection */
+ VECCOPY(dvec,def_nor);
+ damp=ob->pd->pdef_damp+ob->pd->pdef_rdamp*2*(BLI_frand()-0.5f);
+ CLAMP(damp,0.0,1.0);
+ VecMulf(dvec,1.0f-damp);
+ if(through)
+ VecMulf(dvec,-1.0);
+
+ frict=ob->pd->pdef_frict+ob->pd->pdef_rfrict*2.0f*(BLI_frand()-0.5f);
+ CLAMP(frict,0.0,1.0);
+ VECADDFAC(dvec,dvec,def_tan,1.0f-frict);
+
+ /* store for easy velocity calculation */
+ d_len=VecLength(dvec);
+
+ /* just to be sure we don't hit the current face again */
+ if(through){
+ VECADDFAC(ipoint,ipoint,unit_nor,-0.0001f);
+ VECADDFAC(def_loc,def_loc,unit_nor,-0.0001f);
+
+ if(part->flag & PART_ROT_DYN){
+ VECADDFAC(def_tan,def_tan,unit_nor,-0.0001f);
+ VECADDFAC(def_nor,def_nor,unit_nor,-0.0001f);
+ }
+ }
+ else{
+ VECADDFAC(ipoint,ipoint,unit_nor,0.0001f);
+ VECADDFAC(def_loc,def_loc,unit_nor,0.0001f);
+
+ if(part->flag & PART_ROT_DYN){
+ VECADDFAC(def_tan,def_tan,unit_nor,0.0001f);
+ VECADDFAC(def_nor,def_nor,unit_nor,0.0001f);
+ }
+ }
+
+ /* lets get back to global space */
+ if(global==0){
+ Mat4Mul3Vecfl(ob->obmat,dvec);
+ Mat4MulVecfl(ob->obmat,ipoint);
+ Mat4MulVecfl(ob->obmat,def_loc);/* def_loc remains as intersection point for next iteration */
+ }
+
+ /* store for reactors */
+ VECCOPY(cstate.co,ipoint);
+ VecLerpf(cstate.vel,pa->state.vel,state->vel,min_d);
+ QuatInterpol(cstate.rot,pa->state.rot,state->rot,min_d);
+
+ /* slightly unphysical but looks nice enough */
+ if(part->flag & PART_ROT_DYN){
+ if(global==0){
+ Mat4Mul3Vecfl(ob->obmat,def_nor);
+ Mat4Mul3Vecfl(ob->obmat,def_tan);
+ }
+
+ Normalize(def_tan);
+ Normalize(def_nor);
+ VECCOPY(unit_nor,def_nor);
+
+ /* create normal velocity */
+ VecMulf(def_nor,Inpf(pa->state.vel,def_nor));
+
+ /* create tangential velocity */
+ VecMulf(def_tan,Inpf(pa->state.vel,def_tan));
+
+ /* angular velocity change due to tangential velocity */
+ Crossf(dave,unit_nor,def_tan);
+ VecMulf(dave,1.0f/pa->size);
+
+ /* linear velocity change due to angular velocity */
+ VecMulf(unit_nor,pa->size); /* point of impact from particle center */
+ Crossf(dvel,pa->state.ave,unit_nor);
+
+ if(through)
+ VecMulf(def_nor,-1.0);
+
+ VecMulf(def_nor,1.0f-damp);
+ VECSUB(dvel,dvel,def_nor);
+
+ VecMulf(dvel,1.0f-frict);
+ VecMulf(dave,1.0f-frict);
+ }
+
+ if(d_len<0.001 && VecLength(pa->state.vel)<0.001){
+ /* kill speed to stop slipping */
+ VECCOPY(state->vel,zerovec);
+ VECCOPY(state->co,def_loc);
+ if(part->flag & PART_ROT_DYN)
+ VECCOPY(state->ave,zerovec);
+ deflections=10;
+ }
+ else{
+
+ /* apply new coordinates */
+ VECADD(state->co,def_loc,dvec);
+
+ Normalize(dvec);
+
+ /* we have to use original velocity because otherwise we get slipping */
+ /* when forces like gravity balance out damping & friction */
+ VecMulf(dvec,VecLength(pa->state.vel)*(d_len/o_len));
+ VECCOPY(state->vel,dvec);
+
+ if(part->flag & PART_ROT_DYN){
+ VECADD(state->vel,state->vel,dvel);
+ VecMulf(state->vel,0.5);
+ VECADD(state->ave,state->ave,dave);
+ VecMulf(state->ave,0.5);
+ }
+ }
+ }
+ deflections++;
+
+ cstate.time=cfra-(1.0f-min_d)*dfra;
+ //particle_react_to_collision(min_ob,pob,psys,pa,p,&cstate);
+ push_reaction(pob,psys,p,PART_EVENT_COLLIDE,&cstate);
+ }
+ else
+ return;
+ }
+}
+/************************************************/
+/* Boid physics */
+/************************************************/
+static int boid_see_mesh(ListBase *lb, Object *pob, ParticleSystem *psys, float *vec1, float *vec2, float *loc, float *nor, float cfra)
+{
+ Object *ob, *min_ob;
+ DerivedMesh *dm;
+ MFace *mface;
+ MVert *mvert;
+ ParticleEffectorCache *ec;
+ ParticleSystemModifierData *psmd=psys_get_modifier(pob,psys);
+ float imat[4][4];
+ float co1[3], co2[3], min_w[4], min_d;
+ int min_face=0, intersect=0;
+
+ if(lb->first){
+ intersect=0;
+ min_d=20000.0;
+ min_ob=NULL;
+ for(ec=lb->first; ec; ec=ec->next){
+ if(ec->type & PSYS_EC_DEFLECT){
+ ob= ec->ob;
+
+ if(psys->part->type!=PART_HAIR)
+ where_is_object_time(ob,cfra);
+
+ if(ob==pob)
+ dm=psmd->dm;
+ else
+ dm=0;
+
+ VECCOPY(co1,vec1);
+ VECCOPY(co2,vec2);
+
+ if(ec->vert_cos==0){
+ /* convert particle coordinates to object coordinates */
+ Mat4Invert(imat,ob->obmat);
+
+ Mat4MulVecfl(imat,co1);
+ Mat4MulVecfl(imat,co2);
+ }
+
+ if(psys_intersect_dm(ob,dm,ec->vert_cos,co1,co2,&min_d,&min_face,min_w,ec->face_minmax,0,0,0))
+ min_ob=ob;
+ }
+ }
+ if(min_ob){
+ ob=min_ob;
+
+ if(ob==pob){
+ dm=psmd->dm;
+ }
+ else{
+ psys_disable_all(ob);
+
+ dm=mesh_get_derived_deform(ob,0);
+
+ psys_enable_all(ob);
+ }
+
+ mface=dm->getFaceDataArray(dm,CD_MFACE);
+ mface+=min_face;
+ mvert=dm->getVertDataArray(dm,CD_MVERT);
+
+ /* get deflection point & normal */
+ psys_interpolate_face(mvert,mface,0,min_w,loc,nor,0,0);
+
+ VECADD(nor,nor,loc);
+ Mat4MulVecfl(ob->obmat,loc);
+ Mat4MulVecfl(ob->obmat,nor);
+ VECSUB(nor,nor,loc);
+ return 1;
+ }
+ }
+ return 0;
+}
+/* vector calculus functions in 2d vs. 3d */
+static void set_boid_vec_func(BoidVecFunc *bvf, int is_2d)
+{
+ if(is_2d){
+ bvf->Addf = Vec2Addf;
+ bvf->Subf = Vec2Subf;
+ bvf->Mulf = Vec2Mulf;
+ bvf->Length = Vec2Length;
+ bvf->Normalize = Normalize2;
+ bvf->Inpf = Inp2f;
+ bvf->Copyf = Vec2Copyf;
+ }
+ else{
+ bvf->Addf = VecAddf;
+ bvf->Subf = VecSubf;
+ bvf->Mulf = VecMulf;
+ bvf->Length = VecLength;
+ bvf->Normalize = Normalize;
+ bvf->Inpf = Inpf;
+ bvf->Copyf = VecCopyf;
+ }
+}
+/* boids have limited processing capability so once there's too much information (acceleration) no more is processed */
+static int add_boid_acc(BoidVecFunc *bvf, float lat_max, float tan_max, float *lat_accu, float *tan_accu, float *acc, float *dvec, float *vel)
+{
+ static float tangent[3];
+ static float tan_length;
+
+ if(vel){
+ bvf->Copyf(tangent,vel);
+ tan_length=bvf->Normalize(tangent);
+ return 1;
+ }
+ else{
+ float cur_tan, cur_lat;
+ float tan_acc[3], lat_acc[3];
+ int ret=0;
+
+ bvf->Copyf(tan_acc,tangent);
+
+ if(tan_length>0.0){
+ bvf->Mulf(tan_acc,Inpf(tangent,dvec));
+
+ bvf->Subf(lat_acc,dvec,tan_acc);
+ }
+ else{
+ bvf->Copyf(tan_acc,dvec);
+ lat_acc[0]=lat_acc[1]=lat_acc[2]=0.0f;
+ *lat_accu=lat_max;
+ }
+
+ cur_tan=bvf->Length(tan_acc);
+ cur_lat=bvf->Length(lat_acc);
+
+ /* add tangential acceleration */
+ if(*lat_accu+cur_lat<=lat_max){
+ bvf->Addf(acc,acc,lat_acc);
+ *lat_accu+=cur_lat;
+ ret=1;
+ }
+ else{
+ bvf->Mulf(lat_acc,(lat_max-*lat_accu)/cur_lat);
+ bvf->Addf(acc,acc,lat_acc);
+ *lat_accu=lat_max;
+ }
+
+ /* add lateral acceleration */
+ if(*tan_accu+cur_tan<=tan_max){
+ bvf->Addf(acc,acc,tan_acc);
+ *tan_accu+=cur_tan;
+ ret=1;
+ }
+ else{
+ bvf->Mulf(tan_acc,(tan_max-*tan_accu)/cur_tan);
+ bvf->Addf(acc,acc,tan_acc);
+ *tan_accu=tan_max;
+ }
+
+ return ret;
+ }
+}
+/* determines the acceleration that the boid tries to acchieve */
+static void boid_brain(BoidVecFunc *bvf, ParticleData *pa, Object *ob, ParticleSystem *psys, ParticleSettings *part, KDTree *tree, float timestep, float cfra, float *acc, int *pa_die)
+{
+ ParticleData *pars=psys->particles;
+ KDTreeNearest ptn[MAX_BOIDNEIGHBOURS+1];
+ ParticleEffectorCache *ec=0;
+ float dvec[3]={0.0,0.0,0.0}, ob_co[3], ob_nor[3];
+ float avoid[3]={0.0,0.0,0.0}, velocity[3]={0.0,0.0,0.0}, center[3]={0.0,0.0,0.0};
+ float cubedist[MAX_BOIDNEIGHBOURS+1];
+ int i, n, neighbours=0, near, not_finished=1;
+
+ float cur_vel;
+ float lat_accu=0.0f, max_lat_acc=part->max_vel*part->max_lat_acc;
+ float tan_accu=0.0f, max_tan_acc=part->max_vel*part->max_tan_acc;
+ float avg_vel=part->average_vel*part->max_vel;
+
+ acc[0]=acc[1]=acc[2]=0.0f;
+ /* the +1 neighbour is because boid itself is in the tree */
+ neighbours=BLI_kdtree_find_n_nearest(tree,part->boidneighbours+1,pa->state.co,NULL,ptn);
+
+ for(n=1; n<neighbours; n++){
+ cubedist[n]=(float)pow((double)(ptn[n].dist/pa->size),3.0);
+ cubedist[n]=1.0f/MAX2(cubedist[n],1.0f);
+ }
+
+ /* initialize tangent */
+ add_boid_acc(bvf,0.0,0.0,0,0,0,0,pa->state.vel);
+
+ for(i=0; i<BOID_TOT_RULES && not_finished; i++){
+ switch(part->boidrule[i]){
+ case BOID_COLLIDE:
+ /* collision avoidance */
+ bvf->Copyf(dvec,pa->state.vel);
+ bvf->Mulf(dvec,5.0f);
+ bvf->Addf(dvec,dvec,pa->state.co);
+ if(boid_see_mesh(&psys->effectors,ob,psys,pa->state.co,dvec,ob_co,ob_nor,cfra)){
+ float probelen = bvf->Length(dvec);
+ float proj;
+ float oblen;
+
+ Normalize(ob_nor);
+ proj = bvf->Inpf(ob_nor,pa->state.vel);
+
+ bvf->Subf(dvec,pa->state.co,ob_co);
+ oblen=bvf->Length(dvec);
+
+ bvf->Copyf(dvec,ob_nor);
+ bvf->Mulf(dvec,-proj);
+ bvf->Mulf(dvec,((probelen/oblen)-1.0f)*100.0f*part->boidfac[BOID_COLLIDE]);
+
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ break;
+ case BOID_AVOID:
+ /* predator avoidance */
+ if(psys->effectors.first){
+ for(ec=psys->effectors.first; ec; ec=ec->next){
+ if(ec->type & PSYS_EC_EFFECTOR){
+ Object *eob = ec->ob;
+ PartDeflect *pd = eob->pd;
+
+ if(pd->forcefield==PFIELD_FORCE && pd->f_strength<0.0){
+ float distance;
+ VECSUB(dvec,eob->obmat[3],pa->state.co);
+
+ distance=Normalize(dvec);
+
+ if(part->flag & PART_DIE_ON_COL && distance < pd->mindist){
+ *pa_die=1;
+ pa->dietime=cfra;
+ i=BOID_TOT_RULES;
+ break;
+ }
+
+ if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
+ ;
+ else{
+ bvf->Mulf(dvec,part->boidfac[BOID_AVOID]*pd->f_strength/(float)pow((double)distance,(double)pd->f_power));
+
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ }
+ }
+ else if(ec->type & PSYS_EC_PARTICLE){
+ Object *eob = ec->ob;
+ ParticleSystem *epsys;
+ ParticleSettings *epart;
+ ParticleKey state;
+ PartDeflect *pd;
+ KDTreeNearest ptn2[MAX_BOIDNEIGHBOURS];
+ int totepart, p, count;
+ float distance;
+ epsys= BLI_findlink(&eob->particlesystem,ec->psys_nbr);
+ epart= epsys->part;
+ pd= epart->pd;
+ totepart= epsys->totpart;
+
+ if(pd->forcefield==PFIELD_FORCE && pd->f_strength<0.0){
+ count=BLI_kdtree_find_n_nearest(ec->tree,epart->boidneighbours,pa->state.co,NULL,ptn2);
+ for(p=0; p<count; p++){
+ state.time=-1.0;
+ if(psys_get_particle_state(eob,epsys,ptn2[p].index,&state,0)){
+ VECSUB(dvec, state.co, pa->state.co);
+
+ distance = Normalize(dvec);
+
+ if(part->flag & PART_DIE_ON_COL && distance < (epsys->particles+ptn2[p].index)->size){
+ *pa_die=1;
+ pa->dietime=cfra;
+ i=BOID_TOT_RULES;
+ break;
+ }
+
+ if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
+ ;
+ else{
+ bvf->Mulf(dvec,part->boidfac[BOID_AVOID]*pd->f_strength/(float)pow((double)distance,(double)pd->f_power));
+
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
+ case BOID_CROWD:
+ /* crowd avoidance */
+ near=0;
+ for(n=1; n<neighbours; n++){
+ if(ptn[n].dist<2.0f*pa->size){
+ bvf->Subf(dvec,pa->state.co,pars[ptn[n].index].state.co);
+ bvf->Mulf(dvec,(2.0f*pa->size-ptn[n].dist)/ptn[n].dist);
+ bvf->Addf(avoid,avoid,dvec);
+ near++;
+ }
+ /* ptn[] is distance ordered so no need to check others */
+ else break;
+ }
+ if(near){
+ bvf->Mulf(avoid,part->boidfac[BOID_CROWD]*2.0f/timestep);
+
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,avoid,0);
+ }
+ break;
+ case BOID_CENTER:
+ /* flock centering */
+ if(neighbours>1){
+ for(n=1; n<neighbours; n++){
+ bvf->Addf(center,center,pars[ptn[n].index].state.co);
+ }
+ bvf->Mulf(center,1.0f/((float)neighbours-1.0f));
+
+ bvf->Subf(dvec,center,pa->state.co);
+
+ bvf->Mulf(dvec,part->boidfac[BOID_CENTER]*2.0f);
+
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ break;
+ case BOID_AV_VEL:
+ /* average velocity */
+ cur_vel=bvf->Length(pa->state.vel);
+ if(cur_vel>0.0){
+ bvf->Copyf(dvec,pa->state.vel);
+ bvf->Mulf(dvec,part->boidfac[BOID_AV_VEL]*(avg_vel-cur_vel)/cur_vel);
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ break;
+ case BOID_VEL_MATCH:
+ /* velocity matching */
+ if(neighbours>1){
+ for(n=1; n<neighbours; n++){
+ bvf->Copyf(dvec,pars[ptn[n].index].state.vel);
+ bvf->Mulf(dvec,cubedist[n]);
+ bvf->Addf(velocity,velocity,dvec);
+ }
+ bvf->Mulf(velocity,1.0f/((float)neighbours-1.0f));
+
+ bvf->Subf(dvec,velocity,pa->state.vel);
+
+ bvf->Mulf(dvec,part->boidfac[BOID_VEL_MATCH]);
+
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ break;
+ case BOID_GOAL:
+ /* goal seeking */
+ if(psys->effectors.first){
+ for(ec=psys->effectors.first; ec; ec=ec->next){
+ if(ec->type & PSYS_EC_EFFECTOR){
+ Object *eob = ec->ob;
+ PartDeflect *pd = eob->pd;
+ float temp[4];
+
+ if(pd->forcefield==PFIELD_FORCE && pd->f_strength>0.0){
+ float distance;
+ VECSUB(dvec,eob->obmat[3],pa->state.co);
+
+ distance=Normalize(dvec);
+
+ if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
+ ;
+ else{
+ VecMulf(dvec,pd->f_strength*part->boidfac[BOID_GOAL]/(float)pow((double)distance,(double)pd->f_power));
+
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ }
+ else if(pd->forcefield==PFIELD_GUIDE){
+ float distance;
+
+ where_on_path(eob, (cfra-pa->time)/pa->lifetime, temp, dvec);
+
+ VECSUB(dvec,temp,pa->state.co);
+
+ distance=Normalize(dvec);
+
+ if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
+ ;
+ else{
+ VecMulf(dvec,pd->f_strength*part->boidfac[BOID_GOAL]/(float)pow((double)distance,(double)pd->f_power));
+
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ }
+ }
+ else if(ec->type & PSYS_EC_PARTICLE){
+ Object *eob = ec->ob;
+ ParticleSystem *epsys;
+ ParticleSettings *epart;
+ ParticleKey state;
+ PartDeflect *pd;
+ KDTreeNearest ptn2[MAX_BOIDNEIGHBOURS];
+ int totepart, p, count;
+ float distance;
+ epsys= BLI_findlink(&eob->particlesystem,ec->psys_nbr);
+ epart= epsys->part;
+ pd= epart->pd;
+ totepart= epsys->totpart;
+
+ if(pd->forcefield==PFIELD_FORCE && pd->f_strength>0.0){
+ count=BLI_kdtree_find_n_nearest(ec->tree,epart->boidneighbours,pa->state.co,NULL,ptn2);
+ for(p=0; p<count; p++){
+ state.time=-1.0;
+ if(psys_get_particle_state(eob,epsys,ptn2[p].index,&state,0)){
+ VECSUB(dvec, state.co, pa->state.co);
+
+ distance = Normalize(dvec);
+
+ if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
+ ;
+ else{
+ bvf->Mulf(dvec,part->boidfac[BOID_AVOID]*pd->f_strength/(float)pow((double)distance,(double)pd->f_power));
+
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ break;
+ case BOID_LEVEL:
+ /* level flight */
+ if((part->flag & PART_BOIDS_2D)==0){
+ dvec[0]=dvec[1]=0.0;
+ dvec[2]=-pa->state.vel[2];
+
+ VecMulf(dvec,part->boidfac[BOID_LEVEL]);
+ not_finished=add_boid_acc(bvf,max_lat_acc,max_tan_acc,&lat_accu,&tan_accu,acc,dvec,0);
+ }
+ break;
+ }
+ }
+}
+/* tries to realize the wanted acceleration */
+static void boid_body(BoidVecFunc *bvf, ParticleData *pa, ParticleSystem *psys, ParticleSettings *part, float timestep, float *acc, ParticleKey *state)
+{
+ float dvec[3], bvec[3], length, max_vel=part->max_vel;
+ float *q2, q[4];
+ float g=9.81f, pa_mass=part->mass;
+ float yvec[3]={0.0,1.0,0.0}, zvec[3]={0.0,0.0,-1.0}, bank;
+
+ /* apply new velocity, location & rotation */
+ copy_particle_key(state,&pa->state,0);
+
+ if(part->flag & PART_SIZEMASS)
+ pa_mass*=pa->size;
+
+ /* by regarding the acceleration as a force at this stage we*/
+ /* can get better controll allthough it's a bit unphysical */
+ bvf->Mulf(acc,1.0f/pa_mass);
+
+ bvf->Copyf(dvec,acc);
+ bvf->Mulf(dvec,timestep*timestep*0.5f);
+
+ bvf->Copyf(bvec,state->vel);
+ bvf->Mulf(bvec,timestep);
+ bvf->Addf(dvec,dvec,bvec);
+ bvf->Addf(state->co,state->co,dvec);
+
+ /* air speed from wind effectors */
+ if(psys->effectors.first){
+ ParticleEffectorCache *ec;
+ for(ec=psys->effectors.first; ec; ec=ec->next){
+ if(ec->type & PSYS_EC_EFFECTOR){
+ Object *eob = ec->ob;
+ PartDeflect *pd = eob->pd;
+
+ if(pd->forcefield==PFIELD_WIND && pd->f_strength!=0.0){
+ float distance, wind[3];
+ VecCopyf(wind,eob->obmat[2]);
+ distance=VecLenf(state->co,eob->obmat[3]);
+
+ if (distance < 0.001) distance = 0.001f;
+
+ if(pd->flag&PFIELD_USEMAX && distance > pd->maxdist)
+ ;
+ else{
+ Normalize(wind);
+ VecMulf(wind,pd->f_strength/(float)pow((double)distance,(double)pd->f_power));
+ bvf->Addf(state->co,state->co,wind);
+ }
+ }
+ }
+ }
+ }
+
+
+ if((part->flag & PART_BOIDS_2D)==0 && pa->state.vel[0]!=0.0 && pa->state.vel[0]!=0.0 && pa->state.vel[0]!=0.0){
+ Crossf(yvec,state->vel,zvec);
+
+ Normalize(yvec);
+
+ bank=Inpf(yvec,acc);
+
+ bank=-(float)atan((double)(bank/g));
+
+ bank*=part->banking;
+
+ bank-=pa->bank;
+ if(bank>M_PI*part->max_bank){
+ bank=pa->bank+(float)M_PI*part->max_bank;
+ }
+ else if(bank<-M_PI*part->max_bank){
+ bank=pa->bank-(float)M_PI*part->max_bank;
+ }
+ else
+ bank+=pa->bank;
+
+ pa->bank=bank;
+ }
+ else{
+ bank=0.0;
+ }
+
+
+ VecRotToQuat(state->vel,bank,q);
+
+ VECCOPY(dvec,state->vel);
+ VecMulf(dvec,-1.0f);
+ q2= vectoquat(dvec, OB_POSX, OB_POSZ);
+
+ QuatMul(state->rot,q,q2);
+
+ bvf->Mulf(acc,timestep);
+ bvf->Addf(state->vel,state->vel,acc);
+
+ if(part->flag & PART_BOIDS_2D){
+ state->vel[2]=0.0;
+ state->co[2]=part->groundz;
+
+ if(psys->keyed_ob){
+ Object *zob=psys->keyed_ob;
+ int min_face;
+ float co1[3],co2[3],min_d=2.0,min_w[4],imat[4][4];
+ VECCOPY(co1,state->co);
+ VECCOPY(co2,state->co);
+
+ co1[2]=1000.0f;
+ co2[2]=-1000.0f;
+
+ Mat4Invert(imat,zob->obmat);
+ Mat4MulVecfl(imat,co1);
+ Mat4MulVecfl(imat,co2);
+
+ if(psys_intersect_dm(zob,0,0,co1,co2,&min_d,&min_face,min_w,0,0,0,0)){
+ DerivedMesh *dm;
+ MFace *mface;
+ MVert *mvert;
+ float loc[3],nor[3],q1[4];
+
+ psys_disable_all(zob);
+ dm=mesh_get_derived_final(zob,0);
+ psys_enable_all(zob);
+
+ mface=dm->getFaceDataArray(dm,CD_MFACE);
+ mface+=min_face;
+ mvert=dm->getVertDataArray(dm,CD_MVERT);
+
+ /* get deflection point & normal */
+ psys_interpolate_face(mvert,mface,0,min_w,loc,nor,0,0);
+
+ Mat4MulVecfl(zob->obmat,loc);
+ Mat4Mul3Vecfl(zob->obmat,nor);
+
+ Normalize(nor);
+
+ VECCOPY(state->co,loc);
+
+ zvec[2]=1.0;
+
+ Crossf(loc,zvec,nor);
+
+ bank=VecLength(loc);
+ if(bank>0.0){
+ bank=saasin(bank);
+
+ VecRotToQuat(loc,bank,q);
+
+ QUATCOPY(q1,state->rot);
+
+ QuatMul(state->rot,q,q1);
+ }
+ }
+ }
+ }
+
+ length=bvf->Length(state->vel);
+ if(length > max_vel)
+ bvf->Mulf(state->vel,max_vel/length);
+}
+/************************************************/
+/* Hair */
+/************************************************/
+void save_hair(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra){
+ ParticleData *pa;
+ HairKey *key;
+ int totpart;
+ int i;
+
+ Mat4Invert(ob->imat,ob->obmat);
+
+ psys->lattice=psys_get_lattice(ob,psys);
+
+ if(psys->totpart==0) return;
+
+ totpart=psys->totpart;
+
+ /* save new keys for elements if needed */
+ for(i=0,pa=psys->particles; i<totpart; i++,pa++) {
+ /* first time alloc */
+ if(pa->totkey==0 || pa->hair==NULL) {
+ pa->hair = MEM_callocN((psys->part->hair_step + 1) * sizeof(HairKey), "HairKeys");
+ pa->totkey = 0;
+ }
+
+ key = pa->hair + pa->totkey;
+
+ /* convert from global to geometry space */
+ VecCopyf(key->co, pa->state.co);
+ Mat4MulVecfl(ob->imat, key->co);
+
+ if(pa->totkey) {
+ VECSUB(key->co, key->co, pa->hair->co);
+ psys_vec_rot_to_face(psmd->dm, pa, key->co);
+ }
+
+ key->time = pa->state.time;
+
+ key->weight = 1.0f - key->time / 100.0f;
+
+ pa->totkey++;
+
+ /* root is always in the origin of hair space so we set it to be so after the last key is saved*/
+ if(pa->totkey == psys->part->hair_step + 1)
+ pa->hair->co[0] = pa->hair->co[1] = pa->hair->co[2] = 0.0f;
+ }
+}
+/************************************************/
+/* System Core */
+/************************************************/
+/* unbaked particles are calculated dynamically */
+static void dynamics_step(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra,
+ float *vg_vel, float *vg_tan, float *vg_rot, float *vg_size)
+{
+ ParticleData *pa;
+ ParticleKey *outstate, *key;
+ ParticleSettings *part=psys->part;
+ KDTree *tree=0;
+ BoidVecFunc bvf;
+ IpoCurve *icu_esize=find_ipocurve(part->ipo,PART_EMIT_SIZE);
+ Material *ma=give_current_material(ob,part->omat);
+ float timestep;
+ int p, totpart, pa_die;
+ /* current time */
+ float ctime, ipotime;
+ /* frame & time changes */
+ float dfra, dtime, pa_dtime, pa_dfra=0.0;
+ float birthtime, dietime;
+
+ /* where have we gone in time since last time */
+ dfra= cfra - psys->cfra;
+
+ totpart=psys->totpart;
+
+ timestep=psys_get_timestep(part);
+ dtime= dfra*timestep;
+ ctime= cfra*timestep;
+ ipotime= cfra;
+
+ if(part->flag&PART_ABS_TIME && part->ipo){
+ calc_ipo(part->ipo, cfra);
+ execute_ipo((ID *)part, part->ipo);
+ }
+
+ if(dfra<0.0){
+ float *vg_size=0;
+ if(part->type==PART_REACTOR)
+ vg_size=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_SIZE);
+
+ for(p=0, pa=psys->particles; p<totpart; p++,pa++){
+ if(pa->flag & (PARS_NO_DISP+PARS_UNEXIST)) continue;
+
+ /* set correct ipo timing */
+ if((part->flag&PART_ABS_TIME)==0 && part->ipo){
+ ipotime=100.0f*(cfra-pa->time)/pa->lifetime;
+ calc_ipo(part->ipo, ipotime);
+ execute_ipo((ID *)part, part->ipo);
+ }
+ pa->size=psys_get_size(ob,ma,psmd,icu_esize,psys,part,pa,vg_size);
+
+ if(part->type==PART_REACTOR)
+ initialize_particle(pa,p,ob,psys,psmd);
+
+ reset_particle(pa,psys,psmd,ob,dtime,cfra,vg_vel,vg_tan,vg_rot);
+
+ if(cfra>pa->time && part->flag & PART_LOOP && (part->flag & PART_LOOP_INSTANT)==0){
+ pa->loop=(short)((cfra-pa->time)/pa->lifetime)+1;
+ pa->alive=PARS_UNBORN;
+ }
+ else{
+ pa->loop=0;
+ if(cfra<=pa->time)
+ pa->alive=PARS_UNBORN;
+ /* without dynamics the state is allways known so no need to kill */
+ else if(ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED)==0)
+ pa->alive=PARS_KILLED;
+ }
+ }
+
+ if(vg_size)
+ MEM_freeN(vg_size);
+
+ //if(part->phystype==PART_PHYS_SOLID)
+ // reset_to_first_fragment(psys);
+ }
+ else{
+ BLI_srandom(31415926 + (int)cfra + psys->seed);
+
+ /* outstate is used so that particles are updated in parallel */
+ outstate=MEM_callocN(totpart*sizeof(ParticleKey),"Particle Outstates");
+
+ /* update effectors */
+ if(psys->effectors.first)
+ psys_end_effectors(psys);
+
+ psys_init_effectors(ob,part->eff_group,psys);
+
+ if(psys->effectors.first)
+ precalc_effectors(ob,psys,psmd);
+
+ if(part->phystype==PART_PHYS_BOIDS){
+ /* create particle tree for fast inter-particle comparisons */
+ KDTree *tree=BLI_kdtree_new(totpart);
+ for(p=0, pa=psys->particles; p<totpart; p++,pa++){
+ if(pa->flag & (PARS_NO_DISP+PARS_UNEXIST) || pa->alive!=PARS_ALIVE)
+ continue;
+
+ BLI_kdtree_insert(tree, p, pa->state.co, NULL);
+ }
+ BLI_kdtree_balance(tree);
+ set_boid_vec_func(&bvf,part->flag&PART_BOIDS_2D);
+ }
+
+ /* main loop: calculate physics for all particles */
+ for(p=0, pa=psys->particles, key=outstate; p<totpart; p++,pa++,key++){
+ if(pa->flag & (PARS_NO_DISP|PARS_UNEXIST)) continue;
+
+ copy_particle_key(key,&pa->state,1);
+
+ /* set correct ipo timing */
+ if((part->flag&PART_ABS_TIME)==0 && part->ipo){
+ ipotime=100.0f*(cfra-pa->time)/pa->lifetime;
+ calc_ipo(part->ipo, ipotime);
+ execute_ipo((ID *)part, part->ipo);
+ }
+ pa->size=psys_get_size(ob,ma,psmd,icu_esize,psys,part,pa,vg_size);
+
+ pa_die=0;
+
+ if(pa->alive==PARS_UNBORN || pa->alive==PARS_KILLED || ELEM(part->phystype,PART_PHYS_NO,PART_PHYS_KEYED)){
+ /* allways reset particles to emitter before birth */
+ reset_particle(pa,psys,psmd,ob,dtime,cfra,vg_vel,vg_tan,vg_rot);
+ copy_particle_key(key,&pa->state,1);
+ }
+
+ if(dfra>0.0 || psys->recalc){
+
+ if(psys->reactevents.first && ELEM(pa->alive,PARS_DEAD,PARS_KILLED)==0)
+ react_to_events(psys,p);
+
+ pa_dfra= dfra;
+ pa_dtime= dtime;
+
+ if(pa->flag & PART_LOOP && pa->flag & PART_LOOP_INSTANT)
+ birthtime=pa->dietime;
+ else
+ birthtime=pa->time+pa->loop*pa->lifetime;
+
+ dietime=birthtime+pa->lifetime;
+
+ if(birthtime < cfra && birthtime >= psys->cfra){
+ /* particle is born some time between this and last step*/
+ pa->alive=PARS_ALIVE;
+ pa_dfra= cfra - birthtime;
+ pa_dtime= pa_dfra*timestep;
+ }
+ else if(dietime <= cfra && psys->cfra < dietime){
+ /* particle dies some time between this and last step */
+ pa_dfra= dietime - psys->cfra;
+ pa_dtime= pa_dfra*timestep;
+ pa_die=1;
+ }
+ else if(dietime < cfra){
+ /* TODO: figure out if there's something to be done when particle is dead */
+ }
+
+ copy_particle_key(key,&pa->state,1);
+
+ if(dfra>0.0 && pa->alive==PARS_ALIVE){
+ switch(part->phystype){
+ case PART_PHYS_NEWTON:
+ /* do global forces & effectors */
+ apply_particle_forces(p,pa,ob,psys,part,timestep,pa_dfra,cfra,key);
+
+ /* deflection */
+ deflect_particle(ob,psmd,psys,part,pa,p,pa_dfra,cfra,key,&pa_die);
+
+ /* rotations */
+ rotate_particle(part,pa,pa_dfra,timestep,key);
+
+ break;
+ case PART_PHYS_BOIDS:
+ {
+ float acc[3];
+ boid_brain(&bvf,pa,ob,psys,part,tree,timestep,cfra,acc,&pa_die);
+ if(pa_die==0)
+ boid_body(&bvf,pa,psys,part,timestep,acc,key);
+ break;
+ }
+ }
+
+ push_reaction(ob,psys,p,PART_EVENT_NEAR,key);
+
+ if(pa_die){
+ push_reaction(ob,psys,p,PART_EVENT_DEATH,key);
+
+ if(part->flag & PART_LOOP){
+ pa->loop++;
+
+ if(part->flag & PART_LOOP_INSTANT){
+ reset_particle(pa,psys,psmd,ob,0.0,cfra,vg_vel,vg_tan,vg_rot);
+ pa->alive=PARS_ALIVE;
+ copy_particle_key(key,&pa->state,1);
+ }
+ else
+ pa->alive=PARS_UNBORN;
+ }
+ else{
+ pa->alive=PARS_DEAD;
+ key->time=pa->dietime;
+
+ if(pa->flag&PARS_STICKY)
+ psys_key_to_object(pa->stick_ob,key,0);
+ }
+ }
+ else
+ key->time=cfra;
+ }
+ }
+ }
+ /* apply outstates to particles */
+ for(p=0, pa=psys->particles, key=outstate; p<totpart; p++,pa++,key++)
+ copy_particle_key(&pa->state,key,1);
+
+ MEM_freeN(outstate);
+ }
+ if(psys->reactevents.first)
+ BLI_freelistN(&psys->reactevents);
+
+ if(tree)
+ BLI_kdtree_free(tree);
+}
+
+/* check if path cache or children need updating and do it if needed */
+static void psys_update_path_cache(Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
+{
+ ParticleSettings *part=psys->part;
+ ParticleEditSettings *pset=&G.scene->toolsettings->particle;
+ int distr=0,alloc=0;
+
+ if((psys->part->childtype && psys->totchild != psys->totpart*part->child_nbr) || psys->recalc&PSYS_ALLOC)
+ alloc=1;
+
+ if(alloc || psys->recalc&PSYS_DISTR || (psys->vgroup[PSYS_VG_DENSITY] && (G.f & G_WEIGHTPAINT)))
+ distr=1;
+
+ if(distr){
+ if(alloc)
+ alloc_particles(psys,psys->totpart);
+
+ if(psys->totchild && part->childtype){
+ distribute_particles(ob,psys,PART_FROM_CHILD);
+
+ if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES && part->parents!=0.0)
+ psys_find_parents(ob,psmd,psys);
+ }
+ }
+
+ if((part->type==PART_HAIR || psys->flag&PSYS_KEYED) && (psys_in_edit_mode(psys)
+ || part->draw_as==PART_DRAW_PATH || part->draw&PART_DRAW_KEYS)){
+ psys_cache_paths(ob, psys, cfra, 0);
+
+ if(part->childtype){
+ if((G.rendering || (part->flag&PART_CHILD_RENDER)==0)
+ || (psys_in_edit_mode(psys) && (pset->flag&PE_SHOW_CHILD)))
+ psys_cache_child_paths(ob, psys, cfra, 0);
+ }
+ }
+ else if(psys->pathcache)
+ psys_free_path_cache(psys);
+}
+
+static void hair_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra)
+{
+ ParticleSettings *part = psys->part;
+
+ if(psys->recalc & PSYS_DISTR){
+ /* need this for changing subsurf levels */
+ psys_calc_dmfaces(ob, psmd->dm, psys);
+ }
+
+ if(psys->effectors.first)
+ psys_end_effectors(psys);
+
+ psys_init_effectors(ob,part->eff_group,psys);
+ if(psys->effectors.first)
+ precalc_effectors(ob,psys,psmd);
+
+ if(psys_in_edit_mode(psys))
+ PE_recalc_world_cos(ob, psys);
+
+ psys_update_path_cache(ob,psmd,psys,cfra);
+}
+
+/* updates cached particles' alive & other flags etc..*/
+static void cached_step(Object *ob, ParticleSystemModifierData *psmd, ParticleSystem *psys, float cfra, float *vg_size)
+{
+ ParticleSettings *part=psys->part;
+ ParticleData *pa;
+ ParticleKey state;
+ IpoCurve *icu_esize=find_ipocurve(part->ipo,PART_EMIT_SIZE);
+ Material *ma=give_current_material(ob,part->omat);
+ int p;
+ float ipotime=cfra, disp;
+
+ /* deprecated */
+ //if(psys->recalc&PSYS_DISTR){
+ // /* The dm could have been changed so particle emitter element */
+ // /* indices might be wrong. There's really no "nice" way to handle*/
+ // /* this so we just try not to crash by correcting indices. */
+ // int totnum=-1;
+ // switch(part->from){
+ // case PART_FROM_VERT:
+ // totnum=psmd->dm->getNumVerts(psmd->dm);
+ // break;
+ // case PART_FROM_FACE:
+ // case PART_FROM_VOLUME:
+ // totnum=psmd->dm->getNumFaces(psmd->dm);
+ // break;
+ // }
+
+ // if(totnum==0){
+ // /* Now we're in real trouble, there's no emitter elements!! */
+ // for(p=0, pa=psys->particles; p<psys->totpart; p++,pa++)
+ // pa->num=-1;
+ // }
+ // else if(totnum>0){
+ // for(p=0, pa=psys->particles; p<psys->totpart; p++,pa++)
+ // pa->num=pa->num%totnum;
+ // }
+ //}
+
+ if(psys->effectors.first)
+ psys_end_effectors(psys);
+
+ //if(part->flag & (PART_BAKED_GUIDES+PART_BAKED_DEATHS)){
+ psys_init_effectors(ob,part->eff_group,psys);
+ if(psys->effectors.first)
+ precalc_effectors(ob,psys,psmd);
+ //}
+
+ disp= (float)get_current_display_percentage(psys)/50.0f-1.0f;
+
+ for(p=0, pa=psys->particles; p<psys->totpart; p++,pa++){
+ if((part->flag&PART_ABS_TIME)==0 && part->ipo){
+ ipotime=100.0f*(cfra-pa->time)/pa->lifetime;
+ calc_ipo(part->ipo, ipotime);
+ execute_ipo((ID *)part, part->ipo);
+ }
+ pa->size= psys_get_size(ob,ma,psmd,icu_esize,psys,part,pa,vg_size);
+
+ psys->lattice=psys_get_lattice(ob,psys);
+
+ /* update alive status and push events */
+ if(pa->time>cfra)
+ pa->alive=PARS_UNBORN;
+ else if(pa->dietime<=cfra){
+ if(pa->dietime>psys->cfra){
+ state.time=pa->dietime;
+ psys_get_particle_state(ob,psys,p,&state,1);
+ push_reaction(ob,psys,p,PART_EVENT_DEATH,&state);
+ }
+ pa->alive=PARS_DEAD;
+ }
+ else{
+ pa->alive=PARS_ALIVE;
+ state.time=cfra;
+ psys_get_particle_state(ob,psys,p,&state,1);
+ state.time=cfra;
+ push_reaction(ob,psys,p,PART_EVENT_NEAR,&state);
+ }
+
+ if(psys->lattice){
+ end_latt_deform();
+ psys->lattice=0;
+ }
+
+ if(pa->r_rot[0] > disp)
+ pa->flag |= PARS_NO_DISP;
+ else
+ pa->flag &= ~PARS_NO_DISP;
+ }
+}
+/* Calculates the next state for all particles of the system */
+/* In particles code most fra-ending are frames, time-ending are fra*timestep (seconds)*/
+static void system_step(Object *ob, ParticleSystem *psys, ParticleSystemModifierData *psmd, float cfra)
+{
+ ParticleSettings *part;
+ ParticleData *pa;
+ int totpart,oldtotpart=0,p;
+ float disp, *vg_vel=0, *vg_tan=0, *vg_rot=0, *vg_size=0;
+ int init=0,distr=0,alloc=0;
+
+ /*----start validity checks----*/
+
+ part=psys->part;
+
+ if(part->flag&PART_ABS_TIME && part->ipo){
+ calc_ipo(part->ipo, cfra);
+ execute_ipo((ID *)part, part->ipo);
+ }
+
+ if(part->from!=PART_FROM_PARTICLE)
+ vg_size=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_SIZE);
+
+ if(part->type == PART_HAIR) {
+ if(psys->flag & PSYS_HAIR_DONE) {
+ hair_step(ob, psmd, psys, cfra);
+ psys->cfra = cfra;
+ psys->recalc = 0;
+ return;
+ }
+ }
+ else {
+ if(psys->recalc)
+ clear_particles_from_cache(ob,psys,(int)cfra);
+ else if(get_particles_from_cache(ob, psys, (int)cfra)){
+ cached_step(ob,psmd,psys,cfra,vg_size);
+ psys->cfra=cfra;
+ psys->recalc = 0;
+ return;
+ }
+ }
+
+ /* if still here react to events */
+
+ if(psys->recalc&PSYS_TYPE) {
+ /* system type has changed so set sensible defaults and clear non applicable flags */
+ if(part->from == PART_FROM_PARTICLE) {
+ if(part->type != PART_REACTOR)
+ part->from = PART_FROM_FACE;
+ if(part->distr == PART_DISTR_GRID)
+ part->distr = PART_DISTR_JIT;
+ }
+
+ if(psys->part->phystype != PART_PHYS_KEYED)
+ psys->flag &= ~PSYS_KEYED;
+
+ if(part->type == PART_HAIR) {
+ part->draw_as = PART_DRAW_PATH;
+ part->rotfrom = PART_ROT_IINCR;
+ }
+ else
+ free_hair(psys);
+
+ psys->recalc &= ~PSYS_TYPE;
+ alloc = 1;
+ }
+ else
+ oldtotpart = psys->totpart;
+
+ if(part->distr == PART_DISTR_GRID)
+ totpart = part->grid_res * part->grid_res * part->grid_res;
+ else
+ totpart = psys->part->totpart;
+
+ if(oldtotpart != totpart || psys->recalc&PSYS_ALLOC || (psys->part->childtype && psys->totchild != psys->totpart*part->child_nbr))
+ alloc = 1;
+
+ if(alloc || psys->recalc&PSYS_DISTR || (psys->vgroup[PSYS_VG_DENSITY] && (G.f & G_WEIGHTPAINT) && ob==OBACT))
+ distr = 1;
+
+ if(distr || psys->recalc&PSYS_INIT)
+ init = 1;
+
+ if(init) {
+ if(distr) {
+ if(alloc)
+ alloc_particles(psys, totpart);
+
+ distribute_particles(ob, psys, part->from);
+
+ if(psys->totchild && part->childtype)
+ distribute_particles(ob, psys, PART_FROM_CHILD);
+ }
+ initialize_all_particles(ob, psys, psmd);
+
+ if(alloc)
+ reset_all_particles(ob, psys, psmd, 0.0, cfra, oldtotpart);
+
+ /* flag for possible explode modifiers after this system */
+ psmd->flag |= eParticleSystemFlag_Pars;
+ }
+
+
+ if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED)
+ psys_count_keyed_targets(ob,psys);
+
+ if(part->from!=PART_FROM_PARTICLE){
+ vg_vel=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_VEL);
+ vg_tan=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_TAN);
+ vg_rot=psys_cache_vgroup(psmd->dm,psys,PSYS_VG_ROT);
+ }
+
+ /* set particles to be not calculated */
+ disp= (float)get_current_display_percentage(psys)/50.0f-1.0f;
+
+ if(disp<1.0f) for(p=0, pa=psys->particles; p<totpart; p++,pa++){
+ if(pa->r_rot[0] > disp)
+ pa->flag |= PARS_NO_DISP;
+ else
+ pa->flag &= ~PARS_NO_DISP;
+ }
+
+ /* ok now we're all set so let's go */
+ if(psys->totpart) {
+ //if(psys->part->from==PART_FROM_FACE) {
+ // psys_calc_dmfaces(ob, psmd->dm, psys);
+ //}
+ dynamics_step(ob,psys,psmd,cfra,vg_vel,vg_tan,vg_rot,vg_size);
+ }
+ psys->recalc = 0;
+ psys->cfra=cfra;
+
+ if(part->type!=PART_HAIR)
+ write_particles_to_cache(ob, psys, cfra);
+
+ /* for keyed particles the path is allways known so it can be drawn */
+ if(part->phystype==PART_PHYS_KEYED && psys->flag&PSYS_FIRST_KEYED){
+ set_keyed_keys(ob, psys);
+ psys_update_path_cache(ob,psmd,psys,(int)cfra);
+ }
+ else if(psys->pathcache)
+ psys_free_path_cache(psys);
+
+ if(vg_vel)
+ MEM_freeN(vg_vel);
+
+ if(psys->lattice){
+ end_latt_deform();
+ psys->lattice=0;
+ }
+}
+
+void psys_to_softbody(Object *ob, ParticleSystem *psys, int force_recalc)
+{
+ SoftBody *sb;
+ short softflag;
+
+ if((psys->softflag&OB_SB_ENABLE)==0) return;
+
+ if((ob->recalc&OB_RECALC_TIME)==0)
+ psys->softflag|=OB_SB_REDO;
+
+ /* let's replace the object's own softbody with the particle softbody */
+ /* a temporary solution before cloth simulation is implemented, jahka */
+
+ /* save these */
+ sb=ob->soft;
+ softflag=ob->softflag;
+
+ /* swich to new ones */
+ ob->soft=psys->soft;
+ ob->softflag=psys->softflag;
+
+ /* signal for before/free bake */
+ //if(psys->flag & PSYS_SOFT_BAKE || force_recalc){
+ // sbObjectToSoftbody(ob);
+ // psys->flag &= ~PSYS_SOFT_BAKE;
+ //}
+
+ /* do softbody */
+ sbObjectStep(ob, (float)G.scene->r.cfra, NULL, psys_count_keys(psys));
+
+ /* return things back to normal */
+ psys->soft=ob->soft;
+ psys->softflag=ob->softflag;
+
+ ob->soft=sb;
+ ob->softflag=softflag;
+}
+static int hair_needs_recalc(ParticleSystem *psys)
+{
+ if((psys->flag & PSYS_EDITED)==0 && (
+ (psys->flag & PSYS_HAIR_DONE)==0
+ || psys->recalc & PSYS_RECALC_HAIR)
+ ) {
+ psys->recalc &= ~PSYS_RECALC_HAIR;
+ return 1;
+ }
+
+ return 0;
+}
+/* main particle update call, checks that things are ok on the large scale before actual particle calculations */
+void particle_system_update(Object *ob, ParticleSystem *psys){
+
+ ParticleSystemModifierData *psmd=0;
+ float cfra;
+
+ if((psys->flag & PSYS_ENABLED)==0) return;
+
+ psmd=psys_get_modifier(ob,psys);
+
+ cfra=bsystem_time(ob,(float)CFRA,0.0);
+
+ /* system was already updated from modifier stack */
+ if(psmd->flag&eParticleSystemFlag_psys_updated){
+ psmd->flag &= ~eParticleSystemFlag_psys_updated;
+ /* make sure it really was updated to cfra */
+ if(psys->cfra==cfra)
+ return;
+ }
+
+ /* baked path softbody */
+ if(psys->part->type==PART_HAIR && psys->soft)
+ psys_to_softbody(ob, psys, 0);
+
+ /* not needed, this is all handled in hair_step */
+ ///* is the mesh changing under the edited particles? */
+ //if((psys->flag & PSYS_EDITED) && psys->part->type==PART_HAIR && psys->recalc & PSYS_RECALC_HAIR) {
+ // /* Just update the particles on the mesh */
+ // psys_update_edithair_dmfaces(ob, psmd->dm, psys);
+ //}
+
+ if(psys->part->type==PART_HAIR && hair_needs_recalc(psys)){
+ float hcfra=0.0f;
+ int i;
+ free_hair(psys);
+
+ /* first step is negative so particles get killed and reset */
+ psys->cfra=1.0f;
+
+ for(i=0; i<=psys->part->hair_step; i++){
+ hcfra=100.0f*(float)i/(float)psys->part->hair_step;
+ system_step(ob,psys,psmd,hcfra);
+ save_hair(ob,psys,psmd,hcfra);
+ }
+
+ psys->flag |= PSYS_HAIR_DONE;
+
+ if(psys->softflag&OB_SB_ENABLE)
+ psys_to_softbody(ob,psys,1);
+ }
+
+ system_step(ob,psys,psmd,cfra);
+
+ Mat4CpyMat4(psys->imat, ob->imat); /* used for duplicators */
+}
+
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
new file mode 100644
index 00000000000..9492754260c
--- /dev/null
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -0,0 +1,185 @@
+/**
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+* Contributor(s): Campbell Barton <ideasman42@gmail.com>
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "BKE_pointcache.h"
+
+#include "BKE_utildefines.h"
+#include "BKE_global.h"
+#include "BKE_library.h"
+
+#include "BLI_blenlib.h"
+#include "BKE_utildefines.h"
+#include "blendef.h"
+
+/* needed for directory lookup */
+#ifndef WIN32
+ #include <dirent.h>
+#else
+ #include "BLI_winstuff.h"
+#endif
+
+/* Takes an Object ID and returns a unique name
+ - id: object id
+ - cfra: frame for the cache, can be negative
+ - stack_index: index in the modifier stack. we can have cache for more then one stack_index
+*/
+
+static int ptcache_path(char *filename)
+{
+ sprintf(filename, PTCACHE_PATH);
+ BLI_convertstringcode(filename, G.sce, 0);
+ return strlen(filename);
+}
+
+int BKE_ptcache_id_filename(struct ID *id, char *filename, int cfra, int stack_index, short do_path, short do_ext)
+{
+ int len=0;
+ char *idname;
+ char *newname;
+ filename[0] = '\0';
+ newname = filename;
+
+ /* start with temp dir */
+ if (do_path) {
+ len = ptcache_path(filename);
+ newname += len;
+ }
+ idname = (id->name+2);
+ /* convert chars to hex so they are always a valid filename */
+ while('\0' != *idname) {
+ sprintf(newname, "%02X", (char)(*idname++));
+ newname+=2;
+ len += 2;
+ }
+
+ if (do_ext) {
+ sprintf(newname, "_%06d_%02d"PTCACHE_EXT, cfra, stack_index); /* always 6 chars */
+ len += 16;
+ }
+
+ return len; /* make sure the above string is always 16 chars */
+}
+
+/* youll need to close yourself after! */
+FILE *BKE_ptcache_id_fopen(struct ID *id, char mode, int cfra, int stack_index)
+{
+ /* mode is same as fopen's modes */
+ FILE *fp = NULL;
+ char filename[(FILE_MAXDIR+FILE_MAXFILE)*2];
+
+ BKE_ptcache_id_filename(id, filename, cfra, stack_index, 1, 1);
+
+ if (mode=='r') {
+ if (!BLI_exists(filename)) {
+ return NULL;
+ }
+ fp = fopen(filename, "rb");
+ } else if (mode=='w') {
+ BLI_make_existing_file(filename); /* will create the dir if needs be, same as //textures is created */
+ fp = fopen(filename, "wb");
+ }
+
+ if (!fp) {
+ return NULL;
+ }
+
+ return fp;
+}
+
+/* youll need to close yourself after!
+ * mode,
+
+*/
+
+void BKE_ptcache_id_clear(struct ID *id, char mode, int cfra, int stack_index)
+{
+ int len; /* store the length of the string */
+
+ /* mode is same as fopen's modes */
+ DIR *dir;
+ struct dirent *de;
+ char path[FILE_MAX];
+ char filename[(FILE_MAXDIR+FILE_MAXFILE)*2];
+ char path_full[(FILE_MAXDIR+FILE_MAXFILE)*2];
+
+ /* clear all files in the temp dir with the prefix of the ID and the ".bphys" suffix */
+ switch (mode) {
+ case PTCACHE_CLEAR_ALL:
+ case PTCACHE_CLEAR_BEFORE:
+ case PTCACHE_CLEAR_AFTER:
+ ptcache_path(path);
+ len = BKE_ptcache_id_filename(id, filename, cfra, stack_index, 0, 0); /* no path */
+
+ dir = opendir(path);
+ if (dir==NULL)
+ return;
+
+ while ((de = readdir(dir)) != NULL) {
+ if (strstr(de->d_name, PTCACHE_EXT)) { /* do we have the right extension?*/
+ if (strncmp(filename, de->d_name, len ) == 0) { /* do we have the right prefix */
+ if (mode == PTCACHE_CLEAR_ALL) {
+ BLI_join_dirfile(path_full, path, de->d_name);
+ BLI_delete(path_full, 0, 0);
+ } else {
+ /* read the number of the file */
+ int frame, len2 = strlen(de->d_name);
+ char num[7];
+ if (len2 > 15) { /* could crash if trying to copy a string out of this range*/
+ strncpy(num, de->d_name + (strlen(de->d_name) - 15), 6);
+ frame = atoi(num);
+
+ if((mode==PTCACHE_CLEAR_BEFORE && frame < cfra) ||
+ (mode==PTCACHE_CLEAR_AFTER && frame > cfra) ) {
+
+ BLI_join_dirfile(path_full, path, de->d_name);
+ BLI_delete(path_full, 0, 0);
+ }
+ }
+ }
+ }
+ }
+ }
+ closedir(dir);
+ break;
+
+ case PTCACHE_CLEAR_FRAME:
+ len = BKE_ptcache_id_filename(id, filename, cfra, stack_index, 1, 1); /* no path */
+ BLI_delete(filename, 0, 0);
+ break;
+ }
+ return;
+}
+
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 42a61fb5f11..aa9c489044a 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -174,6 +174,8 @@ void free_scene(Scene *sce)
Scene *add_scene(char *name)
{
Scene *sce;
+ ParticleEditSettings *pset;
+ int a;
sce= alloc_libblock(&G.main->scene, ID_SCE, name);
sce->lay= 1;
@@ -197,6 +199,8 @@ Scene *add_scene(char *name)
sce->r.images= 100;
sce->r.framelen= 1.0;
sce->r.frs_sec= 25;
+ sce->r.frs_sec_base= 1;
+ sce->r.ocres = 128;
sce->r.bake_mode= 1; /* prevent to include render stuff here */
sce->r.bake_filter= 2;
@@ -229,6 +233,20 @@ Scene *add_scene(char *name)
sce->toolsettings->uvcalc_mapalign = 1;
sce->toolsettings->unwrapper = 1;
sce->toolsettings->select_thresh= 0.01f;
+ sce->toolsettings->jointrilimit = 0.8f;
+
+ pset= &sce->toolsettings->particle;
+ pset->flag= PE_KEEP_LENGTHS|PE_LOCK_FIRST|PE_DEFLECT_EMITTER;
+ pset->emitterdist= 0.25f;
+ pset->totrekey= 5;
+ pset->totaddkey= 5;
+ pset->brushtype= PE_BRUSH_NONE;
+ for(a=0; a<PE_TOT_BRUSH; a++) {
+ pset->brush[a].strength= 50;
+ pset->brush[a].size= 50;
+ pset->brush[a].step= 10;
+ }
+ pset->brush[PE_BRUSH_CUT].strength= 100;
sce->jumpframe = 10;
sce->audio.mixrate = 44100;
@@ -528,6 +546,9 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay)
{
Scene *scene= sce;
+ /* clears all BONE_UNKEYED flags for every pose's pchans */
+ framechange_poses_clear_unkeyed();
+
/* object ipos are calculated in where_is_object */
do_all_data_ipos();
@@ -538,7 +559,6 @@ void scene_update_for_newframe(Scene *sce, unsigned int lay)
scene_update(sce, lay);
scene_update(scene, lay);
-
}
/* return default layer, also used to patch old files */
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 16a29fb8e80..bd9d1cb75ca 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -61,9 +61,11 @@ variables on the UI for now
#include "DNA_curve_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h" /* here is the softbody struct */
+#include "DNA_particle_types.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_lattice_types.h"
#include "DNA_scene_types.h"
@@ -75,9 +77,12 @@ variables on the UI for now
#include "BKE_global.h"
#include "BKE_key.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_softbody.h"
#include "BKE_utildefines.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_pointcache.h"
+#include "BKE_modifier.h"
#include "BIF_editdeform.h"
#include "BIF_graphics.h"
@@ -90,18 +95,6 @@ static int (*SB_localInterruptCallBack)(void) = NULL;
/* ********** soft body engine ******* */
-
-typedef struct BodyPoint {
- float origS[3], origE[3], origT[3], pos[3], vec[3], force[3];
- float goal;
- float prevpos[3], prevvec[3], prevdx[3], prevdv[3]; /* used for Heun integration */
- int nofsprings; int *springs;
- float choke;
- float colball;
- short flag;
- char octantflag;
-} BodyPoint;
-
typedef struct BodySpring {
int v1, v2;
float len, strength, cf;
@@ -480,21 +473,31 @@ void ccd_build_deflector_hache(Object *vertexowner,GHash *hash)
while (base) {
/*Only proceed for mesh object in same layer */
if(base->object->type==OB_MESH && (base->lay & vertexowner->lay)) {
+ int particles=0;
ob= base->object;
- if((vertexowner) && (ob == vertexowner)){
- /* if vertexowner is given we don't want to check collision with owner object */
- base = base->next;
- continue;
+ if((vertexowner) && (ob == vertexowner)) {
+ if(vertexowner->soft->particles){
+ particles=1;
+ }
+ else {
+ /* if vertexowner is given we don't want to check collision with owner object */
+ base = base->next;
+ continue;
+ }
}
/*+++ only with deflecting set */
if(ob->pd && ob->pd->deflect && BLI_ghash_lookup(hash, ob) == 0) {
DerivedMesh *dm= NULL;
-
- if(ob->softflag & OB_SB_COLLFINAL) { /* so maybe someone wants overkill to collide with subsurfed */
- dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
- } else {
- dm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
+
+ if(particles) {
+ dm = psys_get_modifier(ob,psys_get_current(ob))->dm;
+ }
+ else {
+ if(ob->softflag & OB_SB_COLLFINAL) /* so maybe someone wants overkill to collide with subsurfed */
+ dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
+ else
+ dm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
}
if(dm){
@@ -782,21 +785,21 @@ static void calculate_collision_balls(Object *ob)
}
if (akku_count > 0) {
- if (sb->sbc_mode == 0){
+ if (sb->sbc_mode == SBC_MODE_MANUAL){
bp->colball=sb->colball;
- }
- if (sb->sbc_mode == 1){
- bp->colball = akku/(float)akku_count*sb->colball;
}
- if (sb->colball == 2){
+ if (sb->sbc_mode == SBC_MODE_AVG){
+ bp->colball = akku/(float)akku_count*sb->colball;
+ }
+ if (sb->sbc_mode == SBC_MODE_MIN){
bp->colball=min*sb->colball;
- }
- if (sb->colball == 3){
+ }
+ if (sb->sbc_mode == SBC_MODE_MAX){
bp->colball=max*sb->colball;
- }
- if (sb->colball == 4){
- bp->colball = (min + max)/2.0f*sb->colball;
- }
+ }
+ if (sb->sbc_mode == SBC_MODE_AVGMINMAX){
+ bp->colball = (min + max)/2.0f*sb->colball;
+ }
}
else bp->colball=0;
}/*for bp*/
@@ -852,10 +855,11 @@ static void renew_softbody(Object *ob, int totpoint, int totspring)
{
SoftBody *sb;
int i;
-
+ short softflag;
if(ob->soft==NULL) ob->soft= sbNew();
else free_softbody_intern(ob->soft);
sb= ob->soft;
+ softflag=ob->softflag;
if(totpoint) {
sb->totpoint= totpoint;
@@ -869,8 +873,8 @@ static void renew_softbody(Object *ob, int totpoint, int totspring)
for (i=0; i<totpoint; i++) {
BodyPoint *bp = &sb->bpoint[i];
- if(ob->softflag & OB_SB_GOAL) {
- bp->goal= ob->soft->defgoal;
+ if(softflag & OB_SB_GOAL) {
+ bp->goal= sb->defgoal;
}
else {
bp->goal= 0.0f;
@@ -900,7 +904,6 @@ static void free_softbody_baked(SoftBody *sb)
sb->keys= NULL;
sb->totkey= 0;
-
}
static void free_scratch(SoftBody *sb)
{
@@ -1203,9 +1206,9 @@ int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_
Crossf(d_nvect, edge2, edge1);
Normalize(d_nvect);
if (
- LineIntersectsTriangle(nv1, nv2, face_v1, face_v2, face_v3, &t) ||
- LineIntersectsTriangle(nv2, nv3, face_v1, face_v2, face_v3, &t) ||
- LineIntersectsTriangle(nv3, nv1, face_v1, face_v2, face_v3, &t) ){
+ LineIntersectsTriangle(nv1, nv2, face_v1, face_v2, face_v3, &t, NULL) ||
+ LineIntersectsTriangle(nv2, nv3, face_v1, face_v2, face_v3, &t, NULL) ||
+ LineIntersectsTriangle(nv3, nv1, face_v1, face_v2, face_v3, &t, NULL) ){
Vec3PlusStVec(force,-1.0f,d_nvect);
*damp=ob->pd->pdef_sbdamp;
deflected = 2;
@@ -1217,9 +1220,9 @@ int sb_detect_face_collisionCached(float face_v1[3],float face_v2[3],float face_
Crossf(d_nvect, edge2, edge1);
Normalize(d_nvect);
if (
- LineIntersectsTriangle(nv1, nv3, face_v1, face_v2, face_v3, &t) ||
- LineIntersectsTriangle(nv3, nv4, face_v1, face_v2, face_v3, &t) ||
- LineIntersectsTriangle(nv4, nv1, face_v1, face_v2, face_v3, &t) ){
+ LineIntersectsTriangle(nv1, nv3, face_v1, face_v2, face_v3, &t, NULL) ||
+ LineIntersectsTriangle(nv3, nv4, face_v1, face_v2, face_v3, &t, NULL) ||
+ LineIntersectsTriangle(nv4, nv1, face_v1, face_v2, face_v3, &t, NULL) ){
Vec3PlusStVec(force,-1.0f,d_nvect);
*damp=ob->pd->pdef_sbdamp;
deflected = 2;
@@ -1402,7 +1405,7 @@ int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp
Crossf(d_nvect, edge2, edge1);
Normalize(d_nvect);
- if ( LineIntersectsTriangle(edge_v1, edge_v2, nv1, nv2, nv3, &t)){
+ if ( LineIntersectsTriangle(edge_v1, edge_v2, nv1, nv2, nv3, &t, NULL)){
float v1[3],v2[3];
float intrusiondepth,i1,i2;
VECSUB(v1, edge_v1, nv2);
@@ -1421,7 +1424,7 @@ int sb_detect_edge_collisionCached(float edge_v1[3],float edge_v2[3],float *damp
Crossf(d_nvect, edge2, edge1);
Normalize(d_nvect);
- if (LineIntersectsTriangle( edge_v1, edge_v2,nv1, nv3, nv4, &t)){
+ if (LineIntersectsTriangle( edge_v1, edge_v2,nv1, nv3, nv4, &t, NULL)){
float v1[3],v2[3];
float intrusiondepth,i1,i2;
VECSUB(v1, edge_v1, nv4);
@@ -1547,19 +1550,22 @@ int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *
float force[3], unsigned int par_layer,struct Object *vertexowner,
float time,float vel[3], float *intrusion)
{
- Object *ob;
+ Object *ob= NULL;
GHash *hash;
GHashIterator *ihash;
- float nv1[3], nv2[3], nv3[3], nv4[3], edge1[3], edge2[3],d_nvect[3], dv1[3],ve[3],avel[3],
- vv1[3], vv2[3], vv3[3], vv4[3],
+ float nv1[3], nv2[3], nv3[3], nv4[3], edge1[3], edge2[3],d_nvect[3], dv1[3],ve[3],avel[3]={0.0,0.0,0.0},
+ vv1[3], vv2[3], vv3[3], vv4[3], coledge[3], mindistedge = 1000.0f,
+ outerforceaccu[3],innerforceaccu[3],
facedist,n_mag,force_mag_norm,minx,miny,minz,maxx,maxy,maxz,
innerfacethickness = -0.5f, outerfacethickness = 0.2f,
- ee = 5.0f, ff = 0.1f, fa;
+ ee = 5.0f, ff = 0.1f, fa=1;
int a, deflected=0, cavel=0,ci=0;
/* init */
*intrusion = 0.0f;
hash = vertexowner->soft->scratch->colliderhash;
ihash = BLI_ghashIterator_new(hash);
+ outerforceaccu[0]=outerforceaccu[1]=outerforceaccu[2]=0.0f;
+ innerforceaccu[0]=innerforceaccu[1]=innerforceaccu[2]=0.0f;
/* go */
while (!BLI_ghashIterator_isDone(ihash) ) {
@@ -1675,16 +1681,24 @@ int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *
Crossf(d_nvect, edge2, edge1);
n_mag = Normalize(d_nvect);
facedist = Inpf(dv1,d_nvect);
+ // so rules are
+ //
if ((facedist > innerfacethickness) && (facedist < outerfacethickness)){
if (point_in_tri_prism(opco, nv1, nv2, nv3) ){
force_mag_norm =(float)exp(-ee*facedist);
if (facedist > outerfacethickness*ff)
force_mag_norm =(float)force_mag_norm*fa*(facedist - outerfacethickness)*(facedist - outerfacethickness);
- Vec3PlusStVec(force,force_mag_norm,d_nvect);
*damp=ob->pd->pdef_sbdamp;
if (facedist > 0.0f){
*damp *= (1.0f - facedist/outerfacethickness);
+ Vec3PlusStVec(outerforceaccu,force_mag_norm,d_nvect);
+ deflected = 3;
+
+ }
+ else {
+ Vec3PlusStVec(innerforceaccu,force_mag_norm,d_nvect);
+ if (deflected < 2) deflected = 2;
}
if ((mprevvert) && (*damp > 0.0f)){
choose_winner(ve,opco,nv1,nv2,nv3,vv1,vv2,vv3);
@@ -1693,7 +1707,6 @@ int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *
}
*intrusion += facedist;
ci++;
- deflected = 2;
}
}
if (mface->v4){ /* quad */
@@ -1711,11 +1724,17 @@ int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *
force_mag_norm =(float)exp(-ee*facedist);
if (facedist > outerfacethickness*ff)
force_mag_norm =(float)force_mag_norm*fa*(facedist - outerfacethickness)*(facedist - outerfacethickness);
- Vec3PlusStVec(force,force_mag_norm,d_nvect);
*damp=ob->pd->pdef_sbdamp;
- if (facedist > 0.0f){
- *damp *= (1.0f - facedist/outerfacethickness);
- }
+ if (facedist > 0.0f){
+ *damp *= (1.0f - facedist/outerfacethickness);
+ Vec3PlusStVec(outerforceaccu,force_mag_norm,d_nvect);
+ deflected = 3;
+
+ }
+ else {
+ Vec3PlusStVec(innerforceaccu,force_mag_norm,d_nvect);
+ if (deflected < 2) deflected = 2;
+ }
if ((mprevvert) && (*damp > 0.0f)){
choose_winner(ve,opco,nv1,nv3,nv4,vv1,vv3,vv4);
@@ -1724,10 +1743,62 @@ int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *
}
*intrusion += facedist;
ci++;
- deflected = 2;
}
}
+ if ((deflected < 2)&& (G.rt != 444)) // we did not hit a face until now
+ { // see if 'outer' hits an edge
+ float dist;
+
+ PclosestVL3Dfl(ve, opco, nv1, nv2);
+ VECSUB(ve,opco,ve);
+ dist = Normalize(ve);
+ if ((dist < outerfacethickness)&&(dist < mindistedge )){
+ VECCOPY(coledge,ve);
+ mindistedge = dist,
+ deflected=1;
+ }
+
+ PclosestVL3Dfl(ve, opco, nv2, nv3);
+ VECSUB(ve,opco,ve);
+ dist = Normalize(ve);
+ if ((dist < outerfacethickness)&&(dist < mindistedge )){
+ VECCOPY(coledge,ve);
+ mindistedge = dist,
+ deflected=1;
+ }
+
+ PclosestVL3Dfl(ve, opco, nv3, nv1);
+ VECSUB(ve,opco,ve);
+ dist = Normalize(ve);
+ if ((dist < outerfacethickness)&&(dist < mindistedge )){
+ VECCOPY(coledge,ve);
+ mindistedge = dist,
+ deflected=1;
+ }
+ if (mface->v4){ /* quad */
+ PclosestVL3Dfl(ve, opco, nv3, nv4);
+ VECSUB(ve,opco,ve);
+ dist = Normalize(ve);
+ if ((dist < outerfacethickness)&&(dist < mindistedge )){
+ VECCOPY(coledge,ve);
+ mindistedge = dist,
+ deflected=1;
+ }
+
+ PclosestVL3Dfl(ve, opco, nv1, nv4);
+ VECSUB(ve,opco,ve);
+ dist = Normalize(ve);
+ if ((dist < outerfacethickness)&&(dist < mindistedge )){
+ VECCOPY(coledge,ve);
+ mindistedge = dist,
+ deflected=1;
+ }
+
+ }
+
+
+ }
}
mface++;
mima++;
@@ -1735,6 +1806,25 @@ int sb_detect_vertex_collisionCached(float opco[3], float facenormal[3], float *
} /* if(ob->pd && ob->pd->deflect) */
BLI_ghashIterator_step(ihash);
} /* while () */
+
+ if (deflected == 1){ // no face but 'outer' edge cylinder sees vert
+ force_mag_norm =(float)exp(-ee*mindistedge);
+ if (mindistedge > outerfacethickness*ff)
+ force_mag_norm =(float)force_mag_norm*fa*(mindistedge - outerfacethickness)*(mindistedge - outerfacethickness);
+ Vec3PlusStVec(force,force_mag_norm,coledge);
+ *damp=ob->pd->pdef_sbdamp;
+ if (mindistedge > 0.0f){
+ *damp *= (1.0f - mindistedge/outerfacethickness);
+ }
+
+ }
+ if (deflected == 2){ // face inner detected
+ VECADD(force,force,innerforceaccu);
+ }
+ if (deflected == 3){ // face outer detected
+ VECADD(force,force,outerforceaccu);
+ }
+
BLI_ghashIterator_free(ihash);
if (cavel) VecMulf(avel,1.0f/(float)cavel);
VECCOPY(vel,avel);
@@ -2313,6 +2403,7 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
VECCOPY(bp->prevvec, bp->vec);
VECCOPY(bp->prevdv, dv);
}
+
if (mode ==2){
/* be optimistic and execute step */
bp->vec[0] = bp->prevvec[0] + 0.5f * (dv[0] + bp->prevdv[0]);
@@ -2330,10 +2421,9 @@ static void softbody_apply_forces(Object *ob, float forcetime, int mode, float *
/* x(t + dt) = x(t) + v(t) * dt */
VECCOPY(dx,bp->vec);
- dx[0]*=forcetime ;
- dx[1]*=forcetime ;
- dx[2]*=forcetime ;
-
+ dx[0]*=forcetime;
+ dx[1]*=forcetime;
+ dx[2]*=forcetime;
/* again some nasty if's to have heun in here too */
if (mode ==1){
VECCOPY(bp->prevpos,bp->pos);
@@ -2492,6 +2582,7 @@ static void springs_from_mesh(Object *ob)
Mesh *me= ob->data;
BodyPoint *bp;
int a;
+ float scale =1.0f;
sb= ob->soft;
if (me && sb)
@@ -2509,9 +2600,13 @@ static void springs_from_mesh(Object *ob)
}
/* recalculate spring length for meshes here */
+ /* special hidden feature! shrink to fit */
+ if (G.rt > 500){
+ scale = (G.rt - 500) / 100.0f;
+ }
for(a=0; a<sb->totspring; a++) {
BodySpring *bs = &sb->bspring[a];
- bs->len= VecLenf(sb->bpoint[bs->v1].origS, sb->bpoint[bs->v2].origS);
+ bs->len= scale*VecLenf(sb->bpoint[bs->v1].origS, sb->bpoint[bs->v2].origS);
}
}
}
@@ -2861,6 +2956,103 @@ static void curve_surf_to_softbody(Object *ob)
}
+static void springs_from_particles(Object *ob)
+{
+ ParticleSystem *psys;
+ ParticleSystemModifierData *psmd=0;
+ ParticleData *pa=0;
+ HairKey *key=0;
+ SoftBody *sb;
+ BodyPoint *bp;
+ BodySpring *bs;
+ int a,k;
+ float hairmat[4][4];
+
+ psys= ob->soft->particles;
+ sb= ob->soft;
+ if(ob && sb && psys) {
+ psmd = psys_get_modifier(ob, psys);
+
+ bp= sb->bpoint;
+ for(a=0, pa=psys->particles; a<psys->totpart; a++, pa++) {
+ for(k=0, key=pa->hair; k<pa->totkey; k++, bp++, key++) {
+ VECCOPY(bp->origS, key->co);
+
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
+
+ Mat4MulVecfl(hairmat, bp->origS);
+ }
+ }
+
+ for(a=0, bs=sb->bspring; a<sb->totspring; a++, bs++)
+ bs->len= VecLenf(sb->bpoint[bs->v1].origS, sb->bpoint[bs->v2].origS);
+ }
+}
+
+static void particles_to_softbody(Object *ob)
+{
+ SoftBody *sb;
+ BodyPoint *bp;
+ BodySpring *bs;
+ ParticleData *pa;
+ HairKey *key;
+ ParticleSystem *psys= ob->soft->particles;
+ float goalfac;
+ int a, k, curpoint;
+ int totpoint= psys_count_keys(psys);
+ int totedge= totpoint-psys->totpart;
+
+ /* renew ends with ob->soft with points and edges, also checks & makes ob->soft */
+ renew_softbody(ob, totpoint, totedge);
+
+ psys->particles->bpi = 0;
+ for(a=1, pa=psys->particles+1; a<psys->totpart; a++, pa++)
+ pa->bpi = (pa-1)->bpi + pa->totkey;
+
+ /* we always make body points */
+ sb= ob->soft;
+ bp= sb->bpoint;
+ bs= sb->bspring;
+ goalfac= ABS(sb->maxgoal - sb->mingoal);
+
+ if((ob->softflag & OB_SB_GOAL)) {
+ for(a=0, pa=psys->particles; a<psys->totpart; a++, pa++) {
+ for(k=0, key=pa->hair; k<pa->totkey; k++,bp++,key++) {
+ if(k) {
+ bp->goal= key->weight;
+ bp->goal= sb->mingoal + bp->goal*goalfac;
+ bp->goal= (float)pow(bp->goal, 4.0f);
+ }
+ else{
+ /* hair roots are allways fixed fully to goal */
+ bp->goal= 1.0f;
+ }
+ }
+ }
+ }
+
+ bp= sb->bpoint;
+ curpoint=0;
+ for(a=0, pa=psys->particles; a<psys->totpart; a++, curpoint++, pa++) {
+ for(k=0; k<pa->totkey-1; k++,bs++,curpoint++) {
+ bs->v1=curpoint;
+ bs->v2=curpoint+1;
+ bs->strength= 1.0;
+ bs->order=1;
+ }
+ }
+
+ build_bps_springlist(ob); /* scan for springs attached to bodypoints ONCE */
+ /* insert *other second order* springs if desired */
+ if(sb->secondspring > 0.0000001f) {
+ add_2nd_order_springs(ob,sb->secondspring*10.0); /* exploits the the first run of build_bps_springlist(ob);*/
+ build_bps_springlist(ob); /* yes we need to do it again*/
+ }
+ springs_from_particles(ob); /* write the 'rest'-lenght of the springs */
+ if(ob->softflag & OB_SB_SELF)
+ calculate_collision_balls(ob);
+}
+
/* copies softbody result back in object */
static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts, int local)
{
@@ -2877,117 +3069,94 @@ static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts,
}
}
-/* return 1 if succesfully baked and applied step */
-static int softbody_baked_step(Object *ob, float framenr, float (*vertexCos)[3], int numVerts)
+void softbody_clear_cache(Object *ob, float framenr)
{
- SoftBody *sb= ob->soft;
- SBVertex *key0, *key1, *key2, *key3;
- BodyPoint *bp;
- float data[4], sfra, efra, cfra, dfra, fac; /* start, end, current, delta */
- int ofs1, a;
-
- /* precondition check */
- if(sb==NULL || sb->keys==NULL || sb->totkey==0) return 0;
- /* so we got keys, but no bodypoints... even without simul we need it for the bake */
- if(sb->bpoint==NULL) sb->bpoint= MEM_callocN( sb->totpoint*sizeof(BodyPoint), "bodypoint");
-
- /* convert cfra time to system time */
- sfra= (float)sb->sfra;
- cfra= bsystem_time(ob, NULL, framenr, 0.0);
- efra= (float)sb->efra;
- dfra= (float)sb->interval;
+ SoftBody *sb = ob->soft;
+ ModifierData *md = ob->modifiers.first;
+ int stack_index = -1;
+ int a;
- /* offset in keys array */
- ofs1= (int)floor( (cfra-sfra)/dfra );
+ if(sb==NULL) return;
- if(ofs1 < 0) {
- key0=key1=key2=key3= *sb->keys;
- }
- else if(ofs1 >= sb->totkey-1) {
- key0=key1=key2=key3= *(sb->keys+sb->totkey-1);
- }
+ if(sb->particles)
+ stack_index = modifiers_indexInObject(ob,(ModifierData*)psys_get_modifier(ob,sb->particles));
else {
- key1= *(sb->keys+ofs1);
- key2= *(sb->keys+ofs1+1);
-
- if(ofs1>0) key0= *(sb->keys+ofs1-1);
- else key0= key1;
-
- if(ofs1<sb->totkey-2) key3= *(sb->keys+ofs1+2);
- else key3= key2;
- }
-
- sb->ctime= cfra; /* needed? */
-
- /* timing */
- fac= ((cfra-sfra)/dfra) - (float)ofs1;
- CLAMP(fac, 0.0, 1.0);
- set_four_ipo(fac, data, KEY_BSPLINE);
- if (key0&&key1&&key2&&key3) // may be null because we SHIFT_ESCAPED
- for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++, key0++, key1++, key2++, key3++) {
- bp->pos[0]= data[0]*key0->vec[0] + data[1]*key1->vec[0] + data[2]*key2->vec[0] + data[3]*key3->vec[0];
- bp->pos[1]= data[0]*key0->vec[1] + data[1]*key1->vec[1] + data[2]*key2->vec[1] + data[3]*key3->vec[1];
- bp->pos[2]= data[0]*key0->vec[2] + data[1]*key1->vec[2] + data[2]*key2->vec[2] + data[3]*key3->vec[2];
+ for(a=0; md; md=md->next, a++) {
+ if(md->type == eModifierType_Softbody) {
+ stack_index = a;
+ break;
+ }
+ }
}
-
- softbody_to_object(ob, vertexCos, numVerts, sb->local);
-
- return 1;
-}
-/* only gets called after succesfully doing softbody_step */
-/* already checked for OB_SB_BAKE flag */
-static void softbody_baked_add(Object *ob, float framenr)
+ BKE_ptcache_id_clear((ID *)ob, PTCACHE_CLEAR_ALL, framenr, stack_index);
+}
+static void softbody_write_cache(Object *ob, float framenr)
{
- SoftBody *sb= ob->soft;
- SBVertex *key;
+ FILE *fp = NULL;
+ SoftBody *sb = ob->soft;
BodyPoint *bp;
- float sfra, efra, cfra, dfra, fac1; /* start, end, current, delta */
- int ofs1, a;
-
- /* convert cfra time to system time */
- sfra= (float)sb->sfra;
- fac1= ob->sf; ob->sf= 0.0f; /* disable startframe */
- cfra= bsystem_time(ob, NULL, framenr, 0.0);
- ob->sf= fac1;
- efra= (float)sb->efra;
- dfra= (float)sb->interval;
-
- if(sb->totkey==0) {
- if(sb->sfra >= sb->efra) return; /* safety, UI or py setting allows */
- if(sb->interval<1) sb->interval= 1; /* just be sure */
-
- sb->totkey= 1 + (int)(ceil( (efra-sfra)/dfra ) );
- sb->keys= MEM_callocN( sizeof(void *)*sb->totkey, "sb keys");
+ ModifierData *md = ob->modifiers.first;
+ int stack_index = -1;
+ int a;
+
+ if(sb->totpoint == 0) return;
+
+ if(sb->particles)
+ stack_index = modifiers_indexInObject(ob,(ModifierData*)psys_get_modifier(ob,sb->particles));
+ else {
+ for(a=0; md; md=md->next, a++) {
+ if(md->type == eModifierType_Softbody) {
+ stack_index = a;
+ break;
+ }
+ }
}
+
+ fp = BKE_ptcache_id_fopen((ID *)ob, 'w', framenr, stack_index);
+ if(!fp) return;
+
+ for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++)
+ fwrite(&bp->pos, sizeof(float), 3, fp);
- /* inverse matrix might not be uptodate... */
- Mat4Invert(ob->imat, ob->obmat);
-
- /* now find out if we have to store a key */
-
- /* offset in keys array */
- if(cfra>=(efra)) {
- ofs1= sb->totkey-1;
- fac1= 0.0;
- }
+ fclose(fp);
+}
+static int softbody_read_cache(Object *ob, float framenr)
+{
+ FILE *fp = NULL;
+ SoftBody *sb = ob->soft;
+ BodyPoint *bp;
+ ModifierData *md = ob->modifiers.first;
+ int stack_index = -1;
+ int a, ret = 1;
+
+ if(sb->totpoint == 0) return 0;
+
+ if(sb->particles)
+ stack_index = modifiers_indexInObject(ob,(ModifierData*)psys_get_modifier(ob,sb->particles));
else {
- ofs1= (int)floor( (cfra-sfra)/dfra );
- fac1= ((cfra-sfra)/dfra) - (float)ofs1;
- }
- if( fac1 < 1.0/dfra ) {
-
- key= *(sb->keys+ofs1);
- if(key == NULL) {
- *(sb->keys+ofs1)= key= MEM_mallocN(sb->totpoint*sizeof(SBVertex), "softbody key");
-
- for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++, key++) {
- VECCOPY(key->vec, bp->pos);
- if(sb->local)
- Mat4MulVecfl(ob->imat, key->vec);
+ for(a=0; md; md=md->next, a++) {
+ if(md->type == eModifierType_Softbody) {
+ stack_index = a;
+ break;
}
}
}
+
+ fp = BKE_ptcache_id_fopen((ID *)ob, 'r', framenr, stack_index);
+ if(!fp)
+ ret = 0;
+ else {
+ for(a=0, bp=sb->bpoint; a<sb->totpoint; a++, bp++)
+ if(fread(&bp->pos, sizeof(float), 3, fp) != 3) {
+ ret = 0;
+ break;
+ }
+
+ fclose(fp);
+ }
+
+ return ret;
}
/* +++ ************ maintaining scratch *************** */
void sb_new_scratch(SoftBody *sb)
@@ -3035,6 +3204,11 @@ SoftBody *sbNew(void)
sb->balldamp = 0.50f;
sb->ballstiff= 1.0f;
sb->sbc_mode = 1;
+
+
+ sb->minloops = 10;
+
+ sb->choke = 3;
sb_new_scratch(sb);
return sb;
}
@@ -3078,15 +3252,14 @@ void sbSetInterruptCallBack(int (*f)(void))
/* simulates one step. framenr is in frames */
void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts)
{
+ ParticleSystemModifierData *psmd=0;
+ ParticleData *pa=0;
SoftBody *sb;
+ HairKey *key= NULL;
BodyPoint *bp;
int a;
float dtime,ctime,forcetime,err;
-
- /* baking works with global time */
- if(!(ob->softflag & OB_SB_BAKEDO) )
- if(softbody_baked_step(ob, framenr, vertexCos, numVerts) ) return;
-
+ float hairmat[4][4];
/* This part only sets goals and springs, based on original mesh/curve/lattice data.
Copying coordinates happens in next chunk by setting softbody flag OB_SB_RESET */
@@ -3097,7 +3270,13 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
(numVerts!=ob->soft->totpoint) || /* should never happen, just to be safe */
((ob->softflag & OB_SB_EDGES) && !ob->soft->bspring && object_has_edges(ob))) /* happens when in UI edges was set */
{
- switch(ob->type) {
+ if(ob->soft && ob->soft->bpoint) /* don't clear on file load */
+ softbody_clear_cache(ob, framenr);
+
+ if(ob->soft->particles){
+ particles_to_softbody(ob);
+ }
+ else switch(ob->type) {
case OB_MESH:
mesh_to_softbody(ob);
break;
@@ -3123,10 +3302,14 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
/* still no points? go away */
if(sb->totpoint==0) return;
+ if(sb->particles){
+ psmd=psys_get_modifier(ob,sb->particles);
+ pa=sb->particles->particles;
+ }
/* checking time: */
- ctime= bsystem_time(ob, NULL, framenr, 0.0);
+ ctime= bsystem_time(ob, framenr, 0.0);
if (ob->softflag&OB_SB_RESET) {
dtime = 0.0;
@@ -3134,17 +3317,45 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
dtime= ctime - sb->ctime;
}
+ if(softbody_read_cache(ob, framenr)) {
+ if(sb->particles==0)
+ softbody_to_object(ob, vertexCos, numVerts, sb->local);
+ sb->ctime = ctime;
+ return;
+ }
+
/* the simulator */
/* update the vertex locations */
if (dtime!=0.0) {
+ if(sb->particles) {
+ pa=sb->particles->particles;
+ key = pa->hair;
+
+ psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
+ }
+
for(a=0,bp=sb->bpoint; a<numVerts; a++, bp++) {
/* store where goals are now */
VECCOPY(bp->origS, bp->origE);
/* copy the position of the goals at desired end time */
- VECCOPY(bp->origE, vertexCos[a]);
- /* vertexCos came from local world, go global */
- Mat4MulVecfl(ob->obmat, bp->origE);
+ if(sb->particles) {
+ if(key == pa->hair + pa->totkey) {
+ pa++;
+ key = pa->hair;
+
+ psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
+ }
+ VECCOPY(bp->origE, key->co);
+ Mat4MulVecfl(hairmat,bp->origE);
+
+ key++;
+ }
+ else{
+ VECCOPY(bp->origE, vertexCos[a]);
+ /* vertexCos came from local world, go global */
+ Mat4MulVecfl(ob->obmat, bp->origE);
+ }
/* just to be save give bp->origT a defined value
will be calulated in interpolate_exciter()*/
VECCOPY(bp->origT, bp->origE);
@@ -3156,9 +3367,29 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
(dtime>=9.9*G.scene->r.framelen) /* too far forward in time --> goals won't be accurate enough */
)
{
+ if(sb->particles) {
+ pa=sb->particles->particles;
+ key = pa->hair;
+
+ psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
+ }
+
for(a=0,bp=sb->bpoint; a<numVerts; a++, bp++) {
- VECCOPY(bp->pos, vertexCos[a]);
- Mat4MulVecfl(ob->obmat, bp->pos); /* yep, sofbody is global coords*/
+ if(sb->particles) {
+ if(key == pa->hair + pa->totkey) {
+ pa++;
+ key = pa->hair;
+
+ psys_mat_hair_to_global(ob, psmd->dm, sb->particles->part->from, pa, hairmat);
+ }
+ VECCOPY(bp->pos, key->co);
+ Mat4MulVecfl(hairmat, bp->pos);
+ key++;
+ }
+ else {
+ VECCOPY(bp->pos, vertexCos[a]);
+ Mat4MulVecfl(ob->obmat, bp->pos); /* yep, sofbody is global coords*/
+ }
VECCOPY(bp->origS, bp->pos);
VECCOPY(bp->origE, bp->pos);
VECCOPY(bp->origT, bp->pos);
@@ -3186,23 +3417,22 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
sb_new_scratch(sb); /* make a new */
sb->scratch->needstobuildcollider=1;
-
- /* copy some info to scratch */
- switch(ob->type) {
- case OB_MESH:
- if (ob->softflag & OB_SB_FACECOLL) mesh_faces_to_scratch(ob);
- break;
- case OB_LATTICE:
- break;
- case OB_CURVE:
- case OB_SURF:
- break;
- default:
- break;
+ if((sb->particles)==0) {
+ /* copy some info to scratch */
+ switch(ob->type) {
+ case OB_MESH:
+ if (ob->softflag & OB_SB_FACECOLL) mesh_faces_to_scratch(ob);
+ break;
+ case OB_LATTICE:
+ break;
+ case OB_CURVE:
+ case OB_SURF:
+ break;
+ default:
+ break;
+ }
}
-
-
ob->softflag &= ~OB_SB_RESET;
}
else if(dtime>0.0) {
@@ -3244,9 +3474,12 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
/* do predictive euler step */
softbody_calc_forces(ob, forcetime,timedone/dtime);
softbody_apply_forces(ob, forcetime, 1, NULL);
+
+
/* crop new slope values to do averaged slope step */
softbody_calc_forces(ob, forcetime,timedone/dtime);
softbody_apply_forces(ob, forcetime, 2, &err);
+
softbody_apply_goalsnap(ob);
if (err > SoftHeunTol) { /* error needs to be scaled to some quantity */
@@ -3311,10 +3544,10 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts
}
}
- softbody_to_object(ob, vertexCos, numVerts, 0);
+ if(sb->particles==0)
+ softbody_to_object(ob, vertexCos, numVerts, 0);
sb->ctime= ctime;
-
- if(ob->softflag & OB_SB_BAKEDO) softbody_baked_add(ob, framenr);
+ softbody_write_cache(ob, framenr);
}
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 7f3c5ddf8a7..0b1563beced 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -75,8 +75,6 @@ struct CCGDerivedMesh {
CCGSubSurf *ss;
int drawInteriorEdges, useSubsurfUv;
- Mesh *me;
-
struct {int startVert; CCGVert *vert;} *vertMap;
struct {int startVert; int startEdge; CCGEdge *edge;} *edgeMap;
struct {int startVert; int startEdge;
@@ -335,7 +333,6 @@ static void set_subsurf_uv(CCGSubSurf *ss, DerivedMesh *dm, DerivedMesh *result,
MTFace *dmtface = CustomData_get_layer_n(&dm->faceData, CD_MTFACE, n);
MTFace *tface = CustomData_get_layer_n(&result->faceData, CD_MTFACE, n);
-
if(!dmtface || !tface)
return;
@@ -1095,7 +1092,7 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
/* this vert comes from edge data */
CCGEdge *e;
int edgeSize = ccgSubSurf_getEdgeSize(ss);
- int x;
+ int x, *edgeFlag;
unsigned int flags = 0;
i = (edgeNum - ccgdm->edgeMap[0].startEdge) / (edgeSize - 1);
@@ -1109,24 +1106,12 @@ static void ccgDM_getFinalEdge(DerivedMesh *dm, int edgeNum, MEdge *med)
med->v1 = getEdgeIndex(ss, e, x, edgeSize);
med->v2 = getEdgeIndex(ss, e, x+1, edgeSize);
- if(ccgdm->me) {
- int edgeIdx = (int) ccgSubSurf_getEdgeEdgeHandle(ss, e);
-
- if(edgeIdx!=-1) {
- MEdge *medge = ccgdm->me->medge;
- MEdge *origMed = &medge[edgeIdx];
-
- flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
- | ME_EDGEDRAW | ME_EDGERENDER;
- }
- } else {
- int *edgeFlag = dm->getEdgeData(dm, edgeNum, CD_FLAGS);
- if(edgeFlag)
- flags |= (*edgeFlag & (ME_SEAM | ME_SHARP))
- | ME_EDGEDRAW | ME_EDGERENDER;
- else
- flags |= ME_EDGEDRAW | ME_EDGERENDER;
- }
+ edgeFlag = dm->getEdgeData(dm, edgeNum, CD_FLAGS);
+ if(edgeFlag)
+ flags |= (*edgeFlag & (ME_SEAM | ME_SHARP))
+ | ME_EDGEDRAW | ME_EDGERENDER;
+ else
+ flags |= ME_EDGEDRAW | ME_EDGERENDER;
med->flag = flags;
}
@@ -1147,7 +1132,7 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
int grid;
int x, y;
int lastface = ccgSubSurf_getNumFaces(ss) - 1;
- int *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
+ char *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
memset(mf, 0, sizeof(*mf));
@@ -1169,7 +1154,7 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf)
mf->v3 = getFaceIndex(ss, f, grid, x+1, y+1, edgeSize, gridSize);
mf->v4 = getFaceIndex(ss, f, grid, x+1, y+0, edgeSize, gridSize);
- if(faceFlags) mf->flag = faceFlags[i];
+ if(faceFlags) mf->flag = faceFlags[i*4];
else mf->flag = ME_SMOOTH;
}
@@ -1236,11 +1221,8 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
int gridSize = ccgSubSurf_getGridSize(ss);
int edgeSize = ccgSubSurf_getEdgeSize(ss);
int i = 0;
- MEdge *origEdges = NULL;
int *edgeFlags = dm->getEdgeDataArray(dm, CD_FLAGS);
- if(ccgdm->me) origEdges = ccgdm->me->medge;
-
totface = ccgSubSurf_getNumFaces(ss);
for(index = 0; index < totface; index++) {
CCGFace *f = ccgdm->faceMap[index].face;
@@ -1292,14 +1274,7 @@ static void ccgDM_copyFinalEdgeArray(DerivedMesh *dm, MEdge *medge)
if(!ccgSubSurf_getEdgeNumFaces(ss, e)) flags |= ME_LOOSEEDGE;
- if(origEdges){
- if(edgeIdx != -1) {
- MEdge *origMed = &origEdges[edgeIdx];
-
- flags |= (origMed->flag & (ME_SEAM | ME_SHARP))
- | ME_EDGEDRAW | ME_EDGERENDER;
- }
- } else if(edgeFlags) {
+ if(edgeFlags) {
if(edgeIdx != -1) {
flags |= (edgeFlags[i] & (ME_SEAM | ME_SHARP))
| ME_EDGEDRAW | ME_EDGERENDER;
@@ -1327,10 +1302,7 @@ static void ccgDM_copyFinalFaceArray(DerivedMesh *dm, MFace *mface)
int gridSize = ccgSubSurf_getGridSize(ss);
int edgeSize = ccgSubSurf_getEdgeSize(ss);
int i = 0;
- MFace *origFaces = NULL;
- int *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
-
- if(ccgdm->me) origFaces = ccgdm->me->mface;
+ char *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
totface = ccgSubSurf_getNumFaces(ss);
for(index = 0; index < totface; index++) {
@@ -1339,16 +1311,6 @@ static void ccgDM_copyFinalFaceArray(DerivedMesh *dm, MFace *mface)
int mat_nr = 0;
int flag = ME_SMOOTH; /* assume face is smooth by default */
- if(!faceFlags) {
- if(origFaces) {
- int origIdx = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
- MFace *origMFace = &origFaces[origIdx];
-
- mat_nr = origMFace->mat_nr;
- flag = origMFace->flag;
- }
- }
-
for(S = 0; S < numVerts; S++) {
for(y = 0; y < gridSize - 1; y++) {
for(x = 0; x < gridSize - 1; x++) {
@@ -1362,7 +1324,7 @@ static void ccgDM_copyFinalFaceArray(DerivedMesh *dm, MFace *mface)
mf->v4 = getFaceIndex(ss, f, S, x + 1, y + 0,
edgeSize, gridSize);
mf->mat_nr = mat_nr;
- if(faceFlags) mf->flag = faceFlags[index];
+ if(faceFlags) mf->flag = faceFlags[index*4];
else mf->flag = flag;
i++;
@@ -1623,28 +1585,51 @@ static void ccgDM_drawLooseEdges(DerivedMesh *dm) {
ccgEdgeIterator_free(ei);
}
+static void ccgDM_glNormalFast(float *a, float *b, float *c, float *d)
+{
+ float a_cX = c[0]-a[0], a_cY = c[1]-a[1], a_cZ = c[2]-a[2];
+ float b_dX = d[0]-b[0], b_dY = d[1]-b[1], b_dZ = d[2]-b[2];
+ float no[3];
+
+ no[0] = b_dY*a_cZ - b_dZ*a_cY;
+ no[1] = b_dZ*a_cX - b_dX*a_cZ;
+ no[2] = b_dX*a_cY - b_dY*a_cX;
+
+ /* don't normalize, GL_NORMALIZE is be enabled */
+ glNormal3fv(no);
+}
+
/* Only used by non-editmesh types */
static void ccgDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int)) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
int gridSize = ccgSubSurf_getGridSize(ss);
- MFace *mface = ccgdm->me->mface;
+ char *faceFlags = DM_get_face_data_layer(dm, CD_FLAGS);
for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
int index = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
- MFace *mf = &mface[index];
+ int drawSmooth, mat_nr;
+
+ if(faceFlags) {
+ drawSmooth = (faceFlags[index*4] & ME_SMOOTH);
+ mat_nr= faceFlags[index*4 + 1];
+ }
+ else {
+ drawSmooth = 1;
+ mat_nr= 0;
+ }
- if (!setMaterial(mf->mat_nr+1))
+ if (!setMaterial(mat_nr+1))
continue;
- glShadeModel((mf->flag&ME_SMOOTH)?GL_SMOOTH:GL_FLAT);
+ glShadeModel(drawSmooth? GL_SMOOTH: GL_FLAT);
for (S=0; S<numVerts; S++) {
VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
- if (mf->flag&ME_SMOOTH) {
+ if (drawSmooth) {
for (y=0; y<gridSize-1; y++) {
glBegin(GL_QUAD_STRIP);
for (x=0; x<gridSize; x++) {
@@ -1666,14 +1651,8 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int)) {
float *b = faceGridData[(y+0)*gridSize + x + 1].co;
float *c = faceGridData[(y+1)*gridSize + x + 1].co;
float *d = faceGridData[(y+1)*gridSize + x].co;
- float a_cX = c[0]-a[0], a_cY = c[1]-a[1], a_cZ = c[2]-a[2];
- float b_dX = d[0]-b[0], b_dY = d[1]-b[1], b_dZ = d[2]-b[2];
- float no[3];
- no[0] = b_dY*a_cZ - b_dZ*a_cY;
- no[1] = b_dZ*a_cX - b_dX*a_cZ;
- no[2] = b_dX*a_cY - b_dY*a_cX;
- glNormal3fv(no);
+ ccgDM_glNormalFast(a, b, c, d);
glVertex3fv(d);
glVertex3fv(c);
@@ -1753,132 +1732,188 @@ static void ccgDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned ch
ccgFaceIterator_free(fi);
}
-static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(MTFace *tface, MCol *mcol, int matnr))
-{
- /* unimplemented, no textures in editmode anyway */
-}
-static void ccgDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawParams)(void *userData, int index), void *userData)
+static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
+ int (*drawParams)(MTFace *tface, MCol *mcol, int matnr),
+ int (*drawParamsMapped)(void *userData, int index),
+ void *userData)
{
- /* unfinished code, no textures in editmode anyway */
-
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
- CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
- int gridSize = ccgSubSurf_getGridSize(ss);
- MFace *mface = ccgdm->me->mface;
- MCol *mcol = ccgdm->me->mcol;
-// float uv[4][2];
-// float col[4][3];
+ MCol *mcol = DM_get_face_data_layer(dm, CD_MCOL);
+ MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
+ char *faceFlags = DM_get_face_data_layer(dm, CD_FLAGS);
+ int i, totface, flag, gridSize = ccgSubSurf_getGridSize(ss);
+ int gridFaces = gridSize - 1;
- glBegin(GL_QUADS);
- for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
- CCGFace *f = ccgFaceIterator_getCurrent(fi);
+ totface = ccgSubSurf_getNumFaces(ss);
+ for(i = 0; i < totface; i++) {
+ CCGFace *f = ccgdm->faceMap[i].face;
int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
- int index = (int) ccgSubSurf_getFaceFaceHandle(ss, f);
- MFace *mf = &mface[index];
+ int drawSmooth, index = ccgDM_getFaceMapIndex(ccgdm, ss, f);
+ int origIndex = (int)ccgSubSurf_getFaceFaceHandle(ss, f);
unsigned char *cp= NULL;
- int findex = ccgDM_getFaceMapIndex(ccgdm, ss, f);
- int flag = (findex == -1)? 0: setDrawParams(userData, findex);
+ int mat_nr;
+
+ if(faceFlags) {
+ drawSmooth = (faceFlags[origIndex*4] & ME_SMOOTH);
+ mat_nr= faceFlags[origIndex*4 + 1];
+ }
+ else {
+ drawSmooth = 1;
+ mat_nr= 0;
+ }
- if (flag==0)
+ if(drawParams)
+ flag = drawParams(tf, mcol, mat_nr);
+ else
+ flag= (drawParamsMapped)? drawParamsMapped(userData, index): 1;
+
+ if (flag == 0) { /* flag 0 == the face is hidden or invisible */
+ if(tf) tf += gridFaces*gridFaces*numVerts;
+ if(mcol) mcol += gridFaces*gridFaces*numVerts*4;
continue;
- else if (flag==1 && mcol)
- cp= (unsigned char*) &mcol[index*4];
+ }
+
+ /* flag 1 == use vertex colors */
+ if(mcol) {
+ if(flag==1) cp= (unsigned char*)mcol;
+ mcol += gridFaces*gridFaces*numVerts*4;
+ }
for (S=0; S<numVerts; S++) {
VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
- for (y=0; y<gridSize-1; y++) {
- for (x=0; x<gridSize-1; x++) {
- VertData *a = &faceGridData[(y+0)*gridSize + x + 0];
- VertData *b = &faceGridData[(y+0)*gridSize + x + 1];
- VertData *c = &faceGridData[(y+1)*gridSize + x + 1];
- VertData *d = &faceGridData[(y+1)*gridSize + x + 0];
+ VertData *a, *b;
- if (!(mf->flag&ME_SMOOTH)) {
- float a_cX = c->co[0]-a->co[0], a_cY = c->co[1]-a->co[1], a_cZ = c->co[2]-a->co[2];
- float b_dX = d->co[0]-b->co[0], b_dY = d->co[1]-b->co[1], b_dZ = d->co[2]-b->co[2];
- float no[3];
+ if (drawSmooth) {
+ glShadeModel(GL_SMOOTH);
+ for (y=0; y<gridFaces; y++) {
+ glBegin(GL_QUAD_STRIP);
+ for (x=0; x<gridFaces; x++) {
+ a = &faceGridData[(y+0)*gridSize + x];
+ b = &faceGridData[(y+1)*gridSize + x];
- no[0] = b_dY*a_cZ - b_dZ*a_cY;
- no[1] = b_dZ*a_cX - b_dX*a_cZ;
- no[2] = b_dX*a_cY - b_dY*a_cX;
+ if(tf) glTexCoord2fv(tf->uv[0]);
+ if(cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glNormal3fv(a->no);
+ glVertex3fv(a->co);
- glNormal3fv(no);
+ if(tf) glTexCoord2fv(tf->uv[1]);
+ if(cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glNormal3fv(b->no);
+ glVertex3fv(b->co);
+
+ if(x != gridFaces-1) {
+ if(tf) tf++;
+ if(cp) cp += 16;
+ }
}
-// if (tf) glTexCoord2fv(tf->uv[0]);
-// if (cp) glColor3ub(cp[3], cp[2], cp[1]);
-// if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v1].no);
-// glVertex3fv(mvert[mf->v1].co);
+ a = &faceGridData[(y+0)*gridSize + x];
+ b = &faceGridData[(y+1)*gridSize + x];
-/*
- {
- float x_v = (float) fx/(gridSize-1);
- float y_v = (float) fy/(gridSize-1);
- float data[6];
+ if(tf) glTexCoord2fv(tf->uv[3]);
+ if(cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glNormal3fv(a->no);
+ glVertex3fv(a->co);
- for (k=0; k<numDataComponents; k++) {
- data[k] = (center_data[k]*(1.0f-x_v) + edge_data[S][k]*x_v)*(1.0f-y_v) +
- (edge_data[prevS][k]*(1.0f-x_v) + corner_data[S][k]*x_v)*y_v;
- }
-*/
-
-// if (cp) glColor3ub(cp[3], cp[2], cp[1]);
- if (mf->flag&ME_SMOOTH) glNormal3fv(d->no);
- glVertex3fv(d->co);
-// if (cp) glColor3ub(cp[7], cp[6], cp[5]);
- if (mf->flag&ME_SMOOTH) glNormal3fv(c->no);
- glVertex3fv(c->co);
-// if (cp) glColor3ub(cp[11], cp[10], cp[9]);
- if (mf->flag&ME_SMOOTH) glNormal3fv(b->no);
+ if(tf) glTexCoord2fv(tf->uv[2]);
+ if(cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glNormal3fv(b->no);
glVertex3fv(b->co);
-// if (cp) glColor3ub(cp[15], cp[14], cp[13]);
- if (mf->flag&ME_SMOOTH) glNormal3fv(a->no);
- glVertex3fv(a->co);
+
+ if(tf) tf++;
+ if(cp) cp += 16;
+
+ glEnd();
+ }
+ } else {
+ glShadeModel(GL_FLAT);
+ glBegin(GL_QUADS);
+ for (y=0; y<gridFaces; y++) {
+ for (x=0; x<gridFaces; x++) {
+ float *a = faceGridData[(y+0)*gridSize + x].co;
+ float *b = faceGridData[(y+0)*gridSize + x + 1].co;
+ float *c = faceGridData[(y+1)*gridSize + x + 1].co;
+ float *d = faceGridData[(y+1)*gridSize + x].co;
+
+ ccgDM_glNormalFast(a, b, c, d);
+
+ if(tf) glTexCoord2fv(tf->uv[1]);
+ if(cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glVertex3fv(d);
+
+ if(tf) glTexCoord2fv(tf->uv[2]);
+ if(cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glVertex3fv(c);
+
+ if(tf) glTexCoord2fv(tf->uv[3]);
+ if(cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glVertex3fv(b);
+
+ if(tf) glTexCoord2fv(tf->uv[0]);
+ if(cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glVertex3fv(a);
+
+ if(tf) tf++;
+ if(cp) cp += 16;
+ }
}
+ glEnd();
}
}
}
- glEnd();
+}
- ccgFaceIterator_free(fi);
-/*
- MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
- Mesh *me = mdm->me;
- MVert *mvert= mdm->verts;
- MFace *mface= me->mface;
- MTFace *tface = me->mtface;
- float *nors = mdm->nors;
- int a;
-
- for (a=0; a<me->totface; a++) {
- MFace *mf= &mface[a];
- if (tf) glTexCoord2fv(tf->uv[1]);
- if (cp) glColor3ub(cp[7], cp[6], cp[5]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v2].no);
- glVertex3fv(mvert[mf->v2].co);
-
- if (tf) glTexCoord2fv(tf->uv[2]);
- if (cp) glColor3ub(cp[11], cp[10], cp[9]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v3].no);
- glVertex3fv(mvert[mf->v3].co);
-
- if(mf->v4) {
- if (tf) glTexCoord2fv(tf->uv[3]);
- if (cp) glColor3ub(cp[15], cp[14], cp[13]);
- if (mf->flag&ME_SMOOTH) glNormal3sv(mvert[mf->v4].no);
- glVertex3fv(mvert[mf->v4].co);
+static void ccgDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
+{
+ ccgDM_drawFacesTex_common(dm, setDrawOptions, NULL, NULL);
+}
+
+static void ccgDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
+{
+ ccgDM_drawFacesTex_common(dm, NULL, setDrawOptions, userData);
+}
+
+static void ccgDM_drawUVEdges(DerivedMesh *dm)
+{
+
+ MFace *mf = dm->getFaceArray(dm);
+ MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
+ int i;
+
+ if (tf) {
+ glBegin(GL_LINES);
+ for(i = 0; i < dm->numFaceData; i++, mf++, tf++) {
+ if(!(mf->flag&ME_HIDE)) {
+ glVertex2fv(tf->uv[0]);
+ glVertex2fv(tf->uv[1]);
+
+ glVertex2fv(tf->uv[1]);
+ glVertex2fv(tf->uv[2]);
+
+ if(!mf->v4) {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[0]);
+ } else {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[3]);
+
+ glVertex2fv(tf->uv[3]);
+ glVertex2fv(tf->uv[0]);
+ }
+ }
}
glEnd();
}
-*/
}
+
static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors) {
+ GLubyte act_face_stipple[32*32/8] = DM_FACE_STIPPLE;
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
CCGSubSurf *ss = ccgdm->ss;
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
int i, gridSize = ccgSubSurf_getGridSize(ss);
- int *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
+ char *faceFlags = dm->getFaceDataArray(dm, CD_FLAGS);
for (i=0; !ccgFaceIterator_isStopped(fi); i++,ccgFaceIterator_next(fi)) {
CCGFace *f = ccgFaceIterator_getCurrent(fi);
@@ -1888,53 +1923,65 @@ static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *u
origIndex = (int)ccgSubSurf_getFaceFaceHandle(ss, f);
- if(faceFlags) drawSmooth = (faceFlags[origIndex] & ME_SMOOTH);
+ if(faceFlags) drawSmooth = (faceFlags[origIndex*4] & ME_SMOOTH);
else drawSmooth = 1;
-
- if (index!=-1 && (!setDrawOptions || setDrawOptions(userData, index, &drawSmooth))) {
- for (S=0; S<numVerts; S++) {
- VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
- if (drawSmooth) {
- glShadeModel(GL_SMOOTH);
- for (y=0; y<gridSize-1; y++) {
- glBegin(GL_QUAD_STRIP);
- for (x=0; x<gridSize; x++) {
- VertData *a = &faceGridData[(y+0)*gridSize + x];
- VertData *b = &faceGridData[(y+1)*gridSize + x];
-
- glNormal3fv(a->no);
- glVertex3fv(a->co);
- glNormal3fv(b->no);
- glVertex3fv(b->co);
+
+ if (index!=-1) {
+ int draw;
+ draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, index, &drawSmooth);
+
+ if (draw) {
+ if (draw==2) {
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(act_face_stipple);
+ }
+
+ for (S=0; S<numVerts; S++) {
+ VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
+ if (drawSmooth) {
+ glShadeModel(GL_SMOOTH);
+ for (y=0; y<gridSize-1; y++) {
+ glBegin(GL_QUAD_STRIP);
+ for (x=0; x<gridSize; x++) {
+ VertData *a = &faceGridData[(y+0)*gridSize + x];
+ VertData *b = &faceGridData[(y+1)*gridSize + x];
+
+ glNormal3fv(a->no);
+ glVertex3fv(a->co);
+ glNormal3fv(b->no);
+ glVertex3fv(b->co);
+ }
+ glEnd();
}
- glEnd();
- }
- } else {
- glShadeModel(GL_FLAT);
- glBegin(GL_QUADS);
- for (y=0; y<gridSize-1; y++) {
- for (x=0; x<gridSize-1; x++) {
- float *a = faceGridData[(y+0)*gridSize + x].co;
- float *b = faceGridData[(y+0)*gridSize + x + 1].co;
- float *c = faceGridData[(y+1)*gridSize + x + 1].co;
- float *d = faceGridData[(y+1)*gridSize + x].co;
- float a_cX = c[0]-a[0], a_cY = c[1]-a[1], a_cZ = c[2]-a[2];
- float b_dX = d[0]-b[0], b_dY = d[1]-b[1], b_dZ = d[2]-b[2];
- float no[3];
-
- no[0] = b_dY*a_cZ - b_dZ*a_cY;
- no[1] = b_dZ*a_cX - b_dX*a_cZ;
- no[2] = b_dX*a_cY - b_dY*a_cX;
- glNormal3fv(no);
-
- glVertex3fv(d);
- glVertex3fv(c);
- glVertex3fv(b);
- glVertex3fv(a);
+ } else {
+ glShadeModel(GL_FLAT);
+ glBegin(GL_QUADS);
+ for (y=0; y<gridSize-1; y++) {
+ for (x=0; x<gridSize-1; x++) {
+ float *a = faceGridData[(y+0)*gridSize + x].co;
+ float *b = faceGridData[(y+0)*gridSize + x + 1].co;
+ float *c = faceGridData[(y+1)*gridSize + x + 1].co;
+ float *d = faceGridData[(y+1)*gridSize + x].co;
+ float a_cX = c[0]-a[0], a_cY = c[1]-a[1], a_cZ = c[2]-a[2];
+ float b_dX = d[0]-b[0], b_dY = d[1]-b[1], b_dZ = d[2]-b[2];
+ float no[3];
+
+ no[0] = b_dY*a_cZ - b_dZ*a_cY;
+ no[1] = b_dZ*a_cX - b_dX*a_cZ;
+ no[2] = b_dX*a_cY - b_dY*a_cX;
+ glNormal3fv(no);
+
+ glVertex3fv(d);
+ glVertex3fv(c);
+ glVertex3fv(b);
+ glVertex3fv(a);
+ }
}
+ glEnd();
}
- glEnd();
}
+ if (draw==2)
+ glDisable(GL_POLYGON_STIPPLE);
}
}
}
@@ -2035,7 +2082,7 @@ static void ccgDM_release(DerivedMesh *dm) {
static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int drawInteriorEdges,
- int useSubsurfUv, Mesh *me,
+ int useSubsurfUv,
DerivedMesh *dm)
{
CCGDerivedMesh *ccgdm = MEM_callocN(sizeof(*ccgdm), "ccgdm");
@@ -2046,7 +2093,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
int i;
int vertNum, edgeNum, faceNum;
int *vertOrigIndex, *edgeOrigIndex, *faceOrigIndex;
- int *faceFlags, *edgeFlags;
+ int *edgeFlags;
+ char *faceFlags;
int edgeSize;
int gridSize;
int gridFaces;
@@ -2059,20 +2107,14 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
MFace *mface = NULL;
FaceVertWeight *qweight, *tweight;
- if(dm) {
- DM_from_template(&ccgdm->dm, dm, ccgSubSurf_getNumFinalVerts(ss),
- ccgSubSurf_getNumFinalEdges(ss),
- ccgSubSurf_getNumFinalFaces(ss));
- DM_add_face_layer(&ccgdm->dm, CD_FLAGS, CD_CALLOC, NULL);
- DM_add_edge_layer(&ccgdm->dm, CD_FLAGS, CD_CALLOC, NULL);
-
- CustomData_set_layer_flag(&ccgdm->dm.faceData, CD_FLAGS, CD_FLAG_NOCOPY);
- CustomData_set_layer_flag(&ccgdm->dm.edgeData, CD_FLAGS, CD_FLAG_NOCOPY);
- } else {
- DM_init(&ccgdm->dm, ccgSubSurf_getNumFinalVerts(ss),
- ccgSubSurf_getNumFinalEdges(ss),
- ccgSubSurf_getNumFinalFaces(ss));
- }
+ DM_from_template(&ccgdm->dm, dm, ccgSubSurf_getNumFinalVerts(ss),
+ ccgSubSurf_getNumFinalEdges(ss),
+ ccgSubSurf_getNumFinalFaces(ss));
+ DM_add_face_layer(&ccgdm->dm, CD_FLAGS, CD_CALLOC, NULL);
+ DM_add_edge_layer(&ccgdm->dm, CD_FLAGS, CD_CALLOC, NULL);
+
+ CustomData_set_layer_flag(&ccgdm->dm.faceData, CD_FLAGS, CD_FLAG_NOCOPY);
+ CustomData_set_layer_flag(&ccgdm->dm.edgeData, CD_FLAGS, CD_FLAG_NOCOPY);
ccgdm->dm.getMinMax = ccgDM_getMinMax;
ccgdm->dm.getNumVerts = ccgDM_getNumVerts;
@@ -2105,6 +2147,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
ccgdm->dm.drawFacesTex = ccgDM_drawFacesTex;
ccgdm->dm.drawMappedFaces = ccgDM_drawMappedFaces;
ccgdm->dm.drawMappedFacesTex = ccgDM_drawMappedFacesTex;
+ ccgdm->dm.drawUVEdges = ccgDM_drawUVEdges;
ccgdm->dm.drawMappedEdgesInterp = ccgDM_drawMappedEdgesInterp;
ccgdm->dm.drawMappedEdges = ccgDM_drawMappedEdges;
@@ -2114,7 +2157,6 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
ccgdm->ss = ss;
ccgdm->drawInteriorEdges = drawInteriorEdges;
ccgdm->useSubsurfUv = useSubsurfUv;
- ccgdm->me = me;
totvert = ccgSubSurf_getNumVerts(ss);
ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), "vertMap");
@@ -2159,15 +2201,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
edgeNum = 0;
faceNum = 0;
- if(dm) {
- mvert = dm->getVertArray(dm);
- medge = dm->getEdgeArray(dm);
- mface = dm->getFaceArray(dm);
- } else if(me) {
- mvert = me->mvert;
- medge = me->medge;
- mface = me->mface;
- }
+ mvert = dm->getVertArray(dm);
+ medge = dm->getEdgeArray(dm);
+ mface = dm->getFaceArray(dm);
vertOrigIndex = DM_get_vert_data_layer(&ccgdm->dm, CD_ORIGINDEX);
edgeOrigIndex = DM_get_edge_data_layer(&ccgdm->dm, CD_ORIGINDEX);
@@ -2277,7 +2313,8 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
}
}
- faceFlags[index] = mface[origIndex].flag;
+ faceFlags[index*4] = mface[origIndex].flag;
+ faceFlags[index*4 + 1] = mface[origIndex].mat_nr;
edgeNum += numFinalEdges;
}
@@ -2381,7 +2418,7 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
return (DerivedMesh *)getCCGDerivedMesh(smd->emCache,
drawInteriorEdges,
- useSubsurfUv, NULL, dm);
+ useSubsurfUv, dm);
} else if(useRenderParams) {
/* Do not use cache in render mode. */
CCGSubSurf *ss = _getSubSurf(NULL, smd->renderLevels, 0, 1, useSimple);
@@ -2418,8 +2455,13 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
+
return ss_to_cdderivedmesh(ss, 0, drawInteriorEdges,
useSubsurfUv, dm);
+
+ /*return (DerivedMesh *)getCCGDerivedMesh(smd->mCache,
+ drawInteriorEdges,
+ useSubsurfUv, dm);*/
} else {
if (smd->mCache && isFinalCalc) {
ccgSubSurf_free(smd->mCache);
@@ -2429,6 +2471,11 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
ss = _getSubSurf(NULL, smd->levels, 0, 1, useSimple);
ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
+ /*smd->mCache = ss;
+ result = (DerivedMesh *)getCCGDerivedMesh(smd->mCache,
+ drawInteriorEdges,
+ useSubsurfUv, dm);*/
+
result = ss_to_cdderivedmesh(ss, 0, drawInteriorEdges,
useSubsurfUv, dm);
@@ -2441,11 +2488,11 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
{
- /* Finds the subsurf limit positions for the verts in a mesh
- * and puts them in an array of floats. Please note that the
- * calculated vert positions is incorrect for the verts
- * on the boundary of the mesh.
- */
+ /* Finds the subsurf limit positions for the verts in a mesh
+ * and puts them in an array of floats. Please note that the
+ * calculated vert positions is incorrect for the verts
+ * on the boundary of the mesh.
+ */
CCGSubSurf *ss = _getSubSurf(NULL, 1, 0, 1, 0);
float edge_sum[3], face_sum[3];
CCGVertIterator *vi;
@@ -2474,6 +2521,11 @@ void subsurf_calculate_limit_positions(Mesh *me, float (*positions_r)[3])
VecAddf(face_sum, face_sum, ccgSubSurf_getFaceCenterData(ss, f));
}
+ /* ad-hoc correction for boundary vertices, to at least avoid them
+ moving completely out of place (brecht) */
+ if(numFaces && numFaces != N)
+ VecMulf(face_sum, (float)N/(float)numFaces);
+
co = ccgSubSurf_getVertData(ss, v);
positions_r[idx][0] = (co[0]*N*N + edge_sum[0]*4 + face_sum[0])/(N*(N+5));
positions_r[idx][1] = (co[1]*N*N + edge_sum[1]*4 + face_sum[1])/(N*(N+5));
diff --git a/source/blender/blenkernel/intern/texture.c b/source/blender/blenkernel/intern/texture.c
index bda933802ee..baa6fae6fc8 100644
--- a/source/blender/blenkernel/intern/texture.c
+++ b/source/blender/blenkernel/intern/texture.c
@@ -238,13 +238,10 @@ void init_mapping(TexMapping *texmap)
/* ****************** COLORBAND ******************* */
-ColorBand *add_colorband(int rangetype)
+void init_colorband(ColorBand *coba, int rangetype)
{
- ColorBand *coba;
int a;
- coba= MEM_callocN( sizeof(ColorBand), "colorband");
-
coba->data[0].pos= 0.0;
coba->data[1].pos= 1.0;
@@ -281,6 +278,15 @@ ColorBand *add_colorband(int rangetype)
coba->tot= 2;
+}
+
+ColorBand *add_colorband(int rangetype)
+{
+ ColorBand *coba;
+
+ coba= MEM_callocN( sizeof(ColorBand), "colorband");
+ init_colorband(coba, rangetype);
+
return coba;
}
@@ -390,6 +396,7 @@ 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);
+ BKE_previewimg_free(&tex->preview);
BKE_icon_delete((struct ID*)tex);
tex->id.icon_id = 0;
}
@@ -404,7 +411,7 @@ void default_tex(Tex *tex)
tex->stype= 0;
tex->flag= TEX_CHECKER_ODD;
- tex->imaflag= TEX_INTERPOL+TEX_MIPMAP;
+ tex->imaflag= TEX_INTERPOL+TEX_MIPMAP+TEX_USEALPHA;
tex->extend= TEX_REPEAT;
tex->cropxmin= tex->cropymin= 0.0;
tex->cropxmax= tex->cropymax= 1.0;
@@ -418,7 +425,8 @@ void default_tex(Tex *tex)
tex->turbul= 5.0;
tex->nabla= 0.025; // also in do_versions
tex->bright= 1.0;
- tex->contrast= tex->filtersize= 1.0;
+ tex->contrast= 1.0;
+ tex->filtersize= 1.0;
tex->rfac= 1.0;
tex->gfac= 1.0;
tex->bfac= 1.0;
@@ -462,6 +470,8 @@ void default_tex(Tex *tex)
tex->iuser.fie_ima= 2;
tex->iuser.ok= 1;
tex->iuser.frames= 100;
+
+ tex->preview = NULL;
}
/* ------------------------------------------------------------------------- */
@@ -541,6 +551,8 @@ Tex *copy_texture(Tex *tex)
if(texn->coba) texn->coba= MEM_dupallocN(texn->coba);
if(texn->env) texn->env= BKE_copy_envmap(texn->env);
+ if(tex->preview) texn->preview = BKE_previewimg_copy(tex->preview);
+
return texn;
}
diff --git a/source/blender/blenkernel/intern/verse_geometry_node.c b/source/blender/blenkernel/intern/verse_geometry_node.c
index 8d58d140c79..613d4eadbec 100644
--- a/source/blender/blenkernel/intern/verse_geometry_node.c
+++ b/source/blender/blenkernel/intern/verse_geometry_node.c
@@ -141,6 +141,11 @@ static void recalculate_verseface_normals(VNode *vnode)
*/
void add_item_to_send_queue(ListBase *lb, void *item, short type)
{
+ struct VNode *vnode;
+ struct VLayer *vlayer;
+ struct VerseVert *vvert;
+ struct VerseFace *vface;
+
/* this prevent from adding duplicated faces */
if(type==VERSE_FACE) {
struct Link *link = (Link*)lb->first;
@@ -188,35 +193,59 @@ void add_item_to_send_queue(ListBase *lb, void *item, short type)
send_verse_taggroup((VTagGroup*)item);
break;
case VERSE_VERT_UINT32: /* parent item has to exist */
- if( ((verse_parent*)((uint32_item*)item)->parent)->id != -1)
+ vnode = (((uint32_item*)item)->vlayer)->vnode;
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), 0 );
+ vvert = (VerseVert*)BLI_dlist_find_link(&(vlayer->dl), ((uint32_item*)item)->id );
+ if(vvert != NULL)
send_verse_vert_uint32((uint32_item*)item, type);
break;
case VERSE_VERT_REAL32: /* parent item has to exist */
- if( ((verse_parent*)((real32_item*)item)->parent)->id != -1)
+ vnode = (((real32_item*)item)->vlayer)->vnode;
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), 0 );
+ vvert = (VerseVert*)BLI_dlist_find_link(&(vlayer->dl), ((real32_item*)item)->id );
+ if( vvert != NULL)
send_verse_vert_real32((real32_item*)item, type);
break;
case VERSE_VERT_VEC_REAL32: /* parent item has to exist */
- if( ((verse_parent*)((vec_real32_item*)item)->parent)->id != -1)
+ vnode = (((vec_real32_item*)item)->vlayer)->vnode;
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), 0 );
+ vvert = (VerseVert*)BLI_dlist_find_link(&(vlayer->dl), ((vec_real32_item*)item)->id );
+ if(vvert != NULL)
send_verse_vert_vec_real32((vec_real32_item*)item, type);
break;
case VERSE_FACE_UINT8: /* parent item has to exist */
- if( ((verse_parent*)((uint8_item*)item)->parent)->id != -1)
+ vnode = (((uint8_item*)item)->vlayer)->vnode;
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), 1 );
+ vface = (VerseFace*)BLI_dlist_find_link(&(vlayer->dl), ((uint8_item*)item)->id );
+ if(vface != NULL)
send_verse_face_uint8((uint8_item*)item, type);
break;
case VERSE_FACE_UINT32: /* parent item has to exist */
- if( ((verse_parent*)((uint32_item*)item)->parent)->id != -1)
+ vnode = (((uint32_item*)item)->vlayer)->vnode;
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), 1 );
+ vface = (VerseFace*)BLI_dlist_find_link(&(vlayer->dl), ((uint32_item*)item)->id );
+ if(vface != NULL)
send_verse_face_uint32((uint32_item*)item, type);
break;
case VERSE_FACE_REAL32: /* parent item has to exist */
- if( ((verse_parent*)((real32_item*)item)->parent)->id != -1)
+ vnode = (((real32_item*)item)->vlayer)->vnode;
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), 1 );
+ vface = (VerseFace*)BLI_dlist_find_link(&(vlayer->dl), ((real32_item*)item)->id );
+ if(vface != NULL)
send_verse_face_real32((real32_item*)item, type);
break;
case VERSE_FACE_QUAT_UINT32: /* parent item has to exist */
- if( ((verse_parent*)((quat_uint32_item*)item)->parent)->id != -1)
+ vnode = (((quat_uint32_item*)item)->vlayer)->vnode;
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), 1 );
+ vface = (VerseFace*)BLI_dlist_find_link(&(vlayer->dl), ((quat_uint32_item*)item)->id );
+ if(vface != NULL)
send_verse_face_corner_quat_uint32((quat_uint32_item*)item, type);
break;
case VERSE_FACE_QUAT_REAL32: /* parent item has to exist */
- if( ((verse_parent*)((quat_real32_item*)item)->parent)->id != -1)
+ vnode = (((quat_real32_item*)item)->vlayer)->vnode;
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), 1 );
+ vface = (VerseFace*)BLI_dlist_find_link(&(vlayer->dl), ((quat_real32_item*)item)->id );
+ if(vface != NULL)
send_verse_face_corner_quat_real32((quat_real32_item*)item, type);
break;
}
@@ -479,12 +508,10 @@ static VerseVert* find_verse_vert_in_queue(
*/
void send_verse_face_corner_quat_real32(quat_real32_item *item, short type)
{
- struct VerseFace *vface = (VerseFace*)item->parent;
-
verse_send_g_polygon_set_corner_real32(
- vface->vlayer->vnode->id,
- item->layer_id,
- vface->id,
+ item->vlayer->vnode->id,
+ item->vlayer->id,
+ item->id,
item->value[0],
item->value[1],
item->value[2],
@@ -496,12 +523,10 @@ void send_verse_face_corner_quat_real32(quat_real32_item *item, short type)
*/
void send_verse_face_corner_quat_uint32(quat_uint32_item *item, short type)
{
- struct VerseFace *vface = (VerseFace*)item->parent;
-
verse_send_g_polygon_set_corner_uint32(
- vface->vlayer->vnode->id,
- item->layer_id,
- vface->id,
+ item->vlayer->vnode->id,
+ item->vlayer->id,
+ item->id,
item->value[0],
item->value[1],
item->value[2],
@@ -513,12 +538,10 @@ void send_verse_face_corner_quat_uint32(quat_uint32_item *item, short type)
*/
void send_verse_face_real32(real32_item *item, short type)
{
- struct VerseFace *vface = (VerseFace*)item->parent;
-
verse_send_g_polygon_set_face_real32(
- vface->vlayer->vnode->id,
- item->layer_id,
- vface->id,
+ item->vlayer->vnode->id,
+ item->vlayer->id,
+ item->id,
item->value);
}
@@ -527,12 +550,10 @@ void send_verse_face_real32(real32_item *item, short type)
*/
void send_verse_face_uint32(uint32_item *item, short type)
{
- struct VerseFace *vface = (VerseFace*)item->parent;
-
verse_send_g_polygon_set_face_uint32(
- vface->vlayer->vnode->id,
- item->layer_id,
- vface->id,
+ item->vlayer->vnode->id,
+ item->vlayer->id,
+ item->id,
item->value);
}
@@ -541,12 +562,10 @@ void send_verse_face_uint32(uint32_item *item, short type)
*/
void send_verse_face_uint8(uint8_item *item, short type)
{
- struct VerseFace *vface = (VerseFace*)item->parent;
-
verse_send_g_polygon_set_face_uint8(
- vface->vlayer->vnode->id,
- item->layer_id,
- vface->id,
+ item->vlayer->vnode->id,
+ item->vlayer->id,
+ item->id,
item->value);
}
@@ -555,12 +574,10 @@ void send_verse_face_uint8(uint8_item *item, short type)
*/
void send_verse_vert_vec_real32(vec_real32_item *item, short type)
{
- struct VerseVert *vvert = (VerseVert*)item->parent;
-
verse_send_g_vertex_set_xyz_real32(
- vvert->vlayer->vnode->id,
- item->layer_id,
- vvert->id,
+ item->vlayer->vnode->id,
+ item->vlayer->id,
+ item->id,
item->value[0],
item->value[1],
item->value[2]);
@@ -571,12 +588,10 @@ void send_verse_vert_vec_real32(vec_real32_item *item, short type)
*/
void send_verse_vert_real32(real32_item *item, short type)
{
- struct VerseVert *vvert = (VerseVert*)item->parent;
-
verse_send_g_vertex_set_real32(
- vvert->vlayer->vnode->id,
- item->layer_id,
- vvert->id,
+ item->vlayer->vnode->id,
+ item->vlayer->id,
+ item->id,
item->value);
}
@@ -585,12 +600,10 @@ void send_verse_vert_real32(real32_item *item, short type)
*/
void send_verse_vert_uint32(uint32_item *item, short type)
{
- struct VerseVert *vvert = (VerseVert*)item->parent;
-
verse_send_g_vertex_set_uint32(
- vvert->vlayer->vnode->id,
- item->layer_id,
- vvert->id,
+ item->vlayer->vnode->id,
+ item->vlayer->id,
+ item->id,
item->value);
}
@@ -663,7 +676,6 @@ static void send_verse_face(VerseFace *vface)
vface->flag |= FACE_SENT;
if(vface->v3 != -1) {
-/* printf("\tSEND: VerseFace: %d, %d, %d, %d, %d\n", vface->id, vface->v0, vface->v3, vface->v2, vface->v1);*/
verse_send_g_polygon_set_corner_uint32(
vface->vlayer->vnode->id,
vface->vlayer->id,
@@ -674,7 +686,6 @@ static void send_verse_face(VerseFace *vface)
vface->v1); /* verse use clock-wise winding */
}
else {
-/* printf("\tSEND: VerseFace: %d, %d, %d, %d, %d\n", vface->id, vface->v0, vface->v2, vface->v1, vface->v3);*/
verse_send_g_polygon_set_corner_uint32(
vface->vlayer->vnode->id,
vface->vlayer->id,
@@ -948,162 +959,80 @@ VGeomData *create_geometry_data(void)
return geom;
}
-/*
- * callback function: vertex crease was set
- */
-static void cb_g_crease_set_vertex(
- void *user_data,
- VNodeID node_id,
- const char *layer,
- uint32 def_crease)
+/* Create item containing 4 floats */
+static quat_real32_item *create_quat_real32_item(
+ VLayer *vlayer,
+ uint32 item_id,
+ real32 v0,
+ real32 v1,
+ real32 v2,
+ real32 v3)
{
-/* struct VerseSession *session = (VerseSession*)current_verse_session();
- struct VNode *vnode;*/
-}
+ struct quat_real32_item *item;
-/*
- * callback function: edge crease was set
- */
-static void cb_g_crease_set_edge(
- void *user_data,
- VNodeID node_id,
- const char *layer,
- uint32 def_crease)
-{
-/* struct VerseSession *session = (VerseSession*)current_verse_session();
- struct VNode *vnode;*/
-}
+ item = (quat_real32_item*)MEM_mallocN(sizeof(quat_real32_item), "quat_real32_item");
-/*
- * callback function: float value for polygon was set up
- */
-static void cb_g_polygon_set_face_real32(
- void *user_def,
- VNodeID node_id,
- VLayerID layer_id,
- uint32 polygon_id,
- real32 value)
-{
-/* struct VerseSession *session = (VerseSession*)current_verse_session();
- struct VNode *vnode;*/
-}
+ item->vlayer = vlayer;
+ item->id = item_id;
+ item->value[0] = v0;
+ item->value[1] = v1;
+ item->value[2] = v2;
+ item->value[3] = v3;
-/*
- * callback function: int values for polygon was set up
- */
-static void cb_g_polygon_set_face_uint32(
- void *user_def,
- VNodeID node_id,
- VLayerID layer_id,
- uint32 polygon_id,
- uint32 value)
-{
-/* struct VerseSession *session = (VerseSession*)current_verse_session();
- struct VNode *vnode;*/
+ return item;
}
-static uint8_item *create_uint8_item(void)
+/* Create item containing 1 float */
+static real32_item *create_real32_item(VLayer *vlayer, uint32 item_id, real32 value)
{
- struct uint8_item *item;
+ struct real32_item *item;
- item = (uint8_item*)MEM_mallocN(sizeof(uint8_item), "uint8_item");
- item->value = 0;
+ item = (real32_item*)MEM_mallocN(sizeof(real32_item), "real32_item");
+
+ item->vlayer = vlayer;
+ item->id = item_id;
+ item->value = value;
return item;
}
-/*
- * callback function: uint8 value for polygon was set up
- */
-static void cb_g_polygon_set_face_uint8(
- void *user_def,
- VNodeID node_id,
- VLayerID layer_id,
- uint32 polygon_id,
- uint8 value)
+/* Create item containing 1 integer */
+static uint32_item *create_uint32_item(VLayer *vlayer, uint32 item_id, uint32 value)
{
- struct VerseSession *session = (VerseSession*)current_verse_session();
- struct VNode *vnode;
- struct VLayer *vlayer;
- struct uint8_item *item;
+ struct uint32_item *item;
- if(!session) return;
+ item = (uint32_item*)MEM_mallocN(sizeof(uint32_item), "uint32_item");
- /* find needed node (we can be sure, that it is geometry node) */
- vnode = (VNode*)BLI_dlist_find_link(&(session->nodes), (unsigned int)node_id);
+ item->vlayer = vlayer;
+ item->id = item_id;
+ item->value = value;
- /* find layer containing uint_8 data */
- vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), (unsigned int)layer_id);
-
- /* try to find item*/
- item = BLI_dlist_find_link(&(vlayer->dl), polygon_id);
-
- if(item) {
- item->value = value;
- }
- else {
- item = create_uint8_item();
- BLI_dlist_add_item_index(&(vlayer->dl), item, polygon_id);
- item->value = value;
- }
+ return item;
}
-/*
- * callback function: float value for polygon corner was set up
- */
-static void cb_g_polygon_set_corner_real32(
- void *user_def,
- VNodeID node_id,
- VLayerID layer_id,
- uint32 polygon_id,
- real32 v0,
- real32 v1,
- real32 v2,
- real32 v3)
+/* Create item containing 1 byte */
+static uint8_item *create_uint8_item(VLayer *vlayer, uint32 item_id, uint8 value)
{
+ struct uint8_item *item;
+
+ item = (uint8_item*)MEM_mallocN(sizeof(uint8_item), "uint8_item");
+
+ item->vlayer = vlayer;
+ item->id = item_id;
+ item->value = value;
+
+ return item;
}
/*
- * callback function: polygon is deleted
+ * callback function: vertex crease was set
*/
-static void cb_g_polygon_delete(
+static void cb_g_crease_set_vertex(
void *user_data,
VNodeID node_id,
- uint32 polygon_id)
+ const char *layer,
+ uint32 def_crease)
{
- struct VerseSession *session = (VerseSession*)current_verse_session();
- VNode *vnode;
- VLayer *vlayer;
- VerseFace *vface;
-
- if(!session) return;
-
- /* find needed node (we can be sure, that it is geometry node) */
- vnode = BLI_dlist_find_link(&(session->nodes), node_id);
-
- /* find layer containing faces */
- vlayer = find_verse_layer_type((VGeomData*)vnode->data, POLYGON_LAYER);
-
- /* find wanted VerseFace */
- vface = BLI_dlist_find_link(&(vlayer->dl), polygon_id);
-
- if(!vface) return;
-
- /* update edge hash */
- update_edgehash_of_deleted_verseface(vnode, vface);
-
- ((VGeomData*)vnode->data)->post_polygon_delete(vface);
-
- /* decrease references at coresponding VerseVertexes */
- vface->vvert0->counter--;
- vface->vvert1->counter--;
- vface->vvert2->counter--;
- if(vface->vvert3) vface->vvert3->counter--;
-
- /* delete unneeded VerseVertexes */
- free_unneeded_verseverts_of_verseface(vnode, vface);
-
- free_verse_face(vlayer, vface);
}
/*
@@ -1365,6 +1294,206 @@ static void update_edgehash_of_new_verseface(
}
/*
+ * callback function: edge crease was set
+ */
+static void cb_g_crease_set_edge(
+ void *user_data,
+ VNodeID node_id,
+ const char *layer,
+ uint32 def_crease)
+{
+}
+
+/*
+ * callback function: float value for polygon was set up
+ */
+static void cb_g_polygon_set_face_real32(
+ void *user_def,
+ VNodeID node_id,
+ VLayerID layer_id,
+ uint32 polygon_id,
+ real32 value)
+{
+ struct VerseSession *session = (VerseSession*)current_verse_session();
+ struct VNode *vnode;
+ struct VLayer *vlayer;
+ struct real32_item *item;
+
+ if(!session) return;
+
+ /* find needed node (we can be sure, that it is geometry node) */
+ vnode = (VNode*)BLI_dlist_find_link(&(session->nodes), (unsigned int)node_id);
+
+ /* find layer containing uint_8 data */
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), (unsigned int)layer_id);
+
+ /* try to find item*/
+ item = BLI_dlist_find_link(&(vlayer->dl), polygon_id);
+
+ if(item) {
+ item->value = value;
+ }
+ else {
+ item = create_real32_item(vlayer, polygon_id, value);
+ BLI_dlist_add_item_index(&(vlayer->dl), item, item->id);
+ }
+}
+
+/*
+ * callback function: int values for polygon was set up
+ */
+static void cb_g_polygon_set_face_uint32(
+ void *user_def,
+ VNodeID node_id,
+ VLayerID layer_id,
+ uint32 polygon_id,
+ uint32 value)
+{
+ struct VerseSession *session = (VerseSession*)current_verse_session();
+ struct VNode *vnode;
+ struct VLayer *vlayer;
+ struct uint32_item *item;
+
+ if(!session) return;
+
+ /* find needed node (we can be sure, that it is geometry node) */
+ vnode = (VNode*)BLI_dlist_find_link(&(session->nodes), (unsigned int)node_id);
+
+ /* find layer containing uint_8 data */
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), (unsigned int)layer_id);
+
+ /* try to find item*/
+ item = BLI_dlist_find_link(&(vlayer->dl), polygon_id);
+
+ if(item) {
+ item->value = value;
+ }
+ else {
+ item = create_uint32_item(vlayer, polygon_id, value);
+ BLI_dlist_add_item_index(&(vlayer->dl), item, item->id);
+ }
+}
+
+/*
+ * callback function: uint8 value for polygon was set up
+ */
+static void cb_g_polygon_set_face_uint8(
+ void *user_def,
+ VNodeID node_id,
+ VLayerID layer_id,
+ uint32 polygon_id,
+ uint8 value)
+{
+ struct VerseSession *session = (VerseSession*)current_verse_session();
+ struct VNode *vnode;
+ struct VLayer *vlayer;
+ struct uint8_item *item;
+
+ if(!session) return;
+
+ /* find needed node (we can be sure, that it is geometry node) */
+ vnode = (VNode*)BLI_dlist_find_link(&(session->nodes), (unsigned int)node_id);
+
+ /* find layer containing uint_8 data */
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), (unsigned int)layer_id);
+
+ /* try to find item*/
+ item = BLI_dlist_find_link(&(vlayer->dl), polygon_id);
+
+ if(item) {
+ item->value = value;
+ }
+ else {
+ item = create_uint8_item(vlayer, polygon_id, value);
+ BLI_dlist_add_item_index(&(vlayer->dl), item, item->id);
+ }
+}
+
+/*
+ * callback function: float value for polygon corner was set up
+ */
+static void cb_g_polygon_set_corner_real32(
+ void *user_def,
+ VNodeID node_id,
+ VLayerID layer_id,
+ uint32 polygon_id,
+ real32 v0,
+ real32 v1,
+ real32 v2,
+ real32 v3)
+{
+ struct VerseSession *session = (VerseSession*)current_verse_session();
+ struct VNode *vnode;
+ struct VLayer *vlayer;
+ struct quat_real32_item *item;
+
+ if(!session) return;
+
+ /* find needed node (we can be sure, that it is geometry node) */
+ vnode = (VNode*)BLI_dlist_find_link(&(session->nodes), (unsigned int)node_id);
+
+ /* find layer containing uint_8 data */
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), (unsigned int)layer_id);
+
+ /* try to find item*/
+ item = BLI_dlist_find_link(&(vlayer->dl), polygon_id);
+
+ if(item) {
+ item->value[0] = v0;
+ item->value[1] = v1;
+ item->value[2] = v2;
+ item->value[3] = v3;
+ }
+ else {
+ item = create_quat_real32_item(vlayer, polygon_id, v0, v1, v2, v3);
+ BLI_dlist_add_item_index(&(vlayer->dl), item, item->id);
+ }
+}
+
+/*
+ * callback function: polygon is deleted
+ */
+static void cb_g_polygon_delete(
+ void *user_data,
+ VNodeID node_id,
+ uint32 polygon_id)
+{
+ struct VerseSession *session = (VerseSession*)current_verse_session();
+ VNode *vnode;
+ VLayer *vlayer;
+ VerseFace *vface;
+
+ if(!session) return;
+
+ /* find needed node (we can be sure, that it is geometry node) */
+ vnode = BLI_dlist_find_link(&(session->nodes), node_id);
+
+ /* find layer containing faces */
+ vlayer = find_verse_layer_type((VGeomData*)vnode->data, POLYGON_LAYER);
+
+ /* find wanted VerseFace */
+ vface = BLI_dlist_find_link(&(vlayer->dl), polygon_id);
+
+ if(!vface) return;
+
+ /* update edge hash */
+ update_edgehash_of_deleted_verseface(vnode, vface);
+
+ ((VGeomData*)vnode->data)->post_polygon_delete(vface);
+
+ /* decrease references at coresponding VerseVertexes */
+ vface->vvert0->counter--;
+ vface->vvert1->counter--;
+ vface->vvert2->counter--;
+ if(vface->vvert3) vface->vvert3->counter--;
+
+ /* delete unneeded VerseVertexes */
+ free_unneeded_verseverts_of_verseface(vnode, vface);
+
+ free_verse_face(vlayer, vface);
+}
+
+/*
* callback function: new polygon (face) created or existing polygon was changed
*/
static void cb_g_polygon_set_corner_uint32(
@@ -1395,8 +1524,6 @@ static void cb_g_polygon_set_corner_uint32(
/* we have to test coretness of incoming data */
if(!test_polygon_set_corner_uint32(v0, v1, v2, v3)) return;
-/* printf("\tRECEIVE VerseFace: %d, %d, %d, %d, %d\n", polygon_id, v0, v1, v2, v3);*/
-
/* Blender uses different order of vertexes */
if(v3!=-1) { /* quat swap */
unsigned int v; v = v1; v1 = v3; v3 = v;
@@ -1414,12 +1541,10 @@ static void cb_g_polygon_set_corner_uint32(
if(vface) {
BLI_remlink(&(vlayer->queue), (void*)vface);
BLI_dlist_add_item_index(&(vlayer->dl), (void*)vface, (unsigned int)polygon_id);
-/* printf("\treceived changed face (changed by this app)\n");*/
}
}
if(!vface) {
-/* printf("\tno vface\n");*/
/* try to find VerseFace in list of VerseVaces created by me and set up polygon and
* layer ids */
vface = find_verse_face_in_queue(vlayer, node_id, polygon_id, v0, v1, v2, v3);
@@ -1428,12 +1553,10 @@ static void cb_g_polygon_set_corner_uint32(
update_edgehash_of_new_verseface(vnode, v0, v1, v2, v3);
if(vface){
-/* printf("\tremove from vface queue\n");*/
/* I creeated this face ... remove VerseFace from queue */
BLI_remlink(&(vlayer->queue), (void*)vface);
}
else {
-/* printf("\tcreate vface\n");*/
/* some other client created this face*/
vface = create_verse_face(vlayer, polygon_id, v0, v1, v2, v3);
}
@@ -1452,7 +1575,6 @@ static void cb_g_polygon_set_corner_uint32(
((VGeomData*)vnode->data)->post_polygon_create(vface);
}
else {
-/* printf("\torphan vface\n");*/
/* when all needed VerseVertexes weren't received, then VerseFace is moved to
* the list of orphans waiting on needed vertexes */
vface->flag |= FACE_RECEIVED;
@@ -1461,7 +1583,6 @@ static void cb_g_polygon_set_corner_uint32(
}
else {
VLayer *vert_vlayer = find_verse_layer_type((VGeomData*)vnode->data, VERTEX_LAYER);
-/* printf("\tvface changed\n");*/
/* VerseVertexes of existing VerseFace were changed (VerseFace will use some different
* VerseVertexes or it will use them in different order) */
@@ -1594,8 +1715,29 @@ static void cb_g_vertex_set_real32(
uint32 vertex_id,
real32 value)
{
-/* struct VerseSession *session = (VerseSession*)current_verse_session();
- struct VNode *vnode;*/
+ struct VerseSession *session = (VerseSession*)current_verse_session();
+ struct VNode *vnode;
+ struct VLayer *vlayer;
+ struct real32_item *item;
+
+ if(!session) return;
+
+ /* find needed node (we can be sure, that it is geometry node) */
+ vnode = (VNode*)BLI_dlist_find_link(&(session->nodes), (unsigned int)node_id);
+
+ /* find layer containing uint_8 data */
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), (unsigned int)layer_id);
+
+ /* try to find item*/
+ item = BLI_dlist_find_link(&(vlayer->dl), vertex_id);
+
+ if(item) {
+ item->value = value;
+ }
+ else {
+ item = create_real32_item(vlayer, vertex_id, value);
+ BLI_dlist_add_item_index(&(vlayer->dl), item, item->id);
+ }
}
/*
@@ -1608,8 +1750,29 @@ static void cb_g_vertex_set_uint32(
uint32 vertex_id,
uint32 value)
{
-/* struct VerseSession *session = (VerseSession*)current_verse_session();
- struct VNode *vnode;*/
+ struct VerseSession *session = (VerseSession*)current_verse_session();
+ struct VNode *vnode;
+ struct VLayer *vlayer;
+ struct uint32_item *item;
+
+ if(!session) return;
+
+ /* find needed node (we can be sure, that it is geometry node) */
+ vnode = (VNode*)BLI_dlist_find_link(&(session->nodes), (unsigned int)node_id);
+
+ /* find layer containing uint_8 data */
+ vlayer = (VLayer*)BLI_dlist_find_link(&(((VGeomData*)vnode->data)->layers), (unsigned int)layer_id);
+
+ /* try to find item*/
+ item = BLI_dlist_find_link(&(vlayer->dl), vertex_id);
+
+ if(item) {
+ item->value = value;
+ }
+ else {
+ item = create_uint32_item(vlayer, vertex_id, value);
+ BLI_dlist_add_item_index(&(vlayer->dl), item, item->id);
+ }
}
/*
diff --git a/source/blender/blenkernel/intern/world.c b/source/blender/blenkernel/intern/world.c
index 612c095aac7..625ca57dbf3 100644
--- a/source/blender/blenkernel/intern/world.c
+++ b/source/blender/blenkernel/intern/world.c
@@ -75,6 +75,8 @@ void free_world(World *wrld)
if(mtex && mtex->tex) mtex->tex->id.us--;
if(mtex) MEM_freeN(mtex);
}
+ BKE_previewimg_free(&wrld->preview);
+
wrld->ipo= 0;
BKE_icon_delete((struct ID*)wrld);
wrld->id.icon_id = 0;
@@ -96,13 +98,16 @@ World *add_world(char *name)
wrld->exp= 0.0f;
wrld->exposure=wrld->range= 1.0f;
- wrld->aodist= 10.0;
+ wrld->aodist= 5.0;
wrld->aosamp= 5;
wrld->aoenergy= 1.0;
wrld->aobias= 0.05;
+ wrld->ao_samp_method = WO_AOSAMP_HAMMERSLEY;
+
wrld->physicsEngine= WOPHY_BULLET;//WOPHY_SUMO; Bullet by default
-
+ wrld->preview = NULL;
+
return wrld;
}
@@ -121,6 +126,8 @@ World *copy_world(World *wrld)
}
}
+ if (wrld->preview) wrldn->preview = BKE_previewimg_copy(wrld->preview);
+
BPY_copy_scriptlink(&wrld->scriptlink);
id_us_plus((ID *)wrldn->ipo);
diff --git a/source/blender/blenkernel/intern/writeavi.c b/source/blender/blenkernel/intern/writeavi.c
index 39f9af4c3d3..bd6859973b1 100644
--- a/source/blender/blenkernel/intern/writeavi.c
+++ b/source/blender/blenkernel/intern/writeavi.c
@@ -138,7 +138,8 @@ void start_avi(RenderData *rd, int rectx, int recty)
int x, y;
char name[256];
AviFormat format;
- int quality, framerate;
+ int quality;
+ double framerate;
makeavistring(rd, name);
@@ -147,7 +148,7 @@ void start_avi(RenderData *rd, int rectx, int recty)
y = recty;
quality= rd->quality;
- framerate= rd->frs_sec;
+ framerate= (double) rd->frs_sec / (double) rd->frs_sec_base;
avi = MEM_mallocN (sizeof(AviMovie), "avimovie");
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c
index 703f2803ede..cbaf1f8c605 100644
--- a/source/blender/blenkernel/intern/writeffmpeg.c
+++ b/source/blender/blenkernel/intern/writeffmpeg.c
@@ -32,6 +32,7 @@
#include <ffmpeg/avformat.h>
#include <ffmpeg/avcodec.h>
#include <ffmpeg/rational.h>
+#include <ffmpeg/swscale.h>
#if LIBAVFORMAT_VERSION_INT < (49 << 16)
#define FFMPEG_OLD_FRAME_RATE 1
@@ -81,6 +82,7 @@ static AVFormatContext* outfile = 0;
static AVStream* video_stream = 0;
static AVStream* audio_stream = 0;
static AVFrame* current_frame = 0;
+static struct SwsContext *img_convert_ctx = 0;
static uint8_t* video_buffer = 0;
static int video_buffersize = 0;
@@ -317,8 +319,9 @@ static AVFrame* generate_video_frame(uint8_t* pixels)
}
if (c->pix_fmt != PIX_FMT_RGBA32) {
- img_convert((AVPicture*)current_frame, c->pix_fmt,
- (AVPicture*)rgb_frame, PIX_FMT_RGBA32, width, height);
+ sws_scale(img_convert_ctx, rgb_frame->data,
+ rgb_frame->linesize, 0, c->height,
+ current_frame->data, current_frame->linesize);
delete_picture(rgb_frame);
}
return current_frame;
@@ -352,18 +355,26 @@ static AVStream* alloc_video_stream(int codec_id, AVFormatContext* of,
if (ffmpeg_type == FFMPEG_DV && G.scene->r.frs_sec != 25) {
c->time_base.den = 2997;
c->time_base.num = 100;
- } else {
+ } else if ((double) ((int) G.scene->r.frs_sec_base) ==
+ G.scene->r.frs_sec_base) {
c->time_base.den = G.scene->r.frs_sec;
- c->time_base.num = 1;
+ c->time_base.num = (int) G.scene->r.frs_sec_base;
+ } else {
+ c->time_base.den = G.scene->r.frs_sec * 100000;
+ c->time_base.num = ((double) G.scene->r.frs_sec_base) * 100000;
}
#else
/* FIXME: Really bad hack (tm) for NTSC support */
if (ffmpeg_type == FFMPEG_DV && G.scene->r.frs_sec != 25) {
c->frame_rate = 2997;
c->frame_rate_base = 100;
- } else {
+ } else if ((double) ((int) G.scene->r.frs_sec_base) ==
+ G.scene->r.frs_sec_base) {
c->frame_rate = G.scene->r.frs_sec;
- c->frame_rate_base = 1;
+ c->frame_rate_base = G.scene->r.frs_sec_base;
+ } else {
+ c->frame_rate = G.scene->r.frs_sec * 100000;
+ c->frame_rate_base = ((double) G.scene->r.frs_sec_base)*100000;
}
#endif
@@ -420,6 +431,13 @@ static AVStream* alloc_video_stream(int codec_id, AVFormatContext* of,
"FFMPEG video buffer");
current_frame = alloc_picture(c->pix_fmt, c->width, c->height);
+
+ img_convert_ctx = sws_getContext(c->width, c->height,
+ PIX_FMT_RGBA32,
+ c->width, c->height,
+ c->pix_fmt,
+ SWS_BICUBIC,
+ NULL, NULL, NULL);
return st;
}
@@ -749,8 +767,10 @@ void end_ffmpeg(void)
fprintf(stderr, "Closing ffmpeg...\n");
- write_audio_frames();
-
+ if (audio_stream) {
+ write_audio_frames();
+ }
+
if (outfile) {
av_write_trailer(outfile);
}
@@ -797,6 +817,11 @@ void end_ffmpeg(void)
MEM_freeN(audio_input_buffer);
audio_input_buffer = 0;
}
+
+ if (img_convert_ctx) {
+ sws_freeContext(img_convert_ctx);
+ img_convert_ctx = 0;
+ }
}
#endif
diff --git a/source/blender/blenlib/BLI_arithb.h b/source/blender/blenlib/BLI_arithb.h
index cebeff5c3e1..11a1fd277da 100644
--- a/source/blender/blenlib/BLI_arithb.h
+++ b/source/blender/blenlib/BLI_arithb.h
@@ -64,577 +64,213 @@ extern "C" {
{ 0.0, 0.0, 1.0}}
-/* matrix operations */
-/* void Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4]); */
-/* void Mat3MulVecfl(float mat[][3], float *vec); */
-/* or **mat, but it's the same */
-/*void Mat3MulVecd(float mat[][3], double *vec); */
+void CalcCent3f(float *cent, float *v1, float *v2, float *v3);
+void CalcCent4f(float *cent, float *v1, float *v2, float *v3, float *v4);
-/* void Mat4MulVecfl(float mat[][4], float *vec); */
-/* void Mat4MulSerie(float answ[][4], float m1[][4], float m2[][4], */
-/* float m3[][4], float m4[][4], float m5[][4], */
-/* float m6[][4], float m7[][4], float m8[][4]); */
-/* int Mat4Invert(float inverse[][4], float mat[][4]); */
+void Crossf(float *c, float *a, float *b);
+void Projf(float *c, float *v1, float *v2);
-/* m2 to m1 */
-/* void Mat3CpyMat4(float m1p[][3], float m2p[][4]); */
-/* void Mat3CpyMat4(float *m1p, float *m2p); */
+float Inpf(float *v1, float *v2);
+float Inp2f(float *v1, float *v2);
-/* m1 to m2 */
-/* void Mat3CpyMat3(float m1p[][3], float m2p[][3]); */
-/* void Mat3CpyMat3(float *m1p, float *m2p); */
+float Normalize(float *n);
+float Normalize2(float *n);
-/* m2 to m1 */
-/* void Mat4CpyMat3(float m1p[][4], float m2p[][3]); */
+float Sqrt3f(float f);
+double Sqrt3d(double d);
-/* M1 = M3*M2 */
-/* void Mat3MulMat3(float m1[][3], float m2[][3], float m3[][3]); */
-/*void Mat3MulMat3(float *m1, float *m3, float *m2); */
+float saacos(float fac);
+float saasin(float fac);
+float sasqrt(float fac);
-/* m1 = m2 * m3, ignore the elements on the 4th row/column of m3 */
-/*void Mat3IsMat3MulMat4(float m1[][3], float m2[][3], float m3[][4]); */
+int FloatCompare(float *v1, float *v2, float limit);
+float FloatLerpf(float target, float origin, float fac);
-/* m1 to m2 */
-/* void Mat4CpyMat4(float m1[][4], float m2[][4]); */
-/* void Mat4CpyMat4(float *m1, float *m2); */
+float CalcNormFloat(float *v1, float *v2, float *v3, float *n);
+float CalcNormFloat4(float *v1, float *v2, float *v3, float *v4, float *n);
+void CalcNormLong(int *v1, int *v2, int *v3, float *n);
+/* CalcNormShort: is ook uitprodukt - (translates as 'is also out/cross product') */
+void CalcNormShort(short *v1, short *v2, short *v3, float *n);
-/* void Mat4Ortho(float mat[][4]); */
-/* void Mat4Mul3Vecfl(float mat[][4], float *vec); */
-/* void Mat4MulVec4fl(float mat[][4], float *vec); */
-/* void Mat4SwapMat4(float *m1, float *m2); */
-
-/* void Mat3Inv(float m1[][3], float m2[][3]); */
-/* void Mat4One(float m[][4]); */
-/* void Mat3One(float m[][3]); */
-
-
- void
-CalcCent3f(
- float *cent, float *v1, float *v2, float *v3
-);
-
- void
-CalcCent4f(
- float *cent, float *v1,
- float *v2, float *v3,
- float *v4
-);
-
- void
-Crossf(
- float *c, float *a, float *b
-);
-
- void
-Projf(
- float *c, float *v1, float *v2
-);
/**
- * Euler conversion routines
+ * @section Euler conversion routines
*/
- void
-EulToMat3(
- float *eul,
- float mat[][3]
-);
- void
-EulToMat4(
- float* eul,
- float mat[][4]
-);
+void EulToMat3(float *eul, float mat[][3]);
+void EulToMat4(float *eul, float mat[][4]);
- void
-Mat3ToEul(
- float tmat[][3],
- float *eul
-);
+void Mat3ToEul(float tmat[][3], float *eul);
+void Mat4ToEul(float tmat[][4],float *eul);
- void
-Mat4ToEul(
- float tmat[][4],
- float *eul
-);
+void EulToQuat(float *eul, float *quat);
void compatible_eul(float *eul, float *oldrot);
void Mat3ToCompatibleEul(float mat[][3], float *eul, float *oldrot);
+
/**
* @section Quaternion arithmetic routines
*/
- void
-QuatToEul(
- float *quat,
- float *eul
-);
- void
-QuatOne(
- float *
-);
- void
-QuatMul(
- float *,
- float *,
- float *
-);
- void
-QuatMulVecf(
- float *q,
- float *v
-);
- void
-NormalQuat(
- float *
-);
- void
-VecRotToQuat(
- float *vec,
- float phi,
- float *quat
-);
- void
-QuatSub(
- float *q,
- float *q1,
- float *q2
-);
- void
-QuatConj(
- float *q
-);
- void
-QuatInv(
- float *q
-);
- void
-QuatMulf(
- float *q,
- float f
-);
- float
-QuatDot(
- float *q1,
- float *q2
-);
- void
-printquat(
- char *str,
- float q[4]
-);
+void QuatToEul(float *quat, float *eul);
+void QuatOne(float *);
+void QuatMul(float *, float *, float *);
+void QuatMulVecf(float *q, float *v);
+void QuatMulf(float *q, float f);
+void QuatMulFac(float *q, float fac);
+
+void NormalQuat(float *);
+void VecRotToQuat(float *vec, float phi, float *quat);
+
+void QuatSub(float *q, float *q1, float *q2);
+void QuatConj(float *q);
+void QuatInv(float *q);
+float QuatDot(float *q1, float *q2);
+void QuatCopy(float *q1, float *q2);
+void printquat(char *str, float q[4]);
void QuatInterpol(float *result, float *quat1, float *quat2, float t);
void QuatAdd(float *result, float *quat1, float *quat2, float t);
/**
- * @section matrix multiplication can copying routines
+ * @section matrix multiplication and copying routines
*/
- void
-Mat3MulFloat(
- float *m,
- float f
-);
- void
-Mat4MulFloat(
- float *m,
- float f
-);
- void
-Mat4MulFloat3(
- float *m,
- float f
-);
- void
-Mat3Transp(
- float mat[][3]
-);
- void
-Mat4Transp(
- float mat[][4]
-);
- int
-Mat4Invert(
- float inverse[][4],
- float mat[][4]
-);
- void
-Mat4InvertSimp(
- float inverse[][4],
- float mat[][4]
-);
- void
-Mat4Inv(
- float *m1,
- float *m2
-);
- void
-Mat4InvGG(
- float out[][4],
- float in[][4]
-);
- void
-Mat3CpyMat4(
- float m1[][3],
- float m2[][4]
-);
+void Mat3MulFloat(float *m, float f);
+void Mat4MulFloat(float *m, float f);
+void Mat4MulFloat3(float *m, float f);
- void
-Mat3Inv(
- float m1[][3],
- float m2[][3]
-);
+void Mat3Transp(float mat[][3]);
+void Mat4Transp(float mat[][4]);
- void
-Mat4CpyMat3(
- float m1[][4],
- float m2[][3]
-);
+int Mat4Invert(float inverse[][4], float mat[][4]);
+void Mat4InvertSimp(float inverse[][4], float mat[][4]);
+void Mat4Inv(float *m1, float *m2);
+void Mat4InvGG(float out[][4], float in[][4]);
+void Mat3Inv(float m1[][3], float m2[][3]);
- float
-Det2x2(
- float a,float b,float c,float d
-);
+void Mat3CpyMat4(float m1[][3],float m2[][4]);
+void Mat4CpyMat3(float m1[][4], float m2[][3]);
+
+void Mat4BlendMat4(float out[][4], float dst[][4], float src[][4], float srcweight);
+
+float Det2x2(float a,float b,float c, float d);
- float
-Det3x3(
+float Det3x3(
float a1, float a2, float a3,
float b1, float b2, float b3,
float c1, float c2, float c3
);
- float
-Det4x4(
- float m[][4]
-);
+float Det4x4(float m[][4]);
- void
-Mat4Adj(
- float out[][4],
- float in[][4]
-);
- void
-Mat3Adj(
- float m1[][3],
- float m[][3]
-);
- void
-Mat4MulMat4(
- float m1[][4],
- float m2[][4],
- float m3[][4]
-);
- void
-subMat4MulMat4(
- float *m1,
- float *m2,
- float *m3
-);
+void Mat3Adj(float m1[][3], float m[][3]);
+void Mat4Adj(float out[][4], float in[][4]);
+
+void Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4]);
+void subMat4MulMat4(float *m1, float *m2, float *m3);
#ifndef TEST_ACTIVE
- void
-Mat3MulMat3(
- float m1[][3],
- float m3[][3],
- float m2[][3]
-);
+void Mat3MulMat3(float m1[][3], float m3[][3], float m2[][3]);
#else
- void
-Mat3MulMat3(
- float *m1,
- float *m3,
- float *m2
-);
+void Mat3MulMat3(float *m1, float *m3, float *m2);
#endif
- void
-Mat4MulMat34(
- float (*m1)[4],
- float (*m3)[3],
- float (*m2)[4]
-);
- void
-Mat4CpyMat4(
- float m1[][4],
- float m2[][4]
-);
- void
-Mat4SwapMat4(
- float *m1,
- float *m2
-);
- void
-Mat3CpyMat3(
- float m1[][3],
- float m2[][3]
-);
- void
-Mat3MulSerie(
- float answ[][3],
+void Mat4MulMat34(float (*m1)[4], float (*m3)[3], float (*m2)[4]);
+void Mat4CpyMat4(float m1[][4], float m2[][4]);
+void Mat4SwapMat4(float *m1, float *m2);
+void Mat3CpyMat3(float m1[][3], float m2[][3]);
+
+void Mat3MulSerie(float answ[][3],
float m1[][3], float m2[][3], float m3[][3],
float m4[][3], float m5[][3], float m6[][3],
float m7[][3], float m8[][3]
);
- void
-Mat4MulSerie(
- float answ[][4],
- float m1[][4],
+
+void Mat4MulSerie(float answ[][4], float m1[][4],
float m2[][4], float m3[][4], float m4[][4],
float m5[][4], float m6[][4], float m7[][4],
float m8[][4]
);
- void
-Mat4Clr(
- float *m
-);
- void
-Mat3Clr(
- float *m
-);
- void
-Mat3One(
- float m[][3]
-);
- void
-Mat4MulVec3Project(
- float mat[][4],
- float *vec
-);
- void
-Mat4MulVec(
- float mat[][4],
- int *vec
-);
- void
-VecMat4MulVecfl(
- float *in,
- float mat[][4],
- float *vec
-);
- void
-Mat4MulMat43(
- float (*m1)[4],
- float (*m3)[4],
- float (*m2)[3]
-);
-
- void
-Mat3IsMat3MulMat4(
- float m1[][3],
- float m2[][3],
- float m3[][4]
-);
- void
-Mat4One(
- float m[][4]
-);
- void
-Mat4Mul3Vecfl(
- float mat[][4],
- float *vec
-);
- void
-Mat4MulVec4fl(
- float mat[][4],
- float *vec
-);
- void
-Mat3MulVec(
- float mat[][3],
- int *vec
-);
- void
-Mat4MulVecfl(
- float mat[][4],
- float *vec
-);
- void
-Mat4ToQuat(
- float m[][4],
- float *q
-);
- void
-VecUpMat3old(
- float *vec,
- float mat[][3],
- short axis
-);
- int
-FloatCompare(
- float *v1,
- float *v2,
- float limit
-);
- float
-FloatLerpf(
- float target,
- float origin,
- float fac
-);
- float
-Normalize(
- float *n
-);
- float
-CalcNormFloat(
- float *v1,
- float *v2,
- float *v3,
- float *n
-);
-
- float
-CalcNormFloat4(
- float *v1,
- float *v2,
- float *v3,
- float *v4,
- float *n
-);
- float
-VecLenf(
- float *v1,
- float *v2
-);
- float
-VecLength(
- float *v
-);
- void
-VecMulf(
- float *v1,
- float f
-);
- int
-VecLenCompare(
- float *v1,
- float *v2,
- float limit
-);
- int
-VecCompare(
- float *v1,
- float *v2,
- float limit
-);
- int
-VecEqual(
- float *v1,
- float *v2
-);
- float
-Sqrt3f(
- float f
-);
- double
-Sqrt3d(
- double d
-);
+
+void Mat4Clr(float *m);
+void Mat3Clr(float *m);
+
+void Mat3One(float m[][3]);
+void Mat4One(float m[][4]);
+
+void Mat3Ortho(float mat[][3]);
+void Mat4Ortho(float mat[][4]);
+
+void VecMat4MulVecfl(float *in, float mat[][4], float *vec);
+void Mat4MulMat43(float (*m1)[4], float (*m3)[4], float (*m2)[3]);
+void Mat3IsMat3MulMat4(float m1[][3], float m2[][3], float m3[][4]);
+
+void Mat4MulVec(float mat[][4],int *vec);
+void Mat4MulVecfl(float mat[][4], float *vec);
+void Mat4Mul3Vecfl(float mat[][4], float *vec);
+void Mat4MulVec3Project(float mat[][4],float *vec);
+void Mat4MulVec4fl(float mat[][4], float *vec);
+void Mat3MulVec(float mat[][3],int *vec);
+void Mat3MulVecfl(float mat[][3], float *vec);
+void Mat3MulVecd(float mat[][3], double *vec);
+void Mat3TransMulVecfl(float mat[][3], float *vec);
+
+void Mat3AddMat3(float m1[][3], float m2[][3], float m3[][3]);
+void Mat4AddMat4(float m1[][4], float m2[][4], float m3[][4]);
+
+void VecUpMat3old(float *vec, float mat[][3], short axis);
+void VecUpMat3(float *vec, float mat[][3], short axis);
+void VecRotToMat3(float *vec, float phi, float mat[][3]);
+void VecRotToMat4(float *vec, float phi, float mat[][4]);
+
+void VecCopyf(float *v1, float *v2);
+int VecLen(int *v1, int *v2);
+float VecLenf(float *v1, float *v2);
+float VecLength(float *v);
+void VecMulf(float *v1, float f);
+
+int VecLenCompare(float *v1, float *v2, float limit);
+int VecCompare(float *v1, float *v2, float limit);
+int VecEqual(float *v1, float *v2);
+
+void printvecf(char *str,float v[3]);
+void printvec4f(char *str, float v[4]);
+
+void VecAddf(float *v, float *v1, float *v2);
+void VecSubf(float *v, float *v1, float *v2);
+void VecLerpf(float *target, float *a, float *b, float t);
+void VecMidf(float *v, float *v1, float *v2);
+
+void VecOrthoBasisf(float *v, float *v1, float *v2);
+
+float Vec2Lenf(float *v1, float *v2);
+float Vec2Length(float *v);
+void Vec2Mulf(float *v1, float f);
+void Vec2Addf(float *v, float *v1, float *v2);
+void Vec2Subf(float *v, float *v1, float *v2);
+void Vec2Copyf(float *v1, float *v2);
+
+float *vectoquat(float *vec, short axis, short upflag);
+
+float VecAngle2(float *v1, float *v2);
+float VecAngle3(float *v1, float *v2, float *v3);
+float NormalizedVecAngle2(float *v1, float *v2);
+
+void euler_rot(float *beul, float ang, char axis);
+
- void
-euler_rot(
- float *beul,
- float ang,
- char axis
-);
- float
-saacos(
- float fac
-);
- float
-saasin(
- float fac
-);
- float
-sasqrt(
- float fac
-);
- void
-printvecf(
- char *str,
- float v[3]
-);
- void
-printvec4f(
- char *str,
- float v[4]
-);
- float
-Inpf(
- float *v1,
- float *v2
-);
- void
-VecSubf(
- float *v,
- float *v1,
- float *v2
-);
- void
-VecAddf(
- float *v,
- float *v1,
- float *v2
-);
- void
-VecLerpf(
- float *target,
- float *a,
- float *b,
- float t
-);
- void
-VecUpMat3(
- float *vec,
- float mat[][3],
- short axis
-);
- float
-DistVL2Dfl(
- float *v1,
- float *v2,
- float *v3
-);
- float
-PdistVL2Dfl(
- float *v1,
- float *v2,
- float *v3
-);
- float
-AreaF2Dfl(
- float *v1,
- float *v2,
- float *v3
-);
- float
-AreaQ3Dfl(
- float *v1,
- float *v2,
- float *v3,
- float *v4
-);
- float
-AreaT3Dfl(
- float *v1,
- float *v2,
- float *v3
-);
- float
-AreaPoly3Dfl(
- int nr,
- float *verts,
- float *normal
-);
- void
-VecRotToMat3(
- float *vec,
- float phi,
- float mat[][3]
-);
+float DistVL2Dfl(float *v1, float *v2, float *v3);
+float PdistVL2Dfl(float *v1, float *v2, float *v3);
+float PdistVL3Dfl(float *v1, float *v2, float *v3);
+void PclosestVL3Dfl(float *closest, float *v1, float *v2, float *v3);
+float AreaF2Dfl(float *v1, float *v2, float *v3);
+float AreaQ3Dfl(float *v1, float *v2, float *v3, float *v4);
+float AreaT3Dfl(float *v1, float *v2, float *v3);
+float AreaPoly3Dfl(int nr, float *verts, float *normal);
/* intersect Line-Line
return:
@@ -646,313 +282,113 @@ VecRotToMat3(
extern short IsectLL2Df(float *v1, float *v2, float *v3, float *v4);
extern short IsectLL2Ds(short *v1, short *v2, short *v3, short *v4);
-/* interpolation weights of point in a triangle or quad, v4 may be NULL */
- void
-InterpWeightsQ3Dfl(
- float *v1, float *v2, float *v3, float *v4,
- float *co,
- float *w
-);
-
- float *
-vectoquat(
- float *vec,
- short axis,
- short upflag
-);
+/*point in tri, 0 no intersection, 1 intersect */
+int IsectPT2Df(float pt[2], float v1[2], float v2[2], float v3[2]);
+/* point in quad, 0 no intersection, 1 intersect */
+int IsectPQ2Df(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2]);
- float
-VecAngle3(
- float *v1,
- float *v2,
- float *v3
-);
-
- float
-VecAngle2(
- float *v1,
- float *v2
-);
- float
-NormalizedVecAngle2(
- float *v1,
- float *v2
-);
+/* interpolation weights of point in a triangle or quad, v4 may be NULL */
+void InterpWeightsQ3Dfl(float *v1, float *v2, float *v3, float *v4, float *co, float *w);
+/* interpolation weights of point in a polygon with >= 3 vertices */
+void MeanValueWeights(float v[][3], int n, float *co, float *w);
- void
-i_lookat(
+void i_lookat(
float vx, float vy,
float vz, float px,
float py, float pz,
float twist, float mat[][4]
);
- void
-i_window(
+
+void i_window(
float left, float right,
float bottom, float top,
float nearClip, float farClip,
float mat[][4]
);
- void
-hsv_to_rgb(
- float h, float s,
- float v, float *r,
- float *g, float *b
-);
+void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
+void hex_to_rgb(char *hexcol, float *r, float *g, float *b);
+void rgb_to_yuv(float r, float g, float b, float *ly, float *lu, float *lv);
+void yuv_to_rgb(float y, float u, float v, float *lr, float *lg, float *lb);
+void ycc_to_rgb(float y, float cb, float cr, float *lr, float *lg, float *lb);
+void rgb_to_ycc(float r, float g, float b, float *ly, float *lcb, float *lcr);
+void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
+unsigned int hsv_to_cpack(float h, float s, float v);
+unsigned int rgb_to_cpack(float r, float g, float b);
+void cpack_to_rgb(unsigned int col, float *r, float *g, float *b);
+void MinMaxRGB(short c[]);
- void
-hex_to_rgb(
- char *hexcol,
- float *r,
- float *g,
- float *b
-);
- void
-rgb_to_yuv(
- float r, float g, float b,
- float *ly, float *lu, float *lv
-);
- void
-yuv_to_rgb(
- float y, float u, float v,
- float *lr, float *lg, float *lb
-);
+void VecStar(float mat[][3],float *vec);
- void
-ycc_to_rgb(
- float y, float cb, float cr,
- float *lr, float *lg, float *lb
-);
+short EenheidsMat(float mat[][3]);
- void
-rgb_to_ycc(
- float r, float g, float b,
- float *ly, float *lcb, float *lcr
-);
- void
-rgb_to_hsv(
- float r, float g, float b,
- float *lh, float *ls, float *lv
-);
- unsigned int
-hsv_to_cpack(
- float h, float s, float v
-);
- unsigned int
-rgb_to_cpack(
- float r, float g, float b
-);
- void
-cpack_to_rgb(
- unsigned int col,
- float *r, float *g, float *b
-);
+void QuatToMat3(float *q, float m[][3]);
+void QuatToMat4(float *q, float m[][4]);
- void
-EulToQuat(
- float *eul,
- float *quat
-);
+void Mat3ToQuat_is_ok(float wmat[][3], float *q);
- void
-Mat3MulVecfl(
- float mat[][3],
- float *vec
-);
- void
-Mat3MulVecd(
- float mat[][3],
- double *vec
-);
- void
-Mat3TransMulVecfl(
- float mat[][3],
- float *vec
-);
- void
-VecStar(
- float mat[][3],
- float *vec
-);
- short
-EenheidsMat(
- float mat[][3]
-);
- void
-printmatrix3(
- char *str, float m[][3]
-);
- void
-QuatToMat3(
- float *q,
- float m[][3]
-);
- void
-QuatToMat4(
- float *q,
- float m[][4]
-);
- void
-Mat3ToQuat_is_ok(
- float wmat[][3],
- float *q
-);
- void
-i_ortho(
- float left, float right,
- float bottom, float top,
- float nearClip, float farClip,
- float matrix[][4]
-);
- void
-i_polarview(
- float dist, float azimuth, float incidence, float twist,
- float Vm[][4]
-);
- void
-Mat3Ortho(
- float mat[][3]
-);
- void
-Mat4Ortho(
- float mat[][4]
-);
- void
-VecCopyf(
- float *v1,
- float *v2
-);
- int
-VecLen(
- int *v1,
- int *v2
-);
- void
-CalcNormShort(
- short *v1,
- short *v2,
- short *v3,
- float *n
-) /* is ook uitprodukt */;
-
- void
-CalcNormLong(
- int* v1,
- int*v2,
- int*v3,
- float *n
-);
- void
-MinMax3(
- float *min,
- float *max,
- float *vec
-);
+void i_ortho(float left, float right, float bottom, float top, float nearClip, float farClip, float matrix[][4]);
+void i_polarview(float dist, float azimuth, float incidence, float twist, float Vm[][4]);
+void i_translate(float Tx, float Ty, float Tz, float mat[][4]);
+void i_multmatrix(float icand[][4], float Vm[][4]);
+void i_rotate(float angle, char axis, float mat[][4]);
+
+
+
+
+
+void MinMax3(float *min, float *max, float *vec);
+void SizeToMat3(float *size, float mat[][3]);
+void SizeToMat4(float *size, float mat[][4]);
+
+float Mat3ToScalef(float mat[][3]);
+float Mat4ToScalef(float mat[][4]);
+
+void printmatrix3(char *str, float m[][3]);
+void printmatrix4(char *str, float m[][4]);
- void
-SizeToMat3(
- float *size,
- float mat[][3]
-);
- void
-printmatrix4(
- char *str,
- float m[][4]
-);
/* uit Sig.Proc.85 pag 253 */
- void
-Mat3ToQuat(
- float wmat[][3],
- float *q
-);
- void
-i_translate(
- float Tx,
- float Ty,
- float Tz,
- float mat[][4]
-);
- void
-i_multmatrix(
- float icand[][4],
- float Vm[][4]
-);
- void
-i_rotate(
- float angle,
- char axis,
- float mat[][4]
-);
- void
-VecMidf(
- float *v, float *v1, float *v2
-);
- void
-Mat3ToSize(
- float mat[][3], float *size
-);
- void
-Mat4ToSize(
- float mat[][4], float *size
-);
- void
-triatoquat(
- float *v1,
- float *v2,
- float *v3, float *quat
-);
- void
-MinMaxRGB(
- short c[]
-);
- float
-Vec2Lenf(
- float *v1,
- float *v2
-);
- void
-Vec2Mulf(
- float *v1,
- float f
-);
- void
-Vec2Addf(
- float *v,
- float *v1,
- float *v2
-);
- void
-Vec2Subf(
- float *v,
- float *v1,
- float *v2
-);
- void
-Vec2Copyf(
- float *v1,
- float *v2
-);
- float
-Inp2f(
- float *v1,
- float *v2
-);
- float
-Normalize2(
- float *n
-);
+void Mat3ToQuat(float wmat[][3], float *q);
+void Mat4ToQuat(float m[][4], float *q);
+
+void Mat3ToSize(float mat[][3], float *size);
+void Mat4ToSize(float mat[][4], float *size);
+
+void triatoquat(float *v1, float *v2, float *v3, float *quat);
void LocEulSizeToMat4(float mat[][4], float loc[3], float eul[3], float size[3]);
void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3]);
void tubemap(float x, float y, float z, float *u, float *v);
void spheremap(float x, float y, float z, float *u, float *v);
-
-int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda);
+
+int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv);
+int SweepingSphereIntersectsTriangleUV(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint);
+int AxialLineIntersectsTriangle(int axis, float co1[3], float co2[3], float v0[3], float v1[3], float v2[3], float *lambda);
+int AabbIntersectAabb(float min1[3], float max1[3], float min2[3], float max2[3]);
+void VecfCubicInterpol(float *x1, float *v1, float *x2, float *v2, float t, float *x, float *v);
+void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
+void PointInFace2DUV(int isquad, float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv);
int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3]);
+
+float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3]);
+
+typedef struct DualQuat {
+ float quat[4];
+ float trans[4];
+
+ float scale[4][4];
+ float scale_weight;
+} DualQuat;
+
+void Mat4ToDQuat(float basemat[][4], float mat[][4], DualQuat *dq);
+void DQuatToMat4(DualQuat *dq, float mat[][4]);
+void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight);
+void DQuatNormalize(DualQuat *dq, float totweight);
+void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3]);
+void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2);
#ifdef __cplusplus
}
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h
index 6e51d171461..57248fb1d68 100644
--- a/source/blender/blenlib/BLI_blenlib.h
+++ b/source/blender/blenlib/BLI_blenlib.h
@@ -102,15 +102,18 @@ void BLI_join_dirfile(char *string, const char *dir, const char *file);
int BLI_testextensie(const char *str, const char *ext);
void addlisttolist(ListBase *list1, ListBase *list2);
void BLI_insertlink(struct ListBase *listbase, void *vprevlink, void *vnewlink);
-void * BLI_findlink(struct ListBase *listbase, int number);
+void *BLI_findlink(struct ListBase *listbase, int number);
+int BLI_findindex(struct ListBase *listbase, void *vlink);
void BLI_freelistN(struct ListBase *listbase);
void BLI_addtail(struct ListBase *listbase, void *vlink);
void BLI_remlink(struct ListBase *listbase, void *vlink);
void BLI_newname(char * name, int add);
-int BLI_stringdec(char *string, char *kop, char *staart, unsigned short *numlen);
-void BLI_stringenc(char *string, char *kop, char *staart, unsigned short numlen, int pic);
+int BLI_stringdec(char *string, char *kop, char *start, unsigned short *numlen);
+void BLI_stringenc(char *string, char *kop, char *start, unsigned short numlen, int pic);
void BLI_addhead(struct ListBase *listbase, void *vlink);
void BLI_insertlinkbefore(struct ListBase *listbase, void *vnextlink, void *vnewlink);
+void BLI_insertlinkafter(struct ListBase *listbase, void *vprevlink, void *vnewlink);
+void BLI_sortlist(struct ListBase *listbase, int (*cmp)(void *, void *));
void BLI_freelist(struct ListBase *listbase);
int BLI_countlist(struct ListBase *listbase);
void BLI_freelinkN(ListBase *listbase, void *vlink);
@@ -173,7 +176,7 @@ void BLI_clean(char *path);
* @param str The string to be duplicated
* @retval Returns the duplicated string
*/
-char* BLI_strdup(char *str);
+char *BLI_strdup(const char *str);
/**
* Duplicates the first @a len bytes of cstring @a str
@@ -184,7 +187,7 @@ char* BLI_strdup(char *str);
* @param len The number of bytes to duplicate
* @retval Returns the duplicated string
*/
-char* BLI_strdupn(char *str, int len);
+char *BLI_strdupn(const char *str, int len);
/**
* Like strncpy but ensures dst is always
@@ -196,7 +199,7 @@ char* BLI_strdupn(char *str, int len);
* the size of dst)
* @retval Returns dst
*/
-char* BLI_strncpy(char *dst, const char *src, int maxncpy);
+char *BLI_strncpy(char *dst, const char *src, int maxncpy);
/*
* Replacement for snprintf
@@ -217,6 +220,11 @@ int BLI_streq(char *a, char *b);
*/
int BLI_strcaseeq(char *a, char *b);
+/* in util.c */
+#ifdef WITH_ICONV
+void BLI_string_to_utf8(char *original, char *utf_8, char *code);
+#endif
+
/**
* Read a file as ASCII lines. An empty list is
* returned if the file cannot be opened or read.
@@ -257,15 +265,15 @@ char* BLI_getbundle(void);
#endif
#ifdef WIN32
-int BLI_getInstallationDir( char * str );
+int BLI_getInstallationDir(char *str);
#endif
/* BLI_storage.h */
int BLI_filesize(int file);
double BLI_diskfree(char *dir);
-char * BLI_getwdN(char * dir);
+char *BLI_getwdN(char *dir);
void BLI_hide_dot_files(int set);
-unsigned int BLI_getdir(char *dirname, struct direntry **filelist);
+unsigned int BLI_getdir(char *dirname, struct direntry **filelist);
/**
* @attention Do not confuse with BLI_exists
@@ -298,12 +306,12 @@ char *BLI_last_slash(char *string);
*
* @return True if @a rect is empty.
*/
-int BLI_rcti_is_empty(struct rcti * rect);
+int BLI_rcti_is_empty(struct rcti *rect);
void BLI_init_rctf(struct rctf *rect, float xmin, float xmax, float ymin, float ymax);
void BLI_init_rcti(struct rcti *rect, int xmin, int xmax, int ymin, int ymax);
void BLI_translate_rctf(struct rctf *rect, float x, float y);
void BLI_translate_rcti(struct rcti *rect, int x, int y);
-int BLI_in_rcti(struct rcti * rect, int x, int y);
+int BLI_in_rcti(struct rcti *rect, int x, int y);
int BLI_in_rctf(struct rctf *rect, float x, float y);
int BLI_isect_rctf(struct rctf *src1, struct rctf *src2, struct rctf *dest);
int BLI_isect_rcti(struct rcti *src1, struct rcti *src2, struct rcti *dest);
diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h
index c05d33f2792..795f6781894 100644
--- a/source/blender/blenlib/BLI_editVert.h
+++ b/source/blender/blenlib/BLI_editVert.h
@@ -55,9 +55,9 @@ typedef struct EditVert
struct EditVert *v;
struct EditEdge *e;
struct EditFace *f;
- float *fp;
void *p;
long l;
+ float fp;
} tmp;
float no[3]; /*vertex normal */
float co[3]; /*vertex location */
@@ -164,6 +164,13 @@ typedef struct EditMesh
/* DerivedMesh caches... note that derived cage can be equivalent
* to derived final, care should be taken on release.
*/
+
+ /* used for keeping track of the last clicked on face - so the space image
+ * when using the last selected face - (EditSelection) the space image flickered too much
+ *
+ * never access this directly, use EM_set_actFace and EM_get_actFace */
+ EditFace *act_face;
+
struct DerivedMesh *derivedCage, *derivedFinal;
/* the custom data layer mask that was last used to calculate
* derivedCage and derivedFinal
diff --git a/source/blender/blenlib/BLI_fnmatch.h b/source/blender/blenlib/BLI_fnmatch.h
new file mode 100644
index 00000000000..af1dcf523bf
--- /dev/null
+++ b/source/blender/blenlib/BLI_fnmatch.h
@@ -0,0 +1,69 @@
+/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+
+NOTE: The canonical source of this file is maintained with the GNU C Library.
+Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+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, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _FNMATCH_H
+
+#define _FNMATCH_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined (__cplusplus) || (defined (__STDC__) && __STDC__)
+#undef __P
+#define __P(protos) protos
+#else /* Not C++ or ANSI C. */
+#undef __P
+#define __P(protos) ()
+/* We can get away without defining `const' here only because in this file
+ it is used only inside the prototype for `fnmatch', which is elided in
+ non-ANSI C where `const' is problematical. */
+#endif /* C++ or ANSI C. */
+
+
+/* We #undef these before defining them because some losing systems
+ (HP-UX A.08.07 for example) define these in <unistd.h>. */
+#undef FNM_PATHNAME
+#undef FNM_NOESCAPE
+#undef FNM_PERIOD
+
+/* Bits set in the FLAGS argument to `fnmatch'. */
+#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */
+#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */
+#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */
+
+#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE)
+#define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */
+#define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */
+#define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */
+#endif
+
+/* Value returned by `fnmatch' if STRING does not match PATTERN. */
+#define FNM_NOMATCH 1
+
+/* Match STRING against the filename pattern PATTERN,
+ returning zero if it matches, FNM_NOMATCH if not. */
+extern int fnmatch __P ((const char *__pattern, const char *__string,
+ int __flags));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* fnmatch.h */
diff --git a/intern/action/test/action_c_test/TestAction.c b/source/blender/blenlib/BLI_kdtree.h
index 0b4896dadd7..d32e85c150c 100644
--- a/intern/action/test/action_c_test/TestAction.c
+++ b/source/blender/blenlib/BLI_kdtree.h
@@ -1,5 +1,8 @@
/**
+ * A kd-tree for nearest neighbour search.
+ *
* $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -22,42 +25,39 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
- * The Original Code is: all of this file.
+ * The Original Code is: none of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Janne Karhu
+ * Brecht Van Lommel
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
+
+#ifndef BLI_KDTREE_H
+#define BLI_KDTREE_H
-/**
+struct KDTree;
+typedef struct KDTree KDTree;
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
+typedef struct KDTreeNearest {
+ int index;
+ float dist;
+ float co[3];
+} KDTreeNearest;
-#include <stdio.h>
+/* Creates or free a kdtree */
+KDTree* BLI_kdtree_new(int maxsize);
+void BLI_kdtree_free(KDTree *tree);
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+/* Construction: first insert points, then call balance. Normal is optional. */
+void BLI_kdtree_insert(KDTree *tree, int index, float *co, float *nor);
+void BLI_kdtree_balance(KDTree *tree);
-#include "TestAction.h"
-
-
-void printApplied(ACT_ActionPtr action, ACT_ActionUserDataPtr userData)
-{
- printf("%s: applied\n", ACT_ActionGetName(action));
-}
-
-void printUndone(ACT_ActionPtr action, ACT_ActionUserDataPtr userData)
-{
- printf("%s: undone\n", ACT_ActionGetName(action));
-}
+/* Find nearest returns index, and -1 if no node is found.
+ * Find n nearest returns number of points found, with results in nearest.
+ * Normal is optional. */
+int BLI_kdtree_find_nearest(KDTree *tree, float *co, float *nor, KDTreeNearest *nearest);
+int BLI_kdtree_find_n_nearest(KDTree *tree, int n, float *co, float *nor, KDTreeNearest *nearest);
+#endif
-void printDisposed(ACT_ActionPtr action, ACT_ActionUserDataPtr userData)
-{
- printf("%s: disposed\n", ACT_ActionGetName(action));
-}
diff --git a/source/blender/blenlib/BLI_storage_types.h b/source/blender/blenlib/BLI_storage_types.h
index 825a8bc9cbd..ebce33852a1 100644
--- a/source/blender/blenlib/BLI_storage_types.h
+++ b/source/blender/blenlib/BLI_storage_types.h
@@ -52,6 +52,8 @@ struct header{
typedef unsigned int mode_t;
#endif
+struct ImBuf;
+
struct direntry{
char *string;
mode_t type;
@@ -68,6 +70,7 @@ struct direntry{
char extra[16];
void *poin;
int nr;
+ struct ImBuf *image;
};
struct dirlink
diff --git a/source/blender/blenlib/intern/BLI_kdtree.c b/source/blender/blenlib/intern/BLI_kdtree.c
new file mode 100644
index 00000000000..dbb9e95d379
--- /dev/null
+++ b/source/blender/blenlib/intern/BLI_kdtree.c
@@ -0,0 +1,327 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: none of this file.
+ *
+ * Contributor(s): Janne Karhu
+ * Brecht Van Lommel
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_arithb.h"
+#include "BLI_kdtree.h"
+
+#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
+
+typedef struct KDTreeNode {
+ struct KDTreeNode *left, *right;
+ float co[3], nor[3];
+ int index;
+ short d;
+} KDTreeNode;
+
+struct KDTree {
+ KDTreeNode *nodes;
+ int totnode;
+ KDTreeNode *root;
+};
+
+KDTree *BLI_kdtree_new(int maxsize)
+{
+ KDTree *tree;
+
+ tree= MEM_callocN(sizeof(KDTree), "KDTree");
+ tree->nodes= MEM_callocN(sizeof(KDTreeNode)*maxsize, "KDTreeNode");
+ tree->totnode= 0;
+
+ return tree;
+}
+
+void BLI_kdtree_free(KDTree *tree)
+{
+ if(tree) {
+ MEM_freeN(tree->nodes);
+ MEM_freeN(tree);
+ }
+}
+
+void BLI_kdtree_insert(KDTree *tree, int index, float *co, float *nor)
+{
+ KDTreeNode *node= &tree->nodes[tree->totnode++];
+
+ node->index= index;
+ VecCopyf(node->co, co);
+ if(nor) VecCopyf(node->nor, nor);
+}
+
+static KDTreeNode *kdtree_balance(KDTreeNode *nodes, int totnode, int axis)
+{
+ KDTreeNode *node;
+ float co;
+ int left, right, median, i, j;
+
+ if(totnode <= 0)
+ return NULL;
+ else if(totnode == 1)
+ return nodes;
+
+ /* quicksort style sorting around median */
+ left= 0;
+ right= totnode-1;
+ median= totnode/2;
+
+ while(right > left) {
+ co= nodes[right].co[axis];
+ i= left-1;
+ j= right;
+
+ while(1) {
+ while(nodes[++i].co[axis] < co);
+ while(nodes[--j].co[axis] > co && j>left);
+
+ if(i >= j) break;
+ SWAP(KDTreeNode, nodes[i], nodes[j]);
+ }
+
+ SWAP(KDTreeNode, nodes[i], nodes[right]);
+ if(i >= median)
+ right= i-1;
+ if(i <= median)
+ left= i+1;
+ }
+
+ /* set node and sort subnodes */
+ node= &nodes[median];
+ node->d= axis;
+ node->left= kdtree_balance(nodes, median, (axis+1)%3);
+ node->right= kdtree_balance(nodes+median+1, (totnode-(median+1)), (axis+1)%3);
+
+ return node;
+}
+
+void BLI_kdtree_balance(KDTree *tree)
+{
+ tree->root= kdtree_balance(tree->nodes, tree->totnode, 0);
+}
+
+static float squared_distance(float *v1, float *v2, float *n1, float *n2)
+{
+ float d[3], dist;
+
+ d[0]= v2[0]-v1[0];
+ d[1]= v2[1]-v1[1];
+ d[2]= v2[2]-v1[2];
+
+ dist= d[0]*d[0] + d[1]*d[1] + d[2]*d[2];
+
+ if(n1 && n2 && n1[0]*n2[0] + n1[1]*n2[1] + n1[2]*n2[2] < 0.0f)
+ dist *= 10.0f;
+
+ return dist;
+}
+
+int BLI_kdtree_find_nearest(KDTree *tree, float *co, float *nor, KDTreeNearest *nearest)
+{
+ KDTreeNode *root, *node, *min_node;
+ KDTreeNode **stack, *defaultstack[100];
+ float min_dist, cur_dist;
+ int totstack, cur=0;
+
+ if(!tree->root)
+ return -1;
+
+ stack= defaultstack;
+ totstack= 100;
+
+ root= tree->root;
+ min_node= root;
+ min_dist= squared_distance(root->co,co,root->nor,nor);
+
+ if(root->left)
+ stack[cur++]=root->left;
+
+ if(root->right)
+ stack[cur++]=root->right;
+
+ while(cur--){
+ node=stack[cur];
+
+ cur_dist = node->co[node->d] - co[node->d];
+
+ if(cur_dist<0.0){
+ cur_dist= -cur_dist*cur_dist;
+
+ if(-cur_dist<min_dist){
+ cur_dist=squared_distance(node->co,co,node->nor,nor);
+ if(cur_dist<min_dist){
+ min_dist=cur_dist;
+ min_node=node;
+ }
+ if(node->left)
+ stack[cur++]=node->left;
+ }
+ if(node->right)
+ stack[cur++]=node->right;
+ }
+ else{
+ cur_dist= cur_dist*cur_dist;
+
+ if(cur_dist<min_dist){
+ cur_dist=squared_distance(node->co,co,node->nor,nor);
+ if(cur_dist<min_dist){
+ min_dist=cur_dist;
+ min_node=node;
+ }
+ if(node->right)
+ stack[cur++]=node->right;
+ }
+ if(node->left)
+ stack[cur++]=node->left;
+ }
+ if(cur+3 > totstack){
+ KDTreeNode **temp=MEM_callocN((totstack+100)*sizeof(KDTreeNode*), "psys_treestack");
+ memcpy(temp,stack,totstack*sizeof(KDTreeNode*));
+ if(stack != defaultstack)
+ MEM_freeN(stack);
+ stack=temp;
+ totstack+=100;
+ }
+ }
+
+ if(nearest) {
+ nearest->index= min_node->index;
+ nearest->dist= sqrt(min_dist);
+ VecCopyf(nearest->co, min_node->co);
+ }
+
+ if(stack != defaultstack)
+ MEM_freeN(stack);
+
+ return min_node->index;
+}
+
+static void add_nearest(KDTreeNearest *ptn, int *found, int n, int index, float dist, float *co)
+{
+ int i;
+
+ if(*found<n) (*found)++;
+
+ for(i=*found-1; i>0; i--) {
+ if(dist >= ptn[i-1].dist)
+ break;
+ else
+ ptn[i]= ptn[i-1];
+ }
+
+ ptn[i].index= index;
+ ptn[i].dist= dist;
+ VecCopyf(ptn[i].co, co);
+}
+
+/* finds the nearest n entries in tree to specified coordinates */
+int BLI_kdtree_find_n_nearest(KDTree *tree, int n, float *co, float *nor, KDTreeNearest *nearest)
+{
+ KDTreeNode *root, *node=0;
+ KDTreeNode **stack, *defaultstack[100];
+ float cur_dist;
+ int i, totstack, cur=0, found=0;
+
+ if(!tree->root)
+ return 0;
+
+ stack= defaultstack;
+ totstack= 100;
+
+ root= tree->root;
+
+ cur_dist= squared_distance(root->co,co,root->nor,nor);
+ add_nearest(nearest,&found,n,root->index,cur_dist,root->co);
+
+ if(root->left)
+ stack[cur++]=root->left;
+
+ if(root->right)
+ stack[cur++]=root->right;
+
+ while(cur--){
+ node=stack[cur];
+
+ cur_dist = node->co[node->d] - co[node->d];
+
+ if(cur_dist<0.0){
+ cur_dist= -cur_dist*cur_dist;
+
+ if(found<n || -cur_dist<nearest[found-1].dist){
+ cur_dist=squared_distance(node->co,co,node->nor,nor);
+
+ if(found<n || cur_dist<nearest[found-1].dist)
+ add_nearest(nearest,&found,n,node->index,cur_dist,node->co);
+
+ if(node->left)
+ stack[cur++]=node->left;
+ }
+ if(node->right)
+ stack[cur++]=node->right;
+ }
+ else{
+ cur_dist= cur_dist*cur_dist;
+
+ if(found<n || cur_dist<nearest[found-1].dist){
+ cur_dist=squared_distance(node->co,co,node->nor,nor);
+ if(found<n || cur_dist<nearest[found-1].dist)
+ add_nearest(nearest,&found,n,node->index,cur_dist,node->co);
+
+ if(node->right)
+ stack[cur++]=node->right;
+ }
+ if(node->left)
+ stack[cur++]=node->left;
+ }
+ if(cur+3 > totstack){
+ KDTreeNode **temp=MEM_callocN((totstack+100)*sizeof(KDTreeNode*), "psys_treestack");
+ memcpy(temp,stack,totstack*sizeof(KDTreeNode*));
+ if(stack != defaultstack)
+ MEM_freeN(stack);
+ stack=temp;
+ totstack+=100;
+ }
+ }
+
+ for(i=0; i<found; i++)
+ nearest[i].dist= sqrt(nearest[i].dist);
+
+ if(stack != defaultstack)
+ MEM_freeN(stack);
+
+ return found;
+}
+
diff --git a/source/blender/blenlib/intern/Makefile b/source/blender/blenlib/intern/Makefile
index 0c3f4a486be..68148a1eb37 100644
--- a/source/blender/blenlib/intern/Makefile
+++ b/source/blender/blenlib/intern/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
# CPPFLAGS += $(LEVEL_2_CPP_WARNINGS)
# path to SDNA types
diff --git a/source/blender/blenlib/intern/arithb.c b/source/blender/blenlib/intern/arithb.c
index 182607740a5..15ea647361f 100644
--- a/source/blender/blenlib/intern/arithb.c
+++ b/source/blender/blenlib/intern/arithb.c
@@ -760,7 +760,28 @@ void Mat4MulSerie(float answ[][4], float m1[][4],
}
}
+void Mat4BlendMat4(float out[][4], float dst[][4], float src[][4], float srcweight)
+{
+ float squat[4], dquat[4], fquat[4];
+ float ssize[3], dsize[3], fsize[4];
+ float sloc[3], dloc[3], floc[3];
+
+ Mat4ToQuat(dst, dquat);
+ Mat4ToSize(dst, dsize);
+ VecCopyf(dloc, dst[3]);
+ Mat4ToQuat(src, squat);
+ Mat4ToSize(src, ssize);
+ VecCopyf(sloc, src[3]);
+
+ /* do blending */
+ VecLerpf(floc, dloc, sloc, srcweight);
+ QuatInterpol(fquat, dquat, squat, srcweight);
+ VecLerpf(fsize, dsize, ssize, srcweight);
+
+ /* compose new matrix */
+ LocQuatSizeToMat4(out, floc, fquat, fsize);
+}
void Mat4Clr(float *m)
{
@@ -915,7 +936,7 @@ void Mat4MulFloat(float *m, float f)
{
int i;
- for(i=0;i<12;i++) m[i]*=f; /* count to 12: without vector component */
+ for(i=0;i<16;i++) m[i]*=f; /* count to 12: without vector component */
}
@@ -931,6 +952,24 @@ void Mat4MulFloat3(float *m, float f) /* only scale component */
}
}
+void Mat3AddMat3(float m1[][3], float m2[][3], float m3[][3])
+{
+ int i, j;
+
+ for(i=0;i<3;i++)
+ for(j=0;j<3;j++)
+ m1[i][j]= m2[i][j] + m3[i][j];
+}
+
+void Mat4AddMat4(float m1[][4], float m2[][4], float m3[][4])
+{
+ int i, j;
+
+ for(i=0;i<4;i++)
+ for(j=0;j<4;j++)
+ m1[i][j]= m2[i][j] + m3[i][j];
+}
+
void VecStar(float mat[][3], float *vec)
{
@@ -1070,6 +1109,7 @@ void QuatInv(float *q)
QuatMulf(q, 1.0f/f);
}
+/* simple mult */
void QuatMulf(float *q, float f)
{
q[0] *= f;
@@ -1085,6 +1125,20 @@ void QuatSub(float *q, float *q1, float *q2)
q2[0]= -q2[0];
}
+/* angular mult factor */
+void QuatMulFac(float *q, float fac)
+{
+ float angle= fac*saacos(q[0]); /* quat[0]= cos(0.5*angle), but now the 0.5 and 2.0 rule out */
+
+ float co= (float)cos(angle);
+ float si= (float)sin(angle);
+ q[0]= co;
+ Normalize(q+1);
+ q[1]*= si;
+ q[2]*= si;
+ q[3]*= si;
+
+}
void QuatToMat3( float *q, float m[][3])
{
@@ -1558,6 +1612,225 @@ void QuatAdd(float *result, float *quat1, float *quat2, float t)
result[3]= quat1[3] + t*quat2[3];
}
+void QuatCopy(float *q1, float *q2)
+{
+ q1[0]= q2[0];
+ q1[1]= q2[1];
+ q1[2]= q2[2];
+ q1[3]= q2[3];
+}
+
+/* **************** DUAL QUATERNIONS ************** */
+
+/*
+ Conversion routines between (regular quaternion, translation) and
+ dual quaternion.
+
+ Version 1.0.0, February 7th, 2007
+
+ Copyright (C) 2006-2007 University of Dublin, Trinity College, All Rights
+ Reserved
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the author(s) 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.
+
+ Author: Ladislav Kavan, kavanl@cs.tcd.ie
+
+ Changes for Blender:
+ - renaming, style changes and optimizations
+ - added support for scaling
+*/
+
+void Mat4ToDQuat(float basemat[][4], float mat[][4], DualQuat *dq)
+{
+ float *t, *q, dscale[3], scale[3], basequat[4];
+ float baseRS[4][4], baseinv[4][4], baseR[4][4], baseRinv[4][4];
+ float R[4][4], S[4][4];
+
+ /* split scaling and rotation, there is probably a faster way to do
+ this, it's done like this now to correctly get negative scaling */
+ Mat4MulMat4(baseRS, basemat, mat);
+ Mat4ToSize(baseRS, scale);
+
+ VecCopyf(dscale, scale);
+ dscale[0] -= 1.0f; dscale[1] -= 1.0f; dscale[2] -= 1.0f;
+
+ if((Det4x4(mat) < 0.0f) || VecLength(dscale) > 1e-4) {
+ /* extract R and S */
+ Mat4ToQuat(baseRS, basequat);
+ QuatToMat4(basequat, baseR);
+ VecCopyf(baseR[3], baseRS[3]);
+
+ Mat4Invert(baseinv, basemat);
+ Mat4MulMat4(R, baseinv, baseR);
+
+ Mat4Invert(baseRinv, baseR);
+ Mat4MulMat4(S, baseRS, baseRinv);
+
+ /* set scaling part */
+ Mat4MulSerie(dq->scale, basemat, S, baseinv, 0, 0, 0, 0, 0);
+ dq->scale_weight= 1.0f;
+ }
+ else {
+ /* matrix does not contain scaling */
+ Mat4CpyMat4(R, mat);
+ dq->scale_weight= 0.0f;
+ }
+
+ /* non-dual part */
+ Mat4ToQuat(R, dq->quat);
+
+ /* dual part */
+ t= R[3];
+ q= dq->quat;
+ dq->trans[0]= -0.5f*( t[0]*q[1] + t[1]*q[2] + t[2]*q[3]);
+ dq->trans[1]= 0.5f*( t[0]*q[0] + t[1]*q[3] - t[2]*q[2]);
+ dq->trans[2]= 0.5f*(-t[0]*q[3] + t[1]*q[0] + t[2]*q[1]);
+ dq->trans[3]= 0.5f*( t[0]*q[2] - t[1]*q[1] + t[2]*q[0]);
+}
+
+void DQuatToMat4(DualQuat *dq, float mat[][4])
+{
+ float len, *t, q0[4];
+
+ /* regular quaternion */
+ QuatCopy(q0, dq->quat);
+
+ /* normalize */
+ len= sqrt(QuatDot(q0, q0));
+ if(len != 0.0f)
+ QuatMulf(q0, 1.0f/len);
+
+ /* rotation */
+ QuatToMat4(q0, mat);
+
+ /* translation */
+ t= dq->trans;
+ mat[3][0]= 2.0*(-t[0]*q0[1] + t[1]*q0[0] - t[2]*q0[3] + t[3]*q0[2]);
+ mat[3][1]= 2.0*(-t[0]*q0[2] + t[1]*q0[3] + t[2]*q0[0] - t[3]*q0[1]);
+ mat[3][2]= 2.0*(-t[0]*q0[3] - t[1]*q0[2] + t[2]*q0[1] + t[3]*q0[0]);
+
+ /* note: this does not handle scaling */
+}
+
+void DQuatAddWeighted(DualQuat *dqsum, DualQuat *dq, float weight)
+{
+ /* make sure we interpolate quats in the right direction */
+ if (QuatDot(dq->quat, dqsum->quat) < 0)
+ weight = -weight;
+
+ /* interpolate rotation and translation */
+ dqsum->quat[0] += weight*dq->quat[0];
+ dqsum->quat[1] += weight*dq->quat[1];
+ dqsum->quat[2] += weight*dq->quat[2];
+ dqsum->quat[3] += weight*dq->quat[3];
+
+ dqsum->trans[0] += weight*dq->trans[0];
+ dqsum->trans[1] += weight*dq->trans[1];
+ dqsum->trans[2] += weight*dq->trans[2];
+ dqsum->trans[3] += weight*dq->trans[3];
+
+ /* interpolate scale - but only if needed */
+ if (dq->scale_weight) {
+ float wmat[4][4];
+
+ Mat4CpyMat4(wmat, dq->scale);
+ Mat4MulFloat((float*)wmat, weight);
+ Mat4AddMat4(dqsum->scale, dqsum->scale, wmat);
+ dqsum->scale_weight += weight;
+ }
+}
+
+void DQuatNormalize(DualQuat *dq, float totweight)
+{
+ float scale= 1.0f/totweight;
+
+ QuatMulf(dq->quat, scale);
+ QuatMulf(dq->trans, scale);
+
+ if(dq->scale_weight) {
+ float addweight= totweight - dq->scale_weight;
+
+ if(addweight) {
+ dq->scale[0][0] += addweight;
+ dq->scale[1][1] += addweight;
+ dq->scale[2][2] += addweight;
+ dq->scale[3][3] += addweight;
+ }
+
+ Mat4MulFloat((float*)dq->scale, scale);
+ dq->scale_weight= 1.0f;
+ }
+}
+
+void DQuatMulVecfl(DualQuat *dq, float *co, float mat[][3])
+{
+ float M[3][3], t[3], scalemat[3][3], len2;
+ float w= dq->quat[0], x= dq->quat[1], y= dq->quat[2], z= dq->quat[3];
+ float t0= dq->trans[0], t1= dq->trans[1], t2= dq->trans[2], t3= dq->trans[3];
+
+ /* rotation matrix */
+ M[0][0]= w*w + x*x - y*y - z*z;
+ M[1][0]= 2*(x*y - w*z);
+ M[2][0]= 2*(x*z + w*y);
+
+ M[0][1]= 2*(x*y + w*z);
+ M[1][1]= w*w + y*y - x*x - z*z;
+ M[2][1]= 2*(y*z - w*x);
+
+ M[0][2]= 2*(x*z - w*y);
+ M[1][2]= 2*(y*z + w*x);
+ M[2][2]= w*w + z*z - x*x - y*y;
+
+ len2= QuatDot(dq->quat, dq->quat);
+ if(len2 > 0.0f)
+ len2= 1.0f/len2;
+
+ /* translation */
+ t[0]= 2*(-t0*x + w*t1 - t2*z + y*t3);
+ t[1]= 2*(-t0*y + t1*z - x*t3 + w*t2);
+ t[2]= 2*(-t0*z + x*t2 + w*t3 - t1*y);
+
+ /* apply scaling */
+ if(dq->scale_weight)
+ Mat4MulVecfl(dq->scale, co);
+
+ /* apply rotation and translation */
+ Mat3MulVecfl(M, co);
+ co[0]= (co[0] + t[0])*len2;
+ co[1]= (co[1] + t[1])*len2;
+ co[2]= (co[2] + t[2])*len2;
+
+ /* compute crazyspace correction mat */
+ if(mat) {
+ if(dq->scale_weight) {
+ Mat3CpyMat4(scalemat, dq->scale);
+ Mat3MulMat3(mat, M, scalemat);
+ }
+ else
+ Mat3CpyMat3(mat, M);
+ Mat3MulFloat((float*)mat, len2);
+ }
+}
+
+void DQuatCpyDQuat(DualQuat *dq1, DualQuat *dq2)
+{
+ memcpy(dq1, dq2, sizeof(DualQuat));
+}
+
/* **************** VIEW / PROJECTION ******************************** */
@@ -1767,7 +2040,6 @@ void Mat4Ortho(float mat[][4])
void VecCopyf(float *v1, float *v2)
{
-
v1[0]= v2[0];
v1[1]= v2[1];
v1[2]= v2[2];
@@ -1836,6 +2108,30 @@ void VecMulf(float *v1, float f)
v1[2]*= f;
}
+void VecOrthoBasisf(float *v, float *v1, float *v2)
+{
+ if (v[0] == 0.0f && v[1] == 0.0f)
+ {
+ // degenerate case
+ v1[0] = 0.0f; v1[1] = 1.0f; v1[2] = 0.0f;
+ if (v[2] > 0.0f) {
+ v2[0] = 1.0f; v2[1] = v2[2] = 0.0f;
+ }
+ else {
+ v2[0] = -1.0f; v2[1] = v2[2] = 0.0f;
+ }
+ }
+ else
+ {
+ float f = 1.0f/sqrt(v[0]*v[0] + v[1]*v[1]);
+ v1[0] = v[1]*f;
+ v1[1] = -v[0]*f;
+ v1[2] = 0.0f;
+
+ Crossf(v2, v, v1);
+ }
+}
+
int VecLenCompare(float *v1, float *v2, float limit)
{
float x,y,z;
@@ -2125,6 +2421,98 @@ short IsectLL2Df(float *v1, float *v2, float *v3, float *v4)
return 0;
}
+/*
+-1: colliniar
+ 1: intersection
+
+*/
+short IsectLLPt2Df(float x0,float y0,float x1,float y1,
+ float x2,float y2,float x3,float y3, float *xi,float *yi)
+
+{
+ /*
+ this function computes the intersection of the sent lines
+ and returns the intersection point, note that the function assumes
+ the lines intersect. the function can handle vertical as well
+ as horizontal lines. note the function isn't very clever, it simply
+ applies the math, but we don't need speed since this is a
+ pre-processing step
+ */
+ float c1,c2, // constants of linear equations
+ det_inv, // the inverse of the determinant of the coefficient
+ m1,m2; // the slopes of each line
+ /*
+ compute slopes, note the cludge for infinity, however, this will
+ be close enough
+ */
+ if ( fabs( x1-x0 ) > 0.000001 )
+ m1 = ( y1-y0 ) / ( x1-x0 );
+ else
+ return -1; /*m1 = ( float ) 1e+10;*/ // close enough to infinity
+
+ if ( fabs( x3-x2 ) > 0.000001 )
+ m2 = ( y3-y2 ) / ( x3-x2 );
+ else
+ return -1; /*m2 = ( float ) 1e+10;*/ // close enough to infinity
+
+ if (fabs(m1-m2) < 0.000001)
+ return -1; /* paralelle lines */
+
+// compute constants
+
+ c1 = ( y0-m1*x0 );
+ c2 = ( y2-m2*x2 );
+
+// compute the inverse of the determinate
+
+ det_inv = 1.0f / ( -m1 + m2 );
+
+// use Kramers rule to compute xi and yi
+
+ *xi= ( ( -c2 + c1 ) *det_inv );
+ *yi= ( ( m2*c1 - m1*c2 ) *det_inv );
+
+ return 1;
+} // end Intersect_Lines
+
+#define SIDE_OF_LINE(pa,pb,pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
+#define ISECT_EPSILON 1e-6
+
+/* point in tri */
+int IsectPT2Df(float pt[2], float v1[2], float v2[2], float v3[2])
+{
+ if ((SIDE_OF_LINE(v1,v2,pt)>=-ISECT_EPSILON) &&
+ (SIDE_OF_LINE(v2,v3,pt)>=-ISECT_EPSILON) &&
+ (SIDE_OF_LINE(v3,v1,pt)>=-ISECT_EPSILON))
+ return 1;
+ else {
+ return 0;
+ }
+}
+/* point in quad - only convex quads */
+int IsectPQ2Df(float pt[2], float v1[2], float v2[2], float v3[2], float v4[2])
+{
+ if ((SIDE_OF_LINE(v1,v2,pt)>=-ISECT_EPSILON) &&
+ (SIDE_OF_LINE(v2,v3,pt)>=-ISECT_EPSILON) &&
+ (SIDE_OF_LINE(v3,v4,pt)>=-ISECT_EPSILON) &&
+ (SIDE_OF_LINE(v4,v1,pt)>=-ISECT_EPSILON))
+ return 1;
+ else
+ return 0;
+}
+
+
+
+ /* copied from Geometry.c - todo - move to arithb.c or some other generic place we can reuse */
+#define SIDE_OF_LINE(pa,pb,pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
+#define POINT_IN_TRI(p0,p1,p2,p3) ((SIDE_OF_LINE(p1,p2,p0)>=0) && (SIDE_OF_LINE(p2,p3,p0)>=0) && (SIDE_OF_LINE(p3,p1,p0)>=0))
+
+/**
+ *
+ * @param min
+ * @param max
+ * @param vec
+ */
void MinMax3(float *min, float *max, float *vec)
{
if(min[0]>vec[0]) min[0]= vec[0];
@@ -2225,7 +2613,53 @@ void InterpWeightsQ3Dfl(float *v1, float *v2, float *v3, float *v4, float *co, f
else
BarycentricWeights(v1, v2, v3, co, n, w);
}
-}
+}
+
+/* Mean value weights - smooth interpolation weights for polygons with
+ * more than 3 vertices */
+static float MeanValueHalfTan(float *v1, float *v2, float *v3)
+{
+ float d2[3], d3[3], cross[3], area, dot, len;
+
+ VecSubf(d2, v2, v1);
+ VecSubf(d3, v3, v1);
+ Crossf(cross, d2, d3);
+
+ area= VecLength(cross);
+ dot= Inpf(d2, d3);
+ len= VecLength(d2)*VecLength(d3);
+
+ if(area == 0.0f)
+ return 0.0f;
+ else
+ return (len - dot)/area;
+}
+
+void MeanValueWeights(float v[][3], int n, float *co, float *w)
+{
+ float totweight, t1, t2, len, *vmid, *vprev, *vnext;
+ int i;
+
+ totweight= 0.0f;
+
+ for(i=0; i<n; i++) {
+ vmid= v[i];
+ vprev= (i == 0)? v[n-1]: v[i-1];
+ vnext= (i == n-1)? v[0]: v[i+1];
+
+ t1= MeanValueHalfTan(co, vprev, vmid);
+ t2= MeanValueHalfTan(co, vmid, vnext);
+
+ len= VecLenf(co, vmid);
+ w[i]= (t1+t2)/len;
+ totweight += w[i];
+ }
+
+ if(totweight != 0.0f)
+ for(i=0; i<n; i++)
+ w[i] /= totweight;
+}
+
/* ************ EULER *************** */
@@ -2391,6 +2825,15 @@ void VecRotToMat3( float *vec, float phi, float mat[][3])
}
+void VecRotToMat4( float *vec, float phi, float mat[][4])
+{
+ float tmat[3][3];
+
+ VecRotToMat3(vec, phi, tmat);
+ Mat4One(mat);
+ Mat4CpyMat3(mat, tmat);
+}
+
void VecRotToQuat( float *vec, float phi, float *quat)
{
/* rotation of phi radials around vec */
@@ -2399,7 +2842,7 @@ void VecRotToQuat( float *vec, float phi, float *quat)
quat[1]= vec[0];
quat[2]= vec[1];
quat[3]= vec[2];
-
+
if( Normalize(quat+1) == 0.0) {
QuatOne(quat);
}
@@ -2577,32 +3020,48 @@ void SizeToMat3( float *size, float mat[][3])
mat[2][0]= 0.0;
}
-void Mat3ToSize( float mat[][3], float *size)
+void SizeToMat4( float *size, float mat[][4])
{
- float vec[3];
-
- VecCopyf(vec, mat[0]);
- size[0]= Normalize(vec);
- VecCopyf(vec, mat[1]);
- size[1]= Normalize(vec);
- VecCopyf(vec, mat[2]);
- size[2]= Normalize(vec);
+ float tmat[3][3];
+
+ SizeToMat3(size, tmat);
+ Mat4One(mat);
+ Mat4CpyMat3(mat, tmat);
+}
+void Mat3ToSize( float mat[][3], float *size)
+{
+ size[0]= VecLength(mat[0]);
+ size[1]= VecLength(mat[1]);
+ size[2]= VecLength(mat[2]);
}
void Mat4ToSize( float mat[][4], float *size)
{
- float vec[3];
-
+ size[0]= VecLength(mat[0]);
+ size[1]= VecLength(mat[1]);
+ size[2]= VecLength(mat[2]);
+}
- VecCopyf(vec, mat[0]);
- size[0]= Normalize(vec);
- VecCopyf(vec, mat[1]);
- size[1]= Normalize(vec);
- VecCopyf(vec, mat[2]);
- size[2]= Normalize(vec);
+/* this gets the average scale of a matrix, only use when your scaling
+ * data that has no idea of scale axis, examples are bone-envelope-radius
+ * and curve radius */
+float Mat3ToScalef(float mat[][3])
+{
+ /* unit length vector */
+ float unit_vec[3] = {0.577350269189626, 0.577350269189626, 0.577350269189626};
+ Mat3MulVecfl(mat, unit_vec);
+ return VecLength(unit_vec);
}
+float Mat4ToScalef(float mat[][4])
+{
+ float tmat[3][3];
+ Mat3CpyMat4(tmat, mat);
+ return Mat3ToScalef(tmat);
+}
+
+
/* ************* SPECIALS ******************* */
void triatoquat( float *v1, float *v2, float *v3, float *quat)
@@ -2668,6 +3127,11 @@ float Vec2Lenf(float *v1, float *v2)
return (float)sqrt(x*x+y*y);
}
+float Vec2Length(float *v)
+{
+ return (float)sqrt(v[0]*v[0] + v[1]*v[1]);
+}
+
void Vec2Mulf(float *v1, float f)
{
v1[0]*= f;
@@ -3134,7 +3598,7 @@ void mul_v3_v3m4(float *v1, float *v2, float mat[][4])
test if the line starting at p1 ending at p2 intersects the triangle v0..v2
return non zero if it does
*/
-int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda)
+int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda, float *uv)
{
float p[3], s[3], d[3], e1[3], e2[3], q[3];
@@ -3160,15 +3624,318 @@ int LineIntersectsTriangle(float p1[3], float p2[3], float v0[3], float v1[3], f
v = f * Inpf(d, q);
if ((v < 0.0)||((u + v) > 1.0)) return 0;
+
+ if(uv) {
+ uv[0]= u;
+ uv[1]= v;
+ }
return 1;
}
+/* Adapted from the paper by Kasper Fauerby */
+/* "Improved Collision detection and Response" */
+int SweepingSphereIntersectsTriangleUV(float p1[3], float p2[3], float radius, float v0[3], float v1[3], float v2[3], float *lambda, float *ipoint)
+{
+ float e1[3], e2[3], e3[3], point[3], vel[3], /*dist[3],*/ nor[3], temp[3], bv[3];
+ float a, b, c, d, e, x, y, z, t, t0, t1, radius2=radius*radius;
+ float elen2,edotv,edotbv,nordotv,vel2;
+ int embedded_in_plane=0, found_by_sweep=0;
-/*
-find closest point to p on line through l1,l2
-and return lambda, where (0 <= lambda <= 1) when cp is in the line segement l1,l2
-*/
+ VecSubf(e1,v1,v0);
+ VecSubf(e2,v2,v0);
+ VecSubf(vel,p2,p1);
+
+/*---test plane of tri---*/
+ Crossf(nor,e1,e2);
+ Normalize(nor);
+ /* flip normal */
+ if(Inpf(nor,vel)>0.0f) VecMulf(nor,-1.0f);
+
+ a=Inpf(p1,nor)-Inpf(v0,nor);
+
+ nordotv=Inpf(nor,vel);
+
+ if ((nordotv > -0.000001) && (nordotv < 0.000001)) {
+ if(fabs(a)>=1.0f)
+ return 0;
+ else{
+ embedded_in_plane=1;
+ t0=0.0f;
+ t1=1.0f;
+ }
+ }
+ else{
+ t0=(radius-a)/nordotv;
+ t1=(-radius-a)/nordotv;
+ /* make t0<t1 */
+ if(t0>t1){b=t1; t1=t0; t0=b;}
+
+ if(t0>1.0f || t1<0.0f) return 0;
+
+ /* clamp to [0,1] */
+ t0=(t0<0.0f)?0.0f:((t0>1.0f)?1.0:t0);
+ t1=(t1<0.0f)?0.0f:((t1>1.0f)?1.0:t1);
+ }
+
+/*---test inside of tri---*/
+ if(embedded_in_plane==0){
+ /* plane intersection point */
+ VecCopyf(point,vel);
+ VecMulf(point,t0);
+ VecAddf(point,point,p1);
+ VecCopyf(temp,nor);
+ VecMulf(temp,radius);
+ VecSubf(point,point,temp);
+
+ /* is the point in the tri? */
+ a=Inpf(e1,e1);
+ b=Inpf(e1,e2);
+ c=Inpf(e2,e2);
+
+ VecSubf(temp,point,v0);
+ d=Inpf(temp,e1);
+ e=Inpf(temp,e2);
+
+ x=d*c-e*b;
+ y=e*a-d*b;
+ z=x+y-(a*c-b*b);
+
+ if(( ((unsigned int)z)& ~(((unsigned int)x)|((unsigned int)y)) ) & 0x80000000){
+ *lambda=t0;
+ VecCopyf(ipoint,point);
+ return 1;
+ }
+ }
+
+ *lambda=1.0f;
+/*---test points---*/
+ a=vel2=Inpf(vel,vel);
+
+ /*v0*/
+ VecSubf(temp,p1,v0);
+ b=2.0f*Inpf(vel,temp);
+ c=Inpf(temp,temp)-radius2;
+ d=b*b-4*a*c;
+
+ if(d>=0.0f){
+ if(d==0.0f)
+ t=-b/2*a;
+ else{
+ z=sqrt(d);
+ x=(-b-z)*0.5/a;
+ y=(-b+z)*0.5/a;
+ t=x<y?x:y;
+ }
+
+ if(t>0.0 && t < *lambda){
+ *lambda=t;
+ VecCopyf(ipoint,v0);
+ found_by_sweep=1;
+ }
+ }
+
+ /*v1*/
+ VecSubf(temp,p1,v1);
+ b=2.0f*Inpf(vel,temp);
+ c=Inpf(temp,temp)-radius2;
+ d=b*b-4*a*c;
+
+ if(d>=0.0f){
+ if(d==0.0f)
+ t=-b/2*a;
+ else{
+ z=sqrt(d);
+ x=(-b-z)*0.5/a;
+ y=(-b+z)*0.5/a;
+ t=x<y?x:y;
+ }
+
+ if(t>0.0 && t < *lambda){
+ *lambda=t;
+ VecCopyf(ipoint,v1);
+ found_by_sweep=1;
+ }
+ }
+ /*v2*/
+ VecSubf(temp,p1,v2);
+ b=2.0f*Inpf(vel,temp);
+ c=Inpf(temp,temp)-radius2;
+ d=b*b-4*a*c;
+
+ if(d>=0.0f){
+ if(d==0.0f)
+ t=-b/2*a;
+ else{
+ z=sqrt(d);
+ x=(-b-z)*0.5/a;
+ y=(-b+z)*0.5/a;
+ t=x<y?x:y;
+ }
+
+ if(t>0.0 && t < *lambda){
+ *lambda=t;
+ VecCopyf(ipoint,v2);
+ found_by_sweep=1;
+ }
+ }
+
+/*---test edges---*/
+ /*e1*/
+ VecSubf(bv,v0,p1);
+ elen2 = Inpf(e1,e1);
+ edotv = Inpf(e1,vel);
+ edotbv = Inpf(e1,bv);
+
+ a=elen2*(-Inpf(vel,vel))+edotv*edotv;
+ b=2.0f*(elen2*Inpf(vel,bv)-edotv*edotbv);
+ c=elen2*(radius2-Inpf(bv,bv))+edotbv*edotbv;
+ d=b*b-4*a*c;
+ if(d>=0.0f){
+ if(d==0.0f)
+ t=-b/2*a;
+ else{
+ z=sqrt(d);
+ x=(-b-z)*0.5/a;
+ y=(-b+z)*0.5/a;
+ t=x<y?x:y;
+ }
+
+ e=(edotv*t-edotbv)/elen2;
+
+ if((e>=0.0f) && (e<=1.0f)){
+ if(t>0.0 && t < *lambda){
+ *lambda=t;
+ VecCopyf(ipoint,e1);
+ VecMulf(ipoint,e);
+ VecAddf(ipoint,ipoint,v0);
+ found_by_sweep=1;
+ }
+ }
+ }
+
+ /*e2*/
+ /*bv is same*/
+ elen2 = Inpf(e2,e2);
+ edotv = Inpf(e2,vel);
+ edotbv = Inpf(e2,bv);
+
+ a=elen2*(-Inpf(vel,vel))+edotv*edotv;
+ b=2.0f*(elen2*Inpf(vel,bv)-edotv*edotbv);
+ c=elen2*(radius2-Inpf(bv,bv))+edotbv*edotbv;
+ d=b*b-4*a*c;
+ if(d>=0.0f){
+ if(d==0.0f)
+ t=-b/2*a;
+ else{
+ z=sqrt(d);
+ x=(-b-z)*0.5/a;
+ y=(-b+z)*0.5/a;
+ t=x<y?x:y;
+ }
+
+ e=(edotv*t-edotbv)/elen2;
+
+ if((e>=0.0f) && (e<=1.0f)){
+ if(t>0.0 && t < *lambda){
+ *lambda=t;
+ VecCopyf(ipoint,e2);
+ VecMulf(ipoint,e);
+ VecAddf(ipoint,ipoint,v0);
+ found_by_sweep=1;
+ }
+ }
+ }
+
+ /*e3*/
+ VecSubf(e3,v2,v1);
+ VecSubf(bv,v1,p1);
+ elen2 = Inpf(e3,e3);
+ edotv = Inpf(e3,vel);
+ edotbv = Inpf(e3,bv);
+
+ a=elen2*(-Inpf(vel,vel))+edotv*edotv;
+ b=2.0f*(elen2*Inpf(vel,bv)-edotv*edotbv);
+ c=elen2*(radius2-Inpf(bv,bv))+edotbv*edotbv;
+ d=b*b-4*a*c;
+ if(d>=0.0f){
+ if(d==0.0f)
+ t=-b/2*a;
+ else{
+ z=sqrt(d);
+ x=(-b-z)*0.5/a;
+ y=(-b+z)*0.5/a;
+ t=x<y?x:y;
+ }
+
+ e=(edotv*t-edotbv)/elen2;
+
+ if((e>=0.0f) && (e<=1.0f)){
+ if(t>0.0 && t < *lambda){
+ *lambda=t;
+ VecCopyf(ipoint,e3);
+ VecMulf(ipoint,e);
+ VecAddf(ipoint,ipoint,v1);
+ found_by_sweep=1;
+ }
+ }
+ }
+
+ return found_by_sweep;
+}
+int AxialLineIntersectsTriangle(int axis, float p1[3], float p2[3], float v0[3], float v1[3], float v2[3], float *lambda)
+{
+ float p[3], e1[3], e2[3];
+ float u, v, f;
+ int a0=axis, a1=(axis+1)%3, a2=(axis+2)%3;
+
+ //return LineIntersectsTriangle(p1,p2,v0,v1,v2,lambda);
+
+ ///* first a simple bounding box test */
+ //if(MIN3(v0[a1],v1[a1],v2[a1]) > p1[a1]) return 0;
+ //if(MIN3(v0[a2],v1[a2],v2[a2]) > p1[a2]) return 0;
+ //if(MAX3(v0[a1],v1[a1],v2[a1]) < p1[a1]) return 0;
+ //if(MAX3(v0[a2],v1[a2],v2[a2]) < p1[a2]) return 0;
+
+ ///* then a full intersection test */
+
+ VecSubf(e1,v1,v0);
+ VecSubf(e2,v2,v0);
+ VecSubf(p,v0,p1);
+
+ f= (e2[a1]*e1[a2]-e2[a2]*e1[a1]);
+ if ((f > -0.000001) && (f < 0.000001)) return 0;
+
+ v= (p[a2]*e1[a1]-p[a1]*e1[a2])/f;
+ if ((v < 0.0)||(v > 1.0)) return 0;
+
+ f= e1[a1];
+ if((f > -0.000001) && (f < 0.000001)){
+ f= e1[a2];
+ if((f > -0.000001) && (f < 0.000001)) 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;
+
+ *lambda = (p[a0]+u*e1[a0]+v*e2[a0])/(p2[a0]-p1[a0]);
+
+ if ((*lambda < 0.0)||(*lambda > 1.0)) return 0;
+
+ return 1;
+}
+
+int AabbIntersectAabb(float min1[3], float max1[3], float min2[3], float max2[3])
+{
+ return (min1[0]<max2[0] && min1[1]<max2[1] && min1[2]<max2[2] &&
+ min2[0]<max1[0] && min2[1]<max1[1] && min2[2]<max1[2]);
+}
+
+/* find closest point to p on line through l1,l2 and return lambda,
+ * where (0 <= lambda <= 1) when cp is in the line segement l1,l2
+ */
float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3])
{
float h[3],u[3],lambda;
@@ -3180,6 +3947,7 @@ float lambda_cp_line_ex(float p[3], float l1[3], float l2[3], float cp[3])
cp[2] = l1[2] + u[2] * lambda;
return lambda;
}
+
/* little sister we only need to know lambda */
float lambda_cp_line(float p[3], float l1[3], float l2[3])
{
@@ -3189,7 +3957,156 @@ float lambda_cp_line(float p[3], float l1[3], float l2[3])
return(Inpf(u,h)/Inpf(u,u));
}
+/* Similar to LineIntersectsTriangleUV, except it operates on a quad and in 2d, assumes point is in quad */
+void PointInQuad2DUV(float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv)
+{
+ float x0,y0, x1,y1, wtot, v2d[2], w1, w2;
+
+ /* used for paralelle lines */
+ float pt3d[3], l1[3], l2[3], pt_on_line[3];
+
+ /* compute 2 edges of the quad intersection point */
+ if (IsectLLPt2Df(v0[0],v0[1],v1[0],v1[1], v2[0],v2[1],v3[0],v3[1], &x0,&y0) == 1) {
+ /* the intersection point between the quad-edge intersection and the point in the quad we want the uv's for */
+ /* should never be paralle !! */
+ /*printf("\tnot paralelle 1\n");*/
+ IsectLLPt2Df(pt[0],pt[1],x0,y0, v0[0],v0[1],v3[0],v3[1], &x1,&y1);
+
+ /* Get the weights from the new intersection point, to each edge */
+ v2d[0] = x1-v0[0];
+ v2d[1] = y1-v0[1];
+ w1 = Vec2Length(v2d);
+
+ v2d[0] = x1-v3[0]; /* some but for the other vert */
+ v2d[1] = y1-v3[1];
+ w2 = Vec2Length(v2d);
+ wtot = w1+w2;
+ /*w1 = w1/wtot;*/
+ /*w2 = w2/wtot;*/
+ uv[0] = w1/wtot;
+ } else {
+ /* lines are paralelle, lambda_cp_line_ex is 3d grrr */
+ /*printf("\tparalelle1\n");*/
+ pt3d[0] = pt[0];
+ pt3d[1] = pt[1];
+ pt3d[2] = l1[2] = l2[2] = 0.0f;
+
+ l1[0] = v0[0]; l1[1] = v0[1];
+ l2[0] = v1[0]; l2[1] = v1[1];
+ lambda_cp_line_ex(pt3d, l1, l2, pt_on_line);
+ v2d[0] = pt[0]-pt_on_line[0]; /* same, for the other vert */
+ v2d[1] = pt[1]-pt_on_line[1];
+ w1 = Vec2Length(v2d);
+
+ l1[0] = v2[0]; l1[1] = v2[1];
+ l2[0] = v3[0]; l2[1] = v3[1];
+ lambda_cp_line_ex(pt3d, l1, l2, pt_on_line);
+ v2d[0] = pt[0]-pt_on_line[0]; /* same, for the other vert */
+ v2d[1] = pt[1]-pt_on_line[1];
+ w2 = Vec2Length(v2d);
+ wtot = w1+w2;
+ uv[0] = w1/wtot;
+ }
+
+ /* Same as above to calc the uv[1] value, alternate calculation */
+
+ if (IsectLLPt2Df(v0[0],v0[1],v3[0],v3[1], v1[0],v1[1],v2[0],v2[1], &x0,&y0) == 1) { /* was v0,v1 v2,v3 now v0,v3 v1,v2*/
+ /* never paralle if above was not */
+ /*printf("\tnot paralelle2\n");*/
+ IsectLLPt2Df(pt[0],pt[1],x0,y0, v0[0],v0[1],v1[0],v1[1], &x1,&y1);/* was v0,v3 now v0,v1*/
+
+ v2d[0] = x1-v0[0];
+ v2d[1] = y1-v0[1];
+ w1 = Vec2Length(v2d);
+
+ v2d[0] = x1-v1[0];
+ v2d[1] = y1-v1[1];
+ w2 = Vec2Length(v2d);
+ wtot = w1+w2;
+ uv[1] = w1/wtot;
+ } else {
+ /* lines are paralelle, lambda_cp_line_ex is 3d grrr */
+ /*printf("\tparalelle2\n");*/
+ pt3d[0] = pt[0];
+ pt3d[1] = pt[1];
+ pt3d[2] = l1[2] = l2[2] = 0.0f;
+
+
+ l1[0] = v0[0]; l1[1] = v0[1];
+ l2[0] = v3[0]; l2[1] = v3[1];
+ lambda_cp_line_ex(pt3d, l1, l2, pt_on_line);
+ v2d[0] = pt[0]-pt_on_line[0]; /* some but for the other vert */
+ v2d[1] = pt[1]-pt_on_line[1];
+ w1 = Vec2Length(v2d);
+
+ l1[0] = v1[0]; l1[1] = v1[1];
+ l2[0] = v2[0]; l2[1] = v2[1];
+ lambda_cp_line_ex(pt3d, l1, l2, pt_on_line);
+ v2d[0] = pt[0]-pt_on_line[0]; /* some but for the other vert */
+ v2d[1] = pt[1]-pt_on_line[1];
+ w2 = Vec2Length(v2d);
+ wtot = w1+w2;
+ uv[1] = w1/wtot;
+ }
+ /* may need to flip UV's here */
+}
+/* same as above but does tri's and quads, tri's are a bit of a hack */
+void PointInFace2DUV(int isquad, float v0[2], float v1[2], float v2[2], float v3[2], float pt[2], float *uv)
+{
+ if (isquad) {
+ PointInQuad2DUV(v0, v1, v2, v3, pt, uv);
+ }
+ else {
+ /* not for quads, use for our abuse of LineIntersectsTriangleUV */
+ float p1_3d[3], p2_3d[3], v0_3d[3], v1_3d[3], v2_3d[3], lambda;
+
+ p1_3d[0] = p2_3d[0] = uv[0];
+ p1_3d[1] = p2_3d[1] = uv[1];
+ p1_3d[2] = 1.0f;
+ p2_3d[2] = -1.0f;
+ v0_3d[2] = v1_3d[2] = v2_3d[2] = 0.0;
+
+ /* generate a new fuv, (this is possibly a non optimal solution,
+ * since we only need 2d calculation but use 3d func's)
+ *
+ * this method makes an imaginary triangle in 2d space using the UV's from the derived mesh face
+ * Then find new uv coords using the fuv and this face with LineIntersectsTriangleUV.
+ * This means the new values will be correct in relation to the derived meshes face.
+ */
+ Vec2Copyf(v0_3d, v0);
+ Vec2Copyf(v1_3d, v1);
+ Vec2Copyf(v2_3d, v2);
+
+ /* Doing this in 3D is not nice */
+ LineIntersectsTriangle(p1_3d, p2_3d, v0_3d, v1_3d, v2_3d, &lambda, uv);
+ }
+}
+
+/* (x1,v1)(t1=0)------(x2,v2)(t2=1), 0<t<1 --> (x,v)(t) */
+void VecfCubicInterpol(float *x1, float *v1, float *x2, float *v2, float t, float *x, float *v)
+{
+ float a[3],b[3];
+ float t2= t*t;
+ float t3= t2*t;
+
+ /* cubic interpolation */
+ a[0]= v1[0] + v2[0] + 2*(x1[0] - x2[0]);
+ a[1]= v1[1] + v2[1] + 2*(x1[1] - x2[1]);
+ a[2]= v1[2] + v2[2] + 2*(x1[2] - x2[2]);
+
+ b[0]= -2*v1[0] - v2[0] - 3*(x1[0] - x2[0]);
+ b[1]= -2*v1[1] - v2[1] - 3*(x1[1] - x2[1]);
+ b[2]= -2*v1[2] - v2[2] - 3*(x1[2] - x2[2]);
+
+ x[0]= a[0]*t3 + b[0]*t2 + v1[0]*t + x1[0];
+ x[1]= a[1]*t3 + b[1]*t2 + v1[1]*t + x1[1];
+ x[2]= a[2]*t3 + b[2]*t2 + v1[2]*t + x1[2];
+
+ v[0]= 3*a[0]*t2 + 2*b[0]*t + v1[0];
+ v[1]= 3*a[1]*t2 + 2*b[1]*t + v1[1];
+ v[2]= 3*a[2]*t2 + 2*b[2]*t + v1[2];
+}
int point_in_slice(float p[3], float v1[3], float l1[3], float l2[3])
{
@@ -3246,46 +4163,75 @@ int point_in_tri_prism(float p[3], float v1[3], float v2[3], float v3[3])
return 1;
}
+/* point closest to v1 on line v2-v3 in 3D */
+void PclosestVL3Dfl(float *closest, float *v1, float *v2, float *v3)
+{
+ float lambda, cp[3];
+
+ lambda= lambda_cp_line_ex(v1, v2, v3, cp);
+
+ if(lambda <= 0.0f)
+ VecCopyf(closest, v2);
+ else if(lambda >= 1.0f)
+ VecCopyf(closest, v3);
+ else
+ VecCopyf(closest, cp);
+}
+
+/* distance v1 to line-piece v2-v3 in 3D */
+float PdistVL3Dfl(float *v1, float *v2, float *v3)
+{
+ float closest[3];
+
+ PclosestVL3Dfl(closest, v1, v2, v3);
+
+ return VecLenf(closest, v1);
+}
+
/********************************************************/
/* make a 4x4 matrix out of 3 transform components */
+/* matrices are made in the order: scale * rot * loc */
void LocEulSizeToMat4(float mat[][4], float loc[3], float eul[3], float size[3])
{
- float tmat[3][3];
+ float rmat[3][3], smat[3][3], tmat[3][3];
- /* make base matrix */
- EulToMat3(eul, tmat);
-
- /* make new matrix */
+ /* initialise new matrix */
Mat4One(mat);
- mat[0][0] = tmat[0][0] * size[0];
- mat[0][1] = tmat[0][1] * size[1];
- mat[0][2] = tmat[0][2] * size[2];
-
- mat[1][0] = tmat[1][0] * size[0];
- mat[1][1] = tmat[1][1] * size[1];
- mat[1][2] = tmat[1][2] * size[2];
+ /* make rotation + scaling part */
+ EulToMat3(eul, rmat);
+ SizeToMat3(size, smat);
+ Mat3MulMat3(tmat, rmat, smat);
- mat[2][0] = tmat[2][0] * size[0];
- mat[2][1] = tmat[2][1] * size[1];
- mat[2][2] = tmat[2][2] * size[2];
+ /* copy rot/scale part to output matrix*/
+ Mat4CpyMat3(mat, tmat);
+ /* copy location to matrix */
mat[3][0] = loc[0];
mat[3][1] = loc[1];
mat[3][2] = loc[2];
}
/* make a 4x4 matrix out of 3 transform components */
+/* matrices are made in the order: scale * rot * loc */
void LocQuatSizeToMat4(float mat[][4], float loc[3], float quat[4], float size[3])
{
- float eul[3];
+ float rmat[3][3], smat[3][3], tmat[3][3];
- /* convert quaternion component to euler
- * NOTE: not as good as using quat directly. Todo for later.
- */
- QuatToEul(quat, eul);
+ /* initialise new matrix */
+ Mat4One(mat);
+
+ /* make rotation + scaling part */
+ QuatToMat3(quat, rmat);
+ SizeToMat3(size, smat);
+ Mat3MulMat3(tmat, rmat, smat);
- /* make into matrix using exisiting code */
- LocEulSizeToMat4(mat, loc, eul, size);
+ /* copy rot/scale part to output matrix*/
+ Mat4CpyMat3(mat, tmat);
+
+ /* copy location to matrix */
+ mat[3][0] = loc[0];
+ mat[3][1] = loc[1];
+ mat[3][2] = loc[2];
}
diff --git a/source/blender/blenlib/intern/fnmatch.c b/source/blender/blenlib/intern/fnmatch.c
new file mode 100644
index 00000000000..54114ad3448
--- /dev/null
+++ b/source/blender/blenlib/intern/fnmatch.c
@@ -0,0 +1,250 @@
+/* Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
+
+ 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, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef WIN32
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Enable GNU extensions in fnmatch.h. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+
+#include <errno.h>
+#include <BLI_fnmatch.h>
+#include <ctype.h>
+
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined _LIBC || !defined __GNU_LIBRARY__
+
+
+# if defined STDC_HEADERS || !defined isascii
+# define ISASCII(c) 1
+# else
+# define ISASCII(c) isascii(c)
+# endif
+
+# define ISUPPER(c) (ISASCII (c) && isupper (c))
+
+
+# ifndef errno
+extern int errno;
+# endif
+
+/* Match STRING against the filename pattern PATTERN, returning zero if
+ it matches, nonzero if not. */
+int
+fnmatch (const char *pattern, const char *string, int flags)
+{
+ register const char *p = pattern, *n = string;
+ register char c;
+
+/* Note that this evaluates C many times. */
+# define FOLD(c) ((flags & FNM_CASEFOLD) && ISUPPER (c) ? tolower (c) : (c))
+
+ while ((c = *p++) != '\0')
+ {
+ c = FOLD (c);
+
+ switch (c)
+ {
+ case '?':
+ if (*n == '\0')
+ return FNM_NOMATCH;
+ else if ((flags & FNM_FILE_NAME) && *n == '/')
+ return FNM_NOMATCH;
+ else if ((flags & FNM_PERIOD) && *n == '.' &&
+ (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
+ return FNM_NOMATCH;
+ break;
+
+ case '\\':
+ if (!(flags & FNM_NOESCAPE))
+ {
+ c = *p++;
+ if (c == '\0')
+ /* Trailing \ loses. */
+ return FNM_NOMATCH;
+ c = FOLD (c);
+ }
+ if (FOLD (*n) != c)
+ return FNM_NOMATCH;
+ break;
+
+ case '*':
+ if ((flags & FNM_PERIOD) && *n == '.' &&
+ (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
+ return FNM_NOMATCH;
+
+ for (c = *p++; c == '?' || c == '*'; c = *p++)
+ {
+ if ((flags & FNM_FILE_NAME) && *n == '/')
+ /* A slash does not match a wildcard under FNM_FILE_NAME. */
+ return FNM_NOMATCH;
+ else if (c == '?')
+ {
+ /* A ? needs to match one character. */
+ if (*n == '\0')
+ /* There isn't another character; no match. */
+ return FNM_NOMATCH;
+ else
+ /* One character of the string is consumed in matching
+ this ? wildcard, so *??? won't match if there are
+ less than three characters. */
+ ++n;
+ }
+ }
+
+ if (c == '\0')
+ return 0;
+
+ {
+ char c1 = (!(flags & FNM_NOESCAPE) && c == '\\') ? *p : c;
+ c1 = FOLD (c1);
+ for (--p; *n != '\0'; ++n)
+ if ((c == '[' || FOLD (*n) == c1) &&
+ fnmatch (p, n, flags & ~FNM_PERIOD) == 0)
+ return 0;
+ return FNM_NOMATCH;
+ }
+
+ case '[':
+ {
+ /* Nonzero if the sense of the character class is inverted. */
+ register int not;
+
+ if (*n == '\0')
+ return FNM_NOMATCH;
+
+ if ((flags & FNM_PERIOD) && *n == '.' &&
+ (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
+ return FNM_NOMATCH;
+
+ not = (*p == '!' || *p == '^');
+ if (not)
+ ++p;
+
+ c = *p++;
+ for (;;)
+ {
+ register char cstart = c, cend = c;
+
+ if (!(flags & FNM_NOESCAPE) && c == '\\')
+ {
+ if (*p == '\0')
+ return FNM_NOMATCH;
+ cstart = cend = *p++;
+ }
+
+ cstart = cend = FOLD (cstart);
+
+ if (c == '\0')
+ /* [ (unterminated) loses. */
+ return FNM_NOMATCH;
+
+ c = *p++;
+ c = FOLD (c);
+
+ if ((flags & FNM_FILE_NAME) && c == '/')
+ /* [/] can never match. */
+ return FNM_NOMATCH;
+
+ if (c == '-' && *p != ']')
+ {
+ cend = *p++;
+ if (!(flags & FNM_NOESCAPE) && cend == '\\')
+ cend = *p++;
+ if (cend == '\0')
+ return FNM_NOMATCH;
+ cend = FOLD (cend);
+
+ c = *p++;
+ }
+
+ if (FOLD (*n) >= cstart && FOLD (*n) <= cend)
+ goto matched;
+
+ if (c == ']')
+ break;
+ }
+ if (!not)
+ return FNM_NOMATCH;
+ break;
+
+ matched:;
+ /* Skip the rest of the [...] that already matched. */
+ while (c != ']')
+ {
+ if (c == '\0')
+ /* [... (unterminated) loses. */
+ return FNM_NOMATCH;
+
+ c = *p++;
+ if (!(flags & FNM_NOESCAPE) && c == '\\')
+ {
+ if (*p == '\0')
+ return FNM_NOMATCH;
+ /* XXX 1003.2d11 is unclear if this is right. */
+ ++p;
+ }
+ }
+ if (not)
+ return FNM_NOMATCH;
+ }
+ break;
+
+ default:
+ if (c != FOLD (*n))
+ return FNM_NOMATCH;
+ }
+
+ ++n;
+ }
+
+ if (*n == '\0')
+ return 0;
+
+ if ((flags & FNM_LEADING_DIR) && *n == '/')
+ /* The FNM_LEADING_DIR flag says that "foo*" matches "foobar/frobozz". */
+ return 0;
+
+ return FNM_NOMATCH;
+
+# undef FOLD
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
+
+#else
+
+static void BLI_FNMATCH_C_IS_EMPTY_FOR_UNIX(void)
+{
+ /*intentionally empty*/
+}
+
+#endif /* WIN32 */
+
+
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index a6b91bf489d..1d46679cbf2 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -180,12 +180,15 @@ double BLI_diskfree(char *dir)
return (double) (freec*bytesps*sectorspc);
#else
struct statfs disk;
- char name[100],*slash;
-
-
+ char name[FILE_MAXDIR],*slash;
+ int len = strlen(dir);
+
+ if (len >= FILE_MAXDIR) /* path too long */
+ return -1;
+
strcpy(name,dir);
- if(strlen(name)){
+ if(len){
slash = strrchr(name,'/');
if (slash) slash[1] = 0;
} else strcpy(name,"/");
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index cb10185386a..1f05070b034 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -109,22 +109,26 @@ static void BLI_unlock_malloc_thread(void)
pthread_mutex_unlock(&_malloc_lock);
}
+/* tot = 0 only initializes malloc mutex in a safe way (see sequence.c)
+ problem otherwise: scene render will kill of the mutex!
+*/
+
void BLI_init_threads(ListBase *threadbase, void *(*do_thread)(void *), int tot)
{
int a;
- if(threadbase==NULL)
- return;
- threadbase->first= threadbase->last= NULL;
+ if(threadbase != NULL && tot > 0) {
+ threadbase->first= threadbase->last= NULL;
- if(tot>RE_MAX_THREAD) tot= RE_MAX_THREAD;
- else if(tot<1) tot= 1;
+ if(tot>RE_MAX_THREAD) tot= RE_MAX_THREAD;
+ else if(tot<1) tot= 1;
- for(a=0; a<tot; a++) {
- ThreadSlot *tslot= MEM_callocN(sizeof(ThreadSlot), "threadslot");
- BLI_addtail(threadbase, tslot);
- tslot->do_thread= do_thread;
- tslot->avail= 1;
+ for(a=0; a<tot; a++) {
+ ThreadSlot *tslot= MEM_callocN(sizeof(ThreadSlot), "threadslot");
+ BLI_addtail(threadbase, tslot);
+ tslot->do_thread= do_thread;
+ tslot->avail= 1;
+ }
}
MEM_set_lock_callback(BLI_lock_malloc_thread, BLI_unlock_malloc_thread);
@@ -190,12 +194,14 @@ void BLI_end_threads(ListBase *threadbase)
{
ThreadSlot *tslot;
- for(tslot= threadbase->first; tslot; tslot= tslot->next) {
- if(tslot->avail==0) {
- pthread_join(tslot->pthread, NULL);
+ if (threadbase) {
+ for(tslot= threadbase->first; tslot; tslot= tslot->next) {
+ if(tslot->avail==0) {
+ pthread_join(tslot->pthread, NULL);
+ }
}
+ BLI_freelistN(threadbase);
}
- BLI_freelistN(threadbase);
thread_levels--;
if(thread_levels==0)
diff --git a/source/blender/blenlib/intern/util.c b/source/blender/blenlib/intern/util.c
index cfce8e3dafa..9e8fe80ae30 100644
--- a/source/blender/blenlib/intern/util.c
+++ b/source/blender/blenlib/intern/util.c
@@ -90,31 +90,29 @@ static int add_win32_extension(char *name);
/* implementation */
-/* Ripped this from blender.c
- */
+/* Ripped this from blender.c */
void addlisttolist(ListBase *list1, ListBase *list2)
{
+ if (list2->first==0) return;
- if(list2->first==0) return;
-
- if(list1->first==0) {
+ if (list1->first==0) {
list1->first= list2->first;
list1->last= list2->last;
}
else {
- ((struct Link *)list1->last)->next= list2->first;
- ((struct Link *)list2->first)->prev= list1->last;
+ ((Link *)list1->last)->next= list2->first;
+ ((Link *)list2->first)->prev= list1->last;
list1->last= list2->last;
}
list2->first= list2->last= 0;
}
-int BLI_stringdec(char *string, char *kop, char *staart, unsigned short *numlen)
+int BLI_stringdec(char *string, char *kop, char *start, unsigned short *numlen)
{
unsigned short len, len2, nums = 0, nume = 0;
short i, found = 0;
- len2 = len = strlen( string);
+ len2 = len = strlen(string);
if (len > 6) {
if (BLI_strncasecmp(string + len - 6, ".blend", 6) == 0) len -= 6;
@@ -125,7 +123,6 @@ int BLI_stringdec(char *string, char *kop, char *staart, unsigned short *numlen)
if (BLI_strncasecmp(string + len - 9, ".blend.gz", 9) == 0) len -= 9;
}
-
if (len == len2) {
if (len > 4) {
/* handle .jf0 en .jf1 for jstreams */
@@ -143,7 +140,7 @@ int BLI_stringdec(char *string, char *kop, char *staart, unsigned short *numlen)
}
}
- for (i = len - 1; i >= 0; i--){
+ for (i = len - 1; i >= 0; i--) {
if (string[i] == '/') break;
if (isdigit(string[i])) {
if (found){
@@ -155,12 +152,12 @@ int BLI_stringdec(char *string, char *kop, char *staart, unsigned short *numlen)
found = 1;
}
}
- else{
+ else {
if (found) break;
}
}
if (found){
- if (staart) strcpy(staart,&string[nume+1]);
+ if (start) strcpy(start,&string[nume+1]);
if (kop) {
strcpy(kop,string);
kop[nums]=0;
@@ -168,7 +165,7 @@ int BLI_stringdec(char *string, char *kop, char *staart, unsigned short *numlen)
if (numlen) *numlen = nume-nums+1;
return ((int)atoi(&(string[nums])));
}
- if (staart) strcpy(staart, string + len);
+ if (start) strcpy(start, string + len);
if (kop) {
strncpy(kop, string, len);
kop[len] = 0;
@@ -178,7 +175,7 @@ int BLI_stringdec(char *string, char *kop, char *staart, unsigned short *numlen)
}
-void BLI_stringenc(char *string, char *kop, char *staart, unsigned short numlen, int pic)
+void BLI_stringenc(char *string, char *kop, char *start, unsigned short numlen, int pic)
{
char numstr[10]="";
unsigned short len,i;
@@ -187,17 +184,17 @@ void BLI_stringenc(char *string, char *kop, char *staart, unsigned short numlen,
if (pic>0 || numlen==4) {
len= sprintf(numstr,"%d",pic);
-
+
for(i=len;i<numlen;i++){
strcat(string,"0");
}
strcat(string,numstr);
}
- strcat(string,staart);
+ strcat(string, start);
}
-void BLI_newname(char * name, int add)
+void BLI_newname(char *name, int add)
{
char head[128], tail[128];
int pic;
@@ -215,38 +212,38 @@ void BLI_newname(char * name, int add)
pic += add;
- if(digits==4 && pic<0) pic= 0;
+ if (digits==4 && pic<0) pic= 0;
BLI_stringenc(name, head, tail, digits, pic);
}
void BLI_addhead(ListBase *listbase, void *vlink)
{
- struct Link *link= vlink;
+ Link *link= vlink;
- if (link == 0) return;
- if (listbase == 0) return;
+ if (link == NULL) return;
+ if (listbase == NULL) return;
link->next = listbase->first;
- link->prev = 0;
+ link->prev = NULL;
- if (listbase->first) ((struct Link *)listbase->first)->prev = link;
- if (listbase->last == 0) listbase->last = link;
+ if (listbase->first) ((Link *)listbase->first)->prev = link;
+ if (listbase->last == NULL) listbase->last = link;
listbase->first = link;
}
void BLI_addtail(ListBase *listbase, void *vlink)
{
- struct Link *link= vlink;
+ Link *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 Link *)listbase->last)->next = link;
+ if (listbase->last) ((Link *)listbase->last)->next = link;
if (listbase->first == 0) listbase->first = link;
listbase->last = link;
}
@@ -254,10 +251,10 @@ void BLI_addtail(ListBase *listbase, void *vlink)
void BLI_remlink(ListBase *listbase, void *vlink)
{
- struct Link *link= vlink;
+ Link *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;
@@ -269,10 +266,10 @@ void BLI_remlink(ListBase *listbase, void *vlink)
void BLI_freelinkN(ListBase *listbase, void *vlink)
{
- struct Link *link= vlink;
+ Link *link= vlink;
- if (link == 0) return;
- if (listbase == 0) return;
+ if (link == NULL) return;
+ if (listbase == NULL) return;
BLI_remlink(listbase,link);
MEM_freeN(link);
@@ -281,19 +278,23 @@ void BLI_freelinkN(ListBase *listbase, void *vlink)
void BLI_insertlink(ListBase *listbase, void *vprevlink, void *vnewlink)
{
- struct Link *prevlink= vprevlink, *newlink= vnewlink;
+ Link *prevlink= vprevlink;
+ Link *newlink= vnewlink;
/* newlink comes after prevlink */
-
- if (newlink == 0) return;
- if (listbase == 0) return;
-
- if(listbase->first==0) { /* empty list */
+ if (newlink == NULL) return;
+ if (listbase == NULL) return;
+
+ /* empty list */
+ if (listbase->first == NULL) {
+
listbase->first= newlink;
listbase->last= newlink;
return;
}
- if (prevlink== 0) { /* insert before first element */
+
+ /* insert before first element */
+ if (prevlink == NULL) {
newlink->next= listbase->first;
newlink->prev= 0;
newlink->next->prev= newlink;
@@ -301,96 +302,176 @@ void BLI_insertlink(ListBase *listbase, void *vprevlink, void *vnewlink)
return;
}
- if (listbase->last== prevlink) /* at end of list */
+ /* at end of list */
+ if (listbase->last== prevlink)
listbase->last = newlink;
newlink->next= prevlink->next;
prevlink->next= newlink;
- if(newlink->next) newlink->next->prev= newlink;
+ if (newlink->next) newlink->next->prev= newlink;
newlink->prev= prevlink;
}
-void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink)
+/* This uses insertion sort, so NOT ok for large list */
+void BLI_sortlist(ListBase *listbase, int (*cmp)(void *, void *))
+{
+ Link *current = NULL;
+ Link *previous = NULL;
+ Link *next = NULL;
+
+ if (cmp == NULL) return;
+ if (listbase == NULL) return;
+
+ if (listbase->first != listbase->last)
+ {
+ for( previous = listbase->first, current = previous->next; current; previous = current, current = next )
+ {
+ next = current->next;
+
+ BLI_remlink(listbase, current);
+
+ while(previous && cmp(previous, current) == 1)
+ {
+ previous = previous->prev;
+ }
+
+ if (previous == NULL)
+ {
+ BLI_addhead(listbase, current);
+ }
+ else
+ {
+ BLI_insertlinkafter(listbase, previous, current);
+ }
+ }
+ }
+}
+
+void BLI_insertlinkafter(ListBase *listbase, void *vprevlink, void *vnewlink)
{
- struct Link *nextlink= vnextlink, *newlink= vnewlink;
+ Link *prevlink= vprevlink;
+ Link *newlink= vnewlink;
/* newlink before nextlink */
+ if (newlink == NULL) return;
+ if (listbase == NULL) return;
+
+ /* empty list */
+ if (listbase->first == NULL) {
+ listbase->first= newlink;
+ listbase->last= newlink;
+ return;
+ }
+
+ /* insert at head of list */
+ if (prevlink == NULL) {
+ newlink->prev = NULL;
+ newlink->next = listbase->first;
+ ((Link *)listbase->first)->prev = newlink;
+ listbase->first = newlink;
+ return;
+ }
+
+ /* at end of list */
+ if (listbase->last == prevlink)
+ listbase->last = newlink;
- if (newlink == 0) return;
- if (listbase == 0) return;
+ newlink->next = prevlink->next;
+ newlink->prev = prevlink;
+ prevlink->next = newlink;
+ if (newlink->next) newlink->next->prev = newlink;
+}
+
+void BLI_insertlinkbefore(ListBase *listbase, void *vnextlink, void *vnewlink)
+{
+ Link *nextlink= vnextlink;
+ Link *newlink= vnewlink;
+
+ /* newlink before nextlink */
+ if (newlink == NULL) return;
+ if (listbase == NULL) return;
- if(listbase->first==0) { /* empty list */
+ /* empty list */
+ if (listbase->first == NULL) {
listbase->first= newlink;
listbase->last= newlink;
return;
}
- if (nextlink== 0) { /* insert at end of list */
+
+ /* insert at end of list */
+ if (nextlink == NULL) {
newlink->prev= listbase->last;
newlink->next= 0;
- ((struct Link *)listbase->last)->next= newlink;
+ ((Link *)listbase->last)->next= newlink;
listbase->last= newlink;
return;
}
- if (listbase->first== nextlink) /* at beginning of list */
+ /* at beginning of list */
+ if (listbase->first== nextlink)
listbase->first = newlink;
newlink->next= nextlink;
newlink->prev= nextlink->prev;
nextlink->prev= newlink;
- if(newlink->prev) newlink->prev->next= newlink;
+ if (newlink->prev) newlink->prev->next= newlink;
}
void BLI_freelist(ListBase *listbase)
{
- struct Link *link,*next;
+ Link *link, *next;
- if (listbase == 0) return;
+ if (listbase == NULL)
+ return;
+
link= listbase->first;
- while(link) {
+ while (link) {
next= link->next;
free(link);
link= next;
}
- listbase->first=0;
- listbase->last=0;
+
+ listbase->first= NULL;
+ listbase->last= NULL;
}
void BLI_freelistN(ListBase *listbase)
{
- struct Link *link,*next;
+ Link *link, *next;
- if (listbase == 0) return;
+ if (listbase == NULL) return;
+
link= listbase->first;
- while(link) {
+ while (link) {
next= link->next;
MEM_freeN(link);
link= next;
}
- listbase->first=0;
- listbase->last=0;
+
+ listbase->first= NULL;
+ listbase->last= NULL;
}
int BLI_countlist(ListBase *listbase)
{
- Link * link;
+ Link *link;
int count = 0;
- if (listbase){
+ if (listbase) {
link = listbase->first;
- while(link) {
+ while (link) {
count++;
link= link->next;
}
}
- return(count);
+ return count;
}
-void * BLI_findlink(ListBase *listbase, int number)
+void *BLI_findlink(ListBase *listbase, int number)
{
- Link * link = NULL;
+ Link *link = NULL;
if (number >= 0) {
link = listbase->first;
@@ -400,7 +481,27 @@ void * BLI_findlink(ListBase *listbase, int number)
}
}
- return (link);
+ return link;
+}
+
+int BLI_findindex(ListBase *listbase, void *vlink)
+{
+ Link *link= NULL;
+ int number= 0;
+
+ if (listbase == NULL) return -1;
+ if (vlink == NULL) return -1;
+
+ link= listbase->first;
+ while (link) {
+ if (link == vlink)
+ return number;
+
+ number++;
+ link= link->next;
+ }
+
+ return -1;
}
/*=====================================================================================*/
@@ -626,14 +727,14 @@ void BLI_dlist_reinit(DynamicList *dlist)
/*=====================================================================================*/
-char *BLI_strdupn(char *str, int len) {
+char *BLI_strdupn(const char *str, int len) {
char *n= MEM_mallocN(len+1, "strdup");
memcpy(n, str, len);
n[len]= '\0';
return n;
}
-char *BLI_strdup(char *str) {
+char *BLI_strdup(const char *str) {
return BLI_strdupn(str, strlen(str));
}
@@ -1174,28 +1275,30 @@ void BLI_split_dirfile(const char *string, char *dir, char *file)
#ifdef WIN32
int sl;
short is_relative = 0;
+ char path[FILE_MAX];
#endif
dir[0]= 0;
file[0]= 0;
#ifdef WIN32
- BLI_char_switch(string, '/', '\\'); /* make sure we have a valid path format */
- sl = strlen(string);
+ BLI_strncpy(path, string, FILE_MAX);
+ BLI_char_switch(path, '/', '\\'); /* make sure we have a valid path format */
+ sl = strlen(path);
if (sl) {
int len;
- if (string[0] == '/' || string[0] == '\\') {
- BLI_strncpy(dir, string, FILE_MAXDIR);
- if (sl > 1 && string[0] == '\\' && string[1] == '\\') is_relative = 1;
- } else if (sl > 2 && string[1] == ':' && string[2] == '\\') {
- BLI_strncpy(dir, string, FILE_MAXDIR);
+ if (path[0] == '/' || path[0] == '\\') {
+ BLI_strncpy(dir, path, FILE_MAXDIR);
+ if (sl > 1 && path[0] == '\\' && path[1] == '\\') is_relative = 1;
+ } else if (sl > 2 && path[1] == ':' && path[2] == '\\') {
+ BLI_strncpy(dir, path, FILE_MAXDIR);
} else {
BLI_getwdN(dir);
strcat(dir,"\\");
- strcat(dir,string);
- BLI_strncpy(string,dir,FILE_MAXDIR+FILE_MAXFILE);
+ strcat(dir,path);
+ BLI_strncpy(path,dir,FILE_MAXDIR+FILE_MAXFILE);
}
-
+
// BLI_exist doesn't recognize a slashed dirname as a dir
// check if a trailing slash exists, and remove it. Do not do this
// when we are already at root. -jesterKing
@@ -1203,7 +1306,7 @@ void BLI_split_dirfile(const char *string, char *dir, char *file)
if(a>=4 && dir[a-1]=='\\') dir[a-1] = 0;
if (is_relative) {
- printf("WARNING: BLI_split_dirfile needs absolute dir");
+ printf("WARNING: BLI_split_dirfile needs absolute dir\n");
}
else {
BLI_make_exist(dir);
@@ -1214,18 +1317,18 @@ void BLI_split_dirfile(const char *string, char *dir, char *file)
/* copy from end of string into file, to ensure filename itself isn't truncated
if string is too long. (aphex) */
- len = FILE_MAXFILE - strlen(string);
+ len = FILE_MAXFILE - strlen(path);
if (len < 0)
- BLI_strncpy(file,string + abs(len),FILE_MAXFILE);
+ BLI_strncpy(file,path + abs(len),FILE_MAXFILE);
else
- BLI_strncpy(file,string,FILE_MAXFILE);
+ BLI_strncpy(file,path,FILE_MAXFILE);
- if (strrchr(string,'\\')){
- BLI_strncpy(file,strrchr(string,'\\')+1,FILE_MAXFILE);
+ if (strrchr(path,'\\')) {
+ BLI_strncpy(file,strrchr(path,'\\')+1,FILE_MAXFILE);
}
-
- if (a = strlen(dir)) {
+
+ if ( (a = strlen(dir)) ) {
if (dir[a-1] != '\\') strcat(dir,"\\");
}
}
@@ -1233,7 +1336,7 @@ void BLI_split_dirfile(const char *string, char *dir, char *file)
a = strlen(dir) - 1;
while(a>0 && dir[a] != '\\') a--;
dir[a + 1] = 0;
- BLI_strncpy(file, string + strlen(dir),FILE_MAXFILE);
+ BLI_strncpy(file, path + strlen(dir),FILE_MAXFILE);
}
}
@@ -1491,6 +1594,38 @@ int BLI_strncasecmp(const char *s1, const char *s2, int n) {
return 0;
}
+
+#ifdef WITH_ICONV
+#include "iconv.h"
+#include "localcharset.h"
+
+void BLI_string_to_utf8(char *original, char *utf_8, char *code)
+{
+ size_t inbytesleft=strlen(original);
+ size_t outbytesleft=512;
+ size_t rv=0;
+ iconv_t cd;
+
+ if (NULL == code) {
+ code = locale_charset();
+ }
+ cd=iconv_open("UTF-8", code);
+
+ if (cd == (iconv_t)(-1)) {
+ printf("iconv_open Error");
+ *utf_8='\0';
+ return ;
+ }
+ rv=iconv(cd, &original, &inbytesleft, &utf_8, &outbytesleft);
+ if (rv == (size_t) -1) {
+ printf("iconv Error\n");
+ return ;
+ }
+ *utf_8 = '\0';
+ iconv_close(cd);
+}
+#endif // WITH_ICONV
+
void BLI_timestr(double time, char *str)
{
/* format 00:00:00.00 (hr:min:sec) string has to be 12 long */
diff --git a/source/blender/blenloader/BLO_readfile.h b/source/blender/blenloader/BLO_readfile.h
index 7f621410a4f..09edfe90d02 100644
--- a/source/blender/blenloader/BLO_readfile.h
+++ b/source/blender/blenloader/BLO_readfile.h
@@ -38,12 +38,15 @@ extern "C" {
#endif
struct SpaceFile;
+struct SpaceImaSel;
+struct FileList;
struct LinkNode;
struct Main;
struct UserDef;
struct bScreen;
struct Scene;
struct MemFile;
+struct direntry;
typedef struct BlendHandle BlendHandle;
@@ -192,6 +195,21 @@ BLO_blendhandle_get_datablock_names(
int ofblocktype);
/**
+ * Gets the previews of all the datablocks in a file
+ * of a certain type (ie. All the scene names in
+ * a file).
+ *
+ * @param bh The blendhandle to access.
+ * @param ofblocktype The type of names to get.
+ * @return A BLI_linklist of PreviewImage. The PreviewImage links
+ * should be freed with malloc.
+ */
+ struct LinkNode*
+BLO_blendhandle_get_previews(
+ BlendHandle *bh,
+ int ofblocktype);
+
+/**
* Gets the names of all the datablock groups in a
* file. (ie. file contains Scene, Mesh, and Lamp
* datablocks).
@@ -219,6 +237,7 @@ BLO_blendhandle_close(
char *BLO_gethome(void);
int BLO_has_bfile_extension(char *str);
void BLO_library_append(struct SpaceFile *sfile, char *dir, int idcode);
+void BLO_library_append_(BlendHandle **libfiledata, struct direntry* filelist, int totfile, char *dir, char* file, short flag, int idcode);
void BLO_script_library_append(BlendHandle *bh, char *dir, char *name, int idcode, short flag, struct Scene *scene);
BlendFileData* blo_read_blendafterruntime(int file, int actualsize, BlendReadError *error_r);
diff --git a/source/blender/blenloader/intern/Makefile b/source/blender/blenloader/intern/Makefile
index 86ccd607d63..4fcb0e8db47 100644
--- a/source/blender/blenloader/intern/Makefile
+++ b/source/blender/blenloader/intern/Makefile
@@ -38,10 +38,6 @@ include nan_compile.mk
# CFLAGS += $(LEVEL_2_C_WARNINGS)
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
# OpenGL and Python
CPPFLAGS += $(OGL_CPPFLAGS)
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index 5f67c060c04..ef287428a19 100644
--- a/source/blender/blenloader/intern/readblenentry.c
+++ b/source/blender/blenloader/intern/readblenentry.c
@@ -50,6 +50,7 @@
#include "DNA_space_types.h"
#include "DNA_userdef_types.h"
#include "DNA_ID.h"
+#include "DNA_material_types.h"
#include "BKE_utildefines.h" // for ENDB
@@ -61,6 +62,7 @@
#include "BLO_undofile.h"
#include "readfile.h"
+#include "genfile.h"
#include "BLO_readblenfile.h"
@@ -218,6 +220,70 @@ LinkNode *BLO_blendhandle_get_datablock_names(BlendHandle *bh, int ofblocktype)
return names;
}
+LinkNode *BLO_blendhandle_get_previews(BlendHandle *bh, int ofblocktype)
+{
+ FileData *fd= (FileData*) bh;
+ LinkNode *previews= NULL;
+ BHead *bhead;
+ int looking=0;
+ int npreviews = 0;
+ PreviewImage* prv = NULL;
+ PreviewImage* new_prv = NULL;
+
+ for (bhead= blo_firstbhead(fd); bhead; bhead= blo_nextbhead(fd, bhead)) {
+ if (bhead->code==ofblocktype) {
+ ID *id= (ID*) (bhead+1);
+ if ( (GS(id->name) == ID_MA) || (GS(id->name) == ID_TE)) {
+ new_prv = MEM_callocN(sizeof(PreviewImage), "newpreview");
+ BLI_linklist_prepend(&previews, new_prv);
+ looking = 1;
+ }
+ } else if (bhead->code==DATA) {
+ if (looking) {
+ if (bhead->SDNAnr == dna_findstruct_nr(fd->filesdna, "PreviewImage") ) {
+ prv = (PreviewImage*) (bhead+1);
+ npreviews = 0;
+ memcpy(new_prv, prv, sizeof(PreviewImage));
+ if (prv->rect[0]) {
+ unsigned int *rect = NULL;
+ int rectlen = 0;
+ new_prv->rect[0] = MEM_callocN(new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int), "prvrect");
+ bhead= blo_nextbhead(fd, bhead);
+ rect = (unsigned int*)(bhead+1);
+ rectlen = new_prv->w[0]*new_prv->h[0]*sizeof(unsigned int);
+ memcpy(new_prv->rect[0], rect, bhead->len);
+ } else {
+ new_prv->rect[0] = NULL;
+ }
+
+ if (prv->rect[1]) {
+ unsigned int *rect = NULL;
+ int rectlen = 0;
+ new_prv->rect[1] = MEM_callocN(new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int), "prvrect");
+ bhead= blo_nextbhead(fd, bhead);
+ rect = (unsigned int*)(bhead+1);
+ rectlen = new_prv->w[1]*new_prv->h[1]*sizeof(unsigned int);
+ memcpy(new_prv->rect[1], rect, bhead->len);
+ } else {
+ new_prv->rect[1] = NULL;
+ }
+ }
+ }
+ } else if (bhead->code==ENDB) {
+ break;
+ } else if (bhead->code==DATA) {
+ /* DATA blocks between IDBlock and Preview */
+ } else {
+ looking = 0;
+ new_prv = NULL;
+ prv = NULL;
+ }
+
+ }
+
+ return previews;
+}
+
LinkNode *BLO_blendhandle_get_linkable_groups(BlendHandle *bh)
{
FileData *fd= (FileData*) bh;
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 10f9be743ea..65608507d0e 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -86,6 +86,7 @@
#include "DNA_oops_types.h"
#include "DNA_object_force.h"
#include "DNA_packedFile_types.h"
+#include "DNA_particle_types.h"
#include "DNA_property_types.h"
#include "DNA_text_types.h"
#include "DNA_view3d_types.h"
@@ -112,6 +113,7 @@
#include "BKE_action.h"
#include "BKE_armature.h"
+#include "BKE_colortools.h"
#include "BKE_constraint.h"
#include "BKE_curve.h"
#include "BKE_customdata.h"
@@ -121,6 +123,7 @@
#include "BKE_global.h" // for G
#include "BKE_group.h"
#include "BKE_image.h"
+#include "BKE_key.h" //void set_four_ipo
#include "BKE_lattice.h"
#include "BKE_library.h" // for wich_libbase
#include "BKE_main.h" // for Main
@@ -128,6 +131,7 @@
#include "BKE_modifier.h"
#include "BKE_node.h" // for tree type defines
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_property.h" // for get_property
#include "BKE_sca.h" // for init_actuator
#include "BKE_scene.h"
@@ -137,6 +141,7 @@
#include "BKE_idprop.h"
#include "BIF_butspace.h" // badlevel, for do_versions, patching event codes
+#include "BIF_filelist.h" // badlevel too, where to move this? - elubie
#include "BIF_previewrender.h" // bedlelvel, for struct RenderInfo
#include "BLO_readfile.h"
#include "BLO_undofile.h"
@@ -1541,7 +1546,12 @@ static PreviewImage *direct_link_preview_image(FileData *fd, PreviewImage *old_p
PreviewImage *prv= newdataadr(fd, old_prv);
if (prv) {
- prv->rect = newdataadr(fd, prv->rect);
+ int i;
+ for (i=0; i < PREVIEW_MIPMAPS; ++i) {
+ if (prv->rect[i]) {
+ prv->rect[i] = newdataadr(fd, prv->rect[i]);
+ }
+ }
}
return prv;
@@ -1611,6 +1621,18 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist)
}
switch (con->type) {
+ case CONSTRAINT_TYPE_PYTHON:
+ {
+ bPythonConstraint *data= (bPythonConstraint*)con->data;
+ bConstraintTarget *ct;
+
+ for (ct= data->targets.first; ct; ct= ct->next)
+ ct->tar = newlibadr(fd, id->lib, ct->tar);
+
+ data->text = newlibadr(fd, id->lib, data->text);
+ //IDP_LibLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+ }
+ break;
case CONSTRAINT_TYPE_ACTION:
{
bActionConstraint *data;
@@ -1624,27 +1646,28 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist)
bLocateLikeConstraint *data;
data= ((bLocateLikeConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
- };
+ }
break;
case CONSTRAINT_TYPE_ROTLIKE:
{
bRotateLikeConstraint *data;
data= ((bRotateLikeConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
- };
+ }
break;
case CONSTRAINT_TYPE_SIZELIKE:
{
bSizeLikeConstraint *data;
data= ((bSizeLikeConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
- };
+ }
break;
case CONSTRAINT_TYPE_KINEMATIC:
{
bKinematicConstraint *data;
data = ((bKinematicConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
+ data->poletar = newlibadr(fd, id->lib, data->poletar);
}
break;
case CONSTRAINT_TYPE_TRACKTO:
@@ -1666,44 +1689,50 @@ static void lib_link_constraints(FileData *fd, ID *id, ListBase *conlist)
bLockTrackConstraint *data;
data= ((bLockTrackConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
- };
+ }
break;
case CONSTRAINT_TYPE_FOLLOWPATH:
{
bFollowPathConstraint *data;
data= ((bFollowPathConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
- };
- break;
- case CONSTRAINT_TYPE_DISTANCELIMIT:
- {
- bDistanceLimitConstraint *data;
- data= ((bDistanceLimitConstraint*)con->data);
- data->tar = newlibadr(fd, id->lib, data->tar);
- };
+ }
break;
case CONSTRAINT_TYPE_STRETCHTO:
{
bStretchToConstraint *data;
data= ((bStretchToConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
- };
+ }
break;
case CONSTRAINT_TYPE_RIGIDBODYJOINT:
{
bRigidBodyJointConstraint *data;
data= ((bRigidBodyJointConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
- };
+ }
break;
case CONSTRAINT_TYPE_CLAMPTO:
{
bClampToConstraint *data;
data= ((bClampToConstraint*)con->data);
data->tar = newlibadr(fd, id->lib, data->tar);
- };
+ }
+ break;
+ case CONSTRAINT_TYPE_CHILDOF:
+ {
+ bChildOfConstraint *data;
+ data= ((bChildOfConstraint*)con->data);
+ data->tar = newlibadr(fd, id->lib, data->tar);
+ }
+ break;
+ case CONSTRAINT_TYPE_TRANSFORM:
+ {
+ bTransformConstraint *data;
+ data= ((bTransformConstraint*)con->data);
+ data->tar = newlibadr(fd, id->lib, data->tar);
+ }
break;
-
case CONSTRAINT_TYPE_NULL:
break;
}
@@ -1717,6 +1746,12 @@ static void direct_link_constraints(FileData *fd, ListBase *lb)
link_list(fd, lb);
for (cons=lb->first; cons; cons=cons->next) {
cons->data = newdataadr(fd, cons->data);
+ if (cons->type == CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data= cons->data;
+ link_list(fd, &data->targets);
+ data->prop = newdataadr(fd, data->prop);
+ IDP_DirectLinkProperty(data->prop, (fd->flags & FD_FLAGS_SWITCH_ENDIAN), fd);
+ }
}
}
@@ -1837,7 +1872,9 @@ static void lib_link_camera(FileData *fd, Main *main)
if(ca->id.flag & LIB_NEEDLINK) {
ca->ipo= newlibadr_us(fd, ca->id.lib, ca->ipo);
-
+
+ ca->dof_ob= newlibadr_us(fd, ca->id.lib, ca->dof_ob);
+
lib_link_scriptlink(fd, &ca->id, &ca->scriptlink);
ca->id.flag -= LIB_NEEDLINK;
@@ -1891,6 +1928,12 @@ static void direct_link_lamp(FileData *fd, Lamp *la)
for(a=0; a<MAX_MTEX; a++) {
la->mtex[a]= newdataadr(fd, la->mtex[a]);
}
+
+ la->curfalloff= newdataadr(fd, la->curfalloff);
+ if(la->curfalloff)
+ direct_link_curvemapping(fd, la->curfalloff);
+
+ la->preview = direct_link_preview_image(fd, la->preview);
}
/* ************ READ keys ***************** */
@@ -2038,6 +2081,7 @@ static void direct_link_world(FileData *fd, World *wrld)
for(a=0; a<MAX_MTEX; a++) {
wrld->mtex[a]= newdataadr(fd, wrld->mtex[a]);
}
+ wrld->preview = direct_link_preview_image(fd, wrld->preview);
}
@@ -2347,6 +2391,8 @@ static void direct_link_texture(FileData *fd, Tex *tex)
memset(tex->env->cube, 0, 6*sizeof(void *));
tex->env->ok= 0;
}
+ tex->preview = direct_link_preview_image(fd, tex->preview);
+
tex->iuser.ok= 1;
}
@@ -2404,6 +2450,81 @@ static void direct_link_material(FileData *fd, Material *ma)
ma->nodetree= newdataadr(fd, ma->nodetree);
if(ma->nodetree)
direct_link_nodetree(fd, ma->nodetree);
+
+ ma->preview = direct_link_preview_image(fd, ma->preview);
+}
+
+/* ************ READ PARTICLE SETTINGS ***************** */
+
+static void lib_link_particlesettings(FileData *fd, Main *main)
+{
+ ParticleSettings *part;
+
+ part= main->particle.first;
+ while(part) {
+ if(part->id.flag & LIB_NEEDLINK) {
+ part->ipo= newlibadr_us(fd, part->id.lib, part->ipo);
+ part->dup_ob = newlibadr(fd, part->id.lib, part->dup_ob);
+ part->dup_group = newlibadr(fd, part->id.lib, part->dup_group);
+ part->eff_group = newlibadr(fd, part->id.lib, part->eff_group);
+ part->bb_ob = newlibadr(fd, part->id.lib, part->bb_ob);
+ part->id.flag -= LIB_NEEDLINK;
+ }
+ part= part->id.next;
+ }
+}
+
+static void direct_link_particlesettings(FileData *fd, ParticleSettings *part)
+{
+ part->pd= newdataadr(fd, part->pd);
+}
+
+static void lib_link_particlesystems(FileData *fd, ID *id, ListBase *particles)
+{
+ ParticleSystem *psys;
+ int a;
+
+ for(psys=particles->first; psys; psys=psys->next){
+ ParticleData *pa;
+ psys->part = newlibadr_us(fd, id->lib, psys->part);
+ psys->target_ob = newlibadr(fd, id->lib, psys->target_ob);
+ psys->keyed_ob = newlibadr(fd, id->lib, psys->keyed_ob);
+
+ for(a=0,pa=psys->particles; a<psys->totpart; a++,pa++){
+ pa->stick_ob=newlibadr(fd, id->lib, pa->stick_ob);
+ }
+ }
+}
+static void direct_link_particlesystems(FileData *fd, ListBase *particles)
+{
+ ParticleSystem *psys;
+ int a;
+
+ for(psys=particles->first; psys; psys=psys->next) {
+ psys->particles=newdataadr(fd,psys->particles);
+ if(psys->particles && psys->particles->hair){
+ ParticleData *pa = psys->particles;
+ for(a=0; a<psys->totpart; a++, pa++)
+ pa->hair=newdataadr(fd,pa->hair);
+ }
+ psys->child=newdataadr(fd,psys->child);
+ psys->effectors.first=psys->effectors.last=0;
+
+ psys->soft= newdataadr(fd, psys->soft);
+ if(psys->soft) {
+ SoftBody *sb = psys->soft;
+ sb->particles = psys;
+ sb->bpoint= NULL; // init pointers so it gets rebuilt nicely
+ sb->bspring= NULL;
+ sb->scratch= NULL;
+ }
+
+ psys->edit = 0;
+ psys->pathcache = 0;
+ psys->childcache = 0;
+ psys->reactevents.first = psys->reactevents.last = 0;
+ }
+ return;
}
/* ************ READ MESH ***************** */
@@ -2530,8 +2651,7 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
direct_link_customdata(fd, &mesh->fdata, mesh->pv ? mesh->pv->totface : mesh->totface);
mesh->bb= NULL;
- mesh->oc= 0;
- mesh->mselect= NULL;
+ mesh->mselect = NULL;
/* Multires data */
mesh->mr= newdataadr(fd, mesh->mr);
@@ -2786,8 +2906,14 @@ static void lib_link_object(FileData *fd, Main *main)
if(ob->fluidsimSettings) {
ob->fluidsimSettings->ipo = newlibadr_us(fd, ob->id.lib, ob->fluidsimSettings->ipo);
}
+
+ /* texture field */
+ if(ob->pd)
+ if(ob->pd->tex)
+ ob->pd->tex=newlibadr_us(fd, ob->id.lib, ob->pd->tex);
lib_link_scriptlink(fd, &ob->id, &ob->scriptlink);
+ lib_link_particlesystems(fd, &ob->id, &ob->particlesystem);
lib_link_modifiers(fd, ob);
}
ob= ob->id.next;
@@ -2844,6 +2970,39 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
SWITCH_INT(hmd->indexar[a]);
}
}
+ } else if (md->type==eModifierType_ParticleSystem) {
+ ParticleSystemModifierData *psmd = (ParticleSystemModifierData*) md;
+
+ psmd->dm=0;
+ psmd->psys=newdataadr(fd, psmd->psys);
+ psmd->flag|=eParticleSystemFlag_Loaded;
+ } else if (md->type==eModifierType_Explode) {
+ ExplodeModifierData *psmd = (ExplodeModifierData*) md;
+
+ psmd->facepa=0;
+ }
+ else if (md->type==eModifierType_MeshDeform) {
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+
+ mmd->bindweights= newdataadr(fd, mmd->bindweights);
+ mmd->bindcos= newdataadr(fd, mmd->bindcos);
+ mmd->dyngrid= newdataadr(fd, mmd->dyngrid);
+ mmd->dyninfluences= newdataadr(fd, mmd->dyninfluences);
+ mmd->dynverts= newdataadr(fd, mmd->dynverts);
+
+ if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
+ int a;
+
+ if(mmd->bindweights)
+ for(a=0; a<mmd->totcagevert*mmd->totvert; a++)
+ SWITCH_INT(mmd->bindweights[a])
+ if(mmd->bindcos)
+ for(a=0; a<mmd->totcagevert*3; a++)
+ SWITCH_INT(mmd->bindcos[a])
+ if(mmd->dynverts)
+ for(a=0; a<mmd->totvert; a++)
+ SWITCH_INT(mmd->dynverts[a])
+ }
}
}
}
@@ -2947,7 +3106,8 @@ static void direct_link_object(FileData *fd, Object *ob)
sb->bspring= NULL;
sb->scratch= NULL;
-
+ /* although not used anymore */
+ /* still have to be loaded to be compatible with old files */
sb->keys= newdataadr(fd, sb->keys);
test_pointer_array(fd, (void **)&sb->keys);
if(sb->keys) {
@@ -2964,6 +3124,9 @@ static void direct_link_object(FileData *fd, Object *ob)
ob->fluidsimSettings->meshBB = NULL;
ob->fluidsimSettings->meshSurfNormals = NULL;
}
+
+ link_list(fd, &ob->particlesystem);
+ direct_link_particlesystems(fd,&ob->particlesystem);
link_list(fd, &ob->prop);
prop= ob->prop.first;
@@ -3137,7 +3300,6 @@ static void direct_link_scene(FileData *fd, Scene *sce)
Editing *ed;
Sequence *seq;
MetaStack *ms;
- StripElem *se;
int a;
sce->theDag = NULL;
@@ -3173,8 +3335,6 @@ static void direct_link_scene(FileData *fd, Scene *sce)
/* a patch: after introduction of effects with 3 input strips */
if(seq->seq3==0) seq->seq3= seq->seq2;
- seq->curelem= 0;
-
seq->plugin= newdataadr(fd, seq->plugin);
seq->effectdata= newdataadr(fd, seq->effectdata);
@@ -3185,59 +3345,17 @@ static void direct_link_scene(FileData *fd, Scene *sce)
seq->strip= newdataadr(fd, seq->strip);
if(seq->strip && seq->strip->done==0) {
seq->strip->done= 1;
-
- /* standard: strips from effects/metas are not written, but are mallocced */
-
- if(seq->type==SEQ_IMAGE) {
- seq->strip->stripdata= newdataadr(fd, seq->strip->stripdata);
- se= seq->strip->stripdata;
- if(se) {
- for(a=0; a<seq->strip->len; a++, se++) {
- se->ok= 1;
- se->ibuf= 0;
- }
- }
- }
- else if(seq->type==SEQ_MOVIE) {
- /* only first stripelem is in file */
- se= newdataadr(fd, seq->strip->stripdata);
-
- if(se) {
- seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
- *seq->strip->stripdata= *se;
- MEM_freeN(se);
-
- se= seq->strip->stripdata;
-
- for(a=0; a<seq->strip->len; a++, se++) {
- se->ok= 1;
- se->ibuf= 0;
- se->nr= a + 1;
- }
- }
- }
- else if(seq->type==SEQ_RAM_SOUND
- || seq->type == SEQ_HD_SOUND) {
- /* only first stripelem is in file */
- se= newdataadr(fd, seq->strip->stripdata);
-
- if(se) {
- seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
- *seq->strip->stripdata= *se;
- MEM_freeN(se);
-
- se= seq->strip->stripdata;
-
- for(a=0; a<seq->strip->len; a++, se++) {
- se->ok= 2; /* why? */
- se->ibuf= 0;
- se->nr= a + 1;
- }
- }
+ seq->strip->tstripdata = 0;
+
+ if(seq->type == SEQ_IMAGE ||
+ seq->type == SEQ_MOVIE ||
+ seq->type == SEQ_RAM_SOUND ||
+ seq->type == SEQ_HD_SOUND) {
+ seq->strip->stripdata = newdataadr(
+ fd, seq->strip->stripdata);
+ } else {
+ seq->strip->stripdata = 0;
}
- else if(seq->len>0)
- seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
-
}
}
END_SEQ
@@ -3429,7 +3547,13 @@ static void lib_link_screen(FileData *fd, Main *main)
sfile->pupmenu= NULL;
}
else if(sl->spacetype==SPACE_IMASEL) {
- check_imasel_copy((SpaceImaSel *)sl);
+ SpaceImaSel *simasel= (SpaceImaSel *)sl;
+
+ simasel->files = NULL;
+ simasel->returnfunc= NULL;
+ simasel->menup= NULL;
+ simasel->pupmenu= NULL;
+ simasel->img= NULL;
}
else if(sl->spacetype==SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)sl;
@@ -3599,7 +3723,10 @@ void lib_link_screen_restore(Main *newmain, Scene *curscene)
sfile->libfiledata= 0;
}
else if(sl->spacetype==SPACE_IMASEL) {
- ;
+ SpaceImaSel *simasel= (SpaceImaSel *)sl;
+ if (simasel->files) {
+ BIF_filelist_freelib(simasel->files);
+ }
}
else if(sl->spacetype==SPACE_ACTION) {
SpaceAction *saction= (SpaceAction *)sl;
@@ -3927,6 +4054,7 @@ static char *dataname(short id_code)
case ID_SO: return "Data from SO";
case ID_NT: return "Data from NT";
case ID_BR: return "Data from BR";
+ case ID_PA: return "Data from PA";
}
return "Data from Lib Block";
@@ -4063,6 +4191,9 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID
case ID_BR:
direct_link_brush(fd, (Brush*)id);
break;
+ case ID_PA:
+ direct_link_particlesettings(fd, (ParticleSettings*)id);
+ break;
}
/*link direct data of ID properties*/
@@ -5209,7 +5340,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if (ob->track){
bConstraint *con;
+ bConstraintTypeInfo *cti;
bTrackToConstraint *data;
+ void *cdata;
list = &ob->constraints;
if (list)
@@ -5220,9 +5353,12 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
con->flag |= CONSTRAINT_EXPAND;
con->enforce=1.0F;
con->type = CONSTRAINT_TYPE_TRACKTO;
- data = (bTrackToConstraint *)
- new_constraint_data(CONSTRAINT_TYPE_TRACKTO);
-
+
+ cti= get_constraint_typeinfo(CONSTRAINT_TYPE_TRACKTO);
+ cdata= MEM_callocN(cti->size, cti->structName);
+ cti->new_data(cdata);
+ data = (bTrackToConstraint *)cdata;
+
data->tar = ob->track;
data->reserved1 = ob->trackflag;
data->reserved2 = ob->upflag;
@@ -5231,7 +5367,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
ob->track = 0;
}
-
+
ob = ob->id.next;
}
@@ -6021,8 +6157,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
if(arm->layer==0) arm->layer= 1;
}
for(sce= main->scene.first; sce; sce= sce->id.next) {
- bScreen *sc;
-
if(sce->jumpframe==0) sce->jumpframe= 10;
if(sce->audio.mixrate==0) sce->audio.mixrate= 44100;
@@ -6055,20 +6189,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
sce->toolsettings->unwrapper = 1;
}
- /* enable uv editor local sticky by default */
- for (sc= main->screen.first; sc; sc= sc->id.next) {
- ScrArea *sa;
- for (sa= sc->areabase.first; sa; sa= sa->next) {
- SpaceLink *sl;
- for (sl= sa->spacedata.first; sl; sl= sl->next) {
- if(sl->spacetype==SPACE_IMAGE) {
- SpaceImage *sima= (SpaceImage*)sl;
- if(!(sima->flag & SI_STICKYUVS))
- sima->flag |= SI_LOCALSTICKY;
- }
- }
- }
- }
if(sce->r.mode & R_PANORAMA) {
/* all these checks to ensure saved files with cvs version keep working... */
if(sce->r.xsch < sce->r.ysch) {
@@ -6462,13 +6582,19 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
Mesh *me;
for(me=main->mesh.first; me; me=me->id.next)
customdata_version_243(me);
- }
+ }
+
}
+
if(main->versionfile <= 244) {
Scene *sce;
-
+ bScreen *sc;
+ Lamp *la;
+ World *wrld;
+
if(main->versionfile != 244 || main->subversionfile < 2) {
Mesh *me;
+
for(sce= main->scene.first; sce; sce= sce->id.next)
sce->r.mode |= R_SSS;
@@ -6489,9 +6615,558 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
+
+ /* correct older action editors - incorrect scrolling */
+ for(sc= main->screen.first; sc; sc= sc->id.next) {
+ ScrArea *sa;
+ sa= sc->areabase.first;
+ while(sa) {
+ SpaceLink *sl;
+
+ for (sl= sa->spacedata.first; sl; sl= sl->next) {
+ if(sl->spacetype==SPACE_ACTION) {
+ SpaceAction *saction= (SpaceAction*) sl;
+
+ saction->v2d.tot.ymin= -1000.0;
+ saction->v2d.tot.ymax= 0.0;
+
+ saction->v2d.cur.ymin= -75.0;
+ saction->v2d.cur.ymax= 5.0;
+ }
+ }
+ sa = sa->next;
+ }
+ }
+ }
+ if (main->versionfile != 244 || main->subversionfile < 3) {
+ /* constraints recode version patch used to be here. Moved to 245 now... */
+
+
+ for(wrld=main->world.first; wrld; wrld= wrld->id.next) {
+ if (wrld->mode & WO_AMB_OCC)
+ wrld->ao_samp_method = WO_AOSAMP_CONSTANT;
+ else
+ wrld->ao_samp_method = WO_AOSAMP_HAMMERSLEY;
+
+ wrld->ao_adapt_thresh = 0.005;
+ }
+
+ for(la=main->lamp.first; la; la= la->id.next) {
+ if (la->type == LA_AREA)
+ la->ray_samp_method = LA_SAMP_CONSTANT;
+ else
+ la->ray_samp_method = LA_SAMP_HALTON;
+
+ la->adapt_thresh = 0.001;
+ }
}
}
+ if(main->versionfile <= 245) {
+ bScreen *sc;
+ Object *ob;
+ Image *ima;
+ Lamp *la;
+ Material *ma;
+
+ /* unless the file was created 2.44.3 but not 2.45, update the constraints */
+ if ( !(main->versionfile==244 && main->subversionfile==3) &&
+ ((main->versionfile<245) || (main->versionfile==245 && main->subversionfile==0)) )
+ {
+ for (ob = main->object.first; ob; ob= ob->id.next) {
+ ListBase *list;
+ list = &ob->constraints;
+
+ /* fix up constraints due to constraint recode changes (originally at 2.44.3) */
+ if (list) {
+ bConstraint *curcon;
+ for (curcon = list->first; curcon; curcon=curcon->next) {
+ /* old CONSTRAINT_LOCAL check -> convert to CONSTRAINT_SPACE_LOCAL */
+ if (curcon->flag & 0x20) {
+ curcon->ownspace = CONSTRAINT_SPACE_LOCAL;
+ curcon->tarspace = CONSTRAINT_SPACE_LOCAL;
+ }
+
+ switch (curcon->type) {
+ case CONSTRAINT_TYPE_LOCLIMIT:
+ {
+ bLocLimitConstraint *data= (bLocLimitConstraint *)curcon->data;
+
+ /* old limit without parent option for objects */
+ if (data->flag2)
+ curcon->ownspace = CONSTRAINT_SPACE_LOCAL;
+ }
+ break;
+ case CONSTRAINT_TYPE_STRETCHTO:
+ {
+ bStretchToConstraint *data= (bStretchToConstraint *)curcon->data;
+
+ /* force recalc of rest-length */
+ data->orglength = 0;
+ }
+ break;
+ }
+ }
+ }
+
+ /* correctly initialise constinv matrix */
+ Mat4One(ob->constinv);
+
+ if (ob->type == OB_ARMATURE) {
+ if (ob->pose) {
+ bConstraint *curcon;
+ bPoseChannel *pchan;
+
+ for (pchan = ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ /* make sure constraints are all up to date */
+ for (curcon = pchan->constraints.first; curcon; curcon=curcon->next) {
+ /* old CONSTRAINT_LOCAL check -> convert to CONSTRAINT_SPACE_LOCAL */
+ if (curcon->flag & 0x20) {
+ curcon->ownspace = CONSTRAINT_SPACE_LOCAL;
+ curcon->tarspace = CONSTRAINT_SPACE_LOCAL;
+ }
+
+ switch (curcon->type) {
+ case CONSTRAINT_TYPE_ACTION:
+ {
+ bActionConstraint *data= (bActionConstraint *)curcon->data;
+
+ /* 'data->local' used to mean that target was in local-space */
+ if (data->local)
+ curcon->tarspace = CONSTRAINT_SPACE_LOCAL;
+ }
+ break;
+ case CONSTRAINT_TYPE_STRETCHTO:
+ {
+ bStretchToConstraint *data= (bStretchToConstraint *)curcon->data;
+
+ /* force recalc of rest-length */
+ data->orglength = 0;
+ }
+ break;
+ }
+ }
+
+ /* correctly initialise constinv matrix */
+ Mat4One(pchan->constinv);
+ }
+ }
+ }
+ }
+ }
+
+ /* fix all versions before 2.45 */
+ if (main->versionfile != 245) {
+ /* repair preview from 242 - 244*/
+ for(ima= main->image.first; ima; ima= ima->id.next) {
+ ima->preview = NULL;
+ }
+
+ /* repair imasel space - completely reworked */
+ for(sc= main->screen.first; sc; sc= sc->id.next) {
+ ScrArea *sa;
+ sa= sc->areabase.first;
+ while(sa) {
+ SpaceLink *sl;
+
+ for (sl= sa->spacedata.first; sl; sl= sl->next) {
+ if(sl->spacetype==SPACE_IMASEL) {
+ SpaceImaSel *simasel= (SpaceImaSel*) sl;
+ simasel->blockscale= 0.7;
+ /* view 2D */
+ simasel->v2d.tot.xmin= -10.0;
+ simasel->v2d.tot.ymin= -10.0;
+ simasel->v2d.tot.xmax= (float)sa->winx + 10.0f;
+ simasel->v2d.tot.ymax= (float)sa->winy + 10.0f;
+ simasel->v2d.cur.xmin= 0.0;
+ simasel->v2d.cur.ymin= 0.0;
+ simasel->v2d.cur.xmax= (float)sa->winx;
+ simasel->v2d.cur.ymax= (float)sa->winy;
+ simasel->v2d.min[0]= 1.0;
+ simasel->v2d.min[1]= 1.0;
+ simasel->v2d.max[0]= 32000.0f;
+ simasel->v2d.max[1]= 32000.0f;
+ simasel->v2d.minzoom= 0.5f;
+ simasel->v2d.maxzoom= 1.21f;
+ simasel->v2d.scroll= 0;
+ simasel->v2d.keepaspect= 1;
+ simasel->v2d.keepzoom= 1;
+ simasel->v2d.keeptot= 0;
+ simasel->prv_h = 96;
+ simasel->prv_w = 96;
+ simasel->flag = 7; /* ??? elubie */
+ strcpy (simasel->dir, U.textudir); /* TON */
+ strcpy (simasel->file, "");
+
+ simasel->returnfunc = 0;
+ simasel->title[0] = 0;
+ }
+ }
+ sa = sa->next;
+ }
+ }
+ }
+
+ if (main->versionfile != 245 || main->subversionfile < 1) {
+ for(la=main->lamp.first; la; la= la->id.next) {
+ if (la->mode & LA_QUAD) la->falloff_type = LA_FALLOFF_SLIDERS;
+ else la->falloff_type = LA_FALLOFF_INVLINEAR;
+
+ if (la->curfalloff == NULL) {
+ la->curfalloff = curvemapping_add(1, 0.0f, 1.0f, 1.0f, 0.0f);
+ curvemapping_initialize(la->curfalloff);
+ }
+ }
+ }
+
+ for(ma=main->mat.first; ma; ma= ma->id.next) {
+ if (ma->samp_gloss_mir == 0) {
+ ma->gloss_mir = ma->gloss_tra= 1.0;
+ ma->aniso_gloss_mir = 1.0;
+ ma->samp_gloss_mir = ma->samp_gloss_tra= 18;
+ ma->adapt_thresh_mir = ma->adapt_thresh_tra = 0.005;
+ ma->dist_mir = 0.0;
+ ma->fadeto_mir = MA_RAYMIR_FADETOSKY;
+ }
+ }
+
+ }
+
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 2)) {
+ Image *ima;
+
+ /* initialize 1:1 Aspect */
+ for(ima= main->image.first; ima; ima= ima->id.next) {
+ ima->aspx = ima->aspy = 1.0f;
+ }
+
+ }
+
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 4)) {
+ bArmature *arm;
+ ModifierData *md;
+ Object *ob;
+
+ for(arm= main->armature.first; arm; arm= arm->id.next)
+ arm->deformflag |= ARM_DEF_B_BONE_REST;
+
+ for(ob = main->object.first; ob; ob= ob->id.next) {
+ for(md=ob->modifiers.first; md; md=md->next) {
+ if(md->type==eModifierType_Armature)
+ ((ArmatureModifierData*)md)->deformflag |= ARM_DEF_B_BONE_REST;
+ }
+ }
+ }
+
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 5)) {
+ /* foreground color needs to be somthing other then black */
+ Scene *sce;
+ for(sce= main->scene.first; sce; sce=sce->id.next) {
+ sce->r.fg_stamp[0] = sce->r.fg_stamp[1] = sce->r.fg_stamp[2] = 0.8;
+ sce->r.fg_stamp[3] = 1.0; /* dont use text alpha yet */
+ sce->r.bg_stamp[3] = 0.25; /* make sure the background has full alpha */
+ }
+ }
+
+
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 6)) {
+ Scene *sce;
+ /* fix frs_sec_base */
+ for(sce= main->scene.first; sce; sce= sce->id.next) {
+ if (sce->r.frs_sec_base == 0) {
+ sce->r.frs_sec_base = 1;
+ }
+ }
+ }
+
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 7)) {
+ Object *ob;
+ bPoseChannel *pchan;
+ bConstraint *con;
+ bConstraintTarget *ct;
+
+ for (ob = main->object.first; ob; ob= ob->id.next) {
+ if (ob->pose) {
+ for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ for (con=pchan->constraints.first; con; con=con->next) {
+ if (con->type == CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data= (bPythonConstraint *)con->data;
+ if (data->tar) {
+ /* version patching needs to be done */
+ ct= MEM_callocN(sizeof(bConstraintTarget), "PyConTarget");
+
+ ct->tar = data->tar;
+ strcpy(ct->subtarget, data->subtarget);
+ ct->space = con->tarspace;
+
+ BLI_addtail(&data->targets, ct);
+ data->tarnum++;
+
+ /* clear old targets to avoid problems */
+ data->tar = NULL;
+ strcpy(data->subtarget, "");
+ }
+ }
+ else if (con->type == CONSTRAINT_TYPE_LOCLIKE) {
+ bLocateLikeConstraint *data= (bLocateLikeConstraint *)con->data;
+
+ /* new headtail functionality makes Bone-Tip function obsolete */
+ if (data->flag & LOCLIKE_TIP)
+ con->headtail = 1.0f;
+ }
+ }
+ }
+ }
+
+ for (con=ob->constraints.first; con; con=con->next) {
+ if (con->type==CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data= (bPythonConstraint *)con->data;
+ if (data->tar) {
+ /* version patching needs to be done */
+ ct= MEM_callocN(sizeof(bConstraintTarget), "PyConTarget");
+
+ ct->tar = data->tar;
+ strcpy(ct->subtarget, data->subtarget);
+ ct->space = con->tarspace;
+
+ BLI_addtail(&data->targets, ct);
+ data->tarnum++;
+
+ /* clear old targets to avoid problems */
+ data->tar = NULL;
+ strcpy(data->subtarget, "");
+ }
+ }
+ else if (con->type == CONSTRAINT_TYPE_LOCLIKE) {
+ bLocateLikeConstraint *data= (bLocateLikeConstraint *)con->data;
+
+ /* new headtail functionality makes Bone-Tip function obsolete */
+ if (data->flag & LOCLIKE_TIP)
+ con->headtail = 1.0f;
+ }
+ }
+
+ if(ob->soft && ob->soft->keys) {
+ SoftBody *sb = ob->soft;
+ int k;
+
+ for(k=0; k<sb->totkey; k++) {
+ if(sb->keys[k])
+ MEM_freeN(sb->keys[k]);
+ }
+
+ MEM_freeN(sb->keys);
+
+ sb->keys = NULL;
+ sb->totkey = 0;
+ ob->softflag &= ~OB_SB_BAKESET;
+ }
+ }
+ }
+
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 7)) {
+ Object *ob;
+ bPoseChannel *pchan;
+ bConstraint *con;
+ bConstraintTarget *ct;
+
+ for(ob = main->object.first; ob; ob= ob->id.next) {
+ if(ob->pose) {
+ for(pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
+ for(con=pchan->constraints.first; con; con=con->next) {
+ if(con->type==CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data= (bPythonConstraint *)con->data;
+ if (data->tar) {
+ /* version patching needs to be done */
+ ct= MEM_callocN(sizeof(bConstraintTarget), "PyConTarget");
+
+ ct->tar = data->tar;
+ strcpy(ct->subtarget, data->subtarget);
+ ct->space = con->tarspace;
+
+ BLI_addtail(&data->targets, ct);
+ data->tarnum++;
+
+ /* clear old targets to avoid problems */
+ data->tar = NULL;
+ strcpy(data->subtarget, "");
+ }
+ }
+ }
+ }
+ }
+
+ for(con=ob->constraints.first; con; con=con->next) {
+ if(con->type==CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data= (bPythonConstraint *)con->data;
+ if (data->tar) {
+ /* version patching needs to be done */
+ ct= MEM_callocN(sizeof(bConstraintTarget), "PyConTarget");
+
+ ct->tar = data->tar;
+ strcpy(ct->subtarget, data->subtarget);
+ ct->space = con->tarspace;
+
+ BLI_addtail(&data->targets, ct);
+ data->tarnum++;
+
+ /* clear old targets to avoid problems */
+ data->tar = NULL;
+ strcpy(data->subtarget, "");
+ }
+ }
+ }
+ }
+ }
+
+ if ((main->versionfile < 245) || (main->versionfile == 245 && main->subversionfile < 8)) {
+ Scene *sce;
+ Object *ob;
+ PartEff *paf=0;
+
+ for(ob = main->object.first; ob; ob= ob->id.next) {
+ if(ob->soft && ob->soft->keys) {
+ SoftBody *sb = ob->soft;
+ int k;
+
+ for(k=0; k<sb->totkey; k++) {
+ if(sb->keys[k])
+ MEM_freeN(sb->keys[k]);
+ }
+
+ MEM_freeN(sb->keys);
+
+ sb->keys = NULL;
+ sb->totkey = 0;
+ ob->softflag &= ~OB_SB_BAKESET;
+ }
+
+ /* convert old particles to new system */
+ if((paf = give_parteff(ob))) {
+ ParticleSystem *psys;
+ ModifierData *md;
+ ParticleSystemModifierData *psmd;
+ ParticleSettings *part;
+
+ /* create new particle system */
+ psys = MEM_callocN(sizeof(ParticleSystem), "particle_system");
+
+ part = psys->part = psys_new_settings("PSys", main);
+
+ /* needed for proper libdata lookup */
+ oldnewmap_insert(fd->libmap, psys->part, psys->part, 0);
+
+ part->id.us--;
+
+ psys->totpart=0;
+ psys->flag=PSYS_ENABLED|PSYS_CURRENT;
+
+ BLI_addtail(&ob->particlesystem, psys);
+
+ md= modifier_new(eModifierType_ParticleSystem);
+ sprintf(md->name, "ParticleSystem %i", BLI_countlist(&ob->particlesystem));
+ psmd= (ParticleSystemModifierData*) md;
+ psmd->psys=psys;
+ BLI_addtail(&ob->modifiers, md);
+
+ /* convert settings from old particle system */
+ /* general settings */
+ part->totpart = paf->totpart;
+ part->sta = paf->sta;
+ part->end = paf->end;
+ part->lifetime = paf->lifetime;
+ part->randlife = paf->randlife;
+ psys->seed = paf->seed;
+ part->disp = paf->disp;
+ part->omat = paf->mat[0];
+ part->hair_step = paf->totkey;
+
+ part->eff_group = paf->group;
+
+ /* physics */
+ part->normfac = paf->normfac * 25.0f;
+ part->obfac = paf->obfac;
+ part->randfac = paf->randfac * 25.0f;
+ part->dampfac = paf->damp;
+ VECCOPY(part->acc, paf->force);
+
+ /* flags */
+ if(paf->stype & PAF_VECT) {
+ if(paf->flag & PAF_STATIC) {
+ /* new hair lifetime is always 100.0f */
+ float fac = paf->lifetime / 100.0f;
+
+ part->draw_as = PART_DRAW_PATH;
+ part->type = PART_HAIR;
+ psys->recalc |= PSYS_RECALC_HAIR;
+
+ part->normfac *= fac;
+ part->randfac *= fac;
+ }
+ else {
+ part->draw_as = PART_DRAW_LINE;
+ part->draw |= PART_DRAW_VEL_LENGTH;
+ part->draw_line[1] = 0.04f;
+ }
+ }
+
+ part->rotmode = PART_ROT_VEL;
+
+ part->flag |= (paf->flag & PAF_BSPLINE) ? PART_HAIR_BSPLINE : 0;
+ part->flag |= (paf->flag & PAF_TRAND) ? PART_TRAND : 0;
+ part->flag |= (paf->flag & PAF_EDISTR) ? PART_EDISTR : 0;
+ part->flag |= (paf->flag & PAF_UNBORN) ? PART_UNBORN : 0;
+ part->flag |= (paf->flag & PAF_DIED) ? PART_DIED : 0;
+ part->from |= (paf->flag & PAF_FACE) ? PART_FROM_FACE : 0;
+ part->draw |= (paf->flag & PAF_SHOWE) ? PART_DRAW_EMITTER : 0;
+
+ psys->vgroup[PSYS_VG_DENSITY] = paf->vertgroup;
+ psys->vgroup[PSYS_VG_VEL] = paf->vertgroup_v;
+ psys->vgroup[PSYS_VG_LENGTH] = paf->vertgroup_v;
+
+ /* dupliobjects */
+ if(ob->transflag & OB_DUPLIVERTS) {
+ Object *dup = main->object.first;
+
+ for(; dup; dup= dup->id.next) {
+ if(ob == newlibadr(fd, lib, dup->parent)) {
+ part->dup_ob = dup;
+ ob->transflag |= OB_DUPLIPARTS;
+ ob->transflag &= ~OB_DUPLIVERTS;
+
+ part->draw_as = PART_DRAW_OB;
+ }
+ }
+ }
+
+ free_effects(&ob->effect);
+
+ printf("Old particle system converted to new system.\n");
+ }
+ }
+
+
+ for(sce= main->scene.first; sce; sce=sce->id.next) {
+ ParticleEditSettings *pset= &sce->toolsettings->particle;
+ int a;
+
+ if(pset->brush[0].size == 0) {
+ pset->flag= PE_KEEP_LENGTHS|PE_LOCK_FIRST|PE_DEFLECT_EMITTER;
+ pset->emitterdist= 0.25f;
+ pset->totrekey= 5;
+ pset->totaddkey= 5;
+ pset->brushtype= PE_BRUSH_NONE;
+
+ for(a=0; a<PE_TOT_BRUSH; a++) {
+ pset->brush[a].strength= 50;
+ pset->brush[a].size= 50;
+ pset->brush[a].step= 10;
+ }
+
+ pset->brush[PE_BRUSH_CUT].strength= 100;
+ }
+ }
+ }
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */
@@ -6525,6 +7200,7 @@ static void lib_link_all(FileData *fd, Main *main)
lib_link_screen_sequence_ipos(main);
lib_link_nodetree(fd, main); /* has to be done after scene/materials, this will verify group nodes */
lib_link_brush(fd, main);
+ lib_link_particlesettings(fd, main);
lib_link_mesh(fd, main); /* as last: tpage images with users at zero */
@@ -6885,6 +7561,19 @@ static void expand_constraints(FileData *fd, Main *mainvar, ListBase *lb)
for (curcon=lb->first; curcon; curcon=curcon->next) {
switch (curcon->type) {
+ case CONSTRAINT_TYPE_NULL:
+ break;
+ case CONSTRAINT_TYPE_PYTHON:
+ {
+ bPythonConstraint *data = (bPythonConstraint*)curcon->data;
+ bConstraintTarget *ct;
+
+ for (ct= data->targets.first; ct; ct= ct->next)
+ expand_doit(fd, mainvar, ct->tar);
+
+ expand_doit(fd, mainvar, data->text);
+ }
+ break;
case CONSTRAINT_TYPE_ACTION:
{
bActionConstraint *data = (bActionConstraint*)curcon->data;
@@ -6896,75 +7585,80 @@ static void expand_constraints(FileData *fd, Main *mainvar, ListBase *lb)
{
bLocateLikeConstraint *data = (bLocateLikeConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
}
+ break;
case CONSTRAINT_TYPE_ROTLIKE:
{
bRotateLikeConstraint *data = (bRotateLikeConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
}
+ break;
case CONSTRAINT_TYPE_SIZELIKE:
{
bSizeLikeConstraint *data = (bSizeLikeConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
}
+ break;
case CONSTRAINT_TYPE_KINEMATIC:
{
bKinematicConstraint *data = (bKinematicConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
+ expand_doit(fd, mainvar, data->poletar);
}
+ break;
case CONSTRAINT_TYPE_TRACKTO:
{
bTrackToConstraint *data = (bTrackToConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
}
+ break;
case CONSTRAINT_TYPE_MINMAX:
{
bMinMaxConstraint *data = (bMinMaxConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
}
+ break;
case CONSTRAINT_TYPE_LOCKTRACK:
{
bLockTrackConstraint *data = (bLockTrackConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
}
+ break;
case CONSTRAINT_TYPE_FOLLOWPATH:
{
bFollowPathConstraint *data = (bFollowPathConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
- }
- case CONSTRAINT_TYPE_DISTANCELIMIT:
- {
- bDistanceLimitConstraint *data = (bDistanceLimitConstraint*)curcon->data;
- expand_doit(fd, mainvar, data->tar);
- break;
}
+ break;
case CONSTRAINT_TYPE_STRETCHTO:
{
bStretchToConstraint *data = (bStretchToConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
}
+ break;
case CONSTRAINT_TYPE_RIGIDBODYJOINT:
{
bRigidBodyJointConstraint *data = (bRigidBodyJointConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
}
+ break;
case CONSTRAINT_TYPE_CLAMPTO:
{
bClampToConstraint *data = (bClampToConstraint*)curcon->data;
expand_doit(fd, mainvar, data->tar);
- break;
}
- case CONSTRAINT_TYPE_NULL:
+ break;
+ case CONSTRAINT_TYPE_CHILDOF:
+ {
+ bChildOfConstraint *data = (bChildOfConstraint*)curcon->data;
+ expand_doit(fd, mainvar, data->tar);
+ }
+ break;
+ case CONSTRAINT_TYPE_TRANSFORM:
+ {
+ bTransformConstraint *data = (bTransformConstraint*)curcon->data;
+ expand_doit(fd, mainvar, data->tar);
+ }
break;
default:
break;
@@ -7039,6 +7733,11 @@ static void expand_modifier(FileData *fd, Main *mainvar, ModifierData *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);
+ }
}
static void expand_scriptlink(FileData *fd, Main *mainvar, ScriptLink *slink)
@@ -7053,6 +7752,7 @@ static void expand_scriptlink(FileData *fd, Main *mainvar, ScriptLink *slink)
static void expand_object(FileData *fd, Main *mainvar, Object *ob)
{
ModifierData *md;
+ ParticleSystem *psys;
bSensor *sens;
bController *cont;
bActuator *act;
@@ -7095,6 +7795,9 @@ static void expand_object(FileData *fd, Main *mainvar, Object *ob)
if(ob->proxy_group)
expand_doit(fd, mainvar, ob->proxy_group);
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ expand_doit(fd, mainvar, psys->part);
+
sens= ob->sensors.first;
while(sens) {
for(a=0; a<sens->totlinks; a++) {
@@ -7411,8 +8114,8 @@ static void append_id_part(FileData *fd, Main *mainvar, ID *id, ID **id_r)
/* common routine to append/link something from a library */
-static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int idcode,
- int totsel, FileData *fd)
+static Library* library_append( Scene *scene, char* file, char *dir, int idcode,
+ int totsel, FileData *fd, struct direntry* filelist, int totfile, short flag)
{
Main *mainl;
Library *curlib;
@@ -7428,13 +8131,13 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
curlib= mainl->curlib;
if(totsel==0) {
- append_named_part(fd, mainl, scene, sfile->file, idcode, sfile->flag);
+ append_named_part(fd, mainl, scene, file, idcode, flag);
}
else {
int a;
- for(a=0; a<sfile->totfile; a++) {
- if(sfile->filelist[a].flags & ACTIVE) {
- append_named_part(fd, mainl, scene, sfile->filelist[a].relname, idcode, sfile->flag);
+ for(a=0; a<totfile; a++) {
+ if(filelist[a].flags & ACTIVE) {
+ append_named_part(fd, mainl, scene, filelist[a].relname, idcode, flag);
}
}
}
@@ -7445,7 +8148,7 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
/* do this when expand found other libs */
read_libraries(fd, &fd->mainlist);
- if(sfile->flag & FILE_STRINGCODE) {
+ if(flag & FILE_STRINGCODE) {
/* use the full path, this could have been read by other library even */
BLI_strncpy(mainl->curlib->name, mainl->curlib->filename, sizeof(mainl->curlib->name));
@@ -7462,7 +8165,7 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
/* give a base to loose objects. If group append, do it for objects too */
if(idcode==ID_GR)
- give_base_to_objects(scene, &(G.main->object), (sfile->flag & FILE_LINK)?NULL:curlib);
+ give_base_to_objects(scene, &(G.main->object), (flag & FILE_LINK)?NULL:curlib);
else
give_base_to_objects(scene, &(G.main->object), NULL);
@@ -7473,8 +8176,7 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
/* patch to prevent switch_endian happens twice */
if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
blo_freefiledata( fd );
- sfile->libfiledata= 0;
- }
+ }
return curlib;
}
@@ -7487,16 +8189,8 @@ static Library* library_append( Scene *scene, SpaceFile *sfile, char *dir, int i
void BLO_script_library_append(BlendHandle *bh, char *dir, char *name,
int idcode, short flag, Scene *scene )
{
- SpaceFile sfile;
-
- /* build a minimal "fake" SpaceFile object */
- sfile.flag = flag;
- sfile.totfile = 0;
- strcpy(sfile.file, name);
-
/* try to append the requested object */
-
- library_append( scene, &sfile, dir, idcode, 0, (FileData *)bh );
+ library_append( scene, name, dir, idcode, 0, (FileData *)bh, NULL, 0, flag );
/* do we need to do this? */
DAG_scene_sort(G.scene);
@@ -7506,26 +8200,31 @@ void BLO_script_library_append(BlendHandle *bh, char *dir, char *name,
/* dir is a full path */
void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
{
- FileData *fd= (FileData*) sfile->libfiledata;
+ BLO_library_append_(&sfile->libfiledata, sfile->filelist, sfile->totfile, dir, sfile->file, sfile->flag, idcode);
+}
+
+void BLO_library_append_(BlendHandle** libfiledata, struct direntry* filelist, int totfile, char *dir, char* file, short flag, int idcode)
+{
+ FileData *fd= (FileData*) (*libfiledata);
Library *curlib;
Base *centerbase;
Object *ob;
int a, totsel=0;
/* are there files selected? */
- for(a=0; a<sfile->totfile; a++) {
- if(sfile->filelist[a].flags & ACTIVE) {
+ for(a=0; a<totfile; a++) {
+ if(filelist[a].flags & ACTIVE) {
totsel++;
}
}
if(totsel==0) {
/* is the indicated file in the filelist? */
- if(sfile->file[0]) {
- for(a=0; a<sfile->totfile; a++) {
- if( strcmp(sfile->filelist[a].relname, sfile->file)==0) break;
+ if(file[0]) {
+ for(a=0; a<totfile; a++) {
+ if( strcmp(filelist[a].relname, file)==0) break;
}
- if(a==sfile->totfile) {
+ if(a==totfile) {
error("Wrong indicated name");
return;
}
@@ -7537,13 +8236,18 @@ void BLO_library_append(SpaceFile *sfile, char *dir, int idcode)
}
/* now we have or selected, or an indicated file */
- if(sfile->flag & FILE_AUTOSELECT) scene_deselect_all(G.scene);
+ if(flag & FILE_AUTOSELECT) scene_deselect_all(G.scene);
+
+ curlib = library_append( G.scene, file, dir, idcode, totsel, fd, filelist, totfile,flag );
- curlib = library_append( G.scene, sfile, dir, idcode, totsel, fd );
+ /* patch to prevent switch_endian happens twice */
+ if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
+ (*libfiledata)= 0;
+ }
/* when not linking (appending)... */
- if((sfile->flag & FILE_LINK)==0) {
- if(sfile->flag & FILE_ATCURSOR) {
+ if((flag & FILE_LINK)==0) {
+ if(flag & FILE_ATCURSOR) {
float *curs, centerloc[3], vec[3], min[3], max[3];
int count= 0;
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 226561ab97b..cfaae977bdd 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -132,6 +132,7 @@ Important to know is that 'streaming' has been added to files, for Blender Publi
#include "DNA_object_force.h"
#include "DNA_oops_types.h"
#include "DNA_packedFile_types.h"
+#include "DNA_particle_types.h"
#include "DNA_property_types.h"
#include "DNA_scene_types.h"
#include "DNA_sdna_types.h"
@@ -526,6 +527,43 @@ static void write_effects(WriteData *wd, ListBase *lb)
}
}
+static void write_particlesettings(WriteData *wd, ListBase *idbase)
+{
+ ParticleSettings *part;
+
+ part= idbase->first;
+ while(part) {
+ if(part->id.us>0 || wd->current) {
+ /* write LibData */
+ writestruct(wd, ID_PA, "ParticleSettings", 1, part);
+ writestruct(wd, DATA, "PartDeflect", 1, part->pd);
+ }
+ part= part->id.next;
+ }
+}
+static void write_particlesystems(WriteData *wd, ListBase *particles)
+{
+ ParticleSystem *psys= particles->first;
+ int a;
+
+ for(; psys; psys=psys->next) {
+ writestruct(wd, DATA, "ParticleSystem", 1, psys);
+
+ if(psys->particles) {
+ writestruct(wd, DATA, "ParticleData", psys->totpart ,psys->particles);
+
+ if(psys->particles->hair) {
+ ParticleData *pa = psys->particles;
+
+ for(a=0; a<psys->totpart; a++, pa++)
+ writedata(wd, DATA, MEM_allocN_len(pa->hair),pa->hair);
+ }
+ }
+ if(psys->child) writestruct(wd, DATA, "ChildParticle", psys->totchild ,psys->child);
+ writestruct(wd, DATA, "SoftBody", 1, psys->soft);
+ }
+}
+
static void write_properties(WriteData *wd, ListBase *lb)
{
bProperty *prop;
@@ -698,58 +736,32 @@ static void write_constraints(WriteData *wd, ListBase *conlist)
bConstraint *con;
for (con=conlist->first; con; con=con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+
/* Write the specific data */
- switch (con->type) {
- case CONSTRAINT_TYPE_NULL:
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- writestruct(wd, DATA, "bTrackToConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_KINEMATIC:
- writestruct(wd, DATA, "bKinematicConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- writestruct(wd, DATA, "bRotateLikeConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- writestruct(wd, DATA, "bLocateLikeConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- writestruct(wd, DATA, "bSizeLikeConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_ACTION:
- writestruct(wd, DATA, "bActionConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- writestruct(wd, DATA, "bLockTrackConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- writestruct(wd, DATA, "bFollowPathConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- writestruct(wd, DATA, "bStretchToConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_MINMAX:
- writestruct(wd, DATA, "bMinMaxConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_LOCLIMIT:
- writestruct(wd, DATA, "bLocLimitConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_ROTLIMIT:
- writestruct(wd, DATA, "bRotLimitConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_SIZELIMIT:
- writestruct(wd, DATA, "bSizeLimitConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- writestruct(wd, DATA, "bRigidBodyJointConstraint", 1, con->data);
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- writestruct(wd, DATA, "bClampToConstraint", 1, con->data);
- break;
- default:
- break;
+ if (cti && con->data) {
+ /* firstly, just write the plain con->data struct */
+ writestruct(wd, DATA, cti->structName, 1, con->data);
+
+ /* do any constraint specific stuff */
+ switch (con->type) {
+ case CONSTRAINT_TYPE_PYTHON:
+ {
+ bPythonConstraint *data = (bPythonConstraint *)con->data;
+ bConstraintTarget *ct;
+
+ /* write targets */
+ for (ct= data->targets.first; ct; ct= ct->next)
+ writestruct(wd, DATA, "bConstraintTarget", 1, ct);
+
+ /* Write ID Properties -- and copy this comment EXACTLY for easy finding
+ of library blocks that implement this.*/
+ IDP_WriteProperty(data->prop, wd);
+ }
+ break;
+ }
}
+
/* Write the constraint */
writestruct(wd, DATA, "bConstraint", 1, con);
}
@@ -757,21 +769,24 @@ static void write_constraints(WriteData *wd, ListBase *conlist)
static void write_pose(WriteData *wd, bPose *pose)
{
- bPoseChannel *chan;
+ bPoseChannel *chan;
/* Write each channel */
-
if (!pose)
return;
- // Write channels
+ /* Write channels */
for (chan=pose->chanbase.first; chan; chan=chan->next) {
write_constraints(wd, &chan->constraints);
- chan->selectflag= chan->bone->flag & (BONE_SELECTED|BONE_ACTIVE); // gets restored on read, for library armatures
+
+ /* prevent crashes with autosave, when a bone duplicated in editmode has not yet been assigned to its posechannel */
+ if (chan->bone)
+ chan->selectflag= chan->bone->flag & (BONE_SELECTED|BONE_ACTIVE); /* gets restored on read, for library armatures */
+
writestruct(wd, DATA, "bPoseChannel", 1, chan);
}
- // Write this pose
+ /* Write this pose */
writestruct(wd, DATA, "bPose", 1, pose);
}
@@ -800,21 +815,32 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
for (md=modbase->first; md; md= md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if (mti == NULL) return;
-
+
writestruct(wd, DATA, mti->structName, 1, md);
-
+
if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md;
-
+
writedata(wd, DATA, sizeof(int)*hmd->totindex, hmd->indexar);
}
+ else if (md->type==eModifierType_MeshDeform) {
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+ int size = mmd->dyngridsize;
+
+ writedata(wd, DATA, sizeof(float)*mmd->totvert*mmd->totcagevert,
+ mmd->bindweights);
+ writedata(wd, DATA, sizeof(float)*3*mmd->totcagevert,
+ mmd->bindcos);
+ writestruct(wd, DATA, "MDefCell", size*size*size, mmd->dyngrid);
+ writestruct(wd, DATA, "MDefInfluence", mmd->totinfluence, mmd->dyninfluences);
+ writedata(wd, DATA, sizeof(int)*mmd->totvert, mmd->dynverts);
+ }
}
}
static void write_objects(WriteData *wd, ListBase *idbase)
{
Object *ob;
- int a;
ob= idbase->first;
while(ob) {
@@ -850,17 +876,9 @@ static void write_objects(WriteData *wd, ListBase *idbase)
writestruct(wd, DATA, "PartDeflect", 1, ob->pd);
writestruct(wd, DATA, "SoftBody", 1, ob->soft);
- if(ob->soft) {
- SoftBody *sb= ob->soft;
- if(sb->keys) {
- writedata(wd, DATA, sizeof(void *)*sb->totkey, sb->keys);
- for(a=0; a<sb->totkey; a++) {
- writestruct(wd, DATA, "SBVertex", sb->totpoint, sb->keys[a]);
- }
- }
- }
writestruct(wd, DATA, "FluidsimSettings", 1, ob->fluidsimSettings); // NT
+ write_particlesystems(wd, &ob->particlesystem);
write_modifiers(wd, &ob->modifiers);
}
ob= ob->id.next;
@@ -1203,11 +1221,36 @@ static void write_lattices(WriteData *wd, ListBase *idbase)
}
}
+static void write_previews(WriteData *wd, PreviewImage *prv)
+{
+ if (prv) {
+ short w = prv->w[1];
+ short h = prv->h[1];
+ unsigned int *rect = prv->rect[1];
+ /* don't write out large previews if not requested */
+ if (!(U.flag & USER_SAVE_PREVIEWS) ) {
+ prv->w[1] = 0;
+ prv->h[1] = 0;
+ prv->rect[1] = NULL;
+ }
+ writestruct(wd, DATA, "PreviewImage", 1, prv);
+ if (prv->rect[0]) writedata(wd, DATA, prv->w[0]*prv->h[0]*sizeof(unsigned int), prv->rect[0]);
+ if (prv->rect[1]) writedata(wd, DATA, prv->w[1]*prv->h[1]*sizeof(unsigned int), prv->rect[1]);
+
+ /* restore preview, we still want to keep it in memory even if not saved to file */
+ if (!(U.flag & USER_SAVE_PREVIEWS) ) {
+ prv->w[1] = w;
+ prv->h[1] = h;
+ prv->rect[1] = rect;
+ }
+ }
+}
+
static void write_images(WriteData *wd, ListBase *idbase)
{
Image *ima;
PackedFile * pf;
- PreviewImage *prv;
+
ima= idbase->first;
while(ima) {
@@ -1222,12 +1265,9 @@ static void write_images(WriteData *wd, ListBase *idbase)
writedata(wd, DATA, pf->size, pf->data);
}
- if (ima->preview) {
- prv = ima->preview;
- writestruct(wd, DATA, "PreviewImage", 1, prv);
- writedata(wd, DATA, prv->w*prv->h*sizeof(unsigned int), prv->rect);
+ write_previews(wd, ima->preview);
+
}
- }
ima= ima->id.next;
}
/* flush helps the compression for undo-save */
@@ -1249,6 +1289,8 @@ static void write_textures(WriteData *wd, ListBase *idbase)
if(tex->plugin) writestruct(wd, DATA, "PluginTex", 1, tex->plugin);
if(tex->coba) writestruct(wd, DATA, "ColorBand", 1, tex->coba);
if(tex->env) writestruct(wd, DATA, "EnvMap", 1, tex->env);
+
+ write_previews(wd, tex->preview);
}
tex= tex->id.next;
}
@@ -1288,6 +1330,8 @@ static void write_materials(WriteData *wd, ListBase *idbase)
writestruct(wd, DATA, "bNodeTree", 1, ma->nodetree);
write_nodetree(wd, ma->nodetree);
}
+
+ write_previews(wd, ma->preview);
}
ma= ma->id.next;
}
@@ -1310,6 +1354,9 @@ static void write_worlds(WriteData *wd, ListBase *idbase)
}
write_scriptlink(wd, &wrld->scriptlink);
+
+ write_previews(wd, wrld->preview);
+
}
wrld= wrld->id.next;
}
@@ -1332,7 +1379,13 @@ static void write_lamps(WriteData *wd, ListBase *idbase)
if(la->mtex[a]) writestruct(wd, DATA, "MTex", 1, la->mtex[a]);
}
+ if(la->curfalloff)
+ write_curvemapping(wd, la->curfalloff);
+
write_scriptlink(wd, &la->scriptlink);
+
+ write_previews(wd, la->preview);
+
}
la= la->id.next;
}
@@ -1563,6 +1616,8 @@ static void write_screens(WriteData *wd, ListBase *scrbase)
writestruct(wd, DATA, "SpaceText", 1, sl);
}
else if(sl->spacetype==SPACE_SCRIPT) {
+ SpaceScript *sc = (SpaceScript*)sl;
+ sc->but_refs = NULL;
writestruct(wd, DATA, "SpaceScript", 1, sl);
}
else if(sl->spacetype==SPACE_ACTION) {
@@ -1731,7 +1786,7 @@ static void write_sounds(WriteData *wd, ListBase *idbase)
// set all samples to unsaved status
- sample = samples->first;
+ sample = samples->first; // samples is a global defined in sound.c
while (sample) {
sample->flags |= SAMPLE_NEEDS_SAVE;
sample = sample->id.next;
@@ -1883,6 +1938,7 @@ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int
write_materials(wd, &G.main->mat);
write_textures (wd, &G.main->tex);
write_meshs (wd, &G.main->mesh);
+ write_particlesettings(wd, &G.main->particle);
write_nodetrees(wd, &G.main->nodetree);
write_brushes (wd, &G.main->brush);
if(current==NULL)
diff --git a/source/blender/blenpluginapi/iff.h b/source/blender/blenpluginapi/iff.h
index 8e5b538eda6..5eb52158a1a 100644
--- a/source/blender/blenpluginapi/iff.h
+++ b/source/blender/blenpluginapi/iff.h
@@ -208,6 +208,8 @@ LIBEXPORT void IMB_rectcpy(struct ImBuf *dbuf, struct ImBuf *sbuf,
int destx, int desty, int srcx, int srcy, int width, int height);
LIBEXPORT void IMB_rectfill(struct ImBuf *drect, float col[4]);
+LIBEXPORT void IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int y1, int x2, int y2);
+LIBEXPORT void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height, float *col, int x1, int y1, int x2, int y2);
#endif /* IFF_H */
diff --git a/source/blender/blenpluginapi/intern/Makefile b/source/blender/blenpluginapi/intern/Makefile
index 00052d36cfd..e493ea40aa5 100644
--- a/source/blender/blenpluginapi/intern/Makefile
+++ b/source/blender/blenpluginapi/intern/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris"))
CFLAGS += -shared
endif
diff --git a/source/blender/ftfont/CMakeLists.txt b/source/blender/ftfont/CMakeLists.txt
index 6587fcd7582..7b89416bbe1 100644
--- a/source/blender/ftfont/CMakeLists.txt
+++ b/source/blender/ftfont/CMakeLists.txt
@@ -30,7 +30,7 @@
FILE(GLOB SRC intern/*.cpp)
SET(INC
- . intern ../blenkernel ../blenlib ../makesdna
+ . intern ../blenkernel ../blenlib ../makesdna ../include
${FTGL_INC}
${FREETYPE_INC}
${GETTEXT_INC}
diff --git a/source/blender/ftfont/FTF_Api.h b/source/blender/ftfont/FTF_Api.h
index 15fa55c905d..0793c4b6dfb 100644
--- a/source/blender/ftfont/FTF_Api.h
+++ b/source/blender/ftfont/FTF_Api.h
@@ -106,12 +106,12 @@ FTF_EXPORT float FTF_GetStringWidth(char* str, unsigned int flag);
/**
* Get Bounding Box
- * @param llx
- * @param lly
- * @param llz
- * @param urx
- * @param ury
- * @param urz
+ * @param llx Lower left near x coord
+ * @param lly Lower left near y coord
+ * @param llz Lower left near z coord
+ * @param urx Upper right far x coord
+ * @param ury Upper right far y coord
+ * @param urz Upper right far z coord
* @param mode flag to forward to FTF_TransConvString()
* not test yet.
*/
@@ -154,6 +154,10 @@ FTF_EXPORT void FTF_SetScale(float fsize);
FTF_EXPORT void FTF_End(void);
+/* Font preview functions */
+FTF_EXPORT int FTF_GetNewFont (const unsigned char *str, int datasize, int fontsize);
+FTF_EXPORT float FTF_DrawNewFontString(char* str, unsigned int flag);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/ftfont/SConscript b/source/blender/ftfont/SConscript
index cf6805d6bb3..615b274677c 100644
--- a/source/blender/ftfont/SConscript
+++ b/source/blender/ftfont/SConscript
@@ -4,7 +4,7 @@ Import ('env')
sources = env.Glob('intern/*.cpp')
-incs = '. intern ../blenkernel ../blenlib ../makesdna'
+incs = '. intern ../blenkernel ../blenlib ../makesdna ../include'
incs += ' ' + env['BF_FTGL_INC']
incs += ' ' + env['BF_FREETYPE_INC']
incs += ' ' + env['BF_GETTEXT_INC']
diff --git a/source/blender/ftfont/intern/FTF_Api.cpp b/source/blender/ftfont/intern/FTF_Api.cpp
index 52fc9378f00..bf6698a1cde 100644
--- a/source/blender/ftfont/intern/FTF_Api.cpp
+++ b/source/blender/ftfont/intern/FTF_Api.cpp
@@ -43,8 +43,18 @@
#include "../FTF_Api.h"
#include "FTF_TTFont.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+ #include "datatoc.h"
+#ifdef __cplusplus
+}
+#endif
+
#define FTF_EXPORT
+FTF_TTFont *newfont= 0; // preview font
+
static FTF_TTFont *_FTF_GetFont(void) {
static FTF_TTFont *theFont = NULL;
@@ -55,8 +65,28 @@ static FTF_TTFont *_FTF_GetFont(void) {
return theFont;
}
+FTF_EXPORT int FTF_GetNewFont (const unsigned char *str, int datasize, int fontsize) {
+
+ if (newfont) delete newfont;
+ newfont= new FTF_TTFont();
+
+ if (!(newfont->SetFont((unsigned char*)str, datasize, fontsize))) {
+ newfont->SetFont((unsigned char*)datatoc_bfont_ttf, datatoc_bfont_ttf_size, fontsize);
+ return 0;
+ }
+ return 1;
+}
+
+FTF_EXPORT float FTF_DrawNewFontString(char* str, unsigned int flag)
+{
+ if (newfont)
+ return newfont->DrawString(str, flag);
+ return 0.0f;
+}
+
FTF_EXPORT void FTF_End(void) {
delete _FTF_GetFont();
+ delete newfont;
}
FTF_EXPORT void FTF_SetSize(int size)
@@ -174,3 +204,5 @@ FTF_EXPORT void FTF_SetScale(float fsize)
{
_FTF_GetFont()->SetScale(fsize);
}
+
+
diff --git a/source/blender/ftfont/intern/FTF_TTFont.cpp b/source/blender/ftfont/intern/FTF_TTFont.cpp
index a4d81fe0133..34b22e5c9d2 100644
--- a/source/blender/ftfont/intern/FTF_TTFont.cpp
+++ b/source/blender/ftfont/intern/FTF_TTFont.cpp
@@ -335,6 +335,8 @@ float FTF_TTFont::DrawString(char* str, unsigned int flag)
removes special characters completely. So, for now we just skip that then. (ton) */
if (FTF_USE_GETTEXT & flag)
utf8towchar(wstr, gettext(str));
+ else if (FTF_INPUT_UTF8 & flag)
+ utf8towchar(wstr, str);
glGetFloatv(GL_CURRENT_COLOR, color);
@@ -344,7 +346,7 @@ float FTF_TTFont::DrawString(char* str, unsigned int flag)
glPixelTransferf(GL_GREEN_SCALE, color[1]);
glPixelTransferf(GL_BLUE_SCALE, color[2]);
- if (FTF_USE_GETTEXT & flag)
+ if ((FTF_USE_GETTEXT | FTF_INPUT_UTF8) & flag)
font->Render(wstr);
else
font->Render(str);
@@ -362,7 +364,7 @@ float FTF_TTFont::DrawString(char* str, unsigned int flag)
glTranslatef(pen_x, pen_y, 0.0);
glScalef(fsize, fsize, 1.0);
- if (FTF_USE_GETTEXT & flag)
+ if ((FTF_USE_GETTEXT | FTF_INPUT_UTF8) & flag)
font->Render(wstr);
else
font->Render(str);
@@ -373,7 +375,7 @@ float FTF_TTFont::DrawString(char* str, unsigned int flag)
glDisable(GL_TEXTURE_2D);
}
- if (FTF_USE_GETTEXT & flag)
+ if ((FTF_USE_GETTEXT | FTF_INPUT_UTF8) & flag)
return font->Advance(wstr);
else
return font->Advance(str);
diff --git a/source/blender/ftfont/intern/FTF_TTFont.h b/source/blender/ftfont/intern/FTF_TTFont.h
index c4dee93c5dc..b5ff1cc54bf 100644
--- a/source/blender/ftfont/intern/FTF_TTFont.h
+++ b/source/blender/ftfont/intern/FTF_TTFont.h
@@ -78,6 +78,17 @@ public:
float GetStringWidth(char* str, unsigned int flag);
+ /**
+ * Get the bounding box for a string.
+ *
+ * @param str The string
+ * @param llx Lower left near x coord
+ * @param lly Lower left near y coord
+ * @param llz Lower left near z coord
+ * @param urx Upper right far x coord
+ * @param ury Upper right far y coord
+ * @param urz Upper right far z coord
+ */
void GetBoundingBox(char* str, float *llx, float *lly, float *llz, float *urx, float *ury, float *urz, unsigned int flag);
/**
diff --git a/source/blender/ftfont/intern/Makefile b/source/blender/ftfont/intern/Makefile
index d3a1977994b..064ec5dc597 100644
--- a/source/blender/ftfont/intern/Makefile
+++ b/source/blender/ftfont/intern/Makefile
@@ -36,16 +36,13 @@ DIR = $(OCGDIR)/blender/ftfont
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
#CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
CPPFLAGS += -I../../makesdna
CPPFLAGS += -I../../blenkernel
CPPFLAGS += -I../../blenlib
+CPPFLAGS += -I../../include
CPPFLAGS += -I$(NAN_FTGL)/include
CPPFLAGS += -I$(NAN_FTGL)/include/FTGL
CPPFLAGS += -I$(NAN_GETTEXT)/include
diff --git a/source/blender/imbuf/IMB_imbuf.h b/source/blender/imbuf/IMB_imbuf.h
index d6ca21830aa..dbbddd2a070 100644
--- a/source/blender/imbuf/IMB_imbuf.h
+++ b/source/blender/imbuf/IMB_imbuf.h
@@ -158,7 +158,7 @@ struct ImBuf *IMB_testiffname(char *naam,int flags);
*
* @attention Defined in readimage.c
*/
-struct ImBuf *IMB_loadiffname(char *naam, int flags);
+struct ImBuf *IMB_loadiffname(const char *naam, int flags);
/**
*
@@ -258,7 +258,7 @@ int IMB_anim_get_duration(struct anim *anim);
*
* @attention Defined in anim.c
*/
-struct anim * IMB_open_anim(char * name, int ib_flags);
+struct anim * IMB_open_anim(const char * name, int ib_flags);
void IMB_close_anim(struct anim * anim);
/**
@@ -280,6 +280,13 @@ struct ImBuf * IMB_anim_absolute(struct anim * anim, int position);
/**
*
* @attention Defined in anim.c
+ * fetches a define previewframe, usually half way into the movie
+ */
+struct ImBuf * IMB_anim_previewframe(struct anim * anim);
+
+/**
+ *
+ * @attention Defined in anim.c
*/
void IMB_free_anim_ibuf(struct anim * anim);
@@ -395,7 +402,13 @@ void IMB_float_from_rect(struct ImBuf *ibuf);
* @attention Defined in imageprocess.c
*/
void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf);
-
+/**
+ *
+ * @attention defined in imageprocess.c
+ */
+void bicubic_interpolation(struct ImBuf *in, struct ImBuf *out, float x, float y, int xout, int yout);
+void neareast_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
+void bilinear_interpolation(struct ImBuf *in, struct ImBuf *out, float u, float v, int xout, int yout);
/**
* Change the ordering of the color bytes pointed to by rect from
* rgba to abgr. size * 4 color bytes are reordered.
@@ -511,6 +524,7 @@ extern float rgb_to_bw[4][4];
*
* @attention Defined in rotate.c
*/
+void IMB_flipx(struct ImBuf *ibuf);
void IMB_flipy(struct ImBuf * ibuf);
/**
@@ -531,6 +545,13 @@ void IMB_freezbuffloatImBuf(struct ImBuf * ibuf);
* @attention Defined in rectop.c
*/
void IMB_rectfill(struct ImBuf *drect, float col[4]);
+void IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int y1, int x2, int y2);
+
+/* this should not be here, really, we needed it for operating on render data, IMB_rectfill_area calls it */
+void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height, float *col, int x1, int y1, int x2, int y2);
+
+/* defined in imginfo.c */
+int IMB_imginfo_change_field(struct ImBuf *img, const char *key, const char *field);
/* exported for image tools in blender, to quickly allocate 32 bits rect */
short imb_addrectImBuf(struct ImBuf * ibuf);
diff --git a/source/blender/imbuf/IMB_imbuf_types.h b/source/blender/imbuf/IMB_imbuf_types.h
index f5487bb9ac0..91ffa188fcc 100644
--- a/source/blender/imbuf/IMB_imbuf_types.h
+++ b/source/blender/imbuf/IMB_imbuf_types.h
@@ -56,6 +56,8 @@
struct _AviMovie;
struct Mdec;
+struct ImgInfo;
+
#define IB_MIPMAP_LEVELS 10
/**
@@ -103,6 +105,7 @@ typedef struct ImBuf {
float dither; /**< random dither value, for conversion from float -> byte rect */
struct MEM_CacheLimiterHandle_s * c_handle; /**< handle for cache limiter */
+ struct ImgInfo * img_info;
int refcounter; /**< Refcounter for multiple users */
int index; /**< reference index for ImBuf lists */
@@ -148,6 +151,7 @@ typedef enum {
#define IB_rectfloat (1 << 15)
#define IB_zbuffloat (1 << 16)
#define IB_multilayer (1 << 17)
+#define IB_imginfo (1 << 18)
/*
* The bit flag is stored in the ImBuf.ftype variable.
@@ -174,6 +178,10 @@ typedef enum {
#define CINEON (1 << 21)
#define DPX (1 << 20)
+#ifdef WITH_DDS
+#define DDS (1 << 19)
+#endif
+
#define RAWTGA (TGA | 1)
#define JPG_STD (JPG | (0 << 8))
@@ -216,6 +224,10 @@ typedef enum {
#define IS_tiff(x) (x->ftype & TIF)
#define IS_radhdr(x) (x->ftype & RADHDR)
+#ifdef WITH_DDS
+#define IS_dds(x) (x->ftype & DDS)
+#endif
+
#define IMAGIC 0732
#define IS_iris(x) (x->ftype == IMAGIC)
diff --git a/source/blender/imbuf/IMB_thumbs.h b/source/blender/imbuf/IMB_thumbs.h
new file mode 100644
index 00000000000..4f4b77ff000
--- /dev/null
+++ b/source/blender/imbuf/IMB_thumbs.h
@@ -0,0 +1,74 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Andrea Weikert.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef _IMB_THUMBS_H
+#define _IMB_THUMBS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ImBuf;
+
+/** Thumbnail creation and retrieval according to the 'Thumbnail Management Standard'
+ * supported by Gimp, Gnome (Nautilus), KDE etc.
+ * Reference: http://jens.triq.net/thumbnail-spec/index.html
+ */
+
+
+typedef enum ThumbSize {
+ THB_NORMAL,
+ THB_LARGE,
+ THB_FAIL
+} ThumbSize;
+
+typedef enum ThumbSource {
+ THB_SOURCE_IMAGE,
+ THB_SOURCE_MOVIE
+} ThumbSource;
+
+// IB_imginfo
+
+/* create thumbnail for file and returns new imbuf for thumbnail */
+ImBuf* IMB_thumb_create(const char* dir, const char* file, ThumbSize size, ThumbSource source);
+
+/* read thumbnail for file and returns new imbuf for thumbnail */
+ImBuf* IMB_thumb_read(const char* dir, const char* file, ThumbSize size);
+
+/* delete all thumbs for the file */
+void IMB_thumb_delete(const char* dir, const char* file, ThumbSize size);
+
+/* return the state of the thumb, needed to determine how to manage the thumb */
+ImBuf* IMB_thumb_manage(const char* dir, const char* file, ThumbSize size, ThumbSource source);
+
+
+
+
+#endif /* _IMB_THUMBS_H */
+
diff --git a/source/blender/imbuf/SConscript b/source/blender/imbuf/SConscript
index 7d3503dfe2d..f9e46b20d9a 100644
--- a/source/blender/imbuf/SConscript
+++ b/source/blender/imbuf/SConscript
@@ -20,6 +20,9 @@ if env['WITH_BF_VERSE']:
if env['WITH_BF_OPENEXR'] == 1:
defs.append('WITH_OPENEXR')
+if env['WITH_BF_DDS'] == 1:
+ defs.append('WITH_DDS')
+
if env['WITH_BF_FFMPEG'] == 1:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
diff --git a/source/blender/imbuf/intern/IMB_anim.h b/source/blender/imbuf/intern/IMB_anim.h
index 602b13df4ca..f3514a92ae4 100644
--- a/source/blender/imbuf/intern/IMB_anim.h
+++ b/source/blender/imbuf/intern/IMB_anim.h
@@ -81,6 +81,7 @@
#ifdef WITH_FFMPEG
#include <ffmpeg/avformat.h>
#include <ffmpeg/avcodec.h>
+#include <ffmpeg/swscale.h>
#endif
#include "IMB_imbuf_types.h"
@@ -181,7 +182,8 @@ struct anim {
AVCodecContext *pCodecCtx;
AVCodec *pCodec;
AVFrame *pFrameRGB;
- AVFrame *pFrame;
+ AVFrame *pFrame;
+ struct SwsContext *img_convert_ctx;
int videoStream;
#endif
diff --git a/source/blender/imbuf/intern/IMB_imginfo.h b/source/blender/imbuf/intern/IMB_imginfo.h
new file mode 100644
index 00000000000..e82cc5f32af
--- /dev/null
+++ b/source/blender/imbuf/intern/IMB_imginfo.h
@@ -0,0 +1,85 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Austin Benesh. Ton Roosendaal.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef _IMB_IMGINFO_H
+#define _IMB_IMGINFO_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ImBuf;
+
+typedef struct ImgInfo {
+ struct ImgInfo *next, *prev;
+ char* key;
+ char* value;
+ int len;
+} ImgInfo;
+
+/** The imginfo is a list of key/value pairs (both char*) that can me
+ saved in the header of several image formats.
+ Apart from some common keys like
+ 'Software' and 'Description' (png standard) we'll use keys within the
+ Blender namespace, so should be called 'Blender::StampInfo' or 'Blender::FrameNum'
+ etc...
+*/
+
+
+/* free blender ImgInfo struct */
+void IMB_imginfo_free(struct ImBuf* img);
+
+/** read the field from the image info into the field
+ * @param img - the ImBuf that contains the image data
+ * @param key - the key of the field
+ * @param value - the data in the field, first one found with key is returned,
+ memory has to be allocated by user.
+ * @param len - length of value buffer allocated by user.
+ * @return - 1 (true) if ImageInfo present and value for the key found, 0 (false) otherwise
+ */
+int IMB_imginfo_get_field(struct ImBuf* img, const char* key, char* value, int len);
+
+/** set user data in the ImgInfo struct, which has to be allocated with IMB_imginfo_create
+ * before calling this function.
+ * @param img - the ImBuf that contains the image data
+ * @param key - the key of the field
+ * @param value - the data to be written to the field. zero terminated string
+ * @return - 1 (true) if ImageInfo present, 0 (false) otherwise
+ */
+int IMB_imginfo_add_field(struct ImBuf* img, const char* key, const char* field);
+
+/** delete the key/field par in the ImgInfo struct.
+ * @param img - the ImBuf that contains the image data
+ * @param key - the key of the field
+ * @return - 1 (true) if delete the key/field, 0 (false) otherwise
+ */
+int IMB_imginfo_del_field(struct ImBuf *img, const char *key);
+
+#endif /* _IMB_IMGINFO_H */
+
diff --git a/source/blender/imbuf/intern/IMB_jpeg.h b/source/blender/imbuf/intern/IMB_jpeg.h
index 4a86a72ca77..f78810d27ee 100644
--- a/source/blender/imbuf/intern/IMB_jpeg.h
+++ b/source/blender/imbuf/intern/IMB_jpeg.h
@@ -45,7 +45,7 @@ struct jpeg_compress_struct;
int imb_is_a_jpeg(unsigned char *mem);
int imb_savejpeg(struct ImBuf * ibuf, char * name, int flags);
-struct ImBuf * imb_ibJpegImageFromFilename (char * filename, int flags);
+struct ImBuf * imb_ibJpegImageFromFilename (const char * filename, int flags);
struct ImBuf * imb_ibJpegImageFromMemory (unsigned char * buffer, int size, int flags);
#endif
diff --git a/source/blender/imbuf/intern/Makefile b/source/blender/imbuf/intern/Makefile
index f51844aad96..09eb487b3a6 100644
--- a/source/blender/imbuf/intern/Makefile
+++ b/source/blender/imbuf/intern/Makefile
@@ -46,9 +46,9 @@ ifeq ($(WITH_OPENEXR), true)
CFLAGS += -DWITH_OPENEXR
endif
-
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
+ifeq ($(WITH_DDS), true)
+ DIRS += dds
+ CPPFLAGS += -DWITH_DDS
endif
CFLAGS += $(LEVEL_1_C_WARNINGS)
@@ -80,4 +80,3 @@ ifeq ($(WITH_FFMPEG), true)
CPPFLAGS += -DWITH_FFMPEG
CPPFLAGS += $(NAN_FFMPEGCFLAGS)
endif
-
diff --git a/source/blender/imbuf/intern/allocimbuf.c b/source/blender/imbuf/intern/allocimbuf.c
index 003d377389b..a5d404740cf 100644
--- a/source/blender/imbuf/intern/allocimbuf.c
+++ b/source/blender/imbuf/intern/allocimbuf.c
@@ -43,6 +43,7 @@
#include "IMB_divers.h"
#include "IMB_allocimbuf.h"
+#include "IMB_imginfo.h"
#include "MEM_CacheLimiterC-Api.h"
static unsigned int dfltcmap[16] = {
@@ -163,6 +164,7 @@ void IMB_freeImBuf(struct ImBuf * ibuf)
IMB_freecmapImBuf(ibuf);
freeencodedbufferImBuf(ibuf);
IMB_cache_limiter_unmanage(ibuf);
+ IMB_imginfo_free(ibuf);
MEM_freeN(ibuf);
}
}
@@ -476,6 +478,9 @@ struct ImBuf *IMB_dupImBuf(struct ImBuf *ibuf1)
tbuf.mall = ibuf2->mall;
tbuf.c_handle = 0;
+ // for now don't duplicate image info
+ tbuf.img_info = 0;
+
*ibuf2 = tbuf;
if (ibuf1->cmap){
diff --git a/source/blender/imbuf/intern/anim.c b/source/blender/imbuf/intern/anim.c
index a1ef735ffdb..e99c35e45ce 100644
--- a/source/blender/imbuf/intern/anim.c
+++ b/source/blender/imbuf/intern/anim.c
@@ -89,6 +89,7 @@
#include <ffmpeg/avformat.h>
#include <ffmpeg/avcodec.h>
#include <ffmpeg/rational.h>
+#include <ffmpeg/swscale.h>
#if LIBAVFORMAT_VERSION_INT < (49 << 16)
#define FFMPEG_OLD_FRAME_RATE 1
@@ -338,12 +339,12 @@ void IMB_close_anim(struct anim * anim) {
}
-struct anim * IMB_open_anim(char * name, int ib_flags) {
+struct anim * IMB_open_anim( const char * name, int ib_flags) {
struct anim * anim;
anim = (struct anim*)MEM_callocN(sizeof(struct anim), "anim struct");
if (anim != NULL) {
- strcpy(anim->name, name);
+ strcpy(anim->name, name); /* fixme: possible buffer overflow here? */
anim->ib_flags = ib_flags;
}
return(anim);
@@ -609,7 +610,17 @@ static int startffmpeg(struct anim * anim) {
} else {
anim->preseek = 0;
}
-
+
+ anim->img_convert_ctx = sws_getContext(
+ anim->pCodecCtx->width,
+ anim->pCodecCtx->height,
+ anim->pCodecCtx->pix_fmt,
+ anim->pCodecCtx->width,
+ anim->pCodecCtx->height,
+ PIX_FMT_RGBA,
+ SWS_FAST_BILINEAR | SWS_PRINT_INFO,
+ NULL, NULL, NULL);
+
return (0);
}
@@ -703,34 +714,21 @@ static ImBuf * ffmpeg_fetchibuf(struct anim * anim, int position) {
}
if(frameFinished && pos_found == 1) {
- unsigned char * p =(unsigned char*) ibuf->rect;
- unsigned char * e = p + anim->x * anim->y * 4;
-
- img_convert((AVPicture *)anim->pFrameRGB,
- PIX_FMT_RGBA32,
- (AVPicture*)anim->pFrame,
- anim->pCodecCtx->pix_fmt,
- anim->pCodecCtx->width,
- anim->pCodecCtx->height);
- IMB_flipy(ibuf);
- if (G.order == L_ENDIAN) {
- /* BGRA -> RGBA */
- while (p != e) {
- unsigned char a = p[0];
- p[0] = p[2];
- p[2] = a;
- p += 4;
- }
- } else {
- /* ARGB -> RGBA */
- while (p != e) {
- unsigned long a =
- *(unsigned long*) p;
- a = (a << 8) | p[0];
- *(unsigned long*) p = a;
- p += 4;
- }
- }
+ int * dstStride = anim->pFrameRGB->linesize;
+ uint8_t** dst = anim->pFrameRGB->data;
+ int dstStride2[4]= { -dstStride[0], 0, 0, 0 };
+ uint8_t* dst2[4]= {
+ dst[0] + (anim->y - 1)*dstStride[0],
+ 0, 0, 0 };
+
+ sws_scale(anim->img_convert_ctx,
+ anim->pFrame->data,
+ anim->pFrame->linesize,
+ 0,
+ anim->pCodecCtx->height,
+ dst2,
+ dstStride2);
+
av_free_packet(&packet);
break;
}
@@ -750,6 +748,7 @@ static void free_anim_ffmpeg(struct anim * anim) {
av_close_input_file(anim->pFormatCtx);
av_free(anim->pFrameRGB);
av_free(anim->pFrame);
+ sws_freeContext(anim->img_convert_ctx);
}
anim->duration = 0;
}
@@ -819,6 +818,18 @@ static struct ImBuf * anim_getnew(struct anim * anim) {
return(ibuf);
}
+struct ImBuf * IMB_anim_previewframe(struct anim * anim) {
+ struct ImBuf * ibuf = 0;
+ int position = 0;
+
+ ibuf = IMB_anim_absolute(anim, 0);
+ if (ibuf) {
+ IMB_freeImBuf(ibuf);
+ position = anim->duration / 2;
+ ibuf = IMB_anim_absolute(anim, position);
+ }
+ return ibuf;
+}
struct ImBuf * IMB_anim_absolute(struct anim * anim, int position) {
struct ImBuf * ibuf = 0;
diff --git a/source/blender/imbuf/intern/cineon/Makefile b/source/blender/imbuf/intern/cineon/Makefile
index 596a6647093..e61c8dd59ed 100644
--- a/source/blender/imbuf/intern/cineon/Makefile
+++ b/source/blender/imbuf/intern/cineon/Makefile
@@ -38,10 +38,6 @@ SOURCEDIR = source/blender/imbuf/intern/cineon
include nan_compile.mk
include nan_definitions.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I$(NAN_JPEG)/include
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.cpp b/source/blender/imbuf/intern/dds/BlockDXT.cpp
new file mode 100644
index 00000000000..5290a677678
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/BlockDXT.cpp
@@ -0,0 +1,523 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/*
+ * This file is based on a similar file from the NVIDIA texture tools
+ * (http://nvidia-texture-tools.googlecode.com/)
+ *
+ * Original license from NVIDIA follows.
+ */
+
+// Copyright NVIDIA Corporation 2007 -- Ignacio Castano <icastano@nvidia.com>
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// 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 AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+#include <Common.h>
+#include <Stream.h>
+#include <ColorBlock.h>
+#include <BlockDXT.h>
+
+/*----------------------------------------------------------------------------
+ BlockDXT1
+----------------------------------------------------------------------------*/
+
+unsigned int BlockDXT1::evaluatePalette(Color32 color_array[4]) const
+{
+ // Does bit expansion before interpolation.
+ color_array[0].b = (col0.b << 3) | (col0.b >> 2);
+ color_array[0].g = (col0.g << 2) | (col0.g >> 4);
+ color_array[0].r = (col0.r << 3) | (col0.r >> 2);
+ color_array[0].a = 0xFF;
+
+ // @@ Same as above, but faster?
+// Color32 c;
+// c.u = ((col0.u << 3) & 0xf8) | ((col0.u << 5) & 0xfc00) | ((col0.u << 8) & 0xf80000);
+// c.u |= (c.u >> 5) & 0x070007;
+// c.u |= (c.u >> 6) & 0x000300;
+// color_array[0].u = c.u;
+
+ color_array[1].r = (col1.r << 3) | (col1.r >> 2);
+ color_array[1].g = (col1.g << 2) | (col1.g >> 4);
+ color_array[1].b = (col1.b << 3) | (col1.b >> 2);
+ color_array[1].a = 0xFF;
+
+ // @@ Same as above, but faster?
+// c.u = ((col1.u << 3) & 0xf8) | ((col1.u << 5) & 0xfc00) | ((col1.u << 8) & 0xf80000);
+// c.u |= (c.u >> 5) & 0x070007;
+// c.u |= (c.u >> 6) & 0x000300;
+// color_array[1].u = c.u;
+
+ if( col0.u > col1.u ) {
+ // Four-color block: derive the other two colors.
+ color_array[2].r = (2 * color_array[0].r + color_array[1].r) / 3;
+ color_array[2].g = (2 * color_array[0].g + color_array[1].g) / 3;
+ color_array[2].b = (2 * color_array[0].b + color_array[1].b) / 3;
+ color_array[2].a = 0xFF;
+
+ color_array[3].r = (2 * color_array[1].r + color_array[0].r) / 3;
+ color_array[3].g = (2 * color_array[1].g + color_array[0].g) / 3;
+ color_array[3].b = (2 * color_array[1].b + color_array[0].b) / 3;
+ color_array[3].a = 0xFF;
+
+ return 4;
+ }
+ else {
+ // Three-color block: derive the other color.
+ color_array[2].r = (color_array[0].r + color_array[1].r) / 2;
+ color_array[2].g = (color_array[0].g + color_array[1].g) / 2;
+ color_array[2].b = (color_array[0].b + color_array[1].b) / 2;
+ color_array[2].a = 0xFF;
+
+ // Set all components to 0 to match DXT specs.
+ color_array[3].r = 0x00; // color_array[2].r;
+ color_array[3].g = 0x00; // color_array[2].g;
+ color_array[3].b = 0x00; // color_array[2].b;
+ color_array[3].a = 0x00;
+
+ return 3;
+ }
+}
+
+// Evaluate palette assuming 3 color block.
+void BlockDXT1::evaluatePalette3(Color32 color_array[4]) const
+{
+ color_array[0].b = (col0.b << 3) | (col0.b >> 2);
+ color_array[0].g = (col0.g << 2) | (col0.g >> 4);
+ color_array[0].r = (col0.r << 3) | (col0.r >> 2);
+ color_array[0].a = 0xFF;
+
+ color_array[1].r = (col1.r << 3) | (col1.r >> 2);
+ color_array[1].g = (col1.g << 2) | (col1.g >> 4);
+ color_array[1].b = (col1.b << 3) | (col1.b >> 2);
+ color_array[1].a = 0xFF;
+
+ // Three-color block: derive the other color.
+ color_array[2].r = (color_array[0].r + color_array[1].r) / 2;
+ color_array[2].g = (color_array[0].g + color_array[1].g) / 2;
+ color_array[2].b = (color_array[0].b + color_array[1].b) / 2;
+ color_array[2].a = 0xFF;
+
+ // Set all components to 0 to match DXT specs.
+ color_array[3].r = 0x00; // color_array[2].r;
+ color_array[3].g = 0x00; // color_array[2].g;
+ color_array[3].b = 0x00; // color_array[2].b;
+ color_array[3].a = 0x00;
+}
+
+// Evaluate palette assuming 4 color block.
+void BlockDXT1::evaluatePalette4(Color32 color_array[4]) const
+{
+ color_array[0].b = (col0.b << 3) | (col0.b >> 2);
+ color_array[0].g = (col0.g << 2) | (col0.g >> 4);
+ color_array[0].r = (col0.r << 3) | (col0.r >> 2);
+ color_array[0].a = 0xFF;
+
+ color_array[1].r = (col1.r << 3) | (col1.r >> 2);
+ color_array[1].g = (col1.g << 2) | (col1.g >> 4);
+ color_array[1].b = (col1.b << 3) | (col1.b >> 2);
+ color_array[1].a = 0xFF;
+
+ // Four-color block: derive the other two colors.
+ color_array[2].r = (2 * color_array[0].r + color_array[1].r) / 3;
+ color_array[2].g = (2 * color_array[0].g + color_array[1].g) / 3;
+ color_array[2].b = (2 * color_array[0].b + color_array[1].b) / 3;
+ color_array[2].a = 0xFF;
+
+ color_array[3].r = (2 * color_array[1].r + color_array[0].r) / 3;
+ color_array[3].g = (2 * color_array[1].g + color_array[0].g) / 3;
+ color_array[3].b = (2 * color_array[1].b + color_array[0].b) / 3;
+ color_array[3].a = 0xFF;
+}
+
+void BlockDXT1::decodeBlock(ColorBlock * block) const
+{
+ // Decode color block.
+ Color32 color_array[4];
+ evaluatePalette(color_array);
+
+ // Write color block.
+ for( unsigned int j = 0; j < 4; j++ ) {
+ for( unsigned int i = 0; i < 4; i++ ) {
+ unsigned int idx = (row[j] >> (2 * i)) & 3;
+ block->color(i, j) = color_array[idx];
+ }
+ }
+}
+
+void BlockDXT1::setIndices(int * idx)
+{
+ indices = 0;
+ for(unsigned int i = 0; i < 16; i++) {
+ indices |= (idx[i] & 3) << (2 * i);
+ }
+}
+
+
+/// Flip DXT1 block vertically.
+inline void BlockDXT1::flip4()
+{
+ unsigned char tmp;
+ swap(row[0], row[3], tmp);
+ swap(row[1], row[2], tmp);
+}
+
+/// Flip half DXT1 block vertically.
+inline void BlockDXT1::flip2()
+{
+ unsigned char tmp;
+ swap(row[0], row[1], tmp);
+}
+
+
+/*----------------------------------------------------------------------------
+ BlockDXT3
+----------------------------------------------------------------------------*/
+
+void BlockDXT3::decodeBlock(ColorBlock * block) const
+{
+ // Decode color.
+ color.decodeBlock(block);
+
+ // Decode alpha.
+ alpha.decodeBlock(block);
+}
+
+void AlphaBlockDXT3::decodeBlock(ColorBlock * block) const
+{
+ block->color(0x0).a = (alpha0 << 4) | alpha0;
+ block->color(0x1).a = (alpha1 << 4) | alpha1;
+ block->color(0x2).a = (alpha2 << 4) | alpha2;
+ block->color(0x3).a = (alpha3 << 4) | alpha3;
+ block->color(0x4).a = (alpha4 << 4) | alpha4;
+ block->color(0x5).a = (alpha5 << 4) | alpha5;
+ block->color(0x6).a = (alpha6 << 4) | alpha6;
+ block->color(0x7).a = (alpha7 << 4) | alpha7;
+ block->color(0x8).a = (alpha8 << 4) | alpha8;
+ block->color(0x9).a = (alpha9 << 4) | alpha9;
+ block->color(0xA).a = (alphaA << 4) | alphaA;
+ block->color(0xB).a = (alphaB << 4) | alphaB;
+ block->color(0xC).a = (alphaC << 4) | alphaC;
+ block->color(0xD).a = (alphaD << 4) | alphaD;
+ block->color(0xE).a = (alphaE << 4) | alphaE;
+ block->color(0xF).a = (alphaF << 4) | alphaF;
+}
+
+/// Flip DXT3 alpha block vertically.
+void AlphaBlockDXT3::flip4()
+{
+ unsigned short tmp;
+ swap(row[0], row[3], tmp);
+ swap(row[1], row[2], tmp);
+}
+
+/// Flip half DXT3 alpha block vertically.
+void AlphaBlockDXT3::flip2()
+{
+ unsigned short tmp;
+ swap(row[0], row[1], tmp);
+}
+
+/// Flip DXT3 block vertically.
+void BlockDXT3::flip4()
+{
+ alpha.flip4();
+ color.flip4();
+}
+
+/// Flip half DXT3 block vertically.
+void BlockDXT3::flip2()
+{
+ alpha.flip2();
+ color.flip2();
+}
+
+
+/*----------------------------------------------------------------------------
+ BlockDXT5
+----------------------------------------------------------------------------*/
+
+void AlphaBlockDXT5::evaluatePalette(unsigned char alpha[8]) const
+{
+ if (alpha0 > alpha1) {
+ evaluatePalette8(alpha);
+ }
+ else {
+ evaluatePalette6(alpha);
+ }
+}
+
+void AlphaBlockDXT5::evaluatePalette8(unsigned char alpha[8]) const
+{
+ // 8-alpha block: derive the other six alphas.
+ // Bit code 000 = alpha0, 001 = alpha1, others are interpolated.
+ alpha[0] = alpha0;
+ alpha[1] = alpha1;
+ alpha[2] = (6 * alpha0 + 1 * alpha1) / 7; // bit code 010
+ alpha[3] = (5 * alpha0 + 2 * alpha1) / 7; // bit code 011
+ alpha[4] = (4 * alpha0 + 3 * alpha1) / 7; // bit code 100
+ alpha[5] = (3 * alpha0 + 4 * alpha1) / 7; // bit code 101
+ alpha[6] = (2 * alpha0 + 5 * alpha1) / 7; // bit code 110
+ alpha[7] = (1 * alpha0 + 6 * alpha1) / 7; // bit code 111
+}
+
+void AlphaBlockDXT5::evaluatePalette6(unsigned char alpha[8]) const
+{
+ // 6-alpha block.
+ // Bit code 000 = alpha0, 001 = alpha1, others are interpolated.
+ alpha[0] = alpha0;
+ alpha[1] = alpha1;
+ alpha[2] = (4 * alpha0 + 1 * alpha1) / 5; // Bit code 010
+ alpha[3] = (3 * alpha0 + 2 * alpha1) / 5; // Bit code 011
+ alpha[4] = (2 * alpha0 + 3 * alpha1) / 5; // Bit code 100
+ alpha[5] = (1 * alpha0 + 4 * alpha1) / 5; // Bit code 101
+ alpha[6] = 0x00; // Bit code 110
+ alpha[7] = 0xFF; // Bit code 111
+}
+
+void AlphaBlockDXT5::indices(unsigned char index_array[16]) const
+{
+ index_array[0x0] = bits0;
+ index_array[0x1] = bits1;
+ index_array[0x2] = bits2;
+ index_array[0x3] = bits3;
+ index_array[0x4] = bits4;
+ index_array[0x5] = bits5;
+ index_array[0x6] = bits6;
+ index_array[0x7] = bits7;
+ index_array[0x8] = bits8;
+ index_array[0x9] = bits9;
+ index_array[0xA] = bitsA;
+ index_array[0xB] = bitsB;
+ index_array[0xC] = bitsC;
+ index_array[0xD] = bitsD;
+ index_array[0xE] = bitsE;
+ index_array[0xF] = bitsF;
+}
+
+unsigned int AlphaBlockDXT5::index(unsigned int index) const
+{
+ int offset = (3 * index + 16);
+ return (this->u >> offset) & 0x7;
+}
+
+void AlphaBlockDXT5::setIndex(unsigned int index, unsigned int value)
+{
+ int offset = (3 * index + 16);
+ unsigned long long mask = ((unsigned long long)(0x7)) << offset;
+ this->u = (this->u & ~mask) | (((unsigned long long)(value)) << offset);
+}
+
+void AlphaBlockDXT5::decodeBlock(ColorBlock * block) const
+{
+ unsigned char alpha_array[8];
+ evaluatePalette(alpha_array);
+
+ unsigned char index_array[16];
+ indices(index_array);
+
+ for(unsigned int i = 0; i < 16; i++) {
+ block->color(i).a = alpha_array[index_array[i]];
+ }
+}
+
+void AlphaBlockDXT5::flip4()
+{
+ unsigned long long * b = (unsigned long long *)this;
+
+ // @@ The masks might have to be byte swapped.
+ unsigned long long tmp = (*b & (unsigned long long)(0x000000000000FFFFLL));
+ tmp |= (*b & (unsigned long long)(0x000000000FFF0000LL)) << 36;
+ tmp |= (*b & (unsigned long long)(0x000000FFF0000000LL)) << 12;
+ tmp |= (*b & (unsigned long long)(0x000FFF0000000000LL)) >> 12;
+ tmp |= (*b & (unsigned long long)(0xFFF0000000000000LL)) >> 36;
+
+ *b = tmp;
+}
+
+void AlphaBlockDXT5::flip2()
+{
+ unsigned int * b = (unsigned int *)this;
+
+ // @@ The masks might have to be byte swapped.
+ unsigned int tmp = (*b & 0xFF000000);
+ tmp |= (*b & 0x00000FFF) << 12;
+ tmp |= (*b & 0x00FFF000) >> 12;
+
+ *b = tmp;
+}
+
+void BlockDXT5::decodeBlock(ColorBlock * block) const
+{
+ // Decode color.
+ color.decodeBlock(block);
+
+ // Decode alpha.
+ alpha.decodeBlock(block);
+}
+
+/// Flip DXT5 block vertically.
+void BlockDXT5::flip4()
+{
+ alpha.flip4();
+ color.flip4();
+}
+
+/// Flip half DXT5 block vertically.
+void BlockDXT5::flip2()
+{
+ alpha.flip2();
+ color.flip2();
+}
+
+
+/// Decode ATI1 block.
+void BlockATI1::decodeBlock(ColorBlock * block) const
+{
+ unsigned char alpha_array[8];
+ alpha.evaluatePalette(alpha_array);
+
+ unsigned char index_array[16];
+ alpha.indices(index_array);
+
+ for(unsigned int i = 0; i < 16; i++) {
+ Color32 & c = block->color(i);
+ c.b = c.g = c.r = alpha_array[index_array[i]];
+ c.a = 255;
+ }
+}
+
+/// Flip ATI1 block vertically.
+void BlockATI1::flip4()
+{
+ alpha.flip4();
+}
+
+/// Flip half ATI1 block vertically.
+void BlockATI1::flip2()
+{
+ alpha.flip2();
+}
+
+
+/// Decode ATI2 block.
+void BlockATI2::decodeBlock(ColorBlock * block) const
+{
+ unsigned char alpha_array[8];
+ unsigned char index_array[16];
+
+ x.evaluatePalette(alpha_array);
+ x.indices(index_array);
+
+ for(unsigned int i = 0; i < 16; i++) {
+ Color32 & c = block->color(i);
+ c.r = alpha_array[index_array[i]];
+ }
+
+ y.evaluatePalette(alpha_array);
+ y.indices(index_array);
+
+ for(unsigned int i = 0; i < 16; i++) {
+ Color32 & c = block->color(i);
+ c.g = alpha_array[index_array[i]];
+ c.b = 0;
+ c.a = 255;
+ }
+}
+
+/// Flip ATI2 block vertically.
+void BlockATI2::flip4()
+{
+ x.flip4();
+ y.flip4();
+}
+
+/// Flip half ATI2 block vertically.
+void BlockATI2::flip2()
+{
+ x.flip2();
+ y.flip2();
+}
+
+void mem_read(Stream & mem, BlockDXT1 & block)
+{
+ mem_read(mem, block.col0.u);
+ mem_read(mem, block.col1.u);
+ mem_read(mem, block.indices);
+}
+
+void mem_read(Stream & mem, AlphaBlockDXT3 & block)
+{
+ for (unsigned int i = 0; i < 4; i++) mem_read(mem, block.row[i]);
+}
+
+void mem_read(Stream & mem, BlockDXT3 & block)
+{
+ mem_read(mem, block.alpha);
+ mem_read(mem, block.color);
+}
+
+void mem_read(Stream & mem, AlphaBlockDXT5 & block)
+{
+ mem_read(mem, block.u);
+}
+
+void mem_read(Stream & mem, BlockDXT5 & block)
+{
+ mem_read(mem, block.alpha);
+ mem_read(mem, block.color);
+}
+
+void mem_read(Stream & mem, BlockATI1 & block)
+{
+ mem_read(mem, block.alpha);
+}
+
+void mem_read(Stream & mem, BlockATI2 & block)
+{
+ mem_read(mem, block.x);
+ mem_read(mem, block.y);
+}
+
diff --git a/source/blender/imbuf/intern/dds/BlockDXT.h b/source/blender/imbuf/intern/dds/BlockDXT.h
new file mode 100644
index 00000000000..1f710360c3c
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/BlockDXT.h
@@ -0,0 +1,227 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/*
+ * This file is based on a similar file from the NVIDIA texture tools
+ * (http://nvidia-texture-tools.googlecode.com/)
+ *
+ * Original license from NVIDIA follows.
+ */
+
+// Copyright NVIDIA Corporation 2007 -- Ignacio Castano <icastano@nvidia.com>
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// 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 AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+#ifndef _DDS_BLOCKDXT_H
+#define _DDS_BLOCKDXT_H
+
+#include <Color.h>
+#include <ColorBlock.h>
+#include <Stream.h>
+
+/// DXT1 block.
+struct BlockDXT1
+{
+ Color16 col0;
+ Color16 col1;
+ union {
+ unsigned char row[4];
+ unsigned int indices;
+ };
+
+ bool isFourColorMode() const;
+
+ unsigned int evaluatePalette(Color32 color_array[4]) const;
+ unsigned int evaluatePaletteFast(Color32 color_array[4]) const;
+ void evaluatePalette3(Color32 color_array[4]) const;
+ void evaluatePalette4(Color32 color_array[4]) const;
+
+ void decodeBlock(ColorBlock * block) const;
+
+ void setIndices(int * idx);
+
+ void flip4();
+ void flip2();
+};
+
+/// Return true if the block uses four color mode, false otherwise.
+inline bool BlockDXT1::isFourColorMode() const
+{
+ return col0.u >= col1.u; // @@ > or >= ?
+}
+
+
+/// DXT3 alpha block with explicit alpha.
+struct AlphaBlockDXT3
+{
+ union {
+ struct {
+ unsigned int alpha0 : 4;
+ unsigned int alpha1 : 4;
+ unsigned int alpha2 : 4;
+ unsigned int alpha3 : 4;
+ unsigned int alpha4 : 4;
+ unsigned int alpha5 : 4;
+ unsigned int alpha6 : 4;
+ unsigned int alpha7 : 4;
+ unsigned int alpha8 : 4;
+ unsigned int alpha9 : 4;
+ unsigned int alphaA : 4;
+ unsigned int alphaB : 4;
+ unsigned int alphaC : 4;
+ unsigned int alphaD : 4;
+ unsigned int alphaE : 4;
+ unsigned int alphaF : 4;
+ };
+ unsigned short row[4];
+ };
+
+ void decodeBlock(ColorBlock * block) const;
+
+ void flip4();
+ void flip2();
+};
+
+
+/// DXT3 block.
+struct BlockDXT3
+{
+ AlphaBlockDXT3 alpha;
+ BlockDXT1 color;
+
+ void decodeBlock(ColorBlock * block) const;
+
+ void flip4();
+ void flip2();
+};
+
+
+/// DXT5 alpha block.
+struct AlphaBlockDXT5
+{
+ union {
+ struct {
+ unsigned int alpha0 : 8; // 8
+ unsigned int alpha1 : 8; // 16
+ unsigned int bits0 : 3; // 3 - 19
+ unsigned int bits1 : 3; // 6 - 22
+ unsigned int bits2 : 3; // 9 - 25
+ unsigned int bits3 : 3; // 12 - 28
+ unsigned int bits4 : 3; // 15 - 31
+ unsigned int bits5 : 3; // 18 - 34
+ unsigned int bits6 : 3; // 21 - 37
+ unsigned int bits7 : 3; // 24 - 40
+ unsigned int bits8 : 3; // 27 - 43
+ unsigned int bits9 : 3; // 30 - 46
+ unsigned int bitsA : 3; // 33 - 49
+ unsigned int bitsB : 3; // 36 - 52
+ unsigned int bitsC : 3; // 39 - 55
+ unsigned int bitsD : 3; // 42 - 58
+ unsigned int bitsE : 3; // 45 - 61
+ unsigned int bitsF : 3; // 48 - 64
+ };
+ unsigned long long u;
+ };
+
+ void evaluatePalette(unsigned char alpha[8]) const;
+ void evaluatePalette8(unsigned char alpha[8]) const;
+ void evaluatePalette6(unsigned char alpha[8]) const;
+ void indices(unsigned char index_array[16]) const;
+
+ unsigned int index(unsigned int index) const;
+ void setIndex(unsigned int index, unsigned int value);
+
+ void decodeBlock(ColorBlock * block) const;
+
+ void flip4();
+ void flip2();
+};
+
+
+/// DXT5 block.
+struct BlockDXT5
+{
+ AlphaBlockDXT5 alpha;
+ BlockDXT1 color;
+
+ void decodeBlock(ColorBlock * block) const;
+
+ void flip4();
+ void flip2();
+};
+
+/// ATI1 block.
+struct BlockATI1
+{
+ AlphaBlockDXT5 alpha;
+
+ void decodeBlock(ColorBlock * block) const;
+
+ void flip4();
+ void flip2();
+};
+
+/// ATI2 block.
+struct BlockATI2
+{
+ AlphaBlockDXT5 x;
+ AlphaBlockDXT5 y;
+
+ void decodeBlock(ColorBlock * block) const;
+
+ void flip4();
+ void flip2();
+};
+
+void mem_read(Stream & mem, BlockDXT1 & block);
+void mem_read(Stream & mem, AlphaBlockDXT3 & block);
+void mem_read(Stream & mem, BlockDXT3 & block);
+void mem_read(Stream & mem, AlphaBlockDXT5 & block);
+void mem_read(Stream & mem, BlockDXT5 & block);
+void mem_read(Stream & mem, BlockATI1 & block);
+void mem_read(Stream & mem, BlockATI2 & block);
+
+#endif // _DDS_BLOCKDXT_H
diff --git a/source/blender/imbuf/intern/dds/Color.h b/source/blender/imbuf/intern/dds/Color.h
new file mode 100644
index 00000000000..f8055afdfc9
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/Color.h
@@ -0,0 +1,99 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/*
+ * This file is based on a similar file from the NVIDIA texture tools
+ * (http://nvidia-texture-tools.googlecode.com/)
+ *
+ * Original license from NVIDIA follows.
+ */
+
+// This code is in the public domain -- castanyo@yahoo.es
+
+#ifndef _DDS_COLOR_H
+#define _DDS_COLOR_H
+
+/// 32 bit color stored as BGRA.
+class Color32
+{
+public:
+ Color32() { }
+ Color32(const Color32 & c) : u(c.u) { }
+ Color32(unsigned char R, unsigned char G, unsigned char B) { setRGBA(R, G, B, 0xFF); }
+ Color32(unsigned char R, unsigned char G, unsigned char B, unsigned char A) { setRGBA( R, G, B, A); }
+ //Color32(unsigned char c[4]) { setRGBA(c[0], c[1], c[2], c[3]); }
+ //Color32(float R, float G, float B) { setRGBA(uint(R*255), uint(G*255), uint(B*255), 0xFF); }
+ //Color32(float R, float G, float B, float A) { setRGBA(uint(R*255), uint(G*255), uint(B*255), uint(A*255)); }
+ Color32(unsigned int U) : u(U) { }
+
+ void setRGBA(unsigned char R, unsigned char G, unsigned char B, unsigned char A)
+ {
+ r = R;
+ g = G;
+ b = B;
+ a = A;
+ }
+
+ void setBGRA(unsigned char B, unsigned char G, unsigned char R, unsigned char A = 0xFF)
+ {
+ r = R;
+ g = G;
+ b = B;
+ a = A;
+ }
+
+ operator unsigned int () const {
+ return u;
+ }
+
+ union {
+ struct {
+ unsigned char b, g, r, a;
+ };
+ unsigned int u;
+ };
+};
+
+/// 16 bit 565 BGR color.
+class Color16
+{
+public:
+ Color16() { }
+ Color16(const Color16 & c) : u(c.u) { }
+ explicit Color16(unsigned short U) : u(U) { }
+
+ union {
+ struct {
+ unsigned short b : 5;
+ unsigned short g : 6;
+ unsigned short r : 5;
+ };
+ unsigned short u;
+ };
+};
+
+#endif // _DDS_COLOR_H
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.cpp b/source/blender/imbuf/intern/dds/ColorBlock.cpp
new file mode 100644
index 00000000000..63997f93c8c
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/ColorBlock.cpp
@@ -0,0 +1,310 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/*
+ * This file is based on a similar file from the NVIDIA texture tools
+ * (http://nvidia-texture-tools.googlecode.com/)
+ *
+ * Original license from NVIDIA follows.
+ */
+
+// This code is in the public domain -- castanyo@yahoo.es
+
+#include <ColorBlock.h>
+#include <Image.h>
+#include <Common.h>
+
+ // Get approximate luminance.
+ inline static unsigned int colorLuminance(Color32 c)
+ {
+ return c.r + c.g + c.b;
+ }
+
+ // Get the euclidean distance between the given colors.
+ inline static unsigned int colorDistance(Color32 c0, Color32 c1)
+ {
+ return (c0.r - c1.r) * (c0.r - c1.r) + (c0.g - c1.g) * (c0.g - c1.g) + (c0.b - c1.b) * (c0.b - c1.b);
+ }
+
+
+/// Default constructor.
+ColorBlock::ColorBlock()
+{
+}
+
+/// Init the color block with the contents of the given block.
+ColorBlock::ColorBlock(const ColorBlock & block)
+{
+ for(unsigned int i = 0; i < 16; i++) {
+ color(i) = block.color(i);
+ }
+}
+
+
+/// Initialize this color block.
+ColorBlock::ColorBlock(const Image * img, unsigned int x, unsigned int y)
+{
+ init(img, x, y);
+}
+
+void ColorBlock::init(const Image * img, unsigned int x, unsigned int y)
+{
+ const unsigned int bw = min(img->width() - x, 4U);
+ const unsigned int bh = min(img->height() - y, 4U);
+
+ static int remainder[] = {
+ 0, 0, 0, 0,
+ 0, 1, 0, 1,
+ 0, 1, 2, 0,
+ 0, 1, 2, 3,
+ };
+
+ // Blocks that are smaller than 4x4 are handled by repeating the pixels.
+ // @@ Thats only correct when block size is 1, 2 or 4, but not with 3. :(
+
+ for(unsigned int i = 0; i < 4; i++) {
+ //const int by = i % bh;
+ const int by = remainder[(bh - 1) * 4 + i];
+ for(unsigned int e = 0; e < 4; e++) {
+ //const int bx = e % bw;
+ const int bx = remainder[(bw - 1) * 4 + e];
+ color(e, i) = img->pixel(x + bx, y + by);
+ }
+ }
+}
+
+
+void ColorBlock::swizzleDXT5n()
+{
+ for(int i = 0; i < 16; i++)
+ {
+ Color32 c = m_color[i];
+ m_color[i] = Color32(0, c.g, 0, c.r);
+ }
+}
+
+void ColorBlock::splatX()
+{
+ for(int i = 0; i < 16; i++)
+ {
+ unsigned char x = m_color[i].r;
+ m_color[i] = Color32(x, x, x, x);
+ }
+}
+
+void ColorBlock::splatY()
+{
+ for(int i = 0; i < 16; i++)
+ {
+ unsigned char y = m_color[i].g;
+ m_color[i] = Color32(y, y, y, y);
+ }
+}
+
+
+/// Count number of unique colors in this color block.
+unsigned int ColorBlock::countUniqueColors() const
+{
+ unsigned int count = 0;
+
+ // @@ This does not have to be o(n^2)
+ for(int i = 0; i < 16; i++)
+ {
+ bool unique = true;
+ for(int j = 0; j < i; j++) {
+ if( m_color[i] != m_color[j] ) {
+ unique = false;
+ }
+ }
+
+ if( unique ) {
+ count++;
+ }
+ }
+
+ return count;
+}
+
+/// Get average color of the block.
+Color32 ColorBlock::averageColor() const
+{
+ unsigned int r, g, b, a;
+ r = g = b = a = 0;
+
+ for(unsigned int i = 0; i < 16; i++) {
+ r += m_color[i].r;
+ g += m_color[i].g;
+ b += m_color[i].b;
+ a += m_color[i].a;
+ }
+
+ return Color32((unsigned char)(r / 16), (unsigned char)(g / 16), (unsigned char)(b / 16), (unsigned char)(a / 16));
+}
+
+
+/// Get diameter color range.
+void ColorBlock::diameterRange(Color32 * start, Color32 * end) const
+{
+ Color32 c0, c1;
+ unsigned int best_dist = 0;
+
+ for(int i = 0; i < 16; i++) {
+ for (int j = i+1; j < 16; j++) {
+ unsigned int dist = colorDistance(m_color[i], m_color[j]);
+ if( dist > best_dist ) {
+ best_dist = dist;
+ c0 = m_color[i];
+ c1 = m_color[j];
+ }
+ }
+ }
+
+ *start = c0;
+ *end = c1;
+}
+
+/// Get luminance color range.
+void ColorBlock::luminanceRange(Color32 * start, Color32 * end) const
+{
+ Color32 minColor, maxColor;
+ unsigned int minLuminance, maxLuminance;
+
+ maxLuminance = minLuminance = colorLuminance(m_color[0]);
+
+ for(unsigned int i = 1; i < 16; i++)
+ {
+ unsigned int luminance = colorLuminance(m_color[i]);
+
+ if (luminance > maxLuminance) {
+ maxLuminance = luminance;
+ maxColor = m_color[i];
+ }
+ else if (luminance < minLuminance) {
+ minLuminance = luminance;
+ minColor = m_color[i];
+ }
+ }
+
+ *start = minColor;
+ *end = maxColor;
+}
+
+/// Get color range based on the bounding box.
+void ColorBlock::boundsRange(Color32 * start, Color32 * end) const
+{
+ Color32 minColor(255, 255, 255);
+ Color32 maxColor(0, 0, 0);
+
+ for(unsigned int i = 0; i < 16; i++)
+ {
+ if (m_color[i].r < minColor.r) { minColor.r = m_color[i].r; }
+ if (m_color[i].g < minColor.g) { minColor.g = m_color[i].g; }
+ if (m_color[i].b < minColor.b) { minColor.b = m_color[i].b; }
+ if (m_color[i].r > maxColor.r) { maxColor.r = m_color[i].r; }
+ if (m_color[i].g > maxColor.g) { maxColor.g = m_color[i].g; }
+ if (m_color[i].b > maxColor.b) { maxColor.b = m_color[i].b; }
+ }
+
+ // Offset range by 1/16 of the extents
+ Color32 inset;
+ inset.r = (maxColor.r - minColor.r) >> 4;
+ inset.g = (maxColor.g - minColor.g) >> 4;
+ inset.b = (maxColor.b - minColor.b) >> 4;
+
+ minColor.r = (minColor.r + inset.r <= 255) ? minColor.r + inset.r : 255;
+ minColor.g = (minColor.g + inset.g <= 255) ? minColor.g + inset.g : 255;
+ minColor.b = (minColor.b + inset.b <= 255) ? minColor.b + inset.b : 255;
+
+ maxColor.r = (maxColor.r >= inset.r) ? maxColor.r - inset.r : 0;
+ maxColor.g = (maxColor.g >= inset.g) ? maxColor.g - inset.g : 0;
+ maxColor.b = (maxColor.b >= inset.b) ? maxColor.b - inset.b : 0;
+
+ *start = minColor;
+ *end = maxColor;
+}
+
+/// Get color range based on the bounding box.
+void ColorBlock::boundsRangeAlpha(Color32 * start, Color32 * end) const
+{
+ Color32 minColor(255, 255, 255, 255);
+ Color32 maxColor(0, 0, 0, 0);
+
+ for(unsigned int i = 0; i < 16; i++)
+ {
+ if (m_color[i].r < minColor.r) { minColor.r = m_color[i].r; }
+ if (m_color[i].g < minColor.g) { minColor.g = m_color[i].g; }
+ if (m_color[i].b < minColor.b) { minColor.b = m_color[i].b; }
+ if (m_color[i].a < minColor.a) { minColor.a = m_color[i].a; }
+ if (m_color[i].r > maxColor.r) { maxColor.r = m_color[i].r; }
+ if (m_color[i].g > maxColor.g) { maxColor.g = m_color[i].g; }
+ if (m_color[i].b > maxColor.b) { maxColor.b = m_color[i].b; }
+ if (m_color[i].a > maxColor.a) { maxColor.a = m_color[i].a; }
+ }
+
+ // Offset range by 1/16 of the extents
+ Color32 inset;
+ inset.r = (maxColor.r - minColor.r) >> 4;
+ inset.g = (maxColor.g - minColor.g) >> 4;
+ inset.b = (maxColor.b - minColor.b) >> 4;
+ inset.a = (maxColor.a - minColor.a) >> 4;
+
+ minColor.r = (minColor.r + inset.r <= 255) ? minColor.r + inset.r : 255;
+ minColor.g = (minColor.g + inset.g <= 255) ? minColor.g + inset.g : 255;
+ minColor.b = (minColor.b + inset.b <= 255) ? minColor.b + inset.b : 255;
+ minColor.a = (minColor.a + inset.a <= 255) ? minColor.a + inset.a : 255;
+
+ maxColor.r = (maxColor.r >= inset.r) ? maxColor.r - inset.r : 0;
+ maxColor.g = (maxColor.g >= inset.g) ? maxColor.g - inset.g : 0;
+ maxColor.b = (maxColor.b >= inset.b) ? maxColor.b - inset.b : 0;
+ maxColor.a = (maxColor.a >= inset.a) ? maxColor.a - inset.a : 0;
+
+ *start = minColor;
+ *end = maxColor;
+}
+
+/// Sort colors by abosolute value in their 16 bit representation.
+void ColorBlock::sortColorsByAbsoluteValue()
+{
+ // Dummy selection sort.
+ for( unsigned int a = 0; a < 16; a++ ) {
+ unsigned int max = a;
+ Color16 cmax(m_color[a]);
+
+ for( unsigned int b = a+1; b < 16; b++ ) {
+ Color16 cb(m_color[b]);
+
+ if( cb.u > cmax.u ) {
+ max = b;
+ cmax = cb;
+ }
+ }
+ Color32 tmp;
+ swap( m_color[a], m_color[max], tmp );
+ }
+}
+
+
diff --git a/source/blender/imbuf/intern/dds/ColorBlock.h b/source/blender/imbuf/intern/dds/ColorBlock.h
new file mode 100644
index 00000000000..eba372768ad
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/ColorBlock.h
@@ -0,0 +1,115 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/*
+ * This file is based on a similar file from the NVIDIA texture tools
+ * (http://nvidia-texture-tools.googlecode.com/)
+ *
+ * Original license from NVIDIA follows.
+ */
+
+// This code is in the public domain -- castanyo@yahoo.es
+
+#ifndef _DDS_COLORBLOCK_H
+#define _DDS_COLORBLOCK_H
+
+#include <Color.h>
+#include <Image.h>
+
+/// Uncompressed 4x4 color block.
+struct ColorBlock
+{
+ ColorBlock();
+ ColorBlock(const ColorBlock & block);
+ ColorBlock(const Image * img, unsigned int x, unsigned int y);
+
+ void init(const Image * img, unsigned int x, unsigned int y);
+
+ void swizzleDXT5n();
+ void splatX();
+ void splatY();
+
+ unsigned int countUniqueColors() const;
+ Color32 averageColor() const;
+
+ void diameterRange(Color32 * start, Color32 * end) const;
+ void luminanceRange(Color32 * start, Color32 * end) const;
+ void boundsRange(Color32 * start, Color32 * end) const;
+ void boundsRangeAlpha(Color32 * start, Color32 * end) const;
+ void bestFitRange(Color32 * start, Color32 * end) const;
+
+ void sortColorsByAbsoluteValue();
+
+ float volume() const;
+
+ // Accessors
+ const Color32 * colors() const;
+
+ Color32 color(unsigned int i) const;
+ Color32 & color(unsigned int i);
+
+ Color32 color(unsigned int x, unsigned int y) const;
+ Color32 & color(unsigned int x, unsigned int y);
+
+private:
+
+ Color32 m_color[4*4];
+
+};
+
+
+/// Get pointer to block colors.
+inline const Color32 * ColorBlock::colors() const
+{
+ return m_color;
+}
+
+/// Get block color.
+inline Color32 ColorBlock::color(unsigned int i) const
+{
+ return m_color[i];
+}
+
+/// Get block color.
+inline Color32 & ColorBlock::color(unsigned int i)
+{
+ return m_color[i];
+}
+
+/// Get block color.
+inline Color32 ColorBlock::color(unsigned int x, unsigned int y) const
+{
+ return m_color[y * 4 + x];
+}
+
+/// Get block color.
+inline Color32 & ColorBlock::color(unsigned int x, unsigned int y)
+{
+ return m_color[y * 4 + x];
+}
+
+#endif // _DDS_COLORBLOCK_H
diff --git a/intern/action/intern/ACT_Action.cpp b/source/blender/imbuf/intern/dds/Common.h
index a94c3c9f336..5aa8972e437 100644
--- a/intern/action/intern/ACT_Action.cpp
+++ b/source/blender/imbuf/intern/dds/Common.h
@@ -1,5 +1,6 @@
/**
* $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -19,50 +20,25 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributors: Amorilia (amorilia@gamebox.net)
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
-/**
+#ifndef _DDS_COMMON_H
+#define _DDS_COMMON_H
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date April, 25, 2001
- */
-
-#include "ACT_Action.h"
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
+#ifndef min
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+#endif
+#ifndef max
+#define max(a,b) ((a) >= (b) ? (a) : (b))
+#endif
+#ifndef clamp
+#define clamp(x,a,b) min(max((x), (a)), (b))
+#endif
+#ifndef swap
+#define swap(a,b,tmp) tmp=a; a=b; b=tmp;
#endif
-
-ACT_Action::ACT_Action(const STR_String& name, bool applied)
-: m_name(name), m_applied(applied)
-{
-}
-
-
-void ACT_Action::apply()
-{
- if (!m_applied) {
- doApply();
- m_applied = true;
- }
-}
-
-
-void ACT_Action::undo()
-{
- if (m_applied) {
- doUndo();
- m_applied = false;
- }
-}
+#endif
diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
new file mode 100644
index 00000000000..c28f8b5b72d
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
@@ -0,0 +1,924 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/*
+ * This file is based on a similar file from the NVIDIA texture tools
+ * (http://nvidia-texture-tools.googlecode.com/)
+ *
+ * Original license from NVIDIA follows.
+ */
+
+// Copyright NVIDIA Corporation 2007 -- Ignacio Castano <icastano@nvidia.com>
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// 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 AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+#include <Common.h>
+#include <DirectDrawSurface.h>
+#include <BlockDXT.h>
+
+#include <stdio.h> // printf
+#include <math.h> // sqrt
+
+/*** declarations ***/
+
+#if !defined(MAKEFOURCC)
+# define MAKEFOURCC(ch0, ch1, ch2, ch3) \
+ ((unsigned int)((unsigned char)(ch0)) | \
+ ((unsigned int)((unsigned char)(ch1)) << 8) | \
+ ((unsigned int)((unsigned char)(ch2)) << 16) | \
+ ((unsigned int)((unsigned char)(ch3)) << 24 ))
+#endif
+
+static const unsigned int FOURCC_DDS = MAKEFOURCC('D', 'D', 'S', ' ');
+static const unsigned int FOURCC_DXT1 = MAKEFOURCC('D', 'X', 'T', '1');
+static const unsigned int FOURCC_DXT2 = MAKEFOURCC('D', 'X', 'T', '2');
+static const unsigned int FOURCC_DXT3 = MAKEFOURCC('D', 'X', 'T', '3');
+static const unsigned int FOURCC_DXT4 = MAKEFOURCC('D', 'X', 'T', '4');
+static const unsigned int FOURCC_DXT5 = MAKEFOURCC('D', 'X', 'T', '5');
+static const unsigned int FOURCC_RXGB = MAKEFOURCC('R', 'X', 'G', 'B');
+static const unsigned int FOURCC_ATI1 = MAKEFOURCC('A', 'T', 'I', '1');
+static const unsigned int FOURCC_ATI2 = MAKEFOURCC('A', 'T', 'I', '2');
+
+// RGB formats.
+static const unsigned int D3DFMT_R8G8B8 = 20;
+static const unsigned int D3DFMT_A8R8G8B8 = 21;
+static const unsigned int D3DFMT_X8R8G8B8 = 22;
+static const unsigned int D3DFMT_R5G6B5 = 23;
+static const unsigned int D3DFMT_X1R5G5B5 = 24;
+static const unsigned int D3DFMT_A1R5G5B5 = 25;
+static const unsigned int D3DFMT_A4R4G4B4 = 26;
+static const unsigned int D3DFMT_R3G3B2 = 27;
+static const unsigned int D3DFMT_A8 = 28;
+static const unsigned int D3DFMT_A8R3G3B2 = 29;
+static const unsigned int D3DFMT_X4R4G4B4 = 30;
+static const unsigned int D3DFMT_A2B10G10R10 = 31;
+static const unsigned int D3DFMT_A8B8G8R8 = 32;
+static const unsigned int D3DFMT_X8B8G8R8 = 33;
+static const unsigned int D3DFMT_G16R16 = 34;
+static const unsigned int D3DFMT_A2R10G10B10 = 35;
+static const unsigned int D3DFMT_A16B16G16R16 = 36;
+
+// Palette formats.
+static const unsigned int D3DFMT_A8P8 = 40;
+static const unsigned int D3DFMT_P8 = 41;
+
+// Luminance formats.
+static const unsigned int D3DFMT_L8 = 50;
+static const unsigned int D3DFMT_A8L8 = 51;
+static const unsigned int D3DFMT_A4L4 = 52;
+
+// Floating point formats
+static const unsigned int D3DFMT_R16F = 111;
+static const unsigned int D3DFMT_G16R16F = 112;
+static const unsigned int D3DFMT_A16B16G16R16F = 113;
+static const unsigned int D3DFMT_R32F = 114;
+static const unsigned int D3DFMT_G32R32F = 115;
+static const unsigned int D3DFMT_A32B32G32R32F = 116;
+
+static const unsigned int DDSD_CAPS = 0x00000001U;
+static const unsigned int DDSD_PIXELFORMAT = 0x00001000U;
+static const unsigned int DDSD_WIDTH = 0x00000004U;
+static const unsigned int DDSD_HEIGHT = 0x00000002U;
+static const unsigned int DDSD_PITCH = 0x00000008U;
+static const unsigned int DDSD_MIPMAPCOUNT = 0x00020000U;
+static const unsigned int DDSD_LINEARSIZE = 0x00080000U;
+static const unsigned int DDSD_DEPTH = 0x00800000U;
+
+static const unsigned int DDSCAPS_COMPLEX = 0x00000008U;
+static const unsigned int DDSCAPS_TEXTURE = 0x00001000U;
+static const unsigned int DDSCAPS_MIPMAP = 0x00400000U;
+static const unsigned int DDSCAPS2_VOLUME = 0x00200000U;
+static const unsigned int DDSCAPS2_CUBEMAP = 0x00000200U;
+
+static const unsigned int DDSCAPS2_CUBEMAP_POSITIVEX = 0x00000400U;
+static const unsigned int DDSCAPS2_CUBEMAP_NEGATIVEX = 0x00000800U;
+static const unsigned int DDSCAPS2_CUBEMAP_POSITIVEY = 0x00001000U;
+static const unsigned int DDSCAPS2_CUBEMAP_NEGATIVEY = 0x00002000U;
+static const unsigned int DDSCAPS2_CUBEMAP_POSITIVEZ = 0x00004000U;
+static const unsigned int DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x00008000U;
+static const unsigned int DDSCAPS2_CUBEMAP_ALL_FACES = 0x0000FC00U;
+
+static const unsigned int DDPF_ALPHAPIXELS = 0x00000001U;
+static const unsigned int DDPF_ALPHA = 0x00000002U;
+static const unsigned int DDPF_FOURCC = 0x00000004U;
+static const unsigned int DDPF_RGB = 0x00000040U;
+static const unsigned int DDPF_PALETTEINDEXED1 = 0x00000800U;
+static const unsigned int DDPF_PALETTEINDEXED2 = 0x00001000U;
+static const unsigned int DDPF_PALETTEINDEXED4 = 0x00000008U;
+static const unsigned int DDPF_PALETTEINDEXED8 = 0x00000020U;
+static const unsigned int DDPF_LUMINANCE = 0x00020000U;
+static const unsigned int DDPF_ALPHAPREMULT = 0x00008000U;
+static const unsigned int DDPF_NORMAL = 0x80000000U; // @@ Custom nv flag.
+
+/*** implementation ***/
+
+void mem_read(Stream & mem, DDSPixelFormat & pf)
+{
+ mem_read(mem, pf.size);
+ mem_read(mem, pf.flags);
+ mem_read(mem, pf.fourcc);
+ mem_read(mem, pf.bitcount);
+ mem_read(mem, pf.rmask);
+ mem_read(mem, pf.gmask);
+ mem_read(mem, pf.bmask);
+ mem_read(mem, pf.amask);
+}
+
+void mem_read(Stream & mem, DDSCaps & caps)
+{
+ mem_read(mem, caps.caps1);
+ mem_read(mem, caps.caps2);
+ mem_read(mem, caps.caps3);
+ mem_read(mem, caps.caps4);
+}
+
+void mem_read(Stream & mem, DDSHeader & header)
+{
+ mem_read(mem, header.fourcc);
+ mem_read(mem, header.size);
+ mem_read(mem, header.flags);
+ mem_read(mem, header.height);
+ mem_read(mem, header.width);
+ mem_read(mem, header.pitch);
+ mem_read(mem, header.depth);
+ mem_read(mem, header.mipmapcount);
+ for (unsigned int i = 0; i < 11; i++) mem_read(mem, header.reserved[i]);
+ mem_read(mem, header.pf);
+ mem_read(mem, header.caps);
+ mem_read(mem, header.notused);
+}
+
+DDSHeader::DDSHeader()
+{
+ this->fourcc = FOURCC_DDS;
+ this->size = 124;
+ this->flags = (DDSD_CAPS|DDSD_PIXELFORMAT);
+ this->height = 0;
+ this->width = 0;
+ this->pitch = 0;
+ this->depth = 0;
+ this->mipmapcount = 0;
+ for (unsigned int i = 0; i < 11; i++) this->reserved[i] = 0;
+
+ // Store version information on the reserved header attributes.
+ this->reserved[9] = MAKEFOURCC('N', 'V', 'T', 'T');
+ this->reserved[10] = (0 << 16) | (9 << 8) | (3); // major.minor.revision
+
+ this->pf.size = 32;
+ this->pf.flags = 0;
+ this->pf.fourcc = 0;
+ this->pf.bitcount = 0;
+ this->pf.rmask = 0;
+ this->pf.gmask = 0;
+ this->pf.bmask = 0;
+ this->pf.amask = 0;
+ this->caps.caps1 = DDSCAPS_TEXTURE;
+ this->caps.caps2 = 0;
+ this->caps.caps3 = 0;
+ this->caps.caps4 = 0;
+ this->notused = 0;
+}
+
+void DDSHeader::setWidth(unsigned int w)
+{
+ this->flags |= DDSD_WIDTH;
+ this->width = w;
+}
+
+void DDSHeader::setHeight(unsigned int h)
+{
+ this->flags |= DDSD_HEIGHT;
+ this->height = h;
+}
+
+void DDSHeader::setDepth(unsigned int d)
+{
+ this->flags |= DDSD_DEPTH;
+ this->height = d;
+}
+
+void DDSHeader::setMipmapCount(unsigned int count)
+{
+ if (count == 0)
+ {
+ this->flags &= ~DDSD_MIPMAPCOUNT;
+ this->mipmapcount = 0;
+
+ if (this->caps.caps2 == 0) {
+ this->caps.caps1 = DDSCAPS_TEXTURE;
+ }
+ else {
+ this->caps.caps1 = DDSCAPS_TEXTURE | DDSCAPS_COMPLEX;
+ }
+ }
+ else
+ {
+ this->flags |= DDSD_MIPMAPCOUNT;
+ this->mipmapcount = count;
+
+ this->caps.caps1 |= DDSCAPS_COMPLEX | DDSCAPS_MIPMAP;
+ }
+}
+
+void DDSHeader::setTexture2D()
+{
+ // nothing to do here.
+}
+
+void DDSHeader::setTexture3D()
+{
+ this->caps.caps2 = DDSCAPS2_VOLUME;
+}
+
+void DDSHeader::setTextureCube()
+{
+ this->caps.caps1 |= DDSCAPS_COMPLEX;
+ this->caps.caps2 = DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_ALL_FACES;
+}
+
+void DDSHeader::setLinearSize(unsigned int size)
+{
+ this->flags &= ~DDSD_PITCH;
+ this->flags |= DDSD_LINEARSIZE;
+ this->pitch = size;
+}
+
+void DDSHeader::setPitch(unsigned int pitch)
+{
+ this->flags &= ~DDSD_LINEARSIZE;
+ this->flags |= DDSD_PITCH;
+ this->pitch = pitch;
+}
+
+void DDSHeader::setFourCC(unsigned char c0, unsigned char c1, unsigned char c2, unsigned char c3)
+{
+ // set fourcc pixel format.
+ this->pf.flags = DDPF_FOURCC;
+ this->pf.fourcc = MAKEFOURCC(c0, c1, c2, c3);
+ this->pf.bitcount = 0;
+ this->pf.rmask = 0;
+ this->pf.gmask = 0;
+ this->pf.bmask = 0;
+ this->pf.amask = 0;
+}
+
+void DDSHeader::setPixelFormat(unsigned int bitcount, unsigned int rmask, unsigned int gmask, unsigned int bmask, unsigned int amask)
+{
+ // Make sure the masks are correct.
+ if ((rmask & gmask) || \
+ (rmask & bmask) || \
+ (rmask & amask) || \
+ (gmask & bmask) || \
+ (gmask & amask) || \
+ (bmask & amask)) {
+ printf("DDS: bad RGBA masks, pixel format not set\n");
+ return;
+ }
+
+ this->pf.flags = DDPF_RGB;
+
+ if (amask != 0) {
+ this->pf.flags |= DDPF_ALPHAPIXELS;
+ }
+
+ if (bitcount == 0)
+ {
+ // Compute bit count from the masks.
+ unsigned int total = rmask | gmask | bmask | amask;
+ while(total != 0) {
+ bitcount++;
+ total >>= 1;
+ }
+ // @@ Align to 8?
+ }
+
+ this->pf.fourcc = 0;
+ this->pf.bitcount = bitcount;
+ this->pf.rmask = rmask;
+ this->pf.gmask = gmask;
+ this->pf.bmask = bmask;
+ this->pf.amask = amask;
+}
+
+void DDSHeader::setNormalFlag(bool b)
+{
+ if (b) this->pf.flags |= DDPF_NORMAL;
+ else this->pf.flags &= ~DDPF_NORMAL;
+}
+
+/*
+void DDSHeader::swapBytes()
+{
+ this->fourcc = POSH_LittleU32(this->fourcc);
+ this->size = POSH_LittleU32(this->size);
+ this->flags = POSH_LittleU32(this->flags);
+ this->height = POSH_LittleU32(this->height);
+ this->width = POSH_LittleU32(this->width);
+ this->pitch = POSH_LittleU32(this->pitch);
+ this->depth = POSH_LittleU32(this->depth);
+ this->mipmapcount = POSH_LittleU32(this->mipmapcount);
+
+ for(int i = 0; i < 11; i++) {
+ this->reserved[i] = POSH_LittleU32(this->reserved[i]);
+ }
+
+ this->pf.size = POSH_LittleU32(this->pf.size);
+ this->pf.flags = POSH_LittleU32(this->pf.flags);
+ this->pf.fourcc = POSH_LittleU32(this->pf.fourcc);
+ this->pf.bitcount = POSH_LittleU32(this->pf.bitcount);
+ this->pf.rmask = POSH_LittleU32(this->pf.rmask);
+ this->pf.gmask = POSH_LittleU32(this->pf.gmask);
+ this->pf.bmask = POSH_LittleU32(this->pf.bmask);
+ this->pf.amask = POSH_LittleU32(this->pf.amask);
+ this->caps.caps1 = POSH_LittleU32(this->caps.caps1);
+ this->caps.caps2 = POSH_LittleU32(this->caps.caps2);
+ this->caps.caps3 = POSH_LittleU32(this->caps.caps3);
+ this->caps.caps4 = POSH_LittleU32(this->caps.caps4);
+ this->notused = POSH_LittleU32(this->notused);
+}
+*/
+
+
+DirectDrawSurface::DirectDrawSurface(unsigned char *mem, unsigned int size) : stream(mem, size), header()
+{
+ mem_read(stream, header);
+}
+
+DirectDrawSurface::~DirectDrawSurface()
+{
+}
+
+bool DirectDrawSurface::isValid() const
+{
+ if (header.fourcc != FOURCC_DDS || header.size != 124)
+ {
+ return false;
+ }
+
+ const unsigned int required = (DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS|DDSD_PIXELFORMAT);
+ if( (header.flags & required) != required ) {
+ return false;
+ }
+
+ if (header.pf.size != 32) {
+ return false;
+ }
+
+ /* in some files DDSCAPS_TEXTURE is missing: silently ignore */
+ /*
+ if( !(header.caps.caps1 & DDSCAPS_TEXTURE) ) {
+ return false;
+ }
+ */
+
+ return true;
+}
+
+bool DirectDrawSurface::isSupported() const
+{
+ if (header.pf.flags & DDPF_FOURCC)
+ {
+ if (header.pf.fourcc != FOURCC_DXT1 &&
+ header.pf.fourcc != FOURCC_DXT2 &&
+ header.pf.fourcc != FOURCC_DXT3 &&
+ header.pf.fourcc != FOURCC_DXT4 &&
+ header.pf.fourcc != FOURCC_DXT5 &&
+ header.pf.fourcc != FOURCC_RXGB &&
+ header.pf.fourcc != FOURCC_ATI1 &&
+ header.pf.fourcc != FOURCC_ATI2)
+ {
+ // Unknown fourcc code.
+ return false;
+ }
+ }
+ else if (header.pf.flags & DDPF_RGB)
+ {
+ if (header.pf.bitcount == 24)
+ {
+ return true;
+ }
+ else if (header.pf.bitcount == 32)
+ {
+ return true;
+ }
+ else
+ {
+ // Unsupported pixel format.
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+
+ if (isTextureCube() && (header.caps.caps2 & DDSCAPS2_CUBEMAP_ALL_FACES) != DDSCAPS2_CUBEMAP_ALL_FACES)
+ {
+ // Cubemaps must contain all faces.
+ return false;
+ }
+
+ if (isTexture3D())
+ {
+ // @@ 3D textures not supported yet.
+ return false;
+ }
+
+ return true;
+}
+
+
+unsigned int DirectDrawSurface::mipmapCount() const
+{
+ if (header.flags & DDSD_MIPMAPCOUNT) return header.mipmapcount;
+ else return 0;
+}
+
+
+unsigned int DirectDrawSurface::width() const
+{
+ if (header.flags & DDSD_WIDTH) return header.width;
+ else return 1;
+}
+
+unsigned int DirectDrawSurface::height() const
+{
+ if (header.flags & DDSD_HEIGHT) return header.height;
+ else return 1;
+}
+
+unsigned int DirectDrawSurface::depth() const
+{
+ if (header.flags & DDSD_DEPTH) return header.depth;
+ else return 1;
+}
+
+bool DirectDrawSurface::hasAlpha() const
+{
+ if ((header.pf.flags & DDPF_RGB) && (header.pf.amask == 0))
+ {
+ return false;
+ }
+ else if (header.pf.fourcc == FOURCC_DXT1)
+ {
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+bool DirectDrawSurface::isTexture2D() const
+{
+ return !isTexture3D() && !isTextureCube();
+}
+
+bool DirectDrawSurface::isTexture3D() const
+{
+ return (header.caps.caps2 & DDSCAPS2_VOLUME) != 0;
+}
+
+bool DirectDrawSurface::isTextureCube() const
+{
+ return (header.caps.caps2 & DDSCAPS2_CUBEMAP) != 0;
+}
+
+void DirectDrawSurface::mipmap(Image * img, unsigned int face, unsigned int mipmap)
+{
+ stream.seek(offset(face, mipmap));
+
+ unsigned int w = width();
+ unsigned int h = height();
+
+ // Compute width and height.
+ for (unsigned int m = 0; m < mipmap; m++)
+ {
+ w = max(w/2, 1U);
+ h = max(h/2, 1U);
+ }
+
+ img->allocate(w, h);
+
+ if (header.pf.flags & DDPF_RGB)
+ {
+ readLinearImage(img);
+ }
+ else if (header.pf.flags & DDPF_FOURCC)
+ {
+ readBlockImage(img);
+ }
+}
+
+/* helper function for readLinearImage */
+void maskShiftAndSize(unsigned int mask, unsigned int * shift, unsigned int * size)
+{
+ if (!mask)
+ {
+ *shift = 0;
+ *size = 0;
+ return;
+ }
+
+ *shift = 0;
+ while((mask & 1) == 0) {
+ ++(*shift);
+ mask >>= 1;
+ }
+
+ *size = 0;
+ while((mask & 1) == 1) {
+ ++(*size);
+ mask >>= 1;
+ }
+}
+
+/* helper function for readLinearImage */
+unsigned int convert(unsigned int c, unsigned int inbits, unsigned int outbits)
+{
+ if (inbits == 0) {
+ return 0;
+ }
+ else if (inbits == outbits)
+ {
+ return c;
+ }
+ else if (inbits > outbits)
+ {
+ // truncate
+ return c >> (inbits - outbits);
+ }
+ else
+ {
+ // bitexpand
+ return (c << (outbits - inbits)) | convert(c, inbits, outbits - inbits);
+ }
+}
+
+void DirectDrawSurface::readLinearImage(Image * img)
+{
+ const unsigned int w = img->width();
+ const unsigned int h = img->height();
+
+ unsigned int rshift, rsize;
+ maskShiftAndSize(header.pf.rmask, &rshift, &rsize);
+
+ unsigned int gshift, gsize;
+ maskShiftAndSize(header.pf.gmask, &gshift, &gsize);
+
+ unsigned int bshift, bsize;
+ maskShiftAndSize(header.pf.bmask, &bshift, &bsize);
+
+ unsigned int ashift, asize;
+ maskShiftAndSize(header.pf.amask, &ashift, &asize);
+
+ unsigned int byteCount = (header.pf.bitcount + 7) / 8;
+ if (byteCount > 4)
+ {
+ /* just in case... we could have segfaults later on if byteCount > 4 */
+ printf("DDS: bitcount too large (file corrupt?)");
+ return;
+ }
+
+ if (header.pf.amask != 0)
+ {
+ img->setFormat(Image::Format_ARGB);
+ }
+
+ // Read linear RGB images.
+ for (unsigned int y = 0; y < h; y++)
+ {
+ for (unsigned int x = 0; x < w; x++)
+ {
+ unsigned int c = 0;
+ mem_read(stream, (unsigned char *)(&c), byteCount);
+
+ Color32 pixel(0, 0, 0, 0xFF);
+ pixel.r = convert(c >> rshift, rsize, 8);
+ pixel.g = convert(c >> gshift, gsize, 8);
+ pixel.b = convert(c >> bshift, bsize, 8);
+ pixel.a = convert(c >> ashift, asize, 8);
+
+ img->pixel(x, y) = pixel;
+ }
+ }
+}
+
+void DirectDrawSurface::readBlockImage(Image * img)
+{
+ const unsigned int w = img->width();
+ const unsigned int h = img->height();
+
+ const unsigned int bw = (w + 3) / 4;
+ const unsigned int bh = (h + 3) / 4;
+
+ for (unsigned int by = 0; by < bh; by++)
+ {
+ for (unsigned int bx = 0; bx < bw; bx++)
+ {
+ ColorBlock block;
+
+ // Read color block.
+ readBlock(&block);
+
+ // Write color block.
+ for (unsigned int y = 0; y < min(4U, h-4*by); y++)
+ {
+ for (unsigned int x = 0; x < min(4U, w-4*bx); x++)
+ {
+ img->pixel(4*bx+x, 4*by+y) = block.color(x, y);
+ }
+ }
+ }
+ }
+}
+
+static Color32 buildNormal(unsigned char x, unsigned char y)
+{
+ float nx = 2 * (x / 255) - 1;
+ float ny = 2 * (x / 255) - 1;
+ float nz = sqrt(1 - nx*nx - ny*ny);
+ unsigned char z = clamp(int(255 * (nz + 1) / 2), 0, 255);
+
+ return Color32(x, y, z);
+}
+
+
+void DirectDrawSurface::readBlock(ColorBlock * rgba)
+{
+ if (header.pf.fourcc == FOURCC_DXT1)
+ {
+ BlockDXT1 block;
+ mem_read(stream, block);
+ block.decodeBlock(rgba);
+ }
+ else if (header.pf.fourcc == FOURCC_DXT2 ||
+ header.pf.fourcc == FOURCC_DXT3)
+ {
+ BlockDXT3 block;
+ mem_read(stream, block);
+ block.decodeBlock(rgba);
+ }
+ else if (header.pf.fourcc == FOURCC_DXT4 ||
+ header.pf.fourcc == FOURCC_DXT5 ||
+ header.pf.fourcc == FOURCC_RXGB)
+ {
+ BlockDXT5 block;
+ mem_read(stream, block);
+ block.decodeBlock(rgba);
+
+ if (header.pf.fourcc == FOURCC_RXGB)
+ {
+ // Swap R & A.
+ for (int i = 0; i < 16; i++)
+ {
+ Color32 & c = rgba->color(i);
+ unsigned int tmp = c.r;
+ c.r = c.a;
+ c.a = tmp;
+ }
+ }
+ }
+ else if (header.pf.fourcc == FOURCC_ATI1)
+ {
+ BlockATI1 block;
+ mem_read(stream, block);
+ block.decodeBlock(rgba);
+ }
+ else if (header.pf.fourcc == FOURCC_ATI2)
+ {
+ BlockATI2 block;
+ mem_read(stream, block);
+ block.decodeBlock(rgba);
+ }
+
+ // If normal flag set, convert to normal.
+ if (header.pf.flags & DDPF_NORMAL)
+ {
+ if (header.pf.fourcc == FOURCC_ATI2)
+ {
+ for (int i = 0; i < 16; i++)
+ {
+ Color32 & c = rgba->color(i);
+ c = buildNormal(c.r, c.g);
+ }
+ }
+ else if (header.pf.fourcc == FOURCC_DXT5)
+ {
+ for (int i = 0; i < 16; i++)
+ {
+ Color32 & c = rgba->color(i);
+ c = buildNormal(c.g, c.a);
+ }
+ }
+ }
+}
+
+
+unsigned int DirectDrawSurface::blockSize() const
+{
+ switch(header.pf.fourcc)
+ {
+ case FOURCC_DXT1:
+ case FOURCC_ATI1:
+ return 8;
+ case FOURCC_DXT2:
+ case FOURCC_DXT3:
+ case FOURCC_DXT4:
+ case FOURCC_DXT5:
+ case FOURCC_RXGB:
+ case FOURCC_ATI2:
+ return 16;
+ };
+
+ // Not a block image.
+ return 0;
+}
+
+unsigned int DirectDrawSurface::mipmapSize(unsigned int mipmap) const
+{
+ unsigned int w = width();
+ unsigned int h = height();
+ unsigned int d = depth();
+
+ for (unsigned int m = 0; m < mipmap; m++)
+ {
+ w = max(1U, w / 2);
+ h = max(1U, h / 2);
+ d = max(1U, d / 2);
+ }
+
+ if (header.pf.flags & DDPF_FOURCC)
+ {
+ // @@ How are 3D textures aligned?
+ w = (w + 3) / 4;
+ h = (h + 3) / 4;
+ return blockSize() * w * h;
+ }
+ else if (header.pf.flags & DDPF_RGB)
+ {
+ // Align pixels to bytes.
+ unsigned int byteCount = (header.pf.bitcount + 7) / 8;
+
+ // Align pitch to 4 bytes.
+ unsigned int pitch = 4 * ((w * byteCount + 3) / 4);
+
+ return pitch * h * d;
+ }
+ else {
+ printf("DDS: mipmap format not supported\n");
+ return(0);
+ };
+}
+
+unsigned int DirectDrawSurface::faceSize() const
+{
+ const unsigned int count = mipmapCount();
+ unsigned int size = 0;
+
+ for (unsigned int m = 0; m < count; m++)
+ {
+ size += mipmapSize(m);
+ }
+
+ return size;
+}
+
+unsigned int DirectDrawSurface::offset(const unsigned int face, const unsigned int mipmap)
+{
+ unsigned int size = sizeof(DDSHeader);
+
+ if (face != 0)
+ {
+ size += face * faceSize();
+ }
+
+ for (unsigned int m = 0; m < mipmap; m++)
+ {
+ size += mipmapSize(m);
+ }
+
+ return size;
+}
+
+
+void DirectDrawSurface::printInfo() const
+{
+ /* printf("FOURCC: %c%c%c%c\n", ((unsigned char *)&header.fourcc)[0], ((unsigned char *)&header.fourcc)[1], ((unsigned char *)&header.fourcc)[2], ((unsigned char *)&header.fourcc)[3]); */
+ printf("Flags: 0x%.8X\n", header.flags);
+ if (header.flags & DDSD_CAPS) printf("\tDDSD_CAPS\n");
+ if (header.flags & DDSD_PIXELFORMAT) printf("\tDDSD_PIXELFORMAT\n");
+ if (header.flags & DDSD_WIDTH) printf("\tDDSD_WIDTH\n");
+ if (header.flags & DDSD_HEIGHT) printf("\tDDSD_HEIGHT\n");
+ if (header.flags & DDSD_DEPTH) printf("\tDDSD_DEPTH\n");
+ if (header.flags & DDSD_PITCH) printf("\tDDSD_PITCH\n");
+ if (header.flags & DDSD_LINEARSIZE) printf("\tDDSD_LINEARSIZE\n");
+ if (header.flags & DDSD_MIPMAPCOUNT) printf("\tDDSD_MIPMAPCOUNT\n");
+
+ printf("Height: %d\n", header.height);
+ printf("Width: %d\n", header.width);
+ printf("Depth: %d\n", header.depth);
+ if (header.flags & DDSD_PITCH) printf("Pitch: %d\n", header.pitch);
+ else if (header.flags & DDSD_LINEARSIZE) printf("Linear size: %d\n", header.pitch);
+ printf("Mipmap count: %d\n", header.mipmapcount);
+
+ printf("Pixel Format:\n");
+ /* printf("\tSize: %d\n", header.pf.size); */
+ printf("\tFlags: 0x%.8X\n", header.pf.flags);
+ if (header.pf.flags & DDPF_RGB) printf("\t\tDDPF_RGB\n");
+ if (header.pf.flags & DDPF_FOURCC) printf("\t\tDDPF_FOURCC\n");
+ if (header.pf.flags & DDPF_ALPHAPIXELS) printf("\t\tDDPF_ALPHAPIXELS\n");
+ if (header.pf.flags & DDPF_ALPHA) printf("\t\tDDPF_ALPHA\n");
+ if (header.pf.flags & DDPF_PALETTEINDEXED1) printf("\t\tDDPF_PALETTEINDEXED1\n");
+ if (header.pf.flags & DDPF_PALETTEINDEXED2) printf("\t\tDDPF_PALETTEINDEXED2\n");
+ if (header.pf.flags & DDPF_PALETTEINDEXED4) printf("\t\tDDPF_PALETTEINDEXED4\n");
+ if (header.pf.flags & DDPF_PALETTEINDEXED8) printf("\t\tDDPF_PALETTEINDEXED8\n");
+ if (header.pf.flags & DDPF_ALPHAPREMULT) printf("\t\tDDPF_ALPHAPREMULT\n");
+ if (header.pf.flags & DDPF_NORMAL) printf("\t\tDDPF_NORMAL\n");
+
+ printf("\tFourCC: '%c%c%c%c'\n", ((header.pf.fourcc >> 0) & 0xFF), ((header.pf.fourcc >> 8) & 0xFF), ((header.pf.fourcc >> 16) & 0xFF), ((header.pf.fourcc >> 24) & 0xFF));
+ printf("\tBit count: %d\n", header.pf.bitcount);
+ printf("\tRed mask: 0x%.8X\n", header.pf.rmask);
+ printf("\tGreen mask: 0x%.8X\n", header.pf.gmask);
+ printf("\tBlue mask: 0x%.8X\n", header.pf.bmask);
+ printf("\tAlpha mask: 0x%.8X\n", header.pf.amask);
+
+ printf("Caps:\n");
+ printf("\tCaps 1: 0x%.8X\n", header.caps.caps1);
+ if (header.caps.caps1 & DDSCAPS_COMPLEX) printf("\t\tDDSCAPS_COMPLEX\n");
+ if (header.caps.caps1 & DDSCAPS_TEXTURE) printf("\t\tDDSCAPS_TEXTURE\n");
+ if (header.caps.caps1 & DDSCAPS_MIPMAP) printf("\t\tDDSCAPS_MIPMAP\n");
+
+ printf("\tCaps 2: 0x%.8X\n", header.caps.caps2);
+ if (header.caps.caps2 & DDSCAPS2_VOLUME) printf("\t\tDDSCAPS2_VOLUME\n");
+ else if (header.caps.caps2 & DDSCAPS2_CUBEMAP)
+ {
+ printf("\t\tDDSCAPS2_CUBEMAP\n");
+ if ((header.caps.caps2 & DDSCAPS2_CUBEMAP_ALL_FACES) == DDSCAPS2_CUBEMAP_ALL_FACES) printf("\t\tDDSCAPS2_CUBEMAP_ALL_FACES\n");
+ else {
+ if (header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEX) printf("\t\tDDSCAPS2_CUBEMAP_POSITIVEX\n");
+ if (header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX) printf("\t\tDDSCAPS2_CUBEMAP_NEGATIVEX\n");
+ if (header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEY) printf("\t\tDDSCAPS2_CUBEMAP_POSITIVEY\n");
+ if (header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY) printf("\t\tDDSCAPS2_CUBEMAP_NEGATIVEY\n");
+ if (header.caps.caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ) printf("\t\tDDSCAPS2_CUBEMAP_POSITIVEZ\n");
+ if (header.caps.caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ) printf("\t\tDDSCAPS2_CUBEMAP_NEGATIVEZ\n");
+ }
+ }
+
+ printf("\tCaps 3: 0x%.8X\n", header.caps.caps3);
+ printf("\tCaps 4: 0x%.8X\n", header.caps.caps4);
+
+ if (header.reserved[9] == MAKEFOURCC('N', 'V', 'T', 'T'))
+ {
+ int major = (header.reserved[10] >> 16) & 0xFF;
+ int minor = (header.reserved[10] >> 8) & 0xFF;
+ int revision= header.reserved[10] & 0xFF;
+
+ printf("Version:\n");
+ printf("\tNVIDIA Texture Tools %d.%d.%d\n", major, minor, revision);
+ }
+}
+
diff --git a/source/blender/imbuf/intern/dds/DirectDrawSurface.h b/source/blender/imbuf/intern/dds/DirectDrawSurface.h
new file mode 100644
index 00000000000..2b3319d05a1
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/DirectDrawSurface.h
@@ -0,0 +1,162 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/*
+ * This file is based on a similar file from the NVIDIA texture tools
+ * (http://nvidia-texture-tools.googlecode.com/)
+ *
+ * Original license from NVIDIA follows.
+ */
+
+// Copyright NVIDIA Corporation 2007 -- Ignacio Castano <icastano@nvidia.com>
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// 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 AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+#ifndef _DDS_DIRECTDRAWSURFACE_H
+#define _DDS_DIRECTDRAWSURFACE_H
+
+#include <Stream.h>
+#include <ColorBlock.h>
+#include <Image.h>
+
+struct DDSPixelFormat {
+ unsigned int size;
+ unsigned int flags;
+ unsigned int fourcc;
+ unsigned int bitcount;
+ unsigned int rmask;
+ unsigned int gmask;
+ unsigned int bmask;
+ unsigned int amask;
+};
+
+struct DDSCaps {
+ unsigned int caps1;
+ unsigned int caps2;
+ unsigned int caps3;
+ unsigned int caps4;
+};
+
+/// DDS file header.
+struct DDSHeader {
+ unsigned int fourcc;
+ unsigned int size;
+ unsigned int flags;
+ unsigned int height;
+ unsigned int width;
+ unsigned int pitch;
+ unsigned int depth;
+ unsigned int mipmapcount;
+ unsigned int reserved[11];
+ DDSPixelFormat pf;
+ DDSCaps caps;
+ unsigned int notused;
+
+ // Helper methods.
+ DDSHeader();
+
+ void setWidth(unsigned int w);
+ void setHeight(unsigned int h);
+ void setDepth(unsigned int d);
+ void setMipmapCount(unsigned int count);
+ void setTexture2D();
+ void setTexture3D();
+ void setTextureCube();
+ void setLinearSize(unsigned int size);
+ void setPitch(unsigned int pitch);
+ void setFourCC(unsigned char c0, unsigned char c1, unsigned char c2, unsigned char c3);
+ void setPixelFormat(unsigned int bitcount, unsigned int rmask, unsigned int gmask, unsigned int bmask, unsigned int amask);
+ void setNormalFlag(bool b);
+
+ /* void swapBytes(); */
+};
+
+/// DirectDraw Surface. (DDS)
+class DirectDrawSurface
+{
+public:
+ DirectDrawSurface(unsigned char *mem, unsigned int size);
+ ~DirectDrawSurface();
+
+ bool isValid() const;
+ bool isSupported() const;
+
+ unsigned int mipmapCount() const;
+ unsigned int width() const;
+ unsigned int height() const;
+ unsigned int depth() const;
+ bool isTexture2D() const;
+ bool isTexture3D() const;
+ bool isTextureCube() const;
+ bool hasAlpha() const; /* false for DXT1, true for all others */
+
+ void mipmap(Image * img, unsigned int f, unsigned int m);
+
+ void printInfo() const;
+
+private:
+
+ unsigned int blockSize() const;
+ unsigned int faceSize() const;
+ unsigned int mipmapSize(unsigned int m) const;
+
+ unsigned int offset(unsigned int f, unsigned int m);
+
+ void readLinearImage(Image * img);
+ void readBlockImage(Image * img);
+ void readBlock(ColorBlock * rgba);
+
+
+private:
+ Stream stream; // memory where DDS file resides
+ DDSHeader header;
+};
+
+void mem_read(Stream & mem, DDSPixelFormat & pf);
+void mem_read(Stream & mem, DDSCaps & caps);
+void mem_read(Stream & mem, DDSHeader & header);
+
+#endif // _DDS_DIRECTDRAWSURFACE_H
diff --git a/source/blender/imbuf/intern/dds/Image.cpp b/source/blender/imbuf/intern/dds/Image.cpp
new file mode 100644
index 00000000000..f3e6fa38955
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/Image.cpp
@@ -0,0 +1,132 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/*
+ * This file is based on a similar file from the NVIDIA texture tools
+ * (http://nvidia-texture-tools.googlecode.com/)
+ *
+ * Original license from NVIDIA follows.
+ */
+
+// This code is in the public domain -- castanyo@yahoo.es
+
+#include <Color.h>
+#include <Image.h>
+
+#include <stdio.h> // printf
+
+Image::Image() : m_width(0), m_height(0), m_format(Format_RGB), m_data(0)
+{
+}
+
+Image::~Image()
+{
+ free();
+}
+
+void Image::allocate(unsigned int w, unsigned int h)
+{
+ free();
+ m_width = w;
+ m_height = h;
+ m_data = new Color32[w * h];
+}
+
+void Image::free()
+{
+ if (m_data) delete [] m_data;
+ m_data = 0;
+}
+
+
+unsigned int Image::width() const
+{
+ return m_width;
+}
+
+unsigned int Image::height() const
+{
+ return m_height;
+}
+
+const Color32 * Image::scanline(unsigned int h) const
+{
+ if (h >= m_height) {
+ printf("DDS: scanline beyond dimensions of image");
+ return m_data;
+ }
+ return m_data + h * m_width;
+}
+
+Color32 * Image::scanline(unsigned int h)
+{
+ if (h >= m_height) {
+ printf("DDS: scanline beyond dimensions of image");
+ return m_data;
+ }
+ return m_data + h * m_width;
+}
+
+const Color32 * Image::pixels() const
+{
+ return m_data;
+}
+
+Color32 * Image::pixels()
+{
+ return m_data;
+}
+
+const Color32 & Image::pixel(unsigned int idx) const
+{
+ if (idx >= m_width * m_height) {
+ printf("DDS: pixel beyond dimensions of image");
+ return m_data[0];
+ }
+ return m_data[idx];
+}
+
+Color32 & Image::pixel(unsigned int idx)
+{
+ if (idx >= m_width * m_height) {
+ printf("DDS: pixel beyond dimensions of image");
+ return m_data[0];
+ }
+ return m_data[idx];
+}
+
+
+Image::Format Image::format() const
+{
+ return m_format;
+}
+
+void Image::setFormat(Image::Format f)
+{
+ m_format = f;
+}
+
diff --git a/source/blender/imbuf/intern/dds/Image.h b/source/blender/imbuf/intern/dds/Image.h
new file mode 100644
index 00000000000..10356774777
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/Image.h
@@ -0,0 +1,103 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+/*
+ * This file is based on a similar file from the NVIDIA texture tools
+ * (http://nvidia-texture-tools.googlecode.com/)
+ *
+ * Original license from NVIDIA follows.
+ */
+
+// This code is in the public domain -- castanyo@yahoo.es
+
+#ifndef _DDS_IMAGE_H
+#define _DDS_IMAGE_H
+
+#include <Color.h>
+
+/// 32 bit RGBA image.
+class Image
+{
+public:
+
+ enum Format
+ {
+ Format_RGB,
+ Format_ARGB,
+ };
+
+ Image();
+ ~Image();
+
+ void allocate(unsigned int w, unsigned int h);
+ /*
+ bool load(const char * name);
+
+ void wrap(void * data, unsigned int w, unsigned int h);
+ void unwrap();
+ */
+
+ unsigned int width() const;
+ unsigned int height() const;
+
+ const Color32 * scanline(unsigned int h) const;
+ Color32 * scanline(unsigned int h);
+
+ const Color32 * pixels() const;
+ Color32 * pixels();
+
+ const Color32 & pixel(unsigned int idx) const;
+ Color32 & pixel(unsigned int idx);
+
+ const Color32 & pixel(unsigned int x, unsigned int y) const;
+ Color32 & pixel(unsigned int x, unsigned int y);
+
+ Format format() const;
+ void setFormat(Format f);
+
+private:
+ void free();
+
+private:
+ unsigned int m_width;
+ unsigned int m_height;
+ Format m_format;
+ Color32 * m_data;
+};
+
+
+inline const Color32 & Image::pixel(unsigned int x, unsigned int y) const
+{
+ return pixel(y * width() + x);
+}
+
+inline Color32 & Image::pixel(unsigned int x, unsigned int y)
+{
+ return pixel(y * width() + x);
+}
+
+#endif // _DDS_IMAGE_H
diff --git a/intern/action/intern/Makefile b/source/blender/imbuf/intern/dds/Makefile
index 29f82bb7c0d..88d59080a47 100644
--- a/intern/action/intern/Makefile
+++ b/source/blender/imbuf/intern/dds/Makefile
@@ -1,5 +1,5 @@
#
-# $Id$
+# $Id: Makefile 7037 2006-03-12 14:11:23Z ton $
#
# ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
#
@@ -28,15 +28,36 @@
# Contributor(s): none yet.
#
# ***** END GPL/BL DUAL LICENSE BLOCK *****
-# action intern Makefile
+#
#
-LIBNAME = action
-DIR = $(OCGDIR)/intern/$(LIBNAME)
+LIBNAME = dds
+DIR = $(OCGDIR)/blender/imbuf/dds
+SOURCEDIR = source/blender/imbuf/intern/dds
include nan_compile.mk
+include nan_definitions.mk
-CPPFLAGS += -I..
-CPPFLAGS += -I$(NAN_STRING)/include
-CPPFLAGS += -I$(NAN_MEMUTIL)/include
+CFLAGS += $(LEVEL_1_C_WARNINGS)
+CPPFLAGS += -I$(NAN_JPEG)/include
+CPPFLAGS += -I$(NAN_PNG)/include
+CPPFLAGS += -I$(NAN_ZLIB)/include
+CPPFLAGS += -I$(NAN_TIFF)/include
+CPPFLAGS += -I../../../include
+CPPFLAGS += -I../../../blenkernel
+CPPFLAGS += -I../../../blenlib
+CPPFLAGS += -I../../../avi
+CPPFLAGS += -I../../../quicktime
+# path to the guarded memory allocator
+CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
+CPPFLAGS += -I$(NAN_MEMUTIL)/include
+# This is not really needed, but until /include is cleaned, it must be
+# there for proper compilation.
+# - No, it is also needed in antialias, for listbase (nzc)
+CPPFLAGS += -I../../../makesdna
+# external interface of this module
+CPPFLAGS += -I../..
+CPPFLAGS += -I..
+CPPFLAGS += -I.
+CPPFLAGS += -DWITH_DDS
diff --git a/source/blender/imbuf/intern/dds/SConscript b/source/blender/imbuf/intern/dds/SConscript
new file mode 100644
index 00000000000..d005bae02be
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/SConscript
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+Import ('env')
+
+source_files = ['dds_api.cpp', 'DirectDrawSurface.cpp', 'Stream.cpp', 'BlockDXT.cpp', 'ColorBlock.cpp', 'Image.cpp']
+
+incs = ['.',
+ '../../',
+ '../..',
+ '..',
+ '../../../makesdna',
+ '../../../blenkernel',
+ '../../../blenlib',
+ 'intern/include',
+ '#/intern/guardedalloc']
+
+
+defs = ['WITH_DDS']
+
+env.BlenderLib ('bf_dds', source_files, incs, defs, libtype=['core','player'], priority = [90, 200])
diff --git a/source/blender/imbuf/intern/dds/Stream.cpp b/source/blender/imbuf/intern/dds/Stream.cpp
new file mode 100644
index 00000000000..2340598b4fa
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/Stream.cpp
@@ -0,0 +1,99 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include <Stream.h>
+
+#include <stdio.h> // printf
+#include <string.h> // memcpy
+
+unsigned int Stream::seek(unsigned int p)
+{
+ if (p > size) {
+ printf("DDS: trying to seek beyond end of stream (corrupt file?)");
+ }
+ else {
+ pos = p;
+ }
+
+ return pos;
+}
+
+unsigned int mem_read(Stream & mem, unsigned long long & i)
+{
+ if (mem.pos + 8 > mem.size) {
+ printf("DDS: trying to read beyond end of stream (corrupt file?)");
+ return(0);
+ };
+ memcpy(&i, mem.mem + mem.pos, 8); // @@ todo: make sure little endian
+ mem.pos += 8;
+ return(8);
+}
+
+unsigned int mem_read(Stream & mem, unsigned int & i)
+{
+ if (mem.pos + 4 > mem.size) {
+ printf("DDS: trying to read beyond end of stream (corrupt file?)");
+ return(0);
+ };
+ memcpy(&i, mem.mem + mem.pos, 4); // @@ todo: make sure little endian
+ mem.pos += 4;
+ return(4);
+}
+
+unsigned int mem_read(Stream & mem, unsigned short & i)
+{
+ if (mem.pos + 2 > mem.size) {
+ printf("DDS: trying to read beyond end of stream (corrupt file?)");
+ return(0);
+ };
+ memcpy(&i, mem.mem + mem.pos, 2); // @@ todo: make sure little endian
+ mem.pos += 2;
+ return(2);
+}
+
+unsigned int mem_read(Stream & mem, unsigned char & i)
+{
+ if (mem.pos + 1 > mem.size) {
+ printf("DDS: trying to read beyond end of stream (corrupt file?)");
+ return(0);
+ };
+ i = (mem.mem + mem.pos)[0];
+ mem.pos += 1;
+ return(1);
+}
+
+unsigned int mem_read(Stream & mem, unsigned char *i, unsigned int cnt)
+{
+ if (mem.pos + cnt > mem.size) {
+ printf("DDS: trying to read beyond end of stream (corrupt file?)");
+ return(0);
+ };
+ memcpy(i, mem.mem + mem.pos, cnt);
+ mem.pos += cnt;
+ return(cnt);
+}
+
diff --git a/intern/action/test/action_c_test/TestAction.h b/source/blender/imbuf/intern/dds/Stream.h
index 487d8777b81..373e68db44e 100644
--- a/intern/action/test/action_c_test/TestAction.h
+++ b/source/blender/imbuf/intern/dds/Stream.h
@@ -1,5 +1,6 @@
/**
* $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -19,33 +20,30 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributors: Amorilia (amorilia@gamebox.net)
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
-/**
-
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * @author Maarten Gribnau
- * @date March 31, 2001
- */
-
-#ifndef _H_ACT_TESTACTION_C_H_
-#define _H_ACT_TESTACTION_C_H_
+/* simple memory stream functions with buffer overflow check */
-#include "ACT_ActionC-Api.h"
+#ifndef _STREAM_H
+#define _STREAM_H
-void printApplied(ACT_ActionPtr action, ACT_ActionUserDataPtr userData);
-void printUndone(ACT_ActionPtr action, ACT_ActionUserDataPtr userData);
-void printDisposed(ACT_ActionPtr action, ACT_ActionUserDataPtr userData);
+struct Stream
+{
+ unsigned char *mem; // location in memory
+ unsigned int size; // size
+ unsigned int pos; // current position
+ Stream(unsigned char *m, unsigned int s) : mem(m), size(s), pos(0) {};
+ unsigned int seek(unsigned int p);
+};
+unsigned int mem_read(Stream & mem, unsigned long long & i);
+unsigned int mem_read(Stream & mem, unsigned int & i);
+unsigned int mem_read(Stream & mem, unsigned short & i);
+unsigned int mem_read(Stream & mem, unsigned char & i);
+unsigned int mem_read(Stream & mem, unsigned char *i, unsigned int cnt);
-#endif // _H_ACT_TESTACTION_C_H_
+#endif // _STREAM_H
diff --git a/source/blender/imbuf/intern/dds/dds_api.cpp b/source/blender/imbuf/intern/dds/dds_api.cpp
new file mode 100644
index 00000000000..3de30b9f183
--- /dev/null
+++ b/source/blender/imbuf/intern/dds/dds_api.cpp
@@ -0,0 +1,132 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Contributors: Amorilia (amorilia@gamebox.net)
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include <dds_api.h>
+#include <Stream.h>
+#include <DirectDrawSurface.h>
+#include <stdio.h> // printf
+#include <fstream>
+
+extern "C" {
+
+#include "imbuf.h"
+#include "imbuf_patch.h"
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+#include "IMB_allocimbuf.h"
+
+
+short imb_save_dds(struct ImBuf * ibuf, char *name, int flags)
+{
+ return(0); /* todo: finish this function */
+
+ /* check image buffer */
+ if (ibuf == 0) return (0);
+ if (ibuf->rect == 0) return (0);
+
+ /* open file for writing */
+ std::ofstream fildes(name);
+
+ /* write header */
+ fildes << "DDS ";
+ fildes.close();
+
+ return(1);
+}
+
+int imb_is_a_dds(unsigned char *mem) // note: use at most first 32 bytes
+{
+ /* heuristic check to see if mem contains a DDS file */
+ /* header.fourcc == FOURCC_DDS */
+ if ((mem[0] != 'D') || (mem[1] != 'D') || (mem[2] != 'S') || (mem[3] != ' ')) return(0);
+ /* header.size == 124 */
+ if ((mem[4] != 124) || mem[5] || mem[6] || mem[7]) return(0);
+ return(1);
+}
+
+struct ImBuf *imb_load_dds(unsigned char *mem, int size, int flags)
+{
+ struct ImBuf * ibuf = 0;
+ DirectDrawSurface dds(mem, size); /* reads header */
+ unsigned char bits_per_pixel;
+ unsigned int *rect;
+ Image img;
+ unsigned int numpixels = 0;
+ int col;
+ unsigned char *cp = (unsigned char *) &col;
+ Color32 pixel;
+ Color32 *pixels = 0;
+
+ /* check if DDS is valid and supported */
+ if (!dds.isValid()) {
+ printf("DDS: not valid; header follows\n");
+ dds.printInfo();
+ return(0);
+ }
+ if (!dds.isSupported()) {
+ printf("DDS: format not supported\n");
+ return(0);
+ }
+ if ((dds.width() > 65535) || (dds.height() > 65535)) {
+ printf("DDS: dimensions too large\n");
+ return(0);
+ }
+
+ /* convert DDS into ImBuf */
+ if (dds.hasAlpha()) bits_per_pixel = 32;
+ else bits_per_pixel = 24;
+ ibuf = IMB_allocImBuf(dds.width(), dds.height(), bits_per_pixel, 0, 0);
+ if (ibuf == 0) return(0); /* memory allocation failed */
+
+ ibuf->ftype = DDS;
+
+ if ((flags & IB_test) == 0) {
+ if (!imb_addrectImBuf(ibuf)) return(ibuf);
+ if (ibuf->rect == 0) return(ibuf);
+
+ rect = ibuf->rect;
+ dds.mipmap(&img, 0, 0); /* load first face, first mipmap */
+ pixels = img.pixels();
+ numpixels = dds.width() * dds.height();
+ cp[3] = 0xff; /* default alpha if alpha channel is not present */
+
+ for (unsigned int i = 0; i < numpixels; i++) {
+ pixel = pixels[i];
+ cp[0] = pixel.r; /* set R component of col */
+ cp[1] = pixel.g; /* set G component of col */
+ cp[2] = pixel.b; /* set B component of col */
+ if (bits_per_pixel == 32)
+ cp[3] = pixel.a; /* set A component of col */
+ rect[i] = col;
+ }
+ IMB_flipy(ibuf);
+ }
+
+ return(ibuf);
+}
+
+} // extern "C"
diff --git a/intern/keymaker/mt19937int.h b/source/blender/imbuf/intern/dds/dds_api.h
index e49c7bc3a27..8a0f966dd68 100644
--- a/intern/keymaker/mt19937int.h
+++ b/source/blender/imbuf/intern/dds/dds_api.h
@@ -1,5 +1,6 @@
/**
* $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -19,28 +20,24 @@
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * The Original Code is: all of this file.
- *
- * Contributor(s): none yet.
+ * Contributors: Amorilia (amorilia@gamebox.net)
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
-/* ex:ts=4 */
+#ifndef _DDS_API_H
+#define _DDS_API_H
-/**
- * $Id$
- * Copyright (C) 2001 NaN Technologies B.V.
- * Mersenne Twister prototypes
- */
+#ifdef __cplusplus
+extern "C" {
+#endif
-/* external: */
-void sgenrand(signed long seed);
-unsigned long genrand(void);
+short imb_save_dds(struct ImBuf *ibuf, char *name, int flags);
+int imb_is_a_dds(unsigned char *mem); /* use only first 32 bytes of mem */
+struct ImBuf *imb_load_dds(unsigned char *mem, int size, int flags);
-/* internal: */
-void lsgenrand(unsigned long *seed_array);
+#ifdef __cplusplus
+}
+#endif
+#endif /* __DDS_API_H */
diff --git a/source/blender/imbuf/intern/divers.c b/source/blender/imbuf/intern/divers.c
index a4fab4a3572..8db07f581f5 100644
--- a/source/blender/imbuf/intern/divers.c
+++ b/source/blender/imbuf/intern/divers.c
@@ -174,7 +174,7 @@ void IMB_gamwarp(struct ImBuf *ibuf, double gamma)
}
}
-#define FTOCHAR(val) val<=0.0f?0: (val>=1.0f?255: (char)(255.0f*val))
+#define FTOCHAR(val) val<=0.0f?0: (val>=1.0f?255: (char)(255.99f*val))
void IMB_rect_from_float(struct ImBuf *ibuf)
{
diff --git a/source/blender/imbuf/intern/imageprocess.c b/source/blender/imbuf/intern/imageprocess.c
index f98244c5a0f..54e0ec94672 100644
--- a/source/blender/imbuf/intern/imageprocess.c
+++ b/source/blender/imbuf/intern/imageprocess.c
@@ -42,6 +42,11 @@
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
+#include "math.h"
+
+/* This define should be relocated to a global header some where Kent Mein
+I stole it from util.h in the plugins api */
+#define MAX2(x,y) ( (x)>(y) ? (x) : (y) )
/* Only this one is used liberally here, and in imbuf */
void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf)
@@ -73,3 +78,224 @@ void IMB_convert_rgba_to_abgr(struct ImBuf *ibuf)
}
}
+/**************************************************************************
+* INTERPOLATIONS
+*
+* Reference and docs:
+* http://wiki.blender.org/index.php/User:Damiles#Interpolations_Algorithms
+***************************************************************************/
+
+/* BICUBIC Interpolation functions */
+/* More info: http://wiki.blender.org/index.php/User:Damiles#Bicubic_pixel_interpolation
+*/
+/* function assumes out to be zero'ed, only does RGBA */
+static float P(float k){
+ float aux;
+ aux=(float)(1.0f/6.0f)*( pow( MAX2(k+2.0f,0) , 3.0f ) - 4.0f * pow( MAX2(k+1.0f,0) , 3.0f ) + 6.0f * pow( MAX2(k,0) , 3.0f ) - 4.0f * pow( MAX2(k-1.0f,0) , 3.0f));
+ return aux ;
+}
+
+void bicubic_interpolation(ImBuf *in, ImBuf *out, float x, float y, int xout, int yout)
+{
+ int i,j,n,m,x1,y1;
+ unsigned char *dataI,*outI;
+ float a,b, outR,outG,outB,outA,*dataF,*outF;
+ int do_rect, do_float;
+
+ if (in == NULL) return;
+ if (in->rect == NULL && in->rect_float == NULL) return;
+
+ do_rect= (out->rect != NULL);
+ do_float= (out->rect_float != NULL);
+
+ i= (int)floor(x);
+ j= (int)floor(y);
+ a= x - i;
+ b= y - j;
+
+ outR= 0.0f;
+ outG= 0.0f;
+ outB= 0.0f;
+ outA= 0.0f;
+ for(n= -1; n<= 2; n++){
+ for(m= -1; m<= 2; m++){
+ x1= i+n;
+ y1= j+m;
+ if (x1>0 && x1 < in->x && y1>0 && y1<in->y) {
+ if (do_float) {
+ dataF= in->rect_float + in->x * y1 * 4 + 4*x1;
+ outR+= dataF[0] * P(n-a) * P(b-m);
+ outG+= dataF[1] * P(n-a) * P(b-m);
+ outB+= dataF[2] * P(n-a) * P(b-m);
+ outA+= dataF[3] * P(n-a) * P(b-m);
+ }
+ if (do_rect) {
+ dataI= (unsigned char*)in->rect + in->x * y1 * 4 + 4*x1;
+ outR+= dataI[0] * P(n-a) * P(b-m);
+ outG+= dataI[1] * P(n-a) * P(b-m);
+ outB+= dataI[2] * P(n-a) * P(b-m);
+ outA+= dataI[3] * P(n-a) * P(b-m);
+ }
+ }
+ }
+ }
+ if (do_rect) {
+ outI= (unsigned char *)out->rect + out->x * yout * 4 + 4*xout;
+ outI[0]= (int)outR;
+ outI[1]= (int)outG;
+ outI[2]= (int)outB;
+ outI[3]= (int)outA;
+ }
+ if (do_float) {
+ outF= (float *)out->rect_float + out->x * yout * 4 + 4*xout;
+ outF[0]= outR;
+ outF[1]= outG;
+ outF[2]= outB;
+ outF[3]= outA;
+ }
+}
+
+/* function assumes out to be zero'ed, only does RGBA */
+/* BILINEAR INTERPOLATION */
+void bilinear_interpolation(ImBuf *in, ImBuf *out, float u, float v, int xout, int yout)
+{
+ float *row1, *row2, *row3, *row4, a, b, *outF;
+ unsigned char *row1I, *row2I, *row3I, *row4I, *outI;
+ float a_b, ma_b, a_mb, ma_mb;
+ float empty[4]= {0.0f, 0.0f, 0.0f, 0.0f};
+ unsigned char emptyI[4]= {0, 0, 0, 0};
+ int y1, y2, x1, x2;
+ int do_rect, do_float;
+
+ if (in==NULL) return;
+ if (in->rect==NULL && in->rect_float==NULL) return;
+
+ do_rect= (out->rect != NULL);
+ do_float= (out->rect_float != NULL);
+
+ x1= (int)floor(u);
+ x2= (int)ceil(u);
+ y1= (int)floor(v);
+ y2= (int)ceil(v);
+
+ // sample area entirely outside image?
+ if (x2<0 || x1>in->x-1 || y2<0 || y1>in->y-1) return;
+
+ if (do_rect)
+ outI=(unsigned char *)out->rect + out->x * yout * 4 + 4*xout;
+ else
+ outI= NULL;
+ if (do_float)
+ outF=(float *)out->rect_float + out->x * yout * 4 + 4*xout;
+ else
+ outF= NULL;
+
+ if (do_float) {
+ // sample including outside of edges of image
+ if (x1<0 || y1<0) row1= empty;
+ else row1= (float *)in->rect_float + in->x * y1 * 4 + 4*x1;
+
+ if (x1<0 || y2>in->y-1) row2= empty;
+ else row2= (float *)in->rect_float + in->x * y2 * 4 + 4*x1;
+
+ if (x2>in->x-1 || y1<0) row3= empty;
+ else row3= (float *)in->rect_float + in->x * y1 * 4 + 4*x2;
+
+ 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_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];
+ outF[1]= ma_mb*row1[1] + a_mb*row3[1] + ma_b*row2[1]+ a_b*row4[1];
+ outF[2]= ma_mb*row1[2] + a_mb*row3[2] + ma_b*row2[2]+ a_b*row4[2];
+ outF[3]= ma_mb*row1[3] + a_mb*row3[3] + ma_b*row2[3]+ a_b*row4[3];
+ }
+ if (do_rect) {
+ // sample including outside of edges of image
+ if (x1<0 || y1<0) row1I= emptyI;
+ else row1I= (unsigned char *)in->rect + in->x * y1 * 4 + 4*x1;
+
+ if (x1<0 || y2>in->y-1) row2I= emptyI;
+ else row2I= (unsigned char *)in->rect + in->x * y2 * 4 + 4*x1;
+
+ if (x2>in->x-1 || y1<0) row3I= emptyI;
+ else row3I= (unsigned char *)in->rect + in->x * y1 * 4 + 4*x2;
+
+ 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_b= a*b; ma_b= (1.0f-a)*b; a_mb= a*(1.0f-b); ma_mb= (1.0f-a)*(1.0f-b);
+
+ outI[0]= ma_mb*row1I[0] + a_mb*row3I[0] + ma_b*row2I[0]+ a_b*row4I[0];
+ outI[1]= ma_mb*row1I[1] + a_mb*row3I[1] + ma_b*row2I[1]+ a_b*row4I[1];
+ outI[2]= ma_mb*row1I[2] + a_mb*row3I[2] + ma_b*row2I[2]+ a_b*row4I[2];
+ outI[3]= ma_mb*row1I[3] + a_mb*row3I[3] + ma_b*row2I[3]+ a_b*row4I[3];
+ }
+}
+
+/* function assumes out to be zero'ed, only does RGBA */
+/* NEAREST INTERPOLATION */
+void neareast_interpolation(ImBuf *in, ImBuf *out, float u, float v,int xout, int yout)
+{
+ float *outF,*dataF;
+ unsigned char *dataI,*outI;
+ int y1, x1;
+ int do_rect, do_float;
+
+ if (in==NULL) return;
+ if (in->rect==NULL && in->rect_float==NULL) return;
+
+ do_rect= (out->rect != NULL);
+ do_float= (out->rect_float != NULL);
+
+ x1= (int)(u);
+ y1= (int)(v);
+
+ if (do_rect)
+ outI=(unsigned char *)out->rect + out->x * yout * 4 + 4*xout;
+ else
+ outI= NULL;
+ if (do_float)
+ outF=(float *)out->rect_float + out->x * yout * 4 + 4*xout;
+ else
+ outF= NULL;
+
+ // sample area entirely outside image?
+ if (x1<0 || x1>in->x-1 || y1<0 || y1>in->y-1) return;
+
+ // sample including outside of edges of image
+ if (x1<0 || y1<0) {
+ if (do_rect) {
+ outI[0]= 0;
+ outI[1]= 0;
+ outI[2]= 0;
+ outI[3]= 0;
+ }
+ if (do_float) {
+ outF[0]= 0.0f;
+ outF[1]= 0.0f;
+ outF[2]= 0.0f;
+ outF[3]= 0.0f;
+ }
+ } else {
+ dataI= (unsigned char *)in->rect + in->x * y1 * 4 + 4*x1;
+ if (do_rect) {
+ outI[0]= dataI[0];
+ outI[1]= dataI[1];
+ outI[2]= dataI[2];
+ outI[3]= dataI[3];
+ }
+ dataF= in->rect_float + in->x * y1 * 4 + 4*x1;
+ if (do_float) {
+ outF[0]= dataF[0];
+ outF[1]= dataF[1];
+ outF[2]= dataF[2];
+ outF[3]= dataF[3];
+ }
+ }
+}
diff --git a/source/blender/imbuf/intern/imginfo.c b/source/blender/imbuf/intern/imginfo.c
new file mode 100644
index 00000000000..37bde9e5ac3
--- /dev/null
+++ b/source/blender/imbuf/intern/imginfo.c
@@ -0,0 +1,158 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2005 Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Austin Benesh. Ton Roosendaal.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "BLI_blenlib.h"
+#include "MEM_guardedalloc.h"
+
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+
+#include "IMB_imginfo.h"
+
+
+
+void IMB_imginfo_free(struct ImBuf* img)
+{
+ ImgInfo *info;
+
+ if (!img)
+ return;
+ if (!img->img_info) {
+ return;
+ }
+ info = img->img_info;
+ while (info) {
+ ImgInfo* next = info->next;
+ MEM_freeN(info->key);
+ MEM_freeN(info->value);
+ MEM_freeN(info);
+ info = next;
+ }
+}
+
+int IMB_imginfo_get_field(struct ImBuf* img, const char* key, char* field, int len)
+{
+ ImgInfo *info;
+ int retval = 0;
+
+ if (!img)
+ return 0;
+ if (!img->img_info) {
+ return 0;
+ }
+ info = img->img_info;
+ while (info) {
+ if (strcmp(key, info->key) == 0) {
+ BLI_strncpy(field, info->value, len);
+ retval = 1;
+ break;
+ }
+ info = info->next;
+ }
+ return retval;
+}
+
+int IMB_imginfo_add_field(struct ImBuf* img, const char* key, const char* field)
+{
+ ImgInfo *info;
+ ImgInfo *last;
+
+ if (!img)
+ return 0;
+
+ if (!img->img_info) {
+ img->img_info = MEM_callocN(sizeof(ImgInfo), "ImgInfo");
+ info = img->img_info;
+ } else {
+ info = img->img_info;
+ last = info;
+ while (info) {
+ last = info;
+ info = info->next;
+ }
+ info = MEM_callocN(sizeof(ImgInfo), "ImgInfo");
+ last->next = info;
+ }
+ info->key = BLI_strdup(key);
+ info->value = BLI_strdup(field);
+ return 1;
+}
+
+int IMB_imginfo_del_field(struct ImBuf *img, const char *key)
+{
+ ImgInfo *p, *p1;
+
+ if ((!img) || (!img->img_info))
+ return (0);
+
+ p = img->img_info;
+ p1 = NULL;
+ while (p) {
+ if (!strcmp (key, p->key)) {
+ if (p1)
+ p1->next = p->next;
+ else
+ img->img_info = p->next;
+
+ MEM_freeN(p->key);
+ MEM_freeN(p->value);
+ MEM_freeN(p);
+ return (1);
+ }
+ p1 = p;
+ p = p->next;
+ }
+ return (0);
+}
+
+int IMB_imginfo_change_field(struct ImBuf *img, const char *key, const char *field)
+{
+ ImgInfo *p;
+
+ if (!img)
+ return (0);
+
+ if (!img->img_info)
+ return (IMB_imginfo_add_field (img, key, field));
+
+ p = img->img_info;
+ while (p) {
+ if (!strcmp (key, p->key)) {
+ MEM_freeN (p->value);
+ p->value = BLI_strdup (field);
+ return (1);
+ }
+ p = p->next;
+ }
+
+ return (IMB_imginfo_add_field (img, key, field));
+}
diff --git a/source/blender/imbuf/intern/jpeg.c b/source/blender/imbuf/intern/jpeg.c
index cd90adda27a..1774aa7c156 100644
--- a/source/blender/imbuf/intern/jpeg.c
+++ b/source/blender/imbuf/intern/jpeg.c
@@ -345,7 +345,7 @@ static ImBuf * ibJpegImageFromCinfo(struct jpeg_decompress_struct * cinfo, int f
return(ibuf);
}
-ImBuf * imb_ibJpegImageFromFilename (char * filename, int flags)
+ImBuf * imb_ibJpegImageFromFilename (const char * filename, int flags)
{
struct jpeg_decompress_struct _cinfo, *cinfo = &_cinfo;
struct jpeg_error_mgr jerr;
diff --git a/source/blender/imbuf/intern/md5.c b/source/blender/imbuf/intern/md5.c
new file mode 100644
index 00000000000..a3165467b53
--- /dev/null
+++ b/source/blender/imbuf/intern/md5.c
@@ -0,0 +1,361 @@
+/* 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.
+
+ 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, 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+# include <stdlib.h>
+# include <string.h>
+
+#include "md5.h"
+
+#ifdef WORDS_BIGENDIAN
+# define SWAP(n) \
+ (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
+#else
+# define SWAP(n) (n)
+#endif
+
+
+/* This array contains the bytes used to pad the buffer to the next
+ 64-byte boundary. (RFC 1321, 3.1: Step 1) */
+static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
+
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+void
+md5_init_ctx (ctx)
+ struct md5_ctx *ctx;
+{
+ ctx->A = 0x67452301;
+ ctx->B = 0xefcdab89;
+ ctx->C = 0x98badcfe;
+ ctx->D = 0x10325476;
+}
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result must
+ be in little endian byte order. */
+void *
+md5_read_ctx (ctx, resbuf)
+ const struct md5_ctx *ctx;
+ void *resbuf;
+{
+ ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
+ ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
+ ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
+ ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
+
+ return resbuf;
+}
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int
+md5_stream (stream, resblock)
+ FILE *stream;
+ void *resblock;
+{
+ /* Important: BLOCKSIZE must be a multiple of 64. */
+#define BLOCKSIZE 4096
+ struct md5_ctx ctx;
+ md5_uint32 len[2];
+ char buffer[BLOCKSIZE + 72];
+ size_t pad, sum;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ len[0] = 0;
+ len[1] = 0;
+
+ /* Iterate over full file contents. */
+ while (1)
+ {
+ /* We read the file in blocks of BLOCKSIZE bytes. One call of the
+ computation function processes the whole buffer so that with the
+ next round of the loop another block can be read. */
+ size_t n;
+ sum = 0;
+
+ /* Read block. Take care for partial reads. */
+ do
+ {
+ n = fread (buffer, 1, BLOCKSIZE - sum, stream);
+
+ sum += n;
+ }
+ while (sum < BLOCKSIZE && n != 0);
+ if (n == 0 && ferror (stream))
+ return 1;
+
+ /* RFC 1321 specifies the possible length of the file up to 2^64 bits.
+ Here we only compute the number of bytes. Do a double word
+ increment. */
+ len[0] += sum;
+ if (len[0] < sum)
+ ++len[1];
+
+ /* If end of file is reached, end the loop. */
+ if (n == 0)
+ break;
+
+ /* Process buffer with BLOCKSIZE bytes. Note that
+ BLOCKSIZE % 64 == 0
+ */
+ md5_process_block (buffer, BLOCKSIZE, &ctx);
+ }
+
+ /* We can copy 64 byte because the buffer is always big enough. FILLBUF
+ contains the needed bits. */
+ memcpy (&buffer[sum], fillbuf, 64);
+
+ /* Compute amount of padding bytes needed. Alignment is done to
+ (N + PAD) % 64 == 56
+ There is always at least one byte padded. I.e. even the alignment
+ is correctly aligned 64 padding bytes are added. */
+ pad = sum & 63;
+ pad = pad >= 56 ? 64 + 56 - pad : 56 - pad;
+
+ /* Put the 64-bit file length in *bits* at the end of the buffer. */
+ *(md5_uint32 *) &buffer[sum + pad] = SWAP (len[0] << 3);
+ *(md5_uint32 *) &buffer[sum + pad + 4] = SWAP ((len[1] << 3)
+ | (len[0] >> 29));
+
+ /* Process last bytes. */
+ md5_process_block (buffer, sum + pad + 8, &ctx);
+
+ /* Construct result in desired memory. */
+ md5_read_ctx (&ctx, resblock);
+ return 0;
+}
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *
+md5_buffer (buffer, len, resblock)
+ const char *buffer;
+ size_t len;
+ void *resblock;
+{
+ struct md5_ctx ctx;
+ char restbuf[64 + 72];
+ size_t blocks = len & ~63;
+ size_t pad, rest;
+
+ /* Initialize the computation context. */
+ md5_init_ctx (&ctx);
+
+ /* Process whole buffer but last len % 64 bytes. */
+ md5_process_block (buffer, blocks, &ctx);
+
+ /* REST bytes are not processed yet. */
+ rest = len - blocks;
+ /* Copy to own buffer. */
+ memcpy (restbuf, &buffer[blocks], rest);
+ /* Append needed fill bytes at end of buffer. We can copy 64 byte
+ because the buffer is always big enough. */
+ memcpy (&restbuf[rest], fillbuf, 64);
+
+ /* PAD bytes are used for padding to correct alignment. Note that
+ always at least one byte is padded. */
+ pad = rest >= 56 ? 64 + 56 - rest : 56 - rest;
+
+ /* Put length of buffer in *bits* in last eight bytes. */
+ *(md5_uint32 *) &restbuf[rest + pad] = (md5_uint32) SWAP (len << 3);
+ *(md5_uint32 *) &restbuf[rest + pad + 4] = (md5_uint32) SWAP (len >> 29);
+
+ /* Process last bytes. */
+ md5_process_block (restbuf, rest + pad + 8, &ctx);
+
+ /* Put result in desired memory area. */
+ return md5_read_ctx (&ctx, resblock);
+}
+
+
+/* These are the four functions used in the four steps of the MD5 algorithm
+ and defined in the RFC 1321. The first function is a little bit optimized
+ (as found in Colin Plumbs public domain implementation). */
+/* #define FF(b, c, d) ((b & c) | (~b & d)) */
+#define FF(b, c, d) (d ^ (b & (c ^ d)))
+#define FG(b, c, d) FF (d, b, c)
+#define FH(b, c, d) (b ^ c ^ d)
+#define FI(b, c, d) (c ^ (b | ~d))
+
+/* Process LEN bytes of BUFFER, accumulating context into CTX.
+ It is assumed that LEN % 64 == 0. */
+
+void
+md5_process_block (buffer, len, ctx)
+ const void *buffer;
+ size_t len;
+ struct md5_ctx *ctx;
+{
+ md5_uint32 correct_words[16];
+ const md5_uint32 *words = buffer;
+ size_t nwords = len / sizeof (md5_uint32);
+ const md5_uint32 *endp = words + nwords;
+ md5_uint32 A = ctx->A;
+ md5_uint32 B = ctx->B;
+ md5_uint32 C = ctx->C;
+ md5_uint32 D = ctx->D;
+
+ /* Process all bytes in the buffer with 64 bytes in each round of
+ the loop. */
+ while (words < endp)
+ {
+ md5_uint32 *cwp = correct_words;
+ md5_uint32 A_save = A;
+ md5_uint32 B_save = B;
+ md5_uint32 C_save = C;
+ md5_uint32 D_save = D;
+
+ /* First round: using the given function, the context and a constant
+ the next context is computed. Because the algorithms processing
+ unit is a 32-bit word and it is determined to work on words in
+ little endian byte order we perhaps have to change the byte order
+ before the computation. To reduce the work for the next steps
+ we store the swapped words in the array CORRECT_WORDS. */
+
+#define OP(a, b, c, d, s, T) \
+ do \
+ { \
+ a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
+ ++words; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* It is unfortunate that C does not provide an operator for
+ cyclic rotation. Hope the C compiler is smart enough. */
+#define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
+
+ /* Before we start, one word to the strange constants.
+ They are defined in RFC 1321 as
+
+ T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
+ */
+
+ /* Round 1. */
+ OP (A, B, C, D, 7, 0xd76aa478);
+ OP (D, A, B, C, 12, 0xe8c7b756);
+ OP (C, D, A, B, 17, 0x242070db);
+ OP (B, C, D, A, 22, 0xc1bdceee);
+ OP (A, B, C, D, 7, 0xf57c0faf);
+ OP (D, A, B, C, 12, 0x4787c62a);
+ OP (C, D, A, B, 17, 0xa8304613);
+ OP (B, C, D, A, 22, 0xfd469501);
+ OP (A, B, C, D, 7, 0x698098d8);
+ OP (D, A, B, C, 12, 0x8b44f7af);
+ OP (C, D, A, B, 17, 0xffff5bb1);
+ OP (B, C, D, A, 22, 0x895cd7be);
+ OP (A, B, C, D, 7, 0x6b901122);
+ OP (D, A, B, C, 12, 0xfd987193);
+ OP (C, D, A, B, 17, 0xa679438e);
+ OP (B, C, D, A, 22, 0x49b40821);
+
+ /* For the second to fourth round we have the possibly swapped words
+ in CORRECT_WORDS. Redefine the macro to take an additional first
+ argument specifying the function to use. */
+#undef OP
+#define OP(f, a, b, c, d, k, s, T) \
+ do \
+ { \
+ a += f (b, c, d) + correct_words[k] + T; \
+ CYCLIC (a, s); \
+ a += b; \
+ } \
+ while (0)
+
+ /* Round 2. */
+ OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
+ OP (FG, D, A, B, C, 6, 9, 0xc040b340);
+ OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
+ OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
+ OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
+ OP (FG, D, A, B, C, 10, 9, 0x02441453);
+ OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
+ OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
+ OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
+ OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
+ OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
+ OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
+ OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
+ OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
+ OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
+ OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+
+ /* Round 3. */
+ OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
+ OP (FH, D, A, B, C, 8, 11, 0x8771f681);
+ OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
+ OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
+ OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
+ OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
+ OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
+ OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
+ OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
+ OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
+ OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
+ OP (FH, B, C, D, A, 6, 23, 0x04881d05);
+ OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
+ OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
+ OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
+ OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
+
+ /* Round 4. */
+ OP (FI, A, B, C, D, 0, 6, 0xf4292244);
+ OP (FI, D, A, B, C, 7, 10, 0x432aff97);
+ OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
+ OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
+ OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
+ OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
+ OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
+ OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
+ OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
+ OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
+ OP (FI, C, D, A, B, 6, 15, 0xa3014314);
+ OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
+ OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
+ OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
+ OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
+ OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
+
+ /* Add the starting values of the context. */
+ A += A_save;
+ B += B_save;
+ C += C_save;
+ D += D_save;
+ }
+
+ /* Put checksum in context given as argument. */
+ ctx->A = A;
+ ctx->B = B;
+ ctx->C = C;
+ ctx->D = D;
+}
+
diff --git a/source/blender/imbuf/intern/md5.h b/source/blender/imbuf/intern/md5.h
new file mode 100644
index 00000000000..8b0d946430e
--- /dev/null
+++ b/source/blender/imbuf/intern/md5.h
@@ -0,0 +1,116 @@
+/* md5.h - Declaration of functions and data types used for MD5 sum
+ computing library functions.
+ Copyright (C) 1995 Free Software Foundation, Inc.
+
+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, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _MD5_H
+#define _MD5_H
+
+#include <stdio.h>
+
+#if defined HAVE_LIMITS_H || _LIBC
+# include <limits.h>
+#endif
+
+/* The following contortions are an attempt to use the C preprocessor
+ to determine an unsigned integral type that is 32 bits wide. An
+ alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+ doing that would require that the configure script compile and *run*
+ the resulting executable. Locally running cross-compiled executables
+ is usually not possible. */
+
+#if defined __STDC__ && __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+ This should be valid for all systems GNU cares about because
+ that doesn't include 16-bit systems, and only modern systems
+ (that certainly have <limits.h>) have 64+-bit integral types. */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+ typedef unsigned int md5_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+ typedef unsigned short md5_uint32;
+# else
+# if ULONG_MAX == UINT_MAX_32_BITS
+ typedef unsigned long md5_uint32;
+# else
+ /* The following line is intended to evoke an error.
+ Using #error is not portable enough. */
+ "Cannot determine unsigned 32-bit data type."
+# endif
+# endif
+#endif
+
+#undef __P
+#if defined (__STDC__) && __STDC__
+#define __P(x) x
+#else
+#define __P(x) ()
+#endif
+
+/* Structure to save state of computation between the single steps. */
+struct md5_ctx
+{
+ md5_uint32 A;
+ md5_uint32 B;
+ md5_uint32 C;
+ md5_uint32 D;
+};
+
+/*
+ * The following three functions are build up the low level used in
+ * the functions `md5_stream' and `md5_buffer'.
+ */
+
+/* Initialize structure containing state of computation.
+ (RFC 1321, 3.3: Step 3) */
+void md5_init_ctx __P ((struct md5_ctx *ctx));
+
+/* Starting with the result of former calls of this function (or the
+ initialzation function update the context for the next LEN bytes
+ starting at BUFFER.
+ It is necessary that LEN is a multiple of 64!!! */
+void md5_process_block __P ((const void *buffer, size_t len,
+ struct md5_ctx *ctx));
+
+/* Put result from CTX in first 16 bytes following RESBUF. The result is
+ always in little endian byte order, so that a byte-wise output yields
+ to the wanted ASCII representation of the message digest. */
+void *md5_read_ctx __P ((const struct md5_ctx *ctx, void *resbuf));
+
+
+/* Compute MD5 message digest for bytes read from STREAM. The
+ resulting message digest number will be written into the 16 bytes
+ beginning at RESBLOCK. */
+int md5_stream __P ((FILE *stream, void *resblock));
+
+/* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
+ result is always in little endian byte order, so that a byte-wise
+ output yields to the wanted ASCII representation of the message
+ digest. */
+void *md5_buffer __P ((const char *buffer, size_t len, void *resblock));
+
+#endif
+
diff --git a/source/blender/imbuf/intern/openexr/Makefile b/source/blender/imbuf/intern/openexr/Makefile
index 65b9a058e01..a3b79c951dd 100644
--- a/source/blender/imbuf/intern/openexr/Makefile
+++ b/source/blender/imbuf/intern/openexr/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/imbuf/openexr
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I../../../makesdna
diff --git a/source/blender/imbuf/intern/png.c b/source/blender/imbuf/intern/png.c
index 46c5232a61a..c77ff7ea56f 100644
--- a/source/blender/imbuf/intern/png.c
+++ b/source/blender/imbuf/intern/png.c
@@ -43,6 +43,7 @@
#include "IMB_allocimbuf.h"
#include "IMB_cmap.h"
+#include "IMB_imginfo.h"
#include "IMB_png.h"
typedef struct PNGReadStruct {
@@ -100,6 +101,7 @@ short imb_savepng(struct ImBuf *ibuf, char *name, int flags)
{
png_structp png_ptr;
png_infop info_ptr;
+
unsigned char *pixels = 0;
unsigned char *from, *to;
png_bytepp row_pointers = 0;
@@ -219,6 +221,34 @@ short imb_savepng(struct ImBuf *ibuf, char *name, int flags)
PNG_COMPRESSION_TYPE_DEFAULT,
PNG_FILTER_TYPE_DEFAULT);
+ /* image text info */
+ if (ibuf->img_info) {
+ png_text* imginfo;
+ ImgInfo* iptr;
+ int num_text = 0;
+ iptr = ibuf->img_info;
+ while (iptr) {
+ num_text++;
+ iptr = iptr->next;
+ }
+
+ imginfo = MEM_callocN(num_text*sizeof(png_text), "png_imginfo");
+ iptr = ibuf->img_info;
+ num_text = 0;
+ while (iptr) {
+
+ imginfo[num_text].compression = PNG_TEXT_COMPRESSION_NONE;
+ imginfo[num_text].key = iptr->key;
+ imginfo[num_text].text = iptr->value;
+ num_text++;
+ iptr = iptr->next;
+ }
+
+ png_set_text(png_ptr, info_ptr, imginfo, num_text);
+ MEM_freeN(imginfo);
+
+ }
+
// write the file header information
png_write_info(png_ptr, info_ptr);
@@ -409,6 +439,15 @@ struct ImBuf *imb_loadpng(unsigned char *mem, int size, int flags)
break;
}
+ if (flags & IB_imginfo) {
+ png_text* text_chunks;
+ int count = png_get_text(png_ptr, info_ptr, &text_chunks, NULL);
+ for(i = 0; i < count; i++) {
+ IMB_imginfo_add_field(ibuf, text_chunks[i].key, text_chunks[i].text);
+ ibuf->flags |= IB_imginfo;
+ }
+ }
+
png_read_end(png_ptr, info_ptr);
}
diff --git a/source/blender/imbuf/intern/radiance_hdr.c b/source/blender/imbuf/intern/radiance_hdr.c
index 75be790a4cc..3cb9ca79ffc 100644
--- a/source/blender/imbuf/intern/radiance_hdr.c
+++ b/source/blender/imbuf/intern/radiance_hdr.c
@@ -161,8 +161,10 @@ static void FLOAT2RGBE(fCOLOR fcol, RGBE rgbe)
int imb_is_a_hdr(void *buf)
{
- /* For recognition, Blender only loades first 32 bytes, so use #?RADIANCE id instead */
- if (strstr((char*)buf, "#?RADIANCE")) return 1;
+ // For recognition, Blender only loads first 32 bytes, so use #?RADIANCE id instead
+ // update: actually, the 'RADIANCE' part is just an optional program name, the magic word is really only the '#?' part
+ //if (strstr((char*)buf, "#?RADIANCE")) return 1;
+ if (strstr((char*)buf, "#?")) return 1;
// if (strstr((char*)buf, "32-bit_rle_rgbe")) return 1;
return 0;
}
@@ -176,7 +178,6 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags)
int found=0;
int width=0, height=0;
int x, y;
- int ir, ig, ib;
unsigned char* ptr;
unsigned char* rect;
char oriY[80], oriX[80];
@@ -225,18 +226,14 @@ struct ImBuf *imb_loadhdr(unsigned char *mem, int size, int flags)
*rect_float++ = fcol[GRN];
*rect_float++ = fcol[BLU];
*rect_float++ = 1.0f;
-
/* Also old oldstyle for the rest of blender which is not using floats yet */
-/* very weird mapping! (ton) */
- fcol[RED] = 1.f-exp(fcol[RED]*-1.414213562f);
- fcol[GRN] = 1.f-exp(fcol[GRN]*-1.414213562f);
- fcol[BLU] = 1.f-exp(fcol[BLU]*-1.414213562f);
- ir = (int)(255.f*pow(fcol[RED], 0.45454545f));
- ig = (int)(255.f*pow(fcol[GRN], 0.45454545f));
- ib = (int)(255.f*pow(fcol[BLU], 0.45454545f));
- *rect++ = (unsigned char)((ir<0) ? 0 : ((ir>255) ? 255 : ir));
- *rect++ = (unsigned char)((ig<0) ? 0 : ((ig>255) ? 255 : ig));
- *rect++ = (unsigned char)((ib<0) ? 0 : ((ib>255) ? 255 : ib));
+ // e: changed to simpler tonemapping, previous code was rather slow (is this actually still relevant at all?)
+ fcol[RED] = fcol[RED]/(1.f + fcol[RED]);
+ fcol[GRN] = fcol[GRN]/(1.f + fcol[GRN]);
+ fcol[BLU] = fcol[BLU]/(1.f + fcol[BLU]);
+ *rect++ = (unsigned char)((fcol[RED] < 0.f) ? 0 : ((fcol[RED] > 1.f) ? 255 : (255.f*fcol[RED])));
+ *rect++ = (unsigned char)((fcol[GRN] < 0.f) ? 0 : ((fcol[GRN] > 1.f) ? 255 : (255.f*fcol[GRN])));
+ *rect++ = (unsigned char)((fcol[BLU] < 0.f) ? 0 : ((fcol[BLU] > 1.f) ? 255 : (255.f*fcol[BLU])));
*rect++ = 255;
}
}
@@ -328,10 +325,10 @@ static void writeHeader(FILE *file, int width, int height)
fputc(10, file);
fprintf(file, "# %s", "Created with Blender");
fputc(10, file);
- fprintf(file, "FORMAT=32-bit_rle_rgbe");
- fputc(10, file);
fprintf(file, "EXPOSURE=%25.13f", 1.0);
fputc(10, file);
+ fprintf(file, "FORMAT=32-bit_rle_rgbe");
+ fputc(10, file);
fputc(10, file);
fprintf(file, "-Y %d +X %d", height, width);
fputc(10, file);
diff --git a/source/blender/imbuf/intern/readimage.c b/source/blender/imbuf/intern/readimage.c
index bfa6200d23b..ec0f17a8c2b 100644
--- a/source/blender/imbuf/intern/readimage.c
+++ b/source/blender/imbuf/intern/readimage.c
@@ -59,6 +59,10 @@
#include "openexr/openexr_api.h"
#endif
+#ifdef WITH_DDS
+#include "dds/dds_api.h"
+#endif
+
#ifdef WITH_QUICKTIME
#if defined(_WIN32) || defined (__APPLE__)
#include "quicktime_import.h"
@@ -153,6 +157,11 @@ ImBuf *IMB_ibImageFromMemory(int *mem, int size, int flags) {
ibuf = imb_load_openexr((uchar *)mem, size, flags);
if (ibuf) return (ibuf);
#endif
+
+#ifdef WITH_DDS
+ ibuf = imb_load_dds((uchar *)mem, size, flags);
+ if (ibuf) return (ibuf);
+#endif
#ifdef WITH_QUICKTIME
#if defined(_WIN32) || defined (__APPLE__)
@@ -259,7 +268,7 @@ struct ImBuf *IMB_loadifffile(int file, int flags) {
}
-struct ImBuf *IMB_loadiffname(char *naam, int flags) {
+struct ImBuf *IMB_loadiffname(const char *naam, int flags) {
int file;
struct ImBuf *ibuf;
int buf[1];
diff --git a/source/blender/imbuf/intern/rectop.c b/source/blender/imbuf/intern/rectop.c
index 85c5e07bb8e..63de3bd2355 100644
--- a/source/blender/imbuf/intern/rectop.c
+++ b/source/blender/imbuf/intern/rectop.c
@@ -517,3 +517,85 @@ void IMB_rectfill(struct ImBuf *drect, float col[4])
}
}
+/* maybe we should use BKE_utildefines.h */
+#define FTOCHAR(val) (val<=0.0f ? 0: (val>=1.0f ? 255: (char)(255.99f*val)))
+#define CLAMP(a, b, c) if((a)<(b)) (a)=(b); else if((a)>(c)) (a)=(c)
+#define SWAP(type, a, b) { type sw_ap; sw_ap=(a); (a)=(b); (b)=sw_ap; }
+
+void buf_rectfill_area(unsigned char *rect, float *rectf, int width, int height, float *col, int x1, int y1, int x2, int y2)
+{
+ int i, j;
+ float a, ai;
+ if ((!rect && !rectf) || (!col) || col[3]==0.0)
+ return;
+
+ /* sanity checks for coords */
+ CLAMP(x1, 0, width);
+ CLAMP(x2, 0, width);
+ CLAMP(y1, 0, height);
+ CLAMP(y2, 0, height);
+
+ if (x1>x2) SWAP(int,x1,x2);
+ if (y1>y2) SWAP(int,y1,y2);
+ if (x1==x2 || y1==y2) return;
+
+ a = col[3];
+ ai = 1-a;
+
+
+ if (rect) {
+ unsigned char *pixel;
+ unsigned char chr=0, chg=0, chb=0;
+ float fr=0, fg=0, fb=0;
+
+ if (a == 1.0) {
+ chr = FTOCHAR(col[0]);
+ chg = FTOCHAR(col[1]);
+ chb = FTOCHAR(col[2]);
+ } else {
+ fr = col[0]*a;
+ fg = col[1]*a;
+ fb = col[2]*a;
+ }
+ for (j = 0; j < y2-y1; j++) {
+ 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) {
+ pixel[0] = chr;
+ pixel[1] = chg;
+ pixel[2] = chb;
+ } else {
+ pixel[0] = (char)(fr + ((float)pixel[0]*ai));
+ pixel[1] = (char)(fg + ((float)pixel[1]*ai));
+ pixel[2] = (char)(fb + ((float)pixel[2]*ai));
+ }
+ }
+ }
+ }
+ }
+
+ if (rectf) {
+ float *pixel;
+ 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) {
+ pixel[0] = col[0];
+ pixel[1] = col[1];
+ pixel[2] = col[2];
+ } else {
+ pixel[0] = (col[0]*a) + (pixel[0]*ai);
+ pixel[1] = (col[1]*a) + (pixel[1]*ai);
+ pixel[2] = (col[2]*a) + (pixel[2]*ai);
+ }
+ }
+ }
+ }
+}
+
+void IMB_rectfill_area(struct ImBuf *ibuf, float *col, int x1, int y1, int x2, int y2)
+{
+ if (!ibuf) return;
+ buf_rectfill_area((unsigned char *) ibuf->rect, ibuf->rect_float, ibuf->x, ibuf->y, col, x1, y1, x2, y2);
+}
diff --git a/source/blender/imbuf/intern/rotate.c b/source/blender/imbuf/intern/rotate.c
index 13edfbf0a33..42b30d6284f 100644
--- a/source/blender/imbuf/intern/rotate.c
+++ b/source/blender/imbuf/intern/rotate.c
@@ -86,3 +86,35 @@ void IMB_flipy(struct ImBuf * ibuf)
MEM_freeN(line);
if(linef) MEM_freeN(linef);
}
+
+void IMB_flipx(struct ImBuf * ibuf)
+{
+ short x, y, xr, xl, yi;
+ unsigned int px;
+ float px_f[4];
+
+ if (ibuf == NULL) return;
+
+ x = ibuf->x;
+ y = ibuf->y;
+
+ if (ibuf->rect) {
+ for(yi=y-1;yi>=0;yi--) {
+ for(xr=x-1, xl=0; xr>=xl; xr--, xl++) {
+ px = ibuf->rect[(x*yi)+xr];
+ ibuf->rect[(x*yi)+xr] = ibuf->rect[(x*yi)+xl];
+ ibuf->rect[(x*yi)+xl] = px;
+ }
+ }
+ }
+
+ if (ibuf->rect_float) {
+ for(yi=y-1;yi>=0;yi--) {
+ for(xr=x-1, xl=0; xr>=xl; xr--, xl++) {
+ memcpy(&px_f, &ibuf->rect_float[((x*yi)+xr)*4], 4*sizeof(float));
+ memcpy(&ibuf->rect_float[((x*yi)+xr)*4], &ibuf->rect_float[((x*yi)+xl)*4], 4*sizeof(float));
+ memcpy(&ibuf->rect_float[((x*yi)+xl)*4], &px_f, 4*sizeof(float));
+ }
+ }
+ }
+}
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
new file mode 100644
index 00000000000..131d2ef38f7
--- /dev/null
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -0,0 +1,459 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Andrea Weikert.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "BKE_global.h"
+#include "BKE_utildefines.h"
+#include "BLI_blenlib.h"
+#include "MEM_guardedalloc.h"
+
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+#include "IMB_thumbs.h"
+#include "IMB_imginfo.h"
+
+
+#include "md5.h"
+
+#ifdef WIN32
+#include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
+#ifndef _WIN32_IE
+#define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
+#endif
+#include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff because 'near' is disabled through BLI_windstuff */
+#include "BLI_winstuff.h"
+#include <process.h> /* getpid */
+#include <direct.h> /* chdir */
+#else
+#include <unistd.h>
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+
+#define URI_MAX FILE_MAX*3 + 8
+
+static int get_thumb_dir( char* dir , ThumbSize size)
+{
+#ifdef WIN32
+ /* yes, applications shouldn't store data there, but so does GIMP :)*/
+ SHGetSpecialFolderPath(0, dir, CSIDL_PROFILE, 0);
+#else
+ char* home = getenv("HOME");
+ if (!home) return 0;
+ BLI_strncpy(dir, home, FILE_MAX);
+#endif
+ switch(size) {
+ case THB_NORMAL:
+ strcat(dir, "/.thumbnails/normal");
+ break;
+ case THB_LARGE:
+ strcat(dir, "/.thumbnails/large");
+ break;
+ case THB_FAIL:
+ strcat(dir, "/.thumbnails/fail/blender");
+ break;
+ default:
+ return 0; /* unknown size */
+ }
+ BLI_cleanup_dir(G.sce, dir);
+ return 1;
+}
+
+/** ----- begin of adapted code from glib ---
+ * The following code is adapted from function g_escape_uri_string from the gnome glib
+ * Source: http://svn.gnome.org/viewcvs/glib/trunk/glib/gconvert.c?view=markup
+ * released under the Gnu General Public License.
+ */
+typedef enum {
+ UNSAFE_ALL = 0x1, /* Escape all unsafe characters */
+ UNSAFE_ALLOW_PLUS = 0x2, /* Allows '+' */
+ UNSAFE_PATH = 0x8, /* Allows '/', '&', '=', ':', '@', '+', '$' and ',' */
+ UNSAFE_HOST = 0x10, /* Allows '/' and ':' and '@' */
+ UNSAFE_SLASHES = 0x20 /* Allows all characters except for '/' and '%' */
+} UnsafeCharacterSet;
+
+static const unsigned char acceptable[96] = {
+ /* A table of the ASCII chars from space (32) to DEL (127) */
+ /* ! " # $ % & ' ( ) * + , - . / */
+ 0x00,0x3F,0x20,0x20,0x28,0x00,0x2C,0x3F,0x3F,0x3F,0x3F,0x2A,0x28,0x3F,0x3F,0x1C,
+ /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */
+ 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x38,0x20,0x20,0x2C,0x20,0x20,
+ /* @ A B C D E F G H I J K L M N O */
+ 0x38,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
+ /* P Q R S T U V W X Y Z [ \ ] ^ _ */
+ 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x20,0x3F,
+ /* ` a b c d e f g h i j k l m n o */
+ 0x20,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
+ /* p q r s t u v w x y z { | } ~ DEL */
+ 0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x20,0x20,0x20,0x3F,0x20
+};
+
+static const char hex[17] = "0123456789abcdef";
+
+/* Note: This escape function works on file: URIs, but if you want to
+ * escape something else, please read RFC-2396 */
+void escape_uri_string (const char *string, char* escaped_string, int len,UnsafeCharacterSet mask)
+{
+#define ACCEPTABLE(a) ((a)>=32 && (a)<128 && (acceptable[(a)-32] & use_mask))
+
+ const char *p;
+ char *q;
+ int c;
+ UnsafeCharacterSet use_mask;
+ use_mask = mask;
+
+ for (q = escaped_string, p = string; (*p != '\0') && len; p++) {
+ c = (unsigned char) *p;
+ len--;
+
+ if (!ACCEPTABLE (c)) {
+ *q++ = '%'; /* means hex coming */
+ *q++ = hex[c >> 4];
+ *q++ = hex[c & 15];
+ } else {
+ *q++ = *p;
+ }
+ }
+
+ *q = '\0';
+}
+
+void to_hex_char(char* hexbytes, const unsigned char* bytes, int len)
+{
+ const unsigned char *p;
+ char *q;
+
+ for (q = hexbytes, p = bytes; len; p++) {
+ const unsigned char c = (unsigned char) *p;
+ len--;
+ *q++ = hex[c >> 4];
+ *q++ = hex[c & 15];
+ }
+}
+
+/** ----- end of adapted code from glib --- */
+
+static int uri_from_filename( const char *dir, const char *file, char *uri )
+{
+ char orig_uri[URI_MAX];
+ const char* dirstart = dir;
+
+#ifdef WIN32
+ {
+ char vol[3];
+
+ BLI_strncpy(orig_uri, "file:///", FILE_MAX);
+ if (strlen(dir) < 2 && dir[1] != ':') {
+ /* not a correct absolute path */
+ return 0;
+ }
+ /* on windows, using always uppercase drive/volume letter in uri */
+ vol[0] = (unsigned char)toupper(dir[0]);
+ vol[1] = ':';
+ vol[2] = '\0';
+ strcat(orig_uri, vol);
+ dirstart += 2;
+ }
+#else
+ BLI_strncpy(orig_uri, "file://", FILE_MAX);
+#endif
+ strcat(orig_uri, dirstart);
+ strcat(orig_uri, file);
+ BLI_char_switch(orig_uri, '\\', '/');
+
+#ifdef WITH_ICONV
+ {
+ char uri_utf8[FILE_MAX*3+8];
+ escape_uri_string(orig_uri, uri_utf8, FILE_MAX*3+8, UNSAFE_PATH);
+ BLI_string_to_utf8(uri_utf8, uri, NULL);
+ }
+#else
+ escape_uri_string(orig_uri, uri, FILE_MAX*3+8, UNSAFE_PATH);
+#endif
+ return 1;
+}
+
+static void thumbname_from_uri(const char* uri, char* thumb)
+{
+ char hexdigest[33];
+ unsigned char digest[16];
+
+ md5_buffer( uri, strlen(uri), digest);
+ hexdigest[0] = '\0';
+ to_hex_char(hexdigest, digest, 16);
+ hexdigest[32] = '\0';
+ sprintf(thumb, "%s.png", hexdigest);
+}
+
+static int thumbpath_from_uri(const char* uri, char* path, ThumbSize size)
+{
+ char tmppath[FILE_MAX];
+ int rv = 0;
+
+ if (get_thumb_dir(tmppath, size)) {
+ char thumb[40];
+ thumbname_from_uri(uri, thumb);
+ BLI_snprintf(path, FILE_MAX, "%s%s", tmppath, thumb);
+ rv = 1;
+ }
+ return rv;
+}
+
+
+/* create thumbnail for file and returns new imbuf for thumbnail */
+ImBuf* IMB_thumb_create(const char* dir, const char* file, ThumbSize size, ThumbSource source)
+{
+ ImBuf *img = 0;
+ char uri[URI_MAX];
+ char desc[URI_MAX+22];
+ char tpath[FILE_MAX];
+ char tdir[FILE_MAX];
+ char wdir[FILE_MAX];
+ char temp[FILE_MAX];
+ char mtime[40];
+ char cwidth[40];
+ char cheight[40];
+ char thumb[40];
+ short tsize = 128;
+ short ex, ey;
+ float scaledx, scaledy;
+ struct stat info;
+
+ switch(size) {
+ case THB_NORMAL:
+ tsize = 128;
+ break;
+ case THB_LARGE:
+ tsize = 256;
+ break;
+ case THB_FAIL:
+ tsize = 0;
+ break;
+ default:
+ return 0; /* unknown size */
+ }
+
+ uri_from_filename(dir, file,uri);
+ thumbname_from_uri(uri, thumb);
+ if (get_thumb_dir(tdir, size)) {
+ 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(thumb, dir, strlen(dir)) == 0) {
+ return NULL;
+ }
+ if (size == THB_FAIL) {
+ img = IMB_allocImBuf(0,0,32, IB_rect | IB_imginfo, 0);
+ if (!img) return 0;
+ } else {
+ if (THB_SOURCE_IMAGE == source) {
+ BLI_getwdN(wdir);
+ chdir(dir);
+ img = IMB_loadiffname(file, IB_rect | IB_imginfo);
+ if (img != NULL) {
+ stat(file, &info);
+ sprintf(mtime, "%ld", info.st_mtime);
+ sprintf(cwidth, "%d", img->x);
+ sprintf(cheight, "%d", img->y);
+ chdir(wdir);
+ }
+ } else if (THB_SOURCE_MOVIE == source) {
+ struct anim * anim = NULL;
+ BLI_getwdN(wdir);
+ chdir(dir);
+ anim = IMB_open_anim(file, IB_rect | IB_imginfo);
+ if (anim != NULL) {
+ img = IMB_anim_absolute(anim, 0);
+ if (img == NULL) {
+ printf("not an anim; %s\n", file);
+ } else {
+ IMB_freeImBuf(img);
+ img = IMB_anim_previewframe(anim);
+ }
+ IMB_free_anim(anim);
+ }
+ stat(file, &info);
+ sprintf(mtime, "%ld", info.st_mtime);
+ chdir(wdir);
+ }
+ if (!img) return 0;
+
+ if (img->x > img->y) {
+ scaledx = (float)tsize;
+ scaledy = ( (float)img->y/(float)img->x )*tsize;
+ }
+ else {
+ scaledy = (float)tsize;
+ scaledx = ( (float)img->x/(float)img->y )*tsize;
+ }
+ ex = (short)scaledx;
+ ey = (short)scaledy;
+
+ IMB_scaleImBuf(img, ex, ey);
+ }
+ sprintf(desc, "Thumbnail for %s", uri);
+ IMB_imginfo_change_field(img, "Description", desc);
+ IMB_imginfo_change_field(img, "Software", "Blender");
+ IMB_imginfo_change_field(img, "Thumb::URI", uri);
+ IMB_imginfo_change_field(img, "Thumb::MTime", mtime);
+ if (THB_SOURCE_IMAGE == source) {
+ IMB_imginfo_change_field(img, "Thumb::Image::Width", cwidth);
+ IMB_imginfo_change_field(img, "Thumb::Image::Height", cheight);
+ }
+ img->ftype = PNG;
+ img->depth = 32;
+ if (IMB_saveiff(img, temp, IB_rect | IB_imginfo)) {
+#ifndef WIN32
+ chmod(temp, S_IRUSR | S_IWUSR);
+#endif
+ BLI_rename(temp, tpath);
+ }
+
+ return img;
+ }
+ return img;
+}
+
+/* read thumbnail for file and returns new imbuf for thumbnail */
+ImBuf* IMB_thumb_read(const char* dir, const char* file, ThumbSize size)
+{
+ char thumb[FILE_MAX];
+ char uri[FILE_MAX*3+8];
+ ImBuf *img = 0;
+
+ if (!uri_from_filename(dir, file,uri)) {
+ return NULL;
+ }
+ if (thumbpath_from_uri(uri, thumb, size)) {
+ img = IMB_loadiffname(thumb, IB_rect | IB_imginfo);
+ }
+
+ return img;
+}
+
+/* delete all thumbs for the file */
+void IMB_thumb_delete(const char* dir, const char* file, ThumbSize size)
+{
+ char thumb[FILE_MAX];
+ char uri[FILE_MAX*3+8];
+
+ if (!uri_from_filename(dir, file,uri)) {
+ return;
+ }
+ if (thumbpath_from_uri(uri, thumb, size)) {
+ if (strncmp(thumb, dir, strlen(dir)) == 0) {
+ return;
+ }
+ if (BLI_exists(thumb)) {
+ BLI_delete(thumb, 0, 0);
+ }
+ }
+}
+
+
+/* create the thumb if necessary and manage failed and old thumbs */
+ImBuf* IMB_thumb_manage(const char* dir, const char* file, ThumbSize size, ThumbSource source)
+{
+ char path[FILE_MAX];
+ char thumb[FILE_MAX];
+ char uri[FILE_MAX*3+8];
+ struct stat st;
+ ImBuf* img = NULL;
+
+ BLI_join_dirfile(path, dir, file);
+ if (stat(path, &st)) {
+ return NULL;
+ }
+ if (!uri_from_filename(dir, file,uri)) {
+ return NULL;
+ }
+ if (thumbpath_from_uri(uri, thumb, THB_FAIL)) {
+ /* failure thumb exists, don't try recreating */
+ if (BLI_exists(thumb)) {
+ return NULL;
+ }
+ }
+
+ if (thumbpath_from_uri(uri, thumb, size)) {
+ if (strncmp(thumb, dir, strlen(dir)) == 0) {
+ img = IMB_loadiffname(path, IB_rect);
+ } else {
+ img = IMB_loadiffname(thumb, IB_rect | IB_imginfo);
+ if (img) {
+ char mtime[40];
+ if (!IMB_imginfo_get_field(img, "Thumb::MTime", mtime, 40)) {
+ /* illegal thumb, forget it! */
+ IMB_freeImBuf(img);
+ img = 0;
+ } else {
+ time_t t = atol(mtime);
+ if (st.st_mtime != t) {
+ /* recreate all thumbs */
+ IMB_freeImBuf(img);
+ img = 0;
+ IMB_thumb_delete(dir, file, THB_NORMAL);
+ IMB_thumb_delete(dir, file, THB_LARGE);
+ IMB_thumb_delete(dir, file, THB_FAIL);
+ img = IMB_thumb_create(dir, file, size, source);
+ if(!img){
+ /* thumb creation failed, write fail thumb */
+ img = IMB_thumb_create(dir, file, THB_FAIL, source);
+ if (img) {
+ /* we don't need failed thumb anymore */
+ IMB_freeImBuf(img);
+ img = 0;
+ }
+ }
+ }
+ }
+ } else {
+ img = IMB_thumb_create(dir, file, size, source);
+ if(!img){
+ /* thumb creation failed, write fail thumb */
+ img = IMB_thumb_create(dir, file, THB_FAIL, source);
+ if (img) {
+ /* we don't need failed thumb anymore */
+ IMB_freeImBuf(img);
+ img = 0;
+ }
+ }
+ }
+ }
+ }
+
+ return img;
+}
+
+
diff --git a/source/blender/imbuf/intern/util.c b/source/blender/imbuf/intern/util.c
index 69390951a25..4c7b5fec2c4 100644
--- a/source/blender/imbuf/intern/util.c
+++ b/source/blender/imbuf/intern/util.c
@@ -44,6 +44,11 @@
#include "IMB_targa.h"
#include "IMB_png.h"
+
+#ifdef WITH_DDS
+#include "dds/dds_api.h"
+#endif
+
#include "IMB_bmp.h"
#include "IMB_tiff.h"
#include "IMB_radiance_hdr.h"
@@ -113,6 +118,9 @@ static int IMB_ispic_name(char *name)
}
if (imb_is_a_png(buf)) return(PNG);
+#ifdef WITH_DDS
+ if (imb_is_a_dds((uchar *)buf)) return(DDS);
+#endif
if (imb_is_a_targa(buf)) return(TGA);
#ifdef WITH_OPENEXR
if (imb_is_a_openexr((uchar *)buf)) return(OPENEXR);
@@ -162,6 +170,9 @@ int IMB_ispic(char *filename)
|| BLI_testextensie(filename, ".rgb")
|| BLI_testextensie(filename, ".bmp")
|| BLI_testextensie(filename, ".png")
+#ifdef WITH_DDS
+ || BLI_testextensie(filename, ".dds")
+#endif
|| BLI_testextensie(filename, ".iff")
|| BLI_testextensie(filename, ".lbm")
|| BLI_testextensie(filename, ".gif")
@@ -188,6 +199,9 @@ int IMB_ispic(char *filename)
|| BLI_testextensie(filename, ".bmp")
|| BLI_testextensie(filename, ".png")
|| BLI_testextensie(filename, ".cin")
+#ifdef WITH_DDS
+ || BLI_testextensie(filename, ".dds")
+#endif
#ifdef WITH_BF_OPENEXR
|| BLI_testextensie(filename, ".exr")
#endif
@@ -251,6 +265,7 @@ static int isffmpeg (char *filename) {
if( BLI_testextensie(filename, ".swf") ||
BLI_testextensie(filename, ".jpg") ||
BLI_testextensie(filename, ".png") ||
+ BLI_testextensie(filename, ".dds") ||
BLI_testextensie(filename, ".tga") ||
BLI_testextensie(filename, ".bmp") ||
BLI_testextensie(filename, ".exr") ||
diff --git a/source/blender/imbuf/intern/writeimage.c b/source/blender/imbuf/intern/writeimage.c
index 2e922c65827..ccca8e9f859 100644
--- a/source/blender/imbuf/intern/writeimage.c
+++ b/source/blender/imbuf/intern/writeimage.c
@@ -61,6 +61,9 @@
#ifdef WITH_OPENEXR
#include "openexr/openexr_api.h"
#endif
+#ifdef WITH_DDS
+#include "dds/dds_api.h"
+#endif
#include "IMB_iff.h"
#include "IMB_bitplanes.h"
@@ -115,6 +118,13 @@ short IMB_saveiff(struct ImBuf *ibuf, char *name, int flags)
return imb_save_openexr(ibuf, name, flags);
}
#endif
+/* not supported yet
+#ifdef WITH_DDS
+ if (IS_dds(ibuf)) {
+ return imb_save_dds(ibuf, name, flags);
+ }
+#endif
+*/
if (IS_cineon(ibuf)) {
return imb_savecineon(ibuf, name, flags);
diff --git a/source/blender/include/BDR_drawaction.h b/source/blender/include/BDR_drawaction.h
index fdbd710c59f..673b13672c1 100644
--- a/source/blender/include/BDR_drawaction.h
+++ b/source/blender/include/BDR_drawaction.h
@@ -41,6 +41,19 @@ struct bAction;
struct Object;
struct ListBase;
+/* ****************************** Base Structs ****************************** */
+
+/* Keyframe Column Struct */
+typedef struct ActKeyColumn {
+ struct ActKeyColumn *next, *prev;
+ short sel, handle_type;
+ float cfra;
+
+ /* only while drawing - used to determine if long-keyframe needs to be drawn */
+ short modified;
+ short totcurve;
+} ActKeyColumn;
+
/* 'Long Keyframe' Struct */
typedef struct ActKeyBlock {
struct ActKeyBlock *next, *prev;
@@ -53,9 +66,11 @@ typedef struct ActKeyBlock {
short totcurve;
} ActKeyBlock;
-/*Action Generics */
+
+/* ******************************* Methods ****************************** */
+
+/* Action Generics */
void draw_cfra_action(void);
-int count_action_levels (struct bAction *act);
/* Channel Drawing */
void draw_icu_channel(struct gla2DDrawInfo *di, struct IpoCurve *icu, float ypos);
@@ -65,9 +80,9 @@ void draw_object_channel(struct gla2DDrawInfo *di, Object *ob, float ypos);
/* Keydata Generation */
void icu_to_keylist(struct IpoCurve *icu, ListBase *keys, ListBase *blocks);
-int ipo_to_keylist(struct Ipo *ipo, ListBase *keys, ListBase *blocks);
-int action_to_keylist(bAction *act, ListBase *keys, ListBase *blocks);
-int ob_to_keylist(Object *ob, ListBase *keys, ListBase *blocks);
+void ipo_to_keylist(struct Ipo *ipo, ListBase *keys, ListBase *blocks);
+void action_to_keylist(bAction *act, ListBase *keys, ListBase *blocks);
+void ob_to_keylist(Object *ob, ListBase *keys, ListBase *blocks);
#endif /* BDR_DRAWACTION_H */
diff --git a/source/blender/include/BDR_drawmesh.h b/source/blender/include/BDR_drawmesh.h
index 60c87308e20..998cadc18a3 100644
--- a/source/blender/include/BDR_drawmesh.h
+++ b/source/blender/include/BDR_drawmesh.h
@@ -36,6 +36,7 @@
struct Image;
struct MTFace;
struct Object;
+struct DerivedMesh;
struct Mesh;
struct EdgeHash;
@@ -75,7 +76,7 @@ int set_tpage(struct MTFace *tface);
void texpaint_enable_mipmap(void);
void texpaint_disable_mipmap(void);
-void draw_tface_mesh(struct Object *ob, struct Mesh *me, int dt);
+void draw_mesh_textured(struct Object *ob, struct DerivedMesh *dm, int facesel);
struct EdgeHash *get_tface_mesh_marked_edge_info(struct Mesh *me);
void init_realtime_GL(void);
diff --git a/source/blender/include/BDR_editcurve.h b/source/blender/include/BDR_editcurve.h
index a8c36c3485b..70282aeb0c8 100644
--- a/source/blender/include/BDR_editcurve.h
+++ b/source/blender/include/BDR_editcurve.h
@@ -96,6 +96,9 @@ void add_primitiveNurb(int type);
void clear_tilt(void);
void clever_numbuts_curve(void);
int bezt_compare (const void *e1, const void *e2);
+void setweightNurb( void );
+void setradiusNurb( void );
+void smoothradiusNurb( void );
extern void undo_push_curve(char *name);
diff --git a/source/blender/include/BDR_editface.h b/source/blender/include/BDR_editface.h
index 31971da292b..72b0e7352da 100644
--- a/source/blender/include/BDR_editface.h
+++ b/source/blender/include/BDR_editface.h
@@ -34,10 +34,11 @@
#define BDR_EDITFACE_H
struct MTFace;
+struct EditFace;
struct Mesh;
struct MCol;
-struct MTFace *get_active_tface(struct MCol **mcol);
+struct MTFace *get_active_mtface(struct EditFace **efa, struct MCol **mcol, short sloppy);
void calculate_uv_map(unsigned short mapmode);
void default_uv(float uv[][2], float size);
void make_tfaces(struct Mesh *me);
@@ -52,7 +53,6 @@ int minmax_tface(float *min, float *max);
void face_select(void);
void face_borderselect(void);
void uv_autocalc_tface(void);
-void set_faceselect(void);
void set_texturepaint(void);
void get_same_uv(void);
void seam_mark_clear_tface(short mode);
diff --git a/source/blender/include/BDR_editobject.h b/source/blender/include/BDR_editobject.h
index 2a96a8d65cb..2fb0ad5aa88 100644
--- a/source/blender/include/BDR_editobject.h
+++ b/source/blender/include/BDR_editobject.h
@@ -65,6 +65,8 @@ void exit_editmode(int flag);
void check_editmode(int type);
void enter_editmode(int wc);
+void exit_paint_modes(void);
+
void docenter(int centermode);
void docenter_new(void);
void docenter_cursor(void);
diff --git a/source/blender/include/BDR_sculptmode.h b/source/blender/include/BDR_sculptmode.h
index 0e80a7f0185..c80f9ea8626 100644
--- a/source/blender/include/BDR_sculptmode.h
+++ b/source/blender/include/BDR_sculptmode.h
@@ -30,13 +30,15 @@
#ifndef BDR_SCULPTMODE_H
#define BDR_SCULPTMODE_H
+#include "DNA_listBase.h"
+#include "DNA_vec_types.h"
/* For bglMats */
#include "BIF_glutil.h"
-
#include "transform.h"
struct uiBlock;
struct BrushData;
+struct EditData;
struct IndexNode;
struct KeyBlock;
struct Mesh;
@@ -45,6 +47,7 @@ struct PartialVisibility;
struct Scene;
struct ScrArea;
struct SculptData;
+struct SculptStroke;
typedef enum PropsetMode {
PropsetNone = 0,
@@ -75,6 +78,11 @@ typedef struct SculptSession {
struct ListBase *vertex_users;
struct IndexNode *vertex_users_mem;
int vertex_users_size;
+
+ /* Used temporarily per-stroke */
+ float *vertexcosnos;
+ ListBase damaged_rects;
+ ListBase damaged_verts;
/* Used to cache the render of the active texture */
unsigned int texcache_w, texcache_h, *texcache;
@@ -83,6 +91,8 @@ typedef struct SculptSession {
/* For rotating around a pivot point */
vec3f pivot;
+
+ struct SculptStroke *stroke;
} SculptSession;
SculptSession *sculpt_session(void);
@@ -102,15 +112,26 @@ void sculptmode_propset(const unsigned short event);
void sculptmode_selectbrush_menu(void);
void sculptmode_draw_mesh(int);
void sculpt_paint_brush(char clear);
+void sculpt_stroke_draw();
struct BrushData *sculptmode_brush(void);
float tex_angle(void);
+void do_symmetrical_brush_actions(struct EditData *e, short *, short *);
void sculptmode_update_tex(void);
char sculpt_modifiers_active(struct Object *ob);
void sculpt(void);
void set_sculptmode(void);
+/* Stroke */
+void sculpt_stroke_new(const int max);
+void sculpt_stroke_free();
+void sculpt_stroke_add_point(const short x, const short y);
+void sculpt_stroke_apply(struct EditData *);
+void sculpt_stroke_apply_all(struct EditData *e);
+void sculpt_stroke_draw();
+
+
/* Partial Mesh Visibility */
struct PartialVisibility *sculptmode_copy_pmv(struct PartialVisibility *);
void sculptmode_pmv_free(struct PartialVisibility *);
diff --git a/source/blender/include/BIF_butspace.h b/source/blender/include/BIF_butspace.h
index f87e9797cb3..df60a0c9a08 100644
--- a/source/blender/include/BIF_butspace.h
+++ b/source/blender/include/BIF_butspace.h
@@ -83,6 +83,7 @@ extern void validate_editbonebutton_cb(void *bonev, void *namev);
#define TAB_OBJECT_OBJECT 0
#define TAB_OBJECT_PHYSICS 1
+#define TAB_OBJECT_PARTICLE 2
#define TAB_SCENE_RENDER 0
#define TAB_SCENE_WORLD 1
@@ -102,6 +103,38 @@ extern void validate_editbonebutton_cb(void *bonev, void *namev);
#define BUTS_ACT_LINK 256
+/* buttons grid */
+#define PANELX 320
+#define PANELY 0
+#define PANELW 318
+#define PANELH 204
+
+#define BUTW1 300
+#define BUTW2 145
+#define BUTW3 93
+#define BUTW4 67
+#define ICONBUTW 20
+#define BUTH 22
+
+#define YSPACE 6
+#define XSPACE 10
+#define PANEL_YMAX 210
+#define PANEL_XMAX 310
+
+#define X1CLM1 10
+
+#define X2CLM1 X1CLM1
+#define X2CLM2 165
+
+#define X3CLM1 X1CLM1
+#define X3CLM2 113
+#define X3CLM3 217
+
+#define X4CLM1 X1CLM1
+#define X4CLM2 77
+#define X4CLM3 165
+#define X4CLM4 232
+
#endif
diff --git a/source/blender/include/BIF_drawimage.h b/source/blender/include/BIF_drawimage.h
index 72562b76beb..44e40b8cabb 100644
--- a/source/blender/include/BIF_drawimage.h
+++ b/source/blender/include/BIF_drawimage.h
@@ -39,12 +39,16 @@ struct Render;
struct Image;
struct ImBuf;
struct uiBlock;
+struct MTFace;
void do_imagebuts(unsigned short event);
void calc_image_view(struct SpaceImage *sima, char mode);
void drawimagespace(struct ScrArea *sa, void *spacedata);
-void draw_tfaces(void);
-void image_changed(struct SpaceImage *sima, int dotile);
+void image_changed(struct SpaceImage *sima, struct Image *image);
+int draw_uvs_face_check(void);
+void tface_center(struct MTFace *tf, float cent[2], void * isquad);
+void draw_uvs_sima(void);
+void image_set_tile(struct SpaceImage *sima, int dotile);
void image_home(void);
void image_viewmove(int mode);
void image_viewzoom(unsigned short event, int invert);
@@ -64,6 +68,7 @@ void imagewin_store_spare(void);
struct ImBuf *imagewindow_get_ibuf(struct SpaceImage *sima);
void image_editvertex_buts(struct uiBlock *block);
+void image_editcursor_buts(struct uiBlock *block);
#endif
diff --git a/source/blender/include/BIF_drawseq.h b/source/blender/include/BIF_drawseq.h
index 986044d9c7e..4571267a09c 100644
--- a/source/blender/include/BIF_drawseq.h
+++ b/source/blender/include/BIF_drawseq.h
@@ -36,6 +36,7 @@
struct ScrArea;
struct Sequence;
+void drawprefetchseqspace(struct ScrArea *sa, void *spacedata);
void drawseqspace(struct ScrArea *sa, void *spacedata);
void set_special_seq_update(int val);
diff --git a/source/blender/include/BIF_editaction.h b/source/blender/include/BIF_editaction.h
index 838bbb5c34c..fe6f81b9416 100644
--- a/source/blender/include/BIF_editaction.h
+++ b/source/blender/include/BIF_editaction.h
@@ -25,7 +25,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): 2007, Joshua Leung, Action Editor Recode
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
@@ -41,14 +41,16 @@
#define ACTWIDTH (G.saction->actwidth)
/* Some types for easier type-testing */
-#define ACTTYPE_NONE 0
-#define ACTTYPE_ACHAN 1
-#define ACTTYPE_CONCHAN 2
-#define ACTTYPE_ICU 3
-#define ACTTYPE_FILLIPO 4
-#define ACTTYPE_FILLCON 5
-#define ACTTYPE_IPO 6
-#define ACTTYPE_SHAPEKEY 7
+enum {
+ ACTTYPE_NONE= 0,
+ ACTTYPE_ACHAN,
+ ACTTYPE_CONCHAN,
+ ACTTYPE_ICU,
+ ACTTYPE_FILLIPO,
+ ACTTYPE_FILLCON,
+ ACTTYPE_IPO,
+ ACTTYPE_SHAPEKEY
+};
/* Macros for easier/more consistant state testing */
#define VISIBLE_ACHAN(achan) ((achan->flag & ACHAN_HIDDEN)==0)
@@ -64,18 +66,31 @@
#define EDITABLE_ICU(icu) ((icu->flag & IPO_PROTECT)==0)
#define SEL_ICU(icu) (icu->flag & IPO_SELECT)
+#define NLA_ACTION_SCALED (G.saction->pin==0 && OBACT && OBACT->action)
+#define NLA_IPO_SCALED (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname)
+
/* constants for setting ipo-interpolation type */
-#define SET_IPO_POPUP 0
-#define SET_IPO_CONSTANT 1
-#define SET_IPO_LINEAR 2
-#define SET_IPO_BEZIER 3
+enum {
+ SET_IPO_MENU = -1,
+ SET_IPO_POPUP = 0,
+
+ SET_IPO_CONSTANT,
+ SET_IPO_LINEAR,
+ SET_IPO_BEZIER,
+};
/* constants for setting ipo-extrapolation type */
-#define SET_EXTEND_POPUP 10
-#define SET_EXTEND_CONSTANT 11
-#define SET_EXTEND_EXTRAPOLATION 12
-#define SET_EXTEND_CYCLIC 13
-#define SET_EXTEND_CYCLICEXTRAPOLATION 14
+enum {
+
+ SET_EXTEND_MENU = 9,
+ SET_EXTEND_POPUP = 10,
+
+ SET_EXTEND_CONSTANT,
+ SET_EXTEND_EXTRAPOLATION,
+ SET_EXTEND_CYCLIC,
+ SET_EXTEND_CYCLICEXTRAPOLATION
+};
+
struct bAction;
struct bActionChannel;
@@ -101,6 +116,11 @@ void column_select_action_keys(int mode);
void selectall_action_keys(short mval[], short mode, short selectmode);
void markers_selectkeys_between(void);
+/* Action Data Copying */
+void free_actcopybuf(void);
+void copy_actdata(void);
+void paste_actdata(void);
+
/* channel/strip operations */
void up_sel_action(void);
void down_sel_action(void);
@@ -109,7 +129,7 @@ void bottom_sel_action(void);
/* IPO/Handle Types */
void sethandles_action_keys(int code);
-void action_set_ipo_flags(int mode);
+void action_set_ipo_flags(short mode, short event);
/* Select */
void borderselect_action(void);
@@ -117,11 +137,12 @@ void deselect_action_keys(short test, short sel);
void deselect_action_channels(short test);
void deselect_actionchannels(struct bAction *act, short test);
int select_channel(struct bAction *act, struct bActionChannel *achan, int selectmode);
-void select_actionchannel_by_name (struct bAction *act, char *name, int select);
+void select_actionchannel_by_name(struct bAction *act, char *name, int select);
-/* */
+/* ShapeKey stuff */
struct Key *get_action_mesh_key(void);
int get_nearest_key_num(struct Key *key, short *mval, float *x);
+
void *get_nearest_act_channel(short mval[], short *ret_type);
/* Action */
diff --git a/source/blender/include/BIF_editarmature.h b/source/blender/include/BIF_editarmature.h
index b8ae90b7cfa..903c663e5f3 100644
--- a/source/blender/include/BIF_editarmature.h
+++ b/source/blender/include/BIF_editarmature.h
@@ -85,7 +85,7 @@ void deselectall_armature(int toggle, int doundo);
void deselectall_posearmature (struct Object *ob, int test, int doundo);
int draw_armature(struct Base *base, int dt);
void extrude_armature(int forked);
-void subdivide_armature(void);
+void subdivide_armature(int numcuts);
void free_editArmature(void);
@@ -106,10 +106,12 @@ void remake_editArmature(void);
void selectconnected_armature(void);
void selectconnected_posearmature(void);
void select_bone_parent(void);
-void unique_editbone_name (struct ListBase *ebones, char* name);
+void unique_editbone_name (struct ListBase *ebones, char *name);
-void auto_align_armature(void);
-void create_vgroups_from_armature(Object *ob, Object *par);
+void auto_align_armature(short mode);
+
+void create_vgroups_from_armature(struct Object *ob, struct Object *par);
+void add_verts_to_dgroups(struct Object *ob, struct Object *par, int heat, int mirror);
void hide_selected_pose_bones(void);
void hide_unselected_pose_bones(void);
@@ -137,3 +139,4 @@ void show_all_armature_bones(void);
#endif
+
diff --git a/source/blender/include/BIF_editconstraint.h b/source/blender/include/BIF_editconstraint.h
index db55bc5c7d7..b8977c00d89 100644
--- a/source/blender/include/BIF_editconstraint.h
+++ b/source/blender/include/BIF_editconstraint.h
@@ -38,6 +38,9 @@ struct ListBase;
struct Object;
struct bConstraint;
struct bConstraintChannel;
+struct Text;
+
+/* generic constraint editing functions */
struct bConstraint *add_new_constraint(short type);
@@ -53,10 +56,17 @@ void object_test_constraints(struct Object *owner);
void add_constraint(int only_IK);
void ob_clear_constraints(void);
-char *get_con_subtarget_name(struct bConstraint *con, struct Object *target);
-
void rename_constraint(struct Object *ob, struct bConstraint *con, char *newname);
+/* a few special functions for PyConstraints */
+char *buildmenu_pyconstraints(struct Text *con_text, int *pyconindex);
+void validate_pyconstraint_cb(void *arg1, void *arg2);
+void update_pyconstraint_cb(void *arg1, void *arg2);
+
+/* two special functions for ChildOf Constriant */
+void childof_const_setinv (void *conv, void *unused);
+void childof_const_clearinv(void *conv, void *unused);
+
#endif
diff --git a/source/blender/include/BIF_editmesh.h b/source/blender/include/BIF_editmesh.h
index 931693f0889..42d581ee758 100644
--- a/source/blender/include/BIF_editmesh.h
+++ b/source/blender/include/BIF_editmesh.h
@@ -35,6 +35,8 @@
#ifndef BIF_EDITMESH_H
#define BIF_EDITMESH_H
+#include "BKE_mesh.h"
+
struct EditMesh;
struct EditFace;
struct EditEdge;
@@ -141,7 +143,10 @@ extern void righthandfaces(int select);
extern void mouse_mesh(void);
extern void deselectall_mesh(void);
-extern void selectconnected_mesh(int qual);
+extern void selectconnected_mesh_all(void);
+extern void selectconnected_mesh(void);
+extern void selectconnected_delimit_mesh(void);
+extern void selectconnected_delimit_mesh_all(void);
extern void selectswap_mesh(void);
extern void hide_mesh(int swap);
@@ -169,7 +174,9 @@ extern void selectrandom_mesh(void);
extern void editmesh_select_by_material(int index);
extern void editmesh_deselect_by_material(int index);
+extern void Vertex_Menu(void);
extern void Edge_Menu(void);
+extern void Face_Menu(void);
extern void select_mesh_group_menu(void);
extern void editmesh_mark_seam(int clear);
extern void loop_multiselect(int looptype);
@@ -199,7 +206,7 @@ extern short sharesFace(struct EditEdge* e1, struct EditEdge* e2);
#define SUBDIV_SELECT_LOOPCUT 3
extern void convert_to_triface(int direction);
-extern int removedoublesflag(short flag, float limit);
+extern int removedoublesflag(short flag, short automerge, float limit);
extern void xsortvert_flag(int flag);
extern void hashvert_flag(int flag);
@@ -216,7 +223,13 @@ extern void join_triangles(void);
extern void edge_flip(void);
extern void fill_mesh(void);
extern void bevel_menu();
+void mesh_set_face_flags(short mode);
extern void mesh_set_smooth_faces(short event);
+extern void mesh_rotate_uvs(void);
+extern void mesh_mirror_uvs(void);
+extern void mesh_rotate_colors(void);
+extern void mesh_mirror_colors(void);
+void mesh_copy_menu(void);
void edge_rotate_selected(int dir);
int EdgeSlide(short immediate, float imperc);
int EdgeLoopDelete(void);
@@ -238,4 +251,15 @@ int merge_target( int target, int uvmerge);
void pathselect(void);
void loop_to_region(void);
void region_to_loop(void);
+
+UvVertMap *make_uv_vert_map_EM(int selected, int do_face_idx_array, float *limit);
+UvMapVert *get_uv_map_vert_EM(UvVertMap *vmap, unsigned int v);
+void free_uv_vert_map_EM(UvVertMap *vmap);
+
+int EM_texFaceCheck(void); /* can we edit UV's for this mesh?*/
+int EM_vertColorCheck(void); /* can we edit colors for this mesh?*/
+
+void EM_set_actFace(struct EditFace *efa);
+struct EditFace * EM_get_actFace(void);
+
#endif
diff --git a/source/blender/include/BIF_editparticle.h b/source/blender/include/BIF_editparticle.h
new file mode 100644
index 00000000000..879bdf19cba
--- /dev/null
+++ b/source/blender/include/BIF_editparticle.h
@@ -0,0 +1,92 @@
+/* BIF_editparticle.h
+ *
+ *
+ * $Id: BIF_editparticle.h $
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef BIF_EDITPARTICLE_H
+#define BIF_EDITPARTICLE_H
+
+struct Object;
+struct ParticleSystem;
+struct ParticleEditSettings;
+
+/* particle edit mode */
+void PE_set_particle_edit(void);
+void PE_create_particle_edit(struct Object *ob, struct ParticleSystem *psys);
+void PE_free_particle_edit(struct ParticleSystem *psys);
+
+void PE_change_act(void *ob_v, void *act_v);
+
+/* access */
+struct ParticleSystem *PE_get_current(struct Object *ob);
+short PE_get_current_num(struct Object *ob);
+int PE_minmax(float *min, float *max);
+void PE_get_colors(char sel[4], char nosel[4]);
+struct ParticleEditSettings *PE_settings(void);
+
+/* update calls */
+void PE_hide_keys_time(struct ParticleSystem *psys, float cfra);
+void PE_update_object(struct Object *ob, int useflag);
+void PE_update_selection(struct Object *ob);
+void PE_recalc_world_cos(struct Object *ob, struct ParticleSystem *psys);
+
+/* selection tools */
+void PE_select_root(void);
+void PE_select_tip(void);
+void PE_deselectall(void);
+void PE_select_linked(void);
+void PE_select_less(void);
+void PE_select_more(void);
+
+void PE_mouse_particles(void);
+void PE_borderselect(void);
+void PE_selectionCB(short selecting, struct Object *editobj, short *mval, float rad);
+void PE_do_lasso_select(short mcords[][2], short moves, short select);
+
+/* tools */
+void PE_hide(int mode);
+void PE_rekey(void);
+void PE_subdivide(void);
+int PE_brush_particles(void);
+void PE_delete_particle(void);
+void PE_remove_doubles(void);
+void PE_mirror_x(int tagged);
+
+/* undo */
+void PE_undo_push(char *str);
+void PE_undo_step(int step);
+void PE_undo(void);
+void PE_redo(void);
+void PE_undo_menu(void);
+
+#endif
+
diff --git a/source/blender/include/BIF_editseq.h b/source/blender/include/BIF_editseq.h
index 3999b4311d4..13cb059d885 100644
--- a/source/blender/include/BIF_editseq.h
+++ b/source/blender/include/BIF_editseq.h
@@ -40,17 +40,24 @@ void add_sequence(int type);
void borderselect_seq(void);
void boundbox_seq(void);
void change_sequence(void);
+void reload_sequence(void);
void update_seq_ipo_rect(struct Sequence * seq);
void update_seq_icu_rects(struct Sequence * seq);
struct Sequence* get_last_seq();
+struct Sequence* get_forground_frame_seq( int frame );
void set_last_seq(struct Sequence * seq);
void clear_last_seq();
void del_seq(void);
void enter_meta(void);
void exit_meta(void);
+struct Sequence* find_neighboring_sequence(struct Sequence *test, int lr, int sel);
+struct Sequence* find_next_prev_sequence(struct Sequence *test, int lr, int sel);
struct Sequence* find_nearest_seq(int *hand);
int insert_gap(int gap, int cfra);
void make_meta(void);
+void select_channel_direction(struct Sequence *test,int lr);
+void select_more_seq(void);
+void select_less_seq(void);
void mouse_select_seq(void);
void no_gaps(void);
void seq_snap(short event);
@@ -58,12 +65,69 @@ void seq_snap_menu(void);
void set_filter_seq(void);
void swap_select_seq(void);
void touch_seq_files(void);
+void seq_remap_paths(void);
void transform_seq(int mode, int context);
+void transform_seq_nomarker(int mode, int context);
void un_meta(void);
void seq_cut(int cutframe);
+void seq_separate_images(void);
void reassign_inputs_seq_effect(void);
+void select_surrounding_handles(struct Sequence *test);
+void select_surround_from_last();
+void select_dir_from_last(int lr);
+void select_neighbor_from_last(int lr);
+void select_linked_seq(int mode);
struct Sequence* alloc_sequence(ListBase *lb, int cfra, int machine); /*used from python*/
+int check_single_seq(struct Sequence *seq);
+/* sequence transform functions, for internal used */
+int seq_tx_get_start(struct Sequence *seq);
+int seq_tx_get_end(struct Sequence *seq);
+
+int seq_tx_get_final_left(struct Sequence *seq);
+int seq_tx_get_final_right(struct Sequence *seq);
+
+void seq_tx_set_final_left(struct Sequence *seq, int i);
+void seq_tx_set_final_right(struct Sequence *seq, int i);
+
+/* check if one side can be transformed */
+int seq_tx_check_left(struct Sequence *seq);
+int seq_tx_check_right(struct Sequence *seq);
+
+#define SEQ_DEBUG_INFO(seq) printf("seq into '%s' -- len:%i start:%i startstill:%i endstill:%i startofs:%i endofs:%i\n",\
+ seq->name, seq->len, seq->start, seq->startstill, seq->endstill, seq->startofs, seq->endofs)
+
+/* seq macro's for transform
+ notice the difference between start/end and left/right.
+
+ left and right are the bounds at which the setuence is rendered,
+start and end are from the start and fixed length of the sequence.
+*/
+/*
+#define SEQ_GET_START(seq) (seq->start)
+#define SEQ_GET_END(seq) (seq->start+seq->len)
+
+#define SEQ_GET_FINAL_LEFT(seq) ((seq->start - seq->startstill) + seq->startofs)
+#define SEQ_GET_FINAL_RIGHT(seq) (((seq->start+seq->len) + seq->endstill) - seq->endofs)
+
+#define SEQ_SET_FINAL_LEFT(seq, val) \
+ if (val < (seq)->start) { \
+ (seq)->startstill = abs(val - (seq)->start); \
+ (seq)->startofs = 0; \
+} else { \
+ (seq)->startofs = abs(val - (seq)->start); \
+ (seq)->startstill = 0; \
+}
+
+#define SEQ_SET_FINAL_RIGHT(seq, val) \
+ if (val > (seq)->start + (seq)->len) { \
+ (seq)->endstill = abs(val - ((seq)->start + (seq)->len)); \
+ (seq)->endofs = 0; \
+} else { \
+ (seq)->endofs = abs(val - ((seq)->start + (seq)->len)); \
+ (seq)->endstill = 0; \
+}
+*/
/* drawseq.c */
void do_seqbuttons(short);
diff --git a/source/blender/include/BIF_editsima.h b/source/blender/include/BIF_editsima.h
index ec274290c91..c0e28d7b1f1 100644
--- a/source/blender/include/BIF_editsima.h
+++ b/source/blender/include/BIF_editsima.h
@@ -31,7 +31,12 @@
*/
struct Mesh;
+struct EditMesh;
+struct SpaceImage;
+struct EditFace;
+struct MTFace;
+/* id can be from 0 to 3 */
#define TF_PIN_MASK(id) (TF_PIN1 << id)
#define TF_SEL_MASK(id) (TF_SEL1 << id)
@@ -45,27 +50,33 @@ int is_uv_tface_editing_allowed_silent(void);
void get_connected_limit_tface_uv(float *limit);
int minmax_tface_uv(float *min, float *max);
+int cent_tface_uv(float *cent, int mode);
void transform_width_height_tface_uv(int *width, int *height);
void transform_aspect_ratio_tface_uv(float *aspx, float *aspy);
+void mouseco_to_cursor_sima(void);
void borderselect_sima(short whichuvs);
void mouseco_to_curtile(void);
void mouse_select_sima(void);
+void snap_menu_sima(void);
+void aspect_sima(struct SpaceImage *sima, float *x, float *y);
+
void select_invert_tface_uv(void);
void select_swap_tface_uv(void);
void mirrormenu_tface_uv(void);
void mirror_tface_uv(char mirroraxis);
void hide_tface_uv(int swap);
void reveal_tface_uv(void);
-void stitch_uv_tface(int mode);
+void stitch_limit_uv_tface(void);
+void stitch_vert_uv_tface(void);
void unlink_selection(void);
+void uvface_setsel__internal(short select);
void select_linked_tface_uv(int mode);
-void toggle_uv_select(int mode);
void pin_tface_uv(int mode);
void weld_align_menu_tface_uv(void);
void weld_align_tface_uv(char tool);
-void be_square_tface_uv(struct Mesh *me);
+void be_square_tface_uv(struct EditMesh *em);
void select_pinned_tface_uv(void);
void sima_sample_color(void);
@@ -84,3 +95,18 @@ void pack_image_sima(void);
/* checks images for forced updates on frame change */
void BIF_image_update_frame(void);
+
+void find_nearest_uv(struct MTFace **nearesttf, struct EditFace **nearestefa, unsigned int *nearestv, int *nearestuv);
+
+/* face selection check functions */
+
+int simaFaceDraw_Check_nolocal( struct EditFace *efa );
+int simaFaceDraw_Check( struct EditFace *efa, struct MTFace *tf );
+
+int simaFaceSel_Check( struct EditFace *efa, struct MTFace *tf );
+void simaFaceSel_Set( struct EditFace *efa, struct MTFace *tf );
+void simaFaceSel_UnSet( struct EditFace *efa, struct MTFace *tf );
+
+int simaUVSel_Check( struct EditFace *efa, struct MTFace *tf, int i);
+void simaUVSel_Set( struct EditFace *efa, struct MTFace *tf, int i);
+void simaUVSel_UnSet( struct EditFace *efa, struct MTFace *tf, int i);
diff --git a/source/blender/include/BIF_editsound.h b/source/blender/include/BIF_editsound.h
index abeabdc3e06..6e341bfb204 100644
--- a/source/blender/include/BIF_editsound.h
+++ b/source/blender/include/BIF_editsound.h
@@ -71,7 +71,7 @@ void sound_set_position(void *object,
struct hdaudio * sound_open_hdaudio(char * name);
struct hdaudio * sound_copy_hdaudio(struct hdaudio * c);
-long sound_hdaudio_get_duration(struct hdaudio * hdaudio, int frame_rate);
+long sound_hdaudio_get_duration(struct hdaudio * hdaudio, double frame_rate);
void sound_hdaudio_extract(struct hdaudio * hdaudio,
short * target_buffer,
int sample_position /* units of target_rate */,
diff --git a/source/blender/include/BIF_editview.h b/source/blender/include/BIF_editview.h
index 676bc3bd9f0..9192b217f4f 100644
--- a/source/blender/include/BIF_editview.h
+++ b/source/blender/include/BIF_editview.h
@@ -39,6 +39,7 @@ struct Camera;
struct View3D;
void arrows_move_cursor(unsigned short event);
+int lasso_inside(short mcords[][2], short moves, short sx, short sy);
void borderselect(void);
void circle_select(void);
void deselectall(void);
diff --git a/source/blender/include/BIF_filelist.h b/source/blender/include/BIF_filelist.h
new file mode 100644
index 00000000000..730a41c22e9
--- /dev/null
+++ b/source/blender/include/BIF_filelist.h
@@ -0,0 +1,86 @@
+/**
+ * $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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef BIF_FILELIST_H
+#define BIF_FILELIST_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct FileList;
+struct direntry;
+struct BlendHandle;
+
+struct FileList * BIF_filelist_new();
+void BIF_filelist_init_icons();
+void BIF_filelist_free_icons();
+struct FileList * BIF_filelist_copy(struct FileList* filelist);
+int BIF_filelist_find(struct FileList* filelist, char *file);
+void BIF_filelist_free(struct FileList* filelist);
+void BIF_filelist_freelib(struct FileList* filelist);
+void BIF_filelist_sort(struct FileList* filelist, short sort);
+int BIF_filelist_numfiles(struct FileList* filelist);
+const char * BIF_filelist_dir(struct FileList* filelist);
+void BIF_filelist_setdir(struct FileList* filelist, const char *dir);
+struct direntry * BIF_filelist_file(struct FileList* filelist, int index);
+void BIF_filelist_hidedot(struct FileList* filelist, short hide);
+void BIF_filelist_setfilter(struct FileList* filelist, unsigned int filter);
+void BIF_filelist_filter(struct FileList* filelist);
+void BIF_filelist_swapselect(struct FileList* filelist);
+void BIF_filelist_imgsize(struct FileList* filelist, short w, short h);
+void BIF_filelist_loadimage(struct FileList* filelist, int index);
+struct ImBuf * BIF_filelist_getimage(struct FileList* filelist, int index);
+
+void BIF_filelist_readdir(struct FileList* filelist);
+
+int BIF_filelist_empty(struct FileList* filelist);
+void BIF_filelist_parent(struct FileList* filelist);
+void BIF_filelist_setfiletypes(struct FileList* filelist, short has_quicktime);
+int BIF_filelist_islibrary (struct FileList* filelist, char* dir, char* group);
+void BIF_filelist_from_main(struct FileList* filelist);
+void BIF_filelist_from_library(struct FileList* filelist);
+void BIF_filelist_append_library(struct FileList* filelist, char *dir, char* file, short flag, int idcode);
+void BIF_filelist_settype(struct FileList* filelist, int type);
+short BIF_filelist_gettype(struct FileList* filelist);
+void BIF_filelist_setipotype(struct FileList* filelist, short ipotype);
+void BIF_filelist_hasfunc(struct FileList* filelist, int has_func);
+
+struct BlendHandle *BIF_filelist_lib(struct FileList* filelist);
+int BIF_groupname_to_code(char *group); /* TODO: where should this go */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/source/blender/include/BIF_fsmenu.h b/source/blender/include/BIF_fsmenu.h
index b32dee01854..1c5280c14f8 100644
--- a/source/blender/include/BIF_fsmenu.h
+++ b/source/blender/include/BIF_fsmenu.h
@@ -55,17 +55,20 @@ char* fsmenu_build_menu (void);
/** Append a seperator to the FSMenu, inserts always follow the
* last seperator.
*/
-void fsmenu_append_seperator (void);
+void fsmenu_append_separator (void);
/** Inserts a new fsmenu entry with the given @a path.
* Duplicate entries are not added.
* @param sorted Should entry be inserted in sorted order?
*/
-void fsmenu_insert_entry (char *path, int sorted);
+void fsmenu_insert_entry (char *path, int sorted, short save);
/** Removes the fsmenu entry at the given @a index. */
void fsmenu_remove_entry (int index);
+ /** saves the 'favourites' to the specified file */
+void fsmenu_write_file(const char *filename);
+
/** Free's all the memory associated with the fsmenu */
void fsmenu_free (void);
diff --git a/source/blender/include/BIF_imasel.h b/source/blender/include/BIF_imasel.h
index d6a1800730b..0e92abe14e4 100644
--- a/source/blender/include/BIF_imasel.h
+++ b/source/blender/include/BIF_imasel.h
@@ -33,28 +33,19 @@
#define BIF_IMASEL_H
struct SpaceImaSel;
-struct OneSelectableIma;
struct ScrArea;
-struct ImaDir;
-void imadir_parent(struct SpaceImaSel *simasel);
-int bitset(int l, int bit);
-void free_sel_ima(struct OneSelectableIma *firstima);
-
-void write_new_pib(struct SpaceImaSel *simasel);
-void free_ima_dir(struct ImaDir *firstdir);
-void check_for_pib(struct SpaceImaSel *simasel);
-void clear_ima_dir(struct SpaceImaSel *simasel);
-void check_ima_dir_name(char *dir);
-int get_ima_dir(char *dirname, int dtype, int *td, struct ImaDir **first);
-void get_next_image(struct SpaceImaSel *simasel);
-void get_file_info(struct SpaceImaSel *simasel);
-void get_pib_file(struct SpaceImaSel *simasel);
-void change_imadir(struct SpaceImaSel *simasel);
-void check_imasel_copy(struct SpaceImaSel *simasel);
void free_imasel(struct SpaceImaSel *simasel);
void clever_numbuts_imasel(void);
+void activate_imageselect(int type, char *title, char *file, void (*func)(char *));
+void activate_imageselect_menu(int type, char *title, char *file, char *pupmenu, short *menup, void (*func)(char *));
+void activate_imageselect_args(int type, char *title, char *file, void (*func)(char *, void *, void *), void *arg1, void *arg2);
+
+void activate_databrowse_imasel(struct ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short));
+/*
+void activate_databrowse_imasel_args(struct ID *id, int idcode, int fromcode, short *menup, void (*func)(char *, void *, void *), void *arg1, void *arg2);
+*/
#endif
diff --git a/source/blender/include/BIF_interface.h b/source/blender/include/BIF_interface.h
index ad2c8988343..453e4e628fe 100644
--- a/source/blender/include/BIF_interface.h
+++ b/source/blender/include/BIF_interface.h
@@ -166,6 +166,7 @@ struct AutoComplete;
#define BUT_CURVE (32<<9)
#define BUT_TOGDUAL (33<<9)
#define ICONTOGN (34<<9)
+#define FTPREVIEW (35<<9)
#define BUTTYPE (63<<9)
diff --git a/source/blender/include/BIF_interface_icons.h b/source/blender/include/BIF_interface_icons.h
index c69fa122099..c628d68e9db 100644
--- a/source/blender/include/BIF_interface_icons.h
+++ b/source/blender/include/BIF_interface_icons.h
@@ -48,6 +48,7 @@ typedef struct IconFile {
#define ICON_DEFAULT_HEIGHT 16
+#define PREVIEW_DEFAULT_HEIGHT 96
/*
Resizable Icons for Blender
@@ -57,6 +58,8 @@ int BIF_icon_get_width(int icon_id);
int BIF_icon_get_height(int icon_id);
void BIF_icon_draw(float x, float y, int icon_id);
+void BIF_icon_draw_preview(float x, float y, int icon_id, int nocreate);
+
void BIF_icon_draw_aspect(float x, float y, int icon_id, float aspect);
void BIF_icon_draw_aspect_blended(float x, float y, int icon_id, float aspect, int shade);
void BIF_icons_free();
diff --git a/source/blender/include/BIF_language.h b/source/blender/include/BIF_language.h
index 9a6ddfc7fc5..6ed8a8d1574 100644
--- a/source/blender/include/BIF_language.h
+++ b/source/blender/include/BIF_language.h
@@ -33,6 +33,8 @@
#ifndef BIF_LANGUAGE_H
#define BIF_LANGUAGE_H
+#include "DNA_vec_types.h"
+
struct BMF_Font;
int read_languagefile(void); /* usiblender.c */
@@ -47,6 +49,7 @@ char *fontsize_pup(void);
int BIF_DrawString(struct BMF_Font* font, char *str, int translate);
float BIF_GetStringWidth(struct BMF_Font* font, char *str, int translate);
+void BIF_GetBoundingBox(struct BMF_Font* font, char* str, int translate, rctf* bbox);
void BIF_RasterPos(float x, float y);
void BIF_SetScale(float aspect);
diff --git a/source/blender/include/BIF_meshlaplacian.h b/source/blender/include/BIF_meshlaplacian.h
new file mode 100644
index 00000000000..74e4fef0937
--- /dev/null
+++ b/source/blender/include/BIF_meshlaplacian.h
@@ -0,0 +1,87 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ * BIF_meshlaplacian.h: Algorithms using the mesh laplacian.
+ */
+
+#ifndef BIF_MESHLAPLACIAN_H
+#define BIF_MESHLAPLACIAN_H
+
+//#define RIGID_DEFORM
+
+struct Object;
+struct Mesh;
+struct bDeformGroup;
+struct MeshDeformModifierData;
+
+#ifdef RIGID_DEFORM
+struct EditMesh;
+#endif
+
+/* Laplacian System */
+
+struct LaplacianSystem;
+typedef struct LaplacianSystem LaplacianSystem;
+
+LaplacianSystem *laplacian_construct_begin(int totvert, int totface);
+
+void laplacian_add_vertex(LaplacianSystem *sys, float *co, int pinned);
+void laplacian_add_triangle(LaplacianSystem *sys, int v1, int v2, int v3);
+
+void laplacian_construct_end(LaplacianSystem *sys);
+void laplacian_delete(LaplacianSystem *sys);
+
+void laplacian_begin_solve(LaplacianSystem *sys, int index);
+void laplacian_add_right_hand_side(LaplacianSystem *sys, int v, float value);
+int laplacian_system_solve(LaplacianSystem *sys);
+float laplacian_system_get_solution(int v);
+
+/* Heat Weighting */
+
+void heat_bone_weighting(struct Object *ob, struct Mesh *me, float (*verts)[3],
+ int numbones, struct bDeformGroup **dgrouplist,
+ struct bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3],
+ int *selected);
+
+#ifdef RIGID_DEFORM
+/* As-Rigid-As-Possible Deformation */
+
+void rigid_deform_begin(struct EditMesh *em);
+void rigid_deform_iteration(void);
+void rigid_deform_end(int cancel);
+#endif
+
+/* Harmonic Coordinates */
+
+void harmonic_coordinates_bind(struct MeshDeformModifierData *mmd,
+ float (*vertexcos)[3], int totvert, float cagemat[][4]);
+
+#endif
+
diff --git a/source/blender/include/BIF_meshtools.h b/source/blender/include/BIF_meshtools.h
index a08f800d7b6..17bbb2393ef 100644
--- a/source/blender/include/BIF_meshtools.h
+++ b/source/blender/include/BIF_meshtools.h
@@ -45,6 +45,7 @@ extern void objects_bake_render(short event);
extern long mesh_octree_table(struct Object *ob, float *co, char mode);
extern int mesh_get_x_mirror_vert(struct Object *ob, int index);
extern struct EditVert *editmesh_get_x_mirror_vert(struct Object *ob, float *co);
+extern int *mesh_get_x_mirror_faces(struct Object *ob);
#endif
diff --git a/source/blender/include/BIF_poseobject.h b/source/blender/include/BIF_poseobject.h
index 835b808c9ba..a640d3abe84 100644
--- a/source/blender/include/BIF_poseobject.h
+++ b/source/blender/include/BIF_poseobject.h
@@ -58,7 +58,7 @@ void free_posebuf(void);
void copy_posebuf (void);
void paste_posebuf (int flip);
-void pose_adds_vgroups(struct Object *meshobj);
+void pose_adds_vgroups(struct Object *meshobj, int heatweights);
void pose_calculate_path(struct Object *ob);
void pose_clear_paths(struct Object *ob);
diff --git a/source/blender/include/BIF_resources.h b/source/blender/include/BIF_resources.h
index cfa58321172..f03364f099b 100644
--- a/source/blender/include/BIF_resources.h
+++ b/source/blender/include/BIF_resources.h
@@ -58,7 +58,7 @@ typedef enum {
ICON_SPACE4,
ICON_TRIA_LEFT,
ICON_TRIA_UP,
- ICON_BLANK3,
+ ICON_FONTPREVIEW,
ICON_BLANK4,
ICON_BLANK5,
ICON_BLANK6,
@@ -66,7 +66,7 @@ typedef enum {
ICON_ORTHO,
ICON_PERSP,
ICON_CAMERA,
- ICON_EFFECTS,
+ ICON_PARTICLES,
ICON_BBOX,
ICON_WIRE,
ICON_SOLID,
@@ -123,9 +123,9 @@ typedef enum {
ICON_AXIS_SIDE,
ICON_AXIS_FRONT,
ICON_AXIS_TOP,
- ICON_DRAW_UVFACES,
- ICON_STICKY_UVS,
- ICON_STICKY2_UVS,
+ ICON_STICKY_UVS_LOC,
+ ICON_STICKY_UVS_DISABLE,
+ ICON_STICKY_UVS_VERT,
ICON_PREV_KEYFRAME,
ICON_NEXT_KEYFRAME,
ICON_ENVMAP,
@@ -164,7 +164,7 @@ typedef enum {
ICON_FACESEL_DEHLT,
ICON_FACESEL_HLT,
ICON_EDIT_DEHLT,
- ICON_BLANK19,
+ ICON_BOOKMARKS,
ICON_BLANK20,
ICON_BLANK21,
ICON_BLANK22,
@@ -268,7 +268,7 @@ typedef enum {
ICON_EYEDROPPER,
ICON_WINDOW_WINDOW,
ICON_PANEL_CLOSE,
- ICON_BLANK35,
+ ICON_PHYSICS,
ICON_BLANK36,
ICON_BLANK37,
ICON_BLANK38,
@@ -317,13 +317,13 @@ typedef enum {
ICON_HOME,
ICON_CLIPUV_DEHLT,
ICON_CLIPUV_HLT,
- ICON_SOME_WACKY_VERTS_AND_LINES,
- ICON_A_WACKY_VERT_AND_SOME_LINES,
+ ICON_BLANK2,
+ ICON_BLANK3,
ICON_VPAINT_COL,
ICON_RESTRICT_SELECT_OFF,
ICON_RESTRICT_SELECT_ON,
- ICON_BLANK45,
- ICON_BLANK46,
+ ICON_MUTE_IPO_OFF,
+ ICON_MUTE_IPO_ON,
ICON_MAN_TRANS,
ICON_MAN_ROT,
@@ -525,6 +525,7 @@ enum {
TH_SEQ_META,
TH_EDGE_SHARP,
+ TH_EDITMESH_ACTIVE,
};
/* XXX WARNING: previous is saved in file, so do not change order! */
diff --git a/source/blender/include/BIF_space.h b/source/blender/include/BIF_space.h
index 884f0459abf..855773b3497 100644
--- a/source/blender/include/BIF_space.h
+++ b/source/blender/include/BIF_space.h
@@ -65,6 +65,8 @@ struct SpaceOops;
#define IMAGE_HANDLER_CURVES 32
#define IMAGE_HANDLER_PREVIEW 33
#define IMAGE_HANDLER_GAME_PROPERTIES 34
+#define IMAGE_HANDLER_VIEW_PROPERTIES 35
+/*#define IMAGE_HANDLER_TRANSFORM_PROPERTIES 36*/
/* action handler codes */
#define ACTION_HANDLER_PROPERTIES 40
@@ -75,6 +77,9 @@ struct SpaceOops;
/* sequence handler codes */
#define SEQ_HANDLER_PROPERTIES 60
+/* imasel handler codes */
+#define IMASEL_HANDLER_IMAGE 70
+
/* theme codes */
#define B_ADD_THEME 3301
#define B_DEL_THEME 3302
@@ -89,6 +94,7 @@ struct SpaceOops;
#define B_RECALCLIGHT 3310
+void scrarea_do_winprefetchdraw (struct ScrArea *sa);
void scrarea_do_windraw (struct ScrArea *sa);
void scrarea_do_winchange (struct ScrArea *sa);
void scrarea_do_winhandle (struct ScrArea *sa, struct BWinEvent *evt);
diff --git a/source/blender/include/BIF_spacetypes.h b/source/blender/include/BIF_spacetypes.h
index e825acf676f..6125cfd5926 100644
--- a/source/blender/include/BIF_spacetypes.h
+++ b/source/blender/include/BIF_spacetypes.h
@@ -35,6 +35,7 @@ struct BWinEvent;
typedef struct _SpaceType SpaceType;
+typedef void (*SpacePrefetchDrawFP) (struct ScrArea *sa, void *spacedata);
typedef void (*SpaceDrawFP) (struct ScrArea *sa, void *spacedata);
typedef void (*SpaceChangeFP) (struct ScrArea *sa, void *spacedata);
typedef void (*SpaceHandleFP) (struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
@@ -43,7 +44,7 @@ typedef void (*SpaceHandleFP) (struct ScrArea *sa, void *spacedata, struct BWinE
SpaceType* spacetype_new (char *name);
-void spacetype_set_winfuncs (SpaceType *st, SpaceDrawFP draw, SpaceChangeFP change, SpaceHandleFP handle);
+void spacetype_set_winfuncs (SpaceType *st, SpacePrefetchDrawFP prefetch, SpaceDrawFP draw, SpaceChangeFP change, SpaceHandleFP handle);
/***/
diff --git a/source/blender/include/BIF_transform.h b/source/blender/include/BIF_transform.h
index 3b5eeb6f35a..6d4095f0d40 100755..100644
--- a/source/blender/include/BIF_transform.h
+++ b/source/blender/include/BIF_transform.h
@@ -55,6 +55,11 @@
#define TFM_BONE_ENVELOPE 16
#define TFM_CURVE_SHRINKFATTEN 17
#define TFM_BONE_ROLL 18
+#define TFM_TIME_TRANSLATE 19
+#define TFM_TIME_SLIDE 20
+#define TFM_TIME_SCALE 21
+#define TFM_TIME_EXTEND 22
+#define TFM_BAKE_TIME 23
/* TRANSFORM CONTEXTS */
#define CTX_NONE 0
@@ -62,6 +67,7 @@
#define CTX_EDGE 2
#define CTX_NO_PET 4
#define CTX_TWEAK 8
+#define CTX_NO_MIRROR 16
void initTransform(int mode, int context);
void Transform(void);
@@ -81,9 +87,12 @@ void BIF_setSingleAxisConstraint(float vec[3], char *text);
void BIF_setDualAxisConstraint(float vec1[3], float vec2[3], char *text);
void BIF_setLocalAxisConstraint(char axis, char *text);
void BIF_setLocalLockConstraint(char axis, char *text);
+
+/* Drawing callbacks */
void BIF_drawConstraint(void);
void BIF_drawPropCircle(void);
void BIF_drawSnap(void);
+
void BIF_getPropCenter(float *center);
void BIF_TransformSetUndo(char *str);
diff --git a/source/blender/include/BSE_drawimasel.h b/source/blender/include/BSE_drawimasel.h
index f412ca08584..6c68ba79bb9 100644
--- a/source/blender/include/BSE_drawimasel.h
+++ b/source/blender/include/BSE_drawimasel.h
@@ -33,27 +33,28 @@
#ifndef BSE_DRAWIMASEL_H
#define BSE_DRAWIMASEL_H
+
+/* button events */
+#define B_FS_FILENAME 1
+#define B_FS_DIRNAME 2
+#define B_FS_DIR_MENU 3
+#define B_FS_PARDIR 4
+#define B_FS_LOAD 5
+#define B_FS_CANCEL 6
+#define B_FS_LIBNAME 7
+#define B_FS_BOOKMARK 8
+
+/* ui geometry */
+#define IMASEL_BUTTONS_HEIGHT 60
+#define TILE_BORDER_X 8
+#define TILE_BORDER_Y 8
+
struct ScrArea;
struct SpaceImaSel;
-void viewgate(short sx, short sy, short ex, short ey);
-void areaview (void);
-void calc_hilite(struct SpaceImaSel *simasel);
-void make_sima_area(struct SpaceImaSel *simasel);
-void draw_sima_area(struct SpaceImaSel *simasel);
-void select_ima_files(struct SpaceImaSel *simasel);
-void move_imadir_sli(struct SpaceImaSel *simasel);
-void move_imafile_sli(struct SpaceImaSel *simasel);
-void ima_select_all(struct SpaceImaSel *simasel);
-void pibplay(struct SpaceImaSel *simasel);
void drawimaselspace(struct ScrArea *sa, void *spacedata);
-
-/* void calc_hilite(SpaceImaSel *simasel); */
-/* void ima_select_all(SpaceImaSel *simasel); */
-/* void move_imadir_sli(SpaceImaSel *simasel); */
-/* void move_imafile_sli(SpaceImaSel *simasel); */
-/* void pibplay(SpaceImaSel *simasel); */
-/* void select_ima_files(SpaceImaSel *simasel); */
+void calc_imasel_rcts(SpaceImaSel *simasel, int winx, int winy);
+void do_imasel_buttonevents(short event, SpaceImaSel *simasel);
#endif /* BSE_DRAWIMASEL_H */
diff --git a/source/blender/include/BSE_editaction_types.h b/source/blender/include/BSE_editaction_types.h
index c4f78710d2d..48f0bc39ffc 100644
--- a/source/blender/include/BSE_editaction_types.h
+++ b/source/blender/include/BSE_editaction_types.h
@@ -48,6 +48,7 @@ typedef struct bActListElem {
void *data; /* source data this elem represents */
int type; /* one of the ACTTYPE_* values */
int flag; /* copy of elem's flags for quick access */
+ int index; /* copy of adrcode where applicable */
void *key_data; /* motion data - ipo or ipo-curve */
short datatype; /* type of motion data to expect */
@@ -66,6 +67,7 @@ typedef struct bActListElem {
#define ACTFILTER_CHANNELS 0x008 /* do we only care that it is a channel */
#define ACTFILTER_IPOKEYS 0x010 /* only channels referencing ipo's */
#define ACTFILTER_ONLYICU 0x020 /* only reference ipo-curves */
+#define ACTFILTER_FORDRAWING 0x040 /* make list for interface drawing */
/* Action Editor - Main Data types */
#define ACTCONT_NONE 0
diff --git a/source/blender/include/BSE_editipo.h b/source/blender/include/BSE_editipo.h
index f861a2abd7a..3dd54d0a5ed 100644
--- a/source/blender/include/BSE_editipo.h
+++ b/source/blender/include/BSE_editipo.h
@@ -44,6 +44,7 @@ struct Object;
struct IpoKey;
struct TransOb;
struct Tex;
+struct TransInfo;
void remake_object_ipos(struct Object *ob);
char *getname_ac_ei(int nr);
@@ -59,14 +60,15 @@ char *getname_la_ei(int nr);
char *getname_cam_ei(int nr);
char *getname_snd_ei(int nr);
char *getname_fluidsim_ei(int nr);
+char *getname_part_ei(int nr);
-char *getname_ipocurve(struct IpoCurve *icu);
+char *getname_ipocurve(struct IpoCurve *icu, struct Object *ob);
int geticon_ipo_blocktype(short blocktype);
struct EditIpo *get_active_editipo(void);
-void boundbox_ipocurve(struct IpoCurve *icu);
-void boundbox_ipo(struct Ipo *ipo, struct rctf *bb);
+void boundbox_ipocurve(struct IpoCurve *icu, int selectedonly);
+void boundbox_ipo(struct Ipo *ipo, struct rctf *bb, int selectedonly);
void editipo_changed(struct SpaceIpo *si, int doredraw);
void scale_editipo(void);
@@ -91,8 +93,10 @@ struct IpoCurve *verify_ipocurve(struct ID *, short, char *, char *, int);
struct Ipo *verify_ipo(struct ID *, short, char *, char *);
int texchannel_to_adrcode(int channel);
-void insert_vert_ipo(struct IpoCurve *icu, float x, float y);
+int insert_bezt_icu(struct IpoCurve *icu, struct BezTriple *bezt);
+void insert_vert_icu(struct IpoCurve *icu, float x, float y, short fast);
void add_vert_ipo(void);
+
void add_duplicate_editipo(void);
void remove_doubles_ipo(void);
void clean_ipo(void);
@@ -119,7 +123,7 @@ void paste_editipo(void);
void set_exprap_ipo(int mode);
void set_speed_editipo(float speed);
-void insertkey(ID *id, int blocktype, char *actname, char *constname, int adrcode);
+void insertkey(ID *id, int blocktype, char *actname, char *constname, int adrcode, short fast);
void insertkey_smarter(ID *id, int blocktype, char *actname, char *constname, int adrcode);
void insertkey_editipo(void);
void common_insertkey(void);
@@ -136,11 +140,13 @@ void movekey_ipo(int dir);
void movekey_obipo(int dir);
void nextkey_ipo(int dir);
void nextkey_obipo(int dir);
-void remake_ipo_transverts(struct TransVert *transmain, float *dvec, int tot);
-void transform_ipo(int mode);
void filter_sampledata(float *data, int sfra, int efra);
void sampledata_to_ipocurve(float *data, int sfra, int efra, struct IpoCurve *icu);
-void ipo_record(void);
+void ipo_record(void);
+
+void make_ipo_transdata(struct TransInfo *t);
+void remake_ipo_transdata(struct TransInfo *t);
+void transform_ipo(int mode);
void actstrip_map_ipo_keys(struct Object *ob, struct Ipo *ipo, short restore, short only_keys);
@@ -158,8 +164,8 @@ void duplicate_ipo_keys(struct Ipo *ipo);
void borderselect_ipo_key(struct Ipo *ipo, float xmin, float xmax, int val);
void borderselect_icu_key(struct IpoCurve *icu, float xmin, float xmax,
int (*select_function)(struct BezTriple *));
-void insertmatrixkey(ID *id, int blocktype, char *actname, char *constname, int adrcode, float matrixvalue);
-
+int insertmatrixkey(ID *id, int blocktype, char *actname, char *constname, int adrcode);
+void insertfloatkey(ID *id, int blocktype, char *actname, char *constname, int adrcode, float floatkey);
void select_ipo_key(struct Ipo *ipo, float selx, int sel);
void select_icu_key(struct IpoCurve *icu, float selx, int selectmode);
void setexprap_ipoloop(struct Ipo *ipo, int code);
diff --git a/source/blender/include/BSE_filesel.h b/source/blender/include/BSE_filesel.h
index 6934899062e..a41eea32040 100644
--- a/source/blender/include/BSE_filesel.h
+++ b/source/blender/include/BSE_filesel.h
@@ -53,8 +53,6 @@ void activate_fileselect(int type, char *title, char *file, void (*func)(char *)
void activate_fileselect_menu(int type, char *title, char *file, char *pupmenu, short *menup, void (*func)(char *));
void activate_fileselect_args(int type, char *title, char *file, void (*func)(char *, void *, void *), void *arg1, void *arg2);
-void activate_imageselect(int type, char *title, char *file, void (*func)(char *));
-
void activate_databrowse(struct ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short));
void activate_databrowse_args(struct ID *id, int idcode, int fromcode, short *menup, void (*func)(char *, void *, void *), void *arg1, void *arg2);
diff --git a/source/blender/include/BSE_node.h b/source/blender/include/BSE_node.h
index 243cac56152..171a277e8e6 100644
--- a/source/blender/include/BSE_node.h
+++ b/source/blender/include/BSE_node.h
@@ -71,6 +71,7 @@ void node_ungroup(struct SpaceNode *snode);
void snode_make_group_editable(struct SpaceNode *snode, struct bNode *gnode);
void node_hide(struct SpaceNode *snode);
void node_read_renderlayers(struct SpaceNode *snode);
+void clear_scene_in_nodes(struct Scene *sce);
void node_transform_ext(int mode, int unused);
void node_shader_default(struct Material *ma);
diff --git a/source/blender/include/BSE_sequence.h b/source/blender/include/BSE_sequence.h
index c975e8de8ff..fdf584b38f4 100644
--- a/source/blender/include/BSE_sequence.h
+++ b/source/blender/include/BSE_sequence.h
@@ -37,6 +37,7 @@
struct PluginSeq;
struct StripElem;
+struct TStripElem;
struct Strip;
struct Sequence;
struct ListBase;
@@ -44,21 +45,34 @@ struct Editing;
struct ImBuf;
struct Scene;
-void free_stripdata(int len, struct StripElem *se);
+void free_tstripdata(int len, struct TStripElem *se);
void free_strip(struct Strip *strip);
-void new_stripdata(struct Sequence *seq);
+void new_tstripdata(struct Sequence *seq);
void free_sequence(struct Sequence *seq);
void build_seqar(struct ListBase *seqbase, struct Sequence ***seqar, int *totseq);
void free_editing(struct Editing *ed);
void calc_sequence(struct Sequence *seq);
+void calc_sequence_disp(struct Sequence *seq);
void sort_seq(void);
void clear_scene_in_allseqs(struct Scene *sce);
int evaluate_seq_frame(int cfra);
struct StripElem *give_stripelem(struct Sequence *seq, int cfra);
+struct TStripElem *give_tstripelem(struct Sequence *seq, int cfra);
void set_meta_stripdata(struct Sequence *seqm);
struct ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chansel);
/* chansel: render this channel. Default=0 (renders end result)*/
+struct ImBuf *give_ibuf_seq_direct(int rectx, int recty, int cfra,
+ struct Sequence * seq);
+
+/* sequence prefetch API */
+void seq_start_threads();
+void seq_stop_threads();
+void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown);
+void seq_wait_for_prefetch_ready();
+struct ImBuf * give_ibuf_seq_threaded(int rectx, int recty, int cfra,
+ int chanshown);
+
void free_imbuf_seq_except(int cfra);
void free_imbuf_seq_with_ipo(struct Ipo * ipo);
diff --git a/source/blender/include/BSE_time.h b/source/blender/include/BSE_time.h
index 459101f592d..d5cff9f5e5f 100644
--- a/source/blender/include/BSE_time.h
+++ b/source/blender/include/BSE_time.h
@@ -54,7 +54,8 @@ int find_nearest_marker_time(float dx);
void add_marker_to_cfra_elem(struct ListBase *lb, struct TimeMarker *marker, short only_sel);
void make_marker_cfra_list(struct ListBase *lb, short only_sel);
-void draw_markers_timespace(void);
+void draw_markers_timespace(int lines);
+TimeMarker *get_frame_marker(int frame);
/* ******** Animation - Preview Range ************* */
void anim_previewrange_set(void);
diff --git a/source/blender/include/BSE_trans_types.h b/source/blender/include/BSE_trans_types.h
index d75da302436..9c8b9e5595f 100644
--- a/source/blender/include/BSE_trans_types.h
+++ b/source/blender/include/BSE_trans_types.h
@@ -35,6 +35,7 @@
struct Object;
struct MDeformVert;
+struct ColorBand;
typedef struct TransOb {
float *loc;
diff --git a/source/blender/include/BSE_view.h b/source/blender/include/BSE_view.h
index 91f360338e9..4e27f9f1a81 100644
--- a/source/blender/include/BSE_view.h
+++ b/source/blender/include/BSE_view.h
@@ -76,6 +76,7 @@ void sdrawbox(short x1, short y1, short x2, short y2);
void calctrackballvecfirst(struct rcti *area, short *mval, float *vec);
void calctrackballvec(struct rcti *area, short *mval, float *vec);
void viewmove(int mode);
+void view_zoom_mouseloc(float dfac, short *mouseloc);
int get_view3d_viewplane(int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize);
void setwinmatrixview3d(int winx, int winy, struct rctf *rect);
diff --git a/source/blender/include/blendef.h b/source/blender/include/blendef.h
index 0b05d635593..4b5506dda30 100644
--- a/source/blender/include/blendef.h
+++ b/source/blender/include/blendef.h
@@ -40,7 +40,6 @@
#define MINFRAME 1
#define MINFRAMEF 1.0
-#define MAXLAMP 32765
/* max length material array, 16 because of bits in matfrom */
#define MAXPICKBUF 10000
#define MAXSEQ 32
@@ -54,7 +53,7 @@
/* also fill in structs itself, dna cannot handle defines, duplicate with utildefines.h still */
#ifndef FILE_MAXDIR
-#define FILE_MAXDIR 160
+#define FILE_MAXDIR 160
#define FILE_MAXFILE 80
#endif
@@ -114,6 +113,9 @@
#define EFRA (G.scene->r.efra)
#define PSFRA ((G.scene->r.psfra != 0)? (G.scene->r.psfra): (G.scene->r.sfra))
#define PEFRA ((G.scene->r.psfra != 0)? (G.scene->r.pefra): (G.scene->r.efra))
+#define FRA2TIME(a) ((((double) G.scene->r.frs_sec_base) * (a)) / G.scene->r.frs_sec)
+#define TIME2FRA(a) ((((double) G.scene->r.frs_sec) * (a)) / G.scene->r.frs_sec_base)
+#define FPS (((double) G.scene->r.frs_sec) / G.scene->r.frs_sec_base)
#define ISPOIN(a, b, c) ( (a->b) && (a->c) )
#define ISPOIN3(a, b, c, d) ( (a->b) && (a->c) && (a->d) )
@@ -161,7 +163,6 @@
#define B_TEXALONE 47
#define B_MESHALONE 48
#define B_CURVEALONE 49
-#define B_HEMESHALONE 50
/* EVENT < 50: alones en locals */
@@ -174,7 +175,7 @@
#define B_PLAINMENUS 66
-#define B_GLRESLIMITCHANGED 69
+#define B_GLRESLIMITCHANGED 69
#define B_SHOWSPLASH 70
#define B_RESETAUTOSAVE 71
#define B_SOUNDTOGGLE 72
@@ -215,17 +216,15 @@
#define B_AUTOKEY 139
#define B_SCENELOCK 140
#define B_LOCALVIEW 141
-#define B_U_CAPSLOCK 142
+#define B_U_CAPSLOCK 142
#define B_VIEWBUT 146
#define B_PERSP 147
#define B_PROPTOOL 148
-#define B_VIEWRENDER 149
-#define B_VIEWTRANS 150
-#define B_VIEWZOOM 151
-#define B_STARTGAME 152
+#define B_VIEWRENDER 149
+#define B_STARTGAME 150
-#define B_MODESELECT 156
+#define B_MODESELECT 156
#define B_AROUND 157
#define B_SEL_VERT 158
#define B_SEL_EDGE 159
@@ -233,8 +232,9 @@
#define B_MAN_TRANS 161
#define B_MAN_ROT 162
#define B_MAN_SCALE 163
-#define B_HEMESHBROWSE 164
-#define B_HEMESHLOCAL 165
+#define B_SEL_PATH 166
+#define B_SEL_POINT 167
+#define B_SEL_END 168
/* IPO: 200 */
#define B_IPOHOME 201
@@ -245,13 +245,15 @@
#define B_IPOEXTRAP 206
#define B_IPOCYCLIC 207
#define B_IPOMAIN 208
-#define B_IPOSHOWKEY 209
-#define B_IPOCYCLICX 210
+#define B_IPOSHOWKEY 209
+#define B_IPOCYCLICX 210
/* warn: also used for oops and seq */
-#define B_VIEW2DZOOM 211
+#define B_VIEW2DZOOM 211
#define B_IPOPIN 212
#define B_IPO_ACTION_OB 213
#define B_IPO_ACTION_KEY 214
+#define B_IPOVIEWCENTER 215
+#define B_IPOVIEWALL 216
/* OOPS: 250 */
@@ -263,15 +265,15 @@
/* INFO: 300 */
/* watch: also in filesel.c and editobject.c */
#define B_INFOSCR 301
-#define B_INFODELSCR 302
+#define B_INFODELSCR 302
#define B_INFOSCE 304
-#define B_INFODELSCE 305
+#define B_INFODELSCE 305
#define B_FILEMENU 306
#define B_PACKFILE 307
#define B_CONSOLEOUT 308
#define B_CONSOLENUMLINES 309
-#define B_USERPREF 310
+#define B_USERPREF 310
#define B_LOADUIFONT 311
#define B_SETLANGUAGE 312
#define B_SETFONTSIZE 313
@@ -287,32 +289,33 @@
#define B_UITHEMEIMPORT 323
#define B_UITHEMEEXPORT 324
-#define B_MEMCACHELIMIT 325
+#define B_MEMCACHELIMIT 325
+#define B_WPAINT_RANGE 326
/* Definitions for the fileselect buttons in user prefs */
#define B_FONTDIRFILESEL 330
#define B_TEXTUDIRFILESEL 331
-#define B_PLUGTEXDIRFILESEL 332
-#define B_PLUGSEQDIRFILESEL 333
-#define B_RENDERDIRFILESEL 334
-#define B_PYTHONDIRFILESEL 335
+#define B_PLUGTEXDIRFILESEL 332
+#define B_PLUGSEQDIRFILESEL 333
+#define B_RENDERDIRFILESEL 334
+#define B_PYTHONDIRFILESEL 335
#define B_SOUNDDIRFILESEL 336
#define B_TEMPDIRFILESEL 337
/* yafray: for exportdir select */
#define B_YAFRAYDIRFILESEL 338
-#define B_PYMENUEVAL 339 /* re-eval scripts registration in menus */
+#define B_PYMENUEVAL 339 /* re-eval scripts registration in menus */
/* END Definitions for the fileselect buttons in user prefs */
/* IMAGE: 350 */
#define B_SIMAGEHOME 351
#define B_SIMABROWSE 352
#define B_SIMAGELOAD 353
-#define B_SIMAGEDRAW 354
-#define B_BE_SQUARE 355
-#define B_SIMAGEDRAW1 356
-#define B_TWINANIM 357
+#define B_SIMA_REDR_IMA_3D 354
+#define B_SIMAGETILE 355
+#define B_BE_SQUARE 356
+#define B_TWINANIM 357
#define B_SIMAGEREPLACE 358
-#define B_CLIP_UV 359
+#define B_CLIP_UV 359
#define B_SIMAGELOAD1 360
#define B_SIMAGEREPLACE1 361
#define B_SIMAGEPAINTTOOL 362
@@ -336,20 +339,27 @@
#define B_SIMANAME 381
#define B_SIMAMULTI 382
#define B_TRANS_IMAGE 383
-#define B_SIMA_REPACK 384
-#define B_SIMA_PLAY 385
-#define B_SIMA_RECORD 386
+#define B_CURSOR_IMAGE 384
+#define B_SIMA_REPACK 385
+#define B_SIMA_PLAY 386
+#define B_SIMA_RECORD 387
+#define B_SIMAPIN 388
+#define B_SIMA3DVIEWDRAW 389
+
/* BUTS: 400 */
-#define B_BUTSHOME 401
-#define B_BUTSPREVIEW 402
-#define B_MATCOPY 403
-#define B_MATPASTE 404
-#define B_MESHTYPE 405
+#define B_BUTSHOME 401
+#define B_BUTSPREVIEW 402
+#define B_MATCOPY 403
+#define B_MATPASTE 404
+#define B_MESHTYPE 405
#define B_CONTEXT_SWITCH 406
/* IMASEL: 450 */
-/* in imasel.h */
+/* in imasel.h - not any more - elubie */
+#define B_SORTIMASELLIST 451
+#define B_RELOADIMASELDIR 452
+#define B_FILTERIMASELDIR 453
/* TEXT: 500 */
#define B_TEXTBROWSE 501
@@ -363,8 +373,8 @@
#define B_SYNTAX 509
/* SCRIPT: 525 */
-#define B_SCRIPTBROWSE 526
-#define B_SCRIPT2PREV 527
+#define B_SCRIPTBROWSE 526
+#define B_SCRIPT2PREV 527
/* FILE: 550 */
#define B_SORTFILELIST 551
@@ -384,34 +394,35 @@
#define B_ACTHOME 701
#define B_ACTCOPY 702
#define B_ACTPASTE 703
-#define B_ACTPASTEFLIP 704
+#define B_ACTPASTEFLIP 704
#define B_ACTCYCLIC 705
#define B_ACTCONT 706
#define B_ACTMAIN 707
#define B_ACTPIN 708
#define B_ACTBAKE 709
+#define B_ACTCOPYKEYS 710
+#define B_ACTPASTEKEYS 711
/* TIME: 751 - 800 */
#define B_TL_REW 751
#define B_TL_PLAY 752
#define B_TL_FF 753
-#define B_TL_PREVKEY 754
-#define B_TL_NEXTKEY 755
+#define B_TL_PREVKEY 754
+#define B_TL_NEXTKEY 755
#define B_TL_STOP 756
-#define B_TL_PREVIEWON 757
+#define B_TL_PREVIEWON 757
/* NLA: 801-850 */
#define B_NLAHOME 801
/* NODE: 851-900 */
-#define B_NODEHOME 851
+#define B_NODEHOME 851
#define B_NODE_USEMAT 852
#define B_NODE_USESCENE 853
/* FREE 901 - 999 */
-#define B_NOTHING -1
#define B_NOP -1
@@ -420,22 +431,22 @@
#define B_KEEPORIG 2
#define B_BEAUTY 4
#define B_SMOOTH 8
-#define B_BEAUTY_SHORT 16
+#define B_BEAUTY_SHORT 16
#define B_AUTOFGON 32
#define B_KNIFE 0x80
-#define B_PERCENTSUBD 0x40
-#define B_MESH_X_MIRROR 0x100
-#define B_JOINTRIA_UV 0x200
-#define B_JOINTRIA_VCOL 0X400
-#define B_JOINTRIA_SHARP 0X800
-#define B_JOINTRIA_MAT 0X1000
+#define B_PERCENTSUBD 0x40
+#define B_MESH_X_MIRROR 0x100
+#define B_JOINTRIA_UV 0x200
+#define B_JOINTRIA_VCOL 0X400
+#define B_JOINTRIA_SHARP 0X800
+#define B_JOINTRIA_MAT 0X1000
/* DISPLAYMODE */
#define R_DISPLAYIMAGE 0
#define R_DISPLAYWIN 1
#define R_DISPLAYSCREEN 2
- /* Gvp.flag and Gwp.flag */
+/* Gvp.flag and Gwp.flag */
#define VP_COLINDEX 1
#define VP_AREA 2
#define VP_SOFT 4
@@ -443,7 +454,7 @@
#define VP_SPRAY 16
#define VP_MIRROR_X 32
#define VP_HARD 64
-#define VP_ONLYVGROUP 128
+#define VP_ONLYVGROUP 128
/* Error messages */
#define ERROR_LIBDATA_MESSAGE "Can't edit external libdata"
diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h
index 142d2ae1d0b..10a31de98e5 100644
--- a/source/blender/include/butspace.h
+++ b/source/blender/include/butspace.h
@@ -68,6 +68,7 @@ extern void do_soundbuts(unsigned short event);
/* object */
extern void object_panels(void);
extern void physics_panels(void);
+extern void particle_panels(void);
extern void do_object_panels(unsigned short event);
extern void do_constraintbuts(unsigned short event);
extern void object_panel_constraint(char *context);
@@ -86,7 +87,6 @@ extern int mod_moveDown(void *ob_v, void *md_v);
extern void const_moveUp(void *ob_v, void *con_v);
extern void const_moveDown(void *ob_v, void *con_v);
extern void del_constr_func (void *ob_v, void *con_v);
-extern void get_constraint_typestring(char *str, void *con_v);
extern void get_constraint_ipo_context(void *ob_v, char *actname);
/* editing */
@@ -103,6 +103,7 @@ extern void do_cambuts(unsigned short event);
extern void do_armbuts(unsigned short event);
extern void do_uvcalculationbuts(unsigned short event);
extern void weight_paint_buttons(struct uiBlock *);
+extern void particle_edit_buttons(struct uiBlock *);
extern char *get_vertexgroup_menustr(struct Object *ob); // used in object buttons
@@ -180,6 +181,7 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_SHADRAY 1106
#define B_LMTEXPASTE 1107
#define B_LMTEXCOPY 1108
+#define B_LFALLOFFCHANGED 1109
/* *********************** */
#define B_MATBUTS 1300
@@ -209,6 +211,11 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_MAT_VCOL_PAINT 1222
#define B_MAT_VCOL_LIGHT 1223
+ /* world buttons: buttons-preview update, and redraw 3dview */
+#define B_WORLDPRV2 1224
+
+#define B_MAT_PARTICLE 1225
+
/* *********************** */
#define B_TEXBUTS 1400
@@ -277,6 +284,9 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_FLUIDSIM_MAKEPART 1453
#define B_GROUP_RELINK 1460
+#define B_OBJECT_IPOFLAG 1461
+
+#define B_BAKEABLE_CHANGE 1470
/* *********************** */
#define B_WORLDBUTS 1600
@@ -286,7 +296,7 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_COLZEN 1503
#define B_WMTEXPASTE 1504
#define B_WMTEXCOPY 1505
-#define B_AO_DISTANCES 1506
+#define B_AO_FALLOFF 1506
/* *********************** */
#define B_RENDERBUTS 1700
@@ -450,6 +460,11 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_SETRESOLU 2121
#define B_SETW4 2122
#define B_SUBSURFTYPE 2123
+#define B_TILTINTERP 2124
+#define B_SETPT_AUTO 2125
+#define B_SETPT_VECTOR 2126
+#define B_SETPT_ALIGN 2127
+#define B_SETPT_FREE 2128
/* *********************** */
#define B_FONTBUTS 2300
@@ -569,6 +584,14 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
/* Sculptmode */
#define B_SCULPT_TEXBROWSE 2860
+/* Particles */
+#define B_BAKE_OLENGTH 2870
+#define B_BAKE_APPLY_AV 2871
+#define B_BAKE_KEYTIME 2872
+#define B_BAKE_AV_CHANGE 2873
+#define B_BAKE_REDRAWEDIT 2874
+#define B_BAKE_RECACHE 2875
+
/* *********************** */
#define B_RADIOBUTS 3000
@@ -649,6 +672,7 @@ enum {
B_CONSTRAINT_ADD_CHILDOF,
B_CONSTRAINT_ADD_PYTHON,
B_CONSTRAINT_ADD_CLAMPTO,
+ B_CONSTRAINT_ADD_TRANSFORM,
B_CONSTRAINT_INF
};
@@ -690,6 +714,26 @@ enum {
#define B_FIELD_CHANGE 3415
#define B_PAF_SET_VG 3416
#define B_PAF_SET_VG1 3417
+#define B_PARTBROWSE 3418
+#define B_PARTDELETE 3419
+#define B_PARTALONE 3420
+#define B_PARTLOCAL 3421
+#define B_PARTAUTONAME 3422
+#define B_PART_ALLOC 3423
+#define B_PART_DISTR 3424
+#define B_PART_INIT 3425
+#define B_PART_RECALC 3426
+#define B_PART_REDRAW 3427
+#define B_PARTTYPE 3428
+#define B_PARTACT 3429
+#define B_PARTTARGET 3430
+#define B_PART_ALLOC_CHILD 3431
+#define B_PART_DISTR_CHILD 3432
+#define B_PART_INIT_CHILD 3433
+#define B_PART_RECALC_CHILD 3434
+#define B_PART_EDITABLE 3435
+
+#define B_PART_REKEY 3436
#define B_MODIFIER_BUTS 3600
diff --git a/source/blender/include/datatoc.h b/source/blender/include/datatoc.h
index d7a1aa5c78c..7afd4428d70 100644
--- a/source/blender/include/datatoc.h
+++ b/source/blender/include/datatoc.h
@@ -44,6 +44,9 @@ extern char datatoc_Bfs[];
extern int datatoc_blenderbuttons_size;
extern char datatoc_blenderbuttons[];
+extern int datatoc_prvicons_size;
+extern char datatoc_prvicons[];
+
extern int datatoc_Bfont_size;
extern char datatoc_Bfont[];
diff --git a/source/blender/include/editmesh.h b/source/blender/include/editmesh.h
index 50115e52a21..1b2d91e22b8 100644
--- a/source/blender/include/editmesh.h
+++ b/source/blender/include/editmesh.h
@@ -90,6 +90,7 @@ extern int convex(float *v1, float *v2, float *v3, float *v4);
/* ******************* editmesh_mods.c */
extern EditEdge *findnearestedge(int *dist);
+extern void EM_automerge(int update);
/**
* findnearestvert
@@ -104,5 +105,6 @@ extern EditVert *findnearestvert(int *dist, short sel, short strict);
/* ******************* editmesh_tools.c */
+
#endif
diff --git a/source/blender/include/interface.h b/source/blender/include/interface.h
index d7be02c6fc5..d8e779b9af8 100644
--- a/source/blender/include/interface.h
+++ b/source/blender/include/interface.h
@@ -230,7 +230,7 @@ extern void ui_draw_but(uiBut *but);
extern void ui_rasterpos_safe(float x, float y, float aspect);
extern void ui_draw_tria_icon(float x, float y, float aspect, char dir);
extern void ui_draw_anti_x(float x1, float y1, float x2, float y2);
-
+extern void ui_dropshadow(rctf *rct, float radius, float aspect, int select);
#endif
diff --git a/source/blender/include/multires.h b/source/blender/include/multires.h
index 493387f6e1f..bfa765e62ef 100644
--- a/source/blender/include/multires.h
+++ b/source/blender/include/multires.h
@@ -63,6 +63,9 @@ void multires_level_to_mesh(struct Object *ob, struct Mesh *me, const int render
void multires_edge_level_update(void *ob, void *me);
int multires_modifier_warning();
+/* after adding or removing vcolor layers, run this */
+void multires_load_cols(Mesh *me);
+
/* multires-firstlevel.c */
/* Generic */
void multires_update_first_level(struct Mesh *me, struct EditMesh *em);
diff --git a/source/blender/include/mydevice.h b/source/blender/include/mydevice.h
index 113b281a017..bec0e13726b 100644
--- a/source/blender/include/mydevice.h
+++ b/source/blender/include/mydevice.h
@@ -253,6 +253,8 @@
#define REDRAWANIM 0x4037
#define REDRAWNODE 0x4038
#define RECALC_COMPOSITE 0x4039
+#define REDRAWMARKER 0x4040 /* all views that display markers */
+#define REDRAWVIEW3D_IMAGE 0x4041
#endif /* !__MYDEVICE_H__ */
diff --git a/source/blender/include/transform.h b/source/blender/include/transform.h
index e7650b2f72a..623514a1a32 100755..100644
--- a/source/blender/include/transform.h
+++ b/source/blender/include/transform.h
@@ -44,6 +44,7 @@ struct NumInput;
struct Object;
struct View3D;
struct ScrArea;
+struct bPose;
typedef struct NumInput {
@@ -160,6 +161,8 @@ typedef struct TransInfo {
float fac; /* factor for distance based transform */
int (*transform)(struct TransInfo *, short *);
/* transform function pointer */
+ int (*handleEvent)(struct TransInfo *, unsigned short event, short val);
+ /* event handler function pointer RETURN 1 if redraw is needed */
int total; /* total number of transformed data */
TransData *data; /* transformed data (array) */
TransDataExtension *ext; /* transformed data extension (array) */
@@ -193,6 +196,8 @@ typedef struct TransInfo {
char spacename[32]; /* name of the current space */
struct Object *poseobj; /* if t->flag & T_POSE, this denotes pose object */
+
+ void *customData; /* Per Transform custom data */
} TransInfo;
@@ -211,32 +216,37 @@ typedef struct TransInfo {
#define TRANS_CANCEL 2
/* transinfo->flag */
-#define T_OBJECT 1
-#define T_EDIT 2
-#define T_POSE 4
-#define T_TEXTURE 8
-#define T_CAMERA 16
+#define T_OBJECT (1 << 0)
+#define T_EDIT (1 << 1)
+#define T_POSE (1 << 2)
+#define T_TEXTURE (1 << 3)
+#define T_CAMERA (1 << 4)
// when shift pressed, higher resolution transform. cannot rely on G.qual, need event!
-#define T_SHIFT_MOD 32
+#define T_SHIFT_MOD (1 << 5)
// trans on points, having no rotation/scale
-#define T_POINTS 64
+#define T_POINTS (1 << 6)
// for manipulator exceptions, like scaling using center point, drawing help lines
-#define T_USES_MANIPULATOR 128
+#define T_USES_MANIPULATOR (1 << 7)
/* restrictions flags */
-#define T_ALL_RESTRICTIONS (256|512|1024)
-#define T_NO_CONSTRAINT 256
-#define T_NULL_ONE 512
-#define T_NO_ZERO 1024
+#define T_ALL_RESTRICTIONS ((1 << 8)|(1 << 9)|(1 << 10))
+#define T_NO_CONSTRAINT (1 << 8)
+#define T_NULL_ONE (1 << 9)
+#define T_NO_ZERO (1 << 10)
-#define T_PROP_EDIT 2048
-#define T_PROP_CONNECTED 4096
+#define T_PROP_EDIT (1 << 11)
+#define T_PROP_CONNECTED (1 << 12)
/* if MMB is pressed or not */
-#define T_MMB_PRESSED 8192
-#define T_V3D_ALIGN 16384
-#define T_2D_EDIT 32768 /* for 2d views like uv or ipo */
-#define T_CLIP_UV 65536
+#define T_MMB_PRESSED (1 << 13)
+
+#define T_V3D_ALIGN (1 << 14)
+#define T_2D_EDIT (1 << 15) /* for 2d views like uv or ipo */
+#define T_CLIP_UV (1 << 16)
+
+#define T_FREE_CUSTOMDATA (1 << 17)
+
+/* ******************************************************************************** */
/* transinfo->con->mode */
#define CON_APPLY 1
@@ -255,9 +265,13 @@ typedef struct TransInfo {
#define TD_NOTCONNECTED 8
#define TD_SINGLESIZE 16 /* used for scaling of MetaElem->rad */
#ifdef WITH_VERSE
-#define TD_VERSE_OBJECT 32
-#define TD_VERSE_VERT 64
+ #define TD_VERSE_OBJECT 32
+ #define TD_VERSE_VERT 64
#endif
+#define TD_TIMEONLY 128
+#define TD_NOCENTER 256
+#define TD_NO_EXT 512 /* ext abused for particle key timing */
+#define TD_SKIP 1024 /* don't transform this data */
/* transsnap->status */
#define SNAP_ON 1
@@ -287,6 +301,7 @@ void initWarp(TransInfo *t);
int Warp(TransInfo *t, short mval[2]);
void initShear(TransInfo *t);
+int handleEventShear(TransInfo *t, unsigned short evenl, short val);
int Shear(TransInfo *t, short mval[2]);
void initResize(TransInfo *t);
@@ -328,9 +343,23 @@ int BoneEnvelope(TransInfo *t, short mval[2]);
void initBoneRoll(TransInfo *t);
int BoneRoll(TransInfo *t, short mval[2]);
+void initTimeTranslate(TransInfo *t);
+int TimeTranslate(TransInfo *t, short mval[2]);
+
+void initTimeSlide(TransInfo *t);
+int TimeSlide(TransInfo *t, short mval[2]);
+
+void initTimeScale(TransInfo *t);
+int TimeScale(TransInfo *t, short mval[2]);
+
+void initBakeTime(TransInfo *t);
+int BakeTime(TransInfo *t, short mval[2]);
+
/*********************** transform_conversions.c ********** */
struct ListBase;
+void flushTransIpoData(TransInfo *t);
void flushTransUVs(TransInfo *t);
+void flushTransParticles(TransInfo *t);
int clipUVTransform(TransInfo *t, float *vec, int resize);
/*********************** exported from transform_manipulator.c ********** */
@@ -344,6 +373,10 @@ void sort_trans_data_dist(TransInfo *t);
void add_tdi_poin(float *poin, float *old, float delta);
void special_aftertrans_update(TransInfo *t);
+/* auto-keying stuff used by special_aftertrans_update */
+void autokeyframe_ob_cb_func(struct Object *ob, int tmode);
+void autokeyframe_pose_cb_func(struct Object *ob, int tmode, short targetless_ik);
+
/*********************** Constraints *****************************/
void getConstraintMatrix(TransInfo *t);
@@ -407,6 +440,7 @@ void calculateCenterBound(TransInfo *t);
void calculateCenterMedian(TransInfo *t);
void calculateCenterCursor(TransInfo *t);
+void calculateCenterCursor2D(TransInfo *t);
void calculatePropRatio(TransInfo *t);
void getViewVector(float coord[3], float vec[3]);
diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h
index 14e39faf2c6..57aec75700f 100644
--- a/source/blender/makesdna/DNA_ID.h
+++ b/source/blender/makesdna/DNA_ID.h
@@ -65,7 +65,7 @@ typedef struct IDProperty {
/*totallen is total length of allocated array/string, including a buffer.
Note that the buffering is mild; the code comes from python's list implementation.*/
int totallen; /*strings and arrays are both buffered, though the buffer isn't
- saved. at least it won't be when I write that code. :)*/
+ saved.*/
} IDProperty;
#define MAX_IDPROP_NAME 32
@@ -75,21 +75,12 @@ typedef struct IDProperty {
#define IDP_STRING 0
#define IDP_INT 1
#define IDP_FLOAT 2
-#define IDP_VECTOR 3
-#define IDP_MATRIX 4
#define IDP_ARRAY 5
#define IDP_GROUP 6
+/*the ID link property type hasn't been implemented yet, this will require
+ some cleanup of blenkernel, most likely.*/
#define IDP_ID 7
-/*special types for vector, matrices and arrays
- these arn't quite completely implemented, and
- may be removed.*/
-#define IDP_MATRIX4X4 9
-#define IDP_MATRIX3X3 10
-#define IDP_VECTOR2D 11
-#define IDP_VECTOR3D 12
-#define IDP_VECTOR4D 13
-#define IDP_FILE 14
/*add any future new id property types here.*/
/* watch it: Sequence has identical beginning. */
@@ -129,6 +120,18 @@ typedef struct Library {
struct Library *parent; /* for outliner, showing dependency */
} Library;
+#define PREVIEW_MIPMAPS 2
+#define PREVIEW_MIPMAP_ZERO 0
+#define PREVIEW_MIPMAP_LARGE 1
+
+typedef struct PreviewImage {
+ unsigned int w[2];
+ unsigned int h[2];
+ short changed[2];
+ short pad0, pad1;
+ unsigned int * rect[2];
+} PreviewImage;
+
/**
* Defines for working with IDs.
*
@@ -180,6 +183,7 @@ typedef struct Library {
#define ID_SCRIPT MAKE_ID2('P', 'Y')
#define ID_NT MAKE_ID2('N', 'T')
#define ID_BR MAKE_ID2('B', 'R')
+#define ID_PA MAKE_ID2('P', 'A')
/* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */
#define ID_SEQ MAKE_ID2('S', 'Q')
diff --git a/source/blender/makesdna/DNA_action_types.h b/source/blender/makesdna/DNA_action_types.h
index 259167b6e6e..3c5ef7c94e6 100644
--- a/source/blender/makesdna/DNA_action_types.h
+++ b/source/blender/makesdna/DNA_action_types.h
@@ -35,7 +35,6 @@
#include "DNA_view2d_types.h"
struct SpaceLink;
-struct ListBase;
struct Object;
/* PoseChannel stores the results of Actions (ipos) and transform information
@@ -43,7 +42,7 @@ struct Object;
typedef struct bPoseChannel {
struct bPoseChannel *next, *prev;
- ListBase constraints;
+ ListBase constraints;/* Constraints that act on this PoseChannel */
char name[32]; /* Channels need longer names than normal blender objects */
short flag; /* dynamic, for detecting transform changes */
@@ -61,7 +60,12 @@ typedef struct bPoseChannel {
struct bPoseChannel *parent; /* set on read file or rebuild pose */
struct bPoseChannel *child; /* set on read file or rebuild pose, the 'ik' child, for b-bones */
struct ListBase iktree; /* only while evaluating pose */
- void *b_bone_mats; /* only while deform, stores precalculated b_bone deform mats */
+
+ /* only while deform, stores precalculated b_bone deform mats,
+ dual quaternions */
+ void *b_bone_mats;
+ void *dual_quat;
+ void *b_bone_dual_quats;
float loc[3]; /* written in by actions or transform */
float size[3];
@@ -69,6 +73,7 @@ typedef struct bPoseChannel {
float chan_mat[4][4]; /* matrix result of loc/quat/size , and where we put deform in, see next line */
float pose_mat[4][4]; /* constraints accumulate here. in the end, pose_mat = bone->arm_mat * chan_mat */
+ float constinv[4][4]; /* inverse result of constraints. doesn't include effect of restposition, parent, and local transform*/
float pose_head[3]; /* actually pose_mat[3] */
float pose_tail[3]; /* also used for drawing help lines... */
@@ -82,30 +87,39 @@ typedef struct bPoseChannel {
} bPoseChannel;
-
-typedef struct bPose{
- ListBase chanbase;
+/* Pose-Object. It is only found under ob->pose. It is not library data, even
+ * though there is a define for it (hack for the outliner).
+ */
+typedef struct bPose {
+ ListBase chanbase; /* list of pose channels */
short flag, proxy_layer; /* proxy layer: copy from armature, gets synced */
float ctime; /* local action time of this pose */
float stride_offset[3]; /* applied to object */
float cyclic_offset[3]; /* result of match and cycles, applied in where_is_pose() */
} bPose;
+/* Action Channels belong to Actions. They are linked with an IPO block, and can also own
+ * Constraint Channels in certain situations.
+ */
typedef struct bActionChannel {
struct bActionChannel *next, *prev;
- struct Ipo *ipo;
- ListBase constraintChannels;
+ struct Ipo *ipo; /* IPO block this action channel references */
+ ListBase constraintChannels; /* Constraint Channels (when Action Channel represents an Object or Bone) */
- int flag;
- char name[32]; /* Channel name */
+ int flag; /* settings accessed via bitmapping */
+ char name[32]; /* channel name */
int reserved1;
} bActionChannel;
+/* Action. A recyclable block that contains a series of Action Channels (ipo), which define
+ * a clip of reusable animation for use in the NLA.
+ */
typedef struct bAction {
ID id;
- ListBase chanbase; /* Action Channels in this action */
+ ListBase chanbase; /* Action Channels in this Action */
} bAction;
+/* Action Editor Space. This is defined here instead of in DNA_space_types.h */
typedef struct SpaceAction {
struct SpaceLink *next, *prev;
int spacetype;
@@ -115,35 +129,57 @@ typedef struct SpaceAction {
short blockhandler[8];
View2D v2d;
- bAction *action;
- short flag, autosnap;
- short pin, actnr, lock, actwidth;
- float timeslide;
+
+ bAction *action; /* the currently active action */
+ short flag, autosnap; /* flag: bitmapped settings; autosnap: automatic keyframe snapping mode */
+ short pin, actnr, lock; /* pin: keep showing current action; actnr: used for finding chosen action from menu; lock: lock time to other windows */
+ short actwidth; /* width of the left-hand side name panel (in pixels?) */
+ float timeslide; /* for Time-Slide transform mode drawing - current frame? */
} SpaceAction;
/* Action Channel flags */
-#define ACHAN_SELECTED 0x00000001
-#define ACHAN_HILIGHTED 0x00000002
-#define ACHAN_HIDDEN 0x00000004
-#define ACHAN_PROTECTED 0x00000008
-#define ACHAN_EXPANDED 0x00000010
-#define ACHAN_SHOWIPO 0x00000020
-#define ACHAN_SHOWCONS 0x00000040
-#define ACHAN_MOVED 0x80000000
+typedef enum ACHAN_FLAG {
+ ACHAN_SELECTED = (1<<0),
+ ACHAN_HILIGHTED = (1<<1),
+ ACHAN_HIDDEN = (1<<2),
+ ACHAN_PROTECTED = (1<<3),
+ ACHAN_EXPANDED = (1<<4),
+ ACHAN_SHOWIPO = (1<<5),
+ ACHAN_SHOWCONS = (1<<6),
+ ACHAN_MOVED = (1<<31),
+} ACHAN_FLAG;
/* SpaceAction flag */
-#define SACTION_MOVING 1 /* during transform */
-#define SACTION_SLIDERS 2 /* show sliders (if relevant) - limited to shape keys for now */
-
-/* SpaceAction AutoSnap Settings */
-#define SACTSNAP_OFF 0 /* no auto-snap */
-#define SACTSNAP_STEP 1 /* snap to 1.0 frame intervals */
-#define SACTSNAP_FRAME 2 /* snap to actual frames (nla-action time) */
+typedef enum SACTION_FLAG {
+ /* during transform */
+ SACTION_MOVING = (1<<0),
+ /* show sliders (if relevant) */
+ SACTION_SLIDERS = (1<<1),
+ /* draw time in seconds instead of time in frames */
+ SACTION_DRAWTIME = (1<<2)
+} SACTION_FLAG;
+
+/* SpaceAction AutoSnap Settings (also used by SpaceNLA) */
+typedef enum SACTSNAP_MODES {
+ /* no auto-snap */
+ SACTSNAP_OFF = 0,
+ /* snap to 1.0 frame/second intervals */
+ SACTSNAP_STEP,
+ /* snap to actual frames/seconds (nla-action time) */
+ SACTSNAP_FRAME,
+ /* snap to nearest marker */
+ SACTSNAP_MARKER,
+} SACTSNAP_MODES;
/* Pose->flag */
-#define POSE_RECALC 1
-#define POSE_LOCKED 2
-#define POSE_DO_UNLOCK 4
+typedef enum POSE_FLAG {
+ /* results in armature_rebuild_pose being called */
+ POSE_RECALC = (1<<0),
+ /* prevents any channel from getting overridden by anim from IPO */
+ POSE_LOCKED = (1<<1),
+ /* clears the POSE_LOCKED flag for the next time the pose is evaluated */
+ POSE_DO_UNLOCK = (1<<2)
+} POSE_FLAG;
/* PoseChannel (transform) flags */
enum {
@@ -163,22 +199,26 @@ enum {
};
/* PoseChannel constflag (constraint detection) */
-#define PCHAN_HAS_IK 1
-#define PCHAN_HAS_CONST 2
- /* only used for drawing Posemode, not stored in channel */
-#define PCHAN_HAS_ACTION 4
-#define PCHAN_HAS_TARGET 8
- /* only for drawing Posemode too */
-#define PCHAN_HAS_STRIDE 16
+typedef enum PCHAN_CONSTFLAG {
+ PCHAN_HAS_IK = (1<<0),
+ PCHAN_HAS_CONST = (1<<1),
+ /* only used for drawing Posemode, not stored in channel */
+ PCHAN_HAS_ACTION = (1<<2),
+ PCHAN_HAS_TARGET = (1<<3),
+ /* only for drawing Posemode too */
+ PCHAN_HAS_STRIDE = (1<<4)
+} PCHAN_CONSTFLAG;
/* PoseChannel->ikflag */
-#define BONE_IK_NO_XDOF 1
-#define BONE_IK_NO_YDOF 2
-#define BONE_IK_NO_ZDOF 4
-
-#define BONE_IK_XLIMIT 8
-#define BONE_IK_YLIMIT 16
-#define BONE_IK_ZLIMIT 32
+typedef enum PCHAN_IKFLAG {
+ BONE_IK_NO_XDOF = (1<<0),
+ BONE_IK_NO_YDOF = (1<<1),
+ BONE_IK_NO_ZDOF = (1<<2),
+
+ BONE_IK_XLIMIT = (1<<3),
+ BONE_IK_YLIMIT = (1<<4),
+ BONE_IK_ZLIMIT = (1<<5)
+} PCHAN_IKFLAG;
#endif
diff --git a/source/blender/makesdna/DNA_armature_types.h b/source/blender/makesdna/DNA_armature_types.h
index b3235fc71f3..f5eacede809 100644
--- a/source/blender/makesdna/DNA_armature_types.h
+++ b/source/blender/makesdna/DNA_armature_types.h
@@ -79,10 +79,11 @@ typedef struct bArmature {
short deformflag;
short pathflag;
short layer, layer_protected; /* for buttons to work, both variables in this order together */
- short ghostep, ghostsize; /*number of frames to ghosts to show, and step between them */
+ short ghostep, ghostsize; /* number of frames to ghosts to show, and step between them */
short ghosttype, pathsize; /* ghost drawing options and number of frames between points of path */
int ghostsf, ghostef; /* start and end frames of ghost-drawing range */
- int pathsf, pathef; /* start and end frames of path-calculation range for all bones */
+ int pathsf, pathef; /* start and end frames of path-calculation range for all bones */
+ int pathbc, pathac; /* number of frames before/after current frame of path-calculation for all bones */
}bArmature;
/* armature->flag */
@@ -111,13 +112,17 @@ typedef struct bArmature {
#define ARM_ENVELOPE 3
/* armature->deformflag */
-#define ARM_DEF_VGROUP 1
-#define ARM_DEF_ENVELOPE 2
+#define ARM_DEF_VGROUP 1
+#define ARM_DEF_ENVELOPE 2
+#define ARM_DEF_QUATERNION 4
+#define ARM_DEF_B_BONE_REST 8
+#define ARM_DEF_INVERT_VGROUP 16
/* armature->pathflag */
-#define ARM_PATH_FNUMS 0x001
-#define ARM_PATH_KFRAS 0x002
-#define ARM_PATH_HEADS 0x004
+#define ARM_PATH_FNUMS (1<<0)
+#define ARM_PATH_KFRAS (1<<1)
+#define ARM_PATH_HEADS (1<<2)
+#define ARM_PATH_ACFRA (1<<3)
/* armature->ghosttype */
#define ARM_GHOST_CUR 0
@@ -144,6 +149,11 @@ typedef struct bArmature {
/* multiplies vgroup with envelope */
#define BONE_MULT_VG_ENV 2048
#define BONE_NO_DEFORM 4096
-
+ /* set to prevent destruction of its unkeyframed pose (after transform) */
+#define BONE_UNKEYED 8192
+ /* set to prevent hinge child bones from influencing the transform center */
+#define BONE_HINGE_CHILD_TRANSFORM 16384
+ /* No parent scale */
+#define BONE_NO_SCALE (1<<15)
#endif
diff --git a/source/blender/makesdna/DNA_camera_types.h b/source/blender/makesdna/DNA_camera_types.h
index f25d8fd6412..4cb8ec25ebc 100644
--- a/source/blender/makesdna/DNA_camera_types.h
+++ b/source/blender/makesdna/DNA_camera_types.h
@@ -42,6 +42,7 @@ extern "C" {
#endif
struct Ipo;
+struct Object;
typedef struct Camera {
ID id;
@@ -62,6 +63,7 @@ typedef struct Camera {
struct Ipo *ipo;
ScriptLink scriptlink;
+ struct Object *dof_ob;
} Camera;
/* **************** CAMERA ********************* */
diff --git a/source/blender/makesdna/DNA_constraint_types.h b/source/blender/makesdna/DNA_constraint_types.h
index 74307454187..bf512c3faf8 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -25,7 +25,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): 2007, Joshua Leung, major recode
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
* Constraint DNA data
@@ -36,44 +36,110 @@
#include "DNA_ID.h"
#include "DNA_ipo_types.h"
+#include "DNA_listBase.h"
#include "DNA_object_types.h"
struct Action;
+struct Text;
/* channels reside in Object or Action (ListBase) constraintChannels */
-typedef struct bConstraintChannel{
+typedef struct bConstraintChannel {
struct bConstraintChannel *next, *prev;
Ipo *ipo;
short flag;
char name[30];
} bConstraintChannel;
-typedef struct bConstraint{
+/* A Constraint */
+typedef struct bConstraint {
struct bConstraint *next, *prev;
+
void *data; /* Constraint data (a valid constraint type) */
short type; /* Constraint type */
- short flag; /* Flag */
- short reserved1;
- char name[30]; /* Constraint name */
-
- float enforce;
+ short flag; /* Flag - General Settings */
+
+ char ownspace; /* Space that owner should be evaluated in */
+ char tarspace; /* Space that target should be evaluated in (only used if 1 target) */
+
+ char name[30]; /* Constraint name */
+
+ float enforce; /* Amount of influence exherted by constraint (0.0-1.0) */
+ float headtail; /* Point along subtarget bone where the actual target is. 0=head (default for all), 1=tail*/
+ int pad;
} bConstraint;
-/* Single-target subobject constraints */
-typedef struct bKinematicConstraint{
+
+/* Multiple-target constraints --------------------- */
+
+/* This struct defines a constraint target.
+ * It is used during constraint solving regardless of how many targets the
+ * constraint has.
+ */
+typedef struct bConstraintTarget {
+ struct bConstraintTarget *next, *prev;
+
+ Object *tar; /* object to use as target */
+ char subtarget[32]; /* subtarget - pchan or vgroup name */
+
+ float matrix[4][4]; /* matrix used during constraint solving - should be cleared before each use */
+
+ short space; /* space that target should be evaluated in (overrides bConstraint->tarspace) */
+ short flag; /* runtime settings (for editor, etc.) */
+ short type; /* type of target (B_CONSTRAINT_OB_TYPE) */
+ short pad;
+} bConstraintTarget;
+
+/* bConstraintTarget -> flag */
+typedef enum B_CONSTRAINT_TARGET_FLAG {
+ CONSTRAINT_TAR_TEMP = (1<<0), /* temporary target-struct that needs to be freed after use */
+} B_CONSTRAINT_TARGET_FLAG;
+
+/* bConstraintTarget/bConstraintOb -> type */
+typedef enum B_CONSTRAINT_OB_TYPE {
+ CONSTRAINT_OBTYPE_OBJECT = 1, /* string is "" */
+ CONSTRAINT_OBTYPE_BONE, /* string is bone-name */
+ CONSTRAINT_OBTYPE_VERT, /* string is vertex-group name */
+ CONSTRAINT_OBTYPE_CV /* string is vertex-group name - is not available until curves get vgroups */
+} B_CONSTRAINT_OB_TYPE;
+
+
+
+/* Python Script Constraint */
+typedef struct bPythonConstraint {
+ struct Text *text; /* text-buffer (containing script) to execute */
+ IDProperty *prop; /* 'id-properties' used to store custom properties for constraint */
+
+ int flag; /* general settings/state indicators accessed by bitmapping */
+ int tarnum; /* number of targets - usually only 1-3 are needed */
+
+ ListBase targets; /* a list of targets that this constraint has (bConstraintTarget-s) */
+
+ Object *tar; /* target from previous implementation (version-patch sets this to NULL on file-load) */
+ char subtarget[32]; /* subtarger from previous implentation (version-patch sets this to "" on file-load) */
+} bPythonConstraint;
+
+
+/* Inverse-Kinematics (IK) constraint */
+typedef struct bKinematicConstraint {
Object *tar;
short iterations; /* Maximum number of iterations to try */
short flag; /* Like CONSTRAINT_IK_TIP */
int rootbone; /* index to rootbone, if zero go all the way to mother bone */
char subtarget[32]; /* String to specify sub-object target */
+ Object *poletar; /* Pole vector target */
+ char polesubtarget[32]; /* Pole vector sub-object target */
+ float poleangle; /* Pole vector rest angle */
+
float weight; /* Weight of goal in IK tree */
float orientweight; /* Amount of rotation a target applies on chain */
float grabtarget[3]; /* for target-less IK */
- int pad;
} bKinematicConstraint;
-typedef struct bTrackToConstraint{
+
+/* Single-target subobject constraints --------------------- */
+/* Track To Constraint */
+typedef struct bTrackToConstraint {
Object *tar;
int reserved1; /* I'll be using reserved1 and reserved2 as Track and Up flags, not sure if that's what they were intented for anyway. Not sure either if it would create backward incompatibility if I were to rename them. - theeth*/
int reserved2;
@@ -82,52 +148,57 @@ typedef struct bTrackToConstraint{
char subtarget[32];
} bTrackToConstraint;
-typedef struct bRotateLikeConstraint{
+/* Copy Rotation Constraint */
+typedef struct bRotateLikeConstraint {
Object *tar;
int flag;
int reserved1;
char subtarget[32];
} bRotateLikeConstraint;
-typedef struct bLocateLikeConstraint{
+/* Copy Location Constraint */
+typedef struct bLocateLikeConstraint {
Object *tar;
int flag;
int reserved1;
char subtarget[32];
} bLocateLikeConstraint;
-typedef struct bMinMaxConstraint{
+/* Floor Constraint */
+typedef struct bMinMaxConstraint {
Object *tar;
int minmaxflag;
- float offset;
- int flag;
- short sticky, stuck, pad1, pad2; /* for backward compatability */
- float cache[3];
+ float offset;
+ int flag;
+ short sticky, stuck, pad1, pad2; /* for backward compatability */
+ float cache[3];
char subtarget[32];
} bMinMaxConstraint;
-typedef struct bSizeLikeConstraint{
+/* Copy Scale Constraint */
+typedef struct bSizeLikeConstraint {
Object *tar;
int flag;
int reserved1;
char subtarget[32];
} bSizeLikeConstraint;
-typedef struct bActionConstraint{
+/* Action Constraint */
+typedef struct bActionConstraint {
Object *tar;
- short type;
- short local;
- int start;
- int end;
+ short type; /* what transform 'channel' drives the result */
+ short local; /* was used in versions prior to the Constraints recode */
+ int start;
+ int end;
float min;
float max;
- int pad;
+ int pad;
struct bAction *act;
char subtarget[32];
} bActionConstraint;
/* Locked Axis Tracking constraint */
-typedef struct bLockTrackConstraint{
+typedef struct bLockTrackConstraint {
Object *tar;
int trackflag;
int lockflag;
@@ -135,7 +206,7 @@ typedef struct bLockTrackConstraint{
} bLockTrackConstraint;
/* Follow Path constraints */
-typedef struct bFollowPathConstraint{
+typedef struct bFollowPathConstraint {
Object *tar; /* Must be path object */
float offset; /* Offset in time on the path (in frame) */
int followflag;
@@ -143,26 +214,8 @@ typedef struct bFollowPathConstraint{
int upflag;
} bFollowPathConstraint;
-/* Distance Limiting constraints */
-typedef struct bDistanceLimitConstraint{
- Object *tar;
- char subtarget[32];
- float pad1;
- float pad2;
- float distance;
- float offset[3];
-} bDistanceLimitConstraint;
-
-
-/* Zero-target constraints */
-typedef struct bRotationConstraint{
- float xmin, xmax;
- float ymin, ymax;
- float zmin, zmax;
-} bRotationConstraint;
-
/* Stretch to constraint */
-typedef struct bStretchToConstraint{
+typedef struct bStretchToConstraint {
Object *tar;
int volmode;
int plane;
@@ -171,33 +224,8 @@ typedef struct bStretchToConstraint{
char subtarget[32];
} bStretchToConstraint;
-/* transform limiting constraints - zero target */
-typedef struct bLocLimitConstraint{
- float xmin, xmax;
- float ymin, ymax;
- float zmin, zmax;
- short flag;
- short flag2;
-} bLocLimitConstraint;
-
-typedef struct bRotLimitConstraint{
- float xmin, xmax;
- float ymin, ymax;
- float zmin, zmax;
- short flag;
- short pad1;
-} bRotLimitConstraint;
-
-typedef struct bSizeLimitConstraint{
- float xmin, xmax;
- float ymin, ymax;
- float zmin, zmax;
- short flag;
- short pad1;
-} bSizeLimitConstraint;
-
/* Rigid Body constraint */
-typedef struct bRigidBodyJointConstraint{
+typedef struct bRigidBodyJointConstraint {
Object *tar;
Object *child;
int type;
@@ -216,49 +244,133 @@ typedef struct bRigidBodyJointConstraint{
short pad2;
} bRigidBodyJointConstraint;
-/* ClampTo Constraint */
+/* Clamp-To Constraint */
typedef struct bClampToConstraint {
Object *tar; /* 'target' must be a curve */
int flag; /* which axis/plane to compare owner's location on */
- int pad;
+ int flag2; /* for legacy reasons, this is flag2. used for any extra settings */
} bClampToConstraint;
-/* bConstraint.type */
-#define CONSTRAINT_TYPE_NULL 0
-#define CONSTRAINT_TYPE_CHILDOF 1 /* Unimplemented */
-#define CONSTRAINT_TYPE_TRACKTO 2
-#define CONSTRAINT_TYPE_KINEMATIC 3
-#define CONSTRAINT_TYPE_FOLLOWPATH 4
-#define CONSTRAINT_TYPE_ROTLIMIT 5 /* Unimplemented no longer :) - Aligorith */
-#define CONSTRAINT_TYPE_LOCLIMIT 6 /* Unimplemented no longer :) - Aligorith */
-#define CONSTRAINT_TYPE_SIZELIMIT 7 /* Unimplemented no longer :) - Aligorith */
-#define CONSTRAINT_TYPE_ROTLIKE 8
-#define CONSTRAINT_TYPE_LOCLIKE 9
-#define CONSTRAINT_TYPE_SIZELIKE 10
-#define CONSTRAINT_TYPE_PYTHON 11 /* Unimplemented */
-#define CONSTRAINT_TYPE_ACTION 12
-#define CONSTRAINT_TYPE_LOCKTRACK 13 /* New Tracking constraint that locks an axis in place - theeth */
-#define CONSTRAINT_TYPE_DISTANCELIMIT 14
-#define CONSTRAINT_TYPE_STRETCHTO 15 /* claiming this to be mine :) is in tuhopuu bjornmose */
-#define CONSTRAINT_TYPE_MINMAX 16 /* floor constraint */
-#define CONSTRAINT_TYPE_RIGIDBODYJOINT 17 /* rigidbody constraint */
-#define CONSTRAINT_TYPE_CLAMPTO 18 /* clampto constraint */
-
-/* bConstraint.flag */
+/* Child Of Constraint */
+typedef struct bChildOfConstraint {
+ Object *tar; /* object which will act as parent (or target comes from) */
+ int flag; /* settings */
+ int pad;
+ float invmat[4][4]; /* parent-inverse matrix to use */
+ char subtarget[32]; /* string to specify a subobject target */
+} bChildOfConstraint;
+
+/* Generic Transform->Transform Constraint */
+typedef struct bTransformConstraint {
+ Object *tar; /* target (i.e. 'driver' object/bone) */
+ char subtarget[32];
+
+ short from, to; /* can be loc(0) , rot(1), or size(2) */
+ char map[3]; /* defines which target-axis deform is copied by each owner-axis */
+ char expo; /* extrapolate motion? if 0, confine to ranges */
+
+ float from_min[3]; /* from_min/max defines range of target transform */
+ float from_max[3]; /* to map on to to_min/max range. */
+
+ float to_min[3]; /* range of motion on owner caused by target */
+ float to_max[3];
+} bTransformConstraint;
+
+/* transform limiting constraints - zero target ---------------------------- */
+/* Limit Location Constraint */
+typedef struct bLocLimitConstraint {
+ float xmin, xmax;
+ float ymin, ymax;
+ float zmin, zmax;
+ short flag;
+ short flag2;
+} bLocLimitConstraint;
+
+/* Limit Rotation Constraint */
+typedef struct bRotLimitConstraint {
+ float xmin, xmax;
+ float ymin, ymax;
+ float zmin, zmax;
+ short flag;
+ short pad1;
+} bRotLimitConstraint;
+
+/* Limit Scaling Constraint */
+typedef struct bSizeLimitConstraint {
+ float xmin, xmax;
+ float ymin, ymax;
+ float zmin, zmax;
+ short flag;
+ short pad1;
+} bSizeLimitConstraint;
+
+/* ------------------------------------------ */
+
+/* bConstraint->type
+ * - Do not ever change the order of these, or else files could get
+ * broken as their correct value cannot be resolved
+ */
+typedef enum B_CONSTAINT_TYPES {
+ CONSTRAINT_TYPE_NULL = 0, /* Invalid/legacy constraint */
+ CONSTRAINT_TYPE_CHILDOF, /* Unimplemented non longer :) - during constraints recode, Aligorith */
+ CONSTRAINT_TYPE_TRACKTO,
+ CONSTRAINT_TYPE_KINEMATIC,
+ CONSTRAINT_TYPE_FOLLOWPATH,
+ CONSTRAINT_TYPE_ROTLIMIT, /* Unimplemented no longer :) - Aligorith */
+ CONSTRAINT_TYPE_LOCLIMIT, /* Unimplemented no longer :) - Aligorith */
+ CONSTRAINT_TYPE_SIZELIMIT, /* Unimplemented no longer :) - Aligorith */
+ CONSTRAINT_TYPE_ROTLIKE,
+ CONSTRAINT_TYPE_LOCLIKE,
+ CONSTRAINT_TYPE_SIZELIKE,
+ CONSTRAINT_TYPE_PYTHON, /* Unimplemented no longer :) - Aligorith. Scripts */
+ CONSTRAINT_TYPE_ACTION,
+ CONSTRAINT_TYPE_LOCKTRACK, /* New Tracking constraint that locks an axis in place - theeth */
+ CONSTRAINT_TYPE_DISTANCELIMIT, /* was never properly coded - removed! */
+ CONSTRAINT_TYPE_STRETCHTO, /* claiming this to be mine :) is in tuhopuu bjornmose */
+ CONSTRAINT_TYPE_MINMAX, /* floor constraint */
+ CONSTRAINT_TYPE_RIGIDBODYJOINT, /* rigidbody constraint */
+ CONSTRAINT_TYPE_CLAMPTO, /* clampto constraint */
+ CONSTRAINT_TYPE_TRANSFORM, /* transformation (loc/rot/size -> loc/rot/size) constraint */
+
+ /* NOTE: everytime a new constraint is added, update this */
+ NUM_CONSTRAINT_TYPES= CONSTRAINT_TYPE_TRANSFORM
+} B_CONSTRAINT_TYPES;
+
+/* bConstraint->flag */
+/* flags 0x2 (1<<1) and 0x8 (1<<3) were used in past */
+/* flag 0x20 (1<<5) was used to indicate that a constraint was evaluated using a 'local' hack for posebones only */
+typedef enum B_CONSTRAINT_FLAG {
/* expand for UI */
-#define CONSTRAINT_EXPAND 0x01
+ CONSTRAINT_EXPAND = (1<<0),
/* pre-check for illegal object name or bone name */
-#define CONSTRAINT_DISABLE 0x04
- /* flags 0x2 and 0x8 were used in past, skip this */
- /* to indicate which Ipo should be shown, maybe for 3d access later too */
-#define CONSTRAINT_ACTIVE 0x10
- /* only for Pose, evaluates constraints in posechannel local space */
-#define CONSTRAINT_LOCAL 0x20
-
+ CONSTRAINT_DISABLE = (1<<2),
+ /* to indicate which Ipo should be shown, maybe for 3d access later too */
+ CONSTRAINT_ACTIVE = (1<<4),
+ /* to indicate that the owner's space should only be changed into ownspace, but not out of it */
+ CONSTRAINT_SPACEONCE = (1<<6)
+} B_CONSTRAINT_FLAG;
+
+/* bConstraint->ownspace/tarspace */
+typedef enum B_CONSTRAINT_SPACETYPES {
+ /* default for all - worldspace */
+ CONSTRAINT_SPACE_WORLD = 0,
+ /* for objects (relative to parent/without parent influence),
+ * for bones (along normals of bone, without parent/restpositions)
+ */
+ CONSTRAINT_SPACE_LOCAL,
+ /* for posechannels - pose space */
+ CONSTRAINT_SPACE_POSE,
+ /* for posechannels - local with parent */
+ CONSTRAINT_SPACE_PARLOCAL,
+} B_CONSTRAINT_SPACETYPES;
/* bConstraintChannel.flag */
-#define CONSTRAINT_CHANNEL_SELECT 0x01
-#define CONSTRAINT_CHANNEL_PROTECTED 0x02
+typedef enum B_CONSTRAINTCHANNEL_FLAG {
+ CONSTRAINT_CHANNEL_SELECT = (1<<0),
+ CONSTRAINT_CHANNEL_PROTECTED = (1<<1)
+} B_CONSTRAINTCHANNEL_FLAG;
+
+/* -------------------------------------- */
/**
* The flags for ROTLIKE, LOCLIKE and SIZELIKE should be kept identical
@@ -278,6 +390,7 @@ typedef struct bClampToConstraint {
#define LOCLIKE_X 0x01
#define LOCLIKE_Y 0x02
#define LOCLIKE_Z 0x04
+ /* LOCLIKE_TIP is a depreceated option... use headtail=1.0f instead */
#define LOCLIKE_TIP 0x08
#define LOCLIKE_X_INVERT 0x10
#define LOCLIKE_Y_INVERT 0x20
@@ -318,11 +431,15 @@ typedef struct bClampToConstraint {
#define PLANE_Y 0x01
#define PLANE_Z 0x02
+/* Clamp-To Constraint ->flag */
#define CLAMPTO_AUTO 0
#define CLAMPTO_X 1
#define CLAMPTO_Y 2
#define CLAMPTO_Z 3
+/* ClampTo Constraint ->flag2 */
+#define CLAMPTO_CYCLIC 1
+
/* bKinematicConstraint->flag */
#define CONSTRAINT_IK_TIP 1
#define CONSTRAINT_IK_ROT 2
@@ -330,6 +447,8 @@ typedef struct bClampToConstraint {
#define CONSTRAINT_IK_TEMP 8
#define CONSTRAINT_IK_STRETCH 16
#define CONSTRAINT_IK_POS 32
+#define CONSTRAINT_IK_SETANGLE 64
+#define CONSTRAINT_IK_GETANGLE 128
/* MinMax (floor) flags */
#define MINMAX_STICKY 0x01
@@ -348,13 +467,31 @@ typedef struct bClampToConstraint {
#define LIMIT_YROT 0x02
#define LIMIT_ZROT 0x04
+/* not used anymore - for older Limit Location constraints only */
#define LIMIT_NOPARENT 0x01
+/* python constraint -> flag */
+#define PYCON_USETARGETS 0x01
+#define PYCON_SCRIPTERROR 0x02
+
+/* ChildOf Constraint -> flag */
+#define CHILDOF_LOCX 0x001
+#define CHILDOF_LOCY 0x002
+#define CHILDOF_LOCZ 0x004
+#define CHILDOF_ROTX 0x008
+#define CHILDOF_ROTY 0x010
+#define CHILDOF_ROTZ 0x020
+#define CHILDOF_SIZEX 0x040
+#define CHILDOF_SIZEY 0x080
+#define CHILDOF_SIZEZ 0x100
+
+/* Rigid-Body Constraint */
#define CONSTRAINT_DRAW_PIVOT 0x40
/* important: these defines need to match up with PHY_DynamicTypes headerfile */
#define CONSTRAINT_RB_BALL 1
#define CONSTRAINT_RB_HINGE 2
+#define CONSTRAINT_RB_CONETWIST 4
#define CONSTRAINT_RB_VEHICLE 11
#define CONSTRAINT_RB_GENERIC6DOF 12
diff --git a/source/blender/makesdna/DNA_curve_types.h b/source/blender/makesdna/DNA_curve_types.h
index 5439c65aa81..807fc2add07 100644
--- a/source/blender/makesdna/DNA_curve_types.h
+++ b/source/blender/makesdna/DNA_curve_types.h
@@ -75,7 +75,8 @@ typedef struct BevPoint {
short f1, f2;
} BevPoint;
-/* note; alfa location in struct is abused by Key system */
+/* Keyframes on IPO curves and Points on Bezier Curves/Paths are generally BezTriples */
+/* note: alfa location in struct is abused by Key system */
/* vec in BezTriple looks like this:
vec[0][0]=x location of handle 1
vec[0][1]=y location of handle 1
@@ -90,15 +91,15 @@ typedef struct BevPoint {
typedef struct BezTriple {
float vec[3][3];
float alfa, weight, radius; /* alfa: tilt in 3D View, weight: used for softbody goal weight, radius: for bevel tapering */
- short h1, h2;
- char f1, f2, f3, hide;
+ short h1, h2; /* h1, h2: the handle type of the two handles */
+ char f1, f2, f3, hide; /* f1, f2, f3: used for selection status, hide: used to indicate whether BezTriple is hidden */
} BezTriple;
/* note; alfa location in struct is abused by Key system */
typedef struct BPoint {
float vec[4];
float alfa, weight; /* alfa: tilt in 3D View, weight: used for softbody goal weight */
- short f1, hide;
+ short f1, hide; /* f1: selection status, hide: is point hidden or not */
float radius, pad; /* user-set radius per point for bevelling etc */
} BPoint;
@@ -115,9 +116,11 @@ typedef struct Nurb {
float *knotsu, *knotsv;
BPoint *bp;
BezTriple *bezt;
+
+ short tilt_interp; /* KEY_LINEAR, KEY_CARDINAL, KEY_BSPLINE */
+ short pad;
int charidx;
- int pad;
} Nurb;
typedef struct CharInfo {
@@ -190,9 +193,12 @@ typedef struct Curve {
typedef struct IpoDriver {
struct Object *ob;
short blocktype, adrcode, type, flag;
- char name[128]; /* bone or constraint(?), or python expression here */
+ char name[128]; /* bone or constraint(?), or python expression here */
} IpoDriver;
+/* temp? we store more bone names in 1 driver... */
+#define DRIVER_NAME_OFFS 32
+
typedef struct IpoCurve {
struct IpoCurve *next, *prev;
diff --git a/source/blender/makesdna/DNA_customdata_types.h b/source/blender/makesdna/DNA_customdata_types.h
index 1c1676ba277..249a4a5c36c 100644
--- a/source/blender/makesdna/DNA_customdata_types.h
+++ b/source/blender/makesdna/DNA_customdata_types.h
@@ -67,7 +67,8 @@ typedef struct CustomData {
#define CD_PROP_FLT 10
#define CD_PROP_INT 11
#define CD_PROP_STR 12
-#define CD_NUMTYPES 13
+#define CD_ORIGSPACE 13 /* for modifier stack face location mapping */
+#define CD_NUMTYPES 14
/* Bits for CustomDataMask */
#define CD_MASK_MVERT (1 << CD_MVERT)
@@ -83,6 +84,7 @@ typedef struct CustomData {
#define CD_MASK_PROP_FLT (1 << CD_PROP_FLT)
#define CD_MASK_PROP_INT (1 << CD_PROP_INT)
#define CD_MASK_PROP_STR (1 << CD_PROP_STR)
+#define CD_MASK_ORIGSPACE (1 << CD_ORIGSPACE)
/* CustomData.flag */
diff --git a/source/blender/makesdna/DNA_group_types.h b/source/blender/makesdna/DNA_group_types.h
index 34764fac47d..3a074dd63bc 100644
--- a/source/blender/makesdna/DNA_group_types.h
+++ b/source/blender/makesdna/DNA_group_types.h
@@ -52,6 +52,10 @@ typedef struct Group {
ID id;
ListBase gobject; /* GroupObject */
+
+ /* Bad design, since layers stored in the scenes 'Base'
+ * the objects that show in the group can change depending
+ * on the last used scene */
unsigned int layer;
int pad;
} Group;
diff --git a/source/blender/makesdna/DNA_image_types.h b/source/blender/makesdna/DNA_image_types.h
index a18493ea189..8a5a7ce4a4c 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -41,11 +41,6 @@ struct anim;
struct ImBuf;
struct RenderResult;
-typedef struct PreviewImage {
- unsigned int w;
- unsigned int h;
- unsigned int * rect;
-} PreviewImage;
/* ImageUser is in Texture, in Nodes, Background Image, Image Window, .... */
/* should be used in conjunction with an ID * to Image. */
@@ -67,7 +62,7 @@ typedef struct ImageUser {
typedef struct Image {
ID id;
- char name[240];
+ char name[240]; /* file path */
ListBase ibufs; /* not written in file */
@@ -95,6 +90,9 @@ typedef struct Image {
short gen_x, gen_y, gen_type; /* for generated images */
+ /* display aspect - for UV editing images resized for faster openGL display */
+ float aspx, aspy;
+
/*#ifdef WITH_VERSE*/
void *vnode; /* pointer at verse bitmap node */
/*#endif*/
diff --git a/source/blender/makesdna/DNA_ipo_types.h b/source/blender/makesdna/DNA_ipo_types.h
index 441a3fc43fc..8ec412a3534 100644
--- a/source/blender/makesdna/DNA_ipo_types.h
+++ b/source/blender/makesdna/DNA_ipo_types.h
@@ -39,18 +39,20 @@
#include "DNA_ID.h"
+/* IPO Data-Block */
typedef struct Ipo {
ID id;
- ListBase curve;
- rctf cur;
- short blocktype, showkey;
- int pad;
-
+ ListBase curve; /* A list of IpoCurve structs in a linked list. */
+ rctf cur; /* Rect defining extents of keyframes? */
+
+ short blocktype, showkey; /* blocktype: self-explanatory; showkey: either 0 or 1 (show vertical yellow lines for editing) */
+ short muteipo, pad; /* muteipo: either 0 or 1 (whether ipo block is muted) */
} Ipo;
-/* sometimes used */
+/* NOTE: IpoCurve struct is defined in DNA_curve_types.h, not in here... */
+/* sometimes used */
typedef short IPO_Channel;
/* defines: are these duped or new? */
@@ -67,8 +69,8 @@ typedef short IPO_Channel;
/* ******************** */
-#define OB_TOTIPO 29
-#define OB_TOTNAM 29
+#define OB_TOTIPO 30
+#define OB_TOTNAM 30
#define OB_LOC_X 1
#define OB_LOC_Y 2
@@ -105,7 +107,10 @@ typedef short IPO_Channel;
#define OB_PD_SDAMP 27
#define OB_PD_RDAMP 28
#define OB_PD_PERM 29
+#define OB_PD_FMAXD 30
+/* exception: driver channel, for bone driver only */
+#define OB_ROT_DIFF 100
/* ******************** */
@@ -315,10 +320,11 @@ typedef short IPO_Channel;
#define AC_QUAT_Z 28
/* ******************** */
-#define CO_TOTIPO 1 /* Constraint Ipos */
-#define CO_TOTNAM 1
+#define CO_TOTIPO 2 /* Constraint Ipos */
+#define CO_TOTNAM 2
#define CO_ENFORCE 1
+#define CO_HEADTAIL 2
/*
#define CO_TIME 2
#define CO_OFFSET_X 3
@@ -349,6 +355,35 @@ typedef short IPO_Channel;
#define FLUIDSIM_ACTIVE 9
+/* ******************** */
+/* particle ipos */
+#define PART_TOTIPO 19
+#define PART_TOTNAM 19
+
+#define PART_EMIT_FREQ 1
+#define PART_EMIT_LIFE 2
+#define PART_EMIT_VEL 3
+#define PART_EMIT_AVE 4
+#define PART_EMIT_SIZE 5
+
+#define PART_AVE 6
+#define PART_SIZE 7
+#define PART_DRAG 8
+#define PART_BROWN 9
+#define PART_DAMP 10
+#define PART_LENGTH 11
+#define PART_CLUMP 12
+
+#define PART_GRAV_X 13
+#define PART_GRAV_Y 14
+#define PART_GRAV_Z 15
+
+#define PART_KINK_AMP 16
+#define PART_KINK_FREQ 17
+#define PART_KINK_SHAPE 18
+
+#define PART_BB_TILT 19
+
/* these are IpoCurve specific */
/* **************** IPO ********************* */
@@ -391,6 +426,9 @@ typedef short IPO_Channel;
#define IPO_AUTO_HORIZ 16
#define IPO_ACTIVE 32
#define IPO_PROTECT 64
+#define IPO_MUTE 128
#endif
+
+
diff --git a/source/blender/makesdna/DNA_key_types.h b/source/blender/makesdna/DNA_key_types.h
index 3292e07f80e..785cf515a42 100644
--- a/source/blender/makesdna/DNA_key_types.h
+++ b/source/blender/makesdna/DNA_key_types.h
@@ -44,8 +44,8 @@ typedef struct KeyBlock {
float pos;
float curval;
- short type, adrcode;
- int totelem;
+ short type, adrcode, relative, pad1; /* relative == 0 means first key is reference */
+ int totelem, pad2;
void *data;
float *weights;
diff --git a/source/blender/makesdna/DNA_lamp_types.h b/source/blender/makesdna/DNA_lamp_types.h
index 22696c48878..f8cc2378cb1 100644
--- a/source/blender/makesdna/DNA_lamp_types.h
+++ b/source/blender/makesdna/DNA_lamp_types.h
@@ -43,6 +43,7 @@
struct MTex;
struct Ipo;
+struct CurveMapping;
typedef struct Lamp {
ID id;
@@ -54,16 +55,26 @@ typedef struct Lamp {
float energy, dist, spotsize, spotblend;
float haint;
- float att1, att2;
+
+
+ float att1, att2; /* Quad1 and Quad2 attenuation */
+ int pad2;
+ struct CurveMapping *curfalloff;
+ short falloff_type;
+ short pad3;
float clipsta, clipend, shadspotsize;
float bias, soft;
short bufsize, samp, buffers, filtertype;
char bufflag, buftype;
- short ray_samp, ray_sampy, ray_sampz, ray_samp_type;
+ short ray_samp, ray_sampy, ray_sampz;
+ short ray_samp_type;
short area_shape;
float area_size, area_sizey, area_sizez;
+ float adapt_thresh;
+ short ray_samp_method;
+ short pad1;
/* texact is for buttons */
short texact, shadhalostep;
@@ -79,6 +90,9 @@ typedef struct Lamp {
struct MTex *mtex[10];
struct Ipo *ipo;
+ /* preview */
+ struct PreviewImage *preview;
+
ScriptLink scriptlink;
} Lamp;
@@ -97,7 +111,7 @@ typedef struct Lamp {
#define LA_SHAD_BUF 1
#define LA_HALO 2
#define LA_LAYER 4
-#define LA_QUAD 8
+#define LA_QUAD 8 /* no longer used */
#define LA_NEG 16
#define LA_ONLYSHADOW 32
#define LA_SPHERE 64
@@ -112,6 +126,14 @@ typedef struct Lamp {
/* Since it is used with LOCAL lamp, can't use LA_SHAD */
#define LA_YF_SOFT 16384
+/* falloff_type */
+#define LA_FALLOFF_CONSTANT 0
+#define LA_FALLOFF_INVLINEAR 1
+#define LA_FALLOFF_INVSQUARE 2
+#define LA_FALLOFF_CURVE 3
+#define LA_FALLOFF_SLIDERS 4
+
+
/* buftype, no flag */
#define LA_SHADBUF_REGULAR 0
#define LA_SHADBUF_IRREGULAR 1
@@ -132,6 +154,12 @@ typedef struct Lamp {
#define LA_AREA_CUBE 2
#define LA_AREA_BOX 3
+/* ray_samp_method */
+#define LA_SAMP_CONSTANT 0
+#define LA_SAMP_HALTON 1
+#define LA_SAMP_HAMMERSLEY 2
+
+
/* ray_samp_type */
#define LA_SAMP_ROUND 1
#define LA_SAMP_UMBRA 2
diff --git a/source/blender/makesdna/DNA_material_types.h b/source/blender/makesdna/DNA_material_types.h
index 0fad110d64b..c7301d4f974 100644
--- a/source/blender/makesdna/DNA_material_types.h
+++ b/source/blender/makesdna/DNA_material_types.h
@@ -73,10 +73,19 @@ typedef struct Material {
short har;
char seed1, seed2;
+ float gloss_mir, gloss_tra;
+ short samp_gloss_mir, samp_gloss_tra;
+ float adapt_thresh_mir, adapt_thresh_tra;
+ float aniso_gloss_mir;
+ float dist_mir;
+ short fadeto_mir;
+ short pad1;
+
int mode, mode_l; /* mode_l is the or-ed result of all layer modes */
short flarec, starc, linec, ringc;
float hasize, flaresize, subsize, flareboost;
float strand_sta, strand_end, strand_ease;
+ char strand_uvname[32];
float sbias; /* shadow bias */
float shad_alpha, padf; /* in use for irregular shadowbuffer */
@@ -105,7 +114,8 @@ typedef struct Material {
struct bNodeTree *nodetree;
struct Ipo *ipo;
struct Group *group; /* light group */
-
+ struct PreviewImage * preview;
+
/* dynamic properties */
float friction, fh, reflect;
float fhdist, xyfrict;
@@ -179,8 +189,14 @@ typedef struct Material {
/* qdn: a bit clumsy this, tangents needed for normal maps separated from shading */
#define MA_NORMAP_TANG 0x8000000
#define MA_GROUP_NOLAY 0x10000000
+#define MA_FACETEXTURE_ALPHA 0x20000000
+#define MA_STR_B_UNITS 0x40000000
+
+#define MA_MODE_MASK 0x4fffffff /* all valid mode bits */
-#define MA_MODE_MASK 0x1fffffff /* all valid mode bits */
+/* ray mirror fadeout */
+#define MA_RAYMIR_FADETOSKY 0
+#define MA_RAYMIR_FADETOMAT 1
/* diff_shader */
#define MA_DIFF_LAMBERT 0
@@ -260,6 +276,30 @@ typedef struct Material {
#define MAP_WARP 8192
#define MAP_LAYER 16384
+/* mapto for halo */
+//#define MAP_HA_COL 1
+//#define MAP_HA_ALPHA 128
+//#define MAP_HA_HAR 256
+//#define MAP_HA_SIZE 2
+//#define MAP_HA_ADD 64
+
+/* pmapto */
+/* init */
+#define MAP_PA_INIT 31
+#define MAP_PA_TIME 1
+#define MAP_PA_LIFE 2
+#define MAP_PA_DENS 4
+#define MAP_PA_SIZE 8
+#define MAP_PA_LENGTH 16
+/* reset */
+#define MAP_PA_IVEL 32
+/* physics */
+#define MAP_PA_PVEL 64
+/* path cache */
+#define MAP_PA_CACHE 384
+#define MAP_PA_CLUMP 128
+#define MAP_PA_KINK 256
+
/* pr_type */
#define MA_FLAT 0
#define MA_SPHERE 1
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 5f2a77b8349..59f3a64ba5e 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -61,23 +61,27 @@ typedef struct Mesh {
struct Key *key;
struct Material **mat;
- struct MFace *mface;
- struct MTFace *mtface;
+ struct MFace *mface; /* array of mesh object mode faces */
+ struct MTFace *mtface; /* store face UV's and texture here */
struct TFace *tface; /* depecrated, use mtface */
- struct MVert *mvert;
- struct MEdge *medge;
+ struct MVert *mvert; /* array of verts */
+ struct MEdge *medge; /* array of edges */
struct MDeformVert *dvert; /* __NLA */
- struct MCol *mcol;
+ struct MCol *mcol; /* array of colors, this must be the number of faces * 4 */
struct MSticky *msticky;
struct Mesh *texcomesh;
struct MSelect *mselect;
-
- struct OcInfo *oc; /* not written in file */
- void *sumohandle;
struct CustomData vdata, edata, fdata;
- int totvert, totedge, totface, totselect, pad2;
+ int totvert, totedge, totface, totselect;
+
+ /* the last selected vertex/edge/face are used for the active face however
+ * this means the active face must always be selected, this is to keep track
+ * 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;
+
int texflag;
/* texture space, copied as one block in editobject.c */
@@ -91,7 +95,7 @@ typedef struct Mesh {
short subdiv, subdivr;
short totcol;
- short subsurftype;
+ short subsurftype; /* only kept for backwards compat, not used anymore */
struct Multires *mr; /* Multiresolution modeling data */
struct PartialVisibility *pv;
@@ -103,7 +107,7 @@ typedef struct Mesh {
/* deprecated by MTFace, only here for file reading */
typedef struct TFace {
- void *tpage;
+ void *tpage; /* the faces image for the active UVLayer */
float uv[4][2];
unsigned int col[4];
char flag, transp;
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index 08b8ff038f0..1c038c51298 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -66,8 +66,10 @@ typedef struct MVert {
char flag, mat_nr;
} MVert;
+/* at the moment alpha is abused for vertex painting
+ * and not used for transperency, note that red and blue are swapped */
typedef struct MCol {
- char a, r, g, b;
+ char a, r, g, b;
} MCol;
typedef struct MSticky {
@@ -97,6 +99,9 @@ typedef struct MStringProperty{
char s[256];
} MStringProperty;
+typedef struct OrigSpaceFace {
+ float uv[4][2];
+} OrigSpaceFace;
/* Multiresolution modeling */
typedef struct MultiresCol {
@@ -202,7 +207,7 @@ typedef struct PartialVisibility {
/* mtface->flag */
#define TF_SELECT 1 /* use MFace hide flag (after 2.43), should be able to reuse after 2.44 */
-#define TF_ACTIVE 2
+#define TF_ACTIVE 2 /* deprecated! */
#define TF_SEL1 4
#define TF_SEL2 8
#define TF_SEL3 16
@@ -231,6 +236,8 @@ typedef struct PartialVisibility {
#define TF_SOLID 0
#define TF_ADD 1
#define TF_ALPHA 2
+
+/* sub is not available in the user interface anymore */
#define TF_SUB 3
/* mtface->unwrap */
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 2d296ad10fa..982df45e77a 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -28,6 +28,10 @@ typedef enum ModifierType {
eModifierType_UVProject,
eModifierType_Smooth,
eModifierType_Cast,
+ eModifierType_MeshDeform,
+ eModifierType_ParticleSystem,
+ eModifierType_ParticleInstance,
+ eModifierType_Explode,
NUM_MODIFIER_TYPES
} ModifierType;
@@ -38,6 +42,7 @@ typedef enum ModifierMode {
eModifierMode_OnCage = (1<<3),
eModifierMode_Expanded = (1<<4),
eModifierMode_Virtual = (1<<5),
+ eModifierMode_DisableTemporary = (1 << 31)
} ModifierMode;
typedef struct ModifierData {
@@ -158,6 +163,7 @@ typedef struct MirrorModifierData {
short axis, flag;
float tolerance;
+ struct Object *mirror_ob;
} MirrorModifierData;
/* MirrorModifierData->flag */
@@ -310,9 +316,10 @@ typedef struct WaveModifierData {
typedef struct ArmatureModifierData {
ModifierData modifier;
- short deformflag, pad1; /* deformflag replaces armature->deformflag */
+ short deformflag, multi; /* deformflag replaces armature->deformflag */
int pad2;
struct Object *object;
+ float *prevCos; /* stored input of previous modifier, for vertexgroup blending */
char defgrp_name[32];
} ArmatureModifierData;
@@ -346,4 +353,86 @@ typedef struct BooleanModifierData {
int operation, pad;
} BooleanModifierData;
+#define MOD_MDEF_INVERT_VGROUP (1<<0)
+#define MOD_MDEF_DYNAMIC_BIND (1<<1)
+
+typedef struct MDefInfluence {
+ int vertex;
+ float weight;
+} MDefInfluence;
+
+typedef struct MDefCell {
+ int offset;
+ int totinfluence;
+} MDefCell;
+
+typedef struct MeshDeformModifierData {
+ ModifierData modifier;
+
+ struct Object *object; /* mesh object */
+ char defgrp_name[32]; /* optional vertexgroup name */
+
+ short gridsize, needbind;
+ short flag, pad;
+
+ /* variables filled in when bound */
+ float *bindweights, *bindcos; /* computed binding weights */
+ int totvert, totcagevert; /* total vertices in mesh and cage */
+ MDefCell *dyngrid; /* grid with dynamic binding cell points */
+ MDefInfluence *dyninfluences; /* dynamic binding vertex influences */
+ int *dynverts, *pad2; /* is this vertex bound or not? */
+ int dyngridsize; /* size of the dynamic bind grid */
+ int totinfluence; /* total number of vertex influences */
+ float dyncellmin[3]; /* offset of the dynamic bind grid */
+ float dyncellwidth; /* width of dynamic bind cell */
+ float bindmat[4][4]; /* matrix of cage at binding time */
+} MeshDeformModifierData;
+
+typedef enum {
+ eParticleSystemFlag_Loaded = (1<<0),
+ eParticleSystemFlag_Pars = (1<<1),
+ eParticleSystemFlag_FromCurve = (1<<2),
+ eParticleSystemFlag_DM_changed = (1<<3),
+ eParticleSystemFlag_Disabled = (1<<4),
+ eParticleSystemFlag_psys_updated = (1<<5),
+} ParticleSystemModifierFlag;
+
+typedef struct ParticleSystemModifierData {
+ ModifierData modifier;
+ struct ParticleSystem *psys;
+ struct DerivedMesh *dm;
+ short flag, rt[3];
+} ParticleSystemModifierData;
+
+typedef enum {
+ eParticleInstanceFlag_Parents = (1<<0),
+ eParticleInstanceFlag_Children = (1<<1),
+ eParticleInstanceFlag_Path = (1<<2),
+ eParticleInstanceFlag_Unborn = (1<<3),
+ eParticleInstanceFlag_Alive = (1<<4),
+ eParticleInstanceFlag_Dead = (1<<5),
+} ParticleInstanceModifierFlag;
+
+typedef struct ParticleInstanceModifierData {
+ ModifierData modifier;
+ struct Object *ob;
+ short psys, flag, rt[2];
+} ParticleInstanceModifierData;
+
+typedef enum {
+ eExplodeFlag_CalcFaces = (1<<0),
+ //eExplodeFlag_PaSize = (1<<1),
+ eExplodeFlag_EdgeSplit = (1<<2),
+ eExplodeFlag_Unborn = (1<<3),
+ eExplodeFlag_Alive = (1<<4),
+ eExplodeFlag_Dead = (1<<5),
+} ExplodeModifierFlag;
+
+typedef struct ExplodeModifierData {
+ ModifierData modifier;
+ int *facepa;
+ short flag, vgroup;
+ float protect;
+} ExplodeModifierData;
+
#endif
diff --git a/source/blender/makesdna/DNA_nla_types.h b/source/blender/makesdna/DNA_nla_types.h
index 914e6337474..d7ccfe01085 100644
--- a/source/blender/makesdna/DNA_nla_types.h
+++ b/source/blender/makesdna/DNA_nla_types.h
@@ -54,6 +54,7 @@ typedef struct bActionModifier {
struct Object *ob;
} bActionModifier;
+/* NLA-Modifier Types */
#define ACTSTRIP_MOD_DEFORM 0
#define ACTSTRIP_MOD_NOISE 1
#define ACTSTRIP_MOD_OOMPH 2
@@ -64,7 +65,7 @@ typedef struct bActionStrip {
short stride_axis; /* axis 0=x, 1=y, 2=z */
short curmod; /* current modifier for buttons */
- struct Ipo *ipo; /* Blending ipo */
+ struct Ipo *ipo; /* Blending ipo - was used for some old NAN era experiments. Non-functional currently. */
struct bAction *act; /* The action referenced by this strip */
struct Object *object; /* For groups, the actual object being nla'ed */
float start, end; /* The range of frames covered by this strip */
@@ -73,7 +74,7 @@ typedef struct bActionStrip {
float stridelen; /* The stridelength (considered when flag & ACT_USESTRIDE) */
float repeat; /* The number of times to repeat the action range */
- float blendin, blendout;
+ float blendin, blendout; /* The number of frames on either end of the strip's length to fade in/out */
char stridechannel[32]; /* Instead of stridelen, it uses an action channel */
char offs_bone[32]; /* if repeat, use this bone/channel for defining offset */
@@ -82,18 +83,19 @@ typedef struct bActionStrip {
} bActionStrip;
+/* strip->mode (these defines aren't really used, but are here for reference) */
#define ACTSTRIPMODE_BLEND 0
#define ACTSTRIPMODE_ADD 1
/* strip->flag */
#define ACTSTRIP_SELECT 0x01
#define ACTSTRIP_USESTRIDE 0x02
-#define ACTSTRIP_BLENDTONEXT 0x04
+#define ACTSTRIP_BLENDTONEXT 0x04 /* Not implemented. Is not used anywhere */
#define ACTSTRIP_HOLDLASTFRAME 0x08
#define ACTSTRIP_ACTIVE 0x10
#define ACTSTRIP_LOCK_ACTION 0x20
#define ACTSTRIP_MUTE 0x40
-#define ACTSTRIP_REVERSE 0x80
+#define ACTSTRIP_REVERSE 0x80 /* This has yet to be implemented. To indicate that a strip should be played backwards */
#define ACTSTRIP_CYCLIC_USEX 0x100
#define ACTSTRIP_CYCLIC_USEY 0x200
#define ACTSTRIP_CYCLIC_USEZ 0x400
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 63ead419766..5f20939fc23 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -214,6 +214,10 @@ typedef struct NodeChroma {
float key[4];
} NodeChroma;
+typedef struct NodeTwoXYs {
+ short x1, x2, y1, y2;
+} NodeTwoXYs;
+
typedef struct NodeGeometry {
char uvname[32];
char colname[32];
@@ -230,4 +234,24 @@ typedef struct NodeDefocus {
float fstop, maxblur, bthresh, scale;
} NodeDefocus;
+
+/* qdn: glare node */
+typedef struct NodeGlare {
+ char quality, type, iter;
+ char angle, angle_ofs, size, pad[2];
+ float colmod, mix, threshold, fade;
+} NodeGlare;
+
+/* qdn: tonemap node */
+typedef struct NodeTonemap {
+ float key, offset, gamma;
+ float f, m, a, c;
+ int type;
+} NodeTonemap;
+
+/* qdn: lens distortion node */
+typedef struct NodeLensDist {
+ short jit, proj, fit, pad;
+} NodeLensDist;
+
#endif
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index a821e209ef0..df17454adeb 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -41,19 +41,35 @@ typedef struct PartDeflect {
short deflect; /* Deflection flag - does mesh deflect particles*/
short forcefield; /* Force field type, do the vertices attract / repel particles ? */
short flag; /* general settings flag */
- short pad;
+ short falloff; /* fall-off type*/
float pdef_damp; /* Damping factor for particle deflection */
float pdef_rdamp; /* Random element of damping for deflection */
float pdef_perm; /* Chance of particle passing through mesh */
+ float pdef_frict; /* Friction factor for particle deflection */
+ float pdef_rfrict; /* Random element of friction for deflection */
float f_strength; /* The strength of the force (+ or - ) */
float f_power; /* The power law - real gravitation is 2 (square) */
+ float f_dist;
+ float f_damp; /* The dampening factor, currently only for harmonic force */
float maxdist; /* if indicated, use this maximum */
+ float mindist; /* if indicated, use this minimum */
+ float maxrad; /* radial versions of above */
+ float minrad;
+ float f_power_r; /* radial fall-off power*/
float pdef_sbdamp; /* Damping factor for softbody deflection */
float pdef_sbift; /* inner face thickness for softbody deflection */
float pdef_sboft; /* outer face thickness for softbody deflection */
+
+ /* variables for guide curve */
+ float clump_fac, clump_pow;
+ float kink_freq, kink_shape, kink_amp, free_end;
+
+ float tex_nabla;
+ short tex_mode, kink, kink_axis, rt2;
+ struct Tex *tex; /* Texture of the texture effector */
} PartDeflect;
@@ -62,6 +78,8 @@ typedef struct SBVertex {
} SBVertex;
typedef struct SoftBody {
+ struct ParticleSystem *particles; /* particlesystem softbody */
+
/* dynamic data */
int totpoint, totspring;
struct BodyPoint *bpoint; /* not saved in file */
@@ -96,8 +114,10 @@ typedef struct SoftBody {
int interval;
short local, solverflags; /* local==1: use local coords for baking */
+ /* -- these must be kept for backwards compatibility -- */
SBVertex **keys; /* array of size totpointkey */
int totpointkey, totkey; /* if totpointkey != totpoint or totkey!- (efra-sfra)/interval -> free keys */
+ /* ---------------------------------------------------- */
float secondspring;
/* self collision*/
@@ -122,11 +142,36 @@ typedef struct SoftBody {
#define PFIELD_MAGNET 3
#define PFIELD_WIND 4
#define PFIELD_GUIDE 5
+#define PFIELD_TEXTURE 6
+#define PFIELD_HARMONIC 7
+#define PFIELD_NUCLEAR 8
+#define PFIELD_MDIPOLE 9
+
/* pd->flag: various settings */
#define PFIELD_USEMAX 1
#define PDEFLE_DEFORM 2
#define PFIELD_GUIDE_PATH_ADD 4
+#define PFIELD_PLANAR 8
+#define PDEFLE_KILL_PART 16
+#define PFIELD_POSZ 32
+#define PFIELD_TEX_OBJECT 64
+#define PFIELD_TEX_2D 128
+#define PFIELD_USEMIN 256
+#define PFIELD_USEMAXR 512
+#define PFIELD_USEMINR 1024
+
+/* pd->falloff */
+#define PFIELD_FALL_SPHERE 0
+#define PFIELD_FALL_TUBE 1
+#define PFIELD_FALL_CONE 2
+//reserved for near future
+//#define PFIELD_FALL_INSIDE 3
+
+/* pd->tex_mode */
+#define PFIELD_TEX_RGB 0
+#define PFIELD_TEX_GRAD 1
+#define PFIELD_TEX_CURL 2
/* ob->softflag */
#define OB_SB_ENABLE 1
@@ -142,10 +187,19 @@ typedef struct SoftBody {
#define OB_SB_FACECOLL 1024
#define OB_SB_EDGECOLL 2048
#define OB_SB_COLLFINAL 4096
+#define OB_SB_PROTECT_CACHE 8192
+/* sb->solverflags */
#define SBSO_MONITOR 1
#define SBSO_OLDERR 2
+/* sb->sbc_mode */
+#define SBC_MODE_MANUAL 0
+#define SBC_MODE_AVG 1
+#define SBC_MODE_MIN 2
+#define SBC_MODE_MAX 3
+#define SBC_MODE_AVGMINMAX 4
+
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index 411c02cfbb0..5b875780f8b 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -54,6 +54,7 @@ struct bConstraintChannel;
struct PartDeflect;
struct SoftBody;
struct FluidsimSettings;
+struct ParticleSystem;
struct DerivedMesh;
typedef struct bDeformGroup {
@@ -69,20 +70,6 @@ typedef struct BoundBox {
/* boundbox flag */
#define OB_BB_DISABLED 1
-/* OcInfo and LBuf structs are for the Enji gameengine */
-
-typedef struct OcInfo {
- float dvec[3];
- float size[3];
-} OcInfo;
-
-typedef struct LBuf {
- short tot, max;
- int pad;
- struct Object **ob;
-} LBuf;
-
-
typedef struct Object {
ID id;
@@ -102,7 +89,6 @@ typedef struct Object {
ListBase constraintChannels;
ListBase effect;
- ListBase network;
ListBase disp;
ListBase defbase;
ListBase modifiers; /* list of ModifierData structures */
@@ -115,7 +101,8 @@ typedef struct Object {
float rot[3], drot[3];
float quat[4], dquat[4];
float obmat[4][4];
- float parentinv[4][4];
+ 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]; /* for during render, old game engine, temporally: ipokeys of transform */
unsigned int lay; /* copy of Base */
@@ -153,7 +140,7 @@ typedef struct Object {
char dt, dtx;
char totcol; /* copy of mesh or curve or meta */
- char actcol;
+ char actcol; /* currently selected material in the user interface */
char empty_drawtype, pad1[7];
float empty_drawsize;
@@ -163,12 +150,14 @@ typedef struct Object {
ListBase controllers;
ListBase actuators;
- void *sumohandle;
+ /* now used to store cache particles,
+ * should be renamed see effect.c (Campbell) */
+ void *sumohandle;
float bbsize[3];
short index; /* custom index, for renderpasses */
unsigned short actdef; /* current deformation group */
- float col[4];
+ float col[4]; /* object color, adjusted via IPO's only */
/**
* Settings for game objects
* bit 0: Object has dynamic behaviour
@@ -193,6 +182,7 @@ typedef struct Object {
ListBase constraints;
ListBase nlastrips;
ListBase hooks;
+ ListBase particlesystem; /* particle systems */
struct PartDeflect *pd; /* particle deflector/attractor/collision data */
struct SoftBody *soft; /* if exists, saved in file */
@@ -207,7 +197,7 @@ typedef struct Object {
short recalco, pad4; /* recalco for temp storage of ob->recalc, bad design warning */
struct FluidsimSettings *fluidsimSettings; /* if fluidsim enabled, store additional settings */
-
+
struct DerivedMesh *derivedDeform, *derivedFinal;
int lastDataMask; /* the custom data layer mask that was last used to calculate derivedDeform and derivedFinal */
int pad;
@@ -217,6 +207,7 @@ typedef struct Object {
/*#endif*/
} Object;
+/* Warning, this is not used anymore because hooks are now modifiers */
typedef struct ObHook {
struct ObHook *next, *prev;
@@ -277,7 +268,7 @@ extern Object workob;
#define OB_OFFS_LOCAL 1
#define OB_QUAT 2
#define OB_NEG_SCALE 4
-#define OB_DUPLI (8+16+256+512)
+#define OB_DUPLI (8+16+256+512+2048)
#define OB_DUPLIFRAMES 8
#define OB_DUPLIVERTS 16
#define OB_DUPLIROT 32
@@ -286,6 +277,7 @@ extern Object workob;
#define OB_DUPLIGROUP 256
#define OB_DUPLIFACES 512
#define OB_DUPLIFACES_SCALE 1024
+#define OB_DUPLIPARTS 2048
/* (short) ipoflag */
#define OB_DRAWKEY 1
@@ -319,6 +311,9 @@ extern Object workob;
#define OB_SHADED 4
#define OB_TEXTURE 5
+/* this condition has been made more complex since editmode can draw textures */
+#define CHECK_OB_DRAWTEXTURE(vd, dt) ((vd->drawtype==OB_TEXTURE && dt>OB_SOLID) || (vd->drawtype==OB_SOLID && vd->flag2 & V3D_SOLID_TEX))
+
/* dtx: flags, char! */
#define OB_AXIS 2
#define OB_TEXSPACE 4
@@ -336,6 +331,7 @@ extern Object workob;
#define OB_PLAINAXES 2
#define OB_CIRCLE 3
#define OB_SINGLE_ARROW 4
+#define OB_CUBE 5
/* boundtype */
#define OB_BOUND_BOX 0
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
new file mode 100644
index 00000000000..f41a0d63142
--- /dev/null
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -0,0 +1,432 @@
+/* DNA_particle_types.h
+ *
+ *
+ * $Id: DNA_particle_types.h $
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef DNA_PARTICLE_TYPES_H
+#define DNA_PARTICLE_TYPES_H
+
+#include "DNA_ID.h"
+
+typedef struct HairKey {
+ float co[3]; /* location of hair vertex */
+ float time; /* time along hair, default 0-100 */
+ float weight; /* softbody weight */
+ short editflag; /* saved particled edit mode flags */
+ short pad;
+} HairKey;
+
+typedef struct ParticleKey { /* when changed update size of struct to copy_particleKey()!! */
+ float co[3]; /* location */
+ float vel[3]; /* velocity */
+ float rot[4]; /* rotation quaternion */
+ float ave[3]; /* angular velocity */
+ float time; /* when this key happens */
+} ParticleKey;
+
+/* Child particles are created around or between parent particles */
+typedef struct ChildParticle {
+ int num, parent; /* num is face index on the final derived mesh */
+ int pa[4]; /* nearest particles to the child, used for the interpolation */
+ float w[4]; /* interpolation weights for the above particles */
+ float fuv[4], foffset; /* face vertex weights and offset */
+ float rand[3];
+} ChildParticle;
+
+/* Everything that's non dynamic for a particle: */
+typedef struct ParticleData {
+ struct Object *stick_ob;/* object that particle sticks to when dead */
+
+ ParticleKey state; /* normally current global coordinates or */
+ /* in sticky object space if dead & sticky */
+
+ HairKey *hair; /* hair vertices */
+
+ ParticleKey *keys; /* keyed states */
+
+ float i_rot[4],r_rot[4];/* initial & random values (i_rot should be removed as it's not used anymore)*/
+ float r_ave[3],r_ve[3];
+
+ float fuv[4], foffset; /* coordinates on face/edge number "num" and depth along*/
+ /* face normal for volume emission */
+
+ float time, lifetime; /* dietime is not nescessarily time+lifetime as */
+ float dietime; /* particles can die unnaturally (collision) */
+
+ float bank; /* banking angle for boids */
+
+ float size, sizemul; /* size and multiplier so that we can update size when ever */
+
+ int num; /* index to vert/edge/face */
+ int num_dmcache; /* index to derived mesh data (face) to avoid slow lookups */
+ int pad;
+
+ int totkey;
+ int bpi; /* softbody body point start index */
+
+ short flag;
+ short alive; /* the life state of a particle */
+ short loop; /* how many times particle life has looped */
+ short rt2;
+} ParticleData;
+
+typedef struct ParticleSettings {
+ ID id;
+
+ int flag;
+ short type, from, distr;
+ /* physics modes */
+ short phystype, rotmode, avemode, reactevent;
+ short draw, draw_as, draw_size, childtype;
+ /* number of path segments, power of 2 except */
+ short draw_step, ren_step;
+ short hair_step, keys_step;
+
+ /* adaptive path rendering */
+ short adapt_angle, adapt_pix;
+
+ short disp, omat, interpolation, rotfrom, integrator;
+ short kink, kink_axis, nbetween, boidneighbours;
+
+ /* billboards */
+ short bb_align, bb_uv_split, bb_anim, bb_split_offset;
+ float bb_tilt, bb_rand_tilt, bb_offset[2];
+
+ /* general values */
+ float sta, end, lifetime, randlife;
+ float timetweak, jitfac, keyed_time;
+ int totpart, userjit, grid_res;
+
+ /* initial velocity factors */
+ float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
+ float rotfac, avefac, phasefac;
+ /* physical properties */
+ float mass, size, randsize, reactshape;
+ /* global physical properties */
+ float acc[3], dragfac, brownfac, dampfac;
+ /* length */
+ float length, abslength, randlength;
+ /* children */
+ int child_nbr;
+ float parents, childsize, childrandsize;
+ float childrad, childflat, childspread;
+ /* clumping */
+ float clumpfac, clumppow;
+ /* kink */
+ float kink_amp, kink_freq, kink_shape;
+ /* rough */
+ float rough1, rough1_size;
+ float rough2, rough2_size, rough2_thres;
+ float rough_end, rough_end_shape;
+ /* branching */
+ float branch_thres;
+ /* drawing stuff */
+ float draw_line[2];
+
+ /* boids */
+ float max_vel, max_lat_acc, max_tan_acc;
+ float average_vel, banking, max_bank, groundz;
+ float boidfac[8];
+ char boidrule[8];
+
+ struct Group *dup_group;
+ struct Group *eff_group;
+ struct Object *dup_ob;
+ struct Object *bb_ob;
+ struct Ipo *ipo;
+ struct PartDeflect *pd;
+} ParticleSettings;
+
+typedef struct ParticleSystem{
+ struct ParticleSystem *next, *prev;
+
+ ParticleSettings *part;
+
+ ParticleData *particles;
+
+ ChildParticle *child;
+
+ struct ParticleEdit *edit;
+
+ struct ParticleCacheKey **pathcache;
+ struct ParticleCacheKey **childcache;
+
+ struct SoftBody *soft;
+
+ struct Object *target_ob;
+ struct Object *keyed_ob;
+ struct Object *lattice;
+
+ struct ListBase effectors, reactevents;
+
+ float imat[4][4]; /* used for duplicators */
+ float cfra;
+ int seed;
+ int flag, totpart, totchild, totcached, totchildcache, rt;
+ short recalc, target_psys, keyed_psys, totkeyed, softflag, bakespace;
+
+ char bb_uvname[3][32];
+
+ /* if you change these remember to update array lengths to PSYS_TOT_VG! */
+ short vgroup[11], vg_neg, rt3[2];
+}ParticleSystem;
+
+/* general particle maximums */
+/* no special why's, just seem reasonable */
+/* changing these (atleast upwards) should not cause any major problems */
+#define MAX_PARTS 100000 /* real particles/system */
+#define MAX_PART_CHILDREN 1000 /* child particles/real particles */
+#define MAX_BOIDNEIGHBOURS 10 /* neigbours considered/boid */
+
+/* part->type */
+/* hair is allways baked static in object/geometry space */
+/* other types (normal particles) are in global space and not static baked */
+#define PART_EMITTER 0
+#define PART_REACTOR 1
+#define PART_HAIR 2
+
+/* part->flag */
+#define PART_REACT_STA_END 1
+#define PART_REACT_MULTIPLE 2
+
+#define PART_LOOP 4
+#define PART_LOOP_INSTANT 8
+
+#define PART_HAIR_GEOMETRY 16
+
+#define PART_UNBORN 32 /*show unborn particles*/
+#define PART_DIED 64 /*show died particles*/
+
+#define PART_TRAND 128
+#define PART_EDISTR 256 /* particle/face from face areas */
+
+#define PART_STICKY 512 /*collided particles can stick to collider*/
+#define PART_DIE_ON_COL (1<<12)
+#define PART_SIZE_DEFL (1<<13) /* swept sphere deflections */
+#define PART_ROT_DYN (1<<14) /* dynamic rotation */
+#define PART_SIZEMASS (1<<16)
+
+#define PART_ABS_LENGTH (1<<15)
+
+#define PART_ABS_TIME (1<<17)
+#define PART_GLOB_TIME (1<<18)
+
+#define PART_BOIDS_2D (1<<19)
+
+#define PART_BRANCHING (1<<20)
+#define PART_ANIM_BRANCHING (1<<21)
+#define PART_SYMM_BRANCHING (1<<24)
+
+#define PART_HAIR_BSPLINE 1024
+
+#define PART_GRID_INVERT (1<<26)
+
+#define PART_CHILD_SEAMS (1<<28)
+#define PART_CHILD_RENDER (1<<29)
+#define PART_CHILD_GUIDE (1<<30)
+
+/* part->rotfrom */
+#define PART_ROT_KEYS 0 /* interpolate directly from keys */
+#define PART_ROT_ZINCR 1 /* same as zdir but done incrementally from previous position */
+#define PART_ROT_IINCR 2 /* same as idir but done incrementally from previous position */
+
+/* part->from */
+#define PART_FROM_VERT 0
+#define PART_FROM_FACE 1
+#define PART_FROM_VOLUME 2
+#define PART_FROM_PARTICLE 3
+#define PART_FROM_CHILD 4
+
+/* part->distr */
+#define PART_DISTR_JIT 0
+#define PART_DISTR_RAND 1
+#define PART_DISTR_GRID 2
+
+/* part->phystype */
+#define PART_PHYS_NO 0
+#define PART_PHYS_NEWTON 1
+#define PART_PHYS_KEYED 2
+#define PART_PHYS_BOIDS 3
+
+/* part->kink */
+#define PART_KINK_NO 0
+#define PART_KINK_CURL 1
+#define PART_KINK_RADIAL 2
+#define PART_KINK_WAVE 3
+#define PART_KINK_BRAID 4
+#define PART_KINK_ROT 5
+#define PART_KINK_ROLL 6
+
+/* part->draw */
+#define PART_DRAW_VEL 1
+#define PART_DRAW_ANG 2
+#define PART_DRAW_SIZE 4
+#define PART_DRAW_EMITTER 8 /* render emitter also */
+#define PART_DRAW_KEYS 16
+#define PART_DRAW_ADAPT 32
+#define PART_DRAW_COS 64
+#define PART_DRAW_BB_LOCK 128
+#define PART_DRAW_PARENT 256
+#define PART_DRAW_NUM 512
+#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_WHOLE_GR (1<<14)
+
+/* part->bb_align */
+#define PART_BB_X 0
+#define PART_BB_Y 1
+#define PART_BB_Z 2
+#define PART_BB_VIEW 3
+#define PART_BB_VEL 4
+
+/* part->bb_anim */
+#define PART_BB_ANIM_NONE 0
+#define PART_BB_ANIM_TIME 1
+#define PART_BB_ANIM_ANGLE 2
+#define PART_BB_ANIM_OFF_TIME 3
+#define PART_BB_ANIM_OFF_ANGLE 4
+
+/* part->bb_split_offset */
+#define PART_BB_OFF_NONE 0
+#define PART_BB_OFF_LINEAR 1
+#define PART_BB_OFF_RANDOM 2
+
+/* part->draw as */
+#define PART_DRAW_NOT 0
+#define PART_DRAW_DOT 1
+#define PART_DRAW_CIRC 2
+#define PART_DRAW_CROSS 3
+#define PART_DRAW_AXIS 4
+#define PART_DRAW_LINE 5
+#define PART_DRAW_PATH 6
+#define PART_DRAW_OB 7
+#define PART_DRAW_GR 8
+#define PART_DRAW_BB 9
+
+/* part->integrator */
+#define PART_INT_EULER 0
+#define PART_INT_MIDPOINT 1
+#define PART_INT_RK4 2
+
+/* part->rotmode */
+#define PART_ROT_NOR 1
+#define PART_ROT_VEL 2
+#define PART_ROT_RAND 3
+
+/* part->avemode */
+#define PART_AVE_SPIN 1
+#define PART_AVE_RAND 2
+#define PART_AVE_VEL 3
+
+/* part->reactevent */
+#define PART_EVENT_DEATH 0
+#define PART_EVENT_COLLIDE 1
+#define PART_EVENT_NEAR 2
+
+/* part->childtype */
+#define PART_CHILD_PARTICLES 1
+#define PART_CHILD_FACES 2
+
+/* psys->recalc */
+#define PSYS_INIT 1
+#define PSYS_DISTR 2
+#define PSYS_ALLOC 4
+#define PSYS_TYPE 8
+#define PSYS_RECALC_HAIR 16
+
+/* psys->flag */
+#define PSYS_CURRENT 1
+//#define PSYS_BAKING 2
+//#define PSYS_BAKE_UI 4
+#define PSYS_KEYED_TIME 8
+#define PSYS_ENABLED 16
+#define PSYS_FIRST_KEYED 32
+#define PSYS_DRAWING 64
+//#define PSYS_SOFT_BAKE 128
+#define PSYS_DELETE 256 /* remove particlesystem as soon as possible */
+#define PSYS_HAIR_DONE 512
+#define PSYS_KEYED 1024
+#define PSYS_EDITED 2048
+#define PSYS_PROTECT_CACHE 4096
+
+/* pars->flag */
+#define PARS_UNEXIST 1
+#define PARS_NO_DISP 2
+#define PARS_STICKY 4
+#define PARS_TRANSFORM 8
+#define PARS_HIDE 16
+#define PARS_TAG 32
+#define PARS_REKEY 64
+#define PARS_EDIT_RECALC 128
+
+/* pars->alive */
+#define PARS_KILLED 0
+#define PARS_DEAD 1
+#define PARS_UNBORN 2
+#define PARS_ALIVE 3
+
+/* psys->vg */
+#define PSYS_TOT_VG 11
+
+#define PSYS_VG_DENSITY 0
+#define PSYS_VG_VEL 1
+#define PSYS_VG_LENGTH 2
+#define PSYS_VG_CLUMP 3
+#define PSYS_VG_KINK 4
+#define PSYS_VG_ROUGH1 5
+#define PSYS_VG_ROUGH2 6
+#define PSYS_VG_ROUGHE 7
+#define PSYS_VG_SIZE 8
+#define PSYS_VG_TAN 9
+#define PSYS_VG_ROT 10
+
+/* part->boidrules */
+#define BOID_TOT_RULES 8
+
+#define BOID_COLLIDE 0
+#define BOID_AVOID 1
+#define BOID_CROWD 2
+#define BOID_CENTER 3
+#define BOID_AV_VEL 4
+#define BOID_VEL_MATCH 5
+#define BOID_GOAL 6
+#define BOID_LEVEL 7
+
+
+//#define PSYS_INTER_CUBIC 0
+//#define PSYS_INTER_LINEAR 1
+//#define PSYS_INTER_CARDINAL 2
+//#define PSYS_INTER_BSPLINE 3
+
+#endif
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 250c600fcaf..1a1cb1c0f2b 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -240,9 +240,9 @@ typedef struct RenderData {
* The number of samples to use per pixel.
*/
short osa;
-
- short frs_sec, edgeint;
+ short frs_sec, edgeint;
+
/* safety, border and display rect */
rctf safety, border;
rcti disprect;
@@ -250,7 +250,8 @@ typedef struct RenderData {
/* information on different layers to be rendered */
ListBase layers;
short actlay, pad;
- int pad2;
+
+ float frs_sec_base;
/**
* Value used to define filter size for all filter options */
@@ -278,6 +279,16 @@ typedef struct RenderData {
/* paths to backbufffer, output, ftype */
char backbuf[160], pic[160], ftype[160];
+ /* stamps flags. */
+ int stamp;
+ short stamp_font_id, pad3; /* select one of blenders bitmap fonts */
+
+ /* stamp info user data. */
+ char stamp_udata[160];
+
+ /* foreground/background color. */
+ float fg_stamp[4];
+ float bg_stamp[4];
} RenderData;
@@ -297,11 +308,28 @@ typedef struct TimeMarker {
unsigned int flag;
} TimeMarker;
-struct ImagePaintSettings {
+typedef struct ImagePaintSettings {
struct Brush *brush;
short flag, tool;
int pad3;
-};
+} ImagePaintSettings;
+
+typedef struct ParticleBrushData {
+ short size, strength; /* commong settings */
+ short step, invert; /* for specific brushes only */
+} ParticleBrushData;
+
+typedef struct ParticleEditSettings {
+ short flag;
+ short totrekey;
+ short totaddkey;
+ short brushtype;
+
+ ParticleBrushData brush[7]; /* 7 = PE_TOT_BRUSH */
+
+ float emitterdist;
+ int draw_timed;
+} ParticleEditSettings;
typedef struct ToolSettings {
/* Subdivide Settings */
@@ -337,6 +365,9 @@ typedef struct ToolSettings {
/* Image Paint (8 byte aligned please!) */
struct ImagePaintSettings imapaint;
+
+ /* Particle Editing */
+ struct ParticleEditSettings particle;
/* Select Group Threshold */
float select_thresh;
@@ -388,8 +419,7 @@ typedef struct SculptData
char texsep;
char averaging;
-
- char draw_flag;
+ char flags;
/* Control tablet input */
char tablet_size, tablet_strength;
@@ -417,15 +447,16 @@ typedef struct Scene {
/* editmode stuff */
float editbutsize; /* size of normals */
- short selectmode;
+ short selectmode; /* for mesh only! */
short proportional, prop_mode;
+ short automerge, pad5, pad6, pad7;
short use_nodes;
+
struct bNodeTree *nodetree;
- void *ed;
+ void *ed; /* sequence editor data is allocated here */
struct Radio *radio;
- void *sumohandle;
struct GameFraming framing;
@@ -440,8 +471,8 @@ typedef struct Scene {
ListBase markers;
- short jumpframe;
- short pad1, pad2, pad3;
+ short jumpframe, pad1;
+ short snap_flag, snap_target;
/* none of the dependancy graph vars is mean to be saved */
struct DagForest *theDag;
@@ -496,6 +527,7 @@ typedef struct Scene {
#define R_FILTER_CATROM 4
#define R_FILTER_GAUSS 5
#define R_FILTER_MITCH 6
+#define R_FILTER_FAST_GAUSS 7 /* note, this is only used for nodes at the moment */
/* yafray: renderer flag (not only exclusive to yafray) */
#define R_INTERN 0
@@ -517,7 +549,19 @@ typedef struct Scene {
#define R_COMP_FREE 0x0800
#define R_NO_IMAGE_LOAD 0x1000
#define R_NO_TEX 0x2000
-
+#define R_STAMP_INFO 0x4000
+
+/* r->stamp */
+#define R_STAMP_TIME 0x0001
+#define R_STAMP_FRAME 0x0002
+#define R_STAMP_DATE 0x0004
+#define R_STAMP_CAMERA 0x0008
+#define R_STAMP_SCENE 0x0010
+#define R_STAMP_NOTE 0x0020
+#define R_STAMP_DRAW 0x0040 /* draw in the image */
+#define R_STAMP_MARKER 0x0080
+#define R_STAMP_FILENAME 0x0100
+#define R_STAMP_SEQSTRIP 0x0200
/* alphamode */
#define R_ADDSKY 0
@@ -552,6 +596,7 @@ typedef struct Scene {
#define R_CINEON 26
#define R_DPX 27
#define R_MULTILAYER 28
+#define R_DDS 29
/* subimtype, flag options for imtype */
#define R_OPENEXR_HALF 1
@@ -569,14 +614,23 @@ typedef struct Scene {
/* base->flag is in DNA_object_types.h */
-/* sce->flag */
-#define SCE_ADDSCENAME 1
+/* scene->snap_flag */
+#define SCE_SNAP 1
+/* scene->snap_target */
+#define SCE_SNAP_TARGET_CLOSEST 0
+#define SCE_SNAP_TARGET_CENTER 1
+#define SCE_SNAP_TARGET_MEDIAN 2
/* sce->selectmode */
-#define SCE_SELECT_VERTEX 1
+#define SCE_SELECT_VERTEX 1 /* for mesh */
#define SCE_SELECT_EDGE 2
#define SCE_SELECT_FACE 4
+/* sce->selectmode for particles */
+#define SCE_SELECT_PATH 1
+#define SCE_SELECT_POINT 2
+#define SCE_SELECT_END 4
+
/* sce->recalc (now in use by previewrender) */
#define SCE_PRV_CHANGED 1
@@ -603,21 +657,22 @@ typedef struct Scene {
#define FFMPEG_MULTIPLEX_AUDIO 1
#define FFMPEG_AUTOSPLIT_OUTPUT 2
+/* SculptData.flags */
+#define SCULPT_INPUT_SMOOTH 1
+#define SCULPT_DRAW_FAST 2
+#define SCULPT_DRAW_BRUSH 4
/* SculptData.brushtype */
-#define DRAW_BRUSH 1
-#define SMOOTH_BRUSH 2
-#define PINCH_BRUSH 3
+#define DRAW_BRUSH 1
+#define SMOOTH_BRUSH 2
+#define PINCH_BRUSH 3
#define INFLATE_BRUSH 4
-#define GRAB_BRUSH 5
-#define LAYER_BRUSH 6
+#define GRAB_BRUSH 5
+#define LAYER_BRUSH 6
#define FLATTEN_BRUSH 7
/* SculptData.texrept */
#define SCULPTREPT_DRAG 1
#define SCULPTREPT_TILE 2
#define SCULPTREPT_3D 3
-/* SculptData.draw_flag */
-#define SCULPTDRAW_FAST 1
-#define SCULPTDRAW_BRUSH 2
#define SYMM_X 1
#define SYMM_Y 2
@@ -628,6 +683,28 @@ typedef struct Scene {
#define IMAGEPAINT_DRAW_TOOL 2
#define IMAGEPAINT_DRAW_TOOL_DRAWING 4
+/* toolsettings->particle flag */
+#define PE_KEEP_LENGTHS 1
+#define PE_LOCK_FIRST 2
+#define PE_DEFLECT_EMITTER 4
+#define PE_INTERPOLATE_ADDED 8
+#define PE_SHOW_CHILD 16
+#define PE_SHOW_TIME 32
+#define PE_X_MIRROR 64
+
+/* toolsetting->particle brushtype */
+#define PE_BRUSH_NONE -1
+#define PE_BRUSH_COMB 0
+#define PE_BRUSH_CUT 1
+#define PE_BRUSH_LENGTH 2
+#define PE_BRUSH_PUFF 3
+#define PE_BRUSH_ADD 4
+#define PE_BRUSH_WEIGHT 5
+#define PE_BRUSH_SMOOTH 6
+
+/* this must equal ParticleEditSettings.brush array size */
+#define PE_TOT_BRUSH 7
+
/* toolsettings->retopo_mode */
#define RETOPO 1
#define RETOPO_PAINT 2
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index cf3c2eaa168..65374983af5 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -147,7 +147,9 @@ typedef struct ScrArea {
#define VERT_SCROLL 3
#define T_SCROLL 4
#define B_SCROLL 8
-#define HOR_SCROLL 12
+#define HOR_SCROLL 12
+#define B_SCROLLO 16 /* special hack for outliner hscroll - prevent hanging */
+#define HOR_SCROLLO 20 /* in older versions of blender */
/* Panel->snap - for snapping to screen edges */
#define PNL_SNAP_NONE 0
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index 5bb9f61f71e..0f9b55723bc 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -46,12 +46,15 @@ struct Scene;
typedef struct StripElem {
char name[80];
+} StripElem;
+
+typedef struct TStripElem {
struct ImBuf *ibuf;
- struct StripElem *se1, *se2, *se3;
+ struct TStripElem *se1, *se2, *se3;
short ok;
short pad;
int nr;
-} StripElem;
+} TStripElem;
typedef struct Strip {
struct Strip *next, *prev;
@@ -59,6 +62,7 @@ typedef struct Strip {
StripElem *stripdata;
char dir[160];
int orx, ory;
+ TStripElem *tstripdata;
} Strip;
@@ -87,22 +91,22 @@ typedef struct PluginSeq {
/* WATCH IT: first part identical to ID (for use in ipo's) */
typedef struct Sequence {
-
- struct Sequence *next, *prev, *newseq;
- void *lib;
- char name[24];
+ struct Sequence *next, *prev;
+ void *tmp; /* tmp var for copying, and tagging for linked selection */
+ void *lib; /* needed (to be like ipo), else it will raise libdata warnings, this should never be used */
+ char name[24]; /* name, not set by default and dosnt need to be unique as with ID's */
short flag, type; /*flags bitmap (see below) and the type of sequence*/
- int len;
+ int len; /* the length of the contense of this strip - before handles are applied */
int start, startofs, endofs;
int startstill, endstill;
- int machine, depth;
+ int machine, depth; /*machine - the strip channel, depth - the depth in the sequence when dealing with metastrips */
int startdisp, enddisp; /*starting and ending points in the sequence*/
float mul, handsize;
- int sfra; /* starting frame according to the timeline of the scene */
+ /* is sfra needed anymore? - it looks like its only used in one place */
+ int sfra; /* starting frame according to the timeline of the scene. */
Strip *strip;
- StripElem *curelem;
struct Ipo *ipo;
struct Scene *scene;
@@ -114,8 +118,7 @@ typedef struct Sequence {
/* pointers for effects: */
struct Sequence *seq1, *seq2, *seq3;
- /* meta */
- ListBase seqbase;
+ ListBase seqbase; /* list of strips for metastrips */
struct bSound *sound; /* the linked "bSound" object */
struct hdaudio *hdaudio; /* external hdaudio object */
@@ -170,6 +173,8 @@ typedef struct TransformVars {
float yFin;
float rotIni;
float rotFin;
+ int percent;
+ int interpolation;
} TransformVars;
typedef struct SolidColorVars {
@@ -182,7 +187,7 @@ typedef struct SpeedControlVars {
float globalSpeed;
int flags;
int length;
- int pad;
+ int lastValidFrame;
} SpeedControlVars;
/* SpeedControlVars->flags */
@@ -203,6 +208,8 @@ typedef struct SpeedControlVars {
#define SEQ_IPO_FRAME_LOCKED 256
#define SEQ_EFFECT_NOT_LOADED 512
#define SEQ_FLAG_DELETE 1024
+#define SEQ_FLIPX 2048
+#define SEQ_FLIPY 4096
/* seq->type WATCH IT: SEQ_EFFECT BIT is used to determine if this is an effect strip!!! */
#define SEQ_IMAGE 0
@@ -229,6 +236,9 @@ typedef struct SpeedControlVars {
#define SEQ_COLOR 28
#define SEQ_SPEED 29
+#define STRIPELEM_FAILED 0
+#define STRIPELEM_OK 1
+#define STRIPELEM_META 2
#endif
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 65be09caf35..10f488c9f61 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -52,6 +52,7 @@ struct BlendHandle;
struct RenderInfo;
struct bNodeTree;
struct uiBlock;
+struct FileList;
/**
* The base structure all the other spaces
@@ -170,8 +171,10 @@ typedef struct SpaceFile {
char file[80];
short type, ofs, flag, sort;
- short maxnamelen, collums;
-
+ short maxnamelen, collums, f_fp, pad1;
+ int pad2;
+ char fp_str[8];
+
struct BlendHandle *libfiledata;
unsigned short retval; /* event */
@@ -229,20 +232,25 @@ typedef struct SpaceImage {
struct CurveMapping *cumap;
short mode, menunr;
- short imanr, curtile;
+ short imanr;
+ short curtile; /* the currently active tile of the image when tile is enabled, is kept in sync with the active faces tile */
int flag;
short imtypenr, lock;
- short showspare, pad2;
+ short showspare, pin;
float zoom;
+ char dt_uv; /* UV draw type */
+ char sticky; /* sticky selection type */
+ char pad[6];
float xof, yof; /* user defined offset, image is centered */
float centx, centy; /* storage for offset while render drawing */
char *info_str, *info_spare; /* info string for render */
struct ImBuf *spare;
+
} SpaceImage;
-typedef struct SpaceNla{
+typedef struct SpaceNla {
struct SpaceLink *next, *prev;
int spacetype;
float blockscale;
@@ -251,7 +259,8 @@ typedef struct SpaceNla{
short blockhandler[8];
short menunr, lock;
- int flag;
+ short autosnap; /* this uses the same settings as autosnap for Action Editor */
+ short flag;
View2D v2d;
} SpaceNla;
@@ -292,9 +301,10 @@ typedef struct SpaceScript {
struct ScrArea *area;
struct Script *script;
- int pad2;
short flags, menunr;
-
+ int pad1;
+
+ void *but_refs;
} SpaceScript;
typedef struct SpaceTime {
@@ -333,89 +343,63 @@ typedef struct SpaceNode {
#define SNODE_DO_PREVIEW 1
#define SNODE_BACKDRAW 2
-#
-#
-typedef struct OneSelectableIma {
- int header;
- int ibuf_type;
- struct ImBuf *pict;
- struct OneSelectableIma *next;
- struct OneSelectableIma *prev;
-
- short cmap, image, draw_me, rt;
- short sx, sy, ex, ey, dw, dh;
- short selectable, selected;
- int mtime, disksize;
- char file_name[64];
-
- short orgx, orgy, orgd, anim; /* same as ibuf->x...*/
- char dummy[4]; /* 128 */
-
- char pict_rect[3968]; /* 4096 (RECT = 64 * 62) */
-
-} OneSelectableIma;
-
-#
-#
-typedef struct ImaDir {
- struct ImaDir *next, *prev;
- int selected, hilite;
- int type, size;
- int mtime;
- char name[100];
-} ImaDir;
-
typedef struct SpaceImaSel {
SpaceLink *next, *prev;
int spacetype;
float blockscale;
struct ScrArea *area;
- char title[28];
-
- int fase;
- short mode, subfase;
- short mouse_move_redraw, imafase;
- short mx, my;
-
- short dirsli, dirsli_lines;
- short dirsli_sx, dirsli_ey , dirsli_ex, dirsli_h;
- short imasli, fileselmenuitem;
- short imasli_sx, imasli_ey , imasli_ex, imasli_h;
-
- short dssx, dssy, dsex, dsey;
- short desx, desy, deex, deey;
- short fssx, fssy, fsex, fsey;
- short dsdh, fsdh;
- short fesx, fesy, feex, feey;
- short infsx, infsy, infex, infey;
- short dnsx, dnsy, dnw, dnh;
- short fnsx, fnsy, fnw, fnh;
-
-
- char fole[128], dor[128];
- char file[128], dir[128];
- ImaDir *firstdir, *firstfile;
- int topdir, totaldirs, hilite;
- int topfile, totalfiles;
-
- float image_slider;
- float slider_height;
- float slider_space;
- short topima, totalima;
- short curimax, curimay;
- OneSelectableIma *first_sel_ima;
- OneSelectableIma *hilite_ima;
- short total_selected, ima_redraw;
- int pad2;
+ short blockhandler[8];
+
+ View2D v2d;
+
+ struct FileList *files;
+
+ /* specific stuff for drawing */
+ char title[24];
+ char dir[160];
+ char file[80];
+
+ short type, menu, flag, sort;
+
+ void *curfont;
+ int active_file;
+
+ int numtilesx;
+ int numtilesy;
+
+ int selstate;
+
+ struct rcti viewrect;
+ struct rcti bookmarkrect;
+
+ float scrollpos; /* current position of scrollhandle */
+ float scrollheight; /* height of the scrollhandle */
+ float scrollarea; /* scroll region, scrollpos is from 0 to scrollarea */
+
+ float aspect;
+ unsigned short retval; /* event */
+
+ short ipotype;
+
+ short filter;
+ short active_bookmark;
+ short pad, pad1;
+
+ /* view settings */
+ short prv_w;
+ short prv_h;
+
+ /* one day we'll add unions to dna */
+ void (*returnfunc)(char *);
+ void (*returnfunc_event)(unsigned short);
+ void (*returnfunc_args)(char *, void *, void *);
- struct ImBuf *cmap;
+ void *arg1, *arg2;
+ short *menup; /* pointer to menu result or ID browsing */
+ char *pupmenu; /* optional menu in header */
- /* Also fucked. Needs to change so things compile, but breaks sdna
- * ... */
-/* void (*returnfunc)(void); */
- void (*returnfunc)(char*);
- void *arg1;
+ struct ImBuf *img;
} SpaceImaSel;
@@ -442,8 +426,9 @@ typedef struct SpaceImaSel {
#define FILE_LOADLIB 1
#define FILE_MAIN 2
+#define FILE_LOADFONT 3
-/* sfile->flag */
+/* sfile->flag and simasel->flag */
#define FILE_SHOWSHORT 1
#define FILE_STRINGCODE 2
#define FILE_LINK 4
@@ -452,6 +437,8 @@ typedef struct SpaceImaSel {
#define FILE_ACTIVELAY 32
#define FILE_ATCURSOR 64
#define FILE_SYNCPOSE 128
+#define FILE_FILTER 256
+#define FILE_BOOKMARKS 512
/* sfile->sort */
#define FILE_SORTALPHA 0
@@ -468,6 +455,9 @@ typedef struct SpaceImaSel {
#define PYSCRIPTFILE 64
#define FTFONTFILE 128
#define SOUNDFILE 256
+#define TEXTFILE 512
+#define MOVIEFILE_ICON 1024 /* movie file that preview can't load */
+#define FOLDERFILE 2048 /* represents folders for filtering */
#define SCROLLH 16 /* height scrollbar */
#define SCROLLB 16 /* width scrollbar */
@@ -476,25 +466,44 @@ typedef struct SpaceImaSel {
#define SI_TEXTURE 0
#define SI_SHOW 1
+/* SpaceImage->dt_uv */
+#define SI_UVDT_DASH 0
+#define SI_UVDT_BLACK 1
+#define SI_UVDT_WHITE 2
+#define SI_UVDT_OUTLINE 3
+
+/* SpaceImage->sticky
+ * Note DISABLE should be 0, however would also need to re-arrange icon order,
+ * also, sticky loc is the default mode so this means we dont need to 'do_versons' */
+#define SI_STICKY_LOC 0
+#define SI_STICKY_DISABLE 1
+#define SI_STICKY_VERTEX 2
+
/* SpaceImage->flag */
-#define SI_BE_SQUARE 1
-#define SI_EDITTILE 2
-#define SI_CLIP_UV 4
-#define SI_DRAWTOOL 8
-#define SI_STICKYUVS 16
-#define SI_DRAWSHADOW 32
-#define SI_SELACTFACE 64
-#define SI_DEPRECATED 128
-#define SI_LOCALSTICKY 256
-#define SI_COORDFLOATS 512
-#define SI_PIXELSNAP 1024
-#define SI_LIVE_UNWRAP 2048
-#define SI_USE_ALPHA 0x1000
-#define SI_SHOW_ALPHA 0x2000
-#define SI_SHOW_ZBUF 0x4000
+#define SI_BE_SQUARE 1<<0
+#define SI_EDITTILE 1<<1
+#define SI_CLIP_UV 1<<2
+#define SI_DRAWTOOL 1<<3
+#define SI_DEPRECATED1 1<<4 /* stick UVs to others in the same location */
+#define SI_DRAWSHADOW 1<<5
+#define SI_SELACTFACE 1<<6
+#define SI_DEPRECATED2 1<<7
+#define SI_DEPRECATED3 1<<8 /* stick UV selection to mesh vertex (UVs wont always be touching) */
+#define SI_COORDFLOATS 1<<9
+#define SI_PIXELSNAP 1<<10
+#define SI_LIVE_UNWRAP 1<<11
+#define SI_USE_ALPHA 1<<12
+#define SI_SHOW_ALPHA 1<<13
+#define SI_SHOW_ZBUF 1<<14
/* next two for render window dislay */
-#define SI_PREVSPACE 0x8000
-#define SI_FULLWINDOW 0x10000
+#define SI_PREVSPACE 1<<15
+#define SI_FULLWINDOW 1<<16
+#define SI_SYNC_UVSEL 1<<17
+#define SI_LOCAL_UV 1<<18
+ /* this means that the image is drawn until it reaches the view edge,
+ * in the image view, its unrelated to the 'tile' mode for texface */
+#define SI_DRAW_TILE 1<<19
+#define SI_SMOOTH_UV 1<<20
/* SpaceText flags (moved from DNA_text_types.h) */
@@ -585,10 +594,15 @@ typedef struct SpaceImaSel {
/* nla->flag */
#define SNLA_ALLKEYED 1
#define SNLA_ACTIVELAYERS 2
+#define SNLA_DRAWTIME 4
/* time->flag */
+ /* show timing in frames instead of in seconds */
#define TIME_DRAWFRAMES 1
+ /* temporary flag set when scrubbing time */
#define TIME_CFRA_NUM 2
+ /* only keyframes from active/selected channels get shown */
+#define TIME_ONLYACTSEL 4
/* time->redraws */
#define TIME_LEFTMOST_3D_WIN 1
@@ -607,6 +621,7 @@ typedef struct SpaceImaSel {
/* sseq->flag */
#define SEQ_DRAWFRAMES 1
+#define SEQ_MARKER_TRANS 2
/* space types, moved from DNA_screen_types.h */
enum {
diff --git a/source/blender/makesdna/DNA_texture_types.h b/source/blender/makesdna/DNA_texture_types.h
index a5a2e36125f..2de6aba6b6f 100644
--- a/source/blender/makesdna/DNA_texture_types.h
+++ b/source/blender/makesdna/DNA_texture_types.h
@@ -44,6 +44,7 @@ struct EnvMap;
struct Object;
struct Tex;
struct Image;
+struct PreviewImage;
struct ImBuf;
typedef struct MTex {
@@ -56,9 +57,9 @@ typedef struct MTex {
char projx, projy, projz, mapping;
float ofs[3], size[3];
- short texflag, colormodel;
+ short texflag, colormodel, pmapto, pmaptoneg;
float r, g, b, k;
- float def_var;
+ float def_var, rt;
float colfac, norfac, varfac;
float dispfac;
@@ -106,6 +107,7 @@ typedef struct CBData {
} CBData;
/* 32 = MAXCOLORBAND */
+/* note that this has to remain a single struct, for UserDef */
typedef struct ColorBand {
short flag, tot, cur, ipotype;
CBData data[32];
@@ -171,7 +173,7 @@ typedef struct Tex {
struct PluginTex *plugin;
struct ColorBand *coba;
struct EnvMap *env;
-
+ struct PreviewImage * preview;
} Tex;
@@ -264,6 +266,7 @@ typedef struct TexMapping {
#define TEX_PRV_NOR 64
#define TEX_REPEAT_XMIR 128
#define TEX_REPEAT_YMIR 256
+#define TEX_FLAG_MASK ( TEX_COLORBAND | TEX_FLIPBLEND | TEX_NEGALPHA | TEX_CHECKER_ODD | TEX_CHECKER_EVEN | TEX_PRV_ALPHA | TEX_PRV_NOR | TEX_REPEAT_XMIR | TEX_REPEAT_YMIR )
/* extend (starts with 1 because of backward comp.) */
#define TEX_EXTEND 1
@@ -287,6 +290,10 @@ typedef struct TexMapping {
#define TEX_BANDNOISE 2
#define TEX_RINGNOISE 3
+/* tex->stype in texture.c - cloud types */
+#define TEX_DEFAULT 0
+#define TEX_COLOR 1
+
/* tex->stype in texture.c - marble types */
#define TEX_SOFT 0
#define TEX_SHARP 1
@@ -301,6 +308,17 @@ typedef struct TexMapping {
#define TEX_HALO 5
#define TEX_RAD 6
+/* tex->stype in texture.c - stucci types */
+#define TEX_PLASTIC 0
+#define TEX_WALLIN 1
+#define TEX_WALLOUT 2
+
+/* tex->stype in texture.c - voronoi types */
+#define TEX_INTENSITY 0
+#define TEX_COL1 1
+#define TEX_COL2 2
+#define TEX_COL3 3
+
/* wrap */
#define MTEX_FLAT 0
#define MTEX_CUBE 1
diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h
index 27c9bc16e4a..47c00813913 100644
--- a/source/blender/makesdna/DNA_userdef_types.h
+++ b/source/blender/makesdna/DNA_userdef_types.h
@@ -36,8 +36,10 @@
#define DNA_USERDEF_TYPES_H
#include "DNA_listBase.h"
+#include "DNA_texture_types.h"
/* themes; defines in BIF_resource.h */
+struct ColorBand;
// global, button colors
@@ -101,7 +103,7 @@ typedef struct ThemeSpace {
char movie[4], image[4], scene[4], audio[4]; // for sequence editor
char effect[4], plugin[4], transition[4], meta[4];
- char bpad1[4];
+ char editmesh_active[4];
} ThemeSpace;
@@ -171,17 +173,20 @@ typedef struct UserDef {
short tw_hotspot, tw_flag, tw_handlesize, tw_size;
int textimeout, texcollectrate;
int memcachelimit;
+ int prefetchframes;
short frameserverport;
short pad_rot_angle; /*control the rotation step of the view when PAD2,PAD4,PAD6&PAD8 is use*/
short obcenter_dia;
short rvisize; /* rotating view icon size */
short rvibright; /* rotating view icon brightness */
- char versemaster[160];
- char verseuser[160];
short recent_files; /* maximum number of recently used files to remember */
short smooth_viewtx; /* miliseconds to spend spinning the view */
short glreslimit;
- char pad[4];
+ char versemaster[160];
+ char verseuser[160];
+ float glalphaclip, pad;
+
+ struct ColorBand coba_weight; /* from texture.h */
} UserDef;
extern UserDef U; /* from usiblender.c !!!! */
@@ -189,22 +194,27 @@ extern UserDef U; /* from usiblender.c !!!! */
/* ***************** USERDEF ****************** */
/* flag */
-#define USER_AUTOSAVE 1
-#define USER_AUTOGRABGRID 2
-#define USER_AUTOROTGRID 4
-#define USER_AUTOSIZEGRID 8
-#define USER_SCENEGLOBAL 16
-#define USER_TRACKBALL 32
-#define USER_DUPLILINK 64
-#define USER_FSCOLLUM 128
-#define USER_MAT_ON_OB 256
-#define USER_NO_CAPSLOCK 512
-#define USER_VIEWMOVE 1024
-#define USER_TOOLTIPS 2048
-#define USER_TWOBUTTONMOUSE 4096
-#define USER_NONUMPAD 8192
-#define USER_LMOUSESELECT 16384
-#define USER_FILECOMPRESS 32768
+#define USER_AUTOSAVE (1 << 0)
+#define USER_AUTOGRABGRID (1 << 1)
+#define USER_AUTOROTGRID (1 << 2)
+#define USER_AUTOSIZEGRID (1 << 3)
+#define USER_SCENEGLOBAL (1 << 4)
+#define USER_TRACKBALL (1 << 5)
+#define USER_DUPLILINK (1 << 6)
+#define USER_FSCOLLUM (1 << 7)
+#define USER_MAT_ON_OB (1 << 8)
+#define USER_NO_CAPSLOCK (1 << 9)
+#define USER_VIEWMOVE (1 << 10)
+#define USER_TOOLTIPS (1 << 11)
+#define USER_TWOBUTTONMOUSE (1 << 12)
+#define USER_NONUMPAD (1 << 13)
+#define USER_LMOUSESELECT (1 << 14)
+#define USER_FILECOMPRESS (1 << 15)
+#define USER_SAVE_PREVIEWS (1 << 16)
+#define USER_CUSTOM_RANGE (1 << 17)
+#define USER_ADD_EDITMODE (1 << 18)
+#define USER_ADD_VIEWALIGNED (1 << 19)
+
/* viewzom */
#define USER_ZOOM_CONT 0
@@ -213,50 +223,52 @@ extern UserDef U; /* from usiblender.c !!!! */
/* uiflag */
-#define USER_KEYINSERTACT 1
-#define USER_KEYINSERTOBJ 2
-#define USER_WHEELZOOMDIR 4
-#define USER_FILTERFILEEXTS 8
-#define USER_DRAWVIEWINFO 16
-#define USER_PLAINMENUS 32 // old EVTTOCONSOLE print ghost events, here for tuhopuu compat. --phase
+#define USER_KEYINSERTACT (1 << 0)
+#define USER_KEYINSERTOBJ (1 << 1)
+#define USER_WHEELZOOMDIR (1 << 2)
+#define USER_FILTERFILEEXTS (1 << 3)
+#define USER_DRAWVIEWINFO (1 << 4)
+#define USER_PLAINMENUS (1 << 5) // old EVTTOCONSOLE print ghost events, here for tuhopuu compat. --phase
// old flag for hide pulldown was here
-#define USER_FLIPFULLSCREEN 128
-#define USER_ALLWINCODECS 256
-#define USER_MENUOPENAUTO 512
-#define USER_PANELPINNED 1024
-#define USER_AUTOPERSP 2048
-#define USER_LOCKAROUND 4096
-#define USER_GLOBALUNDO 8192
-#define USER_ORBIT_SELECTION 16384
-#define USER_KEYINSERTAVAI 32768
-#define USER_HIDE_DOT 65536
-#define USER_SHOW_ROTVIEWICON 131072
-#define USER_SHOW_VIEWPORTNAME 262144
-#define USER_KEYINSERTNEED 524288
+#define USER_FLIPFULLSCREEN (1 << 7)
+#define USER_ALLWINCODECS (1 << 8)
+#define USER_MENUOPENAUTO (1 << 9)
+#define USER_PANELPINNED (1 << 10)
+#define USER_AUTOPERSP (1 << 11)
+#define USER_LOCKAROUND (1 << 12)
+#define USER_GLOBALUNDO (1 << 13)
+#define USER_ORBIT_SELECTION (1 << 14)
+#define USER_KEYINSERTAVAI (1 << 15)
+#define USER_HIDE_DOT (1 << 16)
+#define USER_SHOW_ROTVIEWICON (1 << 17)
+#define USER_SHOW_VIEWPORTNAME (1 << 18)
+#define USER_KEYINSERTNEED (1 << 19)
+#define USER_ZOOM_TO_MOUSEPOS (1 << 20)
/* transopts */
-#define USER_TR_TOOLTIPS 1
-#define USER_TR_BUTTONS 2
-#define USER_TR_MENUS 4
-#define USER_TR_FILESELECT 8
-#define USER_TR_TEXTEDIT 16
-#define USER_DOTRANSLATE 32
-#define USER_USETEXTUREFONT 64
+#define USER_TR_TOOLTIPS (1 << 0)
+#define USER_TR_BUTTONS (1 << 1)
+#define USER_TR_MENUS (1 << 2)
+#define USER_TR_FILESELECT (1 << 3)
+#define USER_TR_TEXTEDIT (1 << 4)
+#define USER_DOTRANSLATE (1 << 5)
+#define USER_USETEXTUREFONT (1 << 6)
+#define CONVERT_TO_UTF8 (1 << 7)
/* dupflag */
-#define USER_DUP_MESH 1
-#define USER_DUP_CURVE 2
-#define USER_DUP_SURF 4
-#define USER_DUP_FONT 8
-#define USER_DUP_MBALL 16
-#define USER_DUP_LAMP 32
-#define USER_DUP_IPO 64
-#define USER_DUP_MAT 128
-#define USER_DUP_TEX 256
-#define USER_DUP_ARM 512
-#define USER_DUP_ACT 1024
+#define USER_DUP_MESH (1 << 0)
+#define USER_DUP_CURVE (1 << 1)
+#define USER_DUP_SURF (1 << 2)
+#define USER_DUP_FONT (1 << 3)
+#define USER_DUP_MBALL (1 << 4)
+#define USER_DUP_LAMP (1 << 5)
+#define USER_DUP_IPO (1 << 6)
+#define USER_DUP_MAT (1 << 7)
+#define USER_DUP_TEX (1 << 8)
+#define USER_DUP_ARM (1 << 9)
+#define USER_DUP_ACT (1 << 10)
/* gameflags */
diff --git a/source/blender/makesdna/DNA_view2d_types.h b/source/blender/makesdna/DNA_view2d_types.h
index cfd6f682e71..3ed82ddc793 100644
--- a/source/blender/makesdna/DNA_view2d_types.h
+++ b/source/blender/makesdna/DNA_view2d_types.h
@@ -45,6 +45,10 @@ typedef struct View2D {
short keepaspect, keepzoom;
short oldwinx, oldwiny;
int flag;
+
+ float cursor[2]; /* only used in the UV view for now*/
+ short around;
+ char pad[6];
} View2D;
/* v2d->keepzoom */
diff --git a/source/blender/makesdna/DNA_view3d_types.h b/source/blender/makesdna/DNA_view3d_types.h
index 27cd20c3210..ee75d7b8f0f 100644
--- a/source/blender/makesdna/DNA_view3d_types.h
+++ b/source/blender/makesdna/DNA_view3d_types.h
@@ -137,7 +137,7 @@ typedef struct View3D {
short gridsubdiv; /* Number of subdivisions in the grid between each highlighted grid line */
- short snap_target;
+ short pad3;
short pad2;
@@ -164,16 +164,12 @@ typedef struct View3D {
#define V3D_CLIPPING 16384
#define V3D_DRAW_CENTERS 32768
+
/* View3d->flag2 (short) */
#define V3D_OPP_DIRECTION_NAME 1
#define V3D_FLYMODE 2
-#define V3D_TRANSFORM_SNAP 4
-
-/* View3d->snap_target */
-#define V3D_SNAP_TARGET_CLOSEST 0
-#define V3D_SNAP_TARGET_CENTER 1
-#define V3D_SNAP_TARGET_MEDIAN 2
-
+#define V3D_DEPRECATED 4 /* V3D_TRANSFORM_SNAP, moved to a scene setting */
+#define V3D_SOLID_TEX 8
/* View3D->around */
#define V3D_CENTER 0
diff --git a/source/blender/makesdna/DNA_world_types.h b/source/blender/makesdna/DNA_world_types.h
index 03b6871b8e0..9e5ec4cdb9a 100644
--- a/source/blender/makesdna/DNA_world_types.h
+++ b/source/blender/makesdna/DNA_world_types.h
@@ -55,6 +55,7 @@ typedef struct World {
short colormodel, totex;
short texact, mistype;
+ /* TODO - hork, zenk and ambk are not used, should remove at some point (Campbell) */
float horr, horg, horb, hork;
float zenr, zeng, zenb, zenk;
float ambr, ambg, ambb, ambk;
@@ -102,11 +103,20 @@ typedef struct World {
/* ambient occlusion */
float aodist, aodistfac, aoenergy, aobias;
short aomode, aosamp, aomix, aocolor;
+ float ao_adapt_thresh, ao_adapt_speed_fac;
+ float pad2[2];
+ short ao_samp_method;
+ short pad1[3];
+
float *aosphere, *aotables;
+
struct Ipo *ipo;
struct MTex *mtex[10];
+ /* previews */
+ struct PreviewImage *preview;
+
ScriptLink scriptlink;
} World;
@@ -133,6 +143,11 @@ typedef struct World {
#define WO_AOSUB 1
#define WO_AOADDSUB 2
+/* ao_samp_method - methods for sampling the AO hemi */
+#define WO_AOSAMP_CONSTANT 0
+#define WO_AOSAMP_HALTON 1
+#define WO_AOSAMP_HAMMERSLEY 2
+
/* aomode (use distances & random sampling modes) */
#define WO_AODIST 1
#define WO_AORNDSMP 2
diff --git a/source/blender/makesdna/intern/Makefile b/source/blender/makesdna/intern/Makefile
index 84d854064d7..bd498961e7a 100644
--- a/source/blender/makesdna/intern/Makefile
+++ b/source/blender/makesdna/intern/Makefile
@@ -38,10 +38,6 @@ ALLTARGETS = $(OBJS) $(DIR)/$(DEBUG_DIR)makesdna $(DIR)/$(SHARED_DIR)$(DEBUG_DIR
include nan_compile.mk
-ifneq ($(OS),irix)
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/makesdna/intern/makesdna.c b/source/blender/makesdna/intern/makesdna.c
index 4d437861751..f696c45b315 100644
--- a/source/blender/makesdna/intern/makesdna.c
+++ b/source/blender/makesdna/intern/makesdna.c
@@ -127,6 +127,7 @@ char *includefiles[] = {
"DNA_color_types.h",
"DNA_brush_types.h",
"DNA_customdata_types.h",
+ "DNA_particle_types.h",
// if you add files here, please add them at the end
// of makesdna.c (this file) as well
@@ -714,8 +715,10 @@ static int calculate_structlens(int firststruct)
/* struct alignment */
if(type >= firststruct) {
- if(sizeof(void *)==8 && (len % 8) )
+ if(sizeof(void *)==8 && (len % 8) ) {
printf("Align struct error: %s %s\n", types[structtype],cp);
+ dna_error = 1;
+ }
}
/* 2-4 aligned/ */
@@ -1144,4 +1147,5 @@ int main(int argc, char ** argv)
#include "DNA_color_types.h"
#include "DNA_brush_types.h"
#include "DNA_customdata_types.h"
+#include "DNA_particle_types.h"
/* end of list */
diff --git a/source/blender/nodes/CMP_node.h b/source/blender/nodes/CMP_node.h
index 3410238c0a2..4b7e721ca57 100644
--- a/source/blender/nodes/CMP_node.h
+++ b/source/blender/nodes/CMP_node.h
@@ -62,6 +62,7 @@ extern bNodeType cmp_node_zcombine;
extern bNodeType cmp_node_normal;
extern bNodeType cmp_node_curve_vec;
extern bNodeType cmp_node_map_value;
+extern bNodeType cmp_node_normalize;
extern bNodeType cmp_node_filter;
extern bNodeType cmp_node_blur;
@@ -93,9 +94,12 @@ extern bNodeType cmp_node_translate;
extern bNodeType cmp_node_rotate;
extern bNodeType cmp_node_scale;
extern bNodeType cmp_node_flip;
+extern bNodeType cmp_node_crop;
extern bNodeType cmp_node_displace;
extern bNodeType cmp_node_mapuv;
-#endif
-
+extern bNodeType cmp_node_glare;
+extern bNodeType cmp_node_tonemap;
+extern bNodeType cmp_node_lensdist;
+#endif
diff --git a/source/blender/nodes/SHD_node.h b/source/blender/nodes/SHD_node.h
index 688494d6de5..8064a543ca0 100644
--- a/source/blender/nodes/SHD_node.h
+++ b/source/blender/nodes/SHD_node.h
@@ -58,6 +58,10 @@ extern bNodeType sh_node_vect_math;
extern bNodeType sh_node_squeeze;
extern bNodeType sh_node_material_ext;
extern bNodeType sh_node_invert;
+extern bNodeType sh_node_seprgb;
+extern bNodeType sh_node_combrgb;
+extern bNodeType sh_node_hue_sat;
+
#endif
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
index 91a04e3128a..8ef4af4d219 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_blur.c
@@ -29,8 +29,6 @@
#include "../CMP_util.h"
-
-
/* **************** BLUR ******************** */
static bNodeSocketType cmp_node_blur_in[]= {
{ SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
@@ -555,8 +553,6 @@ static void blur_with_reference(bNode *node, CompBuf *new, CompBuf *img, CompBuf
free_compbuf(ref_use);
}
-
-
static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
CompBuf *new, *img= in[0]->data;
@@ -564,35 +560,48 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
if(img==NULL || out[0]->hasoutput==0)
return;
- if(img->type==CB_VEC2 || img->type==CB_VEC3) {
- img= typecheck_compbuf(in[0]->data, CB_RGBA);
- }
+ if (((NodeBlurData *)node->storage)->filtertype == R_FILTER_FAST_GAUSS) {
+ CompBuf *new, *img = in[0]->data;
+ /*from eeshlo's original patch, removed to fit in with the existing blur node */
+ /*const float sx = in[1]->vec[0], sy = in[2]->vec[0];*/
- /* if fac input, we do it different */
- if(in[1]->data) {
-
- /* make output size of input image */
- new= alloc_compbuf(img->x, img->y, img->type, 1); /* allocs */
-
- /* accept image offsets from other nodes */
- new->xof = img->xof;
- new->yof = img->yof;
-
- blur_with_reference(node, new, img, in[1]->data);
- if(node->exec & NODE_BREAK) {
- free_compbuf(new);
- new= NULL;
+ NodeBlurData *nbd= node->storage;
+ const float sx = ((float)nbd->sizex)/2.0f, sy = ((float)nbd->sizey)/2.0f;
+ int c;
+
+ if ((img==NULL) || (out[0]->hasoutput==0)) return;
+
+ if (img->type == CB_VEC2)
+ new = typecheck_compbuf(img, CB_VAL);
+ else if (img->type == CB_VEC3)
+ new = typecheck_compbuf(img, CB_RGBA);
+ else
+ new = dupalloc_compbuf(img);
+
+ if ((sx == sy) && (sx > 0.f)) {
+ for (c=0; c<new->type; ++c)
+ IIR_gauss(new, sx, c, 3);
}
- out[0]->data= new;
- }
- else {
+ else {
+ if (sx > 0.f) {
+ for (c=0; c<new->type; ++c)
+ IIR_gauss(new, sx, c, 1);
+ }
+ if (sy > 0.f) {
+ for (c=0; c<new->type; ++c)
+ IIR_gauss(new, sy, c, 2);
+ }
+ }
+ out[0]->data = new;
- if(in[1]->vec[0]<=0.001f) { /* time node inputs can be a tiny value */
- new= pass_on_compbuf(img);
+ } else {
+ /* All non fast gauss blur methods */
+ if(img->type==CB_VEC2 || img->type==CB_VEC3) {
+ img= typecheck_compbuf(in[0]->data, CB_RGBA);
}
- else {
- NodeBlurData *nbd= node->storage;
- CompBuf *gammabuf;
+
+ /* if fac input, we do it different */
+ if(in[1]->data) {
/* make output size of input image */
new= alloc_compbuf(img->x, img->y, img->type, 1); /* allocs */
@@ -600,33 +609,57 @@ static void node_composit_exec_blur(void *data, bNode *node, bNodeStack **in, bN
/* accept image offsets from other nodes */
new->xof = img->xof;
new->yof = img->yof;
-
- if(nbd->gamma) {
- gammabuf= dupalloc_compbuf(img);
- gamma_correct_compbuf(gammabuf, 0);
- }
- else gammabuf= img;
-
- if(nbd->bokeh)
- bokeh_single_image(node, new, gammabuf, in[1]->vec[0]);
- else if(1)
- blur_single_image(node, new, gammabuf, in[1]->vec[0]);
- else /* bloom experimental... */
- bloom_with_reference(new, gammabuf, NULL, in[1]->vec[0], nbd);
- if(nbd->gamma) {
- gamma_correct_compbuf(new, 1);
- free_compbuf(gammabuf);
- }
+ blur_with_reference(node, new, img, in[1]->data);
if(node->exec & NODE_BREAK) {
free_compbuf(new);
new= NULL;
}
+ out[0]->data= new;
+ }
+ else {
+
+ if(in[1]->vec[0]<=0.001f) { /* time node inputs can be a tiny value */
+ new= pass_on_compbuf(img);
+ }
+ else {
+ NodeBlurData *nbd= node->storage;
+ CompBuf *gammabuf;
+
+ /* make output size of input image */
+ new= alloc_compbuf(img->x, img->y, img->type, 1); /* allocs */
+
+ /* accept image offsets from other nodes */
+ new->xof = img->xof;
+ new->yof = img->yof;
+
+ if(nbd->gamma) {
+ gammabuf= dupalloc_compbuf(img);
+ gamma_correct_compbuf(gammabuf, 0);
+ }
+ else gammabuf= img;
+
+ if(nbd->bokeh)
+ bokeh_single_image(node, new, gammabuf, in[1]->vec[0]);
+ else if(1)
+ blur_single_image(node, new, gammabuf, in[1]->vec[0]);
+ else /* bloom experimental... */
+ bloom_with_reference(new, gammabuf, NULL, in[1]->vec[0], nbd);
+
+ if(nbd->gamma) {
+ gamma_correct_compbuf(new, 1);
+ free_compbuf(gammabuf);
+ }
+ if(node->exec & NODE_BREAK) {
+ free_compbuf(new);
+ new= NULL;
+ }
+ }
+ out[0]->data= new;
}
- out[0]->data= new;
+ if(img!=in[0]->data)
+ free_compbuf(img);
}
- if(img!=in[0]->data)
- free_compbuf(img);
}
static void node_composit_init_blur(bNode* node)
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_crop.c b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
new file mode 100644
index 00000000000..f3a00dec084
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_crop.c
@@ -0,0 +1,119 @@
+/**
+ *
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Juho Vepsäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../CMP_util.h"
+
+/* **************** Crop ******************** */
+
+static bNodeSocketType cmp_node_crop_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+static bNodeSocketType cmp_node_crop_out[]= {
+ { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_composit_exec_crop(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ if(in[0]->data) {
+ NodeTwoXYs *ntxy= node->storage;
+ CompBuf *cbuf= in[0]->data;
+ CompBuf *stackbuf;
+ int x, y;
+ float *srcfp, *outfp;
+ rcti outputrect;
+
+ /* check input image size */
+ if(cbuf->x <= ntxy->x1 + 1)
+ ntxy->x1= cbuf->x - 1;
+
+ if(cbuf->y <= ntxy->y1 + 1)
+ ntxy->y1= cbuf->y - 1;
+
+ if(cbuf->x <= ntxy->x2 + 1)
+ ntxy->x2= cbuf->x - 1;
+
+ if(cbuf->y <= ntxy->y2 + 1)
+ ntxy->y2= cbuf->y - 1;
+
+ /* figure out the minimums and maximums */
+ outputrect.xmax=MAX2(ntxy->x1, ntxy->x2) + 1;
+ outputrect.xmin=MIN2(ntxy->x1, ntxy->x2);
+ outputrect.ymax=MAX2(ntxy->y1, ntxy->y2) + 1;
+ outputrect.ymin=MIN2(ntxy->y1, ntxy->y2);
+
+ if(node->custom1) {
+ /* this option crops the image size too */
+ stackbuf= get_cropped_compbuf(&outputrect, cbuf->rect, cbuf->x, cbuf->y, cbuf->type);
+ }
+ else {
+ /* this option won't crop the size of the image as well */
+ /* allocate memory for the output image */
+ stackbuf = alloc_compbuf(cbuf->x, cbuf->y, cbuf->type, 1);
+
+ /* select the cropped part of the image and set it to the output */
+ for(y=outputrect.ymin; y<outputrect.ymax; y++){
+ srcfp= cbuf->rect + (y * cbuf->x + outputrect.xmin) * cbuf->type;
+ outfp= stackbuf->rect + (y * stackbuf->x + outputrect.xmin) * stackbuf->type;
+ for(x=outputrect.xmin; x<outputrect.xmax; x++, outfp+= stackbuf->type, srcfp+= cbuf->type)
+ memcpy(outfp, srcfp, sizeof(float)*stackbuf->type);
+ }
+ }
+
+ out[0]->data= stackbuf;
+ }
+}
+
+static void node_composit_init_crop(bNode* node)
+{
+ NodeTwoXYs *nxy= MEM_callocN(sizeof(NodeTwoXYs), "node xy data");
+ node->storage= nxy;
+ nxy->x1= 0;
+ nxy->x2= 0;
+ nxy->y1= 0;
+ nxy->y2= 0;
+}
+
+bNodeType cmp_node_crop= {
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ CMP_NODE_CROP,
+ /* name */ "Crop",
+ /* width+range */ 140, 100, 320,
+ /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
+ /* input sock */ cmp_node_crop_in,
+ /* output sock */ cmp_node_crop_out,
+ /* storage */ "NodeTwoXYs",
+ /* execfunc */ node_composit_exec_crop,
+ /* butfunc */ NULL,
+ /* initfunc */ node_composit_init_crop,
+ /* freestoragefunc */ node_free_standard_storage,
+ /* copystoragefunc */ node_copy_standard_storage,
+ /* id */ NULL
+};
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
index 1eecbf3b63e..53d01ab1d12 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_defocus.c
@@ -143,7 +143,7 @@ static float RI_vdC(unsigned int bits, unsigned int r)
// single channel IIR gaussian filtering
// much faster than anything else, constant time independent of width
// should extend to multichannel and make this a node, could be useful
-static void IIR_gauss(CompBuf* buf, float sigma)
+static void IIR_gauss_single(CompBuf* buf, float sigma)
{
double q, q2, sc, cf[4], tsM[9], tsu[3], tsv[3];
float *X, *Y, *W;
@@ -257,7 +257,8 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
if (camob && camob->type==OB_CAMERA) {
Camera* cam = (Camera*)camob->data;
cam_lens = cam->lens;
- cam_fdist = (cam->YF_dofdist==0.f) ? 1e10f : cam->YF_dofdist;
+ cam_fdist = dof_camera(camob);
+ if (cam_fdist==0.0) cam_fdist = 1e10f; /* if the dof is 0.0 then set it be be far away */
cam_invfdist = 1.f/cam_fdist;
}
@@ -321,8 +322,8 @@ static void defocus_blur(bNode *node, CompBuf *new, CompBuf *img, CompBuf *zbuf,
// bug #6656 part 1, probably when previous node_composite.c was split into separate files, it was not properly updated
// to include recent cvs commits (well, at least not defocus node), so this part was missing...
wt = aperture*128.f;
- IIR_gauss(crad, wt);
- IIR_gauss(wts, wt);
+ IIR_gauss_single(crad, wt);
+ IIR_gauss_single(wts, wt);
// bug #6656 part 2a, although foreground blur is not based anymore on closest object,
// the rescaling op below was still based on that anyway, and unlike the comment in below code,
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_glare.c b/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
new file mode 100644
index 00000000000..9943dd2246d
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_glare.c
@@ -0,0 +1,498 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Alfredo de Greef (eeshlo)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../CMP_util.h"
+
+static bNodeSocketType cmp_node_glare_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+static bNodeSocketType cmp_node_glare_out[]= {
+ { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+
+// mix two images, src buffer does not have to be same size,
+static void mixImages(CompBuf *dst, CompBuf *src, float mix)
+{
+ int x, y;
+ fRGB c1, c2, *dcolp, *scolp;
+ const float mf = 2.f - 2.f*fabsf(mix - 0.5f);
+ if ((dst->x == src->x) && (dst->y == src->y)) {
+ for (y=0; y<dst->y; y++) {
+ dcolp = (fRGB*)&dst->rect[y*dst->x*dst->type];
+ scolp = (fRGB*)&src->rect[y*dst->x*dst->type];
+ for (x=0; x<dst->x; x++) {
+ fRGB_copy(c1, dcolp[x]);
+ fRGB_copy(c2, scolp[x]);
+ c1[0] += mix*(c2[0] - c1[0]);
+ c1[1] += mix*(c2[1] - c1[1]);
+ c1[2] += mix*(c2[2] - c1[2]);
+ if (c1[0] < 0.f) c1[0] = 0.f;
+ if (c1[1] < 0.f) c1[1] = 0.f;
+ if (c1[2] < 0.f) c1[2] = 0.f;
+ fRGB_mult(c1, mf);
+ fRGB_copy(dcolp[x], c1);
+ }
+ }
+ }
+ else {
+ float xr = src->x / (float)dst->x;
+ float yr = src->y / (float)dst->y;
+ for (y=0; y<dst->y; y++) {
+ dcolp = (fRGB*)&dst->rect[y*dst->x*dst->type];
+ for (x=0; x<dst->x; x++) {
+ fRGB_copy(c1, dcolp[x]);
+ qd_getPixelLerp(src, (x + 0.5f)*xr - 0.5f, (y + 0.5f)*yr - 0.5f, c2);
+ c1[0] += mix*(c2[0] - c1[0]);
+ c1[1] += mix*(c2[1] - c1[1]);
+ c1[2] += mix*(c2[2] - c1[2]);
+ if (c1[0] < 0.f) c1[0] = 0.f;
+ if (c1[1] < 0.f) c1[1] = 0.f;
+ if (c1[2] < 0.f) c1[2] = 0.f;
+ fRGB_mult(c1, mf);
+ fRGB_copy(dcolp[x], c1);
+ }
+ }
+ }
+}
+
+
+// adds src to dst image, must be of same size
+static void addImage(CompBuf* dst, CompBuf* src, float scale)
+{
+ if ((dst->x == src->x) && (dst->y == src->y)) {
+ int p = dst->x*dst->y*dst->type;
+ float *dcol = dst->rect, *scol = src->rect;
+ while (p--) *dcol++ += *scol++ * scale;
+ }
+}
+
+
+// returns possibly downscaled copy of all pixels above threshold
+static CompBuf* BTP(CompBuf* src, float threshold, int scaledown)
+{
+ int x, y;
+ CompBuf* bsrc = qd_downScaledCopy(src, scaledown);
+ float* cr = bsrc->rect;
+ for (y=0; y<bsrc->y; ++y)
+ for (x=0; x<bsrc->x; ++x, cr+=4) {
+ if ((0.212671f*cr[0] + 0.71516f*cr[1] + 0.072169f*cr[2]) >= threshold) {
+ cr[0] -= threshold, cr[1] -= threshold, cr[2] -= threshold;
+ cr[0] = MAX2(cr[0], 0.f);
+ cr[1] = MAX2(cr[1], 0.f);
+ cr[2] = MAX2(cr[2], 0.f);
+ }
+ else cr[0] = cr[1] = cr[2] = 0.f;
+ }
+ return bsrc;
+}
+
+//--------------------------------------------------------------------------------------------
+// simple 4-point star filter
+
+static void star4(NodeGlare* ndg, CompBuf* dst, CompBuf* src)
+{
+ int x, y, i, xm, xp, ym, yp;
+ float c[4] = {0,0,0,0}, tc[4] = {0,0,0,0};
+ CompBuf *tbuf1, *tbuf2, *tsrc;
+ const float f1 = 1.f - ndg->fade, f2 = (1.f - f1)*0.5f;
+ //const float t3 = ndg->threshold*3.f;
+ const float sc = (float)(1 << ndg->quality);
+ const float isc = 1.f/sc;
+
+ tsrc = BTP(src, ndg->threshold, (int)sc);
+
+ tbuf1 = dupalloc_compbuf(tsrc);
+ tbuf2 = dupalloc_compbuf(tsrc);
+
+ for (i=0; i<ndg->iter; i++) {
+ // (x || x-1, y-1) to (x || x+1, y+1)
+ // F
+ for (y=0; y<tbuf1->y; y++) {
+ ym = y - i;
+ yp = y + i;
+ for (x=0; x<tbuf1->x; x++) {
+ xm = x - i;
+ xp = x + i;
+ qd_getPixel(tbuf1, x, y, c);
+ fRGB_mult(c, f1);
+ qd_getPixel(tbuf1, (ndg->angle ? xm : x), ym, tc);
+ fRGB_madd(c, tc, f2);
+ qd_getPixel(tbuf1, (ndg->angle ? xp : x), yp, tc);
+ fRGB_madd(c, tc, f2);
+ qd_setPixel(tbuf1, x, y, c);
+ }
+ }
+ // B
+ for (y=tbuf1->y-1; y>=0; y--) {
+ ym = y - i;
+ yp = y + i;
+ for (x=tbuf1->x-1; x>=0; x--) {
+ xm = x - i;
+ xp = x + i;
+ qd_getPixel(tbuf1, x, y, c);
+ fRGB_mult(c, f1);
+ qd_getPixel(tbuf1, (ndg->angle ? xm : x), ym, tc);
+ fRGB_madd(c, tc, f2);
+ qd_getPixel(tbuf1, (ndg->angle ? xp : x), yp, tc);
+ fRGB_madd(c, tc, f2);
+ qd_setPixel(tbuf1, x, y, c);
+ }
+ }
+ // (x-1, y || y+1) to (x+1, y || y-1)
+ // F
+ for (y=0; y<tbuf2->y; y++) {
+ ym = y - i;
+ yp = y + i;
+ for (x=0; x<tbuf2->x; x++) {
+ xm = x - i;
+ xp = x + i;
+ qd_getPixel(tbuf2, x, y, c);
+ fRGB_mult(c, f1);
+ qd_getPixel(tbuf2, xm, (ndg->angle ? yp : y), tc);
+ fRGB_madd(c, tc, f2);
+ qd_getPixel(tbuf2, xp, (ndg->angle ? ym : y), tc);
+ fRGB_madd(c, tc, f2);
+ qd_setPixel(tbuf2, x, y, c);
+ }
+ }
+ // B
+ for (y=tbuf2->y-1; y>=0; y--) {
+ ym = y - i;
+ yp = y + i;
+ for (x=tbuf2->x-1; x>=0; x--) {
+ xm = x - i;
+ xp = x + i;
+ qd_getPixel(tbuf2, x, y, c);
+ fRGB_mult(c, f1);
+ qd_getPixel(tbuf2, xm, (ndg->angle ? yp : y), tc);
+ fRGB_madd(c, tc, f2);
+ qd_getPixel(tbuf2, xp, (ndg->angle ? ym : y), tc);
+ fRGB_madd(c, tc, f2);
+ qd_setPixel(tbuf2, x, y, c);
+ }
+ }
+ }
+
+ for (y=0; y<tbuf1->y; ++y)
+ for (x=0; x<tbuf1->x; ++x) {
+ unsigned int p = (x + y*tbuf1->x)*tbuf1->type;
+ tbuf1->rect[p] += tbuf2->rect[p];
+ tbuf1->rect[p+1] += tbuf2->rect[p+1];
+ tbuf1->rect[p+2] += tbuf2->rect[p+2];
+ }
+
+ for (y=0; y<dst->y; ++y) {
+ const float m = 0.5f + 0.5f*ndg->mix;
+ for (x=0; x<dst->x; ++x) {
+ unsigned int p = (x + y*dst->x)*dst->type;
+ qd_getPixelLerp(tbuf1, x*isc, y*isc, tc);
+ dst->rect[p] = src->rect[p] + m*(tc[0] - src->rect[p]);
+ dst->rect[p+1] = src->rect[p+1] + m*(tc[1] - src->rect[p+1]);
+ dst->rect[p+2] = src->rect[p+2] + m*(tc[2] - src->rect[p+2]);
+ }
+ }
+
+ free_compbuf(tbuf1);
+ free_compbuf(tbuf2);
+ free_compbuf(tsrc);
+}
+
+//--------------------------------------------------------------------------------------------
+// streak filter
+
+static void streaks(NodeGlare* ndg, CompBuf* dst, CompBuf* src)
+{
+ CompBuf *bsrc, *tsrc, *tdst, *sbuf;
+ int x, y, n;
+ unsigned int nump=0;
+ fRGB c1, c2, c3, c4;
+ float a, ang = 360.f/(float)ndg->angle;
+
+ bsrc = BTP(src, ndg->threshold, 1 << ndg->quality);
+ tsrc = dupalloc_compbuf(bsrc); // sample from buffer
+ tdst = alloc_compbuf(tsrc->x, tsrc->y, tsrc->type, 1); // sample to buffer
+ sbuf = alloc_compbuf(tsrc->x, tsrc->y, tsrc->type, 1); // streak sum buffer
+
+
+ for (a=0.f; a<360.f; a+=ang) {
+ const float an = (a + (float)ndg->angle_ofs)*(float)M_PI/180.f;
+ const float vx = cosf(an), vy = sinf(an);
+ for (n=0; n<ndg->iter; ++n) {
+ const float p4 = powf(4.f, n);
+ const float vxp = vx*p4, vyp = vy*p4;
+ const float wt = powf(ndg->fade, p4);
+ const float cmo = 1.f - powf(ndg->colmod, n+1); // colormodulation amount relative to current pass
+ float* tdstcol = tdst->rect;
+ for (y=0; y<tsrc->y; ++y) {
+ for (x=0; x<tsrc->x; ++x, tdstcol+=4) {
+ // first pass no offset, always same for every pass, exact copy,
+ // otherwise results in uneven brightness, only need once
+ if (n==0) qd_getPixel(tsrc, x, y, c1); else c1[0]=c1[1]=c1[2]=0;
+ qd_getPixelLerp(tsrc, x + vxp, y + vyp, c2);
+ qd_getPixelLerp(tsrc, x + vxp*2.f, y + vyp*2.f, c3);
+ qd_getPixelLerp(tsrc, x + vxp*3.f, y + vyp*3.f, c4);
+ // modulate color to look vaguely similar to a color spectrum
+ fRGB_rgbmult(c2, 1.f, cmo, cmo);
+ fRGB_rgbmult(c3, cmo, cmo, 1.f);
+ fRGB_rgbmult(c4, cmo, 1.f, cmo);
+ tdstcol[0] = 0.5f*(tdstcol[0] + c1[0] + wt*(c2[0] + wt*(c3[0] + wt*c4[0])));
+ tdstcol[1] = 0.5f*(tdstcol[1] + c1[1] + wt*(c2[1] + wt*(c3[1] + wt*c4[1])));
+ tdstcol[2] = 0.5f*(tdstcol[2] + c1[2] + wt*(c2[2] + wt*(c3[2] + wt*c4[2])));
+ }
+ }
+ memcpy(tsrc->rect, tdst->rect, sizeof(float)*tdst->x*tdst->y*tdst->type);
+ }
+
+ addImage(sbuf, tsrc, 1.f/(float)(6 - ndg->iter));
+ memset(tdst->rect, 0, tdst->x*tdst->y*tdst->type*sizeof(float));
+ memcpy(tsrc->rect, bsrc->rect, bsrc->x*bsrc->y*bsrc->type*sizeof(float));
+ nump++;
+ }
+
+ mixImages(dst, sbuf, 0.5f + 0.5f*ndg->mix);
+
+ free_compbuf(tsrc);
+ free_compbuf(tdst);
+ free_compbuf(sbuf);
+ free_compbuf(bsrc);
+}
+
+
+//--------------------------------------------------------------------------------------------
+// Ghosts (lensflare)
+
+static float smoothMask(float x, float y)
+{
+ float t;
+ x = 2.f*x - 1.f, y = 2.f*y - 1.f;
+ if ((t = 1.f - sqrtf(x*x + y*y)) <= 0.f) return 0.f;
+ return t;
+}
+
+static void ghosts(NodeGlare* ndg, CompBuf* dst, CompBuf* src)
+{
+ // colormodulation and scale factors (cm & scalef) for 16 passes max: 64
+ int x, y, n, p, np;
+ fRGB c, tc, cm[64];
+ float sc, isc, u, v, sm, s, t, ofs, scalef[64];
+ CompBuf *tbuf1, *tbuf2, *gbuf;
+ const float cmo = 1.f - ndg->colmod;
+ const int qt = 1 << ndg->quality;
+ const float s1 = 4.f/(float)qt, s2 = 2.f*s1;
+
+ gbuf = BTP(src, ndg->threshold, qt);
+ tbuf1 = dupalloc_compbuf(gbuf);
+ IIR_gauss(tbuf1, s1, 0, 3);
+ IIR_gauss(tbuf1, s1, 1, 3);
+ IIR_gauss(tbuf1, s1, 2, 3);
+ tbuf2 = dupalloc_compbuf(tbuf1);
+ IIR_gauss(tbuf2, s2, 0, 3);
+ IIR_gauss(tbuf2, s2, 1, 3);
+ IIR_gauss(tbuf2, s2, 2, 3);
+
+ if (ndg->iter & 1) ofs = 0.5f; else ofs = 0.f;
+ for (x=0; x<(ndg->iter*4); x++) {
+ y = x & 3;
+ cm[x][0] = cm[x][1] = cm[x][2] = 1;
+ if (y==1) fRGB_rgbmult(cm[x], 1.f, cmo, cmo);
+ if (y==2) fRGB_rgbmult(cm[x], cmo, cmo, 1.f);
+ if (y==3) fRGB_rgbmult(cm[x], cmo, 1.f, cmo);
+ scalef[x] = 2.1f*(1.f-(x+ofs)/(float)(ndg->iter*4));
+ if (x & 1) scalef[x] = -0.99f/scalef[x];
+ }
+
+ sc = 2.13;
+ isc = -0.97;
+ for (y=0; y<gbuf->y; y++) {
+ v = (float)(y+0.5f) / (float)gbuf->y;
+ for (x=0; x<gbuf->x; x++) {
+ u = (float)(x+0.5f) / (float)gbuf->x;
+ s = (u-0.5f)*sc + 0.5f, t = (v-0.5f)*sc + 0.5f;
+ qd_getPixelLerp(tbuf1, s*gbuf->x, t*gbuf->y, c);
+ sm = smoothMask(s, t);
+ fRGB_mult(c, sm);
+ s = (u-0.5f)*isc + 0.5f, t = (v-0.5f)*isc + 0.5f;
+ qd_getPixelLerp(tbuf2, s*gbuf->x - 0.5f, t*gbuf->y - 0.5f, tc);
+ sm = smoothMask(s, t);
+ fRGB_madd(c, tc, sm);
+ qd_setPixel(gbuf, x, y, c);
+ }
+ }
+
+ memset(tbuf1->rect, 0, tbuf1->x*tbuf1->y*tbuf1->type*sizeof(float));
+ for (n=1; n<ndg->iter; n++) {
+ for (y=0; y<gbuf->y; y++) {
+ v = (float)(y+0.5f) / (float)gbuf->y;
+ for (x=0; x<gbuf->x; x++) {
+ u = (float)(x+0.5f) / (float)gbuf->x;
+ tc[0] = tc[1] = tc[2] = 0.f;
+ for (p=0;p<4;p++) {
+ np = (n<<2) + p;
+ s = (u-0.5f)*scalef[np] + 0.5f;
+ t = (v-0.5f)*scalef[np] + 0.5f;
+ qd_getPixelLerp(gbuf, s*gbuf->x - 0.5f, t*gbuf->y - 0.5f, c);
+ fRGB_colormult(c, cm[np]);
+ sm = smoothMask(s, t)*0.25f;
+ fRGB_madd(tc, c, sm);
+ }
+ p = (x + y*tbuf1->x)*tbuf1->type;
+ tbuf1->rect[p] += tc[0];
+ tbuf1->rect[p+1] += tc[1];
+ tbuf1->rect[p+2] += tc[2];
+ }
+ }
+ memcpy(gbuf->rect, tbuf1->rect, tbuf1->x*tbuf1->y*tbuf1->type*sizeof(float));
+ }
+
+ free_compbuf(tbuf1);
+ free_compbuf(tbuf2);
+
+ mixImages(dst, gbuf, 0.5f + 0.5f*ndg->mix);
+ free_compbuf(gbuf);
+}
+
+//--------------------------------------------------------------------------------------------
+// Fog glow (convolution with kernel of exponential falloff)
+
+static void fglow(NodeGlare* ndg, CompBuf* dst, CompBuf* src)
+{
+ int x, y;
+ float scale, u, v, r, w, d;
+ fRGB fcol;
+ CompBuf *tsrc, *ckrn;
+ unsigned int sz = 1 << ndg->size;
+ const float cs_r = 1.f, cs_g = 1.f, cs_b = 1.f;
+
+ // temp. src image
+ tsrc = BTP(src, ndg->threshold, 1 << ndg->quality);
+ // make the convolution kernel
+ ckrn = alloc_compbuf(sz, sz, CB_RGBA, 1);
+
+ scale = 0.25f*sqrtf(sz*sz);
+
+ for (y=0; y<sz; ++y) {
+ v = 2.f*(y / (float)sz) - 1.f;
+ for (x=0; x<sz; ++x) {
+ u = 2.f*(x / (float)sz) - 1.f;
+ r = (u*u + v*v)*scale;
+ d = -sqrtf(sqrtf(sqrtf(r)))*9.f;
+ fcol[0] = expf(d*cs_r), fcol[1] = expf(d*cs_g), fcol[2] = expf(d*cs_b);
+ // linear window good enough here, visual result counts, not scientific analysis
+ //w = (1.f-fabs(u))*(1.f-fabs(v));
+ // actually, Hanning window is ok, cos^2 for some reason is slower
+ w = (0.5f + 0.5f*cosf(u*(float)M_PI))*(0.5f + 0.5f*cosf(v*(float)M_PI));
+ fRGB_mult(fcol, w);
+ qd_setPixel(ckrn, x, y, fcol);
+ }
+ }
+
+ convolve(tsrc, tsrc, ckrn);
+ free_compbuf(ckrn);
+ mixImages(dst, tsrc, 0.5f + 0.5f*ndg->mix);
+ free_compbuf(tsrc);
+}
+
+//--------------------------------------------------------------------------------------------
+
+static void node_composit_exec_glare(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ CompBuf *new, *img = in[0]->data;
+ NodeGlare* ndg = node->storage;
+
+ if ((img == NULL) || (out[0]->hasoutput == 0)) return;
+
+ if (img->type != CB_RGBA)
+ new = typecheck_compbuf(img, CB_RGBA);
+ else
+ new = dupalloc_compbuf(img);
+
+ {
+ int x, y;
+ for (y=0; y<new->y; ++y) {
+ fRGB* col = (fRGB*)&new->rect[y*new->x*new->type];
+ for (x=0; x<new->x; ++x) {
+ col[x][0] = MAX2(col[x][0], 0.f);
+ col[x][1] = MAX2(col[x][1], 0.f);
+ col[x][2] = MAX2(col[x][2], 0.f);
+ }
+ }
+ }
+
+ switch (ndg->type) {
+ case 0:
+ star4(ndg, new, img);
+ break;
+ case 1:
+ fglow(ndg, new, img);
+ break;
+ case 3:
+ ghosts(ndg, new, img);
+ break;
+ case 2:
+ default:
+ streaks(ndg, new, img);
+ }
+
+ out[0]->data = new;
+}
+
+static void node_composit_init_glare(bNode* node)
+{
+ NodeGlare *ndg = MEM_callocN(sizeof(NodeGlare), "node glare data");
+ ndg->quality = 1;
+ ndg->type = 2;
+ ndg->iter = 3;
+ ndg->colmod = 0.25;
+ ndg->mix = 0;
+ ndg->threshold = 1;
+ ndg->angle = 4;
+ ndg->angle_ofs = 0;
+ ndg->fade = 0.9;
+ ndg->size = 8;
+ node->storage = ndg;
+}
+
+bNodeType cmp_node_glare = {
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ CMP_NODE_GLARE,
+ /* name */ "Glare",
+ /* width+range */ 150, 120, 200,
+ /* class+opts */ NODE_CLASS_OP_FILTER, NODE_OPTIONS,
+ /* input sock */ cmp_node_glare_in,
+ /* output sock */ cmp_node_glare_out,
+ /* storage */ "NodeGlare",
+ /* execfunc */ node_composit_exec_glare,
+ /* butfunc */ NULL,
+ /* initfunc */ node_composit_init_glare,
+ /* freestoragefunc */ node_free_standard_storage,
+ /* copystoragefunc */ node_copy_standard_storage,
+ /* id */ NULL
+};
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
index 1d4be2bc09f..4d8f5d63e75 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_invert.c
@@ -1,5 +1,5 @@
/**
- * $Id: CMP_mixrgb.c,v 1.4 2007/04/04 13:58:10 jesterking Exp $
+ * $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
new file mode 100644
index 00000000000..5dec6115fba
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_lensdist.c
@@ -0,0 +1,192 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Alfredo de Greef (eeshlo)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../CMP_util.h"
+
+static bNodeSocketType cmp_node_lensdist_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 1, "Distort", 0.f, 0.f, 0.f, 0.f, -0.999f, 1.f},
+ { SOCK_VALUE, 1, "Dispersion", 0.f, 0.f, 0.f, 0.f, 0.f, 1.f},
+ { -1, 0, "" }
+};
+static bNodeSocketType cmp_node_lensdist_out[]= {
+ { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+
+static void lensDistort(CompBuf* dst, CompBuf* src, float kr, float kg, float kb, int jit, int proj, int fit)
+{
+ int x, y, z;
+ const float cx = 0.5f*(float)dst->x, cy = 0.5f*(float)dst->y;
+
+ if (proj) {
+ // shift
+ CompBuf* tsrc = dupalloc_compbuf(src);
+ for (z=0; z<tsrc->type; ++z)
+ IIR_gauss(tsrc, (kr+0.5f)*(kr+0.5f), z, 1);
+ kr *= 20.f;
+ for (y=0; y<dst->y; y++) {
+ fRGB* colp = (fRGB*)&dst->rect[y*dst->x*dst->type];
+ const float v = (y + 0.5f)/(float)dst->y;
+ for (x=0; x<dst->x; x++) {
+ const float u = (x + 0.5f)/(float)dst->x;
+ qd_getPixelLerpChan(tsrc, (u*dst->x + kr) - 0.5f, v*dst->y - 0.5f, 0, colp[x]);
+ if (tsrc->type == CB_VAL)
+ colp[x][1] = tsrc->rect[x + y*tsrc->x];
+ else
+ colp[x][1] = tsrc->rect[(x + y*tsrc->x)*tsrc->type + 1];
+ qd_getPixelLerpChan(tsrc, (u*dst->x - kr) - 0.5f, v*dst->y - 0.5f, 2, colp[x]+2);
+ }
+ }
+ free_compbuf(tsrc);
+ }
+ else {
+ // Spherical
+ // Scale factor to make bottom/top & right/left sides fit in window after deform
+ // so in the case of pincushion (kn < 0), corners will be outside window.
+ // Now also optionally scales image such that black areas are not visible when distort factor is positive
+ // (makes distorted corners match window corners, but really only valid if mk<=0.5)
+ const float mk = MAX3(kr, kg, kb);
+ const float sc = (fit && (mk > 0.f)) ? (1.f/(1.f + 2.f*mk)) : (1.f/(1.f + mk));
+ const float drg = 4.f*(kg - kr), dgb = 4.f*(kb - kg);
+ kr *= 4.f, kg *= 4.f, kb *= 4.f;
+
+ for (y=0; y<dst->y; y++) {
+ fRGB* colp = (fRGB*)&dst->rect[y*dst->x*dst->type];
+ const float v = sc*((y + 0.5f) - cy)/cy;
+ for (x=0; x<dst->x; x++) {
+ int dr = 0, dg = 0, db = 0;
+ float d, t, ln[6] = {0, 0, 0, 0, 0, 0};
+ fRGB c1, tc = {0, 0, 0, 0};
+ const float u = sc*((x + 0.5f) - cx)/cx;
+ int sta = 0, mid = 0, end = 0;
+ if ((t = 1.f - kr*(u*u + v*v)) >= 0.f) {
+ d = 1.f/(1.f + sqrtf(t));
+ ln[0] = (u*d + 0.5f)*dst->x - 0.5f, ln[1] = (v*d + 0.5f)*dst->y - 0.5f;
+ sta = 1;
+ }
+ if ((t = 1.f - kg*(u*u + v*v)) >= 0.f) {
+ d = 1.f/(1.f + sqrtf(t));
+ ln[2] = (u*d + 0.5f)*dst->x - 0.5f, ln[3] = (v*d + 0.5f)*dst->y - 0.5f;
+ mid = 1;
+ }
+ if ((t = 1.f - kb*(u*u + v*v)) >= 0.f) {
+ d = 1.f/(1.f + sqrtf(t));
+ ln[4] = (u*d + 0.5f)*dst->x - 0.5f, ln[5] = (v*d + 0.5f)*dst->y - 0.5f;
+ end = 1;
+ }
+
+ if (sta && mid && end) {
+ // RG
+ const int dx = ln[2] - ln[0], dy = ln[3] - ln[1];
+ const float dsf = sqrtf(dx*dx + dy*dy) + 1.f;
+ const int ds = (int)(jit ? ((dsf < 4.f) ? 2.f : sqrtf(dsf)) : dsf);
+ const float sd = 1.f/(float)ds;
+ for (z=0; z<ds; ++z) {
+ const float tz = ((float)z + (jit ? BLI_frand() : 0.5f))*sd;
+ t = 1.f - (kr + tz*drg)*(u*u + v*v);
+ d = 1.f / (1.f + sqrtf(t));
+ qd_getPixelLerp(src, (u*d + 0.5f)*dst->x - 0.5f, (v*d + 0.5f)*dst->y - 0.5f, c1);
+ if (src->type == CB_VAL) c1[1] = c1[2] = c1[0];
+ tc[0] += (1.f-tz)*c1[0], tc[1] += tz*c1[1];
+ dr++, dg++;
+ }
+ // GB
+ {
+ const int dx = ln[4] - ln[2], dy = ln[5] - ln[3];
+ const float dsf = sqrtf(dx*dx + dy*dy) + 1.f;
+ const int ds = (int)(jit ? ((dsf < 4.f) ? 2.f : sqrtf(dsf)) : dsf);
+ const float sd = 1.f/(float)ds;
+ for (z=0; z<ds; ++z) {
+ const float tz = ((float)z + (jit ? BLI_frand() : 0.5f))*sd;
+ t = 1.f - (kg + tz*dgb)*(u*u + v*v);
+ d = 1.f / (1.f + sqrtf(t));
+ qd_getPixelLerp(src, (u*d + 0.5f)*dst->x - 0.5f, (v*d + 0.5f)*dst->y - 0.5f, c1);
+ if (src->type == CB_VAL) c1[1] = c1[2] = c1[0];
+ tc[1] += (1.f-tz)*c1[1], tc[2] += tz*c1[2];
+ dg++, db++;
+ }
+ }
+ }
+
+ if (dr) colp[x][0] = 2.f*tc[0] / (float)dr;
+ if (dg) colp[x][1] = 2.f*tc[1] / (float)dg;
+ if (db) colp[x][2] = 2.f*tc[2] / (float)db;
+
+ }
+ }
+
+ }
+
+}
+
+
+static void node_composit_exec_lensdist(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ CompBuf *new, *img = in[0]->data;
+ NodeLensDist* nld = node->storage;
+ const float k = MAX2(MIN2(in[1]->vec[0], 1.f), -0.999f);
+ // smaller dispersion range for somewhat more control
+ const float d = 0.25f*MAX2(MIN2(in[2]->vec[0], 1.f), 0.f);
+ const float kr = MAX2(MIN2((k+d), 1.f), -0.999f), kb = MAX2(MIN2((k-d), 1.f), -0.999f);
+
+ if ((img==NULL) || (out[0]->hasoutput==0)) return;
+
+ new = alloc_compbuf(img->x, img->y, CB_RGBA, 1);
+
+ lensDistort(new, img, (nld->proj ? d : kr), k, kb, nld->jit, nld->proj, nld->fit);
+
+ out[0]->data = new;
+}
+
+
+static void node_composit_init_lensdist(bNode* node)
+{
+ NodeLensDist *nld = MEM_callocN(sizeof(NodeLensDist), "node lensdist data");
+ nld->jit = nld->proj = nld->fit = 0;
+ node->storage = nld;
+}
+
+
+bNodeType cmp_node_lensdist = {
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ CMP_NODE_LENSDIST,
+ /* name */ "Lens Distortion",
+ /* width+range */ 150, 120, 200,
+ /* class+opts */ NODE_CLASS_DISTORT, NODE_OPTIONS,
+ /* input sock */ cmp_node_lensdist_in,
+ /* output sock */ cmp_node_lensdist_out,
+ /* storage */ "NodeLensDist",
+ /* execfunc */ node_composit_exec_lensdist,
+ /* butfunc */ NULL,
+ /* initfunc */ node_composit_init_lensdist,
+ /* freestoragefunc */ node_free_standard_storage,
+ /* copystoragefunc */ node_copy_standard_storage,
+ /* id */ NULL
+};
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_math.c b/source/blender/nodes/intern/CMP_nodes/CMP_math.c
index 27d7da16a59..cf2af9bbc11 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_math.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_math.c
@@ -137,25 +137,33 @@ static void do_math(bNode *node, float *out, float *in, float *in2)
static void node_composit_exec_math(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
{
- /* stack order out: bw */
- /* stack order in: col */
-
- if(out[0]->hasoutput==0)
- return;
-
- /* input no image? then only color operation */
- if(in[0]->data==NULL) {
+ CompBuf *cbuf=in[0]->data;
+ CompBuf *cbuf2=in[1]->data;
+ CompBuf *stackbuf;
+
+ /* check for inputs and outputs for early out*/
+ if(in[0]->hasinput==0 && in[1]->hasinput==0) return;
+ if(out[0]->hasoutput==0) return;
+
+ /* no image-color operation */
+ if(in[0]->data==NULL && in[1]->data==NULL) {
do_math(node, out[0]->vec, in[0]->vec, in[1]->vec);
+ return;
}
- else {
- /* make output size of input image */
- CompBuf *cbuf= in[0]->data;
- CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */
-
- composit2_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, do_math, CB_VAL, CB_VAL);
-
- out[0]->data= stackbuf;
+
+ /*create output based on first input */
+ if(cbuf) {
+ stackbuf=alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1);
+ }
+ /* and if it doesn't exist use the second input since we
+ know that one of them must exist at this point*/
+ else {
+ stackbuf=alloc_compbuf(cbuf2->x, cbuf2->y, CB_VAL, 1);
}
+
+ /* operate in case there's valid size */
+ composit2_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, in[1]->data, in[1]->vec, do_math, CB_VAL, CB_VAL);
+ out[0]->data= stackbuf;
}
bNodeType cmp_node_math= {
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c b/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
new file mode 100644
index 00000000000..a62e4be4015
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_normalize.c
@@ -0,0 +1,113 @@
+/**
+ * $Id: CMP_normalize.c,v 1.0 2007/03/24 06:57:29 scourage Exp $
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): gsr b3d, and a very minor edit from Robert Holcomb
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../CMP_util.h"
+
+
+/* **************** NORMALIZE single channel, useful for Z buffer ******************** */
+static bNodeSocketType cmp_node_normalize_in[]= {
+ { SOCK_VALUE, 1, "Value", 1.0f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+static bNodeSocketType cmp_node_normalize_out[]= {
+ { SOCK_VALUE, 0, "Value", 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void do_normalize(bNode *node, float *out, float *src, float *min, float *mult)
+{
+ float res;
+ res = (src[0] - min[0]) * mult[0];
+ if (res > 1.0f) {
+ out[0] = 1.0f;
+ }
+ else if (res < 0.0f) {
+ out[0] = 0.0f;
+ }
+ else {
+ out[0] = res;
+ }
+}
+
+#define BLENDER_ZMAX 10000.0f
+
+static void node_composit_exec_normalize(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ /* stack order in: valbuf */
+ /* stack order out: valbuf */
+ if(out[0]->hasoutput==0) return;
+
+ /* input no image? then only value operation */
+ if(in[0]->data==NULL) {
+ QUATCOPY(out[0]->vec, in[0]->vec);
+ }
+ else {
+ float min = 1.0f+BLENDER_ZMAX;
+ float max = -1.0f-BLENDER_ZMAX;
+ float mult = 1.0f;
+ float *val;
+ /* make output size of input image */
+ CompBuf *cbuf= in[0]->data;
+ int tot= cbuf->x*cbuf->y;
+ CompBuf *stackbuf= alloc_compbuf(cbuf->x, cbuf->y, CB_VAL, 1); /* allocs */
+
+ for (val = cbuf->rect; tot; tot--, val++) {
+ if ((*val > max) && (*val < BLENDER_ZMAX)) {
+ max = *val;
+ }
+ if (*val < min) {
+ min = *val;
+ }
+ }
+ mult = 1.0f/(max-min);
+
+ printf("min %f max %f\n", min, max);
+
+ composit3_pixel_processor(node, stackbuf, in[0]->data, in[0]->vec, NULL, &min, NULL, &mult, do_normalize, CB_VAL, CB_VAL, CB_VAL);
+
+ out[0]->data= stackbuf;
+ }
+}
+
+bNodeType cmp_node_normalize= {
+ /* *next, *prev*/ NULL, NULL,
+ /* type code */ CMP_NODE_NORMALIZE,
+ /* name */ "Normalize",
+ /* width+range */ 100, 60, 150,
+ /* class+opts */ NODE_CLASS_OP_VECTOR, NODE_OPTIONS,
+ /* input sock */ cmp_node_normalize_in,
+ /* output sock */ cmp_node_normalize_out,
+ /* storage */ "TexMapping",
+ /* execfunc */ node_composit_exec_normalize,
+ /* butfunc */ NULL,
+ /* initfunc */ NULL,
+ /* freestoragefunc */ NULL,
+ /* copystoragefunc */ NULL,
+ /* id */ NULL
+};
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
index a8477f4264e..cc6f9249495 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_scale.c
@@ -52,6 +52,7 @@ static void node_composit_exec_scale(void *data, bNode *node, bNodeStack **in, b
return;
if(in[0]->data) {
+ RenderData *rd= data;
CompBuf *stackbuf, *cbuf= typecheck_compbuf(in[0]->data, CB_RGBA);
ImBuf *ibuf;
int newx, newy;
@@ -60,7 +61,10 @@ static void node_composit_exec_scale(void *data, bNode *node, bNodeStack **in, b
newx= MAX2((int)(in[1]->vec[0]*cbuf->x), 1);
newy= MAX2((int)(in[2]->vec[0]*cbuf->y), 1);
}
- else { /* CMP_SCALE_ABSOLUTE */
+ else if(node->custom1==CMP_SCALE_SCENEPERCENT) {
+ newx = cbuf->x * (rd->size / 100.0f);
+ newy = cbuf->y * (rd->size / 100.0f);
+ } else { /* CMP_SCALE_ABSOLUTE */
newx= (int)in[1]->vec[0];
newy= (int)in[2]->vec[0];
}
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
index 9bf9777ebe0..31afe74bd11 100644
--- a/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_texture.c
@@ -89,9 +89,21 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
/* outputs: value, color, normal */
if(node->id) {
+ RenderData *rd= data;
+ RenderResult *rr= RE_GetResult(RE_GetRender(G.scene->id.name)); /* G.scene is WEAK! */
+ short sizex, sizey;
+
/* first make the preview image */
CompBuf *prevbuf= alloc_compbuf(140, 140, CB_RGBA, 1); /* alloc */
+ if (rr) {
+ sizex = rr->rectx;
+ sizey = rr->recty;
+ } else {
+ sizex = rd->xsch;
+ sizey = rd->ysch;
+ }
+
prevbuf->rect_procedural= texture_procedural;
prevbuf->node= node;
composit1_pixel_processor(node, prevbuf, prevbuf, out[0]->vec, do_copy_rgba, CB_RGBA);
@@ -99,15 +111,15 @@ static void node_composit_exec_texture(void *data, bNode *node, bNodeStack **in,
free_compbuf(prevbuf);
if(out[0]->hasoutput) {
- CompBuf *stackbuf= alloc_compbuf(140, 140, CB_VAL, 1); /* alloc */
+ CompBuf *stackbuf= alloc_compbuf(sizex, sizey, CB_VAL, 1); /* alloc */
stackbuf->rect_procedural= texture_procedural;
stackbuf->node= node;
- out[0]->data= stackbuf;
+ out[0]->data= stackbuf;
}
if(out[1]->hasoutput) {
- CompBuf *stackbuf= alloc_compbuf(140, 140, CB_RGBA, 1); /* alloc */
+ CompBuf *stackbuf= alloc_compbuf(sizex, sizey, CB_RGBA, 1); /* alloc */
stackbuf->rect_procedural= texture_procedural;
stackbuf->node= node;
diff --git a/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c b/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
new file mode 100644
index 00000000000..cd617eca5c5
--- /dev/null
+++ b/source/blender/nodes/intern/CMP_nodes/CMP_tonemap.c
@@ -0,0 +1,173 @@
+/**
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Alfredo de Greef (eeshlo)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../CMP_util.h"
+
+static bNodeSocketType cmp_node_tonemap_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+static bNodeSocketType cmp_node_tonemap_out[]= {
+ { SOCK_RGBA, 0, "Image", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+
+static float avgLogLum(CompBuf *src, float* auto_key, float* Lav, float* Cav)
+{
+ float lsum = 0;
+ int p = src->x*src->y;
+ fRGB* bc = (fRGB*)src->rect;
+ float avl, maxl = -1e10f, minl = 1e10f;
+ const float sc = 1.f/(src->x*src->y);
+ *Lav = 0.f;
+ while (p--) {
+ float L = 0.212671f*bc[0][0] + 0.71516f*bc[0][1] + 0.072169f*bc[0][2];
+ *Lav += L;
+ fRGB_add(Cav, bc[0]);
+ lsum += logf(MAX2(L, 0.f) + 1e-5f);
+ maxl = (L > maxl) ? L : maxl;
+ minl = (L < minl) ? L : minl;
+ bc++;
+ }
+ *Lav *= sc;
+ fRGB_mult(Cav, sc);
+ maxl = logf(maxl + 1e-5f); minl = logf(minl + 1e-5f); avl = lsum*sc;
+ *auto_key = (maxl > minl) ? ((maxl - avl) / (maxl - minl)) : 1.f;
+ return expf(avl);
+}
+
+
+void static tonemap(NodeTonemap* ntm, CompBuf* dst, CompBuf* src)
+{
+ int x, y;
+ float dr, dg, db, al, igm = (ntm->gamma==0.f) ? 1 : (1.f / ntm->gamma);
+ float auto_key, Lav, Cav[3] = {0, 0, 0};
+
+ al = avgLogLum(src, &auto_key, &Lav, Cav);
+ al = (al == 0.f) ? 0.f : (ntm->key / al);
+
+ if (ntm->type == 1) {
+ // Reinhard/Devlin photoreceptor
+ const float f = expf(-ntm->f);
+ const float m = (ntm->m > 0.f) ? ntm->m : (0.3f + 0.7f*powf(auto_key, 1.4f));
+ const float ic = 1.f - ntm->c, ia = 1.f - ntm->a;
+ if (ntm->m == 0.f) printf("tonemap node, M: %g\n", m);
+ for (y=0; y<src->y; ++y) {
+ fRGB* sp = (fRGB*)&src->rect[y*src->x*src->type];
+ fRGB* dp = (fRGB*)&dst->rect[y*src->x*src->type];
+ for (x=0; x<src->x; ++x) {
+ const float L = 0.212671f*sp[x][0] + 0.71516f*sp[x][1] + 0.072169f*sp[x][2];
+ float I_l = sp[x][0] + ic*(L - sp[x][0]);
+ float I_g = Cav[0] + ic*(Lav - Cav[0]);
+ float I_a = I_l + ia*(I_g - I_l);
+ dp[x][0] /= (dp[x][0] + powf(f*I_a, m));
+ I_l = sp[x][1] + ic*(L - sp[x][1]);
+ I_g = Cav[1] + ic*(Lav - Cav[1]);
+ I_a = I_l + ia*(I_g - I_l);
+ dp[x][1] /= (dp[x][1] + powf(f*I_a, m));
+ I_l = sp[x][2] + ic*(L - sp[x][2]);
+ I_g = Cav[2] + ic*(Lav - Cav[2]);
+ I_a = I_l + ia*(I_g - I_l);
+ dp[x][2] /= (dp[x][2] + powf(f*I_a, m));
+ }
+ }
+ return;
+ }
+
+ // Reinhard simple photographic tm (simplest, not using whitepoint var)
+ for (y=0; y<src->y; y++) {
+ fRGB* sp = (fRGB*)&src->rect[y*src->x*src->type];
+ fRGB* dp = (fRGB*)&dst->rect[y*src->x*src->type];
+ for (x=0; x<src->x; x++) {
+ fRGB_copy(dp[x], sp[x]);
+ fRGB_mult(dp[x], al);
+ dr = dp[x][0] + ntm->offset;
+ dg = dp[x][1] + ntm->offset;
+ db = dp[x][2] + ntm->offset;
+ dp[x][0] /= ((dr == 0.f) ? 1.f : dr);
+ dp[x][1] /= ((dg == 0.f) ? 1.f : dg);
+ dp[x][2] /= ((db == 0.f) ? 1.f : db);
+ if (igm != 0.f) {
+ dp[x][0] = powf(MAX2(dp[x][0], 0.f), igm);
+ dp[x][1] = powf(MAX2(dp[x][1], 0.f), igm);
+ dp[x][2] = powf(MAX2(dp[x][2], 0.f), igm);
+ }
+ }
+ }
+}
+
+
+static void node_composit_exec_tonemap(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ CompBuf *new, *img = in[0]->data;
+
+ if ((img==NULL) || (out[0]->hasoutput==0)) return;
+
+ if (img->type != CB_RGBA)
+ new = typecheck_compbuf(img, CB_RGBA);
+ else
+ new = dupalloc_compbuf(img);
+
+ tonemap(node->storage, new, img);
+
+ out[0]->data = new;
+}
+
+static void node_composit_init_tonemap(bNode* node)
+{
+ NodeTonemap *ntm = MEM_callocN(sizeof(NodeTonemap), "node tonemap data");
+ ntm->type = 1;
+ ntm->key = 0.18;
+ ntm->offset = 1;
+ ntm->gamma = 1;
+ ntm->f = 0;
+ ntm->m = 0; // actual value is set according to input
+ // default a of 1 works well with natural HDR images, but not always so for cgi.
+ // Maybe should use 0 or at least lower initial value instead
+ ntm->a = 1;
+ ntm->c = 0;
+ node->storage = ntm;
+}
+
+bNodeType cmp_node_tonemap = {
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ CMP_NODE_TONEMAP,
+ /* name */ "Tonemap",
+ /* width+range */ 150, 120, 200,
+ /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ /* input sock */ cmp_node_tonemap_in,
+ /* output sock */ cmp_node_tonemap_out,
+ /* storage */ "NodeTonemap",
+ /* execfunc */ node_composit_exec_tonemap,
+ /* butfunc */ NULL,
+ /* initfunc */ node_composit_init_tonemap,
+ /* freestoragefunc */ node_free_standard_storage,
+ /* copystoragefunc */ node_copy_standard_storage,
+ /* id */ NULL
+};
diff --git a/source/blender/nodes/intern/CMP_nodes/Makefile b/source/blender/nodes/intern/CMP_nodes/Makefile
index f4de13f2825..036812548b4 100644
--- a/source/blender/nodes/intern/CMP_nodes/Makefile
+++ b/source/blender/nodes/intern/CMP_nodes/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd openbsd linux solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I../../../blenkernel
diff --git a/source/blender/nodes/intern/CMP_util.c b/source/blender/nodes/intern/CMP_util.c
index 0c6834315aa..eee33e33ff5 100644
--- a/source/blender/nodes/intern/CMP_util.c
+++ b/source/blender/nodes/intern/CMP_util.c
@@ -29,9 +29,6 @@
#include "CMP_util.h"
-
-
-
CompBuf *alloc_compbuf(int sizex, int sizey, int type, int alloc)
{
CompBuf *cbuf= MEM_callocN(sizeof(CompBuf), "compbuf");
@@ -577,3 +574,593 @@ void gamma_correct_compbuf(CompBuf *img, int inversed)
}
}
}
+
+
+
+
+/*
+ * 2D Fast Hartley Transform, used for convolution
+ */
+
+typedef float fREAL;
+
+// returns next highest power of 2 of x, as well it's log2 in L2
+static unsigned int nextPow2(unsigned int x, unsigned int* L2)
+{
+ unsigned int pw, x_notpow2 = x & (x-1);
+ *L2 = 0;
+ while (x>>=1) ++(*L2);
+ pw = 1 << (*L2);
+ if (x_notpow2) { (*L2)++; pw<<=1; }
+ return pw;
+}
+
+//------------------------------------------------------------------------------
+
+// from FXT library by Joerg Arndt, faster in order bitreversal
+// use: r = revbin_upd(r, h) where h = N>>1
+static unsigned int revbin_upd(unsigned int r, unsigned int h)
+{
+ while (!((r^=h)&h)) h >>= 1;
+ return r;
+}
+//------------------------------------------------------------------------------
+static void FHT(fREAL* data, unsigned int M, unsigned int inverse)
+{
+ double tt, fc, dc, fs, ds, a = M_PI;
+ fREAL t1, t2;
+ int n2, bd, bl, istep, k, len = 1 << M, n = 1;
+
+ int i, j = 0;
+ unsigned int Nh = len >> 1;
+ for (i=1;i<(len-1);++i) {
+ j = revbin_upd(j, Nh);
+ if (j>i) {
+ t1 = data[i];
+ data[i] = data[j];
+ data[j] = t1;
+ }
+ }
+
+ do {
+ fREAL* data_n = &data[n];
+
+ istep = n << 1;
+ for (k=0; k<len; k+=istep) {
+ t1 = data_n[k];
+ data_n[k] = data[k] - t1;
+ data[k] += t1;
+ }
+
+ n2 = n >> 1;
+ if (n>2) {
+ fc = dc = cos(a);
+ fs = ds = sqrt(1.0 - fc*fc); //sin(a);
+ bd = n-2;
+ for (bl=1; bl<n2; bl++) {
+ fREAL* data_nbd = &data_n[bd];
+ fREAL* data_bd = &data[bd];
+ for (k=bl; k<len; k+=istep) {
+ t1 = fc*data_n[k] + fs*data_nbd[k];
+ t2 = fs*data_n[k] - fc*data_nbd[k];
+ data_n[k] = data[k] - t1;
+ data_nbd[k] = data_bd[k] - t2;
+ data[k] += t1;
+ data_bd[k] += t2;
+ }
+ tt = fc*dc - fs*ds;
+ fs = fs*dc + fc*ds;
+ fc = tt;
+ bd -= 2;
+ }
+ }
+
+ if (n>1) {
+ for (k=n2; k<len; k+=istep) {
+ t1 = data_n[k];
+ data_n[k] = data[k] - t1;
+ data[k] += t1;
+ }
+ }
+
+ n = istep;
+ a *= 0.5;
+ } while (n<len);
+
+ if (inverse) {
+ fREAL sc = (fREAL)1 / (fREAL)len;
+ for (k=0; k<len; ++k)
+ data[k] *= sc;
+ }
+}
+//------------------------------------------------------------------------------
+/* 2D Fast Hartley Transform, Mx/My -> log2 of width/height,
+ nzp -> the row where zero pad data starts,
+ inverse -> see above */
+static void FHT2D(fREAL *data, unsigned int Mx, unsigned int My,
+ unsigned int nzp, unsigned int inverse)
+{
+ unsigned int i, j, Nx, Ny, maxy;
+ fREAL t;
+
+ Nx = 1 << Mx;
+ Ny = 1 << My;
+
+ // rows (forward transform skips 0 pad data)
+ maxy = inverse ? Ny : nzp;
+ for (j=0; j<maxy; ++j)
+ FHT(&data[Nx*j], Mx, inverse);
+
+ // transpose data
+ if (Nx==Ny) { // square
+ for (j=0; j<Ny; ++j)
+ for (i=j+1; i<Nx; ++i) {
+ unsigned int op = i + (j << Mx), np = j + (i << My);
+ t=data[op], data[op]=data[np], data[np]=t;
+ }
+ }
+ else { // rectangular
+ unsigned int k, Nym = Ny-1, stm = 1 << (Mx + My);
+ for (i=0; stm>0; i++) {
+ #define pred(k) (((k & Nym) << Mx) + (k >> My))
+ for (j=pred(i); j>i; j=pred(j));
+ if (j < i) continue;
+ for (k=i, j=pred(i); j!=i; k=j, j=pred(j), stm--)
+ { t=data[j], data[j]=data[k], data[k]=t; }
+ #undef pred
+ stm--;
+ }
+ }
+ // swap Mx/My & Nx/Ny
+ i = Nx, Nx = Ny, Ny = i;
+ i = Mx, Mx = My, My = i;
+
+ // now columns == transposed rows
+ for (j=0; j<Ny; ++j)
+ FHT(&data[Nx*j], Mx, inverse);
+
+ // finalize
+ for (j=0; j<=(Ny >> 1); j++) {
+ unsigned int jm = (Ny - j) & (Ny-1);
+ unsigned int ji = j << Mx;
+ unsigned int jmi = jm << Mx;
+ for (i=0; i<=(Nx >> 1); i++) {
+ unsigned int im = (Nx - i) & (Nx-1);
+ fREAL A = data[ji + i];
+ fREAL B = data[jmi + i];
+ fREAL C = data[ji + im];
+ fREAL D = data[jmi + im];
+ fREAL E = (fREAL)0.5*((A + D) - (B + C));
+ data[ji + i] = A - E;
+ data[jmi + i] = B + E;
+ data[ji + im] = C + E;
+ data[jmi + im] = D - E;
+ }
+ }
+
+}
+
+//------------------------------------------------------------------------------
+
+/* 2D convolution calc, d1 *= d2, M/N - > log2 of width/height */
+static void fht_convolve(fREAL* d1, fREAL* d2, unsigned int M, unsigned int N)
+{
+ fREAL a, b;
+ unsigned int i, j, k, L, mj, mL;
+ unsigned int m = 1 << M, n = 1 << N;
+ unsigned int m2 = 1 << (M-1), n2 = 1 << (N-1);
+ unsigned int mn2 = m << (N-1);
+
+ d1[0] *= d2[0];
+ d1[mn2] *= d2[mn2];
+ d1[m2] *= d2[m2];
+ d1[m2 + mn2] *= d2[m2 + mn2];
+ for (i=1; i<m2; i++) {
+ k = m - i;
+ a = d1[i]*d2[i] - d1[k]*d2[k];
+ b = d1[k]*d2[i] + d1[i]*d2[k];
+ d1[i] = (b + a)*(fREAL)0.5;
+ d1[k] = (b - a)*(fREAL)0.5;
+ a = d1[i + mn2]*d2[i + mn2] - d1[k + mn2]*d2[k + mn2];
+ b = d1[k + mn2]*d2[i + mn2] + d1[i + mn2]*d2[k + mn2];
+ d1[i + mn2] = (b + a)*(fREAL)0.5;
+ d1[k + mn2] = (b - a)*(fREAL)0.5;
+ }
+ for (j=1; j<n2; j++) {
+ L = n - j;
+ mj = j << M;
+ mL = L << M;
+ a = d1[mj]*d2[mj] - d1[mL]*d2[mL];
+ b = d1[mL]*d2[mj] + d1[mj]*d2[mL];
+ d1[mj] = (b + a)*(fREAL)0.5;
+ d1[mL] = (b - a)*(fREAL)0.5;
+ a = d1[m2 + mj]*d2[m2 + mj] - d1[m2 + mL]*d2[m2 + mL];
+ b = d1[m2 + mL]*d2[m2 + mj] + d1[m2 + mj]*d2[m2 + mL];
+ d1[m2 + mj] = (b + a)*(fREAL)0.5;
+ d1[m2 + mL] = (b - a)*(fREAL)0.5;
+ }
+ for (i=1; i<m2; i++) {
+ k = m - i;
+ for (j=1; j<n2; j++) {
+ L = n - j;
+ mj = j << M;
+ mL = L << M;
+ a = d1[i + mj]*d2[i + mj] - d1[k + mL]*d2[k + mL];
+ b = d1[k + mL]*d2[i + mj] + d1[i + mj]*d2[k + mL];
+ d1[i + mj] = (b + a)*(fREAL)0.5;
+ d1[k + mL] = (b - a)*(fREAL)0.5;
+ a = d1[i + mL]*d2[i + mL] - d1[k + mj]*d2[k + mj];
+ b = d1[k + mj]*d2[i + mL] + d1[i + mL]*d2[k + mj];
+ d1[i + mL] = (b + a)*(fREAL)0.5;
+ d1[k + mj] = (b - a)*(fREAL)0.5;
+ }
+ }
+}
+
+//------------------------------------------------------------------------------
+
+void convolve(CompBuf* dst, CompBuf* in1, CompBuf* in2)
+{
+ fREAL *data1, *data2, *fp;
+ unsigned int w2, h2, hw, hh, log2_w, log2_h;
+ fRGB wt, *colp;
+ int x, y, ch;
+ int xbl, ybl, nxb, nyb, xbsz, ybsz;
+ int in2done = 0;
+
+ CompBuf* rdst = alloc_compbuf(in1->x, in1->y, in1->type, 1);
+
+ // convolution result width & height
+ w2 = 2*in2->x - 1;
+ h2 = 2*in2->y - 1;
+ // FFT pow2 required size & log2
+ w2 = nextPow2(w2, &log2_w);
+ h2 = nextPow2(h2, &log2_h);
+
+ // alloc space
+ data1 = (fREAL*)MEM_callocN(3*w2*h2*sizeof(fREAL), "convolve_fast FHT data1");
+ data2 = (fREAL*)MEM_callocN(w2*h2*sizeof(fREAL), "convolve_fast FHT data2");
+
+ // normalize convolutor
+ wt[0] = wt[1] = wt[2] = 0.f;
+ for (y=0; y<in2->y; y++) {
+ colp = (fRGB*)&in2->rect[y*in2->x*in2->type];
+ for (x=0; x<in2->x; x++)
+ fRGB_add(wt, colp[x]);
+ }
+ if (wt[0] != 0.f) wt[0] = 1.f/wt[0];
+ if (wt[1] != 0.f) wt[1] = 1.f/wt[1];
+ if (wt[2] != 0.f) wt[2] = 1.f/wt[2];
+ for (y=0; y<in2->y; y++) {
+ colp = (fRGB*)&in2->rect[y*in2->x*in2->type];
+ for (x=0; x<in2->x; x++)
+ fRGB_colormult(colp[x], wt);
+ }
+
+ // copy image data, unpacking interleaved RGBA into separate channels
+ // only need to calc data1 once
+
+ // block add-overlap
+ hw = in2->x >> 1;
+ hh = in2->y >> 1;
+ xbsz = (w2 + 1) - in2->x;
+ ybsz = (h2 + 1) - in2->y;
+ nxb = in1->x / xbsz;
+ if (in1->x % xbsz) nxb++;
+ nyb = in1->y / ybsz;
+ if (in1->y % ybsz) nyb++;
+ for (ybl=0; ybl<nyb; ybl++) {
+ for (xbl=0; xbl<nxb; xbl++) {
+
+ // each channel one by one
+ for (ch=0; ch<3; ch++) {
+ fREAL* data1ch = &data1[ch*w2*h2];
+
+ // only need to calc fht data from in2 once, can re-use for every block
+ if (!in2done) {
+ // in2, channel ch -> data1
+ for (y=0; y<in2->y; y++) {
+ fp = &data1ch[y*w2];
+ colp = (fRGB*)&in2->rect[y*in2->x*in2->type];
+ for (x=0; x<in2->x; x++)
+ fp[x] = colp[x][ch];
+ }
+ }
+
+ // in1, channel ch -> data2
+ memset(data2, 0, w2*h2*sizeof(fREAL));
+ for (y=0; y<ybsz; y++) {
+ int yy = ybl*ybsz + y;
+ if (yy >= in1->y) continue;
+ fp = &data2[y*w2];
+ colp = (fRGB*)&in1->rect[yy*in1->x*in1->type];
+ for (x=0; x<xbsz; x++) {
+ int xx = xbl*xbsz + x;
+ if (xx >= in1->x) continue;
+ fp[x] = colp[xx][ch];
+ }
+ }
+
+ // forward FHT
+ // zero pad data start is different for each == height+1
+ if (!in2done) FHT2D(data1ch, log2_w, log2_h, in2->y+1, 0);
+ FHT2D(data2, log2_w, log2_h, in2->y+1, 0);
+
+ // FHT2D transposed data, row/col now swapped
+ // convolve & inverse FHT
+ fht_convolve(data2, data1ch, log2_h, log2_w);
+ FHT2D(data2, log2_h, log2_w, 0, 1);
+ // data again transposed, so in order again
+
+ // overlap-add result
+ for (y=0; y<(int)h2; y++) {
+ const int yy = ybl*ybsz + y - hh;
+ if ((yy < 0) || (yy >= in1->y)) continue;
+ fp = &data2[y*w2];
+ colp = (fRGB*)&rdst->rect[yy*in1->x*in1->type];
+ for (x=0; x<(int)w2; x++) {
+ const int xx = xbl*xbsz + x - hw;
+ if ((xx < 0) || (xx >= in1->x)) continue;
+ colp[xx][ch] += fp[x];
+ }
+ }
+
+ }
+ in2done = 1;
+ }
+ }
+
+ MEM_freeN(data2);
+ MEM_freeN(data1);
+ memcpy(dst->rect, rdst->rect, sizeof(float)*dst->x*dst->y*dst->type);
+ free_compbuf(rdst);
+}
+
+
+/*
+ *
+ * Utility functions qd_* should probably be intergrated better with other functions here.
+ *
+ */
+// sets fcol to pixelcolor at (x, y)
+void qd_getPixel(CompBuf* src, int x, int y, float* col)
+{
+ if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) {
+ float* bc = &src->rect[(x + y*src->x)*src->type];
+ col[0] = bc[0], col[1] = bc[1], col[2] = bc[2];
+ }
+ else col[0] = col[1] = col[2] = 0.f;
+}
+
+// sets pixel (x, y) to color col
+void qd_setPixel(CompBuf* src, int x, int y, float* col)
+{
+ if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) {
+ float* bc = &src->rect[(x + y*src->x)*src->type];
+ bc[0] = col[0], bc[1] = col[1], bc[2] = col[2];
+ }
+}
+
+// adds fcol to pixelcolor (x, y)
+void qd_addPixel(CompBuf* src, int x, int y, float* col)
+{
+ if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) {
+ float* bc = &src->rect[(x + y*src->x)*src->type];
+ bc[0] += col[0], bc[1] += col[1], bc[2] += col[2];
+ }
+}
+
+// multiplies pixel by factor value f
+void qd_multPixel(CompBuf* src, int x, int y, float f)
+{
+ if ((x >= 0) && (x < src->x) && (y >= 0) && (y < src->y)) {
+ float* bc = &src->rect[(x + y*src->x)*src->type];
+ bc[0] *= f, bc[1] *= f, bc[2] *= f;
+ }
+}
+
+// bilinear interpolation with wraparound
+void qd_getPixelLerpWrap(CompBuf* src, float u, float v, float* col)
+{
+ const float ufl = floor(u), vfl = floor(v);
+ const int nx = (int)ufl % src->x, ny = (int)vfl % src->y;
+ const int x1 = (nx < 0) ? (nx + src->x) : nx;
+ const int y1 = (ny < 0) ? (ny + src->y) : ny;
+ const int x2 = (x1 + 1) % src->x, y2 = (y1 + 1) % src->y;
+ const float* c00 = &src->rect[(x1 + y1*src->x)*src->type];
+ const float* c10 = &src->rect[(x2 + y1*src->x)*src->type];
+ const float* c01 = &src->rect[(x1 + y2*src->x)*src->type];
+ const float* c11 = &src->rect[(x2 + y2*src->x)*src->type];
+ const float uf = u - ufl, vf = v - vfl;
+ const float w00=(1.f-uf)*(1.f-vf), w10=uf*(1.f-vf), w01=(1.f-uf)*vf, w11=uf*vf;
+ col[0] = w00*c00[0] + w10*c10[0] + w01*c01[0] + w11*c11[0];
+ if (src->type != CB_VAL) {
+ col[1] = w00*c00[1] + w10*c10[1] + w01*c01[1] + w11*c11[1];
+ col[2] = w00*c00[2] + w10*c10[2] + w01*c01[2] + w11*c11[2];
+ col[3] = w00*c00[3] + w10*c10[3] + w01*c01[3] + w11*c11[3];
+ }
+}
+
+// as above, without wrap around
+void qd_getPixelLerp(CompBuf* src, float u, float v, float* col)
+{
+ const float ufl = floor(u), vfl = floor(v);
+ const int x1 = (int)ufl, y1 = (int)vfl;
+ const int x2 = (int)ceil(u), y2 = (int)ceil(v);
+ if ((x2 >= 0) && (y2 >= 0) && (x1 < src->x) && (y1 < src->y)) {
+ const float B[4] = {0,0,0,0};
+ const int ox1 = (x1 < 0), oy1 = (y1 < 0), ox2 = (x2 >= src->x), oy2 = (y2 >= src->y);
+ const float* c00 = (ox1 || oy1) ? B : &src->rect[(x1 + y1*src->x)*src->type];
+ const float* c10 = (ox2 || oy1) ? B : &src->rect[(x2 + y1*src->x)*src->type];
+ const float* c01 = (ox1 || oy2) ? B : &src->rect[(x1 + y2*src->x)*src->type];
+ const float* c11 = (ox2 || oy2) ? B : &src->rect[(x2 + y2*src->x)*src->type];
+ const float uf = u - ufl, vf = v - vfl;
+ const float w00=(1.f-uf)*(1.f-vf), w10=uf*(1.f-vf), w01=(1.f-uf)*vf, w11=uf*vf;
+ col[0] = w00*c00[0] + w10*c10[0] + w01*c01[0] + w11*c11[0];
+ if (src->type != CB_VAL) {
+ col[1] = w00*c00[1] + w10*c10[1] + w01*c01[1] + w11*c11[1];
+ col[2] = w00*c00[2] + w10*c10[2] + w01*c01[2] + w11*c11[2];
+ col[3] = w00*c00[3] + w10*c10[3] + w01*c01[3] + w11*c11[3];
+ }
+ }
+ else col[0] = col[1] = col[2] = col[3] = 0.f;
+}
+
+// as above, sampling only one channel
+void qd_getPixelLerpChan(CompBuf* src, float u, float v, int chan, float* out)
+{
+ const float ufl = floor(u), vfl = floor(v);
+ const int x1 = (int)ufl, y1 = (int)vfl;
+ const int x2 = (int)ceil(u), y2 = (int)ceil(v);
+ if (chan >= src->type) chan = 0;
+ if ((x2 >= 0) && (y2 >= 0) && (x1 < src->x) && (y1 < src->y)) {
+ const float B[4] = {0,0,0,0};
+ const int ox1 = (x1 < 0), oy1 = (y1 < 0), ox2 = (x2 >= src->x), oy2 = (y2 >= src->y);
+ const float* c00 = (ox1 || oy1) ? B : &src->rect[(x1 + y1*src->x)*src->type + chan];
+ const float* c10 = (ox2 || oy1) ? B : &src->rect[(x2 + y1*src->x)*src->type + chan];
+ const float* c01 = (ox1 || oy2) ? B : &src->rect[(x1 + y2*src->x)*src->type + chan];
+ const float* c11 = (ox2 || oy2) ? B : &src->rect[(x2 + y2*src->x)*src->type + chan];
+ const float uf = u - ufl, vf = v - vfl;
+ const float w00=(1.f-uf)*(1.f-vf), w10=uf*(1.f-vf), w01=(1.f-uf)*vf, w11=uf*vf;
+ out[0] = w00*c00[0] + w10*c10[0] + w01*c01[0] + w11*c11[0];
+ }
+ else *out = 0.f;
+}
+
+
+CompBuf* qd_downScaledCopy(CompBuf* src, int scale)
+{
+ CompBuf* fbuf;
+ if (scale <= 1)
+ fbuf = dupalloc_compbuf(src);
+ else {
+ int nw = src->x/scale, nh = src->y/scale;
+ if ((2*(src->x % scale)) > scale) nw++;
+ if ((2*(src->y % scale)) > scale) nh++;
+ fbuf = alloc_compbuf(nw, nh, src->type, 1);
+ {
+ int x, y, xx, yy, sx, sy, mx, my;
+ float colsum[4];
+ float fscale = 1.f/(float)(scale*scale);
+ for (y=0; y<nh; y++) {
+ fRGB* fcolp = (fRGB*)&fbuf->rect[y*fbuf->x*fbuf->type];
+ yy = y*scale;
+ my = yy + scale;
+ if (my > src->y) my = src->y;
+ for (x=0; x<nw; x++) {
+ xx = x*scale;
+ mx = xx + scale;
+ if (mx > src->x) mx = src->x;
+ colsum[0] = colsum[1] = colsum[2] = 0.f;
+ for (sy=yy; sy<my; sy++) {
+ fRGB* scolp = (fRGB*)&src->rect[sy*src->x*src->type];
+ for (sx=xx; sx<mx; sx++)
+ fRGB_add(colsum, scolp[sx]);
+ }
+ fRGB_mult(colsum, fscale);
+ fRGB_copy(fcolp[x], colsum);
+ }
+ }
+ }
+ }
+ return fbuf;
+}
+
+// fast g.blur, per channel
+// xy var. bits 1 & 2 ca be used to blur in x or y direction separately
+void IIR_gauss(CompBuf* src, float sigma, int chan, int xy)
+{
+ double q, q2, sc, cf[4], tsM[9], tsu[3], tsv[3];
+ float *X, *Y, *W;
+ int i, x, y, sz;
+
+ // <0.5 not valid, though can have a possibly useful sort of sharpening effect
+ if (sigma < 0.5) return;
+
+ if ((xy < 1) || (xy > 3)) xy = 3;
+
+ // see "Recursive Gabor Filtering" by Young/VanVliet
+ // all factors here in double.prec. Required, because for single.prec it seems to blow up if sigma > ~200
+ if (sigma >= 3.556)
+ q = 0.9804*(sigma - 3.556) + 2.5091;
+ else // sigma >= 0.5
+ q = (0.0561*sigma + 0.5784)*sigma - 0.2568;
+ q2 = q*q;
+ sc = (1.1668 + q)*(3.203729649 + (2.21566 + q)*q);
+ // no gabor filtering here, so no complex multiplies, just the regular coefs.
+ // all negated here, so as not to have to recalc Triggs/Sdika matrix
+ cf[1] = q*(5.788961737 + (6.76492 + 3.0*q)*q)/ sc;
+ cf[2] = -q2*(3.38246 + 3.0*q)/sc;
+ // 0 & 3 unchanged
+ cf[3] = q2*q/sc;
+ cf[0] = 1.0 - cf[1] - cf[2] - cf[3];
+
+ // Triggs/Sdika border corrections,
+ // it seems to work, not entirely sure if it is actually totally correct,
+ // Besides J.M.Geusebroek's anigauss.c (see http://www.science.uva.nl/~mark),
+ // found one other implementation by Cristoph Lampert,
+ // but neither seem to be quite the same, result seems to be ok sofar anyway.
+ // Extra scale factor here to not have to do it in filter,
+ // though maybe this had something to with the precision errors
+ sc = cf[0]/((1.0 + cf[1] - cf[2] + cf[3])*(1.0 - cf[1] - cf[2] - cf[3])*(1.0 + cf[2] + (cf[1] - cf[3])*cf[3]));
+ tsM[0] = sc*(-cf[3]*cf[1] + 1.0 - cf[3]*cf[3] - cf[2]);
+ tsM[1] = sc*((cf[3] + cf[1])*(cf[2] + cf[3]*cf[1]));
+ tsM[2] = sc*(cf[3]*(cf[1] + cf[3]*cf[2]));
+ tsM[3] = sc*(cf[1] + cf[3]*cf[2]);
+ tsM[4] = sc*(-(cf[2] - 1.0)*(cf[2] + cf[3]*cf[1]));
+ tsM[5] = sc*(-(cf[3]*cf[1] + cf[3]*cf[3] + cf[2] - 1.0)*cf[3]);
+ tsM[6] = sc*(cf[3]*cf[1] + cf[2] + cf[1]*cf[1] - cf[2]*cf[2]);
+ tsM[7] = sc*(cf[1]*cf[2] + cf[3]*cf[2]*cf[2] - cf[1]*cf[3]*cf[3] - cf[3]*cf[3]*cf[3] - cf[3]*cf[2] + cf[3]);
+ tsM[8] = sc*(cf[3]*(cf[1] + cf[3]*cf[2]));
+
+#define YVV(L)\
+{\
+ W[0] = cf[0]*X[0] + cf[1]*X[0] + cf[2]*X[0] + cf[3]*X[0];\
+ W[1] = cf[0]*X[1] + cf[1]*W[0] + cf[2]*X[0] + cf[3]*X[0];\
+ W[2] = cf[0]*X[2] + cf[1]*W[1] + cf[2]*W[0] + cf[3]*X[0];\
+ for (i=3; i<L; i++)\
+ W[i] = cf[0]*X[i] + cf[1]*W[i-1] + cf[2]*W[i-2] + cf[3]*W[i-3];\
+ tsu[0] = W[L-1] - X[L-1];\
+ tsu[1] = W[L-2] - X[L-1];\
+ tsu[2] = W[L-3] - X[L-1];\
+ tsv[0] = tsM[0]*tsu[0] + tsM[1]*tsu[1] + tsM[2]*tsu[2] + X[L-1];\
+ tsv[1] = tsM[3]*tsu[0] + tsM[4]*tsu[1] + tsM[5]*tsu[2] + X[L-1];\
+ tsv[2] = tsM[6]*tsu[0] + tsM[7]*tsu[1] + tsM[8]*tsu[2] + X[L-1];\
+ Y[L-1] = cf[0]*W[L-1] + cf[1]*tsv[0] + cf[2]*tsv[1] + cf[3]*tsv[2];\
+ Y[L-2] = cf[0]*W[L-2] + cf[1]*Y[L-1] + cf[2]*tsv[0] + cf[3]*tsv[1];\
+ Y[L-3] = cf[0]*W[L-3] + cf[1]*Y[L-2] + cf[2]*Y[L-1] + cf[3]*tsv[0];\
+ for (i=L-4; i>=0; i--)\
+ Y[i] = cf[0]*W[i] + cf[1]*Y[i+1] + cf[2]*Y[i+2] + cf[3]*Y[i+3];\
+}
+
+ // intermediate buffers
+ sz = MAX2(src->x, src->y);
+ X = MEM_callocN(sz*sizeof(float), "IIR_gauss X buf");
+ Y = MEM_callocN(sz*sizeof(float), "IIR_gauss Y buf");
+ W = MEM_callocN(sz*sizeof(float), "IIR_gauss W buf");
+ if (xy & 1) { // H
+ for (y=0; y<src->y; ++y) {
+ const int yx = y*src->x;
+ for (x=0; x<src->x; ++x)
+ X[x] = src->rect[(x + yx)*src->type + chan];
+ YVV(src->x);
+ for (x=0; x<src->x; ++x)
+ src->rect[(x + yx)*src->type + chan] = Y[x];
+ }
+ }
+ if (xy & 2) { // V
+ for (x=0; x<src->x; ++x) {
+ for (y=0; y<src->y; ++y)
+ X[y] = src->rect[(x + y*src->x)*src->type + chan];
+ YVV(src->y);
+ for (y=0; y<src->y; ++y)
+ src->rect[(x + y*src->x)*src->type + chan] = Y[y];
+ }
+ }
+
+ MEM_freeN(X);
+ MEM_freeN(W);
+ MEM_freeN(Y);
+#undef YVV
+}
+
diff --git a/source/blender/nodes/intern/CMP_util.h b/source/blender/nodes/intern/CMP_util.h
index 515980bc563..7cb10b75f3a 100644
--- a/source/blender/nodes/intern/CMP_util.h
+++ b/source/blender/nodes/intern/CMP_util.h
@@ -60,6 +60,7 @@
#include "BKE_texture.h"
#include "BKE_utildefines.h"
#include "BKE_library.h"
+#include "BKE_object.h"
#include "../CMP_node.h"
#include "node_util.h"
@@ -175,7 +176,46 @@ void do_hsva_to_rgba(bNode *node, float *out, float *in);
void do_ycca_to_rgba(bNode *node, float *out, float *in);
void gamma_correct_compbuf(CompBuf *img, int inversed);
+void convolve(CompBuf* dst, CompBuf* in1, CompBuf* in2);
extern void node_ID_title_cb(void *node_v, void *unused_v);
+
+/* utility functions used by glare, tonemap and lense distortion */
+/* soms macros for color handling */
+typedef float fRGB[4];
+/* clear color */
+#define fRGB_clear(c) { c[0]=c[1]=c[2]=0.f; }
+/* copy c2 to c1 */
+#define fRGB_copy(c1, c2) { c1[0]=c2[0]; c1[1]=c2[1]; c1[2]=c2[2]; }
+/* add c2 to c1 */
+#define fRGB_add(c1, c2) { c1[0]+=c2[0]; c1[1]+=c2[1]; c1[2]+=c2[2]; }
+/* subtract c2 from c1 */
+#define fRGB_sub(c1, c2) { c1[0]-=c2[0]; c1[1]-=c2[1]; c1[2]-=c2[2]; }
+/* multiply c by float value s */
+#define fRGB_mult(c, s) { c[0]*=s; c[1]*=s; c[2]*=s; }
+/* multiply c2 by s and add to c1 */
+#define fRGB_madd(c1, c2, s) { c1[0]+=c2[0]*s; c1[1]+=c2[1]*s; c1[2]+=c2[2]*s; }
+/* multiply c2 by color c1 */
+#define fRGB_colormult(c, cs) { c[0]*=cs[0]; c[1]*=cs[1]; c[2]*=cs[2]; }
+/* multiply c2 by color c3 and add to c1 */
+#define fRGB_colormadd(c1, c2, c3) { c1[0]+=c2[0]*c3[0]; c1[1]+=c2[1]*c3[1]; c1[2]+=c2[2]*c3[2]; }
+/* multiply c2 by color rgb, rgb as separate arguments */
+#define fRGB_rgbmult(c, r, g, b) { c[0]*=(r); c[1]*=(g); c[2]*=(b); }
+/* swap colors c1 & c2 */
+#define fRGB_swap(c1, c2) { float _t=c1[0]; c1[0]=c2[0]; c2[0]=_t;\
+ _t=c1[1]; c1[1]=c2[1]; c2[1]=_t;\
+ _t=c1[2]; c1[2]=c2[2]; c2[2]=_t; }
+
+void qd_getPixel(CompBuf* src, int x, int y, float* col);
+void qd_setPixel(CompBuf* src, int x, int y, float* col);
+void qd_addPixel(CompBuf* src, int x, int y, float* col);
+void qd_multPixel(CompBuf* src, int x, int y, float f);
+void qd_getPixelLerpWrap(CompBuf* src, float u, float v, float* col);
+void qd_getPixelLerp(CompBuf* src, float u, float v, float* col);
+void qd_getPixelLerpChan(CompBuf* src, float u, float v, int chan, float* out);
+CompBuf* qd_downScaledCopy(CompBuf* src, int scale);
+void IIR_gauss(CompBuf* src, float sigma, int chan, int xy);
+/* end utility funcs */
+
#endif
diff --git a/source/blender/nodes/intern/Makefile b/source/blender/nodes/intern/Makefile
index d4053f13f6e..bae9a8dcf1d 100644
--- a/source/blender/nodes/intern/Makefile
+++ b/source/blender/nodes/intern/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd openbsd linux solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I../../blenkernel
diff --git a/source/blender/nodes/intern/SHD_nodes/Makefile b/source/blender/nodes/intern/SHD_nodes/Makefile
index 46e297bce46..6344af4a5cb 100644
--- a/source/blender/nodes/intern/SHD_nodes/Makefile
+++ b/source/blender/nodes/intern/SHD_nodes/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd openbsd linux solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I../../../blenkernel
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c b/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
new file mode 100644
index 00000000000..8c07a2d1dc8
--- /dev/null
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_hueSatVal.c
@@ -0,0 +1,94 @@
+/**
+ *
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Juho Vepsäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../SHD_util.h"
+
+
+/* **************** Hue Saturation ******************** */
+static bNodeSocketType sh_node_hue_sat_in[]= {
+ { SOCK_VALUE, 1, "Hue", 0.5f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 1, "Saturation", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f},
+ { SOCK_VALUE, 1, "Value", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f},
+ { SOCK_VALUE, 1, "Fac", 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
+ { SOCK_RGBA, 1, "Color", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+static bNodeSocketType sh_node_hue_sat_out[]= {
+ { SOCK_RGBA, 0, "Color", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+/* note: it would be possible to use CMP version for both nodes */
+static void do_hue_sat_fac(bNode *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)) {
+ 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;
+ hsv[1]*= *sat;
+ if(hsv[1]>1.0) hsv[1]= 1.0; else if(hsv[1]<0.0) hsv[1]= 0.0;
+ hsv[2]*= *val;
+ if(hsv[2]>1.0) hsv[2]= 1.0; else if(hsv[2]<0.0) hsv[2]= 0.0;
+ hsv_to_rgb(hsv[0], hsv[1], hsv[2], col, col+1, col+2);
+
+ out[0]= mfac*in[0] + *fac*col[0];
+ out[1]= mfac*in[1] + *fac*col[1];
+ out[2]= mfac*in[2] + *fac*col[2];
+ }
+ else {
+ QUATCOPY(out, in);
+ }
+}
+
+static void node_shader_exec_hue_sat(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ do_hue_sat_fac(node, out[0]->vec, in[0]->vec, in[1]->vec, in[2]->vec, in[4]->vec, in[3]->vec);
+}
+
+bNodeType sh_node_hue_sat= {
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ SH_NODE_HUE_SAT,
+ /* name */ "Hue Saturation Value",
+ /* width+range */ 150, 80, 250,
+ /* class+opts */ NODE_CLASS_OP_COLOR, NODE_OPTIONS,
+ /* input sock */ sh_node_hue_sat_in,
+ /* output sock */ sh_node_hue_sat_out,
+ /* storage */ "",
+ /* execfunc */ node_shader_exec_hue_sat,
+ /* butfunc */ NULL,
+ /* initfunc */ NULL,
+ /* freestoragefunc */ NULL,
+ /* copystoragefunc */ NULL,
+ /* id */ NULL
+
+};
+
+
diff --git a/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c b/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
new file mode 100644
index 00000000000..2b52a8e2229
--- /dev/null
+++ b/source/blender/nodes/intern/SHD_nodes/SHD_sepcombRGB.c
@@ -0,0 +1,105 @@
+/**
+ *
+ *
+ * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2006 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Juho Vepsäläinen
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "../SHD_util.h"
+
+/* **************** SEPARATE RGBA ******************** */
+static bNodeSocketType sh_node_seprgb_in[]= {
+ { SOCK_RGBA, 1, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+static bNodeSocketType sh_node_seprgb_out[]= {
+ { SOCK_VALUE, 0, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 0, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 0, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_exec_seprgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ out[0]->vec[0] = in[0]->vec[0];
+ out[1]->vec[0] = in[0]->vec[1];
+ out[2]->vec[0] = in[0]->vec[2];
+}
+
+bNodeType sh_node_seprgb= {
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ SH_NODE_SEPRGB,
+ /* name */ "Separate RGB",
+ /* width+range */ 80, 40, 140,
+ /* class+opts */ NODE_CLASS_CONVERTOR, 0,
+ /* input sock */ sh_node_seprgb_in,
+ /* output sock */ sh_node_seprgb_out,
+ /* storage */ "",
+ /* execfunc */ node_shader_exec_seprgb,
+ /* butfunc */ NULL,
+ /* initfunc */ NULL,
+ /* freestoragefunc */ NULL,
+ /* copystoragefunc */ NULL,
+ /* id */ NULL
+
+};
+
+
+/* **************** COMBINE RGB ******************** */
+static bNodeSocketType sh_node_combrgb_in[]= {
+ { SOCK_VALUE, 1, "R", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 1, "G", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { SOCK_VALUE, 1, "B", 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+static bNodeSocketType sh_node_combrgb_out[]= {
+ { SOCK_RGBA, 0, "Image", 0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
+ { -1, 0, "" }
+};
+
+static void node_shader_exec_combrgb(void *data, bNode *node, bNodeStack **in, bNodeStack **out)
+{
+ out[0]->vec[0] = in[0]->vec[0];
+ out[0]->vec[1] = in[1]->vec[0];
+ out[0]->vec[2] = in[2]->vec[0];
+}
+
+bNodeType sh_node_combrgb= {
+ /* *next,*prev */ NULL, NULL,
+ /* type code */ SH_NODE_COMBRGB,
+ /* name */ "Combine RGB",
+ /* width+range */ 80, 40, 140,
+ /* class+opts */ NODE_CLASS_CONVERTOR, NODE_OPTIONS,
+ /* input sock */ sh_node_combrgb_in,
+ /* output sock */ sh_node_combrgb_out,
+ /* storage */ "",
+ /* execfunc */ node_shader_exec_combrgb,
+ /* butfunc */ NULL,
+ /* initfunc */ NULL,
+ /* freestoragefunc */ NULL,
+ /* copystoragefunc */ NULL,
+ /* id */ NULL
+
+};
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index d7db680a458..e4986727ab1 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -46,11 +46,39 @@ struct SpaceScript; /* DNA_space_types.h */
struct Script; /* BPI_script.h */
struct ScrArea; /* DNA_screen_types.h */
struct bScreen; /* DNA_screen_types.h */
-
+struct bConstraint; /* DNA_constraint_types.h */
+struct bPythonConstraint; /* DNA_constraint_types.h */
+struct bConstraintOb; /* DNA_constraint_types.h */
+struct bConstraintTarget; /* DNA_constraint_types.h*/
#ifdef __cplusplus
extern "C" {
#endif
+ /*These two next functions are important for making sure the Draw module
+ works correctly. Before calling any gui callback using the Draw module,
+ the following code must be executed:
+
+ if (some_drawspace_pylist) {
+ BPy_Set_DrawButtonsList(some_drawspace_pylist->but_refs);
+ BPy_Free_DrawButtonsList();
+ }
+ some_drawspace_pylist = PyList_New(0);
+ BPy_Set_DrawButtonsList(some_drawspace_pylist);
+
+ Also, BPy_Free_DrawButtonsList() must be called as necassary when a drawspace
+ with python callbacks is destroyed.
+
+ This is necassary to avoid blender buttons storing invalid pointers to freed
+ python data.*/
+ void BPy_Set_DrawButtonsList(void *list);
+ void BPy_Free_DrawButtonsList(void);
+
+ void BPY_pyconstraint_eval(struct bPythonConstraint *con, struct bConstraintOb *cob, struct ListBase *targets);
+ void BPY_pyconstraint_settings(void *arg1, void *arg2);
+ void BPY_pyconstraint_target(struct bPythonConstraint *con, struct bConstraintTarget *ct);
+ void BPY_pyconstraint_update(struct Object *owner, struct bConstraint *con);
+ int BPY_is_pyconstraint(struct Text *text);
+
void BPY_start_python( int argc, char **argv );
void BPY_end_python( void );
void BPY_post_start_python( void );
diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c
index f8a3c269292..9c8203cf3fd 100644
--- a/source/blender/python/BPY_interface.c
+++ b/source/blender/python/BPY_interface.c
@@ -40,13 +40,17 @@
#include "BIF_space.h"
#include "BIF_screen.h"
#include "BIF_toolbox.h"
+#include "BKE_action.h" /* for get_pose_channel() */
#include "BKE_library.h"
#include "BKE_object.h" /* during_scriptlink() */
#include "BKE_text.h"
+#include "BKE_constraint.h" /* for bConstraintOb */
+#include "BKE_idprop.h"
#include "DNA_curve_types.h" /* for struct IpoDriver */
#include "DNA_ID.h" /* ipo driver */
#include "DNA_object_types.h" /* ipo driver */
+#include "DNA_constraint_types.h" /* for pyconstraint */
#include "DNA_screen_types.h"
#include "DNA_userdef_types.h" /* for U.pythondir */
@@ -56,6 +60,7 @@
#include "BPI_script.h"
#include "BKE_global.h"
#include "BKE_main.h"
+#include "BKE_armature.h"
#include "api2_2x/EXPP_interface.h"
#include "api2_2x/constant.h"
#include "api2_2x/gen_utils.h"
@@ -66,8 +71,13 @@
#include "api2_2x/Draw.h"
#include "api2_2x/Object.h"
#include "api2_2x/Registry.h"
+#include "api2_2x/Pose.h"
#include "api2_2x/bpy.h" /* for the new "bpy" module */
+/*these next two are for pyconstraints*/
+#include "api2_2x/IDProp.h"
+#include "api2_2x/matrix.h"
+
/* for scriptlinks */
#include "DNA_lamp_types.h"
#include "DNA_camera_types.h"
@@ -86,7 +96,6 @@
/* for pydrivers (ipo drivers defined by one-line Python expressions) */
PyObject *bpy_pydriver_Dict = NULL;
-
/*
* set up a weakref list for Armatures
* creates list in __main__ module dict
@@ -160,6 +169,7 @@ PyObject *importText( char *name );
void init_ourImport( void );
void init_ourReload( void );
PyObject *blender_import( PyObject * self, PyObject * args );
+PyObject *RunPython2( Text * text, PyObject * globaldict, PyObject *localdict );
void BPY_Err_Handle( char *script_name );
@@ -265,25 +275,32 @@ void BPY_end_python( void )
void syspath_append( char *dirname )
{
- PyObject *mod_sys, *dict, *path, *dir;
-
+ PyObject *mod_sys= NULL, *dict= NULL, *path= NULL, *dir= NULL;
+ short ok=1;
PyErr_Clear( );
dir = Py_BuildValue( "s", dirname );
mod_sys = PyImport_ImportModule( "sys" ); /* new ref */
- dict = PyModule_GetDict( mod_sys ); /* borrowed ref */
- path = PyDict_GetItemString( dict, "path" ); /* borrowed ref */
-
- if( !PyList_Check( path ) )
- return;
+
+ if (mod_sys) {
+ dict = PyModule_GetDict( mod_sys ); /* borrowed ref */
+ path = PyDict_GetItemString( dict, "path" ); /* borrowed ref */
+ if ( !PyList_Check( path ) ) {
+ ok = 0;
+ }
+ } else {
+ /* cant get the sys module */
+ ok = 0;
+ }
- PyList_Append( path, dir );
+ if (ok && PyList_Append( path, dir ) != 0)
+ ok = 0; /* append failed */
- if( PyErr_Occurred( ) )
- Py_FatalError( "could not build sys.path" );
+ if( (ok==0) || PyErr_Occurred( ) )
+ Py_FatalError( "could import or build sys.path, can't continue" );
- Py_DECREF( mod_sys );
+ Py_XDECREF( mod_sys );
}
void init_syspath( int first_time )
@@ -462,10 +479,11 @@ void BPY_Err_Handle( char *script_name )
PyErr_Fetch( &exception, &err, &tb );
- if( !exception && !tb ) {
- printf( "FATAL: spurious exception\n" );
- return;
- }
+ if (!script_name) script_name = "untitled";
+ //if( !exception && !tb ) {
+ // printf( "FATAL: spurious exception\n" );
+ // return;
+ //}
strcpy( g_script_error.filename, script_name );
@@ -1138,6 +1156,511 @@ static float pydriver_error(IpoDriver *driver) {
return 0.0f;
}
+
+/********PyConstraints*********/
+
+/* This function checks whether a text-buffer is a PyConstraint candidate.
+ * It uses simple text parsing that could be easily confused!
+ */
+int BPY_is_pyconstraint(Text *text)
+{
+ TextLine *tline = text->lines.first;
+
+ if (tline && (tline->len > 10)) {
+ char *line = tline->line;
+
+ /* Expected format: #BPYCONSTRAINT
+ * The actual checks are forgiving, so slight variations also work. */
+ if (line && line[0] == '#' && strstr(line, "BPYCONSTRAINT")) return 1;
+ }
+ return 0;
+}
+
+/* This function is called to update PyConstraint data so that it is compatible with the script.
+ * Some of the allocating/freeing of memory for constraint targets occurs here, espcially
+ * if the number of targets changes.
+ */
+void BPY_pyconstraint_update(Object *owner, bConstraint *con)
+{
+ bPythonConstraint *data= con->data;
+
+ if (data->text) {
+ /* script does exist. it is assumed that this is a valid pyconstraint script */
+ PyObject *globals;
+ PyObject *retval, *gval;
+ int num, i;
+
+ /* clear the relevant flags first */
+ data->flag = 0;
+
+ /* populate globals dictionary */
+ globals = CreateGlobalDictionary();
+ retval = RunPython(data->text, globals);
+
+ if (retval == NULL) {
+ BPY_Err_Handle(data->text->id.name);
+ ReleaseGlobalDictionary(globals);
+ data->flag |= PYCON_SCRIPTERROR;
+ return;
+ }
+
+ Py_XDECREF(retval);
+ retval = NULL;
+
+ /* try to find NUM_TARGETS */
+ gval = PyDict_GetItemString(globals, "NUM_TARGETS");
+ if ( (gval) && (num= PyInt_AsLong(gval)) ) {
+ /* NUM_TARGETS is defined... and non-zero */
+ bConstraintTarget *ct;
+
+ /* check if it is valid (just make sure it is not negative)
+ * TODO: PyInt_AsLong may return -1 as sign of invalid input...
+ */
+ num = abs(num);
+ data->flag |= PYCON_USETARGETS;
+
+ /* check if the number of targets has changed */
+ if (num < data->tarnum) {
+ /* free a few targets */
+ num= data->tarnum - num;
+ for (i = 0; i < num; i++, data->tarnum--) {
+ ct= data->targets.last;
+ BLI_freelinkN(&data->targets, ct);
+ }
+ }
+ else if (num > data->tarnum) {
+ /* add a few targets */
+ num = num - data->tarnum;
+ for (i = 0; i < num; i++, data->tarnum++) {
+ ct= MEM_callocN(sizeof(bConstraintTarget), "PyConTarget");
+ BLI_addtail(&data->targets, ct);
+ }
+ }
+
+ /* validate targets */
+ con->flag &= ~CONSTRAINT_DISABLE;
+ for (ct= data->targets.first; ct; ct= ct->next) {
+ if (!exist_object(ct->tar)) {
+ ct->tar = NULL;
+ con->flag |= CONSTRAINT_DISABLE;
+ break;
+ }
+
+ if ((ct->tar == owner) && (ct->subtarget[0] != 0)) {
+ if (get_named_bone(get_armature(owner), ct->subtarget) == NULL) {
+ con->flag |= CONSTRAINT_DISABLE;
+ break;
+ }
+ }
+ }
+
+ /* clear globals */
+ ReleaseGlobalDictionary(globals);
+ }
+ else {
+ /* NUM_TARGETS is not defined or equals 0 */
+ ReleaseGlobalDictionary(globals);
+
+ /* free all targets */
+ BLI_freelistN(&data->targets);
+ data->tarnum = 0;
+ data->flag &= ~PYCON_USETARGETS;
+
+ return;
+ }
+ }
+ else {
+ /* no script, so clear any settings/data now */
+ data->tarnum = 0;
+ data->flag = 0;
+ con->flag &= ~CONSTRAINT_DISABLE;
+
+ BLI_freelistN(&data->targets);
+
+ /* supposedly this should still leave the base struct... */
+ IDP_FreeProperty(data->prop);
+ }
+}
+
+/* PyConstraints Evaluation Function (only called from evaluate_constraint)
+ * This function is responsible for modifying the ownermat that it is passed.
+ */
+void BPY_pyconstraint_eval(bPythonConstraint *con, bConstraintOb *cob, ListBase *targets)
+{
+ PyObject *srcmat, *tarmat, *tarmats, *idprop;
+ PyObject *globals;
+ PyObject *gval;
+ PyObject *pyargs, *retval;
+ bConstraintTarget *ct;
+ MatrixObject *retmat;
+ int row, col, index;
+
+ if (!con->text) return;
+ if (con->flag & PYCON_SCRIPTERROR) return;
+
+ globals = CreateGlobalDictionary();
+
+ /* wrap blender-data as PyObjects for evaluation
+ * - we expose the owner's matrix as pymatrix
+ * - id-properties are wrapped using the id-properties pyapi
+ * - targets are presented as a list of matrices
+ */
+ srcmat = newMatrixObject((float *)cob->matrix, 4, 4, Py_NEW);
+ idprop = BPy_Wrap_IDProperty(NULL, con->prop, NULL);
+
+ tarmats= PyList_New(con->tarnum);
+ for (ct=targets->first, index=0; ct; ct=ct->next, index++) {
+ tarmat = newMatrixObject((float *)ct->matrix, 4, 4, Py_NEW);
+ PyList_SetItem(tarmats, index, tarmat);
+ }
+
+
+/* since I can't remember what the armature weakrefs do, I'll just leave this here
+ commented out. This function was based on pydrivers, and it might still be relevent.
+ if( !setup_armature_weakrefs()){
+ fprintf( stderr, "Oops - weakref dict setup\n");
+ return result;
+ }
+*/
+
+ retval = RunPython(con->text, globals);
+
+ if (retval == NULL) {
+ BPY_Err_Handle(con->text->id.name);
+ con->flag |= PYCON_SCRIPTERROR;
+
+ /* free temp objects */
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+
+ ReleaseGlobalDictionary(globals);
+
+ return;
+ }
+
+ if (retval) {Py_XDECREF( retval );}
+ retval = NULL;
+
+ gval = PyDict_GetItemString(globals, "doConstraint");
+ if (!gval) {
+ printf("ERROR: no doConstraint function in constraint!\n");
+
+ /* free temp objects */
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+
+ ReleaseGlobalDictionary(globals);
+
+ return;
+ }
+
+ /* Now for the fun part! Try and find the functions we need. */
+ if (PyFunction_Check(gval)) {
+ pyargs = Py_BuildValue("OOO", srcmat, tarmats, idprop);
+ retval = PyObject_CallObject(gval, pyargs);
+ Py_XDECREF(pyargs);
+ }
+ else {
+ printf("ERROR: doConstraint is supposed to be a function!\n");
+ con->flag |= PYCON_SCRIPTERROR;
+
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+
+ ReleaseGlobalDictionary(globals);
+
+ return;
+ }
+
+ if (!retval) {
+ BPY_Err_Handle(con->text->id.name);
+ con->flag |= PYCON_SCRIPTERROR;
+
+ /* free temp objects */
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+
+ ReleaseGlobalDictionary(globals);
+
+ return;
+ }
+
+
+ if (!PyObject_TypeCheck(retval, &matrix_Type)) {
+ printf("Error in PyConstraint - doConstraint: Function not returning a matrix!\n");
+ con->flag |= PYCON_SCRIPTERROR;
+
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+ Py_XDECREF(retval);
+
+ ReleaseGlobalDictionary(globals);
+
+ return;
+ }
+
+ retmat = (MatrixObject *)retval;
+ if (retmat->rowSize != 4 || retmat->colSize != 4) {
+ printf("Error in PyConstraint - doConstraint: Matrix returned is the wrong size!\n");
+ con->flag |= PYCON_SCRIPTERROR;
+
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+ Py_XDECREF(retval);
+
+ ReleaseGlobalDictionary(globals);
+
+ return;
+ }
+
+ /* this is the reverse of code taken from newMatrix() */
+ for(row = 0; row < 4; row++) {
+ for(col = 0; col < 4; col++) {
+ cob->matrix[row][col] = retmat->contigPtr[row*4+col];
+ }
+ }
+
+ /* free temp objects */
+ Py_XDECREF(idprop);
+ Py_XDECREF(srcmat);
+ Py_XDECREF(tarmats);
+ Py_XDECREF(retval);
+
+ /* clear globals */
+ ReleaseGlobalDictionary(globals);
+}
+
+/* This evaluates the target matrix for each target the PyConstraint uses.
+ * NOTE: it only does one target at a time!
+ */
+void BPY_pyconstraint_target(bPythonConstraint *con, bConstraintTarget *ct)
+{
+ PyObject *tar, *subtar;
+ PyObject *tarmat, *idprop;
+ PyObject *globals;
+ PyObject *gval;
+ PyObject *pyargs, *retval;
+ MatrixObject *retmat;
+ int row, col;
+
+ if (!con->text) return;
+ if (con->flag & PYCON_SCRIPTERROR) return;
+ if (!ct) return;
+
+ globals = CreateGlobalDictionary();
+
+ tar = Object_CreatePyObject(ct->tar);
+ if ((ct->tar) && (ct->tar->type==OB_ARMATURE)) {
+ bPoseChannel *pchan;
+ pchan = get_pose_channel(ct->tar->pose, ct->subtarget);
+ subtar = PyPoseBone_FromPosechannel(pchan);
+ }
+ else
+ subtar = PyString_FromString(ct->subtarget);
+
+ tarmat = newMatrixObject((float *)ct->matrix, 4, 4, Py_NEW);
+ idprop = BPy_Wrap_IDProperty( NULL, con->prop, NULL);
+
+/* since I can't remember what the armature weakrefs do, I'll just leave this here
+ commented out. This function was based on pydrivers, and it might still be relevent.
+ if( !setup_armature_weakrefs()){
+ fprintf( stderr, "Oops - weakref dict setup\n");
+ return result;
+ }
+*/
+ retval = RunPython(con->text, globals);
+
+ if (retval == NULL) {
+ BPY_Err_Handle(con->text->id.name);
+ con->flag |= PYCON_SCRIPTERROR;
+
+ /* free temp objects */
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
+
+ ReleaseGlobalDictionary(globals);
+
+ return;
+ }
+
+ Py_XDECREF(retval);
+ retval = NULL;
+
+ /* try to find doTarget function to set the target matrix */
+ gval = PyDict_GetItemString(globals, "doTarget");
+ if (!gval) {
+ /* free temp objects */
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
+
+ ReleaseGlobalDictionary(globals);
+
+ return;
+ }
+
+ /* Now for the fun part! Try and find the functions we need.*/
+ if (PyFunction_Check(gval)) {
+ pyargs = Py_BuildValue("OOOO", tar, subtar, tarmat, idprop);
+ retval = PyObject_CallObject(gval, pyargs);
+ Py_XDECREF(pyargs);
+ }
+ else {
+ printf("ERROR: doTarget is supposed to be a function!\n");
+ con->flag |= PYCON_SCRIPTERROR;
+
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
+
+ ReleaseGlobalDictionary(globals);
+ return;
+ }
+
+ if (!retval) {
+ BPY_Err_Handle(con->text->id.name);
+ con->flag |= PYCON_SCRIPTERROR;
+
+
+ /* free temp objects */
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
+
+ ReleaseGlobalDictionary(globals);
+ return;
+ }
+
+ if (!PyObject_TypeCheck(retval, &matrix_Type)) {
+ con->flag |= PYCON_SCRIPTERROR;
+
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
+ Py_XDECREF(retval);
+
+ ReleaseGlobalDictionary(globals);
+ return;
+ }
+
+ retmat = (MatrixObject *)retval;
+ if (retmat->rowSize != 4 || retmat->colSize != 4) {
+ printf("Error in PyConstraint - doTarget: Matrix returned is the wrong size!\n");
+ con->flag |= PYCON_SCRIPTERROR;
+
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
+ Py_XDECREF(retval);
+
+ ReleaseGlobalDictionary(globals);
+ return;
+ }
+
+ /* this is the reverse of code taken from newMatrix() */
+ for(row = 0; row < 4; row++) {
+ for(col = 0; col < 4; col++) {
+ ct->matrix[row][col] = retmat->contigPtr[row*4+col];
+ }
+ }
+
+ /* free temp objects */
+ Py_XDECREF(tar);
+ Py_XDECREF(subtar);
+ Py_XDECREF(idprop);
+ Py_XDECREF(tarmat);
+ Py_XDECREF(retval);
+
+ /* clear globals */
+ ReleaseGlobalDictionary(globals);
+}
+
+/* This draws+handles the user-defined interface for editing pyconstraints idprops */
+void BPY_pyconstraint_settings(void *arg1, void *arg2)
+{
+ bPythonConstraint *con= (bPythonConstraint *)arg1;
+ PyObject *idprop;
+ PyObject *globals;
+ PyObject *gval;
+ PyObject *retval;
+
+ if (!con->text) return;
+ if (con->flag & PYCON_SCRIPTERROR) return;
+
+ globals = CreateGlobalDictionary();
+
+ idprop = BPy_Wrap_IDProperty( NULL, con->prop, NULL);
+
+ retval = RunPython(con->text, globals);
+
+ if (retval == NULL) {
+ BPY_Err_Handle(con->text->id.name);
+ ReleaseGlobalDictionary(globals);
+ con->flag |= PYCON_SCRIPTERROR;
+
+ /* free temp objects */
+ Py_XDECREF(idprop);
+ return;
+ }
+
+ if (retval) {Py_XDECREF( retval );}
+ retval = NULL;
+
+ gval = PyDict_GetItemString(globals, "getSettings");
+ if (!gval) {
+ printf("ERROR: no getSettings function in constraint!\n");
+
+ /* free temp objects */
+ ReleaseGlobalDictionary( globals );
+ Py_XDECREF(idprop);
+ return;
+ }
+
+ /* Now for the fun part! Try and find the functions we need. */
+ if (PyFunction_Check(gval)) {
+ retval = PyObject_CallFunction(gval, "O", idprop);
+ }
+ else {
+ printf("ERROR: getSettings is supposed to be a function!\n");
+ ReleaseGlobalDictionary( globals );
+
+ Py_XDECREF(idprop);
+ return;
+ }
+
+ if (!retval) {
+ BPY_Err_Handle(con->text->id.name);
+ con->flag |= PYCON_SCRIPTERROR;
+
+ /* free temp objects */
+ ReleaseGlobalDictionary(globals);
+ Py_XDECREF(idprop);
+ return;
+ }
+ else {
+ /* clear globals */
+ ReleaseGlobalDictionary(globals);
+
+ /* free temp objects */
+ Py_XDECREF(idprop);
+ Py_DECREF(retval);
+ return;
+ }
+}
+
/* Update function, it gets rid of pydrivers global dictionary, forcing
* BPY_pydriver_eval to recreate it. This function is used to force
* reloading the Blender text module "pydrivers.py", if available, so
@@ -1415,6 +1938,7 @@ void BPY_do_pyscript( ID * id, short event )
scriptlink = ID_getScriptlink( id );
if( scriptlink && scriptlink->totscript ) {
+ PyObject *value;
PyObject *dict;
PyObject *ret;
int index, during_slink = during_scriptlink( );
@@ -1422,7 +1946,18 @@ void BPY_do_pyscript( ID * id, short event )
/* invalid scriptlinks (new .blend was just loaded), return */
if( during_slink < 0 )
return;
-
+
+ if( !setup_armature_weakrefs()){
+ printf("Oops - weakref dict, this is a bug\n");
+ return;
+ }
+
+ value = GetPyObjectFromID( id );
+ if( !value){
+ printf("Oops - could not get a valid python object for Blender.link, this is a bug\n");
+ return;
+ }
+
/* tell we're running a scriptlink. The sum also tells if this script
* is running nested inside another. Blender.Load needs this info to
* avoid trouble with invalid slink pointers. */
@@ -1431,8 +1966,8 @@ void BPY_do_pyscript( ID * id, short event )
/* set globals in Blender module to identify scriptlink */
EXPP_dict_set_item_str( g_blenderdict, "bylink", EXPP_incr_ret_True() );
- EXPP_dict_set_item_str( g_blenderdict, "link",
- GetPyObjectFromID( id ) );
+
+ EXPP_dict_set_item_str( g_blenderdict, "link", value );
EXPP_dict_set_item_str( g_blenderdict, "event",
PyString_FromString( event_to_name
( event ) ) );
@@ -1650,6 +2185,11 @@ int BPY_do_spacehandlers( ScrArea *sa, unsigned short event,
disable_where_scriptlink( (short)during_slink );
}
+ if( !setup_armature_weakrefs()){
+ printf("Oops - weakref dict, this is a bug\n");
+ return 0;
+ }
+
/* set globals in Blender module to identify space handler scriptlink */
EXPP_dict_set_item_str(g_blenderdict, "bylink", EXPP_incr_ret_True());
/* unlike normal scriptlinks, here Blender.link is int (space event type) */
diff --git a/source/blender/python/SConscript b/source/blender/python/SConscript
index 59fc6746d86..9cd245394b0 100644
--- a/source/blender/python/SConscript
+++ b/source/blender/python/SConscript
@@ -20,4 +20,7 @@ if env['WITH_BF_QUICKTIME']==1:
if env['WITH_BF_OPENEXR'] == 1:
defs.append('WITH_OPENEXR')
+if env['WITH_BF_FFMPEG'] == 1:
+ defs.append('WITH_FFMPEG')
+
env.BlenderLib ( libname='blender_python', sources = Split(sources), includes = Split(incs), defines = defs, libtype=['core','game2'], priority = [60,115] )
diff --git a/source/blender/python/api2_2x/Armature.c b/source/blender/python/api2_2x/Armature.c
index c82597f9b00..6c22e831bd4 100644
--- a/source/blender/python/api2_2x/Armature.c
+++ b/source/blender/python/api2_2x/Armature.c
@@ -60,6 +60,10 @@ static const char sArmatureBadArgs[] = "ArmatureType - Bad Arguments: ";
static const char sModuleError[] = "Blender.Armature - Error: ";
static const char sModuleBadArgs[] = "Blender.Armature - Bad Arguments: ";
+PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject *weakref);
+/* python callable */
+PyObject * arm_weakref_callback_weakref_dealloc__pyfunc;
+
//################## BonesDict_Type (internal) ########################
/*This is an internal psuedo-dictionary type that allows for manipulation
* of bones inside of an armature. It is a subobject of armature.
@@ -118,18 +122,19 @@ static PyMethodDef BPy_BonesDict_methods[] = {
//-----------------(internal)
static int BoneMapping_Init(PyObject *dictionary, ListBase *bones){
Bone *bone = NULL;
- PyObject *py_bone = NULL, *str;
+ PyObject *py_bone = NULL;
for (bone = bones->first; bone; bone = bone->next){
py_bone = PyBone_FromBone(bone);
if (!py_bone)
return -1;
- str = PyString_FromString(bone->name);
- if(PyDict_SetItem(dictionary, str, py_bone) == -1)
+ if(PyDict_SetItemString(dictionary, bone->name, py_bone) == -1) {
+ /* unlikely but possible */
+ Py_DECREF(py_bone);
return -1;
+ }
- Py_DECREF(str);
Py_DECREF(py_bone);
if (bone->childbase.first)
BoneMapping_Init(dictionary, &bone->childbase);
@@ -139,18 +144,17 @@ static int BoneMapping_Init(PyObject *dictionary, ListBase *bones){
//-----------------(internal)
static int EditBoneMapping_Init(PyObject *dictionary, ListBase *editbones){
EditBone *editbone = NULL;
- PyObject *py_editbone = NULL, *str;
+ PyObject *py_editbone = NULL;
for (editbone = editbones->first; editbone; editbone = editbone->next){
py_editbone = PyEditBone_FromEditBone(editbone);
if (!py_editbone)
return -1;
- str = PyString_FromString(editbone->name);
- if(PyDict_SetItem(dictionary, str, py_editbone) == -1)
+ if(PyDict_SetItemString(dictionary, editbone->name, py_editbone) == -1) {
+ Py_DECREF(py_editbone);
return -1;
-
- Py_DECREF(str);
+ }
Py_DECREF(py_editbone);
}
return 0;
@@ -242,17 +246,14 @@ static PyObject *BonesDict_GetItem(BPy_BonesDict *self, PyObject* key)
value = PyDict_GetItem(self->bonesMap, key);
}
if(value == NULL){ /* item not found in dict. throw exception */
- char buffer[128];
- char* key_str;
- key_str = PyString_AsString( key );
- if( !key_str ){ /* key not a py string */
- key_str = ""; /* use empty string for printing */
+ char* key_str = PyString_AsString( key );
+ if (key_str) {
+ return EXPP_ReturnPyObjError(PyExc_KeyError, "bone key must be a string" );
+ } else {
+ char buffer[128];
+ PyOS_snprintf( buffer, sizeof(buffer), "bone %s not found", key_str);
+ return EXPP_ReturnPyObjError(PyExc_KeyError, buffer );
}
-
- PyOS_snprintf( buffer, sizeof(buffer),
- "bone %s not found", key_str);
-
- return EXPP_ReturnPyObjError(PyExc_KeyError, buffer );
}
return EXPP_incr_ret(value);
}
@@ -262,107 +263,96 @@ static int BonesDict_SetItem(BPy_BonesDict *self, PyObject *key, PyObject *value
{
BPy_EditBone *editbone_for_deletion;
struct EditBone *editbone = NULL;
- char *key_str = "";
-
- if (self->editmode_flag){
- //Get the key name
- if(key && PyString_Check(key)){
- key_str = PyString_AsString(key);
- }else{
- goto AttributeError;
- }
- //parse value for assignment
- if (value && EditBoneObject_Check(value)){
- //create a new editbone
- editbone = MEM_callocN(sizeof(EditBone), "eBone");
- BLI_strncpy(editbone->name, key_str, 32);
- unique_editbone_name(NULL, editbone->name);
- editbone->dist = ((BPy_EditBone*)value)->dist;
- editbone->ease1 = ((BPy_EditBone*)value)->ease1;
- editbone->ease2 = ((BPy_EditBone*)value)->ease2;
- editbone->flag = ((BPy_EditBone*)value)->flag;
- editbone->parent = ((BPy_EditBone*)value)->parent;
- editbone->rad_head = ((BPy_EditBone*)value)->rad_head;
- editbone->rad_tail = ((BPy_EditBone*)value)->rad_tail;
- editbone->roll = ((BPy_EditBone*)value)->roll;
- editbone->segments = ((BPy_EditBone*)value)->segments;
- editbone->weight = ((BPy_EditBone*)value)->weight;
- editbone->xwidth = ((BPy_EditBone*)value)->xwidth;
- editbone->zwidth = ((BPy_EditBone*)value)->zwidth;
- VECCOPY(editbone->head, ((BPy_EditBone*)value)->head);
- VECCOPY(editbone->tail, ((BPy_EditBone*)value)->tail);
-
- // FIXME, should be exposed via python. this avoids creating bones with no layers.
- editbone->layer= 1;
-
- //set object pointer
- ((BPy_EditBone*)value)->editbone = editbone;
-
- //fix the bone's head position if flags indicate that it is 'connected'
- if (editbone->flag & BONE_CONNECTED){
- if(!editbone->parent){
- ((BPy_EditBone*)value)->editbone = NULL;
- MEM_freeN(editbone);
- goto AttributeError3;
- }else{
- VECCOPY(editbone->head, editbone->parent->tail);
- }
- }
+ char *key_str = PyString_AsString(key);
- //set in editbonelist
- BLI_addtail(&self->editbones, editbone);
+ if (!self->editmode_flag)
+ return EXPP_intError(PyExc_AttributeError, "%s%s",
+ sBoneDictBadArgs, "You must call makeEditable() first");
+
+ if (!key_str)
+ return EXPP_intError(PyExc_AttributeError, "%s%s",
+ sBoneDictBadArgs, "The key must be the name of an editbone");
+
+ if (value && !EditBoneObject_Check(value))
+ return EXPP_intError(PyExc_AttributeError, "%s%s",
+ sBoneDictBadArgs, "Can only assign editbones as values");
+
+ //parse value for assignment
+ if (value){ /* we know this must be an editbone from the above check */
+ //create a new editbone
+ editbone = MEM_callocN(sizeof(EditBone), "eBone");
+ BLI_strncpy(editbone->name, key_str, 32);
+ unique_editbone_name(NULL, editbone->name);
+ editbone->dist = ((BPy_EditBone*)value)->dist;
+ editbone->ease1 = ((BPy_EditBone*)value)->ease1;
+ editbone->ease2 = ((BPy_EditBone*)value)->ease2;
+ editbone->flag = ((BPy_EditBone*)value)->flag;
+ editbone->parent = ((BPy_EditBone*)value)->parent;
+ editbone->rad_head = ((BPy_EditBone*)value)->rad_head;
+ editbone->rad_tail = ((BPy_EditBone*)value)->rad_tail;
+ editbone->roll = ((BPy_EditBone*)value)->roll;
+ editbone->segments = ((BPy_EditBone*)value)->segments;
+ editbone->weight = ((BPy_EditBone*)value)->weight;
+ editbone->xwidth = ((BPy_EditBone*)value)->xwidth;
+ editbone->zwidth = ((BPy_EditBone*)value)->zwidth;
+ VECCOPY(editbone->head, ((BPy_EditBone*)value)->head);
+ VECCOPY(editbone->tail, ((BPy_EditBone*)value)->tail);
+ editbone->layer= ((BPy_EditBone*)value)->layer;
+
+ //set object pointer
+ ((BPy_EditBone*)value)->editbone = editbone;
- //set the new editbone in the mapping
- if(PyDict_SetItemString(self->editbonesMap, key_str, value) == -1){
+ //fix the bone's head position if flags indicate that it is 'connected'
+ if (editbone->flag & BONE_CONNECTED){
+ if(!editbone->parent){
((BPy_EditBone*)value)->editbone = NULL;
- BLI_freelinkN(&self->editbones, editbone);
- goto RuntimeError;
- }
- }else if(!value){
- //they are trying to delete the bone using 'del'
- if(PyDict_GetItem(self->editbonesMap, key) != NULL){
- /*first kill the datastruct then remove the item from the dict
- and wait for GC to pick it up.
- We have to delete the datastruct here because the tp_dealloc
- doesn't handle it*/
- editbone_for_deletion = (BPy_EditBone*)PyDict_GetItem(self->editbonesMap, key);
- /*this is ugly but you have to set the parent to NULL for else
- editbones_to_armature will crash looking for this bone*/
- for (editbone = self->editbones.first; editbone; editbone = editbone->next){
- if (editbone->parent == editbone_for_deletion->editbone) {
- editbone->parent = NULL;
- /* remove the connected flag or else the 'root' ball
- * doesn't get drawn */
- editbone->flag &= ~BONE_CONNECTED;
- }
- }
- BLI_freelinkN(&self->editbones, editbone_for_deletion->editbone);
- if(PyDict_DelItem(self->editbonesMap, key) == -1)
- goto RuntimeError;
+ MEM_freeN(editbone);
+ return EXPP_intError(PyExc_AttributeError, "%s%s",
+ sBoneDictBadArgs, "The 'connected' flag is set but the bone has no parent!");
}else{
- goto KeyError;
+ VECCOPY(editbone->head, editbone->parent->tail);
}
}
- return 0;
- }else{
- goto AttributeError2;
- }
-KeyError:
-return EXPP_intError(PyExc_KeyError, "%s%s%s%s",
- sBoneDictError, "The key: ", key_str, " is not present in this dictionary!");
-RuntimeError:
- return EXPP_intError(PyExc_RuntimeError, "%s%s",
- sBoneDictError, "Unable to access dictionary!");
-AttributeError:
- return EXPP_intError(PyExc_AttributeError, "%s%s",
- sBoneDictBadArgs, "Expects EditboneType Object");
-AttributeError2:
- return EXPP_intError(PyExc_AttributeError, "%s%s",
- sBoneDictBadArgs, "You must call makeEditable() first");
-AttributeError3:
- return EXPP_intError(PyExc_AttributeError, "%s%s",
- sBoneDictBadArgs, "The 'connected' flag is set but the bone has no parent!");
+ //set in editbonelist
+ BLI_addtail(&self->editbones, editbone);
+
+ //set the new editbone in the mapping
+ if(PyDict_SetItemString(self->editbonesMap, key_str, value) == -1){
+ ((BPy_EditBone*)value)->editbone = NULL;
+ BLI_freelinkN(&self->editbones, editbone);
+ return EXPP_intError(PyExc_RuntimeError, "%s%s",
+ sBoneDictError, "Unable to access dictionary!");
+ }
+ }else {
+ //they are trying to delete the bone using 'del'
+ editbone_for_deletion = (BPy_EditBone*)PyDict_GetItem(self->editbonesMap, key);
+
+ if (!editbone_for_deletion)
+ return EXPP_intError(PyExc_KeyError, "%s%s%s%s",
+ sBoneDictError, "The key: ", key_str, " is not present in this dictionary!");
+
+ /*first kill the datastruct then remove the item from the dict
+ and wait for GC to pick it up.
+ We have to delete the datastruct here because the tp_dealloc
+ doesn't handle it*/
+
+ /*this is ugly but you have to set the parent to NULL for else
+ editbones_to_armature will crash looking for this bone*/
+ for (editbone = self->editbones.first; editbone; editbone = editbone->next){
+ if (editbone->parent == editbone_for_deletion->editbone) {
+ editbone->parent = NULL;
+ /* remove the connected flag or else the 'root' ball
+ * doesn't get drawn */
+ editbone->flag &= ~BONE_CONNECTED;
+ }
+ }
+ BLI_freelinkN(&self->editbones, editbone_for_deletion->editbone);
+ if(PyDict_DelItem(self->editbonesMap, key) == -1)
+ return EXPP_intError(PyExc_RuntimeError, "%s%s",
+ sBoneDictError, "Unable to access dictionary!");
+ }
+ return 0;
}
//------------------TYPE_OBJECT DEFINITION--------------------------
//Mapping Protocol
@@ -935,6 +925,36 @@ AttributeError:
return EXPP_intError(PyExc_AttributeError, "%s%s",
sArmatureError, "You are not allowed to change the .Bones attribute");
}
+
+//------------------------Bone.layerMask (get)
+static PyObject *Armature_getLayerMask(BPy_Armature *self)
+{
+ /* do this extra stuff because the short's bits can be negative values */
+ unsigned short laymask = 0;
+ laymask |= self->armature->layer;
+ return PyInt_FromLong((int)laymask);
+}
+//------------------------Bone.layerMask (set)
+static int Armature_setLayerMask(BPy_Armature *self, PyObject *value)
+{
+ int laymask;
+ if (!PyInt_Check(value)) {
+ return EXPP_ReturnIntError( PyExc_AttributeError,
+ "expected an integer (bitmask) as argument" );
+ }
+
+ laymask = PyInt_AsLong(value);
+
+ if (laymask <= 0 || laymask > (1<<16) - 1)
+ return EXPP_ReturnIntError( PyExc_AttributeError,
+ "bitmask must have from 1 up to 16 bits set");
+
+ self->armature->layer = 0;
+ self->armature->layer |= laymask;
+
+ return 0;
+}
+
//------------------TYPE_OBECT IMPLEMENTATION--------------------------
//------------------------tp_doc
//The __doc__ string for this object
@@ -982,6 +1002,8 @@ static PyGetSetDef BPy_Armature_getset[] = {
"Adds temporal IK chains while grabbing bones", NULL},
{"layers", (getter)Armature_getLayers, (setter)Armature_setLayers,
"List of layers for the armature", NULL},
+ {"layerMask", (getter)Armature_getLayerMask, (setter)Armature_setLayerMask,
+ "Layer bitmask", NULL },
{NULL, NULL, NULL, NULL, NULL}
};
//------------------------tp_new
@@ -1068,7 +1090,7 @@ static PyObject *Armature_repr(BPy_Armature *self)
static void Armature_dealloc(BPy_Armature * self)
{
if (self->weaklist != NULL)
- PyObject_ClearWeakRefs((PyObject *) self);
+ PyObject_ClearWeakRefs((PyObject *) self); /* this causes the weakref dealloc func to be called */
Py_DECREF(self->Bones);
PyObject_DEL( self );
@@ -1180,6 +1202,10 @@ static PyObject *M_Armature_Get(PyObject * self, PyObject * args)
data = G.main->armature.first; //get the first data ID from the armature library
while (data){
py_armature = Armature_CreatePyObject(data); //*new*
+ if (!py_armature) {
+ EXPP_decr2(seq, dict);
+ return NULL; /* error is set from Armature_CreatePyObject */
+ }
sprintf(buffer, "%s", ((bArmature*)data)->id.name +2);
if(PyDict_SetItemString(dict, buffer, py_armature) == -1){ //add to dictionary
EXPP_decr3(seq, dict, py_armature);
@@ -1197,6 +1223,11 @@ static PyObject *M_Armature_Get(PyObject * self, PyObject * args)
data = find_id("AR", name); //get data from library
if (data != NULL){
py_armature = Armature_CreatePyObject(data); //*new*
+ if (!py_armature) {
+ EXPP_decr2(seq, dict);
+ return NULL; /* error is set from Armature_CreatePyObject */
+ }
+
if(PyDict_SetItemString(dict, name, py_armature) == -1){ //add to dictionary
EXPP_decr3(seq, dict, py_armature);
goto RuntimeError;
@@ -1293,11 +1324,32 @@ PyObject *Armature_RebuildBones(PyObject *pyarmature)
{
return Armature_update((BPy_Armature*)pyarmature);
}
+
+/* internal func to remove weakref from weakref list */
+PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject *weakref)
+{
+ char *list_name = ARM_WEAKREF_LIST_NAME;
+ PyObject *maindict = NULL, *armlist = NULL;
+ int i;
+
+ maindict= PyModule_GetDict(PyImport_AddModule( "__main__"));
+ armlist = PyDict_GetItemString(maindict, list_name);
+ if( !armlist){
+ printf("Oops - update_armature_weakrefs()\n");
+ Py_RETURN_NONE;
+ }
+
+ i = PySequence_Index(armlist, weakref);
+ if (i==-1) {
+ printf("callback weakref internal error, weakref not in list\n\tthis should never happen.\n");
+ Py_RETURN_NONE;
+ }
+ PySequence_DelItem(armlist, i);
+ Py_RETURN_NONE;
+}
+
/*-----------------(internal)
- * Converts a bArmature to a PyArmature
- *
- * WARNING!!! - MEMORY LEAK HERE, Run in a loop and loose your ram.
- * cannot find out why but doesn't seem to be the weakref */
+ * Converts a bArmature to a PyArmature */
PyObject *Armature_CreatePyObject(struct bArmature *armature)
{
@@ -1305,7 +1357,28 @@ PyObject *Armature_CreatePyObject(struct bArmature *armature)
PyObject *maindict = NULL, *weakref = NULL;
PyObject *armlist = NULL; /* list of armature weak refs */
char *list_name = ARM_WEAKREF_LIST_NAME;
+ int i;
+ //put a weakreference in __main__
+ maindict= PyModule_GetDict(PyImport_AddModule( "__main__"));
+
+ armlist = PyDict_GetItemString(maindict, list_name);
+ if(!armlist) {
+ printf("Oops - can't get the armature weakref list\n");
+ goto RuntimeError;
+ }
+
+ /* see if we alredy have it */
+ for (i=0; i< PyList_Size(armlist); i++) {
+ py_armature = (BPy_Armature *)PyWeakref_GetObject(PyList_GET_ITEM(armlist, i));
+ if (BPy_Armature_Check(py_armature) && py_armature->armature == armature) {
+ Py_INCREF(py_armature);
+ /*printf("reusing armature\n");*/
+ return (PyObject *)py_armature;
+ }
+ }
+
+
/*create armature type*/
py_armature = PyObject_NEW( BPy_Armature, &Armature_Type );
@@ -1323,18 +1396,14 @@ PyObject *Armature_CreatePyObject(struct bArmature *armature)
printf("Oops - creating armature.bones\n");
goto RuntimeError;
}
-
- //put a weakreference in __main__
- maindict= PyModule_GetDict(PyImport_AddModule( "__main__"));
-
- armlist = PyDict_GetItemString(maindict, list_name);
- if( armlist){
- weakref = PyWeakref_NewProxy((PyObject*)py_armature, Py_None);
- if (PyList_Append(armlist, weakref) == -1){
- printf("Oops - list-append failed\n");
- goto RuntimeError;
- }
+
+ weakref = PyWeakref_NewRef((PyObject*)py_armature, arm_weakref_callback_weakref_dealloc__pyfunc);
+ if (PyList_Append(armlist, weakref) == -1){
+ printf("Oops - list-append failed\n");
+ goto RuntimeError;
}
+ Py_DECREF(weakref);
+
return (PyObject *) py_armature;
RuntimeError:
@@ -1353,7 +1422,10 @@ struct bArmature *Armature_FromPyObject( PyObject * py_obj )
return PyArmature_AsArmature((BPy_Armature*)py_obj);
}
-
+/* internal use only */
+static PyMethodDef bpy_arm_weakref_callback_weakref_dealloc[] = {
+ {"arm_weakref_callback_weakref_dealloc", arm_weakref_callback_weakref_dealloc, METH_O, ""}
+};
//-------------------MODULE INITIALIZATION--------------------------------
PyObject *Armature_Init(void)
@@ -1366,6 +1438,11 @@ PyObject *Armature_Init(void)
return EXPP_incr_ret(Py_None);
}
+ /* Weakref management - used for callbacks so we can
+ * tell when a callback has been removed that a UI button referenced */
+ arm_weakref_callback_weakref_dealloc__pyfunc = PyCFunction_New(bpy_arm_weakref_callback_weakref_dealloc, NULL);
+
+
//Register the module
module = Py_InitModule3("Blender.Armature", M_Armature_methods,
"The Blender Armature module");
diff --git a/source/blender/python/api2_2x/BGL.c b/source/blender/python/api2_2x/BGL.c
index b18b71b39fa..56cc8c63b5f 100644
--- a/source/blender/python/api2_2x/BGL.c
+++ b/source/blender/python/api2_2x/BGL.c
@@ -618,10 +618,12 @@ BGL_Wrap(2, PolygonMode, void, (GLenum, GLenum))
BGL_Wrap(2, PolygonOffset, void, (GLfloat, GLfloat))
BGL_Wrap(1, PolygonStipple, void, (GLubyteP))
BGL_Wrap(1, PopAttrib, void, (void))
+BGL_Wrap(1, PopClientAttrib, void, (void))
BGL_Wrap(1, PopMatrix, void, (void))
BGL_Wrap(1, PopName, void, (void))
BGL_Wrap(3, PrioritizeTextures, void, (GLsizei, GLuintP, GLclampfP))
BGL_Wrap(1, PushAttrib, void, (GLbitfield))
+BGL_Wrap(1, PushClientAttrib, void, (GLbitfield))
BGL_Wrap(1, PushMatrix, void, (void))
BGL_Wrap(1, PushName, void, (GLuint))
BGL_Wrap(2, RasterPos2d, void, (GLdouble, GLdouble))
@@ -951,10 +953,12 @@ static struct PyMethodDef BGL_methods[] = {
MethodDef(PolygonOffset),
MethodDef(PolygonStipple),
MethodDef(PopAttrib),
+ MethodDef(PopClientAttrib),
MethodDef(PopMatrix),
MethodDef(PopName),
MethodDef(PrioritizeTextures),
MethodDef(PushAttrib),
+ MethodDef(PushClientAttrib),
MethodDef(PushMatrix),
MethodDef(PushName),
MethodDef(RasterPos2d),
diff --git a/source/blender/python/api2_2x/BezTriple.c b/source/blender/python/api2_2x/BezTriple.c
index aabc33e6f95..2aa908ff2b0 100644
--- a/source/blender/python/api2_2x/BezTriple.c
+++ b/source/blender/python/api2_2x/BezTriple.c
@@ -350,7 +350,12 @@ static PyObject *BezTriple_getHide( BPy_BezTriple * self )
static int BezTriple_setHide( BPy_BezTriple * self, PyObject *value )
{
- if( PyObject_IsTrue( value ) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if( param )
self->beztriple->hide = IPO_BEZ;
else
self->beztriple->hide = 0;
@@ -368,6 +373,7 @@ static int BezTriple_setSelects( BPy_BezTriple * self, PyObject *args )
{
struct BezTriple *bezt = self->beztriple;
PyObject *ob1, *ob2, *ob3;
+ int param1, param2, param3;
/* only accept a sequence of three booleans */
@@ -379,15 +385,22 @@ static int BezTriple_setSelects( BPy_BezTriple * self, PyObject *args )
ob2 = PySequence_ITEM( args, 1 );
ob3 = PySequence_ITEM( args, 2 );
+ param1 = PyObject_IsTrue( ob1 );
+ param2 = PyObject_IsTrue( ob2 );
+ param3 = PyObject_IsTrue( ob3 );
+
+ if (param1==-1 || param2==-1 || param3==-1)
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected a sequence of 3 items: True/False or 0/1" );
+
/* assign the selects */
- bezt->f1 = ( char )PyObject_IsTrue( ob1 );
- bezt->f2 = ( char )PyObject_IsTrue( ob2 );
- bezt->f3 = ( char )PyObject_IsTrue( ob3 );
+ bezt->f1 = (char)param1;
+ bezt->f2 = (char)param2;
+ bezt->f3 = (char)param3;
Py_DECREF( ob1 );
Py_DECREF( ob2 );
Py_DECREF( ob3 );
-
return 0;
}
@@ -413,7 +426,7 @@ static int BezTriple_setHandles( BPy_BezTriple * self, PyObject *args )
ob1 = PySequence_ITEM( args, 0 );
ob2 = PySequence_ITEM( args, 1 );
- if( !PyInt_CheckExact( ob1 ) || !PyInt_CheckExact( ob2 ) ) {
+ if( !PyInt_Check( ob1 ) || !PyInt_Check( ob2 ) ) {
Py_DECREF( ob1 );
Py_DECREF( ob2 );
return EXPP_ReturnIntError( PyExc_TypeError,
diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c
index 6f652a92894..07384391d27 100644
--- a/source/blender/python/api2_2x/Blender.c
+++ b/source/blender/python/api2_2x/Blender.c
@@ -676,7 +676,7 @@ static PyObject *Blender_Save( PyObject * self, PyObject * args )
len = strlen( fname );
- if( len > FILE_MAXFILE )
+ if( len > FILE_MAXDIR + FILE_MAXFILE )
return EXPP_ReturnPyObjError( PyExc_AttributeError,
"filename is too long!" );
else if( BLI_exists( fname ) && !overwrite )
diff --git a/source/blender/python/api2_2x/Bone.c b/source/blender/python/api2_2x/Bone.c
index ad589615b7d..5eeb4bb2817 100644
--- a/source/blender/python/api2_2x/Bone.c
+++ b/source/blender/python/api2_2x/Bone.c
@@ -709,6 +709,40 @@ AttributeError:
sEditBoneError, ".tailRadius: ", "expects a float");
}
+//------------------------Bone.layerMask (get)
+static PyObject *EditBone_getLayerMask(BPy_EditBone *self)
+{
+ /* do this extra stuff because the short's bits can be negative values */
+ unsigned short laymask = 0;
+ if (self->editbone) laymask |= self->editbone->layer;
+ else laymask |= self->layer;
+ return PyInt_FromLong((int)laymask);
+}
+//------------------------Bone.layerMask (set)
+static int EditBone_setLayerMask(BPy_EditBone *self, PyObject *value)
+{
+ int laymask;
+ if (!PyInt_Check(value)) {
+ return EXPP_ReturnIntError( PyExc_AttributeError,
+ "expected an integer (bitmask) as argument" );
+ }
+
+ laymask = PyInt_AsLong(value);
+
+ if (laymask <= 0 || laymask > (1<<16) - 1)
+ return EXPP_ReturnIntError( PyExc_AttributeError,
+ "bitmask must have from 1 up to 16 bits set");
+
+ if (self->editbone) {
+ self->editbone->layer = 0;
+ self->editbone->layer |= laymask;
+ } else {
+ self->layer = 0;
+ self->layer |= laymask;
+ }
+
+ return 0;
+}
//------------------TYPE_OBECT IMPLEMENTATION--------------------------
//------------------------tp_methods
@@ -749,6 +783,8 @@ static PyGetSetDef BPy_EditBone_getset[] = {
"Set the radius of this bones tip", NULL},
{"headRadius", (getter)EditBone_getHeadRadius, (setter)EditBone_setHeadRadius,
"Set the radius of this bones head", NULL},
+ {"layerMask", (getter)EditBone_getLayerMask, (setter)EditBone_setLayerMask,
+ "Layer bitmask", NULL },
{NULL, NULL, NULL, NULL,NULL}
};
@@ -762,6 +798,14 @@ static PyObject *EditBone_repr(BPy_EditBone *self)
return PyString_FromFormat( "[EditBone \"%s\"]", self->name );
}
+static int EditBone_compare( BPy_EditBone * a, BPy_EditBone * b )
+{
+ /* if they are not wrapped, then they cant be the same */
+ if (a->editbone==NULL && b->editbone==NULL) return -1;
+ return ( a->editbone == b->editbone ) ? 0 : -1;
+}
+
+
//------------------------tp_doc
//The __doc__ string for this object
static char BPy_EditBone_doc[] = "This is an internal subobject of armature\
@@ -795,6 +839,7 @@ static PyObject *EditBone_new(PyTypeObject *type, PyObject *args, PyObject *kwds
py_editBone->rad_head= 0.10f;
py_editBone->rad_tail= 0.05f;
py_editBone->segments= 1;
+ py_editBone->layer= 1;
py_editBone->flag = 0;
py_editBone->roll = 0.0f;
@@ -829,7 +874,7 @@ PyTypeObject EditBone_Type = {
0, //tp_print
0, //tp_getattr
0, //tp_setattr
- 0, //tp_compare
+ (cmpfunc)EditBone_compare, //tp_compare
(reprfunc)EditBone_repr, //tp_repr
0, //tp_as_number
0, //tp_as_sequence
@@ -1195,6 +1240,35 @@ AttributeError:
sEditBoneError, ".headRadius: ", "expects a float");
}
+//------------------------Bone.layerMask (get)
+static PyObject *Bone_getLayerMask(BPy_Bone *self)
+{
+ /* do this extra stuff because the short's bits can be negative values */
+ unsigned short laymask = 0;
+ laymask |= self->bone->layer;
+ return PyInt_FromLong((int)laymask);
+}
+//------------------------Bone.layerMask (set)
+static int Bone_setLayerMask(BPy_Bone *self, PyObject *value)
+{
+ int laymask;
+ if (!PyInt_Check(value)) {
+ return EXPP_ReturnIntError( PyExc_AttributeError,
+ "expected an integer (bitmask) as argument" );
+ }
+
+ laymask = PyInt_AsLong(value);
+
+ if (laymask <= 0 || laymask > (1<<16) - 1)
+ return EXPP_ReturnIntError( PyExc_AttributeError,
+ "bitmask must have from 1 up to 16 bits set");
+
+ self->bone->layer = 0;
+ self->bone->layer |= laymask;
+
+ return 0;
+}
+
//------------------TYPE_OBECT IMPLEMENTATION--------------------------
//------------------------tp_methods
//This contains a list of all methods the object contains
@@ -1238,6 +1312,8 @@ static PyGetSetDef BPy_Bone_getset[] = {
"Set the radius of this bones tip", NULL},
{"headRadius", (getter)Bone_getHeadRadius, (setter)Bone_setHeadRadius,
"Set the radius of this bones head", NULL},
+ {"layerMask", (getter)Bone_getLayerMask, (setter)Bone_setLayerMask,
+ "Layer bitmask", NULL },
{NULL, NULL, NULL, NULL,NULL}
};
//------------------------tp_repr
@@ -1246,6 +1322,10 @@ static PyObject *Bone_repr(BPy_Bone *self)
{
return PyString_FromFormat( "[Bone \"%s\"]", self->bone->name );
}
+static int Bone_compare( BPy_Bone * a, BPy_Bone * b )
+{
+ return ( a->bone == b->bone ) ? 0 : -1;
+}
//------------------------tp_dealloc
//This tells how to 'tear-down' our object when ref count hits 0
static void Bone_dealloc(BPy_Bone * self)
@@ -1262,15 +1342,15 @@ static char BPy_Bone_doc[] = "This object wraps a Blender Boneobject.\n\
PyTypeObject Bone_Type = {
PyObject_HEAD_INIT(NULL) //tp_head
0, //tp_internal
- "Bone", //tp_name
- sizeof(BPy_Bone), //tp_basicsize
+ "Bone", //tp_name
+ sizeof(BPy_Bone), //tp_basicsize
0, //tp_itemsize
- (destructor)Bone_dealloc, //tp_dealloc
+ (destructor)Bone_dealloc, //tp_dealloc
0, //tp_print
0, //tp_getattr
0, //tp_setattr
- 0, //tp_compare
- (reprfunc) Bone_repr, //tp_repr
+ (cmpfunc) Bone_compare, //tp_compare
+ (reprfunc) Bone_repr, //tp_repr
0, //tp_as_number
0, //tp_as_sequence
0, //tp_as_mapping
diff --git a/source/blender/python/api2_2x/Bone.h b/source/blender/python/api2_2x/Bone.h
index c3f5de81714..aa076afbed7 100644
--- a/source/blender/python/api2_2x/Bone.h
+++ b/source/blender/python/api2_2x/Bone.h
@@ -65,6 +65,7 @@ typedef struct {
float rad_head;
float rad_tail;
short segments;
+ short layer;
} BPy_EditBone;
/*-------------------VISIBLE PROTOTYPES-------------------------*/
PyObject *PyBone_FromBone(struct Bone *bone);
diff --git a/source/blender/python/api2_2x/Camera.c b/source/blender/python/api2_2x/Camera.c
index a7ebd786158..f6b443e5d06 100644
--- a/source/blender/python/api2_2x/Camera.c
+++ b/source/blender/python/api2_2x/Camera.c
@@ -363,79 +363,37 @@ Camera *Camera_FromPyObject( PyObject * pyobj )
static PyObject *Camera_oldgetType( BPy_Camera * self )
{
- PyObject *attr = PyInt_FromLong( self->camera->type );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Camera.type attribute" );
+ return PyInt_FromLong( self->camera->type );
}
static PyObject *Camera_oldgetMode( BPy_Camera * self )
{
- PyObject *attr = PyInt_FromLong( self->camera->flag );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Camera.Mode attribute" );
+ return PyInt_FromLong( self->camera->flag );
}
static PyObject *Camera_oldgetLens( BPy_Camera * self )
{
- PyObject *attr = PyFloat_FromDouble( self->camera->lens );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Camera.lens attribute" );
+ return PyFloat_FromDouble( self->camera->lens );
}
static PyObject *Camera_oldgetScale( BPy_Camera * self )
{
- PyObject *attr = PyFloat_FromDouble( self->camera->ortho_scale );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Camera.scale attribute" );
+ return PyFloat_FromDouble( self->camera->ortho_scale );
}
static PyObject *Camera_oldgetClipStart( BPy_Camera * self )
{
- PyObject *attr = PyFloat_FromDouble( self->camera->clipsta );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Camera.clipStart attribute" );
+ return PyFloat_FromDouble( self->camera->clipsta );
}
static PyObject *Camera_oldgetClipEnd( BPy_Camera * self )
{
- PyObject *attr = PyFloat_FromDouble( self->camera->clipend );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Camera.clipEnd attribute" );
+ return PyFloat_FromDouble( self->camera->clipend );
}
static PyObject *Camera_oldgetDrawSize( BPy_Camera * self )
{
- PyObject *attr = PyFloat_FromDouble( self->camera->drawsize );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Camera.drawSize attribute" );
+ return PyFloat_FromDouble( self->camera->drawsize );
}
@@ -694,7 +652,7 @@ static int Camera_setMode( BPy_Camera * self, PyObject * value )
{
unsigned int flag = 0;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected an integer (bitmask) as argument" );
@@ -866,7 +824,12 @@ static PyObject *getFlagAttr( BPy_Camera *self, void *type )
static int setFlagAttr( BPy_Camera *self, PyObject *value, void *type )
{
- if (PyObject_IsTrue(value))
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if (param)
self->camera->flag |= (int)type;
else
self->camera->flag &= ~(int)type;
@@ -1077,11 +1040,11 @@ static PyObject *Camera_insertIpoKey( BPy_Camera * self, PyObject * args )
"expected int argument" ) );
if (key == IPOKEY_LENS){
- insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_LENS);
+ insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_LENS, 0);
}
else if (key == IPOKEY_CLIPPING){
- insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_STA);
- insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_END);
+ insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_STA, 0);
+ insertkey((ID *)self->camera, ID_CA, NULL, NULL, CAM_END, 0);
}
allspace(REMAKEIPO, 0);
diff --git a/source/blender/python/api2_2x/Constraint.c b/source/blender/python/api2_2x/Constraint.c
index 55e7e480d6b..749e05426bd 100644
--- a/source/blender/python/api2_2x/Constraint.c
+++ b/source/blender/python/api2_2x/Constraint.c
@@ -25,7 +25,7 @@
*
* This is a new part of Blender.
*
- * Contributor(s): Joseph Gilbert, Ken Hughes
+ * Contributor(s): Joseph Gilbert, Ken Hughes, Joshua Leung
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
@@ -36,12 +36,14 @@
#include "DNA_effect_types.h"
#include "DNA_vec_types.h"
#include "DNA_curve_types.h"
+#include "DNA_text_types.h"
#include "BKE_main.h"
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_action.h"
#include "BKE_armature.h"
+#include "BKE_constraint.h"
#include "BLI_blenlib.h"
#include "BIF_editconstraint.h"
#include "BSE_editipo.h"
@@ -50,14 +52,22 @@
#include "blendef.h"
#include "mydevice.h"
+#include "IDProp.h"
#include "Object.h"
#include "NLA.h"
+#include "Text.h"
#include "gen_utils.h"
enum constraint_constants {
EXPP_CONSTR_XROT = 0,
EXPP_CONSTR_YROT = 1,
EXPP_CONSTR_ZROT = 2,
+ EXPP_CONSTR_XSIZE = 10,
+ EXPP_CONSTR_YSIZE = 11,
+ EXPP_CONSTR_ZSIZE = 12,
+ EXPP_CONSTR_XLOC = 20,
+ EXPP_CONSTR_YLOC = 21,
+ EXPP_CONSTR_ZLOC = 22,
EXPP_CONSTR_MAXX = TRACK_X,
EXPP_CONSTR_MAXY = TRACK_Y,
@@ -77,7 +87,6 @@ enum constraint_constants {
EXPP_CONSTR_USETIP,
EXPP_CONSTR_ACTION,
- EXPP_CONSTR_LOCAL,
EXPP_CONSTR_START,
EXPP_CONSTR_END,
EXPP_CONSTR_MIN,
@@ -116,6 +125,8 @@ enum constraint_constants {
EXPP_CONSTR_LIMYROT = LIMIT_YROT,
EXPP_CONSTR_LIMZROT = LIMIT_ZROT,
+ EXPP_CONSTR_CLAMPCYCLIC,
+
EXPP_CONSTR_XMIN,
EXPP_CONSTR_XMAX,
EXPP_CONSTR_YMIN,
@@ -123,9 +134,31 @@ enum constraint_constants {
EXPP_CONSTR_ZMIN,
EXPP_CONSTR_ZMAX,
- EXPP_CONSTR_LIMLOCALBONE,
- EXPP_CONSTR_LIMLOCALNOPAR,
+ EXPP_CONSTR_SCRIPT,
+ EXPP_CONSTR_PROPS,
+
+ EXPP_CONSTR_FROM,
+ EXPP_CONSTR_TO,
+ EXPP_CONSTR_EXPO,
+ EXPP_CONSTR_FROMMINX,
+ EXPP_CONSTR_FROMMAXX,
+ EXPP_CONSTR_FROMMINY,
+ EXPP_CONSTR_FROMMAXY,
+ EXPP_CONSTR_FROMMINZ,
+ EXPP_CONSTR_FROMMAXZ,
+ EXPP_CONSTR_TOMINX,
+ EXPP_CONSTR_TOMAXX,
+ EXPP_CONSTR_TOMINY,
+ EXPP_CONSTR_TOMAXY,
+ EXPP_CONSTR_TOMINZ,
+ EXPP_CONSTR_TOMAXZ,
+ EXPP_CONSTR_MAPX,
+ EXPP_CONSTR_MAPY,
+ EXPP_CONSTR_MAPZ,
+ EXPP_CONSTR_OWNSPACE,
+ EXPP_CONSTR_TARSPACE,
+
EXPP_CONSTR_RB_TYPE,
EXPP_CONSTR_RB_BALL,
EXPP_CONSTR_RB_HINGE,
@@ -376,12 +409,13 @@ static PyObject *Constraint_getType( BPy_Constraint * self )
*/
static PyObject *Constraint_insertKey( BPy_Constraint * self, PyObject * value )
{
+ bConstraint *con = self->con;
+ Object *ob = self->obj;
+ bPoseChannel *pchan = self->pchan;
IpoCurve *icu;
float cfra = (float)PyFloat_AsDouble(value);
char actname[32] = "";
- Object *ob = self->obj;
- bConstraint *con = self->con;
-
+
if( !self->con )
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"This constraint has been removed!" );
@@ -390,9 +424,22 @@ static PyObject *Constraint_insertKey( BPy_Constraint * self, PyObject * value )
if( PyFloat_Check(value) )
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expected a float argument" );
-
- /* constraint_active_func(ob_v, con_v); */
- get_constraint_ipo_context( ob, actname );
+
+ /* find actname for locating that action-channel that a constraint channel should be added to */
+ if (ob) {
+ if (pchan) {
+ /* actname is the name of the pchan that this constraint belongs to */
+ BLI_strncpy(actname, pchan->name, 32);
+ }
+ else {
+ /* hardcoded achan name -> "Object" (this may change in future) */
+ strcpy(actname, "Object");
+ }
+ }
+ else {
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "constraint doesn't belong to anything" );
+ }
icu= verify_ipocurve((ID *)ob, ID_CO, actname, con->name, CO_ENFORCE);
if (!icu)
@@ -400,13 +447,130 @@ static PyObject *Constraint_insertKey( BPy_Constraint * self, PyObject * value )
"cannot get a curve from this IPO, may be using libdata" );
if( ob->action )
- insert_vert_ipo( icu, get_action_frame(ob, cfra), con->enforce);
+ insert_vert_icu( icu, get_action_frame(ob, cfra), con->enforce, 0);
else
- insert_vert_ipo( icu, cfra, con->enforce);
+ insert_vert_icu( icu, cfra, con->enforce, 0);
Py_RETURN_NONE;
}
+/******************************************************************************/
+/* Constraint Space Conversion get/set procedures */
+/* - These are called before/instead of individual constraint */
+/* get/set procedures when OWNERSPACE or TARGETSPACE are chosen */
+/* - They are only called from Constraint_g/setData */
+/******************************************************************************/
+
+static PyObject *constspace_getter( BPy_Constraint * self, int type )
+{
+ bConstraint *con= (bConstraint *)(self->con);
+
+ /* depends on type being asked for
+ * NOTE: not all constraints support all space types
+ */
+ if (type == EXPP_CONSTR_OWNSPACE) {
+ switch (con->type) {
+ /* all of these support this... */
+ case CONSTRAINT_TYPE_PYTHON:
+ case CONSTRAINT_TYPE_LOCLIKE:
+ case CONSTRAINT_TYPE_ROTLIKE:
+ case CONSTRAINT_TYPE_SIZELIKE:
+ case CONSTRAINT_TYPE_TRACKTO:
+ case CONSTRAINT_TYPE_LOCLIMIT:
+ case CONSTRAINT_TYPE_ROTLIMIT:
+ case CONSTRAINT_TYPE_SIZELIMIT:
+ case CONSTRAINT_TYPE_TRANSFORM:
+ return PyInt_FromLong( (long)con->ownspace );
+ }
+ }
+ else if (type == EXPP_CONSTR_TARSPACE) {
+ switch (con->type) {
+ /* all of these support this... */
+ case CONSTRAINT_TYPE_PYTHON:
+ case CONSTRAINT_TYPE_ACTION:
+ case CONSTRAINT_TYPE_LOCLIKE:
+ case CONSTRAINT_TYPE_ROTLIKE:
+ case CONSTRAINT_TYPE_SIZELIKE:
+ case CONSTRAINT_TYPE_TRACKTO:
+ case CONSTRAINT_TYPE_TRANSFORM:
+ return PyInt_FromLong( (long)con->tarspace );
+ }
+ }
+
+ /* raise error if failed */
+ return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
+}
+
+static int constspace_setter( BPy_Constraint *self, int type, PyObject *value )
+{
+ bConstraint *con= (bConstraint *)(self->con);
+
+ /* depends on type being asked for
+ * NOTE: not all constraints support all space types
+ */
+ if (type == EXPP_CONSTR_OWNSPACE) {
+ switch (con->type) {
+ /* all of these support this... */
+ case CONSTRAINT_TYPE_PYTHON:
+ case CONSTRAINT_TYPE_LOCLIKE:
+ case CONSTRAINT_TYPE_ROTLIKE:
+ case CONSTRAINT_TYPE_SIZELIKE:
+ case CONSTRAINT_TYPE_TRACKTO:
+ case CONSTRAINT_TYPE_LOCLIMIT:
+ case CONSTRAINT_TYPE_ROTLIMIT:
+ case CONSTRAINT_TYPE_SIZELIMIT:
+ case CONSTRAINT_TYPE_TRANSFORM:
+ {
+ /* only copy depending on ownertype */
+ if (self->pchan) {
+ return EXPP_setIValueClamped( value, &con->ownspace,
+ CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_PARLOCAL, 'h' );
+ }
+ else {
+ return EXPP_setIValueClamped( value, &con->ownspace,
+ CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL, 'h' );
+ }
+ }
+ break;
+ }
+ }
+ else if (type == EXPP_CONSTR_TARSPACE) {
+ switch (con->type) {
+ /* all of these support this... */
+ case CONSTRAINT_TYPE_PYTHON:
+ case CONSTRAINT_TYPE_ACTION:
+ case CONSTRAINT_TYPE_LOCLIKE:
+ case CONSTRAINT_TYPE_ROTLIKE:
+ case CONSTRAINT_TYPE_SIZELIKE:
+ case CONSTRAINT_TYPE_TRACKTO:
+ case CONSTRAINT_TYPE_TRANSFORM:
+ {
+ Object *tar;
+ char *subtarget;
+
+ // FIXME!!!
+ //tar= get_constraint_target(con, &subtarget);
+ tar = NULL;
+ subtarget = NULL;
+
+ /* only copy depending on target-type */
+ if (tar && subtarget[0]) {
+ return EXPP_setIValueClamped( value, &con->tarspace,
+ CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_PARLOCAL, 'h' );
+ }
+ else if (tar) {
+ return EXPP_setIValueClamped( value, &con->tarspace,
+ CONSTRAINT_SPACE_WORLD, CONSTRAINT_SPACE_LOCAL, 'h' );
+ }
+ }
+ break;
+ }
+ }
+
+ /* raise error if failed */
+ return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
+}
+
/*****************************************************************************/
/* Specific constraint get/set procedures */
/*****************************************************************************/
@@ -492,8 +656,6 @@ static PyObject *action_getter( BPy_Constraint * self, int type )
return PyString_FromString( con->subtarget );
case EXPP_CONSTR_ACTION:
return Action_CreatePyObject( con->act );
- case EXPP_CONSTR_LOCAL:
- return PyBool_FromLong( (long)( con->local & SELECT ) );
case EXPP_CONSTR_START:
return PyInt_FromLong( (long)con->start );
case EXPP_CONSTR_END:
@@ -540,19 +702,27 @@ static int action_setter( BPy_Constraint *self, int type, PyObject *value )
con->act = act;
return 0;
}
- case EXPP_CONSTR_LOCAL:
- return EXPP_setBitfield( value, &con->local, SELECT, 'h' );
case EXPP_CONSTR_START:
return EXPP_setIValueClamped( value, &con->start, 1, MAXFRAME, 'h' );
case EXPP_CONSTR_END:
return EXPP_setIValueClamped( value, &con->end, 1, MAXFRAME, 'h' );
case EXPP_CONSTR_MIN:
- return EXPP_setFloatClamped( value, &con->min, -180.0, 180.0 );
+ if (con->type < 10)
+ return EXPP_setFloatClamped( value, &con->min, -180.0, 180.0 );
+ else if (con->type < 20)
+ return EXPP_setFloatClamped( value, &con->min, 0.0001, 1000.0 );
+ else
+ return EXPP_setFloatClamped( value, &con->min, -1000.0, 1000.0 );
case EXPP_CONSTR_MAX:
- return EXPP_setFloatClamped( value, &con->max, -180.0, 180.0 );
+ if (con->type < 10)
+ return EXPP_setFloatClamped( value, &con->max, -180.0, 180.0 );
+ else if (con->type < 20)
+ return EXPP_setFloatClamped( value, &con->max, 0.0001, 1000.0 );
+ else
+ return EXPP_setFloatClamped( value, &con->max, -1000.0, 1000.0 );
case EXPP_CONSTR_KEYON:
return EXPP_setIValueRange( value, &con->type,
- EXPP_CONSTR_XROT, EXPP_CONSTR_ZROT, 'h' );
+ EXPP_CONSTR_XROT, EXPP_CONSTR_ZLOC, 'h' );
default:
return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
}
@@ -736,6 +906,8 @@ static PyObject *clampto_getter( BPy_Constraint * self, int type )
return Object_CreatePyObject( con->tar );
case EXPP_CONSTR_CLAMP:
return PyInt_FromLong( (long)con->flag );
+ case EXPP_CONSTR_CLAMPCYCLIC:
+ return PyBool_FromLong( (long)(con->flag2 & CLAMPTO_CYCLIC) );
default:
return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
}
@@ -757,6 +929,8 @@ static int clampto_setter( BPy_Constraint *self, int type, PyObject *value )
case EXPP_CONSTR_CLAMP:
return EXPP_setIValueRange( value, &con->flag,
CLAMPTO_AUTO, CLAMPTO_Z, 'i' );
+ case EXPP_CONSTR_CLAMPCYCLIC:
+ return EXPP_setBitfield( value, &con->flag2, CLAMPTO_CYCLIC, 'i' );
default:
return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
}
@@ -879,11 +1053,6 @@ static PyObject *locatelike_getter( BPy_Constraint * self, int type )
return PyString_FromString( con->subtarget );
case EXPP_CONSTR_COPY:
return PyInt_FromLong( (long)con->flag );
- case EXPP_CONSTR_LOCAL:
- if( get_armature( con->tar ) )
- return PyBool_FromLong( (long)
- ( self->con->flag & CONSTRAINT_LOCAL ) ) ;
- Py_RETURN_NONE;
default:
return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
}
@@ -915,12 +1084,6 @@ static int locatelike_setter( BPy_Constraint *self, int type, PyObject *value )
case EXPP_CONSTR_COPY:
return EXPP_setIValueRange( value, &con->flag,
0, LOCLIKE_X | LOCLIKE_Y | LOCLIKE_Z | LOCLIKE_X_INVERT | LOCLIKE_Y_INVERT | LOCLIKE_Z_INVERT, 'i' );
- case EXPP_CONSTR_LOCAL:
- if( !get_armature( con->tar ) )
- return EXPP_ReturnIntError( PyExc_RuntimeError,
- "only armature targets have LOCAL key" );
- return EXPP_setBitfield( value, &self->con->flag,
- CONSTRAINT_LOCAL, 'h' );
default:
return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
}
@@ -937,11 +1100,6 @@ static PyObject *rotatelike_getter( BPy_Constraint * self, int type )
return PyString_FromString( con->subtarget );
case EXPP_CONSTR_COPY:
return PyInt_FromLong( (long)con->flag );
- case EXPP_CONSTR_LOCAL:
- if( get_armature( con->tar ) )
- return PyBool_FromLong( (long)
- ( self->con->flag & CONSTRAINT_LOCAL ) ) ;
- Py_RETURN_NONE;
default:
return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
}
@@ -972,13 +1130,7 @@ static int rotatelike_setter( BPy_Constraint *self, int type, PyObject *value )
}
case EXPP_CONSTR_COPY:
return EXPP_setIValueRange( value, &con->flag,
- 0, LOCLIKE_X | LOCLIKE_Y | LOCLIKE_Z | LOCLIKE_X_INVERT | LOCLIKE_Y_INVERT | LOCLIKE_Z_INVERT, 'i' );
- case EXPP_CONSTR_LOCAL:
- if( !get_armature( con->tar ) )
- return EXPP_ReturnIntError( PyExc_RuntimeError,
- "only armature targets have LOCAL key" );
- return EXPP_setBitfield( value, &self->con->flag,
- CONSTRAINT_LOCAL, 'h' );
+ 0, ROTLIKE_X | ROTLIKE_Y | ROTLIKE_Z | ROTLIKE_X_INVERT | ROTLIKE_Y_INVERT | ROTLIKE_Z_INVERT, 'i' );
default:
return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
}
@@ -995,13 +1147,6 @@ static PyObject *sizelike_getter( BPy_Constraint * self, int type )
return PyString_FromString( con->subtarget );
case EXPP_CONSTR_COPY:
return PyInt_FromLong( (long)con->flag );
-#if 0
- case EXPP_CONSTR_LOCAL:
- if( get_armature( con->tar ) )
- return PyBool_FromLong( (long)
- ( self->con->flag & CONSTRAINT_LOCAL ) ) ;
- Py_RETURN_NONE;
-#endif
default:
return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
}
@@ -1032,15 +1177,7 @@ static int sizelike_setter( BPy_Constraint *self, int type, PyObject *value )
}
case EXPP_CONSTR_COPY:
return EXPP_setIValueRange( value, &con->flag,
- 0, LOCLIKE_X | LOCLIKE_Y | LOCLIKE_Z | LOCLIKE_X_INVERT | LOCLIKE_Y_INVERT | LOCLIKE_Z_INVERT, 'i' );
-#if 0
- case EXPP_CONSTR_LOCAL:
- if( !get_armature( con->tar ) )
- return EXPP_ReturnIntError( PyExc_RuntimeError,
- "only armature targets have LOCAL key" );
- return EXPP_setBitfield( value, &self->con->flag,
- CONSTRAINT_LOCAL, 'h' );
-#endif
+ 0, SIZELIKE_X | SIZELIKE_Y | SIZELIKE_Z, 'i' );
default:
return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
}
@@ -1053,12 +1190,6 @@ static PyObject *loclimit_getter( BPy_Constraint * self, int type)
switch( type ) {
case EXPP_CONSTR_LIMIT:
return PyInt_FromLong( (long)con->flag );
- case EXPP_CONSTR_LIMLOCALBONE:
- return PyBool_FromLong( (long)
- ( self->con->flag & CONSTRAINT_LOCAL ) ) ;
- case EXPP_CONSTR_LIMLOCALNOPAR:
- return PyBool_FromLong( (long)
- ( con->flag2 & LIMIT_NOPARENT ) ) ;
case EXPP_CONSTR_XMIN:
return PyFloat_FromDouble( (double)con->xmin );
case EXPP_CONSTR_XMAX:
@@ -1084,12 +1215,6 @@ static int loclimit_setter( BPy_Constraint *self, int type, PyObject *value )
case EXPP_CONSTR_LIMIT:
return EXPP_setIValueRange( value, &con->flag, 0,
LIMIT_XMIN | LIMIT_XMAX | LIMIT_YMIN | LIMIT_YMAX | LIMIT_ZMIN | LIMIT_ZMAX , 'i' );
- case EXPP_CONSTR_LIMLOCALBONE:
- return EXPP_setBitfield( value, &self->con->flag,
- CONSTRAINT_LOCAL, 'h' );
- case EXPP_CONSTR_LIMLOCALNOPAR:
- return EXPP_setBitfield( value, &con->flag2,
- LIMIT_NOPARENT, 'h' );
case EXPP_CONSTR_XMIN:
return EXPP_setFloatClamped( value, &con->xmin, -1000.0, 1000.0 );
case EXPP_CONSTR_XMAX:
@@ -1114,9 +1239,6 @@ static PyObject *rotlimit_getter( BPy_Constraint * self, int type )
switch( type ) {
case EXPP_CONSTR_LIMIT:
return PyInt_FromLong( (long)con->flag );
- case EXPP_CONSTR_LIMLOCALBONE:
- return PyBool_FromLong( (long)
- (self->con->flag & CONSTRAINT_LOCAL ) );
case EXPP_CONSTR_XMIN:
return PyFloat_FromDouble( (double)con->xmin );
case EXPP_CONSTR_XMAX:
@@ -1142,9 +1264,6 @@ static int rotlimit_setter( BPy_Constraint *self, int type, PyObject *value )
case EXPP_CONSTR_LIMIT:
return EXPP_setIValueRange( value, &con->flag, 0,
LIMIT_XROT | LIMIT_YROT | LIMIT_ZROT, 'i' );
- case EXPP_CONSTR_LIMLOCALBONE:
- return EXPP_setBitfield( value, &self->con->flag,
- CONSTRAINT_LOCAL, 'h' );
case EXPP_CONSTR_XMIN:
return EXPP_setFloatClamped( value, &con->xmin, -360.0, 360.0 );
case EXPP_CONSTR_XMAX:
@@ -1211,6 +1330,65 @@ static int sizelimit_setter( BPy_Constraint *self, int type, PyObject *value )
}
}
+static PyObject *script_getter( BPy_Constraint * self, int type )
+{
+ bPythonConstraint *con = (bPythonConstraint *)(self->con->data);
+
+ switch( type ) {
+ // FIXME!!!
+ //case EXPP_CONSTR_TARGET:
+ // return Object_CreatePyObject( con->tar );
+ //case EXPP_CONSTR_BONE:
+ // return PyString_FromString( con->subtarget );
+ case EXPP_CONSTR_SCRIPT:
+ return Text_CreatePyObject( con->text );
+ case EXPP_CONSTR_PROPS:
+ return BPy_Wrap_IDProperty( NULL, con->prop, NULL);
+ default:
+ return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
+ }
+}
+
+static int script_setter( BPy_Constraint *self, int type, PyObject *value )
+{
+ bPythonConstraint *con = (bPythonConstraint *)(self->con->data);
+
+ switch( type ) {
+ // FIXME!!!
+ //case EXPP_CONSTR_TARGET: {
+ // Object *obj = (( BPy_Object * )value)->object;
+ // if( !BPy_Object_Check( value ) )
+ // return EXPP_ReturnIntError( PyExc_TypeError,
+ // "expected BPy object argument" );
+ // con->tar = obj;
+ // return 0;
+ // }
+ //case EXPP_CONSTR_BONE: {
+ // char *name = PyString_AsString( value );
+ // if( !name )
+ // return EXPP_ReturnIntError( PyExc_TypeError,
+ // "expected string arg" );
+ //
+ // BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) );
+ //
+ // return 0;
+ // }
+ case EXPP_CONSTR_SCRIPT: {
+ Text *text = (( BPy_Text * )value)->text;
+ if( !BPy_Object_Check( value ) )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected BPy text argument" );
+ con->text = text;
+ return 0;
+ }
+ case EXPP_CONSTR_PROPS:
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "setting ID-Properties of PyConstraints this way is not supported" );
+ default:
+ return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
+ }
+}
+
static PyObject *rigidbody_getter( BPy_Constraint * self, int type)
{
@@ -1330,6 +1508,195 @@ static int rigidbody_setter( BPy_Constraint *self, int type, PyObject *value )
}
}
+static PyObject *childof_getter( BPy_Constraint * self, int type )
+{
+ bChildOfConstraint *con = (bChildOfConstraint *)(self->con->data);
+
+ switch( type ) {
+ case EXPP_CONSTR_TARGET:
+ return Object_CreatePyObject( con->tar );
+ case EXPP_CONSTR_BONE:
+ return PyString_FromString( con->subtarget );
+ case EXPP_CONSTR_COPY:
+ return PyInt_FromLong( (long)con->flag );
+ default:
+ return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
+ }
+}
+
+static int childof_setter( BPy_Constraint *self, int type, PyObject *value )
+{
+ bChildOfConstraint *con = (bChildOfConstraint *)(self->con->data);
+
+ switch( type ) {
+ case EXPP_CONSTR_TARGET: {
+ Object *obj = (( BPy_Object * )value)->object;
+ if( !BPy_Object_Check( value ) )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected BPy object argument" );
+ con->tar = obj;
+ return 0;
+ }
+ case EXPP_CONSTR_BONE: {
+ char *name = PyString_AsString( value );
+ if( !name )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected string arg" );
+
+ BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) );
+
+ return 0;
+ }
+ case EXPP_CONSTR_COPY:
+ return EXPP_setIValueRange( value, &con->flag,
+ 0, CHILDOF_LOCX| CHILDOF_LOCY | CHILDOF_LOCZ | CHILDOF_ROTX | CHILDOF_ROTY | CHILDOF_ROTZ |
+ CHILDOF_SIZEX |CHILDOF_SIZEY| CHILDOF_SIZEZ, 'i' );
+ default:
+ return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
+ }
+}
+
+static PyObject *transf_getter( BPy_Constraint * self, int type )
+{
+ bTransformConstraint *con = (bTransformConstraint *)(self->con->data);
+
+ switch( type ) {
+ case EXPP_CONSTR_TARGET:
+ return Object_CreatePyObject( con->tar );
+ case EXPP_CONSTR_BONE:
+ return PyString_FromString( con->subtarget );
+ case EXPP_CONSTR_FROM:
+ return PyInt_FromLong( (long)con->from );
+ case EXPP_CONSTR_TO:
+ return PyInt_FromLong( (long)con->to );
+ case EXPP_CONSTR_MAPX:
+ return PyInt_FromLong( (long)con->map[0] );
+ case EXPP_CONSTR_MAPY:
+ return PyInt_FromLong( (long)con->map[1] );
+ case EXPP_CONSTR_MAPZ:
+ return PyInt_FromLong( (long)con->map[2] );
+ case EXPP_CONSTR_FROMMINX:
+ return PyFloat_FromDouble( (double)con->from_min[0] );
+ case EXPP_CONSTR_FROMMAXX:
+ return PyFloat_FromDouble( (double)con->from_max[0] );
+ case EXPP_CONSTR_FROMMINY:
+ return PyFloat_FromDouble( (double)con->from_min[1] );
+ case EXPP_CONSTR_FROMMAXY:
+ return PyFloat_FromDouble( (double)con->from_max[1] );
+ case EXPP_CONSTR_FROMMINZ:
+ return PyFloat_FromDouble( (double)con->from_min[2] );
+ case EXPP_CONSTR_FROMMAXZ:
+ return PyFloat_FromDouble( (double)con->from_max[2] );
+ case EXPP_CONSTR_TOMINX:
+ return PyFloat_FromDouble( (double)con->to_min[0] );
+ case EXPP_CONSTR_TOMAXX:
+ return PyFloat_FromDouble( (double)con->to_max[0] );
+ case EXPP_CONSTR_TOMINY:
+ return PyFloat_FromDouble( (double)con->to_min[1] );
+ case EXPP_CONSTR_TOMAXY:
+ return PyFloat_FromDouble( (double)con->to_max[1] );
+ case EXPP_CONSTR_TOMINZ:
+ return PyFloat_FromDouble( (double)con->to_min[2] );
+ case EXPP_CONSTR_TOMAXZ:
+ return PyFloat_FromDouble( (double)con->to_max[2] );
+ case EXPP_CONSTR_EXPO:
+ return PyBool_FromLong( (long)con->expo );
+ default:
+ return EXPP_ReturnPyObjError( PyExc_KeyError, "key not found" );
+ }
+}
+
+static int transf_setter( BPy_Constraint *self, int type, PyObject *value )
+{
+ bTransformConstraint *con = (bTransformConstraint *)(self->con->data);
+ float fmin, fmax, tmin, tmax;
+
+ if (con->from == 2) {
+ fmin = 0.0001;
+ fmax = 1000.0;
+ }
+ else if (con->from == 1) {
+ fmin = -360.0;
+ fmax = 360.0;
+ }
+ else {
+ fmin = -1000.0;
+ fmax = 1000.0;
+ }
+
+ if (con->to == 2) {
+ tmin = 0.0001;
+ tmax = 1000.0;
+ }
+ else if (con->to == 1) {
+ tmin = -360.0;
+ tmax = 360.0;
+ }
+ else {
+ tmin = -1000.0;
+ tmax = 1000.0;
+ }
+
+ switch( type ) {
+ case EXPP_CONSTR_TARGET: {
+ Object *obj = (( BPy_Object * )value)->object;
+ if( !BPy_Object_Check( value ) )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected BPy object argument" );
+ con->tar = obj;
+ return 0;
+ }
+ case EXPP_CONSTR_BONE: {
+ char *name = PyString_AsString( value );
+ if( !name )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected string arg" );
+
+ BLI_strncpy( con->subtarget, name, sizeof( con->subtarget ) );
+
+ return 0;
+ }
+ case EXPP_CONSTR_FROM:
+ return EXPP_setIValueClamped( value, &con->from, 0, 3, 'h' );
+ case EXPP_CONSTR_TO:
+ return EXPP_setIValueClamped( value, &con->to, 0, 3, 'h' );
+ case EXPP_CONSTR_MAPX:
+ return EXPP_setIValueClamped( value, &con->map[0], 0, 3, 'h' );
+ case EXPP_CONSTR_MAPY:
+ return EXPP_setIValueClamped( value, &con->map[1], 0, 3, 'h' );
+ case EXPP_CONSTR_MAPZ:
+ return EXPP_setIValueClamped( value, &con->map[2], 0, 3, 'h' );
+ case EXPP_CONSTR_FROMMINX:
+ return EXPP_setFloatClamped( value, &con->from_min[0], fmin, fmax );
+ case EXPP_CONSTR_FROMMAXX:
+ return EXPP_setFloatClamped( value, &con->from_max[0], fmin, fmax );
+ case EXPP_CONSTR_FROMMINY:
+ return EXPP_setFloatClamped( value, &con->from_min[1], fmin, fmax );
+ case EXPP_CONSTR_FROMMAXY:
+ return EXPP_setFloatClamped( value, &con->from_max[1], fmin, fmax );
+ case EXPP_CONSTR_FROMMINZ:
+ return EXPP_setFloatClamped( value, &con->from_min[2], fmin, fmax );
+ case EXPP_CONSTR_FROMMAXZ:
+ return EXPP_setFloatClamped( value, &con->from_max[2], fmin, fmax );
+ case EXPP_CONSTR_TOMINX:
+ return EXPP_setFloatClamped( value, &con->to_min[0], tmin, tmax );
+ case EXPP_CONSTR_TOMAXX:
+ return EXPP_setFloatClamped( value, &con->to_max[0], tmin, tmax );
+ case EXPP_CONSTR_TOMINY:
+ return EXPP_setFloatClamped( value, &con->to_min[1], tmin, tmax );
+ case EXPP_CONSTR_TOMAXY:
+ return EXPP_setFloatClamped( value, &con->to_max[1], tmin, tmax );
+ case EXPP_CONSTR_TOMINZ:
+ return EXPP_setFloatClamped( value, &con->to_min[2], tmin, tmax );
+ case EXPP_CONSTR_TOMAXZ:
+ return EXPP_setFloatClamped( value, &con->to_max[2], tmin, tmax );
+ case EXPP_CONSTR_EXPO:
+ return EXPP_setBitfield( value, &con->expo, 1, 'h' );
+ default:
+ return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
+ }
+}
+
/*
* get data from a constraint
*/
@@ -1338,7 +1705,7 @@ static PyObject *Constraint_getData( BPy_Constraint * self, PyObject * key )
{
int setting;
- if( !PyInt_CheckExact( key ) )
+ if( !PyInt_Check( key ) )
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expected an int arg" );
@@ -1347,6 +1714,13 @@ static PyObject *Constraint_getData( BPy_Constraint * self, PyObject * key )
"This constraint has been removed!" );
setting = PyInt_AsLong( key );
+
+ /* bypass doing settings of individual constraints, if we're just doing
+ * constraint space access-stuff
+ */
+ if ((setting==EXPP_CONSTR_OWNSPACE) || (setting==EXPP_CONSTR_TARSPACE)) {
+ return constspace_getter( self, setting );
+ }
switch( self->con->type ) {
case CONSTRAINT_TYPE_NULL:
Py_RETURN_NONE;
@@ -1380,8 +1754,12 @@ static PyObject *Constraint_getData( BPy_Constraint * self, PyObject * key )
return rigidbody_getter( self, setting );
case CONSTRAINT_TYPE_CLAMPTO:
return clampto_getter( self, setting );
- case CONSTRAINT_TYPE_CHILDOF: /* Unimplemented */
case CONSTRAINT_TYPE_PYTHON:
+ return script_getter( self, setting );
+ case CONSTRAINT_TYPE_CHILDOF:
+ return childof_getter( self, setting );
+ case CONSTRAINT_TYPE_TRANSFORM:
+ return transf_getter( self, setting );
default:
return EXPP_ReturnPyObjError( PyExc_KeyError,
"unknown constraint type" );
@@ -1401,59 +1779,75 @@ static int Constraint_setData( BPy_Constraint * self, PyObject * key,
"This constraint has been removed!" );
key_int = PyInt_AsLong( key );
- switch( self->con->type ) {
- case CONSTRAINT_TYPE_KINEMATIC:
- result = kinematic_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_ACTION:
- result = action_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- result = trackto_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- result = stretchto_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- result = followpath_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- result = locktrack_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_MINMAX:
- result = floor_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- result = locatelike_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- result = rotatelike_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- result = sizelike_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_ROTLIMIT:
- result = rotlimit_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_LOCLIMIT:
- result = loclimit_setter( self, key_int, arg );
- break;
- case CONSTRAINT_TYPE_SIZELIMIT:
- result = sizelimit_setter( self, key_int, arg);
- break;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- result = rigidbody_setter( self, key_int, arg);
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- result = clampto_setter( self, key_int, arg);
- break;
- case CONSTRAINT_TYPE_NULL:
- return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
- case CONSTRAINT_TYPE_CHILDOF: /* Unimplemented */
- case CONSTRAINT_TYPE_PYTHON:
- default:
- return EXPP_ReturnIntError( PyExc_RuntimeError,
- "unsupported constraint setting" );
+
+ /* bypass doing settings of individual constraints, if we're just doing
+ * constraint space access-stuff
+ */
+ if ((key_int==EXPP_CONSTR_OWNSPACE) || (key_int==EXPP_CONSTR_TARSPACE)) {
+ result = constspace_setter( self, key_int, arg );
+ }
+ else {
+ switch( self->con->type ) {
+ case CONSTRAINT_TYPE_KINEMATIC:
+ result = kinematic_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_ACTION:
+ result = action_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_TRACKTO:
+ result = trackto_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_STRETCHTO:
+ result = stretchto_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_FOLLOWPATH:
+ result = followpath_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_LOCKTRACK:
+ result = locktrack_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_MINMAX:
+ result = floor_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_LOCLIKE:
+ result = locatelike_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_ROTLIKE:
+ result = rotatelike_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_SIZELIKE:
+ result = sizelike_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_ROTLIMIT:
+ result = rotlimit_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_LOCLIMIT:
+ result = loclimit_setter( self, key_int, arg );
+ break;
+ case CONSTRAINT_TYPE_SIZELIMIT:
+ result = sizelimit_setter( self, key_int, arg);
+ break;
+ case CONSTRAINT_TYPE_RIGIDBODYJOINT:
+ result = rigidbody_setter( self, key_int, arg);
+ break;
+ case CONSTRAINT_TYPE_CLAMPTO:
+ result = clampto_setter( self, key_int, arg);
+ break;
+ case CONSTRAINT_TYPE_PYTHON:
+ result = script_setter( self, key_int, arg);
+ break;
+ case CONSTRAINT_TYPE_CHILDOF:
+ result = childof_setter( self, key_int, arg);
+ break;
+ case CONSTRAINT_TYPE_TRANSFORM:
+ result = transf_setter( self, key_int, arg);
+ break;
+ case CONSTRAINT_TYPE_NULL:
+ return EXPP_ReturnIntError( PyExc_KeyError, "key not found" );
+ default:
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "unsupported constraint setting" );
+ }
}
if( !result && self->pchan )
update_pose_constraint_flags( self->obj->pose );
@@ -1477,14 +1871,20 @@ static int Constraint_compare( BPy_Constraint * a, BPy_Constraint * b )
static PyObject *Constraint_repr( BPy_Constraint * self )
{
- char type[32];
-
- if( !self->con )
- return PyString_FromString( "[Constraint - Removed]");
+ bConstraintTypeInfo *cti;
- get_constraint_typestring (type, self->con);
- return PyString_FromFormat( "[Constraint \"%s\", Type \"%s\"]",
- self->con->name, type );
+ if (!self->con)
+ return PyString_FromString("[Constraint - Removed]");
+ else
+ cti= constraint_get_typeinfo(self->con);
+
+ if (cti) {
+ return PyString_FromFormat("[Constraint \"%s\", Type \"%s\"]",
+ self->con->name, cti->name);
+ }
+ else {
+ return PyString_FromString("[Constraint \"%s\", Type \"Unknown\"]");
+ }
}
/* Three Python Constraint_Type helper functions needed by the Object module: */
@@ -1918,6 +2318,12 @@ static PyObject *M_Constraint_TypeDict( void )
PyInt_FromLong( CONSTRAINT_TYPE_RIGIDBODYJOINT ) );
PyConstant_Insert( d, "CLAMPTO",
PyInt_FromLong( CONSTRAINT_TYPE_CLAMPTO ) );
+ PyConstant_Insert( d, "PYTHON",
+ PyInt_FromLong( CONSTRAINT_TYPE_PYTHON ) );
+ PyConstant_Insert( d, "CHILDOF",
+ PyInt_FromLong( CONSTRAINT_TYPE_CHILDOF ) );
+ PyConstant_Insert( d, "TRANSFORM",
+ PyInt_FromLong( CONSTRAINT_TYPE_TRANSFORM ) );
}
return S;
}
@@ -1934,6 +2340,18 @@ static PyObject *M_Constraint_SettingsDict( void )
PyInt_FromLong( EXPP_CONSTR_YROT ) );
PyConstant_Insert( d, "ZROT",
PyInt_FromLong( EXPP_CONSTR_ZROT ) );
+ PyConstant_Insert( d, "XSIZE",
+ PyInt_FromLong( EXPP_CONSTR_XSIZE ) );
+ PyConstant_Insert( d, "YSIZE",
+ PyInt_FromLong( EXPP_CONSTR_YSIZE ) );
+ PyConstant_Insert( d, "ZSIZE",
+ PyInt_FromLong( EXPP_CONSTR_ZSIZE ) );
+ PyConstant_Insert( d, "XLOC",
+ PyInt_FromLong( EXPP_CONSTR_XLOC ) );
+ PyConstant_Insert( d, "YLOC",
+ PyInt_FromLong( EXPP_CONSTR_YLOC ) );
+ PyConstant_Insert( d, "ZLOC",
+ PyInt_FromLong( EXPP_CONSTR_ZLOC ) );
PyConstant_Insert( d, "UPX",
PyInt_FromLong( UP_X ) );
@@ -2004,6 +2422,25 @@ static PyObject *M_Constraint_SettingsDict( void )
PyConstant_Insert( d, "COPYZINVERT",
PyInt_FromLong( LOCLIKE_Z_INVERT ) );
+ PyConstant_Insert( d, "PARLOCX",
+ PyInt_FromLong( CHILDOF_LOCX ) );
+ PyConstant_Insert( d, "PARLOCY",
+ PyInt_FromLong( CHILDOF_LOCY ) );
+ PyConstant_Insert( d, "PARLOCZ",
+ PyInt_FromLong( CHILDOF_LOCZ ) );
+ PyConstant_Insert( d, "PARROTX",
+ PyInt_FromLong( CHILDOF_ROTX ) );
+ PyConstant_Insert( d, "PARROTY",
+ PyInt_FromLong( CHILDOF_ROTY ) );
+ PyConstant_Insert( d, "PARROTZ",
+ PyInt_FromLong( CHILDOF_ROTZ ) );
+ PyConstant_Insert( d, "PARSIZEX",
+ PyInt_FromLong( CHILDOF_LOCX ) );
+ PyConstant_Insert( d, "PARSIZEY",
+ PyInt_FromLong( CHILDOF_SIZEY ) );
+ PyConstant_Insert( d, "PARSIZEZ",
+ PyInt_FromLong( CHILDOF_SIZEZ ) );
+
PyConstant_Insert( d, "CLAMPAUTO",
PyInt_FromLong( CLAMPTO_AUTO ) );
PyConstant_Insert( d, "CLAMPX",
@@ -2012,6 +2449,8 @@ static PyObject *M_Constraint_SettingsDict( void )
PyInt_FromLong( CLAMPTO_Y ) );
PyConstant_Insert( d, "CLAMPZ",
PyInt_FromLong( CLAMPTO_Z ) );
+ PyConstant_Insert( d, "CLAMPCYCLIC",
+ PyInt_FromLong( EXPP_CONSTR_CLAMPCYCLIC ));
PyConstant_Insert( d, "TARGET",
PyInt_FromLong( EXPP_CONSTR_TARGET ) );
@@ -2034,8 +2473,6 @@ static PyObject *M_Constraint_SettingsDict( void )
PyConstant_Insert( d, "ACTION",
PyInt_FromLong( EXPP_CONSTR_ACTION ) );
- PyConstant_Insert( d, "LOCAL",
- PyInt_FromLong( EXPP_CONSTR_LOCAL ) );
PyConstant_Insert( d, "START",
PyInt_FromLong( EXPP_CONSTR_START ) );
PyConstant_Insert( d, "END",
@@ -2110,13 +2547,56 @@ static PyObject *M_Constraint_SettingsDict( void )
PyInt_FromLong( EXPP_CONSTR_ZMIN ) );
PyConstant_Insert( d, "ZMAX",
PyInt_FromLong( EXPP_CONSTR_ZMAX ) );
-
- PyConstant_Insert( d, "LIMIT_LOCAL_BONE",
- PyInt_FromLong( EXPP_CONSTR_LIMLOCALBONE ) );
- PyConstant_Insert( d, "LIMIT_LOCAL_NOPARENT",
- PyInt_FromLong( EXPP_CONSTR_LIMLOCALNOPAR ) );
-
-
+
+ PyConstant_Insert( d, "SCRIPT",
+ PyInt_FromLong( EXPP_CONSTR_SCRIPT ) );
+ PyConstant_Insert( d, "PROPERTIES",
+ PyInt_FromLong( EXPP_CONSTR_PROPS ) );
+
+ PyConstant_Insert( d, "FROM",
+ PyInt_FromLong( EXPP_CONSTR_FROM ) );
+ PyConstant_Insert( d, "TO",
+ PyInt_FromLong( EXPP_CONSTR_TO ) );
+ PyConstant_Insert( d, "EXTRAPOLATE",
+ PyInt_FromLong( EXPP_CONSTR_EXPO ) );
+ PyConstant_Insert( d, "MAPX",
+ PyInt_FromLong( EXPP_CONSTR_MAPX ) );
+ PyConstant_Insert( d, "MAPY",
+ PyInt_FromLong( EXPP_CONSTR_MAPY ) );
+ PyConstant_Insert( d, "MAPZ",
+ PyInt_FromLong( EXPP_CONSTR_MAPZ ) );
+ PyConstant_Insert( d, "FROM_MINX",
+ PyInt_FromLong( EXPP_CONSTR_FROMMINX ) );
+ PyConstant_Insert( d, "FROM_MAXX",
+ PyInt_FromLong( EXPP_CONSTR_FROMMAXX ) );
+ PyConstant_Insert( d, "FROM_MINY",
+ PyInt_FromLong( EXPP_CONSTR_FROMMINY ) );
+ PyConstant_Insert( d, "FROM_MAXY",
+ PyInt_FromLong( EXPP_CONSTR_FROMMAXY ) );
+ PyConstant_Insert( d, "FROM_MINZ",
+ PyInt_FromLong( EXPP_CONSTR_FROMMINZ ) );
+ PyConstant_Insert( d, "FROM_MAXZ",
+ PyInt_FromLong( EXPP_CONSTR_FROMMAXZ ) );
+ PyConstant_Insert( d, "TO_MINX",
+ PyInt_FromLong( EXPP_CONSTR_TOMINX ) );
+ PyConstant_Insert( d, "TO_MAXX",
+ PyInt_FromLong( EXPP_CONSTR_TOMAXX ) );
+ PyConstant_Insert( d, "TO_MINY",
+ PyInt_FromLong( EXPP_CONSTR_TOMINY ) );
+ PyConstant_Insert( d, "TO_MAXY",
+ PyInt_FromLong( EXPP_CONSTR_TOMAXY ) );
+ PyConstant_Insert( d, "TO_MINZ",
+ PyInt_FromLong( EXPP_CONSTR_TOMINZ ) );
+ PyConstant_Insert( d, "TO_MAXZ",
+ PyInt_FromLong( EXPP_CONSTR_TOMAXZ ) );
+
+ PyConstant_Insert( d, "LOC",
+ PyInt_FromLong( 0 ) );
+ PyConstant_Insert( d, "ROT",
+ PyInt_FromLong( 1 ) );
+ PyConstant_Insert( d, "SCALE",
+ PyInt_FromLong( 2 ) );
+
PyConstant_Insert( d, "CONSTR_RB_TYPE",
PyInt_FromLong( EXPP_CONSTR_RB_TYPE ) );
PyConstant_Insert( d, "CONSTR_RB_BALL",
@@ -2167,6 +2647,21 @@ static PyObject *M_Constraint_SettingsDict( void )
PyInt_FromLong( EXPP_CONSTR_RB_EXTRAFZ ) );
PyConstant_Insert( d, "CONSTR_RB_FLAG",
PyInt_FromLong( EXPP_CONSTR_RB_FLAG ) );
+
+
+ PyConstant_Insert( d, "OWNERSPACE",
+ PyInt_FromLong( EXPP_CONSTR_OWNSPACE ) );
+ PyConstant_Insert( d, "TARGETSPACE",
+ PyInt_FromLong( EXPP_CONSTR_TARSPACE ) );
+
+ PyConstant_Insert( d, "SPACE_WORLD",
+ PyInt_FromLong( CONSTRAINT_SPACE_WORLD) );
+ PyConstant_Insert( d, "SPACE_LOCAL",
+ PyInt_FromLong( CONSTRAINT_SPACE_LOCAL ) );
+ PyConstant_Insert( d, "SPACE_POSE",
+ PyInt_FromLong( CONSTRAINT_SPACE_POSE) );
+ PyConstant_Insert( d, "SPACE_PARLOCAL",
+ PyInt_FromLong( CONSTRAINT_SPACE_PARLOCAL ) );
}
return S;
}
diff --git a/source/blender/python/api2_2x/CurNurb.c b/source/blender/python/api2_2x/CurNurb.c
index f919167372c..e98b0da8f3d 100644
--- a/source/blender/python/api2_2x/CurNurb.c
+++ b/source/blender/python/api2_2x/CurNurb.c
@@ -37,6 +37,9 @@
#include "gen_utils.h"
#include "BezTriple.h"
+/* Only for ME_SMOOTH */
+#include "DNA_meshdata_types.h"
+
/*
* forward declarations go here
*/
@@ -69,7 +72,8 @@ static PyObject *CurNurb_isCyclic( BPy_CurNurb * self );
static PyObject *CurNurb_dump( BPy_CurNurb * self );
static PyObject *CurNurb_switchDirection( BPy_CurNurb * self );
static PyObject *CurNurb_recalc( BPy_CurNurb * self );
-
+static PyObject *CurNurb_getFlagBits( BPy_CurNurb * self, void *type );
+static int CurNurb_setFlagBits( BPy_CurNurb * self, PyObject *value, void *type );
char M_CurNurb_doc[] = "CurNurb";
@@ -185,7 +189,10 @@ static PyGetSetDef BPy_CurNurb_getseters[] = {
(getter)CurNurb_getKnotsV, (setter)NULL,
"The The knot vector in the V direction",
NULL},
-
+ {"smooth",
+ (getter)CurNurb_getFlagBits, (setter)CurNurb_setFlagBits,
+ "The smooth bool setting",
+ (void *)ME_SMOOTH},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
@@ -420,13 +427,20 @@ static PyObject *CurNurb_getKnotsV( BPy_CurNurb * self )
static PyObject *CurNurb_getPoints( BPy_CurNurb * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->nurb->pntsu );
+ return PyInt_FromLong( ( long ) self->nurb->pntsu );
+}
- if( attr )
- return attr;
+static PyObject *CurNurb_getFlagBits( BPy_CurNurb * self, void *type )
+{
+ return EXPP_getBitfield( (void *)&self->nurb->flag,
+ (int)type, 'h' );
+}
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "could not get number of points" );
+static int CurNurb_setFlagBits( BPy_CurNurb * self, PyObject *value,
+ void *type )
+{
+ return EXPP_setBitfield( value, (void *)&self->nurb->flag,
+ (int)type, 'h' );
}
/*
diff --git a/source/blender/python/api2_2x/Curve.c b/source/blender/python/api2_2x/Curve.c
index 109a4572387..e88ab0eeeff 100644
--- a/source/blender/python/api2_2x/Curve.c
+++ b/source/blender/python/api2_2x/Curve.c
@@ -1,5 +1,6 @@
/*
* $Id$
+ *
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -31,6 +32,7 @@
#include "Curve.h" /*This must come first*/
+#include "BLI_blenlib.h"
#include "BKE_main.h"
#include "BKE_displist.h"
#include "BKE_global.h"
@@ -122,6 +124,7 @@ static PyObject *Curve_getIter( BPy_Curve * self );
static PyObject *Curve_iterNext( BPy_Curve * self );
PyObject *Curve_getNurb( BPy_Curve * self, int n );
+static int Curve_setNurb( BPy_Curve * self, int n, PyObject * value );
static int Curve_length( PyInstanceObject * inst );
@@ -138,13 +141,7 @@ struct chartrans *text_to_curve( Object * ob, int mode );
PyObject *Curve_getName( BPy_Curve * self )
{
- PyObject *attr = PyString_FromString( self->curve->id.name + 2 );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.name attribute" );
+ return PyString_FromString( self->curve->id.name + 2 );
}
static int Curve_newsetName( BPy_Curve * self, PyObject * args )
@@ -164,13 +161,7 @@ static int Curve_newsetName( BPy_Curve * self, PyObject * args )
static PyObject *Curve_getPathLen( BPy_Curve * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->curve->pathlen );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.pathlen attribute" );
+ return PyInt_FromLong( ( long ) self->curve->pathlen );
}
@@ -191,25 +182,13 @@ static int Curve_newsetPathLen( BPy_Curve * self, PyObject * args )
static PyObject *Curve_getTotcol( BPy_Curve * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->curve->totcol );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.totcol attribute" );
+ return PyInt_FromLong( ( long ) self->curve->totcol );
}
PyObject *Curve_getMode( BPy_Curve * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->curve->flag );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.flag attribute" );
+ return PyInt_FromLong( ( long ) self->curve->flag );
}
@@ -230,13 +209,7 @@ static int Curve_newsetMode( BPy_Curve * self, PyObject * args )
PyObject *Curve_getBevresol( BPy_Curve * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->curve->bevresol );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.bevresol attribute" );
+ return PyInt_FromLong( ( long ) self->curve->bevresol );
}
static int Curve_newsetBevresol( BPy_Curve * self, PyObject * args )
@@ -263,13 +236,7 @@ static int Curve_newsetBevresol( BPy_Curve * self, PyObject * args )
PyObject *Curve_getResolu( BPy_Curve * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->curve->resolu );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.resolu attribute" );
+ return PyInt_FromLong( ( long ) self->curve->resolu );
}
@@ -301,13 +268,7 @@ static int Curve_newsetResolu( BPy_Curve * self, PyObject * args )
PyObject *Curve_getResolv( BPy_Curve * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->curve->resolv );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.resolv attribute" );
+ return PyInt_FromLong( ( long ) self->curve->resolv );
}
static int Curve_newsetResolv( BPy_Curve * self, PyObject * args )
@@ -333,13 +294,7 @@ static int Curve_newsetResolv( BPy_Curve * self, PyObject * args )
PyObject *Curve_getWidth( BPy_Curve * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->curve->width );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.width attribute" );
+ return PyFloat_FromDouble( ( double ) self->curve->width );
}
@@ -367,13 +322,7 @@ static int Curve_newsetWidth( BPy_Curve * self, PyObject * args )
PyObject *Curve_getExt1( BPy_Curve * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->curve->ext1 );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.ext1 attribute" );
+ return PyFloat_FromDouble( ( double ) self->curve->ext1 );
}
@@ -390,9 +339,9 @@ static int Curve_newsetExt1( BPy_Curve * self, PyObject * args )
value = (float)PyFloat_AS_DOUBLE( num );
Py_DECREF( num );
- if(value > 5.0f || value < 0.0f)
+ if(value > 100.0f || value < 0.0f)
return EXPP_ReturnIntError( PyExc_ValueError,
- "acceptable values are between 0.0 and 5.0" );
+ "acceptable values are between 0.0 and 100.0" );
self->curve->ext1 = value;
return 0;
@@ -400,13 +349,7 @@ static int Curve_newsetExt1( BPy_Curve * self, PyObject * args )
PyObject *Curve_getExt2( BPy_Curve * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->curve->ext2 );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.ext2 attribute" );
+ return PyFloat_FromDouble( ( double ) self->curve->ext2 );
}
@@ -535,14 +478,8 @@ static PyObject *Curve_getControlPoint( BPy_Curve * self, PyObject * args )
static PyObject *Curve_getLoc( BPy_Curve * self )
{
- PyObject *attr = Py_BuildValue( "[f,f,f]", self->curve->loc[0],
+ return Py_BuildValue( "[f,f,f]", self->curve->loc[0],
self->curve->loc[1], self->curve->loc[2] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.loc attribute" );
}
static int Curve_newsetLoc( BPy_Curve * self, PyObject * args )
@@ -573,14 +510,8 @@ TypeError:
static PyObject *Curve_getRot( BPy_Curve * self )
{
- PyObject *attr = Py_BuildValue( "[f,f,f]", self->curve->rot[0],
+ return Py_BuildValue( "[f,f,f]", self->curve->rot[0],
self->curve->rot[1], self->curve->rot[2] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.rot attribute" );
}
static int Curve_newsetRot( BPy_Curve * self, PyObject * args )
@@ -611,14 +542,8 @@ TypeError:
static PyObject *Curve_getSize( BPy_Curve * self )
{
- PyObject *attr = Py_BuildValue( "[f,f,f]", self->curve->size[0],
+ return Py_BuildValue( "[f,f,f]", self->curve->size[0],
self->curve->size[1], self->curve->size[2] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Curve.size attribute" );
}
static int Curve_newsetSize( BPy_Curve * self, PyObject * args )
@@ -845,8 +770,6 @@ static PyObject *Curve_appendPoint( BPy_Curve * self, PyObject * args )
int i;
int nurb_num; /* index of curve we append to */
PyObject *coord_args; /* coords for new point */
- PyObject *retval = NULL;
- PyObject *valtuple;
Nurb *nurb = self->curve->nurb.first; /* first nurb in Curve */
/* fixme - need to malloc new Nurb */
@@ -868,14 +791,7 @@ static PyObject *Curve_appendPoint( BPy_Curve * self, PyObject * args )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"curve index out of range" );
}
-
- /* rebuild our arg tuple for appendPointToNurb() */
- valtuple = Py_BuildValue( "(O)", coord_args );
-
- retval = CurNurb_appendPointToNurb( nurb, valtuple );
- Py_DECREF( valtuple );
-
- return retval;
+ return CurNurb_appendPointToNurb( nurb, coord_args );
}
@@ -885,29 +801,16 @@ static PyObject *Curve_appendPoint( BPy_Curve * self, PyObject * args )
returns a refernce to the newly created nurb.
*****/
-static PyObject *Curve_appendNurb( BPy_Curve * self, PyObject * args )
+static PyObject *Curve_appendNurb( BPy_Curve * self, PyObject * value )
{
- Nurb *nurb_ptr = self->curve->nurb.first;
- Nurb **pptr = ( Nurb ** ) & ( self->curve->nurb.first );
Nurb *new_nurb;
-
-
- /* walk to end of nurblist */
- if( nurb_ptr ) {
- while( nurb_ptr->next ) {
- nurb_ptr = nurb_ptr->next;
- }
- pptr = &nurb_ptr->next;
- }
-
/* malloc new nurb */
new_nurb = ( Nurb * ) MEM_callocN( sizeof( Nurb ), "appendNurb" );
if( !new_nurb )
return EXPP_ReturnPyObjError
( PyExc_MemoryError, "unable to malloc Nurb" );
-
- if( CurNurb_appendPointToNurb( new_nurb, args ) ) {
- *pptr = new_nurb;
+
+ if( CurNurb_appendPointToNurb( new_nurb, value ) ) {
new_nurb->resolu = self->curve->resolu;
new_nurb->resolv = self->curve->resolv;
new_nurb->hide = 0;
@@ -934,6 +837,7 @@ static PyObject *Curve_appendNurb( BPy_Curve * self, PyObject * args )
new_nurb->knotsu = 0;
/*makenots( new_nurb, 1, new_nurb->flagu >> 1); */
}
+ BLI_addtail( &self->curve->nurb, new_nurb);
} else {
freeNurb( new_nurb );
@@ -1208,6 +1112,42 @@ PyObject *Curve_getNurb( BPy_Curve * self, int n )
}
+/*
+ * Curve_setNurb
+ * In this case only remove the item, we could allow adding later.
+ */
+static int Curve_setNurb( BPy_Curve * self, int n, PyObject * value )
+{
+ Nurb *pNurb;
+ int i;
+
+ /* bail if index < 0 */
+ if( n < 0 )
+ return ( EXPP_ReturnIntError( PyExc_IndexError,
+ "index less than 0" ) );
+ /* bail if no Nurbs in Curve */
+ if( self->curve->nurb.first == 0 )
+ return ( EXPP_ReturnIntError( PyExc_IndexError,
+ "no Nurbs in this Curve" ) );
+ /* set pointer to nth Nurb */
+ for( pNurb = self->curve->nurb.first, i = 0;
+ pNurb != 0 && i < n; pNurb = pNurb->next, ++i )
+ /**/;
+
+ if( !pNurb ) /* we came to the end of the list */
+ return ( EXPP_ReturnIntError( PyExc_IndexError,
+ "index out of range" ) );
+
+ if (value) {
+ return ( EXPP_ReturnIntError( PyExc_RuntimeError,
+ "assigning curves is not yet supported" ) );
+ } else {
+ BLI_remlink(&self->curve->nurb, pNurb);
+ freeNurb(pNurb);
+ }
+ return 0;
+}
+
/*****************************************************************************/
/* Function: Curve_compare */
/* Description: This compares 2 curve python types, == or != only. */
@@ -1493,7 +1433,7 @@ Sets a control point "},
"(nothing or integer) - returns the number of points of the specified curve"},
{"appendPoint", ( PyCFunction ) Curve_appendPoint, METH_VARARGS,
"( int numcurve, list of coordinates) - adds a new point to end of curve"},
- {"appendNurb", ( PyCFunction ) Curve_appendNurb, METH_VARARGS,
+ {"appendNurb", ( PyCFunction ) Curve_appendNurb, METH_O,
"( new_nurb ) - adds a new nurb to the Curve"},
{"update", ( PyCFunction ) Curve_update, METH_NOARGS,
"( ) - updates display lists after changes to Curve"},
@@ -1527,7 +1467,7 @@ static PySequenceMethods Curve_as_sequence = {
( intargfunc ) 0, /* sq_repeat */
( intargfunc ) Curve_getNurb, /* sq_item */
( intintargfunc ) 0, /* sq_slice */
- 0, /* sq_ass_item */
+ ( intobjargproc ) Curve_setNurb, /* sq_ass_item - only so you can do del curve[i] */
0, /* sq_ass_slice */
( objobjproc ) 0, /* sq_contains */
0,
diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c
index 114713fcfad..54ff927a2b3 100644
--- a/source/blender/python/api2_2x/Draw.c
+++ b/source/blender/python/api2_2x/Draw.c
@@ -103,10 +103,10 @@ static void exec_callback( SpaceScript * sc, PyObject * callback,
static void spacescript_do_pywin_buttons( SpaceScript * sc,
unsigned short event );
-static PyObject *Method_Exit( PyObject * self, PyObject * args );
+static PyObject *Method_Exit( PyObject * self );
static PyObject *Method_Register( PyObject * self, PyObject * args );
static PyObject *Method_Redraw( PyObject * self, PyObject * args );
-static PyObject *Method_Draw( PyObject * self, PyObject * args );
+static PyObject *Method_Draw( PyObject * self );
static PyObject *Method_Create( PyObject * self, PyObject * args );
static PyObject *Method_UIBlock( PyObject * self, PyObject * args );
@@ -135,6 +135,7 @@ static PyObject *Method_Image( PyObject * self, PyObject * args);
static PyObject *Method_PupBlock( PyObject * self, PyObject * args );
static uiBlock *Get_uiBlock( void );
+
static void py_slider_update( void *butv, void *data2_unused );
/* hack to get 1 block for the UIBlock, only ever 1 at a time */
@@ -355,6 +356,12 @@ Warning: On cancel, the value objects are brought back to there previous values,
static char Method_Exit_doc[] = "() - Exit the windowing interface";
+/*This is needed for button callbacks. Any button that uses a callback gets added to this list.
+ On the C side of drawing begin, this list should be cleared.
+ Each entry is a tuple of the form (button, callback py object)
+*/
+PyObject *M_Button_List = NULL;
+
/*
* here we engage in some macro trickery to define the PyMethodDef table
*/
@@ -389,11 +396,11 @@ static struct PyMethodDef Draw_methods[] = {
MethodDef( PupStrInput ),
MethodDef( PupBlock ),
MethodDef( Image ),
- MethodDef( Exit ),
+ {"Exit", (PyCFunction)Method_Exit, METH_NOARGS, Method_Exit_doc},
MethodDef( Redraw ),
- MethodDef( Draw ),
+ {"Draw", (PyCFunction)Method_Draw, METH_NOARGS, Method_Draw_doc},
MethodDef( Register ),
- {"PushButton", Method_Button, METH_VARARGS, Method_Button_doc},
+ {"PushButton", (PyCFunction)Method_Button, METH_VARARGS, Method_Button_doc},
MethodDef( BeginAlign ),
MethodDef( EndAlign),
{NULL, NULL, 0, NULL}
@@ -581,11 +588,15 @@ static PyObject *Button_repr( PyObject * self )
static PyObject *Button_richcmpr(PyObject *objectA, PyObject *objectB, int comparison_type)
{
+ PyObject *ret, *valA=NULL, *valB=NULL;
if (ButtonObject_Check(objectA))
- objectA = Button_getattr( objectA, "val" );
+ objectA = valA = Button_getattr( objectA, "val" );
if (ButtonObject_Check(objectB))
- objectB = Button_getattr( objectB, "val" );
- return PyObject_RichCompare(objectA, objectB, comparison_type);
+ objectB = valB = Button_getattr( objectB, "val" );
+ ret = PyObject_RichCompare(objectA, objectB, comparison_type);
+ Py_XDECREF(valA); /* Button_getattr created with 1 ref, we dont care about them now */
+ Py_XDECREF(valB);
+ return ret;
}
@@ -594,7 +605,9 @@ static Button *newbutton( void )
Button *but = NULL;
but = ( Button * ) PyObject_NEW( Button, &Button_Type );
-
+ but->tooltip[0] = 0; /*NULL-terminate tooltip string*/
+ but->tooltip[255] = 0; /*necassary to insure we always have a NULL-terminated string, as
+ according to the docs strncpy doesn't do this for us.*/
return but;
}
@@ -616,6 +629,10 @@ static void exit_pydraw( SpaceScript * sc, short err )
scrarea_queue_redraw( sc->area );
}
+ BPy_Set_DrawButtonsList(sc->but_refs);
+ BPy_Free_DrawButtonsList(); /*clear all temp button references*/
+ sc->but_refs = NULL;
+
Py_XDECREF( ( PyObject * ) script->py_draw );
Py_XDECREF( ( PyObject * ) script->py_event );
Py_XDECREF( ( PyObject * ) script->py_button );
@@ -669,6 +686,13 @@ void BPY_spacescript_do_pywin_draw( SpaceScript * sc )
UI_HELV, curarea->win );
if( script->py_draw ) {
+ if (sc->but_refs) {
+ BPy_Set_DrawButtonsList(sc->but_refs);
+ BPy_Free_DrawButtonsList(); /*clear all temp button references*/
+ }
+ sc->but_refs = PyList_New(0);
+ BPy_Set_DrawButtonsList(sc->but_refs);
+
glPushAttrib( GL_ALL_ATTRIB_BITS );
exec_callback( sc, script->py_draw, Py_BuildValue( "()" ) );
glPopAttrib( );
@@ -738,7 +762,7 @@ void BPY_spacescript_do_pywin_event( SpaceScript * sc, unsigned short event,
static void exec_but_callback(void *pyobj, void *data)
{
PyObject *result;
- PyObject * pyvalue;
+ PyObject *pyvalue = NULL;
uiBut *but = (uiBut *)data;
PyObject *arg;
PyObject *callback = (PyObject *)pyobj;
@@ -814,13 +838,52 @@ static void exec_but_callback(void *pyobj, void *data)
Py_XDECREF( result );
}
-static void set_pycallback(uiBut *ubut, PyObject *callback)
+/*note that this function populates the drawbutton ref lists.*/
+static void set_pycallback(uiBut *ubut, PyObject *callback, Button *but)
{
- if (!callback || !PyCallable_Check(callback)) return;
- uiButSetFunc(ubut, exec_but_callback, callback, ubut);
+ PyObject *tuple;
+ if (!callback || !PyCallable_Check(callback)) {
+ if (M_Button_List && but) {
+ PyList_Append(M_Button_List, (PyObject*)but);
+ }
+ return;
+ }
+
+ if (M_Button_List) {
+ if (but) tuple = PyTuple_New(2);
+ else tuple = PyTuple_New(1);
+
+ /*the tuple API mandates this*/
+ Py_XINCREF(callback);
+ Py_XINCREF(but); /*this checks for NULL*/
+
+ PyTuple_SET_ITEM(tuple, 0, callback);
+ if (but) PyTuple_SET_ITEM(tuple, 1, (PyObject*)but);
+
+ PyList_Append(M_Button_List, tuple);
+ Py_DECREF(tuple); /*we have to do this to aovid double references.*/
+
+ uiButSetFunc(ubut, exec_but_callback, callback, ubut);
+ }
}
-static PyObject *Method_Exit( PyObject * self, PyObject * args )
+void BPy_Set_DrawButtonsList(void *list)
+{
+ M_Button_List = list;
+}
+
+/*this MUST be called after doing UI stuff.*/
+void BPy_Free_DrawButtonsList(void)
+{
+ /*Clear the list.*/
+ if (M_Button_List) {
+ PyList_SetSlice(M_Button_List, 0, PyList_Size(M_Button_List), NULL);
+ Py_DECREF(M_Button_List);
+ M_Button_List = NULL;
+ }
+}
+
+static PyObject *Method_Exit( PyObject * self )
{
SpaceScript *sc;
Script *script;
@@ -832,10 +895,6 @@ static PyObject *Method_Exit( PyObject * self, PyObject * args )
else
Py_RETURN_NONE;
- if( PyTuple_Size(args) )
- return EXPP_ReturnPyObjError( PyExc_AttributeError,
- "expected empty argument list" );
-
exit_pydraw( sc, 0 );
script = sc->script;
@@ -950,7 +1009,7 @@ static PyObject *Method_Redraw( PyObject * self, PyObject * args )
Py_RETURN_NONE;
}
-static PyObject *Method_Draw( PyObject * self, PyObject * args )
+static PyObject *Method_Draw( PyObject * self )
{
/*@ If forced drawing is disable queue a redraw event instead */
if( EXPP_disable_force_draw ) {
@@ -958,10 +1017,6 @@ static PyObject *Method_Draw( PyObject * self, PyObject * args )
Py_RETURN_NONE;
}
- if( PyTuple_Size(args) )
- return EXPP_ReturnPyObjError( PyExc_AttributeError,
- "expected empty argument list" );
-
scrarea_do_windraw( curarea );
screen_swapbuffers( );
@@ -976,21 +1031,24 @@ static PyObject *Method_Create( PyObject * self, PyObject * args )
char *newstr;
but = newbutton();
-
+ /* If this function dosnt sucseed this will need to be deallocated,
+ * make sure the type is NOT BSTRING_TYPE before deallocing -1 is ok.
+ * so we dont dealloc with an uninitialized value wich would be bad! */
if ( PyArg_ParseTuple( args, "fff", but->val.asvec, but->val.asvec+1, but->val.asvec+2 ) ) {
but->type = BVECTOR_TYPE;
- }
- else if ( PyArg_ParseTuple( args, "O!", &PyFloat_Type, &val ) ) {
+
+ } else if ( PyArg_ParseTuple( args, "O!", &PyFloat_Type, &val ) ) {
but->val.asfloat = (float)PyFloat_AS_DOUBLE(val);
but->type = BFLOAT_TYPE;
- }
- else if ( PyArg_ParseTuple( args, "O!", &PyInt_Type, &val ) ) {
+
+ } else if ( PyArg_ParseTuple( args, "O!", &PyInt_Type, &val ) ) {
but->val.asint = (int)PyInt_AS_LONG(val);
but->type = BINT_TYPE;
- }
- else if ( PyArg_ParseTuple( args, "s#", &newstr, &but->slen ) ) {
+
+ } else if ( PyArg_ParseTuple( args, "s#", &newstr, &but->slen ) ) {
if (but->slen + 1 > UI_MAX_DRAW_STR) {
- PyObject_DEL( (PyObject *) but );
+ but->type = -1;
+ Py_DECREF((PyObject *)but); /* will remove */
but = NULL;
PyErr_SetString( PyExc_TypeError, "string is longer then 399 chars");
} else {
@@ -998,9 +1056,10 @@ static PyObject *Method_Create( PyObject * self, PyObject * args )
but->val.asstr = MEM_mallocN( but->slen + 1, "button string" );
BLI_strncpy( but->val.asstr, newstr, but->slen+1 );
}
- }
- else {
- PyObject_DEL( (PyObject *) but );
+
+ } else {
+ but->type = -1;
+ Py_DECREF((PyObject *)but); /* will remove */
but = NULL;
PyErr_SetString( PyExc_TypeError, "expected string, float, int or 3-float tuple argument" );
}
@@ -1012,6 +1071,7 @@ static PyObject *Method_Create( PyObject * self, PyObject * args )
return (PyObject*) but;
}
+
static PyObject *Method_UIBlock( PyObject * self, PyObject * args )
{
PyObject *val = NULL;
@@ -1025,27 +1085,53 @@ static PyObject *Method_UIBlock( PyObject * self, PyObject * args )
if (uiblock)
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"cannot run more then 1 UIBlock at a time" );
+
+ BPy_Set_DrawButtonsList(PyList_New(0));
mywinset(G.curscreen->mainwin);
uiblock= uiNewBlock(&listb, "numbuts", UI_EMBOSS, UI_HELV, G.curscreen->mainwin);
uiBlockSetFlag(uiblock, UI_BLOCK_LOOP|UI_BLOCK_REDRAW);
result = PyObject_CallObject( val, Py_BuildValue( "()" ) );
-
+
if (!result) {
PyErr_Print( );
error( "Python script error: check console" );
} else {
+ /* copied from do_clever_numbuts in toolbox.c */
+
+ /* Clear all events so tooltips work, this is not ideal and
+ only needed because calls from the menu still have some events
+ left over when do_clever_numbuts is called.
+ Calls from keyshortcuts do not have this problem.*/
+ ScrArea *sa;
+ BWinEvent temp_bevt;
+ for (sa= G.curscreen->areabase.first; sa; sa= sa->next) {
+ if(sa->win) {
+ while( bwin_qread( sa->win, &temp_bevt ) ) {}
+ }
+ if(sa->headwin) {
+ while( bwin_qread( sa->headwin, &temp_bevt ) ) {}
+ }
+ }
+ /* Done clearing events */
+
uiBoundsBlock(uiblock, 5);
uiDoBlocks(&listb, 0);
}
uiFreeBlocks(&listb);
uiblock = NULL;
+ BPy_Free_DrawButtonsList(); /*clear all temp button references*/
Py_XDECREF( result );
Py_RETURN_NONE;
}
+void Set_uiBlock(uiBlock *block)
+{
+ uiblock = block;
+}
+
static uiBlock *Get_uiBlock( void )
{
char butblock[32];
@@ -1114,7 +1200,7 @@ static PyObject *Method_Button( PyObject * self, PyObject * args )
block = Get_uiBlock( );
if( block ) {
uiBut *ubut = uiDefBut( block, BUT, event, name, (short)x, (short)y, (short)w, (short)h, 0, 0, 0, 0, 0, tip );
- set_pycallback(ubut, callback);
+ set_pycallback(ubut, callback, NULL);
}
Py_RETURN_NONE;
}
@@ -1138,12 +1224,13 @@ static PyObject *Method_Menu( PyObject * self, PyObject * args )
but = newbutton( );
but->type = BINT_TYPE;
but->val.asint = def;
-
+ if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP);
+
block = Get_uiBlock( );
if( block ) {
uiBut *ubut = uiDefButI( block, MENU, event, name, (short)x, (short)y, (short)w, (short)h,
- &but->val.asint, 0, 0, 0, 0, tip );
- set_pycallback(ubut, callback);
+ &but->val.asint, 0, 0, 0, 0, but->tooltip );
+ set_pycallback(ubut, callback, but);
}
return ( PyObject * ) but;
}
@@ -1167,12 +1254,13 @@ static PyObject *Method_Toggle( PyObject * self, PyObject * args )
but = newbutton( );
but->type = BINT_TYPE;
but->val.asint = def;
-
+ if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP);
+
block = Get_uiBlock( );
if( block ) {
uiBut *ubut = uiDefButI( block, TOG, event, name, (short)x, (short)y, (short)w, (short)h,
- &but->val.asint, 0, 0, 0, 0, tip );
- set_pycallback(ubut, callback);
+ &but->val.asint, 0, 0, 0, 0, but->tooltip );
+ set_pycallback(ubut, callback, but);
}
return ( PyObject * ) but;
}
@@ -1200,13 +1288,13 @@ static void py_slider_update( void *butv, void *data2_unused )
disable_where_script( 1 );
spacescript_do_pywin_buttons( curarea->spacedata.first,
- (unsigned short)uiButGetRetVal( but ) );
+ (unsigned short)uiButGetRetVal( but ) - EXPP_BUTTON_EVENTS_OFFSET );
/* XXX useless right now, investigate better before a bcon 5 */
ret = M_Window_Redraw( 0, ref );
- Py_DECREF(ref);
- if (ret) { Py_DECREF(ret); }
+ Py_XDECREF(ref);
+ Py_XDECREF(ret);
disable_where_script( 0 );
@@ -1230,6 +1318,9 @@ static PyObject *Method_Slider( PyObject * self, PyObject * args )
"expected a string, five ints, three PyObjects\n\
and optionally int, string and callback arguments" );
+ if(realtime && uiblock)
+ realtime = 0; /* realtime dosnt work with UIBlock */
+
UI_METHOD_ERRORCHECK;
but = newbutton( );
@@ -1243,17 +1334,18 @@ static PyObject *Method_Slider( PyObject * self, PyObject * args )
but->type = BFLOAT_TYPE;
but->val.asfloat = ini;
-
+ if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP);
+
block = Get_uiBlock( );
if( block ) {
uiBut *ubut;
ubut = uiDefButF( block, NUMSLI, event, name, (short)x, (short)y, (short)w,
(short)h, &but->val.asfloat, min, max, 0, 0,
- tip );
+ but->tooltip );
if( realtime )
uiButSetFunc( ubut, py_slider_update, ubut, NULL );
else
- set_pycallback(ubut, callback);
+ set_pycallback(ubut, callback, but);
}
} else {
int ini, min, max;
@@ -1264,17 +1356,18 @@ static PyObject *Method_Slider( PyObject * self, PyObject * args )
but->type = BINT_TYPE;
but->val.asint = ini;
-
+ if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP);
+
block = Get_uiBlock( );
if( block ) {
uiBut *ubut;
ubut = uiDefButI( block, NUMSLI, event, name, (short)x, (short)y, (short)w,
(short)h, &but->val.asint, (float)min, (float)max, 0, 0,
- tip );
+ but->tooltip );
if( realtime )
uiButSetFunc( ubut, py_slider_update, ubut, NULL );
else
- set_pycallback(ubut, callback);
+ set_pycallback(ubut, callback, but);
}
}
return ( PyObject * ) but;
@@ -1307,7 +1400,8 @@ another int and string as arguments" );
"button event argument must be in the range [0, 16382]");
but = newbutton( );
-
+ if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP);
+
if( PyFloat_Check( inio ) )
but->type = BFLOAT_TYPE;
else
@@ -1323,13 +1417,13 @@ another int and string as arguments" );
if( but->type == BFLOAT_TYPE ) {
but->val.asfloat = ini;
ubut = uiDefButF( block, SCROLL, event, "", (short)x, (short)y, (short)w, (short)h,
- &but->val.asfloat, min, max, 0, 0, tip );
+ &but->val.asfloat, min, max, 0, 0, but->tooltip );
if( realtime )
uiButSetFunc( ubut, py_slider_update, ubut, NULL );
} else {
but->val.asint = (int)ini;
ubut = uiDefButI( block, SCROLL, event, "", (short)x, (short)y, (short)w, (short)h,
- &but->val.asint, min, max, 0, 0, tip );
+ &but->val.asint, min, max, 0, 0, but->tooltip );
if( realtime )
uiButSetFunc( ubut, py_slider_update, ubut, NULL );
}
@@ -1373,12 +1467,13 @@ static PyObject *Method_ColorPicker( PyObject * self, PyObject * args )
but->val.asvec[0] = col[0];
but->val.asvec[1] = col[1];
but->val.asvec[2] = col[2];
+ if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP);
block = Get_uiBlock( );
if( block ) {
uiBut *ubut;
- ubut = uiDefButF( block, COL, event, "", x, y, w, h, but->val.asvec, 0, 0, 0, 0, tip);
- set_pycallback(ubut, callback);
+ ubut = uiDefButF( block, COL, event, "", x, y, w, h, but->val.asvec, 0, 0, 0, 0, but->tooltip);
+ set_pycallback(ubut, callback, but);
}
return ( PyObject * ) but;
@@ -1412,7 +1507,8 @@ static PyObject *Method_Normal( PyObject * self, PyObject * args )
return EXPP_ReturnPyObjError( PyExc_ValueError, USAGE_ERROR);
but = newbutton();
-
+ if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP);
+
but->type = BVECTOR_TYPE;
but->val.asvec[0] = nor[0];
but->val.asvec[1] = nor[1];
@@ -1421,8 +1517,8 @@ static PyObject *Method_Normal( PyObject * self, PyObject * args )
block = Get_uiBlock( );
if( block ) {
uiBut *ubut;
- ubut = uiDefButF( block, BUT_NORMAL, event, "", x, y, w, h, but->val.asvec, 0.0f, 1.0f, 0, 0, tip);
- set_pycallback(ubut, callback);
+ ubut = uiDefButF( block, BUT_NORMAL, event, "", x, y, w, h, but->val.asvec, 0.0f, 1.0f, 0, 0, but->tooltip);
+ set_pycallback(ubut, callback, but);
}
return ( PyObject * ) but;
@@ -1448,6 +1544,7 @@ static PyObject *Method_Number( PyObject * self, PyObject * args )
UI_METHOD_ERRORCHECK;
but = newbutton( );
+ if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP);
block = Get_uiBlock( );
if( PyFloat_Check( inio ) ) {
@@ -1461,18 +1558,18 @@ static PyObject *Method_Number( PyObject * self, PyObject * args )
if (!range) range= 1.0f; /* avoid any odd errors */
/* set the precission to display*/
- if (range>=100.0f) precission=1.0f;
- else if (range>=10.0f) precission=2.0f;
- else if (range>=1.0f) precission=3.0f;
- else precission=4.0f;
-
+ if (range>=1000.0f) precission=1.0f;
+ else if (range>=100.0f) precission=2.0f;
+ else if (range>=10.0f) precission=3.0f;
+ else precission=4.0f;
+
but->type = BFLOAT_TYPE;
but->val.asfloat = ini;
if( block )
ubut= uiDefButF( block, NUM, event, name, (short)x, (short)y, (short)w, (short)h,
- &but->val.asfloat, min, max, 10*range, precission, tip );
+ &but->val.asfloat, min, max, 10*range, precission, but->tooltip );
} else {
int ini, min, max;
@@ -1485,10 +1582,10 @@ static PyObject *Method_Number( PyObject * self, PyObject * args )
if( block )
ubut= uiDefButI( block, NUM, event, name, (short)x, (short)y, (short)w, (short)h,
- &but->val.asint, (float)min, (float)max, 0, 0, tip );
+ &but->val.asint, (float)min, (float)max, 0, 0, but->tooltip );
}
- if (ubut) set_pycallback(ubut, callback);
+ if (ubut) set_pycallback(ubut, callback, but);
return ( PyObject * ) but;
}
@@ -1517,11 +1614,12 @@ static PyObject *Method_String( PyObject * self, PyObject * args )
real_len = strlen(newstr);
if (real_len > len) real_len = len;
-
+
but = newbutton( );
but->type = BSTRING_TYPE;
but->slen = len;
but->val.asstr = MEM_mallocN( len + 1, "pybutton str" );
+ if (tip) strncpy(but->tooltip, tip, BPY_MAX_TOOLTIP);
BLI_strncpy( but->val.asstr, newstr, len + 1); /* adds '\0' */
but->val.asstr[real_len] = '\0';
@@ -1532,8 +1630,8 @@ static PyObject *Method_String( PyObject * self, PyObject * args )
block = Get_uiBlock( );
if( block ) {
uiBut *ubut = uiDefBut( block, TEX, event, info_str, (short)x, (short)y, (short)w, (short)h,
- but->val.asstr, 0, (float)len, 0, 0, tip );
- set_pycallback(ubut, callback);
+ but->val.asstr, 0, (float)len, 0, 0, but->tooltip );
+ set_pycallback(ubut, callback, but);
}
return ( PyObject * ) but;
}
diff --git a/source/blender/python/api2_2x/Draw.h b/source/blender/python/api2_2x/Draw.h
index d852c15d28d..12712713d1d 100644
--- a/source/blender/python/api2_2x/Draw.h
+++ b/source/blender/python/api2_2x/Draw.h
@@ -57,11 +57,13 @@ typedef struct _Button {
char *asstr;
float asvec[3];
} val;
- char *tooltip;
+ char tooltip[256];
} Button;
-#define BINT_TYPE 1
-#define BFLOAT_TYPE 2
+#define BPY_MAX_TOOLTIP 255
+
+#define BINT_TYPE 1
+#define BFLOAT_TYPE 2
#define BSTRING_TYPE 3
#define BVECTOR_TYPE 4
diff --git a/source/blender/python/api2_2x/Effect.c b/source/blender/python/api2_2x/Effect.c
index 8c23a4d1544..ce6b553da0d 100644
--- a/source/blender/python/api2_2x/Effect.c
+++ b/source/blender/python/api2_2x/Effect.c
@@ -774,11 +774,7 @@ PyObject *Effect_Init( void )
static PyObject *Effect_getType( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->effect->type );
- if( attr )
- return attr;
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get mode attribute" ) );
+ return PyInt_FromLong( ( long ) self->effect->type );
}
/* does nothing since there is only one type of effect */
@@ -800,28 +796,12 @@ static int Effect_setStype( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getStype( BPy_Effect * self )
{
- PyObject *attr;
- long stype = (long)( self->effect->stype );
-
- attr = PyInt_FromLong( stype );
- if( attr ) return attr;
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.stype attribute" );
+ return PyInt_FromLong( (long)( self->effect->stype ) );
}
static PyObject *Effect_getFlag( BPy_Effect * self )
{
- PyObject *attr;
- /* toggle "Verts" setting because clear is "on" */
- long flag = (long)( self->effect->flag ^ PAF_OFACE );
-
- attr = PyInt_FromLong( flag );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.flag attribute" );
+ return PyInt_FromLong( (long)( self->effect->flag ^ PAF_OFACE ) );
}
static int Effect_setFlag( BPy_Effect * self, PyObject * args )
@@ -852,13 +832,7 @@ static int Effect_setFlag( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getSta( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( self->effect->sta );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.sta attribute" );
+ return PyFloat_FromDouble( self->effect->sta );
}
static int Effect_setSta( BPy_Effect * self, PyObject * args )
@@ -869,15 +843,7 @@ static int Effect_setSta( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getEnd( BPy_Effect * self )
{
- PyObject *attr;
- PartEff *ptr = ( PartEff * ) self->effect;
-
- attr = PyFloat_FromDouble( ptr->end );
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.end attribute" );
+ return PyFloat_FromDouble( ((PartEff *) self->effect)->end );
}
static int Effect_setEnd( BPy_Effect * self, PyObject * args )
@@ -895,13 +861,7 @@ static int Effect_setEnd( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getLifetime( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( self->effect->lifetime );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.lifetime attribute" );
+ return PyFloat_FromDouble( self->effect->lifetime );
}
static int Effect_setLifetime( BPy_Effect * self, PyObject * args )
@@ -912,13 +872,7 @@ static int Effect_setLifetime( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getNormfac( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( self->effect->normfac );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.normfac attribute" );
+ return PyFloat_FromDouble( self->effect->normfac );
}
static int Effect_setNormfac( BPy_Effect * self, PyObject * args )
@@ -929,13 +883,7 @@ static int Effect_setNormfac( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getObfac( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( self->effect->obfac );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.obfac attribute" );
+ return PyFloat_FromDouble( self->effect->obfac );
}
static int Effect_setObfac( BPy_Effect * self, PyObject * args )
@@ -946,13 +894,7 @@ static int Effect_setObfac( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getRandfac( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( self->effect->randfac );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.randfac attribute" );
+ return PyFloat_FromDouble( self->effect->randfac );
}
static int Effect_setRandfac( BPy_Effect * self, PyObject * args )
@@ -963,13 +905,7 @@ static int Effect_setRandfac( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getTexfac( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( self->effect->texfac );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.texfac attribute" );
+ return PyFloat_FromDouble( self->effect->texfac );
}
static int Effect_setTexfac( BPy_Effect * self, PyObject * args )
@@ -980,13 +916,7 @@ static int Effect_setTexfac( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getRandlife( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( self->effect->randlife );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.randlife attribute" );
+ return PyFloat_FromDouble( self->effect->randlife );
}
static int Effect_setRandlife( BPy_Effect * self, PyObject * args )
@@ -997,13 +927,7 @@ static int Effect_setRandlife( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getNabla( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( self->effect->nabla );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.nabla attribute" );
+ return PyFloat_FromDouble( self->effect->nabla );
}
static int Effect_setNabla( BPy_Effect * self, PyObject * args )
@@ -1014,13 +938,7 @@ static int Effect_setNabla( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getVectsize( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( self->effect->vectsize );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.vectsize attribute" );
+ return PyFloat_FromDouble( self->effect->vectsize );
}
static int Effect_setVectsize( BPy_Effect * self, PyObject * args )
@@ -1031,13 +949,7 @@ static int Effect_setVectsize( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getTotpart( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( self->effect->totpart );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.totpart attribute" );
+ return PyInt_FromLong( self->effect->totpart );
}
static int Effect_setTotpart( BPy_Effect * self, PyObject * args )
@@ -1048,13 +960,7 @@ static int Effect_setTotpart( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getTotkey( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( self->effect->totkey );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.totkey attribute" );
+ return PyInt_FromLong( self->effect->totkey );
}
static int Effect_setTotkey( BPy_Effect * self, PyObject * args )
@@ -1065,13 +971,7 @@ static int Effect_setTotkey( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getSeed( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( self->effect->seed );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.seed attribute" );
+ return PyInt_FromLong( self->effect->seed );
}
static int Effect_setSeed( BPy_Effect * self, PyObject * args )
@@ -1082,14 +982,8 @@ static int Effect_setSeed( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getForce( BPy_Effect * self )
{
- PyObject *attr = Py_BuildValue( "(f,f,f)", self->effect->force[0],
+ return Py_BuildValue( "(f,f,f)", self->effect->force[0],
self->effect->force[1], self->effect->force[2] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.force attribute" );
}
static int Effect_setForce( BPy_Effect * self, PyObject * args )
@@ -1111,15 +1005,9 @@ static int Effect_setForce( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getMult( BPy_Effect * self )
{
- PyObject *attr = Py_BuildValue( "(f,f,f,f)", self->effect->mult[0],
+ return Py_BuildValue( "(f,f,f,f)", self->effect->mult[0],
self->effect->mult[1], self->effect->mult[2],
self->effect->mult[3] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.mult attribute" );
}
static int Effect_setMult( BPy_Effect * self, PyObject * args )
@@ -1141,15 +1029,9 @@ static int Effect_setMult( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getLife( BPy_Effect * self )
{
- PyObject *attr = Py_BuildValue( "(f,f,f,f)", self->effect->life[0],
+ return Py_BuildValue( "(f,f,f,f)", self->effect->life[0],
self->effect->life[1], self->effect->life[2],
self->effect->life[3] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.life attribute" );
}
static int Effect_setLife( BPy_Effect * self, PyObject * args )
@@ -1171,15 +1053,9 @@ static int Effect_setLife( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getChild( BPy_Effect * self )
{
- PyObject *attr = Py_BuildValue( "(h,h,h,h)", self->effect->child[0],
+ return Py_BuildValue( "(h,h,h,h)", self->effect->child[0],
self->effect->child[1], self->effect->child[2],
self->effect->child[3] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.child attribute" );
}
@@ -1202,15 +1078,9 @@ static int Effect_setChild( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getChildMat( BPy_Effect * self )
{
- PyObject *attr = Py_BuildValue( "(h,h,h,h)", self->effect->mat[0],
+ return Py_BuildValue( "(h,h,h,h)", self->effect->mat[0],
self->effect->mat[1], self->effect->mat[2],
self->effect->mat[3] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.childMat attribute" );
}
static int Effect_setChildMat( BPy_Effect * self, PyObject * args )
@@ -1232,14 +1102,8 @@ static int Effect_setChildMat( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getDefvec( BPy_Effect * self )
{
- PyObject *attr = Py_BuildValue( "(f,f,f)", self->effect->defvec[0],
+ return Py_BuildValue( "(f,f,f)", self->effect->defvec[0],
self->effect->defvec[1], self->effect->defvec[2] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.defvec attribute" );
}
static int Effect_setDefvec( BPy_Effect * self, PyObject * args )
@@ -1262,13 +1126,7 @@ static int Effect_setDefvec( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getJitter( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( ( long )self->effect->userjit );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.jitter attribute" );
+ return PyInt_FromLong( ( long )self->effect->userjit );
}
static int Effect_setJitter( BPy_Effect * self, PyObject * args )
@@ -1279,13 +1137,7 @@ static int Effect_setJitter( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getDispMat( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( ( long )self->effect->omat );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.dispMat attribute" );
+ return PyInt_FromLong( ( long )self->effect->omat );
}
static int Effect_setDispMat( BPy_Effect * self, PyObject * args )
@@ -1296,13 +1148,7 @@ static int Effect_setDispMat( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getEmissionTex( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( ( long )self->effect->timetex );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.emissionTex attribute" );
+ return PyInt_FromLong( ( long )self->effect->timetex );
}
static int Effect_setEmissionTex( BPy_Effect * self, PyObject * args )
@@ -1313,13 +1159,7 @@ static int Effect_setEmissionTex( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getForceTex( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( ( long )self->effect->speedtex );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.forceTex attribute" );
+ return PyInt_FromLong( ( long )self->effect->speedtex );
}
static int Effect_setForceTex( BPy_Effect * self, PyObject * args )
@@ -1330,13 +1170,7 @@ static int Effect_setForceTex( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getSpeedType( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( ( long )self->effect->texmap );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.speedType attribute" );
+ return PyInt_FromLong( ( long )self->effect->texmap );
}
static int Effect_setSpeedType( BPy_Effect * self, PyObject * args )
@@ -1348,13 +1182,7 @@ static int Effect_setSpeedType( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getDamping( BPy_Effect * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double )self->effect->damp );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.damping attribute" );
+ return PyFloat_FromDouble( ( double )self->effect->damp );
}
static int Effect_setDamping( BPy_Effect * self, PyObject * args )
@@ -1365,13 +1193,7 @@ static int Effect_setDamping( BPy_Effect * self, PyObject * args )
static PyObject *Effect_getVertGroup( BPy_Effect * self )
{
- PyObject *attr = PyString_FromString( self->effect->vgroupname );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.vGroup attribute" );
+ return PyString_FromString( self->effect->vgroupname );
}
@@ -1399,13 +1221,7 @@ static int Effect_setVertGroup( BPy_Effect * self, PyObject * value )
static PyObject *Effect_getSpeedVertGroup( BPy_Effect * self )
{
- PyObject *attr = PyString_FromString( self->effect->vgroupname_v );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.speedVGroup attribute" );
+ return PyString_FromString( self->effect->vgroupname_v );
}
static int Effect_setSpeedVertGroup( BPy_Effect * self, PyObject * value )
@@ -1438,13 +1254,7 @@ static int Effect_setSpeedVertGroup( BPy_Effect * self, PyObject * value )
/*****************************************************************************/
static PyObject *Effect_getDisp( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( ( long )self->effect->disp );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.disp attribute" );
+ return PyInt_FromLong( ( long )self->effect->disp );
}
static int Effect_setDisp( BPy_Effect * self, PyObject * args )
@@ -1461,13 +1271,7 @@ static int Effect_setDisp( BPy_Effect * self, PyObject * args )
/*****************************************************************************/
static PyObject *Effect_getStaticStep( BPy_Effect * self )
{
- PyObject *attr = PyInt_FromLong( ( long )self->effect->staticstep );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Effect.staticStep attribute" );
+ return PyInt_FromLong( ( long )self->effect->staticstep );
}
static int Effect_setStaticStep( BPy_Effect * self , PyObject * args )
@@ -1534,7 +1338,7 @@ static PyObject *Effect_getParticlesLoc( BPy_Effect * self )
if( !list )
return EXPP_ReturnPyObjError( PyExc_MemoryError, "PyList() failed" );
- c_time= bsystem_time( ob, 0, cfra, p_time );
+ c_time= bsystem_time( ob, cfra, p_time );
for( a=0; a < paf->totpart; a++, pa += paf->totkey ) {
@@ -1563,7 +1367,7 @@ static PyObject *Effect_getParticlesLoc( BPy_Effect * self )
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"Couldn't append item to PyList" );
}
-
+ Py_DECREF( strand_list );
} else {
if(c_time > pa->time && c_time < pa->time+pa->lifetime ) {
/* vector particles are a tuple of 2 vectors */
diff --git a/source/blender/python/api2_2x/Font.c b/source/blender/python/api2_2x/Font.c
index e27f5fa3dcd..61edac2841a 100644
--- a/source/blender/python/api2_2x/Font.c
+++ b/source/blender/python/api2_2x/Font.c
@@ -178,15 +178,7 @@ PyObject *M_Font_Load( PyObject * self, PyObject * value )
/*--------------- BPy_Font.filename-------------------------------------*/
static PyObject *Font_getFilename( BPy_Font * self )
{
- PyObject *attr = NULL;
-
- if( self->font )
- attr = PyString_FromString( self->font->name );
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Font.filename attribute" ) );
+ return PyString_FromString( self->font->name );
}
static int Font_setFilename( BPy_Font * self, PyObject * value )
diff --git a/source/blender/python/api2_2x/Geometry.c b/source/blender/python/api2_2x/Geometry.c
index fcfe1eeae04..344fdcf20a9 100644
--- a/source/blender/python/api2_2x/Geometry.c
+++ b/source/blender/python/api2_2x/Geometry.c
@@ -47,6 +47,7 @@
#include "BKE_utildefines.h"
#include "BLI_boxpack2d.h"
+#include "BLI_arithb.h"
#define SWAP_FLOAT(a,b,tmp) tmp=a; a=b; b=tmp
#define eul 0.000001
@@ -54,19 +55,23 @@
/*-- forward declarations -- */
static PyObject *M_Geometry_PolyFill( PyObject * self, PyObject * polyLineSeq );
static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args );
+static PyObject *M_Geometry_ClosestPointOnLine( PyObject * self, PyObject * args );
static PyObject *M_Geometry_PointInTriangle2D( PyObject * self, PyObject * args );
static PyObject *M_Geometry_BoxPack2D( PyObject * self, PyObject * args );
+
/*-------------------------DOC STRINGS ---------------------------*/
static char M_Geometry_doc[] = "The Blender Geometry module\n\n";
static char M_Geometry_PolyFill_doc[] = "(veclist_list) - takes a list of polylines (each point a vector) and returns the point indicies for a polyline filled with triangles";
static char M_Geometry_LineIntersect2D_doc[] = "(lineA_p1, lineA_p2, lineB_p1, lineB_p2) - takes 2 lines (as 4 vectors) and returns a vector for their point of intersection or None";
+static char M_Geometry_ClosestPointOnLine_doc[] = "(pt, line_p1, line_p2) - takes a point and a line and returns a (Vector, Bool) for the point on the line, and the bool so you can know if the point was between the 2 points";
static char M_Geometry_PointInTriangle2D_doc[] = "(pt, tri_p1, tri_p2, tri_p3) - takes 4 vectors, one is the point and the next 3 define the triabgle, only the x and y are used from the vectors";
static char M_Geometry_BoxPack2D_doc[] = "";
/*-----------------------METHOD DEFINITIONS ----------------------*/
struct PyMethodDef M_Geometry_methods[] = {
{"PolyFill", ( PyCFunction ) M_Geometry_PolyFill, METH_O, M_Geometry_PolyFill_doc},
{"LineIntersect2D", ( PyCFunction ) M_Geometry_LineIntersect2D, METH_VARARGS, M_Geometry_LineIntersect2D_doc},
+ {"ClosestPointOnLine", ( PyCFunction ) M_Geometry_ClosestPointOnLine, METH_VARARGS, M_Geometry_ClosestPointOnLine_doc},
{"PointInTriangle2D", ( PyCFunction ) M_Geometry_PointInTriangle2D, METH_VARARGS, M_Geometry_PointInTriangle2D_doc},
{"BoxPack2D", ( PyCFunction ) M_Geometry_BoxPack2D, METH_O, M_Geometry_BoxPack2D_doc},
{NULL, NULL, 0, NULL}
@@ -277,6 +282,40 @@ static PyObject *M_Geometry_LineIntersect2D( PyObject * self, PyObject * args )
Py_RETURN_NONE;
}
+static PyObject *M_Geometry_ClosestPointOnLine( PyObject * self, PyObject * args )
+{
+ VectorObject *pt, *line_1, *line_2;
+ float pt_in[3], pt_out[3], l1[3], l2[3];
+ float lambda;
+ PyObject *ret, *val1, *val2;
+
+ if( !PyArg_ParseTuple ( args, "O!O!O!",
+ &vector_Type, &pt,
+ &vector_Type, &line_1,
+ &vector_Type, &line_2)
+ )
+ return ( EXPP_ReturnPyObjError
+ ( PyExc_TypeError, "expected 3 vector types\n" ) );
+
+ /* accept 2d verts */
+ if (pt->size==3) { VECCOPY(pt_in, pt->vec);}
+ else { pt_in[2]=0.0; VECCOPY2D(pt_in, pt->vec) }
+
+ if (line_1->size==3) { VECCOPY(l1, line_1->vec);}
+ else { l1[2]=0.0; VECCOPY2D(l1, line_1->vec) }
+
+ if (line_2->size==3) { VECCOPY(l2, line_2->vec);}
+ else { l2[2]=0.0; VECCOPY2D(l2, line_2->vec) }
+
+ /* do the calculation */
+ lambda = lambda_cp_line_ex(pt_in, l1, l2, pt_out);
+
+ ret = PyTuple_New(2);
+ PyTuple_SET_ITEM( ret, 0, newVectorObject(pt_out, 3, Py_NEW) );
+ PyTuple_SET_ITEM( ret, 1, PyFloat_FromDouble(lambda) );
+ return ret;
+}
+
#define SIDE_OF_LINE(pa,pb,pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
#define POINT_IN_TRI(p0,p1,p2,p3) ((SIDE_OF_LINE(p1,p2,p0)>=0) && (SIDE_OF_LINE(p2,p3,p0)>=0) && (SIDE_OF_LINE(p3,p1,p0)>=0))
diff --git a/source/blender/python/api2_2x/Group.c b/source/blender/python/api2_2x/Group.c
index 012e0cb540c..26e5edd0733 100755..100644
--- a/source/blender/python/api2_2x/Group.c
+++ b/source/blender/python/api2_2x/Group.c
@@ -220,7 +220,7 @@ static int Group_setLayers( BPy_Group * self, PyObject * value )
GROUP_DEL_CHECK_INT(self);
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected an integer (bitmask) as argument" );
diff --git a/source/blender/python/api2_2x/Group.h b/source/blender/python/api2_2x/Group.h
index 0512623b5f8..0512623b5f8 100755..100644
--- a/source/blender/python/api2_2x/Group.h
+++ b/source/blender/python/api2_2x/Group.h
diff --git a/source/blender/python/api2_2x/Image.c b/source/blender/python/api2_2x/Image.c
index ab2f573519a..ddfc17c7deb 100644
--- a/source/blender/python/api2_2x/Image.c
+++ b/source/blender/python/api2_2x/Image.c
@@ -612,19 +612,12 @@ static PyObject *Image_setPixelI( BPy_Image * self, PyObject * args )
static PyObject *Image_getMaxXY( BPy_Image * self )
{
ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL);
- PyObject *attr;
if( !ibuf || !ibuf->rect ) /* didn't work */
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"couldn't load image data in Blender" );
- attr = Py_BuildValue( "[i,i]", ibuf->x, ibuf->y );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "could not determine max x or y" );
+ return Py_BuildValue( "[i,i]", ibuf->x, ibuf->y );
}
@@ -633,19 +626,12 @@ static PyObject *Image_getMaxXY( BPy_Image * self )
static PyObject *Image_getMinXY( BPy_Image * self )
{
ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL);
- PyObject *attr;
if( !ibuf || !ibuf->rect ) /* didn't work */
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"couldn't load image data in Blender" );
- attr = Py_BuildValue( "[i,i]", ibuf->xorig, ibuf->yorig );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "could not determine min x or y" );
+ return Py_BuildValue( "[i,i]", ibuf->xorig, ibuf->yorig );
}
/* unpack image */
@@ -805,13 +791,7 @@ Image *Image_FromPyObject( PyObject * pyobj )
static PyObject *Image_getFilename( BPy_Image * self )
{
- PyObject *attr = PyString_FromString( self->image->name );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Image.filename attribute" ) );
+ return PyString_FromString( self->image->name );
}
static PyObject *Image_getSize( BPy_Image * self )
@@ -837,86 +817,43 @@ static PyObject *Image_getSize( BPy_Image * self )
static PyObject *Image_getDepth( BPy_Image * self )
{
ImBuf *ibuf= BKE_image_get_ibuf(self->image, NULL);
- PyObject *attr;
if( !ibuf ) /* didn't work */
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"couldn't load image data in Blender" );
- attr = PyInt_FromLong( (long)ibuf->depth );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Image.depth attribute" );
+ return PyInt_FromLong( (long)ibuf->depth );
}
static PyObject *Image_getXRep( BPy_Image * self )
{
- PyObject *attr = PyInt_FromLong( self->image->xrep );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Image.xrep attribute" );
+ return PyInt_FromLong( self->image->xrep );
}
static PyObject *Image_getYRep( BPy_Image * self )
{
- PyObject *attr = PyInt_FromLong( self->image->yrep );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Image.yrep attribute" );
+ return PyInt_FromLong( self->image->yrep );
}
static PyObject *Image_getStart( BPy_Image * self )
{
- PyObject *attr = PyInt_FromLong( self->image->twsta );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Image.start attribute" );
+ return PyInt_FromLong( self->image->twsta );
}
static PyObject *Image_getEnd( BPy_Image * self )
{
- PyObject *attr = PyInt_FromLong( self->image->twend );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Image.end attribute" );
+ return PyInt_FromLong( self->image->twend );
}
static PyObject *Image_getSpeed( BPy_Image * self )
{
- PyObject *attr = PyInt_FromLong( self->image->animspeed );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Image.speed attribute" );
+ return PyInt_FromLong( self->image->animspeed );
}
static PyObject *Image_getBindCode( BPy_Image * self )
{
- PyObject *attr = PyLong_FromUnsignedLong( self->image->bindcode );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Image.bindcode attribute" );
+ return PyLong_FromUnsignedLong( self->image->bindcode );
}
static PyObject *Image_reload( BPy_Image * self )
@@ -1158,7 +1095,12 @@ static int Image_setSource( BPy_Image *self, PyObject *args)
static int Image_setFlag(BPy_Image *self, PyObject *value, void *flag)
{
- if ( PyObject_IsTrue(value) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if ( param )
self->image->flag |= (int)flag;
else
self->image->flag &= ~(int)flag;
@@ -1167,7 +1109,12 @@ static int Image_setFlag(BPy_Image *self, PyObject *value, void *flag)
static int Image_setFlagTpage(BPy_Image *self, PyObject *value, void *flag)
{
- if ( PyObject_IsTrue(value) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if ( param )
self->image->tpageflag |= (int)flag;
else
self->image->tpageflag &= ~(int)flag;
@@ -1179,7 +1126,6 @@ static int Image_setFlagTpage(BPy_Image *self, PyObject *value, void *flag)
*/
static PyObject *getIntAttr( BPy_Image *self, void *type )
{
- PyObject *attr = NULL;
int param;
struct Image *image = self->image;
@@ -1210,13 +1156,7 @@ static PyObject *getIntAttr( BPy_Image *self, void *type )
"undefined type in getIntAttr" );
}
- attr = PyInt_FromLong( param );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "PyInt_FromLong() failed!" );
+ return PyInt_FromLong( param );
}
diff --git a/source/blender/python/api2_2x/Ipo.c b/source/blender/python/api2_2x/Ipo.c
index 45b6f8a2c79..9b2fd082bee 100644
--- a/source/blender/python/api2_2x/Ipo.c
+++ b/source/blender/python/api2_2x/Ipo.c
@@ -806,18 +806,12 @@ static PyObject *M_Ipo_Recalc( PyObject * self_unused, PyObject * value )
/*****************************************************************************/
static PyObject *Ipo_getBlocktype( BPy_Ipo * self )
{
- PyObject *attr = PyInt_FromLong( self->ipo->blocktype );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Ipo.blocktype attribute" );
+ return PyInt_FromLong( self->ipo->blocktype );
}
static int Ipo_setBlocktype( BPy_Ipo * self, PyObject * args )
{
- if( !PyInt_CheckExact( args ) )
+ if( !PyInt_Check( args ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument" );
@@ -1489,7 +1483,7 @@ static int Ipo_setIpoCurveByName( BPy_Ipo * self, PyObject * key,
icu->flag |= IPO_VISIBLE|IPO_AUTO_HORIZ;
set_icu_vars( icu );
BLI_addtail( &(ipo->curve), icu);
- insert_vert_ipo( icu, time, curval );
+ insert_vert_icu( icu, time, curval, 0);
allspace( REMAKEIPO, 0 );
EXPP_allqueue( REDRAWIPO, 0 );
diff --git a/source/blender/python/api2_2x/Ipocurve.c b/source/blender/python/api2_2x/Ipocurve.c
index bbc8e8ffc4e..b8f3c3f6dd0 100644
--- a/source/blender/python/api2_2x/Ipocurve.c
+++ b/source/blender/python/api2_2x/Ipocurve.c
@@ -531,7 +531,7 @@ static PyObject *IpoCurve_append( C_IpoCurve * self, PyObject * value )
Py_DECREF( xobj );
y = (float)PyFloat_AsDouble( yobj );
Py_DECREF( yobj );
- insert_vert_ipo( icu, x, y);
+ insert_vert_icu( icu, x, y, 0);
}
Py_RETURN_NONE;
@@ -745,7 +745,7 @@ static int IpoCurve_setCurval( C_IpoCurve * self, PyObject * key,
/* insert a key at the specified time */
- insert_vert_ipo( self->ipocurve, time, curval );
+ insert_vert_icu( self->ipocurve, time, curval, 0);
allspace(REMAKEIPO, 0);
return 0;
}
@@ -796,7 +796,7 @@ static int IpoCurve_setDriver( C_IpoCurve * self, PyObject * args )
{
IpoCurve *ipo = self->ipocurve;
int type;
- if( !PyInt_CheckExact( args ) )
+ if( !PyInt_Check( args ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument 0 or 1 " );
@@ -879,7 +879,7 @@ static int IpoCurve_setDriverChannel( C_IpoCurve * self, PyObject * args )
return EXPP_ReturnIntError( PyExc_RuntimeError,
"This IpoCurve does not have an active driver" );
- if( !PyInt_CheckExact( args ) )
+ if( !PyInt_Check( args ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument" );
@@ -998,13 +998,7 @@ PyObject *IpoCurve_Init( void )
static PyObject *IpoCurve_newgetInterp( C_IpoCurve * self )
{
- PyObject *attr = PyInt_FromLong( self->ipocurve->ipo );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get IpoCurve.interp atrtribute" );
+ return PyInt_FromLong( self->ipocurve->ipo );
}
static int IpoCurve_newsetInterp( C_IpoCurve * self, PyObject * value )
@@ -1015,13 +1009,7 @@ static int IpoCurve_newsetInterp( C_IpoCurve * self, PyObject * value )
static PyObject *IpoCurve_newgetExtend( C_IpoCurve * self )
{
- PyObject *attr = PyInt_FromLong( self->ipocurve->extrap );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get IpoCurve.extend atrtribute" );
+ return PyInt_FromLong( self->ipocurve->extrap );
}
static int IpoCurve_newsetExtend( C_IpoCurve * self, PyObject * value )
@@ -1041,6 +1029,9 @@ static PyObject *IpoCurve_getFlag( C_IpoCurve * self, void *type )
static int IpoCurve_setFlag( C_IpoCurve * self, PyObject *value, void *type )
{
int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
if (param)
self->ipocurve->flag |= (int)type;
diff --git a/source/blender/python/api2_2x/Key.c b/source/blender/python/api2_2x/Key.c
index 4e5d4278fd3..88facd80b4e 100644
--- a/source/blender/python/api2_2x/Key.c
+++ b/source/blender/python/api2_2x/Key.c
@@ -32,6 +32,7 @@
*/
#include "Key.h" /*This must come first*/
+#include "vector.h"
#include "DNA_scene_types.h"
@@ -334,7 +335,12 @@ static PyObject *Key_getRelative( BPy_Key * self )
static int Key_setRelative( BPy_Key * self, PyObject * value )
{
- if( PyObject_IsTrue( value ) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if( param )
self->key->type = KEY_RELATIVE;
else
self->key->type = KEY_NORMAL;
@@ -514,23 +520,12 @@ static PyObject *KeyBlock_getData( PyObject * self )
case ID_ME:
for (i=0, datap = kb->keyblock->data; i<kb->keyblock->totelem; i++) {
+ PyObject *vec = newVectorObject((float*)datap, 3, Py_WRAP);
+
+ if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError,
+ "could not allocate memory for Blender.Mathutils.Vector wrapper!" );
- BPy_NMVert *mv = PyObject_NEW( BPy_NMVert, &NMVert_Type );
- MVert *vert = (MVert *) datap;
-
- mv->co[0]=vert->co[0];
- mv->co[1]=vert->co[1];
- mv->co[2]=vert->co[2];
- mv->no[0] = 0.0;
- mv->no[1] = 0.0;
- mv->no[2] = 0.0;
-
- mv->uvco[0] = mv->uvco[1] = mv->uvco[2] = 0.0;
- mv->index = i;
- mv->flag = 0;
-
- PyList_SetItem(l, i, ( PyObject * ) mv);
-
+ PyList_SetItem(l, i, vec);
datap += kb->key->elemsize;
}
break;
@@ -547,44 +542,63 @@ static PyObject *KeyBlock_getData( PyObject * self )
Py_DECREF (l);
l = PyList_New( datasize );
for( i = 0, datap = kb->keyblock->data; i < datasize;
- i++, datap += sizeof(float)*12 ) {
- /*
- * since the key only stores the control point and not the
- * other BezTriple attributes, build a Py_NEW BezTriple
- */
- PyObject *pybt = newBezTriple( (float *)datap );
- PyList_SetItem( l, i, pybt );
+ i++, datap += sizeof(float)*3*4) {
+ PyObject *tuple = PyTuple_New(4), *vec;
+ float *vecs = (float*)datap;
+
+ if (!tuple) return EXPP_ReturnPyObjError( PyExc_MemoryError,
+ "PyTuple_New() failed!" );
+
+ vec = newVectorObject(vecs, 3, Py_WRAP);
+ if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError,
+ "Could not allocate memory for Blender.Mathutils.Vector wrapper!" );
+
+ PyTuple_SET_ITEM( tuple, 0, vec);
+
+ vecs += 3;
+ vec = newVectorObject(vecs, 3, Py_WRAP);
+ if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError,
+ "Could not allocate memory for Blender.Mathutils.Vector wrapper!" );
+
+ PyTuple_SET_ITEM( tuple, 1, vec);
+
+ vecs += 3;
+ vec = newVectorObject(vecs, 3, Py_WRAP);
+ if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError,
+ "Could not allocate memory for Blender.Mathutils.Vector wrapper!" );
+
+ PyTuple_SET_ITEM( tuple, 2, vec);
+
+ /*tilts*/
+ vecs += 3;
+ vec = newVectorObject(vecs, 3, Py_WRAP);
+ if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError,
+ "Could not allocate memory for Blender.Mathutils.Vector wrapper!" );
+
+ PyTuple_SET_ITEM( tuple, 3, vec);
+
+ PyList_SetItem( l, i, tuple );
}
} else {
for( i = 0, datap = kb->keyblock->data; i < datasize;
i++, datap += kb->key->elemsize ) {
- PyObject *pybt;
- float *fp = (float *)datap;
- pybt = Py_BuildValue( "[f,f,f]", fp[0],fp[1],fp[2]);
- if( !pybt ) {
- Py_DECREF( l );
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "Py_BuildValue() failed" );
- }
- PyList_SetItem( l, i, pybt );
+ PyObject *vec = newVectorObject((float*)datap, 4, Py_WRAP);
+ if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError,
+ "could not allocate memory for Blender.Mathutils.Vector wrapper!" );
+
+ PyList_SetItem( l, i, vec );
}
}
break;
case ID_LT:
-
for( i = 0, datap = kb->keyblock->data; i < kb->keyblock->totelem;
i++, datap += kb->key->elemsize ) {
- /* Lacking a python class for BPoint, use a list of three floats */
- PyObject *pybt;
- float *fp = (float *)datap;
- pybt = Py_BuildValue( "[f,f,f]", fp[0],fp[1],fp[2]);
- if( !pybt ) {
- Py_DECREF( l );
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "Py_BuildValue() failed" );
- }
- PyList_SetItem( l, i, pybt );
+ PyObject *vec = newVectorObject((float*)datap, 3, Py_WRAP);
+ if (!vec) return EXPP_ReturnPyObjError( PyExc_MemoryError,
+ "Could not allocate memory for Blender.Mathutils.Vector wrapper!" );
+
+ PyList_SetItem( l, i, vec );
}
break;
}
diff --git a/source/blender/python/api2_2x/Lamp.c b/source/blender/python/api2_2x/Lamp.c
index ee4a8257b6f..d40cc5a2cfc 100644
--- a/source/blender/python/api2_2x/Lamp.c
+++ b/source/blender/python/api2_2x/Lamp.c
@@ -864,221 +864,102 @@ static PyObject *Lamp_copy( BPy_Lamp * self )
static PyObject *Lamp_getType( BPy_Lamp * self )
{
- PyObject *attr = PyInt_FromLong( self->lamp->type );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.type attribute" ) );
+ return PyInt_FromLong( self->lamp->type );
}
static PyObject *Lamp_getMode( BPy_Lamp * self )
{
- PyObject *attr = PyInt_FromLong( self->lamp->mode );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.mode attribute" ) );
+ return PyInt_FromLong( self->lamp->mode );
}
static PyObject *Lamp_getSamples( BPy_Lamp * self )
{
- PyObject *attr = PyInt_FromLong( self->lamp->samp );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.samples attribute" ) );
+ return PyInt_FromLong( self->lamp->samp );
}
static PyObject *Lamp_getRaySamplesX( BPy_Lamp * self )
{
- PyObject *attr = PyInt_FromLong( self->lamp->ray_samp );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.raySamplesX attribute" ) );
+ return PyInt_FromLong( self->lamp->ray_samp );
}
static PyObject *Lamp_getRaySamplesY( BPy_Lamp * self )
{
- PyObject *attr = PyInt_FromLong( self->lamp->ray_sampy );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.raySamplesY attribute" ) );
+ return PyInt_FromLong( self->lamp->ray_sampy );
}
static PyObject *Lamp_getAreaSizeX( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->area_size );
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.areaSizeX attribute" ) );
+ return PyFloat_FromDouble( self->lamp->area_size );
}
static PyObject *Lamp_getAreaSizeY( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->area_sizey );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.areaSizeY attribute" ) );
+ return PyFloat_FromDouble( self->lamp->area_sizey );
}
static PyObject *Lamp_getBufferSize( BPy_Lamp * self )
{
- PyObject *attr = PyInt_FromLong( self->lamp->bufsize );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.bufferSize attribute" ) );
+ return PyInt_FromLong( self->lamp->bufsize );
}
static PyObject *Lamp_getHaloStep( BPy_Lamp * self )
{
- PyObject *attr = PyInt_FromLong( self->lamp->shadhalostep );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.haloStep attribute" ) );
+ return PyInt_FromLong( self->lamp->shadhalostep );
}
static PyObject *Lamp_getEnergy( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->energy );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.energy attribute" ) );
+ return PyFloat_FromDouble( self->lamp->energy );
}
static PyObject *Lamp_getDist( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->dist );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.dist attribute" ) );
+ return PyFloat_FromDouble( self->lamp->dist );
}
static PyObject *Lamp_getSpotSize( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->spotsize );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.spotSize attribute" ) );
+ return PyFloat_FromDouble( self->lamp->spotsize );
}
static PyObject *Lamp_getSpotBlend( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->spotblend );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.spotBlend attribute" ) );
+ return PyFloat_FromDouble( self->lamp->spotblend );
}
static PyObject *Lamp_getClipStart( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->clipsta );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.clipStart attribute" ) );
+ return PyFloat_FromDouble( self->lamp->clipsta );
}
static PyObject *Lamp_getClipEnd( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->clipend );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.clipEnd attribute" ) );
+ return PyFloat_FromDouble( self->lamp->clipend );
}
static PyObject *Lamp_getBias( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->bias );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.bias attribute" ) );
+ return PyFloat_FromDouble( self->lamp->bias );
}
static PyObject *Lamp_getSoftness( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->soft );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.softness attribute" ) );
+ return PyFloat_FromDouble( self->lamp->soft );
}
static PyObject *Lamp_getHaloInt( BPy_Lamp * self )
{
- PyObject *attr = PyFloat_FromDouble( self->lamp->haint );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.haloInt attribute" ) );
+ return PyFloat_FromDouble( self->lamp->haint );
}
static PyObject *Lamp_getQuad1( BPy_Lamp * self )
{ /* should we complain if Lamp is not of type Quad? */
- PyObject *attr = PyFloat_FromDouble( self->lamp->att1 );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.quad1 attribute" ) );
+ return PyFloat_FromDouble( self->lamp->att1 );
}
static PyObject *Lamp_getQuad2( BPy_Lamp * self )
{ /* should we complain if Lamp is not of type Quad? */
- PyObject *attr = PyFloat_FromDouble( self->lamp->att2 );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.quad2 attribute" ) );
+ return PyFloat_FromDouble( self->lamp->att2 );
}
static PyObject *Lamp_getCol( BPy_Lamp * self )
@@ -1107,7 +988,7 @@ static int Lamp_setMode( BPy_Lamp * self, PyObject * value )
| EXPP_LAMP_MODE_NOSPECULAR
| EXPP_LAMP_MODE_SHAD_RAY;
- if( !PyInt_CheckExact ( value ) ) {
+ if( !PyInt_Check ( value ) ) {
char errstr[128];
sprintf ( errstr , "expected int bitmask of 0x%04x", bitmask );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
@@ -1252,27 +1133,17 @@ static int Lamp_setQuad2( BPy_Lamp * self, PyObject * value )
static PyObject *Lamp_getComponent( BPy_Lamp * self, void * closure )
{
- PyObject *attr = NULL;
-
switch ( (int)closure ) {
case EXPP_LAMP_COMP_R:
- attr = PyFloat_FromDouble( self->lamp->r );
- break;
+ return PyFloat_FromDouble( self->lamp->r );
case EXPP_LAMP_COMP_G:
- attr = PyFloat_FromDouble( self->lamp->g );
- break;
+ return PyFloat_FromDouble( self->lamp->g );
case EXPP_LAMP_COMP_B:
- attr = PyFloat_FromDouble( self->lamp->b );
- break;
+ return PyFloat_FromDouble( self->lamp->b );
default:
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"unknown color component specified" );
}
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyFloat_FromDouble() failed" );
- return attr;
}
static int Lamp_setComponent( BPy_Lamp * self, PyObject * value,
@@ -1416,25 +1287,25 @@ static PyObject *Lamp_insertIpoKey( BPy_Lamp * self, PyObject * args )
map = texchannel_to_adrcode(self->lamp->texact);
if (key == IPOKEY_RGB ) {
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL, LA_COL_R);
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_COL_G);
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_COL_B);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL, LA_COL_R, 0);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_COL_G, 0);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_COL_B, 0);
}
if (key == IPOKEY_ENERGY ) {
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_ENERGY);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_ENERGY, 0);
}
if (key == IPOKEY_SPOTSIZE ) {
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_SPOTSI);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL,LA_SPOTSI, 0);
}
if (key == IPOKEY_OFFSET ) {
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_X);
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_Y);
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_Z);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_X, 0);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_Y, 0);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_OFS_Z, 0);
}
if (key == IPOKEY_SIZE ) {
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_X);
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_Y);
- insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_Z);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_X, 0);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_Y, 0);
+ insertkey((ID *)self->lamp, ID_LA, NULL, NULL, map+MAP_SIZE_Z, 0);
}
allspace(REMAKEIPO, 0);
@@ -1448,7 +1319,7 @@ static PyObject *Lamp_insertIpoKey( BPy_Lamp * self, PyObject * args )
static PyObject *Lamp_getModesConst( void )
{
- PyObject * attr = Py_BuildValue
+ return Py_BuildValue
( "{s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h,s:h}",
"Shadows", EXPP_LAMP_MODE_SHADOWS, "Halo",
EXPP_LAMP_MODE_HALO, "Layer", EXPP_LAMP_MODE_LAYER,
@@ -1460,29 +1331,17 @@ static PyObject *Lamp_getModesConst( void )
EXPP_LAMP_MODE_NODIFFUSE, "NoSpecular",
EXPP_LAMP_MODE_NOSPECULAR, "RayShadow",
EXPP_LAMP_MODE_SHAD_RAY);
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.Modes attribute" );
-
- return attr;
}
static PyObject *Lamp_getTypesConst( void )
{
- PyObject *attr = Py_BuildValue( "{s:h,s:h,s:h,s:h,s:h,s:h}",
+ return Py_BuildValue( "{s:h,s:h,s:h,s:h,s:h,s:h}",
"Lamp", EXPP_LAMP_TYPE_LAMP,
"Sun", EXPP_LAMP_TYPE_SUN,
"Spot", EXPP_LAMP_TYPE_SPOT,
"Hemi", EXPP_LAMP_TYPE_HEMI,
"Area", EXPP_LAMP_TYPE_AREA,
"Photon", EXPP_LAMP_TYPE_YF_PHOTON );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Lamp.Types attribute" );
-
- return attr;
}
/* #####DEPRECATED###### */
diff --git a/source/blender/python/api2_2x/Lattice.c b/source/blender/python/api2_2x/Lattice.c
index 7ea8aabfc04..070e8225531 100644
--- a/source/blender/python/api2_2x/Lattice.c
+++ b/source/blender/python/api2_2x/Lattice.c
@@ -69,7 +69,7 @@ static char M_Lattice_doc[] = "The Blender Lattice module\n\n";
static char M_Lattice_New_doc[] = "() - return a new Lattice object";
-static char M_Lattice_Get_doc[] = "() - geta a Lattice from blender";
+static char M_Lattice_Get_doc[] = "() - get a Lattice from blender";
/*****************************************************************************/
/* Python method structure definition for Blender.Lattice module: */
@@ -708,13 +708,13 @@ static PyObject *Lattice_getAxisType(BPy_Lattice * self, void * type)
static PyGetSetDef BPy_Lattice_getseters[] = {
GENERIC_LIB_GETSETATTR,
{"width", (getter)Lattice_getWidth, (setter)NULL,
- "lattice U sibdivision ", NULL},
+ "lattice U subdivision ", NULL},
{"height", (getter)Lattice_getHeight, (setter)NULL,
- "lattice V sibdivision", NULL},
+ "lattice V subdivision", NULL},
{"depth", (getter)Lattice_getDepth, (setter)NULL,
- "lattice W sibdivision", NULL},
+ "lattice W subdivision", NULL},
{"latSize", (getter)Lattice_getLatSize, (setter)NULL,
- "lattice W sibdivision", NULL},
+ "lattice W subdivision", NULL},
{"widthType", (getter)Lattice_getAxisType, NULL,
"lattice U interpolation type", (void *)0},
diff --git a/source/blender/python/api2_2x/Makefile b/source/blender/python/api2_2x/Makefile
index f49d7c3320e..8a13adae989 100644
--- a/source/blender/python/api2_2x/Makefile
+++ b/source/blender/python/api2_2x/Makefile
@@ -38,13 +38,11 @@ CSRCS ?= $(wildcard *.c) $(wildcard ../*.c)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
- CFLAGS += -fno-strict-aliasing
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
+ifeq ($(WITH_FFMPEG), true)
+ CPPFLAGS += -DWITH_FFMPEG
+endif
CPPFLAGS += -I$(OPENGL_HEADERS)
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
diff --git a/source/blender/python/api2_2x/Material.c b/source/blender/python/api2_2x/Material.c
index 21200882a7f..851a46d51e5 100644
--- a/source/blender/python/api2_2x/Material.c
+++ b/source/blender/python/api2_2x/Material.c
@@ -1113,11 +1113,11 @@ static PyGetSetDef BPy_Material_getseters[] = {
(void *) EXPP_MAT_COMP_B },
{"colorbandDiffuse",
(getter)Material_getColorband, (setter)Material_setColorband,
- "Set the light group for this material",
+ "The diffuse colorband for this material",
(void *) 0},
{"colorbandSpecular",
(getter)Material_getColorband, (setter)Material_setColorband,
- "Set the light group for this material",
+ "The specular colorband for this material",
(void *) 1},
/* SSS settings */
@@ -1319,12 +1319,6 @@ PyObject *Material_CreatePyObject( struct Material *mat )
pymat->spec = ( BPy_rgbTuple * ) rgbTuple_New( spec );
pymat->mir = ( BPy_rgbTuple * ) rgbTuple_New( mir );
pymat->sss = ( BPy_rgbTuple * ) rgbTuple_New( sss );
-
- Py_INCREF(pymat->col);
- Py_INCREF(pymat->amb);
- Py_INCREF(pymat->spec);
- Py_INCREF(pymat->mir);
- Py_INCREF(pymat->sss);
return ( PyObject * ) pymat;
}
@@ -1351,13 +1345,7 @@ static PyObject *Material_getIpo( BPy_Material * self )
static PyObject *Material_getMode( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->mode );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.Mode attribute" );
+ return PyInt_FromLong( ( long ) self->material->mode );
}
static PyObject *Material_getRGBCol( BPy_Material * self )
@@ -1388,494 +1376,217 @@ static PyObject *Material_getSssCol( BPy_Material * self )
static PyObject *Material_getSpecShader( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->spec_shader );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.specShader attribute" );
+ return PyInt_FromLong( ( long ) self->material->spec_shader );
}
static PyObject *Material_getDiffuseShader( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->diff_shader );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.diffuseShader attribute" );
+ return PyInt_FromLong( ( long ) self->material->diff_shader );
}
static PyObject *Material_getRoughness( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->roughness );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.roughness attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->roughness );
}
static PyObject *Material_getSpecSize( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->param[2] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.specSize attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->param[2] );
}
static PyObject *Material_getDiffuseSize( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->param[0] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.diffuseSize attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->param[0] );
}
static PyObject *Material_getSpecSmooth( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->param[3] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.specSmooth attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->param[3] );
}
static PyObject *Material_getDiffuseSmooth( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->param[1] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.diffuseSmooth( attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->param[1] );
}
static PyObject *Material_getDiffuseDarkness( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->darkness );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.diffuseDarkness attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->darkness );
}
static PyObject *Material_getRefracIndex( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->refrac );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.refracIndex attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->refrac );
}
static PyObject *Material_getRms( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->rms );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.rms attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->rms );
}
static PyObject *Material_getAmb( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->amb );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.amb attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->amb );
}
static PyObject *Material_getEmit( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->emit );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.emit attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->emit );
}
static PyObject *Material_getAlpha( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->alpha );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.alpha attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->alpha );
}
static PyObject *Material_getShadAlpha( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->shad_alpha );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.shad_alpha attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->shad_alpha );
}
static PyObject *Material_getRef( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->ref );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.ref attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->ref );
}
static PyObject *Material_getSpec( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->spec );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.spec attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->spec );
}
static PyObject *Material_getSpecTransp( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->spectra );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.specTransp attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->spectra );
}
static PyObject *Material_getAdd( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->add );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.add attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->add );
}
static PyObject *Material_getZOffset( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->zoffs );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.zOffset attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->zoffs );
}
static PyObject *Material_getLightGroup( BPy_Material * self )
{
- PyObject *attr =
- Group_CreatePyObject( self->material->group );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.lightGroup attribute" );
+ return Group_CreatePyObject( self->material->group );
}
static PyObject *Material_getHaloSize( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->hasize );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.haloSize attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->hasize );
}
static PyObject *Material_getFlareSize( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->flaresize );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.flareSize attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->flaresize );
}
static PyObject *Material_getFlareBoost( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->flareboost );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.flareBoost attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->flareboost );
}
static PyObject *Material_getSubSize( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->subsize );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.subSize attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->subsize );
}
static PyObject *Material_getHaloSeed( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->seed1 );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.haloSeed attribute" );
+ return PyInt_FromLong( ( long ) self->material->seed1 );
}
static PyObject *Material_getFlareSeed( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->seed2 );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.flareSeed attribute" );
+ return PyInt_FromLong( ( long ) self->material->seed2 );
}
static PyObject *Material_getHardness( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->har );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.hard attribute" );
+ return PyInt_FromLong( ( long ) self->material->har );
}
static PyObject *Material_getNFlares( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->flarec );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.nFlares attribute" );
+ return PyInt_FromLong( ( long ) self->material->flarec );
}
static PyObject *Material_getNStars( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->starc );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.nStars attribute" );
+ return PyInt_FromLong( ( long ) self->material->starc );
}
static PyObject *Material_getNLines( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->linec );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.nLines attribute" );
+ return PyInt_FromLong( ( long ) self->material->linec );
}
static PyObject *Material_getNRings( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->ringc );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.nRings attribute" );
+ return PyInt_FromLong( ( long ) self->material->ringc );
}
static PyObject *Material_getRayMirr( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->ray_mirror );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.rayMirr attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->ray_mirror );
}
static PyObject *Material_getMirrDepth( BPy_Material * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->material->ray_depth );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.rayMirrDepth attribute" );
+ return PyInt_FromLong( ( long ) self->material->ray_depth );
}
static PyObject *Material_getFresnelMirr( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->fresnel_mir );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.fresnelDepth attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->fresnel_mir );
}
static PyObject *Material_getFresnelMirrFac( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->fresnel_mir_i );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.fresnelDepthFac attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->fresnel_mir_i );
}
static PyObject *Material_getFilter( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->filter );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.filter attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->filter );
}
static PyObject *Material_getTranslucency( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->translucency );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.translucency attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->translucency );
}
static PyObject *Material_getIOR( BPy_Material * self )
{
- PyObject *attr = PyFloat_FromDouble( ( double ) self->material->ang );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.IOR attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->ang );
}
static PyObject *Material_getTransDepth( BPy_Material * self )
{
- PyObject *attr =
- PyInt_FromLong( ( long ) self->material->ray_depth_tra );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.transDepth attribute" );
+ return PyInt_FromLong( ( long ) self->material->ray_depth_tra );
}
static PyObject *Material_getFresnelTrans( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->fresnel_tra );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.fresnelTrans attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->fresnel_tra );
}
static PyObject *Material_getFresnelTransFac( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->fresnel_tra_i );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.fresnelTransFac attribute" );
+ return PyFloat_FromDouble( ( double ) self->material->fresnel_tra_i );
}
static PyObject* Material_getRigidBodyFriction( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->friction );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.friction" );
+ return PyFloat_FromDouble( ( double ) self->material->friction );
}
static PyObject* Material_getRigidBodyRestitution( BPy_Material * self )
{
- PyObject *attr =
- PyFloat_FromDouble( ( double ) self->material->reflect );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Material.reflect" );
+ return PyFloat_FromDouble( ( double ) self->material->reflect );
}
/* SSS */
@@ -1980,58 +1691,58 @@ static PyObject *Material_insertIpoKey( BPy_Material * self, PyObject * args )
map = texchannel_to_adrcode(self->material->texact);
if(key==IPOKEY_RGB || key==IPOKEY_ALLCOLOR) {
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_R);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_G);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_B);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_R, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_G, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_COL_B, 0);
}
if(key==IPOKEY_ALPHA || key==IPOKEY_ALLCOLOR) {
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_ALPHA);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_ALPHA, 0);
}
if(key==IPOKEY_HALOSIZE || key==IPOKEY_ALLCOLOR) {
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_HASIZE);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_HASIZE, 0);
}
if(key==IPOKEY_MODE || key==IPOKEY_ALLCOLOR) {
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_MODE);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_MODE, 0);
}
if(key==IPOKEY_ALLCOLOR) {
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_R);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_G);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_B);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_REF);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_EMIT);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_AMB);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_HARD);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_MODE);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_TRANSLU);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_ADD);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_R, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_G, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC_B, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_REF, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_EMIT, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_AMB, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_SPEC, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_HARD, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_MODE, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_TRANSLU, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_ADD, 0);
}
if(key==IPOKEY_ALLMIRROR) {
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_RAYM);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESMIR);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESMIRI);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESTRA);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESTRAI);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_RAYM, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESMIR, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESMIRI, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESTRA, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, MA_FRESTRAI, 0);
}
if(key==IPOKEY_OFS || key==IPOKEY_ALLMAPPING) {
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_X);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_Y);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_Z);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_X, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_Y, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_OFS_Z, 0);
}
if(key==IPOKEY_SIZE || key==IPOKEY_ALLMAPPING) {
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_X);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_Y);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_Z);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_X, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_Y, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_SIZE_Z, 0);
}
if(key==IPOKEY_ALLMAPPING) {
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_R);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_G);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_B);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_DVAR);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_COLF);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_NORF);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_VARF);
- insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_DISP);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_R, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_G, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_B, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_DVAR, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_COLF, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_NORF, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_VARF, 0);
+ insertkey((ID *)self->material, ID_MA, NULL, NULL, map+MAP_DISP, 0);
}
allspace(REMAKEIPO, 0);
@@ -2047,7 +1758,7 @@ static int Material_setMode( BPy_Material * self, PyObject * value )
{
int param;
- if( !PyInt_CheckExact ( value ) ) {
+ if( !PyInt_Check( value ) ) {
char errstr[128];
sprintf ( errstr , "expected int bitmask of 0x%08x", MA_MODE_MASK );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
@@ -2926,54 +2637,35 @@ void EXPP_incr_mats_us( Material ** matlist, int len )
static PyObject *Material_getColorComponent( BPy_Material * self,
void * closure )
{
- PyObject *attr = NULL;
-
switch ( (int)closure ) {
case EXPP_MAT_COMP_R:
- attr = PyFloat_FromDouble( ( double ) self->material->r );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->r );
case EXPP_MAT_COMP_G:
- attr = PyFloat_FromDouble( ( double ) self->material->g );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->g );
case EXPP_MAT_COMP_B:
- attr = PyFloat_FromDouble( ( double ) self->material->b );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->b );
case EXPP_MAT_COMP_SPECR:
- attr = PyFloat_FromDouble( ( double ) self->material->specr );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->specr );
case EXPP_MAT_COMP_SPECG:
- attr = PyFloat_FromDouble( ( double ) self->material->specg );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->specg );
case EXPP_MAT_COMP_SPECB:
- attr = PyFloat_FromDouble( ( double ) self->material->specb );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->specb );
case EXPP_MAT_COMP_MIRR:
- attr = PyFloat_FromDouble( ( double ) self->material->mirr );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->mirr );
case EXPP_MAT_COMP_MIRG:
- attr = PyFloat_FromDouble( ( double ) self->material->mirg );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->mirg );
case EXPP_MAT_COMP_MIRB:
- attr = PyFloat_FromDouble( ( double ) self->material->mirb );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->mirb );
case EXPP_MAT_COMP_SSSR:
- attr = PyFloat_FromDouble( ( double ) self->material->sss_col[0] );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->sss_col[0] );
case EXPP_MAT_COMP_SSSG:
- attr = PyFloat_FromDouble( ( double ) self->material->sss_col[1] );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->sss_col[1] );
case EXPP_MAT_COMP_SSSB:
- attr = PyFloat_FromDouble( ( double ) self->material->sss_col[2] );
- break;
+ return PyFloat_FromDouble( ( double ) self->material->sss_col[2] );
default:
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"unknown color component specified" );
}
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyFloat_FromDouble() failed" );
- return attr;
}
static PyObject *Material_getColorband( BPy_Material * self, void * type)
@@ -3326,7 +3018,7 @@ static PyObject *Matr_oldsetMode( BPy_Material * self, PyObject * args )
"expected nothing, an integer or up to 22 string argument(s)" ) );
/* build tuple, call wrapper */
- value = PyInt_FromLong( (long)flag );
+ value = Py_BuildValue("(i)", flag);
error = EXPP_setterWrapper( (void *)self, value, (setter)Material_setMode );
Py_DECREF ( value );
return error;
diff --git a/source/blender/python/api2_2x/Mathutils.c b/source/blender/python/api2_2x/Mathutils.c
index bac9d6038ca..3605c956a58 100644
--- a/source/blender/python/api2_2x/Mathutils.c
+++ b/source/blender/python/api2_2x/Mathutils.c
@@ -460,10 +460,10 @@ PyObject *M_Mathutils_DotVecs(PyObject * self, PyObject * args)
if(!PyArg_ParseTuple(args, "O!O!", &vector_Type, &vec1, &vector_Type, &vec2))
return EXPP_ReturnPyObjError(PyExc_TypeError,
- "Mathutils.DotVec(): expects (2) vector objects of the same size\n");
+ "Mathutils.DotVecs(): expects (2) vector objects of the same size\n");
if(vec1->size != vec2->size)
return EXPP_ReturnPyObjError(PyExc_AttributeError,
- "Mathutils.DotVec(): expects (2) vector objects of the same size\n");
+ "Mathutils.DotVecs(): expects (2) vector objects of the same size\n");
for(x = 0; x < vec1->size; x++) {
dot += vec1->vec[x] * vec2->vec[x];
diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c
index b76a8cf236f..8248816bc3d 100644
--- a/source/blender/python/api2_2x/Mesh.c
+++ b/source/blender/python/api2_2x/Mesh.c
@@ -125,6 +125,8 @@ static PyObject *MEdgeSeq_CreatePyObject( Mesh * mesh );
static PyObject *MFace_CreatePyObject( Mesh * mesh, int i );
static PyObject *MEdge_CreatePyObject( Mesh * mesh, int i );
+#define MFACE_VERT_BADRANGE_CHECK(me, face) ((int)face->v1 >= me->totvert || (int)face->v2 >= me->totvert || (int)face->v3 >= me->totvert || (int)face->v4 >= me->totvert)
+#define MEDGE_VERT_BADRANGE_CHECK(me, edge) ((int)edge->v1 >= me->totvert || (int)edge->v2 >= me->totvert)
/************************************************************************
*
@@ -587,7 +589,6 @@ static unsigned int make_vertex_table( unsigned int *vert_table, int count )
static PyObject *MCol_getAttr( BPy_MCol * self, void *type )
{
unsigned char param;
- PyObject *attr;
switch( (long)type ) {
case 'R': /* these are backwards, but that how it works */
@@ -611,12 +612,7 @@ static PyObject *MCol_getAttr( BPy_MCol * self, void *type )
}
}
- attr = PyInt_FromLong( param );
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed");
+ return PyInt_FromLong( param );
}
/*
@@ -684,7 +680,6 @@ static PyGetSetDef BPy_MCol_getseters[] = {
static PyObject *MCol_item(BPy_MCol * self, int i)
{
unsigned char param;
- PyObject *attr;
switch (i) {
case 0:
param = self->color->b;
@@ -703,12 +698,7 @@ static PyObject *MCol_item(BPy_MCol * self, int i)
"vector[index] = x: assignment index out of range\n");
}
- attr = PyInt_FromLong( param );
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed");
+ return PyInt_FromLong( param );
}
/*----------------------------object[]-------------------------
@@ -924,18 +914,11 @@ static int MVert_setCoord( BPy_MVert * self, VectorObject * value )
static PyObject *MVert_getIndex( BPy_MVert * self )
{
- PyObject *attr;
-
if( self->index >= ((Mesh *)self->data)->totvert )
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"MVert is no longer valid" );
- attr = PyInt_FromLong( self->index );
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
+ return PyInt_FromLong( self->index );
}
@@ -947,11 +930,9 @@ static PyObject *MVert_getMFlagBits( BPy_MVert * self, void * type )
{
MVert *v;
- v = MVert_get_pointer( self );
-
- if( self->index >= ((Mesh *)self->data)->totvert )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "MVert is no longer valid" );
+ v = MVert_get_pointer( self );
+ if (!v)
+ return NULL; /* error is set */
return EXPP_getBitfield( &v->flag, (int)((long)type & 0xff), 'b' );
}
@@ -968,9 +949,8 @@ static int MVert_setMFlagBits( BPy_MVert * self, PyObject * value,
v = MVert_get_pointer( self );
- if( self->index >= ((Mesh *)self->data)->totvert )
- return EXPP_ReturnIntError( PyExc_RuntimeError,
- "MVert is no longer valid" );
+ if (!v)
+ return -1; /* error is set */
return EXPP_setBitfield( value, &v->flag,
(int)((long)type & 0xff), 'b' );
@@ -989,7 +969,7 @@ static PyObject *MVert_getNormal( BPy_MVert * self )
v = MVert_get_pointer( self );
if( !v )
- return NULL;
+ return NULL; /* error set */
for( i = 0; i < 3; ++i )
no[i] = (float)(v->no[i] / 32767.0);
@@ -1008,7 +988,7 @@ static int MVert_setNormal( BPy_MVert * self, VectorObject * value )
v = MVert_get_pointer( self );
if( !v )
- return -1;
+ return -1; /* error set */
if( !VectorObject_Check( value ) || value->size != 3 )
return EXPP_ReturnIntError( PyExc_TypeError,
@@ -1037,7 +1017,7 @@ static PyObject *MVert_getSel( BPy_MVert *self )
v = MVert_get_pointer( self );
if( !v )
- return NULL;
+ return NULL; /* error is set */
return EXPP_getBitfield( &v->flag, SELECT, 'b' );
}
@@ -1050,6 +1030,8 @@ static int MVert_setSel( BPy_MVert *self, PyObject *value )
{
MVert *v = MVert_get_pointer( self );
Mesh *me = (Mesh *)self->data;
+ if (!v)
+ return -1; /* error is set */
/*
* if vertex exists and setting status is OK, delete select storage
@@ -1363,8 +1345,8 @@ static PyObject *Mesh_getProperty_internal(CustomData *data, int eindex, PyObjec
static PyObject *Mesh_setProperty_internal(CustomData *data, int eindex, PyObject *args)
{
CustomDataLayer *layer;
- int i,index, type = -1;
- float f;
+ int i = 0, index, type = -1;
+ float f = 0.0f;
char *s=NULL, *name=NULL;
MFloatProperty *pf;
MIntProperty *pi;
@@ -1376,15 +1358,15 @@ static PyObject *Mesh_setProperty_internal(CustomData *data, int eindex, PyObjec
return EXPP_ReturnPyObjError( PyExc_ValueError,
"error, maximum name length is 31" );
- if(PyInt_CheckExact(val)){
+ if(PyInt_Check(val)){
type = CD_PROP_INT;
i = (int)PyInt_AS_LONG(val);
}
- else if(PyFloat_CheckExact(val)){
+ else if(PyFloat_Check(val)){
type = CD_PROP_FLT;
f = (float)PyFloat_AsDouble(val);
}
- else if(PyString_CheckExact(val)){
+ else if(PyString_Check(val)){
type = CD_PROP_STR;
s = PyString_AsString(val);
}
@@ -1451,7 +1433,7 @@ static PyObject *MVert_setProp( BPy_MVert *self, PyObject *args)
}
static struct PyMethodDef BPy_MVert_methods[] = {
- {"getProperty", (PyCFunction)MVert_getProp, METH_VARARGS,
+ {"getProperty", (PyCFunction)MVert_getProp, METH_O,
"get property indicated by name"},
{"setProperty", (PyCFunction)MVert_setProp, METH_VARARGS,
"set property indicated by name"},
@@ -2103,7 +2085,7 @@ static PyObject *MVertSeq_delete( BPy_MVertSeq * self, PyObject *args )
"MVert belongs to a different mesh" );
}
index = ((BPy_MVert*)tmp)->index;
- } else if( PyInt_CheckExact( tmp ) ) {
+ } else if( PyInt_Check( tmp ) ) {
index = PyInt_AsLong ( tmp );
} else {
MEM_freeN( vert_table );
@@ -2357,18 +2339,12 @@ static MEdge * MEdge_get_pointer( BPy_MEdge * self )
static PyObject *MEdge_getCrease( BPy_MEdge * self )
{
- PyObject *attr;
MEdge *edge = MEdge_get_pointer( self );
if( !edge )
return NULL;
- attr = PyInt_FromLong( edge->crease );
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
+ return PyInt_FromLong( edge->crease );
}
/*
@@ -2391,19 +2367,12 @@ static int MEdge_setCrease( BPy_MEdge * self, PyObject * value )
static PyObject *MEdge_getFlag( BPy_MEdge * self )
{
- PyObject *attr;
MEdge *edge = MEdge_get_pointer( self );
if( !edge )
return NULL;
- attr = PyInt_FromLong( edge->flag );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
+ return PyInt_FromLong( edge->flag );
}
/*
@@ -2427,7 +2396,7 @@ static int MEdge_setFlag( BPy_MEdge * self, PyObject * value )
if( !edge )
return -1;
- if( !PyInt_CheckExact ( value ) ) {
+ if( !PyInt_Check ( value ) ) {
char errstr[128];
sprintf ( errstr , "expected int bitmask of 0x%04x", bitmask );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
@@ -2483,8 +2452,8 @@ static PyObject *MEdge_getV2( BPy_MEdge * self )
MEdge *edge = MEdge_get_pointer( self );
if( !edge )
- return NULL;
-
+ return NULL; /* error is set */
+ /* if v2 is out of range, the python mvert will complain, no need to check here */
return MVert_CreatePyObject( self->mesh, edge->v2 );
}
@@ -2497,10 +2466,13 @@ static int MEdge_setV2( BPy_MEdge * self, BPy_MVert * value )
MEdge *edge = MEdge_get_pointer( self );
if( !edge )
- return -1;
+ return -1; /* error is set */
if( !BPy_MVert_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError, "expected an MVert" );
+ if ( edge->v1 == value->index )
+ return EXPP_ReturnIntError( PyExc_ValueError, "an edge cant use the same vertex for each end" );
+
edge->v2 = value->index;
return 0;
}
@@ -2511,18 +2483,10 @@ static int MEdge_setV2( BPy_MEdge * self, BPy_MVert * value )
static PyObject *MEdge_getIndex( BPy_MEdge * self )
{
- PyObject *attr;
-
if( !MEdge_get_pointer( self ) )
- return NULL;
+ return NULL; /* error is set */
- attr = PyInt_FromLong( self->index );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
+ return PyInt_FromLong( self->index );
}
/*
@@ -2534,7 +2498,7 @@ static PyObject *MEdge_getMFlagBits( BPy_MEdge * self, void * type )
MEdge *edge = MEdge_get_pointer( self );
if( !edge )
- return NULL;
+ return NULL; /* error is set */
return EXPP_getBitfield( &edge->flag, (int)((long)type & 0xff), 'b' );
}
@@ -2551,6 +2515,12 @@ static PyObject *MEdge_getLength( BPy_MEdge * self )
int i;
float *v1, *v2;
+ if (!edge)
+ return NULL; /* error is set */
+
+ if MEDGE_VERT_BADRANGE_CHECK(self->mesh, edge)
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError, "This edge uses removed vert(s)" );
+
/* get the 2 edges vert locations */
v1= (&((Mesh *)self->mesh)->mvert[edge->v1])->co;
v2= (&((Mesh *)self->mesh)->mvert[edge->v2])->co;
@@ -2571,14 +2541,18 @@ static PyObject *MEdge_getLength( BPy_MEdge * self )
static PyObject *MEdge_getKey( BPy_MEdge * self )
{
+ PyObject *attr;
MEdge *edge = MEdge_get_pointer( self );
- PyObject *attr = PyTuple_New( 2 );
+ if (!edge)
+ return NULL; /* error is set */
+
+ attr = PyTuple_New( 2 );
if (edge->v1 > edge->v2) {
- PyTuple_SetItem( attr, 0, PyInt_FromLong(edge->v2) );
- PyTuple_SetItem( attr, 1, PyInt_FromLong(edge->v1) );
+ PyTuple_SET_ITEM( attr, 0, PyInt_FromLong(edge->v2) );
+ PyTuple_SET_ITEM( attr, 1, PyInt_FromLong(edge->v1) );
} else {
- PyTuple_SetItem( attr, 0, PyInt_FromLong(edge->v1) );
- PyTuple_SetItem( attr, 1, PyInt_FromLong(edge->v2) );
+ PyTuple_SET_ITEM( attr, 0, PyInt_FromLong(edge->v1) );
+ PyTuple_SET_ITEM( attr, 1, PyInt_FromLong(edge->v2) );
}
return attr;
}
@@ -2592,16 +2566,17 @@ static int MEdge_setSel( BPy_MEdge * self,PyObject * value,
{
MEdge *edge = MEdge_get_pointer( self );
int param = PyObject_IsTrue( value );
- Mesh *me;
+ Mesh *me = self->mesh;
if( !edge )
return -1;
-
+
+ if MEDGE_VERT_BADRANGE_CHECK(me, edge)
+ return EXPP_ReturnIntError( PyExc_RuntimeError, "This edge uses removed vert(s)" );
+
if( param == -1 )
return EXPP_ReturnIntError( PyExc_TypeError,
- "expected true/false argument" );
-
- me = self->mesh;
+ "expected True/False or 0/1" );
if( param ) {
edge->flag |= SELECT;
@@ -2745,7 +2720,7 @@ static PyObject *MEdge_setProp( BPy_MEdge *self, PyObject *args)
}
static struct PyMethodDef BPy_MEdge_methods[] = {
- {"getProperty", (PyCFunction)MEdge_getProp, METH_VARARGS,
+ {"getProperty", (PyCFunction)MEdge_getProp, METH_O,
"get property indicated by name"},
{"setProperty", (PyCFunction)MEdge_setProp, METH_VARARGS,
"set property indicated by name"},
@@ -3043,7 +3018,7 @@ static PyObject *MEdgeSeq_extend( BPy_MEdgeSeq * self, PyObject *args )
ok = 0;
for( j = 0; ok == 0 && j < nverts; ++j ) {
PyObject *item = PySequence_ITEM( tmp, j );
- if( !PyInt_CheckExact( item ) )
+ if( !PyInt_Check( item ) )
ok = 1;
else {
int index = PyInt_AsLong ( item );
@@ -3277,7 +3252,7 @@ static PyObject *MEdgeSeq_delete( BPy_MEdgeSeq * self, PyObject *args )
PyObject *tmp = PySequence_GetItem( args, i );
if( BPy_MEdge_Check( tmp ) )
edge_table[i] = ((BPy_MEdge *)tmp)->index;
- else if( PyInt_CheckExact( tmp ) )
+ else if( PyInt_Check( tmp ) )
edge_table[i] = PyInt_AsLong ( tmp );
else {
MEM_freeN( edge_table );
@@ -3487,7 +3462,7 @@ static PyObject *MEdgeSeq_collapse( BPy_MEdgeSeq * self, PyObject *args )
tmp1 = PySequence_GetItem( tmp, 0 );
tmp2 = PySequence_GetItem( tmp, 1 );
Py_DECREF( tmp );
- if( !(BPy_MEdge_Check( tmp1 ) || PyInt_CheckExact( tmp1 )) ||
+ if( !(BPy_MEdge_Check( tmp1 ) || PyInt_Check( tmp1 )) ||
!VectorObject_Check ( tmp2 ) ) {
MEM_freeN( edge_table );
MEM_freeN( vert_list );
@@ -3499,7 +3474,7 @@ static PyObject *MEdgeSeq_collapse( BPy_MEdgeSeq * self, PyObject *args )
}
/* store edge index, new vertex location */
- if( PyInt_CheckExact( tmp1 ) )
+ if( PyInt_Check( tmp1 ) )
edge_table[i] = PyInt_AsLong ( tmp1 );
else
edge_table[i] = ((BPy_MEdge *)tmp1)->index;
@@ -3551,7 +3526,7 @@ static PyObject *MEdgeSeq_collapse( BPy_MEdgeSeq * self, PyObject *args )
basact = BASACT;
BASACT = base;
- removedoublesflag( 1, 0.0 );
+ removedoublesflag( 1, 0, 0.0 );
/* make mesh's object active, enter mesh edit mode */
G.obedit = object;
@@ -3807,7 +3782,26 @@ static int MFace_setVerts( BPy_MFace * self, PyObject * args )
&MVert_Type, &v2, &MVert_Type, &v3, &MVert_Type, &v4 ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected tuple of 3 or 4 MVerts" );
-
+
+ if( v1->index == v2->index ||
+ v1->index == v3->index ||
+ v2->index == v3->index )
+ return EXPP_ReturnIntError( PyExc_ValueError,
+ "cannot assign 2 or move verts that are the same" );
+
+ if(v4 && ( v1->index == v4->index ||
+ v2->index == v4->index ||
+ v3->index == v4->index ))
+ return EXPP_ReturnIntError( PyExc_ValueError,
+ "cannot assign 2 or move verts that are the same" );
+
+ if( v1->index >= self->mesh->totvert ||
+ v2->index >= self->mesh->totvert ||
+ v3->index >= self->mesh->totvert ||
+ (v4 &&( v4->index >= self->mesh->totvert)))
+ return EXPP_ReturnIntError( PyExc_ValueError,
+ "cannot assign verts that have been removed" );
+
face->v1 = v1->index;
face->v2 = v2->index;
face->v3 = v3->index;
@@ -3822,19 +3816,12 @@ static int MFace_setVerts( BPy_MFace * self, PyObject * args )
static PyObject *MFace_getMat( BPy_MFace * self )
{
- PyObject *attr;
MFace *face = MFace_get_pointer( self );
if( !face )
return NULL;
- attr = PyInt_FromLong( face->mat_nr );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
+ return PyInt_FromLong( face->mat_nr );
}
/*
@@ -3846,7 +3833,7 @@ static int MFace_setMat( BPy_MFace * self, PyObject * value )
MFace *face = MFace_get_pointer( self );
if( !face )
- return -1;
+ return -1; /* error is set */
return EXPP_setIValueRange( value, &face->mat_nr, 0, 15, 'b' );
}
@@ -3857,19 +3844,12 @@ static int MFace_setMat( BPy_MFace * self, PyObject * value )
static PyObject *MFace_getIndex( BPy_MFace * self )
{
- PyObject *attr;
MFace *face = MFace_get_pointer( self );
if( !face )
- return NULL;
-
- attr = PyInt_FromLong( self->index );
-
- if( attr )
- return attr;
+ return NULL; /* error is set */
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
+ return PyInt_FromLong( self->index );
}
/*
@@ -3882,21 +3862,20 @@ static PyObject *MFace_getNormal( BPy_MFace * self )
float no[3];
MFace *face = MFace_get_pointer( self );
+ Mesh *me = self->mesh;
+
if( !face )
- return NULL;
-
- if( (int)face->v1 >= self->mesh->totvert ||
- (int)face->v2 >= self->mesh->totvert ||
- (int)face->v3 >= self->mesh->totvert ||
- (int)face->v4 >= self->mesh->totvert )
+ return NULL; /* error is set */
+
+ if MFACE_VERT_BADRANGE_CHECK(me, face)
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"one or more MFace vertices are no longer valid" );
- vert[0] = self->mesh->mvert[face->v1].co;
- vert[1] = self->mesh->mvert[face->v2].co;
- vert[2] = self->mesh->mvert[face->v3].co;
+ vert[0] = me->mvert[face->v1].co;
+ vert[1] = me->mvert[face->v2].co;
+ vert[2] = me->mvert[face->v3].co;
if( face->v4 ) {
- vert[3] = self->mesh->mvert[face->v4].co;
+ vert[3] = me->mvert[face->v4].co;
CalcNormFloat4( vert[0], vert[1], vert[2], vert[3], no );
} else
CalcNormFloat( vert[0], vert[1], vert[2], no );
@@ -3913,23 +3892,22 @@ static PyObject *MFace_getCent( BPy_MFace * self )
float *vert[4];
float cent[3]= {0,0,0};
int i=3, j, k;
+ Mesh *me = self->mesh;
MFace *face = MFace_get_pointer( self );
if( !face )
- return NULL;
+ return NULL; /* error is set */
+
- if( (int)face->v1 >= self->mesh->totvert ||
- (int)face->v2 >= self->mesh->totvert ||
- (int)face->v3 >= self->mesh->totvert ||
- (int)face->v4 >= self->mesh->totvert )
+ if MFACE_VERT_BADRANGE_CHECK(me, face)
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"one or more MFace vertices are no longer valid" );
- vert[0] = self->mesh->mvert[face->v1].co;
- vert[1] = self->mesh->mvert[face->v2].co;
- vert[2] = self->mesh->mvert[face->v3].co;
+ vert[0] = me->mvert[face->v1].co;
+ vert[1] = me->mvert[face->v2].co;
+ vert[2] = me->mvert[face->v3].co;
if( face->v4 ) {
- vert[3] = self->mesh->mvert[face->v4].co;
+ vert[3] = me->mvert[face->v4].co;
i=4;
}
@@ -3952,23 +3930,21 @@ static PyObject *MFace_getArea( BPy_MFace * self )
{
float *v1,*v2,*v3,*v4;
MFace *face = MFace_get_pointer( self );
+ Mesh *me = self->mesh;
if( !face )
- return NULL;
+ return NULL; /* error is set */
- if( (int)face->v1 >= self->mesh->totvert ||
- (int)face->v2 >= self->mesh->totvert ||
- (int)face->v3 >= self->mesh->totvert ||
- (int)face->v4 >= self->mesh->totvert )
+ if MFACE_VERT_BADRANGE_CHECK(me, face)
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"one or more MFace vertices are no longer valid" );
- v1 = self->mesh->mvert[face->v1].co;
- v2 = self->mesh->mvert[face->v2].co;
- v3 = self->mesh->mvert[face->v3].co;
+ v1 = me->mvert[face->v1].co;
+ v2 = me->mvert[face->v2].co;
+ v3 = me->mvert[face->v3].co;
if( face->v4 ) {
- v4 = self->mesh->mvert[face->v4].co;
+ v4 = me->mvert[face->v4].co;
return PyFloat_FromDouble( AreaQ3Dfl(v1, v2, v3, v4));
} else
return PyFloat_FromDouble( AreaT3Dfl(v1, v2, v3));
@@ -3983,7 +3959,7 @@ static PyObject *MFace_getMFlagBits( BPy_MFace * self, void * type )
MFace *face = MFace_get_pointer( self );
if( !face )
- return NULL;
+ return NULL; /* error is set */
return EXPP_getBitfield( &face->flag, (int)((long)type & 0xff), 'b' );
}
@@ -3998,7 +3974,7 @@ static int MFace_setMFlagBits( BPy_MFace * self, PyObject * value,
MFace *face = MFace_get_pointer( self );
if( !face )
- return -1;
+ return -1; /* error is set */
return EXPP_setBitfield( value, &face->flag,
(int)((long)type & 0xff), 'b' );
@@ -4012,11 +3988,11 @@ static int MFace_setSelect( BPy_MFace * self, PyObject * value,
Mesh *me;
if( !face )
- return -1;
+ return -1; /* error is set */
if( param == -1 )
return EXPP_ReturnIntError( PyExc_TypeError,
- "expected true/false argument" );
+ "expected True/False or 0/1" );
me = self->mesh;
if( param ) {
@@ -4101,7 +4077,7 @@ static int MFace_setImage( BPy_MFace *self, PyObject *value )
return 0;
}
-#define MFACE_FLAG_BITMASK ( TF_SELECT | TF_ACTIVE | TF_SEL1 | \
+#define MFACE_FLAG_BITMASK ( TF_SELECT | TF_SEL1 | \
TF_SEL2 | TF_SEL3 | TF_SEL4 | TF_HIDE )
/*
@@ -4110,6 +4086,7 @@ static int MFace_setImage( BPy_MFace *self, PyObject *value )
static PyObject *MFace_getFlag( BPy_MFace *self )
{
+ int flag;
if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
@@ -4117,8 +4094,13 @@ static PyObject *MFace_getFlag( BPy_MFace *self )
if( !MFace_get_pointer( self ) )
return NULL;
- return PyInt_FromLong( (long) ( self->mesh->mtface[self->index].flag
- & MFACE_FLAG_BITMASK ) );
+ flag = self->mesh->mtface[self->index].flag & MFACE_FLAG_BITMASK;
+
+ /* so old scripts still work */
+ if (self->index == self->mesh->act_face)
+ flag |= TF_ACTIVE;
+
+ return PyInt_FromLong( (long)( flag ) );
}
/*
@@ -4136,7 +4118,7 @@ static int MFace_setFlag( BPy_MFace *self, PyObject *value )
if( !MFace_get_pointer( self ) )
return -1;
- if( !PyInt_CheckExact ( value ) ) {
+ if( !PyInt_Check ( value ) ) {
char errstr[128];
sprintf ( errstr , "expected int bitmask of 0x%04x", MFACE_FLAG_BITMASK );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
@@ -4152,7 +4134,7 @@ static int MFace_setFlag( BPy_MFace *self, PyObject *value )
"invalid bit(s) set in mask" );
/* merge active setting with other new params */
- param |= (self->mesh->mtface[self->index].flag & TF_ACTIVE);
+ param |= (self->mesh->mtface[self->index].flag);
self->mesh->mtface[self->index].flag = (char)param;
return 0;
@@ -4164,8 +4146,6 @@ static int MFace_setFlag( BPy_MFace *self, PyObject *value )
static PyObject *MFace_getMode( BPy_MFace *self )
{
- PyObject *attr;
-
if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
@@ -4173,13 +4153,7 @@ static PyObject *MFace_getMode( BPy_MFace *self )
if( !MFace_get_pointer( self ) )
return NULL;
- attr = PyInt_FromLong( self->mesh->mtface[self->index].mode );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
+ return PyInt_FromLong( self->mesh->mtface[self->index].mode );
}
/*
@@ -4210,7 +4184,7 @@ static int MFace_setMode( BPy_MFace *self, PyObject *value )
if( !MFace_get_pointer( self ) )
return -1;
- if( !PyInt_CheckExact ( value ) ) {
+ if( !PyInt_Check ( value ) ) {
char errstr[128];
sprintf ( errstr , "expected int bitmask of 0x%04x", bitmask );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
@@ -4241,7 +4215,6 @@ static int MFace_setMode( BPy_MFace *self, PyObject *value )
static PyObject *MFace_getTransp( BPy_MFace *self )
{
- PyObject *attr;
if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
@@ -4249,13 +4222,7 @@ static PyObject *MFace_getTransp( BPy_MFace *self )
if( !MFace_get_pointer( self ) )
return NULL;
- attr = PyInt_FromLong( self->mesh->mtface[self->index].transp );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
+ return PyInt_FromLong( self->mesh->mtface[self->index].transp );
}
/*
@@ -4424,7 +4391,7 @@ static int MFace_setUVSel( BPy_MFace * self, PyObject * value )
mask = TF_SEL1;
for( i=0; i<length; ++i, mask <<= 1 ) {
PyObject *tmp = PySequence_GetItem( value, i ); /* adds a reference, remove below */
- if( !PyInt_CheckExact( tmp ) ) {
+ if( !PyInt_Check( tmp ) ) {
Py_DECREF(tmp);
return EXPP_ReturnIntError( PyExc_TypeError,
"expected a tuple of integers" );
@@ -4531,80 +4498,84 @@ static PyObject *MFace_getEdgeKeys( BPy_MFace * self )
{
MFace *face = MFace_get_pointer( self );
PyObject *attr, *edpair;
+
+ if (!face)
+ return NULL; /* error set */
+
if (face->v4) {
attr = PyTuple_New( 4 );
edpair = PyTuple_New( 2 );
if (face->v1 > face->v2) {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v2) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v1) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v2) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v1) );
} else {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v1) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v2) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v1) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v2) );
}
- PyTuple_SetItem( attr, 0, edpair );
+ PyTuple_SET_ITEM( attr, 0, edpair );
edpair = PyTuple_New( 2 );
if (face->v2 > face->v3) {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v3) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v2) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v3) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v2) );
} else {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v2) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v3) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v2) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v3) );
}
- PyTuple_SetItem( attr, 1, edpair );
+ PyTuple_SET_ITEM( attr, 1, edpair );
edpair = PyTuple_New( 2 );
if (face->v3 > face->v4) {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v4) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v3) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v4) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v3) );
} else {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v3) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v4) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v3) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v4) );
}
- PyTuple_SetItem( attr, 2, edpair );
+ PyTuple_SET_ITEM( attr, 2, edpair );
edpair = PyTuple_New( 2 );
if (face->v4 > face->v1) {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v1) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v4) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v1) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v4) );
} else {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v4) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v1) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v4) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v1) );
}
- PyTuple_SetItem( attr, 3, edpair );
+ PyTuple_SET_ITEM( attr, 3, edpair );
} else {
attr = PyTuple_New( 3 );
edpair = PyTuple_New( 2 );
if (face->v1 > face->v2) {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v2) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v1) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v2) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v1) );
} else {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v1) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v2) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v1) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v2) );
}
- PyTuple_SetItem( attr, 0, edpair );
+ PyTuple_SET_ITEM( attr, 0, edpair );
edpair = PyTuple_New( 2 );
if (face->v2 > face->v3) {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v3) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v2) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v3) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v2) );
} else {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v2) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v3) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v2) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v3) );
}
- PyTuple_SetItem( attr, 1, edpair );
+ PyTuple_SET_ITEM( attr, 1, edpair );
edpair = PyTuple_New( 2 );
if (face->v3 > face->v1) {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v1) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v3) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v1) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v3) );
} else {
- PyTuple_SetItem( edpair, 0, PyInt_FromLong(face->v3) );
- PyTuple_SetItem( edpair, 1, PyInt_FromLong(face->v1) );
+ PyTuple_SET_ITEM( edpair, 0, PyInt_FromLong(face->v3) );
+ PyTuple_SET_ITEM( edpair, 1, PyInt_FromLong(face->v1) );
}
- PyTuple_SetItem( attr, 2, edpair );
+ PyTuple_SET_ITEM( attr, 2, edpair );
}
return attr;
@@ -4820,14 +4791,15 @@ static PyObject *MFace_setProp( BPy_MFace *self, PyObject *args)
PyObject *obj;
MFace *face = MFace_get_pointer( self );
if( !face )
- return NULL;
+ return NULL; /* error set */
+
obj = Mesh_setProperty_internal(&(me->fdata), self->index, args);
mesh_update_customdata_pointers(me); //!
return obj;
}
static struct PyMethodDef BPy_MFace_methods[] = {
- {"getProperty", (PyCFunction)MFace_getProp, METH_VARARGS,
+ {"getProperty", (PyCFunction)MFace_getProp, METH_O,
"get property indicated by name"},
{"setProperty", (PyCFunction)MFace_setProp, METH_VARARGS,
"set property indicated by name"},
@@ -5032,7 +5004,8 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args,
Mesh *mesh = self->mesh;
int ignore_dups = 0;
PyObject *return_list = NULL;
-
+ char flag = ME_FACE_SEL;
+
/* before we try to add faces, add edges; if it fails; exit */
tmp = MEdgeSeq_extend( self, args );
@@ -5043,12 +5016,39 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args,
/* process any keyword arguments */
if( keywds ) {
PyObject *res = PyDict_GetItemString( keywds, "ignoreDups" );
- if( res )
+ if( res ) {
ignore_dups = PyObject_IsTrue( res );
-
+ if (ignore_dups==-1) {
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "keyword argument \"ignoreDups\" expected True/False or 0/1" );
+ }
+ }
res = PyDict_GetItemString( keywds, "indexList" );
- if( res && PyObject_IsTrue( res ) )
- return_list = PyList_New( 0 );
+ if (res) {
+ switch( PyObject_IsTrue( res ) ) {
+ case 0:
+ break;
+ case -1:
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "keyword argument \"indexList\" expected True/False or 0/1" );
+ default:
+ return_list = PyList_New( 0 );
+ }
+ }
+
+ res = PyDict_GetItemString( keywds, "smooth" );
+ if (res) {
+ switch( PyObject_IsTrue( res ) ) {
+ case 0:
+ break;
+ case -1:
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "keyword argument \"smooth\" expected True/False or 0/1" );
+ default:
+ flag |= ME_SMOOTH;
+
+ }
+ }
}
/* make sure we get a tuple of sequences of something */
@@ -5334,7 +5334,7 @@ static PyObject *MFaceSeq_extend( BPy_MEdgeSeq * self, PyObject *args,
tmpface->v3 = tmppair->v[index[2]];
tmpface->v4 = tmppair->v[index[3]];
- tmpface->flag = ME_FACE_SEL;
+ tmpface->flag = flag;
if( return_list ) {
tmp = PyInt_FromLong( mesh->totface );
@@ -5402,7 +5402,7 @@ static PyObject *MFaceSeq_delete( BPy_MFaceSeq * self, PyObject *args )
PyObject *tmp = PySequence_GetItem( args, i );
if( BPy_MFace_Check( tmp ) )
face_table[i] = ((BPy_MFace *)tmp)->index;
- else if( PyInt_CheckExact( tmp ) )
+ else if( PyInt_Check( tmp ) )
face_table[i] = PyInt_AsLong( tmp );
else {
MEM_freeN( face_table );
@@ -5569,6 +5569,70 @@ static PyObject *MFaceSeq_delete( BPy_MFaceSeq * self, PyObject *args )
Py_RETURN_NONE;
}
+/* copied from meshtools.c - should make generic? */
+static void permutate(void *list, int num, int size, int *index)
+{
+ void *buf;
+ int len;
+ int i;
+
+ len = num * size;
+
+ buf = MEM_mallocN(len, "permutate");
+ memcpy(buf, list, len);
+
+ for (i = 0; i < num; i++) {
+ memcpy((char *)list + (i * size), (char *)buf + (index[i] * size), size);
+ }
+ MEM_freeN(buf);
+}
+
+/* this wrapps list sorting then applies back to the mesh */
+static PyObject *MFaceSeq_sort( BPy_MEdgeSeq * self, PyObject *args,
+ PyObject *keywds )
+{
+ PyObject *ret, *sort_func, *newargs;
+
+ Mesh *mesh = self->mesh;
+ PyObject *sorting_list;
+ CustomDataLayer *layer;
+ int i, *index;
+
+ /* get a list for internal use */
+ sorting_list = PySequence_List( (PyObject *)self );
+ if( !sorting_list )
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "PyList_New() failed" );
+
+ /* create index list */
+ index = (int *) MEM_mallocN(sizeof(int) * mesh->totface, "sort faces");
+ if (!index)
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "faces.sort(...) failed to allocate memory" );
+
+ newargs = EXPP_PyTuple_New_Prepend(args, sorting_list);
+ sort_func = PyObject_GetAttrString( ((PyObject *)&PyList_Type), "sort");
+
+ ret = PyObject_Call(sort_func, newargs, keywds);
+
+ Py_DECREF(newargs);
+ Py_DECREF(sort_func);
+
+ if (ret) {
+ /* copy the faces indicies to index */
+ for (i = 0; i < mesh->totface; i++)
+ index[i] = ((BPy_MFace *)PyList_GET_ITEM(sorting_list, i))->index;
+
+ for(i = 0; i < mesh->fdata.totlayer; i++) {
+ layer = &mesh->fdata.layers[i];
+ permutate(layer->data, mesh->totface, CustomData_sizeof(layer->type), index);
+ }
+ }
+ Py_DECREF(sorting_list);
+ MEM_freeN(index);
+ return ret;
+}
+
static PyObject *MFaceSeq_selected( BPy_MFaceSeq * self )
{
int i, count;
@@ -5632,6 +5696,8 @@ static struct PyMethodDef BPy_MFaceSeq_methods[] = {
"add faces to mesh"},
{"delete", (PyCFunction)MFaceSeq_delete, METH_VARARGS,
"delete faces from mesh"},
+ {"sort", (PyCFunction)MFaceSeq_sort, METH_VARARGS|METH_KEYWORDS,
+ "sort the faces using list sorts syntax"},
{"selected", (PyCFunction)MFaceSeq_selected, METH_NOARGS,
"returns a list containing indices of selected faces"},
{"addPropertyLayer",(PyCFunction)MFaceSeq_add_layertype, METH_VARARGS,
@@ -5639,7 +5705,7 @@ static struct PyMethodDef BPy_MFaceSeq_methods[] = {
{"removePropertyLayer",(PyCFunction)MFaceSeq_del_layertype, METH_O,
"removes a property layer"},
{"renamePropertyLayer",(PyCFunction)MFaceSeq_rename_layertype, METH_VARARGS,
- "renames an existing property layer"},
+ "renames an existing property layer"},
{NULL, NULL, 0, NULL}
};
static PyGetSetDef BPy_MFaceSeq_getseters[] = {
@@ -5980,7 +6046,7 @@ static PyObject *Mesh_findEdges( PyObject * self, PyObject *args )
}
index1 = v1->index;
index2 = v2->index;
- } else if( PyInt_CheckExact( v1 ) && PyInt_CheckExact( v2 ) ) {
+ } else if( PyInt_Check( v1 ) && PyInt_Check( v2 ) ) {
index1 = PyInt_AsLong( (PyObject *)v1 );
index2 = PyInt_AsLong( (PyObject *)v2 );
if( (int)index1 >= mesh->totvert
@@ -6101,13 +6167,16 @@ static PyObject *Mesh_getFromObject( BPy_Mesh * self, PyObject * args )
/* get updated display list, and convert to a mesh */
makeDispListCurveTypes( tmpobj, 0 );
nurbs_to_mesh( tmpobj );
- tmpmesh = tmpobj->data;
- free_libblock_us( &G.main->object, tmpobj );
- if (ob->type != OB_MESH)
+ /* nurbs_to_mesh changes the type tp a mesh, check it worked */
+ if (tmpobj->type != OB_MESH) {
+ free_libblock_us( &G.main->object, tmpobj );
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"cant convert curve to mesh. Does the curve have any segments?" );
- break;
+ }
+ tmpmesh = tmpobj->data;
+ free_libblock_us( &G.main->object, tmpobj );
+ break;
case OB_MBALL:
/* metaballs don't have modifiers, so just convert to mesh */
ob = find_basis_mball( ob );
@@ -6355,6 +6424,10 @@ static PyObject *Mesh_removeVertGroup( PyObject * self, PyObject * value )
int nIndex;
bDeformGroup *pGroup;
+ if( G.obedit )
+ return EXPP_ReturnPyObjError(PyExc_RuntimeError,
+ "can't use removeVertGroup() while in edit mode" );
+
if( !groupStr )
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expected string argument" );
@@ -6377,8 +6450,8 @@ static PyObject *Mesh_removeVertGroup( PyObject * self, PyObject * value )
nIndex++;
object->actdef = (unsigned short)nIndex;
- del_defgroup( object );
-
+ del_defgroup_in_object_mode( object );
+
EXPP_allqueue( REDRAWBUTSALL, 1 );
Py_RETURN_NONE;
@@ -6536,7 +6609,6 @@ static PyObject *Mesh_getVertsFromGroup( BPy_Mesh* self, PyObject * args )
PyObject *vertexList;
Object *object;
Mesh *mesh;
- PyObject *tempVertexList;
int num = 0;
int weightRet = 0;
@@ -6575,15 +6647,14 @@ static PyObject *Mesh_getVertsFromGroup( BPy_Mesh* self, PyObject * args )
return EXPP_ReturnPyObjError( PyExc_AttributeError,
"no deform groups assigned to mesh" );
- /* temporary list */
- tempVertexList = PyList_New( mesh->totvert );
- if( !tempVertexList )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "getVertsFromGroup: can't create pylist!" );
-
count = 0;
if( !listObject ) { /* do entire group */
+ vertexList = PyList_New( mesh->totvert );
+ if( !vertexList )
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "getVertsFromGroup: can't create pylist!" );
+
dvert = mesh->dvert;
for( num = 0; num < mesh->totvert; num++, ++dvert ) {
for( i = 0; i < dvert->totweight; i++ ) {
@@ -6594,23 +6665,31 @@ static PyObject *Mesh_getVertsFromGroup( BPy_Mesh* self, PyObject * args )
dvert->dw[i].weight );
else
attr = PyInt_FromLong ( num );
- PyList_SetItem( tempVertexList, count, attr );
+ PyList_SetItem( vertexList, count, attr );
count++;
}
}
}
+
+ if (count < mesh->totvert)
+ PyList_SetSlice(vertexList, count, mesh->totvert, NULL);
+
} else { /* do individual vertices */
- for( i = 0; i < PyList_Size( listObject ); i++ ) {
+ int listObjectLen = PyList_Size( listObject );
+
+ vertexList = PyList_New( listObjectLen );
+ for( i = 0; i < listObjectLen; i++ ) {
PyObject *attr = NULL;
- if( !PyArg_Parse( PyList_GetItem( listObject, i ), "i", &num ) ) {
- Py_DECREF(tempVertexList);
+ num = PyInt_AsLong( PyList_GetItem( listObject, i ) );
+ if (num == -1) {/* -1 is an error AND an invalid range, we dont care which */
+ Py_DECREF(vertexList);
return EXPP_ReturnPyObjError( PyExc_TypeError,
"python list integer not parseable" );
}
if( num < 0 || num >= mesh->totvert ) {
- Py_DECREF(tempVertexList);
+ Py_DECREF(vertexList);
return EXPP_ReturnPyObjError( PyExc_ValueError,
"bad vertex index in list" );
}
@@ -6622,17 +6701,15 @@ static PyObject *Mesh_getVertsFromGroup( BPy_Mesh* self, PyObject * args )
dvert->dw[k].weight );
else
attr = PyInt_FromLong ( num );
- PyList_SetItem( tempVertexList, count, attr );
+ PyList_SetItem( vertexList, count, attr );
count++;
}
}
}
+ if (count < listObjectLen)
+ PyList_SetSlice(vertexList, count, listObjectLen, NULL);
}
- /* only return what we need */
- vertexList = PyList_GetSlice( tempVertexList, 0, count );
-
- Py_DECREF( tempVertexList );
-
+
return vertexList;
}
@@ -6873,7 +6950,7 @@ static PyObject *Mesh_removeLayer_internal( BPy_Mesh * self, PyObject * value, i
if(type == CD_MCOL && (G.f & G_VERTEXPAINT))
G.f &= ~G_VERTEXPAINT; /* get out of vertexpaint mode */
if(type == CD_MTFACE && (G.f & G_FACESELECT))
- set_faceselect(); /* get out of faceselect mode */
+ G.f |= ~G_FACESELECT; /* get out of faceselect mode */
}
}
@@ -7062,7 +7139,7 @@ static PyObject *Mesh_getMultires( BPy_Mesh * self, void *type )
static int Mesh_setMultires( BPy_Mesh * self, PyObject *value, void *type )
{
int i;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected integer argument" );
@@ -7156,7 +7233,7 @@ static PyObject *Mesh_Tools( BPy_Mesh * self, int type, void **args )
esubdivideflag( 1, 0.0, *((int *)args[0]), 1, 0 );
break;
case MESH_TOOL_REMDOUB:
- result = removedoublesflag( 1, *((float *)args[0]) );
+ result = removedoublesflag( 1, 0, *((float *)args[0]) );
attr = PyInt_FromLong( result );
if( !attr )
@@ -7321,52 +7398,66 @@ static PyObject *Mesh_fill( BPy_Mesh * self )
/*
* "pointInside" function
*/
+/* Warning - this is ordered - need to test both orders to be sure */
#define SIDE_OF_LINE(pa,pb,pp) ((pa[0]-pp[0])*(pb[1]-pp[1]))-((pb[0]-pp[0])*(pa[1]-pp[1]))
#define POINT_IN_TRI(p0,p1,p2,p3) ((SIDE_OF_LINE(p1,p2,p0)>=0) && (SIDE_OF_LINE(p2,p3,p0)>=0) && (SIDE_OF_LINE(p3,p1,p0)>=0))
static short pointInside_internal(float *vec, float *v1, float *v2, float *v3 )
{
float z,w1,w2,w3,wtot;
- if (!POINT_IN_TRI(vec, v1,v2,v3))
+
+ if (vec[2] > MAX3(v1[2], v2[2], v3[2]))
return 0;
- if (vec[2] < MAX3(v1[2], v2[2], v3[2])) {
- w1= AreaF2Dfl(vec, v2, v3);
- w2= AreaF2Dfl(v1, vec, v3);
- w3= AreaF2Dfl(v1, v2, vec);
- wtot = w1+w2+w3;
- w1/=wtot; w2/=wtot; w3/=wtot;
- z =((v1[2] * (w2+w3)) +
- (v2[2] * (w1+w3)) +
- (v3[2] * (w1+w2))) * 0.5;
- /* only return true if the face is above vec*/
- if (vec[2] < z )
- return 1;
- }
+ /* need to test both orders */
+ if (!POINT_IN_TRI(vec, v1,v2,v3) && !POINT_IN_TRI(vec, v3,v2,v1))
+ return 0;
+
+ w1= AreaF2Dfl(vec, v2, v3);
+ w2= AreaF2Dfl(v1, vec, v3);
+ w3= AreaF2Dfl(v1, v2, vec);
+ wtot = w1+w2+w3;
+ w1/=wtot; w2/=wtot; w3/=wtot;
+ z =((v1[2] * w1) +
+ (v2[2] * w2) +
+ (v3[2] * w3));
+
+ /* only return true if the face is above vec*/
+ if (vec[2] < z )
+ return 1;
+
return 0;
}
-static PyObject *Mesh_pointInside( BPy_Mesh * self, VectorObject * vec )
+static PyObject *Mesh_pointInside( BPy_Mesh * self, PyObject * args, PyObject *kwd )
{
Mesh *mesh = self->mesh;
MFace *mf = mesh->mface;
MVert *mvert = mesh->mvert;
int i;
int isect_count=0;
+ int selected_only = 0;
+ VectorObject *vec;
+ static char *kwlist[] = {"point", "selected_only", NULL};
- if(!VectorObject_Check(vec))
- return EXPP_ReturnPyObjError( PyExc_TypeError,
- "expected one vector type" );
+ if( !PyArg_ParseTupleAndKeywords(args, kwd, "|O!i", kwlist,
+ &vector_Type, &vec, &selected_only) ) {
+ return EXPP_ReturnPyObjError( PyExc_TypeError, "expected a vector and an optional bool argument");
+ }
if(vec->size < 3)
return EXPP_ReturnPyObjError(PyExc_AttributeError,
- "Mesh.pointInside(vec) expects a 3D vector objects\n");
+ "Mesh.pointInside(vec) expects a 3D vector object\n");
- for( i = 0; i < mesh->totface; ++mf, ++i ) {
- if (pointInside_internal(vec->vec, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co))
- isect_count++;
- else if (mf->v4 && pointInside_internal(vec->vec,mvert[mf->v1].co, mvert[mf->v3].co, mvert[mf->v4].co))
- isect_count++;
+ for( i = 0; i < mesh->totface; mf++, i++ ) {
+ if (!selected_only || mf->flag & ME_FACE_SEL) {
+ if (pointInside_internal(vec->vec, mvert[mf->v1].co, mvert[mf->v2].co, mvert[mf->v3].co)) {
+ isect_count++;
+ } else if (mf->v4 && pointInside_internal(vec->vec,mvert[mf->v1].co, mvert[mf->v3].co, mvert[mf->v4].co)) {
+
+ isect_count++;
+ }
+ }
}
if (isect_count % 2)
@@ -7451,7 +7542,7 @@ static struct PyMethodDef BPy_Mesh_methods[] = {
"Removes duplicates from selected vertices (experimental)"},
{"recalcNormals", (PyCFunction)Mesh_recalcNormals, METH_VARARGS,
"Recalculates inside or outside normals (experimental)"},
- {"pointInside", (PyCFunction)Mesh_pointInside, METH_O,
+ {"pointInside", (PyCFunction)Mesh_pointInside, METH_VARARGS|METH_KEYWORDS,
"Recalculates inside or outside normals (experimental)"},
/* mesh custom data layers */
@@ -7519,7 +7610,7 @@ static int Mesh_setVerts( BPy_Mesh * self, PyObject * args )
free_mesh( me );
me->mvert = NULL; me->medge = NULL; me->mface = NULL;
me->mtface = NULL; me->dvert = NULL; me->mcol = NULL;
- me->msticky = NULL; me->mat = NULL; me->bb = NULL;
+ me->msticky = NULL; me->mat = NULL; me->bb = NULL; me->mselect = NULL;
me->totvert = me->totedge = me->totface = me->totcol = 0;
mesh_update( me );
return 0;
@@ -7638,13 +7729,7 @@ static int Mesh_setMaterials( BPy_Mesh *self, PyObject * value )
static PyObject *Mesh_getMaxSmoothAngle( BPy_Mesh * self )
{
- PyObject *attr = PyInt_FromLong( self->mesh->smoothresh );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
+ return PyInt_FromLong( self->mesh->smoothresh );
}
static int Mesh_setMaxSmoothAngle( BPy_Mesh *self, PyObject *value )
@@ -7656,14 +7741,8 @@ static int Mesh_setMaxSmoothAngle( BPy_Mesh *self, PyObject *value )
static PyObject *Mesh_getSubDivLevels( BPy_Mesh * self )
{
- PyObject *attr = Py_BuildValue( "(h,h)",
+ return Py_BuildValue( "(h,h)",
self->mesh->subdiv, self->mesh->subdivr );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "Py_BuildValue() failed" );
}
static int Mesh_setSubDivLevels( BPy_Mesh *self, PyObject *value )
@@ -7693,34 +7772,23 @@ static int Mesh_setSubDivLevels( BPy_Mesh *self, PyObject *value )
static PyObject *Mesh_getFlag( BPy_Mesh * self, void *type )
{
- PyObject *attr;
-
switch( (long)type ) {
case MESH_HASFACEUV:
- attr = self->mesh->mtface ? EXPP_incr_ret_True() :
+ return self->mesh->mtface ? EXPP_incr_ret_True() :
EXPP_incr_ret_False();
- break;
case MESH_HASMCOL:
- attr = self->mesh->mcol ? EXPP_incr_ret_True() :
+ return self->mesh->mcol ? EXPP_incr_ret_True() :
EXPP_incr_ret_False();
- break;
case MESH_HASVERTUV:
- attr = self->mesh->msticky ? EXPP_incr_ret_True() :
+ return self->mesh->msticky ? EXPP_incr_ret_True() :
EXPP_incr_ret_False();
- break;
case MESH_HASMULTIRES:
- attr = self->mesh->mr ? EXPP_incr_ret_True() :
+ return self->mesh->mr ? EXPP_incr_ret_True() :
EXPP_incr_ret_False();
- break;
default:
- attr = NULL;
- }
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"couldn't get attribute" );
+ }
}
static int Mesh_setFlag( BPy_Mesh * self, PyObject *value, void *type )
@@ -7732,7 +7800,7 @@ static int Mesh_setFlag( BPy_Mesh * self, PyObject *value, void *type )
if( param == -1 )
return EXPP_ReturnIntError( PyExc_TypeError,
- "expected int argument in range [0,1]" );
+ "expected True/False or 0/1" );
/* sticky is independent of faceUV and vertUV */
@@ -7803,13 +7871,7 @@ static int Mesh_setFlag( BPy_Mesh * self, PyObject *value, void *type )
static PyObject *Mesh_getMode( BPy_Mesh * self )
{
- PyObject *attr = PyInt_FromLong( self->mesh->flag );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Mesh.mode attribute" );
+ return PyInt_FromLong( self->mesh->flag );
}
static int Mesh_setMode( BPy_Mesh *self, PyObject *value )
@@ -7819,7 +7881,7 @@ static int Mesh_setMode( BPy_Mesh *self, PyObject *value )
ME_UVEFFECT | ME_VCOLEFFECT | ME_AUTOSMOOTH | ME_SMESH |
ME_SUBSURF | ME_OPT_EDGES;
- if( !PyInt_CheckExact ( value ) ) {
+ if( !PyInt_Check ( value ) ) {
char errstr[128];
sprintf ( errstr , "expected int bitmask of 0x%04x", bitmask );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
@@ -7846,33 +7908,19 @@ static PyObject *Mesh_getKey( BPy_Mesh * self )
static PyObject *Mesh_getActiveFace( BPy_Mesh * self )
{
- MTFace *face;
- int i, totface;
-
+ /* not needed but keep incase exceptions make use of it */
if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
- face = self->mesh->mtface;
- totface = self->mesh->totface;
-
- for( i = 0; i < totface; ++face, ++i )
- if( face->flag & TF_ACTIVE ) {
- PyObject *attr = PyInt_FromLong( i );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyInt_FromLong() failed" );
- }
-
+ if (self->mesh->act_face != -1 && self->mesh->act_face <= self->mesh->totface)
+ return PyInt_FromLong( self->mesh->act_face );
+
Py_RETURN_NONE;
}
static int Mesh_setActiveFace( BPy_Mesh * self, PyObject * value )
{
- MTFace *face;
int param;
/* if no texture faces, error */
@@ -7883,7 +7931,7 @@ static int Mesh_setActiveFace( BPy_Mesh * self, PyObject * value )
/* if param isn't an int, error */
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected an int argument" );
@@ -7893,18 +7941,8 @@ static int Mesh_setActiveFace( BPy_Mesh * self, PyObject * value )
if( param < 0 || param > self->mesh->totface )
return EXPP_ReturnIntError( PyExc_TypeError,
"face index out of range" );
-
- face = self->mesh->mtface;
-
- /* if requested face isn't already active, then inactivate all
- * faces and activate the requested one */
-
- if( !( face[param].flag & TF_ACTIVE ) ) {
- int i;
- for( i = self->mesh->totface; i > 0; ++face, --i )
- face->flag &= ~TF_ACTIVE;
- self->mesh->mtface[param].flag |= TF_ACTIVE;
- }
+
+ self->mesh->act_face = param;
return 0;
}
@@ -7968,18 +8006,22 @@ static int Mesh_setTexMesh( BPy_Mesh * self, PyObject * value )
if (ret==0 && value!=Py_None) /*This must be a mesh type*/
(( BPy_Mesh * ) value)->new= 0;
- return 0;
+ return ret;
}
-static int Mesh_setSel( BPy_Mesh * self, PyObject * arg )
+static int Mesh_setSel( BPy_Mesh * self, PyObject * value )
{
- int i;
+ int i, param = PyObject_IsTrue( value );
Mesh *me = self->mesh;
MVert *mvert = me->mvert;
MEdge *medge = me->medge;
MFace *mface = me->mface;
- if( PyObject_IsTrue( arg ) ) {
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if( param ) {
for( i = 0; i < me->totvert; ++mvert, ++i )
mvert->flag |= SELECT;
for( i = 0; i < me->totedge; ++medge, ++i )
@@ -7998,15 +8040,19 @@ static int Mesh_setSel( BPy_Mesh * self, PyObject * arg )
return 0;
}
-static int Mesh_setHide( BPy_Mesh * self, PyObject * arg )
+static int Mesh_setHide( BPy_Mesh * self, PyObject * value )
{
- int i;
+ int i, param = PyObject_IsTrue( value );
Mesh *me = self->mesh;
MVert *mvert = me->mvert;
MEdge *medge = me->medge;
MFace *mface = me->mface;
- if( PyObject_IsTrue( arg ) ) {
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if( param ) {
for( i = 0; i < me->totvert; ++mvert, ++i )
mvert->flag |= ME_HIDE;
for( i = 0; i < me->totedge; ++medge, ++i )
@@ -8475,7 +8521,7 @@ static PyObject *M_Mesh_FaceFlagsDict( void )
PyConstant_Insert( d, "SELECT", PyInt_FromLong( TF_SELECT ) );
PyConstant_Insert( d, "HIDE", PyInt_FromLong( TF_HIDE ) );
- PyConstant_Insert( d, "ACTIVE", PyInt_FromLong( TF_ACTIVE ) );
+ PyConstant_Insert( d, "ACTIVE", PyInt_FromLong( TF_ACTIVE ) ); /* deprecated */
}
return FF;
diff --git a/source/blender/python/api2_2x/Metaball.c b/source/blender/python/api2_2x/Metaball.c
index b8d3bd3dba0..98dc7ea1127 100644
--- a/source/blender/python/api2_2x/Metaball.c
+++ b/source/blender/python/api2_2x/Metaball.c
@@ -661,7 +661,7 @@ static int Metaball_setUpdate( BPy_Metaball * self, PyObject * value )
{
int param;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"metaball.update - expected an int argument" );
@@ -744,24 +744,15 @@ static void Metaelem_dealloc( BPy_Metaelem * self )
* elem.type - int to set the shape of the element
*/
static PyObject *Metaelem_getType( BPy_Metaelem *self )
-{
- PyObject *attr = NULL;
-
+{
METAELEM_DEL_CHECK_PY(self);
- attr = PyInt_FromLong( self->metaelem->type );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "metaelem.type - PyInt_FromLong() failed!" );
+ return PyInt_FromLong( self->metaelem->type );
}
static int Metaelem_setType( BPy_Metaelem * self, PyObject * value )
{
-
int type;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"metaelem.type - expected an integer (bitmask) as argument" );
diff --git a/source/blender/python/api2_2x/Modifier.c b/source/blender/python/api2_2x/Modifier.c
index 93f0f76af02..a1b052eb674 100644
--- a/source/blender/python/api2_2x/Modifier.c
+++ b/source/blender/python/api2_2x/Modifier.c
@@ -749,11 +749,11 @@ static int wave_setter( BPy_Modifier *self, int type, PyObject *value )
case EXPP_MOD_SPEED:
return EXPP_setFloatClamped( value, &md->speed, -2.0, 2.0 );
case EXPP_MOD_DAMP:
- return EXPP_setFloatClamped( value, &md->damp, -1000.0, 1000.0 );
+ return EXPP_setFloatClamped( value, &md->damp, -MAXFRAMEF, MAXFRAMEF );
case EXPP_MOD_LIFETIME:
- return EXPP_setFloatClamped( value, &md->lifetime, -1000.0, 1000.0 );
+ return EXPP_setFloatClamped( value, &md->lifetime, -MAXFRAMEF, MAXFRAMEF );
case EXPP_MOD_TIMEOFFS:
- return EXPP_setFloatClamped( value, &md->timeoffs, -1000.0, 1000.0 );
+ return EXPP_setFloatClamped( value, &md->timeoffs, -MAXFRAMEF, MAXFRAMEF );
case EXPP_MOD_FLAG:
return EXPP_setIValueRange( value, &md->flag, 0,
MOD_WAVE_X | MOD_WAVE_Y | MOD_WAVE_CYCL, 'h' );
@@ -987,7 +987,7 @@ static PyObject *Modifier_getData( BPy_Modifier * self, PyObject * key )
{
int setting;
- if( !PyInt_CheckExact( key ) )
+ if( !PyInt_Check( key ) )
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expected an int arg as stored in Blender.Modifier.Settings" );
diff --git a/source/blender/python/api2_2x/NLA.c b/source/blender/python/api2_2x/NLA.c
index 31a420a15a2..7d701382f7b 100644
--- a/source/blender/python/api2_2x/NLA.c
+++ b/source/blender/python/api2_2x/NLA.c
@@ -221,18 +221,20 @@ static PyObject *Action_getFrameNumbers(BPy_Action *self)
py_list = PyList_New(0);
for(achan = self->action->chanbase.first; achan; achan = achan->next){
- for (icu = achan->ipo->curve.first; icu; icu = icu->next){
- bezt= icu->bezt;
- if(bezt) {
- verts = icu->totvert;
- while(verts--) {
- PyObject *value;
- value = PyInt_FromLong((int)bezt->vec[1][0]);
- if ( PySequence_Contains(py_list, value) == 0){
- PyList_Append(py_list, value);
+ if (achan->ipo) {
+ for (icu = achan->ipo->curve.first; icu; icu = icu->next){
+ bezt= icu->bezt;
+ if(bezt) {
+ verts = icu->totvert;
+ while(verts--) {
+ PyObject *value;
+ value = PyInt_FromLong((int)bezt->vec[1][0]);
+ if ( PySequence_Contains(py_list, value) == 0){
+ PyList_Append(py_list, value);
+ }
+ Py_DECREF(value);
+ bezt++;
}
- Py_DECREF(value);
- bezt++;
}
}
}
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index 0a4e8b50406..e50c9678606 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -1554,13 +1554,7 @@ Mesh *Mesh_fromNMesh( BPy_NMesh * nmesh )
static PyObject *NMesh_getMaxSmoothAngle( BPy_NMesh * self )
{
- PyObject *attr = PyInt_FromLong( self->smoothresh );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get NMesh.maxSmoothAngle attribute" );
+ return PyInt_FromLong( self->smoothresh );
}
static PyObject *NMesh_setMaxSmoothAngle( PyObject * self, PyObject * args )
@@ -1581,14 +1575,7 @@ static PyObject *NMesh_setMaxSmoothAngle( PyObject * self, PyObject * args )
static PyObject *NMesh_getSubDivLevels( BPy_NMesh * self )
{
- PyObject *attr =
- Py_BuildValue( "[h,h]", self->subdiv[0], self->subdiv[1] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get NMesh.subDivLevels attribute" );
+ return Py_BuildValue( "[h,h]", self->subdiv[0], self->subdiv[1] );
}
static PyObject *NMesh_setSubDivLevels( PyObject * self, PyObject * args )
@@ -1613,13 +1600,7 @@ static PyObject *NMesh_setSubDivLevels( PyObject * self, PyObject * args )
static PyObject *NMesh_getMode( BPy_NMesh * self )
{
- PyObject *attr = PyInt_FromLong( self->mode );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get NMesh.mode attribute" );
+ return PyInt_FromLong( self->mode );
}
static PyObject *NMesh_setMode( PyObject * self, PyObject * args )
@@ -1997,20 +1978,11 @@ static BPy_NMVert *nmvert_from_data( MVert * vert, MSticky * st, float *co,
static int get_active_faceindex( Mesh * me )
{
- MTFace *tf;
- int i;
-
if( me == NULL )
return -1;
- tf = me->mtface;
- if( tf == 0 )
- return -1;
-
- for( i = 0; i < me->totface; i++ )
- if( tf[i].flag & TF_ACTIVE )
- return i;
-
+ if (me->act_face != -1 && me->act_face < me->totface)
+ return me->act_face;
return -1;
}
diff --git a/source/blender/python/api2_2x/Noise.c b/source/blender/python/api2_2x/Noise.c
index 5253ea810b0..c1a41d46714 100644
--- a/source/blender/python/api2_2x/Noise.c
+++ b/source/blender/python/api2_2x/Noise.c
@@ -199,7 +199,7 @@ static PyObject *Noise_random( PyObject * self )
static PyObject *Noise_randuvec( PyObject * self )
{
- float v[3];
+ float v[3] = {0.0f, 0.0f, 0.0f};
randuvec( v );
return Py_BuildValue( "[fff]", v[0], v[1], v[2] );
}
diff --git a/source/blender/python/api2_2x/Object.c b/source/blender/python/api2_2x/Object.c
index 73859bedcdd..e62f685cdf5 100644
--- a/source/blender/python/api2_2x/Object.c
+++ b/source/blender/python/api2_2x/Object.c
@@ -70,6 +70,7 @@ struct rctf;
#include "BKE_idprop.h"
#include "BKE_object.h"
#include "BKE_key.h" /* for setting the activeShape */
+#include "BKE_displist.h"
#include "BSE_editipo.h"
#include "BSE_edit.h"
@@ -1209,16 +1210,16 @@ static PyObject *Object_getSelected( BPy_Object * self )
static int Object_setSelect( BPy_Object * self, PyObject * value )
{
Base *base;
- int setting = PyObject_IsTrue( value );
+ int param = PyObject_IsTrue( value );
- if( setting == -1 )
+ if( param == -1 )
return EXPP_ReturnIntError( PyExc_TypeError,
- "expected true/false argument" );
+ "expected True/False or 0/1" );
base = FIRSTBASE;
while( base ) {
if( base->object == self->object ) {
- if( setting == 1 ) {
+ if( param ) {
base->flag |= SELECT;
self->object->flag = (short)base->flag;
set_active_base( base );
@@ -1230,7 +1231,9 @@ static int Object_setSelect( BPy_Object * self, PyObject * value )
}
base = base->next;
}
- countall( );
+ if (base) { /* was the object selected? */
+ countall( );
+ }
return 0;
}
@@ -1330,7 +1333,7 @@ static PyObject *Object_getParent( BPy_Object * self )
static PyObject *Object_getParentBoneName( BPy_Object * self )
{
- if( self->object->parent && self->object->parsubstr[0] != '\0' )
+ if( self->object->parent && self->object->parent->type==OB_ARMATURE && self->object->parsubstr[0] != '\0' )
return PyString_FromString( self->object->parsubstr );
Py_RETURN_NONE;
}
@@ -1364,22 +1367,30 @@ static int Object_setParentBoneName( BPy_Object * self, PyObject *value )
static PyObject *Object_getSize( BPy_Object * self, PyObject * args )
{
- PyObject *attr;
char *space = "localspace"; /* default to local */
-
+ PyObject *attr;
if( !PyArg_ParseTuple( args, "|s", &space ) )
return EXPP_ReturnPyObjError( PyExc_TypeError,
"expected a string or nothing" );
if( BLI_streq( space, "worldspace" ) ) { /* Worldspace matrix */
- float scale[3];
+ float rot[3];
+ float mat[3][3], imat[3][3], tmat[3][3];
disable_where_script( 1 );
where_is_object( self->object );
- Mat4ToSize(self->object->obmat, scale);
+
+ Mat3CpyMat4(mat, self->object->obmat);
+
+ /* functionality copied from editobject.c apply_obmat */
+ Mat3ToEul(mat, rot);
+ EulToMat3(rot, tmat);
+ Mat3Inv(imat, tmat);
+ Mat3MulMat3(tmat, imat, mat);
+
attr = Py_BuildValue( "fff",
- self->object->size[0],
- self->object->size[1],
- self->object->size[2] );
+ tmat[0][0],
+ tmat[1][1],
+ tmat[2][2] );
disable_where_script( 0 );
} else if( BLI_streq( space, "localspace" ) ) { /* Localspace matrix */
attr = Py_BuildValue( "fff",
@@ -1388,9 +1399,8 @@ static PyObject *Object_getSize( BPy_Object * self, PyObject * args )
self->object->size[2] );
} else {
return EXPP_ReturnPyObjError( PyExc_ValueError,
- "expected either nothing, 'localspace' (default) or 'worldspace'" );
+ "expected either nothing, 'localspace' (default) or 'worldspace'" );
}
-
return attr;
}
@@ -1561,8 +1571,11 @@ static PyObject *Object_makeDisplayList( BPy_Object * self )
{
Object *ob = self->object;
- if( ob->type == OB_FONT )
+ if( ob->type == OB_FONT ) {
+ Curve *cu = ob->data;
+ freedisplist( &cu->disp );
text_to_curve( ob, 0 );
+ }
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
@@ -2345,31 +2358,31 @@ static PyObject *Object_insertIpoKey( BPy_Object * self, PyObject * args )
actname= "Object";
if (key == IPOKEY_LOC || key == IPOKEY_LOCROT || key == IPOKEY_LOCROTSIZE){
- insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_X);
- insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_Y);
- insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_Z);
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_X, 0);
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_Y, 0);
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_LOC_Z, 0);
}
if (key == IPOKEY_ROT || key == IPOKEY_LOCROT || key == IPOKEY_LOCROTSIZE){
- insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_X);
- insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_Y);
- insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_Z);
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_X, 0);
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_Y, 0);
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_ROT_Z, 0);
}
if (key == IPOKEY_SIZE || key == IPOKEY_LOCROTSIZE ){
- insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_X);
- insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_Y);
- insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_Z);
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_X, 0);
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_Y, 0);
+ insertkey((ID *)ob, ID_OB, actname, NULL,OB_SIZE_Z, 0);
}
if (key == IPOKEY_PI_STRENGTH ){
- insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_FSTR);
+ insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_FSTR, 0);
} else if (key == IPOKEY_PI_FALLOFF ){
- insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_FFALL);
+ insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_FFALL, 0);
} else if (key == IPOKEY_PI_SURFACEDAMP ){
- insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_SDAMP);
+ insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_SDAMP, 0);
} else if (key == IPOKEY_PI_RANDOMDAMP ){
- insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_RDAMP);
+ insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_RDAMP, 0);
} else if (key == IPOKEY_PI_PERM ){
- insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_PERM);
+ insertkey((ID *)ob, ID_OB, actname, NULL, OB_PD_PERM, 0);
}
allspace(REMAKEIPO, 0);
@@ -2412,16 +2425,16 @@ static PyObject *Object_insertPoseKey( BPy_Object * self, PyObject * args )
/* XXX: must check chanName actually exists, otherwise segfaults! */
//achan = get_action_channel(sourceact->action, chanName);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_X);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Y);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Z);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_X);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Y);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Z);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_W);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_X);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Y);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Z);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_X, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Y, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Z, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_X, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Y, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Z, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_W, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_X, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Y, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Z, 0);
G.scene->r.cfra = oldframe;
@@ -2458,16 +2471,16 @@ static PyObject *Object_insertCurrentPoseKey( BPy_Object * self, PyObject * args
/* XXX: must check chanName actually exists, otherwise segfaults! */
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_X);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Y);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Z);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_X);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Y);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Z);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_W);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_X);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Y);
- insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Z);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_X, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Y, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_LOC_Z, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_X, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Y, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_Z, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_QUAT_W, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_X, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Y, 0);
+ insertkey(&ob->id, ID_PO, chanName, NULL, AC_SIZE_Z, 0);
G.scene->r.cfra = oldframe;
@@ -2504,7 +2517,7 @@ static PyObject *Object_setConstraintInfluenceForBone( BPy_Object * self,
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"cannot get a curve from this IPO, may be using libdata" );
- insert_vert_ipo(icu, (float)CFRA, influence);
+ insert_vert_icu(icu, (float)CFRA, influence, 0);
self->object->recalc |= OB_RECALC_OB;
Py_RETURN_NONE;
@@ -2944,20 +2957,20 @@ static PyObject *Object_getNLAflagBits ( BPy_Object * self )
Py_RETURN_FALSE;
}
-static int Object_setNLAflagBits ( BPy_Object * self, PyObject * args )
+static int Object_setNLAflagBits ( BPy_Object * self, PyObject * value )
{
- int value;
+ int param;
- value = PyObject_IsTrue( args );
- if( value == -1 )
+ param = PyObject_IsTrue( value );
+ if( param == -1 )
return EXPP_ReturnIntError( PyExc_TypeError,
- "expected 1/0 for true/false" );
+ "expected True/False or 0/1" );
- if (value==1)
+ if (param)
self->object->nlaflag |= OB_NLA_OVERRIDE;
else
self->object->nlaflag &= ~OB_NLA_OVERRIDE;
-
+
self->object->recalc |= OB_RECALC_OB;
return 0;
@@ -2966,7 +2979,6 @@ static int Object_setNLAflagBits ( BPy_Object * self, PyObject * args )
static PyObject *Object_getDupliObjects( BPy_Object * self )
{
Object *ob= self->object;
- PyObject *pair;
if(ob->transflag & OB_DUPLI) {
/* before make duplis, update particle for current frame */
@@ -2988,6 +3000,7 @@ static PyObject *Object_getDupliObjects( BPy_Object * self )
"PyList_New() failed" );
for(dupob= duplilist->first, index=0; dupob; dupob= dupob->next, index++) {
+ PyObject *pair;
pair = PyTuple_New( 2 );
PyTuple_SET_ITEM( pair, 0, Object_CreatePyObject(dupob->ob) );
@@ -3189,20 +3202,20 @@ static PyObject *Object_getPIDeflection( BPy_Object * self )
return PyBool_FromLong( ( long ) self->object->pd->deflect );
}
-static int Object_setPIDeflection( BPy_Object * self, PyObject * args )
+static int Object_setPIDeflection( BPy_Object * self, PyObject * value )
{
- int value;
+ int param;
if( !self->object->pd && !setupPI(self->object) )
return EXPP_ReturnIntError( PyExc_RuntimeError,
"particle deflection could not be accessed" );
- value = PyObject_IsTrue( args );
- if( value == -1 )
+ param = PyObject_IsTrue( value );
+ if( param == -1 )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected true/false argument" );
- self->object->pd->deflect = (short)value;
+ self->object->pd->deflect = (short)param;
self->object->recalc |= OB_RECALC_OB;
return 0;
@@ -3254,20 +3267,20 @@ static PyObject *Object_getPIUseMaxDist( BPy_Object * self )
return PyBool_FromLong( ( long )self->object->pd->flag );
}
-static int Object_setPIUseMaxDist( BPy_Object * self, PyObject * args )
+static int Object_setPIUseMaxDist( BPy_Object * self, PyObject * value )
{
- int value;
+ int param;
if( !self->object->pd && !setupPI(self->object) )
return EXPP_ReturnIntError( PyExc_RuntimeError,
"particle deflection could not be accessed" );
- value = PyObject_IsTrue( args );
- if( value == -1 )
+ param = PyObject_IsTrue( value );
+ if( param == -1 )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected true/false argument" );
- self->object->pd->flag = (short)value;
+ self->object->pd->flag = (short)param;
self->object->recalc |= OB_RECALC_OB;
return 0;
@@ -3368,9 +3381,9 @@ static PyObject *Object_getSBUseGoal( BPy_Object * self )
Py_RETURN_FALSE;
}
-static int Object_setSBUseGoal( BPy_Object * self, PyObject * args )
+static int Object_setSBUseGoal( BPy_Object * self, PyObject * value )
{
- int setting = PyObject_IsTrue( args );
+ int setting = PyObject_IsTrue( value );
if( !self->object->soft && !setupSB(self->object) )
return EXPP_ReturnIntError( PyExc_RuntimeError,
@@ -3401,9 +3414,9 @@ static PyObject *Object_getSBUseEdges( BPy_Object * self )
Py_RETURN_FALSE;
}
-static int Object_setSBUseEdges( BPy_Object * self, PyObject * args )
+static int Object_setSBUseEdges( BPy_Object * self, PyObject * value )
{
- int setting = PyObject_IsTrue( args );
+ int setting = PyObject_IsTrue( value );
if( !self->object->soft && !setupSB(self->object) )
return EXPP_ReturnIntError( PyExc_RuntimeError,
@@ -3434,9 +3447,9 @@ static PyObject *Object_getSBStiffQuads( BPy_Object * self )
Py_RETURN_FALSE;
}
-static int Object_setSBStiffQuads( BPy_Object * self, PyObject * args )
+static int Object_setSBStiffQuads( BPy_Object * self, PyObject * value )
{
- int setting = PyObject_IsTrue( args );
+ int setting = PyObject_IsTrue( value );
if( !self->object->soft && !setupSB(self->object) )
return EXPP_ReturnIntError( PyExc_RuntimeError,
@@ -3533,7 +3546,6 @@ void Object_updateDag( void *data )
static PyObject *getIntAttr( BPy_Object *self, void *type )
{
- PyObject *attr = NULL;
int param;
struct Object *object = self->object;
@@ -3580,13 +3592,7 @@ static PyObject *getIntAttr( BPy_Object *self, void *type )
"undefined type in getIntAttr" );
}
- attr = PyInt_FromLong( param );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "PyInt_FromLong() failed!" );
+ return PyInt_FromLong( param );
}
/*
@@ -3669,7 +3675,7 @@ static int setIntAttrRange( BPy_Object *self, PyObject *value, void *type )
struct Object *object = self->object;
int min, max, size;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected integer argument" );
@@ -4077,7 +4083,6 @@ static int setFloatAttr( BPy_Object *self, PyObject *value, void *type )
static PyObject *getFloat3Attr( BPy_Object *self, void *type )
{
- PyObject *attr = NULL;
float *param;
struct Object *object = self->object;
@@ -4102,13 +4107,7 @@ static PyObject *getFloat3Attr( BPy_Object *self, void *type )
"undefined type in getFloat3Attr" );
}
- attr = Py_BuildValue( "(fff)", param[0], param[1], param[2] );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "Py_BuildValue() failed!" );
+ return Py_BuildValue( "(fff)", param[0], param[1], param[2] );
}
/*
@@ -4193,7 +4192,12 @@ static PyObject *Object_getRestricted( BPy_Object *self, void *type )
static int Object_setRestricted( BPy_Object *self, PyObject *value,
void *type )
{
- if (PyObject_IsTrue(value) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if ( param )
self->object->restrictflag |= (int)type;
else
self->object->restrictflag &= ~(int)type;
@@ -4297,13 +4301,16 @@ static int Object_setLayers( BPy_Object * self, PyObject *value )
local = base->lay;
base->lay = local | layers;
self->object->lay = base->lay;
+ break;
}
base = base->next;
}
/* these to calls here are overkill! (ton) */
- countall();
- DAG_scene_sort( G.scene );
+ if (base) { /* The object was found? */
+ countall();
+ DAG_scene_sort( G.scene );
+ }
return 0;
}
@@ -4312,7 +4319,7 @@ static int Object_setLayersMask( BPy_Object *self, PyObject *value )
int layers = 0, local;
Base *base;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected an integer (bitmask) as argument" );
@@ -4333,11 +4340,14 @@ static int Object_setLayersMask( BPy_Object *self, PyObject *value )
local = base->lay;
base->lay = local | layers;
self->object->lay = base->lay;
+ break;
}
base = base->next;
}
- countall();
- DAG_scene_sort( G.scene );
+ if (base) { /* The object was found? */
+ countall();
+ DAG_scene_sort( G.scene );
+ }
return 0;
}
@@ -5044,10 +5054,6 @@ static PyGetSetDef BPy_Object_getseters[] = {
(getter)Object_getRBHalfExtents, (setter)NULL,
"Rigid body physics bounds object type",
NULL},
- {"type",
- (getter)Object_getType, (setter)NULL,
- "String describing Object type",
- NULL},
{"restrictDisplay",
(getter)Object_getRestricted, (setter)Object_setRestricted,
diff --git a/source/blender/python/api2_2x/Pose.c b/source/blender/python/api2_2x/Pose.c
index fe60b04b5ff..01fbe591a74 100644
--- a/source/blender/python/api2_2x/Pose.c
+++ b/source/blender/python/api2_2x/Pose.c
@@ -57,6 +57,8 @@
#include "DNA_armature_types.h" /*used for pose bone select*/
+#include "MEM_guardedalloc.h"
+
extern void chan_calc_mat(bPoseChannel *chan);
//------------------------ERROR CODES---------------------------------
@@ -143,11 +145,14 @@ static int PoseBonesDict_InitBones(BPy_PoseBonesDict *self)
//This is the string representation of the object
static PyObject *PoseBonesDict_repr(BPy_PoseBonesDict *self)
{
- char buffer[128], str[4096];
+ char buffer[128], *str;
PyObject *key, *value;
int pos = 0;
-
- BLI_strncpy(str,"",4096);
+
+ /* probably a bit of overkill but better then crashing */
+ str = MEM_mallocN( 64 + ( PyDict_Size( self->bonesMap ) * 128), "PoseBonesDict_repr" );
+ str[0] = '\0';
+
sprintf(buffer, "[Pose Bone Dict: {");
strcat(str,buffer);
while (PyDict_Next(self->bonesMap, &pos, &key, &value)) {
@@ -157,6 +162,9 @@ static PyObject *PoseBonesDict_repr(BPy_PoseBonesDict *self)
}
sprintf(buffer, "}]\n");
strcat(str,buffer);
+
+ MEM_freeN( str );
+
return PyString_FromString(str);
}
@@ -414,7 +422,11 @@ static PyObject *PoseBone_insertKey(BPy_PoseBone *self, PyObject *args)
if (!PyArg_ParseTuple(args, "O!i|Oi", &Object_Type, &parent_object, &frame, &constants, &no_ipo_update ))
goto AttributeError;
-
+
+ /* incase we ever have a value other then 1 for fast */
+ if (no_ipo_update)
+ no_ipo_update = 1;
+
//verify that this pchannel is part of the object->pose
for (pchan = ((BPy_Object*)parent_object)->object->pose->chanbase.first;
pchan; pchan = pchan->next){
@@ -479,40 +491,40 @@ static PyObject *PoseBone_insertKey(BPy_PoseBone *self, PyObject *args)
//add the action channel if it's not there
verify_action_channel(((BPy_Object*)parent_object)->object->action,
self->posechannel->name);
-
+
//insert the pose keys
if (self->posechannel->flag & POSE_ROT){
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_QUAT_X);
+ ID_PO, self->posechannel->name, NULL, AC_QUAT_X, no_ipo_update);
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_QUAT_Y);
+ ID_PO, self->posechannel->name, NULL, AC_QUAT_Y, no_ipo_update);
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_QUAT_Z);
+ ID_PO, self->posechannel->name, NULL, AC_QUAT_Z, no_ipo_update);
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_QUAT_W);
+ ID_PO, self->posechannel->name, NULL, AC_QUAT_W, no_ipo_update);
}
if (self->posechannel->flag & POSE_LOC){
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_LOC_X);
+ ID_PO, self->posechannel->name, NULL, AC_LOC_X, no_ipo_update);
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_LOC_Y);
+ ID_PO, self->posechannel->name, NULL, AC_LOC_Y, no_ipo_update);
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_LOC_Z);
+ ID_PO, self->posechannel->name, NULL, AC_LOC_Z, no_ipo_update);
}
if (self->posechannel->flag & POSE_SIZE){
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_SIZE_X);
+ ID_PO, self->posechannel->name, NULL, AC_SIZE_X, no_ipo_update);
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_SIZE_Y);
+ ID_PO, self->posechannel->name, NULL, AC_SIZE_Y, no_ipo_update);
insertkey(&((BPy_Object*)parent_object)->object->id,
- ID_PO, self->posechannel->name, NULL, AC_SIZE_Z);
+ ID_PO, self->posechannel->name, NULL, AC_SIZE_Z, no_ipo_update);
}
//flip the frame back
G.scene->r.cfra = oldframe;
//update the IPOs
- if (!no_ipo_update)
+ if (no_ipo_update==0)
remake_action_ipos (((BPy_Object*)parent_object)->object->action);
Py_RETURN_NONE;
@@ -685,9 +697,12 @@ static int PoseBone_setLocalMatrix(BPy_PoseBone *self, PyObject *value, void *cl
}
//get loc
- if (matsize == 4){
+ if (matsize == 4) {
VECCOPY(loc, matrix->matrix[3]);
}
+ else {
+ loc[0]= loc[1]= loc[2]= 0.0f;
+ }
//copy new attributes
VECCOPY(self->posechannel->size, size);
@@ -712,10 +727,35 @@ static PyObject *PoseBone_getPoseMatrix(BPy_PoseBone *self, void *closure)
}
//------------------------PoseBone.poseMatrix (setter)
//Sets the pose_mat
-static int PoseBone_setPoseMatrix(BPy_PoseBone *self, PyObject *value, void *closure)
+static int PoseBone_setPoseMatrix(BPy_PoseBone *self, MatrixObject *value, void *closure)
{
- return EXPP_intError(PyExc_AttributeError, "%s%s%s",
- sPoseBoneError, ".poseMatrix: ", "not able to set this property");
+ float delta_mat[4][4], quat[4]; /* rotation */
+ float size[4]; /* size only */
+
+ if( !MatrixObject_Check( value ) )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected matrix object as argument" );
+
+ if( value->colSize != 4 || value->rowSize != 4 )
+ return EXPP_ReturnIntError( PyExc_AttributeError,
+ "matrix must be a 4x4 transformation matrix\n"
+ "for example as returned by object.matrixWorld" );
+
+ /* get bone-space cursor matrix and extract location */
+ armature_mat_pose_to_bone(self->posechannel, (float (*)[4]) *value->matrix, delta_mat);
+
+ /* Visual Location */
+ VECCOPY(self->posechannel->loc, delta_mat[3]);
+
+ /* Visual Size */
+ Mat4ToSize(delta_mat, size);
+ VECCOPY(self->posechannel->size, size);
+
+ /* Visual Rotation */
+ Mat4ToQuat(delta_mat, quat);
+ QUATCOPY(self->posechannel->quat, quat);
+
+ return 0;
}
//------------------------PoseBone.constraints (getter)
//Gets the constraints sequence
@@ -931,7 +971,12 @@ static PyObject *PoseBone_getSelect(BPy_PoseBone *self, void *closure)
//Sets the pose bones selection
static int PoseBone_setSelect(BPy_PoseBone *self, PyObject *value, void *closure)
{
- if (PyObject_IsTrue( value ))
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if ( param )
self->posechannel->bone->flag |= BONE_SELECTED;
else
self->posechannel->bone->flag &= ~(BONE_SELECTED | BONE_ACTIVE);
@@ -1071,13 +1116,46 @@ static PyObject *PoseBone_getIKFlag(BPy_PoseBone *self, void *flag)
//Sets the pose bones ikflag
static int PoseBone_setIKFlag(BPy_PoseBone *self, PyObject *value, void *flag)
{
- if ( PyObject_IsTrue(value) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if ( param )
self->posechannel->ikflag |= (int)flag;
else
self->posechannel->ikflag &= ~(int)flag;
return 0;
}
+//------------------------Bone.layerMask (get)
+static PyObject *PoseBone_getLayerMask(BPy_PoseBone *self)
+{
+ /* do this extra stuff because the short's bits can be negative values */
+ unsigned short laymask = 0;
+ laymask |= self->posechannel->bone->layer;
+ return PyInt_FromLong((int)laymask);
+}
+//------------------------Bone.layerMask (set)
+static int PoseBone_setLayerMask(BPy_PoseBone *self, PyObject *value)
+{
+ int laymask;
+ if (!PyInt_Check(value)) {
+ return EXPP_ReturnIntError( PyExc_AttributeError,
+ "expected an integer (bitmask) as argument" );
+ }
+
+ laymask = PyInt_AsLong(value);
+
+ if (laymask <= 0 || laymask > (1<<16) - 1)
+ return EXPP_ReturnIntError( PyExc_AttributeError,
+ "bitmask must have from 1 up to 16 bits set");
+
+ self->posechannel->bone->layer = 0;
+ self->posechannel->bone->layer |= laymask;
+
+ return 0;
+}
//------------------TYPE_OBECT IMPLEMENTATION---------------------------
//------------------------tp_getset
@@ -1138,7 +1216,8 @@ static PyGetSetDef BPy_PoseBone_getset[] = {
"disable Y DoF when part of an IK", (void *)BONE_IK_NO_YDOF },
{"lockZRot", (getter)PoseBone_getIKFlag, (setter)PoseBone_setIKFlag,
"disable Z DoF when part of an IK", (void *)BONE_IK_NO_ZDOF },
-
+ {"layerMask", (getter)PoseBone_getLayerMask, (setter)PoseBone_setLayerMask,
+ "Layer bitmask", NULL },
{NULL, NULL, NULL, NULL, NULL}
};
//------------------------tp_dealloc
diff --git a/source/blender/python/api2_2x/Scene.c b/source/blender/python/api2_2x/Scene.c
index 3bb509eb070..05768a1daf3 100644
--- a/source/blender/python/api2_2x/Scene.c
+++ b/source/blender/python/api2_2x/Scene.c
@@ -249,7 +249,7 @@ static int Scene_setLayerMask( BPy_Scene * self, PyObject * value )
SCENE_DEL_CHECK_INT(self);
- if (!PyInt_CheckExact(value)) {
+ if (!PyInt_Check(value)) {
return EXPP_ReturnIntError( PyExc_AttributeError,
"expected an integer (bitmask) as argument" );
}
@@ -805,10 +805,18 @@ static PyObject *Scene_update( BPy_Scene * self, PyObject * args )
if( !full )
DAG_scene_sort( scene );
- else if( full == 1 )
+ else if( full == 1 ) {
+ int enablescripts = G.f & G_DOSCRIPTLINKS;
+
+ /*Disable scriptlinks to prevent firing off newframe scriptlink
+ events.*/
+ G.f &= ~G_DOSCRIPTLINKS;
set_scene_bg( scene );
-
- else
+ scene_update_for_newframe( scene, scene->lay );
+
+ /*re-enabled scriptlinks if necassary.*/
+ if (enablescripts) G.f |= G_DOSCRIPTLINKS;
+ } else
return EXPP_ReturnPyObjError( PyExc_ValueError,
"in method scene.update(full), full should be:\n"
"0: to only sort scene elements (old behavior); or\n"
@@ -999,9 +1007,6 @@ static PyObject *Scene_getActiveObject(BPy_Scene *self)
/*-----------------------Scene.getCurrentCamera()------------------------*/
static PyObject *Scene_getCurrentCamera( BPy_Scene * self )
{
- Object *cam_obj;
- PyObject *pyob;
- Scene *scene = self->scene;
static char warning = 1;
if( warning ) {
@@ -1010,18 +1015,8 @@ static PyObject *Scene_getCurrentCamera( BPy_Scene * self )
}
SCENE_DEL_CHECK_PY(self);
-
- cam_obj = scene->camera;
-
- if( cam_obj ) { /* if found, return a wrapper for it */
- pyob = Object_CreatePyObject( cam_obj );
- if (!pyob)
- return EXPP_ReturnPyObjError(PyExc_MemoryError,
- "couldn't create new object wrapper!");
- return pyob;
- }
-
- Py_RETURN_NONE; /* none found */
+ /* None is ok */
+ return Object_CreatePyObject( self->scene->camera );
}
/*-----------------------Scene.setCurrentCamera()------------------------*/
@@ -1333,7 +1328,6 @@ static int SceneObSeq_len( BPy_SceneObSeq * self )
static PyObject *SceneObSeq_item( BPy_SceneObSeq * self, int i )
{
int index=0;
- PyObject *bpy_obj;
Base *base= NULL;
Scene *scene= self->bpyscene->scene;
@@ -1360,13 +1354,7 @@ static PyObject *SceneObSeq_item( BPy_SceneObSeq * self, int i )
return EXPP_ReturnPyObjError( PyExc_IndexError,
"array index out of range" );
- bpy_obj = Object_CreatePyObject( base->object );
-
- if( !bpy_obj )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "PyObject_New() failed" );
-
- return (PyObject *)bpy_obj;
+ return Object_CreatePyObject( base->object );
}
static PySequenceMethods SceneObSeq_as_sequence = {
@@ -1630,9 +1618,7 @@ static PyObject *SceneObSeq_unlink( BPy_SceneObSeq * self, PyObject *args )
PyObject *SceneObSeq_getActive(BPy_SceneObSeq *self)
{
- PyObject *pyob;
Base *base;
-
SCENE_DEL_CHECK_PY(self->bpyscene);
if (self->mode!=EXPP_OBSEQ_NORMAL)
@@ -1643,13 +1629,7 @@ PyObject *SceneObSeq_getActive(BPy_SceneObSeq *self)
if (!base)
Py_RETURN_NONE;
- pyob = Object_CreatePyObject( base->object );
-
- if (!pyob)
- return EXPP_ReturnPyObjError(PyExc_MemoryError,
- "couldn't create new object wrapper!");
-
- return pyob;
+ return Object_CreatePyObject( base->object );
}
static int SceneObSeq_setActive(BPy_SceneObSeq *self, PyObject *value)
@@ -1683,26 +1663,13 @@ static int SceneObSeq_setActive(BPy_SceneObSeq *self, PyObject *value)
PyObject *SceneObSeq_getCamera(BPy_SceneObSeq *self)
{
- PyObject *pyob;
- Object *ob;
-
SCENE_DEL_CHECK_PY(self->bpyscene);
if (self->mode!=EXPP_OBSEQ_NORMAL)
return (EXPP_ReturnPyObjError( PyExc_TypeError,
"cannot get camera from objects.selected or objects.context" ));
- ob= self->bpyscene->scene->camera;
- if (!ob)
- Py_RETURN_NONE;
-
- pyob = Object_CreatePyObject( ob );
-
- if (!pyob)
- return EXPP_ReturnPyObjError(PyExc_MemoryError,
- "couldn't create new object wrapper!");
-
- return pyob;
+ return Object_CreatePyObject( self->bpyscene->scene->camera );
}
static int SceneObSeq_setCamera(BPy_SceneObSeq *self, PyObject *value)
diff --git a/source/blender/python/api2_2x/Sound.c b/source/blender/python/api2_2x/Sound.c
index 66da43e6fad..6e20e4c3ee5 100644
--- a/source/blender/python/api2_2x/Sound.c
+++ b/source/blender/python/api2_2x/Sound.c
@@ -92,29 +92,24 @@ struct PyMethodDef M_Sound_methods[] = {
static int Sound_compare( BPy_Sound * a, BPy_Sound * b );
static PyObject *Sound_repr( BPy_Sound * self );
-#define SOUND_FLOAT_METHODS(funcname, varname) \
-static PyObject *Sound_get ## funcname(BPy_Sound *self) { \
- char e[256]; \
- PyObject *attr = PyFloat_FromDouble(self->sound->varname); \
- if (attr) return attr; \
- sprintf(e, "couldn't get Sound.%s attribute", #varname); \
- return EXPP_ReturnPyObjError (PyExc_RuntimeError, e); \
-} \
+#define SOUND_FLOAT_METHODS(funcname, varname) \
+static PyObject *Sound_get ## funcname(BPy_Sound *self) { \
+ return PyFloat_FromDouble(self->sound->varname); \
+} \
static PyObject *Sound_set ## funcname(BPy_Sound *self, PyObject *args) { \
- float f = 0; \
- if (!PyArg_ParseTuple(args, "f", &f)) \
- return (EXPP_ReturnPyObjError (PyExc_TypeError, \
- "expected float argument")); \
- self->sound->varname = EXPP_ClampFloat(f,\
- EXPP_SND_##varname##_MIN, EXPP_SND_##varname##_MAX);\
- Py_INCREF(Py_None); \
- return Py_None; \
+ float f = 0; \
+ if (!PyArg_ParseTuple(args, "f", &f)) \
+ return (EXPP_ReturnPyObjError (PyExc_TypeError, \
+ "expected float argument")); \
+ self->sound->varname = EXPP_ClampFloat(f, \
+ EXPP_SND_##varname##_MIN, EXPP_SND_##varname##_MAX); \
+ Py_RETURN_NONE; \
}
-#define SOUND_FLOAT_METHOD_FUNCS(varname) \
-{"get"#varname, (PyCFunction)Sound_get ## varname, METH_NOARGS, \
-"() - Return Sound object "#varname}, \
-{"set"#varname, (PyCFunction)Sound_set ## varname, METH_VARARGS, \
+#define SOUND_FLOAT_METHOD_FUNCS(varname) \
+{"get"#varname, (PyCFunction)Sound_get ## varname, METH_NOARGS, \
+"() - Return Sound object "#varname}, \
+{"set"#varname, (PyCFunction)Sound_set ## varname, METH_VARARGS, \
"(float) - Change Sound object "#varname},
@@ -354,24 +349,12 @@ bSound *Sound_FromPyObject( PyObject * pyobj )
/*****************************************************************************/
static PyObject *Sound_getName( BPy_Sound * self )
{
- PyObject *attr = PyString_FromString( self->sound->id.name + 2 );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Sound.name attribute" ) );
+ return PyString_FromString( self->sound->id.name + 2 );
}
static PyObject *Sound_getFilename( BPy_Sound * self )
{
- PyObject *attr = PyString_FromString( self->sound->name );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Sound.filename attribute" ) );
+ return PyString_FromString( self->sound->name );
}
static PyObject *Sound_getPacked( BPy_Sound * self )
diff --git a/source/blender/python/api2_2x/SurfNurb.c b/source/blender/python/api2_2x/SurfNurb.c
index 0cac359dcf9..3499ec09936 100644
--- a/source/blender/python/api2_2x/SurfNurb.c
+++ b/source/blender/python/api2_2x/SurfNurb.c
@@ -457,9 +457,14 @@ static PyObject *SurfNurb_getCyclicV( BPy_SurfNurb * self )
Py_RETURN_FALSE;
}
-static int SurfNurb_setCyclicU( BPy_SurfNurb * self, PyObject * args )
+static int SurfNurb_setCyclicU( BPy_SurfNurb * self, PyObject * value )
{
- if( PyObject_IsTrue( args ) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if( param )
self->nurb->flagu |= CU_CYCLIC;
else
self->nurb->flagu &= ~CU_CYCLIC;
@@ -467,9 +472,14 @@ static int SurfNurb_setCyclicU( BPy_SurfNurb * self, PyObject * args )
return 0;
}
-static int SurfNurb_setCyclicV( BPy_SurfNurb * self, PyObject * args )
+static int SurfNurb_setCyclicV( BPy_SurfNurb * self, PyObject * value )
{
- if( PyObject_IsTrue( args ) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if( param )
self->nurb->flagv |= CU_CYCLIC;
else
self->nurb->flagv &= ~CU_CYCLIC;
@@ -762,7 +772,7 @@ PyTypeObject SurfNurb_Type = {
/* More standard operations (here for binary compatibility) */
- ( hashfunc ) GenericLib_hash, /* hashfunc tp_hash; */
+ NULL, /* hashfunc tp_hash; */
NULL, /* ternaryfunc tp_call; */
NULL, /* reprfunc tp_str; */
NULL, /* getattrofunc tp_getattro; */
diff --git a/source/blender/python/api2_2x/Text.c b/source/blender/python/api2_2x/Text.c
index c98c542962a..d507d623c99 100644
--- a/source/blender/python/api2_2x/Text.c
+++ b/source/blender/python/api2_2x/Text.c
@@ -338,26 +338,16 @@ PyObject *Text_CreatePyObject( Text * txt )
/*****************************************************************************/
static PyObject *Text_getFilename( BPy_Text * self )
{
- PyObject *attr;
- char *name = self->text->name;
-
- if( name )
- attr = PyString_FromString( self->text->name );
- else
- attr = Py_None;
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Text.filename attribute" );
+ if( self->text->name )
+ return PyString_FromString( self->text->name );
+
+ Py_RETURN_NONE;
}
static PyObject *Text_getNLines( BPy_Text * self )
{ /* text->nlines isn't updated in Blender (?) */
int nlines = 0;
TextLine *line;
- PyObject *attr;
line = self->text->lines.first;
@@ -368,13 +358,7 @@ static PyObject *Text_getNLines( BPy_Text * self )
self->text->nlines = nlines; /* and update Blender, too (should we?) */
- attr = PyInt_FromLong( nlines );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Text.nlines attribute" );
+ return PyInt_FromLong( nlines );
}
static PyObject *Text_clear( BPy_Text * self)
diff --git a/source/blender/python/api2_2x/Text3d.c b/source/blender/python/api2_2x/Text3d.c
index 6ac6f61cbd5..57a9c74b71d 100644
--- a/source/blender/python/api2_2x/Text3d.c
+++ b/source/blender/python/api2_2x/Text3d.c
@@ -149,7 +149,7 @@ static PyMethodDef BPy_Text3d_methods[] = {
{"setName", ( PyCFunction ) Text3d_setName,
METH_VARARGS, "() - Sets Text3d Data name"},
{"setText", ( PyCFunction ) Text3d_setText,
- METH_VARARGS, "() - Sets Text3d Data"},
+ METH_O, "() - Sets Text3d Data"},
{"getText", ( PyCFunction ) Text3d_getText,
METH_NOARGS, "() - Gets Text3d Data"},
{"getDrawMode", ( PyCFunction ) Text3d_getDrawMode,
diff --git a/source/blender/python/api2_2x/Texture.c b/source/blender/python/api2_2x/Texture.c
index 82fbb262a1b..e21d486a2ab 100644
--- a/source/blender/python/api2_2x/Texture.c
+++ b/source/blender/python/api2_2x/Texture.c
@@ -203,11 +203,14 @@ static const EXPP_map_pair tex_type_map[] = {
static const EXPP_map_pair tex_flag_map[] = {
/* NOTE "CheckerOdd" and "CheckerEven" are new */
- {"ColorBand", TEX_COLORBAND },
+ {"ColorBand", TEX_COLORBAND },
{"FlipBlend", TEX_FLIPBLEND},
{"NegAlpha", TEX_NEGALPHA},
{"CheckerOdd",TEX_CHECKER_ODD},
{"CheckerEven",TEX_CHECKER_EVEN},
+ {"PreviewAlpha",TEX_PRV_ALPHA},
+ {"RepeatXMirror",TEX_REPEAT_XMIR},
+ {"RepeatYMirror",TEX_REPEAT_YMIR},
{NULL, 0}
};
@@ -438,7 +441,10 @@ GETFUNC( getWeight1 );
GETFUNC( getWeight2 );
GETFUNC( getWeight3 );
GETFUNC( getWeight4 );
+#if 0
+/* not defined */
GETFUNC( getUsers );
+#endif
OLDSETFUNC( setDistMetric );
OLDSETFUNC( setDistNoise ); /* special case used for ".noisebasis = ... */
@@ -498,7 +504,7 @@ static int Texture_setNoiseBasis2( BPy_Texture *self, PyObject *args,
static PyObject *Texture_getColorband( BPy_Texture * self);
int Texture_setColorband( BPy_Texture * self, PyObject * value);
-static PyObject *Texture_evaluate( BPy_Texture *self, VectorObject *vec_in );
+static PyObject *Texture_evaluate( BPy_Texture *self, PyObject *value );
static PyObject *Texture_copy( BPy_Texture *self );
/*****************************************************************************/
@@ -687,10 +693,6 @@ static PyGetSetDef BPy_Texture_getseters[] = {
(getter)Texture_getType, (setter)Texture_setType,
"Texture's 'Type' mode",
NULL},
- {"users",
- (getter)Texture_getUsers, (setter)NULL,
- "Number of texture users",
- NULL},
{"weight1",
(getter)Texture_getWeight1, (setter)Texture_setWeight1,
"Weight 1 (for Voronoi textures)",
@@ -772,8 +774,8 @@ static PyGetSetDef BPy_Texture_getseters[] = {
(void *)TEX_NORMALMAP},
{"colorband",
(getter)Texture_getColorband, (setter)Texture_setColorband,
- "Use of image RGB values for normal mapping enabled ('ImageFlags')",
- (void *)TEX_NORMALMAP},
+ "The colorband for this texture",
+ NULL},
{NULL,NULL,NULL,NULL,NULL} /* Sentinel */
};
@@ -1163,6 +1165,9 @@ static PyObject *M_Texture_FlagsDict( void )
PyConstant_Insert(d, "NEGALPHA", PyInt_FromLong(TEX_NEGALPHA));
PyConstant_Insert(d, "CHECKER_ODD", PyInt_FromLong(TEX_CHECKER_ODD));
PyConstant_Insert(d, "CHECKER_EVEN", PyInt_FromLong(TEX_CHECKER_EVEN));
+ PyConstant_Insert(d, "PREVIEW_ALPHA", PyInt_FromLong(TEX_PRV_ALPHA));
+ PyConstant_Insert(d, "REPEAT_XMIR", PyInt_FromLong(TEX_REPEAT_XMIR));
+ PyConstant_Insert(d, "REPEAT_YMIR", PyInt_FromLong(TEX_REPEAT_YMIR));
}
return Flags;
}
@@ -1340,18 +1345,14 @@ Tex *Texture_FromPyObject( PyObject * pyobj )
static PyObject *Texture_getExtend( BPy_Texture * self )
{
- PyObject *attr = NULL;
const char *extend = NULL;
if( EXPP_map_getStrVal
( tex_extend_map, self->texture->extend, &extend ) )
- attr = PyString_FromString( extend );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "invalid internal extend mode" );
+ return PyString_FromString( extend );
- return attr;
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ "invalid internal extend mode" );
}
static PyObject *Texture_getImage( BPy_Texture * self )
@@ -1367,7 +1368,6 @@ static PyObject *Texture_getImage( BPy_Texture * self )
static PyObject *Texture_oldgetSType( BPy_Texture * self )
{
- PyObject *attr = NULL;
const char *stype = NULL;
int n_stype;
@@ -1384,28 +1384,22 @@ static PyObject *Texture_oldgetSType( BPy_Texture * self )
if( EXPP_map_getStrVal( tex_stype_map[self->texture->type],
n_stype, &stype ) )
- attr = PyString_FromString( stype );
+ return PyString_FromString( stype );
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"invalid texture stype internally" );
-
- return attr;
}
static PyObject *Texture_oldgetType( BPy_Texture * self )
{
- PyObject *attr = NULL;
const char *type = NULL;
if( EXPP_map_getStrVal( tex_type_map, self->texture->type, &type ) )
- attr = PyString_FromString( type );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+ return PyString_FromString( type );
+
+ return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"invalid texture type internally" );
-
- return attr;
}
static int Texture_setAnimFrames( BPy_Texture * self, PyObject * value )
@@ -1417,7 +1411,12 @@ static int Texture_setAnimFrames( BPy_Texture * self, PyObject * value )
static int Texture_setIUserCyclic( BPy_Texture * self, PyObject * value )
{
- if( PyObject_IsTrue( value ) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if( param )
self->texture->iuser.cycl = 1;
else
self->texture->iuser.cycl = 0;
@@ -1535,20 +1534,15 @@ static int Texture_setFilterSize( BPy_Texture * self, PyObject * value )
static int Texture_setFlags( BPy_Texture * self, PyObject * value )
{
int param;
- int bitmask = TEX_FLIPBLEND
- | TEX_COLORBAND
- | TEX_NEGALPHA
- | TEX_CHECKER_ODD
- | TEX_CHECKER_EVEN;
- if( !PyInt_CheckExact ( value ) ) {
+ if( !PyInt_Check( value ) ) {
char errstr[128];
- sprintf ( errstr , "expected int bitmask of 0x%08x", bitmask );
+ sprintf ( errstr , "expected int bitmask of 0x%08x", TEX_FLAG_MASK );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
}
param = PyInt_AS_LONG ( value );
- if ( ( param & bitmask ) != param )
+ if ( ( param & TEX_FLAG_MASK ) != param )
return EXPP_ReturnIntError( PyExc_ValueError,
"invalid bit(s) set in mask" );
@@ -1613,7 +1607,7 @@ static int Texture_setImageFlags( BPy_Texture * self, PyObject * value,
| TEX_CALCALPHA
| TEX_NORMALMAP;
- if( !PyInt_CheckExact ( value ) ) {
+ if( !PyInt_Check( value ) ) {
char errstr[128];
sprintf ( errstr , "expected int bitmask of 0x%08x", bitmask );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
@@ -1634,7 +1628,12 @@ static int Texture_setImageFlags( BPy_Texture * self, PyObject * value,
static int Texture_setIUserFlags( BPy_Texture * self, PyObject * value,
void *flag )
{
- if( PyObject_IsTrue(value) )
+ int param = PyObject_IsTrue( value );
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
+ if( param )
self->texture->iuser.flag |= (int)flag;
else
self->texture->iuser.flag &= ~(int)flag;
@@ -1685,7 +1684,7 @@ static int Texture_setNoiseBasis( BPy_Texture * self, PyObject * value )
{
int param;
- if( !PyInt_CheckExact ( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int (see 'Noise' constant dictionary)" );
@@ -1711,7 +1710,7 @@ static int Texture_setNoiseBasis2( BPy_Texture * self, PyObject * value,
if( (int)type == EXPP_TEX_NOISEBASIS2 ) {
int param;
- if( !PyInt_CheckExact ( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int (see 'Noise' constant dictionary)" );
@@ -1731,7 +1730,7 @@ static int Texture_setNoiseBasis2( BPy_Texture * self, PyObject * value,
*/
} else {
- if( !PyInt_CheckExact ( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int value of 1" );
@@ -1783,7 +1782,7 @@ static int Texture_setSType( BPy_Texture * self, PyObject * value )
short param;
const char *dummy = NULL;
- if( !PyInt_CheckExact ( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument" );
@@ -1992,13 +1991,7 @@ static int Texture_setIpo( BPy_Texture * self, PyObject * value )
static PyObject *Texture_getAnimFrames( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->iuser.frames );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->iuser.frames );
}
static PyObject *Texture_getIUserCyclic( BPy_Texture *self )
@@ -2013,20 +2006,12 @@ static PyObject *Texture_getIUserCyclic( BPy_Texture *self )
/* disabled. this option was too stupid! (ton) */
static PyObject *Texture_getAnimLength( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->len );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->len );
}
static PyObject *Texture_getAnimMontage( BPy_Texture *self )
-{
- PyObject *attr;
-
- attr = Py_BuildValue( "((i,i),(i,i),(i,i),(i,i))",
+{
+ return Py_BuildValue( "((i,i),(i,i),(i,i),(i,i))",
self->texture->fradur[0][0],
self->texture->fradur[0][1],
self->texture->fradur[1][0],
@@ -2035,182 +2020,88 @@ static PyObject *Texture_getAnimMontage( BPy_Texture *self )
self->texture->fradur[2][1],
self->texture->fradur[3][0],
self->texture->fradur[3][1] );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
}
#endif
static PyObject *Texture_getAnimOffset( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->iuser.offset );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->iuser.offset );
}
static PyObject *Texture_getAnimStart( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->iuser.sfra );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->iuser.sfra );
}
static PyObject *Texture_getBrightness( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble ( self->texture->bright );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble ( self->texture->bright );
}
static PyObject *Texture_getContrast( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->contrast );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->contrast );
}
static PyObject *Texture_getCrop( BPy_Texture *self )
{
- PyObject *attr;
-
- attr = Py_BuildValue( "(f,f,f,f)",
+ return Py_BuildValue( "(f,f,f,f)",
self->texture->cropxmin,
self->texture->cropymin,
self->texture->cropxmax,
self->texture->cropymax );
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
}
static PyObject *Texture_getDistAmnt( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->dist_amount );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->dist_amount );
}
static PyObject *Texture_getDistMetric( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->vn_distm );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->vn_distm );
}
static PyObject *Texture_getExp( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->vn_mexp );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->vn_mexp );
}
static PyObject *Texture_getIntExtend( BPy_Texture * self )
{
- PyObject *attr = PyInt_FromLong( self->texture->extend );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->extend );
}
static PyObject *Texture_getFieldsPerImage( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->iuser.fie_ima );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->iuser.fie_ima );
}
static PyObject *Texture_getFilterSize( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->filtersize );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->filtersize );
}
static PyObject *Texture_getFlags( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->flag );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->flag );
}
static PyObject *Texture_getHFracDim( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( (long)self->texture->mg_H );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( (long)self->texture->mg_H );
}
static PyObject *Texture_getImageFlags( BPy_Texture *self, void *type )
{
- PyObject *attr;
-
- /*
- * type == 0 means attribute "imageFlags"
+ /* type == 0 means attribute "imageFlags"
* other types means attribute "mipmap", "calcAlpha", etc
*/
if( (int)type )
- attr = EXPP_getBitfield( &self->texture->imaflag, (int)type, 'h' );
+ return EXPP_getBitfield( &self->texture->imaflag, (int)type, 'h' );
else
- attr = PyInt_FromLong( self->texture->imaflag );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->imaflag );
}
static PyObject *Texture_getIUserFlags( BPy_Texture *self, void *flag )
@@ -2223,231 +2114,108 @@ static PyObject *Texture_getIUserFlags( BPy_Texture *self, void *flag )
static PyObject *Texture_getIScale( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->ns_outscale );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->ns_outscale );
}
static PyObject *Texture_getLacunarity( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->mg_lacunarity );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->mg_lacunarity );
}
static PyObject *Texture_getNoiseBasis( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->noisebasis );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->noisebasis );
}
static PyObject *Texture_getNoiseBasis2( BPy_Texture *self, void *type )
{
- PyObject *attr;
-
- /*
- * type == EXPP_TEX_NOISEBASIS2 means attribute "noiseBasis2"
+ /* type == EXPP_TEX_NOISEBASIS2 means attribute "noiseBasis2"
* other types means attribute "sine", "saw", or "tri" attribute
*/
if( (int)type == EXPP_TEX_NOISEBASIS2 )
- attr = PyInt_FromLong( self->texture->noisebasis2 );
+ return PyInt_FromLong( self->texture->noisebasis2 );
else
- attr = PyInt_FromLong( ( self->texture->noisebasis2 == (int)type ) ? 1 : 0 );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( ( self->texture->noisebasis2 == (int)type ) ? 1 : 0 );
}
static PyObject *Texture_getNoiseDepth( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->noisedepth );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->noisedepth );
}
static PyObject *Texture_getNoiseSize( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->noisesize );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->noisesize );
}
static PyObject *Texture_getNoiseType( BPy_Texture *self )
{
- PyObject *attr;
-
if ( self->texture->noisetype == TEX_NOISESOFT )
- attr = PyString_FromString( "soft" );
+ return PyString_FromString( "soft" );
else
- attr = PyString_FromString( "hard" );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyString_FromString( "hard" );
}
static PyObject *Texture_getOcts( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->mg_octaves );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->mg_octaves );
}
static PyObject *Texture_getRepeat( BPy_Texture *self )
{
- PyObject *attr;
-
- attr = Py_BuildValue( "(i,i)", self->texture->xrepeat,
+ return Py_BuildValue( "(i,i)", self->texture->xrepeat,
self->texture->yrepeat );
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
}
static PyObject *Texture_getRGBCol( BPy_Texture *self )
{
- PyObject *attr;
-
- attr = Py_BuildValue( "(f,f,f)", self->texture->rfac,
+ return Py_BuildValue( "(f,f,f)", self->texture->rfac,
self->texture->gfac, self->texture->bfac );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
}
static PyObject *Texture_getSType( BPy_Texture *self )
{
- PyObject *attr;
-
if( self->texture->type == TEX_VORONOI )
- attr = PyInt_FromLong( self->texture->vn_coltype );
+ return PyInt_FromLong( self->texture->vn_coltype );
#if 0
- else if( self->texture->type == TEX_MUSGRAVE )
- attr = PyInt_FromLong( self->texture->noisebasis );
+ if( self->texture->type == TEX_MUSGRAVE )
+ return PyInt_FromLong( self->texture->noisebasis );
#endif
- else if( self->texture->type == TEX_ENVMAP )
- attr = PyInt_FromLong( self->texture->env->stype );
- else
- attr = PyInt_FromLong( self->texture->stype );
+ if( self->texture->type == TEX_ENVMAP )
+ return PyInt_FromLong( self->texture->env->stype );
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->stype );
}
static PyObject *Texture_getTurbulence( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->turbul );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->turbul );
}
static PyObject *Texture_getType( BPy_Texture *self )
{
- PyObject *attr = PyInt_FromLong( self->texture->type );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
-}
-
-static PyObject *Texture_getUsers( BPy_Texture *self )
-{
- PyObject *attr = PyInt_FromLong( self->texture->id.us );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyInt_FromLong( self->texture->type );
}
static PyObject *Texture_getWeight1( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->vn_w1 );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->vn_w1 );
}
static PyObject *Texture_getWeight2( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->vn_w2 );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->vn_w2 );
}
static PyObject *Texture_getWeight3( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->vn_w3 );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->vn_w3 );
}
static PyObject *Texture_getWeight4( BPy_Texture *self )
{
- PyObject *attr = PyFloat_FromDouble( self->texture->vn_w4 );
-
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get attribute" );
-
- return attr;
+ return PyFloat_FromDouble( self->texture->vn_w4 );
}
/* #####DEPRECATED###### */
@@ -2704,19 +2472,34 @@ int Texture_setColorband( BPy_Texture * self, PyObject * value)
return EXPP_Colorband_fromPyList( &self->texture->coba, value );
}
-static PyObject *Texture_evaluate( BPy_Texture * self, VectorObject * vec_in )
+static PyObject *Texture_evaluate( BPy_Texture * self, PyObject * value )
{
TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
float vec[4];
/* int rgbnor; dont use now */
- if(!VectorObject_Check(vec_in) || vec_in->size < 3)
- return EXPP_ReturnPyObjError(PyExc_TypeError,
- "expects a 3D vector object");
-
- /* rgbnor = .. we don't need this now */
- multitex_ext(self->texture, vec_in->vec, NULL, NULL, 1, &texres);
-
+ if (VectorObject_Check(value)) {
+ if(((VectorObject *)value)->size < 3)
+ return EXPP_ReturnPyObjError(PyExc_TypeError,
+ "expects a 3D vector object or a tuple of 3 numbers");
+
+ /* rgbnor = .. we don't need this now */
+ multitex_ext(self->texture, ((VectorObject *)value)->vec, NULL, NULL, 1, &texres);
+ } else {
+ float vec_in[3];
+ if (!PyTuple_Check(value) || PyTuple_Size(value) < 3)
+ return EXPP_ReturnPyObjError(PyExc_TypeError,
+ "expects a 3D vector object or a tuple of 3 numbers");
+
+ vec_in[0] = PyFloat_AsDouble(PyTuple_GET_ITEM(value, 0));
+ vec_in[1] = PyFloat_AsDouble(PyTuple_GET_ITEM(value, 1));
+ vec_in[2] = PyFloat_AsDouble(PyTuple_GET_ITEM(value, 2));
+ if (PyErr_Occurred())
+ return EXPP_ReturnPyObjError(PyExc_TypeError,
+ "expects a 3D vector object or a tuple of 3 numbers");
+
+ multitex_ext(self->texture, vec_in, NULL, NULL, 1, &texres);
+ }
vec[0] = texres.tr;
vec[1] = texres.tg;
vec[2] = texres.tb;
diff --git a/source/blender/python/api2_2x/Types.c b/source/blender/python/api2_2x/Types.c
index bff227e440a..8b51c590a5b 100644
--- a/source/blender/python/api2_2x/Types.c
+++ b/source/blender/python/api2_2x/Types.c
@@ -128,7 +128,7 @@ void types_InitAll( void )
euler_Type.ob_type = &PyType_Type;
matrix_Type.ob_type = &PyType_Type;
quaternion_Type.ob_type = &PyType_Type;
- rgbTuple_Type.ob_type = &PyType_Type;
+ PyType_Ready( &rgbTuple_Type );
vector_Type.ob_type = &PyType_Type;
property_Type.ob_type = &PyType_Type;
point_Type.ob_type = &PyType_Type;
diff --git a/source/blender/python/api2_2x/Window.c b/source/blender/python/api2_2x/Window.c
index 5538d9d3d88..c5c0860a921 100644
--- a/source/blender/python/api2_2x/Window.c
+++ b/source/blender/python/api2_2x/Window.c
@@ -40,12 +40,14 @@
#include "BKE_scene.h" /* scene_find_camera() */
#include "BPI_script.h"
#include "BIF_mywindow.h"
+#include "BIF_imasel.h"
#include "BSE_headerbuttons.h"
#include "BSE_filesel.h"
#include "BIF_editmesh.h" /* for undo_push_mesh() */
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_drawtext.h"
+#include "BIF_poseobject.h"
#include "DNA_view3d_types.h"
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
@@ -59,6 +61,19 @@
#include "gen_utils.h"
#include "Armature.h"
+/* Pivot Types
+-0 for Bounding Box Center; \n\
+-1 for 3D Cursor\n\
+-2 for Individual Centers\n\
+-3 for Median Point\n\
+-4 for Active Object"; */
+
+#define PIVOT_BOUNDBOX 0
+#define PIVOT_CURSOR 1
+#define PIVOT_INDIVIDUAL 2
+#define PIVOT_MEDIAN 3
+#define PIVOT_ACTIVE 4
+
/* See Draw.c */
extern int EXPP_disable_force_draw;
extern void setcameratoview3d(void);
@@ -85,6 +100,7 @@ static PyObject *M_Window_GetPerspMatrix( PyObject * self );
static PyObject *M_Window_FileSelector( PyObject * self, PyObject * args );
static PyObject *M_Window_ImageSelector( PyObject * self, PyObject * args );
static PyObject *M_Window_EditMode( PyObject * self, PyObject * args );
+static PyObject *M_Window_PoseMode( PyObject * self, PyObject * args );
static PyObject *M_Window_ViewLayers( PyObject * self, PyObject * args );
static PyObject *M_Window_CameraView( PyObject * self, PyObject * args );
static PyObject *M_Window_QTest( PyObject * self );
@@ -103,6 +119,9 @@ static PyObject *M_Window_GetScreens( PyObject * self );
static PyObject *M_Window_SetScreen( PyObject * self, PyObject * value );
static PyObject *M_Window_GetScreenInfo( PyObject * self, PyObject * args,
PyObject * kwords );
+static PyObject *M_Window_GetPivot( PyObject * self );
+static PyObject *M_Window_SetPivot( PyObject * self, PyObject * value );
+
PyObject *Window_Init( void );
@@ -179,6 +198,9 @@ Returns the current status. This function is mostly useful to leave\n\
edit mode before applying changes to a mesh (otherwise the changes will\n\
be lost) and then returning to it upon leaving.";
+static char M_Window_PoseMode_doc[] =
+ "() - Get the current status -- 0: not in pose mode; 1: in edit mode";
+
static char M_Window_ViewLayers_doc[] =
"(layers = [], winid = None) - Get/set active layers in all 3d View windows.\n\
() - Make no changes, only return currently visible layers.\n\
@@ -281,6 +303,18 @@ Each dictionary has keys:\n\
'win': window type, see Blender.Window.Types dict;\n\
'id': area's id.";
+static char M_Window_SetPivot_doc[] =
+ "(Pivot) - Set Pivot Mode for 3D Viewport:\n\
+Options are: \n\
+-PivotTypes.BOUNDBOX for Bounding Box Center; \n\
+-PivotTypes.CURSOR for 3D Cursor\n\
+-PivotTypes.INDIVIDUAL for Individual Centers\n\
+-PivotTypes.MEDIAN for Median Point\n\
+-PivotTypes.ACTIVE for Active Object";
+
+static char M_Window_GetPivot_doc[] =
+ "Return the pivot for the active 3d window";
+
/*****************************************************************************/
/* Python method structure definition for Blender.Window module: */
/*****************************************************************************/
@@ -324,6 +358,8 @@ struct PyMethodDef M_Window_methods[] = {
M_Window_GetPerspMatrix_doc},
{"EditMode", ( PyCFunction ) M_Window_EditMode, METH_VARARGS,
M_Window_EditMode_doc},
+ {"PoseMode", ( PyCFunction ) M_Window_PoseMode, METH_VARARGS,
+ M_Window_PoseMode_doc},
{"ViewLayers", ( PyCFunction ) M_Window_ViewLayers, METH_VARARGS,
M_Window_ViewLayers_doc},
/* typo, deprecate someday: */
@@ -366,6 +402,10 @@ struct PyMethodDef M_Window_methods[] = {
M_Window_SetScreen_doc},
{"GetScreenInfo", ( PyCFunction ) M_Window_GetScreenInfo,
METH_VARARGS | METH_KEYWORDS, M_Window_GetScreenInfo_doc},
+ {"GetPivot", ( PyCFunction ) M_Window_GetPivot, METH_NOARGS,
+ M_Window_GetPivot_doc},
+ {"SetPivot", ( PyCFunction ) M_Window_SetPivot, METH_O,
+ M_Window_SetPivot_doc},
{NULL, NULL, 0, NULL}
};
@@ -722,20 +762,13 @@ static PyObject *M_Window_WaitCursor( PyObject * self, PyObject * args )
static PyObject *M_Window_GetViewVector( PyObject * self )
{
float *vec = NULL;
- PyObject *pylist;
if( !G.vd )
Py_RETURN_NONE;
vec = G.vd->viewinv[2];
- pylist = Py_BuildValue( "[fff]", vec[0], vec[1], vec[2] );
-
- if( !pylist )
- return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
- "GetViewVector: couldn't create pylist" ) );
-
- return pylist;
+ return Py_BuildValue( "[fff]", vec[0], vec[1], vec[2] );
}
/*****************************************************************************/
@@ -786,20 +819,13 @@ static PyObject *M_Window_SetActiveLayer( PyObject * self, PyObject * args )
static PyObject *M_Window_GetViewQuat( PyObject * self )
{
float *vec = NULL;
- PyObject *pylist;
if( !G.vd )
Py_RETURN_NONE;
vec = G.vd->viewquat;
- pylist = Py_BuildValue( "[ffff]", vec[0], vec[1], vec[2], vec[3] );
-
- if( !pylist )
- return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
- "GetViewQuat: couldn't create pylist" ) );
-
- return pylist;
+ return Py_BuildValue( "[ffff]", vec[0], vec[1], vec[2], vec[3] );
}
static PyObject *M_Window_SetViewQuat( PyObject * self, PyObject * args )
@@ -831,21 +857,9 @@ static PyObject *M_Window_SetViewQuat( PyObject * self, PyObject * args )
static PyObject *M_Window_GetViewOffset( PyObject * self )
{
- float *vec = NULL;
- PyObject *pylist;
-
if( !G.vd )
Py_RETURN_NONE;
-
- vec = G.vd->ofs;
-
- pylist = Py_BuildValue( "[fff]", vec[0], vec[1], vec[2] );
-
- if( !pylist )
- return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
- "GetViewQuat: couldn't create pylist" ) );
-
- return pylist;
+ return Py_BuildValue( "[fff]", G.vd->ofs[0], G.vd->ofs[1], G.vd->ofs[2] );
}
static PyObject *M_Window_SetViewOffset( PyObject * self, PyObject * args )
@@ -881,20 +895,10 @@ static PyObject *M_Window_SetViewOffset( PyObject * self, PyObject * args )
/*****************************************************************************/
static PyObject *M_Window_GetViewMatrix( PyObject * self )
{
- PyObject *viewmat;
-
if( !G.vd )
Py_RETURN_NONE;
- viewmat =
- ( PyObject * ) newMatrixObject( ( float * ) G.vd->viewmat, 4,
- 4, Py_WRAP );
-
- if( !viewmat )
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "GetViewMatrix: couldn't create matrix pyobject" );
-
- return viewmat;
+ return newMatrixObject( ( float * ) G.vd->viewmat, 4, 4, Py_WRAP );
}
/*****************************************************************************/
@@ -903,20 +907,10 @@ static PyObject *M_Window_GetViewMatrix( PyObject * self )
/*****************************************************************************/
static PyObject *M_Window_GetPerspMatrix( PyObject * self )
{
- PyObject *perspmat;
-
if( !G.vd )
Py_RETURN_NONE;
- perspmat =
- ( PyObject * ) newMatrixObject( ( float * ) G.vd->persmat, 4,
- 4, Py_WRAP );
-
- if( !perspmat )
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "GetPerspMatrix: couldn't create matrix pyobject" );
-
- return perspmat;
+ return newMatrixObject( ( float * ) G.vd->persmat, 4, 4, Py_WRAP );
}
@@ -994,6 +988,32 @@ static PyObject *M_Window_EditMode( PyObject * self, PyObject * args )
return Py_BuildValue( "h", G.obedit ? 1 : 0 );
}
+static PyObject *M_Window_PoseMode( PyObject * self, PyObject * args )
+{
+ short status = -1;
+ short is_posemode = 0;
+ Base *base;
+
+ if( !PyArg_ParseTuple( args, "|h", &status ) )
+ return EXPP_ReturnPyObjError( PyExc_TypeError,
+ "expected optional int (bool) as argument" );
+
+ if( status >= 0 ) {
+ if( status ) {
+ enter_posemode();
+ } else if( G.obedit ) {
+ exit_posemode();
+ }
+ }
+
+ base= BASACT;
+ if (base && base->object->flag & OB_POSEMODE) {
+ is_posemode = 1;
+ }
+
+ return Py_BuildValue( "h", is_posemode );
+}
+
static PyObject *M_Window_ViewLayers( PyObject * self, PyObject * args )
{
PyObject *item = NULL;
@@ -1038,7 +1058,6 @@ static PyObject *M_Window_ViewLayers( PyObject * self, PyObject * args )
}
if (winid==-1) {
- printf("Doing WINIID NOT!!!\n");
/* set scene and viewport */
G.scene->lay = layer;
if (G.vd) {
@@ -1467,12 +1486,38 @@ static PyObject *M_Window_GetScreenInfo( PyObject * self, PyObject * args,
return list;
}
+static PyObject *M_Window_GetPivot( PyObject * self )
+{
+ if (G.vd) {
+ return PyInt_FromLong( G.vd->around );
+ }
+ Py_RETURN_NONE;
+}
+
+static PyObject *M_Window_SetPivot( PyObject * self, PyObject * value)
+
+{
+ short pivot;
+ if (G.vd) {
+ pivot = (short)PyInt_AsLong( value );
+
+ if ( pivot > 4 || pivot < 0 )
+ return EXPP_ReturnPyObjError( PyExc_AttributeError,
+ "Expected a constant from Window.PivotTypes" );
+
+ G.vd->around = pivot;
+ }
+ Py_RETURN_NONE;
+}
+
+
+
/*****************************************************************************/
/* Function: Window_Init */
/*****************************************************************************/
PyObject *Window_Init( void )
{
- PyObject *submodule, *Types, *Qual, *MButs, *dict;
+ PyObject *submodule, *Types, *Qual, *MButs, *PivotTypes, *dict;
submodule =
Py_InitModule3( "Blender.Window", M_Window_methods,
@@ -1485,6 +1530,7 @@ PyObject *Window_Init( void )
Types = PyConstant_New( );
Qual = PyConstant_New( );
MButs = PyConstant_New( );
+ PivotTypes = PyConstant_New( );
if( Types ) {
BPy_constant *d = ( BPy_constant * ) Types;
@@ -1535,5 +1581,16 @@ PyObject *Window_Init( void )
PyModule_AddObject( submodule, "MButs", MButs );
}
+ if( PivotTypes ) {
+ BPy_constant *d = ( BPy_constant * ) PivotTypes;
+
+ PyConstant_Insert(d, "BOUNDBOX", PyInt_FromLong( PIVOT_BOUNDBOX ) );
+ PyConstant_Insert(d, "CURSOR", PyInt_FromLong( PIVOT_CURSOR ) );
+ PyConstant_Insert(d, "MEDIAN", PyInt_FromLong( PIVOT_MEDIAN ) );
+ PyConstant_Insert(d, "ACTIVE", PyInt_FromLong( PIVOT_ACTIVE ) );
+ PyConstant_Insert(d, "INDIVIDUAL", PyInt_FromLong( PIVOT_INDIVIDUAL ) );
+
+ PyModule_AddObject( submodule, "PivotTypes", PivotTypes );
+ }
return submodule;
}
diff --git a/source/blender/python/api2_2x/World.c b/source/blender/python/api2_2x/World.c
index aa956e15ebb..7804a443639 100644
--- a/source/blender/python/api2_2x/World.c
+++ b/source/blender/python/api2_2x/World.c
@@ -561,13 +561,7 @@ static PyObject *World_clearIpo( BPy_World * self )
static PyObject *World_getSkytype( BPy_World * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->world->skytype );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get World.skytype attribute" ) );
+ return PyInt_FromLong( ( long ) self->world->skytype );
}
@@ -579,7 +573,7 @@ static PyObject *World_getSkytype( BPy_World * self )
static int World_setSkytype( BPy_World * self, PyObject * value )
{
- if( !PyInt_CheckExact(value) )
+ if( !PyInt_Check(value) )
return ( EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument" ) );
self->world->skytype = (short)PyInt_AsLong(value);
@@ -600,13 +594,7 @@ static PyObject *World_oldsetSkytype( BPy_World * self, PyObject * args )
static PyObject *World_getMode( BPy_World * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->world->mode );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get World.mode attribute" ) );
+ return PyInt_FromLong( ( long ) self->world->mode );
}
@@ -618,7 +606,7 @@ static PyObject *World_getMode( BPy_World * self )
static int World_setMode( BPy_World * self, PyObject * value )
{
- if( !PyInt_CheckExact(value) )
+ if( !PyInt_Check(value) )
return ( EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument" ) );
self->world->mode = (short)PyInt_AsLong(value);
@@ -640,13 +628,7 @@ static PyObject *World_oldsetMode( BPy_World * self, PyObject * args )
static PyObject *World_getMistype( BPy_World * self )
{
- PyObject *attr = PyInt_FromLong( ( long ) self->world->mistype );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get World.mistype attribute" ) );
+ return PyInt_FromLong( ( long ) self->world->mistype );
}
@@ -658,7 +640,7 @@ static PyObject *World_getMistype( BPy_World * self )
static int World_setMistype( BPy_World * self, PyObject * value )
{
- if( !PyInt_CheckExact(value) )
+ if( !PyInt_Check(value) )
return ( EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument" ) );
self->world->mistype = (short)PyInt_AsLong(value);
@@ -1009,37 +991,37 @@ static PyObject *World_insertIpoKey( BPy_World * self, PyObject * args )
map = texchannel_to_adrcode(self->world->texact);
if(key == IPOKEY_ZENITH) {
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_R);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_G);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_B);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_R, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_G, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_ZEN_B, 0);
}
if(key == IPOKEY_HORIZON) {
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_R);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_G);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_B);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_R, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_G, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_HOR_B, 0);
}
if(key == IPOKEY_MIST) {
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISI);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTDI);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTSTA);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTHI);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISI, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTDI, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTSTA, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_MISTHI, 0);
}
if(key == IPOKEY_STARS) {
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_R);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_G);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_B);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STARDIST);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STARSIZE);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_R, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_G, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STAR_B, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STARDIST, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, WO_STARSIZE, 0);
}
if(key == IPOKEY_OFFSET) {
- insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_X);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_Y);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_Z);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_X, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_Y, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_OFS_Z, 0);
}
if(key == IPOKEY_SIZE) {
- insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_X);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_Y);
- insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_Z);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_X, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_Y, 0);
+ insertkey((ID *)self->world, ID_WO, NULL, NULL, map+MAP_SIZE_Z, 0);
}
allspace(REMAKEIPO, 0);
diff --git a/source/blender/python/api2_2x/bpy_config.c b/source/blender/python/api2_2x/bpy_config.c
index 5942ee56256..a061f31d8a0 100644
--- a/source/blender/python/api2_2x/bpy_config.c
+++ b/source/blender/python/api2_2x/bpy_config.c
@@ -89,10 +89,8 @@ static struct PyMethodDef BPy_Config_methods[] = {
*/
static PyObject *getStrAttr( BPy_Config *self, void *type )
{
- PyObject *attr = NULL;
char *param = NULL;
-
switch( (int)type ) {
case EXPP_CONF_ATTR_PATH_YF_EXPORT:
param = U.yfexportdir;
@@ -127,13 +125,7 @@ static PyObject *getStrAttr( BPy_Config *self, void *type )
"undefined type in getStrAttr" );
}
- attr = PyString_FromString( param );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "PyString_FromString() failed!" );
+ return PyString_FromString( param );
}
/*
@@ -195,7 +187,6 @@ static int setStrAttr( BPy_Config *self, PyObject *value, void *type )
static PyObject *getIntAttr( BPy_Config *self, void *type )
{
- PyObject *attr = NULL;
int param;
switch( (int)type ) {
@@ -220,13 +211,7 @@ static PyObject *getIntAttr( BPy_Config *self, void *type )
"undefined type in getIntAttr" );
}
- attr = PyInt_FromLong( param );
-
- if( attr )
- return attr;
-
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "PyInt_FromLong() failed!" );
+ return PyInt_FromLong( param );
}
/*
diff --git a/source/blender/python/api2_2x/bpy_data.c b/source/blender/python/api2_2x/bpy_data.c
index 63aae24afec..edb894bd982 100644
--- a/source/blender/python/api2_2x/bpy_data.c
+++ b/source/blender/python/api2_2x/bpy_data.c
@@ -352,12 +352,12 @@ static int LibBlockSeq_setActive(BPy_LibBlockSeq *self, PyObject *value)
static int LibBlockSeq_setTag(BPy_LibBlockSeq *self, PyObject *value)
{
- int param = PyObject_IsTrue( value );
ID *id;
+ int param = PyObject_IsTrue( value );
if( param == -1 )
return EXPP_ReturnIntError( PyExc_TypeError,
- "expected int argument in range [0,1]" );
+ "expected True/False or 0/1" );
id = (ID *)wich_libbase(G.main, self->type)->first;
@@ -407,7 +407,7 @@ PyObject *LibBlockSeq_new(BPy_LibBlockSeq *self, PyObject * args, PyObject *kwd)
static char *kwlist[] = {"name", "filename", NULL};
if(PyArg_ParseTupleAndKeywords(args, kwd, "|ss", kwlist, &name, &filename) && filename ) {
- PyObject *ret;
+ PyObject *ret= NULL;
if (strlen(filename) > FILE_MAXDIR + FILE_MAXFILE - 1)
return ( EXPP_ReturnPyObjError( PyExc_IOError,
diff --git a/source/blender/python/api2_2x/doc/Armature.py b/source/blender/python/api2_2x/doc/Armature.py
index 157e8b28656..0dbaf28d6f8 100644
--- a/source/blender/python/api2_2x/doc/Armature.py
+++ b/source/blender/python/api2_2x/doc/Armature.py
@@ -156,6 +156,11 @@ class Armature:
@type mirrorEdit: Bool
@ivar autoIK: Adds temporary IK chains while grabbing bones
@type autoIK: Bool
+ @ivar layerMask: Layer bitmask
+ Example::
+ # set armature to layers 14 and 16
+ armature.layerMask = (1<<13) + (1<<15)
+ @type layerMask: Int
"""
def __init__(name = 'myArmature'):
@@ -282,6 +287,11 @@ class Bone:
@type headRadius: Float
@ivar tailRadius: The radius of this bones head (used for envalope bones)
@type tailRadius: Float
+ @ivar layerMask: Layer bitmask
+ Example::
+ # set bone to layers 14 and 16
+ bone.layerMask = (1<<13) + (1<<15)
+ @type layerMask: Int
"""
def hasParent():
diff --git a/source/blender/python/api2_2x/doc/BGL.py b/source/blender/python/api2_2x/doc/BGL.py
index 26bbfe0def6..661042f341b 100644
--- a/source/blender/python/api2_2x/doc/BGL.py
+++ b/source/blender/python/api2_2x/doc/BGL.py
@@ -1213,6 +1213,12 @@ def glPopAttrib():
@see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushattrib.html}
"""
+def glPopClientAttrib():
+ """
+ Pop the client attribute stack
+ @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushclientattrib.html}
+ """
+
def glPopMatrix():
"""
Pop the current matrix stack
@@ -1248,6 +1254,15 @@ def glPushAttrib(mask):
@param mask: Specifies a mask that indicates which attributes to save.
"""
+def glPushClientAttrib(mask):
+ """
+ Push the client attribute stack
+ @see: U{www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/pushclientattrib.html}
+
+ @type mask: Enumerated constant(s)
+ @param mask: Specifies a mask that indicates which attributes to save.
+ """
+
def glPushMatrix():
"""
Push the current matrix stack
diff --git a/source/blender/python/api2_2x/doc/Blender.py b/source/blender/python/api2_2x/doc/Blender.py
index e4ba4dbcf31..51666d0e211 100644
--- a/source/blender/python/api2_2x/doc/Blender.py
+++ b/source/blender/python/api2_2x/doc/Blender.py
@@ -222,7 +222,7 @@ def PackAll ():
Pack all files.
"""
-def Blender_CountPackedFiles():
+def CountPackedFiles():
"""
Returns the number of packed files.
"""
diff --git a/source/blender/python/api2_2x/doc/Constraint.py b/source/blender/python/api2_2x/doc/Constraint.py
index 2176c9903c2..4c1981c5238 100644
--- a/source/blender/python/api2_2x/doc/Constraint.py
+++ b/source/blender/python/api2_2x/doc/Constraint.py
@@ -32,7 +32,7 @@ Or to print all the constraints attached to each bone in a pose::
for comparison with L{Constraint.type}. Values are
TRACKTO, IKSOLVER, FOLLOWPATH, COPYROT, COPYLOC, COPYSIZE, ACTION,
LOCKTRACK, STRETCHTO, FLOOR, LIMITLOC, LIMITROT, LIMITSIZE, CLAMPTO,
- NULL
+ PYTHON, CHILDOF, TRANSFORM, NULL
@type Settings: readonly dictionary
@var Settings: Constant dict used for changing constraint settings.
@@ -42,6 +42,13 @@ Or to print all the constraints attached to each bone in a pose::
- BONE (string): name of Bone sub-target (for armature targets) (Note: not
used by Stretch To (STRETCHTO), Limit Location (LIMITLOC), Limit Rotation
(LIMITROT), Limit Scale (LIMITSIZE), Follow Path (FOLLOWPATH), Clamp To (CLAMPTO))
+ - Used by some constraints:
+ - OWNERSPACE (int): for TRACKTO, COPYLOC, COPYROT, COPYSIZE, LIMITLOC, LIMITROT, LIMITSIZE, PYTHON, TRANSFORM
+ If the owner is an object, values are SPACE_WORLD, SPACE_LOCAL
+ If the owner is a bone, values are SPACE_WORLD, SPACE_POSE, SPACE_PARLOCAL, SPACE_LOCAL
+ - TARGETSPACE (int): for TRACKTO, COPYLOC, COPYROT, COPYSIZE, PYTHON, TRANSFORM, ACTION
+ If the owner is an object, values are SPACE_WORLD, SPACE_LOCAL
+ If the owner is a bone, values are SPACE_WORLD, SPACE_POSE, SPACE_PARLOCAL, SPACE_LOCAL
- Used by IK Solver (IKSOLVER) constraint:
- TOLERANCE (float): clamped to [0.0001:1.0]
- ITERATIONS (int): clamped to [1,10000]
@@ -52,12 +59,11 @@ Or to print all the constraints attached to each bone in a pose::
- USETIP (bool)
- Used by Action (ACTION) constraint:
- ACTION (Action Object)
- - LOCAL (bool)
- START (int): clamped to [1,maxframe]
- END (int): clamped to [1,maxframe]
- - MIN (float): clamped to [-180.0,180.0]
- - MAX (float): clamped to [-180.0,180.0]
- - KEYON (int): values are XROT, YROT, ZROT
+ - MIN (float): clamped to [-1000.0,1000.0] for Location, [-180.0,180.0] for Rotation, [0.0001,1000.0] for Scaling
+ - MAX (float): clamped to [-1000.0,1000.0] for Location, [-180.0,180.0] for Rotation, [0.0001,1000.0] for Scaling
+ - KEYON (int): values are XLOC, YLOC, ZLOC, XROT, YROT, ZROT, XSIZE, YSIZE, ZSIZE
- Used by Track To (TRACKTO) constraint:
- TRACK (int): values are TRACKX, TRACKY, TRACKZ, TRACKNEGX,
TRACKNEGY, TRACKNEGZ
@@ -80,23 +86,18 @@ Or to print all the constraints attached to each bone in a pose::
- LOCK (int): values are LOCKX, LOCKY, LOCKZ
- Used by Clamp To (CLAMPTO) constraint:
- CLAMP (int): values are CLAMPAUTO, CLAMPX, CLAMPY, CLAMPZ
+ - CLAMPCYCLIC (bool)
- Used by Floor (FLOOR) constraint:
- MINMAX (int): values are MINX, MINY, MINZ, MAXX, MAXY, MAXZ
- OFFSET (float): clamped to [-100.0,100.0]
- STICKY (bool)
- Used by Copy Location (COPYLOC) and Copy Rotation (COPYROT)
- COPY (bitfield): any combination of COPYX, COPYY and COPYZ with possible addition of COPYXINVERT, COPYYINVERT and COPYZINVERT to invert that particular input (if on).
- - LOCAL (bool): Only for constraints which Armature targets.
- Used by Copy Size (COPYSIZE) constraint:
- COPY (bitfield): any combination of COPYX, COPYY and COPYZ
- Used by Limit Location (LIMITLOC) constraint:
- LIMIT (bitfield): any combination of LIMIT_XMIN, LIMIT_XMAX,
LIMIT_YMIN, LIMIT_YMAX, LIMIT_ZMIN, LIMIT_ZMAX
- - LIMIT_LOCAL_BONE (boolean): USE WITH CAUTION. Only do something
- with this value if constraint is assigned to a bone.
- - LIMIT_LOCAL_NOPARENT (boolean): USE WITH CAUTION. Only do something
- with this value if constraint is assigned to an object with that
- has been parented to something.
- XMIN (float): clamped to [-1000.0,1000.0]
- XMAX (float): clamped to [-1000.0,1000.0]
- YMIN (float): clamped to [-1000.0,1000.0]
@@ -106,8 +107,6 @@ Or to print all the constraints attached to each bone in a pose::
- Used by Limit Rotation (LIMITROT) constraint:
- LIMIT (bitfield): any combination of LIMIT_XROT, LIMIT_YROT,
LIMIT_ZROT
- - LIMIT_LOCAL_BONE (boolean): USE WITH CAUTION. Only do something
- with this value if constraint is assigned to a bone.
- XMIN (float): clamped to [-360.0,360.0]
- XMAX (float): clamped to [-360.0,360.0]
- YMIN (float): clamped to [-360.0,360.0]
@@ -117,12 +116,32 @@ Or to print all the constraints attached to each bone in a pose::
- Used by Limit Scale (LIMITSIZE) constraint:
- LIMIT (bitfield): any combination of LIMIT_XMIN, LIMIT_XMAX,
LIMIT_YMIN, LIMIT_YMAX, LIMIT_ZMIN, LIMIT_ZMAX
- - XMIN (float): clamped to [-1000.0,1000.0]
- - XMAX (float): clamped to [-1000.0,1000.0]
- - YMIN (float): clamped to [-1000.0,1000.0]
- - YMAX (float): clamped to [-1000.0,1000.0]
- - ZMIN (float): clamped to [-1000.0,1000.0]
- - ZMAX (float): clamped to [-1000.0,1000.0]
+ - XMIN (float): clamped to [0.0001,1000.0]
+ - XMAX (float): clamped to [0.0001,1000.0]
+ - YMIN (float): clamped to [0.0001,1000.0]
+ - YMAX (float): clamped to [0.0001,1000.0]
+ - ZMIN (float): clamped to [0.0001,1000.0]
+ - ZMAX (float): clamped to [0.0001,1000.0]
+ - Used by Python Script (PYTHON) constraint:
+ - SCRIPT (Text): script to use
+ - PROPERTIES (IDProperties): ID-Properties of constraint
+ - Used by Child Of (CHILDOF) constraint:
+ - COPY (bitfield): any combination of PARLOCX, PARLOCY, PARLOCZ,
+ PARROTX, PARROTY, PARROTZ, PARSIZEX, PARSIZEY, PARSIZEZ.
+ - Used by Transformation (TRANSFORM) constraint:
+ - FROM (int): values are LOC, ROT, SCALE
+ - TO (int): values are LOC, ROT, SCALE
+ - MAPX, MAPY, MAPZ (int): values are LOC, ROT, SCALE
+ - EXTRAPOLATE (bool)
+ - FROM_MINX, FROM_MINY, FROM_MINZ, FROM_MAXX,
+ FROM_MAXY, FROM_MAXZ (float):
+ If FROM==LOC, then is clamped to [-1000.0, 1000.0]
+ If FROM==ROT, then is clamped to [-360.0, 360.0]
+ If FROM==SCALE, then is clamped to [0.0001, 1000.0]
+ - TO_MINX, TO_MINY, TO_MINZ, TO_MAXX, TO_MAXY, TO_MAXZ (float):
+ If TO==LOC, then is clamped to [-1000.0, 1000.0]
+ If TO==ROT, then is clamped to [-360.0, 360.0]
+ If TO==SCALE, then is clamped to [0.0001, 1000.0]
"""
diff --git a/source/blender/python/api2_2x/doc/Curve.py b/source/blender/python/api2_2x/doc/Curve.py
index d8ab28524fb..c3760bc2c1d 100644
--- a/source/blender/python/api2_2x/doc/Curve.py
+++ b/source/blender/python/api2_2x/doc/Curve.py
@@ -10,7 +10,7 @@ This module provides access to B{Curve Data} objects in Blender.
A Blender Curve Data consists of multiple L{CurNurb}(s). Try converting a Text object to a Curve to see an example of this. Each curve is of
type Bezier or Nurb. The underlying L{CurNurb}(s) can be accessed with
-the [] operator. Operator [] returns an object of type L{CurNurb}.
+the [] operator. Operator [] returns an object of type L{CurNurb}. Removing a L{CurNurb} can be done this way too. del curve[0] removes the first curve.
Note that L{CurNurb} can be used to acces a curve of any type (Poly, Bezier or Nurb)
@@ -115,9 +115,9 @@ class Curve:
@type resolv: int
@ivar width: The Curve Data width [0 - 2].
@type width: float
- @ivar ext1: The Curve Data extent1 (for bevels).
+ @ivar ext1: The Curve Data extent1 Called "Extrude" in the user interface (for bevels only).
@type ext1: float
- @ivar ext2: The Curve Data extent2 (for bevels).
+ @ivar ext2: The Curve Data extent2 - Called "Bevel Depth" in the user interface (for bevels only).
@type ext2: float
@ivar loc: The Curve Data location(from the center).
@type loc: list of 3 floats
@@ -543,6 +543,8 @@ class CurNurb:
@ivar knotsV: The knot vector in the V direction. The tuple will be empty
if the curve isn't a NURB or doesn't have knots in this direction.
@type knotsV: tuple of floats
+ @ivar smooth: Set the smoothing for this curve (applies to cuve objects that have a bevel)
+ @type smooth: bool
"""
def __setitem__( n, point ):
diff --git a/source/blender/python/api2_2x/doc/Draw.py b/source/blender/python/api2_2x/doc/Draw.py
index 70006048a61..9b6f29b6b51 100644
--- a/source/blender/python/api2_2x/doc/Draw.py
+++ b/source/blender/python/api2_2x/doc/Draw.py
@@ -249,8 +249,9 @@ def UIBlock(draw):
@note: Within this popup, Redraw events and the registered button callback will not work.
For buttons to run events, use per button callbacks.
@note: OpenGL drawing functions wont work within this popup, for text use L{Label} rather then L{Text}
+ @warning: L{Menu} will not work properly within a UIBlock, this is a limitation with blenders user interface internals.
"""
-
+
def Register(draw = None, event = None, button = None):
"""
Register callbacks for windowing.
diff --git a/source/blender/python/api2_2x/doc/Geometry.py b/source/blender/python/api2_2x/doc/Geometry.py
index 7c7e91a1a71..f882f4b3b57 100644
--- a/source/blender/python/api2_2x/doc/Geometry.py
+++ b/source/blender/python/api2_2x/doc/Geometry.py
@@ -48,6 +48,13 @@ def LineIntersect2D(vec1, vec2, vec3, vec4):
@return: a 2D Vector for the intersection or None where there is no intersection.
"""
+def ClosestPointOnLine(pt, vec1, vec2):
+ """
+ Takes 2 lines vec1, vec2 for the 2 points of the first line and vec2, vec3 for the 2 points of the second line.
+ @rtype: tuple
+ @return: a tuple containing a vector and a float, the vector is the closest point on the line, the float is the position on the line, between 0 and 1 the point is on the line.
+ """
+
def PointInTriangle2D(pt, tri_pt1, tri_pt2, tri_pt3):
"""
Takes 4 vectors (one for the test point and 3 for the triangle)
diff --git a/source/blender/python/api2_2x/doc/Ipo.py b/source/blender/python/api2_2x/doc/Ipo.py
index 8658f9cda1c..b8c472b371a 100644
--- a/source/blender/python/api2_2x/doc/Ipo.py
+++ b/source/blender/python/api2_2x/doc/Ipo.py
@@ -14,12 +14,12 @@ several IpoCurves, and an IpoCurve is composed of several BezTriples.
Example::
from Blender import Ipo
- ob = Ipo.Get('ObIpo') # retrieves an Ipo object
- ob.name = 'ipo1' # change the Ipo's name
- icu = ipo[Ipo.OB_LOCX] # request X Location Ipo curve object
+ ipo = Ipo.Get('ObIpo') # retrieves an Ipo object
+ ipo.name = 'ipo1' # change the Ipo's name
+ icu = ipo[Ipo.OB_LOCX] # request X Location Ipo curve
if icu != None and len(icu.bezierPoints) > 0: # if curve exists and has BezTriple points
- val = icu[2.5] # get the curve's value at time 2.5
- icu[Ipo.OB_LOCX] = None # delete the ipo curve
+ val = icu[2.5] # get the curve's value at time 2.5
+ ipo[Ipo.OB_LOCX] = None # delete the Ipo curve
Each type of Ipo has different types Ipocurves. With the exception of Shape
Key Ipos, constants are used to specify all Ipocurves. There are two ways
diff --git a/source/blender/python/api2_2x/doc/Key.py b/source/blender/python/api2_2x/doc/Key.py
index 584a7f066b1..53f289d2e8b 100644
--- a/source/blender/python/api2_2x/doc/Key.py
+++ b/source/blender/python/api2_2x/doc/Key.py
@@ -89,16 +89,36 @@ class KeyBlock:
def getData():
"""
Get the data of a KeyBlock, as a list of data items. Each item
- will have a different data type depending on the type of this
+ will have a different data format depending on the type of this
Key.
- - Mesh keys have a list of L{NMVert<NMesh.NMVert>} objects in the data
+
+ Note that prior to 2.45 the behaviour of this function
+ was different (and very wrong). Old scripts might need to be
+ updated.
+
+ - Mesh keys have a list of L{Vectors<Mathutils.Vector>} objects in the data
block.
- - Lattice keys have a list of BPoints in the data block. These
- don't have corresponding Python objects yet, so each BPoint is
- represented using a list of three floating-point numbers (the
- coordinate for each lattice vertex).
- - Curve keys return either a list of L{BezTriple<BezTriple.BezTriple>}
- objects in the data if the curve is a Bezier curve, otherwise it
- returns lists of three floats for each NURB or poly coordinate.
+ - Lattice keys have a list of L{Vectors<Mathutils.Vector>} objects in the data
+ block.
+ - Curve keys return either a list of tuples, eacn containing
+ four L{Vectors<Mathutils.Vector>} (if the curve is a Bezier curve),
+ or otherwise just a list of L{Vectors<Mathutils.Vector>}.
+
+ For bezier keys, the first three vectors in the tuple are the Bezier
+ triple vectors, while the fourth vector's first element is the curve tilt
+ (the other two elements are reserved and are currently unused).
+
+ For non-Bezier keys, the first three elements of the returned vector is
+ the curve handle point, while the fourth element is the tilt.
+
+
+ A word on relative shape keys; relative shape keys are not actually
+ stored as offsets to the base shape key (like you'd expect). Instead,
+ each shape key stores an entire model (actually the state of the mesh
+ vertices after exiting editmode with any given key active).
+
+ The additive offset for a shape key is calculated (when needed) by
+ comparing the shape key with its base key, which is always the very
+ first in the keyblock list.
"""
diff --git a/source/blender/python/api2_2x/doc/Mesh.py b/source/blender/python/api2_2x/doc/Mesh.py
index 2b858ab7748..7e7514e8b3a 100644
--- a/source/blender/python/api2_2x/doc/Mesh.py
+++ b/source/blender/python/api2_2x/doc/Mesh.py
@@ -17,6 +17,7 @@ face's attributes (the vertex color):
Example::
from Blender import *
+ import bpy
editmode = Window.EditMode() # are we in edit mode? If so ...
if editmode: Window.EditMode(0) # leave edit mode before getting the mesh
@@ -25,7 +26,7 @@ Example::
coords=[ [-1,-1,-1], [1,-1,-1], [1,1,-1], [-1,1,-1], [0,0,1] ]
faces= [ [3,2,1,0], [0,1,4], [1,2,4], [2,3,4], [3,0,4] ]
- me = Mesh.New('myMesh') # create a new mesh
+ me = bpy.data.meshes.new('myMesh') # create a new mesh
me.verts.extend(coords) # add vertices to mesh
me.faces.extend(faces) # add faces to the mesh (also adds edges)
@@ -35,7 +36,7 @@ Example::
me.faces[1].col[1].g = 255
me.faces[1].col[2].b = 255
- scn = Scene.GetCurrent() # link object to current scene
+ scn = bpy.data.scenes.active # link object to current scene
ob = scn.objects.new(me, 'myObj')
if editmode: Window.EditMode(1) # optional, just being nice
@@ -518,7 +519,7 @@ class MFace:
me= ob.getData(mesh=1) # thin wrapper doesn't copy mesh data like nmesh
me.vertexColors= True # Enable face, vertex colors
for f in me.faces:
- for i, v in enumerate(f.v):
+ for i, v in enumerate(f):
no= v.no
col= f.col[i]
col.r= int((no.x+1)*128)
@@ -689,6 +690,22 @@ class MFaceSeq:
- a integer, specifying an index into the mesh's face list
"""
+ def sort():
+ """
+ Sorts the faces using exactly the same syntax as pythons own list sorting function.
+
+ Example::
+ import Blender
+ from Blender import Mesh
+ me = Mesh.Get('mymesh')
+
+ me.faces.sort(key=lambda f: f.area)
+
+ me.faces.sort(key=lambda f: f.cent)
+
+ @note: Internally faces only refer to their index, so after sorting, faces you alredy have will not have their index changed to match the new sorted order.
+ """
+
def selected():
"""
Get selected faces.
@@ -740,19 +757,9 @@ class Mesh:
@type hide: boolean
@ivar subDivLevels: The [display, rendering] subdivision levels in [1, 6].
@type subDivLevels: list of 2 ints
-
- @ivar faceUV: The mesh contains UV-mapped textured faces. Enabling faceUV
- does not initialize the face colors like the Blender UI does; this must
- be done in the script. B{Note}: if faceUV is set, L{vertexColors} cannot
- be set. Furthermore, if vertexColors is already set when faceUV is set,
- vertexColors is cleared. This is because the vertex color information
- is stored with UV faces, so enabling faceUV implies enabling vertexColors.
- In addition, faceUV cannot be set when the mesh has no faces defined
- (this is the same behavior as the UI). Attempting to do so will throw
- a RuntimeError exception.
+ @ivar faceUV: The mesh contains UV-mapped textured faces.
@type faceUV: bool
- @ivar vertexColors: The mesh contains vertex colors. See L{faceUV} for the
- use of vertex colors when UV-mapped texture faces are enabled.
+ @ivar vertexColors: The mesh contains vertex colors. Set True to add vertex colors.
@type vertexColors: bool
@ivar vertexUV: The mesh contains "sticky" per-vertex UV coordinates.
@type vertexUV: bool
@@ -827,10 +834,15 @@ class Mesh:
Recalculates the vertex normals using face data.
"""
- def pointInside(vector):
+ def pointInside(point, selected_only=False):
"""
+ @type point: vector
+ @param point: Test if this point is inside the mesh
+ @type selected_only: bool
+ @param selected_only: if True or 1, only the selected faces are taken into account.
Returns true if vector is inside the mesh.
@note: Only returns a valid result for mesh data that has no holes.
+ @note: Bubbles in the mesh work as expect.
"""
def transform(matrix, recalc_normals = False, selected_only=False):
@@ -862,7 +874,7 @@ class Mesh:
@param matrix: 4x4 Matrix which can contain location, scale and rotation.
@type recalc_normals: int
@param recalc_normals: if True or 1, also transform vertex normals.
- @type selected_only: int
+ @type selected_only: bool
@param selected_only: if True or 1, only the selected verts will be transformed.
@warn: unlike L{NMesh.transform()<NMesh.NMesh.transform>}, this method
I{will immediately modify the mesh data} when it is used. If you
@@ -1001,7 +1013,8 @@ class Mesh:
@type group: string
@param group: the group name.
@type weightsFlag: bool
- @param weightsFlag: if 1, the weight is returned along with the index.
+ @param weightsFlag: if 1, each item in the list returned contains a
+ tuple pair (index, weight), the weight is a float between 0.0 and 1.0.
@type vertList: list of ints
@param vertList: if given, only those vertex points that are both in the
list and group passed in are returned.
diff --git a/source/blender/python/api2_2x/doc/Modifier.py b/source/blender/python/api2_2x/doc/Modifier.py
index 2770f66b318..0c53f470b63 100644
--- a/source/blender/python/api2_2x/doc/Modifier.py
+++ b/source/blender/python/api2_2x/doc/Modifier.py
@@ -110,9 +110,9 @@ Example::
- WIDTH - Used for Wave only (float [0.0 - 5.0])
- NARROW - Used for Wave only (float [0.0 - 10.0])
- SPEED - Used for Wave only (float [-2.0 - 2.0])
- - DAMP - Used for Wave only (float [-1000.0 - 1000.0])
- - LIFETIME - Used for Wave only (float [-1000.0 - 1000.0])
- - TIMEOFFS - Used for Wave only (float [-1000.0 - 1000.0])
+ - DAMP - Used for Wave only (float [-MAXFRAME - MAXFRAME])
+ - LIFETIME - Used for Wave only (float [-MAXFRAME - MAXFRAME])
+ - TIMEOFFS - Used for Wave only (float [-MAXFRAME - MAXFRAME])
- OPERATION - Used for boolean only (int 0,1,2 : Intersect, Union, Difference)
diff --git a/source/blender/python/api2_2x/doc/Pose.py b/source/blender/python/api2_2x/doc/Pose.py
index 677141d3dfd..ad1b44da5e2 100644
--- a/source/blender/python/api2_2x/doc/Pose.py
+++ b/source/blender/python/api2_2x/doc/Pose.py
@@ -175,12 +175,14 @@ class PoseBone:
@type localMatrix: Matrix object
@ivar poseMatrix: The total transformation of this PoseBone including constraints.
- (not settable).
-
This matrix is in armature space, for the current worldspace location of this pose bone, multiply
- it with its objects worldspace matrix
+ it with its objects worldspace matrix.
eg. pose_bone.poseMatrix * object.matrixWorld
+
+ Setting the poseMatrix only sets the loc/size/rot, before constraints are applied (similar to actions).
+ After setting pose matrix, run pose.update() to re-evaluate the pose and see the changes in the 3d view.
+
@type poseMatrix: Matrix object
@type constraints: BPy_ConstraintSeq
@ivar constraints: a sequence of constraints for the object
@@ -215,7 +217,11 @@ class PoseBone:
@ivar lockYRot: Disable Y DoF when part of an IK.
@type lockZRot: bool
@ivar lockZRot: Disable Z DoF when part of an IK.
-
+ @ivar layerMask: Layer bitmask
+ Example::
+ # set bone to layers 14 and 16
+ bone.layerMask = (1<<13) + (1<<15)
+ @type layerMask: Int
"""
def insertKey(parentObject, frameNumber, type = "[Pose.LOC, Pose.ROT, Pose.SIZE]", fast = False):
diff --git a/source/blender/python/api2_2x/doc/Render.py b/source/blender/python/api2_2x/doc/Render.py
index c956d0cd6ee..61c8eda9026 100644
--- a/source/blender/python/api2_2x/doc/Render.py
+++ b/source/blender/python/api2_2x/doc/Render.py
@@ -293,7 +293,11 @@ class RenderData:
@type oversampling: boolean
@ivar fps: Frames per second.
Values are clamped to the range [1,120].
- @type fps: int
+ @ivar fps_base: Frames per second base: used to generate fractional frames
+ per second values. For example, setting fps to 30 and fps_base to 1.001
+ will approximate the NTSC frame rate of 29.97 fps.
+ Values are clamped to the range [1,120].
+ @type fps_base: float
@ivar timeCode: Get the current frame in HH:MM:SS:FF format. Read-only.
@type timeCode: string
@ivar environmentMap: Environment map rendering enabled.
@@ -327,7 +331,7 @@ class RenderData:
@type set: BPy_Scene or None
@ivar yafrayGIMethod: Global Illumination method.
Valid values are NONE (0), SKYDOME (1) or FULL (2).
- @type yafrayGIMethod: int
+ @type yafrayGIMethod: int {NONE (0), SKYDOME (1), GIFULL (2)}
@ivar yafrayGIQuality: Global Illumination quality.
@type yafrayGIQuality: int {NONE (0), LOW (1), MEDIUM (2), HIGH (3), HIGHER (4), BEST (5), USEAOSETTINGS (6)}
@ivar yafrayExportToXML: If true export to an xml file and call yafray instead of plugin.
@@ -346,8 +350,6 @@ class RenderData:
@type yafrayAntiAliasingThreshold: float [0.05, 1.0]
@ivar yafrayNumberOfProcessors: Number of processors to use.
@type yafrayNumberOfProcessors: int [1, 8]
- @ivar yafrayGIMethod: Global illumination method.
- @type yafrayGIMethod: int {NONE (0), SKYDOME (1), GIFULL (2)}
@ivar yafrayGICache: Cache occlusion/irradiance samples (faster).
@type yafrayGICache: boolean
@ivar yafrayGICacheBumpNormals: Enable/disable bumpnormals for cache.
diff --git a/source/blender/python/api2_2x/doc/Scene.py b/source/blender/python/api2_2x/doc/Scene.py
index 93d3e7d830e..77e33e143f5 100644
--- a/source/blender/python/api2_2x/doc/Scene.py
+++ b/source/blender/python/api2_2x/doc/Scene.py
@@ -357,6 +357,8 @@ class SceneObjects:
@type context: sequence of L{Object}
@ivar active: the active object in the scene.
@type active: L{Object}
+ @ivar camera: the active camera in the scene.
+ @type camera: L{Object}
"""
def new(data):
diff --git a/source/blender/python/api2_2x/doc/Text3d.py b/source/blender/python/api2_2x/doc/Text3d.py
index 78993b9e8f3..a7d8c585078 100644
--- a/source/blender/python/api2_2x/doc/Text3d.py
+++ b/source/blender/python/api2_2x/doc/Text3d.py
@@ -153,13 +153,13 @@ class Text3d:
@param width: The new text3d's width value.
"""
- def getgetExtrudeDepth():
+ def getExtrudeDepth():
"""
Get the text3d's ext1 value.
@rtype: float
"""
- def setgetExtrudeDepth(ext1):
+ def setExtrudeDepth(ext1):
"""
Set the text3d's ext1 value.
@rtype: None
diff --git a/source/blender/python/api2_2x/doc/Texture.py b/source/blender/python/api2_2x/doc/Texture.py
index 9b1c3e0d7d3..dfba93c9978 100644
--- a/source/blender/python/api2_2x/doc/Texture.py
+++ b/source/blender/python/api2_2x/doc/Texture.py
@@ -59,6 +59,10 @@ Example::
- NEGALPHA - Reverse the alpha value
- CHECKER_ODD - Fill the "odd" checkerboard tiles
- CHECKER_EVEN - Fill the "even" checkerboard tiles
+ - COLORBAND - Enable colorband for this texture
+ - PREVIEW_ALPHA - Show alpha in preview
+ - REPEAT_XMIR - Mirrors X direction repeat
+ - REPEAT_YMIR - Mirrors Y direction repeat
@type ImageFlags: readonly dictionary
@var ImageFlags: The available image flags for Texture.imageFlags:
@@ -476,7 +480,7 @@ class Texture:
The return value is a 4D vector where (x,y,z,w) are (red, green, blue, intensity)
For greyscale textures, often intensity only will be used.
- @type coord: vector
+ @type coord: vector or tuple of 3 numbers
"""
import id_generics
@@ -528,6 +532,8 @@ class MTex:
@ivar mtAmb: How texture maps to ambient value
@ivar mtDisp: How texture maps to displacement
@ivar mtWarp: How texture maps to warp
+ @ivar uvlayer: The name of the UV Layer this texture is mapped to (when left blank uses render layer)
+ @type uvlayer: string
"""
def getIpo():
diff --git a/source/blender/python/api2_2x/doc/Window.py b/source/blender/python/api2_2x/doc/Window.py
index d59b5ec9fa6..7fceeb757de 100644
--- a/source/blender/python/api2_2x/doc/Window.py
+++ b/source/blender/python/api2_2x/doc/Window.py
@@ -210,6 +210,20 @@ def SetCursorPos (coords):
can be done with L{Redraw}.
"""
+def GetPivot ():
+ """
+ Get the pivot for the active 3D view.
+ @rtype: int
+ @return: constant - Window.PivotTypes
+ """
+
+def SetPivot (pivot):
+ """
+ Set the pivot on the active 3D view.
+ @type pivot: int
+ @param pivot: constant - Window.PivotTypes
+ """
+
def WaitCursor (bool):
"""
Set cursor to wait or back to normal mode.
@@ -284,6 +298,20 @@ def EditMode(enable = -1, undo_msg = 'From script', undo = 1):
because the normal mesh will be rebuilt based on its unchanged edit mesh.
"""
+def PoseMode(enable = -1):
+ """
+ Get and optionally set the current pose mode status: in or out.
+ @type enable: int
+ @param enable: get/set current status:
+ - -1: just return current status (default);
+ - 0: leave edit mode;
+ - 1: enter edit mode.
+
+ @return: 0 if Blender is not in edit mode right now, 1 otherwise.
+ @warn: This uses the active armature objects posemode status, enabling pose
+ mode for non armature objects will always fail.
+ """
+
def ViewLayers (layers = [], winid = None):
"""
Get and optionally set the currently visible layers in all 3d Views.
diff --git a/source/blender/python/api2_2x/doc/epy_docgen-3.sh b/source/blender/python/api2_2x/doc/epy_docgen-3.sh
new file mode 100644
index 00000000000..bec7653b152
--- /dev/null
+++ b/source/blender/python/api2_2x/doc/epy_docgen-3.sh
@@ -0,0 +1,12 @@
+# epy_docgen.sh
+# generates blender python doc using epydoc
+# requires epydoc in your PATH.
+# run from the doc directory containing the .py files
+# usage: sh epy_docgen.sh
+
+# set posix locale so regex works properly for [A-Z]*.py
+LC_ALL=POSIX
+
+epydoc -o BPY_API --url "http://www.blender.org" --top API_intro \
+ --name "Blender" --no-private --no-frames \
+$( ls [A-Z]*.py )
diff --git a/source/blender/python/api2_2x/euler.c b/source/blender/python/api2_2x/euler.c
index 8816c286943..53489e0f737 100644
--- a/source/blender/python/api2_2x/euler.c
+++ b/source/blender/python/api2_2x/euler.c
@@ -347,6 +347,7 @@ static PyObject *Euler_slice(EulerObject * self, int begin, int end)
int count;
CLAMP(begin, 0, 3);
+ if (end<0) end= 4+end;
CLAMP(end, 0, 3);
begin = MIN2(begin,end);
@@ -368,6 +369,7 @@ static int Euler_ass_slice(EulerObject * self, int begin, int end,
PyObject *e, *f;
CLAMP(begin, 0, 3);
+ if (end<0) end= 4+end;
CLAMP(end, 0, 3);
begin = MIN2(begin,end);
diff --git a/source/blender/python/api2_2x/gen_library.c b/source/blender/python/api2_2x/gen_library.c
index 315a86ff607..8673fefdbb5 100644
--- a/source/blender/python/api2_2x/gen_library.c
+++ b/source/blender/python/api2_2x/gen_library.c
@@ -76,7 +76,7 @@ int GenericLib_setFakeUser( void *self, PyObject *value )
param = PyObject_IsTrue( value );
if( param == -1 )
return EXPP_ReturnIntError( PyExc_TypeError,
- "expected int argument in range [0,1]" );
+ "expected True/False or 0/1" );
if (param) {
if (!(id->flag & LIB_FAKEUSER)) {
@@ -325,17 +325,8 @@ PyObject *GetPyObjectFromID( ID * id )
Py_RETURN_NONE;
}
-/* return a unique tuple for this libdata*/
-long GenericLib_hash(PyObject * pydata)
+long GenericLib_hash(BPy_GenericLib * pydata)
{
- ID *id = ((BPy_GenericLib *)pydata)->id;
- PyObject *pyhash = PyTuple_New( 2 );
- long hash;
- PyTuple_SetItem( pyhash, 0, PyString_FromString(id->name) );
- if (id->lib) PyTuple_SetItem( pyhash, 1, PyString_FromString(id->lib->name) );
- else PyTuple_SetItem( pyhash, 1, EXPP_incr_ret(Py_None) );
- hash = PyObject_Hash(pyhash);
- Py_DECREF(pyhash);
- return hash;
+ return (long)pydata->id;
}
diff --git a/source/blender/python/api2_2x/gen_library.h b/source/blender/python/api2_2x/gen_library.h
index 74f34fd0019..9fb922619c2 100644
--- a/source/blender/python/api2_2x/gen_library.h
+++ b/source/blender/python/api2_2x/gen_library.h
@@ -90,5 +90,5 @@ short GenericLib_getType(PyObject * pydata);
/* Other ID functions */
ID *GetIdFromList( ListBase * list, char *name );
PyObject *GetPyObjectFromID( ID * id );
-long GenericLib_hash(PyObject * pydata);
+long GenericLib_hash(BPy_GenericLib * pydata);
#endif /* EXPP_gen_library_h */
diff --git a/source/blender/python/api2_2x/gen_utils.c b/source/blender/python/api2_2x/gen_utils.c
index 09f887fafb8..8a98fd279b7 100644
--- a/source/blender/python/api2_2x/gen_utils.c
+++ b/source/blender/python/api2_2x/gen_utils.c
@@ -638,7 +638,7 @@ int EXPP_setIValueClamped( PyObject *value, void *param,
{
int number;
- if( !PyInt_CheckExact ( value ) ) {
+ if( !PyInt_Check( value ) ) {
char errstr[128];
sprintf ( errstr, "expected int argument in [%d,%d]", min, max );
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
@@ -729,7 +729,7 @@ int EXPP_setIValueRange( PyObject *value, void *param,
sprintf ( errstr, "expected int argument in [%d,%d]", min, max );
- if( !PyInt_CheckExact ( value ) )
+ if( !PyInt_Check ( value ) )
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
number = PyInt_AS_LONG( value );
@@ -828,23 +828,27 @@ PyObject *EXPP_getBitfield( void *param, int setting, char type )
int EXPP_setBitfield( PyObject * value, void *param, int setting, char type )
{
- int flag = PyObject_IsTrue( value );
+ int param_bool = PyObject_IsTrue( value );
+ if( param_bool == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
+
switch ( type ) {
case 'b':
- if ( flag )
+ if ( param_bool )
*(char *)param |= setting;
else
*(char *)param &= ~setting;
return 0;
case 'h':
- if ( flag )
+ if ( param_bool )
*(short *)param |= setting;
else
*(short *)param &= ~setting;
return 0;
case 'i':
- if ( flag )
+ if ( param_bool )
*(int *)param |= setting;
else
*(int *)param &= ~setting;
@@ -914,3 +918,31 @@ int EXPP_dict_set_item_str( PyObject *dict, char *key, PyObject *value)
Py_DECREF( value ); /* delete original */
return ret;
}
+
+/*
+ * Helper function for subtypes that what the base types methods.
+ * The command below needs to have args modified to have 'self' added at the start
+ * ret = PyObject_Call(PyDict_GetItemString(PyList_Type.tp_dict, "sort"), newargs, keywds);
+ *
+ * This is not easy with the python API so adding a function here,
+ * remember to Py_DECREF the tuple after
+ */
+
+PyObject * EXPP_PyTuple_New_Prepend(PyObject *tuple, PyObject *value)
+{
+ PyObject *item;
+ PyObject *new_tuple;
+ int i;
+
+ i = PyTuple_Size(tuple);
+ new_tuple = PyTuple_New(i+1);
+ PyTuple_SetItem(new_tuple, 0, value);
+ Py_INCREF(value);
+ while (i) {
+ i--;
+ item = PyTuple_GetItem(tuple, i);
+ PyTuple_SetItem(new_tuple, i+1, item);
+ Py_INCREF(item);
+ }
+ return new_tuple;
+}
diff --git a/source/blender/python/api2_2x/gen_utils.h b/source/blender/python/api2_2x/gen_utils.h
index 39e3e96d9ec..f13722e03d0 100644
--- a/source/blender/python/api2_2x/gen_utils.h
+++ b/source/blender/python/api2_2x/gen_utils.h
@@ -170,6 +170,7 @@ void EXPP_allqueue(unsigned short event, short val);
/* helper to keep dictionaries from causing memory leaks */
int EXPP_dict_set_item_str( PyObject *dict, char *key, PyObject *value);
+PyObject * EXPP_PyTuple_New_Prepend(PyObject *tuple, PyObject *value);
#endif /* EXPP_gen_utils_h */
diff --git a/source/blender/python/api2_2x/logic.c b/source/blender/python/api2_2x/logic.c
index 8630dcaf4f2..a09b7fa48e7 100644
--- a/source/blender/python/api2_2x/logic.c
+++ b/source/blender/python/api2_2x/logic.c
@@ -175,28 +175,18 @@ static void Property_dealloc( BPy_Property * self )
//---------------getattr--------------------------------------------
static PyObject *Property_getAttr( BPy_Property * self, char *name )
{
- PyObject *attr = Py_None;
-
checkValidData_ptr( self );
if( strcmp( name, "name" ) == 0 )
- attr = Property_getName( self );
+ return Property_getName( self );
else if( strcmp( name, "data" ) == 0 )
- attr = Property_getData( self );
+ return Property_getData( self );
else if( strcmp( name, "type" ) == 0 )
- attr = Property_getType( self );
+ return Property_getType( self );
else if( strcmp( name, "__members__" ) == 0 ) {
- attr = Py_BuildValue( "[s,s,s]", "name", "data", "type" );
+ return Py_BuildValue( "[s,s,s]", "name", "data", "type" );
}
- if( !attr )
- return ( EXPP_ReturnPyObjError
- ( PyExc_MemoryError, "couldn't create PyObject" ) );
-
- if( attr != Py_None )
- return attr;
-
- return Py_FindMethod( BPy_Property_methods, ( PyObject * ) self,
- name );
+ return Py_FindMethod( BPy_Property_methods, ( PyObject * ) self, name );
}
//--------------- setattr-------------------------------------------
@@ -380,18 +370,10 @@ PyObject *newPropertyObject( char *name, PyObject * data, int type )
//--------------- BPy_Property.getName()----------------------------
static PyObject *Property_getName( BPy_Property * self )
{
- PyObject *attr = NULL;
-
if( !self->property )
- attr = PyString_FromString( self->name );
+ return PyString_FromString( self->name );
else
- attr = PyString_FromString( self->property->name );
-
- if( attr )
- return attr;
-
- return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Property.name attribute" ) );
+ return PyString_FromString( self->property->name );
}
//--------------- BPy_Property.setName()----------------------------
@@ -410,7 +392,7 @@ static PyObject *Property_setName( BPy_Property * self, PyObject * value )
updatePyProperty( self );
}
- return EXPP_incr_ret( Py_None );
+ Py_RETURN_NONE;
}
//--------------- BPy_Property.getData()----------------------------
@@ -441,7 +423,7 @@ static PyObject *Property_getData( BPy_Property * self )
return attr;
return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
- "couldn't get Property.name attribute" ) );
+ "couldn't get Property.data attribute" ) );
}
//--------------- BPy_Property.setData()----------------------------
@@ -520,13 +502,12 @@ static PyObject *Property_setData( BPy_Property * self, PyObject * args )
} else {
self->data = data;
}
- return EXPP_incr_ret( Py_None );
+ Py_RETURN_NONE;
}
//--------------- BPy_Property.getType()----------------------------
static PyObject *Property_getType( BPy_Property * self )
{
- PyObject *attr = Py_None;
int type;
if( self->property )
@@ -535,15 +516,14 @@ static PyObject *Property_getType( BPy_Property * self )
type = self->type;
if( type == PROP_BOOL )
- attr = PyString_FromString( "BOOL" );
+ return PyString_FromString( "BOOL" );
else if( type == PROP_INT )
- attr = PyString_FromString( "INT" );
+ return PyString_FromString( "INT" );
else if( type == PROP_FLOAT )
- attr = PyString_FromString( "FLOAT" );
+ return PyString_FromString( "FLOAT" );
else if( type == PROP_STRING )
- attr = PyString_FromString( "STRING" );
+ return PyString_FromString( "STRING" );
else if( type == PROP_TIME )
- attr = PyString_FromString( "TIME" );
-
- return attr;
+ return PyString_FromString( "TIME" );
+ Py_RETURN_NONE;
}
diff --git a/source/blender/python/api2_2x/matrix.c b/source/blender/python/api2_2x/matrix.c
index 6a427bfe7f6..fadadbb5c6a 100644
--- a/source/blender/python/api2_2x/matrix.c
+++ b/source/blender/python/api2_2x/matrix.c
@@ -202,16 +202,27 @@ PyObject *Matrix_RotationPart(MatrixObject * self)
/*---------------------------Matrix.scalePart() --------------------*/
PyObject *Matrix_scalePart(MatrixObject * self)
{
- float scale[3];
-
+ float scale[3], rot[3];
+ float mat[3][3], imat[3][3], tmat[3][3];
+
/*must be 3-4 cols, 3-4 rows, square matrix*/
if(self->colSize == 4 && self->rowSize == 4)
- Mat4ToSize((float (*)[4])*self->matrix, scale);
+ Mat3CpyMat4(mat, (float (*)[4])*self->matrix);
else if(self->colSize == 3 && self->rowSize == 3)
- Mat3ToSize((float (*)[3])*self->matrix, scale);
+ Mat3CpyMat3(mat, (float (*)[3])*self->matrix);
else
return EXPP_ReturnPyObjError(PyExc_AttributeError,
"Matrix.scalePart(): inappropriate matrix size - expects 3x3 or 4x4 matrix\n");
+
+ /* functionality copied from editobject.c apply_obmat */
+ Mat3ToEul(mat, rot);
+ EulToMat3(rot, tmat);
+ Mat3Inv(imat, tmat);
+ Mat3MulMat3(tmat, imat, mat);
+
+ scale[0]= tmat[0][0];
+ scale[1]= tmat[1][1];
+ scale[2]= tmat[2][2];
return newVectorObject(scale, 3, Py_NEW);
}
/*---------------------------Matrix.invert() ---------------------*/
diff --git a/source/blender/python/api2_2x/quat.c b/source/blender/python/api2_2x/quat.c
index 09b7ef5fe3c..3793db47686 100644
--- a/source/blender/python/api2_2x/quat.c
+++ b/source/blender/python/api2_2x/quat.c
@@ -350,6 +350,7 @@ static PyObject *Quaternion_slice(QuaternionObject * self, int begin, int end)
int count;
CLAMP(begin, 0, 4);
+ if (end<0) end= 5+end;
CLAMP(end, 0, 4);
begin = MIN2(begin,end);
@@ -371,6 +372,7 @@ static int Quaternion_ass_slice(QuaternionObject * self, int begin, int end,
PyObject *q, *f;
CLAMP(begin, 0, 4);
+ if (end<0) end= 5+end;
CLAMP(end, 0, 4);
begin = MIN2(begin,end);
diff --git a/source/blender/python/api2_2x/rgbTuple.c b/source/blender/python/api2_2x/rgbTuple.c
index cdd05a60917..d8bfd930752 100644
--- a/source/blender/python/api2_2x/rgbTuple.c
+++ b/source/blender/python/api2_2x/rgbTuple.c
@@ -86,10 +86,10 @@ PyTypeObject rgbTuple_Type = {
PyObject_HEAD_INIT( NULL )
0, /* ob_size */
"rgbTuple", /* tp_name */
- sizeof( BPy_rgbTuple ), /* tp_basicsize */
+ sizeof( BPy_rgbTuple ), /* tp_basicsize */
0, /* tp_itemsize */
/* methods */
- NULL, /* tp_dealloc */
+ 0, /* tp_dealloc */
0, /* tp_print */
( getattrfunc ) rgbTuple_getAttr, /* tp_getattr */
( setattrfunc ) rgbTuple_setAttr, /* tp_setattr */
@@ -99,11 +99,31 @@ PyTypeObject rgbTuple_Type = {
&rgbTupleAsSequence, /* tp_as_sequence */
&rgbTupleAsMapping, /* tp_as_mapping */
0, /* tp_as_hash */
- 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, Py_TPFLAGS_DEFAULT,
0, /* tp_doc */
0, 0, 0, 0, 0, 0,
0, /* tp_methods */
0, /* tp_members */
+ 0, /* struct PyGetSetDef *tp_getset; */
+ 0, /* struct _typeobject *tp_base; */
+ 0, /* PyObject *tp_dict; */
+ 0, /* descrgetfunc tp_descr_get; */
+ 0, /* descrsetfunc tp_descr_set; */
+ 0, /* long tp_dictoffset; */
+ 0, /* initproc tp_init; */
+ 0, /* allocfunc tp_alloc; */
+ 0, /* newfunc tp_new; */
+ /* Low-level free-memory routine */
+ 0, /* freefunc tp_free; */
+ /* For PyObject_IS_GC */
+ 0, /* inquiry tp_is_gc; */
+ 0, /* PyObject *tp_bases; */
+ /* method resolution order */
+ 0, /* PyObject *tp_mro; */
+ 0, /* PyObject *tp_cache; */
+ 0, /* PyObject *tp_subclasses; */
+ 0, /* PyObject *tp_weaklist; */
+ 0
};
/*****************************************************************************/
@@ -111,13 +131,7 @@ PyTypeObject rgbTuple_Type = {
/*****************************************************************************/
PyObject *rgbTuple_New( float *rgb[3] )
{
- BPy_rgbTuple *rgbTuple;
-
- rgbTuple_Type.ob_type = &PyType_Type;
-
- rgbTuple =
- ( BPy_rgbTuple * ) PyObject_NEW( BPy_rgbTuple,
- &rgbTuple_Type );
+ BPy_rgbTuple *rgbTuple = PyObject_NEW( BPy_rgbTuple, &rgbTuple_Type );
if( rgbTuple == NULL )
return EXPP_ReturnPyObjError( PyExc_MemoryError,
@@ -138,12 +152,8 @@ PyObject *rgbTuple_New( float *rgb[3] )
/*****************************************************************************/
PyObject *rgbTuple_getCol( BPy_rgbTuple * self )
{
- PyObject *attr = Py_BuildValue( "[fff]", *(self->rgb[0]),
+ return Py_BuildValue( "[fff]", *(self->rgb[0]),
*(self->rgb[1]), *(self->rgb[2]));
- if( !attr )
- return EXPP_ReturnPyObjError( PyExc_MemoryError,
- "Py_BuildValue() failed" );
- return attr;
}
int rgbTuple_setCol( BPy_rgbTuple * self, PyObject * args )
diff --git a/source/blender/python/api2_2x/sceneRender.c b/source/blender/python/api2_2x/sceneRender.c
index 7b8993fe98d..187df27e79a 100644
--- a/source/blender/python/api2_2x/sceneRender.c
+++ b/source/blender/python/api2_2x/sceneRender.c
@@ -75,6 +75,7 @@ enum rend_constants {
EXPP_RENDER_ATTR_SFRAME,
EXPP_RENDER_ATTR_EFRAME,
EXPP_RENDER_ATTR_FPS,
+ EXPP_RENDER_ATTR_FPS_BASE,
EXPP_RENDER_ATTR_SIZEX,
EXPP_RENDER_ATTR_SIZEY,
EXPP_RENDER_ATTR_GAUSSFILTER,
@@ -285,7 +286,8 @@ static PyObject *M_Render_GetSetAttributeInt( PyObject * args, int *structure,
static void M_Render_DoSizePreset( BPy_RenderData * self, short xsch,
short ysch, short xasp, short yasp,
short size, short xparts, short yparts,
- short frames, float a, float b, float c,
+ short fps, float fps_base,
+ float a, float b, float c,
float d )
{
self->renderContext->xsch = xsch;
@@ -293,7 +295,8 @@ static void M_Render_DoSizePreset( BPy_RenderData * self, short xsch,
self->renderContext->xasp = xasp;
self->renderContext->yasp = yasp;
self->renderContext->size = size;
- self->renderContext->frs_sec = frames;
+ self->renderContext->frs_sec = fps;
+ self->renderContext->frs_sec_base = fps_base;
self->renderContext->xparts = xparts;
self->renderContext->yparts = yparts;
@@ -694,7 +697,7 @@ static int RenderData_setOSALevel( BPy_RenderData * self,
{
int level;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument" );
@@ -925,7 +928,7 @@ static int RenderData_setRenderer( BPy_RenderData * self, PyObject * value )
{
int type;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected constant INTERNAL or YAFRAY" );
@@ -956,7 +959,7 @@ static int RenderData_setImageType( BPy_RenderData *self, PyObject *value )
{
int type;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int constant" );
@@ -1057,20 +1060,24 @@ PyObject *RenderData_SizePreset( BPy_RenderData * self, PyObject * args )
if( type == B_PR_PAL ) {
M_Render_DoSizePreset( self, 720, 576, 54, 51, 100,
self->renderContext->xparts,
- self->renderContext->yparts, 25, 0.1f,
+ self->renderContext->yparts, 25, 1.0f,
+ 0.1f,
0.9f, 0.1f, 0.9f );
self->renderContext->mode &= ~R_PANORAMA;
BLI_init_rctf( &self->renderContext->safety, 0.1f, 0.9f, 0.1f,
0.9f );
} else if( type == B_PR_NTSC ) {
M_Render_DoSizePreset( self, 720, 480, 10, 11, 100, 1, 1,
- 30, 0.1f, 0.9f, 0.1f, 0.9f );
+ 30, 1.001f,
+ 0.1f, 0.9f, 0.1f, 0.9f );
self->renderContext->mode &= ~R_PANORAMA;
BLI_init_rctf( &self->renderContext->safety, 0.1f, 0.9f, 0.1f,
0.9f );
} else if( type == B_PR_PRESET ) {
M_Render_DoSizePreset( self, 720, 576, 54, 51, 100, 1, 1,
- self->renderContext->frs_sec, 0.1f, 0.9f,
+ self->renderContext->frs_sec,
+ self->renderContext->frs_sec_base,
+ 0.1f, 0.9f,
0.1f, 0.9f );
self->renderContext->mode = R_OSA + R_SHADOW + R_FIELDS;
self->renderContext->imtype = R_TARGA;
@@ -1078,34 +1085,42 @@ PyObject *RenderData_SizePreset( BPy_RenderData * self, PyObject * args )
0.9f );
} else if( type == B_PR_PRV ) {
M_Render_DoSizePreset( self, 640, 512, 1, 1, 50, 1, 1,
- self->renderContext->frs_sec, 0.1f, 0.9f,
+ self->renderContext->frs_sec,
+ self->renderContext->frs_sec_base,
+ 0.1f, 0.9f,
0.1f, 0.9f );
self->renderContext->mode &= ~R_PANORAMA;
BLI_init_rctf( &self->renderContext->safety, 0.1f, 0.9f, 0.1f,
0.9f );
} else if( type == B_PR_PC ) {
M_Render_DoSizePreset( self, 640, 480, 100, 100, 100, 1, 1,
- self->renderContext->frs_sec, 0.0f, 1.0f,
+ self->renderContext->frs_sec,
+ self->renderContext->frs_sec_base,
+ 0.0f, 1.0f,
0.0f, 1.0f );
self->renderContext->mode &= ~R_PANORAMA;
BLI_init_rctf( &self->renderContext->safety, 0.0f, 1.0f, 0.0f,
1.0f );
} else if( type == B_PR_PAL169 ) {
M_Render_DoSizePreset( self, 720, 576, 64, 45, 100, 1, 1,
- 25, 0.1f, 0.9f, 0.1f, 0.9f );
+ 25, 1.0f, 0.1f, 0.9f, 0.1f, 0.9f );
self->renderContext->mode &= ~R_PANORAMA;
BLI_init_rctf( &self->renderContext->safety, 0.1f, 0.9f, 0.1f,
0.9f );
} else if( type == B_PR_PANO ) {
M_Render_DoSizePreset( self, 36, 176, 115, 100, 100, 16, 1,
- self->renderContext->frs_sec, 0.1f, 0.9f,
+ self->renderContext->frs_sec,
+ self->renderContext->frs_sec_base,
+ 0.1f, 0.9f,
0.1f, 0.9f );
self->renderContext->mode |= R_PANORAMA;
BLI_init_rctf( &self->renderContext->safety, 0.1f, 0.9f, 0.1f,
0.9f );
} else if( type == B_PR_FULL ) {
M_Render_DoSizePreset( self, 1280, 1024, 1, 1, 100, 1, 1,
- self->renderContext->frs_sec, 0.1f, 0.9f,
+ self->renderContext->frs_sec,
+ self->renderContext->frs_sec_base,
+ 0.1f, 0.9f,
0.1f, 0.9f );
self->renderContext->mode &= ~R_PANORAMA;
BLI_init_rctf( &self->renderContext->safety, 0.1f, 0.9f, 0.1f,
@@ -1729,9 +1744,11 @@ PyObject *RenderData_NewMapValue( BPy_RenderData * self, PyObject * args )
static PyObject *RenderData_getTimeCode( BPy_RenderData * self) {
char tc[12];
- int h, m, s, fps, cfa;
+ int h, m, s, cfa;
+ double fps;
- fps = self->renderContext->frs_sec;
+ fps = (double) self->renderContext->frs_sec /
+ self->renderContext->frs_sec_base;
cfa = self->renderContext->cfra-1;
s = cfa / fps;
m = s / 60;
@@ -1739,7 +1756,8 @@ static PyObject *RenderData_getTimeCode( BPy_RenderData * self) {
if( h > 99 )
return PyString_FromString("Time Greater than 99 Hours!");
- sprintf( tc, "%02d:%02d:%02d:%02d", h%60, m%60, s%60, cfa%fps);
+ sprintf( tc, "%02d:%02d:%02d:%02d", h%60, m%60, s%60,
+ (int) (cfa - ((int) (cfa / fps) * fps)));
return PyString_FromString(tc);
}
@@ -1762,6 +1780,9 @@ static PyObject *RenderData_getFloatAttr( BPy_RenderData *self, void *type )
case EXPP_RENDER_ATTR_MBLURFACTOR:
param = self->renderContext->blurfac;
break;
+ case EXPP_RENDER_ATTR_FPS_BASE:
+ param = self->renderContext->frs_sec_base;
+ break;
default:
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"undefined type constant in RenderData_getFloatAttr" );
@@ -1790,6 +1811,11 @@ static int RenderData_setFloatAttrClamp( BPy_RenderData *self, PyObject *value,
max = 5.0f;
param = &self->renderContext->blurfac;
break;
+ case EXPP_RENDER_ATTR_FPS_BASE:
+ min = 1.0f;
+ max = 120.0f;
+ param = &self->renderContext->frs_sec_base;
+ break;
default:
return EXPP_ReturnIntError( PyExc_RuntimeError,
"undefined type constant in RenderData_setFloatAttrClamp" );
@@ -1951,7 +1977,7 @@ static int RenderData_setMode( BPy_RenderData* self, PyObject *arg )
{
int value;
- if( !PyInt_CheckExact( arg ) )
+ if( !PyInt_Check( arg ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument" );
@@ -1987,7 +2013,7 @@ static int RenderData_setSceMode( BPy_RenderData* self, PyObject *arg )
{
int value;
- if( !PyInt_CheckExact( arg ) )
+ if( !PyInt_Check( arg ) )
return EXPP_ReturnIntError( PyExc_TypeError,
"expected int argument" );
@@ -2102,7 +2128,7 @@ static int RenderData_setImagePlanes( BPy_RenderData *self, PyObject *value )
int depth;
char *errstr = "expected int argument of 8, 24, or 32";
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
depth = PyInt_AsLong( value );
@@ -2227,7 +2253,7 @@ static int RenderData_setRenderWinSize( BPy_RenderData *self, PyObject *value )
int size;
char *errstr = "expected int argument of 25, 50, 75, or 100";
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError, errstr );
size = PyInt_AsLong( value );
@@ -2319,7 +2345,7 @@ static int RenderData_setThreads( BPy_RenderData *self, PyObject *value )
{
int threads;
- if( !PyInt_CheckExact( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError, "Error, threads must be an int" );
threads = PyInt_AsLong( value );
@@ -2540,6 +2566,10 @@ static PyGetSetDef BPy_RenderData_getseters[] = {
(getter)RenderData_getIValueAttr, (setter)RenderData_setIValueAttrClamp,
"Frames per second",
(void *)EXPP_RENDER_ATTR_FPS},
+ {"fps_base",
+ (getter)RenderData_getFloatAttr, (setter)RenderData_setFloatAttrClamp,
+ "Frames per second base",
+ (void *)EXPP_RENDER_ATTR_FPS_BASE},
{"sizeX",
(getter)RenderData_getIValueAttr, (setter)RenderData_setIValueAttrClamp,
"Image width (in pixels)",
diff --git a/source/blender/python/api2_2x/sceneSequence.c b/source/blender/python/api2_2x/sceneSequence.c
index e7c8abe72a2..fee1bde149c 100644
--- a/source/blender/python/api2_2x/sceneSequence.c
+++ b/source/blender/python/api2_2x/sceneSequence.c
@@ -57,7 +57,9 @@ enum seq_consts {
EXPP_SEQ_ATTR_LENGTH,
EXPP_SEQ_ATTR_START,
EXPP_SEQ_ATTR_STARTOFS,
- EXPP_SEQ_ATTR_ENDOFS
+ EXPP_SEQ_ATTR_ENDOFS,
+ EXPP_SEQ_ATTR_STARTSTILL,
+ EXPP_SEQ_ATTR_ENDSTILL
};
@@ -154,7 +156,6 @@ static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
for(a=0; a<seq->len; a++) {
name = PyString_AsString(PyList_GetItem( list, a ));
strncpy(se->name, name, FILE_MAXFILE-1);
- se->ok= 1;
se++;
}
@@ -167,7 +168,7 @@ static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
seq->type= SEQ_RAM_SOUND;
seq->sound = sound;
- totframe= (int) ( ((float)(sound->streamlen-1)/( (float)sce->audio.mixrate*4.0 ))* (float)sce->r.frs_sec);
+ totframe= (int) ( ((float)(sound->streamlen-1)/( (float)sce->audio.mixrate*4.0 ))* (float)sce->r.frs_sec / sce->r.frs_sec_base);
sound->flags |= SOUND_FLAGS_SEQUENCE;
@@ -177,16 +178,10 @@ static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
strip->len= totframe;
strip->us= 1;
strncpy(strip->dir, sound->name, FILE_MAXDIR-1);
- strip->stripdata= se= MEM_callocN(totframe*sizeof(StripElem), "stripelem");
+ strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
/* name sound in first strip */
strncpy(se->name, sound->name, FILE_MAXFILE-1);
-
- for(a=1; a<=totframe; a++, se++) {
- se->ok= 2; /* why? */
- se->ibuf= 0;
- se->nr= a;
- }
} else if (BPy_Scene_Check(py_data)) {
/* scene */
@@ -203,8 +198,6 @@ static PyObject *NewSeq_internal(ListBase *seqbase, PyObject * args, Scene *sce)
sizeof(seq->name) - 2);
strip->len= seq->len;
strip->us= 1;
- if(seq->len>0) strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
-
} else {
/* movie, pydata is a path to a movie file */
char *name = PyString_AsString ( py_data );
@@ -568,6 +561,12 @@ static PyObject *getIntAttr( BPy_Sequence *self, void *type )
case EXPP_SEQ_ATTR_ENDOFS:
param = seq->endofs;
break;
+ case EXPP_SEQ_ATTR_STARTSTILL:
+ param = seq->startstill;
+ break;
+ case EXPP_SEQ_ATTR_ENDSTILL:
+ param = seq->endstill;
+ break;
default:
return EXPP_ReturnPyObjError( PyExc_RuntimeError,
"undefined type in getFloatAttr" );
@@ -576,12 +575,10 @@ static PyObject *getIntAttr( BPy_Sequence *self, void *type )
return PyInt_FromLong( param );
}
-
/* internal functions for recursivly updating metastrip locatons */
static void intern_pos_update(Sequence * seq) {
/* update startdisp and enddisp */
- seq->startdisp = seq->start + seq->startofs - seq->startstill;
- seq->enddisp = ((seq->start + seq->len) - seq->endofs )+ seq->endstill;
+ calc_sequence_disp(seq);
}
void intern_recursive_pos_update(Sequence * seq, int offset) {
@@ -601,7 +598,7 @@ static int setIntAttrClamp( BPy_Sequence *self, PyObject *value, void *type )
struct Sequence *seq= self->seq;
int number, origval=0;
- if( !PyInt_CheckExact ( value ) )
+ if( !PyInt_Check( value ) )
return EXPP_ReturnIntError( PyExc_TypeError, "expected an int value" );
number = PyInt_AS_LONG( value );
@@ -621,9 +618,10 @@ static int setIntAttrClamp( BPy_Sequence *self, PyObject *value, void *type )
break;
case EXPP_SEQ_ATTR_STARTOFS:
- CLAMP(number, 0, seq->len - seq->endofs);
+ if (self->seq->type == SEQ_EFFECT)
return EXPP_ReturnIntError( PyExc_RuntimeError,
"This property dosnt apply to an effect" );
+ CLAMP(number, 0, seq->len - seq->endofs);
seq->startofs = number;
break;
case EXPP_SEQ_ATTR_ENDOFS:
@@ -633,7 +631,28 @@ static int setIntAttrClamp( BPy_Sequence *self, PyObject *value, void *type )
CLAMP(number, 0, seq->len - seq->startofs);
seq->endofs = number;
break;
-
+ case EXPP_SEQ_ATTR_STARTSTILL:
+ if (self->seq->type == SEQ_EFFECT)
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "This property dosnt apply to an effect" );
+ CLAMP(number, 1, MAXFRAME);
+ seq->startstill = number;
+ break;
+ case EXPP_SEQ_ATTR_ENDSTILL:
+ if (self->seq->type == SEQ_EFFECT)
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "This property dosnt apply to an effect" );
+ CLAMP(number, seq->startstill+1, MAXFRAME);
+ seq->endstill = number;
+ break;
+ case EXPP_SEQ_ATTR_LENGTH:
+ if (self->seq->type == SEQ_EFFECT)
+ return EXPP_ReturnIntError( PyExc_RuntimeError,
+ "cannot set the length of an effect directly" );
+ CLAMP(number, 1, MAXFRAME);
+ origval = seq->len;
+ seq->start = number;
+ break;
default:
return EXPP_ReturnIntError( PyExc_RuntimeError,
"undefined type in setFloatAttrClamp" );
@@ -664,11 +683,15 @@ static PyObject *getFlagAttr( BPy_Sequence *self, void *type )
static int setFlagAttr( BPy_Sequence *self, PyObject *value, void *type )
{
int t = (int)type;
+ int param = PyObject_IsTrue( value );
+
+ if( param == -1 )
+ return EXPP_ReturnIntError( PyExc_TypeError,
+ "expected True/False or 0/1" );
- if (PyObject_IsTrue(value))
+ if (param)
self->seq->flag |= t;
else {
-
/* dont allow leftsel and rightsel when its not selected */
if (t == SELECT)
t = t + SEQ_LEFTSEL + SEQ_RIGHTSEL;
@@ -730,7 +753,15 @@ static PyGetSetDef BPy_Sequence_getseters[] = {
(getter)getIntAttr, (setter)setIntAttrClamp,
"",
(void *) EXPP_SEQ_ATTR_ENDOFS},
-
+ {"startStill",
+ (getter)getIntAttr, (setter)setIntAttrClamp,
+ "",
+ (void *) EXPP_SEQ_ATTR_STARTSTILL},
+ {"endStill",
+ (getter)getIntAttr, (setter)setIntAttrClamp,
+ "",
+ (void *) EXPP_SEQ_ATTR_ENDSTILL},
+
{"sel",
(getter)getFlagAttr, (setter)setFlagAttr,
"Sequence audio mute option",
diff --git a/source/blender/python/api2_2x/sceneSequence.h b/source/blender/python/api2_2x/sceneSequence.h
index 49890043966..952e861f46d 100644
--- a/source/blender/python/api2_2x/sceneSequence.h
+++ b/source/blender/python/api2_2x/sceneSequence.h
@@ -41,7 +41,7 @@ extern PyTypeObject Sequence_Type;
extern PyTypeObject SceneSeq_Type;
#define BPy_Sequence_Check(v) ((v)->ob_type == &Sequence_Type)
-#define BPy_SceneSeq_Check(v) ((v)->ob_type == &Sequence_Type)
+#define BPy_SceneSeq_Check(v) ((v)->ob_type == &SceneSeq_Type)
/*****************************************************************************/
diff --git a/source/blender/python/api2_2x/vector.c b/source/blender/python/api2_2x/vector.c
index 64ff035fa1f..2e13122f09f 100644
--- a/source/blender/python/api2_2x/vector.c
+++ b/source/blender/python/api2_2x/vector.c
@@ -359,6 +359,7 @@ static PyObject *Vector_slice(VectorObject * self, int begin, int end)
int count;
CLAMP(begin, 0, self->size);
+ if (end<0) end= self->size+end+1;
CLAMP(end, 0, self->size);
begin = MIN2(begin,end);
@@ -380,6 +381,7 @@ static int Vector_ass_slice(VectorObject * self, int begin, int end,
PyObject *v;
CLAMP(begin, 0, self->size);
+ if (end<0) end= self->size+end+1;
CLAMP(end, 0, self->size);
begin = MIN2(begin,end);
diff --git a/source/blender/python/api2_2x/windowTheme.c b/source/blender/python/api2_2x/windowTheme.c
index c8adec8e7a3..6a27d59436e 100644
--- a/source/blender/python/api2_2x/windowTheme.c
+++ b/source/blender/python/api2_2x/windowTheme.c
@@ -172,6 +172,7 @@ static PyObject *ThemeSpace_getAttr( BPy_ThemeSpace * self, char *name )
ELSEIF_TSP_RGBA( edge_select )
ELSEIF_TSP_RGBA( edge_seam )
ELSEIF_TSP_RGBA( edge_sharp )
+ ELSEIF_TSP_RGBA( editmesh_active )
ELSEIF_TSP_RGBA( edge_facesel )
ELSEIF_TSP_RGBA( face )
ELSEIF_TSP_RGBA( face_select )
@@ -199,13 +200,13 @@ static PyObject *ThemeSpace_getAttr( BPy_ThemeSpace * self, char *name )
else if( !strcmp( name, "facedot_size" ) )
attrib = Py_BuildValue( "i", tsp->facedot_size );
else if( !strcmp( name, "__members__" ) )
- attrib = Py_BuildValue("[sssssssssssssssssssssssssssssssssssssssssssssss]", "theme",
+ attrib = Py_BuildValue("[ssssssssssssssssssssssssssssssssssssssssssssssss]", "theme",
"back", "text", "text_hi", "header",
"panel", "shade1", "shade2", "hilite",
"grid", "wire", "select", "lamp", "active",
"group", "group_active",
"transform", "vertex", "vertex_select",
- "edge", "edge_select", "edge_seam", "edge_sharp",
+ "edge", "edge_select", "edge_seam", "edge_sharp", "editmesh_active",
"edge_facesel", "face", "face_select",
"face_dot", "normal", "bone_solid", "bone_pose",
"strip", "strip_select",
@@ -807,15 +808,10 @@ static void Theme_dealloc( BPy_Theme * self )
static PyObject *Theme_getAttr( BPy_Theme * self, char *name )
{
- PyObject *attr = Py_None;
-
if( !strcmp( name, "name" ) )
- attr = PyString_FromString( self->theme->name );
+ return PyString_FromString( self->theme->name );
else if( !strcmp( name, "__members__" ) )
- attr = Py_BuildValue( "[s]", "name" );
-
- if( attr != Py_None )
- return attr;
+ return Py_BuildValue( "[s]", "name" );
return Py_FindMethod( BPy_Theme_methods, ( PyObject * ) self, name );
}
diff --git a/source/blender/quicktime/apple/quicktime_export.c b/source/blender/quicktime/apple/quicktime_export.c
index 7d6d3f32f14..d6c4d33a82f 100644
--- a/source/blender/quicktime/apple/quicktime_export.c
+++ b/source/blender/quicktime/apple/quicktime_export.c
@@ -566,20 +566,21 @@ static void check_renderbutton_framerate(void) {
(qtdata->gTemporalSettings.frameRate == 1571553 ||
qtdata->gTemporalSettings.frameRate == 1964113 ||
qtdata->gTemporalSettings.frameRate == 3928227)) {;} else
- qtdata->gTemporalSettings.frameRate = G.scene->r.frs_sec << 16;
+ qtdata->gTemporalSettings.frameRate =
+ (G.scene->r.frs_sec << 16) / G.scene->r.frs_sec_base ;
err = SCSetInfo(qtdata->theComponent, scTemporalSettingsType, &qtdata->gTemporalSettings);
CheckError( err, "SCSetInfo error" );
if(qtdata->gTemporalSettings.frameRate == 1571553) { // 23.98 fps
- qtdata->kVideoTimeScale = 2398;
- qtdata->duration = 100;
+ qtdata->kVideoTimeScale = 2400;
+ qtdata->duration = 1001;
} else if (qtdata->gTemporalSettings.frameRate == 1964113) { // 29.97 fps
- qtdata->kVideoTimeScale = 2997;
- qtdata->duration = 100;
+ qtdata->kVideoTimeScale = 3000;
+ qtdata->duration = 1001;
} else if (qtdata->gTemporalSettings.frameRate == 3928227) { // 59.94 fps
- qtdata->kVideoTimeScale = 5994;
- qtdata->duration = 100;
+ qtdata->kVideoTimeScale = 6000;
+ qtdata->duration = 1001;
} else {
qtdata->kVideoTimeScale = (qtdata->gTemporalSettings.frameRate >> 16) * 100;
qtdata->duration = 100;
@@ -641,25 +642,37 @@ int get_qtcodec_settings(void)
// framerate jugglin'
if(qtdata->gTemporalSettings.frameRate == 1571553) { // 23.98 fps
- qtdata->kVideoTimeScale = 2398;
- qtdata->duration = 100;
+ qtdata->kVideoTimeScale = 24000;
+ qtdata->duration = 1001;
G.scene->r.frs_sec = 24;
+ G.scene->r.frs_sec_base = 1.001;
} else if (qtdata->gTemporalSettings.frameRate == 1964113) { // 29.97 fps
- qtdata->kVideoTimeScale = 2997;
- qtdata->duration = 100;
+ qtdata->kVideoTimeScale = 3000;
+ qtdata->duration = 1001;
G.scene->r.frs_sec = 30;
+ G.scene->r.frs_sec_base = 1.001;
} else if (qtdata->gTemporalSettings.frameRate == 3928227) { // 59.94 fps
- qtdata->kVideoTimeScale = 5994;
- qtdata->duration = 100;
+ qtdata->kVideoTimeScale = 6000;
+ qtdata->duration = 1001;
G.scene->r.frs_sec = 60;
+ G.scene->r.frs_sec_base = 1.001;
} else {
+ double fps = qtdata->gTemporalSettings.frameRate;
+
qtdata->kVideoTimeScale = 600;
qtdata->duration = qtdata->kVideoTimeScale / (qtdata->gTemporalSettings.frameRate / 65536);
- G.scene->r.frs_sec = (qtdata->gTemporalSettings.frameRate / 65536);
+ if ((qtdata->gTemporalSettings.frameRate & 0xffff) == 0) {
+ G.scene->r.frs_sec = fps / 65536;
+ G.scene->r.frs_sec_base = 1;
+ } else {
+ /* we do our very best... */
+ G.scene->r.frs_sec = (fps * 10000 / 65536);
+ G.scene->r.frs_sec_base = 10000;
+ }
}
return 1;
diff --git a/source/blender/quicktime/apple/quicktime_import.c b/source/blender/quicktime/apple/quicktime_import.c
index c701d4d41d0..862b20b5260 100644
--- a/source/blender/quicktime/apple/quicktime_import.c
+++ b/source/blender/quicktime/apple/quicktime_import.c
@@ -244,6 +244,7 @@ static OSErr QT_get_frameIndexes(struct anim *anim)
TimeValue nextTime = 0;
TimeValue startPoint;
TimeValue tmpstartPoint;
+ long sampleCount = 0;
startPoint = -1;
@@ -254,12 +255,12 @@ static OSErr QT_get_frameIndexes(struct anim *anim)
anim->qtime->framecount = 0;
- while(tmpstartPoint != -1) {
- nextTime = 0;
- GetMovieNextInterestingTime(anim->qtime->movie, nextTimeMediaSample, 1, &media, tmpstartPoint, 0, &nextTime, NULL);
- tmpstartPoint = nextTime;
- anim->qtime->framecount ++;
- }
+ sampleCount = GetMediaSampleCount(anim->qtime->theMedia);
+ anErr = GetMoviesError();
+ if (anErr != noErr) return anErr;
+
+ anim->qtime->framecount = sampleCount;
+
anim->qtime->frameIndex = (TimeValue *) MEM_callocN(sizeof(TimeValue) * anim->qtime->framecount, "qtframeindex");
//rewind
@@ -403,6 +404,7 @@ int startquicktime (struct anim *anim)
char *qtname;
Str255 dst;
#endif
+ short depth = 0;
anim->qtime = MEM_callocN (sizeof(QuicktimeMovie),"animqt");
anim->qtime->have_gw = FALSE;
@@ -483,6 +485,9 @@ int startquicktime (struct anim *anim)
anim->qtime->offscreenGWorld,
GetGWorldDevice(anim->qtime->offscreenGWorld));
SetMoviePlayHints(anim->qtime->movie, hintsHighQuality, hintsHighQuality);
+
+ // sets Media and Track!
+ depth = GetFirstVideoTrackPixelDepth(anim);
QT_get_frameIndexes(anim);
}
@@ -491,7 +496,7 @@ int startquicktime (struct anim *anim)
LockPixels(anim->qtime->offscreenPixMap);
//fill blender's anim struct
- anim->qtime->depth = GetFirstVideoTrackPixelDepth(anim);
+ anim->qtime->depth = depth;
anim->duration = anim->qtime->framecount;
anim->params = 0;
diff --git a/source/blender/radiosity/intern/source/Makefile b/source/blender/radiosity/intern/source/Makefile
index 54a3af8e098..7791866eeaa 100644
--- a/source/blender/radiosity/intern/source/Makefile
+++ b/source/blender/radiosity/intern/source/Makefile
@@ -37,10 +37,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I$(OPENGL_HEADERS)
diff --git a/source/blender/readblenfile/intern/Makefile b/source/blender/readblenfile/intern/Makefile
index 6c6683eb07d..fa9875b8403 100644
--- a/source/blender/readblenfile/intern/Makefile
+++ b/source/blender/readblenfile/intern/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_2_C_WARNINGS)
# path to our own external headerfiles
diff --git a/source/blender/readblenfile/stub/Makefile b/source/blender/readblenfile/stub/Makefile
index c5a9570522f..ed96e56b8af 100644
--- a/source/blender/readblenfile/stub/Makefile
+++ b/source/blender/readblenfile/stub/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_2_C_WARNINGS)
CFLAGS += $(FIX_STUBS_WARNINGS)
diff --git a/source/blender/readblenfile/test/Makefile b/source/blender/readblenfile/test/Makefile
index 2d7b7c7fff8..235abad36b5 100644
--- a/source/blender/readblenfile/test/Makefile
+++ b/source/blender/readblenfile/test/Makefile
@@ -37,10 +37,6 @@ ALLTARGETS = $(OBJS) $(DIR)/$(DEBUG_DIR)test$(EXT)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_2_C_WARNINGS)
# path to our own external headerfiles
diff --git a/source/blender/render/extern/include/RE_raytrace.h b/source/blender/render/extern/include/RE_raytrace.h
new file mode 100644
index 00000000000..095ffcf0c18
--- /dev/null
+++ b/source/blender/render/extern/include/RE_raytrace.h
@@ -0,0 +1,90 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ * RE_raytrace.h: ray tracing api, can be used independently from the renderer.
+ */
+
+#ifndef RE_RAYTRACE_H
+#define RE_RAYTRACE_H
+
+/* ray types */
+#define RE_RAY_SHADOW 0
+#define RE_RAY_MIRROR 1
+#define RE_RAY_SHADOW_TRA 2
+
+/* spatial tree for raytracing acceleration */
+typedef void RayTree;
+/* abstraction of face type */
+typedef void RayFace;
+
+/* struct for intersection data */
+typedef struct Isect {
+ float start[3]; /* start+vec = end, in ray_tree_intersect */
+ float vec[3];
+ float end[3];
+
+ float labda, u, v; /* distance to hitpoint, uv weights */
+
+ RayFace *face; /* face is where to intersect with */
+ RayFace *faceorig; /* start face */
+ RayFace *face_last; /* for shadow optimize, last intersected face */
+
+ short isect; /* which half of quad */
+ short mode; /* RE_RAYSHADOW, RE_RAYMIRROR, RE_RAYSHADOW_TRA */
+ int lay; /* -1 default, set for layer lamps */
+
+ /* only used externally */
+ float col[4]; /* RGBA for shadow_tra */
+
+ /* octree only */
+ RayFace *facecontr;
+ float ddalabda;
+ short faceisect; /* flag if facecontr was done or not */
+} Isect;
+
+/* function callbacks for face type abstraction */
+typedef void (*RayCoordsFunc)(RayFace *face,
+ float **v1, float **v2, float **v3, float **v4);
+typedef int (*RayCheckFunc)(Isect *is, RayFace *face);
+
+/* tree building and freeing */
+RayTree *RE_ray_tree_create(int ocres, int totface, float *min, float *max,
+ RayCoordsFunc coordfunc, RayCheckFunc checkfunc);
+void RE_ray_tree_add_face(RayTree *tree, RayFace *face);
+void RE_ray_tree_done(RayTree *tree);
+void RE_ray_tree_free(RayTree *tree);
+
+/* intersection with full tree and single face */
+int RE_ray_tree_intersect(RayTree *tree, Isect *is);
+int RE_ray_face_intersection(Isect *is, RayCoordsFunc coordsfunc);
+
+/* retrieve the diameter of the tree structure, for setting intersection
+ end distance */
+float RE_ray_tree_max_size(RayTree *tree);
+
+#endif /*__RE_RAYTRACE_H__*/
+
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h
index 910be84b795..e61de5bc3e6 100644
--- a/source/blender/render/extern/include/RE_render_ext.h
+++ b/source/blender/render/extern/include/RE_render_ext.h
@@ -46,9 +46,13 @@ struct ImBuf;
void RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_totelem, struct Render *re);
-/* effect.c, editmesh_modes.c and brush.c, returns 1 if rgb, 0 otherwise */
+/* particle.c, effect.c, editmesh_modes.c and brush.c, returns 1 if rgb, 0 otherwise */
int externtex(struct MTex *mtex, float *vec, float *tin, float *tr, float *tg, float *tb, float *ta);
+/* particle.c */
+void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg, int blendtype);
+float texture_value_blend(float tex, float out, float fact, float facg, int blendtype, int flip);
+
/* node_composite.c */
void ibuf_sample(struct ImBuf *ibuf, float fx, float fy, float dx, float dy, float *result);
void antialias_tagbuf(int xsize, int ysize, char *rectmove);
diff --git a/source/blender/render/extern/include/RE_shader_ext.h b/source/blender/render/extern/include/RE_shader_ext.h
index 364535736ae..052e104ee62 100644
--- a/source/blender/render/extern/include/RE_shader_ext.h
+++ b/source/blender/render/extern/include/RE_shader_ext.h
@@ -124,7 +124,7 @@ typedef struct ShadeInput
float layerfac;
/* texture coordinates */
- float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[3], rad[3];
+ float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[4], rad[3];
float refcol[4], displace[3];
float strand, tang[3], stress, winspeed[4];
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 45aff8e8b60..abcdf417b62 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -32,6 +32,7 @@
/* exposed internal in render module only! */
/* ------------------------------------------------------------------------- */
+#include "DNA_color_types.h"
#include "DNA_scene_types.h"
#include "DNA_world_types.h"
#include "DNA_object_types.h"
@@ -46,7 +47,6 @@ struct Object;
struct MemArena;
struct VertTableNode;
struct VlakTableNode;
-struct Octree;
struct GHash;
#define TABLEINITSIZE 1024
@@ -60,6 +60,18 @@ typedef struct SampleTables
} SampleTables;
+typedef struct QMCSampler
+{
+ int type;
+ int tot;
+ double *samp2d;
+ double offs[BLENDER_MAX_THREADS][2];
+} QMCSampler;
+
+#define SAMP_TYPE_JITTERED 0
+#define SAMP_TYPE_HALTON 1
+#define SAMP_TYPE_HAMMERSLEY 2
+
/* this is handed over to threaded hiding/passes/shading engine */
typedef struct RenderPart
{
@@ -84,16 +96,6 @@ typedef struct RenderPart
char *clipflag; /* clipflags for part zbuffering */
} RenderPart;
-typedef struct Octree {
- struct Branch **adrbranch;
- struct Node **adrnode;
- float ocsize; /* ocsize: mult factor, max size octree */
- float ocfacx,ocfacy,ocfacz;
- float min[3], max[3];
- int ocres;
- int branchcount, nodecount;
-} Octree;
-
/* controls state of render, everything that's read-only during render stage */
struct Render
{
@@ -141,6 +143,7 @@ struct Render
/* samples */
SampleTables *samples;
float jit[32][2];
+ QMCSampler *qsa;
/* scene, and its full copy of renderdata and world */
Scene *scene;
@@ -150,7 +153,7 @@ struct Render
ListBase parts;
/* octree tables and variables for raytrace */
- Octree oc;
+ void *raytree;
/* use this instead of R.r.cfra */
float cfra;
@@ -322,7 +325,10 @@ typedef struct LampRen {
float vec[3];
float xsp, ysp, distkw, inpr;
float halokw, halo;
+
+ short falloff_type;
float ld1,ld2;
+ struct CurveMapping *curfalloff;
/* copied from Lamp, to decouple more rendering stuff */
/** Size of the shadowbuffer */
@@ -346,12 +352,14 @@ typedef struct LampRen {
/** A small depth offset to prevent self-shadowing. */
float bias;
- short ray_samp, ray_sampy, ray_sampz, ray_samp_type, area_shape, ray_totsamp;
+ short ray_samp, ray_sampy, ray_sampz, ray_samp_method, ray_samp_type, area_shape, ray_totsamp;
short xold[BLENDER_MAX_THREADS], yold[BLENDER_MAX_THREADS]; /* last jitter table for area lights */
float area_size, area_sizey, area_sizez;
-
+ float adapt_thresh;
+
struct ShadBuf *shb;
float *jitter;
+ QMCSampler *qsa;
float imat[3][3];
float spottexfac;
@@ -362,7 +370,7 @@ typedef struct LampRen {
/* passes & node shader support: all shadow info for a pixel */
LampShadowSample *shadsamp;
-
+
/* yafray: photonlight params */
int YF_numphotons, YF_numsearch;
short YF_phdepth, YF_useqmc, YF_bufsize;
diff --git a/source/blender/render/intern/include/rendercore.h b/source/blender/render/intern/include/rendercore.h
index 651fd423e5d..0d807d56180 100644
--- a/source/blender/render/intern/include/rendercore.h
+++ b/source/blender/render/intern/include/rendercore.h
@@ -91,14 +91,18 @@ void zbufshade_sss_tile(struct RenderPart *pa);
/* -------- ray.c ------- */
-extern void freeoctree(Render *re);
-extern void makeoctree(Render *re);
+extern void freeraytree(Render *re);
+extern void makeraytree(Render *re);
extern void ray_shadow(ShadeInput *, LampRen *, float *);
extern void ray_trace(ShadeInput *, ShadeResult *);
extern void ray_ao(ShadeInput *, float *);
extern void init_jitter_plane(LampRen *lar);
extern void init_ao_sphere(struct World *wrld);
+extern void init_lamp_hammersley(LampRen *lar);
+extern void free_lamp_qmcsampler(LampRen *lar);
+extern void init_render_hammersley(Render *re);
+extern void free_render_qmcsampler(Render *re);
#endif /* RENDER_EXT_H */
diff --git a/source/blender/render/intern/include/renderdatabase.h b/source/blender/render/intern/include/renderdatabase.h
index 75aea05fee2..dc70ade25ae 100644
--- a/source/blender/render/intern/include/renderdatabase.h
+++ b/source/blender/render/intern/include/renderdatabase.h
@@ -84,6 +84,8 @@ struct VertRen *RE_findOrAddVert(struct Render *re, int nr);
struct HaloRen *RE_findOrAddHalo(struct Render *re, int nr);
struct HaloRen *RE_inithalo(struct Render *re, struct Material *ma, float *vec, float *vec1, float *orco, float hasize,
float vectsize, int seed);
+struct HaloRen *RE_inithalo_particle(struct Render *re, struct DerivedMesh *dm, struct Material *ma, float *vec, float *vec1,
+ float *orco, float *uvco, float hasize, float vectsize, int seed);
void RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int sve, int eve, int sfa, int efa);
float *RE_vertren_get_sticky(struct Render *re, struct VertRen *ver, int verify);
diff --git a/source/blender/render/intern/source/Makefile b/source/blender/render/intern/source/Makefile
index f9b3dfc482a..95835f212e8 100644
--- a/source/blender/render/intern/source/Makefile
+++ b/source/blender/render/intern/source/Makefile
@@ -36,11 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
- CCFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
# first /include is my own includes, second is the external interface.
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index cdeddca5216..87853be6234 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -54,9 +54,11 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "DNA_meta_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
#include "DNA_object_fluidsim.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_texture_types.h"
#include "DNA_view3d_types.h"
@@ -66,6 +68,7 @@
#include "BKE_action.h"
#include "BKE_curve.h"
#include "BKE_customdata.h"
+#include "BKE_colortools.h"
#include "BKE_constraint.h"
#include "BKE_displist.h"
#include "BKE_deform.h"
@@ -82,8 +85,10 @@
#include "BKE_main.h"
#include "BKE_mball.h"
#include "BKE_mesh.h"
+#include "BKE_modifier.h"
#include "BKE_node.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_scene.h"
#include "BKE_subsurf.h"
#include "BKE_texture.h"
@@ -124,6 +129,7 @@
/* ------------------------------------------------------------------------- */
static short test_for_displace(Render *re, Object *ob);
static void do_displacement(Render *re, Object *ob, int startface, int numface, int startvert, int numvert );
+static int vlakren_customdata_layer_num(int n, int active);
/* 10 times larger than normal epsilon, test it on default nurbs sphere with ray_transp (for quad detection) */
/* or for checking vertex normal flips */
@@ -1116,7 +1122,7 @@ static void render_particle_system(Render *re, Object *ob, Object *par, PartEff
if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= ob->sf;
else ptime= 0.0;
- ctime= bsystem_time(ob, 0, (float)re->scene->r.cfra, ptime);
+ ctime= bsystem_time(ob, (float)re->scene->r.cfra, ptime);
seed= ma->seed1;
for(a=0; a<paf->totpart; a++, pa+=paf->totkey, seed++) {
@@ -1216,26 +1222,33 @@ static void render_particle_system(Render *re, Object *ob, Object *par, PartEff
if(useFluidsimParticles) { ma->alpha = iniAlpha; }// FSPARTICLE restore...
}
-
/* ------------------------------------------------------------------------- */
/* future thread problem... */
-static void static_particle_strand(Render *re, Object *ob, Material *ma, float *orco, float *vec, float *vec1, float ctime, int first)
+static void static_particle_strand(Render *re, Object *ob, Material *ma, float *orco, float *uvco, int totuv,
+ float *vec, float *vec1, float ctime, int first, int line,
+ int adapt, float adapt_angle, float adapt_pix, int override_uv)
{
static VertRen *v1= NULL, *v2= NULL;
VlakRen *vlr;
float nor[3], cross[3], w, dx, dy, width;
- int flag;
+ static float anor[3], avec[3];
+ int flag, i;
+ static int second=0;
VecSubf(nor, vec, vec1);
Normalize(nor); // nor needed as tangent
Crossf(cross, vec, nor);
-
+
+ if(ma->mode&MA_STR_B_UNITS)
+ Normalize(cross);
+
/* turn cross in pixelsize */
w= vec[2]*re->winmat[2][3] + re->winmat[3][3];
dx= re->winx*cross[0]*re->winmat[0][0]/w;
dy= re->winy*cross[1]*re->winmat[1][1]/w;
w= sqrt(dx*dx + dy*dy);
+
if(w!=0.0f) {
float fac;
if(ma->strand_ease!=0.0f) {
@@ -1245,8 +1258,19 @@ static void static_particle_strand(Render *re, Object *ob, Material *ma, float *
fac= pow(ctime, 1.0/(1.0f-ma->strand_ease));
}
else fac= ctime;
-
- width= ((1.0f-fac)*ma->strand_sta + (fac)*ma->strand_end)/w;
+
+ width= ((1.0f-fac)*ma->strand_sta + (fac)*ma->strand_end);
+
+ /* use actual Blender units for strand width and fall back to min 1px */
+ if(ma->mode & MA_STR_B_UNITS){
+ if(width < 1.0f/w)
+ width= 1.0f/w;
+ /*cross is the radius of the strand so we want it to be half of full width */
+ VecMulf(cross,0.5);
+ }
+ else
+ width/=w;
+
VecMulf(cross, width);
}
else width= 1.0f;
@@ -1260,8 +1284,75 @@ static void static_particle_strand(Render *re, Object *ob, Material *ma, float *
if(ma->strand_sta==1.0f)
flag |= R_STRAND;
- /* first two vertices */
- if(first) {
+ /* single face line */
+ if(line) {
+ vlr= RE_findOrAddVlak(re, re->totvlak++);
+ vlr->flag= flag;
+ vlr->ob= ob;
+ vlr->v1= RE_findOrAddVert(re, re->totvert++);
+ vlr->v2= RE_findOrAddVert(re, re->totvert++);
+ vlr->v3= RE_findOrAddVert(re, re->totvert++);
+ vlr->v4= RE_findOrAddVert(re, re->totvert++);
+
+ VECCOPY(vlr->v1->co, vec);
+ VecAddf(vlr->v1->co, vlr->v1->co, cross);
+ VECCOPY(vlr->v1->n, nor);
+ vlr->v1->orco= orco;
+ vlr->v1->accum= -1.0f; // accum abuse for strand texco
+
+ VECCOPY(vlr->v2->co, vec);
+ VecSubf(vlr->v2->co, vlr->v2->co, cross);
+ VECCOPY(vlr->v2->n, nor);
+ vlr->v2->orco= orco;
+ vlr->v2->accum= vlr->v1->accum;
+
+ VECCOPY(vlr->v4->co, vec1);
+ VecAddf(vlr->v4->co, vlr->v4->co, cross);
+ VECCOPY(vlr->v4->n, nor);
+ vlr->v4->orco= orco;
+ vlr->v4->accum= 1.0f; // accum abuse for strand texco
+
+ VECCOPY(vlr->v3->co, vec1);
+ VecSubf(vlr->v3->co, vlr->v3->co, cross);
+ VECCOPY(vlr->v3->n, nor);
+ vlr->v3->orco= orco;
+ vlr->v3->accum= vlr->v4->accum;
+
+ CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
+
+ vlr->mat= ma;
+ vlr->ec= ME_V2V3;
+ vlr->lay= ob->lay;
+
+ if(uvco){
+ for(i=0; i<totuv; i++){
+ MTFace *mtf;
+ mtf=RE_vlakren_get_tface(re,vlr,i,NULL,1);
+ mtf->uv[0][0]=mtf->uv[1][0]=
+ mtf->uv[2][0]=mtf->uv[3][0]=(uvco+2*i)[0];
+ mtf->uv[0][1]=mtf->uv[1][1]=
+ mtf->uv[2][1]=mtf->uv[3][1]=(uvco+2*i)[1];
+ }
+ if(override_uv>=0){
+ MTFace *mtf;
+ mtf=RE_vlakren_get_tface(re,vlr,override_uv,NULL,0);
+
+ mtf->uv[0][0]=mtf->uv[3][0]=0.0f;
+ mtf->uv[1][0]=mtf->uv[2][0]=1.0f;
+
+ mtf->uv[0][1]=mtf->uv[1][1]=0.0f;
+ mtf->uv[2][1]=mtf->uv[3][1]=1.0f;
+ }
+ }
+ }
+ /* first two vertices of a strand */
+ else if(first) {
+ if(adapt){
+ VECCOPY(anor, nor);
+ VECCOPY(avec, vec);
+ second=1;
+ }
+
v1= RE_findOrAddVert(re, re->totvert++);
v2= RE_findOrAddVert(re, re->totvert++);
@@ -1277,19 +1368,58 @@ static void static_particle_strand(Render *re, Object *ob, Material *ma, float *
v2->orco= orco;
v2->accum= v1->accum;
}
+ /* more vertices & faces to strand */
else {
-
- vlr= RE_findOrAddVlak(re, re->totvlak++);
- vlr->flag= flag;
- vlr->ob= ob;
- vlr->v1= v1;
- vlr->v2= v2;
- vlr->v3= RE_findOrAddVert(re, re->totvert++);
- vlr->v4= RE_findOrAddVert(re, re->totvert++);
-
- v1= vlr->v4; // cycle
- v2= vlr->v3; // cycle
-
+ if(adapt==0 || second){
+ vlr= RE_findOrAddVlak(re, re->totvlak++);
+ vlr->flag= flag;
+ vlr->ob= ob;
+ vlr->v1= v1;
+ vlr->v2= v2;
+ vlr->v3= RE_findOrAddVert(re, re->totvert++);
+ vlr->v4= RE_findOrAddVert(re, re->totvert++);
+
+ v1= vlr->v4; // cycle
+ v2= vlr->v3; // cycle
+
+
+ if(adapt){
+ second=0;
+ VECCOPY(anor,nor);
+ VECCOPY(avec,vec);
+ }
+
+ }
+ else if(adapt){
+ float dvec[3],pvec[3];
+ VecSubf(dvec,avec,vec);
+ Projf(pvec,dvec,vec);
+ VecSubf(dvec,dvec,pvec);
+
+ w= vec[2]*re->winmat[2][3] + re->winmat[3][3];
+ dx= re->winx*dvec[0]*re->winmat[0][0]/w;
+ dy= re->winy*dvec[1]*re->winmat[1][1]/w;
+ w= sqrt(dx*dx + dy*dy);
+ if(Inpf(anor,nor)<adapt_angle && w>adapt_pix){
+ vlr= RE_findOrAddVlak(re, re->totvlak++);
+ vlr->flag= flag;
+ vlr->ob= ob;
+ vlr->v1= v1;
+ vlr->v2= v2;
+ vlr->v3= RE_findOrAddVert(re, re->totvert++);
+ vlr->v4= RE_findOrAddVert(re, re->totvert++);
+
+ v1= vlr->v4; // cycle
+ v2= vlr->v3; // cycle
+
+ VECCOPY(anor,nor);
+ VECCOPY(avec,vec);
+ }
+ else{
+ vlr= RE_findOrAddVlak(re, re->totvlak-1);
+ }
+ }
+
VECCOPY(vlr->v4->co, vec);
VecAddf(vlr->v4->co, vlr->v4->co, cross);
VECCOPY(vlr->v4->n, nor);
@@ -1307,7 +1437,660 @@ static void static_particle_strand(Render *re, Object *ob, Material *ma, float *
vlr->mat= ma;
vlr->ec= ME_V2V3;
vlr->lay= ob->lay;
+
+ if(uvco){
+ for(i=0; i<totuv; i++){
+ MTFace *mtf;
+ mtf=RE_vlakren_get_tface(re,vlr,i,NULL,1);
+ mtf->uv[0][0]=mtf->uv[1][0]=
+ mtf->uv[2][0]=mtf->uv[3][0]=(uvco+2*i)[0];
+ mtf->uv[0][1]=mtf->uv[1][1]=
+ mtf->uv[2][1]=mtf->uv[3][1]=(uvco+2*i)[1];
+ }
+ if(override_uv>=0){
+ MTFace *mtf;
+ mtf=RE_vlakren_get_tface(re,vlr,override_uv,NULL,0);
+
+ mtf->uv[0][0]=mtf->uv[3][0]=0.0f;
+ mtf->uv[1][0]=mtf->uv[2][0]=1.0f;
+
+ mtf->uv[0][1]=mtf->uv[1][1]=(vlr->v1->accum+1.0f)/2.0f;
+ mtf->uv[2][1]=mtf->uv[3][1]=(vlr->v3->accum+1.0f)/2.0f;
+ }
+ }
+ }
+}
+
+static void static_particle_wire(Render *re, Object *ob, Material *ma, float *vec, float *vec1, int first, int line)
+{
+ VlakRen *vlr;
+ static VertRen *v1;
+
+ if(line) {
+ vlr= RE_findOrAddVlak(re, re->totvlak++);
+ vlr->ob= ob;
+ vlr->v1= RE_findOrAddVert(re, re->totvert++);
+ vlr->v2= RE_findOrAddVert(re, re->totvert++);
+ vlr->v3= vlr->v2;
+ vlr->v4= NULL;
+
+ VECCOPY(vlr->v1->co, vec);
+ VECCOPY(vlr->v2->co, vec1);
+
+ VecSubf(vlr->n, vec, vec1);
+ Normalize(vlr->n);
+ VECCOPY(vlr->v1->n, vlr->n);
+ VECCOPY(vlr->v2->n, vlr->n);
+
+ vlr->mat= ma;
+ vlr->ec= ME_V1V2;
+ vlr->lay= ob->lay;
+
+ }
+ else if(first) {
+ v1= RE_findOrAddVert(re, re->totvert++);
+ VECCOPY(v1->co, vec);
}
+ else {
+ vlr= RE_findOrAddVlak(re, re->totvlak++);
+ vlr->ob= ob;
+ vlr->v1= v1;
+ vlr->v2= RE_findOrAddVert(re, re->totvert++);
+ vlr->v3= vlr->v2;
+ vlr->v4= NULL;
+
+ v1= vlr->v2; // cycle
+ VECCOPY(v1->co, vec);
+
+ VecSubf(vlr->n, vec, vec1);
+ Normalize(vlr->n);
+ VECCOPY(v1->n, vlr->n);
+
+ vlr->mat= ma;
+ vlr->ec= ME_V1V2;
+ vlr->lay= ob->lay;
+ }
+
+}
+static void particle_billboard(Render *re, Object *ob, Material *ma, Object *bb_ob, float *vec, float *vel, float size, float tilt, short align,
+ int lock, int p, int totpart, short uv_split, short anim, short split_offset, float random, float pa_time, float offset[2], int uv[3])
+{
+ VlakRen *vlr;
+ MTFace *mtf;
+ float xvec[3]={1.0f,0.0f,0.0f}, yvec[3]={0.0f,1.0f,0.0f}, zvec[3];
+ float onevec[3]={0.0f,0.0f,0.0f}, tvec[3],tvec2[3], bb_center[3];
+ float uvx=0.0f, uvy=0.0f, uvdx=1.0f, uvdy=1.0f, time=0.0f;
+
+ if(align<PART_BB_VIEW)
+ onevec[align]=1.0f;
+
+ vlr= RE_findOrAddVlak(re, re->totvlak++);
+ vlr->ob= ob;
+ vlr->v1= RE_findOrAddVert(re, re->totvert++);
+ vlr->v2= RE_findOrAddVert(re, re->totvert++);
+ vlr->v3= RE_findOrAddVert(re, re->totvert++);
+ vlr->v4= RE_findOrAddVert(re, re->totvert++);
+
+ if(lock && align==PART_BB_VIEW){
+ VECCOPY(xvec,bb_ob->obmat[0]);
+ Normalize(xvec);
+ VECCOPY(yvec,bb_ob->obmat[1]);
+ Normalize(yvec);
+ VECCOPY(zvec,bb_ob->obmat[2]);
+ Normalize(zvec);
+ }
+ else if(align==PART_BB_VEL){
+ float temp[3];
+ VECCOPY(temp,vel);
+ Normalize(temp);
+ VECSUB(zvec,bb_ob->obmat[3],vec);
+ if(lock){
+ float fac=-Inpf(zvec,temp);
+ VECADDFAC(zvec,zvec,temp,fac);
+ }
+ Normalize(zvec);
+ Crossf(xvec,temp,zvec);
+ Normalize(xvec);
+ Crossf(yvec,zvec,xvec);
+ }
+ else{
+ VECSUB(zvec,bb_ob->obmat[3],vec);
+ if(lock)
+ zvec[align]=0.0f;
+ Normalize(zvec);
+
+ if(align<PART_BB_VIEW)
+ Crossf(xvec,onevec,zvec);
+ else
+ Crossf(xvec,bb_ob->obmat[1],zvec);
+ Normalize(xvec);
+ Crossf(yvec,zvec,xvec);
+ }
+
+ VECCOPY(tvec,xvec);
+ VECCOPY(tvec2,yvec);
+
+ VecMulf(xvec,cos(tilt*(float)M_PI));
+ VecMulf(tvec2,sin(tilt*(float)M_PI));
+ VECADD(xvec,xvec,tvec2);
+
+ VecMulf(yvec,cos(tilt*(float)M_PI));
+ VecMulf(tvec,-sin(tilt*(float)M_PI));
+ VECADD(yvec,yvec,tvec);
+
+ VecMulf(xvec,size);
+ VecMulf(yvec,size);
+
+ VECADDFAC(bb_center,vec,xvec,offset[0]);
+ VECADDFAC(bb_center,bb_center,yvec,offset[1]);
+
+ VECADD(vlr->v1->co,bb_center,xvec);
+ VECADD(vlr->v1->co,vlr->v1->co,yvec);
+ MTC_Mat4MulVecfl(re->viewmat,vlr->v1->co);
+
+ VECSUB(vlr->v2->co,bb_center,xvec);
+ VECADD(vlr->v2->co,vlr->v2->co,yvec);
+ MTC_Mat4MulVecfl(re->viewmat,vlr->v2->co);
+
+ VECSUB(vlr->v3->co,bb_center,xvec);
+ VECSUB(vlr->v3->co,vlr->v3->co,yvec);
+ MTC_Mat4MulVecfl(re->viewmat,vlr->v3->co);
+
+ VECADD(vlr->v4->co,bb_center,xvec);
+ VECSUB(vlr->v4->co,vlr->v4->co,yvec);
+ MTC_Mat4MulVecfl(re->viewmat,vlr->v4->co);
+
+ CalcNormFloat4(vlr->v4->co, vlr->v3->co, vlr->v2->co, vlr->v1->co, vlr->n);
+ VECCOPY(vlr->v1->n,vlr->n);
+ VECCOPY(vlr->v2->n,vlr->n);
+ VECCOPY(vlr->v3->n,vlr->n);
+ VECCOPY(vlr->v4->n,vlr->n);
+
+ vlr->mat= ma;
+ vlr->ec= ME_V2V3;
+ vlr->lay= ob->lay;
+
+ if(uv_split>1){
+ uvdx=uvdy=1.0f/(float)uv_split;
+ if(anim==PART_BB_ANIM_TIME){
+ if(split_offset==PART_BB_OFF_NONE)
+ time=pa_time;
+ else if(split_offset==PART_BB_OFF_LINEAR)
+ time=(float)fmod(pa_time+(float)p/(float)(uv_split*uv_split),1.0f);
+ else /* split_offset==PART_BB_OFF_RANDOM */
+ time=(float)fmod(pa_time+random,1.0f);
+
+ }
+ else if(anim==PART_BB_ANIM_ANGLE){
+ if(align==PART_BB_VIEW){
+ time=(float)fmod((tilt+1.0f)/2.0f,1.0);
+ }
+ else{
+ float axis1[3]={0.0f,0.0f,0.0f};
+ float axis2[3]={0.0f,0.0f,0.0f};
+ axis1[(align+1)%3]=1.0f;
+ axis2[(align+2)%3]=1.0f;
+ if(lock==0){
+ zvec[align]=0.0f;
+ Normalize(zvec);
+ }
+ time=saacos(Inpf(zvec,axis1))/(float)M_PI;
+ if(Inpf(zvec,axis2)<0.0f)
+ time=1.0f-time/2.0f;
+ else
+ time=time/2.0f;
+ }
+ if(split_offset==PART_BB_OFF_LINEAR)
+ time=(float)fmod(pa_time+(float)p/(float)(uv_split*uv_split),1.0f);
+ else if(split_offset==PART_BB_OFF_RANDOM)
+ time=(float)fmod(pa_time+random,1.0f);
+ }
+ else{
+ if(split_offset==PART_BB_OFF_NONE)
+ time=0.0f;
+ else if(split_offset==PART_BB_OFF_LINEAR)
+ time=(float)fmod((float)p/(float)(uv_split*uv_split),1.0f);
+ else /* split_offset==PART_BB_OFF_RANDOM */
+ time=random;
+ }
+ uvx=uvdx*floor((float)(uv_split*uv_split)*(float)fmod((double)time,(double)uvdx));
+ uvy=uvdy*floor((1.0f-time)*(float)uv_split);
+ if(fmod(time,1.0f/uv_split)==0.0f)
+ uvy-=uvdy;
+ }
+
+ /* normal UVs */
+ if(uv[0]>=0){
+ mtf=RE_vlakren_get_tface(re,vlr,uv[0],NULL,1);
+ mtf->uv[0][0]=1.0f;
+ mtf->uv[0][1]=1.0f;
+ mtf->uv[1][0]=0.0f;
+ mtf->uv[1][1]=1.0f;
+ mtf->uv[2][0]=0.0f;
+ mtf->uv[2][1]=0.0f;
+ mtf->uv[3][0]=1.0f;
+ mtf->uv[3][1]=0.0f;
+ }
+
+ /* time-index UVs */
+ if(uv[1]>=0){
+ mtf=RE_vlakren_get_tface(re,vlr,uv[1],NULL,1);
+ mtf->uv[0][0]=mtf->uv[1][0]=mtf->uv[2][0]=mtf->uv[3][0]=pa_time;
+ mtf->uv[0][1]=mtf->uv[1][1]=mtf->uv[2][1]=mtf->uv[3][1]=(float)p/(float)totpart;
+ }
+
+ /* split UVs */
+ if(uv_split>1 && uv[2]>=0){
+ mtf=RE_vlakren_get_tface(re,vlr,uv[2],NULL,1);
+ mtf->uv[0][0]=uvx+uvdx;
+ mtf->uv[0][1]=uvy+uvdy;
+ mtf->uv[1][0]=uvx;
+ mtf->uv[1][1]=uvy+uvdy;
+ mtf->uv[2][0]=uvx;
+ mtf->uv[2][1]=uvy;
+ mtf->uv[3][0]=uvx+uvdx;
+ mtf->uv[3][1]=uvy;
+ }
+}
+static void render_new_particle(Render *re, Object *ob, DerivedMesh *dm, Material *ma, int path, int first, int line,
+ float time, float *loc, float *loc1, float *orco, int totuv, float *uvco,
+ float size, int seed, int override_uv, int adapt, float adapt_angle, float adapt_pix)
+{
+ HaloRen *har=0;
+ if(path){
+ if(ma->mode&MA_WIRE)
+ static_particle_wire(re, ob, ma, loc, loc1, first, line);
+ else if(ma->mode & MA_HALO){
+ har= RE_inithalo_particle(re, dm, ma, loc, loc1, orco, uvco, size, 1.0, seed);
+ if(har) har->lay= ob->lay;
+ }
+ else
+ static_particle_strand(re, ob, ma, orco, uvco, totuv, loc, loc1, time, first, line, adapt, adapt_angle, adapt_pix, override_uv);
+ }
+ else{
+ har= RE_inithalo_particle(re, dm, ma, loc, NULL, orco, uvco, size, 0.0, seed);
+ if(har) har->lay= ob->lay;
+ }
+}
+static int render_new_particle_system(Render *re, Object *ob, ParticleSystem *psys)
+{
+ Object *tob=0, *bb_ob=re->scene->camera;
+ Material *ma=0;
+ CustomDataLayer *layer;
+ MTFace *mtface;
+ ParticleSystemModifierData *psmd;
+ ParticleSystem *tpsys=0;
+ ParticleSettings *part, *tpart=0;
+ ParticleData *pars, *pa=0,*tpa=0;
+ ParticleKey *states=0;
+ ParticleKey state;
+ ParticleCacheKey *cache=0;
+ float loc[3],loc1[3],loc0[3],vel[3],imat[4][4], time;
+ float *orco=0,*uvco=0;
+ float hasize, pa_size, pa_time, r_tilt, cfra=bsystem_time(ob,(float)CFRA,0.0);
+ float loc_tex[3], size_tex[3], adapt_angle=0.0, adapt_pix=0.0, random;
+ int i, a, k, max_k=0, totpart, totvlako, totverto, totuv=0, override_uv=-1;
+ int path_possible=0, keys_possible=0, baked_keys=0, totchild=psys->totchild;
+ int seed, path_nbr=0, path=0, orco1=0, adapt=0, uv[3]={0,0,0};
+ char **uv_name=0;
+
+/* 1. check that everything is ok & updated */
+ if(psys==NULL)
+ return 0;
+
+ part=psys->part;
+ pars=psys->particles;
+
+ if(part==NULL || pars==NULL || (psys->flag & PSYS_ENABLED)==0)
+ return 0;
+
+ if(part->draw_as==PART_DRAW_OB || part->draw_as==PART_DRAW_GR || part->draw_as==PART_DRAW_NOT)
+ return 1;
+
+/* 2. start initialising things */
+ if(part->phystype==PART_PHYS_KEYED){
+ if(psys->flag & PSYS_FIRST_KEYED)
+ psys_count_keyed_targets(ob,psys);
+ else
+ return 1;
+ }
+
+ psys->flag|=PSYS_DRAWING;
+
+ BLI_srandom(psys->seed);
+
+ psmd= psys_get_modifier(ob,psys);
+
+ ma= give_render_material(re, ob, part->omat);
+
+ if(part->bb_ob)
+ bb_ob=part->bb_ob;
+
+ if(ma->ipo){
+ calc_ipo(ma->ipo, cfra);
+ execute_ipo((ID *)ma, ma->ipo);
+ }
+
+ RE_vlakren_set_customdata_names(re, &psmd->dm->faceData);
+ totuv=CustomData_number_of_layers(&psmd->dm->faceData,CD_MTFACE);
+
+ if(ma->texco & TEXCO_UV && totuv)
+ uvco = MEM_callocN(totuv*2*sizeof(float),"particle_uvs");
+
+ if(part->draw_as==PART_DRAW_BB){
+ int first_uv=CustomData_get_layer_index(&psmd->dm->faceData,CD_MTFACE);
+
+ uv[0]=CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,psys->bb_uvname[0]);
+ if(uv[0]<0)
+ uv[0]=CustomData_get_active_layer_index(&psmd->dm->faceData,CD_MTFACE);
+
+ uv[1]=CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,psys->bb_uvname[1]);
+ //if(uv[1]<0)
+ // uv[1]=CustomData_get_active_layer_index(&psmd->dm->faceData,CD_MTFACE);
+
+ uv[2]=CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,psys->bb_uvname[2]);
+ //if(uv[2]<0)
+ // uv[2]=CustomData_get_active_layer_index(&psmd->dm->faceData,CD_MTFACE);
+
+ if(first_uv>=0){
+ uv[0]-=first_uv;
+ uv[1]-=first_uv;
+ uv[2]-=first_uv;
+ }
+ }
+
+ 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)
+ cfra=bsystem_time(0,(float)CFRA,0.0);
+
+ 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;
+ }
+ }
+
+ hasize = ma->hasize;
+ seed = ma->seed1;
+
+ re->flag |= R_HALO;
+
+ Mat4Invert(imat,ob->obmat);
+
+ totvlako= re->totvlak;
+ totverto= re->totvert;
+
+ totpart=psys->totpart;
+
+ mesh_get_texspace(ob->data, loc_tex, NULL, size_tex);
+
+ if(psys->pathcache){
+ path_possible=1;
+ keys_possible=1;
+ }
+ if(part->draw_as==PART_DRAW_PATH){
+ if(path_possible){
+ path_nbr=(int)pow(2.0,(double) part->ren_step);
+ //if(part->phystype==PART_PHYS_KEYED && (psys->flag&PSYS_BAKED)==0)
+ // path_nbr*=psys->totkeyed;
+
+ if(path_nbr){
+ if((ma->mode & (MA_HALO|MA_WIRE))==0){
+ orco= MEM_mallocN(3*sizeof(float)*(totpart+totchild), "particle orcos");
+ if (!re->orco_hash)
+ re->orco_hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp);
+ BLI_ghash_insert(re->orco_hash, psys, orco);
+ }
+ path=1;
+ }
+
+ if(part->draw&PART_DRAW_REN_ADAPT){
+ adapt=1;
+ adapt_pix=(float)part->adapt_pix;
+ adapt_angle=cos((float)part->adapt_angle*(float)(M_PI/180.0));
+ }
+
+ }
+ }
+ else if(keys_possible && part->draw&PART_DRAW_KEYS){
+ path_nbr=part->keys_step;
+ if(path_nbr==0)
+ baked_keys=1;
+ }
+
+ if(orco==0){
+ orco=MEM_mallocN(3*sizeof(float),"particle orco");
+ orco1=1;
+ }
+
+ if(path_nbr==0)
+ psys->lattice=psys_get_lattice(ob,psys);
+
+/* 3. start creating renderable things */
+ for(a=0,pa=pars; a<totpart+totchild; a++, pa++) {
+ random = BLI_frand();
+ if(a<totpart){
+ if(pa->flag & PARS_UNEXIST) continue;
+
+ pa_time=(cfra-pa->time)/pa->lifetime;
+ if((part->flag&PART_ABS_TIME)==0){
+ if(ma->ipo){
+ /* correction for lifetime */
+ calc_ipo(ma->ipo, 100.0f*pa_time);
+ execute_ipo((ID *)ma, ma->ipo);
+ }
+ if(part->ipo){
+ /* correction for lifetime */
+ calc_ipo(part->ipo, 100.0f*pa_time);
+ execute_ipo((ID *)part, part->ipo);
+ }
+ }
+
+ hasize = ma->hasize;
+
+ /* get orco */
+ if(tpsys && (part->from==PART_FROM_PARTICLE || part->phystype==PART_PHYS_NO)){
+ tpa=tpsys->particles+pa->num;
+ psys_particle_on_emitter(ob, psmd,tpart->from,tpa->num, -1,tpa->fuv,tpa->foffset,orco,0,0,0);
+ }
+ else
+ psys_particle_on_emitter(ob, psmd,part->from,pa->num,-1,pa->fuv,pa->foffset,orco,0,0,0);
+
+ if(uvco && ELEM(part->from,PART_FROM_FACE,PART_FROM_VOLUME)){
+ layer=psmd->dm->faceData.layers + CustomData_get_layer_index(&psmd->dm->faceData,CD_MFACE);
+ for(i=0; i<totuv; i++){
+ int n;
+ MFace *mface=psmd->dm->getFaceData(psmd->dm,pa->num,CD_MFACE);
+
+ mtface=(MTFace*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MTFACE,i);
+ mtface+=pa->num;
+
+ n= vlakren_customdata_layer_num(i, layer->active);
+
+ psys_interpolate_uvs(mtface,mface->v4,pa->fuv,uvco+2*n);
+ }
+ override_uv=CustomData_get_named_layer_index(&psmd->dm->faceData,CD_MTFACE,ma->strand_uvname)-
+ CustomData_get_layer_index(&psmd->dm->faceData,CD_MTFACE);
+ }
+
+ pa_size=pa->size;
+
+ r_tilt=1.0f+pa->r_ave[0];
+
+ if(path_nbr){
+ cache = psys->pathcache[a];
+ max_k = (int)cache->steps;
+ }
+
+ if(totchild && (part->draw&PART_DRAW_PARENT)==0) continue;
+ }
+ else{
+ ChildParticle *cpa= psys->child+a-totpart;
+ pa_time=psys_get_child_time(psys, a-totpart, cfra);
+
+ if((part->flag&PART_ABS_TIME)==0){
+ if(ma->ipo){
+ /* correction for lifetime */
+ calc_ipo(ma->ipo, 100.0f*pa_time);
+ execute_ipo((ID *)ma, ma->ipo);
+ }
+ if(part->ipo){
+ /* correction for lifetime */
+ calc_ipo(part->ipo, 100.0f*pa_time);
+ execute_ipo((ID *)part, part->ipo);
+ }
+ }
+
+ pa_size=psys_get_child_size(psys, a-totpart, cfra, &pa_time);
+
+ r_tilt=2.0f*cpa->rand[2];
+
+ if(uvco){
+ layer=psmd->dm->faceData.layers + CustomData_get_layer_index(&psmd->dm->faceData,CD_MFACE);
+
+ if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES){
+ for(i=0; i<totuv; i++){
+ if(part->childtype==PART_CHILD_FACES){
+ int n;
+ MFace *mface=psmd->dm->getFaceData(psmd->dm,cpa->num,CD_MFACE);
+
+ mtface=(MTFace*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MTFACE,i);
+ mtface+=cpa->num;
+
+ n= vlakren_customdata_layer_num(i, layer->active);
+
+ psys_interpolate_uvs(mtface,mface->v4,cpa->fuv,uvco+2*n);
+ }
+ else{
+ uvco[2*i]=uvco[2*i+1]=0.0f;
+ }
+ }
+ }
+ else if(ELEM(part->from,PART_FROM_FACE,PART_FROM_VOLUME)){
+ for(i=0; i<totuv; i++){
+ ParticleData *parent = psys->particles+cpa->parent;
+ int n;
+ MFace *mface=psmd->dm->getFaceData(psmd->dm,parent->num,CD_MFACE);
+
+ mtface=(MTFace*)CustomData_get_layer_n(&psmd->dm->faceData,CD_MTFACE,i);
+ mtface+=parent->num;
+
+ n= vlakren_customdata_layer_num(i, layer->active);
+
+ psys_interpolate_uvs(mtface,mface->v4,parent->fuv,uvco+2*n);
+ }
+ }
+ }
+
+ if(path_nbr){
+ cache = psys->childcache[a-totpart];
+ max_k = (int)cache->steps;
+ }
+ }
+
+ if(orco) {
+ orco[0] = (orco[0]-loc_tex[0])/size_tex[0];
+ orco[1] = (orco[1]-loc_tex[1])/size_tex[1];
+ orco[2] = (orco[2]-loc_tex[2])/size_tex[2];
+ }
+
+ for(k=0; k<=path_nbr; k++){
+ if(path_nbr){
+ time=(float)k/(float)path_nbr;
+ if(k<=max_k){
+ //bti->convert_bake_key(bsys,cache+k,0,(void*)&state);
+ //copy_particle_key(&state,cache+k,0);
+ VECCOPY(state.co,(cache+k)->co);
+ VECCOPY(state.vel,(cache+k)->vel);
+ }
+ else
+ continue;
+ }
+ else{
+ time=0.0f;
+ state.time=cfra;
+ if(psys_get_particle_state(ob,psys,a,&state,0)==0)
+ continue;
+ }
+
+ VECCOPY(loc,state.co);
+ if(part->draw_as!=PART_DRAW_BB)
+ MTC_Mat4MulVecfl(re->viewmat,loc);
+
+ if(part->draw_as==PART_DRAW_LINE){
+ VECCOPY(vel,state.vel);
+ //VECADD(vel,vel,state.co);
+ MTC_Mat4Mul3Vecfl(re->viewmat,vel);
+ //VECSUB(vel,vel,loc);
+ Normalize(vel);
+ if(part->draw & PART_DRAW_VEL_LENGTH)
+ VecMulf(vel,VecLength(state.vel));
+ VECADDFAC(loc0,loc,vel,-part->draw_line[0]);
+ VECADDFAC(loc1,loc,vel,part->draw_line[1]);
+
+ render_new_particle(re,ob,psmd->dm,ma,1,0,1,0.0f,loc0,loc1,
+ orco,totuv,uvco,hasize,seed,override_uv,0,0,0);
+ }
+ else if(part->draw_as==PART_DRAW_BB){
+ VECCOPY(vel,state.vel);
+ //MTC_Mat4Mul3Vecfl(re->viewmat,vel);
+ particle_billboard(re,ob,ma,bb_ob,loc,vel,pa_size,part->bb_tilt*(1.0f-part->bb_rand_tilt*r_tilt),
+ part->bb_align,part->draw&PART_DRAW_BB_LOCK,
+ a,totpart+totchild,part->bb_uv_split,part->bb_anim,part->bb_split_offset,random,pa_time,part->bb_offset,uv);
+ }
+ else{
+ if(k==1){
+ VECSUB(loc0,loc1,loc);
+ VECADD(loc0,loc1,loc0);
+ render_new_particle(re,ob,psmd->dm,ma,path,1,0,0.0f,loc1,loc0,
+ orco,totuv,uvco,hasize,seed,override_uv,
+ adapt,adapt_angle,adapt_pix);
+ }
+
+ if(path_nbr==0 || k)
+ render_new_particle(re,ob,psmd->dm,ma,path,0,0,time,loc,loc1,
+ orco,totuv,uvco,hasize,seed,override_uv,
+ adapt,adapt_angle,adapt_pix);
+
+ VECCOPY(loc1,loc);
+ }
+ }
+
+ if(orco1==0)
+ orco+=3;
+ }
+
+/* 4. clean up */
+ if(ma) do_mat_ipo(ma);
+
+ if(orco1)
+ MEM_freeN(orco);
+
+ if(uvco)
+ MEM_freeN(uvco);
+
+ if(uv_name)
+ MEM_freeN(uv_name);
+
+ if(states)
+ MEM_freeN(states);
+
+ psys->flag &= ~PSYS_DRAWING;
+
+ if(psys->lattice){
+ end_latt_deform();
+ psys->lattice=0;
+ }
+
+ if(path && (ma->mode & MA_TANGENT_STR)==0)
+ calc_vertexnormals(re, totverto, totvlako, 0);
+
+ return 1;
}
static void render_static_particle_system(Render *re, Object *ob, PartEff *paf)
@@ -1353,7 +2136,7 @@ static void render_static_particle_system(Render *re, Object *ob, PartEff *paf)
if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= ob->sf;
else ptime= 0.0;
- ctime= bsystem_time(ob, 0, (float)re->scene->r.cfra, ptime);
+ ctime= bsystem_time(ob, (float)re->scene->r.cfra, ptime);
seed= ma->seed1;
for(a=0; a<paf->totpart; a++, pa+=paf->totkey) {
@@ -1462,7 +2245,7 @@ static void render_static_particle_system(Render *re, Object *ob, PartEff *paf)
if(ctime + paf->staticstep < mtime)
strandco= (ctime-pa->time)/(mtime-pa->time);
- static_particle_strand(re, ob, ma, orco, vec, vec1, strandco, first);
+ static_particle_strand(re, ob, ma, orco, 0, 0, vec, vec1, strandco, first, 0,0,0,0,-1);
}
}
@@ -1882,9 +2665,10 @@ static void init_render_mesh(Render *re, Object *ob, Object *par, int only_verts
MTC_Mat4MulVecfl(mat, ver->co);
if(useFluidmeshNormals) {
- xn = mvert->no[0]/ 32767.0;
- yn = mvert->no[1]/ 32767.0;
- zn = mvert->no[2]/ 32767.0;
+ /* normals are inverted in render */
+ xn = -mvert->no[0]/ 32767.0;
+ yn = -mvert->no[1]/ 32767.0;
+ zn = -mvert->no[2]/ 32767.0;
/* transfor to cam space */
ver->n[0]= imat[0][0]*xn+imat[0][1]*yn+imat[0][2]*zn;
ver->n[1]= imat[1][0]*xn+imat[1][1]*yn+imat[1][2]*zn;
@@ -2221,7 +3005,6 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
lar->mode= la->mode;
lar->energy= la->energy;
- lar->energy= la->energy;
if(la->mode & LA_NEG) lar->energy= -lar->energy;
lar->vec[0]= -mat[2][0];
@@ -2243,15 +3026,23 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
lar->ray_samp= la->ray_samp;
lar->ray_sampy= la->ray_sampy;
lar->ray_sampz= la->ray_sampz;
-
+
lar->area_size= la->area_size;
lar->area_sizey= la->area_sizey;
lar->area_sizez= la->area_sizez;
lar->area_shape= la->area_shape;
+ lar->ray_samp_method= la->ray_samp_method;
lar->ray_samp_type= la->ray_samp_type;
-
- if(lar->type==LA_AREA) {
+
+ lar->adapt_thresh= la->adapt_thresh;
+
+ if( ELEM3(lar->type, LA_SPOT, LA_SUN, LA_LOCAL)) {
+ lar->ray_totsamp= lar->ray_samp*lar->ray_samp;
+ lar->area_shape = LA_AREA_SQUARE;
+ lar->area_sizey= lar->area_size;
+ }
+ else if(lar->type==LA_AREA) {
switch(lar->area_shape) {
case LA_AREA_SQUARE:
lar->ray_totsamp= lar->ray_samp*lar->ray_samp;
@@ -2304,8 +3095,10 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
lar->lay= ob->lay & 0xFFFFFF; // higher 8 bits are localview layers
+ lar->falloff_type = la->falloff_type;
lar->ld1= la->att1;
lar->ld2= la->att2;
+ lar->curfalloff = curvemapping_copy(la->curfalloff);
if(lar->type==LA_SPOT) {
@@ -2369,15 +3162,20 @@ static GroupObject *add_render_lamp(Render *re, Object *ob)
if(re->r.mode & R_SHADOW) {
- if (la->type==LA_SPOT && (lar->mode & LA_SHAD_BUF) ) {
+
+ if ((lar->mode & LA_SHAD_RAY) && (lar->ray_samp_method == LA_SAMP_HAMMERSLEY)) {
+ init_lamp_hammersley(lar);
+ }
+ if(la->type==LA_AREA && (lar->mode & LA_SHAD_RAY) && (lar->ray_samp_method == LA_SAMP_CONSTANT)) {
+ init_jitter_plane(lar);
+ }
+ else if (la->type==LA_SPOT && (lar->mode & LA_SHAD_BUF) ) {
/* Per lamp, one shadow buffer is made. */
lar->bufflag= la->bufflag;
Mat4CpyMat4(mat, ob->obmat);
initshadowbuf(re, lar, mat); // mat is altered
}
- else if(la->type==LA_AREA && (lar->mode & LA_SHAD_RAY) ) {
- init_jitter_plane(lar);
- }
+
/* this is the way used all over to check for shadow */
if(lar->shb || (lar->mode & LA_SHAD_RAY)) {
@@ -2889,26 +3687,55 @@ static void init_render_object(Render *re, Object *ob, Object *par, int index, i
static double lasttime= 0.0;
double time;
float mat[4][4];
- int startface, startvert;
+ int startface, startvert, allow_render=1;
startface=re->totvlak;
startvert=re->totvert;
ob->flag |= OB_DONE;
- if(ob->type==OB_LAMP)
- add_render_lamp(re, ob);
- else if ELEM(ob->type, OB_FONT, OB_CURVE)
- init_render_curve(re, ob, only_verts);
- else if(ob->type==OB_SURF)
- init_render_surf(re, ob);
- else if(ob->type==OB_MESH)
- init_render_mesh(re, ob, par, only_verts);
- else if(ob->type==OB_MBALL)
- init_render_mball(re, ob);
- else {
- MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
- MTC_Mat4Invert(ob->imat, mat);
+ /* the emitter has to be processed first (render levels of modifiers) */
+ /* so here we only check if the emitter should be rendered */
+ if(ob->particlesystem.first) {
+ ParticleSystem *psys = ob->particlesystem.first;
+ int showe = 0;
+ for(; psys; psys=psys->next)
+ showe += psys->part->draw & PART_DRAW_EMITTER;
+
+ /* if no psys has "show emitter" selected don't render emitter */
+ if(showe==0) allow_render = 0;
+ }
+
+ if(allow_render) {
+ if(ob->type==OB_LAMP)
+ add_render_lamp(re, ob);
+ else if ELEM(ob->type, OB_FONT, OB_CURVE)
+ init_render_curve(re, ob, only_verts);
+ else if(ob->type==OB_SURF)
+ init_render_surf(re, ob);
+ else if(ob->type==OB_MESH)
+ init_render_mesh(re, ob, par, only_verts);
+ else if(ob->type==OB_MBALL)
+ init_render_mball(re, ob);
+ else {
+ MTC_Mat4MulMat4(mat, ob->obmat, re->viewmat);
+ MTC_Mat4Invert(ob->imat, mat);
+ }
+ }
+
+ if(ob->particlesystem.first) {
+ ParticleSystem *psys = ob->particlesystem.first;
+ DerivedMesh *dm = 0;
+
+ /* the emitter mesh wasn't rendered so the modifier stack wasn't evaluated with render settings */
+ if(allow_render==0 && ob->type==OB_MESH)
+ dm = mesh_create_derived_render(ob, CD_MASK_BAREMESH | CD_MASK_MTFACE | CD_MASK_MCOL);
+
+ for(; psys; psys=psys->next)
+ render_new_particle_system(re, ob, psys);
+
+ if(dm)
+ dm->release(dm);
}
/* generic post process here */
@@ -2951,6 +3778,8 @@ void RE_Database_Free(Render *re)
freeshadowbuf(lar);
if(lar->jitter) MEM_freeN(lar->jitter);
if(lar->shadsamp) MEM_freeN(lar->shadsamp);
+ if(lar->qsa) free_lamp_qmcsampler(lar);
+ curvemapping_free(lar->curfalloff);
}
BLI_freelistN(&re->lampren);
@@ -2987,8 +3816,11 @@ void RE_Database_Free(Render *re)
re->wrld.aotables= NULL;
re->scene->world->aotables= NULL;
}
+ if((re->r.mode & R_RAYTRACE) && (re->wrld.mode & WO_AMB_OCC) &&
+ (re->wrld.ao_samp_method == WO_AOSAMP_HAMMERSLEY) && (re->qsa))
+ free_render_qmcsampler(re);
- if(re->r.mode & R_RAYTRACE) freeoctree(re);
+ if(re->r.mode & R_RAYTRACE) freeraytree(re);
free_sss(re);
@@ -3024,8 +3856,11 @@ static void set_fullsample_flag(Render *re)
if(vlr->mat->mode & MA_FULL_OSA) vlr->flag |= R_FULL_OSA;
else if(trace) {
if(vlr->mat->mode & MA_SHLESS);
- else if(vlr->mat->mode & (MA_RAYTRANSP|MA_RAYMIRROR|MA_SHADOW))
- vlr->flag |= R_FULL_OSA;
+ else if(vlr->mat->mode & (MA_RAYTRANSP|MA_RAYMIRROR))
+ /* for blurry reflect/refract, better to take more samples
+ * inside the raytrace than as OSA samples */
+ if ((vlr->mat->gloss_mir == 1.0) && (vlr->mat->gloss_tra == 1.0))
+ vlr->flag |= R_FULL_OSA;
}
}
}
@@ -3278,8 +4113,12 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
}
init_render_world(re); /* do first, because of ambient. also requires re->osa set correct */
- if(re->wrld.mode & WO_AMB_OCC)
- init_ao_sphere(&re->wrld);
+ if(re->wrld.mode & WO_AMB_OCC) {
+ if (re->wrld.ao_samp_method == WO_AOSAMP_HAMMERSLEY)
+ init_render_hammersley(re);
+ else if (re->wrld.ao_samp_method == WO_AOSAMP_CONSTANT)
+ init_ao_sphere(&re->wrld);
+ }
/* still bad... doing all */
init_render_textures(re);
@@ -3321,6 +4160,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
#endif /* disable yafray */
}
else if( (base->lay & lay) || (ob->type==OB_LAMP && (base->lay & re->scene->lay)) ) {
+ int pdup=0;
if(ob->transflag & OB_DUPLI) {
/* exception: mballs! */
@@ -3340,6 +4180,20 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
if(paf->flag & PAF_ANIMATED) build_particle_system(ob);
}
}
+ if(ob->transflag & OB_DUPLIPARTS){
+ if(ob->particlesystem.first){
+ ParticleSystem *psys = ob->particlesystem.first;
+ ParticleSettings *part;
+
+ for(; psys; psys=psys->next){
+ part=psys->part;
+
+ if((part->draw_as==PART_DRAW_OB && part->dup_ob) || (part->draw_as==PART_DRAW_GR && part->dup_group))
+ if(part->draw & PART_DRAW_EMITTER)
+ pdup++;
+ }
+ }
+ }
if(ob->type==OB_MBALL) {
init_render_object(re, ob, NULL, 0, 0);
@@ -3417,6 +4271,9 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
#endif /* disable yafray */
}
+ /* override not showing object when duplis are used with particles */
+ if(pdup)
+ init_render_object(re, ob, NULL, 0, 0);
}
if(re->test_break()) break;
@@ -3461,17 +4318,17 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
}
}
- /* yafray: 'direct' radiosity, environment maps and octree init not needed for yafray render */
+ /* yafray: 'direct' radiosity, environment maps and raytree init not needed for yafray render */
/* although radio mode could be useful at some point, later */
if (re->r.renderer==R_INTERN) {
/* RADIO (uses no R anymore) */
if(!re->test_break())
if(re->r.mode & R_RADIO) do_radio_render(re);
- /* octree */
+ /* raytree */
if(!re->test_break()) {
if(re->r.mode & R_RAYTRACE) {
- makeoctree(re);
+ makeraytree(re);
}
}
/* ENVIRONMENT MAPS */
@@ -3585,7 +4442,6 @@ static void database_fromscene_vectors(Render *re, Scene *scene, int timeoffset)
else {
init_render_object(re, ob, NULL, 0, 1);
}
-
}
if(re->test_break()) break;
}
@@ -3962,8 +4818,13 @@ void RE_Database_Baking(Render *re, Scene *scene, int type)
}
init_render_world(re); /* do first, because of ambient. also requires re->osa set correct */
- if(re->wrld.mode & WO_AMB_OCC)
- init_ao_sphere(&re->wrld);
+ if(re->wrld.mode & WO_AMB_OCC) {
+ if (re->wrld.ao_samp_method == WO_AOSAMP_HAMMERSLEY)
+ init_render_hammersley(re);
+ else if (re->wrld.ao_samp_method == WO_AOSAMP_CONSTANT)
+ init_ao_sphere(&re->wrld);
+ }
+
/* still bad... doing all */
init_render_textures(re);
@@ -4048,10 +4909,10 @@ void RE_Database_Baking(Render *re, Scene *scene, int type)
}
if(type!=RE_BAKE_LIGHT) {
- /* octree */
+ /* raytree */
if(!re->test_break()) {
if(re->r.mode & R_RAYTRACE) {
- makeoctree(re);
+ makeraytree(re);
}
}
}
diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c
index ec55bc0a5e2..ebb444833e8 100644
--- a/source/blender/render/intern/source/envmap.c
+++ b/source/blender/render/intern/source/envmap.c
@@ -157,7 +157,7 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
envre->vlaknodeslen= re->vlaknodeslen;
envre->vlaknodes= re->vlaknodes;
envre->customdata_names= re->customdata_names;
- envre->oc= re->oc;
+ envre->raytree= re->raytree;
return envre;
}
@@ -177,8 +177,7 @@ static void envmap_free_render_copy(Render *envre)
envre->vlaknodeslen= 0;
envre->vlaknodes= NULL;
envre->customdata_names.first= envre->customdata_names.last= NULL;
- envre->oc.adrbranch= NULL;
- envre->oc.adrnode= NULL;
+ envre->raytree= NULL;
RE_FreeRender(envre);
}
diff --git a/source/blender/render/intern/source/imagetexture.c b/source/blender/render/intern/source/imagetexture.c
index 82abab62637..ff0b5f3d3cb 100644
--- a/source/blender/render/intern/source/imagetexture.c
+++ b/source/blender/render/intern/source/imagetexture.c
@@ -968,5 +968,14 @@ int imagewraposa(Tex *tex, Image *ima, ImBuf *ibuf, float *texvec, float *dxt, f
texres->nor[2] = 2.f*(texres->tb - 0.5f);
}
+ /* de-premul, this is being premulled in shade_input_do_shade() */
+ if(texres->ta!=1.0f && texres->ta!=0.0f) {
+ fx= 1.0f/texres->ta;
+ texres->tr*= fx;
+ texres->tg*= fx;
+ texres->tb*= fx;
+ }
+
+
return retval;
}
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 02396091a17..61bc6a84556 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -576,7 +576,7 @@ static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int
static int render_scene_needs_vector(Render *re)
{
- if(re->r.scemode & R_DOCOMP) {
+ if((re->r.scemode & R_DOCOMP) || re->r.imtype==R_MULTILAYER) {
SceneRenderLayer *srl;
for(srl= re->scene->r.layers.first; srl; srl= srl->next)
@@ -1936,6 +1936,8 @@ static void do_render_composite_fields_blur_3d(Render *re)
}
}
+ /* weak... the display callback wants an active renderlayer pointer... */
+ re->result->renlay= render_get_active_layer(re, re->result);
re->display_draw(re->result, NULL);
}
@@ -1998,8 +2000,17 @@ static void yafrayRender(Render *re)
RE_Database_Free(re);
}
+
+
#endif /* disable yafray */
+static void renderresult_stampinfo()
+{
+ RenderResult rres;
+ /* this is the basic trick to get the displayed float or char rect from render result */
+ RE_GetResultImage(RE_GetRender(G.scene->id.name), &rres);
+ BKE_stamp_buf((unsigned char *)rres.rect32, rres.rectf, rres.rectx, rres.recty);
+}
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
@@ -2035,7 +2046,14 @@ static void do_render_all_options(Render *re)
renderresult_add_names(re->result);
re->i.lastframetime= PIL_check_seconds_timer()- re->i.starttime;
+
re->stats_draw(&re->i);
+
+ /* stamp image info here */
+ if((G.scene->r.scemode & R_STAMP_INFO) && (G.scene->r.stamp & R_STAMP_DRAW)) {
+ renderresult_stampinfo();
+ re->display_draw(re->result, NULL);
+ }
}
static int is_rendering_allowed(Render *re)
diff --git a/source/blender/render/intern/source/ray.c b/source/blender/render/intern/source/ray.c
deleted file mode 100644
index 128a4a900ec..00000000000
--- a/source/blender/render/intern/source/ray.c
+++ /dev/null
@@ -1,2469 +0,0 @@
-/**
- * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 1990-1998 NeoGeo BV.
- * All rights reserved.
- *
- * Contributors: 2004/2005 Blender Foundation, full recode
- *
- * ***** END GPL LICENSE BLOCK *****
- */
-
-
-#include <math.h>
-#include <string.h>
-#include <stdlib.h>
-#include <float.h>
-
-#include "MEM_guardedalloc.h"
-
-#include "DNA_material_types.h"
-#include "DNA_lamp_types.h"
-
-#include "BKE_global.h"
-#include "BKE_node.h"
-#include "BKE_utildefines.h"
-
-#include "BLI_arithb.h"
-#include "BLI_rand.h"
-#include "BLI_jitter.h"
-
-#include "PIL_time.h"
-
-#include "render_types.h"
-#include "renderpipeline.h"
-#include "rendercore.h"
-#include "renderdatabase.h"
-#include "pixelblending.h"
-#include "pixelshading.h"
-#include "shading.h"
-#include "texture.h"
-
-#define DDA_SHADOW 0
-#define DDA_MIRROR 1
-#define DDA_SHADOW_TRA 2
-
-#define RAY_TRA 1
-#define RAY_TRAFLIP 2
-
-#define DEPTH_SHADOW_TRA 10
-
-/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-/* defined in pipeline.c, is hardcopy of active dynamic allocated Render */
-/* only to be used here in this file, it's for speed */
-extern struct Render R;
-/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-
-/* ********** structs *************** */
-
-#define BRANCH_ARRAY 1024
-#define NODE_ARRAY 4096
-
-typedef struct Isect {
- float start[3], vec[3], end[3]; /* start+vec = end, in d3dda */
- float labda, u, v;
- struct VlakRen *vlr, *vlrcontr, *vlrorig; /* vlr is where to intersect with */
- short isect, mode; /* isect: which half of quad, mode: DDA_SHADOW, DDA_MIRROR, DDA_SHADOW_TRA */
- float ddalabda;
- float col[4]; /* RGBA for shadow_tra */
- int lay; /* -1 default, set for layer lamps */
- short vlrisect; /* flag whether vlrcontr was done or not */
- /* for optimize, last intersected face */
- VlakRen *vlr_last;
-} Isect;
-
-typedef struct Branch
-{
- struct Branch *b[8];
-} Branch;
-
-typedef struct OcVal
-{
- short ocx, ocy, ocz;
-} OcVal;
-
-typedef struct Node
-{
- struct VlakRen *v[8];
- struct OcVal ov[8];
- struct Node *next;
-} Node;
-
-
-/* ******** globals ***************** */
-
-/* just for statistics */
-static int raycount;
-static int accepted, rejected, coherent_ray;
-
-
-/* **************** ocval method ******************* */
-/* within one octree node, a set of 3x15 bits defines a 'boundbox' to OR with */
-
-#define OCVALRES 15
-#define BROW16(min, max) (((max)>=OCVALRES? 0xFFFF: (1<<(max+1))-1) - ((min>0)? ((1<<(min))-1):0) )
-
-static void calc_ocval_face(float *v1, float *v2, float *v3, float *v4, short x, short y, short z, OcVal *ov)
-{
- float min[3], max[3];
- int ocmin, ocmax;
-
- VECCOPY(min, v1);
- VECCOPY(max, v1);
- DO_MINMAX(v2, min, max);
- DO_MINMAX(v3, min, max);
- if(v4) {
- DO_MINMAX(v4, min, max);
- }
-
- ocmin= OCVALRES*(min[0]-x);
- ocmax= OCVALRES*(max[0]-x);
- ov->ocx= BROW16(ocmin, ocmax);
-
- ocmin= OCVALRES*(min[1]-y);
- ocmax= OCVALRES*(max[1]-y);
- ov->ocy= BROW16(ocmin, ocmax);
-
- ocmin= OCVALRES*(min[2]-z);
- ocmax= OCVALRES*(max[2]-z);
- ov->ocz= BROW16(ocmin, ocmax);
-
-}
-
-static void calc_ocval_ray(OcVal *ov, float xo, float yo, float zo, float *vec1, float *vec2)
-{
- int ocmin, ocmax;
-
- if(vec1[0]<vec2[0]) {
- ocmin= OCVALRES*(vec1[0] - xo);
- ocmax= OCVALRES*(vec2[0] - xo);
- } else {
- ocmin= OCVALRES*(vec2[0] - xo);
- ocmax= OCVALRES*(vec1[0] - xo);
- }
- ov->ocx= BROW16(ocmin, ocmax);
-
- if(vec1[1]<vec2[1]) {
- ocmin= OCVALRES*(vec1[1] - yo);
- ocmax= OCVALRES*(vec2[1] - yo);
- } else {
- ocmin= OCVALRES*(vec2[1] - yo);
- ocmax= OCVALRES*(vec1[1] - yo);
- }
- ov->ocy= BROW16(ocmin, ocmax);
-
- if(vec1[2]<vec2[2]) {
- ocmin= OCVALRES*(vec1[2] - zo);
- ocmax= OCVALRES*(vec2[2] - zo);
- } else {
- ocmin= OCVALRES*(vec2[2] - zo);
- ocmax= OCVALRES*(vec1[2] - zo);
- }
- ov->ocz= BROW16(ocmin, ocmax);
-}
-
-/* ************* octree ************** */
-
-static Branch *addbranch(Octree *oc, Branch *br, short ocb)
-{
- int index;
-
- if(br->b[ocb]) return br->b[ocb];
-
- oc->branchcount++;
- index= oc->branchcount>>12;
-
- if(oc->adrbranch[index]==NULL)
- oc->adrbranch[index]= MEM_callocN(4096*sizeof(Branch), "new oc branch");
-
- if(oc->branchcount>= BRANCH_ARRAY*4096) {
- printf("error; octree branches full\n");
- oc->branchcount=0;
- }
-
- return br->b[ocb]= oc->adrbranch[index]+(oc->branchcount & 4095);
-}
-
-static Node *addnode(Octree *oc)
-{
- int index;
-
- oc->nodecount++;
- index= oc->nodecount>>12;
-
- if(oc->adrnode[index]==NULL)
- oc->adrnode[index]= MEM_callocN(4096*sizeof(Node),"addnode");
-
- if(oc->nodecount> NODE_ARRAY*NODE_ARRAY) {
- printf("error; octree nodes full\n");
- oc->nodecount=0;
- }
-
- return oc->adrnode[index]+(oc->nodecount & 4095);
-}
-
-static int face_in_node(VlakRen *vlr, short x, short y, short z, float rtf[][3])
-{
- static float nor[3], d;
- float fx, fy, fz;
-
- // init static vars
- if(vlr) {
- CalcNormFloat(rtf[0], rtf[1], rtf[2], nor);
- d= -nor[0]*rtf[0][0] - nor[1]*rtf[0][1] - nor[2]*rtf[0][2];
- return 0;
- }
-
- fx= x;
- fy= y;
- fz= z;
-
- if((fx)*nor[0] + (fy)*nor[1] + (fz)*nor[2] + d > 0.0f) {
- if((fx+1)*nor[0] + (fy )*nor[1] + (fz )*nor[2] + d < 0.0f) return 1;
- if((fx )*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d < 0.0f) return 1;
- if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d < 0.0f) return 1;
-
- if((fx )*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
- if((fx+1)*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
- if((fx )*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
- if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
- }
- else {
- if((fx+1)*nor[0] + (fy )*nor[1] + (fz )*nor[2] + d > 0.0f) return 1;
- if((fx )*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d > 0.0f) return 1;
- if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d > 0.0f) return 1;
-
- if((fx )*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
- if((fx+1)*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
- if((fx )*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
- if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
- }
-
- return 0;
-}
-
-static void ocwrite(Octree *oc, VlakRen *vlr, short x, short y, short z, float rtf[][3])
-{
- Branch *br;
- Node *no;
- short a, oc0, oc1, oc2, oc3, oc4, oc5;
-
- x<<=2;
- y<<=1;
-
- br= oc->adrbranch[0];
-
- if(oc->ocres==512) {
- oc0= ((x & 1024)+(y & 512)+(z & 256))>>8;
- br= addbranch(oc, br, oc0);
- }
- if(oc->ocres>=256) {
- oc0= ((x & 512)+(y & 256)+(z & 128))>>7;
- br= addbranch(oc, br, oc0);
- }
- if(oc->ocres>=128) {
- oc0= ((x & 256)+(y & 128)+(z & 64))>>6;
- br= addbranch(oc, br, oc0);
- }
-
- oc0= ((x & 128)+(y & 64)+(z & 32))>>5;
- oc1= ((x & 64)+(y & 32)+(z & 16))>>4;
- oc2= ((x & 32)+(y & 16)+(z & 8))>>3;
- oc3= ((x & 16)+(y & 8)+(z & 4))>>2;
- oc4= ((x & 8)+(y & 4)+(z & 2))>>1;
- oc5= ((x & 4)+(y & 2)+(z & 1));
-
- br= addbranch(oc, br,oc0);
- br= addbranch(oc, br,oc1);
- br= addbranch(oc, br,oc2);
- br= addbranch(oc, br,oc3);
- br= addbranch(oc, br,oc4);
- no= (Node *)br->b[oc5];
- if(no==NULL) br->b[oc5]= (Branch *)(no= addnode(oc));
-
- while(no->next) no= no->next;
-
- a= 0;
- if(no->v[7]) { /* node full */
- no->next= addnode(oc);
- no= no->next;
- }
- else {
- while(no->v[a]!=NULL) a++;
- }
-
- no->v[a]= vlr;
-
- if(vlr->v4)
- calc_ocval_face(rtf[0], rtf[1], rtf[2], rtf[3], x>>2, y>>1, z, &no->ov[a]);
- else
- calc_ocval_face(rtf[0], rtf[1], rtf[2], NULL, x>>2, y>>1, z, &no->ov[a]);
-}
-
-static void d2dda(Octree *oc, short b1, short b2, short c1, short c2, char *ocface, short rts[][3], float rtf[][3])
-{
- int ocx1,ocx2,ocy1,ocy2;
- int x,y,dx=0,dy=0;
- float ox1,ox2,oy1,oy2;
- float labda,labdao,labdax,labday,ldx,ldy;
-
- ocx1= rts[b1][c1];
- ocy1= rts[b1][c2];
- ocx2= rts[b2][c1];
- ocy2= rts[b2][c2];
-
- if(ocx1==ocx2 && ocy1==ocy2) {
- ocface[oc->ocres*ocx1+ocy1]= 1;
- return;
- }
-
- ox1= rtf[b1][c1];
- oy1= rtf[b1][c2];
- ox2= rtf[b2][c1];
- oy2= rtf[b2][c2];
-
- if(ox1!=ox2) {
- if(ox2-ox1>0.0f) {
- labdax= (ox1-ocx1-1.0f)/(ox1-ox2);
- ldx= -1.0f/(ox1-ox2);
- dx= 1;
- } else {
- labdax= (ox1-ocx1)/(ox1-ox2);
- ldx= 1.0f/(ox1-ox2);
- dx= -1;
- }
- } else {
- labdax=1.0f;
- ldx=0;
- }
-
- if(oy1!=oy2) {
- if(oy2-oy1>0.0f) {
- labday= (oy1-ocy1-1.0f)/(oy1-oy2);
- ldy= -1.0f/(oy1-oy2);
- dy= 1;
- } else {
- labday= (oy1-ocy1)/(oy1-oy2);
- ldy= 1.0f/(oy1-oy2);
- dy= -1;
- }
- } else {
- labday=1.0f;
- ldy=0;
- }
-
- x=ocx1; y=ocy1;
- labda= MIN2(labdax, labday);
-
- while(TRUE) {
-
- if(x<0 || y<0 || x>=oc->ocres || y>=oc->ocres);
- else ocface[oc->ocres*x+y]= 1;
-
- labdao=labda;
- if(labdax==labday) {
- labdax+=ldx;
- x+=dx;
- labday+=ldy;
- y+=dy;
- } else {
- if(labdax<labday) {
- labdax+=ldx;
- x+=dx;
- } else {
- labday+=ldy;
- y+=dy;
- }
- }
- labda=MIN2(labdax,labday);
- if(labda==labdao) break;
- if(labda>=1.0f) break;
- }
- ocface[oc->ocres*ocx2+ocy2]=1;
-}
-
-static void filltriangle(Octree *oc, short c1, short c2, char *ocface, short *ocmin)
-{
- short *ocmax;
- int a, x, y, y1, y2;
-
- ocmax=ocmin+3;
-
- for(x=ocmin[c1];x<=ocmax[c1];x++) {
- a= oc->ocres*x;
- for(y=ocmin[c2];y<=ocmax[c2];y++) {
- if(ocface[a+y]) {
- y++;
- while(ocface[a+y] && y!=ocmax[c2]) y++;
- for(y1=ocmax[c2];y1>y;y1--) {
- if(ocface[a+y1]) {
- for(y2=y;y2<=y1;y2++) ocface[a+y2]=1;
- y1=0;
- }
- }
- y=ocmax[c2];
- }
- }
- }
-}
-
-void freeoctree(Render *re)
-{
- Octree *oc= &re->oc;
-
-#if 0
- printf("branches %d nodes %d\n", oc->branchcount, oc->nodecount);
- printf("raycount %d \n", raycount);
- printf("ray coherent %d \n", coherent_ray);
- printf("accepted %d rejected %d\n", accepted, rejected);
-#endif
-
- if(oc->adrbranch) {
- int a= 0;
- while(oc->adrbranch[a]) {
- MEM_freeN(oc->adrbranch[a]);
- oc->adrbranch[a]= NULL;
- a++;
- }
- MEM_freeN(oc->adrbranch);
- oc->adrbranch= NULL;
- }
- oc->branchcount= 0;
-
- if(oc->adrnode) {
- int a= 0;
- while(oc->adrnode[a]) {
- MEM_freeN(oc->adrnode[a]);
- oc->adrnode[a]= NULL;
- a++;
- }
- MEM_freeN(oc->adrnode);
- oc->adrnode= NULL;
- }
- oc->nodecount= 0;
-}
-
-void makeoctree(Render *re)
-{
- Octree *oc;
- VlakRen *vlr=NULL;
- VertRen *v1, *v2, *v3, *v4;
- float ocfac[3], t00, t01, t02;
- float rtf[4][3];
- int v;
- int a, b, c, oc1, oc2, oc3, oc4, x, y, z, ocres2;
- short rts[4][3], ocmin[6], *ocmax;
- char *ocface; // front, top, size view of face, to fill in
- double lasttime= PIL_check_seconds_timer();
-
- oc= &re->oc;
- oc->adrbranch= MEM_callocN(sizeof(void *)*BRANCH_ARRAY, "octree branches");
- oc->adrnode= MEM_callocN(sizeof(void *)*NODE_ARRAY, "octree nodes");
-
- ocmax= ocmin+3;
-
- /* only for debug info */
- raycount=0;
- accepted= 0;
- rejected= 0;
- coherent_ray= 0;
-
- /* fill main octree struct */
- oc->ocres= re->r.ocres;
- ocres2= oc->ocres*oc->ocres;
- INIT_MINMAX(oc->min, oc->max);
-
- /* first min max octree space */
- for(v=0;v<re->totvlak;v++) {
- if((v & 255)==0) vlr= re->vlaknodes[v>>8].vlak;
- else vlr++;
- if(vlr->mat->mode & MA_TRACEBLE) {
- if((vlr->mat->mode & MA_WIRE)==0) {
-
- DO_MINMAX(vlr->v1->co, oc->min, oc->max);
- DO_MINMAX(vlr->v2->co, oc->min, oc->max);
- DO_MINMAX(vlr->v3->co, oc->min, oc->max);
- if(vlr->v4) {
- DO_MINMAX(vlr->v4->co, oc->min, oc->max);
- }
- }
- }
- }
-
- if(oc->min[0] > oc->max[0]) return; /* empty octree */
-
- oc->adrbranch[0]=(Branch *)MEM_callocN(4096*sizeof(Branch), "makeoctree");
-
- /* the lookup table, per face, for which nodes to fill in */
- ocface= MEM_callocN( 3*ocres2 + 8, "ocface");
- memset(ocface, 0, 3*ocres2);
-
- for(c=0;c<3;c++) { /* octree enlarge, still needed? */
- oc->min[c]-= 0.01f;
- oc->max[c]+= 0.01f;
- }
-
- t00= oc->max[0]-oc->min[0];
- t01= oc->max[1]-oc->min[1];
- t02= oc->max[2]-oc->min[2];
-
- /* this minus 0.1 is old safety... seems to be needed? */
- oc->ocfacx=ocfac[0]= (oc->ocres-0.1)/t00;
- oc->ocfacy=ocfac[1]= (oc->ocres-0.1)/t01;
- oc->ocfacz=ocfac[2]= (oc->ocres-0.1)/t02;
-
- oc->ocsize= sqrt(t00*t00+t01*t01+t02*t02); /* global, max size octree */
-
- for(v=0; v<re->totvlak; v++) {
- if((v & 255)==0) {
- double time= PIL_check_seconds_timer();
-
- vlr= re->vlaknodes[v>>8].vlak;
- if(re->test_break())
- break;
- if(time-lasttime>1.0f) {
- char str[32];
- sprintf(str, "Filling Octree: %d", v);
- re->i.infostr= str;
- re->stats_draw(&re->i);
- re->i.infostr= NULL;
- lasttime= time;
- }
- }
- else vlr++;
-
- if(vlr->mat->mode & MA_TRACEBLE) {
- if((vlr->mat->mode & MA_WIRE)==0) {
-
- v1= vlr->v1;
- v2= vlr->v2;
- v3= vlr->v3;
- v4= vlr->v4;
-
- for(c=0;c<3;c++) {
- rtf[0][c]= (v1->co[c]-oc->min[c])*ocfac[c] ;
- rts[0][c]= (short)rtf[0][c];
- rtf[1][c]= (v2->co[c]-oc->min[c])*ocfac[c] ;
- rts[1][c]= (short)rtf[1][c];
- rtf[2][c]= (v3->co[c]-oc->min[c])*ocfac[c] ;
- rts[2][c]= (short)rtf[2][c];
- if(v4) {
- rtf[3][c]= (v4->co[c]-oc->min[c])*ocfac[c] ;
- rts[3][c]= (short)rtf[3][c];
- }
- }
-
- for(c=0;c<3;c++) {
- oc1= rts[0][c];
- oc2= rts[1][c];
- oc3= rts[2][c];
- if(v4==NULL) {
- ocmin[c]= MIN3(oc1,oc2,oc3);
- ocmax[c]= MAX3(oc1,oc2,oc3);
- }
- else {
- oc4= rts[3][c];
- ocmin[c]= MIN4(oc1,oc2,oc3,oc4);
- ocmax[c]= MAX4(oc1,oc2,oc3,oc4);
- }
- if(ocmax[c]>oc->ocres-1) ocmax[c]=oc->ocres-1;
- if(ocmin[c]<0) ocmin[c]=0;
- }
-
- if(ocmin[0]==ocmax[0] && ocmin[1]==ocmax[1] && ocmin[2]==ocmax[2]) {
- ocwrite(oc, vlr, ocmin[0], ocmin[1], ocmin[2], rtf);
- }
- else {
-
- d2dda(oc, 0,1,0,1,ocface+ocres2,rts,rtf);
- d2dda(oc, 0,1,0,2,ocface,rts,rtf);
- d2dda(oc, 0,1,1,2,ocface+2*ocres2,rts,rtf);
- d2dda(oc, 1,2,0,1,ocface+ocres2,rts,rtf);
- d2dda(oc, 1,2,0,2,ocface,rts,rtf);
- d2dda(oc, 1,2,1,2,ocface+2*ocres2,rts,rtf);
- if(v4==NULL) {
- d2dda(oc, 2,0,0,1,ocface+ocres2,rts,rtf);
- d2dda(oc, 2,0,0,2,ocface,rts,rtf);
- d2dda(oc, 2,0,1,2,ocface+2*ocres2,rts,rtf);
- }
- else {
- d2dda(oc, 2,3,0,1,ocface+ocres2,rts,rtf);
- d2dda(oc, 2,3,0,2,ocface,rts,rtf);
- d2dda(oc, 2,3,1,2,ocface+2*ocres2,rts,rtf);
- d2dda(oc, 3,0,0,1,ocface+ocres2,rts,rtf);
- d2dda(oc, 3,0,0,2,ocface,rts,rtf);
- d2dda(oc, 3,0,1,2,ocface+2*ocres2,rts,rtf);
- }
- /* nothing todo with triangle..., just fills :) */
- filltriangle(oc, 0,1,ocface+ocres2,ocmin);
- filltriangle(oc, 0,2,ocface,ocmin);
- filltriangle(oc, 1,2,ocface+2*ocres2,ocmin);
-
- /* init static vars here */
- face_in_node(vlr, 0,0,0, rtf);
-
- for(x=ocmin[0];x<=ocmax[0];x++) {
- a= oc->ocres*x;
- for(y=ocmin[1];y<=ocmax[1];y++) {
- if(ocface[a+y+ocres2]) {
- b= oc->ocres*y+2*ocres2;
- for(z=ocmin[2];z<=ocmax[2];z++) {
- if(ocface[b+z] && ocface[a+z]) {
- if(face_in_node(NULL, x, y, z, rtf))
- ocwrite(oc, vlr, x,y,z, rtf);
- }
- }
- }
- }
- }
-
- /* same loops to clear octree, doubt it can be done smarter */
- for(x=ocmin[0];x<=ocmax[0];x++) {
- a= oc->ocres*x;
- for(y=ocmin[1];y<=ocmax[1];y++) {
- /* x-y */
- ocface[a+y+ocres2]= 0;
-
- b= oc->ocres*y + 2*ocres2;
- for(z=ocmin[2];z<=ocmax[2];z++) {
- /* y-z */
- ocface[b+z]= 0;
- /* x-z */
- ocface[a+z]= 0;
- }
- }
- }
- }
- }
- }
- }
-
- MEM_freeN(ocface);
- re->i.infostr= NULL;
- re->stats_draw(&re->i);
-}
-
-/* ************ raytracer **************** */
-
-/* only for self-intersecting test with current render face (where ray left) */
-static int intersection2(VlakRen *vlr, float r0, float r1, float r2, float rx1, float ry1, float rz1)
-{
- VertRen *v1,*v2,*v3,*v4=NULL;
- float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22;
- float m0, m1, m2, divdet, det, det1;
- float u1, v, u2;
-
- /* happens for baking with non existing face */
- if(vlr->v1==NULL)
- return 1;
-
- v1= vlr->v1;
- v2= vlr->v2;
- if(vlr->v4) {
- v3= vlr->v4;
- v4= vlr->v3;
- }
- else v3= vlr->v3;
-
- t00= v3->co[0]-v1->co[0];
- t01= v3->co[1]-v1->co[1];
- t02= v3->co[2]-v1->co[2];
- t10= v3->co[0]-v2->co[0];
- t11= v3->co[1]-v2->co[1];
- t12= v3->co[2]-v2->co[2];
-
- x0= t11*r2-t12*r1;
- x1= t12*r0-t10*r2;
- x2= t10*r1-t11*r0;
-
- divdet= t00*x0+t01*x1+t02*x2;
-
- m0= rx1-v3->co[0];
- m1= ry1-v3->co[1];
- m2= rz1-v3->co[2];
- det1= m0*x0+m1*x1+m2*x2;
-
- if(divdet!=0.0f) {
- u1= det1/divdet;
-
- if(u1<=0.0f) {
- det= t00*(m1*r2-m2*r1);
- det+= t01*(m2*r0-m0*r2);
- det+= t02*(m0*r1-m1*r0);
- v= det/divdet;
-
- if(v<=0.0f && (u1 + v) >= -1.0f) {
- return 1;
- }
- }
- }
-
- if(v4) {
-
- t20= v3->co[0]-v4->co[0];
- t21= v3->co[1]-v4->co[1];
- t22= v3->co[2]-v4->co[2];
-
- divdet= t20*x0+t21*x1+t22*x2;
- if(divdet!=0.0f) {
- u2= det1/divdet;
-
- if(u2<=0.0f) {
- det= t20*(m1*r2-m2*r1);
- det+= t21*(m2*r0-m0*r2);
- det+= t22*(m0*r1-m1*r0);
- v= det/divdet;
-
- if(v<=0.0f && (u2 + v) >= -1.0f) {
- return 2;
- }
- }
- }
- }
- return 0;
-}
-
-#if 0
-/* ray - line intersection */
-/* disabled until i got real & fast cylinder checking, this code doesnt work proper
-for faster strands */
-
-static int intersection_strand(Isect *is)
-{
- float v1[3], v2[3]; /* length of strand */
- float axis[3], rc[3], nor[3], radline, dist, len;
-
- /* radius strand */
- radline= 0.5f*VecLenf(is->vlr->v1->co, is->vlr->v2->co);
-
- VecMidf(v1, is->vlr->v1->co, is->vlr->v2->co);
- VecMidf(v2, is->vlr->v3->co, is->vlr->v4->co);
-
- VECSUB(rc, v1, is->start); /* vector from base ray to base cylinder */
- VECSUB(axis, v2, v1); /* cylinder axis */
-
- CROSS(nor, is->vec, axis);
- len= VecLength(nor);
-
- if(len<FLT_EPSILON)
- return 0;
-
- dist= INPR(rc, nor)/len; /* distance between ray and axis cylinder */
-
- if(dist<radline && dist>-radline) {
- float dot1, dot2, dot3, rlen, alen, div;
- float labda;
-
- /* calculating the intersection point of shortest distance */
- dot1 = INPR(rc, is->vec);
- dot2 = INPR(is->vec, axis);
- dot3 = INPR(rc, axis);
- rlen = INPR(is->vec, is->vec);
- alen = INPR(axis, axis);
-
- div = alen * rlen - dot2 * dot2;
- if (ABS(div) < FLT_EPSILON)
- return 0;
-
- labda = (dot1*dot2 - dot3*rlen)/div;
-
- radline/= sqrt(alen);
-
- /* labda: where on axis do we have closest intersection? */
- if(labda >= -radline && labda <= 1.0f+radline) {
- VlakRen *vlr= is->vlrorig;
- VertRen *v1= is->vlr->v1, *v2= is->vlr->v2, *v3= is->vlr->v3, *v4= is->vlr->v4;
- /* but we dont do shadows from faces sharing edge */
-
- if(v1==vlr->v1 || v2==vlr->v1 || v3==vlr->v1 || v4==vlr->v1) return 0;
- if(v1==vlr->v2 || v2==vlr->v2 || v3==vlr->v2 || v4==vlr->v2) return 0;
- if(v1==vlr->v3 || v2==vlr->v3 || v3==vlr->v3 || v4==vlr->v3) return 0;
- if(vlr->v4) {
- if(v1==vlr->v4 || v2==vlr->v4 || v3==vlr->v4 || v4==vlr->v4) return 0;
- }
- return 1;
- }
- }
- return 0;
-}
-#endif
-
-/* ray - triangle or quad intersection */
-static int intersection(Isect *is)
-{
- VertRen *v1,*v2,*v3,*v4=NULL;
- float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22,r0,r1,r2;
- float m0, m1, m2, divdet, det1;
- short ok=0;
-
- /* disabled until i got real & fast cylinder checking, this code doesnt work proper
- for faster strands */
-// if(is->mode==DDA_SHADOW && is->vlr->flag & R_STRAND)
-// return intersection_strand(is);
-
- v1= is->vlr->v1;
- v2= is->vlr->v2;
- if(is->vlr->v4) {
- v3= is->vlr->v4;
- v4= is->vlr->v3;
- }
- else v3= is->vlr->v3;
-
- t00= v3->co[0]-v1->co[0];
- t01= v3->co[1]-v1->co[1];
- t02= v3->co[2]-v1->co[2];
- t10= v3->co[0]-v2->co[0];
- t11= v3->co[1]-v2->co[1];
- t12= v3->co[2]-v2->co[2];
-
- r0= is->vec[0];
- r1= is->vec[1];
- r2= is->vec[2];
-
- x0= t12*r1-t11*r2;
- x1= t10*r2-t12*r0;
- x2= t11*r0-t10*r1;
-
- divdet= t00*x0+t01*x1+t02*x2;
-
- m0= is->start[0]-v3->co[0];
- m1= is->start[1]-v3->co[1];
- m2= is->start[2]-v3->co[2];
- det1= m0*x0+m1*x1+m2*x2;
-
- if(divdet!=0.0f) {
- float u;
-
- divdet= 1.0f/divdet;
- u= det1*divdet;
- if(u<0.0f && u>-1.0f) {
- float v, cros0, cros1, cros2;
-
- cros0= m1*t02-m2*t01;
- cros1= m2*t00-m0*t02;
- cros2= m0*t01-m1*t00;
- v= divdet*(cros0*r0 + cros1*r1 + cros2*r2);
-
- if(v<0.0f && (u + v) > -1.0f) {
- float labda;
- labda= divdet*(cros0*t10 + cros1*t11 + cros2*t12);
-
- if(labda>0.0f && labda<1.0f) {
- is->labda= labda;
- is->u= u; is->v= v;
- ok= 1;
- }
- }
- }
- }
-
- if(ok==0 && v4) {
-
- t20= v3->co[0]-v4->co[0];
- t21= v3->co[1]-v4->co[1];
- t22= v3->co[2]-v4->co[2];
-
- divdet= t20*x0+t21*x1+t22*x2;
- if(divdet!=0.0f) {
- float u;
- divdet= 1.0f/divdet;
- u = det1*divdet;
-
- if(u<0.0f && u>-1.0f) {
- float v, cros0, cros1, cros2;
- cros0= m1*t22-m2*t21;
- cros1= m2*t20-m0*t22;
- cros2= m0*t21-m1*t20;
- v= divdet*(cros0*r0 + cros1*r1 + cros2*r2);
-
- if(v<0.0f && (u + v) > -1.0f) {
- float labda;
- labda= divdet*(cros0*t10 + cros1*t11 + cros2*t12);
-
- if(labda>0.0f && labda<1.0f) {
- ok= 2;
- is->labda= labda;
- is->u= u; is->v= v;
- }
- }
- }
- }
- }
-
- if(ok) {
- is->isect= ok; // wich half of the quad
-
- if(is->mode!=DDA_SHADOW) {
- /* for mirror & tra-shadow: large faces can be filled in too often, this prevents
- a face being detected too soon... */
- if(is->labda > is->ddalabda) {
- return 0;
- }
- }
-
- /* when a shadow ray leaves a face, it can be little outside the edges of it, causing
- intersection to be detected in its neighbour face */
-
- if(is->vlrcontr && is->vlrisect); // optimizing, the tests below are not needed
- else if(is->labda< .1) {
- VlakRen *vlr= is->vlrorig;
- short de= 0;
-
- if(v1==vlr->v1 || v2==vlr->v1 || v3==vlr->v1 || v4==vlr->v1) de++;
- if(v1==vlr->v2 || v2==vlr->v2 || v3==vlr->v2 || v4==vlr->v2) de++;
- if(v1==vlr->v3 || v2==vlr->v3 || v3==vlr->v3 || v4==vlr->v3) de++;
- if(vlr->v4) {
- if(v1==vlr->v4 || v2==vlr->v4 || v3==vlr->v4 || v4==vlr->v4) de++;
- }
- if(de) {
-
- /* so there's a shared edge or vertex, let's intersect ray with vlr
- itself, if that's true we can safely return 1, otherwise we assume
- the intersection is invalid, 0 */
-
- if(is->vlrcontr==NULL) {
- is->vlrcontr= vlr;
- is->vlrisect= intersection2(vlr, -r0, -r1, -r2, is->start[0], is->start[1], is->start[2]);
- }
-
- if(is->vlrisect) return 1;
- return 0;
- }
- }
-
- return 1;
- }
-
- return 0;
-}
-
-/* check all faces in this node */
-static int testnode(Isect *is, Node *no, OcVal ocval)
-{
- VlakRen *vlr;
- short nr=0;
- OcVal *ov;
-
- /* return on any first hit */
- if(is->mode==DDA_SHADOW) {
-
- vlr= no->v[0];
- while(vlr) {
-
- if(is->vlrorig != vlr) {
-
- if(is->lay & vlr->lay) {
-
- ov= no->ov+nr;
- if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
- //accepted++;
- is->vlr= vlr;
-
- if(intersection(is)) {
- is->vlr_last= vlr;
- return 1;
- }
- }
- //else rejected++;
- }
- }
-
- nr++;
- if(nr==8) {
- no= no->next;
- if(no==0) return 0;
- nr=0;
- }
- vlr= no->v[nr];
- }
- }
- else { /* else mirror or glass or shadowtra, return closest face */
- Isect isect;
- int found= 0;
-
- is->labda= 1.0f; /* needed? */
- isect= *is; /* copy for sorting */
-
- vlr= no->v[0];
- while(vlr) {
-
- if(is->vlrorig != vlr) {
- /* I now... cpu cycle waste, might do smarter once */
- if(is->mode==DDA_MIRROR && (vlr->mat->mode & MA_ONLYCAST));
- else if(is->mode==DDA_SHADOW_TRA && !(is->lay & vlr->lay));
- else {
- ov= no->ov+nr;
- if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
- //accepted++;
-
- isect.vlr= vlr;
- if(intersection(&isect)) {
- if(isect.labda<is->labda) *is= isect;
- found= 1;
- }
- }
- //else rejected++;
- }
- }
-
- nr++;
- if(nr==8) {
- no= no->next;
- if(no==NULL) break;
- nr=0;
- }
- vlr= no->v[nr];
- }
-
- return found;
- }
-
- return 0;
-}
-
-/* find the Node for the octree coord x y z */
-static Node *ocread(int x, int y, int z)
-{
- Branch *br;
- int oc1;
-
- x<<=2;
- y<<=1;
-
- br= R.oc.adrbranch[0];
-
- if(R.oc.ocres==512) {
- oc1= ((x & 1024)+(y & 512)+(z & 256))>>8;
- br= br->b[oc1];
- if(br==NULL) {
- return NULL;
- }
- }
- if(R.oc.ocres>=256) {
- oc1= ((x & 512)+(y & 256)+(z & 128))>>7;
- br= br->b[oc1];
- if(br==NULL) {
- return NULL;
- }
- }
- if(R.oc.ocres>=128) {
- oc1= ((x & 256)+(y & 128)+(z & 64))>>6;
- br= br->b[oc1];
- if(br==NULL) {
- return NULL;
- }
- }
-
- oc1= ((x & 128)+(y & 64)+(z & 32))>>5;
- br= br->b[oc1];
- if(br) {
- oc1= ((x & 64)+(y & 32)+(z & 16))>>4;
- br= br->b[oc1];
- if(br) {
- oc1= ((x & 32)+(y & 16)+(z & 8))>>3;
- br= br->b[oc1];
- if(br) {
- oc1= ((x & 16)+(y & 8)+(z & 4))>>2;
- br= br->b[oc1];
- if(br) {
- oc1= ((x & 8)+(y & 4)+(z & 2))>>1;
- br= br->b[oc1];
- if(br) {
- oc1= ((x & 4)+(y & 2)+(z & 1));
- return (Node *)br->b[oc1];
- }
- }
- }
- }
- }
-
- return NULL;
-}
-
-static int cliptest(float p, float q, float *u1, float *u2)
-{
- float r;
-
- if(p<0.0f) {
- if(q<p) return 0;
- else if(q<0.0f) {
- r= q/p;
- if(r>*u2) return 0;
- else if(r>*u1) *u1=r;
- }
- }
- else {
- if(p>0.0f) {
- if(q<0.0f) return 0;
- else if(q<p) {
- r= q/p;
- if(r<*u1) return 0;
- else if(r<*u2) *u2=r;
- }
- }
- else if(q<0.0f) return 0;
- }
- return 1;
-}
-
-/* extensive coherence checks/storage cancels out the benefit of it, and gives errors... we
- need better methods, sample code commented out below (ton) */
-
-/*
-
-in top: static int coh_nodes[16*16*16][6];
-in makeoctree: memset(coh_nodes, 0, sizeof(coh_nodes));
-
-static void add_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
-{
- short *sp;
-
- sp= coh_nodes[ (ocx2 & 15) + 16*(ocy2 & 15) + 256*(ocz2 & 15) ];
- sp[0]= ocx1; sp[1]= ocy1; sp[2]= ocz1;
- sp[3]= ocx2; sp[4]= ocy2; sp[5]= ocz2;
-
-}
-
-static int do_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
-{
- short *sp;
-
- sp= coh_nodes[ (ocx2 & 15) + 16*(ocy2 & 15) + 256*(ocz2 & 15) ];
- if(sp[0]==ocx1 && sp[1]==ocy1 && sp[2]==ocz1 &&
- sp[3]==ocx2 && sp[4]==ocy2 && sp[5]==ocz2) return 1;
- return 0;
-}
-
-*/
-
-/* return 1: found valid intersection */
-/* starts with is->vlrorig */
-static int d3dda(Isect *is)
-{
- Node *no;
- OcVal ocval;
- float vec1[3], vec2[3];
- float u1,u2,ox1,ox2,oy1,oy2,oz1,oz2;
- float labdao,labdax,ldx,labday,ldy,labdaz,ldz, ddalabda;
- int dx,dy,dz;
- int xo,yo,zo,c1=0;
- int ocx1,ocx2,ocy1, ocy2,ocz1,ocz2;
-
- /* clip with octree */
- if(R.oc.branchcount==0) return 0;
-
- /* do this before intersect calls */
- is->vlrcontr= NULL; /* to check shared edge */
- is->vlrisect= is->isect= 0; /* shared edge, quad half flag */
-
- /* only for shadow! */
- if(is->mode==DDA_SHADOW) {
-
- /* check with last intersected shadow face */
- if(is->vlr_last!=NULL && is->vlr_last!=is->vlrorig) {
- if(is->lay & is->vlr_last->lay) {
- is->vlr= is->vlr_last;
- VECSUB(is->vec, is->end, is->start);
- if(intersection(is)) return 1;
- }
- }
- }
-
- ldx= is->end[0] - is->start[0];
- u1= 0.0f;
- u2= 1.0f;
-
- /* clip with octree cube */
- if(cliptest(-ldx, is->start[0]-R.oc.min[0], &u1,&u2)) {
- if(cliptest(ldx, R.oc.max[0]-is->start[0], &u1,&u2)) {
- ldy= is->end[1] - is->start[1];
- if(cliptest(-ldy, is->start[1]-R.oc.min[1], &u1,&u2)) {
- if(cliptest(ldy, R.oc.max[1]-is->start[1], &u1,&u2)) {
- ldz= is->end[2] - is->start[2];
- if(cliptest(-ldz, is->start[2]-R.oc.min[2], &u1,&u2)) {
- if(cliptest(ldz, R.oc.max[2]-is->start[2], &u1,&u2)) {
- c1=1;
- if(u2<1.0f) {
- is->end[0]= is->start[0]+u2*ldx;
- is->end[1]= is->start[1]+u2*ldy;
- is->end[2]= is->start[2]+u2*ldz;
- }
- if(u1>0.0f) {
- is->start[0]+=u1*ldx;
- is->start[1]+=u1*ldy;
- is->start[2]+=u1*ldz;
- }
- }
- }
- }
- }
- }
- }
-
- if(c1==0) return 0;
-
- /* reset static variables in ocread */
- //ocread(R.oc.ocres, 0, 0);
-
- /* setup 3dda to traverse octree */
- ox1= (is->start[0]-R.oc.min[0])*R.oc.ocfacx;
- oy1= (is->start[1]-R.oc.min[1])*R.oc.ocfacy;
- oz1= (is->start[2]-R.oc.min[2])*R.oc.ocfacz;
- ox2= (is->end[0]-R.oc.min[0])*R.oc.ocfacx;
- oy2= (is->end[1]-R.oc.min[1])*R.oc.ocfacy;
- oz2= (is->end[2]-R.oc.min[2])*R.oc.ocfacz;
-
- ocx1= (int)ox1;
- ocy1= (int)oy1;
- ocz1= (int)oz1;
- ocx2= (int)ox2;
- ocy2= (int)oy2;
- ocz2= (int)oz2;
-
- /* for intersection */
- VECSUB(is->vec, is->end, is->start);
-
- if(ocx1==ocx2 && ocy1==ocy2 && ocz1==ocz2) {
- no= ocread(ocx1, ocy1, ocz1);
- if(no) {
- /* exact intersection with node */
- vec1[0]= ox1; vec1[1]= oy1; vec1[2]= oz1;
- vec2[0]= ox2; vec2[1]= oy2; vec2[2]= oz2;
- calc_ocval_ray(&ocval, (float)ocx1, (float)ocy1, (float)ocz1, vec1, vec2);
- is->ddalabda= 1.0f;
- if( testnode(is, no, ocval) ) return 1;
- }
- }
- else {
- //static int coh_ocx1,coh_ocx2,coh_ocy1, coh_ocy2,coh_ocz1,coh_ocz2;
- float dox, doy, doz;
- int eqval;
-
- /* calc labda en ld */
- dox= ox1-ox2;
- doy= oy1-oy2;
- doz= oz1-oz2;
-
- if(dox<-FLT_EPSILON) {
- ldx= -1.0f/dox;
- labdax= (ocx1-ox1+1.0f)*ldx;
- dx= 1;
- } else if(dox>FLT_EPSILON) {
- ldx= 1.0f/dox;
- labdax= (ox1-ocx1)*ldx;
- dx= -1;
- } else {
- labdax=1.0f;
- ldx=0;
- dx= 0;
- }
-
- if(doy<-FLT_EPSILON) {
- ldy= -1.0f/doy;
- labday= (ocy1-oy1+1.0f)*ldy;
- dy= 1;
- } else if(doy>FLT_EPSILON) {
- ldy= 1.0f/doy;
- labday= (oy1-ocy1)*ldy;
- dy= -1;
- } else {
- labday=1.0f;
- ldy=0;
- dy= 0;
- }
-
- if(doz<-FLT_EPSILON) {
- ldz= -1.0f/doz;
- labdaz= (ocz1-oz1+1.0f)*ldz;
- dz= 1;
- } else if(doz>FLT_EPSILON) {
- ldz= 1.0f/doz;
- labdaz= (oz1-ocz1)*ldz;
- dz= -1;
- } else {
- labdaz=1.0f;
- ldz=0;
- dz= 0;
- }
-
- xo=ocx1; yo=ocy1; zo=ocz1;
- labdao= ddalabda= MIN3(labdax,labday,labdaz);
-
- vec2[0]= ox1;
- vec2[1]= oy1;
- vec2[2]= oz1;
-
- /* this loop has been constructed to make sure the first and last node of ray
- are always included, even when ddalabda==1.0f or larger */
-
- while(TRUE) {
-
- no= ocread(xo, yo, zo);
- if(no) {
-
- /* calculate ray intersection with octree node */
- VECCOPY(vec1, vec2);
- // dox,y,z is negative
- vec2[0]= ox1-ddalabda*dox;
- vec2[1]= oy1-ddalabda*doy;
- vec2[2]= oz1-ddalabda*doz;
- calc_ocval_ray(&ocval, (float)xo, (float)yo, (float)zo, vec1, vec2);
-
- is->ddalabda= ddalabda;
- if( testnode(is, no, ocval) ) return 1;
- }
-
- labdao= ddalabda;
-
- /* traversing ocree nodes need careful detection of smallest values, with proper
- exceptions for equal labdas */
- eqval= (labdax==labday);
- if(labday==labdaz) eqval += 2;
- if(labdax==labdaz) eqval += 4;
-
- if(eqval) { // only 4 cases exist!
- if(eqval==7) { // x=y=z
- xo+=dx; labdax+=ldx;
- yo+=dy; labday+=ldy;
- zo+=dz; labdaz+=ldz;
- }
- else if(eqval==1) { // x=y
- if(labday < labdaz) {
- xo+=dx; labdax+=ldx;
- yo+=dy; labday+=ldy;
- }
- else {
- zo+=dz; labdaz+=ldz;
- }
- }
- else if(eqval==2) { // y=z
- if(labdax < labday) {
- xo+=dx; labdax+=ldx;
- }
- else {
- yo+=dy; labday+=ldy;
- zo+=dz; labdaz+=ldz;
- }
- }
- else { // x=z
- if(labday < labdax) {
- yo+=dy; labday+=ldy;
- }
- else {
- xo+=dx; labdax+=ldx;
- zo+=dz; labdaz+=ldz;
- }
- }
- }
- else { // all three different, just three cases exist
- eqval= (labdax<labday);
- if(labday<labdaz) eqval += 2;
- if(labdax<labdaz) eqval += 4;
-
- if(eqval==7 || eqval==5) { // x smallest
- xo+=dx; labdax+=ldx;
- }
- else if(eqval==2 || eqval==6) { // y smallest
- yo+=dy; labday+=ldy;
- }
- else { // z smallest
- zo+=dz; labdaz+=ldz;
- }
-
- }
-
- ddalabda=MIN3(labdax,labday,labdaz);
- if(ddalabda==labdao) break;
- /* to make sure the last node is always checked */
- if(labdao>=1.0f) break;
- }
- }
-
- /* reached end, no intersections found */
- is->vlr_last= NULL;
- return 0;
-}
-
-
-static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
-{
- VlakRen *vlr= is->vlr;
- int osatex= 0, norflip;
-
- /* set up view vector */
- VECCOPY(shi->view, is->vec);
-
- /* render co */
- shi->co[0]= is->start[0]+is->labda*(shi->view[0]);
- shi->co[1]= is->start[1]+is->labda*(shi->view[1]);
- shi->co[2]= is->start[2]+is->labda*(shi->view[2]);
-
- Normalize(shi->view);
-
- shi->vlr= vlr;
- shi->mat= vlr->mat;
- memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); // note, keep this synced with render_types.h
- shi->har= shi->mat->har;
-
- // Osa structs we leave unchanged now
- SWAP(int, osatex, shi->osatex);
-
- shi->dxco[0]= shi->dxco[1]= shi->dxco[2]= 0.0f;
- shi->dyco[0]= shi->dyco[1]= shi->dyco[2]= 0.0f;
-
- // but, set Osa stuff to zero where it can confuse texture code
- if(shi->mat->texco & (TEXCO_NORM|TEXCO_REFL) ) {
- shi->dxno[0]= shi->dxno[1]= shi->dxno[2]= 0.0f;
- shi->dyno[0]= shi->dyno[1]= shi->dyno[2]= 0.0f;
- }
-
- /* face normal, check for flip, need to set puno here */
- norflip= (vlr->n[0]*shi->view[0]+vlr->n[1]*shi->view[1]+vlr->n[2]*shi->view[2]) < 0.0f;
-
- if(norflip)
- shi->puno= vlr->puno ^ 15;// only flip lower 4 bits
- else
- shi->puno= vlr->puno;
-
- if(vlr->v4) {
- if(is->isect==2)
- shade_input_set_triangle_i(shi, vlr, 2, 1, 3);
- else
- shade_input_set_triangle_i(shi, vlr, 0, 1, 3);
- }
- else {
- shade_input_set_triangle_i(shi, vlr, 0, 1, 2);
- }
-
- /* shade_input_set_triangle_i() sets facenor, now we flip */
- if(norflip) {
- shi->facenor[0]= -vlr->n[0];
- shi->facenor[1]= -vlr->n[1];
- shi->facenor[2]= -vlr->n[2];
- }
-
- shi->u= is->u;
- shi->v= is->v;
- shi->dx_u= shi->dx_v= shi->dy_u= shi->dy_v= 0.0f;
- shade_input_set_normals(shi);
- shade_input_set_shade_texco(shi);
-
- if(is->mode==DDA_SHADOW_TRA)
- shade_color(shi, shr);
- else {
- if(shi->mat->nodetree && shi->mat->use_nodes) {
- ntreeShaderExecTree(shi->mat->nodetree, shi, shr);
- shi->mat= vlr->mat; /* shi->mat is being set in nodetree */
- }
- else
- shade_material_loop(shi, shr);
-
- /* raytrace likes to separate the spec color */
- VECSUB(shr->diff, shr->combined, shr->spec);
- }
-
- SWAP(int, osatex, shi->osatex); // XXXXX!!!!
-
-}
-
-static int refraction(float *refract, float *n, float *view, float index)
-{
- float dot, fac;
-
- VECCOPY(refract, view);
-
- dot= view[0]*n[0] + view[1]*n[1] + view[2]*n[2];
-
- if(dot>0.0f) {
- index = 1.0f/index;
- fac= 1.0f - (1.0f - dot*dot)*index*index;
- if(fac<= 0.0f) return 0;
- fac= -dot*index + sqrt(fac);
- }
- else {
- fac= 1.0f - (1.0f - dot*dot)*index*index;
- if(fac<= 0.0f) return 0;
- fac= -dot*index - sqrt(fac);
- }
-
- refract[0]= index*view[0] + fac*n[0];
- refract[1]= index*view[1] + fac*n[1];
- refract[2]= index*view[2] + fac*n[2];
-
- return 1;
-}
-
-/* orn = original face normal */
-static void reflection(float *ref, float *n, float *view, float *orn)
-{
- float f1;
-
- f1= -2.0f*(n[0]*view[0]+ n[1]*view[1]+ n[2]*view[2]);
-
- ref[0]= (view[0]+f1*n[0]);
- ref[1]= (view[1]+f1*n[1]);
- ref[2]= (view[2]+f1*n[2]);
-
- if(orn) {
- /* test phong normals, then we should prevent vector going to the back */
- f1= ref[0]*orn[0]+ ref[1]*orn[1]+ ref[2]*orn[2];
- if(f1>0.0f) {
- f1+= .01f;
- ref[0]-= f1*orn[0];
- ref[1]-= f1*orn[1];
- ref[2]-= f1*orn[2];
- }
- }
-}
-
-#if 0
-static void color_combine(float *result, float fac1, float fac2, float *col1, float *col2)
-{
- float col1t[3], col2t[3];
-
- col1t[0]= sqrt(col1[0]);
- col1t[1]= sqrt(col1[1]);
- col1t[2]= sqrt(col1[2]);
- col2t[0]= sqrt(col2[0]);
- col2t[1]= sqrt(col2[1]);
- col2t[2]= sqrt(col2[2]);
-
- result[0]= (fac1*col1t[0] + fac2*col2t[0]);
- result[0]*= result[0];
- result[1]= (fac1*col1t[1] + fac2*col2t[1]);
- result[1]*= result[1];
- result[2]= (fac1*col1t[2] + fac2*col2t[2]);
- result[2]*= result[2];
-}
-#endif
-
-static float shade_by_transmission(Isect *is, ShadeInput *shi, ShadeResult *shr)
-{
- float dx, dy, dz, d, p;
-
- if (0 == (shi->mat->mode & (MA_RAYTRANSP|MA_ZTRA)))
- return -1;
-
- if (shi->mat->tx_limit <= 0.0f) {
- d= 1.0f;
- }
- else {
- /* shi.co[] calculated by shade_ray() */
- dx= shi->co[0] - is->start[0];
- dy= shi->co[1] - is->start[1];
- dz= shi->co[2] - is->start[2];
- d= sqrt(dx*dx+dy*dy+dz*dz);
- if (d > shi->mat->tx_limit)
- d= shi->mat->tx_limit;
-
- p = shi->mat->tx_falloff;
- if(p < 0.0f) p= 0.0f;
- else if (p > 10.0f) p= 10.0f;
-
- shr->alpha *= pow(d, p);
- if (shr->alpha > 1.0f)
- shr->alpha= 1.0f;
- }
-
- return d;
-}
-
-/* the main recursive tracer itself */
-static void traceray(ShadeInput *origshi, short depth, float *start, float *vec, float *col, VlakRen *vlr, int traflag)
-{
- ShadeInput shi;
- ShadeResult shr;
- Isect isec;
- float f, f1, fr, fg, fb;
- float ref[3];
-
- VECCOPY(isec.start, start);
- isec.end[0]= start[0]+R.oc.ocsize*vec[0];
- isec.end[1]= start[1]+R.oc.ocsize*vec[1];
- isec.end[2]= start[2]+R.oc.ocsize*vec[2];
- isec.mode= DDA_MIRROR;
- isec.vlrorig= vlr;
-
- if( d3dda(&isec) ) {
- float d= 1.0f;
-
- shi.mask= origshi->mask;
- shi.osatex= origshi->osatex;
- shi.depth= 1; /* only used to indicate tracing */
- shi.thread= origshi->thread;
- shi.sample= 0;
- shi.xs= origshi->xs;
- shi.ys= origshi->ys;
- shi.lay= origshi->lay;
- shi.passflag= SCE_PASS_COMBINED; /* result of tracing needs no pass info */
- shi.combinedflag= 0xFFFFFF; /* ray trace does all options */
- shi.do_preview= 0;
- shi.light_override= origshi->light_override;
- shi.mat_override= origshi->mat_override;
-
- memset(&shr, 0, sizeof(ShadeResult));
-
- shade_ray(&isec, &shi, &shr);
- if (traflag & RAY_TRA)
- d= shade_by_transmission(&isec, &shi, &shr);
-
- if(depth>0) {
-
- if(shi.mat->mode_l & (MA_RAYTRANSP|MA_ZTRA) && shr.alpha < 1.0f) {
- float nf, f, f1, refract[3], tracol[4];
-
- tracol[0]= shi.r;
- tracol[1]= shi.g;
- tracol[2]= shi.b;
- tracol[3]= col[3]; // we pass on and accumulate alpha
-
- if(shi.mat->mode & MA_RAYTRANSP) {
- /* odd depths: use normal facing viewer, otherwise flip */
- if(traflag & RAY_TRAFLIP) {
- float norm[3];
- norm[0]= - shi.vn[0];
- norm[1]= - shi.vn[1];
- norm[2]= - shi.vn[2];
- if (!refraction(refract, norm, shi.view, shi.ang))
- reflection(refract, norm, shi.view, shi.vn);
- }
- else {
- if (!refraction(refract, shi.vn, shi.view, shi.ang))
- reflection(refract, shi.vn, shi.view, shi.vn);
- }
- traflag |= RAY_TRA;
- traceray(origshi, depth-1, shi.co, refract, tracol, shi.vlr, traflag ^ RAY_TRAFLIP);
- }
- else
- traceray(origshi, depth-1, shi.co, shi.view, tracol, shi.vlr, 0);
-
- f= shr.alpha; f1= 1.0f-f;
- nf= d * shi.mat->filter;
- fr= 1.0f+ nf*(shi.r-1.0f);
- fg= 1.0f+ nf*(shi.g-1.0f);
- fb= 1.0f+ nf*(shi.b-1.0f);
- shr.diff[0]= f*shr.diff[0] + f1*fr*tracol[0];
- shr.diff[1]= f*shr.diff[1] + f1*fg*tracol[1];
- shr.diff[2]= f*shr.diff[2] + f1*fb*tracol[2];
-
- shr.spec[0] *=f;
- shr.spec[1] *=f;
- shr.spec[2] *=f;
-
- col[3]= f1*tracol[3] + f;
- }
- else
- col[3]= 1.0f;
-
- if(shi.mat->mode_l & MA_RAYMIRROR) {
- f= shi.ray_mirror;
- if(f!=0.0f) f*= fresnel_fac(shi.view, shi.vn, shi.mat->fresnel_mir_i, shi.mat->fresnel_mir);
- }
- else f= 0.0f;
-
- if(f!=0.0f) {
- float mircol[4];
-
- reflection(ref, shi.vn, shi.view, NULL);
- traceray(origshi, depth-1, shi.co, ref, mircol, shi.vlr, 0);
-
- f1= 1.0f-f;
-
- /* combine */
- //color_combine(col, f*fr*(1.0f-shr.spec[0]), f1, col, shr.diff);
- //col[0]+= shr.spec[0];
- //col[1]+= shr.spec[1];
- //col[2]+= shr.spec[2];
-
- fr= shi.mirr;
- fg= shi.mirg;
- fb= shi.mirb;
-
- col[0]= f*fr*(1.0f-shr.spec[0])*mircol[0] + f1*shr.diff[0] + shr.spec[0];
- col[1]= f*fg*(1.0f-shr.spec[1])*mircol[1] + f1*shr.diff[1] + shr.spec[1];
- col[2]= f*fb*(1.0f-shr.spec[2])*mircol[2] + f1*shr.diff[2] + shr.spec[2];
- }
- else {
- col[0]= shr.diff[0] + shr.spec[0];
- col[1]= shr.diff[1] + shr.spec[1];
- col[2]= shr.diff[2] + shr.spec[2];
- }
- }
- else {
- col[0]= shr.diff[0] + shr.spec[0];
- col[1]= shr.diff[1] + shr.spec[1];
- col[2]= shr.diff[2] + shr.spec[2];
- }
-
- }
- else { /* sky */
- VECCOPY(shi.view, vec);
- Normalize(shi.view);
-
- shadeSkyView(col, isec.start, shi.view, NULL);
- }
-}
-
-/* **************** jitter blocks ********** */
-
-/* calc distributed planar energy */
-
-static void DP_energy(float *table, float *vec, int tot, float xsize, float ysize)
-{
- int x, y, a;
- float *fp, force[3], result[3];
- float dx, dy, dist, min;
-
- min= MIN2(xsize, ysize);
- min*= min;
- result[0]= result[1]= 0.0f;
-
- for(y= -1; y<2; y++) {
- dy= ysize*y;
- for(x= -1; x<2; x++) {
- dx= xsize*x;
- fp= table;
- for(a=0; a<tot; a++, fp+= 2) {
- force[0]= vec[0] - fp[0]-dx;
- force[1]= vec[1] - fp[1]-dy;
- dist= force[0]*force[0] + force[1]*force[1];
- if(dist < min && dist>0.0f) {
- result[0]+= force[0]/dist;
- result[1]+= force[1]/dist;
- }
- }
- }
- }
- vec[0] += 0.1*min*result[0]/(float)tot;
- vec[1] += 0.1*min*result[1]/(float)tot;
- // cyclic clamping
- vec[0]= vec[0] - xsize*floor(vec[0]/xsize + 0.5);
- vec[1]= vec[1] - ysize*floor(vec[1]/ysize + 0.5);
-}
-
-// random offset of 1 in 2
-static void jitter_plane_offset(float *jitter1, float *jitter2, int tot, float sizex, float sizey, float ofsx, float ofsy)
-{
- float dsizex= sizex*ofsx;
- float dsizey= sizey*ofsy;
- float hsizex= 0.5*sizex, hsizey= 0.5*sizey;
- int x;
-
- for(x=tot; x>0; x--, jitter1+=2, jitter2+=2) {
- jitter2[0]= jitter1[0] + dsizex;
- jitter2[1]= jitter1[1] + dsizey;
- if(jitter2[0] > hsizex) jitter2[0]-= sizex;
- if(jitter2[1] > hsizey) jitter2[1]-= sizey;
- }
-}
-
-/* called from convertBlenderScene.c */
-/* we do this in advance to get consistant random, not alter the render seed, and be threadsafe */
-void init_jitter_plane(LampRen *lar)
-{
- float *fp;
- int x, iter=12, tot= lar->ray_totsamp;
-
- /* at least 4, or max threads+1 tables */
- if(BLENDER_MAX_THREADS < 4) x= 4;
- else x= BLENDER_MAX_THREADS+1;
- fp= lar->jitter= MEM_mallocN(x*tot*2*sizeof(float), "lamp jitter tab");
-
- /* set per-lamp fixed seed */
- BLI_srandom(tot);
-
- /* fill table with random locations, area_size large */
- for(x=0; x<tot; x++, fp+=2) {
- fp[0]= (BLI_frand()-0.5)*lar->area_size;
- fp[1]= (BLI_frand()-0.5)*lar->area_sizey;
- }
-
- while(iter--) {
- fp= lar->jitter;
- for(x=tot; x>0; x--, fp+=2) {
- DP_energy(lar->jitter, fp, tot, lar->area_size, lar->area_sizey);
- }
- }
-
- /* create the dithered tables (could just check lamp type!) */
- jitter_plane_offset(lar->jitter, lar->jitter+2*tot, tot, lar->area_size, lar->area_sizey, 0.5f, 0.0f);
- jitter_plane_offset(lar->jitter, lar->jitter+4*tot, tot, lar->area_size, lar->area_sizey, 0.5f, 0.5f);
- jitter_plane_offset(lar->jitter, lar->jitter+6*tot, tot, lar->area_size, lar->area_sizey, 0.0f, 0.5f);
-}
-
-/* table around origin, -0.5*size to 0.5*size */
-static float *give_jitter_plane(LampRen *lar, int thread, int xs, int ys)
-{
- int tot;
-
- tot= lar->ray_totsamp;
-
- if(lar->ray_samp_type & LA_SAMP_JITTER) {
- /* made it threadsafe */
-
- if(lar->xold[thread]!=xs || lar->yold[thread]!=ys) {
- jitter_plane_offset(lar->jitter, lar->jitter+2*(thread+1)*tot, tot, lar->area_size, lar->area_sizey, BLI_thread_frand(thread), BLI_thread_frand(thread));
- lar->xold[thread]= xs;
- lar->yold[thread]= ys;
- }
- return lar->jitter+2*(thread+1)*tot;
- }
- if(lar->ray_samp_type & LA_SAMP_DITHER) {
- return lar->jitter + 2*tot*((xs & 1)+2*(ys & 1));
- }
-
- return lar->jitter;
-}
-
-
-/* ***************** main calls ************** */
-
-
-/* extern call from render loop */
-void ray_trace(ShadeInput *shi, ShadeResult *shr)
-{
- VlakRen *vlr;
- float i, f, f1, fr, fg, fb, vec[3], mircol[4], tracol[4];
- float diff[3];
- int do_tra, do_mir;
-
- do_tra= ((shi->mat->mode & (MA_RAYTRANSP)) && shr->alpha!=1.0f);
- do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f);
- vlr= shi->vlr;
-
- /* raytrace mirror amd refract like to separate the spec color */
- if(shi->combinedflag & SCE_PASS_SPEC)
- VECSUB(diff, shr->combined, shr->spec) /* no ; */
- else
- VECCOPY(diff, shr->combined);
-
- if(do_tra) {
- float refract[3];
- float olddiff[3];
-
- tracol[3]= shr->alpha;
-
- refraction(refract, shi->vn, shi->view, shi->ang);
- traceray(shi, shi->mat->ray_depth_tra, shi->co, refract, tracol, shi->vlr, RAY_TRA|RAY_TRAFLIP);
-
- f= shr->alpha; f1= 1.0f-f;
- fr= 1.0f+ shi->mat->filter*(shi->r-1.0f);
- fg= 1.0f+ shi->mat->filter*(shi->g-1.0f);
- fb= 1.0f+ shi->mat->filter*(shi->b-1.0f);
-
- /* for refract pass */
- VECCOPY(olddiff, diff);
-
- diff[0]= f*diff[0] + f1*fr*tracol[0];
- diff[1]= f*diff[1] + f1*fg*tracol[1];
- diff[2]= f*diff[2] + f1*fb*tracol[2];
-
- if(shi->passflag & SCE_PASS_REFRACT)
- VECSUB(shr->refr, diff, olddiff);
-
- if(shi->combinedflag & SCE_PASS_REFRACT)
- VECCOPY(olddiff, diff);
-
- shr->alpha= tracol[3];
- }
-
- if(do_mir) {
-
- i= shi->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->mat->fresnel_mir_i, shi->mat->fresnel_mir);
- if(i!=0.0f) {
-
- fr= i*shi->mirr;
- fg= i*shi->mirg;
- fb= i*shi->mirb;
-
- if(vlr->flag & R_SMOOTH)
- reflection(vec, shi->vn, shi->view, shi->facenor);
- else
- reflection(vec, shi->vn, shi->view, NULL);
-
- traceray(shi, shi->mat->ray_depth, shi->co, vec, mircol, shi->vlr, 0);
-
- if(shi->passflag & SCE_PASS_REFLECT) {
- /* mirror pass is not blocked out with spec */
- shr->refl[0]= fr*mircol[0] - fr*diff[0];
- shr->refl[1]= fg*mircol[1] - fg*diff[1];
- shr->refl[2]= fb*mircol[2] - fb*diff[2];
- }
-
- if(shi->combinedflag & SCE_PASS_REFLECT) {
-
- f= fr*(1.0f-shr->spec[0]); f1= 1.0f-i;
- diff[0]= f*mircol[0] + f1*diff[0];
-
- f= fg*(1.0f-shr->spec[1]); f1= 1.0f-i;
- diff[1]= f*mircol[1] + f1*diff[1];
-
- f= fb*(1.0f-shr->spec[2]); f1= 1.0f-i;
- diff[2]= f*mircol[2] + f1*diff[2];
- }
- }
- }
- /* put back together */
- if(shi->combinedflag & SCE_PASS_SPEC)
- VECADD(shr->combined, diff, shr->spec) /* no ; */
- else
- VECCOPY(shr->combined, diff);
-}
-
-/* color 'shadfac' passes through 'col' with alpha and filter */
-/* filter is only applied on alpha defined transparent part */
-static void addAlphaLight(float *shadfac, float *col, float alpha, float filter)
-{
- float fr, fg, fb;
-
- fr= 1.0f+ filter*(col[0]-1.0f);
- fg= 1.0f+ filter*(col[1]-1.0f);
- fb= 1.0f+ filter*(col[2]-1.0f);
-
- shadfac[0]= alpha*col[0] + fr*(1.0f-alpha)*shadfac[0];
- shadfac[1]= alpha*col[1] + fg*(1.0f-alpha)*shadfac[1];
- shadfac[2]= alpha*col[2] + fb*(1.0f-alpha)*shadfac[2];
-
- shadfac[3]= (1.0f-alpha)*shadfac[3];
-}
-
-static void ray_trace_shadow_tra(Isect *is, int depth, int traflag)
-{
- /* ray to lamp, find first face that intersects, check alpha properties,
- if it has col[3]>0.0f continue. so exit when alpha is full */
- ShadeInput shi;
- ShadeResult shr;
-
- if( d3dda(is)) {
- float d= 1.0f;
- /* we got a face */
-
- shi.depth= 1; /* only used to indicate tracing */
- shi.mask= 1;
- shi.osatex= 0;
- shi.thread= shi.sample= 0;
- shi.lay= 0;
- shi.passflag= 0;
- shi.combinedflag= 0;
- shi.do_preview= 0;
- shi.light_override= NULL;
- shi.mat_override= NULL;
-
- shade_ray(is, &shi, &shr);
- if (traflag & RAY_TRA)
- d= shade_by_transmission(is, &shi, &shr);
-
- /* mix colors based on shadfac (rgb + amount of light factor) */
- addAlphaLight(is->col, shr.diff, shr.alpha, d*shi.mat->filter);
-
- if(depth>0 && is->col[3]>0.0f) {
-
- /* adapt isect struct */
- VECCOPY(is->start, shi.co);
- is->vlrorig= shi.vlr;
-
- ray_trace_shadow_tra(is, depth-1, traflag | RAY_TRA);
- }
- }
-}
-
-/* not used, test function for ambient occlusion (yaf: pathlight) */
-/* main problem; has to be called within shading loop, giving unwanted recursion */
-int ray_trace_shadow_rad(ShadeInput *ship, ShadeResult *shr)
-{
- static int counter=0, only_one= 0;
- extern float hashvectf[];
- Isect isec;
- ShadeInput shi;
- ShadeResult shr_t;
- float vec[3], accum[3], div= 0.0f;
- int a;
-
- if(only_one) {
- return 0;
- }
- only_one= 1;
-
- accum[0]= accum[1]= accum[2]= 0.0f;
- isec.mode= DDA_MIRROR;
- isec.vlrorig= ship->vlr;
-
- for(a=0; a<8*8; a++) {
-
- counter+=3;
- counter %= 768;
- VECCOPY(vec, hashvectf+counter);
- if(ship->vn[0]*vec[0]+ship->vn[1]*vec[1]+ship->vn[2]*vec[2]>0.0f) {
- vec[0]-= vec[0];
- vec[1]-= vec[1];
- vec[2]-= vec[2];
- }
- VECCOPY(isec.start, ship->co);
- isec.end[0]= isec.start[0] + R.oc.ocsize*vec[0];
- isec.end[1]= isec.start[1] + R.oc.ocsize*vec[1];
- isec.end[2]= isec.start[2] + R.oc.ocsize*vec[2];
-
- if( d3dda(&isec)) {
- float fac;
- shade_ray(&isec, &shi, &shr_t);
- fac= isec.labda*isec.labda;
- fac= 1.0f;
- accum[0]+= fac*(shr_t.diff[0]+shr_t.spec[0]);
- accum[1]+= fac*(shr_t.diff[1]+shr_t.spec[1]);
- accum[2]+= fac*(shr_t.diff[2]+shr_t.spec[2]);
- div+= fac;
- }
- else div+= 1.0f;
- }
-
- if(div!=0.0f) {
- shr->diff[0]+= accum[0]/div;
- shr->diff[1]+= accum[1]/div;
- shr->diff[2]+= accum[2]/div;
- }
- shr->alpha= 1.0f;
-
- only_one= 0;
- return 1;
-}
-
-/* aolight: function to create random unit sphere vectors for total random sampling */
-static void RandomSpherical(float *v)
-{
- float r;
- v[2] = 2.f*BLI_frand()-1.f;
- if ((r = 1.f - v[2]*v[2])>0.f) {
- float a = 6.283185307f*BLI_frand();
- r = sqrt(r);
- v[0] = r * cos(a);
- v[1] = r * sin(a);
- }
- else v[2] = 1.f;
-}
-
-/* calc distributed spherical energy */
-static void DS_energy(float *sphere, int tot, float *vec)
-{
- float *fp, fac, force[3], res[3];
- int a;
-
- res[0]= res[1]= res[2]= 0.0f;
-
- for(a=0, fp=sphere; a<tot; a++, fp+=3) {
- VecSubf(force, vec, fp);
- fac= force[0]*force[0] + force[1]*force[1] + force[2]*force[2];
- if(fac!=0.0f) {
- fac= 1.0f/fac;
- res[0]+= fac*force[0];
- res[1]+= fac*force[1];
- res[2]+= fac*force[2];
- }
- }
-
- VecMulf(res, 0.5);
- VecAddf(vec, vec, res);
- Normalize(vec);
-
-}
-
-/* called from convertBlenderScene.c */
-/* creates an equally distributed spherical sample pattern */
-/* and allocates threadsafe memory */
-void init_ao_sphere(World *wrld)
-{
- float *fp;
- int a, tot, iter= 16;
-
- /* we make twice the amount of samples, because only a hemisphere is used */
- tot= 2*wrld->aosamp*wrld->aosamp;
-
- wrld->aosphere= MEM_mallocN(3*tot*sizeof(float), "AO sphere");
-
- /* fixed random */
- BLI_srandom(tot);
-
- /* init */
- fp= wrld->aosphere;
- for(a=0; a<tot; a++, fp+= 3) {
- RandomSpherical(fp);
- }
-
- while(iter--) {
- for(a=0, fp= wrld->aosphere; a<tot; a++, fp+= 3) {
- DS_energy(wrld->aosphere, tot, fp);
- }
- }
-
- /* tables */
- wrld->aotables= MEM_mallocN(BLENDER_MAX_THREADS*3*tot*sizeof(float), "AO tables");
-}
-
-/* give per thread a table, we have to compare xs ys because of way OSA works... */
-static float *threadsafe_table_sphere(int test, int thread, int xs, int ys, int tot)
-{
- static int xso[BLENDER_MAX_THREADS], yso[BLENDER_MAX_THREADS];
- static int firsttime= 1;
-
- if(firsttime) {
- memset(xso, 255, sizeof(xso));
- memset(yso, 255, sizeof(yso));
- firsttime= 0;
- }
-
- if(xs==xso[thread] && ys==yso[thread]) return R.wrld.aotables+ thread*tot*3;
- if(test) return NULL;
- xso[thread]= xs; yso[thread]= ys;
- return R.wrld.aotables+ thread*tot*3;
-}
-
-static float *sphere_sampler(int type, int resol, int thread, int xs, int ys)
-{
- int tot;
- float *vec;
-
- if(resol>16) resol= 16;
-
- tot= 2*resol*resol;
-
- if (type & WO_AORNDSMP) {
- static float sphere[2*3*256];
- int a;
-
- /* total random sampling. NOT THREADSAFE! (should be removed, is not useful) */
- vec= sphere;
- for (a=0; a<tot; a++, vec+=3) {
- RandomSpherical(vec);
- }
-
- return sphere;
- }
- else {
- float *sphere;
- float cosfi, sinfi, cost, sint;
- float ang, *vec1;
- int a;
-
- sphere= threadsafe_table_sphere(1, thread, xs, ys, tot); // returns table if xs and ys were equal to last call
- if(sphere==NULL) {
- sphere= threadsafe_table_sphere(0, thread, xs, ys, tot);
-
- // random rotation
- ang= BLI_thread_frand(thread);
- sinfi= sin(ang); cosfi= cos(ang);
- ang= BLI_thread_frand(thread);
- sint= sin(ang); cost= cos(ang);
-
- vec= R.wrld.aosphere;
- vec1= sphere;
- for (a=0; a<tot; a++, vec+=3, vec1+=3) {
- vec1[0]= cost*cosfi*vec[0] - sinfi*vec[1] + sint*cosfi*vec[2];
- vec1[1]= cost*sinfi*vec[0] + cosfi*vec[1] + sint*sinfi*vec[2];
- vec1[2]= -sint*vec[0] + cost*vec[2];
- }
- }
- return sphere;
- }
-}
-
-
-/* extern call from shade_lamp_loop, ambient occlusion calculus */
-void ray_ao(ShadeInput *shi, float *shadfac)
-{
- Isect isec;
- float *vec, *nrm, div, bias, sh=0.0f;
- float maxdist = R.wrld.aodist;
- float dxyview[3];
- int j= -1, tot, actual=0, skyadded=0, aocolor;
-
- isec.vlrorig= shi->vlr;
- isec.vlr_last= NULL;
- isec.mode= (R.wrld.aomode & WO_AODIST)?DDA_SHADOW_TRA:DDA_SHADOW;
- isec.lay= -1;
-
- shadfac[0]= shadfac[1]= shadfac[2]= 0.0f;
-
- /* bias prevents smoothed faces to appear flat */
- if(shi->vlr->flag & R_SMOOTH) {
- bias= G.scene->world->aobias;
- nrm= shi->vn;
- }
- else {
- bias= 0.0f;
- nrm= shi->facenor;
- }
-
- /* prevent sky colors to be added for only shadow (shadow becomes alpha) */
- aocolor= R.wrld.aocolor;
- if(shi->mat->mode & MA_ONLYSHADOW)
- aocolor= WO_AOPLAIN;
-
- vec= sphere_sampler(R.wrld.aomode, R.wrld.aosamp, shi->thread, shi->xs, shi->ys);
-
- // warning: since we use full sphere now, and dotproduct is below, we do twice as much
- tot= 2*R.wrld.aosamp*R.wrld.aosamp;
-
- if(aocolor == WO_AOSKYTEX) {
- dxyview[0]= 1.0f/(float)R.wrld.aosamp;
- dxyview[1]= 1.0f/(float)R.wrld.aosamp;
- dxyview[2]= 0.0f;
- }
-
- while(tot--) {
-
- if ((vec[0]*nrm[0] + vec[1]*nrm[1] + vec[2]*nrm[2]) > bias) {
- /* only ao samples for mask */
- if(R.r.mode & R_OSA) {
- j++;
- if(j==R.osa) j= 0;
- if(!(shi->mask & (1<<j))) {
- vec+=3;
- continue;
- }
- }
-
- actual++;
-
- /* always set start/end, 3dda clips it */
- VECCOPY(isec.start, shi->co);
- isec.end[0] = shi->co[0] - maxdist*vec[0];
- isec.end[1] = shi->co[1] - maxdist*vec[1];
- isec.end[2] = shi->co[2] - maxdist*vec[2];
-
- /* do the trace */
- if (d3dda(&isec)) {
- if (R.wrld.aomode & WO_AODIST) sh+= exp(-isec.labda*R.wrld.aodistfac);
- else sh+= 1.0f;
- }
- else if(aocolor!=WO_AOPLAIN) {
- float skycol[4];
- float fac, view[3];
-
- view[0]= -vec[0];
- view[1]= -vec[1];
- view[2]= -vec[2];
- Normalize(view);
-
- if(aocolor==WO_AOSKYCOL) {
- fac= 0.5*(1.0f+view[0]*R.grvec[0]+ view[1]*R.grvec[1]+ view[2]*R.grvec[2]);
- shadfac[0]+= (1.0f-fac)*R.wrld.horr + fac*R.wrld.zenr;
- shadfac[1]+= (1.0f-fac)*R.wrld.horg + fac*R.wrld.zeng;
- shadfac[2]+= (1.0f-fac)*R.wrld.horb + fac*R.wrld.zenb;
- }
- else { /* WO_AOSKYTEX */
- shadeSkyView(skycol, isec.start, view, dxyview);
- shadfac[0]+= skycol[0];
- shadfac[1]+= skycol[1];
- shadfac[2]+= skycol[2];
- }
- skyadded++;
- }
- }
- // samples
- vec+= 3;
- }
-
- if(actual==0) sh= 1.0f;
- else sh = 1.0f - sh/((float)actual);
-
- if(aocolor!=WO_AOPLAIN && skyadded) {
- div= sh/((float)skyadded);
-
- shadfac[0]*= div; // average color times distances/hits formula
- shadfac[1]*= div; // average color times distances/hits formula
- shadfac[2]*= div; // average color times distances/hits formula
- }
- else {
- shadfac[0]= shadfac[1]= shadfac[2]= sh;
- }
-}
-
-
-
-/* extern call from shade_lamp_loop */
-void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
-{
- Isect isec;
- float lampco[3];
-
- /* setup isec */
- if(shi->mat->mode & MA_SHADOW_TRA) isec.mode= DDA_SHADOW_TRA;
- else isec.mode= DDA_SHADOW;
-
- if(lar->mode & LA_LAYER) isec.lay= lar->lay; else isec.lay= -1;
-
- /* only when not mir tracing, first hit optimm */
- if(shi->depth==0)
- isec.vlr_last= lar->vlr_last[shi->thread];
- else
- isec.vlr_last= NULL;
-
-
- if(lar->type==LA_SUN || lar->type==LA_HEMI) {
- lampco[0]= shi->co[0] - R.oc.ocsize*lar->vec[0];
- lampco[1]= shi->co[1] - R.oc.ocsize*lar->vec[1];
- lampco[2]= shi->co[2] - R.oc.ocsize*lar->vec[2];
- }
- else {
- VECCOPY(lampco, lar->co);
- }
-
- if(lar->ray_totsamp<2) {
-
- isec.vlrorig= shi->vlr;
- shadfac[3]= 1.0f; // 1.0=full light
-
- /* set up isec vec */
- VECCOPY(isec.start, shi->co);
- VECCOPY(isec.end, lampco);
-
- if(isec.mode==DDA_SHADOW_TRA) {
- /* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
- isec.col[0]= isec.col[1]= isec.col[2]= 1.0f;
- isec.col[3]= 1.0f;
-
- ray_trace_shadow_tra(&isec, DEPTH_SHADOW_TRA, 0);
- QUATCOPY(shadfac, isec.col);
- //printf("shadfac %f %f %f %f\n", shadfac[0], shadfac[1], shadfac[2], shadfac[3]);
- }
- else if( d3dda(&isec)) shadfac[3]= 0.0f;
- }
- else {
- /* area soft shadow */
- float *jitlamp;
- float fac=0.0f, div=0.0f, vec[3];
- int a, j= -1, mask;
-
- if(isec.mode==DDA_SHADOW_TRA) {
- shadfac[0]= shadfac[1]= shadfac[2]= shadfac[3]= 0.0f;
- }
- else shadfac[3]= 1.0f; // 1.0=full light
-
- fac= 0.0f;
- jitlamp= give_jitter_plane(lar, shi->thread, shi->xs, shi->ys);
-
- a= lar->ray_totsamp;
-
- /* this correction to make sure we always take at least 1 sample */
- mask= shi->mask;
- if(a==4) mask |= (mask>>4)|(mask>>8);
- else if(a==9) mask |= (mask>>9);
-
- while(a--) {
-
- if(R.r.mode & R_OSA) {
- j++;
- if(j>=R.osa) j= 0;
- if(!(mask & (1<<j))) {
- jitlamp+= 2;
- continue;
- }
- }
-
- isec.vlrorig= shi->vlr; // ray_trace_shadow_tra changes it
-
- vec[0]= jitlamp[0];
- vec[1]= jitlamp[1];
- vec[2]= 0.0f;
- Mat3MulVecfl(lar->mat, vec);
-
- /* set start and end, d3dda clips it */
- VECCOPY(isec.start, shi->co);
- isec.end[0]= lampco[0]+vec[0];
- isec.end[1]= lampco[1]+vec[1];
- isec.end[2]= lampco[2]+vec[2];
-
- if(isec.mode==DDA_SHADOW_TRA) {
- /* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
- isec.col[0]= isec.col[1]= isec.col[2]= 1.0f;
- isec.col[3]= 1.0f;
-
- ray_trace_shadow_tra(&isec, DEPTH_SHADOW_TRA, 0);
- shadfac[0] += isec.col[0];
- shadfac[1] += isec.col[1];
- shadfac[2] += isec.col[2];
- shadfac[3] += isec.col[3];
- }
- else if( d3dda(&isec) ) fac+= 1.0f;
-
- div+= 1.0f;
- jitlamp+= 2;
- }
-
- if(isec.mode==DDA_SHADOW_TRA) {
- shadfac[0] /= div;
- shadfac[1] /= div;
- shadfac[2] /= div;
- shadfac[3] /= div;
- }
- else {
- // sqrt makes nice umbra effect
- if(lar->ray_samp_type & LA_SAMP_UMBRA)
- shadfac[3]= sqrt(1.0f-fac/div);
- else
- shadfac[3]= 1.0f-fac/div;
- }
- }
-
- /* for first hit optim, set last interesected shadow face */
- if(shi->depth==0)
- lar->vlr_last[shi->thread]= isec.vlr_last;
-
-}
-
-/* only when face points away from lamp, in direction of lamp, trace ray and find first exit point */
-void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co)
-{
- Isect isec;
- float lampco[3];
-
- /* setup isec */
- isec.mode= DDA_SHADOW_TRA;
-
- if(lar->mode & LA_LAYER) isec.lay= lar->lay; else isec.lay= -1;
-
- if(lar->type==LA_SUN || lar->type==LA_HEMI) {
- lampco[0]= shi->co[0] - R.oc.ocsize*lar->vec[0];
- lampco[1]= shi->co[1] - R.oc.ocsize*lar->vec[1];
- lampco[2]= shi->co[2] - R.oc.ocsize*lar->vec[2];
- }
- else {
- VECCOPY(lampco, lar->co);
- }
-
- isec.vlrorig= shi->vlr;
-
- /* set up isec vec */
- VECCOPY(isec.start, shi->co);
- VECCOPY(isec.end, lampco);
-
- if( d3dda(&isec)) {
- /* we got a face */
-
- /* render co */
- co[0]= isec.start[0]+isec.labda*(isec.vec[0]);
- co[1]= isec.start[1]+isec.labda*(isec.vec[1]);
- co[2]= isec.start[2]+isec.labda*(isec.vec[2]);
-
- *distfac= VecLength(isec.vec);
- }
- else
- *distfac= 0.0f;
-}
-
-
diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c
new file mode 100644
index 00000000000..e7345c106a6
--- /dev/null
+++ b/source/blender/render/intern/source/rayshade.c
@@ -0,0 +1,2020 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 1990-1998 NeoGeo BV.
+ * All rights reserved.
+ *
+ * Contributors: 2004/2005 Blender Foundation, full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_material_types.h"
+#include "DNA_lamp_types.h"
+
+#include "BKE_global.h"
+#include "BKE_node.h"
+#include "BKE_utildefines.h"
+
+#include "BLI_arithb.h"
+#include "BLI_rand.h"
+#include "BLI_jitter.h"
+
+#include "PIL_time.h"
+
+#include "render_types.h"
+#include "renderpipeline.h"
+#include "rendercore.h"
+#include "renderdatabase.h"
+#include "pixelblending.h"
+#include "pixelshading.h"
+#include "shading.h"
+#include "texture.h"
+
+#include "RE_raytrace.h"
+
+#define RAY_TRA 1
+#define RAY_TRAFLIP 2
+
+#define DEPTH_SHADOW_TRA 10
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+/* defined in pipeline.c, is hardcopy of active dynamic allocated Render */
+/* only to be used here in this file, it's for speed */
+extern struct Render R;
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+static void vlr_face_coords(RayFace *face, float **v1, float **v2, float **v3, float **v4)
+{
+ VlakRen *vlr= (VlakRen*)face;
+
+ *v1 = (vlr->v1)? vlr->v1->co: NULL;
+ *v2 = (vlr->v2)? vlr->v2->co: NULL;
+ *v3 = (vlr->v3)? vlr->v3->co: NULL;
+ *v4 = (vlr->v4)? vlr->v4->co: NULL;
+}
+
+static int vlr_check_intersect(Isect *is, RayFace *face)
+{
+ VlakRen *vlr = (VlakRen*)face;
+
+ /* I know... cpu cycle waste, might do smarter once */
+ if(is->mode==RE_RAY_MIRROR)
+ return !(vlr->mat->mode & MA_ONLYCAST);
+ else
+ return (is->lay & vlr->lay);
+}
+
+void freeraytree(Render *re)
+{
+ if(re->raytree) {
+ RE_ray_tree_free(re->raytree);
+ re->raytree= NULL;
+ }
+}
+
+void makeraytree(Render *re)
+{
+ VlakRen *vlr= NULL;
+ float min[3], max[3];
+ double lasttime= PIL_check_seconds_timer();
+ int v, totface = 0;
+
+ INIT_MINMAX(min, max);
+
+ /* first min max raytree space */
+ for(v=0;v<re->totvlak;v++) {
+ if((v & 255)==0) vlr= re->vlaknodes[v>>8].vlak;
+ else vlr++;
+ if(vlr->mat->mode & MA_TRACEBLE) {
+ if((vlr->mat->mode & MA_WIRE)==0) {
+
+ DO_MINMAX(vlr->v1->co, min, max);
+ DO_MINMAX(vlr->v2->co, min, max);
+ DO_MINMAX(vlr->v3->co, min, max);
+ if(vlr->v4) {
+ DO_MINMAX(vlr->v4->co, min, max);
+ }
+
+ totface++;
+ }
+ }
+ }
+
+ re->raytree= RE_ray_tree_create(re->r.ocres, totface, min, max, vlr_face_coords, vlr_check_intersect);
+
+ if(min[0] > max[0]) { /* empty raytree */
+ RE_ray_tree_done(re->raytree);
+ return;
+ }
+
+ for(v=0; v<re->totvlak; v++) {
+ if((v & 255)==0) {
+ double time= PIL_check_seconds_timer();
+
+ vlr= re->vlaknodes[v>>8].vlak;
+ if(re->test_break())
+ break;
+ if(time-lasttime>1.0f) {
+ char str[32];
+ sprintf(str, "Filling Octree: %d", v);
+ re->i.infostr= str;
+ re->stats_draw(&re->i);
+ re->i.infostr= NULL;
+ lasttime= time;
+ }
+ }
+ else vlr++;
+
+ if(vlr->mat->mode & MA_TRACEBLE) {
+ if((vlr->mat->mode & MA_WIRE)==0) {
+ RE_ray_tree_add_face(re->raytree, (RayFace*)vlr);
+ }
+ }
+ }
+
+ RE_ray_tree_done(re->raytree);
+
+ re->i.infostr= NULL;
+ re->stats_draw(&re->i);
+}
+
+static void shade_ray(Isect *is, ShadeInput *shi, ShadeResult *shr)
+{
+ VlakRen *vlr= (VlakRen*)is->face;
+ int osatex= 0, norflip;
+
+ /* set up view vector */
+ VECCOPY(shi->view, is->vec);
+
+ /* render co */
+ shi->co[0]= is->start[0]+is->labda*(shi->view[0]);
+ shi->co[1]= is->start[1]+is->labda*(shi->view[1]);
+ shi->co[2]= is->start[2]+is->labda*(shi->view[2]);
+
+ Normalize(shi->view);
+
+ shi->vlr= vlr;
+ shi->mat= vlr->mat;
+ memcpy(&shi->r, &shi->mat->r, 23*sizeof(float)); // note, keep this synced with render_types.h
+ shi->har= shi->mat->har;
+
+ // Osa structs we leave unchanged now
+ SWAP(int, osatex, shi->osatex);
+
+ shi->dxco[0]= shi->dxco[1]= shi->dxco[2]= 0.0f;
+ shi->dyco[0]= shi->dyco[1]= shi->dyco[2]= 0.0f;
+
+ // but, set Osa stuff to zero where it can confuse texture code
+ if(shi->mat->texco & (TEXCO_NORM|TEXCO_REFL) ) {
+ shi->dxno[0]= shi->dxno[1]= shi->dxno[2]= 0.0f;
+ shi->dyno[0]= shi->dyno[1]= shi->dyno[2]= 0.0f;
+ }
+
+ /* face normal, check for flip, need to set puno here */
+ norflip= (vlr->n[0]*shi->view[0]+vlr->n[1]*shi->view[1]+vlr->n[2]*shi->view[2]) < 0.0f;
+
+ if(norflip)
+ shi->puno= vlr->puno ^ 15;// only flip lower 4 bits
+ else
+ shi->puno= vlr->puno;
+
+ if(vlr->v4) {
+ if(is->isect==2)
+ shade_input_set_triangle_i(shi, vlr, 2, 1, 3);
+ else
+ shade_input_set_triangle_i(shi, vlr, 0, 1, 3);
+ }
+ else {
+ shade_input_set_triangle_i(shi, vlr, 0, 1, 2);
+ }
+
+ /* shade_input_set_triangle_i() sets facenor, now we flip */
+ if(norflip) {
+ shi->facenor[0]= -vlr->n[0];
+ shi->facenor[1]= -vlr->n[1];
+ shi->facenor[2]= -vlr->n[2];
+ }
+
+ shi->u= is->u;
+ shi->v= is->v;
+ shi->dx_u= shi->dx_v= shi->dy_u= shi->dy_v= 0.0f;
+ shade_input_set_normals(shi);
+ shade_input_set_shade_texco(shi);
+
+ if(is->mode==RE_RAY_SHADOW_TRA)
+ shade_color(shi, shr);
+ else {
+ if(shi->mat->nodetree && shi->mat->use_nodes) {
+ ntreeShaderExecTree(shi->mat->nodetree, shi, shr);
+ shi->mat= vlr->mat; /* shi->mat is being set in nodetree */
+ }
+ else
+ shade_material_loop(shi, shr);
+
+ /* raytrace likes to separate the spec color */
+ VECSUB(shr->diff, shr->combined, shr->spec);
+ }
+
+ SWAP(int, osatex, shi->osatex); // XXXXX!!!!
+
+}
+
+static int refraction(float *refract, float *n, float *view, float index)
+{
+ float dot, fac;
+
+ VECCOPY(refract, view);
+
+ dot= view[0]*n[0] + view[1]*n[1] + view[2]*n[2];
+
+ if(dot>0.0f) {
+ index = 1.0f/index;
+ fac= 1.0f - (1.0f - dot*dot)*index*index;
+ if(fac<= 0.0f) return 0;
+ fac= -dot*index + sqrt(fac);
+ }
+ else {
+ fac= 1.0f - (1.0f - dot*dot)*index*index;
+ if(fac<= 0.0f) return 0;
+ fac= -dot*index - sqrt(fac);
+ }
+
+ refract[0]= index*view[0] + fac*n[0];
+ refract[1]= index*view[1] + fac*n[1];
+ refract[2]= index*view[2] + fac*n[2];
+
+ return 1;
+}
+
+/* orn = original face normal */
+static void reflection(float *ref, float *n, float *view, float *orn)
+{
+ float f1;
+
+ f1= -2.0f*(n[0]*view[0]+ n[1]*view[1]+ n[2]*view[2]);
+
+ ref[0]= (view[0]+f1*n[0]);
+ ref[1]= (view[1]+f1*n[1]);
+ ref[2]= (view[2]+f1*n[2]);
+
+ if(orn) {
+ /* test phong normals, then we should prevent vector going to the back */
+ f1= ref[0]*orn[0]+ ref[1]*orn[1]+ ref[2]*orn[2];
+ if(f1>0.0f) {
+ f1+= .01f;
+ ref[0]-= f1*orn[0];
+ ref[1]-= f1*orn[1];
+ ref[2]-= f1*orn[2];
+ }
+ }
+}
+
+#if 0
+static void color_combine(float *result, float fac1, float fac2, float *col1, float *col2)
+{
+ float col1t[3], col2t[3];
+
+ col1t[0]= sqrt(col1[0]);
+ col1t[1]= sqrt(col1[1]);
+ col1t[2]= sqrt(col1[2]);
+ col2t[0]= sqrt(col2[0]);
+ col2t[1]= sqrt(col2[1]);
+ col2t[2]= sqrt(col2[2]);
+
+ result[0]= (fac1*col1t[0] + fac2*col2t[0]);
+ result[0]*= result[0];
+ result[1]= (fac1*col1t[1] + fac2*col2t[1]);
+ result[1]*= result[1];
+ result[2]= (fac1*col1t[2] + fac2*col2t[2]);
+ result[2]*= result[2];
+}
+#endif
+
+static float shade_by_transmission(Isect *is, ShadeInput *shi, ShadeResult *shr)
+{
+ float dx, dy, dz, d, p;
+
+ if (0 == (shi->mat->mode & (MA_RAYTRANSP|MA_ZTRA)))
+ return -1;
+
+ if (shi->mat->tx_limit <= 0.0f) {
+ d= 1.0f;
+ }
+ else {
+ /* shi.co[] calculated by shade_ray() */
+ dx= shi->co[0] - is->start[0];
+ dy= shi->co[1] - is->start[1];
+ dz= shi->co[2] - is->start[2];
+ d= sqrt(dx*dx+dy*dy+dz*dz);
+ if (d > shi->mat->tx_limit)
+ d= shi->mat->tx_limit;
+
+ p = shi->mat->tx_falloff;
+ if(p < 0.0f) p= 0.0f;
+ else if (p > 10.0f) p= 10.0f;
+
+ shr->alpha *= pow(d, p);
+ if (shr->alpha > 1.0f)
+ shr->alpha= 1.0f;
+ }
+
+ return d;
+}
+
+static void ray_fadeout_endcolor(float *col, ShadeInput *origshi, ShadeInput *shi, ShadeResult *shr, Isect *isec, float *vec)
+{
+ /* un-intersected rays get either rendered material colour or sky colour */
+ if (origshi->mat->fadeto_mir == MA_RAYMIR_FADETOMAT) {
+ VECCOPY(col, shr->combined);
+ } else if (origshi->mat->fadeto_mir == MA_RAYMIR_FADETOSKY) {
+ VECCOPY(shi->view, vec);
+ Normalize(shi->view);
+
+ shadeSkyView(col, isec->start, shi->view, NULL);
+ }
+}
+
+static void ray_fadeout(Isect *is, ShadeInput *shi, float *col, float *blendcol, float dist_mir)
+{
+ /* if fading out, linear blend against fade colour */
+ float blendfac;
+
+ blendfac = 1.0 - VecLenf(shi->co, is->start)/dist_mir;
+
+ col[0] = col[0]*blendfac + (1.0 - blendfac)*blendcol[0];
+ col[1] = col[1]*blendfac + (1.0 - blendfac)*blendcol[1];
+ col[2] = col[2]*blendfac + (1.0 - blendfac)*blendcol[2];
+}
+
+/* the main recursive tracer itself */
+static void traceray(ShadeInput *origshi, ShadeResult *origshr, short depth, float *start, float *vec, float *col, VlakRen *vlr, int traflag)
+{
+ ShadeInput shi;
+ ShadeResult shr;
+ Isect isec;
+ float f, f1, fr, fg, fb;
+ float ref[3], maxsize=RE_ray_tree_max_size(R.raytree);
+ float dist_mir = origshi->mat->dist_mir;
+
+ VECCOPY(isec.start, start);
+ if (dist_mir > 0.0) {
+ isec.end[0]= start[0]+dist_mir*vec[0];
+ isec.end[1]= start[1]+dist_mir*vec[1];
+ isec.end[2]= start[2]+dist_mir*vec[2];
+ } else {
+ isec.end[0]= start[0]+maxsize*vec[0];
+ isec.end[1]= start[1]+maxsize*vec[1];
+ isec.end[2]= start[2]+maxsize*vec[2];
+ }
+ isec.mode= RE_RAY_MIRROR;
+ isec.faceorig= (RayFace*)vlr;
+
+ if(RE_ray_tree_intersect(R.raytree, &isec)) {
+ float d= 1.0f;
+
+ shi.mask= origshi->mask;
+ shi.osatex= origshi->osatex;
+ shi.depth= 1; /* only used to indicate tracing */
+ shi.thread= origshi->thread;
+ shi.sample= 0;
+ shi.xs= origshi->xs;
+ shi.ys= origshi->ys;
+ shi.lay= origshi->lay;
+ shi.passflag= SCE_PASS_COMBINED; /* result of tracing needs no pass info */
+ shi.combinedflag= 0xFFFFFF; /* ray trace does all options */
+ shi.do_preview= 0;
+ shi.light_override= origshi->light_override;
+ shi.mat_override= origshi->mat_override;
+
+ memset(&shr, 0, sizeof(ShadeResult));
+
+ shade_ray(&isec, &shi, &shr);
+ if (traflag & RAY_TRA)
+ d= shade_by_transmission(&isec, &shi, &shr);
+
+ if(depth>0) {
+
+ if(shi.mat->mode_l & (MA_RAYTRANSP|MA_ZTRA) && shr.alpha < 1.0f) {
+ float nf, f, f1, refract[3], tracol[4];
+
+ tracol[0]= shi.r;
+ tracol[1]= shi.g;
+ tracol[2]= shi.b;
+ tracol[3]= col[3]; // we pass on and accumulate alpha
+
+ if(shi.mat->mode & MA_RAYTRANSP) {
+ /* odd depths: use normal facing viewer, otherwise flip */
+ if(traflag & RAY_TRAFLIP) {
+ float norm[3];
+ norm[0]= - shi.vn[0];
+ norm[1]= - shi.vn[1];
+ norm[2]= - shi.vn[2];
+ if (!refraction(refract, norm, shi.view, shi.ang))
+ reflection(refract, norm, shi.view, shi.vn);
+ }
+ else {
+ if (!refraction(refract, shi.vn, shi.view, shi.ang))
+ reflection(refract, shi.vn, shi.view, shi.vn);
+ }
+ traflag |= RAY_TRA;
+ traceray(origshi, origshr, depth-1, shi.co, refract, tracol, shi.vlr, traflag ^ RAY_TRAFLIP);
+ }
+ else
+ traceray(origshi, origshr, depth-1, shi.co, shi.view, tracol, shi.vlr, 0);
+
+ f= shr.alpha; f1= 1.0f-f;
+ nf= d * shi.mat->filter;
+ fr= 1.0f+ nf*(shi.r-1.0f);
+ fg= 1.0f+ nf*(shi.g-1.0f);
+ fb= 1.0f+ nf*(shi.b-1.0f);
+ shr.diff[0]= f*shr.diff[0] + f1*fr*tracol[0];
+ shr.diff[1]= f*shr.diff[1] + f1*fg*tracol[1];
+ shr.diff[2]= f*shr.diff[2] + f1*fb*tracol[2];
+
+ shr.spec[0] *=f;
+ shr.spec[1] *=f;
+ shr.spec[2] *=f;
+
+ col[3]= f1*tracol[3] + f;
+ }
+ else
+ col[3]= 1.0f;
+
+ if(shi.mat->mode_l & MA_RAYMIRROR) {
+ f= shi.ray_mirror;
+ if(f!=0.0f) f*= fresnel_fac(shi.view, shi.vn, shi.mat->fresnel_mir_i, shi.mat->fresnel_mir);
+ }
+ else f= 0.0f;
+
+ if(f!=0.0f) {
+ float mircol[4];
+
+ reflection(ref, shi.vn, shi.view, NULL);
+ traceray(origshi, origshr, depth-1, shi.co, ref, mircol, shi.vlr, 0);
+
+ f1= 1.0f-f;
+
+ /* combine */
+ //color_combine(col, f*fr*(1.0f-shr.spec[0]), f1, col, shr.diff);
+ //col[0]+= shr.spec[0];
+ //col[1]+= shr.spec[1];
+ //col[2]+= shr.spec[2];
+
+ fr= shi.mirr;
+ fg= shi.mirg;
+ fb= shi.mirb;
+
+ col[0]= f*fr*(1.0f-shr.spec[0])*mircol[0] + f1*shr.diff[0] + shr.spec[0];
+ col[1]= f*fg*(1.0f-shr.spec[1])*mircol[1] + f1*shr.diff[1] + shr.spec[1];
+ col[2]= f*fb*(1.0f-shr.spec[2])*mircol[2] + f1*shr.diff[2] + shr.spec[2];
+ }
+ else {
+ col[0]= shr.diff[0] + shr.spec[0];
+ col[1]= shr.diff[1] + shr.spec[1];
+ col[2]= shr.diff[2] + shr.spec[2];
+ }
+
+ if (dist_mir > 0.0) {
+ float blendcol[3];
+
+ /* max ray distance set, but found an intersection, so fade this colour
+ * out towards the sky/material colour for a smooth transition */
+ ray_fadeout_endcolor(blendcol, origshi, &shi, origshr, &isec, vec);
+ ray_fadeout(&isec, &shi, col, blendcol, dist_mir);
+ }
+ }
+ else {
+ col[0]= shr.diff[0] + shr.spec[0];
+ col[1]= shr.diff[1] + shr.spec[1];
+ col[2]= shr.diff[2] + shr.spec[2];
+ }
+
+ }
+ else {
+ ray_fadeout_endcolor(col, origshi, &shi, origshr, &isec, vec);
+ }
+}
+
+/* **************** jitter blocks ********** */
+
+/* calc distributed planar energy */
+
+static void DP_energy(float *table, float *vec, int tot, float xsize, float ysize)
+{
+ int x, y, a;
+ float *fp, force[3], result[3];
+ float dx, dy, dist, min;
+
+ min= MIN2(xsize, ysize);
+ min*= min;
+ result[0]= result[1]= 0.0f;
+
+ for(y= -1; y<2; y++) {
+ dy= ysize*y;
+ for(x= -1; x<2; x++) {
+ dx= xsize*x;
+ fp= table;
+ for(a=0; a<tot; a++, fp+= 2) {
+ force[0]= vec[0] - fp[0]-dx;
+ force[1]= vec[1] - fp[1]-dy;
+ dist= force[0]*force[0] + force[1]*force[1];
+ if(dist < min && dist>0.0f) {
+ result[0]+= force[0]/dist;
+ result[1]+= force[1]/dist;
+ }
+ }
+ }
+ }
+ vec[0] += 0.1*min*result[0]/(float)tot;
+ vec[1] += 0.1*min*result[1]/(float)tot;
+ // cyclic clamping
+ vec[0]= vec[0] - xsize*floor(vec[0]/xsize + 0.5);
+ vec[1]= vec[1] - ysize*floor(vec[1]/ysize + 0.5);
+}
+
+// random offset of 1 in 2
+static void jitter_plane_offset(float *jitter1, float *jitter2, int tot, float sizex, float sizey, float ofsx, float ofsy)
+{
+ float dsizex= sizex*ofsx;
+ float dsizey= sizey*ofsy;
+ float hsizex= 0.5*sizex, hsizey= 0.5*sizey;
+ int x;
+
+ for(x=tot; x>0; x--, jitter1+=2, jitter2+=2) {
+ jitter2[0]= jitter1[0] + dsizex;
+ jitter2[1]= jitter1[1] + dsizey;
+ if(jitter2[0] > hsizex) jitter2[0]-= sizex;
+ if(jitter2[1] > hsizey) jitter2[1]-= sizey;
+ }
+}
+
+/* called from convertBlenderScene.c */
+/* we do this in advance to get consistant random, not alter the render seed, and be threadsafe */
+void init_jitter_plane(LampRen *lar)
+{
+ float *fp;
+ int x, iter=12, tot= lar->ray_totsamp;
+
+ /* at least 4, or max threads+1 tables */
+ if(BLENDER_MAX_THREADS < 4) x= 4;
+ else x= BLENDER_MAX_THREADS+1;
+ fp= lar->jitter= MEM_mallocN(x*tot*2*sizeof(float), "lamp jitter tab");
+
+ /* set per-lamp fixed seed */
+ BLI_srandom(tot);
+
+ /* fill table with random locations, area_size large */
+ for(x=0; x<tot; x++, fp+=2) {
+ fp[0]= (BLI_frand()-0.5)*lar->area_size;
+ fp[1]= (BLI_frand()-0.5)*lar->area_sizey;
+ }
+
+ while(iter--) {
+ fp= lar->jitter;
+ for(x=tot; x>0; x--, fp+=2) {
+ DP_energy(lar->jitter, fp, tot, lar->area_size, lar->area_sizey);
+ }
+ }
+
+ /* create the dithered tables (could just check lamp type!) */
+ jitter_plane_offset(lar->jitter, lar->jitter+2*tot, tot, lar->area_size, lar->area_sizey, 0.5f, 0.0f);
+ jitter_plane_offset(lar->jitter, lar->jitter+4*tot, tot, lar->area_size, lar->area_sizey, 0.5f, 0.5f);
+ jitter_plane_offset(lar->jitter, lar->jitter+6*tot, tot, lar->area_size, lar->area_sizey, 0.0f, 0.5f);
+}
+
+/* table around origin, -0.5*size to 0.5*size */
+static float *give_jitter_plane(LampRen *lar, int thread, int xs, int ys)
+{
+ int tot;
+
+ tot= lar->ray_totsamp;
+
+ if(lar->ray_samp_type & LA_SAMP_JITTER) {
+ /* made it threadsafe */
+
+ if(lar->xold[thread]!=xs || lar->yold[thread]!=ys) {
+ jitter_plane_offset(lar->jitter, lar->jitter+2*(thread+1)*tot, tot, lar->area_size, lar->area_sizey, BLI_thread_frand(thread), BLI_thread_frand(thread));
+ lar->xold[thread]= xs;
+ lar->yold[thread]= ys;
+ }
+ return lar->jitter+2*(thread+1)*tot;
+ }
+ if(lar->ray_samp_type & LA_SAMP_DITHER) {
+ return lar->jitter + 2*tot*((xs & 1)+2*(ys & 1));
+ }
+
+ return lar->jitter;
+}
+
+
+/* **************** QMC sampling *************** */
+
+static void halton_sample(double *ht_invprimes, double *ht_nums, double *v)
+{
+ // incremental halton sequence generator, from:
+ // "Instant Radiosity", Keller A.
+ unsigned int i;
+
+ for (i = 0; i < 2; i++)
+ {
+ double r = fabs((1.0 - ht_nums[i]) - 1e-10);
+
+ if (ht_invprimes[i] >= r)
+ {
+ double lasth;
+ double h = ht_invprimes[i];
+
+ do {
+ lasth = h;
+ h *= ht_invprimes[i];
+ } while (h >= r);
+
+ ht_nums[i] += ((lasth + h) - 1.0);
+ }
+ else
+ ht_nums[i] += ht_invprimes[i];
+
+ v[i] = (float)ht_nums[i];
+ }
+}
+
+/* Generate Hammersley points in [0,1)^2
+ * From Lucille renderer */
+static void hammersley_create(double *out, int n)
+{
+ double p, t;
+ int k, kk;
+
+ for (k = 0; k < n; k++) {
+ t = 0;
+ for (p = 0.5, kk = k; kk; p *= 0.5, kk >>= 1) {
+ if (kk & 1) { /* kk mod 2 = 1 */
+ t += p;
+ }
+ }
+
+ out[2 * k + 0] = (double)k / (double)n;
+ out[2 * k + 1] = t;
+ }
+}
+
+struct QMCSampler *QMC_initSampler(int type, int tot)
+{
+ QMCSampler *qsa = MEM_mallocN(sizeof(QMCSampler), "qmc sampler");
+ qsa->samp2d = MEM_mallocN(2*sizeof(double)*tot, "qmc sample table");
+
+ qsa->tot = tot;
+ qsa->type = type;
+
+ if (qsa->type==SAMP_TYPE_HAMMERSLEY)
+ hammersley_create(qsa->samp2d, qsa->tot);
+
+ return qsa;
+}
+
+static void QMC_initPixel(QMCSampler *qsa, int thread)
+{
+ if (qsa->type==SAMP_TYPE_HAMMERSLEY)
+ {
+ /* hammersley sequence is fixed, already created in QMCSampler init.
+ * per pixel, gets a random offset. We create separate offsets per thread, for write-safety */
+ qsa->offs[thread][0] = 0.5 * BLI_thread_frand(thread);
+ qsa->offs[thread][1] = 0.5 * BLI_thread_frand(thread);
+ }
+ else { /* SAMP_TYPE_HALTON */
+
+ /* generate a new randomised halton sequence per pixel
+ * to alleviate qmc artifacts and make it reproducable
+ * between threads/frames */
+ double ht_invprimes[2], ht_nums[2];
+ double r[2];
+ int i;
+
+ ht_nums[0] = BLI_thread_frand(thread);
+ ht_nums[1] = BLI_thread_frand(thread);
+ ht_invprimes[0] = 0.5;
+ ht_invprimes[1] = 1.0/3.0;
+
+ for (i=0; i< qsa->tot; i++) {
+ halton_sample(ht_invprimes, ht_nums, r);
+ qsa->samp2d[2*i+0] = r[0];
+ qsa->samp2d[2*i+1] = r[1];
+ }
+ }
+}
+
+static void QMC_freeSampler(QMCSampler *qsa)
+{
+ MEM_freeN(qsa->samp2d);
+ MEM_freeN(qsa);
+}
+
+static void QMC_getSample(double *s, QMCSampler *qsa, int thread, int num)
+{
+ if (qsa->type == SAMP_TYPE_HAMMERSLEY) {
+ s[0] = fmod(qsa->samp2d[2*num+0] + qsa->offs[thread][0], 1.0f);
+ s[1] = fmod(qsa->samp2d[2*num+1] + qsa->offs[thread][1], 1.0f);
+ }
+ else { /* SAMP_TYPE_HALTON */
+ s[0] = qsa->samp2d[2*num+0];
+ s[1] = qsa->samp2d[2*num+1];
+ }
+}
+
+/* phong weighted disc using 'blur' for exponent, centred on 0,0 */
+static void QMC_samplePhong(float *vec, QMCSampler *qsa, int thread, int num, float blur)
+{
+ double s[2];
+ float phi, pz, sqr;
+
+ QMC_getSample(s, qsa, thread, num);
+
+ phi = s[0]*2*M_PI;
+ pz = pow(s[1], blur);
+ sqr = sqrt(1.0f-pz*pz);
+
+ vec[0] = cos(phi)*sqr;
+ vec[1] = sin(phi)*sqr;
+ vec[2] = 0.0f;
+}
+
+/* rect of edge lengths sizex, sizey, centred on 0.0,0.0 i.e. ranging from -sizex/2 to +sizey/2 */
+static void QMC_sampleRect(float *vec, QMCSampler *qsa, int thread, int num, float sizex, float sizey)
+{
+ double s[2];
+
+ QMC_getSample(s, qsa, thread, num);
+
+ vec[0] = (s[0] - 0.5) * sizex;
+ vec[1] = (s[1] - 0.5) * sizey;
+ vec[2] = 0.0f;
+}
+
+/* disc of radius 'radius', centred on 0,0 */
+static void QMC_sampleDisc(float *vec, QMCSampler *qsa, int thread, int num, float radius)
+{
+ double s[2];
+ float phi, sqr;
+
+ QMC_getSample(s, qsa, thread, num);
+
+ phi = s[0]*2*M_PI;
+ sqr = sqrt(s[1]);
+
+ vec[0] = cos(phi)*sqr* radius/2.0;
+ vec[1] = sin(phi)*sqr* radius/2.0;
+ vec[2] = 0.0f;
+}
+
+/* uniform hemisphere sampling */
+static void QMC_sampleHemi(float *vec, QMCSampler *qsa, int thread, int num)
+{
+ double s[2];
+ float phi, sqr;
+
+ QMC_getSample(s, qsa, thread, num);
+
+ phi = s[0]*2.f*M_PI;
+ sqr = sqrt(s[1]);
+
+ vec[0] = cos(phi)*sqr;
+ vec[1] = sin(phi)*sqr;
+ vec[2] = 1.f - s[1]*s[1];
+}
+
+#if 0 /* currently not used */
+/* cosine weighted hemisphere sampling */
+static void QMC_sampleHemiCosine(float *vec, QMCSampler *qsa, int thread, int num)
+{
+ double s[2];
+ float phi, sqr;
+
+ QMC_getSample(s, qsa, thread, num);
+
+ phi = s[0]*2.f*M_PI;
+ sqr = s[1]*sqrt(2-s[1]*s[1]);
+
+ vec[0] = cos(phi)*sqr;
+ vec[1] = sin(phi)*sqr;
+ vec[2] = 1.f - s[1]*s[1];
+
+}
+#endif
+
+/* called from convertBlenderScene.c */
+/* samples don't change per pixel, so build the samples in advance for efficiency */
+void init_lamp_hammersley(LampRen *lar)
+{
+ lar->qsa = QMC_initSampler(SAMP_TYPE_HAMMERSLEY, lar->ray_totsamp);
+}
+
+void init_render_hammersley(Render *re)
+{
+ re->qsa = QMC_initSampler(SAMP_TYPE_HAMMERSLEY, (re->wrld.aosamp * re->wrld.aosamp));
+}
+
+void free_lamp_qmcsampler(LampRen *lar)
+{
+ QMC_freeSampler(lar->qsa);
+}
+
+void free_render_qmcsampler(Render *re)
+{
+ QMC_freeSampler(re->qsa);
+}
+
+static int adaptive_sample_variance(int samples, float *col, float *colsq, float thresh)
+{
+ float var[3], mean[3];
+
+ /* scale threshold just to give a bit more precision in input rather than dealing with
+ * tiny tiny numbers in the UI */
+ thresh /= 2;
+
+ mean[0] = col[0] / (float)samples;
+ mean[1] = col[1] / (float)samples;
+ mean[2] = col[2] / (float)samples;
+
+ var[0] = (colsq[0] / (float)samples) - (mean[0]*mean[0]);
+ var[1] = (colsq[1] / (float)samples) - (mean[1]*mean[1]);
+ var[2] = (colsq[2] / (float)samples) - (mean[2]*mean[2]);
+
+ if ((var[0] * 0.4 < thresh) && (var[1] * 0.3 < thresh) && (var[2] * 0.6 < thresh))
+ return 1;
+ else
+ return 0;
+}
+
+static int adaptive_sample_contrast_val(int samples, float prev, float val, float thresh)
+{
+ /* if the last sample's contribution to the total value was below a small threshold
+ * (i.e. the samples taken are very similar), then taking more samples that are probably
+ * going to be the same is wasting effort */
+ if (fabs( prev/(float)(samples-1) - val/(float)samples ) < thresh) {
+ return 1;
+ } else
+ return 0;
+}
+
+static float get_avg_speed(ShadeInput *shi)
+{
+ float pre_x, pre_y, post_x, post_y, speedavg;
+
+ pre_x = (shi->winspeed[0] == PASS_VECTOR_MAX)?0.0:shi->winspeed[0];
+ pre_y = (shi->winspeed[1] == PASS_VECTOR_MAX)?0.0:shi->winspeed[1];
+ post_x = (shi->winspeed[2] == PASS_VECTOR_MAX)?0.0:shi->winspeed[2];
+ post_y = (shi->winspeed[3] == PASS_VECTOR_MAX)?0.0:shi->winspeed[3];
+
+ speedavg = (sqrt(pre_x*pre_x + pre_y*pre_y) + sqrt(post_x*post_x + post_y*post_y)) / 2.0;
+
+ return speedavg;
+}
+
+/* ***************** main calls ************** */
+
+
+static void trace_refract(float *col, ShadeInput *shi, ShadeResult *shr)
+{
+ QMCSampler *qsa=NULL;
+ int samp_type;
+
+ float samp3d[3], orthx[3], orthy[3];
+ float v_refract[3], v_refract_new[3];
+ float sampcol[4], colsq[4];
+
+ float blur = pow(1.0 - shi->mat->gloss_tra, 3);
+ short max_samples = shi->mat->samp_gloss_tra;
+ float adapt_thresh = shi->mat->adapt_thresh_tra;
+
+ int samples=0;
+
+ colsq[0] = colsq[1] = colsq[2] = 0.0;
+ col[0] = col[1] = col[2] = 0.0;
+ col[3]= shr->alpha;
+
+ if (blur > 0.0) {
+ if (adapt_thresh != 0.0) samp_type = SAMP_TYPE_HALTON;
+ else samp_type = SAMP_TYPE_HAMMERSLEY;
+
+ /* all samples are generated per pixel */
+ qsa = QMC_initSampler(samp_type, max_samples);
+ QMC_initPixel(qsa, shi->thread);
+ } else
+ max_samples = 1;
+
+
+ while (samples < max_samples) {
+ refraction(v_refract, shi->vn, shi->view, shi->ang);
+
+ if (max_samples > 1) {
+ /* get a quasi-random vector from a phong-weighted disc */
+ QMC_samplePhong(samp3d, qsa, shi->thread, samples, blur);
+
+ VecOrthoBasisf(v_refract, orthx, orthy);
+ VecMulf(orthx, samp3d[0]);
+ VecMulf(orthy, samp3d[1]);
+
+ /* and perturb the refraction vector in it */
+ VecAddf(v_refract_new, v_refract, orthx);
+ VecAddf(v_refract_new, v_refract_new, orthy);
+
+ Normalize(v_refract_new);
+ } else {
+ /* no blurriness, use the original normal */
+ VECCOPY(v_refract_new, v_refract);
+ }
+
+ traceray(shi, shr, shi->mat->ray_depth_tra, shi->co, v_refract_new, sampcol, shi->vlr, RAY_TRA|RAY_TRAFLIP);
+
+ col[0] += sampcol[0];
+ col[1] += sampcol[1];
+ col[2] += sampcol[2];
+ col[3] += sampcol[3];
+
+ /* for variance calc */
+ colsq[0] += sampcol[0]*sampcol[0];
+ colsq[1] += sampcol[1]*sampcol[1];
+ colsq[2] += sampcol[2]*sampcol[2];
+
+ samples++;
+
+ /* adaptive sampling */
+ if (adapt_thresh < 1.0 && samples > max_samples/2)
+ {
+ if (adaptive_sample_variance(samples, col, colsq, adapt_thresh))
+ break;
+
+ /* if the pixel so far is very dark, we can get away with less samples */
+ if ( (col[0] + col[1] + col[2])/3.0/(float)samples < 0.01 )
+ max_samples--;
+ }
+ }
+
+ col[0] /= (float)samples;
+ col[1] /= (float)samples;
+ col[2] /= (float)samples;
+ col[3] /= (float)samples;
+
+ if (qsa) QMC_freeSampler(qsa);
+}
+
+static void trace_reflect(float *col, ShadeInput *shi, ShadeResult *shr, float fresnelfac)
+{
+ QMCSampler *qsa=NULL;
+ int samp_type;
+
+ float samp3d[3], orthx[3], orthy[3];
+ float v_nor_new[3], v_reflect[3];
+ float sampcol[4], colsq[4];
+
+ float blur = pow(1.0 - shi->mat->gloss_mir, 3);
+ short max_samples = shi->mat->samp_gloss_mir;
+ float adapt_thresh = shi->mat->adapt_thresh_mir;
+ float aniso = 1.0 - shi->mat->aniso_gloss_mir;
+
+ int samples=0;
+
+ col[0] = col[1] = col[2] = 0.0;
+ colsq[0] = colsq[1] = colsq[2] = 0.0;
+
+ if (blur > 0.0) {
+ if (adapt_thresh != 0.0) samp_type = SAMP_TYPE_HALTON;
+ else samp_type = SAMP_TYPE_HAMMERSLEY;
+
+ /* all samples are generated per pixel */
+ qsa = QMC_initSampler(samp_type, max_samples);
+ QMC_initPixel(qsa, shi->thread);
+ } else
+ max_samples = 1;
+
+ while (samples < max_samples) {
+
+ if (max_samples > 1) {
+ /* get a quasi-random vector from a phong-weighted disc */
+ QMC_samplePhong(samp3d, qsa, shi->thread, samples, blur);
+
+ /* find the normal's perpendicular plane, blurring along tangents
+ * if tangent shading enabled */
+ if (shi->mat->mode & (MA_TANGENT_V)) {
+ Crossf(orthx, shi->vn, shi->tang); // bitangent
+ VECCOPY(orthy, shi->tang);
+ VecMulf(orthx, samp3d[0]);
+ VecMulf(orthy, samp3d[1]*aniso);
+ } else {
+ VecOrthoBasisf(shi->vn, orthx, orthy);
+ VecMulf(orthx, samp3d[0]);
+ VecMulf(orthy, samp3d[1]);
+ }
+
+ /* and perturb the normal in it */
+ VecAddf(v_nor_new, shi->vn, orthx);
+ VecAddf(v_nor_new, v_nor_new, orthy);
+ Normalize(v_nor_new);
+ } else {
+ /* no blurriness, use the original normal */
+ VECCOPY(v_nor_new, shi->vn);
+ }
+
+ if((shi->vlr->flag & R_SMOOTH))
+ reflection(v_reflect, v_nor_new, shi->view, shi->facenor);
+ else
+ reflection(v_reflect, v_nor_new, shi->view, NULL);
+
+ traceray(shi, shr, shi->mat->ray_depth, shi->co, v_reflect, sampcol, shi->vlr, 0);
+
+
+ col[0] += sampcol[0];
+ col[1] += sampcol[1];
+ col[2] += sampcol[2];
+
+ /* for variance calc */
+ colsq[0] += sampcol[0]*sampcol[0];
+ colsq[1] += sampcol[1]*sampcol[1];
+ colsq[2] += sampcol[2]*sampcol[2];
+
+ samples++;
+
+ /* adaptive sampling */
+ if (adapt_thresh > 0.0 && samples > max_samples/3)
+ {
+ if (adaptive_sample_variance(samples, col, colsq, adapt_thresh))
+ break;
+
+ /* if the pixel so far is very dark, we can get away with less samples */
+ if ( (col[0] + col[1] + col[2])/3.0/(float)samples < 0.01 )
+ max_samples--;
+
+ /* reduce samples when reflection is dim due to low ray mirror blend value or fresnel factor
+ * and when reflection is blurry */
+ if (fresnelfac < 0.1 * (blur+1)) {
+ max_samples--;
+
+ /* even more for very dim */
+ if (fresnelfac < 0.05 * (blur+1))
+ max_samples--;
+ }
+ }
+ }
+
+ col[0] /= (float)samples;
+ col[1] /= (float)samples;
+ col[2] /= (float)samples;
+
+ if (qsa) QMC_freeSampler(qsa);
+}
+
+/* extern call from render loop */
+void ray_trace(ShadeInput *shi, ShadeResult *shr)
+{
+ VlakRen *vlr;
+ float i, f, f1, fr, fg, fb;
+ float mircol[4], tracol[4];
+ float diff[3];
+ int do_tra, do_mir;
+
+ do_tra= ((shi->mat->mode & (MA_RAYTRANSP)) && shr->alpha!=1.0f);
+ do_mir= ((shi->mat->mode & MA_RAYMIRROR) && shi->ray_mirror!=0.0f);
+ vlr= shi->vlr;
+
+ /* raytrace mirror amd refract like to separate the spec color */
+ if(shi->combinedflag & SCE_PASS_SPEC)
+ VECSUB(diff, shr->combined, shr->spec) /* no ; */
+ else
+ VECCOPY(diff, shr->combined);
+
+ if(do_tra) {
+ float olddiff[3];
+
+ trace_refract(tracol, shi, shr);
+
+ f= shr->alpha; f1= 1.0f-f;
+ fr= 1.0f+ shi->mat->filter*(shi->r-1.0f);
+ fg= 1.0f+ shi->mat->filter*(shi->g-1.0f);
+ fb= 1.0f+ shi->mat->filter*(shi->b-1.0f);
+
+ /* for refract pass */
+ VECCOPY(olddiff, diff);
+
+ diff[0]= f*diff[0] + f1*fr*tracol[0];
+ diff[1]= f*diff[1] + f1*fg*tracol[1];
+ diff[2]= f*diff[2] + f1*fb*tracol[2];
+
+ if(shi->passflag & SCE_PASS_REFRACT)
+ VECSUB(shr->refr, diff, olddiff);
+
+ if(!(shi->combinedflag & SCE_PASS_REFRACT))
+ VECSUB(diff, diff, shr->refr);
+
+ shr->alpha= tracol[3];
+ }
+
+ if(do_mir) {
+
+ i= shi->ray_mirror*fresnel_fac(shi->view, shi->vn, shi->mat->fresnel_mir_i, shi->mat->fresnel_mir);
+ if(i!=0.0f) {
+
+ trace_reflect(mircol, shi, shr, i);
+
+ fr= i*shi->mirr;
+ fg= i*shi->mirg;
+ fb= i*shi->mirb;
+
+ if(shi->passflag & SCE_PASS_REFLECT) {
+ /* mirror pass is not blocked out with spec */
+ shr->refl[0]= fr*mircol[0] - fr*diff[0];
+ shr->refl[1]= fg*mircol[1] - fg*diff[1];
+ shr->refl[2]= fb*mircol[2] - fb*diff[2];
+ }
+
+ if(shi->combinedflag & SCE_PASS_REFLECT) {
+
+ f= fr*(1.0f-shr->spec[0]); f1= 1.0f-i;
+ diff[0]= f*mircol[0] + f1*diff[0];
+
+ f= fg*(1.0f-shr->spec[1]); f1= 1.0f-i;
+ diff[1]= f*mircol[1] + f1*diff[1];
+
+ f= fb*(1.0f-shr->spec[2]); f1= 1.0f-i;
+ diff[2]= f*mircol[2] + f1*diff[2];
+ }
+ }
+ }
+ /* put back together */
+ if(shi->combinedflag & SCE_PASS_SPEC)
+ VECADD(shr->combined, diff, shr->spec) /* no ; */
+ else
+ VECCOPY(shr->combined, diff);
+}
+
+/* color 'shadfac' passes through 'col' with alpha and filter */
+/* filter is only applied on alpha defined transparent part */
+static void addAlphaLight(float *shadfac, float *col, float alpha, float filter)
+{
+ float fr, fg, fb;
+
+ fr= 1.0f+ filter*(col[0]-1.0f);
+ fg= 1.0f+ filter*(col[1]-1.0f);
+ fb= 1.0f+ filter*(col[2]-1.0f);
+
+ shadfac[0]= alpha*col[0] + fr*(1.0f-alpha)*shadfac[0];
+ shadfac[1]= alpha*col[1] + fg*(1.0f-alpha)*shadfac[1];
+ shadfac[2]= alpha*col[2] + fb*(1.0f-alpha)*shadfac[2];
+
+ shadfac[3]= (1.0f-alpha)*shadfac[3];
+}
+
+static void ray_trace_shadow_tra(Isect *is, int depth, int traflag)
+{
+ /* ray to lamp, find first face that intersects, check alpha properties,
+ if it has col[3]>0.0f continue. so exit when alpha is full */
+ ShadeInput shi;
+ ShadeResult shr;
+
+ if(RE_ray_tree_intersect(R.raytree, is)) {
+ float d= 1.0f;
+ /* we got a face */
+
+ shi.depth= 1; /* only used to indicate tracing */
+ shi.mask= 1;
+ shi.osatex= 0;
+ shi.thread= shi.sample= 0;
+ shi.lay= 0;
+ shi.passflag= 0;
+ shi.combinedflag= 0;
+ shi.do_preview= 0;
+ shi.light_override= NULL;
+ shi.mat_override= NULL;
+
+ shade_ray(is, &shi, &shr);
+ if (traflag & RAY_TRA)
+ d= shade_by_transmission(is, &shi, &shr);
+
+ /* mix colors based on shadfac (rgb + amount of light factor) */
+ addAlphaLight(is->col, shr.diff, shr.alpha, d*shi.mat->filter);
+
+ if(depth>0 && is->col[3]>0.0f) {
+
+ /* adapt isect struct */
+ VECCOPY(is->start, shi.co);
+ is->faceorig= (RayFace*)shi.vlr;
+
+ ray_trace_shadow_tra(is, depth-1, traflag | RAY_TRA);
+ }
+ }
+}
+
+/* not used, test function for ambient occlusion (yaf: pathlight) */
+/* main problem; has to be called within shading loop, giving unwanted recursion */
+int ray_trace_shadow_rad(ShadeInput *ship, ShadeResult *shr)
+{
+ static int counter=0, only_one= 0;
+ extern float hashvectf[];
+ Isect isec;
+ ShadeInput shi;
+ ShadeResult shr_t;
+ float vec[3], accum[3], div= 0.0f, maxsize= RE_ray_tree_max_size(R.raytree);
+ int a;
+
+ if(only_one) {
+ return 0;
+ }
+ only_one= 1;
+
+ accum[0]= accum[1]= accum[2]= 0.0f;
+ isec.mode= RE_RAY_MIRROR;
+ isec.faceorig= (RayFace*)ship->vlr;
+
+ for(a=0; a<8*8; a++) {
+
+ counter+=3;
+ counter %= 768;
+ VECCOPY(vec, hashvectf+counter);
+ if(ship->vn[0]*vec[0]+ship->vn[1]*vec[1]+ship->vn[2]*vec[2]>0.0f) {
+ vec[0]-= vec[0];
+ vec[1]-= vec[1];
+ vec[2]-= vec[2];
+ }
+ VECCOPY(isec.start, ship->co);
+ isec.end[0]= isec.start[0] + maxsize*vec[0];
+ isec.end[1]= isec.start[1] + maxsize*vec[1];
+ isec.end[2]= isec.start[2] + maxsize*vec[2];
+
+ if(RE_ray_tree_intersect(R.raytree, &isec)) {
+ float fac;
+ shade_ray(&isec, &shi, &shr_t);
+ fac= isec.labda*isec.labda;
+ fac= 1.0f;
+ accum[0]+= fac*(shr_t.diff[0]+shr_t.spec[0]);
+ accum[1]+= fac*(shr_t.diff[1]+shr_t.spec[1]);
+ accum[2]+= fac*(shr_t.diff[2]+shr_t.spec[2]);
+ div+= fac;
+ }
+ else div+= 1.0f;
+ }
+
+ if(div!=0.0f) {
+ shr->diff[0]+= accum[0]/div;
+ shr->diff[1]+= accum[1]/div;
+ shr->diff[2]+= accum[2]/div;
+ }
+ shr->alpha= 1.0f;
+
+ only_one= 0;
+ return 1;
+}
+
+/* aolight: function to create random unit sphere vectors for total random sampling */
+static void RandomSpherical(float *v)
+{
+ float r;
+ v[2] = 2.f*BLI_frand()-1.f;
+ if ((r = 1.f - v[2]*v[2])>0.f) {
+ float a = 6.283185307f*BLI_frand();
+ r = sqrt(r);
+ v[0] = r * cos(a);
+ v[1] = r * sin(a);
+ }
+ else v[2] = 1.f;
+}
+
+/* calc distributed spherical energy */
+static void DS_energy(float *sphere, int tot, float *vec)
+{
+ float *fp, fac, force[3], res[3];
+ int a;
+
+ res[0]= res[1]= res[2]= 0.0f;
+
+ for(a=0, fp=sphere; a<tot; a++, fp+=3) {
+ VecSubf(force, vec, fp);
+ fac= force[0]*force[0] + force[1]*force[1] + force[2]*force[2];
+ if(fac!=0.0f) {
+ fac= 1.0f/fac;
+ res[0]+= fac*force[0];
+ res[1]+= fac*force[1];
+ res[2]+= fac*force[2];
+ }
+ }
+
+ VecMulf(res, 0.5);
+ VecAddf(vec, vec, res);
+ Normalize(vec);
+
+}
+
+/* called from convertBlenderScene.c */
+/* creates an equally distributed spherical sample pattern */
+/* and allocates threadsafe memory */
+void init_ao_sphere(World *wrld)
+{
+ float *fp;
+ int a, tot, iter= 16;
+
+ /* we make twice the amount of samples, because only a hemisphere is used */
+ tot= 2*wrld->aosamp*wrld->aosamp;
+
+ wrld->aosphere= MEM_mallocN(3*tot*sizeof(float), "AO sphere");
+
+ /* fixed random */
+ BLI_srandom(tot);
+
+ /* init */
+ fp= wrld->aosphere;
+ for(a=0; a<tot; a++, fp+= 3) {
+ RandomSpherical(fp);
+ }
+
+ while(iter--) {
+ for(a=0, fp= wrld->aosphere; a<tot; a++, fp+= 3) {
+ DS_energy(wrld->aosphere, tot, fp);
+ }
+ }
+
+ /* tables */
+ wrld->aotables= MEM_mallocN(BLENDER_MAX_THREADS*3*tot*sizeof(float), "AO tables");
+}
+
+/* give per thread a table, we have to compare xs ys because of way OSA works... */
+static float *threadsafe_table_sphere(int test, int thread, int xs, int ys, int tot)
+{
+ static int xso[BLENDER_MAX_THREADS], yso[BLENDER_MAX_THREADS];
+ static int firsttime= 1;
+
+ if(firsttime) {
+ memset(xso, 255, sizeof(xso));
+ memset(yso, 255, sizeof(yso));
+ firsttime= 0;
+ }
+
+ if(xs==xso[thread] && ys==yso[thread]) return R.wrld.aotables+ thread*tot*3;
+ if(test) return NULL;
+ xso[thread]= xs; yso[thread]= ys;
+ return R.wrld.aotables+ thread*tot*3;
+}
+
+static float *sphere_sampler(int type, int resol, int thread, int xs, int ys)
+{
+ int tot;
+ float *vec;
+
+ if(resol>16) resol= 16;
+
+ tot= 2*resol*resol;
+
+ if (type & WO_AORNDSMP) {
+ static float sphere[2*3*256];
+ int a;
+
+ /* total random sampling. NOT THREADSAFE! (should be removed, is not useful) */
+ vec= sphere;
+ for (a=0; a<tot; a++, vec+=3) {
+ RandomSpherical(vec);
+ }
+
+ return sphere;
+ }
+ else {
+ float *sphere;
+ float cosfi, sinfi, cost, sint;
+ float ang, *vec1;
+ int a;
+
+ sphere= threadsafe_table_sphere(1, thread, xs, ys, tot); // returns table if xs and ys were equal to last call
+ if(sphere==NULL) {
+ sphere= threadsafe_table_sphere(0, thread, xs, ys, tot);
+
+ // random rotation
+ ang= BLI_thread_frand(thread);
+ sinfi= sin(ang); cosfi= cos(ang);
+ ang= BLI_thread_frand(thread);
+ sint= sin(ang); cost= cos(ang);
+
+ vec= R.wrld.aosphere;
+ vec1= sphere;
+ for (a=0; a<tot; a++, vec+=3, vec1+=3) {
+ vec1[0]= cost*cosfi*vec[0] - sinfi*vec[1] + sint*cosfi*vec[2];
+ vec1[1]= cost*sinfi*vec[0] + cosfi*vec[1] + sint*sinfi*vec[2];
+ vec1[2]= -sint*vec[0] + cost*vec[2];
+ }
+ }
+ return sphere;
+ }
+}
+
+void ray_ao_qmc(ShadeInput *shi, float *shadfac)
+{
+ Isect isec;
+ QMCSampler *qsa=NULL;
+ float samp3d[3];
+ float up[3], side[3], dir[3], nrm[3];
+
+ float maxdist = R.wrld.aodist;
+ float fac=0.0f, prev=0.0f;
+ float adapt_thresh = G.scene->world->ao_adapt_thresh;
+ float adapt_speed_fac = G.scene->world->ao_adapt_speed_fac;
+ float bias = G.scene->world->aobias;
+
+ int samples=0;
+ int max_samples = R.wrld.aosamp*R.wrld.aosamp;
+
+ float dxyview[3], skyadded=0, div;
+ int aocolor;
+
+ isec.faceorig= (RayFace*)shi->vlr;
+ isec.face_last= NULL;
+ isec.mode= (R.wrld.aomode & WO_AODIST)?RE_RAY_SHADOW_TRA:RE_RAY_SHADOW;
+ isec.lay= -1;
+ VECCOPY(isec.start, shi->co);
+
+ shadfac[0]= shadfac[1]= shadfac[2]= 0.0f;
+
+ /* prevent sky colors to be added for only shadow (shadow becomes alpha) */
+ aocolor= R.wrld.aocolor;
+ if(shi->mat->mode & MA_ONLYSHADOW)
+ aocolor= WO_AOPLAIN;
+
+ if(aocolor == WO_AOSKYTEX) {
+ dxyview[0]= 1.0f/(float)R.wrld.aosamp;
+ dxyview[1]= 1.0f/(float)R.wrld.aosamp;
+ dxyview[2]= 0.0f;
+ }
+
+ /* bias prevents smoothed faces to appear flat */
+ if(shi->vlr->flag & R_SMOOTH) {
+ bias= G.scene->world->aobias;
+ VECCOPY(nrm, shi->vn);
+ }
+ else {
+ bias= 0.0f;
+ VECCOPY(nrm, shi->facenor);
+ }
+
+ VecOrthoBasisf(nrm, up, side);
+
+ /* sampling init */
+ if (R.wrld.ao_samp_method==WO_AOSAMP_HALTON) {
+ float speedfac;
+
+ speedfac = get_avg_speed(shi) * adapt_speed_fac;
+ CLAMP(speedfac, 1.0, 1000.0);
+ max_samples /= speedfac;
+ if (max_samples < 5) max_samples = 5;
+
+ qsa = QMC_initSampler(SAMP_TYPE_HALTON, max_samples);
+ } else if (R.wrld.ao_samp_method==WO_AOSAMP_HAMMERSLEY)
+ qsa = R.qsa;
+
+ QMC_initPixel(qsa, shi->thread);
+
+ while (samples < max_samples) {
+
+ /* sampling, returns quasi-random vector in unit hemisphere */
+ QMC_sampleHemi(samp3d, qsa, shi->thread, samples);
+
+ dir[0] = (samp3d[0]*up[0] + samp3d[1]*side[0] + samp3d[2]*nrm[0]);
+ dir[1] = (samp3d[0]*up[1] + samp3d[1]*side[1] + samp3d[2]*nrm[1]);
+ dir[2] = (samp3d[0]*up[2] + samp3d[1]*side[2] + samp3d[2]*nrm[2]);
+
+ Normalize(dir);
+
+ isec.end[0] = shi->co[0] - maxdist*dir[0];
+ isec.end[1] = shi->co[1] - maxdist*dir[1];
+ isec.end[2] = shi->co[2] - maxdist*dir[2];
+
+ prev = fac;
+
+ if(RE_ray_tree_intersect(R.raytree, &isec)) {
+ if (R.wrld.aomode & WO_AODIST) fac+= exp(-isec.labda*R.wrld.aodistfac);
+ else fac+= 1.0f;
+ }
+ else if(aocolor!=WO_AOPLAIN) {
+ float skycol[4];
+ float skyfac, view[3];
+
+ view[0]= -dir[0];
+ view[1]= -dir[1];
+ view[2]= -dir[2];
+ Normalize(view);
+
+ if(aocolor==WO_AOSKYCOL) {
+ skyfac= 0.5*(1.0f+view[0]*R.grvec[0]+ view[1]*R.grvec[1]+ view[2]*R.grvec[2]);
+ shadfac[0]+= (1.0f-skyfac)*R.wrld.horr + skyfac*R.wrld.zenr;
+ shadfac[1]+= (1.0f-skyfac)*R.wrld.horg + skyfac*R.wrld.zeng;
+ shadfac[2]+= (1.0f-skyfac)*R.wrld.horb + skyfac*R.wrld.zenb;
+ }
+ else { /* WO_AOSKYTEX */
+ shadeSkyView(skycol, isec.start, view, dxyview);
+ shadfac[0]+= skycol[0];
+ shadfac[1]+= skycol[1];
+ shadfac[2]+= skycol[2];
+ }
+ skyadded++;
+ }
+
+ samples++;
+
+ if (qsa->type == SAMP_TYPE_HALTON) {
+ /* adaptive sampling - consider samples below threshold as in shadow (or vice versa) and exit early */
+ if (adapt_thresh > 0.0 && (samples > max_samples/2) ) {
+
+ if (adaptive_sample_contrast_val(samples, prev, fac, adapt_thresh)) {
+ break;
+ }
+ }
+ }
+ }
+
+ if(aocolor!=WO_AOPLAIN && skyadded) {
+ div= (1.0f - fac/(float)samples)/((float)skyadded);
+
+ shadfac[0]*= div; // average color times distances/hits formula
+ shadfac[1]*= div; // average color times distances/hits formula
+ shadfac[2]*= div; // average color times distances/hits formula
+ } else {
+ shadfac[0]= shadfac[1]= shadfac[2]= 1.0f - fac/(float)samples;
+ }
+
+ if ((qsa) && (qsa->type == SAMP_TYPE_HALTON)) QMC_freeSampler(qsa);
+}
+
+/* extern call from shade_lamp_loop, ambient occlusion calculus */
+void ray_ao_spheresamp(ShadeInput *shi, float *shadfac)
+{
+ Isect isec;
+ float *vec, *nrm, div, bias, sh=0.0f;
+ float maxdist = R.wrld.aodist;
+ float dxyview[3];
+ int j= -1, tot, actual=0, skyadded=0, aocolor;
+
+ isec.faceorig= (RayFace*)shi->vlr;
+ isec.face_last= NULL;
+ isec.mode= (R.wrld.aomode & WO_AODIST)?RE_RAY_SHADOW_TRA:RE_RAY_SHADOW;
+ isec.lay= -1;
+
+
+ shadfac[0]= shadfac[1]= shadfac[2]= 0.0f;
+
+ /* bias prevents smoothed faces to appear flat */
+ if(shi->vlr->flag & R_SMOOTH) {
+ bias= G.scene->world->aobias;
+ nrm= shi->vn;
+ }
+ else {
+ bias= 0.0f;
+ nrm= shi->facenor;
+ }
+
+ /* prevent sky colors to be added for only shadow (shadow becomes alpha) */
+ aocolor= R.wrld.aocolor;
+ if(shi->mat->mode & MA_ONLYSHADOW)
+ aocolor= WO_AOPLAIN;
+
+ vec= sphere_sampler(R.wrld.aomode, R.wrld.aosamp, shi->thread, shi->xs, shi->ys);
+
+ // warning: since we use full sphere now, and dotproduct is below, we do twice as much
+ tot= 2*R.wrld.aosamp*R.wrld.aosamp;
+
+ if(aocolor == WO_AOSKYTEX) {
+ dxyview[0]= 1.0f/(float)R.wrld.aosamp;
+ dxyview[1]= 1.0f/(float)R.wrld.aosamp;
+ dxyview[2]= 0.0f;
+ }
+
+ while(tot--) {
+
+ if ((vec[0]*nrm[0] + vec[1]*nrm[1] + vec[2]*nrm[2]) > bias) {
+ /* only ao samples for mask */
+ if(R.r.mode & R_OSA) {
+ j++;
+ if(j==R.osa) j= 0;
+ if(!(shi->mask & (1<<j))) {
+ vec+=3;
+ continue;
+ }
+ }
+
+ actual++;
+
+ /* always set start/end, RE_ray_tree_intersect clips it */
+ VECCOPY(isec.start, shi->co);
+ isec.end[0] = shi->co[0] - maxdist*vec[0];
+ isec.end[1] = shi->co[1] - maxdist*vec[1];
+ isec.end[2] = shi->co[2] - maxdist*vec[2];
+
+ /* do the trace */
+ if(RE_ray_tree_intersect(R.raytree, &isec)) {
+ if (R.wrld.aomode & WO_AODIST) sh+= exp(-isec.labda*R.wrld.aodistfac);
+ else sh+= 1.0f;
+ }
+ else if(aocolor!=WO_AOPLAIN) {
+ float skycol[4];
+ float fac, view[3];
+
+ view[0]= -vec[0];
+ view[1]= -vec[1];
+ view[2]= -vec[2];
+ Normalize(view);
+
+ if(aocolor==WO_AOSKYCOL) {
+ fac= 0.5*(1.0f+view[0]*R.grvec[0]+ view[1]*R.grvec[1]+ view[2]*R.grvec[2]);
+ shadfac[0]+= (1.0f-fac)*R.wrld.horr + fac*R.wrld.zenr;
+ shadfac[1]+= (1.0f-fac)*R.wrld.horg + fac*R.wrld.zeng;
+ shadfac[2]+= (1.0f-fac)*R.wrld.horb + fac*R.wrld.zenb;
+ }
+ else { /* WO_AOSKYTEX */
+ shadeSkyView(skycol, isec.start, view, dxyview);
+ shadfac[0]+= skycol[0];
+ shadfac[1]+= skycol[1];
+ shadfac[2]+= skycol[2];
+ }
+ skyadded++;
+ }
+ }
+ // samples
+ vec+= 3;
+ }
+
+ if(actual==0) sh= 1.0f;
+ else sh = 1.0f - sh/((float)actual);
+
+ if(aocolor!=WO_AOPLAIN && skyadded) {
+ div= sh/((float)skyadded);
+
+ shadfac[0]*= div; // average color times distances/hits formula
+ shadfac[1]*= div; // average color times distances/hits formula
+ shadfac[2]*= div; // average color times distances/hits formula
+ }
+ else {
+ shadfac[0]= shadfac[1]= shadfac[2]= sh;
+ }
+}
+
+void ray_ao(ShadeInput *shi, float *shadfac)
+{
+ /* Unfortunately, the unusual way that the sphere sampler calculates roughly twice as many
+ * samples as are actually traced, and skips them based on bias and OSA settings makes it very difficult
+ * to reuse code between these two functions. This is the easiest way I can think of to do it
+ * --broken */
+ if (ELEM(R.wrld.ao_samp_method, WO_AOSAMP_HAMMERSLEY, WO_AOSAMP_HALTON))
+ ray_ao_qmc(shi, shadfac);
+ else if (R.wrld.ao_samp_method == WO_AOSAMP_CONSTANT)
+ ray_ao_spheresamp(shi, shadfac);
+}
+
+
+static void ray_shadow_qmc(ShadeInput *shi, LampRen *lar, float *lampco, float *shadfac, Isect *isec)
+{
+ QMCSampler *qsa=NULL;
+ QMCSampler *qsa_jit=NULL;
+ int samples=0;
+ float samp3d[3], jit[3];
+
+ float fac=0.0f, vec[3];
+ float colsq[4];
+ float adapt_thresh = lar->adapt_thresh;
+ int max_samples = lar->ray_totsamp;
+ float pos[3];
+ int do_soft=1, full_osa=0;
+
+ colsq[0] = colsq[1] = colsq[2] = 0.0;
+ if(isec->mode==RE_RAY_SHADOW_TRA) {
+ shadfac[0]= shadfac[1]= shadfac[2]= shadfac[3]= 0.0f;
+ } else
+ shadfac[3]= 1.0f;
+
+ if (lar->ray_totsamp < 2) do_soft = 0;
+ if ((R.r.mode & R_OSA) && (R.osa > 0) && (shi->vlr->flag & R_FULL_OSA)) full_osa = 1;
+
+ if (full_osa) {
+ if (do_soft) max_samples = max_samples/R.osa + 1;
+ else max_samples = 1;
+ } else {
+ if (do_soft) max_samples = lar->ray_totsamp;
+ else max_samples = (R.osa > 4)?R.osa:5;
+ }
+
+ /* sampling init */
+ if (lar->ray_samp_method==LA_SAMP_HALTON) {
+ qsa = QMC_initSampler(SAMP_TYPE_HALTON, max_samples);
+ qsa_jit = QMC_initSampler(SAMP_TYPE_HALTON, max_samples);
+ } else if (lar->ray_samp_method==LA_SAMP_HAMMERSLEY) {
+ qsa = lar->qsa;
+ qsa_jit = QMC_initSampler(SAMP_TYPE_HAMMERSLEY, max_samples);
+ }
+
+ QMC_initPixel(qsa, shi->thread);
+ QMC_initPixel(qsa_jit, shi->thread);
+
+ VECCOPY(vec, lampco);
+
+
+ while (samples < max_samples) {
+ isec->faceorig= (RayFace*)shi->vlr;
+
+ /* manually jitter the start shading co-ord per sample
+ * based on the pre-generated OSA texture sampling offsets,
+ * for anti-aliasing sharp shadow edges. */
+ VECCOPY(pos, shi->co);
+ if (shi->vlr && !full_osa) {
+ QMC_sampleRect(jit, qsa_jit, shi->thread, samples, 1.0, 1.0);
+
+ pos[0] += shi->dxco[0]*jit[0] + shi->dyco[0]*jit[1];
+ pos[1] += shi->dxco[1]*jit[0] + shi->dyco[1]*jit[1];
+ pos[2] += shi->dxco[2]*jit[0] + shi->dyco[2]*jit[1];
+ }
+
+ if (do_soft) {
+ /* sphere shadow source */
+ if (lar->type == LA_LOCAL) {
+ float ru[3], rv[3], v[3], s[3];
+
+ /* calc tangent plane vectors */
+ v[0] = pos[0] - lampco[0];
+ v[1] = pos[1] - lampco[1];
+ v[2] = pos[2] - lampco[2];
+ Normalize(v);
+ VecOrthoBasisf(v, ru, rv);
+
+ /* sampling, returns quasi-random vector in area_size disc */
+ QMC_sampleDisc(samp3d, qsa, shi->thread, samples,lar->area_size);
+
+ /* distribute disc samples across the tangent plane */
+ s[0] = samp3d[0]*ru[0] + samp3d[1]*rv[0];
+ s[1] = samp3d[0]*ru[1] + samp3d[1]*rv[1];
+ s[2] = samp3d[0]*ru[2] + samp3d[1]*rv[2];
+
+ VECCOPY(samp3d, s);
+ }
+ else {
+ /* sampling, returns quasi-random vector in [sizex,sizey]^2 plane */
+ QMC_sampleRect(samp3d, qsa, shi->thread, samples, lar->area_size, lar->area_sizey);
+
+ /* align samples to lamp vector */
+ Mat3MulVecfl(lar->mat, samp3d);
+ }
+ isec->end[0]= vec[0]+samp3d[0];
+ isec->end[1]= vec[1]+samp3d[1];
+ isec->end[2]= vec[2]+samp3d[2];
+ } else {
+ VECCOPY(isec->end, vec);
+ }
+ VECCOPY(isec->start, pos);
+
+
+ /* trace the ray */
+ if(isec->mode==RE_RAY_SHADOW_TRA) {
+ isec->col[0]= isec->col[1]= isec->col[2]= 1.0f;
+ isec->col[3]= 1.0f;
+
+ ray_trace_shadow_tra(isec, DEPTH_SHADOW_TRA, 0);
+ shadfac[0] += isec->col[0];
+ shadfac[1] += isec->col[1];
+ shadfac[2] += isec->col[2];
+ shadfac[3] += isec->col[3];
+
+ /* for variance calc */
+ colsq[0] += isec->col[0]*isec->col[0];
+ colsq[1] += isec->col[1]*isec->col[1];
+ colsq[2] += isec->col[2]*isec->col[2];
+ }
+ else {
+ if( RE_ray_tree_intersect(R.raytree, isec) ) fac+= 1.0f;
+ }
+
+ samples++;
+
+ 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 > 4) && (adapt_thresh > 0.0) && (samples > max_samples / 3)) {
+ if (isec->mode==RE_RAY_SHADOW_TRA) {
+ if ((shadfac[3] / samples > (1.0-adapt_thresh)) || (shadfac[3] / samples < adapt_thresh))
+ break;
+ else if (adaptive_sample_variance(samples, shadfac, colsq, adapt_thresh))
+ break;
+ } else {
+ if ((fac / samples > (1.0-adapt_thresh)) || (fac / samples < adapt_thresh))
+ break;
+ }
+ }
+ }
+ }
+
+ if(isec->mode==RE_RAY_SHADOW_TRA) {
+ shadfac[0] /= samples;
+ shadfac[1] /= samples;
+ shadfac[2] /= samples;
+ shadfac[3] /= samples;
+ } else
+ shadfac[3]= 1.0f-fac/samples;
+
+ if (qsa_jit) QMC_freeSampler(qsa_jit);
+ if ((qsa) && (qsa->type == SAMP_TYPE_HALTON)) QMC_freeSampler(qsa);
+}
+
+static void ray_shadow_jitter(ShadeInput *shi, LampRen *lar, float *lampco, float *shadfac, Isect *isec)
+{
+ /* area soft shadow */
+ float *jitlamp;
+ float fac=0.0f, div=0.0f, vec[3];
+ int a, j= -1, mask;
+
+ if(isec->mode==RE_RAY_SHADOW_TRA) {
+ shadfac[0]= shadfac[1]= shadfac[2]= shadfac[3]= 0.0f;
+ }
+ else shadfac[3]= 1.0f;
+
+ fac= 0.0f;
+ jitlamp= give_jitter_plane(lar, shi->thread, shi->xs, shi->ys);
+
+ a= lar->ray_totsamp;
+
+ /* this correction to make sure we always take at least 1 sample */
+ mask= shi->mask;
+ if(a==4) mask |= (mask>>4)|(mask>>8);
+ else if(a==9) mask |= (mask>>9);
+
+ while(a--) {
+
+ if(R.r.mode & R_OSA) {
+ j++;
+ if(j>=R.osa) j= 0;
+ if(!(mask & (1<<j))) {
+ jitlamp+= 2;
+ continue;
+ }
+ }
+
+ isec->faceorig= (RayFace*)shi->vlr;
+
+ vec[0]= jitlamp[0];
+ vec[1]= jitlamp[1];
+ vec[2]= 0.0f;
+ Mat3MulVecfl(lar->mat, vec);
+
+ /* set start and end, RE_ray_tree_intersect clips it */
+ VECCOPY(isec->start, shi->co);
+ isec->end[0]= lampco[0]+vec[0];
+ isec->end[1]= lampco[1]+vec[1];
+ isec->end[2]= lampco[2]+vec[2];
+
+ if(isec->mode==RE_RAY_SHADOW_TRA) {
+ /* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
+ isec->col[0]= isec->col[1]= isec->col[2]= 1.0f;
+ isec->col[3]= 1.0f;
+
+ ray_trace_shadow_tra(isec, DEPTH_SHADOW_TRA, 0);
+ shadfac[0] += isec->col[0];
+ shadfac[1] += isec->col[1];
+ shadfac[2] += isec->col[2];
+ shadfac[3] += isec->col[3];
+ }
+ else if( RE_ray_tree_intersect(R.raytree, isec) ) fac+= 1.0f;
+
+ div+= 1.0f;
+ jitlamp+= 2;
+ }
+
+ if(isec->mode==RE_RAY_SHADOW_TRA) {
+ shadfac[0] /= div;
+ shadfac[1] /= div;
+ shadfac[2] /= div;
+ shadfac[3] /= div;
+ }
+ else {
+ // sqrt makes nice umbra effect
+ if(lar->ray_samp_type & LA_SAMP_UMBRA)
+ shadfac[3]= sqrt(1.0f-fac/div);
+ else
+ shadfac[3]= 1.0f-fac/div;
+ }
+}
+/* extern call from shade_lamp_loop */
+void ray_shadow(ShadeInput *shi, LampRen *lar, float *shadfac)
+{
+ Isect isec;
+ float lampco[3], maxsize;
+
+ /* setup isec */
+ if(shi->mat->mode & MA_SHADOW_TRA) isec.mode= RE_RAY_SHADOW_TRA;
+ else isec.mode= RE_RAY_SHADOW;
+
+ if(lar->mode & LA_LAYER) isec.lay= lar->lay; else isec.lay= -1;
+
+ /* only when not mir tracing, first hit optimm */
+ if(shi->depth==0)
+ isec.face_last= (RayFace*)lar->vlr_last[shi->thread];
+ else
+ isec.face_last= NULL;
+
+ if(lar->type==LA_SUN || lar->type==LA_HEMI) {
+ maxsize= RE_ray_tree_max_size(R.raytree);
+ lampco[0]= shi->co[0] - maxsize*lar->vec[0];
+ lampco[1]= shi->co[1] - maxsize*lar->vec[1];
+ lampco[2]= shi->co[2] - maxsize*lar->vec[2];
+ }
+ else {
+ VECCOPY(lampco, lar->co);
+ }
+
+ if (ELEM(lar->ray_samp_method, LA_SAMP_HALTON, LA_SAMP_HAMMERSLEY)) {
+
+ ray_shadow_qmc(shi, lar, lampco, shadfac, &isec);
+
+ } else {
+ if(lar->ray_totsamp<2) {
+
+ isec.faceorig= (RayFace*)shi->vlr;
+ shadfac[3]= 1.0f; // 1.0=full light
+
+ /* set up isec vec */
+ VECCOPY(isec.start, shi->co);
+ VECCOPY(isec.end, lampco);
+
+ if(isec.mode==RE_RAY_SHADOW_TRA) {
+ /* isec.col is like shadfac, so defines amount of light (0.0 is full shadow) */
+ isec.col[0]= isec.col[1]= isec.col[2]= 1.0f;
+ isec.col[3]= 1.0f;
+
+ ray_trace_shadow_tra(&isec, DEPTH_SHADOW_TRA, 0);
+ QUATCOPY(shadfac, isec.col);
+ }
+ else if(RE_ray_tree_intersect(R.raytree, &isec)) shadfac[3]= 0.0f;
+ }
+ else {
+ ray_shadow_jitter(shi, lar, lampco, shadfac, &isec);
+ }
+ }
+
+ /* for first hit optim, set last interesected shadow face */
+ if(shi->depth==0)
+ lar->vlr_last[shi->thread]= (VlakRen*)isec.face_last;
+
+}
+
+/* only when face points away from lamp, in direction of lamp, trace ray and find first exit point */
+void ray_translucent(ShadeInput *shi, LampRen *lar, float *distfac, float *co)
+{
+ Isect isec;
+ float lampco[3], maxsize;
+
+ /* setup isec */
+ isec.mode= RE_RAY_SHADOW_TRA;
+
+ if(lar->mode & LA_LAYER) isec.lay= lar->lay; else isec.lay= -1;
+
+ if(lar->type==LA_SUN || lar->type==LA_HEMI) {
+ maxsize= RE_ray_tree_max_size(R.raytree);
+ lampco[0]= shi->co[0] - maxsize*lar->vec[0];
+ lampco[1]= shi->co[1] - maxsize*lar->vec[1];
+ lampco[2]= shi->co[2] - maxsize*lar->vec[2];
+ }
+ else {
+ VECCOPY(lampco, lar->co);
+ }
+
+ isec.faceorig= (RayFace*)shi->vlr;
+
+ /* set up isec vec */
+ VECCOPY(isec.start, shi->co);
+ VECCOPY(isec.end, lampco);
+
+ if(RE_ray_tree_intersect(R.raytree, &isec)) {
+ /* we got a face */
+
+ /* render co */
+ co[0]= isec.start[0]+isec.labda*(isec.vec[0]);
+ co[1]= isec.start[1]+isec.labda*(isec.vec[1]);
+ co[2]= isec.start[2]+isec.labda*(isec.vec[2]);
+
+ *distfac= VecLength(isec.vec);
+ }
+ else
+ *distfac= 0.0f;
+}
+
+
diff --git a/source/blender/render/intern/source/raytrace.c b/source/blender/render/intern/source/raytrace.c
new file mode 100644
index 00000000000..f86032b5d68
--- /dev/null
+++ b/source/blender/render/intern/source/raytrace.c
@@ -0,0 +1,1353 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 1990-1998 NeoGeo BV.
+ * All rights reserved.
+ *
+ * Contributors: 2004/2005 Blender Foundation, full recode
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/* IMPORTANT NOTE: this code must be independent of any other render code
+ to use it outside the renderer! */
+
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <float.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_material_types.h"
+
+#include "BKE_utildefines.h"
+
+#include "BLI_arithb.h"
+
+#include "RE_raytrace.h"
+
+/* ********** structs *************** */
+
+#define BRANCH_ARRAY 1024
+#define NODE_ARRAY 4096
+
+typedef struct Branch
+{
+ struct Branch *b[8];
+} Branch;
+
+typedef struct OcVal
+{
+ short ocx, ocy, ocz;
+} OcVal;
+
+typedef struct Node
+{
+ struct RayFace *v[8];
+ struct OcVal ov[8];
+ struct Node *next;
+} Node;
+
+typedef struct Octree {
+ struct Branch **adrbranch;
+ struct Node **adrnode;
+ float ocsize; /* ocsize: mult factor, max size octree */
+ float ocfacx,ocfacy,ocfacz;
+ float min[3], max[3];
+ int ocres;
+ int branchcount, nodecount;
+ char *ocface; /* during building only */
+ RayCoordsFunc coordsfunc;
+ RayCheckFunc checkfunc;
+} Octree;
+
+/* ******** globals ***************** */
+
+/* just for statistics */
+static int raycount;
+static int accepted, rejected, coherent_ray;
+
+
+/* **************** ocval method ******************* */
+/* within one octree node, a set of 3x15 bits defines a 'boundbox' to OR with */
+
+#define OCVALRES 15
+#define BROW16(min, max) (((max)>=OCVALRES? 0xFFFF: (1<<(max+1))-1) - ((min>0)? ((1<<(min))-1):0) )
+
+static void calc_ocval_face(float *v1, float *v2, float *v3, float *v4, short x, short y, short z, OcVal *ov)
+{
+ float min[3], max[3];
+ int ocmin, ocmax;
+
+ VECCOPY(min, v1);
+ VECCOPY(max, v1);
+ DO_MINMAX(v2, min, max);
+ DO_MINMAX(v3, min, max);
+ if(v4) {
+ DO_MINMAX(v4, min, max);
+ }
+
+ ocmin= OCVALRES*(min[0]-x);
+ ocmax= OCVALRES*(max[0]-x);
+ ov->ocx= BROW16(ocmin, ocmax);
+
+ ocmin= OCVALRES*(min[1]-y);
+ ocmax= OCVALRES*(max[1]-y);
+ ov->ocy= BROW16(ocmin, ocmax);
+
+ ocmin= OCVALRES*(min[2]-z);
+ ocmax= OCVALRES*(max[2]-z);
+ ov->ocz= BROW16(ocmin, ocmax);
+
+}
+
+static void calc_ocval_ray(OcVal *ov, float xo, float yo, float zo, float *vec1, float *vec2)
+{
+ int ocmin, ocmax;
+
+ if(vec1[0]<vec2[0]) {
+ ocmin= OCVALRES*(vec1[0] - xo);
+ ocmax= OCVALRES*(vec2[0] - xo);
+ } else {
+ ocmin= OCVALRES*(vec2[0] - xo);
+ ocmax= OCVALRES*(vec1[0] - xo);
+ }
+ ov->ocx= BROW16(ocmin, ocmax);
+
+ if(vec1[1]<vec2[1]) {
+ ocmin= OCVALRES*(vec1[1] - yo);
+ ocmax= OCVALRES*(vec2[1] - yo);
+ } else {
+ ocmin= OCVALRES*(vec2[1] - yo);
+ ocmax= OCVALRES*(vec1[1] - yo);
+ }
+ ov->ocy= BROW16(ocmin, ocmax);
+
+ if(vec1[2]<vec2[2]) {
+ ocmin= OCVALRES*(vec1[2] - zo);
+ ocmax= OCVALRES*(vec2[2] - zo);
+ } else {
+ ocmin= OCVALRES*(vec2[2] - zo);
+ ocmax= OCVALRES*(vec1[2] - zo);
+ }
+ ov->ocz= BROW16(ocmin, ocmax);
+}
+
+/* ************* octree ************** */
+
+static Branch *addbranch(Octree *oc, Branch *br, short ocb)
+{
+ int index;
+
+ if(br->b[ocb]) return br->b[ocb];
+
+ oc->branchcount++;
+ index= oc->branchcount>>12;
+
+ if(oc->adrbranch[index]==NULL)
+ oc->adrbranch[index]= MEM_callocN(4096*sizeof(Branch), "new oc branch");
+
+ if(oc->branchcount>= BRANCH_ARRAY*4096) {
+ printf("error; octree branches full\n");
+ oc->branchcount=0;
+ }
+
+ return br->b[ocb]= oc->adrbranch[index]+(oc->branchcount & 4095);
+}
+
+static Node *addnode(Octree *oc)
+{
+ int index;
+
+ oc->nodecount++;
+ index= oc->nodecount>>12;
+
+ if(oc->adrnode[index]==NULL)
+ oc->adrnode[index]= MEM_callocN(4096*sizeof(Node),"addnode");
+
+ if(oc->nodecount> NODE_ARRAY*NODE_ARRAY) {
+ printf("error; octree nodes full\n");
+ oc->nodecount=0;
+ }
+
+ return oc->adrnode[index]+(oc->nodecount & 4095);
+}
+
+static int face_in_node(RayFace *face, short x, short y, short z, float rtf[][3])
+{
+ static float nor[3], d;
+ float fx, fy, fz;
+
+ // init static vars
+ if(face) {
+ CalcNormFloat(rtf[0], rtf[1], rtf[2], nor);
+ d= -nor[0]*rtf[0][0] - nor[1]*rtf[0][1] - nor[2]*rtf[0][2];
+ return 0;
+ }
+
+ fx= x;
+ fy= y;
+ fz= z;
+
+ if((fx)*nor[0] + (fy)*nor[1] + (fz)*nor[2] + d > 0.0f) {
+ if((fx+1)*nor[0] + (fy )*nor[1] + (fz )*nor[2] + d < 0.0f) return 1;
+ if((fx )*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d < 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d < 0.0f) return 1;
+
+ if((fx )*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
+ if((fx )*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d < 0.0f) return 1;
+ }
+ else {
+ if((fx+1)*nor[0] + (fy )*nor[1] + (fz )*nor[2] + d > 0.0f) return 1;
+ if((fx )*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d > 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz )*nor[2] + d > 0.0f) return 1;
+
+ if((fx )*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy )*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
+ if((fx )*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
+ if((fx+1)*nor[0] + (fy+1)*nor[1] + (fz+1)*nor[2] + d > 0.0f) return 1;
+ }
+
+ return 0;
+}
+
+static void ocwrite(Octree *oc, RayFace *face, int quad, short x, short y, short z, float rtf[][3])
+{
+ Branch *br;
+ Node *no;
+ short a, oc0, oc1, oc2, oc3, oc4, oc5;
+
+ x<<=2;
+ y<<=1;
+
+ br= oc->adrbranch[0];
+
+ if(oc->ocres==512) {
+ oc0= ((x & 1024)+(y & 512)+(z & 256))>>8;
+ br= addbranch(oc, br, oc0);
+ }
+ if(oc->ocres>=256) {
+ oc0= ((x & 512)+(y & 256)+(z & 128))>>7;
+ br= addbranch(oc, br, oc0);
+ }
+ if(oc->ocres>=128) {
+ oc0= ((x & 256)+(y & 128)+(z & 64))>>6;
+ br= addbranch(oc, br, oc0);
+ }
+
+ oc0= ((x & 128)+(y & 64)+(z & 32))>>5;
+ oc1= ((x & 64)+(y & 32)+(z & 16))>>4;
+ oc2= ((x & 32)+(y & 16)+(z & 8))>>3;
+ oc3= ((x & 16)+(y & 8)+(z & 4))>>2;
+ oc4= ((x & 8)+(y & 4)+(z & 2))>>1;
+ oc5= ((x & 4)+(y & 2)+(z & 1));
+
+ br= addbranch(oc, br,oc0);
+ br= addbranch(oc, br,oc1);
+ br= addbranch(oc, br,oc2);
+ br= addbranch(oc, br,oc3);
+ br= addbranch(oc, br,oc4);
+ no= (Node *)br->b[oc5];
+ if(no==NULL) br->b[oc5]= (Branch *)(no= addnode(oc));
+
+ while(no->next) no= no->next;
+
+ a= 0;
+ if(no->v[7]) { /* node full */
+ no->next= addnode(oc);
+ no= no->next;
+ }
+ else {
+ while(no->v[a]!=NULL) a++;
+ }
+
+ no->v[a]= face;
+
+ if(quad)
+ calc_ocval_face(rtf[0], rtf[1], rtf[2], rtf[3], x>>2, y>>1, z, &no->ov[a]);
+ else
+ calc_ocval_face(rtf[0], rtf[1], rtf[2], NULL, x>>2, y>>1, z, &no->ov[a]);
+}
+
+static void d2dda(Octree *oc, short b1, short b2, short c1, short c2, char *ocface, short rts[][3], float rtf[][3])
+{
+ int ocx1,ocx2,ocy1,ocy2;
+ int x,y,dx=0,dy=0;
+ float ox1,ox2,oy1,oy2;
+ float labda,labdao,labdax,labday,ldx,ldy;
+
+ ocx1= rts[b1][c1];
+ ocy1= rts[b1][c2];
+ ocx2= rts[b2][c1];
+ ocy2= rts[b2][c2];
+
+ if(ocx1==ocx2 && ocy1==ocy2) {
+ ocface[oc->ocres*ocx1+ocy1]= 1;
+ return;
+ }
+
+ ox1= rtf[b1][c1];
+ oy1= rtf[b1][c2];
+ ox2= rtf[b2][c1];
+ oy2= rtf[b2][c2];
+
+ if(ox1!=ox2) {
+ if(ox2-ox1>0.0f) {
+ labdax= (ox1-ocx1-1.0f)/(ox1-ox2);
+ ldx= -1.0f/(ox1-ox2);
+ dx= 1;
+ } else {
+ labdax= (ox1-ocx1)/(ox1-ox2);
+ ldx= 1.0f/(ox1-ox2);
+ dx= -1;
+ }
+ } else {
+ labdax=1.0f;
+ ldx=0;
+ }
+
+ if(oy1!=oy2) {
+ if(oy2-oy1>0.0f) {
+ labday= (oy1-ocy1-1.0f)/(oy1-oy2);
+ ldy= -1.0f/(oy1-oy2);
+ dy= 1;
+ } else {
+ labday= (oy1-ocy1)/(oy1-oy2);
+ ldy= 1.0f/(oy1-oy2);
+ dy= -1;
+ }
+ } else {
+ labday=1.0f;
+ ldy=0;
+ }
+
+ x=ocx1; y=ocy1;
+ labda= MIN2(labdax, labday);
+
+ while(TRUE) {
+
+ if(x<0 || y<0 || x>=oc->ocres || y>=oc->ocres);
+ else ocface[oc->ocres*x+y]= 1;
+
+ labdao=labda;
+ if(labdax==labday) {
+ labdax+=ldx;
+ x+=dx;
+ labday+=ldy;
+ y+=dy;
+ } else {
+ if(labdax<labday) {
+ labdax+=ldx;
+ x+=dx;
+ } else {
+ labday+=ldy;
+ y+=dy;
+ }
+ }
+ labda=MIN2(labdax,labday);
+ if(labda==labdao) break;
+ if(labda>=1.0f) break;
+ }
+ ocface[oc->ocres*ocx2+ocy2]=1;
+}
+
+static void filltriangle(Octree *oc, short c1, short c2, char *ocface, short *ocmin)
+{
+ short *ocmax;
+ int a, x, y, y1, y2;
+
+ ocmax=ocmin+3;
+
+ for(x=ocmin[c1];x<=ocmax[c1];x++) {
+ a= oc->ocres*x;
+ for(y=ocmin[c2];y<=ocmax[c2];y++) {
+ if(ocface[a+y]) {
+ y++;
+ while(ocface[a+y] && y!=ocmax[c2]) y++;
+ for(y1=ocmax[c2];y1>y;y1--) {
+ if(ocface[a+y1]) {
+ for(y2=y;y2<=y1;y2++) ocface[a+y2]=1;
+ y1=0;
+ }
+ }
+ y=ocmax[c2];
+ }
+ }
+ }
+}
+
+void RE_ray_tree_free(RayTree *tree)
+{
+ Octree *oc= (Octree*)tree;
+
+#if 0
+ printf("branches %d nodes %d\n", oc->branchcount, oc->nodecount);
+ printf("raycount %d \n", raycount);
+ printf("ray coherent %d \n", coherent_ray);
+ printf("accepted %d rejected %d\n", accepted, rejected);
+#endif
+ if(oc->ocface)
+ MEM_freeN(oc->ocface);
+
+ if(oc->adrbranch) {
+ int a= 0;
+ while(oc->adrbranch[a]) {
+ MEM_freeN(oc->adrbranch[a]);
+ oc->adrbranch[a]= NULL;
+ a++;
+ }
+ MEM_freeN(oc->adrbranch);
+ oc->adrbranch= NULL;
+ }
+ oc->branchcount= 0;
+
+ if(oc->adrnode) {
+ int a= 0;
+ while(oc->adrnode[a]) {
+ MEM_freeN(oc->adrnode[a]);
+ oc->adrnode[a]= NULL;
+ a++;
+ }
+ MEM_freeN(oc->adrnode);
+ oc->adrnode= NULL;
+ }
+ oc->nodecount= 0;
+
+ MEM_freeN(oc);
+}
+
+RayTree *RE_ray_tree_create(int ocres, int totface, float *min, float *max, RayCoordsFunc coordsfunc, RayCheckFunc checkfunc)
+{
+ Octree *oc;
+ float t00, t01, t02;
+ int c, ocres2;
+
+ oc= MEM_callocN(sizeof(Octree), "Octree");
+ oc->adrbranch= MEM_callocN(sizeof(void *)*BRANCH_ARRAY, "octree branches");
+ oc->adrnode= MEM_callocN(sizeof(void *)*NODE_ARRAY, "octree nodes");
+
+ oc->coordsfunc= coordsfunc;
+ oc->checkfunc= checkfunc;
+
+ /* only for debug info */
+ raycount=0;
+ accepted= 0;
+ rejected= 0;
+ coherent_ray= 0;
+
+ /* fill main octree struct */
+ oc->ocres= ocres;
+ ocres2= oc->ocres*oc->ocres;
+
+ VECCOPY(oc->min, min);
+ VECCOPY(oc->max, max);
+
+ oc->adrbranch[0]=(Branch *)MEM_callocN(4096*sizeof(Branch), "makeoctree");
+
+ /* the lookup table, per face, for which nodes to fill in */
+ oc->ocface= MEM_callocN( 3*ocres2 + 8, "ocface");
+ memset(oc->ocface, 0, 3*ocres2);
+
+ for(c=0;c<3;c++) { /* octree enlarge, still needed? */
+ oc->min[c]-= 0.01f;
+ oc->max[c]+= 0.01f;
+ }
+
+ t00= oc->max[0]-oc->min[0];
+ t01= oc->max[1]-oc->min[1];
+ t02= oc->max[2]-oc->min[2];
+
+ /* this minus 0.1 is old safety... seems to be needed? */
+ oc->ocfacx= (oc->ocres-0.1)/t00;
+ oc->ocfacy= (oc->ocres-0.1)/t01;
+ oc->ocfacz= (oc->ocres-0.1)/t02;
+
+ oc->ocsize= sqrt(t00*t00+t01*t01+t02*t02); /* global, max size octree */
+
+ return (RayTree*)oc;
+}
+
+void RE_ray_tree_add_face(RayTree *tree, RayFace *face)
+{
+ Octree *oc = (Octree*)tree;
+ float *v1, *v2, *v3, *v4, ocfac[3], rtf[4][3];
+ short rts[4][3], ocmin[6], *ocmax;
+ char *ocface= oc->ocface; // front, top, size view of face, to fill in
+ int a, b, c, oc1, oc2, oc3, oc4, x, y, z, ocres2;
+
+ ocfac[0]= oc->ocfacx;
+ ocfac[1]= oc->ocfacy;
+ ocfac[2]= oc->ocfacz;
+
+ ocres2= oc->ocres*oc->ocres;
+
+ ocmax= ocmin+3;
+
+ oc->coordsfunc(face, &v1, &v2, &v3, &v4);
+
+ for(c=0;c<3;c++) {
+ rtf[0][c]= (v1[c]-oc->min[c])*ocfac[c] ;
+ rts[0][c]= (short)rtf[0][c];
+ rtf[1][c]= (v2[c]-oc->min[c])*ocfac[c] ;
+ rts[1][c]= (short)rtf[1][c];
+ rtf[2][c]= (v3[c]-oc->min[c])*ocfac[c] ;
+ rts[2][c]= (short)rtf[2][c];
+ if(v4) {
+ rtf[3][c]= (v4[c]-oc->min[c])*ocfac[c] ;
+ rts[3][c]= (short)rtf[3][c];
+ }
+ }
+
+ for(c=0;c<3;c++) {
+ oc1= rts[0][c];
+ oc2= rts[1][c];
+ oc3= rts[2][c];
+ if(v4==NULL) {
+ ocmin[c]= MIN3(oc1,oc2,oc3);
+ ocmax[c]= MAX3(oc1,oc2,oc3);
+ }
+ else {
+ oc4= rts[3][c];
+ ocmin[c]= MIN4(oc1,oc2,oc3,oc4);
+ ocmax[c]= MAX4(oc1,oc2,oc3,oc4);
+ }
+ if(ocmax[c]>oc->ocres-1) ocmax[c]=oc->ocres-1;
+ if(ocmin[c]<0) ocmin[c]=0;
+ }
+
+ if(ocmin[0]==ocmax[0] && ocmin[1]==ocmax[1] && ocmin[2]==ocmax[2]) {
+ ocwrite(oc, face, (v4 != NULL), ocmin[0], ocmin[1], ocmin[2], rtf);
+ }
+ else {
+
+ d2dda(oc, 0,1,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 0,1,0,2,ocface,rts,rtf);
+ d2dda(oc, 0,1,1,2,ocface+2*ocres2,rts,rtf);
+ d2dda(oc, 1,2,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 1,2,0,2,ocface,rts,rtf);
+ d2dda(oc, 1,2,1,2,ocface+2*ocres2,rts,rtf);
+ if(v4==NULL) {
+ d2dda(oc, 2,0,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 2,0,0,2,ocface,rts,rtf);
+ d2dda(oc, 2,0,1,2,ocface+2*ocres2,rts,rtf);
+ }
+ else {
+ d2dda(oc, 2,3,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 2,3,0,2,ocface,rts,rtf);
+ d2dda(oc, 2,3,1,2,ocface+2*ocres2,rts,rtf);
+ d2dda(oc, 3,0,0,1,ocface+ocres2,rts,rtf);
+ d2dda(oc, 3,0,0,2,ocface,rts,rtf);
+ d2dda(oc, 3,0,1,2,ocface+2*ocres2,rts,rtf);
+ }
+ /* nothing todo with triangle..., just fills :) */
+ filltriangle(oc, 0,1,ocface+ocres2,ocmin);
+ filltriangle(oc, 0,2,ocface,ocmin);
+ filltriangle(oc, 1,2,ocface+2*ocres2,ocmin);
+
+ /* init static vars here */
+ face_in_node(face, 0,0,0, rtf);
+
+ for(x=ocmin[0];x<=ocmax[0];x++) {
+ a= oc->ocres*x;
+ for(y=ocmin[1];y<=ocmax[1];y++) {
+ if(ocface[a+y+ocres2]) {
+ b= oc->ocres*y+2*ocres2;
+ for(z=ocmin[2];z<=ocmax[2];z++) {
+ if(ocface[b+z] && ocface[a+z]) {
+ if(face_in_node(NULL, x, y, z, rtf))
+ ocwrite(oc, face, (v4 != NULL), x,y,z, rtf);
+ }
+ }
+ }
+ }
+ }
+
+ /* same loops to clear octree, doubt it can be done smarter */
+ for(x=ocmin[0];x<=ocmax[0];x++) {
+ a= oc->ocres*x;
+ for(y=ocmin[1];y<=ocmax[1];y++) {
+ /* x-y */
+ ocface[a+y+ocres2]= 0;
+
+ b= oc->ocres*y + 2*ocres2;
+ for(z=ocmin[2];z<=ocmax[2];z++) {
+ /* y-z */
+ ocface[b+z]= 0;
+ /* x-z */
+ ocface[a+z]= 0;
+ }
+ }
+ }
+ }
+}
+
+void RE_ray_tree_done(RayTree *tree)
+{
+ Octree *oc= (Octree*)tree;
+
+ MEM_freeN(oc->ocface);
+ oc->ocface= NULL;
+}
+
+/* ************ raytracer **************** */
+
+/* only for self-intersecting test with current render face (where ray left) */
+static int intersection2(RayFace *face, RayCoordsFunc coordsfunc, float r0, float r1, float r2, float rx1, float ry1, float rz1)
+{
+ float *v1, *v2, *v3, *v4;
+ float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22;
+ float m0, m1, m2, divdet, det, det1;
+ float u1, v, u2;
+
+ coordsfunc(face, &v1, &v2, &v3, &v4);
+
+ /* happens for baking with non existing face */
+ if(v1==NULL)
+ return 1;
+
+ if (v4) {
+ SWAP(float*, v3, v4);
+ }
+
+ t00= v3[0]-v1[0];
+ t01= v3[1]-v1[1];
+ t02= v3[2]-v1[2];
+ t10= v3[0]-v2[0];
+ t11= v3[1]-v2[1];
+ t12= v3[2]-v2[2];
+
+ x0= t11*r2-t12*r1;
+ x1= t12*r0-t10*r2;
+ x2= t10*r1-t11*r0;
+
+ divdet= t00*x0+t01*x1+t02*x2;
+
+ m0= rx1-v3[0];
+ m1= ry1-v3[1];
+ m2= rz1-v3[2];
+ det1= m0*x0+m1*x1+m2*x2;
+
+ if(divdet!=0.0f) {
+ u1= det1/divdet;
+
+ if(u1<=0.0f) {
+ det= t00*(m1*r2-m2*r1);
+ det+= t01*(m2*r0-m0*r2);
+ det+= t02*(m0*r1-m1*r0);
+ v= det/divdet;
+
+ if(v<=0.0f && (u1 + v) >= -1.0f) {
+ return 1;
+ }
+ }
+ }
+
+ if(v4) {
+
+ t20= v3[0]-v4[0];
+ t21= v3[1]-v4[1];
+ t22= v3[2]-v4[2];
+
+ divdet= t20*x0+t21*x1+t22*x2;
+ if(divdet!=0.0f) {
+ u2= det1/divdet;
+
+ if(u2<=0.0f) {
+ det= t20*(m1*r2-m2*r1);
+ det+= t21*(m2*r0-m0*r2);
+ det+= t22*(m0*r1-m1*r0);
+ v= det/divdet;
+
+ if(v<=0.0f && (u2 + v) >= -1.0f) {
+ return 2;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+#if 0
+/* ray - line intersection */
+/* disabled until i got real & fast cylinder checking, this code doesnt work proper
+for faster strands */
+
+static int intersection_strand(Isect *is)
+{
+ float v1[3], v2[3]; /* length of strand */
+ float axis[3], rc[3], nor[3], radline, dist, len;
+
+ /* radius strand */
+ radline= 0.5f*VecLenf(is->vlr->v1->co, is->vlr->v2->co);
+
+ VecMidf(v1, is->vlr->v1->co, is->vlr->v2->co);
+ VecMidf(v2, is->vlr->v3->co, is->vlr->v4->co);
+
+ VECSUB(rc, v1, is->start); /* vector from base ray to base cylinder */
+ VECSUB(axis, v2, v1); /* cylinder axis */
+
+ CROSS(nor, is->vec, axis);
+ len= VecLength(nor);
+
+ if(len<FLT_EPSILON)
+ return 0;
+
+ dist= INPR(rc, nor)/len; /* distance between ray and axis cylinder */
+
+ if(dist<radline && dist>-radline) {
+ float dot1, dot2, dot3, rlen, alen, div;
+ float labda;
+
+ /* calculating the intersection point of shortest distance */
+ dot1 = INPR(rc, is->vec);
+ dot2 = INPR(is->vec, axis);
+ dot3 = INPR(rc, axis);
+ rlen = INPR(is->vec, is->vec);
+ alen = INPR(axis, axis);
+
+ div = alen * rlen - dot2 * dot2;
+ if (ABS(div) < FLT_EPSILON)
+ return 0;
+
+ labda = (dot1*dot2 - dot3*rlen)/div;
+
+ radline/= sqrt(alen);
+
+ /* labda: where on axis do we have closest intersection? */
+ if(labda >= -radline && labda <= 1.0f+radline) {
+ VlakRen *vlr= is->faceorig;
+ VertRen *v1= is->vlr->v1, *v2= is->vlr->v2, *v3= is->vlr->v3, *v4= is->vlr->v4;
+ /* but we dont do shadows from faces sharing edge */
+
+ if(v1==vlr->v1 || v2==vlr->v1 || v3==vlr->v1 || v4==vlr->v1) return 0;
+ if(v1==vlr->v2 || v2==vlr->v2 || v3==vlr->v2 || v4==vlr->v2) return 0;
+ if(v1==vlr->v3 || v2==vlr->v3 || v3==vlr->v3 || v4==vlr->v3) return 0;
+ if(vlr->v4) {
+ if(v1==vlr->v4 || v2==vlr->v4 || v3==vlr->v4 || v4==vlr->v4) return 0;
+ }
+ return 1;
+ }
+ }
+ return 0;
+}
+#endif
+
+/* ray - triangle or quad intersection */
+int RE_ray_face_intersection(Isect *is, RayCoordsFunc coordsfunc)
+{
+ RayFace *face= is->face;
+ float *v1,*v2,*v3,*v4;
+ float x0,x1,x2,t00,t01,t02,t10,t11,t12,t20,t21,t22,r0,r1,r2;
+ float m0, m1, m2, divdet, det1;
+ short ok=0;
+
+ /* disabled until i got real & fast cylinder checking, this code doesnt work proper
+ for faster strands */
+// if(is->mode==RE_RAY_SHADOW && is->vlr->flag & R_STRAND)
+// return intersection_strand(is);
+
+ coordsfunc(face, &v1, &v2, &v3, &v4);
+
+ if (v4) {
+ SWAP(float*, v3, v4);
+ }
+
+ t00= v3[0]-v1[0];
+ t01= v3[1]-v1[1];
+ t02= v3[2]-v1[2];
+ t10= v3[0]-v2[0];
+ t11= v3[1]-v2[1];
+ t12= v3[2]-v2[2];
+
+ r0= is->vec[0];
+ r1= is->vec[1];
+ r2= is->vec[2];
+
+ x0= t12*r1-t11*r2;
+ x1= t10*r2-t12*r0;
+ x2= t11*r0-t10*r1;
+
+ divdet= t00*x0+t01*x1+t02*x2;
+
+ m0= is->start[0]-v3[0];
+ m1= is->start[1]-v3[1];
+ m2= is->start[2]-v3[2];
+ det1= m0*x0+m1*x1+m2*x2;
+
+ if(divdet!=0.0f) {
+ float u;
+
+ divdet= 1.0f/divdet;
+ u= det1*divdet;
+ if(u<0.0f && u>-1.0f) {
+ float v, cros0, cros1, cros2;
+
+ cros0= m1*t02-m2*t01;
+ cros1= m2*t00-m0*t02;
+ cros2= m0*t01-m1*t00;
+ v= divdet*(cros0*r0 + cros1*r1 + cros2*r2);
+
+ if(v<0.0f && (u + v) > -1.0f) {
+ float labda;
+ labda= divdet*(cros0*t10 + cros1*t11 + cros2*t12);
+
+ if(labda>0.0f && labda<1.0f) {
+ is->labda= labda;
+ is->u= u; is->v= v;
+ ok= 1;
+ }
+ }
+ }
+ }
+
+ if(ok==0 && v4) {
+
+ t20= v3[0]-v4[0];
+ t21= v3[1]-v4[1];
+ t22= v3[2]-v4[2];
+
+ divdet= t20*x0+t21*x1+t22*x2;
+ if(divdet!=0.0f) {
+ float u;
+ divdet= 1.0f/divdet;
+ u = det1*divdet;
+
+ if(u<0.0f && u>-1.0f) {
+ float v, cros0, cros1, cros2;
+ cros0= m1*t22-m2*t21;
+ cros1= m2*t20-m0*t22;
+ cros2= m0*t21-m1*t20;
+ v= divdet*(cros0*r0 + cros1*r1 + cros2*r2);
+
+ if(v<0.0f && (u + v) > -1.0f) {
+ float labda;
+ labda= divdet*(cros0*t10 + cros1*t11 + cros2*t12);
+
+ if(labda>0.0f && labda<1.0f) {
+ ok= 2;
+ is->labda= labda;
+ is->u= u; is->v= v;
+ }
+ }
+ }
+ }
+ }
+
+ if(ok) {
+ is->isect= ok; // wich half of the quad
+
+ if(is->mode!=RE_RAY_SHADOW) {
+ /* for mirror & tra-shadow: large faces can be filled in too often, this prevents
+ a face being detected too soon... */
+ if(is->labda > is->ddalabda) {
+ return 0;
+ }
+ }
+
+ /* when a shadow ray leaves a face, it can be little outside the edges of it, causing
+ intersection to be detected in its neighbour face */
+
+ if(is->facecontr && is->faceisect); // optimizing, the tests below are not needed
+ else if(is->labda< .1) {
+ RayFace *face= is->faceorig;
+ float *origv1, *origv2, *origv3, *origv4;
+ short de= 0;
+
+ coordsfunc(face, &origv1, &origv2, &origv3, &origv4);
+
+ if(v1==origv1 || v2==origv1 || v3==origv1 || v4==origv1) de++;
+ if(v1==origv2 || v2==origv2 || v3==origv2 || v4==origv2) de++;
+ if(v1==origv3 || v2==origv3 || v3==origv3 || v4==origv3) de++;
+ if(origv4) {
+ if(v1==origv4 || v2==origv4 || v3==origv4 || v4==origv4) de++;
+ }
+ if(de) {
+ /* so there's a shared edge or vertex, let's intersect ray with face
+ itself, if that's true we can safely return 1, otherwise we assume
+ the intersection is invalid, 0 */
+
+ if(is->facecontr==NULL) {
+ is->facecontr= face;
+ is->faceisect= intersection2(face, coordsfunc, -r0, -r1, -r2, is->start[0], is->start[1], is->start[2]);
+ }
+
+ if(is->faceisect) return 1;
+ return 0;
+ }
+ }
+
+ return 1;
+ }
+
+ return 0;
+}
+
+/* check all faces in this node */
+static int testnode(Octree *oc, Isect *is, Node *no, OcVal ocval)
+{
+ RayFace *face;
+ short nr=0;
+ OcVal *ov;
+
+ /* return on any first hit */
+ if(is->mode==RE_RAY_SHADOW) {
+
+ face= no->v[0];
+ while(face) {
+
+ if(is->faceorig != face) {
+
+ if(oc->checkfunc(is, face)) {
+
+ ov= no->ov+nr;
+ if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
+ //accepted++;
+ is->face= face;
+
+ if(RE_ray_face_intersection(is, oc->coordsfunc)) {
+ is->face_last= face;
+ return 1;
+ }
+ }
+ //else rejected++;
+ }
+ }
+
+ nr++;
+ if(nr==8) {
+ no= no->next;
+ if(no==0) return 0;
+ nr=0;
+ }
+ face= no->v[nr];
+ }
+ }
+ else { /* else mirror or glass or shadowtra, return closest face */
+ Isect isect;
+ int found= 0;
+
+ is->labda= 1.0f; /* needed? */
+ isect= *is; /* copy for sorting */
+
+ face= no->v[0];
+ while(face) {
+
+ if(is->faceorig != face) {
+ if(oc->checkfunc(is, face)) {
+ ov= no->ov+nr;
+ if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) {
+ //accepted++;
+
+ isect.face= face;
+ if(RE_ray_face_intersection(&isect, oc->coordsfunc)) {
+ if(isect.labda<is->labda) *is= isect;
+ found= 1;
+ }
+ }
+ //else rejected++;
+ }
+ }
+
+ nr++;
+ if(nr==8) {
+ no= no->next;
+ if(no==NULL) break;
+ nr=0;
+ }
+ face= no->v[nr];
+ }
+
+ return found;
+ }
+
+ return 0;
+}
+
+/* find the Node for the octree coord x y z */
+static Node *ocread(Octree *oc, int x, int y, int z)
+{
+ Branch *br;
+ int oc1;
+
+ x<<=2;
+ y<<=1;
+
+ br= oc->adrbranch[0];
+
+ if(oc->ocres==512) {
+ oc1= ((x & 1024)+(y & 512)+(z & 256))>>8;
+ br= br->b[oc1];
+ if(br==NULL) {
+ return NULL;
+ }
+ }
+ if(oc->ocres>=256) {
+ oc1= ((x & 512)+(y & 256)+(z & 128))>>7;
+ br= br->b[oc1];
+ if(br==NULL) {
+ return NULL;
+ }
+ }
+ if(oc->ocres>=128) {
+ oc1= ((x & 256)+(y & 128)+(z & 64))>>6;
+ br= br->b[oc1];
+ if(br==NULL) {
+ return NULL;
+ }
+ }
+
+ oc1= ((x & 128)+(y & 64)+(z & 32))>>5;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 64)+(y & 32)+(z & 16))>>4;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 32)+(y & 16)+(z & 8))>>3;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 16)+(y & 8)+(z & 4))>>2;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 8)+(y & 4)+(z & 2))>>1;
+ br= br->b[oc1];
+ if(br) {
+ oc1= ((x & 4)+(y & 2)+(z & 1));
+ return (Node *)br->b[oc1];
+ }
+ }
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static int cliptest(float p, float q, float *u1, float *u2)
+{
+ float r;
+
+ if(p<0.0f) {
+ if(q<p) return 0;
+ else if(q<0.0f) {
+ r= q/p;
+ if(r>*u2) return 0;
+ else if(r>*u1) *u1=r;
+ }
+ }
+ else {
+ if(p>0.0f) {
+ if(q<0.0f) return 0;
+ else if(q<p) {
+ r= q/p;
+ if(r<*u1) return 0;
+ else if(r<*u2) *u2=r;
+ }
+ }
+ else if(q<0.0f) return 0;
+ }
+ return 1;
+}
+
+/* extensive coherence checks/storage cancels out the benefit of it, and gives errors... we
+ need better methods, sample code commented out below (ton) */
+
+/*
+
+in top: static int coh_nodes[16*16*16][6];
+in makeoctree: memset(coh_nodes, 0, sizeof(coh_nodes));
+
+static void add_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
+{
+ short *sp;
+
+ sp= coh_nodes[ (ocx2 & 15) + 16*(ocy2 & 15) + 256*(ocz2 & 15) ];
+ sp[0]= ocx1; sp[1]= ocy1; sp[2]= ocz1;
+ sp[3]= ocx2; sp[4]= ocy2; sp[5]= ocz2;
+
+}
+
+static int do_coherence_test(int ocx1, int ocx2, int ocy1, int ocy2, int ocz1, int ocz2)
+{
+ short *sp;
+
+ sp= coh_nodes[ (ocx2 & 15) + 16*(ocy2 & 15) + 256*(ocz2 & 15) ];
+ if(sp[0]==ocx1 && sp[1]==ocy1 && sp[2]==ocz1 &&
+ sp[3]==ocx2 && sp[4]==ocy2 && sp[5]==ocz2) return 1;
+ return 0;
+}
+
+*/
+
+/* return 1: found valid intersection */
+/* starts with is->faceorig */
+int RE_ray_tree_intersect(RayTree *tree, Isect *is)
+{
+ Octree *oc= (Octree*)tree;
+ Node *no;
+ OcVal ocval;
+ float vec1[3], vec2[3];
+ float u1,u2,ox1,ox2,oy1,oy2,oz1,oz2;
+ float labdao,labdax,ldx,labday,ldy,labdaz,ldz, ddalabda;
+ int dx,dy,dz;
+ int xo,yo,zo,c1=0;
+ int ocx1,ocx2,ocy1, ocy2,ocz1,ocz2;
+
+ /* clip with octree */
+ if(oc->branchcount==0) return 0;
+
+ /* do this before intersect calls */
+ is->facecontr= NULL; /* to check shared edge */
+ is->faceisect= is->isect= 0; /* shared edge, quad half flag */
+
+ /* only for shadow! */
+ if(is->mode==RE_RAY_SHADOW) {
+
+ /* check with last intersected shadow face */
+ if(is->face_last!=NULL && is->face_last!=is->faceorig) {
+ if(oc->checkfunc(is, is->face_last)) {
+ is->face= is->face_last;
+ VECSUB(is->vec, is->end, is->start);
+ if(RE_ray_face_intersection(is, oc->coordsfunc)) return 1;
+ }
+ }
+ }
+
+ ldx= is->end[0] - is->start[0];
+ u1= 0.0f;
+ u2= 1.0f;
+
+ /* clip with octree cube */
+ if(cliptest(-ldx, is->start[0]-oc->min[0], &u1,&u2)) {
+ if(cliptest(ldx, oc->max[0]-is->start[0], &u1,&u2)) {
+ ldy= is->end[1] - is->start[1];
+ if(cliptest(-ldy, is->start[1]-oc->min[1], &u1,&u2)) {
+ if(cliptest(ldy, oc->max[1]-is->start[1], &u1,&u2)) {
+ ldz= is->end[2] - is->start[2];
+ if(cliptest(-ldz, is->start[2]-oc->min[2], &u1,&u2)) {
+ if(cliptest(ldz, oc->max[2]-is->start[2], &u1,&u2)) {
+ c1=1;
+ if(u2<1.0f) {
+ is->end[0]= is->start[0]+u2*ldx;
+ is->end[1]= is->start[1]+u2*ldy;
+ is->end[2]= is->start[2]+u2*ldz;
+ }
+ if(u1>0.0f) {
+ is->start[0]+=u1*ldx;
+ is->start[1]+=u1*ldy;
+ is->start[2]+=u1*ldz;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if(c1==0) return 0;
+
+ /* reset static variables in ocread */
+ //ocread(oc, oc->ocres, 0, 0);
+
+ /* setup 3dda to traverse octree */
+ ox1= (is->start[0]-oc->min[0])*oc->ocfacx;
+ oy1= (is->start[1]-oc->min[1])*oc->ocfacy;
+ oz1= (is->start[2]-oc->min[2])*oc->ocfacz;
+ ox2= (is->end[0]-oc->min[0])*oc->ocfacx;
+ oy2= (is->end[1]-oc->min[1])*oc->ocfacy;
+ oz2= (is->end[2]-oc->min[2])*oc->ocfacz;
+
+ ocx1= (int)ox1;
+ ocy1= (int)oy1;
+ ocz1= (int)oz1;
+ ocx2= (int)ox2;
+ ocy2= (int)oy2;
+ ocz2= (int)oz2;
+
+ /* for intersection */
+ VECSUB(is->vec, is->end, is->start);
+
+ if(ocx1==ocx2 && ocy1==ocy2 && ocz1==ocz2) {
+ no= ocread(oc, ocx1, ocy1, ocz1);
+ if(no) {
+ /* exact intersection with node */
+ vec1[0]= ox1; vec1[1]= oy1; vec1[2]= oz1;
+ vec2[0]= ox2; vec2[1]= oy2; vec2[2]= oz2;
+ calc_ocval_ray(&ocval, (float)ocx1, (float)ocy1, (float)ocz1, vec1, vec2);
+ is->ddalabda= 1.0f;
+ if( testnode(oc, is, no, ocval) ) return 1;
+ }
+ }
+ else {
+ //static int coh_ocx1,coh_ocx2,coh_ocy1, coh_ocy2,coh_ocz1,coh_ocz2;
+ float dox, doy, doz;
+ int eqval;
+
+ /* calc labda en ld */
+ dox= ox1-ox2;
+ doy= oy1-oy2;
+ doz= oz1-oz2;
+
+ if(dox<-FLT_EPSILON) {
+ ldx= -1.0f/dox;
+ labdax= (ocx1-ox1+1.0f)*ldx;
+ dx= 1;
+ } else if(dox>FLT_EPSILON) {
+ ldx= 1.0f/dox;
+ labdax= (ox1-ocx1)*ldx;
+ dx= -1;
+ } else {
+ labdax=1.0f;
+ ldx=0;
+ dx= 0;
+ }
+
+ if(doy<-FLT_EPSILON) {
+ ldy= -1.0f/doy;
+ labday= (ocy1-oy1+1.0f)*ldy;
+ dy= 1;
+ } else if(doy>FLT_EPSILON) {
+ ldy= 1.0f/doy;
+ labday= (oy1-ocy1)*ldy;
+ dy= -1;
+ } else {
+ labday=1.0f;
+ ldy=0;
+ dy= 0;
+ }
+
+ if(doz<-FLT_EPSILON) {
+ ldz= -1.0f/doz;
+ labdaz= (ocz1-oz1+1.0f)*ldz;
+ dz= 1;
+ } else if(doz>FLT_EPSILON) {
+ ldz= 1.0f/doz;
+ labdaz= (oz1-ocz1)*ldz;
+ dz= -1;
+ } else {
+ labdaz=1.0f;
+ ldz=0;
+ dz= 0;
+ }
+
+ xo=ocx1; yo=ocy1; zo=ocz1;
+ labdao= ddalabda= MIN3(labdax,labday,labdaz);
+
+ vec2[0]= ox1;
+ vec2[1]= oy1;
+ vec2[2]= oz1;
+
+ /* this loop has been constructed to make sure the first and last node of ray
+ are always included, even when ddalabda==1.0f or larger */
+
+ while(TRUE) {
+
+ no= ocread(oc, xo, yo, zo);
+ if(no) {
+
+ /* calculate ray intersection with octree node */
+ VECCOPY(vec1, vec2);
+ // dox,y,z is negative
+ vec2[0]= ox1-ddalabda*dox;
+ vec2[1]= oy1-ddalabda*doy;
+ vec2[2]= oz1-ddalabda*doz;
+ calc_ocval_ray(&ocval, (float)xo, (float)yo, (float)zo, vec1, vec2);
+
+ is->ddalabda= ddalabda;
+ if( testnode(oc, is, no, ocval) ) return 1;
+ }
+
+ labdao= ddalabda;
+
+ /* traversing ocree nodes need careful detection of smallest values, with proper
+ exceptions for equal labdas */
+ eqval= (labdax==labday);
+ if(labday==labdaz) eqval += 2;
+ if(labdax==labdaz) eqval += 4;
+
+ if(eqval) { // only 4 cases exist!
+ if(eqval==7) { // x=y=z
+ xo+=dx; labdax+=ldx;
+ yo+=dy; labday+=ldy;
+ zo+=dz; labdaz+=ldz;
+ }
+ else if(eqval==1) { // x=y
+ if(labday < labdaz) {
+ xo+=dx; labdax+=ldx;
+ yo+=dy; labday+=ldy;
+ }
+ else {
+ zo+=dz; labdaz+=ldz;
+ }
+ }
+ else if(eqval==2) { // y=z
+ if(labdax < labday) {
+ xo+=dx; labdax+=ldx;
+ }
+ else {
+ yo+=dy; labday+=ldy;
+ zo+=dz; labdaz+=ldz;
+ }
+ }
+ else { // x=z
+ if(labday < labdax) {
+ yo+=dy; labday+=ldy;
+ }
+ else {
+ xo+=dx; labdax+=ldx;
+ zo+=dz; labdaz+=ldz;
+ }
+ }
+ }
+ else { // all three different, just three cases exist
+ eqval= (labdax<labday);
+ if(labday<labdaz) eqval += 2;
+ if(labdax<labdaz) eqval += 4;
+
+ if(eqval==7 || eqval==5) { // x smallest
+ xo+=dx; labdax+=ldx;
+ }
+ else if(eqval==2 || eqval==6) { // y smallest
+ yo+=dy; labday+=ldy;
+ }
+ else { // z smallest
+ zo+=dz; labdaz+=ldz;
+ }
+
+ }
+
+ ddalabda=MIN3(labdax,labday,labdaz);
+ if(ddalabda==labdao) break;
+ /* to make sure the last node is always checked */
+ if(labdao>=1.0f) break;
+ }
+ }
+
+ /* reached end, no intersections found */
+ is->face_last= NULL;
+ return 0;
+}
+
+float RE_ray_tree_max_size(RayTree *tree)
+{
+ return ((Octree*)tree)->ocsize;
+}
+
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 4e32cd16acf..0f91a92fe9c 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -772,7 +772,7 @@ static void reset_sky_speed(RenderPart *pa, RenderLayer *rl)
fp= RE_RenderLayerGetPass(rl, SCE_PASS_VECTOR);
if(fp==NULL) return;
- for(a= 4*pa->rectx*pa->recty; a>0; a--)
+ for(a= 4*pa->rectx*pa->recty - 1; a>=0; a--)
if(fp[a] == PASS_VECTOR_MAX) fp[a]= 0.0f;
}
@@ -1182,11 +1182,8 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, VlakRen *vlr, in
shade_input_set_triangle_i(shi, vlr, 0, 1, 2);
/* we don't want flipped normals, they screw up back scattering */
- if(vlr->noflag & R_FLIPPED_NO) {
- shi->facenor[0]= -shi->facenor[0];
- shi->facenor[1]= -shi->facenor[1];
- shi->facenor[2]= -shi->facenor[2];
- }
+ if(vlr->noflag & R_FLIPPED_NO)
+ VecMulf(shi->facenor, -1.0f);
/* center pixel */
x += 0.5f;
@@ -1214,6 +1211,12 @@ static void shade_sample_sss(ShadeSample *ssamp, Material *mat, VlakRen *vlr, in
shade_input_set_uv(shi);
shade_input_set_normals(shi);
+ /* not a pretty solution, but fixes common cases */
+ if(vlr->ob && vlr->ob->transflag & OB_NEG_SCALE) {
+ VecMulf(shi->vn, -1.0f);
+ VecMulf(shi->vno, -1.0f);
+ }
+
/* if nodetree, use the material that we are currently preprocessing
instead of the node material */
if(shi->mat->nodetree && shi->mat->use_nodes)
diff --git a/source/blender/render/intern/source/renderdatabase.c b/source/blender/render/intern/source/renderdatabase.c
index 6d9f0e4eb01..9dc337c1dc4 100644
--- a/source/blender/render/intern/source/renderdatabase.c
+++ b/source/blender/render/intern/source/renderdatabase.c
@@ -71,6 +71,7 @@
#include "BKE_customdata.h"
#include "BKE_texture.h"
+#include "BKE_DerivedMesh.h"
#include "RE_render_ext.h" /* externtex */
@@ -723,6 +724,152 @@ HaloRen *RE_inithalo(Render *re, Material *ma, float *vec, float *vec1,
return har;
}
+HaloRen *RE_inithalo_particle(Render *re, DerivedMesh *dm, Material *ma, float *vec, float *vec1,
+ float *orco, float *uvco, float hasize, float vectsize, int seed)
+{
+ HaloRen *har;
+ MTex *mtex;
+ float tin, tr, tg, tb, ta;
+ float xn, yn, zn, texvec[3], hoco[4], hoco1[4], in[3],tex[3],out[3];
+ int i;
+
+ if(hasize==0.0) return NULL;
+
+ projectverto(vec, re->winmat, hoco);
+ if(hoco[3]==0.0) return NULL;
+ if(vec1) {
+ projectverto(vec1, re->winmat, hoco1);
+ if(hoco1[3]==0.0) return NULL;
+ }
+
+ har= RE_findOrAddHalo(re, re->tothalo++);
+ VECCOPY(har->co, vec);
+ har->hasize= hasize;
+
+ /* actual projectvert is done in function project_renderdata() because of parts/border/pano */
+ /* we do it here for sorting of halos */
+ zn= hoco[3];
+ har->xs= 0.5*re->winx*(hoco[0]/zn);
+ har->ys= 0.5*re->winy*(hoco[1]/zn);
+ har->zs= 0x7FFFFF*(hoco[2]/zn);
+
+ har->zBufDist = 0x7FFFFFFF*(hoco[2]/zn);
+
+ /* halovect */
+ if(vec1) {
+
+ har->type |= HA_VECT;
+
+ xn= har->xs - 0.5*re->winx*(hoco1[0]/hoco1[3]);
+ yn= har->ys - 0.5*re->winy*(hoco1[1]/hoco1[3]);
+ if(xn==0.0 || (xn==0.0 && yn==0.0)) zn= 0.0;
+ else zn= atan2(yn, xn);
+
+ har->sin= sin(zn);
+ har->cos= cos(zn);
+ zn= VecLenf(vec1, vec)*0.5;
+
+ har->hasize= vectsize*zn + (1.0-vectsize)*hasize;
+
+ VecSubf(har->no, vec, vec1);
+ Normalize(har->no);
+ }
+
+ if(ma->mode & MA_HALO_XALPHA) har->type |= HA_XALPHA;
+
+ har->alfa= ma->alpha;
+ har->r= ma->r;
+ har->g= ma->g;
+ har->b= ma->b;
+ har->add= (255.0*ma->add);
+ har->mat= ma;
+ har->hard= ma->har;
+ har->seed= seed % 256;
+
+ if(ma->mode & MA_STAR) har->starpoints= ma->starc;
+ if(ma->mode & MA_HALO_LINES) har->linec= ma->linec;
+ if(ma->mode & MA_HALO_RINGS) har->ringc= ma->ringc;
+ if(ma->mode & MA_HALO_FLARE) har->flarec= ma->flarec;
+
+ if((ma->mode & MA_HALOTEX) && ma->mtex[0]){
+ har->tex= 1;
+ i=1;
+ }
+
+ for(i=0; i<MAX_MTEX; i++)
+ if(ma->mtex[i] && (ma->septex & (1<<i))==0) {
+ mtex= ma->mtex[i];
+ VECCOPY(texvec, vec);
+
+ if(mtex->texco & TEXCO_NORM) {
+ ;
+ }
+ else if(mtex->texco & TEXCO_OBJECT) {
+ if(mtex->object){
+ float imat[4][4];
+ /* imat should really be cached somewhere before this */
+ Mat4Invert(imat,mtex->object->obmat);
+ Mat4MulVecfl(imat,texvec);
+ }
+ /* texvec[0]+= imatbase->ivec[0]; */
+ /* texvec[1]+= imatbase->ivec[1]; */
+ /* texvec[2]+= imatbase->ivec[2]; */
+ /* Mat3MulVecfl(imatbase->imat, texvec); */
+ }
+ else if(mtex->texco & TEXCO_GLOB){
+ VECCOPY(texvec,vec);
+ }
+ else if(mtex->texco & TEXCO_UV && uvco){
+ int uv_index=CustomData_get_named_layer_index(&dm->faceData,CD_MTFACE,mtex->uvname);
+ if(uv_index<0)
+ uv_index=CustomData_get_active_layer_index(&dm->faceData,CD_MTFACE);
+
+ uv_index-=CustomData_get_layer_index(&dm->faceData,CD_MTFACE);
+
+ texvec[0]=2.0f*uvco[2*uv_index]-1.0f;
+ texvec[1]=2.0f*uvco[2*uv_index+1]-1.0f;
+ texvec[2]=0.0f;
+ }
+ else if(orco) {
+ VECCOPY(texvec, orco);
+ }
+
+ externtex(mtex, texvec, &tin, &tr, &tg, &tb, &ta);
+
+ //yn= tin*mtex->colfac;
+ //zn= tin*mtex->varfac;
+ if(mtex->mapto & MAP_COL) {
+ tex[0]=tr;
+ tex[1]=tg;
+ tex[2]=tb;
+ out[0]=har->r;
+ out[1]=har->g;
+ out[2]=har->b;
+
+ texture_rgb_blend(in,tex,out,tin,mtex->colfac,mtex->blendtype);
+ // zn= 1.0-yn;
+ //har->r= (yn*tr+ zn*ma->r);
+ //har->g= (yn*tg+ zn*ma->g);
+ //har->b= (yn*tb+ zn*ma->b);
+ har->r= in[0];
+ har->g= in[1];
+ har->b= in[2];
+ }
+ if(mtex->mapto & MAP_ALPHA)
+ har->alfa = texture_value_blend(mtex->def_var,har->alfa,tin,mtex->varfac,mtex->blendtype,mtex->maptoneg & MAP_ALPHA);
+ if(mtex->mapto & MAP_HAR)
+ har->hard = 1.0+126.0*texture_value_blend(mtex->def_var,((float)har->hard)/127.0,tin,mtex->varfac,mtex->blendtype,mtex->maptoneg & MAP_HAR);
+ if(mtex->mapto & MAP_RAYMIRR)
+ har->hasize = 100.0*texture_value_blend(mtex->def_var,har->hasize/100.0,tin,mtex->varfac,mtex->blendtype,mtex->maptoneg & MAP_RAYMIRR);
+ /* now what on earth is this good for?? */
+ //if(mtex->texco & 16) {
+ // har->alfa= tin;
+ //}
+ }
+
+ return har;
+}
+
/* -------------------------- operations on entire database ----------------------- */
/* ugly function for halos in panorama */
diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c
index ca661469b36..71b59f7b8be 100644
--- a/source/blender/render/intern/source/shadeinput.c
+++ b/source/blender/render/intern/source/shadeinput.c
@@ -675,11 +675,13 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->vcol[0]= shi->col[0].col[0];
shi->vcol[1]= shi->col[0].col[1];
shi->vcol[2]= shi->col[0].col[2];
+ shi->vcol[3]= 1.0f;
}
else {
shi->vcol[0]= 0.0f;
shi->vcol[1]= 0.0f;
shi->vcol[2]= 0.0f;
+ shi->vcol[3]= 1.0f;
}
}
@@ -721,6 +723,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->vcol[0]= 1.0f;
shi->vcol[1]= 1.0f;
shi->vcol[2]= 1.0f;
+ shi->vcol[3]= 1.0f;
}
if(tface && tface->tpage)
render_realtime_texture(shi, tface->tpage);
@@ -739,6 +742,7 @@ void shade_input_set_shade_texco(ShadeInput *shi)
shi->vcol[0]= 1.0f;
shi->vcol[1]= 1.0f;
shi->vcol[2]= 1.0f;
+ shi->vcol[3]= 1.0f;
}
}
}
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index 7dd7383c60c..56cb226560a 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -26,12 +26,14 @@
*/
#include <stdio.h>
+#include <float.h>
#include <math.h>
#include <string.h>
#include "MTC_matrixops.h"
#include "BLI_arithb.h"
+#include "BKE_colortools.h"
#include "BKE_material.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -165,6 +167,9 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
p1[2]= -lar->co[2];
MTC_Mat3MulVecfl(lar->imat, p1);
VECCOPY(npos, p1); // npos is double!
+
+ /* pre-scale */
+ npos[2]*= lar->sh_zfac;
}
else {
VECCOPY(npos, lar->sh_invcampos); /* in initlamp calculated */
@@ -194,7 +199,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
maxz*= lar->sh_zfac;
maxy= lar->imat[0][1]*p1[0]+lar->imat[1][1]*p1[1]+lar->imat[2][1]*p1[2];
- if( fabs(nray[2]) <0.000001f ) use_yco= 1;
+ if( fabs(nray[2]) < DBL_EPSILON ) use_yco= 1;
}
/* scale z to make sure volume is normalized */
@@ -209,7 +214,7 @@ static void spothalo(struct LampRen *lar, ShadeInput *shi, float *intens)
c = npos[0] * npos[0] + npos[1] * npos[1] - npos[2]*npos[2];
snijp= 0;
- if (fabs(a) < 0.00000001) {
+ if (fabs(a) < DBL_EPSILON) {
/*
* Only one intersection point...
*/
@@ -824,6 +829,8 @@ void shade_color(ShadeInput *shi, ShadeResult *shr)
shi->r= shi->vcol[0];
shi->g= shi->vcol[1];
shi->b= shi->vcol[2];
+ if(ma->mode & (MA_FACETEXTURE_ALPHA))
+ shi->alpha= shi->vcol[3];
}
if(ma->texco)
@@ -1056,14 +1063,26 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
visifac= 0.0f;
}
else {
- if(lar->mode & LA_QUAD) {
- if(lar->ld1>0.0f)
- visifac= lar->dist/(lar->dist+lar->ld1*dist[0]);
- if(lar->ld2>0.0f)
- visifac*= lar->distkw/(lar->distkw+lar->ld2*dist[0]*dist[0]);
- }
- else {
- visifac= (lar->dist/(lar->dist+dist[0]));
+ switch(lar->falloff_type)
+ {
+ case LA_FALLOFF_CONSTANT:
+ visifac = 1.0f;
+ break;
+ case LA_FALLOFF_INVLINEAR:
+ visifac = lar->dist/(lar->dist + dist[0]);
+ break;
+ case LA_FALLOFF_INVSQUARE:
+ visifac = lar->dist / (lar->dist + dist[0]*dist[0]);
+ break;
+ case LA_FALLOFF_SLIDERS:
+ if(lar->ld1>0.0f)
+ visifac= lar->dist/(lar->dist+lar->ld1*dist[0]);
+ if(lar->ld2>0.0f)
+ visifac*= lar->distkw/(lar->distkw+lar->ld2*dist[0]*dist[0]);
+ break;
+ case LA_FALLOFF_CURVE:
+ visifac = curvemapping_evaluateF(lar->curfalloff, 0, dist[0]/lar->dist);
+ break;
}
if(lar->mode & LA_SPHERE) {
@@ -1113,6 +1132,7 @@ float lamp_get_visibility(LampRen *lar, float *co, float *lv, float *dist)
}
}
}
+ if (visifac <= 0.001) visifac = 0.0f;
return visifac;
}
}
@@ -1129,6 +1149,12 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
vn= shi->vn;
view= shi->view;
+ if (lar->energy == 0.0) return;
+
+ /* optimisation, don't render fully black lamps */
+ if (!(lar->mode & LA_TEXTURE) && (lar->r + lar->g + lar->b == 0.0f))
+ return;
+
/* lampdist, spot angle, area side, ... */
visifac= lamp_get_visibility(lar, shi->co, lv, &lampdist);
if(visifac==0.0f)
@@ -1235,7 +1261,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
/* shadow and spec, (visifac==0 outside spot) */
if(visifac> 0.0f) {
- if(i>0.0f && (R.r.mode & R_SHADOW)) {
+ if((R.r.mode & R_SHADOW)) {
if(ma->mode & MA_SHADOW) {
if(lar->shb || (lar->mode & LA_SHAD_RAY)) {
@@ -1245,12 +1271,17 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
lamp_get_shadow(lar, shi, inp, shadfac, shi->depth);
/* warning, here it skips the loop */
- if(lar->mode & LA_ONLYSHADOW) {
+ if((lar->mode & LA_ONLYSHADOW) && i>0.0) {
shadfac[3]= i*lar->energy*(1.0f-shadfac[3]);
shr->shad[0] -= shadfac[3]*shi->r;
shr->shad[1] -= shadfac[3]*shi->g;
shr->shad[2] -= shadfac[3]*shi->b;
+
+ shr->spec[0] -= shadfac[3]*shi->specr;
+ shr->spec[1] -= shadfac[3]*shi->specg;
+ shr->spec[2] -= shadfac[3]*shi->specb;
+
return;
}
@@ -1259,7 +1290,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
}
- /* in case 'no diffuse' we still do most calculus, spec can be in shadow */
+ /* in case 'no diffuse' we still do most calculus, spec can be in shadow.*/
if(!(lar->mode & LA_NO_DIFF)) {
if(i>0.0f) {
if(ma->mode & MA_SHADOW_TRA)
@@ -1280,7 +1311,7 @@ static void shade_one_light(LampRen *lar, ShadeInput *shi, ShadeResult *shr, int
}
/* specularity */
- if(shadfac[3]>0.0f && shi->spec!=0.0f && !(lar->mode & LA_NO_SPEC)) {
+ if(shadfac[3]>0.0f && shi->spec!=0.0f && !(lar->mode & LA_NO_SPEC) && !(lar->mode & LA_ONLYSHADOW)) {
if(!(passflag & (SCE_PASS_COMBINED|SCE_PASS_SPEC)));
else if(lar->type==LA_HEMI) {
@@ -1446,6 +1477,8 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shi->r= shi->vcol[0];
shi->g= shi->vcol[1];
shi->b= shi->vcol[2];
+ if(ma->mode & (MA_FACETEXTURE_ALPHA))
+ shi->alpha= shi->vcol[3];
}
if(ma->texco)
do_material_tex(shi);
@@ -1508,6 +1541,16 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
shade_one_light(lar, shi, shr, passflag);
}
+ /*this check is to prevent only shadow lamps from producing negative
+ colors.*/
+ if (shr->spec[0] < 0) shr->spec[0] = 0;
+ if (shr->spec[1] < 0) shr->spec[1] = 0;
+ if (shr->spec[2] < 0) shr->spec[2] = 0;
+
+ if (shr->shad[0] < 0) shr->shad[0] = 0;
+ if (shr->shad[1] < 0) shr->shad[1] = 0;
+ if (shr->shad[2] < 0) shr->shad[2] = 0;
+
if(ma->sss_flag & MA_DIFF_SSS) {
float sss[3], col[3], texfac= ma->sss_texfac;
diff --git a/source/blender/render/intern/source/texture.c b/source/blender/render/intern/source/texture.c
index 59d134f2665..7930fc97f2d 100644
--- a/source/blender/render/intern/source/texture.c
+++ b/source/blender/render/intern/source/texture.c
@@ -200,7 +200,7 @@ static int blend(Tex *tex, float *texvec, TexResult *texres)
else { /* sphere TEX_SPHERE */
texres->tin= 1.0-sqrt(x*x+ y*y+texvec[2]*texvec[2]);
if(texres->tin<0.0) texres->tin= 0.0;
- if(tex->stype==5) texres->tin*= texres->tin; /* halo */
+ if(tex->stype==TEX_HALO) texres->tin*= texres->tin; /* halo */
}
BRICONT;
@@ -229,7 +229,7 @@ static int clouds(Tex *tex, float *texvec, TexResult *texres)
rv |= TEX_NOR;
}
- if (tex->stype==1) {
+ if (tex->stype==TEX_COLOR) {
// in this case, int. value should really be computed from color,
// and bumpnormal from that, would be too slow, looks ok as is
texres->tr = texres->tin;
@@ -480,7 +480,7 @@ static int stucci(Tex *tex, float *texvec, TexResult *texres)
VECCOPY(texres->nor, nor);
tex_normal_derivate(tex, texres);
- if(tex->stype==2) {
+ if(tex->stype==TEX_WALLOUT) {
texres->nor[0]= -texres->nor[0];
texres->nor[1]= -texres->nor[1];
texres->nor[2]= -texres->nor[2];
@@ -489,7 +489,7 @@ static int stucci(Tex *tex, float *texvec, TexResult *texres)
retval |= TEX_NOR;
}
- if(tex->stype==2)
+ if(tex->stype==TEX_WALLOUT)
texres->tin= 1.0f-texres->tin;
if(texres->tin<0.0f)
@@ -1242,7 +1242,7 @@ int multitex_ext(Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, Te
/* in = destination, tex = texture, out = previous color */
/* fact = texture strength, facg = button strength value */
-static void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg, int blendtype)
+void texture_rgb_blend(float *in, float *tex, float *out, float fact, float facg, int blendtype)
{
float facm, col;
@@ -1330,7 +1330,7 @@ static void texture_rgb_blend(float *in, float *tex, float *out, float fact, flo
}
-static float texture_value_blend(float tex, float out, float fact, float facg, int blendtype, int flip)
+float texture_value_blend(float tex, float out, float fact, float facg, int blendtype, int flip)
{
float in=0.0, facm, col;
@@ -1390,7 +1390,7 @@ void do_material_tex(ShadeInput *shi)
TexResult texres= {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, NULL};
float *co = NULL, *dx = NULL, *dy = NULL;
float fact, facm, factt, facmm, stencilTin=1.0;
- float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3], Tnor=1.0;
+ float texvec[3], dxt[3], dyt[3], tempvec[3], norvec[3], warpvec[3]={0.0f, 0.0f, 0.0f}, Tnor=1.0;
int tex_nr, rgbnor= 0, warpdone=0;
if (R.r.scemode & R_NO_TEX) return;
@@ -1406,7 +1406,7 @@ void do_material_tex(ShadeInput *shi)
tex= mtex->tex;
if(tex==0) continue;
-
+
/* which coords */
if(mtex->texco==TEXCO_ORCO) {
co= shi->lo; dx= shi->dxlo; dy= shi->dylo;
@@ -1486,7 +1486,7 @@ void do_material_tex(ShadeInput *shi)
dy[1]= dy[2]= 0.0f;
}
else continue; // can happen when texco defines disappear and it renders old files
-
+
/* de pointer defines if bumping happens */
if(mtex->mapto & (MAP_NORM|MAP_DISPLACE|MAP_WARP)) {
texres.nor= norvec;
@@ -2450,6 +2450,7 @@ void render_realtime_texture(ShadeInput *shi, Image *ima)
shi->vcol[0]*= texr.tr;
shi->vcol[1]*= texr.tg;
shi->vcol[2]*= texr.tb;
+ shi->vcol[3]*= texr.ta;
}
/* eof */
diff --git a/source/blender/src/CMakeLists.txt b/source/blender/src/CMakeLists.txt
index d4a0cbf7c3d..176ec036ada 100644
--- a/source/blender/src/CMakeLists.txt
+++ b/source/blender/src/CMakeLists.txt
@@ -63,6 +63,10 @@ IF(WITH_FFMPEG)
ADD_DEFINITIONS(-DWITH_FFMPEG)
ENDIF(WITH_FFMPEG)
+IF(WIN32)
+ SET(INC ${INC} ${PTHREADS_INC})
+ENDIF(WIN32)
+
IF(WITH_VERSE)
SET(INC ${INC} ${VERSE_INC})
ADD_DEFINITIONS(-DWITH_VERSE)
diff --git a/source/blender/src/Makefile b/source/blender/src/Makefile
index e9f4e807259..5038c294bc6 100644
--- a/source/blender/src/Makefile
+++ b/source/blender/src/Makefile
@@ -50,10 +50,6 @@ include nan_compile.mk
CFLAGS += $(LEVEL_1_C_WARNINGS)
#CFLAGS += $(LEVEL_1_C_WARNINGS) -diag_error 1196
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
# PreProcessor stuff ------------------------------------------
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
@@ -121,10 +117,18 @@ ifeq ($(WITH_FFMPEG),true)
CPPFLAGS += $(NAN_FFMPEGCFLAGS)
endif
+ifdef NAN_PTHREADS
+ CPPFLAGS += -I$(NAN_PTHREADS)/include
+endif
+
ifeq ($(WITH_OPENEXR),true)
CPPFLAGS += -DWITH_OPENEXR
endif
+ifeq ($(WITH_DDS),true)
+ CPPFLAGS += -DWITH_DDS
+endif
+
ifeq ($(INTERNATIONAL), true)
CPPFLAGS += -DINTERNATIONAL
endif
diff --git a/source/blender/src/SConscript b/source/blender/src/SConscript
index 729e79dcb6f..ba3e03ea1eb 100644
--- a/source/blender/src/SConscript
+++ b/source/blender/src/SConscript
@@ -35,6 +35,9 @@ if env['WITH_BF_INTERNATIONAL'] == 1:
if env['WITH_BF_OPENEXR'] == 1:
defs.append('WITH_OPENEXR')
+if env['WITH_BF_DDS'] == 1:
+ defs.append('WITH_DDS')
+
if env['WITH_BF_QUICKTIME']==1:
incs += ' ' + env['BF_QUICKTIME_INC']
defs.append('WITH_QUICKTIME')
@@ -47,6 +50,9 @@ if env['WITH_BF_FFMPEG'] == 1:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
+if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw'):
+ incs += ' ' + env['BF_PTHREADS_INC']
+
if env['WITH_BF_VERSE']:
defs.append('WITH_VERSE')
incs += ' ' + env['BF_VERSE_INCLUDE']
diff --git a/source/blender/src/blenderbuttons.c b/source/blender/src/blenderbuttons.c
index b883ccb4c28..c8fb9ec7a7a 100644
--- a/source/blender/src/blenderbuttons.c
+++ b/source/blender/src/blenderbuttons.c
@@ -1,2115 +1,2020 @@
/* DataToC output of file <blenderbuttons> */
-int datatoc_blenderbuttons_size= 67487;
+int datatoc_blenderbuttons_size= 64418;
char datatoc_blenderbuttons[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 2, 0, 0, 0, 1, 0, 8, 6, 0, 0, 0,197,144,
-206,103, 0, 0, 0, 9,112, 72, 89,115, 0, 0, 11, 19, 0, 0, 11, 19, 1, 0,154,156, 24, 0, 0, 10, 77,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,119, 88,147,247, 22, 62,
-223,247,101, 15, 86, 66,216,240,177,151,108,129, 0, 34, 35,172, 8,200, 16, 89,162, 16,146, 0, 97,132, 16, 18, 64,197,133,136,
- 10, 86, 20, 21, 17,156, 72, 85,196,130,213, 10, 72,157,136,226,160, 40,184,103, 65,138,136, 90,139, 85, 92, 56,238, 31,220,167,
-181,125,122,239,237,237,251,215,251,188,231,156,231,252,206,121,207, 15,128, 17, 18, 38,145,230,162,106, 0, 57, 82,133, 60, 58,
-216, 31,143, 79, 72,196,201,189,128, 2, 21, 72,224, 4, 32, 16,230,203,194,103, 5,197, 0, 0,240, 3,121,120,126,116,176, 63,
-252, 1,175,111, 0, 2, 0,112,213, 46, 36, 18,199,225,255,131,186, 80, 38, 87, 0, 32,145, 0,224, 34, 18,231, 11, 1,144, 82,
- 0,200, 46, 84,200, 20, 0,200, 24, 0,176, 83,179,100, 10, 0,148, 0, 0,108,121,124, 66, 34, 0,170, 13, 0,236,244, 73, 62,
- 5, 0,216,169,147,220, 23, 0,216,162, 28,169, 8, 0,141, 1, 0,153, 40, 71, 36, 2, 64,187, 0, 96, 85,129, 82, 44, 2,192,
-194, 0,160,172, 64, 34, 46, 4,192,174, 1,128, 89,182, 50, 71, 2,128,189, 5, 0,118,142, 88,144, 15, 64, 96, 0,128,153, 66,
- 44,204, 0, 32, 56, 2, 0, 67, 30, 19,205, 3, 32, 76, 3,160, 48,210,191,224,169, 95,112,133,184, 72, 1, 0,192,203,149,205,
-151, 75,210, 51, 20,184,149,208, 26,119,242,240,224,226, 33,226,194,108,177, 66, 97, 23, 41, 16,102, 9,228, 34,156,151,155, 35,
- 19, 72,231, 3, 76,206, 12, 0, 0, 26,249,209,193,254, 56, 63,144,231,230,228,225,230,102,231,108,239,244,197,162,254,107,240,
-111, 34, 62, 33,241,223,254,188,140, 2, 4, 0, 16, 78,207,239,218, 95,229,229,214, 3,112,199, 1,176,117,191,107,169, 91, 0,
-218, 86, 0,104,223,249, 93, 51,219, 9,160, 90, 10,208,122,249,139,121, 56,252, 64, 30,158,161, 80,200, 60, 29, 28, 10, 11, 11,
-237, 37, 98,161,189, 48,227,139, 62,255, 51,225,111,224,139,126,246,252, 64, 30,254,219,122,240, 0,113,154, 64,153,173,192,163,
-131,253,113, 97,110,118,174, 82,142,231,203, 4, 66, 49,110,247,231, 35,254,199,133,127,253,142, 41,209,226, 52,177, 92, 44, 21,
-138,241, 88,137,184, 80, 34, 77,199,121,185, 82,145, 68, 33,201,149,226, 18,233,127, 50,241, 31,150,253, 9,147,119, 13, 0,172,
-134, 79,192, 78,182, 7,181,203,108,192,126,238, 1, 2,139, 14, 88,210,118, 0, 64,126,243, 45,140, 26, 11,145, 0, 16,103, 52,
- 50,121,247, 0, 0,147,191,249,143, 64, 43, 1, 0,205,151,164,227, 0, 0,188,232, 24, 92,168,148, 23, 76,198, 8, 0, 0, 68,
-160,129, 42,176, 65, 7, 12,193, 20,172,192, 14,156,193, 29,188,192, 23, 2, 97, 6, 68, 64, 12, 36,192, 60, 16, 66, 6,228,128,
- 28, 10,161, 24,150, 65, 25, 84,192, 58,216, 4,181,176, 3, 26,160, 17,154,225, 16,180,193, 49, 56, 13,231,224, 18, 92,129,235,
-112, 23, 6, 96, 24,158,194, 24,188,134, 9, 4, 65,200, 8, 19, 97, 33, 58,136, 17, 98,142,216, 34,206, 8, 23,153,142, 4, 34,
- 97, 72, 52,146,128,164, 32,233,136, 20, 81, 34,197,200,114,164, 2,169, 66,106,145, 93, 72, 35,242, 45,114, 20, 57,141, 92, 64,
-250,144,219,200, 32, 50,138,252,138,188, 71, 49,148,129,178, 81, 3,212, 2,117, 64,185,168, 31, 26,138,198,160,115,209,116, 52,
- 15, 93,128,150,162,107,209, 26,180, 30, 61,128,182,162,167,209, 75,232,117,116, 0,125,138,142, 99,128,209, 49, 14,102,140,217,
- 97, 92,140,135, 69, 96,137, 88, 26, 38,199, 22, 99,229, 88, 53, 86,143, 53, 99, 29, 88, 55,118, 21, 27,192,158, 97,239, 8, 36,
- 2,139,128, 19,236, 8, 94,132, 16,194,108,130,144,144, 71, 88, 76, 88, 67,168, 37,236, 35,180, 18,186, 8, 87, 9,131,132, 49,
-194, 39, 34,147,168, 79,180, 37,122, 18,249,196,120, 98, 58,177,144, 88, 70,172, 38,238, 33, 30, 33,158, 37, 94, 39, 14, 19, 95,
-147, 72, 36, 14,201,146,228, 78, 10, 33, 37,144, 50, 73, 11, 73,107, 72,219, 72, 45,164, 83,164, 62,210, 16,105,156, 76, 38,235,
-144,109,201,222,228, 8,178,128,172, 32,151,145,183,144, 15,144, 79,146,251,201,195,228,183, 20, 58,197,136,226, 76, 9,162, 36,
- 82,164,148, 18, 74, 53,101, 63,229, 4,165,159, 50, 66,153,160,170, 81,205,169,158,212, 8,170,136, 58,159, 90, 73,109,160,118,
- 80, 47, 83,135,169, 19, 52,117,154, 37,205,155, 22, 67,203,164, 45,163,213,208,154,105,103,105,247,104, 47,233,116,186, 9,221,
-131, 30, 69,151,208,151,210,107,232, 7,233,231,233,131,244,119, 12, 13,134, 13,131,199, 72, 98, 40, 25,107, 25,123, 25,167, 24,
-183, 25, 47,153, 76,166, 5,211,151,153,200, 84, 48,215, 50, 27,153,103,152, 15,152,111, 85, 88, 42,246, 42,124, 21,145,202, 18,
-149, 58,149, 86,149,126,149,231,170, 84, 85,115, 85, 63,213,121,170, 11, 84,171, 85, 15,171, 94, 86,125,166, 70, 85,179, 80,227,
-169, 9,212, 22,171,213,169, 29, 85,187,169, 54,174,206, 82,119, 82,143, 80,207, 81, 95,163,190, 95,253,130,250, 99, 13,178,134,
-133, 70,160,134, 72,163, 84, 99,183,198, 25,141, 33, 22,198, 50,101,241, 88, 66,214,114, 86, 3,235, 44,107,152, 77, 98, 91,178,
-249,236, 76,118, 5,251, 27,118, 47,123, 76, 83, 67,115,170,102,172,102,145,102,157,230,113,205, 1, 14,198,177,224,240, 57,217,
-156, 74,206, 33,206, 13,206,123, 45, 3, 45, 63, 45,177,214,106,173,102,173,126,173, 55,218,122,218,190,218, 98,237,114,237, 22,
-237,235,218,239,117,112,157, 64,157, 44,157,245, 58,109, 58,247,117, 9,186, 54,186, 81,186,133,186,219,117,207,234, 62,211, 99,
-235,121,233, 9,245,202,245, 14,233,221,209, 71,245,109,244,163,245, 23,234,239,214,239,209, 31, 55, 48, 52, 8, 54,144, 25,108,
- 49, 56, 99,240,204,144, 99,232,107,152,105,184,209,240,132,225,168, 17,203,104,186,145,196,104,163,209, 73,163, 39,184, 38,238,
-135,103,227, 53,120, 23, 62,102,172,111, 28, 98,172, 52,222,101,220,107, 60, 97, 98,105, 50,219,164,196,164,197,228,190, 41,205,
-148,107,154,102,186,209,180,211,116,204,204,200, 44,220,172,216,172,201,236,142, 57,213,156,107,158, 97,190,217,188,219,252,141,
-133,165, 69,156,197, 74,139, 54,139,199,150,218,150,124,203, 5,150, 77,150,247,172,152, 86, 62, 86,121, 86,245, 86,215,172, 73,
-214, 92,235, 44,235,109,214, 87,108, 80, 27, 87,155, 12,155, 58,155,203,182,168,173,155,173,196,118,155,109,223, 20,226, 20,143,
- 41,210, 41,245, 83,110,218, 49,236,252,236, 10,236,154,236, 6,237, 57,246, 97,246, 37,246,109,246,207, 29,204, 28, 18, 29,214,
- 59,116, 59,124,114,116,117,204,118,108,112,188,235,164,225, 52,195,169,196,169,195,233, 87,103, 27,103,161,115,157,243, 53, 23,
-166, 75,144,203, 18,151,118,151, 23, 83,109,167,138,167,110,159,122,203,149,229, 26,238,186,210,181,211,245,163,155,187,155,220,
-173,217,109,212,221,204, 61,197,125,171,251, 77, 46,155, 27,201, 93,195, 61,239, 65,244,240,247, 88,226,113,204,227,157,167,155,
-167,194,243,144,231, 47, 94,118, 94, 89, 94,251,189, 30, 79,179,156, 38,158,214, 48,109,200,219,196, 91,224,189,203,123, 96, 58,
- 62, 61,101,250,206,233, 3, 62,198, 62, 2,159,122,159,135,190,166,190, 34,223, 61,190, 35,126,214,126,153,126, 7,252,158,251,
- 59,250,203,253,143,248,191,225,121,242, 22,241, 78, 5, 96, 1,193, 1,229, 1,189,129, 26,129,179, 3,107, 3, 31, 4,153, 4,
-165, 7, 53, 5,141, 5,187, 6, 47, 12, 62, 21, 66, 12, 9, 13, 89, 31,114,147,111,192, 23,242, 27,249, 99, 51,220,103, 44,154,
-209, 21,202, 8,157, 21, 90, 27,250, 48,204, 38, 76, 30,214, 17,142,134,207, 8,223, 16,126,111,166,249, 76,233,204,182, 8,136,
-224, 71,108,136,184, 31,105, 25,153, 23,249,125, 20, 41, 42, 50,170, 46,234, 81,180, 83,116,113,116,247, 44,214,172,228, 89,251,
-103,189,142,241,143,169,140,185, 59,219,106,182,114,118,103,172,106,108, 82,108, 99,236,155,184,128,184,170,184,129,120,135,248,
- 69,241,151, 18,116, 19, 36, 9,237,137,228,196,216,196, 61,137,227,115, 2,231,108,154, 51,156,228,154, 84,150,116, 99,174,229,
-220,162,185, 23,230,233,206,203,158,119, 60, 89, 53, 89,144,124, 56,133,152, 18,151,178, 63,229,131, 32, 66, 80, 47, 24, 79,229,
-167,110, 77, 29, 19,242,132,155,133, 79, 69,190,162,141,162, 81,177,183,184, 74, 60,146,230,157, 86,149,246, 56,221, 59,125, 67,
-250,104,134, 79, 70,117,198, 51, 9, 79, 82, 43,121,145, 25,146,185, 35,243, 77, 86, 68,214,222,172,207,217,113,217, 45, 57,148,
-156,148,156,163, 82, 13,105,150,180, 43,215, 48,183, 40,183, 79,102, 43, 43,147, 13,228,121,230,109,202, 27,147,135,202,247,228,
- 35,249,115,243,219, 21,108,133, 76,209,163,180, 82,174, 80, 14, 22, 76, 47,168, 43,120, 91, 24, 91,120,184, 72,189, 72, 90,212,
- 51,223,102,254,234,249, 35, 11,130, 22,124,189,144,176, 80,184,176,179,216,184,120, 89,241,224, 34,191, 69,187, 22, 35,139, 83,
- 23,119, 46, 49, 93, 82,186,100,120,105,240,210,125,203,104,203,178,150,253, 80,226, 88, 82, 85,242,106,121,220,242,142, 82,131,
-210,165,165, 67, 43,130, 87, 52,149,169,148,201,203,110,174,244, 90,185, 99, 21, 97,149,100, 85,239,106,151,213, 91, 86,127, 42,
- 23,149, 95,172,112,172,168,174,248,176, 70,184,230,226, 87, 78, 95,213,124,245,121,109,218,218,222, 74,183,202,237,235, 72,235,
-164,235,110,172,247, 89,191,175, 74,189,106, 65,213,208,134,240, 13,173, 27,241,141,229, 27, 95,109, 74,222,116,161,122,106,245,
-142,205,180,205,202,205, 3, 53, 97, 53,237, 91,204,182,172,219,242,161, 54,163,246,122,157,127, 93,203, 86,253,173,171,183,190,
-217, 38,218,214,191,221,119,123,243, 14,131, 29, 21, 59,222,239,148,236,188,181, 43,120, 87,107,189, 69,125,245,110,210,238,130,
-221,143, 26, 98, 27,186,191,230,126,221,184, 71,119, 79,197,158,143,123,165,123, 7,246, 69,239,235,106,116,111,108,220,175,191,
-191,178, 9,109, 82, 54,141, 30, 72, 58,112,229,155,128,111,218,155,237,154,119,181,112, 90, 42, 14,194, 65,229,193, 39,223,166,
-124,123,227, 80,232,161,206,195,220,195,205,223,153,127,183,245, 8,235, 72,121, 43,210, 58,191,117,172, 45,163,109,160, 61,161,
-189,239,232,140,163,157, 29, 94, 29, 71,190,183,255,126,239, 49,227, 99,117,199, 53,143, 87,158,160,157, 40, 61,241,249,228,130,
-147,227,167,100,167,158,157, 78, 63, 61,212,153,220,121,247, 76,252,153,107, 93, 81, 93,189,103, 67,207,158, 63, 23,116,238, 76,
-183, 95,247,201,243,222,231,143, 93,240,188,112,244, 34,247, 98,219, 37,183, 75,173, 61,174, 61, 71,126,112,253,225, 72,175, 91,
-111,235,101,247,203,237, 87, 60,174,116,244, 77,235, 59,209,239,211,127,250,106,192,213,115,215,248,215, 46, 93,159,121,189,239,
-198,236, 27,183,110, 38,221, 28,184, 37,186,245,248,118,246,237, 23,119, 10,238, 76,220, 93,122,143,120,175,252,190,218,253,234,
- 7,250, 15,234,127,180,254,177,101,192,109,224,248, 96,192, 96,207,195, 89, 15,239, 14, 9,135,158,254,148,255,211,135,225,210,
- 71,204, 71,213, 35, 70, 35,141,143,157, 31, 31, 27, 13, 26,189,242,100,206,147,225,167,178,167, 19,207,202,126, 86,255,121,235,
-115,171,231,223,253,226,251, 75,207, 88,252,216,240, 11,249,139,207,191,174,121,169,243,114,239,171,169,175, 58,199, 35,199, 31,
-188,206,121, 61,241,166,252,173,206,219,125,239,184,239,186,223,199,189, 31,153, 40,252, 64,254, 80,243,209,250, 99,199,167,208,
- 79,247, 62,231,124,254,252, 47,247,132,243,251, 37,210,159, 51, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,177,142,124,251, 81,147,
- 0, 0, 0, 32, 99, 72, 82, 77, 0, 0,122, 37, 0, 0,128,131, 0, 0,249,255, 0, 0,128,233, 0, 0,117, 48, 0, 0,234, 96,
- 0, 0, 58,152, 0, 0, 23,111,146, 95,197, 70, 0, 0,252,188, 73, 68, 65, 84,120,218,236, 93,121, 92, 84,213,251,126,206,157,
-133, 97,223,220,113, 65,220,119, 17, 69,205,109, 70,209,204, 82,179, 64, 83, 75,253,105, 49, 90,150,150,149,109,223,246, 44, 45,
-210, 86, 25, 42,211, 74, 45,193, 76, 75, 51, 69,103,200, 5, 69,212, 82,115, 65, 65, 68, 81, 4, 97,216,102,159,185,231,247,199,
-204, 29, 7, 28,152, 5,220,234, 62,159, 38,231, 46,243,114,238,189,231,190,207,251,190,231, 61,239, 33,125,251,246,165,224,193,
-131, 7, 15, 30, 60,120,252,167,192,240,183,128, 7, 15, 30, 60,120,240,248,239,224,200,209,116,222, 0,224,193,131, 7, 15, 30,
- 60,254,107,232, 23, 29,199, 27, 0, 60,120,240,224,193,131,199,127, 21,188, 1,192,131, 7, 15, 30, 60,120,240, 6, 0, 15, 30,
- 60,120,240,224,193,227,191, 0,161,227,198,188,121,243,136,183,130, 86,174, 92,121,195,108, 2, 94, 30, 47,175, 30,208,149, 43,
- 87,222,182,246,169, 84, 42, 42,149, 74, 9,255, 60,238, 94,121,127,253,245,151,215,157,175,111,223,190,224,159,199,157, 45,239,
-232,209,163, 94,203,139,142,142,254,207,203,243,216, 0,248, 47, 67, 46,151,215,184,129, 10,133,130,220,201,237, 76, 78, 78, 6,
- 33,132,240, 79,206,187,103, 60,117,234, 84,164,165,165,217,183,227,227,227,255, 21,247,114,219,239, 71,234, 85, 4,227,238,235,
-247,175,238, 51,190,161,155, 32,209,119, 68,123, 24, 81,141,223,145,163,123,237,142,237,139,119,170,142,225,241, 31,141, 0,220,
-138,206,186,109,219, 54,233,230,205,155,149,220,246,196,137, 19,101,227,198,141, 83,221, 9, 55,131, 82,171,238,188, 83,121, 85,
- 46,151,211,252,252,124, 0, 64,100,100, 36, 0,220, 21, 74,164,182,113,101, 51,176,234,244,204,221,149,187,126,253,122,183, 13,
- 53,185, 92, 78, 55,108,216, 96,223,222,180,105, 19, 70,143, 30,109,223, 78, 75, 75,163,183,203, 8,136,137,137,161, 0,112,248,
-240, 97,210, 24,231,109,254, 69, 81,143, 1,160,104,240,243,139,104,223, 6, 0,112, 85,175,135, 89,103,176,238, 44,175, 4, 0,
- 36, 36, 36, 32, 46, 46,174,206,246,165,196,165,208, 78, 87, 58,121,244,247,101,255,200,220,120, 46,190, 8,125,242, 56,244,155,
- 55, 65,173,158, 4, 53,128,126,190, 31,226, 53,223,195,104, 35, 1, 74,244,185,120, 77, 55,217,163,191,155,158,158, 46, 77, 77,
- 77, 85, 58,238, 75, 72, 72,144,197,197,197,169,238,164,119,171,177,116,192,221,112,189, 55, 3,173,154, 72, 72,128, 40,152, 24,
- 36, 98,106, 40,215, 49,213,186, 74,182, 90,111,252, 79,212,199,113,105, 0,108,219,182, 77,202,253,219, 80,162,230, 20,201, 91,
- 27,222, 69, 64,155, 96, 84, 95,172,192, 27,147, 95, 83,110,222,188, 25,188, 53,236, 26, 10,133,130, 68, 70, 70,210,252,252,124,
-228,231,231, 99,251,246,237,119,172, 39,193, 61,107,133, 66, 65, 20, 10,133, 72, 46,151,155,150, 45, 91,118, 8, 0, 94,124,241,
-197, 1,245,253,118,210,164, 73,246,239,102,179, 5, 70,147, 1, 70,131, 17, 70,163,245, 99, 54,155,241,226,139, 47,122,212, 22,
- 71,242,119,134,209,163, 71,223, 86, 35,192, 29,227, 39, 38, 38,198,165,140,113,247,245, 35,222,144,188,219, 8, 9,194,177,188,
- 31,225,139,214,176, 96, 31,138,191, 62,130,191,115, 75,241,208, 7,223,186,245,243, 78, 87, 58,185, 73,232, 86, 40,123, 40, 93,
- 42, 98,223,113,175, 33,108,226, 28, 20, 46,236, 7,232,212,246,253, 71,116, 47,224, 8, 0,232,128,225,190, 9,216, 21,122, 24,
- 33, 0, 98,212, 49,110,247,223,218, 72, 77, 77, 85,166,166,166,222, 17,250,138,107, 99, 99,232,128,187,225,122, 27, 27, 67,251,
- 68,147, 71, 35,218, 11,159,137,159, 33,104,214, 45,130, 17,146,102, 68, 91, 81,193, 74,208,220,242,221,111, 59, 45, 51, 30, 24,
-109,113, 71, 14, 33,228,178, 7, 78,102, 43, 55,228, 45,242, 64, 94,210, 77, 53, 0, 54,111,222,172,220,240,191, 87, 48,249,157,
- 37,202,113,227,198,145,134,116, 48,142,248, 1,224,154,182, 20, 8, 7, 94,222,245, 38, 42,243,212,144, 63,113,103, 17, 89, 93,
- 47,196,237,110,163,163, 17, 48,118,236, 88,228,231,231, 35, 50, 50,242,142,187,119, 74,165,213,145,144,201,100, 84,161, 80, 48,
- 10,133, 34, 66, 46,151, 23, 46, 91,182,236,176,187,114,204,102, 51,140, 70,147,157,248, 29,201, 63, 59, 59, 27,253,251,247,247,
-168, 93,147, 39, 95,247, 0,167, 78,157,138,157, 59,119,214, 48, 0, 26,163,175,120,243, 28, 14, 31, 62, 76, 84, 42, 21, 29, 51,
-102,204, 13,199,118,236,216,129,245,235,215,219,183,235,203, 91,184,193,120,111,196,225,128,136,246,109, 80,168,174,192,207,115,
- 31, 70, 56, 25,130,220,175,158, 71,212,164, 40,236,244,128,252, 57, 36, 38, 38, 82, 0, 72, 73, 73,105,112,159,141,216,176, 15,
-218, 11,213, 40,148,183,175,247,188,227,146,116,188,213,235, 42,222, 63,254,106,131,158,103, 99,144,110, 99,202,104,140, 72,192,
-205,190,222,198,194,204,153, 51,253, 0,220, 3, 32,192, 97,119, 57,128, 99,107,214,172, 41,115, 87,206, 39,201,159, 48,198,107,
- 6,209,125, 19, 38, 73,212, 48, 73, 68, 34,161,176, 82, 47, 97,196, 98, 29, 43, 8,242, 55, 27,125, 77, 38, 97,209,101,195,119,
-223,172,209,207,152, 51,211, 66, 8, 33,206,114, 70, 28, 81, 94, 94,254, 30,247, 61, 39, 39,231,154,191,191, 63,163,209,104, 88,
-199,115, 98, 99, 99,151, 55, 38,177,123, 98, 40,120,101, 0,108,219,182, 77,218,185,115,103,116, 10, 8, 66, 67,162, 0,142,228,
-127, 77, 91,138,247, 71,189,105, 63,246,127,155,159, 4,154, 1,147,150, 77,246,168,147,213, 69,208,141, 69,210, 23, 47, 94, 4,
- 0,180,105,211,166,198,119,238,239,186,234, 16, 55, 51,196,231,104, 4,152, 76,102, 36, 39, 39,223, 52, 47,192, 83,153,181,200,
-223,241,247,151, 21, 10, 69,168, 92, 46, 87,187, 77,254, 38, 19,140, 70, 3, 12, 70, 35, 76,181,200,159,178,158, 69,232, 38, 79,
-158,140,236,236,108,251,118, 82, 82, 18,226,227,227,237,219,105,105,105, 13, 54,118, 28, 12,158, 6,247, 63, 71,226,159, 58,117,
- 42,162,163,163,189,146,211, 88,195, 1,151,242, 10,160,217,244, 58, 2,102,127,130,136,246,109,208, 60,220, 23,121,155,242,172,
-228, 31, 18,100, 29, 2, 16, 9,220,146,213, 24,196, 15, 0,157, 79,158,195,197, 55,222,133, 46,117,117,253, 17, 2, 95, 95,232,
-245,122,228,230,230,162, 88,127, 6,157, 17, 81,231,185,233,233,233,210,250,250,190, 66,161, 32,220,123,146,158,158, 46,245, 36,
- 60,238, 24, 21,227,222, 87,199,125,158, 58, 2,117, 17,183, 39,186,192,217,245,238,220,185,147, 18, 66, 16, 23, 23, 71, 26,114,
-189, 28,230,204,153, 67,191,249,230,155, 6, 61,243,153, 51,103, 6, 3,152,180,107,215,174,215, 89,150, 53, 56,144,160, 80, 32,
- 16,248,207,156, 57,243,241, 53,107,214,108,115, 37,231,249,151,158, 23,250,138, 37, 18,145,200,199,159, 17,146, 32, 42,240,241,
- 99, 5, 2, 33, 75, 24,176, 68,104,161, 2,129, 65,192, 18,189, 70, 96,209,250,139, 69,228,155,253,191,235, 37, 19,154,177, 40,
-112,221, 70,181, 90, 93,169,213,106,205, 0,160,209,104,216, 87, 94,121,197, 78,248, 75,150, 44,121,182,161,253,125,244,232,209,
-115,185,239, 59,119,238, 76,110,140,119,136,113,229,253,191, 59, 37, 30,250,146, 18, 60,223,163, 43, 28,199,238,221,246, 66,108,
- 67, 8,142,228, 63,113,226, 68,153, 66,161, 32, 19, 39, 78,148,125, 59,241, 75,107,100,177, 75,147, 26,231,187,131, 23,191,200,
-193,139, 95,228,224,169,143, 78, 97,230, 59, 39,240,208,203,127, 53,248,134, 92,186,116,201, 45,195,224, 86,145,127,126,126,126,
-157,196, 28, 25, 25, 9,147,209,136,129,177,177, 13,254, 59, 92,152,124,195,134, 13, 80, 42,149,246, 79,125,134, 86, 93,100, 40,
-147,201,106,147,191,221, 80,118, 71, 49,153,205, 22,171,231,111,176,134,254,107,147,191,197, 98,129, 70,167,241,232, 26,185,136,
- 65,237,168, 65, 90, 90, 26,210,210,210,106, 24, 3, 30, 93,175,170,166, 62, 84,170, 84, 30,221,179,250,200,127,234,212,169, 88,
-182,108,153,157,252, 69, 66,145, 71,114,198,221,215,143,216,134, 96,156,126, 60,145,165, 67, 1,170, 39, 13, 4, 77,125, 30,151,
-242, 10, 64, 39,117,187,238,173,164, 62, 15, 97,203,166, 64, 72,200, 45,245, 8, 53,215,114,161, 75, 93, 13, 74, 41,142, 31, 63,
-142,225,195,135,195,215,215,183, 6,241,135,134,134, 66,167,211, 65,167,211,161,176,176, 16,211,116,207,224,235,208,133,117,202,
-228,198,192,235,187, 63,220,177,218,227,229,238, 18,119, 99, 57, 43,220,111,107,147,191, 43, 7,169,190,235,221,185,115, 39, 77,
- 75, 75, 67,106,106, 42,210,211,211,105, 67,175,119,206,156, 57, 84, 40, 20, 98,206,156, 57, 94,191, 19, 51,103,206,148, 0,120,
- 34, 61, 61,253,149,119,222,121,231, 32, 33, 36,146,251, 0,104, 29, 30, 30,238,183,123,247,238,149, 51,103,206, 28, 94,159,156,
-149,138,100,129,128,136,124,140,102, 26,100, 48,152,154, 89, 88,182,181,133,101,219, 91, 8,105, 11,129, 32,156, 16, 18, 2, 34,
- 8, 98, 41,194,168,145, 13,169,212,153,252,155, 5,153, 5, 76,108,149, 91,207, 72,171,213,154,107,123,253,119, 58, 24,119,188,
-127,109,209, 21,220, 23,221,207, 99,130,230,140,136,183, 54,188, 11, 0,118,242,231,162, 8,227,198,141, 83,113, 70,192,165,202,
-203,232,247,226, 32,143,140, 12,141,206, 2,141,206,130, 43,165, 6, 20,150,232,113,241,170,222, 43,226,227, 94, 22, 87,228,127,
-187, 80,151, 17, 0, 0,122,163, 1,122,189,222,107,217, 28,105,115, 99,228, 77,155, 54,117,244,102,225,174, 50,169,237, 9,215,
- 21, 74,116, 71,233, 25, 77, 6,171,231,111, 48,194,104,170, 73,254, 38,147, 9, 26,141, 6, 85,149, 85,183,245,153, 88, 13,166,
- 84,199,128, 28,247, 31, 54,108, 72,245,218, 8,112, 36,127,142,248, 25,134,129, 68, 34,129,127,128, 95,131,218,188,237,247, 35,
-180,174,143,171,223,110,127,249, 77,132, 99, 8,204,113, 79, 3, 0, 2, 50,207,225,239,220, 82,171,193, 22,247, 52, 76,199,223,
- 2,174,149,122,212,158,196,196, 68,202, 13, 7,120, 3,127, 92, 3, 0,172, 94,189, 26,155, 55,111,198,135, 31,126,136,172,172,
- 44, 24, 12, 6, 20, 23, 23,115, 94,153,253,252,136,136, 8,232, 0, 8,112,254,182,244,151,186,250,125,109,111,222, 91,131,194,
-217,176,128,167,242, 28, 35, 97,169,169,169, 13,186,102,142,252, 1,192, 91, 35, 96,230,204,153, 45,108,228,159,184,102,205,154,
-147,175,189,246,218,131,235,214,173, 67,231,206,157, 1, 0,237,218,181, 67, 69, 69,133,207, 91,111,189,117,120,247,238,221, 63,
-204,156, 57, 51,210,169, 32, 2,128,165, 4,172, 89, 98,177,152,195, 44,102, 75,107,147,197,212, 81,192,144, 86, 98, 33, 35,146,
-136, 4, 58,161,159,184,220, 63, 80, 80, 41,144, 80,179, 68, 32,240, 23,154,141, 65,231,143, 28,245,121,172,233, 10,151,237,206,
-201,201,185,166,209,104, 88,103, 97,254, 62,125,250,156, 49, 26,141,141,214,151,250,244,233,211,104,178,132,245, 17,247, 87,137,
-115,174,147,237,165,139,120,190, 71, 87,124,180,121,179,199,185, 0,156,247,207,145,126, 13, 47,101,220, 56,213,230,205,155, 1,
- 0,225,189, 90,120,212,248,106,157, 5, 85, 90, 51, 42, 53,102, 84, 84,155, 81, 94,101,246,248, 6, 56,203,252,119,244,242, 29,
-191,231,229,229,161,188,188,252,150, 41,141,228,228,100, 68, 70, 70,130, 75,250,115, 28,235,151,203,229, 52, 57, 57, 25,122,157,
-206,107, 3, 64, 46,151,211,111,191,253, 22,151, 10, 11, 33, 18, 8,208,188, 69,139, 26,228, 63,106,212, 40, 76,158, 60,217, 45,
-229,164, 80, 40,136, 76, 38,171, 97, 4,212,142,100,184,155,171, 96, 52, 24, 97, 52, 24, 96, 50, 25, 97, 54, 91,236,228,111, 48,
- 24,160,213,106, 81, 93, 93,141,170, 42,207, 13, 0,199, 33, 0, 14,222,122,254, 27, 82, 55, 0, 20,184,102, 35, 26,106,237, 68,
- 32,148, 90,141,128,212, 84, 76, 78, 72,240,120, 56,160, 54,249,139, 68, 34,248,248,248, 64, 34,145, 64, 34,145,120,117,221, 53,
-222,235, 58,134, 4, 92, 13,105, 61,148,188, 17,116, 66,123, 92, 29,220, 15,225, 24, 2,223,135, 63,131,249, 74, 9, 16, 18, 4,
- 97,233,122,252,182,226, 48, 32, 16,120,212,150,134, 14, 5,104, 4, 86,157,242,254,251,239,163,164,164, 4, 43, 87,174, 68,159,
- 62,125,240,206, 59,239,160, 95,191,126,208,233,116,181, 61, 52,206,164,190,165,196,239, 46, 65,123, 59, 28, 80,151, 33,225,141,
-156,132,132, 4, 59,241,123,243,110, 56, 35,127, 59,217, 8,133, 48,155,205,158, 14, 7, 4, 30, 59,118,236,211,121,243,230,253,
-217,171, 87,175, 32, 0,120,243,205, 55,145,147,147, 3, 0, 24, 52,104, 16,126,254,249,103, 12, 29, 58,212,127,218,180,105,185,
- 42,149, 42,125,246,236,217,211,110, 84,244, 64, 88,120, 24,155,151,151,107, 86, 41,119,253,222,177, 99, 39, 85,251,118,145, 39,
- 5,129,190,197, 2, 34,214, 48, 62, 34, 45, 35,241,171, 50, 10, 5, 70, 80,147,128,149,152, 2,171, 10, 75, 3,178,118,255, 21,
-219, 36,180,249,207, 46,141, 81,135, 49,255, 77,155, 54,205,156, 52,105,210, 26, 46,236, 95, 89, 89,201,136,197,226, 6,247,165,
-198, 10,251,187,140, 0,112, 94,126,255, 14,157,160, 47, 41,129,230,146,149, 4,135,219,188, 67, 79,163, 0,121, 39,206,221, 32,
-219,217,118,233,241, 34,143, 26,223, 80,242,119, 36,126, 74, 41,218,180,105, 83,227,152,201,100,178,127,202,203,203,161,209,104,
- 80, 86, 86,118,203,148, 7, 55,207,127,251,246,237, 53, 34, 1, 28,249,247,238,221, 27,122,189,206,174,232, 40,103,205,184,169,
-152,190,248,242, 11,152, 76, 38,180,142,136,128,201, 98,113, 74,254,158, 40, 18,155, 17,112,131, 87,194, 77, 93,172, 47,146,113,
-131, 1, 96, 52,217,201,255, 80,214, 33,104,117, 58, 84, 85, 85,161,162,162, 2,229,229,229, 53, 60, 59, 79,193, 13, 3,120, 59,
-238, 15, 0,165,215, 74, 81, 90,122, 13,215, 74,203,112,173,180, 20,165,165,165, 40,189,102,245, 72,187,118,235,134, 50,219,119,
- 79,189,127, 0,136,142,142,190,238,245,251,251, 35, 32, 32, 16,129, 1,129,168,170,170,146, 53,164, 63,213, 55, 36,224,234,183,
-185, 31, 38, 66,244,240,103, 8,199, 16, 8, 51, 63,131,105,227,211, 64, 72, 16,182, 60, 25,143, 11, 91,206, 99,252,178,239, 0,
-225, 45, 46, 43,162,191, 0,223, 8, 95,104, 52, 26,232,245,122,104,181, 90,100,102,102,226,131, 15, 62,112,122,186,159, 31, 23,
- 65, 57,231, 49,121,123,235, 85, 59,222,223,218,247,187,174,237,134, 24, 25,206,134, 5, 60,145, 19, 23, 23, 71, 18, 18, 18, 16,
- 31, 31,143,209,163, 71,123, 29,153,248,230,155,111,136,217, 92, 83, 39,155,205,102,120,154, 11,176,102,205,154,179, 9, 9, 9,
-125,214,173, 91, 55,124,207,158, 61,129,113,113,113, 89, 28,249,219, 28, 85,248,248,248,208, 11, 23, 46,136,126,255,253,247, 46,
-161,161,161,135,134, 12, 25,146,235, 76,214,148,201, 83,216, 78,237, 59, 87, 13, 26, 52, 40,254,228,201,127, 70, 86,106,170, 90,
- 80,179,201, 12, 6, 38,179,129, 49, 24, 12, 6, 93, 37,138, 42, 89,131,190,170,176,160,200,252,219,214,109, 75,155,132, 55, 45,
- 54, 26,181, 46,221,119,103,222,191, 90,173, 22, 2, 64, 80, 80,208, 29, 59, 44,192,212,229,253,111,248,223, 43, 86,171,185,232,
- 74,141, 99,158,230, 2, 76,156, 56, 81,246,197, 19,159, 0,176, 38,252,109,222,188, 89,233, 56,181,112,243,230,205,202,209,223,
- 63, 8, 0, 56,178,236, 0, 38, 78,156, 40,187, 85, 23,239,248,146, 92,186,116,201,238,237,115,164,239,240,112, 81, 85, 85, 5,
-189, 94,239,160, 68,110, 93, 27,231,206,181,230,126,152,204,102,156, 60,121, 18, 71,143, 28, 65,159,222,125,160,215,235,161,211,
-233,161,215,233,240,195,247,223,131, 59,207,157, 23, 61, 41, 41, 9,221,187,117,135,201,100,194,217,179,103, 97, 54, 25, 81,120,
-169,176, 81,239, 41,183,109,171, 89,128,200,200, 72,183, 20,147,209,100,128,217, 98, 13,251, 31, 60,120, 0, 26,157, 6,213, 85,
-149,168,168,168,128,186,188, 28,106,117, 89,131, 12, 49, 46, 18,208, 16, 15,231,207, 63,255, 68, 85, 85, 21,170,170, 42,109,255,
- 86,161, 73,120, 56,186,118,235,134,211,167, 78, 33,227,207, 63, 61,150,201,121,255, 66,161, 8,126,126,126, 8, 8, 8, 64, 96,
- 64, 0, 2, 2,252, 80,166, 46,147, 1, 80,221,236, 80,127, 93,248, 59,183, 20,166,227,111,161, 20,251, 64,198,125, 4, 50,228,
-117,228,126,152,136, 9,203,214, 64, 34, 98, 0,145,208,250,241, 2,222, 14, 5, 20, 62,240, 37,194,214, 63, 0,173, 86,139,176,
-176, 48,168,213,106,168,213,106,236,223,191, 31, 87,174, 92,177,135,137,237,231, 23, 22,226,201, 80, 95, 52,241, 43,169,207, 3,
-150, 57,146,170, 99,146, 28,247,157, 59,198,157,235,141,119,238,238,240,128,187,228,239,173,231,239,236,122,227,226,226,200,232,
-209,163, 73, 67,174,183,182, 17,224, 13,249,115,120,229,149, 87,142, 61,248,224,131,211,222,127,255,253, 46,127,255,253,247, 16,
- 95, 95, 95,193,132, 9, 19,136,143,143, 15, 88,150, 37,227,198,141, 59,182, 96,193,130,222, 61,123,246,220,242,248,227,143,207,
-156, 51,103, 78,157, 99, 81,137, 79, 38,178,255,156, 58,123,168,103,175,222,143, 30,202,202,122,104,203,214, 95,151,100,103,101,
-181, 56,153,115, 90,114,182, 48,151,254,240,201, 79,190,239, 39,125,216, 61,125,235,214,164,142, 29, 58,254, 22,208,220,255,207,
- 53,107,214, 88,224,102,203,227,226,226,112,232,208,161,190,201,201,201,111,233,245,122,209, 59,239,188,243,241,150, 45, 91,166,
- 22, 22, 22,222, 90,226,104,232, 16, 64,248,249,124,148,217, 66,255,142, 24,222,180, 41, 62,194,105,247,189, 14, 91,136,255,244,
-225,147, 8,233,210, 4,163,191,127, 16,155, 31,251, 69,201,133,253, 57,242,231,188,127, 79,102, 25,252,252,126,223,198,242,180,
-113,234,212, 41,112,157,181,118,152, 85, 36, 18, 65, 36, 18,161,164,164, 4,227,198,141,187,229, 15,137,203,250, 79, 78, 78, 70,
-108,108, 44,244, 6, 3,116,122, 29,244,182,228, 38,157,222, 58, 12,240,249,231,159,187, 84, 38,114,185,156, 46, 91,182, 12, 22,
-139, 5,135, 15, 31,129, 72,104, 13,219,118,234,212, 9,231,243,243, 81, 88, 88,136,245,235,127,196,212,169,143, 96,215,174, 93,
-212, 49, 18, 80,159, 2, 82, 40, 20, 98, 0,102,185, 92,206, 58,243,128, 60,153,170,200,121,254,153,153,153,208, 84,107,237, 6,
- 88,101, 85, 37, 42, 43, 43, 80, 89, 89,237,117, 40,156,243,254,109,149, 0,189, 50, 4,166, 78,157, 90, 99,187,125,100, 36,186,
-118,179, 38,197,157, 62,117, 10,231,109, 17,143,218,231,185,131,193,247, 12,134,143,216, 7,190,190,190,144, 72, 36,240,241,241,
- 65, 81, 81,145,219,228,239, 42,212,239,109,141,128,135, 62,248, 22, 63, 3, 24,251,254,253,160,169,207,131, 76, 78,194,223,185,
-165, 32, 97,161, 56,119,169,210,234,253,123, 56, 4, 80,123, 40,192,227,233,129, 58, 29, 32,200,173, 21,222,183, 18,189,201,100,
-194,215, 95,127,141,225,195,175,231,133,237,154, 21, 1, 20,107,209,101,155, 26,125,155,182,171, 75,129,171,106,141,125, 43, 1,
-187,250, 87,214, 62,215, 27,194,174,111,220,222, 91,207,223, 91, 67,226,102, 95,175,205, 8,104,240, 44,128, 37, 75,150,172,215,
-104, 52, 77,255, 58,118,108,178, 78,167,235,173, 84,238,246,245,145,248, 8, 25,194, 96,247,238,221,129,221,187,119,255, 46, 33,
- 33,225,245, 73,147, 38,185,244,214,149,187,254, 96, 39, 76,154,144,209,167, 79,244,139, 70,179, 97,236,185,156,179, 75,216,252,
- 92, 51, 0, 42, 1, 99,234,213,177, 75,106,179,102, 77,183, 9,132,226, 31,222,123,109,169,145, 27, 66,168, 15,177,177,177,203,
-227,226,172, 75,236,150,148,148, 32, 61, 61, 61,104,213,170, 85, 75, 0,224,208,161, 67,177, 61,122,244,216,126, 87, 24, 0,156,
-119, 62,234,135,117,245,123, 25, 30, 76, 9,228,172,223,126, 47, 14, 66,120,175, 22,118,210,119, 12,253, 31, 89,118,192, 35,203,
-181,177,230,164,114,109,235,214,173, 27,142, 31, 63, 94,131, 88,202,203,203,115, 1,116,112,246, 27,103,181,171,111,182, 17,224,
- 76, 89,252,240,253, 15,208,235,245, 48, 24, 13, 48, 26,141, 88,182,108, 25, 92,145, 63, 7,150,181, 64,226, 27, 0,157, 78,143,
- 83, 39, 79, 66, 40, 18,193,100, 52,194,207,223, 15,235,215,175,135, 64, 32,224,230,206,215,123,173,203,150, 45,219, 46,151,203,
-141, 10,133,162, 25,215,206, 90,117, 0, 60, 10,109,190,248,226,139,216,183,111, 31,170,171,171, 81,173,209,160,170,178,210, 70,
-254,149,168,170,172, 66,117, 85, 53, 52, 14, 10,223,157,123,215,191,127,127,154,157,157,109,247,254,157, 77, 3,116,183, 8,144,
- 84, 42,189,225, 89,112,164,127,244,232, 81,187, 55,239,238, 53,199,196,196, 80,174,200, 79,128, 95, 0, 36,190, 18, 84, 85, 85,
-201, 28,198,176, 61, 82,188, 55,171, 24, 16,103, 4, 76,122,127, 21,232, 70,160,201, 44, 5, 84, 11,227, 49,116,233, 90, 64, 36,
-130,191,164, 97,227,156,181, 13, 1, 0, 80,238,115, 21,108,188,138, 94,219,253, 80,244,171, 22,234,119,175,239, 53,153, 76, 24,
- 54,108, 24, 0, 32, 34,212, 23,123, 21,109,240,225, 7, 23,241,229, 17, 93,189,210, 28, 61,126,192,154, 8,199, 41,246,218, 73,
-113,158, 78,139,115,204,223,105,168,231,239, 76, 39,120, 35,235,102, 94,175,163, 17,208, 24,253,239,147, 79, 62,249,116,246,255,
-205,254,125, 64, 76,255,216,170,202,202, 48,179,197,108,104,222,188,121, 73, 68, 68, 68, 81,101,101,229,223,147, 38, 77,114, 91,
- 41,108,217,180,133, 5,176,254,177, 71, 31,207, 28, 50,116,232, 47,190,190,190,193, 4,148, 37,132,128,101,105,133, 78,163, 86,
-158, 57, 86, 80,229, 39, 22,185,165,231,185,123, 6, 88, 19,169,107, 39,234,125,240,193, 7,175,223, 21, 6,192,184,113,227, 84,
- 13, 41,248,227, 78,103,229, 12, 1,142,248, 27,147,208, 27,210,182, 94,189,122,225,208,161, 67, 40, 41,177,135, 8, 59, 0, 64,
-105,169, 53,162,244,216, 99,143,221,214,135, 85,251, 30, 81, 74,233,163,143, 61,138,207, 63,255,194, 54,102,110, 70,112,112, 48,
-113,247,247, 28,124,125, 37,156, 60,171, 55,165,209, 58,254, 6,128,243,197, 58, 28,208,109,217,178,101,103,229,114,121,177, 66,
-161, 16, 56, 38, 4,218,166, 5,186,173,232,184,185,239, 67,134, 12,105,244,123,215,191,127,255,218,107, 1,216,143,123, 90, 1,
- 80,161, 80, 16,149, 74, 69,215,175, 95, 95,163, 80, 15, 39,219,155,254, 44,149, 74,137,201,108,130,169,202,212,168,215, 94, 95,
-232,223,211,181, 1, 30,250,224, 91,192,161,240,207,136, 87,174,231, 37,105, 26,169,189, 53, 34, 0, 61,234, 55, 62, 11,135, 20,
-162, 16, 64,191, 15, 67,241,238,225,206,104, 10,160, 36, 87,131,142, 29, 59, 2, 0, 62,125, 55, 20,247, 14,104,138,246,247,230,
-184,245,183, 61,153,234,150,154,154,170,172,175,236,177, 43,125,211, 24, 58,175,161,178,110,197,245, 54, 38, 86,125,187,234, 44,
-128,179,141, 37,239,251, 31,190,206, 71, 35,100,133,166,167,167, 55,234,117, 54, 70,145, 31,175, 12,128,155, 77, 96,219,182,109,
-147,110, 94,118,231,173, 5,192,189, 72, 3, 6, 12,192,182,109,219,244, 54,210,103, 1,248,221,140,200, 67, 35,117, 18,162, 80,
- 40,236,158,125,125,228,127, 51,241,226,139, 47, 58,198, 83,237, 10,155,155, 70,232,137,183,115, 51,239,175,163,108,149, 74,213,
-224,178,191, 82,169,148, 72,165,210, 6,183,203, 85,109,255,198, 64, 67,134, 4, 22, 47, 94,140,188,188,188, 70,107,139, 59,229,
-125, 61,197,145, 23,212, 56, 2,107, 98,232,240, 4, 95,252,113,176, 51,154,251, 5,224,159,236,171,232,226, 38,249,187,234,127,
-119,106, 57,220,198,168, 37,112, 55, 93,239,157, 6,119,202,251,122, 40, 47,233, 86,181,253,150,175, 6,120,179, 34, 12,141,105,
- 4,140, 27, 55, 78,114, 55,117,192,219, 29, 61, 1,192, 85,168, 49,115, 6, 0,175, 60,238, 28, 52,116, 72, 32, 42, 42,138, 68,
- 69, 69, 53,138,190,241,100, 29, 0,111,241,103,170, 14,127,166,230,240,239, 44, 15, 30,174,156,200,190,125,251, 82,254, 54,240,
-224,193,131, 7, 15, 30,255, 45, 48,252, 45,224,193,131, 7, 15, 30, 60,120, 3,128, 7, 15, 30, 60,120,240,224,193, 27, 0, 60,
-120,240,224,193,131, 7, 15,222, 0,224,193,131, 7, 15, 30, 60,120,252, 43, 80, 99, 22,192,188,121,243,188,206, 76,117, 54, 79,
-156,151,119,231,201, 75, 76, 76,244, 74, 94,116,116,244, 13,242,142, 30, 61,234,117,251,156,201,187, 91,158,135,167,247, 48, 37,
- 37,229,150,180,175,177,159,199,173,124,190,174,166,137,122,122,255, 26, 91, 30,175, 95,110,189,188, 59,189, 63,223,233,242, 60,
- 54, 0,120,252,251,145,146,146,194,223,132,255, 24, 66, 66, 66, 24, 88,167,103, 10, 43, 42, 42, 88, 74,169,229, 78,106, 31,183,
-238,124,122,122, 58,109,140, 66, 51,141, 85,105,143,199,205,195,150, 45, 91,164, 19, 38, 76, 80,241,119,226, 14,138, 0,240,248,
-247,129, 82, 90, 99,169, 99,111, 35, 0, 43, 87,174,116,121,206,152, 49, 99,164, 59,119,238,172, 81, 89,108,244,232,209,178, 29,
- 59,118,120,245,162,167,165,165, 57,149, 23, 31, 31,127, 71,200,187,147, 65, 8, 33,237,154, 55, 71,126, 81, 17, 45, 47, 47,231,
-214,103,240,168,196,160,163,177,152,253,243,231,151, 8,193, 83,138,223,143,109,150,223,215,251,123, 74, 81,153,178,253,216, 83,
-139, 31,138, 37, 96,168, 80, 93,165,167,253, 31,126,218,227, 37, 57,211,211,211,165, 92,201, 89,219,191, 94,149,155,173, 77,254,
- 92,191,111,232, 66, 59,206,126,235,173,204,198,144,215,208, 37,131,189,137,150,220, 12,242,223,182,109,155,114,194,132, 9,188,
-113,118,167, 25, 0,141, 73, 16,222,202,242, 84, 30, 33,132, 1,224, 11, 64, 71, 41,101,239,180,246, 53, 22,193, 54,134, 1,192,
- 41,117,199,182, 18, 66, 12,148, 82,159,134, 68, 10, 8, 33, 20, 0,146,146,146,106,172, 24,182,104,209, 34, 37, 33, 4,148, 82,
-226,169, 82, 2, 0,246,167,208, 26,251,153, 41, 59,149, 59,119,238,244, 88, 1, 54,166,188,187, 33,138, 66, 41,165,178, 14,237,
-169,172, 67,123, 0, 64,145,209, 60,189,133, 88,184,150, 59,126,186,178,218,231, 74, 73,137,209, 29, 89,135, 54,126,150,195,178,
-136,184,103,112,147,160,143, 23, 14,221,209,187,119,200,133,167,150,198,190, 7, 0, 87, 43,180,247,139,132,228, 87,128,156, 76,
- 76, 76,236,225,233,189,169, 93,138,182, 33,229,102, 29,201,191, 49,140,128,186,126,227, 45, 89, 54,134,188,132,132, 4,164,166,
-166,186,117, 77,158, 68, 84,234,147,215, 88,145, 25, 71,242,103, 89, 22, 41, 41, 41, 88,187,118, 45,157, 62,125, 58,241, 80,207,
-136, 41,165,141, 82, 47, 59, 60, 60, 60,177,180,180,244, 63, 27, 22, 21,186,163,220,228,114,121, 83, 0,253, 1,100, 43, 20,138,
-146, 59,204,211, 9, 2, 16, 7, 96, 18,128, 77,132,144,116, 74,105,101, 35,200,253,145, 82,250,136,183, 4,123,167,128, 97,152,
-122,141, 20, 66, 72, 44, 0, 49, 33,164, 25,165,180,184,174,243,234, 51, 80, 8, 33,116,193,130, 5,104,219,182,237, 13,203,133,
- 38, 37, 37,201, 10, 10, 10,148,132, 16,234,174, 17, 32,151,203,233,234,167,253, 49, 99,232,141,139,203,176, 63,133,226,187,189,
- 70,204,242,208,107,106, 76,121, 21, 21, 21,210,151, 94,122, 73, 57,121,242,100,200,100,214,202,118,127,253,245,151,116,229,202,
-149,202,182,109,219,130,101, 89,232,116, 58, 72,165, 82,140, 25, 51,198,165, 76,113,133, 70,218,229,165, 13,202,157,253, 90,203,
- 90, 60, 49, 90, 5, 0,230, 34,179,244,204, 27,102,165,165,109, 16, 42, 89,127,168,117, 65, 40, 14, 62, 36,155,179,184,153, 75,
-239,184, 67,155, 22, 45,218,138,125,175, 60,253,212, 99,134,230,190, 98,113,101,153,142, 44, 91,181,110,237, 43,115, 31, 69,168,
-175, 47,213,155, 44,244,127,159,175, 50, 0, 32, 45, 91, 54, 17, 22, 21,149, 50,125,251,246,117, 42,107, 64,179, 29,157, 46, 71,
-248,133, 12,185,167,105, 82,116, 76,152,104,245,234,115,145, 77,155,248, 94, 91,190,240, 96, 82,254,133,104,203,125,247,182,204,
-204, 57, 91, 85, 48,107, 70,135,113, 92,191,241,228, 29,112, 92, 32,167, 33, 94,104,109,242,175,253,126,122, 35,255, 78,140, 0,
-216,136,152,114, 70, 64, 66, 66,130,227,254, 26,164,237,184,176,143,183, 70, 5, 39, 39, 53, 53,181,193, 81, 2, 71,242, 95,180,
-104, 17,178,179,179,233,222,189,123, 49,125,250,116, 79, 69, 25, 9, 33, 34, 74,169,185, 17, 84,100, 81,120,120,248,164,210,210,
-210, 77,188, 1,224,156, 32,218, 0,248, 10, 64, 33,128, 5,114,185,252, 9, 74,233,197, 91,229,193,186, 32,233,112, 0,223, 1,
-184, 12, 96, 63,128,177, 0,230, 16, 66,102, 80, 74, 75, 27, 40,126, 10, 33,100,186,171,241,210, 91, 25, 98,191, 73, 24, 4,224,
- 12,128,246, 0,138,137,141,169,221, 53,104,198,140, 25, 35, 5, 80,131,252, 23, 45, 90,164,116,140, 6,216,142, 41,199,140, 25,
- 35,117, 53, 28,144,150,150, 38, 5, 80,131,172,153, 41,106, 56,122,239, 51,134,138, 49,235, 51, 13,210,210,210,164,174,194,247,
-141, 45, 15, 0, 14, 30, 60,168,148, 72, 36,200,204,204,172,177,222, 1,195, 48,120,245,213, 87, 9,167,236,182,110,221,170, 28,
- 51,102,140,203, 7,208,226,224, 73, 37,149,136,208,187, 68,172, 44,190,190, 20, 43, 8, 67,209,251, 85, 35, 1,140, 56,254,231,
- 5,233,229,141, 15, 40,129,172,122,149,176,172, 67,123,218, 86,236,139,231,158,156,110,104, 30, 32, 22, 95, 59,190,143,248, 51,
- 66, 60, 51,172, 19, 90,133,248,226, 66,230, 30,162, 51, 82,178, 40,241, 49,163,172, 67,123,218,213, 47, 16, 87,232, 53, 18, 29,
- 29,237, 84, 94,147, 38,226, 17, 98, 49, 35,217,191,255,202, 2,179, 69,191,162,121,235, 40, 83, 72, 19, 17,169,172, 60,231, 23,
-213,222,175, 73, 88,152, 79, 9, 75, 43, 13,191,101, 21,107,230, 13,187, 61, 29,184,118,216,223,241,221,244,212, 8,224,206,113,
-204, 35,112,117,158,171,229,183, 27, 83,158,163, 17,160, 80,168, 1,168, 33,151,135,194, 25,105,187,139,186,140, 10, 91, 68,166,
- 65, 81, 15, 71,242,223,186,117,171,146, 97, 24, 48, 12,131, 97,195,134, 97,207,158, 61, 53,158,151,187,176, 88, 44,199, 4, 2,
-129,137, 16, 34,108,132,124, 22,223,210,210,210,159,194,195,195, 31, 46, 45, 45,221,200, 71, 0,110, 84,248, 43, 0,236, 2,240,
- 37,128, 39, 1,172, 72, 73, 73,121,216, 75,194, 14, 5,176, 0,192, 0, 0,227, 0,108, 3,112, 8,192, 39,148, 82,181, 23, 34,
-255,180,181,107, 37,165,148, 37,132,248, 3,152,105,219,223,163, 1,134, 69,176,237,171, 63,128, 74, 79, 60,236, 58, 34, 40, 98,
- 0,175, 0, 88,162, 80, 40,140,119, 88, 31, 24, 0, 96, 31,128, 22,132,144,245,182,103,242,125,109,131,166, 46, 3,101,231,206,
-157, 74,199,176,255,162, 69,139,236,219,142,223,147,146,146,100, 54,195,160,222, 55,126,231,206,157, 74,199, 48, 61, 51, 69,141,
-179,219,172,171, 48, 50,227,190,183,147, 54,251, 83, 40,152, 41, 59,149,174, 22,244,113, 38,143, 83,102,204, 20, 57,245, 84, 30,
-165, 84,186,127,255,126, 76,159, 62, 29, 95,127,253, 53,142, 28, 57, 34,237,215,175,159,170,246, 57, 18,137, 68,217,178,101, 75,
-215,119,159, 82,105,203,253, 39,112,102,186, 20, 1, 95, 31, 7,185,162,149,210,150,126, 54,121,196,118, 10,164, 34,125, 91,101,
- 88,203,250,151,178,149,117,104, 79, 19, 31,159, 98,108,238, 47, 22,153,206,101,139, 67,155, 6, 18,229,149, 74, 60,220,183, 13,
-186, 70,132, 64, 92,126, 6,202, 42, 29,218,136,124, 16, 66, 4,162,151,231, 76,167,213, 98,159, 28, 89,135,246, 20, 65, 33, 78,
-101,170,203,171,194, 98, 99, 3,146, 42,205, 3, 23, 7,134,150,248,232, 25,127,214, 55,192,104, 8,107, 18,206,248,133, 72,132,
-234,178, 43, 62,149, 21,102,136, 42, 12,196,177,207,212,103,208,218,198,253,149,174,136, 51, 33, 33, 65,230, 42, 31,192,153,231,
- 95,219, 16,240,196, 8,224,142,213, 71,198,142,251, 93, 17, 99,109,121,116, 67,232,141,250,102,178, 26,238,202,171,231,158,210,
-134,144,118,109,163, 2, 0,194,194,210, 27,133,252,231,205,155,103, 29,126, 99, 89, 60,255,252,243, 88,177, 98,133,157,252, 87,
-174, 92,233,177,108,134, 97, 96, 52, 26,143,138,197, 98,115, 35, 68, 2,202, 0,160,180,180,116, 99,120,120,184,172,180,180, 84,
-137,255, 16,234,141, 0, 16, 66, 34, 0,180,161,148,114,132,255, 33, 33, 36, 75, 46,151, 71, 80, 74, 11, 61,241, 96, 9, 33,143,
-217,200,250, 99, 0,139, 1, 60, 10, 32, 2, 64, 2,128, 2, 66,200,147,148,210,239, 61, 32,233,215, 1,156,163,148,126, 65, 8,
-241,177,189,240,102, 74,233,151,132,144,123, 9, 33,175, 83, 74,223,246,242,190, 12, 7, 80, 2, 96, 4,128, 95, 61,249,161,179,
- 8,128, 92, 46,159, 13,224, 13, 0, 69,137,137,137,201,119, 88, 4,160,135,173,109,163, 1,220, 7,224,130, 43,131,166, 46, 56,
- 18,190, 35,233,215,206, 11,112,251, 69,119, 32,127, 0, 56,187,237,177, 26, 70,128, 55,242, 28,149,153, 66,161, 32,142, 70,128,
- 59,200,200,200,128,209,104, 68, 76, 76,140,108,239,222,189,202,252,252,124,101,191,126,214, 37,117, 89,150,197,251,239,191, 79,
-171,171,171, 33, 18,137,240,208, 67, 15,185,188,110,125,230, 33, 48, 70, 51,202, 99, 34,101,162,189,151,149,231,190,205, 64,135,
- 87,238,179,146, 22, 75,113,236,125, 49, 45,171, 14,132, 78, 20,128,209,243,206,186,190,143,140,160,186,228,120,102,176,222, 96,
- 97,130,125,125,104,124,223,182, 8,242, 21,145, 75,165,213,240,103,132,152, 28,221,150, 30,252,167, 24, 7,126,221,142,118,254,
- 1,244,239,170,202, 11, 0,186,212, 37, 46,243,104,171,167, 6, 69, 95,203, 8, 16,182, 55,139,205, 87, 59, 12, 31, 60, 57, 64,
-111,244,127, 64, 16,112,136,169, 44, 47,243,203, 63,117,168,189,201,120,170, 36, 47, 87, 19,100,123,103, 92, 18,149,187,222, 41,
-151, 31, 80,215,248,115, 93,222,180, 43,175, 82, 46,151,211,186,134, 60,238, 38,212,246,252,173,228, 13,164,166, 54, 94,146, 96,
- 99,120,254,148, 82,152,205,215, 57,122,232,208,161,216,179,103,143, 87,228,111,131, 73, 36, 18, 89, 88,150,221,207, 48,140,169,
-129, 70, 64, 51,238, 75,105,105,169, 50, 60, 60, 92, 94, 90, 90,170,192,127, 4,174, 34, 0,247, 2,216, 87, 43,113,108, 31,128,
-123, 83, 82, 82, 86,121, 64,214,211, 0, 44, 4, 16, 89, 43, 52,175, 6,112,130, 16,242, 41,128, 29,132, 16, 11,165,116,157, 27,
-242,252, 0, 36,114, 94, 62,165,212, 80,235,148, 25, 0,254, 33,132,124, 68, 41,213,122,113, 95,166, 0, 88,101,251,215, 35, 3,
-160, 54, 97,202,229,242,255, 3,240,148,237, 94, 38, 17, 66, 12, 10,133,226,219, 59,225,225, 19, 66, 58,194,186,228,241,111, 0,
- 54, 3,224,158, 19,220,141, 0,252,215, 80, 88, 88,168, 28, 56,112, 32, 8, 33,170,129, 3, 7,226,151, 95,126,193,131, 15, 62,
- 40,109,209,162,133,146, 97, 24,188,252,242,203,196,166, 76,164,235,215,175, 87, 26, 12, 6, 12, 24, 48,160, 78, 69, 55,248,252,
-101,101,209,192,110, 0, 33,170,127,154, 91,100, 61,254, 10, 83,234, 89,200, 0,128, 48, 64,239,151,141, 4, 40,133,166,180, 66,
-186,123,125, 71,165, 38, 48, 75,246,200,204, 32,167, 94,241, 37,163,249,163,148,148,117,207, 55,109,226,155, 95,161, 49, 6, 71,
-134,250,139, 18,250, 68,249, 69, 71,250, 16,189,214, 2,173,142,197, 57,162,179,108,206, 47,212,230, 22, 85, 91, 90,136, 37, 87,
-138,140,250, 49, 23, 13,166,143, 3,129,231,156,201, 12, 10,141,104,173,171, 62,219,170,123,220, 72,230,228,193, 43,195, 11, 79,
-255,114,177, 99,255,196,102,130,110,125, 47, 29,221,243, 83, 5, 17, 4, 13, 96, 89,182,236,234, 85,157, 75, 43,170, 54, 97,187,
-218,230,188,217,212,212,212, 58, 9,219, 49,188, 94, 59, 18,224,206,249,119, 43,226,226,226,136,163,215,239, 8,199, 16,126, 67,
-208, 24,114,170,171,171,149, 0, 32, 20, 10,241,236,179,207, 34, 59, 59, 27,123,247,238,109,168, 88, 3, 0,139,193, 96, 48, 23,
- 22, 22,238,140,136,136, 48,185,138, 44,214,131, 42,199,141,210,210, 82, 69,120,120,248,248,210,210,210, 95,255, 11,250,172,222,
- 8,128, 92, 46, 31, 3, 96,109, 45,175,118, 55,128,233,137,137,137,171,220,241, 96, 9, 33, 2, 88,195,223, 19,235, 26,151,167,
-148,150, 18, 66, 38, 3,216, 76, 8,249,201,141,113,157,105, 0,118, 80, 74, 43,234,144, 87, 65, 8,217, 97, 59,239,107, 15, 73,
-113, 36,128,112, 0,243, 1,172, 39,132,140,164,148,238,246, 38, 2, 64, 8,137, 7,240, 33,128,118,148, 82, 13, 33,100, 16,128,
- 11,114,185,188,138, 82,154,230,110, 4, 64,110, 53,245,221, 81, 90, 68,193,185, 1,238, 97, 48,128, 44, 74, 41, 37, 86,183,233,
- 2, 0, 13, 33,164, 13,151,231,225, 73, 4,160,182,199,223, 16,239, 31,176,133,229,199,125,111,143, 2,116,106,128,247,111,151,
- 55,229,122,248, 86, 46,247,204,251, 55,153, 76, 52, 59, 59, 27,129,129,129, 56,118,236, 24,181, 88, 44,168,172,172,196,169, 83,
-167,148,225,225,225, 53,206, 13, 15, 15, 87,117,239,222, 93,182, 97,195, 6,229,128, 1, 3,156,202, 19,152, 76,180, 77,246,113,
-136, 3, 35, 32, 58, 86, 74,155, 91, 2, 81, 85,201,192,114,170, 26, 8,175,185, 34,181,127,184, 89,213,182,255, 97,217,246,141,
- 83,148,192,239, 78,149,221,217,139, 23, 95,232,212,166, 13,112, 77,247, 60, 0,228,232, 42,177,213,167,176,164,251,136,225, 77,
-187, 27,143,225,196, 5, 53,182,254,117, 85,152, 91, 82, 29, 4, 0, 69, 70,125,232, 69,131, 41, 33,183,176,240,231,190, 77,155,
- 58, 53, 0, 70, 60, 48,153,241, 19,143,233,101,214,156, 40,104,219, 45,174,115,197,197,141,198,115, 39,118,150,155,216,128,171,
-197, 5, 7,138, 43,203,252, 7,128, 97, 72, 89,149, 62, 88, 62,165, 95, 27,197, 79, 71, 46,214,213,103, 20, 10, 5,113,140, 0,
- 56,122,151,181,195,237, 28, 73, 39, 36, 36, 32, 46, 46,142, 56, 43, 20,211,144,108,124,103,242,238, 70,112,175,187, 92, 30,122,
- 67, 68,192,219,168, 66,106,106,106,163,144,255,218,181,107,233,159,127,254, 9,186, 33, 20,100,178, 26,203,151, 47, 7,165, 20,
- 12,195, 32, 57, 57,217,235,200,130, 90,173, 54,132,133,133,201,254,252,243,207,223,135, 15, 31,126,159, 77,215, 82, 79,103, 26,
-217, 16, 98,123, 95, 19, 75, 75, 75, 83,194,195,195, 31, 3, 80, 22, 30, 30,254,127,165,165,165,223,226, 95, 14, 97, 45,162, 33,
-114,185,156,187,137, 45,108,159, 12,219, 52, 59,123, 20, 20,192, 34, 66, 72, 43, 0, 69, 28,231, 58,179,208,109,164,242, 12,172,
- 9,122,231,107,201,169,141,243,182,243,158, 33,132,172,168, 71, 30, 1,240, 16,128,165, 46,228,173, 1,176,152, 16,178,202, 69,
-251, 28, 59, 77, 36,172,249, 14, 49,176,142,253,191, 10,224, 48, 33,164, 3,128,124, 71, 27,195, 13,121,143, 0,152, 99, 35, 89,
-157,173,173, 58,219,118, 50, 33, 68, 12,224,199,250,228,217,158,197, 99, 0,230,185,107, 0,200,229,242,149, 0,190,175, 75,158,
- 77,230, 71, 0, 2, 1, 4, 3,216, 98,107,155, 4,214,121,226, 39, 0, 12, 36,132,204, 7,176, 23,192,214,186,218, 7, 88,231,
-209,215, 49,214,143,218,185, 1,163, 71,143,118,105, 12,140, 30, 61, 90,198, 76,185, 62,110,207, 25, 1,220,119,123,164,123,138,
- 26, 94,203,155,114,227,148, 64,119,228,253,245,215, 95,104,219,182, 45,158,125,246, 89,123,159,249,238,187,239,104,102,102, 38,
- 30,120,224,129, 27,206,247,243,243, 83, 74, 36,146, 58,229, 69,254,245, 23,202,219,182,196,193,103,103,219,229,157,121,225,103,
-105,251,204, 10, 37,243,128,228,134,182, 20,228, 24,225, 35,169,127,246,211,185, 75,151, 94, 68,235,214, 7, 0, 12,162,160, 2,
-156, 47,121, 86,107, 54,195,172,183, 6,201, 78,150,148,224,188,222,248,157,144,144, 42, 16, 98, 58,119,233, 82, 26, 0,212,149,
- 4,216, 42,178,235,139, 0,150,229,236, 89,144, 47,105,254,144,186,176, 72,210,186,232,210, 33, 9, 68, 97, 29,243, 47, 88, 34,
- 74,139, 46, 66, 44, 22, 53,235,209,220,127, 90,121,149,233, 7, 0, 23, 93,121,174, 0,164,181,167,255,213,225,129,202,188,169,
- 9,224,108,252,255,191,128,134, 78,213,227,126,159,154,154, 74, 27, 42,111,221,186,181, 84,165, 82,129,164, 89, 13,227, 29,175,
- 5, 98,204,187, 85, 24, 62,124, 56, 60,153,246,231, 12, 97, 97, 97, 50, 0,184,231,158,123,180,182,231,219, 16,121,234,240,240,
-240,233, 0, 56,231,212, 80, 90, 90,186,245,191, 18,209,172, 29, 1, 16,192, 58,221,111, 8,128,119, 0, 60,109, 35, 30,127,199,
-247, 9,214, 36,177,115, 0,254, 7,235,144, 64,118, 29,242, 25, 88,147,204,118, 0,240,115,163, 61,251, 1,140, 65,221,107, 20,
- 48, 0,154, 2,104, 7,224,176, 11,153,135,109,231, 53, 67,221, 99,147, 12, 0, 49,128, 80, 88,135, 13, 30,180, 17,119,142, 77,
-118,142,109,123, 29,128, 95, 96,157,113,160, 6, 96,116, 33,111,138, 45,242,208,213,102, 36, 57,182,243, 10, 0, 57,128,211,182,
-115,127,114, 33,111, 33,172,179, 27,220, 25,202,240, 3,176, 29,192, 90, 23,207,227, 97, 0,239,217,254, 61,234,208, 62,145,237,
- 89,166, 2,248, 12,192,187,182,227, 87,234,250,131, 59,118,236, 80, 17, 66, 80, 80, 80,160,228,102, 2,212,246,250, 11, 10, 10,
-148,220,185,174, 46, 32, 62, 62, 94,181,115,231, 78,124,183,215,104,207,220,175,237,165,127,183,215,104, 63,247, 86,202,203,204,
-204,196,176, 97, 53, 83,221, 35, 35, 35,101, 27, 54,108, 80, 70, 69, 69,201, 88,150, 85, 46, 89,178,132,114,211, 0, 9, 33,232,
-223,191,127,157, 70, 69,151,204, 76,252, 24,222, 76, 22,228,176,175,219,252, 49,208,124,120, 17, 24,213, 12,148, 5,142, 45, 17,
-209,106, 54, 0,101,186, 32,168, 73, 52,250, 12,219, 34,171,175,219,219,102,112,108, 4,176,177, 99,187,136, 46, 0,158, 53, 88,
- 88,164, 29,203,199,176,230,214,225, 78, 66,105, 85,149,217,252,206,213,171, 87,175,186,209,167, 62, 4,224,159,115,186,236,209,
-242,195, 27,154, 20, 95, 41, 67,241,213, 42, 8,133,165,254,213,106,138,242, 74, 11,109,214, 84, 28, 34,100, 49, 73,103,176,252,
-248,238,179, 67, 66,154,117,155, 89,238,130,104, 84,174,200,165,193, 99,216,113, 27,172,255,166, 79,246,208, 3,190,185,179, 0,
-200,100, 53, 26, 34,175, 46,143, 61, 38, 38,230,142, 33, 21,123,178, 35, 71,254,199,204,248, 86,105,125,199, 26, 74,254, 28,225,
- 11,133,194,166, 66,161,176,120,255,254,253,223, 52,192,251, 7,128,182,165,165,165, 95,216,162, 0, 83,108, 51, 2,166,148,150,
-150,254,244, 95, 53, 0,158,181, 89, 67, 15, 0, 56, 5, 32,192,201,239,182,217, 60,246,120, 0,177, 54,242,116, 26,229, 4,208,
- 9,192,122, 55, 13,128, 82,219,249,130,122,228, 73, 1,156,117, 83,222, 89,219,249, 63,215, 35, 47, 17,192, 44, 0,199, 97,157,
-161,112,190,150,108,165,205,251,127,202,230, 13,175, 6,176,178, 30,121,143,217,238, 71, 95, 91, 20,193, 89, 59, 43,109,199,147,
-109, 70,192,234,122,228,173,177, 25, 93,238, 92, 47,181,157, 95,223,253,251,216, 22,217,216, 97, 51,106, 80, 75,246, 31, 0,186,
-219,158, 69,142,205,144,106,227,234,133,180, 21,232, 80, 58, 43, 4,228,169,149,174, 80, 40,200, 44,185,156,206,250, 76,227,164,
-112,143,218, 99,130,104, 44,121,207, 60,243,204, 13,231, 12, 31, 62, 92, 53,124,248,112, 2, 0, 35, 71,142,244, 72, 9,109,123,
-230, 25, 18, 84,107, 31,219, 46, 64,229,251,121, 55, 2, 0, 61, 20, 34, 98, 13,202,112,153,217, 23,220,236, 6,182,231, 98,161,
-249, 16, 2,130,106,216,201,223,230, 34, 95,149, 72, 36,238,206, 70, 33, 0,222,220,147,126,212,175,121,235,118,227, 89,248,117,
-186, 84, 80, 36, 48,233,203,105,139,102, 1, 36,192, 95, 68,204, 38, 22,234,114,163,153,248, 18,223,138, 42,115,199,102,117, 59,
- 4, 78,201,162,246,247,219, 89,190,247,102,207, 2,104,168,188,186, 60,246,168,168,168, 59,134,252,217,159, 66,177,227,152, 53,
- 39,111,181,210,136, 31,247, 27, 65, 41,109,148,231,202,233, 17,139,197, 82, 10, 0,253,250,245,107, 80, 65, 32,142,252,109,184,
-102,251,247, 78,155,169,117,203, 12, 0, 11,128,255,171,135, 64, 28,113,200,246,177,216, 62,206, 96,129, 53,163, 94,224,102,123,
-148, 0,210, 93,200,219, 12,107,210,154, 59,120,212,141,246,165, 0,248,198,133,156,127, 96,157, 2, 9, 55,228,125,111,139, 24,
-184, 66,190,205,179,119,167,125, 2, 15,158,105,138, 11,121,163,220,144,199, 69, 27, 86,219,238,141,197,157, 23,115,204,152, 49,
- 82,142,240, 57,120, 91, 10, 88,161, 80,144,180,180, 52, 41, 51,165,113, 74,247, 54,182,188,187, 1,185,151, 46, 27, 58,181,105,
-179,122,222,135,201,179,184,125, 70, 17,179, 86,175,101,183, 23, 21, 20, 84,185,213,153, 82, 82,232,181,195,223,146,165, 63,157,
-120,113,235,231, 35, 55, 29,204,186, 50,183,105, 48, 59,129, 9, 11, 10,161, 20, 32,132, 26, 12,102,182,136, 5,174, 25, 13,108,
- 72,225, 21,157,177,147, 7,109, 76, 72, 72,144, 57, 14, 7, 36, 36, 36,200,238,148,251,119, 39, 86, 2,188, 91,112,239,187, 85,
- 55,245, 26,109,211,190, 91, 74, 36,146, 43,253,250,245, 27,213, 24, 50, 75, 75, 75,119,133,135,135,207, 42, 45, 45, 93,253, 95,
- 54, 0,244,222, 60,143, 58,246,179,176,102,108,242,242,254,157,242,106,192, 70,244,141,246,162,199,199,199,171, 92,205,203,191,
-157,242,238, 6,148,105,181,179, 1, 63, 19,128,166, 44,104,161, 94,111, 92, 87, 84, 84,242,183, 39,211,166,154,196,252, 31,221,
-188,252, 62,114,213,255,145,204,214, 67,145,153,190,234,227,103,195,194,124, 22, 11, 5,132, 94, 41,213,159,185, 98, 52,127,231,
- 43, 98, 36,190, 66,129,192,100,102, 37,158,180,143, 27,227,231, 18,207,188, 93, 7,224,134,169,127, 14,161,127,111,138,205,212,
-246,204,221,217,127,171,229,221,106,195,199, 93, 48, 83,212, 32,132, 96,194,196,235, 9,209,219,126, 63, 98,215, 33,227,238,235,
-215, 40,215, 74, 41, 45,106, 76,125, 99, 51, 2, 86,255,151,244,131,176,214,131,167,238, 42,251,218,112,150,197,206,203,251,119,
-203,227,113,231,163,180,180,148,194, 58,204,213, 32, 92,245,159, 68, 1, 96,207,218, 79, 72,220,236,231,150,207, 72, 60,246,217,
-211, 83,247,119, 55,106, 72,251, 48,145,176, 9, 8,209, 6,248, 10, 75,122,118, 13,202,241, 84,118, 92, 92, 28, 73, 77, 77,245,
-186,222,252,205, 34,207,187, 37, 2,112,231, 25, 15,214,216, 16,255,246,221,249, 32,125,251,246,165,252,109,224,193,227, 63, 98,
-241, 11, 0, 63, 31, 2,150,181,234,232,106, 29,255,250,243,224,241,159,213, 7,252, 45,224,193,227,191, 3,179, 5,168,212,114,
-164,207,147, 63, 15, 30,255,101, 48,252, 45,224,193,131, 7, 15, 30, 60,120, 3,128, 7, 15, 30, 60,120,240,224,193, 27, 0, 60,
-120,240,224,193,131, 7,143,127, 35,106,228, 0,204,155, 55,207,235,204, 77,103,181,181,157,201,251,245,167,175,164, 61,123,119,
- 84,182,108, 29, 33,171,210,105,148, 25,202, 76, 89,252,148, 39, 85,222,202,251,124,213, 70,105,223,222, 3,149, 87, 11, 11,225,
-239,235,143,139,151,114,101, 79,204,158,232,181,188,198,190,222,227, 25,243,164,131, 6, 70, 41,125,253, 5, 16, 10, 24, 16, 9,
-193,149,202, 5,196, 91,121, 71,174,246,150, 14, 24, 56, 64, 25, 28, 32, 0,132, 64,217, 95, 41,196,221,246,117,186,183,147,215,
-215,123,246,143,179, 55,200,139,141,141,245, 90, 94, 86, 86,214,141,242, 58,121,223,190,172,179, 55,182,111, 96,231,206, 94,203,
- 59,152,147,115,215,201,187,183,158,231,187,116,105, 42, 93,188, 56,161,206,227,127, 56,121,190,157,198,222,235,125,127,217,254,
-199,141,253,249, 94,239,251,203,210,157,165, 52,136,205,173,177,175, 73,167, 71,188,150,119,237,236,143, 55,180,239,232, 43, 23,
-188, 86,164,209, 75,218,221,176,111,121,147, 66,175,229, 61,123, 45, 2,183, 67, 95,221, 73,242,142, 30, 61,234,181,188,232,232,
-104,175,228, 17, 66,132,206,166,200,122, 43,175,177,219,231,137, 60,143, 13,128,186,160, 95, 47,239, 4, 32, 10,214, 58, 1,185,
-146,169,138,243,238,254,129,141,223, 47,149, 18,176,104, 26, 18,134,204,140, 35,202, 53,107, 62,193,144,184, 33, 48,107,180,202,
-238, 93,135,131,101,161,252,167,253, 26, 89,116,116,111,156, 59,119, 1, 21,229, 26,244, 26, 60, 93, 85,151,188,148, 31,148, 82,
- 10,130,118, 29,163,148,242,231,222, 69,233,167, 27,241,253, 87, 95, 2,144, 96,219,223,151,192, 48, 80,126,242,230,107,200,201,
- 57,131,200,200,118,240,241, 21,226,242,165,156, 58,139,139,228,253,252, 37, 21,139,197,240,245,245, 69,110,110, 46, 90, 53, 11,
- 66, 19, 97, 0, 90,181, 13, 65,168,111, 48,252,137, 5, 12,195,128,178, 22,104,125,132,168,184, 90,129,226,254,174,231,146, 87,
-228,126, 65, 3,125, 43, 48,120, 64, 7, 4,248, 11, 33,246,101, 32, 20, 0,140, 88,136, 46, 17, 95, 81, 19, 21, 32,239,242,108,
-183, 31,248,231,191,235,165, 17, 17, 17, 24,114, 79,107,165, 78,111, 0,227,227, 11,152,128, 99,213,253,164, 58,173, 6, 3,155,
-157, 81,221, 46, 43, 50, 37, 37,133, 38, 38, 38,242,211,126,238, 0,184, 34,250, 6,158,239, 15, 96, 64, 11, 95,191,247, 10, 11,
- 11,187,138, 36, 62, 96,253,252, 62,128,181, 50,102,245,157,114, 15,114,255,249, 93,122,254,100,198, 13,107, 13,196, 37,124,240,
-111,233,163,228,251,239,190, 59,237, 35, 22,251,178, 44, 27,236, 31, 16, 16, 48,126,194, 4, 63, 88, 43,216,221,169,153,157, 92,
-180,153,109,240,197, 19, 18, 20, 28, 28,188,168, 75,151, 46, 15,249,248,248,180,190,116,233,210,165,194,194,194, 44,163,209,184,
-132, 82,154,235,133,188,144,208,208,208,119, 71,142, 28,121,223,147, 79, 62, 25, 25, 27, 27,123,245,248,241,227,251,245,122,253,
- 91,148,210,227,255,153, 8, 64, 29,228, 47,240,247, 17, 14,120,108,104,135,143, 88, 74,245,123,206, 92,253,244,212,122,249, 14,
-201, 84,197, 73, 87,191, 77,152,208,145, 78, 24,185, 20,166,234,114, 8, 45, 12, 78,156, 60,131,153, 51, 23, 92,239, 17, 12,112,
- 32,115, 53,154,180,141, 80,178,213,149, 48,178, 4,187,119,103,202, 46,233,156,203,147,203,151, 80,136,131, 65,252,130,112,228,
-100, 1,254, 62,249,127, 88,245,227, 31,246,227, 44, 11,140, 29, 60, 24,168, 46, 2, 16,136,220,227,167, 32,106, 18,130, 33,131,
-122, 42,203,181,245,216, 44,132, 1, 8,131,190,189,251,161,133,191, 24,173,154, 72, 16, 20, 30,134, 80,159, 64,132, 74, 4, 16,
- 9, 4, 48, 89, 44, 40, 55,179, 56,116,237,176,203,155, 90,244,247,187, 52, 44, 24, 8,242,243, 67,211, 38,225, 8, 10,242, 3,
-101, 44, 48,179,213,176,192,130,128, 0, 63, 52,105,209, 26, 81,157,246,210,244,140,161,245, 42,165,228,157, 70, 26, 28,232,143,
-168,246,205,208,180, 73, 56, 52, 26, 13,196, 62, 18,136,244,214,226,124,237, 35,219, 41,203,212,229,248, 41, 51, 95, 86,112,233,
- 50,212, 69, 23,176,228,201,126,245, 26, 3,169, 75, 83,221, 86, 18,113,179,226,100,161,205, 67, 85,245,145,255,173, 48, 2, 94,
-249,240, 67, 10, 0, 75, 94,120,161, 81,254,198,203,203,150, 81, 0,120,255,197, 23,189,150,247,219,190,125, 51,141, 70,227,106,
- 0,120, 72, 38, 99,188, 81,190,138, 13, 27,168, 77, 9,217,247, 81, 74, 65, 8,177,255,203,237,227,206, 75, 76,168,155,176, 23,
- 47, 78, 32,238,146,186,135,228,223,221,223,100,222, 24, 24, 18,220, 21, 0,196,190, 18, 24,117,122,176, 26,237,178,253,127,102,
-188, 57,226,225,135,187, 1, 40,112, 37,196, 32, 16, 83, 0,102,219,135,177, 17,130,176, 46, 93,212,103,196,125, 56,189,123,179,
- 71,207,232,252,201, 12,101,199,158, 82, 89,100,183,177,158, 27,197, 9,101, 30,157, 62,121,242,100,108, 72, 72,175,247, 28, 89,
-122,205,165, 72,186,135, 88, 47,181, 88,207, 66,103,182, 62, 87,141,237, 95,197,192, 16,116, 14, 20,213, 43,239,163,143, 62, 82,
-189,178,240,249,102, 19, 31,154, 20,160,215,235,240,201,242,143,153,207, 63,255, 92, 63,127,254,252, 8, 0,151, 27,251,221,219,
-190,125,123,220,166, 77,155,118, 2,158,213, 28,200,204,204,164,249,249,249, 40, 45, 45, 69, 85, 85, 21, 2, 3, 3, 17, 30, 30,
-142,200,200, 72, 12, 30, 60,216,171,247,142, 16, 50,188, 95,191,126,223, 61,247,220,115,231,186,116,233,178, 58, 58, 58,250,212,
-213,171, 87, 91,103,102,102,246,155, 61,123,246, 86, 66,200, 50, 74,169, 39, 75,213,203, 30,122,232,161,212,165, 75,151,134,155,
- 76, 38,248,250,250,194,223,223,191,165, 70,163,121,120,226,196,137,227, 9, 33,243, 41,165, 95,221,141,228,254,215, 95,127,213,
-216,118,182,160,155,176, 14,210,111, 3,160, 3,172, 37, 99, 45, 26,131,249, 98,230,217,226, 21,131, 59, 53, 91, 48,178,123,203,
- 55, 91, 4,251,182, 82,174,151,175, 7,112, 70, 50, 85, 81,231, 34, 53,134,234, 50,180,232, 56, 10,239,190,240, 16, 86, 43,174,
-191,139, 25,251,147,161,209, 26, 48, 46,110, 1,238, 25, 50, 11,143, 76, 30, 9, 95, 95, 31, 24, 45,102, 84,105,141,202,206,131,
- 58,214,209, 57, 46, 0, 70,224,161,233, 43,241,196,115,115,237,123,199,222, 35,133, 68,226,131, 95,118,255,129,109,251, 50,241,
-221,183, 95, 66,175, 51, 64, 44, 16, 34,192, 79, 12, 77,233, 37, 89,249, 37, 56, 93,125,140, 82, 10, 80,214,250, 97, 88, 80, 74,
- 97, 48,250, 88,213,147, 15, 64,141, 22, 88, 4,128, 5, 22, 88,140, 44,204,150,250, 13,216,220,172,247,105,235,166, 20, 65,129,
-254,136,104,221, 30, 93,123,117, 68, 96,128, 47, 42,170, 75, 80, 84, 82, 4,117,197, 85,152,244, 4,126,126,126,104,218,116, 8,
- 30,158,116,156,110,220,212,197,121, 24,127,237, 69,106, 9, 12,132, 78, 8,136, 37, 98,232,180, 98, 24,181, 98,232, 37, 62, 16,
- 18, 51, 40, 4,208,235,170,161,211, 86,161,117,235, 86, 74,177, 64,136, 50, 84, 98,197,138, 63,225,227, 83,127,231,248,240,187,
- 15, 93,118,160, 23,102,188, 80,239,113,181, 90, 77,107,109,199,132,133,133,229, 16, 66,244,148, 82, 97,104,104,168, 95,110,110,
-110,120,106,106,170, 42, 49, 49,177,149,183, 29, 89,220,188,249, 84,251,223, 0,164,161, 64,163, 69, 59, 82, 82, 83,233, 83, 79,
- 61, 37, 51, 21, 23,123, 36,243,183,125,251,228,177,177,177, 75,134,246,237, 11,147,143, 15,146,146,146,216,135, 71,142, 28, 77,
- 41, 77,247, 80,161,225,163, 55,223,180,111, 47,122,227, 13, 36,189,245, 86,189,219,174, 80,219, 8, 88,186, 52,149,198,196,196,
- 32, 61, 61,143,198,197, 69,245, 0,144,183,116,105,170,206, 67,242,207,236,213,163, 71, 16,247,206,248, 75,124,113,165,164, 24,
-149,234,114,244,139, 29,232,247,219,170,111,211, 31,152,253,127, 61, 96, 93,188,160, 62,152,159, 89,242,185,240,209,135,199, 11,
- 59, 69, 70,178,156,103,248, 70,210,103, 53, 78,122,107,209,211, 86,195,111,225,124,217,140, 9,163, 61,126,174, 94,145,191,221,
- 66, 14,243,224,228, 56,143, 68,251, 11, 9,254,126,107, 14, 72, 80, 19, 88,242,254,134, 33,239, 31,228,148,105,208,255,247, 98,
-183,126,159,172, 80,236,121, 78,254, 84,187, 25,143,207, 14, 73, 93,251, 35, 27, 25, 25,201,188,187,116, 25, 2,223,124, 23,191,
-252,242, 75,225,131, 15, 62,232,149, 33, 90, 7,241,143,222,180,105,211, 14,110,123,210,164, 73, 99,220,249, 93, 85, 85,149,116,
-199,142, 29, 74,147,201,132, 14, 29, 58, 96,216,176, 97, 8, 14, 14, 70,121,121, 57, 46, 95,190,140,243,231,207,227,242,229,203,
-116,204,152, 49,178,192,192, 64,149, 7,239,202,164,145, 35, 71,126,242,209, 71, 31,173,143,142,142,254,132, 51,118, 90,181,106,
-133,135, 31,126,152,196,199,199, 7, 0,200, 36,132,100,214,181,122,105,109,121,243,231,207, 79,123,234,169,167,152,195,135, 15,
-131, 16,130,240,240,112,251,231,247,223,127, 23, 15, 26, 52,232, 75, 66,200, 65,119,228,221,201,228,207,237,171,125, 29, 66, 39,
-228, 31,222,191,125,248,140,190,237,194,166, 19, 66, 68,148, 82, 19,107,253, 24, 45, 38,189, 78,204,176,173,122,181,144,188,208,
- 36,168, 67,199, 77,135,206,255,168, 95, 47,223, 35,153,170,184, 82,143,250, 70,247,110, 93,192, 48, 42,228,148,151, 2, 56,133,
-138,194,179, 16, 73,124,176,121,235,167,208, 94,179, 96,250,255, 61, 11,150, 5, 38,140, 31, 12,139, 48,192,229,197,229,228,156,
- 2,203, 2,227,250, 16, 0,173, 0,180,131,222, 96, 68,252,216, 49,144,132, 48,248,110,221,118, 48, 12,144,246,227,106, 20,230,
-253, 35,123, 80,218, 73,117,230,168,115, 89, 44, 5, 88,150, 5,203,178,176, 88, 44, 48,136, 40, 76,196, 4,163,209, 8,173,159,
- 30, 96, 37, 96,168, 5, 22, 49, 69,181, 81, 15, 77,101, 69,189,109,107, 26, 96,128, 80,232,139,240,240,112,116,236,216, 17,205,
- 91, 12, 4, 4, 12, 44,150,195, 96,104, 57,244, 26, 51, 44,172, 6, 69,151,203,208, 52,252, 26,194, 67,134, 64, 93,245,178,212,
-217, 34, 47,190,122, 51,168,225, 26,160,247,129,145, 49, 65, 35, 22,162,218, 87, 4,161, 72, 12,176,254, 32, 2,130,106,141, 22,
-234,162, 11,200, 61,188, 15,101, 5, 5, 96, 89, 22, 12, 21,120,213,105, 86,173,188,110, 56,207,158, 55,219,181,158,180,173,235,
-206,117,157,212,212,212,197,207, 61,247,220,220,130,130, 2,134, 16,210, 84,161, 80,252, 8,235,226, 78,126, 13,232,203,162, 47,
-190,248, 98,221,213,171, 87,145,150,150,134,254, 93,186, 8, 66,123,245,106,240, 11,242,254,139, 47, 18, 53, 32,165,148, 42, 63,
-255,252,115, 37, 0,200, 39, 79,118,219, 43, 49, 26,141,201, 67,109, 47,147, 88, 44, 70,231,206,157,177,113,247,238,157,182,104,
-128,219,114,110,214, 82,181,139, 23, 39,144,244,244, 60,122,248,176, 53, 98,229,240,239, 63, 35, 70,140, 40, 92,188, 56, 33,216,
- 93,206,242, 55,153, 55,246,234,209, 35, 72,192, 48,120,242,209,233,208,233, 13, 72,250,230, 27,248,249,250, 66,175,215, 67,175,
-211,161, 79,116,223, 78,127,172, 93,251,212,189,211,167,175,112, 21,117,124,107,209,211, 44, 0,230,108,126, 62, 83,155,240,107,
-191,158,222, 92,123,155,174,195,101,233,169, 47,209,209, 19,230,200,168, 79, 39,175, 12, 1,199, 85,251,232,134, 80,151,251, 93,
- 90, 80, 33, 66, 92,168,182, 32, 99,116, 83,136, 22, 40, 80, 57,189, 61,132,161,205, 60, 34,255, 93,187,118, 21, 69,182,108,117,
-249,241, 39,231,182,121,233,217, 23,241,249,183,201, 39, 99,251,245,139, 74,254, 44,217,111,225,139,207, 99,237,224,129, 88,183,
-110,221, 99,211,166, 77,251,174,129,196, 47,221,180,105,147,221, 97, 82, 40, 20,185,176, 46,235,190,203,157,223,239,216,177, 67,
-217,180,105, 83, 68, 71, 71,155, 25,134, 17, 90,163,179, 44, 68, 34, 17,194,194,194,208,162, 69, 11,156, 63,127, 30, 59,118,236,
- 80, 62,252,240,195,110,189, 43,132,144,132, 7, 30,120,224,227,143, 62,250,232,179, 46, 93,186,172, 36,132,176, 0,190, 4,112,
- 47,128, 63, 1,188, 69, 41,205, 39,132, 60, 15,224, 45,119,228,125, 52,127,254, 79, 67, 19, 18,200,150, 45, 91, 32, 20, 10,161,
- 84, 42,241,247,223,127,163, 99,199,142,120,231,157,119,208,179,103, 79,204,157, 59, 87,248,234,171,175,126,116, 55,146,127,226,
-226, 15,174, 59, 58, 75, 95,114,106, 4, 56,155, 5,192, 8, 5,140,208,204,210, 42,157,201,124,153, 16,226, 19,224, 35,232, 29,
- 36, 70,127,223, 30, 35, 58, 64,246, 4,208,117, 24, 90,250,211, 73,143, 13,105,255, 82, 88,144,223,104,253,122,121, 61,202,132,
-133, 64,192, 17, 82, 16,128,214, 8,142,120, 0, 58,139, 30, 43, 21,223,226,251,117,105, 24, 35, 27, 2, 0,208,106, 1,129,176,
-110, 81,190,126, 93, 0, 0, 22,139,227,218, 52, 69, 0, 50,193, 8,124, 48, 99,230, 28,196, 79,158,140,223,182, 90,137,204,207,
- 31,208, 84, 95,169,247,102,153, 32,176,147,191,201,108,129,161,210, 4,109,185, 22,229, 38, 35,202,180, 70,168, 13, 85, 40,175,
-170,134,186,184, 10,101,229,122,148, 85,215, 93, 66,253,111,229, 82, 74, 8,129, 64, 64, 64, 24, 31, 88, 44, 20,102,109, 1, 52,
-229,103, 81, 88, 84,129, 50,117, 53, 42,170, 44, 40, 83,235,113,233, 82, 17, 78,158,254, 11,229, 21,127, 97, 96,191,152, 58,215,
- 70, 23, 0, 96,170,244,208,157,187,140,210, 19,167, 80, 90,112, 1,149, 21,101,168,172, 40,195,133,147,135,177, 63,117, 21, 50,
- 55,124,135,146,115,231, 96, 49,178,214,194,216,130, 91, 51, 12,152,152,152, 72,108, 97,127, 99,124,124,124,183,119,223,125,247,
-185,150, 45, 91,106,210,210,210,122,167,166,166,254, 10, 32,218,246,208,189, 46, 56, 37,110,222,124, 17, 0, 12,234,217, 19, 79,
- 61,245, 84,241,161,211,167,211,143, 30, 63, 46,109,140,246,135, 2, 42,249,228,201,100,254,252,249, 50, 0, 16, 53,107,230,145,
- 92,147, 45,204,178,113,227, 70, 52,107,214, 12, 47,205,159,143, 69,139, 22,225,103,165,242,142, 24,135,229, 72, 95,161, 80,216,
- 63, 0,144,145,145, 17, 1, 96,188,155, 98, 6,132,132,134,118, 21, 48, 12,254, 47, 62, 30,229, 21,149,184,116,229, 50, 68, 34,
- 33,132, 66,235, 71, 36, 18,193,199,215, 15, 29, 34, 35,151,159,203, 62,236,214, 98, 62,103,243,243,241,195,198, 95,237, 31, 14,
-111, 36,125,134, 55,146, 62,195, 54,101,134, 23, 87, 92, 37, 5,128, 46,189,198,169,226, 38,204,145,237,220,242,141, 50, 61,245,
-165, 59,226, 89, 28, 91,179, 2,197, 79,244,195,136,157, 37,232, 30, 34,132, 32, 40, 12,102,117, 49,250,255, 94, 12,127,161,149,
- 3, 5, 46,230,100,157, 63,119,174, 52, 69,241, 85,151, 53, 95,173,193,167,223,124,121,225,203,143, 62,126,227,185,167,159, 25,
-255,238,146,119,225, 27,232,143, 97,131,134,224, 80,214,161, 53,123,246,237,241,250,154,107,147,255,150, 45, 91, 48, 96,192,128,
- 14, 0,166,187, 27,246, 55,153, 76,232,215,175, 31,107,177, 88,132, 21, 21, 21, 48, 24, 12, 48, 24, 12, 56,125,250, 52,148, 74,
- 37,246,237,219,135,150, 45, 91,194,100, 50, 33, 51, 51,211,101, 91, 9, 33, 83, 39, 79,158,188,226,161,135, 30, 10, 90,185,114,
-101, 16, 33, 68, 12, 32, 3, 64, 5,128,126, 0,126, 5,192, 25,158,187, 0,244,116, 37,111,211,115,207,253, 52,190, 79, 31,178,
- 54, 62, 30,133, 71,143,226,227,143, 63,102,127,251,237,183,183, 47, 94,188,216, 76,169, 84, 62,177,120,241, 98,152, 76, 38, 12,
- 25, 50, 4,254,254,254,131,113,151,195,209, 24,168, 65,246,181,119, 72,166, 42, 74, 14,156, 43, 73, 94,253,231,185,103, 79, 23,
- 86,236, 96, 64,133, 0, 5, 30,120, 7, 7, 98, 62,198,123,234,120,236,238,177, 12,184,247,101, 4,138,216,232,177,125, 35,167,
-219,134, 11,110,192,150,221,101, 4,168,196,196,153, 11,192,178, 0, 80, 6, 32, 16,128, 9,237,186,244,131,196, 71, 8,139,217,
- 0,106,180,146,106, 96, 96, 32, 74,203,212,117, 94,196,138,229,207, 17, 0, 56,121,224, 27, 48, 76, 77, 39,129,213,253, 3,189,
-193, 4,129, 72, 2, 34,182,142,161, 85, 85, 86, 98,240,224,250,159,157,144, 53,130,101, 89,152,205,102, 24, 12, 6, 84,179,102,
- 84, 24, 77,168,188, 82,137,138,203, 21,168, 44, 42, 67, 89,101, 57,138,244, 90, 84,106,202, 81,110,168, 59,215, 41, 48, 64, 3,
-179,153,133,193,104, 65,121, 69, 37,114,206, 21, 32,235,240, 49, 28,200, 58,134, 83,167,115,113,233,226, 53, 84,107,140,168,170,
- 54,224, 74, 97, 5,142,255,115, 30,153,153, 71,113,233, 74, 81,157, 50, 29, 77, 29,115,133, 6,151,254, 58,133, 19,191,239,198,
-206,111,151, 99,247,250,111,113, 41,247, 28, 88,106, 2, 75,136,157,248, 61, 25, 92,115, 21,230,119, 5,161, 80, 8, 0, 87, 1,
- 92, 13, 13, 13,189, 20, 24, 24,104, 88,188,120,241, 33, 88, 19,198, 24, 88, 23,151,202,241, 86,254, 23, 95,124,241,126,124,124,
- 60, 0,160,125,211,166,205,108, 99,226,130,198,124, 57,184,240, 63, 23, 9,112, 35,252, 31, 7, 0, 73, 73, 73, 56,123,229, 10,
- 30, 26, 51, 6, 92, 52,224,216,177, 99, 0,192, 25, 1,110, 61,138, 69,111,188,129,231,223,124,211, 30,222,231,190,115,219,220,
-119,119,194,255, 28,210,211,243,184,165,117,107,236,231,182,211,211,243,126,112, 71, 78,136, 80,248,158,222,104,128, 64, 32,192,
-233,188, 92,228, 93,186,136,131,127,253, 13,163,209, 4, 6, 4, 66,161, 16,132, 16,176, 22, 11,116, 26, 45,142,101,168,118,187,
- 33,150,113, 36,253, 71, 31, 30,127,131,199,127,240,200, 49, 56, 70, 8,220,131, 67, 56,217,167,147,138, 75,250, 75, 79,125,137,
-138,204,103,165,183, 85, 3,151, 93,129,184,109,103, 20, 63,117, 15,142,173, 89, 1, 97,147,150,246, 67,197, 79,221,131, 38, 18,
- 6, 65,194,250,187, 75,151, 78, 93, 90,249,249,249,251,125,250,245, 23,122,217,136, 17,226,129,131, 7,173, 61,127,238, 60,123,
-250, 92, 14,192, 82, 72,124,124, 48, 36,102, 8,182,110,217,138, 77,155, 54,121,100, 4,108,223,190, 93, 42,151,203, 41, 71,254,
- 59,118,236, 64,114,114,178, 17, 0,178,178,178,140,114,185,124,154, 59, 67, 11,249,249,249,176, 45, 77,204,228,231,231, 99,231,
-206,157, 56,118,236, 24, 52, 26, 13,212,106, 53,178,179,179, 81, 80, 80,128,139, 23, 47,162, 93,187,118,200,207,207,175, 87,158,
- 64, 32,152,241,200, 35,143,124, 40,149, 74, 3, 14, 29, 58, 20,164,213,106, 31,247,245,245, 85, 1,248,140, 82,250, 50,165,180,
-194,102, 0, 12, 32,132,136, 41,165, 38,212, 51,189, 93, 44, 22,207,248,101,209,162,181, 67,154, 53, 35,230, 23, 95,196, 96,163,
- 17,135,182,108,161,133,133,133,115, 40,165,111, 80, 74, 75, 0,172, 62,121,242,164,217,108, 54, 35, 32, 32, 0, 17, 17, 17, 1,
- 38,147, 9,255, 70, 56, 27, 2,104, 14,160,195,164,254,109,159,108, 19,238, 63, 29, 38, 29,208,101, 52,142, 52,157,132,145,243,
- 87, 65,119,173, 28,130,160, 64, 40, 63,153,129, 97,221, 15, 32,236,216,206,225, 0,218,214,245, 7, 58, 6,181,198,137, 99, 63,
- 59,216, 27, 26, 88,135, 9, 77,128,201, 0, 33, 43, 0, 99,123,239, 55,253, 98, 29,110, 26,114,223,228,186, 59,234,113,138,177,
-209,142, 6, 30,177, 93,134, 8, 16, 73, 96, 38, 22,216,252, 96, 76,153,254, 12, 0, 40, 47,236, 79,169,243,205,178,176, 20,102,
-150, 1, 99, 54,131, 49, 26,160,181, 89, 22, 58,129, 0,254,102, 29, 42,117, 20, 68, 68, 96,177, 88,160,181, 0,197, 26, 35,234,
- 26,204, 54, 27, 89,232, 69, 2,176, 90, 51,204,108, 5,170,170, 77, 16, 16, 17, 12,102, 19,140,212, 8,179,201, 8,136, 89, 48,
- 4, 32, 62, 44, 42,116, 22, 20,149,104,161, 49,152,157, 58,201, 12,177,216, 13, 0, 66,174,243,137, 73,175, 67, 69, 89, 25, 24,
- 34,128, 80, 72, 1, 42,132,128,120, 63,240,119,230,194, 25, 99,151,118, 93,196,238,132,253,107, 89,210,240,245,245, 5, 0, 29,
- 0,163, 80, 40, 68, 94, 94, 30,150, 46, 93, 58, 30,192,197,197,139, 23, 71, 7, 7, 7,135, 84, 84, 84, 92, 40, 47, 47,247, 56,
-220, 45,110,222,124, 54, 0,180,104,209,194,190,111,254,252,249,229,159,125,246, 89, 58,128,184,232, 94,189,118, 53,214,139, 48,
-127,254,124,153, 59, 6,192,111,251,246, 73, 99, 99, 99, 35,134,246,237, 11, 18, 24,136,165, 75,151,226,197, 23, 95,132, 72, 36,
-130, 73,173, 70,112,112, 48, 94,154, 63,223,158, 23,224, 78,114, 96,237, 49,126, 87, 57, 1,117, 97,169, 7,201,157,135, 15, 31,
-198,225,195,135,237,231,215, 53,198,169, 46, 43,235, 26, 16, 24,136,107,106, 53,148, 7, 15, 66,200, 8, 96, 48,153,160,213,233,
-192,178,172, 61, 89,209,108, 50,194,104, 48,184,243,140, 89, 0,140,109, 24,128,117,232,248,122,219,126,188,145,244,153, 24, 0,
- 58, 69, 70, 22,159, 63,121,162, 65,207, 53, 46,225, 3,114,250, 72,154,244,247, 77,223, 40, 27, 99, 22,128, 39, 97,255, 26, 97,
-217, 13, 95,161,239,204,103,225,211,190,183, 85, 87, 92,187,130,156, 50,141,213, 86, 25,252, 0, 10, 44,102,248,125,126,176, 94,
- 25,149,149,149, 33, 62,190, 18,116,108,223, 94,114,254,210,197,150,165, 37,165,152,242,232,116,229,182, 93, 59,241,201, 7, 73,
-105,155,182,109,137,239,212,190, 19,102, 60,252, 24, 50,143,236,195,166,141, 27,233, 36, 55, 66,236,142, 94,255,142, 29, 59, 48,
-122,244,104,206, 88, 20, 95,190,124, 25,115,231,206, 21,115,151,239, 74, 86,105,105, 41,134, 13, 27, 6,139,197,130,252,252,124,
-236,219,183, 15,221,187,119, 71,112,112, 48,218,180,105,131,190,125,251,130, 97, 24, 48, 12,131,150, 45, 91,218,163, 84,117,232,
-151,238,189,123,247, 94, 49,120,240, 96,193,177, 99,199,130, 44, 22, 75,209,198,141, 27, 43,117, 58,221, 82, 74,169,163, 1,251,
-228,125,247,221, 87,176,109,219,182,246,132,144, 43,168, 99, 69, 91, 66, 72,244,124,153,108,245, 64,161,144,148, 44, 89, 2,106,
- 50, 65, 41, 16,176,153, 90,237, 44, 74,233,247, 14,167,206,123,237,181,215,132, 12,195,160,172,172, 12,121,121,121,197, 61,123,
-246,108,246,175, 55, 0,244,235,229,157,154, 7,251, 14,189,175, 79,196,220, 32, 95, 81,172,217,194,170,133,212, 18,132,144,150,
-130, 43,229,122,232,174, 85, 0, 98, 33, 44,229, 85,184,164, 54, 2,225,109,193,176, 70, 73,125, 33,222,115,149,149,232, 28, 18,
- 4,179, 1, 56,167,250, 1, 29,165,247,218, 29, 56,147,209, 4, 17, 24, 84,235,173, 43,212,142,149,246,131,111,120, 68,189, 13,
- 30,219,139, 96,219,223, 20, 34, 9, 32,110,123, 47,140, 5,123,236,142,131, 72,236, 3, 19,244, 8,240,181,174, 72,186,101,219,
-122,156,200, 82,201,166,143,137,169, 91, 27,177, 44,196, 70, 29, 76, 16,131, 97,204,128,222,170,216, 76, 38, 19, 12,122, 17, 4,
- 66, 17,160, 7, 40,107, 29, 34,104, 23,217,190, 78, 89, 90, 61, 11,129,128,192,100, 54, 65,111, 96, 81, 89,101,237,135, 38,150,
-194,104, 96, 1, 33, 32, 16, 9, 32,148, 0, 68,103, 1, 75,204, 96,161, 67,149,206, 22,144,118, 1, 11, 0,134, 5, 40, 1, 24,
-134, 5, 33, 2,176,148,128, 97,108,185, 84, 44, 3,150, 97, 64, 88,247, 28,100, 7,239, 95,236,109, 7,242,243,243,131,205,219,
-111,154,151,151, 87,188,116,233, 82, 25,128, 7, 23, 47, 94, 60, 38, 42, 42, 74, 83, 85, 85, 85,106, 54,155,237, 68,225, 9,255,
-127,241,197, 23,223,196,199,199, 35,178, 73, 19,251,206,200, 38, 77, 66,108, 81,128,166,183,227,133, 49, 26,141, 74,206,219,167,
- 85, 85,248,223,255,254, 7, 67,105,169, 61,243,173,163,205, 88, 17, 25, 12, 24, 63,126,124,113, 97,113,241,180, 8, 63,191,181,
-183,162,109,142, 73,125,142,227,255,206, 16, 19, 19,131,184,184, 40,251,249,206,234, 0, 0,128,217, 96, 68,185,177, 12,122,189,
- 30, 33,193,193,144,136,125, 96,178,152, 65, 41,133,197, 98,129,209,104,132,201,100, 2,107,182,184,251,124,217,179,249,249, 76,
-167,200, 72,206, 35, 96,207,230,231, 51, 63,108,252, 85,226, 24, 17,232, 20, 25, 89,142, 70, 74,102,235,218, 47, 94,117, 41, 55,
-187, 81,238,177,183, 57, 0, 35,118,150,160, 56, 50, 13,226,182,157, 65,218,247, 70,187,111,143,226,154,158,133,191,144,192,184,
-247, 23,156,201, 59,239,114,253, 60,157,217,136,195,153, 89, 88,241,209,114,220, 35, 29,138,215,222,126, 19,127,252,254, 7,214,
-126,247, 61, 6, 15, 31, 26,223, 38,178, 45,132,126, 34,236,218,179, 11,235,214,124,143,159,127,217,136,173, 91,183,210,251,239,
-191,191, 78,201,114,185,156,214, 38,126, 14,229,229,229,158, 15,194, 84, 85, 33, 56, 56,248, 32,128,129,145,145,145,136,137,137,
-129, 64, 96, 29,102,109,215,174, 29,124,124,124, 80, 81, 81,129,200,200, 72, 4, 6, 6, 94,168,170,170,106, 87,167,177, 69,233,
- 73, 66,200,251, 63,255,252,243,184, 78,157, 58,117,221,184,113, 99,181, 90,173,126,139, 82,186,206,129,212, 39,141, 24, 49,226,
-185,111,191,253,118, 3,128, 98, 0, 9, 0, 14, 0,232,227, 68,222, 81, 66,200,251, 33,217,217,175, 60, 98, 54, 99, 57,192,126,
- 83, 93,253, 88, 45,121, 15, 62,243,204, 51,203, 19, 19, 19,113,254,252,121,108,221,186, 21,102,179,121, 55,128, 71,238, 22, 82,
-239,219,183, 47,254,250,235, 47,251,184,127,189,161,184, 90,219, 81,147,250,183,125, 55,200, 87, 20, 91, 82,169,255, 99,255,217,
-146,165, 16,248, 0,103,246, 96, 84, 36,197,203, 79,143, 71, 76,143, 72, 60, 35,191, 15, 19, 58, 24,129,227, 59, 64, 69,190,102,
-212,155,172, 83,142,156,242, 2, 8,125,128,177, 19,158,197,186, 79, 63, 0, 96, 4,180, 6, 88,116,192, 47,202,191,144,126,200,
- 58,163,176,117,219,246, 96,132,174,201,107, 92, 31, 2,147, 30,216,178,117, 59,250,143,121,218,234,253, 67, 4,129, 47, 48,249,
-129, 4,140, 27, 62, 17, 0,112,233, 66, 46,204,122, 99,253, 22, 61,165, 48, 19, 43,193, 27,140,214,228, 63,131, 94, 7,173, 86,
-139,234,234,106, 84, 85, 86,160,170,170, 10,149, 85,213,208, 87, 87, 67,167,211,213,221,249,171, 9,116,122, 11,116,122, 11, 52,
- 90, 19,170,170, 13, 80, 87, 25, 80, 94,105, 68, 69,149, 9,229,229,214,127,203, 74,205, 40, 83,155, 81, 86, 97,198,181, 50, 35,
-174, 94,171,187,141, 12,165,176, 0, 32, 22, 2,194,176,160,132, 2,148,130, 82, 1, 44,236,245,199,199,218,180,135,167,177,241,
-110,131,187, 97,223,182,125,248, 99,247, 31,118,163,224,204,133, 51,110,253, 86, 32, 16, 64,104,125, 94, 17, 0, 58, 44, 91,182,
-236,111, 0,159,191,244,210, 75, 11,163,162,162,204,214,247,201,218, 48, 15,201,159,136,155, 55,223, 4, 0,205,155, 55,191,225,
-224, 83, 79, 61,101,206, 62,115,102,125, 99,229, 2,112,225,127,119,215,141, 55, 57, 76,177,248,233,167,159,112,174,200, 58,132,
-243,155, 74, 85,227,216,153, 51,103,154, 53,109,218, 84,125, 59,148, 64, 92, 92, 20, 99, 83,240,181, 21,126,141,227, 46, 13,188,
-160,192,211,172,197,130,202, 50, 53,174, 93,187,134,210,114, 53, 52, 90, 45, 52, 90, 45,170,170,171,161,169,168, 68, 85,121, 57,
-244, 58, 45,140,122, 61, 88,179,197,165,206,233, 20, 25,201,233, 12, 22,128,209,113, 56, 0, 0,126,216,248, 43,222, 72,250, 44,
- 4, 64,115, 79,175,251,212,145, 52,105,237,113,255,220,127,126,151,222,110,165,124,101, 74, 36,218,125,123, 20,164,125,111, 24,
- 50,210,112,225,255,162,225, 47, 36,216, 51,186, 41,204, 21, 37,232,191,189, 24, 46, 70, 0, 16, 31, 31, 79,158, 88, 48, 15,231,
-206,156, 65,166,106, 15,130, 3,131, 49,117,202, 84,132,132,135,225, 72, 86, 54, 2,196, 18,248,251,251,163,101,100, 43,172,255,
-113, 61, 94,122,245, 21, 84,123, 65,226, 28,250,245,235,231,241,111, 2, 3, 3, 81, 81, 81, 49,144, 97, 24, 99,155, 54,109, 16,
- 27, 27,139, 30, 61,122,160, 73,147, 38,144, 72, 36,136,140,140, 68,159, 62,125, 16, 18, 18,130,170,170,170,118,129,129,129,174,
-244,243,135, 25, 25, 25, 59,191,251,238, 59,145, 90,173,126,173, 22, 89, 39, 12, 27, 54,108,197,183,223,126,187,170,121,243,230,
- 75, 8, 33, 1, 0, 94, 2,240, 70, 61,242, 94,125,183,170,234,195, 57,102,179,229, 27,157,110, 90, 45,121,241,143,200, 95,255,
-249,233,133,139, 4,103,206,156,193,193,131, 7,241,237,183,223, 86, 3,120,249,110,243,236,107, 71,244,234,138,240,213,246,220,
-125, 4, 12, 9, 44, 40,213,172,253, 37,187, 32, 9, 64,200,128,168,240,115,190,215,206,119,145,252,252, 36,150,140,124, 6, 75,
- 70,199, 2,213, 23,129, 95,222, 2,202, 46,161, 26,126,199,109,150, 87, 29, 8, 0, 87, 35,228,239, 99,191,162, 79,223,241,120,
-253,181,239,176,249,231,143,177, 67,121, 10,178,193, 61, 32, 20,250, 96,231,158, 35,160, 2, 33,140, 22,139,219, 23, 57, 54,186,
- 43,182, 31, 62, 13, 36,125,128,248,241,227,240,192, 3,227,241,199,238, 77, 48,155,244,184,255,222,169, 96, 44, 38,248,136,234,
-215,115,148,181,192, 98,157,237, 8,161,217, 2, 19, 21,218,115, 2, 24,198, 90, 31,128, 33,214, 72, 1, 23, 49,168, 51,252,165,
- 11, 4, 35, 80, 67,236,195, 88, 61, 94, 11,133,133, 37, 96, 41, 11,147,137,194,104, 0, 24, 9, 5, 17, 16, 16, 1,129,133, 33,
- 48, 88, 40,202, 53,212, 69,168,189,230,112, 50,119,182, 80, 64,193, 16, 6, 44, 21,212,240, 30, 40,113, 77,182, 47,204,120, 1,
-221, 6,119,179,111,167,175, 78, 71,250,106,235, 12,182,125,219,246, 1,227,112, 30, 64,123,151,238, 28,107,253, 91,105,105,105,
-123,109, 74, 42,182,125,251,246, 77, 1, 84,179, 44,235, 99, 50,153,252,204,102,179,153, 82, 90,233, 44, 20, 92, 71,232,255,141,
- 47,190,248, 98, 92,124,124, 60,218, 55,109,234,214,208, 85, 67,192, 37,255,245,239,218,213,101, 2, 91,167, 22, 45,100, 73, 73,
- 73,202,241,227,199, 87,158, 57,115, 38, 40, 39, 39, 7, 15,198, 89,167,130,117,233,210, 5, 73, 73, 73, 24, 63,126,188,241,204,
-153, 51,226, 11, 23, 46,128, 86, 86,234,122,117,235, 86,175,204, 69,111,188, 81, 35, 66,242,252,155,111,214, 48,152, 60, 25,251,
-119,236,218, 35, 70,140,120, 50, 35, 35,227, 75,185, 92, 14,133, 66, 97, 39,255,152,152, 24,183,194,185, 0,112,246,116,110,118,
-211, 38, 33,247, 24,141, 6,232,175,106, 33,150, 72, 32, 20, 10,237, 17, 0, 93,117, 53, 12, 26,141, 53,127,166,188, 28,209,113,
-113,174,238,161,153, 11,241,191,181,232,233, 50, 0,146,129,253,122,227,224,145, 99, 53, 78,114,200, 11,112, 27, 39,143,164, 73,
- 47,231,102, 43,251,196, 94,111,195,249,115,251,165,229, 37,121,202,134,244, 15,206,235,247, 54,252, 15, 0, 57,101, 26, 20, 60,
- 62, 0,244,252, 49, 52,251,234, 8, 52,102,138,202,233,237, 17,188,238, 60, 42,255, 47, 28, 66, 2, 48,110, 24,160, 79,205,159,
- 79,254,247,193,187,180, 89,120, 19,152, 88, 11,206, 94,204,195,244,169,211,240,221, 15, 63, 96,243, 47, 91, 48,109,250, 52, 24,
-244, 6,236,201,222, 15,157,174, 26,137,179,102,101,236,170, 39,209, 78,161, 80,144,237,219,183, 75,199,140, 25,163,116, 22, 9,
- 40, 45, 45,197, 11, 47,188,128, 15, 63,252,208,173,235, 12, 15, 15,199,229,203,151, 17, 26, 26, 42, 76, 78, 78,198,128, 1, 3,
- 16, 29, 29, 13,177, 88, 12,134, 97,112,224,192, 1, 12, 26, 52, 8, 0,112,249,242,101,132,135,135,187,238,200,148, 46, 33,132,
-252, 66, 41, 61,233, 64,214, 83,135, 13, 27,182,244,241,199, 31, 15, 73, 78, 78,150, 44, 91,182,140, 1,176, 9,192,243,148,210,
-171,209,209,209,245,201,123,145, 16,178,142, 82,250,151,163,188, 71, 22,255,188,246,225,113, 67,200,184,121, 43, 32,159,208, 13,
- 95,127,150,196, 86, 86, 86,206,166,148,230,215, 39,239,110, 49, 2,220, 81,164,185,235,247,159,159, 95,166, 49, 28,134, 53,113,
-171,101,230,217,146,148,225, 93,155,191, 42, 60,127, 48, 12,223, 62, 6,248,248, 3, 6, 13, 64, 41, 76, 2,201,213, 61,255, 92,
-249, 6, 64,157,213,151,214,173,253, 82, 54,109,250, 12, 37, 0,104, 88, 19,206,149, 23, 0,176,160, 99, 80,123,200,100,189,209,
-188, 73, 11,148, 86, 88,185,161,220,104,198,149,114, 13,234, 83,151,173,219, 14,198,165,130, 76,219, 83, 19, 98,108, 31,107, 14,
-192,246,227, 38,252,241, 91, 26,174, 94,187,140,240, 16,235, 76,130, 16,177, 8,189,251,215,127, 19,140, 16, 66,204,154, 97,129,
- 0, 44, 33, 96, 44, 44, 96, 50,195, 34, 18,218,201, 31,176, 78, 23, 4,173,127, 86,210,131,143,188, 68,126,249,254,121,234, 39,
-166, 16,138, 28, 34, 12, 38,192, 76, 1,189, 17,176, 24, 44, 32,132,128,136, 9,204, 22, 64, 99, 0,230,204, 90, 70,156,149,194,
-180, 56, 48, 36,203,176, 32,182,240,191,173,195,194,194, 50, 96, 4,182,153, 2, 0,168,128, 2,212,189, 40,128, 35,249, 59,219,
-222,183,109,159, 75,242,183, 88, 44, 48, 24, 12,136,143,143,239,145,150,150,182, 28, 64,223,180,180,180,237,105,105,105,123,226,
-227,227,231,119,232,208,193, 68, 8, 9,255,228,147, 79,118,188,244,210, 75,211,203,202,202, 50,234,137, 62,217,251,228,243,207,
- 63,255,198,243,207, 63,143,237,219,183, 67,115,245,234, 13, 39,180,111,218, 20,231,207,159, 7, 0,165, 59,133,129,234, 42,250,
- 35,106,214, 76,250,197, 23, 95, 40, 41,165,232,223,165,139,172, 95,175, 94, 42, 87,178,122,117,235,166, 34, 12,115,239,233, 67,
-135, 34, 1,248, 0,248,212,228,227, 3,145,193,128, 78, 45, 91,226,185,231,158,195,190,125,251,150,118,238,220, 57,163,103, 68,
-132,203, 28, 5,103,117, 0,188,205, 1,112, 4, 87, 7, 96,208,160,132, 67, 7, 14, 20,239,147,203,229, 98,219, 48,193, 61, 0,
- 50,221, 45, 2, 20,217,167,251, 43,186, 43, 69, 99, 88,179,165,171,166,162, 2, 21,215, 74, 64, 8, 3, 74, 89,232,245,122, 80,
- 74, 65, 41,197,249,147,167, 96, 50, 26,208,177,127,140,202, 3,157, 19, 2,128, 25, 39, 27,193,142,147,141,168,145,244,103, 27,
- 34,112, 27,167,255,250, 89,122, 57, 55, 91, 9, 0,145,237,218, 97,115,173, 40, 64,211,182,253,100,183, 83, 25,247,255,189, 24,
-217,247, 1,125, 99,226, 80,252,212, 61,104,241,229,126,228,148,105, 16, 42, 38, 40, 45, 83, 67, 72,136,203, 8, 0,135, 25, 51,
-102,212, 56,243,215, 95,127,165,227,238,191, 15,191,109,249, 13, 27, 54,108,192,155,175,254, 15, 59, 84,187, 32, 16, 10, 16,209,
- 58, 98, 68, 69, 69,253, 83,151,199,142, 29,171, 26, 59,118,172, 83, 67, 96,231,206,157, 56,119,238,156, 94,161, 80,180,116,167,
-109,145,145,145,200,203,203, 67,247,238,221,205, 11, 23, 46, 20,255,248,227,143, 8, 14, 14,198,233,211,167,111,136,188,230,229,
-229, 33,210,205,231, 92,139,252, 31, 27, 48, 96,192,219, 83,167, 78, 13,206,206,206, 14,212,235,245,255,231,235,235,251,128, 78,
-167,251,136, 82,186,217, 77,121,142,228,255,216, 3, 79,255,184,102,232,168, 73,100, 89, 58, 64, 90, 77,192,146, 21,175,208,178,
-179,167,103, 83, 74, 83,241, 47, 70, 13, 3, 64, 50, 85,241, 79,217,122,121,142,100,170,130, 27,210, 44, 56,177, 94,254,123,149,
-222,172, 25,216,177,201,184, 48, 63,193, 0,129, 65,239,111,166, 76, 85,105,149,241, 64,230,185,162, 63, 10,203,180, 25,146,169,
-138, 43, 88,185,210,233, 31,168,214, 52, 85,205,125,106,158, 12,128,146, 21,112,195,124, 2,156,171,188,130,215,231,207,134, 86,
-107, 64,165,206,154, 3, 96,100,124, 48,114,108,253,101,118,255,247,234, 44,178,125,107,127,235,203,109,225, 66,231,102,140,237,
- 69,240,200,147, 31,195,207,207, 7, 65,190, 18, 25, 0,229,217, 19, 71,100,131,123,214, 95, 16, 68, 72,205, 48, 18,171, 17, 0,
- 66, 96,161,212,106, 8,152,109,211,253, 8, 3, 33,203,194,204, 77, 59,112, 97, 4,148,235, 66,160, 51,148, 66, 44,100,236,101,
-206,204, 44, 96, 50, 81,152,204, 20,213, 58,214,234,253,131,192,196, 94, 15,221, 59, 37, 88,150, 1, 67, 44, 32, 22, 2,202, 80,
-123,248,159,212, 49,226,194, 73,122,230, 89, 25, 89,185,242,116,189, 30,222,169,204, 83, 13,237, 59, 70, 74, 41,116, 58, 29,122,
-245,234,117, 37, 42, 42,106, 82,126,126,126,167, 13, 27, 54,100, 1,152,152,150,150, 54,209,241,228, 15, 62,248, 64,245,210, 75,
- 47,201,202,202,202, 92, 17,132,253,134,204,157, 59,183,206,147, 30,158, 57, 19,128,103,133,129,184,170,123,181, 17,219,173,155,
- 44,218, 13,242,231,208,179, 75,151, 29,142,145,140,164,164,164,207,199,143, 31,111, 62,115,230,140,240,194,133, 11,136, 12, 15,
-207,140,240,243,219,229,166, 34,106,244,151,186, 22,185, 95,205,200,200,112,204,241, 56,110, 51, 4,220,173, 24,168,241,109,217,
-226,225,211,187,118,103,134,248,251, 7, 85,170,203, 97, 54,155, 65,109,239,129,250,106, 49, 42,213,106, 80, 74,221,241,254,173,
- 47,235,245,156, 19,198, 54, 29,144, 25,216,175, 55,198,201, 70,216,163, 66,103,243,243,221, 55, 2,180,127, 75, 47,157,205,178,
-123,249,155, 83,191, 81, 2, 64,211,168, 33,178, 62, 49,227, 85,183, 79,189,210, 27,141, 0,124,133,190,115, 95, 71, 17,203,162,
-207,234, 44,100,141,109,142, 30,191, 93,133,144, 0,129, 34,239,214,102, 27, 63,126, 60,217,173,218, 77, 71,142, 30,133, 45, 27,
-127,193, 59, 75, 63,192,226,138, 10, 80,150,197, 79, 63,109, 68, 97, 97,225, 3, 0,126,115, 25, 81,117, 98, 8, 0,192,164, 73,
-147,254, 2, 80,229, 78, 91, 6, 15, 30, 76, 46, 95,190, 76,143, 28, 57, 34,238,215,175, 31, 70,141, 26, 5,165, 82,137,182,109,
-219,194, 96, 48, 96,196,136, 17,160,148,178, 71,142, 28, 97, 68, 34,145,199, 21, 1, 9, 33,221,131,131,131,151, 79,153, 50, 69,
-116,242,228,201, 32,131,193, 80, 87, 98,160,187,242,162, 35,250, 78, 94,211,119,248, 20,242, 77, 6, 80,169, 3,140,231,183,179,
-101,103,149,181, 19, 3,239, 26,112,117, 0, 28, 35, 0,206,246, 57, 13,165, 58,144, 63,183,125,234,194,122,121,193,133,107,213,
-153, 0, 90,218, 94, 94, 3,128, 66, 0,121,146,169, 10,157,203,177,164, 62, 19, 84,255, 28, 43,144, 89,104,128,210,241,229,168,
-214, 84, 90,231,253, 51,126,120,241, 35,247, 75, 76,142,189,191, 39,121,119,222, 3, 82, 48, 90,165, 35, 23, 6, 4, 4,195, 98,
- 82, 3, 84,131, 11,251, 83,200,140, 71,198,186,148,101,130, 0,160,212, 74,212, 16, 64, 76,109,134,128,141,252,173, 53, 0, 1,
-184, 57, 52, 49, 43,241, 53,146,242,217,155,212,108, 42,131,208, 54,177,151, 82, 10,139,153, 66,111, 2, 42,171,204, 48,129,194,
- 76, 25, 8, 69, 4,239,189,253,121,157,215,253,248,227,214, 36,173, 53,171,207, 81, 98,178,122,255, 20, 0,165, 4,160, 54,143,
-129, 10, 64, 4, 44, 88, 86,136, 69,207,143,113,235, 30, 62,254,206,227,178,252,220,252,250, 8, 88, 4,235, 84,141,250,216,137,
- 5, 0,131,193, 0,181, 90,173, 14, 14, 14, 70, 76, 76,204,223,177,177,177, 62, 37, 37, 37,200,205,205,181, 78, 15, 99, 89,233,
-198,141, 27,149, 54, 35, 64,233,134, 17, 96, 74, 24, 59, 54, 33,178, 87, 47,203,128,174, 93, 53,182, 62,106, 64,205, 25,145, 72,
- 24,107,125,182,145,110, 20, 5,122,225,133, 23,100, 0,208,191, 75,151, 27,142,197,244,233,211, 32,130,232,213,173,219,151, 12,
-195, 88, 78, 31, 58,228,223,188,121,243,107, 61,239,185,103,205,237,124,249,157,144,186, 38, 38, 38,198, 49,219,218, 62,143,213,
- 3, 35,224,100,244,168,145, 3,183,124,253,205,198,168,246,145,221, 13, 6, 61, 44, 38, 51, 88,150, 69, 96,104, 40, 42,202,202,
- 16, 29, 23, 39,115,195,251, 7,128,242,183, 22, 61,221, 12,128,241,108,126,190,152, 27,255, 63,120,228, 24,198,201, 70,176,111,
- 36,125,230,170, 56,144, 29,157, 91,170,233,233, 51,167,101,187,255,216, 92, 35,196, 63,242,222,137, 50, 38,104,112,131,158,107,
- 93,225,126,231,251,221,231,176,254,191, 23, 3,191,207,183,111,119,220,124,125, 10,112,133,201,226,117,123, 71, 74, 71,146,239,
- 10,190,187,111,204,253, 99,183, 61,241,216,156,189,189,251,244, 26,186,101,243,175,200,252,235, 48, 18, 19, 19,183,174,172,195,
- 65,115, 97, 8,204,217,180,105,211,215,155, 54,109, 26, 52,118,236, 88,183, 27, 55,102,204,152,145, 59,118,236,216,253,219,111,
-191, 33, 42, 42, 10,163, 71,143, 70,112,112,112, 78, 69, 69, 69,231,127,254,249, 7,121,121,121,140, 72, 36,194,152, 49, 99,226,
- 60,126, 46,214,196,192,165,191,254,250,107,157,137,129, 30,202, 59, 74, 8,121,255,151,180, 9,175,232, 34,166, 67,119,232, 53,
-246,242,158,247, 30,243, 86,222,157,104, 8,120, 50, 4,224, 20,146,169, 10, 13,128, 99,182,143, 87,120,236,177,249,170,185,115,
- 95,146, 37, 43,222, 81, 70,180,235, 4,192, 0,145,143, 4,151,174, 84, 98,196,248, 25,196,115,121, 19, 84, 29,187,118,198,234,
- 85, 63, 3,236, 5, 0, 66,152,245, 58, 68,180, 12,150,181, 13, 50,187,255,242, 91, 88, 8, 25, 22, 38, 34,132,136,154,175, 27,
- 2, 48, 3,212, 2,119, 19,195, 28,145,248,244,155, 4, 0,222,120,121, 30, 21, 9,173,222,190,153,181,134,204,203,171, 40, 44,
-102, 64, 32,100,241,229, 23,238, 25, 61, 51,103, 89, 75, 35,175,250,230, 12, 5, 87, 19,158, 1, 88, 98, 13,247, 63,247,252, 3,
- 30, 53,178,162,186, 66, 21,218, 60,180,161,253,139, 1,172, 57, 17, 58,157, 14, 22,139, 5,149,149,149, 16, 8, 4,176, 88, 44,
-104,209,162, 5, 76, 38, 19, 20, 10,133,178, 86, 36, 64,233,106,205,128,232, 94,189,210, 0,160, 49, 42,254, 1, 64, 24, 33, 42,
- 0, 8,235,211,231,166,184,121, 61,186,116, 73,110,136,128,198,204, 1,112, 66,230,154,250,102, 3,120, 80, 14,248,244,132,199,
-231,244, 4, 32, 56,157,145, 97,210,107,117, 96, 45, 22,116,139,137,145,181,236,220, 29,145,125,186,187,247,206, 81, 50,229,143,
-223,183,218, 55,239,233, 30,101,255,254,199,239, 91,111,216,174, 47, 53, 62,231, 74, 40, 97,130, 6, 99,212,189, 68,118,242,116,
- 46,174, 92, 56,174, 4,128,221,127,108, 86, 54,111,155, 43,235, 53,240, 81,143,141,128,201,147, 39,195,211,242,190, 22, 82,127,
-221,237,130, 73, 45,240,251,101,253, 77, 87,248, 51,102,204,248, 29, 0,147,157,157,205,238, 58,144,129,240, 38,225,104,200,250,
- 28, 99,199,142,253,102,236,216,177,223,193,117,121,231, 26, 8, 12, 12, 84, 62,252,240,195, 36, 51, 51,147,230,230,230, 34, 43,
- 43, 11, 85, 85, 85,157, 27, 99, 45, 0, 27,105,127, 72, 8, 17,101,102,102,246, 50, 26,141,175, 81, 74,127,106,208, 11, 76,233,
-171,132, 16, 81,112,135,239,158,171,200,221, 49,189,161,242,110, 55,184, 89, 0,206,246,123,101, 0,120, 58,148, 80,103,168,234,
-161,153,170,173,127,156, 35, 15,222,239, 71,155, 69,180, 65, 89,149, 25, 35,238,127,204,235,142, 48,120, 64, 87, 50,120,192, 43,
-144,203, 95,167,192, 85,132, 6, 10,209, 54,140,245,232,165,239,255,127,207,223,180, 5,108,222,122,127, 37, 1,128, 5, 11,231,
- 83,163,206, 4, 22,214,105,115,203,191, 88,238,213,223,156, 61,199,186,102,192,170,175, 79, 83,150, 10,240,242, 75, 19,111,231,
-234,102, 98,199, 48,182,193, 96,128,209,104,180, 19, 25, 71, 96,252, 42,129,245,195,147,242,195, 94,194,184,120,113,130,143, 45,
-130, 98,105,160, 44, 10,192,220,117,196,136, 26,109,142,108,217,194,109, 1, 62,172, 65, 53,115,188,199,142, 31,106, 47, 5, 92,
-195,255, 14, 26,164,234, 17, 59, 8, 61, 98,209,224,123,233,106, 97,159,218, 54,176,153,248, 64,199,212, 63, 35, 53,183,202,140,
-206,129,238,168,200, 70,233, 10,180,127,255,254,141,217,167,188,174,128, 51,120,240, 96,226,170, 16, 91, 3, 72,251,134,196,192,
- 6,202,187, 33, 49,240,110, 55, 2,220, 1,233,219,183, 47, 5, 15, 30, 13, 68,167, 78,157,112,246,236, 89,254, 70,240,224,193,
-131,199, 93, 2,134,191, 5, 60, 26, 3, 60,249,243,224,193,131, 7,111, 0,240,224,193,131, 7, 15, 30, 60,120, 3,128, 7, 15,
- 30, 60,120,240,224,193, 27, 0, 60,120,240,224,193,131, 7,143,219,142, 26,169,169,243,230,205,243, 58,123,212, 89, 37, 59, 94,
- 30, 47,143,151,119,103,200,147,203,229, 84,161,168,123,218, 41,127,255,120,121,119,154,188,163, 71,143,122, 45, 47, 58, 58,250,
- 63, 47,207, 99, 3,128, 83, 20,158, 10,169, 79,177, 52,182, 60, 30,119, 38, 92, 17, 12,143, 59,243, 57,120,120,190, 63,128, 1,
-123,247,238,125, 79, 32, 16,220,227,227,227, 3,173, 86,187,127,232,208,161,175, 2,200, 2,160,189, 19,238, 65,122,122,186, 52,
- 53, 53, 85,249,111,212, 43, 39, 78,156, 64, 86, 86,150,203,243, 14, 28, 56, 64, 79,156, 56,129,148,148, 20,210,179,103,207, 6,
-203,227, 16, 27, 27,139,250,228,241,184,139, 35, 0, 28, 60, 41, 79,234, 78,161, 28,103,242,234, 90, 30,214,155,194, 59,255,118,
-133,238,238,185,247,222,123,175,236,161,135, 30, 82,185, 43, 51, 34,226,198,165,151, 11, 11, 11,107,108, 39, 36, 36, 32, 46, 46,
-142,184, 35,239,102, 26, 1,247,222,123, 47, 5,128, 63,254,248,131,220, 9,242, 52, 26,205,168,141, 27, 55,166,231,228,228, 0,
- 0,162,162,162, 38,204,158, 61,251, 87,111,159,175, 99,191,167,148,218,223, 15,110, 63,247,174, 16, 66,144,156,156, 76,234, 51,
-158,221,125, 14, 30, 62,175,238, 39, 78,156,216, 88, 89, 89,217,181, 93,187,118,184,118,237, 26,244,122, 61, 0,220,179,113,227,
- 70,165,191,191,255,233,177, 99,199, 62, 8,160,222,165, 36,135, 12, 25,226,145, 67,176,111,223, 62, 25,220, 44,245,204, 33, 53,
- 53, 85,153,144,144, 32,139,139,139, 83,121,250, 60, 18, 19, 19, 61,106,223,228,201,147,221,126, 63, 56,180,107,103, 93, 1,183,
-170,170, 10, 6,131,129,235, 79,110,189,111, 89, 89, 89,248,254,251,250, 43,212, 26, 12, 6,122,207, 61,247,160, 91,183,110, 88,
-187,118,109,177,193, 96,104, 91,215,188,240,172,172, 44, 76,159, 62,221,173,107,189,122,245, 42,222,123,239, 61, 40, 20, 10, 94,
- 49,223, 5,168, 93, 12,232,102, 22, 2,226,189,216,155,136,205,201,174, 75, 26, 63, 56,111,187, 71, 50,149,202,235, 14, 82, 78,
- 78, 14,252,253,253,237, 74,200,225,126,184,227,109,209,218,219,181, 21, 88,122,122, 58, 77, 77, 77,245,218, 3, 91,183,110,157,
-244,222,123,239,173, 83,126, 67, 48,119,238, 92, 58,124,248,112,217,180,105,211, 60, 34,139,141, 27, 55,166, 55,107,214, 12, 51,
-102,204,128, 90,173,102,147,146,146,182,168,213,234, 71, 66, 67, 67, 61,170, 34, 70, 8,193,239,191,255,110,223, 30, 59,118, 44,
-182,111,223, 94,239,182, 43,212, 54, 2,228,114, 57,141,137,137, 65, 74, 74, 10,229, 10, 51,121, 74,254, 21, 21, 21,153, 29, 58,
-116, 8, 2, 0,137, 68, 2, 95, 95, 95, 20, 23, 23,163,188,188, 28,193,193,193, 40, 46, 46,238,186,125,251,246,172,177, 99,199,
-118, 1, 80, 84,159,176,158, 61,123, 34, 33, 33, 1, 81, 81,215,171,254, 45, 93,186,180,198, 57,139, 23, 47,230, 60, 89,229,180,
-105,211, 60,126,222,222,144, 63,135, 21, 43, 86,212,117,168,206, 21, 44,221,133,191,191, 63, 78,158, 60, 9,145, 72, 4,163,209,
-136,237,219,183,227,236,217,179,120,249,101,207, 86,156,189, 90,107,145,172, 9, 19, 38, 8, 0,196,253,249,231,159,219, 71,140,
- 24,113,245,193, 7, 31,108,158,158,158, 14,129, 64,208, 52, 36, 36, 68,224,137,172,186,144,159,159,207,147,196, 93, 74,254,220,
- 62,151,107, 1,220,173, 88,181,106,149,116,246,236,217,170,134,202,185, 91, 66,217, 17,253,223,189,238,181,103,191,230,149, 12,
-181, 90, 13,173, 86,107,247, 64, 82, 82, 82, 28, 61, 33,119,189,173, 27,182,227,226,226,176,115,231, 78, 74, 8,185,225,184, 55,
-248,243,207, 63,149, 47,188,240, 2,210,210,210, 16, 31, 31,223, 40,247,239,143, 63,254, 32,187,118,237,162,148, 82,100,100,100,
- 40, 51, 50, 50, 60, 50, 80,114,114,114, 48, 99,198, 12, 22, 0, 35, 22,139,153,206,157, 59, 35, 41, 41,233, 71, 0, 63, 70, 69,
- 69,221, 63,123,246,236,109,238,200,185, 25,139, 1,113, 70, 64, 74, 74, 10,229,202, 0,115,255,202,229,114,154,144,144,224,201,
-181,250,171,213,234,141, 18,137, 36, 8, 0,158,122,234, 41,232,245,122, 36, 39, 39,195,215,215, 23,122,189, 30, 58,157, 14, 2,
-129, 0, 21, 21, 21, 65, 0,146, 0, 60, 90,159, 64,142,220,243,242,242,110,216,215, 24, 72, 72, 72,144,217,174, 83,230,173, 33,
-240,236,179,207,218,191, 47, 95,190,156,251,202,212,218,239,182, 65,192, 69, 77, 94,123,237, 53,248,251,251, 35, 45, 45, 13, 35,
- 70,140,240,138,252,107, 99,216,176, 97,128,181, 74,227,255, 61,246,216, 99,232,212,169, 83,243,237,219,183,163,180,180,148, 91,
-114,215,232,226, 93,104,236,238, 39,189,255,254,251,149, 91,183,110,117, 22,189,145,142, 28, 57, 82, 73, 8,193,174, 93,187,248,
-112,239, 77, 38,255,196,197, 31, 0, 0, 82,150,190,228,212, 8,184, 37, 6, 64, 74, 74,138,179, 7, 77,235,218,239,205,223, 56,
-120,240,160, 18,128,172,161, 70,192,244,233,211,255, 51,227,217, 90,173,246, 6,175,223, 27,162,225,136, 37, 62, 62, 30,163, 71,
-143, 38, 0,144,150,150,214, 40,109, 92,183,110,157,212,230,209,145,226,226, 98,105,106,106,170,178,184,184, 88,234,169,199,238,
- 12,163, 70,141, 34,163, 70,141,194,186,117,235,164, 25, 25, 25,202,117,235,214,121, 36, 87,173, 86,155, 67, 67, 67,197, 27, 55,
-110,132, 45, 26,160, 87,171,213, 76, 82, 82,210, 86,181, 90, 61, 38, 52, 52,116,231,237,124,190, 28,233, 59,246,101,185, 92, 78,
- 57, 35,205, 77, 12, 56,123,246,108,215, 94,189,122, 97,206,156, 57,168,168,168, 64,105,105, 41, 68, 34, 17,132, 66, 33,132, 66,
- 33, 68, 34, 17,124,125,125, 81, 86, 86,134,244,244,244,105,113,113,113, 79,187, 18,154,151,151, 87,195, 56,228, 12, 0, 46, 18,
- 16, 19, 19,227, 73, 27,157,121,255,178,212,212, 84,101, 67, 34, 79, 14, 48,215,161, 43,221,142, 6,228,231,231, 35, 35, 35, 3,
-247,223,127, 63,218,181,107,135, 38, 77,154, 32, 35, 35, 3, 47,191,252,178, 61,250, 38, 16, 8, 60,110,216,176, 97,195,240,234,
-171,175,226,189,247,222,107, 57,123,246,236, 41, 83,167, 78,197,232,209,163, 1, 0, 2,129, 96, 70,120,120,248,175, 10,133,194,
- 84,223, 98, 64,235,214,173,115, 43, 10, 80, 88, 88,136, 71, 30,121,196, 61, 7, 37, 34, 2,137,137,137,202,188,188, 60,164,167,
-167,115,247, 95,154,152,152,168,228, 12,104, 30, 55, 23, 28,249,115,223, 57, 35,224,150, 71, 0,234, 26,199,246, 38, 65,240,102,
- 27, 1,227,198,141,107,112, 36,192,147,235,242,228,111, 60, 60,255, 15,108,252,252,222, 70,185, 87,220, 11, 40,151,203,157,142,
-233,237,223,191,191,193,134, 65, 99, 60,223, 63,255,252, 83,201,121,253,211,166, 77, 83,253,249,231,159,104,214,172,153, 18,141,
- 84, 56,157,147,155,145,145,129,140,140, 12,151,225,102,141, 70, 51,110,227,198,141, 91, 1, 32, 41, 41, 73, 28, 21, 21,133,217,
-179,103,115,135, 37,199,142, 89,215,203, 74, 74, 74,218, 17, 21, 21,245,224,236,217,179, 93,174, 79, 62,118,236,216, 26, 57, 49,
-247,221,119, 95,141,200,128, 59, 97,127, 39, 70, 55,117,214,191,184,231,226, 56, 28, 80, 31,182,111,223,254, 94,231,206,157, 1,
- 0,231,206,157, 3,165, 20,103,206,156,177,175,251, 32, 20, 10, 65, 8,129,197, 98,129, 86,171,197,166, 77,155, 16, 23, 23,231,
-114,213, 37, 71,242, 79, 72, 72,112,106,188, 56, 14, 17,120, 99, 4,196,197,197, 17,185, 92, 78, 27, 26, 13,104, 12, 61,105, 50,
-153,208,175, 95, 63,168, 84, 42,244,239,223, 31, 26,141,198, 62,180,163, 82,169,112,239,189,247,194,204, 45, 65,238,153,231,143,
-247,222,123,175,213,236,217,179, 47,125,243,205, 55,246, 99,173, 90,181,194,199, 31,127,252,189,187,132,221,200, 80, 29, 62,124,
- 24, 49, 49, 49,136,138,138, 66,191,126,253,232,145, 35, 71,100, 28,249,231,229,229, 65,165, 82,241,222,255, 29,128, 91, 98, 0,
-220,202, 36,192,198, 48, 2, 34, 35, 35, 27, 20, 9,224,148,236,218,181,107,157, 30,223,182,109, 27,214,174, 93,235,149,103,114,
-224,124,119, 12,106,127,210,235,176, 63, 7,199, 49,255,244,244,116,196,197,197,217,195,254,251,247,239, 71,155, 54,109, 26,197,
-232,107,136,247,197,121,255,215,174, 93,179,175, 51, 47,149, 74,101,141, 25, 5,224, 48, 98,196, 8, 89, 70, 70,134,210,213,121,
- 27, 55,110,220,202,141,253,107, 52, 26, 44, 93,186, 20,213,213,213, 16,137, 68,240,241,241,193,249,243,231,241,238,187,239, 66,
-173, 86, 35, 41, 41,233, 23,181, 90, 61, 50, 52, 52, 84,233,130,100,107,144,189,171,156,128,198, 48, 60, 15, 31, 62, 92,227,252,
-186,146,196,194,194,194,238, 49, 24, 12, 48,155,205,216,191,127, 63, 4, 2, 1,140, 70, 35,116, 58, 29, 88,150,181,191,199, 38,
-147, 9, 6,131,129,123,167, 93,166,137,215, 21,242, 95,188,120,177, 61, 10, 16, 21, 21,133,226,226,226, 6, 27,162,220,172, 0,
- 15,114, 71,202, 0,132, 57, 59,224, 48, 28,224, 17,146,146,146,240,194, 11, 47, 32, 58, 58,218, 30, 1,225,202,103, 71, 71, 71,
-227,204,153, 51,104,214,172,153, 71, 50,247,236,217,131, 97,195,134,181,155, 61,123,118, 62, 71,254, 54,253, 25,241,211, 79, 63,
- 93,174,157,208,235,174, 65, 81,215,223,242, 48,250, 68, 14, 31, 62, 44, 77, 76, 76, 84,246,239,223, 31,253,251,247, 87, 2,192,
-153, 51,103,144,145,145,193,147,255, 77, 4,183, 26, 96,202,210,151,110, 24, 2,248,215,230, 0,220,137, 70,192,244,233,211,233,
-171,175,190,122, 67, 40,208, 27,242,127,120,126,227,142,211,105, 52,154, 27,146,252, 56,175, 95, 36, 18,161,168,168,232,182,146,
-191,163,247,239,232,185, 61,242,200, 35, 42,149, 74,213,232, 81, 0, 79, 34, 39, 51,102,204,208, 2,240,243,247,247,199,255,254,
-247, 63,136, 68, 34,251,241, 89,179,102, 1, 0, 66, 67, 67, 49,126,252,120,236,221,187,119,247,248,241,227,111, 73, 59, 29,239,
-183,227,248,191, 51,196,196,196,212, 88,169,209,217, 60,108, 0, 48, 26,141, 40, 43, 43,131, 94,175, 71,112,112, 48,124,124,124,
- 96, 54,155, 65, 41,133,197, 98,129,209,104,132,201,100,130,197, 98,113, 52,232,175,213,215,206,188,188,188, 26,222,125,237,225,
-128,218, 9,130, 13, 69, 92, 92,156,202,195, 92, 20, 73, 93, 7,234,200, 13,112,137,119,223,125, 23,247,223,127, 63, 34, 35, 35,
-225,231,231, 7,169, 84,138,178,178, 50,248,251,251, 67,173, 86, 99,245,234,213, 96, 24,207,242, 11,135, 13, 27,214,122,246,236,
-217,249, 11, 23, 46,196,150, 45, 91, 48,113,226, 68, 0,104,177,103,207,158,171,222,220, 39,155, 65, 1, 78,103,113,186,202, 83,
-242,119,140, 4,252,244,211, 79,178, 41, 83,166, 40, 1,224,167,159,126,146, 85, 84, 84,168,192,227,150,193, 89,216,223, 17,255,
-202, 74,128, 3, 7, 14,148, 53, 70, 66,160,183, 94,186,163, 66,126,239,189,247, 26, 76,254, 28,250, 69,247,197,174,221, 74,172,
-219,237,103, 55, 10, 14,156,239,222,160,107,140,137,137, 65, 94, 94, 30,210,210,210,208,166, 77, 27,172, 89,179,198, 11,175,139,
- 74,185,111,115,231,206,109, 20,242,231,188,255,226,226, 98, 89,237, 99,195,135, 15,151,165,165,165,217,207,105, 12,100,100,100,
- 40,221,141, 62,169,213,234, 83,176,142, 11,179, 63,253,244, 19, 86,175, 94, 13, 0,248,241,199, 31,161, 86,171,185,211,204,103,
-206,156, 65,211,166, 77,111,203, 59,224,152,237,239,204, 56,115,119,153,230,188,188,188,253, 22,139, 5,106,181, 26,215,174, 93,
-179, 39,142,106,181, 90, 84, 87, 87,163,178,178, 18, 21, 21, 21,208,233,116, 48, 24, 12,176, 88, 44, 0,144, 89,159,204,218,228,
-238, 44,145,180,246,172, 0,119,145,158,158, 46,173,125,205,233,233,233,158,246, 19,191,198,126, 30,107,214,172,129, 84, 42,133,
-159,159, 31, 78,158, 60, 9,149, 74, 5,127,127,127,188,254,250,235,216,187,119, 47, 94,126,249,101,143, 12,128, 97,195,134,181,
-152, 61,123,246,197, 71, 30,121, 4, 63,255,252, 51, 71,254,173, 0, 92,173,207,147,119,199, 8,120,239,189,247, 26,131,252, 1,
- 64,202,145, 63, 0, 76,153, 50, 69, 57, 98,196, 8,126,245,217, 91,169, 7, 22,127, 80, 35, 23,160, 54,254, 53, 73,128,141, 77,
-254,182,249,174, 13,246,220,184,225,128,233,211,167,123, 77,254, 15,207,255, 3,253,162,175,135,110, 54,254,188, 9, 27,127,182,
-126,223,181, 91, 9,140,148, 1,240,108, 26,160, 92, 46, 71, 76, 76, 12, 0,107, 50,224,225,195,135,177,115,167, 53,103,237,248,
-241,227, 24, 49, 98,132, 7,210,136, 10,184,158,248,215,208, 76,253,117,235,214, 73,157,121,255,181,209, 88, 81, 0,206,144,144,
- 74,165, 50, 87,231, 70, 69, 69,141, 73, 74, 74,218, 49,126,252,120,156, 57,115, 6, 57, 57, 57,120,247,221,119,205, 0,132, 90,
-173, 22, 73, 73, 73,176, 29, 19, 94,184,112, 1,143, 61,246,152, 75,153, 55, 35, 7,128,243,164, 83, 83, 83,237, 81, 44,142, 24,
-185,231,238, 14, 58,119,238,156,173,213,106,239, 49, 26,141, 40, 41, 41,129,143,143, 15,132, 66,161, 61, 2,160,209,104,160,213,
-106, 97, 48, 24, 80, 81, 81,193,141,231, 95,170, 79, 38, 71,238,220, 48, 64, 76, 76, 12,106, 71, 43,156,229, 5,184, 67,254, 92,
- 13,128,218,251, 26,210, 63, 56,175,223,137,199,111,118, 87,135,158, 61,123, 22,103,206,156,129, 86,171,197,224,193,131,161,213,
-106,145,154,154,138, 41, 83,166, 96,203,150, 45, 16, 8, 4,110, 27, 0,157, 59,119,110,205,145,127, 86, 86, 22,222,124,243, 77,
- 0,104, 59,125,250,244, 43,107,215,174, 37,123,246,236,105,144, 14,229, 34, 1, 13, 33,255,152,152, 24,202,245,179, 35, 71,142,
- 32, 59, 59, 91,150,152,152,168,236,210,165, 11, 68, 34, 17,117, 72, 12,228,209,200,224,102, 1, 56, 75, 2,188, 45,179, 0,110,
- 85, 18,224,157, 70,254,181,141,128,134,120,254,245,109,239,218,173,244,230, 5,189,238,238,248,249,161, 91,183,110, 53,142, 31,
- 60,120,208, 35,121,241,241,241,118, 3, 32, 45, 45, 13,105,105,105, 53,102, 5,120,114,253,107,214,172, 81, 2,192,246,237,219,
-157,146,231,180,105,211, 84,107,214,172, 1,224,222, 20,166,186,138,254,112,134, 6,165, 20, 35, 70,140,144, 61,242,200, 35, 46,
-251,206,236,217,179,119,150,149,149,141,218,183,111,223,174,206,157, 59, 35, 39, 39, 7,106,181, 90, 24, 26, 26,138,217,179,103,
-163,172,172,236,194,190,125,251,218,117,238,220, 25, 51,102,204,112,121,189,206,234, 0,120,155, 3, 80,251,221, 82, 40, 20, 36,
- 46, 46, 14,233,233,233,180,246,176,140,187,207, 99,208,160, 65,175,168, 84,170,103, 44, 22, 11, 42, 43, 43, 97, 50,153,236,198,
-138, 94,175, 7,165,180, 70, 98, 96, 92, 92,220, 84, 27, 49,186,141,184,184, 56,196,197,197,213,152, 22,232,233, 16,128, 35,209,
-199,197,197,169,106,235, 22, 71,163,160, 17,225,182,254,228,166,250, 45, 90,180, 8, 42,149, 10, 50,153, 12,103,207,158, 69, 64,
- 64, 0, 10, 10, 10,220, 54, 0, 14, 30, 60, 72,102,207,158,125,241,177,199, 30,195,158, 61,123,240,250,235,175, 3, 64,196,244,
-233,211, 47, 55, 6,249, 59, 26, 1, 13,241,252, 57,253,146,151,151,135,236,236,108, 98,115, 4,101,137,137,137,202,168,168, 40,
- 72,165, 82,202, 39, 2,222,126, 8,235, 82, 74,141, 9,103, 9, 63, 75,151, 46,173,115,255,237, 36,255,233,211,167,223,148,146,
-161, 13,145,121,241,146,235,241,120, 95, 95,207,162,150,245,141, 15,123,131,184,184, 56,217,232,209,163, 85,187,118,237,162, 27,
- 54,108,168, 97, 8,212, 38, 37,119,101,206,157, 59,183, 78,203,134, 43, 74,226, 73, 97,160,186, 12, 78,153, 76,230, 22,249,115,
- 8, 11, 11,179,143,235,159, 60,121,242,209,164,164,164,239,185,136,192,133, 11, 23,218,189,246,218,107, 50, 66,136, 91,242,110,
- 70, 29,128,218,247,217,217,248,183, 7, 70,169,102,196,136, 17,111,108,219,182,237, 45,179,217,140,242,242,114,123, 14, 0, 0,
-148,148,148,160,188,188, 28,148, 82,206,107,247,104,176,157, 27,255,175, 61,237,175,118,158,128,187,228,239,248,156,239,180,169,
-188,156, 17,240,210, 75, 47, 33, 35, 35, 3,227,199,143,199,251,239,191,143,231,159,127, 30, 66,161, 16, 18,137,196,213,115, 37,
-148, 82,118,206,156, 57,248,254,251,239,177,106,213, 42, 0,104,179,103,207,158,203, 54,143,221,171,206,228, 48,108,213,104, 40,
- 44, 44,132,147, 58, 0,170,148,148, 20,217,200,145, 35,149,222, 76,121,228,225, 25,156, 37, 1,186,101, 0,120, 82,148,195, 91,
-194,110,108, 52, 6,249,223,137, 74, 99,193,130, 5,178,211,167, 79, 55,170, 76,155, 55,164,108, 76,153, 28,225,113,115,235, 1,
-216,139, 1,177, 44,139,141, 27, 55,186,109, 4,188,240,194, 11, 92, 59,111,200, 1, 96, 24, 6, 44,203,226,197, 23, 95, 84,186,
- 75,158,245,201,107,232, 76,130,217,179,103,255, 80, 86, 86, 86,178,111,223,190,237,238,122,253, 55, 59,218, 86,251,254, 58, 11,
-177,123, 98, 4, 16, 66,222,190,255,254,251,211,214,174, 93,251,143, 88, 44, 6, 55, 43,128,101, 89,132,132,132, 64,173, 86,115,
- 37,108,253, 0, 88,220,117, 8, 28,147,255, 14, 31, 62,140,184,184,184, 26,250,196,149, 30,202,203,203,163,121,121,121,178,218,
- 33,254, 6, 78,249, 3, 80,103,184,223,188,124,249,114, 9, 0, 35,172,249, 83,220,199, 35, 35,192,177,240,207,147, 79, 62,105,
-255, 94, 89, 89,233,242, 53, 27, 52,104, 16,233,209,163, 7,253,238,187,239, 30,252,241,199, 31, 55,115,100,251,227,143, 63,194,
-211,172,127, 14,151, 47, 95,182,151, 36,110, 36,168,182,110,221, 90, 87,159, 82,237,222,189,155,247,252,111, 34,184, 89, 0,206,
-136,223,173, 89, 0,141, 77,234,117,201,187, 83,140,135, 59,149,252, 1,160,123,247,238,170,238,221,187, 55,170, 76,155,114,188,
-233,215,234, 24,254,175, 77, 82,117, 77, 59,179,181,207,157,182, 17, 15,174,247,166, 94,107, 88, 88,216, 31, 13,201,244,111,204,
- 28, 0,103,125,184,190,104,143, 7,125,254,228,244,233,211, 3,118,236,216,177,164,160,160,224, 25,157, 78, 7,139,197,130,190,
-125,251,162,127,255,254, 73,113,113,113,139,221, 33,127, 0, 56,112,224,128,253,187, 99,174,201,129, 3, 7,110,216,174, 15, 81,
- 81, 81,196, 22, 37,144, 1, 80,114,198,132,195, 80,128,199,207,100,242,228,201,117, 29, 18, 58,232, 75,241,237,208, 43, 10,133,
-130, 61,113,226, 4, 62,251,236, 51, 2,192,173,162, 60, 79, 63, 93,127, 77,166,216,216, 88, 76,154, 52,201,237, 54,184,146,199,
-227,206, 51, 2,234, 34,127,167, 6, 64, 99,147, 32,191, 66, 28, 15,103,125,160,174,105,103,252,189,185,163,255,134,102,204,152,
- 49, 11, 0, 44,240, 86,192,190,125,251,200,180,105,211,110,138, 65,235,109,229,192, 91,105, 44, 54, 20, 61,123,246,108,212,197,
-120, 26, 91, 30,143, 59,203, 8,112,233, 69,245,237,219,151, 87,196, 60,120,240,224,193,131,199,127, 12, 12,127, 11,120,240,224,
-193,131, 7, 15,222, 0,224,193,131, 7, 15, 30, 60,120,240, 6, 0, 15, 30, 60,120,240,184, 11, 97, 6,192,242,183,129, 71,125,
- 16,242,183,128, 7, 15, 30, 60,120,221,206,227, 63,222, 73,230,205,155,231,117, 6,172,179,172,238,250,228,185,154,127,236,169,
-188,198,110, 31, 47,143,151,247, 95,151,119,244,149, 11, 94, 43,150,232, 37,237,112,179,229, 29,126,217,123,121, 49,239,223, 40,
-111,238,220,185, 4, 0, 8, 33, 82,147,201,132,243,231,207, 43,141, 70, 35,132, 66, 33, 46, 93,186,132,169,193,145,248, 35, 59,
- 27,186,222,109, 48,104,208, 32,153, 64, 32, 0,165, 84, 5, 0,201,201,201, 55,253,121,112,237,115, 4, 33,164, 59,128,102,255,
-252,243,207,214, 86,173, 90, 49,101,101,101,146, 86,173, 90,189,235,235,235,187, 18,192,101,219,116, 82, 38, 57, 57,217, 82,143,
-188, 64, 91,180, 64, 75, 8,161, 0,112,241,196, 15, 95,201,135, 21,204, 94,151,221,249,188,176,217,152, 65, 1,129, 65,213, 0,
- 40,165, 84, 8, 32, 52, 57, 57,249,226, 77,239,127, 71,143,122, 45, 47, 58, 58,250, 63, 47,239,166, 90,137,238, 86,219,242,180,
-250,155, 55, 37,115,203, 87,255, 44, 21,134, 5, 43,115,115,206,201, 58,250, 4,192,255,233,233,170, 59,201,202,170,171, 30, 57,
- 63, 69,242,246, 99,203,150, 45,210,109,219,182, 41,147, 94,177,110,255,178,103, 24,166, 79,159,238,214,115,217,147,185, 95,202,
- 16,162, 60,115,250, 52,212,106, 53,218,181,107,135,128,192, 64,140, 29, 61,198,237,231,186,115,231,206, 26, 47,110, 90, 90, 90,
-189,107, 41,164,165,165,121,221,111,184,133,154,146,147,147, 27,214,239, 18,202,108, 95, 40, 0, 2,164,134,121, 47, 43,102, 57,
- 16, 53,211,250, 61,111, 53,112,248,185,134, 63,212,248,107, 53,219,151,214,196,173,159, 17, 66,168, 70,163,145,237,216,177, 67,
-153,151,151,135, 4, 81, 56, 90,180,105, 10,189, 70, 7, 95,173, 25, 67,158,127, 2,195,199, 79,193,111,223, 36,227,215, 93,187,
-148, 99,198,140,145,221, 1, 93, 56,199, 98,177,180,204,203,203, 99,251,244,233, 35,238,220,185, 51,142, 28, 57,242,138, 94,175,
-191,191, 83,167, 78,113,132,144, 50, 74,169,171,161,128, 42,199, 13,179,217,204,252,157,125,180, 83,235, 57,209,120, 49,182, 71,
-211, 3, 59, 62,218,176,241,184,244,175, 78, 61, 71,190,111,147,119,201,102, 48,176,124,164,225, 63, 22, 38,242,180,126,191, 39,
-117,240, 61, 37,127,203,186,173,210,193, 77, 91, 43, 73, 68, 20,206, 86,151,163,101,171, 72,165,137,181,224,244,231,107, 80,220,
-174,169, 44,118,252, 56,183, 12,129,195, 74, 57,237,218,129,219, 18, 96,211, 14, 22,123, 14, 81, 36, 62, 2,116,237, 0, 60,247,
- 94,195,136,155, 91,160,164,161,213,201,156, 25, 19,141, 37,183, 33, 72, 76, 76,164,120,131,128,188, 93,247, 57,148, 82,224, 13,
-130,201,167, 18,238,152,185,214,215,201,159,218,200,127, 56,246,238,221,139,233,211,167,187,252,109,239, 62, 59,104,247,238,253,
-145,154,122, 5, 7, 51,173, 5,107,114, 78,159, 1, 0, 60,254,127, 63,211, 51,231,226,101,254, 18,247,158,203,232,209,163,217,
-157, 59,119, 50,105,105,105,216,189,123,119,189, 11, 49,121, 91, 66,181,174,247,118,174, 92, 78,147,189, 48, 40,184,114,225, 13,
- 46,101, 28, 53,179,230, 98, 59,141, 97, 0, 56,220, 39,219,234,132,110, 33, 55, 55, 23,170, 13, 27,148,111,199, 77, 70,223,233,
- 79, 66,220, 60, 20, 16,218,138,253,177, 20, 96, 69, 96, 13, 20,227,102, 38,162,224,211, 15,176,127,255,126,229, 61,247,220, 35,
-227,162, 0,183, 9, 22,134, 97,154, 53,105,210, 4, 42,149, 74,216,167, 79, 31,196,198,198, 50, 69, 69, 69,209,127,255,253,247,
-137,222,189,123,247, 35,132, 20,217,200,154,113,243,222, 5,140, 26, 57, 58,234,253,143,183, 48,139,103, 29, 15, 26, 52,118,158,
-108,208,192,244, 97,207,127,118,233,129,206, 3,102,196, 16, 66,170, 96,205, 49, 96,234,234,103,142,133,173, 92,245,163, 6, 27,
-164, 60,106,160,118, 1,160,218,240,106, 49, 32, 71, 5,210,119, 70, 47,204, 27, 50,159,129,155, 43,247,213, 54, 2,228,114, 57,
-141,137,137, 65, 74, 74, 10,117, 92,182,212, 35, 98,205, 56, 44,157, 22, 61, 88, 41,182,176,176,128,194,183,220, 15, 69, 37, 37,
- 40,170,170, 64,123,159, 0, 24,206, 94, 86, 30,252,117,155,108,160, 27, 70, 64,215, 14,192,233, 92, 6,148, 74, 96, 33, 62,120,
-112,180, 9,147,198,232,112, 61,135,166,225,165, 18, 26, 74,210, 28,241, 47, 94,188, 24,217,217,217, 0,128,173,167, 69,208,155,
- 76, 74,249,255,245,247,200, 16,240,196,136,179,149,120,173,255,185,188, 97, 61, 28, 19, 19, 83,119,253,246, 55,188,123,199,127,
-251,242,138,244,215,191,223,180, 27, 60,247,247,122, 67, 54, 97,126,171, 6, 43,220, 45, 91,182, 72,183,110,221,170,100, 24, 6,
-139,150,192,190,250,153, 59,235, 96,132,134,254, 41, 29, 52,112, 46,128, 95, 49,108,216,167, 53,142, 77,155, 6,140, 27, 7,140,
- 67,154,114,249,167,112,203, 8,224,200, 95,165,178,158, 58,101,202, 20,251,194, 74,158, 16, 88,125,158, 63, 87,146,217,241,250,
-230,206,245,142,252, 27, 13, 49, 31, 3, 0, 86,172, 88,113,221, 0,232,151, 4, 28, 89,116, 91,154,179,123,247,110,172,156,148,
-136,246, 35, 71, 3, 2, 3,136,136, 1, 17, 50, 32, 2, 17, 40, 37, 96, 53,102, 80,139, 5,212,104,193, 19, 51,159,196,147,175,
- 47, 64,110,243,230,202, 14, 29, 58,220,206, 72, 0,201,206,206, 30,220,166, 77, 27,113, 94, 94, 30, 50, 50, 50,112,250,244,105,
-140, 30, 61, 26,131, 7, 15,110,185,106,213,170,119, 38, 79,158,252,132, 7, 6,128, 96,239,174,245,223, 62,212, 87,219,252,112,
-149, 0,211,222,168,198,208,232, 79, 48,127,225, 20,225, 71,139,203,219, 47,254,104,237,180,168,232,105, 10,212, 81, 6,217,145,
-208, 29,117,250,220,185,115,169,179,253,141,189, 32, 28,143,155, 16, 1,112,124, 72,235,182,175, 45,239,208,177, 67,136,252,237,
- 39,216,121, 67,230,187,173, 60, 20, 10, 5, 73, 73, 73,161, 92, 89, 82,238, 95,185, 92, 78, 19, 18, 18, 60,243,170,183,239,151,
-222,219,185,135, 82,172, 55,195,247,163, 23, 96,214, 26, 33, 89,244, 30,130,197, 18,232, 69, 58,104,244, 58,248,130,192,112,177,
- 88, 89, 81, 81, 33, 11, 14, 14,174, 87, 9,159,206, 5, 82,126,100, 1,104,109, 31, 96,216, 0, 6,147,198, 16, 56, 38,210, 38,
- 62, 2,164,252,232, 69,196, 52, 33, 65,102,187, 78,175,188,117,142,252, 57,226, 7, 0,197, 94, 19,116, 70, 13, 0, 96,212,226,
-157, 72, 93, 58, 90, 9,192,109,249,185, 31,228, 66, 68,206, 94,239, 8,164, 16,164, 73, 87,135,237, 98, 52,253, 63,247, 74,132,
-146,183,173,228, 95,223, 26,243, 68,158, 74,173,231,184,231,253, 31,217,106,146,166,108,121, 90, 73, 65,241,254,194, 95, 48, 80,
-218, 25,235,190,220,131,175,119,204, 85,110,149, 83,204,123,244, 77, 89,223, 97, 45,189, 50, 4,170, 47,200,233,200, 62, 64,234,
-119,255,128, 82,138,192,102,189,237,228,191,114,229,202,122,219,167,209,167, 75, 19, 19, 90, 42,129, 47, 0,252,130,131, 7,129,
-129, 3,175, 31,127,231,157,235,223,159,125, 38, 77,153,252,117, 23, 25,195,182,169,183,157, 28,249,143, 24, 49, 2, 44,203,226,
-243,207, 63,111,180, 23, 92, 46,151,219,201,191,166, 81, 32,167,201,201,245,191,115,204,100,117, 13,243,151,216,254,199, 38, 56,
- 57,143,216, 78, 36,214, 47,125,250,220, 56,198,206, 76, 81,219,163,242, 0,192,178,179,176,112,225, 66,251,241,133, 11, 23, 98,
-197,138, 21, 96, 58,205,185,254, 87,109,231, 59,147, 39,156,226,188,125,102,179,147,243,220,104,159, 94,175, 71,139,118,145, 0,
-107, 4,227, 3, 16,161, 0,230,170, 10,232,243,206,163,228, 82, 33, 90,223, 35, 5, 17,135,128,152,140,128,128,193,210,121,207,
- 99,116,202,155,120,238,185,231, 26, 85, 41,187, 42,149,237, 64,182,132, 82, 26,162,211,233,238, 9, 11, 11,195,153, 51,103,192,
-178, 44,206,159, 63,143,213,171, 87,163, 91,183,110,136,136,136,152, 1,224,137, 90,100,205,214, 69,222,148,210, 38,237,152,131,
-210,150,109,199,138,203, 51,142,163, 66,237,131,239,127, 51, 99,219,129, 31,240, 76,130,175, 80,168,101, 99,128,105,117,174,131,
-112, 51, 22,183,226,225, 25,234,234, 59,206, 34, 3, 66,119,137,159, 82, 10,217, 43, 35,144,146,161, 8, 73,132, 28,127,125,119,
- 28, 24, 98,127,173,220, 2, 71,250, 90,237, 90, 0, 4,122,253, 42,132,133,165, 35, 53, 53, 21,158,148,241,140,245, 9, 82, 54,
-211, 91, 32,121,227, 73, 88,174,149,193,124,249, 26,132, 98, 17,252,136, 0,254, 68, 0,127,129, 16, 97, 34, 9,212, 85,229,184,
-178,123,191, 50,120,210,125,245, 42, 58,103,164,190,231, 16,107, 51, 0,128,143, 95, 37,160, 4,176,166,199,120,222,193,109,164,
- 44, 75, 77, 77, 85,166,166,166,122, 53,132,224, 72,254, 16, 10,144,119,197,170,252, 10,174,234,209,182,185, 4,157,102,253,138,
-212,213,227,149,238,134,215, 69,228, 44,132,164, 16, 2,114, 13, 22,218, 4, 62,205, 8,252, 31,185, 12,150, 45,131, 94,159, 10,
- 75,246,139,158, 69,114,221, 88,185,205,147, 37, 94, 21, 91,230, 43, 7,135,189,134,207,127,153,131, 0,166, 45, 0,224,201,167,
-187,160, 79,108, 20,214,126,145,129,149, 63,188,165, 84, 12,243, 46,116, 72, 8, 32,127,246,132, 93,233, 13, 29, 58, 20,123,246,
-236,113, 73,254, 0, 48,253, 17,145, 18,216, 13,224, 4,202,175, 6,160, 83, 91,224,171,175,170,161, 84, 2,157, 58, 1, 81, 81,
- 86, 17,229, 87, 3,172, 47, 99,175, 83,202, 99,127,183, 33,245,145,255,238,221,187,193,178,172,157,164,127,250,233,167, 6, 19,
-136,227,118,109,242, 7, 0, 87,228, 15, 0,201, 10, 5,161,128,148, 0,170,196,196,196, 58, 59, 62,235,160,244, 21, 41, 41, 50,
- 66,128,149, 95,174,188, 33,231,101,101,178,194, 49,190, 34,165,148, 42, 63,249,228, 19,251,142, 79, 62,249, 4, 43, 86,172, 64,
-114,114,114,205, 85,228, 8,164,206,228, 37, 91, 75,216,202, 40,165,170, 39,158,120,162,206,246,153, 29,162, 40, 41, 95,125, 37,
- 35, 4, 72, 94,153,172,116, 70, 94,194,192, 64, 64, 36,128, 69, 91,142, 83,219,118, 97,237,134, 52,124,121,249, 60, 0, 32,235,
-173, 32,116, 26, 62, 14,134,130,139,248,231,239,195, 56,126, 62, 7, 21, 69, 69, 56,113,226, 68,163, 45,172,181,122,245,106,169,
-123,125,152, 4, 83, 74,187,102,103,103,127,244,191,255,253,175,199, 71, 31,125, 36, 54, 26,141, 16, 8, 4, 8, 12, 12,132, 70,
-163, 65, 86, 86, 22,162,162,162,184,117, 11,234,243,254,253, 9, 33, 44,165, 52,172,252,210,190, 67,111,125, 91, 16,246,205,194,
- 86, 40,211,136, 33, 22, 50,104, 29, 42, 65,209, 53, 35,228,203,204,232,211, 63,198,191,173,139, 72,194,220,185,115, 41,103, 8,
- 56,246,197,186,190,243,184,249,224,200,191,182,113,192,184, 82, 34,220,122,223, 53,194,156, 99,167,123,220,128,148,148, 20,106,
- 37,255,117,118,242,151, 28,202,135,246,143,142, 53,142,187,244, 92, 21,235,164,193,101, 85, 96,197, 66, 24, 15,255, 3,195,169,
- 60,232,119,236, 1,116, 6,136, 41,133, 31, 4, 16,130,192,192,154, 81,102,208,227,203,157,191,185,148,249,241,171, 86,239,222,
- 17,214,109,206, 93,161, 56,115,142,226,185,247,188,239,179,113,113,113, 42,199,176, 87,122,122,186, 91, 47,122,122,122,186,125,
-109,109, 14, 83, 87, 92,194,174,195,106, 20, 92,213,219,141,128,179,151,116, 64,220, 6,164,167,167,187, 21,142, 20, 18,235,202,
- 97,162,170,227,240,247, 63, 7, 31, 73, 21, 88,182, 12, 38,211, 97, 8, 4, 81, 48,106, 74,111, 91,103,221,181,233,132, 20, 32,
- 53,200,255,202, 25,138,126,227, 5,120,250,221,209, 24, 58,186, 7, 0,106, 59,207, 51,172, 91,183,142, 46, 90, 66, 16,208,180,
- 23, 40,128,177,147,230, 97,239,222,189,110,253,150,101, 46,210,102,205,142,217,201,191,170,212,186, 4,115,159, 62, 86,242,231,
- 22, 2,180, 30,243, 69, 85,169, 47,194,252,174,212, 43, 51, 62, 62, 30, 50,153, 12, 35, 71,142,196,148, 41, 83, 32, 16, 8,110,
-248, 56,238,119, 23,206,222, 91,175,140, 37, 7, 34, 38,132,216, 63,117,237, 35,128, 10, 20,170, 58,100, 93,127,191, 18, 19,149,
-206, 60,231,133, 11, 23, 34, 49, 49,177, 38,161,214, 33,239, 23,133, 2, 39, 78,156, 80, 18, 66,164, 0,106,220, 51,123, 60,187,
-214,190,250,218, 39,166, 20,140,159, 15, 76, 69, 23,160,120,237, 53,172,214,148, 67, 61, 98,144,253,248, 55, 63,172,198,155,207,
- 63,142,206,207, 77,197,219,199,119, 99,131,250, 60, 70, 79,152,128,168,168, 40,143,135, 0, 86,175, 94, 45,149,203,229,116,213,
-170, 85, 53,250,240,129, 3, 7,148,245, 13, 67, 17, 66, 68,132,144,254,199,143, 31, 47,200,200,200, 80, 45, 90,180,104,208,231,
-159,127, 46,169,174,174,182, 47,211,172,215,235, 17, 16, 16,112,118,242,228,201, 93,134, 12, 25,210,214,133, 33,193, 16, 66,218,
- 29,207,220, 88,156,243,199,115,249,207,189,156,212,242,215, 55, 90,225, 84,161, 16, 21,213, 2,176, 4, 40,173, 54,130,134,119,
-208, 63,251,202,123, 61, 30,120,240, 81,151,195, 9,201,201,201,132,211,117, 10,133,194,229,119, 30,183,135,252,157, 70, 0, 28,
-137,223, 29, 61,227,137, 39,114, 61,212,182,202,105,116,160, 70,158, 65, 29, 97,140, 30, 77,154, 43,203,168, 9,226,210, 50, 72,
-126,217, 13, 34,100, 0,189, 17,180, 74, 3, 98, 54, 67, 4,192, 66, 89,232, 45,102, 84,153,141, 0,235,122, 12,149, 75,242,251,
-248,213,186,213,160, 53, 73,176,225, 10, 85,161, 80, 16, 46,164,239,142,183,126,131,247, 15, 96,253,252,150, 53,182,251,191,148,
- 7, 17,189, 6, 19,105,130,212,212,212,221,238, 70, 1, 36,213, 74,132,189,253, 3, 74, 22,205,197,181, 50, 95,180, 50,253, 3,
-139, 37, 15, 0,112,225,175, 22,183,173,195,110,216,254,153,242,241, 49,138, 26,228,207, 97, 80,232,107,184,167, 71, 60, 6,135,
-253,131, 13,219,223, 85,142,154,228,190, 18, 89,187,118, 45,253,243,207, 63, 81, 90, 58, 10,225,225,187, 16,208,164, 39, 40,165,
- 96, 24,198,173, 68,164,130, 2, 32, 47,239, 4, 55,144, 0, 72,170, 81,166, 1, 98, 99,173,123,206,158, 5,190,248, 2,168,170,
- 4, 52,213, 64,181, 6,240, 15,173,116,171,109,117,141,245,231,230,230, 2, 0,150, 44, 89, 2, 0,232,220,185,115,163,133,153,
- 29,251,164, 59,191, 89,176, 96, 1, 28, 61,246,218,196,237, 1,164,192,245,177,127, 71,112, 81, 0,219, 57,170,250,132,204,137,
-232,140,156,127, 78,162, 48, 52, 84,201, 48, 12,158,121,230, 25,124,250,233,167, 94,183,111,152, 33, 4,148,173,198,227, 75, 94,
- 69,175,248,120, 40,150, 44, 1,195, 92,231, 57,197,217, 19,215, 35,132,123,246, 96,231,206,157, 56,127,254,188,199, 73,128,171,
- 87,175,150,102,102,102, 42, 1, 32, 43, 43, 75,201, 48,140,108,214,172, 89,170, 85,171, 86, 73, 41,165, 24, 60,120,176, 76,167,
-211, 41,235, 48,236, 76, 7, 14, 28,232, 53,125,250,244,160,246,237,219, 99,219,182,109,218,138,138, 10,161, 78,167,179, 70, 59,
-108,227, 31,247,222,123,111,103, 66,136, 47,165, 84,231, 68, 12,227, 32,143,201, 59,243,215,138, 55, 95,156, 29, 16,222, 41, 21,
- 71, 83,103,226,216, 69,130,130,171, 66,128, 50, 48, 24, 77, 40,163,225,133, 79,205,121,114, 16, 33,164,144, 54,130, 85,233, 78,
-158, 13,143, 91,131, 58,135, 0, 50, 50, 50,110,216, 87, 94,168,246,152,236, 28, 35, 0,214, 33, 0,107,255,145, 28,202,135,207,
-137, 66, 88, 66,172, 94, 84,237, 49,228,186, 86,139, 59,121,169, 0, 90, 31, 95, 68,153,205,104,237, 27, 0, 63,145, 24,196,100,
- 2, 88, 10,179,197,130, 42,139, 17, 90,139, 25, 6,106,129, 5, 20,212,131,206,246,220,123,215,141, 0,107, 94,192,117,210,255,
-248, 85, 1,146, 94, 37, 88,244,158,185,193, 55, 61, 46, 46, 78,197, 45, 93,234, 14, 22,167, 90,239,251,210,132, 80, 59,225,219,
- 67,249,244, 26, 68, 0,132, 84,141,239, 30, 15, 53, 79, 77,119, 47,175, 67,116,245, 16, 44,176,134,169, 63, 18, 6, 99,234,213,
- 11,200, 94,214, 26,254, 45,186,161,162,176, 16, 69,249,151,111,107,199,236, 19, 27, 5,141,173,187,105,125, 79,194, 79,215, 29,
- 63,191,101,178, 31, 31, 18,215, 3,153, 27, 60,243,252, 39, 13,255, 19,191,252, 18,135,144,204,116, 44,127, 21,120,246, 61,138,
-225,195,135,187, 61,237, 47,178,117, 27,210,161, 67, 77, 43,240,183,223,172,137,127,235,214, 1,157, 58, 81,172, 88, 65,240,246,
-219,213, 86, 3, 1, 64,167, 46,161, 88,244,172,123,109,228,188,212,248,248,120,252,244,211, 79, 53, 60,217,177, 99,199,214, 73,
-110,222, 26,162, 30, 70,240,100, 43, 86,172, 80,214,101, 0,124,252,241,199, 72, 73, 73,113,203, 19,126,226,137, 39,148, 92,230,
-191, 51, 60,251,236,179, 88,190,124,185, 50, 37, 37,165,222, 54,254,121,178, 0,175,188,253, 60,230,188,241, 34, 94, 54, 26,241,
-201, 39,159,212,121,143, 62,254,248, 99,164,167,167,131, 16, 34,173,139,176,135,119,111,139, 85,223,124,129,152,105,211,240,214,
- 91,111,213,107, 52, 44, 92,184, 16, 31,127,252, 49,190,250,234, 43,149,167,247, 62, 51, 51, 83,201, 37,203,201,229,114,122,224,
-192, 1,229,172, 89,179,200,193,131, 7,149,132, 16,204,154, 53, 75,181,114,229,202, 58,127,175,213,106, 67,126,251,237, 55,140,
- 26, 53, 10,103,207,158,245,211,104, 52, 48,153, 76, 96, 24, 6, 70,163, 17, 9, 9, 9,196, 70,238, 58,119, 2, 91, 6,131, 65,
-124,120,227, 52, 12,127,232,109,252,145,145,139,243, 87, 4,168,212, 48, 16, 8,129, 66,141, 47,158,121,233,213,193, 0, 46,185,
-203,253, 92,222, 9,224,222,112, 0,143,219,227,253,195, 89, 24,135, 11,205, 72,165, 82, 72,165, 82,252,253,247,223,246, 79,222,
-161, 11,168,208, 85, 32, 60,214,243,121,191, 28,185,251,249, 77,135,228, 80, 62, 68, 23, 74, 65, 9,129,120, 78,105,141,227, 46,
-137, 75, 44,128,133, 2,151, 52,229, 40,168, 40, 67, 73,165, 26, 21,122, 61,212, 70, 29, 74, 12, 58, 92,209,107, 81,168,175, 70,
-153,201, 0, 53,107,130,145,117, 93, 13,115,216, 0, 39, 10,207, 33, 47,224,241, 41, 1,160, 16,131,122,182, 12,184, 61,132, 95,
-187,179,187, 27,254,183,123,158, 87,245,216,117, 88, 93,131,248, 57,242,247, 97, 47,192,135,189,128, 55,239, 21,162,160,160,192,
-232,174,204,141,231, 89, 52, 77, 74,182,111,159,215, 88,112, 41,183, 16,103,246,253,131,162,252,242,219,222,113,215,125,105, 53,
- 64, 43,139, 41,252,116,221, 33,157, 35,196, 67,111,136,236,159,164, 13,211, 64, 64,220, 86, 72, 19,135,102, 96,230,115,113, 8,
- 61,176, 11,132, 16,108,222,103,125, 4,238,146, 63,135,206, 93,187,212, 50, 44,128,207, 63, 7,206,157,179, 70, 2,222,122,139,
-218,195,239,148, 82,132,134,134,186,214,192,182, 62,106,177, 88, 96,177, 88,176,100,201, 18,228,230,230, 34, 39, 39, 7, 57, 57,
- 57, 72, 79, 79,199,243,207, 63,143,130,130,130,219,249, 72, 84,117,121,210, 11, 22, 44,224,188, 58,183,200,144, 16,226,212,251,
-231, 80,223, 49, 71,236,241, 41, 7, 97, 2,240,245, 43,239, 33,224,183,116, 36, 38, 38,194,113,169, 97,121,167,158, 88, 16,115,
- 15,252,252,252, 48,124,248,112,252,239,127,255, 67,122,122,186, 82,173, 86, 59,125,255,190, 41,204,193,149, 30,221, 17, 17, 17,
- 33, 99, 89,182,206,104, 7, 23,169,240, 54,242,226,152, 41, 63,120,240, 96, 25, 71,148, 0, 48,104,208, 32,153,139,123, 55,114,
-248,240,225, 65, 5, 5, 5,216,179,103, 15, 58,118,236, 8,161, 80,104, 55, 22, 35, 34, 34,220, 29,142, 96,109,242, 72,135,174,
-209,139, 83,118,132,224,216,182, 55, 48,108,112, 55,248, 75, 24,248,251, 89,224,235, 99,192,125, 19, 39,179, 0,202,106,219,170,
-174,140, 75,238,250,220, 25, 14,224,113,251,192,212,247, 16, 21, 10, 69,224,130, 5, 11,176, 96,193, 2, 0, 48,190, 51,247, 29,
-152,138,205,240,245,149,120, 85,140, 36, 33,193,154, 62,236,119,239, 57, 80, 1,131,255,253,172,181,123,255,238,194, 47, 34, 66,
-102, 14,240,131,154, 90,112, 82,163,198,137,138, 82,252, 83,121, 13,255, 84,150,225,164,166, 12,231,180,106,148, 26,244,168, 54,
-155,113, 89,171,177,255,205,250, 48,105, 12,193,199,175, 10,240,241,171, 2, 80, 8, 64, 9,131,196, 71, 8,158,120, 68,140, 57,
- 83,154,162, 67,135,230, 96, 33, 2,224,217, 37,115,161,254,132,132, 4, 89,237,125, 30,220, 51,217,217, 75, 86, 67, 62,251, 3,
-107, 18,221, 31, 47, 4, 91,195, 55, 84, 13, 1,213,192,192, 88, 51,154,203,202,202,252, 18, 18, 18, 60, 90, 20, 61, 38, 38, 6,
-233,233,233, 88, 87,173,129,206,200, 96,230,143, 95,163, 88,226, 11,157,241,246, 45, 19, 49,190,207,155,178,204,178,247,176,238,
-251,235, 46,254,207,111,153, 48, 40,244,181,235, 6,229, 3, 95,200,146, 21,201,110,213,150, 88,254, 26, 48,235,185, 81, 8, 57,
-144, 14,217,178, 17, 96,238, 7, 84, 42,149, 87,125,184, 93,187,154,217,227, 35, 71, 2, 33, 33, 64, 84, 20, 48,176, 79, 32, 36,
- 98, 1, 4,204,117,177, 18, 95, 95,151, 10,153, 97, 24,251, 88,127,110,110, 46, 58,119,238, 92,227,243,246,219,111,227,237,183,
-223,198,229,203,238, 71,101,156,141,215, 59, 98,238, 92,207, 61,176,148,148, 20,217,242,229,203,157, 18,182,187,222,191, 67,232,
-249,134, 60, 5,110,155,101,221, 43, 97,111, 36, 4,172,214, 0, 81,139,118,144,191,251, 46,102,249,135, 32, 68,149,105, 63, 62,
-231,209, 89,120,243,163,175,113,246,227,245,120,189,215, 72, 76, 14,109,143,157, 91,182, 32, 47, 47,207,233,251,247,224, 92, 57,
-122,244,236, 41,227,146, 26, 57,131,204,113,120,198,217,190,122,188, 47, 58,119,238, 92,202, 37,246,113,227,253,142, 36, 63,107,
-214, 44,213,160, 65,131,100, 92,232,127,214,172, 89, 42, 23,247, 45, 67, 36, 18,117,124,240,193, 7,115, 43, 42, 42,160, 86,171,
-225,235,235,139,166, 77,155, 34, 36, 36, 4, 33, 33, 33,174,110, 30, 91, 75,158,197,199,199, 71,251,240,220, 79,101,171, 15,245,
- 71,254,197, 74, 52, 15, 22, 96,112, 23,130,222,237, 41,252,131,130,202, 1, 88,234,225, 13,126,189,129,187,212,251, 7, 92, 79,
- 3,172, 86, 40, 20, 62, 0,252,229,114,185,221, 10,108, 61,162,149, 87,150,175, 66,161, 32,113,113,113, 72, 79, 79,167,226, 57,
-169, 53, 66,145,238,214, 1, 8,159, 48, 74, 85,154,186, 13, 90,179, 1,149, 26, 45,114, 77, 38,136, 88,107,160,190,194,164, 7,
- 75, 41, 40,128,109, 87,207, 67, 99, 54, 1,128, 27,138,137,224,185,247,106,246,113,235, 80, 0, 11, 11, 12, 56,117,174, 10,171,
-126,170,244,232,122, 29,137, 62, 46, 46, 78, 85, 59, 10,224,104, 20,212,135,184,184, 56, 85,170,124, 50, 68,163,190, 4, 16,133,
-210,210,235,201,121, 98,246, 10,140, 76, 75, 60,213, 43, 7, 87,174, 88, 21,177, 66,161,216,229,142,220,185, 63,167,212, 48,188,
- 82, 83, 83,193, 13, 74,252,120,124,191, 71,179, 50, 26, 27, 15, 60,217, 82,245,171,156, 98, 95,250, 63, 0,128,123,122, 88, 43,
-227,189,184,240, 13,236,255,167, 7, 62,218, 48, 13,138,223,158, 84, 42,198,187, 71,224, 51,159,139, 67, 88, 88,186,163, 35,139,
-178,178, 56, 80,154,106, 11, 85, 82,164,166, 38,184, 37, 43,254,161,135,201,206, 63,118, 80,192, 26,250,151,201, 8,174, 93, 12,
-134, 70, 45,129,174, 82,140, 31,215, 16, 44, 88, 64,113,161,184, 10, 3, 7, 15,194,180, 41,143,184,229, 21, 91, 44, 22,251,120,
-127,122,186,181,173,142,132, 95, 92, 92,140,226,226, 98,143,195,251,114,185,156, 50, 12,115, 3,169, 38, 39, 43,136, 23, 69,128,
- 84,148,210, 26,185, 0, 14, 17, 1,183, 67,225,142,161,253,218,217,251,174,194,254,181,141, 28,115, 85, 21, 68, 77,194, 32,240,
- 11, 64,143,135,227,241,246,152,209,120,133,155,182, 23,221, 15, 22,157, 30,162,240,230,232, 53, 72,138,200,214,237,241,233,169,
- 76,244,236,217, 83,118,232,208,161, 27,140,128,185,114, 57, 0,162, 4,128, 39,231,206,181, 79, 29, 52,215, 34,123,161, 80, 0,
-208,235, 19, 21, 9,128, 62, 78,148,108,223,190,125, 9,165,212, 30,226,207,202,202,178,135,248, 29,207,179,109,187, 36,127,155,
-195,254, 90, 72, 72, 72,143, 65,131, 6,117, 56,125,250, 52,142, 28, 57, 2,139,197, 2,127,127,127,104,181,218,226,176,176,176,
-124, 79,156, 62, 66, 8,211,188,121,243,157, 19, 39, 78,108,126, 96,111, 22, 86,164,238, 68, 16, 17,163, 75,115, 3,206, 93,243,
-199,208, 46,166,243, 0, 76,156,129,102, 51, 40, 45,245, 61, 19, 71, 93,199, 15, 1,220,217,112,103,188,216, 8,192,232, 72,212,
-151, 50, 46, 3,211, 60, 39,127, 71,178,113,166,180,220, 53, 2, 42,203,212, 50,147,159, 68, 89,193,176, 40,210, 87, 3, 38, 19,
- 44,148,130, 0, 56, 85, 93,142, 66,109, 37, 40,165, 92, 17, 27, 55, 20, 19, 69,226, 35, 4, 41, 63, 94,239,147,167,115,129,174,
- 29,204, 16, 64,211, 32,242,119,236,236,222,134,188, 18, 18, 18,100,169,169, 79, 42,129,108,148,149,149, 25, 11, 10, 10,132, 75,
- 71,131, 89,188,115, 56, 22,246,220,111,247,194,220, 53, 42,156, 69, 93,106,111,115, 36,228,174, 55,135, 55, 8,250,167,228, 81,
-192,249,116, 63,123, 37,192,116, 80,119,146, 20,231,142,255, 82,166,248,245, 41,101,230, 6,138,193, 97,255, 96, 72, 92, 15,236,
-221,249, 15, 14,168,223, 5, 1,129,124,252, 23,110, 95,107, 88, 88, 58, 8, 33,152, 52,105, 18,190,250,170, 18,156, 83,108,253,
-151,218,238,113,106, 13,133, 84,207, 16, 44, 70,140,148,201, 50,118, 43,149, 35, 71, 2,198,162, 54,184, 88,238, 3,214, 54,218,
-218, 82,211, 28, 47, 36, 86, 97,231,129, 46, 8,108,221,197,173, 54,114,196,127,233,210, 37, 0, 64, 81, 81,145, 61, 50,112,245,
-234, 85,187, 98,245, 6, 10,133,130,112,133,128,106,143,225, 38, 43, 20,196,157,122, 0,142,248,234,171,175,106,228, 2, 44, 95,
-190,220, 99,239,191, 54, 97,120, 11,137, 68,130,162, 11,249,104,223,161, 19, 88,179, 1,196,108,129, 48, 48, 8,129,253,250, 35,
- 32,122, 0, 88,141, 25, 22,173, 1,212,108, 1, 44, 44, 22,175,252, 8, 83,166, 77,129, 68, 34,113, 42,207,252, 99,168, 91,127,
-215,217,121, 49,239, 59, 63,119,240,224,193,178, 3, 7, 14, 40, 57, 29, 48,100,200, 16,167,247,202, 13,242, 7, 33,132, 5,176,
-189, 75,151, 46,209,159,125,246,153,177,164,164, 68, 63,122,244,232,137,217,217,217,175,107,181,218,210, 38, 77,154,200,187,119,
-239, 94,230,193,189, 23, 1,104, 59,104,224,192,166,115,231,204,197,249, 75,231,203, 30,155, 51,119,216,193,157,107,146,174, 84,
-149,221,211,127,196,104,182,121,235,206, 15, 57,137, 26,176,245,233, 2, 71,174,168,171,248, 15, 95, 8,232,238, 49, 0,234,244,
- 46,188, 33,127,142,108,184,154, 0,222, 24, 1,237,229,211, 85, 0, 72,161, 98, 53,133,175, 4,106,106,134,209,108, 6, 75, 89,
-132, 7, 7,227,146,166,194,189, 10,118, 54, 56,155,222,119, 61, 7,192,179, 74,108,206, 66,252, 13, 45,215,107,251,237,248,254,
-253,251,255,186,120,241, 98,113, 88, 88, 24,123,229,202, 21, 44,236,121,165, 6,249,123,242, 55,156,221,127,175, 97,171,242, 87,
-187,200,147,179,115,220, 69,244, 3, 2, 85,242, 3,201,100,203,231,151,165, 91,143,191,165,204,220, 0, 16, 16,140,239,243,166,
-236,129, 39,221, 47, 0,196,245, 37, 43,193, 87,218,148, 20,224,140,119, 86, 39, 89,131, 39,254,109,147, 9,176,178, 78,197, 52,
-109,202, 35,170,105, 83, 30, 33,165,234,207,164,150,170, 42, 37, 17, 0, 90,189, 47, 72,149, 25, 66, 70, 8, 45, 35,145,141,153,
-252, 56,132,148,184,108,231,232,209,163, 73,199,142, 29,233,205,122,255,172,222,126, 50,153, 59,119, 46,117,204,104,119,140, 4,
-120, 40, 78,197,121,254, 14, 6,133,234,118, 40,175,145, 35, 71,226,169, 13, 41,120,187,170, 28,125, 71, 12, 5,211, 60,212,218,
- 38, 19,181,150,238,133, 8, 68, 32, 4, 17, 11,240, 85,242,199, 8, 26,213, 31, 29, 58,116,184,165,165,123, 57,239, 62, 51, 51,
- 83, 57,112,224, 64,217,140, 25, 51, 26,244,183,115,115,115,227,118,237,218,117, 65, 32, 16,108, 25, 54,108,216, 59, 12,195,148,
- 12, 26, 52, 40,195,238,201, 56, 68,148, 8, 33,112,246,204, 29, 34, 1,233, 71,142, 28,137,253,110,245, 26, 70, 44,240,185, 24,
- 63, 53,190, 15,195, 48,234,161,227, 30,191, 31, 64,176,141,248,171, 0, 80,179,217,108,151, 87,203,104,227,151,148,191, 3,225,
- 78,248,223, 43, 3,160, 49, 12,134,250,200,199, 19, 5, 39,147,207, 34,233, 59,211,165,236,153,179, 74,141,193, 8,179,197,130,
- 14,177,253,208,217, 60,208, 35, 50,108,204,100, 20,174,232, 15, 0, 37, 23,233,112, 24, 10, 32, 13,144,251, 91, 92, 92,156, 48,
- 61, 61,253,185,165, 75,151, 46,115, 48, 46, 70, 42, 20, 10,143, 10,145,216, 34, 5,141, 86,188,100,242,169, 4,219,125,172,251,
-250, 38,167,167,123,101,233, 79,152,223, 74, 53, 1, 13,127, 62, 86,114, 39,152,249,220, 72,123,157,114, 78,143,173, 78,218, 5,
-255,182,201,196,191,109,130, 71, 50, 67,130,158, 86,237,187, 0,194, 50, 23,165, 58,173,117, 29, 0,127, 73,156, 42, 56, 2, 30,
-205, 24,117,232,127, 34,155,197,217,232,227,170,156, 17,208, 24,178,108,185, 0, 74,238,123, 67,229,121, 59,179,172, 67,135, 14,
-104,241,204, 51,178, 21, 59,118, 40,243,222,249, 5, 9,162,112,132,216, 22,239,209,105,205, 88,240,252,203, 16,248,133, 97,219,
- 26, 5,254,110, 66, 48,166, 1,117,251, 45, 22, 51, 60,205, 1,170,109, 4,184,227,229,187,184, 79, 36, 39, 39,167,132, 82,154,
-212,181,107,215,111, 75, 75, 75, 53, 66,161, 16,102,179,153,134,135,135,219, 35, 42, 26,141, 6, 98,177,216, 30, 69,170, 71,222,
-240,172,172, 44,176,102,130,123,134,244,121,243,210,165, 75,234,178,178, 50,132,133,133,177,173, 91,183, 86,115,207,166,162,162,
- 2, 18,137, 4,132, 16,248,248,248,184,229,244,113, 70, 66,237,239,181,163,162, 60,238,178, 8,192,205, 50, 10,188, 38,198,209,
-113, 42,140,142,187,163,178, 73,109, 70, 0,185, 9,227,232,150,184,184,184, 15,227,226,226, 62,108,140,246, 53,226,245,146,198,
- 56,231,102,194,234,213, 3,182, 18,251,181,142, 37, 52, 72, 54,195,182, 81,249, 75,218, 52, 70, 51, 77, 55,243, 30, 52,226,162,
- 43, 42, 79,198,234, 93, 24, 19, 94,203,161,148, 18, 63, 63, 63, 76,154, 52, 9,182,229,123, 81,224,176,124,239,190, 93, 59,237,
-203,247,142, 26, 52, 10, 54,163,183,206,191,247,149,250,125,242, 68,232,203, 55, 18,147,155,171, 9,186, 97, 4, 52, 24, 3, 6,
- 12, 48,152,205,230, 12, 0, 26,150,101,169,209,104,157,248, 83, 82, 82, 2, 0, 8, 8,176, 78,237,229,246,139, 68,162,122,239,
-223, 3, 15, 60,192,201,216,193,178, 44, 66, 66, 66,192,178,172,125,198,137,109, 22, 11,209,235,245, 20, 0,196, 98, 49, 8, 33,
-204,173,208,237, 60,188,135, 59,165,164, 1,128,244,237,219,151,183,196,120,240,224,193,227,238,129, 25,128, 30,128,164,145,157,
- 56, 87, 11, 6,185,189,162, 32,143,187, 3,252,195,228,193,131, 7,143,187, 11, 66, 0, 1,110,144,191, 22,214, 36,238,198,226,
- 3, 22,252,180,191,127, 93, 71,226,193,131, 7, 15, 30,255, 62,248,241,124,193,131,143, 0,240,224,193,131, 7, 15, 30, 60,120,
- 3,128, 7, 15, 30, 60,120,240,248,175,163, 70, 72,103,222,188,121, 94,103,112, 58, 91,188,231, 78,151, 23,213,207, 7,190, 62,
- 69, 16,137,203,193,178,214,105, 97, 2, 1, 3,134, 8,172,255, 50, 4,132, 48,160, 68,104,157, 3, 11, 51,126,221, 42, 2,165,
- 20, 97, 76, 56, 60,108,159, 15,128, 38,176, 38,240, 84,193, 58,221,203, 4,219,152,218,221,120,255,120,121,188, 60, 94, 30, 47,
-239,102,201, 59,122,244,168,215,242,162,163,163,255,243,242, 60, 54, 0,254,107,248,115,239, 57,196,246, 55, 33, 52, 4, 40, 83,
- 19, 28,253, 91, 2, 33, 35,196,184,123, 45,216,169,108, 10, 66, 24, 16,134,129, 36, 16, 24, 25, 91, 14, 64,136,161,131, 41,178,
-178,133, 86, 26,119, 3,202,253,123, 41, 0,136,168, 9, 3,135,141,188,144,115,236,144,161,184, 82,223,217,162,213, 35, 46, 46,
- 46, 4, 64, 5,111,135,222,221, 72,251,249,123,105,167, 14,237,149, 37, 37,250, 6, 21,124,186,139, 32, 77, 76, 76,116,172, 3,
-208,160,107, 78, 76, 76,244,186, 28, 48, 15, 30, 60, 26, 41, 2,192, 97,205,119,223,184,109, 77,204,156, 49,199,229,203,218,216,
-242, 26, 19, 89,217, 34,140, 29,109,193,223,199,124, 33, 22, 9, 33, 20, 8, 33, 18, 81,248, 8, 76,128, 48, 16, 66,232, 16,219,
-195, 12,137,216, 7, 20, 64,203,230,192,132,113, 44,118,109,113,143,252,207,157,202, 65,199,238, 29,208, 42, 34, 4,151, 46,156,
-110, 23,220,162, 61,154,180,178,224,247,205,155,145,158,158, 94,126,187,231,199,167,167,167,143, 75, 77, 77,221,202,109, 39, 36,
- 36, 60, 16, 23, 23,183,149,127, 53, 92,227,216,223,233,212,172,255, 71,246,200,132, 14, 74,150, 45, 69, 69, 43,157,242,244,137,
- 13,168, 54,180, 68,255,152, 97,255, 90, 18, 75, 76, 76, 84, 46, 92,184, 16,132, 16,183,150,237,117, 7, 92,177,152, 70, 88,110,
-158, 71, 3, 13,176,122, 65, 41, 82,190,250,170,206,231,205, 21,248,113,172, 22,200,173, 33,224,176,150,128,253, 57, 59,174,140,
-200,163,113,193, 85, 3,228,224,172, 54,192, 29, 21, 1, 96,112,107,251,193,184, 49, 38, 80, 8, 32, 20,136,112,207, 64,130,102,
- 77, 25, 8,133, 12,124, 68, 2,116,237,204,224,194, 69, 51, 98, 99, 24,132,135, 73,240,251,238, 32, 0,128,128,234, 96, 45,133,
-109,113, 73,254,199,178,179, 17,217,170, 53,142,101, 30,192, 65,163, 9,234,107,106,136,125, 2,209, 45,122, 8,250, 12, 25, 3,
-229,175,169, 0,220,171,141,127, 19,136,127,100,106,106,234,174,197,139, 23, 35, 59, 59,155,235, 48,229, 0,158,121,252,241,199,
-127, 75, 72, 72,136,139,139,139,219,245,175,123, 41,142,166, 83, 31, 97, 25,132,140, 17,122,189, 5, 21, 26, 95, 12, 29, 62,217,
-163,251,191, 33,237, 59,105,144,111, 25, 30,157,210, 15,145,237, 38, 40,131,130,130, 97, 50,155, 81, 82,114, 13,205, 11, 46,226,
-108,110, 30,246,239, 43,163,247, 12,153,232,213,115, 77, 73, 73,161, 14,202,249, 78, 83,142, 82,224,250,114,184,182,213, 1,165,
-184, 77,229,128,111,225,251, 66, 55,110,220,120,227,122, 10,183,141,188,168,148,128,128, 54,194,125,167, 5, 63,131, 28,124,220,
-145,227,109, 85, 50,109,171, 33, 57,224,241,100, 13, 98,167,124, 86,175, 33,247,251,239,191,219,183,199,142, 29,139,237,219,183,
-215,187,205,227,230,147,191,227, 62, 71, 67,160, 94, 3, 96,223,222,131, 24, 50,116,224, 45,107, 52,235, 65,253, 84,199, 82,146,
-222, 86,159, 98,132, 2,168,203,132,104,209, 76,132, 22,205,196,168,174, 22, 65, 34, 18,194, 34,244, 65,191, 94, 4,125,123, 11,
-192, 16,145,181, 4,166, 72, 12, 17, 99, 0,145,136, 97,214, 2,102,104,234, 37,255,189,187,119,161,125,203,166, 56,241,247, 9,
-188,250,206,155, 53,218,247,222, 91, 75, 40, 35, 32,232, 23,211, 15,191,111,223,229,209,202,123, 44,203, 74,179,179,179,149,231,
-206,157,131,175,175, 47,124,125,125,101, 99,199,142, 85,121,168,204,100,169,169,169,187, 56,226,119,232, 28, 33, 0,198,124,253,
-245,215,215, 30,127,252,241,116, 0,163,227,226,226,210,239,196, 14,190,106,213, 42,233,236,217,179,221,190,238,245, 63,173,145,
-246,236, 28,168,108,215, 82,143,224, 32, 31, 48,140, 31,116, 58, 51, 74,203,116,200, 72, 95, 65, 37, 65,253, 48, 48,118,184, 91,
-253, 72,132, 34, 76,122,160,183,178, 71,143,110,184, 82,164,198,225,163, 71, 80, 93,173, 65,112,112, 32,162,162,218,129, 17,136,
- 96,177, 20,224,232, 95,123,105,116,223,161,255, 42,239, 38, 49, 49, 81,249,236,179,207,218,183, 23, 46, 92,136,229,203,151, 43,
-191,170,199, 43,244,136,140,238,208, 8,128,205, 72,167,105,105,105,112,182,176,210,173,132,163,151,173, 80, 36,203, 40,109,152,
- 17,192,180,123,216, 78,222, 89,239, 7, 56,117,195, 90,132, 48,136, 8, 99,238,218,231,247, 95,133, 35,217, 59, 51, 10, 92, 70,
- 0,246,237, 61, 8, 0, 13, 54, 4,246, 62,115,182,222,227, 67, 63,237,228,181,178, 32,132,120,181,218, 94,186,170, 25, 68, 66,
- 17,218,180,170, 70, 85,149, 8,135, 79,180,129, 64, 32,128,128, 8, 32, 22,153,209,163,147, 22, 93, 58, 9, 64,192, 64, 44,242,
-129, 88, 64, 16,211,219,136,176, 80, 22,235,190,173, 95,118,183,246,205,113, 33,183,248, 6,242, 7,128, 87,223,120,133, 44,121,
-103, 25,109, 57,184, 55, 66, 67, 2,221,110,175, 78,167,147, 46, 95,190, 92,121,225,194,133, 26,246,134,193, 96,192,196,137,238,
-123,155,169,169,169,187, 29,201,223, 9,154, 36, 37, 37,149, 47, 90,180,104,231,237, 30,162,168,139,252, 15, 30, 60,168,156, 61,
-123,182,219,109,235, 28, 21,166,140,104, 94,137, 38,225,254,104, 29,209, 2,126,254,126,184,112,161, 16, 22, 11,139,136, 86,129,
-248,231, 84, 38, 86,159, 57, 43,157,245,216,156,122,149,233,241,227,123,233, 67,227,187,161,109,219,214, 56,121,234, 2, 14, 31,
- 62,133,146,107, 85,160, 20, 8, 13,245,133, 86, 91,141,232,232, 30, 40, 47,175, 64,225,225,163,248,238,135, 28,233,140, 71,221,
- 55, 84,238,112, 72, 1,235,226, 83, 28, 62,249,228, 19,110,219,163, 40, 64, 98, 98, 34,117, 12, 9, 59,122,144,142, 33,233,198,
- 24, 94,120,231,157,119,104,155, 54,109, 26, 92,139, 63, 46, 46,142, 16, 66,232,134, 13, 27,234,173,177,207, 97,238,220,185,212,
- 89,132, 96,245,234,213, 82,110,113, 32,103, 70,172, 92, 46,167,117,149,114,117, 92,207,129, 82, 10,185,124,174,178, 33, 81,136,
-218,242, 98, 95,174,198,161,247, 3,106, 16, 63,143,187,211,251,175,221,135, 26, 52, 4,208, 80, 67, 96,232,167,157,234, 52, 2,
-188, 33,127, 14, 25, 25, 25, 40, 44, 44, 4, 0, 68, 68, 68, 80, 79,140, 0, 1,213, 65, 72, 44, 16,139, 68, 56,122,162, 41, 4,
- 66, 33, 2, 69, 26,107, 30, 64, 0,131,194,194, 64,244,238,193,130, 16,130,132, 9,102, 80,150, 1,136,143, 53,240,134,170, 58,
-229,106,203, 47,162,168,172, 26,139, 94,127,189,206,182,148, 87,148, 65, 93, 82,100,147,229, 54,113,215, 38,127, 0,192,182,109,
-219, 96,177, 88,164, 15, 61,244,144, 75, 5,151,158,158, 62,178,246,210,191, 92,135,169,168,168,145,143, 24,242,198, 27,111, 32,
- 61, 61,125,212,157, 52, 20,192,145,191, 39,191, 89,255,211, 26,105,239,206, 6,248,250,134, 64,226, 35, 70,251,246,145,104, 19,
- 25,137,202, 74, 21,202,202,170, 33, 22, 11, 16, 22, 42,129,208, 55,164,222, 90,241, 0, 32,164,133, 8, 12, 8,135, 86,103,198,
-137, 19,103,113,185,168, 2, 87,138,170,161, 51, 72,208, 54,194, 12,137,143, 0,103,115,242,208,177, 67, 7, 92,190, 82, 9,157,
- 57,200,165, 76, 27,209, 81, 87,251, 61, 29, 14,168, 75,166, 55,178, 56,239,127,225,194,133, 55,236,127,246,217,103,189,202, 5,
-112, 70,162,181,199,142, 27, 43,170,144,153,153,169, 68, 3, 23,228,217,181,107, 23, 77, 77, 77, 69, 66, 66, 2,156, 13, 7,184,
- 19,169,226,200, 31, 0,178,178,178,148, 12,195,212,104,211,234,213,171,165,238, 56, 61,131, 7, 15,150,113,114, 26, 35,226,178,
-225, 89,127, 76, 94,174,113, 74,252, 17, 97,140, 77, 75,185,247,120,199,142, 29, 91, 35, 74,114,223,125,247,213,184, 87,124,216,
-255,206,129,199, 57, 0,141, 21, 17,104, 76,156, 61,107, 53, 44, 10, 11, 11, 61, 50, 2,132, 66, 33, 68, 2, 17, 68, 34,130,225,
- 67, 0,173,198,128,243,185, 98,136,132, 34, 8, 45, 66, 12, 26, 72, 33, 22,137, 32, 16, 48, 0, 37, 40, 83, 3,135,142, 8,193,
-178, 44,128,146, 58,229, 30, 57,154,139,234,234,186, 43,112,126,240,198, 27,212,199, 71, 2,157,174, 2, 22,214,236,246,117, 30,
- 57,114,164,110,163, 67,171,117,139,104,106,135,254,157, 89,134,191,254,250,171,227,249,233,183, 35, 10,224, 44,196,239, 72,254,
-131, 7, 15,118,123, 21,186,214, 17,205,149, 12,115, 17,102, 11, 11,163,201,140,146,107,101, 16,137, 37, 48, 24, 76, 48,153, 45,
- 48,155, 89,152, 45, 20,229,234,107, 46,101,137, 69, 26, 72,124, 91,163,180,180, 2,149, 85, 90,148,169,117, 8, 10,239,131,123,
-122,247, 70,214,190,237,104,101, 52,163,162,178, 2, 93,186,116,128,143, 88, 8, 77, 85,217,191, 69, 87, 72, 41,165,246,177,127,
- 71,172, 88,177,194,171, 92,128,133, 11, 23,214,136, 38,212, 62,230,174, 1, 96, 93,234,153,243,104,195, 48,106,212,168, 26,253,
-149,115, 16, 10, 10, 10,148,233,233,233, 94, 45, 76,149,158,158,110, 39,127,110, 56, 96,227,198,141, 46,201,181,118,164, 42, 51,
- 51, 83,201, 37,190,201,229,114,122,224,192, 1,229,172, 89,179,236,199, 15, 28, 56,160, 36,164,254,230, 13, 30, 60, 88,230,184,
-204,240,220,185,115,105,125,247,202,149, 62, 76, 72, 72, 64,252,224,116,252, 4, 96,202,114, 13, 6,188, 92, 93,239,189,143,157,
- 82,255,189,170, 61,198,239, 42, 39,128,199,205,143, 6,212, 21, 1,184,165,241, 29,103,158,126, 67,188,255, 90, 30, 43,206,158,
- 61,139, 21, 43, 86,184,189,212,164, 64, 32,196,160, 88, 22, 2, 70,136, 67,217, 18,156, 57, 43,193,253,247, 2, 15,220, 7,140,
- 31, 75,208,178,185, 24, 18,177, 15, 36, 98, 31,248, 74,124, 16,209,210, 7, 18,177, 4, 18,113,253, 75, 98,254,239,213,215,200,
-210,247,223, 38,117, 41,146, 14,237,219, 33, 56,196, 31, 18,214,136,106,173,233,150,119,138,189,123,247,238,218,187,119,111, 13,
-194,119,252, 0, 64,105,105, 41,198,143, 31,127,219,188,252,172,172, 44,165,163, 55,196,237, 3,128,129, 3, 7,122,228,201, 89,
- 44,128, 70,107,130, 70, 99, 68,101,165, 1, 87,175,170,113,249,242, 53, 84, 85, 25, 80, 93,109, 66,117,181, 17, 26,141, 9, 21,
-229,174,103,100, 26, 12,102,232,245, 22,152, 76, 70, 4, 6,138,209, 38, 34, 8,126,254,254, 0,128,168, 14,145,104,221, 42, 8,
-193, 65, 18, 80,106,129,201,204,194, 96,208,252, 43, 20, 73, 98, 98,162,242,185,231,158,171,151,204,185,169,129,110, 70, 39,100,
- 54,163,193, 41,150, 47, 95,142,175,190,250,202,227,165,134,173, 97,113, 57,117,252,112,132, 90, 88, 88,136,212,212, 84,143,151,
-162,221,181,107, 23, 77, 75, 75,115, 36,127,196,197,197,145,248,248,248,122,127, 55,111,222, 60, 16, 66,236, 94,253,170, 85,171,
-164, 0, 48,104,208, 32,153,163, 17,235,120,156, 82,106, 63,238,198,213,214,240,226,157, 25, 14,174,140, 9, 0,104,210,164, 9,
-136,131,247,208, 80,121, 60,238, 60,242,119,182,237, 85, 4,224, 78,242,252,175, 43,120, 11, 4, 2,129,199,191, 27, 18,203,162,
- 89, 83, 31, 84, 86, 10,225, 35, 52,195, 71, 44,128,234,160, 24,247,203, 68, 16,139, 68,168,172, 20, 97, 95,182, 63,130, 36, 4,
- 12,195, 96,108,156, 17, 19,239,167, 96, 24,138,119,255,242,188,157,233,233,233, 84,224, 39, 65,153,168, 9,252, 76,151,112,174,
-144, 98,164,116,184,219,191,143,142,142,198,254,253,251,157, 30,243,243,243,115, 91, 89,170,213,234, 81, 54,197,131, 89,179,102,
-217,247,151,150,150,218,191,207,154, 53, 11,197,197,197,183,229,121,206,158, 61, 91,149,149,149,133,204,204, 76, 37,203,178, 50,
-134, 97,192,121,254,117,141,155,214,135,130,139,151,101, 77,131,180, 74, 31,177, 0, 70, 19, 11,189,225, 18, 46, 94, 42, 69,153,
-186, 18,101,101, 90,148,150,233, 80, 90,166, 67, 72, 88,164, 75, 89, 87,175, 81, 20, 93,189,134,110,221, 58,160, 92,173,134, 72,
-200,160,178,234, 18, 52,229, 44,186,119,212,160,121,211,166,240,243,243,131,143,143, 47,174, 20, 85,129, 8, 66,221, 37, 88,226,
- 64,142,141, 50, 11,160,177,103, 16,212,229,173, 3, 53,114, 1,220,133, 10, 0, 22, 44, 88,112, 67, 84,193, 97,152, 65,229, 77,
- 59, 39, 79,158, 92,195,131, 77, 77, 77,181,147,215,195, 15, 63,140,209,163, 71, 19,103,133,103,220,244,252,237,168, 29,105,168,
-141,190,125,251, 18, 74,169,221,203,207,202,202, 82, 18, 66,236, 75, 3,207,154, 53, 75,149,153,153,137,204,204, 76,229,172, 89,
-179,200,193,131, 7,237,199, 87,174, 92, 89,167,220,204,204, 76, 37,195, 16,217,129, 3,214,119, 98,222,188,121,248,235,175,163,
- 50,142,194, 15, 28, 56,160,228,174,223, 29, 99, 98,229,202,149,248, 66, 22,138, 41, 43,180, 0,172,195, 1,142,152,178, 66,107,
-191,159,179,101, 34,158, 89,239, 22,163,125,241, 7, 53,141,238,165, 47,225,175,191,254,114,127, 22,192,205, 32,126,199, 92,128,
-134,120,255, 53, 61,249,154,228, 63,118,236, 88,200,229,114,151, 67, 1, 77,154, 8,192, 16, 1,154, 54, 17,160, 83, 7,138,203,
-151,133, 96, 4, 4, 34,161, 16, 34,161, 8,199,142,251, 35,204, 95, 4,129, 64,128, 33, 3, 45,240,245,245, 1,203, 82,128, 90,
-188, 34,255,128,230,109,112,181,154, 66,115, 78, 5, 33, 17,224,133, 55, 94, 37, 30, 42, 54,217,197,139, 23,149, 23, 47, 94,188,
-225,122, 39, 77,154,228,150,178, 76, 72, 72, 24, 93, 90, 90,186,147, 35,121, 0, 24, 63,126, 60, 86,175, 94,109, 63,167,178,178,
- 18,197,197,197,248,237,183,223,144,144,144, 48,242,118,116,222, 65,131, 6,201, 50, 51, 51,149, 89, 89, 89, 74, 46, 89,108,208,
-160, 65, 94,141,225,206,120,116,182,234,199,245, 41,160,133,149,208,234, 76, 80,251,232, 65,161,134, 94,111, 70,101,165, 1,197,
-215,180,184,124,165, 26,195,100,237, 92,202,210, 25,155, 32,239,124, 9,162,218,183, 69,251,246,173, 81, 90,122, 13,161, 33, 22,
-116,234, 20,140,102, 77,163, 32,241,245, 69,121,121, 53, 14, 31, 57,141, 75,133,149,104,209,186,199, 93,171, 64, 40, 64, 9,129,
-140,227, 82, 71, 82,173,111,222, 62,181, 37, 11,222,232, 62,162,198,172,178,148,148, 20,217,138, 21, 43,148,181, 13,128,143, 63,
-254,152, 43, 48, 84,175, 60, 74, 41, 37,132, 16,185, 60,212,161, 77,244, 6, 98, 78, 77,181, 14, 17,196,199,199,187, 21,254,175,
- 57,164,176,203, 41,249,187,139,193,131, 7,203, 14, 28, 56,160,228,162, 14, 67,134, 12,145, 57, 59,206, 37,227,185, 34,108,110,
-108,125,223,190,253, 74, 66, 8, 8, 33,232,219,183,143,172,111,223,190, 42, 7, 3,193,118, 46,224,234,125,225,228, 49,147,213,
-224,228, 37,140,140,172,241,160, 38, 47, 63,105,151,231, 14,248, 28,128,187, 7, 46, 13,128, 59,209,227,231,240,200, 35,143, 52,
-232,247, 12,195, 64, 32,176,126,186,117,102, 16,221,203, 2, 31,177,196,106, 0,136, 68,184,103, 32,224,227, 3,136, 4, 62,104,
-210, 68, 2,129, 64, 3,139,133, 5,203,122, 30,182,215,150, 21, 65,210,186, 43,206,167,255,128,166, 66, 6,143,189,250,138,199,
- 10,197,215,215, 87,245,202, 43,175,200, 26, 50, 13, 48, 46, 46, 46, 93, 46,151, 99,254,252,249,246,125,156,167, 95, 89, 89, 9,
-173, 86,139,217,179,103, 3, 0,190,252,242, 75, 40, 20, 10,229,237,120,182,179,102,205, 82,177, 44, 43,227, 60,255,216,216,216,
- 6, 37,112,181,110,215, 5,217, 7,254, 64,179, 38,126,240,243,179,118,123,131,193,130,202, 42, 35,202,212, 58,180,105,223, 3,
- 67,239, 25,225,242,153,140, 27,247, 48,217,241,251,183,244, 64,214, 63, 24, 54,164, 15,218,181,107, 7,147, 81,143,232,190,189,
-225, 31, 28,140, 11,121, 5, 40,188, 92,142,125,153,167,160,174, 10,198,164,193, 35,238,218,152,233,188,185,114, 0, 80, 2, 4,
-243,228,114, 59,129,179,181, 72,159, 97,136,213, 90,176,241, 50, 1,208,199,201,120,227, 92,185,156,130,194, 33, 83,133, 32, 49,
- 49,177, 70, 20, 96,193,130, 5, 32,132, 96,238, 92,185,146, 99,127, 16,160, 79,159,190,206,200,203, 30,142,119, 69,114,238,146,
-127,109,196,199,199, 99,212,168, 81,178,134,244, 99,216,198,234, 7, 14, 28, 40,155, 49, 99,134,170,174,227, 14, 99,251,117,130,
-203, 29,224,140, 47,235, 48, 2, 81,213, 54, 42,220,109, 95,109,121, 27,158, 13,176,222,116, 73,115,251, 57, 27,158, 45,176, 27,
- 4,127,252, 93,191,238,115, 86, 7,128,207, 1,184, 75, 13,128,123,134,196,222,148, 49,159,198,242,252, 29, 59,146, 55, 40, 83,
- 19,180,108,206,216, 75,254,238,216,101, 29,223,247,241,145,192, 71,236,131,241,247, 17, 72,124,196,240,149, 16,148,149, 10,144,
-117, 56, 16, 22,214,130, 54,173, 61, 27,215, 77, 79, 79,167,229, 90, 29,212,217,219,208,169,141, 8, 39, 10,189, 31, 23,102, 24,
- 70, 21, 27, 27, 75, 98, 99, 99,189,150,145,144,144, 32,251,252,243,207,149, 92,152,191,180,180,116,202,192,129, 3,171,119,238,
-220,185,117,226,196,137, 99, 74, 75, 75,201, 99,143, 61,246, 71, 66, 66,130,236,118,118, 78, 91,168, 95,230,240,221,251, 62,103,
- 37,119,154,115,250, 36, 46,231, 93, 0,195, 16, 88, 44, 20, 18,223, 48,116,238,214, 19,147, 30, 76,112,187,163, 95, 46, 97,101,
-101,165,151,149,122,189, 25,189,122, 70, 33,162, 85, 19, 20, 92,188, 10,245,241, 92,156,201, 41,192,174,221,199,112,161,144,226,
-241, 39,158,246,234,229,185, 83,138,255,176, 63,133,122,125, 94,244, 18, 55,229,229,126,139, 21, 43, 86,216, 13,128, 21, 43, 86,
- 0,121,171,111, 56,215,153,188, 58,162, 2, 55,232,172,134, 22,235, 33,132, 52,168,239,113, 36, 95, 23,185,187, 58,238, 44,170,
- 80,235,183,206,228,185,255,156, 47,108, 68,218,138, 25, 86,221, 48,178,109, 13,242, 7,128,132,113, 3,172, 95,212,127,185, 52,
- 0,248, 58, 0,119, 14, 82,150,190,116,195, 48,128, 71, 6,192,157,156,240,225,109,241, 31, 71,100, 31,241,129, 68, 44,198,248,
-113, 4, 12, 33,136,237,111,198,241, 19,190, 96,136,117,204,191,188,156, 65,171, 22, 2, 48, 68,140,191,143,139, 33,241, 1,140,
- 38, 35, 46, 20,248,122, 68,254,185, 57, 71, 49,112,212, 3, 16, 54, 25,136,220,156, 44, 8,139,210,240,226, 11, 47,211,101, 31,
-190,127, 91,110,176,173, 94,189,172,127,255,254,202,197,139, 23,163,103,207,158,197,106,181, 26,253,251,247,151,169,213,106, 60,
-243,204, 51,202,132,132,132, 59,162,174,125, 67,137,191,182, 17, 48,244,158, 17, 88,253,253, 55,210,150, 45, 90, 42,253,253,253,
-221,242,250,111, 80,176, 51,230,168, 0,144,181, 63, 40,232,201, 51, 7,209,178,121, 0, 36, 18, 17,170,171,141, 40,188, 82, 9,
- 34,108,131,199,159,152,193,103, 75,185,131, 35,139,128, 14,255,135, 26,211, 11, 15, 63,215, 16,178,110,112,147,230,206, 13,115,
- 48, 36, 26,135,208, 92,145,178, 39,164,221,208,122, 6,206,238, 89,194, 96, 31,235,181,234,174, 88, 63, 60,238, 90,244,237,219,
-215,158,240,151,178,244,165, 27,142,185, 52, 0, 26,187, 30,255,173,174,239,239, 81,231, 7,129, 90, 77,224,215,130, 32, 60,140,
-160,127, 63, 19, 36, 98, 1,124,196, 38,132,135, 73,108, 74,128, 96, 80,127, 11,178,142,136,172,209, 2, 55,149, 76,122,122, 58,
-237,209, 37, 8,139, 22,188, 13,157,184, 53,126, 78, 47, 68,135,206, 86,207, 61,224,208,111, 88,244,252,203, 52,233,163,219,103,
- 4,196,197,197,145,244,244,116,233,210,165, 75,149,142,209,129,198, 48,174,238,100,216,138,253, 52,248, 26,167, 63, 42, 39,123,
-247,103,208,146,210, 18,232,138,180,144, 72,194,209,186,125,111,175,140,138,187, 13,214,114,216,141,116,153,121,171, 97,159, 17,
-144,183,230,182, 95,155,171,228,190,127, 27,198, 60, 48,197, 35,207,221, 85,236,145,207, 1,184,179,140,128,186,200,223,101, 4,
-224,191, 0, 10,107, 86, 63, 97, 40, 40, 40,194, 66, 40, 50,246, 10, 33, 17,139,224, 35, 22, 98,194, 56, 10, 74, 89,132,134,155,
- 97,182, 16,176,172,197,166,252, 92,163,119,100, 53,238,127, 56, 1,213,194, 78,104, 22,224,143,105,147,194,176,110,211,113,187,
- 17, 96,178,252,124,219,175,159, 51, 4,248, 87,198,251,168,194,191,245,218, 82,212, 31,144,196,208,151,110,100,134,212, 48,111,
-229, 33, 49,244,165, 27, 15, 28,126,174, 65, 94, 63,143,134, 33,254,169,207, 27,173, 15,255,219,157,135,187,205, 8,112,233, 0,
-247,237,219,151, 31,180,225,193,131, 7, 15, 30, 60,254, 99,224, 11, 61,243,224,193,131, 7, 15, 30,188, 1,192,131, 7, 15, 30,
- 60,120,240,224, 13, 0, 30, 60,120,240,224,193,131, 7,111, 0,240,224,193,131, 7, 15, 30, 60,254, 29,168, 49, 11, 96,222,188,
-121, 94,103,112, 58,171,173,221,216,242,166,207,158,235,242,119,154,178, 34,251,119,255,176, 22,246,239,107, 87, 37,223,112,110,
- 83,217,227, 46,229,237, 92,126,189, 98,222,232,103, 63,183,127, 47, 81,126, 13,111,218, 87, 23,188,109, 95, 93,112,214,190, 7,
- 31,147,187,252, 93,182,114, 43, 34, 35, 35,145,159,159,143,254,178,251,237,251,127,249, 94,113,211,239,223,227, 87,174,212,219,
- 95, 12, 66,161,116, 81, 97,161,125,202,226,231,205,155,219,207,255,186,101,203,155,222,255,106,203,219,178,101,139,116,219,182,
-109, 53, 42, 37,142, 27, 55, 78, 54, 97,194, 4,213,237,120, 63,142, 30, 61,234,181,188,232,232,232,155,221, 62, 50,111,222, 60,
-220,201,250,229,118,200, 91,183,110,221,212, 94,189,122,173, 59,126,252,248,195,211,166, 77,251,185,161,242, 28, 23, 58,114,204,
-200,191, 27,239, 95, 99,247,231,255,154, 60,143, 13,128,218, 48,155,205, 82,189, 94, 15, 34, 16,129, 16, 2,139,217, 4,177, 72,
- 8, 31, 31, 31, 85, 67, 45, 15,179,217, 44, 5, 0,161, 80,216, 32, 89,154,178, 34,248,135,181,176, 19,127,139, 54,145, 0,128,
-162,139,249, 94,201,219,185,124, 62, 70, 63,251,185,157,184,190,216,146, 5, 0,120,106, 66, 44,254,141,200, 86,110, 69,127,217,
-253,200, 86,110, 5, 0,220, 31, 63, 29, 0,144,159,127,251,239,223,167, 87,175, 74,115, 0,101,103, 64,150, 3, 88,215, 80, 95,
-252, 34, 0, 32,118,233,178,219,122,223, 84, 42, 21,221,182,109, 27,244,122,125,141,253, 18,137, 68, 25, 20, 20, 4,169, 84,122,
- 71, 78,135, 34,132, 12,237,210, 62, 98, 13,181, 88,254,159,189, 43, 15,111,170, 74,223,239,189, 89,154,238, 27,101, 95, 91,168,
-236,148, 85,100, 77,160,128, 64, 91, 17, 40, 42, 56, 14, 50, 51, 13,168,140, 2, 74, 29,112,126, 46, 35, 8,142,130,219, 8, 45,
- 51,138, 11,168,180, 72, 41, 80, 40, 20, 18, 22, 1,129,178,239,148,178,182, 64,247,116,201,158,123,126,127,164, 55,164, 33,203,
- 77,154,210,130,247,125,158, 62, 77, 78,110,190,220,123,238, 61,231,253,182,243, 29,245,229,155,119,255, 65, 8,217,202,219, 65,
- 78,148, 78,157,110,212,137, 19, 39,130, 10, 11, 11, 91,134,133,133,133,244,239,223,191, 32, 48, 48,240, 7, 79,229,173, 95,191,
-126,244,244,233,211,247,174, 95,191,254,175, 0,130,159,127,121,246, 44, 0,204,153, 51,103, 94, 2,144, 1,128,113, 71, 30,187,
-231, 9, 75,252,245, 25,111,182,187, 36,122,107, 73,159, 35,165,132, 71, 19,243, 0, 88,163,178,170, 90,218, 42,122,160, 98,100,
-175,174,240,243, 17,129, 16, 2,147,137,224,236,149, 27,184,118,122,191,204,215, 71, 4,129, 64,224, 17,121, 7, 72,174, 75,123,
-116,201, 87,156,189, 28, 41,171,209,117,244,152,248, 1,192, 55, 56, 28, 53,101,119, 45,196,239,204, 35,192,197, 82, 29, 52,227,
-109,236, 90,249,154,101, 32, 57, 58,206,217, 26, 75,219,223, 20,139,197, 0,204,101, 50, 25,198, 60,190, 77, 38,147,229,252,105,
-129,136,179, 21, 13, 0,173,154,155, 75,117,234, 43, 43,160, 51, 26, 1, 0,213, 70,179,188, 78, 99,255,130,206, 61,250,114, 34,
-126, 0,232, 51,100, 52,142, 41,182, 89,136,223,209,113, 15,179,255, 0,224,181,123,247, 8, 0,140,243,247, 71,118, 77,141,130,
- 37,126, 0,184,180,115,215, 3,199,197,180,106,197,233, 60, 85,254, 37,210,220,146,163, 40,184,121, 10, 93, 58, 12,198, 96,137,
-212,237,103, 56, 51, 51,243,153,237,219,183,179,228,111, 4,160, 5,224, 7,128,209,106,181, 66, 95, 95, 95, 84, 86, 86, 74,237,
-121, 2, 26,153,252, 91, 12,140,233,181, 61,251,167,213, 1, 53, 5, 23, 48, 44,113,206,122,138,162, 94, 34,132,100, 52,181,137,
- 41, 39, 39,135,212,167, 62, 5,151,205,192,156,193, 96, 48, 72,143, 28, 57,162, 56,119,238,156,165,173,164,164, 4,151, 47, 95,
- 70,171, 86,173,190,151, 74,165,178,192,192, 64,174,247,151, 94,191,126,253,251, 0,158, 26, 54,110,146,239,250,245,235, 91, 60,
-255,242,236, 64, 0, 38, 0,236,131,251, 68,237,113, 35,184, 94, 31, 59,222,228,114, 57,113, 52,222,216,227, 92,141, 55,185, 92,
- 78,246, 29, 58, 2,129, 64, 8,147,201, 8, 85, 85, 53,166, 79,121,134,124,242,201, 39,245, 34,108, 91,165,162,190,247,133,135,
-107,216,219,246,151, 5,167, 74,128, 53, 26,189,116,116,194,116, 69,187,230,193,240,147, 8,193, 48, 12, 76, 12, 32, 20, 80, 8,
- 11,238,138, 30, 93,218, 43,114,178,183,201, 76,134, 26,169,187, 74,128, 94,175,151,118,235,113, 77,209,167,235, 53, 8,104,147,
- 66,121,172,141, 76, 44, 18,185, 37,163,166,236, 46,124,131,195, 17, 28, 20, 8, 0,150,255,246,142,107,217,174,163, 75,111,192,
-174,149,175, 97,208,140,183,241,231,231, 38, 3,128,229,191,189,227,254,147,121,196, 45,237, 90, 32, 16,160,109,219,182, 16, 8,
- 4,208,235,245,168,169,169,129,201,100, 66,121,121,185, 71, 55, 55, 64, 40,192, 55,159,109,130, 79, 48,112,239, 58,112,180,186,
- 0,197,119,243,240,195,202,127,184,101,245,247, 25, 50, 26,109, 91,155, 67, 36,109,237,144,127,199,142, 29, 45,225, 0, 0,184,
-125,251,182, 87,250,143, 75,113,213,215,238,221, 35,227,252,253,241,175,215, 94, 5, 0,252,203,138,248,127,188,124,185, 46,249,
-187, 81,173,117,239,245, 31,165, 29, 94, 22, 42,222,110,255, 34,116, 76, 44,124, 24,130, 11, 37,187,241,237,191, 55,200,166,246,
- 78,225,250, 12, 10,179,178,178, 50, 52, 26, 13,214,174, 93,171,157, 57,115,166, 4, 64, 0, 0,102,237,218,181,250,153, 51,103,
- 10, 53, 26, 13, 36, 18,137, 34, 33, 33,161, 94, 19,221,175,191,254, 42,221,185,115,167,162,190,181,236, 45,207,142,152,254,191,
- 47,255,181,208, 55,228,252, 79,240,189,180, 7,239,141, 10, 13,252,251,150,226, 15,106, 45,207, 38, 69,254, 27, 54,108, 64,121,
-249, 24,146,150,150,232,246,181,127,243,205, 55,210,250,144, 77, 77, 77,141, 52, 51, 51, 83, 81, 85, 85,101,247,243, 59,119,238,
- 32, 61, 61, 93,209,173, 91, 55,217,224,193,131, 93, 61, 55,212,250,245,235,127, 24, 54,110,210,180,203, 39, 14, 10,219,182,110,
-105,124,254,229,217,117,230,221, 61,219,126, 69,175, 94,189,186,174, 95,191,126,124,175, 94,189, 50, 1,224,192,129, 3, 78, 73,
-149,203,120,147,203,229, 4, 20, 5,184,168,242,183,122,245,106,114,183,168, 4, 39,206,158,183,180,105,181, 58,124,252,101,106,
-181,124,230, 11, 60, 97, 63,198,120, 32, 9,176,170,170, 74, 58,108,236,179,138,174,237,195,225, 35,162,193, 48, 12,238,222,189,
-139, 51,167, 78, 64,111,100,192, 48, 4,225,193,126, 24, 59, 62, 78,161,209, 25,221,254, 65, 31, 81, 17,162,218,223, 5, 4, 20,
-186,119,185, 5, 31,225, 61,183, 45,127,107,242,127,192,194,171,172,194,221, 91,215,225, 27, 28,238,208, 43,224,140,188,108,241,
-221, 47,191,226,213,132, 65, 24, 52,227,109,135, 86,173, 61,136,197, 98, 8, 4, 2, 4, 5, 5, 33, 63, 63, 31,229,229,229,102,
- 69,202, 67,242,111,213,188, 5, 2,132, 2, 60, 59,247, 67,140,159, 62, 4, 91,207, 22,224,174, 6,245, 38,127, 91,220, 46,188,
-139,115,199,126, 67, 68,104,144,153,252,133, 2,175,244,223,211, 83,254, 12, 0, 8, 21,138,220, 34,127, 0,248,231, 87,255,193,
- 63,191,250,143,133,252,179,107,106,240,214,216, 56,243,135, 17, 98, 78,215,253,221,141,101,210,191, 45,120, 74,241,114,135, 87,
- 32,162, 3,224, 15, 63,208, 16,160, 77,139,161,120,237, 95,243, 21,249,173, 87,114, 82, 35,148, 74,165, 1, 0,190,251,238, 59,
- 53, 0, 9,187,141,242,218,181,107, 25, 0,126,214,219, 42, 43,149, 74,143,226,114,106,181, 90,234, 78, 59, 7,203,127,216,192,
-126, 49,234,180, 95, 55,201,251,246,140, 22,212,156,223,141,235, 69, 85,184, 83,161, 6, 67,136, 71,137,192, 73, 73, 73, 36, 49,
- 49,141,172, 91,183,206,171,133,196,172,200, 31, 97, 97, 57, 30,201, 56,114,228,136, 34, 37, 37,133,162, 40,202,162, 12,184,121,
- 14, 15,144,255,177, 99,199, 48,125,250,116,107, 15, 1, 46, 94,188,168, 80,171,213, 78, 55,204, 90,191,126,253,107,195,198, 77,
-138, 91,178,104,158, 48, 45, 45, 13,255,253,242, 19, 97,173,199,200, 66,254,105,105,105,248,234,171,175,208,171, 87,175, 76, 87,
-227,205,150,252, 29,141,183,241, 67,107,189,128,129,254, 46,229,125,250,229, 42, 11,249, 23,149,148,162,168,164, 20,170,170,106,
-136, 68,194,128, 85,107,127,210,218, 90,241, 60, 30, 13,196,196,196, 60,240,231, 84, 1, 48,153, 76, 36,188, 99,111,116,108, 25,
- 2,173,193, 4,138, 2,178,179,119,224,251,239,214,226,244,169, 83,120,107,254, 27, 16, 8,104, 48, 38, 6, 65,126, 62,232,216,
-123,152, 66,163,209,112, 30, 96, 6,131, 65,218,163,203, 13, 69, 80,128, 26,223,124, 87, 4,154, 34, 24,212,235,146,194, 96, 48,
-184, 53, 72,237,145, 63, 75,252, 26, 85,105, 29, 5, 65, 85, 89,229, 82,158,189,193,196, 14,164, 35,235,150,213, 33,184,239,126,
-225, 86,190, 55, 42, 42, 10,225,225,225,168,172,172,132, 88, 44, 6, 77,211,208,104, 52, 40, 47, 47,135, 64, 32, 96, 39,102,206,
-215,188, 49, 99, 19,222,248,108, 39, 54,125,249, 14, 90, 53,111, 1, 63,255, 48,220, 50, 21,224,135,149,255, 64, 64,237,164, 33,
-224, 40,207, 30,249,179,196,175, 42,188,138,174,109,155,163, 74,173,133,143,159, 15, 96, 50,185,204, 7,112,213,127,255, 88,179,
- 21,231,142, 31, 66,207,200,238, 80,153, 92, 43,141, 44,249, 95,218,185, 11,255,252,234, 63,150,246,236,154, 26,100,215,212, 32,
- 95,254, 62,118,158, 63,141, 30,131, 34,129, 82,215, 91, 51,175,191,178, 92, 58,231,239,163, 21, 17,254,221,160, 33, 85,128,174,
- 8, 98, 93, 25,116,166, 42,104, 25, 13, 24,113, 0,218, 12, 31,128,244,147, 75, 93, 77,116,212,207, 63,255, 12,173, 86, 11,185,
- 92,238, 39,151,203, 1,115, 8, 0,114,185, 28,181,239,107, 45, 40, 45,126,254,249,103,183, 7,237,197,139, 23,165,243,231,207,
- 87,124,254,249,231,132,162, 40, 5, 0,236,223,191,159, 44, 93,186,148,188,243,206, 59, 30,109,205, 28,232, 67,175,253,207,219,
- 47,251,142,107,163, 19, 28,188,120, 23, 91,175,211,120,123,251, 61,221,251,202,106, 85,141, 1,127,246, 68,102,121,249,152,134,
-180,252, 17, 22,150,131, 25, 51,102,184,189, 27,165, 53,225,175, 94,189,154, 98,183,147,230,138,131, 7, 15, 74,239,221,227,102,
-148,232,245,122,156, 57,115,102,143,179,231, 5,128,180,109,235,150,226,196,196, 68, 0, 64,110,110, 46,246,108,251, 85,114,187,
-240, 46,195,146, 63, 0, 36, 38, 38, 90,198,219,153, 51,103, 86,214,103,188,125, 60, 51, 14,103,175,222, 66,203,200, 86, 64,141,
-154,243,181, 23,149,148,194, 96, 48,214,206,213, 70, 24, 12, 70,220,186,113, 93, 82,159,123,106,235, 61,224,189, 9, 77, 11,117,
- 92, 81, 58,157, 14,125,187,118, 85,248,249,138,192, 48, 4, 38, 6,248,109,255, 1,188,255,175, 15,193, 16,224, 74, 94, 30, 78,
-159, 58,137,158, 61,251, 64, 32,160,240, 68,100, 91,228, 31, 55,194,151,227,230,120, 98, 97, 17,162, 59, 22, 2, 66, 10,183,238,
- 24, 0, 33,133,222, 93,111,224,200,153, 34, 16,180,241,232, 2,172,221,251,246, 60, 3, 26, 85,105,157,213, 0,174, 96,237,222,
-183,167,105, 31, 89,183, 12, 99,230,125,101, 55,139,221, 26, 70,163, 17,126,126,126,160,105, 26,161,161,161, 80,171,213,168,169,
- 49,111, 3, 28, 17, 17,129,210,210, 82,183, 54,224,208,150, 3,131,124,125,241,214,151,251, 49,166, 15,112,227, 4,112,180,246,
-179,183,190,220,143, 47,230,201, 96, 98, 76,110,247,223,185, 99,191, 89, 94,143,238,223, 21,194, 64, 26,217,202,243,232,219,181,
- 29,130, 2,124,240, 93,122, 14, 6,200, 38,226,182,157, 85, 0,174,250, 47,243, 60, 1,238, 0, 9,163, 41,172,217,154,143,240,
-208, 78,152, 60,148,226,212,127,172,187, 63,187,230,254,214,201,228,189,149, 64, 27, 21,168,191,189, 11,242,254,191, 0, 90, 3,
-234,200, 82,124,213,162, 5,245, 95, 39,129,128,168, 41, 1,138, 14, 33,253, 81,105,170,134,174, 60, 15, 63,220, 92,143, 3, 9,
-229,232,254, 87, 25,198,206, 13,128,111,232, 19,144, 8, 67, 33, 76, 80,225,232,175, 71,201,192, 1, 3, 29, 77, 82,150,223,160,
-105, 26,132, 16,125,173, 18,173,165,105, 90, 77, 8, 9,131, 57,137,203,227,229,181, 93,187,118, 85,142, 29, 59, 86, 86, 90, 90,
-170,200,206,206, 54, 43, 62,217,217,232,214,173, 27,186,118,237,234,209,246,204, 85, 58,230,239,179,254,249,197,150,127, 79,108,
- 73, 19,173, 10,127, 91,119,217, 96, 52, 24,190,210,153,176,148, 16, 82,230,137,204, 73,147,244, 13, 78,254, 35, 70,140, 80,186,
- 43,231,200,145, 35,117, 66, 38,172, 23,128,235,174,146, 38,147,201, 45,133,225,218,181,107,120,242,201, 39, 29, 61, 47, 18, 0,
-221, 1, 8, 71, 77,156, 92,145,159,159, 31,146,155,155,139,180,180, 52,244,207,207,167,115,115,115, 1, 0,253,251,247,199,211,
- 35, 7, 32, 40,192, 7, 95,125,187,169,104,250,244,233,139, 86,173, 90, 53,207,221,241,118, 39, 99, 25, 2,123, 72, 16,208,229,
- 13,108, 88,246, 87,244,233,217, 18, 79,196,125,136,148,148, 20,202, 94,150,189,181,241, 36,145,248, 0, 0, 68, 34, 33,212,106,
-173, 87,239, 45, 79,250,141, 3,183, 55, 3, 98, 24, 6,126, 62, 98,232,141, 4, 52, 5,208, 20,240,238, 7, 31,194,196, 0, 53,
- 53,213,184,123,247, 14, 90,180,104, 9, 66, 24, 24,141,128, 68, 36,132, 64,196,205, 5,107, 52, 26,165,221,163,110, 43,154,133,
- 86, 2, 20,101,214,141, 41,128,162, 8,250,245,184,162,248,253,116, 11,153,187, 43, 2, 88,235,222, 81, 72,128,139,245,111,171,
- 69, 59, 34,126,119,172,127,192,156, 48,212,188,121,115,248,248,248, 88, 92,134,108,226, 95,112,112, 48, 68, 34, 17,110,221,186,
- 5, 17, 71,121,223,230,236,197, 95,227, 70,130, 53,111, 46, 27,205,238,127, 0,144, 70, 3, 65, 31, 42, 48,239,205, 33, 8,117,
-227,122,111, 23,154,147, 21,219, 55, 15, 67,185, 78, 7, 97,144, 0,218, 98, 53, 64,211,104,213,161, 45,118,238, 57,234, 81,255,
-253,121,193, 18, 92,251,109, 55,132,119,129,138, 22,128, 31, 77, 99,112,199, 78, 24, 53,178, 5, 39, 57,182,177,254, 31,159,251,
- 43, 54,234, 46, 1,157,181,192,239, 66, 32, 64, 8,196,247, 71,219,120,110,198,107, 84,155, 48,232,245,101, 16, 25, 13,248,225,
-230,122, 28,154, 25,140, 17,207, 62,131,174,205,187,201,206,238, 84, 42,250, 38,214, 64,164,175,129,177, 43,131,226,123,220,146,
- 70,107,149, 55,237,204,153, 51, 3, 0,148, 19, 66, 68, 0, 48,115,230,204,122,215,214,152, 60,121,178,242,192,129, 3,178, 11,
- 23, 46, 40,252,252,252,224,231,231,135, 25, 51,102,120, 52,137, 82, 20,213, 50, 46, 46,110,205,155,111,190, 73,191, 53,239,239,
- 76, 79, 38,143,214,233, 13, 53,122, 19,121,211, 29, 57, 73, 73, 73,164,188,124, 12, 38, 77,210, 99,198,140, 25,148,167,231,211,
-144,228,111,207,221,191,122,245,106, 74, 46,151,147, 89,179,102,113, 58,223,234,234,106,203,235, 99,199,142,213,249,108,254,252,
-249,152, 63,223,188,105,209,128, 1, 3,172,143,247,113, 32,174, 53,128,142,181, 74,161,223,211, 83, 94,212, 70, 70, 70, 74,210,
-210,210,192,146,127, 98, 98, 34, 90,180,106,101, 61,222,182,194, 42, 68,192,101,188, 37,197,143,192,225,194, 34, 4,246, 9, 68,
- 65,246, 85, 64,226,131, 41,115, 95, 66, 88,219, 56,142,115,179, 9, 5,119,238, 25, 69, 34,161,144,245, 0, 0,192,173, 27,215,
-235,117, 95, 29,133, 14,120,133,160,241, 20, 2, 91, 37,128,182,103,226, 16, 66,192, 16,192,196,152,149, 0,138, 2,126,221,152,
-142,103, 39, 79, 69,179,136,230,150, 9,144,184,177, 87,182,128, 46, 66,143,206,183, 44,239,123,247,244,179, 56,201,250,117,207,
-135,128, 46,114,251,130,108,221,253,246, 62,119,199,250,183,117,247,219,251,220,122, 45,187, 51, 84, 86, 86,162,170,170, 10, 58,
-157, 14, 12,195,160,184,184,216,226,254, 87,171,213,168,174,174,118, 43, 4,176,233,203,119,160, 60, 11,168,174, 3, 6, 13,240,
- 69,178,204,226,254, 63,126, 2, 56,121,231, 55, 8,220,236, 63, 85,225, 85,132, 5,251, 35, 60,204, 31, 79, 68,119, 67,254,181,
- 98, 92, 46, 40, 69,251,240, 96,232,238, 21, 33,239, 74, 94,157, 90, 0, 92,250,111,136,244, 25, 12,147,189,128, 77, 91, 54, 64,
-177,111, 3,214,175, 88,128, 41, 11,150,226,180, 1, 40, 46, 45,226,212,127,214,177,254,151,135, 60,137, 25,221, 59, 96,195,166,
- 61, 56,125,250, 58, 86,156,201,197,207, 99, 94, 2,254,119, 16, 5, 5,197,117,106, 1, 56, 66, 91,173, 15, 76,250, 18,232,245,
- 42, 0, 64,139, 54,237,208,181, 91, 55, 89,165,175, 57, 23, 67,195,168, 65,235,106,224, 91, 35,192,189, 59,119, 93, 17,170,217,
- 35,163,213, 66,171,213, 74, 0,232, 1, 4,106,181,218, 32,219, 37,129,158, 66,173, 86, 75,247,237,219,167,232,214,173, 27, 94,
-124,241, 69, 89, 73, 73, 9,178,179,179, 57, 15, 54,138,162,134,249,248,248, 84, 7, 6, 6, 26,199,140, 25,115, 39, 57, 57,185,
-245,162, 69,139,242,143,158, 56, 61,225,231,115,186,139, 6, 6,110,239,199,218, 16, 46,127,111,146,191,173,245,207,230, 40, 88,
-123, 1,184,200, 16,137,238,171,228, 43, 86,172,176,252,217,123, 15, 88, 86,248, 56,186, 55,226,218, 63, 26,128, 80, 85,120,213,
-174, 59,157, 29,111, 39,142,159,184, 54,125,250,244, 36,119,198,219,240,129, 79, 32,118,104, 52,150,124,240, 9, 62,253, 44, 11,
-255,247,227, 30,204, 30, 53, 0,119, 55,103, 65, 85, 94,233,146,108, 83, 82, 82,168,196,132,167, 97, 48, 24, 79, 24, 12, 70,163,
-181, 2, 0, 0, 75,223,253,135,199,132,205, 19,125,227,194, 94,236,223,214, 43, 80, 71, 1,160,105, 26,170,106, 53, 4, 52, 5,
-163,209, 4,134, 16, 24, 25,115, 18,233,169,147, 39, 48,106,244, 56,179,155,140, 16, 8,104, 1,170,212,122, 24,245, 58,215, 26,
-166,201, 36,237,212,230,142, 34, 34, 76,101,209, 50,134, 12, 10, 48, 15, 27,138, 2, 69, 17,244,237,150,167, 48,154, 76, 82,174,
- 23,199, 90,247,206,146, 1, 61,178, 94,157, 36,215,184,131,208,208, 80, 20, 23, 23,195,199,199, 7, 85, 85, 85,136,136,136,176,
- 36, 5,106,181, 90, 84, 84, 84,184,165, 0, 36, 45,249, 25, 95, 36,203, 16,220, 17, 80,158, 5,254,190, 92,129, 0,161, 0,147,
- 95,255, 8,183,153,187, 88,183, 98, 33, 4, 52,119,121,172,245,223,191,127, 52, 34, 34, 59,162,121, 68, 51,136,105, 10, 70,138,
-160,184, 70,131,242, 42,173, 71,253,247,233,178, 12, 76,234,214, 9, 65, 65,225,240,139,104, 13, 67, 89, 57, 78,108,253, 9, 21,
-101, 55, 61,122,136,191, 89,246, 26, 48, 47, 22, 66,163, 30, 29,107,128, 34, 65, 37,190,184,115, 20, 16, 7,113,150,113,124,203,
- 97, 89, 9,173,193, 77,177, 26, 3, 58,203,208,253,165, 0,228,135, 42, 21, 17, 17, 39, 20,237, 6,231, 67, 69, 87, 65, 71, 52,
- 80,255,200, 64, 18, 16,200,197,242,183,158,224,217, 85, 0, 98,111, 13,220, 29, 59,118, 0, 0,102,204,152, 33,235,218,181,171,
-242,217,103,159,181, 88,140, 92,200, 63, 34, 34, 98,251,154, 53,107,252, 83, 82, 82, 4,243,230,205,195, 27,111,188, 65, 14, 30,
- 60, 56,152, 16,146,173, 54,144,110,132,144,223,221,183,230, 66, 29,186,253, 61, 77, 8,244, 38,249,219, 18,188,181,194,178,122,
-245,106,234,200,145, 35,156, 92,251,183,111,223, 62,200,190, 94,191,126,189,229,207,182,141, 69, 88, 88, 24, 0, 56,154, 4,111,
- 3,168, 0, 64,223, 46,188,139, 67,135, 14, 89, 98,254,253,251,247, 7, 0,164,165,165,225,151,204, 44,148, 87,105,213, 0,150,
-194,188, 52,144,243,120,219,188,233, 61,140, 75,158,139, 9, 19, 70,163,153,143, 0, 85, 20, 65,246,229, 91, 56,116,182,192, 45,
-162,158, 51,243,133,129,249,121,121,194, 91, 55,174,131,253, 91,250,238, 63,156, 90,242, 60,154, 54,241,219,182,217, 67,157, 16,
-128,143,143, 15,174,156, 63, 45,235,216, 58, 76,225, 43, 18,194,100, 98, 64, 81, 20, 40, 10, 72,146,191, 10, 66, 24,152,106,235,
- 1,168,181, 90, 92,184,156, 15,177,216,181, 19,219,104, 40, 67,223,238,215,172,103, 81,188, 50,239, 26, 54,254,216,197,162, 59,
- 15,232,121, 21,135, 79,117,131, 80, 16,225,150,245,111,143,248, 53,170, 82, 0,240,200,250,183, 55,208,142,172, 91, 6, 0,156,
-173,127,192,188,206,191,101,203,150,208,233,116,184,119,239, 30, 76, 38, 19,154, 53,107,134,210,210, 82, 52,107,214,172,182, 95,
-185, 19,118,241,221, 60,188,243,161, 2,170,235,192,191, 23, 12, 71,181,209,132,249,203,211,240,121,114, 34, 22,172,216, 10, 33,
- 69,193, 13,254,135,170,240, 42, 90, 53, 11,129, 8, 34,152, 64,225,206,181,115,184, 81,164, 66, 84, 68, 24, 54, 31, 63,136, 11,
-231,225,182,245, 63,101,214,124,136,194, 0, 90, 0,172,205,186,134,141, 95,191,133, 89,203, 82, 48, 63,190, 15, 94, 29,221,193,
-173,254,203,174,169,193,167, 9,211,128, 10, 9, 64,137,128, 79, 63,193,212,163,251,177,115,244, 28, 80, 31,205, 5,117,120, 33,
- 39,235, 31, 0, 78,222, 9,199,147, 26, 21,170,125, 5, 80, 75, 36,136,154, 34,130,142,104,160,162, 69, 48, 34, 26,196,164,134,
-161,228, 14,126,251, 82,133, 25,211,163, 26,101,208,230,230,230,146, 90, 98,160, 38, 79,158,172, 52,251,198,204, 24, 62,124, 56,
- 53,124,248,112, 46,228, 63,180,117,235,214, 59, 62,250,232, 35,255, 43, 87,174, 64, 36, 18, 33, 40, 40, 8,167, 79,159, 54, 16,
- 66,138,235,115,126,206,214,228,123,226, 29,240, 38,249,219, 90,255,102, 98,125,112,249, 32,151, 92,128,196,196,196, 43,191,252,
-242,203, 16,163,145,219, 10, 39,137, 68, 50,203,201,199, 85, 0,174, 1,232,127,249,196, 65, 88,199,252, 95,153, 53, 13, 59, 34,
- 35,193,134, 3,182, 71, 70,250, 77,159, 62,253, 91,119,198,219,115,177, 79, 34,152, 9,133, 26, 34,108, 92, 57, 23, 95,111, 61,
-137,183,158, 30,134,153, 43,214, 99,234,210, 31,220,178,192,173,139, 9,217,107,227,215,239, 63,158,168,227, 1, 16, 8, 4, 84,
-197,157, 60, 92,189, 85, 10,161, 72, 0,163,137,129,193,104,194,241,227,185,248,254,251,111,161, 55, 17, 24, 76, 12,196, 66, 26,
- 69,229,213, 40,184,112, 72,230,235,235,171,116, 65,132,210,110, 81, 55,238, 91,255,230,169, 10, 27,127,140, 54,207,113, 52, 1,
-104, 2,154,102, 48,184,207, 5,133,137,131, 23,192,158,245,111,189, 10,192, 63,172,165, 91,228,111,207,250,183,206,170, 29, 51,
-239, 43,183,200,203, 60, 41,150,163,186,186, 26, 34,145,200, 98,253, 51, 12, 99,249,239,174, 2,240,195,202,127,224,120,193, 94,
- 4,180, 52, 39,253, 5, 10, 5, 40,190,155,135, 32, 31, 17, 42,202,110, 67, 64, 83, 16,210,220,194,207,172,245,223, 46, 44, 16,
-231,243,175,193,168,215,195, 71, 40, 70,117,181, 22,155, 21, 7, 49, 64, 54,209, 45,242,103,251,239,153,215,254,133,117, 95,124,
- 14, 53, 3,180,139,106,139,179,231, 14, 99,126,124, 31,143,250, 15, 0,230, 71, 13,192,150, 43,123, 0,149, 17,144, 52,195,174,
- 35,231, 65,125, 52, 23, 95,181,104, 65,113, 37,127, 0,152,222, 37, 89,249,219,174, 35,128,190, 10,213, 84, 21,202,233,106,168,
-132, 6, 24, 76,149,240,209,170, 33, 41,188,134,159, 23, 93, 65,199,152,104, 56, 73, 0,172, 3, 95,171,204, 87,137, 68, 2,137,
- 68, 98,247, 51,174, 88,179,102, 13,214,172, 89, 83,175,193, 28, 24, 24,248,247,188,188, 60,255,160,160, 32,248,250,250, 34, 44,
- 44, 12,197,197,197,160, 40, 74,237,205, 73,131,181,248,115,114,114, 8, 96, 78, 8,116, 39, 41,208,219,228,255,205, 55,223, 72,
-137,235,181,238,156, 86, 4,248,251,251, 39, 9,133,194,171,182,237, 43, 86,172,168, 99,249, 3, 64,135, 14, 29, 16, 27, 27,187,
-214,149,253,115,187,240,110,157,108,255,119,254, 57, 15, 62, 66, 49, 90,180,104, 1,118,117, 64,237,231,254,238,140,183,191, 74,
-123,227,141, 79, 62, 71,213,189, 34, 68, 4, 53,199,185,243, 55, 49,115,197,122,164,164,164, 80,158,144, 53,251, 61,235,239, 91,
-203,225, 61, 1,143, 6, 78,158, 60,233,180, 24,144, 67, 15, 64,237, 36,162,204, 85,102,200, 8, 73, 80,116,108, 29,142, 64, 63,
- 31,116,239, 25,131,238, 61,250, 64, 72, 3,213, 26, 19,110,222, 41,195, 17,229, 54, 89,128,191,159,203, 31,168, 81,171, 17,221,
-225, 14,180, 58, 9, 8,107,212, 16,192, 87,162, 5, 33, 64, 89,133, 15, 64, 1,129,254, 70,244,138,190,142,253,199,250, 34, 48,
- 48,144,179,245,111,109,241,251, 6,135, 67, 68, 12,128,241,254,124,103, 18,186, 62, 71,107,235,223,218,226,103,219,242,206,157,
-176, 28,203,165,202,158,181, 18, 0, 0, 45, 91,154,149,145,178,178, 50, 4, 5, 5, 89,220,255,238, 40, 0,172, 18, 0,124,132,
- 57,137, 35,129, 47,246,227,235,197, 19, 49,117,193,231, 88,191,236, 85, 8, 41, 10, 98, 31,110, 43,118, 88,235,255,252,205, 34,
-116,110,215, 12,255,251,239,207,232,216,177, 35,130, 91, 71,161, 79,235, 40, 24,116,247,221,255, 34, 14, 50, 89,235,255,195, 89,
-163,241,247,119,215,162, 93, 36, 85,175,254, 99,173,255,177,155,190,193,206, 25, 47,128,106, 59, 24,128,185, 42, 32, 96, 46, 17,
-204, 30,251,247, 22, 45, 56, 17, 71,111,221, 66,106,253, 39,203,165, 81,147,171, 20, 29,187,244, 68,165, 47,112, 13, 55, 80,117,
-189, 24,197, 75, 77,168, 46,111,139,121, 47, 45,224,124, 67, 86,173, 90, 69,249,250,250, 18,141, 70, 3, 43,203,147,248,250,250,
- 98,213,170, 85,110,148, 39,242, 30,170,170,170,254,253,234,171,175, 38,172, 89,179, 70, 18, 28, 28, 12,133, 66,129,207, 62,251,
-172, 82,175,215, 63,237,205,223, 97, 45,126,118,185,156,187, 9,129,177,177,177, 84,121,249, 24,226, 13,242, 7, 0,150,216,185,
- 16, 20,135, 10,131,250,151, 94,122,105,240,134, 13, 27, 78,215,212,212,180, 50, 24,204,203, 76,109,201,191,123,247,238, 24, 60,
-120,112, 28,135,251, 44, 84, 21, 94,197,146,247,222,193,175, 91,182, 99,220,176,126,216,157,115,216,108,192,180,142, 66,112,235,
- 40,244,207,207,199,211, 83, 94, 44,185, 89,170, 30,219, 62,220, 47,157,171,245,255, 70,234, 22, 44,250,203, 88,180,110, 41,181,
- 40, 23,236, 53,114,241,220,120,226, 29,224, 61, 1,143,174, 82,192, 73, 1, 0,128,160,192, 0,229,113,101,134,236, 90,219, 39,
- 16,217,165,155, 34,200,223, 23, 12, 1, 52, 58, 61,242,243,243, 81,156,127, 82, 22, 24,224, 15,154,166, 93, 14, 92, 95,137, 4,
- 27,118,140,148,177, 25,240, 78,221, 17, 52, 13,127,127,238,214, 19,187, 4,208, 63,172, 37, 24,147,193, 76,254,181, 48, 80, 34,
-151, 37,118,109,193, 46,169, 25, 51,239,171, 58,164,229, 9,249, 91, 43, 1,214,133,127,202,202,202, 92,223, 0, 23, 74,192, 15,
- 86,171,132,215, 44,125,229,254, 27, 67, 53, 2, 56,202,105, 23, 22,136, 13,199, 78,226,236,197, 75, 24, 32,155, 88,135,244,221,
- 33,127, 22,207,188,246, 47,108,236,231,143,215,158,237,234,149,254,155, 31, 53, 0, 11, 50, 55,128, 90,242, 46,182,183,120, 18,
-159, 85,159,173,243,249,228,224, 16,180,149,184,183, 39,197,244, 46,201,202,237,153,233,184, 93,126, 21,197,165,119,112,239,114,
- 0, 4,166, 32, 12,237, 61, 28,178,151,100,141, 58,169,121,163,218, 31, 33,228, 24, 69, 81, 99, 40,138,218,245,249,231,159, 75,
- 38, 77,154, 84,169, 86,171,199,122, 18,243,119, 6,111, 44, 1,148,203, 67,189, 66,254,182, 86,170,151, 80, 50,109,218,180,168,
-170,170,170, 37,185,185,185,243, 10, 10, 10, 80, 83, 83, 3,177, 88,140, 86,173, 90, 33, 34, 34, 98, 82,191,126,253, 54,115,148,
-117, 1, 64,255,118, 97,129,120,234,169,167,112,242, 74, 1,154,117,234, 81,103,188, 61, 61,229, 69, 53,128, 47,185,144, 63,139,
-191, 74,123, 99, 76,206,239,152,241,238,247, 24, 49, 98, 4, 90,180,104, 97, 87,209,242, 86,135,176, 74,128, 59,125,237, 72, 33,
-227,149,136,198, 35,125, 78,165,128, 1, 32, 40, 40, 72,169, 43,187, 37, 61,174,188, 44, 3,204,153,180,132, 16,248,248,248, 32,
- 56,136,115, 13,108,136, 68, 34,101,176, 72,228,245,139, 99, 93,253, 2,163, 26, 48,170, 45, 25,240, 44,241,187,187, 22,139,117,
-245,231,157, 59,129,188,115, 39, 16, 17, 17,129,226,226, 98,143,136, 63, 56,162, 53,244, 28,146, 35,185, 98,198,191,126,192,193,
-253, 74,175,201,187,126,253,186,101,183, 63,131, 78,251, 0,249,187, 67,252, 44, 94,234,231,239,181,254, 3, 0,106,229, 66, 11,
-241,179,228,127,173,166, 70, 54, 57, 56, 4,241, 28,173,126,123, 24,223,105, 42,133, 78,181,111, 60, 72,108, 95,189,122, 53,197,
- 86,251, 91,181,106, 21,101, 93,249,111,237,218,181,212,170, 85,171, 44,175, 87,175, 94,253,208, 7, 61, 33,228, 0, 69, 81, 35,
-210,211,211,231, 87, 86, 86,174, 36,132, 28,241,246,111,120, 99, 9,160, 55,201,169,129,160, 9, 12, 12,156, 47,149, 74,231,215,
- 83,206,129, 51,103,206, 12, 5,208,169, 89,167, 30,106,131, 78,235, 87, 59,222, 42, 1,168, 0, 92,104, 31,238,247, 28,204,201,
-130,156, 49,230,157, 53, 15,133,248,235,163,104,241, 36,223, 56,136,137,137,225, 68,254, 46, 13, 80,161, 80,168,116,229,142,127,
-216, 96, 99,251, 44,241,163,158,196,207,198,166, 85, 69,183,161, 42,186,141,136,136,136,122, 89,252, 0, 96, 52, 49,110,123, 31,
-156,161,168, 76,229,241,185,216,130,141,237,123,139,248,189,221,127,108,108,127, 75,117, 53,177,182,250,251, 10, 69,245, 34,254,
- 63, 18, 8, 33, 71, 1,188,192,247, 68,227, 99,250,244,233, 41, 0,190,191, 89,170, 86, 27,116, 90,235,120,100, 80,251,112,191,
- 80,184,185,251, 31, 75,170,214,110,254, 71, 72,169,226,241, 16,149, 0, 78,134, 86, 76, 76, 12,159,216,193,131, 7, 15, 30, 60,
-120,252,193, 64,243, 93,192,131, 7, 15, 30, 60,120,240, 10, 0, 15, 30, 60,120,240,224,193,131, 87, 0,120,240,224,193,131, 7,
- 15, 30,188, 2,192,131, 7, 15, 30, 60,120,240,120, 44, 80,103, 21,192,156, 57,115, 60,206, 34,181,183,221,100, 83,151,119,226,
-196, 9,143,229,245,237,219,183,193,229,121,251,122,155, 53,139,241, 88, 94, 73,201,201,198,190,191, 84,173,194,202,192, 78,241,
-149, 71,241,249,123, 88,242,106, 11, 19,209,181,125, 72, 0,144, 57,115,230, 48,124,255,241,242,248,249,249,241,149,231,182, 2,
-240, 56,160,190, 69, 38,166, 77,155, 38, 5, 96, 93, 50, 84,182, 97,195, 6, 37,175, 43, 54, 14, 84, 42,213,159,206,156, 57,211,
- 71, 32, 16, 44,240,241,241,129, 90,173, 94, 56,108,216,176, 79,224,133, 74,123,132, 16,183,171, 49, 62,138,152, 51,103, 14, 1,
-199, 77,102,120, 52, 30, 50, 51, 51,165, 9, 9, 9, 74, 15,191, 43,203,202,202,218,227,141,130, 82,181,242,158,203,202,202,250,
-121,245,234,213, 97, 48,239,105, 96, 66, 35, 84,183,228,241, 16, 61, 0,143, 58,114,114,114,164,245,249,254,180,105,211,164, 27,
- 54,108, 80, 76,155, 54,205,186, 89, 49,109,218, 52,143,149, 0, 86,161, 72, 75, 75, 99, 75,117,186, 37, 43, 41, 41,137,184,249,
-123, 78,215, 3,239,218,245,173,187,242,100,229,229,254,141,161, 0, 81,103,207,158,253,119,101,101,229, 95, 58,116,232, 16, 82,
- 82, 82,130,218,237,118, 63,222,184,113,227,199,254,254,254,163,158,126,250,105, 69,189,126,192, 3,242,151,203,231,184, 61, 9,
-166,164,172,162, 30,158, 60,231,229,112, 29,109,250,194,117,124,109,216,176, 65,129,119, 41, 80, 31,216, 87,168,240, 46,133,105,
- 23, 18,221,238,215,113,227,198, 17, 0,200,206,206,246, 10,129,177, 91, 1,203,229,161, 94, 95, 31,159,153,153, 41,205,202,202,
- 82,184, 67,182,127,251, 91, 18, 33,196,188,181,186, 61,196,199,199,201,178,178,178, 20, 9, 9, 9,148, 7,207,241,168,237,219,
-183,239, 30, 57,114, 36,102,207,158, 77,214,175, 95, 63,166,178,178, 50,199,157,115,179,163, 52,226,249, 33, 98,200,103,203,203,
- 22,254,152,188,121,217, 11,203,158, 97, 63, 91,179, 38,213,233, 57,190,248,226,139, 4, 0,252,253, 29,111,109, 80, 83, 83, 3,
- 0,152, 57,115, 38, 95,191,224, 33,129, 45, 14,100, 93, 35, 64,232, 98,192,219,173,155,205,161,158,118, 99,161, 94,132, 96, 77,
-254, 27, 54,108,160,166, 77,155, 70,172,228,186,125,189,172, 66,193, 18, 77,237,134, 31,238, 43, 20,105, 97,110,252,106,172,203,
- 35,106,226, 95,225, 46,206,205,125,109, 28, 17,144,155, 94, 25, 74,165, 82,253,210,179,103,207, 41, 0,104, 66, 8,124,125,125,
- 81, 84, 84,132,138,138, 10, 4, 7, 7,163,168,168,104,207,142, 29, 59,100, 79, 63,253,180, 91,202, 73, 78, 78, 14, 97, 55,102,
-161, 40, 10, 83,166, 76, 65,108,108,172,140,162, 40,206,114, 50, 51, 51, 44,175, 19, 18, 38,185,124,239, 10,154,131,175,221,239,
-238, 33, 95,213,121,111,219,230, 59,196,245,166, 74,236,118,194,214,216,183,111, 31,150, 46, 93,250,192,189,248,241,199, 31, 9,
-199,126,147,166,165,165, 41,240, 46, 85, 75,176,137, 15, 78,220,239, 82,245,182, 16,155,240,220, 82,199,210, 78, 73, 73,145, 17,
- 66,176,110,221, 58,114,224,192, 1,244,238,221,219,229,119, 15, 58,168,201,184, 41,109, 1,178,178,178, 20, 12,195, 32, 53, 53,
- 21,174,182, 85,166, 40, 74, 74, 8,177, 60,175,155, 55,111,246,163, 40, 10, 47,188,240,194, 61, 0, 45,166, 79,159,190,107,245,
-234,213,180, 59, 22,251, 39,187, 62,177,188,190,155,125, 7, 20, 69, 97,253,235,126, 0, 40,252,251,197,143,159,105,214,172, 25,
- 0,224,167,239,214, 99,246,200,217,156,100,246,239,223, 31,145,145,145, 60,243, 54, 33,242,183, 5,237,108, 34, 79, 75, 75, 67,
-106,106, 42,177, 55,129,122,178, 51, 84,125, 45,116, 87,242,172,172,108,143,141,194, 13, 27, 54, 80, 27, 54,108,160, 88, 37, 0,
-128,172, 62, 10, 5, 69, 81, 72, 76, 76, 4, 33,132,178, 58, 55,183, 21, 21,106, 90,185,229,143, 75,187, 43, 4,108, 93,101,249,
-227,210,238, 14,249, 19, 66,192,238,206,230,106,151, 54,123,207,100,121,121,249,247,193,193,193, 83, 0,208,179,102,205,194,140,
- 25, 51, 32, 22,139,225,235,235, 11,137, 68, 2,138,162, 32, 16, 8,160, 82,169, 56,247, 99,122,122,186, 84, 46,151,147,244,244,
-116, 88,221, 19,108,220,184, 17,179,103,207, 86,164,167,167, 75,155,226,192,181,167, 16, 52,134,103, 45, 45, 45, 77,145,146,146,
- 66, 61,119,113,154, 93, 11, 95, 46,151,147,105, 23, 18,101,246, 60, 3,174, 48,123,246,108,242,214, 91,111,161, 83,167, 78, 94,
- 57,223,217,179,103, 19,185, 60, 20,225,225,187,189,218, 15, 25, 25, 25,163,115,114,114,246,244,233,211,135,250,250,235,175,149,
- 44,249,215, 7,155,210, 22, 96,229,202,149, 96, 24, 6, 11, 22, 44, 0, 23,153,214,228, 15, 0,219,183,111,223, 50, 98,196, 8,
- 0, 8,125,225,133, 23,140, 35, 71,142,132, 92, 46,103,184, 26, 45,182, 99,244,179,207, 62,195,115, 79,153,109,195,245,175,251,
-226,249, 33, 98, 44, 28,247, 22,231,107,242,247,247,199,136, 17, 35,144,148,148, 68,197,198,198,218,253, 99,143,225,173,255,198,
- 35,127,167, 10, 0, 75, 86,185,185,185,150,178,147,214,214,147,187, 68,107,177, 32,188, 60, 41,217, 81, 6,100,222,236,188, 13,
- 27, 54, 40,188, 32,195,162, 80, 36, 38, 38,202,216, 62,124,156, 96, 77,254, 0, 80, 80, 80, 96,249,236,246,237,219,156, 21, 70,
-149, 74,245,145, 90,173,126,145,166,105,122,250,244,233, 80,169, 84, 40, 44, 44,132, 72, 36,130, 80, 40,132, 80, 40,132, 72, 36,
-130,175,175, 47, 52, 26,141,221,146,168,118, 38, 56,233,174, 93,187, 20, 20, 69, 97,234,212,169, 88,189,122, 53, 21, 27, 27, 75,
-165,164,164, 80, 83,167, 78,101,159, 31, 5, 63, 85, 56, 39,255,218,190,148,177,147,184,245,189, 79, 76, 76,148,197,198,198, 42,
- 1,207, 74,210,198,198,198, 82,171, 87,175,166,210,210,210, 64, 8,241,138, 50,246,143,127,252, 3,105,105,105,156,158, 17, 87,
-248,245,215, 95,199, 28, 59,118, 44,167, 99,199,142,168,174,174, 38,254,254,254,100,255,254,253, 0, 44, 73,150, 30,145,255,138,
- 21, 43, 64, 81, 20,104,154,198,177, 99,199,192,202,116,195, 35,241, 12, 69, 81,120,254,249,231,141,181, 77,250, 23, 94,120,161,
- 82, 42,149, 98,246,236,217,204,230,205,155, 93, 94,187,117, 40,236,110,246, 29,128, 2,214,253,253,126,213,226,245,175,251,225,
-133,161, 62, 72,126,122, 33,231,243,226, 98,249,243,222,129,135, 71,254, 73,201,203,236,126, 46,116, 54, 32,243,243,243, 73,110,
-110, 46,210,210,210,192,190,102, 93, 59,238, 12,242,134, 38,127,107,171,154,157,132,154, 42,172, 67, 2,143, 27, 8, 33, 40, 40,
- 40,192,221,187,119, 45,109,182,239, 93, 64,112,232,208,161, 9,209,209,209, 16, 8, 4,200,203,203, 3, 33, 4,151, 46, 93,130,
- 94,175, 7, 69, 81, 16, 10,133,160, 40, 10, 38,147, 9,106,181, 26,155, 54,109, 66,108,172,243,176,199,238,221,187, 21, 0, 48,
-117,234,212, 7,158,219,218,247,132, 37, 10, 46,207,181,173, 91,223,213,123, 46, 86, 62, 11, 71,225, 0, 46,174,127, 91,236,219,
-183, 15,181,150, 97,253, 20,224,119, 41, 80, 86, 10, 28,171,192,178, 49,255, 28, 43,242,247,196, 90,103,149, 48,150,140,118,239,
-222,173,240,212, 50,100,229,117,233,210,229, 1,114,243, 4,171, 86,173,194,133, 11, 23, 72, 68, 68, 4,218,180,105, 99,217,246,
-249,250,245,235, 16, 8, 4,248,207,127,254,227,209, 15,140, 28,106,222,190,140, 97, 24,188,249,230,155,248,236,179,207,176,127,
-255,126, 80, 20,133,248,132,191,225,198,117,110, 27, 56,110,223,190, 61,163,246, 30,107, 97, 94, 33,195, 0,192, 11, 47,188, 80,
- 1, 32, 36, 43, 43, 11, 20, 69,113, 86,168,204,214,255,131,251,152,152,195, 1,192, 79,235, 79, 32, 83,149, 41, 5,143, 71,158,
-252,157, 42, 0, 0,144,148,148, 68,177, 86, 63, 75,254,118, 99,127,110,144,181, 51, 75,144, 75,156,216,149, 60,219,207, 27,107,
- 71,170,105,211,166, 89,199,154,137,189,207, 89,207, 64,189, 72,119, 67,168, 87,207,187, 58,110,142, 71,150,191,163,201,182,109,
-219,182, 15, 28,235,228,158,132,132,133,133,245,212,233,116, 40, 43, 43,195,193,131, 7, 33, 16, 8,160,215,235,161,209,104,192,
- 48,140,101, 87, 74,131,193, 0,157, 78,199, 41,196,192,222, 7, 71,207,109,108,108, 44,149,158,158, 78,210,210,210, 92, 42, 19,
-102,171, 43,163, 14,217,123, 43, 7,192,119,200, 87, 15, 16, 61,251,222, 19, 69, 96,196,136, 17,245, 87, 2,108, 98,254, 57, 57,
- 57, 82, 11,217,223,143,249,123,148, 35, 99,163,132, 1, 48,239,182, 40,151,203, 9,151,251,192,213, 11, 80,155,251,224,118,110,
- 1,187,179, 99,155, 54,109, 16, 20, 20, 68,217, 42,187, 61,123,246,244,216,242, 39,132,192,104, 52, 90,218,134, 13, 27,134,253,
-251,247, 99,239,111, 38,124,178,156, 91,140, 61, 51, 51,115, 92,109,236,255, 60,128,102, 0,172, 55, 27, 42, 4, 16, 2, 0, 89,
- 89, 89,138, 62,125,250,184,148, 87, 55,246,111,199, 83, 80,251,159,171, 60, 30, 77, 31, 66, 46,131,147,181,254,221,181,252,243,
-243,243,137, 55,221,221,174,228,213,134, 37,188,230,105, 72, 77, 77,165,146,146,146, 60,250,174,237,121,166,164,164, 84,203,229,
-242, 0, 71,159,123, 10,235,216,191, 55,148, 1,235,216, 63, 87,101, 96,198,140, 25,240,247,247, 71, 64, 64, 0, 2, 3, 3, 17,
- 28, 28,204,132,134,134,210, 89, 89, 89,248,211,159,254,100, 57, 78, 34,145, 96,236,216,177,144,203,229,196,193,110, 85,225,122,
-189, 30,101,101,101,208,106,181, 8, 14, 14,134,143,143, 15,140, 70, 35, 8, 33, 48,153, 76,208,235,245, 48, 24, 12, 48,153, 76,
-110,229, 23,184, 10, 89, 77,157, 58, 21, 77, 33, 52,227, 42, 33,208, 93,176, 74,128,199,207,215, 7,142,251,110,218,133,196,218,
-188, 27,207,100,219, 90,255,214,138,164, 39,201,128,182,214,191, 51,197,148, 43,249, 11, 4, 2, 18, 20, 20, 4,152, 19,234, 40,
- 0,196, 96, 48, 64,165, 82,161,121,243,230, 30, 93, 55,107, 76, 9,133, 66,204,155, 55, 15,199,142, 29,195,253,184, 63,247,103,
-122,199,142, 29, 59,134, 15, 31, 14, 0,129, 48,135,115,213, 0,240,243,207, 63, 55,223,187,119,111, 16, 33,196,162,108,219, 91,
-103,255,128,245,255,249,103,120,126,240,131,214,255,140, 47,212,248,249,160, 1,132, 16,244,157,222, 23,179, 71,206,166,184,200,
-227,209,180,173,127,128, 67, 37,192,156,156, 28,139,235,223, 58, 31,128, 11, 34, 35, 35,169,196,196, 68,175,197,228, 57,200,243,
- 56,190, 62,109,218, 52, 98,251,151,147,147,195,176,171, 2,172, 86, 4,120,132,164,164,164,128,199,249,129, 75, 77, 77,197,138,
- 21, 43,234, 60, 87, 44,249, 39, 36, 36, 32, 33, 33, 1, 0,176,119,239, 94,103, 98,194,242,243,243,181, 38,147, 9,229,229,229,
- 40, 41, 41, 65,121,121, 57,212,106, 53,212,106, 53,170,171,171, 81, 89, 89, 9,149, 74, 5,141, 70, 3,157, 78, 7,147,201,245,
-242,118,138,162,144,158,158,238,150,194,246, 40, 99,223,190,125,117,254,172,113,241,226, 69,169,245,123, 46, 49,103,219,152,191,
-173,229, 94,159, 68, 46,123,223, 93,189,122, 53,149,158,158,238,213, 92,128,244,244,116,206,115, 23, 75,254, 52, 77,147,218,231,
-203,226,250,103, 24, 6,247,238,221, 67,151, 46, 93,168, 57,115,230,184,125, 46,139,147, 71, 98,239,222,189, 96,126, 9, 1, 33,
- 4, 43, 87,174,180,220,163,125, 7, 57,231,237, 33, 51, 51,115, 18, 0,188,240,194, 11, 5,181, 10,128,238,167,159,214, 53,159,
- 51,103, 78,243,189,123,247, 98,252,248,241, 99,220, 89,166,120, 55,251, 14, 40, 80, 88,103,101,253, 79,255, 92, 13,193,243, 42,
-252,116, 80,143, 55,222,120, 3,203,119,124,204, 51,235, 99, 68,254, 46, 61, 0,169,169,169,117,226,254,214,249, 0, 73, 73, 73,
- 20,199, 1,174,172, 37,102, 69,173, 37, 92, 47,183,183, 61,121,172,219, 63, 54, 54, 86,233,173,172,210,216,216,216,179, 57, 57,
- 57, 61,155,226, 13,102,173,126,111,185,255, 89,171,223, 93,247, 63,139,117,235,214, 89, 94,191,255,254,251,248,246,219,111, 1,
- 64, 15, 64,204, 18, 63, 0,140, 29, 59,214,149, 2,160,137,142,142,134, 90,173,134, 94,175, 71,113,113, 49,124,124,124, 32, 20,
- 10, 45, 30,128,154,154, 26,168,213,106,232,116, 58,168, 84, 42, 76,153, 50,197,165,130,201, 90,247,206,150,181,178,199,113, 65,
- 67,230, 0,120,242,185, 45,216,229,126,246,176,114,229, 74,197,188,121,243,100, 93,187,118, 85, 54,230, 51,236,200,250,183,134,
- 59,185, 0,142,172,127, 79, 45,127,154,166, 9,195, 48, 20,128,247,216, 71,219,100, 50,189,235,239,239,143,182,109,219,122, 52,
-199,188,243,246, 72, 40,149, 74, 80,233,225, 0,128,157,239, 4, 98,236,135, 85, 24, 49, 98, 4,150, 44,223,235, 86, 97,170,237,
-219,183,111, 26, 57,114, 36, 0, 20,255,252,243,250, 54,123,247,238, 15, 33, 20,193,132,241, 19, 18, 18, 18, 18,182,184, 51,157,
- 0,230,216,255,243, 67, 68,117, 45,126, 16,204,123, 99, 30, 90,140,109,249,135, 40,152,245,216, 25,101,203,223,118,168, 32,176,
- 30, 88, 33, 23,203,191,127,255,254, 15,228, 3,184,227,162,179, 37,109, 47,144,179,173, 60,175,103,112, 39, 37, 37,245,204,201,
-201,241,154,188,199,117, 0,177,133,101, 88, 55,113, 90, 90, 26, 94,126,249,101, 0, 16,179,199, 88,127, 86, 59,105, 57,194,185,
-193,131, 7,255, 73,169, 84,166,153, 76, 38, 84, 86, 86,194, 96, 48, 88,226,254, 90,173,214,178,196,144, 77, 12, 28, 59,118,172,
-146,195,243, 66,165,165,165,145, 90, 47, 64,157,231, 54, 39, 39,135,109, 71,108,108, 44, 39,111,213,195,206, 1,176, 13, 11,184,
-186, 31,206, 62,151,203,229,100,229,202,149,138,231,158,123, 14,191,252,242,139, 71,247,220,118,249, 45,251,126,195,134, 13,138,
-164, 2, 57,166,185,176,180,199,141, 27, 71,174, 93,187,134, 29, 59,118, 56,236,239,107,215,174, 1, 0,178,179,179, 93,158, 79,
- 98, 98, 26, 73, 76, 28,141, 49, 99,242,145,159,159,111, 55,187,188,180,116, 52,128,114,200,229,142,231, 45,150,252,245,122, 61,
- 17,139,197,236, 49,239,213, 42, 4,239,222,184,113, 3, 29, 58,116,240,200,242,167,105,202,172,176,179,228,127,218,136,111, 21,
-122, 0,192,146,229,123,221,158, 35,216, 49, 49,103,206,156, 24, 66, 8, 38,198, 77,156, 18, 31, 23,255,171, 39, 83,211,164,103,
-159, 57, 79, 81, 84,119, 66, 0,193,243, 42, 16, 66, 48,111,254, 60,180, 28,219,234,126,224,195,115,176, 94,102, 2,190,146, 96,
-147,131, 67, 5,192,122,185,159,141,171,143,164,165,165,129,107,194,148, 45,105,123,235,196,173,229,121, 97,253, 63,143,122,194,
-218,133,110, 77, 66,108, 61, 9,219,207, 28,196, 16,141, 0, 54,142, 28, 57,114,110, 86, 86,214,151, 70,163, 17, 21, 21, 21,150,
- 28, 0, 0, 40, 46, 46, 70, 69, 69, 5, 8, 33,112, 39,188, 52,102,204, 24,217,174, 93,187, 20,105,105,105, 72, 79, 79, 39,182,
- 49,255, 49, 99,198,184, 85, 12,168, 33,160, 57,248,154,219,132,111,143,224,157, 41, 1, 41, 41, 41,212,236,217,179,137, 39,228,
- 95, 39, 1,208,234,190, 91, 37, 5,186,235, 5,112,168,184, 95,191,126,221,162,160,113, 53, 52,172, 67,149, 15, 94, 55,183,185,
- 74,165, 82,145,224,224, 96,107,242,127, 87,167,211,161,176,176, 16,157, 58,117,242,136,252,229,114, 57, 97,126, 9,197,206,211,
-230,164,191,181, 10, 61,126, 62,168, 7, 33, 4,251, 15,121,206,137,251,246,237,195,248,241,227,101,158,150, 15,102, 9,154, 97,
- 24, 17, 0,252,114,200,128, 55,222,120, 3, 45,199,181,178,241, 15,184, 7,182,202,223,136, 17, 35, 8, 96,127,185,159, 85, 37,
- 64,194,215, 2,240, 46, 28,228, 87,185, 87, 9, 48, 37, 37,133, 74, 77, 77, 37,246,150, 77,185, 19, 2,176, 67,218, 94,131,141,
- 60,175,174,255,183, 41, 7,236, 54, 18, 19, 19,193, 33, 97,145, 51, 28,185,251, 61, 13, 3, 56,114,247,123, 18, 6,176, 46, 47,
-107, 75, 62,206, 62,115,116,169, 20, 69,125, 53,113,226,196,213,235,214,173, 51,136,197, 98,232,116, 58, 24,141, 70, 48, 12,131,
-144,144, 16,148,151,151, 35,209,205,165,103, 83,167, 78, 85, 78,157, 58,149,218,181,107, 23, 73, 79, 79, 71, 90, 90, 26,216,186,
- 0,127,164, 9,104,207,158, 61,100,226,196,137,216,186,117,107,189,201,223,150,228,114,204, 10,153, 75,111,220, 91,111,189,245,
-128,113, 97,139,133, 11, 23, 18,174, 73,158,114,121,168, 75,121,114, 57,183,248,191,175,175,165,244, 37, 33,132, 64,173, 86,163,
-176,176,208,227,152,127, 29,207,199,135, 85,117,222,215,135,252,191,254,250,107,111, 61,179, 76,230,230, 45, 93,172, 43, 1,122,
- 11,206, 20,178,181,107,215,242, 76,221,148, 61, 0,128,121, 25,160, 59,237,141,137,166,182,254,223, 27, 75,252,238, 43, 34,177,
- 94, 59,175,105,211,166,201,220, 45,239,235,130, 24,136,181, 66, 99, 47,209,202,246, 51,142,132,107,156, 49, 99, 6,181,115,231,
- 78,233,205,155, 55, 21, 26,141, 6, 38,147, 9,221,187,119,151, 13, 24, 48,192,227,251, 61,102,204, 24,106,204,152, 49,236, 12,
-239, 81,104,166,161,115, 0, 92,189,231, 98,113,214,102,135,215, 37, 28, 55,139,204,176,125,132,119, 41,146,131,196, 7,236,193,
-164,164, 36,146, 84, 32, 7, 85,183, 16, 16, 5, 0, 87,174, 92, 33, 78,198,170,203, 78, 31, 61,122, 52,229,198,216,167,188,113,
- 12, 0,148,149,149,193,215,215,151, 80, 20,133, 14, 29, 58,128,162, 40,170, 75,151, 46,168, 47,249,211,207,149,131,162, 40, 36,
- 60, 99, 94, 85, 68, 81,148,101,185, 31,235,206,111, 36, 48,253, 95,236,231, 85,129, 51,103,206,100,149,255, 0,152,189,122, 70,
-152,221,255,140,213, 49,124, 56,160,169, 43, 0,143, 10,188,177,214,223, 91,132,221, 0,138,141, 87,207,203,219, 27,251, 52,180,
-245, 92, 27,227,183,251, 27,122,189, 30, 2,129, 0, 2,129,224, 33, 62,107,171,168,166, 45,207,241, 88,120,241,197, 23,221, 23,
-248,238,253,125, 44,210,210,210,234, 76,218, 73, 5,114,107,203, 91,249, 56,204, 37, 45, 91,182,164,238,143, 21,115,178,109,125,
-201,223,124, 79,156,109, 5,244, 32, 86,173,250,253,161, 17,228,236,145,179,169,135, 61, 39,240,110,255,135, 15,123,161, 1, 42,
- 38, 38,134,215,196,120,240,224,193,131, 7,143, 63, 24,104,190, 11,120,240,224,193,131, 7, 15, 94, 1,224,193,131, 7, 15, 30,
- 60,120,240, 10, 0, 15, 30, 60,120,240,224,193,131, 87, 0,120,240,224,193,131, 7, 15, 30,143, 5,234,172, 2,152, 51,103,142,
-199,153,153,246, 10,187,240,242,120,121,188,188,135, 39,111,209,162, 69,117,181,123,154,182, 44,115,180, 94,106,198, 86, 83,180,
- 94,122,102,175,124,112, 64, 64, 0, 36, 18,137,229,251, 52, 77, 91, 86, 92, 88,203, 99, 55,102, 98, 24,243, 42, 47,118,179, 28,
-254,254,186, 35,143,146, 10,132, 62, 32,140, 17, 12, 99, 84,122, 34,143, 16, 34, 59,117,234,148, 48, 38, 38, 38, 7, 54, 85,247,
- 60,148, 39, 61,117,234, 20, 98, 98, 98,148,141,209,127, 39, 78,156,240, 88, 94,223,190,125,255,240,242,220, 86, 0,254,136, 88,
-188,248, 72,157,142, 91,178,100, 16,213,164,228, 29, 89, 76, 0, 96,201,160, 37,148,245,235,250, 94,183,171,138,113,174, 62,183,
- 62, 14, 86,203,244, 82, 82, 82,216,246, 58,175,217,207,172,219,121,212, 5,173,175,145, 22,159, 61,136, 17,161,197,138, 54,198,
- 91,184, 76, 58,225, 88, 77,152, 44, 40,250, 73,136,253, 3,149,174,190,127,224,192, 1, 12, 27, 54,204, 66,252, 44, 97, 83, 20,
-245, 0, 97, 51, 12, 99,249,187,113,227,134, 93,121,199,143, 31, 71,255,254,253,225,235,235, 11,161, 80, 8,129, 64, 80, 71, 38,
- 75,250, 38,147,201,242,167,211,233,144,155,155,139,206,157, 59, 63,142,183,136, 50,243, 34,145, 94,186,116, 9, 87,174, 92, 81,
-132,132,132, 96,248,240,225,245, 26,143, 20, 69, 75,125, 36, 97, 8, 9,125, 66, 81, 83, 93, 32,171,174,186, 37,117, 87, 6,195,
- 48,210,244,244,244, 61,151, 47, 95,198,214,173, 91,225,235,235,139, 5, 11, 22, 8, 96,181,246,222, 3,121,138,252,171,121,216,
-181, 51, 27, 98, 31, 31,188,241,198,188, 81,132, 16, 5, 63, 82, 31, 83, 15,192,163,132,244,244,116,151, 26,207,212,169, 83, 93,
- 14, 76,150,160,109,137,219, 83,120, 91, 94, 83,135, 85,165, 63, 46,202, 2, 80,207,234,226,108, 85, 65,235,223,127,228, 59,145,
- 16,233,249, 3, 59, 17,116,237,144, 66,173,214,193,240, 36, 13,223,182, 20,186,220, 60,141,129,129, 68, 81, 94,124, 20, 39,253,
- 94,146,149, 80,109,156, 42, 1,231,207,159,135, 64, 32,192,240,225,195, 33, 20, 10, 45,127,172, 66,192, 90,253, 70,163, 17, 38,
-147, 9, 6,131, 1, 55,110,220,192,158, 61,123,236,202, 83,171,213, 56,113,226, 4, 6, 15, 30, 12,177, 88, 12,145, 72, 84, 71,
- 38,195, 48, 48, 26,141, 48, 26,141, 48, 24, 12,208,104, 52, 56,113,226, 4,170,171,171,155,132, 62, 85,251,156,209,184, 95,136,
-198, 99,142, 94,180,104, 17, 99, 51,183,160,170,170, 10,225,225,225, 30, 85, 32, 93,180,104, 81,157,243,249, 97,125, 46,124,125,
-155, 67, 32, 16, 43,170,171,110,185, 45,243,200,145, 35,168,174,174,198,224,193,131,111,196,198,198,182, 42, 45, 45,197,206,157,
- 59, 77, 97, 97, 97, 24, 48, 96,128,211, 49, 50,115,220,232, 7,250,230,204,197,139, 80, 6,250, 97,254,202, 15,110,245,237,215,
-179,221,157,219, 69,216,153,165,220,211,177,103,223,216,202, 74,213,110,158, 58,155, 62,216,210,191,214,176,173, 5, 32,116, 54,
-201,178,147,171,171,247,141, 65,254,175,188,242,138,211, 99,202,203,203,241,211, 79, 63, 17, 46, 74, 0, 75,214,245,181,214, 27,
- 66,158,181,229,239, 13,235,223,154, 64,109,201,212,213,115,224,202, 50, 2, 64,177,214,190,181,229,111, 77,117, 92,159, 25,214,
- 3, 97,253,159,253,172,172,204, 92, 25, 49, 44, 44,231,177, 24,168,215,127,207, 65,231, 91, 10,197, 45, 53,131,201,157, 5,120,
- 34,194, 8, 38,140, 64, 20, 38, 64, 85,169, 24,190, 85, 26,116, 59,245,149, 34, 55,122,182, 76,237,215, 65,233,216,146,164,112,
-225,194, 5,136,197, 98,140, 26, 53,202, 66,218, 34,145, 8, 52, 77,131, 16, 2,131,193, 0,163,209, 8,157, 78,135, 91,183,110,
- 65,161, 80, 56,220, 82,153,166,105, 24, 12, 6,156, 58,117, 10,195,135, 15,135,175,175, 47,124,124,124, 44,242, 88, 5, 64,167,
-211,161,186,186, 26,103,206,156,129, 86,171,117,171, 48,147, 82,169,148, 10, 4, 2, 69, 85, 85, 21,196, 98, 49,138,138,138, 94,
-155, 60,121,114,149, 68, 34,249,193, 19,210, 86, 42,149,211, 4, 2,193, 47, 86,242, 46, 79,158, 60,249,146, 68, 34,153, 10,243,
- 14,149,110, 91,194,239,188,243,142, 98,233,210,165, 69, 0,154,215,146, 55,206,159, 63,143,230,205,155, 59,172,187,238,138,252,
-191,153, 53, 11, 19,250,246, 5, 0,180,156, 59, 23,190,126, 45, 80, 93,121, 19,149,170,171, 50, 66, 76, 74,119,101,246,238,221,
- 27, 69, 69, 69, 56,112,224, 64, 7,154,166,113,230,204, 25,132,133,133, 97,223,190,125,208,235,245, 46,251,177,244,163,249,117,
-222, 7,232, 13,104,109,212,226,141,183,222,109,183,242,147,247,241,239, 79,190, 70, 27,218,132,175, 63, 89,145, 51,234,249,233,
- 60,187, 62,130,228,207,182,115,218, 11, 0,120,176,254,183,171,247, 15, 19,222,220,169,239, 81,128,181, 18, 80, 95,139,157, 37,
-216,111,159,253,222,225,113, 47,111,122,137,179,130, 87,235,218,167,236, 76,216,214,223,183, 40, 8, 92, 66, 0,236,111,219,254,
-119,165,180, 60,106,208, 86,148, 72, 71,232, 78, 40,138, 4, 38,116, 14, 6, 58,180, 39, 16,244, 22, 67, 24, 25, 9,177, 78, 11,
-221,111,183,160, 83, 9, 33, 96, 68,208,230,252,160,160, 39,188, 46, 99,132,246,195, 1,172,123, 62, 47, 47, 15,161,161,161,144,
-201,100,144, 72, 36, 16,139,197, 16, 10,133, 22,171, 95,171,213,162,176,176, 16,123,247,238, 5, 77,211,160,105, 26,206,228,153,
- 76, 38,156, 59,119, 14,195,134, 13, 67, 80, 80, 16, 36, 18, 9, 4, 2, 1,140, 70, 35,244,122, 61, 42, 43, 43,113,244,232, 81,
-232,116, 58, 8,133, 66, 75, 46,128, 43,252,248,227,143,210,234,234,106,197,181,107,215, 80, 89, 89, 9,177, 88,140,150, 45, 91,
-126,181,127,255,126, 12, 25, 50, 68,232,239,239,255,173, 59, 74,192,143, 63,254,248,108,117,117,245, 47, 54,242,162,247,239,223,
- 31, 61,100,200,144,159,252,253,253,167,114,149,199, 48,140, 84,175,215,163,172,172, 76, 97,229, 81, 0, 0, 44, 93,186,180, 96,
-209,162, 69,109,166, 78,157, 58, 74, 34,145,184, 53,255,209, 2,177,212,182,237,238,151, 95,162,229,164,182,248,247,191, 63,151,
- 25, 12, 53, 30,205,167, 7, 14, 28, 80,252,254,251,239,120,251,237,183, 43, 5, 2, 65,144, 68, 34,193,144, 33, 67,160, 80, 40,
-144,149,149,133, 54,109,218,184,225,239,160,240, 99,222, 29,108,188, 82,128,204,205,223, 65, 32,160, 48,127,238,159,152, 62, 45,
-155,209,169,111,188,139, 53,238,202,227,209, 40,228,111,171,156,218, 83, 10, 60, 94, 5,208,216,219,219, 70, 70, 70,202, 92,253,
- 61,108,107,189, 33,228,121,195,234,111, 72,200,229,242, 58,150,126, 89, 89,172,197, 66,199,253, 45, 64,221,118,251, 59, 35,250,
-176,176, 28,143,172,127,163,209, 40, 61,122,244, 40,113,212,102,251,153, 35, 88, 31,111, 52, 26,165,182,159,217,182, 57, 67,217,
-185,227,138,194,130, 74, 52, 15, 20, 34, 50,144, 64,216,140,129,240,169,167,225,223,231, 7,248,246,251, 20, 62,193,190, 16, 87,
-107,160, 86,155,208, 94,160,198,190,117,142,149, 39,154,166, 33, 20, 10, 33, 18,137,112,229,202, 21,156, 57,115, 6, 65, 65, 65,
- 8, 15, 15, 71,120,120, 56,154, 53,107,134,144,144, 16,168, 84, 42,236,219,183, 15, 2,129,192, 18,219,183, 7,246,115,177, 88,
- 12,147,201,132,203,151, 47,195,207,207, 15,205,154, 53, 67,243,230,205, 17, 17, 17,129,128,128, 0, 92,190,124, 25, 6,131,193,
- 18, 34,112,164, 80,216, 90,254,247,238,221, 83, 92,189,122, 21,157, 58,117,194,184,113,227, 48,104,208, 32,168,213,106,236,217,
-179, 7,167, 78,157,250,159, 86,171,229, 92,187, 88,169, 84,202,238, 21, 21,255,154,127, 71,133,192,206,131, 17, 61,238, 47,104,
- 51, 40, 1,229, 58, 26,187,114,118,227,212,169, 83,147,181, 90,237,223,184,146,127,101,101, 37, 78,159, 62,173, 56,112,224, 0,
-122,247,238,141, 69,139, 22, 53, 67,109, 60,125,209,162, 69,109, 0,192, 29,242,167, 5, 98,169,127, 64,107,105, 88,120, 79,197,
-186,159, 79, 99,214, 55,223, 32,235,196, 9,100,157, 56,129,150,115,231, 2, 0, 12,134,154,189,158,140,193,172,172, 44,146,153,
-153,137, 41, 83,166,220, 8, 12, 12,164,253,252,252,114,143, 28, 57,130, 3, 7, 14,160,164,164, 4,209,209,209,110,201,251,252,
-196, 21,124,114,248, 44,214,124,242,143,211, 66,129, 6,180,169, 10, 31,127,246, 13,253,203,190, 92, 20,210, 66, 60,241,196, 19,
- 60,203, 62, 38,160, 61, 37,248, 70,220,188,162, 97, 44,236,197, 71,136, 55,227,246,222,150,215,148, 21, 1, 71, 22,189,141, 50,
-224,145,167,194, 94,187,173, 87,128, 11,170,170,170,164,187,119,239, 86, 28, 57,114,196, 97,155,245,103,206, 96,125,252,238,221,
-187, 21, 85, 85, 85, 82,235,207,108,219,156, 33, 72, 91,138,172,155, 90,108,191,198,224, 86, 57,133,123,197, 0, 45, 12, 6, 77,
-133,131,210,250,160,230, 30,133,211, 55, 25,156,185,169, 69,105,149, 1,189,194,124, 20, 92, 20, 0, 31, 31, 31, 92,189,122, 21,
- 23, 47, 94, 68, 88, 88, 24, 66, 67, 67, 17, 26, 26, 10,181, 90,141, 3, 7, 14, 64, 36, 18, 65, 44, 22, 59,221, 75,129,245, 14,
-176, 74, 0, 33, 4,249,249,249, 8, 11, 11, 67,219,182,109, 17, 17, 17,129,252,252,124,152, 76, 38,248,248,248, 64, 44, 22,215,
- 89,121, 96,111, 90, 97, 95, 20, 23, 23, 43,110,223,190,141, 30, 61,122,224,233,167,159, 70, 92, 92,156, 44, 46, 46, 78, 54,124,
-248,112,152, 76, 38, 28, 58,116, 8,249,249,249,131, 1,112,138, 39, 20, 23, 23,239,185, 87,166, 66, 88, 84, 31, 68,199,206, 68,
-143,137,115,208,109,226,108,116,120,234, 89,232,137,128,149,199,233,254,214,230, 62, 40,174, 92,185,194, 94,171,172,150,248,233,
- 69,139, 22, 97,233,210,165, 88,186,116,233, 69,219,188, 0, 71, 16, 8, 37,210,208,176,110,138,150,109,134, 41, 66,195,187,129,
-162,133,248,223,183, 10,204,250,230, 27,204,250,230, 27, 44, 93,186, 20,197,197,197,224, 42,207,198,242, 39, 91,182,108,193,144,
- 33, 67,208,175, 95,191, 14, 0, 36,187,119,239,238,127,253,250,117,156, 59,119, 14, 26,141, 6, 19, 39, 78, 28,197, 85,222,250,
- 75,183,240,233,209,139, 88,189,228,173,178,182, 79,116,232,173,174, 46,199,250, 95,119,227,244,153, 75,216,183,109, 23, 84,119,
-239, 97,226,196, 9,177,224,209,100, 17, 19, 19,227,208,250,231,148, 3,144,146,146, 66,229,228,228, 72,185,190,127,148,225, 77,
- 75,189, 33,228, 1,222,115,255, 55,164, 23,192,218, 58,247,146, 76,226,173, 28, 19,165, 82, 41, 45, 44, 44, 84,176,155,187, 56,
-106,243, 4,121,121,121, 40, 45, 45, 85,180,110,221, 90, 38,149, 74,149,142,218, 28, 18, 87,201, 45, 28,188,163,193, 68, 63, 63,
-236,191,197,160,117, 63, 31,116,210,229,162,252,252, 43,216,244,241,105, 48,215, 85,168,214, 19, 20, 84,153,224, 43,164, 97, 84,
-221, 69,176, 19,165,221, 90, 9,144, 72, 36,184,113,227, 6, 46, 94,188,136, 30, 61,122,160,188,188, 28,135, 15, 31,182,196,242,
- 93,197,235, 41,138,178,120, 1, 88,121,132, 16,220,186,117, 11,189,122,245, 66, 78, 78, 14, 24,134,129, 68, 34,129, 72, 36,178,
-172, 18,224,226, 1,184,121,243, 38,180, 90, 45,250,247,239,143,182,109,219,202, 4, 2, 1,130,130,130,240,228,147, 79,202, 14,
- 31, 62,172,184,121,243, 38, 42, 43, 43,207,128,163,203,254,230,205,155, 96,104, 49,218,196,196, 34,164,109, 52,104,129, 8,190,
- 65, 17,104,255,228, 68,220, 56,156,137, 90,121,215, 93,201, 33,132, 72, 43, 42, 42, 20, 5, 5, 5,104,223,190, 61,134, 14, 29,
- 42, 19, 8, 4,202, 97,195,134, 81,139, 22, 45, 34,131, 7, 15, 54,214,206,155,209,193,193,193,168, 85, 80, 76,206,100, 74, 36,
-225, 8,143,232, 3,189, 78,133,146,210, 19,208,233,202, 71, 27, 12,213,131, 0,124, 52,120,240, 96, 0,192,189,187,119, 81, 43,
- 79, 4,192,192,229,154,143, 31, 63, 62,117,221,186,117,152, 49, 99, 6,134, 13, 27, 6, 0,204,206,157, 59,133, 89, 89, 89,152,
- 53,107,214,216,222,189,123,239,114,231, 89,190, 92,169, 70,242,222,147, 88,246,166, 28,195,227, 98,195,106,170, 75,176,225,215,
-189, 72,249,223, 70,108,159, 63, 19,145, 69,183,177,188,242, 46,194,194,194,249, 36,192, 71, 4,214,110,127,123,249, 42, 14,115,
- 0,108, 99,251,174,222, 63,142,104,168, 37,120,238,226,195,129, 31,202, 40,138,106,146,253,109,179,212,175, 78, 30,128,173, 50,
-224,205,229,127, 92,149,131,204,204, 76,233,189,123,247, 20,122,189,222,105, 91,125, 80, 94, 94,142,154,154, 26, 69,101,101,165,
-204, 94, 91, 66, 66,130,195,123,119,170, 76, 3,149,158,193,169, 98, 35, 10, 43,140,104,113, 88,136,222, 27,242,112,227,250, 57,
- 92,250, 93, 15,163, 80, 0, 61, 3,104,245, 4,229,132, 65, 68, 40,113, 74,216,214,203,255,216,140,253,123,247,238,161, 67,135,
- 14,184,126,253,186,197,229, 47, 20, 10, 45,199,187, 27,206,179,174, 33,192,254,111,160,144, 96, 5,234,151,189,255,128, 49,238,
-234, 0,134, 97, 80, 83, 83, 99,158, 28,133, 66,153, 64, 32, 80,218,120,146,132,153,153,153, 72, 72, 72,160,147,147,147,239, 45,
- 95,190,220,152,156,156,236,244,226, 41,202,172, 16,105,212,247, 80, 93,117, 75,102, 50,105,149, 0,246, 1,248,168,170,170, 10,
-153,153,153, 22,101,178,115,231,206,122, 87,242,106,159,175,132,244,244,244,180,137, 19, 39, 90,200,255,183,223,126,163, 51, 50,
- 50, 32,149, 74,227,220, 37,255, 59,106, 29,254,148,117, 24,111, 76,155,136,169,127,154, 2,181,182, 18,155, 50,149,248,236,235,
-245,248,126,236, 64, 68, 22,221,230,217,244, 49, 80, 6,108,149,128,135, 82, 9, 80, 46,151, 19,219,236,115,103,239,121, 60, 48,
-177, 55, 89,101,203, 54, 7, 0,120,192,245, 79,213,254,217, 61,214,209,243,226,234,185,224,250,188, 36, 36, 36, 40,187,116,233,
- 34, 11, 13, 13,117,218, 86, 31,132,134,134,162, 75,151, 46,117,136,222, 94,155, 61,104, 76, 65, 48, 80,192,177, 18, 29,138, 76,
- 38,236,206,215, 98, 67,154, 22,123,110, 71, 32, 79, 28,140,219, 42, 3,110, 85, 49,168, 49, 2,106, 35,129, 79,120, 75,151,196,
-204,174,239, 55,153, 76, 48, 26,141, 8, 15, 15, 71, 64, 64, 0, 58,116,232, 0,131,193, 96,105,183, 87, 16,200, 86, 30,187,190,
-223,104, 52, 66,163,209,128, 16,130,118,237,218,161,160,160, 0,173, 90,181,130, 80, 40,132, 78,167,131, 94,175,183,252, 46,151,
-240, 96,251,246,237, 33,145, 72,144,155,155,139,219,183,111, 43, 76, 38, 19, 42, 43, 43,169,223,127,255, 93, 81, 93, 93,141,246,
-237,219, 35, 40, 40,232,105,174,115, 84,251,246,237, 65, 51,122, 20,156,200, 65,197,237,203, 96, 76, 6,104, 42,139,113,243,247,
-109,208,215,148,179,242, 58,114, 81,110, 88,132,135,135, 43, 24,134,177,120, 58,151, 46, 93, 74,157, 59,119, 14,181,164,205, 0,
-104, 97,175,224,145, 45,140, 70, 13,140,134,106,248,250,183,132,196, 55, 12, 0, 37, 5, 96, 92,186,116,105,184,149, 60,172, 89,
-179,134, 45,160,100,247,154, 75, 75, 75,201,247,223,127, 79, 82, 82, 82,200, 7, 31,124,176, 57, 33, 33, 1,113,113,113,172, 55,
-160,114,203,150, 45,152, 58,117,106,194,180,105,211,182,113,233,179,210,210, 82,242,195, 15, 63,144,231, 95,121, 13,163,210,247,
-226,205,151, 38,227,239, 11,231, 64,171,175,198,181,171,183,144,146,178, 1, 25,241, 67, 32,109,215,220,227,177,145,145,145,193,
-207,235,141, 8,219,112,128,109, 34,224, 67, 45, 5,108, 27, 54,112,245,254,161, 89,250, 14, 98,245,182,214, 62, 87,235,223,145,
-188, 35,139, 23,147, 35,139,239,187,243,109,223,187,242, 68,120, 75,158,183, 61, 0,172,101,239, 40,222,207,182, 91, 31,235, 10,
-174,242, 7,220, 9, 15, 72,165, 82,101,124,124,188,204,186, 56,141,189, 54, 79,208,185,115,103,196,199,199,215,113,245,219,107,
-115,248,253, 46,157,209,197, 95,128, 64, 10, 48, 16,130, 11,229,122,172,203,211,225,167,131,133, 56,122,181, 12,133, 26,160, 84,
-107,194,213,106,130, 59, 58,130,106,189, 65,230,140,188,216,165,121,122,189, 30, 26,141, 6,173, 90,181, 66,207,158, 61,107, 61,
- 50, 97, 24, 52,104,144,133,176, 89,210,118, 68,216, 44,161, 27, 12, 6,232,245,122, 80, 20,133,168,168, 40, 84, 84, 84,224,214,
-173, 91, 40, 43, 43, 67,199,142, 29, 65,211, 52,244,122, 61,116, 58,157,229, 59,174, 16, 17, 17, 33,107,219,182, 45,206,157, 59,
-135, 29, 59,118, 96,235,214,173,138,173, 91,183,238,217,191,127, 63, 4, 2, 1,158,122,234, 41, 68, 70, 70,106,192,177,144, 77,
- 68, 68, 68, 66,139,176, 96,148,230,159,196,165, 93,223,226,220,182, 85,184,176, 45, 5, 55, 14,101,192,135,102, 88,121, 5,174,
-228, 8,133, 66,101,139, 22, 45,100, 65, 65, 65, 56,117,234, 20,110,223,190,173, 80,171,213, 82,107, 69,160,214, 19, 64,175, 91,
-183, 14, 61,122,244,112,121,110,122,157, 10,170,138, 60,136, 68,254, 8, 9,235,170,240, 15,104, 3,145,200, 95, 74, 81,244, 96,
-246,152,192,138, 28, 40,190,255, 59,198,116,173,102,149,230, 7,176,109,219, 54,248,250,250,162, 71,143, 30,232,216,177, 35,106,
-195, 7,198,242,242,242,234,244,244,244,144,152,152,152,132, 81,163, 70,109,225,250,236,102,101,109, 67, 80, 80, 0, 70,140,124,
- 82, 29,211,175, 55,158,125,101, 22,212,148, 17,197, 69,101,152, 61,247, 95, 88, 62,160, 51,250, 53,247, 92, 73,206,200,200, 32,
- 31,127,252, 49,175, 4, 52, 17, 69,192,238,243,222,132,172,220, 38,219,121,222,138,193, 15, 90,178,132,178, 37,233, 65, 75, 60,
- 15, 41,120, 34,207,218,114,126,121,211, 75,156, 44,113,174,100,203,186,252,109, 93,255,245,205, 11,176, 62, 15,219,250, 0, 92,
-101, 4, 6, 6, 42, 71,143, 30, 45, 11, 11, 11, 83, 56,106, 27, 52,104, 16,183,126,175, 61,110,208,160, 65,232,219,183,175, 76,
- 40, 20, 42,173, 63,179,109,115,106, 29,250,248,203,122,181,106,166,232, 80,174, 66,137,137, 65,165,214, 8, 31, 66, 64,116, 70,
-180, 15, 16,162,220,104, 68, 65,141, 17, 0, 48,177, 75, 11,116, 28, 56,210,161, 44,214,234,103,151,250,245,234,213, 11,125,250,
-244, 65,121,121,185,101,121, 94, 96, 96, 32, 6, 15, 30,140, 77,155, 54, 89,106, 2, 56, 34,108, 86,153, 48, 24, 12,160, 40, 10,
-209,209,209,208,104, 52, 40, 46, 46,182, 44, 43,212,106,181,136,142,142, 70, 81, 81,145, 69,158,163,186, 2,182, 74,217,237,219,
-183,101,254,254,254,138,107,215,174,225,212,169, 83,236,178, 61, 12, 24, 48, 0,125,250,244,217, 38,145, 72,230,131, 99, 8, 64,
- 42,149,110,185,125,251,246,139,254,126,213, 63, 94,187,250, 59, 10, 79,236,186, 47,111,232, 40,244,233,211,103,166, 68, 34,201,
-228, 34, 43, 40, 40, 8,253,250,245,195,111,191,253,134,131, 7, 15,162, 77,155, 54,138,142, 29, 59,194,223,223, 95,182,104,209,
- 34,217, 23, 95,124,161,232,208,161, 3, 6, 12, 24,128, 21, 43, 86, 96,198,140, 25, 78,229, 49,140, 65,169, 42,207,147,129, 64,
- 17, 28, 22,141,150,173,159, 82,104, 52, 37,168,174,188,129,127,127,242, 69,252,251,239, 45,218,210,186, 45,240,211,235,126,160,
-166,149, 67,246,146,125,165,231,242,229,203, 24, 61,122, 52,134, 13, 27,198,208, 52, 77,171,213,106, 16, 66,240,213, 87, 95, 5,
-116,237,218,117,210,243,207, 63,191,197,157,113,117,233,210,101, 76,157,242, 12,158,127, 62,193,175,103,175, 39, 80, 90,165, 66,
-181,170, 4, 73,127,255, 23,254,245,236,104,140,102,212,245, 34,255,207, 62,251, 12,209,209,209,248,242,203, 47, 49,119,238, 92,
- 50,105,210,164, 71,191,104,215, 35, 0, 71, 9,127,141,170, 0,120,115, 85,193,212,169, 83, 41,111, 85, 2,116, 5,219, 66, 60,
-222, 82, 2,234, 75,254,158,202,179, 94, 79,239,141, 82,192,181,199,214,185,213,168,103,181, 63, 91,165,193,250, 60, 60, 89, 1,
- 96,109,221, 13, 28, 56,144,114,212,102,251,153, 35, 56, 59,158,171, 12, 22, 79, 73, 71, 41,243,133, 4,198, 35, 89,184,174, 2,
- 2, 40, 17, 58, 4,208, 40, 48, 81, 16,248, 8,177,175,200, 4, 45, 3, 68,248, 8, 16, 53, 96, 4, 36, 93, 6, 40,157, 41, 0,
- 6,131, 1, 2,129, 0,157, 58,117, 66,191,126,253, 80, 89, 89, 9,173, 86,107, 81, 0,244,122, 61,194,194,194, 48,108,216, 48,
-108,217,178,197, 18, 18,176, 7,147,201,100,201,234,239,214,173, 27,106,221,244,208,106,181,150,241,204,122, 18,186,117,235,134,
-178,178, 50, 84, 87, 87, 59, 27,203,117, 62,120,241,197, 23,149, 74,165,114, 84,143, 30, 61,246, 88, 21,238,169, 24, 62,124,248,
- 30,137, 68, 50, 3,128,214,157,190,124,241,197, 23,215, 41,149,202,202, 30, 61,122,100, 90,201, 43, 25, 62,124,248, 87, 18,137,
-228, 59,174,114,104,154, 86,182,110,221, 90, 54,110,220, 56, 92,187,118, 77,113,241,226, 69,220,188,121, 19,129,129,129,138,144,
-144, 16,140, 25, 51, 6,255,253,239,127, 49, 96,192, 0,206,231,102, 52,170,149, 21,229,151,100, 90,109, 25, 66, 66,163, 21, 1,
-129,237, 16, 24,212, 30, 53, 85, 5, 91,150, 45,255, 31, 94,120, 62, 22, 63,189,238,103,183,159, 88, 76,152, 48, 1, 89, 89, 89,
-184,125,251, 54, 93, 86, 86, 6,173, 86,139,125,251,246, 9, 7, 13, 26,132,209,163, 71, 87,186, 59, 30, 38, 78,156,128, 77,155,
-182,160,178,162, 20,183, 11,239,224,245, 87, 95,210,191,245,246, 82,241,179,163,134, 96,152,174, 18, 16,121, 70, 15, 25, 25, 25,
-228,189,247,222,179,148,131,142,138,138,194,199, 31,127,140,133, 11, 23,242, 74, 64, 35, 43, 5,141,162, 0, 52,196,170, 2,111,
-144, 59,139,146,146,255, 97,241,145,205, 78,171,237,185,147,252, 87, 82,242, 63, 28, 89,188,217,174, 85,110,235,178,231, 66,218,
- 37,255, 43,193,145,205,139,189, 38,207,155,224, 18,211,103,247, 0,112,231,121,249, 35, 13,206,142, 67,100,178,211, 58,163,162,
-120,207,110,136,140, 26,156,174, 34,200,169, 50, 66, 76, 81, 8, 39, 4,178, 86, 33, 8,109, 25, 33,107,251,164,212,133,165,105,
-246, 0,116,236,216, 17,131, 6, 13,130, 70,163,129,193, 96,128, 88, 44,182, 16, 54,107,165, 71, 68, 68, 96,232,208,161,200,206,
-206,118,234, 1, 16, 10,133,232,211,167, 15, 40,138,130, 90,173,182,120, 23, 88,165,157,173, 46,200, 48, 12,122,245,234,133,195,
-135, 15,195,157,228, 74,169, 84,170,192,253, 60,145, 0,152,171,237,221, 4,199, 76,120,123,158, 0, 43, 89, 97, 0,202, 0,184,
- 93,155,152,166,105,101, 72, 72, 8,122,245,234, 37, 19,137, 68,236,242, 71, 5, 0, 20, 20, 20, 96,252,248,241, 88,177, 98,133,
- 91, 50, 77, 38,157,178,166,186, 64,170,215,171,100,190,149,215, 21, 65, 33, 81,240, 11,104, 13,191,128,214,216,185,251, 30,168,
-209, 45,156,126,127,200,144, 33,148, 88, 44, 38,101,101,101,152, 48, 97,130, 62, 60, 60, 92,204, 48, 12,110,222,188, 9,120,144,
- 44,249,212, 83, 67, 40, 31, 31, 31, 18,116, 62, 23,175,190,250, 23,180,141,238, 34,254,248,141,191, 48,107,191,254,142,254, 74,
-160,245,232, 89,206,200,200, 32,201,201,201, 8, 9, 9, 65, 97, 97, 33,124,125,125,193, 48, 12,252,253,253,177,100,201, 18, 44,
- 94,188,152, 87, 2, 26, 24, 49, 49, 49, 56,121,242,164,231,165,128, 27, 2, 77,121, 85,129, 51,194,241,196,250,119, 36,207,214,
- 82,103,221,247,174, 72,219,219,242,184,144,172, 59, 36,108,187, 1,144,237,230, 63,214,199,240,176, 79, 54, 49,163,199, 81,101,
- 53, 26,105,176, 81,167, 16,220,200, 71,103,195, 29, 4,134,183,192,144, 94, 93, 17,222,166,153, 44, 56,102,164,203,241, 65, 8,
- 65,167, 78,157, 48,108,216, 48, 75, 60, 94, 32, 16, 64,167,211, 89, 74,247, 90,135, 9,218,181,107,135,161, 67,135, 66,169,180,
- 47,218,215,215, 23, 49, 49, 49, 16, 10,133,208,235,245,150,239, 89, 47, 29,180,222, 8,136,166,105,244,237,219, 23,185,185,185,
-158,116, 3, 1, 80, 85,251,231, 13, 84,123, 66,252,246,188, 70, 61,123,246,100,243, 40, 40,134, 97,164,106,181, 26, 58,157, 14,
- 93,187,118,197,202,149, 43,221,220, 28,135, 40, 13,250, 42, 24,244,213, 50,141,166, 24, 62, 62,161, 16,137, 3, 21, 52, 45,196,
-143,235,182,201, 94,156, 49,209,169,188,218,186,254,212,167,159,126,202,104, 52, 26, 0, 64,116,116,180, 91,229,151,173,209,175,
- 95,127, 74, 48,112,224,248, 89,239,125,154,101,150, 71,232,232,232, 39, 16, 61,105,210,139, 66,161,112,157, 39, 50,151, 47, 95,
-206, 15,234, 38,162, 4, 56, 35,255,135,170, 0, 60,170,240,230,178, 63, 91, 98,174,175,181,238,109,121, 30, 42, 79, 15,188,182,
-113,217,243, 15, 17, 71,140, 74,152,164,172,181, 94, 49,194,131,239, 39, 38, 38, 34, 52, 52,212,146,225,207, 48,140,197,133,207,
-122, 0,216,164, 63,118, 71,192,168,168, 40, 80, 20,133,159,127,254,249, 1,121,159,125,246, 25,210,210,210, 44,199,154, 76, 38,
-151,219, 1,139,197, 98, 12, 24, 48, 0, 92,178,227, 31, 85,101, 45, 32, 32, 0, 1, 1, 1, 8, 15, 15,175,135,183,138, 85, 4,
-170, 64,211, 66,152,243,177, 25, 5, 71,121,100,193,130, 5, 84,237,253, 36, 52, 77,215,107,220,155, 76,204,246,121,243,230, 81,
- 0,104,134, 97, 76, 52, 77,251,194,205,240, 11, 11,222,186,111, 90, 74,128, 43, 80, 49, 49, 49,124,134, 38, 15, 30, 60,120,240,
-224,241, 7, 3,205,119, 1, 15, 30, 60,120,240,224,193, 43, 0, 60,120,240,224,193,131, 7, 15, 94, 1,224,193,131, 7, 15, 30,
- 60,120,240, 10, 0, 15, 30, 60,120,240,224,193,227,177, 64,157, 85, 0,115,230,204,241, 56,131,115,213,170, 85, 15, 36, 19,242,
-242,120,121,188,188,199, 79,158, 92, 46, 39,207, 76,146, 99,115, 70, 10, 82, 82, 82,104,216, 89,131,206,247, 31, 47,111,201,146,
- 37,150, 99, 22, 47, 94, 76,185, 43,239,196,137, 19, 30,159, 95,223,190,125,255,240,242,220, 86, 0,216,193,237,232, 96, 79,150,
-188, 60,202,242, 60,145,217,212,175,215, 14,196, 0,130, 0,248,213, 62, 15, 12,128, 18,120, 97, 13,181, 55,225,110, 89, 98,119,
-251,180,177,138, 15, 85, 85, 85, 73, 15, 30, 60,168,216,187,119, 47, 0, 96,228,200,145, 24, 50,100,136, 44, 48, 48, 80,217, 20,
- 45, 6,150,252, 39,140,239,103, 4,228, 66,185, 92,206,252,209, 10, 55,241,112,141, 37, 75,150,144,248,248,168, 58,239, 93, 41,
- 1, 60, 26,217, 3,192,130,108,120,112, 3, 8,106,154,231,251,166,219,155, 32,234,179,251,159,183,229,217,187,222,250, 92,115,
- 83,191, 94,150,248,207,157,222,255,237,185,115,167, 70,183,108, 19,213, 66,165, 50, 32, 56, 88,132,187, 5, 87,153, 30, 61,250,
-148,245,232, 61,124, 16,128,107,238, 8, 60,126,232,107,146,127,245, 50,174, 94,215,226,214, 29,130,118,173, 40, 68,117,148, 32,
- 50, 42, 26,253,158,122,165, 73, 12,126,123,138, 4,187,235, 96, 99, 16,217,153, 51,103, 20, 49, 49, 59,176,122,181, 26, 74, 37,
-240,238,187, 59,113,235,214, 45, 69,203,150, 45, 33,145, 72, 80, 88, 88, 40,123,246,217,103,225, 13,133, 96,255,254,253, 68,165,
- 82,201,198,140, 25, 3, 31, 31, 31, 79,228,209, 0, 48, 97,124, 63, 38, 41, 41, 73, 8,164, 98,115,134,121,168,192,187,219,246,
-242,120, 12,160,215, 39, 35, 59, 59, 9,227,198,165, 34, 62,126,185,197, 35,192, 43, 2, 15, 7,124, 33, 32, 55, 96, 77,246, 20,
- 5, 48,191,132, 62,182,215,106,208,215,252, 41,123,199, 47,139, 58,119,238,210,117,242,164,145,104,215, 38, 8, 33,193, 62, 40,
-175,208,162,224, 78, 59,250, 74,126,121,179,173,153,223, 40,198, 61,253,220,167, 34,177,255,151,174,228,157, 63,179, 87,122,237,
-242, 86,133, 0,149,120,110, 34, 48,180, 63, 16,213, 1,200,187, 78,112,224,152, 6, 89,138, 83,216,182,241, 45,210, 41, 58, 78,
-214,189,151,235,138,118, 13,229,237,112,228, 69, 96, 55, 23,106, 12, 37,160,172,172, 12,127,255,187, 26, 17, 17, 64, 98, 34,176,
-108, 89, 53, 78,156, 56, 1,163,209, 8,137, 68,130,230,205,155, 43,182,110,221,138, 46, 93,186,200, 6, 12, 24,160,116,115, 2,
-144,158, 61,123, 22, 45, 90,180, 80,140, 25, 51,134,250,241,199, 31, 1, 64,145,147,147,131,233,211,167, 99,208,160, 65,238, 94,
-171, 24, 0,178,182, 31,167,129, 84,198,252,223,172, 67,243, 51, 8, 15,107,107, 31, 0,166, 76,217,136,236,108,243,255,164,164,
-171, 96, 61, 2,188, 55,224,225, 18,191,117,123,163,149, 2,110,234, 32, 27, 66, 45, 74,192,227, 76,254, 0,132,187,178, 55,188,
- 35, 27,209, 47,122, 96,223, 86,160, 40,115, 85, 55,134, 33, 8, 10,240,129,127,148, 24, 29,219, 5,163, 77,203,128, 14,187,178,
- 55,188, 51, 33,254,229, 52, 0,119,157, 9,188,118,121,171, 98,120,255, 74,188,241, 50, 32, 16,152, 21, 40,131, 17,240,247, 3,
-186,117, 6, 6,199, 0, 91, 21,149, 56,124,106,171,162,123,175,145, 30, 13,124,111,133, 0, 28,125,159, 85, 2, 30,246,205, 8,
- 11, 11,195,214,173,190,104,215, 78, 3,165, 18, 40, 47, 23,162,115,231,206,232,220,185, 51,170,171,171,145,159,159, 15,165, 82,
-137,202,202, 74,197, 19, 79, 60,193, 57, 52,240,235,175,191, 74, 53, 26,141, 66, 44, 22,163,188,188,174, 39, 75,163,209,224,127,
-255,251, 31,242,243,243,201,243,207, 63,239, 78,127, 50, 0,176, 57, 35, 5,128,156, 54,255,247, 28, 71,143, 30,181,244, 55,187,
-137,146,189, 54, 46,207,133,245,189,229,218,230,210, 40, 32, 68,138, 75,151, 48,168,186, 90, 17, 94, 80,128,219,205,155,227,120,
- 80,144, 76,212,189, 59, 8, 69, 41, 61,189,102,119, 55,140,226, 34,131,107, 91, 67,203,179,118,253, 39, 37,101, 35, 62, 62,202,
-242,159, 69,124,124, 20,175, 4, 60, 4,216,146, 61,187, 63,128,117, 59,191, 10,192,118,208, 63,230,215,119,238,244,254,101,157,
- 59,119,142, 30,212,175, 85,157,118,154,166, 32, 22, 11,224, 43, 17, 66, 36,162, 17,213, 41, 20, 81, 81,157,155,159, 59,189,127,
-171, 51, 69,241,248,161,175,137, 0,149,152, 55, 11,208,234,128,107,183,128,114, 21, 80, 81, 9,172,207, 4,230,190, 7, 44,250,
- 4, 24,210, 15,160, 73, 37,142, 31,250,154,183, 22,173,208,171, 87, 47,217,230,205,221,208,188, 57, 48,125,186, 16, 45, 91, 14,
-196,200,145, 35,101,241,241,241, 84, 92, 92,156,108,220,184,113,104,209,162, 5,142, 31, 63,142, 95,126,249, 69,177,115,231, 78,
-169, 78,167,147, 58,147,249,227,143, 63, 74,117, 58,157, 66, 36, 18, 57,253,109,133, 66,129, 13, 27, 54, 72,185,144,236,190,125,
-251, 8, 0,125, 74, 74,138,248,190, 18,112,159, 76,247,237,219, 71,220, 85,160,142, 28, 57, 98,249,115,214,230,137, 82,199,181,
-205, 25,249, 71, 94,188,168,120,246,228, 73, 69,187,203,121, 16, 87, 86,162,213,229,139,144, 30, 62,164,136, 56,117, 74, 1, 66,
-164,158,220,239, 35, 71,142,224,232,209,163,228,236,217,179, 82, 79,159, 25, 86, 6,151, 54,174,242,108,137,158, 75,155, 43,176,
-164,207,254,215,199,119,230, 7,252, 67, 34,126, 46,101,128, 31, 89, 15, 64, 67, 90,106,164, 1,207,207, 91, 46,102, 86,190,163,
-223,113,246, 27,231,206,159, 26, 63,109,178,204, 66,250,246, 32,241, 17,162, 66,165, 67,116, 84, 24,210, 54, 41,162,122,244, 30,
- 30,236, 72, 94,254,213,203,120,110,162,249,245,142,125,192,127,126, 0,198, 14, 7, 38, 72,129,139,121,192,137,115, 4,190, 18,
- 10,125,123, 0,227, 70, 2,191,102, 95, 70,191,167,188,103,185,123,210,119, 13,148, 83,225, 17, 2, 3, 3,149,213,213,230,124,
-203,233,211,167, 99,232,208,161,148,245,103,101,101,101,178,110,221,132,138,132, 4,128,162,142,161,168, 72,173,184,125, 59,202,
-153,251, 79, 74, 81,148,130,235,230, 48, 69, 69, 69, 10, 87,122,239,140, 25, 51,176,110,221, 58,172, 91,183,142,204,152, 49,163,
-206,189,216,183,111, 31, 89,183,110,157,229,184,166, 50, 31,112,109,115, 4,221,217,179,232,148,155, 11, 61, 77, 67, 68, 1, 70,
-134,128, 49,152,192, 24,141,136,216,191, 15,121,132, 32,168,111, 95,143, 9,220,207,207, 79,113,236,216, 49,217,204,153, 51,149,
-158,202, 0, 80,199, 34,183,215,230,137,119,161,190,228,239,136,232,179,109, 60, 1, 60, 26, 31,118, 21, 0, 71,201,111,158, 16,
-142, 43, 66,116, 87,222,195,142,209,122,146, 49,238, 44,169,208, 19,121,246,190,227, 97,226,162,176,101,235,168,238,173, 91, 6,
-128, 16, 96,255,161, 91, 80,107,204,187,174,246,235,211, 18, 17,225,190,184, 85, 80,197,228, 93, 43,167,133, 66, 26, 93, 34, 67,
-209,186,117,231, 16,152,183,104,181,139,171,215,181, 24,218, 31,208, 25,128,237,123, 1,197, 33,130,214, 45, 40, 68,182, 7, 70,
- 15, 3,186, 70, 81, 16, 10,204, 91,139, 15,142, 1,254,157,162,229,212,223,214, 46,121, 46,175,185,104,188,214,177,126,235,126,
-247,230, 10, 3, 79, 80,187,157, 43,122,247,238, 45,179,253, 76, 32, 16, 40,186,119, 47,194,162, 69,102,245,116,233,210,203,184,
-126,189,135, 67, 89, 90,173,214,165,229,111,141,235,215,175,187, 60,102,196,136, 17,212,136, 17, 35, 44,100,191,110,221, 58, 98,
-171, 32,140, 24, 49,162, 81,250,174, 33,172,127, 0,232, 82, 82,170,208, 27, 12,160,105, 26, 68, 32, 0,195, 48, 48, 48, 12, 24,
-147, 9, 38, 19,131,182,119,238, 40, 42,251,246,245,248,154,213,106, 53, 0, 40,142, 30, 61, 10,138,162,220,206,239,104, 8, 37,
-192, 91,150,127,118, 82, 54,198,165,142,195,148,141, 64, 82,182,249,117,118, 82,182, 69, 57, 16,111,201,227,153,247, 33,194, 58,
- 39,128, 83, 14,128,163, 85, 0,158,174, 14,112,100,113,121, 98,137, 57, 83, 26, 60, 85, 80,156, 93,183,237,119,185, 90, 17,142,
-146, 10, 61,145,231,236, 59,236,239, 80, 0,152, 13, 46,115, 23, 24,115,182,191, 15, 0,224, 86, 97, 37, 52, 26, 35, 0,160,115,
-100, 40, 34,194,125,113,234, 92, 17,125,233, 74, 25, 36, 18, 1,162, 58,133,160, 92,165, 7, 0,135,130,111,221, 33,136,234, 96,
-254,253,167, 71, 0, 49,221, 41,248,136, 1,163,209,236, 9, 8, 9, 4,242,111, 2,227, 70, 0, 29,218,154,143,111, 76, 88,147,
-190, 39,113,225,166,142,162,162,162, 6,243,162,212,146,188,197,226,111,108,242,183,198,242,229,203, 73,114,114, 50,229,233,231,
-182, 16, 93,205,131,206,160, 7, 37, 16,194, 68, 8, 40, 0, 70, 19, 3,131,145, 1, 49,153, 64, 93,185, 4, 96, 66,189,207,251,
-236,217,179,104,214,172,153, 66,165, 82,201,130,131,131, 61, 86, 2, 92,181, 61, 44,242, 95,188,120, 49,181,100,201, 18, 50,101,
- 99, 93,133, 0, 0,198,165,142,131,120, 75, 30,182,108,185,106, 89, 9,192, 38, 12,134,133,133,241, 76,253,144,201,223,161, 2,
-208,212,225,140, 16, 61, 33,216,250, 44,113,116, 42,183,129, 87, 19, 80,211,202,221,253, 13, 42, 56, 88,132,242, 10, 45,154,133,
-249, 33, 49,161, 43,140, 38, 6, 62, 62, 2, 8,104, 26,132, 16,196,141,141,194,196, 49, 81,160, 40,160,180, 92,131,224, 96, 17,
- 0,148, 57, 18,216,174, 21,133,171, 55, 8,186, 70, 1,163,158, 50,207, 58, 23,243,128,222, 93,129,208, 32, 96,188, 20, 96, 24,
- 64, 40, 0, 46, 95, 51, 31,207,245,222,186,243,218, 94, 33, 17,119, 61, 61,141,161, 4, 48, 12, 35,109,211,166, 13,174, 94,189,
-138,125,251,246, 41,134, 15, 31, 46, 11, 8, 8, 0, 77,211, 74, 0, 48,153, 76,178,243,231,155, 43,222,127,191, 0, 20, 69,161,
-168, 40, 26,209,209, 29,113,249,242,101, 71,242,236,182,111,216,176,225, 65, 47, 18, 33,120,238,185,231,220,186,102,107, 37,160,
- 41,145,191, 55,148, 4,107,148,181,109, 3,241,197, 75, 32, 34, 64,204, 16,115, 98,171,201, 8, 61, 49, 65,109, 52, 66,211,185,
-171, 87,206,189,103,207,158,160, 40,202, 35,242, 7,128, 65,131, 6, 97,224,192,129,212,145, 35, 71,136,179, 54, 87,168,245, 24,
-212, 33,124,123,109,238, 32, 41,251, 62,241, 3,120,192,242,103, 19, 6,183,108,185,202, 51,117, 35,144,255, 35,171, 0, 52,180,
- 66,225, 45, 66, 32, 4,160,159, 43,111, 48, 37,128, 93,185, 64, 79, 43,231, 98,253, 3,128,240,110,193,213,146, 91, 5,109,155,
- 53, 11,243,195,138, 85, 71, 49, 98, 72, 59,244,235,221, 2,148,136,178,172, 8,168,221, 58, 30,183, 10,170,112,183,224,234, 53,
- 0, 14,205,202,168,142, 18,252,150,171, 65,215, 40,160, 89,127,224,237, 57,192,235, 51,129,224, 64,179,219,255,253, 47,128,247,
- 94, 55, 31,251, 91,174,249,120, 79, 9,218, 91,150,122, 83,170, 5,112,254,252,121, 72, 36,230, 62,217,182,109, 27,110,222,188,
-169,120,226,137, 39,100,163, 70,141, 66, 85, 85,149, 52, 44, 44, 76,113,224,128, 17, 74, 37, 48,112,224, 0,180,111,223, 94,214,
-182,109, 91, 0, 80,216,147,231,239,239, 15,189, 94,207,233,183,141, 70,227, 35, 63,118,173,201,159,139, 34,192, 85, 9,184, 26,
-209, 92,230,115,250,180,130, 33, 4,254,180, 16, 2, 1, 5, 35, 49, 65,109, 48,160, 74,175, 71, 97,235,214,178,102,245, 56,111,
- 63, 63, 63, 80, 20, 37, 27, 56,112,160,210, 83, 25, 44,209,187,106,123,216, 74,192,226,197,139,169,164, 90,203,222,150,252,173,
-173,127, 30,141, 75,254,188, 2,240, 48, 44,188, 6, 94, 82,104, 81, 2,184, 41, 26,198, 30, 61,250, 20,230, 93, 43,111,214,167,
- 71,115,188,253,250, 96,172,253,233, 12,124, 37, 66,196,244,108, 14,138,162,172, 44, 73,130,188,107,229,232,209,163,207, 89, 0,
- 85,142, 4, 70, 70, 69, 99,219,158, 83,152, 57, 5, 32,249,192,224,201, 64,100, 59, 96,221,102,171,131, 94, 7, 76, 38, 96,219,
- 30,243,241,141, 5,103,158,162,198, 90, 6, 88, 86, 86,166,232,214,237, 26,190,253, 22, 0, 76,248,224,131,211, 56,113, 66,173,
- 80,171,213,168,170,170, 66,126,126, 62,238,221,187,135,126,253,250,225,185,231,158,115,185, 12,144, 16, 34, 99, 24, 70, 65,211,
-174, 23,248,176,138,135,187, 96, 67, 0,235,214,173,195,136, 17, 35, 26,117,124, 37, 39, 39, 83, 44,241,187, 10, 1,184, 58,198,
- 26,161,125,251,162, 84,175,135, 73,161,132, 94, 44, 66, 0, 17, 66,203, 48, 80,233,245,168, 26, 53, 26,205,250,247,247,208, 43,
- 72, 97,224,192,129, 30,199,253,173,101, 88, 19,189,189,182,250, 40, 1, 71,143, 30,117,218,198, 5,246,200,159,181,252, 1,240,
- 9,129,141, 76,254,188, 2,240,136,195, 18,255,231, 30, 6, 48,245,232, 61,124,212,214,204,111, 14,252,158, 27,216,245,201,254,
-173, 49, 62, 54, 18, 59,118,231, 99,219, 78,243,224,124,103,193, 16, 48, 12,193,239,185,133,184,122, 53,239, 70, 92,194,172,215,
- 0, 24, 28, 9,236,247,212, 43,212,182,141,111,145,149,223,152,151, 2,174,254,208,188,244, 47,118,168,121, 41,224,202,127,154,
-201,127,229, 55,128, 9, 65, 30, 87, 4,172,175,101,238,202,131,208, 88,171, 0,106,106,106,208,183,175, 22, 3, 7,154,223, 15,
- 24, 64,176, 99, 71, 62, 46, 95,190,204, 22, 2,130, 84, 42, 69,151, 46, 93, 56,213, 0, 24, 59,118,172, 50, 35, 35,195,165, 23,
-192,104, 52, 34, 36, 36, 68,230,238,249,214, 46, 7,180,172, 12,216,183,111, 31,241, 52, 12, 48,104,208, 32, 78,109,238, 40, 1,
-174,142,227, 44,148,166,149,250, 39,159,148, 93, 16,137,208,238,206, 29, 69,192,205,155,208,118,234,132,235,205,155,203,194,250,
-245, 3,106, 67, 52, 30, 16,172, 55, 72,250, 1, 25,246,218,184,246,165,237,113, 44,225,187,106,243, 4,182,164,207,122, 4,234,
- 27,194,227,241, 32,184, 36, 70,243, 10, 64, 3, 90,230, 77,244, 55, 74,199, 61,253,220,103,217, 59,126,121,235,246,157,170,168,
-206,157, 66, 49,113,108, 20, 66, 67, 36, 40,175,208,226,196,153,123,200,187, 86,142,171, 87,243, 14,142,123,250,185, 95, 1,220,
-114, 37,176, 83,116,156,108,127,238, 86,197,193,220, 74, 76, 28, 5,172,249,200, 92, 9,240,234, 13,224,127, 27,204,150,191, 9,
- 65,232, 20, 29, 39,243,244, 90,235, 19, 2,224, 74,254,141,145, 3,112,231,206, 29, 89,104,104, 51,197,177, 99,197, 0,128,203,
-151,131, 48,112, 96,119,132,135,135, 67, 34,145,224,206,157, 59,178,184,184, 56,183, 74, 1,119,236,216, 81,118,233,210, 37,133,
-181, 71,199,150,252, 59,119,238,140, 65,131, 6,185, 69, 98,236, 42, 0,171,216, 63,155, 16,232,145, 18, 96,143, 8, 61, 37, 71,
- 87,228,238, 22,249, 91, 41, 1,225, 3, 6, 64, 13, 80,234,218,166,250,166,170,213,151,252,221,233, 55,174,191,229,109,121, 92,
-201, 95, 31,223, 25,224,227,255, 15,197, 19,224, 72, 49,112,107, 25,160,167,201,114,238, 46, 3,244, 84,158,167, 50,189,125,126,
-206,250,201, 91,231, 87,159,196, 69,145,216, 63, 37, 46, 97,214,207,231, 78,239,255,122,211,230,189,145, 45,219, 68, 13,182,218,
- 11,224,112,143, 30,125,142,196, 37,204, 90, 4,160,134,139,188,238,189, 70, 42,187,247, 26, 73, 29, 63,244, 53,249,101,219,101,
- 44,253, 79,211,219, 11,160, 41,146, 63, 0, 60,255,252,243, 56,117,234, 20, 94,126,249, 88,173, 7, 96, 0,166, 77,235, 35,243,
-243,243, 83,122, 42, 51, 38, 38, 70, 25, 19, 19, 67,101,102,102, 74,171,170,170, 20, 2,129, 0, 52, 77,195,104, 52, 66, 44, 22,
- 35, 32, 32, 64,230, 5,242,247,138, 18,192,227,241,196,226,197,139,169, 37, 73, 75, 72,235,185,173,101,232,104,255,152,194,164,
-108, 5,159, 15,208,184, 16,114,157, 40,189, 61,241, 54,132, 60, 79,126,235, 81,190,222,122, 66,213,163,247,240, 23,123,244, 30,
-206, 86,140, 9, 0,208, 12,192, 29, 0, 26,212,150,125,117, 7,253,158,122,133,242,164,200, 79, 67,247, 67, 83,170, 43, 97, 11,
- 63, 63, 63,229, 83, 79, 61, 69, 61,245,148,247, 59, 46, 33, 33, 65, 9, 47, 21,183,100,227,254,182, 36, 63, 98,196, 8,106,221,
-186,117,164, 41,228, 3,240,104,122, 74,128,243, 3,192,147,127, 3,128,107, 21, 64, 0,160, 98, 98, 98,248,216, 11, 15, 30, 60,
-120,240,224,241, 7, 3,191, 23, 0, 15, 30, 60,120,240,224,193, 43, 0, 60,120,240,224,193,131, 7, 15, 94, 1,224,193,131, 7,
- 15, 30, 60,120,240, 10, 0, 15, 30, 60,120,240,224,193,227,241, 64,157, 85, 0,115,230,204,241, 56, 43,211, 94, 33, 7, 94, 94,
-195,200,227,178,137, 77, 99,202,203,201,201,145, 2, 80,164,165,165,121, 69,222,158, 61,123,164, 12,195,120, 77, 30,255,252, 53,
-154,188,231, 0,108,104,224,243, 19, 1,144,192, 92,180, 70, 11,243,106, 22, 2,155, 34, 54,252,253,104,250,242, 78,156, 56,225,
-177,188,190,125,251,254,225,229,185,173, 0,184, 34, 7, 71,112,103, 41,149,183,229, 61, 76, 36, 37,170, 8,196, 98,164,174,243,
-229,116,126, 57, 57, 57,210,180,180, 52,133,183,174,215, 90,222,167,159,126, 42, 91,176, 96,129,194,147,237,133,237,201, 59,251,
-159, 32,244,124,181, 18,245,145,199, 98,210,192, 44,197,169, 75, 38, 0, 64,106,106, 42, 73, 74, 74,170,215,253,140,110,241, 11,
- 52,198, 48,248,250,250, 34, 45, 45,141, 36, 38, 38, 54,218,243,225, 73, 29, 7,103,253,215,212,229,185,250, 29, 55,191,123,168,
-161,238, 11, 69, 81, 19,104,154,238, 78,211,180,148,162,168,104, 0,126,122,189, 62, 91, 32, 16,132, 48, 12, 83, 68, 8,249, 39,
-128, 82,120,161,154, 29, 15, 30,143,165, 7,192,222, 32, 39,132, 56, 27,116,110, 79, 24,222,146,231,174, 5,235, 77,236,218,181,
-203,229, 36,194,146,107,114,114, 50,154, 55,111,110,183, 2,222,130, 5, 11, 20, 92,127,147,149,199, 18,255,225,195,135, 45,138,
- 64,125,228, 49,231,255, 15,116,247, 15,240,253, 30,115,233, 88,230,252,255, 89,142,161,187,127,224, 86,191, 4, 85,206, 39, 12,
- 1,126,222, 97,150, 53,126,164, 8, 61, 58,159, 67,106,106, 42, 1, 0,119, 21, 1,149,241,103,105,197,245, 82,104,168,145,138,
- 26,157, 63,198,143,171, 64,155,150, 20,142, 29, 59, 72, 42, 43,181, 24, 53,106, 84,147,217,131,190, 41, 41,208,206,198,152,183,
-198,156,135,208, 91, 63,127,233,233,233,138,201,147, 39,203,198,142, 29,171,172,143, 80,129, 64, 48, 94, 40, 20,142, 16, 10,133,
-207, 11, 4,130, 80,154,166, 3,150, 47, 95, 78,191,245,214, 91,179, 76, 38, 19,140,102, 60,111, 50,153,226, 1,252, 86,171, 4,
-232,107,231,191, 6, 15,131,110,219,182,141,112,237,251, 9, 19, 38,184,117, 67,178,178,178, 72,125,190,207,227,241, 7, 91, 17,
-208,173,237,128,185,144,127,255,254,253,145,155,155,235,214,132,229,108,194,225, 34,207,158,252,228,228,100,228,231,231, 35, 45,
- 45,205,171,219,186, 38,197,167, 18,248, 70, 35,117,131,148, 2,128,212,180, 96,202, 29,242,255,244,211, 79,101, 69, 69, 69, 10,
- 71,228,159,156,156,140,229,203,151,187, 69,254, 0,144,152,152,136,193,131, 7,203, 6, 15, 30, 92, 47,121, 44,217,179,255,151,
-253, 11,117,200,127,225, 20, 9, 62,222,168,229,212, 87,193,154, 5,164,103,180, 0, 53, 26,130,249,127,146,224,240, 57, 35, 52,
- 53, 4,106, 61, 32,139, 57,135,115,151, 77,110,121, 3,242,111,173, 36, 21,119,253, 17, 24, 36, 70,203, 86, 1,136,104,209, 25,
- 55,174,234,209,177,187, 1, 34, 73, 17,114, 54,149, 96,211,166, 77,228,217,103,159,229, 39,188, 71, 7,150,237, 7,211,210,210,
- 20,241,241,241,216,184,113,163, 98,236,216,177, 15,220,195,126,253,250,145,247,223,127, 31,241,241,241, 78,239,175, 80, 40, 28,
- 37, 22,139,123,138,197,226,185, 98,177,216,239,214,173, 91,232,210,165, 11, 4, 2, 1, 2, 3, 3,145,151,151,135,128,128, 0,
-225,209,163, 71, 67, 14, 29, 58,180,255,213, 87, 95,237, 8,224, 6, 0, 49, 28, 20,187, 74, 74, 74,122,192, 88,177,158,183,216,
-118,138,162,144,154,154,234,242,249,203,204,204,116, 40,195,186,157, 16,130, 9, 19, 38,184,213,161,155, 55,111,174,215,247, 27,
-152,120,164, 49, 49, 49, 74,254,177,111, 60,210,247,200, 3,192,149,252,185, 34, 57, 57,217,229, 49, 92,136,203, 17,249, 47, 91,
-182, 12,111,191,253,118,157,118, 79,149,128,164,254,169, 4,225,209, 72,221, 41,165,172, 45,254, 49, 99,198, 80, 0,192,254,207,
-203,203, 35, 92,200,218, 25,249,215,122, 6, 92, 90,237,172,155,222,218,194,183, 13, 45,120, 34,207,153,133,191,112, 10,247,157,
-226,154,105,230,147, 46, 29, 4,240,245,161,208,161,181, 0, 37,229, 12, 12, 70, 1, 74, 43, 8, 84,213, 4,121,183, 25,128, 6,
-154,249,157, 70, 78, 78,142, 52, 54, 54,214,233,164,112,227,230, 10,105,183,206, 81, 56,116,247, 30, 58,181,143, 64,207,222,145,
- 16,248,132,161, 67,167,114,148,107,180, 40,186,107,194,237,123, 90,248, 9,243,145,147, 19,232, 82, 94, 67,195,145, 85,238,233,
- 51,232, 45,121,142,148,109,119, 60, 4, 94, 6,195,142, 17,138,162, 32,145, 72,100, 0, 20,182,207, 68,255,254,253, 57,145, 63,
- 0,136, 68,162, 16,137, 68, 50,179,164,164,196, 47, 58, 58, 26,125,251,246,133, 80, 40,196, 23, 95,124, 1,147,201,132, 94,189,
-122,225,215, 95,127,197,209,163, 71,113,250,244,105, 8, 4,130,175, 77, 38,211, 51,206,100, 62,243,204, 51,150,254,115, 53, 15,
-114, 33,220,148,148, 20, 89,203,150, 45, 21,132, 16,167, 6,208,221,187,119,221,222, 43,131,149,237,233,247, 89,162,190,112,225,
-130,211,121,163, 91,183,110, 50,119,201,252,194,133, 11, 10,149, 74,133,224,224, 96, 25,175, 8, 52, 77, 8, 29, 77, 62,174, 44,
-245,166,130,252,252,124,188,253,246,219, 30, 41, 16,206, 96,182,244,147,168, 93,187,118,145,180,212, 65,128, 88, 67,184,196,254,
-237,145,181, 45, 41, 59, 11, 11, 56,130,181, 66,113,248,240, 97,197,224,193,131,235,184,254,221,149,183,254,173, 0,135,147,219,
-140, 79,106, 56,203, 97, 24, 70,234,227, 71,129,166, 1, 63, 95,160,162,146,129,142, 16,248,251, 82,208, 50,128, 70, 71,208, 54,
-130, 6, 99, 4,174,220, 50, 33, 63, 63, 95, 1, 39,229,105,207,159, 75,151,246,236,217, 85, 33, 22, 19,252,109,230,147, 48,153,
- 8,238, 22,233,113,179,160, 2, 16,221,130,111,168, 14,119,138,174,131, 22,171,112,254,124, 5,130, 67,157,203,123, 88,176, 37,
-103,185, 92, 78,234,179,195,160,237, 70, 79,212,180,114,143,226,251,101,101,177,117,222,135,133,229,184, 36, 54,119,148, 18,219,
-118, 23, 74,138,137, 29, 35,113,113,113,136,141,141, 85,166,165,165, 65,163,209, 88,238, 33,107,249,199,197,197,113,186,167, 62,
- 62, 62, 67,106,106,106,186,118,235,214, 13, 50,153, 12, 11, 22, 44,192, 95,254,242, 23, 0,128,193, 96,192,218,181,107,145,155,
-155,139,227,199,143,227,151, 95,126,129, 70,163,233,204, 48,204,120,103, 50, 39, 78,156,232,213,231,105,219,182,109,156, 66,115,
- 20, 69, 41,220,117,225, 91,203,246,228,251,128,121,239, 8,149, 74,133,194,194, 66,187,159,183,110,221, 26,158, 18,120, 97, 97,
- 33, 10, 11, 11,121, 69,224, 33,195,218,221,239,204, 27, 32,116,215, 98,247, 54,209,214, 23,105,105,105,245,250,126, 82,170,156,
-160, 21,144, 26,111,158,184, 82,115,147,234,184,249,205, 22,191,138,216,122, 2,184,146,117, 81, 81, 81, 29,114,246,132,172,185,
-130, 85, 58,228,114, 57,113, 85, 15,154, 11, 1,176,238,127, 71,242, 8, 33,164,228,252,124,180,170,117,253,179,208,152, 8,180,
-122,192, 80,219,102, 48, 18, 16,218,252,250,204,233, 92,118,149,128, 93, 4, 6,170, 20, 53, 26, 26,205,194, 66, 80, 81,166, 70,
-133,170, 2,135,143,221, 69,193, 61, 2,177,191, 26,109, 58, 87, 67,163, 46, 65,151,222, 6,116,236,166,195, 47,107,114,177, 99,
-199, 14, 41, 63,228, 31, 13,176,214, 63, 69, 81,216,178,101, 11,137,139,139,195,214,173, 91,225,235,235, 43, 77, 78, 78, 86,184,
- 67,254, 0,124, 42, 42, 42,254,108, 48, 24,104, 63, 63, 63,140, 24, 49, 2,159,124,242, 9, 68, 34, 17,228,114, 57,190,251,238,
- 59,228,230,230,226,240,225,195,216,189,123, 55,206,156, 57,131,102,205,154, 53, 51, 26,141, 29,224, 98,175,139,164,164, 36,226,
- 42, 4,176,102,205, 26, 78,231,217,144, 33,128,204,204, 76,175,132, 0,130,131,131,101,133,133,133, 10, 71,159,213,247,190,243,
-138,192, 35,226, 1,120,148,144,146,146, 66,121, 35,107,157, 37,247,180,183,175, 1, 2, 49,146,198,118, 4, 66, 58, 34,181,118,
-193, 18,215,216,191,183, 97,125,109,108,210,159,181,229,111, 11, 54, 55,192, 81, 50,160, 39, 22,228,186, 55,253, 29,122, 4, 2,
- 43, 23,224,186,158,224,110, 9, 3,128, 70,128,159,217,197,105, 48, 18,104,117,128, 86, 15,104,117,128,222, 0,104, 53,128, 94,
-119,223, 75, 98, 79,161, 8, 48,206, 39, 5, 55,219,163, 93,167, 0, 16,145, 16, 37, 26, 13, 20,123,111,225,124, 94, 1,202,202,
-170,209,163,191, 9, 53, 90, 35,180, 58, 19, 52,106, 6,119,111, 2,154, 26, 96,211,166, 77, 10,119, 54,192,224,225, 29, 15,135,
- 7, 99,141,176,214,191, 68, 34,145,197,198,198, 42,217, 37,163, 26,141, 70,145,155,155, 75,197,197,197,113,149,101, 4,208, 25,
- 0, 19, 19, 19,195, 72, 36, 18,250,187,239,190,195,172, 89,179,240,209, 71, 31,129, 16,130,223,127,255, 29,123,247,238,197,233,
-211,167,161, 82,169,208,165, 75, 23, 84, 86, 86,250,209, 52,221,220,149,240, 73,147, 38, 57, 84,146, 89, 15,202,196,137, 19,185,
-246, 93,147, 14, 1, 56,243, 2,212,199,250,231, 21, 1, 94, 1,104, 16, 82, 76, 76, 76,148,177, 49, 67, 91, 37,192,122, 66, 98,
-227,241,158,198, 98, 89,210, 31, 51,102, 12,101, 14, 3,136,145,186,238,225, 94, 47,155,245, 31, 27, 27, 75,229,228,228, 16, 87,
-222, 16, 87,203, 14,157, 17,186, 61, 56, 59,246,207,255,168, 65,235, 22, 52,166,199,139,161,213, 1,193,129, 20,104,170,214,234,
- 7,129, 86, 13,212,232, 9,106, 52, 4, 53, 90, 2,134, 0,180,147,156,235, 63,191, 94,131, 94,125,242,209,178,107, 25,118,109,
- 47, 66, 89,153, 22, 49, 79, 85,162,119, 88, 53, 32,210, 65,171,102, 80, 84, 64, 80, 83, 67,193,104,164, 16,214,140, 2, 40,134,
- 31,197,143, 14, 44,207, 47, 59,126,217, 48, 0,139,173, 91,183, 62,144,127,100, 39, 23,128,189,233,157, 1,156, 92,184,112,225,
- 16,161, 80, 24,240,253,247,223,227,219,111,191,197,203, 47,191,140,101,203,150,129,162, 40, 92,191,126, 29, 26,141, 6,201,201,
-201, 48, 26,141,152, 61,123, 54, 67, 81,148,203, 1,224,205,108,250,166, 30, 2,112,230, 5,240,134,245,207,131, 87, 0,188, 10,
-219, 56,178, 35,130,175, 61,142, 51, 82,115,205, 25,234,102,226,191,130,180, 47,174,193,188, 10,160,174, 82,192, 37, 12,224, 45,
-176,214,124, 78, 78, 14,177,182,254, 89,143,128,245,251,196,196, 68,176,197,114,236, 21,214,112, 69,232,182, 96, 87, 1, 56,146,
-103, 52, 1, 53,106, 2,157,222,156,236,167,211, 19, 8,125,238,127,166, 85, 3, 26, 3, 65,105, 25, 65,113, 57,193,241,243, 70,
- 48, 12,144,152,152, 40,187,114,229,202, 3,247,198,104, 4, 10,111,233,113,235,106, 57, 14, 28, 42, 7, 33, 20,206, 95,100, 16,
- 55,221, 8,177,144,160,248, 30,112, 96, 39, 80, 89, 73, 64, 24, 96,216, 40, 10, 18, 9, 48,126,252, 51,184,113,227, 6,167,107,
-202, 88, 43, 39,147,102,122,127,169,104,125,226,253,118,201, 96, 90,185, 87,228,132,133,229, 52,105, 79, 2,219,214,175, 95, 63,
-114,252,248,113,108,217,178,229,129,239,196,199,199,219, 19, 69, 3, 56, 11,224,228,167,159,126,218, 39, 36, 36, 36, 0, 48,187,
-193,191,249,230, 27,204,154, 53, 11,223,126,251,173,197,138,255,244,211, 79, 81, 81, 81,129,202,202,202,106,181, 90,157, 95,235,
- 65, 16, 59, 59,215,191,253,237,111,117,242,161, 88, 11,158, 16,194,217,253, 15, 60, 26, 33, 0,123, 94, 0,111, 91,255,172, 76,
-222,242,231, 21,128,122, 33, 55, 55,215,101, 54,121, 78, 78,142,148,243,146, 66, 31,127,164,117,220, 7, 24,115, 9, 58,249, 35,
-105, 73, 39,164, 42,227, 40, 32,149,220, 87, 8,198,120, 28, 6,176, 93, 10,232,104,105,160,163,201, 82, 46,151, 91,200,223, 54,
- 1,176,214,242,183,180, 57,243, 0, 88,203,243,214,100,158,149,149, 37, 45,184,179, 93,193, 68, 48,160,133,128,136, 54, 79, 70,
- 6,134,192,104, 4,170,170, 8,244, 6,192,104, 48, 43, 5,207, 76, 50,123,111,174, 92,185,226, 80,158,174, 36, 75,209,163, 7,
-131,253,123, 77,160,104,160,248, 46, 5,137, 47,176,119, 7,160,215, 80,160, 8,208,187,159, 8,133, 55, 25,140, 28, 57, 17, 19,
- 38, 76,112,168,240,216,146,255,199,175, 2, 11,255,227, 93, 37,192, 81, 40,170,177,229,185,114, 57, 55, 2,236,158, 12,155,245,
- 31, 23, 23,103,121, 70, 89,239,221,148, 41, 83,156, 89,160,213, 0,174,157, 56,113,162,122,248,240,225, 17,176, 90,211,255,205,
- 55,223, 88, 72,214, 96, 48,192,100, 50,225,202,149, 43,136,136,136, 40, 97, 24,134,147,182, 56,105,210, 36, 71,150,186, 91, 68,
-251, 40,132, 0,236,121, 1,188,105,253,243,196,255, 24, 42, 0,185,185,185, 15,189,106, 31,107,229,178, 68, 23, 27, 27, 75,217,
- 33,127,194,186, 21, 19, 19, 19, 61,250, 29,235, 85, 0,108,155,187,150,191,109, 2, 96, 45, 44,109, 11, 22, 44, 80, 36, 38, 38,
-114, 30,100,214,228,111, 47, 39,192, 93,121,174,240,241, 70, 45, 92,201,155, 48, 97,130,114, 81,114, 38, 70, 15, 22,129, 1, 96,
-208, 51,240, 17,155,187,169,170,134, 64,103, 32, 48,154,128,220,179, 38,152, 24, 2, 87, 75,246, 38, 76,152,160,252,191,119, 50,
- 49, 82, 42,192,179, 51, 4,168,174, 34,168, 82, 1, 53, 85, 20, 58,117, 33, 48, 25, 40, 8,105, 9, 42,202, 24, 20,222,214,227,
-205,121,220, 18,198, 50,214,202,201,103,175, 3,209,237,129, 47,231, 3,115, 87,120, 95, 9,240,166,103,192, 91,242, 26,106,201,
-159,135,227,158,177, 71,254,239,189,247,222, 3,110,254,244,244,116, 69,124,124, 60, 28, 20, 9, 98,137, 94, 15,224,228, 19, 79,
- 60,113, 85,171,213,182, 17, 8, 4, 18, 63, 63, 63, 0,192,198,141, 27, 49,101,202, 20,104, 52, 26,104,181, 90,232,116, 58, 4,
- 4, 4,104, 77, 38,211,102, 66,200, 93, 46, 39,235,173,213, 0,143, 74, 8,192,218, 11,192,190,230,137,159, 87, 0, 30, 26,249,
-115,145, 25, 27, 27, 75,165,165,165,145, 90,107, 23,105,105,105,196,122, 89,162,173,213,111, 79, 65,120, 0, 2, 10, 16,211,128,
-175, 0, 8, 16, 2,186, 42,164,125, 36, 2,124,143,144,164,169,157, 0,223, 48,164,254,224,190,213,239, 44,219,159, 37,107,174,
-107,216,109,201,223, 54, 39,192, 93,121, 92,201,159,139,188,165,203, 87, 83,243, 95,159, 77, 36, 18,128, 97,128, 94, 79, 8,238,
-223,143, 51, 38, 24, 76, 4, 38, 70,128,201,147, 39,115, 82, 78, 62,248,112, 53,245,230,155,179,137,209, 8,232, 13, 4, 38, 35,
- 64, 83,128,116, 34, 80, 85, 65,225,226, 41, 13, 52, 90, 26, 9,241,147, 57, 93, 75,198, 90, 57,121,239, 47, 64,231,182,230,247,
- 81,109,128,134,240, 4,240,112, 15,142,138,253,200,229,114, 18, 23, 23,199,101, 53,128, 32, 36, 36,228,164, 70,163,249, 49, 63,
- 63,191, 99,159, 62,125, 34,141, 70,163, 80, 36, 18, 97,243,230,205, 24, 51,102, 12,180, 90, 45,212,106, 53,174, 92,185, 82, 25,
- 26, 26,186, 71,163,209,124,207, 48, 76, 13, 56, 86, 0,100,139, 2,177,202,148, 59,174,127, 22,143, 74, 8,192,218, 11,224,141,
-251,235, 73,237, 0, 30,143,128, 2,208, 24,150,191,173,245, 97,109, 9, 57,114,245,123,243, 28,221,137,253,123,155,252,173,148,
- 29,235, 66, 64,172, 18,164,168,245,116,184, 37,207, 85, 46,128,187,242, 86,124,190,154,146,203,229,132,166,129, 3,185,230, 88,
- 63,155,240,103,142,251, 79,118, 75,222, 39,159,172,166,102,207,169,173, 73, 65,155,101, 28,217, 7,212, 84, 51, 32, 12,144,144,
- 48, 17,227,198,141,115,121, 63, 50,214,202, 73,242,139, 64, 72, 0, 80, 88, 2,248,250, 0, 12, 1,252, 37,192, 18, 57,176, 56,
-133, 87, 2,184,194,149,247,193,221,241,102,143,252,103,207,158, 77,216,149, 0, 91,182,108, 33, 20, 69, 57, 83, 4, 2,244,122,
-125, 53, 77,211, 57,173, 91,183,110, 91, 85, 85,245,234,177, 99,199, 90,245,237,219,151, 49, 26,141,106,149, 74,117,239,212,169,
- 83,215, 59,117,234,116, 53, 60, 60, 60, 95,163,209,108, 52, 26,141,247, 8, 33,156, 21, 0,182, 40,144,149, 87,192,147,249, 74,
-214,128,115,161,215,101,123,139,180,121,242,127, 68, 21, 0, 87,107,253,221, 29,232, 92,107, 7,184, 35, 55, 37, 37,133,114,180,
-217,142, 59,228,149,154,148, 98,118,243, 95, 6,112,217,246, 83, 85,237,223, 53,120,112,189, 10,111,145,171,117,191,200,229,114,
-194,214, 25, 88,176, 96,129, 71, 43, 28,108,229,173,123,211,223,162, 20,212, 71,105,178,189, 39,108,194,159,167, 94,137,213,171,
-234,202,171,174, 52, 79,192, 9, 9, 9,238, 61,127, 63, 62, 92, 34,108,108,121, 77, 44,238, 95,199, 98,183,126, 99, 75,254, 57,
- 57, 57, 82, 66, 8,182,110,221,106,125,140, 51,121, 55,245,122,189, 15, 33,164,138, 97,152, 20,189, 94,255,123,251,246,237,155,
- 85, 84, 84, 80,255,252,231, 63, 43, 85, 42, 85,105,155, 54,109,170,170,171,171,107,244,122,125,165,193, 96,208,153, 76, 38,141,
- 59, 39,236,165, 48, 64, 67, 18, 33, 79,178, 60,188,167, 0,120,219,178,111, 72, 79, 65,108,108,172,146,147,139,223, 5,188,153,
-213,255, 48, 60, 35,238,108,250,227, 13,111,128,187,247,196,122, 89, 87,125, 67, 18,182,242,220, 37,127,111, 91,247, 77,125,124,
- 52,228,243,231, 5,217, 84,173,130, 66,104,154, 6,251,199, 42, 44, 19, 39, 78,196,248,241,227,193, 48, 12, 24,134, 1, 33,196,
-213,239, 81, 70,163,209,143, 16, 98, 98, 24, 70,103, 48, 24,246, 9, 4, 2,138,166,105, 31, 0, 62, 12,195,192,100, 50, 9,140,
- 70,163,216,104, 52,182, 50,153, 76, 23,172,190,219,224,155, 0,241,224,209, 20,224,172, 70, 10, 21, 19, 19,195,111,143,201,131,
- 7,143, 71, 21,106, 43, 66,103,172, 12, 27,161, 85,251, 29, 0,193, 0, 36, 60,241,243,224,225,196, 3,192,131, 7, 15, 30,143,
- 16, 36,181, 74, 0, 99, 69,252, 52,238,239, 60, 40, 4,208,170,246, 53, 95, 53,138, 7, 15, 94, 1,224,193,131,199, 99, 2, 26,
- 64,128,213,123,150,248,197, 86,164,207,212, 30,199, 91,255, 60,120,240, 10, 0, 15, 30, 60,254, 32,115, 26, 79,250, 60,120, 56,
-209,158,121,240,224,193,131, 7, 15, 30,127,100,109,121,206,156, 57,214, 27,233, 16,235, 12,123,185, 92, 78,108, 54,218,185, 25,
- 27, 27,219,158,125,111,175, 20,171,181, 60,119,241, 56,202,179, 93,182,104,221,159,124,255,241,247,163,169,203, 91,178,100,137,
-229,152,197,139, 23, 83, 30,200, 3, 28,148, 3,230,159,103,215, 50,255,104,207,223,137, 19, 39, 60,150,215,183,111,223, 63,188,
- 60,183, 21, 0, 55, 17,193,229, 32,118,247, 62,111,105, 44,182,107,166,237,237, 6,104,239,152,198,208,174, 88,130, 73, 76, 76,
-148,177, 68,195, 86, 0,107, 42,107,181,183,110,221, 42,221,178,101,139,133, 4, 39, 78,156, 40, 75, 72, 72, 80, 62,142,218,174,
-189,251,113,225,130,121,101, 88,183,110,221, 26,245,220,228,114, 57,121,102,146, 28,155, 51, 82,236, 62,179, 89,219,143,147,205,
- 25, 41, 78,159,229,172,237,199,157, 78, 2, 19,198,247,243,248,161, 91,178,100, 9,137,143,143,170,243,222,149, 18,224, 10, 85,
-213, 85,210,204,157,153,136,236, 17,169, 0, 5, 92, 56,113, 94,246, 84,204, 16,116,123,162,155, 91,207,223,193,131, 7, 31,184,
-238, 33, 67,134,240,197,157,120,240,104, 64, 5, 64,204,245,192,193,131, 7,187, 45,220,222,102, 49, 44,236,145,168,237, 70, 27,
- 92,137,214,147, 34, 44, 92, 20, 10, 86,110,114,114, 50,150, 47, 95,174,112, 84,147,157, 61,206,217, 90, 77,219,115,108,211,169,
- 29, 0,224,158, 86, 11,163, 70,103,110,172,168, 4, 96,222,251,192,157,218, 8,214,228, 15,152,107,139,187,179,214, 94, 46,151,
- 19,154, 50, 87,215, 99,255, 3,206, 95,175, 90,253,240, 21, 50,219,251,193, 18,191,167,247,195,155, 74, 37, 75,254, 19,198,247,
-211, 2,114,201,230,140, 20,143,127,131, 85, 32,236, 43, 0, 41,245, 58, 79,189, 62, 25,217,217, 73, 24, 55, 46, 21,241,241,203,
- 45, 30, 1, 79, 20,129, 3,231, 14,144, 14,125,219, 97,101,202, 39, 8,245, 11, 5, 99, 52, 65, 75,116,138, 29,191,239, 28,183,
-103,239,110, 50, 36,114,168, 76, 34,145,184, 84, 4, 14, 30, 60, 72,106, 61, 11, 15, 88,148,188, 18,192,227,143,140,147, 39, 79,
-214,121,111,111, 78,171,143, 2,224, 86,254,128,189, 93,236,188, 1, 2, 72,235, 45,195,141, 13, 83,184, 88,238,114,185,156, 36,
- 39, 39, 99,217,178,101, 0, 96,249,111,239, 56,183,119,108, 11, 9,194,233,252,159,225,139,182, 48,225, 55, 20,253,247, 56, 78,
- 93, 45,197,228,101,223, 54,218,131,118,250,204, 89,244,238,213, 19, 12, 1,206,158, 53,191, 6,238,191,182,110,103, 56,118,181,
-117, 13,118,103, 72, 77, 77,165,184,222,143,153, 51,103, 2,128,229,191, 93,242,167, 40,192,201,243, 32,151,203,201,232,209,219,
- 33,151,143,247,170, 18, 48, 97,124, 63,117, 82, 82,146, 31,144,138,205, 25,238, 17,187,181,133, 95, 95,146,119,100,253, 3,192,
-148, 41, 27,145,157,109,254,159,148,116, 21,172, 71,192, 29,111, 0, 33, 68,170,184,180, 71,241,234,107,115, 48, 32,162, 47,124,
-131,131, 65,244, 70, 48,196, 4,129, 80,140,206,177,157,179, 47,246,191,132,101,169,203, 21, 79, 54, 27, 44,243,243,243,115,169,
- 4,148,148,148,212,121, 63,113,184, 63,158,124,253, 55, 60,191, 92, 91,231, 70,142, 26, 53,202,227,251,149,145,145, 65, 38, 77,
-154,228,181,251,237,109,121, 13, 76, 36,210,250,150,245, 61,121,242,164,180,150,132,148,224,241,208,201,159,109,179, 85, 2,234,
- 40, 0,249,249,249, 36, 63, 63, 31, 0, 16, 25, 25, 9,235,205,102, 0,212,121,111,239,115, 71, 40, 42, 42, 82,164,165,165,113,
-246, 4,216,238,117,239,140,132,169,218, 82,152,182, 36,234,174,139, 61, 53, 53,213,229, 49, 57, 57,174,247, 86,175, 13,121, 56,
- 36,253,183,223,126, 27,203,151, 47,135,181,130,192, 5,109, 58,181, 67, 65,185, 10,191,206,158,130,112,106, 40,174,174,121, 19,
-145,207, 70, 98, 87, 35,147, 63, 0, 11,225, 3, 64,207,158, 61,235,180,179,158, 1,235,118,111, 91,246,206,136,152,189, 31,142,
- 72,127,237,218,181, 88,190,124, 57,198, 15,237,139,237,191,157, 0, 2,253,129,202,234,135,222,135, 89,219,143,251, 1,169,200,
-218,126,220, 43,242, 38, 85, 46,114, 58, 54, 51,130,150,114, 26, 32,214,174,255,164,164,108,196,199, 71, 89,254,179,136,143,143,
-226,172, 4,172,249,105, 13, 62,250,207,135, 24,222, 69, 10,147, 78, 7,163,201, 8, 74, 72, 1, 16,128,128,193,189,226, 66,116,
-139,232,138, 69,179, 23,225,195,143, 63, 84,140,238,233,218,155,101, 59,217, 77,108,189,214, 46,225,239,217,179,135,120,162, 4,
-100,100,100,144,172,127,110,199,132,127,193, 43,164,157,145,145, 65, 62,254,248, 99, 44, 92,184,176, 73, 43, 1, 39, 79,158,148,
-170, 84, 42, 69, 97, 97, 33, 98, 98, 98,234,117,158, 42,149, 74,113,127,202,230,241,176,144,148,108,230,152,212,229,111,219,253,
-188,142, 2, 16, 25, 25, 73, 69, 70, 70, 90,200,222,218,149,156,150,150, 86,231,189,237,231, 87,174, 92,113, 56,225,176, 74,197,
-130, 5, 11, 20,201,201,201,176,221, 40,199,118,243,156,180,180, 52,135, 46, 88,123,147,189,109, 91, 99,110, 84, 4, 0, 27, 54,
-108,112, 72,252, 0,234,144,255,219,111,191,205, 73,230,237,252,155,168,217,244,127, 8,152,245, 57,218,116,106,135, 22,225,190,
-200,223,148,111, 38,255,144, 32,115, 8, 64, 36,112,251, 92,227,227,227,101,214, 97,128,248,248,120,183,189, 52, 12, 1,218,251,
- 3, 95,189, 8,252,117, 45, 16,225, 7, 92,168,176,223,126,174,220, 61,217,142, 20, 57,119,188, 54, 31,124,240,129, 67,226, 7,
-128,143,103,198,225,203, 29,135,209, 50,178, 21,238,222,184,231,210,250, 7, 0, 46, 94, 0,119,220,248,102, 11, 95,110,215,210,
-103, 99,251,238, 62,215, 31,175,119,220, 71,209,179,225,193,179, 18, 85,231,191, 62,190, 51,196, 91,242, 56,127, 95,173, 81, 99,
-232,115, 67, 20,131, 91, 61, 9, 93, 77, 13,132, 62, 62, 16, 10,239, 79, 65,249,121,121,200,220,188,185, 96,214,203, 51,219,116,
-244,105,143,190, 35, 99, 98,127,207,254, 93,250,228,128, 39,221,178, 26,151,100,205,196,222,189,123, 49,117,106,221,246, 81,163,
- 70, 81,238, 42, 1, 44,249,163,227, 74,100,253,115, 94,189,149,128,140,140, 12,242,217,103,159, 33, 58, 58, 26, 95,126,249, 37,
-230,206,157,219,228,148, 0,107,226,247,150, 60, 86,150, 55,188, 9, 60,184, 41,196, 44,249,179,175, 83,151,191,253,128, 23,224,
-161,212, 1, 72, 75, 75, 99, 99,175,200,207,207, 71,243,230,205, 31, 80, 16,216,182,162,162, 34, 78,117,238, 93, 37, 3,186, 51,
- 97, 78,155, 54,173,193,174,221,154,192,236, 89,253,203,151, 47, 71, 74, 74, 10,101, 47, 11,214, 26, 26,220, 68,245,179, 79,130,
- 4,190, 9,196,254, 19,213,248, 9,248,175,217, 90, 36,105,111, 66,244,210,151, 48, 26,221, 47,116, 22, 23, 23,167,228,176,237,
-170,115, 15,207, 55,192,251,171,129,118,109,129,123, 91,197,248,238,127,122,204,252,217,113,187, 59,240,246,126,246,214,201,126,
-119, 50,150, 33,176,135, 4, 1, 93,222,192,134,101,127, 69,159,158, 45,241, 68,220,135,156,238, 7,151,231,147,107,168,128,125,
-118,173,201, 63, 37, 37,133, 98, 19,255, 60, 34,154,160,165,148, 39, 36,111, 15,250,248,206,118,219,179,109, 60, 1,174,112,167,
-232, 14,198, 38,142, 69, 96, 80, 40, 76,148, 17,251,247,238, 67, 85,117, 53,226, 19, 18, 80, 92, 84,132,244,141,191,226, 47, 47,
-207,108,227, 35,241, 1, 77, 68, 24,215,111, 92,206, 37,197,151, 30, 89,141,229,229,229,245,190,110,107,242, 7, 80,111, 37, 32,
- 35, 35,131,188,247,222,123,232,220,217,220,159, 81, 81, 81,104, 74,158, 0,111, 19,191, 29,235,159,125,205,123, 1,154, 8, 30,
- 90, 33,160,230,205,155,203, 18, 19, 19, 31, 8, 5, 28, 62,124, 88, 81,187,217,139,219, 57, 2,142,146, 1,157, 89,142,142, 20,
-148,134, 0,107,221, 59,114,247,115,181,254, 1, 96,199, 63,222, 67,252, 71, 43, 96,140, 29, 10, 33,128,128, 67,121,216,117,181,
- 20, 0, 96,140,157, 11,195,153,102,160, 34, 94,113,155,164,184,122, 89,156,161,116,210, 79,152,251,242, 45, 92,158,189, 16, 53,
-187,245,104,217,204,121,187, 55, 60, 0,158, 40, 7,107,215,174, 53,107,195,241, 35,112,184,176, 8,129,125, 2, 81,144,125, 21,
-144,248, 96,202,220,151, 16,214, 54,174,209, 6,162,163,172,127,111,121,181,156,173, 16,112,181, 58, 32, 59, 41, 27,227, 82,199,
- 97,202, 70, 32, 41,219,252, 58, 59, 41,219,109, 47, 64,181,182, 10,205,124,195, 97,212,170, 65,104,130,129,131, 6, 97,211,166,
- 77,218,207, 86,172,144, 48,132, 96,198,139, 51, 16, 22, 30, 6,117,117, 53,140, 38, 35, 2, 69, 65, 48,208, 6,143,174,183,162,
-162,162,206,234, 0,119, 19, 2, 31, 32,127, 22, 30, 42, 1, 25, 25, 25, 36, 57, 57, 25,131, 6, 13,170,211,222,179,103, 79, 44,
- 89,178, 4,139, 23, 47,110, 52, 37,160,161,136,223,214,250, 7,128,194,194, 66,222, 11,208, 84, 21, 0, 91, 66, 96,247,156,231,
-242,185,179,172,105, 22,108,120,129, 77, 8,100,115, 3, 88,239, 64,100,100,164,130, 13, 23, 52,214,196,235, 77,184,138,245,179,
-214, 63, 23, 89,147, 87,111, 4, 73,232,132,123, 79,245, 67, 56,134,194,119,202,151, 48,222, 41, 6, 66,130, 32, 44,253, 9, 91,
- 63,203, 5, 4, 2,183,175,221, 27, 91,209,158,154,255, 2, 6,196, 0,145,115,207,162, 71,192,203,184,212, 33, 17,248,106,161,
-195,246,198,242, 0, 44, 95,190, 28,195, 7, 62,129,216,161,209,136,239,181, 16,159,126,182, 10,231,115, 11, 48,123,212, 0,220,
-221,156, 5, 85,121,165, 87,158, 7,123,161, 2, 87,227,195,153,181,239,173,103,212,145,124,103,137,131,139, 23, 47,166,150, 44,
- 89, 66,166,108,172,171, 16, 0,192,184,212,113, 16,111,201,195,150, 45, 87, 45, 43, 1,216,132,193,176,176, 48,123,234, 28, 24,
-134,129,137, 1, 8, 99,132,143,175, 4, 47,254,233, 79,146,247,223,125, 23, 45, 90,180, 96,218,180,108, 73,107,107,170, 97, 34,
- 0, 97, 76, 96, 24,215, 30,173, 33, 67,134, 80,233,233,233,164,180,180, 20,149,149,149,117, 20, 71,235,213, 1,238,172, 10,200,
-200,200, 32,159,254,245, 28, 32,233, 12,220,253,207,131, 7, 72, 58,227,211,191,158,195,130,255,114, 83, 2, 50, 50, 50,200, 51,
-207, 60, 35,235,217,179,167,162,180,180,244,129,207,219,183,111,143,103,158,121, 70,246, 40, 37, 6,122, 98,253,243, 94,128, 38,
-174, 0,216, 20,250,113, 85, 8,168,206,231,206, 92,166,137,137,137,118,189, 0, 44,217, 55,111,222, 92,150,156,156,172, 96, 99,
-178,137,137,137, 78,151, 1, 58,179, 14,221, 77,254,107,168,101,128,172,117,239, 44, 25,208, 29, 92,253,119, 18, 68, 83,190,132,
-166,240, 50,132,135,190,132, 97,227, 92, 80, 19, 62, 65,230, 43, 83,113, 35,243, 26,226, 63,254, 30, 16, 54, 78,101,231,133,105,
- 64,246,199,155,208,227,198, 56,160,164, 6,111,141, 89,232,180,221, 27, 30, 0, 79,173,255,205,155,222,131,160, 77,119, 4, 32,
- 26, 55,247,166,162,138, 34, 56,114,249, 22, 98,207, 22,112,188,239, 55, 45,239,167, 77, 75,169, 67,246, 0,176,123,247,120,187,
-199, 57, 27, 31,174, 92,253,222, 88,118,232,141, 21, 2, 73,217,247,137, 31,192, 3,150, 63,155, 48,184,101,203, 85,187,223, 15,
-244, 13, 68,161,170, 16,131, 58, 62, 9,141, 78, 11,104,180, 48,234, 13, 88,148,156, 12,138, 6,173,174,169, 6,195,152, 96, 52,
- 17,248, 8, 69, 40,174, 46,134,200,228,122,181,241,212,169, 83, 45,125,115,240,224, 65,194,206, 55,214,171, 3,238,220,185,195,
-249, 58, 39, 77,154, 68, 45,248, 47,200,167,127, 61,135,110,157, 30,252,253, 11,215,244, 88,240,223, 30,224, 74,214,147, 38, 77,
-162, 50, 50, 50,200,160, 65,131,208,190,125,251, 7, 62, 63,123,246, 44, 54,111,222,172,104, 44,242,175,181,198,169,134,140,253,
- 91,131,247, 2, 52, 81, 5,160,161,192, 90,254, 0, 48,120,240, 96, 89, 90, 90,154,130,117,253, 59, 80, 14,100, 87,174, 92, 81,
-184, 75,194,158, 78,146,222, 94, 6,104,109,253,219, 35,126, 86,209,113,231,124, 79, 93, 45,133,225,204,251,184,135,223,208,114,
-194, 39,128,170, 18, 87, 83,223, 68,212,156,149,184,251,237,155,128, 72, 8,208,141, 83,217,249,102, 13,208,173,249,179,156,219,
- 27,195, 3,176,124,249,242,234,231, 98,159,188, 19,204,132,182, 83, 67, 36,217,184,114, 46,190,222,122, 18,111, 61, 61, 12, 51,
- 87,172,199,212,165, 63, 52, 74,242, 40,171,128,214,214, 1,160,234,171,156,214,199,213,239,204, 11,144, 84,107,217,219,146,191,
-181,245,239, 10,173,155,183,198,142,253,217, 24,210,110, 8,252,252, 3,192, 48, 4, 52, 49,130,161, 40, 16, 66, 96, 34,128,145,
- 33, 48, 26,141,208,168,106,176,237,232, 54,136, 77, 98,183,147, 82,109, 87, 5, 44,158, 59, 20, 19, 91,231, 35,245, 40,119, 25,
-142,148, 0,119,201,223, 90,222,226,197,139,201,199, 31,127,140, 86,173, 90,221, 87,236,175, 94,197,242,229,203,209, 20, 44,127,
-111, 43, 2,246,172,127,222, 11,240, 7, 84, 0,108,179,254, 19, 19, 19, 45,113,119,107,229,192,250,117,125, 44,120, 79, 38,114,
-111, 45, 3,116,100,253,123, 74,252, 44, 38, 47,251, 22,191, 2,120,250,163,137, 32,105,111,130,154,246, 41, 78, 93, 45, 5, 21,
- 22,138,188,219,149,102,235, 95, 32,104,148,135,200,209,122,255,250,212, 1,224,162,112,113, 85, 14,214,174, 93,171, 7, 80,245,
- 87,105,239,202, 55, 62,249, 92,255,143, 69,201,218,136,160,230,165,231,206,223,108, 49,243,252,250,128,198, 94, 53,226,136,156,
-173, 67, 52,238,175, 40,176,247, 27,245,243, 0,216, 35,127,214,242, 7,224, 50, 33, 80, 34,145, 80,231, 51, 47, 36, 40,134, 42,
- 55, 39,246,154,138, 74,109, 37, 40, 26, 48,151, 20, 97, 96, 50, 17, 48, 70, 35,252,125, 2,113, 80,117, 2, 87, 14,229, 97, 76,
-191, 49,245,183, 18,175,254, 13,128,251,203, 0,235, 40, 1,173,110,226,194,157,246, 30,145,191,181,188,133, 11, 23,146, 47,191,
-252, 18, 33, 33, 33, 40, 45, 45,197,123,239,189,135,166,230,246,247,134, 34,224,200,250,231,189, 0, 77, 88, 1,104,168, 58, 0,
-142, 60, 2,159,126,250,169,204, 86, 81, 72, 76, 76, 84,184, 43,207,154, 8,154, 66,137, 93,107,235,223,118,249, 95,126,126,126,
-157,126,115,167,106, 31,171, 4, 60,251,209, 55, 32, 27,129,102, 51, 83,160,124, 99, 42,134, 45, 95, 7,136, 68,240,151,136, 27,
-229,122,173,215,248,219,123,237, 97, 29, 0, 35, 0,186,246,222,210,245,188, 31,247,158,139,125,178,240,141,212, 45,157, 22,253,
-101,108, 80,235,150, 82, 61,128,211,137,137,137,193, 0, 2, 60,189, 31,247, 73,122, 60, 25, 61,122,187,149,251,223,189,239, 59,
-179,224,173,203, 3,115, 85, 36, 26,162, 24,144, 35,216,146, 62,235, 17,112, 20,242,248,243,180, 63,103,110, 89,191, 5,166,231,
-140,167, 71,182, 27,217, 59, 60, 48, 28, 90,131, 22,132, 16,136,133, 98, 84,104,212, 56,124,123, 55,214,254,248, 29,100,221,101,
- 94, 41, 28,182, 36,107, 38,190,251,238, 59,188,249,166,251, 53, 0,238, 43, 1,168, 23,249, 91,203,155, 59,119, 46, 91, 7, 0,
- 77, 57,230,111,173, 8,120,242,221,250,214, 14,224,225,241,125,195,201,147, 39,145,186,252,237, 7,234, 0, 56, 45, 4,212, 80,
-117, 0,236,121, 4, 28, 17,189, 39, 94,128,250,162,161,150, 1,178,202, 72, 74, 74, 10,114,114,114,152,252,252,124,107, 34,147,
-197,198,198,186,173,253, 78, 94,246, 45, 96, 85,248,103,228,162,213,150,215, 53,141,240,176, 53,148,245, 76, 81,212,103, 0,202,
- 0,116, 7,240, 98, 61,197,221,253,171,180,183,110, 76,206,239, 65, 51,222,253, 30, 41, 41, 41,226,156,156,156, 86,168, 91,206,
-218,163,251,209,208,158, 0, 87,245,253, 93,161, 33, 66, 2,142,200, 95, 31,223, 25,112, 16,255,183,134,172,247, 40,106,111,250,
-126,114,168,253, 97, 12,125,114, 40,218, 4,182, 1, 24,130, 98,109, 41, 14, 30, 63,136,187,231,238, 98, 84,183, 81, 50, 31, 31,
-159, 38, 97, 29,178, 74,128,183,200,154,245, 4, 60, 42, 9,127,188,149,254,232,194, 81, 1, 32,187, 10, 64, 67, 97,193,130, 5,
-118,201,222,122, 39, 54, 27, 40,184,172, 42,240,150,213,223, 16,203, 0,107, 51,252,141, 57, 57, 57,194,218,208, 1, 75,254,163,
- 98, 99, 99,221,242,114,212,110,166,164,240,246, 57, 58,138, 49,123,187,214,189,155,240, 1, 32, 76, 73, 73,249,103,237,123, 19,
-128, 63,213, 87,230,152,119,214,228,166,164,164,140,200,201,201, 65, 78, 78,142, 22,128,164,246,175,222,196,207,122, 1, 60,237,
- 51, 87, 36,255,204, 36,121,157,227,220, 37,110,111,132, 4, 22, 47, 94, 76, 45, 73, 90, 66, 90,207,109, 45, 67, 71,251,199, 20,
- 38,101, 43,184,230, 3, 12,234, 49,136, 82,171,213,210,111, 63,250, 22,237, 59,119, 80, 0,192,165,179, 23,101,113, 99,226,209,
- 45,166,155,199,247, 99,200,144, 33,212,198,141, 27, 31, 88, 21, 96, 48, 24,234,245, 0,121,155,172, 31,183,108,127, 30, 77,211,
- 11, 96,219,198, 89, 1,112,101,137,115,181,212, 61,157, 20,185, 22, 98,169, 47, 81,121,155,232, 88,121, 57, 57, 57, 36, 39, 39,
- 71,104,221, 95,145,145,145, 30,253, 86, 45, 65,121,125,194,104, 10,177,111, 59, 8, 4, 80,109, 46,200, 79, 81, 0,124, 1, 24,
-188,112, 63,174,231,228,228,176,235,202, 42, 35, 35, 35, 35, 34, 35, 35,125,154, 66, 95,214,215, 18,119, 37,219, 91, 33, 1,151,
-228,190,216,189,103,212,207,207, 79, 57,237,153,231,192, 62,219,131,123, 12,246,202,121, 78,153, 50,133, 39, 87, 30,188, 18,192,
-193,136,166, 98, 98, 98, 8,223, 85, 60,120,240,224,193,131,199, 31, 11, 52,223, 5, 60,120,240,224,193,131, 7,175, 0,240,224,
-193,131, 7, 15, 30, 60,254, 0,248,255, 1, 0, 53, 35,171,240, 35, 23,204,177, 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, 0, 0, 0, 1, 0, 8, 6, 0, 0, 0,197,144,206,103, 0,
+ 0, 0, 1,115, 82, 71, 66, 0,174,206, 28,233, 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,215, 11, 26, 20,
+ 59, 43, 0,186, 29, 9, 0, 0, 32, 0, 73, 68, 65, 84,120,218,236,125,121, 92, 84, 85,255,255,251,220,217,217, 23, 1, 21,151,
+193,125, 95,201, 37, 55, 40, 53,243,155,153, 6,148,154,100,101, 98,137,218,147,166, 61,101,143,250,211, 71,197,164, 50, 53,161,
+167,210,172, 52, 5,115,201, 45, 81, 7,245, 81, 82,113, 47, 23, 20, 69, 4, 69,150, 97, 22,102,187,115,151,223, 31, 51, 67, 3,
+ 2,179,128, 91,207,188, 95,220,215,229,222,123,238,103,206, 61,219,103, 61,231,144, 30, 61,122,240,240,192, 3, 15, 60,240,192,
+ 3, 15,254,167, 64,121,138,192, 3, 15, 60,240,192, 3, 15,254,119,112,230,236, 1, 0, 0,241, 88, 0, 60,240,192, 3, 15, 60,
+240,192, 99, 1,240,192, 3, 15, 60,240,192, 3, 15, 60, 2,128, 7, 30,120,224,129, 7, 30,120,224, 17, 0, 60,240,192, 3, 15,
+ 60,240,192,131,191, 5,132,246, 23,231,206,157, 35,238, 18,170, 41,150,192, 67,207, 67,175, 54,164,166,166,242,107,215,174,125,
+100,249, 27, 55,110, 28,191,105,211, 38,226,169,143, 39,154, 30,234, 65, 15,158,242,243,208,251, 59,211,115, 89, 0,248, 31, 71,
+245, 2, 36,143,115, 62, 83, 82, 82, 48,117,234, 84,226,169, 54,247,235,120,216,176, 97,149,215, 25, 25, 25,127,139,178, 28,253,
+ 82, 66,157, 3,193,142,237,169,127,235, 54, 35, 11,220, 6,169,177, 13, 34, 64,163, 2,123,145, 99,152,247, 56,183, 69, 79,255,
+245,224,241,177, 0, 60,140,198, 58,122,244,232,168, 29, 59,118, 40,236,174,163,119,236,216,145,249, 88,244, 72,222, 50,118, 18,
+242,216,246, 75, 62, 47, 47, 15, 0, 32,151,203,159,164, 65,196,105,233,116,220,184,113, 78,167,221,180,105,147, 43,130, 26,191,
+101,203,150,202,139,109,219,182, 97,216,176, 97, 85,158, 63, 42, 33, 32, 59, 59,155, 7,128,200,200, 72,210, 16,233,118,108, 79,
+125,160,245, 23, 30,209, 28, 0,112,207,104, 4, 99, 48, 89,110,170, 52, 0,128,216,216, 88,164,165,165,213,154,191,222,185,189,
+249,182,119,219,186,244,227, 63, 15,252,217,137,122,145, 33,240,221,139, 48,238,216,134,242,242, 49, 40, 7,208, 75,246, 41,230,
+201, 78,163,185, 20, 40, 49,230, 98,158, 33,206,165,223,141,141,141,141, 74, 75, 75, 83, 84,187, 23,157,150,150,150,249,152,245,
+173, 6,105,183, 79,200,247, 54, 56,154, 4, 75,136,143,200,159,152,164, 98,222,164, 50, 80, 21, 6, 13,167, 51,153,255, 39,102,
+199, 57, 20, 0,172, 12,219,118,174,111, 67,224,119,236,216,129,133, 91, 22,195,167,185, 63, 42,110,171, 49, 63,110,158,226, 49,
+215,184, 31, 39, 16,185, 92,206,231,229,229, 33, 47, 47, 15,251,246,237,195,212,169, 83, 31, 87, 33,192,214,129, 72,106,106,170,
+ 40, 33, 33,193,188,124,249,242, 83, 0, 48,103,206,156,167,234,122,113,204,152, 49,149,255, 51, 12, 11,218,108, 2,109,162, 65,
+211,150,131, 97, 24,204,153, 51,199,165,188,216, 51,255,154, 96, 21, 6,248, 71,105, 9,112, 69,248,121,100, 26,126,128, 31, 46,
+220,248, 25, 50, 52, 3,139, 99, 40,254,230, 12,206,231,150, 97,236,178,117, 78,189,222,246,110, 91, 39, 25,186, 5,175,254,247,
+ 85,135,101, 34, 27, 57, 15, 65,163,223, 66,225,123,189, 0, 67,121,229,253, 51,134, 15,112, 6, 0, 12,192, 96, 89, 44, 14, 6,
+158, 70, 0,128,222,229,189,157,106, 51,105,105,105,247,221,180, 99,144,228, 49,234, 99, 13, 49, 6, 60, 9,223,219,160, 24,208,
+173, 7,121, 45, 60, 66,168,106,209, 72, 16,218, 49,156, 18,146, 80,162, 87,171, 57, 41,194, 88,170,103, 51,246,245, 81,195, 89,
+ 39, 73,221,113,225,103,155, 58,145,102,150, 11,244,146, 31,168, 0,176, 99,199, 14,197,150, 79, 62, 66,220,162, 37,138,122, 54,
+ 2,222,198,248, 1,160, 84, 95, 6, 4, 3,255, 60,184, 0,154, 27,229, 88,243,246,202,199,141,145,213, 54,240, 60,234, 60, 86,
+ 10, 1, 35, 70,140, 64, 94, 94, 30,228,114,249, 99, 87,118, 10,133,101,220,136,142,142,230, 1, 80,169,169,169,225, 9, 9, 9,
+133,203,151, 47, 63,237, 44, 17,134, 97, 64,211,230, 74,198,111,207,252,179,179,179, 17, 25, 25,233, 82,166,226,226,226,236,153,
+ 45, 50, 50, 50,170, 11, 0, 13,209, 86, 92,174,135,200,200, 72, 50,110,220, 56,126,248,240,225,247, 61,219,191,127,191,205,210,
+ 97,179,122, 56, 77,191, 33,221, 1,225, 17,205, 81, 88,174,198, 47, 83, 95, 70, 48, 25,128,220,255,204, 70,171, 49,173,144,225,
+ 2,243,175, 44, 44,171,169,141, 52,128,169, 45,124,203, 49,232,111, 85,160, 48, 33,162,206,116, 23,165, 7,176,176,235, 61, 44,
+189,248,113,125,235,179, 33,152,110, 67,210, 64, 3,211,122, 16,223,219, 32,136,143,143,247, 2,240, 52, 0, 31,187,219, 42, 0,
+ 23, 54,108,216,160,116,150,206, 23,107,191,160,232, 82,147,136, 54, 25,165,229, 48, 75, 69, 34,161, 80, 99,148, 82, 98,177,129,
+ 19,248,121, 51,180,204,108, 22, 22,221, 49,125,255,205,122,227,235,147, 39,177,206,124,183, 74,165,250,183,237,255,156,156,156,
+ 82,111,111,111, 74,167,211,113,246,105,250,244,233,243,121, 3, 51,246, 89,245, 45, 83,161, 35,237,255,242,229,203,104,235,227,
+103,111, 13,112,199, 10, 80,201,252, 75,245,101, 88,250,236,130,202, 7,111,236,120, 23, 8, 5,198, 44,143,195,182, 57, 91, 92,
+105,100,117, 13,110,245,110,168,183,111,223, 6, 0, 52,111,222,188,202,255,112,193,156,221,128,130, 8,169, 77, 8, 48,155, 25,
+ 91, 60, 64,131,104, 1, 13, 80,150,246,204, 31, 0, 72, 66, 66, 2, 0,220, 73, 77, 77, 13, 76, 72, 72, 40,119,154,249,155,205,
+160,105, 19, 76, 52, 13,115, 53,230,207,115,174, 85, 67, 92, 92, 28,178,179,179,255,234, 93,201,201,136,137,137,169,188, 78, 79,
+ 79,175,183,176, 99, 39,240,212,187,253,217, 51,254,113,227,198,161,103,207,158, 54, 1,192, 85,139, 64,131, 52,194,130, 27,249,
+208,109,251, 23,124,222, 92,137,240,136,230, 8, 11,150,225,198,182, 27, 22,230, 31,224,103,113, 1,136, 4,206, 73,176, 13,228,
+ 99,107,119,233, 58,110,207, 95, 12, 67,218,250,186, 45, 4, 50, 25,140, 70, 35,114,115,115, 81,108,188,138,118, 8,175, 53,173,
+213, 12, 94, 87,219, 39,182,126, 98, 77,155,233, 70,255, 34,118,253,154,119,179,159,145, 58, 24,183,211,109,176,166,239,141,137,
+137,225, 9, 33, 54, 87, 78,125,190,215,214,151,121,161, 80, 88,175, 58,143,143,143,247, 7, 48,230,224,193,131,255,226, 56,206,
+100,215,150,132, 2,129,192, 59, 62, 62,126,242,134, 13, 27,246, 56,228,152,115,103, 9, 75,239,148, 72, 69, 34,137, 55, 37, 36,
+126,188, 64,226,197, 9, 4, 66,142, 80,224,136,144,229, 5, 2,147,128, 35, 70,157,128,213,123,139, 69,228,155, 99,123,140,137,
+ 73,147, 56,228, 59,206, 99,121,121,185, 70,175,215, 51, 0,160,211,233,184,143, 62,250,168,146,225, 47, 89,178,228, 31,245,109,
+239, 67,135, 14,157,106,251,255,192,129, 3, 41, 13,209,135, 40, 71,218,255,226, 87, 98, 96, 44, 41,193,236,206, 29, 96,239,187,
+119, 90, 11, 25, 61, 58, 10, 64, 21,230, 63,122,244,232,104, 0,100,244,232,209,209,235, 70,127,101,177, 44,182,111, 84, 37,189,
+ 51,152,179, 38, 7,115,214,228, 96,218,138,203,120,125,209, 31, 24,251,207,115,245, 31,232, 10, 10,156, 18, 12, 30, 22,243,183,
+250,252,249, 90, 44, 1, 48,211, 52,250,246,233,211, 16, 66, 6,191,101,203, 22,108,217,178, 5, 10,133,162,242,112, 81,224,225,
+ 21, 10, 5,162,163,163, 43,153,191,253,195,132,132, 4,149, 51, 3, 19,195,176, 22,205,223,100, 49,253, 87,103,254, 44,203, 66,
+103,208,185,244,129, 54,139, 65,117,171, 65,122,122, 58,210,211,211,171, 8, 3, 46,125,111,102,213,241,208,122, 93, 47, 33,209,
+198,252,199,141, 27,135,229,203,151, 87, 50,127,145, 80,228, 42,243,183, 13,224,181, 29, 78,195,128,124, 84,140,233, 11, 62,109,
+ 54, 10,110,228,131, 31,211,241,175, 66, 72,155, 13, 97,147, 16, 32, 32,224,161, 74,198,186,210, 92, 24,210,214,131,231,121, 92,
+188,120, 17,131, 7, 15,134, 76, 38,171,194,248, 3, 3, 3, 97, 48, 24, 96, 48, 24, 80, 88, 88,136,241,134, 25,248, 38,240,189,
+ 90,105, 58,105,242, 38,213,210,186,202,184, 27, 74, 89, 33,181, 48,127,167,219, 96,245,239,141,137,137,225,211,211,211,145,150,
+150,134,216,216, 88,190,190,223,107,101,254, 96, 24,198,237, 62, 17, 31, 31, 47, 5,240,246,129, 3, 7, 62, 90,180,104,209, 9,
+ 66,136,220,118, 0,104, 22, 28, 28,236,117,232,208,161,181,241,241,241,131,235,162,243, 85,202, 90,129,128,136, 36, 52,195,251,
+153, 76,230, 80,150,227,154,177, 28, 23,193, 18,210, 2, 2, 65, 48, 33, 36, 0, 68,224,199,241, 8,226,105, 46, 64, 99, 48,123,
+135,250, 49, 2,170,143,214,169, 58,210,235,245, 76,117,173,255,113, 7, 85, 23,227,110,215,174, 29,218,250,248, 65, 95,116, 23,
+207,247,236,229, 50,131,182, 9, 17, 11,183, 44, 6,128, 74,230,111,179, 34,236,216,177, 35,211, 38, 4, 20,104,238,160,215,156,
+126, 46, 9, 25, 58, 3, 11,157,129,197,221, 50, 19, 10, 75,140,184,125,207,232, 22,227,179,117, 22, 71,204,255, 81,161, 14, 33,
+ 0, 70,218, 4,163,209, 88, 31,242,188, 66,161,128,205, 71, 30, 18, 18, 98,175,205,194,133,193,164,138, 38, 92,135, 41,209,225,
+160, 71,155, 77, 22,205,223, 68,131, 54, 87,101,254,102,179, 25, 58,157, 14, 90,141,246, 81, 87, 11,191,101, 75, 90,213, 79,178,
+252,193,122,223,173, 1,207,158,249,219, 24, 63, 69, 81,144, 74,165,240,246,241,170, 87,134, 71,191,148,192,215,118, 56,122,119,
+223, 63, 23, 32, 24, 3,192, 12,157, 14, 0,240,201,186,142,243,185,101,150, 65,126,232,116,152, 47, 46, 4, 74,203, 92, 43, 64,
+ 43,220,253, 30,111,148, 2, 0,214,175, 95,143, 29, 59,118,224,211, 79, 63,197,201,147, 39, 97, 50,153, 80, 92, 92,108,211,202,
+ 42,211,135,135,135,195, 0, 64,128,155,143,164,189,212,209,238, 73, 61,132, 70, 82,135, 5,207,101,154,246,150,176,154, 98, 2,
+220, 97,254, 0,224,174, 16, 16, 31, 31,223,216,202,252,167,124,255,253,247,151,230,205,155,247,210,198,141, 27,209,174, 93, 59,
+ 0, 64,203,150, 45,161, 86,171, 37, 11, 23, 46, 60,125,232,208,161, 31,227,227,227,229,181,150, 18,199, 19,112,140,148,101,153,
+ 32,150, 97,155,153, 89,115, 27, 1, 69,154,138,133,148, 72, 42, 18, 24,132, 94, 98,149,183,175, 64, 35,144,242,140, 84, 32,240,
+ 22, 50,180,223,205, 51,103, 37, 19, 67,190,112,152,239,156,156,156, 82,157, 78,199,213,100,230,239,222,189,251, 85,154,166, 27,
+172, 33,117,239,222,189,193,104, 9,235, 98,220,255,153,242,214, 95,204,182,224, 54,102,119,238,128, 21, 22, 6,237,146,212,106,
+211,254,109, 76,191,218,239, 84, 94, 7,119,109,236, 82,230, 43, 12, 44,180,122, 6, 26, 29, 3,117, 5, 3,149,150,113,189, 87,
+214, 16,249,111,175,229,219,255,127,227,198, 13,168, 84,170,135, 54, 98,164,164,164, 64, 46,151,195, 22,244, 87,205,215,207,167,
+164,164,192,104, 48,212, 71, 0,224,215,173, 91,135,130,194, 66,136, 4, 2,132, 53,110, 92,133,249, 63,251,236,179, 56,120,240,
+160,179,131, 19,137,142,142,174, 46, 4, 84,177,100, 56, 27,171, 64,155,104,208, 38, 19,204,102, 26, 12,195, 86, 50,127,147,201,
+ 4,189, 94,143,138,138, 10,104,181,174, 11, 0,246, 46, 0, 27,220,213,252,183,164,109, 1,120,160,212,202,104,172, 78,109, 16,
+158,183, 8, 1,105,105,136,179,104, 80, 46,245,149,234,204, 95, 36, 18, 65, 34,145, 64, 42,149, 66, 42,149,214,187, 77,213,230,
+ 18,168,105, 94,188, 61,198,166,108, 5,255, 98, 4,238,245,239,133, 96, 12,128,236,229, 85, 96,238,150, 0, 1,126, 16,150,109,
+194,174, 47, 78, 3, 2,129, 75,121,169,175, 43, 64, 39,176,140, 41, 75,151, 46, 69, 73, 73, 9,214,174, 93,139,238,221,187, 99,
+209,162, 69,232,213,171, 23, 12, 6, 67,117, 13,205, 38, 82, 63,108,198,239, 44,131,118,215, 29, 80,155, 32,225, 50, 29,235, 44,
+142,202,190,225,174,107,204,158,249, 87, 50, 27,171, 16,224,162, 59,192,247,194,133, 11, 95,190,243,206, 59, 71,186,118,237,234,
+ 7, 0, 11, 22, 44, 64, 78, 78, 14, 0,160, 95,191,126,248,229,151, 95, 48,112,224, 64,239,241,227,199,231,102,102,102, 30,120,
+227,141, 55,198,159, 61,123,246,190,146, 13, 10, 14,226,110,220,200,101, 50, 21, 7,247,182,105,211, 54, 51,162,165,252,146,192,
+ 87, 86, 44, 32, 98, 29, 37, 17,233, 41,169,151,150, 22, 10,104,240,102, 1, 39, 53,251,106, 11,203,124, 78, 30, 58,215,167, 81,
+ 96,216, 47, 14,133, 81, 59,159,255,182,109,219, 94, 31, 51,102,204,247, 54,179,191, 70,163,161,196, 98,113,189, 27,146,205,236,
+127,224,192,129, 7,107, 1,176,105,249,145,173,219,194, 88, 82, 2, 93,129,133, 9, 14,182,106,135,174, 90, 1,110,252,113,253,
+ 62,218, 53, 93,151, 93, 44,114, 41,243,245,101,254,246,140,159,231,121,155,143,191, 18,102,179,185,242, 80,169, 84,208,233,116,
+ 80, 42,149, 15,109,228,176,205,243,223,183,111, 95,117, 75, 0,159,146,146,130,110,221,186,193,104, 52, 84, 14,116, 41, 41, 41,
+ 46,153,235,215,124,181, 6,102,179, 25,205,194,195, 97,102,217,218,152,191, 43, 3, 9,169,193,244, 95, 57,117,177, 46, 75,198,
+125, 2, 0,109,174,100,254,167, 78,158,130,222, 96,128, 86,171,133, 90,173,134, 74,165,170,162,217,185, 10,155, 27,160, 30,126,
+127,148,149,150,161,172,172, 20,165,101, 74,148,150,149,161,172,172, 12,101,165, 22,141,180, 67,199,142, 80, 90,255,119, 85,251,
+ 7,128,158, 61,123,254,165,245,123,123,195,199,199, 23,190, 62,190,208,106,181,209,245,100,254,110,187, 3,114, 63,157, 2,209,
+203,171, 16,140, 1, 16,102,173,130,121,235,116, 32,192, 15, 59,223,141,193,173,157, 55, 49,106,249, 6, 64,248,144,151, 21, 49,
+222,130, 44, 92, 6,157, 78, 7,163,209, 8,189, 94,143,172,172, 44, 44, 91,182,172,198,228, 94, 94, 54, 11,202,117,119,152,183,
+187, 90,181,125,249, 18, 39,175,235, 35,100,184,218,103,171,208, 73, 75, 75, 35,177,177,177, 54,230,239,182,101, 66, 40, 20, 18,
+134, 97,170, 11, 5,112, 53, 22, 96,195,134, 13,215, 98, 99, 99,187,111,220,184,113,240,209,163, 71,125,135, 14, 29,122,210,198,
+252,173, 10, 36, 36, 18, 9,127,235,214, 45,209,222,189,123,219, 7, 6, 6,158, 26, 48, 96, 64,110, 77,180, 94,125,229, 85,174,
+109, 68, 59,109,191,126,253, 98, 46, 93,250,243, 25,141, 78,219,152,103,204, 12, 40,152, 25, 19,101, 50,153, 76, 6, 13,138, 52,
+156,201,168, 45,204, 47, 98,118,237,222,147,212, 40, 56,164,152,166,245, 14,213,247,154,180,255,242,242,114, 33, 0,248,249,249,
+ 61,182,110, 1,170, 54,237,127,203, 39, 31, 89,164,230,162,187, 85,158,185, 26, 11, 48,122,244,232,232, 53,111,175, 4, 96, 9,
+248,219,177, 99,135,194,198,244,109,107, 2, 12,251,225, 37, 0,192,153,229,191,219,226, 3, 30, 22, 42, 27, 99, 65, 65, 65,165,
+182,111, 99,250,118,149, 11,173, 86, 11,163,209,104, 55,136, 60,188, 60, 78,157,106,137,253, 48, 51, 12, 46, 93,186,132,179,103,
+206,160,123,183,238, 48, 26,141, 48, 24,140, 48, 26, 12,248,241,135, 31, 96, 75,231, 76, 71, 79, 78, 78, 70,167,142,157, 96, 54,
+155,113,237,218, 53, 48,102, 26,133, 5,133, 13, 90,166,182,107,235,154, 5,182,181, 11, 28, 91, 0,204, 38, 48,172,197,236,127,
+226,196,239,208, 25,116,168,208,106,160, 86,171, 81,174, 82,161,188, 92, 89, 47, 65,204,102, 9,112, 83,251, 7, 0, 28, 57,114,
+ 4, 90,173, 22, 90,173,198,122,214,162, 81,112, 48, 58,116,236,136, 43,151, 47,227,240,145, 35, 46,211,180,105,255, 66,161, 8,
+ 94, 94, 94,240,241,241,129,175,143, 15,124,124,188,160, 44, 87, 70, 39, 36, 36,100, 58,213,231,234, 97,234,175, 13,231,115,203,
+ 96,190,184, 16,101, 56, 6, 50,114, 5,200,128,127, 33,247,211, 41,120,113,249,247,144,138, 40, 64, 36,180, 28,238,112, 29, 55,
+ 93, 1,133, 47,124,133,160, 77, 47, 64,175,215, 35, 40, 40, 8,229,229,229, 40, 47, 47,199,241,227,199,113,247,238,221, 74, 51,
+113,101,250,194, 66,188, 27, 40, 67, 35,175,146,186, 52,224,104,123,166, 26, 27, 27, 27,101,247, 44,170,218,179,104, 23,251, 5,
+ 95, 7, 3,111,136, 25, 5, 46,107,254, 53,125,111, 90, 90, 26, 73, 79, 79, 39,245,252,222, 42, 66,128, 59,204,223,134,143, 63,
+254,248,194, 75, 47,189, 52,126,233,210,165,237,207,159, 63, 63, 64, 38,147, 9, 94,124,241, 69, 34,145, 72,192,113, 28, 25, 57,
+114,228,133,153, 51,103,118,235,210,165,203,206,201,147, 39,191, 62,121,242,228, 90,125, 81, 9,211, 18,184, 63, 47, 95, 59,213,
+165,107,183,215, 78,157, 60, 57,118,231,238, 95,151,100,159, 60,217,248, 82,206, 21,233,181,194, 92,254,199,149,155,101, 75,147,
+ 63,237,116, 96,247,238,228, 54,173,219,236,242, 9,243, 62,178, 97,195, 6,214,217, 18, 29, 58,116, 40, 78,157, 58,213, 35, 37,
+ 37,101,161,209,104, 20, 45, 90,180,232,179,157, 59,119,142, 43, 44, 44,124,232,140,195,169, 58,170,237, 65,240,205, 60, 40,129,
+ 74,237,223,134,193, 33, 33, 88,129, 43,206,107, 29, 86, 19,255,149,211,151, 16,208,190, 17,134,253,240, 18,118, 76,220,174,176,
+ 73,111, 54,230,111,211,254, 93,153,101,240,203,210, 30, 13,195, 97, 9,193,229,203,151, 97,107,172,213,205,203, 34,145, 8, 34,
+145, 8, 37, 37, 37, 24, 57,114,228,163,168, 39, 34,151,203,249,148,148, 20,244,233,211, 7, 70,147, 9, 6,163, 1, 70,107,112,
+147,193,104,113, 3,172, 94,189, 26,137,137,137,142, 6, 19,126,249,242,229, 96, 89, 22,167, 79,159,129, 72,104, 49,219,182,109,
+219, 22, 55,243,242, 80, 88, 88,136, 77,155,126,198,184,113,175, 2, 0, 95,205, 18, 80,235, 0,148,154,154, 42, 6,192, 36, 36,
+ 36,112, 53,105, 64,174, 76, 85,180,105,254, 89, 89, 89,208, 85,232, 43, 5, 48,141, 86, 3,141, 70, 13,141,198, 61, 23,128,189,
+246, 63,110,220,184, 74, 11,128,171,130,192,184,113,227,170, 92, 71,200,229,232,208,209, 18, 20,119,229,242,101,220,180, 90, 60,
+198,141, 27,231,114,212,126,255,167,251, 67, 34,150, 64, 38,147, 65, 42,149, 66, 34,145,160,168,168,200,105,230,111,167,237, 55,
+104, 3, 28,187,108, 29,126, 1, 48, 98,233,255,129, 79,155, 13, 18,151,140,243,185,101, 32, 65,129,184, 94,160,177,104,255, 46,
+186, 0,236,250, 31,177, 9, 2,246,215, 14, 97, 48, 0, 2,139,178,247,151,121,223,194,232,205,102, 51,190,249,230, 27, 12, 30,
+252, 87, 92,216,193, 73,225, 64,177, 30,237,247,148,163, 71, 72,203, 26, 73,214, 16,229,110,239,242, 84, 56, 72,235, 44,195, 38,
+245,176, 40,212,101,141,112, 89,144,120,208,223,107, 21, 2,234, 61, 11, 96,233,210,165,155,102,204,152, 17,114,238,194,133, 56,
+131,193,208, 77,161, 56, 36,147, 72, 37, 66,138, 80, 56,116,232,144,111,167, 78,157, 54,196,198,198,254,107,236,216,177, 14,181,
+245,204, 67,251,185, 81, 47,141, 58,220,189,123,207, 57, 52, 99, 26,113, 61,231,218, 18, 46, 47,151, 1,192, 75, 65,153,187,182,
+105,159, 22, 26, 26,178, 71, 32, 20,255,248,239,121, 73,244, 23,139, 62,119, 88, 75,125,250,244,249,124,232,208,161, 0,128,146,
+146, 18, 28, 56,112,192,239,187,239,190, 91, 2, 0,167, 78,157,234,211,185,115,231,125, 79,132, 0, 96, 91,248,231,217, 31, 55,
+ 58,210,236, 93,153, 18, 72,182,205,217,194,247,154,211, 15,193, 93, 27, 87, 50,253, 74,115,234,197, 34,156, 89,254,187,171,102,
+171,134,154,147, 74, 0,240, 29, 59,118,196,197,139, 23,171, 48, 22,149, 74,149, 11,160,181,139,210,252,131,180, 4,220,247,155,
+ 63,254,240, 35,140, 70, 35, 76,180, 9, 52, 77, 99,249,242,229,117, 45,146,195, 47, 95,190,188,242,130,227, 88, 72,101, 62, 48,
+ 24,140,184,124,233, 18,132, 34, 17,204, 52, 13, 47,111, 47,108,218,180, 9, 2,129, 0,113,113,113,120,246,217,103,249,178,178,
+218, 3,188,150, 47, 95,190, 47, 33, 33,129, 78, 77, 77, 13,181,149, 77,181,117, 0, 92, 50,109,206,153, 51, 7,199,142, 29, 67,
+ 69, 69, 5, 42,116, 58,104, 53, 26, 43,243,215, 64,171,209,162, 66, 91, 1,157,221,128,239, 76,217, 69, 70, 70,242,217,217,217,
+149,218,127, 77,211, 0,157, 93, 4,200, 58, 23,191, 74, 93,216,152,190,205,247,232,202, 42,133,182, 21,254, 0,192,199,203, 7,
+ 82,153, 20, 90,173, 54,218,230,218,113,131,249, 63,144,249,218, 54, 33, 96,204,210,239,192,111, 5, 26, 77, 74, 69,230,123, 49,
+ 24,152,244, 19, 32, 18,193, 91, 90, 63, 63,103,117, 65, 0, 0,198, 29, 27,231,224,173,123,232,186,207, 11, 69,191,234, 81,190,
+248,175,187,102,179, 25,131, 6, 13, 2, 0,132, 7,202,240,223,212,230,248,116,217,109,124,117,198,224, 72, 35,182,159, 22,135,
+218,254,183, 75,155,233,198,152,213, 80,115,235, 27,194,231,255, 32,191,183, 82, 8,104,136,246,247,229,151, 95,126,249,198,164,
+ 55,246, 62,213, 59,178,143, 86,163, 9, 98, 88,198, 20, 22, 22, 86, 18, 30, 30, 94,164,209,104,206,143, 29, 59,214,233, 65,225,
+215,237,191,114, 0, 54,189, 54,225,173,172, 1, 3, 7,110,151,201,100,254, 4, 60, 71, 8, 1,199,241,106,131,174, 92,113,245,
+ 66,190,214, 91, 34,118,106,156,183, 49,127,192, 18, 72, 93, 61, 80,111,217,178,101,255,122, 34, 4, 0, 43, 83,119, 88, 97, 59,
+118,236,112,185,177,158, 89,254, 59, 15, 0, 54, 65,192,142,241, 55, 36, 67,119,187, 35,117,237,218, 21,167, 78,157, 66, 73, 73,
+165,137,176, 53, 0,216,152,223,196,137, 19, 31,117,125, 85, 41,163,148,148, 20,254,181,137,175, 97,245,234, 53, 86,159, 57,131,
+ 57,115,230,212, 57,125,201,197, 21,244, 44,154,211,193,131,142, 54,155,232,184,124,249,242,107, 9, 9, 9,197,169,169,169,130,
+132,132,132,202,128, 64,235,180, 64,167, 7, 58,155,198, 60, 96,192,128, 6, 47,187,200,200, 72,222, 94,139,183,143, 1,112, 99,
+ 5, 64, 2,128,223,180,105,211,125, 90,190,213, 66,224,114,123,222,180,105, 19,113,213, 98,224, 12,234, 50,253,187, 42, 44,140,
+ 93,182, 14,176, 91,248,103,200, 71,127, 77, 71,214, 53, 84, 69,217, 89, 0, 28,173, 4, 88, 56,160, 16,133, 0,122,125, 26,136,
+197,167,219, 33, 4, 64, 73,174, 14,109,218,180,177, 48,141,197,129,120,238,169, 16, 68, 60,151,227,172, 70,236,180,123,211,154,
+150,184, 59,222, 52,208,152, 87, 47, 90, 15,233,123, 27, 12,235,214,175,187, 6,224, 90, 67,209,251,241,167,111,243,208, 0, 81,
+161, 13, 25,152,103,197,172,135, 81,158, 15,123, 51, 32, 50,122,244,232,168, 29,203, 31,203,189, 0, 8, 0,254,169,167,158,194,
+158, 61,123,140, 86,166,207, 1,240,122, 64,150,135,122,195, 22, 36,152,152, 56,141,183,106,254,143, 36,111,115,230,204,105, 89,
+147, 89,210,110, 26,161, 43,218, 14,121,192,117, 92,153,159,250, 46,251, 91,219,170,124,174, 50,113, 71,107,251, 55, 4,234,227,
+ 18,152, 59,119, 46,110,220,184,209, 96,121,113,102,121, 95, 87,113,230,131,114,156,129, 37, 48,116,112,172, 12,191,157,104,135,
+ 48, 47, 31,252,153,125, 15,237,157,100,254, 78,180,191,199,117, 57, 92,242,128,222,245, 44,207,238, 28,154, 54, 48,189,228,135,
+149,241,135,190, 27, 96,117, 11,131, 27,150,132, 7, 46, 4,140, 28, 57, 82,250,132, 53, 64,183, 52,251,134,250,237,212,212, 84,
+219, 10, 53, 76, 66, 66, 66,125,167, 50,121,208,240,204,191, 94,117,145,148,148,212, 32,117,153,154,154, 42, 76, 24,152,240,192,
+219,197,145, 52, 3,142,164,229, 60,246,125,214,211, 50, 61,120,228,141,208,221,125,132, 61,240,192, 3, 15, 60,240,192,131, 39,
+ 23,148,167, 8, 60,240,192, 3, 15, 60,240,192, 35, 0,120,224,129, 7, 30,120,224,129, 7, 30, 1,192, 3, 15, 60,240,192, 3,
+ 15, 60,240, 8, 0, 30,120,224,129, 7, 30,120,224, 1, 0,156, 4, 80, 98, 61, 63,145,168, 50, 11,224,220,185,115,110, 71,166,
+214, 20, 76,232,161,231,161,231,161,231,161,231, 36,189, 58,167,137, 62, 6,244, 60,245,235,161, 87,133,249,159, 61,123,118, 24,
+ 96,217, 96,146, 16, 98,124,220,190,215, 99, 1,240,192, 3, 15,224,239,239, 79,249,251,251, 19,127,127,127, 17, 0,193,227,150,
+ 63,219,190,243,118,251,207,215, 23, 53,173,143,239,193, 99,132,255,251,191,255,139,122,194, 63,161, 15, 0,219,178,195,162, 39,
+245, 35, 60, 2,192,223, 28,245,216,110,221,101, 12, 27, 54, 44,202, 58,232, 86, 30,214,123,127, 75,122,143, 57, 72,203,176, 48,
+ 2, 0,106,181,154, 83,171,213,188, 90,173, 54, 3, 96,221, 33,246,246,115, 93, 11,166,140,232, 58, 26, 0,166,140,232,250,195,
+219,207,117, 93, 3, 0,115,198, 60, 69,230,188, 28, 41,122,123,120, 23,183,214, 20,177, 95,138, 54, 45, 45,173,202,230, 59,245,
+ 97,254,118,237,190, 33,215,218,175, 47,205,134,166,247,196, 50,255, 61,123,246, 40,254, 6,159,194,160,225, 86,116,172, 21, 77,
+130, 37,164,109,227, 80,170,133,188, 25, 9, 11, 8, 22,120, 75, 68, 13,246,123,194,191, 73,155,162, 0,200, 96, 49,199,112,240,
+160,138, 0,224,196,222, 42, 38, 0,146,250,254, 84, 70, 70, 6,146,147,147,171, 44,255, 55,107,214, 44, 91, 71, 39,238,208,227,
+ 54, 7, 86,173,232, 87, 50, 30, 23,122,143,125,213, 71,120,203,248,136, 86,114, 0, 64, 17,205, 76,104, 44, 22,254,100,123,120,
+ 69, 83, 33, 41, 42, 45,165,157, 33, 52,121,120,151, 28,150,229,195,159,238,223,200,175,125,251, 1,251, 37, 18,234,214,180,164,
+ 62,255,254, 15,185,136,123,106,253,255,137,132,228, 87,128, 92, 2,208,217,213, 76, 86, 95,138,182,158,203,205, 86, 97,254,118,
+109,223,221, 65,154,184,120,255, 97,211,123, 98,153, 63,199,113, 32,132, 96,240,224,193,252,145, 35, 71,136,139,117, 44, 6, 96,
+110,136,252, 4, 5, 5, 77, 81, 42,149, 95,187,249,186, 4,128,209,206, 18,208,160, 24,208,173, 7,121, 45, 60, 66,168,106,209,
+ 72, 16,218, 49,156, 18,146, 80,162, 87,171, 57, 41,194, 88,170,103, 51,246,245, 81,195,217,250,254,134,179, 2, 64, 8,128, 72,
+ 0,217,176, 4, 61, 60, 78,240, 3, 48, 20,192, 24, 0,219, 0, 28, 0,160,105, 0,186, 63, 3,120,181,129, 24,236,163,147,140,
+ 40,135, 70,158, 62,214, 14, 21, 10,160,216,221,129,119,230,204,153,104,209,162,197,125,219,133, 38, 39, 39, 71,231,231,231, 43,
+ 86,174, 92,233,202, 32,204,175,159,238,141,248,129,247,111, 46,195,109, 14,196,134,255,210,152,180, 74,247,200,232, 45, 95,190,
+ 60,234,195, 15, 63, 84,196,197,197,225,231,159,127, 38, 0,240,206, 59,239, 68,173, 93,187, 86,209,162, 69, 11,112, 28, 7,131,
+193,128,168,168, 40,108,221,186,213, 33,205,117,203, 63,139,106,255,225, 22, 69, 70,175,102,209,243,179,211, 51, 1, 96,205,194,
+ 53, 81, 87,231, 51, 10,182,133, 31, 52,156, 55,202, 13,126, 40,246, 63, 21,125,242,198, 39,153,142,232,181,106, 22,214,184,133,
+ 88,118,119,250,180,137,166, 48,153, 88,172, 81, 26,200,242,239, 54,254,244,209,212,215, 16, 40,147,241, 70, 51,203,127,178,250,
+ 59, 83, 81,105, 41,105,220, 56, 88, 88, 84, 84, 86,107, 35, 57,179,237,229,182, 59,118,222, 14, 24,240,116, 72,114,207,222, 65,
+162,245,235,175,203, 67, 26,201, 74, 63,127,239, 68,242,140,151,122,176, 79,247,111,148,149,115, 77,155, 63, 41,190,245,200,111,
+246, 95,172, 15, 83,172,175, 38,197,215,100,241,170,167, 16, 80,219, 59,238,230,181,161,233, 61,177,204,127,214,172, 89, 24, 60,
+120, 48,255,223,255,254,215, 29, 82, 52, 44,102,119,166, 1,178, 85, 20, 20, 20, 52, 70,169, 84,110,115,227, 93,127,171,210, 25,
+ 8,224,110,124,124,124, 0,128, 41,214,107, 27,238, 1,248,117,195,134, 13,185,206, 18,253, 98,237, 23, 20, 93,106, 18,209, 38,
+163,180, 28,102,169, 72, 36, 20,106,140, 82, 74, 44, 54,112, 2, 63,111,134,150,153,205,194,162, 59,166,239,191, 89,111,124,125,
+242, 36,182, 62,109,199, 25, 23, 64,115, 0, 63, 0,136,177,158,155, 63, 70,109, 42, 24,192, 38, 0,207, 3, 56, 14, 96,132,245,
+ 58,184, 1,104,191, 2, 39,252,165, 15,211,196,254,128,208, 15,192, 85, 0, 17,238,104, 35, 54, 19,186, 61,243,159, 53,107,150,
+194, 78,243,175,124,230,140,185,221,150,198,158, 89, 83,175,148,131,122,165,188,242,218,246,236, 81,208, 3,128, 19, 39, 78, 40,
+164, 82, 41,178,178,178,238, 19,182,242,243,243, 73, 65, 65, 1,233,215,175, 95,244,238,221,187,157, 42,195,198, 39, 46, 41,120,
+169, 8,221, 74,196, 85,180, 97, 66,241, 88,147,255, 6,249,161, 32,142,200, 71, 92,140,102,238,188,224,208,108, 26,213, 74,206,
+183, 16,203,238,190,255,238, 4, 83, 51, 31,177, 88,125,233, 24,241, 42,190,128, 25,131,218,162,105,128, 12,197,103,142,146,123,
+167,143, 81,179,166, 76,164,163, 90,201,249, 14, 94,190,230,186, 52,152, 70,141,196, 67,196, 98, 74,122,252,248,221,153,167, 78,
+222,233, 24,214,172,149, 57,160, 81, 51,226,235, 11,175, 86, 17, 94, 17, 65, 65,146, 54, 28,207,155,118,157, 44,214, 61,194, 54,
+204,219, 51,123,219, 81, 67, 31,229,157,165, 85,237, 92,253,168, 41,221,195,162,247,196, 50,255,221,187,119, 43, 8, 33,160, 40,
+ 10,217,217,217, 56,122,244,168, 91,180, 88,150,189, 96,181, 0, 52, 68, 60,139, 76,169, 84,110, 11, 10, 10,122,217,141,119,205,
+214,250, 50,197,199,199,135, 1, 88,113,240,224,193,127,103,100,100,188,111, 59, 14, 28, 56,176, 92,161, 80,228,196,199,199,207,
+119,134,224,172,185,179,132,165,119, 74,188, 12,188, 41,128, 23,146, 80, 94, 34,105,204,137,196,141, 57, 66,133,114, 68, 24,194,
+ 8, 4, 65, 28, 71,252,117,132,245, 97,196,148,236,155, 99,123,132,210, 23, 67, 31,168, 0,240, 5,128,131, 0,102, 88,207, 95,
+212,163,176, 3, 1, 44, 0,176,219, 90,112,187,173,215,129,110,210, 59, 2, 96, 15,128, 4, 0,107, 1,252,195, 74,243, 72, 61,
+ 27,133,191,245,236,221, 0, 26, 54,172, 26,246, 2,235,249,113,195, 83, 0,142, 1,104,108, 21,158, 94,115,229,229,140,140, 12,
+133,189,217,127,214,172, 89,138,228,228,228,232,228,228,228,104,123, 33, 32, 57, 57, 57, 58, 35, 35, 67,225, 12, 61,123, 51, 61,
+245, 74, 57,174,237,153,136,107,123, 38, 86, 97,218,220,230, 64,184, 75,207, 42,228, 16,119,232,165,164,164, 68, 29, 63,126, 28,
+ 19, 38, 76, 64,126,126, 62, 18, 18, 18,162,106, 74, 35,149, 74, 21, 77,154, 52,113, 88,126,169, 41, 41, 81, 77,142,255,129,130,
+ 9, 3, 32,206, 87,227,235, 5,159, 71, 85, 87,142, 83, 82, 82,163, 68,198, 22,138,160, 38, 6,135,204,127,202,228, 87,232, 79,
+102, 78,228,197,183,206,136, 3,239, 93, 36, 23,239,106, 16, 30,226,141,167, 59,133,161,169,234, 42,110,104, 13, 16,114, 60, 2,
+136, 64,244,207,183, 38,240,211,223,121,243,106, 84, 43,121,173, 76,167, 92,165, 13,234,211,199, 39,185,107,191,231,205,190, 65,
+173, 37, 62, 1,161,156,204,199,219, 20,212, 40,216, 24, 18,222, 92, 88,174,212, 74, 52,106, 6,229,106,147,211,131,144,213,207,
+239,144,113, 58, 25, 15,112,159,230, 95,147, 80,238,130, 16, 64,106, 56, 87, 63,106, 74,231, 20, 61,126, 75,224,125,135,139,244,
+158, 56, 80, 20,197,239,221,187, 87,193,113, 28,222,123,239, 61, 16, 66,112,244,232, 81, 88,182,222,229,136, 27,244, 64,211,244,
+ 89,171, 5,160,190,110,108, 37, 0, 40,149,202,173, 65, 65, 65,209,238,240, 79,154,166,133, 0,190, 62,112,224, 64,252,162, 69,
+139,238, 16, 66,196,182, 3,128, 40, 56, 56,152, 28, 58,116,104, 94,124,124,252,116, 71, 4, 5, 68, 36,161, 25,222,207,100, 50,
+135,178, 28,215,140,229,184, 8,150,144, 22, 16, 8,130, 9, 33, 1, 32, 2, 63,142, 71, 16, 79,115, 1, 26,131,217, 59,212,143,
+ 17, 80,125,180, 15, 76, 0, 8,183,106,252,159,194,178,219,231,167,214,235,112, 55,126,107, 34,128,124,107, 3,159, 11, 32,200,
+122, 38,214,251,174,238,181,251, 47, 0,215, 1,172,177,154,131, 36,214, 6,241,149,245,126,125,246, 95, 30, 12,139,171, 99, 72,
+ 3,245,129, 55, 1,204,183,158, 31, 55,116, 6,176, 29,192,179, 86, 75, 74,103,119, 9,217,152,191, 61,211,183, 23, 2, 92,110,
+156, 86,230,111, 67,117, 33,192, 29,122,213, 6, 88,226, 42,189,195,135, 15,131,166,105,244,238,221, 59,186, 67,135, 14,200,203,
+203,171,252, 62,142,227, 32,151,203,249,121,243,230, 41,142, 31, 63,142,145, 35, 71, 58, 28, 80,140, 89,167, 64,209, 12, 84,189,
+229,209,166, 14,193,184,190,238,240, 95, 76,139,227, 49, 77,190,142, 63, 60, 47, 88,113,243,184, 63,134,189,113,205,241, 0, 69,
+ 9, 42, 74, 46,102,113, 69, 42, 35,202, 42,104, 62,166, 71, 11,222, 95, 38,198, 29,149, 14, 37,106, 3,226,122,182,224, 41, 66,
+248,223,127,221, 7,245,145, 19,252,153,109,187,110,213, 69, 46,235,108,211,105, 33,161,126,173,155,182,136, 96,188,100, 92,235,
+193,207,199,249,180,234,157,240, 66,227,118, 47, 14, 11,106, 26,217, 93, 89,209, 56,198, 76,155,205, 55,114,117,126, 78, 50,127,
+222,217, 45,104,211,210,210, 20, 14,102, 6,212,248,204, 9,151,156,103,118,192, 67,212,252,121,158,135,217,252,151,203,126,224,
+192,129,182,254,226, 46,227, 50,139, 68, 34, 51,199,113,199,173, 90,120,125,132,128,208, 74, 73, 64,169, 84, 4, 5, 5, 37,184,
+240,110,185, 74,165,146, 28, 62,124,248,181, 3, 7, 14, 60,255,253,247,223,151,205,155, 55,175,197,198,141, 27,209,174, 93, 59,
+ 0, 64,203,150, 45,161, 86,171,201,194,133, 11,139, 15, 29, 58,244,121,124,124,252,192, 58, 41,114,140,148,101,153, 32,150, 97,
+155,153, 89,115, 27, 1, 69,154,138,133,148, 72, 42, 18, 24,132, 94, 98,149,183,175, 64, 35,144,242,140, 84, 32,240, 22, 50,180,
+223,205, 51,103, 37, 19, 67,190,112,187, 61, 59, 18, 0,158,179,106,135,246, 56,102,189,239, 10,198, 3,120, 15,128,220,202, 8,
+255, 0, 80,110, 61,207,183,222,127,207,154,206, 25,120,193,226,107,137,183, 94,155,236, 14, 88,239, 79,193,253, 91,249, 58,139,
+ 87, 0,124,103, 61,215, 23,111, 0,152,102, 45,179,105,214,235,199, 5,109, 96, 9,154,220, 5, 32, 17,192, 84, 0, 81,158, 97,
+171,118, 20, 22, 22, 42,250,246,237,139,169, 83,167,102,246,237,219, 23, 39, 78,156,192,218,181,107,163, 26, 55,110,172,160, 40,
+ 10,121,121,121,164,180,180,148, 76,159, 62, 61,250,200,145, 35,138,201,147, 39,215,217, 57,251,223,188,163, 40,234,219, 17, 9,
+ 83,167,102,254, 25,198, 70,119, 86, 7, 41, 82,215,166, 70, 89,164, 19, 96, 77,222, 27,100, 83,105, 12, 25, 60,189, 48,250,104,
+154, 92, 17,253,244,167,181,214, 79, 1,205,172,248,250,235,141, 65, 91, 47, 20,222,222,120, 38, 95,181,238,248, 13,221,205, 34,
+ 35, 79,241, 20,140,122, 22, 37, 37, 52,178,243,203,217, 29,121,133,218,221,119,138, 84,191,220, 42,184,114,172,168,120,248,109,
+147,249,179,218,104,250, 5,134, 55, 51, 84,148, 55,237, 20,249, 12, 69,147,150,131, 11,175,108, 55, 4, 6,121,203, 90,117,236,
+ 81,194, 51, 37, 23,136,192, 47,132,227, 56,193,189,123, 6,103,172,120,188, 45,226,223,142, 17, 87, 55,131,219, 95,195,154,158,
+119, 66,195,174,212,244,109,135, 51,233, 61,120,176,168,168,168, 80, 0,128, 80, 40,196,236,217,179,145,157,157, 13, 55,253,254,
+246, 48, 1, 48,153, 76, 38, 83, 97, 97, 97, 6,234, 23, 16,168,173, 98, 14, 80, 42, 83,131,130,130, 70, 57,249,174,212,104, 52,
+134,207,153, 51, 39,249,157,119,222,209,119,237,218, 85, 2, 0, 11, 22, 44, 64, 78,142,101, 55,202,126,253,250,129,227, 56, 12,
+ 28, 56, 80, 50,126,252,120,237,149, 43, 87, 14,189,241,198, 27,125,188,188,106,102, 77, 28,199, 51,153, 7, 15,238,205,203,187,
+ 49,158, 53,179,141, 4, 34,153, 73, 64,164, 58, 74, 34,214, 83, 82, 47, 45, 45,242,170, 0, 37, 81,115, 82,214,172, 85,151,249,
+ 40,118,158, 27,197,158, 58,235,118, 0,183, 35, 1, 96, 56,128, 67,213,238, 29,178,222,119, 22, 2, 0, 31, 1,136, 3, 80, 86,
+ 75,154, 50,235,243,143,224,156, 95,103, 60,128,253, 0,212,181, 60, 87, 91,159,143,119,163, 76,158,129, 37,134, 96,153,245,252,
+ 76, 61, 26, 87,140,213,106,210,207,154,159,126,214,235, 24, 23,233, 4, 2, 8,112,226,112,213,149,210, 31,150, 85,172,108, 65,
+ 72,183,172,150, 30,183,226, 60,170,107,252,213, 45, 2,174,130,219, 28,136,182, 35,127,168,188,110, 59,242,135,251,162,248, 93,
+165, 87,141,153,240,174,208, 91,189,122, 53,159,157,157,192,140, 1,163, 0, 0, 32, 0, 73, 68, 65, 84,141,211,167, 79,163, 89,
+179,102,252,111,191,253, 6,141, 70,131,203,151, 47,223,167,209,126,244,209, 71,153,157, 58,117,138,222,178,101, 75,173,244,190,
+ 89,189,154,111,158,125, 17,161,167,115,160,104, 54,146,239,122,149, 81, 80, 26, 51,216,203, 21,247,165,125,255,163,183, 50, 91,
+ 68,158,142,190,245,199, 43,181,106,207,215, 11, 10, 62, 40,160,153, 21, 37,165, 6, 57,109, 96, 3,115,238,104,124,118, 95, 41,
+ 44, 51,181,236,142, 78,161, 65, 0,128,221,231,238, 9,115,139, 42,252, 0, 4, 22,209,198, 78,183, 77,230,216,220,194,194, 15,
+106,163, 57,228,133, 56,170,195,224, 37, 93, 25,221, 31,249, 45, 58, 14,149,137, 68, 44,125,253,143, 12, 85, 97,254,229,123,197,
+249,191,231,107,148,133, 0, 69, 17,165,150,246,159, 18,215,211, 81,187, 33,177,177,177,213,153,113,117,179,186,253, 53,172,233,
+ 31, 86, 52,190, 7, 13,136,193,131, 7,243,135, 15, 31, 6,183, 57, 0, 60,207,227,243,207, 63,199,145, 35, 71,108,130,154,219,
+117, 80, 94, 94,110, 34,132, 12, 58,117,234,148, 49, 60, 60,124, 88, 61,173, 58, 1,128,101, 54,128,245, 60, 17, 0, 23, 20, 20,
+228,140,162,102,108,220,184,177,122,223,190,125,111,110,220,184,209,255,232,209,163,226,161, 67,135,170,109,204, 31,176,108,119,
+ 47,145, 72,112,235,214, 45,106,239,222,189,126,129,129,129,119, 7, 12, 24,144,203,113, 53, 79, 86,107, 27,209, 78,219,175, 95,
+191,152, 75,151,254,124, 70,163,211, 54,230, 25, 51, 3, 10,102,198, 68,153, 76, 38,147, 65,131, 34, 13,103, 50,106, 11,243,139,
+152, 93,187,247, 36, 53, 10, 14, 41,166,105,189,219,179, 16,168, 26, 58, 6,101, 61,154,194,226, 23, 62,108,119,143,178, 94, 55,
+182, 62,183,221,171,171,131,206,128, 37, 64,239,102, 53, 58,213,143,155,214,116, 51, 28,208,163, 0,140, 5,240,189, 3,122,223,
+ 91,211, 81, 78,208,179, 29,173, 96,137,115,248, 24,150,153, 4, 31, 91,175, 91, 85, 75,231, 12,189,241, 0,222,177, 50, 89,131,
+245,158,193,122,253,142,245,185, 51,244,226, 97,137,115,112,246,136,119, 34,127,159, 1,248, 15,128, 81,214, 50,167, 0, 72, 1,
+156,176, 90,101,250, 2, 72,178, 62,175, 43,127, 24, 54,108,216,125,190,126, 91, 16, 96,245,216,128, 97,195,134, 57, 20, 6,134,
+ 13, 27, 22, 93,221, 55,223,118,228, 15,247, 49,127,234,149,114,184, 75,207,166,101,186, 74,239,220,185,115,104,209,162, 5,238,
+221,187, 71, 10, 10, 10,200,221,187,119, 73,255,254,253,239, 11, 6,172, 52, 83,121,121, 41,164, 82,105,173,244,228,231,206, 65,
+213,162, 9,122,220, 59, 65,162, 11,246,144,151,238,110, 38,103,125,138,163,217, 44,117,141, 76, 62, 63,135,134, 68, 90,183,178,
+115,189,160, 96, 78, 1,205,196, 20,208,204,138,219,180,249,243,115, 55, 75, 66,244, 12, 3,181,209, 98, 28,187, 84, 82,130,155,
+ 70,122,195,109,147,121,205,109,154,249, 34,183,176, 48, 29,117, 76,157,109, 42,239, 48, 39,160,105,191,208,210,252, 3, 90,134,
+ 49,149, 23, 22, 73,155, 93, 56,113,202,255,242,185,243,109,242,110,177, 61,111,223,188, 13,177, 72, 24,218, 57,204,123,188, 74,
+107,110,227,168, 62,210,210,210, 72,108,108,172, 83, 66, 97,108,108,108,116, 90, 90,154,203,140,194, 62, 16,240,113,158,161,243,
+119,198,144, 33,131,249,204,204,204,202, 24,135,253,243,124,193,243, 60, 6, 15, 30, 92, 31,211, 63,172, 76, 58, 26, 0,158,126,
+250,105,125, 53,193,209, 45,121, 34, 40, 40,104,130,157,114,106, 82, 42,149,187,149, 74,229,186, 58,222,177,165,229, 0, 84,132,
+133,133, 93,120,233,165,151, 86, 47, 93,186,212,235,252,249,243,254, 50,153, 12, 47,190,248, 34, 36, 18, 9, 56,142,195,200,145,
+ 35, 43,102,206,156, 25,208,165, 75,151, 43,147, 39, 79,238, 60,121,242,228, 50,163,177,230,133, 3, 19,166, 37,112,127, 94,190,
+118,170, 75,215,110,175,157, 58,121,114,236,206,221,191, 46,201, 62,121,178,241,165,156, 43,210,107,133,185,252,143, 43, 55,203,
+150, 38,127,218,233,192,238,221,201,109, 90,183,217,229, 19,230,125,100,195,134, 13,110, 79, 7, 20,214,160,173, 71, 2, 24, 0,
+ 96, 17,128,233,214,193,210,187,154,217,238, 7, 88,252,236,159,192,226, 18,200,174, 67,192,120,202,170,253, 58, 99,142, 63,110,
+181, 46, 80,117,208, 11, 1,208, 18,192,105, 7, 52, 79, 91,211,133,162,246,169,139, 20, 44,129,121,129, 86,198,249, 18, 44, 83,
+255,114,172,180,115,172,215, 27, 97,241,147,111,128,197,117, 65, 59,160,247, 10,128,111, 0,116, 0, 80, 84, 45,159,119, 97, 9,
+ 90,188, 98, 77,187,217, 1,189,247, 96,153,221,160,119,162,252,188, 0,236, 3,240,147,131,250,120, 25,192,191,173,231,179,118,
+249, 19, 89,235, 50, 13,192, 42, 0,139,173,207,239,214,246,131, 25, 25, 25,153, 0,144,159,159,175,176, 69,251, 87,215,250,243,
+243,243, 21,246,105,235,130, 45,205,134,255,210,149,209,249,213,181,244, 13,255,165,241, 40,232,101,101,101, 97,208,160, 65,184,
+114,229,202, 95, 76, 92, 46,143,222,178,101,139,162, 85,171, 86,209, 28,199, 41, 90,182,108,201,219,166, 1,238,218,181, 11,145,
+145,145,209,123,247,238,173,145, 94,251,172, 44,252, 28, 28, 90,165,172, 58, 38, 14,135,238,211,219,192,179,161,224, 57, 96, 90,
+203,239,248, 10,206, 7, 74,131, 31,148, 57, 65,232, 62,104,103,244,229, 95,234, 54,179, 95, 47, 40,216, 10, 96,107,235, 22, 77,
+219, 3,248,135,137,229,144,126, 33, 15,131,194, 44,238, 78,194,243, 90, 45,195, 44, 42, 46, 46,190,231, 4, 51,253,148,231,121,
+239,156, 43,202,215, 84,167,183, 52, 42,190,171, 68,241, 61, 45,132,194, 50,239,138,114, 30, 42, 13,203,135,134,136, 3,132, 28,
+198, 24, 76,236,207,139,222,123, 58,224,147, 47,142,171, 28, 8, 1,153, 78, 12,216,164,154,187,192, 53, 12,181, 90, 94, 14,196,
+185,250,166,205, 26,230, 40, 42,223, 62, 29,113,150, 30,137, 43, 71, 61,233, 61, 9,224, 51,167, 93, 4,210, 45,147,177,246, 95,
+ 96,176, 78, 97,233, 99, 46,206,249,175,181,109, 8, 4,130, 16,161, 80, 88,124,252,248,241,111,159,126,250,233,250,148, 89, 11,
+165, 82,185,198, 42, 88,188,162, 84, 42, 55,219,206,117,188,179, 9, 22,151, 41,111, 29,187, 43,150, 46, 93, 58,125,198,140, 25,
+ 77,207, 93,184, 48,212, 96, 48,248, 42, 20,135,136, 68, 42, 1, 69, 40, 28, 58,116, 72,212,169, 83,167,179,177,177,177, 35,199,
+142, 29, 91,225, 40, 67,153,135,246,115,163, 94, 26,117,184,123,247,158,115,104,198, 52,226,122,206,181, 37, 92, 94, 46, 3,128,
+151,130, 50,119,109,211, 62, 45, 52, 52,100,143, 64, 40,254,241,223,243,146,232, 47, 22,125,238,118, 65,214, 36, 0,252,195, 42,
+225,188, 0,224, 50, 0,159, 26,222,219, 99,213,216, 99, 96,153, 71, 30, 95,135,249,191,173,181,192,156, 17, 0,202,172,233, 5,
+117,208,139, 2,112,205, 73,122,215,172,233,127,169,131,222, 20, 0,147, 0, 92, 4, 48,211,250, 93,246,180, 21, 0,242, 96,241,
+223,239, 6,176, 30,150, 25, 7,181,209,155,104, 45,143, 30, 86, 43, 66, 77,249,212, 88,159,167, 88,133,128,245,117,208,251,222,
+218,208,188,156, 28,188,190,119, 80,126,159, 89, 45, 27,251,173, 66, 13,170,209,254, 13, 64, 39,107, 93,228, 88, 5, 41,135,166,
+ 93,235, 60,127, 69, 3, 45, 4, 68, 38,173,210,241,147, 86,233,106, 88,184,167, 28,143,138,222,159,127,254, 73,254,252,243,207,
+ 42,247,126,250,233,167, 76, 0,100,243,230,205, 0, 64,110,221,170, 26, 83, 87, 27,243, 7,128,230,127,254, 73,128,170,244,222,
+ 94, 50,203,194, 28,151, 89,243, 84, 61, 68,239, 23, 23, 70, 97,150,207,131, 16, 16, 84,160,146,249, 91,185,250, 61,169, 84,234,
+148,217,144,231,121, 66, 8, 89, 48, 39,174,179, 87, 88,179,150,163, 56,120,181, 45,200, 47, 18,152,141, 42,190,113,168, 15,241,
+241, 22, 17,198,204,161, 92, 69, 51, 68, 70,100,106, 45,211,166, 14,133,160,182, 54, 91,253,255, 71,201, 0,237,221, 17,206,204,
+219, 39, 15,153,222, 99,207,252,185,205,129,216,127,193, 50, 69,127,189,130,198,207,199,105, 91, 76, 6,105,168,250, 97, 89,182,
+ 12, 0,122,245,234, 85,175, 5,129,108,204,223,138, 82,235,217, 81,223, 72,180, 27, 79,205, 0, 10, 0,224,203, 47,191,124,249,
+141, 73,111, 12,123,170,119,228, 24,173, 70, 19,194,176,140, 49, 44, 44,172, 48, 60, 60, 60, 87,163,209,108, 27, 59,118,108,169,
+179,249,250,117,251,175, 28,128, 77,175, 77,120, 43,107,192,192,129,219,101, 50,153, 63, 1,207, 89,102, 78,240,106,131,174, 92,
+113,245, 66,190,214, 91, 34,174, 87, 64,107,117, 1,128,133, 37, 72,205, 25, 63,252, 41,235,193,162,246,229, 69, 89, 88, 34,234,
+157,157,175,169,128,101, 33,159,186,232,237,128, 37,104,205, 25,188,230, 68,254,190, 6,240,173,163,177, 31,192,187,118,239,212,
+ 69,239, 7,171,197,192, 17,242,172,154,189, 51,249,115,101,190,235,215, 14,232, 61,235, 4, 61,155,181, 97,189,181,108,156, 49,
+ 49,145, 97,195,134, 69, 85,143,250, 31, 54,108, 88,180, 51,154,122,109,244,236, 86,234,123,220,232, 61,246,184, 81,120,215, 68,
+ 53,107,182,254,157, 79, 83, 38,217,238,209, 34,234, 39,163,158,219, 87,148,159,175,117,170,208, 8,225,255, 61,165, 31,249,248,
+235,223,231,236, 90, 21,186,237,196,201,187, 83, 67,252,185, 23,169, 32,191, 0,158, 7, 8,225, 77, 38,134, 43,226,128, 82,218,
+196, 5, 20,222, 53,184,228,143,180,154,249, 21,213,174, 31,151, 34,244,172, 4,232, 38,158, 91,172,125,208,223,200, 1,104, 34,
+149, 74,239,246,234,213,235,217, 51,103,206,212,155,160, 82,169, 60, 24, 20, 20, 52, 73,169, 84,174,119,242, 21,129, 53, 31,149,
+227,233,186,245,235, 50, 0,100, 52,212, 71,254,248,211,183,121, 86, 94,241, 64, 80,147, 0, 96,116,131, 14, 95, 71, 37,153, 60,
+244,254,182,244,170,192,202, 72, 73,181,123,110, 55,206,199,157,222,147, 0,165, 94,255, 38,224,101, 6, 16,194,129, 47, 52, 26,
+233,141, 69, 69, 37,231,225,194, 42,106, 31,127,253, 59,191,253,179, 17,228,133,233,251,178, 0,100,197,246,109,255,143,160, 32,
+201, 92,161,128,240,119,203,140, 87,239,210,204, 6,153,136,146,202,132, 2,129,153,225,164,174,228, 47, 45, 45, 45, 51, 54, 54,
+214,182, 15,128,205, 61,224, 58,103,173,238,235,183, 51,253,215, 35, 14,192,179, 18,160, 27,160, 94, 41, 7, 33, 4, 47,142,158,
+ 82,227, 24,178, 99,123,106, 67,125,107, 17, 0,210, 16,204,223, 78, 8, 88,239, 66,114,153,117, 76,165,159,212,186, 18,214,208,
+ 16, 27,114,142,172,135,222,223,155,158, 7,143,187, 0,160, 84,242, 74,165,114, 74,125,233,188,244,254, 62, 30, 0, 94, 27,220,
+137,252,120,228,210,231, 6,126,218,170,233,227,142,119,162,117, 36, 34, 72, 36,108, 4, 66,244, 62, 50, 97, 73,151, 14,126, 57,
+233,251, 93,163,109, 13,244,227,221, 9,248,123,192, 26,180,199, 2,224,198, 55,166,166,166,240, 9, 9, 83,201,142,237,169,127,
+247,238,229,111, 21,164, 37,110, 42,206,143,190,178,220,221, 71,216, 3, 15, 60,120, 2, 37,126, 1,224, 37, 33,224, 56, 30, 32,
+ 4, 21, 6, 79,247,247,192,131,255,217,241,192, 83, 4, 30,120,240,191, 3,134, 5, 52,250,191,245,178,243, 30,120,224,129,147,
+160, 60, 69,224,129, 7, 30,120,224,129, 7, 30, 1,192, 3, 15, 60,240,192, 3, 15, 60,240, 8, 0, 30,120,224,129, 7, 30,120,
+224,193,223, 17, 85, 98, 0,206,157, 59,231,118, 52,106, 77,193,132, 53,209,123,225,153,200,168, 46,221,218, 40,154, 52, 11,143,
+214, 26,116,138,195,138,172,232,140, 67,231, 51,221,165,215,181,239,240,168, 30,221,250, 42,238, 21, 22,194, 91,230,141,219, 5,
+185,209,217, 39,246,184, 77,175,161,191, 55,113, 60, 21,213,175,111, 43,133,204, 91, 0,161,128, 2,145, 18,188, 56,238, 18,113,
+151, 94,194,255,203,138,122,170,239, 83, 10,127, 31, 1, 32, 4, 98,251,214, 60,199,233, 81,125,175,135,222, 99, 75,175,206,169,
+102,143,251,247,182,234,245, 50,239,199,229, 62,208,252,157,253,232,150,219, 3,105,207, 37, 45,239,187,247,121,163, 66,183,233,
+253,163,244,254, 13, 87, 61,237,249,161,208, 19,162,134, 41,178, 79,226,247,186, 44, 0,212,134,149, 81,104, 11,203,122,248, 44,
+128,220,153,153,184,233,236, 15, 12, 31,216, 42,138,128, 67, 72, 64, 16,178, 14,159, 81,124,152, 56, 17, 3,134, 14, 0,163,211,
+ 43, 58,117, 24, 12,142,131, 98,198, 91, 79, 71,247,236,217, 13,215,175,223,130, 90,165,195,234,245, 71, 50,107,163,215,123,208,
+171, 81, 60, 8, 90,182,105,165, 72,120,127, 49,222,124,245, 57,252,240,159,175, 0, 72,177,231,124, 1, 40, 10,138,149, 11,230,
+ 33, 39,231, 42,228,242,150,144,200,132,184, 83,144, 19, 13,125,205, 89,158,251, 92,119, 94, 44, 22, 67, 38,147, 33, 55, 55, 23,
+ 77, 67,253,208, 72,232,131,166, 45, 2, 16, 40,243,135, 55, 97, 65, 81, 20,120,142,133, 94, 34,132,250,158, 26, 99,254,147,225,
+176,162,150,207,233,198,251,202,212,240, 11, 16,195,199, 91, 8,177,140,130, 80, 0, 80, 98, 33, 50,119, 69,242,102, 94,128, 97,
+163, 78, 56, 93,225, 93, 95, 90, 25, 21, 30, 30,142,102,173,155, 41, 12, 70, 19, 40,137, 12, 48, 3,211,146, 79, 69, 25,244, 58,
+124,247, 73, 84,230, 35, 20, 36,255, 86,243,152,159,112,184, 90, 23, 78,167,143,253,112,174, 55,128,167, 26,203,188,254, 93, 88,
+ 88,216, 65, 36,149,128,243,242, 90, 6, 96,109,218,178,164,138,199,165, 0, 34, 58, 13,137,186,121,233,112, 77,251, 41,252, 45,
+218,104,106,106, 42,249, 97,195,134, 43, 18,177, 88,198,113,156,191,183,143,143,207,168, 23, 95,244, 2, 64, 39, 36, 36,240,143,
+105,158, 41, 0, 72, 72, 72,224, 26,128,156,159,191,191,255,172,246,237,219,143,149, 72, 36,205, 10, 10, 10, 10, 10, 11, 11, 79,
+210, 52,189, 4, 64,174, 27,244, 2, 2, 3, 3, 23, 63,243,204, 51,207,135,133,133,201, 79,157, 58,117,239,226,197,139,199,141,
+ 70,227, 66, 88, 86,136,253,223,176, 0,212,194,252, 5,222, 18,225, 83, 19, 7,182, 94,193,241,188,241,232,213,123, 95,174,140,
+ 82,239,159,153,137, 75,142,222, 85,222, 61,200,155, 42,148, 48, 87,168, 32,100, 41,252,113,233, 42, 94,127,125,102,229,115,138,
+ 2,126,207, 90,143, 70, 45,194, 21, 92,133, 6, 52, 71,112,232, 80, 86,244,234,245, 71,106,161,216,146, 63,125,226, 18,136,151,
+ 31,206, 92,202,199,249, 75,111,224,187,159,127,171,124,202,113,192,136,254,253,129,138, 34, 0,190,200,189,120, 25,162, 70, 1,
+ 24,208,175,139, 66,165,175, 67,102, 33, 20, 64, 40,244,232,214, 11,141,189,197,104,218, 72, 10,191,224, 32, 4, 74,124, 17, 40,
+ 21, 64, 36, 16,192,204,178, 80, 49, 28, 78,149,158,118, 88,168, 11,223,109,206,203, 4,229,240,243,242, 66, 72,163, 96,248,249,
+121,129,167, 88, 48, 92, 5, 88,176,240,241,241, 66,163,198,205,144,123,165, 29,223,186,195, 15,117, 14, 74, 61, 99, 86,241,254,
+190,222,240, 15, 8, 68, 72,163, 96,232,116, 58,136, 37, 82,136,140,150,197,249, 34,228, 45, 21,202,114, 21,158,121,107,125,116,
+126,193, 29,148, 23,221, 66,217,249, 84, 71,194,128,211,131,196,208, 73, 67,163, 15,172, 63,144,233, 4,173, 7, 42, 4,228,229,
+229,241, 0, 32,151,203,201,227, 66, 47, 60, 60,252,117,154,166,215, 3,192,216,232,104, 42,117,203, 22,119, 6, 95,203, 26,169,
+118,134, 28,158,231, 65, 8,169, 60,219,238,217,210, 57,216, 73,205,149,245,228, 93, 97,254,157,188,205,204, 86,223, 0,255, 14,
+ 0, 32,150, 73, 65, 27,140,224,116,250,229,199,143, 28, 94, 16,251,225,220,142,105,203,146,242, 29,209,249,242,163, 68,222,170,
+ 97, 49,176,184, 32, 57,235, 56, 84,227, 88,212,125,200,243, 24,242,220,255,185, 84, 71, 55, 47, 29, 86,180,233, 18, 21,125,253,
+143, 76,215,133,226, 88,165, 75,201,227,226,226,176, 37,246, 64,157,105,162, 15, 84,221,138,164, 83,128,229, 83,139,141, 28, 12,
+140,165, 94,117,214,115,106,223, 0,180,243, 21,213, 73,111,197,138, 21,153, 31,189, 55, 59,116,244,216, 49, 62, 70,163, 1, 43,
+ 63,255,140, 90,189,122,181, 49, 49, 49, 49, 28,192,157,134,238,123, 99,198,140, 25,186,109,219,182, 12, 87,133,168, 73,147, 38,
+241,121,121,121, 40, 43, 43,195,210,165, 75,225,235,235,139,168,168, 40,200,229,114,172, 95,191,222,221,126, 55,184, 87,175, 94,
+ 27,222,127,255,253,235,237,219,183, 95,223,179,103,207,203,247,238,221,107,150,149,149,213,235,205, 55,223,220,173,209,104,150,
+195,178,149,187,179,136, 30, 59,118,108, 90, 82, 82, 82,176,217,108,134, 76, 38,131,183,183,119, 19,157, 78,247,242,232,209,163,
+ 71, 93,184,112, 33, 17,150,141,211,158, 56,156, 59,119,174,186,149,192, 57, 1, 96,101, 20,154, 3,104, 13,203, 18,135,172,206,
+196,220,206,186, 86,252, 69,255,182,161, 51,159,233,212,100, 65, 99,127, 89,211,149, 40,218, 4,224,234,204,204,218, 55,169, 49,
+ 85, 40,209,184,205,179, 88,252,193, 88,172,183,227, 73,135,143,167, 64,167, 55, 97,228,208,153,120,122,192, 36,188, 26,247, 12,
+100, 50, 9,104,150,129, 86, 79, 43,106,111,100,183, 0, 26, 24, 59, 97, 45,222,126,127,106,229,221, 17, 79, 71, 65, 42,149, 96,
+251,161,223,176,231, 88, 22, 54,172,251, 10, 70,131, 9, 98,129, 16, 62, 94, 98,232,202, 10,162, 85, 5,168,113,135, 53,158,231,
+ 1,158,179, 28, 20, 7,158,231, 97,162, 37,149,203, 59,240, 52, 11, 86, 0,176, 96,193,210, 28, 24,182,110, 1,118,206, 91,114,
+ 62,208,143,129,159,175, 55,194,155, 69,160, 67,215, 54,240,245,145, 65, 93, 81,130,162,146, 34,148,171,239,193,108, 36,240,242,
+242, 66, 72,200, 0,148, 22,135,240,141, 66, 63,171,217,140, 63,120, 30,207, 24,244, 48, 8, 1,177, 84, 12,131, 94, 12, 90, 47,
+134, 81, 42,129,144, 48,224, 33,128,209, 80, 1,131, 94,139,102,205,154, 42,196, 2, 33,148,208, 32,148,158,128,234,107,204, 87,
+199,167, 27, 62,117,216,128, 62,136,255,160,238,177, 50, 54,182,202,254,238,177,177,177,189,131,130,130,114, 8, 33, 70,158,231,
+133,129,129,129, 94,185,185,185,193,214,213,221,154,186,219,144, 19, 19, 19,199,217,253, 70,148,187,171,197,213,200, 45, 9,225,
+167, 77,155, 22,189,122,245,106,151,104,134,135,135, 39,244,233,211,103,201,192, 30, 61, 96,150, 72,144,156,156,204, 77,125,229,
+149, 97, 41,155, 55, 31,112,241,247,177, 98,193,130,202,235, 89,243,231, 35,121,225,194, 58,175,157, 33, 91,141,185,243,189,123,
+247, 6, 0,126,232,208, 86,157, 1,220, 72, 74, 74, 51,184,200,252,179,186,118,238,236,103,235, 51,222, 82, 25,238,150, 20, 67,
+ 83,174, 66,175, 62,125,189,118,125,183,238, 64,236,135,115, 59,167, 45, 75,114,180, 54, 59, 51, 99,201,106,225,107, 47,143, 18,
+182,149,203, 57,171, 16,128,249,201,171,170, 10,209,179,166, 3, 0, 62,122, 47,209,173,237,164,221, 98,254, 54,164, 5,185,144,
+120,168, 75,164,189,133, 4,231, 23,190, 5,226,215, 8,236,141,243, 48,221,248, 19, 57, 74, 29, 34,247, 22, 59,245,126,207, 94,
+189,142, 78, 25, 31,223, 50,126,242,155, 1,105, 63,253,204,201,229,114,106,113,210,114,248, 46, 88,140,237,219,183, 23,166,166,
+166, 82, 13,101, 5, 24, 51,102,204,176,109,219,182,237,223,182,109,155,237,122,184,237,127, 7, 2, 74,212,254,253,251, 21,183,
+110,221, 66,235,214,173, 49,104,208, 32,248,251,251, 67,165, 82,225,206,157, 59,184,121,243, 38,134, 15, 31,206, 15, 31, 62, 60,
+122,246,236,217,174,212,211,152,103,158,121,102,229,138, 21, 43, 54,245,236,217,115, 37, 33,228,142,221, 56, 78, 98, 98, 98,124,
+ 0,100, 89, 15,167,232, 37, 38, 38,166, 79,155, 54,141, 58,125,250, 52, 8, 33, 8, 14, 14,174, 60,246,238,221, 43,238,215,175,
+223, 87,183,111,223, 62,241,164, 51,127,219,189,234, 66,128,176, 6,230, 31, 28, 25, 17, 28,223,163,101,208, 4, 66,136,136,231,
+121, 51,103, 57,104,214,108, 52,136, 41,174,105,215,198,210, 15, 26,249,181,110,179,237,212,205,159, 87, 70,113, 71,103,102,214,
+190, 91, 28, 32, 70,167,142,237, 65, 81,153,200, 81,149, 1,184, 12,117,225, 53,136,164, 18,236,216,253, 37,244,165, 44, 38,188,
+241, 15,112, 28,240,226,168,254, 96,133, 62, 14, 63, 46, 39,231, 50, 56, 14, 24,217,157, 88,249, 74, 75, 24, 77, 52, 98, 70, 12,
+135, 52,128,194,134,141,251, 64, 81, 64,250,207,235, 81,120,227,207,232,189,155, 86,100,214, 36,253, 0, 0,199, 3, 28,199,129,
+227, 56,176, 44, 11,147,136,135,153,152, 65,211, 52,244, 94, 70,128,147,130,226, 89,176, 98, 30, 21,180, 17, 58,141,186,206,188,
+133,248,152, 32, 20,202, 16, 28, 28,140, 54,109,218, 32,172,113, 95, 64, 64,129,101, 79,131,226, 85, 48,234, 24,176,156, 14, 69,
+119,148, 8, 9, 46, 69,112,192, 0, 44, 91,177, 43,234,231, 31,239,167, 37, 51, 50,224, 77,165,128, 81, 2,154, 50, 67, 39, 22,
+162, 66, 38,130, 80, 36, 6, 56,111, 16, 1, 65,133, 78,143,242,162, 91,200, 61,125, 12,202,252,124,112, 28, 7,138, 23,184,213,
+104,190, 91,251,151,224,252,230, 59,111, 58, 30, 39,171,174,217,110, 76, 75, 75,155,251,254,251,239, 79,205,207,207,167, 8, 33,
+ 33,169,169,169, 63,195,178,185,147,151,187, 13,121, 74,108,172,104,205,154, 53, 27,239,221,187,135,244,244,116, 68,182,111, 47,
+104,136, 14, 34,151,203, 73, 92, 92, 92, 20,207,243,138,213,171, 87,187,188, 97, 17, 77,211, 41, 3,173,109, 74, 44, 22,163, 93,
+187,118,216,122,232, 80, 70, 72, 72, 8, 74, 74, 74,156,166, 99,211,236, 31, 0, 72,239,222,189,249,211,167, 45, 22, 43,187,243,
+159, 67,134, 12, 41,156, 59, 55,214, 63, 41,201,241,154,251,177, 31,206,245,246, 54, 51, 91,187,118,238,236, 39,160, 40,188,251,
+218, 4, 24,140, 38, 36,127,251, 45,188,100, 50, 24,141, 70, 24, 13, 6,116,239,217,163,237,111, 63,253, 52, 13,192, 23,142,172,
+142, 11,103, 77,231, 0, 80,215,242,242,168,234, 12,191,122,247,116,231,195,155,119, 24, 28,125,251,202, 17,126,216,139,111, 69,
+103,236,252,214, 45, 65,192,126,215, 62,219,150,182,117,221,119,132, 78, 1, 66,220,170, 96,113,120, 88, 8, 68, 51, 83,161,153,
+ 16, 1, 97, 96,168, 75,204, 63, 46, 46,174,200,172,211,223,153,252,238,212,230, 31,254, 99, 14, 86,175, 75,185,212,167, 87,175,
+ 86, 41,171, 82,188,222,155, 51, 27, 63,245,239,139,141, 27, 55, 78,132,101,215,210,250, 48,254,168,109,219,182, 41,108,204, 62,
+ 53, 53, 53, 23,150,109,218, 15, 58, 35, 0,236,223,191, 95, 17, 18, 18,130,158, 61,123, 50, 20, 69, 9, 45,214, 89, 14, 34,145,
+ 8, 65, 65, 65,104,220,184, 49,110,222,188,137,253,251,247, 43, 92,232,115,177, 47,188,240,194,103, 43, 86,172, 88,213,190,125,
+251,181,132, 16, 14,192, 87, 0,158, 3,112,132, 16,178, 16,150, 53,243,103, 3, 88,232, 12,189, 21,137,137,155, 7,198,198,146,
+157, 59,119, 66, 40, 20, 66,161, 80,224,252,249,243,104,211,166, 13, 22, 45, 90,132, 46, 93,186, 96,234,212,169,194,143, 63,254,
+120,197,147,200,252,167,204, 93, 86,121,239,235,164, 15,107, 20, 2,106,154, 5, 64, 9, 5,148,144,225,120,173,193,204,220, 33,
+132, 72,124, 36,130,110,126, 98, 68,202, 58, 15,105,141,232,183,129, 14,131,208,196,155, 31, 51,113, 64,196,135, 65,126, 94,195,
+ 86, 70,193,191,246,236,112, 16, 8,108, 99,182, 31,128,102,240, 15,127, 1, 6,214,136,181,169,235,240,195,198,116, 12,143, 30,
+ 0, 0,208,235, 1,129,176,118, 82, 50,175,246, 0, 0,150,181,223,155,166, 8, 64, 22, 40,129, 4,241,175,191,133,152,184, 56,
+236,218,109, 97,100, 94,222,128,174,226,110,157,133,101,134,160,146,249,155, 25, 22, 38,141, 25,122,149, 30, 42, 51, 13,165,158,
+ 70,185, 73, 11,149,182, 2,229,197, 90, 40, 85, 70, 40, 43,106, 95, 66,253,221, 87, 91,241,132, 16, 8, 4, 4,132,146,128,101,
+121, 48,250,124,232, 84,215, 80, 88,164,134,178,188, 2,106, 45, 11,101,185, 17, 5, 5, 69,184,116,229, 28, 84,234,115,232,219,
+171,183,162, 54,154, 2, 0,148,214, 8,195,245, 59, 40,251,227, 50,202,242,111, 65,163, 86, 66,163, 86,226,214,165,211, 56,158,
+246, 29,178,182,108, 64,201,245,235, 96,105,206,210,155, 4, 15,205, 13,104,219,135,155,142,137,137,233,184,120,241,226,247,155,
+ 52,105,162, 75, 79, 79,239,150,150,150,246, 43,128,158,214, 74,119,123,193, 41,113, 88,216, 44, 0,232,215,165, 11,166, 77,155,
+ 86,124,234,202,149, 3, 79,117,232, 16,213, 16,153,223,178,101, 75, 38, 0,146,152,104,209, 50, 19, 19, 19, 93,162,107,150, 72,
+ 0, 0, 91,183,110, 69,104,104, 40, 62, 76, 76,196,172, 89,179, 16, 18, 18,242, 88,248, 97,109, 76, 63, 53, 53,181,242, 0,128,
+195,135, 15,135, 3, 24,229, 36,153,167, 2, 2, 3, 59, 8, 40, 10,111,196,196, 64,165,214,160,224,238, 29,136, 68, 66, 8,133,
+150, 67, 36, 18, 65, 34,243, 66,107,185,252,243,158, 67,135, 58,165,177, 95,203,203,195,143, 91,127,173, 60,108,152,159,188, 10,
+243,147, 87, 97,143,226,176,203,223, 59, 52,246,227, 40, 0,184,125,229, 72,230, 80, 11,243, 87,224, 49, 89,237,232,194,247, 95,
+160,248,237, 94, 24,146, 81,130, 78, 1, 66, 8,252,130,192,148, 23, 35,114,111, 49,188,133, 22, 30, 40,112, 48, 39,235,230,245,
+235,101, 95,167,254,167,253,247,255,249, 30, 95,126,251,213,173,175, 86,124, 54,255,253,233, 51, 70, 45, 94,178, 24, 50, 95,111,
+ 12,234, 55, 0,167, 78,158,250,254,181,248,215,220,254,102, 27,243,183, 93,239,220,185, 19, 79, 61,245, 84,107, 0, 19,156, 53,
+251,155,205,102,244,234,213,139, 99, 89, 86,168, 86,171, 97, 50,153, 96, 50,153,112,229,202, 21, 40, 20, 10, 28, 59,118, 12, 77,
+154, 52,129,217,108,198,164, 73,147,156,201,235,184,184,184,184, 47,198,142, 29,235,183,118,237, 90, 63, 66,136, 24,192, 97, 0,
+106, 0,189, 0,252,106, 39,120, 30, 4,208,197, 17,189,109,239,191,191,121, 84,247,238,228,167,152, 24, 20,158, 61,139,207, 62,
+251,140,219,181,107,215,255,187,125,251,118,168, 66,161,120,123,238,220,185, 48,155,205, 24, 48, 96, 0,188,189,189,251,227, 9,
+135,189, 48, 80,167, 5, 96,102, 38, 74, 86,162, 36,229,247,235, 37, 25,145, 17,193,209,189,229, 65,150,117,196, 95, 88,132,223,
+125,134,227,224, 31,197,232,223, 57, 16,207,200,119,193,247,183, 37, 61, 71,244,144, 79,216,120,228,210, 31, 53, 17,111,210, 54,
+150,240,124, 1, 63,250,245,153,152, 53,253, 43, 0, 74, 0,190, 0, 76,104,217,190, 23,164, 18, 33, 12, 58, 19, 64, 91, 4, 4,
+ 95, 95, 95, 20, 43,107,221, 47, 27, 6,253, 85, 2,128,191,244,251,183,160,168,213, 85,148, 4,206,240, 39,140, 38, 51,100, 62,
+ 82, 64,108, 17, 16,180, 26, 13,250,247,239,143, 35,191,254, 84,187, 58,194,209,224, 56, 33, 24,134,129,201,100, 66,133, 80, 0,
+ 33, 77, 1,119, 53, 96,188, 24,176, 98, 14,188, 72, 0,189, 64, 8, 70,167,135,202, 84,123,172,147,175,143, 14, 12, 67, 96,162,
+ 89,168,212, 26,228, 92,207, 71,193,221, 82, 24,104, 51, 52, 21, 74, 84,104, 85, 48,178, 52,136,144, 64,167, 87, 67,163,191,137,
+ 91,133,106,148,105,117,181,210,100,237,164, 52, 70,173, 67,193,185,203,184,119,249, 38, 52,218,235,208,170, 84,224, 33,132, 72,
+ 64,192, 19, 17, 40,202, 98,245,117,197,185,246, 65,252, 7, 78,185, 3, 28,224, 30,128,123,243,230,205, 51, 0,192,220,185,115,
+ 79, 37, 37, 37,121, 91,179,110, 4,144,239, 46,225, 53,107,214, 44,141,137,137, 1, 0, 68,132,132,132, 90,125,226,130,134,236,
+ 28, 54,243,191,213, 18,224,176,248,194,195,195,135,210, 52,141,228,228,100,188,252,242,203, 24, 59,124,248, 95, 3,253,133, 11,
+ 22, 75, 80, 72, 8,239,108, 92,192,172,249,243, 43,125,254, 0, 48,123,193,130, 42,150, 1, 39,205,254, 85, 96,211,254,109, 76,
+223,134,212,212, 84, 36, 36, 36,224,192,129, 27, 63, 2,248,201, 17,157, 0,161,240,223, 70,218, 4,129, 64,128, 43, 55,114,193,
+243, 60, 46,229, 92, 3, 77,155, 65,129, 64, 40, 20,130, 16, 2,142,101, 97,208,233,113,237,247,223, 15, 57, 81,134,148, 61,211,
+127,237,229, 81,246, 26, 63, 5, 0, 39,206, 92, 64,219,136,150, 46, 77, 83, 62,144,246,239, 74,109,255,128, 69,243,183,185, 66,
+248,231,199,188, 21,189,119,155,123,214,128, 6,129,242, 46,196, 45,218,161,120,154, 20,146,103,198,129,205,222, 7, 86, 99,137,
+ 55, 40,158,246, 52, 90,166,102,129,229,234,110, 42,237,219,182,111,234,229,229,237,245,229, 55,107,140,209, 67,134,136,251,246,
+239,247,211,254, 61,191, 61,127,229,122, 14,192,241,144, 74, 36, 24,208,123, 0,118,239,220,141, 17, 35, 70,240,251,246,237,115,
+122, 40,168,174,245,239,223,191, 31, 55,110,220,160, 1,136, 79,158, 60, 73, 79,157, 58,117,124,106,106,234,107,142,232,228,229,
+229,161,117,235,214, 0, 64,229,229,229,225,252,249,243,104,217,178, 37, 34, 34, 34, 80, 94, 94,142,236,236,108,180,106,213, 10,
+161,161,161,104,217,178, 37,242,242,242,234,110, 40, 20, 21, 31, 23, 23,183,100,240,224,193, 62,167, 78,157,242, 99, 24,102,178,
+ 76, 38, 27,109, 48, 24, 86,192,178,245, 57,172, 2,192, 42, 88,182, 86,167, 81,199,244,118,145, 72, 20,159, 54, 99,198,250,167,
+ 67, 66, 72,201,156, 57,232,207,113, 88,181,115, 39, 95,168,215,191,133,191,182,101, 95,127,233,210,165,181, 12,195, 8,125,124,
+124, 16, 30, 30,238, 99, 54,155, 33, 18,137,240,119, 67, 77, 46,128, 48, 0,173,199, 68,182,120,183,121,176,247, 4,152, 13, 64,
+251, 97, 56, 19, 50, 6,207, 36,126, 7, 67,169, 10, 2, 63, 95, 40, 86,198, 99, 80,167,223, 17,116, 33, 99, 48,128, 22,181,253,
+ 64, 27,191,102,248,227,194, 47,118, 6, 7, 29, 44, 91, 40,155, 1,179, 9, 66, 78, 0,202,202,196,183,109,119,188,139,200,190,
+139, 60, 70,244,236, 82, 77, 9, 21, 2, 16, 1, 34, 41, 24,194,194,170, 7,227,149, 9, 51, 0, 64,145,244, 81, 98,173, 29,129,
+229,120, 48, 28, 5,138, 97, 64,209, 38,232, 41, 75,219, 49, 8, 4,240,102, 12,208, 24,120, 16, 17, 1,203,178,208,179, 64,177,
+174,246,141,159, 24,154,131, 81, 36, 0,167,103,192,112,106,104, 43,204, 16, 16, 17, 76,140, 25, 52, 79,131, 49,211,128,152, 3,
+ 69, 0, 34,225,160, 54,176, 40, 42,209, 67,103, 98,106, 84,146, 41,194, 86,238,195, 75,200, 95, 46, 93,179,209, 0,181, 82, 9,
+138, 8, 32, 20,242, 0, 47,132,128,184,175,234, 92,189,117,149,110,223,178,189,216, 25,179,127,109,178, 25,236,118,196, 74, 74,
+ 74, 26, 5,224,246,220,185,115,123,250,251,251, 7,168,213,234, 91, 73, 73, 73, 46, 19, 77, 76, 76,124,115,205,154, 53,104,220,
+184,177,253, 61,213,170, 85,171, 14, 60,213,161,195,208, 83, 87,174, 28,108,168,142,144,152,152, 24,109,231, 10,168,139,249, 71,
+245,233,211, 39,124, 96,143, 30, 32,190,190, 72, 74, 74,194,156, 57,115, 32, 18,137, 96, 46, 47,135,191,191, 63, 62, 76, 76,172,
+140, 11, 72,136,139,115, 40, 4, 84,247,241, 59,138, 9,168,203,163, 80, 93,251,119, 96, 29,112,216,100,202,149,202, 14, 62,190,
+190, 40, 45, 47,135,226,196, 9, 8, 41, 1, 76,102, 51,244, 6, 3, 56,142,171, 20, 92, 24, 51, 13,218,100,114,198,165,193, 1,
+160,172,110, 0,206,174,225, 27,173,247, 49, 63,121,149, 24, 0,218,202,229,197, 55,107,214, 45, 92,178, 82, 53,107, 29, 25,181,
+119,219,183,174,152,155,107, 47, 96, 23,204,254, 85,204,178, 91,254,131, 30,175,255, 3,146,136,110,150,177,162,244, 46,114,148,
+ 22,193, 95,210,255, 5,228,179, 12,188, 86,215,237,106,214,104, 52, 1, 18,153, 20,109, 34, 34,164, 55, 11,110, 55, 41, 43, 41,
+195, 43,175, 77, 80,236, 57,152,129,149,203,146,211,183,237,217, 25,211, 54,162, 45,226, 95,158,136,172, 51,199, 48, 98,248,112,
+126,223,254,253, 14,191,217, 94,235,223,191,127, 63,134, 13, 27,102, 19, 22,197,119,238,220,193,212,169, 83,197, 0,224, 76,108,
+ 65, 89, 89, 25, 6, 13, 26, 4,150,101,145,151,151,135, 99,199,142,161, 83,167, 78,240,247,247, 71,243,230,205,209,163, 71, 15,
+ 80, 20, 5,138,162,208,164, 73, 19, 71,237,180, 83,151, 46, 93,190,232,223,191,191,224,194,133, 11,126, 44,203, 22,109,221,186,
+ 85, 99, 48, 24,146, 0,216, 59, 77,223,125,254,249,231,243,247,236,217, 19, 65, 8,185,139,218, 55,230,233,153, 48,112,224,250,
+190, 66, 33, 41, 89,178, 4,188,217, 12,133, 64,192,101,233,245,147, 96,217,198,221,134,119,230,205,155, 39,164, 40, 10, 74,165,
+ 18, 55,110,220, 40,238,210,165, 75, 40,254,134, 16, 86, 99,254,109,195,252,101, 3,159,239, 30, 62,213, 79, 38,234,195,176, 92,
+185,144,103,253, 16,208, 68,112, 87,101,132,161, 84, 13,136,133, 96, 85, 90, 20,148,211, 64,112, 11, 80, 28, 45,173,203,196,123,
+ 93,163, 65,187, 0, 63, 48, 38,224,122,230,143,104, 19,245, 92,165, 2,103,166,205, 16,129, 66,133,209,178, 67,237,136,168, 94,
+144, 5,135, 99,197,250, 95,107,205,240,136,174, 4,123,206,243, 16, 73, 1,113,139,231, 64,231, 31,173,180, 2,136,196, 18,152,
+ 97,132,143,204,178, 35,233,206, 61,155,240,199,201,204, 58, 77,146, 28,199, 65, 76, 27, 96,134, 24, 20,197, 0, 70,203,192,102,
+ 54,155, 97, 50,138, 32, 16,138, 0, 35,192,115, 22, 23, 65, 75,121, 4,144, 85,243,140, 2,189,145,131, 64, 64, 96,102,204, 48,
+154, 56,104,180,150,118,104,230,120,208, 38, 14, 16, 2, 2,145, 0, 66, 41, 64, 12, 44, 56,194,128,131, 1, 90, 3, 0, 56, 30,
+ 88, 88, 0, 20, 7,240, 4,160, 40, 14,132, 8,192,241, 4, 20,101, 85,156, 56, 10, 28, 69,129,112,206, 41,200,118, 65,126,226,
+122,182, 35,111, 0, 33,115,231,206, 45, 78, 74, 74,138, 6,240,210,220,185,115,135, 39, 37, 37,233, 0,148,185,101,178,138,141,
+ 21,175, 89,179,230,219,152,152, 24,200, 27, 53,170,188, 47,111,212, 40,192,106, 5, 8,121, 20, 29,134,166,105,133,205,247,207,
+107,181,248,228,147, 79, 96, 42, 43,131, 45,242,173,141, 85, 88, 17,153, 76, 24, 53,106, 84,113, 97,113,241,120,103, 52,237, 6,
+116,201, 84,177, 0,212, 97, 33,192,233,211,167, 73, 77,194, 67, 21,161,214, 68, 67, 69, 43, 97, 52, 26, 17,224,239, 15,169, 88,
+ 2, 51,203,128,231,121,176, 44, 11,154,166, 97, 54,155,193, 49,172,179,241, 12,220,181,188, 60,170,173, 92,110,211, 8,184,107,
+121,121,212,143, 91,127,149,218, 91, 4,218,202,229,170,134, 50,223, 23,228,102, 55,152,230,239,110, 12,192,144,140, 18, 20,203,
+211, 33,110,209, 14, 36,162, 27, 90,174, 59,139, 82, 35, 7,111, 33, 1,253,223,237,184,122,227, 38, 28,237, 90,108, 96,104,156,
+206, 58,137, 47, 86,124,142,167,163, 6, 98,222,255, 91,128,223,246,254,134,159, 54,252,128,254,131, 7,198, 52,151,183,128,208,
+ 75,132,131, 71, 15, 98,227,247, 63,224,151,237, 91, 33,150, 74,249,157, 59,119,214,185, 62,196,182,109,219,170, 48,126, 27, 84,
+ 42,149,203,229,163,213,106,225,239,239,127, 2, 64, 95,185, 92,142,222,189,123, 67, 32,176,184, 89, 91,182,108, 9,137, 68, 2,
+181, 90, 13,185, 92, 14, 95, 95,223, 91, 90,173,182,101, 29,228, 46, 93,184,112, 97,233, 47,191,252, 50,178,109,219,182, 29,182,
+110,221, 90, 81, 94, 94,190, 16,192, 70,123,249,101,200,144, 33,239,175, 91,183,110, 11,128, 98, 0,177, 0,126, 7,208,189, 6,
+122,103, 87, 43, 20, 75, 3,178,179, 63,122,149, 97,240, 57,192,125, 91, 81, 49,177, 26,189,151,102,204,152,241,249,148, 41, 83,
+112,243,230, 77,236,222,189, 27, 12,195, 28, 2,240,234,147,194,212,123,244,232,129,115,231,206, 85,250,253,235,180,176, 84,187,
+110, 53, 38,178,197, 98, 63,153,168, 79,137,198,248,219,241,107, 37, 73, 16, 72,128,171, 71,241,172,156,199, 63,167,143, 66,239,
+206,114,204, 72,120, 30, 47,182,166,129,139,251,193,139,100, 12,234, 12,214, 81, 33, 71,149, 15,161, 4, 24,241,226, 63,176,241,
+203,101, 22,101, 81,111, 2,107, 0,182, 43,206,225,192, 41,203,140,194,102, 45, 34, 64, 9, 29, 51,175,145,221, 9,204, 70, 96,
+231,238,125,136, 28, 62,221,162,253, 67, 4,129, 12,136,123, 33, 22, 35, 7,143,182,116,252, 91,185, 96,140,117,111,213,204,243,
+ 60, 24, 98, 97,240, 38,218, 18,252,103, 50, 26,160,215,235, 81, 81, 81, 1,173, 70, 13,173, 86, 11,141,202,162,101,189, 0, 0,
+ 32, 0, 73, 68, 65, 84,182, 2,198,138, 10, 24, 12,134,218, 27,127, 5,129,193,200,194, 96,100,161,211,155,161,173, 48,161, 92,
+107,130, 74, 67, 67,173, 53, 67,165,178,156,149,101, 12,148,229, 12,148,106, 6,165, 74, 26,247, 74,107,207, 35,197,243, 96, 1,
+ 16,150,128, 80, 28,120,194, 3, 60, 15,158, 23,128,229,254,170, 62,206, 58,122,184,106, 27,239,216,191, 35,142,237, 57,134,223,
+ 14,253, 86, 41, 20, 92,189,117,213,213, 54, 23, 14,160,245,242,229,203,207, 3, 88,253,225,135, 31,190,215,170, 85, 43, 38, 53,
+ 53,149, 36, 39, 39,187,172,117, 77,137,141, 37,226,176,176,109, 0, 16, 22, 22,118,223,243,105,211,166, 49,217, 87,175,110,106,
+168, 88, 0,155,249,223,217,125,227,109,190,127, 0,216,188,121, 51,174, 23, 21, 1, 0,118,101,102, 86,121,118,245,234,213,208,
+144,144,144,242, 71, 49, 8, 12, 29,218,202, 54,239,186,202,125,219,181,237,185, 35,120,249,249, 94,225, 88, 22, 26,101, 57, 74,
+ 75, 75, 81,166, 42,135, 78,175,135, 78,175,135,182,162, 2, 58,181, 6, 90,149, 10, 70,131, 30,180,209, 8,142, 97, 29,142, 57,
+109,229,114,219,152,193, 1,160,237,221, 1, 0,240,227,214, 95, 49, 63,121, 85, 0,128, 48,151, 27, 98,235,200,168,234,130, 67,
+ 68,167, 33, 81,143,122, 80,190,251,138, 28, 45,215,157, 5,137,232, 6,211,225,116,220,122,163, 39,188,133, 4, 71,135,133,128,
+ 81,151, 32,114, 95, 49,132, 14,154, 95, 70, 70, 6,121,123,230, 59,184,126,245, 42,178, 50,143,194,223,215, 31,227, 94, 25,135,
+128,224, 32,156, 57,153, 13, 31,177, 20,222,222,222,104, 34,111,138, 77, 63,111,194,135, 31,127,132, 10, 55,152,184, 13,189,122,
+245,114,249, 29, 95, 95, 95,168,213,234,190, 20, 69,209,205,155, 55, 71,159, 62,125,208,185,115,103, 52,106,212, 8, 82,169, 20,
+114,185, 28,221,187,119, 71, 64, 64, 0,180, 90,109, 75, 95, 95, 95, 71, 36, 63, 61,124,248,112,198,134, 13, 27, 68,229,229,229,
+243,170, 49,235,216, 65,131, 6,125,177,110,221,186,239,194,194,194,150, 16, 66,124, 0,124, 8,160, 46, 51,217,199,139,181,218,
+ 79,223, 98, 24,246, 91,131, 97,124, 53,122, 49,175, 38,252,235,151,233,239,205, 18, 92,189,122, 21, 39, 78,156,192,186,117,235,
+ 42, 0,252,243, 73,211,236,171, 7,189,215, 22, 4, 95,125, 16,144, 8, 40,226,155, 95,166,251,105, 83,214,205,127,158,187,165,
+ 60,105, 96,201,117,148,222,132,244,151,119,177,100,128, 22,217, 11,251, 96,101,116, 5,188,183, 79, 3,148, 5,168,224,165, 23,
+173,146, 87, 45,248, 43,170,255,252,133, 95,241,175,127,109, 64, 27,191,174,248,243,248,121,236, 87, 92, 70,116,255,206, 24, 54,
+200,210,208,120,129, 16, 52,235,252, 71,142,232,217, 1,139, 63, 93,134,125, 23, 53,240,145,119,194, 11, 47,140,194,111,135,182,
+ 97,247,111,155, 44, 31,199,154, 33, 17,213, 61,206,241, 28, 11,150,179,104, 51,176,106, 51, 52, 77,195,104, 52,194, 96, 48, 64,
+167, 55,192,160,215,193,160,215, 65,111, 50,130, 54,213,190,237,115,153,193, 23,234, 10, 22, 26, 3, 7,141,129,179,252,175,229,
+ 80,161, 99, 80,161,103, 80,174,100, 81,166, 52,163,172,220,140,178, 50, 51, 74, 75,105,220, 43, 53,215, 41, 0,252,101,254,191,
+ 95, 85, 19, 10,120, 8, 8, 1, 95, 45,234,159, 39,142, 21,167, 15,226, 63, 64,199,254, 29, 43,175, 15,172, 63, 80,105, 17, 56,
+182,231, 24,174,222,186,122,211,149, 6,151,158,158,254, 95,158,231,187,196,196,196,196, 71, 68, 68,132, 0,160, 56,142,147,152,
+205,230,192,153, 51,103,250,213, 98, 10,174, 17,226,176,176,249,107,214,172, 25, 25, 19, 19,131,136,144, 16,167, 92, 87,245, 52,
+255, 71, 1, 64,100,135, 14, 14, 3,216,218, 54,110, 28,157,156,156,140, 63,111,221,210,252,178,127, 63,174, 92,185, 82,169,245,
+183,111,223, 30,214,103,244, 47,251,247,227,214,173, 91,184,154,157,109,112, 68,115,214,252,249,152,189, 96, 65,165,121,223,246,
+191,237,218,246,191, 43,177, 0, 73, 73,105,252,144, 33, 67,222,181,103,250,182,115,239,222,189,145,148,148,230,148,118,125,237,
+ 74,110, 54,195, 48,160,105, 19,148,247,138, 81,114,183, 8,165, 69,247, 80, 90,116, 15,202,226, 18,168,202,202, 96,210,233, 44,
+241, 51, 42, 21,156, 8, 2,100,230, 39,175, 18,206, 79, 94, 37, 4,160, 1,192,245,237,213,237,190, 68,118,113, 1, 78,163,105,
+235,200,168,194,220,108, 69,247, 62,127,229,161,117,207, 23,163, 84, 37, 55, 20,245,105, 31, 36,174,188,138,230,239, 14,114,148,
+ 58,228, 79,126, 10,252,205, 11, 8,253,207, 25,120,175, 61,141,187,175,200,209,123, 95, 49,136, 72, 2, 33, 1,132,148, 99, 1,
+244,194,197,139,228,147,101,139, 49, 99,246,251, 48,115, 44,174,228, 93,195,132,113,227, 33,150, 74,177, 99,251, 78,192,204,194,
+100, 52,225,104,246,113, 24, 12, 21,152, 50,105,210,225,183,223,126,187,174,186, 38, 99,198,140,137, 30, 62,124, 56, 8, 33,200,
+200,200,184,207,164,255,193, 7, 31, 56,253,157,193,193,193,184,115,231, 14, 0, 8, 83, 82, 82, 80, 82, 82,130,174, 93,187, 34,
+ 32, 32, 0, 20, 69,225,228,201,147,160, 40, 10,132, 16,220,185,115, 7,193,193,193,206,144, 93, 66,211,244, 96, 0,155,237,238,
+141, 27, 52,104, 80,242,228,201,147, 3, 83, 82, 82,164,132, 16, 10,192, 54, 88,102, 1,220,115, 64,111,206, 9,179, 57,178, 58,
+189, 87,231,254,178,229,229,241,211,200,200,119, 82,144,121,226, 18,146,147,147, 57,141, 70,243, 38, 44,179, 11,158, 56,244,232,
+209,163,242,112,202, 5, 0, 32,119,211,241,155,137, 74,157,233, 52,128, 28, 0, 77,178,174,149,124, 61,184, 67,216,199,194,155,
+ 39,130,176,110, 34, 32,241, 6, 76, 58,128,231, 97, 22, 72,239, 29,253,243,238,183,168, 99,245,165,141, 63,125, 21, 61,126, 66,
+188, 2, 0,116,156, 25,215, 85,249, 0, 88,180,241,139, 64,116,116, 55,132, 53,106,140, 50,181,198, 98, 43,160, 25,220, 85,233,
+234,252,168,102, 45,250,163, 32,223, 58,205,147, 8, 49,162,187, 37, 6, 96,223, 69, 51,126,219,149,142,123,165,119, 16, 28, 96,
+153, 73, 16, 32, 22,161, 91,100, 15, 40,182,215, 97,210,133, 16, 98,142, 1, 11, 1, 56, 66, 64,177, 28, 96,102,192,138,132, 0,
+161, 96,235,147, 28, 15,203, 90, 1,117, 96,175,226, 38,121,126,160, 47,239, 37,230, 33, 20,217, 89, 24,204, 0,195, 3, 70, 26,
+ 96, 77, 44, 8, 33, 32, 98, 2,134, 5,116, 38,224,100,150,154,244,232,209,156,175,209,228,111,227,150, 20, 7, 98, 53,255, 91,
+132, 2, 2,150,163, 64, 9,172, 51, 5, 0,240, 2, 30,224,157,179, 2,216, 51,255,154,174,143,237, 57, 22,225,108, 67,139,137,
+137,233,156,158,158,254, 57,128, 30,233,233,233,251,210,211,211,143,198,196,196, 36,182,110,221,218, 76, 8, 9, 94,185,114,229,
+254, 15, 63,252,112,194,178,101,203, 14,215, 33,124,218,180,127,225,236,217,179,231,207,158, 61, 27,251,246,237,131,238,222,253,
+125, 57, 34, 36, 4, 55,111,222, 4, 0,133, 51, 11,249,212,182,232, 79, 98, 98, 98,212,154, 53,107, 20,171, 87,175, 70,100,251,
+246,209,167, 46, 95,118,104, 42, 62,126,241, 98,230,128,255,207,222,151,199, 53,121,108,239, 63,147,141, 0, 42,130,187,104, 85,
+172,168, 85,235,130, 21, 80, 43,137,162,181, 90,187,252,106,212,234,181,245,171, 45, 65,237,117,235,130,182,182,118,209,170,189,
+ 23,181,171,196, 46, 87,187, 88, 37, 88, 91,183,186,160, 9, 42, 34,136, 86,235, 10, 8, 42,130, 11, 74,194,150, 0,217,230,247,
+ 71,242,198, 16, 3,121, 19, 80,180,125,159,207, 39, 31,222, 45,135,201,204,188,243,156,115,230,204,153,190,125,159,186,112,236,
+ 88,103, 0, 62, 0, 62, 55,250,248, 64, 88, 93,141,110,237,218, 97,193,130, 5, 72, 77, 77, 93, 25, 26, 26,154,146,154,154,186,
+191,160,160,192,141,114,119,119, 30,128,122,196, 0,212,208, 3, 83, 82, 82, 72, 92,156,236,216,209,163, 69,169,114,185, 92, 4,
+ 0,113,113,178,193, 43, 87, 42,211,192, 50, 9, 80,231,190,143,189, 83,121,253,198, 40,139,201,220, 67, 87, 90,138,210,219,183,
+ 64, 8, 15,148, 90, 80, 85, 85, 5, 74, 41, 40,165,184,116,238, 60,140,134,106,252,153,156,236,174, 14, 29,199,156,230, 0,120,
+ 99,164, 81,150, 49,210, 40, 56, 46, 11,180, 77, 17,176, 70,135,110,131, 36, 5, 57, 25, 42, 0,232,220,169, 19, 78,101, 88,245,
+228,220, 63,183, 1, 0, 90, 61, 50, 64,122, 43,255, 68,163, 13,198, 3,255, 40, 66,230,211, 64,191,176,104, 20,205, 30,140,182,
+ 95, 31, 65,182, 70,135, 64, 17, 65,177, 70, 11, 1, 33,110, 61, 0,246,119, 51, 53,181,198,147, 93,187,118,165, 99,198, 62,141,
+ 29,219,118, 32, 49, 49, 17, 31,188,251, 30,246,170,247,131, 47,224, 35,184, 67,112, 84,105,105,221, 75,151,183,110,221,170,182,
+ 41, 2,146, 81,163, 70,213,136, 5,216,183,111, 31, 46, 94,188, 88,165, 80, 40,218, 57,123,147, 92,246,151,206,157,145,151,151,
+135,199, 30,123,204, 52,111,222, 60,209,166, 77,155, 16, 16, 16,128, 11, 23, 46,220,229,121,205,203,203, 67,103,246,237,236,152,
+120,110,234, 19, 79, 60,241,209, 75, 47,189, 20,144,153,153,217,180,170,170,234,255,124,125,125,159,177, 5, 6,254,206, 82,158,
+227, 66,249,169,207,252,123,211,134,161, 35, 94, 32,159, 38, 3,164,253,179,248,100,205, 59, 84,147,115, 97, 58, 0, 37,254,198,
+168,161, 0,204, 85,227,236,103,146,234,236,185,106,251,148,102,254,103,146,146, 63,202,171, 76,186,240, 71, 91,142, 9,242,227,
+ 63,193,175,174,242, 55, 81, 94,121,113,185,225,104,218,197, 27,123, 10, 53,250,148,185,106, 92,175, 77,201,152,242,175,197,234,
+131, 71,210,164, 0, 84, 22, 62, 51,205,199,199,197,178,235,120,255,245,233,208,235,171, 81, 86,105,141, 1, 48,240,124,176,121,
+107,221,105,118, 11,242,211,200, 11,207,254,219, 74,150,102,198,114, 54, 97,116, 31,130, 73,179, 86,193,207,207, 7,205,124,197,
+ 82, 0,170,156, 51, 39,164,235,191,216, 90,231,128, 36,160, 38, 24,136, 85, 9, 0, 33, 48, 83,106, 85, 4, 76,182,229,126,132,
+ 7,129,197, 2,147, 45, 56,208,157, 18, 80, 82,217, 28,149,213,197, 16, 9,120,246, 52,103, 38, 11, 96, 52, 82, 24, 77, 20, 21,
+149, 22, 16, 62,129, 25, 4, 70,203, 29,215,189, 43,152, 45, 60,240,136, 25,196, 76, 64,121,212,238,254, 39,181, 24,207,140,164,
+179, 23, 54, 17,119,185,161,207,167,157,175,111,223,177,187, 45,250,244,233,115, 61, 36, 36,228,133,203,151, 47,119, 75, 76, 76,
+204, 0,240, 92, 82, 82,210,115,142, 15,175, 88,177, 66,189,112,225, 66,233,138, 21, 43,220, 17,132,189, 66, 98, 99, 99,107,125,
+232,197, 87, 94,177,250, 0, 61, 75, 12, 68,157,220,254, 0,128, 65, 61,123, 74, 51, 88,144,191,125, 0, 62,117,202, 30,173, 58,
+184, 79, 31, 75,124,124,252,151,227,198,141, 51,101,101,101, 9,174, 92,185,130,206, 45, 90,164,237,216,177,131, 85,128,226, 61,
+202, 3,224, 72,238, 55, 83, 82, 82, 28, 99, 60, 78, 59,212,179, 91, 37, 64,185, 98,165, 78,182, 48,238,197, 11,251, 15,164, 53,
+247,247,111, 86,166, 45,129,201,100, 2,181,189, 7,218,155, 69, 40,211,106, 65, 41, 69,255,232,104,233,159,201,110,243, 32,153,
+112, 39,230,132,103, 91, 14,200, 11, 31,240, 56,198, 72,163,236,171, 0,114, 46, 95,102,173, 4, 68,143,125, 73,146,188,243, 23,
+187,149,255,187,242, 59, 21, 0,180, 10, 25, 34,189,149,151,170, 6,128,198, 33,127,122,183, 18,128,111,208, 47,246,125,220,176,
+ 88,208,119,125, 6, 50, 70,183, 65,175, 29, 55, 33, 32, 64, 83,161,119,123,179,237,216,177,131, 76,124,105, 34, 29, 62,114, 4,
+182,109,249, 13, 31,175, 92,129,184,210, 82, 80,139, 5,155, 55,111, 65, 97, 97,225, 51, 0,118,184,147,227, 74, 17, 0,128, 23,
+ 94,120,225, 36,128,114, 54,101, 89,191,126, 61, 25, 53,106, 20, 61,113,226,132,104,192,128, 1, 24, 49, 98, 4, 84, 42, 21, 30,
+121,228, 17, 84, 87, 87, 35, 42, 42, 10,148, 82,203,137, 19, 39,120, 66,161,208,155,140,128,143, 5, 4, 4,172,158, 56,113,162,
+240,220,185,115,205,170,171,171,107, 11, 12,100,139,254,193,253, 38,108,232, 55,108, 34,249, 46, 5, 40,171, 4, 12,151,118, 91,
+ 52, 57,170,105,168, 25, 24,248,208,128,201, 3,224,104,249,187,186,230,210,149,234, 64,254,204,249,249,207, 36, 21,249, 87,110,
+ 87,164, 1,104,103,123,121,171, 1, 20, 2,200,155,171,134, 91, 23,167,226,235,157,234,161, 67,251, 72,205,180,137,202,241,229,
+168,208,149, 89,215,253,243,252,144, 91, 14,178,230,235,141,172,126,224,214,109, 95,144, 91,154, 60, 9,120,122,149, 35, 23, 54,
+105, 18, 0,179, 81, 11, 80, 29, 70,247, 97, 55,161,107, 4, 31,160,212, 74,212,224, 67, 68,109,138,128,141,252,173, 57, 0, 1,
+152,217,205, 77,164, 29,191, 74,194,122,183,163, 38,163, 6, 2,219,194, 94, 74, 41,204, 38,138, 42, 35, 80, 86,110,130, 17, 20,
+ 38,202,131, 64, 72,112,251,166,177,214,114, 30, 59,182,146, 0,192,224,200,183, 40, 49, 90,173,127, 10,128, 82, 2, 80,155,197,
+ 64,249, 32,124, 11, 44, 22, 1,178,115,182,176,250,205,175,126,252,170,244,114,238,229,186, 8, 88, 8,235, 82,141,186,216,201,
+ 94,243, 75,150, 44, 97,252,163,167,108, 86,241, 29,162,126,241, 69,201,150, 45, 91, 84, 54, 37, 64,229, 78, 9, 88,167, 84, 26,
+255, 60,125, 90,214,185, 79, 31,243, 19, 61,122,232,108,125,180,218,230, 16,177, 67, 54,122,180,213,226,232,211,199,253,116,199,
+ 91,111, 73, 1, 96, 96,247,238,119,221,203,204,202, 82,103,156,247, 94, 25,234,211,179,231,215, 60, 30,207,124,225,216, 49,255,
+ 54,109,218,220, 78, 45, 40,216,224,206,234,191, 15,172,227,216, 15,116,182,128, 63,102,106,160,194,169,173,217, 40, 1,231,100,
+ 11,227,194,183,125,251,221,150,144, 46,157, 31,171,174,174,130,217,104,130,197, 98, 65,211,192, 64,148,106, 52, 12,249,179, 81,
+162, 74, 62,124,227,223,173, 1, 24,114, 46, 95, 22, 49,243,255,233, 39,254,194, 24,105,148,101, 73,252, 23,238,146, 3,217, 49,
+107, 78, 28,189,144,117, 65,234, 72,254, 0, 48,252,169,231,164, 7,246,252,174,190,149,151,234,125, 37,214, 18,224,231,250, 58,
+123, 14, 27,248, 71, 17,240,199,235,246,243, 71,127,191, 97, 63, 46, 53,154,189, 46,239,230, 95, 54,147, 33, 67,134, 60, 61,106,
+236,232, 93,175, 77,157,113,248,241,190,125,134,110,251,125, 59,210, 78, 30,199,241,227,199,119,214,229, 6,174, 67, 17,152,177,
+117,235,214,111,183,110,221, 26,177,117,235, 86,214,133, 27, 53,106,212,240,189,123,247, 30,216,177, 99, 7, 66, 66, 66, 48,114,
+228, 72, 4, 4, 4,100,151,150,150,134,158, 61,123, 22,121,121,121, 60,161, 80,136, 81,163, 70, 69,239,221,187,215,211,159,122,
+174,180,180,116,229,246,237,219,235, 10, 12,244, 4,127, 22,158, 76, 92,254, 91,210,179,239, 84, 6, 79, 65,229,177,197,150,107,
+135,150, 77,173,135,188, 7, 78, 17, 96,237, 1,168, 13,115,213,208, 1,248,203,246,241, 10,135, 15,159, 86,199,198, 46,148, 38,
+ 40, 62, 86, 5,119,234, 6,160, 26, 66, 31, 49, 10,174,151, 97,227,142, 84,226,185,188,157,234,105,175,206,199,250,239,127, 5,
+ 44, 87, 0, 8, 96,170,170, 68,112,187, 0,233,178,183,102,176,182,230, 96,182, 64,192,179,192, 72, 4, 16, 82,211, 29, 69, 0,
+ 38,128,154,193, 54, 48,204, 17,199,207, 92, 39, 0,208, 54,136, 71,133, 2,171,181,111,178, 88, 19, 24,149,148, 83,152, 77, 0,
+ 95, 96,129,217,196,110,228, 56,146,246, 31, 2, 0,225,131, 22, 80, 48, 57,225,121,128,133, 88,221,253, 89, 57,219, 61, 42,228,
+183,239,125,171,110,128,254,197,202, 92, 97,200,223,193, 19,224,118, 57,214,177, 11, 23,146,142, 57,185, 12,235,120,214,237, 51,
+ 13,153, 58,248, 46,229,214,186,196, 47,193,106, 91,123,183,111, 72, 3,231, 1,112,174, 91,157,155,165, 86,172,250,142,114,197,
+202, 11,178,133,113,189, 1,240, 47,164,164, 24,171,244,149,176,152,205,232, 25, 22, 38,109, 23,250, 24,142,253,177,157, 93, 29,
+ 83, 50,113,207, 31, 59,237,167,131, 31, 11,177, 31,239,249, 99,231, 93,231,117,133,198,127,253,185, 85, 65, 30,241,212,243,210,
+115, 23,114,113,253,202,105, 21, 0, 28,216,243,187,170,205, 35,189,165, 55,243,207,120,220,238, 19, 38, 76,128,167,233,125,205,
+196,167,206,251,249, 47,180,197, 31,215,170,238,249,128,159,154,154,250,135, 66,161,224,101,102,102, 90,246, 31, 77, 65,139,150,
+ 45,156, 87,122,120,132,173, 91,183,126,167, 80, 40,126,144,203,229, 70, 79,190,247,230,155,111,170, 0,144,105,211,166,209,220,
+220, 92,100,100,100,160,188,188, 60,180,105,211,166,104,209,162,133,125, 47, 0, 47,200,159,193,127, 82, 82, 82,132,105,105,105,
+125, 12, 6,195, 98,212,156,203,247, 6,239,158,217,252, 47, 97, 64,215, 31, 22,148,230,238,157,210, 0,242, 26, 21,204, 42, 0,
+ 87,215,189, 82, 0,220, 14,130, 10,133, 96,237,218,181,238, 93, 85,123,142,168, 59,116, 30, 65,110, 22,164,209,214,193, 29,161,
+ 41, 55, 97,227,182,195, 94,119,208,245,223,174,182,125,183, 13, 5,110, 34,176,169, 0,203, 22,189,230,209, 75,255,205,209,156,
+123,182,129,205, 13,141,133, 0,128,216, 87, 72, 13,149, 70, 88, 0,248,249,249, 65,111,210, 19,179,201,115,121,233, 25,214, 61,
+ 3,194,159,152, 79, 45,148,143,203,151,118, 53,230,238,102,108,151, 14,114,187, 4,178,168, 31, 71,194,111,224,105, 1, 67, 92,
+156,204, 7,128,121,229, 74,165,185, 62,130,148, 43, 86, 50, 27,249,216,219, 52,247,140,103,235,244,231, 44,255,194, 43,101,204,
+121, 43, 96, 71,236,223,243,155,218,185,175,221,204,247, 46,127,128,187,141,125,156,117, 96, 19,241, 65, 37,175,238, 21,169,185,
+229, 38,132, 54, 21,220,151, 87,197,182, 86,191,193,222, 57, 79,201,191,198,248,236,253,134, 63,108,240,137,193, 96,248, 13,112,
+191, 41, 29, 75,188, 93,154,187,119, 35,106,198, 6, 60,212, 74, 0,171,193,199,219,125,132, 57,112,112, 68,183,110,221,144,147,
+147,195, 85, 4, 7, 14, 28, 56, 60, 36,224,113, 85,192,161, 33,192,145, 63, 7, 14, 28, 56,112, 10, 0, 7, 14, 28, 56,112,224,
+192,129, 83, 0, 56,112,224,192,129, 3, 7, 14,156, 2,192,129, 3, 7, 14, 28, 56,112,104,116,212, 8, 77, 61,121,242,164,215,
+ 81,155,174,130, 9, 57,121,156, 60, 78,222, 3, 35,175,206,232,112,174,254, 56,121,156,188,191,151, 60,143, 21, 0,135,129,194,
+ 83,184, 27,120, 26, 82, 30,135, 7, 19,148,107,183,135,178, 29, 88, 63,175, 80, 40,252, 1, 60,113,248,240,225,101,124, 62,127,
+176,143,143, 15,244,122,253,145,161, 67,135,190, 11, 32, 67, 46,151,235, 31,132, 10,176,101,135, 84,253,147,199, 21, 74, 41, 61,
+115,230, 12,250,244,233,195,189,147, 28, 60, 82, 0, 60, 90,135,204, 38, 81,142, 43,121,142,137, 79, 60,149,247, 15, 28,208, 89,
+225,169,167,158,146,238,217,179, 71,205, 86,102,112,112,240, 93, 55, 10, 11, 11,157, 7, 83, 40,149, 74,194,178,140,247, 76, 9,
+168, 45,159,127, 99,201, 91,181,106,213,136, 45, 91,182, 36,103,103,103, 3, 0, 66, 66, 66,158, 77, 79, 79,223,238,109,251, 58,
+246,123, 74,169,253,253, 96,174, 51,239,138,237, 58,113,163, 60,179,109, 7, 79,200,255,177, 51,103,206,108, 41, 43, 43,235,209,
+169, 83, 39,220,190,125, 27, 85, 85, 85, 0, 48,120,203,150, 45, 42,127,127,255, 11, 10,133,226,121,185, 92, 94,231, 86,146,103,
+206,156,241,200, 32, 72, 77, 77,149,202,229,114,181, 39,223, 81, 42,149, 42,153, 76, 38,245, 38, 1, 20,245, 48, 9,195,132, 9,
+ 19, 60,121, 63, 0, 0,157, 58, 89,119,192, 45, 47, 47, 71,117,181, 53, 13,186, 78,167,243,228,125,171, 19,167, 79,159,166,131,
+ 7, 15, 70,207,158, 61,225,227,227, 83, 84, 93, 93,253, 8, 55,140,254,243,224,156, 12,232,158, 37, 2,226,172,216,123,139,223,
+ 19, 70,187,125,230,249,153,187, 61,146,169, 82,221, 49,144,178,179,179,225,239,239,111, 31,132, 24,176,217,252, 67, 38,147, 81,
+165, 82,233,124, 78,106,121,198,171,186,141,138,186,179,157,171, 43,249,245, 1, 33,132, 14, 27, 54, 76,154,146,146,226, 17, 89,
+108,217,178, 37,185,117,235,214,120,249,229,151,161,213,106, 45,241,241,241,219, 86,172, 88, 49,105,225,194,133,155, 61,252,255,
+248,227,143, 63,236,231,163, 71,143,198,238,221,187,235, 60,103, 35,214,169, 47,211,176,176, 48, 0,160, 14,153,225, 60, 34,255,
+210,210,210,180,174, 93,187, 54, 3, 0,177, 88, 12, 95, 95, 95, 20, 21, 21,161,164,164, 4, 1, 1, 1, 40, 42, 42,234,177,123,
+247,238, 12,133, 66,209, 93, 46,151,223,168, 75, 94,239,222,189, 33,147,201, 16, 18,114, 39,235,223,202,149, 43,107, 60, 19, 23,
+ 23, 7, 0, 56,122,244,168,202,155,126, 83,159,236,143,107,214,172,169,237,150,125,175, 2,111,225,239,239,143,115,231,206, 65,
+ 40, 20,194, 96, 48, 96,247,238,221,200,201,201,193,162, 69,245,219,113, 54, 48, 48,144, 15, 32,250,224,193,131,187,163,162,162,
+110, 62,255,252,243,109,146,147,147,193,231,243, 91, 53,111,222,156, 15, 14,255,104,242,103,174, 57, 43, 1,127,155, 32,192,240,
+240,112,201,253,182,184, 27, 19,193, 3,151,218, 63,222, 66,171,213,218, 45,126,157, 78,135,117,235,214,217, 63, 30, 12,180, 46,
+207,199,143, 31, 79,101, 50, 25, 5, 64,157,159,241, 20, 7, 15, 30, 84,189,245,214, 91,232,210,165, 75,131,213, 95,231,206,157,
+201,219,111,191, 13, 74, 41, 82, 82, 82, 84,158,182,123,118,118, 54, 70,143, 30,109, 1, 0,145, 72,196, 11, 13, 13, 69,124,124,
+252,166, 86,173, 90,209,240,240,240, 49, 30, 88,156,247,170,139,144,176,176, 48,202,252,174,227,199,143, 51,251, 1, 48,237,194,
+218,237,175,213,106,183,136, 68,162,102, 0, 48,123,246,108, 76,153, 50, 5, 34,145, 8,190,190,190, 16,139,197, 32,132,128,207,
+231,163,180,180,180, 25,128,120,133, 66, 81,167,236,184,184, 56,132,132,132, 32, 47, 47,207,254,137,139,139,171,241,169, 15,100,
+ 50,153,212,246, 59,189, 30, 19,230,207,159,111,255, 56,142,151, 78,215, 45,108,229,117,234,212, 9,254,254,254, 88,188,120, 49,
+252,253,253,177,109,219, 54, 84, 86, 86, 54, 8,249,219,222,101,170,213,106,255,111,234,212,169,232,214,173, 91,155,221,187,119,
+227,230,205,155,184,122,245, 42, 74, 74, 74, 12,247,115,108, 82, 40, 20,146,130,130, 2,170, 80, 40, 36,174,238,229,228,228,208,
+139, 23, 47,114, 9,232,238, 3,249,199,196,173, 64, 76,220,138, 90, 21,131,251,162, 0, 16, 23,168,235,186, 55, 72, 79, 79, 87,
+ 53,132, 18, 48,101,202,148,135, 70, 9,168, 47,244,122,253, 93, 86,191, 55,205,203,144,201,248,241,227,237, 86,126, 82, 82, 18,
+234, 75,252,142,214,191, 82,169, 36,195,134, 13,147, 42,149,202, 26, 30,129,250, 32, 49, 49,145, 0, 32, 81, 81, 81, 82,103, 79,
+ 3,203, 65,215,100,243, 6,160,117,235,214, 88,186,116,105,213, 27,111,188, 97,200,203,203,219,185, 98,197,138,145,141,221,190,
+ 14,123, 0, 16,199,118,242,176, 93,158,200,201,201,233, 1, 0, 51,102,204, 64,105,105, 41,174, 93,187, 6,161, 80, 8,129, 64,
+ 0,129, 64, 0,161, 80, 8, 95, 95, 95, 84, 86, 86, 34, 57, 57,121, 50,128, 64,119, 66,243,242,242,160, 84, 42,237, 31, 71, 79,
+192,202,149, 43,145,156,156,236,245,239, 86, 42,149,106,219, 20,128,170,129,222,229,218, 18,119,179, 30, 63, 47, 95,190,140,157,
+ 59,119, 98,233,210,165,232,212,169, 19, 90,182,108,137,148,148, 20, 44, 90,180, 8,254,254,254, 0, 0, 62,191, 94,134,122,187,
+233,211,167, 79,252,207,127,254,131,244,244,116, 92,187,118, 13, 38,147,233,229, 22, 45, 90, 4, 2, 48,222,239,190, 23, 28, 28,
+140,152,152, 24, 85,110,110, 46,117, 36,255,152,152, 24,213,163,143, 62, 10,179,217, 12, 14,247, 22,142,196,239,120,220, 24, 30,
+ 0,234,226, 83,215,245, 70, 83, 2,198,140, 25,211, 16, 74, 0,245,224,195, 26, 47,190,190,167,193, 26, 36, 59, 59, 27, 58,157,
+174, 86, 55,255,145, 35, 71, 26, 66, 49,168, 55, 14, 30, 60,168,178, 41, 22, 72, 73, 73, 81, 19, 66,208,186,117,107, 85, 67,118,
+ 78,198,253,111,243, 4,212,137, 85,171, 86,141, 25, 50,100, 8, 5,128,248,248,120,209,247,223,127,143,151, 95,126,153,113,205,
+139,255,250,235, 47,145,237,222,222,240,240,240,231,216,252,255,209,163, 71,227,233,167,159,182,187,247,153, 99,230,156, 57,102,
+233,254, 7, 0,216,172,127, 87,237, 64,156,238,215,137,221,187,119, 47,107,217,178, 37, 0,224,226,197,139,200,207,207,199,137,
+ 19, 39, 96, 48, 24, 64, 8,129, 64, 32, 0, 33, 4,102,179, 25,122,189, 30, 91,183,110, 5,128,190,158,120,142,100, 50,153, 75,
+229, 37, 47, 47,175, 94, 74,128,195,111,175,151, 55, 0, 13, 48, 85,106, 52, 26, 49, 96,192, 0,168,213,106, 92,190,124, 25, 3,
+ 7, 14,180,223, 83,171,213, 8, 10, 10,178, 43, 2, 94,160,253,244,233,211, 11,190,251,238, 59, 68, 71, 91, 55, 50,106,223,190,
+ 61,204,102,243,143, 0, 74,238, 55,241,200,229,114, 53,163,124,134,132,132,224,216,177, 99,148, 33,127, 70,249,235,222,189, 59,
+155,241, 97, 16,128, 31, 96,221,243,172, 46,140, 5, 16, 3,160, 21, 71,251,247,185, 99,179, 98,195,251, 24, 4,104, 83, 2,164,
+233,233,233,106,111,101,116,238,220, 25, 83,166, 76,193,207, 63,255,236,109, 76, 0, 1, 64,127,254,249,103,151, 55,119,237,218,
+ 5,219, 61,143,101, 31,189,244, 24, 34,186,156, 67, 97,230,226,122,213,147,227,156,127,114,114, 50,162,163,163, 17, 19, 19, 99,
+ 39,255,142, 29, 59, 54,132,210, 87, 47, 69, 32, 42, 42, 74,114,240,224, 65,220,190,125, 91,202, 92,147, 72, 36, 82,165, 82,169,
+138,138,138,146,120, 58,111,239,230,127, 73,217, 40, 0, 91,182,108,217,201,204,253,235,116, 58,172, 92,185, 18, 21, 21, 21, 16,
+ 10,133,240,241,241,193,165, 75,151,176,116,233, 82,104,181, 90,196,199,199,255,182, 98,197,138,225, 11, 23, 46, 84,185, 33,217,
+ 26,202,128,187,152, 0, 22,117, 14, 55, 59, 0,218,167, 3,220,253,222,160,160,160,193,213,213,213, 48,153, 76, 56,114,228, 8,
+248,124, 62, 12, 6, 3, 42, 43, 43, 97,177, 88,236,239,177,209,104, 68,117,117, 53,243, 78,247,118, 39,183, 54, 55,127, 92, 92,
+156, 61, 30, 32, 36, 36, 4, 69, 69, 69,245, 86, 68, 29, 86, 5,176,237,139, 26, 0, 65,174,110,172, 94,189,218,171, 66,196,199,
+199,227,173,183,222, 66,255,254,253,237, 30, 16, 38,125,118,255,254,253,145,149,149,133,214,173, 91,123, 35,186,211,244,233,211,
+ 47,127,247,221,119,142,227,103,240,181,107,215,174, 53, 38,177, 12, 28, 56,144, 48,164, 63,112,224, 64, 12, 28, 56, 80, 5, 0,
+ 89, 89, 89,232,209,163, 7,219,118, 56, 9,192, 23,192, 38, 0,147,224,180, 37,184, 13,175, 3,248,194,118,252, 46,128, 30,128,
+251, 45,234,255,206, 96,118, 3, 92,183,114,161,221,242, 95,183,114,161,253,222,125, 87, 0,238, 55, 30, 20, 37, 96,202,148, 41,
+244,221,119,223,189,203, 21,232, 13,249, 55,164,245, 15,192,165,245,207, 88,253, 66,161, 16, 55,110,220,104, 84,242,119,180,254,
+ 29, 3,186, 84, 42,149,163, 23,224,190, 7,108,102,103,103,227,229,151, 95,214, 3,240,243,247,247,199,123,239,189, 7,161, 80,
+104,191, 63,109,218, 52, 0, 64, 96, 96, 32,198,141, 27,135,195,135, 15, 31,184,143,229, 36,142, 30,128,186,148,128,176,176, 48,
+231,173, 98, 93, 42, 3, 6,131, 1, 26,141, 6, 85, 85, 85, 8, 8, 8,128,143,143, 15, 76, 38, 19, 40,165, 48,155,205, 48, 24,
+ 12, 48, 26,141, 48,155,205,142, 10,253,237,186, 10,153,151,151, 87, 35, 0,144,153, 14,112,244, 8, 56,222,175, 47,188, 8, 8,
+ 20,215,118,195, 49, 38,192, 19,101, 96,233,210,165, 24, 59,118, 44, 58,119,238, 12, 63, 63, 63, 72, 36, 18,104, 52, 26,248,251,
+251, 67,171,213, 98,253,250,245,224,241, 60,118,200,118,152, 62,125,250,229,121,243,230, 97,219,182,109,120,238,185,231, 0,160,
+ 45,128,155, 15,194, 56, 44,151,203,213, 1, 1, 1,210,137, 19, 39,170, 0, 96,243,230,205,210, 73,147, 38,121,210, 22, 6, 0,
+ 83, 0,252, 92,135, 18,224, 56,213,246, 8,128, 62, 0, 50, 56,219, 30, 53,136,191, 54,252, 45, 51, 1,214,151,252, 25,120,107,
+165, 59, 14,200,203,150, 45,171, 55,249, 51, 24,208,191, 31,246, 31, 80, 97,227, 1, 63,187, 82,112,244,210, 99,245,250,141, 97,
+ 97, 97,200,203,203, 67, 82, 82, 18, 58,118,236,136, 13, 27, 54,120,108,117, 41, 20, 9, 18, 7, 15, 78,131,144, 63, 51, 31, 95,
+ 84, 84, 36,117,190, 55,108,216, 48,105, 82, 82, 82,131,197, 2, 0, 86,247, 63, 91,239,147, 86,171, 61, 15,235,188,176,101,243,
+230,205, 88,191,126, 61, 0, 96,211,166, 77,208,106,181,204, 99,166,172,172, 44,180,106,213, 56, 94, 73,167,104,255,187,148, 51,
+182,251,196,231,229,229, 29, 49,155,205,208,106,181,184,125,251, 54,180, 90, 45,244,122, 61,244,122, 61, 42, 42, 42, 80, 86, 86,
+134,210,210, 82, 84, 86, 86,162,186,186,154,153,219, 77,171, 75,166, 51,185,187, 10, 36,117, 94, 21,192, 22, 54, 87, 63,117,113,
+205, 19,248, 53,116,123,108,216,176, 1, 18,137, 4,126,126,126, 56,119,238, 28,212,106, 53,252,253,253,241,254,251,239,227,240,
+225,195, 88,180,104,145,167, 10, 64,219,233,211,167, 95,157, 52,105, 18,126,253,245, 87,134,252,219, 63, 40,228,111, 29, 23, 20,
+ 18,134,252, 1, 96,226,196,137,170, 11, 23, 46,120, 58,181,202, 40, 1,176, 41, 1,206,211, 1, 23, 29,142,243, 1,156,230,104,
+255, 14,156,131, 0, 27, 69, 1,184, 31, 65,128, 13, 77,254, 54,226,110, 8,203,141, 44, 91,182,172, 94,228,255,226,235,123, 48,
+160,255, 29,215,205,150, 95,183,218, 61, 2,251, 15,168,188, 82, 2,228,114, 57,108, 75,195,160,215,235,177,111,223, 62, 44, 93,
+106, 93, 81,112,250,244,105,152, 76, 38, 15,100,197,170, 1,107,224, 31,165,148, 9, 6,172, 23,249, 51,214,127, 93,110,254,134,
+138, 5, 96, 20, 9,137, 68, 34,117,247,108, 72, 72,200,168,248,248,248,176,244,244,116,193, 15, 63,252,192,187,112,225, 2,166,
+ 77,155,102, 98,234, 49, 62, 62, 30,233,233,233,248,225,135, 31, 4, 87,174, 92, 65,120,120,184, 91,153,247, 34, 6,128,177,164,
+157,148, 0,202, 40,125,108, 17, 26, 26,154,105, 50,153, 96, 48, 24,112,235,214, 45,220,184,113, 3, 55,111,222,196,205,155, 55,
+113,235,214, 45,104, 52, 26,232,245,122, 84, 87, 87,163,180,180,148,249,159, 5,117,201,100, 2,253, 28,149,208, 58,202,238, 17,
+249, 51, 57, 0,156,175,213,167,127,184, 88, 13, 96, 87,242,216,202,200,201,201, 65, 86, 86, 22,244,122, 61, 34, 35, 35,209,183,
+111, 95,108,216,176, 1,239,188,243, 14, 68, 34, 17,248,124, 62, 4, 2,214, 14,217, 14,211,167, 79,191, 62,105,210, 36,100,100,
+100,224,131, 15, 62, 96,172,223,235,120, 64,150, 49,103,102,102, 82,102,206,255,196,137, 19, 88,183,110,157, 20, 0,186,119,239,
+ 14,199,192,192,122, 42, 1,115, 97,157,255, 31, 15, 96, 22,128,112,252,195,221,255,192,157, 72,127, 87, 65,128,206,171, 0,238,
+215, 20, 0,245,240,250,223,133,252,237, 74, 64, 61,166, 18,106,144,191,171,243,253, 7, 60, 31,223, 28, 7, 93, 63, 63, 63,244,
+236,217,179,198,253,244,244,116,143,228,141, 31, 63, 30, 73, 73, 73, 96, 20, 1, 0,212,118,205,227,117,231, 27, 54,108, 80, 1,
+192,238,221,187,165,174, 34,214, 83, 82, 82,212,151, 47, 95,118,105, 61,186, 66,109, 73,127, 24, 69, 35, 37, 37, 5, 81, 81, 81,
+ 82,149, 74,229,182,239,164,167,167,239, 91,190,124,249,136,212,212,212,253,161,161,161,200,206,206,134, 86,171, 21, 4, 6, 6,
+ 98,250,244,233,208,104, 52, 87, 82, 83, 83, 59,133,134,134, 34, 53, 53,149,196,198,198,186, 83,142,239,154,243,175, 71, 12, 64,
+141,119,139,201,151, 96,203,157, 96,247,204, 56,204,255,187,109,143,136,136,136,119,212,106,245, 28,179,217,140,178,178, 50, 24,
+141, 70,251,188,127, 85, 85, 21, 40,165,160,148, 34, 43, 43, 11, 6,131, 1,209,209,209, 47,201,229,114,147,171,164, 35,181, 33,
+ 58, 58, 26,209,209,209, 53,130,254, 60,157, 2,112, 36,122,155,203,159, 58,246, 15,219,170,128,134, 30,215, 88,143,159,204, 82,
+191, 55,222,120, 3,106,181, 26, 82,169, 20, 57, 57, 57,104,210,164, 9,242,243,243,193,231,243,217,122, 0,200,244,233,211,175,
+ 78,157, 58, 21,135, 14, 29,194,251,239,191, 15, 0,193, 0,174,225, 78,254,135, 70,183,252,153,241, 37, 47, 47, 15, 97, 97, 97,
+ 76, 63,147,198,196,196,168, 66, 66, 66,144,149,149, 69, 89, 6, 2, 58, 42, 1,147,108, 10,192, 38, 0, 71, 0,200, 1, 72, 0,
+220, 0,135,134,235,192, 13,157,141,207, 85,192,207,202,149, 43,107,189,222,152,228,111, 91, 1,112, 47,180,104,175,101, 94, 45,
+112,223,191,125,125, 61,243, 90,186, 11, 18,243, 20,209,209,209,210,164,164, 36,245,132, 9, 19,104, 98, 98, 98, 13, 69,192, 73,
+225, 99, 93, 15,177,177,177,110, 53, 27, 15, 19, 3, 81, 39, 69,194, 58, 42, 73,165,172,200,223, 97, 48,183,207,235,135,135,135,
+255, 43, 62, 62,254,199,113,227,198, 33, 43, 43, 11, 87,174, 92,233,180,120,241, 98,105,108,108, 44, 43,121,247, 40, 15, 64,141,
+122,174,133,248, 88,101, 12,148,203,229,186,132,132,132, 37,187,118,237,250,208,100, 50,161,164,164,196, 30, 3, 0, 0,183,110,
+221, 66, 73, 73, 9, 40,165,140,213,238, 17,203, 50,243,255, 97, 97, 97,246, 8,118,230, 58, 91, 37,192,133,149,127,215, 52,212,
+ 61, 32,127,143,193, 40, 1, 11, 23, 46, 68, 74, 74, 10,198,141, 27,135,229,203,151,227,205, 55,223,132, 64, 32,128, 88, 44,118,
+ 59,134, 80, 74, 45, 51,102,204,192,143, 63,254,136,239,191,255, 30, 0, 58,218,200,191,193, 13,170,250,160,176,176, 16, 59,119,
+238,172,145,197,209,118, 44, 29, 62,124,184,202,203, 37,143,102,155, 18,176,195,102,253, 71,112,228, 95, 59, 92, 5, 1,178, 82,
+ 0, 60, 73,196,225, 45, 97, 55, 52, 26,130,252,235, 75,212,247, 2,115,231,206,149, 94,184,112,161, 65,101,218, 92,164, 13,186,
+148,142, 33, 60,219,218,122,198, 43, 64, 9, 33,176, 88, 44,216,178,101, 11,107, 37,224,173,183,222, 98,202,121, 87, 12, 0,143,
+199,131,197, 98,193,219,111,191,173, 98, 75,158,117,201, 75, 73, 73, 81, 59,102, 69,244,162,223,253,180,124,249,242, 91,169,169,
+169,187,217, 90,253,247,193,219, 70,156,189, 61,181, 40,124,172,148,128,216,216,216,143, 20, 10, 69,210,207, 63,255,124, 86, 36,
+ 18,129, 89, 21, 96,177, 88,208,188,121,115,104,181, 90,200,100, 50, 68, 71, 71,251,201,229,114,183, 11,188,153,241,197, 49,248,
+239,248,241,227,136,142,142,174, 49,158,184, 27,135,226,226,226,104, 94, 94,158,212,217,197,239,109, 26, 96, 71,184, 8,240, 51,
+ 1, 48,173, 94,189, 90,108,179, 70,121, 14, 31,143,148, 0,199,196, 63,179,102,205,178, 31,151,149,149,185, 29,155, 8, 33,100,
+250,244,233,244,135, 31,126,120, 30,192,239, 15, 34,241,216,136,158,120,122,143,141,210,238,132,235, 15,195, 24,126,191,193,172,
+ 2,112, 69,252,172, 86, 1, 52, 52,169,215, 38,239, 65, 81, 30, 30,228,142,243,217,103,159,169, 27, 90,166,211, 26,233,123, 6,
+ 39,247, 63,219,151,154,109, 46,116,226,193,239,189,167,191,117,209,162, 69,123,234, 83,159,163, 71,143,174,177, 44,246,233,167,
+159,174,225, 25,240,112,238,159,120,232,237, 97, 85,110,185, 92,126, 78,161, 80, 52,217,187,119,239, 39,249,249,249,115, 42, 43,
+ 43, 97, 54,155,209,175, 95, 63, 12, 28, 56, 48, 62, 58, 58, 58,142, 13,249, 3,192,209,163, 71,237,199, 81, 81, 81, 53,174, 59,
+159,187, 25, 87,136,163, 66,203, 40, 19,182, 56, 0,175,218,125,194,132, 9,181,221, 18, 56,140,151,162,123, 53,174,184,241, 84,
+ 88, 0,224,251,239,191,231, 54, 76,225,192, 90, 9,168,141,252,107, 83, 0, 26,186,115,113,157,149, 3,241, 80,179,255,199,213,
+141, 35,225,223,131,105,129, 6,121, 7,229,114,185, 14, 86,215,235, 92,230,218,249,243,231,217, 16,151, 29,189,123,247,110,240,
+241,192,149, 66,235,173,203,255, 94, 43,139, 28, 56,254,184,159, 74,128,219,202,245,118, 31, 97, 14, 28, 56,112,224,192,129,195,
+195, 11, 30, 87, 5, 28, 56,112,224,192,129, 3,167, 0,112,224,192,129, 3, 7, 14, 28, 56, 5,128, 3, 7, 14, 28, 56, 60,132,
+ 48,193,131,237,138, 57,255,124,202,173, 0, 0, 32, 0, 73, 68, 65, 84,252, 51, 33,224,170,128, 3, 7, 14, 28,184,177,157,195,
+ 63,188,147,156, 60,121,210,235,136, 75, 87,193,132,110,228,213,185,254,216, 11,121, 13, 93, 62, 78, 30, 39,239, 31, 45,239,207,
+119,174,120, 61,176,244,255,164, 19,238,181,188,227,139,188,151, 23,182,252,110,121, 76,253, 41, 20, 10,137,209,104,196,165, 75,
+151, 84, 6,131, 1, 2,129, 0, 5, 5, 5,120, 41,160, 51,246,100,102,162,242,241,142,136,136,136,144,242,249,124,102, 93,123,
+163,181,175, 66,161,120, 12, 64,235,179,103,207,238,108,223,190, 61, 79,163,209,136,219,183,111,191,212,215,215,119,173, 92, 46,
+191, 6, 0, 9, 9, 9,188,132,132, 4,115,109,242, 18, 18, 18,154,218,188, 5,250,216,216, 88, 10, 0,139,255,253,228, 55,242,
+ 39,243,167,111,204, 12,189, 36,104, 61, 42,162, 73,211,102, 21, 0, 40,165, 84, 0, 32, 48, 33, 33,225, 42,247,190, 61,216,242,
+238,181,150,200,118,211, 23, 79, 83,224,122,156, 50,119,101,228, 83, 18, 65, 80,128, 42, 55,251,162,244, 81,159, 38, 88,112,230,
+160,250, 65,210,178,234,200, 71,206, 45,113,105,100,140, 29, 59, 86,178,107,215, 46, 85,252, 59,214,243,223, 14, 61,137,131, 7,
+ 15,178,106,151,127, 77,123, 69,194, 35, 68,149,117,225, 2,180, 90, 45, 58,117,234,132, 38, 77,155, 98,107,210, 22,214,237, 58,
+126,252,248, 26, 47,110, 82, 82, 82,157,123, 41,216,178, 43,122,213,111,152,141,154, 40,165,245,235,119, 50, 77,205, 87, 85, 25,
+228,189,172,176,213, 64,200, 43,214,227,188,245,192,241, 5,245,111,212,241,183,107,150, 47,169, 37,171,175, 41, 20, 10,170,211,
+233,164, 91,183,110, 85,229,229,229, 65, 38,108,129,182, 29, 91,161, 74, 87, 9, 95,189, 9, 67,222,124, 13,195,198, 77,196,142,
+239, 18,176,125,255,126,213,168, 81,163,164, 15, 64, 23,206, 54,155,205,237,242,242,242, 44,125,251,246, 21,133,134,134,226,196,
+137, 19,239, 84, 85, 85,141, 85, 40, 20,209,114,185, 92, 19, 27, 27,107,169,107, 73, 88,108,108,108,185,227,249, 87, 95,125,197,
+219,253, 83, 92,183, 14, 51,250,227,237, 65,189, 90, 29,221,251,223,196, 45,167, 37, 39,187,245, 30,190,156, 16,162,145,203,229,
+ 5,253,250,245,179,216,148, 6,206,211,240, 15,115, 19,121,170,105,176,202, 54,230, 13,249,127, 29,245,172, 36,178, 85, 7, 21,
+ 1, 69, 78, 69, 9,218,181,239,172, 50, 90,204, 88,212,103, 48,138, 58,181,146,126,183,227,119, 86,138, 64,204, 36,208, 30, 93,
+153, 51, 62,182,238,181,224,208, 49,138,152, 73, 64,143,174,192,130,101,245, 35,110,102,131,146,250,102, 39,115,165, 76, 52,148,
+220,250,128, 82, 74,177,132,128,124, 84,231, 51,192, 18,130, 9,231,101, 15,204, 90,235, 59,228, 79,109,228, 63, 12,135, 15, 31,
+102,245,221,180,163, 47, 82,147,177, 7,148,202,235, 72, 79,179, 38,172,201,190,144, 5, 0,216,185,147,208,172,139,227,165, 11,
+230,178,107,151,145, 35, 71, 90,246,237,219,199, 75, 74, 74,194,129, 3, 7,106, 36,195,113,134,151, 41, 84,237,205,228,162, 35,
+ 83,234,133, 66,193,164, 11,175,119,206,130,144, 87,236, 27,237,172, 94,189,186, 97, 20, 0,135,122,178,237, 78,200, 10,185,185,
+185, 80, 39, 38,170, 62,138,158,128,126, 83,102, 65,212, 38, 16, 16,216,146,253, 89, 40, 96, 17,194, 82, 77, 49,230,149, 24,228,
+127,190, 2, 71,142, 28, 81, 41, 20,138, 26,233,110, 27, 1,102, 30,143,215,186,101,203,150, 80,171,213,130,190,125,251, 98,208,
+160, 65,188, 27, 55,110,244, 63,117,234,212, 25,133, 66, 49, 64, 46,151,223,176,145, 53,143,101,221, 53, 25, 49,124,100,200,242,
+ 85,219,120,113,211, 78, 55,139, 24, 61, 83, 26, 17,158,252,228,155, 95, 20, 60, 19,250,196,203, 97, 0,202, 97,141, 49,224,213,
+198, 15,142,137,173,220,245,163,122, 43,164, 28,156, 61, 9,238,188, 5,246, 99, 79,130, 0, 41,211,184,253, 94,238, 3,133, 66,
+193,243,128, 8,157, 55,169,160, 97, 97, 97, 8, 11, 11,243, 58, 79,188, 98,114,140,100,114,255, 72, 85,247,118,193,232,218, 46,
+ 24,143,183,106,143, 96,223, 38, 16, 91,128, 46, 62, 77, 16,144,115, 77, 53,253,153,231, 36,108,100,245,232, 10, 92,200,229,225,
+252, 69, 63,156,201,109,134,231, 71,250, 99,213,187,124,244,232, 74, 26,204, 72,175, 47, 73, 51,219,156,134,132,132,168, 50, 51,
+ 51,145,153,153,137, 15,127, 58,133, 71,199,196,169, 0, 80, 15,183, 60,165,108, 63, 50,153,204,253, 91,188,196, 90, 71, 97, 97,
+ 97,144,201,100, 46, 63,204, 51,158, 98, 92,223, 15, 36,142,229, 25,219,103,137,164, 33,218, 99,236,216,177,146,157, 59,119,170,
+ 8, 33,120,227, 19,130,223, 14, 13,195,161, 67,135, 88,125, 55, 49,113,138, 36, 34, 60, 22, 67,135, 94,199,231,159,127, 94,227,
+222,228,201,192,152, 49,192,252, 57, 73,170, 85,159,177,107, 19,134,252,213,106, 53,120, 60, 30, 38, 78,156, 8, 62,159, 95, 31,
+178,191,203,242,119, 53, 32, 19,226, 29,249, 55, 24,194, 86, 1, 0,214,172, 89,131, 53,107,214, 88,175, 13,136,111,180,226, 28,
+ 56,112, 0, 95,189, 16,131,129,207,201, 32,104, 17, 4, 34,228,131, 39,228,131, 47, 22,129,231, 43, 6, 64, 65,205, 38, 80,131,
+ 1,175,189, 50, 11,101,251, 51,145,155,155,171, 82, 40, 20, 18, 52, 30, 72,102,102,102,100,199,142, 29, 69, 22,139, 5, 41, 41,
+ 41,216,182,109, 27, 2, 2, 2, 16, 25, 25,217,110,243,230,205, 31,219,158, 99, 21, 16,168, 80, 40,248,135,247,255,242,191, 71,
+252, 10,218,232,202,249,152,188,164, 2, 95,254,247, 51,160,105,111,193,127,227, 90,119,201, 61,241,243,100, 7,238,224,213,162,
+ 24, 18, 7, 82, 39,214,203,196,126,236,120,253, 30,237,133,193,161,129, 61, 0,246, 86,218,184,251,231,146,174,143,118,109, 46,
+255,232, 53,139,135,236, 72,194,194,194, 40,147,150,212, 33, 61, 41,245, 52,109,167,226,133, 87, 36, 79,117,124, 84, 37,170, 50,
+193,247,191,111,193,164, 55, 64,252,198, 50, 4,136,196,168, 18, 86, 66, 87, 85, 9, 95, 16, 84, 95, 45, 82,125,250,233,167,210,
+183,223,126,187, 78,242,189,144, 11,172,219,100, 1,160,183,125,128, 39,159,224,225,133, 81,164,198,123, 19, 51, 9, 88,183,201,
+ 43,242,150, 42,149, 74,234,173,181,206, 88,253,153,153,153,119,234,224,176, 17,149, 6, 29, 0, 96, 68,220, 62, 40, 87,142,244,
+200,203,144,187, 34, 23, 66,146,115,167, 35,144, 66,144,150, 61, 28,206,139,208,234,255, 94, 96,215,176, 31,217,243,205,147,218,
+210,206, 18,155,210,119,252, 56,187,118,150, 63,251,165,100,221,182,127,171,182,159,250, 0,203,231,253,134,112, 73, 40, 54,126,
+125, 8,223,238,181,110, 16, 52,243, 95, 31, 72,215,254,244,129, 87, 74, 85,252, 59,160,192, 78, 40,127, 56, 11, 74, 41,154,182,
+126, 28,135, 14, 29,130,109,223,130, 58,203,183,234, 51,153, 68, 38,107,161, 2,190, 2,240, 27,210,211,129,240,240, 59,247, 63,
+254,248,206,241,252, 57, 73, 42, 95,191,197,210,153,175, 45,173,179,156, 12,249, 71, 69, 69,193, 98,177,224,203, 47,191,108, 80,
+ 7, 13, 0, 88, 44,150,187,201,159,214,253,254,242, 38,104,107,188,252,204, 16,110,145,185,120,206,238,231,179, 30,244,237,123,
+247, 28, 59,111,162,182,134,154,111,177, 76,195,188,121,243,236,247,231,205,155,135, 53,107,214,128,215,109,198,157,255,106,123,
+222,149, 60,193, 68,215,229,115,222,201, 90, 48,145, 93,249,170,170,170,208,182, 83,103,192, 98, 0,207, 7, 32, 2, 62, 76,229,
+165,168,202,187,132, 91, 5,133,232, 48, 88, 2, 34,106, 14, 98, 52, 0,124, 30, 86,206,124, 19, 35,215,125,128, 5, 11, 22, 52,
+244,184,204,138, 21, 21, 10, 5,161,148, 54,175,172,172, 28, 28, 20, 20,132,172,172, 44, 88, 44, 22, 92,186,116, 9,235,215,175,
+ 71,207,158, 61, 17, 28, 28,252, 50,128,215,156,200,186, 86,111, 0,165,180,101, 39, 94,186,164,221, 35,163, 69, 37, 41,167, 81,
+170,245,193,143, 59, 76,216,117,244, 39,204,145,249, 10, 4,122, 75,152, 45,166,192,165, 2,192, 17,122,227,163,182,233, 30, 87,
+158, 1, 30,139,142,200,204, 27, 66,178,104, 24,214,165, 40,154,231, 94,204,197,201, 31, 78, 67,161, 80,120,100, 61, 48,228,160,
+215,255, 12,189,126, 35, 52,154,104,198, 58,246,232, 7, 14,242,105,166,106, 93,101,134,120,201, 44,152,111,107, 96,186,120, 25,
+ 2,145, 16,126,132, 15,127,194,135, 63, 95,128, 32,161, 24,180, 92,135,235, 7,142,184,221,233,197, 21,169, 31, 58,102,177,191,
+135,171,222, 37,136, 95, 76,108, 30, 1,239,172,127, 27, 57,171,224, 69, 10, 92,103,242,135,128,143,188,235, 21,184, 94,108, 64,
+250, 57,235, 6, 34,221,166,109,135, 39,251,158, 11, 73, 14, 4,164, 16, 62,188, 83,214,191,173, 9, 2, 39, 95, 67,192,164, 51,
+240,121,126, 9, 16,236,239,153, 39,151,197,206,109,158,108,241,170,216,246,186, 42, 34,232, 93, 28, 63,120, 9,255,111,252, 56,
+ 4,183,236,142, 89,255,126, 21, 95, 44,222,139,136,192,197, 88,251,211,135, 94,239,224, 67, 8, 16,187,224,140,221, 98, 25, 58,
+116,168,141,144, 44,110, 27,120,202, 36,161, 10, 56, 0,224, 55,148,220,108,130,110,143, 52,193, 55,223, 88, 45,255, 37, 75,128,
+144, 16,171,136,146,155, 77, 80,114,179, 9,250,245, 57,175,114, 71,254, 7, 14, 28,128,197, 98,177,147,244,230,205,155, 97, 54,
+155, 61,114, 95,215,225,225,185,139,252,173,239,179,123,229,157, 2,100,173, 66, 33,101, 44, 53, 11,165,176, 88,238,238,190,204,
+117, 11,165, 88,155,144, 32, 77,176,126,199,229,255,164, 0,161, 20, 36, 33, 65, 33,165,148,226,179,207, 62,179,223,103,142, 19,
+ 18, 18,164,148, 90,159,163, 0,169, 77, 94,130, 66, 1,219, 61, 98, 54,155, 97, 50,155, 97, 50,221, 93,103,204,117,147,217,140,
+175,215,174,149,174, 77, 72,168,165,124, 20,130,166, 77, 1, 33, 31,102,125, 5,206,110, 73,194,251,175,202,209,225,117, 57,250,
+175,248, 8,151,254, 60, 1,190,175, 24,198,226,155, 56,125, 84,141,237,135,246,160,244,198, 13,156, 57,115,166,193, 54,214,138,
+140,140,100,229, 77, 80, 40, 20, 1,148,210, 65,153,153,153,191,191,247,222,123,189,206,158, 61, 43, 50, 24, 12,224,243,249,104,
+218,180, 41, 76, 38, 19, 50, 50, 50, 64, 8, 17,185, 27,235, 19, 18, 18,252, 21, 10,133,111, 66, 66, 66,112, 73, 65,234,159, 31,
+254, 47, 63,232,175, 67, 59,160,209,241, 32, 18,240,208, 33, 80,140,210,219, 34,200, 63, 53,225,244,237,254,254,238,120,195, 22,
+107, 66, 29,251,162, 77, 49,184,235, 58, 71,215,247, 7, 12,249, 59, 43, 7, 60,119, 90, 40,179,223,119, 13, 55,231,232, 41,158,
+123,251,108,238,126,189,126, 35, 0,130,170,170,239, 33, 62,118, 25,250, 61,143,214,184,239, 14,111, 15,136,146, 4,104,202, 97,
+ 17, 9, 96, 56,126, 22,213,231,243, 80,181,247, 16, 80, 89, 13, 17,165,240, 3, 31, 2, 16, 84, 91, 76,208, 84, 87,225,235,125,
+ 59,220,202, 92,245,174,213,186,119,132,245,156, 49, 87, 40,178, 46, 82, 44, 88,230,125,127,117,202, 87,206,218,101, 47,147,201,
+236,123,107, 51,120,105, 77, 1,246, 31,215, 34,255,102, 21, 0, 32,255,102, 21,114, 10, 42,129,232, 68,102, 99, 20,247,174, 31,
+ 82,104, 85, 4,202, 79,195,223,255, 34,124,196,229,176, 88, 52, 48, 26,143,131,207, 15,129, 65, 87,220,104,157,117,194,232,127,
+ 75, 0,130, 47,127,155,129, 38,188, 71, 0, 0,215,179, 40, 6,140,227,227,223, 75, 71, 98,232,200, 94, 0,168,237, 57,207, 16,
+ 21, 21, 69,223,248,132,160, 73,171, 62,160, 0, 70,191, 48,147,245,188,255,218,111, 22,211,214,173,255, 2,112, 6, 37, 55,155,
+160,188,216,186, 5,115,223,190, 64,183,110,192,203, 47,223, 33,255,242, 98, 95,148, 23,251, 34,200,239,122,157, 50,199,143, 31,
+ 15,169, 84,138,225,195,135,215,112,253, 59,126,188,153, 18,112,245,222,122,131, 88,135,249,109, 66,136,253, 83,219,181, 88,185,
+ 92, 45,143,113, 63, 39, 30, 19, 19,163,114,101, 57,207,155, 55, 15, 49, 49, 49, 53, 8,181, 54,121,191, 41, 20, 56,115,230,140,
+221, 5,239, 88,103, 12,156,175,205,140,141, 85,199,202, 93,111,213, 44,162, 20, 60, 63, 31, 24,111, 92,129, 98,241, 98,172,215,
+149, 64, 27, 21, 97,191,255,221, 79,235,241,193,155,175, 34,116,193, 75,248,232,244, 1, 36,106, 47, 97,228,179,207, 34, 36, 36,
+196,227, 96, 64, 27,209,211,240,240,240, 26,125,248,232,209,163,170,186,182, 99, 87, 40, 20, 66,133, 66, 49,240,244,233,211,249,
+ 41, 41, 41,234, 55,222,120, 35,226,203, 47,191, 20, 87, 84, 84,216,183,105,174,170,170, 66,147, 38, 77,114, 38, 76,152,208,125,
+200,144, 33,143,184, 81, 36,120,132,144, 78,167,211,182, 20,101,239, 89,112,121,193,162,248,118,219,151,180,199,249, 66, 1, 74,
+ 43,248,176, 16,160,184,194, 0,218,162,107,213,252,119,150,245,122,230,249,127,189, 6, 55,241, 4, 54,247,127, 13, 87,191,155,
+ 99, 14,141, 64,254,181, 77, 1, 80,182,174, 28,185, 92,238,238, 33,234,108,253, 91, 93,109,223,215,230, 29,112,251, 79,123,181,
+108,163,210, 80, 35, 68,197, 26,136,127, 59, 0, 34,224, 1, 85, 6,208,114, 29,136,201, 4, 33, 0, 51,181,160,202,108, 66,185,
+201, 0, 88,220, 91, 81, 76,144,223,170,119,107,213,105, 97, 13, 18,108, 16,133,149, 56, 4,242,185,125, 1,238,178,254, 1,252,
+242,122,187, 26,231, 3, 23,230, 65, 72,111,195, 72, 90, 66,169, 84, 30, 96,251, 98,137, 43, 84, 8,250,232, 39,220,122, 35, 22,
+183, 53,190,104,111, 60, 11,179, 57, 15, 0,112,229,100,219, 70,235,176,137,187,191, 80,189, 58, 74, 81,131,252, 25, 68, 4, 46,
+198,224, 94,227, 17, 25,116, 22,137,187,151,170, 60, 25, 68,134, 13, 27, 70, 83, 82, 82, 80, 92, 60, 2, 45, 90,236, 71,147,150,
+189, 65, 41, 5,143,199, 99, 21,136,148,159, 15,228,229,157,177,157, 85, 0,226, 10,104,116,192,160, 65,214, 43, 57, 57,192, 87,
+ 95, 1,229,101,128,174, 2,168,208, 1,254,129,101,172,202, 86,155,181,159,155,155, 11, 0,248,228,147, 79, 0, 0,161,161,161,
+247,194,205,204,170, 14,231,206,157, 91,195, 98,119, 38,110,214,222, 29, 27, 97,219,231,253, 29,240,217,103,159, 97,205,154, 53,
+ 80, 40, 20, 18,119,193,117, 51,130, 67,145,125,246, 28, 10, 3, 3, 85, 60, 30, 15,115,230,204,185, 43, 38,195,147,242, 61, 89,
+221, 28,212, 82,129, 87, 63,121, 23,125,198,143,135,226,147, 79,192,227,221,225, 57, 69,206,153, 59, 30,194, 67,135,176,111,223,
+ 62, 92,186,116, 73, 42,151,203,213,108, 54, 94,113, 36,255,180,180, 52, 21, 0,100,100,100,168, 34, 35, 35,165,105,105,105,234,
+240,240,112, 73,122,122, 58, 34, 35, 35,165,149,149,149,170, 90,198, 92,227,180,105,211,250, 76,153, 50,165, 89,151, 46, 93,176,
+107,215, 46,125,105,105,169,160,178,178,210,234,237,176,205,127,108,221,186, 53,116,244,232,209,190,114,185,188,210,133, 24,158,
+ 3, 89,243,242,178, 78,174,249,224,237,233, 77, 90,116, 83,226, 79,229, 43,248,235, 42, 65,254, 77, 1, 64,121,168, 54, 24,161,
+161, 45, 10,103,207,152, 21, 65, 8, 41,100,198,124, 79,126,175, 11, 15, 1, 55, 85,240,128,160, 86, 45, 46, 37, 37,229,174, 79,
+ 73,161, 22, 37,133, 90,143,218,154,249,220,177, 98,173, 13, 47, 62,118, 25, 62,103, 10, 33, 40,208, 50, 30,128, 26,207,215, 38,
+240, 92, 65, 62,142,221,190,134,179,151,242,112,243,210,101,148, 93, 46, 64,249,213, 66,152,244,149, 48, 26, 77, 40, 55, 27,160,
+ 55,155, 80, 77,205, 48,131,130, 18,246, 74,166, 99,180,255,133, 92,235,249,130,101,140,229,207, 67,252,187, 13,179,226,197,211,
+ 56,128, 56,165, 22,113, 74,109, 13,194,103, 62,145,113, 25, 16,210,219, 16, 80, 45,126,153, 97, 54,177,158, 2,184,121, 12,102,
+ 93, 19, 0,192,127, 5, 1,168,190,121, 5,153,159,182, 67,246,207, 99,113,236,211,126,200,201,186,214,168, 29,179,239,160, 16,
+232,180,128, 78, 11,232,125,207, 1, 0,126,253,208,136,183,231, 45, 1, 0, 12,137,238,229,177,229,255,194,176,131,208,104,162,
+ 17,120,116, 63, 86,191,107, 85,114,135, 13, 27,198,202,245, 15, 0,203, 63, 94, 74,186,118, 5, 28, 63, 23, 46, 88,221,255, 0,
+208,173, 27,197,154, 53, 64,167,238, 21,120, 44,226, 22, 6,141,184,133,231, 95, 50,178, 46,163,163,197,207,156,135,134,134, 34,
+ 52, 52, 20,115,230,204,105,232, 42,118,251,174, 57, 98,221,186,117, 82, 87,132,109,247,162,173, 90,133,117,235,214,177,178,132,
+ 95,123,237, 53, 21, 19,249,239, 10,243,231,207,191,203, 11,224, 10, 7,207,229, 99,250,140,217, 56,190,113, 35, 22, 45, 90, 84,
+171,114,194,148,111,255,254,253,168, 43, 96,111,216, 99,143,224,251,239,190, 66,216,228,201, 88,190,124, 57,234, 42,227,188,121,
+243, 48, 98,196, 8,120,179, 2, 32, 45, 45, 77,229, 16, 44,135,163, 71,143,170, 0, 32, 61, 61, 93, 69, 8, 65, 90, 90, 90,157,
+ 50,245,122,125,243, 29, 59,118,224,220,185,115,200,201,201,241,211,233,116, 48, 26,173,253,204, 96, 48, 96,247,238,221,196,166,
+ 44, 84,178, 40,142,165,186,186, 90,116,124,203,100, 84,101,127,129, 61, 41,185,184,116,157,143, 50, 29, 15,102, 10, 20,234,124,
+ 49,123,193,187,145,177,177,177, 5, 44, 12, 62,187, 94,193, 44, 57,101, 57, 29,192,161, 17,172,255,218, 20, 0, 2,128, 72, 36,
+ 18, 72, 36, 18,156, 58,117,202,254,201, 59,118, 5,165,149,165,104, 49,200,243,117,191,199,143, 31, 39, 0,224,231, 55, 5,226,
+ 99,151, 33,188, 82, 12, 74, 8, 68, 51,138,107,220,119, 75, 92, 34, 62,204, 20, 40,208,149, 32,191, 84,131, 91,101, 90,148, 86,
+ 85, 65,107,168,196,173,234, 74, 92,175,210,163,176,170, 2, 26, 99, 53,180, 22, 35, 12, 22,247,193,175, 79, 62,225, 98,192,115,
+136, 11,120,117, 98, 19, 80,136, 64, 61,222, 6,252, 78,244,190,139,107,172,145,127,179, 10,251,143,107, 49,112, 97, 94,205,186,
+160,183,225, 99,185, 2, 31,203, 21,124,240,148, 0,249,249,249, 6,182, 50,183, 92,178,160, 85,124,130,253,252,146,206,140,130,
+220, 66,100,165,158,197,141,203, 37,141,222,113, 55,126,157, 2, 0, 40, 43,162,240,171,124, 12,146, 25, 2,252,191, 37, 66,251,
+ 39, 62,113, 50, 8,123,227,159, 62, 55, 52, 5,175, 44,176,146, 63, 33, 4,191,167, 90,155,128,237,154,127, 6,161, 61,186,215,
+ 44,231, 70,224,203, 47,129,139, 23,173,158,128, 15, 63,164,118,247, 59,165, 20,129,129,129,238, 71, 96, 91, 31,101,230,253, 63,
+249,228, 19,228,230,230, 34, 59, 59, 27,217,217,217, 72, 78, 78,198,155,111,190,137,252,252,252, 70,107, 15,134,232, 92, 89,210,
+115,231,206, 5, 33,132, 53, 25, 18, 66, 80,151, 50, 81,215, 61, 71, 28,242, 41, 1,225, 53,193,183,239, 44, 67,147, 29,201,136,
+137,137,193,100, 70, 27, 3, 32,239,214, 27,115,195, 6,195,207,207, 15,195,134, 13,195,123,239,189,135,228,228,100,213,242,229,
+203, 93,190,127,223, 21,102,227,122,175,199, 16, 28, 28, 44,181, 88, 44,117, 42, 20,117,221, 99, 65,142,118,143, 83,100,100,164,
+212,129, 40, 17, 17, 17, 33,117,227, 61, 25, 62,108,216,176,102,249,249,249, 56,116,232, 16, 30,125,244, 81, 8, 4, 2,251, 20,
+ 71,112,112, 48,219,233, 8,139,237,255,146,174, 61,250,199,173,219,219, 28,127,237, 90,130, 39, 35,123,194, 95,204,131,191,159,
+ 25,190, 62,213,120,250,185, 9, 22, 0, 26,199, 47, 38, 36, 36,184,155,139,178,175, 2, 96, 57, 29,192,225, 65,243, 0, 0, 32,
+ 10,133,162,233,220,185,115, 49,119,238, 92, 0, 48,124, 28,251, 49,140, 69, 38,248,250,138,225, 77,227,201,100,214,240, 97,191,
+167, 46,130,242,121,120,239, 87,189,163,245,207, 10,126,193,193, 82, 83, 19, 63,104,169, 25,231,116, 90,156, 41, 45,198,217,178,
+219, 56, 91,166,193, 57,157, 6, 23,245, 90, 20, 87, 87,161,194,100,194, 53,189,206,254, 63,235,194, 11,163, 8, 86,189,203,199,
+170,119,249,160,224,131, 18, 30, 98, 38, 17,188, 54, 73,132, 25, 19, 91,161,107,215, 54,176, 64,232,241, 79,102, 92,253,142,243,
+242,117, 36, 5,170, 77,134, 52,167,192,170,200,103,174,176, 6,209,237,121, 43, 0, 0, 32,160, 90,240,169, 14,213, 60,107, 68,
+179, 70,163,241,147,201,100,209,158,148, 49, 44, 44, 12,201,201,201,216, 88,161, 67,165,129,135, 87, 54,125,139, 34,177, 47, 42,
+ 13,141,183, 77,196,184,190, 31, 72,211, 52,203,176,241,199, 68,251,181, 95, 63, 52, 34, 34,112,177,253, 60,230,153,175,164, 20,
+172,214, 15,211,213,139,129,105, 11, 70,160,249,209,100, 72, 63,141, 2,111, 44,160, 86,171,189,234,195,157, 58,213,140, 30, 31,
+ 62, 28,104,222, 28, 8, 9, 1,194,251, 54,133, 88,196, 7,159,119, 71,172,216,215,215,237,128,204,227,241,236,150,127,110,110,
+174,221,234,103, 62, 31,125,244, 17, 62,250,232, 35, 92,187,198,222, 43,227,106,190,190,230,125,207,173,175,117,235,214, 73, 87,
+175, 94,237,146,176,217, 90,255, 14,174,231,187,226, 20,152,115,139,133, 93, 10,123, 3, 33,176,232,171, 33,108,219, 9,242,165,
+ 75, 49,205,191, 57,154,171,211,236,247,103,252,107, 26, 62,248,239,183,200, 89,245, 11,222,239, 51, 28, 19, 2,187, 96,223,182,
+109,200,203,203,115,249,254, 61, 31, 43, 71,175,222,189,165, 22, 91,153, 24,133,204,113,122,198,213,181,218, 48,115,230, 76, 74,
+ 8,161, 76, 96, 31, 51,223,239, 72,242,105,105,105,234,136,136, 8, 41,165, 20,204, 84,128,155,122, 75, 17, 10,133,143, 62,255,
+252,243,185,165,165,165,208,106,181,240,245,245, 69,171, 86,173,208,188,121,115, 52,111,222,220, 93,229, 89,156, 20, 59,179,143,
+143,143,254,197,216,207,165,235,143, 13,196,229,171,101,104, 19,192, 71,100,119,130,199,187, 80,248, 55,107, 86, 2,192, 92, 7,
+111,112,251, 13, 60,164,214, 63,224,102, 25,160, 92, 46,175, 80, 40, 20, 62, 0,252,229,114,185, 93, 11,236, 16,213,222, 43,205,
+151, 89,234, 39,147,201,168,104,134, 61,242,159, 56,204,255,187, 29,144,223,217,153,168,254, 36,250, 57,232, 77,213, 40,211,233,
+145,107, 52, 66,104,177,126,185,212, 88, 5, 11,165,160, 0,118,221,188, 4,157,201, 8, 0, 44, 6, 38,130, 5,203,106,246,113,
+107, 60,128, 5,102, 84,227,252,197,114,124,191,185,204,163, 31,235, 72,244, 54,151, 63,181, 29,219,137,157,205,234, 7,235,119,
+149, 16,142,248, 26, 64, 8,138,139,239, 4,231,137, 44,215, 97,224,181,195,236, 62,217,184,126,221,110, 57,237,103, 83,190,216,
+ 95,215,213, 80,188,148, 74, 37,152,210,108, 58,125, 4,209,209,209,141,214,113,183,159,178, 46,239, 75, 77, 62, 11, 0, 24,220,
+203,154, 25,239,237,121, 75,112,228,108, 47,252, 55,113, 50, 20, 59,102,177,158,255,127,101, 65, 52,130,130,146,109,103,106,155,
+178, 20, 13, 74,173,214, 24, 64, 17, 20,148,204, 74,214,190, 61,123,237, 57, 45, 38, 79, 6,164, 82,130,219, 87, 3,160,211,138,
+ 81, 89, 38,194,166, 13, 4,115,231, 82, 92, 41, 42, 71,120,100, 4, 82, 14,168, 88, 89,197,102,179,217, 62,223,159,156,108, 45,
+171, 35,225, 23, 21, 21,161,168,168,136, 53,255, 59, 16, 6,229,241,120,119,145, 42,165, 32,158, 38, 1,146,203,229,234,215, 94,
+123,173, 70, 44, 0,227, 17,240,196, 21, 78, 28,180, 18,139,211,178, 2, 66,216,207,217, 17, 66, 96, 42, 47,135,176,101, 16,248,
+126, 77,208,235,197,241,248,104,212, 72,188,195, 44,219,235, 63, 0,230,202, 42, 8, 91,180, 65,159, 8, 9, 58,119,232,130,207,
+207,167,161,119,239,222,210, 99,199,142,221,165, 4,196,202,229, 0,136, 10, 0,102,197,198,218,151, 14,154,156,200, 94, 32,224,
+ 3,244,206, 66,197,218, 10,188,118,237, 90, 2,128,218, 92,252, 36, 35, 35,195,165,139, 63, 45, 45, 77,205,134,252, 19, 18, 18,
+ 8, 33,100,113,243,230,205,123, 69, 68, 68,116,189,112,225, 2, 78,156, 56, 1,179,217, 12,127,127,127,232,245,250,162,160,160,
+160,203,158, 24,125, 10,133,130,215,166, 77,155,125,207, 61,247, 92,155,163,135, 51,176, 70,185, 15,205,136, 8,221,219, 84,227,
+226,109,127, 12,237,110,188, 4,192,121, 30,203, 92, 87,155, 56,102,156, 34,132, 56,158, 58,231,125,225,208,200, 16,176,120,233,
+ 13, 0, 12, 14,131, 10, 45, 72,241,120,126,184, 6,185,215, 66,124,172, 51, 6,150,105,180, 82,163,159, 88, 85,202,179,224, 70,
+ 85, 5, 96, 52,194,108, 91,215,116,190,162, 4,133,250, 50, 80, 74, 97,203, 47,160,102, 83,188,152, 73, 4,235, 54,221,233,147,
+ 23,114,129, 30, 93, 77,224, 67, 87, 47,242,119,234,236,238,234,160, 86, 47,128, 82, 57, 75, 5,100, 66,163,209, 24,242,243,243,
+ 5, 43, 71,130, 23,183,111, 24,230,245, 62, 98,183,194,216, 42, 21,174,188, 46,206,231, 12, 9,177,181,230,176,132, 96,160,109,
+ 37,135,171,229,126,137,137,137,214, 76,128, 50, 25,101,147,243, 33,118,220,215, 82,197,246,217,170,180, 68,138,200,160,179, 24,
+ 18,221, 11,135,247,157,197, 81,237, 82, 16, 16,200,199,125, 37, 77,216, 62,155, 85,249,130,130,146, 65, 8,193, 11, 47,188,128,
+111,190, 41, 3, 67, 49,214,191,148, 81, 8,104, 77,203,254,118,173,242,162,134, 75,165, 41, 7, 84,170,225,195, 1,195,141,142,
+184, 90,226, 3,139,109,182,181,157,174, 13,222,138, 41,199,190,163,221,209,180, 67,119, 41,147, 37,176, 46, 48,196, 95, 80, 80,
+ 0, 0,184,113,227,134,221, 51,112,243,230, 77,251,192,234, 37,136,131,219,217,249,165, 36,108,242, 1, 56,226,155,111,190,145,
+174, 89,179, 70,197, 40, 0,171, 87,175,246,216,250,119, 38, 12,111, 33, 22,139,113,227,202,101,116,233,218, 13, 22, 83, 53,136,
+201, 12, 65,211,102,104, 58, 96, 32,154,244,127, 2, 22,157, 9,102,125, 53,168,201, 12,152, 45,136, 91,251, 95, 76,156, 60, 17,
+ 98,177,216,165, 60,211,166, 64, 86,255,215,213,115, 97,203, 93, 63, 27, 25, 25, 41,181, 41, 0,148, 82,138, 33, 67,134, 72, 83,
+ 83, 83,239,122,206, 29,249,219,234,202, 2, 96,119,247,238,221,251,127,241,197, 23,134, 91,183,110, 85,141, 28, 57,242,185,204,
+204,204,247,245,122,125,113,203,150, 45,229,159,127,254,185,134,109,253, 41, 20, 10, 33,128, 71, 34,194,195, 91,197,206,136,197,
+165,130, 75,154,169, 51, 98,159, 76,223,183, 33,254,122,185,102,240,192,168,145,150, 54, 29, 66,255,159,179,149, 95, 87,106, 97,
+ 91, 31, 35, 14,250, 39,113,193, 1,206,199, 28, 30, 84, 5,160, 46,235,194, 27,242,103,200,166,150,132, 49,172,148,128, 21, 39,
+ 14,170, 1,144, 73, 3, 34, 41,124,197,208, 82, 19, 12, 38, 19, 44,212,130, 22, 1, 1, 40,208,149,194,147,228, 66,174,150,247,
+221,137, 1,240,108, 45,182, 43, 23,127,125,211,245,218,242, 8,140, 27, 56,112,224,246,184,184, 56, 81, 80, 80,144,229,250,245,
+235,152,215,251,186, 51,249,179,254, 31,181, 37,236,241, 10,182, 44,127, 46,146, 60,221,245, 12, 91, 36,108,159,165, 6, 64,198,
+246, 89, 34,217,121,250, 67, 85, 90, 34, 64, 64, 48,174,239, 7,210,237,167, 62, 80,179, 37,127,166, 47, 21, 23,143,160, 64, 25,
+ 99,253,194, 21,239,172,143,223,207,244, 7, 82,215,230, 26, 54,171,158, 20,107,123, 75,204,229,229, 42,194, 7,244, 85,190, 32,
+229, 38, 8,120, 2,232,121, 98,233,168, 9,175, 98,118, 76,172,219,246, 72, 74, 74, 34, 73, 73, 73,244, 30,190,127,160,148, 18,
+ 66, 8,117,140,104,119,244, 4,120, 34, 75, 46,151,171, 99, 98, 98, 48,111,222, 60,187, 66,209, 88,169,112,135, 15, 31,142,217,
+137,235,240, 81,121, 9,250, 69, 13, 5,175, 77,160,181, 76, 70,106, 77,221, 11, 33, 8, 95, 0, 34,226,227,155,132, 85,104, 54,
+ 98, 32,186,118,237,234,113,212,126,125,224, 96,221,171,194,195,195,165,169,169,169,245,170,171,220,220,220,232,253,251,247, 95,
+225,243,249,219,158,124,242,201,143,103,205,154,117,107,237,218,181, 41,128,117,202,193, 3, 81, 60, 0,201, 39, 78,156, 24,244,
+195,250, 13, 60, 17,223,231,234,248,151,198,247,157, 61,123,182,246,235,175,191, 30, 11, 32,192, 70,252,229,204, 6, 65,108, 60,
+ 10, 28, 30, 12,176,113,255,123,171, 0,212, 91, 97,112, 67, 62,172, 7,164, 77, 39,210,136,108,188, 76, 98,201,202, 81,233,170,
+ 13, 48,153,205,232, 58,104, 0, 66, 77,225,158, 18,110,131, 5,163, 48, 73,127, 0,168, 24,107,220, 22, 7, 80,175, 28,248, 74,
+165,114,135, 66,161, 16, 36, 39, 39, 47, 88,185,114,229,167, 14,202,197,112,199,255,197,214,163, 0,160,193,146,151, 76, 56,207,
+196, 89,212,254,251, 38,156,151,121,165,233,239, 60,253,161,154,105, 31, 10,138,237,167, 62,240,170,140, 86,114, 39,120,101,193,
+240, 59,102, 47,185,115,111,193, 50,207,243,145,199,189,117, 70, 29, 7,144,181,223, 44,150, 84,234,173,251, 0,220,201,255, 31,
+235,241, 59, 98,179,200,204,114,185,188,193,231, 85, 25, 37,160, 33,100,217, 98, 1, 84,204,113, 3,148,205,171,239,117,237,218,
+ 21,109,231,204,145,174,217,187, 87,149,247,241,111,144, 9, 91,160,185,109,243,158, 74,189, 9,115,223, 92, 4,190, 95, 16,118,
+109, 80,224, 84, 75,130, 81,131, 7,123,157,183,223,108, 54,121, 61, 76,176,117,241,179, 80,190,200,243,207, 63,127,139, 82, 26,
+223,163, 71,143,255, 21, 23, 23,235,188, 32,126,199,122, 31,150,145,145, 1,139,137, 96,240,144,190, 31,204,158, 61, 91, 11, 0,
+179,102,205,178, 0,208,214,167, 73, 29, 60, 78, 53,142, 93,120, 69, 57, 60,100, 30,128,123,162, 20,120, 77,140, 73, 53, 18,236,
+ 32, 35, 55,171,209, 43,213, 41,233, 15,115,173,222,114,229,114,185, 25,192,127,108, 31,175,229,186, 42, 95, 61,127, 47,105,136,
+103,238, 37,172, 4, 79,177, 96, 89,114,131,203,118,151,234,215,131,246, 53,222,203, 58,104,168, 77, 87,228,114,185, 90, 46,151,
+ 55,136, 44, 82,143, 57, 0,166, 12, 10,133, 2,182,237,123,145,239,176,125,111,234,254,125,246,237,123, 71, 68,140,128, 77,233,
+173,245,255,241, 39,106,137,121,115,224,221,196,196,114, 55, 65,119, 74, 64, 67,212,215, 19, 79, 60, 81,109, 50,153, 82, 0,232,
+222,123,239,189,122,145,104,108,108, 44,121,239,189,247,168,193, 96, 0,128,189,181, 61,183, 98,197, 10,178,112,225, 66,251,255,
+178,165, 2,174,115,108,119, 14,238,228,112,127,193,214,195, 69,188,221, 71,152, 3, 7, 14, 28, 56, 52, 10, 76, 0,170, 0,136,
+ 27,216,136,115,183, 99, 32,235, 29, 5, 57, 60, 28,224, 26,147, 3, 7, 14, 28, 30, 46, 8, 0, 52, 97, 65,254,122, 88, 3,184,
+ 27,138, 15, 44,224,150,253,253,237, 58, 18, 7, 14, 28, 56,112,248,251,193,143,227, 11, 14,156, 7,128, 3, 7, 14, 28, 56,112,
+224,192, 41, 0, 28, 56,112,224,192,129,195, 63, 29, 53, 92, 58, 39, 79,158,244, 58, 34,215, 85, 48,225,131, 46, 47,100,128, 15,
+124,125,110, 64, 40, 42,129,197, 98, 93, 22,198,231,243,192, 35,124,235, 95, 30, 1, 33, 60, 80, 34, 0, 33, 4, 60,152,176,125,
+167, 16,148, 82, 4,241, 90,192,147,242,217, 50, 42,182,132, 53,128,167, 28,214, 4, 3, 70,102,201,215,195, 88,127,156, 60, 78,
+ 30, 39,143,147,199,201,123, 48,229,113, 30, 0, 55, 56,120,248, 34,180,165, 90, 24,141, 20,183,110, 19,236, 73,246,197,222,125,
+254,224, 17, 33,246,169,218, 98,239,129,118,216,171,106,135, 67,199, 90, 65, 0, 1,120, 16, 99,104, 36, 15, 62, 34, 31,214,255,
+ 99,210, 43, 83,233,164, 87,166,210,195,169,170, 42, 35,143,164,158, 61,147,121, 80,117,228,176, 46, 57, 57,185, 10, 64, 83, 78,
+ 7,125,248, 49,242,169,161,146, 89,179,166, 82, 79, 55,121,122, 88,161, 80, 40, 36,212,134,186,118,215, 99, 11,234, 4,174, 71,
+113,224,208, 8, 30, 0, 6,131,135, 12, 98,253, 18, 30, 73,205,112,171,181, 52,180,188,134, 68, 70,166, 16,163, 71,154,113,234,
+ 47, 95,136,132, 2, 8,248, 2, 8,133, 20, 62,124, 35, 32,104, 10, 1, 42, 49,168,151, 9, 98,145, 15, 40,128,118,109,128,103,
+199, 88,176,127, 27, 59,242,191,120, 62, 27,143, 62,214, 21,237,131,155,163,224,202,133, 78, 1,109,187,160,101,123, 51,254,248,
+253,119, 36, 39, 39,151,160,145,119,196,146,201,100, 99,148, 74,229, 78,135,243,103, 28,207, 57,212,142,217,179,100,212, 84,117,
+ 86, 58, 40, 44, 80,101,177, 20,163,180,125,165,170, 67,219, 17,168,168,110,135,111,214,253,244,183,221,233, 44, 38, 38, 70, 53,
+111,222, 60, 16, 66,176,122,245,106, 85, 67,228, 4, 96,210, 1,112,252,127,255,225,145,210, 69, 41, 8,143, 87, 87,123, 83,199,
+246,100,218,244, 78,242,173,154,237,236,184, 51, 34,135,134, 5,147, 13,208,193, 75,192, 78, 1,104, 44,240,238, 51, 23,142, 25,
+101, 4, 5, 31, 2,190, 16,131,195, 9, 90,183,226, 65, 32,224,193, 71,200, 71,143, 80, 30,174, 92, 53, 97, 80, 24, 15, 45,130,
+196,248,227, 64, 51, 0, 0,159, 86,130, 82, 11,220,165, 8,158,244,202, 84,250, 87,102, 38, 58,183,239,128,191,210,142, 34,221,
+ 96,132,246,182, 22, 34,159,166,232,217,127, 8,250, 14, 25, 5,213,118, 37,100, 44,115,227,223, 3,226, 31,174, 84, 42,247,135,
+132,132, 32, 51, 51,147,233, 48, 37, 0,230, 40,149,202, 29, 50,153, 44, 90,169, 84,238,255,187,189, 20, 51, 99,101,212, 71,160,
+129,128,103, 64, 85,149, 25,165, 58, 95,252,248,243,126,143,234,127,196,200, 33,146,102,190, 26, 12, 31, 34, 66,231, 78,207,170,
+154, 53, 11,128,209,100,194,173, 91,183,209, 38,255, 42,114,114,243,240,202,203, 99,232,134, 31,118,121,213,174, 97,182, 61, 21,
+ 0,246,219,100,223, 79,235, 31,184,179, 29,238,234,213,171,161, 80, 40, 36,141,149, 14,248, 62,190, 47,116,203,150, 45,119,239,
+167,208, 72,228,165, 80, 36, 72, 8, 8, 98, 26,160,222,105,254,175, 32,233,175, 58,114,188, 45, 75,166,125,223, 43, 59, 94, 77,
+208,185, 85,228,254,248,227, 15,251,249,232,209,163,177,123,247,238, 58,207, 57,220,123,242,119,188,230,168, 8,212,169, 0,164,
+ 30, 78,199,144,161,225,247,173,208, 22,207,178, 67, 58, 62,236,213, 75,200, 19,240,161,213, 8,208,182,181, 16,109, 91,139, 80,
+ 81, 33,132, 88, 40,128, 89,224,131, 1,125, 8,250, 61,206, 7,143, 8, 65, 8,129,143, 80, 4, 33,175, 26, 68, 44,130, 73, 15,
+152,160,171,147,252, 15, 31,216,143, 46,237, 90,225,204,169, 51,200, 47,186,126,167,124,229, 21, 16,159, 61, 70,121,124,130, 1,
+ 97, 3,240,199,110,207, 56,118,237,218,181,146,204,204, 76,213,197,139, 23,225,235,235, 11, 95, 95, 95,233,214,173, 91,213, 30,
+ 14,102, 82,165, 82,185,159, 33,126,135,206,209, 28,192,168,111,191,253,246,246,171,175,190,154, 44,147,201, 70, 42,149,202,228,
+ 7,177,131,135,135,135, 75,210,211,211, 89,255,110,201,240,193,146,222,161, 77, 85, 29,218, 21, 33,160,153, 15,120, 60, 63, 84,
+ 86,154, 80,172,169,196,100, 89, 79, 42,110, 54, 0,223,127,247, 51,171,126, 36,196, 13,188,240,204,227,170, 94,189,122,226,250,
+ 13, 45,142,255,121, 2, 21, 21, 58, 4, 4, 52, 69, 72, 72, 39,240,248, 66,152,205,249,136,157, 57,149, 38,172,253,241,111,101,
+221,196,196,196,168,230,207,159,111, 63,159, 55,111, 94,131,121, 1, 30,100, 15,128, 82,169, 36, 50,153,140, 38, 37, 37,193,213,
+198, 74,247,219,104,151,203, 99, 65, 8,193,186,117, 10,105, 76, 76,253,148, 0, 94,167, 23,237,228,157,177,188,137,203,193,180,
+109,115, 30,130,131,120, 15,109,251,253, 83,225, 72,246,174,148, 2,183, 30,128,212,195,233, 0, 80,111, 69,224,240,156,156, 58,
+239, 15,253,188,155,215,131,133, 67,142,115,143, 6,161,100,117,107, 8, 5, 66,116,108, 95,129,242,114, 33,142,159,233, 8, 62,
+159, 15, 62,225, 67, 36, 52,161, 87, 55, 61,186,119,227,131,128, 7,145,208, 7, 34, 62, 65,216,227, 6, 4, 5, 90,176,241,127,
+117,203,238,217,165, 13,174,228, 22,213, 36,127, 27,242,175, 93, 33,132, 39,160,237, 34, 31, 71, 96,243,166, 40,209,222,102, 85,
+222, 53,107,214, 72, 86,172, 88,161,186,114,229,138,227,101,213,152, 49, 99,176,107, 23,123,107, 83,169, 84, 30,112, 36,127, 23,
+104, 25, 31, 31, 95,242,198, 27,111,236, 67, 35, 79, 81,212, 65,254, 42, 79,202, 22, 26, 18,164, 10,110, 83,134,150, 45,252,209,
+ 33,184, 45,252,252,253,112,229, 74, 33,204,102, 11,130,219, 55,197,217,243,105,136, 28, 58, 72,146,118, 56,163,206,193,244,245,
+215,167,210,199, 67,181,120,228,145, 14, 56,119,254, 10,142, 31, 63,143, 91,183,203, 65, 41, 16, 24,232, 11,189,190, 2,253,251,
+247, 66, 73, 73, 41, 10,143,255,137, 33, 79,134, 75, 82, 15,177, 87, 84,107,134, 60,189, 0, 0, 32, 0, 73, 68, 65, 84, 30,100,
+ 48,214,191,109,219,105, 48,158,128, 53,107,214,120,236, 5, 96,166,251,157, 51, 1,187,216, 78,182,222,253,175, 67,135, 14,180,
+ 99,199,142,245,206,197,175, 84, 42,201,132, 9, 19,104, 98, 98, 34,152,141,149,234, 34, 60,219, 86,184,119,149, 63, 50, 50, 82,
+194,108, 14, 84,139, 18, 75,221,200,180,255,111,185, 60, 86, 85,159,119,212, 89,222,160, 69, 21, 56,182,188, 73, 13,226,231,240,
+112, 90,255,206, 46,255,122, 77, 1,212, 87, 17, 24,250,121,183, 90,149, 0,111,200,159, 65, 74, 74, 10, 10, 11, 11, 1, 0,193,
+193,193,212,147,151,129, 79, 43, 33, 32,102,136,132, 66,252,121,166, 21,248, 2, 1,154, 10,117,214, 56,128, 38, 60, 20, 22, 54,
+197,227,189, 44, 32,132, 64,246,172, 9,212,194, 3,136, 15, 8, 40,172,129,252,174,161, 47,185,138, 27,154, 10,100, 23, 22,214,
+ 90,150,146, 82, 13,180,183,110,216,100,177, 30,128,156,201, 31, 0,176,107,215, 46, 60,245,212, 83,146, 61,123,246,184, 29,224,
+100, 50,217,240,188,188, 60,151, 29,166,180,180,212,241,114,243, 37, 75,150,224,220,185,115, 35, 30,164,169, 0, 7,242,103, 13,
+201,240,193, 18,177,224, 58,124,125,155, 67,236, 35, 66,151, 46,157,209,177,115,103,148,149,169,161,209, 84, 64, 36,226, 35, 40,
+ 80, 12,129,111,115,183,131,169,128, 22,162,105,147, 22,208, 87,154,112,230, 76, 14,174,221, 40,197,245, 27, 21,168,172, 22,227,
+145, 96, 19,196, 62,124,228,100,231,225,209,174, 93,113,237,122, 25, 42, 77,205, 88, 13,208,142,110,255,218,174,123, 58, 29, 80,
+155, 76,111,100, 49,214,255,188,121,243,238,186, 62,127,254,124,175,188, 0,174,118, 39,116,158, 59,110, 40,175, 66, 90, 90,154,
+170,190, 27,242, 76,152, 48,129, 42,149, 74,200,100, 50,184,154, 14, 96,227,169, 98,200, 31, 0, 50, 50, 50,238, 42,147,237,190,
+ 91,163,135,217, 97,176,161, 60, 46,137,243,253, 49, 97,181,206, 37,241, 7, 7,241,108,163, 20,187,230, 29, 61,122,116, 13, 47,
+201,211, 79, 63, 93,163,174, 56,183,255,131, 3,143, 99, 0, 26,202, 35,208,144,200,201,177, 42, 22,133,133,133, 30, 41, 1, 2,
+129, 0, 66,190, 16, 66, 33,193,176, 33,128, 94, 87,141, 75,185, 34, 8, 5, 66, 8,204, 2, 68,132, 83,136,132, 66,240,249, 60,
+128, 18,104,180,192,177, 19, 2, 88, 44, 22, 0,183,106,149,123,226,207, 92, 84, 84,212,158,129,179, 75,219,182, 84,103, 34,168,
+172, 44,133,217, 98, 98,253, 59, 79,156, 56, 81,187,210,161,215,179, 34, 26,103,215,191, 43,205,112,251,246,237,142,207, 39, 55,
+134, 23,192,149,139,223,145,252,109, 3, 32, 59, 11, 48,184,141,138,199,187, 10,147,217, 2,131,209,132, 91,183, 53, 16,138,196,
+168,174, 54,194,104, 50,195,100,178,192,100,166,172, 60, 49, 34,161, 14, 98,223, 14, 40, 46, 46, 69, 89,185, 30, 26,109, 37,154,
+181,232,139,193,143, 63,142,140,212,221,104,111, 48,161,180,172, 20,221,187,119,133,143, 72, 0, 93,185,230,111, 49, 80,216, 34,
+255,237,115,255, 78,158, 41,175, 98, 1,230,205,155, 87,195,155,224,124,143,173, 2,160,209, 68,219, 31,140,141, 13, 66, 98, 98,
+ 98,141,254,202, 24, 8,249,249,249, 94,239,202, 41,147,201,104, 98, 98,162,125,155,241,218, 98, 2,156,201,213,217, 83,149,150,
+150,166, 98, 2,223, 40,165,244,232,209,163, 53,238, 31, 61,122, 84,229,206,233,193, 40, 13,140, 18,224,104,197,215,102,232,187,
+249,109, 24, 31,153,140,205, 0, 38,174,214,225,137, 69, 21,245, 82,190,156,231,248,221,197, 4,112,184,247,222,128,218, 60, 0,
+247,213,191,227,202,210,175,143,245,239,100,177, 34, 39, 39,135, 25, 80, 88,245, 94, 62, 95,128,136, 65, 22,240,121, 2, 28,203,
+ 20, 35, 43, 71,140,177, 79, 1,207, 60, 13,140, 27, 77,208,174,141, 8, 98,145, 15,196, 34, 31,248,138,125, 16,220,206, 7, 98,
+145, 24, 98, 55,203, 0, 11,242,175,146, 18,205, 77, 82,219, 64,210,181, 75, 39, 4, 52,247,135,216, 98, 64,133,222,120,223, 59,
+197,225,195,135,247, 31, 62,124,184, 6,225, 59,126, 0,160,184,184, 24,227,198,141,107, 52, 43,223,102, 29, 73,156,175,217,142,
+ 61,178,228,204,102, 64,167, 55, 66,167, 51,160,172,172, 26, 55,111,106,113,237,218,109,148,151, 87,163,162,194,136,138, 10, 3,
+116, 58, 35, 74, 75, 74,221,202,170,174, 54,161,170,202, 12,163,209,128,166, 77, 69,232, 24,220, 12,126,254,254, 0,128,144,174,
+157,209,161,125, 51, 4, 52, 19,131, 82, 51,140, 38, 11,170,171,117,127,139,129, 36, 38, 38, 70,181, 96,193,130, 58,201, 60, 38,
+ 38,134,181, 69,106,219, 82,184,214,251,171, 87,175,198, 55,223,124,227,241, 86,195, 14,219,206,218, 63, 12,161, 22, 22, 22, 50,
+187,103,122,196,110, 19, 38, 76,160, 73, 73, 73,112, 84, 30,148, 74, 37, 25, 63,126,124,157,223,155, 57,115, 38, 8, 33, 96,250,
+113,120,120,184, 4, 0, 34, 34, 34,164, 12,145, 51, 86, 63,115,159, 82,106,191,207,226,215,214,176,226, 93, 41, 14,108,102, 80,
+ 90,182,108, 9,226,160, 37,212, 87, 30,135, 7,143,252, 93,157,123,229, 1,120,144, 44,255, 59, 3,188, 25,124, 62,223,227,239,
+ 13, 25,100, 65,235, 86, 62, 40, 43, 19,192, 71, 96,130,143,136, 15,117,186, 8, 99,165, 66,136,132, 66,148,149, 9,145,154,233,
+143,102, 98, 2, 30,143,135,209,209, 6, 60, 55,150,130,199,163, 88,122,210,243,114,202,100, 50,202,247, 19, 67, 35,108, 9, 63,
+ 99, 1, 46, 22, 82, 12,151, 12, 99,189,165,111,255,254,253,113,228,200, 17,151,247,252,252,252, 88, 15,150, 90,173,118, 4, 0,
+172, 95,191, 30,211,166, 77,179, 95, 47, 46, 46,182, 31, 79,155, 54, 13, 69, 69, 69,141,210,158,233,233,233,106, 66, 8,152,121,
+ 82, 30,143, 7,198,221, 89,199,188,105,173,200,191,122, 77,218,170,153, 94,229, 35,226,195, 96,180,160,170,186, 0, 87, 11,138,
+161,209,150, 65,163,209,163, 88, 83,137, 98, 77, 37,154, 7,117, 6,144, 91,167,172,155,183, 41,110,220,188,141,158, 61,187,162,
+ 68,171,133, 80,192, 67, 89,121, 1,116, 37, 22, 60,246,168, 14,109, 90,181,130,159,159, 31,124,124,124,113,253, 70, 57, 8, 63,
+144, 85, 25, 29, 93,242, 13,181, 10,160,161, 87, 16,212,102,173, 3,119, 98, 1,216, 66, 46,151,171, 99, 98, 98, 48,119,238,220,
+187,188, 10,204, 52,131,183, 43, 11, 38, 76,152, 80,195,130,101,222, 47, 66, 8, 94,124,241, 69, 36, 37, 37, 17,182, 74,128,179,
+229,239,120,207,217,211,224,140,181,107,215, 18, 0,118, 43, 63, 35, 35, 67,101,235,215,106,155, 55,128,249,171, 2, 64,210,211,
+211,237,247,235,218,206, 53, 45, 45, 77, 53,100,200, 96,233,145, 35,214,119, 98,230,204,153, 56,121,242, 79, 41, 67,225, 71,143,
+ 30, 85, 49,191, 63, 34, 34,194,173,167,108,237,218,181,248, 74, 26,136,137,107,244,214,223, 53,223,191,198,253,137,107,244,246,
+250,156, 46, 21,226,187, 3, 6,112,120, 8,148,246,184, 21, 53,149,238,149, 11,113,242,228, 73,246,171, 0,238, 5,241, 59,198,
+ 2,212,199,250,175,105,201,215, 36,127,155,155,201,237, 84, 64,203,150,124,240, 8, 31,173, 90,242,209,173, 43,197,181,107, 2,
+240,248, 4, 66,129, 0, 66,129, 16,127,157,246, 71,144,191, 16,124, 62, 31, 67,194,205,240,245,245,129,197, 66, 1,106,246,138,
+252,155,180,233,136,155, 21, 20,186,139,106, 8, 8, 31, 23,175,229,147,139, 44,201,223, 54,176, 73,175, 94,189,170,186,122,245,
+170,171,223,171,102, 89,142,145,197,197,197,251, 24,146, 7,128,113,227,198, 97,253,250,245,246,103,202,202,202, 80, 84, 84,132,
+ 29, 59,118, 48,203, 5,239,123,231,181, 13, 92,170,140,140, 12, 21, 19, 44,102,187,230, 49, 41,164, 30, 74, 87, 75, 37, 97,160,
+133,101,208, 87, 26,161,245,169, 2,133, 22, 85, 85, 38,148,149, 85,163,232,182, 30,215,174, 87,224, 73,105, 39, 0,169,117,202,
+170, 52,180, 68,222,165, 91, 8,233,242, 8,186,116,233,128,226,226,219, 8,108,110, 70,183,110, 1,104,221, 42, 4, 98, 95, 95,
+148,148, 84,224,248,137, 11, 40, 40, 44, 67,219, 14,189, 30,218, 1, 36, 65,161,160,132, 64,202,112,169, 35,169,214,181,110, 63,
+ 65,161,144, 36,172, 93,203,202, 11,176,102,205, 26,149,179, 2,176,106,213, 42,172, 91,183, 78,234, 78, 94, 66, 66, 2,141,141,
+141, 37,114,121,160, 67,153,168, 43, 98,166, 0, 48,126,252,120, 86,238,127,199, 41,133, 22, 45,146,224,237,180, 1, 99,229,219,
+ 20, 0, 74, 41,197,144, 33, 67,164,169,169,169,181,222,119, 71,216,204,220,122,106,234, 17, 21, 33, 4,132, 16,244,235,215, 87,
+186,118,237, 90,245,221,207,222, 81, 50,220,201,227, 77,208,130,145, 39, 27,222,185,134,126, 52, 97,245, 57,187, 60, 54,224, 98,
+ 0, 30, 30,184, 85, 0, 30, 68,139,159,193,164, 73,147,234,245,125, 30,143, 7, 62,223,250,233, 25,202, 67,255, 62,102,248,136,
+196, 86, 5, 64, 40,196,224,112,192,199, 7, 16,242,125,208,178,165, 24,124,190, 14,102,179, 5, 22,139,231,110,123,189,230, 6,
+196, 29,122,224, 82,242, 79,104, 37,224,225,112,254, 21,143, 7,148,121,243,230,169,215,174, 93, 43,173,207, 50, 64,102, 89,223,
+235,175,191,110,191,198, 88,250,101,101,101,208,235,245,152, 62,125, 58, 0,224,235,175,191, 6, 0, 85, 99,180,109, 90, 90,154,
+218,102,237,171, 0, 96,208,160, 65,245, 10,224,234,208,169, 59, 50,143,238, 65,235,150,126,240,243,179,118,251,234,106, 51,202,
+202, 13,208,104, 43,209,177, 75, 47,252,184, 97,163,219, 54,249,253,247,189,228,197,231, 35,232,209,140,179,120,114, 72, 95,116,
+234,212, 9, 70, 67, 21,250,247,123, 28,254, 1, 1,184,146,151,143,194,107, 37, 72, 77, 59, 15,109,121, 0,118,175,223,248,208,
+250, 76,103,198,202,109,237, 79, 48, 83, 46,183, 47, 11,183, 56,145, 62,143, 71, 0,106,167, 12, 58, 83, 46, 71, 95, 23, 22, 44,
+ 33,160,112, 80,203, 99, 99, 99,225,236, 5,152, 59,119, 46, 8, 33,136,141,149,171,108,124,142,153,177,114,244,237,123,183,188,
+216,216, 88,187, 59,222, 29,201,177, 37,127,103,140, 31, 63, 30, 35, 70,140,144,122,171, 4, 59,206,213,135,135,135, 75, 83, 83,
+ 83,213,181,221,103, 19,164,104, 91, 85, 64, 25,229, 43, 50, 50, 82, 42,151,199,170,157,149, 14, 7,249,240, 68, 94,226,252, 38,
+214, 83,113,155, 59,158,142,249,249,118,133, 96,207,169,186,199, 62, 87,121, 0,184, 24,128,135, 84, 1, 24, 60,100,208, 61,153,
+243,105, 40,203,223,177, 35,121, 3,141,150,160, 93, 27, 30, 8,225,129,240,120,216,187,223, 58,191,239,227, 35,134,143,200, 7,
+227,158, 38, 16,251,136,224, 43, 38,208, 20,243,145,113,188, 41,204, 22, 51, 58,118,240,108, 94, 87, 38,147,209,107, 5,151,160,
+205,220,133,110, 29,133, 56, 83,232,253,188,240,204,153, 51,213,168,103, 80,158, 76, 38,147,126,249,229,151, 42,198,205, 95, 92,
+ 92, 60, 49, 60, 60,188, 98,223,190,125, 59,159,123,238,185, 81,197,197,197,100,234,212,169,123,108,249, 2, 26,173,115,166,167,
+167,171,195,195,195,165,204,113,125,100,253,184, 97, 35,153,250,202,100,154,125,225, 28,174,229, 93, 1,143, 71, 96, 54, 83,136,
+125,131, 16,218,179, 55,118,255,145,204,186, 78,175,221,178, 72, 53,197,215, 84, 85, 85, 38,244,233, 29,130,224,246, 45,145,127,
+245, 38,180,167,115,145,149,157,143,253, 7,254,194,149, 66,138, 99,153,103,188,106,167, 7, 37,249,143,101,115,160,215,207,245,
+255,132,165,188,220,255, 97,205,154, 53,118, 5, 96,205,154, 53, 64,222,250,187,158,117, 37,143, 45, 40,165,164, 62,253, 56, 54,
+ 54,182, 94,125,207,129,228,213,222,220,119,229, 85,112,252,174, 43,121, 30,181,243,149, 45, 72, 90,243,178,117,108, 24,254, 72,
+ 13,242, 7, 0,217,152, 39,172, 7,218,147,110, 21, 0, 46, 15,192,131,131,117, 43, 23,222, 53, 13,224,145, 2,240,128, 7,124,
+212,187,112,153, 39,124, 32, 22,137, 48,110, 12, 1,143, 16, 12, 26,104,194,233, 51,190,224, 17,235,156,127, 73, 9, 15,237,219,
+242,193, 35, 34,156, 58, 45,130,216, 7, 48, 24, 13,184,146,239,235, 17,249,231,102,255,137,240, 17,207, 64,208, 50, 28,185,217,
+ 25, 16,220, 72, 66, 64,179, 32, 90, 90,166,105,148, 10, 86, 42,149,106,153, 76, 38, 29, 56,112,160, 42, 46, 46, 14,189,123,247,
+ 46,210,106,181, 24, 56,112,160, 84,171,213, 98,206,156, 57, 42, 27,249,171, 27,187,145,235, 75,252,206, 74, 0, 0, 68, 14, 29,
+ 36,105,215,182,157,202,223,223, 31, 63,110,216, 72,206,156,205,245,108, 64, 79,205, 80, 3, 32,102,180,164,231,178,210,209,174,
+ 77, 19,136,197, 66, 84, 84, 24, 80,120,189, 12, 68,208, 17,199, 50, 83,185,104, 41, 54, 56,241, 6,208,245,255, 80, 99,121,225,
+241, 5,141, 90,164,216,216, 32,135,180,181, 13, 67,104,238, 72,217, 19,210,174,111, 62, 3, 87,227,188, 44,210,199,250, 91, 43,
+175, 91, 63, 28, 30, 90,244,235,215,207, 30,240,183,110,229,194,187,238,185, 85, 0, 26, 58, 31,255,253,206,239,239,153, 22, 65,
+160,213, 18,248,181, 37,104, 17, 68, 48,112,128, 17, 98, 17, 31, 62, 34, 35, 90, 4,137,109,131, 0, 65,196, 64, 51, 50, 78, 8,
+173,222, 2,150,138,145, 76, 38,163,189,186, 55,195, 27,115, 63, 66,165,168, 3,126, 77, 46, 68,215,208, 65, 0,128, 38,199,118,
+ 32, 59, 31,180,162,188,241,148, 0, 0, 36, 47, 47, 79,178,114,229, 74,149,163,119, 0, 0,105, 76,203,255, 94,195,150,236,167,
+222,245,126,240,208, 9, 50,245,149,201,244, 86,241, 45, 84,222,208, 67, 44,110,129, 14, 93, 30,103, 53,149,240,176,195,154, 14,
+187,129,126,102,222,122,216, 87, 4,228,109,104,244,223,230, 46,184,239,239,134, 81,207, 76,108, 80,203,157,139, 1,120,176,148,
+128,218,200,223,173, 7,224,159, 0, 10,107, 84, 63,225, 81, 80, 80, 4, 53,167, 72, 57, 44,128, 88, 36,132,143, 72,128,103,199,
+ 80, 80,106, 65, 96, 11, 19, 76,102, 2,139,197,108, 27,252,220,227,241,206, 21, 24,251,162, 12, 21,130,110,104,221,196, 31,147,
+ 95, 8,194,198,173,167,237, 74,128,209,252, 43, 78, 95,104,220,117,226,140, 34,224,112,206,189, 61, 94,120, 21,254,142, 32, 19,
+180,132, 38, 6,222,205, 12,202, 32,175,228,173,211,174, 64, 76,224,194,187,111, 28, 95,208,232, 86,255, 63, 25,251,254, 50, 54,
+100, 31, 38, 86, 5,145, 58, 40,139,220,180, 64, 99, 41, 1,110, 27,203,219,125,132, 57,112,224,192,129, 3, 7, 14, 15, 47,184,
+ 68,207, 28, 56,112,224,192,129, 3,167, 0,112,224,192,129, 3, 7, 14, 28, 56, 5,128, 3, 7, 14, 28, 56,112,224,192, 41, 0,
+ 28, 56,112,224,192,129, 3,135,191, 7,106,172, 2, 56,121,242,164,215,209,160,174,130, 9, 27, 90,222,148,233,177,110,191,167,
+211,220,176, 31,251, 7,181,181, 31,255,252,125,194, 93,207,182,146,190,234, 86,222,190,213,119, 50,230,141,156,255,165,253,248,
+150,234, 91,120, 83,190,218,224,109,249,106,131,171,242, 61, 63, 85,238,246,123,153,170,157,232,220,185, 51, 46, 95,190,140,129,
+210,177,246,235,191,253,168,184,231,245,231,174,191,196, 7, 7, 75,222, 40, 44,116,204, 76, 72,238,103,255,115,150, 55,118,236,
+ 88,201,174, 93,187,106,100, 74, 28, 51,102,140,116,231,206,157,234,198,120, 63, 30,100,121,245,145,245,119,174,191,168,168,168,
+151,250,244,233,179,241,244,233,211, 47,166,164,164,252,218, 0,229,163, 15,202,251,193,201,107, 92,121, 30, 43, 0,206,248,234,
+171,175, 36, 85, 85, 85, 32,124, 33, 8, 33, 48,155,140, 16, 9, 5,152, 51,103,142,186,190,154,199, 87, 95,125, 37, 1,128,217,
+179,103,215, 75,150, 78,115, 3,254, 65,109,237,196,223,182, 99,103, 0,192,141,171,151,189,146,183,111,245,235, 24, 57,255, 75,
+ 59,113,125,181, 45, 3, 0, 48,251,217, 65,127, 75, 13, 48, 83,181, 19, 3,165, 99,145,169,218,105, 37,181,241, 83, 0, 0,151,
+ 47, 55,126,253,133, 2,146,108, 64, 21, 10, 72,179, 1,213, 27,133,133,200,136,123, 27, 0, 48,104,229,167,141, 90,111, 47,189,
+244, 18,221,180,105, 19,170,170,170,106, 92, 23,139,197,170,151, 94,122, 9,191,252,242,203,131,186, 60,112,104,247, 46,193, 27,
+168,217,172,207,206,191,177, 8,192, 14,206, 14,170, 29,159,127,254,249,240, 63,255,252,179,217,181,107,215,218, 6, 5, 5, 53,
+ 15, 11, 11, 43,124,243,205, 55,127,244, 86, 94, 84, 84,212,136,201,147, 39,167,108,220,184,241, 85, 0, 1,147,254, 47,118, 58,
+ 0,203,233,211,167, 95, 86, 40, 20,191,201,229,114,139,135, 34,153,228,202,180, 1,198, 43,103, 18,105,168, 62, 76,239,129, 76,
+ 14, 13,237, 1,112,196,127,254, 27, 47, 9,232,216, 71, 21,213,167, 7,252,124,132,160,148,194,108,166, 56,147,115, 5,241,171,
+ 63,147,250,250, 8, 49,107,214, 44,175,200,251,231, 13,139, 36,189,186, 29, 84,157,201, 14,145,122, 91,112,134,240,125, 3, 90,
+ 64,167,185, 97, 39,254,186, 60, 2,108, 44,213, 65, 83, 22, 98,223,234,215,237, 47, 82,109,207,213,181,198,210,249,127,138, 68,
+ 34,235, 91, 64, 41, 44, 22,235,251,109, 54,155,237,229,231,241,133,172,173,104, 0,104,215,218,154,170,211, 80, 86,130,106,147,
+ 9, 0, 80, 97,178,202,235, 50,106, 6, 30,237,213,159, 21,241, 3, 64,223,193, 35,144,169,218,105, 39,254,218,158,187,159,245,
+199, 12, 26,217, 0,158,242,247,199, 30,157, 78,197, 16, 63, 0,100,237,221, 87,215,160, 85, 39, 62,253,105,153,228,248,237, 99,
+ 40,204, 63,133,110,157, 34,240,191,185,191,120,220,135,199,142, 29,251,220,230,205,155, 25,242, 55, 1,168, 2,224, 7,192, 82,
+ 85, 85, 37,240,245,245,197,216,177, 99, 37,174, 60, 1,141,140, 54, 79,244,235,243,199,158, 95, 18,154,232, 10,207, 99,168,108,
+230,198, 43, 90,227,203, 0,126,123,208, 6, 38,153, 76, 70,189,221,128,199,137, 24,189,194,151, 95,126, 41,201,200,200, 80,109,
+216,112, 39, 49,209,237,219,183,145,157,157,141,103,158,121,230, 7,137, 68, 34,125,243,205, 55, 89,181,175, 66,161,224,109,220,
+184,241, 67, 0,255,159,189, 47,143,111,162,234,222,127, 38, 73,211,116,223,217,247,150,202, 78,161, 8,200,154, 0,165, 66, 1,
+101, 41, 90,208, 87, 68,104, 64, 69, 1, 81,180,175,223,159,190, 46, 8,138, 20,101, 13,139,226,171,101, 43,136, 82, 40, 20, 10,
+ 41,101,211, 74, 41,101,183,180,165,116,163,116, 79,151,236,153,249,253,145, 76, 76, 67,210, 76,210,176,190,243,124, 62,243,105,
+231,206,228,100,114,231,222,251,156,115,238,185,231, 62, 55, 34,242, 69,183,157, 59,119,182,126,249,245, 5, 94, 0,116, 0,218,
+ 26,110,123, 6, 0,103,244,232,209,163,128,251,183, 58,183, 70,170,131,103,127,136,140,132,149,148,181,254,102, 71,255,160,210,
+207,103,128,203,229, 65,167,211, 66, 86,223,128, 89,211, 95,160,234,235,235, 91, 74,216,148, 51,223, 11, 11,219,176,180,237,175,
+137,167,192,182, 2,176,102,237, 58,161,112,226, 12,105,199, 86, 62,112, 23,240, 64,146, 36,116, 36,192,227, 18,240,247,233,129,
+222,221, 59, 73, 83, 83, 14,139, 54,110,220, 40,180, 87, 9, 88,183,110,157,176,103,240, 89,105,255, 30,183,193,229,232,164,235,
+214,175, 23, 45,122,251,109,187,100, 52, 86,151,193,205, 39, 0, 62,222, 94, 0, 96,252,107,233,190, 54, 29,187,216,244, 6, 28,
+143,127, 27,131,103,127,136,215, 94,154, 6, 0,198,191,150,238,219,112, 48,195, 46,237,154,203,229,162, 67,135, 14,224,114,185,
+ 80,171,213,104,108,108,132, 78,167, 67, 77, 77,141, 67, 47,215,147,199,197, 15,107, 15,192,213, 7,184, 87, 0,252,213, 80,130,
+138,178, 92,252, 28,255,145, 93, 86,127,255, 97, 99,209,161,157,126,138,164,131, 5,242,239,210,165,139,113, 58, 0, 0,138,139,
+139,157, 82,127, 12,147,171, 82,145, 30, 30,248,252,237,183, 0, 0,159,155, 16,255, 47, 57, 57, 77, 7, 19, 59,178,181,206,250,
+104,164,176,102,112,170,244,195, 78,175, 64, 69,142,131, 43, 73, 33,226, 5, 29,126,252,102,175,232,248, 6, 48, 29,204,121, 11,
+ 22, 44,248, 77,161, 80, 96,199,142, 29,202, 57,115,230, 8, 0,120, 2, 32,119,236,216,161,158, 51,103, 14, 79,161, 80, 64, 32,
+ 16, 72, 91, 58,208, 69, 70, 70, 10,143, 29, 59, 38, 53,108,216,210, 98,120,242, 57,255,111,221,231, 31,184,249, 94,223, 5,183,
+191, 79,226,211, 49,126, 94,239, 36, 85,124, 86,175,166, 30, 43, 5,128,222,130,183,166, 38,130,242,247, 79,181,251,183, 15, 25,
+ 50, 68,248,231,159,127, 58, 76, 54,107,214,172, 17,238,219,183, 79, 90, 95, 95,111,241,250,221,187,119,177,111,223, 62,233,235,
+175,191, 46,250,241,199, 31,211,108,180, 23, 98,231,206,157, 63,143,136,124,113,102, 78,214, 57, 94,135,118,109,180, 47,191,190,
+160,201,184,123,242,240,175,232,219,183,111,143,157, 59,119, 78,232,219,183,239, 65, 0, 56,115,230, 76,179,253,131, 73,127,211,
+247, 15, 2,176,145,136,103,192,128, 1,212,145,148,227,200,186,122,221, 88,166, 84,170,240,245,186, 45, 13, 11,231,196,176,132,
+253, 20,227,190, 32,192,213,171, 87, 11, 71,140,159, 42,237,209, 41, 0,174, 46, 28,144, 36,137,178,178, 50, 92,201,206,130, 90,
+ 75,130, 36, 41, 4,248,184, 99,252,132, 73, 82,133, 74,107,247, 23,186,186,148, 35,184, 83, 25,192, 37,208,171,123, 17, 92,121,
+247,236,182,252, 77,201,223, 28,178,186,122,148, 21, 21,192,205, 39,192,170, 87,160, 57,242, 50,199, 79,123,126,197, 91, 83, 6,
+ 99,240,236, 15,209,140,150,125, 31,248,124, 62,184, 92, 46,188,189,189,145,159,159,143,154,154, 26,189, 34,229, 32,249,183,109,
+213, 26,158, 60, 46,166, 46,250, 2, 19,102, 13,195,161,171, 37, 40, 83,160,197,228,111,142,226,210, 50, 92,187,112, 22, 65,126,
+222,122,242,231,113,157, 82,127,207, 79,127, 13, 0,224,199,115,177,139,252, 1,224,255,214,111,192,255,173,223, 96, 36,255,148,
+198, 70,188, 63,126,146,254, 98, 16,159,209,239, 30, 22,215, 85, 56,255,189,231,164,175,119,126, 19, 46, 28, 79,120,192, 29, 28,
+112,209,190,245,112,188,253,249, 82,233,242,164, 30,140,212,136,180,180, 52, 13, 0,252,244,211, 79,114, 0, 2,122, 27,229, 29,
+ 59,118,144, 0,220, 77,183, 85,142,137,137,113,104, 94, 46, 62, 62, 94,104, 79, 57, 3,140, 24, 52,160,191, 60,241,215, 3,226,
+ 1,125, 66,185,141,215, 79,160,160,188, 30,119,107,229, 32, 41,202,161, 64, 96,138,162,168,234,234,113,212,168, 81,163,156,154,
+ 72,204,132,252,225,239,159,234,144,140,140,140, 12, 41, 0,130, 32, 8, 12, 25, 50,196,238, 58, 75, 77, 77,189,143,252, 47, 92,
+184,128, 89,179,102, 25,207, 53, 26, 13,110,222,188, 41,141,143,143,111,214,139,185,115,231,206,183, 71, 68,190, 56,233,203,184,
+ 37,188,196,196, 68,108, 91,183,154,103,240, 24, 25,201, 63, 49, 49, 17,235,215,175, 71,223,190,125, 15,218,234,111,230,228,111,
+173,191, 77, 24,110,240, 2,122,121,216,148,247,237,186, 77, 70,242, 47,175,172, 66,121,101, 21,100,245, 13,112,113,225,121,110,
+218,177, 75, 9,103,109,136,192,226,161, 34, 44, 44,236,190,163, 89, 5, 96,227,198,141, 84, 64,151,126,232,210,198, 23, 74,141,
+ 14, 4, 1,164,164, 28,197,127,127,218,129,203,217,217,120,127,233, 98,112,185, 28,144, 58, 18,222,238,174,232,210,111,132,116,
+237,218,181,140, 59,216,250,245,235,133,189,187,223,145,122,123,202,241,195, 79,229,224, 16, 20, 6,247,253, 91,186,126,253,122,
+187, 58,169, 37,242,167,137, 95, 33,171,106,162, 32,200,234,234,109,202,179,212,153,232,142,148,145,176,178, 9,193,253,180,231,
+ 87, 70,207, 24, 28, 28,140,128,128, 0,212,213,213,129,207,231,131,195,225, 64,161, 80,160,166,166, 6, 92,174,190,147,219,179,
+217,210,254,223, 14, 96,241,218, 99, 56,176,238, 99,180,109,213, 26,238, 30,254, 40,210,149,224,231,248,143,224,105, 24, 52,184,
+ 12,229, 89, 34,127,154,248,101,165,121,232,209,161, 21,234,229, 74,184,186,187, 2, 58,157,205,120, 0, 91,245,247,209,214, 67,
+184,118,241, 60,250,116,235, 5,153,206,182,210, 72,147,255,223,199,142,227,255,214,111, 48,150,167, 52, 54, 34,165,177, 17,249,
+226,255,224,216,245,203,232, 61,184, 27, 80,101,123,107,230,209,203,186, 9, 23,190, 51, 86, 26,228,209, 19, 10,170, 30, 80,149,
+131,175,170,134, 74, 87, 15, 37,169, 0,201,247, 68,251,145,131, 16,177,176, 51,101,203,154,163,231,253,197, 98,177,187, 88, 44,
+ 6,244, 83, 0, 16,139,197, 48,156, 27, 44, 40, 37,118,239,222,109,119,167, 93,178,100,137,112,233,210,165,210, 94,189,122, 81,
+ 4, 65, 72, 1,224,149, 87, 94,161, 58,119,238, 76,125,252,241,199, 14,109,205,236,229,202,217,177,225,195,215,221, 34,219,171,
+184,231,110,150,225, 80, 1, 7, 31, 30,185,167,250, 79, 90,131,172, 81,131,215, 28,145, 89, 83, 19,241, 32, 45,127,248,251,167,
+ 98,246,236,217,118, 79, 17,154, 18, 62, 69, 81, 4,189,157, 52, 83,188,246,218,107,194,123,247,152, 25, 37,106,181, 26, 87,174,
+ 92, 57,217, 92,123, 1, 32,236,208,174, 13, 63, 58, 58, 26, 0,144,153,153,137,147,135,127, 21, 20,151,150,145, 52,249, 27,126,
+187,177,191, 93,185,114, 37,190, 37,253,237,235, 57,147,112, 53,175, 8,109,186,181, 5, 26,229,140,127,123,121,101, 21, 52, 26,
+173, 65,193,209, 66,163,209,162,232, 78,129,160,133,175,149,176,113,206,226, 17,162,137, 43, 74,165, 82, 97, 64,143, 30, 82,119,
+ 55, 23,144, 36, 5, 29, 9,156, 61,125, 6,255,249,252, 11,144, 20,112, 43, 55, 23,151,179, 47,161, 79,159,254,224,114, 9, 60,
+211,173, 3,242, 47, 50,247, 2,240,121,229, 8,237, 82, 10,240, 8, 20,221,213, 0, 60, 2,253,122,220, 65,198,149,114,135,127,
+128,169,123,223,146,103, 64, 33,171,106,178, 26,192, 22, 76,221,251,150, 52,237,140,132,149,136, 88,178,222, 98, 20,187, 41,180,
+ 90, 45,220,221,221,193,225,112,224,231,231, 7,185, 92,142,198, 70,253, 54,192, 65, 65, 65,168,170,170,178, 43, 71,182,178, 6,
+ 24,236,230,134,247,215,157, 70, 68,127,224, 78, 22,240,151,225,218,251,235, 78,227,251, 37, 34,232, 72,157,221,245,119,237,194,
+ 89,227,255, 99,195,123,128,231,197, 65, 74,218,117, 12,232,209, 17,222,158,174,248,105, 95, 42, 6,137,162, 80,108, 97, 21,128,
+173,250, 59,120,157, 2,238, 2, 83,198, 18,216,122, 40, 31, 1,126, 93, 49,109, 56,193,168,254,104,119,127, 74,227, 63, 91, 39,
+ 83,159,198, 3,237,101, 32,230,127, 2,234, 63,159, 3, 28, 5,136,140, 21,244,160, 98,181, 50,131,167,123, 74, 59,251,134,163,
+ 78,215, 0, 85, 77, 46,126, 46,220,137, 51, 83,106,208,107,158, 8,227, 23,121,194,205,239, 25, 8,120,126,224, 77,145, 97,158,
+118, 30,181,109,235, 54,139,131,148, 88, 44,166,104,165,141,195,225,128,162, 40,181, 65,137, 86,114, 56, 28, 57, 69, 81,254, 0,
+ 72,180, 96,121,109,124,124,124, 90,100,100,164,168,170,170, 74,154,146,146,162, 87,124, 82, 82,208,179,103, 79,244,232,209, 67,
+ 68,151,217,131,122, 21,249,206,220,255,251, 62,233,155,168, 54, 28, 74, 41,195,252,132, 28,141, 86,163, 89,175,210, 97, 5, 0,
+135, 54,163,120,241, 69,245, 3, 39,255,132,132,132, 52, 71,172,127,211, 41, 19,130, 32, 48,120,240, 96, 33,211, 93, 37,117, 58,
+157, 93, 10,195,237,219,183, 33,145, 72,136, 77,155, 54, 89,186, 44, 0,208, 11, 0,111, 76,212,180,218,252,252,124,223,204,204,
+ 76, 36, 38, 38, 34, 60, 63,159,147,153,153, 9, 0, 8, 15, 15,199,243,163, 7,193,219,211, 21,235,127, 60, 80, 62,107,214,172,
+184, 77,155, 54, 45,177,183,191,221,253,109, 37,188,122, 11,224,217,125, 49,246,174,156,135,254,125,218,224,153, 73, 95,216,236,
+ 31,178,186,122, 8, 4,174, 0, 0, 23, 23, 30,228,114,165,179,121,134, 37,253, 71, 0, 38,155, 1, 53, 25,168, 72,146,132,187,
+ 43, 31,106, 45, 5,146, 2, 56, 4,240,201,103, 95, 64, 71, 2, 13, 13, 13, 40, 43,187,139,214,173,219,128,162, 72,104,181, 58,
+ 8, 92,120,224,186, 48,115,193,110,216,176, 65,216,189, 75,177, 52,208,175, 78,223, 28, 12, 7, 65, 80, 24,216,251,150,148, 94,
+ 21, 96, 15,104,235,158,118,247,155,147, 63, 19,235,223, 92,139,166,137,127,195,193,140,251,200,159,169,245, 15,232, 3,134, 92,
+ 93, 93,225,227,227, 99,116, 25,210,129,127, 62, 62, 62,104,211,166, 13,180, 90,230,202,211,143,169,167,224,211, 5, 16,134,234,
+207,115,180,122,247, 63,160, 47,251,248, 11, 41,106,213,246, 77,201, 20,151,234,131, 21, 59,181,242,135,151,143, 7,120,222, 92,
+ 40, 43, 21, 0,135,131,182,157, 59,224,108,118,129, 67,245,247,218,123, 95, 98,212,208, 49,224,149, 1, 13,173, 1,119, 14, 7,
+ 67,187,116,133,120, 74,107, 70,114,204,231,250,127,121,105, 30,166,190, 56, 18, 8, 81, 2,151,121,128, 39, 15,152, 28,142, 14,
+155,183, 50,243,198,180,247,135, 90, 93, 13, 66, 85,133,159, 11,119,226,252, 28, 31,140,154, 58, 7, 35, 90, 61, 47,186,122, 76,
+ 11, 45,217, 8, 23,117, 35,180, 61, 72, 84,220, 99, 22, 52,106, 80,222,148,115,230,204,225, 0,168,161, 12, 59, 68, 25,206, 91,
+132,148,148,148,180,158, 61,123,138,220,221,221, 17, 24, 24, 8,119,119,119,164,167,167, 19, 41, 41, 41,105, 14,136,107, 51,105,
+210,164,173, 27,182,252,192,249, 36,173,129,220,119, 46, 23, 42,181,166, 81,169,195, 50,123,200,223,220,229,159,158,158, 78,208,
+199,227, 66,254,150,220,253,246,122, 1, 26, 26, 26,140,255, 95,184,112,193,120, 0,192,210,165, 75,155,156,155,220,239,106, 69,
+ 92, 59, 0, 93, 12, 74,161,251,243,211, 95, 81,154,122, 2,104,203,255,185,225,195, 77,251,219, 33,177, 88,172,180,167,191,197,
+ 78, 30,133,126,225, 61,224,213,223, 11, 37, 39, 10, 1,129, 43,166, 47,250, 23, 6,191,250, 61,163,223,172,213,234, 80,114,247,
+158,150,182,252,105, 20,221, 41,104,233,171,165,172, 28, 44, 30, 3,133, 0,150, 44, 21,202, 48,184,145, 20,160, 35,245, 74, 0,
+ 65, 0,191,238,223,135,169,211,102, 32, 48,168,149,113, 0,164,236,120,151, 92, 78, 57,122,135, 20, 25,207,251,245,113, 55,234,
+134, 3,123,229,131,203,177,223, 11, 96,238,238,183,116,221, 30,235,223,220,221,111,233,186,233, 90,246,230, 80, 87, 87,135,250,
+250,122,168, 84, 42,144, 36,137,138,138, 10,163,251, 95, 46,151,163,161,161,193,174, 41,128, 3,235, 62, 70,218, 85, 64, 86, 0,
+104, 20,192,247,203, 69, 70,247,255,197, 44,224,210,221,179,224,218, 89,127,178,210, 60,248,251,120, 32,192,223, 3,207,132,246,
+ 68,254,237, 10,228,148, 84,161, 83,128, 15, 84,247,202,145,123, 43,183, 73, 46, 0, 38,245, 55, 76,248, 2, 70,136, 98,112, 32,
+105, 47,164,233,123,177,115,205,123,152,254,222, 10, 92,214, 0, 21, 85,229,140,234,207,116,174,255,245, 97, 67, 48,187, 87,103,
+236, 61,112, 18,151, 47, 23, 96,205,149, 76,236,142,248, 23,176,253, 28, 74, 74, 42, 24, 89, 23, 29,148,174,208,169, 43,161, 86,
+235, 35,171, 91,183,239,136, 30, 61,123,138,234,220,244,177, 24, 10, 82, 14,142,170, 17,110,141, 92,220,187,219,188, 2, 64,191,
+ 51,165, 82, 9,165, 82, 41, 0,160, 6,224,165, 84, 42,189,205,151, 4,182,192, 11, 32, 76, 79, 79,151,246,236,217, 19,175,188,
+242,138,168,178,178, 18,211,166, 77,179,103,224, 28,193,231,243, 27, 60, 61, 61,181, 17, 17, 17,119,151, 47, 95,222, 46, 46, 46,
+ 46,255,175,172,203, 19,119, 95, 83,221,212,144,176,123, 63,214, 7,225,242,119, 38,249,155, 91,255,180,194, 66,191, 51,166,177,
+ 0, 46, 46,255,196,168,172, 89,179,198,120, 88, 58, 7,140, 43,124,172,189, 27,190,225,224, 0,224,201, 74,243, 44,186,211,233,
+254,150,117, 49,235,246,172, 89,179, 98,237,233,111, 35,159,125, 6,227,134,135,226,203,207, 86,227,219,181,201,248,127,191,156,
+196,130, 49,131, 80,246,123, 50,100, 53,117, 76,250, 7, 17, 61,229,121,104, 52,218, 44,141, 70,171, 53, 85, 0, 0, 96,197, 39,
+ 31,181,196,130,103, 45,255, 71, 8, 75,115,255,230, 74, 64, 19, 5,128,195,225, 64,214, 32, 7,151, 67, 64,171,213,129,164, 40,
+104, 73,125, 16,105,246,165, 44,140, 25, 27,169,119,147, 81, 20,184, 28, 46,234,229,106,104,213, 42,219,214,255,198,141,194,174,
+237,239, 74,131,252,101, 70, 45, 99,216, 96, 79, 67,140, 46, 1,130,160, 48,160,103,174,116,195,198,141,140,189, 0,180,117,223,
+ 92, 48,160, 67,214,107, 51,193, 53,246,192,207,207, 15, 21, 21, 21,112,117,117, 69,125,125, 61,130,130,130,140, 65,129, 74,165,
+ 18,181,181,181,118, 41, 0,177, 95,238,198,247,203, 69,240,233, 2,164, 93, 5,222, 89, 37,133, 39,143,139,105,239,126,133, 98,
+178, 12, 9,107, 62, 0,151,195, 92, 30,109,253,135,135,135, 34,168, 91, 23,180, 10, 10, 4,159, 67, 64, 75, 80,168,104, 84,160,
+166, 94,233, 80,253,125,187,242, 55,188,216,179, 43,188,189, 3,224, 30,212, 14,154,234, 26,100, 29,218,133,218,234, 66,135, 26,
+241, 15, 43,223, 6,150,140, 3, 79,171, 70,151, 70,160,156, 91,135,239,239,254, 5,240,189, 25,203,184,152,244,135,168,146,163,
+ 64, 33, 95,142, 65, 33, 34,244,250,151, 39,242,253,210,164, 65, 65, 89,210,142, 67,243, 33,227,212, 67, 69, 41, 32,255,133,132,
+192,211,139,137,229,111, 58,192,211,171, 0,248,206,234,184, 71,143, 30, 5, 0,204,158, 61, 91, 20, 31, 31,159, 54,117,234, 84,
+163,197,200,132,252,131,130,130,142,108,221,186,213, 67, 34,145,112,151, 44, 89,130,197,139, 23, 83,231,206,157, 27, 10, 32, 69,
+161, 69, 79, 0,127,218,251, 76, 98,177,159, 85,183,191,163, 1,129,206, 36,127,115,130, 55, 85, 88, 40,138, 34, 12,129,129,182,
+251, 69,113,241, 57,250,255,157, 59,119, 26, 15,243, 50, 26,254,254,254, 16,139,197,214, 6,193, 98, 0,181, 0, 56,197,165,101,
+ 56,127,254,188,113,206, 63, 60, 60, 28,128,126,251,237, 61, 7,147, 81, 83,175,148, 3, 88, 33, 22,139,117,246,244,183,223, 15,
+124,138,200,229,139, 48,113,226, 88, 4,186,114, 81, 79, 80, 72,201, 41,194,249,171, 37,118, 17,245,194, 57, 49,207,230,231,230,
+242,138,238, 20,128, 62, 12,228, 15,214,106,127, 50,137,223,188,204, 18,154,196, 0,184,186,186,226,214,245,203,162, 46,237,252,
+165,110, 46, 60,232,116, 36, 8,130, 0, 65, 0,177,226,183, 64, 81, 36,116,134,124, 0,114,165, 18, 55,114,242,193,231,219,140,
+234,134, 86, 83,141, 1,189,110,155,142, 24,120,115,201,109,236,255,165,187,177,105, 13,234,147,135, 63,178,123,218,109,253, 91,
+ 34,126,133,172, 10, 0, 28,178,254, 45,117,180,140,132,149, 0,192,216,250, 7,244,235,252,219,180,105, 3,149, 74,133,123,247,
+238, 65,167,211, 33, 48, 48, 16, 85, 85, 85, 8, 12, 12, 52,212, 43,115,194,174, 40,203,197,199, 95, 72, 33, 43, 0,190,121,111,
+ 36, 26,180, 58, 44, 93,149,136,239,150, 71,227,189, 53,135,192, 35, 8,216,193,255,144,149,230,161,109,160, 47, 92,224, 2, 29,
+ 8,220,189,125, 13,119,202,101, 8, 14,242,199,239, 23,207,225,198,117,216,109,253, 79,159,187, 20, 46,254, 0,135, 11,236, 72,
+190,141,253, 27,223,199,220,149, 18, 44,157,220, 31,111,141,237,108, 87,253,165, 52, 54,226,219, 41, 51,129, 90, 1, 64,184, 0,
+223,174,198,140,191, 78,227,216,216,133, 32,190, 90, 4,226,143, 15, 24, 91, 24,151,238, 6, 96,136, 66,134, 6, 55, 46,228, 2,
+ 1,130,167,187, 64, 69, 41, 32,227,184, 64,139, 80, 80, 58, 57, 52,149,119,113,118,157, 12,179,103, 5, 35, 77, 42,125,232,157,
+ 54, 54, 54,150, 2,128, 45, 91,182,208,174,126, 98,201, 18,253, 52,240, 47,191,252,194,244,205, 14,111,215,174,221,209,175,190,
+250,202,227,214,173, 91,112,113,113,129,183,183, 55, 46, 95,190,172, 1, 80,209,146,231,107,110, 77,190, 35,222, 1,103,146,191,
+185,245,175, 39,230,251,151, 15, 26,150, 7,166,217,120,174, 91,123,246,236, 25,198,116,122, 78, 32, 16,204,181,174, 52,137,235,
+ 71,143, 30,125, 27, 64,120, 78,214, 57,152,206,249,191, 57,119, 38,142,118,235,134,196,196, 68,100,102,102,226, 72,183,110,238,
+179,102,205,250,241,212,169, 83,140,251,219, 75,227,134,192,135,244,131, 28, 46,216, 31,191, 8, 27, 15, 93,194,251,207,143,192,
+156, 53, 59, 49, 99,197,207,246, 90,224,196,138, 79, 62,178,148, 8,136, 50, 81, 2, 88,139,254, 41, 67, 19, 15,192,155,111,190,
+ 73,212,222,205, 69, 94, 81, 21,120, 46, 92,104,117, 36, 52, 90, 29, 46, 94,204,196,127,255,251, 35,212, 58, 10, 26, 29, 74,253,
+203,119, 0, 0, 32, 0, 73, 68, 65, 84, 9, 62,143,131,242,154, 6,148,220, 56, 47, 90,188,120,113,179, 29,106,227,198,141,194,
+158,193,119,254,177,254, 13,237,106,255, 47,161,250,246,196,161, 0, 14, 5, 14,135,196,208,254, 55,164, 27, 25,120, 1, 44, 89,
+255,166,171, 0, 60,252,219,216, 69,254,150,172,127,211,168,218,136, 37,235,237, 34, 47,253,160, 88,131,134,134, 6,184,184,184,
+ 24,173,127,146, 36,141,127,237, 85, 0,126,142,255, 8, 23, 75, 78,193,179,141, 62,232,207,139,199, 69, 69, 89, 46,188, 93, 93,
+ 80, 91, 93, 12, 46,135, 0,143,195,108,250,153,182,254, 59,250,123,225,122,254,109,104,213,106,184,242,248,104,104, 80,226,119,
+233, 57, 12, 18, 69,217, 69,254,116,253,189,240,246,231, 72,248,254, 59,200, 73,160, 99,112, 7, 92,189,246, 7,150, 78,238,239,
+ 80,253, 1,192,210,224, 65, 72,186,117, 18,144,105, 1, 65, 32,142,103, 92, 7,241,213, 34,122, 96, 98, 92,121,167, 86,231,167,
+157, 61,158, 1,168,235,209, 64,212,163,134,211, 0, 25, 79, 3,141,174, 14,174, 74, 57, 4,165,183,177, 59,238, 22,186,132,133,
+194, 90, 0,160, 57,220,220,220, 76, 73, 0, 2,129,192,226, 53,166,216,186,117, 43,182,110,221,218,162,206,236,229,229,245, 78,
+110,110,174,135,183,183, 55,220,220,220,224,239,239,143,138,138, 10, 16, 4, 33,119,230,160, 65, 91,252,209,209,209, 20,160, 15,
+ 8,180, 39, 40,208,217,228, 63,100,200, 16,161,173,128, 90,166,177, 0, 30, 30, 30,177, 60, 30, 47,207,188,124,205,154, 53, 77,
+ 44,127, 0,232,220,185, 51,198,141, 27,183,195,150,253, 83, 92, 90,214, 36,218,255,227,255, 91, 2, 87, 30, 31,173, 91,183, 6,
+ 29, 19, 96,184,238, 97, 79,127,155, 39,236,135,197,171,191, 67,253,189,114, 4,121,183,194,181,235,133,152,179,102,167,221,253,
+195,140,240, 9,179,207,155,202, 97, 61, 1, 79, 0, 46, 93,186,212,108, 50, 32,171, 30, 0, 0, 88,182,108, 89,218, 55,171, 9,
+ 17, 69, 77,145,118,105, 23, 0, 47,119, 87,244,234, 19,134, 94,189,251,131,199, 1, 26, 20, 58, 20,222,173, 70, 70,218, 97,145,
+167,135,187,205, 47,104,148,203, 17,218,249, 46,148, 42,129, 33,107,139,190, 25,185, 9,148,160, 40,160,186,214, 21, 32, 0, 47,
+ 15, 45,250,134, 22,224,244, 5,219, 89,236, 76,173,127, 83,139,223,205, 39, 0, 46,148, 6,208,254, 51,222,233,120,182,159,209,
+212,250, 55,181,248,233,178,220,107, 89,198,123,153,100,217, 51, 85, 2, 0,160, 77, 27,189, 50, 82, 93, 93, 13,111,111,111,163,
+251,223, 30, 5,128, 86, 2,128,175,176, 48,122, 52,240,253,105,108,252,119, 20,102,188,247, 29,118,174,124, 11, 60,130, 0,223,
+149,217,138, 29,218,250,191, 94, 88,142,144,142,129,216,190,109, 55,186,116,233, 2,159,118,193,232,223, 46, 24, 26,213, 63,238,
+127, 23, 6, 50,105,235,255,139,185, 99,241,206, 39, 59,208,177, 27,209,162,250,163,173,255,241, 7,126,192,177,217, 49, 32, 58,
+ 12, 5,160,207, 10, 8, 0,183, 27, 27,141, 74, 98, 14,152, 37,240,217, 48, 39,143, 24,189,140, 18, 6, 79,171,151,118,233,222,
+ 7,117,110,192,109,220, 65,125, 65, 5, 42, 86,232,208, 80,211, 1, 55,207,230, 48,126, 33, 36, 73, 18,110,110,110,148, 66,161,
+128,137,229, 73,185,185,185,129, 36, 73,226, 81, 12,150,245,245,245,223,188,245,214, 91, 83,182,110,221, 42,240,241,241,129, 84,
+ 42,197,218,181,107,235,212,106,245,243,206,252, 30,218,226,167,151,203,217, 27, 8,152,152,152, 72, 24,146,252,180,152,252, 1,
+192,132,216,109,214,185,173, 12,131, 98,177, 88, 45,145, 72,134,238,221,187,247,114, 99, 99, 99, 91,141, 70,191,204,212,156,252,
+123,245,234,133,161, 67,135, 78, 18,139,197,182,190,147, 39, 43,205,195,151,159,126,140, 95,147,142, 32,114,196, 64,156, 72,253,
+ 67,111,192,180, 11,134, 79,187, 96,132,231,231,227,249,233,175, 84, 22, 86,201,199, 3,216,199,212,250, 95,188, 37, 9,113,111,
+140, 71,187, 54, 66,163,114, 97, 94, 15, 45,204,166,200,122, 2,158, 34,165,128,145, 2, 0, 0,239, 47,123, 47,237,155,111, 72,
+209,237, 14,207,160, 91,247,158, 82,111, 15, 55,144, 20,160, 80,169,145,159,159,143,138,252, 75, 34, 47, 79, 15, 44, 92,184,208,
+102,199,117, 19, 8,176,247,232,104, 17, 29, 1,223,172, 59,130,195,129,135, 7,115,235,137, 94, 2,232,225,223, 6,164, 78,163,
+ 39,127, 3, 52,132,139,205, 20,187,230,160,151,212, 68, 44, 89,223,132,180, 28, 33,127, 83, 37,192, 52,241, 79,117,117,181,237,
+ 23, 96, 67, 9,248,217,100,149,240,214, 21,111,254,115,162,105,128, 39, 67, 57, 29,253,189,176,247,194, 37, 92,189,249, 55, 6,
+137,162,154,144,190, 61,228, 79,227,133,183, 63,199,254,129, 30,120,123,106, 15,167,212,223,210,224, 65,120,239,224, 94, 16, 95,
+126,130, 35,173,135, 96,109,195,213, 38,215,167,249,248, 98,165,172,214, 46,226, 56,181, 58, 63,205,143, 23,129,226,154, 60, 84,
+ 84,221,197,189, 28, 79,112,117,222, 24,222,111, 36,118,159,221,253, 72, 7, 53, 39,101,251,187,240,227,143, 63, 70, 16, 4,113,
+252,187,239,190, 19,188,248,226,139,117,114,185,124, 60, 28,152,243,111, 14,206, 88, 2, 40, 22,251, 57,133,252, 45, 88,169,182,
+148, 15, 6,207, 38,174,148, 72, 36,193,245,245,245, 95,102,102,102, 46, 41, 41, 41, 65, 99, 99, 35,248,124, 62,218,182,109,139,
+160,160,160, 23, 37, 18,201,239, 63,255,204,104, 75,128, 27, 0,194, 59,250,123,225,185,231,158,195,165, 91, 37, 8,236,218,187,
+ 73,127,123,126,250, 43,114, 0,235,190,140, 91,178,143,233,239,152, 39,236,135,136,212, 63, 49,251,147,255, 98,212,168, 81,104,
+221,186,181, 69, 69,203,137,175,157,112,128,252,169,102,202, 89, 37,226, 17,144, 62,163, 84,192, 0,240,254,251,239,167,109,216,
+176, 65,120, 49, 45, 71, 4,232, 35,105, 41,138,130,171,171, 43, 62,120,127, 25,227, 78,251,182,157,105,126,153,130,118,245,115,
+181,114, 64, 43, 55, 70,192,211,196,111,239, 90, 44,218,213,159,123, 45, 11,185,215,178, 16, 20, 20,132,138,138, 10,135,136,223,
+ 39,168, 29,212, 12,130, 35,153, 98,246,231, 63,227,220,105,231, 85, 99, 65, 65,129,113,183, 63,141, 74,121, 31,249,219, 67,252,
+ 52,254, 53,208,195,105,245, 7, 0, 68,252, 7, 70,226,167,201,255,118, 99,163,104,154,143, 47, 82,128,180,149,178, 90,135,126,
+251,111, 43,143,155, 12, 60, 10, 0,192,238,107,204, 19,246, 80, 20, 69,184,186,186, 26,189, 0,244,255, 0,224,234,234, 74, 88,
+250,255, 33,227,204, 15, 63,252, 48,106,223,190,125, 75,235,234,234,226, 1,100, 56,251, 11,156,177,244,207,201,228,228,116,136,
+197, 98, 5,128,165,134,163, 69,239,227,202,149, 43,195, 1,116, 13,236,218, 91,174, 81, 41,221, 13,253,173, 14,128, 12,192,141,
+ 78, 1,238, 47,137,197, 98,187, 26,116,196,199, 91, 31, 22,241, 59,164,104, 57,120, 63, 11, 39, 32, 44, 44,140, 17,249,219, 52,
+ 64, 91,186, 83,223,131, 0, 61,183, 79, 19, 63, 90, 72,252,244,220,180,172,188, 24,178,242, 98, 4, 5, 5,181,200,226, 7, 0,
+173,142,180,219,251,208, 28,202,171,101, 14, 63,139, 57,232,185,125,103, 17,255, 3,168, 63, 2, 0, 34, 61, 60, 40, 83,171,127,
+ 0,207,165, 69,196,255, 63,134,191,234,234,234, 98,216,106,120,244, 56,117,234,148, 68, 34,145,252,183,176, 74, 46,215,168,148,
+166,243,145,222,157, 2,220,253, 28,216,253,143, 0,244, 83, 25, 79,154, 82,197,226,225, 42, 1,140, 26,147,163,251, 8,179, 96,
+193,130, 5, 11, 22, 44,158, 92,112,216, 42, 96,193,130, 5, 11, 22, 44, 88, 5,128, 5, 11, 22, 44, 88,176, 96,193, 42, 0, 44,
+ 88,176, 96,193,130, 5, 11, 86, 1, 96,193,130, 5, 11, 22, 44, 88, 60, 21,104,178, 10,224,210,165, 75, 14, 71,145, 90, 10, 38,
+100,229,177,242,156, 37,207,176,183, 58, 7, 0,105, 41,249, 10, 91,127,214,229,133,133,133,209,117, 71,175,229,166, 46, 93,186,
+ 68,178,245,199,202, 99,229, 61,189,242,236, 86, 0,158, 18,180, 40,201, 68,116,116,180, 16,128,105,202, 80, 81, 98, 98, 98, 26,
+171, 43, 62, 26,124,253,245,215,175, 94,185,114,165,255,249,243,231,223,115,117,117,133, 92, 46,255, 64, 34,145,172,102,144,129,
+141,197, 63, 3, 11, 5, 64,199,214,196,227,141,168,168, 40,225,225,195,135,211, 28,252,172, 40, 57, 57,249,164,147, 18, 74, 33,
+ 42, 42,234,165,228,228,228,221,155, 55,111,246, 7, 80, 15, 64,199,246,185,167, 15, 79,213, 20,128,129,188, 91,244,249,189,123,
+247,154,231, 11,151,182, 68,110,116,116,180,208,176,102,151,138,142,142,166,236,149, 69,217, 9, 75,235,131, 91, 40, 79,248, 40,
+222,165, 68, 34, 33, 22, 45, 90,180,250,218,181,107,223,119,238,220,249, 61,129, 64, 0,149, 74, 5, 0, 95,239,223,191,159,156,
+ 58,117,170,232, 17,117, 25,202,254,227, 97,202,179,186, 7,187,233, 94,236, 14,237,207, 30, 29, 29, 45,164, 40,138,162,254,159,
+101,217,244, 53, 91,109,208, 18, 10, 10, 10,168,130,130, 2,167, 17, 76,117,245,184, 38,251, 21, 56,155,168, 9,130,176, 75, 46,
+ 73, 82,148, 78, 71, 81, 36,105,249,136,138,138, 18, 38, 39, 39, 59,180, 11,213,150, 45, 91,198, 28, 57,114,228,228,232,209,163,
+ 65, 16, 4,181,107,215,174,113,246, 62,155,249,113,228,200,145,221, 47, 15,227, 67,188, 64, 92,157,231,153,191,111,254,252, 88,
+146,190,102, 75, 94, 99, 99, 35,213,216,216,216,108, 59,164,239,121, 16,239,135,133, 85, 67,224,190, 4, 65, 60, 27, 29,222, 98,
+222,108, 91,249,180, 31, 33, 90,180,141,219,222,189,123,165, 51,103,206, 4,160, 79,170, 97,210, 56,165,142,120, 21,104,133,130,
+206,249,111, 72, 67, 42,141,142,142,182,207,171,144,232,111,199,183,218,238,251,141,147,223,100, 46,206,254,125,109,172,117,104,
+198,245, 39,145, 72, 8,153, 76,182,167, 79,159, 62,211, 1,112, 40,138,130,155,155, 27,202,203,203, 81, 91, 91, 11, 31, 31, 31,
+148,151,151,159,156, 58,117,170,232,192,129, 3,105,118,190, 19,138, 78, 7, 75, 16, 4,166, 79,159,142,113,227,198,137, 22, 44,
+ 88,192, 88,206,193,131,191, 25,255,159, 50,229, 69,155,231,182,160, 56,247,246, 63,213, 61,108,125,147,115,243, 50,183, 97,182,
+ 55, 85,162,183, 19, 54, 69,122,122, 58, 86,172, 88,113,223,187, 24, 57,114, 36,117,250,244,105, 70,109, 57, 49, 49, 81,138, 79,
+ 8,250,252,254,196, 51,159, 16, 45, 30,204, 31,227,177,165,137,165, 45,145, 72, 68,177,177,177, 24, 53,106, 20,117,230,204, 25,
+ 70,159, 61,103, 37, 39,227,129,196,247,144,156,156, 44,165, 55, 9, 27, 53,106, 20, 85, 87, 87,215, 28,225, 11, 99, 99, 99,141,
+237,245,247,223,127,119, 39, 8, 2, 49, 49, 49,247, 0,180,158, 53,107,214,113,137, 68,194,177,199, 98, 95,125,124,181,241,255,
+178,148,187, 32, 8, 2, 59,223,117, 7, 64,224,155, 87,190,126, 33, 48, 48, 16, 0,176,235,167,157,140,235, 42, 60, 60, 28,221,
+186,117, 99,153,247, 49, 33,127,123, 61, 0, 84, 98, 98, 34,194,195,195, 41, 43, 3, 40,229, 64,231,118,170, 53,105, 46, 47, 49,
+ 49,209,116, 67, 12,187, 65, 16, 4,145,152,152, 72,208, 3,144,225,175,195,150, 38, 77,254,134,103, 34, 76,158,205,110, 69,133,
+152, 89, 99, 60,152,148,219,130,231,161, 77,198,131, 73,185, 61,228, 79, 81, 20,232,221,217, 40,202,190,102, 34,145, 72, 56, 53,
+ 53, 53,255,245,241,241,153, 14,128, 51,119,238, 92,204,158, 61, 27,124, 62, 31,110,110,110, 16, 8, 4, 32, 8, 2, 92, 46, 23,
+ 50,153,140,113, 61, 70, 68, 68, 8, 1, 80,251,246,237, 3,253, 78, 40,138,194,254,253,251,177, 96,193, 2,169,225,250, 99, 7,
+ 75, 10,193,163,240,172, 37, 38, 38, 74, 1, 16, 47,221,156,137,153, 55, 44,246, 49,106,230,141,104, 17,241,153, 67,253,142,122,
+255,253,247,209,181,107, 87,167, 60, 47, 65, 16,148, 88,236,135,128,128, 19, 78,173,135, 9, 19, 38,140, 77, 77, 77, 61, 73, 81,
+ 20, 17, 27, 27,155,102, 15,249, 91,195,129,196,247, 16, 31, 31, 15,146, 36,241,222,123,239, 49, 82, 40, 76,201, 31, 0,142, 28,
+ 57,146, 52,106,212, 40, 0,240,139,137,137,209,142, 30, 61, 26, 98,177,152, 52,196,205, 48,241, 50, 54, 57, 95,187,118, 45, 94,
+122, 78,111, 27,238,124,215, 13, 47, 15,227,227,131,200,247, 25,255, 38, 15, 15, 15,140, 26, 53, 10,153,153,153,198,241,212,252,
+160,239, 97,179, 23, 62, 58,242,111, 86, 1,160,201, 42, 51, 51,211,152,118,210,212,122,178,151,104, 77, 6, 17,103, 15, 74,230,
+202,128, 83, 93,195, 22,166, 4,236,134,169, 66, 97,176,254,159,198,118, 70,153, 14, 38, 37, 37, 37,198, 11,197,197,197,140, 21,
+ 70,153, 76,246,149, 92, 46,127,133,195,225,112,102,205,154, 5,153, 76,134,210,210, 82,184,184,184,128,199,227,129,199,227,193,
+197,197, 5,110,110,110, 80, 40, 20, 96,226, 66,220,188,121,179,240,248,241,227, 82,130, 32, 48, 99,198, 12, 80, 20, 69, 43,121,
+196,140, 25, 51, 0, 0,169,169,169, 82,118,168,104,158,252, 13,239, 87,100,170, 36,211,239,222,212,171,229,200,160,158,152,152,
+ 72, 24,222, 11, 54,111,222,236, 20,101,236,163,143, 62,162,141,130, 22,123, 38, 34, 35, 35, 35, 46, 92,184,144,218,165, 75, 23,
+132,132,132, 80,195,135, 15, 55,122, 78, 12,187, 63, 58, 68,254,107,214,172, 1, 65, 16,224,112, 56,184,112,225, 2,152,120, 99,
+204, 60, 18, 47, 16, 4,129,151, 95,126, 89,107, 40, 82,199,196,196,212, 9,133, 66, 44, 88,176,128,156, 56,113,162,205,223,110,
+186, 43,105, 89,202, 93,128, 0, 18,222,249, 39,107,241,206,119,221, 17, 51,220, 21,203,159,255,128,241,115, 49,177,252, 89,239,
+192,195, 35,255,216,229, 43, 45, 94,231, 53,215, 33,195,195,195,169,204,204, 76,208,158, 0,154,184,194,195,195,237,234,228, 15,
+154,252, 77,173,234,199, 61, 96,207,116, 74,224,169,211, 0, 40, 10, 37, 37, 37, 40, 43, 43, 51,150,153,159,219,176,254,185, 71,
+143, 30,157, 24, 26, 26, 10, 46,151,139,220,220, 92, 80, 20,133,191,255,254, 27,106,181, 26, 4, 65,128,199,227,129, 32, 8,232,
+116, 58,200,229,114, 28, 56,112,192,166,220, 19, 39, 78, 72, 1, 96,198,140, 25,247,181, 91,122,170,135, 38, 10, 38,237,218,220,
+173,111,235,156,137,149, 79,195,218,116, 0, 19,215,191, 57,210,211,211, 97,176, 12, 91,166, 0,127, 66,128,248, 76,175,192,153,
+ 42,175, 20, 69, 1,159, 16,152,121, 35,218,225, 64, 89,130, 32, 40,195,123, 49,146,145,225,125, 17, 45,145,215,189,123,247,251,
+200,205, 81,184,186,186, 82,215,174, 93, 67, 69, 69, 5, 81, 81, 81,129,176,176, 48,170,160,160, 0, 92, 46, 23, 90,173,214,161,
+ 47, 24, 61,156, 75, 43, 15, 88,182,108, 25,214,174, 93,139,211,167, 79,131, 32, 8, 76,158, 50, 31,119, 10,152,109,224,120,228,
+200,145,223, 12,239, 88, 9,128, 52, 28,136,137,137,169, 5,224,155,156,156,140,168,168, 40,161,169, 66,222, 28,244,214,255,253,
+251,152,232,167, 3,128, 93, 59,179,236,146,199,226,241, 37,255,102, 61, 0, 6,235,159, 48,245, 4,208,150,127,102,102,102, 75,
+200,223, 86,128,146, 67,242, 76, 60, 19, 66, 56, 16,224,244, 0, 44, 39,202,100,240, 49, 62, 15, 93,230,172,224, 23,106,175,159,
+241,112, 6, 26, 38, 45, 52, 30,118, 88,254, 20, 61,216,118,232,208, 1,131, 6, 13,194,160, 65,131, 0,192,120,110,126,175, 21,
+248,250,251,251,247, 81,169, 84,168,174,174,198,185,115,231,144,145,145,129,138,138, 10, 40, 20, 10,208,115,164, 20, 69, 65,163,
+209, 64,165, 82, 49,154, 98,160,219,134, 53,114, 79, 76, 76, 36, 8,130, 0, 83,207,204,193,131,191, 25, 15, 38,231,182,160, 56,
+247,118, 19,162,167, 15,211,115,211,123,152, 98,212,168, 81, 72, 79, 79,111, 89,131, 48,153,243,135,126, 26, 75,100, 32,103,130,
+190,134, 22,198,222,152,190, 23,218, 11,224, 44, 56,195, 11,208,190,125,123, 20, 23, 23, 19,230,202,174,163,228,127, 32,241, 61,
+ 99, 27,166, 49, 98,196, 8, 0,192,169,179,204, 23,107, 68, 69, 69, 69, 26,230,254,175, 3,144, 27,198,115,250, 48,106,221, 76,
+131, 11,155,206,253, 91, 80,174,236,148,199,226,241, 7,143, 73,231,164, 61, 1,246, 90,254,203,151, 47,167, 86,173, 90,229,180,
+135,181, 37,207, 48, 72, 57,173,113, 50,157, 67,107,142,116, 76,100, 53,136,197, 98, 79,107,215, 29,133,233,220,191, 51,148, 0,
+211,185,127,166, 74,192,236,217,179,225,225,225, 1, 79, 79, 79,120,121,121,193,199,199,135,244,243,243,227, 36, 39, 39,227,213,
+ 87, 95, 53,222, 39, 16, 8, 48,126,252,120, 52,163, 4, 4,168,213,106, 84, 87, 87, 67,169, 84,194,199,199, 7,174,174,174,208,
+106,181,160, 40, 10, 58,157, 14,106,181, 26, 26,141, 6, 58,157,206,174,248, 2, 67,208,154,213,235,166, 86,232,163,132,173,128,
+ 64,123,209, 82, 37,128,248,204,250,116,223,204, 27,209, 6,114,117, 80,182,153,245,111, 82,142, 25, 51,102,216, 29, 12,104,110,
+253,155,202,115, 20,225,225,225,148, 78,167, 67, 88, 88, 24,117,233,210, 37, 34, 44, 44,140,210,104, 52,144,201,100, 14,203,164,
+141, 41, 30,143,135, 37, 75,150,224,194,133, 11,248,103,222,159,121,155, 62,122,244,232,209,145, 35, 71, 2,128,151,129,244,229,
+ 0,176,123,247,238, 86,167, 78,157,242, 54,244, 15,194,240,215,166,224,181,223,173,197,203, 67,239,183,254,103,127, 47,199,238,
+115, 26, 80, 20,133, 1,179, 6, 32,107,103, 22,241, 40,141, 43, 22,206,177,254,109,122, 0,104, 75,149,110,176,166,241, 0, 76,
+176,106,213, 42,218, 98,112, 10, 24,200,115,120,126,221,176, 68,175,201,145,154,154, 74,210,171, 2, 90,106,177,199,198,198,122,
+ 62,205, 13,110,203,150, 45, 88,179,102, 77,147,118, 69,147,255,148, 41, 83, 48,101,202, 20,189,133,115,234, 84,115, 98,252,243,
+243,243,149, 58,157, 14, 53, 53, 53,168,172,172, 68, 77, 77, 13,228,114, 57,228,114, 57, 26, 26, 26, 80, 87, 87, 7,153, 76, 6,
+133, 66, 1,149, 74, 5,157,206,182,197, 68, 16, 4,246,237,219,103,151,194,246, 36, 35, 61, 61,189,201, 97,138, 37, 75,150, 8,
+ 77,207,153,204, 57, 91,152,243,111, 98,185,183, 36,144,203,210,103, 41,138, 34,246,237,219,231,212, 88,128,125,251,246,217,221,
+135, 7, 14, 28, 72,233,116, 58, 99,130,150,176,176, 48,138, 36, 73,220,187,119, 15,141,141,141, 14,253,230,127, 47, 31,141, 83,
+167, 78,129,220,227, 11,138,162, 16, 31, 31,111,124, 71,233,231, 72, 48,157,249,136,138,138,122, 17, 0, 98, 98, 98, 74, 12, 10,
+128,106,215,174,132, 86, 11, 23, 46,108,117,234,212, 41, 76,152, 48, 33,194,158,156, 0,101, 41,119, 65,128, 64,130,137,245, 63,
+235, 59, 57,184, 47,203,176,235,156, 26,139, 23, 47,198,170,163, 95,179,204,250, 20,145,191, 77, 15,128,249,188,191,105, 60, 0,
+211,105,128,196,196,196, 52, 67,128,144,212,204,147,228,232,128,113,159, 60,122, 90,192, 48, 15,233,148, 9,246,113,227,198, 93,
+ 77, 77, 77,237,243, 56,190, 96,218,234,119,150,219,159,182,250,237,112,251, 55, 65, 66, 66,130,241,255,255,252,231, 63,248,241,
+199, 31, 1, 64, 13,128, 79, 19, 63, 0,140, 31, 63,222,150, 2,160, 8, 13, 13,133, 92, 46,135, 90,173, 70, 69, 69, 5, 92, 93,
+ 93,193,227,241,140, 30,128,198,198, 70,200,229,114,168, 84, 42,200,100, 50, 76,159, 62, 93,180,127,255,254,102,159,143,182, 50,
+109, 44,107,197,140, 25, 51,108, 42, 10,122,133,230,193,197, 0, 56,114,221, 28, 38,203,253,238, 67,124,124,188,116,201,146, 37,
+162,248,248,248,180, 71,218,134,173, 88,255,166,176, 39, 22,192,154,245,239, 40, 6, 14, 28, 72, 93,188,120,145, 8, 11, 11,251,
+148,110,218, 58,157,238, 19, 15, 15, 15, 84, 86, 86, 58, 52,198,124,252,225,104,164,165,165,129,216, 23, 0, 0, 56,246,177, 23,
+198,127, 81,143, 81,163, 70,225,203, 85,167, 64, 81, 20, 99,111,197,145, 35, 71, 14,140, 30, 61, 26, 0, 42,118,239,222,217,254,
+212,169,211,190, 20, 65, 97,226,132,137, 83, 14, 31, 62,156,116,248,240, 97, 70,114,104, 47,231,218,181,107,241,242, 48,151,166,
+ 22, 63, 40, 44, 89,188, 4,173,199,183,193,211, 26,183,244, 84, 27,101,171, 62,180,170, 32,132,133,133, 53,175, 0,152, 70,252,
+ 27,200,223, 24, 44, 69,123, 2,152,106,254, 22, 72,187, 69,176, 32,207,233,115, 82,177,177,177,125, 82, 83, 83,157, 57,224, 61,
+173,237,140,128, 62, 10,220,104, 73,191,254,250,235, 0,192, 55,105, 75,198,107,134, 65,203, 26,174, 13, 29, 58,244,213,180,180,
+180, 68,157, 78,135,186,186, 58,104, 52, 26,227,188,191, 82,169, 52, 46, 49,164, 3, 3,247,239,223,159,198,160,189, 16, 48, 44,
+ 1, 52,111,183,209,209,209, 20, 77,250,227,198,141, 19, 49, 81, 0, 30, 84, 30, 0,211,185,127, 83,242, 55,159, 22, 96,240, 62,
+154, 3, 21, 31, 31, 47,125,233,165,151,176,103,207, 30, 71,189,101, 66, 83,207, 9,125, 78, 7, 12,206,188, 17, 77,221,186,117,
+203,234,231,233,132, 63, 71,143, 30,181,234,177,187,125,251, 54, 99,207, 76,117,245, 56, 10, 0, 34, 34,242,145,159,159,111, 49,
+186,188,170,106, 44,128, 26, 0,182,199,173, 94,189,122, 81, 23, 47, 94, 36, 12,131,229,167, 0,192,225,112, 62,185,115,231, 14,
+106,106,106, 28,234,200, 28, 14,161, 87,216,105,242,191,172,197,143, 82, 53, 0,224,203, 85,167,236, 30, 35,232, 62,177,112,225,
+194, 48,138,162, 16, 53, 41,106,250,161,164, 67,191, 50, 37,126, 83, 81, 47, 78,125,225, 58, 65, 16,189, 40, 10,224,190, 44, 3,
+ 69, 81, 88,178,116, 9,218,140,111,219,194,188,170,250,101,189,116,187, 99, 51, 9, 62,126,104,110, 21,128,113,240, 54, 91,198,
+ 70, 37, 38, 38,218,237, 50, 53, 33,109,167, 60,184,169, 60,122,253,255, 83,186,188,238,137,128, 89,221, 55, 89, 34,102,229,218,
+125,131,129, 88, 44,214, 74, 36,146,253,163, 71,143, 94,148,156,156,188, 78,171,213,162,182,182,214, 24, 3, 0, 0, 21, 21, 21,
+168,173,173, 5, 69, 81,176,167, 61, 69, 68, 68,136,142, 31, 63, 46, 77, 76, 76,108, 98,125,210,159,143,136,136,176, 43, 25,208,
+131,128,226,220,219,142, 16,254,125, 4,111, 99,200, 38, 8,130,160, 28, 33,127,131,167, 45,205, 82, 95, 4, 0,147,160, 64, 70,
+ 88,176, 96,129,148,193,119, 50, 54, 52, 76,167, 42,239, 39, 34,102,201,241,186,118,237, 74, 93,191,126,157,118,249,127, 10,224,
+ 19,149, 74,133,188,188, 60,200,100, 50, 71,169,144, 34,247,248,225,216,101,253, 74,189, 29, 82, 53,118,159, 83,131,162, 40,156,
+ 62,239, 56, 39,166,167,167, 99,194,132, 9,162,195,135, 15,167, 29, 74, 58,228,168, 24, 14, 73,146, 46, 0,176,231,188, 6,139,
+ 23, 47, 70,155,200,182,204,213, 73, 11,104,108,108, 4, 0,228,231,231, 83, 91,182,108, 49, 42,100,166,177, 36, 59,118,236, 48,
+ 29, 31, 88,247,130, 19, 65, 91,247,150, 44,127,243,235,205, 77, 1, 16,134, 41,128,251,150, 77,217, 51, 5, 96,113,160,112, 30,
+233,152,202,115,234,250,127,122,238,223, 81,216, 82, 72,236, 85, 88,172,185,251, 29,157, 6,176,230,238,119,112, 26,192, 52, 40,
+136,176,227, 26, 44, 40, 1, 20,128,245, 18,137,100,115, 66, 66,130,134,207,231, 67,165, 82, 65,171,213,130, 36, 73,248,250,250,
+162,166,166, 6,246,102, 83, 60,126,252,120, 26,244,235,254,169,125,251,246,193,160, 8, 24,151, 6, 30, 63,126,252,127, 98,112,
+120,233,165,151,168,198,198, 70, 28, 58,116,200,222,246, 44,180, 81,223,212,204, 27,209, 34, 38,222,184,247,223,127,255, 62,227,
+194, 28, 31,124,240, 1,197, 52,200, 83, 44,246,179, 41, 79, 44,246, 99, 36,204,205,205,141, 30, 36, 41,138,162, 32,151,203, 81,
+ 90, 90,234,240,156,191, 41, 34,191,168,111,114,222, 18,242,215,233,116, 4, 0, 56, 96,241,155,131, 60,248,123, 82,119,211, 76,
+128,206, 66,115, 10,153,137, 2,192,226,113,244, 0, 24, 94, 28, 97, 79,249, 35,182, 64,211, 30,179,231, 33,236,176,152,109, 40,
+ 34,227,156,246, 92, 51,103,206, 20, 57,144,222,183, 89, 11,205,130, 5,218,156,117,202, 40,104, 76, 44, 22,107, 1, 16,211,167,
+ 79, 23, 22, 22, 22, 74, 21, 10, 5,116, 58, 29,122,245,234, 37, 26, 52,104,144,195,239,123,223,190,125,166, 75,206, 28,242, 26,
+ 61,232, 24, 0, 91,231, 76,244, 69, 67,116,120, 83,194, 57,125,218,110,183,191, 97,173, 63, 53,243,198,253, 10, 28, 69, 81, 20,
+157, 35,192, 68, 33, 51, 6,204, 57,218, 55, 0, 96,239,222,189,132,179,250, 26,211,123, 0,160,186,186, 26, 93,187,118,165,234,
+234,234,208,185,115,103,100,103,103, 59,101,172,227,188, 84, 3,130, 32, 48,229,133, 88,218, 13,131,213,171, 22, 24,255,183, 55,
+ 99,166,179, 32, 22,139,201,205,167, 54, 59, 85,230,156, 57,115, 12, 94, 23,137, 39, 0,173,225,160,196, 98, 49,105,114, 15, 59,
+ 29,240,184, 43, 0, 79, 16, 90,220, 73, 31, 87, 55,148,179,159,235, 1,120, 97, 30,104,189, 25,230,248,141,223,113,227,198,141,
+ 71,252, 70, 72,226,241,150,167,175, 43,123, 51,202, 89,197, 39, 77,246,177,160, 44, 93, 51, 88,222,105, 79,195, 64, 82, 86, 86,
+102,124, 31,249,249,249, 78,123, 39, 18,201,102, 74, 44, 94, 64,252,254,155,132,209, 7, 28,221,222,213, 17, 24,150,245, 57,125,
+ 76,104, 78,185,102,221,254, 15, 31,150,166, 6,136,135,217,208, 88,176, 96,193,130, 5, 11, 22,143, 7, 56,108, 21,176, 96,193,
+130, 5, 11, 22,172, 2,192,130, 5, 11, 22, 44, 88,176, 96, 21, 0, 22, 44, 88,176, 96,193,130, 5,171, 0,176, 96,193,130, 5,
+ 11, 22, 44,158, 10, 52, 89, 5, 64,231,188,118, 4,150,130, 9, 89,121,172, 60, 86,222,195,147, 23, 23, 23,215, 84,187,231,112,
+140,217,229, 76,151,154,209,217, 20, 77,151,158, 89, 74, 31,236,233,233, 9,129, 64, 96,252, 60,135,195, 1,151,203,189, 79, 30,
+189, 49, 19, 73,234, 87,121, 89,219, 44,135,125,191,214, 33,145,108, 17,114,121,174,160, 72, 45,230,207,127, 35,205, 17,121,155,
+ 55,111, 22,101,103,103,243,194,194,194, 82,205,179,238, 57, 40, 79,152,157,157,141, 77,155, 54,165,177,253,237,201,147,103,183,
+ 2,240,191,136,192,192, 55,154, 84, 92,101,229,118,226,177,146,247, 70, 32, 5, 0,149,219, 43, 9,211,255, 91, 32,178,133,201,
+ 61, 31,184,188,255, 89,108, 93,183, 70, 88,113,245, 28, 70,249, 85, 72,219,107,139,144, 67,117,197,133, 70,127,145,119,232, 16,
+ 44, 90,186, 44,205,214,231,207,156, 57,131, 17, 35, 70, 24,137,159, 38,108,130, 32,238, 35,108,146, 36,141,199,157, 59,119, 44,
+202,187,120,241, 34,194,195,195,225,230,230, 6, 30,143, 7, 46,151,219, 68, 38, 77,250, 58,157,206,120,168, 84, 42,100,102,102,
+ 34, 36, 36,228,169,123, 63, 18,137,132, 16,139,197,212,230,205,155,133,127,255,253, 55,110,221,186, 37,245,245,245,197, 47,191,
+252,210,162,246,191,101,203, 86,161,171,192, 31,190,126,207, 72, 27, 27, 74, 68, 91,182,108, 19,110,220,104, 95,238,135, 77,155,
+ 54, 9, 19, 19, 19, 79,230,228,228,224,208,161, 67, 8, 13, 13,197,123,239,189,199, 53, 93,123,239,128, 60,105,126, 94, 46, 66,
+130,187,129,239,234,138,197,139,151,140,137,141,141,101,183, 2,126, 90, 61, 0, 79, 18, 34, 34, 34,108,106, 60,199,143, 31,183,
+217, 49,105,130, 54, 39,110, 71,225,108,121, 15, 0,132,157,164,109, 51,181,172,147,229, 49,249,188,249,247, 63,217,196,178,121,
+179,240,250,153, 99, 40,220,253,141, 84, 46, 87, 65, 51,132, 3,183, 14, 4,186, 23, 94,198,179, 94,148,180,166,226, 47,180,219,
+252,255, 68,211, 23,124,214,172, 18,112,253,250,117,112,185, 92,140, 28, 57, 18, 60, 30,207,120,208, 10, 1,109,245,107,181, 90,
+232,116, 58,104, 52, 26,220,185,115, 7, 39, 79,158,180, 40, 79, 46,151, 35, 43, 43, 11, 67,135, 14, 5,159,207,135,139,139, 75,
+ 19,153, 36, 73, 66,171,213, 66,171,213, 66,163,209, 64,161, 80, 32, 43, 43, 11, 13, 13, 13,143, 3, 89,115, 12,109,131, 3, 64,
+219,146, 60,244, 18,137,132,136,139,139, 35,227,226,226, 16, 16, 16,128,127,255,251,223,152, 49, 99, 6,234,235,235, 17, 16, 16,
+224, 80, 6,210,128,128, 0,227,243,124,244,209,135,248,121,103, 38,220,220, 90,129,203,229, 75, 27,234,139,236,150,153,145,145,
+129,134,134, 6, 12, 29, 58,244,206,184,113,227,218, 86, 85, 85,225,216,177, 99,186,249,243,231, 99,235,214,173,205,246, 17, 85,
+ 65,238,125,117,115,229,230, 77,164,121,185, 99,105,252,103, 69, 3, 6,246,233,120,183,184, 28,199,146,211, 78,238,218,181,123,
+ 92, 76,204,203, 39, 88,234,124,252, 65,167,254, 53,243, 20, 48, 82, 0,204, 83,183,218, 58,127,232,228,255,230,155,111, 54,123,
+ 79, 77, 77, 13, 0, 80, 76,148, 0,154,172, 91,106,173, 63, 8,121,166,150,191, 19,172,127,123, 73,155, 41, 89, 59, 91,158,233,
+189,166,127, 1, 0,213,213,250,204,136,254,254,169, 79, 69, 71, 45,248, 51, 21, 33, 69, 82,105,145,156,196,180, 16, 46,158, 9,
+210,130,244,167,224,226,207, 69,125, 21, 31,110,245, 10,244,204, 94, 47,253, 57, 62, 78,244,234,146, 21, 86,149, 0,130, 32,112,
+227,198, 13,240,249,124,140, 25, 51,198, 72,218, 46, 46, 46,224,112, 56,160, 40, 10, 26,141, 6, 90,173, 22, 42,149, 10, 69, 69,
+ 69,144, 74,165, 86,183, 84,230,112, 56,208,104, 52,200,206,206,198,200,145, 35,225,230,230, 6, 87, 87, 87,163, 60, 90, 1, 80,
+169, 84,104,104,104,192,149, 43, 87,160, 84, 42,141,211, 4, 76, 16, 19, 19, 35,228,114,185,210,250,250,122,240,249,124,148,151,
+151,191, 61,109,218,180,122,129, 64,240,179, 35,164, 29, 19, 19, 51,147,203,229,238, 73, 78, 78,166,229,229, 76,155, 54,237,111,
+137, 68, 50, 67, 44, 22,171, 29,177,132,227,226,226,164, 43, 86,172, 40, 7,208, 10,208, 79,181, 92,191,126, 29,173, 90,181, 66,
+ 88, 88, 24,126,250,233, 39,187,201,255,135,185,115, 49,113,192, 0, 0, 64,155, 69,139,224,230,222, 26, 13,117,133,168,147,229,
+137, 98, 99,231,165, 89,203,231,110, 13,253,250,245, 67,121,121, 57,206,156, 57,211,153,195,225,224,202,149, 43,240,247,247, 71,
+122,122, 58, 94,123,237, 53, 42, 59, 59,187,217,207, 87,125,181,180,201,185,167, 90,131,118, 90, 37, 22,191,255, 73,199,248,213,
+255,193, 55,171, 55,162, 61, 71,135,141,171,215,164,190,246,218,107,176, 37,143,197,227, 71,254,116, 57,211,189, 0,238,203,255,
+109,235,252, 97,194,153, 59,245, 61, 9, 48, 85, 2, 30,146, 39,192, 94, 75,157,176, 97,157, 59, 34,207,210,223,167, 42,113,213,
+119,171,190, 20,134,102,255, 32, 45,231,234, 16,226, 3,116,238, 68,129,219,143, 15, 94,183,110,224,171,148, 80,157, 45,130, 74,
+198, 3,151,116,129, 50,245,103,233,214, 13,171, 69,243,223,178, 60, 29, 64,187,231,115,115,115,225,231,231, 7,145, 72, 4,129,
+ 64, 0, 62,159, 15, 30,143,103,180,250,149, 74, 37, 74, 75, 75,113,234,212, 41,112, 56, 28,112, 56, 28, 52, 39, 79,167,211,225,
+218,181,107, 24, 49, 98, 4,188,189,189, 33, 16, 8,192,229,114,161,213,106,161, 86,171, 81, 87, 87,135,191,254,250, 11, 42,149,
+ 10, 60, 30,207, 24, 11, 96, 11, 35, 71,142, 20,222,188,121, 83,122,251,246,109,212,213,213,129,207,231,163, 77,155, 54,235, 79,
+159, 62,141, 97,195,134,241, 36, 18,201,143,246, 40, 1, 35, 71,142,156,122,243,230,205, 61,102,242, 66, 79,159, 62, 29, 58,108,
+216,176, 93, 6, 37,128,145,188, 77,155, 54, 9,213,106, 53,202,202,202,104,151,183,177,146, 86,172, 88, 81, 18, 23, 23,215,126,
+198,140, 25, 99,222,125,247, 93,187,198,191,173,219,126, 20,126,184,124, 89,147,178,178,117,235,208,230,197, 14,248,230,155,239,
+ 68,115,231,190,226,208,120,122,230,204, 25,233,159,127,254,137, 15, 63,252,176,142,203,229,122, 11, 4, 2, 12, 27, 54, 12, 82,
+169, 20,201,201,201,104,223,190,189, 29, 61,143,192, 47,185,119,177,255, 86, 9, 14,254,254, 19,184, 92, 2, 75, 23,189, 74,246,
+111, 19,200,217,178,248, 19,108,181, 87, 30,139, 71, 66,254,230, 74,164, 37,165,192,225, 85, 0,143,122,123,219,110,221,186,137,
+108, 29, 15,219, 90,127, 16,242,156,104,245, 51, 37,109, 71,200, 26,166,214, 57,109,161, 27,228, 80, 14,202,179, 58, 80,251,251,
+167, 58,100,253,111,216,176, 65, 56,111,222, 60,202, 90,153,249, 53,107, 48,189,127,195,134, 13, 66,243,107,230,101,205,214,215,
+181,139,210,210,146, 58,180,242,226,161,155, 23, 5, 94, 32, 9,222,115,207,195,163,255,207,112, 27,248, 45, 92,125,220,192,111,
+ 80, 64, 46,215,161, 19, 87,142,244, 4,235,169,100, 57, 28, 14,120, 60, 30, 92, 92, 92,112,235,214, 45, 92,185,114, 5,222,222,
+222, 8, 8, 8, 64, 64, 64, 0, 2, 3, 3,225,235,235, 11,153, 76,134,244,244,116,112,185, 92,227,220,190, 37,208,215,249,124,
+ 62,116, 58, 29,114,114,114,224,238,238,142,192,192, 64,180,106,213, 10, 65, 65, 65,240,244,244, 68, 78, 78, 14, 52, 26,141,113,
+138,192,154, 66, 97,110,249,223,187,119, 79,154,151,151,135,174, 93,187, 34, 50, 50, 18,131, 7, 15,134, 92, 46,199,201,147, 39,
+145,157,157,189, 93,169, 84,190, 98,135,229, 47,186, 87, 94,241,107,254, 93, 25,188, 66,134, 34, 52,242, 13,180, 31, 60, 5, 53,
+ 42, 14,142,167,158, 64,118,118,246, 52,165, 82, 57,159, 41,249,215,213,213,225,242,229,203,210, 51,103,206,160, 95,191,126,136,
+139,139, 11, 4, 64, 26, 60, 0,237, 1, 64, 32, 16, 48, 38,235,173,219,126, 20,254,146,144, 36,244, 15,232, 35, 77,216,125, 25,
+115,127,248, 1,201, 89, 89, 72,206,202, 66,155, 69,139, 0, 0, 26, 77,227, 41, 71,250,220, 11, 47,188, 64, 29, 60,120, 16,211,
+167, 79,191,227,229,229,197,113,119,119,207,204,200,200,192,153, 51,103, 80, 89, 89,137,208,208, 80,251,148,210,172, 91, 88,253,
+199, 85,108, 93,253,209,101, 30, 87, 1,142,174, 30, 95,175,253,129,179, 39, 61, 19,165, 28, 30,158,121,230, 25,150,101,159, 18,
+240, 28, 37,248, 71,181,121,197, 3,179,176,255,183, 21,129, 7, 50,175,222, 66, 87, 61, 97,163,220, 46,165, 98,245,234,213,194,
+ 19, 39, 78, 72,115,115,115,173,150,101,100,100, 48,146, 69,223,151,145,145,129,234,234,106,233,234,213,171, 69,203,150,233,173,
+114, 75,101,205,193, 91, 89,133,228, 66, 37,218,215,112, 49,192,155, 64, 80, 5, 16,194,243, 1,135, 8, 0,165,188,135,198,123,
+ 4,174, 21,146, 40,107, 84,130,199,225,160,175,191,171,212,218,239, 54, 85, 0, 92, 93, 93,145,151,151,135,246,237,219, 35, 34,
+ 34, 2, 92, 46, 23, 36, 73,162,170,170, 10,103,206,156,129,139,139, 11,248,124, 62,212,106,181, 85, 5,128,246, 14,208, 74, 0,
+ 69, 81,200,207,207, 71, 72, 72, 8,124,124,124,208,208,208,128,172,172, 44,232,116, 58,184,186,186, 66,165, 82, 65,165, 82, 89,
+ 29, 59,232, 32, 58, 0,168,168,168,144, 22, 23, 23,163,127,255,254, 16, 10,133,232,208,161,131,168,177,177, 17, 65, 65, 65,210,
+212,212, 84,156, 63,127, 30,190,190,190, 67, 37, 18,201, 78,177, 88,172,179, 85,143, 21, 21, 21, 39,239, 85,203,224, 31, 58, 20,
+221, 70,190, 4,223, 14,161, 80, 53,214,162,240,207,195,184,117,226, 39, 90, 30,163,247,107,136,125,144,150,150,150,162,117,235,
+214, 16, 8, 4,162,203,151, 47, 75,227,226,226, 56, 6, 15, 0, 0,220,140,139,139, 35,153,180,193,109,219,127, 18,250,250, 61,
+ 35,245,245,127, 6, 28,142, 11, 52,154, 70,108,255, 81,138,185,175,139,104,143, 2,230,207,159,143,160,160, 32,210,222,190,247,
+234,171,175, 82, 9, 9, 9, 24, 57,114, 36, 6, 14, 28,216, 25,128,246,196,137, 19,225, 5, 5, 5,112,115,115,131,155,155, 27,
+162,162,162,198,236,221,187,247, 36, 19,121, 59,255, 46,194,183,127,221,196,182,149,203,171, 59, 60,211,185, 95, 99, 67, 13,126,
+ 63,242, 23, 46, 95,249, 27,190, 20, 9,126,217, 61, 68,189, 61,123,220,158, 61,123,255,183, 92,176, 79, 16, 44, 77, 31, 89,243,
+ 10, 88, 83,213,137, 25, 51,102,152, 90,208, 68,116,116,116,115,231, 79, 44, 42, 43,183, 19,166,199,227, 38, 15,120, 32,238,255,
+230,172,246, 22, 61,179,163,214,185, 61, 30, 0,123, 17, 19, 19, 35, 76, 74, 74,106, 66,254,150,202, 28, 65,110,110, 46,146,146,
+146,164, 49, 49, 49,194,230,202,172, 18, 87,101, 17,206,221, 85, 64,174, 35,113,186,136, 68,153,150, 7,157, 42, 19, 53,215,223,
+196, 79,139, 98,113,232,152, 12, 87,170, 40, 92,170,208,226, 90,149, 22, 85,165,101,205,122,229, 76,149, 0,129, 64,128, 59,119,
+238,224,230,205,155, 0,244,113, 49,127,100,194, 62, 90, 0, 0, 32, 0, 73, 68, 65, 84,252,241, 71,147,185,252,230,230,235, 9,
+130, 48,122, 1,104,121, 20, 69,161,168,168, 8,157, 58,117, 66,105,105, 41, 72,146,132, 64, 32, 48,202,106,110, 74,193, 20,133,
+133,133, 80, 42,149, 8, 15, 15, 71,135, 14, 29, 68, 92, 46, 23,222,222,222, 24, 50,100,136,200,211,211, 19,133,133,133,168,171,
+171,187,194,180, 29, 20, 22, 22,130,228,240,209, 62,108, 28,124, 59,132,130,195,117,129,155,119, 16, 58, 13,137, 2,223,195,143,
+150, 87, 96, 75,206,230,205,155,133,181,181,181,210,146,146, 18,116,236,216, 17, 34,145, 72,244,243,207, 63,167, 85, 85, 85, 17,
+ 0, 48,116,232, 80,173,225,214, 80, 31, 31, 31, 72, 36, 18,155, 1, 15, 2, 65, 0, 2,130,250, 67,167, 85,161,252,110, 6,202,
+ 74,206,140,173,172,200,250,200, 32, 15, 0,112,175,172, 12, 6,121, 46, 76,219,158, 88, 44,158,145,144,144,128,217,179,103, 99,
+214,172, 89, 0, 64, 30, 59,118,140,151,148,148,132,185,115,231,142,191,120,241, 34,113,246,236, 89, 34, 46, 46,142, 81,228,126,
+ 78,157, 28,203, 79, 93,194, 87,239,197, 98,228,164,113,254, 58, 74,139,189,191,158,194,247,235,127,198,145, 37,175, 97,107,255,
+ 78,232,228,195,195, 71, 31,197,177, 65,128, 79, 8, 46, 93,186,100,149,252,155,245, 0,152,207,237,219, 58,127, 26,241, 0,150,
+224, 57,132, 47,158,253, 66,180, 96,193,130, 39,161,190,155, 76, 41, 60,224, 32, 61, 70,239, 33, 42, 42, 74,120,235,214, 45,169,
+ 90,173,110,182,172, 37,168,169,169, 65, 99, 99,163, 52, 42, 42, 74, 84, 84, 84,116, 95,217,225,195,135,173,190,187,236,106, 5,
+100,106, 18,217, 21, 90,148,214,106,209,250, 15, 30,250,237,205,197,157,130,107,248,251, 79, 53,180, 60, 46,212, 36,160, 84, 83,
+168,161, 72, 4, 53,179,173, 61,189,220,143,158,187,167, 35,246,239,221,187,135,206,157, 59,163,160,160,192,232,242,231,241,120,
+198,251,237,157,206, 51,205, 33, 64,255,125, 64, 83,130,181,112,110,204,135, 77,178, 38, 73, 18,141,141,141,250,193,145,199, 19,
+189,249,230,155, 77,222, 93,125,125, 61,239,224,193,131,152, 50,101, 10,103,249,242,229,247, 86,173, 90,165,181,213, 22, 9, 66,
+175, 16, 41,228,247,208, 80, 95, 36,154, 55,239,181, 52,137, 68,146, 14,224,171,250,250,122, 28, 60,120,208,168, 56,134,132,132,
+168,153,180,237,149, 43, 87, 78,249,230,155,111, 18,163,162,162, 48, 98,196, 8, 0, 32,207,158, 61,203,249,237,183,223, 32, 20,
+ 10, 39,109,216,176,225,184, 61, 21,115, 87,174,194,171,201,127, 96,241,204, 40,204,120,117, 58,228,202, 58, 28, 56,152,134,181,
+ 27,119,226,191,227,159, 69,183,242, 98,150, 77,159, 2,101,128,169, 7,192,217,160,204, 58,178,173,115, 22, 38,120,208,228,239,
+ 68,171,221,154, 71,193,209,249,255,230,218, 5,163,246,114,248,240,225,180,238,221,187,139,252,252,252,154, 45,107, 9,252,252,
+252,208,189,123,247, 38, 68,111,169,204, 18, 20, 58,111,104, 8,224, 66,165, 10,229, 58, 29, 78,228, 43,177, 55, 81,137,147,197,
+ 65,200,229,251,160, 88,166, 65, 81, 61,137, 70, 45, 32,215, 82,112, 13,104, 99,147,152,233,245,253, 58,157, 14, 90,173, 22, 1,
+ 1, 1,240,244,244, 68,231,206,157,161,209,104,140,229,150, 18, 2,153,203,163,215,247,107,181, 90, 40, 20, 10, 80, 20,133,142,
+ 29, 59,162,164,164, 4,109,219,182, 5,143,199,131, 74,165,130, 90,173, 54,126, 47,147,233,193, 78,157, 58, 65, 32, 16, 32, 51,
+ 51, 19,197,197,197, 82,157, 78,135,186,186, 58,226,207, 63,255,148, 54, 52, 52,160, 83,167, 78,240,246,246,126,158,233, 24,213,
+169, 83, 39,112, 72, 53, 74,178, 82, 81, 91,156, 3, 82,167,129,162,174, 2,133,127, 30,134,186,177,134,150,215,133,137,114, 67,
+ 35, 32, 32, 64,186,105,211, 38,163, 23,167,170,170,138,184,118,237, 26, 12,164, 77, 2,104,109, 41,225,145, 57,180, 90, 5,180,
+154, 6,184,121,180,129,192,205, 31, 18,201, 22,161, 88, 44,214,174, 88,177, 34,192, 68, 30,182,110,221, 10,153, 76, 70, 47, 97,
+188, 15, 43, 86,172,160,134, 15, 31, 78, 13, 28, 56,144,250,236,179,207,126,159, 50,101, 10, 38, 77,154, 4, 0,184,120,241, 98,
+ 93, 82, 82, 18,102,204,152, 49,229,196,137, 19,135,153,212,217,138, 21, 43,168, 17, 35, 70, 80, 47,191,249, 54,198,236, 59,133,
+101,255,154,134,119, 62, 88, 8,165,186, 1,183,243,138, 32,145,236,197,111,147,135, 65,216,177,149,195,125, 99,194,132, 9,236,
+184,254, 8, 17, 22, 22,214,132,244,205, 3, 1, 31,106, 42,224,232,232,104,161, 61,231, 15,205,210,183,178,102,223,220,218,103,
+106,253, 91,147,247, 70, 96, 32,245, 70,224, 63,238,124,243,115, 91,158, 8,103,201,179, 98, 73, 59, 66,212, 15, 12,102, 74,132,
+195, 30, 0, 0,216,181,107, 87,218,228,201,147, 69,166,201,105, 44,149, 57,130,144,144, 16, 76,158, 60, 89,180,107,215,174,180,
+230,202,172,126,190,123, 8,186,123,112,225, 69, 0, 26,138,194,141, 26, 53, 18,114, 85,216,117,174, 20,127,229, 85,163, 84, 1,
+ 84, 41,117,200,107,160,112, 87, 69,161, 65,173, 17, 53, 71, 94,244,210, 60,181, 90, 13,133, 66,129,182,109,219,162, 79,159, 62,
+ 6, 69,207, 31,131, 7, 15, 54, 18, 54, 77,218,214, 8,155, 38,116,141, 70, 3,181, 90, 13,130, 32, 16, 28, 28,140,218,218, 90,
+ 20, 21, 21,161,186,186, 26, 93,186,116, 1,135,195,129, 90,173,134, 74,165, 50,126,198, 22,130,130,130, 68, 29, 58,116,192,181,
+107,215,112,244,232, 81, 28, 58,116, 72,122,232,208,161,147,167, 79,159, 6,151,203,197,115,207, 61,135,110,221,186, 41, 96, 8,
+188, 99, 32,111, 74,107,127, 31, 84,229, 95,194,223,199,127,196,181,195,155,112,227,176, 4,119,206,255, 6, 87, 14, 73,203, 43,
+177, 37,231,173,183,222, 74,107,221,186,181,200,219,219, 27,217,217,217, 40, 46, 46,150,198,199,199, 11, 77, 21, 1,131, 39,128,
+147,144,144,128,222,189,123,219,124, 54,181, 74, 6, 89,109, 46, 92, 92, 60,224,235,223, 67,234,225,217, 30, 63,252,240,139,144,
+ 32, 56, 67,233,123,188,106, 83, 33,253,239, 59,136,232,209, 96,181,109, 31, 62,124, 24,110,110,110,232,221,187, 55,186,116,233,
+ 66, 79, 31,104,107,106,106, 26,246,237,219,231, 27, 22, 22, 54,101,207,158, 61, 73, 76,219,110,114,242, 97,120,123,123, 98,212,
+232, 33,242,176,129,253, 48,245,205,185,144, 19, 90, 84,148, 87, 99,193,162,207,177,106, 80, 8, 6,182,114, 92, 73,158, 48, 97,
+ 2,245,245,215, 95,179, 74,192, 99,162, 8, 88,194, 99,179, 23,192,163, 94, 85,224, 8, 1,219,139,237,149,122, 5,194,148,168,
+233,178,199, 65,222,227,234, 81, 48,243, 4, 80,246,120, 0,104, 44, 91,182, 44,109,236,216,177,162,193,131, 7, 91, 45, 51,189,
+214, 28, 76,239, 31, 59,118,108,147, 96, 63, 75,101,205, 90,135,174, 30,162,190,109, 3, 49, 60,192, 21,207,250,241,209, 78,192,
+129, 43, 69, 65,160,210,162,147, 39, 15, 53, 20,133,171, 13, 90,228, 52,106,209,190, 85, 0,186, 60, 59,218,170, 44,218,234,167,
+151,250,117,234,212, 9,253,251,247, 71, 77, 77, 13,106,107,107, 81, 91, 91, 11, 47, 47, 47, 12, 29, 58, 20,106,181,218,152, 19,
+192, 26, 97,211,202,132, 70,163, 1, 65, 16, 8, 13, 13,133, 66,161, 64, 69, 69, 5,202,203,203, 81, 81, 81,129,198,198, 70,132,
+134,134,130,199,227, 25,229, 89,203, 43, 96,174,148,181,110,221, 90, 20, 28, 28,140,219,183,111, 35, 37, 37, 5, 25, 25, 25,112,
+119,119,199,152, 49, 99,208,191,127,255,195, 2,129, 96, 41,211,101,123,187,118,237, 74,106,221, 42,232,149,224,182,190,104,200,
+251, 19, 57, 41,219, 81,146,241, 59,252, 92,117, 24, 55,118, 12,250,247,239, 63,231,221,119,223, 61,200, 68,150,183,183, 55, 6,
+ 14, 28, 8,138,162,112,238,220, 57,100,102,102, 74, 75, 74, 74,164, 95,125,245,149, 48, 46, 46, 78, 68,103, 78, 28, 52,104, 16,
+210,211,211,109,202,155, 63,127,110,154,172, 38, 87, 84, 93,113, 5,174, 2,127,180,105,247,156, 52,168,205, 96,169,151,119,151,
+195,223,172,254,126, 50, 45,111,215,187,238,216,125, 86, 5,107, 74, 79, 78, 78, 14, 2, 3, 3, 49, 98,196, 8,242,217,103,159,
+133, 92, 46, 71, 99, 99, 35,214,175, 95,239,217,163, 71,143, 23,165, 82,105,146, 61,125,226,239,191,115,208,185, 83, 7,188,252,
+242, 20,247,143,255,189, 24, 85,245, 50, 84, 86, 85, 34,246,157,207,241,249,212,177, 24,219,169,117,139,200,127,237,218,181,232,
+211,167, 15,214,173, 91,199, 42, 1, 15, 17,166,243,254,182,240,208, 50, 1, 58,115, 85,129, 33,185,143, 83, 50, 1,218,130,121,
+ 34, 30,103, 40, 1,206, 36,107,103,203,115,198,171,134, 19,210, 3,155, 41, 16,132, 21,143,133, 93,120,235,173,183,210,204, 63,
+103, 90,182,109,219, 54, 70, 50,233,251, 44,221,207, 84, 6,141, 29,187,246,164, 45,127,117, 38,180, 25,201, 40,144, 1,158,132,
+ 11, 58,123,114, 80,162, 35,192,117,229, 33,189, 92, 7, 37, 9, 4,185,114, 17, 60,104, 20,222, 93,189, 53,173, 57, 5, 64,163,
+209,128,203,229,162,107,215,174, 24, 56,112, 32,234,234,234,160, 84, 42,141,235,243,213,106, 53,252,253,253, 49, 98,196, 8, 36,
+ 37, 37, 25,167, 4, 44, 65,167,211, 25,179, 8,246,236,217, 19, 6, 55, 61,148, 74,165,177, 63,211,158,132,158, 61,123,162,186,
+186, 26, 13, 13, 13, 86,251,178, 57,153,159, 62,125, 58, 45, 38, 38,102, 76,239,222,189, 79,154, 36, 2,170, 29, 57,114,228, 73,
+129, 64, 48, 91, 44, 22, 43,237,169,203,211,167, 79, 39,196,196,196,212,245,238,221,251,160,137,188,202,145, 35, 71,174,127,247,
+221,119, 25,103,235, 89,184,112, 97,218,166, 77,155, 68,145,145,145,184,125,251,182,244,230,205,155, 40, 44, 44,132,151,151,151,
+212,215,215, 23, 17, 17, 17,216,182,109, 27, 6, 13, 26,196,248,217,222,120,227,213,180,109,219,118,136,148,202,106,248,250,133,
+ 74, 61,189, 58,194,203,187, 19, 26,235, 75,146, 86,174,218,142,152,151,199, 97,215,187,238,198,122,178,100,177, 77,156, 56, 17,
+201,201,201, 40, 46, 46,230, 84, 87, 87, 67,169, 84, 34, 61, 61,157,103, 80, 58,235,206,158, 61,107, 87,127,136,138,154,136, 3,
+ 7,146, 80, 87, 91,133,226,210,187,120,247,173,127,169,223,255,112, 5,127,234,152, 97, 24,161,170, 3, 92, 28,163,135, 9, 19,
+ 38, 80,159,126,250,169, 49, 29,116,112,112, 48,190,254,250,107, 0,160,142, 28, 57,194,166, 13,127, 68, 74,193,163, 84, 0,136,
+ 25, 51,102,152,186,208, 8, 51,119, 63, 97,175,251,223, 25,228,110, 36,249,202,237,176,149,109,207,158,224,191,202,202,237, 48,
+117,197,155, 18,179,185,203,158, 9,105, 87,110,175,116,170,188, 39, 0,255, 83,131, 68,151, 97, 34,209,101,149, 86, 90,113,242,
+ 4, 92,180, 10, 92,174,167,144, 90,175, 5,159, 32, 16, 64, 81, 16,181,245,133, 95,155, 32, 81,135, 33, 66, 96,199, 30,155, 30,
+128, 46, 93,186, 96,240,224,193, 80, 40, 20,208,104, 52,224,243,249, 70,194,166,173,244,160,160, 32, 12, 31, 62, 28, 41, 41, 41,
+205,122, 0,120, 60, 30,250,247,239, 15,130, 32, 32,151,203,141,222, 5, 90,105,167,179, 11,146, 36,137,190,125,251,226,143, 63,
+254,128, 61,193,149,187,118,237,146, 2, 32, 36, 18, 9, 1,192, 19,250,108,123,133, 98,177, 88,227, 72, 93,238,218,181, 43,201,
+ 32,207, 19,128, 63,128,106,177, 88,108,119,110,226,133, 11, 23,166, 1,192,134, 13, 27, 68, 46, 46, 46,200,207,207,135,191,191,
+191, 20, 0, 74, 74, 74, 48, 97,194, 4,172, 89,179,198, 46,153,243,230,205, 73,147, 72,182, 8,213,106,153,200,173,174, 64,234,
+237, 27, 12,119,207,118,112,247,108,135, 99, 39,238,129, 24,219,188,197,253,211, 79, 63, 17,243,231,207,167,170,171,171, 49,113,
+226, 68,117, 64, 64, 0,159, 36, 73, 20, 22, 22,218,237, 17, 3,128, 29, 59,126, 34,196,226, 88,202,251,122, 38,222,122,235, 13,
+116, 8,237,206,255,122,241, 27,228,142,141, 63,113,214,115,149, 14,181,229, 9, 19, 38, 80,203,151, 47,135,175,175, 47, 74, 75,
+ 75,225,230,230, 6,146, 36,225,225,225,129, 47,191,252,146, 85, 2, 30, 2,194,194,194,172,122, 1,152,166, 2,118, 58, 30,243,
+ 85, 5, 68,229,246, 74,139, 23, 28,180,254,137,237,149,247,203, 51,183,212,105,215, 61, 3,210,118,182, 60, 22,143, 17, 12,100,
+ 67,188, 20, 53, 65,232,163, 85, 73,185,119,242, 17,162,185, 11,175,128,214, 24,214,183, 7, 2,218, 7,138, 62,216,180, 51,109,
+119,198, 66,155, 94,180,174, 93,187, 98,196,136, 17,198,249,120, 46,151, 11,149, 74,101, 76,221,107, 58, 77,208,177, 99, 71, 12,
+ 31, 62, 28,105,105,150,187,158,155,155, 27,194,194,194,192,227,241,160, 86,171,141,159, 51, 93, 58,104,186, 17, 16,135,195,193,
+128, 1, 3,144,153,153,105,119, 29, 24,188, 3,245,134,163,197, 48,144,126,139, 55, 37, 48,120,136,140,253,112,211,166, 77, 66,
+185, 92, 14,149, 74,133, 30, 61,122, 32, 62, 62, 94,106,223,115,197,166, 1,128, 68,178, 69,164, 80, 84,192,213,213, 15, 46,124,
+ 47, 41,135,195,195, 47, 9,135, 69,175,204,142,106, 86,222,214,173, 91, 9,137, 68, 66,124,251,237,183,164, 66,161, 0, 0,132,
+134,134,218,149,126,217, 20, 18,201, 22, 98,219,182,173, 19,230,126,250,109,178, 94, 30,197, 9, 13,125, 6,161, 47,190,248,202,
+ 91,111,189,149,224,136,204, 85,171, 86,177,157,250, 49, 81, 2,154, 35,255,135,170, 0, 60,169,112,230,178, 63,115, 98,110, 41,
+ 81, 59, 81,158,179, 21, 6, 86, 1,113, 0,123, 14, 31, 73,107, 82,119,117,133, 56,125,187,144,241,231,163,163,163,225,231,231,
+103,140,240, 39, 73,210,232,194,167, 61, 0,116,208, 31,189, 35, 96,112,112, 48, 8,130,192,238,221,187,239,147,183,118,237, 90,
+ 36, 38, 38, 26,239,213,233,116, 54,183, 3,230,243,249, 24, 52,104, 16,152, 68,199, 63,193,202, 90,139,219, 58,173, 8,232, 73,
+125, 59,244,225, 88,164,148,137, 60,131,178, 68, 0,192,166, 77,155,168,133, 11, 23, 18, 39, 78, 56,190, 52,127,222,188,249, 71,
+ 12, 94, 19, 14, 73,146, 58, 14,135,227,102,239,244, 11, 13,214,186,127,188,148, 0,155, 3,181,163,251, 8,179, 96,193,130, 5,
+ 11, 22, 44,158, 92,112,216, 42, 96,193,130, 5, 11, 22, 44, 88, 5,128, 5, 11, 22, 44, 88,176, 96,193, 42, 0, 44, 88,176, 96,
+193,130, 5, 11, 86, 1, 96,193,130, 5, 11, 22, 44, 88, 60, 21,104,178, 10,224,210,165, 75, 14, 71,112, 90, 10, 38,100,229,177,
+242, 88,121, 79,165, 60,234,133, 23,197,248,253, 55, 9, 36, 18, 9,199, 82,182, 62,182,254, 88,121,157, 58,117, 50,222, 83, 88,
+ 88, 72,176,245,247,112,229,217,173, 0,208,157,187,153,251, 29,121,192, 39, 89,158, 35, 50, 31,247,223,219, 4, 18,137,132, 15,
+192, 27,128,187,161, 61,144, 0, 42, 29, 73,158,242,128, 65, 57,235, 55, 91,169,211, 71,178,124,105,245,234,213,194,115,231,206,
+ 73, 79,157, 58, 5, 0, 24, 61,122, 52,134, 13, 27,198, 56,149,240,163,120, 15, 47,188, 40,198,196, 9, 3,181,128,152, 39, 22,
+139, 73,176,203, 62, 89,152,161, 83,167, 78,212,228,201,193,198,243,164, 36, 80,182,148, 0, 22,143,216, 3, 96,236,225,123,239,
+223, 0,130,152, 89,211,146,239, 33, 28, 32,222,135, 38,207,210,239,109,225,111,126,172,127, 47, 77,252,215, 46,159,254,113,239,
+174,245, 99,219,180, 15,110, 45,147,105,224,227,227,130,178,146, 60,178,119,239,254,213, 18,137,100,176, 88, 44,190,109,143, 76,
+241,156,254, 84,126, 94, 14,242, 10,148, 40,186, 75,161, 99, 91, 2,193, 93, 4,232, 22, 28, 10,201,142,236,199,165,243, 91, 82,
+ 36,232,189, 6, 30,250, 51, 94,185,114, 69, 26, 22,118, 20,155, 55,203,145,150, 6,124,242,201, 49, 20, 21, 21, 73, 39, 79,158,
+ 12,129, 64,128,210,210, 82,209,212,169, 83,225, 12,133,224,149, 87, 94,161,100, 50,153, 40, 34, 34, 2,239,188,243, 78,154, 3,
+109,134, 35, 22,139, 49,113,194, 64, 50, 54, 54,150, 7,108,193,239,191, 1, 18,137,132, 96,154,179,159,197,255, 14,212,234,229,
+ 72, 73,137, 69,100,228, 22, 76,158,188, 10, 73, 73,250,190,199, 42, 2, 15, 7,108, 34, 32,123, 24,214,132,236, 9, 2, 32,247,
+248, 61,181,191,117,253,186, 53,175, 30, 58,248, 67, 92, 72, 72,247, 30,211, 94, 28,141,142,237,189,225,235,227,138,154, 90, 37,
+ 74,238,118,228,220,202,175, 9, 60,116,240, 7,233,250,117,107,190,125,123,209,210,117,182,228,189,251,246, 44,225,237,156, 67,
+210,242,210,108,188, 20, 5, 12, 15, 7,130, 59, 3,185, 5, 20,206, 92, 80, 32, 89,154,141, 41,227,189,169,174,161,147, 68,223,
+173,223,233, 40,145, 57,211,242, 39, 44,200,126, 36, 74, 64,117,117, 53,222,121, 71,142,160, 32, 32, 58, 26, 88,185,178, 1, 89,
+ 89, 89,208,106,181, 16, 8, 4,104,213,170,149,244,208,161, 67,152, 63,127,190,104,235,214,173,118,213,221,194,133, 11,133, 87,
+175, 94, 69,235,214,173,165,251,246,237, 35,126,249,229, 23, 0,144,166,166,166,226,141, 55,222,192,246,237,219,237,253,173,124,
+ 0, 72, 62,114,145, 3,108, 33,245,127,239,207,241,207,130,181,254, 1, 96,250,244,253, 72, 73,209,255,141,141,205, 3,237, 17,
+ 96,189, 1, 15,151,248, 77,203,205,149, 0, 54, 8,208,130, 23,224,105, 38,127,137, 68,194, 59,158,178,247, 99,209,168,129, 61,
+166, 69,133,162,127,239, 86, 8,240,115, 3, 1, 2,222,158,174, 8, 13,246, 71,196,232, 46, 24, 61, 98, 64,231,227, 41,123, 63,
+150, 72, 36,109,108,201,188,157,115, 72, 58, 50,188, 14,123,215, 3,115,163,129, 30, 6,207,159,135, 59,208, 51, 4,248,108, 9,
+ 48,180,127, 29,110,231, 28,146,182,228, 21,181,212,235, 97, 67,145,120, 36, 3,146,191,191, 63, 14, 29,114, 67, 69, 5,144,152,
+ 8,212,212,240, 16, 18, 18,130, 73,147, 38,209,219,189, 34, 45, 45, 13,153,153,153,210,213,171, 87, 11,153,202,141,140,140, 20,
+ 94,187,118, 77,202,231,243,165, 53, 53, 77, 61, 89, 10,133, 2,219,183,111,135, 72, 36,178,183, 62, 73, 0,248,253, 55, 9,146,
+143, 92,228,252,254,155,164, 69,191,125,222,188,121, 20,125, 52, 87,198,176, 93, 80, 14,148, 53,139, 45,155, 55, 11,183, 44, 89,
+ 34,188, 52,127, 62, 85, 52,113, 34,117,126,206, 28,106,195, 59,239, 8,183,108,222, 44,108,201,111,110,105,155,177, 36,131,105,
+217,131,150, 71,187,254, 39, 79, 14, 70,108,108, 74,147,191, 52, 38, 79, 14,110, 18, 31,192,226,193, 32, 44, 44,172,201, 97, 73,
+ 57, 96, 21,128,199,129, 5, 30, 34,174, 93, 62,189, 50, 36, 36, 36,116,240,192,182, 77, 27, 2,135, 0,159,207,133,155,128, 7,
+ 23, 23, 14,130,187,250, 33, 56, 56,164,213,181,203,167, 15, 73, 36, 18,171,158, 34,241,156,254, 20, 23,117, 88, 50, 23, 80,170,
+128,219, 69, 64,141, 12,168,173, 3,118, 30, 4, 22,125, 10,196,173, 6,134, 13, 4, 56, 84, 29,196,115,250,179, 29,223, 4,125,
+251,246, 21,253,254,123, 79,180,106, 5,204,154,197, 67,155, 54,207, 98,244,232,209,162, 67,135, 14, 17,147, 38, 77, 18, 69, 70,
+ 70,162,117,235,214,184,120,241, 34,246,236,217, 35,157, 62,125,186,240,251,239,191,111,150,128, 70,142, 28, 41, 84,169, 84, 82,
+ 23, 23,151,102,191, 91, 42,149, 98,236,216,177, 76,200,140,154, 61,123, 54, 37, 22,139,213,134,152, 17,152,144, 63, 1, 0,179,
+103,207,182, 91, 65,203,200,200, 48, 30,205,149, 57,216,109,137,150,116,239, 45,155, 55, 11,187,221,188, 41,157,122,233,146,180,
+ 99, 78, 46,248,117,117,104,155,115, 19,194, 63,206, 75,131,178,179,165, 18, 7,149,128,140,140, 12,204,155, 55,143, 90,180,104,
+145,195, 74, 4, 45,131, 73, 25, 83,121,230, 68,207,164,204, 22,104,210,167,255,170, 39,135,176, 29,254, 33, 18, 63, 19, 60,169,
+ 10, 0,101,225,112,154,224, 7,248,124,148,147, 31,147,178,183, 46,174, 93,207,158, 16, 26,236,111, 36,125, 75,219, 52, 11, 92,
+121,208,106, 73,132, 6,251,227,218,245,236, 96, 0, 62,214,228,229,231,229, 32,106,140,254,255,163,233,192, 27, 31, 2,155,119,
+ 2,165,247,128,155,185, 64,214, 53, 10,169,103,129, 19,231,128,200,209,250,251, 91,160,155, 17, 15,240, 21, 63, 18,197,100,217,
+178,101,105, 13, 13,250,120,203, 89,179,102,225,252,249,243,132, 68, 34, 73,163,175, 85, 87, 87,139,122,246,228, 97,254,124, 96,
+192,128, 11,208,233,110, 74,139,139,139,173,122, 82, 22, 46, 92, 40, 36, 8, 66,202,116,115,152,242,242,114,155, 94,153,217,179,
+103, 35, 33, 33, 1, 0,168,244,244,116,181,201,187, 32,104,226, 79, 72, 72,192,236,217,179, 31,229,120,224,104,153, 69,168,174,
+ 94, 69,215, 63,255, 52,108,130,164,134,150, 36, 65,106,116, 32, 53, 90, 4,157, 78, 71, 29,195,253,214,173, 17,238, 95,127,253,
+ 37,125,238,185,231, 30,184, 18,224,136,119,161,165,228,175,158, 28, 98,241, 72,137, 77, 97,217,249, 49,131, 69,203,174,153,224,
+ 55,202, 65,195,153,114,162, 60,226, 49, 24, 92,154,125, 6, 27, 65,133,148, 51,234,207,145,192, 69,137, 68,194, 75, 79, 63,210,
+171, 93, 27, 79, 80, 20,112,250,124, 17,228, 10,253,174,171, 3,251,183, 65, 80,128, 27,138, 74,234,201,220,219, 53, 28, 30,143,
+131,238,221,252,208,174, 93,136, 47,244, 91,180, 90, 68, 94,129, 18,195,195, 1,149, 6, 56,114, 10,144,158,167,208,174, 53,129,
+110,157,128,177, 35,128, 30,193, 4,120, 92,253,214,226, 67,195,128,111, 36, 74,166,245, 77,216,249, 63, 83, 37,130,194,253,177,
+ 0,212, 35,106, 91, 0, 64,111,231,138,126,253,250,137,204,175,113,185, 92,105,175, 94,229,136,139,211, 63,230,138, 21, 57, 40,
+ 40,232,109, 85,150, 82,169,180,105,249,155,162,160,160,192,230, 61, 9, 9, 9, 70, 43,159, 86, 4, 76,174,209, 10, 2, 97,184,
+246, 56, 56,237,136,150,142, 27,221, 43,171,164,106,141, 6, 28, 14, 7, 20,151, 11,146, 36,161, 33, 73,144, 58, 29,116, 58, 18,
+ 29,238,222,149,182,164,189,200,229,114, 0,144,206,155, 55, 15, 4, 65,216, 29,223, 97, 74,248,219,182,109, 35,154, 43,123,152,
+228, 15, 0, 41,177, 41,136,220, 18,137,233,251,129,216, 20,253,255, 52,249,171, 39,135,128,159,148,203, 50,239, 67,132,169,219,
+159,209,118,192,214, 86, 1,180, 96,117,128,181, 40,118, 71,162,219, 41, 27,131,187,195, 74,131, 21, 82, 37, 28,177, 34,154, 9,
+ 42,116, 68,158,213,207,208,223, 67, 0, 32,247,218,140, 93, 32,245,209,254,174, 0,128,162,210, 58, 40, 20, 90, 0, 64, 72, 55,
+ 63, 4, 5,184, 33,251, 90, 57,231,239, 91,213, 16, 8,184, 8,238,234,139, 26,153, 26, 0,172, 10, 46,186, 75, 33,184,179,254,
+251,159, 31, 5,132,245, 34,224,202, 7,180, 90, 96,252, 72,192,215, 11,200, 47, 4, 34, 71, 1,157, 59,232,239,127,196, 32,204,
+188, 39,143, 74,177,124, 32, 40, 47, 47,183,171, 31,214,215, 51,223,125, 55, 33, 33,129, 48, 81, 2, 76,189, 3,143,188,238,186,
+117,235, 70,229,231,231, 19,142, 94, 55,135, 75, 94, 46, 84, 26, 53, 8, 46, 15, 58,138, 2, 1, 64,171, 35,161,209,146,160,116,
+ 58, 16,183,254,118,202,115, 95,189,122, 21,129,129,129,210,175,191,254, 90,244,193, 7, 31, 56,172, 4,152, 79,163,216, 75,220,
+206, 34,255,194,194, 66,162, 83,167, 78,212,244,253, 77, 21, 2, 0,136,220, 18, 9,126, 82, 46,146,146,242,140, 43, 1,216, 88,
+128, 71, 71,254, 86, 21,128, 39, 0,205,145,168,221, 4,219,194, 37,142,214,229, 62,224,213, 4,196,204, 26,123,191,131,240,241,
+113, 65, 77,173, 18,129,254,238,136,158,210, 3, 90, 29, 9, 87, 87, 46,184, 28, 14, 40,138,194,164,241,193,136,138, 8, 6, 65,
+ 0, 85, 53, 10,248,248,184, 0, 64,181, 53,129, 29,219, 18,200,187, 67,161, 71, 48, 48,230, 57,125,101,223,204, 5,250,245, 0,
+252,188,129, 9, 66,128, 36, 1, 30, 23,200,185,173,191, 63,191,136, 98,250,110,237,249,191,165, 3,201, 35, 89, 6,184,105,211,
+ 38,225,234,213,171,145,151,151,135,244,244,116,233, 55,223,124, 35,242,244,244, 52,110, 59,171,211,233, 68,215,175,183,146,254,
+231, 63, 37, 32, 8, 2,229,229,161, 8, 13,237,130,156, 28,203, 83, 41, 36, 73, 90, 44, 31, 59,118,236,253, 94, 36,138,194,201,
+147, 39,237,250,205,166, 74,192,227, 68,254,206, 80, 18, 76, 81,221,161, 61,248, 55,255, 6,229, 2,240, 73, 10, 4, 1,104,116,
+ 90,168, 41, 29,228, 90, 45, 20, 33, 61,128,235, 55, 91,252,236,125,250,244, 1, 65, 16, 14,145, 63, 0, 12, 30, 60, 24,219,182,
+109, 35,250,245,235, 71, 53, 87,102, 11,219,182,109, 35,204, 9,223, 82,153, 61,136, 77,249,135,248, 1,220,103,249,211, 1,131,
+ 73, 73,121, 44, 83, 63, 2,242, 7,216, 32, 64, 83, 18, 49, 63, 90,108, 21, 82, 20,192,121,169,230,129, 61, 52,181,215, 79,255,
+ 29,204, 21, 24, 94, 89, 73, 94,101, 81,137,222,234, 91,179,233, 47, 92,186, 90, 14,141,134, 4, 73, 82, 6,165,133, 48,198, 6,
+ 20,149,212,163,172, 36,239, 54, 0,171,102,101,112, 23, 1,206,102,234,255, 15, 12, 7,178,174, 1,177, 49, 64, 72,103,189,219,
+255,139,245, 0,223, 5,224,112,128,179,153,250,251, 91, 64,208,206,142,161, 48,127,223, 15,221, 26,185,126,253, 58, 4, 2,125,
+157, 28, 62,124, 24, 9, 9, 9,210,180, 52, 61, 23,172, 94,189, 90,232,239,239, 47,189,113, 67,139,173, 91,129,172,172, 65,224,
+114,123,136, 58,116,232, 32,178, 38,207,195,195,131,241,119,107,181,218, 39,190,227,154,146,127,183,110,221, 40,107,135,189,202,
+ 66, 94, 80, 43, 81,141, 90,133, 58,181, 26, 10,181, 6, 42,173, 22, 26, 74, 7,185, 70,131,122,181, 26,165,237,218,137, 90,242,
+220,238,238,238,240,240,240, 16,109,219,182,141,112,196,253,111, 74,244,182,202,236, 81, 2, 6, 15, 30,108,179,140,137, 23,192,
+ 26,249,155, 90,255, 44, 30, 45,249,179, 10,192, 67,192,131, 94, 82, 72,237,245, 3, 5,198,138,134,182,119,239,254,165,185,183,
+107, 64,146, 20, 62,124,119, 40,114,114,171,113, 35,167, 10, 4,129, 38, 1,129, 36, 73, 33,247,118, 13,122,247,238,127, 21,128,
+ 85, 63,113,183,224, 80, 28, 62, 9,232,116, 0,149, 15, 72,207, 3, 73, 39,128, 9,175, 3,162, 89, 64,218, 31,250,251,116, 58,
+224,240, 73,253,253,143, 16,150,230,255,225, 12,101,207, 81, 84, 87, 87, 75,123,246,188,141,140, 12,224,252,121, 29, 58,116,184,
+140,172,172, 44,233,228,201,147,169, 67,135, 14, 73, 83, 82, 82,112,239,222, 61, 12, 28, 56, 16, 47,189,244,146,104,255,254,253,
+105,205, 37,241,161, 40, 74,100,205, 11, 96, 14, 90,241,176, 23,244, 20,192, 35,154,243,111, 2, 83,139, 62, 63, 63,159,176,118,
+ 88,186,191, 57,248, 13, 24,128,170,145,163, 80,173, 80,162, 70,163,130, 82,171, 69,131, 70, 7,153, 90,141,250, 49, 99, 17, 24,
+ 30,238,160, 87,144,192,224,193,131,209,183,111, 95,209,249,243,231,211, 90, 34,195,148,232, 45,149,181, 68, 9, 48, 29, 11, 44,
+149, 49,129, 37,242,167, 45,127,243, 76,129, 44, 30, 62,249,179, 10,192,147,238,182,152, 89, 99,215, 52,128, 88, 44,214,245,238,
+ 55,114, 76, 94, 94,238,205, 63, 51, 75, 65,146, 20, 38,140,235,134,203,215,202,241,229,154,243,248,226,219,115, 70,242,255, 51,
+179, 20,121,121,185,119,122,247, 27,249,182, 88, 44,214, 88,147, 41,217,145, 77,232,224,141,248, 31,244, 36,191,249, 11,224,191,
+191, 2,162,161,192,128, 94, 64,218, 46,125,121,252, 15,128, 14,222, 45,201, 8,216,210, 85, 0,148, 13, 57,143,100, 46,178,177,
+177, 17,125,251, 42,241,236,179,192,179,207, 2,131, 6, 81,200,207,207, 71, 82, 82, 18,254,248, 67,175, 61, 9,133, 66,132,135,
+135, 51, 74, 15,188,127,255,254, 52, 38,196,174,213,106,225,229,229,101,183, 21,107,136,250, 55, 70,252,211,231,142, 90,176,244,
+209, 92,153, 61, 74,128, 51,238, 3, 0,241,194,133,105,234, 33, 67, 68, 55,198, 71,136,202,158,121, 6,101, 46, 46, 40,235,209,
+ 3, 57,145,145, 34,221,115, 67, 69, 98,195, 20,141,189,120,246,217,103,209, 18,171,223, 84,134,173, 50,166,117,104,201,234,127,
+246,217,103,109,150, 57, 2, 58, 71,192, 63, 73,129, 88,143,192,131, 2,147,165,128,108, 38,192, 7,104,153, 63,142,223, 33, 22,
+139,171,214,175, 91,179, 54,229,232,158,247,139,239,214, 7,135,116,245, 67,212,248, 96,248,249, 10,240,255,219,187,246,248, 38,
+170,109,253, 77,146,166,105,105,121, 83, 94, 90,105,121, 40,130,128,130, 88, 69,165, 81, 16, 99, 27, 64,218,136, 23,245,130,200,
+105,229,120, 16,181, 66,208,123,188,162,247,120, 33, 28, 42, 92,185, 30, 72, 21,161,222,115, 84, 76, 11,150,242,176, 90, 78,234,
+241, 40,120,160, 10,200, 67, 45, 45, 90,164, 64,161,208,119,210,100, 50,251,254,145, 76,153,166,121,204, 36, 83, 90,112,127,191,
+223,252, 50,179,103,102,101,102,246,204,254,214, 90,123,237,181, 47,213,218,241,221,247,231,112,226,228, 37,148,151,159,248,122,
+218,131,179,183, 2, 56, 21, 76,102,194,136, 84,237,151,165, 59,172, 95,151,214, 35,229, 62,224,157, 21,238, 76,128,229,191, 0,
+ 27, 63,118, 91,254, 46,116, 71,194,136, 84, 45, 62,251, 64, 14, 2,151,251,220, 78, 27, 5,112,230,204, 25,109,175, 94,125,173,
+ 7, 14,156, 7, 0,252,244, 83,119,220,126,251,205,232,211,167, 15, 52, 26, 13,206,156, 57,163, 77, 77, 77,149,148, 10,120,200,
+144, 33,218, 31,127,252,209,234,207, 98, 99, 89, 22,195,134, 13,195,198,141, 27, 37,145,144,119,223,191, 96,155,132, 18, 11,224,
+203, 90, 13,213,130, 13, 70,238, 82,200, 95,168, 4,180,121, 47, 14, 31, 14,187,190,195,181,208,165, 60, 55,177,255, 37,183,188,
+ 64,228, 47,132, 67, 63, 12,160,253,255, 87,196, 19,224, 79, 49,144, 52, 12, 48,140, 96, 57,185,199, 94,147, 16,247, 93,145,235,
+ 11,242,156,100,185,190,112, 2, 23,255,176,232, 5,179,217,108,254,232,232,225, 47,255,178,173,224,139,196, 1,131,135, 38, 9,
+230, 2,216, 55,106,212,216,127,165, 78,159,255,114,102,102,102,147, 24,121,158,244,190, 76,230,188,177,100,203,206,159,240,223,
+111,251,153, 11, 32,116,242,151,197, 97,210,213,200, 31, 0, 30,125,244, 81, 28, 58,116, 8, 79, 62,121, 0, 0, 48, 97,194, 4,
+ 60,242,200, 88,237,243,207, 63,223, 74,206, 95,125,245,149, 36,153,235,215,175, 47, 1,192,164,164,164, 36, 55, 52, 52, 88,149,
+ 74, 37, 20, 10, 5, 88,150,133, 90,173, 70, 76, 76,140, 54, 92,242, 7, 32,139, 18, 64,113,109,162,178,178,146, 41,202, 40, 34,
+131, 22, 13,210, 98,136,239, 99,170, 50,138,172,212,250,239, 92,168, 36, 52,148,114, 55,188, 29, 33,143,233,226,215,215, 21,228,
+241,158,128, 58,179,217,252,248,168, 49,247,240, 25, 99, 98, 0,244, 5,112, 6,128,205, 51,203,155, 36,120,187,247, 43, 78, 17,
+ 84,156,178, 1, 95, 30,234,236,231,208,149,242, 74,180,129,135,232, 91,175,225,200,145, 35,178,201,222,185,115,103,137, 92,247,
+ 39,232,247,103,188,202, 25,120, 18, 1, 81, 80,120, 43, 1,149, 75, 42,209, 85,191,189,107, 21, 98,179, 0, 2, 0, 19,234, 60,
+194, 20, 20, 20, 20, 20, 20, 20, 87, 47,104, 16, 32, 5, 5, 5, 5, 5, 5, 85, 0, 40, 40, 40, 40, 40, 40, 40,168, 2, 64, 65,
+ 65, 65, 65, 65, 65, 65, 21, 0, 10, 10, 10, 10, 10, 10,138,107, 3,109, 70, 1, 28, 60,120, 48,228,168, 76, 95,193,132, 84, 94,
+135,201, 11, 58,137, 77,103,202, 51, 24, 12,201, 0,172, 22,139, 69, 22,121,179,103,207, 78,230, 56, 78, 54,121,244,253,235, 28,
+121, 11, 23, 46,156,157,153,153,249,113, 71, 94,159,217,108,142, 0,160,241,188,211,118, 0, 28, 0,146,153,153, 73,104,125, 80,
+121,191, 37,121,114,121, 0,136,136, 69, 10,228,150,119,197, 64, 46,174, 34,164,113,173,232,235,243, 16,161,108,247, 43,144,135,
+236,236,108,109,128,231, 41, 89,222,145,183,187, 35, 92,121, 60,102,222,190,203,154,208,189, 16, 0, 48,126,252,248,176,235,115,
+ 68,255, 45,184,161,223, 30, 68, 69, 69, 97,202,148, 41,157,253,126,144, 16,150,171, 89, 94,176,255,145,130,189, 29, 85, 41, 57,
+ 57, 57, 15,189,251,238,187, 47, 70, 68, 68,108, 83,171,213,165,106,181,250, 7, 0,102,165, 82,105, 97, 24,230, 47,102,179,185,
+175,217,108,166,195,206, 40, 40,252,121, 0,124,125,228,132,248,255,198, 37,230,134, 38, 30,129,114,201,147,100,193,202,137,244,
+244,116,114,226,196,137,160,228,106,177, 88,172, 70,163, 17,113,113,113, 62, 83,174,102,101,101, 89,165,144,181,197, 98,177,102,
+103,103,107,179,178,178,172,251,246,237,179,122, 41, 2, 33,201,227,142,253, 39, 20, 55,191,142,247,255,238, 0, 0,112,199,254,
+243,178,118,120,243,235,146,158,203,135,127,238, 70, 56, 2,124,244,169, 91,150,110,114, 4, 70, 13, 59, 10,192,173, 4,148,150,
+150, 74,170,155, 85,111,107,147,107,127,174, 65,163,163,151,181,169,165, 27,116,211,106, 49,120, 0,131,132,132,185,164,190,222,
+142, 45, 91,182,116, 86,131,206,132,248,110, 94, 17,121,129,190, 49, 25,191,185, 80,224, 16,190,127,121,121,121,214, 89,179,102,
+105,243,243,243, 75,194, 17,250,238,187,239,234, 84, 42,213,189, 42,149,234, 81,165, 82,217, 75,161, 80,196,152, 76, 38,197,146,
+ 37, 75,230,187, 92, 46,176,110, 60,234,114,185,244,102,179,249, 43,143, 55,192,225,105,255, 58,188, 27,116,250,244,233, 68,236,
+179, 47, 40, 40,144, 84, 33, 51,102,204, 32,225,156, 79,113,237,131,207, 8, 40,117, 58,224,160,228, 63,126,252,120,148,150,150,
+ 74,106,176, 2, 53, 56, 34,229,181,147,111, 52, 26, 81, 81, 81, 1,143,139, 88,182,105, 93, 73,213,120,130,168, 17, 96,122,125,
+200, 0, 0,211,123, 41,147,158,158, 30,180,117, 21,146,117,117,117,181,213, 31,249, 27,141, 70,152, 76, 38, 73,228,239,217, 70,
+ 82, 82,146, 54, 41, 41, 41, 44,121, 60,217,243,191, 43,255, 11,109,200,127,105,154, 6,171,242,237,162,158,213, 71,107, 99,200,
+232, 4, 5,154,108, 4, 47, 60,161,193,190,163, 44,108, 77, 4,205, 14, 64, 59,238, 40,142,254,228,194,248,241,227,137, 88, 37,
+192,248,199,155, 72,249,119,245,136,237,174,198,128,129, 49,232,215,127, 24,126, 41,119, 96,200,205, 78, 68,104,170, 81,188,237,
+ 2, 30,124,240, 65,242,233,167,159,210, 6,239,234, 65,235,244,131, 22,139,197,170,215,235,145,159,159,111,245,245,189,238,223,
+191,159,188,246,218,107,216,177, 99, 71,192,250,221,184,113,227,125,106,181,122,180, 90,173, 94,164, 86,171,163, 79,157, 58,133,
+225,195,135, 67,169, 84, 34, 54, 54, 22, 39, 78,156, 64, 76, 76,140,106,255,254,253, 61,247,238,221,251,229, 51,207, 60, 51, 4,
+192, 47, 0,212,112,119, 15,248,109,248,132,237,159,176,221,226,203, 25,134, 1, 35, 66,131,218,190,125,187, 95, 25,194,114, 41,
+138,155,128,240,195, 58,191, 35,177,112,225,194,100, 79, 86, 74,138, 78, 34,253, 80, 61, 0,162,200, 95, 44,140, 70, 99,208, 99,
+196, 16,151, 63,242, 95,185,114, 37,150, 45, 91,230,173,116,132, 68, 12,228,192,120,130, 62, 35,192, 36,124,200, 8, 45,254,188,
+188, 60, 6, 0,248, 95,127,125, 46,222,100, 29,136,252, 61,158,129,160, 86,187,197, 98,177,122, 91,248,124,153,240, 25, 75,149,
+ 23,200,194, 95,154, 38,126,166,184,252,181,221,200,240, 27, 20,136,138,100,112,195, 32, 37, 46, 92,226,224,100,149,168,169, 37,
+168,107, 36, 56,241, 43, 7, 40,128,190,209,135,249,231, 19,176, 81,120,249, 63,110, 76, 30, 49, 52, 17,123,207,158, 67, 66,124,
+ 63,140, 30,147, 8,101,100,111,220,144,112, 9,151,108,118, 84,159,117,225,215,115,118, 68,171, 42, 68,201,187, 2, 32, 50, 88,
+246,178,203,243,199, 77,157, 72, 20,156,192,250,135, 70,163,209, 2,176,122,215,225,129, 3, 7, 68,145, 63, 0, 68, 68, 68,244,
+212,104, 52,243, 46, 92,184, 16, 61, 98,196, 8,220,122,235,173, 80,169, 84,120,235,173,183,224,114,185,112,203, 45,183, 96,235,
+214,173,216,191,127, 63, 14, 31, 62, 12,165, 82,249, 23,179,217, 60, 99,253,250,245,129,172,234,214,231, 39,135,199,210,108, 54,
+107, 7, 12, 24, 96, 37,132, 4, 60,231,236,217,179,218,204,204, 76, 73, 15,148,151, 29,234,249, 60, 81, 31, 63,126, 60, 96,187,
+ 49,114,228, 72,173, 84, 50, 63,126,252,184,117,206,156, 57,232,209,163,135,150, 42, 2, 93, 19, 42,127,141, 79, 48, 75,189,171,
+160,162,162, 2,203,150, 45, 11, 85,129,240,139,244,244,116,194, 12,202, 99,210,211, 19,136, 37,103, 34,176,249,110,194,196, 60,
+ 23,244,139,247, 69,214,222,164, 28,168, 91,192, 31,132, 10,197,190,125,251,172, 73, 73, 66,237, 17,236, 0, 0, 26,206, 73, 68,
+ 65, 84, 73,109, 92,255, 82,229,125,176, 36,198,111,227,246,216,234, 38,209,114,214,175, 95,159, 28,169, 92, 2,133, 2,136,142,
+ 2,106,235, 57,180, 16,130,110, 81, 12,236, 28, 96,107, 33,184,174,159, 2, 28, 11,148,157,114,161,162,162,194, 26,136,200, 22,
+ 63, 59, 53, 57,225,134,104,171, 90, 77,240,187,121,119,192,229, 34, 56, 91,237, 64,229,233, 90, 32,226, 20,162,122,181,224, 76,
+245,207, 80,168,235,112,236, 88, 45,122,244, 10, 44,239, 10,130,241,241, 29,133,204,180,222, 19, 61,121,230,126,144, 44,239,226,
+197, 41,109,182,123,247, 46, 14, 74,108, 18,149, 18, 34, 65, 73,113,241,223, 72,106,106, 42,120,210,183,217,108,173,117,200, 91,
+254,133,133,133,162,234, 52, 50, 50,242,174,166,166,166,155, 70,142, 28, 9,173, 86,139,172,172, 44, 60,245,212, 83, 0, 0,167,
+211,137,205,155, 55,163,180,180, 20,223,126,251, 45,182,108,217, 2,155,205, 54,140,227, 56, 93, 16,139, 93,214,247,105,231,206,
+157,162,186,230, 24,134,145,252, 46, 11,101,135,114,190,231, 27, 46,153, 51,103, 14,170,170,170,124,238, 31, 52,104, 16, 66, 37,
+240,170,170, 42, 84, 85, 85, 81, 69,224, 10, 67,232,238, 15,228, 13, 80, 73,181,216,229, 38,218,112,225,113,251,135,110,186,141,
+ 7,193, 64,128,217,225,254,112,152, 9,165, 76,122,122, 66,107,163,150,151,151,199, 32,103, 34,241,246, 4,136, 37,235,234,234,
+234, 54,228, 28, 10, 89,139,133, 64,233,144,165,159, 88,224,254,247,121,240,134, 13, 27,200,249,163,207, 99,224, 8, 37,154,108,
+151, 15,177,185, 8,236, 14,192,233, 41,115,178, 4, 68,225, 94,255,254,112, 41, 12, 6, 67,114, 89, 89,153,207,255,140,141,173,
+179, 54,217, 20,232,219,187, 39,106, 47, 54,163,182,174, 22,251, 14,156,197,233,115, 4,234,110,205, 24, 60,172, 17,182,230, 11,
+ 24, 62,198,137, 33, 35, 91,176,229,157, 82, 60,252,240,195,201, 39, 79,158,164, 95,253, 85, 0,222,250,103, 24, 6,169,169,169,
+ 4, 0,118,236,216, 1,131,193,144,108, 52, 26,173, 82,200,223,108, 54, 71,214,214,214,206,117, 58,157,138,232,232,104,220,123,
+239,189, 88,189,122, 53, 34, 34, 34,144,153,153,137,220,220, 92,148,150,150, 98,223,190,125,216,179,103, 15,190,255,254,123,244,
+237,219,183, 47,203,178, 55,192,143,251, 95,232, 2, 13,214, 5,160, 80, 40, 68, 93,103, 71,118, 1,108,223,190, 93,150, 46,128,
+ 30, 61,122,104,171,170,170,172,254,246,133, 91,239, 84, 17,184,122, 60, 0, 87, 19, 24, 63,228, 36, 89, 11, 78, 79, 79, 39,150,
+101, 39, 1,165, 26,232, 25, 1,244, 28, 2, 38,207, 35, 76,100,223,127, 7,128, 8,173,126, 0, 16, 90,254, 62, 26, 87, 36, 37,
+ 37,105, 3, 4, 3, 74,190,135,191,189,216,205,175, 71, 32,182, 62, 11, 63, 59, 8,206, 94,224, 0, 40, 16, 19,237,118,113, 58,
+ 89, 2,123, 11, 96,119, 0,246, 22,192,225, 4,236, 54,192,209,114,217, 75,226, 43, 32,229,111,111,119, 35,197,251, 26,112,125,
+ 66, 12, 72,132, 10, 23,108, 54, 88,191, 56,133, 99, 39, 78,227,226,197, 70,140, 26,239, 66,147,157,133,189,197, 5, 91, 51,135,
+179,149,128,173, 9,216,182,109,155, 85,202, 4, 24, 20,178,121, 56,164,126,107,132,183,254, 53, 26,141,214, 98,177,148,240, 67,
+ 70,109, 54,155,117,194,132, 9, 82,100,177, 0,134, 1,224,198,141, 27,199,105, 52, 26, 69,110,110, 46,230,207,159,143, 21, 43,
+ 86,128, 16,130,111,190,249, 6, 95,124,241, 5, 14, 31, 62,140,186,186, 58, 12, 31, 62, 28,245,245,245,209, 10,133, 34, 46,152,
+240,153, 51,103,250, 37, 84,169, 30,148,174,222, 5, 16,200, 11, 16,142,245, 79, 21, 1,170, 0,116, 8, 41, 26, 12, 6,173,160,
+207,208, 91, 9, 96,132,214,134,199, 37, 31,146, 75,143, 39,253,188,188, 60,198,146, 51, 17, 80,171,193,228,229, 93,209,155,229,
+163,254, 45, 22, 11, 99, 48, 24, 72, 48,111,136,119,108,128, 20, 66,247,133, 64,199,206,125,169, 9,131,250, 43, 48, 71,175,134,
+189, 5,232, 17,203, 64,193,120,172,126, 16,216,155,129, 38, 7, 65,147,141,160,201, 78,192, 17, 64, 17, 32,230,122,238,226, 38,
+220, 50,182, 2, 3,110,186,136,207,119, 87,227,226, 69, 59,198,221, 89,143, 49,189, 27,129,136, 22,216,155, 57, 84,159, 38,104,
+106, 98,192,178, 12,122,247,101, 0,134,163, 95,241, 85,244,237, 10,222,213, 18,225, 47, 15,189, 94,223, 46,254,200, 71, 44, 0,
+ 95,233,195, 0, 28, 92,186,116,233, 93, 42,149, 42,230,253,247,223,199,166, 77,155,240,228,147, 79, 98,229,202,149, 96, 24, 6,
+ 63,255,252, 51,108, 54, 27,140, 70, 35, 88,150,197,211, 79, 63,205, 49, 12, 19,244, 3,144, 51,154,190,171,119, 1, 4,242, 2,
+200, 97,253, 83, 80, 5, 64, 86,248,232, 71,102, 2, 28, 39,222,196,153,224,142, 80, 79, 79, 31, 76,128, 50, 88,222, 58, 9, 68,
+141,104,245, 4,240, 74,129,152,110, 0,185,192, 91,243, 6,131,129, 8,173,127,222, 35, 32,220, 54, 24, 12, 16, 36,203, 33, 82,
+ 9,221, 27,130, 81, 0, 62,229,177, 46,160,169,153,160,197,225, 14,246,107,113, 16,168, 34, 47,239,179, 55, 3, 54, 39, 65,205,
+ 69,130,243,151, 8,190, 61,198,130,227, 0,131,193,160, 45, 43, 43,107, 87, 55, 44, 11, 84,157,114,224, 84,249, 37,252,115,239,
+ 37, 16,194,224,216, 15, 28, 82,231,176, 80,171, 8,206,159, 3,254,249, 25, 80, 95, 79, 64, 56,224,238,251, 24,104, 52,128, 78,
+ 55, 3,191,252,242,139,168,123,210,221, 9,178,123,111,135,196, 12,200,234, 33,242,244,249,135,141,222,189,139,187,156, 39, 97,
+199,142, 29,237,202, 94,125,245, 85,178, 99,199, 14, 20, 22, 22,138,149,163, 0,112, 4,192,193,236,236,236,177, 61,123,246,140,
+ 1,220,110,240,247,222,123, 15,243,231,207,199,166, 77,155, 90, 45,245,236,236,108,212,214,214,162,190,190,190,177,185,185,185,
+194,227, 65, 80, 7,250, 3,142,227,218,196, 67,241, 22, 60, 33, 68,180,251, 31,184, 58,186, 0,124,121, 1,228,182,254,121,153,
+212,242,167, 10, 64, 88, 40, 45, 45, 13, 26,253,237,217, 47, 78, 96,100, 55, 88,134,252, 3,120, 59,129, 32,161, 27, 48,180, 5,
+204,141,133, 12,222, 26,223,218,247, 31, 78, 55,128,247, 80, 64,127, 67, 3,125, 53,150,124,123,193,147,191,119, 0,160,199,138,
+106, 45, 11,226, 1, 96,100, 38, 43,230,238,201,211,147, 79,159,217,109,229,250,113, 80,168,128, 8, 79,187,232,228, 8, 88, 22,
+104,104, 32,112, 56, 1,214,233, 86, 10,102,204,116,123,111,252,184,236,153,164, 59,167, 39,183, 92,216,101, 29, 53,138,195,151,
+ 95,184,192, 40,128,243,103, 25,104,162,128, 47, 62, 5, 28, 54, 6, 12, 1,198,220, 22,129,170, 74, 14,147, 39,167,160,160,160,
+ 64,212,180,214,186, 59, 65, 86, 61,227,190,127,153,149, 0, 70,102, 5, 64, 22,121,193, 92,206,157, 65,254,190, 10,249,168,127,
+225, 49,188,247, 46, 45, 45, 77,155,159,159,239, 79, 94, 35,128,147,223,125,247, 93,227, 61,247,220,211, 15,130, 49,253,239,189,
+247, 94, 43, 33, 58,157, 78,184, 92, 46,148,149,149,161, 95,191,126, 23, 56,142, 19,165, 45,206,156, 57,211,159,165, 46,233,166,
+175,134, 46, 0, 95, 94, 0, 57,173,127, 74,252,215,160, 2,224, 25,179,127, 69, 91, 24,222,202,181, 88, 44,188,197,203,248, 56,
+134,240,228, 47,176,138, 37, 65, 56, 10,128, 47,147,106,249,123, 7, 0,122,208, 90,150,149,149,101,245,116,103,136,146, 39, 36,
+127, 95, 49, 1, 82,229, 5,195,170,124, 59,130,201, 43, 40, 40, 40,233,211,147,193,253, 73, 17,224, 0, 56, 29, 28, 34,213,238,
+199,212,208, 68,208,226, 36, 96, 93, 64,233, 17, 23, 92, 28, 65,176, 33,123, 5, 5, 5, 37,253,251, 49,152,156,172,196,195,143,
+ 41,209,216, 64,208, 80, 7, 52, 53, 48, 72, 24, 78,224,114, 50, 80, 41, 52,168,189,200,161,234, 87, 7,202,126, 16, 23, 48,166,
+187, 19,100,237, 98, 96, 68, 60,176,238, 5, 96,209,155, 29,162, 4,200,233, 25,144, 69, 94, 7, 14,249, 11,229,217,113,190,200,
+127,249,242,229,237,220,252,121,121,121,124,158,128, 18, 63,214, 63,224, 78,230,115,240,198, 27,111, 44,183,219,237,131,149, 74,
+165, 38, 58, 58, 26, 0,144,159,159,143,180,180, 52,216,108, 54,216,237,118,180,180,180, 32, 38, 38,198,238,114,185, 10, 8, 33,
+103, 69, 90,215,178,188, 31, 87, 75, 23,128,208, 11,192,175, 83,226,167, 10,192, 21, 35,127, 49, 50, 61,132, 79, 60,235, 0, 64,
+132,195, 18, 75, 75, 75,219, 16,190, 47, 5,161, 29,148, 12,160, 86, 0, 81, 74, 32, 70, 5,180, 52,192,178, 34, 2, 88,251, 20,
+ 65, 84,111, 32,170,183,228,190,127, 63,228, 15, 31,100, 45,234,195,240, 38,127,239,152, 0,169,242, 36,144,127, 80,121, 53,181,
+132,217, 89,226, 36, 26, 13,192,113,192, 45, 55, 42, 47,215,199,247, 46, 56, 93, 4, 46, 78,137, 89,179,102,137, 82, 78,206,157,
+ 39,204,238, 79, 93,132,101, 1,135,147,192,197, 2, 10, 6, 72, 78, 1, 26,106, 25,252,112,200, 6,155, 93,129,233,250, 89,216,
+186,117,171, 40,242, 95,254, 20, 48,236, 58,247,246,208,193, 64, 7,121, 2, 40, 36, 32, 64,178, 31,146,146,146, 34,102, 52,128,
+178,103,207,158, 7,109, 54,219, 95, 43, 42, 42,134,140, 29, 59, 54,145,101, 89, 85, 68, 68, 4, 10, 10, 10, 48,117,234, 84,216,
+237,118, 52, 55, 55,163,172,172,172,190, 87,175, 94,127,183,217,108,239,115, 28,215, 4,145, 25, 0,133, 1, 9, 82, 93,255, 2,
+ 69,162,157,231,160, 43,118, 1, 8,189, 0,114,200, 9, 37,119, 0,197, 85,160, 0,116,134,229,239,195,250, 32, 94,215, 35,151,
+149,226,215, 35, 32,214, 3, 32, 55,249,243,202,142,151,123,159, 8,203,164,202, 11, 22, 11, 32, 85, 94,147,157, 48, 77,118, 16,
+133, 2,248,103,169,187,175,159, 15,248,115,247,251,207,146, 36,175,161,129, 48,140,194,147,147, 66,225,150,241,175,127, 0, 77,
+141, 28, 8, 7, 76,159,158,130,173, 91,183, 6,173, 15,221,157, 32,198,199,129,158, 49, 64,213, 5, 32, 42, 18,224, 8,208, 77,
+ 3,188,145, 73,149, 0,137, 32, 34,190, 75,209,240, 69,254, 12,195,144,148,148, 20, 0, 64,106,106, 42, 97, 24, 38,144, 34, 16,
+227,112, 56, 26, 21, 10, 69,241,160, 65,131,174,107,104,104,120,230,192,129, 3, 3,111,189,245, 86,142,101,217,230,186,186,186,
+115,135, 14, 29,250, 57, 33, 33,161,188, 79,159, 62, 21, 54,155, 45,159,101,217,115, 25, 25, 25, 77,227,198,141, 19,165, 0,240,
+ 73,129,194,129,217,108, 22, 77,168,161,116, 1,132,115,190, 63, 47,128, 28, 47, 11, 37,255,171, 84, 1, 16, 49,214, 95,210,135,
+ 46, 33,119,128, 20,185,140, 32,202, 63,100,242, 98, 74,193,164, 39, 60, 72,240, 19,128,159,188,247,214,121, 22,105, 99,204, 61,
+247,107,149,139, 92,189,158, 11,225,243, 12,120, 2, 4, 25,129, 55, 36, 36,121,127,123,177,155, 80, 41, 8, 69, 94,171,220,180,
+180,203,117,194, 7,252, 89, 44,150,146, 80,228, 17,174,109, 29, 55,214, 3, 41, 41, 41,216,185,115, 39,195, 91, 85,162,234,227,
+175, 87,156, 8, 59, 85, 94, 23,235,247,111, 99,177, 11, 55,188,201,159,143,219, 17, 6, 9,234,245,250, 64,242, 42, 29, 14, 71,
+ 36, 33,164,129,227, 56,179,195,225,248, 38, 62, 62,190,111,109,109, 45,243,202, 43,175,212,215,213,213,213, 12, 30, 60,184,161,
+177,177,177,201,225,112,212, 59,157,206,150, 5, 11, 22,216, 36, 90,216, 97, 63,204,204,204,204, 14, 35,194,142,148, 77,241,219,
+ 84, 0,228,110, 61, 58,172, 53,242,144, 40,227,203, 90,150, 2,153,163,250,197,100, 11, 12,235, 15,164, 76,250, 35,135, 55, 32,
+132, 58,241,187, 29,174,188,157, 59,119, 74,170,171, 14,176,238,127,107,242,228,148,205, 0, 64, 78, 78, 14, 81, 40, 20,224, 23,
+161, 11, 91,167,211,129,227, 56,112, 28,135,140,140, 12, 38,200,168, 0,134,101,217,104, 66,136,139,227,184, 22,167,211,249, 15,
+165, 82,201, 40, 20,138, 72, 0,145, 28,199,193,229,114, 41, 89,150, 85,179, 44, 59,112,193,130, 5,199, 5,231,118,248, 36, 64,
+ 20, 20, 93, 1,129,114,164, 48,161,206, 35, 76, 65, 65, 65,209, 5,208, 44, 32,116, 78, 96,216,168, 4,229,103, 0,244, 0,160,
+161,196, 79, 65, 17,216, 3, 64, 65, 65, 65,113,181, 64,227, 81, 2, 56, 1,241, 43,112,121,230, 65, 21,128,129,158,117,154, 53,
+138,130,130, 42, 0, 20, 20, 20,215, 8, 20, 0, 98, 4,219, 60,241,171, 5,164,207,121,142,163,214, 63, 5, 5, 85, 0, 40, 40,
+ 40,126, 35,109, 26, 37,125, 10,138, 0,218, 51, 5, 5, 5, 5, 5, 5,197,111, 89, 91, 62,120,240,160,112, 34, 29,226,149, 68,
+135,160,237, 68, 59,149, 22,139, 37,158,223,246, 21, 76, 40,148, 39, 21,215,162, 60, 31,195, 22, 25,250,252,104,125, 92, 45,242,
+226,227,227, 91,143,169,172,172,100,164,202, 91,184,112, 33, 50, 51, 51, 25,250,254,133, 38,147,126,191, 84,158, 20,121,146, 21,
+ 0,137,232, 39,242, 56, 98, 48, 24, 36,103,150,242, 55, 95, 60,218,143,153,246, 53, 27,160,175, 99,174, 56,120,130,241,140,133,
+183, 90, 44,150,214,108, 93, 93,101,172,182, 94,175, 79, 46, 44, 44,108, 37,193,148,148, 20,237,206,157, 59, 75,174, 69,109,215,
+ 87,125, 28, 63,238, 30, 25, 54,114,228,200,206,190, 60, 50, 99,102, 38, 10, 62, 49,251,124,103,103,204,204, 36,158,125,126, 95,
+156, 25, 51, 51, 3, 54, 2, 5,159,152, 67,126,233,226,227,227,137, 94, 63,180,117,187,176, 16, 36,152, 18, 16, 12,171,179, 87,
+ 39,111,255,108, 59, 18, 71, 37, 90,193, 0,199,191, 59,166,189,115,220, 93, 88,251,230, 90, 73,239,223,220,185,115,219,221,119,
+110,110, 46, 77,238, 68, 65,209,129, 10,128, 90,236,129, 73, 73, 73,146,133, 7, 80, 0,124,146,168,247, 68, 27, 18,136, 54, 20,
+205, 73, 76,227, 66, 44, 22, 11,140, 70, 35, 76, 38,147, 53, 64,154, 78, 49,255,223,230,152,193, 9,215, 3, 0,206,217,237, 96,
+109, 45,238,194,218,122,158,228,196,165, 63,110,109,200, 11,219,228, 20,240,228, 22,151, 52,199,187,130,113,103,215,227,127,129,
+160,235,157,209, 56,183,169, 15,158,248,195,168, 15, 57,239,129,204,152,153,137,135,116,183,217,129, 76,141,135,232, 67,250, 15,
+129, 2, 33, 59, 28, 14, 35,138,138, 50, 48,109, 90, 14,244,122, 19, 10, 11,221,207, 42, 20, 69,224,137,103,159, 32,181,189, 47,
+ 98,141,121, 53,122, 69,247, 2,199,186, 96, 39, 45,214, 79,191,249,108,218,108,215, 35,228,174,196, 73,218,197,139, 23, 7, 85,
+ 4,230,206,157, 75, 22, 46, 92,232,243,153, 82, 37,128,226,183,140,131, 7, 15,122,123, 9,218, 29, 19, 78, 12,128,164,115,189,
+167,175,149, 11, 27,204,230,228,176, 91, 95, 66, 68, 47, 98, 69, 26,141, 70, 16, 66,176,114,229,202, 64,231, 17,201,249,187,123,
+118,199,225,138,143, 80, 86,241, 79, 92,170,250, 31,148,255, 57, 3, 91,159, 78,235,212, 23,237,240,247, 71, 90, 73,254,200, 17,
+247, 58,112,121, 93, 88,206, 17,209,117, 34, 10, 82,234,227,248,241,227,152, 55,111, 30, 2,146,191, 8,133,241,254,251,119,135,
+170, 56,250,197, 67,186,219,154, 51, 50, 50, 52, 15,233,110, 11,153,216, 61, 22,126,160, 37,100,235, 31, 0,210,210,220,179,242,
+165,165,229,163,176,176, 28,122,253, 80,232,245, 67,219,116, 13, 4,253, 94, 55,108, 72,158,253,252, 35,228,119,127,152,143,151,
+103, 46,197,109,241,183, 99, 72,247, 33, 24,210,107, 8, 70,197,221,130, 63, 76,249,125,209, 75, 47, 44,195,222,234,175,173,107,
+214,172, 17,245,109, 95,184,112,161,205,114,199, 72, 27, 54, 47,254, 10,179,103,207, 38,194, 37,156,250,209,233,116,178,214,183,
+220,242, 58, 18, 11, 23, 46, 76,150, 67,134, 12,114,250, 0, 24, 15,224, 37, 0,107, 1, 20, 1, 48, 1,248, 47,207,114, 19,165,
+125,223,228,239,175,172,141, 7,192,104, 52,146,138,138, 10, 0, 64, 98, 98, 34,132,147,205, 88, 44,150, 54,219,222,251, 3, 89,
+236,213,213,213, 86,139,197, 34,218, 19, 16, 76, 89, 16, 90,245, 79,123, 82, 97,122, 91,250, 82, 93,236, 57, 57, 57, 65,143, 41,
+ 46, 22, 53,183, 58, 49, 24, 12, 88,185,114,165,207,157,203,150, 45,131,201,100,130,209,104,244,123,140, 47, 12, 78,184, 30,167,
+ 47,213, 97,235,211,105,232,195, 76, 66,249, 59, 47, 34,241,225, 68,124, 94, 94,131, 89, 43, 55,117,234,203, 54,230,150,209,173,
+235,163, 71,143,110, 83,206,123, 6,132,229,114, 91,246, 65,200,141, 24, 12, 6,204,155, 55,207,231,206,205,155, 55,195,100, 50,
+ 65, 55,233, 86,236,254,234, 59, 32,182, 27, 80,223,120,197,159,225,174,221,223, 70, 3, 57,216,181,251, 91, 89,228,157,251,115,
+159,128, 4,211,127, 73,141,168, 15, 68,232,250,207,200, 40,130, 94, 63,180,245,151,135, 94, 63, 84,116,151,192, 59, 31,190,131,
+ 21,111,255, 9,247, 12, 79,134,171,165, 5,172,139, 5,163, 98, 0, 40, 65,192,225,220,249, 42,140,236,119, 19, 94,126,250,101,
+252,105,213,159, 68,121,163,188, 27,182,148, 65,155, 1, 0, 91,182,108,105,115,238,236,217,179,137,119,153, 88,178,222,245,202,
+110, 60, 4, 29,217,189,123,119,216, 94, 5,157, 78, 71, 86,173, 90, 5, 0,178,200,235, 72,226,175,171,171,227,189,101, 97, 93,
+103, 93, 93, 29,223,166,135, 42, 39, 6,192,191, 1,248, 14,192,251, 0,166, 2,120, 16,192,239,225,158, 21, 18, 0, 46, 80,234,
+111,139, 12,163,155, 99,114, 76,203,130, 91,241, 38,147,137,177, 88, 44,140,197, 98, 97, 42, 42, 42,192,175,243, 46,101,225,182,
+175,253,254,192, 43, 21, 89, 89, 89,214,234,234,106,171, 47, 5, 65,184, 29, 36, 85,174, 47,171, 38,208,246, 21,255,192, 62,254,
+248, 99,159,196,207, 48, 76, 59,242, 95,182,108,153, 40,153,191, 86, 84,162,241,189,197,152,181, 33, 31,131, 19,174, 71,255, 62,
+ 81,168,216, 86,225, 38,255,158,221,221, 7, 69, 40, 37, 95,171, 94,175,215, 6,218, 22, 3,142, 0,215, 69, 3,219, 51,129,184,
+ 72, 96, 84,175,203,110,255,248,110,192, 39, 25,151,203,165,130, 97, 24,159,139, 20,188,254,250,235, 62,137,127,228,200,145, 48,
+153, 76, 88, 53, 47, 21, 71,202, 79, 97, 64,226, 64,160,169, 89,140,245, 15,145, 94, 0,209, 86, 94,193, 39,102,236,218,253,173,
+ 79, 75, 95,208,183, 47,233,198, 87,125, 64,252, 46,161,128, 39,125,254,215,161, 31, 38,233,252,102, 91, 51, 38,205,190,203,154,
+ 52,240, 14,180, 52, 53, 1, 74, 37, 84, 42, 21,148, 74, 37,148, 74, 21, 78,158, 60,137,173,219, 10, 78,219,157,205, 24, 18, 25,
+143, 91, 39,143,155, 50,255,119,243, 37, 91,141,111,236,154,135, 7,140, 9,237,202,183,108,217,194, 72,245, 4,240,228,143, 33,
+107,176,235,149,221, 97, 91,238, 58,157,142,172, 93,187, 22,163, 71,143,198,186,117,235,186,164, 39, 96,225,194,133,201,115,230,
+204, 33,199,143, 31,183, 86, 85, 85,201, 34,175,170,170, 10, 85, 85, 85,225,120, 19,180, 0, 38, 3, 56, 4,224, 52,128, 1, 0,
+126, 4,240, 11,128, 83,158,197, 6,138, 86,133,152, 39,127,225,186,183,178,124, 69,242, 0, 8,250, 94, 81, 81, 81,129,184,184,
+184,118, 10, 2, 95,230, 75, 65, 16,217,184,134, 28,252,247,200, 35,143,116,216,189, 11,201,202,151,213,239,153, 56,136, 9, 70,
+ 22, 54, 84,162,241,225, 59, 64, 98, 95, 4,166,188,130, 70,124, 8,188,235,182, 22,137,229, 69, 68,252,251, 58,176,172,244, 68,
+103,133,133,133, 37,194,231, 20, 36,247,186,111, 15,207,123,192,107, 27,128,235,175, 3,206,237, 80, 35,119,163, 3,243, 62,242,
+ 95, 46,201,188,151,121, 62,123, 97,176,223,153, 79, 86, 34,118,148, 6, 49,195,159,195,199, 43, 23, 96,236,232, 1,184, 49,245,
+ 79,162,234, 67,204,165,223,127,255,110,236,217,163, 19,211,151,207, 0, 32, 94,228,207,240,129,127,161,244,235,139,181,240,197,
+192, 31,209, 23,121,121, 2,130,225, 76,245, 25, 60, 96,120, 0,177,221,123,193,197,176,248,242,139,127,160,161,177, 17,250,233,
+211,113,190,186, 26,121,249, 91,241,212,147,243, 6, 71,106, 34,161, 32, 17,152,118,219,180,226, 31,173,235, 66,178, 26, 47, 93,
+186, 20,246,125, 11,201, 31,128, 71, 9,120, 62,100, 79,128, 78,167, 35,203,151, 47,199,176, 97,238,231, 57,116,232, 80,116, 37,
+ 79,128,151,197, 47, 27, 4,214, 63,191, 30,202,189,222,236,249, 38, 35, 0, 68, 3, 24, 5,224, 24,128,193, 0,234, 1,212, 66,
+254, 73,186,174,121, 92,177, 68, 64,113,113,113, 90,131,193,208,174, 43,192, 51,183, 61, 0,180,206,119, 47,149, 28, 66, 12,254,
+ 19,235,113, 8, 25,188,117,239,207,221, 47,214,250, 7,128, 79, 95, 90, 14,253,138, 55,193, 78,153, 4, 21,128,152,189, 39,240,
+121,121, 13, 0,128,157,178, 8,206,239,251,130,233,247,123,201, 36, 21,128,144, 68,163,102,230,135, 88,244,228, 41,252,244,244,
+ 82, 52,237,113, 96, 64,223,192,229,161, 42, 80,225, 42, 7,155, 55,111,118,107,195,250,123,177,175,170, 26,177, 99, 99,113,186,
+168, 28,208, 68, 34,109,209,191,163,247,117,169,157,249, 45,250,139,250, 15,169, 78, 2,120, 17,124,121, 31, 2,202, 46,202, 40,
+194,180,156,105, 72,203, 7, 50,138,220,235, 69, 25, 69,173,202,129,186,240,132,168,107,104,180, 55,160,111, 84, 31,176,246,102,
+ 16, 5,193,237, 19, 39, 98,219,182,109,246,181,111,190,169,225, 8,193, 99,143, 63,134,222,125,122,163,185,177, 17,172,139, 69,
+108, 68,119, 56, 21,206,144,238,183,182,182,182,205,232, 0,169, 1,129,237,200,159, 71,136, 74,128, 78,167, 35, 70,163, 17, 19,
+ 39, 78,108, 83, 62,122,244,104,188,241,198, 27,157,170, 4,116, 20,241,243,178,133,114,121, 47, 64, 8, 83, 5,127, 3,224,160,
+135,236, 31, 4,240, 0,128, 50, 0, 99, 0, 20, 0,216, 4,192, 9,138,176, 20, 0,226, 69,138, 68,226,254,128, 72, 76, 76,108,
+ 37,253,164,164, 36, 45, 31, 27,192,123, 7, 18, 19, 19,173,124,119, 65,103, 53,188,114, 34, 88, 95,191,192,250, 15,138, 89, 27,
+242, 65,166, 39,224,220,157,183,161, 15, 38, 33, 42,109, 29,216, 51,231,129,158,221,161,170,249, 16, 59,214,150, 2, 74,101, 40,
+247, 30,182,214,124,232,133,127,195,132,113, 64,226,162, 35, 24, 21,243, 36,126,188,193, 0,252,239, 82,191,229,157,229, 1, 48,
+153, 76,184,231,246, 27, 49,101,210, 8,232,111, 89,138,236,181,235,113,172,244, 52,158,190,111, 2,206, 22,236, 66,221,165,122,
+185,222,135, 54, 93, 5, 30, 47, 64, 80,130, 22, 18,190,156,228,239, 71,166, 40, 84, 86, 86, 50,241,241,241,196, 19,255,215,170,
+ 16, 0,192,180,156,105, 80, 23,158, 64, 97, 97,121,235, 72,128,192, 1,129, 12, 56,142,131,139, 3, 8,199, 34, 50, 74,131,199,
+159,120, 66,243,218,171,175,162,127,255,254,220,224, 1, 3, 20,246,166, 70,184, 8, 64, 56, 23, 56, 46,184, 71, 43, 55, 55,151,
+153, 58,117, 42,169,169,169, 65,125,125,125, 27,197,209,107,116,128,232, 81, 1, 58,157,142,100, 47, 56, 10,104,134, 1,103,223,
+110,127,128,102, 24,178, 23, 28, 5, 68, 42, 1, 58,157,142,204,152, 49, 67, 59,122,244,104,107, 77, 77, 77,187,253,241,241,241,
+152, 49, 99,134, 22, 93, 60, 38, 32, 92,235, 63, 76, 47,128, 80, 97, 24, 8,119, 87,192,195, 0,154, 64, 33,155, 2, 32, 37, 17,
+144,175,253, 62, 97, 48, 24,124,122, 1,120,178,143,139,139,211, 26,141, 70,171,135, 16, 97, 48, 24, 2, 6, 21, 6,178, 14, 67,
+ 24, 95,223, 33,195, 0,121,235, 62, 80, 48,160, 20,148,255, 57, 3, 17,105,235, 96,171,250, 9,170,189,235,224,204, 95, 4,230,
+161,213,216,254,251,116,252,178,253, 36,244,171,222, 7, 84,157,147,217,121,169, 5, 40, 90,181, 13,163,126,153, 6, 92,104,194,
+146,169, 75, 3,150,203,225, 1, 8,213,250, 47,216,182, 28,202,193, 55, 35, 6, 35, 80,249, 69, 14, 26, 24,130,127,253,116, 10,
+ 83,142,156, 22,117, 57,123,246,232,252,146, 61, 0,120,246,251, 60, 78, 44,249,251,121, 71,195, 34,134,112,114, 0,240,200, 40,
+186, 76,252, 0,218, 89,254,124,192, 96, 97, 97,185,207,243, 99,163, 98, 81, 85, 87,133,137, 67,238,128,173,197, 14,216,236, 96,
+ 29, 78,188,108, 52,130, 81, 64,209,220,212, 8,142,115,129,117, 17, 68,170, 34,112,190,241, 60, 34, 92,193, 71, 27,127,254,249,
+231,173,247, 54,119,238, 92,194,183, 55, 23, 46, 92,142, 9, 59,115,230,140,232,251,116,147,176, 91, 9, 24,153,208,254,255,143,
+159,116, 32,235,221, 81, 16, 75,214,158,227,200,196,137, 19, 17, 31, 31,223,110,255,145, 35, 71, 80, 80, 80, 96,237, 44,242,247,
+ 88,227, 12,239, 9,144,163,223,223,151,245, 47,131, 23,128,199, 3, 30,133,160,133, 82,184,188, 10, 64,135,128,183,252, 1, 32,
+ 41, 41, 73,107,177, 88,172,188,235,223,143,114,160, 45, 43, 43, 11, 22, 11,192,200,101,205, 75, 33, 19,177, 10, 6,111,253,251,
+ 34,126, 94,209,145,114,189,135,202,107,224,252,254, 53,156,195, 87, 24,240,208,106,160,174, 30,229, 57, 47, 98,232,194, 53, 56,
+187,233, 69, 32, 66, 5, 40, 58, 39,179,115,101, 19, 48, 50,238, 97,209,229,157,225, 1, 48,153, 76,141,179,167,220,113,166, 7,
+215,235,250,102, 68,104,242,215, 44,194, 95,118, 28,196,146, 7,239,198,188, 55, 63, 64,250,127,255, 95,135,122,131, 2,221, 98,
+193, 39,102,120,146, 0, 49,225, 42,167,225,184,250, 3,121, 1, 50,138,138,136, 47,242, 23, 90,255,193, 48, 40,110, 16, 62,253,
+178, 8,119, 93,127, 23,162,187,197,128,227, 8, 20,132, 5,199, 48, 32,132,192, 69, 0,150, 35, 96, 89, 22,182,186, 38,236,220,
+191, 19,106,151, 90,114, 80,170,119,160,211,127, 44,154,132,148, 65, 21, 96, 62, 19, 47,195,159, 18, 32,149,252,189,149,128, 85,
+171, 86, 97,224,192,129,151, 21,251,242,114,152, 76, 38,116, 5,203, 95,110, 69,192,151,245, 31,166, 23, 0, 0,146, 1,220, 0,
+224,143,184, 60,241, 19, 69, 87, 86, 0,226,226,226,180,222, 30, 1,190,223, 93,168, 28, 8,215,195,180,224, 37,191, 88, 50, 14,
+ 3,244,105,253,135, 74,252, 60,102,173,220,132,173, 0, 30, 92,145, 2, 98,121, 17,204, 35,217, 56, 84, 94, 3,166,119, 47,156,
+248,181,222,109,253, 75,239, 2,144, 5, 71,142, 28,105, 29,242, 39,102, 93, 14, 15,128, 20,229, 96,243,230,205, 14, 0, 13, 11,
+146,199,212, 63,183,250,127, 28, 47,189,108,180,247,235, 30, 87,115,244, 88,101,255,121,199, 62,136,233, 36,226, 23, 67,206,194,
+ 46, 26,209, 94,128,142, 74, 6,228,139,252,121,203, 31, 64,208,128,192,197,139, 23, 51,119,221,127,215,116,235,164,146, 2,195,
+ 45,233,168,183,215,131, 81, 0,238,193, 72, 28, 92, 46, 2,142,101,209, 45, 50, 22, 95,215,125,135,178,189, 39,144,103,206, 43,
+ 9,251,194,203,127, 7, 64,250, 48,192, 54, 74,192,192, 74, 28, 63, 19, 31, 18,249,123, 43, 1,235,214,173, 67,207,158, 61, 81,
+ 83, 83,131,229,203,151,163,171,185,253,229, 80, 4,252, 89,255, 33,122, 1,250,195, 29,245,175, 0,112, 43,128, 44, 0,229,148,
+190,101, 86, 0, 58, 42, 15,128, 63,143, 64,118,118,182,214, 91, 81, 48, 24, 12,146, 19, 6, 9,137,160, 43,164,216, 21, 90,255,
+ 66,226, 55, 26,141,124,183,135,240,185,138,190, 96, 94, 9,120,120,197,123, 32,249, 64,223,121,102,148, 60,151,142,187, 77,127,
+ 3, 34, 34,208, 77,163,238,148,251, 21,142,241,247,181, 30, 98, 30, 0, 22,128,194, 83,183,138, 48,235,227,220,236, 41,119, 84,
+ 61,151, 83,152,240,242, 83, 15,116, 31, 52, 32,217, 1,224,176,193, 96,232, 1,247,248,226,144,234,131,127,229,246,236,209,241,
+ 17,255,161, 40,119, 76, 48, 11, 94, 10,161,203,225,234,151, 2,111,210,231, 61, 2,189,123,247,246,169,157,125,189,231,235,237,
+241, 55, 93, 15,215,108,246,240,228,235, 39,143,233, 19,219, 7,118,167, 29,132, 16,168, 85,106,212,218,154,177,239,215, 61,216,
+252,215, 92,104,111,214,106,243,144, 23,246, 53,190,177,107, 30,114,115,115, 81, 86, 38, 61, 7,192,101, 37, 0, 97,145,191, 80,
+222,162, 69,139,200,170, 85,171,176,116,233, 82,116,229, 62,127,161, 34, 80, 82, 82, 18,210,185,129,142,145, 32,115, 6,220,227,
+253,237, 0, 94, 0,176, 31,128,139,210,183,111,140, 27, 55, 14, 7, 15, 30, 68,142,105, 89,187, 60, 0,222,217, 0, 85, 94, 13,
+101,192, 62,126,225,182,247,126, 41,147, 17, 4, 34,250, 16,189, 0, 97,161,163,134, 1,242,202,136,217,108, 70,113,113, 49, 87,
+ 81, 81, 33, 36, 50,173,197, 98,145,108,221,204, 90,185, 9, 16, 36,254,153,252,242,134,214,245, 78,138,134, 9,218,128,113, 36,
+164,103,183, 22,192, 69,184,135,255, 60, 30,230, 53,158, 93,144, 60,166,101,106,241, 55,221, 31,123,245,125,152,205,102,117,113,
+113,241, 64,180, 77,103, 29, 82,125,116,180, 39, 32, 88,126,255,160, 45,103, 7,116, 9,248, 35,127,135,126, 24, 80, 24,220, 48,
+251,232,237, 45, 76, 55,101, 12,217, 27,191, 15,147,238,152,132,193,177,131, 1,142,224,188,189, 6, 95,127,251, 53,206, 30, 61,
+139,251, 70,222,167,125,246,217,103, 59,189, 62,132, 74,128, 92,100,205,123, 2,174,150,128,191, 48,250,234,229, 66,142,103,161,
+144,250,224, 76,203,196,123, 0, 58, 10, 89, 89, 89, 62,201,222,107, 38, 54, 33,172,190,242, 22, 7, 35,218, 80,209, 17,195, 0,
+ 77, 38, 19,204,102, 51, 91, 92, 92,172,242,116, 29,240,228,127, 95,128,251,246, 9,207,100, 74, 29,145, 74,153, 4, 40,239,148,
+198,201,108, 54, 71,122,222,203, 87, 60, 69,174,204,204,204, 39,194, 20, 27, 57,245,143,239,148,154,205,230,123,139,139,139, 81,
+ 92, 92,108, 7,160,241, 44,114, 16, 63, 35,114,188,191,100,146,246,236,111, 83, 95, 82,137, 91,142, 46,129,202,202, 74,166, 40,
+163,136, 12, 90, 52, 72,139, 33,190,143,169,202, 40,178,138,141, 7,216,248,214, 70,102,205,154, 53,201,155, 86,108, 66,252,176,
+ 27,172, 0,240,227,145, 31,180,169, 83,245, 88,187,126,109,201, 71,248, 40,164,235,204,205,205,101, 30,120,224,129,118,163, 2,
+156,206,240, 70,136,201, 77,214,215, 90,180, 63, 69,215,244, 2,120,151,137, 86, 0,130, 89,226, 18, 44,245, 80, 95,116,210,193,
+242,229, 58,223,167, 60,131,193, 64,138,139,139, 85,194,231, 37,244,176, 72, 84, 80, 74, 58,136,144,187, 98, 35, 20, 11,160, 17,
+ 32, 4,238,196,252, 81, 8,111,124, 47, 95, 31, 63, 23, 23, 23,243,227,202,234, 19, 19, 19,251,153, 76,166,200,174,240, 44, 59,
+210,109, 47,167,236,202,202, 74,166,114, 73,165,108,207,224,249,231,159, 47,241, 62,239,235,191,239, 13,251, 58, 63,251,236, 51,
+ 74,174, 20, 84, 9, 16, 97, 68, 51,161,206, 35, 76, 65, 65, 65, 65, 65, 65,113,245, 66, 65, 31, 1, 5, 5, 5, 5, 5, 5, 85,
+ 0, 40, 40, 40, 40, 40, 40, 40,126, 3,248,127, 37, 93,196,116, 64, 61,103,188, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
};
diff --git a/source/blender/src/booleanops.c b/source/blender/src/booleanops.c
index 2640a19ebf1..04214beeb90 100644
--- a/source/blender/src/booleanops.c
+++ b/source/blender/src/booleanops.c
@@ -449,8 +449,8 @@ DerivedMesh *NewBooleanDerivedMesh_intern(
float map_mat[4][4];
DerivedMesh *dm = NULL;
- Mesh *me1 = get_mesh(ob);
- Mesh *me2 = get_mesh(ob_select);
+ Mesh *me1 = get_mesh(ob_select);
+ Mesh *me2 = get_mesh(ob);
if (me1 == NULL || me2 == NULL) return 0;
if (!me1->totface || !me2->totface) return 0;
@@ -458,9 +458,9 @@ DerivedMesh *NewBooleanDerivedMesh_intern(
// we map the final object back into ob's local coordinate space. For this
// we need to compute the inverse transform from global to ob (inv_mat),
// and the transform from ob to ob_select for use in interpolation (map_mat)
- Mat4Invert(inv_mat, ob_select->obmat);
- Mat4MulMat4(map_mat, ob->obmat, inv_mat);
Mat4Invert(inv_mat, ob->obmat);
+ Mat4MulMat4(map_mat, ob_select->obmat, inv_mat);
+ Mat4Invert(inv_mat, ob_select->obmat);
{
// interface with the boolean module:
@@ -484,8 +484,8 @@ DerivedMesh *NewBooleanDerivedMesh_intern(
default : op_type = e_csg_intersection;
}
- BuildMeshDescriptors(ob, 0, &fd_1, &vd_1);
- BuildMeshDescriptors(ob_select, me1->totface, &fd_2, &vd_2);
+ BuildMeshDescriptors(ob_select, 0, &fd_1, &vd_1);
+ BuildMeshDescriptors(ob, me1->totface, &fd_2, &vd_2);
bool_op = CSG_NewBooleanFunction();
@@ -500,7 +500,7 @@ DerivedMesh *NewBooleanDerivedMesh_intern(
// iterate through results of operation and insert
// into new object
dm = ConvertCSGDescriptorsToDerivedMesh(
- &fd_o, &vd_o, inv_mat, map_mat, mat, totmat, ob, ob_select);
+ &fd_o, &vd_o, inv_mat, map_mat, mat, totmat, ob_select, ob);
// free up the memory
CSG_FreeVertexDescriptor(&vd_o);
@@ -540,7 +540,7 @@ int NewBooleanMesh(Base *base, Base *base_select, int int_op_type)
}
/* create a new blender mesh object - using 'base' as a template */
- ob_new= AddNewBlenderMesh(base);
+ ob_new= AddNewBlenderMesh(base_select);
me_new= ob_new->data;
DM_to_mesh(dm, me_new);
diff --git a/source/blender/src/butspace.c b/source/blender/src/butspace.c
index f694c9aa862..2eddd362b62 100644
--- a/source/blender/src/butspace.c
+++ b/source/blender/src/butspace.c
@@ -738,6 +738,8 @@ void drawbutspace(ScrArea *sa, void *spacedata)
object_panels();
else if(tab==TAB_OBJECT_PHYSICS)
physics_panels();
+ else if(tab==TAB_OBJECT_PARTICLE)
+ particle_panels();
break;
case CONTEXT_SHADING:
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index e593f9c5409..bebd3e1962f 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -66,6 +66,7 @@
#include "DNA_nla_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
+#include "DNA_particle_types.h"
#include "DNA_radio_types.h"
#include "DNA_screen_types.h"
#include "DNA_texture_types.h"
@@ -86,8 +87,10 @@
#include "BKE_key.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_packedFile.h"
+#include "BKE_particle.h"
#include "BKE_scene.h"
#include "BLI_blenlib.h"
@@ -105,6 +108,8 @@
#include "BIF_editfont.h"
#include "BIF_editkey.h"
#include "BIF_editmesh.h"
+#include "BIF_editparticle.h"
+#include "BIF_imasel.h"
#include "BIF_interface.h"
#include "BIF_meshtools.h"
#include "BIF_mywindow.h"
@@ -536,7 +541,7 @@ void do_common_editbuts(unsigned short event) // old name, is a mix of object an
if(G.obedit->type == OB_MESH) reveal_mesh();
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) revealNurb();
}
- else if(G.f & G_FACESELECT) reveal_tface();
+ else if(FACESEL_PAINT_TEST) reveal_tface();
break;
case B_SELSWAP:
@@ -719,8 +724,6 @@ static void delete_customdata_layer(void *data1, void *data2)
if(!CustomData_has_layer(data, type)) {
if(type == CD_MCOL && (G.f & G_VERTEXPAINT))
G.f &= ~G_VERTEXPAINT; /* get out of vertexpaint mode */
- if(type == CD_MTFACE && (G.f & G_FACESELECT))
- set_faceselect(); /* get out of faceselect mode */
}
/*reconstruct active layer*/
@@ -951,7 +954,7 @@ static uiBlock *modifiers_add_menu(void *ob_v)
ModifierTypeInfo *mti = modifierType_getInfo(i);
/* Only allow adding through appropriate other interfaces */
- if(ELEM(i, eModifierType_Softbody, eModifierType_Hook)) continue;
+ if(ELEM3(i, eModifierType_Softbody, eModifierType_Hook, eModifierType_ParticleSystem)) continue;
if((mti->flags&eModifierTypeFlag_AcceptsCVs) ||
(ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
@@ -991,6 +994,12 @@ static void modifiers_del(void *ob_v, void *md_v)
if (!md)
return;
+ if(md->type==eModifierType_ParticleSystem){
+ ParticleSystemModifierData *psmd=(ParticleSystemModifierData*)md;
+ BLI_remlink(&ob->particlesystem, psmd->psys);
+ psys_free(ob,psmd->psys);
+ }
+
BLI_remlink(&ob->modifiers, md_v);
modifier_free(md_v);
@@ -1202,7 +1211,93 @@ void autocomplete_meshob(char *str, void *arg_v)
autocomplete_end(autocpl, str);
}
}
+static void modifiers_convertParticles(void *obv, void *mdv)
+{
+ Object *obn;
+ ModifierData *md = mdv;
+ ParticleSystem *psys;
+ ParticleCacheKey *key, **cache;
+ Mesh *me;
+ MVert *mvert;
+ MFace *mface;
+ int a, k, kmax;
+ int totvert=0, totface=0, cvert=0;
+ int totpart=0, totchild=0;
+
+ if(md->type != eModifierType_ParticleSystem) return;
+
+ if(G.f & G_PARTICLEEDIT) return;
+
+ psys=((ParticleSystemModifierData *)md)->psys;
+
+ if(psys->part->draw_as != PART_DRAW_PATH || psys->pathcache == 0) return;
+
+ totpart= psys->totcached;
+ totchild= psys->totchildcache;
+
+ if(totchild && (psys->part->draw&PART_DRAW_PARENT)==0)
+ totpart= 0;
+
+ /* count */
+ cache= psys->pathcache;
+ for(a=0; a<totpart; a++) {
+ key= cache[a];
+ totvert+= (int)(key->col[3])+1;
+ totface+= (int)(key->col[3]);
+ }
+ cache= psys->childcache;
+ for(a=0; a<totchild; a++) {
+ key= cache[a];
+ totvert+= (int)(key->col[3])+1;
+ totface+= (int)(key->col[3]);
+ }
+
+ if(totvert==0) return;
+
+ /* add new mesh */
+ obn= add_object(OB_MESH);
+ me= obn->data;
+
+ me->totvert= totvert;
+ me->totface= totface;
+
+ me->mvert= CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, totvert);
+ me->mface= CustomData_add_layer(&me->fdata, CD_MFACE, CD_CALLOC, NULL, totface);
+
+ mvert= me->mvert;
+ mface= me->mface;
+
+ /* copy coordinates */
+ cache= psys->pathcache;
+ for(a=0; a<totpart; a++){
+ key= cache[a];
+ kmax= (int)(key->col[3]);
+ for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
+ VECCOPY(mvert->co,key->co);
+ if(k){
+ mface->v1= cvert-1;
+ mface->v2= cvert;
+ mface++;
+ }
+ }
+ }
+
+ cache=psys->childcache;
+ for(a=0; a<totchild; a++) {
+ key=cache[a];
+ kmax=(int)(key->col[3]);
+ for(k=0; k<=kmax; k++,key++,cvert++,mvert++) {
+ VECCOPY(mvert->co,key->co);
+ if(k){
+ mface->v1=cvert-1;
+ mface->v2=cvert;
+ mface++;
+ }
+ }
+ }
+ make_edges(me, 0);
+}
static void modifiers_applyModifier(void *obv, void *mdv)
{
Object *ob = obv;
@@ -1466,6 +1561,54 @@ void set_uvproject_uvlayer(void *arg1, void *arg2)
strcpy(umd->uvlayer_name, layer->name);
}
+static void modifiers_bindMeshDeform(void *ob_v, void *md_v)
+{
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md_v;
+ Object *ob = (Object*)ob_v;
+
+ if(mmd->bindcos) {
+ if(mmd->bindweights) MEM_freeN(mmd->bindweights);
+ if(mmd->bindcos) MEM_freeN(mmd->bindcos);
+ if(mmd->dyngrid) MEM_freeN(mmd->dyngrid);
+ if(mmd->dyninfluences) MEM_freeN(mmd->dyninfluences);
+ if(mmd->dynverts) MEM_freeN(mmd->dynverts);
+ mmd->bindweights= NULL;
+ mmd->bindcos= NULL;
+ mmd->dyngrid= NULL;
+ mmd->dyninfluences= NULL;
+ mmd->dynverts= NULL;
+ mmd->totvert= 0;
+ mmd->totcagevert= 0;
+ mmd->totinfluence= 0;
+ }
+ else {
+ DerivedMesh *dm;
+ int mode= mmd->modifier.mode;
+
+ /* force modifier to run, it will call binding routine */
+ mmd->needbind= 1;
+ mmd->modifier.mode |= eModifierMode_Realtime;
+
+ if(ob->type == OB_MESH) {
+ dm= mesh_create_derived_view(ob, 0);
+ dm->release(dm);
+ }
+ else if(ob->type == OB_LATTICE) {
+ lattice_calc_modifiers(ob);
+ }
+
+ mmd->needbind= 0;
+ mmd->modifier.mode= mode;
+ }
+}
+
+void modifiers_explodeFacepa(void *arg1, void *arg2)
+{
+ ExplodeModifierData *emd=arg1;
+
+ emd->flag |= eExplodeFlag_CalcFaces;
+}
+
static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco, int *yco, int index, int cageIndex, int lastCageIndex)
{
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -1564,7 +1707,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
} else if (md->type==eModifierType_Build) {
height = 86;
} else if (md->type==eModifierType_Mirror) {
- height = 67;
+ height = 86;
} else if (md->type==eModifierType_EdgeSplit) {
EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md;
height = 48;
@@ -1592,7 +1735,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
if(wmd->flag & MOD_WAVE_NORM)
height += 19;
} else if (md->type==eModifierType_Armature) {
- height = 67;
+ height = 105;
} else if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md;
height = 86;
@@ -1601,13 +1744,22 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
if(hmd->indexar==NULL)
height += 20;
} else if (md->type==eModifierType_Softbody) {
- height = 26;
+ height = 31;
} else if (md->type==eModifierType_Boolean) {
height = 48;
} else if (md->type==eModifierType_Array) {
height = 211;
- }
-
+ } else if (md->type==eModifierType_MeshDeform) {
+ MeshDeformModifierData *mmd= (MeshDeformModifierData*)md;
+ height = (mmd->bindcos)? 73: 93;
+ } else if (md->type==eModifierType_ParticleSystem) {
+ height = 31;
+ } else if (md->type==eModifierType_ParticleInstance) {
+ height = 94;
+ } else if (md->type==eModifierType_Explode) {
+ height = 94;
+ }
+
/* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */
uiDefBut(block, ROUNDBOX, 0, "", x-10, y-height-2, width, height-2, NULL, 5.0, 0.0, 12, 40, "");
@@ -1615,9 +1767,16 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
if (!isVirtual) {
uiBlockBeginAlign(block);
- but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Apply", lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Apply the current modifier and remove from the stack");
- uiButSetFunc(but, modifiers_applyModifier, ob, md);
- if (md->type!=eModifierType_Softbody) {
+ if (md->type==eModifierType_ParticleSystem) {
+ but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Convert", lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Convert the current particles to a mesh object");
+ uiButSetFunc(but, modifiers_convertParticles, ob, md);
+ }
+ else{
+ but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Apply", lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Apply the current modifier and remove from the stack");
+ uiButSetFunc(but, modifiers_applyModifier, ob, md);
+ }
+
+ if (md->type!=eModifierType_Softbody && md->type!=eModifierType_ParticleSystem) {
but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Copy", lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Duplicate the current modifier at the same position in the stack");
uiButSetFunc(but, modifiers_copyModifier, ob, md);
}
@@ -1685,6 +1844,11 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
&mmd->flag, 0, 0, 0, 0,
"Mirror the V texture coordinate around "
"the 0.5 point");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CHANGEDEP,
+ "Ob: ", lx, (cy -= 19), buttonWidth, 19,
+ &mmd->mirror_ob,
+ "Object to use as mirror");
+
} else if (md->type==eModifierType_EdgeSplit) {
EdgeSplitModifierData *emd = (EdgeSplitModifierData*) md;
uiDefButBitI(block, TOG, MOD_EDGESPLIT_FROMANGLE,
@@ -1858,11 +2022,11 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiBlockBeginAlign(block);
if(wmd->speed >= 0)
- uiDefButF(block, NUM, B_MODIFIER_RECALC, "Time sta:", lx,(cy-=19),buttonWidth,19, &wmd->timeoffs, -1000.0, 1000.0, 100, 0, "Specify starting frame of the wave");
+ uiDefButF(block, NUM, B_MODIFIER_RECALC, "Time sta:", lx,(cy-=19),buttonWidth,19, &wmd->timeoffs, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify starting frame of the wave");
else
- uiDefButF(block, NUM, B_MODIFIER_RECALC, "Time end:", lx,(cy-=19),buttonWidth,19, &wmd->timeoffs, -1000.0, 1000.0, 100, 0, "Specify ending frame of the wave");
- uiDefButF(block, NUM, B_MODIFIER_RECALC, "Lifetime:", lx,(cy-=19),buttonWidth,19, &wmd->lifetime, -1000.0, 1000.0, 100, 0, "Specify the lifespan of the wave");
- uiDefButF(block, NUM, B_MODIFIER_RECALC, "Damptime:", lx,(cy-=19),buttonWidth,19, &wmd->damp, -1000.0, 1000.0, 100, 0, "Specify the dampingtime of the wave");
+ uiDefButF(block, NUM, B_MODIFIER_RECALC, "Time end:", lx,(cy-=19),buttonWidth,19, &wmd->timeoffs, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify ending frame of the wave");
+ uiDefButF(block, NUM, B_MODIFIER_RECALC, "Lifetime:", lx,(cy-=19),buttonWidth,19, &wmd->lifetime, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify the lifespan of the wave");
+ uiDefButF(block, NUM, B_MODIFIER_RECALC, "Damptime:", lx,(cy-=19),buttonWidth,19, &wmd->damp, -MAXFRAMEF, MAXFRAMEF, 100, 0, "Specify the dampingtime of the wave");
cy -= 9;
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Sta x:", lx,(cy-=19),113,19, &wmd->startx, -100.0, 100.0, 100, 0, "Starting position for the X axis");
@@ -1909,11 +2073,17 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
ArmatureModifierData *amd = (ArmatureModifierData*) md;
uiDefIDPoinBut(block, modifier_testArmatureObj, ID_OB, B_CHANGEDEP, "Ob: ", lx, (cy-=19), buttonWidth,19, &amd->object, "Armature object to deform with");
- but=uiDefBut(block, TEX, B_MODIFIER_RECALC, "VGroup: ", lx, (cy-=19), buttonWidth,19, &amd->defgrp_name, 0.0, 31.0, 0, 0, "Vertex Group name to control overall armature influence");
+ but=uiDefBut(block, TEX, B_MODIFIER_RECALC, "VGroup: ", lx, (cy-=19), buttonWidth-40,19, &amd->defgrp_name, 0.0, 31.0, 0, 0, "Vertex Group name to control overall armature influence");
uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)ob);
+ uiDefButBitS(block, TOG, ARM_DEF_INVERT_VGROUP, B_ARM_RECALCDATA, "Inv", lx+buttonWidth-40,cy, 40, 20, &amd->deformflag, 0, 0, 0, 0, "Invert vertex group influence");
+
uiDefButBitS(block, TOG, ARM_DEF_VGROUP, B_ARM_RECALCDATA, "Vert.Groups", lx,cy-=19,buttonWidth/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable VertexGroups defining deform");
uiDefButBitS(block, TOG, ARM_DEF_ENVELOPE, B_ARM_RECALCDATA, "Envelopes", lx+buttonWidth/2,cy,(buttonWidth + 1)/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable Bone Envelopes defining deform");
+ uiDefButBitS(block, TOG, ARM_DEF_QUATERNION, B_ARM_RECALCDATA, "Quaternion", lx,(cy-=19),buttonWidth/2,20, &amd->deformflag, 0, 0, 0, 0, "Enable deform rotation interpolation with Quaternions");
+ uiDefButBitS(block, TOG, ARM_DEF_B_BONE_REST, B_ARM_RECALCDATA, "B-Bone Rest", lx+buttonWidth/2,cy,(buttonWidth + 1)/2,20, &amd->deformflag, 0, 0, 0, 0, "Make B-Bones deform already in rest position");
+ uiDefButS(block, TOG, B_ARM_RECALCDATA, "MultiModifier", lx,cy-=19, buttonWidth, 20, &amd->multi, 0, 0, 0, 0, "Use same input as previous modifier, and mix results using overall vgroup");
+
} else if (md->type==eModifierType_Hook) {
HookModifierData *hmd = (HookModifierData*) md;
uiDefButF(block, NUM, B_MODIFIER_RECALC, "Falloff: ", lx, (cy-=19), buttonWidth,19, &hmd->falloff, 0.0, 100.0, 100, 0, "If not zero, the distance from hook where influence ends");
@@ -2084,7 +2254,62 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
&amd->end_cap,
"Mesh object to use as end cap");
uiButSetCompleteFunc(but, autocomplete_meshob, (void *)ob);
+ } else if (md->type==eModifierType_MeshDeform) {
+ MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
+
+ uiBlockBeginAlign(block);
+ uiDefIDPoinBut(block, test_meshobpoin_but, ID_OB, B_CHANGEDEP, "Ob: ", lx, (cy-=19), buttonWidth,19, &mmd->object, "Mesh object to be use as cage");
+ but=uiDefBut(block, TEX, B_MODIFIER_RECALC, "VGroup: ", lx, (cy-19), buttonWidth-40,19, &mmd->defgrp_name, 0.0, 31.0, 0, 0, "Vertex Group name to control overall meshdeform influence");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)ob);
+ uiDefButBitS(block, TOG, MOD_MDEF_INVERT_VGROUP, B_MODIFIER_RECALC, "Inv", lx+buttonWidth-40, (cy-=19), 40,19, &mmd->flag, 0.0, 31.0, 0, 0, "Invert vertex group influence");
+
+ uiBlockBeginAlign(block);
+ if(mmd->bindcos) {
+ but= uiDefBut(block, BUT, B_MODIFIER_RECALC, "Unbind", lx,(cy-=24), buttonWidth,19, 0, 0, 0, 0, 0, "Unbind mesh from cage");
+ uiButSetFunc(but,modifiers_bindMeshDeform,ob,md);
+ }
+ else {
+ but= uiDefBut(block, BUT, B_MODIFIER_RECALC, "Bind", lx,(cy-=24), buttonWidth,19, 0, 0, 0, 0, 0, "Bind mesh to cage");
+ uiButSetFunc(but,modifiers_bindMeshDeform,ob,md);
+ uiDefButS(block, NUM, B_NOP, "Precision:", lx,(cy-19), buttonWidth/2 + 20,19, &mmd->gridsize, 2, 10, 0.5, 0, "The grid size for binding");
+ uiDefButBitS(block, TOG, MOD_MDEF_DYNAMIC_BIND, B_MODIFIER_RECALC, "Dynamic", lx+(buttonWidth+1)/2 + 20, (cy-=19), buttonWidth/2 - 20,19, &mmd->flag, 0.0, 31.0, 0, 0, "Invert vertex group influence");
+ }
+ uiBlockEndAlign(block);
+ } else if (md->type==eModifierType_ParticleSystem) {
+ uiDefBut(block, LABEL, 1, "See Particle buttons.", lx, (cy-=19), buttonWidth,19, NULL, 0.0, 0.0, 0, 0, "");
+ } else if (md->type==eModifierType_ParticleInstance) {
+ ParticleInstanceModifierData *pimd = (ParticleInstanceModifierData*) md;
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CHANGEDEP, "Ob: ", lx, (cy -= 19), buttonWidth, 19, &pimd->ob, "Object that has the particlesystem");
+ uiDefButS(block, NUM, B_MODIFIER_RECALC, "PSYS:", lx, (cy -= 19), buttonWidth, 19, &pimd->psys, 1, 10, 10, 3, "Particlesystem number in the object");
+ uiDefButBitS(block, TOG, eParticleInstanceFlag_Parents, B_MODIFIER_RECALC, "Normal", lx, (cy -= 19), buttonWidth/3,19, &pimd->flag, 0, 0, 0, 0, "Create instances from normal particles");
+ uiDefButBitS(block, TOG, eParticleInstanceFlag_Children, B_MODIFIER_RECALC, "Children", lx+buttonWidth/3, cy, buttonWidth/3,19, &pimd->flag, 0, 0, 0, 0, "Create instances from child particles");
+ uiDefButBitS(block, TOG, eParticleInstanceFlag_Path, B_MODIFIER_RECALC, "Path", lx+buttonWidth*2/3, cy, buttonWidth/3,19, &pimd->flag, 0, 0, 0, 0, "Create instances along particle paths");
+ uiDefButBitS(block, TOG, eParticleInstanceFlag_Unborn, B_MODIFIER_RECALC, "Unborn", lx, (cy -= 19), buttonWidth/3,19, &pimd->flag, 0, 0, 0, 0, "Show instances when particles are unborn");
+ uiDefButBitS(block, TOG, eParticleInstanceFlag_Alive, B_MODIFIER_RECALC, "Alive", lx+buttonWidth/3, cy, buttonWidth/3,19, &pimd->flag, 0, 0, 0, 0, "Show instances when particles are alive");
+ uiDefButBitS(block, TOG, eParticleInstanceFlag_Dead, B_MODIFIER_RECALC, "Dead", lx+buttonWidth*2/3, cy, buttonWidth/3,19, &pimd->flag, 0, 0, 0, 0, "Show instances when particles are dead");
+ } else if (md->type==eModifierType_Explode) {
+ ExplodeModifierData *emd = (ExplodeModifierData*) md;
+ uiBut *but;
+ char *menustr= get_vertexgroup_menustr(ob);
+ int defCount=BLI_countlist(&ob->defbase);
+ if(defCount==0) emd->vgroup=0;
+
+ but=uiDefButS(block, MENU, B_MODIFIER_RECALC, menustr, lx, (cy-=19), buttonWidth/2,19, &emd->vgroup, 0, defCount, 0, 0, "Protect this vertex group");
+ uiButSetFunc(but,modifiers_explodeFacepa,emd,0);
+ MEM_freeN(menustr);
+
+ but=uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "", lx+buttonWidth/2, cy, buttonWidth/2,19, &emd->protect, 0.0f, 1.0f, 0, 0, "Clean vertex group edges");
+ uiButSetFunc(but,modifiers_explodeFacepa,emd,0);
+
+ but=uiDefBut(block, BUT, B_MODIFIER_RECALC, "Refresh", lx, (cy-=19), buttonWidth/2,19, 0, 0, 0, 0, 0, "Recalculate faces assigned to particles");
+ uiButSetFunc(but,modifiers_explodeFacepa,emd,0);
+
+ uiDefButBitS(block, TOG, eExplodeFlag_EdgeSplit, B_MODIFIER_RECALC, "Split Edges", lx+buttonWidth/2, cy, buttonWidth/2,19, &emd->flag, 0, 0, 0, 0, "Split face edges for nicer shrapnel");
+ uiDefButBitS(block, TOG, eExplodeFlag_Unborn, B_MODIFIER_RECALC, "Unborn", lx, (cy-=19), buttonWidth/3,19, &emd->flag, 0, 0, 0, 0, "Show mesh when particles are unborn");
+ uiDefButBitS(block, TOG, eExplodeFlag_Alive, B_MODIFIER_RECALC, "Alive", lx+buttonWidth/3, cy, buttonWidth/3,19, &emd->flag, 0, 0, 0, 0, "Show mesh when particles are alive");
+ uiDefButBitS(block, TOG, eExplodeFlag_Dead, B_MODIFIER_RECALC, "Dead", lx+buttonWidth*2/3, cy, buttonWidth/3,19, &emd->flag, 0, 0, 0, 0, "Show mesh when particles are dead");
}
+
uiBlockEndAlign(block);
y-=height;
@@ -2104,6 +2329,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
uiDefBut(block, LABEL, B_NOP, str, x+15, y+15, width-35, 19, NULL, 0.0, 0.0, 0.0, 0.0, "");
}
+ uiClearButLock();
+
y -= 3+6;
*xco = x;
@@ -2141,7 +2368,7 @@ static void editing_panel_modifiers(Object *ob)
if(yco < 0) uiNewPanelHeight(block, 204-yco);
}
-static char *make_key_menu(Key *key)
+static char *make_key_menu(Key *key, int startindex)
{
KeyBlock *kb;
int index= 1;
@@ -2151,7 +2378,7 @@ static char *make_key_menu(Key *key)
str= MEM_mallocN(index*40, "key string");
str[0]= 0;
- index= 1;
+ index= startindex;
for (kb = key->block.first; kb; kb=kb->next, index++) {
sprintf (item, "|%s%%x%d", kb->name, index);
strcat(str, item);
@@ -2197,9 +2424,10 @@ static void editing_panel_shapes(Object *ob)
uiDefIconButBitS(block, TOG, OB_SHAPE_LOCK, B_LOCKKEY, icon, 10,150,25,20, &ob->shapeflag, 0, 0, 0, 0, "Always show the current Shape for this Object");
uiSetButLock(G.obedit==ob, "Unable to perform in EditMode");
uiDefIconBut(block, BUT, B_PREVKEY, ICON_TRIA_LEFT, 35,150,20,20, NULL, 0, 0, 0, 0, "Previous Shape Key");
- strp= make_key_menu(key);
- uiDefButS(block, MENU, B_SETKEY, strp, 55,150,20,20, &ob->shapenr, 0, 0, 0, 0, "Browses existing choices or adds NEW");
+ strp= make_key_menu(key, 1);
+ uiDefButS(block, MENU, B_SETKEY, strp, 55,150,20,20, &ob->shapenr, 0, 0, 0, 0, "Browse existing choices");
MEM_freeN(strp);
+
uiDefIconBut(block, BUT, B_NEXTKEY, ICON_TRIA_RIGHT, 75,150,20,20, NULL, 0, 0, 0, 0, "Next Shape Key");
uiClearButLock();
uiDefBut(block, TEX, B_NAMEKEY, "", 95, 150, 190, 20, kb->name, 0.0, 31.0, 0, 0, "Current Shape Key name");
@@ -2213,9 +2441,14 @@ static void editing_panel_shapes(Object *ob)
uiDefButF(block, NUM, B_REDR, "Max ", 235,120, 75, 20, &kb->slidermax, -10.0, 10.0, 100, 1, "Maximum for slider");
uiBlockEndAlign(block);
}
- if(key->type && ob->shapenr!=1)
+ if(key->type && ob->shapenr!=1) {
uiDefBut(block, TEX, B_MODIFIER_RECALC, "VGroup: ", 10, 90, 150,19, &kb->vgroup, 0.0, 31.0, 0, 0, "Vertex Weight Group name, to blend with Basis Shape");
+ strp= make_key_menu(key, 0);
+ uiDefButS(block, MENU, B_MODIFIER_RECALC, strp, 160, 90, 150,19, &kb->relative, 0.0, 0.0, 0, 0, "Shape used as a relative key");
+ MEM_freeN(strp);
+ }
+
if(key->type==0)
uiDefButS(block, NUM, B_DIFF, "Slurph:", 10, 60, 150, 19, &(key->slurph), -500.0, 500.0, 0, 0, "Creates a delay in amount of frames in applying keypositions, first vertex goes first");
@@ -2420,7 +2653,7 @@ void do_fontbuts(unsigned short event)
sa= closest_bigger_area();
areawinset(sa->win);
- activate_fileselect(FILE_SPECIAL, "SELECT FONT", str, load_buts_vfont);
+ activate_fileselect(FILE_LOADFONT, "SELECT FONT", str, load_buts_vfont);
break;
case B_PACKFONT:
@@ -2579,6 +2812,7 @@ void do_fontbuts(unsigned short event)
}
}
+#ifdef INTERNATIONAL
static void editing_panel_char_type(Object *ob, Curve *cu)
{
uiBlock *block;
@@ -2604,6 +2838,7 @@ static void editing_panel_char_type(Object *ob, Curve *cu)
uiDefButI(block, BUT, B_SETUPCHAR, "U", 280, 185, 15, 15, &G.charstart, 0, 0xffff, 0, 0, "Scroll character table up");
uiDefButI(block, BUT, B_SETDOWNCHAR, "D", 280, 0, 15, 15, &G.charstart, 0, 0xffff, 0, 0, "Scroll character table down");
}
+#endif
static void editing_panel_font_type(Object *ob, Curve *cu)
{
@@ -2792,6 +3027,10 @@ void do_curvebuts(unsigned short event)
allqueue(REDRAWVIEW3D, 0);
}
break;
+ case B_TILTINTERP:
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ break;
case B_SUBSURFTYPE:
/* fallthrough */
case B_MAKEDISP:
@@ -2856,6 +3095,40 @@ void do_curvebuts(unsigned short event)
allqueue(REDRAWINFO, 1); /* 1, because header->win==0! */
break;
+
+ /* Buttons for aligning handles */
+ case B_SETPT_AUTO:
+ if(ob->type==OB_CURVE) {
+ sethandlesNurb(1);
+ BIF_undo_push("Auto Curve Handles");
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ break;
+ case B_SETPT_VECTOR:
+ if(ob->type==OB_CURVE) {
+ sethandlesNurb(2);
+ BIF_undo_push("Vector Curve Handles");
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ break;
+ case B_SETPT_ALIGN:
+ if(ob->type==OB_CURVE) {
+ sethandlesNurb(5);
+ BIF_undo_push("Align Curve Handles");
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ break;
+ case B_SETPT_FREE:
+ if(ob->type==OB_CURVE) {
+ sethandlesNurb(6);
+ BIF_undo_push("Free Align Curve Handles");
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ break;
}
}
@@ -2902,6 +3175,14 @@ static void editing_panel_curve_tools(Object *ob, Curve *cu)
nu= lastnu;
if(nu==NULL) nu= editNurb.first;
if(nu) {
+ if (ob->type==OB_CURVE) {
+ uiDefBut(block, LABEL, 0, "Tilt",
+ 467,87,72, 18, 0, 0, 0, 0, 0, "");
+ /* KEY_LINEAR, KEY_CARDINAL, KEY_BSPLINE */
+ uiDefButS(block, MENU, B_TILTINTERP, "Tilt Interpolation %t|Linear %x0|Cardinal %x1|BSpline %x2",
+ 467,67,72, 18, &(nu->tilt_interp), 0, 0, 0, 0, "Tilt interpolation");
+ }
+
uiBlockBeginAlign(block);
sp= &(nu->orderu);
uiDefButS(block, NUM, B_SETORDER, "Order U:", 565,90,102, 19, sp, 2.0, 6.0, 0, 0, "Nurbs only; the amount of control points involved");
@@ -2929,13 +3210,16 @@ static void editing_panel_curve_tools1(Object *ob, Curve *cu)
uiDefBut(block, BUT, B_SPINNURB, "Spin", 400,160,150,20, 0, 0, 0, 0, 0, "Spin selected 360 degrees");
}
uiBlockBeginAlign(block);
- uiDefBut(block, BUT,B_HIDE, "Hide", 400,120,150,18, 0, 0, 0, 0, 0, "Hides selected faces");
- uiDefBut(block, BUT,B_REVEAL, "Reveal", 400,100,150,18, 0, 0, 0, 0, 0, "Reveals selected faces");
- uiDefBut(block, BUT,B_SELSWAP, "Select Swap", 400,80,150,18, 0, 0, 0, 0, 0, "Selects unselected faces, and deselects selected faces");
+ uiDefBut(block, BUT,B_HIDE, "Hide", 400,140,150,18, 0, 0, 0, 0, 0, "Hides selected faces");
+ uiDefBut(block, BUT,B_REVEAL, "Reveal", 400,120,150,18, 0, 0, 0, 0, 0, "Reveals selected faces");
+ uiDefBut(block, BUT,B_SELSWAP, "Select Swap", 400,100,150,18, 0, 0, 0, 0, 0, "Selects unselected faces, and deselects selected faces");
uiBlockEndAlign(block);
- uiDefButF(block, NUM, REDRAWVIEW3D, "NSize:", 400, 40, 150, 19, &G.scene->editbutsize, 0.001, 1.0, 10, 0, "Normal size for drawing");
-
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, REDRAWVIEW3D, "NSize:", 400, 60, 150, 19, &G.scene->editbutsize, 0.001, 1.0, 10, 0, "Normal size for drawing");
+ uiDefButBitI(block, TOGN, G_HIDDENHANDLES, REDRAWVIEW3D, "Draw Handles", 400, 40, 150, 19, &G.f, 0, 0, 0, 0, "Draw curve handles in 3D view");
+ uiBlockEndAlign(block);
+
if(G.obedit) {
uiBut *but;
uiBlockBeginAlign(block);
@@ -3008,7 +3292,8 @@ static void editing_panel_curve_type(Object *ob, Curve *cu)
uiDefBut(block, LABEL, 0, str, 675,135,75,19, 0, 1.0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_RECALCPATH, "PathLen:", 600,50,150,19, &cu->pathlen, 1.0, MAXFRAMEF, 0, 0, "If no speed Ipo was set, the amount of frames of the path");
+ /*note, PathLen's max was MAXFRAMEF but this is a short, perhaps the pathlen should be increased later on */
+ uiDefButS(block, NUM, B_RECALCPATH, "PathLen:", 600,50,150,19, &cu->pathlen, 1.0, 32767.0f, 0, 0, "If no speed Ipo was set, the amount of frames of the path");
uiDefButBitS(block, TOG, CU_PATH, B_RECALCPATH, "CurvePath", 600,30,75,19 , &cu->flag, 0, 0, 0, 0, "Enables curve to become translation path");
uiDefButBitS(block, TOG, CU_FOLLOW, REDRAWVIEW3D, "CurveFollow",675,30,75,19, &cu->flag, 0, 0, 0, 0, "Makes curve path children to rotate along path");
uiDefButBitS(block, TOG, CU_STRETCH, B_CURVECHECK, "CurveStretch", 600,10,150,19, &cu->flag, 0, 0, 0, 0, "Option for curve-deform: makes deformed child to stretch along entire path");
@@ -3023,7 +3308,7 @@ static void editing_panel_curve_type(Object *ob, Curve *cu)
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_MAKEDISP, "Width:", 760,90,150,19, &cu->width, 0.0, 2.0, 1, 0, "Make interpolated result thinner or fatter");
- uiDefButF(block, NUM, B_MAKEDISP, "Extrude:", 760,70,150,19, &cu->ext1, 0.0, 5.0, 10, 0, "Curve extrusion size when not using a bevel object");
+ uiDefButF(block, NUM, B_MAKEDISP, "Extrude:", 760,70,150,19, &cu->ext1, 0.0, 100.0, 10, 0, "Curve extrusion size when not using a bevel object");
uiDefButF(block, NUM, B_MAKEDISP, "Bevel Depth:", 760,50,150,19, &cu->ext2, 0.0, 2.0, 1, 0, "Bevel depth when not using a bevel object");
uiDefButS(block, NUM, B_MAKEDISP, "BevResol:", 760,30,150,19, &cu->bevresol, 0.0, 32.0, 0, 0, "Bevel resolution when depth is non-zero and not using a bevel object");
uiDefIDPoinBut(block, test_obcurpoin_but, ID_OB, B_CHANGEDEP, "BevOb:", 760,10,150,19, &cu->bevobj, "Curve object name that defines the bevel shape");
@@ -3084,6 +3369,7 @@ static void editing_panel_camera_type(Object *ob, Camera *cam)
uiDefBut(block, LABEL, 10, "Lens:", 10, 180, 150, 20, 0, 0.0, 0.0, 0, 0, "");
+ uiBlockBeginAlign(block);
if(cam->type==CAM_ORTHO) {
uiDefButF(block, NUM,REDRAWVIEW3D, "Scale:",
10, 160, 150, 20, &cam->ortho_scale, 0.01, 1000.0, 50, 0, "Specify the ortho scaling of the used camera");
@@ -3102,59 +3388,57 @@ static void editing_panel_camera_type(Object *ob, Camera *cam)
uiDefButS(block, TOG|BIT|5, B_REDR, "D",
140, 160, 20, 20, &cam->flag, 0, 0, 0, 0, "Use degree as the unit of the camera lens");
}
+ uiDefButS(block, TOG, REDRAWVIEW3D, "Orthographic",
+ 10, 140, 150, 20, &cam->type, 0, 0, 0, 0, "Render with orthographic projection (no prespective)");
+ uiBlockEndAlign(block);
/* qdn: focal dist. param. from yafray now enabled for Blender as well, to use with defocus composit node */
- uiDefButF(block, NUM, REDRAWVIEW3D, "DoFDist:", 10, 140, 150, 20 /*0, 125, 150, 20*/, &cam->YF_dofdist, 0.0, 5000.0, 50, 0, "Sets distance to point of focus (enable 'Limits' to make visible in 3Dview)");
-
- uiDefButS(block, TOG, REDRAWVIEW3D, "Orthographic",
- 10, 115, 150, 20, &cam->type, 0, 0, 0, 0, "Render orthogonally");
- //10, 135, 150, 20, &cam->type, 0, 0, 0, 0, "Render orthogonally");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, REDRAWVIEW3D, "Dof Dist:", 10, 110, 150, 20 /*0, 125, 150, 20*/, &cam->YF_dofdist, 0.0, 5000.0, 50, 0, "Sets distance to point of focus (enable 'Limits' to make visible in 3Dview)");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, REDRAWVIEW3D, "Dof Ob:", 10, 90, 150, 20, &cam->dof_ob, "Focus on this object (overrides the 'Dof Dist')");
+ uiBlockEndAlign(block);
- uiDefBut(block, LABEL, 0, "Clipping:", 10, 90, 150, 20, 0, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "Clipping Start/End:", 10, 45, 150, 20, 0, 0.0, 0.0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButF(block, NUM,REDRAWVIEW3D, "Start:",
- 10, 70, 150, 20, &cam->clipsta, 0.001*grid, 100.0*grid, 10, 0, "Specify the startvalue of the the field of view");
+ 10, 25, 150, 20, &cam->clipsta, 0.001*grid, 100.0*grid, 10, 0, "Clip out geometry closer then this distance to the camera");
uiDefButF(block, NUM,REDRAWVIEW3D, "End:",
- 10, 50, 150, 20, &cam->clipend, 1.0, 5000.0*grid, 100, 0, "Specify the endvalue of the the field of view");
- uiBlockEndAlign(block);
-
- uiDefButF(block, NUM,REDRAWVIEW3D, "Size:",
- 170, 25, 150, 20, &cam->drawsize, 0.1*grid, 10.0, 10, 0, "The size that the camera is displayed in the 3D View (different from the object's scale)");
-
- uiDefBut(block, LABEL, 0, "Shift:", 10, 25, 150, 20, 0, 0.0, 0.0, 0, 0, "");
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUM,REDRAWVIEW3D, "X:",
- 10, 5, 75, 20, &cam->shiftx, -2.0, 2.0, 1, 2, "Horizontally shifts the camera view, without changing the perspective");
- uiDefButF(block, NUM,REDRAWVIEW3D, "Y:",
- 85, 5, 75, 20, &cam->shifty, -2.0, 2.0, 1, 2, "Vertically shifts the camera view, without changing the perspective");
+ 10, 5, 150, 20, &cam->clipend, 1.0, 5000.0*grid, 100, 0, "Clip out geometry further then this distance to the camera");
uiBlockEndAlign(block);
uiDefBut(block, LABEL, 0, "Show:", 170, 180, 150, 20, 0, 0.0, 0.0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButS(block, TOG|BIT|0, REDRAWVIEW3D, "Limits",
- 170, 160, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw the field of view");
+ 170, 160, 75, 20, &cam->flag, 0, 0, 0, 0, "Draw the clipping range and the focal point");
uiDefButS(block, TOG|BIT|1, REDRAWVIEW3D, "Mist",
- 170, 140, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a line that indicates the mist area");
- uiBlockEndAlign(block);
+ 245, 160, 75, 20, &cam->flag, 0, 0, 0, 0, "Draw a line that indicates the mist area");
- uiBlockBeginAlign(block);
uiDefButS(block, TOG|BIT|4, REDRAWVIEW3D, "Name",
- 170, 115, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw the active camera's name in camera view");
+ 170, 140, 75, 20, &cam->flag, 0, 0, 0, 0, "Draw the active camera's name in camera view");
uiDefButS(block, TOG|BIT|3, REDRAWVIEW3D, "Title Safe",
- 170, 95, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a the title safe zone in camera view");
+ 245, 140, 75, 20, &cam->flag, 0, 0, 0, 0, "Draw a the title safe zone in camera view");
uiBlockEndAlign(block);
- uiBlockBeginAlign(block);
+ uiBlockBeginAlign(block);
uiDefButS(block, TOG|BIT|2, REDRAWVIEW3D, "Passepartout",
- 170, 70, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a darkened passepartout over the off-screen area in camera view");
+ 170, 110, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a darkened passepartout over the off-screen area in camera view");
uiDefButF(block, NUMSLI, REDRAWVIEW3D, "Alpha: ",
- 170, 50, 150, 20, &cam->passepartalpha, 0.0, 1.0, 0, 0, "The opacity (darkness) of the passepartout");
+ 170, 90, 150, 20, &cam->passepartalpha, 0.0, 1.0, 0, 0, "The opacity (darkness) of the passepartout");
uiBlockEndAlign(block);
-
+ uiDefButF(block, NUM,REDRAWVIEW3D, "Size:",
+ 170, 50, 150, 20, &cam->drawsize, 0.1*grid, 10.0, 10, 0, "The size that the camera is displayed in the 3D View (different from the object's scale)");
+
+ uiDefBut(block, LABEL, 0, "Shift:", 170, 25, 150, 20, 0, 0.0, 0.0, 0, 0, "");
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM,REDRAWVIEW3D, "X:",
+ 170, 5, 75, 20, &cam->shiftx, -2.0, 2.0, 1, 2, "Horizontally shift the camera view, without changing the perspective");
+ uiDefButF(block, NUM,REDRAWVIEW3D, "Y:",
+ 245, 5, 75, 20, &cam->shifty, -2.0, 2.0, 1, 2, "Vertically shift the camera view, without changing the perspective");
+ uiBlockEndAlign(block);
}
/* yafray: extra camera panel to set Depth-of-Field parameters */
@@ -3480,9 +3764,8 @@ static void build_bonestring (char *string, EditBone *bone)
int index, numbones, i;
char (*qsort_ptr)[32] = NULL;
- sprintf (string, "Parent%%t| %%x%d", -1); /* That space is there
- * for a reason
- */
+ /* That space is there for a reason - for no parent */
+ sprintf (string, "Parent%%t| %%x%d", -1);
numbones = BLI_countlist(&G.edbo);
@@ -3624,10 +3907,12 @@ static void editing_panel_armature_type(Object *ob, bArmature *arm)
uiDefBut(block, LABEL, 0, "Deform Options", 10,40,150,20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, ARM_DEF_VGROUP, B_ARM_RECALCDATA, "Vertex Groups", 10, 20,150,20, &arm->deformflag, 0, 0, 0, 0, "Enable VertexGroups defining deform (not for Modifiers)");
- uiDefButBitS(block, TOG, ARM_DEF_ENVELOPE, B_ARM_RECALCDATA, "Envelopes", 160,20,150,20, &arm->deformflag, 0, 0, 0, 0, "Enable Bone Envelopes defining deform (not for Modifiers)");
- uiDefButBitI(block, TOG, ARM_RESTPOS, B_ARM_RECALCDATA,"Rest Position", 10,0,150,20, &arm->flag, 0, 0, 0, 0, "Show armature rest position, no posing possible");
- uiDefButBitI(block, TOG, ARM_DELAYDEFORM, REDRAWVIEW3D, "Delay Deform", 160,0,150,20, &arm->flag, 0, 0, 0, 0, "Don't deform children when manipulating bones in pose mode");
+ uiDefButBitS(block, TOG, ARM_DEF_VGROUP, B_ARM_RECALCDATA, "Vertex Groups", 10, 20,100,20, &arm->deformflag, 0, 0, 0, 0, "Enable VertexGroups defining deform (not for Modifiers)");
+ uiDefButBitS(block, TOG, ARM_DEF_ENVELOPE, B_ARM_RECALCDATA, "Envelopes", 110,20,100,20, &arm->deformflag, 0, 0, 0, 0, "Enable Bone Envelopes defining deform (not for Modifiers)");
+ uiDefButBitS(block, TOG, ARM_DEF_QUATERNION, B_ARM_RECALCDATA, "Quaternion", 210,20,100,20, &arm->deformflag, 0, 0, 0, 0, "Enable deform rotation interpolation with Quaternions (not for Modifiers)");
+ uiDefButBitI(block, TOG, ARM_RESTPOS, B_ARM_RECALCDATA,"Rest Position", 10,0,100,20, &arm->flag, 0, 0, 0, 0, "Show armature rest position, no posing possible");
+ uiDefButBitI(block, TOG, ARM_DELAYDEFORM, REDRAWVIEW3D, "Delay Deform", 110,0,100,20, &arm->flag, 0, 0, 0, 0, "Don't deform children when manipulating bones in pose mode");
+ uiDefButBitS(block, TOG, ARM_DEF_B_BONE_REST, B_ARM_RECALCDATA,"B-Bone Rest", 210,0,100,20, &arm->deformflag, 0, 0, 0, 0, "Make B-Bones deform already in rest position");
uiBlockEndAlign(block);
}
@@ -3648,6 +3933,10 @@ static void editing_panel_armature_visuals(Object *ob, bArmature *arm)
arm->pathsf = SFRA;
arm->pathef = EFRA;
}
+ if ((arm->pathbc == 0) || (arm->pathac == 0)) {
+ arm->pathbc = 15;
+ arm->pathac = 15;
+ }
/* Ghost Drawing Options */
uiDefBut(block, LABEL, 0, "Ghost Options", 10,180,150,20, 0, 0, 0, 0, 0, "");
@@ -3681,14 +3970,21 @@ static void editing_panel_armature_visuals(Object *ob, bArmature *arm)
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButI(block, NUM,REDRAWVIEW3D,"PSta:",170,100,80,20, &arm->pathsf, 1.0, MAXFRAMEF, 0, 0, "The start frame for Bone Path display range");
- uiDefButI(block, NUM,REDRAWVIEW3D,"PEnd:",250,100,80,20, &arm->pathef, arm->pathsf, MAXFRAMEF, 0, 0, "The end frame for Bone Path display range");
- uiDefButBitS(block, TOG, ARM_PATH_HEADS, REDRAWVIEW3D, "Bone-Head Path", 170, 80, 160, 20, &arm->pathflag, 0, 0, 0, 0, "Calculate the Path travelled by the Bone's Head instead of Tail");
+ uiDefButBitS(block, TOG, ARM_PATH_ACFRA, REDRAWVIEW3D, "Around Current Frame", 170, 105, 160, 20, &arm->pathflag, 0, 0, 0, 0, "Calculate Bone Path around the current frame");
+ if (arm->pathflag & ARM_PATH_ACFRA) {
+ uiDefButI(block, NUM,REDRAWVIEW3D,"PPre:",170,85,80,20, &arm->pathbc, 1.0, MAXFRAMEF/2, 0, 0, "The number of frames before current frame for Bone Path display range");
+ uiDefButI(block, NUM,REDRAWVIEW3D,"PPost:",250,85,80,20, &arm->pathac, 1.0, MAXFRAMEF/2, 0, 0, "The number of frames after current frame for Bone Path display range");
+ }
+ else {
+ uiDefButI(block, NUM,REDRAWVIEW3D,"PSta:",170,85,80,20, &arm->pathsf, 1.0, MAXFRAMEF, 0, 0, "The start frame for Bone Path display range");
+ uiDefButI(block, NUM,REDRAWVIEW3D,"PEnd:",250,85,80,20, &arm->pathef, arm->pathsf, MAXFRAMEF, 0, 0, "The end frame for Bone Path display range");
+ }
+ uiDefButBitS(block, TOG, ARM_PATH_HEADS, REDRAWVIEW3D, "Bone-Head Path", 170, 65, 160, 20, &arm->pathflag, 0, 0, 0, 0, "Calculate the Path travelled by the Bone's Head instead of Tail");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefBut(block, BUT, B_ARM_CALCPATHS, "Calculate Paths", 170,40,160,20, 0, 0, 0, 0, 0, "(Re)calculates the paths of the selected bones");
- uiDefBut(block, BUT, B_ARM_CLEARPATHS, "Clear All Paths", 170,20,160,20, 0, 0, 0, 0, 0, "Clears all bone paths");
+ uiDefBut(block, BUT, B_ARM_CALCPATHS, "Calculate Paths", 170,30,160,20, 0, 0, 0, 0, 0, "(Re)calculates the paths of the selected bones");
+ uiDefBut(block, BUT, B_ARM_CLEARPATHS, "Clear All Paths", 170,10,160,20, 0, 0, 0, 0, 0, "Clears all bone paths");
uiBlockEndAlign(block);
}
@@ -3764,22 +4060,23 @@ static void editing_panel_armature_bones(Object *ob, bArmature *arm)
uiDefButF(block, NUM,B_ARM_RECALCDATA, "Weight:", 225, by-19,105, 18, &curBone->weight, 0.0F, 1000.0F, 10.0F, 0.0F, "Bone deformation weight");
/* bone types */
- uiDefButBitI(block, TOG, BONE_HINGE, B_ARM_RECALCDATA, "Hinge", -10,by-38,85,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit rotation or scale from parent Bone");
- uiDefButBitI(block, TOGN, BONE_NO_DEFORM, B_ARM_RECALCDATA, "Deform", 75, by-38, 85, 18, &curBone->flag, 0.0, 0.0, 0.0, 0.0, "Indicate if Bone deforms geometry");
- uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, B_ARM_RECALCDATA, "Mult", 160,by-38,85,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Multiply Bone Envelope with VertexGroup");
- uiDefButBitI(block, TOG, BONE_HIDDEN_A, REDRAWVIEW3D, "Hide", 245,by-38,85,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this bone in Edit Mode");
+ uiDefButBitI(block, TOG, BONE_HINGE, B_ARM_RECALCDATA, "Hinge", -10,by-38,80,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit rotation or scale from parent Bone");
+ uiDefButBitI(block, TOG, BONE_NO_SCALE, B_ARM_RECALCDATA, "S", 70,by-38,20,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit rotation or scale from parent Bone");
+ uiDefButBitI(block, TOGN, BONE_NO_DEFORM, B_ARM_RECALCDATA, "Deform", 90, by-38, 80, 18, &curBone->flag, 0.0, 0.0, 0.0, 0.0, "Indicate if Bone deforms geometry");
+ uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, B_ARM_RECALCDATA, "Mult", 170,by-38,80,18, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Multiply Bone Envelope with VertexGroup");
+ uiDefButBitI(block, TOG, BONE_HIDDEN_A, REDRAWVIEW3D, "Hide", 250,by-38,80,18, &curBone->flag, 0, 0, 0, 0, "Toggles display of this bone in Edit Mode");
/* layers */
uiBlockBeginAlign(block);
for(a=0; a<8; a++) {
short dx= 21;
- but= uiDefButBitS(block, TOG, 1<<a, REDRAWVIEW3D, "", -10+a*dx, by-57, dx, 15, &curBone->layer, 0, 0, 0, 0, "Don't draw this layer for group-duplicators");
+ but= uiDefButBitS(block, TOG, 1<<a, REDRAWVIEW3D, "", -10+a*dx, by-57, dx, 15, &curBone->layer, 0, 0, 0, 0, "Armature layer that bone exists on");
uiButSetFunc(but, armature_layer_cb, &curBone->layer, (void *)(1<<a));
}
uiBlockBeginAlign(block);
for(a=8; a<16; a++) {
short dx= 21;
- but= uiDefButBitS(block, TOG, 1<<a, REDRAWVIEW3D, "", -6+a*dx, by-57, dx, 15, &curBone->layer, 0, 0, 0, 0, "Don't draw this layer for group-duplicators");
+ but= uiDefButBitS(block, TOG, 1<<a, REDRAWVIEW3D, "", -6+a*dx, by-57, dx, 15, &curBone->layer, 0, 0, 0, 0, "Armature layer that bone exists on");
uiButSetFunc(but, armature_layer_cb, &curBone->layer, (void *)(1<<a));
}
@@ -3859,24 +4156,25 @@ static void editing_panel_pose_bones(Object *ob, bArmature *arm)
uiDefButF(block, NUM,B_ARM_RECALCDATA, "Out:", 220, by-19, 110, 19, &curBone->ease2, 0.0, 2.0, 10.0, 0.0, "Second length of Bezier handle");
/* bone types */
- uiDefButBitI(block, TOG, BONE_HINGE, B_ARM_RECALCDATA, "Hinge", -10,by-38,80,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit rotation or scale from parent Bone");
- uiDefButBitI(block, TOGN, BONE_NO_DEFORM, B_ARM_RECALCDATA, "Deform", 70, by-38, 80, 19, &curBone->flag, 0.0, 0.0, 0.0, 0.0, "Indicate if Bone deforms geometry");
- uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, B_ARM_RECALCDATA, "Mult", 150,by-38,80,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Multiply Bone Envelope with VertexGroup");
+ uiDefButBitI(block, TOG, BONE_HINGE, B_ARM_RECALCDATA, "Hinge", -10,by-38,80,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit rotation or scale from parent Bone");
+ uiDefButBitI(block, TOG, BONE_NO_SCALE, B_ARM_RECALCDATA, "S", 70,by-38,20,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Don't inherit scale from parent Bone");
+ uiDefButBitI(block, TOGN, BONE_NO_DEFORM, B_ARM_RECALCDATA, "Deform", 90, by-38, 80, 19, &curBone->flag, 0.0, 0.0, 0.0, 0.0, "Indicate if Bone deforms geometry");
+ uiDefButBitI(block, TOG, BONE_MULT_VG_ENV, B_ARM_RECALCDATA, "Mult", 170,by-38,80,19, &curBone->flag, 1.0, 32.0, 0.0, 0.0, "Multiply Bone Envelope with VertexGroup");
ob_arm_bone_pchan_lock(ob, arm, curBone, pchan);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, REDRAWVIEW3D, "OB:", 230,by-38,100,19, &pchan->custom, "Object that defines custom draw type for this Bone");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, REDRAWVIEW3D, "OB:", 250,by-38,80,19, &pchan->custom, "Object that defines custom draw type for this Bone");
ob_arm_bone_pchan_lock(ob, arm, curBone, NULL);
/* layers */
uiBlockBeginAlign(block);
for(a=0; a<8; a++) {
short dx= 21;
- but= uiDefButBitS(block, TOG, 1<<a, REDRAWVIEW3D, "", -10+a*dx, by-57, dx, 15, &curBone->layer, 0, 0, 0, 0, "");
+ but= uiDefButBitS(block, TOG, 1<<a, REDRAWVIEW3D, "", -10+a*dx, by-57, dx, 15, &curBone->layer, 0, 0, 0, 0, "Armature layer that bone exists on");
uiButSetFunc(but, armature_layer_cb, &curBone->layer, (void *)(1<<a));
}
uiBlockBeginAlign(block);
for(a=8; a<16; a++) {
short dx= 21;
- but= uiDefButBitS(block, TOG, 1<<a, REDRAWVIEW3D, "", -6+a*dx, by-57, dx, 15, &curBone->layer, 0, 0, 0, 0, "");
+ but= uiDefButBitS(block, TOG, 1<<a, REDRAWVIEW3D, "", -6+a*dx, by-57, dx, 15, &curBone->layer, 0, 0, 0, 0, "Armature layer that bone exists on");
uiButSetFunc(but, armature_layer_cb, &curBone->layer, (void *)(1<<a));
}
uiBlockEndAlign(block);
@@ -4087,6 +4385,8 @@ void do_meshbuts(unsigned short event)
if(!mcol)
shadeMeshMCol(ob, me);
}
+
+ if (me->mr) multires_load_cols(me);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
BIF_undo_push("New Vertex Color");
@@ -4209,7 +4509,7 @@ void do_meshbuts(unsigned short event)
G.f -= G_DISABLE_OK;
break;
case B_REMDOUB:
- count= removedoublesflag(1, G.scene->toolsettings->doublimit);
+ count= removedoublesflag(1, 0, G.scene->toolsettings->doublimit);
notice("Removed: %d", count);
if (count) { /* only undo and redraw if an action is taken */
countall ();
@@ -4324,10 +4624,10 @@ static void editing_panel_mesh_tools(Object *ob, Mesh *me)
uiBlockBeginAlign(block);
uiDefBut(block, BUT, B_JOINTRIA, "Join Triangles", 10, -20, 120, 19, 0, 0, 0, 0, 0, "Convert selected triangles to Quads");
uiDefButF(block, NUM, B_DIFF, "Threshold", 130, -20, 195, 19, &G.scene->toolsettings->jointrilimit, 0.0, 1.0, 5, 0, "Conversion threshold for complex islands");
- uiDefButBitS(block, TOG, B_JOINTRIA_UV, 0, "Delimit UVs", 10, -40, 78, 19, &G.scene->toolsettings->editbutflag, 0,0,0,0, "Don't join pairs where UVs don't match");
- uiDefButBitS(block, TOG, B_JOINTRIA_VCOL, 0, "Delimit Vcol", 90, -40, 78, 19, &G.scene->toolsettings->editbutflag, 0,0,0,0, "Don't join pairs where Vcols don't match");
- uiDefButBitS(block, TOG, B_JOINTRIA_SHARP, 0, "Delimit Sharp", 170, -40, 78, 19, &G.scene->toolsettings->editbutflag, 0,0,0,0, "Don't join pairs where edge is sharp");
- uiDefButBitS(block, TOG, B_JOINTRIA_MAT, 0, "Delimit Mat", 250, -40, 74, 19, &G.scene->toolsettings->editbutflag, 0,0,0,0, "Don't join pairs where material dosnt match");
+ uiDefButBitS(block, TOG, B_JOINTRIA_UV, 0, "Delimit UVs", 10, -40, 78, 19, &G.scene->toolsettings->editbutflag, 0,0,0,0, "Join pairs only where UVs match");
+ uiDefButBitS(block, TOG, B_JOINTRIA_VCOL, 0, "Delimit Vcol", 90, -40, 78, 19, &G.scene->toolsettings->editbutflag, 0,0,0,0, "Join pairs only where Vcols match");
+ uiDefButBitS(block, TOG, B_JOINTRIA_SHARP, 0, "Delimit Sharp", 170, -40, 78, 19, &G.scene->toolsettings->editbutflag, 0,0,0,0, "Join pairs only where edge is not sharp");
+ uiDefButBitS(block, TOG, B_JOINTRIA_MAT, 0, "Delimit Mat", 250, -40, 74, 19, &G.scene->toolsettings->editbutflag, 0,0,0,0, "Join pairs only where material matches");
uiBlockEndAlign(block);
@@ -4349,9 +4649,9 @@ static void editing_panel_mesh_tools1(Object *ob, Mesh *me)
if(uiNewPanel(curarea, block, "Mesh Tools 1", "Editing", 960, 0, 318, 204)==0) return;
uiBlockBeginAlign(block);
- uiDefBut(block, BUT,B_SELSWAP, "Select Swap", 955, 200, 106, 19, 0, 0, 0, 0, 0, "Selects unselected faces, and deselects selected faces");
- uiDefBut(block, BUT,B_HIDE, "Hide", 1061, 200, 106, 19, 0, 0, 0, 0, 0, "Hides selected faces");
- uiDefBut(block, BUT,B_REVEAL, "Reveal", 1167, 200, 107, 19, 0, 0, 0, 0, 0, "Reveals selected faces");
+ uiDefBut(block, BUT,B_SELSWAP, "Select Swap", 955, 200, 106, 19, 0, 0, 0, 0, 0, "Selects unselected faces, and deselects selected faces (Ctrl+I)");
+ uiDefBut(block, BUT,B_HIDE, "Hide", 1061, 200, 106, 19, 0, 0, 0, 0, 0, "Hides selected faces (H)");
+ uiDefBut(block, BUT,B_REVEAL, "Reveal", 1167, 200, 107, 19, 0, 0, 0, 0, 0, "Reveals selected faces (Alt H)");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
@@ -4361,7 +4661,7 @@ static void editing_panel_mesh_tools1(Object *ob, Mesh *me)
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, G_DRAWFACES, REDRAWVIEW3D, "Draw Faces", 955,88,150,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades");
+ uiDefButBitI(block, TOG, G_DRAWFACES, REDRAWVIEW3D_IMAGE, "Draw Faces", 955,88,150,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades in the 3d view and UV editor");
uiDefButBitI(block, TOG, G_DRAWEDGES, REDRAWVIEW3D, "Draw Edges", 955,66,150,19, &G.f, 0, 0, 0, 0, "Displays selected edges using hilights");
uiDefButBitI(block, TOG, G_DRAWCREASES, REDRAWVIEW3D, "Draw Creases", 955,44,150,19, &G.f, 0, 0, 0, 0, "Displays creases created for subsurf weighting");
uiDefButBitI(block, TOG, G_DRAWSEAMS, REDRAWVIEW3D, "Draw Seams", 955,22,150,19, &G.f, 0, 0, 0, 0, "Displays UV unwrapping seams");
@@ -4504,7 +4804,7 @@ static void editing_panel_links(Object *ob)
xco, 154, 130,20, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButC(block, MENU, REDRAWVIEW3D, "Empty Drawtype%t|Arrows%x1|Single Arrow%x4|Plain Axes%x2",
+ uiDefButC(block, MENU, REDRAWVIEW3D, "Empty Drawtype%t|Arrows%x1|Single Arrow%x4|Plain Axes%x2|Circle%x3|Cube%x5",
xco, 128, 140, 20, &ob->empty_drawtype, 0, 0, 0, 0, "The Empty 3D View display style");
uiDefButF(block, NUM, REDRAWVIEW3D, "Size:",
xco, 108, 140, 21, &ob->empty_drawsize, 0.01, 10.0, 1, 0, "The size to display the Empty");
@@ -4807,6 +5107,7 @@ void do_fpaintbuts(unsigned short event)
ToolSettings *settings= G.scene->toolsettings;
int nr= 1;
MTex *mtex;
+ ParticleSystem *psys;
ob= OBACT;
if(ob==NULL) return;
@@ -4821,7 +5122,7 @@ void do_fpaintbuts(unsigned short event)
case B_COPY_TF_COL:
case B_COPY_TF_TEX:
me= get_mesh(OBACT);
- activetf= get_active_tface(&activemcol);
+ activetf= get_active_mtface(NULL, &activemcol, 0);
if(me && activetf) {
for (a=0, tf=me->mtface, mf=me->mface; a < me->totface; a++, tf++, mf++) {
@@ -4858,7 +5159,7 @@ void do_fpaintbuts(unsigned short event)
}
break;
case B_SET_VCOL:
- if(G.f & G_FACESELECT)
+ if(FACESEL_PAINT_TEST)
clear_vpaint_selectedfaces();
else
clear_vpaint();
@@ -4875,7 +5176,7 @@ void do_fpaintbuts(unsigned short event)
break;
case B_TFACE_HALO:
- activetf = get_active_tface(NULL);
+ activetf = get_active_mtface(NULL, NULL, 0);
if(activetf) {
activetf->mode &= ~TF_BILLBOARD2;
allqueue(REDRAWBUTSEDIT, 0);
@@ -4883,7 +5184,7 @@ void do_fpaintbuts(unsigned short event)
break;
case B_TFACE_BILLB:
- activetf = get_active_tface(NULL);
+ activetf = get_active_mtface(NULL, NULL, 0);
if(activetf) {
activetf->mode &= ~TF_BILLBOARD;
allqueue(REDRAWBUTSEDIT, 0);
@@ -5050,7 +5351,11 @@ void do_fpaintbuts(unsigned short event)
if(G.buts->menunr==-2) {
MTex *mtex= brush->mtex[brush->texact];
ID *id= (ID*)((mtex)? mtex->tex: NULL);
- activate_databrowse(id, ID_TE, 0, B_BTEXBROWSE, &G.buts->menunr, do_global_buttons);
+ if(G.qual & LR_CTRLKEY) {
+ activate_databrowse_imasel(id, ID_TE, 0, B_BTEXBROWSE, &G.buts->menunr, do_fpaintbuts);
+ } else {
+ activate_databrowse(id, ID_TE, 0, B_BTEXBROWSE, &G.buts->menunr, do_fpaintbuts);
+ }
break;
}
else if(G.buts->menunr < 0) break;
@@ -5077,6 +5382,20 @@ void do_fpaintbuts(unsigned short event)
allqueue(REDRAWIMAGE, 0);
allqueue(REDRAWBUTSEDIT, 0);
break;
+ case B_BAKE_REDRAWEDIT:
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ break;
+ case B_BAKE_RECACHE:
+ psys=PE_get_current(ob);
+ PE_hide_keys_time(psys,CFRA);
+ psys_cache_paths(ob,psys,CFRA,0);
+ if(PE_settings()->flag & PE_SHOW_CHILD)
+ psys_cache_child_paths(ob,psys,CFRA,0);
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ break;
}
}
@@ -5091,48 +5410,58 @@ void weight_paint_buttons(uiBlock *block)
if(ob==NULL) return;
uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, REDRAWVIEW3D, "Weight:",10,160,225,19, &editbutvweight, 0, 1, 10, 0, "Sets the current vertex group's bone deformation strength");
+ uiDefButF(block, NUMSLI, REDRAWVIEW3D, "Weight:",10,170,225,19, &editbutvweight, 0, 1, 10, 0, "Sets the current vertex group's bone deformation strength");
- uiDefBut(block, BUT, B_WEIGHT0_0 , "0", 10,140,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_WEIGHT1_4 , "1/4", 55,140,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_WEIGHT1_2 , "1/2", 100,140,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_WEIGHT3_4 , "3/4", 145,140,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_WEIGHT1_0 , "1", 190,140,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_WEIGHT0_0 , "0", 10,150,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_WEIGHT1_4 , "1/4", 55,150,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_WEIGHT1_2 , "1/2", 100,150,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_WEIGHT3_4 , "3/4", 145,150,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_WEIGHT1_0 , "1", 190,150,45,19, 0, 0, 0, 0, 0, "");
- uiDefButF(block, NUMSLI, B_NOP, "Opacity ", 10,120,225,19, &Gwp.a, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
+ uiDefButF(block, NUMSLI, B_NOP, "Opacity ", 10,130,225,19, &Gwp.a, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
- uiDefBut(block, BUT, B_OPA1_8 , "1/8", 10,100,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_OPA1_4 , "1/4", 55,100,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_OPA1_2 , "1/2", 100,100,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_OPA3_4 , "3/4", 145,100,45,19, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_OPA1_0 , "1", 190,100,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_OPA1_8 , "1/8", 10,110,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_OPA1_4 , "1/4", 55,110,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_OPA1_2 , "1/2", 100,110,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_OPA3_4 , "3/4", 145,110,45,19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_OPA1_0 , "1", 190,110,45,19, 0, 0, 0, 0, 0, "");
- uiDefButF(block, NUMSLI, B_NOP, "Size ", 10,80,225,19, &Gwp.size, 2.0, 64.0, 0, 0, "The size of the brush");
+ uiDefButF(block, NUMSLI, B_NOP, "Size ", 10,90,225,19, &Gwp.size, 2.0, 64.0, 0, 0, "The size of the brush");
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_DIFF, "Mix", 250,160,60,17, &Gwp.mode, 1.0, 0.0, 0, 0, "Mix the vertex colors");
- uiDefButS(block, ROW, B_DIFF, "Add", 250,142,60,17, &Gwp.mode, 1.0, 1.0, 0, 0, "Add the vertex colors");
- uiDefButS(block, ROW, B_DIFF, "Sub", 250,124,60,17, &Gwp.mode, 1.0, 2.0, 0, 0, "Subtract from the vertex color");
- uiDefButS(block, ROW, B_DIFF, "Mul", 250,106,60,17, &Gwp.mode, 1.0, 3.0, 0, 0, "Multiply the vertex color");
- uiDefButS(block, ROW, B_DIFF, "Filter", 250, 88,60,17, &Gwp.mode, 1.0, 4.0, 0, 0, "Mix the colors with an alpha factor");
- uiDefButS(block, ROW, B_DIFF, "Lighter", 250, 70,60,17, &Gwp.mode, 1.0, 5.0, 0, 0, "Paint over darker areas only");
- uiDefButS(block, ROW, B_DIFF, "Darker", 250, 52,60,17, &Gwp.mode, 1.0, 6.0, 0, 0, "Paint over lighter areas only");
+ uiDefButS(block, ROW, B_DIFF, "Mix", 250,170,60,17, &Gwp.mode, 1.0, 0.0, 0, 0, "Mix the vertex colors");
+ uiDefButS(block, ROW, B_DIFF, "Add", 250,152,60,17, &Gwp.mode, 1.0, 1.0, 0, 0, "Add the vertex colors");
+ uiDefButS(block, ROW, B_DIFF, "Sub", 250,134,60,17, &Gwp.mode, 1.0, 2.0, 0, 0, "Subtract from the vertex color");
+ uiDefButS(block, ROW, B_DIFF, "Mul", 250,116,60,17, &Gwp.mode, 1.0, 3.0, 0, 0, "Multiply the vertex color");
+ uiDefButS(block, ROW, B_DIFF, "Blur", 250, 98,60,17, &Gwp.mode, 1.0, 4.0, 0, 0, "Blur the weight with surrounding values");
+ uiDefButS(block, ROW, B_DIFF, "Lighter", 250, 80,60,17, &Gwp.mode, 1.0, 5.0, 0, 0, "Paint over darker areas only");
+ uiDefButS(block, ROW, B_DIFF, "Darker", 250, 62,60,17, &Gwp.mode, 1.0, 6.0, 0, 0, "Paint over lighter areas only");
uiBlockEndAlign(block);
- uiDefButBitS(block, TOG, VP_SPRAY, 0, "Spray", 160,55,75,19, &Gwp.flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse");
+ /* draw options same as below */
+ uiBlockBeginAlign(block);
+ if (FACESEL_PAINT_TEST) {
+ uiDefButBitI(block, TOG, G_DRAWFACES, B_UVAUTO_DRAWFACES, "Faces", 10,45,60,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades");
+ uiDefButBitI(block,TOG, G_DRAWEDGES, REDRAWVIEW3D,"Edges",70,45,60,19, &G.f, 2.0, 0, 0, 0, "Displays edges of visible faces");
+ uiDefButBitI(block,TOG, G_HIDDENEDGES, REDRAWVIEW3D,"Hidden Edges",130,45,100,19, &G.f, 2.0, 1.0, 0, 0, "Displays edges of hidden faces");
+ } else{
+ uiDefButBitC(block, TOG, OB_DRAWWIRE, REDRAWVIEW3D, "Wire", 10,45,75,19, &ob->dtx, 0, 0, 0, 0, "Displays the active object's wireframe in shaded drawing modes");
+ }
+ uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, VP_AREA, 0, "All Faces", 10,30,75,19, &Gwp.flag, 0, 0, 0, 0, "Paint on all faces inside brush (otherwise only on face under mouse cursor)");
- uiDefButBitS(block, TOG, VP_SOFT, 0, "Vertex Dist", 85,30,75,19, &Gwp.flag, 0, 0, 0, 0, "Use distances to vertices (instead of all vertices of face)");
- uiDefButBitS(block, TOGN, VP_HARD, 0, "Soft", 160,30,75,19, &Gwp.flag, 0, 0, 0, 0, "Use a soft brush");
- uiDefButBitS(block, TOG, VP_NORMALS, 0, "Normals", 235,30,75,19, &Gwp.flag, 0, 0, 0, 0, "Applies the vertex normal before painting");
+ uiDefButBitS(block, TOG, VP_AREA, 0, "All Faces", 10,20,60,19, &Gwp.flag, 0, 0, 0, 0, "Paint on all faces inside brush (otherwise only on face under mouse cursor)");
+ uiDefButBitS(block, TOG, VP_SOFT, 0, "Vert Dist", 70,20,60,19, &Gwp.flag, 0, 0, 0, 0, "Use distances to vertices (instead of all vertices of face)");
+ uiDefButBitS(block, TOGN, VP_HARD, 0, "Soft", 130,20,60,19, &Gwp.flag, 0, 0, 0, 0, "Use a soft brush");
+ uiDefButBitS(block, TOG, VP_NORMALS, 0, "Normals", 190,20,60,19, &Gwp.flag, 0, 0, 0, 0, "Applies the vertex normal before painting");
+ uiDefButBitS(block, TOG, VP_SPRAY, 0, "Spray", 250,20,55,19, &Gwp.flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse");
+ uiBlockEndAlign(block);
if(ob) {
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, VP_ONLYVGROUP, REDRAWVIEW3D, "Vgroup", 10,0,75,19, &Gwp.flag, 0, 0, 0, 0, "Only paint on vertices in the selected vertex group.");
- uiDefButBitS(block, TOG, VP_MIRROR_X, REDRAWVIEW3D, "X-Mirror", 85,0,75,19, &Gwp.flag, 0, 0, 0, 0, "Mirrored Paint, applying on mirrored Weight Group name");
- uiDefButBitC(block, TOG, OB_DRAWWIRE, REDRAWVIEW3D, "Wire", 160,0,75,19, &ob->dtx, 0, 0, 0, 0, "Displays the active object's wireframe in shaded drawing modes");
- uiDefBut(block, BUT, B_CLR_WPAINT, "Clear", 235,0,75,19, NULL, 0, 0, 0, 0, "Removes reference to this deform group from all vertices");
+ uiDefButBitS(block, TOG, VP_ONLYVGROUP, REDRAWVIEW3D, "Vgroup", 10,0,100,19, &Gwp.flag, 0, 0, 0, 0, "Only paint on vertices in the selected vertex group.");
+ uiDefButBitS(block, TOG, VP_MIRROR_X, REDRAWVIEW3D, "X-Mirror", 110,0,100,19, &Gwp.flag, 0, 0, 0, 0, "Mirrored Paint, applying on mirrored Weight Group name");
+ uiDefBut(block, BUT, B_CLR_WPAINT, "Clear", 210,0,100,19, NULL, 0, 0, 0, 0, "Removes reference to this deform group from all vertices");
uiBlockEndAlign(block);
}
}
@@ -5152,34 +5481,42 @@ static void editing_panel_mesh_paint(void)
extern VPaint Gvp; /* from vpaint */
uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, B_NOP, "R ", 979,160,194,19, &Gvp.r, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of red used for painting");
- uiDefButF(block, NUMSLI, B_NOP, "G ", 979,140,194,19, &Gvp.g, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of green used for painting");
- uiDefButF(block, NUMSLI, B_NOP, "B ", 979,120,194,19, &Gvp.b, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of blue used for painting");
+ uiDefButF(block, NUMSLI, B_NOP, "R ", 979,170,150,19, &Gvp.r, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of red used for painting");
+ uiDefButF(block, NUMSLI, B_NOP, "G ", 979,150,150,19, &Gvp.g, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of green used for painting");
+ uiDefButF(block, NUMSLI, B_NOP, "B ", 979,130,150,19, &Gvp.b, 0.0, 1.0, B_VPCOLSLI, 0, "The amount of blue used for painting");
uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, B_NOP, "Opacity ", 979,95,194,19, &Gvp.a, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
- uiDefButF(block, NUMSLI, B_NOP, "Size ", 979,75,194,19, &Gvp.size, 2.0, 64.0, 0, 0, "The size of the brush");
+ uiDefButF(block, NUMSLI, B_NOP, "Opacity ", 979,105,222,19, &Gvp.a, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
+ uiDefButF(block, NUMSLI, B_NOP, "Size ", 979,85,222,19, &Gvp.size, 2.0, 64.0, 0, 0, "The size of the brush");
uiBlockEndAlign(block);
- uiDefButF(block, COL, B_REDR, "", 1176,120,28,60, &(Gvp.r), 0, 0, 0, B_VPCOLSLI, "");
+ uiDefButF(block, COL, B_REDR, "", 1140,150,60,40, &(Gvp.r), 0, 0, 0, B_VPCOLSLI, "");
+ uiDefBut(block, BUT, B_SET_VCOL, "SetVCol", 1140,130,60,20, 0, 0, 0, 0, 0, "Set Vertex color of selection to current (Shift+K)");
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_DIFF, "Mix", 1212,160,63,17, &Gvp.mode, 1.0, 0.0, 0, 0, "Mix the vertex colors");
- uiDefButS(block, ROW, B_DIFF, "Add", 1212,142,63,17, &Gvp.mode, 1.0, 1.0, 0, 0, "Add the vertex color");
- uiDefButS(block, ROW, B_DIFF, "Sub", 1212, 124,63,17, &Gvp.mode, 1.0, 2.0, 0, 0, "Subtract from the vertex color");
- uiDefButS(block, ROW, B_DIFF, "Mul", 1212, 106,63,17, &Gvp.mode, 1.0, 3.0, 0, 0, "Multiply the vertex color");
- uiDefButS(block, ROW, B_DIFF, "Filter", 1212, 88,63,17, &Gvp.mode, 1.0, 4.0, 0, 0, "Mix the colors with an alpha factor");
- uiDefButS(block, ROW, B_DIFF, "Lighter", 1212, 70,63,17, &Gvp.mode, 1.0, 5.0, 0, 0, "Paint over darker areas only");
- uiDefButS(block, ROW, B_DIFF, "Darker", 1212, 52,63,17, &Gvp.mode, 1.0, 6.0, 0, 0, "Paint over lighter areas only");
+ uiDefButS(block, ROW, B_DIFF, "Mix", 1212,170,63,17, &Gvp.mode, 1.0, 0.0, 0, 0, "Mix the vertex colors");
+ uiDefButS(block, ROW, B_DIFF, "Add", 1212,152,63,17, &Gvp.mode, 1.0, 1.0, 0, 0, "Add the vertex color");
+ uiDefButS(block, ROW, B_DIFF, "Sub", 1212, 134,63,17, &Gvp.mode, 1.0, 2.0, 0, 0, "Subtract from the vertex color");
+ uiDefButS(block, ROW, B_DIFF, "Mul", 1212, 116,63,17, &Gvp.mode, 1.0, 3.0, 0, 0, "Multiply the vertex color");
+ uiDefButS(block, ROW, B_DIFF, "Blur", 1212, 98,63,17, &Gvp.mode, 1.0, 4.0, 0, 0, "Blur the color with surrounding values");
+ uiDefButS(block, ROW, B_DIFF, "Lighter", 1212, 80,63,17, &Gvp.mode, 1.0, 5.0, 0, 0, "Paint over darker areas only");
+ uiDefButS(block, ROW, B_DIFF, "Darker", 1212, 62,63,17, &Gvp.mode, 1.0, 6.0, 0, 0, "Paint over lighter areas only");
uiBlockEndAlign(block);
- uiDefBut(block, BUT, B_SET_VCOL, "Set VertCol", 979,50,81,20, 0, 0, 0, 0, 0, "Set Vertex color of selection to current (Shift+K)");
+ /* draw options */
+ uiBlockBeginAlign(block);
+ if (FACESEL_PAINT_TEST) {
+ uiDefButBitI(block, TOG, G_DRAWFACES, B_UVAUTO_DRAWFACES, "Faces", 979,50,60,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades");
+ uiDefButBitI(block,TOG, G_DRAWEDGES, REDRAWVIEW3D,"Edges",1039,50,60,19, &G.f, 2.0, 0, 0, 0, "Displays edges of visible faces");
+ uiDefButBitI(block,TOG, G_HIDDENEDGES, REDRAWVIEW3D,"Hidden Edges",1099,50,100,19, &G.f, 2.0, 1.0, 0, 0, "Displays edges of hidden faces");
+ }
+ uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, VP_AREA, 0, "All Faces", 979,25,75,19, &Gvp.flag, 0, 0, 0, 0, "Paint on all faces inside brush");
uiDefButBitS(block, TOG, VP_SOFT, 0, "Vertex Dist", 1054,25,75,19, &Gvp.flag, 0, 0, 0, 0, "Use distances to vertices (instead of paint entire faces)");
uiDefButBitS(block, TOG, VP_NORMALS, 0, "Normals", 1129,25,75,19, &Gvp.flag, 0, 0, 0, 0, "Applies the vertex normal before painting");
- uiDefButBitS(block, TOG, VP_SPRAY, 0, "Spray", 1204,25,75,19, &Gvp.flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse");
+ uiDefButBitS(block, TOG, VP_SPRAY, 0, "Spray", 1204,25,72,19, &Gvp.flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse");
uiBlockBeginAlign(block);
uiDefBut(block, BUT, B_VPGAMMA, "Set", 979,0,81,19, 0, 0, 0, 0, 0, "Apply Mul and Gamma to vertex colors");
@@ -5248,14 +5585,14 @@ static void editing_panel_mesh_paint(void)
static void editing_panel_mesh_texface(void)
{
- extern VPaint Gvp; /* from vpaint */
uiBlock *block;
MTFace *tf;
block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_texface", UI_EMBOSS, UI_HELV, curarea->win);
- if(uiNewPanel(curarea, block, "Texture face", "Editing", 960, 0, 318, 204)==0) return;
-
- tf = get_active_tface(NULL);
+ uiNewPanelTabbed("Multires", "Editing");
+ if(uiNewPanel(curarea, block, "Texture Face", "Editing", 960, 0, 318, 204)==0) return;
+
+ tf = get_active_mtface(NULL, NULL, 0);
if(tf) {
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, TF_TEX, B_REDR_3D_IMA, "Tex", 600,160,60,19, &tf->mode, 0, 0, 0, 0, "Render face with texture");
@@ -5278,20 +5615,9 @@ static void editing_panel_mesh_texface(void)
uiBlockBeginAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1);
- uiDefButC(block, ROW, REDRAWVIEW3D, "Opaque", 600,80,60,19, &tf->transp, 2.0, 0.0, 0, 0, "Render color of textured face as color");
- uiDefButC(block, ROW, REDRAWVIEW3D, "Add", 660,80,60,19, &tf->transp, 2.0, 1.0, 0, 0, "Render face transparent and add color of face");
- uiDefButC(block, ROW, REDRAWVIEW3D, "Alpha", 720,80,60,19, &tf->transp, 2.0, 2.0, 0, 0, "Render polygon transparent, depending on alpha channel of the texture");
-
- uiBlockSetCol(block, TH_AUTO);
-
- uiBlockBeginAlign(block);
- uiDefButF(block, COL, B_VPCOLSLI, "", 769,40,40,28, &(Gvp.r), 0, 0, 0, 0, "");
- uiDefBut(block, BUT, B_SET_VCOL, "Set VertCol", 809,40,103,28, 0, 0, 0, 0, 0, "Set Vertex color of selection to current (Shift+K)");
-
- uiBlockBeginAlign(block);
- uiDefBut(block, BUT, B_COPY_TF_MODE, "Copy DrawMode", 600,7,117,28, 0, 0, 0, 0, 0, "Copy the drawmode from active face to selected faces");
- uiDefBut(block, BUT, B_COPY_TF_UV, "Copy UV+tex", 721,7,85,28, 0, 0, 0, 0, 0, "Copy UV information and textures from active face to selected faces");
- uiDefBut(block, BUT, B_COPY_TF_COL, "Copy VertCol", 809,7,103,28, 0, 0, 0, 0, 0, "Copy vertex colors from active face to selected faces");
+ uiDefButC(block, ROW, REDRAWVIEW3D, "Opaque", 600,80,60,19, &tf->transp, 2.0, (float)TF_SOLID,0, 0, "Render color of textured face as color");
+ uiDefButC(block, ROW, REDRAWVIEW3D, "Add", 660,80,60,19, &tf->transp, 2.0, (float)TF_ADD, 0, 0, "Render face transparent and add color of face");
+ uiDefButC(block, ROW, REDRAWVIEW3D, "Alpha", 720,80,60,19, &tf->transp, 2.0, (float)TF_ALPHA,0, 0, "Render polygon transparent, depending on alpha channel of the texture");
}
}
@@ -5312,16 +5638,9 @@ static void editing_panel_mesh_uvautocalculation(void)
block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_uvautocalculation", UI_EMBOSS, UI_HELV, curarea->win);
/* make this a tab of "Texture face" to save screen space*/
- uiNewPanelTabbed("Texture face", "Editing");
+ uiNewPanelTabbed("Multires", "Editing");
if(uiNewPanel(curarea, block, "UV Calculation", "Editing", 960, 0, 318, 204)==0)
return;
-
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, G_DRAWFACES, B_UVAUTO_DRAWFACES, "Draw Faces", 100,row,200,butH, &G.f, 0, 0, 0, 0, "Displays all faces as shades");
- uiDefButBitI(block,TOG, G_DRAWEDGES, REDRAWVIEW3D,"Draw Edges",100,row-butHB,200,butH,&G.f, 2.0, 0, 0, 0, "Displays edges of visible faces");
- uiDefButBitI(block,TOG, G_HIDDENEDGES, REDRAWVIEW3D,"Draw Hidden Edges",100,row-2*butHB,200,butH,&G.f, 2.0, 1.0, 0, 0, "Displays edges of hidden faces");
- uiDefButBitI(block,TOG, G_DRAWSEAMS, REDRAWVIEW3D,"Draw Seams",100,row-3*butHB,200,butH,&G.f, 2.0, 2.0, 0, 0, "Displays UV unwrapping seams");
- uiBlockEndAlign(block);
row-= 4*butHB+butS;
uiBlockBeginAlign(block);
@@ -5422,6 +5741,127 @@ void editing_panel_mesh_multires()
uiBlockEndAlign(block);
}
+void particle_edit_buttons(uiBlock *block)
+{
+ Object *ob=OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleEditSettings *pset = PE_settings();
+ ParticleEdit *edit;
+ uiBut *but;
+ short butx=10,buty=150,butw=150,buth=20, lastbuty;
+ static short partact;
+
+ char *menustr;
+
+ if(psys==NULL) return;
+
+ menustr = psys_menu_string(ob, 0);
+ partact = PE_get_current_num(ob)+1;
+
+ but=uiDefButS(block, MENU, B_BAKE_REDRAWEDIT, menustr, 160,180,butw,buth, &partact, 14.0, 0.0, 0, 0, "Browse systems");
+ uiButSetFunc(but, PE_change_act, ob, &partact);
+
+ MEM_freeN(menustr);
+
+ if(psys->edit) {
+ edit= psys->edit;
+
+ /* brushes */
+ //uiDefBut(block, LABEL, 0, "Brush", butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButS(block,ROW,B_BAKE_REDRAWEDIT,"None",butx,buty,75,19,&pset->brushtype,14.0,PE_BRUSH_NONE,0,0,"Disable brush");
+ uiDefButS(block,ROW,B_BAKE_REDRAWEDIT,"Comb",butx+75,buty,75,19,&pset->brushtype,14.0,PE_BRUSH_COMB,0,0,"Comb hairs");
+ uiDefButS(block,ROW,B_BAKE_REDRAWEDIT,"Smooth",butx+150,buty,75,19,&pset->brushtype,14.0,PE_BRUSH_SMOOTH,0,0,"Smooth hairs");
+ uiDefButS(block,ROW,B_BAKE_REDRAWEDIT,"Weight",butx+225,buty,75,19,&pset->brushtype,14,PE_BRUSH_WEIGHT,0,0,"Weight hairs");
+ buty-= buth;
+ uiDefButS(block,ROW,B_BAKE_REDRAWEDIT,"Add", butx,buty,75,19,&pset->brushtype,14,PE_BRUSH_ADD,0,0,"Add hairs");
+ uiDefButS(block,ROW,B_BAKE_REDRAWEDIT,"Length", butx+75,buty,75,19,&pset->brushtype,14, PE_BRUSH_LENGTH,0,0,"Make hairs longer or shorter");
+ uiDefButS(block,ROW,B_BAKE_REDRAWEDIT,"Puff", butx+150,buty,75,19,&pset->brushtype,14, PE_BRUSH_PUFF,0,0,"Make hairs stand up");
+ uiDefButS(block,ROW,B_BAKE_REDRAWEDIT,"Cut", butx+225,buty,75,19,&pset->brushtype,14, PE_BRUSH_CUT,0,0,"Cut hairs");
+ uiBlockEndAlign(block);
+
+ buty-= 10;
+ lastbuty= buty;
+
+ /* brush options */
+ if(pset->brushtype>=0) {
+ ParticleBrushData *brush= &pset->brush[pset->brushtype];
+
+ butw= 180;
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUMSLI, B_BAKE_REDRAWEDIT, "Size:", butx,(buty-=buth),butw,buth, &brush->size, 1.0, 100.0, 1, 1, "Brush size");
+ uiDefButS(block, NUMSLI, B_BAKE_REDRAWEDIT, "Strength:", butx,(buty-=buth),butw,buth, &brush->strength, 1.0, 100.0, 1, 1, "Brush strength");
+
+ if(ELEM(pset->brushtype, PE_BRUSH_LENGTH, PE_BRUSH_PUFF)) {
+ char *str1, *str2, *tip1, *tip2;
+
+ if(pset->brushtype == PE_BRUSH_LENGTH) {
+ str1= "Grow"; tip1= "Make hairs longer [Shift]";
+ str2= "Shrink"; tip2= "Make hairs shorter [Shift]";
+ }
+ else /*if(pset->brushtype == PE_BRUSH_PUFF)*/ {
+ str1= "Add"; tip1= "Make hair more puffy [Shift]";
+ str2= "Sub"; tip2= "Make hair less puffy [Shift]";
+ }
+
+ uiDefButS(block,ROW,B_NOP,str1, butx,(buty-=buth),butw/2,buth,&brush->invert,0.0,0.0,0, 0,tip1);
+ uiDefButS(block,ROW,B_NOP,str2, butx+butw/2,buty,butw/2,buth,&brush->invert,0.0,1.0,0, 0,tip2);
+ }
+ uiBlockEndAlign(block);
+
+ butx += butw+10;
+ buty= lastbuty;
+ butw= 110;
+
+ if(pset->brushtype==PE_BRUSH_ADD) {
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, PE_INTERPOLATE_ADDED, B_BAKE_REDRAWEDIT, "Interpolate", butx,(buty-=buth),butw,buth, &pset->flag, 0, 0, 0, 0, "Interpolate new particles from the existing ones");
+ uiDefButS(block, NUMSLI, B_BAKE_REDRAWEDIT, "Step:", butx,(buty-=buth),butw,buth, &brush->step, 1.0, 50.0, 1, 1, "Brush step");
+ uiDefButS(block, NUMSLI, B_BAKE_REDRAWEDIT, "Keys:", butx,(buty-=buth),butw,buth, &pset->totaddkey, 2.0, 20.0, 1, 1, "How many keys to make new particles with");
+ uiBlockEndAlign(block);
+ }
+ }
+
+ /* keep options */
+ butw= 150;
+ butx= 10;
+ buty= lastbuty - (buth*3 + 10);
+ lastbuty= buty;
+
+ uiDefBut(block, LABEL, 0, "Keep", butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, PE_KEEP_LENGTHS, B_BAKE_REDRAWEDIT, "Lengths", butx,(buty-=buth),butw/2,buth, &pset->flag, 0, 0, 0, 0, "Keep path lengths constant");
+ uiDefButBitS(block, TOG, PE_LOCK_FIRST, B_BAKE_REDRAWEDIT, "Root", butx+butw/2,buty,butw/2,buth, &pset->flag, 0, 0, 0, 0, "Keep first keys unmodified");
+ uiBlockEndAlign(block);
+
+ buty -= 5;
+
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, PE_DEFLECT_EMITTER, B_BAKE_REDRAWEDIT, "Deflect Emitter", butx,(buty-=buth),butw,buth, &pset->flag, 0, 0, 0, 0, "Keep paths from intersecting the emitter");
+ uiDefButF(block, NUM, B_BAKE_REDRAWEDIT, "Dist:", butx,(buty-=buth),butw,buth, &pset->emitterdist, 0.0, 10.0, 1, 1, "Distance from emitter");
+ uiBlockEndAlign(block);
+
+ buty= lastbuty;
+ butx += butw+10;
+ butw -= 10;
+
+ uiDefBut(block, LABEL, 0, "Draw", butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUMSLI, B_BAKE_RECACHE, "Steps:", butx,(buty-=buth),butw,buth, &psys->part->draw_step, 0.0, 10.0, 1, 1, "Drawing accuracy of paths");
+ uiBlockEndAlign(block);
+
+ buty -= 5;
+
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, PE_SHOW_TIME, B_BAKE_REDRAWEDIT, "Show Time", butx,(buty-=buth),butw,buth, &pset->flag, 0, 0, 0, 0, "Show time values of the baked keys");
+ uiDefButBitS(block, TOG, PE_SHOW_CHILD, B_BAKE_RECACHE, "Show Children", butx,(buty-=buth),butw,buth, &pset->flag, 0, 0, 0, 0, "Show child particles in particle mode");
+ uiBlockEndAlign(block);
+ }
+ else{
+ uiDefBut(block, LABEL, 0, "System isn't editable", butx,(buty-=buth),250,buth, NULL, 0.0, 0, 0, 0, "");
+ }
+}
/* this is a mode context sensitive system */
void editing_panels()
@@ -5448,6 +5888,9 @@ void editing_panels()
if(G.obedit) {
editing_panel_mesh_tools(ob, ob->data);
editing_panel_mesh_tools1(ob, ob->data);
+ editing_panel_mesh_uvautocalculation();
+ if (EM_texFaceCheck())
+ editing_panel_mesh_texface();
}
else if(G.f & G_SCULPTMODE) {
uiNewPanelTabbed("Multires", "Editing");
@@ -5455,10 +5898,6 @@ void editing_panels()
uiNewPanelTabbed("Multires", "Editing");
editing_panel_sculpting_textures();
} else {
- if(G.f & G_FACESELECT) {
- editing_panel_mesh_texface();
- editing_panel_mesh_uvautocalculation();
- }
if(G.f & (G_VERTEXPAINT | G_TEXTUREPAINT | G_WEIGHTPAINT) ) {
editing_panel_mesh_paint();
}
diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c
index bb5ac2ba682..455b41d3f0e 100644
--- a/source/blender/src/buttons_object.c
+++ b/source/blender/src/buttons_object.c
@@ -52,6 +52,7 @@
#include "BKE_library.h"
#include "BKE_softbody.h"
#include "BKE_utildefines.h"
+#include "BKE_particle.h"
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
@@ -61,6 +62,7 @@
#include "BIF_butspace.h"
#include "BIF_editaction.h"
+#include "BIF_editparticle.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "BIF_graphics.h"
@@ -73,6 +75,7 @@
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_toolbox.h"
+#include "BIF_outliner.h"
#include "BDR_drawobject.h"
#include "BDR_editcurve.h"
@@ -101,6 +104,7 @@
#include "DNA_object_types.h"
#include "DNA_object_force.h"
#include "DNA_object_fluidsim.h"
+#include "DNA_particle_types.h"
#include "DNA_radio_types.h"
#include "DNA_screen_types.h"
#include "DNA_sound_types.h"
@@ -109,6 +113,7 @@
#include "DNA_vfont_types.h"
#include "DNA_view3d_types.h"
#include "DNA_world_types.h"
+#include "DNA_text_types.h"
#include "BKE_anim.h"
#include "BKE_armature.h"
@@ -128,6 +133,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_sound.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -138,11 +144,13 @@
#include "BIF_editconstraint.h"
#include "BIF_editdeform.h"
+#include "BIF_editparticle.h"
#include "BSE_editipo.h"
#include "BSE_edit.h"
#include "BDR_editobject.h"
+#include "BPY_extern.h"
#include "butspace.h" // own module
@@ -261,9 +269,9 @@ static void add_influence_key_to_constraint_func (void *ob_v, void *con_v)
}
if(ob->action)
- insert_vert_ipo(icu, get_action_frame(ob, (float)CFRA), con->enforce);
+ insert_vert_icu(icu, get_action_frame(ob, (float)CFRA), con->enforce, 0);
else
- insert_vert_ipo(icu, CFRA, con->enforce);
+ insert_vert_icu(icu, CFRA, con->enforce, 0);
/* make sure ipowin shows it */
ob->ipowin= ID_CO;
@@ -323,106 +331,6 @@ static void verify_constraint_name_func (void *con_v, void *name_v)
allqueue(REDRAWACTION, 0);
}
-void get_constraint_typestring (char *str, void *con_v)
-{
- bConstraint *con= con_v;
-
- switch (con->type){
- case CONSTRAINT_TYPE_CHILDOF:
- strcpy (str, "Child Of");
- return;
- case CONSTRAINT_TYPE_NULL:
- strcpy (str, "Null");
- return;
- case CONSTRAINT_TYPE_TRACKTO:
- strcpy (str, "Track To");
- return;
- case CONSTRAINT_TYPE_MINMAX:
- strcpy (str, "Floor");
- return;
- case CONSTRAINT_TYPE_KINEMATIC:
- strcpy (str, "IK Solver");
- return;
- case CONSTRAINT_TYPE_ROTLIKE:
- strcpy (str, "Copy Rotation");
- return;
- case CONSTRAINT_TYPE_LOCLIKE:
- strcpy (str, "Copy Location");
- return;
- case CONSTRAINT_TYPE_SIZELIKE:
- strcpy (str, "Copy Scale");
- return;
- case CONSTRAINT_TYPE_ACTION:
- strcpy (str, "Action");
- return;
- case CONSTRAINT_TYPE_LOCKTRACK:
- strcpy (str, "Locked Track");
- return;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- strcpy (str, "Follow Path");
- return;
- case CONSTRAINT_TYPE_STRETCHTO:
- strcpy (str, "Stretch To");
- return;
- case CONSTRAINT_TYPE_LOCLIMIT:
- strcpy (str, "Limit Location");
- return;
- case CONSTRAINT_TYPE_ROTLIMIT:
- strcpy (str, "Limit Rotation");
- return;
- case CONSTRAINT_TYPE_SIZELIMIT:
- strcpy (str, "Limit Scale");
- return;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- strcpy (str, "Rigid Body");
- return;
- case CONSTRAINT_TYPE_CLAMPTO:
- strcpy (str, "Clamp To");
- return;
- default:
- strcpy (str, "Unknown");
- return;
- }
-}
-
-static int get_constraint_col(bConstraint *con)
-{
- switch (con->type) {
- case CONSTRAINT_TYPE_NULL:
- return TH_BUT_NEUTRAL;
- case CONSTRAINT_TYPE_KINEMATIC:
- return TH_BUT_SETTING2;
- case CONSTRAINT_TYPE_TRACKTO:
- return TH_BUT_SETTING;
- case CONSTRAINT_TYPE_ROTLIKE:
- return TH_BUT_SETTING1;
- case CONSTRAINT_TYPE_LOCLIKE:
- return TH_BUT_POPUP;
- case CONSTRAINT_TYPE_MINMAX:
- return TH_BUT_POPUP;
- case CONSTRAINT_TYPE_SIZELIKE:
- return TH_BUT_POPUP;
- case CONSTRAINT_TYPE_ACTION:
- return TH_BUT_ACTION;
- case CONSTRAINT_TYPE_LOCKTRACK:
- return TH_BUT_SETTING;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- return TH_BUT_SETTING2;
- case CONSTRAINT_TYPE_STRETCHTO:
- return TH_BUT_SETTING;
- case CONSTRAINT_TYPE_LOCLIMIT:
- return TH_BUT_POPUP;
- case CONSTRAINT_TYPE_ROTLIMIT:
- return TH_BUT_POPUP;
- case CONSTRAINT_TYPE_SIZELIMIT:
- return TH_BUT_POPUP;
- case CONSTRAINT_TYPE_RIGIDBODYJOINT:
- return TH_BUT_SETTING;
- default:
- return TH_REDALERT;
- }
-}
-
void const_moveUp(void *ob_v, void *con_v)
{
bConstraint *con, *constr= con_v;
@@ -508,23 +416,107 @@ void autocomplete_vgroup(char *str, void *arg_v)
}
}
-static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, short *xco, short *yco)
+/* pole angle callback */
+void con_kinematic_set_pole_angle(void *ob_v, void *con_v)
{
- Object *ob= OBACT, *target;
- uiBut *but;
- char typestr[64], *subtarget;
- short height, width = 265, is_armature_target;
- int curCol, rb_col;
+ bConstraint *con= con_v;
+ bKinematicConstraint *data = con->data;
+
+ if(data->poletar) {
+ if(data->flag & CONSTRAINT_IK_SETANGLE) {
+ data->flag |= CONSTRAINT_IK_GETANGLE;
+ data->flag &= ~CONSTRAINT_IK_SETANGLE;
+ }
+ else {
+ data->flag &= ~CONSTRAINT_IK_GETANGLE;
+ data->flag |= CONSTRAINT_IK_SETANGLE;
+ }
+ }
+}
- target= get_constraint_target(con, &subtarget);
- is_armature_target= (target && target->type==OB_ARMATURE);
+/* some commonly used macros in the constraints drawing code */
+#define is_armature_target(target) (target && target->type==OB_ARMATURE)
+#define is_armature_owner(ob) ((ob->type == OB_ARMATURE) && (ob->flag & OB_POSEMODE))
+#define is_geom_target(target) (target && (ELEM(target->type, OB_MESH, OB_LATTICE)) )
+
+/* Helper function for draw constraint - draws constraint space stuff
+ * This function should not be called if no menus are required
+ * owner/target: -1 = don't draw menu; 0= not posemode, 1 = posemode
+ */
+static void draw_constraint_spaceselect (uiBlock *block, bConstraint *con, short xco, short yco, short owner, short target)
+{
+ short tarx, ownx;
+ short bwidth;
+
+ /* calculate sizes and placement of menus */
+ if (owner == -1) {
+ bwidth = 125;
+ tarx = 120;
+ ownx = 0;
+
+ }
+ else if (target == -1) {
+ bwidth = 125;
+ tarx = 0;
+ ownx = 120;
+ }
+ else {
+ bwidth = 100;
+ tarx = 95;
+ ownx = tarx + bwidth;
+ }
- /* unless button has own callback, it adds this callback to button */
- uiBlockSetFunc(block, constraint_active_func, ob, con);
- get_constraint_typestring (typestr, con);
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "CSpace:", xco, yco, 80,18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ uiBlockBeginAlign(block);
+
+ /* Target-Space */
+ if (target == 1) {
+ uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Pose Space %x3|Local with Parent %x4|Local Space %x1",
+ tarx, yco, bwidth, 18, &con->tarspace, 0, 0, 0, 0, "Choose space that target is evaluated in");
+ }
+ else if (target == 0) {
+ uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Local (Without Parent) Space %x1",
+ tarx, yco, bwidth, 18, &con->tarspace, 0, 0, 0, 0, "Choose space that target is evaluated in");
+ }
+
+ /* Owner-Space */
+ if (owner == 1) {
+ uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Owner Space %t|World Space %x0|Pose Space %x3|Local with Parent %x4|Local Space %x1",
+ ownx, yco, bwidth, 18, &con->ownspace, 0, 0, 0, 0, "Choose space that owner is evaluated in");
+ }
+ else if (owner == 0) {
+ uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Owner Space %t|World Space %x0|Local (Without Parent) Space %x1",
+ ownx, yco, bwidth, 18, &con->ownspace, 0, 0, 0, 0, "Choose space that owner is evaluated in");
+ }
+
+ uiBlockEndAlign(block);
+}
- curCol = get_constraint_col(con);
+/* draw panel showing settings for a constraint */
+static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, short *xco, short *yco)
+{
+ Object *ob= OBACT;
+ bConstraintTypeInfo *cti;
+ uiBut *but;
+ char typestr[32];
+ short height, width = 265;
+ int rb_col;
+
+ cti= constraint_get_typeinfo(con);
+ if (cti == NULL) {
+ /* exception for 'Null' constraint - it doesn't have constraint typeinfo! */
+ if (con->type == CONSTRAINT_TYPE_NULL)
+ strcpy(typestr, "Null");
+ else
+ strcpy(typestr, "Unknown");
+ }
+ else
+ strcpy(typestr, cti->name);
+
+ /* unless button has own callback, it adds this callback to button */
+ uiBlockSetFunc(block, constraint_active_func, ob, con);
/* Draw constraint header */
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -537,29 +529,20 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* open/close */
uiDefIconButBitS(block, ICONTOG, CONSTRAINT_EXPAND, B_CONSTRAINT_TEST, ICON_DISCLOSURE_TRI_RIGHT, *xco-10, *yco, 20, 20, &con->flag, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Constraint");
- /* up down */
+ /* up/down */
+ uiBlockBeginAlign(block);
uiBlockSetEmboss(block, UI_EMBOSS);
- but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_UP, *xco+width-50, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move modifier up in stack");
+ but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_UP, *xco+width-50, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move constraint up in constraint stack");
uiButSetFunc(but, constraint_moveUp, ob, con);
- but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_DOWN, *xco+width-50+20, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move modifier down in stack");
+ but = uiDefIconBut(block, BUT, B_CONSTRAINT_TEST, VICON_MOVE_DOWN, *xco+width-50+18, *yco, 16, 18, NULL, 0.0, 0.0, 0.0, 0.0, "Move constraint down in constraint stack");
uiButSetFunc(but, constraint_moveDown, ob, con);
+ uiBlockEndAlign(block);
if (con->flag & CONSTRAINT_EXPAND) {
-
- if (con->flag & CONSTRAINT_DISABLE) {
- BIF_ThemeColor(TH_REDALERT);
+ if (con->flag & CONSTRAINT_DISABLE)
uiBlockSetCol(block, TH_REDALERT);
- }
- else {
- BIF_ThemeColor(curCol);
- }
-
- /*if (type==TARGET_BONE)
- but = uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Bone Constraint%t|Track To%x2|IK Solver%x3|Copy Rotation%x8|Copy Location%x9|Action%x12|Null%x0", *xco+20, *yco, 100, 20, &con->type, 0.0, 0.0, 0.0, 0.0, "Constraint type");
- else
- but = uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Object Constraint%t|Track To%x2|Copy Rotation%x8|Copy Location%x9|Null%x0", *xco+20, *yco, 100, 20, &con->type, 0.0, 0.0, 0.0, 0.0, "Constraint type");
- */
+
uiBlockSetEmboss(block, UI_EMBOSS);
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, *xco+10, *yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
@@ -569,14 +552,9 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
}
else {
uiBlockSetEmboss(block, UI_EMBOSSN);
-
- if (con->flag & CONSTRAINT_DISABLE) {
+
+ if (con->flag & CONSTRAINT_DISABLE)
uiBlockSetCol(block, TH_REDALERT);
- BIF_ThemeColor(TH_REDALERT);
- }
- else {
- BIF_ThemeColor(curCol);
- }
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, typestr, *xco+10, *yco, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
@@ -593,48 +571,206 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
uiBlockSetEmboss(block, UI_EMBOSS);
- /* Draw constraint data*/
- if (!(con->flag & CONSTRAINT_EXPAND)) {
- (*yco)-=21;
+ /* Draw constraint data */
+ if ((con->flag & CONSTRAINT_EXPAND) == 0) {
+ (*yco) -= 21;
}
else {
- switch (con->type){
+ switch (con->type) {
+ case CONSTRAINT_TYPE_PYTHON:
+ {
+ bPythonConstraint *data = con->data;
+ bConstraintTarget *ct;
+ uiBut *but2;
+ int tarnum, theight;
+ static int pyconindex=0;
+ char *menustr;
+
+ theight = (data->tarnum)? (data->tarnum * 38) : (38);
+ height = theight + 78;
+ uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40, height-1, NULL, 5.0, 0.0, 12, rb_col, "");
+
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Script:", *xco+60, *yco-24, 55, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ /* do the scripts menu */
+ menustr = buildmenu_pyconstraints(data->text, &pyconindex);
+ but2 = uiDefButI(block, MENU, B_CONSTRAINT_TEST, menustr,
+ *xco+120, *yco-24, 150, 20, &pyconindex,
+ 0.0, 1.0, 0, 0, "Set the Script Constraint to use");
+ uiButSetFunc(but2, validate_pyconstraint_cb, data, &pyconindex);
+ MEM_freeN(menustr);
+
+ /* draw target(s) */
+ if (data->flag & PYCON_USETARGETS) {
+ /* Draw target parameters */
+ for (ct=data->targets.first, tarnum=1; ct; ct=ct->next, tarnum++) {
+ char tarstr[32];
+ short yoffset= ((tarnum-1) * 38);
+
+ /* target label */
+ sprintf(tarstr, "Target %02d:", tarnum);
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, tarstr, *xco+45, *yco-(48+yoffset), 60, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ /* target space-selector - per target */
+ if (is_armature_target(ct->tar)) {
+ uiDefButS(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Pose Space %x3|Local with Parent %x4|Local Space %x1",
+ *xco+10, *yco-(66+yoffset), 100, 18, &ct->space, 0, 0, 0, 0, "Choose space that target is evaluated in");
+ }
+ else {
+ uiDefButS(block, MENU, B_CONSTRAINT_TEST, "Target Space %t|World Space %x0|Local (Without Parent) Space %x1",
+ *xco+10, *yco-(66+yoffset), 100, 18, &ct->space, 0, 0, 0, 0, "Choose space that target is evaluated in");
+ }
+
+ uiBlockBeginAlign(block);
+ /* target object */
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-(48+yoffset), 150, 18, &ct->tar, "Target Object");
+
+ /* subtarget */
+ if (is_armature_target(ct->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-(66+yoffset),150,18, &ct->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)ct->tar);
+ }
+ else if (is_geom_target(ct->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-(66+yoffset),150,18, &ct->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)ct->tar);
+ }
+ else {
+ strcpy(ct->subtarget, "");
+ }
+ uiBlockEndAlign(block);
+ }
+ }
+ else {
+ /* Draw indication that no target needed */
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+60, *yco-48, 55, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Not Applicable", *xco+120, *yco-48, 150, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ }
+
+ /* settings */
+ uiBlockBeginAlign(block);
+ but=uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Options", *xco, *yco-(52+theight), (width/2),18, NULL, 0, 24, 0, 0, "Change some of the constraint's settings.");
+ uiButSetFunc(but, BPY_pyconstraint_settings, data, NULL);
+
+ but=uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Refresh", *xco+((width/2)+10), *yco-(52+theight), (width/2),18, NULL, 0, 24, 0, 0, "Force constraint to refresh it's settings");
+ uiBlockEndAlign(block);
+
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-(73+theight), is_armature_owner(ob), -1);
+ }
+ break;
case CONSTRAINT_TYPE_ACTION:
{
bActionConstraint *data = con->data;
-
- height = 88;
+ float minval, maxval;
+
+ height = 108;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
/* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
-
- if (is_armature_target){
- but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
- }
- else {
- strcpy (data->subtarget, "");
- }
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
+
+ if (is_armature_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
uiBlockEndAlign(block);
-
- /* Draw action button */
+
+ /* Draw action/type buttons */
uiBlockBeginAlign(block);
- uiDefButS(block, TOG, B_CONSTRAINT_TEST, "Local", *xco+((width/2)-117), *yco-46, 78, 18, &data->local, 0, 0, 0, 0, "Use true local rotation difference");
- uiDefIDPoinBut(block, test_actionpoin_but, ID_AC, B_CONSTRAINT_TEST, "AC:", *xco+((width/2)-117), *yco-64, 78, 18, &data->act, "Action containing the keyed motion for this bone");
- uiDefButS(block, MENU, B_CONSTRAINT_TEST, "Key on%t|X Rot%x0|Y Rot%x1|Z Rot%x2", *xco+((width/2)-117), *yco-84, 78, 18, &data->type, 0, 24, 0, 0, "Specify which transformation channel from the target is used to key the action");
-
+ uiDefIDPoinBut(block, test_actionpoin_but, ID_AC, B_CONSTRAINT_TEST, "AC:", *xco+((width/2)-117), *yco-64, 78, 18, &data->act, "Action containing the keyed motion for this bone");
+ uiDefButS(block, MENU, B_CONSTRAINT_TEST, "Key on%t|Loc X%x20|Loc Y%x21|Loc Z%x22|Rot X%x0|Rot Y%x1|Rot Z%x2|Size X%x10|Size Y%x11|Size Z%x12", *xco+((width/2)-117), *yco-84, 78, 18, &data->type, 0, 24, 0, 0, "Specify which transformation channel from the target is used to key the action");
+ uiBlockEndAlign(block);
+
+ /* Draw start/end frame buttons */
+ uiBlockBeginAlign(block);
+ uiDefButI(block, NUM, B_CONSTRAINT_TEST, "Start:", *xco+((width/2)-36), *yco-64, 78, 18, &data->start, 1, MAXFRAME, 0.0, 0.0, "Starting frame of the keyed motion");
+ uiDefButI(block, NUM, B_CONSTRAINT_TEST, "End:", *xco+((width/2)-36), *yco-84, 78, 18, &data->end, 1, MAXFRAME, 0.0, 0.0, "Ending frame of the keyed motion");
+ uiBlockEndAlign(block);
+
+ /* Draw minimum/maximum transform range buttons */
+ uiBlockBeginAlign(block);
+ if (data->type < 10) { /* rotation */
+ minval = -180.0f;
+ maxval = 180.0f;
+ }
+ else if (data->type < 20) { /* scaling */
+ minval = 0.0001f;
+ maxval = 1000.0f;
+ }
+ else { /* location */
+ minval = -1000.0f;
+ maxval = 1000.0f;
+ }
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Min:", *xco+((width/2)+45), *yco-64, 78, 18, &data->min, minval, maxval, 0, 0, "Minimum value for target channel range");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Max:", *xco+((width/2)+45), *yco-84, 78, 18, &data->max, minval, maxval, 0, 0, "Maximum value for target channel range");
+ uiBlockEndAlign(block);
+
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-104, -1, is_armature_target(data->tar));
+ }
+ break;
+ case CONSTRAINT_TYPE_CHILDOF:
+ {
+ bChildOfConstraint *data = con->data;
+ short normButWidth = (width/3);
+
+ height = 165;
+ uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
+
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Parent:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ /* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefButI(block, NUM, B_CONSTRAINT_TEST, "Start:", *xco+((width/2)-36), *yco-64, 78, 18, &data->start, 1, MAXFRAME, 0.0, 0.0, "Starting frame of the keyed motion");
- uiDefButI(block, NUM, B_CONSTRAINT_TEST, "End:", *xco+((width/2)-36), *yco-84, 78, 18, &data->end, 1, MAXFRAME, 0.0, 0.0, "Ending frame of the keyed motion");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object to use as Parent");
+
+ if (is_armature_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone to use as Parent");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
+ uiBlockEndAlign(block);
+
+ /* Draw triples of channel toggles */
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Use Channel(s):", *xco+65, *yco-64, 150, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, CHILDOF_LOCX, B_CONSTRAINT_TEST, "Loc X", *xco, *yco-84, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Parent affects x-location");
+ uiDefButBitI(block, TOG, CHILDOF_LOCY, B_CONSTRAINT_TEST, "Loc Y", *xco+normButWidth, *yco-84, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Parent affects y-location");
+ uiDefButBitI(block, TOG, CHILDOF_LOCZ, B_CONSTRAINT_TEST, "Loc Z", *xco+(normButWidth * 2), *yco-84, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Parent affects z-location");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, CHILDOF_ROTX, B_CONSTRAINT_TEST, "Rot X", *xco, *yco-105, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Parent affects x-rotation");
+ uiDefButBitI(block, TOG, CHILDOF_ROTY, B_CONSTRAINT_TEST, "Rot Y", *xco+normButWidth, *yco-105, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Parent affects y-rotation");
+ uiDefButBitI(block, TOG, CHILDOF_ROTZ, B_CONSTRAINT_TEST, "Rot Z", *xco+(normButWidth * 2), *yco-105, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Parent affects z-rotation");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, CHILDOF_SIZEX, B_CONSTRAINT_TEST, "Scale X", *xco, *yco-126, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Parent affects x-scaling");
+ uiDefButBitI(block, TOG, CHILDOF_SIZEY, B_CONSTRAINT_TEST, "Scale Y", *xco+normButWidth, *yco-126, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Parent affects y-scaling");
+ uiDefButBitI(block, TOG, CHILDOF_SIZEZ, B_CONSTRAINT_TEST, "Scale Z", *xco+(normButWidth * 2), *yco-126, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Parent affects z-scaling");
+ uiBlockEndAlign(block);
+
+ /* Inverse options */
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Min:", *xco+((width/2)+45), *yco-64, 78, 18, &data->min, -180, 180, 0, 0, "Minimum value for target channel range");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Max:", *xco+((width/2)+45), *yco-84, 78, 18, &data->max, -180, 180, 0, 0, "Maximum value for target channel range");
+ but=uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Set Offset", *xco, *yco-151, (width/2),18, NULL, 0, 24, 0, 0, "Calculate current Parent-Inverse Matrix (i.e. restore offset from parent)");
+ uiButSetFunc(but, childof_const_setinv, data, NULL);
+
+ but=uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Clear Offset", *xco+((width/2)+10), *yco-151, (width/2),18, NULL, 0, 24, 0, 0, "Clear Parent-Inverse Matrix (i.e. clear offset from parent)");
+ uiButSetFunc(but, childof_const_clearinv, data, NULL);
uiBlockEndAlign(block);
}
break;
@@ -642,237 +778,325 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
{
bLocateLikeConstraint *data = con->data;
- height = 91;
+ height = 111;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
-
+
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
/* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
-
- if (is_armature_target) {
- but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
- }
- else {
- strcpy (data->subtarget, "");
- }
-
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
+
+ if (is_armature_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
uiBlockEndAlign(block);
/* Draw XYZ toggles */
uiBlockBeginAlign(block);
- but=uiDefButBitI(block, TOG, LOCLIKE_X, B_CONSTRAINT_TEST, "X", *xco+((width/2)-48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy X component");
- but=uiDefButBitI(block, TOG, LOCLIKE_X_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)-16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert X component");
- but=uiDefButBitI(block, TOG, LOCLIKE_Y, B_CONSTRAINT_TEST, "Y", *xco+((width/2)+16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Y component");
- but=uiDefButBitI(block, TOG, LOCLIKE_Y_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)+48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert Y component");
- but=uiDefButBitI(block, TOG, LOCLIKE_Z, B_CONSTRAINT_TEST, "Z", *xco+((width/2)+96), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Z component");
- but=uiDefButBitI(block, TOG, LOCLIKE_Z_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)+128), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert Z component");
+ uiDefButBitI(block, TOG, LOCLIKE_X, B_CONSTRAINT_TEST, "X", *xco+((width/2)-48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy X component");
+ uiDefButBitI(block, TOG, LOCLIKE_X_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)-16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert X component");
+ uiDefButBitI(block, TOG, LOCLIKE_Y, B_CONSTRAINT_TEST, "Y", *xco+((width/2)+16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Y component");
+ uiDefButBitI(block, TOG, LOCLIKE_Y_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)+48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert Y component");
+ uiDefButBitI(block, TOG, LOCLIKE_Z, B_CONSTRAINT_TEST, "Z", *xco+((width/2)+96), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Z component");
+ uiDefButBitI(block, TOG, LOCLIKE_Z_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)+128), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert Z component");
uiBlockEndAlign(block);
/* Draw options */
- uiDefButBitI(block, TOG, LOCLIKE_OFFSET, B_CONSTRAINT_TEST, "Offset", *xco+(width/3), *yco-89, (width/3), 18, &data->flag, 0, 24, 0, 0, "Add original location onto copied location");
- if (is_armature_target) {
- uiDefButBitS(block, TOG, CONSTRAINT_LOCAL, B_CONSTRAINT_TEST, "Local", *xco, *yco-89, (width/3), 18, &con->flag, 0, 24, 0, 0, "Work on a Pose's local transform");
- uiDefButBitI(block, TOG, LOCLIKE_TIP, B_CONSTRAINT_TEST, "Target Bone Tip", *xco+(width/3*2), *yco-89, (width/3), 18, &data->flag, 0, 24, 0, 0, "Copy Location of Target Bone's Tip");
+ uiDefButBitI(block, TOG, LOCLIKE_OFFSET, B_CONSTRAINT_TEST, "Offset", *xco, *yco-89, (width/2), 18, &data->flag, 0, 24, 0, 0, "Add original location onto copied location");
+ if (is_armature_target(data->tar)) {
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Head/Tail:", *xco+(width/2), *yco-89, (width/2), 18, &con->headtail, 0.0, 1, 0.1, 0.1, "Target along length of bone: Head=0, Tail=1");
}
+
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-109, is_armature_owner(ob), is_armature_target(data->tar));
}
break;
case CONSTRAINT_TYPE_ROTLIKE:
{
bRotateLikeConstraint *data = con->data;
- height = 91;
+ height = 101;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
/* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
-
- if (is_armature_target) {
- but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
- }
- else {
- strcpy (data->subtarget, "");
- }
-
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
+
+ if (is_armature_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
uiBlockEndAlign(block);
/* Draw XYZ toggles */
uiBlockBeginAlign(block);
- if (is_armature_target)
- uiDefButBitS(block, TOG, CONSTRAINT_LOCAL, B_CONSTRAINT_TEST, "Local", *xco+((width/2)-98), *yco-64, 50, 18, &con->flag, 0, 24, 0, 0, "Work on a Pose's local transform");
- but=uiDefButBitI(block, TOG, ROTLIKE_X, B_CONSTRAINT_TEST, "X", *xco+((width/2)-48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy X component");
- but=uiDefButBitI(block, TOG, ROTLIKE_X_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)-16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert X component");
- but=uiDefButBitI(block, TOG, ROTLIKE_Y, B_CONSTRAINT_TEST, "Y", *xco+((width/2)+16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Y component");
- but=uiDefButBitI(block, TOG, ROTLIKE_Y_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)+48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert Y component");
- but=uiDefButBitI(block, TOG, ROTLIKE_Z, B_CONSTRAINT_TEST, "Z", *xco+((width/2)+96), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Z component");
- but=uiDefButBitI(block, TOG, ROTLIKE_Z_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)+128), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert Z component");
+ uiDefButBitI(block, TOG, ROTLIKE_X, B_CONSTRAINT_TEST, "X", *xco+((width/2)-48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy X component");
+ uiDefButBitI(block, TOG, ROTLIKE_X_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)-16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert X component");
+ uiDefButBitI(block, TOG, ROTLIKE_Y, B_CONSTRAINT_TEST, "Y", *xco+((width/2)+16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Y component");
+ uiDefButBitI(block, TOG, ROTLIKE_Y_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)+48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert Y component");
+ uiDefButBitI(block, TOG, ROTLIKE_Z, B_CONSTRAINT_TEST, "Z", *xco+((width/2)+96), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Z component");
+ uiDefButBitI(block, TOG, ROTLIKE_Z_INVERT, B_CONSTRAINT_TEST, "-", *xco+((width/2)+128), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Invert Z component");
uiBlockEndAlign(block);
+
+ /* draw offset toggle */
+ uiDefButBitI(block, TOG, ROTLIKE_OFFSET, B_CONSTRAINT_TEST, "Offset", *xco, *yco-64, 80, 18, &data->flag, 0, 24, 0, 0, "Add original rotation onto copied rotation");
+
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-94, is_armature_owner(ob), is_armature_target(data->tar));
}
break;
case CONSTRAINT_TYPE_SIZELIKE:
{
bSizeLikeConstraint *data = con->data;
- height = 91;
-
+
+ height = 101;
+
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
-
+
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
/* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
-
- if (is_armature_target) {
- but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
- }
- else {
- strcpy (data->subtarget, "");
- }
-
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
+
+ if (is_armature_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
uiBlockEndAlign(block);
-
+
/* Draw XYZ toggles */
uiBlockBeginAlign(block);
- if (is_armature_target)
- uiDefButBitS(block, TOG, CONSTRAINT_LOCAL, B_CONSTRAINT_TEST, "Local", *xco+((width/2)-98), *yco-64, 50, 18, &con->flag, 0, 24, 0, 0, "Work on a Pose's local transform");
- but=uiDefButBitI(block, TOG, SIZELIKE_X, B_CONSTRAINT_TEST, "X", *xco+((width/2)-48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy X component");
- but=uiDefButBitI(block, TOG, SIZELIKE_Y, B_CONSTRAINT_TEST, "Y", *xco+((width/2)-16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Y component");
- but=uiDefButBitI(block, TOG, SIZELIKE_Z, B_CONSTRAINT_TEST, "Z", *xco+((width/2)+16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Z component");
+ uiDefButBitI(block, TOG, SIZELIKE_X, B_CONSTRAINT_TEST, "X", *xco+((width/2)-48), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy X component");
+ uiDefButBitI(block, TOG, SIZELIKE_Y, B_CONSTRAINT_TEST, "Y", *xco+((width/2)-16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Y component");
+ uiDefButBitI(block, TOG, SIZELIKE_Z, B_CONSTRAINT_TEST, "Z", *xco+((width/2)+16), *yco-64, 32, 18, &data->flag, 0, 24, 0, 0, "Copy Z component");
uiBlockEndAlign(block);
+
+ /* draw offset toggle */
+ uiDefButBitI(block, TOG, SIZELIKE_OFFSET, B_CONSTRAINT_TEST, "Offset", *xco, *yco-64, 80, 18, &data->flag, 0, 24, 0, 0, "Add original scaling onto copied scaling");
+
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-94, is_armature_owner(ob), is_armature_target(data->tar));
}
break;
case CONSTRAINT_TYPE_KINEMATIC:
{
bKinematicConstraint *data = con->data;
- height = 111;
+ height = 146;
+ if(data->poletar)
+ height += 30;
+
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- /* Draw target parameters */
- uiDefButBitS(block, TOG, CONSTRAINT_IK_ROT, B_CONSTRAINT_TEST, "Rot", *xco, *yco-24,60,19, &data->flag, 0, 0, 0, 0, "Chain follows rotation of target");
+ /* IK Target */
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ /* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 19, &data->tar, "Target Object");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco, *yco-44, 137, 19, &data->tar, "Target Object");
- if (is_armature_target) {
- but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,19, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ if (is_armature_target(data->tar)) {
+ but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco, *yco-62,137,19, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
}
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco, *yco-62,137,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
else {
strcpy (data->subtarget, "");
}
-
+
+ uiBlockEndAlign(block);
+
+ /* Settings */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, CONSTRAINT_IK_TIP, B_CONSTRAINT_TEST, "Use Tip", *xco, *yco-64, 137, 19, &data->flag, 0, 0, 0, 0, "Include Bone's tip als last element in Chain");
- uiDefButI(block, NUM, B_CONSTRAINT_TEST, "ChainLen:", *xco, *yco-84,137,19, &data->rootbone, 0, 255, 0, 0, "If not zero, the amount of bones in this chain");
-
+ uiDefButBitS(block, TOG, CONSTRAINT_IK_TIP, B_CONSTRAINT_TEST, "Use Tail", *xco, *yco-92, 137, 19, &data->flag, 0, 0, 0, 0, "Include Bone's tail als last element in Chain");
+ uiDefButI(block, NUM, B_CONSTRAINT_TEST, "ChainLen:", *xco, *yco-112,137,19, &data->rootbone, 0, 255, 0, 0, "If not zero, the amount of bones in this chain");
+
uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, B_CONSTRAINT_TEST, "PosW ", *xco+147, *yco-64, 137, 19, &data->weight, 0.01, 1.0, 2, 2, "For Tree-IK: weight of position control for this target");
- uiDefButF(block, NUMSLI, B_CONSTRAINT_TEST, "RotW ", *xco+147, *yco-84, 137, 19, &data->orientweight, 0.01, 1.0, 2, 2, "For Tree-IK: Weight of orientation control for this target");
+ uiDefButF(block, NUMSLI, B_CONSTRAINT_TEST, "PosW ", *xco+147, *yco-92, 137, 19, &data->weight, 0.01, 1.0, 2, 2, "For Tree-IK: weight of position control for this target");
+ uiDefButBitS(block, TOG, CONSTRAINT_IK_ROT, B_CONSTRAINT_TEST, "Rot", *xco+147, *yco-112, 40,19, &data->flag, 0, 0, 0, 0, "Chain follows rotation of target");
+ uiDefButF(block, NUMSLI, B_CONSTRAINT_TEST, "W ", *xco+187, *yco-112, 97, 19, &data->orientweight, 0.01, 1.0, 2, 2, "For Tree-IK: Weight of orientation control for this target");
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_CONSTRAINT_TEST, "Iterations:", *xco, *yco-109, 137, 19, &data->iterations, 1, 10000, 0, 0, "Maximum number of solving iterations");
+
+ uiDefButBitS(block, TOG, CONSTRAINT_IK_STRETCH, B_CONSTRAINT_TEST, "Stretch", *xco, *yco-137,137,19, &data->flag, 0, 0, 0, 0, "Enable IK stretching");
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, CONSTRAINT_IK_STRETCH, B_CONSTRAINT_TEST, "Stretch", *xco+147, *yco-109,137,19, &data->flag, 0, 0, 0, 0, "Enable IK stretching");
-
+ uiDefButS(block, NUM, B_CONSTRAINT_TEST, "Iterations:", *xco+147, *yco-137, 137, 19, &data->iterations, 1, 10000, 0, 0, "Maximum number of solving iterations");
+ uiBlockEndAlign(block);
+
+ /* Pole Vector */
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Pole Target:", *xco+147, *yco-24, 100, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ uiBlockBeginAlign(block);
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+147, *yco-44, 137, 19, &data->poletar, "Pole Target Object");
+ if (is_armature_target(data->poletar)) {
+ but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+147, *yco-62,137,19, &data->polesubtarget, 0, 24, 0, 0, "Pole Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->poletar);
+ }
+ else if (is_geom_target(data->poletar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+147, *yco-62,137,18, &data->polesubtarget, 0, 24, 0, 0, "Name of Vertex Group defining pole 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->poletar);
+ }
+ else {
+ strcpy (data->polesubtarget, "");
+ }
+
+ if(data->poletar) {
+ uiBlockBeginAlign(block);
+#if 0
+ but = uiDefBut(block, BUT, B_CONSTRAINT_TEST, (data->flag & CONSTRAINT_IK_SETANGLE)? "Set Pole Offset": "Clear Pole Offset", *xco, *yco-167, 137, 19, 0, 0.0, 1.0, 0.0, 0.0, "Set the pole rotation offset from the current pose");
+ uiButSetFunc(but, con_kinematic_set_pole_angle, ob, con);
+ if(!(data->flag & CONSTRAINT_IK_SETANGLE))
+#endif
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Pole Offset ", *xco, *yco-167, 137, 19, &data->poleangle, -180.0, 180.0, 0, 0, "Pole rotation offset");
+ }
}
break;
case CONSTRAINT_TYPE_TRACKTO:
{
bTrackToConstraint *data = con->data;
-
- height = 66;
+
+ if (is_armature_target(data->tar))
+ height = 118;
+ else
+ height = 96;
+
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
/* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
-
- if (is_armature_target) {
- but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
- }
- else {
- strcpy (data->subtarget, "");
- }
-
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
+
+ if (is_armature_target(data->tar)) {
+ but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
uiBlockEndAlign(block);
-
+
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Align:", *xco+5, *yco-42, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- uiDefButBitI(block, TOG, 1, B_CONSTRAINT_TEST, "TargetZ", *xco+60, *yco-42, 50, 18, &data->flags, 0, 1, 0, 0, "Target Z axis, not world Z axis, will constrain up direction");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Align:", *xco+5, *yco-42, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ uiDefButBitI(block, TOG, 1, B_CONSTRAINT_TEST, "TargetZ", *xco+60, *yco-42, 50, 18, &data->flags, 0, 1, 0, 0, "Target Z axis, not world Z axis, will constrain up direction");
uiBlockEndAlign(block);
-
+
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "To:", *xco+12, *yco-64, 25, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+39, *yco-64,17,18, &data->reserved1, 12.0, 0.0, 0, 0, "X axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+56, *yco-64,17,18, &data->reserved1, 12.0, 1.0, 0, 0, "Y axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+73, *yco-64,17,18, &data->reserved1, 12.0, 2.0, 0, 0, "Z axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-X", *xco+90, *yco-64,24,18, &data->reserved1, 12.0, 3.0, 0, 0, "-X axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Y", *xco+114, *yco-64,24,18, &data->reserved1, 12.0, 4.0, 0, 0, "-Y axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Z", *xco+138, *yco-64,24,18, &data->reserved1, 12.0, 5.0, 0, 0, "-Z axis points to the target object");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "To:", *xco+12, *yco-64, 25, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+39, *yco-64,17,18, &data->reserved1, 12.0, 0.0, 0, 0, "X axis points to the target object");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+56, *yco-64,17,18, &data->reserved1, 12.0, 1.0, 0, 0, "Y axis points to the target object");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+73, *yco-64,17,18, &data->reserved1, 12.0, 2.0, 0, 0, "Z axis points to the target object");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-X", *xco+90, *yco-64,24,18, &data->reserved1, 12.0, 3.0, 0, 0, "-X axis points to the target object");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Y", *xco+114, *yco-64,24,18, &data->reserved1, 12.0, 4.0, 0, 0, "-Y axis points to the target object");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Z", *xco+138, *yco-64,24,18, &data->reserved1, 12.0, 5.0, 0, 0, "-Z axis points to the target object");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Up:", *xco+174, *yco-64, 30, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+204, *yco-64,17,18, &data->reserved2, 13.0, 0.0, 0, 0, "X axis points upward");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+221, *yco-64,17,18, &data->reserved2, 13.0, 1.0, 0, 0, "Y axis points upward");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+238, *yco-64,17,18, &data->reserved2, 13.0, 2.0, 0, 0, "Z axis points upward");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Up:", *xco+174, *yco-64, 30, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+204, *yco-64,17,18, &data->reserved2, 13.0, 0.0, 0, 0, "X axis points upward");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+221, *yco-64,17,18, &data->reserved2, 13.0, 1.0, 0, 0, "Y axis points upward");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+238, *yco-64,17,18, &data->reserved2, 13.0, 2.0, 0, 0, "Z axis points upward");
uiBlockEndAlign(block);
+
+ if (is_armature_target(data->tar)) {
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Head/Tail:", *xco, *yco-94, 241, 18, &con->headtail, 0.0, 1, 0.1, 0.1, "Target along length of bone: Head=0, Tail=1");
+
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-116, is_armature_owner(ob), is_armature_target(data->tar));
+ }
+ else {
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-94, is_armature_owner(ob), is_armature_target(data->tar));
+ }
}
break;
case CONSTRAINT_TYPE_MINMAX:
{
bMinMaxConstraint *data = con->data;
-
- height = 66;
+
+ if (is_armature_target(data->tar))
+ height = 88;
+ else
+ height = 66;
+
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Offset:", *xco, *yco-44, 100, 18, &data->offset, -100, 100, 100.0, 0.0, "Offset from the position of the object center");
-
+
/* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
-
- if (is_armature_target) {
- but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
- }
- else {
- strcpy (data->subtarget, "");
- }
-
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
+
+ if (is_armature_target(data->tar)) {
+ but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
uiBlockEndAlign(block);
-
- but=uiDefButI(block, TOG|BIT|0, B_CONSTRAINT_TEST, "Sticky", *xco, *yco-24, 44, 18, &data->flag, 0, 24, 0, 0, "Immobilize object while constrained");
- but=uiDefButI(block, TOG|BIT|2, B_CONSTRAINT_TEST, "Use Rot", *xco+44, *yco-24, 64, 18, &data->flag, 0, 24, 0, 0, "Use target object rotation");
+
+ uiDefButBitI(block, TOG, 0, B_CONSTRAINT_TEST, "Sticky", *xco, *yco-24, 44, 18, &data->flag, 0, 24, 0, 0, "Immobilize object while constrained");
+ uiDefButBitI(block, TOG, 2, B_CONSTRAINT_TEST, "Use Rot", *xco+44, *yco-24, 64, 18, &data->flag, 0, 24, 0, 0, "Use target object rotation");
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Max/Min:", *xco-8, *yco-64, 54, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
uiBlockBeginAlign(block);
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+51, *yco-64,17,18, &data->minmaxflag, 12.0, 0.0, 0, 0, "Will not pass below X of target");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+67, *yco-64,17,18, &data->minmaxflag, 12.0, 1.0, 0, 0, "Will not pass below Y of target");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+85, *yco-64,17,18, &data->minmaxflag, 12.0, 2.0, 0, 0, "Will not pass below Z of target");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-X", *xco+102, *yco-64,24,18, &data->minmaxflag, 12.0, 3.0, 0, 0, "Will not pass above X of target");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Y", *xco+126, *yco-64,24,18, &data->minmaxflag, 12.0, 4.0, 0, 0, "Will not pass above Y of target");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Z", *xco+150, *yco-64,24,18, &data->minmaxflag, 12.0, 5.0, 0, 0, "Will not pass above Z of target");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"X", *xco+51, *yco-64,17,18, &data->minmaxflag, 12.0, 0.0, 0, 0, "Will not pass below X of target");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Y", *xco+67, *yco-64,17,18, &data->minmaxflag, 12.0, 1.0, 0, 0, "Will not pass below Y of target");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Z", *xco+85, *yco-64,17,18, &data->minmaxflag, 12.0, 2.0, 0, 0, "Will not pass below Z of target");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"-X", *xco+102, *yco-64,24,18, &data->minmaxflag, 12.0, 3.0, 0, 0, "Will not pass above X of target");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"-Y", *xco+126, *yco-64,24,18, &data->minmaxflag, 12.0, 4.0, 0, 0, "Will not pass above Y of target");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"-Z", *xco+150, *yco-64,24,18, &data->minmaxflag, 12.0, 5.0, 0, 0, "Will not pass above Z of target");
uiBlockEndAlign(block);
+
+ if (is_armature_target(data->tar)) {
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Head/Tail:", *xco, *yco-86, 241, 18, &con->headtail, 0.0, 1, 0.1, 0.1, "Target along length of bone: Head=0, Tail=1");
+ }
+
}
break;
case CONSTRAINT_TYPE_LOCKTRACK:
@@ -880,78 +1104,81 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
bLockTrackConstraint *data = con->data;
height = 66;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
-
+
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
/* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
-
- if (is_armature_target) {
- but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
- }
- else {
- strcpy (data->subtarget, "");
- }
-
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
+
+ if (is_armature_target(data->tar)) {
+ but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "To:", *xco+12, *yco-64, 25, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+39, *yco-64,17,18, &data->trackflag, 12.0, 0.0, 0, 0, "X axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+56, *yco-64,17,18, &data->trackflag, 12.0, 1.0, 0, 0, "Y axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+73, *yco-64,17,18, &data->trackflag, 12.0, 2.0, 0, 0, "Z axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-X", *xco+90, *yco-64,24,18, &data->trackflag, 12.0, 3.0, 0, 0, "-X axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Y", *xco+114, *yco-64,24,18, &data->trackflag, 12.0, 4.0, 0, 0, "-Y axis points to the target object");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Z", *xco+138, *yco-64,24,18, &data->trackflag, 12.0, 5.0, 0, 0, "-Z axis points to the target object");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "To:", *xco+12, *yco-64, 25, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"X", *xco+39, *yco-64,17,18, &data->trackflag, 12.0, 0.0, 0, 0, "X axis points to the target object");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Y", *xco+56, *yco-64,17,18, &data->trackflag, 12.0, 1.0, 0, 0, "Y axis points to the target object");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Z", *xco+73, *yco-64,17,18, &data->trackflag, 12.0, 2.0, 0, 0, "Z axis points to the target object");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"-X", *xco+90, *yco-64,24,18, &data->trackflag, 12.0, 3.0, 0, 0, "-X axis points to the target object");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"-Y", *xco+114, *yco-64,24,18, &data->trackflag, 12.0, 4.0, 0, 0, "-Y axis points to the target object");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"-Z", *xco+138, *yco-64,24,18, &data->trackflag, 12.0, 5.0, 0, 0, "-Z axis points to the target object");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Lock:", *xco+166, *yco-64, 38, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+204, *yco-64,17,18, &data->lockflag, 13.0, 0.0, 0, 0, "X axis is locked");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+221, *yco-64,17,18, &data->lockflag, 13.0, 1.0, 0, 0, "Y axis is locked");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+238, *yco-64,17,18, &data->lockflag, 13.0, 2.0, 0, 0, "Z axis is locked");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Lock:", *xco+166, *yco-64, 38, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"X", *xco+204, *yco-64,17,18, &data->lockflag, 13.0, 0.0, 0, 0, "X axis is locked");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Y", *xco+221, *yco-64,17,18, &data->lockflag, 13.0, 1.0, 0, 0, "Y axis is locked");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Z", *xco+238, *yco-64,17,18, &data->lockflag, 13.0, 2.0, 0, 0, "Z axis is locked");
uiBlockEndAlign(block);
}
break;
case CONSTRAINT_TYPE_FOLLOWPATH:
{
bFollowPathConstraint *data = con->data;
-
+
height = 66;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
/* Draw target parameters */
uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
/* Draw Curve Follow toggle */
- but=uiDefButBitI(block, TOG, 1, B_CONSTRAINT_TEST, "CurveFollow", *xco+39, *yco-44, 100, 18, &data->followflag, 0, 24, 0, 0, "Object will follow the heading and banking of the curve");
-
+ uiDefButBitI(block, TOG, 1, B_CONSTRAINT_TEST, "CurveFollow", *xco+39, *yco-44, 100, 18, &data->followflag, 0, 24, 0, 0, "Object will follow the heading and banking of the curve");
+
/* Draw Offset number button */
uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Offset:", *xco+155, *yco-44, 100, 18, &data->offset, -MAXFRAMEF, MAXFRAMEF, 100.0, 0.0, "Offset from the position corresponding to the time frame");
-
+
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Fw:", *xco+12, *yco-64, 27, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+39, *yco-64,17,18, &data->trackflag, 12.0, 0.0, 0, 0, "The axis that points forward along the path");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+56, *yco-64,17,18, &data->trackflag, 12.0, 1.0, 0, 0, "The axis that points forward along the path");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+73, *yco-64,17,18, &data->trackflag, 12.0, 2.0, 0, 0, "The axis that points forward along the path");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-X", *xco+90, *yco-64,24,18, &data->trackflag, 12.0, 3.0, 0, 0, "The axis that points forward along the path");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Y", *xco+114, *yco-64,24,18, &data->trackflag, 12.0, 4.0, 0, 0, "The axis that points forward along the path");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"-Z", *xco+138, *yco-64,24,18, &data->trackflag, 12.0, 5.0, 0, 0, "The axis that points forward along the path");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Fw:", *xco+12, *yco-64, 27, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"X", *xco+39, *yco-64,17,18, &data->trackflag, 12.0, 0.0, 0, 0, "The axis that points forward along the path");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Y", *xco+56, *yco-64,17,18, &data->trackflag, 12.0, 1.0, 0, 0, "The axis that points forward along the path");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Z", *xco+73, *yco-64,17,18, &data->trackflag, 12.0, 2.0, 0, 0, "The axis that points forward along the path");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"-X", *xco+90, *yco-64,24,18, &data->trackflag, 12.0, 3.0, 0, 0, "The axis that points forward along the path");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"-Y", *xco+114, *yco-64,24,18, &data->trackflag, 12.0, 4.0, 0, 0, "The axis that points forward along the path");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"-Z", *xco+138, *yco-64,24,18, &data->trackflag, 12.0, 5.0, 0, 0, "The axis that points forward along the path");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Up:", *xco+174, *yco-64, 30, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+204, *yco-64,17,18, &data->upflag, 13.0, 0.0, 0, 0, "The axis that points upward");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Y", *xco+221, *yco-64,17,18, &data->upflag, 13.0, 1.0, 0, 0, "The axis that points upward");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+238, *yco-64,17,18, &data->upflag, 13.0, 2.0, 0, 0, "The axis that points upward");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Up:", *xco+174, *yco-64, 30, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"X", *xco+204, *yco-64,17,18, &data->upflag, 13.0, 0.0, 0, 0, "The axis that points upward");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Y", *xco+221, *yco-64,17,18, &data->upflag, 13.0, 1.0, 0, 0, "The axis that points upward");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST,"Z", *xco+238, *yco-64,17,18, &data->upflag, 13.0, 2.0, 0, 0, "The axis that points upward");
uiBlockEndAlign(block);
}
break;
@@ -963,42 +1190,50 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
/* Draw target parameters */
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
-
- if (is_armature_target) {
- but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
- uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
- }
- else {
- strcpy (data->subtarget, "");
- }
-
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
+
+ if (is_armature_target(data->tar)) {
+ but=uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
uiBlockEndAlign(block);
-
uiBlockBeginAlign(block);
- uiDefButF(block,BUTM,B_CONSTRAINT_TEST,"R",*xco, *yco-60,20,18,&(data->orglength),0.0,0,0,0,"Recalculate RLength");
- uiDefButF(block,NUM,B_CONSTRAINT_TEST,"Rest Length:",*xco+18, *yco-60,237,18,&(data->orglength),0.0,100,0.5,0.5,"Length at Rest Position");
+ if (is_armature_target(data->tar)) {
+ uiDefButF(block, BUTM, B_CONSTRAINT_TEST, "R", *xco, *yco-60, 20, 18, &data->orglength, 0.0, 0, 0, 0, "Recalculate RLength");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Rest Length:", *xco+18, *yco-60,139,18, &data->orglength, 0.0, 100, 0.5, 0.5, "Length at Rest Position");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Head/Tail:", *xco+155, *yco-60,97,18, &con->headtail, 0.0, 1, 0.1, 0.1, "Target along length of bone: Head=0, Tail=1");
+ }
+ else {
+ uiDefButF(block, BUTM, B_CONSTRAINT_TEST, "R", *xco, *yco-60, 20, 18, &data->orglength, 0.0, 0, 0, 0, "Recalculate RLength");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Rest Length:", *xco+18, *yco-60, 237, 18, &data->orglength, 0.0, 100, 0.5, 0.5, "Length at Rest Position");
+ }
uiBlockEndAlign(block);
-
- uiDefButF(block,NUM,B_CONSTRAINT_TEST,"Volume Variation:",*xco+18, *yco-82,237,18,&(data->bulge),0.0,100,0.5,0.5,"Factor between volume variation and stretching");
-
+
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Volume Variation:", *xco+18, *yco-82, 237, 18, &data->bulge, 0.0, 100, 0.5, 0.5, "Factor between volume variation and stretching");
+
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Vol:",*xco+14, *yco-104,30,18, NULL, 0.0, 0.0, 0.0, 0.0, "");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"XZ", *xco+44, *yco-104,30,18, &data->volmode, 12.0, 0.0, 0, 0, "Keep Volume: Scaling X & Z");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+74, *yco-104,20,18, &data->volmode, 12.0, 1.0, 0, 0, "Keep Volume: Scaling X");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+94, *yco-104,20,18, &data->volmode, 12.0, 2.0, 0, 0, "Keep Volume: Scaling Z");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"NONE", *xco+114, *yco-104,50,18, &data->volmode, 12.0, 3.0, 0, 0, "Ignore Volume");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Vol:",*xco+14, *yco-104,30,18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"XZ", *xco+44, *yco-104,30,18, &data->volmode, 12.0, 0.0, 0, 0, "Keep Volume: Scaling X & Z");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+74, *yco-104,20,18, &data->volmode, 12.0, 1.0, 0, 0, "Keep Volume: Scaling X");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+94, *yco-104,20,18, &data->volmode, 12.0, 2.0, 0, 0, "Keep Volume: Scaling Z");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"NONE", *xco+114, *yco-104,50,18, &data->volmode, 12.0, 3.0, 0, 0, "Ignore Volume");
uiBlockEndAlign(block);
-
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST,"Plane:",*xco+175, *yco-104,40,18, NULL, 0.0, 0.0, 0.0, 0.0, "");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+215, *yco-104,20,18, &data->plane, 12.0, 0.0, 0, 0, "Keep X axis");
- uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+235, *yco-104,20,18, &data->plane, 12.0, 2.0, 0, 0, "Keep Z axis");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST,"Plane:",*xco+175, *yco-104,40,18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"X", *xco+215, *yco-104,20,18, &data->plane, 12.0, 0.0, 0, 0, "Keep X axis");
+ uiDefButI(block, ROW,B_CONSTRAINT_TEST,"Z", *xco+235, *yco-104,20,18, &data->plane, 12.0, 2.0, 0, 0, "Keep Z axis");
uiBlockEndAlign(block);
}
break;
@@ -1014,46 +1249,37 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
/* Draw Pairs of LimitToggle+LimitValue */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_XMIN, B_CONSTRAINT_TEST, "minX", *xco, *yco-28, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-28, (textButWidth-5), 18, &(data->xmin), -1000, 1000, 0.1,0.5,"Lowest x value to allow");
+ uiDefButBitS(block, TOG, LIMIT_XMIN, B_CONSTRAINT_TEST, "minX", *xco, *yco-28, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-28, (textButWidth-5), 18, &(data->xmin), -1000, 1000, 0.1,0.5,"Lowest x value to allow");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_XMAX, B_CONSTRAINT_TEST, "maxX", *xco+(width-(textButWidth-5)-togButWidth), *yco-28, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum x value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-28, (textButWidth-5), 18, &(data->xmax), -1000, 1000, 0.1,0.5,"Highest x value to allow");
+ uiDefButBitS(block, TOG, LIMIT_XMAX, B_CONSTRAINT_TEST, "maxX", *xco+(width-(textButWidth-5)-togButWidth), *yco-28, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum x value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-28, (textButWidth-5), 18, &(data->xmax), -1000, 1000, 0.1,0.5,"Highest x value to allow");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_YMIN, B_CONSTRAINT_TEST, "minY", *xco, *yco-50, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-50, (textButWidth-5), 18, &(data->ymin), -1000, 1000, 0.1,0.5,"Lowest y value to allow");
+ uiDefButBitS(block, TOG, LIMIT_YMIN, B_CONSTRAINT_TEST, "minY", *xco, *yco-50, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-50, (textButWidth-5), 18, &(data->ymin), -1000, 1000, 0.1,0.5,"Lowest y value to allow");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_YMAX, B_CONSTRAINT_TEST, "maxY", *xco+(width-(textButWidth-5)-togButWidth), *yco-50, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum y value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-50, (textButWidth-5), 18, &(data->ymax), -1000, 1000, 0.1,0.5,"Highest y value to allow");
+ uiDefButBitS(block, TOG, LIMIT_YMAX, B_CONSTRAINT_TEST, "maxY", *xco+(width-(textButWidth-5)-togButWidth), *yco-50, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum y value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-50, (textButWidth-5), 18, &(data->ymax), -1000, 1000, 0.1,0.5,"Highest y value to allow");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_ZMIN, B_CONSTRAINT_TEST, "minZ", *xco, *yco-72, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-72, (textButWidth-5), 18, &(data->zmin), -1000, 1000, 0.1,0.5,"Lowest z value to allow");
+ uiDefButBitS(block, TOG, LIMIT_ZMIN, B_CONSTRAINT_TEST, "minZ", *xco, *yco-72, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-72, (textButWidth-5), 18, &(data->zmin), -1000, 1000, 0.1,0.5,"Lowest z value to allow");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_ZMAX, B_CONSTRAINT_TEST, "maxZ", *xco+(width-(textButWidth-5)-togButWidth), *yco-72, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum z value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-72, (textButWidth-5), 18, &(data->zmax), -1000, 1000, 0.1,0.5,"Highest z value to allow");
+ uiDefButBitS(block, TOG, LIMIT_ZMAX, B_CONSTRAINT_TEST, "maxZ", *xco+(width-(textButWidth-5)-togButWidth), *yco-72, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum z value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-72, (textButWidth-5), 18, &(data->zmax), -1000, 1000, 0.1,0.5,"Highest z value to allow");
uiBlockEndAlign(block);
- uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST,"Co-ordinate Space:",*xco, *yco-100,150,18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
- if (ob->type == OB_ARMATURE && (ob->flag & OB_POSEMODE))
- uiDefButBitS(block, TOG, CONSTRAINT_LOCAL, B_CONSTRAINT_TEST, "Local", *xco+160, *yco-100, 60, 18, &con->flag, 0, 24, 0, 0, "Limit locations relative to the bone's rest-position");
- else if (ob->parent != NULL)
- uiDefButBitS(block, TOG, LIMIT_NOPARENT, B_CONSTRAINT_TEST, "Local", *xco+160, *yco-100, 60, 18, &data->flag2, 0, 24, 0, 0, "Limit locations relative to parent, not origin/world");
- else
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST,"World",*xco+160, *yco-100,60,18, NULL, 0.0, 0.0, 0.0, 0.0, "Limit locations relative to origin/world");
-
- uiBlockEndAlign(block);
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-100, is_armature_owner(ob), -1);
}
break;
case CONSTRAINT_TYPE_ROTLIMIT:
@@ -1061,38 +1287,31 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
bRotLimitConstraint *data = con->data;
int normButWidth = (width/3);
- if (ob->type == OB_ARMATURE && (ob->flag & OB_POSEMODE))
- height = 106;
- else
- height = 78;
+ height = 106;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
/* Draw Pairs of LimitToggle+LimitValue */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_XROT, B_CONSTRAINT_TEST, "LimitX", *xco, *yco-28, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Limit rotation on x-axis");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min:", *xco+normButWidth, *yco-28, normButWidth, 18, &(data->xmin), -360, 360, 0.1,0.5,"Lowest x value to allow");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max:", *xco+(normButWidth * 2), *yco-28, normButWidth, 18, &(data->xmax), -360, 360, 0.1,0.5,"Highest x value to allow");
+ uiDefButBitS(block, TOG, LIMIT_XROT, B_CONSTRAINT_TEST, "LimitX", *xco, *yco-28, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Limit rotation on x-axis");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min:", *xco+normButWidth, *yco-28, normButWidth, 18, &(data->xmin), -360, 360, 0.1,0.5,"Lowest x value to allow");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max:", *xco+(normButWidth * 2), *yco-28, normButWidth, 18, &(data->xmax), -360, 360, 0.1,0.5,"Highest x value to allow");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_YROT, B_CONSTRAINT_TEST, "LimitY", *xco, *yco-50, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Limit rotation on y-axis");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min:", *xco+normButWidth, *yco-50, normButWidth, 18, &(data->ymin), -360, 360, 0.1,0.5,"Lowest y value to allow");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max:", *xco+(normButWidth * 2), *yco-50, normButWidth, 18, &(data->ymax), -360, 360, 0.1,0.5,"Highest y value to allow");
+ uiDefButBitS(block, TOG, LIMIT_YROT, B_CONSTRAINT_TEST, "LimitY", *xco, *yco-50, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Limit rotation on y-axis");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min:", *xco+normButWidth, *yco-50, normButWidth, 18, &(data->ymin), -360, 360, 0.1,0.5,"Lowest y value to allow");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max:", *xco+(normButWidth * 2), *yco-50, normButWidth, 18, &(data->ymax), -360, 360, 0.1,0.5,"Highest y value to allow");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_ZROT, B_CONSTRAINT_TEST, "LimitZ", *xco, *yco-72, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Limit rotation on z-axis");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min:", *xco+normButWidth, *yco-72, normButWidth, 18, &(data->zmin), -360, 360, 0.1,0.5,"Lowest z value to allow");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max:", *xco+(normButWidth * 2), *yco-72, normButWidth, 18, &(data->zmax), -360, 360, 0.1,0.5,"Highest z value to allow");
+ uiDefButBitS(block, TOG, LIMIT_ZROT, B_CONSTRAINT_TEST, "LimitZ", *xco, *yco-72, normButWidth, 18, &data->flag, 0, 24, 0, 0, "Limit rotation on z-axis");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min:", *xco+normButWidth, *yco-72, normButWidth, 18, &(data->zmin), -360, 360, 0.1,0.5,"Lowest z value to allow");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max:", *xco+(normButWidth * 2), *yco-72, normButWidth, 18, &(data->zmax), -360, 360, 0.1,0.5,"Highest z value to allow");
uiBlockEndAlign(block);
- if (ob->type == OB_ARMATURE && (ob->flag & OB_POSEMODE)) {
- uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST,"Co-ordinate Space:",*xco, *yco-100,150,18, NULL, 0.0, 0.0, 0.0, 0.0, "");
- uiDefButBitS(block, TOG, CONSTRAINT_LOCAL, B_CONSTRAINT_TEST, "Local", *xco+160, *yco-100, 60, 18, &con->flag, 0, 24, 0, 0, "Work on a Pose's local transform");
- uiBlockEndAlign(block);
- }
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-100, is_armature_owner(ob), -1);
}
break;
case CONSTRAINT_TYPE_SIZELIMIT:
@@ -1102,52 +1321,45 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
int togButWidth = 50;
int textButWidth = ((width/2)-togButWidth);
- if (ob->type == OB_ARMATURE && (ob->flag & OB_POSEMODE))
- height = 106;
- else
- height = 78;
+ height = 106;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
/* Draw Pairs of LimitToggle+LimitValue */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_XMIN, B_CONSTRAINT_TEST, "minX", *xco, *yco-28, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-28, (textButWidth-5), 18, &(data->xmin), 0.0001, 1000, 0.1,0.5,"Lowest x value to allow");
+ uiDefButBitS(block, TOG, LIMIT_XMIN, B_CONSTRAINT_TEST, "minX", *xco, *yco-28, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-28, (textButWidth-5), 18, &(data->xmin), 0.0001, 1000, 0.1,0.5,"Lowest x value to allow");
uiBlockEndAlign(block);
-
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_XMAX, B_CONSTRAINT_TEST, "maxX", *xco+(width-(textButWidth-5)-togButWidth), *yco-28, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum x value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-28, (textButWidth-5), 18, &(data->xmax), 0.0001, 1000, 0.1,0.5,"Highest x value to allow");
+ uiDefButBitS(block, TOG, LIMIT_XMAX, B_CONSTRAINT_TEST, "maxX", *xco+(width-(textButWidth-5)-togButWidth), *yco-28, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum x value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-28, (textButWidth-5), 18, &(data->xmax), 0.0001, 1000, 0.1,0.5,"Highest x value to allow");
uiBlockEndAlign(block);
-
-
+
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_YMIN, B_CONSTRAINT_TEST, "minY", *xco, *yco-50, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-50, (textButWidth-5), 18, &(data->ymin), 0.0001, 1000, 0.1,0.5,"Lowest y value to allow");
+ uiDefButBitS(block, TOG, LIMIT_YMIN, B_CONSTRAINT_TEST, "minY", *xco, *yco-50, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-50, (textButWidth-5), 18, &(data->ymin), 0.0001, 1000, 0.1,0.5,"Lowest y value to allow");
uiBlockEndAlign(block);
-
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_YMAX, B_CONSTRAINT_TEST, "maxY", *xco+(width-(textButWidth-5)-togButWidth), *yco-50, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum y value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-50, (textButWidth-5), 18, &(data->ymax), 0.0001, 1000, 0.1,0.5,"Highest y value to allow");
+ uiDefButBitS(block, TOG, LIMIT_YMAX, B_CONSTRAINT_TEST, "maxY", *xco+(width-(textButWidth-5)-togButWidth), *yco-50, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum y value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-50, (textButWidth-5), 18, &(data->ymax), 0.0001, 1000, 0.1,0.5,"Highest y value to allow");
uiBlockEndAlign(block);
-
-
+
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_ZMIN, B_CONSTRAINT_TEST, "minZ", *xco, *yco-72, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-72, (textButWidth-5), 18, &(data->zmin), 0.0001, 1000, 0.1,0.5,"Lowest z value to allow");
+ uiDefButBitS(block, TOG, LIMIT_ZMIN, B_CONSTRAINT_TEST, "minZ", *xco, *yco-72, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-72, (textButWidth-5), 18, &(data->zmin), 0.0001, 1000, 0.1,0.5,"Lowest z value to allow");
uiBlockEndAlign(block);
-
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LIMIT_ZMAX, B_CONSTRAINT_TEST, "maxZ", *xco+(width-(textButWidth-5)-togButWidth), *yco-72, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum z value");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-72, (textButWidth-5), 18, &(data->zmax), 0.0001, 1000, 0.1,0.5,"Highest z value to allow");
+ uiDefButBitS(block, TOG, LIMIT_ZMAX, B_CONSTRAINT_TEST, "maxZ", *xco+(width-(textButWidth-5)-togButWidth), *yco-72, 50, 18, &data->flag, 0, 24, 0, 0, "Use maximum z value");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-72, (textButWidth-5), 18, &(data->zmax), 0.0001, 1000, 0.1,0.5,"Highest z value to allow");
uiBlockEndAlign(block);
- if (ob->type == OB_ARMATURE && (ob->flag & OB_POSEMODE)) {
- uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST,"Co-ordinate Space:",*xco, *yco-100,150,18, NULL, 0.0, 0.0, 0.0, 0.0, "");
- uiDefButBitS(block, TOG, CONSTRAINT_LOCAL, B_CONSTRAINT_TEST, "Local", *xco+160, *yco-100, 60, 18, &con->flag, 0, 24, 0, 0, "Work on a Pose's local transform");
- uiBlockEndAlign(block);
- }
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-100, is_armature_owner(ob), -1);
}
break;
case CONSTRAINT_TYPE_RIGIDBODYJOINT:
@@ -1160,18 +1372,20 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
int togButWidth = 70;
int offsetY = 150;
int textButWidth = ((width/2)-togButWidth);
-
- uiDefButI(block, MENU, B_CONSTRAINT_TEST, "Joint Types%t|Ball%x1|Hinge%x2|Generic (experimental)%x12",//|Extra Force%x6",
+
+ uiDefButI(block, MENU, B_CONSTRAINT_TEST, "Joint Types%t|Ball%x1|Hinge%x2|Cone Twist%x4|Generic (experimental)%x12",//|Extra Force%x6",
*xco, *yco-25, 150, 18, &data->type, 0, 0, 0, 0, "Choose the joint type");
height = 140;
if (data->type==CONSTRAINT_RB_GENERIC6DOF)
height = 270;
+ if (data->type==CONSTRAINT_RB_CONETWIST)
+ height = 200;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
-
+
uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "toObject:", *xco, *yco-50, 130, 18, &data->tar, "Child Object");
uiDefButBitS(block, TOG, CONSTRAINT_DRAW_PIVOT, B_CONSTRAINT_TEST, "ShowPivot", *xco+135, *yco-50, 130, 18, &data->flag, 0, 24, 0, 0, "Show pivot position and rotation");
-
+
uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Pivot X:", *xco, *yco-75, 130, 18, &data->pivX, -1000, 1000, 100, 0.0, "Offset pivot on X");
uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Pivot Y:", *xco, *yco-100, 130, 18, &data->pivY, -1000, 1000, 100, 0.0, "Offset pivot on Y");
uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Pivot Z:", *xco, *yco-125, 130, 18, &data->pivZ, -1000, 1000, 100, 0.0, "Offset pivot on z");
@@ -1180,60 +1394,72 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Ax Y:", *xco+135, *yco-100, 130, 18, &data->axY, -360, 360, 1500, 0.0, "Rotate pivot on Y Axis (in degrees)");
uiDefButF(block, NUM, B_CONSTRAINT_TEST, "Ax Z:", *xco+135, *yco-125, 130, 18, &data->axZ, -360, 360, 1500, 0.0, "Rotate pivot on Z Axis (in degrees)");
- if (data->type==CONSTRAINT_RB_GENERIC6DOF){
+ if (data->type==CONSTRAINT_RB_GENERIC6DOF) {
/* Draw Pairs of LimitToggle+LimitValue */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 1, B_CONSTRAINT_TEST, "LinMinX", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[0]), -extremeLin, extremeLin, 0.1,0.5,"min x limit");
-
+ uiDefButBitS(block, TOG, 1, B_CONSTRAINT_TEST, "LinMinX", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[0]), -extremeLin, extremeLin, 0.1,0.5,"min x limit");
+ uiBlockEndAlign(block);
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 1, B_CONSTRAINT_TEST, "LinMaxX", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum x limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[0]), -extremeLin, extremeLin, 0.1,0.5,"max x limit");
-
+ uiDefButBitS(block, TOG, 1, B_CONSTRAINT_TEST, "LinMaxX", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum x limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[0]), -extremeLin, extremeLin, 0.1,0.5,"max x limit");
+ uiBlockEndAlign(block);
+
offsetY += 20;
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 2, B_CONSTRAINT_TEST, "LinMinY", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[1]), -extremeLin, extremeLin, 0.1,0.5,"min y limit");
-
+ uiDefButBitS(block, TOG, 2, B_CONSTRAINT_TEST, "LinMinY", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[1]), -extremeLin, extremeLin, 0.1,0.5,"min y limit");
+ uiBlockEndAlign(block);
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 2, B_CONSTRAINT_TEST, "LinMaxY", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum y limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[1]), -extremeLin, extremeLin, 0.1,0.5,"max y limit");
-
+ uiDefButBitS(block, TOG, 2, B_CONSTRAINT_TEST, "LinMaxY", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum y limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[1]), -extremeLin, extremeLin, 0.1,0.5,"max y limit");
+ uiBlockEndAlign(block);
+
offsetY += 20;
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 4, B_CONSTRAINT_TEST, "LinMinZ", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[2]), -extremeLin, extremeLin, 0.1,0.5,"min z limit");
-
+ uiDefButBitS(block, TOG, 4, B_CONSTRAINT_TEST, "LinMinZ", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[2]), -extremeLin, extremeLin, 0.1,0.5,"min z limit");
+ uiBlockEndAlign(block);
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 4, B_CONSTRAINT_TEST, "LinMaxZ", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum z limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[2]), -extremeLin, extremeLin, 0.1,0.5,"max z limit");
+ uiDefButBitS(block, TOG, 4, B_CONSTRAINT_TEST, "LinMaxZ", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum z limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[2]), -extremeLin, extremeLin, 0.1,0.5,"max z limit");
+ uiBlockEndAlign(block);
offsetY += 20;
-
+ }
+ if ((data->type==CONSTRAINT_RB_GENERIC6DOF) || (data->type==CONSTRAINT_RB_CONETWIST)) {
/* Draw Pairs of LimitToggle+LimitValue */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 8, B_CONSTRAINT_TEST, "AngMinX", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[3]), -extremeAngX, extremeAngX, 0.1,0.5,"min x limit");
+ uiDefButBitS(block, TOG, 8, B_CONSTRAINT_TEST, "AngMinX", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum x limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[3]), -extremeAngX, extremeAngX, 0.1,0.5,"min x limit");
+ uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 8, B_CONSTRAINT_TEST, "AngMaxX", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum x limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[3]), -extremeAngX, extremeAngX, 0.1,0.5,"max x limit");
-
+ uiDefButBitS(block, TOG, 8, B_CONSTRAINT_TEST, "AngMaxX", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum x limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[3]), -extremeAngX, extremeAngX, 0.1,0.5,"max x limit");
+ uiBlockEndAlign(block);
+
offsetY += 20;
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 16, B_CONSTRAINT_TEST, "AngMinY", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[4]), -extremeAngY, extremeAngY, 0.1,0.5,"min y limit");
-
+ uiDefButBitS(block, TOG, 16, B_CONSTRAINT_TEST, "AngMinY", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum y limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[4]), -extremeAngY, extremeAngY, 0.1,0.5,"min y limit");
+ uiBlockEndAlign(block);
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 16, B_CONSTRAINT_TEST, "AngMaxY", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum y limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[4]), -extremeAngY, extremeAngY, 0.1,0.5,"max y limit");
-
+ uiDefButBitS(block, TOG, 16, B_CONSTRAINT_TEST, "AngMaxY", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum y limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[4]), -extremeAngY, extremeAngY, 0.1,0.5,"max y limit");
+ uiBlockEndAlign(block);
+
offsetY += 20;
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 32, B_CONSTRAINT_TEST, "AngMinZ", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[5]), -extremeAngZ, extremeAngZ, 0.1,0.5,"min z limit");
-
+ uiDefButBitS(block, TOG, 32, B_CONSTRAINT_TEST, "AngMinZ", *xco, *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use minimum z limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+togButWidth, *yco-offsetY, (textButWidth-5), 18, &(data->minLimit[5]), -extremeAngZ, extremeAngZ, 0.1,0.5,"min z limit");
+ uiBlockEndAlign(block);
+
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, 32, B_CONSTRAINT_TEST, "AngMaxZ", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum z limit");
- uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[5]), -extremeAngZ, extremeAngZ, 0.1,0.5,"max z limit");
+ uiDefButBitS(block, TOG, 32, B_CONSTRAINT_TEST, "AngMaxZ", *xco+(width-(textButWidth-5)-togButWidth), *yco-offsetY, togButWidth, 18, &data->flag, 0, 24, 0, 0, "Use maximum z limit");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[5]), -extremeAngZ, extremeAngZ, 0.1,0.5,"max z limit");
uiBlockEndAlign(block);
}
}
@@ -1242,40 +1468,165 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
{
bClampToConstraint *data = con->data;
- height = 66;
+ height = 90;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
-
+
/* Draw target parameters */
uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object");
/* Draw XYZ toggles */
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Main Axis:", *xco, *yco-64, 90, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
- uiDefButI(block, ROW, B_CONSTRAINT_TEST, "Auto", *xco+100, *yco-64, 50, 18, &data->flag, 12.0, CLAMPTO_AUTO, 0, 0, "Automatically determine main-axis of movement");
- uiDefButI(block, ROW, B_CONSTRAINT_TEST, "X", *xco+150, *yco-64, 32, 18, &data->flag, 12.0, CLAMPTO_X, 0, 0, "Main axis of movement is x-axis");
- uiDefButI(block, ROW, B_CONSTRAINT_TEST, "Y", *xco+182, *yco-64, 32, 18, &data->flag, 12.0, CLAMPTO_Y, 0, 0, "Main axis of movement is y-axis");
- uiDefButI(block, ROW, B_CONSTRAINT_TEST, "Z", *xco+214, *yco-64, 32, 18, &data->flag, 12.0, CLAMPTO_Z, 0, 0, "Main axis of movement is z-axis");
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Main Axis:", *xco, *yco-64, 90, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST, "Auto", *xco+100, *yco-64, 50, 18, &data->flag, 12.0, CLAMPTO_AUTO, 0, 0, "Automatically determine main-axis of movement");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST, "X", *xco+150, *yco-64, 32, 18, &data->flag, 12.0, CLAMPTO_X, 0, 0, "Main axis of movement is x-axis");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST, "Y", *xco+182, *yco-64, 32, 18, &data->flag, 12.0, CLAMPTO_Y, 0, 0, "Main axis of movement is y-axis");
+ uiDefButI(block, ROW, B_CONSTRAINT_TEST, "Z", *xco+214, *yco-64, 32, 18, &data->flag, 12.0, CLAMPTO_Z, 0, 0, "Main axis of movement is z-axis");
+ uiBlockEndAlign(block);
+
+ /* Extra Options Controlling Behaviour */
+ //uiBlockBeginAlign(block);
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Options:", *xco, *yco-88, 90, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiDefButBitI(block, TOG, CLAMPTO_CYCLIC, B_CONSTRAINT_TEST, "Cyclic", *xco+((width/2)), *yco-88,60,19, &data->flag2, 0, 0, 0, 0, "Treat curve as cyclic curve (no clamping to curve bounding box)");
+ //uiBlockEndAlign(block);
+ }
+ break;
+ case CONSTRAINT_TYPE_TRANSFORM:
+ {
+ bTransformConstraint *data = con->data;
+ float fmin, fmax, tmin, tmax;
+
+ height = 178;
+ uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
+
+ /* Draw target parameters */
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Target:", *xco+65, *yco-24, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ /* Draw target parameters */
+ uiBlockBeginAlign(block);
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "OB:", *xco+120, *yco-24, 135, 18, &data->tar, "Target Object to use as Parent");
+
+ if (is_armature_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "BO:", *xco+120, *yco-42,135,18, &data->subtarget, 0, 24, 0, 0, "Subtarget Bone to use as Parent");
+ uiButSetCompleteFunc(but, autocomplete_bone, (void *)data->tar);
+ }
+ else if (is_geom_target(data->tar)) {
+ but= uiDefBut(block, TEX, B_CONSTRAINT_CHANGETARGET, "VG:", *xco+120, *yco-66,150,18, &data->subtarget, 0, 24, 0, 0, "Name of Vertex Group defining 'target' points");
+ uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)data->tar);
+ }
+ else {
+ strcpy(data->subtarget, "");
+ }
+ uiBlockEndAlign(block);
+
+ /* Extrapolate Ranges? */
+ uiDefButBitC(block, TOG, 1, B_CONSTRAINT_TEST, "Extrapolate", *xco, *yco-42,80,19, &data->expo, 0, 0, 0, 0, "Extrapolate ranges");
+
+ /* Draw options for source motion */
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Source:", *xco-10, *yco-62, 50, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ /* draw Loc/Rot/Size toggles */
+ uiBlockBeginAlign(block);
+ uiDefButS(block, ROW, B_CONSTRAINT_TEST, "Loc", *xco-5, *yco-82, 45, 18, &data->from, 12.0, 0, 0, 0, "Use Location transform channels from Target");
+ uiDefButS(block, ROW, B_CONSTRAINT_TEST, "Rot", *xco+40, *yco-82, 45, 18, &data->from, 12.0, 1, 0, 0, "Use Rotation transform channels from Target");
+ uiDefButS(block, ROW, B_CONSTRAINT_TEST, "Scale", *xco+85, *yco-82, 45, 18, &data->from, 12.0, 2, 0, 0, "Use Scale transform channels from Target");
+ uiBlockEndAlign(block);
+
+ /* Draw Pairs of Axis: Min/Max Value*/
+ if (data->from == 2) {
+ fmin= 0.0001;
+ fmax= 1000.0;
+ }
+ else if (data->from == 1) {
+ fmin= -360.0;
+ fmax= 360.0;
+ }
+ else {
+ fmin = -1000.0;
+ fmax= 1000.0;
+ }
+
+ uiBlockBeginAlign(block);
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "X:", *xco-10, *yco-107, 30, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min", *xco+20, *yco-107, 55, 18, &data->from_min[0], fmin, fmax, 0, 0, "Bottom of range of x-axis source motion for source->target mapping");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max", *xco+75, *yco-107, 55, 18, &data->from_max[0], fmin, fmax, 0, 0, "Top of range of x-axis source motion for source->target mapping");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Y:", *xco-10, *yco-127, 30, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min", *xco+20, *yco-127, 55, 18, &data->from_min[1], fmin, fmax, 0, 0, "Bottom of range of y-axis source motion for source->target mapping");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max", *xco+75, *yco-127, 55, 18, &data->from_max[1], fmin, fmax, 0, 0, "Top of range of y-axis source motion for source->target mapping");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Z:", *xco-10, *yco-147, 30, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min", *xco+20, *yco-147, 55, 18, &data->from_min[2], fmin, fmax, 0, 0, "Bottom of range of z-axis source motion for source->target mapping");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max", *xco+75, *yco-147, 55, 18, &data->from_max[2], fmin, fmax, 0, 0, "Top of range of z-axis source motion for source->target mapping");
+ uiBlockEndAlign(block);
+
+
+ /* Draw options for target motion */
+ uiDefBut(block, LABEL, B_CONSTRAINT_TEST, "Destination:", *xco+150, *yco-62, 150, 18, NULL, 0.0, 0.0, 0.0, 0.0, "");
+
+ /* draw Loc/Rot/Size toggles */
+ uiBlockBeginAlign(block);
+ uiDefButS(block, ROW, B_CONSTRAINT_TEST, "Loc", *xco+150, *yco-82, 45, 18, &data->to, 12.0, 0, 0, 0, "Use as Location transform");
+ uiDefButS(block, ROW, B_CONSTRAINT_TEST, "Rot", *xco+195, *yco-82, 45, 18, &data->to, 12.0, 1, 0, 0, "Use as Rotation transform");
+ uiDefButS(block, ROW, B_CONSTRAINT_TEST, "Scale", *xco+245, *yco-82, 45, 18, &data->to, 12.0, 2, 0, 0, "Use as Scale transform");
uiBlockEndAlign(block);
+
+ /* Draw Pairs of Source-Axis: Min/Max Value*/
+ if (data->to == 2) {
+ tmin= 0.0001;
+ tmax= 1000.0;
+ }
+ else if (data->to == 1) {
+ tmin= -360.0;
+ tmax= 360.0;
+ }
+ else {
+ tmin = -1000.0;
+ tmax= 1000.0;
+ }
+
+ uiBlockBeginAlign(block);
+ uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Axis Mapping%t|X->X%x0|Y->X%x1|Z->X%x2", *xco+150, *yco-107, 40, 18, &data->map[0], 0, 24, 0, 0, "Specify which source axis the x-axis destination uses");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min", *xco+175, *yco-107, 50, 18, &data->to_min[0], tmin, tmax, 0, 0, "Bottom of range of x-axis destination motion for source->target mapping");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max", *xco+240, *yco-107, 50, 18, &data->to_max[0], tmin, tmax, 0, 0, "Top of range of x-axis destination motion for source->target mapping");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Axis Mapping%t|X->Y%x0|Y->Y%x1|Z->Y%x2", *xco+150, *yco-127, 40, 18, &data->map[1], 0, 24, 0, 0, "Specify which source axis the y-axis destination uses");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min", *xco+175, *yco-127, 50, 18, &data->to_min[1], tmin, tmax, 0, 0, "Bottom of range of y-axis destination motion for source->target mapping");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max", *xco+240, *yco-127, 50, 18, &data->to_max[1], tmin, tmax, 0, 0, "Top of range of y-axis destination motion for source->target mapping");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButC(block, MENU, B_CONSTRAINT_TEST, "Axis Mapping%t|X->Z%x0|Y->Z%x1|Z->Z%x2", *xco+150, *yco-147, 40, 18, &data->map[2], 0, 24, 0, 0, "Specify which source axis the z-axis destination uses");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "min", *xco+175, *yco-147, 50, 18, &data->to_min[2], tmin, tmax, 0, 0, "Bottom of range of z-axis destination motion for source->target mapping");
+ uiDefButF(block, NUM, B_CONSTRAINT_TEST, "max", *xco+240, *yco-147, 50, 18, &data->to_max[2], tmin, tmax, 0, 0, "Top of range of z-axis destination motion for source->target mapping");
+ uiBlockEndAlign(block);
+
+ /* constraint space settings */
+ draw_constraint_spaceselect(block, con, *xco, *yco-170, is_armature_owner(ob), is_armature_target(data->tar));
}
break;
case CONSTRAINT_TYPE_NULL:
{
height = 17;
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
-
}
break;
default:
height = 0;
break;
}
-
+
(*yco)-=(24+height);
}
- if ((con->type != CONSTRAINT_TYPE_NULL) && (con->type!=CONSTRAINT_TYPE_RIGIDBODYJOINT)) {
+ if (ELEM(con->type, CONSTRAINT_TYPE_NULL, CONSTRAINT_TYPE_RIGIDBODYJOINT)==0) {
uiBlockBeginAlign(block);
uiDefButF(block, NUMSLI, B_CONSTRAINT_INF, "Influence ", *xco, *yco, 197, 20, &(con->enforce), 0.0, 1.0, 0.0, 0.0, "Amount of influence this constraint will have on the final solution");
but = uiDefBut(block, BUT, B_CONSTRAINT_TEST, "Show", *xco+200, *yco, 45, 20, 0, 0.0, 1.0, 0.0, 0.0, "Show constraint's ipo in the Ipo window, adds a channel if not there");
@@ -1303,40 +1654,50 @@ static uiBlock *add_constraintmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "add_constraintmenu", UI_EMBOSSP, UI_HELV, curarea->win);
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_LOCLIKE,"Copy Location", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_ROTLIKE,"Copy Rotation", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_SIZELIKE,"Copy Scale", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_CHILDOF, "Child Of", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_TRANSFORM, "Transformation", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_LOCLIMIT,"Limit Location", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_ROTLIMIT,"Limit Rotation", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_SIZELIMIT,"Limit Scale", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_LOCLIKE, "Copy Location", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_ROTLIKE, "Copy Rotation", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_SIZELIKE, "Copy Scale", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_TRACKTO,"Track To", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_MINMAX,"Floor", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_LOCKTRACK,"Locked Track", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_FOLLOWPATH,"Follow Path", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_CLAMPTO,"Clamp To", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_LOCLIMIT, "Limit Location", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_ROTLIMIT, "Limit Rotation", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_SIZELIMIT, "Limit Scale", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_STRETCHTO,"Stretch To", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_TRACKTO, "Track To", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_MINMAX, "Floor", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_LOCKTRACK, "Locked Track", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_FOLLOWPATH, "Follow Path", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_CLAMPTO, "Clamp To", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_STRETCHTO, "Stretch To", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_RIGIDBODYJOINT,"Rigid Body Joint", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");//rcruiz
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_RIGIDBODYJOINT, "Rigid Body Joint", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");//rcruiz
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
+
if (ob->flag & OB_POSEMODE) {
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_KINEMATIC,"IK Solver", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_ACTION,"Action", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
-
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_KINEMATIC, "IK Solver", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
}
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_ACTION, "Action", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+
uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefBut(block, BUTM, B_CONSTRAINT_ADD_NULL,"Null", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_PYTHON, "Script", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, 120, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefBut(block, BUTM, B_CONSTRAINT_ADD_NULL, "Null", 0, yco-=20, 160, 19, NULL, 0.0, 0.0, 1, 0, "");
+
uiTextBoundsBlock(block, 50);
uiBlockSetDirection(block, UI_DOWN);
@@ -1347,173 +1708,195 @@ static uiBlock *add_constraintmenu(void *arg_unused)
void do_constraintbuts(unsigned short event)
{
Object *ob= OBACT;
+ bConstraint *con;
switch(event) {
case B_CONSTRAINT_TEST:
break; // no handling
case B_CONSTRAINT_INF:
/* influence; do not execute actions for 1 dag_flush */
- if(ob->pose)
+ if (ob->pose)
ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
case B_CONSTRAINT_CHANGETARGET:
- if(ob->pose) ob->pose->flag |= POSE_RECALC; // checks & sorts pose channels
+ if (ob->pose) ob->pose->flag |= POSE_RECALC; // checks & sorts pose channels
DAG_scene_sort(G.scene);
break;
-
+
case B_CONSTRAINT_ADD_NULL:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_NULL);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
- case B_CONSTRAINT_ADD_KINEMATIC:
+ case B_CONSTRAINT_ADD_PYTHON:
{
- bConstraint *con;
+ con = add_new_constraint(CONSTRAINT_TYPE_PYTHON);
+ add_constraint_to_active(ob, con);
+ BIF_undo_push("Add constraint");
+ }
+ break;
+ case B_CONSTRAINT_ADD_KINEMATIC:
+ {
con = add_new_constraint(CONSTRAINT_TYPE_KINEMATIC);
add_constraint_to_active(ob, con);
-
+
+ BIF_undo_push("Add constraint");
+ }
+ break;
+ case B_CONSTRAINT_ADD_CHILDOF:
+ {
+ con= add_new_constraint(CONSTRAINT_TYPE_CHILDOF);
+ add_constraint_to_active(ob, con);
+
+ /* if this constraint is being added to a posechannel, make sure
+ * the constraint gets evaluated in pose-space
+ */
+ if (ob->flag & OB_POSEMODE) {
+ con->ownspace = CONSTRAINT_SPACE_POSE;
+ con->flag |= CONSTRAINT_SPACEONCE;
+ }
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_TRACKTO:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_TRACKTO);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_MINMAX:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_MINMAX);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_ROTLIKE:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_ROTLIKE);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_LOCLIKE:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_LOCLIKE);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_SIZELIKE:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_SIZELIKE);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_ACTION:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_ACTION);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_LOCKTRACK:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_FOLLOWPATH:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_FOLLOWPATH);
add_constraint_to_active(ob, con);
-
+
+ BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_STRETCHTO:
{
- bConstraint *con;
con = add_new_constraint(CONSTRAINT_TYPE_STRETCHTO);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_LOCLIMIT:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_LOCLIMIT);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_ROTLIMIT:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_ROTLIMIT);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_SIZELIMIT:
{
- bConstraint *con;
-
con = add_new_constraint(CONSTRAINT_TYPE_SIZELIMIT);
add_constraint_to_active(ob, con);
-
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_RIGIDBODYJOINT:
{
- bConstraint *con;
+ bRigidBodyJointConstraint *data;
+ Base *base_iter;
+
con = add_new_constraint(CONSTRAINT_TYPE_RIGIDBODYJOINT);
add_constraint_to_active(ob, con);
-
+
+ /* set selected first object as target - moved from new_constraint_data */
+ data = (bRigidBodyJointConstraint*)con->data;
+ base_iter = G.scene->base.first;
+ while ( base_iter && !data->tar ) {
+ if( ( ( base_iter->flag & SELECT ) &&
+// ( base_iter->lay & G.vd->lay ) ) &&
+ ( base_iter != G.scene->basact ) ))
+ {
+ data->tar=base_iter->object;
+ break;
+ }
+ base_iter = base_iter->next;
+ }
+
BIF_undo_push("Add constraint");
}
break;
case B_CONSTRAINT_ADD_CLAMPTO:
{
- bConstraint *con;
con = add_new_constraint(CONSTRAINT_TYPE_CLAMPTO);
add_constraint_to_active(ob, con);
-
+
+ BIF_undo_push("Add constraint");
+ }
+ break;
+ case B_CONSTRAINT_ADD_TRANSFORM:
+ {
+ con = add_new_constraint(CONSTRAINT_TYPE_TRANSFORM);
+ add_constraint_to_active(ob, con);
+
BIF_undo_push("Add constraint");
}
break;
@@ -1756,9 +2139,16 @@ void do_object_panels(unsigned short event)
break;
case B_SOFTBODY_CHANGE:
- ob->softflag |= OB_SB_REDO;
- allqueue(REDRAWBUTSOBJECT, 0);
- allqueue(REDRAWVIEW3D, 0);
+ ob= OBACT;
+ if(ob) {
+ ParticleSystem *psys = PE_get_current(ob);
+ if(psys)
+ psys->softflag |= OB_SB_REDO;
+ else
+ ob->softflag |= OB_SB_REDO;
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
break;
case B_SOFTBODY_DEL_VG:
if(ob->soft) {
@@ -1821,6 +2211,14 @@ void do_object_panels(unsigned short event)
group_relink_nla_objects(ob);
allqueue(REDRAWVIEW3D, 0);
break;
+ case B_BAKEABLE_CHANGE:
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ break;
+ case B_OBJECT_IPOFLAG:
+ if(ob->ipo) ob->ipo->showkey= (ob->ipoflag & OB_DRAWKEY)?1:0;
+ allqueue(REDRAWVIEW3D, 0);
+ break;
default:
if(event>=B_SELEFFECT && event<B_SELEFFECT+MAX_EFFECT) {
@@ -2002,7 +2400,7 @@ static void object_panel_anim(Object *ob)
uiDefButS(block, ROW,REDRAWVIEW3D,"Z", 298,180,19,19, &ob->upflag, 13.0, 2.0, 0, 0, "Specify the axis that points up");
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, OB_DRAWKEY, REDRAWVIEW3D, "Draw Key", 24,155,71,19, &ob->ipoflag, 0, 0, 0, 0, "Draw object as key position");
+ uiDefButBitS(block, TOG, OB_DRAWKEY, B_OBJECT_IPOFLAG, "Draw Key", 24,155,71,19, &ob->ipoflag, 0, 0, 0, 0, "Draw object as key position");
uiDefButBitS(block, TOG, OB_DRAWKEYSEL, REDRAWVIEW3D, "Draw Key Sel", 97,155,81,19, &ob->ipoflag, 0, 0, 0, 0, "Limit the drawing of object keys");
uiDefButBitS(block, TOG, OB_POWERTRACK, REDRAWVIEW3D, "Powertrack", 180,155,78,19, &ob->transflag, 0, 0, 0, 0, "Switch objects rotation off");
uiDefButBitS(block, TOG, PARSLOW, 0, "SlowPar", 260,155,56,19, &ob->partype, 0, 0, 0, 0, "Create a delay in the parent relationship");
@@ -2100,7 +2498,6 @@ static void object_panel_draw(Object *ob)
uiDefButBitC(block, TOG, OB_DRAWTRANSP, REDRAWVIEW3D, "Transp", 120, 40, 90, 20, &ob->dtx, 0, 0, 0, 0, "Enables transparent materials for the active object (Mesh only)");
uiDefButBitC(block, TOG, OB_DRAWXRAY, REDRAWVIEW3D, "X-ray", 210, 40, 90, 20, &ob->dtx, 0, 0, 0, 0, "Makes the active object draw in front of others");
-
}
void object_panel_constraint(char *context)
@@ -2121,17 +2518,17 @@ void object_panel_constraint(char *context)
/* so first we make it default height */
uiNewPanelHeight(block, 204);
+ /* do not allow this panel to draw in editmode - why?*/
if(G.obedit==OBACT) return; // ??
conlist = get_active_constraints(OBACT);
if (conlist) {
-
uiDefBlockBut(block, add_constraintmenu, NULL, "Add Constraint", 0, 190, 130, 20, "Add a new constraint");
/* print active object or bone */
str[0]= 0;
- if (ob->flag & OB_POSEMODE){
+ if (ob->flag & OB_POSEMODE) {
bPoseChannel *pchan= get_active_posechannel(ob);
if(pchan) sprintf(str, "To Bone: %s", pchan->name);
}
@@ -2166,9 +2563,17 @@ void do_effects_panels(unsigned short event)
Base *base;
Effect *eff, *effn;
PartEff *paf;
+ ModifierData *md;
+ ParticleSystemModifierData *psmd;
+ ParticleSystem *psys;
+ ParticleSettings *part;
+ ID *id,*idtest;
+ int nr;
ob= OBACT;
+ psys=psys_get_current(ob);
+
switch(event) {
case B_AUTOTIMEOFS:
@@ -2287,6 +2692,232 @@ void do_effects_panels(unsigned short event)
allqueue(REDRAWVIEW3D, 0);
}
break;
+ case B_PARTBROWSE:
+ if(G.buts->menunr== -2) {
+ activate_databrowse((ID *)G.buts->lockpoin, ID_PA, 0, B_PARTBROWSE, &G.buts->menunr, do_effects_panels);
+ return;
+ }
+
+ if(G.buts->menunr < 0) return;
+
+ if(G.buts->pin) {
+
+ }
+ else {
+ psys= psys_get_current(ob);
+ if(psys)
+ part=psys->part;
+ else
+ part=NULL;
+
+ nr= 1;
+
+ id= (ID *)part;
+
+ idtest= G.main->particle.first;
+ while(idtest) {
+ if(nr==G.buts->menunr) {
+ break;
+ }
+ nr++;
+ idtest= idtest->next;
+ }
+ if(idtest==0) { /* new particle system */
+ if(id){
+ idtest= (ID *)psys_copy_settings((ParticleSettings *)id);
+ }
+ else {
+ idtest= (ID *)psys_new_settings("PSys", G.main);
+ }
+ idtest->us--;
+ }
+ if(idtest!=id) {
+ short nr=0;
+ if(id==0){ /* no psys previously -> no modifier -> need to create that also */
+ psys = MEM_callocN(sizeof(ParticleSystem), "particle_system");
+ BLI_addtail(&ob->particlesystem,psys);
+
+ md= modifier_new(eModifierType_ParticleSystem);
+ sprintf(md->name, "ParticleSystem %i", BLI_countlist(&ob->particlesystem));
+ psmd= (ParticleSystemModifierData*) md;
+ psmd->psys=psys;
+ BLI_addtail(&ob->modifiers, md);
+ }
+
+ idtest->us++;
+ psys->part=(ParticleSettings*)idtest;
+ psys->totpart=0;
+ psys->flag=PSYS_ENABLED|PSYS_CURRENT;
+ psys->cfra=bsystem_time(ob,G.scene->r.cfra+1,0.0);
+
+ /* check need for dupliobjects */
+ nr=0;
+ for(psys=ob->particlesystem.first; psys; psys=psys->next){
+ if(ELEM(psys->part->draw_as,PART_DRAW_OB,PART_DRAW_GR))
+ nr++;
+ }
+ if(nr)
+ ob->transflag |= OB_DUPLIPARTS;
+ else
+ ob->transflag &= ~OB_DUPLIPARTS;
+
+ BIF_undo_push("Browse Particle System");
+
+ DAG_scene_sort(G.scene);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWOOPS, 0);
+ }
+
+ }
+ break;
+ case B_PARTDELETE:
+ if(ob && ob->particlesystem.first){
+ psys= psys_get_current(ob);
+ if(psys) {
+ /* clear modifier */
+ psmd= psys_get_modifier(ob,psys);
+ BLI_remlink(&ob->modifiers, psmd);
+ modifier_free((ModifierData *)psmd);
+
+ /* clear particle system */
+ BLI_remlink(&ob->particlesystem,psys);
+ psys_free(ob,psys);
+
+ BIF_undo_push("Delete particle system");
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWOOPS, 0);
+ }
+ }
+ break;
+ case B_PARTALONE: /* TODO: not too sure of how this works so someone check please, jahka */
+ if(ob && (psys=psys_get_current(ob))){
+ if(psys->part) {
+ if(psys->part->id.us>1){
+ if(okee("Make local")){
+ part=psys_copy_settings(psys->part);
+ part->id.us=1;
+ psys->part->id.us--;
+ psys->part=part;
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWOOPS, 0);
+
+ BIF_undo_push("Make single user or local");
+ }
+ }
+ }
+ }
+ break;
+ case B_PART_ALLOC:
+ case B_PART_ALLOC_CHILD:
+ if(psys){
+ psys_flush_settings(psys->part,PSYS_ALLOC,event==B_PART_ALLOC);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWOOPS, 0);
+ }
+ break;
+ case B_PART_DISTR:
+ case B_PART_DISTR_CHILD:
+ if(psys){
+ psys_flush_settings(psys->part,PSYS_DISTR,event==B_PART_DISTR);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWOOPS, 0);
+ }
+ break;
+ case B_PART_INIT:
+ case B_PART_INIT_CHILD:
+ if(psys){
+ psys_flush_settings(psys->part,PSYS_INIT,event==B_PART_INIT);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWOOPS, 0);
+ }
+ break;
+ case B_PART_RECALC:
+ case B_PART_RECALC_CHILD:
+ if(psys){
+ psys_flush_settings(psys->part,0,event==B_PART_RECALC);
+ allqueue(REDRAWOOPS, 0);
+ }
+ /* no break! */
+ case B_PART_REDRAW:
+ nr=0;
+ for(psys=ob->particlesystem.first; psys; psys=psys->next){
+ if(ELEM(psys->part->draw_as,PART_DRAW_OB,PART_DRAW_GR))
+ nr++;
+ }
+ if(nr)
+ ob->transflag |= OB_DUPLIPARTS;
+ else
+ ob->transflag &= ~OB_DUPLIPARTS;
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ break;
+ case B_PARTTYPE:
+ if((psys=psys_get_current(ob))){
+ DAG_scene_sort(G.scene);
+
+ psys_flush_settings(psys->part,PSYS_TYPE,1);
+ }
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ break;
+ case B_PARTACT:
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWIPO, 0);
+ break;
+ case B_PARTTARGET:
+ if((psys=psys_get_current(ob))){
+ if(psys->keyed_ob==ob || psys->target_ob==ob){
+ if(psys->keyed_ob==ob)
+ psys->keyed_ob=NULL;
+ else
+ psys->target_ob=NULL;
+ }
+ else{
+ DAG_scene_sort(G.scene);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ }
+ break;
+ case B_PART_REKEY:
+ PE_rekey();
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ break;
+ case B_PART_EDITABLE:
+ if((psys = psys_get_current(ob))) {
+ if(psys->flag & PSYS_EDITED){
+ if(okee("Lose changes done in particle mode?")){
+ if(psys->edit)
+ PE_free_particle_edit(psys);
+
+ psys->flag &= ~PSYS_EDITED;
+ psys->recalc |= PSYS_RECALC_HAIR;
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ }
+ else {
+ psys->flag |= PSYS_EDITED;
+ if(G.f & G_PARTICLEEDIT)
+ PE_create_particle_edit(ob, psys);
+ }
+ }
case B_FIELD_DEP:
/* do this before scene sort, that one checks for CU_PATH */
if(ob->type==OB_CURVE && ob->pd->forcefield==PFIELD_GUIDE) {
@@ -2306,6 +2937,10 @@ void do_effects_panels(unsigned short event)
allqueue(REDRAWBUTSOBJECT, 0);
break;
case B_FIELD_CHANGE:
+ if(ob->pd->forcefield != PFIELD_TEXTURE && ob->pd->tex){
+ ob->pd->tex->id.us--;
+ ob->pd->tex=0;
+ }
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
allqueue(REDRAWVIEW3D, 0);
break;
@@ -2350,13 +2985,76 @@ void do_effects_panels(unsigned short event)
}
-/* Panel for particle interaction settings */
+/* copy from buttons_editing.c */
+static void field_testTexture(char *name, ID **idpp)
+{
+ ID *id;
+
+ for(id = G.main->tex.first; id; id = id->next) {
+ if(strcmp(name, id->name + 2) == 0) {
+ *idpp = id;
+ /* texture gets user, objects not: delete object = clear modifier */
+ id_us_plus(id);
+ return;
+ }
+ }
+ *idpp = 0;
+}
+/* Panels for particle interaction settings */
+static void object_panel_deflection(Object *ob)
+{
+ uiBlock *block;
+
+ block= uiNewBlock(&curarea->uiblocks, "object_panel_deflection", UI_EMBOSS, UI_HELV, curarea->win);
+ if(uiNewPanel(curarea, block, "Deflection", "Physics", 0, 0, 318, 204)==0) return;
+
+ uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+
+ /* should become button, option? */
+ if(ob->pd==NULL) {
+ ob->pd= MEM_callocN(sizeof(PartDeflect), "PartDeflect");
+ /* and if needed, init here */
+ ob->pd->pdef_sbdamp = 0.1f;
+ ob->pd->pdef_sbift = 0.2f;
+ ob->pd->pdef_sboft = 0.02f;
+ }
+
+ /* only meshes collide now */
+ if(ob->pd && ob->type==OB_MESH) {
+ PartDeflect *pd= ob->pd;
+
+ uiDefButBitS(block, TOG, 1, B_REDR, "Deflection",160,160,150,20, &pd->deflect, 0, 0, 0, 0, "Deflects particles based on collision");
+ if(pd->deflect) {
+ uiDefBut(block, LABEL, 0, "Particles", 160,140,75,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefButBitS(block, TOG, PDEFLE_KILL_PART, B_DIFF, "Kill",235,140,75,20, &pd->flag, 0, 0, 0, 0, "Kill collided particles");
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_DIFF, "Damping: ", 160,120,75,20, &pd->pdef_damp, 0.0, 1.0, 10, 0, "Amount of damping during particle collision");
+ uiDefButF(block, NUM, B_DIFF, "Rnd Damping: ", 235,120,75,20, &pd->pdef_rdamp, 0.0, 1.0, 10, 0, "Random variation of damping");
+ uiDefButF(block, NUM, B_DIFF, "Friction: ", 160,100,75,20, &pd->pdef_frict, 0.0, 1.0, 10, 0, "Amount of friction during particle collision");
+ uiDefButF(block, NUM, B_DIFF, "Rnd Friction: ", 235,100,75,20, &pd->pdef_rfrict, 0.0, 1.0, 10, 0, "Random variation of friction");
+ uiDefButF(block, NUM, B_DIFF, "Permeability: ", 160,80,150,20, &pd->pdef_perm, 0.0, 1.0, 10, 0, "Chance that the particle will pass through the mesh");
+ uiBlockEndAlign(block);
+
+ uiDefBut(block, LABEL, 0, "Soft Body", 160,60,150,20, NULL, 0.0, 0, 0, 0, "");
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Damping:", 160,40,150,20, &pd->pdef_sbdamp, 0.0, 1.0, 10, 0, "Amount of damping during soft body collision");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Inner:", 160,20,150,20, &pd->pdef_sbift, 0.001, 1.0, 10, 0, "Inner face thickness");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Outer:", 160, 0,150,20, &pd->pdef_sboft, 0.001, 1.0, 10, 0, "Outer face thickness");
+ }
+ }
+}
static void object_panel_fields(Object *ob)
{
uiBlock *block;
+ uiBut *but;
+ int particles=0;
+ static short actpsys=-1;
block= uiNewBlock(&curarea->uiblocks, "object_panel_fields", UI_EMBOSS, UI_HELV, curarea->win);
- if(uiNewPanel(curarea, block, "Fields and Deflection", "Physics", 0, 0, 318, 204)==0) return;
+ uiNewPanelTabbed("Deflection", "Physics");
+ if(uiNewPanel(curarea, block, "Fields", "Physics", 0, 0, 318, 204)==0) return;
uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
@@ -2374,67 +3072,155 @@ static void object_panel_fields(Object *ob)
char *menustr= MEM_mallocN(256, "temp string");
char *tipstr="Choose field type";
- uiDefBut(block, LABEL, 0, "Fields", 10,180,140,20, NULL, 0.0, 0, 0, 0, "");
-
+ if(ob->particlesystem.first) {
+ ParticleSystem *psys;
+ char *menustr2= psys_menu_string(ob,1);
+
+ psys= psys_get_current(ob);
+ if(psys && actpsys >= 0) {
+ actpsys= psys_get_current_num(ob)+1;
+
+ if(psys->part->pd==NULL)
+ psys->part->pd= MEM_callocN(sizeof(PartDeflect), "PartDeflect");
+
+ pd= psys->part->pd;
+ particles=1;
+ }
+ else
+ actpsys= -1; /* -1 = object */
+
+ but=uiDefButS(block, MENU, B_BAKE_REDRAWEDIT, menustr2, 10,180,70,20, &actpsys, 14.0, 0.0, 0, 0, "Browse systems");
+ uiButSetFunc(but, PE_change_act, ob, &actpsys);
+
+ MEM_freeN(menustr2);
+ }
+
/* setup menu button */
- sprintf(menustr, "Field Type%%t|None %%x0|Spherical %%x%d|Wind %%x%d|Vortex %%x%d|Curve Guide %%x%d",
- PFIELD_FORCE, PFIELD_WIND, PFIELD_VORTEX, PFIELD_GUIDE);
-
- if(pd->forcefield==PFIELD_FORCE) tipstr= "Object center attracts or repels particles";
- else if(pd->forcefield==PFIELD_WIND) tipstr= "Constant force applied in direction of Object Z axis";
- else if(pd->forcefield==PFIELD_VORTEX) tipstr= "Particles swirl around Z-axis of the Object";
- else if(pd->forcefield==PFIELD_GUIDE) tipstr= "Use a Curve Path to guide particles";
+ if(particles){
+ sprintf(menustr, "Field Type%%t|None%%x0|Spherical%%x%d|Wind%%x%d|Vortex%%x%d|Magnetic%%x%d|Harmonic%%x%d",
+ PFIELD_FORCE, PFIELD_WIND, PFIELD_VORTEX, PFIELD_MAGNET, PFIELD_HARMONIC);
+
+ if(pd->forcefield==PFIELD_FORCE) tipstr= "Particle attracts or repels particles";
+ else if(pd->forcefield==PFIELD_WIND) tipstr= "Constant force applied in direction of particle Z axis";
+ else if(pd->forcefield==PFIELD_VORTEX) tipstr= "Particles swirl around Z-axis of the particle";
+ }
+ else{
+ if(ob->type==OB_CURVE)
+ sprintf(menustr, "Field Type%%t|None%%x0|Spherical%%x%d|Wind%%x%d|Vortex%%x%d|Curve Guide%%x%d|Magnetic%%x%d|Harmonic%%x%d|Texture%%x%d",
+ PFIELD_FORCE, PFIELD_WIND, PFIELD_VORTEX, PFIELD_GUIDE, PFIELD_MAGNET, PFIELD_HARMONIC, PFIELD_TEXTURE);
+ else
+ sprintf(menustr, "Field Type%%t|None%%x0|Spherical%%x%d|Wind%%x%d|Vortex%%x%d|Magnetic%%x%d|Harmonic%%x%d|Texture%%x%d",
+ PFIELD_FORCE, PFIELD_WIND, PFIELD_VORTEX, PFIELD_MAGNET, PFIELD_HARMONIC, PFIELD_TEXTURE);
+
+ if(pd->forcefield==PFIELD_FORCE) tipstr= "Object center attracts or repels particles";
+ else if(pd->forcefield==PFIELD_WIND) tipstr= "Constant force applied in direction of Object Z axis";
+ else if(pd->forcefield==PFIELD_VORTEX) tipstr= "Particles swirl around Z-axis of the Object";
+ else if(pd->forcefield==PFIELD_GUIDE) tipstr= "Use a Curve Path to guide particles";
+ }
- uiDefButS(block, MENU, B_FIELD_DEP, menustr, 10,160,140,20, &pd->forcefield, 0.0, 0.0, 0, 0, tipstr);
+ if(ob->particlesystem.first)
+ uiDefButS(block, MENU, B_FIELD_DEP, menustr, 80,180,70,20, &pd->forcefield, 0.0, 0.0, 0, 0, tipstr);
+ else
+ uiDefButS(block, MENU, B_FIELD_DEP, menustr, 10,180,140,20, &pd->forcefield, 0.0, 0.0, 0, 0, tipstr);
+
MEM_freeN(menustr);
if(pd->forcefield) {
uiBlockBeginAlign(block);
if(pd->forcefield == PFIELD_GUIDE) {
- uiDefButF(block, NUM, B_FIELD_CHANGE, "MinDist: ", 10,120,140,20, &pd->f_strength, 0.0, 1000.0, 10, 0, "The distance from which particles are affected fully.");
- uiDefButF(block, NUM, B_FIELD_CHANGE, "Fall-off: ", 10,100,140,20, &pd->f_power, 0.0, 10.0, 10, 0, "Falloff factor, between mindist and maxdist");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "MinDist: ", 10,140,140,20, &pd->f_strength, 0.0, 1000.0, 10, 0, "The distance from which particles are affected fully.");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Fall-off: ", 10,120,140,20, &pd->f_power, 0.0, 10.0, 10, 0, "Falloff factor, between mindist and maxdist");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Free: ", 10,100,140,20, &pd->free_end, 0.0, 0.99, 10, 0, "Guide-free time from particle life's end");
+ uiBlockEndAlign(block);
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, PFIELD_USEMAX, B_FIELD_CHANGE, "Use", 10,80,40,20, &pd->flag, 0.0, 0, 0, 0, "Use a maximum distance for the field to work");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "MaxDist: ", 50,80,100,20, &pd->maxdist, 0, 1000.0, 10, 0, "Maximum distance for the field to work");
}
- else {
- uiDefButF(block, NUM, B_FIELD_CHANGE, "Strength: ", 10,110,140,20, &pd->f_strength, -1000, 1000, 10, 0, "Strength of force field");
- uiDefButF(block, NUM, B_FIELD_CHANGE, "Fall-off: ", 10,90,140,20, &pd->f_power, 0, 10, 10, 0, "Falloff power (real gravitational fallof = 2)");
+ else {
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Strength: ", 10,140,140,20, &pd->f_strength, -1000, 1000, 10, 0, "Strength of force field");
+
+ if(pd->forcefield == PFIELD_TEXTURE){
+ uiDefIDPoinBut(block, field_testTexture, ID_TE, B_FIELD_CHANGE, "Texture: ", 10, 120, 140, 20, &pd->tex, "Texture to use as force");
+ uiDefButBitS(block, TOG, PFIELD_TEX_OBJECT, B_FIELD_CHANGE, "Use Object Co", 10,100,140,20, &pd->flag, 0.0, 0, 0, 0, "Use object/global coordinates for texture");
+ uiDefButBitS(block, TOG, PFIELD_TEX_2D, B_FIELD_CHANGE, "2D", 10,80,140,20, &pd->flag, 0.0, 0, 0, 0, "Apply force only in 2d");
+ }
+ else if(pd->forcefield == PFIELD_HARMONIC)
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Damp: ", 10,120,140,20, &pd->f_damp, 0, 10, 10, 0, "Damping of the harmonic force");
}
+ uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, PFIELD_USEMAX, B_FIELD_CHANGE, "Use MaxDist", 10,60,140,20, &pd->flag, 0.0, 0, 0, 0, "Use a maximum distance for the field to work");
- uiDefButF(block, NUM, B_FIELD_CHANGE, "MaxDist: ", 10,40,140,20, &pd->maxdist, 0, 1000.0, 10, 0, "Maximum distance for the field to work");
+ if(pd->forcefield == PFIELD_GUIDE){
+ uiDefButBitS(block, TOG, PFIELD_GUIDE_PATH_ADD, B_FIELD_CHANGE, "Additive", 10,40,140,20, &pd->flag, 0.0, 0, 0, 0, "Based on distance/falloff it adds a portion of the entire path");
+ }
+ else if(pd->forcefield==PFIELD_TEXTURE){
+ uiDefButS(block, MENU, B_FIELD_CHANGE, "Texture mode%t|RGB%x0|Gradient%x1|Curl%x2", 10,40,140,20, &pd->tex_mode, 0.0, 0.0, 0, 0, "How the texture effect is calculated (RGB & Curl need a RGB texture)");
+
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Nabla:", 10,20,140,20, &pd->tex_nabla, 0.0001f, 1.0, 1, 0, "Specify the dimension of the area for gradient and curl calculation");
+ }
+ else if(particles==0 && ELEM(pd->forcefield,PFIELD_VORTEX,PFIELD_WIND)==0){
+ //uiDefButF(block, NUM, B_FIELD_CHANGE, "Distance: ", 10,20,140,20, &pd->f_dist, 0, 1000.0, 10, 0, "Falloff power (real gravitational fallof = 2)");
+ uiDefButBitS(block, TOG, PFIELD_PLANAR, B_FIELD_CHANGE, "Planar", 10,0,140,20, &pd->flag, 0.0, 0, 0, 0, "Create planar field");
+ }
uiBlockEndAlign(block);
- if(pd->forcefield == PFIELD_GUIDE)
- uiDefButBitS(block, TOG, PFIELD_GUIDE_PATH_ADD, B_FIELD_CHANGE, "Additive", 10,10,140,20, &pd->flag, 0.0, 0, 0, 0, "Based on distance/falloff it adds a portion of the entire path");
-
- }
-
- uiDefBut(block, LABEL, 0, "Deflection", 160,180,140,20, NULL, 0.0, 0, 0, 0, "");
-
- /* only meshes collide now */
- if(ob->type==OB_MESH) {
- uiDefButBitS(block, TOG, 1, B_REDR, "Deflection",160,160,150,20, &pd->deflect, 0, 0, 0, 0, "Deflects particles based on collision");
- if(pd->deflect) {
- uiDefBut(block, LABEL, 0, "Particles", 160,140,150,20, NULL, 0.0, 0, 0, 0, "");
-
+ if(pd->forcefield==PFIELD_GUIDE){
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_DIFF, "Damping: ", 160,120,150,20, &pd->pdef_damp, 0.0, 1.0, 10, 0, "Amount of damping during particle collision");
- uiDefButF(block, NUM, B_DIFF, "Rnd Damping: ", 160,100,150,20, &pd->pdef_rdamp, 0.0, 1.0, 10, 0, "Random variation of damping");
- uiDefButF(block, NUM, B_DIFF, "Permeability: ", 160,80,150,20, &pd->pdef_perm, 0.0, 1.0, 10, 0, "Chance that the particle will pass through the mesh");
+ uiDefButF(block, NUMSLI, B_FIELD_CHANGE, "Clump:", 160,180,140,20, &pd->clump_fac, -1.0, 1.0, 1, 3, "Amount of clumpimg");
+ uiDefButF(block, NUMSLI, B_FIELD_CHANGE, "Shape:", 160,160,140,20, &pd->clump_pow, -0.999, 0.999, 1, 3, "Shape of clumpimg");
uiBlockEndAlign(block);
-
- uiDefBut(block, LABEL, 0, "Soft Body", 160,60,150,20, NULL, 0.0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_FIELD_CHANGE, "Damping:", 160,40,150,20, &pd->pdef_sbdamp, 0.0, 1.0, 10, 0, "Amount of damping during soft body collision");
- uiDefButF(block, NUM, B_FIELD_CHANGE, "Inner:", 160,20,150,20, &pd->pdef_sbift, 0.001, 1.0, 10, 0, "Inner face thickness");
- uiDefButF(block, NUM, B_FIELD_CHANGE, "Outer:", 160, 0,150,20, &pd->pdef_sboft, 0.001, 1.0, 10, 0, "Outer face thickness");
+ if(pd->kink){
+ uiDefButS(block, MENU, B_FIELD_CHANGE, "Kink:%t|Roll%x6|Rotation%x5|Braid%x4|Wave%x3|Radial%x2|Curl%x1|Nothing%x0", 160,120,70,20, &pd->kink, 14.0, 0.0, 0, 0, "Type of periodic offset on the curve");
+ uiDefButS(block, MENU, B_FIELD_CHANGE, "Axis %t|Z %x2|Y %x1|X %x0", 230,120,70,20, &pd->kink_axis, 14.0, 0.0, 0, 0, "Which axis to use for offset");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Freq:", 160,100,140,20, &pd->kink_freq, 0.0, 10.0, 1, 3, "The frequency of the offset (1/total length)");
+ uiDefButF(block, NUMSLI, B_FIELD_CHANGE, "Shape:", 160,80,140,20, &pd->kink_shape, -0.999, 0.999, 1, 3, "Adjust the offset to the beginning/end");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Amplitude:", 160,60,140,20, &pd->kink_amp, 0.0, 10.0, 1, 3, "The amplitude of the offset");
+ }
+ else{
+ uiDefButS(block, MENU, B_FIELD_CHANGE, "Kink:%t|Roll%x6|Rotation%x5|Braid%x4|Wave%x3|Radial%x2|Curl%x1|Nothing%x0", 160,120,140,20, &pd->kink, 14.0, 0.0, 0, 0, "Type of periodic offset on the curve");
+ }
+ uiBlockEndAlign(block);
+ }
+ else{
+ uiDefButS(block, MENU, B_FIELD_DEP, "Fall-off%t|Cone%x2|Tube%x1|Sphere%x0", 160,180,140,20, &pd->falloff, 0.0, 0.0, 0, 0, tipstr);
+ if(pd->falloff==PFIELD_FALL_TUBE)
+ uiDefBut(block, LABEL, 0, "Lognitudinal", 160,160,70,20, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, PFIELD_POSZ, B_FIELD_CHANGE, "Pos", 160,140,40,20, &pd->flag, 0.0, 0, 0, 0, "Effect only in direction of positive Z axis");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Fall-off: ", 200,140,100,20, &pd->f_power, 0, 10, 10, 0, "Falloff power (real gravitational falloff = 2)");
+ uiDefButBitS(block, TOG, PFIELD_USEMAX, B_FIELD_CHANGE, "Use", 160,120,40,20, &pd->flag, 0.0, 0, 0, 0, "Use a maximum distance for the field to work");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "MaxDist: ", 200,120,100,20, &pd->maxdist, 0, 1000.0, 10, 0, "Maximum distance for the field to work");
+ uiDefButBitS(block, TOG, PFIELD_USEMIN, B_FIELD_CHANGE, "Use", 160,100,40,20, &pd->flag, 0.0, 0, 0, 0, "Use a minimum distance for the field's fall-off");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "MinDist: ", 200,100,100,20, &pd->mindist, 0, 1000.0, 10, 0, "Minimum distance for the field's fall-off");
+ uiBlockEndAlign(block);
+
+ if(pd->falloff==PFIELD_FALL_TUBE){
+ uiDefBut(block, LABEL, 0, "Radial", 160,80,70,20, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Fall-off: ", 160,60,140,20, &pd->f_power_r, 0, 10, 10, 0, "Radial falloff power (real gravitational falloff = 2)");
+ uiDefButBitS(block, TOG, PFIELD_USEMAXR, B_FIELD_CHANGE, "Use", 160,40,40,20, &pd->flag, 0.0, 0, 0, 0, "Use a maximum radial distance for the field to work");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "MaxDist: ", 200,40,100,20, &pd->maxrad, 0, 1000.0, 10, 0, "Maximum radial distance for the field to work");
+ uiDefButBitS(block, TOG, PFIELD_USEMINR, B_FIELD_CHANGE, "Use", 160,20,40,20, &pd->flag, 0.0, 0, 0, 0, "Use a minimum radial distance for the field's fall-off");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "MinDist: ", 200,20,100,20, &pd->minrad, 0, 1000.0, 10, 0, "Minimum radial distance for the field's fall-off");
+ uiBlockEndAlign(block);
+ }
+ else if(pd->falloff==PFIELD_FALL_CONE){
+ uiDefBut(block, LABEL, 0, "Angular", 160,80,70,20, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "Fall-off: ", 160,60,140,20, &pd->f_power_r, 0, 10, 10, 0, "Radial falloff power (real gravitational falloff = 2)");
+ uiDefButBitS(block, TOG, PFIELD_USEMAXR, B_FIELD_CHANGE, "Use", 160,40,40,20, &pd->flag, 0.0, 0, 0, 0, "Use a maximum angle for the field to work");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "MaxAngle: ", 200,40,100,20, &pd->maxrad, 0, 89.0, 10, 0, "Maximum angle for the field to work (in radians)");
+ uiDefButBitS(block, TOG, PFIELD_USEMINR, B_FIELD_CHANGE, "Use", 160,20,40,20, &pd->flag, 0.0, 0, 0, 0, "Use a minimum angle for the field's fall-off");
+ uiDefButF(block, NUM, B_FIELD_CHANGE, "MinAngle: ", 200,20,100,20, &pd->minrad, 0, 89.0, 10, 0, "Minimum angle for the field's fall-off (in radians)");
+ uiBlockEndAlign(block);
+ }
}
- }
+ }
}
}
-
/* Panel for softbodies */
static void object_softbodies__enable(void *ob_v, void *arg2)
{
@@ -2458,8 +3244,11 @@ static void object_softbodies__enable(void *ob_v, void *arg2)
ob->softflag |= OB_SB_GOAL|OB_SB_EDGES;
}
}
+ /* needed so that initial state is cached correctly */
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWVIEW3D, 0);
}
static int _can_softbodies_at_all(Object *ob)
@@ -2473,30 +3262,87 @@ static int _can_softbodies_at_all(Object *ob)
// else deny
return 0;
}
+static void object_softbodies__enable_psys(void *ob_v, void *psys_v)
+{
+ ParticleSystem *psys = psys_v;
+ Object *ob = ob_v;
+
+ if(psys->softflag & OB_SB_ENABLE){
+ psys->softflag &= ~OB_SB_ENABLE;
+ }
+ else{
+ if (!psys->soft) {
+ psys->soft= sbNew();
+ psys->softflag |= OB_SB_GOAL|OB_SB_EDGES;
+ psys->soft->particles=psys;
+ }
+ psys->softflag |= OB_SB_ENABLE;
+ }
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+
+ allqueue(REDRAWBUTSEDIT, 0);
+}
+
static void object_softbodies_II(Object *ob)
{
+ SoftBody *sb=ob->soft;
uiBlock *block;
static int val;
+ short *softflag=&ob->softflag, psys_cur=0;
+ int ob_has_hair=psys_ob_has_hair(ob);
if(!_can_softbodies_at_all(ob)) return;
+ /*bah that is ugly! creating missing data members in UI code*/
+ if(ob->pd == NULL){
+ ob->pd= MEM_callocN(sizeof(PartDeflect), "PartDeflect");
+ ob->pd->pdef_sbdamp = 0.1f;
+ ob->pd->pdef_sbift = 0.2f;
+ ob->pd->pdef_sboft = 0.02f;
+ }
block= uiNewBlock(&curarea->uiblocks, "object_softbodies_II", UI_EMBOSS, UI_HELV, curarea->win);
uiNewPanelTabbed("Soft Body", "Physics");
if(uiNewPanel(curarea, block, "Soft Body Collision", "Physics", 651, 0, 318, 204)==0) return;
uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
- val = modifiers_isSoftbodyEnabled(ob);
+ if(ob_has_hair) {
+ if(PE_get_current_num(ob) >= 0) {
+ ParticleSystem *psys = PE_get_current(ob);
+ if(psys) {
+ sb = psys->soft;
+ softflag = &psys->softflag;
+ psys_cur = 1;
+ }
+ }
+ }
+
+ if(psys_cur) {
+ if(*softflag & OB_SB_ENABLE)
+ val = 1;
+ else
+ val = 0;
+ }
+ else
+ val = modifiers_isSoftbodyEnabled(ob);
+
if(!val) {
uiDefBut(block, LABEL, 0, "",10,10,1,2, NULL, 0.0, 0, 0, 0, ""); /* tell UI we go to 10,10*/
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, 0, "Object is not a softbody",10,190,300,20, NULL, 0.0, 0, 0, 0, "");
- uiDefBut(block, LABEL, 0, "However it can deflect a softbody",10,170,300,20, NULL, 0.0, 0, 0, 0, "");
+ if(psys_cur){
+ uiDefBut(block, LABEL, 0, "Hair is not a softbody",10,190,300,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "However the emitter can deflect a softbody",10,170,300,20, NULL, 0.0, 0, 0, 0, "");
+ }
+ else {
+ uiDefBut(block, LABEL, 0, "Object is not a softbody",10,190,300,20, NULL, 0.0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "However it can deflect a softbody",10,170,300,20, NULL, 0.0, 0, 0, 0, "");
+ }
/* OTHER OBJECTS COLLISION STUFF */
if (ob->type==OB_MESH){
uiBlockBeginAlign(block);
uiDefButBitS(block, TOG, 1, B_REDR, "Deflection",10,50,150,20, &ob->pd->deflect, 0, 0, 0, 0, "Makes this object visible to softbody objects");
if(ob->pd->deflect) {
uiDefButF(block, NUM, B_FIELD_CHANGE, "Damping:", 160,50,150,20, &ob->pd->pdef_sbdamp, 0.0, 1.0, 10, 0, "Amount of damping during soft body collision");
- uiDefButBitS(block, TOG,OB_SB_COLLFINAL , B_DIFF, "Ev.M.Stack",10,30,150,20, &ob->softflag, 0, 0, 0, 0, "Pick collision object from modifier stack");
+ uiDefButBitS(block, TOG,OB_SB_COLLFINAL , B_DIFF, "Ev.M.Stack",10,30,150,20, &ob->softflag, 0, 0, 0, 0, "Pick collision object from modifier stack");
uiDefButF(block, NUM, B_FIELD_CHANGE, "Inner:", 160,30,150,20, &ob->pd->pdef_sbift, 0.001, 1.0, 10, 0, "Inner face thickness");
uiDefButF(block, NUM, B_FIELD_CHANGE, "Outer:", 160,10,150,20, &ob->pd->pdef_sboft, 0.001, 1.0, 10, 0, "Outer face thickness");
}
@@ -2504,19 +3350,18 @@ static void object_softbodies_II(Object *ob)
uiBlockEndAlign(block);
}
else{
- SoftBody *sb= ob->soft;
/* SELF COLLISION STUFF */
if ((ob->type==OB_MESH)||(ob->type==OB_CURVE) ) {
uiBlockBeginAlign(block);
- if (ob->softflag & OB_SB_EDGES){
- uiDefButBitS(block, TOG, OB_SB_SELF, B_SOFTBODY_CHANGE, "Self Collision", 10,170,150,20, &ob->softflag, 0, 0, 0, 0, "enable naive vertex ball self collision");
- if(ob->softflag & OB_SB_SELF){
+ if (*softflag & OB_SB_EDGES){
+ uiDefButBitS(block, TOG, OB_SB_SELF, B_SOFTBODY_CHANGE, "Self Collision", 10,170,150,20, softflag, 0, 0, 0, 0, "enable naive vertex ball self collision");
+ if(*softflag & OB_SB_SELF){
uiDefButF(block, NUM, B_SOFTBODY_CHANGE, "Ball Size:", 160,170,150,20, &sb->colball, -10.0, 10.0, 10, 0, "Absolute ball size or factor if not manual adjusted");
- uiDefButS(block, ROW, B_DIFF, "Man",10,150,60,20, &sb->sbc_mode, 4.0,(float)0, 0, 0, "Manual adjust");
- uiDefButS(block, ROW, B_DIFF, "Av",70,150,60,20, &sb->sbc_mode, 4.0,(float)1, 0, 0, "Average Spring lenght * Ball Size");
- uiDefButS(block, ROW, B_DIFF, "Min",130,150,60,20, &sb->sbc_mode, 4.0,(float)2, 0, 0, "Minimal Spring lenght * Ball Size");
- uiDefButS(block, ROW, B_DIFF, "Max",190,150,60,20, &sb->sbc_mode, 4.0,(float)3, 0, 0, "Maximal Spring lenght * Ball Size");
- uiDefButS(block, ROW, B_DIFF, "AvMiMa",250,150,60,20, &sb->sbc_mode, 4.0,(float)4, 0, 0, "(Min+Max)/2 * Ball Size");
+ uiDefButS(block, ROW, B_DIFF, "Man",10,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_MANUAL, 0, 0, "Manual adjust");
+ uiDefButS(block, ROW, B_DIFF, "Av",70,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_AVG, 0, 0, "Average Spring lenght * Ball Size");
+ uiDefButS(block, ROW, B_DIFF, "Min",130,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_MIN, 0, 0, "Minimal Spring lenght * Ball Size");
+ uiDefButS(block, ROW, B_DIFF, "Max",190,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_MAX, 0, 0, "Maximal Spring lenght * Ball Size");
+ uiDefButS(block, ROW, B_DIFF, "AvMiMa",250,150,60,20, &sb->sbc_mode, 4.0,SBC_MODE_AVGMINMAX, 0, 0, "(Min+Max)/2 * Ball Size");
uiDefButF(block, NUM, B_DIFF, "B Stiff:", 10,130,150,20, &sb->ballstiff, 0.001, 100.0, 10, 0, "Ball inflating presure");
uiDefButF(block, NUM, B_DIFF, "B Damp:", 160,130,150,20, &sb->balldamp, 0.001, 1.0, 10, 0, "Blending to inelastic collision");
}
@@ -2541,7 +3386,7 @@ static void object_softbodies_II(Object *ob)
uiDefButBitS(block, TOG, 1, B_REDR, "Deflection",10,50,150,20, &ob->pd->deflect, 0, 0, 0, 0, "Makes this object visible to other softbody objects");
if(ob->pd->deflect) {
uiDefButF(block, NUM, B_DIFF, "Damping:", 160,50,150,20, &ob->pd->pdef_sbdamp, 0.0, 1.0, 10, 0, "Amount of damping during soft body collision");
- uiDefButBitS(block, TOG,OB_SB_COLLFINAL , B_DIFF, "Ev.M.Stack",10,30,150,20, &ob->softflag, 0, 0, 0, 0, "Pick collision object from modifier stack");
+ uiDefButBitS(block, TOG,OB_SB_COLLFINAL , B_DIFF, "Ev.M.Stack",10,30,150,20, softflag, 0, 0, 0, 0, "Pick collision object from modifier stack");
uiDefButF(block, NUM, B_DIFF, "Inner:", 160,30,150,20, &ob->pd->pdef_sbift, 0.001, 1.0, 10, 0, "Inner face thickness");
uiDefButF(block, NUM, B_DIFF, "Outer:", 160,10,150,20, &ob->pd->pdef_sboft, 0.001, 1.0, 10, 0, "Outer face thickness");
}
@@ -2551,61 +3396,115 @@ static void object_softbodies_II(Object *ob)
uiBlockEndAlign(block);
}
+static void sb_clear_cache(void *ob_v, void *actsoft_v)
+{
+ Object *ob = ob_v;
+ short *actsoft = actsoft_v;
+
+ if(actsoft >= 0)
+ clear_particles_from_cache(ob, BLI_findlink(&ob->particlesystem, *actsoft), CFRA);
+ else
+ softbody_clear_cache(ob, CFRA);
+}
static void object_softbodies(Object *ob)
{
+ SoftBody *sb=ob->soft;
+ ParticleSystem *psys;
uiBlock *block;
- static int val;
uiBut *but;
+ static int val;
+ short *softflag=&ob->softflag, psys_cur=0;
+ int ob_has_hair = psys_ob_has_hair(ob);
+ static short actsoft= -1;
+
if(!_can_softbodies_at_all(ob)) return;
block= uiNewBlock(&curarea->uiblocks, "object_softbodies", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Soft Body", "Physics", 640, 0, 318, 204)==0) return;
uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
- val = modifiers_isSoftbodyEnabled(ob);
- but = uiDefButI(block, TOG, REDRAWBUTSOBJECT, "Soft Body", 10,200,130,20, &val, 0, 0, 0, 0, "Sets object to become soft body");
- uiButSetFunc(but, object_softbodies__enable, ob, NULL);
+ if(ob_has_hair) {
+ char *menustr = psys_menu_string(ob,1);
+
+ psys= psys_get_current(ob);
+ if(psys && actsoft >= 0) {
+ actsoft= psys_get_current_num(ob)+1;
+
+ sb=psys->soft;
+ softflag=&psys->softflag;
+ psys_cur=1;
+ }
+ else
+ actsoft= -1; /* -1 = object */
+
+ but=uiDefButS(block, MENU, B_BAKE_REDRAWEDIT, menustr, 10,200,100,20, &actsoft, 14.0, 0.0, 0, 0, "Browse systems");
+ uiButSetFunc(but, PE_change_act, ob, &actsoft);
+
+ MEM_freeN(menustr);
+ }
+
+ if(psys_cur){
+ if(*softflag & OB_SB_ENABLE)
+ val=1;
+ else
+ val=0;
+
+ but = uiDefButI(block, TOG, REDRAWBUTSOBJECT, "Soft Body", 110,200,70,20, &val, 0, 0, 0, 0, "Sets hair to become soft body");
+ uiButSetFunc(but, object_softbodies__enable_psys, ob, psys);
+ }
+ else{
+ val = modifiers_isSoftbodyEnabled(ob);
+ if(ob_has_hair)
+ but = uiDefButI(block, TOG, REDRAWBUTSOBJECT, "Soft Body", 110,200,70,20, &val, 0, 0, 0, 0, "Sets object to become soft body");
+ else
+ but = uiDefButI(block, TOG, REDRAWBUTSOBJECT, "Soft Body", 10,200,130,20, &val, 0, 0, 0, 0, "Sets object to become soft body");
+
+ uiButSetFunc(but, object_softbodies__enable, ob, NULL);
+ }
+
uiDefBut(block, LABEL, 0, "",10,10,300,0, NULL, 0.0, 0, 0, 0, ""); /* tell UI we go to 10,10*/
- if(modifiers_isSoftbodyEnabled(ob)){
- SoftBody *sb= ob->soft;
+ if(val){
int defCount;
char *menustr;
+ static char str[128];
- if(sb==NULL) {
- sb= ob->soft= sbNew();
- ob->softflag |= OB_SB_GOAL|OB_SB_EDGES;
- }
+ //uiDefButBitS(block, TOG, OB_SB_BAKESET, REDRAWBUTSOBJECT, "Bake settings", 180,200,130,20, &ob->softflag, 0, 0, 0, 0, "To convert simulation into baked (cached) result");
- uiDefButBitS(block, TOG, OB_SB_BAKESET, REDRAWBUTSOBJECT, "Bake settings", 180,200,130,20, &ob->softflag, 0, 0, 0, 0, "To convert simulation into baked (cached) result");
+ //if(sb->keys) uiSetButLock(1, "Soft Body is baked, free it first");
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, OB_SB_PROTECT_CACHE, REDRAWBUTSOBJECT, "Protect", 180,200,50,20, softflag, 0.0, 0.0, 10, 0, "Protect the cache");
+ but=uiDefBut(block, BUT, B_SOFTBODY_CHANGE, "Clear", 230,200,50,20, NULL, 0.0, 0.0, 10, 0, "Clear the cache");
+ if((*softflag & PSYS_PROTECT_CACHE)==0)
+ uiButSetFunc(but, sb_clear_cache, ob, &actsoft);
- if(sb->keys) uiSetButLock(1, "Soft Body is baked, free it first");
+ uiBlockEndAlign(block);
- if(ob->softflag & OB_SB_BAKESET) {
- uiBlockBeginAlign(block);
- uiDefButI(block, NUM, B_DIFF, "Start:", 10, 170,100,20, &sb->sfra, 1.0, 10000.0, 10, 0, "Start frame for baking");
- uiDefButI(block, NUM, B_DIFF, "End:", 110, 170,100,20, &sb->efra, 1.0, 10000.0, 10, 0, "End frame for baking");
- uiDefButI(block, NUM, B_DIFF, "Interval:", 210, 170,100,20, &sb->interval, 1.0, 10.0, 10, 0, "Interval in frames between baked keys");
- uiBlockEndAlign(block);
+ if(*softflag & OB_SB_PROTECT_CACHE) uiSetButLock(1, "Cache is protected");
- uiDefButS(block, TOG, B_DIFF, "Local", 10, 145,100,20, &sb->local, 0.0, 0.0, 0, 0, "Use local coordinates for baking");
+ //if(ob->softflag & OB_SB_BAKESET) {
+ // uiBlockBeginAlign(block);
+ // uiDefButI(block, NUM, B_DIFF, "Start:", 10, 170,100,20, &sb->sfra, 1.0, 10000.0, 10, 0, "Start frame for baking");
+ // uiDefButI(block, NUM, B_DIFF, "End:", 110, 170,100,20, &sb->efra, 1.0, 10000.0, 10, 0, "End frame for baking");
+ // uiDefButI(block, NUM, B_DIFF, "Interval:", 210, 170,100,20, &sb->interval, 1.0, 10.0, 10, 0, "Interval in frames between baked keys");
+ // uiBlockEndAlign(block);
+ // uiDefButS(block, TOG, B_DIFF, "Local", 10, 145,100,20, &sb->local, 0.0, 0.0, 0, 0, "Use local coordinates for baking");
- uiClearButLock();
- uiBlockBeginAlign(block);
- if(sb->keys) {
- char str[128];
- uiDefIconTextBut(block, BUT, B_SOFTBODY_BAKE_FREE, ICON_X, "FREE BAKE", 10, 120,300,20, NULL, 0.0, 0.0, 0, 0, "Free baked result");
- sprintf(str, "Stored %d vertices %d keys %.3f MB", sb->totpoint, sb->totkey, ((float)16*sb->totpoint*sb->totkey)/(1024.0*1024.0));
- uiDefBut(block, LABEL, 0, str, 10, 100,300,20, NULL, 0.0, 0.0, 00, 0, "");
- }
- else
- uiDefBut(block, BUT, B_SOFTBODY_BAKE, "BAKE", 10, 120,300,20, NULL, 0.0, 0.0, 10, 0, "Start baking. Press ESC to exit without baking");
+ // uiClearButLock();
+ // uiBlockBeginAlign(block);
- }
- else {
+ // if(sb->keys) {
+ // char str[128];
+ // uiDefIconTextBut(block, BUT, B_SOFTBODY_BAKE_FREE, ICON_X, "FREE BAKE", 10, 120,300,20, NULL, 0.0, 0.0, 0, 0, "Free baked result");
+ // sprintf(str, "Stored %d vertices %d keys %.3f MB", sb->totpoint, sb->totkey, ((float)16*sb->totpoint*sb->totkey)/(1024.0*1024.0));
+ // uiDefBut(block, LABEL, 0, str, 10, 100,300,20, NULL, 0.0, 0.0, 00, 0, "");
+ // }
+ // else
+ // uiDefBut(block, BUT, B_SOFTBODY_BAKE, "BAKE", 10, 120,300,20, NULL, 0.0, 0.0, 10, 0, "Start baking. Press ESC to exit without baking");
+ //}
+ //else {
/* GENERAL STUFF */
- static char str[128];
if (sb->totpoint){
sprintf(str, "Vertex Mass; Object mass %f [k]",sb->nodemass*sb->totpoint/1000.0f);
}
@@ -2621,8 +3520,8 @@ static void object_softbodies(Object *ob)
/* GOAL STUFF */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, OB_SB_GOAL, B_SOFTBODY_CHANGE, "Use Goal", 10,120,130,20, &ob->softflag, 0, 0, 0, 0, "Define forces for vertices to stick to animated position");
- if (ob->softflag & OB_SB_GOAL){
+ uiDefButBitS(block, TOG, OB_SB_GOAL, B_SOFTBODY_CHANGE, "Use Goal", 10,120,130,20, softflag, 0, 0, 0, 0, "Define forces for vertices to stick to animated position");
+ if (*softflag & OB_SB_GOAL){
if(ob->type==OB_MESH) {
menustr= get_vertexgroup_menustr(ob);
defCount=BLI_countlist(&ob->defbase);
@@ -2656,11 +3555,11 @@ static void object_softbodies(Object *ob)
/* EDGE SPRING STUFF */
if(ob->type!=OB_SURF) {
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, OB_SB_EDGES, B_SOFTBODY_CHANGE, "Use Edges", 10,50,90,20, &ob->softflag, 0, 0, 0, 0, "Use Edges as springs");
- if (ob->softflag & OB_SB_EDGES){
- uiDefButBitS(block, TOG, OB_SB_QUADS, B_SOFTBODY_CHANGE, "Stiff Quads", 110,50,90,20, &ob->softflag, 0, 0, 0, 0, "Adds diagonal springs on 4-gons");
- uiDefButBitS(block, TOG, OB_SB_EDGECOLL, B_DIFF, "CEdge", 220,50,45,20, &ob->softflag, 0, 0, 0, 0, "Edge collide too");
- uiDefButBitS(block, TOG, OB_SB_FACECOLL, B_DIFF, "CFace", 265,50,45,20, &ob->softflag, 0, 0, 0, 0, "Faces collide too SLOOOOOW warning ");
+ uiDefButBitS(block, TOG, OB_SB_EDGES, B_SOFTBODY_CHANGE, "Use Edges", 10,50,90,20, softflag, 0, 0, 0, 0, "Use Edges as springs");
+ if (*softflag & OB_SB_EDGES){
+ uiDefButBitS(block, TOG, OB_SB_QUADS, B_SOFTBODY_CHANGE, "Stiff Quads", 110,50,90,20, softflag, 0, 0, 0, 0, "Adds diagonal springs on 4-gons");
+ uiDefButBitS(block, TOG, OB_SB_EDGECOLL, B_DIFF, "CEdge", 220,50,45,20, softflag, 0, 0, 0, 0, "Edge collide too");
+ uiDefButBitS(block, TOG, OB_SB_FACECOLL, B_DIFF, "CFace", 265,50,45,20, softflag, 0, 0, 0, 0, "Faces collide too SLOOOOOW warning ");
uiDefButF(block, NUM, B_DIFF, "E Stiff:", 10,30,150,20, &sb->inspring, 0.0, 0.999, 10, 0, "Edge spring stiffness");
uiDefButF(block, NUM, B_DIFF, "E Damp:", 160,30,150,20, &sb->infrict, 0.0, 50.0, 10, 0, "Edge spring friction");
uiDefButS(block, NUM, B_DIFF, "Aero:", 10,10,150,20, &sb->aeroedge, 0.00, 30000.0, 10, 0, "Make edges 'sail'");
@@ -2672,163 +3571,730 @@ static void object_softbodies(Object *ob)
}
uiBlockEndAlign(block);
}
+ //}
+ }
+ uiBlockEndAlign(block);
+}
+
+ /* Panels for new particles*/
+static void object_panel_particle_children(Object *ob)
+{
+ uiBlock *block;
+ ParticleSystem *psys = psys_get_current(ob);
+ ParticleSettings *part;
+ short butx=0, buty=160, butw=150, buth=20;
+ static short kink_ui=0;
+
+ if (psys==NULL) return;
+ part=psys->part;
+ if(part==NULL) return;
+
+ block= uiNewBlock(&curarea->uiblocks, "object_panel_particle_child", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed("Extras", "Particle");
+ if(uiNewPanel(curarea, block, "Children", "Particle", 1300, 0, 318, 204)==0) return;
+
+ uiDefButS(block, MENU, B_PART_ALLOC_CHILD, "Children from:%t|Faces%x2|Particles%x1|None%x0", butx,buty,butw/2,buth, &part->childtype, 14.0, 0.0, 0, 0, "Create child particles");
+ uiDefButBitI(block, TOG, PART_CHILD_RENDER, B_PART_RECALC_CHILD, "Only Render", butx+butw/2,buty,butw/2,buth, &part->flag, 0, 0, 0, 0, "Create child particles only when rendering");
+
+ if(part->childtype==0) return;
+
+ if((psys->flag&(PSYS_HAIR_DONE|PSYS_KEYED))==0) {
+ uiDefBut(block, LABEL, 0, "Hair or keyed", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "particles needed!", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ return;
+ }
+
+ uiBlockBeginAlign(block);
+
+ if(part->from!=PART_FROM_PARTICLE && part->childtype==PART_CHILD_FACES) {
+ uiDefButI(block, NUM, B_PART_ALLOC_CHILD, "Amount:", butx,(buty-=2*buth),butw,buth, &part->child_nbr, 0.0, MAX_PART_CHILDREN, 0, 0, "Amount of children/parent");
+ uiDefButF(block, NUMSLI, B_PART_DISTR_CHILD, "VParents:", butx,(buty-=buth),butw,buth, &part->parents, 0.0, 1.0, 1, 3, "Relative amount of virtual parents");
}
+ else {
+ uiDefButI(block, NUM, B_PART_ALLOC_CHILD, "Amount:", butx,(buty-=2*buth),butw,buth, &part->child_nbr, 0.0, MAX_PART_CHILDREN, 0, 0, "Amount of children/parent");
+ uiDefButF(block, NUM, B_PART_RECALC_CHILD, "Rad:", butx,(buty-=buth),butw,buth, &part->childrad, 0.0, 10.0, 1, 3, "Radius of children around parent");
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "Round:", butx,(buty-=buth),butw,buth, &part->childflat, 0.0, 1.0, 1, 3, "Roundness of children around parent");
}
uiBlockEndAlign(block);
+
+ /* clump */
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "Clump:", butx,(buty-=buth),butw,buth, &part->clumpfac, -1.0, 1.0, 1, 3, "Amount of clumpimg");
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "Shape:", butx,(buty-=buth),butw,buth, &part->clumppow, -0.999, 0.999, 1, 3, "Shape of clumpimg");
+ uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_PART_REDRAW, "Size:", butx,(buty-=2*buth),butw/2,buth, &part->childsize, 0.01, 100, 10, 1, "A multiplier for the child particle size");
+ uiDefButF(block, NUM, B_PART_REDRAW, "Rand:", butx+butw/2,buty,butw/2,buth, &part->childrandsize, 0.0, 1.0, 10, 1, "Random variation to the size of the child particles");
+ if(part->childtype==PART_CHILD_FACES) {
+ uiDefButF(block, NUM, B_PART_REDRAW, "Spread:",butx,(buty-=buth),butw/2,buth, &part->childspread, -1.0, 1.0, 10, 1, "Spread children from the faces");
+ uiDefButBitI(block, TOG, PART_CHILD_SEAMS, B_PART_DISTR_CHILD, "Use Seams", butx+butw/2,buty,butw/2,buth, &part->flag, 0, 0, 0, 0, "Use seams to determine parents");
+ }
+ uiBlockEndAlign(block);
+
+ butx=160;
+ buty=180;
+
+
+ uiDefButBitS(block, TOG, 1, B_PART_REDRAW, "Kink/Branch", butx,(buty-=buth),butw,buth, &kink_ui, 0, 0, 0, 0, "Show kink and branch options");
+
+ if(kink_ui) {
+ /* kink */
+ uiBlockBeginAlign(block);
+ if(part->kink) {
+ uiDefButS(block, MENU, B_PART_RECALC_CHILD, "Kink:%t|Roll%x6|Rotation%x5|Braid%x4|Wave%x3|Radial%x2|Curl%x1|Nothing%x0", butx,(buty-=buth),butw/2,buth, &part->kink, 14.0, 0.0, 0, 0, "Type of periodic offset on the path");
+ uiDefButS(block, MENU, B_PART_RECALC_CHILD, "Axis %t|Z %x2|Y %x1|X %x0", butx+butw/2,buty,butw/2,buth, &part->kink_axis, 14.0, 0.0, 0, 0, "Which axis to use for offset");
+ uiDefButF(block, NUM, B_PART_RECALC_CHILD, "Freq:", butx,(buty-=buth),butw,buth, &part->kink_freq, 0.0, 10.0, 1, 3, "The frequency of the offset (1/total length)");
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "Shape:", butx,(buty-=buth),butw,buth, &part->kink_shape, -0.999, 0.999, 1, 3, "Adjust the offset to the beginning/end");
+ uiDefButF(block, NUM, B_PART_RECALC_CHILD, "Amplitude:", butx,(buty-=buth),butw,buth, &part->kink_amp, 0.0, 10.0, 1, 3, "The amplitude of the offset");
+ }
+ else {
+ uiDefButS(block, MENU, B_PART_RECALC_CHILD, "Kink:%t|Roll%x6|Rotation%x5|Braid%x4|Wave%x3|Radial%x2|Curl%x1|Nothing%x0", butx,(buty-=buth),butw,buth, &part->kink, 14.0, 0.0, 0, 0, "Type of periodic offset on the path");
+ buty-=3*buth;
+ }
+ uiBlockEndAlign(block);
+
+ if(part->childtype==PART_CHILD_PARTICLES) {
+ if(part->flag & PART_BRANCHING) {
+ uiDefButBitI(block, TOG, PART_BRANCHING, B_PART_RECALC_CHILD, "Branching", butx,(buty-=2*buth),butw,buth, &part->flag, 0, 0, 0, 0, "Branch child paths from eachother");
+ uiDefButBitI(block, TOG, PART_ANIM_BRANCHING, B_PART_RECALC_CHILD, "Animated", butx,(buty-=buth),butw/2,buth, &part->flag, 0, 0, 0, 0, "Animate branching");
+ uiDefButBitI(block, TOG, PART_SYMM_BRANCHING, B_PART_RECALC_CHILD, "Symmetric", butx+butw/2,buty,butw/2,buth, &part->flag, 0, 0, 0, 0, "Start and end points are the same");
+ uiDefButF(block, NUM, B_PART_RECALC_CHILD, "Threshold:", butx,(buty-=buth),butw,buth, &part->branch_thres, 0.0, 1.0, 1, 3, "Threshold of branching");
+ }
+ else
+ uiDefButBitI(block, TOG, PART_BRANCHING, B_PART_RECALC_CHILD, "Branching", butx,(buty-=2*buth),butw,buth, &part->flag, 0, 0, 0, 0, "Branch child paths from eachother");
+ }
+ }
+ else {
+ /* rough */
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "Rough1:", butx,(buty-=2*buth),butw,buth, &part->rough1, 0.0, 10.0, 1, 3, "Amount of location dependant rough");
+ uiDefButF(block, NUM, B_PART_RECALC_CHILD, "Size1:", butx,(buty-=buth),butw,buth, &part->rough1_size, 0.01, 10.0, 1, 3, "Size of location dependant rough");
+ uiBlockEndAlign(block);
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "Rough2:", butx,(buty-=buth),butw,buth, &part->rough2, 0.0, 10.0, 1, 3, "Amount of random rough");
+ uiDefButF(block, NUM, B_PART_RECALC_CHILD, "Size2:", butx,(buty-=buth),butw,buth, &part->rough2_size, 0.01, 10.0, 1, 3, "Size of random rough");
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "Thresh:", butx,(buty-=buth),butw,buth, &part->rough2_thres, 0.00, 1.0, 1, 3, "Amount of particles left untouched by random rough");
+ uiBlockEndAlign(block);
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "RoughE:", butx,(buty-=buth),butw,buth, &part->rough_end, 0.0, 10.0, 1, 3, "Amount of end point rough");
+ uiDefButF(block, NUMSLI, B_PART_RECALC_CHILD, "Shape:", butx,(buty-=buth),butw,buth, &part->rough_end_shape, 0.0, 10.0, 1, 3, "Shape of end point rough");
+ uiBlockEndAlign(block);
+ }
}
+static void particle_set_vg(void *ob_v, void *vgnum_v)
+{
+ Object *ob= ob_v;
+ ParticleSystem *psys=psys_get_current(ob);
+ short vgnum = *((short *)vgnum_v);
+
+ if(vgnum==PSYS_VG_DENSITY)
+ psys->recalc|=PSYS_DISTR;
+ else if(vgnum!=PSYS_VG_SIZE)
+ psys->recalc|=PSYS_INIT;
-static void object_panel_particles_motion(Object *ob)
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+}
+static void particle_del_vg(void *ob_v, void *vgnum_v)
+{
+ Object *ob= ob_v;
+ ParticleSystem *psys=psys_get_current(ob);
+ short vgnum = *((short *)vgnum_v);
+
+ if(vgnum==PSYS_VG_DENSITY) {
+ psys->recalc|=PSYS_DISTR;
+ }
+
+ psys->vgroup[vgnum]=0;
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+}
+static void object_panel_particle_extra(Object *ob)
{
uiBlock *block;
uiBut *but;
- PartEff *paf= give_parteff(ob);
-
- if (paf==NULL) return;
+ ParticleSystem *psys=psys_get_current(ob);
+ ParticleSettings *part;
+ short butx=0, buty=160, butw=150, buth=20;
+ static short vgnum=0;
+ int event;
+
+ if (psys==NULL) return;
+ part=psys->part;
+ if(part==NULL) return;
- block= uiNewBlock(&curarea->uiblocks, "object_panel_particles_motion", UI_EMBOSS, UI_HELV, curarea->win);
- uiNewPanelTabbed("Particles ", "Physics");
- if(uiNewPanel(curarea, block, "Particle Motion", "Physics", 320, 0, 318, 204)==0) return;
-
- uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
-
- /* top row */
+ block= uiNewBlock(&curarea->uiblocks, "object_panel_particle_extra", UI_EMBOSS, UI_HELV, curarea->win);
+ if(uiNewPanel(curarea, block, "Extras", "Particle", 980, 0, 318, 204)==0) return;
+
+ uiDefBut(block, LABEL, 0, "Effectors:", butx,buty,butw,buth, NULL, 0.0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButI(block, NUM, B_CALCEFFECT, "Keys:", 0,180,75,20, &paf->totkey, 1.0, 100.0, 0, 0, "Specify the number of key positions");
- uiDefButBitS(block, TOG, PAF_BSPLINE, B_CALCEFFECT, "Bspline", 75,180,75,20, &paf->flag, 0, 0, 0, 0, "Use B spline formula for particle interpolation");
- uiDefButI(block, NUM, B_CALCEFFECT, "Seed:", 150,180,75,20, &paf->seed, 0.0, 255.0, 0, 0, "Set an offset in the random table");
- uiDefButF(block, NUM, B_CALCEFFECT, "RLife:", 225,180,85,20, &paf->randlife, 0.0, 2.0, 10, 1, "Give the particlelife a random variation");
+ uiDefIDPoinBut(block, test_grouppoin_but, ID_GR, B_PART_RECALC, "GR:", butx, (buty-=buth), butw/2, buth, &part->eff_group, "Limit effectors to this Group");
+ uiDefButBitI(block, TOG, PART_SIZE_DEFL, B_PART_RECALC, "Size Deflect", butx+butw/2,buty,butw/2,buth, &part->flag, 0, 0, 0, 0, "Use particle's size in deflection");
+ uiDefButBitI(block, TOG, PART_DIE_ON_COL, B_PART_RECALC, "Die on hit",butx,(buty-=buth),butw/2,buth, &part->flag, 0, 0, 0, 0, "Particles die when they collide with a deflector object");
+ uiDefButBitI(block, TOG, PART_STICKY, B_PART_RECALC, "Sticky", butx+butw/2,buty,butw/2,buth, &part->flag, 0, 0, 0, 0, "Particles stick to collided objects if they die in the collision");
uiBlockEndAlign(block);
-
- /* left collumn */
- uiDefBut(block, LABEL, 0, "Velocity:", 0,160,150,20, NULL, 0.0, 0, 0, 0, "");
+
+ uiDefBut(block, LABEL, 0, "Time:", butx,(buty-=buth),butw/3,buth, NULL, 0.0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiBlockSetCol(block, TH_BUT_SETTING2);
- uiDefButF(block, NUM, B_CALCEFFECT, "Normal:", 0,140,150,18, &paf->normfac, -2.0, 2.0, 1, 3, "Let the mesh give the particle a starting speed");
- uiDefButF(block, NUM, B_CALCEFFECT, "Object:", 0,122,150,18, &paf->obfac, -1.0, 1.0, 1, 3, "Let the object give the particle a starting speed");
- uiDefButF(block, NUM, B_CALCEFFECT, "Random:", 0,104,150,18, &paf->randfac, 0.0, 2.0, 1, 3, "Give the startingspeed a random variation");
- uiDefButF(block, NUM, B_CALCEFFECT, "Texture:", 0,86,150,18, &paf->texfac, 0.0, 2.0, 1, 3, "Let the texture give the particle a starting speed");
- uiDefButF(block, NUM, B_CALCEFFECT, "Damping:", 0,68,150,18, &paf->damp, 0.0, 1.0, 1, 3, "Specify the damping factor");
- uiBlockSetCol(block, TH_AUTO);
- but=uiDefBut(block, TEX, B_PAF_SET_VG1, "VGroup:", 0,50,150,18, paf->vgroupname_v, 0, 31, 0, 0, "Name of vertex group to use for speed control");
- uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)OBACT);
+ uiDefButBitI(block, TOG, PART_GLOB_TIME, B_PART_RECALC, "Global", butx,(buty-=buth),butw/2,buth, &part->flag, 0, 0, 0, 0, "Set all ipos that work on particles to be calculated in global/object time");
+ uiDefButBitI(block, TOG, PART_ABS_TIME, B_PART_RECALC, "Absolute", butx+butw/2,buty,butw/2,buth, &part->flag, 0, 0, 0, 0, "Set all ipos that work on particles to be calculated in absolute/relative time");
+
+ if(part->flag & PART_LOOP){
+ uiDefButBitI(block, TOG, PART_LOOP, B_PART_RECALC, "Loop", butx,(buty-=buth),butw/2,buth, &part->flag, 0, 0, 0, 0, "Loop particle lives");
+ uiDefButBitI(block, TOG, PART_LOOP_INSTANT, B_PART_RECALC, "Instantly", butx+butw/2,buty,butw/2,buth, &part->flag, 0, 0, 0, 0, "Loop particle life at time of death");
+ }
+ else
+ uiDefButBitI(block, TOG, PART_LOOP, B_PART_RECALC, "Loop", butx,(buty-=buth),butw,buth, &part->flag, 0, 0, 0, 0, "Loop particle lives");
+
+ uiDefButF(block, NUM, B_PART_RECALC, "Tweak:", butx,(buty-=buth),butw,buth, &part->timetweak, 0.0, 10.0, 1, 0, "A multiplier for physics timestep (1.0 means one frame = 1/25 seconds)");
uiBlockEndAlign(block);
+
+ if(ob->type==OB_MESH) {
+ char *menustr= get_vertexgroup_menustr(ob);
+ int defCount=BLI_countlist(&ob->defbase);
+ if(defCount==0) psys->vgroup[vgnum]= 0;
+
+ uiDefBut(block, LABEL, 0, "Vertex group:", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+
+ uiBlockBeginAlign(block);
+
+ uiDefButS(block, MENU, B_PART_REDRAW, "Attribute%t|TanRot%x10|TanVel%x9|Size%x8|RoughE%x7|Rough2%x6|Rough1%x5|Kink%x4|Clump%x3|Length%x2|Velocity%x1|Density%x0", butx,(buty-=buth),butw-40,buth, &vgnum, 14.0, 0.0, 0, 0, "Attribute effected by vertex group");
+ but=uiDefButBitS(block, TOG, (1<<vgnum), B_PART_REDRAW, "Neg", butx+butw-40,buty,40,buth, &psys->vg_neg, 0, 0, 0, 0, "Negate the effect of the vertex group");
+ uiButSetFunc(but, particle_set_vg, (void *)psys, (void *)(&vgnum));
+
+ butx+=butw;
+
+ uiDefButS(block, MENU, B_PART_REDRAW, menustr, butx,buty,buth,buth, psys->vgroup+vgnum, 0, defCount, 0, 0, "Browses available vertex groups");
+ uiButSetFunc(but, particle_set_vg, (void *)ob, (void *)(&vgnum));
+ MEM_freeN (menustr);
+
+ if(psys->vgroup[vgnum]) {
+ bDeformGroup *defGroup = BLI_findlink(&ob->defbase, psys->vgroup[vgnum]-1);
+ if(defGroup)
+ uiDefBut(block, BUT, B_PART_REDRAW, defGroup->name, butx+buth,buty,butw-2*buth,buth, NULL, 0.0, 0.0, 0, 0, "Name of current vertex group");
+ else{
+ uiDefBut(block, BUT, B_PART_REDRAW, "(no group)", butx+buth,buty,butw-2*buth,buth, NULL, 0.0, 0.0, 0, 0, "Vertex Group doesn't exist anymore");
+ }
+ but=uiDefIconBut(block, BUT, B_PART_REDRAW, ICON_X, butx+butw-buth,buty,buth,buth, 0, 0, 0, 0, 0, "Disable use of vertex group");
+ uiButSetFunc(but, particle_del_vg, (void *)ob, (void *)(&vgnum));
+ }
+
+ uiBlockEndAlign(block);
+ }
- uiDefBut(block, LABEL, 0, "Texture Emission", 0,30,150,20, NULL, 0.0, 0, 0, 0, "");
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG3, PAF_TEXTIME, B_CALCEFFECT, "TexEmit", 0,10,75,20, &(paf->flag2), 0, 0, 0, 0, "Use a texture to define emission of particles");
- uiDefButS(block, NUM, B_CALCEFFECT, "Tex:", 75,10,75,20, &paf->timetex, 1.0, 10.0, 0, 0, "Specify texture used for the texture emission");
+ buty=butx=160;
+
+ uiDefButI(block, NUM, B_PART_DISTR, "Seed:", butx,(buty-=buth),butw,buth, &psys->seed, 0.0, 255.0, 1, 0, "Set an offset in the random table");
+
+ event=(part->flag&PART_SIZEMASS)?B_PART_RECALC:B_PART_REDRAW;
+ uiDefButF(block, NUM, event, "Size:", butx,(buty-=2*buth),butw,buth, &part->size, 0.01, 100, 10, 1, "The size of the particles");
+ uiDefButF(block, NUM, event, "Rand:", butx,(buty-=buth),butw,buth, &part->randsize, 0.0, 2.0, 10, 1, "Give the particle size a random variation");
+
+ uiDefButBitI(block, TOG, PART_SIZEMASS, B_PART_RECALC, "Mass from size", butx,(buty-=buth),butw,buth, &part->flag, 0, 0, 0, 0, "Multiply mass with particle size");
+ uiDefButF(block, NUM, B_PART_RECALC, "Mass:", butx,(buty-=buth),butw,buth, &part->mass, 0.01, 100, 10, 1, "Specify the mass of the particles");
+}
+/* copy from buttons_shading.c */
+static void autocomplete_uv(char *str, void *arg_v)
+{
+ Mesh *me;
+ CustomDataLayer *layer;
+ AutoComplete *autocpl;
+ int a;
+
+ if(str[0]==0)
+ return;
+
+ autocpl= autocomplete_begin(str, 32);
+
+ /* search if str matches the beginning of name */
+ for(me= G.main->mesh.first; me; me=me->id.next)
+ for(a=0, layer= me->fdata.layers; a<me->fdata.totlayer; a++, layer++)
+ if(layer->type == CD_MTFACE)
+ autocomplete_do_name(autocpl, layer->name);
- /* right collumn */
- uiDefIDPoinBut(block, test_grouppoin_but, ID_GR, B_CALCEFFECT, "GR:", 160, 155, 150, 20, &paf->group, "Limit Force Fields to this Group");
+ autocomplete_end(autocpl, str);
+}
+static void object_panel_particle_visual(Object *ob)
+{
+ uiBlock *block;
+ uiBut *but;
+ ParticleSystem *psys=psys_get_current(ob);
+ ParticleSettings *part;
+ short butx=0, buty=160, butw=150, buth=20;
+ static short bbuvnum=0;
+
+ if (psys==NULL) return;
+ part=psys->part;
+ if(part==NULL) return;
+
+ block= uiNewBlock(&curarea->uiblocks, "object_panel_particle_visual", UI_EMBOSS, UI_HELV, curarea->win);
+ if(uiNewPanel(curarea, block, "Visualization", "Particle", 640, 0, 318, 204)==0) return;
+
+ uiDefButS(block, MENU, B_PART_RECALC, "Billboard %x9|Group %x8|Object %x7|Path %x6|Line %x5|Axis %x4|Cross %x3|Circle %x2|Point %x1|None %x0", butx,buty,butw,buth, &part->draw_as, 14.0, 0.0, 0, 0, "How particles are visualized");
+
+ if(part->draw_as==PART_DRAW_NOT) {
+ uiDefButBitS(block, TOG, PART_DRAW_EMITTER, B_PART_REDRAW, "Render emitter", butx,(buty-=2*buth),butw,buth, &part->draw, 0, 0, 0, 0, "Render emitter object");
+ return;
+ }
+ uiDefBut(block, LABEL, 0, "Draw:", butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefBut(block, LABEL, 0, "Force:", 160,130,75,20, NULL, 0.0, 0, 0, 0, "");
- uiDefButF(block, NUM, B_CALCEFFECT, "X:", 235,130,75,20, paf->force, -1.0, 1.0, 1, 2, "Specify the X axis of a continues force");
- uiDefButF(block, NUM, B_CALCEFFECT, "Y:", 160,110,75,20, paf->force+1,-1.0, 1.0, 1, 2, "Specify the Y axis of a continues force");
- uiDefButF(block, NUM, B_CALCEFFECT, "Z:", 235,110,75,20, paf->force+2, -1.0, 1.0, 1, 2, "Specify the Z axis of a continues force");
-
+ uiDefButBitS(block, TOG, PART_DRAW_VEL, B_PART_REDRAW, "Vel", butx,(buty-=buth),butw/3,buth, &part->draw, 0, 0, 0, 0, "Show particle velocity");
+ uiDefButBitS(block, TOG, PART_DRAW_SIZE, B_PART_REDRAW, "Size", butx+butw/3,buty,butw/3,buth, &part->draw, 0, 0, 0, 0, "Show particle size");
+ uiDefButBitS(block, TOG, PART_DRAW_NUM, B_PART_REDRAW, "Num", butx+2*butw/3,buty,butw/3,buth, &part->draw, 0, 0, 0, 0, "Show particle number");
+ uiDefButS(block, NUM, B_PART_REDRAW, "Draw Size:", butx,(buty-=buth),butw,buth, &part->draw_size, 0.0, 10.0, 0, 0, "Size of particles on viewport in pixels (0=default)");
+ uiDefButS(block, NUM, B_PART_RECALC, "Disp:", butx,(buty-=buth),butw,buth, &part->disp, 0.0, 100.0, 10, 0, "Percentage of particles to calculate for 3d view");
+ uiBlockEndAlign(block);
+
+ uiDefBut(block, LABEL, 0, "Render:", butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_CALCEFFECT, "Tex:", 160,80,75,20, &paf->speedtex, 1.0, 10.0, 0, 2, "Specify the texture used for force");
- uiDefButF(block, NUM, B_CALCEFFECT, "X:", 235,80,75,20, paf->defvec, -1.0, 1.0, 1, 2, "Specify the X axis of a force, determined by the texture");
- uiDefButF(block, NUM, B_CALCEFFECT, "Y:", 160,60,75,20, paf->defvec+1,-1.0, 1.0, 1, 2, "Specify the Y axis of a force, determined by the texture");
- uiDefButF(block, NUM, B_CALCEFFECT, "Z:", 235,60,75,20, paf->defvec+2, -1.0, 1.0, 1, 2, "Specify the Z axis of a force, determined by the texture");
-
+ uiDefButS(block, NUM, B_PART_DISTR, "Material:", butx,(buty-=buth),butw-30,buth, &part->omat, 1.0, 16.0, 0, 0, "Specify material used for the particles");
+ uiDefButBitS(block, TOG, PART_DRAW_MAT_COL, B_PART_REDRAW, "Col", butx+butw-30,buty,30,buth, &part->draw, 0, 0, 0, 0, "Draw particles using material's diffuse color");
+ uiDefButBitS(block, TOG, PART_DRAW_EMITTER, B_PART_REDRAW, "Emitter", butx,(buty-=buth),butw/2,buth, &part->draw, 0, 0, 0, 0, "Render emitter Object also");
+ uiDefButBitS(block, TOG, PART_DRAW_PARENT, B_PART_REDRAW, "Parents", butx+butw/2,buty,butw/2,buth, &part->draw, 0, 0, 0, 0, "Render parent particles");
+ uiDefButBitI(block, TOG, PART_UNBORN, B_PART_REDRAW, "Unborn", butx,(buty-=buth),butw/2,buth, &part->flag, 0, 0, 0, 0, "Show particles before they are emitted");
+ uiDefButBitI(block, TOG, PART_DIED, B_PART_REDRAW, "Died", butx+butw/2,buty,butw/2,buth, &part->flag, 0, 0, 0, 0, "Show particles after they have died");
+
+ uiBlockEndAlign(block);
+
+ butx=160;
+ buty=160-buth;
+
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_CALCEFFECT, "Int", 160,30,50,20, &paf->texmap, 14.0, 0.0, 0, 0, "Use texture intensity as a factor for texture force");
- uiDefButS(block, ROW, B_CALCEFFECT, "RGB", 210,30,50,20, &paf->texmap, 14.0, 1.0, 0, 0, "Use RGB values as a factor for particle speed vector");
- uiDefButS(block, ROW, B_CALCEFFECT, "Grad", 260,30,50,20, &paf->texmap, 14.0, 2.0, 0, 0, "Use texture gradient as a factor for particle speed vector");
-
- uiDefButF(block, NUM, B_CALCEFFECT, "Nabla:", 160,10,150,20, &paf->nabla, 0.0001f, 1.0, 1, 0, "Specify the dimension of the area for gradient calculation");
-
+
+ switch(part->draw_as) {
+ case PART_DRAW_OB:
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_PART_REDRAW, "OB:", butx,(buty-=buth),butw,buth, &part->dup_ob, "Show this Object in place of particles");
+ break;
+ case PART_DRAW_GR:
+ uiDefIDPoinBut(block, test_grouppoin_but, ID_GR, B_PART_REDRAW, "GR:", butx,(buty-=buth),butw,buth, &part->dup_group, "Show Objects in this Group in place of particles");
+ uiDefButBitS(block, TOG, PART_DRAW_WHOLE_GR, B_PART_REDRAW, "Dupli Group", butx,(buty-=buth),butw,buth, &part->draw, 0, 0, 0, 0, "Use whole group at once");
+ if((part->draw & PART_DRAW_WHOLE_GR)==0)
+ uiDefButBitS(block, TOG, PART_DRAW_RAND_GR, B_PART_REDRAW, "Pick Random", butx,(buty-=buth),butw,buth, &part->draw, 0, 0, 0, 0, "Pick objects from group randomly");
+ break;
+ case PART_DRAW_BB:
+ uiDefButBitS(block, TOG, PART_DRAW_BB_LOCK, B_PART_REDRAW, "Lock", butx,(buty+=buth),butw/2,buth, &part->draw, 0, 0, 0, 0, "Lock the billboards align axis");
+ uiDefButS(block, MENU, B_PART_REDRAW, "Align to%t|Velocity%x4|View%x3|Z%x2|Y%x1|X%x0", butx+butw/2,buty,butw/2,buth, &part->bb_align, 14.0, 0.0, 0, 0, "In respect to what the billboards are aligned");
+ uiDefButF(block, NUM, B_PART_REDRAW, "Tilt:", butx,(buty-=buth),butw/2,buth, &part->bb_tilt, -1.0, 1.0, 0, 0, "Tilt of the billboards");
+ uiDefButF(block, NUM, B_PART_REDRAW, "Rand:", butx+butw/2,buty,butw/2,buth, &part->bb_rand_tilt, 0.0, 1.0, 0, 0, "Random tilt of the billboards");
+ uiDefButS(block, NUM, B_PART_REDRAW, "UV Split:", butx,(buty-=buth),butw,buth, &part->bb_uv_split, 1.0, 10.0, 0, 0, "Amount of rows/columns to split uv coordinates for billboards");
+ uiDefButS(block, MENU, B_PART_REDRAW, "Animate%t|Angle%x2|Time%x1|None%x0", butx,(buty-=buth),butw/2,buth, &part->bb_anim, 14.0, 0.0, 0, 0, "How to animate billboard textures");
+ uiDefButS(block, MENU, B_PART_REDRAW, "Offset%t|Random%x2|Linear%x1|None%x0", butx+butw/2,buty,butw/2,buth, &part->bb_split_offset, 14.0, 0.0, 0, 0, "How to offset billboard textures");
+ uiDefButF(block, NUM, B_PART_REDRAW, "OffsetX:", butx,(buty-=buth),butw,buth, part->bb_offset, -1.0, 1.0, 0, 0, "Offset billboards horizontally");
+ uiDefButF(block, NUM, B_PART_REDRAW, "OffsetY:", butx,(buty-=buth),butw,buth, part->bb_offset+1, -1.0, 1.0, 0, 0, "Offset billboards vertically");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_PART_REDRAW, "OB:", butx,(buty-=buth),butw,buth, &part->bb_ob, "Billboards face this object (default is active camera)");
+ uiDefButS(block, MENU, B_PART_REDRAW, "UV channel%t|Split%x2|Time-Index (X-Y)%x1|Normal%x0", butx,(buty-=buth),butw,buth, &bbuvnum, 14.0, 0.0, 0, 0, "UV channel");
+ but=uiDefBut(block, TEX, B_PART_REDRAW, "UV:", butx,(buty-=buth),butw,buth, psys->bb_uvname+bbuvnum, 0, 31, 0, 0, "Set name of UV layer to use with billboards, default is active UV layer");
+ uiButSetCompleteFunc(but, autocomplete_uv, NULL);
+ break;
+ case PART_DRAW_LINE:
+ uiDefButBitS(block, TOG, PART_DRAW_VEL_LENGTH, B_PART_REDRAW, "Speed", butx,(buty-=buth),butw,buth, &part->draw, 0, 0, 0, 0, "Multiply line length by particle speed");
+ uiDefButF(block, NUM, B_PART_REDRAW, "Back:", butx,(buty-=buth),butw,buth, &part->draw_line[0], 0.0, 10.0, 0, 0, "Length of the line's tail");
+ uiDefButF(block, NUM, B_PART_REDRAW, "Front:", butx,(buty-=buth),butw,buth, &part->draw_line[1], 0.0, 10.0, 0, 0, "Length of the line's head");
+ break;
+ case PART_DRAW_PATH:
+ if(psys->flag & (PSYS_HAIR_DONE|PSYS_KEYED)) {
+ uiDefButS(block, NUM, B_PART_RECALC, "Steps:", butx,(buty+=buth),butw,buth, &part->draw_step, 0.0, 7.0, 0, 0, "How many steps paths are drawn with (power of 2)");
+ uiDefButS(block, NUM, B_PART_REDRAW, "Render:", butx,(buty-=buth),butw,buth, &part->ren_step, 0.0, 9.0, 0, 0, "How many steps paths are rendered with (power of 2)");
+
+ uiDefButBitI(block, TOG, PART_ABS_LENGTH, B_PART_RECALC, "Abs Length", butx,(buty-=buth),butw,buth, &part->flag, 0, 0, 0, 0, "Use maximum length in absolute blender units");
+ uiDefButF(block, NUM, B_PART_RECALC, "Max Length:", butx,(buty-=buth),butw,buth, &part->abslength, 0.0, 10000.0, 1, 3, "Absolute path length");
+ uiDefButF(block, NUMSLI, B_PART_RECALC, "RLength:", butx,(buty-=buth),butw,buth, &part->randlength, 0.0, 1.0, 1, 3, "Give path length a random variation");
+ uiBlockEndAlign(block);
+
+ uiDefButBitI(block, TOG, PART_HAIR_BSPLINE, B_PART_RECALC, "B-Spline", butx,(buty-=buth),butw,buth, &part->flag, 0, 0, 0, 0, "Interpolate hair using B-Splines");
+
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, PART_DRAW_REN_ADAPT, B_PART_REDRAW, "Adaptive render", butx,buty-=buth,butw,buth, &part->draw, 0, 0, 0, 0, "Draw steps of the particle path");
+ if(part->draw & PART_DRAW_REN_ADAPT) {
+ uiDefButS(block, NUM, B_PART_REDRAW, "Angle:", butx,(buty-=buth),butw,buth, &part->adapt_angle, 0.0, 45.0, 0, 0, "How many degrees path has to curve to make another render segment");
+ uiDefButS(block, NUM, B_PART_REDRAW, "Pixel:", butx,(buty-=buth),butw,buth, &part->adapt_pix, 0.0, 50.0, 0, 0, "How many pixels path has to cover to make another render segment");
+ }
+ }
+ else {
+ uiDefBut(block, LABEL, 0, "Baked or keyed", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "particles needed!", butx,(buty-=2*buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ }
+ break;
+ }
+ uiBlockEndAlign(block);
}
+static void boidrule_moveDown(void *part_v, void *rule_v)
+{
+ ParticleSettings *part = part_v;
+ char r, *rule = rule_v;
+ int n= rule - part->boidrule;
-static void object_panel_particles(Object *ob)
+ if(n+1 < BOID_TOT_RULES) {
+ r=part->boidrule[n];
+ part->boidrule[n]=part->boidrule[n+1];
+ part->boidrule[n+1]=r;
+ }
+}
+static void boidrule_moveUp(void *part_v, void *rule_v)
+{
+ ParticleSettings *part = part_v;
+ char r, *rule = rule_v;
+
+ int n= rule - part->boidrule;
+
+ if(n-1 >= 0) {
+ r=part->boidrule[n];
+ part->boidrule[n]=part->boidrule[n-1];
+ part->boidrule[n-1]=r;
+ }
+}
+static void object_panel_particle_physics(Object *ob)
{
uiBlock *block;
uiBut *but;
- PartEff *paf= give_parteff(ob);
+ ParticleSystem *psys=psys_get_current(ob);
+ ParticleSettings *part;
+ short butx=0, buty=160, butw=150, buth=20;
+
+ if (psys==NULL) return;
- /* the panelname "Particles " has a space to exclude previous saved panel "Particles" */
- block= uiNewBlock(&curarea->uiblocks, "object_panel_particles", UI_EMBOSS, UI_HELV, curarea->win);
- if(uiNewPanel(curarea, block, "Particles ", "Physics", 320, 0, 318, 204)==0) return;
+ part=psys->part;
- uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
+ if(part==NULL) return;
+
+ block= uiNewBlock(&curarea->uiblocks, "object_panel_particle_physics", UI_EMBOSS, UI_HELV, curarea->win);
+ if(uiNewPanel(curarea, block, "Physics", "Particle", 320, 0, 318, 204)==0) return;
- if (ob->type == OB_MESH) {
+ if(ob->id.lib) uiSetButLock(1, "Can't edit library data");
+
+ if(psys->flag & PSYS_EDITED || psys->flag & PSYS_PROTECT_CACHE) {
+ uiSetButLock(1, "Hair is edited or cache is protected!");
+ }
+
+ if(part->phystype==PART_PHYS_KEYED){
uiBlockBeginAlign(block);
- if(paf==NULL)
- uiDefBut(block, BUT, B_NEWEFFECT, "NEW", 0,180,75,20, 0, 0, 0, 0, 0, "Create a new Particle effect");
- else
- uiDefBut(block, BUT, B_DELEFFECT, "Delete", 0,180,75,20, 0, 0, 0, 0, 0, "Delete the effect");
+ uiDefButBitI(block, TOG, PSYS_FIRST_KEYED, B_PART_RECALC, "First", butx,buty,45,buth, &psys->flag, 0, 0, 0, 0, "Sets the system to be the starting point of keyed particles");
+ uiDefButS(block, MENU, B_PART_RECALC, "Physics %t|Boids%x3|Keyed %x2|Newtonian %x1|None %x0", butx+45,buty,butw-45,buth, &part->phystype, 14.0, 0.0, 0, 0, "Select particle physics type");
+ uiBlockEndAlign(block);
}
- else uiDefBut(block, LABEL, 0, "Only Mesh Objects can generate particles", 10,180,300,20, NULL, 0.0, 0, 0, 0, "");
-
-
- if(paf==NULL) return;
-
- uiDefBut(block, BUT, B_RECALCAL, "RecalcAll", 75,180,75,20, 0, 0, 0, 0, 0, "Update all particle systems");
- uiBlockEndAlign(block);
-
- uiDefBut(block, LABEL, 0, "Emit:", 0,150,75,20, NULL, 0.0, 0, 0, 0, "");
- uiBlockBeginAlign(block);
- uiDefButI(block, NUM, B_CALCEFFECT, "Amount:", 0,130,150,20, &paf->totpart, 1.0, 100000.0, 0, 0, "The total number of particles");
- if(paf->flag & PAF_STATIC) {
- uiDefButS(block, NUM, REDRAWVIEW3D, "Step:", 0,110,150,20, &paf->staticstep, 1.0, 100.0, 10, 0, "For static duplicators, the Step value skips particles");
+ else
+ uiDefButS(block, MENU, B_PART_RECALC, "Physics%t|Boids%x3|Keyed%x2|Newtonian%x1|None%x0", butx,buty,butw,buth, &part->phystype, 14.0, 0.0, 0, 0, "Select particle physics type");
+
+ if(part->phystype==PART_PHYS_BOIDS) {
+ int i;
+ char *rules[BOID_TOT_RULES] = {"Collision", "Avoid", "Crowd", "Center", "AvVel", "Velocity", "Goal", "Level"};
+ char *ruletext[BOID_TOT_RULES] = {
+ "Avoid deflector objects",
+ "Avoid predators",
+ "Avoid other boids",
+ "Get to flock center",
+ "Maintain average velocity",
+ "Match velocity of nearby boids",
+ "Seek goal",
+ "Keep the Z level"
+ };
+ /* left column */
+ uiDefBut(block, LABEL, 0, "Behaviour:", butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ for(i=0; i<BOID_TOT_RULES; i++) {
+ uiBlockSetCol(block, TH_BUT_ACTION);
+
+ but = uiDefIconBut(block, BUT, B_PART_RECALC, VICON_MOVE_UP, butx, (buty-=buth), 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Move rule up");
+ uiButSetFunc(but, boidrule_moveUp, part, part->boidrule+i);
+
+ but = uiDefIconBut(block, BUT, B_PART_RECALC, VICON_MOVE_DOWN, butx+20, buty, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Move rule down");
+ uiButSetFunc(but, boidrule_moveDown, part, part->boidrule+i);
+
+ uiBlockSetCol(block, TH_BUT_SETTING2);
+
+ uiDefButF(block, NUM, B_PART_RECALC, rules[part->boidrule[i]], butx+40,buty,butw-40,buth, part->boidfac+part->boidrule[i], -1.0, 2.0, 1, 3, ruletext[part->boidrule[i]]);
+ }
+ uiBlockSetCol(block, TH_AUTO);
+ uiBlockEndAlign(block);
+
+ buty=140;
+ butx=160;
+
+ uiDefBut(block, LABEL, 0, "Physics:", butx,buty,butw,buth, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, PART_BOIDS_2D, B_PART_RECALC, "2D", butx,(buty-=buth),butw,buth, &part->flag, 0, 0, 0, 0, "Constrain boids to a surface");
+ uiDefButF(block, NUM, B_PART_RECALC, "MaxVelocity:", butx,(buty-=buth),butw,buth, &part->max_vel, 0.0, 200.0, 1, 3, "Maximum velocity");
+ uiDefButF(block, NUM, B_PART_RECALC, "AvVelocity:", butx,(buty-=buth),butw,buth, &part->average_vel, 0.0, 1.0, 1, 3, "The usual speed % of max velocity");
+ uiDefButF(block, NUM, B_PART_RECALC, "LatAcc:", butx,(buty-=buth),butw,buth, &part->max_lat_acc, 0.0, 1.0, 1, 3, "Lateral acceleration % of max velocity");
+ uiDefButF(block, NUM, B_PART_RECALC, "TanAcc:", butx,(buty-=buth),butw,buth, &part->max_tan_acc, 0.0, 1.0, 1, 3, "Tangential acceleration % of max velocity");
+ if(part->flag & PART_BOIDS_2D) {
+ uiDefButF(block, NUM, B_PART_RECALC, "GroundZ:", butx,(buty-=buth),butw,buth, &part->groundz, -100.0, 100.0, 1, 3, "Default Z value");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_PARTTARGET, "OB:", butx,(buty-=buth),butw,buth, &psys->keyed_ob, "Constrain boids to object's surface");
+ }
+ else {
+ uiDefButF(block, NUM, B_PART_RECALC, "Banking:", butx,(buty-=buth),butw,buth, &part->banking, -10.0, 10.0, 1, 3, "Banking of boids on turns (1.0==natural banking)");
+ uiDefButF(block, NUM, B_PART_RECALC, "MaxBank:", butx,(buty-=buth),butw,buth, &part->max_bank, 0.0, 1.0, 1, 3, "How much a boid can bank at a single step");
+ }
+ uiBlockEndAlign(block);
+ uiDefButS(block, NUM, B_PART_RECALC, "N:", butx,(buty-=buth),butw,buth, &part->boidneighbours, 1.0, 10.0, 1, 3, "How many neighbours to consider for each boid");
}
else {
- uiDefButF(block, NUM, B_CALCEFFECT, "Sta:", 0,110,75,20, &paf->sta, -250.0, MAXFRAMEF, 100, 1, "Frame # to start emitting particles");
- uiDefButF(block, NUM, B_CALCEFFECT, "End:", 75,110,75,20, &paf->end, 1.0, MAXFRAMEF, 100, 1, "Frame # to stop emitting particles");
+ /* left column */
+ uiDefBut(block, LABEL, 0, "Initial velocity:", butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiBlockSetCol(block, TH_BUT_SETTING2);
+ uiDefButF(block, NUM, B_PART_RECALC, "Object:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->obfac, -1.0, 1.0, 1, 3, "Let the object give the particle a starting speed");
+ uiDefButF(block, NUM, B_PART_RECALC, "Normal:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->normfac, -200.0, 200.0, 1, 3, "Let the surface normal give the particle a starting speed");
+ uiDefButF(block, NUM, B_PART_RECALC, "Random:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->randfac, 0.0, 200.0, 1, 3, "Give the starting speed a random variation");
+ if(part->type==PART_REACTOR) {
+ uiDefButF(block, NUM, B_PART_RECALC, "Particle:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->partfac, -10.0, 10.0, 1, 3, "Let the target particle give the particle a starting speed");
+ uiDefButF(block, NUM, B_PART_RECALC, "Reactor:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->reactfac, -10.0, 10.0, 1, 3, "Let the vector from target particle give the particle a starting speed");
+ }
+ else {
+ uiDefButF(block, NUM, B_PART_RECALC, "Tan:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->tanfac, -200.0, 200.0, 1, 3, "Let the surface tangent give the particle a starting speed");
+ uiDefButF(block, NUM, B_PART_RECALC, "Rot:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->tanphase, -1.0, 1.0, 1, 3, "Rotate the surface tangent");
+ }
+ uiBlockSetCol(block, TH_AUTO);
+ uiBlockEndAlign(block);
+
+ buty=160;
+ butx=160;
+
+ if(part->phystype==PART_PHYS_NEWTON)
+ uiDefButS(block, MENU, B_PART_RECALC, "Integration%t|RK4%x2|Midpoint%x1|Euler%x0", butx,buty,butw,buth, &part->integrator, 14.0, 0.0, 0, 0, "Select physics integrator type");
+
+ uiDefBut(block, LABEL, 0, "Rotation:", butx, (buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, PART_ROT_DYN, B_PART_RECALC, "Dynamic", butx,(buty-=buth*4/5),butw/2,buth*4/5, &part->flag, 0, 0, 0, 0, "Sets rotation to dynamic/constant");
+ uiDefButS(block, MENU, B_PART_RECALC, "Rotation %t|Random %x3|Velocity %x2|Normal %x1|None %x0", butx+butw/2,buty,butw/2,buth*4/5, &part->rotmode, 14.0, 0.0, 0, 0, "Select particle rotation mode");
+ uiBlockSetCol(block, TH_BUT_SETTING2);
+ uiDefButF(block, NUM, B_PART_RECALC, "Amount:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->rotfac, -1.0, 1.0, 1, 3, "Rotation amount");
+ uiDefButF(block, NUM, B_PART_RECALC, "Phase:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->phasefac, -1.0, 1.0, 1, 3, "Initial rotation phase");
+ uiBlockSetCol(block, TH_AUTO);
+
+ uiDefButS(block, MENU, B_PART_RECALC, "Angular v %t|Velocity%x3|Random%x2|Spin%x1|None%x0", butx,(buty-=buth*4/5),butw,buth*4/5, &part->avemode, 14.0, 0.0, 0, 0, "Select particle angular velocity mode");
+ uiBlockSetCol(block, TH_BUT_SETTING2);
+ uiDefButF(block, NUM, B_PART_RECALC, "Angular v:", butx,(buty-=buth*4/5),butw,buth*4/5, &part->avefac, -200.0, 200.0, 1, 3, "Angular velocity amount");
+ uiBlockSetCol(block, TH_AUTO);
+ uiBlockEndAlign(block);
+
+ if(part->phystype==PART_PHYS_NEWTON) {
+ butx=0;
+ buty=40;
+ uiDefBut(block, LABEL, 0, "Global effects:", butx,buty,butw,buth, NULL, 0.0, 0, 0, 0, "");
+
+ butw=103;
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_PART_RECALC, "AccX:", butx,(buty-=buth),butw,buth, part->acc, -200.0, 200.0, 100, 0, "Specify a constant acceleration along the X-axis");
+ uiDefButF(block, NUM, B_PART_RECALC, "AccY:", butx+butw,buty,butw,buth, part->acc+1,-200.0, 200.0, 100, 0, "Specify a constant acceleration along the Y-axis");
+ uiDefButF(block, NUM, B_PART_RECALC, "AccZ:", butx+2*butw,buty,butw+1,buth, part->acc+2, -200.0, 200.0, 100, 0, "Specify a constant acceleration along the Z-axis");
+
+ uiDefButF(block, NUM, B_PART_RECALC, "Drag:", butx,(buty-=buth),butw,buth, &part->dragfac, 0.0, 1.0, 1, 0, "Specify the amount of air-drag");
+ uiDefButF(block, NUM, B_PART_RECALC, "Brown:", butx+butw,buty,butw,buth, &part->brownfac, 0.0, 200.0, 1, 0, "Specify the amount of brownian motion");
+ uiDefButF(block, NUM, B_PART_RECALC, "Damp:", butx+2*butw,buty,butw+1,buth, &part->dampfac, 0.0, 1.0, 1, 0, "Specify the amount of damping");
+ uiBlockEndAlign(block);
+ }
+ else if(part->phystype==PART_PHYS_KEYED) {
+ short totkpsys=1;
+ butx=0;
+ buty=40;
+ uiDefBut(block, LABEL, 0, "Keyed Target:", butx,buty,butw,buth, NULL, 0.0, 0, 0, 0, "");
+ if(psys->keyed_ob){
+ if(psys->keyed_ob==ob || BLI_findlink(&psys->keyed_ob->particlesystem,psys->keyed_psys-1)==0)
+ uiBlockSetCol(block, TH_REDALERT);
+ else
+ totkpsys = BLI_countlist(&psys->keyed_ob->particlesystem);
+ }
+ else
+ uiBlockSetCol(block, TH_REDALERT);
+
+ uiBlockBeginAlign(block);
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_PARTTARGET, "OB:", butx,(buty-=buth),butw*2/3,buth, &psys->keyed_ob, "The object that has the target particle system");
+ uiDefButS(block, NUM, B_PARTTARGET, "Psys:", butx+butw*2/3,buty,butw/3,buth, &psys->keyed_psys, 1.0, totkpsys, 0, 0, "The target particle system number in the object");
+ uiBlockEndAlign(block);
+
+ uiBlockSetCol(block, TH_AUTO);
+
+ butx=160;
+
+ if(psys->flag & PSYS_FIRST_KEYED)
+ uiDefButBitI(block, TOG, PSYS_KEYED_TIME, B_PART_RECALC, "Timed", butx,buty,butw,buth, &psys->flag, 0, 0, 0, 0, "Use intermediate key times");
+ else
+ uiDefButF(block, NUMSLI, B_PART_RECALC, "Time:", butx,buty,butw,buth, &part->keyed_time, 0.0, 1.0, 1, 3, "Keyed key time relative to remaining particle life");
+ }
}
- uiDefButF(block, NUM, B_CALCEFFECT, "Life:", 0,90,75,20, &paf->lifetime, 1.0, MAXFRAMEF, 100, 1, "Specify the life span of the particles");
- uiDefButS(block, NUM, B_CALCEFFECT, "Disp:", 75,90,75,20, &paf->disp, 0.0, 100.0, 10, 0, "Percentage of particles to calculate for 3d view");
- uiBlockEndAlign(block);
+}
+
+static void psys_clear_cache(void *ob_v, void *psys_v)
+{
+ clear_particles_from_cache((Object *)ob_v, (ParticleSystem *)psys_v, CFRA);
+}
+static void object_panel_particle_system(Object *ob)
+{
+ uiBlock *block;
+ uiBut *but;
+ ParticleSystem *psys=NULL;
+ ParticleSettings *part;
+ ID *id, *idfrom;
+ short butx=0, buty=160, butw=150, buth=20;
+ char str[30];
+ static short partact;
+ short totpart;
+
+ block= uiNewBlock(&curarea->uiblocks, "object_panel_particle_system", UI_EMBOSS, UI_HELV, curarea->win);
+ if(uiNewPanel(curarea, block, "Particle System", "Particle", 0, 0, 318, 204)==0) return;
- uiDefBut(block, LABEL, 0, "From:", 0,70,75,20, NULL, 0.0, 0, 0, 0, "");
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOGN, PAF_OFACE, B_CALCEFFECT, "Verts", 0,50,75,20, &paf->flag, 0, 0, 0, 0, "Emit particles from vertices");
- uiDefButBitS(block, TOG, PAF_FACE, B_CALCEFFECT, "Faces", 75,50,75,20, &paf->flag, 0, 0, 0, 0, "Emit particles from faces");
- if(paf->flag & PAF_FACE) {
- uiDefButBitS(block, TOG, PAF_TRAND, B_CALCEFFECT, "Rand", 0,30,50,20, &paf->flag, 0, 0, 0, 0, "Use true random distribution from faces");
- uiDefButBitS(block, TOG, PAF_EDISTR, B_CALCEFFECT, "Even", 50,30,50,20, &paf->flag, 0, 0, 0, 0, "Use even distribution from faces based on face areas");
- uiDefButS(block, NUM, B_CALCEFFECT, "P/F:", 100,30,50,20, &paf->userjit, 0.0, 200.0, 1, 0, "Jitter table distribution: maximum particles per face (0=uses default)");
+ if(ob->id.lib) uiSetButLock(1, "Can't edit library data");
+
+ if(ELEM4(ob->type,OB_MESH,OB_FONT,OB_CURVE,OB_SURF)==0) {
+ uiDefBut(block, LABEL, 0, "Only Mesh or Curve Objects can generate particles", 10,180,300,20, NULL, 0.0, 0, 0, 0, "");
+ return;
}
- else uiBlockEndAlign(block); /* vgroup button no align */
-
- but=uiDefBut(block, TEX, B_PAF_SET_VG, "VGroup:", 0,10,150,20, paf->vgroupname, 0, 31, 0, 0, "Name of vertex group to use");
- uiButSetCompleteFunc(but, autocomplete_vgroup, (void *)OBACT);
- uiBlockEndAlign(block);
+ psys=psys_get_current(ob);
+
+ if(psys)
+ id=(ID*)(psys->part);
+ else
+ id=NULL;
+ idfrom=&ob->id;
+
+ /* browse buttons */
+ uiBlockSetCol(block, TH_BUT_SETTING2);
+ butx= std_libbuttons(block, butx, buty, 0, NULL, B_PARTBROWSE, ID_PA, 0, id, idfrom, &(G.buts->menunr), B_PARTALONE, 0, B_PARTDELETE, 0, 0);
+
+ partact=psys_get_current_num(ob)+1;
+ totpart=BLI_countlist(&ob->particlesystem);
+ sprintf(str, "%d Part", totpart);
+ but=uiDefButS(block, NUM, B_PARTACT, str, 224,buty,88,buth, &partact, 1.0, totpart+1, 0, 0, "Shows the number of particle systems in the object and the active particle system");
+ uiButSetFunc(but, PE_change_act, ob, &partact);
+
+ if(psys==NULL)
+ return;
+
+ part=psys->part;
+
+ if(part==NULL) return;
+
+ butx=0;
+ buty-=5;
- /* right collumn */
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, PAF_STATIC, B_EFFECT_DEP, "Static", 160,180,75,20, &paf->flag, 0, 0, 0, 0, "Make static particles (deform only works with SubSurf)");
- if(paf->flag & PAF_STATIC) {
- uiDefButBitS(block, TOG, PAF_ANIMATED, B_DIFF, "Animated", 235,180,75,20, &paf->flag, 0, 0, 0, 0, "Static particles are recalculated each rendered frame");
+ uiDefButBitI(block, TOG, PSYS_ENABLED, B_PART_REDRAW, "Enabled", 0,(buty-=buth),100,buth, &psys->flag, 0, 0, 0, 0, "Sets particle system to be calculated and shown");
+
+ if(part->type == PART_HAIR){
+ if(psys->flag & PSYS_EDITED)
+ uiDefBut(block, BUT, B_PART_EDITABLE, "Free Edit", 105,buty,100,buth, NULL, 0.0, 0.0, 10, 0, "Free editing");
+ else
+ uiDefBut(block, BUT, B_PART_EDITABLE, "Set Editable", 105,buty,100,buth, NULL, 0.0, 0.0, 10, 0, "Finalize hair to enable editing in particle mode");
+
}
- uiBlockEndAlign(block);
+ else {
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, PSYS_PROTECT_CACHE, B_PART_REDRAW, "Protect", 105,buty,50,buth, &psys->flag, 0.0, 0.0, 10, 0, "Protect the cache");
+ but=uiDefBut(block, BUT, B_PART_RECALC, "Clear", 155,buty,50,buth, NULL, 0.0, 0.0, 10, 0, "Clear the cache");
+ if((psys->flag & PSYS_PROTECT_CACHE)==0)
+ uiButSetFunc(but, psys_clear_cache, ob, &partact);
+
+ uiBlockEndAlign(block);
+ }
+
+ if(psys->flag & PSYS_EDITED || psys->flag & PSYS_PROTECT_CACHE) {
+ uiSetButLock(1, "Hair is edited or cache is protected!");
+ }
+
+ uiDefButS(block, MENU, B_PARTTYPE, "Type%t|Hair%x2|Reactor%x1|Emitter%x0", 210,buty,100,buth, &part->type, 14.0, 0.0, 0, 0, "Type of particle system");
- uiDefBut(block, LABEL, 0, "Display:", 160,150,75,20, NULL, 0.0, 0, 0, 0, "");
+ buty-=5;
+ uiDefBut(block, LABEL, 0, "Basic:", butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_CALCEFFECT, "Material:", 160,130,150,20, &paf->omat, 1.0, 16.0, 0, 0, "Specify material used for the particles");
- uiDefButS(block, TOG|BIT|7, B_REDR, "Mesh", 160,110,50,20, &paf->flag, 0, 0, 0, 0, "Render emitter Mesh also");
- uiDefButBitS(block, TOG, PAF_UNBORN, B_DIFF, "Unborn",210,110,50,20, &paf->flag, 0, 0, 0, 0, "Make particles appear before they are emitted");
- uiDefButBitS(block, TOG, PAF_DIED, B_DIFF, "Died", 260,110,50,20, &paf->flag, 0, 0, 0, 0, "Make particles appear after they have died");
- uiDefButS(block, TOG, REDRAWVIEW3D, "Vect", 160,90,75,20, &paf->stype, 0, 0, 0, 0, "Give the particles a direction and rotation");
- if(paf->flag & PAF_STATIC)
- uiDefButF(block, NUM, B_CALCEFFECT, "Max:", 235,90,75,20, &paf->maxlen, 0.0, 100.0, 10, 1, "The maximum length of a particle strand (zero is no limit)");
+
+ if(part->distr==PART_DISTR_GRID)
+ uiDefButI(block, NUM, B_PART_ALLOC, "Resol:", butx,(buty-=buth),butw,buth, &part->grid_res, 1.0, 100.0, 0, 0, "The resolution of the particle grid");
else
- uiDefButF(block, NUM, B_CALCEFFECT, "Size:", 235,90,75,20, &paf->vectsize, 0.0, 1.0, 10, 1, "The amount the Vect option influences halo size");
+ uiDefButI(block, NUM, B_PART_ALLOC, "Amount:", butx,(buty-=buth),butw,buth, &part->totpart, 0.0, 100000.0, 0, 0, "The total number of particles");
+ if(part->type==PART_REACTOR) {
+ uiDefButBitI(block, TOG, PART_REACT_STA_END, B_PART_INIT, "Sta/End", butx,(buty-=buth),butw/2,buth, &part->flag, 0, 0, 0, 0, "Give birth to unreacted particles eventually");
+ uiDefButS(block, MENU, B_PART_RECALC, "React on %t|Near %x2|Collision %x1|Death %x0", butx+butw/2,buty,butw/2,buth, &part->reactevent, 14.0, 0.0, 0, 0, "The event of target particles to react");
+ if(part->flag&PART_REACT_STA_END) {
+ uiDefButF(block, NUM, B_PART_INIT, "Sta:", butx,(buty-=buth),butw,buth, &part->sta, 1.0, part->end, 100, 1, "Frame # to start emitting particles");
+ uiDefButF(block, NUM, B_PART_INIT, "End:", butx,(buty-=buth),butw,buth, &part->end, part->sta, MAXFRAMEF, 100, 1, "Frame # to stop emitting particles");
+ }
+ if(part->from!=PART_FROM_PARTICLE) {
+ uiDefButBitI(block, TOG, PART_REACT_MULTIPLE, B_PART_RECALC, "Multi React", butx,(buty-=buth),butw,buth, &part->flag, 0, 0, 0, 0, "React multiple times");
+ uiDefButF(block, NUM, B_PART_RECALC, "Shape:", butx,(buty-=buth),butw,buth, &part->reactshape, 0.0, 10.0, 100, 1, "Power of reaction strength dependence on distance to target");
+ }
+ }
+ else if(part->type==PART_HAIR) {
+ uiDefButS(block, NUM, B_PART_RECALC, "Segments:", butx,(buty-=buth),butw,buth, &part->hair_step, 2.0, 50.0, 0, 0, "Amount of hair segments");
+ }
+ else {
+ uiDefButF(block, NUM, B_PART_INIT, "Sta:", butx,(buty-=buth),butw,buth, &part->sta, 1.0, part->end, 100, 1, "Frame # to start emitting particles");
+ uiDefButF(block, NUM, B_PART_INIT, "End:", butx,(buty-=buth),butw,buth, &part->end, part->sta, MAXFRAMEF, 100, 1, "Frame # to stop emitting particles");
+ }
+
+ if(part->type!=PART_HAIR) {
+ uiDefButF(block, NUM, B_PART_INIT, "Life:", butx,(buty-=buth),butw,buth, &part->lifetime, 1.0, MAXFRAMEF, 100, 1, "Specify the life span of the particles");
+ uiDefButF(block, NUM, B_PART_INIT, "Rand:", butx,(buty-=buth),butw,buth, &part->randlife, 0.0, 2.0, 10, 1, "Give the particle life a random variation");
+ }
+
uiBlockEndAlign(block);
- uiDefBut(block, LABEL, 0, "Children:", 160,70,75,20, NULL, 0.0, 0, 0, 0, "");
+ butx=160;
+ buty=120;
+
+ buty-=10;
+
+ uiDefBut(block, LABEL, 0, "Emit From:", butx,buty,butw,buth, NULL, 0.0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_REDR, "Generation:", 160,50,150,20, &paf->curmult, 0.0, 3.0, 0, 0, "Current generation of particles");
- uiDefButS(block, NUM, B_CALCEFFECT, "Num:", 160,30,75,20, paf->child+paf->curmult, 1.0, 600.0, 100, 0, "Specify the number of generations of particles that can multiply itself");
- uiDefButF(block, NUM, B_CALCEFFECT, "Prob:", 235,30,75,20, paf->mult+paf->curmult, 0.0, 1.0, 10, 1, "Probability \"dying\" particle spawns a new one.");
- uiDefButF(block, NUM, B_CALCEFFECT, "Life:", 160,10,75,20, paf->life+paf->curmult, 1.0, 600.0, 100, 1, "Specify the lifespan of the next generation particles");
- uiDefButS(block, NUM, B_CALCEFFECT, "Mat:", 235,10,75,20, paf->mat+paf->curmult, 1.0, 8.0, 0, 0, "Specify the material used for the particles");
+ uiDefButBitI(block, TOG, PART_TRAND, B_PART_DISTR, "Random", butx,(buty-=buth),butw/2,buth, &part->flag, 0, 0, 0, 0, "Emit in random order of elements");
+
+ if(part->type==PART_REACTOR)
+ uiDefButS(block, MENU, B_PART_DISTR, "Particle %x3|Volume %x2|Faces %x1|Verts %x0", butx+butw/2,buty,butw/2,buth, &part->from, 14.0, 0.0, 0, 0, "Where to emit particles from");
+ else
+ uiDefButS(block, MENU, B_PART_DISTR, "Volume %x2|Faces %x1|Verts%x0", butx+butw/2,buty,butw/2,buth, &part->from, 14.0, 0.0, 0, 0, "Where to emit particles from");
+
+ if(ELEM(part->from,PART_FROM_FACE,PART_FROM_VOLUME)) {
+ uiDefButBitI(block, TOG, PART_EDISTR, B_PART_DISTR, "Even",butx,(buty-=buth),butw/2,buth, &part->flag, 0, 0, 0, 0, "Use even distribution from faces based on face areas or edge lengths");
+ uiDefButS(block, MENU, B_PART_DISTR, "Distribution %t|Grid%x2|Random%x1|Jittered%x0", butx+butw/2,buty,butw/2,buth, &part->distr, 14.0, 0.0, 0, 0, "How to distribute particles on selected element");
+ if(part->distr==PART_DISTR_JIT) {
+ uiDefButF(block, NUM, B_PART_DISTR, "Amount:", butx,(buty-=buth),butw,buth, &part->jitfac, 0, 2.0, 1, 1, "Amount of jitter applied to the sampling");
+ uiDefButI(block, NUM, B_PART_DISTR, "P/F:", butx,(buty-=buth),butw,buth, &part->userjit, 0, 1000.0, 1, 1, "Emission locations / face (0 = automatic)");
+ }
+ if(part->distr==PART_DISTR_GRID){
+ uiDefButBitI(block, TOG, PART_GRID_INVERT, B_PART_DISTR, "Invert",butx,(buty-=buth),butw,buth, &part->flag, 0, 0, 0, 0, "Invert what is considered object and what is not.");
+ }
+ }
uiBlockEndAlign(block);
+ buty=50;
+
+ if(part->type==PART_REACTOR) {
+ ParticleSystem *tpsys=0;
+ Object *tob=0;
+ int tottpsys;
+
+ uiDefBut(block, LABEL, 0, "Target:", butx,(buty-=buth),butw,buth, NULL, 0.0, 0, 0, 0, "");
+
+ if(psys->target_ob)
+ tob=psys->target_ob;
+ else
+ tob=ob;
+
+ tottpsys=BLI_countlist(&tob->particlesystem);
+
+ uiBlockBeginAlign(block);
+
+ if(tob->particlesystem.first==0)
+ uiBlockSetCol(block, TH_REDALERT);
+
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_PARTTARGET, "OB:", butx,(buty-=buth),butw*2/3,buth, &psys->target_ob, "The object that has the target particle system (empty if same object)");
+
+ tpsys=BLI_findlink(&tob->particlesystem,psys->target_psys-1);
+ if(tpsys) {
+ if(tob==ob && tpsys==psys)
+ uiBlockSetCol(block, TH_REDALERT);
+ }
+ else
+ uiBlockSetCol(block, TH_REDALERT);
+
+ uiDefButS(block, NUM, B_PARTTARGET, "Psys:", butx+butw*2/3,buty,butw/3,buth, &psys->target_psys, 1.0, tottpsys, 0, 0, "The target particle system number in the object");
+ uiBlockEndAlign(block);
+
+ uiBlockSetCol(block, TH_AUTO);
+ }
}
/* NT - Panel for fluidsim settings */
@@ -3175,11 +4641,31 @@ void physics_panels()
/* check context here */
ob= OBACT;
if(ob) {
+ if(ob->type==OB_MESH)
+ object_panel_deflection(ob);
object_panel_fields(ob);
- object_panel_particles(ob);
- object_panel_particles_motion(ob);
object_softbodies(ob);
object_softbodies_II(ob);
object_panel_fluidsim(ob);
}
}
+void particle_panels()
+{
+ Object *ob;
+ ParticleSystem *psys;
+
+ ob=OBACT;
+
+ if(ob) {
+ object_panel_particle_system(ob);
+
+ psys=psys_get_current(ob);
+
+ if(psys){
+ object_panel_particle_physics(ob);
+ object_panel_particle_visual(ob);
+ object_panel_particle_extra(ob);
+ object_panel_particle_children(ob);
+ }
+ }
+}
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index 4f59e965371..2cc24c643cb 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -61,6 +61,7 @@
#include "BIF_graphics.h"
#include "BIF_glutil.h"
#include "BIF_interface.h"
+#include "BIF_imasel.h"
#include "BIF_keyval.h"
#include "BIF_mainqueue.h"
#include "BIF_mywindow.h"
@@ -611,6 +612,7 @@ void do_render_panels(unsigned short event)
G.scene->r.yasp= 51;
G.scene->r.size= 100;
G.scene->r.frs_sec= 25;
+ G.scene->r.frs_sec_base= 1;
G.scene->r.mode &= ~R_PANORAMA;
G.scene->r.xparts= G.scene->r.yparts= 4;
#ifdef WITH_FFMPEG
@@ -717,6 +719,7 @@ void do_render_panels(unsigned short event)
G.scene->r.yasp= 45;
G.scene->r.size= 100;
G.scene->r.frs_sec= 25;
+ G.scene->r.frs_sec_base= 1;
G.scene->r.mode &= ~R_PANORAMA;
G.scene->r.xparts= G.scene->r.yparts= 4;
#ifdef WITH_FFMPEG
@@ -779,6 +782,7 @@ void do_render_panels(unsigned short event)
G.scene->r.yasp= 11;
G.scene->r.size= 100;
G.scene->r.frs_sec= 30;
+ G.scene->r.frs_sec_base = 1.001;
G.scene->r.mode &= ~R_PANORAMA;
G.scene->r.xparts= G.scene->r.yparts= 2;
#ifdef WITH_FFMPEG
@@ -801,7 +805,7 @@ void do_render_panels(unsigned short event)
Scene *newset= (Scene*) BLI_findlink(&G.main->scene, G.buts->menunr-1);
if (newset==G.scene)
- error("Not allowed");
+ error("Can't use the same scene as its own set");
else if (newset) {
G.scene->set= newset;
if (scene_check_setscene(G.scene)==0)
@@ -1041,6 +1045,11 @@ static char *imagetype_pup(void)
#endif
strcat(formatstring, "|%s %%x%d"); // add space for PNG
+/* Commented out until implemented
+#ifdef WITH_DDS
+ strcat(formatstring, "|%s %%x%d"); // add space for DDS
+#endif
+*/
strcat(formatstring, "|%s %%x%d"); // add space for BMP
strcat(formatstring, "|%s %%x%d"); // add space for Radiance HDR
strcat(formatstring, "|%s %%x%d"); // add space for Cineon
@@ -1077,6 +1086,11 @@ static char *imagetype_pup(void)
"Targa", R_TARGA,
"Targa Raw", R_RAWTGA,
"PNG", R_PNG,
+/* commented out until implemented
+#ifdef WITH_DDS
+ "DDS", R_DDS,
+#endif
+*/
"BMP", R_BMP,
"Jpeg", R_JPEG90,
"HamX", R_HAMX,
@@ -1102,6 +1116,9 @@ static char *imagetype_pup(void)
"Targa", R_TARGA,
"Targa Raw", R_RAWTGA,
"PNG", R_PNG,
+#ifdef WITH_DDS
+ "DDS", R_DDS,
+#endif
"BMP", R_BMP,
"Jpeg", R_JPEG90,
"HamX", R_HAMX,
@@ -1512,6 +1529,70 @@ static void render_panel_ffmpeg_audio(void)
}
#endif
+static void render_panel_stamp(void)
+{
+ uiBlock *block;
+ int yofs=0, xofs=550;
+
+ block= uiNewBlock (&curarea->uiblocks, "render_panel_stamp", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed ("Format", "Render");
+ if(uiNewPanel (curarea, block, "Stamp", "Render", 960, 0, 318, 204)==0) return;
+
+ if (G.scene->r.scemode & R_STAMP_INFO) {
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, R_STAMP_NOTE, B_REDR, "Note", xofs, yofs, 120, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp user data");
+ uiDefBut(block, TEX, B_NOP, "", xofs+120, yofs, 180, 19, &G.scene->r.stamp_udata, 0.0, 128.0, 100, 0, "User Note");
+ uiBlockEndAlign(block);
+ yofs += 30; /* gap */
+
+
+ yofs += 80;
+ /* Order is important for alligning ... grr */
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, R_STAMP_FILENAME, B_REDR, "Filename", xofs, yofs, 120, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp blend filename");
+ yofs -= 20;
+ uiDefButBitI(block, TOG, R_STAMP_SCENE, B_REDR, "Scene", xofs, yofs, 60, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp scene name");
+ uiDefButBitI(block, TOG, R_STAMP_CAMERA, B_REDR, "Camera", xofs+60, yofs, 60, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp camera name");
+ yofs -= 20;
+ uiDefButBitI(block, TOG, R_STAMP_TIME, B_REDR, "Time", xofs, yofs, 60, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp time (HH:MM:SS)");
+ uiDefButBitI(block, TOG, R_STAMP_DATE, B_REDR, "Date", xofs+60, yofs, 60, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp date");
+ yofs -= 20;
+ uiDefButBitI(block, TOG, R_STAMP_FRAME, B_REDR, "Frame", xofs, yofs, 60, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp frame number");
+ uiDefButBitI(block, TOG, R_STAMP_MARKER, B_REDR, "Marker", xofs+60, yofs, 60, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp the last marker");
+ yofs -= 20;
+ uiDefButBitI(block, TOG, R_STAMP_SEQSTRIP, B_REDR, "Sequence Strip", xofs, yofs, 120, 19, &G.scene->r.stamp, 0, 0, 0, 0, "Stamp the forground sequence strip name");
+ uiBlockEndAlign(block);
+ yofs += 80;
+
+ /* draw font selector */
+ if (G.scene->r.stamp & R_STAMP_DRAW) {
+ uiDefButS(block, MENU, B_REDR, "Stamp Font Size%t|Tiny Text%x1|Small Text%x2|Medium Text%x3|Large Text%x0|Extra Large Text%x4|",
+ xofs+130, yofs, 170, 19, &G.scene->r.stamp_font_id, 0, 0, 0, 0, "Choose stamp text size");
+
+ /* draw fg/bg next to the scene */
+ yofs -= 25;
+ uiDefBut(block, LABEL, B_NOP, "Text Color", xofs+130, yofs, 70, 19, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, B_NOP, "Background", xofs+215, yofs, 70, 19, 0, 0, 0, 0, 0, "");
+ yofs -= 20;
+ uiDefButF(block, COL, B_NOP, "", xofs+130, yofs, 80, 19, G.scene->r.fg_stamp, 0, 0, 0, 0, "Foreground text color");
+ uiDefButF(block, COL, B_NOP, "", xofs+220, yofs, 80, 19, G.scene->r.bg_stamp, 0, 0, 0, 0, "Background color");
+ yofs -= 30;
+ uiDefButF(block, NUMSLI, B_NOP, "A ", xofs+130, yofs, 170, 19, &G.scene->r.bg_stamp[3], 0, 1.0, 0, 0, "Alpha for text background");
+ yofs += 105;
+ } else {
+ yofs += 30;
+ }
+
+ uiDefButBitS(block, TOG, R_STAMP_INFO, B_REDR, "Enable Stamp", xofs, yofs, 120, 20, &G.scene->r.scemode, 0, 0, 0, 0, "Disable stamp info in images metadata");
+ uiDefButBitI(block, TOG, R_STAMP_DRAW, B_REDR, "Draw Stamp", xofs+130, yofs, 170, 20, &G.scene->r.stamp, 0, 0, 0, 0, "Draw the stamp info into each frame");
+ yofs += 20;
+ }
+ else {
+ uiDefButBitS(block, TOG, R_STAMP_INFO, B_REDR, "Enable Stamp", xofs, 142, 120, 20, &G.scene->r.scemode, 0, 0, 0, 0, "Enable stamp info to image metadata");
+ yofs += 20;
+ uiDefBut(block, LABEL, 0, "", xofs, yofs, 300, 19, 0, 0, 0, 0, 0, "");
+ }
+}
static void render_panel_format(void)
{
@@ -1566,7 +1647,7 @@ static void render_panel_format(void)
uiDefBut(block, LABEL, 0, "Codec: not set", 892,yofs+44,225,20, 0, 0, 0, 0, 0, "");
else
uiDefBut(block, LABEL, 0, G.scene->r.qtcodecdata->qtcodecname, 892,yofs+44,225,20, 0, 0, 0, 0, 0, "");
- uiDefBut(block, BUT,B_SELECTCODEC, "Set codec", 892,yofs,112,20, 0, 0, 0, 0, 0, "Set codec settings for Quicktime");
+ uiDefBut(block, BUT,B_SELECTCODEC, "Set codec", 892,yofs,74,20, 0, 0, 0, 0, 0, "Set codec settings for Quicktime");
#endif
#endif /* WITH_QUICKTIME */
} else {
@@ -1578,7 +1659,7 @@ static void render_panel_format(void)
else
uiDefBut(block, LABEL, 0, avicodec_str(), 892,yofs+43,225,20, 0, 0, 0, 0, 0, "");
#endif
- uiDefBut(block, BUT,B_SELECTCODEC, "Set codec", 892,yofs,112,20, 0, 0, 0, 0, 0, "Set codec settings for AVI");
+ uiDefBut(block, BUT,B_SELECTCODEC, "Set codec", 892,yofs,74,20, 0, 0, 0, 0, 0, "Set codec settings for AVI");
}
#ifdef WITH_OPENEXR
}
@@ -1587,21 +1668,22 @@ static void render_panel_format(void)
if(G.scene->r.imtype==R_OPENEXR) {
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, R_OPENEXR_HALF, B_NOP,"Half", 892,yofs+44,60,20, &G.scene->r.subimtype, 0, 0, 0, 0, "Use 16 bits float 'Half' type");
- uiDefButBitS(block, TOG, R_OPENEXR_ZBUF, B_NOP,"Zbuf", 952,yofs+44,60,20, &G.scene->r.subimtype, 0, 0, 0, 0, "Save the zbuffer as 32 bits unsigned int");
+ uiDefButBitS(block, TOG, R_OPENEXR_HALF, B_NOP,"Half", 892,yofs+44,60,20, &G.scene->r.subimtype, 0, 0, 0, 0, "Use 16 bit floats instead of 32 bit floats per channel");
+ uiDefButBitS(block, TOG, R_OPENEXR_ZBUF, B_NOP,"Zbuf", 952,yofs+44,60,20, &G.scene->r.subimtype, 0, 0, 0, 0, "Save the z-depth per pixel (32 bit unsigned int zbuffer)");
uiBlockEndAlign(block);
uiDefButBitS(block, TOG, R_PREVIEW_JPG, B_NOP,"Preview",1027,yofs+44,90,20, &G.scene->r.subimtype, 0, 0, 0, 0, "When animation render, save JPG preview images in same directory");
}
uiDefButS(block, MENU,B_NOP, "Codec %t|None %x0|Pxr24 (lossy) %x1|ZIP (lossless) %x2|PIZ (lossless) %x3|RLE (lossless) %x4",
- 892,yofs,112,20, &G.scene->r.quality, 0, 0, 0, 0, "Set codec settings for OpenEXR");
+ 892,yofs,74,20, &G.scene->r.quality, 0, 0, 0, 0, "Set codec settings for OpenEXR");
#endif
} else {
if(G.scene->r.quality < 5) G.scene->r.quality = 90; /* restore from openexr */
- uiDefButS(block, NUM,B_DIFF, "Quality:", 892,yofs,112,20, &G.scene->r.quality, 10.0, 100.0, 0, 0, "Quality setting for JPEG images, AVI Jpeg and SGI movies");
+ uiDefButS(block, NUM,B_DIFF, "Q:", 892,yofs,74,20, &G.scene->r.quality, 10.0, 100.0, 0, 0, "Quality setting for JPEG images, AVI Jpeg and SGI movies");
}
- uiDefButS(block, NUM,B_FRAMEMAP,"Frs/sec:", 1006,yofs,113,20, &G.scene->r.frs_sec, 1.0, 120.0, 100.0, 0, "Frames per second");
+ uiDefButS(block, NUM,B_FRAMEMAP,"FPS:", 968,yofs,75,20, &G.scene->r.frs_sec, 1.0, 120.0, 100.0, 0, "Frames per second");
+ uiDefButF(block, NUM,B_FRAMEMAP,"/", 1043,yofs,75,20, &G.scene->r.frs_sec_base, 1.0, 120.0, 0.1, 3, "Frames per second base");
uiBlockBeginAlign(block);
@@ -1622,7 +1704,7 @@ static void render_panel_format(void)
uiBlockEndAlign(block);
}
-
+#ifndef DISABLE_YAFRAY /* disable yafray stuff */
/* yafray: global illumination options panel */
static void render_panel_yafrayGI()
{
@@ -1725,7 +1807,7 @@ static void render_panel_yafrayGlobal()
uiDefButF(block, NUMSLI, B_DIFF, "Thr ", 160,90,150,20, &G.scene->r.YF_AAthreshold, 0.000001, 1.0, 0, 0, "AA threshold");
}
}
-
+#endif /* disable yafray stuff */
static void layer_copy_func(void *lay_v, void *lay_p)
{
@@ -1913,6 +1995,7 @@ void render_panels()
render_panel_bake();
render_panel_format();
+ render_panel_stamp();
#ifdef WITH_FFMPEG
if (G.scene->r.imtype == R_FFMPEG) {
render_panel_ffmpeg_video();
@@ -1951,7 +2034,9 @@ void anim_panels()
uiDefButI(block, NUM,B_FRAMEMAP,"Map New:", 160,160,150,20,&G.scene->r.images,1.0,900.0, 0, 0, "Specify how many frames the Map Old will last");
uiBlockBeginAlign(block);
- uiDefButS(block, NUM,B_FRAMEMAP,"Frs/sec:", 10,130,150,20, &G.scene->r.frs_sec, 1.0, 120.0, 100.0, 0, "Frames per second");
+ uiDefButS(block, NUM,B_FRAMEMAP,"FPS:", 10,130,75,20, &G.scene->r.frs_sec, 1.0, 120.0, 100.0, 0, "Frames per second");
+ uiDefButF(block, NUM,B_FRAMEMAP,"/", 85,130,75,20, &G.scene->r.frs_sec_base, 1.0, 120.0, 0.1, 3, "Frames per second base");
+
uiDefButBitS(block, TOG, AUDIO_SYNC, B_SOUND_CHANGED, "Sync",160,130,150,20, &G.scene->audio.flag, 0, 0, 0, 0, "Use sample clock for syncing animation to audio");
uiBlockBeginAlign(block);
diff --git a/source/blender/src/buttons_shading.c b/source/blender/src/buttons_shading.c
index 580dab7be52..c2dae17ef3e 100644
--- a/source/blender/src/buttons_shading.c
+++ b/source/blender/src/buttons_shading.c
@@ -52,6 +52,7 @@
#include "DNA_object_types.h"
#include "DNA_node_types.h"
#include "DNA_packedFile_types.h"
+#include "DNA_particle_types.h"
#include "DNA_radio_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -61,6 +62,8 @@
#include "DNA_view3d_types.h"
#include "DNA_world_types.h"
+#include "BKE_colortools.h"
+#include "BKE_depsgraph.h"
#include "BKE_displist.h"
#include "BKE_effect.h"
#include "BKE_global.h"
@@ -68,6 +71,7 @@
#include "BKE_main.h"
#include "BKE_node.h"
#include "BKE_material.h"
+#include "BKE_particle.h"
#include "BKE_utildefines.h"
#include "BKE_texture.h"
@@ -94,6 +98,7 @@
#include "BIF_mywindow.h"
#include "BIF_space.h"
#include "BIF_glutil.h"
+#include "BIF_imasel.h"
#include "BIF_interface.h"
#include "BIF_toolbox.h"
#include "BIF_space.h"
@@ -471,15 +476,15 @@ static void texture_panel_blend(Tex *tex)
uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE);
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_TEXPRV, "Lin", 10, 180, 75, 19, &tex->stype, 2.0, 0.0, 0, 0, "Creates a linear progresion");
- uiDefButS(block, ROW, B_TEXPRV, "Quad", 85, 180, 75, 19, &tex->stype, 2.0, 1.0, 0, 0, "Creates a quadratic progression");
- uiDefButS(block, ROW, B_TEXPRV, "Ease", 160, 180, 75, 19, &tex->stype, 2.0, 2.0, 0, 0, "Creates a progression easing from one step to the next");
+ uiDefButS(block, ROW, B_TEXPRV, "Lin", 10, 180, 75, 19, &tex->stype, 2.0, (float)TEX_LIN, 0, 0, "Creates a linear progresion");
+ uiDefButS(block, ROW, B_TEXPRV, "Quad", 85, 180, 75, 19, &tex->stype, 2.0, (float)TEX_QUAD, 0, 0, "Creates a quadratic progression");
+ uiDefButS(block, ROW, B_TEXPRV, "Ease", 160, 180, 75, 19, &tex->stype, 2.0, (float)TEX_EASE, 0, 0, "Creates a progression easing from one step to the next");
uiDefButBitS(block, TOG, TEX_FLIPBLEND, B_TEXPRV, "Flip XY", 235, 180, 75, 19, &tex->flag, 0, 0, 0, 0, "Flips the direction of the progression 90 degrees");
- uiDefButS(block, ROW, B_TEXPRV, "Diag", 10, 160, 75, 19, &tex->stype, 2.0, 3.0, 0, 0, "Use a diagonal progression");
- uiDefButS(block, ROW, B_TEXPRV, "Sphere", 85, 160, 75, 19, &tex->stype, 2.0, 4.0, 0, 0, "Use progression with the shape of a sphere");
- uiDefButS(block, ROW, B_TEXPRV, "Halo", 160, 160, 75, 19, &tex->stype, 2.0, 5.0, 0, 0, "Use a quadratic progression with the shape of a sphere");
- uiDefButS(block, ROW, B_TEXPRV, "Radial", 235, 160, 75, 19, &tex->stype, 2.0, 6.0, 0, 0, "Use a polar progression");
+ uiDefButS(block, ROW, B_TEXPRV, "Diag", 10, 160, 75, 19, &tex->stype, 2.0, (float)TEX_DIAG, 0, 0, "Use a diagonal progression");
+ uiDefButS(block, ROW, B_TEXPRV, "Sphere", 85, 160, 75, 19, &tex->stype, 2.0, (float)TEX_SPHERE, 0, 0, "Use progression with the shape of a sphere");
+ uiDefButS(block, ROW, B_TEXPRV, "Halo", 160, 160, 75, 19, &tex->stype, 2.0, (float)TEX_HALO, 0, 0, "Use a quadratic progression with the shape of a sphere");
+ uiDefButS(block, ROW, B_TEXPRV, "Radial", 235, 160, 75, 19, &tex->stype, 2.0, (float)TEX_RAD, 0, 0, "Use a polar progression");
}
@@ -500,16 +505,16 @@ static void texture_panel_wood(Tex *tex)
uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE);
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_TEXPRV, "Bands", 10, 180, 75, 18, &tex->stype, 2.0, 0.0, 0, 0, "Uses standard wood texture in bands");
- uiDefButS(block, ROW, B_TEXPRV, "Rings", 85, 180, 75, 18, &tex->stype, 2.0, 1.0, 0, 0, "Uses wood texture in rings");
- uiDefButS(block, ROW, B_TEXPRV, "BandNoise", 160, 180, 75, 18, &tex->stype, 2.0, 2.0, 0, 0, "Adds noise to standard wood");
- uiDefButS(block, ROW, B_TEXPRV, "RingNoise", 235, 180, 75, 18, &tex->stype, 2.0, 3.0, 0, 0, "Adds noise to rings");
+ uiDefButS(block, ROW, B_TEXPRV, "Bands", 10, 180, 75, 18, &tex->stype, 2.0, (float)TEX_BAND, 0, 0, "Uses standard wood texture in bands");
+ uiDefButS(block, ROW, B_TEXPRV, "Rings", 85, 180, 75, 18, &tex->stype, 2.0, (float)TEX_RING, 0, 0, "Uses wood texture in rings");
+ uiDefButS(block, ROW, B_TEXPRV, "BandNoise", 160, 180, 75, 18, &tex->stype, 2.0, (float)TEX_BANDNOISE, 0, 0, "Adds noise to standard wood");
+ uiDefButS(block, ROW, B_TEXPRV, "RingNoise", 235, 180, 75, 18, &tex->stype, 2.0, (float)TEX_RINGNOISE, 0, 0, "Adds noise to rings");
- uiDefButS(block, ROW, B_TEXPRV, "Sin", 10, 160, 50, 19, &tex->noisebasis2, 8.0, 0.0, 0, 0, "Uses a sine wave to produce bands");
- uiDefButS(block, ROW, B_TEXPRV, "Saw", 60, 160, 50, 19, &tex->noisebasis2, 8.0, 1.0, 0, 0, "Uses a saw wave to produce bands");
- uiDefButS(block, ROW, B_TEXPRV, "Tri", 110, 160, 50, 19, &tex->noisebasis2, 8.0, 2.0, 0, 0, "Uses a triangle wave to produce bands");
- uiDefButS(block, ROW, B_TEXPRV, "Soft noise", 160, 160, 75, 19, &tex->noisetype, 12.0, 0.0, 0, 0, "Generates soft noise");
- uiDefButS(block, ROW, B_TEXPRV, "Hard noise", 235, 160, 75, 19, &tex->noisetype, 12.0, 1.0, 0, 0, "Generates hard noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Sin", 10, 160, 50, 19, &tex->noisebasis2, 8.0, (float)TEX_SIN, 0, 0, "Uses a sine wave to produce bands");
+ uiDefButS(block, ROW, B_TEXPRV, "Saw", 60, 160, 50, 19, &tex->noisebasis2, 8.0, (float)TEX_SAW, 0, 0, "Uses a saw wave to produce bands");
+ uiDefButS(block, ROW, B_TEXPRV, "Tri", 110, 160, 50, 19, &tex->noisebasis2, 8.0, (float)TEX_TRI, 0, 0, "Uses a triangle wave to produce bands");
+ uiDefButS(block, ROW, B_TEXPRV, "Soft noise", 160, 160, 75, 19, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Hard noise", 235, 160, 75, 19, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_TEXPRV, "NoiseSize :", 10, 130, 150, 19, &tex->noisesize, 0.0001, 2.0, 10, 0, "Sets scaling for noise input");
@@ -532,12 +537,12 @@ static void texture_panel_stucci(Tex *tex)
uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE);
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_TEXPRV, "Plastic", 10, 180, 100, 19, &tex->stype, 2.0, 0.0, 0, 0, "Uses standard stucci");
- uiDefButS(block, ROW, B_TEXPRV, "Wall In", 110, 180, 100, 19, &tex->stype, 2.0, 1.0, 0, 0, "Creates Dimples");
- uiDefButS(block, ROW, B_TEXPRV, "Wall Out", 210, 180, 100, 19, &tex->stype, 2.0, 2.0, 0, 0, "Creates Ridges");
+ uiDefButS(block, ROW, B_TEXPRV, "Plastic", 10, 180, 100, 19, &tex->stype, 2.0, (float)TEX_PLASTIC, 0, 0, "Uses standard stucci");
+ uiDefButS(block, ROW, B_TEXPRV, "Wall In", 110, 180, 100, 19, &tex->stype, 2.0, (float)TEX_WALLIN, 0, 0, "Creates Dimples");
+ uiDefButS(block, ROW, B_TEXPRV, "Wall Out", 210, 180, 100, 19, &tex->stype, 2.0, (float)TEX_WALLOUT, 0, 0, "Creates Ridges");
- uiDefButS(block, ROW, B_TEXPRV, "Soft noise", 10, 160, 150, 19, &tex->noisetype, 12.0, 0.0, 0, 0, "Generates soft noise");
- uiDefButS(block, ROW, B_TEXPRV, "Hard noise", 160, 160, 150, 19, &tex->noisetype, 12.0, 1.0, 0, 0, "Generates hard noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Soft noise", 10, 160, 150, 19, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Hard noise", 160, 160, 150, 19, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_TEXPRV, "NoiseSize :", 10, 110, 150, 19, &tex->noisesize, 0.0001, 2.0, 10, 0, "Sets scaling for noise input");
@@ -561,12 +566,12 @@ static void texture_panel_marble(Tex *tex)
uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE);
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_TEXPRV, "Soft", 10, 180, 100, 18, &tex->stype, 2.0, 0.0, 0, 0, "Uses soft marble");
- uiDefButS(block, ROW, B_TEXPRV, "Sharp", 110, 180, 100, 18, &tex->stype, 2.0, 1.0, 0, 0, "Uses more clearly defined marble");
- uiDefButS(block, ROW, B_TEXPRV, "Sharper", 210, 180, 100, 18, &tex->stype, 2.0, 2.0, 0, 0, "Uses very clearly defined marble");
+ uiDefButS(block, ROW, B_TEXPRV, "Soft", 10, 180, 100, 18, &tex->stype, 2.0, (float)TEX_SOFT, 0, 0, "Uses soft marble");
+ uiDefButS(block, ROW, B_TEXPRV, "Sharp", 110, 180, 100, 18, &tex->stype, 2.0, (float)TEX_SHARP, 0, 0, "Uses more clearly defined marble");
+ uiDefButS(block, ROW, B_TEXPRV, "Sharper", 210, 180, 100, 18, &tex->stype, 2.0, (float)TEX_SHARPER, 0, 0, "Uses very clearly defined marble");
- uiDefButS(block, ROW, B_TEXPRV, "Soft noise", 10, 160, 150, 19, &tex->noisetype, 12.0, 0.0, 0, 0, "Generates soft noise");
- uiDefButS(block, ROW, B_TEXPRV, "Hard noise", 160, 160, 150, 19, &tex->noisetype, 12.0, 1.0, 0, 0, "Generates hard noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Soft noise", 10, 160, 150, 19, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Hard noise", 160, 160, 150, 19, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
uiDefButS(block, ROW, B_TEXPRV, "Sin", 10, 140, 100, 18, &tex->noisebasis2, 8.0, 0.0, 0, 0, "Uses a sine wave to produce bands.");
uiDefButS(block, ROW, B_TEXPRV, "Saw", 110, 140, 100, 18, &tex->noisebasis2, 8.0, 1.0, 0, 0, "Uses a saw wave to produce bands");
@@ -594,10 +599,10 @@ static void texture_panel_clouds(Tex *tex)
uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE);
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_TEXPRV, "Default", 10, 180, 70, 18, &tex->stype, 2.0, 0.0, 0, 0, "Uses standard noise");
- uiDefButS(block, ROW, B_TEXPRV, "Color", 80, 180, 70, 18, &tex->stype, 2.0, 1.0, 0, 0, "Lets Noise return RGB value");
- uiDefButS(block, ROW, B_TEXPRV, "Soft noise", 155, 180, 75, 18, &tex->noisetype, 12.0, 0.0, 0, 0, "Generates soft noise");
- uiDefButS(block, ROW, B_TEXPRV, "Hard noise", 230, 180, 80, 18, &tex->noisetype, 12.0, 1.0, 0, 0, "Generates hard noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Default", 10, 180, 70, 18, &tex->stype, 2.0, (float)TEX_DEFAULT, 0, 0, "Uses standard noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Color", 80, 180, 70, 18, &tex->stype, 2.0, (float)TEX_COLOR, 0, 0, "Lets Noise return RGB value");
+ uiDefButS(block, ROW, B_TEXPRV, "Soft noise", 155, 180, 75, 18, &tex->noisetype, 12.0, (float)TEX_NOISESOFT, 0, 0, "Generates soft noise");
+ uiDefButS(block, ROW, B_TEXPRV, "Hard noise", 230, 180, 80, 18, &tex->noisetype, 12.0, (float)TEX_NOISEPERL, 0, 0, "Generates hard noise");
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_TEXPRV, "NoiseSize :", 10, 130, 150, 19, &tex->noisesize, 0.0001, 2.0, 10, 0, "Sets scaling for noise input");
uiDefButS(block, NUM, B_TEXPRV, "NoiseDepth:", 160, 130, 150, 19, &tex->noisedepth, 0.0, 6.0, 0, 0, "Sets the depth of the cloud calculation");
@@ -622,7 +627,8 @@ static void texture_panel_musgrave(Tex *tex)
block= uiNewBlock(&curarea->uiblocks, "texture_panel_musgrave", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Musgrave", "Texture", 640, 0, 318, 204)==0) return;
uiSetButLock(tex->id.lib!=0, ERROR_LIBDATA_MESSAGE);
-
+
+ /* TEX_MFRACTAL, TEX_RIDGEDMF, TEX_HYBRIDMF, TEX_FBM, TEX_HTERRAIN */
str= "Multifractal %x0|Ridged Multifractal %x1|Hybrid Multifractal %x2|Hetero Terrain %x4|fBm %x3";
uiDefButS(block, MENU, B_TEXREDR_PRV, str, 10, 160, 150, 19, &tex->stype, 0.0, 0.0, 0, 0, "Sets Musgrave type");
@@ -875,7 +881,12 @@ static void image_load_fs_cb(void *ima_pp_v, void *iuser_v)
#else
else name = U.textudir;
#endif
- activate_fileselect_args(FILE_SPECIAL, "SELECT IMAGE", name, load_image_cb, ima_pp_v, iuser_v);
+ if (G.qual & LR_CTRLKEY) {
+ activate_imageselect_args(FILE_SPECIAL, "SELECT IMAGE", name, load_image_cb, ima_pp_v, iuser_v);
+ }
+ else {
+ activate_fileselect_args(FILE_SPECIAL, "SELECT IMAGE", name, load_image_cb, ima_pp_v, iuser_v);
+ }
}
/* 5 layer button callbacks... */
@@ -1150,43 +1161,43 @@ void uiblock_image_panel(uiBlock *block, Image **ima_pp, ImageUser *iuser,
}
else {
image_info(ima, ibuf, str);
- uiDefBut(block, LABEL, 0, str, 10, 107, 300, 20, NULL, 1, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, str, 10, 112, 300, 20, NULL, 1, 0, 0, 0, "");
}
/* exception, let's do because we only use this panel 3 times in blender... but not real good code! */
- if( (G.f & G_FACESELECT) && G.sima && &G.sima->iuser==iuser)
+ if( (FACESEL_PAINT_TEST) && G.sima && &G.sima->iuser==iuser)
return;
/* left side default per-image options, right half the additional options */
/* fields */
uiBlockBeginAlign(block);
- but= uiDefButBitS(block, TOG, IMA_FIELDS, imagechanged, "Fields", 10, 70, 100, 20, &ima->flag, 0, 0, 0, 0, "Click to enable use of fields in Image");
+ but= uiDefButBitS(block, TOG, IMA_FIELDS, imagechanged, "Fields", 10, 90, 100, 20, &ima->flag, 0, 0, 0, 0, "Click to enable use of fields in Image");
uiButSetFunc(but, image_field_test, ima, iuser);
- uiDefButBitS(block, TOG, IMA_STD_FIELD, B_NOP, "Odd", 10, 50, 100, 20, &ima->flag, 0, 0, 0, 0, "Standard Field Toggle");
+ uiDefButBitS(block, TOG, IMA_STD_FIELD, B_NOP, "Odd", 10, 70, 100, 20, &ima->flag, 0, 0, 0, 0, "Standard Field Toggle");
uiBlockEndAlign(block);
- uiDefButBitS(block, TOG, IMA_ANTIALI, B_NOP, "Anti", 10, 10, 100, 20, &ima->flag, 0, 0, 0, 0, "Toggles Image anti-aliasing, only works with solid colors");
+ uiDefButBitS(block, TOG, IMA_ANTIALI, B_NOP, "Anti", 10, 35, 100, 20, &ima->flag, 0, 0, 0, 0, "Toggles Image anti-aliasing, only works with solid colors");
if( ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) {
sprintf(str, "(%d) Frames:", iuser->framenr);
uiBlockBeginAlign(block);
uiBlockSetFunc(block, image_user_change, iuser, NULL);
- uiDefButBitS(block, TOG, IMA_ANIM_ALWAYS, B_NOP, "Auto Refresh", 120, 70, 190, 20, &iuser->flag, 0, 0, 0, 0, "Always refresh Image on frame changes");
+ uiDefButBitS(block, TOG, IMA_ANIM_ALWAYS, B_NOP, "Auto Refresh", 120, 90, 190, 20, &iuser->flag, 0, 0, 0, 0, "Always refresh Image on frame changes");
if(ima->anim) {
- uiDefButI(block, NUM, imagechanged, str, 120, 50,170, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
- but= uiDefBut(block, BUT, redraw, "<", 290, 50, 20, 20, 0, 0, 0, 0, 0, "Copies number of frames in movie file to Frames: button");
+ uiDefButI(block, NUM, imagechanged, str, 120, 70,170, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
+ but= uiDefBut(block, BUT, redraw, "<", 290, 70, 20, 20, 0, 0, 0, 0, 0, "Copies number of frames in movie file to Frames: button");
uiButSetFunc(but, set_frames_cb, ima, iuser);
}
else
- uiDefButI(block, NUM, imagechanged, str, 120, 50,190, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
+ uiDefButI(block, NUM, imagechanged, str, 120, 70,190, 20, &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Sets the number of images of a movie to use");
- uiDefButI(block, NUM, imagechanged, "Offs:", 120,30,100,20, &iuser->offset, -MAXFRAMEF, MAXFRAMEF, 0, 0, "Offsets the number of the frame to use in the animation");
- uiDefButS(block, NUM, imagechanged, "Fie/Ima:", 220,30,90,20, &iuser->fie_ima, 1.0, 200.0, 0, 0, "The number of fields per rendered frame (2 fields is 1 image)");
+ uiDefButI(block, NUM, imagechanged, "Offs:", 120,50,100,20, &iuser->offset, -MAXFRAMEF, MAXFRAMEF, 0, 0, "Offsets the number of the frame to use in the animation");
+ uiDefButS(block, NUM, imagechanged, "Fie/Ima:", 220,50,90,20, &iuser->fie_ima, 1.0, 200.0, 0, 0, "The number of fields per rendered frame (2 fields is 1 image)");
- uiDefButI(block, NUM, imagechanged, "StartFr:", 120,10,100,20, &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Sets the global starting frame of the movie");
- uiDefButS(block, TOG, imagechanged, "Cyclic", 220,10,90,20, &iuser->cycl, 0.0, 1.0, 0, 0, "Cycle the images in the movie");
+ uiDefButI(block, NUM, imagechanged, "StartFr:", 120,30,100,20, &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Sets the global starting frame of the movie");
+ uiDefButS(block, TOG, imagechanged, "Cyclic", 220,30,90,20, &iuser->cycl, 0.0, 1.0, 0, 0, "Cycle the images in the movie");
uiBlockSetFunc(block, NULL, iuser, NULL);
}
@@ -1194,13 +1205,13 @@ void uiblock_image_panel(uiBlock *block, Image **ima_pp, ImageUser *iuser,
uiBlockBeginAlign(block);
uiBlockSetFunc(block, image_generated_change_cb, ima, iuser);
- uiDefButS(block, NUM, imagechanged, "SizeX:", 120,70,100,20, &ima->gen_x, 1.0, 5000.0, 0, 0, "Image size x");
- uiDefButS(block, NUM, imagechanged, "SizeY:", 220,70,90,20, &ima->gen_y, 1.0, 5000.0, 0, 0, "Image size y");
- uiDefButS(block, TOG, imagechanged, "UV Test grid",120,50,190,20, &ima->gen_type, 0.0, 1.0, 0, 0, "");
+ uiDefButS(block, NUM, imagechanged, "SizeX:", 120,90,100,20, &ima->gen_x, 1.0, 5000.0, 0, 0, "Image size x");
+ uiDefButS(block, NUM, imagechanged, "SizeY:", 220,90,90,20, &ima->gen_y, 1.0, 5000.0, 0, 0, "Image size y");
+ uiDefButS(block, TOG, imagechanged, "UV Test grid",120,70,190,20, &ima->gen_type, 0.0, 1.0, 0, 0, "");
uiBlockSetFunc(block, NULL, NULL, NULL);
}
}
-
+ uiBlockEndAlign(block);
}
static void texture_panel_image(Image **ima, ImageUser *iuser)
@@ -1294,9 +1305,9 @@ static void texture_panel_envmap(Tex *tex)
env= tex->env;
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_REDR, "Static", 10, 180, 100, 19, &env->stype, 2.0, 0.0, 0, 0, "Calculates environment map only once");
- uiDefButS(block, ROW, B_REDR, "Anim", 110, 180, 100, 19, &env->stype, 2.0, 1.0, 0, 0, "Calculates environment map at each rendering");
- uiDefButS(block, ROW, B_ENV_FREE, "Load", 210, 180, 100, 19, &env->stype, 2.0, 2.0, 0, 0, "Loads saved environment map from disk");
+ uiDefButS(block, ROW, B_REDR, "Static", 10, 180, 100, 19, &env->stype, 2.0, (float)ENV_STATIC, 0, 0, "Calculates environment map only once");
+ uiDefButS(block, ROW, B_REDR, "Anim", 110, 180, 100, 19, &env->stype, 2.0, (float)ENV_ANIM, 0, 0, "Calculates environment map at each rendering");
+ uiDefButS(block, ROW, B_ENV_FREE, "Load", 210, 180, 100, 19, &env->stype, 2.0, (float)ENV_LOAD, 0, 0, "Loads saved environment map from disk");
uiBlockEndAlign(block);
if(env->stype==ENV_LOAD) {
@@ -1339,8 +1350,8 @@ static void texture_panel_envmap(Tex *tex)
uiDefBut(block, BUT, B_ENV_FREE_ALL, "Free all EnvMaps", 210,145,100,20, 0, 0, 0, 0, 0, "Frees all rendered environment maps for all materials");
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_NOP, "Cube", 10,120,100,20, &env->type, 3.0f, 0.0f, 0, 0, "Use environment map with six cube sides");
- uiDefButS(block, ROW, B_NOP, "Plane", 110,120,100,20, &env->type, 3.0f, 1.0f, 0, 0, "Only one side is rendered, with Z axis pointing in direction of image");
+ uiDefButS(block, ROW, B_NOP, "Cube", 10,120,100,20, &env->type, 3.0f, (float)ENV_CUBE, 0, 0, "Use environment map with six cube sides");
+ uiDefButS(block, ROW, B_NOP, "Plane", 110,120,100,20, &env->type, 3.0f, (float)ENV_PLANE, 0, 0, "Only one side is rendered, with Z axis pointing in direction of image");
uiDefButF(block, NUM, B_NOP, "Zoom: ", 210,120,100,20, &env->viewscale, 0.5f, 5.0f, 100, 2, "Zoom factor for planar environment map");
uiBlockEndAlign(block);
}
@@ -1353,7 +1364,7 @@ static void texture_panel_envmap(Tex *tex)
uiDefButF(block, NUM, B_TEXPRV, "Filter :", 10,65,150,20, &tex->filtersize, 0.1, 25.0, 0, 3, "Adjusts sharpness or blurriness of the reflection"),
uiDefButS(block, NUM, B_ENV_FREE, "Depth:", 160,65,150,20, &env->depth, 0, 5.0, 0, 0, "Sets the number of times a map will be rendered recursively mirror effects"),
uiDefButF(block, NUM, REDRAWVIEW3D, "ClipSta", 10,40,150,20, &env->clipsta, 0.01, 50.0, 100, 0, "Sets start value for clipping: objects nearer than this are not visible to map");
- uiDefButF(block, NUM, B_NOP, "ClipEnd", 160,40,150,20, &env->clipend, 0.1, 5000.0, 1000, 0, "Sets end value for clipping beyond which objects are not visible to map");
+ uiDefButF(block, NUM, B_NOP, "ClipEnd", 160,40,150,20, &env->clipend, 0.1, 20000.0, 1000, 0, "Sets end value for clipping beyond which objects are not visible to map");
uiBlockEndAlign(block);
uiDefBut(block, LABEL, 0, "Don't render layer:", 10,10,140,22, 0, 0.0, 0.0, 0, 0, "");
@@ -1915,8 +1926,8 @@ void do_worldbuts(unsigned short event)
scrarea_queue_winredraw(curarea);
}
break;
- case B_AO_DISTANCES:
- /* distances option only supports plain */
+ case B_AO_FALLOFF:
+ /* falloff distances option only supports plain */
wrld= G.buts->lockpoin;
if(wrld)
wrld->aocolor= WO_AOPLAIN;
@@ -1945,7 +1956,7 @@ static void world_panel_mapto(World *wrld)
/* TEXTURE OUTPUT */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, MTEX_STENCIL, B_WORLDPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Sets the texture mapping to stencil mode");
+ uiDefButBitS(block, TOG, MTEX_STENCIL, B_WORLDPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Use this texture as a blending value on the next texture");
uiDefButBitS(block, TOG, MTEX_NEGATIVE, B_WORLDPRV, "Neg", 55,125,30,19, &(mtex->texflag), 0, 0, 0, 0, "Inverts the values of the texture to reverse its effect");
uiDefButBitS(block, TOG, MTEX_RGBTOINT, B_WORLDPRV, "No RGB", 85,125,60,19, &(mtex->texflag), 0, 0, 0, 0, "Converts texture RGB values to intensity (gray) values");
uiBlockEndAlign(block);
@@ -2086,29 +2097,29 @@ static void world_panel_mistaph(World *wrld)
#endif
uiBlockSetCol(block, TH_BUT_SETTING1);
- uiDefButBitS(block, TOG, WO_MIST, REDRAWVIEW3D,"Mist", 10,120,140,19, &wrld->mode, 0, 0, 0, 0, "Toggles mist simulation");
+ uiDefButBitS(block, TOG, WO_MIST, B_WORLDPRV2,"Mist", 10,120,140,19, &wrld->mode, 0, 0, 0, 0, "Toggles mist simulation");
uiBlockSetCol(block, TH_AUTO);
uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_DIFF, "Qua", 10, 90, 40, 19, &wrld->mistype, 1.0, 0.0, 0, 0, "Mist uses quadratic progression");
- uiDefButS(block, ROW, B_DIFF, "Lin", 50, 90, 50, 19, &wrld->mistype, 1.0, 1.0, 0, 0, "Mist uses linear progression");
- uiDefButS(block, ROW, B_DIFF, "Sqr", 100, 90, 50, 19, &wrld->mistype, 1.0, 2.0, 0, 0, "Mist uses inverse quadratic progression");
+ uiDefButS(block, ROW, B_WORLDPRV2, "Quad", 10, 90, 40, 19, &wrld->mistype, 1.0, 0.0, 0, 0, "Mist uses quadratic progression");
+ uiDefButS(block, ROW, B_WORLDPRV2, "Lin", 50, 90, 50, 19, &wrld->mistype, 1.0, 1.0, 0, 0, "Mist uses linear progression");
+ uiDefButS(block, ROW, B_WORLDPRV2, "Sqr", 100, 90, 50, 19, &wrld->mistype, 1.0, 2.0, 0, 0, "Mist uses inverse quadratic progression");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM,REDRAWVIEW3D, "Sta:",10,70,140,19, &wrld->miststa, 0.0, 1000.0, 10, 0, "Specifies the starting distance of the mist");
- uiDefButF(block, NUM,REDRAWVIEW3D, "Di:",10,50,140,19, &wrld->mistdist, 0.0,1000.0, 10, 00, "Specifies the depth of the mist");
- uiDefButF(block, NUM,B_DIFF,"Hi:", 10,30,140,19, &wrld->misthi,0.0,100.0, 10, 0, "Specifies the factor for a less dense mist with increasing height");
- uiDefButF(block, NUMSLI, B_DIFF, "Misi ", 10,10,140,19, &(wrld->misi), 0., 1.0, 0, 0, "Sets the mist intensity");
+ uiDefButF(block, NUM,B_WORLDPRV2, "Start:",10,70,140,19, &wrld->miststa, 0.0, 10000.0, 10, 0, "Specifies the starting distance of the mist");
+ uiDefButF(block, NUM,B_WORLDPRV2, "Dist:",10,50,140,19, &wrld->mistdist, 0.0,10000.0, 10, 00, "Specifies the depth of the mist");
+ uiDefButF(block, NUM,B_WORLDPRV2,"Height:", 10,30,140,19, &wrld->misthi,0.0,100.0, 10, 0, "Specifies the factor for a less dense mist with increasing height");
+ uiDefButF(block, NUMSLI, B_WORLDPRV2, "Misi ", 10,10,140,19, &(wrld->misi), 0., 1.0, 0, 0, "Sets the mist intensity");
uiBlockEndAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1);
- uiDefButBitS(block, TOG, WO_STARS, REDRAWVIEW3D, "Stars",160,120,140,19, &wrld->mode, 0, 0, 0, 0, "Toggles starfield generation");
+ uiDefButBitS(block, TOG, WO_STARS, B_WORLDPRV2, "Stars",160,120,140,19, &wrld->mode, 0, 0, 0, 0, "Toggles starfield generation");
uiBlockSetCol(block, TH_AUTO);
uiBlockBeginAlign(block);
- uiDefButF(block, NUM,B_DIFF,"StarDist:", 160,70,140,19, &(wrld->stardist), 2.0, 1000.0, 100, 0, "Specifies the average distance between any two stars");
- uiDefButF(block, NUM,B_DIFF,"MinDist:", 160,50,140,19, &(wrld->starmindist), 0.0, 1000.0, 100, 0, "Specifies the minimum distance to the camera for stars");
- uiDefButF(block, NUMSLI,B_DIFF,"Size:", 160,30,140,19, &(wrld->starsize), 0.0, 10.0, 10, 0, "Specifies the average screen dimension of stars");
- uiDefButF(block, NUMSLI,B_DIFF,"Colnoise:", 160,10,140,19, &(wrld->starcolnoise), 0.0, 1.0, 100, 0, "Randomizes star color");
+ uiDefButF(block, NUM,B_WORLDPRV2,"StarDist:", 160,70,140,19, &(wrld->stardist), 2.0, 1000.0, 100, 0, "Specifies the average distance between any two stars");
+ uiDefButF(block, NUM,B_WORLDPRV2,"MinDist:", 160,50,140,19, &(wrld->starmindist), 0.0, 1000.0, 100, 0, "Specifies the minimum distance to the camera for stars");
+ uiDefButF(block, NUMSLI,B_WORLDPRV2,"Size:", 160,30,140,19, &(wrld->starsize), 0.0, 10.0, 10, 0, "Specifies the average screen dimension of stars");
+ uiDefButF(block, NUMSLI,B_WORLDPRV2,"Colnoise:", 160,10,140,19, &(wrld->starcolnoise), 0.0, 1.0, 100, 0, "Randomizes star color");
uiBlockEndAlign(block);
}
@@ -2116,49 +2127,88 @@ static void world_panel_mistaph(World *wrld)
static void world_panel_amb_occ(World *wrld)
{
uiBlock *block;
+ short yco=PANEL_YMAX;
block= uiNewBlock(&curarea->uiblocks, "world_panel_amb_oc", UI_EMBOSS, UI_HELV, curarea->win);
uiNewPanelTabbed("Mist / Stars / Physics", "World");
- if(uiNewPanel(curarea, block, "Amb Occ", "World", 320, 0, 318, 204)==0) return;
+ if(uiNewPanel(curarea, block, "Amb Occ", "World", PANELX, PANELY, PANELW, PANELH)==0) return;
uiBlockSetCol(block, TH_BUT_SETTING1);
- uiDefButBitS(block, TOG, WO_AMB_OCC, B_REDR, "Ambient Occlusion",10,150,300,19, &wrld->mode, 0, 0, 0, 0, "Toggles ambient occlusion (soft shadows)");
+ uiDefButBitS(block, TOG, WO_AMB_OCC, B_REDR, "Ambient Occlusion",
+ X2CLM1, yco-=BUTH, BUTW1, BUTH, &wrld->mode, 0, 0, 0, 0, "Toggles ambient occlusion (soft shadows)");
uiBlockSetCol(block, TH_AUTO);
+
+ if(!(wrld->mode & WO_AMB_OCC)) return;
+
+ yco -= YSPACE;
- if(wrld->mode & WO_AMB_OCC) {
+ uiDefButS(block, NUM, B_REDR, "Samples:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->aosamp, 1.0, 32.0, 100, 0, "Sets the number of samples used for AO (actual number: squared)");
+
+ yco -= YSPACE;
+
+ uiDefButF(block, NUM, B_REDR, "Max Dist:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->aodist, 0.001, 5000.0, 100, 0, "Sets length of AO rays, defines how far away other faces give occlusion effect");
- /* aolight: samples */
+ yco -= YSPACE;
+
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, WO_AODIST, B_AO_FALLOFF, "Use Falloff",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->aomode, 0, 0, 0, 0, "When enabled, distances to objects will be used to attenuate shadows. Only for Plain AO.");
+ if (wrld->aomode & WO_AODIST)
+ uiDefButF(block, NUM, B_REDR, "Strength:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->aodistfac, 0.00001, 10.0, 100, 0, "Distance attenuation factor, the higher, the 'shorter' the shadows");
+ uiBlockEndAlign(block);
+
+ /* column 2 */
+ yco = PANEL_YMAX - BUTH - YSPACE;
+
+ uiDefButS(block, MENU, B_REDR, "Constant QMC %x2|Adaptive QMC %x1|Constant Jittered %x0",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &wrld->ao_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Constant QMC: best quality, Adaptive QMC: fast in high contrast areas");
+
+ yco -= YSPACE;
+
+ if (wrld->ao_samp_method == WO_AOSAMP_HALTON) {
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_REDR, "Samples:", 10, 120, 150, 19, &wrld->aosamp, 1.0, 16.0, 100, 0, "Sets the number of samples used for AO (actual number: squared)");
- /* enable/disable total random sampling */
- uiDefButBitS(block, TOG, WO_AORNDSMP, 0, "Random Sampling", 160, 120, 150, 19, &wrld->aomode, 0, 0, 0, 0, "When enabled, total random sampling will be used for an even noisier effect");
+ uiDefButF(block, NUM, B_REDR, "Threshold:",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &wrld->ao_adapt_thresh, 0.0, 1.0, 100, 0, "Samples below this threshold will be considered fully shadowed/unshadowed and skipped");
+ uiDefButF(block, NUMSLI, B_REDR, "Adapt Vec:",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &wrld->ao_adapt_speed_fac, 0.0, 1.0, 100, 0, "Use the speed vector pass to reduce AO samples in fast moving pixels. The higher the value, the more aggressive the sample reduction. Requires Vec pass enabled.");
uiBlockEndAlign(block);
+ } else if (wrld->ao_samp_method == WO_AOSAMP_CONSTANT) {
+ uiDefButF(block, NUMSLI, B_REDR, "Bias:",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &wrld->aobias, 0.0, 0.5, 10, 0, "Sets bias to prevent smoothed faces to show banding (in radians)");
+ }
- uiDefButF(block, NUM, B_REDR, "Dist:", 10, 95, 150, 19, &wrld->aodist, 0.001, 5000.0, 100, 0, "Sets length of AO rays, defines how far away other faces give occlusion effect");
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, WO_AODIST, B_AO_DISTANCES, "Use Distances", 10, 70, 150, 19, &wrld->aomode, 0, 0, 0, 0, "When enabled, distances to objects will be used to attenuate shadows. Only for Plain AO.");
- /* distance attenuation factor */
- if (wrld->aomode & WO_AODIST)
- uiDefButF(block, NUM, B_REDR, "DistF:", 160, 70, 150, 19, &wrld->aodistfac, 0.00001, 10.0, 100, 0, "Distance factor, the higher, the 'shorter' the shadows");
+ yco = PANEL_YMAX - (5*BUTH+4*YSPACE);
- /* result mix modes */
- uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_REDR, "Add", 10, 45, 100, 20, &wrld->aomix, 1.0, (float)WO_AOADD, 0, 0, "adds light/shadows");
- uiDefButS(block, ROW, B_REDR, "Sub", 110, 45, 100, 20, &wrld->aomix, 1.0, (float)WO_AOSUB, 0, 0, "subtracts light/shadows (needs at least one normal light to make anything visible)");
- uiDefButS(block, ROW, B_REDR, "Both", 210, 45, 100, 20, &wrld->aomix, 1.0, (float)WO_AOADDSUB, 0, 0, "both lightens & darkens");
+ /* result mix modes */
+ uiBlockBeginAlign(block);
+ uiDefButS(block, ROW, B_REDR, "Add",
+ X3CLM1, yco-=BUTH, BUTW3, BUTH, &wrld->aomix, 1.0, (float)WO_AOADD, 0, 0, "adds light/shadows");
+ uiDefButS(block, ROW, B_REDR, "Sub",
+ X3CLM2, yco, BUTW3, BUTH, &wrld->aomix, 1.0, (float)WO_AOSUB, 0, 0, "subtracts light/shadows (needs at least one normal light to make anything visible)");
+ uiDefButS(block, ROW, B_REDR, "Both",
+ X3CLM3, yco, BUTW3, BUTH, &wrld->aomix, 1.0, (float)WO_AOADDSUB, 0, 0, "both lightens & darkens");
- /* color treatment */
- uiBlockBeginAlign(block);
- uiDefButS(block, ROW, B_REDR, "Plain", 10, 25, 100, 20, &wrld->aocolor, 2.0, (float)WO_AOPLAIN, 0, 0, "Plain diffuse energy (white)");
- uiDefButS(block, ROW, B_REDR, "Sky Color", 110, 25, 100, 20, &wrld->aocolor, 2.0, (float)WO_AOSKYCOL, 0, 0, "Use horizon and zenith color for diffuse energy");
- uiDefButS(block, ROW, B_REDR, "Sky Texture", 210, 25, 100, 20, &wrld->aocolor, 2.0, (float)WO_AOSKYTEX, 0, 0, "Does full Sky texture render for diffuse energy");
-
- uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, B_REDR, "Energy:", 10, 0, 150, 19, &wrld->aoenergy, 0.01, 3.0, 100, 0, "Sets global energy scale for AO");
- uiDefButF(block, NUMSLI, B_REDR, "Bias:", 160, 0, 150, 19, &wrld->aobias, 0.0, 0.5, 10, 0, "Sets bias to prevent smoothed faces to show banding (in radians)");
- }
+ yco -= YSPACE;
+ /* color treatment */
+ uiBlockBeginAlign(block);
+ uiDefButS(block, ROW, B_REDR, "Plain",
+ X3CLM1, yco-=BUTH, BUTW3, BUTH, &wrld->aocolor, 2.0, (float)WO_AOPLAIN, 0, 0, "Plain diffuse energy (white)");
+ uiDefButS(block, ROW, B_REDR, "Sky Color",
+ X3CLM2, yco, BUTW3, BUTH, &wrld->aocolor, 2.0, (float)WO_AOSKYCOL, 0, 0, "Use horizon and zenith color for diffuse energy");
+ uiDefButS(block, ROW, B_REDR, "Sky Texture",
+ X3CLM3, yco, BUTW3, BUTH, &wrld->aocolor, 2.0, (float)WO_AOSKYTEX, 0, 0, "Does full Sky texture render for diffuse energy");
+ uiBlockEndAlign(block);
+
+ yco -= YSPACE;
+
+ uiDefButF(block, NUMSLI, B_REDR, "Energy:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &wrld->aoenergy, 0.01, 3.0, 100, 0, "Sets global energy scale for AO");
+
}
static void world_panel_world(World *wrld)
@@ -2305,6 +2355,13 @@ void do_lampbuts(unsigned short event)
scrarea_queue_winredraw(curarea);
}
break;
+ case B_LFALLOFFCHANGED:
+ la= G.buts->lockpoin;
+ curvemapping_changed(la->curfalloff, 1);
+ BIF_undo_push("Edit Lamp falloff curve");
+ BIF_preview_changed(ID_LA);
+ scrarea_queue_winredraw(curarea);
+ break;
}
}
@@ -2330,7 +2387,7 @@ static void lamp_panel_mapto(Object *ob, Lamp *la)
/* TEXTURE OUTPUT */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, MTEX_STENCIL, B_LAMPPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Sets the texture mapping to stencil mode");
+ uiDefButBitS(block, TOG, MTEX_STENCIL, B_LAMPPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Use this texture as a blending value on the next texture");
uiDefButBitS(block, TOG, MTEX_NEGATIVE, B_LAMPPRV, "Neg", 55,125,30,19, &(mtex->texflag), 0, 0, 0, 0, "Inverts the values of the texture to reverse its effect");
uiDefButBitS(block, TOG, MTEX_RGBTOINT, B_LAMPPRV, "No RGB", 85,125,60,19, &(mtex->texflag), 0, 0, 0, 0, "Converts texture RGB values to intensity (gray) values");
uiBlockEndAlign(block);
@@ -2476,7 +2533,6 @@ static void lamp_panel_spot(Object *ob, Lamp *la)
uiDefButBitS(block, TOG, LA_SQUARE, B_LAMPREDRAW,"Square", 10,60,80,19,&la->mode, 0, 0, 0, 0, "Sets square spotbundles");
uiDefButBitS(block, TOG, LA_HALO, B_LAMPREDRAW,"Halo", 10,40,80,19,&la->mode, 0, 0, 0, 0, "Renders spotlight with a volumetric halo");
- uiBlockSetCol(block, TH_AUTO);
uiBlockBeginAlign(block);
uiDefButF(block, NUMSLI,B_LAMPREDRAW,"SpotSi ", 100,180,200,19,&la->spotsize, 1.0, 180.0, 0, 0, "Sets the angle of the spotlight beam in degrees");
uiDefButF(block, NUMSLI,B_LAMPREDRAW,"SpotBl ", 100,160,200,19,&la->spotblend, 0.0, 1.0, 0, 0, "Sets the softness of the spotlight edge");
@@ -2521,25 +2577,46 @@ static void lamp_panel_spot(Object *ob, Lamp *la)
}
}
- else if(la->type==LA_AREA && (la->mode & LA_SHAD_RAY)) {
- uiBlockBeginAlign(block);
- uiBlockSetCol(block, TH_AUTO);
- if(la->area_shape==LA_AREA_SQUARE)
- uiDefButS(block, NUM,0,"Samples:", 100,180,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp)");
- if(la->area_shape==LA_AREA_CUBE)
- uiDefButS(block, NUM,0,"Samples:", 100,160,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp x samp)");
-
- if (ELEM(la->area_shape, LA_AREA_RECT, LA_AREA_BOX)) {
- uiDefButS(block, NUM,0,"SamplesX:", 100,180,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of X samples taken extra");
- uiDefButS(block, NUM,0,"SamplesY:", 100,160,200,19, &la->ray_sampy, 1.0, 16.0, 100, 0, "Sets the amount of Y samples taken extra");
- if(la->area_shape==LA_AREA_BOX)
- uiDefButS(block, NUM,0,"SamplesZ:", 100,140,200,19, &la->ray_sampz, 1.0, 8.0, 100, 0, "Sets the amount of Z samples taken extra");
+ if(ELEM4(la->type, LA_AREA, LA_SPOT, LA_SUN, LA_LOCAL) && (la->mode & LA_SHAD_RAY)) {
+
+ if (ELEM3(la->type, LA_SPOT, LA_SUN, LA_LOCAL)) {
+ if (la->ray_samp_method == LA_SAMP_CONSTANT) la->ray_samp_method = LA_SAMP_HALTON;
+
+ uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2",
+ 100,110,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest, Constant QMC is less noisy but slower");
+
+ uiDefButF(block, NUM,B_LAMPREDRAW,"Soft Size", 100,80,200,19, &la->area_size, 0.01, 100.0, 10, 0, "Area light size, doesn't affect energy amount");
+
+ uiDefButS(block, NUM,0,"Samples:", 100,60,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp)");
+ uiDefButF(block, NUM,0,"Threshold:", 100,40,200,19, &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
}
+ else if (la->type == LA_AREA) {
+ uiDefButS(block, MENU, B_REDR, "Adaptive QMC %x1|Constant QMC %x2|Constant Jittered %x0",
+ 100,180,200,19, &la->ray_samp_method, 0, 0, 0, 0, "Method for generating shadow samples: Adaptive QMC is fastest");
+
+ if(la->area_shape==LA_AREA_SQUARE)
+ uiDefButS(block, NUM,0,"Samples:", 100,150,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp)");
+ else if(la->area_shape==LA_AREA_CUBE)
+ uiDefButS(block, NUM,0,"Samples:", 100,130,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of samples taken extra (samp x samp x samp)");
+
+ if (ELEM(la->area_shape, LA_AREA_RECT, LA_AREA_BOX)) {
+ uiDefButS(block, NUM,0,"SamplesX:", 100,150,200,19, &la->ray_samp, 1.0, 16.0, 100, 0, "Sets the amount of X samples taken extra");
+ uiDefButS(block, NUM,0,"SamplesY:", 100,130,200,19, &la->ray_sampy, 1.0, 16.0, 100, 0, "Sets the amount of Y samples taken extra");
+ if(la->area_shape==LA_AREA_BOX)
+ uiDefButS(block, NUM,0,"SamplesZ:", 100,110,200,19, &la->ray_sampz, 1.0, 8.0, 100, 0, "Sets the amount of Z samples taken extra");
+ }
+
+ if (la->ray_samp_method == LA_SAMP_CONSTANT) {
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, LA_SAMP_UMBRA, 0,"Umbra", 100,90,200,19,&la->ray_samp_type, 0, 0, 0, 0, "Emphasis parts that are fully shadowed");
+ uiDefButBitS(block, TOG, LA_SAMP_DITHER, 0,"Dither", 100,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use 2x2 dithering for sampling");
+ uiDefButBitS(block, TOG, LA_SAMP_JITTER, 0,"Noise", 200,70,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use noise for sampling");
+ } else if (la->ray_samp_method == LA_SAMP_HALTON) {
+ uiDefButF(block, NUM,0,"Threshold:", 100,90,200,19, &la->adapt_thresh, 0.0, 1.0, 100, 0, "Threshold for adaptive sampling, to control what level is considered already in shadow");
+ }
+ }
+
- uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, LA_SAMP_UMBRA, 0,"Umbra", 100,110,200,19,&la->ray_samp_type, 0, 0, 0, 0, "Emphasis parts that are fully shadowed");
- uiDefButBitS(block, TOG, LA_SAMP_DITHER, 0,"Dither", 100,90,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use 2x2 dithering for sampling");
- uiDefButBitS(block, TOG, LA_SAMP_JITTER, 0,"Noise", 200,90,100,19,&la->ray_samp_type, 0, 0, 0, 0, "Use noise for sampling");
}
else uiDefBut(block, LABEL,0," ", 100,180,200,19,NULL, 0, 0, 0, 0, "");
@@ -2632,6 +2709,28 @@ static void lamp_panel_yafray(Object *ob, Lamp *la)
}
+static void lamp_panel_falloff(Object *ob, Lamp *la)
+{
+ uiBlock *block;
+ rctf butr;
+ short yco=PANEL_YMAX;
+ float grid= 0.0;
+
+ /* name "Preview" is abused to detect previewrender offset panel */
+ block= uiNewBlock(&curarea->uiblocks, "lamp_panel_falloff", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed("Lamp", "Lamp");
+ if(uiNewPanel(curarea, block, "Falloff Curve", "Lamp", PANELX, PANELY, PANELW, PANELH)==0) return;
+
+ if(G.vd) grid= G.vd->grid;
+ if(grid<1.0) grid= 1.0;
+
+ uiSetButLock(la->id.lib!=0, ERROR_LIBDATA_MESSAGE);
+
+ BLI_init_rctf(&butr, 10.0, 310.0, 10.0, (float)yco);
+ curvemap_buttons(block, la->curfalloff, 's', B_LFALLOFFCHANGED, B_LAMPREDRAW, &butr);
+
+}
+
static void lamp_panel_lamp(Object *ob, Lamp *la)
{
uiBlock *block;
@@ -2669,7 +2768,8 @@ static void lamp_panel_lamp(Object *ob, Lamp *la)
}
else if( ELEM(la->type, LA_LOCAL, LA_SPOT)) {
uiBlockSetCol(block, TH_BUT_SETTING1);
- uiDefButBitS(block, TOG, LA_QUAD, B_LAMPPRV,"Quad", 10,150,100,19,&la->mode, 0, 0, 0, 0, "Uses inverse quadratic proportion for light attenuation");
+ uiDefButS(block, MENU, B_LAMPREDRAW, "Falloff %t|Constant %x0|Inverse Linear %x1|Inverse Square %x2|Custom Curve %x3|Lin/Quad Weighted %x4|",
+ 10,150,100,19, &la->falloff_type, 0,0,0,0, "Lamp falloff - intensity decay with distance");
uiDefButBitS(block, TOG, LA_SPHERE, REDRAWVIEW3D,"Sphere", 10,130,100,19,&la->mode, 0, 0, 0, 0, "Sets light intensity to zero for objects beyond the distance value");
}
@@ -2693,9 +2793,9 @@ static void lamp_panel_lamp(Object *ob, Lamp *la)
uiDefButF(block, COL, B_LAMPPRV, "", 120,52,180,24, &la->r, 0, 0, 0, B_COLLAMP, "");
uiBlockBeginAlign(block);
- if (ELEM(la->type, LA_LOCAL, LA_SPOT)) {
- uiDefButF(block, NUMSLI,B_LAMPPRV,"Quad1 ", 120,30,180,19,&la->att1, 0.0, 1.0, 0, 0, "Set the linear distance attenuatation for a quad lamp");
- uiDefButF(block, NUMSLI,B_LAMPPRV,"Quad2 ", 120,10,180,19,&la->att2, 0.0, 1.0, 0, 0, "Set the quadratic distance attenuatation for a quad lamp");
+ if (ELEM(la->type, LA_LOCAL, LA_SPOT) && (la->falloff_type == LA_FALLOFF_SLIDERS)) {
+ uiDefButF(block, NUMSLI,B_LAMPPRV,"Linear ", 120,30,180,19,&la->att1, 0.0, 1.0, 0, 0, "Set the linear distance attenuatation for a quad lamp");
+ uiDefButF(block, NUMSLI,B_LAMPPRV,"Quad ", 120,10,180,19,&la->att2, 0.0, 1.0, 0, 0, "Set the quadratic distance attenuatation for a quad lamp");
}
else if(la->type==LA_AREA) {
if(la->k==0.0) la->k= 1.0;
@@ -2830,6 +2930,11 @@ void do_matbuts(unsigned short event)
BIF_preview_changed(ID_WO);
allqueue(REDRAWBUTSSHADING, 0);
break;
+ case B_WORLDPRV2:
+ BIF_preview_changed(ID_WO);
+ allqueue(REDRAWBUTSSHADING, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ break;
case B_MATHALO:
/* when halo is disabled, clear star flag, this is the same as MA_FACETEXTURE <blush> */
/* same for 'xtreme alpha' which is 'only shadow' */
@@ -2938,16 +3043,65 @@ void do_matbuts(unsigned short event)
allqueue(REDRAWBUTSSHADING, 0);
}
break;
-
+
+ case B_MAT_PARTICLE:
+ if(ma) {
+ Base *base;
+ Object *ob;
+ ParticleSystem *psys;
+
+ base= G.scene->base.first;
+ while(base){
+ if(base->object->type==OB_MESH) {
+ ob=base->object;
+ for(psys=ob->particlesystem.first; psys; psys=psys->next) {
+ if(psys && ma==give_current_material(ob,psys->part->omat)) {
+ psys->flag |= PSYS_INIT;
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ }
+ }
+ base = base->next;
+ }
+ allqueue(REDRAWVIEW3D, 0);
+ }
}
}
+static void particle_recalc_material(void *ma_v, void *arg2)
+{
+ Material *ma = ma_v;
+ Base *base;
+ Object *ob;
+ ParticleSystem *psys;
+
+ base= G.scene->base.first;
+ while(base){
+ if(base->object->type==OB_MESH){
+ ob=base->object;
+ for(psys=ob->particlesystem.first; psys; psys=psys->next){
+ if(psys && ma==give_current_material(ob,psys->part->omat)){
+ psys->recalc |= PSYS_INIT;
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ }
+ }
+ base = base->next;
+ }
+ allqueue(REDRAWVIEW3D, 0);
+}
/* if from nodes, hide options that are not available */
-static void material_panel_map_to(Material *ma, int from_nodes)
+static void material_panel_map_to(Object *ob, Material *ma, int from_nodes)
{
uiBlock *block;
+ uiBut *but;
MTex *mtex;
+ ParticleSystem *psys;
+ int psys_mapto=0;
+ static short pattr=0;
block= uiNewBlock(&curarea->uiblocks, "material_panel_map_to", UI_EMBOSS, UI_HELV, curarea->win);
uiNewPanelTabbed("Texture", "Material");
@@ -2963,7 +3117,7 @@ static void material_panel_map_to(Material *ma, int from_nodes)
/* TEXTURE OUTPUT */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, MTEX_STENCIL, B_MATPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Sets the texture mapping to stencil mode");
+ uiDefButBitS(block, TOG, MTEX_STENCIL, B_MATPRV, "Stencil", 10,125,45,19, &(mtex->texflag), 0, 0, 0, 0, "Use this texture as a blending value on the next texture");
uiDefButBitS(block, TOG, MTEX_NEGATIVE, B_MATPRV, "Neg", 55,125,30,19, &(mtex->texflag), 0, 0, 0, 0, "Inverts the values of the texture to reverse its effect");
uiDefButBitS(block, TOG,MTEX_RGBTOINT, B_MATPRV, "No RGB", 85,125,60,19, &(mtex->texflag), 0, 0, 0, 0, "Converts texture RGB values to intensity (gray) values");
uiBlockEndAlign(block);
@@ -2989,32 +3143,82 @@ static void material_panel_map_to(Material *ma, int from_nodes)
/* MAP TO */
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, MAP_COL, B_MATPRV, "Col", 10,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect basic color of the material");
- uiDefButBitS(block, TOG3, MAP_NORM, B_MATPRV, "Nor", 50,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the rendered normal");
- uiDefButBitS(block, TOG, MAP_COLSPEC, B_MATPRV, "Csp", 90,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the specularity color");
- uiDefButBitS(block, TOG, MAP_COLMIR, B_MATPRV, "Cmir", 130,180,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the mirror color");
- uiDefButBitS(block, TOG3, MAP_REF, B_MATPRV, "Ref", 180,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the value of the materials reflectivity");
- uiDefButBitS(block, TOG3, MAP_SPEC, B_MATPRV, "Spec", 220,180,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the value of specularity");
- uiDefButBitS(block, TOG3, MAP_AMB, B_MATPRV, "Amb", 270,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the value of ambient");
-
- uiDefButBitS(block, TOG3, MAP_HAR, B_MATPRV, "Hard", 10,160,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the hardness value");
- uiDefButBitS(block, TOG3, MAP_RAYMIRR, B_MATPRV, "RayMir", 60,160,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the ray-mirror value");
- uiDefButBitS(block, TOG3, MAP_ALPHA, B_MATPRV, "Alpha", 110,160,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the alpha value");
- uiDefButBitS(block, TOG3, MAP_EMIT, B_MATPRV, "Emit", 160,160,45,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the emit value");
- uiDefButBitS(block, TOG3, MAP_TRANSLU, B_MATPRV, "TransLu", 205,160,60,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the layer blending value");
- if(from_nodes==0)
- uiDefButBitS(block, TOG3, MAP_DISPLACE, B_MATPRV, "Disp", 265,160,45,19, &(mtex->mapto), 0, 0, 0, 0, "Let the texture displace the surface");
+
+ /*check if material is being used by particles*/
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ if(psys->part->omat==ob->actcol)
+ psys_mapto=1;
+
+ if(psys_mapto && pattr) {
+ but=uiDefButBitS(block, TOG3, MAP_PA_TIME, B_MAT_PARTICLE, "Time", 10,180,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the emission time of particles");
+ //uiButSetFunc(but, particle_recalc_material, ma, NULL);
+ but=uiDefButBitS(block, TOG3, MAP_PA_LIFE, B_MAT_PARTICLE, "Life", 70,180,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the life time of particles");
+ //uiButSetFunc(but, particle_recalc_material, ma, NULL);
+ but=uiDefButBitS(block, TOG3, MAP_PA_DENS, B_MAT_PARTICLE, "Dens", 130,180,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the density of particles");
+ //uiButSetFunc(but, particle_recalc_material, ma, NULL);
+ uiDefButBitS(block, TOG3, MAP_PA_IVEL, B_MAT_PARTICLE, "IVel", 190,180,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the initial velocity of particles");
+ uiDefButBitS(block, TOG3, MAP_PA_PVEL, B_MAT_PARTICLE, "PVel", 250,180,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the velocity of particles");
+
+ but=uiDefButBitS(block, TOG3, MAP_PA_SIZE, B_MAT_PARTICLE, "Size", 10,160,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the size of particles");
+ //uiButSetFunc(but, particle_recalc_material, ma, NULL);
+ but=uiDefButBitS(block, TOG3, MAP_PA_KINK, B_MAT_PARTICLE, "Kink", 70,160,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the kink of child particles");
+ //uiButSetFunc(but, particle_recalc_material, ma, NULL);
+ but=uiDefButBitS(block, TOG3, MAP_PA_LENGTH, B_MAT_PARTICLE, "Length",130,160,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the length of particles");
+ //uiButSetFunc(but, particle_recalc_material, ma, NULL);
+ but=uiDefButBitS(block, TOG3, MAP_PA_CLUMP, B_MAT_PARTICLE, "Clump", 190,160,60,19, &(mtex->pmapto), 0, 0, 0, 0, "Causes the texture to affect the clump of child particles");
+ //uiButSetFunc(but, particle_recalc_material, ma, NULL);
+
+ uiBlockSetCol(block, TH_BUT_SETTING1);
+ uiDefButBitS(block, TOG, 1, B_MATPRV, "PAttr", 250,160,60,19, &pattr, 0, 0, 0, 0, "Display settings for particle attributes");
+ uiBlockSetCol(block, TH_AUTO);
+ }
+ else {
+ uiDefButBitS(block, TOG, MAP_COL, B_MATPRV, "Col", 10,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect basic colour of the material");
+ uiDefButBitS(block, TOG3, MAP_NORM, B_MATPRV, "Nor", 50,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the rendered normal");
+ uiDefButBitS(block, TOG, MAP_COLSPEC, B_MATPRV, "Csp", 90,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the specularity colour");
+ uiDefButBitS(block, TOG, MAP_COLMIR, B_MATPRV, "Cmir", 130,180,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the mirror colour");
+ uiDefButBitS(block, TOG3, MAP_REF, B_MATPRV, "Ref", 180,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the value of the materials reflectivity");
+ uiDefButBitS(block, TOG3, MAP_SPEC, B_MATPRV, "Spec", 220,180,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the value of specularity");
+ uiDefButBitS(block, TOG3, MAP_AMB, B_MATPRV, "Amb", 270,180,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the value of ambient");
+
+ if(psys_mapto) {
+ uiDefButBitS(block, TOG3, MAP_HAR, B_MATPRV, "Hard", 10,160,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the hardness value");
+ uiDefButBitS(block, TOG3, MAP_RAYMIRR, B_MATPRV, "RayMir", 50,160,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the ray-mirror value");
+ uiDefButBitS(block, TOG3, MAP_ALPHA, B_MATPRV, "Alpha", 90,160,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the alpha value");
+ uiDefButBitS(block, TOG3, MAP_EMIT, B_MATPRV, "Emit", 130,160,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the emit value");
+ uiDefButBitS(block, TOG3, MAP_TRANSLU, B_MATPRV, "TransLu", 180,160,40,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the layer blending value");
+ if(from_nodes==0)
+ uiDefButBitS(block, TOG3, MAP_DISPLACE, B_MATPRV, "Disp", 220,160,50,19, &(mtex->mapto), 0, 0, 0, 0, "Let the texture displace the surface");
+ uiBlockSetCol(block, TH_BUT_SETTING1);
+ uiDefButBitS(block, TOG, 1, B_MATPRV, "PAttr", 270,160,40,19, &pattr, 0, 0, 0, 0, "Display settings for particle attributes");
+ uiBlockSetCol(block, TH_AUTO);
+ }
+ else {
+ uiDefButBitS(block, TOG3, MAP_HAR, B_MATPRV, "Hard", 10,160,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the hardness value");
+ uiDefButBitS(block, TOG3, MAP_RAYMIRR, B_MATPRV, "RayMir", 60,160,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the ray-mirror value");
+ uiDefButBitS(block, TOG3, MAP_ALPHA, B_MATPRV, "Alpha", 110,160,50,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the alpha value");
+ uiDefButBitS(block, TOG3, MAP_EMIT, B_MATPRV, "Emit", 160,160,45,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the emit value");
+ uiDefButBitS(block, TOG3, MAP_TRANSLU, B_MATPRV, "TransLu", 205,160,60,19, &(mtex->mapto), 0, 0, 0, 0, "Causes the texture to affect the layer blending value");
+ if(from_nodes==0)
+ uiDefButBitS(block, TOG3, MAP_DISPLACE, B_MATPRV, "Disp", 265,160,45,19, &(mtex->mapto), 0, 0, 0, 0, "Let the texture displace the surface");
+ }
+ }
+
uiBlockEndAlign(block);
-
+
uiBlockBeginAlign(block);
- uiDefButS(block, MENU, B_MATPRV, mapto_blendtype_pup(),155,125,155,19, &(mtex->blendtype), 0, 0, 0, 0, "Texture blending mode");
+ but=uiDefButS(block, MENU, B_MATPRV, mapto_blendtype_pup(),155,125,155,19, &(mtex->blendtype), 0, 0, 0, 0, "Texture blending mode");
uiBlockEndAlign(block);
+ if(psys_mapto && mtex->pmapto & MAP_PA_INIT)
+ uiButSetFunc(but, particle_recalc_material, ma, NULL);
uiBlockBeginAlign(block);
uiDefButF(block, NUMSLI, B_MATPRV, "Col ", 155,100,155,19, &(mtex->colfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects color values");
/* newnoise: increased range to 25, the constant offset for bumpmapping quite often needs a higher nor setting */
uiDefButF(block, NUMSLI, B_MATPRV, "Nor ", 155,80,155,19, &(mtex->norfac), 0.0, 25.0, 0, 0, "Sets the amount the texture affects normal values");
- uiDefButF(block, NUMSLI, B_MATPRV, "Var ", 155,60,155,19, &(mtex->varfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects other values");
+ but=uiDefButF(block, NUMSLI, B_MATPRV, "Var ", 155,60,155,19, &(mtex->varfac), 0.0, 1.0, 0, 0, "Sets the amount the texture affects other values");
+ if(psys_mapto && mtex->pmapto & MAP_PA_INIT)
+ uiButSetFunc(but, particle_recalc_material, ma, NULL);
uiDefButF(block, NUMSLI, B_MATPRV, "Disp ", 155,40,155,19, &(mtex->dispfac), 0.0, 1.0, 0, 0, "Sets the amount the texture displaces the surface");
uiBlockBeginAlign(block);
@@ -3023,7 +3227,7 @@ static void material_panel_map_to(Material *ma, int from_nodes)
}
/* autocomplete callback for buttons */
-static void autocomplete_uv(char *str, void *arg_v)
+void autocomplete_uv(char *str, void *arg_v)
{
Mesh *me;
CustomDataLayer *layer;
@@ -3044,7 +3248,7 @@ static void autocomplete_uv(char *str, void *arg_v)
autocomplete_end(autocpl, str);
}
-static int verify_valid_uv_name(char *str)
+int verify_valid_uv_name(char *str)
{
Mesh *me;
CustomDataLayer *layer;
@@ -3098,7 +3302,7 @@ static void material_panel_map_input(Object *ob, Material *ma)
uiDefButS(block, ROW, B_MATPRV, "UV", 630,160,40,18, &(mtex->texco), 4.0, (float)TEXCO_UV, 0, 0, "Uses UV coordinates for texture coordinates");
uiDefButS(block, ROW, B_MATPRV, "Orco", 670,160,55,18, &(mtex->texco), 4.0, (float)TEXCO_ORCO, 0, 0, "Uses the original undeformed coordinates of the object");
- if( give_parteff(ob) )
+ if( ob->particlesystem.first )
uiDefButS(block, ROW, B_MATPRV, "Strand", 725,160,50,18, &(mtex->texco), 4.0, (float)TEXCO_STRAND, 0, 0, "Uses normalized strand texture coordinate (1D)");
else
uiDefButS(block, ROW, B_MATPRV, "Stick", 725,160,50,18, &(mtex->texco), 4.0, (float)TEXCO_STICKY, 0, 0, "Uses mesh's sticky coordinates for the texture coordinates");
@@ -3142,12 +3346,14 @@ static void material_panel_map_input(Object *ob, Material *ma)
}
-static void material_panel_texture(Material *ma)
+static void material_panel_texture(Object *ob, Material *ma)
{
uiBlock *block;
+ uiBut *but;
MTex *mtex;
ID *id;
- int loos;
+ ParticleSystem *psys;
+ int loos, psys_mapto=0;
int a;
char str[64], *strp;
@@ -3155,6 +3361,11 @@ static void material_panel_texture(Material *ma)
if(uiNewPanel(curarea, block, "Texture", "Material", 960, 0, 318, 204)==0) return;
uiClearButLock();
+ /*check if material is being used by particles*/
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ if(psys->part->omat==ob->actcol)
+ psys_mapto=1;
+
/* TEX CHANNELS */
uiBlockSetCol(block, TH_BUT_NEUTRAL);
@@ -3176,7 +3387,10 @@ static void material_panel_texture(Material *ma)
for(a= 0; a<MAX_MTEX; a++) {
mtex= ma->mtex[a];
if(mtex && mtex->tex) {
- uiDefIconButBitS(block, ICONTOGN, 1<<a, B_MATPRV, ICON_CHECKBOX_HLT-1, -20, 180-18*a, 28, 20, &ma->septex, 0.0, 0.0, 0, 0, "Click to disable or enable this texture channel");
+ but=uiDefIconButBitS(block, ICONTOGN, 1<<a, B_MATPRV, ICON_CHECKBOX_HLT-1, -20, 180-18*a, 28, 20, &ma->septex, 0.0, 0.0, 0, 0, "Click to disable or enable this texture channel");
+
+ if(psys_mapto && ma->mtex[a]->mapto & MAP_PA_IVEL)
+ uiButSetFunc(but, particle_recalc_material, ma, NULL);
}
}
uiBlockBeginAlign(block);
@@ -3225,44 +3439,102 @@ static void material_panel_texture(Material *ma)
static void material_panel_tramir(Material *ma)
{
- uiBlock *block;
-
- block= uiNewBlock(&curarea->uiblocks, "material_panel_tramir", UI_EMBOSS, UI_HELV, curarea->win);
- uiNewPanelTabbed("Shaders", "Material");
- if(uiNewPanel(curarea, block, "Mirror Transp", "Material", 640, 0, 318, 204)==0) return;
-
- uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE);
+ uiBlock *block;
+ short yco=PANEL_YMAX;
+
+ block= uiNewBlock(&curarea->uiblocks, "material_panel_tramir", UI_EMBOSS, UI_HELV, curarea->win);
+ uiNewPanelTabbed("Shaders", "Material");
+ if(uiNewPanel(curarea, block, "Mirror Transp", "Material", PANELX, PANELY, PANELW, PANELH+80)==0) return;
+
+ uiSetButLock(ma->id.lib!=NULL, ERROR_LIBDATA_MESSAGE);
+
+ uiDefButBitI(block, TOG, MA_RAYMIRROR, B_MATPRV, "Ray Mirror",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for mirror reflection rendering");
+
+ yco -= YSPACE;
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUMSLI, B_MATPRV, "RayMir: ",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->ray_mirror), 0.0, 1.0, 100, 2, "Sets the amount mirror reflection for raytrace");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel: ",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->fresnel_mir), 0.0, 5.0, 10, 2, "Power of Fresnel for mirror reflection");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Fac: ",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->fresnel_mir_i), 1.0, 5.0, 10, 2, "Blending factor for Fresnel");
+ uiBlockEndAlign(block);
+
+ yco -= YSPACE;
- uiDefButBitI(block, TOG, MA_RAYMIRROR, B_MATPRV,"Ray Mirror",210,180,100,20, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for mirror reflection rendering");
-
uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, B_MATPRV, "RayMir ", 10,160,200,20, &(ma->ray_mirror), 0.0, 1.0, 100, 2, "Sets the amount mirror reflection for raytrace");
- uiDefButS(block, NUM, B_MATPRV, "Depth:", 210,160,100,20, &(ma->ray_depth), 0.0, 10.0, 100, 0, "Amount of inter-reflections calculated maximal ");
-
- uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel ", 10,140,160,20, &(ma->fresnel_mir), 0.0, 5.0, 10, 2, "Power of Fresnel for mirror reflection");
- uiDefButF(block, NUMSLI, B_MATPRV, "Fac ", 170,140,140,20, &(ma->fresnel_mir_i), 1.0, 5.0, 10, 2, "Blending factor for Fresnel");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Gloss: ",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->gloss_mir), 0.0, 1.0, 100, 0, "The shininess of the reflection. Values < 1.0 give diffuse, blurry reflections ");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Aniso: ",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->aniso_gloss_mir), 0.0, 1.0, 100, 0, "The shape of the reflection, from 0. (circular) to 1.0 (fully stretched along the tangent)");
+ uiDefButS(block, NUM, B_MATPRV, "Samples:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->samp_gloss_mir), 1.0, 1024.0, 100, 0, "Number of cone samples averaged for blurry reflections");
+ uiDefButF(block, NUM, B_MATPRV, "Thresh: ",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->adapt_thresh_mir), 0.0, 1.0, 100, 0, "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped");
+ uiBlockEndAlign(block);
+
+ yco -= YSPACE;
+ uiDefButS(block, NUM, B_MATPRV, "Depth:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->ray_depth), 0.0, 10.0, 100, 0, "Maximum allowed number of light inter-reflections");
+
+ yco -= YSPACE;
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_MATPRV, "Max Dist:",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->dist_mir), 0.0, 100.0, 100, 0, "Maximum distance of reflected rays. Reflections further than this range fade to sky color");
+ uiDefButS(block, MENU, B_MATPRV, "Ray end fade-out: %t|Fade to Sky Color %x0|Fade to Material Color %x1",
+ X2CLM1, yco-=BUTH, BUTW2, BUTH, &(ma->fadeto_mir), 0, 0, 0, 0, "The color that rays with no intersection within the Max Distance take. Material color can be best for indoor scenes, sky color for outdoor.");
+ uiBlockEndAlign(block);
+
+ yco=PANEL_YMAX;
+ uiDefButBitI(block, TOG, MA_RAYTRANSP, B_MATRAYTRANSP,"Ray Transp",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for transparent refraction rendering");
+
+ yco -= YSPACE;
+
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_MATPRV, "Filt:", 10,110,150,20, &(ma->filter), 0.0, 1.0, 10, 0, "Amount of filtering for transparent raytrace");
- uiDefButBitI(block, TOG, MA_RAYTRANSP, B_MATRAYTRANSP,"Ray Transp",160,110,150,20, &(ma->mode), 0, 0, 0, 0, "Enables raytracing for transparency rendering");
-
- /* uiBlockBeginAlign(block); */
- uiDefButF(block, NUMSLI, B_MATPRV, "IOR ", 10,90,200,20, &(ma->ang), 1.0, 3.0, 100, 2, "Sets the angular index of refraction for raytrace");
- uiDefButS(block, NUM, B_MATPRV, "Depth:", 210,90,100,20, &(ma->ray_depth_tra), 0.0, 10.0, 100, 0, "Amount of refractions calculated maximal ");
-
- uiDefButF(block, NUMSLI, B_MATPRV, "Limit ", 10,70,160,20, &(ma->tx_limit), 0.0, 100.0, 10, 2, "Depth limit for transmissivity (0.0 is disabled)");
- uiDefButF(block, NUMSLI, B_MATPRV, "Falloff ", 170,70,140,20, &(ma->tx_falloff), 0.1, 10.0, 10, 2, "Falloff power for transmissivity (1.0 is linear)");
-
- uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel ", 10,50,160,20, &(ma->fresnel_tra), 0.0, 5.0, 10, 2, "Power of Fresnel for transparency");
- uiDefButF(block, NUMSLI, B_MATPRV, "Fac ", 170,50,140,20, &(ma->fresnel_tra_i), 1.0, 5.0, 10, 2, "Blending factor for Fresnel");
-
+ uiDefButF(block, NUMSLI, B_MATPRV, "IOR: ",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->ang), 1.0, 3.0, 100, 2, "Sets angular index of refraction for raytraced refraction");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Fresnel: ",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->fresnel_tra), 0.0, 5.0, 10, 2, "Power of Fresnel for mirror reflection");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Fac: ",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->fresnel_tra_i), 1.0, 5.0, 10, 2, "Blending factor for Fresnel");
+ uiBlockEndAlign(block);
+
+ yco -= YSPACE;
+
uiBlockBeginAlign(block);
- uiDefButF(block, NUMSLI, B_MATPRV, "SpecTra ", 10,20,150,20, &(ma->spectra), 0.0, 1.0, 0, 0, "Makes specular areas opaque on transparent materials");
-// uiDefButF(block, NUMSLI, B_MATPRV, "Add ", 160,20,150,20, &(ma->add), 0.0, 1.0, 0, 0, "Uses additive blending for Z-transparant materials");
-
+ uiDefButF(block, NUMSLI, B_MATPRV, "Gloss: ",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->gloss_tra), 0.0, 1.0, 100, 0, "The clarity of the refraction. Values < 1.0 give diffuse, blurry reflections ");
+ uiDefButS(block, NUM, B_MATPRV, "Samples:",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->samp_gloss_tra), 0.0, 1024.0, 100, 0, "Number of cone samples averaged for blurry refractions");
+ uiDefButF(block, NUM, B_MATPRV, "Thresh: ",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->adapt_thresh_tra), 0.0, 1.0, 100, 0, "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped");
+ uiBlockEndAlign(block);
+
+ yco -= YSPACE;
+
+ uiDefButS(block, NUM, B_MATPRV, "Depth:",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->ray_depth_tra), 0.0, 10.0, 100, 0, "Maximum allowed number of light inter-refractions");
+
+ yco -= YSPACE;
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_MATPRV, "Filter:",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->filter), 0.0, 1.0, 10, 0, "Amount to blend in the material's diffuse color in raytraced transparency (simulating absorption)");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Limit: ",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->tx_limit), 0.0, 100.0, 10, 2, "Maximum depth for light to travel through the transparent material before becoming fully filtered (0.0 is disabled)");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Falloff: ",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->tx_falloff), 0.1, 10.0, 10, 2, "Falloff power for transmissivity filter effect (1.0 is linear)");
uiBlockEndAlign(block);
-}
+ yco -= YSPACE;
+
+ uiDefButF(block, NUMSLI, B_MATPRV, "SpecTra: ",
+ X2CLM2, yco-=BUTH, BUTW2, BUTH, &(ma->spectra), 0.0, 1.0, 0, 0, "Makes specular areas opaque on transparent materials");
+}
/* yafray: adapted version of Blender's tramir panel.
* Only removed the buttons not needed, so only the ones that are important for yafray are left.
@@ -3502,7 +3774,7 @@ static void material_panel_shading(Material *ma)
uiDefButF(block, NUMSLI, B_MATPRV, "Tralu ", 9,30,150,19, &(ma->translucency), 0.0, 1.0, 100, 2, "Translucency, amount of diffuse shading of the back side");
uiDefButF(block, NUMSLI, B_MATPRV, "SBias ", 159,30,151,19, &(ma->sbias), 0.0, 0.25, 10, 2, "Shadow bias, to prevent terminator problems on shadow boundary");
uiDefButF(block, NUMSLI, B_MATPRV, "Amb ", 9,10,150,19, &(ma->amb), 0.0, 1.0, 0, 0, "Sets the amount of global ambient color the material receives");
- uiDefButF(block, NUMSLI, B_MATPRV, "Emit ", 159,10,151,19, &(ma->emit), 0.0, 1.0, 0, 0, "Sets the amount of light the material emits");
+ uiDefButF(block, NUMSLI, B_MATPRV, "Emit ", 159,10,151,19, &(ma->emit), 0.0, 2.0, 0, 0, "Sets the amount of light the material emits");
uiBlockEndAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1);
@@ -3580,17 +3852,25 @@ static uiBlock *strand_menu(void *mat_v)
block= uiNewBlock(&curarea->uiblocks, "strand menu", UI_EMBOSS, UI_HELV, curarea->win);
/* use this for a fake extra empy space around the buttons */
- uiDefBut(block, LABEL, 0, "", 0, 0, 250, 100, NULL, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "", 0, 0, 250, 120, NULL, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
/* event return 0, to prevent menu to close */
- uiDefButBitI(block, TOG, MA_TANGENT_STR, 0, "Use Tangent Shading", 10,70,230,20, &(ma->mode), 0, 0, 0, 0, "Uses direction of strands as normal for tangent-shading");
- uiDefButF(block, NUMSLI, 0, "Start ", 10, 50, 230,20, &ma->strand_sta, 0.25, 20.0, 2, 0, "Start size of strands in pixels");
- uiDefButF(block, NUMSLI, 0, "End ", 10, 30, 230,20, &ma->strand_end, 0.25, 10.0, 2, 0, "End size of strands in pixels");
- uiDefButF(block, NUMSLI, 0, "Shape ", 10, 10, 230,20, &ma->strand_ease, -0.9, 0.9, 2, 0, "Shape of strands, positive value makes it rounder, negative makes it spiky");
+ uiDefButBitI(block, TOG, MA_TANGENT_STR, 0, "Use Tangent Shading", 10,90,115,20, &(ma->mode), 0, 0, 0, 0, "Uses direction of strands as normal for tangent-shading");
+ uiDefButBitI(block, TOG, MA_STR_B_UNITS, 0, "Use Blender Units", 125,90,115,20, &(ma->mode), 0, 0, 0, 0, "Use actual Blender units for widths instead of pixels");
+ if(ma->mode & MA_STR_B_UNITS){
+ uiDefButF(block, NUMSLI, 0, "Start ", 10, 70, 230,20, &ma->strand_sta, 0.01, 20.0, 2, 0, "Start size of strands in Blender units");
+ uiDefButF(block, NUMSLI, 0, "End ", 10, 50, 230,20, &ma->strand_end, 0.01, 10.0, 2, 0, "End size of strands in Blender units");
+ }
+ else{
+ uiDefButF(block, NUMSLI, 0, "Start ", 10, 70, 230,20, &ma->strand_sta, 0.25, 20.0, 2, 0, "Start size of strands in pixels");
+ uiDefButF(block, NUMSLI, 0, "End ", 10, 50, 230,20, &ma->strand_end, 0.25, 10.0, 2, 0, "End size of strands in pixels");
+ }
+ uiDefButF(block, NUMSLI, 0, "Shape ", 10, 30, 230,20, &ma->strand_ease, -0.9, 0.9, 2, 0, "Shape of strands, positive value makes it rounder, negative makes it spiky");
+ uiDefBut(block, TEX, B_MATPRV, "UV:", 10,10,230,20, ma->strand_uvname, 0, 31, 0, 0, "Set name of UV layer to override");
uiBlockSetDirection(block, UI_TOP);
-
+ BIF_preview_changed(ID_MA);
return block;
}
@@ -3625,8 +3905,9 @@ static void material_panel_material(Material *ma)
uiBlockSetCol(block, TH_BUT_SETTING1);
uiDefButBitI(block, TOG, MA_VERTEXCOL, B_MAT_VCOL_LIGHT, "VCol Light", 8,166,74,20, &(ma->mode), 0, 0, 0, 0, "Adds vertex colors as extra light");
uiDefButBitI(block, TOG, MA_VERTEXCOLP, B_MAT_VCOL_PAINT, "VCol Paint", 82,166,74,20, &(ma->mode), 0, 0, 0, 0, "Replaces material's colors with vertex colors");
- uiDefButBitI(block, TOG, MA_FACETEXTURE, B_REDR, "TexFace", 156,166,74,20, &(ma->mode), 0, 0, 0, 0, "Sets UV-Editor assigned texture as color and texture info for faces");
- uiDefButBitI(block, TOG, MA_SHLESS, B_MATPRV, "Shadeless", 230,166,73,20, &(ma->mode), 0, 0, 0, 0, "Makes material insensitive to light or shadow");
+ uiDefButBitI(block, TOG, MA_FACETEXTURE, B_REDR, "TexFace", 156,166,64,20, &(ma->mode), 0, 0, 0, 0, "Sets UV-Editor assigned texture as color and texture info for faces");
+ if (ma->mode & MA_FACETEXTURE) uiDefButBitI(block, TOG, MA_FACETEXTURE_ALPHA, B_REDR, "A", 220,166,20,20, &(ma->mode), 0, 0, 0, 0, "Use alpha channel in 'TexFace' assigned images");
+ uiDefButBitI(block, TOG, MA_SHLESS, B_MATPRV, "Shadeless", 240,166,63,20, &(ma->mode), 0, 0, 0, 0, "Makes material insensitive to light or shadow");
uiDefButBitI(block, TOG, MA_NOMIST, B_NOP, "No Mist", 8,146,74,20, &(ma->mode), 0, 0, 0, 0, "Sets the material to ignore mist values");
uiDefButBitI(block, TOG, MA_ENV, B_MATPRV, "Env", 82,146,74,20, &(ma->mode), 0, 0, 0, 0, "Causes faces to render with alpha zero: allows sky/backdrop to show through (only for solid faces)");
@@ -3670,7 +3951,8 @@ static void material_panel_material(Material *ma)
uiDefButF(block, NUMSLI, B_MATPRV, "B ", 128,57,175,19, colpoin+2, 0.0, 1.0, rgbsel, 0, "");
}
uiBlockEndAlign(block);
- uiDefButF(block, NUMSLI, B_MATPRV, "A ", 128,30,175,19, &ma->alpha, 0.0, 1.0, 0, 0, "Alpha");
+ if (ma->mode & (MA_FACETEXTURE) && ma->mode & (MA_FACETEXTURE_ALPHA)) ;
+ else uiDefButF(block, NUMSLI, B_MATPRV, "A ", 128,30,175,19, &ma->alpha, 0.0, 1.0, 0, 0, "Alpha");
}
uiBlockBeginAlign(block);
@@ -3799,7 +4081,7 @@ static void material_panel_links(Object *ob, Material *ma)
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, MA_HALO, B_MATHALO, "Halo", 10,50,100,19, &(ma->mode), 0, 0, 0, 0, "Renders material as a halo");
uiDefButBitI(block, TOG, MA_ZTRA, B_MATZTRANSP,"ZTransp", 110,50,100,19, &(ma->mode), 0, 0, 0, 0, "Enables Z-Buffering of transparent faces");
- uiDefButF(block, NUM, B_DIFF, "Zoffs:", 210,50,100,19, &(ma->zoffs), 0.0, 10.0, 100, 0, "Gives faces an artificial offset in the Z buffer for Ztransp option");
+ uiDefButF(block, NUM, B_DIFF, "Zoffs:", 210,50,100,19, &(ma->zoffs), 0.0, 100.0, 100, 0, "Gives faces an artificial offset in the Z buffer for Ztransp option");
uiDefButBitI(block, TOG, MA_FULL_OSA, 0, "Full Osa", 10,30,75,19, &(ma->mode), 0.0, 10.0, 0, 0, "Forces to render all OSA samples, for shading and texture antialiasing");
uiDefButBitI(block, TOG, MA_WIRE, B_MATPRV, "Wire", 85,30,75,19, &(ma->mode), 0, 0, 0, 0, "Renders only the edges of faces as a wireframe");
@@ -3883,12 +4165,12 @@ void material_panels()
}
material_panel_sss(ma);
- material_panel_texture(ma);
+ material_panel_texture(ob, ma);
mtex= ma->mtex[ ma->texact ];
if(mtex && mtex->tex) {
material_panel_map_input(ob, ma);
- material_panel_map_to(ma, from_nodes);
+ material_panel_map_to(ob, ma, from_nodes);
}
}
}
@@ -3897,24 +4179,29 @@ void material_panels()
void lamp_panels()
{
Object *ob= OBACT;
+ Lamp *la;
if(ob==NULL || ob->type!= OB_LAMP) return;
+ la= ob->data;
lamp_panel_preview(ob, ob->data);
lamp_panel_lamp(ob, ob->data);
+
+ if (ELEM(la->type, LA_SPOT, LA_LOCAL) && (la->falloff_type == LA_FALLOFF_CURVE))
+ lamp_panel_falloff(ob, ob->data);
+
/* switch to yafray lamp panel if yafray enabled */
if (G.scene->r.renderer==R_INTERN)
lamp_panel_spot(ob, ob->data);
else {
/* init vars */
- Lamp* lp = ob->data;
- if (lp->YF_numphotons==0) lp->YF_numphotons=1000;
- if (lp->YF_numsearch==0) lp->YF_numsearch=10;
- if (lp->YF_phdepth==0) lp->YF_phdepth=1;
- if (lp->YF_causticblur==0.0) lp->YF_causticblur=0.001;
- if (lp->YF_bufsize==0) lp->YF_bufsize=128;
+ if (la->YF_numphotons==0) la->YF_numphotons=1000;
+ if (la->YF_numsearch==0) la->YF_numsearch=10;
+ if (la->YF_phdepth==0) la->YF_phdepth=1;
+ if (la->YF_causticblur==0.0) la->YF_causticblur=0.001;
+ if (la->YF_bufsize==0) la->YF_bufsize=128;
/* spherelight radius default is zero, so nothing to do */
- lamp_panel_yafray(ob, lp);
+ lamp_panel_yafray(ob, la);
}
lamp_panel_texture(ob, ob->data);
lamp_panel_mapto(ob, ob->data);
diff --git a/source/blender/src/drawaction.c b/source/blender/src/drawaction.c
index 6576dac1d2c..183558b65bc 100644
--- a/source/blender/src/drawaction.c
+++ b/source/blender/src/drawaction.c
@@ -25,7 +25,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): Joshua Leung
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
* Drawing routines for the Action window type
@@ -61,7 +61,9 @@
#include "DNA_key_types.h"
#include "BKE_action.h"
+#include "BKE_depsgraph.h"
#include "BKE_ipo.h"
+#include "BKE_key.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
@@ -69,6 +71,7 @@
#include "BIF_editaction.h"
#include "BIF_editkey.h"
+#include "BIF_editnla.h"
#include "BIF_interface.h"
#include "BIF_interface_icons.h"
#include "BIF_gl.h"
@@ -83,6 +86,7 @@
#include "BSE_drawnla.h"
#include "BSE_drawipo.h"
+#include "BSE_editaction_types.h"
#include "BSE_editipo.h"
#include "BSE_time.h"
#include "BSE_view.h"
@@ -92,12 +96,14 @@
#include "blendef.h"
#include "mydevice.h"
+/********************************** Slider Stuff **************************** */
+
/* sliders for shapekeys */
static void meshactionbuts(SpaceAction *saction, Object *ob, Key *key)
{
int i;
char str[64];
- float x, y;
+ float x, y;
uiBlock *block;
uiBut *but;
@@ -113,16 +119,15 @@ static void meshactionbuts(SpaceAction *saction, Object *ob, Key *key)
myortho2(-0.375, curarea->winx-0.375, G.v2d->cur.ymin, G.v2d->cur.ymax);
sprintf(str, "actionbuttonswin %d", curarea->win);
- block= uiNewBlock (&curarea->uiblocks, str,
- UI_EMBOSS, UI_HELV, curarea->win);
+ block= uiNewBlock (&curarea->uiblocks, str, UI_EMBOSS, UI_HELV, curarea->win);
x = NAMEWIDTH + 1;
- y = CHANNELHEIGHT/2;
+ y = 0.0f;
/* make the little 'open the sliders' widget */
- BIF_ThemeColor(TH_FACE); // this slot was open...
- glRects(2, y + 2*CHANNELHEIGHT - 2,
- ACTWIDTH - 2, y + CHANNELHEIGHT + 2);
+ // should eventually be removed
+ BIF_ThemeColor(TH_FACE); // this slot was open... (???... Aligorith)
+ glRects(2, y + 2*CHANNELHEIGHT - 2, ACTWIDTH - 2, y + CHANNELHEIGHT + 2);
glColor3ub(0, 0, 0);
glRasterPos2f(4, y + CHANNELHEIGHT + 6);
BMF_DrawString(G.font, "Sliders");
@@ -158,14 +163,14 @@ static void meshactionbuts(SpaceAction *saction, Object *ob, Key *key)
glRects(NAMEWIDTH, 0, NAMEWIDTH+SLIDERWIDTH, curarea->winy);
uiBlockSetEmboss(block, UI_EMBOSS);
- for (i=1 ; i < key->totkey ; ++ i) {
+ for (i=1; i < key->totkey; i++) {
make_rvk_slider(block, ob, i,
x, y, SLIDERWIDTH-2, CHANNELHEIGHT-1, "Slider to control Shape Keys");
y-=CHANNELHEIGHT+CHANNELSKIP;
/* see sliderval array in editkey.c */
- if(i>=255) break;
+ if(i >= 255) break;
}
}
uiDrawBlock(block);
@@ -195,23 +200,32 @@ static void icu_slider_func(void *voidicu, void *voidignore)
/* create the bezier triple if one doesn't exist,
* otherwise modify it's value
*/
- if (!bezt) {
- insert_vert_ipo(icu, cfra, icu->curval);
+ if (bezt == NULL) {
+ insert_vert_icu(icu, cfra, icu->curval, 0);
}
else {
bezt->vec[1][1] = icu->curval;
}
- /* make sure the Ipo's are properly process and
+ /* make sure the Ipo's are properly processed and
* redraw as necessary
*/
sort_time_ipocurve(icu);
testhandles_ipocurve(icu);
- allqueue (REDRAWVIEW3D, 0);
- allqueue (REDRAWACTION, 0);
- allqueue (REDRAWNLA, 0);
- allqueue (REDRAWIPO, 0);
+ /* nla-update (in case this affects anything) */
+ synchronize_action_strips();
+
+ /* do redraw pushes, and also the depsgraph flushes */
+ if (OBACT->pose || ob_get_key(OBACT))
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC);
+ else
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_OB);
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWNLA, 0);
+ allqueue(REDRAWIPO, 0);
allspace(REMAKEIPO, 0);
allqueue(REDRAWBUTSALL, 0);
}
@@ -226,8 +240,8 @@ static void make_icu_slider(uiBlock *block, IpoCurve *icu,
if (IS_EQ(icu->slide_max, icu->slide_min)) {
if (IS_EQ(icu->ymax, icu->ymin)) {
- if (icu->blocktype == ID_CO) {
- /* hack for constraints (and maybe a few others) */
+ if (ELEM(icu->blocktype, ID_CO, ID_KE)) {
+ /* hack for constraints and shapekeys (and maybe a few others) */
icu->slide_min= 0.0;
icu->slide_max= 1.0;
}
@@ -280,7 +294,7 @@ static void action_icu_buts(SpaceAction *saction)
UI_EMBOSS, UI_HELV, curarea->win);
x = NAMEWIDTH + 1;
- y = 0.0;
+ y = 0.0f;
uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -336,11 +350,14 @@ static void action_icu_buts(SpaceAction *saction)
uiDrawBlock(block);
}
-void draw_cfra_action(void)
+/********************************** Current Frame **************************** */
+
+void draw_cfra_action (void)
{
Object *ob;
float vec[2];
+ /* Draw a light green line to indicate current frame */
vec[0]= (G.scene->r.cfra);
vec[0]*= G.scene->r.framelen;
@@ -354,6 +371,7 @@ void draw_cfra_action(void)
glVertex2fv(vec);
glEnd();
+ /* Draw dark green line if slow-parenting/time-offset is enabled */
ob= (G.scene->basact) ? (G.scene->basact->object) : 0;
if(ob && ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
vec[0]-= ob->sf;
@@ -370,209 +388,23 @@ void draw_cfra_action(void)
glLineWidth(1.0);
}
-/* left hand */
-static void draw_action_channel_names(bAction *act)
-{
- bActionChannel *achan;
- bConstraintChannel *conchan;
- IpoCurve *icu;
- float x, y;
-
- x = 0.0;
- y = 0.0f;
-
- for (achan=act->chanbase.first; achan; achan= achan->next) {
- if(VISIBLE_ACHAN(achan)) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
-
- /* draw backing strip behind action channel name */
- BIF_ThemeColorShade(TH_HEADER, 20);
- glRectf(x, y-CHANNELHEIGHT/2, (float)NAMEWIDTH, y+CHANNELHEIGHT/2);
-
- /* draw expand/collapse triangle for action-channel */
- if (EXPANDED_ACHAN(achan))
- BIF_icon_draw(x+1, y-CHANNELHEIGHT/2, ICON_TRIA_DOWN);
- else
- BIF_icon_draw(x+1, y-CHANNELHEIGHT/2, ICON_TRIA_RIGHT);
-
- /* draw name of action channel */
- if (SEL_ACHAN(achan))
- BIF_ThemeColor(TH_TEXT_HI);
- else
- BIF_ThemeColor(TH_TEXT);
- glRasterPos2f(x+18, y-4);
- BMF_DrawString(G.font, achan->name);
-
- /* draw 'lock' indicating whether channel is protected */
- if (EDITABLE_ACHAN(achan)==0)
- BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_LOCKED);
- else
- BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_UNLOCKED);
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- if (EXPANDED_ACHAN(achan)) {
- /* Draw IPO-curves show/hide widget */
- if (achan->ipo) {
- /* draw backing strip behind */
- BIF_ThemeColorShade(TH_HEADER, -20);
- glRectf(x+7, y-CHANNELHEIGHT/2, (float)NAMEWIDTH, y+CHANNELHEIGHT/2);
-
- /* draw expand/collapse triangle for showing sub-channels */
- if (FILTER_IPO_ACHAN(achan))
- BIF_icon_draw(x+8, y-CHANNELHEIGHT/2, ICON_TRIA_DOWN);
- else
- BIF_icon_draw(x+8, y-CHANNELHEIGHT/2, ICON_TRIA_RIGHT);
-
- /* draw icon showing type of ipo-block */
- BIF_icon_draw(x+24, y-CHANNELHEIGHT/2, geticon_ipo_blocktype(achan->ipo->blocktype));
-
- /* draw name of ipo-block */
- if (SEL_ACHAN(achan))
- BIF_ThemeColor(TH_TEXT_HI);
- else
- BIF_ThemeColor(TH_TEXT);
- glRasterPos2f(x+40, y-4);
- BMF_DrawString(G.font, "IPO Curves"); // TODO: make proper naming scheme
-
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- /* Draw IPO-curve-channels? */
- if (FILTER_IPO_ACHAN(achan)) {
- for (icu=achan->ipo->curve.first; icu; icu=icu->next) {
- char *icu_name= getname_ipocurve(icu);
-
- /* draw backing strip behind ipo-curve channel*/
- BIF_ThemeColorShade(TH_HEADER, -40);
- glRectf(x+14, y-CHANNELHEIGHT/2, (float)NAMEWIDTH, y+CHANNELHEIGHT/2);
-
- /* draw name of ipo-curve channel */
- if (SEL_ICU(icu))
- BIF_ThemeColor(TH_TEXT_HI);
- else
- BIF_ThemeColor(TH_TEXT);
- glRasterPos2f(x+24, y-4);
- BMF_DrawString(G.font, icu_name);
-
-#if 0 /* tempolarily disabled until all ipo-code can support this option */
- /* draw 'lock' to indicate if ipo-curve channel is protected */
- if (EDITABLE_ICU(icu)==0)
- BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_LOCKED);
- else
- BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_UNLOCKED);
-#endif
- y-=CHANNELHEIGHT+CHANNELSKIP;
- }
- }
- }
-
- /* Draw constraints show/hide widget */
- if (achan->constraintChannels.first) {
- /* draw backing strip behind */
- BIF_ThemeColorShade(TH_HEADER, -20);
- glRectf(x+7, y-CHANNELHEIGHT/2, (float)NAMEWIDTH, y+CHANNELHEIGHT/2);
-
- /* draw expand/collapse triangle for showing sub-channels */
- if (FILTER_CON_ACHAN(achan))
- BIF_icon_draw(x+8, y-CHANNELHEIGHT/2, ICON_TRIA_DOWN);
- else
- BIF_icon_draw(x+8, y-CHANNELHEIGHT/2, ICON_TRIA_RIGHT);
-
- /* draw constraint icon */
- BIF_icon_draw(x+24, y-CHANNELHEIGHT/2, ICON_CONSTRAINT);
-
- /* draw name of widget */
- if (SEL_ACHAN(achan))
- BIF_ThemeColor(TH_TEXT_HI);
- else
- BIF_ThemeColor(TH_TEXT);
- glRasterPos2f(x+40, y-4);
- BMF_DrawString(G.font, "Constraints");
-
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- /* Draw constraint channels? */
- if (FILTER_CON_ACHAN(achan)) {
- for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
- /* draw backing strip behind constraint channel*/
- BIF_ThemeColorShade(TH_HEADER, -40);
- glRectf(x+14, y-CHANNELHEIGHT/2, (float)NAMEWIDTH, y+CHANNELHEIGHT/2);
-
- /* draw name of constraint channel */
- if (SEL_CONCHAN(conchan))
- BIF_ThemeColor(TH_TEXT_HI);
- else
- BIF_ThemeColor(TH_TEXT);
- glRasterPos2f(x+25, y-4);
- BMF_DrawString(G.font, conchan->name);
-
- /* draw 'lock' to indicate if constraint channel is protected */
- if (EDITABLE_CONCHAN(conchan)==0)
- BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_LOCKED);
- else
- BIF_icon_draw(NAMEWIDTH-16, y-CHANNELHEIGHT/2, ICON_UNLOCKED);
- y-=CHANNELHEIGHT+CHANNELSKIP;
- }
- }
- }
- }
-
- glDisable(GL_BLEND);
- }
- }
-}
-
-
-static void draw_action_mesh_names(Key *key)
-{
- /* draws the names of the rvk keys in the
- * left side of the action window
- */
- int i;
- char keyname[32];
- float x, y;
- KeyBlock *kb;
-
- x = 0.0;
- y= 0.0;
-
- kb= key->block.first;
-
- for (i=1 ; i < key->totkey ; ++ i) {
- glColor3ub(0xAA, 0xAA, 0xAA);
- glRectf(x, y-CHANNELHEIGHT/2, (float)NAMEWIDTH, y+CHANNELHEIGHT/2);
-
- glColor3ub(0, 0, 0);
-
- glRasterPos2f(x+8, y-4);
- kb = kb->next;
- /* Blender now has support for named
- * key blocks. If a name hasn't
- * been set for an key block then
- * just display the key number --
- * otherwise display the name stored
- * in the keyblock.
- */
- if (kb->name[0] == '\0') {
- sprintf(keyname, "Key %d", i);
- BMF_DrawString(G.font, keyname);
- }
- else {
- BMF_DrawString(G.font, kb->name);
- }
-
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- }
-}
+/********************************** Left-Hand Panel + Generics **************************** */
/* left hand part */
static void draw_channel_names(void)
{
- short ofsx, ofsy = 0;
- bAction *act;
- Key *key;
-
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+ short ofsx = 0, ofsy = 0;
+ float x= 0.0f, y= 0.0f;
+
+ /* determine what type of data we are operating on */
+ data = get_action_context(&datatype);
+ if (data == NULL) return;
+
/* Clip to the scrollable area */
if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
if(G.v2d->scroll) {
@@ -587,58 +419,197 @@ static void draw_channel_names(void)
}
}
- myortho2(0, NAMEWIDTH, G.v2d->cur.ymin, G.v2d->cur.ymax); // Scaling
+ /* prepare scaling for LHS panel */
+ myortho2(0, NAMEWIDTH, G.v2d->cur.ymin, G.v2d->cur.ymax);
+ /* set default color back to black */
glColor3ub(0x00, 0x00, 0x00);
-
- act=G.saction->action;
-
- if (act) {
- /* if there is a selected action then
- * draw the channel names
- */
- draw_action_channel_names(act);
- }
- else if ( (key = get_action_mesh_key()) ) {
- /* if there is a mesh selected with rvk's,
- * then draw the RVK names
- */
- draw_action_mesh_names(key);
- }
-
- myortho2(0, NAMEWIDTH, 0, (ofsy+G.v2d->mask.ymax) -
- (ofsy+G.v2d->mask.ymin)); // Scaling
-
-}
-
-int count_action_levels(bAction *act)
-{
- bActionChannel *achan;
- int y=0;
-
- if (!act)
- return 0;
-
- for (achan=act->chanbase.first; achan; achan=achan->next) {
- if(VISIBLE_ACHAN(achan)) {
- y++;
-
- if (EXPANDED_ACHAN(achan)) {
- if (achan->constraintChannels.first) {
- y++;
- if (FILTER_CON_ACHAN(achan))
- y += BLI_countlist(&achan->constraintChannels);
+
+ /* build list of channels to draw */
+ filter= (ACTFILTER_FORDRAWING|ACTFILTER_VISIBLE|ACTFILTER_CHANNELS);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ /* loop through channels, and set up drawing depending on their type */
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ for (ale= act_data.first; ale; ale= ale->next) {
+ short indent= 0, offset= 0, sel= 0;
+ int expand= -1, protect = -1, special= -1, mute = -1;
+ char name[32];
+
+ /* determine what needs to be drawn */
+ switch (ale->type) {
+ case ACTTYPE_ACHAN: /* action channel */
+ {
+ bActionChannel *achan= (bActionChannel *)ale->data;
+
+ indent = 0;
+ special = -1;
+
+ if (EXPANDED_ACHAN(achan))
+ expand = ICON_TRIA_DOWN;
+ else
+ expand = ICON_TRIA_RIGHT;
+
+ if (EDITABLE_ACHAN(achan))
+ protect = ICON_UNLOCKED;
+ else
+ protect = ICON_LOCKED;
+
+ if (achan->ipo) {
+ if (achan->ipo->muteipo)
+ mute = ICON_MUTE_IPO_ON;
+ else
+ mute = ICON_MUTE_IPO_OFF;
}
- else if (achan->ipo) {
- y++;
- if (FILTER_IPO_ACHAN(achan))
- y += BLI_countlist(&achan->ipo->curve);
+
+ sel = SEL_ACHAN(achan);
+ sprintf(name, achan->name);
+ }
+ break;
+ case ACTTYPE_CONCHAN: /* constraint channel */
+ {
+ bConstraintChannel *conchan = (bConstraintChannel *)ale->data;
+
+ indent = 2;
+
+ if (EDITABLE_CONCHAN(conchan))
+ protect = ICON_UNLOCKED;
+ else
+ protect = ICON_LOCKED;
+
+ if (conchan->ipo) {
+ if (conchan->ipo->muteipo)
+ mute = ICON_MUTE_IPO_ON;
+ else
+ mute = ICON_MUTE_IPO_OFF;
}
+
+ sel = SEL_CONCHAN(conchan);
+ sprintf(name, conchan->name);
+ }
+ break;
+ case ACTTYPE_ICU: /* ipo-curve channel */
+ {
+ IpoCurve *icu = (IpoCurve *)ale->data;
+
+ indent = 2;
+ protect = -1; // for now, until this can be supported by others
+
+ if (icu->flag & IPO_MUTE)
+ mute = ICON_MUTE_IPO_ON;
+ else
+ mute = ICON_MUTE_IPO_OFF;
+
+ sel = SEL_ICU(icu);
+ if (G.saction->pin)
+ sprintf(name, getname_ipocurve(icu, NULL));
+ else
+ sprintf(name, getname_ipocurve(icu, OBACT));
+ }
+ break;
+ case ACTTYPE_SHAPEKEY: /* shapekey channel */
+ {
+ KeyBlock *kb = (KeyBlock *)ale->data;
+
+ indent = 0;
+ special = -1;
+
+ if (kb->name[0] == '\0')
+ sprintf(name, "Key %d", ale->index);
+ else
+ sprintf(name, kb->name);
}
+ break;
+ case ACTTYPE_FILLIPO: /* ipo expand widget */
+ {
+ bActionChannel *achan = (bActionChannel *)ale->data;
+
+ indent = 1;
+ special = geticon_ipo_blocktype(achan->ipo->blocktype);
+
+ if (FILTER_IPO_ACHAN(achan))
+ expand = ICON_TRIA_DOWN;
+ else
+ expand = ICON_TRIA_RIGHT;
+
+ sel = SEL_ACHAN(achan);
+ sprintf(name, "IPO Curves");
+ }
+ break;
+ case ACTTYPE_FILLCON: /* constraint expand widget */
+ {
+ bActionChannel *achan = (bActionChannel *)ale->data;
+
+ indent = 1;
+ special = ICON_CONSTRAINT;
+
+ if (FILTER_CON_ACHAN(achan))
+ expand = ICON_TRIA_DOWN;
+ else
+ expand = ICON_TRIA_RIGHT;
+
+ sel = SEL_ACHAN(achan);
+ sprintf(name, "Constraint");
+ }
+ break;
+ }
+
+ /* now, start drawing based on this information */
+ /* draw backing strip behind channel name */
+ BIF_ThemeColorShade(TH_HEADER, ((indent==0)?20: (indent==1)?-20: -40));
+ offset = 7 * indent;
+ glRectf(x+offset, y-CHANNELHEIGHT/2, (float)NAMEWIDTH, y+CHANNELHEIGHT/2);
+
+ /* draw expand/collapse triangle */
+ if (expand > 0) {
+ BIF_icon_draw(x+offset, y-CHANNELHEIGHT/2, expand);
+ offset += 17;
+ }
+
+ /* draw special icon indicating type of ipo-blocktype?
+ * only for expand widgets for Ipo and Constraint Channels
+ */
+ if (special > 0) {
+ offset = 24;
+ BIF_icon_draw(x+offset, y-CHANNELHEIGHT/2, special);
+ offset += 17;
+ }
+
+ /* draw name */
+ if (sel)
+ BIF_ThemeColor(TH_TEXT_HI);
+ else
+ BIF_ThemeColor(TH_TEXT);
+ offset += 3;
+ glRasterPos2f(x+offset, y-4);
+ BMF_DrawString(G.font, name);
+
+ /* reset offset - for RHS of panel */
+ offset = 0;
+
+ /* draw protect 'lock' */
+ if (protect > 0) {
+ offset = 16;
+ BIF_icon_draw(NAMEWIDTH-offset, y-CHANNELHEIGHT/2, protect);
}
+
+ /* draw mute 'eye' */
+ if (mute > 0) {
+ offset += 16;
+ BIF_icon_draw(NAMEWIDTH-offset, y-CHANNELHEIGHT/2, mute);
+ }
+
+ /* adjust y-position for next one */
+ y-=CHANNELHEIGHT+CHANNELSKIP;
}
-
- return y;
+
+ /* free tempolary channels */
+ BLI_freelistN(&act_data);
+
+ /* re-adjust view matrices for correct scaling */
+ myortho2(0, NAMEWIDTH, 0, (ofsy+G.v2d->mask.ymax) - (ofsy+G.v2d->mask.ymin)); // Scaling
}
/* sets or clears hidden flags */
@@ -668,14 +639,16 @@ void check_action_context(SpaceAction *saction)
}
}
-static void draw_channel_strips(SpaceAction *saction)
+static void draw_channel_strips(void)
{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+
rcti scr_rct;
gla2DDrawInfo *di;
- bAction *act;
- bActionChannel *achan;
- bConstraintChannel *conchan;
- IpoCurve *icu;
float y, sta, end;
int act_start, act_end, dummy;
char col1[3], col2[3];
@@ -683,140 +656,123 @@ static void draw_channel_strips(SpaceAction *saction)
BIF_GetThemeColor3ubv(TH_SHADE2, col2);
BIF_GetThemeColor3ubv(TH_HILITE, col1);
- act= saction->action;
- if (!act)
- return;
+ /* get editor data */
+ data= get_action_context(&datatype);
+ if (data == NULL) return;
- scr_rct.xmin= saction->area->winrct.xmin + saction->v2d.mask.xmin;
- scr_rct.ymin= saction->area->winrct.ymin + saction->v2d.mask.ymin;
- scr_rct.xmax= saction->area->winrct.xmin + saction->v2d.hor.xmax;
- scr_rct.ymax= saction->area->winrct.ymin + saction->v2d.mask.ymax;
+ scr_rct.xmin= G.saction->area->winrct.xmin + G.saction->v2d.mask.xmin;
+ scr_rct.ymin= G.saction->area->winrct.ymin + G.saction->v2d.mask.ymin;
+ scr_rct.xmax= G.saction->area->winrct.xmin + G.saction->v2d.hor.xmax;
+ scr_rct.ymax= G.saction->area->winrct.ymin + G.saction->v2d.mask.ymax;
di= glaBegin2DDraw(&scr_rct, &G.v2d->cur);
/* if in NLA there's a strip active, map the view */
- if (G.saction->pin==0 && OBACT)
- map_active_strip(di, OBACT, 0);
-
- /* start and end of action itself */
- calc_action_range(act, &sta, &end, 0);
- gla2DDrawTranslatePt(di, sta, 0.0f, &act_start, &dummy);
- gla2DDrawTranslatePt(di, end, 0.0f, &act_end, &dummy);
+ if (datatype == ACTCONT_ACTION) {
+ if (NLA_ACTION_SCALED)
+ map_active_strip(di, OBACT, 0);
+
+ /* start and end of action itself */
+ calc_action_range(data, &sta, &end, 0);
+ gla2DDrawTranslatePt(di, sta, 0.0f, &act_start, &dummy);
+ gla2DDrawTranslatePt(di, end, 0.0f, &act_end, &dummy);
+
+ if (NLA_ACTION_SCALED)
+ map_active_strip(di, OBACT, 1);
+ }
- if (G.saction->pin==0 && OBACT)
- map_active_strip(di, OBACT, 1);
+ /* build list of channels to draw */
+ filter= (ACTFILTER_FORDRAWING|ACTFILTER_VISIBLE|ACTFILTER_CHANNELS);
+ actdata_filter(&act_data, filter, data, datatype);
/* first backdrop strips */
y = 0.0;
glEnable(GL_BLEND);
- for (achan=act->chanbase.first; achan; achan= achan->next) {
- if(VISIBLE_ACHAN(achan)) {
- int frame1_x, channel_y;
-
- gla2DDrawTranslatePt(di, G.v2d->cur.xmin, y, &frame1_x, &channel_y);
-
- if (SEL_ACHAN(achan)) glColor4ub(col1[0], col1[1], col1[2], 0x22);
- else glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(frame1_x, channel_y-CHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2);
-
- if (SEL_ACHAN(achan)) glColor4ub(col1[0], col1[1], col1[2], 0x22);
- else glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(act_start, channel_y-CHANNELHEIGHT/2, act_end, channel_y+CHANNELHEIGHT/2);
-
- /* Increment the step */
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- /* Draw sub channels */
- if (EXPANDED_ACHAN(achan)) {
- /* Draw ipo channels */
- if (achan->ipo) {
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- if (FILTER_IPO_ACHAN(achan)) {
- for (icu=achan->ipo->curve.first; icu; icu=icu->next) {
- gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
-
- if (SEL_ICU(icu)) glColor4ub(col1[0], col1[1], col1[2], 0x22);
- else glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(frame1_x, channel_y-CHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2-4);
-
- if (SEL_ICU(icu)) glColor4ub(col1[0], col1[1], col1[2], 0x22);
- else glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(act_start, channel_y-CHANNELHEIGHT/2+4, act_end, channel_y+CHANNELHEIGHT/2-4);
-
- y-=CHANNELHEIGHT+CHANNELSKIP;
- }
- }
+ for (ale= act_data.first; ale; ale= ale->next) {
+ int frame1_x, channel_y, sel=0;
+
+ /* determine if any need to draw channel */
+ if (ale->datatype != ALE_NONE) {
+ /* determine if channel is selected */
+ switch (ale->type) {
+ case ACTTYPE_ACHAN:
+ {
+ bActionChannel *achan = (bActionChannel *)ale->data;
+ sel = SEL_ACHAN(achan);
}
-
- /* Draw constraint channels */
- if (achan->constraintChannels.first) {
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- if (FILTER_CON_ACHAN(achan)) {
- for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
- gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
-
- if (SEL_CONCHAN(conchan)) glColor4ub(col1[0], col1[1], col1[2], 0x22);
- else glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(frame1_x, channel_y-CHANNELHEIGHT/2+4, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2-4);
-
- if (SEL_CONCHAN(conchan)) glColor4ub(col1[0], col1[1], col1[2], 0x22);
- else glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(act_start, channel_y-CHANNELHEIGHT/2+4, act_end, channel_y+CHANNELHEIGHT/2-4);
-
- y-=CHANNELHEIGHT+CHANNELSKIP;
- }
- }
+ break;
+ case ACTTYPE_CONCHAN:
+ {
+ bConstraintChannel *conchan = (bConstraintChannel *)ale->data;
+ sel = SEL_CONCHAN(conchan);
+ }
+ break;
+ case ACTTYPE_ICU:
+ {
+ IpoCurve *icu = (IpoCurve *)ale->data;
+ sel = SEL_ICU(icu);
}
+ break;
+ }
+
+ if (datatype == ACTCONT_ACTION) {
+ gla2DDrawTranslatePt(di, G.v2d->cur.xmin, y, &frame1_x, &channel_y);
+
+ if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
+ else glColor4ub(col2[0], col2[1], col2[2], 0x22);
+ glRectf(frame1_x, channel_y-CHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2);
+
+ if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
+ else glColor4ub(col2[0], col2[1], col2[2], 0x22);
+ glRectf(act_start, channel_y-CHANNELHEIGHT/2, act_end, channel_y+CHANNELHEIGHT/2);
+ }
+ else if (datatype == ACTCONT_SHAPEKEY) {
+ gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
+
+ /* all frames that have a frame number less than one
+ * get a desaturated orange background
+ */
+ glColor4ub(col2[0], col2[1], col2[2], 0x22);
+ glRectf(0, channel_y-CHANNELHEIGHT/2, frame1_x, channel_y+CHANNELHEIGHT/2);
+
+ /* frames one and higher get a saturated orange background */
+ glColor4ub(col2[0], col2[1], col2[2], 0x44);
+ glRectf(frame1_x, channel_y-CHANNELHEIGHT/2, G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2);
}
}
+
+ /* Increment the step */
+ y-=CHANNELHEIGHT+CHANNELSKIP;
}
glDisable(GL_BLEND);
- if (G.saction->pin==0 && OBACT)
+ if (NLA_ACTION_SCALED)
map_active_strip(di, OBACT, 0);
- /* keyframes */
+ /* draw keyframes */
y = 0.0;
- for (achan= act->chanbase.first; achan; achan= achan->next) {
- if(VISIBLE_ACHAN(achan)) {
-
- draw_ipo_channel(di, achan->ipo, y);
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- /* Draw sub channels */
- if (EXPANDED_ACHAN(achan)) {
- /* Draw ipo curves */
- if (achan->ipo) {
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- if (FILTER_IPO_ACHAN(achan)) {
- for (icu=achan->ipo->curve.first; icu; icu=icu->next) {
- draw_icu_channel(di, icu, y);
- y-=CHANNELHEIGHT+CHANNELSKIP;
- }
- }
- }
-
- /* Draw constraint channels */
- if (achan->constraintChannels.first) {
- y-=CHANNELHEIGHT+CHANNELSKIP;
-
- if (FILTER_CON_ACHAN(achan)) {
- for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
- draw_ipo_channel(di, conchan->ipo, y);
- y-=CHANNELHEIGHT+CHANNELSKIP;
- }
- }
- }
- }
+ for (ale= act_data.first; ale; ale= ale->next) {
+ switch (ale->datatype) {
+ case ALE_IPO:
+ draw_ipo_channel(di, ale->key_data, y);
+ break;
+ case ALE_ICU:
+ draw_icu_channel(di, ale->key_data, y);
+ break;
}
+
+ y-=CHANNELHEIGHT+CHANNELSKIP;
}
+
+ /* free tempolary channels used for drawing */
+ BLI_freelistN(&act_data);
- if(saction->flag & SACTION_MOVING) {
+ /* black line marking 'current frame' for Time-Slide transform mode */
+ if (G.saction->flag & SACTION_MOVING) {
int frame1_x, channel_y;
- gla2DDrawTranslatePt(di, saction->timeslide, 0, &frame1_x, &channel_y);
+
+ gla2DDrawTranslatePt(di, G.saction->timeslide, 0, &frame1_x, &channel_y);
cpack(0x0);
+
glBegin(GL_LINES);
glVertex2f(frame1_x, G.v2d->mask.ymin - 100);
glVertex2f(frame1_x, G.v2d->mask.ymax);
@@ -826,58 +782,6 @@ static void draw_channel_strips(SpaceAction *saction)
glaEnd2DDraw(di);
}
-static void draw_mesh_strips(SpaceAction *saction, Key *key)
-{
- /* draw the RVK keyframes */
- rcti scr_rct;
- gla2DDrawInfo *di;
- float y, ybase;
- IpoCurve *icu;
- char col1[3], col2[3];
-
- BIF_GetThemeColor3ubv(TH_SHADE2, col2);
- BIF_GetThemeColor3ubv(TH_HILITE, col1);
-
- if (!key->ipo) return;
-
- scr_rct.xmin= saction->area->winrct.xmin + ACTWIDTH;
- scr_rct.ymin= saction->area->winrct.ymin + saction->v2d.mask.ymin;
- scr_rct.xmax= saction->area->winrct.xmin + saction->v2d.hor.xmax;
- scr_rct.ymax= saction->area->winrct.ymin + saction->v2d.mask.ymax;
- di= glaBegin2DDraw(&scr_rct, &G.v2d->cur);
-
- ybase = 0;
-
- for (icu = key->ipo->curve.first; icu ; icu = icu->next) {
- int frame1_x, channel_y;
-
- /* lets not deal with the "speed" Ipo */
- if (icu->adrcode==0) continue;
-
- y = ybase - (CHANNELHEIGHT+CHANNELSKIP)*(icu->adrcode-1);
- gla2DDrawTranslatePt(di, 1, y, &frame1_x, &channel_y);
-
- /* all frames that have a frame number less than one
- * get a desaturated orange background
- */
- glEnable(GL_BLEND);
- glColor4ub(col2[0], col2[1], col2[2], 0x22);
- glRectf(0, channel_y-CHANNELHEIGHT/2,
- frame1_x, channel_y+CHANNELHEIGHT/2);
-
- /* frames one and higher get a saturated orange background */
- glColor4ub(col2[0], col2[1], col2[2], 0x44);
- glRectf(frame1_x, channel_y-CHANNELHEIGHT/2,
- G.v2d->hor.xmax, channel_y+CHANNELHEIGHT/2);
- glDisable(GL_BLEND);
-
- /* draw the keyframes */
- draw_icu_channel(di, icu, y);
- }
-
- glaEnd2DDraw(di);
-}
-
/* ********* action panel *********** */
@@ -926,57 +830,55 @@ static void action_blockhandlers(ScrArea *sa)
uiDrawBlocksPanels(sa, 0);
}
+/* ************************* Action Editor Space ***************************** */
+
void drawactionspace(ScrArea *sa, void *spacedata)
{
+ bAction *act = NULL;
+ Key *key = NULL;
+ void *data;
+ short datatype;
+
short ofsx = 0, ofsy = 0;
- bAction *act;
- Key *key;
float col[3];
- short maxymin;
- if (!G.saction)
+ /* this is unlikely to occur, but it may */
+ if (G.saction == NULL)
return;
- /* warning; blocks need to be freed each time, handlers dont remove */
+ /* warning: blocks need to be freed each time, handlers dont remove */
uiFreeBlocksWin(&sa->uiblocks, sa->win);
- if (!G.saction->pin) {
- /* allow more than one active action sometime? */
+ /* only try to refresh action that's displayed if not pinned */
+ if (G.saction->pin==0) {
+ /* TODO: allow more than one active action sometime? */
if (OBACT)
G.saction->action = OBACT->action;
else
- G.saction->action=NULL;
+ G.saction->action= NULL;
}
- key = get_action_mesh_key();
- act= G.saction->action;
-
- /* Damn I hate hunting to find my rvk's because
- * they have scrolled off of the screen ... this
- * oughta fix it
- */
- if (!act && key) {
- if (G.v2d->cur.ymin < -CHANNELHEIGHT)
- G.v2d->cur.ymin = -CHANNELHEIGHT;
-
- maxymin = -(key->totkey*(CHANNELHEIGHT+CHANNELSKIP));
- if (G.v2d->cur.ymin > maxymin) G.v2d->cur.ymin = maxymin;
- }
-
+ /* get data */
+ data = get_action_context(&datatype);
+ if (datatype == ACTCONT_ACTION)
+ act = data;
+ else if (datatype == ACTCONT_SHAPEKEY)
+ key = data;
+
/* Lets make sure the width of the left hand of the screen
* is set to an appropriate value based on whether sliders
* are showing of not
*/
- if (((key)||(act)) && (G.saction->flag & SACTION_SLIDERS))
+ if ((data) && (G.saction->flag & SACTION_SLIDERS))
ACTWIDTH = NAMEWIDTH + SLIDERWIDTH;
else
ACTWIDTH = NAMEWIDTH;
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
calc_scrollrcts(sa, G.v2d, curarea->winx, curarea->winy);
- /* background color for entire window (used in lefthand part tho) */
+ /* background color for entire window (used in lefthand part though) */
BIF_GetThemeColor3fv(TH_HEADER, col);
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
@@ -1009,15 +911,7 @@ void drawactionspace(ScrArea *sa, void *spacedata)
check_action_context(G.saction);
/* Draw channel strips */
- if (act) {
- draw_channel_strips(G.saction);
- }
- else if (key) {
- /* if there is a mesh with rvk's selected,
- * then draw the key frames in the action window
- */
- draw_mesh_strips(G.saction, key);
- }
+ draw_channel_strips();
/* reset matrices for stuff to be drawn on top of keys*/
glViewport(ofsx+G.v2d->mask.xmin,
@@ -1034,22 +928,23 @@ void drawactionspace(ScrArea *sa, void *spacedata)
draw_cfra_action();
/* Draw markers */
- draw_markers_timespace();
+ draw_markers_timespace(0);
/* Draw 'curtains' for preview */
draw_anim_preview_timespace();
/* Draw scroll */
mywinset(curarea->win); // reset scissor too
- if(curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
- myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375);
- if(G.v2d->scroll) drawscroll(0);
+ if (curarea->winx>SCROLLB+10 && curarea->winy>SCROLLH+10) {
+ myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375);
+ if (G.v2d->scroll) drawscroll(0);
}
- if(G.v2d->mask.xmin!=0) {
+ /* Draw Left-Hand Panel if enough space in window */
+ if (G.v2d->mask.xmin!=0) {
/* Draw channel names */
draw_channel_names();
-
+
if(sa->winx > 50 + NAMEWIDTH + SLIDERWIDTH) {
if (act) {
/* if there is an action, draw sliders for its
@@ -1077,9 +972,133 @@ void drawactionspace(ScrArea *sa, void *spacedata)
curarea->win_swap= WIN_BACK_OK;
}
-static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, float ypos, int totcurve)
+/* *************************** Keyframe Drawing *************************** */
+
+static void add_bezt_to_keycolumnslist(ListBase *keys, BezTriple *bezt)
{
- CfraElem *ce;
+ /* The equivilant of add_to_cfra_elem except this version
+ * makes ActKeyColumns - one of the two datatypes required
+ * for action editor drawing.
+ */
+ ActKeyColumn *ak, *akn;
+
+ if (!(keys) || !(bezt)) return;
+
+ /* try to find a keyblock that starts on the previous beztriple */
+ for (ak= keys->first; ak; ak= ak->next) {
+ /* do because of double keys */
+ if (ak->cfra == bezt->vec[1][0]) {
+ /* set selection status and 'touched' status */
+ if (BEZSELECTED(bezt)) ak->sel = SELECT;
+ ak->modified += 1;
+
+ return;
+ }
+ else if (ak->cfra > bezt->vec[1][0]) break;
+ }
+
+ /* add new block */
+ akn= MEM_callocN(sizeof(ActKeyColumn), "ActKeyColumn");
+ if (ak) BLI_insertlinkbefore(keys, ak, akn);
+ else BLI_addtail(keys, akn);
+
+ akn->cfra= bezt->vec[1][0];
+ akn->modified += 1;
+
+ // TODO: handle type = bezt->h1 or bezt->h2
+ akn->handle_type= 0;
+
+ if (BEZSELECTED(bezt))
+ akn->sel = SELECT;
+ else
+ akn->sel = 0;
+}
+
+static void add_bezt_to_keyblockslist(ListBase *blocks, IpoCurve *icu, int index)
+{
+ /* The equivilant of add_to_cfra_elem except this version
+ * makes ActKeyBlocks - one of the two datatypes required
+ * for action editor drawing.
+ */
+ ActKeyBlock *ab, *abn;
+ BezTriple *beztn=NULL, *prev=NULL;
+ BezTriple *bezt;
+ int v;
+
+ /* get beztriples */
+ beztn= (icu->bezt + index);
+
+ for (v=0, bezt=icu->bezt; v<icu->totvert; v++, bezt++) {
+ /* skip if beztriple is current */
+ if (v != index) {
+ /* check if beztriple is immediately before */
+ if (beztn->vec[1][0] > bezt->vec[1][0]) {
+ /* check if closer than previous was */
+ if (prev) {
+ if (prev->vec[1][0] < bezt->vec[1][0])
+ prev= bezt;
+ }
+ else {
+ prev= bezt;
+ }
+ }
+ }
+ }
+
+ /* check if block needed - same value? */
+ if ((!prev) || (!beztn))
+ return;
+ if (beztn->vec[1][1] != prev->vec[1][1])
+ return;
+
+ /* try to find a keyblock that starts on the previous beztriple */
+ for (ab= blocks->first; ab; ab= ab->next) {
+ /* check if alter existing block or add new block */
+ if (ab->start == prev->vec[1][0]) {
+ /* set selection status and 'touched' status */
+ if (BEZSELECTED(beztn)) ab->sel = SELECT;
+ ab->modified += 1;
+
+ return;
+ }
+ else if (ab->start > prev->vec[1][0]) break;
+ }
+
+ /* add new block */
+ abn= MEM_callocN(sizeof(ActKeyBlock), "ActKeyBlock");
+ if (ab) BLI_insertlinkbefore(blocks, ab, abn);
+ else BLI_addtail(blocks, abn);
+
+ abn->start= prev->vec[1][0];
+ abn->end= beztn->vec[1][0];
+ abn->val= beztn->vec[1][1];
+
+ if (BEZSELECTED(prev) || BEZSELECTED(beztn))
+ abn->sel = SELECT;
+ else
+ abn->sel = 0;
+ abn->modified = 1;
+}
+
+/* helper function - find actkeycolumn that occurs on cframe */
+static ActKeyColumn *cfra_find_actkeycolumn (ListBase *keys, float cframe)
+{
+ ActKeyColumn *ak;
+
+ if (keys==NULL)
+ return NULL;
+
+ for (ak= keys->first; ak; ak= ak->next) {
+ if (ak->cfra == cframe)
+ return ak;
+ }
+
+ return NULL;
+}
+
+static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, float ypos)
+{
+ ActKeyColumn *ak;
ActKeyBlock *ab;
glEnable(GL_BLEND);
@@ -1087,8 +1106,22 @@ static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, fl
/* draw keyblocks */
if (blocks) {
for (ab= blocks->first; ab; ab= ab->next) {
- /* only draw keyblock if it appears in all curves sampled */
- if (ab->totcurve == totcurve) {
+ short startCurves, endCurves, totCurves;
+
+ /* find out how many curves occur at each keyframe */
+ ak= cfra_find_actkeycolumn(keys, ab->start);
+ startCurves = (ak)? ak->totcurve: 0;
+
+ ak= cfra_find_actkeycolumn(keys, 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) {
int sc_xa, sc_ya;
int sc_xb, sc_yb;
@@ -1097,7 +1130,7 @@ static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, fl
gla2DDrawTranslatePt(di, ab->end, ypos, &sc_xb, &sc_yb);
/* draw block */
- if (ab->sel & 1)
+ if (ab->sel)
BIF_ThemeColor4(TH_STRIP_SELECT);
else
BIF_ThemeColor4(TH_STRIP);
@@ -1108,13 +1141,13 @@ static void draw_keylist(gla2DDrawInfo *di, ListBase *keys, ListBase *blocks, fl
/* draw keys */
if (keys) {
- for (ce= keys->first; ce; ce= ce->next) {
+ for (ak= keys->first; ak; ak= ak->next) {
int sc_x, sc_y;
/* get co-ordinate to draw at */
- gla2DDrawTranslatePt(di, ce->cfra, ypos, &sc_x, &sc_y);
+ gla2DDrawTranslatePt(di, ak->cfra, ypos, &sc_x, &sc_y);
- if(ce->sel & 1) BIF_icon_draw_aspect(sc_x-7, sc_y-6, ICON_SPACE2, 1.0f);
+ if(ak->sel & 1) BIF_icon_draw_aspect(sc_x-7, sc_y-6, ICON_SPACE2, 1.0f);
else BIF_icon_draw_aspect(sc_x-7, sc_y-6, ICON_SPACE3, 1.0f);
}
}
@@ -1126,10 +1159,9 @@ void draw_object_channel(gla2DDrawInfo *di, Object *ob, float ypos)
{
ListBase keys = {0, 0};
ListBase blocks = {0, 0};
- int totcurve;
- totcurve= ob_to_keylist(ob, &keys, &blocks);
- draw_keylist(di, &keys, &blocks, ypos, totcurve);
+ ob_to_keylist(ob, &keys, &blocks);
+ draw_keylist(di, &keys, &blocks, ypos);
BLI_freelistN(&keys);
BLI_freelistN(&blocks);
@@ -1139,10 +1171,9 @@ void draw_ipo_channel(gla2DDrawInfo *di, Ipo *ipo, float ypos)
{
ListBase keys = {0, 0};
ListBase blocks = {0, 0};
- int totcurve;
- totcurve= ipo_to_keylist(ipo, &keys, &blocks);
- draw_keylist(di, &keys, &blocks, ypos, totcurve);
+ ipo_to_keylist(ipo, &keys, &blocks);
+ draw_keylist(di, &keys, &blocks, ypos);
BLI_freelistN(&keys);
BLI_freelistN(&blocks);
@@ -1154,7 +1185,7 @@ void draw_icu_channel(gla2DDrawInfo *di, IpoCurve *icu, float ypos)
ListBase blocks = {0, 0};
icu_to_keylist(icu, &keys, &blocks);
- draw_keylist(di, &keys, &blocks, ypos, 1);
+ draw_keylist(di, &keys, &blocks, ypos);
BLI_freelistN(&keys);
BLI_freelistN(&blocks);
@@ -1165,116 +1196,37 @@ void draw_action_channel(gla2DDrawInfo *di, bAction *act, float ypos)
ListBase keys = {0, 0};
action_to_keylist(act, &keys, NULL);
- draw_keylist(di, &keys, NULL, ypos, 0);
+ draw_keylist(di, &keys, NULL, ypos);
BLI_freelistN(&keys);
}
-static void add_bezt_to_keyblockslist(ListBase *blocks, IpoCurve *icu, int index)
-{
- /* The equivilant of add_to_cfra_elem except this version
- * makes ActKeyBlocks - one of the two datatypes required
- * for action editor drawing.
- */
- ActKeyBlock *ab, *abn;
- BezTriple *beztn=NULL, *prev=NULL;
- BezTriple *bezt;
- int v;
-
- /* get beztriples */
- beztn= (icu->bezt + index);
- /* The following search for previous beztriple doesn't work
- * that great on actions with a large amount of keys. There
- * are a few commented out shortcuts for these cases, which will
- * remain so until the definitive point where slowdown starts to
- * bite is determined.
- */
- //if (icu->totvert > 3500) {
- // if (index >= 1)
- // prev= (icu->bezt + (index - 1));
- //}
- //else {
- for (v=0, bezt=icu->bezt; v<icu->totvert; v++, bezt++) {
- /* skip if beztriple is current */
- if (v != index) {
- /* check if beztriple is immediately before */
- if (beztn->vec[1][0] > bezt->vec[1][0]) {
- /* check if closer than previous was */
- if (prev) {
- if (prev->vec[1][0] < bezt->vec[1][0])
- prev= bezt;
- }
- else {
- prev= bezt;
- }
- }
- }
- }
- //}
-
- /* check if block needed - same value? */
- if ((!prev) || (!beztn))
- return;
- if (beztn->vec[1][1] != prev->vec[1][1])
- return;
-
- /* try to find a keyblock that starts on the previous beztriple */
- for (ab= blocks->first; ab; ab= ab->next) {
- /* check if alter existing block or add new block */
- if (ab->start == prev->vec[1][0]) {
- /* set selection status and 'touched' status */
- if (BEZSELECTED(beztn)) ab->sel = SELECT;
- ab->modified += 1;
-
- return;
- }
- else if (ab->start > prev->vec[1][0]) break;
- }
-
- /* add new block */
- abn= MEM_callocN(sizeof(ActKeyBlock), "add_bezt_to_keyblockslist");
- if (ab) BLI_insertlinkbefore(blocks, ab, abn);
- else BLI_addtail(blocks, abn);
-
- abn->start= prev->vec[1][0];
- abn->end= beztn->vec[1][0];
- abn->val= beztn->vec[1][1];
-
- if (BEZSELECTED(prev) || BEZSELECTED(beztn))
- abn->sel = SELECT;
- else
- abn->sel = 0;
- abn->modified += 1;
-}
+/* --------------- Conversion: data -> keyframe list ------------------ */
-int ob_to_keylist(Object *ob, ListBase *keys, ListBase *blocks)
+void ob_to_keylist(Object *ob, ListBase *keys, ListBase *blocks)
{
bConstraintChannel *conchan;
- int totcurve = 0;
if (ob) {
/* Add object keyframes */
- if (ob->ipo) {
- totcurve += ipo_to_keylist(ob->ipo, keys, blocks);
- }
+ if (ob->ipo)
+ ipo_to_keylist(ob->ipo, keys, blocks);
/* Add constraint keyframes */
for (conchan=ob->constraintChannels.first; conchan; conchan=conchan->next){
- if(conchan->ipo) {
- totcurve += ipo_to_keylist(conchan->ipo, keys, blocks);
- }
+ if(conchan->ipo)
+ ipo_to_keylist(conchan->ipo, keys, blocks);
}
/* Add object data keyframes */
// TODO??
}
-
- return totcurve;
}
void icu_to_keylist(IpoCurve *icu, ListBase *keys, ListBase *blocks)
{
BezTriple *bezt;
- ActKeyBlock *ab, *abn;
+ ActKeyColumn *ak;
+ ActKeyBlock *ab;
int v;
if (icu && icu->totvert) {
@@ -1282,15 +1234,21 @@ void icu_to_keylist(IpoCurve *icu, ListBase *keys, ListBase *blocks)
bezt= icu->bezt;
for (v=0; v<icu->totvert; v++, bezt++) {
- add_to_cfra_elem(keys, bezt);
+ add_bezt_to_keycolumnslist(keys, bezt);
if (blocks) add_bezt_to_keyblockslist(blocks, icu, v);
}
- /* update the number of curves the blocks have appeared in */
+ /* update the number of curves that elements have appeared in */
+ if (keys) {
+ for (ak= keys->first; ak; ak= ak->next) {
+ if (ak->modified) {
+ ak->modified = 0;
+ ak->totcurve += 1;
+ }
+ }
+ }
if (blocks) {
- for (ab= blocks->first; ab; ab= abn) {
- abn= ab->next;
-
+ for (ab= blocks->first; ab; ab= ab->next) {
if (ab->modified) {
ab->modified = 0;
ab->totcurve += 1;
@@ -1300,44 +1258,34 @@ void icu_to_keylist(IpoCurve *icu, ListBase *keys, ListBase *blocks)
}
}
-int ipo_to_keylist(Ipo *ipo, ListBase *keys, ListBase *blocks)
+void ipo_to_keylist(Ipo *ipo, ListBase *keys, ListBase *blocks)
{
IpoCurve *icu;
- int totcurve = 0;
if (ipo) {
- for (icu= ipo->curve.first; icu; icu= icu->next) {
+ for (icu= ipo->curve.first; icu; icu= icu->next)
icu_to_keylist(icu, keys, blocks);
- totcurve++;
- }
}
-
- return totcurve;
}
-int action_to_keylist(bAction *act, ListBase *keys, ListBase *blocks)
+void action_to_keylist(bAction *act, ListBase *keys, ListBase *blocks)
{
bActionChannel *achan;
bConstraintChannel *conchan;
- int totcurve = 0;
if (act) {
/* loop through action channels */
for (achan= act->chanbase.first; achan; achan= achan->next) {
/* firstly, add keys from action channel's ipo block */
- if (achan->ipo) {
- totcurve+= ipo_to_keylist(achan->ipo, keys, blocks);
- }
+ if (achan->ipo)
+ ipo_to_keylist(achan->ipo, keys, blocks);
/* then, add keys from constraint channels */
for (conchan= achan->constraintChannels.first; conchan; conchan= conchan->next) {
- if (conchan->ipo) {
- totcurve+= ipo_to_keylist(achan->ipo, keys, blocks);
- }
+ if (conchan->ipo)
+ ipo_to_keylist(achan->ipo, keys, blocks);
}
}
}
-
- return totcurve;
}
diff --git a/source/blender/src/drawarmature.c b/source/blender/src/drawarmature.c
index dfcaefd03ff..c907bab5a23 100644
--- a/source/blender/src/drawarmature.c
+++ b/source/blender/src/drawarmature.c
@@ -103,76 +103,74 @@ static float cube[8][3] = {
static void drawsolidcube_size(float xsize, float ysize, float zsize)
{
+ static GLuint displist=0;
float n[3];
glScalef(xsize, ysize, zsize);
n[0]=0; n[1]=0; n[2]=0;
- glBegin(GL_QUADS);
- n[0]= -1.0;
- glNormal3fv(n);
- glVertex3fv(cube[0]); glVertex3fv(cube[1]); glVertex3fv(cube[2]); glVertex3fv(cube[3]);
- n[0]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[1]= -1.0;
- glNormal3fv(n);
- glVertex3fv(cube[0]); glVertex3fv(cube[4]); glVertex3fv(cube[5]); glVertex3fv(cube[1]);
- n[1]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[0]= 1.0;
- glNormal3fv(n);
- glVertex3fv(cube[4]); glVertex3fv(cube[7]); glVertex3fv(cube[6]); glVertex3fv(cube[5]);
- n[0]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[1]= 1.0;
- glNormal3fv(n);
- glVertex3fv(cube[7]); glVertex3fv(cube[3]); glVertex3fv(cube[2]); glVertex3fv(cube[6]);
- n[1]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[2]= 1.0;
- glNormal3fv(n);
- glVertex3fv(cube[1]); glVertex3fv(cube[5]); glVertex3fv(cube[6]); glVertex3fv(cube[2]);
- n[2]=0;
- glEnd();
-
- glBegin(GL_QUADS);
- n[2]= -1.0;
- glNormal3fv(n);
- glVertex3fv(cube[7]); glVertex3fv(cube[4]); glVertex3fv(cube[0]); glVertex3fv(cube[3]);
- glEnd();
+
+ if(displist==0) {
+ displist= glGenLists(1);
+ glNewList(displist, GL_COMPILE_AND_EXECUTE);
+
+ glBegin(GL_QUADS);
+ n[0]= -1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[0]); glVertex3fv(cube[1]); glVertex3fv(cube[2]); glVertex3fv(cube[3]);
+ n[0]=0;
+ n[1]= -1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[0]); glVertex3fv(cube[4]); glVertex3fv(cube[5]); glVertex3fv(cube[1]);
+ n[1]=0;
+ n[0]= 1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[4]); glVertex3fv(cube[7]); glVertex3fv(cube[6]); glVertex3fv(cube[5]);
+ n[0]=0;
+ n[1]= 1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[7]); glVertex3fv(cube[3]); glVertex3fv(cube[2]); glVertex3fv(cube[6]);
+ n[1]=0;
+ n[2]= 1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[1]); glVertex3fv(cube[5]); glVertex3fv(cube[6]); glVertex3fv(cube[2]);
+ n[2]=0;
+ n[2]= -1.0;
+ glNormal3fv(n);
+ glVertex3fv(cube[7]); glVertex3fv(cube[4]); glVertex3fv(cube[0]); glVertex3fv(cube[3]);
+ glEnd();
+
+ glEndList();
+ }
+ else glCallList(displist);
}
static void drawcube_size(float xsize, float ysize, float zsize)
{
+ static GLuint displist=0;
glScalef(xsize, ysize, zsize);
- glBegin(GL_LINE_STRIP);
- glVertex3fv(cube[0]); glVertex3fv(cube[1]);glVertex3fv(cube[2]); glVertex3fv(cube[3]);
- glVertex3fv(cube[0]); glVertex3fv(cube[4]);glVertex3fv(cube[5]); glVertex3fv(cube[6]);
- glVertex3fv(cube[7]); glVertex3fv(cube[4]);
- glEnd();
-
- glBegin(GL_LINE_STRIP);
- glVertex3fv(cube[1]); glVertex3fv(cube[5]);
- glEnd();
-
- glBegin(GL_LINE_STRIP);
- glVertex3fv(cube[2]); glVertex3fv(cube[6]);
- glEnd();
-
- glBegin(GL_LINE_STRIP);
- glVertex3fv(cube[3]); glVertex3fv(cube[7]);
- glEnd();
+ if(displist==0) {
+ displist= glGenLists(1);
+ glNewList(displist, GL_COMPILE_AND_EXECUTE);
+
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(cube[0]); glVertex3fv(cube[1]);glVertex3fv(cube[2]); glVertex3fv(cube[3]);
+ glVertex3fv(cube[0]); glVertex3fv(cube[4]);glVertex3fv(cube[5]); glVertex3fv(cube[6]);
+ glVertex3fv(cube[7]); glVertex3fv(cube[4]);
+ glEnd();
+
+ glBegin(GL_LINES);
+ glVertex3fv(cube[1]); glVertex3fv(cube[5]);
+ glVertex3fv(cube[2]); glVertex3fv(cube[6]);
+ glVertex3fv(cube[3]); glVertex3fv(cube[7]);
+ glEnd();
+
+ glEndList();
+ }
+ else glCallList(displist);
}
@@ -890,7 +888,7 @@ static void draw_b_bone_boxes(int dt, bPoseChannel *pchan, float xwidth, float l
if(segments>1 && pchan) {
float dlen= length/(float)segments;
- Mat4 *bbone= b_bone_spline_setup(pchan);
+ Mat4 *bbone= b_bone_spline_setup(pchan, 0);
int a;
for(a=0; a<segments; a++, bbone++) {
@@ -1076,7 +1074,7 @@ static void draw_bone(int dt, int armflag, int boneflag, int constflag, unsigned
static void draw_custom_bone(Object *ob, int dt, int armflag, int boneflag, unsigned int id, float length)
{
- if(ob==NULL || ob->type!=OB_MESH) return;
+ if(ob==NULL) return;
glScalef(length, length, length);
@@ -1739,8 +1737,8 @@ static void draw_pose_paths(Object *ob)
CfraElem *ce;
ListBase ak;
float *fp;
- int a;
- int stepsize, sfra;
+ int a, stepsize;
+ int sfra, efra;
if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
@@ -1751,22 +1749,48 @@ static void draw_pose_paths(Object *ob)
if (arm->pathsize == 0) arm->pathsize= 1;
stepsize = arm->pathsize;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(pchan->bone->layer & arm->layer) {
- if(pchan->path) {
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (pchan->bone->layer & arm->layer) {
+ if (pchan->path) {
/* version patch here - cannot access frame info from file reading */
if ((pchan->pathsf == 0) || (pchan->pathef == 0)) {
pchan->pathsf= SFRA;
pchan->pathef= EFRA;
}
+
+ /* get frame ranges */
sfra= pchan->pathsf;
+ efra = sfra + pchan->pathlen;
/* draw curve-line of path */
- BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7);
- glBegin(GL_LINE_STRIP);
- for(a=0, fp= pchan->path; a<pchan->pathlen; a++, fp+=3)
- glVertex3fv(fp);
- glEnd();
+ if ((CFRA > sfra) && (CFRA < efra)) {
+ /* Show before/after current frame with slight difference in colour intensity
+ * This is done in two loops, as there seems to be some problems with changing color
+ * or something during a loop (noted somewhere in the codebase)
+ */
+
+ /* before cfra (darker) */
+ BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.2);
+ glBegin(GL_LINE_STRIP);
+ for (a=0, fp=pchan->path; (sfra+a)<=CFRA; a++, fp+=3)
+ glVertex3fv(fp);
+ glEnd();
+
+ /* after cfra (lighter) - backtrack a bit so that we don't have gaps */
+ BIF_ThemeColorBlend(TH_WIRE, TH_BONE_POSE, 0.7);
+ glBegin(GL_LINE_STRIP);
+ for (--a, fp-=3; a<pchan->pathlen; a++, fp+=3)
+ glVertex3fv(fp);
+ glEnd();
+ }
+ else {
+ /* show both directions with same intensity (cfra somewhere else) */
+ BIF_ThemeColorBlend(TH_WIRE, TH_BACK, 0.7);
+ glBegin(GL_LINE_STRIP);
+ for (a=0, fp= pchan->path; a<pchan->pathlen; a++, fp+=3)
+ glVertex3fv(fp);
+ glEnd();
+ }
glPointSize(1.0);
@@ -1781,7 +1805,7 @@ static void draw_pose_paths(Object *ob)
/* Draw little white dots at each framestep value */
BIF_ThemeColor(TH_TEXT_HI);
glBegin(GL_POINTS);
- for(a=0, fp= pchan->path; a<pchan->pathlen; a+=stepsize, fp+=(stepsize*3))
+ for (a=0, fp= pchan->path; a<pchan->pathlen; a+=stepsize, fp+=(stepsize*3))
glVertex3fv(fp);
glEnd();
@@ -1790,7 +1814,7 @@ static void draw_pose_paths(Object *ob)
for(a=0, fp= pchan->path; a<pchan->pathlen; a+=stepsize, fp+=(stepsize*3)) {
char str[32];
- /* only draw framenum if several consecutive highlighted points occur on same point */
+ /* only draw framenum if several consecutive highlighted points don't occur on same point */
if (a == 0) {
glRasterPos3fv(fp);
sprintf(str, " %d\n", (a+sfra));
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index 188f48bcdca..ea9dc6a0482 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -43,6 +43,7 @@
#include "BLI_arithb.h"
#include "BLI_blenlib.h"
+#include "BLI_editVert.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -95,6 +96,7 @@
#include "BIF_screen.h"
#include "BIF_toolbox.h"
#include "BIF_transform.h"
+#include "BIF_editmesh.h"
#include "BSE_drawipo.h"
#include "BSE_drawview.h"
@@ -107,6 +109,8 @@
#include "RE_pipeline.h"
#include "BMF_Api.h"
+#include "PIL_time.h"
+
/* Modules used */
#include "mydevice.h"
#include "blendef.h"
@@ -184,15 +188,16 @@ void calc_image_view(SpaceImage *sima, char mode)
{
float xim=256, yim=256;
float x1, y1;
- float zoom;
if(image_preview_active(curarea, &xim, &yim));
else if(sima->image) {
ImBuf *ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser);
+ float xuser_asp, yuser_asp;
+ aspect_sima(sima, &xuser_asp, &yuser_asp);
if(ibuf) {
- xim= ibuf->x;
- yim= ibuf->y;
+ xim= ibuf->x * xuser_asp;
+ yim= ibuf->y * yuser_asp;
}
else if( sima->image->type==IMA_TYPE_R_RESULT ) {
/* not very important, just nice */
@@ -218,17 +223,14 @@ void calc_image_view(SpaceImage *sima, char mode)
x1-= sima->zoom*sima->xof;
y1-= sima->zoom*sima->yof;
-
- /* float! */
- zoom= sima->zoom;
/* relative display right */
- sima->v2d.cur.xmin= ((curarea->winrct.xmin - (float)x1)/zoom);
- sima->v2d.cur.xmax= sima->v2d.cur.xmin + ((float)curarea->winx/zoom);
+ sima->v2d.cur.xmin= ((curarea->winrct.xmin - (float)x1)/sima->zoom);
+ sima->v2d.cur.xmax= sima->v2d.cur.xmin + ((float)curarea->winx/sima->zoom);
/* relative display left */
- sima->v2d.cur.ymin= ((curarea->winrct.ymin-(float)y1)/zoom);
- sima->v2d.cur.ymax= sima->v2d.cur.ymin + ((float)curarea->winy/zoom);
+ sima->v2d.cur.ymin= ((curarea->winrct.ymin-(float)y1)/sima->zoom);
+ sima->v2d.cur.ymax= sima->v2d.cur.ymin + ((float)curarea->winy/sima->zoom);
if(mode=='f') {
sima->v2d.cur.xmin/= xim;
@@ -242,32 +244,34 @@ void calc_image_view(SpaceImage *sima, char mode)
void what_image(SpaceImage *sima)
{
MTFace *activetf;
- Mesh *me;
+
+ if( (sima->mode!=SI_TEXTURE) ||
+ (sima->image && sima->image->source==IMA_SRC_VIEWER) ||
+ (G.obedit != OBACT) ||
+ (sima->pin)
+ ) {
+ return;
+ }
+
+ /* viewer overrides uv editmode */
+ if (EM_texFaceCheck()) {
+ sima->image= NULL;
- if(sima->mode==SI_TEXTURE) {
+ activetf = get_active_mtface(NULL, NULL, 1); /* partially selected face is ok */
- /* viewer overrides faceselect */
- if(sima->image && sima->image->source==IMA_SRC_VIEWER);
- else if((G.f & G_FACESELECT)) {
+ if(activetf && activetf->mode & TF_TEX) {
+ if (!sima->pin)
+ sima->image= activetf->tpage;
- sima->image= NULL;
- me= get_mesh(OBACT);
- activetf = get_active_tface(NULL);
+ if(sima->flag & SI_EDITTILE);
+ else sima->curtile= activetf->tile;
- if(me && me->mtface && activetf && activetf->mode & TF_TEX) {
- sima->image= activetf->tpage;
-
- if(sima->flag & SI_EDITTILE);
- else sima->curtile= activetf->tile;
-
- if(sima->image) {
- if(activetf->mode & TF_TILES)
- sima->image->tpageflag |= IMA_TILES;
- else sima->image->tpageflag &= ~IMA_TILES;
- }
+ if(sima->image) {
+ if(activetf->mode & TF_TILES)
+ sima->image->tpageflag |= IMA_TILES;
+ else sima->image->tpageflag &= ~IMA_TILES;
}
}
-
}
}
@@ -285,69 +289,119 @@ ImBuf *imagewindow_get_ibuf(SpaceImage *sima)
return NULL;
}
-
+extern int EM_texFaceCheck(void); /* from editmesh.c */
/* called to assign images to UV faces */
-void image_changed(SpaceImage *sima, int dotile)
+void image_changed(SpaceImage *sima, Image *image)
{
MTFace *tface;
- MFace *mface;
- Mesh *me;
- int a;
-
- if(sima->image==NULL)
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ ImBuf *ibuf = NULL;
+ short change = 0;
+
+ if(image==NULL) {
sima->flag &= ~SI_DRAWTOOL;
+ } else {
+ ibuf = BKE_image_get_ibuf(image, NULL);
+ }
+
+ if(sima->mode!=SI_TEXTURE)
+ return;
- if(sima->mode==SI_TEXTURE) {
+ /* skip assigning these procedural images... */
+ if(image && (image->type==IMA_TYPE_R_RESULT || image->type==IMA_TYPE_COMPOSITE)) {
+ return;
+ } else if ((G.obedit) &&
+ (G.obedit->type == OB_MESH) &&
+ (G.editMesh) &&
+ (G.editMesh->faces.first)
+ ) {
- if(G.f & G_FACESELECT) {
+ /* Add a UV layer if there is none, editmode only */
+ if ( !CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE) ) {
+ EM_add_data_layer(&em->fdata, CD_MTFACE);
+ CustomData_set_layer_active(&em->fdata, CD_MTFACE, 0); /* always zero because we have no other UV layers */
+ change = 1; /* so we update the object, incase no faces are selected */
- /* skip assigning these procedural images... */
- if(sima->image) {
- if(sima->image->type==IMA_TYPE_R_RESULT)
- return;
- if(sima->image->type==IMA_TYPE_COMPOSITE)
- return;
+ /* BIF_undo_push("New UV Texture"); - undo should be done by whatever changes the image */
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ }
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (efa->h==0 && efa->f & SELECT) {
+ if (image) {
+ tface->tpage= image;
+ tface->mode |= TF_TEX;
+
+ if(image->tpageflag & IMA_TILES) tface->mode |= TF_TILES;
+ else tface->mode &= ~TF_TILES;
+
+ if(image->id.us==0) id_us_plus(&image->id);
+ else id_lib_extern(&image->id);
+
+ if (tface->transp==TF_ADD) {} /* they obviously know what they are doing! - leave as is */
+ else if (ibuf && ibuf->depth == 32) tface->transp = TF_ALPHA;
+ else tface->transp = TF_SOLID;
+
+ } else {
+ tface->tpage= NULL;
+ tface->mode &= ~TF_TEX;
+ tface->transp = TF_SOLID;
+ }
+ change = 1;
}
-
- me= get_mesh(OBACT);
- if(me && me->mtface) {
-
- tface= me->mtface;
- mface = me->mface;
- a= me->totface;
- while(a--) {
- if(mface->flag & ME_FACE_SEL) {
-
- if(dotile==2) {
- tface->mode &= ~TF_TILES;
- }
- else {
- tface->tpage= sima->image;
- tface->mode |= TF_TEX;
-
- if(dotile) tface->tile= sima->curtile;
- }
-
- if(sima->image) {
- if(sima->image->tpageflag & IMA_TILES) tface->mode |= TF_TILES;
- else tface->mode &= ~TF_TILES;
-
- if(sima->image->id.us==0) id_us_plus(&sima->image->id);
- else id_lib_extern(&sima->image->id);
- }
- }
- tface++;
- mface++;
+ }
+ }
+ /* change the space image after because simaFaceDraw_Check uses the space image
+ * to check if the face is displayed in UV-localview */
+ sima->image = image;
+
+ if (change)
+ object_uvs_changed(OBACT);
+
+ allqueue(REDRAWBUTSEDIT, 0);
+}
+/*
+ * dotile - 1, set the tile flag (from the space image)
+ * 2, set the tile index for the faces.
+ * */
+void image_set_tile(SpaceImage *sima, int dotile)
+{
+ MTFace *tface;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+
+ if(!sima->image || sima->mode!=SI_TEXTURE || !EM_texFaceCheck())
+ return;
+
+ /* skip assigning these procedural images... */
+ if(sima->image && (sima->image->type==IMA_TYPE_R_RESULT || sima->image->type==IMA_TYPE_COMPOSITE))
+ return;
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (efa->h==0 && efa->f & SELECT) {
+ if (dotile==1) {
+ /* set tile flag */
+ if (sima->image->tpageflag & IMA_TILES) {
+ tface->mode |= TF_TILES;
+ } else {
+ tface->mode &= ~TF_TILES;
}
-
- object_uvs_changed(OBACT);
- allqueue(REDRAWBUTSEDIT, 0);
+ } else if (dotile==2) {
+ /* set tile index */
+ tface->tile= sima->curtile;
}
}
}
+ object_uvs_changed(OBACT);
+ allqueue(REDRAWBUTSEDIT, 0);
}
+
void uvco_to_areaco(float *vec, short *mval)
{
float x, y;
@@ -381,258 +435,431 @@ void uvco_to_areaco_noclip(float *vec, int *mval)
mval[1]= y;
}
-void draw_tfaces(void)
+static void drawcursor_sima(float xuser_asp, float yuser_asp)
+{
+ int wi, hi;
+ float w, h;
+
+ if (!G.obedit || !CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE)) return;
+
+ transform_width_height_tface_uv(&wi, &hi);
+ w = (((float)wi)/256.0f)*G.sima->zoom * xuser_asp;
+ h = (((float)hi)/256.0f)*G.sima->zoom * yuser_asp;
+
+ cpack(0xFFFFFF);
+ glTranslatef(G.v2d->cursor[0], G.v2d->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);
+
+ 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);
+ 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);
+
+ 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(-G.v2d->cursor[0], -G.v2d->cursor[1], 0.0f);
+ setlinestyle(0);
+}
+
+// checks if we are selecting only faces
+int draw_uvs_face_check(void)
+{
+ if (G.sima==NULL)
+ return 0;
+ if (G.sima->flag & SI_SYNC_UVSEL && G.scene->selectmode == SCE_SELECT_FACE)
+ return 2;
+ if (G.sima->flag & SI_SELACTFACE)
+ return 1;
+ return 0;
+}
+
+void tface_center(MTFace *tf, float cent[2], void * isquad)
+{
+
+ if (isquad) {
+ cent[0] = (tf->uv[0][0] + tf->uv[1][0] + tf->uv[2][0] + tf->uv[3][0]) / 4.0;
+ cent[1] = (tf->uv[0][1] + tf->uv[1][1] + tf->uv[2][1] + tf->uv[3][1]) / 4.0;
+ } else {
+ cent[0] = (tf->uv[0][0] + tf->uv[1][0] + tf->uv[2][0]) / 3.0;
+ cent[1] = (tf->uv[0][1] + tf->uv[1][1] + tf->uv[2][1]) / 3.0;
+ }
+}
+
+/* draws uv's in the image space */
+void draw_uvs_sima(void)
{
MTFace *tface,*activetface = NULL;
- MFace *mface,*activemface = NULL;
- Mesh *me;
- int a;
+ EditMesh *em = G.editMesh;
+ EditFace *efa, *efa_act;
+
char col1[4], col2[4];
- float pointsize= BIF_GetThemeValuef(TH_VERTEX_SIZE);
+ float pointsize;
+ int drawface;
- if(G.f & G_FACESELECT) {
- me= get_mesh(OBACT);
-
- if(me && me->mtface) {
- calc_image_view(G.sima, 'f'); /* float */
- myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
- glLoadIdentity();
+ if (!G.obedit || !CustomData_has_layer(&em->fdata, CD_MTFACE))
+ return;
+
+ drawface = draw_uvs_face_check();
+
+ calc_image_view(G.sima, 'f'); /* float */
+ myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
+ glLoadIdentity();
+
+
+ if(G.sima->flag & SI_DRAWTOOL) {
+ /* draws the grey mesh when painting */
+ glColor3ub(112, 112, 112);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ glBegin(GL_LINE_LOOP);
+ glVertex2fv(tface->uv[0]);
+ glVertex2fv(tface->uv[1]);
+ glVertex2fv(tface->uv[2]);
+ if(efa->v4) glVertex2fv(tface->uv[3]);
+ glEnd();
+ }
+ return; /* only draw shadow mesh */
+ } else if (G.sima->flag & SI_DRAWSHADOW) {
+ /* draw shadow mesh - this is the mesh with the modifier applied */
+ glColor3ub(112, 112, 112);
+ if ( em->derivedFinal &&
+ em->derivedFinal->drawUVEdges &&
+ CustomData_has_layer(&em->derivedFinal->faceData, CD_MTFACE)
+ ) {
+ /* we can use the existing final mesh */
+ glColor3ub(112, 112, 112);
+ em->derivedFinal->drawUVEdges(em->derivedFinal);
+ } else {
+ DerivedMesh *finalDM, *cageDM;
- /* draw shadow mesh */
- if ((G.sima->flag & SI_DRAWSHADOW) && !(G.obedit==OBACT)) {
- DerivedMesh *dm;
-
- /* draw final mesh with modifiers applied */
- dm = mesh_get_derived_final(OBACT,
- CD_MASK_BAREMESH | CD_MASK_MTFACE);
-
+ /* draw final mesh with modifiers applied */
+ cageDM = editmesh_get_derived_cage_and_final(&finalDM, CD_MASK_BAREMESH | CD_MASK_MTFACE);
+
+ if (finalDM->drawUVEdges &&
+ DM_get_face_data_layer(finalDM, CD_MTFACE) &&
+ /* When sync selection is enabled, all faces are drawn (except for hidden)
+ * so if cage is the same as the final, theres no point in drawing the shadowmesh. */
+ !((G.sima->flag & SI_SYNC_UVSEL && cageDM==finalDM))
+ ) {
glColor3ub(112, 112, 112);
- if (dm->drawUVEdges) dm->drawUVEdges(dm);
-
- dm->release(dm);
- }
- else if((G.sima->flag & SI_DRAWTOOL) || (G.obedit==OBACT)) {
- /* draw mesh without modifiers applied */
-
- if (G.obedit) {
- DerivedMesh *dm = editmesh_get_derived_base();
-
- glColor3ub(112, 112, 112);
- dm->drawUVEdges(dm);
-
- dm->release(dm);
- }
- else {
- tface= me->mtface;
- mface= me->mface;
- a= me->totface;
-
- glColor3ub(112, 112, 112);
- while(a--) {
- if(!(mface->flag & ME_HIDE) && (mface->flag & ME_FACE_SEL)) {
- glBegin(GL_LINE_LOOP);
- glVertex2fv(tface->uv[0]);
- glVertex2fv(tface->uv[1]);
- glVertex2fv(tface->uv[2]);
- if(mface->v4) glVertex2fv(tface->uv[3]);
- glEnd();
- }
- tface++;
- mface++;
- }
- }
+ finalDM->drawUVEdges(finalDM);
}
-
- if((G.sima->flag & SI_DRAWTOOL) || (G.obedit==OBACT))
- return; /* only draw shadow mesh */
- /* draw transparent faces */
- if(G.f & G_DRAWFACES) {
- BIF_GetThemeColor4ubv(TH_FACE, col1);
- BIF_GetThemeColor4ubv(TH_FACE_SELECT, col2);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glEnable(GL_BLEND);
- tface= me->mtface;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(mface->flag & ME_FACE_SEL) {
- if(!(~tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) &&
- (!mface->v4 || tface->flag & TF_SEL4))
- glColor4ubv((GLubyte *)col2);
- else
- glColor4ubv((GLubyte *)col1);
-
- glBegin(mface->v4?GL_QUADS:GL_TRIANGLES);
- glVertex2fv(tface->uv[0]);
- glVertex2fv(tface->uv[1]);
- glVertex2fv(tface->uv[2]);
- if(mface->v4) glVertex2fv(tface->uv[3]);
- glEnd();
- }
- tface++;
- mface++;
- }
- glDisable(GL_BLEND);
- }
-
-
- tface= me->mtface;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(mface->flag & ME_FACE_SEL) {
- if(tface->flag & TF_ACTIVE){
- activetface= tface;
- activemface= mface;
- }
-
- cpack(0x0);
- glBegin(GL_LINE_LOOP);
- glVertex2fv(tface->uv[0]);
- glVertex2fv(tface->uv[1]);
- glVertex2fv(tface->uv[2]);
- if(mface->v4) glVertex2fv(tface->uv[3]);
- glEnd();
-
- setlinestyle(2);
- cpack(0xFFFFFF);
- glBegin(GL_LINE_STRIP);
- glVertex2fv(tface->uv[0]);
- glVertex2fv(tface->uv[1]);
- glEnd();
-
- glBegin(GL_LINE_STRIP);
- glVertex2fv(tface->uv[0]);
- if(mface->v4) glVertex2fv(tface->uv[3]);
- else glVertex2fv(tface->uv[2]);
- glEnd();
-
- glBegin(GL_LINE_STRIP);
- glVertex2fv(tface->uv[1]);
- glVertex2fv(tface->uv[2]);
- if(mface->v4) glVertex2fv(tface->uv[3]);
- glEnd();
- setlinestyle(0);
- }
+ if (cageDM != finalDM)
+ cageDM->release(cageDM);
+ finalDM->release(finalDM);
+ }
+ }
+
+ activetface = get_active_mtface(&efa_act, NULL, 0); /* will be set to NULL if hidden */
+
+ /* draw transparent faces */
+ if(G.f & G_DRAWFACES) {
+ BIF_GetThemeColor4ubv(TH_FACE, col1);
+ BIF_GetThemeColor4ubv(TH_FACE_SELECT, col2);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+
+ if (simaFaceDraw_Check(efa, tface)) {
+ efa->tmp.p = tface;
+ if (tface==activetface) continue; /* important the temp pointer is set above */
+ if( simaFaceSel_Check(efa, tface) )
+ glColor4ubv((GLubyte *)col2);
+ else
+ glColor4ubv((GLubyte *)col1);
- tface++;
- mface++;
+ glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+ glVertex2fv(tface->uv[0]);
+ glVertex2fv(tface->uv[1]);
+ glVertex2fv(tface->uv[2]);
+ if(efa->v4) glVertex2fv(tface->uv[3]);
+ glEnd();
+
+ } else {
+ if (tface == activetface)
+ activetface= NULL;
+ efa->tmp.p = NULL;
}
-
- /* draw active face edges */
- if (activetface){
- /* colors: R=u G=v */
-
- setlinestyle(2);
- tface=activetface;
- mface=activemface;
-
- cpack(0x0);
+ }
+ } else {
+ /* would be nice to do this within a draw loop but most below are optional, so it would involve too many checks */
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ efa->tmp.p = tface;
+ } else {
+ if (tface == activetface)
+ activetface= NULL;
+ efa->tmp.p = NULL;
+ }
+ }
+ glDisable(GL_BLEND);
+ }
+
+ if (activetface) {
+ GLubyte act_face_stipple[32*32/8] = DM_FACE_STIPPLE;
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ BIF_ThemeColor4(TH_EDITMESH_ACTIVE);
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(act_face_stipple);
+ glBegin(efa_act->v4?GL_QUADS:GL_TRIANGLES);
+ glVertex2fv(activetface->uv[0]);
+ glVertex2fv(activetface->uv[1]);
+ glVertex2fv(activetface->uv[2]);
+ if(efa_act->v4) glVertex2fv(activetface->uv[3]);
+ glEnd();
+ glDisable(GL_POLYGON_STIPPLE);
+ glDisable(GL_BLEND);
+ }
+
+ if (G.sima->flag & SI_SMOOTH_UV) {
+ glEnable( GL_LINE_SMOOTH );
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ switch (G.sima->dt_uv) {
+ case SI_UVDT_DASH:
+ for (efa= em->faces.first; efa; efa= efa->next) {
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+
+ /*this is a shortcut to do the same as above but a faster for drawing */
+ if ((tface=(MTFace *)efa->tmp.p)) {
+
+ cpack(0x111111);
glBegin(GL_LINE_LOOP);
- glVertex2fv(tface->uv[0]);
+ glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
- if(mface->v4) glVertex2fv(tface->uv[3]);
+ if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
-
- cpack(0xFF00);
+
+ setlinestyle(2);
+ cpack(0x909090);
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
glVertex2fv(tface->uv[1]);
glEnd();
-
- cpack(0xFF);
+
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[0]);
- if(mface->v4) glVertex2fv(tface->uv[3]);
+ if(efa->v4) glVertex2fv(tface->uv[3]);
else glVertex2fv(tface->uv[2]);
glEnd();
-
- cpack(0xFFFFFF);
+
glBegin(GL_LINE_STRIP);
glVertex2fv(tface->uv[1]);
glVertex2fv(tface->uv[2]);
- if(mface->v4) glVertex2fv(tface->uv[3]);
+ if(efa->v4) glVertex2fv(tface->uv[3]);
glEnd();
-
setlinestyle(0);
}
+ }
+ break;
+ case SI_UVDT_BLACK: /* black/white */
+ case SI_UVDT_WHITE:
+ cpack((G.sima->dt_uv==SI_UVDT_WHITE) ? 0xFFFFFF : 0x0);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+
+ /*this is a shortcut to do the same as above but a faster for drawing */
+ if ((tface=(MTFace *)efa->tmp.p)) {
+
+ glBegin(GL_LINE_LOOP);
+ glVertex2fv(tface->uv[0]);
+ glVertex2fv(tface->uv[1]);
+ glVertex2fv(tface->uv[2]);
+ if(efa->v4) glVertex2fv(tface->uv[3]);
+ glEnd();
+ }
+ }
+ break;
+ case SI_UVDT_OUTLINE:
+ glLineWidth(3);
+ cpack(0x0);
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+
+ /*this is a shortcut to do the same as above but a faster for drawing */
+ if ((tface=(MTFace *)efa->tmp.p)) {
+
+ glBegin(GL_LINE_LOOP);
+ glVertex2fv(tface->uv[0]);
+ glVertex2fv(tface->uv[1]);
+ glVertex2fv(tface->uv[2]);
+ if(efa->v4) glVertex2fv(tface->uv[3]);
+ glEnd();
+ }
+ }
+
+ glLineWidth(1);
+ cpack(0xFFFFFF);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+
+ /*this is a shortcut to do the same as above but a faster for drawing */
+ if ((tface=(MTFace *)efa->tmp.p)) {
+
+ glBegin(GL_LINE_LOOP);
+ glVertex2fv(tface->uv[0]);
+ glVertex2fv(tface->uv[1]);
+ glVertex2fv(tface->uv[2]);
+ if(efa->v4) glVertex2fv(tface->uv[3]);
+ glEnd();
+ }
+ }
+ break;
+ }
- /* unselected uv's */
- BIF_ThemeColor(TH_VERTEX);
- glPointSize(pointsize);
+ if (G.sima->flag & SI_SMOOTH_UV) {
+ glDisable( GL_LINE_SMOOTH);
+ glDisable(GL_BLEND);
+ }
- bglBegin(GL_POINTS);
- tface= me->mtface;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(mface->flag & ME_FACE_SEL) {
-
- if(tface->flag & TF_SEL1); else bglVertex2fv(tface->uv[0]);
- if(tface->flag & TF_SEL2); else bglVertex2fv(tface->uv[1]);
- if(tface->flag & TF_SEL3); else bglVertex2fv(tface->uv[2]);
- if(mface->v4) {
- if(tface->flag & TF_SEL4); else bglVertex2fv(tface->uv[3]);
- }
+ if (drawface) {
+ // draw UV face points
+ float cent[2];
+
+
+ /* unselected faces's */
+ pointsize = BIF_GetThemeValuef(TH_FACEDOT_SIZE);
+ // TODO - drawobject.c changes this value after - Investiagate!
+ glPointSize(pointsize);
+
+ BIF_ThemeColor(TH_WIRE);
+ bglBegin(GL_POINTS);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+
+ /*this is a shortcut to do the same as above but a faster for drawing */
+ if ((tface=(MTFace *)efa->tmp.p)) {
+ if( ! simaFaceSel_Check(efa, tface) ) {
+ tface_center(tface, cent, (void *)efa->v4);
+ bglVertex2fv(cent);
}
- tface++;
- mface++;
}
- bglEnd();
-
- /* pinned uv's */
- /* give odd pointsizes odd pin pointsizes */
- glPointSize(pointsize*2 + (((int)pointsize % 2)? (-1): 0));
- cpack(0xFF);
-
- bglBegin(GL_POINTS);
- tface= me->mtface;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(mface->flag & ME_FACE_SEL) {
-
- if(tface->unwrap & TF_PIN1) bglVertex2fv(tface->uv[0]);
- if(tface->unwrap & TF_PIN2) bglVertex2fv(tface->uv[1]);
- if(tface->unwrap & TF_PIN3) bglVertex2fv(tface->uv[2]);
- if(mface->v4) {
- if(tface->unwrap & TF_PIN4) bglVertex2fv(tface->uv[3]);
- }
+ }
+ bglEnd();
+ /* selected faces's */
+ BIF_ThemeColor(TH_FACE_DOT);
+ bglBegin(GL_POINTS);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+
+ /*this is a shortcut to do the same as above but a faster for drawing */
+ if ((tface=(MTFace *)efa->tmp.p)) {
+ if( simaFaceSel_Check(efa, tface) ) {
+ tface_center(tface, cent, (void *)efa->v4);
+ bglVertex2fv(cent);
}
- tface++;
- mface++;
}
- bglEnd();
-
- /* selected uv's */
- BIF_ThemeColor(TH_VERTEX_SELECT);
- glPointSize(pointsize);
-
- bglBegin(GL_POINTS);
- tface= me->mtface;
- mface= me->mface;
- a= me->totface;
- while(a--) {
- if(mface->flag & ME_FACE_SEL) {
-
- if(tface->flag & TF_SEL1) bglVertex2fv(tface->uv[0]);
- if(tface->flag & TF_SEL2) bglVertex2fv(tface->uv[1]);
- if(tface->flag & TF_SEL3) bglVertex2fv(tface->uv[2]);
- if(mface->v4) {
- if(tface->flag & TF_SEL4) bglVertex2fv(tface->uv[3]);
- }
+ }
+ bglEnd();
+ }
+
+ if (drawface != 2) { /* 2 means Mesh Face Mode */
+ /* unselected uv's */
+ BIF_ThemeColor(TH_VERTEX);
+ pointsize = BIF_GetThemeValuef(TH_VERTEX_SIZE);
+ glPointSize(pointsize);
+
+ bglBegin(GL_POINTS);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+
+ /*this is a shortcut to do the same as above but a faster for drawing */
+ if ((tface=(MTFace *)efa->tmp.p)) {
+
+ if(simaUVSel_Check(efa, tface, 0)); else bglVertex2fv(tface->uv[0]);
+ if(simaUVSel_Check(efa, tface, 1)); else bglVertex2fv(tface->uv[1]);
+ if(simaUVSel_Check(efa, tface, 2)); else bglVertex2fv(tface->uv[2]);
+ if(efa->v4) {
+ if(simaUVSel_Check(efa, tface, 3)); else bglVertex2fv(tface->uv[3]);
}
- tface++;
- mface++;
}
- bglEnd();
-
- glPointSize(1.0);
}
- }
+ bglEnd();
+
+ /* pinned uv's */
+ /* give odd pointsizes odd pin pointsizes */
+ glPointSize(pointsize*2 + (((int)pointsize % 2)? (-1): 0));
+ cpack(0xFF);
+ bglBegin(GL_POINTS);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+
+ /*this is a shortcut to do the same as above but a faster for drawing */
+ if ((tface=(MTFace *)efa->tmp.p)) {
+
+ if(tface->unwrap & TF_PIN1) bglVertex2fv(tface->uv[0]);
+ if(tface->unwrap & TF_PIN2) bglVertex2fv(tface->uv[1]);
+ if(tface->unwrap & TF_PIN3) bglVertex2fv(tface->uv[2]);
+ if(efa->v4) {
+ if(tface->unwrap & TF_PIN4) bglVertex2fv(tface->uv[3]);
+ }
+ }
+ }
+ bglEnd();
+
+ /* selected uv's */
+ BIF_ThemeColor(TH_VERTEX_SELECT);
+ glPointSize(pointsize);
+
+ bglBegin(GL_POINTS);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+
+ /*this is a shortcut to do the same as above but a faster for drawing */
+ if ((tface=(MTFace *)efa->tmp.p)) {
+
+ if(!simaUVSel_Check(efa, tface, 0)); else bglVertex2fv(tface->uv[0]);
+ if(!simaUVSel_Check(efa, tface, 1)); else bglVertex2fv(tface->uv[1]);
+ if(!simaUVSel_Check(efa, tface, 2)); else bglVertex2fv(tface->uv[2]);
+ if(efa->v4) {
+ if(!simaUVSel_Check(efa, tface, 3)); else bglVertex2fv(tface->uv[3]);
+ }
+ }
+ }
+ bglEnd();
+ }
+ glPointSize(1.0);
}
static unsigned int *get_part_from_ibuf(ImBuf *ibuf, short startx, short starty, short endx, short endy)
@@ -657,7 +884,7 @@ static unsigned int *get_part_from_ibuf(ImBuf *ibuf, short startx, short starty,
return rectmain;
}
-static void draw_image_transform(ImBuf *ibuf)
+static void draw_image_transform(ImBuf *ibuf, float xuser_asp, float yuser_asp)
{
if(G.moving) {
float aspx, aspy, center[3];
@@ -668,10 +895,9 @@ static void draw_image_transform(ImBuf *ibuf)
aspx= aspy= 1.0;
}
else {
- aspx= 256.0/ibuf->x;
- aspy= 256.0/ibuf->y;
+ aspx= (256.0/ibuf->x) * xuser_asp;
+ aspy= (256.0/ibuf->y) * yuser_asp;
}
-
BIF_getPropCenter(center);
/* scale and translate the circle into place and draw it */
@@ -693,17 +919,18 @@ static void draw_image_view_icon(void)
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- if(G.sima->flag & SI_STICKYUVS) {
- BIF_icon_draw_aspect(xPos, 5.0, ICON_STICKY2_UVS, 1.0f);
- xPos = 25.0;
- }
- else if(!(G.sima->flag & SI_LOCALSTICKY)) {
- BIF_icon_draw_aspect(xPos, 5.0, ICON_STICKY_UVS, 1.0f);
- xPos = 25.0;
- }
-
- if(G.sima->flag & SI_SELACTFACE) {
- BIF_icon_draw_aspect(xPos, 5.0, ICON_DRAW_UVFACES, 1.0f);
+
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ /* take settings from the editmesh */
+ if (G.scene->selectmode == SCE_SELECT_FACE || G.sima->flag & SI_SELACTFACE) {
+ BIF_icon_draw_aspect(xPos, 5.0, ICON_FACESEL_HLT, 1.0f);
+ }
+
+ } else {
+ /* use the flags for UV mode - normal operation */
+ if(G.sima->flag & SI_SELACTFACE) {
+ BIF_icon_draw_aspect(xPos, 5.0, ICON_FACESEL_HLT, 1.0f);
+ }
}
glBlendFunc(GL_ONE, GL_ZERO);
@@ -742,52 +969,65 @@ static void draw_image_view_tool(void)
/* ************ panel stuff ************* */
+/* this function gets the values for cursor and vertex number buttons */
+static void image_transform_but_attr(int *imx, int *imy, int *step, int *digits) /*, float *xcoord, float *ycoord)*/
+{
+ ImBuf *ibuf= imagewindow_get_ibuf(G.sima);
+ if(ibuf) {
+ *imx= ibuf->x;
+ *imy= ibuf->y;
+ }
+
+ if (G.sima->flag & SI_COORDFLOATS) {
+ *step= 1;
+ *digits= 3;
+ }
+ else {
+ *step= 100;
+ *digits= 2;
+ }
+}
+
+
/* is used for both read and write... */
void image_editvertex_buts(uiBlock *block)
{
static float ocent[2];
float cent[2]= {0.0, 0.0};
int imx= 256, imy= 256;
- int i, nactive= 0, step, digits;
- Mesh *me;
+ int nactive= 0, step, digits;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ MTFace *tf;
if( is_uv_tface_editing_allowed_silent()==0 ) return;
- me= get_mesh(OBACT);
- if (G.sima->image) {
- ImBuf *ibuf= imagewindow_get_ibuf(G.sima);
- if(ibuf) {
- imx= ibuf->x;
- imy= ibuf->y;
- }
- }
+ image_transform_but_attr(&imx, &imy, &step, &digits);
- for (i=0; i<me->totface; i++) {
- MFace *mf= &((MFace*) me->mface)[i];
- MTFace *tf= &((MTFace*) me->mtface)[i];
-
- if (!(mf->flag & ME_FACE_SEL))
- continue;
-
- if (tf->flag & TF_SEL1) {
- cent[0]+= tf->uv[0][0];
- cent[1]+= tf->uv[0][1];
- nactive++;
- }
- if (tf->flag & TF_SEL2) {
- cent[0]+= tf->uv[1][0];
- cent[1]+= tf->uv[1][1];
- nactive++;
- }
- if (tf->flag & TF_SEL3) {
- cent[0]+= tf->uv[2][0];
- cent[1]+= tf->uv[2][1];
- nactive++;
- }
- if (mf->v4 && (tf->flag & TF_SEL4)) {
- cent[0]+= tf->uv[3][0];
- cent[1]+= tf->uv[3][1];
- nactive++;
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+
+ if (simaUVSel_Check(efa, tf, 0)) {
+ cent[0]+= tf->uv[0][0];
+ cent[1]+= tf->uv[0][1];
+ nactive++;
+ }
+ if (simaUVSel_Check(efa, tf, 1)) {
+ cent[0]+= tf->uv[1][0];
+ cent[1]+= tf->uv[1][1];
+ nactive++;
+ }
+ if (simaUVSel_Check(efa, tf, 2)) {
+ cent[0]+= tf->uv[2][0];
+ cent[1]+= tf->uv[2][1];
+ nactive++;
+ }
+ if (efa->v4 && simaUVSel_Check(efa, tf, 3)) {
+ cent[0]+= tf->uv[3][0];
+ cent[1]+= tf->uv[3][1];
+ nactive++;
+ }
}
}
@@ -796,27 +1036,21 @@ void image_editvertex_buts(uiBlock *block)
ocent[0]= cent[0]/nactive;
ocent[1]= cent[1]/nactive;
if (G.sima->flag & SI_COORDFLOATS) {
- step= 1;
- digits= 3;
- }
- else {
+ } else {
ocent[0] *= imx;
ocent[1] *= imy;
- step= 100;
- digits= 2;
}
- uiDefBut(block, LABEL, 0, "UV Vertex:",10,55,300,19,0,0,0,0,0,"");
- uiBlockBeginAlign(block);
+ //uiBlockBeginAlign(block);
if(nactive==1) {
- uiDefButF(block, NUM, B_TRANS_IMAGE, "Vertex X:", 10, 35, 290, 19, &ocent[0], -10*imx, 10.0*imx, step, digits, "");
- uiDefButF(block, NUM, B_TRANS_IMAGE, "Vertex Y:", 10, 15, 290, 19, &ocent[1], -10*imy, 10.0*imy, step, digits, "");
+ 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, 35, 290, 19, &ocent[0], -10*imx, 10.0*imx, step, digits, "");
- uiDefButF(block, NUM, B_TRANS_IMAGE, "Median Y:", 10, 15, 290, 19, &ocent[1], -10*imy, 10.0*imy, step, digits, "");
+ 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);
+ //uiBlockEndAlign(block);
}
}
else { // apply event
@@ -834,28 +1068,25 @@ void image_editvertex_buts(uiBlock *block)
delta[1]= ocent[1]/imy - cent[1];
}
- for (i=0; i<me->totface; i++) {
- MFace *mf= &((MFace*) me->mface)[i];
- MTFace *tf= &((MTFace*) me->mtface)[i];
-
- if (!(mf->flag & ME_FACE_SEL))
- continue;
-
- if (tf->flag & TF_SEL1) {
- tf->uv[0][0]+= delta[0];
- tf->uv[0][1]+= delta[1];
- }
- if (tf->flag & TF_SEL2) {
- tf->uv[1][0]+= delta[0];
- tf->uv[1][1]+= delta[1];
- }
- if (tf->flag & TF_SEL3) {
- tf->uv[2][0]+= delta[0];
- tf->uv[2][1]+= delta[1];
- }
- if (mf->v4 && (tf->flag & TF_SEL4)) {
- tf->uv[3][0]+= delta[0];
- tf->uv[3][1]+= delta[1];
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ if (simaUVSel_Check(efa, tf, 0)) {
+ tf->uv[0][0]+= delta[0];
+ tf->uv[0][1]+= delta[1];
+ }
+ if (simaUVSel_Check(efa, tf, 1)) {
+ tf->uv[1][0]+= delta[0];
+ tf->uv[1][1]+= delta[1];
+ }
+ if (simaUVSel_Check(efa, tf, 2)) {
+ tf->uv[2][0]+= delta[0];
+ tf->uv[2][1]+= delta[1];
+ }
+ if (efa->v4 && simaUVSel_Check(efa, tf, 3)) {
+ tf->uv[3][0]+= delta[0];
+ tf->uv[3][1]+= delta[1];
+ }
}
}
@@ -864,6 +1095,46 @@ void image_editvertex_buts(uiBlock *block)
}
}
+
+/* is used for both read and write... */
+void image_editcursor_buts(uiBlock *block)
+{
+ static float ocent[2];
+ int imx= 256, imy= 256;
+ int step, digits;
+
+ if( is_uv_tface_editing_allowed_silent()==0 ) return;
+
+ image_transform_but_attr(&imx, &imy, &step, &digits);
+
+ if(block) { // do the buttons
+ ocent[0]= G.v2d->cursor[0];
+ ocent[1]= G.v2d->cursor[1];
+ if (G.sima->flag & SI_COORDFLOATS) {
+ } else {
+ ocent[0] *= imx;
+ ocent[1] *= imy;
+ }
+
+ uiBlockBeginAlign(block);
+ uiDefButF(block, NUM, B_CURSOR_IMAGE, "Cursor X:", 165, 120, 145, 19, &ocent[0], -10*imx, 10.0*imx, step, digits, "");
+ uiDefButF(block, NUM, B_CURSOR_IMAGE, "Cursor Y:", 165, 100, 145, 19, &ocent[1], -10*imy, 10.0*imy, step, digits, "");
+ uiBlockEndAlign(block);
+ }
+ else { // apply event
+ if (G.sima->flag & SI_COORDFLOATS) {
+ G.v2d->cursor[0]= ocent[0];
+ G.v2d->cursor[1]= ocent[1];
+ }
+ else {
+ G.v2d->cursor[0]= ocent[0]/imx;
+ G.v2d->cursor[1]= ocent[1]/imy;
+ }
+ allqueue(REDRAWIMAGE, 0);
+ }
+}
+
+
void image_info(Image *ima, ImBuf *ibuf, char *str)
{
int ofs= 0;
@@ -913,12 +1184,11 @@ static void image_panel_properties(short cntrl) // IMAGE_HANDLER_PROPERTIES
block= uiNewBlock(&curarea->uiblocks, "image_panel_properties", UI_EMBOSS, UI_HELV, curarea->win);
uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
uiSetPanelHandler(IMAGE_HANDLER_PROPERTIES); // for close and esc
- if(uiNewPanel(curarea, block, "Properties", "Image", 10, 10, 318, 204)==0)
+ if(uiNewPanel(curarea, block, "Image Properties", "Image", 10, 10, 318, 204)==0)
return;
/* note, it draws no bottom half in facemode, for vertex buttons */
uiblock_image_panel(block, &G.sima->image, &G.sima->iuser, B_REDR, B_REDR);
-
image_editvertex_buts(block);
}
@@ -947,16 +1217,66 @@ static void image_panel_game_properties(short cntrl) // IMAGE_HANDLER_GAME_PROPE
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, IMA_TILES, B_SIMAGEDRAW1, "Tiles", 160,150,140,19, &G.sima->image->tpageflag, 0, 0, 0, 0, "Toggles use of tilemode for faces");
- uiDefButS(block, NUM, B_SIMAGEDRAW, "X:", 160,130,70,19, &G.sima->image->xrep, 1.0, 16.0, 0, 0, "Sets the degree of repetition in the X direction");
- uiDefButS(block, NUM, B_SIMAGEDRAW, "Y:", 230,130,70,19, &G.sima->image->yrep, 1.0, 16.0, 0, 0, "Sets the degree of repetition in the Y direction");
+ uiDefButBitS(block, TOG, IMA_TILES, B_SIMAGETILE, "Tiles", 160,150,140,19, &G.sima->image->tpageflag, 0, 0, 0, 0, "Toggles use of tilemode for faces (Shift LMB to pick the tile for selected faces)");
+ uiDefButS(block, NUM, B_SIMA_REDR_IMA_3D, "X:", 160,130,70,19, &G.sima->image->xrep, 1.0, 16.0, 0, 0, "Sets the degree of repetition in the X direction");
+ uiDefButS(block, NUM, B_SIMA_REDR_IMA_3D, "Y:", 230,130,70,19, &G.sima->image->yrep, 1.0, 16.0, 0, 0, "Sets the degree of repetition in the Y direction");
+ uiBlockBeginAlign(block);
+
uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, IMA_CLAMP_U, B_SIMA3DVIEWDRAW, "ClampX", 160,100,70,19, &G.sima->image->tpageflag, 0, 0, 0, 0, "Disable texture repeating horizontaly");
+ uiDefButBitS(block, TOG, IMA_CLAMP_V, B_SIMA3DVIEWDRAW, "ClampY", 230,100,70,19, &G.sima->image->tpageflag, 0, 0, 0, 0, "Disable texture repeating vertically");
+ uiBlockEndAlign(block);
+ }
+}
+//static void image_panel_transform_properties(short cntrl) // IMAGE_HANDLER_TRANSFORM_PROPERTIES
+//{
+// uiBlock *block;
+//
+// block= uiNewBlock(&curarea->uiblocks, "image_transform_properties", UI_EMBOSS, UI_HELV, curarea->win);
+// uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
+// uiSetPanelHandler(IMAGE_HANDLER_TRANSFORM_PROPERTIES); // for close and esc
+// if(uiNewPanel(curarea, block, "Transform Properties", "Image", 10, 10, 318, 204)==0)
+// return;
+//
+// image_editvertex_buts(block);
+//}
+
+static void image_panel_view_properties(short cntrl) // IMAGE_HANDLER_VIEW_PROPERTIES
+{
+ uiBlock *block;
+
+ block= uiNewBlock(&curarea->uiblocks, "image_view_properties", UI_EMBOSS, UI_HELV, curarea->win);
+ uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
+ uiSetPanelHandler(IMAGE_HANDLER_VIEW_PROPERTIES); // for close and esc
+ if(uiNewPanel(curarea, block, "View Properties", "Image", 10, 10, 318, 204)==0)
+ return;
+
+
+ uiDefButBitI(block, TOG, SI_DRAW_TILE, B_REDR, "Repeat Image", 10,160,140,19, &G.sima->flag, 0, 0, 0, 0, "Repeat/Tile the image display");
+ uiDefButBitI(block, TOG, SI_COORDFLOATS, B_REDR, "Normalized Coords", 165,160,145,19, &G.sima->flag, 0, 0, 0, 0, "Display coords from 0.0 to 1.0 rather then in pixels");
+
+
+ if (G.sima->image) {
+ uiDefBut(block, LABEL, B_NOP, "Image Display:", 10,140,140,19, 0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, IMA_CLAMP_U, B_SIMAGEDRAW, "ClampX", 160,100,70,19, &G.sima->image->tpageflag, 0, 0, 0, 0, "Disable texture repeating horizontaly");
- uiDefButBitS(block, TOG, IMA_CLAMP_V, B_SIMAGEDRAW, "ClampY", 230,100,70,19, &G.sima->image->tpageflag, 0, 0, 0, 0, "Disable texture repeating vertically");
- uiBlockEndAlign(block);
+ uiDefButF(block, NUM, B_REDR, "AspX:", 10,120,140,19, &G.sima->image->aspx, 0.1, 5000.0, 100, 0, "X Display Aspect for this image, does not affect renderingm 0 disables.");
+ uiDefButF(block, NUM, B_REDR, "AspY:", 10,100,140,19, &G.sima->image->aspy, 0.1, 5000.0, 100, 0, "X Display Aspect for this image, does not affect rendering 0 disables.");
+ uiBlockEndAlign(block);
}
+
+
+ if (EM_texFaceCheck()) {
+ uiDefBut(block, LABEL, B_NOP, "Draw Type:", 10, 20,120,19, 0, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButC(block, ROW, B_REDR, "Dash", 10, 0,58,19, &G.sima->dt_uv, 0.0, SI_UVDT_DASH, 0, 0, "Dashed Wire UV drawtype");
+ uiDefButC(block, ROW, B_REDR, "Black", 68, 0,58,19, &G.sima->dt_uv, 0.0, SI_UVDT_BLACK, 0, 0, "Black Wire UV drawtype");
+ uiDefButC(block, ROW, B_REDR, "White", 126,0,58,19, &G.sima->dt_uv, 0.0, SI_UVDT_WHITE, 0, 0, "White Wire UV drawtype");
+ uiDefButC(block, ROW, B_REDR, "Outline", 184,0,58,19, &G.sima->dt_uv, 0.0, SI_UVDT_OUTLINE, 0, 0, "Outline Wire UV drawtype");
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, SI_SMOOTH_UV, B_REDR, "Smooth", 250,0,60,19, &G.sima->flag, 0, 0, 0, 0, "Display smooth lines in the UV view");
+ }
+ image_editcursor_buts(block);
}
static void image_panel_paint(short cntrl) // IMAGE_HANDLER_PAINT
@@ -1088,7 +1408,7 @@ static void image_panel_curves(short cntrl) // IMAGE_HANDLER_CURVES
rect.xmin= 110; rect.xmax= 310;
rect.ymin= 10; rect.ymax= 200;
- curvemap_buttons(block, G.sima->cumap, 'c', B_SIMACURVES, B_SIMAGEDRAW, &rect);
+ curvemap_buttons(block, G.sima->cumap, 'c', B_SIMACURVES, B_REDR, &rect);
bt=uiDefBut(block, BUT, B_SIMARANGE, "Reset", 10, 160, 90, 19, NULL, 0.0f, 0.0f, 0, 0, "Reset Black/White point and curves");
uiButSetFunc(bt, image_panel_curves_reset, G.sima->cumap, ibuf);
@@ -1272,6 +1592,13 @@ static void image_blockhandlers(ScrArea *sa)
case IMAGE_HANDLER_GAME_PROPERTIES:
image_panel_game_properties(sima->blockhandler[a+1]);
break;
+// case IMAGE_HANDLER_TRANSFORM_PROPERTIES:
+// if (EM_texFaceCheck())
+// image_panel_transform_properties(sima->blockhandler[a+1]);
+// break;
+ case IMAGE_HANDLER_VIEW_PROPERTIES:
+ image_panel_view_properties(sima->blockhandler[a+1]);
+ break;
case IMAGE_HANDLER_PAINT:
image_panel_paint(sima->blockhandler[a+1]);
break;
@@ -1395,44 +1722,28 @@ static void imagespace_grid(SpaceImage *sima)
static void sima_draw_alpha_backdrop(SpaceImage *sima, float x1, float y1, float xsize, float ysize)
{
- float tile= sima->zoom*15.0f;
- float x, y, maxx, maxy;
+ GLubyte checker_stipple[32*32/8] =
+ {
+ 255,255,0,0,255,255,0,0,255,255,0,0,255,255,0,0, \
+ 255,255,0,0,255,255,0,0,255,255,0,0,255,255,0,0, \
+ 255,255,0,0,255,255,0,0,255,255,0,0,255,255,0,0, \
+ 255,255,0,0,255,255,0,0,255,255,0,0,255,255,0,0, \
+ 0,0,255,255,0,0,255,255,0,0,255,255,0,0,255,255, \
+ 0,0,255,255,0,0,255,255,0,0,255,255,0,0,255,255, \
+ 0,0,255,255,0,0,255,255,0,0,255,255,0,0,255,255, \
+ 0,0,255,255,0,0,255,255,0,0,255,255,0,0,255,255, \
+ };
glColor3ub(100, 100, 100);
glRectf(x1, y1, x1 + sima->zoom*xsize, y1 + sima->zoom*ysize);
glColor3ub(160, 160, 160);
- maxx= x1+sima->zoom*xsize;
- maxy= y1+sima->zoom*ysize;
-
- for(x=0; x<xsize; x+=30) {
- for(y=0; y<ysize; y+=30) {
- float fx= x1 + sima->zoom*x;
- float fy= y1 + sima->zoom*y;
- float tilex= tile, tiley= tile;
-
- if(fx+tile > maxx)
- tilex= maxx-fx;
- if(fy+tile > maxy)
- tiley= maxy-fy;
-
- glRectf(fx, fy, fx + tilex, fy + tiley);
- }
- }
- for(x=15; x<xsize; x+=30) {
- for(y=15; y<ysize; y+=30) {
- float fx= x1 + sima->zoom*x;
- float fy= y1 + sima->zoom*y;
- float tilex= tile, tiley= tile;
-
- if(fx+tile > maxx)
- tilex= maxx-fx;
- if(fy+tile > maxy)
- tiley= maxy-fy;
-
- glRectf(fx, fy, fx + tilex, fy + tiley);
- }
- }
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(checker_stipple);
+ glRectf(x1, y1, x1 + sima->zoom*xsize, y1 + sima->zoom*ysize);
+ glEnd();
+ glDisable(GL_POLYGON_STIPPLE);
+ return;
}
static void sima_draw_alpha_pixels(float x1, float y1, int rectx, int recty, unsigned int *recti)
@@ -1561,16 +1872,16 @@ void drawimagespace(ScrArea *sa, void *spacedata)
unsigned int *rect;
float x1, y1;
short sx, sy, dx, dy, show_render= 0, show_viewer= 0;
-
+ float xuser_asp, yuser_asp;
/* If derived data is used then make sure that object
* is up-to-date... might not be the case because updates
* are normally done in drawview and could get here before
* drawing a View3D.
*/
- if (!G.obedit && OBACT && (sima->flag & SI_DRAWSHADOW)) {
+ if (G.obedit && OBACT && (sima->flag & SI_DRAWSHADOW)) {
object_handle_update(OBACT);
}
-
+
BIF_GetThemeColor3fv(TH_BACK, col);
glClearColor(col[0], col[1], col[2], 0.0);
glClear(GL_COLOR_BUFFER_BIT);
@@ -1585,6 +1896,8 @@ void drawimagespace(ScrArea *sa, void *spacedata)
}
what_image(sima);
+ aspect_sima(sima, &xuser_asp, &yuser_asp);
+
if(sima->image) {
/* UGLY hack? until now iusers worked fine... but for flipbook viewer we need this */
@@ -1601,8 +1914,10 @@ void drawimagespace(ScrArea *sa, void *spacedata)
if(ibuf==NULL || (ibuf->rect==NULL && ibuf->rect_float==NULL)) {
imagespace_grid(sima);
- if(show_viewer==0)
- draw_tfaces();
+ if(show_viewer==0) {
+ draw_uvs_sima();
+ drawcursor_sima(xuser_asp, yuser_asp);
+ }
}
else {
float xim, yim, xoffs=0.0f, yoffs= 0.0f;
@@ -1617,7 +1932,7 @@ void drawimagespace(ScrArea *sa, void *spacedata)
glLoadIdentity();
}
else {
- xim= ibuf->x; yim= ibuf->y;
+ xim= ibuf->x * xuser_asp; yim= ibuf->y * yuser_asp;
}
/* calc location */
@@ -1638,9 +1953,13 @@ void drawimagespace(ScrArea *sa, void *spacedata)
}
else glaDefine2DArea(&sa->winrct);
- glPixelZoom((float)sima->zoom, (float)sima->zoom);
+ glPixelZoom(sima->zoom * xuser_asp, sima->zoom * yuser_asp);
if(sima->flag & SI_EDITTILE) {
+ /* create char buffer from float if needed */
+ if(ibuf->rect_float && ibuf->rect==NULL)
+ IMB_rect_from_float(ibuf);
+
glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
glPixelZoom(1.0, 1.0);
@@ -1681,6 +2000,10 @@ void drawimagespace(ScrArea *sa, void *spacedata)
sx*= dx;
sy*= dy;
+ /* create char buffer from float if needed */
+ if(ibuf->rect_float && ibuf->rect==NULL)
+ IMB_rect_from_float(ibuf);
+
rect= get_part_from_ibuf(ibuf, sx, sy, sx+dx, sy+dy);
/* rect= ibuf->rect; */
@@ -1693,52 +2016,93 @@ void drawimagespace(ScrArea *sa, void *spacedata)
MEM_freeN(rect);
}
else {
- /* this part is generic image display */
- if(sima->flag & SI_SHOW_ALPHA) {
- if(ibuf->rect)
- sima_draw_alpha_pixels(x1, y1, ibuf->x, ibuf->y, ibuf->rect);
- else if(ibuf->rect_float && ibuf->channels==4)
- sima_draw_alpha_pixelsf(x1, y1, ibuf->x, ibuf->y, ibuf->rect_float);
- }
- else if(sima->flag & SI_SHOW_ZBUF) {
- if(ibuf->zbuf)
- sima_draw_zbuf_pixels(x1, y1, ibuf->x, ibuf->y, ibuf->zbuf);
- else if(ibuf->zbuf_float)
- sima_draw_zbuffloat_pixels(x1, y1, ibuf->x, ibuf->y, ibuf->zbuf_float);
- else if(ibuf->channels==1)
- sima_draw_zbuffloat_pixels(x1, y1, ibuf->x, ibuf->y, ibuf->rect_float);
+ float x1_rep, y1_rep;
+ int x_rep, y_rep;
+ double time_current;
+ short loop_draw_ok = 0;
+
+ if (sima->flag & SI_DRAW_TILE) {
+ loop_draw_ok= 1;
}
- else {
- if(sima->flag & SI_USE_ALPHA) {
- sima_draw_alpha_backdrop(sima, x1, y1, (float)ibuf->x, (float)ibuf->y);
- glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
- }
-
- /* detect if we need to redo the curve map.
- ibuf->rect is zero for compositor and render results after change
- convert to 32 bits always... drawing float rects isnt supported well (atis)
-
- NOTE: if float buffer changes, we have to manually remove the rect
- */
-
- if(ibuf->rect_float) {
- if(ibuf->rect==NULL) {
- if(image_curves_active(sa))
- curvemapping_do_ibuf(G.sima->cumap, ibuf);
- else
- IMB_rect_from_float(ibuf);
+
+ time_current = PIL_check_seconds_timer();
+
+ for (x_rep= ((int)G.v2d->cur.xmin)-1; x_rep < G.v2d->cur.xmax; x_rep++) {
+ x1_rep=x1+ ((x_rep* ibuf->x * sima->zoom) *xuser_asp);
+ for (y_rep= ((int)G.v2d->cur.ymin)-1; y_rep < G.v2d->cur.ymax; y_rep++) {
+ y1_rep=y1+ ((y_rep * ibuf->y *sima->zoom) *yuser_asp);
+
+ /* end repeating image loop */
+
+ if(!loop_draw_ok) {
+ y1_rep = y1;
+ x1_rep = x1;
}
+
+ /*printf("Drawing %d %d zoom:%.6f (%.6f %.6f), (%.6f %.6f)\n", x_rep, y_rep, sima->zoom, G.v2d->cur.xmin, G.v2d->cur.ymin, G.v2d->cur.xmax, G.v2d->cur.ymax);*/
+
+ /* this part is generic image display */
+ if(sima->flag & SI_SHOW_ALPHA) {
+ if(ibuf->rect)
+ sima_draw_alpha_pixels(x1_rep, y1_rep, ibuf->x, ibuf->y, ibuf->rect);
+ else if(ibuf->rect_float && ibuf->channels==4)
+ sima_draw_alpha_pixelsf(x1_rep, y1_rep, ibuf->x, ibuf->y, ibuf->rect_float);
+ }
+ else if(sima->flag & SI_SHOW_ZBUF && ((ibuf->zbuf || ibuf->zbuf_float || (ibuf->channels==1)) == 0)) {
+ if(ibuf->zbuf)
+ sima_draw_zbuf_pixels(x1_rep, y1_rep, ibuf->x, ibuf->y, ibuf->zbuf);
+ else if(ibuf->zbuf_float)
+ sima_draw_zbuffloat_pixels(x1_rep, y1_rep, ibuf->x, ibuf->y, ibuf->zbuf_float);
+ else if(ibuf->channels==1)
+ sima_draw_zbuffloat_pixels(x1_rep, y1_rep, ibuf->x, ibuf->y, ibuf->rect_float);
+ }
+ else {
+ if(sima->flag & SI_USE_ALPHA) {
+ sima_draw_alpha_backdrop(sima, x1_rep, y1_rep, (float)ibuf->x, (float)ibuf->y);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
+ /* detect if we need to redo the curve map.
+ ibuf->rect is zero for compositor and render results after change
+ convert to 32 bits always... drawing float rects isnt supported well (atis)
+
+ NOTE: if float buffer changes, we have to manually remove the rect
+ */
+
+ if(ibuf->rect_float) {
+ if(ibuf->rect==NULL) {
+ if(image_curves_active(sa))
+ curvemapping_do_ibuf(G.sima->cumap, ibuf);
+ else
+ IMB_rect_from_float(ibuf);
+ }
+ }
+
+ if(ibuf->rect)
+ glaDrawPixelsSafe(x1_rep, y1_rep, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+ // else
+ // glaDrawPixelsSafe(x1_rep, y1_rep, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_FLOAT, ibuf->rect_float);
+
+ if(sima->flag & SI_USE_ALPHA)
+ glDisable(GL_BLEND);
+ }
+
+ /* only draw once */
+ if(!loop_draw_ok) {
+ break; /* only draw once */
+ } else if ((PIL_check_seconds_timer() - time_current) > 0.25) {
+ loop_draw_ok = 0;
+ break;
+ }
+
+ /* tile draw loop */
}
-
- if(ibuf->rect)
- glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
-// else
-// glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_FLOAT, ibuf->rect_float);
-
- if(sima->flag & SI_USE_ALPHA)
- glDisable(GL_BLEND);
+ /* only draw once */
+ if(!loop_draw_ok) break;
}
+ /* tile draw loop */
+
}
brush= G.scene->toolsettings->imapaint.brush;
@@ -1766,8 +2130,10 @@ void drawimagespace(ScrArea *sa, void *spacedata)
glPixelZoom(1.0, 1.0);
- if(show_viewer==0)
- draw_tfaces();
+ if(show_viewer==0) {
+ draw_uvs_sima();
+ drawcursor_sima(xuser_asp, yuser_asp);
+ }
}
glPixelZoom(1.0, 1.0);
@@ -1775,7 +2141,7 @@ void drawimagespace(ScrArea *sa, void *spacedata)
calc_image_view(sima, 'f'); /* float */
}
- draw_image_transform(ibuf);
+ draw_image_transform(ibuf, xuser_asp, yuser_asp);
mywinset(sa->win); /* restore scissor after gla call... */
myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375);
@@ -1820,7 +2186,7 @@ static void image_zoom_set_factor(float zoomfac)
/* check zoom limits */
- calc_image_view(G.sima, 'p');
+ calc_image_view(G.sima, 'f'); /* was 'p' are there any cases where this should be 'p'?*/
width= 256;
height= 256;
if (sima->image) {
@@ -1970,8 +2336,9 @@ void image_home(void)
G.sima->xof= G.sima->yof= 0.0f;
- calc_image_view(G.sima, 'p');
-
+ calc_image_view(G.sima, 'f'); /* was 'p' are there any cases where this should be 'p'?*/
+ /*calc_arearcts(curarea);*/
+ scrarea_queue_winredraw(curarea);
scrarea_queue_winredraw(curarea);
}
@@ -2000,7 +2367,7 @@ void image_viewcenter(void)
G.sima->zoom= 0.7/size;
- calc_image_view(G.sima, 'p');
+ calc_image_view(G.sima, 'f'); /* was 'p' are there any cases where 'p' is still needed? */
scrarea_queue_winredraw(curarea);
}
@@ -2072,7 +2439,7 @@ static void imagewindow_progress(ScrArea *sa, RenderResult *rr, volatile rcti *r
/* needed for gla draw */
{ rcti rct= sa->winrct; rct.ymax-= RW_HEADERY; glaDefine2DArea(&rct);}
- glPixelZoom((float)sima->zoom, (float)sima->zoom);
+ glPixelZoom(sima->zoom, sima->zoom);
if(rect32)
glaDrawPixelsSafe(x1, y1, xmax, ymax, rr->rectx, GL_RGBA, GL_UNSIGNED_BYTE, rect32);
@@ -2105,20 +2472,31 @@ static void imagewindow_clear_display_cb(RenderResult *rr)
}
}
+/* returns biggest area that is not uv/image editor. Note that it uses buttons */
+/* window as the last possible alternative. */
static ScrArea *biggest_non_image_area(void)
{
ScrArea *sa, *big= NULL;
- int size, maxsize= 0;
+ int size, maxsize= 0, bwmaxsize= 0;
+ short foundwin= 0;
for(sa= G.curscreen->areabase.first; sa; sa= sa->next) {
- if(sa->spacetype!=SPACE_IMAGE) {
+ if(sa->winx > 10 && sa->winy > 10) {
size= sa->winx*sa->winy;
- if(sa->winx > 10 && sa->winy > 10 && size > maxsize) {
+ if(sa->spacetype == SPACE_BUTS) {
+ if(foundwin == 0 && size > bwmaxsize) {
+ bwmaxsize= size;
+ big= sa;
+ }
+ }
+ else if(sa->spacetype != SPACE_IMAGE && size > maxsize) {
maxsize= size;
big= sa;
+ foundwin= 1;
}
}
}
+
return big;
}
diff --git a/source/blender/src/drawimasel.c b/source/blender/src/drawimasel.c
index 45757170f78..257c5831813 100644
--- a/source/blender/src/drawimasel.c
+++ b/source/blender/src/drawimasel.c
@@ -30,12 +30,6 @@
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
-#ifdef __sgi
-#define OLD_IMASEL 1
-#else
-#define OLD_IMASEL 0
-#endif
-
#include <string.h>
#ifdef HAVE_CONFIG_H
@@ -47,811 +41,621 @@
#endif
#include "MEM_guardedalloc.h"
-#include "BMF_Api.h"
-#include "BLI_blenlib.h"
-#include "IMB_imbuf_types.h"
+
+#include "DNA_ID.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_object_types.h"
+#include "DNA_material_types.h"
+
+#include "BLI_blenlib.h"
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
+#include "BLI_storage_types.h"
+
#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_icons.h"
+#include "BKE_utildefines.h"
+#include "BIF_filelist.h"
-#include "BIF_fsmenu.h"
#include "BIF_gl.h"
-#include "BIF_resources.h"
+#include "BIF_glutil.h"
+#include "BIF_mywindow.h"
#include "BIF_screen.h"
+#include "BIF_resources.h"
+#include "BIF_language.h"
+
#include "BIF_interface.h"
#include "BIF_interface_icons.h"
-#include "BIF_imasel.h"
-#include "BIF_mywindow.h"
+#include "BIF_previewrender.h"
+#include "BIF_fsmenu.h"
#include "BIF_space.h"
-#include "BIF_resources.h"
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
#include "BSE_drawimasel.h"
-#include "BSE_filesel.h"
+#include "BSE_drawipo.h" /* for v2d functions */
+#include "BSE_view.h"
-#include "blendef.h"
-#include "mydevice.h"
+#include "BLO_readfile.h"
-#define IMALINESIZE 16
-/* well, who would have thought ... */
-#define lrectwrite(a, b, c, d, rect) {glRasterPos2i(a, b);glDrawPixels((c)-(a)+1, (d)-(b)+1, GL_RGBA, GL_UNSIGNED_BYTE, rect);}
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
-/* GLOBALS */
-extern char *fsmenu;
+#include "PIL_time.h"
-void rectwrite_imasel(int , int , int , int , int , int , int , int , float , float , unsigned int *);
+#include "blendef.h"
+#include "mydevice.h"
-void rectwrite_imasel(int winxmin, int winymin, int winxmax, int winymax, int x1, int y1, int xim, int yim, float zoomx, float zoomy, unsigned int *rect)
-{
- int cx, cy, oldxim, x2, y2;
-
- oldxim= xim;
-
- /* coordinates how it will be put at screen */
- x2= x1+ zoomx*xim;
- y2= y1+ zoomy*yim;
-
- /* partial clip */
- if(x1<=winxmin) {
- /* with OpenGL, rects are not allowed to start outside of the left/bottom window edge */
- cx= winxmin-x1+(int)zoomx;
- /* make sure the rect will be drawn pixel-exact */
- cx/= zoomx;
- cx++;
- x1+= zoomx*cx;
- xim-= cx;
- rect+= cx;
- }
- if(y1<=winymin) {
- cy= winymin-y1+(int)zoomy;
- cy/= zoomy;
- cy++;
- y1+= zoomy*cy;
- rect+= cy*oldxim;
- yim-= cy;
+#include "interface.h" /* urm... for rasterpos_safe, roundbox */
+
+#define BUTTONWIDTH 20
+#define BOOKMARKWIDTH_MAX 240
+
+void calc_imasel_rcts(SpaceImaSel *simasel, int winx, int winy)
+{
+ int width = (int)16.0f*simasel->aspect;
+ int numtiles;
+ int numfiles = 0;
+ int tilewidth = simasel->prv_w + TILE_BORDER_X*4;
+ int tileheight = simasel->prv_h + TILE_BORDER_Y*4 + U.fontsize;
+
+ // complete area of the space
+ simasel->v2d.mask.xmin= simasel->v2d.mask.ymin = 0;
+ simasel->v2d.mask.xmax= winx;
+ simasel->v2d.mask.ymax= winy;
+
+ // vertical scroll bar
+ simasel->v2d.vert= simasel->v2d.mask;
+ simasel->v2d.vert.xmax -= TILE_BORDER_X + 2;
+ simasel->v2d.vert.xmin= simasel->v2d.vert.xmax- width - TILE_BORDER_X - 2;
+ simasel->v2d.vert.ymax -= IMASEL_BUTTONS_HEIGHT + TILE_BORDER_Y + 2;
+ simasel->v2d.vert.ymin += TILE_BORDER_Y + 2;
+ // simasel->v2d.mask.xmax= simasel->v2d.vert.xmin;
+
+ if (simasel->flag & FILE_BOOKMARKS) {
+ int bmwidth = (simasel->v2d.vert.xmin - simasel->v2d.mask.xmin)/4.0f;
+ if (bmwidth > BOOKMARKWIDTH_MAX) bmwidth = BOOKMARKWIDTH_MAX;
+
+ simasel->bookmarkrect.xmin = simasel->v2d.mask.xmin + TILE_BORDER_X;
+ simasel->bookmarkrect.xmax = simasel->v2d.mask.xmin + bmwidth - TILE_BORDER_X;
+ simasel->bookmarkrect.ymax = simasel->v2d.mask.ymax - IMASEL_BUTTONS_HEIGHT - TILE_BORDER_Y;
+ simasel->bookmarkrect.ymin = simasel->v2d.mask.ymin + TILE_BORDER_Y;
+
+ simasel->viewrect.xmin = simasel->bookmarkrect.xmax + TILE_BORDER_X;
+ simasel->viewrect.xmax = simasel->v2d.vert.xmin - TILE_BORDER_X;
+ simasel->viewrect.ymax = simasel->v2d.mask.ymax - IMASEL_BUTTONS_HEIGHT - TILE_BORDER_Y;
+ simasel->viewrect.ymin = simasel->v2d.mask.ymin + TILE_BORDER_Y;
+ } else {
+ simasel->viewrect.xmin = simasel->v2d.mask.xmin + TILE_BORDER_X;
+ simasel->viewrect.xmax = simasel->v2d.vert.xmin - TILE_BORDER_X;
+ simasel->viewrect.ymax = simasel->v2d.mask.ymax - IMASEL_BUTTONS_HEIGHT - TILE_BORDER_Y;
+ simasel->viewrect.ymin = simasel->v2d.mask.ymin + TILE_BORDER_Y;
}
- if(x2>=winxmax) {
- cx= x2-winxmax;
- cx/= zoomx;
- xim-= cx+3;
+
+ simasel->numtilesx = (simasel->viewrect.xmax - simasel->viewrect.xmin) / tilewidth;
+ simasel->numtilesy = (simasel->viewrect.ymax - simasel->viewrect.ymin) / tileheight;
+ numtiles = simasel->numtilesx*simasel->numtilesy;
+
+ if (simasel->files) {
+ numfiles = BIF_filelist_numfiles(simasel->files);
}
- if(y2>=winymax) {
- cy= y2-winymax;
- cy/= zoomy;
- yim-= cy+3;
+ if (numtiles > numfiles) numtiles = numfiles;
+
+ simasel->scrollarea = ((float)simasel->v2d.vert.ymax - (float)simasel->v2d.vert.ymin);
+ if (numtiles < numfiles) {
+ simasel->scrollheight = ((float)numtiles / (float)numfiles)*simasel->scrollarea;
+ simasel->scrollarea -= simasel->scrollheight;
+ } else {
+ simasel->scrollheight = simasel->scrollarea;
}
-
- if(xim<=0) return;
- if(yim<=0) return;
+ if (simasel->scrollarea < 0) simasel->scrollarea = 0;
+}
-// mywinset(curarea->win);
- glScissor(winxmin, winymin, winxmax-winxmin+1, winymax-winymin+1);
-
- glPixelStorei(GL_UNPACK_ROW_LENGTH, oldxim);
-
- glPixelZoom(zoomx, zoomy);
+void draw_imasel_scroll(SpaceImaSel *simasel)
+{
+ rcti scrollbar;
+ rcti scrollhandle;
- glRasterPos2i(x1, y1);
- glDrawPixels(xim, yim, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+ scrollbar.xmin= simasel->v2d.cur.xmin + simasel->v2d.vert.xmin;
+ scrollbar.ymin = simasel->v2d.cur.ymin + simasel->v2d.vert.ymin;
+ scrollbar.xmax= simasel->v2d.cur.xmin + simasel->v2d.vert.xmax;
+ scrollbar.ymax = simasel->v2d.cur.ymin + simasel->v2d.vert.ymax;
- glPixelZoom(1.0, 1.0);
+ scrollhandle.xmin= scrollbar.xmin;
+ scrollhandle.ymin = scrollbar.ymax - simasel->scrollpos -1;
+ scrollhandle.xmax= scrollbar.xmax-1;
+ scrollhandle.ymax = scrollbar.ymax - simasel->scrollpos - simasel->scrollheight;
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
-}
+ BIF_ThemeColor(TH_SHADE1);
+ glRecti(scrollbar.xmin, scrollbar.ymin, scrollbar.xmax, scrollbar.ymax);
+ uiEmboss(scrollbar.xmin-2, scrollbar.ymin-2, scrollbar.xmax+2, scrollbar.ymax+2, 1);
-void viewgate(short sx, short sy, short ex, short ey)
-{
- short wx, wy;
- wx = curarea->winrct.xmin; wy = curarea->winrct.ymin;
- glViewport(wx+sx, wy+sy, (wx+ex )-(wx+sx)+1, (wy+ey )-(wy+sy)+1);
- glScissor(wx+sx, wy+sy, (wx+ex )-(wx+sx)+1, (wy+ey )-(wy+sy)+1);
- myortho2((float)sx-0.375 , (float)ex-0.375, (float)sy-0.375, (float)ey-0.375);
-}
+ BIF_ThemeColor(TH_SHADE2);
+ glRecti(scrollhandle.xmin, scrollhandle.ymin, scrollhandle.xmax, scrollhandle.ymax);
-void areaview (void)
-{
- short wx, wy;
- wx = curarea->winrct.xmin; wy = curarea->winrct.ymin;
- glViewport(wx, wy, curarea->winx, curarea->winy);
- glScissor(wx, wy, curarea->winx, curarea->winy);
- myortho2(-0.375, (float)(curarea->winx)-0.375, -0.375, (float)(curarea->winy)-0.375);
-
+ uiEmboss(scrollhandle.xmin, scrollhandle.ymin, scrollhandle.xmax, scrollhandle.ymax, 1);
}
-
-void calc_hilite(SpaceImaSel *simasel)
+
+static void draw_tile(SpaceImaSel *simasel, short sx, short sy, int colorid)
{
- OneSelectableIma *ima;
- ImaDir *direntry;
- short mx, my;
- int i, area_event;
-
- if (simasel->hilite > -1) {
- direntry = simasel->firstdir;
- while(direntry){
- direntry->hilite = 0;
- direntry = direntry->next;
- }
- simasel->hilite = -1;
- }
-
- if (simasel->totalima){
- simasel->hilite_ima = 0;
- ima = simasel->first_sel_ima;
- while (ima){
- ima->selectable = 0;
- ima = ima->next;
- }
- }
-
- area_event = 0;
- mx = simasel->mx;
- my = simasel->my;
-
- if (simasel->desx > 0){
- if ( (mx > simasel->desx) && (mx < simasel->deex) && (my > simasel->desy) && (my < simasel->deey) ) area_event = IMS_INDIR;
- }
- if (simasel->fesx > 0){
- if ( (mx > simasel->fesx) && (mx < simasel->feex) && (my > simasel->fesy) && (my < simasel->feey) ) area_event = IMS_INFILE;
- }
-
- switch(area_event){
- case IMS_INDIR:
- simasel->hilite = simasel->topdir + ((simasel->deey - my - 4) / IMALINESIZE);
-
- if (my >= simasel->deey) simasel->hilite = -1;
- if (simasel->hilite >= simasel->totaldirs) simasel->hilite = -1;
-
- if (simasel->hilite > -1){
- direntry = simasel->firstdir;
- for (i = simasel->hilite; i>0; i--){
- direntry = direntry->next;
- }
- direntry->hilite = 1;
-
- }
- simasel->mouse_move_redraw = 1;
- break;
-
- case IMS_INFILE:
- if (simasel->totalima){
- ima = simasel->first_sel_ima;
- while (ima){
- ima->selectable = 0;
-
- if (ima->draw_me) {
- if ((mx > ima->sx) && (mx < ima->sx+76) && (my > ima->sy-16) && (my < ima->sy+76)) {
- ima->selectable = 1;
- simasel->hilite_ima = ima;
- simasel->mouse_move_redraw = 1;
- }
- }
-
- ima = ima->next;
- }
- }
- break;
- }
+ /* TODO: BIF_ThemeColor seems to need this to show the color, not sure why? - elubie */
+ glEnable(GL_BLEND);
+ glColor4ub(0, 0, 0, 100);
+ glDisable(GL_BLEND);
+
+ BIF_ThemeColor4(colorid);
+ uiSetRoundBox(15);
+ uiRoundBox(sx+TILE_BORDER_X, sy - simasel->prv_h - TILE_BORDER_Y*3 - U.fontsize, sx + simasel->prv_w + TILE_BORDER_X*3, sy, 6);
}
-
-void make_sima_area(SpaceImaSel *simasel)
-{
- OneSelectableIma *ima;
- short rh, dm, sc;
- short boxperline, boxlines, boxlinesinview, boxlinesleft;
-
-/* ima slider box */
- simasel->fssx = 8;
- simasel->fssy = 8;
- simasel->fsex = 30;
- simasel->fsey = curarea->winy-64;
-/* ima entry's box */
- simasel->fesx = simasel->fsex + 8;
- simasel->fesy = simasel->fssy;
- simasel->feex = curarea->winx- 8;
- simasel->feey = curarea->winy-64;
-/* ima names */
- simasel->dnsx = 38;
- simasel->dnsy = curarea->winy - 29;
- simasel->dnw = curarea->winx - 8 - 38;
- simasel->dnh = 21;
- simasel->fnsx = simasel->fesx;
- simasel->fnsy = curarea->winy - 29 - 29;
- simasel->fnw = curarea->winx - 8 - simasel->fnsx;
- simasel->fnh = 21;
-
- if ((simasel->mode & 1)==1){
- /* dir slider box */
- simasel->dssx = 8;
-
- simasel->dsex = 30;
- simasel->dsey = curarea->winy-64;
- /* dir entry's box */
- simasel->desx = 38;
- simasel->desy = 8;
-
- simasel->deex = 208;
- simasel->deey = curarea->winy-64;
- simasel->dssy = simasel->desy;
- if (simasel->deex > (curarea->winx -8) ) simasel->deex = curarea->winx - 8;
- if (simasel->deex <= simasel->desx ) simasel->dssx = 0;
- /* file slider & entry & name box ++ */
- simasel->fssx += 216;
- simasel->fsex += 216;
- simasel->fesx += 216;
- simasel->fnsx += 216;
- simasel->fnw -= 216;
- }else{
- simasel->desx = 0;
- }
-
- if ((simasel->mode & 2) == 2){
- simasel->fesy += 32;
- simasel->infsx = simasel->fesx; simasel->infsy = 8;
- simasel->infex = simasel->feex; simasel->infey = 28;
- }else{
- simasel->infsx = 0;
+static float shorten_string(SpaceImaSel *simasel, char* string, float w)
+{
+ short shortened = 0;
+ float sw = 0;
+
+ sw = BIF_GetStringWidth(simasel->curfont, string, 0);
+ while (sw>w) {
+ int slen = strlen(string);
+ string[slen-1] = '\0';
+ sw = BIF_GetStringWidth(simasel->curfont, string, 0);
+ shortened = 1;
}
-
- simasel->dsdh = simasel->deey - simasel->desy - 4;
-
- if (simasel->dsdh <= 16) { simasel->desx = 0; }
- if ((simasel->feex-16) <= simasel->fesx) { simasel->fesx = 0; }
- if ((simasel->infex-16) <= simasel->infsx) { simasel->infsx = 0; }
-
- if ((simasel->deey ) <= simasel->desy) { simasel->desx = 0; }
- if ((simasel->feey ) <= simasel->fesy) { simasel->fesx = 0; }
- if ((simasel->infey ) > simasel->feey) { simasel->infsx = 0;}
-
- /* Dir Slider */
- if (simasel->desx != 0){
- simasel->dirsli = 0;
-
- simasel->dirsli_lines = (simasel->dsdh / IMALINESIZE);
- simasel->dirsli_h = 0;
-
- if (simasel->topdir < 0) simasel->topdir = 0;
- if (simasel->topdir > (simasel->totaldirs - simasel->dirsli_lines) ) simasel->topdir = (simasel->totaldirs - simasel->dirsli_lines);
-
- if ( (simasel->totaldirs * IMALINESIZE) >= simasel->dsdh ){
- simasel->dirsli = 1;
- simasel->dirsli_sx = simasel->dssx+2;
- simasel->dirsli_ex = simasel->dsex-2;
-
- simasel->dirsli_h = (simasel->dsdh) * (float)simasel->dirsli_lines / (float)simasel->totaldirs;
- simasel->dirsli_ey = simasel->dsey - 2;
- if (simasel->topdir) {
- rh = (simasel->dsdh - simasel->dirsli_h);
- simasel->dirsli_ey -= rh * (float)((float)simasel->topdir / (float)(simasel->totaldirs - simasel->dirsli_lines ));
- }
-
- if (simasel->dirsli_h < 4) simasel->dirsli_h = 4;
-
- }else{
- simasel->topdir = 0;
- }
- }
-
- if (simasel->totalima){
- /* there are images */
-
- ima = simasel->first_sel_ima;
-
-
- boxperline = (simasel->feex - simasel->fesx) / 80;
- if (boxperline) boxlines = 1 + (simasel->totalima / boxperline); else boxlines = 1;
- boxlinesinview = (simasel->feey - simasel->fesy) / 100;
- boxlinesleft = boxlines - boxlinesinview;
-
- if (boxlinesleft > 0){
- /* slider needed */
-
- simasel->slider_height = boxlinesinview / (float)(boxlines+1);
- simasel->slider_space = 1.0 - simasel->slider_height;
-
- simasel->imasli_sx = simasel->fssx+1;
- simasel->imasli_ex = simasel->fsex-1;
- simasel->fsdh = simasel->fsey - simasel->fssy - 4;
-
- simasel->imasli_h = simasel->fsdh * simasel->slider_height;
- if (simasel->imasli_h < 6) simasel->imasli_h = 6;
- simasel->imasli_ey = simasel->fsey - 2 - (simasel->fsdh * simasel->slider_space * simasel->image_slider);
-
- simasel->imasli = 1;
-
- }else{
- simasel->image_slider = 0;
- simasel->imasli = 0;
- }
-
- sc = simasel->image_slider * (boxlinesleft * 100);
-
- simasel->curimax = simasel->fesx + 8;
- simasel->curimay = simasel->feey - 90 + sc;
-
- dm = 1;
- if (simasel->curimay-2 < simasel->fesy) dm = 0;
- // let first row of icons remain selectable
- if(OLD_IMASEL) if (simasel->curimay+80 > simasel->feey) dm = 0;
- if (simasel->curimax+72 > simasel->feex) dm = 0;
-
- simasel->total_selected = 0;
- while (ima){
- ima->draw_me = dm;
-
- if (ima->selected) simasel->total_selected++;
-
- ima->sx = simasel->curimax;
- ima->sy = simasel->curimay+16;
-
- ima->ex = ima->sx + ima->dw;
- ima->ey = ima->sy + ima->dh;
-
- simasel->curimax += 80;
- if (simasel->curimax + 72 > simasel->feex){
-
- simasel->curimax = simasel->fesx + 8;
- simasel->curimay -= 100;
-
- dm = 1;
- // let icons that fall off (top/bottom) be selectable
- if(OLD_IMASEL) {
- if (simasel->curimay+80 > simasel->feey) dm = 0;
- if (simasel->curimay-8 < simasel->fesy) dm = 0;
- }
-
- }
- ima = ima->next;
+ if (shortened) {
+ int slen = strlen(string);
+ if (slen > 3) {
+ BLI_strncpy(string+slen-3, "...", 4);
}
}
+ return sw;
}
-static void str_image_type(int ftype, char *name)
+static void draw_file(SpaceImaSel *simasel, short sx, short sy, struct direntry *file)
{
- strcpy(name, "");
-
- if((ftype & JPG_MSK) == JPG_STD) strcat(name, "std ");
- if((ftype & JPG_MSK) == JPG_VID) strcat(name, "video ");
- if((ftype & JPG_MSK) == JPG_JST) strcat(name, "amiga ");
- if((ftype & JPG_MSK) == JPG_MAX) strcat(name, "max ");
-
- if( ftype == AN_hamx) { strcat(name, "hamx "); return; }
+ short soffs;
+ char fname[FILE_MAXFILE];
+ float sw;
+
+ BLI_strncpy(fname,file->relname, FILE_MAXFILE);
+ sw = shorten_string(simasel, fname, simasel->prv_w );
+ soffs = (simasel->prv_w + TILE_BORDER_X*4 - sw) / 2;
- if( ftype == IMAGIC ) { strcat(name, "sgi "); return; }
- if( ftype & JPG ) { strcat(name, "jpeg "); }
- if( ftype & TGA ) { strcat(name, "targa "); }
- if( ftype & PNG ) { strcat(name, "png "); }
- if( ftype & BMP ) { strcat(name, "bmp "); }
- if( ftype & AMI ) { strcat(name, "iff "); }
-#ifdef WITH_QUICKTIME
- if( ftype & QUICKTIME ) { strcat(name, "quicktime "); }
+ ui_rasterpos_safe(sx+soffs, sy - simasel->prv_h - TILE_BORDER_Y*2 - U.fontsize, simasel->aspect);
+#ifdef WIN32
+ BIF_DrawString(simasel->curfont, fname, ((U.transopts & USER_TR_MENUS) | CONVERT_TO_UTF8));
+#else
+ BIF_DrawString(simasel->curfont, fname, (U.transopts & USER_TR_MENUS));
#endif
}
-void draw_sima_area(SpaceImaSel *simasel)
-{
- uiBlock *block;
- OneSelectableIma *ima;
- ImaDir *direntry;
- float col[3];
- int i, info;
- short sx, sy, ex, ey, sc;
- char naam[256], infostr[256];
-
- BIF_GetThemeColor3fv(TH_BACK, col);
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- sprintf(naam, "win %d", curarea->win);
- block= uiNewBlock(&curarea->uiblocks, naam, UI_EMBOSS, UI_HELV, curarea->win);
- uiBlockSetCol(block, TH_BUT_SETTING1);
-
- if (simasel->desx > 0){
- /* DIR ENTRYS */
- BIF_ThemeColorShade(TH_SHADE1, -70);
- glRecti(simasel->dssx, simasel->dssy, simasel->dsex, simasel->dsey);
- glRecti(simasel->desx, simasel->desy, simasel->deex, simasel->deey);
-
- uiEmboss(simasel->dssx, simasel->dssy, simasel->dsex, simasel->dsey,1);
- uiEmboss(simasel->desx, simasel->desy, simasel->deex, simasel->deey,1);
+static void draw_imasel_bookmarks(ScrArea *sa, SpaceImaSel *simasel)
+{
+ char bookmark[FILE_MAX];
+ float sw;
+
+ if (simasel->flag & FILE_BOOKMARKS) {
+ int nentries = fsmenu_get_nentries();
+ int i;
+ short sx, sy;
+ int bmwidth;
+ int linestep = U.fontsize*3/2;
- if (simasel->dirsli == 1) {
- sx = simasel->dirsli_sx+2;
- sy = simasel->dirsli_ey - simasel->dirsli_h+2;
- ex = simasel->dirsli_ex-2;
- ey = simasel->dirsli_ey-2;
-
- BIF_ThemeColor(TH_SHADE1);
-
- glRecti(sx, sy, ex, ey);
- uiEmboss(sx, sy, ex,ey,0);
- }
- if (simasel->totaldirs) {
- sx = simasel->desx+8;
- sy = simasel->deey-IMALINESIZE;
+ sx = simasel->bookmarkrect.xmin + TILE_BORDER_X;
+ sy = simasel->bookmarkrect.ymax - TILE_BORDER_Y - linestep;
+ bmwidth = simasel->bookmarkrect.xmax - simasel->bookmarkrect.xmin - 2*TILE_BORDER_X;
+
+ if (bmwidth < 0) return;
+
+ for (i=0; i< nentries && sy > linestep ;++i) {
+ char *fname = fsmenu_get_entry(i);
+ char *sname = NULL;
- direntry = simasel->firstdir;
- if (simasel->topdir){
- for(i = simasel->topdir; i>0; i--){
- direntry = direntry->next;
- }
- }
- viewgate(simasel->desx, simasel->desy, simasel->deex-4, simasel->deey);
+ if (fname) {
+ int sl;
+ BLI_strncpy(bookmark, fname, FILE_MAX);
- i = simasel->dirsli_lines;
- if (i > simasel->totaldirs) i = simasel->totaldirs;
- for(;i > 0; i--){
- strcpy(naam, direntry->name);
-
- cpack(0xFFFFFF);
- if (direntry->selected == 1){
- cpack(0x7777CC);
- glRecti(simasel->desx+2, sy-4, simasel->deex-4, sy+IMALINESIZE-4);
- cpack(0xFFFFFF);
+ sl = strlen(bookmark)-1;
+ if (bookmark[sl] == '\\' || bookmark[sl] == '/') {
+ bookmark[sl] = '\0';
+ sl--;
}
- if (direntry->hilite == 1){
- cpack(0x999999);
- glRecti(simasel->desx+2, sy-4, simasel->deex-4, sy+IMALINESIZE-4);
- cpack(0xFFFFFF);
+ while (sl) {
+ if (bookmark[sl] == '\\' || bookmark[sl] == '/'){
+ sl++;
+ break;
+ };
+ sl--;
}
+ sname = &bookmark[sl];
+ sw = shorten_string(simasel, sname, bmwidth);
+
- glRasterPos2i(sx, sy);
- BMF_DrawString(G.font, naam);
-
- direntry = direntry->next;
- sy-=IMALINESIZE;
+ if (simasel->active_bookmark == i ) {
+ glEnable(GL_BLEND);
+ glColor4ub(0, 0, 0, 100);
+ glDisable(GL_BLEND);
+ BIF_ThemeColor(TH_HILITE);
+ uiSetRoundBox(15);
+ uiRoundBox(simasel->bookmarkrect.xmin + TILE_BORDER_X - 1, sy - linestep*0.25, simasel->bookmarkrect.xmax - TILE_BORDER_X + 1, sy + linestep*0.75, 6);
+ BIF_ThemeColor(TH_TEXT_HI);
+ } else {
+ BIF_ThemeColor(TH_TEXT);
+ }
+ ui_rasterpos_safe(sx, sy, simasel->aspect);
+#ifdef WIN32
+ BIF_DrawString(simasel->curfont, sname, ((U.transopts & USER_TR_MENUS) | CONVERT_TO_UTF8));
+#else
+ BIF_DrawString(simasel->curfont, sname, (U.transopts & USER_TR_MENUS));
+#endif
+ sy -= linestep;
+ } else {
+ cpack(0xB0B0B0);
+ sdrawline(sx, sy + U.fontsize/2 , sx + bmwidth, sy + U.fontsize/2);
+ cpack(0x303030);
+ sdrawline(sx, sy + 1 + U.fontsize/2 , sx + bmwidth, sy + 1 + U.fontsize/2);
+ sy -= linestep;
}
- areaview();
-
- }
-
- /* status icons */
-
- sx = simasel->desx;
- sy = simasel->deey+6;
-
- if (bitset(simasel->fase, IMS_FOUND_BIP)) {
- BIF_icon_draw(sx+16*0, sy, ICON_BPIBFOLDER_HLT);
- } else if (bitset(simasel->fase, IMS_WRITE_NO_BIP)) {
- BIF_icon_draw(sx+16*0, sy, ICON_BPIBFOLDER_DEHLT);
- } else {
- BIF_icon_draw(sx+16*0, sy, ICON_BPIBFOLDER_DEHLT);
}
- if (bitset(simasel->fase, IMS_KNOW_INF)) {
- BIF_icon_draw(sx+16*1, sy, ICON_FOLDER_HLT);
+ uiEmboss(simasel->bookmarkrect.xmin, simasel->bookmarkrect.ymin, simasel->bookmarkrect.xmax-1, simasel->bookmarkrect.ymax-1, 1);
+ }
+}
+
+static void draw_imasel_previews(ScrArea *sa, SpaceImaSel *simasel)
+{
+ static double lasttime= 0;
+ struct FileList* files = simasel->files;
+ int numfiles;
+ struct direntry *file;
+ int numtiles;
+
+ int tilewidth = simasel->prv_w + TILE_BORDER_X*4;
+ int tileheight = simasel->prv_h + TILE_BORDER_Y*4 + U.fontsize;
+ short sx, sy;
+ int do_load = 1;
+
+ ImBuf* imb=0;
+ int i,j;
+ short type;
+ int colorid = 0;
+ int todo;
+ int fileoffset, rowoffset, columnoffset;
+ float scrollofs;
+
+
+ rcti viewrect = simasel->viewrect;
+
+ if (!files) return;
+ /* Reload directory */
+ BLI_strncpy(simasel->dir, BIF_filelist_dir(files), FILE_MAXDIR);
+
+ type = BIF_filelist_gettype(simasel->files);
+
+ if (BIF_filelist_empty(files))
+ {
+ unsigned int filter = 0;
+ BIF_filelist_hidedot(simasel->files, simasel->flag & FILE_HIDE_DOT);
+ if (simasel->flag & FILE_FILTER) {
+ filter = simasel->filter ;
} else {
- BIF_icon_draw(sx+16*1, sy, ICON_FOLDER_DEHLT);
+ filter = 0;
}
+
+ BIF_filelist_setfilter(simasel->files, filter);
+ BIF_filelist_readdir(files);
- if (bitset(simasel->fase, IMS_KNOW_IMA)) {
- BIF_icon_draw(sx+16*2, sy, ICON_BLUEIMAGE_HLT);
- } else {
- BIF_icon_draw(sx+16*2, sy, ICON_BLUEIMAGE_DEHLT);
- }
+ if(simasel->sort!=FILE_SORTALPHA) BIF_filelist_sort(simasel->files, simasel->sort);
}
-
- if (simasel->fesx > 0) {
- int extrabutsize;
-
- BIF_ThemeColorShade(TH_SHADE1, -80);
- glRecti(simasel->fssx, simasel->fssy, simasel->fsex, simasel->fsey);
+ BIF_filelist_imgsize(simasel->files,simasel->prv_w,simasel->prv_h);
- glRecti(simasel->fesx, simasel->fesy, simasel->feex, simasel->feey);
+ numfiles = BIF_filelist_numfiles(files);
+ numtiles = simasel->numtilesx*simasel->numtilesy;
- uiEmboss(simasel->fssx-1, simasel->fssy-1, simasel->fsex+1, simasel->fsey+1,1);
- uiEmboss(simasel->fesx-1, simasel->fesy-1, simasel->feex+1, simasel->feey+1,1);
-
- if (simasel->imasli == 1){
- sx = simasel->imasli_sx;
- sy = simasel->imasli_ey - simasel->imasli_h;
- ex = simasel->imasli_ex;
- ey = simasel->imasli_ey;
-
- BIF_ThemeColor(TH_SHADE1);
+ if (numtiles > numfiles) numtiles = numfiles;
+
+ todo = 0;
+ if (lasttime < 0.001) lasttime = PIL_check_seconds_timer();
- glRecti(sx, sy, ex, ey);
- uiEmboss(sx, sy, ex, ey, 1);
- }
- info = 0;
- strcpy(infostr, "");
- if (simasel->totalima){
- viewgate(simasel->fesx, simasel->fesy, simasel->feex, simasel->feey);
-
- ima = simasel->first_sel_ima;
-
- while (ima){
- sc = 0;
-
- sx = ima->sx- 6; sy = ima->sy-20 + sc;
- ex = ima->sx+71; ey = ima->sy+70 + sc;
-
- if(ima->selected == 1){
- cpack(0xCC6666);
- glRecti(sx, sy, ex, ey);
- }
- if(ima->selectable == 1){
- if (ima->selected ) cpack(0xEE8888); else cpack(0x999999);
-
- if (((simasel->mode & 8) != 8) && (simasel->hilite_ima == ima)){
- glRecti(sx, sy, ex, ey); uiEmboss(sx,sy, ex,ey, 1);
- }
- if (ima->disksize/1000 > 1000){ sprintf(infostr, "%s %.2fMb x%i y%i %i bits ",ima->file_name,(ima->disksize/1024)/1024.0, ima->orgx, ima->orgy, ima->orgd);
- }else{ sprintf(infostr, "%s %dKb %ix%i %i bits ", ima->file_name,ima->disksize/1024, ima->orgx, ima->orgy, ima->orgd);
- }
- if (ima->anim == 1){ strcat (infostr, "movie"); }else{
- str_image_type(ima->ibuf_type, naam);
- strcat (infostr, naam);
- }
- info = 1;
+ if (simasel->numtilesx > 0) {
+ /* calculate the offset to start drawing */
+ if ((numtiles < numfiles) && (simasel->scrollarea > 0)) {
+ fileoffset = numfiles*( (simasel->scrollpos) / simasel->scrollarea) + 0.5;
+ } else {
+ fileoffset = 0;
+ }
+ rowoffset = (fileoffset / simasel->numtilesx)*simasel->numtilesx;
+ columnoffset = fileoffset % simasel->numtilesx;
+ scrollofs = (float)tileheight*(float)columnoffset/(float)simasel->numtilesx;
+ } else {
+ rowoffset = 0;
+ scrollofs = 0;
+ }
+ /* add partially visible row */
+ numtiles += simasel->numtilesx;
+ for (i=rowoffset, j=0 ; (i < numfiles) && (j < numtiles); ++i, ++j)
+ {
+ sx = simasel->v2d.cur.xmin + viewrect.xmin + (j % simasel->numtilesx)*tilewidth;
+ sy = simasel->v2d.cur.ymin + viewrect.ymax + (short)scrollofs - (viewrect.ymin + (j / simasel->numtilesx)*tileheight);
+
+ file = BIF_filelist_file(files, i);
+
+ if (simasel->active_file == i) {
+ colorid = TH_ACTIVE;
+ draw_tile(simasel, sx, sy, colorid);
+ } else if (file->flags & ACTIVE) {
+ colorid = TH_HILITE;
+ draw_tile(simasel, sx, sy, colorid);
+ } else {
+ /*
+ colorid = TH_PANEL;
+ draw_tile(simasel, sx, sy, colorid);
+ */
+ }
+
+ if ( type == FILE_MAIN) {
+ ID *id;
+ int icon_id = 0;
+ int idcode;
+ idcode= BIF_groupname_to_code(simasel->dir);
+ if (idcode == ID_MA || idcode == ID_TE || idcode == ID_LA || idcode == ID_WO || idcode == ID_IM) {
+ id = (ID *)file->poin;
+ icon_id = BKE_icon_getid(id);
+ }
+ if (icon_id) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if (do_load) {
+ BIF_icon_draw_preview(sx+2*TILE_BORDER_X, sy-simasel->prv_w-TILE_BORDER_X, icon_id, 0);
+ } else {
+ BIF_icon_draw_preview(sx+2*TILE_BORDER_X, sy-simasel->prv_w-TILE_BORDER_X, icon_id, 1);
+ todo++;
}
- sx = ima->sx; sy = ima->sy + sc;
- ex = ima->ex; ey = ima->ey + sc;
-
- if (ima->anim == 0) BIF_ThemeColorShade(TH_SHADE1, -80);
- else BIF_ThemeColorShade(TH_SHADE1, -70);
-
- glRecti(sx, sy, ex, ey);
- uiEmboss(sx-1,sy-1, ex+1,ey+1, 1);
-
- cpack(0);
- strcpy(naam, ima->file_name);
- naam[11] = 0;
-
- glRasterPos2i(sx+32-BMF_GetStringWidth(G.fonts, naam) / 2 , sy-16);
- BMF_DrawString(G.fonts, naam);
-
- if ((ima) && (ima->pict) && (ima->pict->rect)){
- if ( (ey > simasel->fesy) && (sy < simasel->feey)){
- if(OLD_IMASEL) {
- lrectwrite(sx, sy, ex-1, ey-1, ima->pict->rect);
- } else
- rectwrite_imasel(simasel->fesx, simasel->fesy,
- curarea->winrct.xmax, curarea->winrct.ymax - 64, //simasel->feey*1.5,
- sx, sy, ima->pict->x, ima->pict->y, 1.0, 1.0, ima->pict->rect);
- }
+ glDisable(GL_BLEND);
+ }
+ }
+ else {
+ if ( (file->flags & IMAGEFILE) || (file->flags & MOVIEFILE))
+ {
+ if (do_load) {
+ BIF_filelist_loadimage(simasel->files, i);
+ } else {
+ todo++;
}
-
- ima = ima->next;
+ imb = BIF_filelist_getimage(simasel->files, i);
+ } else {
+ imb = BIF_filelist_getimage(simasel->files, i);
}
-
- if ((simasel->mode & 8) == 8) { /* if magnify */
-
- if (bitset(simasel->fase, IMS_KNOW_IMA) && (simasel->hilite_ima)) {
-
- ima = simasel->hilite_ima;
- glPixelZoom(2.0, 2.0);
-
- sx = ima->sx + (ima->ex - ima->sx)/2 - (ima->ex - ima->sx);
- sy = ima->sy + (ima->ey - ima->sy)/2 - (ima->ey - ima->sy);
-
- ex = sx + 2*(ima->ex - ima->sx);
- ey = sy + 2*(ima->ey - ima->sy);
-
- uiEmboss(sx-1,sy-1, ex+1,ey+1, 0);
-
- if(OLD_IMASEL) {
- lrectwrite(sx, sy, sx+ (ima->ex - ima->sx)-1, sy+ (ima->ey - ima->sy)-1, ima->pict->rect);
- } else
- rectwrite_imasel(simasel->fesx, simasel->fesy,
- curarea->winrct.xmax, curarea->winrct.ymax - 64, //simasel->feey*1.5,
- sx, sy, ima->pict->x, ima->pict->y, 2.0, 2.0, ima->pict->rect);
+
+ if (imb) {
+ float fx = ((float)simasel->prv_w - (float)imb->x)/2.0f;
+ float fy = ((float)simasel->prv_h - (float)imb->y)/2.0f;
+ short dx = (short)(fx + 0.5f);
+ short dy = (short)(fy + 0.5f);
- glPixelZoom(1.0, 1.0);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ // glaDrawPixelsSafe((float)sx+8 + dx, (float)sy - imgwidth + dy - 8, imb->x, imb->y, imb->x, GL_RGBA, GL_UNSIGNED_BYTE, imb->rect);
+ glColor4f(1.0, 1.0, 1.0, 1.0);
+ glaDrawPixelsTex((float)sx+2*TILE_BORDER_X + dx, (float)sy - simasel->prv_h + dy - 2*TILE_BORDER_Y, imb->x, imb->y,GL_UNSIGNED_BYTE, imb->rect);
+ // glDisable(GL_BLEND);
+ imb = 0;
+ }
+ }
+
+ if (type == FILE_MAIN) {
+ glColor3f(1.0f, 1.0f, 1.0f);
+ }
+ else {
+ if (S_ISDIR(file->type)) {
+ glColor3f(1.0f, 1.0f, 0.9f);
+ }
+ else if (file->flags & IMAGEFILE) {
+ BIF_ThemeColor(TH_SEQ_IMAGE);
+ }
+ else if (file->flags & MOVIEFILE) {
+ BIF_ThemeColor(TH_SEQ_MOVIE);
+ }
+ else if (file->flags & BLENDERFILE) {
+ BIF_ThemeColor(TH_SEQ_SCENE);
+ }
+ else {
+ if (simasel->active_file == i) {
+ BIF_ThemeColor(TH_GRID); /* grid used for active text */
+ } else if (file->flags & ACTIVE) {
+ BIF_ThemeColor(TH_TEXT_HI);
+ } else {
+ BIF_ThemeColor(TH_TEXT);
}
}
- areaview(); /* reset viewgate */
}
-
-
- /* INFO */
- if (simasel->infsx > 0){
- BIF_ThemeColorShade(TH_SHADE1, -80);
-
- glRecti(simasel->infsx, simasel->infsy, simasel->infex, simasel->infey);
- uiEmboss(simasel->infsx, simasel->infsy, simasel->infex, simasel->infey,1);
-
- if ((info)&&(strlen(infostr) > 0)){
-
- sx = curarea->winrct.xmin;
- sy = curarea->winrct.ymin;
-
- viewgate(simasel->infsx, simasel->infsy, simasel->infex, simasel->infey);
- cpack(0xAAAAAA);
- glRasterPos2i(simasel->infsx+4, simasel->infsy+6);
- BMF_DrawString(G.font, infostr);
-
- areaview(); /* reset viewgate */
-
- }
- }
-
- extrabutsize= (simasel->returnfunc)?60:0;
- if (simasel->dnw > extrabutsize+8) {
- simasel->dnw-= extrabutsize;
- uiDefBut(block, TEX, 1,"", simasel->dnsx, simasel->dnsy, simasel->dnw, simasel->dnh, simasel->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
- if (extrabutsize)
- uiDefBut(block, BUT, 5, "Load", simasel->dnsx+simasel->dnw, simasel->dnsy, extrabutsize, 21, NULL, 0.0, 0.0, 0, 0, "Load the selected image");
- }
- if (simasel->fnw > extrabutsize+8) {
- simasel->fnw-= extrabutsize;
- uiDefBut(block, TEX, 2,"", simasel->fnsx, simasel->fnsy, simasel->fnw, simasel->fnh, simasel->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
- if (extrabutsize)
- uiDefBut(block, BUT, 6, "Cancel", simasel->fnsx+simasel->fnw, simasel->fnsy, extrabutsize, 21, NULL, 0.0, 0.0, 0, 0, "Cancel image loading");
+ draw_file(simasel, sx, sy, file);
+
+ if(do_load && (PIL_check_seconds_timer() - lasttime > 0.3)) {
+ lasttime= PIL_check_seconds_timer();
+ do_load = 0;
}
}
-
- if (curarea->winx > 16) {
- char *menu= fsmenu_build_menu();
-
- uiDefBut(block, BUT, 13, "P", 8, (short)(curarea->winy-29), 20, 21, 0, 0, 0, 0, 0, "");
- uiDefButS(block, MENU, 3 , menu, 8, (short)(curarea->winy-58), 20, 21, &simasel->fileselmenuitem, 0, 0, 0, 0, "");
- MEM_freeN(menu);
- }
-
- uiDrawBlock(block);
+ if (!do_load && todo > 0) /* we broke off loading */
+ addafterqueue(sa->win, RENDERPREVIEW, 1);
}
-void select_ima_files(SpaceImaSel *simasel)
+
+/* in panel space! */
+static void imasel_imgdraw(ScrArea *sa, uiBlock *block)
{
- short set_reset;
- short mval[2], oval[2];
-
- set_reset = 1 - (simasel->hilite_ima->selected);
-
- getmouseco_areawin(mval);
- oval[0] = mval[0] + 1;
- oval[1] = 0; /* Just give it a value to stop warnings */
-
- while(get_mbut()&R_MOUSE) {
- getmouseco_areawin(mval);
- if ((oval[0] != mval[0]) || (oval[1] != mval[1])){
- simasel->mx = mval[0];
- simasel->my = mval[1];
-
- calc_hilite(simasel);
-
- if (simasel->hilite_ima){
- simasel->hilite_ima->selected = set_reset;
- scrarea_do_windraw(curarea);
- screen_swapbuffers();
+ SpaceImaSel *simasel= sa->spacedata.first;
+ rctf dispf;
+ rcti winrect;
+ struct direntry *file;
+ char path[FILE_MAX];
+ float tsize;
+ short ofsx=0;
+ short ofsy=0;
+ short ex, ey;
+ float scaledx, scaledy;
+ int index;
+
+ BLI_init_rctf(&dispf, 0.0f, (block->maxx - block->minx)-0.0f, 0.0f, (block->maxy - block->miny)-0.0f);
+ ui_graphics_to_window_rct(sa->win, &dispf, &winrect);
+
+ if (!simasel->img) {
+ BLI_join_dirfile(path, simasel->dir, simasel->file);
+ if (!BLI_exists(path))
+ return;
+
+ index = BIF_filelist_find(simasel->files, simasel->file);
+ if (index >= 0) {
+ file = BIF_filelist_file(simasel->files,index);
+ if (file->flags & IMAGEFILE || file->flags & MOVIEFILE) {
+ simasel->img = IMB_loadiffname(path, IB_rect);
+
+ if (simasel->img) {
+ tsize = MIN2(winrect.xmax - winrect.xmin,winrect.ymax - winrect.ymin);
+
+ if (simasel->img->x > simasel->img->y) {
+ scaledx = (float)tsize;
+ scaledy = ( (float)simasel->img->y/(float)simasel->img->x )*tsize;
+ ofsy = (scaledx - scaledy) / 2.0;
+ ofsx = 0;
+ }
+ else {
+ scaledy = (float)tsize;
+ scaledx = ( (float)simasel->img->x/(float)simasel->img->y )*tsize;
+ ofsx = (scaledy - scaledx) / 2.0;
+ ofsy = 0;
+ }
+ ex = (short)scaledx;
+ ey = (short)scaledy;
+
+ IMB_scaleImBuf(simasel->img, ex, ey);
+ }
}
- oval[0] = mval[0];
- oval[1] = mval[1];
}
}
+ if (simasel->img == NULL)
+ return;
+ if(simasel->img->rect==NULL)
+ return;
+
+ /* correction for gla draw */
+ BLI_translate_rcti(&winrect, -curarea->winrct.xmin, -curarea->winrct.ymin);
+
+ glaDefine2DArea(&sa->winrct);
+ glaDrawPixelsSafe(winrect.xmin+ofsx, winrect.ymin+ofsy, simasel->img->x, simasel->img->y, simasel->img->x, GL_RGBA, GL_UNSIGNED_BYTE, simasel->img->rect);
}
-void move_imadir_sli(SpaceImaSel *simasel)
+static void imasel_panel_image(ScrArea *sa, short cntrl)
{
-
- short mval[2], lval[2], fh;
- float rh;
-
- getmouseco_areawin(mval);
-
- if ((mval[0] > simasel->dirsli_sx) &&
- (mval[0] < simasel->dirsli_ex) &&
- (mval[1] > simasel->dirsli_ey - simasel->dirsli_h) &&
- (mval[1] < simasel->dirsli_ey) ){
-
- /* extactly in the slider */
- fh = simasel->dirsli_ey - mval[1];
- lval[1]=1;
- while(get_mbut()&L_MOUSE) {
- getmouseco_areawin(mval);
- if (mval[1] != lval[1]){
-
- rh = (float)(simasel->dsey - mval[1] - fh - simasel->dssy) / (simasel->dsdh - simasel->dirsli_h);
-
- simasel->topdir = 1 + rh * (simasel->totaldirs - simasel->dirsli_lines);
-
- scrarea_do_windraw(curarea);
- uiEmboss(simasel->dirsli_sx, simasel->dirsli_ey - simasel->dirsli_h,
- simasel->dirsli_ex, simasel->dirsli_ey,1);
- screen_swapbuffers();
- lval[1] = mval[1];
- }
- }
- }else{
- if (mval[1] < simasel->dirsli_ey - simasel->dirsli_h)
- simasel->topdir += (simasel->dirsli_lines - 1);
- else
- simasel->topdir -= (simasel->dirsli_lines - 1);
-
- while(get_mbut()&L_MOUSE) { }
+ uiBlock *block;
+ SpaceImaSel *simasel= sa->spacedata.first;
+ short w = 300;
+ short h = 300;
+ short offsx, offsy;
+
+ if (simasel->img) {
+ w = simasel->img->x;
+ h = simasel->img->y;
}
+
+ offsx = -150 + (simasel->v2d.mask.xmax - simasel->v2d.mask.xmin)/2;
+ offsy = -150 + (simasel->v2d.mask.ymax - simasel->v2d.mask.ymin)/2;
+
+ block= uiNewBlock(&curarea->uiblocks, "imasel_panel_image", UI_EMBOSS, UI_HELV, curarea->win);
+ uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
+ uiSetPanelHandler(IMASEL_HANDLER_IMAGE); // for close and esc
+ if(uiNewPanel(curarea, block, "Image Preview", "Image Browser", offsx, offsy, w, h)==0)
+ return;
+ uiBlockSetDrawExtraFunc(block, imasel_imgdraw);
}
-void move_imafile_sli(SpaceImaSel *simasel)
+static void imasel_blockhandlers(ScrArea *sa)
{
- short mval[2], cmy, omy = 0;
- short ssl, sdh, ssv;
-
- getmouseco_areawin(mval);
- cmy = mval[1];
-
- if ((mval[0] > simasel->imasli_sx) &&
- (mval[0] < simasel->imasli_ex) &&
- (mval[1] > simasel->imasli_ey - simasel->imasli_h) &&
- (mval[1] < simasel->imasli_ey) ){
+ SpaceImaSel *simasel= sa->spacedata.first;
+ short a;
- ssv = simasel->fsey - simasel->imasli_ey - 2;
+ for(a=0; a<SPACE_MAXHANDLER; a+=2) {
+ switch(simasel->blockhandler[a]) {
+
+ case IMASEL_HANDLER_IMAGE:
+ imasel_panel_image(sa, simasel->blockhandler[a+1]);
+ break;
- while(get_mbut() & L_MOUSE) {
- getmouseco_areawin(mval);
- if (mval[1] != omy){
- sdh = simasel->fsdh - simasel->imasli_h;
- ssl = cmy - mval[1] + ssv;
-
- if (ssl < 0) { ssl = 0; }
- if (ssl > sdh) { ssl = sdh; }
-
- simasel->image_slider = ssl / (float)sdh;
-
- scrarea_do_windraw(curarea);
- uiEmboss(simasel->imasli_sx, simasel->imasli_ey - simasel->imasli_h,
- simasel->imasli_ex, simasel->imasli_ey, 1);
-
- screen_swapbuffers();
- omy = mval[1];
- }
}
- }else{
- while(get_mbut() & L_MOUSE) { }
+ /* clear action value for event */
+ simasel->blockhandler[a+1]= 0;
}
+ uiDrawBlocksPanels(sa, 0);
}
-void ima_select_all(SpaceImaSel *simasel)
+
+static void draw_imasel_buttons(ScrArea *sa, SpaceImaSel* simasel)
{
- OneSelectableIma *ima;
- int reselect = 0;
-
- ima = simasel->first_sel_ima;
- if (!ima) return;
-
- while(ima){
- if (ima->selected == 1) reselect = 1;
- ima = ima->next;
- }
- ima = simasel->first_sel_ima;
- if (reselect == 1){
- while(ima){
- ima->selected = 0;
- ima = ima->next;
- }
- }else{
- while(ima){
- ima->selected = 1;
- ima = ima->next;
+ uiBlock *block;
+ int loadbutton;
+ char name[20];
+ char *menu;
+ float slen;
+ float parentbut_width = 20;
+ float bookmarkbut_width = 0.0f;
+ int filebuty1, filebuty2;
+
+ float xmin = simasel->v2d.mask.xmin + 10;
+ float xmax = simasel->v2d.mask.xmax - 10;
+
+ filebuty1= simasel->v2d.mask.ymax - IMASEL_BUTTONS_HEIGHT;
+ filebuty2= filebuty1+IMASEL_BUTTONS_HEIGHT/2 -6;
+
+ /* HEADER */
+ sprintf(name, "win %d", sa->win);
+ block = uiNewBlock(&sa->uiblocks, name, UI_EMBOSS, UI_HELV, sa->win);
+
+ uiSetButLock( BIF_filelist_gettype(simasel->files)==FILE_MAIN && simasel->returnfunc, NULL);
+
+ /* space available for load/save buttons? */
+ slen = BIF_GetStringWidth(G.font, simasel->title, simasel->aspect);
+ loadbutton= slen > 60 ? slen + 20 : 80; /* MAX2(80, 20+BIF_GetStringWidth(G.font, simasel->title)); */
+ if(simasel->v2d.mask.xmax-simasel->v2d.mask.xmin > loadbutton+20) {
+ if(simasel->title[0]==0) {
+ loadbutton= 0;
}
}
-}
+ else {
+ loadbutton= 0;
+ }
-void pibplay(SpaceImaSel *simasel)
-{
- OneSelectableIma *ima;
- int sx= 8, sy= 8;
-
- ima = simasel->first_sel_ima;
- if (!ima) return ;
-
- sx = curarea->winrct.xmin + 8;
- sy = curarea->winrct.ymin + 8;
-
- while(!(get_mbut()&L_MOUSE)){
- scrarea_do_windraw(curarea);
-
- lrectwrite(sx, sy, sx+ima->dw-1, sy+ima->dh-1, ima->pict->rect);
-
- ima = ima->next;
- if (!ima) ima = simasel->first_sel_ima;
- screen_swapbuffers();
+ menu= fsmenu_build_menu();
+
+ if (menu[0]) {
+ bookmarkbut_width = parentbut_width;
+ }
+
+ uiDefBut(block, TEX, B_FS_FILENAME,"", xmin+parentbut_width+bookmarkbut_width+2, filebuty1, xmax-xmin-loadbutton-parentbut_width-bookmarkbut_width, 21, simasel->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+ uiDefBut(block, TEX, B_FS_DIRNAME,"", xmin+parentbut_width, filebuty2, xmax-xmin-loadbutton-parentbut_width, 21, simasel->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+
+ if(loadbutton) {
+ uiSetCurFont(block, UI_HELV);
+ uiDefBut(block, BUT,B_FS_LOAD, simasel->title, xmax-loadbutton, filebuty2, loadbutton, 21, simasel->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+ uiDefBut(block, BUT,B_FS_CANCEL, "Cancel", xmax-loadbutton, filebuty1, loadbutton, 21, simasel->file, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
+ }
+
+ if(menu[0]) { // happens when no .Bfs is there, and first time browse
+ uiDefButS(block, MENU,B_FS_DIR_MENU, menu, xmin, filebuty1, parentbut_width, 21, &simasel->menu, 0, 0, 0, 0, "");
+ uiDefBut(block, BUT, B_FS_BOOKMARK, "B", xmin+22, filebuty1, bookmarkbut_width, 21, 0, 0, 0, 0, 0, "Bookmark current directory");
}
+ MEM_freeN(menu);
+
+ uiDefBut(block, BUT, B_FS_PARDIR, "P", xmin, filebuty2, parentbut_width, 21, 0, 0, 0, 0, 0, "Move to the parent directory (PKEY)");
+
+ uiDrawBlock(block);
}
@@ -860,65 +664,71 @@ void pibplay(SpaceImaSel *simasel)
void drawimaselspace(ScrArea *sa, void *spacedata)
{
- SpaceImaSel *simasel;
- simasel= curarea->spacedata.first;
+ float col[3];
+ SpaceImaSel *simasel= curarea->spacedata.first;
- /* ortho: xmin xmax, ymin, ymax! */
- myortho2(-0.375, (float)(curarea->winx)-0.375, -0.375, (float)(curarea->winy)-0.375);
+ BIF_GetThemeColor3fv(TH_BACK, col);
+ glClearColor(col[0], col[1], col[2], 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
- if (simasel->fase == 0){
- BLI_cleanup_dir(G.sce, simasel->dir);
- clear_ima_dir(simasel);
- }
+ /* HACK: somehow when going fullscreen, v2d isn't set correctly */
+ simasel->v2d.cur.xmin= simasel->v2d.cur.ymin= 0.0f;
+ simasel->v2d.cur.xmax= sa->winx;
+ simasel->v2d.cur.ymax= sa->winy;
+ simasel->v2d.tot= simasel->v2d.cur;
+ test_view2d(G.v2d, sa->winx, sa->winy);
+
+ calc_imasel_rcts(simasel, sa->winx, sa->winy);
- if (!bitset(simasel->fase, IMS_KNOW_DIR)){
- if(simasel->firstdir) free_ima_dir(simasel->firstdir);
- if(simasel->firstfile) free_ima_dir(simasel->firstfile);
- simasel->firstdir = 0;
- simasel->firstfile = 0;
+ myortho2(simasel->v2d.cur.xmin, simasel->v2d.cur.xmax, simasel->v2d.cur.ymin, simasel->v2d.cur.ymax);
+ bwin_clear_viewmat(sa->win); /* clear buttons view */
+ glLoadIdentity();
- if (get_ima_dir(simasel->dir, IMS_DIR, &simasel->totaldirs, &simasel->firstdir) < 0){
- /* error */
- strcpy(simasel->dir, simasel->dor);
- get_ima_dir(simasel->dir, IMS_DIR, &simasel->totaldirs, &simasel->firstdir);
- }
-
- if (get_ima_dir(simasel->dir, IMS_FILE, &simasel->totalfiles, &simasel->firstfile) < 0){
- /* error */
- strcpy(simasel->file, simasel->fole);
- get_ima_dir(simasel->dir, IMS_FILE, &simasel->totalfiles, &simasel->firstfile);
- }
-
- simasel->topdir = 0;
- simasel->topfile = 0;
- simasel->fase |= IMS_KNOW_DIR;
-
- check_for_pib(simasel);
-
- strcpy(simasel->fole, simasel->file);
- strcpy(simasel->dor, simasel->dir);
- }
-
- if (!bitset(simasel->fase, IMS_FOUND_BIP)){
- /* Make the first Bip file ever in this directory */
- if ( !bitset(simasel->fase, IMS_KNOW_INF)){
- if (!bitset(simasel->fase, IMS_DOTHE_INF)){
- if(simasel->first_sel_ima) free_sel_ima(simasel->first_sel_ima);
- simasel->first_sel_ima = 0;
- simasel->fase |= IMS_DOTHE_INF;
- addafterqueue(curarea->win, AFTERIMASELIMA, 1);
- }
- }
- }else{
- if (!bitset(simasel->fase, IMS_KNOW_BIP)){
- addafterqueue(curarea->win, AFTERPIBREAD, 1);
- }
+ /* warning; blocks need to be freed each time, handlers dont remove */
+ uiFreeBlocksWin(&sa->uiblocks, sa->win);
+
+ /* aspect+font, set each time */
+ simasel->aspect= (simasel->v2d.cur.xmax - simasel->v2d.cur.xmin)/((float)sa->winx);
+ simasel->curfont= uiSetCurFont_ext(simasel->aspect);
+
+ if (!simasel->files) {
+ simasel->files = BIF_filelist_new();
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+ BIF_filelist_settype(simasel->files, simasel->type);
}
+
+ /* Buttons */
+ draw_imasel_buttons(sa, simasel);
+
+ /* scrollbar */
+ draw_imasel_scroll(simasel);
+
+ /* bookmarks */
+ draw_imasel_bookmarks(sa, simasel);
+
+ uiEmboss(simasel->viewrect.xmin, simasel->viewrect.ymin, simasel->v2d.mask.xmax-TILE_BORDER_X, simasel->viewrect.ymax, 1);
+
+
+ glScissor(sa->winrct.xmin + simasel->viewrect.xmin ,
+ sa->winrct.ymin + simasel->viewrect.ymin,
+ simasel->viewrect.xmax - simasel->viewrect.xmin ,
+ simasel->viewrect.ymax - simasel->viewrect.ymin);
+
+ /* previews */
+ draw_imasel_previews(sa, simasel);
- make_sima_area(simasel);
- calc_hilite(simasel);
- draw_sima_area(simasel);
+ /* BIF_ThemeColor(TH_HEADER);*/
+ /* glRecti(simasel->viewrect.xmin, simasel->viewrect.ymin, simasel->viewrect.xmax, simasel->viewrect.ymax);*/
+ /* restore viewport (not needed yet) */
+ mywinset(sa->win);
+
+ /* ortho at pixel level curarea */
+ myortho2(-0.375, curarea->winx-0.375, -0.375, curarea->winy-0.375);
+
+ draw_area_emboss(sa);
+
+ imasel_blockhandlers(sa);
+
curarea->win_swap= WIN_BACK_OK;
}
-
diff --git a/source/blender/src/drawipo.c b/source/blender/src/drawipo.c
index e2acee267c1..9b64d350b9f 100644
--- a/source/blender/src/drawipo.c
+++ b/source/blender/src/drawipo.c
@@ -42,9 +42,8 @@
#include <unistd.h>
#else
#include <io.h>
-#endif
+#endif
-#include "BMF_Api.h"
#include "MEM_guardedalloc.h"
#include "BLI_blenlib.h"
@@ -80,6 +79,7 @@
#include "BIF_glutil.h"
#include "BIF_editseq.h"
#include "BIF_editaction.h"
+#include "BIF_language.h"
#include "BSE_drawipo.h"
#include "BSE_view.h"
@@ -93,6 +93,7 @@
#include "mydevice.h"
#include "blendef.h"
#include "butspace.h" // shouldnt be...
+#include "interface.h" /* for ui_rasterpos_safe */
#include "winlay.h"
/* local define... also used in editipo ... */
@@ -133,8 +134,8 @@ static void scroll_prstr(float x, float y, float val, char dir, int disptype)
str[len+1]= 0;
}
- glRasterPos2f(x, y);
- BMF_DrawString(G.fonts, str);
+ ui_rasterpos_safe(x, y, 1.0);
+ BIF_DrawString(G.fonts, str, 0);
}
static void step_to_grid(float *step, int *macht)
@@ -209,7 +210,7 @@ void calc_ipogrid()
SpaceTime *stime= curarea->spacedata.first;
if(!(stime->flag & TIME_DRAWFRAMES)) {
secondgrid= 1;
- secondiv= 0.01 * (float)G.scene->r.frs_sec;
+ secondiv= 0.01 * FPS;
}
break;
}
@@ -217,8 +218,25 @@ void calc_ipogrid()
SpaceSeq * sseq = curarea->spacedata.first;
if (!(sseq->flag & SEQ_DRAWFRAMES)) {
secondgrid = 1;
- secondiv = 0.01 * (float)G.scene->r.frs_sec;
+ secondiv = 0.01 * FPS;
+ }
+ break;
+ }
+ case SPACE_ACTION: {
+ SpaceAction *saction = curarea->spacedata.first;
+ if (saction->flag & SACTION_DRAWTIME) {
+ secondgrid = 1;
+ secondiv = 0.01 * FPS;
+ }
+ break;
+ }
+ case SPACE_NLA: {
+ SpaceNla *snla = curarea->spacedata.first;
+ if (snla->flag & SNLA_DRAWTIME) {
+ secondgrid = 1;
+ secondiv = 0.01 * FPS;
}
+ break;
}
default:
break;
@@ -231,7 +249,7 @@ void calc_ipogrid()
step_to_grid(&ipogrid_dx, &ipomachtx);
ipogrid_dx*= secondiv;
- if ELEM3(curarea->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_TIME) {
+ if ELEM5(curarea->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_TIME, SPACE_ACTION, SPACE_NLA) {
if(ipogrid_dx < 0.1) ipogrid_dx= 0.1;
ipomachtx-= 2;
if(ipomachtx<-2) ipomachtx= -2;
@@ -242,7 +260,7 @@ void calc_ipogrid()
ipogrid_dy= IPOSTEP*space/pixels;
step_to_grid(&ipogrid_dy, &ipomachty);
- if ELEM3(curarea->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_TIME) {
+ if ELEM5(curarea->spacetype, SPACE_SEQ, SPACE_SOUND, SPACE_TIME, SPACE_ACTION, SPACE_NLA) {
if(ipogrid_dy < 1.0) ipogrid_dy= 1.0;
if(ipomachty<1) ipomachty= 1;
}
@@ -512,6 +530,7 @@ void test_view2d(View2D *v2d, int winx, int winy)
/* correct winx for scroll */
if(v2d->scroll & L_SCROLL) winx-= SCROLLB;
if(v2d->scroll & B_SCROLL) winy-= SCROLLH;
+ if(v2d->scroll & B_SCROLLO) winy-= SCROLLH; /* B_SCROLL and B_SCROLLO are basically same thing */
/* header completely closed window */
if(winy<=0) return;
@@ -603,17 +622,23 @@ void test_view2d(View2D *v2d, int winx, int winy)
else if( dy > 1.0) do_x= 0; else do_x= 1;
}
- v2d->oldwinx= winx;
- v2d->oldwiny= winy;
-
if( do_x ) {
-
- /* portrait window: correct for x */
- dx= cur->ymax-cur->ymin;
- temp= (cur->xmax+cur->xmin);
-
- cur->xmin= temp/2.0 - 0.5*dx/dy;
- cur->xmax= temp/2.0 + 0.5*dx/dy;
+ if (v2d->keeptot == 2 && winx < v2d->oldwinx) {
+ /* This is a special hack for the outliner, to ensure that the
+ * outliner contents will not eventually get pushed out of view
+ * when shrinking the view.
+ */
+ cur->xmax -= cur->xmin;
+ cur->xmin= 0.0f;
+ }
+ else {
+ /* portrait window: correct for x */
+ dx= cur->ymax-cur->ymin;
+ temp= (cur->xmax+cur->xmin);
+
+ cur->xmin= temp/2.0 - 0.5*dx/dy;
+ cur->xmax= temp/2.0 + 0.5*dx/dy;
+ }
}
else {
dx= cur->xmax-cur->xmin;
@@ -622,6 +647,9 @@ void test_view2d(View2D *v2d, int winx, int winy)
cur->ymin= temp/2.0 - 0.5*dy*dx;
cur->ymax= temp/2.0 + 0.5*dy*dx;
}
+
+ v2d->oldwinx= winx;
+ v2d->oldwiny= winy;
}
if(v2d->keeptot) {
@@ -652,7 +680,8 @@ void test_view2d(View2D *v2d, int winx, int winy)
cur->xmin+= dx;
cur->xmax+= dx;
}
- else if(cur->xmax > tot->xmax) {
+ else if((v2d->keeptot!=2) && (cur->xmax > tot->xmax)) {
+ /* keeptot==2 is a special case for the outliner. see space.c, init_v2d_oops for details */
dx= cur->xmax-tot->xmax;
cur->xmin-= dx;
cur->xmax-= dx;
@@ -699,6 +728,7 @@ static int calc_ipobuttonswidth(ScrArea *sa)
EditIpo *ei;
int ipowidth = IPOBUTX;
int a;
+ float textwidth = 0;
/* default width when no space ipo or no channels */
if (sipo == NULL) return IPOBUTX;
@@ -707,8 +737,9 @@ static int calc_ipobuttonswidth(ScrArea *sa)
ei= sipo->editipo;
for(a=0; a<sipo->totipo; a++, ei++) {
- if (BMF_GetStringWidth(G.font, ei->name) + 18 > ipowidth)
- ipowidth = BMF_GetStringWidth(G.font, ei->name) + 18;
+ textwidth = BIF_GetStringWidth(G.font, ei->name, 0);
+ if (textwidth + 18 > ipowidth)
+ ipowidth = textwidth + 18;
}
return ipowidth;
@@ -753,7 +784,7 @@ void calc_scrollrcts(ScrArea *sa, View2D *v2d, int winx, int winy)
v2d->mask.xmax= v2d->vert.xmin;
}
- if(v2d->scroll & B_SCROLL) {
+ if((v2d->scroll & B_SCROLL) || (v2d->scroll & B_SCROLLO)) {
v2d->hor= v2d->mask;
v2d->hor.ymax= SCROLLH;
v2d->mask.ymin= SCROLLH;
@@ -832,7 +863,7 @@ void draw_view2d_numbers_horiz(int drawframes)
scroll_prstr(fac, 2.0+(float)(G.v2d->mask.ymin), val, 'h', 0);
}
else {
- fac2= val/(float)G.scene->r.frs_sec;
+ fac2= val/FPS;
scroll_prstr(fac, 2.0+(float)(G.v2d->mask.ymin), fac2, 'h', 0);
}
@@ -856,7 +887,7 @@ void drawscroll(int disptype)
light= 20;
lighter= 50;
- if(G.v2d->scroll & HOR_SCROLL) {
+ if((G.v2d->scroll & HOR_SCROLL) || (G.v2d->scroll & HOR_SCROLLO)) {
BIF_ThemeColorShade(TH_SHADE1, light);
glRecti(hor.xmin, hor.ymin, hor.xmax, hor.ymax);
@@ -890,17 +921,23 @@ void drawscroll(int disptype)
val= ipogrid_startx;
while(fac < hor.xmax) {
- if(curarea->spacetype==SPACE_OOPS);
+ if(curarea->spacetype==SPACE_OOPS) {
+ /* Under no circumstances may the outliner/oops display numbers on its scrollbar
+ * Unfortunately, versions of Blender without this patch will hang on loading files with
+ * horizontally scrollable Outliners.
+ */
+ break;
+ }
else if(curarea->spacetype==SPACE_SEQ) {
SpaceSeq * sseq = curarea->spacedata.first;
if (sseq->flag & SEQ_DRAWFRAMES) {
ipomachtx = 1;
scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype);
} else {
- fac2= val/(float)G.scene->r.frs_sec;
+ fac2= val/FPS;
tim= floor(fac2);
fac2= fac2-tim;
- scroll_prstr(fac, 3.0+(float)(hor.ymin), tim+G.scene->r.frs_sec*fac2/100.0, 'h', disptype);
+ scroll_prstr(fac, 3.0+(float)(hor.ymin), tim+FPS*fac2/100.0, 'h', disptype);
}
}
else if (curarea->spacetype==SPACE_SOUND) {
@@ -911,7 +948,7 @@ void drawscroll(int disptype)
scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype);
}
else {
- fac2= val/(float)G.scene->r.frs_sec;
+ fac2= val/FPS;
scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype);
}
}
@@ -923,7 +960,7 @@ void drawscroll(int disptype)
scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype);
}
else {
- fac2= val/(float)G.scene->r.frs_sec;
+ fac2= val/FPS;
scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype);
}
}
@@ -942,6 +979,30 @@ void drawscroll(int disptype)
else
scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype);
}
+ else if (curarea->spacetype==SPACE_ACTION) {
+ SpaceAction *saction= curarea->spacedata.first;
+
+ if (saction->flag & SACTION_DRAWTIME) {
+ fac2= val/FPS;
+ scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype);
+ }
+ else {
+ ipomachtx= 1;
+ scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype);
+ }
+ }
+ else if (curarea->spacetype==SPACE_NLA) {
+ SpaceNla *snla= curarea->spacedata.first;
+
+ if (snla->flag & SNLA_DRAWTIME) {
+ fac2= val/FPS;
+ scroll_prstr(fac, 3.0+(float)(hor.ymin), fac2, 'h', disptype);
+ }
+ else {
+ ipomachtx= 1;
+ scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype);
+ }
+ }
else {
scroll_prstr(fac, 3.0+(float)(hor.ymin), val, 'h', disptype);
}
@@ -1623,7 +1684,7 @@ static void boundbox_ipo_curves(SpaceIpo *si)
if(ei->icu) {
if(ei->flag & IPO_VISIBLE) {
- boundbox_ipocurve(ei->icu);
+ boundbox_ipocurve(ei->icu, 0);
if(first) {
si->v2d.tot= ei->icu->totrct;
first= 0;
@@ -1953,7 +2014,7 @@ static char *ipodriver_modeselect_pup(Object *ob)
return (string);
}
-static char *ipodriver_channelselect_pup(void)
+static char *ipodriver_channelselect_pup(int is_armature)
{
static char string[1024];
char *tmp;
@@ -1970,6 +2031,8 @@ static char *ipodriver_channelselect_pup(void)
tmp+= sprintf(tmp, "|Scale X %%x%d", OB_SIZE_X);
tmp+= sprintf(tmp, "|Scale Y %%x%d", OB_SIZE_Y);
tmp+= sprintf(tmp, "|Scale Z %%x%d", OB_SIZE_Z);
+ if(is_armature)
+ tmp+= sprintf(tmp, "|Rotation Differance %%x%d", OB_ROT_DIFF);
return (string);
}
@@ -2020,6 +2083,10 @@ static void ipo_panel_properties(short cntrl) // IPO_HANDLER_PROPERTIES
if(driver->ob->type==OB_ARMATURE && driver->blocktype==ID_AR) {
icon = ICON_POSE_DEHLT;
uiDefBut(block, TEX, B_IPO_REDR, "BO:", 10,220,150,20, driver->name, 0, 31, 0, 0, "Bone name");
+
+ if(driver->adrcode==OB_ROT_DIFF)
+ uiDefBut(block, TEX, B_IPO_REDR, "BO:", 10,200,150,20, driver->name+DRIVER_NAME_OFFS, 0, 31, 0, 0, "Bone name for angular reference");
+
}
else driver->blocktype= ID_OB; /* safety when switching object button */
@@ -2028,7 +2095,8 @@ static void ipo_panel_properties(short cntrl) // IPO_HANDLER_PROPERTIES
ipodriver_modeselect_pup(driver->ob), 165,240,145,20, &(driver->blocktype), 0, 0, 0, 0, "Driver type");
uiDefButS(block, MENU, B_IPO_REDR,
- ipodriver_channelselect_pup(), 165,220,145,20, &(driver->adrcode), 0, 0, 0, 0, "Driver channel");
+ ipodriver_channelselect_pup(driver->ob->type==OB_ARMATURE && driver->blocktype==ID_AR),
+ 165,220,145,20, &(driver->adrcode), 0, 0, 0, 0, "Driver channel");
}
uiBlockEndAlign(block);
}
@@ -2045,7 +2113,7 @@ static void ipo_panel_properties(short cntrl) // IPO_HANDLER_PROPERTIES
/* note ranges for buttons below are idiot... we need 2 ranges, one for sliding scale, one for real clip */
if(G.sipo->ipo && G.sipo->ipo->curve.first && totipo_curve) {
extern int totipo_vertsel; // editipo.c
- uiDefBut(block, LABEL, 0, "Visible curves", 10, 200, 150, 19, NULL, 1.0, 0.0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, "Visible curves", 160, 200, 150, 19, NULL, 1.0, 0.0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_MUL_IPO, "Xmin:", 10, 180, 150, 19, &G.sipo->tot.xmin, G.sipo->tot.xmin-1000.0, MAXFRAMEF, 100, 0, "");
@@ -2158,9 +2226,8 @@ void drawipospace(ScrArea *sa, void *spacedata)
}
/* map ipo-points for drawing if scaled ipo */
- if (OBACT && OBACT->action && sipo->pin==0 && sipo->actname) {
+ if (NLA_IPO_SCALED)
actstrip_map_ipo_keys(OBACT, sipo->ipo, 0, 0);
- }
/* draw deselect */
draw_ipocurves(0);
@@ -2173,15 +2240,14 @@ void drawipospace(ScrArea *sa, void *spacedata)
draw_ipovertices(1);
/* undo mapping of ipo-points for drawing if scaled ipo */
- if (OBACT && OBACT->action && sipo->pin==0 && sipo->actname) {
+ if (NLA_IPO_SCALED)
actstrip_map_ipo_keys(OBACT, sipo->ipo, 1, 0);
- }
/* Draw 'curtains' for preview */
draw_anim_preview_timespace();
/* draw markers */
- draw_markers_timespace();
+ draw_markers_timespace(0);
/* restore viewport */
mywinset(sa->win);
@@ -2493,13 +2559,7 @@ int view2dmove(unsigned short event)
}
cursor = BC_NSEW_SCROLLCURSOR;
-
- /* no x move in outliner */
- if(curarea->spacetype==SPACE_OOPS && G.v2d->scroll) {
- facx= 0.0;
- cursor = BC_NS_SCROLLCURSOR;
- }
-
+
/* no y move in audio & time */
if ELEM(curarea->spacetype, SPACE_SOUND, SPACE_TIME) {
facy= 0.0;
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c
index 6307307345b..ba20771b179 100644
--- a/source/blender/src/drawmesh.c
+++ b/source/blender/src/drawmesh.c
@@ -38,6 +38,7 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
#include "BLI_edgehash.h"
+#include "BLI_editVert.h"
#include "IMB_imbuf.h"
#include "IMB_imbuf_types.h"
@@ -66,7 +67,7 @@
#include "BKE_property.h"
#include "BKE_utildefines.h"
-#include "BIF_resources.h"
+#include "BIF_editmesh.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "BIF_mywindow.h"
@@ -221,7 +222,7 @@ int set_tpage(MTFace *tface)
glDisable(GL_TEXTURE_2D);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
-
+ glDisable ( GL_ALPHA_TEST );
return 0;
}
lasttface= tface;
@@ -238,14 +239,22 @@ int set_tpage(MTFace *tface)
}
else if(alphamode==TF_ALPHA) {
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ /* added after 2.45 to clip alpha */
+ glEnable ( GL_ALPHA_TEST );
+ glAlphaFunc ( GL_GREATER, U.glalphaclip );
+
+
/* glBlendEquationEXT(GL_FUNC_ADD_EXT); */
}
/* else { */
/* glBlendFunc(GL_ONE, GL_ONE); */
/* glBlendEquationEXT(GL_FUNC_REVERSE_SUBTRACT_EXT); */
/* } */
+ } else {
+ glDisable(GL_BLEND);
+ glDisable ( GL_ALPHA_TEST );
}
- else glDisable(GL_BLEND);
}
ima= tface->tpage;
@@ -596,10 +605,6 @@ void update_realtime_textures()
enum {
eEdge_Visible = (1<<0),
eEdge_Select = (1<<1),
- eEdge_Active = (1<<2),
- eEdge_SelectAndActive = (1<<3),
- eEdge_ActiveFirst = (1<<4),
- eEdge_ActiveLast = (1<<5)
};
/* Creates a hash of edges to flags indicating
@@ -621,19 +626,18 @@ EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
{
EdgeHash *eh = BLI_edgehash_new();
int i;
-
+ MFace *mf;
+ MTFace *tf = NULL;
+
for (i=0; i<me->totface; i++) {
- MFace *mf = &me->mface[i];
- MTFace *tf = &me->mtface[i];
+ mf = &me->mface[i];
+ if (me->mtface)
+ tf = &me->mtface[i];
if (mf->v3) {
if (!(mf->flag&ME_HIDE)) {
unsigned int flags = eEdge_Visible;
if (mf->flag&ME_FACE_SEL) flags |= eEdge_Select;
- if (tf->flag&TF_ACTIVE) {
- flags |= eEdge_Active;
- if (mf->flag&ME_FACE_SEL) flags |= eEdge_SelectAndActive;
- }
get_marked_edge_info__orFlags(eh, mf->v1, mf->v2, flags);
get_marked_edge_info__orFlags(eh, mf->v2, mf->v3, flags);
@@ -643,11 +647,6 @@ EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
} else {
get_marked_edge_info__orFlags(eh, mf->v3, mf->v1, flags);
}
-
- if (tf->flag&TF_ACTIVE) {
- get_marked_edge_info__orFlags(eh, mf->v1, mf->v2, eEdge_ActiveFirst);
- get_marked_edge_info__orFlags(eh, mf->v1, mf->v4?mf->v4:mf->v3, eEdge_ActiveLast);
- }
}
}
}
@@ -704,17 +703,7 @@ static int draw_tfaces3D__setActiveOpts(void *userData, int index)
MEdge *med = &data->me->medge[index];
unsigned long flags = (long) BLI_edgehash_lookup(data->eh, med->v1, med->v2);
- if (flags & eEdge_Active) {
- if (flags & eEdge_ActiveLast) {
- glColor3ub(255, 0, 0);
- } else if (flags & eEdge_ActiveFirst) {
- glColor3ub(0, 255, 0);
- } else if (flags & eEdge_SelectAndActive) {
- glColor3ub(255, 255, 0);
- } else {
- glColor3ub(255, 0, 255);
- }
-
+ if (flags & eEdge_Select) {
return 1;
} else {
return 0;
@@ -724,13 +713,10 @@ static int draw_tfaces3D__drawFaceOpts(void *userData, int index)
{
Mesh *me = (Mesh*)userData;
- if (me->mtface) {
- MFace *mface = &me->mface[index];
- if (!(mface->flag&ME_HIDE) && (mface->flag&ME_FACE_SEL))
- return 2; /* Don't set color */
- else
- return 0;
- } else
+ MFace *mface = &me->mface[index];
+ if (!(mface->flag&ME_HIDE) && (mface->flag&ME_FACE_SEL))
+ return 2; /* Don't set color */
+ else
return 0;
}
static void draw_tfaces3D(Object *ob, Mesh *me, DerivedMesh *dm)
@@ -758,7 +744,7 @@ static void draw_tfaces3D(Object *ob, Mesh *me, DerivedMesh *dm)
glLineWidth(1);
}
- /* Draw Selected Faces */
+ /* Draw Selected Faces */
if(G.f & G_DRAWFACES) {
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -941,25 +927,80 @@ static int set_draw_settings_cached(int clearcache, int textured, MTFace *texfac
/* Icky globals, fix with userdata parameter */
-static Object *g_draw_tface_mesh_ob = NULL;
-static int g_draw_tface_mesh_islight = 0;
-static int g_draw_tface_mesh_istex = 0;
-static unsigned char g_draw_tface_mesh_obcol[4];
+struct TextureDrawState {
+ Object *ob;
+ int islit, istex;
+ unsigned char obcol[4];
+} Gtexdraw = {NULL, 0, 0, {0, 0, 0, 0}};
+
+static void draw_textured_begin(Object *ob)
+{
+ unsigned char obcol[4];
+ int istex, solidtex= 0;
+
+ if(G.vd->drawtype==OB_SOLID || (ob==G.obedit && G.vd->drawtype!=OB_TEXTURE)) {
+ /* draw with default lights in solid draw mode and edit mode */
+ solidtex= 1;
+ Gtexdraw.islit= -1;
+ }
+ else
+ /* draw with lights in the scene otherwise */
+ Gtexdraw.islit= set_gl_light(ob);
+
+ obcol[0]= CLAMPIS(ob->col[0]*255, 0, 255);
+ obcol[1]= CLAMPIS(ob->col[1]*255, 0, 255);
+ obcol[2]= CLAMPIS(ob->col[2]*255, 0, 255);
+ obcol[3]= CLAMPIS(ob->col[3]*255, 0, 255);
+
+ glCullFace(GL_BACK); glEnable(GL_CULL_FACE);
+ if(solidtex || G.vd->drawtype==OB_TEXTURE) istex= 1;
+ else istex= 0;
+
+ Gtexdraw.ob = ob;
+ Gtexdraw.istex = istex;
+ memcpy(Gtexdraw.obcol, obcol, sizeof(obcol));
+ set_draw_settings_cached(1, 0, 0, Gtexdraw.islit, 0, 0, 0);
+ glShadeModel(GL_SMOOTH);
+}
+
+static void draw_textured_end()
+{
+ /* switch off textures */
+ set_tpage(0);
+
+ glShadeModel(GL_FLAT);
+ glDisable(GL_CULL_FACE);
+
+ /* XXX, bad patch - default_gl_light() calls
+ * glLightfv(GL_LIGHT_POSITION, ...) which
+ * is transformed by the current matrix... we
+ * need to make sure that matrix is identity.
+ *
+ * It would be better if drawmesh.c kept track
+ * of and restored the light settings it changed.
+ * - zr
+ */
+ glPushMatrix();
+ glLoadIdentity();
+ default_gl_light();
+ glPopMatrix();
+}
+
static int draw_tface__set_draw(MTFace *tface, MCol *mcol, int matnr)
{
if (tface && (tface->mode&TF_INVISIBLE)) return 0;
- if (tface && set_draw_settings_cached(0, g_draw_tface_mesh_istex, tface, g_draw_tface_mesh_islight, g_draw_tface_mesh_ob, matnr, TF_TWOSIDE)) {
+ if (tface && set_draw_settings_cached(0, Gtexdraw.istex, tface, Gtexdraw.islit, Gtexdraw.ob, matnr, TF_TWOSIDE)) {
glColor3ub(0xFF, 0x00, 0xFF);
return 2; /* Don't set color */
} else if (tface && tface->mode&TF_OBCOL) {
- glColor3ubv(g_draw_tface_mesh_obcol);
+ glColor3ubv(Gtexdraw.obcol);
return 2; /* Don't set color */
} else if (!mcol) {
if (tface) glColor3f(1.0, 1.0, 1.0);
else {
- Material *ma= give_current_material(g_draw_tface_mesh_ob, matnr+1);
+ Material *ma= give_current_material(Gtexdraw.ob, matnr+1);
if(ma) glColor3f(ma->r, ma->g, ma->b);
else glColor3f(1.0, 1.0, 1.0);
}
@@ -980,213 +1021,192 @@ static int draw_tface_mapped__set_draw(void *userData, int index)
return draw_tface__set_draw(tface, mcol, matnr);
}
+static int draw_em_tf_mapped__set_draw(void *userData, int index)
+{
+ EditMesh *em = userData;
+ EditFace *efa = EM_get_face_for_index(index);
+ MTFace *tface;
+ MCol *mcol;
+ int matnr;
+
+ if (efa==NULL || efa->h)
+ return 0;
+
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ matnr = efa->mat_nr;
+
+ return draw_tface__set_draw(tface, mcol, matnr);
+}
+
static int wpaint__setSolidDrawOptions(void *userData, int index, int *drawSmooth_r)
{
Mesh *me = (Mesh*)userData;
MTFace *tface = (me->mtface)? &me->mtface[index]: NULL;
MFace *mface = (me->mface)? &me->mface[index]: NULL;
- if (tface) {
- if ((mface->flag&ME_HIDE) || (tface->mode&TF_INVISIBLE))
+ if ((mface->flag&ME_HIDE) || (tface && (tface->mode&TF_INVISIBLE)))
return 0;
- }
+
*drawSmooth_r = 1;
return 1;
}
-void draw_tface_mesh(Object *ob, Mesh *me, int dt)
-/* maximum dt (drawtype): exactly according values that have been set */
+static void draw_game_text_mesh(Object *ob, Mesh *me)
{
- unsigned char obcol[4];
- int a;
- short istex, solidtex=0;
- DerivedMesh *dm;
-
- if(me==NULL) return;
+ DerivedMesh *ddm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
+ MFace *mface= me->mface;
+ MTFace *tface= me->mtface;
+ MCol *mcol= me->mcol; /* why does mcol exist? */
+ bProperty *prop = get_property(ob, "Text");
+ int a, start= 0, totface= me->totface;
+
+ tface+= start;
+ mcol+= start*4;
+ for (a=start; a<totface; a++, tface++, mcol+=4) {
+ MFace *mf= &mface[a];
+ int mode= tface->mode;
+ int matnr= mf->mat_nr;
+ int mf_smooth= mf->flag & ME_SMOOTH;
+
+ if (!(mf->flag&ME_HIDE) && !(mode&TF_INVISIBLE) && (mode&TF_BMFONT)) {
+ int badtex= set_draw_settings_cached(0, Gtexdraw.istex, tface, Gtexdraw.islit, Gtexdraw.ob, matnr, TF_TWOSIDE);
+ float v1[3], v2[3], v3[3], v4[3];
+ char string[MAX_PROPSTRING];
+ int characters, index;
+ ImBuf *ibuf;
+ float curpos;
+
+ if (badtex)
+ continue;
+
+ ddm->getVertCo(ddm, mf->v1, v1);
+ ddm->getVertCo(ddm, mf->v2, v2);
+ ddm->getVertCo(ddm, mf->v3, v3);
+ if (mf->v4) ddm->getVertCo(ddm, mf->v4, v4);
+
+ // The BM_FONT handling code is duplicated in the gameengine
+ // Search for 'Frank van Beek' ;-)
+ // string = "Frank van Beek";
+
+ set_property_valstr(prop, string);
+ characters = strlen(string);
+
+ ibuf= BKE_image_get_ibuf(tface->tpage, NULL);
+ if (ibuf == NULL) {
+ characters = 0;
+ }
- dm = mesh_get_derived_final(ob, get_viewedit_datamask());
+ if (!mf_smooth) {
+ float nor[3];
- glShadeModel(GL_SMOOTH);
+ CalcNormFloat(v1, v2, v3, nor);
- /* option to draw solid texture with default lights */
- if(dt>OB_WIRE && G.vd->drawtype==OB_SOLID) {
- solidtex= 1;
- g_draw_tface_mesh_islight= -1;
- }
- else
- g_draw_tface_mesh_islight= set_gl_light(ob);
+ glNormal3fv(nor);
+ }
+
+ curpos= 0.0;
+ glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
+ for (index = 0; index < characters; index++) {
+ float centerx, centery, sizex, sizey, transx, transy, movex, movey, advance;
+ int character = string[index];
+ char *cp= NULL;
+
+ // lets calculate offset stuff
+ // space starts at offset 1
+ // character = character - ' ' + 1;
+
+ matrixGlyph(ibuf, character, & centerx, &centery, &sizex, &sizey, &transx, &transy, &movex, &movey, &advance);
+ movex+= curpos;
+
+ if (tface->mode & TF_OBCOL)
+ glColor3ubv(Gtexdraw.obcol);
+ else if (me->mcol) cp= (char *)mcol;
+ else glColor3ub(255, 255, 255);
+
+ glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
+ if (cp) glColor3ub(cp[3], cp[2], cp[1]);
+ glVertex3f(sizex * v1[0] + movex, sizey * v1[1] + movey, v1[2]);
+
+ glTexCoord2f((tface->uv[1][0] - centerx) * sizex + transx, (tface->uv[1][1] - centery) * sizey + transy);
+ if (cp) glColor3ub(cp[7], cp[6], cp[5]);
+ glVertex3f(sizex * v2[0] + movex, sizey * v2[1] + movey, v2[2]);
- obcol[0]= CLAMPIS(ob->col[0]*255, 0, 255);
- obcol[1]= CLAMPIS(ob->col[1]*255, 0, 255);
- obcol[2]= CLAMPIS(ob->col[2]*255, 0, 255);
- obcol[3]= CLAMPIS(ob->col[3]*255, 0, 255);
+ glTexCoord2f((tface->uv[2][0] - centerx) * sizex + transx, (tface->uv[2][1] - centery) * sizey + transy);
+ if (cp) glColor3ub(cp[11], cp[10], cp[9]);
+ glVertex3f(sizex * v3[0] + movex, sizey * v3[1] + movey, v3[2]);
- /* first all texture polys */
+ if(mf->v4) {
+ glTexCoord2f((tface->uv[3][0] - centerx) * sizex + transx, (tface->uv[3][1] - centery) * sizey + transy);
+ if (cp) glColor3ub(cp[15], cp[14], cp[13]);
+ glVertex3f(sizex * v4[0] + movex, sizey * v4[1] + movey, v4[2]);
+ }
+
+ curpos+= advance;
+ }
+ glEnd();
+ }
+ }
+
+ ddm->release(ddm);
+}
+
+void draw_mesh_textured(Object *ob, DerivedMesh *dm, int faceselect)
+{
+ Mesh *me= ob->data;
+ int editing= 0;
+ /* correct for negative scale */
if(ob->transflag & OB_NEG_SCALE) glFrontFace(GL_CW);
else glFrontFace(GL_CCW);
- glCullFace(GL_BACK); glEnable(GL_CULL_FACE);
- if(solidtex || G.vd->drawtype==OB_TEXTURE) istex= 1;
- else istex= 0;
-
- g_draw_tface_mesh_ob = ob;
- g_draw_tface_mesh_istex = istex;
- memcpy(g_draw_tface_mesh_obcol, obcol, sizeof(obcol));
- set_draw_settings_cached(1, 0, 0, g_draw_tface_mesh_islight, 0, 0, 0);
-
- if(dt > OB_SOLID || g_draw_tface_mesh_islight==-1) {
- bProperty *prop = get_property(ob, "Text");
- int editing= (G.f & (G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT+G_WEIGHTPAINT)) && (ob==((G.scene->basact) ? (G.scene->basact->object) : 0));
+ /* draw the textured mesh */
+ draw_textured_begin(ob);
#ifdef WITH_VERSE
- if(me->vnode) {
- /* verse-blender doesn't support uv mapping of textures yet */
- dm->drawFacesTex(dm, NULL);
- }
- else if(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface) {
-#else
- if(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface) {
-#endif
+ if(me->vnode) {
+ /* verse-blender doesn't support uv mapping of textures yet */
+ dm->drawFacesTex(dm, NULL);
+ }
+ else {
+#endif
+ if(ob==G.obedit) {
+ dm->drawMappedFacesTex(dm, draw_em_tf_mapped__set_draw, G.editMesh);
+ } else if(faceselect) {
if(G.f & G_WEIGHTPAINT)
- dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, (void*)me, 1);
+ dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, me, 1);
else
- dm->drawMappedFacesTex(dm, draw_tface_mapped__set_draw, (void*)me);
+ dm->drawMappedFacesTex(dm, draw_tface_mapped__set_draw, me);
}
else
dm->drawFacesTex(dm, draw_tface__set_draw);
+#ifdef WITH_VERSE
+ }
+#endif
- /* drawing game engine text hack */
- if (!editing && prop && me->mtface) {
- DerivedMesh *ddm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
- MFace *mface= me->mface;
- MTFace *tface= me->mtface;
- MCol *mcol= me->mcol; /* why does mcol exist? */
- int start= 0, totface= me->totface;
-
- tface+= start;
- mcol+= start*4;
- for (a=start; a<totface; a++, tface++, mcol+=4) {
- MFace *mf= &mface[a];
- int mode= tface->mode;
- int matnr= mf->mat_nr;
- int mf_smooth= mf->flag & ME_SMOOTH;
-
- if (!(mf->flag&ME_HIDE) && !(mode&TF_INVISIBLE) && (mode&TF_BMFONT)) {
- int badtex= set_draw_settings_cached(0, g_draw_tface_mesh_istex, tface, g_draw_tface_mesh_islight, g_draw_tface_mesh_ob, matnr, TF_TWOSIDE);
- float v1[3], v2[3], v3[3], v4[3];
- char string[MAX_PROPSTRING];
- int characters, index;
- ImBuf *ibuf;
- float curpos;
-
- if (badtex)
- continue;
-
- ddm->getVertCo(ddm, mf->v1, v1);
- ddm->getVertCo(ddm, mf->v2, v2);
- ddm->getVertCo(ddm, mf->v3, v3);
- if (mf->v4) ddm->getVertCo(ddm, mf->v4, v4);
-
- // The BM_FONT handling code is duplicated in the gameengine
- // Search for 'Frank van Beek' ;-)
- // string = "Frank van Beek";
-
- set_property_valstr(prop, string);
- characters = strlen(string);
-
- ibuf= BKE_image_get_ibuf(tface->tpage, NULL);
- if (ibuf == NULL) {
- characters = 0;
- }
-
- if (!mf_smooth) {
- float nor[3];
-
- CalcNormFloat(v1, v2, v3, nor);
-
- glNormal3fv(nor);
- }
-
- curpos= 0.0;
- glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
- for (index = 0; index < characters; index++) {
- float centerx, centery, sizex, sizey, transx, transy, movex, movey, advance;
- int character = string[index];
- char *cp= NULL;
-
- // lets calculate offset stuff
- // space starts at offset 1
- // character = character - ' ' + 1;
-
- matrixGlyph(ibuf, character, & centerx, &centery, &sizex, &sizey, &transx, &transy, &movex, &movey, &advance);
- movex+= curpos;
-
- if (tface->mode & TF_OBCOL) glColor3ubv(obcol);
- else if (mcol) cp= (char *)mcol;
- else glColor3ub(255, 255, 255);
-
- glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
- if (cp) glColor3ub(cp[3], cp[2], cp[1]);
- glVertex3f(sizex * v1[0] + movex, sizey * v1[1] + movey, v1[2]);
-
- glTexCoord2f((tface->uv[1][0] - centerx) * sizex + transx, (tface->uv[1][1] - centery) * sizey + transy);
- if (cp) glColor3ub(cp[7], cp[6], cp[5]);
- glVertex3f(sizex * v2[0] + movex, sizey * v2[1] + movey, v2[2]);
-
- glTexCoord2f((tface->uv[2][0] - centerx) * sizex + transx, (tface->uv[2][1] - centery) * sizey + transy);
- if (cp) glColor3ub(cp[11], cp[10], cp[9]);
- glVertex3f(sizex * v3[0] + movex, sizey * v3[1] + movey, v3[2]);
-
- if(mf->v4) {
- glTexCoord2f((tface->uv[3][0] - centerx) * sizex + transx, (tface->uv[3][1] - centery) * sizey + transy);
- if (cp) glColor3ub(cp[15], cp[14], cp[13]);
- glVertex3f(sizex * v4[0] + movex, sizey * v4[1] + movey, v4[2]);
- }
-
- curpos+= advance;
- }
- glEnd();
- }
- }
-
- ddm->release(ddm);
- }
+ /* draw game engine text hack - but not if we are editing the mesh */
+ if (me->mtface && get_property(ob, "Text")) {
+ if(ob==G.obedit)
+ editing= 1;
+ else if(ob==OBACT)
+ if(FACESEL_PAINT_TEST)
+ editing= 1;
- /* switch off textures */
- set_tpage(0);
+ if(!editing)
+ draw_game_text_mesh(ob, me);
}
- glShadeModel(GL_FLAT);
- glDisable(GL_CULL_FACE);
+
+ draw_textured_end();
- if(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface) {
+ /* draw edges and selected faces over textured mesh */
+ if(!G.obedit && faceselect)
draw_tfaces3D(ob, me, dm);
- }
-
- /* XXX, bad patch - default_gl_light() calls
- * glLightfv(GL_LIGHT_POSITION, ...) which
- * is transformed by the current matrix... we
- * need to make sure that matrix is identity.
- *
- * It would be better if drawmesh.c kept track
- * of and restored the light settings it changed.
- * - zr
- */
- glPushMatrix();
- glLoadIdentity();
- default_gl_light();
- glPopMatrix();
-
- glFrontFace(GL_CCW);
- if(dt > OB_SOLID && !(ob==OBACT && (G.f & G_FACESELECT) && me && me->mtface)) {
- if(ob->flag & SELECT) {
- BIF_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
- } else {
- BIF_ThemeColor(TH_WIRE);
- }
- dm->drawLooseEdges(dm);
- }
+ /* reset from negative scale correction */
+ glFrontFace(GL_CCW);
+
+ /* in editmode, the blend mode needs to be set incase it was ADD */
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
dm->release(dm);
}
@@ -1196,6 +1216,5 @@ void init_realtime_GL(void)
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
-
}
diff --git a/source/blender/src/drawnla.c b/source/blender/src/drawnla.c
index de35a0f2906..0394fcce80b 100644
--- a/source/blender/src/drawnla.c
+++ b/source/blender/src/drawnla.c
@@ -148,6 +148,15 @@ static void draw_nla_channels(void)
else
BIF_icon_draw(x+17, y-8, ICON_ACTION);
}
+
+ /* icon to indicate if ipo-channel muted */
+ if (ob->ipo) {
+ if (ob->ipo->muteipo)
+ BIF_icon_draw(NLAWIDTH-16, y-NLACHANNELHEIGHT/2, ICON_MUTE_IPO_ON);
+ else
+ BIF_icon_draw(NLAWIDTH-16, y-NLACHANNELHEIGHT/2, ICON_MUTE_IPO_OFF);
+ }
+
glDisable(GL_BLEND);
y-=NLACHANNELHEIGHT+NLACHANNELSKIP;
@@ -192,16 +201,20 @@ static void draw_nla_channels(void)
glRasterPos2f(x+48, y-4);
BMF_DrawString(G.font, strip->act->id.name+2);
- if(strip->flag & ACTSTRIP_ACTIVE) {
- glEnable(GL_BLEND);
+ glEnable(GL_BLEND);
+
+ if(strip->flag & ACTSTRIP_ACTIVE)
BIF_icon_draw(x+16, y-8, ICON_DOT);
- glDisable(GL_BLEND);
- }
- if(strip->modifiers.first) {
- glEnable(GL_BLEND);
+
+ if(strip->modifiers.first)
BIF_icon_draw(x+34, y-8, ICON_MODIFIER);
- glDisable(GL_BLEND);
- }
+
+ if(strip->flag & ACTSTRIP_MUTE)
+ BIF_icon_draw(NLAWIDTH-16, y-NLACHANNELHEIGHT/2, ICON_MUTE_IPO_ON);
+ else
+ BIF_icon_draw(NLAWIDTH-16, y-NLACHANNELHEIGHT/2, ICON_MUTE_IPO_OFF);
+
+ glDisable(GL_BLEND);
}
y-=(NLACHANNELHEIGHT+NLACHANNELSKIP);
@@ -741,7 +754,7 @@ void drawnlaspace(ScrArea *sa, void *spacedata)
draw_cfra_action();
/* draw markers */
- draw_markers_timespace();
+ draw_markers_timespace(0);
/* Draw preview 'curtains' */
draw_anim_preview_timespace();
diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c
index 883fd05909f..4a5dda72b18 100644
--- a/source/blender/src/drawnode.c
+++ b/source/blender/src/drawnode.c
@@ -36,10 +36,12 @@
#include "DNA_action_types.h"
#include "DNA_color_types.h"
+#include "DNA_customdata_types.h"
#include "DNA_ipo_types.h"
#include "DNA_ID.h"
#include "DNA_image_types.h"
#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
@@ -88,6 +90,49 @@
#include "interface.h" /* urm... for rasterpos_safe, roundbox */
#include "mydevice.h"
+extern void autocomplete_uv(char *str, void *arg_v);
+extern int verify_valid_uv_name(char *str);
+
+/* autocomplete callback for buttons */
+static void autocomplete_vcol(char *str, void *arg_v)
+{
+ Mesh *me;
+ CustomDataLayer *layer;
+ AutoComplete *autocpl;
+ int a;
+
+ if(str[0]==0)
+ return;
+
+ autocpl= autocomplete_begin(str, 32);
+
+ /* search if str matches the beginning of name */
+ for(me= G.main->mesh.first; me; me=me->id.next)
+ for(a=0, layer= me->fdata.layers; a<me->fdata.totlayer; a++, layer++)
+ if(layer->type == CD_MCOL)
+ autocomplete_do_name(autocpl, layer->name);
+
+ autocomplete_end(autocpl, str);
+}
+
+static int verify_valid_vcol_name(char *str)
+{
+ Mesh *me;
+ CustomDataLayer *layer;
+ int a;
+
+ if(str[0]==0)
+ return 1;
+
+ /* search if str matches the name */
+ for(me= G.main->mesh.first; me; me=me->id.next)
+ for(a=0, layer= me->fdata.layers; a<me->fdata.totlayer; a++, layer++)
+ if(layer->type == CD_MCOL)
+ if(strcmp(layer->name, str)==0)
+ return 1;
+
+ return 0;
+}
static void snode_drawstring(SpaceNode *snode, char *str, int okwidth)
{
@@ -292,6 +337,31 @@ static int node_buts_mix_rgb(uiBlock *block, bNodeTree *ntree, bNode *node, rctf
return 20;
}
+static int node_buts_time(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+{
+ if(block) {
+ CurveMapping *cumap= node->storage;
+ short dx= (short)((butr->xmax-butr->xmin)/2);
+ butr->ymin += 26;
+
+ curvemap_buttons(block, node->storage, 's', B_NODE_EXEC+node->nr, B_REDR, butr);
+
+ if(cumap) cumap->flag |= CUMA_DRAW_CFRA;
+ if(node->custom1<node->custom2)
+ cumap->black[0]= (float)(CFRA - node->custom1)/(float)(node->custom2-node->custom1);
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Sta:",
+ butr->xmin, butr->ymin-22, dx, 19,
+ &node->custom1, 1.0, 20000.0, 0, 0, "Start frame");
+ uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "End:",
+ butr->xmin+dx, butr->ymin-22, dx, 19,
+ &node->custom2, 1.0, 20000.0, 0, 0, "End frame");
+ }
+
+ return node->width-NODE_DY;
+}
+
static int node_buts_valtorgb(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
@@ -606,10 +676,20 @@ static int node_shader_buts_vect_math(uiBlock *block, bNodeTree *ntree, bNode *n
static int node_shader_buts_geometry(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
+ uiBut *but;
NodeGeometry *ngeo= (NodeGeometry*)node->storage;
- uiDefBut(block, TEX, B_NODE_EXEC+node->nr, "UV:", butr->xmin, butr->ymin+20, butr->xmax-butr->xmin, 20, ngeo->uvname, 0, 31, 0, 0, "Set name of UV layer to use, default is active UV layer");
- uiDefBut(block, TEX, B_NODE_EXEC+node->nr, "Col:", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, ngeo->colname, 0, 31, 0, 0, "Set name of vertex color layer to use, default is active vertex color layer");
+ if(!verify_valid_uv_name(ngeo->uvname))
+ uiBlockSetCol(block, TH_REDALERT);
+ but= uiDefBut(block, TEX, B_NODE_EXEC+node->nr, "UV:", butr->xmin, butr->ymin+20, butr->xmax-butr->xmin, 20, ngeo->uvname, 0, 31, 0, 0, "Set name of UV layer to use, default is active UV layer");
+ uiButSetCompleteFunc(but, autocomplete_uv, NULL);
+ uiBlockSetCol(block, TH_AUTO);
+
+ if(!verify_valid_vcol_name(ngeo->colname))
+ uiBlockSetCol(block, TH_REDALERT);
+ but= uiDefBut(block, TEX, B_NODE_EXEC+node->nr, "Col:", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, ngeo->colname, 0, 31, 0, 0, "Set name of vertex color layer to use, default is active vertex color layer");
+ uiButSetCompleteFunc(but, autocomplete_vcol, NULL);
+ uiBlockSetCol(block, TH_AUTO);
}
return 40;
@@ -805,14 +885,14 @@ static int node_composit_buts_image(uiBlock *block, bNodeTree *ntree, bNode *nod
dy-= 19;
uiDefButI(block, NUM, B_NODE_EXEC+node->nr, "Frs:",
xmin, dy, width, 19,
- &iuser->frames, 0.0, 10000.0, 0, 0, "Amount of images used in animation");
+ &iuser->frames, 0.0, MAXFRAMEF, 0, 0, "Amount of images used in animation");
uiDefButI(block, NUM, B_NODE_EXEC+node->nr, "SFra:",
xmin+width, dy, width, 19,
- &iuser->sfra, 1.0, 10000.0, 0, 0, "Start frame of animation");
+ &iuser->sfra, 1.0, MAXFRAMEF, 0, 0, "Start frame of animation");
dy-= 19;
uiDefButI(block, NUM, B_NODE_EXEC+node->nr, "Offs:",
xmin, dy, width, 19,
- &iuser->offset, -10000.0, 10000.0, 0, 0, "Offsets the number of the frame to use in the animation");
+ &iuser->offset, -MAXFRAMEF, MAXFRAMEF, 0, 0, "Offsets the number of the frame to use in the animation");
uiDefButS(block, TOG, B_NODE_EXEC+node->nr, "Cycl",
xmin+width, dy, width-20, 19,
&iuser->cycl, 0.0, 0.0, 0, 0, "Make animation go cyclic");
@@ -977,18 +1057,22 @@ static int node_composit_buts_blur(uiBlock *block, bNodeTree *ntree, bNode *node
char str[256];
uiBlockBeginAlign(block);
- sprintf(str, "Filter Type%%t|Flat %%x%d|Tent %%x%d|Quad %%x%d|Cubic %%x%d|Gauss %%x%d|CatRom %%x%d|Mitch %%x%d", R_FILTER_BOX, R_FILTER_TENT, R_FILTER_QUAD, R_FILTER_CUBIC, R_FILTER_GAUSS, R_FILTER_CATROM, R_FILTER_MITCH);
- uiDefButS(block, MENU, B_NODE_EXEC+node->nr,str,
+ sprintf(str, "Filter Type%%t|Flat %%x%d|Tent %%x%d|Quad %%x%d|Cubic %%x%d|Gauss %%x%d|Fast Gauss%%x%d|CatRom %%x%d|Mitch %%x%d", R_FILTER_BOX, R_FILTER_TENT, R_FILTER_QUAD, R_FILTER_CUBIC, R_FILTER_GAUSS, R_FILTER_FAST_GAUSS, R_FILTER_CATROM, R_FILTER_MITCH);
+ uiDefButS(block, MENU, B_NODE_EXEC+node->nr,str,
butr->xmin, dy, dx*2, 19,
&nbd->filtertype, 0, 0, 0, 0, "Set sampling filter for blur");
- dy-=19;
- uiDefButC(block, TOG, B_NODE_EXEC+node->nr, "Bokeh",
- butr->xmin, dy, dx, 19,
- &nbd->bokeh, 0, 0, 0, 0, "Uses circular filter, warning it's slow!");
- uiDefButC(block, TOG, B_NODE_EXEC+node->nr, "Gamma",
- butr->xmin+dx, dy, dx, 19,
- &nbd->gamma, 0, 0, 0, 0, "Applies filter on gamma corrected values");
-
+ dy-=19;
+ if (nbd->filtertype != R_FILTER_FAST_GAUSS) {
+ uiDefButC(block, TOG, B_NODE_EXEC+node->nr, "Bokeh",
+ butr->xmin, dy, dx, 19,
+ &nbd->bokeh, 0, 0, 0, 0, "Uses circular filter, warning it's slow!");
+ uiDefButC(block, TOG, B_NODE_EXEC+node->nr, "Gamma",
+ butr->xmin+dx, dy, dx, 19,
+ &nbd->gamma, 0, 0, 0, 0, "Applies filter on gamma corrected values");
+ } else {
+ uiBlockEndAlign(block);
+ uiBlockBeginAlign(block);
+ }
dy-=19;
bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X:",
butr->xmin, dy, dx, 19,
@@ -996,6 +1080,7 @@ static int node_composit_buts_blur(uiBlock *block, bNodeTree *ntree, bNode *node
bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Y:",
butr->xmin+dx, dy, dx, 19,
&nbd->sizey, 0, 256, 0, 0, "");
+ uiBlockEndAlign(block);
}
return 57;
}
@@ -1054,6 +1139,145 @@ static int node_composit_buts_defocus(uiBlock *block, bNodeTree *ntree, bNode *n
return 228;
}
+
+/* qdn: glare node */
+static int node_composit_buts_glare(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+{
+ if(block) {
+ NodeGlare *ndg = node->storage;
+ short dy = butr->ymin + 152, dx = butr->xmax - butr->xmin;
+ char* mn1 = "Type%t|Ghosts%x3|Streaks%x2|Fog Glow%x1|Simple Star%x0";
+ char* mn2 = "Quality/Speed%t|High/Slow%x0|Medium/Medium%x1|Low/Fast%x2";
+ uiDefButC(block, MENU, B_NODE_EXEC+node->nr, mn1,
+ butr->xmin, dy, dx, 19,
+ &ndg->type, 0, 0, 0, 0, "Glow/Flare/Bloom type");
+ uiDefButC(block, MENU, B_NODE_EXEC+node->nr, mn2,
+ butr->xmin, dy-19, dx, 19,
+ &ndg->quality, 0, 0, 0, 0,
+ "Quality speed trade off, if not set to high quality, effect will be applied to low-res copy of source image");
+ if (ndg->type != 1) {
+ uiDefButC(block, NUM, B_NODE_EXEC+node->nr, "Iterations:",
+ butr->xmin, dy-38, dx, 19,
+ &ndg->iter, 2, 5, 1, 0,
+ "higher values will generate longer/more streaks/ghosts");
+ if (ndg->type != 0)
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "ColMod:",
+ butr->xmin, dy-57, dx, 19,
+ &ndg->colmod, 0, 1, 10, 0,
+ "Amount of Color Modulation, modulates colors of streaks and ghosts for a spectral dispersion effect");
+ }
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Mix:",
+ butr->xmin, dy-76, dx, 19,
+ &ndg->mix, -1, 1, 10, 0,
+ "Mix balance, -1 is original image only, 0 is exact 50/50 mix, 1 is processed image only");
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Threshold:",
+ butr->xmin, dy-95, dx, 19,
+ &ndg->threshold, 0, 1000, 10, 0,
+ "Brightness threshold, the glarefilter will be applied only to pixels brighter than this value");
+ if ((ndg->type == 2) || (ndg->type == 0))
+ {
+ if (ndg->type == 2) {
+ uiDefButC(block, NUM, B_NODE_EXEC+node->nr, "streaks:",
+ butr->xmin, dy-114, dx, 19,
+ &ndg->angle, 2, 16, 1000, 0,
+ "Total number of streaks");
+ uiDefButC(block, NUM, B_NODE_EXEC+node->nr, "AngOfs:",
+ butr->xmin, dy-133, dx, 19,
+ &ndg->angle_ofs, 0, 180, 1000, 0,
+ "Streak angle rotation offset in degrees");
+ }
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Fade:",
+ butr->xmin, dy-152, dx, 19,
+ &ndg->fade, 0.75, 1, 5, 0,
+ "Streak fade out factor");
+ }
+ if (ndg->type == 0)
+ uiDefButC(block, TOG, B_NODE_EXEC+node->nr, "Rot45",
+ butr->xmin, dy-114, dx, 19,
+ &ndg->angle, 0, 0, 0, 0,
+ "simple star filter, add 45 degree rotation offset");
+ if ((ndg->type == 1) || (ndg->type > 3)) // PBGH and fog glow
+ uiDefButC(block, NUM, B_NODE_EXEC+node->nr, "Size:",
+ butr->xmin, dy-114, dx, 19,
+ &ndg->size, 6, 9, 1000, 0,
+ "glow/glare size (not actual size, relative to initial size of bright area of pixels)");
+ }
+ return 171;
+}
+
+/* qdn: tonemap node */
+static int node_composit_buts_tonemap(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+{
+ if(block) {
+ NodeTonemap *ntm = node->storage;
+ short dy = butr->ymin + 76, dx = butr->xmax - butr->xmin;
+ char* mn = "Type%t|R/D Photoreceptor%x1|Rh Simple%x0";
+
+ uiBlockBeginAlign(block);
+ uiDefButI(block, MENU, B_NODE_EXEC+node->nr, mn,
+ butr->xmin, dy, dx, 19,
+ &ntm->type, 0, 0, 0, 0,
+ "Tone mapping type");
+ if (ntm->type == 0) {
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Key:",
+ butr->xmin, dy-19, dx, 19,
+ &ntm->key, 0, 1, 5, 0,
+ "The value the average luminance is mapped to");
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Offset:",
+ butr->xmin, dy-38, dx, 19,
+ &ntm->offset, 0.001, 10, 5, 0,
+ "Tonemap offset, normally always 1, but can be used as an extra control to alter the brightness curve");
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Gamma:",
+ butr->xmin, dy-57, dx, 19,
+ &ntm->gamma, 0.001, 3, 5, 0,
+ "Gamma factor, if not used, set to 1");
+ }
+ else {
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Intensity:",
+ butr->xmin, dy-19, dx, 19,
+ &ntm->f, -8, 8, 10, 0, "if less than zero, darkens image, otherwise makes it brighter");
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Contrast:",
+ butr->xmin, dy-38, dx, 19,
+ &ntm->m, 0, 1, 5, 0, "Set to 0 to use estimate from input image");
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "Adaptation:",
+ butr->xmin, dy-57, dx, 19,
+ &ntm->a, 0, 1, 5, 0, "if 0, global, if 1, based on pixel intensity");
+ uiDefButF(block, NUM, B_NODE_EXEC+node->nr, "ColCorrect:",
+ butr->xmin, dy-76, dx, 19,
+ &ntm->c, 0, 1, 5, 0, "color correction, if 0, same for all channels, if 1, each independent");
+ }
+ uiBlockEndAlign(block);
+ }
+ return 95;
+}
+
+/* qdn: lens distortion node */
+static int node_composit_buts_lensdist(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+{
+ if(block) {
+ NodeLensDist *nld = node->storage;
+ short dy = butr->ymin + 19, dx = butr->xmax - butr->xmin;
+ uiBlockBeginAlign(block);
+ uiDefButS(block, TOG, B_NODE_EXEC+node->nr, "Projector",
+ butr->xmin, dy, dx, 19,
+ &nld->proj, 0, 0, 0, 0,
+ "Enable/disable projector mode, effect is applied in horizontal direction only");
+ if (!nld->proj) {
+ uiDefButS(block, TOG, B_NODE_EXEC+node->nr, "Jitter",
+ butr->xmin, dy-19, dx/2, 19,
+ &nld->jit, 0, 0, 0, 0,
+ "Enable/disable jittering, faster, but also noisier");
+ uiDefButS(block, TOG, B_NODE_EXEC+node->nr, "Fit",
+ butr->xmin+dx/2, dy-19, dx/2, 19,
+ &nld->fit, 0, 0, 0, 0,
+ "For positive distortion factor only, scale image such that black areas are not visible");
+ }
+ uiBlockEndAlign(block);
+ }
+ return 38;
+}
+
+
static int node_composit_buts_vecblur(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
@@ -1106,6 +1330,50 @@ static int node_composit_buts_flip(uiBlock *block, bNodeTree *ntree, bNode *node
return 20;
}
+static int node_composit_buts_crop(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
+{
+ if(block) {
+ NodeTwoXYs *ntxy= node->storage;
+ uiBut *bt;
+ char elementheight = 19;
+ short dx= (butr->xmax-butr->xmin)/2;
+ short dy= butr->ymax - elementheight;
+ short xymin= 0, xymax= 10000;
+
+ uiBlockBeginAlign(block);
+
+ /* crop image size toggle */
+ uiDefButS(block, TOG, B_NODE_EXEC+node->nr, "Crop Image Size",
+ butr->xmin, dy, dx*2, elementheight,
+ &node->custom1, 0, 0, 0, 0, "Crop the size of the input image.");
+
+ dy-=elementheight;
+
+ /* x1 */
+ bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X1:",
+ butr->xmin, dy, dx, elementheight,
+ &ntxy->x1, xymin, xymax, 0, 0, "");
+ /* y1 */
+ bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Y1:",
+ butr->xmin+dx, dy, dx, elementheight,
+ &ntxy->y1, xymin, xymax, 0, 0, "");
+
+ dy-=elementheight;
+
+ /* x2 */
+ bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "X2:",
+ butr->xmin, dy, dx, elementheight,
+ &ntxy->x2, xymin, xymax, 0, 0, "");
+ /* y2 */
+ bt=uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Y2:",
+ butr->xmin+dx, dy, dx, elementheight,
+ &ntxy->y2, xymin, xymax, 0, 0, "");
+
+ uiBlockEndAlign(block);
+ }
+ return 60;
+}
+
static int node_composit_buts_splitviewer(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
@@ -1147,35 +1415,6 @@ static int node_composit_buts_map_value(uiBlock *block, bNodeTree *ntree, bNode
return 80;
}
-static int node_composit_buts_time(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
-{
- if(block) {
- CurveMapping *cumap= node->storage;
- short dx= (butr->xmax-butr->xmin)/2;
- rctf *curvebutr;
-
- memcpy(&curvebutr, &butr, sizeof(rctf));
- curvebutr->ymin += 26;
-
- curvemap_buttons(block, node->storage, 's', B_NODE_EXEC+node->nr, B_REDR, curvebutr);
-
- cumap->flag |= CUMA_DRAW_CFRA;
- if(node->custom1<node->custom2)
- cumap->black[0]= (float)(CFRA - node->custom1)/(float)(node->custom2-node->custom1);
-
- uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "Sta:",
- butr->xmin, butr->ymin-22, dx, 19,
- &node->custom1, 1.0, 20000.0, 0, 0, "Start frame");
- uiDefButS(block, NUM, B_NODE_EXEC+node->nr, "End:",
- butr->xmin+dx, butr->ymin-22, dx, 19,
- &node->custom2, 1.0, 20000.0, 0, 0, "End frame");
-
- }
-
- return node->width-NODE_DY;
-}
-
static int node_composit_buts_alphaover(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
@@ -1487,7 +1726,7 @@ static void node_scale_cb(void *node_v, void *unused_v)
/* check the 2 inputs, and set them to reasonable values */
for(nsock= node->inputs.first; nsock; nsock= nsock->next) {
- if(node->custom1==CMP_SCALE_RELATIVE)
+ if(ELEM(node->custom1, CMP_SCALE_RELATIVE, CMP_SCALE_SCENEPERCENT))
nsock->ns.vec[0]= 1.0;
else {
if(nsock->next==NULL)
@@ -1501,9 +1740,9 @@ static void node_scale_cb(void *node_v, void *unused_v)
static int node_composit_buts_scale(uiBlock *block, bNodeTree *ntree, bNode *node, rctf *butr)
{
if(block) {
- uiBut *bt= uiDefButS(block, TOG, B_NODE_EXEC+node->nr, "Absolute",
+ uiBut *bt= uiDefButS(block, MENU, B_NODE_EXEC+node->nr, "Relative %x0|Absolute %x1|Scene Size % %x2|",
butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
- &node->custom1, 0, 0, 0, 0, "");
+ &node->custom1, 0, 0, 0, 0, "Scale new image to absolute pixel size, size relative to the incoming image, or using the 'percent' size of the scene");
uiButSetFunc(bt, node_scale_cb, node, NULL);
}
return 20;
@@ -1563,13 +1802,28 @@ static void node_composit_set_butfunc(bNodeType *ntype)
case CMP_NODE_VALTORGB:
ntype->butfunc= node_buts_valtorgb;
break;
+ case CMP_NODE_CROP:
+ ntype->butfunc= node_composit_buts_crop;
+ break;
case CMP_NODE_BLUR:
ntype->butfunc= node_composit_buts_blur;
break;
- /* qdn: defocus node */
+ /* qdn: defocus node */
case CMP_NODE_DEFOCUS:
ntype->butfunc = node_composit_buts_defocus;
break;
+ /* qdn: glare node */
+ case CMP_NODE_GLARE:
+ ntype->butfunc = node_composit_buts_glare;
+ break;
+ /* qdn: tonemap node */
+ case CMP_NODE_TONEMAP:
+ ntype->butfunc = node_composit_buts_tonemap;
+ break;
+ /* qdn: lens distortion node */
+ case CMP_NODE_LENSDIST:
+ ntype->butfunc = node_composit_buts_lensdist;
+ break;
case CMP_NODE_VECBLUR:
ntype->butfunc= node_composit_buts_vecblur;
break;
@@ -1580,7 +1834,7 @@ static void node_composit_set_butfunc(bNodeType *ntype)
ntype->butfunc= node_composit_buts_map_value;
break;
case CMP_NODE_TIME:
- ntype->butfunc= node_composit_buts_time;
+ ntype->butfunc= node_buts_time;
break;
case CMP_NODE_ALPHAOVER:
ntype->butfunc= node_composit_buts_alphaover;
@@ -1718,37 +1972,6 @@ static void draw_nodespace_back(ScrArea *sa, SpaceNode *snode)
}
}
-static void nodeshadow(rctf *rct, float radius, float aspect, int select)
-{
- float rad;
- float a;
- char alpha= 2;
-
- glEnable(GL_BLEND);
-
- if(radius > (rct->ymax-rct->ymin-10.0f)/2.0f)
- rad= (rct->ymax-rct->ymin-10.0f)/2.0f;
- else
- rad= radius;
-
- if(select) a= 10.0f*aspect; else a= 7.0f*aspect;
- for(; a>0.0f; a-=aspect) {
- /* alpha ranges from 2 to 20 or so */
- glColor4ub(0, 0, 0, alpha);
- alpha+= 2;
-
- gl_round_box(GL_POLYGON, rct->xmin - a, rct->ymin - a, rct->xmax + a, rct->ymax-10.0f + a, rad+a);
- }
-
- /* outline emphasis */
- glEnable( GL_LINE_SMOOTH );
- glColor4ub(0, 0, 0, 100);
- gl_round_box(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, radius);
- glDisable( GL_LINE_SMOOTH );
-
- glDisable(GL_BLEND);
-}
-
/* nice AA filled circle */
static void socket_circle_draw(float x, float y, float size, int type, int select)
{
@@ -1849,6 +2072,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
glEnable(GL_BLEND);
glBlendFunc( GL_ONE, GL_ONE_MINUS_SRC_ALPHA ); /* premul graphics */
+ glColor4f(1.0, 1.0, 1.0, 1.0);
glaDrawPixelsTex(prv->xmin, prv->ymin, preview->xsize, preview->ysize, GL_FLOAT, preview->rect);
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
@@ -1955,8 +2179,12 @@ static void node_update(bNode *node)
node->prvr.xmin+= 0.5*dx;
node->prvr.xmax-= 0.5*dx;
}
-
+
dy= node->prvr.ymin - NODE_DYS/2;
+
+ /* make sure that maximums are bigger or equal to minimums */
+ if(node->prvr.xmax < node->prvr.xmin) SWAP(float, node->prvr.xmax, node->prvr.xmin);
+ if(node->prvr.ymax < node->prvr.ymin) SWAP(float, node->prvr.ymax, node->prvr.ymin);
}
else {
float oldh= node->prvr.ymax - node->prvr.ymin;
@@ -1968,6 +2196,10 @@ static void node_update(bNode *node)
dy= node->prvr.ymin - NODE_DYS/2;
}
}
+
+ /* XXX ugly hack, typeinfo for group is generated */
+ if(node->type == NODE_GROUP)
+ node->typeinfo->butfunc= node_buts_group;
/* buttons rect? */
if((node->flag & NODE_OPTIONS) && node->typeinfo->butfunc) {
@@ -2093,7 +2325,7 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
int ofs, color_id= node_get_colorid(node);
uiSetRoundBox(15-4);
- nodeshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT);
+ ui_dropshadow(rct, BASIS_RAD, snode->aspect, node->flag & SELECT);
/* header */
if(color_id==TH_NODE)
@@ -2120,8 +2352,6 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node)
glDisable(GL_BLEND);
}
if(node->type == NODE_GROUP) {
- /* XXX ugly hack */
- node->typeinfo->butfunc= node_buts_group;
iconofs-= 18.0f;
glEnable(GL_BLEND);
@@ -2297,7 +2527,7 @@ void node_draw_hidden(SpaceNode *snode, bNode *node)
/* shadow */
uiSetRoundBox(15);
- nodeshadow(rct, hiddenrad, snode->aspect, node->flag & SELECT);
+ ui_dropshadow(rct, hiddenrad, snode->aspect, node->flag & SELECT);
/* body */
BIF_ThemeColor(color_id);
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index 2159e3823e8..737b118a40b 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -61,6 +61,7 @@
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
+#include "DNA_particle_types.h"
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
@@ -74,6 +75,7 @@
#include "BLI_arithb.h"
#include "BLI_editVert.h"
#include "BLI_edgehash.h"
+#include "BLI_rand.h"
#include "BKE_utildefines.h"
#include "BKE_curve.h"
@@ -93,6 +95,8 @@
#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_anim.h" //for the where_on_path function
+#include "BKE_particle.h"
+#include "BKE_utildefines.h"
#ifdef WITH_VERSE
#include "BKE_verse.h"
#endif
@@ -100,6 +104,7 @@
#include "BIF_editarmature.h"
#include "BIF_editdeform.h"
#include "BIF_editmesh.h"
+#include "BIF_editparticle.h"
#include "BIF_glutil.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
@@ -108,6 +113,7 @@
#include "BIF_retopo.h"
#include "BIF_screen.h"
#include "BIF_space.h"
+#include "BIF_toolbox.h"
#include "BDR_drawmesh.h"
#include "BDR_drawobject.h"
@@ -135,6 +141,9 @@ extern ListBase editelems;
static void draw_bounding_volume(Object *ob);
+static void drawcube_size(float size);
+static void drawcircle_size(float size);
+
/* ************* Setting OpenGL Material ************ */
// Materials start counting at # one....
@@ -264,6 +273,79 @@ static float cube[8][3] = {
{ 1.0, 1.0, -1.0},
};
+/* ----------------- OpenGL Circle Drawing - Tables for Optimised Drawing Speed ------------------ */
+/* 32 values of sin function (still same result!) */
+static float sinval[32] = {
+ 0.00000000,
+ 0.20129852,
+ 0.39435585,
+ 0.57126821,
+ 0.72479278,
+ 0.84864425,
+ 0.93775213,
+ 0.98846832,
+ 0.99871650,
+ 0.96807711,
+ 0.89780453,
+ 0.79077573,
+ 0.65137248,
+ 0.48530196,
+ 0.29936312,
+ 0.10116832,
+ -0.10116832,
+ -0.29936312,
+ -0.48530196,
+ -0.65137248,
+ -0.79077573,
+ -0.89780453,
+ -0.96807711,
+ -0.99871650,
+ -0.98846832,
+ -0.93775213,
+ -0.84864425,
+ -0.72479278,
+ -0.57126821,
+ -0.39435585,
+ -0.20129852,
+ 0.00000000
+};
+
+/* 32 values of cos function (still same result!) */
+static float cosval[32] ={
+ 1.00000000,
+ 0.97952994,
+ 0.91895781,
+ 0.82076344,
+ 0.68896691,
+ 0.52896401,
+ 0.34730525,
+ 0.15142777,
+ -0.05064916,
+ -0.25065253,
+ -0.44039415,
+ -0.61210598,
+ -0.75875812,
+ -0.87434661,
+ -0.95413925,
+ -0.99486932,
+ -0.99486932,
+ -0.95413925,
+ -0.87434661,
+ -0.75875812,
+ -0.61210598,
+ -0.44039415,
+ -0.25065253,
+ -0.05064916,
+ 0.15142777,
+ 0.34730525,
+ 0.52896401,
+ 0.68896691,
+ 0.82076344,
+ 0.91895781,
+ 0.97952994,
+ 1.00000000
+};
+
/* flag is same as for draw_object */
void drawaxes(float size, int flag, char drawtype)
{
@@ -322,6 +404,14 @@ void drawaxes(float size, int flag, char drawtype)
glEnd();
break;
+ case OB_CUBE:
+ drawcube_size(size);
+ break;
+
+ case OB_CIRCLE:
+ drawcircle_size(size);
+ break;
+
case OB_ARROWS:
default:
for (axis=0; axis<3; axis++) {
@@ -475,6 +565,31 @@ static void drawcube(void)
glEnd();
}
+/* draws a cube on given the scaling of the cube, assuming that
+ * all required matrices have been set (used for drawing empties)
+ */
+static void drawcube_size(float size)
+{
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-size,-size,-size); glVertex3f(-size,-size,size);glVertex3f(-size,size,size); glVertex3f(-size,size,-size);
+ glVertex3f(-size,-size,-size); glVertex3f(size,-size,-size);glVertex3f(size,-size,size); glVertex3f(size,size,size);
+ glVertex3f(size,size,-size); glVertex3f(size,-size,-size);
+ glEnd();
+
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-size,-size,size); glVertex3f(size,-size,size);
+ glEnd();
+
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-size,size,size); glVertex3f(size,size,size);
+ glEnd();
+
+ glBegin(GL_LINE_STRIP);
+ glVertex3f(-size,size,-size); glVertex3f(size,size,-size);
+ glEnd();
+}
+
+/* this is an unused (old) cube-drawing function based on a given size */
#if 0
static void drawcube_size(float *size)
{
@@ -987,7 +1102,7 @@ static void drawcamera(Object *ob, int flag)
if(cam->flag & CAM_SHOWLIMITS) {
draw_limit_line(cam->clipsta, cam->clipend, 0x77FFFF);
/* qdn: was yafray only, now also enabled for Blender to be used with defocus composit node */
- draw_focus_cross(cam->YF_dofdist, cam->drawsize);
+ draw_focus_cross(dof_camera(ob), cam->drawsize);
}
wrld= G.scene->world;
@@ -1248,12 +1363,21 @@ void nurbs_foreachScreenVert(void (*func)(void *userData, Nurb *nu, BPoint *bp,
BezTriple *bezt = &nu->bezt[i];
if(bezt->hide==0) {
- view3d_project_short_clip(curarea, bezt->vec[0], s, pmat, vmat);
- func(userData, nu, NULL, bezt, 0, s[0], s[1]);
- view3d_project_short_clip(curarea, bezt->vec[1], s, pmat, vmat);
- func(userData, nu, NULL, bezt, 1, s[0], s[1]);
- view3d_project_short_clip(curarea, bezt->vec[2], s, pmat, vmat);
- func(userData, nu, NULL, bezt, 2, s[0], s[1]);
+ if (G.f & G_HIDDENHANDLES) {
+ view3d_project_short_clip(curarea, bezt->vec[1], s, pmat, vmat);
+ if (s[0] != IS_CLIPPED)
+ func(userData, nu, NULL, bezt, 1, s[0], s[1]);
+ } else {
+ view3d_project_short_clip(curarea, bezt->vec[0], s, pmat, vmat);
+ if (s[0] != IS_CLIPPED)
+ func(userData, nu, NULL, bezt, 0, s[0], s[1]);
+ view3d_project_short_clip(curarea, bezt->vec[1], s, pmat, vmat);
+ if (s[0] != IS_CLIPPED)
+ func(userData, nu, NULL, bezt, 1, s[0], s[1]);
+ view3d_project_short_clip(curarea, bezt->vec[2], s, pmat, vmat);
+ if (s[0] != IS_CLIPPED)
+ func(userData, nu, NULL, bezt, 2, s[0], s[1]);
+ }
}
}
}
@@ -1341,17 +1465,38 @@ static void draw_dm_vert_normals(DerivedMesh *dm) {
/* Draw verts with color set based on selection */
static void draw_dm_verts__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
{
+ struct { int sel; EditVert *eve_act; } * data = userData;
EditVert *eve = EM_get_vert_for_index(index);
- int sel = *((int*) userData);
- if (eve->h==0 && (eve->f&SELECT)==sel) {
- bglVertex3fv(co);
+ if (eve->h==0 && (eve->f&SELECT)==data->sel) {
+ /* draw active larger - need to stop/start point drawing for this :/ */
+ if (eve==data->eve_act) {
+ float size = BIF_GetThemeValuef(TH_VERTEX_SIZE);
+ BIF_ThemeColor4(TH_EDITMESH_ACTIVE);
+
+ bglEnd();
+
+ glPointSize(size);
+ bglBegin(GL_POINTS);
+ bglVertex3fv(co);
+ bglEnd();
+
+ BIF_ThemeColor4(TH_VERTEX_SELECT);
+ glPointSize(size);
+ bglBegin(GL_POINTS);
+ } else {
+ bglVertex3fv(co);
+ }
}
}
-static void draw_dm_verts(DerivedMesh *dm, int sel)
+static void draw_dm_verts(DerivedMesh *dm, int sel, EditVert *eve_act)
{
+ struct { int sel; EditVert *eve_act; } data;
+ data.sel = sel;
+ data.eve_act = eve_act;
+
bglBegin(GL_POINTS);
- dm->foreachMappedVert(dm, draw_dm_verts__mapFunc, &sel);
+ dm->foreachMappedVert(dm, draw_dm_verts__mapFunc, &data);
bglEnd();
}
@@ -1359,21 +1504,38 @@ static void draw_dm_verts(DerivedMesh *dm, int sel)
static int draw_dm_edges_sel__setDrawOptions(void *userData, int index)
{
EditEdge *eed = EM_get_edge_for_index(index);
- unsigned char **cols = userData;
+ //unsigned char **cols = userData, *col;
+ struct { unsigned char *baseCol, *selCol, *actCol; EditEdge *eed_act; } * data = userData;
+ unsigned char *col;
if (eed->h==0) {
- glColor4ubv(cols[(eed->f&SELECT)?1:0]);
+ if (eed==data->eed_act) {
+ glColor4ubv(data->actCol);
+ } else {
+ if (eed->f&SELECT) {
+ col = data->selCol;
+ } else {
+ col = data->baseCol;
+ }
+ /* no alpha, this is used so a transparent color can disable drawing unselected edges in editmode */
+ if (col[3]==0) return 0;
+
+ glColor4ubv(col);
+ }
return 1;
} else {
return 0;
}
}
-static void draw_dm_edges_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol)
+static void draw_dm_edges_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditEdge *eed_act)
{
- unsigned char *cols[2];
- cols[0] = baseCol;
- cols[1] = selCol;
- dm->drawMappedEdges(dm, draw_dm_edges_sel__setDrawOptions, cols);
+ struct { unsigned char *baseCol, *selCol, *actCol; EditEdge *eed_act; } data;
+
+ data.baseCol = baseCol;
+ data.selCol = selCol;
+ data.actCol = actCol;
+ data.eed_act = eed_act;
+ dm->drawMappedEdges(dm, draw_dm_edges_sel__setDrawOptions, &data);
}
/* Draw edges */
@@ -1436,25 +1598,38 @@ static void draw_dm_edges_sharp(DerivedMesh *dm)
}
- /* Draw faces with color set based on selection */
+ /* Draw faces with color set based on selection
+ * return 2 for the active face so it renders with stipple enabled */
static int draw_dm_faces_sel__setDrawOptions(void *userData, int index, int *drawSmooth_r)
{
+ struct { unsigned char *cols[3]; EditFace *efa_act; } * data = userData;
EditFace *efa = EM_get_face_for_index(index);
- unsigned char **cols = userData;
-
+ unsigned char *col;
+
if (efa->h==0) {
- glColor4ubv(cols[(efa->f&SELECT)?1:0]);
- return 1;
- } else {
- return 0;
+ if (efa == data->efa_act) {
+ glColor4ubv(data->cols[2]);
+ return 2; /* stipple */
+ } else {
+ col = data->cols[(efa->f&SELECT)?1:0];
+ if (col[3]==0) return 0;
+ glColor4ubv(col);
+ return 1;
+ }
}
+ return 0;
}
-static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol)
+
+/* also draws the active face */
+static void draw_dm_faces_sel(DerivedMesh *dm, unsigned char *baseCol, unsigned char *selCol, unsigned char *actCol, EditFace *efa_act)
{
- unsigned char *cols[2];
- cols[0] = baseCol;
- cols[1] = selCol;
- dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, cols, 0);
+ struct { unsigned char *cols[3]; EditFace *efa_act; } data;
+ data.cols[0] = baseCol;
+ data.cols[1] = selCol;
+ data.cols[2] = actCol;
+ data.efa_act = efa_act;
+
+ dm->drawMappedFaces(dm, draw_dm_faces_sel__setDrawOptions, &data, 0);
}
static int draw_dm_creases__setDrawOptions(void *userData, int index)
@@ -1484,7 +1659,7 @@ static void draw_dm_creases(DerivedMesh *dm)
/* EditMesh drawing routines*/
-static void draw_em_fancy_verts(EditMesh *em, DerivedMesh *cageDM)
+static void draw_em_fancy_verts(EditMesh *em, DerivedMesh *cageDM, EditVert *eve_act)
{
int sel;
@@ -1520,10 +1695,12 @@ static void draw_em_fancy_verts(EditMesh *em, DerivedMesh *cageDM)
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
glPointSize(size);
glColor4ubv((GLubyte *)col);
- draw_dm_verts(cageDM, sel);
+ draw_dm_verts(cageDM, sel, eve_act);
}
- if(G.scene->selectmode & SCE_SELECT_FACE) {
+ if( (G.scene->selectmode & SCE_SELECT_FACE) &&
+ (G.vd->drawtype<=OB_SOLID)
+ ) {
glPointSize(fsize);
glColor4ubv((GLubyte *)fcol);
draw_dm_face_centers(cageDM, sel);
@@ -1540,14 +1717,20 @@ static void draw_em_fancy_verts(EditMesh *em, DerivedMesh *cageDM)
glPointSize(1.0);
}
-static void draw_em_fancy_edges(DerivedMesh *cageDM)
+static void draw_em_fancy_edges(DerivedMesh *cageDM, short sel_only, EditEdge *eed_act)
{
int pass;
- unsigned char wire[4], sel[4];
+ unsigned char wireCol[4], selCol[4], actCol[4];
/* since this function does transparant... */
- BIF_GetThemeColor3ubv(TH_EDGE_SELECT, (char *)sel);
- BIF_GetThemeColor3ubv(TH_WIRE, (char *)wire);
+ BIF_GetThemeColor3ubv(TH_EDGE_SELECT, (char *)selCol);
+ BIF_GetThemeColor3ubv(TH_WIRE, (char *)wireCol);
+ BIF_GetThemeColor3ubv(TH_EDITMESH_ACTIVE, (char *)actCol);
+
+ /* when sel only is used, dont render wire, only selected, this is used for
+ * textured draw mode when the 'edges' option is disabled */
+ if (sel_only)
+ wireCol[3] = 0;
for (pass=0; pass<2; pass++) {
/* show wires in transparant when no zbuf clipping for select */
@@ -1555,30 +1738,33 @@ static void draw_em_fancy_edges(DerivedMesh *cageDM)
if (G.vd->zbuf && (G.vd->flag & V3D_ZBUF_SELECT)==0) {
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
-
- wire[3] = sel[3] = 85;
+ selCol[3] = 85;
+ if (!sel_only) wireCol[3] = 85;
} else {
continue;
}
} else {
- wire[3] = sel[3] = 255;
+ selCol[3] = 255;
+ if (!sel_only) wireCol[3] = 255;
}
if(G.scene->selectmode == SCE_SELECT_FACE) {
- draw_dm_edges_sel(cageDM, wire, sel);
+ draw_dm_edges_sel(cageDM, wireCol, selCol, actCol, eed_act);
}
else if( (G.f & G_DRAWEDGES) || (G.scene->selectmode & SCE_SELECT_EDGE) ) {
if(cageDM->drawMappedEdgesInterp && (G.scene->selectmode & SCE_SELECT_VERTEX)) {
glShadeModel(GL_SMOOTH);
- draw_dm_edges_sel_interp(cageDM, wire, sel);
+ draw_dm_edges_sel_interp(cageDM, wireCol, selCol);
glShadeModel(GL_FLAT);
} else {
- draw_dm_edges_sel(cageDM, wire, sel);
+ draw_dm_edges_sel(cageDM, wireCol, selCol, actCol, eed_act);
}
}
else {
- glColor4ubv(wire);
- draw_dm_edges(cageDM);
+ if (!sel_only) {
+ glColor4ubv(wireCol);
+ draw_dm_edges(cageDM);
+ }
}
if (pass==0) {
@@ -1832,20 +2018,38 @@ static int draw_em_fancy__setFaceOpts(void *userData, int index, int *drawSmooth
static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, DerivedMesh *finalDM, int dt)
{
Mesh *me = ob->data;
-
+ EditFace *efa_act = NULL;
+ EditEdge *eed_act = NULL;
+ EditVert *eve_act = NULL;
+
+ if (G.editMesh->selected.last) {
+ EditSelection *ese = G.editMesh->selected.last;
+ if ( ese->type == EDITFACE ) {
+ efa_act = (EditFace *)ese->data;
+ } else if ( ese->type == EDITEDGE ) {
+ eed_act = (EditEdge *)ese->data;
+ } else if ( ese->type == EDITVERT ) {
+ eve_act = (EditVert *)ese->data;
+ }
+ }
+
EM_init_index_arrays(1, 1, 1);
if(dt>OB_WIRE) {
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED);
+ if( CHECK_OB_DRAWTEXTURE(G.vd, dt) ) {
+ draw_mesh_textured(ob, finalDM, 0);
+ } else {
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & ME_TWOSIDED);
- glEnable(GL_LIGHTING);
- glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
+ glEnable(GL_LIGHTING);
+ glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
- finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, NULL, 0);
+ finalDM->drawMappedFaces(finalDM, draw_em_fancy__setFaceOpts, 0, 0);
- glFrontFace(GL_CCW);
- glDisable(GL_LIGHTING);
-
+ glFrontFace(GL_CCW);
+ glDisable(GL_LIGHTING);
+ }
+
// Setup for drawing wire over, disable zbuffer
// write to show selected edge wires better
BIF_ThemeColor(TH_WIRE);
@@ -1860,53 +2064,80 @@ static void draw_em_fancy(Object *ob, EditMesh *em, DerivedMesh *cageDM, Derived
}
}
- if((G.f & (G_FACESELECT+G_DRAWFACES))) { /* transp faces */
- unsigned char col1[4], col2[4];
+ if((G.f & (G_DRAWFACES)) || FACESEL_PAINT_TEST) { /* transp faces */
+ unsigned char col1[4], col2[4], col3[4];
BIF_GetThemeColor4ubv(TH_FACE, (char *)col1);
BIF_GetThemeColor4ubv(TH_FACE_SELECT, (char *)col2);
+ BIF_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, (char *)col3);
glEnable(GL_BLEND);
glDepthMask(0); // disable write in zbuffer, needed for nice transp
- draw_dm_faces_sel(cageDM, col1, col2);
+ /* dont draw unselected faces, only selected, this is MUCH nicer when texturing */
+ if CHECK_OB_DRAWTEXTURE(G.vd, dt)
+ col1[3] = 0;
+
+ draw_dm_faces_sel(cageDM, col1, col2, col3, efa_act);
glDisable(GL_BLEND);
glDepthMask(1); // restore write in zbuffer
+ } else if (efa_act) {
+ /* even if draw faces is off it would be nice to draw the stipple face
+ * Make all other faces zero alpha except for the active
+ * */
+ unsigned char col1[4], col2[4], col3[4];
+ col1[3] = col2[3] = 0; /* dont draw */
+ BIF_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, (char *)col3);
+
+ glEnable(GL_BLEND);
+ glDepthMask(0); // disable write in zbuffer, needed for nice transp
+
+ draw_dm_faces_sel(cageDM, col1, col2, col3, efa_act);
+
+ glDisable(GL_BLEND);
+ glDepthMask(1); // restore write in zbuffer
+
}
/* here starts all fancy draw-extra over */
-
- if(G.f & G_DRAWSEAMS) {
- BIF_ThemeColor(TH_EDGE_SEAM);
- glLineWidth(2);
-
- draw_dm_edges_seams(cageDM);
-
- glColor3ub(0,0,0);
- glLineWidth(1);
- }
+ if((G.f & G_DRAWEDGES)==0 && CHECK_OB_DRAWTEXTURE(G.vd, dt)) {
+ /* we are drawing textures and 'G_DRAWEDGES' is disabled, dont draw any edges */
+
+ /* only draw selected edges otherwise there is no way of telling if a face is selected */
+ draw_em_fancy_edges(cageDM, 1, eed_act);
+
+ } else {
+ if(G.f & G_DRAWSEAMS) {
+ BIF_ThemeColor(TH_EDGE_SEAM);
+ glLineWidth(2);
- if(G.f & G_DRAWSHARP) {
- BIF_ThemeColor(TH_EDGE_SHARP);
- glLineWidth(2);
-
- draw_dm_edges_sharp(cageDM);
-
- glColor3ub(0,0,0);
- glLineWidth(1);
- }
-
- if(G.f & G_DRAWCREASES) {
- draw_dm_creases(cageDM);
+ draw_dm_edges_seams(cageDM);
+
+ glColor3ub(0,0,0);
+ glLineWidth(1);
+ }
+
+ if(G.f & G_DRAWSHARP) {
+ BIF_ThemeColor(TH_EDGE_SHARP);
+ glLineWidth(2);
+
+ draw_dm_edges_sharp(cageDM);
+
+ glColor3ub(0,0,0);
+ glLineWidth(1);
+ }
+
+ if(G.f & G_DRAWCREASES) {
+ draw_dm_creases(cageDM);
+ }
+
+ draw_em_fancy_edges(cageDM, 0, eed_act);
}
-
- draw_em_fancy_edges(cageDM);
-
if(ob==G.obedit) {
retopo_matrix_update(G.vd);
- draw_em_fancy_verts(em, cageDM);
+ draw_em_fancy_verts(em, cageDM, eve_act);
if(G.f & G_DRAWNORMALS) {
BIF_ThemeColor(TH_NORMAL);
@@ -2006,7 +2237,7 @@ static void draw_mesh_fancy(Base *base, int dt, int flag)
glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
// Unwanted combination.
- if (ob==OBACT && (G.f&G_FACESELECT)) draw_wire = 0;
+ if (ob==OBACT && FACESEL_PAINT_TEST) draw_wire = 0;
if(dt==OB_BOUNDBOX) {
draw_bounding_volume(ob);
@@ -2019,13 +2250,25 @@ static void draw_mesh_fancy(Base *base, int dt, int flag)
else if(dt==OB_WIRE || totface==0) {
draw_wire = 1;
}
- else if( (ob==OBACT && (G.f & (G_FACESELECT|G_TEXTUREPAINT))) || (G.vd->drawtype==OB_TEXTURE && dt>OB_SOLID)) {
-
- if ((G.vd->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !(G.f&(G_FACESELECT|G_PICKSEL)) && !draw_wire) {
+ else if( (ob==OBACT && (G.f & G_TEXTUREPAINT || FACESEL_PAINT_TEST)) ||
+ CHECK_OB_DRAWTEXTURE(G.vd, dt))
+ {
+ int faceselect= (ob==OBACT && FACESEL_PAINT_TEST);
+
+ if ((G.vd->flag&V3D_SELECT_OUTLINE) && (base->flag&SELECT) && !(G.f&G_PICKSEL || FACESEL_PAINT_TEST) && !draw_wire) {
draw_mesh_object_outline(ob, dm);
}
- draw_tface_mesh(ob, ob->data, dt);
+ draw_mesh_textured(ob, dm, faceselect);
+
+ if(!faceselect) {
+ if(base->flag & SELECT)
+ BIF_ThemeColor((ob==OBACT)?TH_ACTIVE:TH_SELECT);
+ else
+ BIF_ThemeColor(TH_WIRE);
+
+ dm->drawLooseEdges(dm);
+ }
}
else if(dt==OB_SOLID ) {
@@ -2075,7 +2318,7 @@ static void draw_mesh_fancy(Base *base, int dt, int flag)
else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->mcol) {
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 1);
}
- else if((G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) && me->mtface) {
+ else if(G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) {
glColor3f(1.0f, 1.0f, 1.0f);
dm->drawMappedFaces(dm, wpaint__setSolidDrawOptions, NULL, 0);
}
@@ -2180,11 +2423,10 @@ static int draw_mesh_object(Base *base, int dt, int flag)
if(dt>OB_WIRE) init_gl_materials(ob, 0); // no transp in editmode, the fancy draw over goes bad then
draw_em_fancy(ob, G.editMesh, cageDM, finalDM, dt);
- if (cageDM != finalDM)
- cageDM->release(cageDM);
- finalDM->release(finalDM);
+ if (G.obedit!=ob && finalDM)
+ finalDM->release(finalDM);
}
- else if(!G.obedit && (G.f & G_SCULPTMODE) &&(G.scene->sculptdata.draw_flag & SCULPTDRAW_FAST) &&
+ else if(!G.obedit && (G.f & G_SCULPTMODE) &&(G.scene->sculptdata.flags & SCULPT_DRAW_FAST) &&
OBACT==ob && !sculpt_modifiers_active(ob)) {
sculptmode_draw_mesh(0);
}
@@ -2610,7 +2852,7 @@ static void draw_particle_system(Base *base, PartEff *paf)
if(ob->ipoflag & OB_OFFS_PARTICLE) ptime= ob->sf;
else ptime= 0.0;
- ctime= bsystem_time(ob, 0, (float)(G.scene->r.cfra), ptime);
+ ctime= bsystem_time(ob, (float)(G.scene->r.cfra), ptime);
glPointSize(1.0);
@@ -2718,6 +2960,743 @@ static void draw_static_particle_system(Object *ob, PartEff *paf, int dt)
}
+/* unified drawing of all new particle systems draw types except dupli ob & group */
+/* mostly tries to use vertex arrays for speed */
+
+/* 1. check that everything is ok & updated */
+/* 2. start initialising things */
+/* 3. initialize according to draw type */
+/* 4. allocate drawing data arrays */
+/* 5. start filling the arrays */
+/* 6. draw the arrays */
+/* 7. clean up */
+static void draw_new_particle_system(Base *base, ParticleSystem *psys)
+{
+ View3D *v3d= G.vd;
+ Object *ob=base->object;
+ ParticleSystemModifierData *psmd;
+ ParticleSettings *part;
+ ParticleData *pars, *pa;
+ ParticleKey state, *states=0;
+ ParticleCacheKey *cache=0;
+ Material *ma;
+ Object *bb_ob=0;
+ float vel[3], vec[3], vec2[3], imat[4][4], onevec[3]={0.0f,0.0f,0.0f}, bb_center[3];
+ float timestep, pixsize=1.0, pa_size, pa_time, r_tilt;
+ float cfra=bsystem_time(ob,(float)CFRA,0.0);
+ float *vdata=0, *vedata=0, *cdata=0, *ndata=0, *vd=0, *ved=0, *cd=0, *nd=0, xvec[3], yvec[3], zvec[3];
+ int a, k, k_max=0, totpart, totpoint=0, draw_as, path_nbr=0;
+ int path_possible=0, keys_possible=0, draw_keys=0, totchild=0;
+ int select=ob->flag&SELECT;
+ GLint polygonmode[2];
+ char val[32];
+
+/* 1. */
+ if(psys==0)
+ return;
+
+ part=psys->part;
+ pars=psys->particles;
+
+ if(part==0 || (psys->flag & PSYS_ENABLED)==0)
+ return;
+
+ if(pars==0) return;
+
+ if(!G.obedit && psys_in_edit_mode(psys)
+ && psys->flag & PSYS_HAIR_DONE && part->draw_as==PART_DRAW_PATH)
+ return;
+
+ if(part->draw_as==PART_DRAW_NOT) return;
+
+/* 2. */
+ if(part->phystype==PART_PHYS_KEYED){
+ if(psys->flag & PSYS_FIRST_KEYED){
+ if(psys->flag&PSYS_KEYED){
+ select=psys_count_keyed_targets(ob,psys);
+ if(psys->totkeyed==0)
+ return;
+ }
+ }
+ else
+ return;
+ }
+
+ if(select){
+ select=0;
+ if(psys_get_current(ob)==psys)
+ select=1;
+ }
+
+ psys->flag|=PSYS_DRAWING;
+
+ if(part->flag&PART_CHILD_RENDER || !psys->childcache)
+ totchild=0;
+ else
+ totchild=psys->totchild*part->disp/100;
+
+ ma= give_current_material(ob,part->omat);
+
+ if(select)
+ cpack(0xFFFFFF);
+ else if(part->draw&PART_DRAW_MAT_COL)
+ glColor3f(ma->r,ma->g,ma->b);
+ else
+ cpack(0);
+
+ psmd= psys_get_modifier(ob,psys);
+
+ timestep= psys_get_timestep(part);
+
+ myloadmatrix(G.vd->viewmat);
+
+ if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) ) {
+ float mat[4][4];
+ Mat4MulMat4(mat, psys->imat, ob->obmat);
+ mymultmatrix(mat);
+ }
+
+ totpart=psys->totpart;
+ draw_as=part->draw_as;
+
+ 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)
+ cfra=bsystem_time(0,(float)CFRA,0.0);
+
+ if(psys->pathcache){
+ path_possible=1;
+ keys_possible=1;
+ }
+ if(draw_as==PART_DRAW_PATH && path_possible==0)
+ draw_as=PART_DRAW_DOT;
+
+ if(draw_as!=PART_DRAW_PATH && keys_possible && part->draw&PART_DRAW_KEYS){
+ path_nbr=part->keys_step;
+ draw_keys=1;
+ }
+
+/* 3. */
+ switch(draw_as){
+ case PART_DRAW_DOT:
+ if(part->draw_size)
+ glPointSize(part->draw_size);
+ else
+ glPointSize(2.0); /* default dot size */
+ break;
+ case PART_DRAW_CIRC:
+ /* calculate view aligned matrix: */
+ Mat4CpyMat4(imat, G.vd->viewinv);
+ Normalize(imat[0]);
+ Normalize(imat[1]);
+ /* no break! */
+ case PART_DRAW_CROSS:
+ case PART_DRAW_AXIS:
+ /* lets calculate the scale: */
+ pixsize= v3d->persmat[0][3]*ob->obmat[3][0]+ v3d->persmat[1][3]*ob->obmat[3][1]+ v3d->persmat[2][3]*ob->obmat[3][2]+ v3d->persmat[3][3];
+ pixsize*= v3d->pixsize;
+ if(part->draw_size==0.0)
+ pixsize*=2.0;
+ else
+ pixsize*=part->draw_size;
+ break;
+ case PART_DRAW_OB:
+ if(part->dup_ob==0)
+ draw_as=PART_DRAW_DOT;
+ else
+ draw_as=0;
+ break;
+ case PART_DRAW_GR:
+ if(part->dup_group==0)
+ draw_as=PART_DRAW_DOT;
+ else
+ draw_as=0;
+ break;
+ case PART_DRAW_BB:
+ if(G.vd->camera==0 && part->bb_ob==0){
+ error("Billboards need an active camera or a target object!");
+
+ draw_as=part->draw_as=PART_DRAW_DOT;
+
+ if(part->draw_size)
+ glPointSize(part->draw_size);
+ else
+ glPointSize(2.0); /* default dot size */
+ }
+ else if(part->bb_ob)
+ bb_ob=part->bb_ob;
+ else
+ bb_ob=G.vd->camera;
+
+ if(part->bb_align<PART_BB_VIEW)
+ onevec[part->bb_align]=1.0f;
+ break;
+ case PART_DRAW_PATH:
+ break;
+ }
+ if(part->draw & PART_DRAW_SIZE && part->draw_as!=PART_DRAW_CIRC){
+ Mat4CpyMat4(imat, G.vd->viewinv);
+ Normalize(imat[0]);
+ Normalize(imat[1]);
+ }
+
+/* 4. */
+ if(draw_as && draw_as!=PART_DRAW_PATH){
+ if(draw_as!=PART_DRAW_CIRC){
+ switch(draw_as){
+ case PART_DRAW_AXIS:
+ cdata=MEM_callocN((totpart+totchild)*(path_nbr+1)*6*3*sizeof(float), "particle_cdata");
+ /* no break! */
+ case PART_DRAW_CROSS:
+ vdata=MEM_callocN((totpart+totchild)*(path_nbr+1)*6*3*sizeof(float), "particle_vdata");
+ break;
+ case PART_DRAW_LINE:
+ vdata=MEM_callocN((totpart+totchild)*(path_nbr+1)*2*3*sizeof(float), "particle_vdata");
+ break;
+ case PART_DRAW_BB:
+ vdata=MEM_callocN((totpart+totchild)*(path_nbr+1)*4*3*sizeof(float), "particle_vdata");
+ ndata=MEM_callocN((totpart+totchild)*(path_nbr+1)*4*3*sizeof(float), "particle_vdata");
+ break;
+ default:
+ vdata=MEM_callocN((totpart+totchild)*(path_nbr+1)*3*sizeof(float), "particle_vdata");
+ }
+ }
+
+ if(part->draw&PART_DRAW_VEL && draw_as!=PART_DRAW_LINE)
+ vedata=MEM_callocN((totpart+totchild)*2*3*(path_nbr+1)*sizeof(float), "particle_vedata");
+
+ vd=vdata;
+ ved=vedata;
+ cd=cdata;
+ nd=ndata;
+
+ psys->lattice=psys_get_lattice(ob,psys);
+ }
+
+ if(draw_as){
+/* 5. */
+ for(a=0,pa=pars; a<totpart+totchild; a++, pa++){
+ if(a<totpart){
+ if(totchild && (part->draw&PART_DRAW_PARENT)==0) continue;
+ if(pa->flag & PARS_NO_DISP || pa->flag & PARS_UNEXIST) continue;
+
+ pa_time=(cfra-pa->time)/pa->lifetime;
+
+ if((part->flag&PART_ABS_TIME)==0 && part->ipo){
+ calc_ipo(part->ipo, 100*pa_time);
+ execute_ipo((ID *)part, part->ipo);
+ }
+
+ pa_size=pa->size;
+
+ r_tilt=1.0f+pa->r_ave[0];
+
+ if(path_nbr){
+ cache=psys->pathcache[a];
+ k_max=(int)(cache->steps);
+ }
+ }
+ else{
+ pa_time=psys_get_child_time(psys,a-totpart,cfra);
+
+ if((part->flag&PART_ABS_TIME)==0 && part->ipo){
+ calc_ipo(part->ipo, 100*pa_time);
+ execute_ipo((ID *)part, part->ipo);
+ }
+
+ pa_size=psys_get_child_size(psys,a-totpart,cfra,0);
+
+ r_tilt=2.0f*psys->child[a-totpart].rand[2];
+ if(path_nbr){
+ cache=psys->childcache[a-totpart];
+ k_max=(int)(cache->steps);
+ }
+ }
+
+ if(draw_as!=PART_DRAW_PATH){
+ int next_pa=0;
+ for(k=0; k<=path_nbr; k++){
+ if(draw_keys){
+ state.time=(float)k/(float)path_nbr;
+ psys_get_particle_on_path(ob,psys,a,&state,1);
+ }
+ else if(path_nbr){
+ if(k<=k_max){
+ VECCOPY(state.co,(cache+k)->co);
+ VECCOPY(state.vel,(cache+k)->vel);
+ QUATCOPY(state.rot,(cache+k)->rot);
+ }
+ else
+ continue;
+ }
+ else{
+ state.time=cfra;
+ if(psys_get_particle_state(ob,psys,a,&state,0)==0){
+ next_pa=1;
+ break;
+ }
+ }
+
+ switch(draw_as){
+ case PART_DRAW_DOT:
+ if(vd){
+ VECCOPY(vd,state.co) vd+=3;
+ }
+ break;
+ case PART_DRAW_CROSS:
+ case PART_DRAW_AXIS:
+ vec[0]=2.0f*pixsize;
+ vec[1]=vec[2]=0.0;
+ QuatMulVecf(state.rot,vec);
+ if(draw_as==PART_DRAW_AXIS){
+ cd[1]=cd[2]=cd[4]=cd[5]=0.0;
+ cd[0]=cd[3]=1.0;
+ cd[6]=cd[8]=cd[9]=cd[11]=0.0;
+ cd[7]=cd[10]=1.0;
+ cd[13]=cd[12]=cd[15]=cd[16]=0.0;
+ cd[14]=cd[17]=1.0;
+ cd+=18;
+
+ VECCOPY(vec2,state.co);
+ }
+ else VECSUB(vec2,state.co,vec);
+
+ VECADD(vec,state.co,vec);
+ VECCOPY(vd,vec); vd+=3;
+ VECCOPY(vd,vec2); vd+=3;
+
+ vec[1]=2.0f*pixsize;
+ vec[0]=vec[2]=0.0;
+ QuatMulVecf(state.rot,vec);
+ if(draw_as==PART_DRAW_AXIS){
+ VECCOPY(vec2,state.co);
+ }
+ else VECSUB(vec2,state.co,vec);
+
+ VECADD(vec,state.co,vec);
+ VECCOPY(vd,vec); vd+=3;
+ VECCOPY(vd,vec2); vd+=3;
+
+ vec[2]=2.0f*pixsize;
+ vec[0]=vec[1]=0.0;
+ QuatMulVecf(state.rot,vec);
+ if(draw_as==PART_DRAW_AXIS){
+ VECCOPY(vec2,state.co);
+ }
+ else VECSUB(vec2,state.co,vec);
+
+ VECADD(vec,state.co,vec);
+
+ VECCOPY(vd,vec); vd+=3;
+ VECCOPY(vd,vec2); vd+=3;
+ break;
+ case PART_DRAW_LINE:
+ VECCOPY(vec,state.vel);
+ Normalize(vec);
+ if(part->draw & PART_DRAW_VEL_LENGTH)
+ VecMulf(vec,VecLength(state.vel));
+ VECADDFAC(vd,state.co,vec,-part->draw_line[0]); vd+=3;
+ VECADDFAC(vd,state.co,vec,part->draw_line[1]); vd+=3;
+ break;
+ case PART_DRAW_CIRC:
+ drawcircball(GL_LINE_LOOP, state.co, pixsize, imat);
+ break;
+ case PART_DRAW_BB:
+ if(part->draw&PART_DRAW_BB_LOCK && part->bb_align==PART_BB_VIEW){
+ VECCOPY(xvec,bb_ob->obmat[0]);
+ Normalize(xvec);
+ VECCOPY(yvec,bb_ob->obmat[1]);
+ Normalize(yvec);
+ VECCOPY(zvec,bb_ob->obmat[2]);
+ Normalize(zvec);
+ }
+ else if(part->bb_align==PART_BB_VEL){
+ float temp[3];
+ VECCOPY(temp,state.vel);
+ Normalize(temp);
+ VECSUB(zvec,bb_ob->obmat[3],state.co);
+ if(part->draw&PART_DRAW_BB_LOCK){
+ float fac=-Inpf(zvec,temp);
+ VECADDFAC(zvec,zvec,temp,fac);
+ }
+ Normalize(zvec);
+ Crossf(xvec,temp,zvec);
+ Normalize(xvec);
+ Crossf(yvec,zvec,xvec);
+ }
+ else{
+ VECSUB(zvec,bb_ob->obmat[3],state.co);
+ if(part->draw&PART_DRAW_BB_LOCK)
+ zvec[part->bb_align]=0.0f;
+ Normalize(zvec);
+
+ if(part->bb_align<PART_BB_VIEW)
+ Crossf(xvec,onevec,zvec);
+ else
+ Crossf(xvec,bb_ob->obmat[1],zvec);
+ Normalize(xvec);
+ Crossf(yvec,zvec,xvec);
+ }
+
+ VECCOPY(vec,xvec);
+ VECCOPY(vec2,yvec);
+
+ VecMulf(xvec,cos(part->bb_tilt*(1.0f-part->bb_rand_tilt*r_tilt)*(float)M_PI));
+ VecMulf(vec2,sin(part->bb_tilt*(1.0f-part->bb_rand_tilt*r_tilt)*(float)M_PI));
+ VECADD(xvec,xvec,vec2);
+
+ VecMulf(yvec,cos(part->bb_tilt*(1.0f-part->bb_rand_tilt*r_tilt)*(float)M_PI));
+ VecMulf(vec,-sin(part->bb_tilt*(1.0f-part->bb_rand_tilt*r_tilt)*(float)M_PI));
+ VECADD(yvec,yvec,vec);
+
+ VecMulf(xvec,pa_size);
+ VecMulf(yvec,pa_size);
+
+ VECADDFAC(bb_center,state.co,xvec,part->bb_offset[0]);
+ VECADDFAC(bb_center,bb_center,yvec,part->bb_offset[1]);
+
+ VECADD(vd,bb_center,xvec);
+ VECADD(vd,vd,yvec); vd+=3;
+
+ VECSUB(vd,bb_center,xvec);
+ VECADD(vd,vd,yvec); vd+=3;
+
+ VECSUB(vd,bb_center,xvec);
+ VECSUB(vd,vd,yvec); vd+=3;
+
+ VECADD(vd,bb_center,xvec);
+ VECSUB(vd,vd,yvec); vd+=3;
+
+ VECCOPY(nd, zvec); nd+=3;
+ VECCOPY(nd, zvec); nd+=3;
+ VECCOPY(nd, zvec); nd+=3;
+ VECCOPY(nd, zvec); nd+=3;
+ break;
+ }
+
+ if(vedata){
+ VECCOPY(ved,state.co);
+ ved+=3;
+ VECCOPY(vel,state.vel);
+ VecMulf(vel,timestep);
+ VECADD(ved,state.co,vel);
+ ved+=3;
+ }
+
+ if(part->draw & PART_DRAW_SIZE){
+ setlinestyle(3);
+ drawcircball(GL_LINE_LOOP, state.co, pa_size, imat);
+ setlinestyle(0);
+ }
+
+ totpoint++;
+ }
+ if(next_pa)
+ continue;
+ if(part->draw&PART_DRAW_NUM){
+ /* in path drawing state.co is the end point */
+ glRasterPos3f(state.co[0], state.co[1], state.co[2]);
+ sprintf(val," %i",a);
+ BMF_DrawString(G.font, val);
+ }
+ }
+ }
+/* 6. */
+
+ glGetIntegerv(GL_POLYGON_MODE, polygonmode);
+
+ if(draw_as != PART_DRAW_CIRC){
+ glDisableClientState(GL_NORMAL_ARRAY);
+
+ if(draw_as==PART_DRAW_PATH){
+ ParticleCacheKey **cache, *path;
+ float *cd2=0,*cdata2=0;
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glEnable(GL_LIGHTING);
+
+ if(totchild && (part->draw&PART_DRAW_PARENT)==0)
+ totpart=0;
+
+ cache=psys->pathcache;
+ for(a=0, pa=psys->particles; a<totpart; a++, pa++){
+ path=cache[a];
+ glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co);
+ glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel);
+ glDrawArrays(GL_LINE_STRIP, 0, path->steps + 1);
+ }
+
+ cache=psys->childcache;
+ for(a=0; a<totchild; a++){
+ path=cache[a];
+ glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), path->co);
+ glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), path->vel);
+ glDrawArrays(GL_LINE_STRIP, 0, path->steps + 1);
+ }
+ if(cdata2)
+ MEM_freeN(cdata2);
+ cd2=cdata2=0;
+
+ glLineWidth(1.0f);
+
+ /* draw particle edit mode key points*/
+ }
+
+ if(draw_as!=PART_DRAW_PATH){
+ glDisableClientState(GL_COLOR_ARRAY);
+
+ if(vdata){
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, vdata);
+ }
+ else
+ glDisableClientState(GL_VERTEX_ARRAY);
+
+ if(ndata && MIN2(G.vd->drawtype, ob->dt)>OB_WIRE){
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glNormalPointer(GL_FLOAT, 0, ndata);
+ glEnable(GL_LIGHTING);
+ }
+ else{
+ glDisableClientState(GL_NORMAL_ARRAY);
+ glDisable(GL_LIGHTING);
+ }
+
+ switch(draw_as){
+ case PART_DRAW_AXIS:
+ case PART_DRAW_CROSS:
+ if(cdata){
+ glEnableClientState(GL_COLOR_ARRAY);
+ glColorPointer(3, GL_FLOAT, 0, cdata);
+ }
+ glDrawArrays(GL_LINES, 0, 6*totpoint);
+ break;
+ case PART_DRAW_LINE:
+ glDrawArrays(GL_LINES, 0, 2*totpoint);
+ break;
+ case PART_DRAW_BB:
+ if(MIN2(G.vd->drawtype, ob->dt)<=OB_WIRE)
+ glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
+
+ glDrawArrays(GL_QUADS, 0, 4*totpoint);
+ break;
+ default:
+ glDrawArrays(GL_POINTS, 0, totpoint);
+ break;
+ }
+ }
+
+ }
+ if(vedata){
+ glDisableClientState(GL_COLOR_ARRAY);
+ cpack(0xC0C0C0);
+
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, vedata);
+
+ glDrawArrays(GL_LINES, 0, 2*totpoint);
+ }
+
+ glPolygonMode(GL_FRONT, polygonmode[0]);
+ glPolygonMode(GL_BACK, polygonmode[1]);
+ }
+
+/* 7. */
+
+ glDisable(GL_LIGHTING);
+ glDisableClientState(GL_COLOR_ARRAY);
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glEnable(GL_DEPTH_TEST);
+
+ if(states)
+ MEM_freeN(states);
+ if(vdata)
+ MEM_freeN(vdata);
+ if(vedata)
+ MEM_freeN(vedata);
+ if(cdata)
+ MEM_freeN(cdata);
+ if(ndata)
+ MEM_freeN(ndata);
+
+ psys->flag &= ~PSYS_DRAWING;
+
+ if(psys->lattice){
+ end_latt_deform();
+ psys->lattice=0;
+ }
+
+ myloadmatrix(G.vd->viewmat);
+ mymultmatrix(ob->obmat); // bring back local matrix for dtx
+}
+
+static void draw_particle_edit(Object *ob, ParticleSystem *psys)
+{
+ ParticleEdit *edit = psys->edit;
+ ParticleData *pa;
+ ParticleCacheKey **path;
+ ParticleEditKey *key;
+ ParticleEditSettings *pset = PE_settings();
+ /*Mesh *me= (Mesh*)ob->data;*/
+ Material *ma;
+ int i, k, totpart = psys->totpart, totchild=0, timed = pset->draw_timed;
+ char nosel[4], sel[4];
+ float sel_col[3];
+ float nosel_col[3];
+ char val[32];
+
+ if(psys->pathcache==0){
+ PE_hide_keys_time(psys,CFRA);
+ psys_cache_paths(ob,psys,CFRA,0);
+ }
+
+ if(pset->flag & PE_SHOW_CHILD && psys->part->draw_as == PART_DRAW_PATH) {
+ if(psys->childcache==0)
+ psys_cache_child_paths(ob, psys, CFRA, 0);
+ }
+ else if(psys->childcache)
+ free_child_path_cache(psys);
+
+ if((G.vd->flag & V3D_ZBUF_SELECT)==0)
+ glDisable(GL_DEPTH_TEST);
+
+ myloadmatrix(G.vd->viewmat);
+
+ BIF_GetThemeColor3ubv(TH_VERTEX_SELECT, sel);
+ BIF_GetThemeColor3ubv(TH_VERTEX, nosel);
+ sel_col[0]=(float)sel[0]/255.0f;
+ sel_col[1]=(float)sel[1]/255.0f;
+ sel_col[2]=(float)sel[2]/255.0f;
+ nosel_col[0]=(float)nosel[0]/255.0f;
+ nosel_col[1]=(float)nosel[1]/255.0f;
+ nosel_col[2]=(float)nosel[2]/255.0f;
+
+ if(psys->childcache)
+ totchild = psys->totchildcache;
+
+ /* draw paths */
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
+ if(timed)
+ glEnable(GL_BLEND);
+
+ if(pset->brushtype == PE_BRUSH_WEIGHT){
+ glLineWidth(2.0f);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glDisable(GL_LIGHTING);
+ }
+
+ for(i=0, pa=psys->particles, path = psys->pathcache; i<totpart; i++, pa++, path++){
+ /*if(me->mface[pa->num].flag & ME_HIDE)
+ continue;*/
+
+ glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->co);
+ glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), (*path)->vel);
+ glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->col);
+
+ glDrawArrays(GL_LINE_STRIP, 0, (int)(*path)->steps + 1);
+ }
+
+ if(psys->part->draw&PART_DRAW_MAT_COL) {
+ ma= give_current_material(ob,psys->part->omat);
+ glColor3f(ma->r,ma->g,ma->b);
+ glDisableClientState(GL_COLOR_ARRAY);
+ }
+ glEnable(GL_LIGHTING);
+
+ for(i=0, path=psys->childcache; i<totchild; i++,path++){
+ glVertexPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->co);
+ glNormalPointer(GL_FLOAT, sizeof(ParticleCacheKey), (*path)->vel);
+ glColorPointer(3, GL_FLOAT, sizeof(ParticleCacheKey), (*path)->col);
+
+ glDrawArrays(GL_LINE_STRIP, 0, (int)(*path)->steps + 1);
+ }
+
+ /* draw edit vertices */
+ if(G.scene->selectmode!=SCE_SELECT_PATH){
+ glDisableClientState(GL_NORMAL_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glDisable(GL_LIGHTING);
+ glPointSize(4.0f);
+
+ if(G.scene->selectmode==SCE_SELECT_POINT){
+ float *cd=0,*cdata=0;
+ cd=cdata=MEM_callocN(edit->totkeys*(timed?4:3)*sizeof(float), "particle edit color data");
+
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++){
+ for(k=0, key=edit->keys[i]; k<pa->totkey; k++, key++){
+ if(key->flag&PEK_SELECT){
+ VECCOPY(cd,sel_col);
+ }
+ else{
+ VECCOPY(cd,nosel_col);
+ }
+ if(timed)
+ *(cd+3) = (key->flag&PEK_HIDE)?0.0f:1.0f;
+ cd += (timed?4:3);
+ }
+ }
+ cd=cdata;
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++){
+ if((pa->flag & PARS_HIDE)==0){
+ glVertexPointer(3, GL_FLOAT, sizeof(ParticleEditKey), edit->keys[i]->world_co);
+ glColorPointer((timed?4:3), GL_FLOAT, (timed?4:3)*sizeof(float), cd);
+ glDrawArrays(GL_POINTS, 0, pa->totkey);
+ }
+ cd += (timed?4:3) * pa->totkey;
+
+ if(pset->flag&PE_SHOW_TIME && (pa->flag&PARS_HIDE)==0){
+ for(k=0, key=edit->keys[i]+k; k<pa->totkey; k++, key++){
+ if(key->flag & PEK_HIDE) continue;
+
+ glRasterPos3fv(key->world_co);
+ sprintf(val," %.1f",*key->time);
+ BMF_DrawString(G.font, val);
+ }
+ }
+ }
+ if(cdata)
+ MEM_freeN(cdata);
+ cd=cdata=0;
+ }
+ else if(G.scene->selectmode == SCE_SELECT_END){
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++){
+ if((pa->flag & PARS_HIDE)==0){
+ key = edit->keys[i] + pa->totkey - 1;
+ if(key->flag & PEK_SELECT)
+ glColor3fv(sel_col);
+ else
+ glColor3fv(nosel_col);
+ /* has to be like this.. otherwise selection won't work, have try glArrayElement later..*/
+ glBegin(GL_POINTS);
+ glVertex3fv(key->world_co);
+ glEnd();
+
+ if(pset->flag & PE_SHOW_TIME){
+ glRasterPos3fv(key->world_co);
+ sprintf(val," %.1f",*key->time);
+ BMF_DrawString(G.font, val);
+ }
+ }
+ }
+ }
+ }
+
+ glDisable(GL_BLEND);
+ glDisable(GL_LIGHTING);
+ glDisableClientState(GL_COLOR_ARRAY);
+ glEnableClientState(GL_NORMAL_ARRAY);
+ glEnable(GL_DEPTH_TEST);
+ glLineWidth(1.0f);
+
+ mymultmatrix(ob->obmat); // bring back local matrix for dtx
+}
+
unsigned int nurbcol[8]= {
0, 0x9090, 0x409030, 0x603080, 0, 0x40fff0, 0x40c033, 0xA090F0 };
@@ -2727,8 +3706,8 @@ static void tekenhandlesN(Nurb *nu, short sel)
float *fp;
unsigned int *col;
int a;
-
- if(nu->hide) return;
+
+ if(nu->hide || (G.f & G_HIDDENHANDLES)) return;
glBegin(GL_LINES);
@@ -2795,9 +3774,13 @@ static void tekenvertsN(Nurb *nu, short sel)
a= nu->pntsu;
while(a--) {
if(bezt->hide==0) {
- if((bezt->f1 & 1)==sel) bglVertex3fv(bezt->vec[0]);
- if((bezt->f2 & 1)==sel) bglVertex3fv(bezt->vec[1]);
- if((bezt->f3 & 1)==sel) bglVertex3fv(bezt->vec[2]);
+ if (G.f & G_HIDDENHANDLES) {
+ if((bezt->f2 & 1)==sel) bglVertex3fv(bezt->vec[1]);
+ } else {
+ if((bezt->f1 & 1)==sel) bglVertex3fv(bezt->vec[0]);
+ if((bezt->f2 & 1)==sel) bglVertex3fv(bezt->vec[1]);
+ if((bezt->f3 & 1)==sel) bglVertex3fv(bezt->vec[2]);
+ }
}
bezt++;
}
@@ -3041,72 +4024,6 @@ static void drawspiral(float *cent, float rad, float tmat[][4], int start)
float vec[3], vx[3], vy[3];
int a, tot=32;
char inverse=0;
- /* 32 values of sin function (still same result!) */
- static float si[32] = {0.00000000,
- 0.20129852,
- 0.39435585,
- 0.57126821,
- 0.72479278,
- 0.84864425,
- 0.93775213,
- 0.98846832,
- 0.99871650,
- 0.96807711,
- 0.89780453,
- 0.79077573,
- 0.65137248,
- 0.48530196,
- 0.29936312,
- 0.10116832,
- -0.10116832,
- -0.29936312,
- -0.48530196,
- -0.65137248,
- -0.79077573,
- -0.89780453,
- -0.96807711,
- -0.99871650,
- -0.98846832,
- -0.93775213,
- -0.84864425,
- -0.72479278,
- -0.57126821,
- -0.39435585,
- -0.20129852,
- 0.00000000};
- /* 32 values of cos function (still same result!) */
- static float co[32] ={1.00000000,
- 0.97952994,
- 0.91895781,
- 0.82076344,
- 0.68896691,
- 0.52896401,
- 0.34730525,
- 0.15142777,
- -0.05064916,
- -0.25065253,
- -0.44039415,
- -0.61210598,
- -0.75875812,
- -0.87434661,
- -0.95413925,
- -0.99486932,
- -0.99486932,
- -0.95413925,
- -0.87434661,
- -0.75875812,
- -0.61210598,
- -0.44039415,
- -0.25065253,
- -0.05064916,
- 0.15142777,
- 0.34730525,
- 0.52896401,
- 0.68896691,
- 0.82076344,
- 0.91895781,
- 0.97952994,
- 1.00000000};
if (start < 0) {
inverse = 1;
@@ -3126,103 +4043,58 @@ static void drawspiral(float *cent, float rad, float tmat[][4], int start)
start=-a + 1;
glBegin(GL_LINES);
glVertex3fv(vec);
- vec[0]= cent[0] + *(si+a+start) * (vx[0] * (float)a/(float)tot) + *(co+a+start) * (vy[0] * (float)a/(float)tot);
- vec[1]= cent[1] + *(si+a+start) * (vx[1] * (float)a/(float)tot) + *(co+a+start) * (vy[1] * (float)a/(float)tot);
- vec[2]= cent[2] + *(si+a+start) * (vx[2] * (float)a/(float)tot) + *(co+a+start) * (vy[2] * (float)a/(float)tot);
+ vec[0]= cent[0] + *(sinval+a+start) * (vx[0] * (float)a/(float)tot) + *(cosval+a+start) * (vy[0] * (float)a/(float)tot);
+ vec[1]= cent[1] + *(sinval+a+start) * (vx[1] * (float)a/(float)tot) + *(cosval+a+start) * (vy[1] * (float)a/(float)tot);
+ vec[2]= cent[2] + *(sinval+a+start) * (vx[2] * (float)a/(float)tot) + *(cosval+a+start) * (vy[2] * (float)a/(float)tot);
glVertex3fv(vec);
glEnd();
}
}
else {
a=0;
- vec[0]= cent[0] + *(si+a+start) * (vx[0] * (float)(-a+31)/(float)tot) + *(co+a+start) * (vy[0] * (float)(-a+31)/(float)tot);
- vec[1]= cent[1] + *(si+a+start) * (vx[1] * (float)(-a+31)/(float)tot) + *(co+a+start) * (vy[1] * (float)(-a+31)/(float)tot);
- vec[2]= cent[2] + *(si+a+start) * (vx[2] * (float)(-a+31)/(float)tot) + *(co+a+start) * (vy[2] * (float)(-a+31)/(float)tot);
+ vec[0]= cent[0] + *(sinval+a+start) * (vx[0] * (float)(-a+31)/(float)tot) + *(cosval+a+start) * (vy[0] * (float)(-a+31)/(float)tot);
+ vec[1]= cent[1] + *(sinval+a+start) * (vx[1] * (float)(-a+31)/(float)tot) + *(cosval+a+start) * (vy[1] * (float)(-a+31)/(float)tot);
+ vec[2]= cent[2] + *(sinval+a+start) * (vx[2] * (float)(-a+31)/(float)tot) + *(cosval+a+start) * (vy[2] * (float)(-a+31)/(float)tot);
for(a=0; a<tot; a++) {
if (a+start>31)
start=-a + 1;
glBegin(GL_LINES);
glVertex3fv(vec);
- vec[0]= cent[0] + *(si+a+start) * (vx[0] * (float)(-a+31)/(float)tot) + *(co+a+start) * (vy[0] * (float)(-a+31)/(float)tot);
- vec[1]= cent[1] + *(si+a+start) * (vx[1] * (float)(-a+31)/(float)tot) + *(co+a+start) * (vy[1] * (float)(-a+31)/(float)tot);
- vec[2]= cent[2] + *(si+a+start) * (vx[2] * (float)(-a+31)/(float)tot) + *(co+a+start) * (vy[2] * (float)(-a+31)/(float)tot);
+ vec[0]= cent[0] + *(sinval+a+start) * (vx[0] * (float)(-a+31)/(float)tot) + *(cosval+a+start) * (vy[0] * (float)(-a+31)/(float)tot);
+ vec[1]= cent[1] + *(sinval+a+start) * (vx[1] * (float)(-a+31)/(float)tot) + *(cosval+a+start) * (vy[1] * (float)(-a+31)/(float)tot);
+ vec[2]= cent[2] + *(sinval+a+start) * (vx[2] * (float)(-a+31)/(float)tot) + *(cosval+a+start) * (vy[2] * (float)(-a+31)/(float)tot);
glVertex3fv(vec);
glEnd();
}
}
}
+/* draws a circle on x-z plane given the scaling of the circle, assuming that
+ * all required matrices have been set (used for drawing empties)
+ */
+static void drawcircle_size(float size)
+{
+ float x, y;
+ short degrees;
+
+ glBegin(GL_LINE_LOOP);
+
+ /* coordinates are: cos(degrees*11.25)=x, sin(degrees*11.25)=y, 0.0f=z */
+ for (degrees=0; degrees<32; degrees++) {
+ x= *(cosval + degrees);
+ y= *(sinval + degrees);
+
+ glVertex3f(x*size, 0.0f, y*size);
+ }
+
+ glEnd();
+
+}
+
void drawcircball(int mode, float *cent, float rad, float tmat[][4])
{
float vec[3], vx[3], vy[3];
int a, tot=32;
-
- /* 32 values of sin function (still same result!) */
- static float si[32] = {0.00000000,
- 0.20129852,
- 0.39435585,
- 0.57126821,
- 0.72479278,
- 0.84864425,
- 0.93775213,
- 0.98846832,
- 0.99871650,
- 0.96807711,
- 0.89780453,
- 0.79077573,
- 0.65137248,
- 0.48530196,
- 0.29936312,
- 0.10116832,
- -0.10116832,
- -0.29936312,
- -0.48530196,
- -0.65137248,
- -0.79077573,
- -0.89780453,
- -0.96807711,
- -0.99871650,
- -0.98846832,
- -0.93775213,
- -0.84864425,
- -0.72479278,
- -0.57126821,
- -0.39435585,
- -0.20129852,
- 0.00000000};
- /* 32 values of cos function (still same result!) */
- static float co[32] ={1.00000000,
- 0.97952994,
- 0.91895781,
- 0.82076344,
- 0.68896691,
- 0.52896401,
- 0.34730525,
- 0.15142777,
- -0.05064916,
- -0.25065253,
- -0.44039415,
- -0.61210598,
- -0.75875812,
- -0.87434661,
- -0.95413925,
- -0.99486932,
- -0.99486932,
- -0.95413925,
- -0.87434661,
- -0.75875812,
- -0.61210598,
- -0.44039415,
- -0.25065253,
- -0.05064916,
- 0.15142777,
- 0.34730525,
- 0.52896401,
- 0.68896691,
- 0.82076344,
- 0.91895781,
- 0.97952994,
- 1.00000000};
VECCOPY(vx, tmat[0]);
VECCOPY(vy, tmat[1]);
@@ -3231,14 +4103,56 @@ void drawcircball(int mode, float *cent, float rad, float tmat[][4])
glBegin(mode);
for(a=0; a<tot; a++) {
- vec[0]= cent[0] + *(si+a) * vx[0] + *(co+a) * vy[0];
- vec[1]= cent[1] + *(si+a) * vx[1] + *(co+a) * vy[1];
- vec[2]= cent[2] + *(si+a) * vx[2] + *(co+a) * vy[2];
+ vec[0]= cent[0] + *(sinval+a) * vx[0] + *(cosval+a) * vy[0];
+ vec[1]= cent[1] + *(sinval+a) * vx[1] + *(cosval+a) * vy[1];
+ vec[2]= cent[2] + *(sinval+a) * vx[2] + *(cosval+a) * vy[2];
glVertex3fv(vec);
}
glEnd();
}
+/* needs fixing if non-identity matrice used */
+static void drawtube(float *vec, float radius, float height, float tmat[][4])
+{
+ float cur[3];
+ drawcircball(GL_LINE_LOOP, vec, radius, tmat);
+
+ VecCopyf(cur,vec);
+ cur[2]+=height;
+
+ drawcircball(GL_LINE_LOOP, cur, radius, tmat);
+
+ glBegin(GL_LINES);
+ glVertex3f(vec[0]+radius,vec[1],vec[2]);
+ glVertex3f(cur[0]+radius,cur[1],cur[2]);
+ glVertex3f(vec[0]-radius,vec[1],vec[2]);
+ glVertex3f(cur[0]-radius,cur[1],cur[2]);
+ glVertex3f(vec[0],vec[1]+radius,vec[2]);
+ glVertex3f(cur[0],cur[1]+radius,cur[2]);
+ glVertex3f(vec[0],vec[1]-radius,vec[2]);
+ glVertex3f(cur[0],cur[1]-radius,cur[2]);
+ glEnd();
+}
+/* needs fixing if non-identity matrice used */
+static void drawcone(float *vec, float radius, float height, float tmat[][4])
+{
+ float cur[3];
+
+ VecCopyf(cur,vec);
+ cur[2]+=height;
+ drawcircball(GL_LINE_LOOP, cur, radius, tmat);
+
+ glBegin(GL_LINES);
+ glVertex3f(vec[0],vec[1],vec[2]);
+ glVertex3f(cur[0]+radius,cur[1],cur[2]);
+ glVertex3f(vec[0],vec[1],vec[2]);
+ glVertex3f(cur[0]-radius,cur[1],cur[2]);
+ glVertex3f(vec[0],vec[1],vec[2]);
+ glVertex3f(cur[0],cur[1]+radius,cur[2]);
+ glVertex3f(vec[0],vec[1],vec[2]);
+ glVertex3f(cur[0],cur[1]-radius,cur[2]);
+ glEnd();
+}
/* return 1 if nothing was drawn */
static int drawmball(Base *base, int dt)
{
@@ -3368,7 +4282,7 @@ static void draw_forcefield(Object *ob)
else if (pd->forcefield == PFIELD_VORTEX) {
float ffall_val, force_val;
- Mat4One(imat);
+ Mat4One(tmat);
if (has_ipo_code(ob->ipo, OB_PD_FFALL))
ffall_val = IPO_GetFloatValue(ob->ipo, OB_PD_FFALL, G.scene->r.cfra);
else
@@ -3381,12 +4295,12 @@ static void draw_forcefield(Object *ob)
BIF_ThemeColorBlend(curcol, TH_BACK, 0.7);
if (force_val < 0) {
- drawspiral(vec, size*1.0, imat, 1);
- drawspiral(vec, size*1.0, imat, 16);
+ drawspiral(vec, size*1.0, tmat, 1);
+ drawspiral(vec, size*1.0, tmat, 16);
}
else {
- drawspiral(vec, size*1.0, imat, -1);
- drawspiral(vec, size*1.0, imat, -16);
+ drawspiral(vec, size*1.0, tmat, -1);
+ drawspiral(vec, size*1.0, tmat, -16);
}
}
else if (pd->forcefield == PFIELD_GUIDE && ob->type==OB_CURVE) {
@@ -3414,14 +4328,66 @@ static void draw_forcefield(Object *ob)
VECCOPY(vec, guidevec1); /* max center */
}
}
-
- /* as last, guide curve alters it */
- if(pd->flag & PFIELD_USEMAX) {
- setlinestyle(3);
- BIF_ThemeColorBlend(curcol, TH_BACK, 0.5);
- drawcircball(GL_LINE_LOOP, vec, pd->maxdist, imat);
- setlinestyle(0);
+
+ setlinestyle(3);
+ BIF_ThemeColorBlend(curcol, TH_BACK, 0.5);
+
+ if(pd->falloff==PFIELD_FALL_SPHERE){
+ /* as last, guide curve alters it */
+ if(pd->flag & PFIELD_USEMAX)
+ drawcircball(GL_LINE_LOOP, vec, pd->maxdist, imat);
+
+ if(pd->flag & PFIELD_USEMIN)
+ drawcircball(GL_LINE_LOOP, vec, pd->mindist, imat);
+ }
+ else if(pd->falloff==PFIELD_FALL_TUBE){
+ float radius,distance;
+
+ Mat4One(tmat);
+
+ vec[0]=vec[1]=0.0f;
+ radius=(pd->flag&PFIELD_USEMAXR)?pd->maxrad:1.0f;
+ distance=(pd->flag&PFIELD_USEMAX)?pd->maxdist:0.0f;
+ vec[2]=distance;
+ distance=(pd->flag&PFIELD_POSZ)?-distance:-2.0f*distance;
+
+ if(pd->flag & (PFIELD_USEMAX|PFIELD_USEMAXR))
+ drawtube(vec,radius,distance,tmat);
+
+ radius=(pd->flag&PFIELD_USEMINR)?pd->minrad:1.0f;
+ distance=(pd->flag&PFIELD_USEMIN)?pd->mindist:0.0f;
+ vec[2]=distance;
+ distance=(pd->flag&PFIELD_POSZ)?-distance:-2.0f*distance;
+
+ if(pd->flag & (PFIELD_USEMIN|PFIELD_USEMINR))
+ drawtube(vec,radius,distance,tmat);
+ }
+ else if(pd->falloff==PFIELD_FALL_CONE){
+ float radius,distance;
+
+ Mat4One(tmat);
+
+ radius=(pd->flag&PFIELD_USEMAXR)?pd->maxrad:1.0f;
+ radius*=(float)M_PI/180.0f;
+ 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);
+ if((pd->flag & PFIELD_POSZ)==0)
+ drawcone(vec,distance*sin(radius),-distance*cos(radius),tmat);
+ }
+
+ radius=(pd->flag&PFIELD_USEMINR)?pd->minrad:1.0f;
+ radius*=(float)M_PI/180.0f;
+ 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);
+ if((pd->flag & PFIELD_POSZ)==0)
+ drawcone(vec,distance*sin(radius),-distance*cos(radius),tmat);
+ }
}
+ setlinestyle(0);
}
static void draw_box(float vec[8][3])
@@ -3868,7 +4834,7 @@ void draw_object(Base *base, int flag)
dtx= 0;
/* faceselect exception: also draw solid when dt==wire, except in editmode */
- if(ob==OBACT && (G.f & (G_FACESELECT+G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT))) {
+ if(ob==OBACT && (G.f & (G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT))) {
if(ob->type==OB_MESH) {
if(ob==G.obedit);
@@ -4071,6 +5037,26 @@ void draw_object(Base *base, int flag)
}
if(ob->pd && ob->pd->forcefield) draw_forcefield(ob);
+ /* code for new particle system */
+ if(warning_recursive==0 && (flag & DRAW_PICKING)==0){
+ glDepthMask(GL_FALSE);
+ if(col || (ob->flag & SELECT)) cpack(0xFFFFFF); /* for visibility, also while wpaint */
+ if(ob->particlesystem.first) {
+ ParticleSystem *psys;
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next)
+ draw_new_particle_system(base, psys);
+
+ if(G.f & G_PARTICLEEDIT && ob==OBACT) {
+ psys= PE_get_current(ob);
+ if(psys && !G.obedit && psys_in_edit_mode(psys))
+ draw_particle_edit(ob, psys);
+ }
+ }
+ if(col) cpack(col);
+ glDepthMask(GL_TRUE);
+ }
+
{
bConstraint *con;
for(con=ob->constraints.first; con; con= con->next)
@@ -4102,7 +5088,7 @@ void draw_object(Base *base, int flag)
BMF_DrawString(G.font, ob->id.name+2);
}
}
- if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);
+ /*if(dtx & OB_DRAWIMAGE) drawDispListwire(&ob->disp);*/
if((dtx & OB_DRAWWIRE) && dt>=OB_SOLID) drawWireExtra(ob);
}
@@ -4129,7 +5115,7 @@ void draw_object(Base *base, int flag)
if(G.f & G_SIMULATION) return;
/* object centers, need to be drawn in viewmat space for speed, but OK for picking select */
- if(ob!=OBACT || (G.f & (G_VERTEXPAINT|G_FACESELECT|G_TEXTUREPAINT|G_WEIGHTPAINT))==0) {
+ if(ob!=OBACT || (G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))==0) {
int do_draw_center= -1; /* defines below are zero or positive... */
if((G.scene->basact)==base)
@@ -4161,10 +5147,10 @@ void draw_object(Base *base, int flag)
/* not for sets, duplicators or picking */
if(flag==0 && (!(G.vd->flag & V3D_HIDE_HELPLINES))) {
ListBase *list;
-
+
/* draw hook center and offset line */
if(ob!=G.obedit) draw_hooks(ob);
-
+
/* help lines and so */
if(ob!=G.obedit && ob->parent && (ob->parent->lay & G.vd->lay)) {
setlinestyle(3);
@@ -4177,29 +5163,46 @@ void draw_object(Base *base, int flag)
/* Drawing the constraint lines */
list = &ob->constraints;
- if (list){
- /*
- extern void make_axis_color(char *col, char *col2, char axis); // drawview.c
- */
+ if (list) {
bConstraint *curcon;
- float size[3], tmat[4][4];
+ bConstraintOb *cob;
char col[4], col2[4];
-
+
BIF_GetThemeColor3ubv(TH_GRID, col);
make_axis_color(col, col2, 'z');
glColor3ubv((GLubyte *)col2);
-
- for (curcon = list->first; curcon; curcon=curcon->next){
- if ((curcon->flag & CONSTRAINT_EXPAND)&&(curcon->type!=CONSTRAINT_TYPE_NULL)&&(constraint_has_target(curcon))){
- get_constraint_target_matrix(curcon, TARGET_OBJECT, NULL, tmat, size, bsystem_time(ob, 0, (float)(G.scene->r.cfra), ob->sf));
- setlinestyle(3);
- glBegin(GL_LINES);
- glVertex3fv(tmat[3]);
- glVertex3fv(ob->obmat[3]);
- glEnd();
- setlinestyle(0);
+
+ cob= constraints_make_evalob(ob, NULL, CONSTRAINT_OBTYPE_OBJECT);
+
+ for (curcon = list->first; curcon; curcon=curcon->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(curcon);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if ((curcon->flag & CONSTRAINT_EXPAND) && (cti) && (cti->get_constraint_targets)) {
+ cti->get_constraint_targets(curcon, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ /* calculate target's matrix */
+ if (cti->get_target_matrix)
+ cti->get_target_matrix(curcon, cob, ct, bsystem_time(ob, (float)(G.scene->r.cfra), ob->sf));
+ else
+ Mat4One(ct->matrix);
+
+ setlinestyle(3);
+ glBegin(GL_LINES);
+ glVertex3fv(ct->matrix[3]);
+ glVertex3fv(ob->obmat[3]);
+ glEnd();
+ setlinestyle(0);
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(curcon, &targets, 1);
}
}
+
+ constraints_clear_evalob(cob);
}
}
@@ -4314,7 +5317,9 @@ static int bbs_mesh_solid_EM(DerivedMesh *dm, int facecol)
if (facecol) {
dm->drawMappedFaces(dm, bbs_mesh_solid__setSolidDrawOptions, (void*)(long) 1, 0);
- if(G.scene->selectmode & SCE_SELECT_FACE) {
+ if( (G.scene->selectmode & SCE_SELECT_FACE) &&
+ (G.vd->drawtype<=OB_SOLID)
+ ) {
glPointSize(BIF_GetThemeValuef(TH_FACEDOT_SIZE));
bglBegin(GL_POINTS);
@@ -4333,7 +5338,7 @@ static int bbs_mesh_solid__setDrawOpts(void *userData, int index, int *drawSmoot
{
Mesh *me = userData;
- if (!me->mtface || !(me->mface[index].flag&ME_HIDE)) {
+ if (!(me->mface[index].flag&ME_HIDE)) {
set_framebuffer_index_color(index+1);
return 1;
} else {
@@ -4354,6 +5359,7 @@ static int bbs_mesh_wire__setDrawOpts(void *userData, int index)
return 0;
}
+/* TODO remove this - since face select mode now only works with painting */
static void bbs_mesh_solid(Object *ob)
{
DerivedMesh *dm = mesh_get_derived_final(ob, get_viewedit_datamask());
@@ -4364,7 +5370,7 @@ static void bbs_mesh_solid(Object *ob)
/* draw edges for seam marking in faceselect mode, but not when painting,
so that painting doesn't get interrupted on an edge */
- if ((G.f & G_FACESELECT) && !(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) && me->mtface) {
+ if ((G.f & G_FACESELECT) && !(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))) {
struct { Mesh *me; EdgeHash *eh; int offset; } userData;
userData.me = me;
@@ -4429,12 +5435,11 @@ void draw_object_backbufsel(Object *ob)
/* ************* draw object instances for bones, for example ****************** */
/* assumes all matrices/etc set OK */
-void draw_object_instance(Object *ob, int dt, int outline)
+/* helper function for drawing object instances - meshes */
+static void draw_object_mesh_instance(Object *ob, int dt, int outline)
{
DerivedMesh *dm=NULL, *edm=NULL;
- if(ob==NULL || ob->type!=OB_MESH) return;
-
if(G.obedit && ob->data==G.obedit->data)
edm= editmesh_get_derived_base();
else
@@ -4474,3 +5479,18 @@ void draw_object_instance(Object *ob, int dt, int outline)
if(dm) dm->release(dm);
}
+void draw_object_instance(Object *ob, int dt, int outline)
+{
+ if (ob == NULL)
+ return;
+
+ switch (ob->type) {
+ case OB_MESH:
+ draw_object_mesh_instance(ob, dt, outline);
+ break;
+ case OB_EMPTY:
+ drawaxes(ob->empty_drawsize, 0, ob->empty_drawtype);
+ break;
+ }
+}
+
diff --git a/source/blender/src/drawscene.c b/source/blender/src/drawscene.c
index b2d8920c1a2..557083d2b97 100644
--- a/source/blender/src/drawscene.c
+++ b/source/blender/src/drawscene.c
@@ -74,16 +74,7 @@ void set_scene(Scene *sce) /* also see scene.c: set_scene_bg() */
if( G.obedit)
exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
- if(G.f & G_FACESELECT)
- set_faceselect();
- if(G.f & G_VERTEXPAINT)
- set_vpaint();
- if(G.f & G_TEXTUREPAINT)
- set_texturepaint();
- if(G.f & G_WEIGHTPAINT)
- set_wpaint();
- if(G.f & G_SCULPTMODE)
- set_sculptmode();
+ exit_paint_modes();
G.scene= sce;
diff --git a/source/blender/src/drawscript.c b/source/blender/src/drawscript.c
index 024d83950ad..b009c3b8388 100644
--- a/source/blender/src/drawscript.c
+++ b/source/blender/src/drawscript.c
@@ -142,6 +142,12 @@ void winqreadscriptspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *
void free_scriptspace (SpaceScript *sc)
{
if (!sc) return;
-
+
+ /*free buttons references*/
+ if (sc->but_refs) {
+ BPy_Set_DrawButtonsList(sc->but_refs);
+ BPy_Free_DrawButtonsList();
+ sc->but_refs = NULL;
+ }
sc->script = NULL;
}
diff --git a/source/blender/src/drawseq.c b/source/blender/src/drawseq.c
index fac1468fdd2..bb04440bd0f 100644
--- a/source/blender/src/drawseq.c
+++ b/source/blender/src/drawseq.c
@@ -51,6 +51,7 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_view2d_types.h"
+#include "DNA_userdef_types.h"
#include "BKE_global.h"
#include "BKE_plugin_types.h"
@@ -75,6 +76,7 @@
#include "BSE_seqeffects.h"
#include "BSE_seqscopes.h"
#include "BSE_seqaudio.h"
+#include "BSE_time.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -306,8 +308,8 @@ static void drawseqwave(Sequence *seq, float x1, float y1, float x2, float y2, i
if (seq->flag & SEQ_MUTE) glColor3ub(0x70, 0x80, 0x80); else glColor3ub(0x70, 0xc0, 0xc0);
- sofs = ((int)( (((float)(seq->startdisp-seq->start))/(float)G.scene->r.frs_sec)*(float)G.scene->audio.mixrate*4.0 )) & (~3);
- eofs = ((int)( (((float)(seq->enddisp-seq->start))/(float)G.scene->r.frs_sec)*(float)G.scene->audio.mixrate*4.0 )) & (~3);
+ sofs = ((int)( FRA2TIME(seq->startdisp-seq->start)*(float)G.scene->audio.mixrate*4.0 )) & (~3);
+ eofs = ((int)( FRA2TIME(seq->enddisp-seq->start)*(float)G.scene->audio.mixrate*4.0 )) & (~3);
/* clip the drawing area to the screen bounds to save time */
sample_step= (G.v2d->cur.xmax - G.v2d->cur.xmin)/winx;
@@ -391,7 +393,7 @@ static void draw_seq_handle(Sequence *seq, SpaceSeq *sseq, short direction)
/* clamp handles to defined size in pixel space */
handsize = seq->handsize;
minhandle = 7;
- maxhandle = 28;
+ maxhandle = 40;
CLAMP(handsize, minhandle*pixelx, maxhandle*pixelx);
/* set up co-ordinates/dimensions for either left or right handle */
@@ -685,9 +687,12 @@ so wave file sample drawing precission is zoom adjusted
static void draw_seq_strip(Sequence *seq, ScrArea *sa, SpaceSeq *sseq)
{
float x1, x2, y1, y2;
- char col[3];
+ char col[3], is_single_image;
Sequence *last_seq = get_last_seq();
+ /* we need to know if this is a single image or not for drawing */
+ is_single_image = (char)check_single_seq(seq);
+
/* body */
if(seq->startstill) x1= seq->start;
else x1= seq->startdisp;
@@ -701,11 +706,18 @@ static void draw_seq_strip(Sequence *seq, ScrArea *sa, SpaceSeq *sseq)
get_seq_color3ubv(seq, col);
/* draw the main strip body */
- draw_shadedstrip(seq, col, x1, y1, x2, y2);
+ if (is_single_image) /* single image */
+ draw_shadedstrip(seq, col, seq_tx_get_final_left(seq), y1, seq_tx_get_final_right(seq), y2);
+ else /* normal operation */
+ draw_shadedstrip(seq, col, x1, y1, x2, y2);
/* draw additional info and controls */
- if (seq->type == SEQ_RAM_SOUND) drawseqwave(seq, x1, y1, x2, y2, sa->winx);
- draw_seq_extensions(seq, sseq);
+ if (seq->type == SEQ_RAM_SOUND)
+ drawseqwave(seq, x1, y1, x2, y2, sa->winx);
+
+ if (!is_single_image)
+ draw_seq_extensions(seq, sseq);
+
draw_seq_handle(seq, sseq, SEQ_LEFTHANDLE);
draw_seq_handle(seq, sseq, SEQ_RIGHTHANDLE);
@@ -740,10 +752,10 @@ static void draw_seq_strip(Sequence *seq, ScrArea *sa, SpaceSeq *sseq)
if(x2<G.v2d->cur.xmin) x2= G.v2d->cur.xmin;
else if(x2>G.v2d->cur.xmax) x2= G.v2d->cur.xmax;
+ /* nice text here would require changing the view matrix for texture text */
if(x1 != x2) {
draw_seq_text(seq, x1, x2, y1, y2);
}
-
}
static Sequence *special_seq_update= 0;
@@ -763,7 +775,6 @@ void set_special_seq_update(int val)
static void draw_image_seq(ScrArea *sa)
{
SpaceSeq *sseq;
- StripElem *se;
struct ImBuf *ibuf;
int x1, y1, rectx, recty;
int free_ibuf = 0;
@@ -788,7 +799,19 @@ static void draw_image_seq(ScrArea *sa)
return;
else {
recursive= 1;
- ibuf= (ImBuf *)give_ibuf_seq(rectx, recty, (G.scene->r.cfra), sseq->chanshown);
+ if (special_seq_update) {
+ ibuf= give_ibuf_seq_direct(
+ rectx, recty, (G.scene->r.cfra),
+ special_seq_update);
+ } else if (!U.prefetchframes || (G.f & G_PLAYANIM) == 0) {
+ ibuf= (ImBuf *)give_ibuf_seq(
+ rectx, recty, (G.scene->r.cfra),
+ sseq->chanshown);
+ } else {
+ ibuf= (ImBuf *)give_ibuf_seq_threaded(
+ rectx, recty, (G.scene->r.cfra),
+ sseq->chanshown);
+ }
recursive= 0;
/* HURMF! the give_ibuf_seq can call image display in this window */
@@ -799,16 +822,6 @@ static void draw_image_seq(ScrArea *sa)
}
}
- if(special_seq_update) {
- se = special_seq_update->curelem;
- if(se) {
- if(se->ok==2) {
- if(se->se1)
- ibuf= se->se1->ibuf;
- }
- else ibuf= se->ibuf;
- }
- }
if(ibuf==NULL)
return;
if(ibuf->rect_float && ibuf->rect==NULL)
@@ -846,7 +859,7 @@ static void draw_image_seq(ScrArea *sa)
if (free_ibuf) {
IMB_freeImBuf(ibuf);
- }
+ }
sa->win_swap= WIN_BACK_OK;
}
@@ -855,7 +868,7 @@ static void draw_extra_seqinfo(void)
{
Sequence *last_seq = get_last_seq();
StripElem *se, *last;
- float xco, xfac;
+ float xco, xfac, yco, yfac;
int sta, end;
char str[256];
@@ -864,59 +877,76 @@ static void draw_extra_seqinfo(void)
/* xfac: size of 1 pixel */
xfac= G.v2d->cur.xmax - G.v2d->cur.xmin;
xfac/= (float)(G.v2d->mask.xmax-G.v2d->mask.xmin);
- xco= G.v2d->cur.xmin+40*xfac;
+ xco= G.v2d->cur.xmin+10*xfac;
- BIF_ThemeColor(TH_TEXT);
+ yfac= G.v2d->cur.ymax - G.v2d->cur.ymin;
+ yfac/= (float)(G.v2d->mask.ymax-G.v2d->mask.ymin);
+ yco= G.v2d->cur.ymin+40*yfac;
+
+ BIF_ThemeColor(TH_TEXT_HI);
/* NAME */
- glRasterPos3f(xco, 0.3, 0.0);
+ glRasterPos3f(xco, yco, 0.0);
strncpy(str, give_seqname(last_seq), 255);
BMF_DrawString(G.font, str);
- xco += xfac*BMF_GetStringWidth(G.font, str) +30.0*xfac;
+ xco += xfac*BMF_GetStringWidth(G.font, str) +10.0*xfac;
if(last_seq->type==SEQ_SCENE && last_seq->scene) {
- glRasterPos3f(xco, 0.3, 0.0);
+ glRasterPos3f(xco, yco, 0.0);
BMF_DrawString(G.font, last_seq->scene->id.name+2);
xco += xfac*BMF_GetStringWidth(G.font, last_seq->scene->id.name+2) +30.0*xfac;
}
- /* LEN */
- if(last_seq->type & SEQ_EFFECT)
- sprintf(str, "len: %d From %d - %d", last_seq->len, last_seq->startdisp, last_seq->enddisp-1);
- else
- sprintf(str, "len: %d (%d)", last_seq->enddisp-last_seq->startdisp, last_seq->len);
+ /* LEN, dont bother with single images */
+ if (check_single_seq(last_seq)==0) {
+ if(last_seq->type & SEQ_EFFECT)
+ sprintf(str, "len: %d From %d - %d", last_seq->len, last_seq->startdisp, last_seq->enddisp-1);
+ else
+ sprintf(str, "len: %d (%d)", last_seq->enddisp-last_seq->startdisp, last_seq->len);
+
+ glRasterPos3f(xco, yco, 0.0);
+
+ BMF_DrawString(G.font, str);
+ xco += xfac*BMF_GetStringWidth(G.font, str) +10.0*xfac;
+ }
- glRasterPos3f(xco, 0.3, 0.0);
- BMF_DrawString(G.font, str);
- xco += xfac*BMF_GetStringWidth(G.font, str) +30.0*xfac;
if(last_seq->type==SEQ_IMAGE) {
-
- /* CURRENT */
- se= (StripElem *)give_stripelem(last_seq, (G.scene->r.cfra));
- if(se) {
- sprintf(str, "Cur: %s", se->name);
- glRasterPos3f(xco, 0.3, 0.0);
- BMF_DrawString(G.font, str);
- xco += xfac*BMF_GetStringWidth(G.font, str) +30.0*xfac;
+ if (last_seq->len > 1) {
+ /* CURRENT */
+ se= give_stripelem(last_seq, (G.scene->r.cfra));
+ if(se) {
+ sprintf(str, "Cur: %s%s", last_seq->strip->dir, se->name);
+ glRasterPos3f(xco, yco, 0.0);
+ BMF_DrawString(G.font, str);
+ xco += xfac*BMF_GetStringWidth(G.font, str) +10.0*xfac;
+ }
+
+ /* FIRST AND LAST */
+
+ if(last_seq->strip) {
+ se= last_seq->strip->stripdata;
+ last= se+last_seq->len-1;
+ if(last_seq->startofs) se+= last_seq->startofs;
+ if(last_seq->endofs) last-= last_seq->endofs;
+
+ sprintf(str, "First: %s at %d Last: %s at %d", se->name, last_seq->startdisp, last->name, last_seq->enddisp-1);
+ glRasterPos3f(xco, yco, 0.0);
+ BMF_DrawString(G.font, str);
+ xco += xfac*BMF_GetStringWidth(G.font, str) +30.0*xfac;
+ }
+ } else { /* single image */
+ if (last_seq->strip) {
+ sprintf(str, "Single: %s%s len: %d", last_seq->strip->dir, last_seq->strip->stripdata->name, last_seq->enddisp-last_seq->startdisp);
+ glRasterPos3f(xco, yco, 0.0);
+ BMF_DrawString(G.font, str);
+ xco += xfac*BMF_GetStringWidth(G.font, str) +30.0*xfac;
+ }
}
-
- /* FIRST AND LAST */
-
+ /* orig size */
if(last_seq->strip) {
- se= last_seq->strip->stripdata;
- last= se+last_seq->len-1;
- if(last_seq->startofs) se+= last_seq->startofs;
- if(last_seq->endofs) last-= last_seq->endofs;
-
- sprintf(str, "First: %s at %d Last: %s at %d", se->name, last_seq->startdisp, last->name, last_seq->enddisp-1);
- glRasterPos3f(xco, 0.3, 0.0);
- BMF_DrawString(G.font, str);
- xco += xfac*BMF_GetStringWidth(G.font, str) +30.0*xfac;
-
- /* orig size */
sprintf(str, "OrigSize: %d x %d", last_seq->strip->orx, last_seq->strip->ory);
- glRasterPos3f(xco, 0.3, 0.0);
+ glRasterPos3f(xco, yco, 0.0);
BMF_DrawString(G.font, str);
xco += xfac*BMF_GetStringWidth(G.font, str) +30.0*xfac;
}
@@ -930,14 +960,14 @@ static void draw_extra_seqinfo(void)
last_seq->name+2, last_seq->strip->dir, last_seq->strip->stripdata->name,
sta, last_seq->startdisp, end, last_seq->enddisp-1, (G.scene->r.cfra)-last_seq->startdisp);
- glRasterPos3f(xco, 0.3, 0.0);
+ glRasterPos3f(xco, yco, 0.0);
BMF_DrawString(G.font, str);
}
else if(last_seq->type==SEQ_SCENE) {
- se= (StripElem *)give_stripelem(last_seq, (G.scene->r.cfra));
+ TStripElem * se= give_tstripelem(last_seq, (G.scene->r.cfra));
if(se && last_seq->scene) {
sprintf(str, "Cur: %d First: %d Last: %d", last_seq->sfra+se->nr, last_seq->sfra, last_seq->sfra+last_seq->len-1);
- glRasterPos3f(xco, 0.3, 0.0);
+ glRasterPos3f(xco, yco, 0.0);
BMF_DrawString(G.font, str);
}
}
@@ -952,9 +982,23 @@ static void draw_extra_seqinfo(void)
sta, last_seq->startdisp, end, last_seq->enddisp-1, (G.scene->r.cfra)-last_seq->startdisp,
last_seq->level, last_seq->pan);
- glRasterPos3f(xco, 0.3, 0.0);
+ glRasterPos3f(xco, yco, 0.0);
BMF_DrawString(G.font, str);
}
+ else if(last_seq->type == SEQ_SPEED) {
+ SpeedControlVars * vars =
+ (SpeedControlVars*) last_seq->effectdata;
+
+ if (vars) {
+ sprintf(str, "Last mapped frame: %d at %d",
+ vars->lastValidFrame,
+ vars->lastValidFrame
+ + last_seq->startdisp);
+
+ glRasterPos3f(xco, yco, 0.0);
+ BMF_DrawString(G.font, str);
+ }
+ }
}
void seq_reset_imageofs(SpaceSeq *sseq)
@@ -1086,12 +1130,16 @@ static void seq_panel_properties(short cntrl) // SEQ_HANDLER_PROPERTIES
}
else if(last_seq->type==SEQ_IMAGE) {
- uiDefBut(block, LABEL, 0, "Type: Image", 10,140,150,20, 0, 0, 0, 0, 0, "");
- uiDefBut(block, TEX, B_NOP, "Name: ", 10,120,150,19, last_seq->name+2, 0.0, 21.0, 100, 0, "");
+ uiDefBut(block, LABEL, 0, "Type: Image", 10,160,150,20, 0, 0, 0, 0, 0, "");
+ uiDefBut(block, TEX, B_NOP, "Name: ", 10,140,150,19, last_seq->name+2, 0.0, 21.0, 100, 0, "");
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, SEQ_MAKE_PREMUL, SEQ_BUT_RELOAD, "Convert to Premul", 10,90,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Converts RGB values to become premultiplied with Alpha");
- uiDefButBitS(block, TOG, SEQ_FILTERY, SEQ_BUT_RELOAD, "FilterY", 10,70,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "For video movies to remove fields");
+ uiDefButBitS(block, TOG, SEQ_MAKE_PREMUL, SEQ_BUT_RELOAD, "Convert to Premul", 10,110,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Converts RGB values to become premultiplied with Alpha");
+ uiDefButBitS(block, TOG, SEQ_FILTERY, SEQ_BUT_RELOAD, "FilterY", 10,90,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "For video movies to remove fields");
+
+ uiDefButBitS(block, TOG, SEQ_FLIPX, SEQ_BUT_RELOAD, "FlipX", 10,70,75,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Flip on the X axis");
+ uiDefButBitS(block, TOG, SEQ_FLIPY, SEQ_BUT_RELOAD, "FlipY", 85,70,75,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Flip on the Y axis");
+
uiDefButF(block, NUM, SEQ_BUT_RELOAD, "Mul:", 10,50,150,19, &last_seq->mul, 0.001, 5.0, 100, 0, "Multiply colors");
uiDefButS(block, TOG|BIT|7, SEQ_BUT_RELOAD, "Reverse Frames", 10,30,150,19, &last_seq->flag, 0.0, 21.0, 100, 0, "Reverse frame order");
uiDefButF(block, NUM, SEQ_BUT_RELOAD, "Strobe:", 10,10,150,19, &last_seq->strobe, 1.0, 30.0, 100, 0, "Only display every nth frame");
@@ -1192,14 +1240,29 @@ static void seq_panel_properties(short cntrl) // SEQ_HANDLER_PROPERTIES
uiDefButF(block, NUM, SEQ_BUT_EFFECT, "yScale Start:", 10,50,150,19, &transform->ScaleyIni, 0.0, 10.0, 0, 0, "Y Scale Start");
uiDefButF(block, NUM, SEQ_BUT_EFFECT, "yScale End:", 160,50,150,19, &transform->ScaleyFin, 0.0, 10.0, 0, 0, "Y Scale End");
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x Start:", 10,30,150,19, &transform->xIni, -1000.0, 1000.0, 0, 0, "X Position Start");
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x End:", 160,30,150,19, &transform->xFin, -1000.0, 1000.0, 0, 0, "X Position End");
+ uiDefButI(block, ROW, SEQ_BUT_EFFECT, "Percent", 10, 30, 150, 19, &transform->percent, 0.0, 1.0, 0.0, 0.0, "Percent Translate");
+ uiDefButI(block, ROW, SEQ_BUT_EFFECT, "Pixels", 160, 30, 150, 19, &transform->percent, 0.0, 0.0, 0.0, 0.0, "Pixels Translate");
+ if(transform->percent==1){
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x Start:", 10,10,150,19, &transform->xIni, -500.0, 500.0, 0, 0, "X Position Start");
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x End:", 160,10,150,19, &transform->xFin, -500.0, 500.0, 0, 0, "X Position End");
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y Start:", 10,-10,150,19, &transform->yIni, -500.0, 500.0, 0, 0, "Y Position Start");
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y End:", 160,-10,150,19, &transform->yFin, -500.0, 500.0, 0, 0, "Y Position End");
+ }else{
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x Start:", 10,10,150,19, &transform->xIni, -10000.0, 10000.0, 0, 0, "X Position Start");
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "x End:", 160,10,150,19, &transform->xFin, -10000.0, 10000.0, 0, 0, "X Position End");
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y Start:", 10,-10,150,19, &transform->yIni, -10000.0, 10000.0, 0, 0, "Y Position Start");
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y End:", 160,-10,150,19, &transform->yFin, -10000.0, 10000.0, 0, 0, "Y Position End");
+
+ }
+
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y Start:", 10,10,150,19, &transform->yIni, -1000.0, 1000.0, 0, 0, "Y Position Start");
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "y End:", 160,10,150,19, &transform->yFin, -1000.0, 1000.0, 0, 0, "Y Position End");
+
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "rot Start:",10,-30,150,19, &transform->rotIni, 0.0, 360.0, 0, 0, "Rotation Start");
+ uiDefButF(block, NUM, SEQ_BUT_EFFECT, "rot End:",160,-30,150,19, &transform->rotFin, 0.0, 360.0, 0, 0, "Rotation End");
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "rot Start:",10,-10,150,19, &transform->rotIni, 0.0, 360.0, 0, 0, "Rotation Start");
- uiDefButF(block, NUM, SEQ_BUT_EFFECT, "rot End:",160,-10,150,19, &transform->rotFin, 0.0, 360.0, 0, 0, "Rotation End");
+ uiDefButI(block, ROW, SEQ_BUT_EFFECT, "No Interpolat", 10, -50, 100, 19, &transform->interpolation, 0.0, 0.0, 0.0, 0.0, "No interpolation");
+ uiDefButI(block, ROW, SEQ_BUT_EFFECT, "Bilinear", 101, -50, 100, 19, &transform->interpolation, 0.0, 1.0, 0.0, 0.0, "Bilinear interpolation");
+ uiDefButI(block, ROW, SEQ_BUT_EFFECT, "Bicubic", 202, -50, 100, 19, &transform->interpolation, 0.0, 2.0, 0.0, 0.0, "Bicubic interpolation");
} else if(last_seq->type==SEQ_COLOR) {
SolidColorVars *colvars = (SolidColorVars *)last_seq->effectdata;
uiDefButF(block, COL, SEQ_BUT_RELOAD, "",10,90,150,19, colvars->col, 0, 0, 0, 0, "");
@@ -1261,6 +1324,20 @@ static void seq_blockhandlers(ScrArea *sa)
}
+void drawprefetchseqspace(ScrArea *sa, void *spacedata)
+{
+ SpaceSeq *sseq= sa->spacedata.first;
+ int rectx, recty;
+
+ rectx= (G.scene->r.size*G.scene->r.xsch)/100;
+ recty= (G.scene->r.size*G.scene->r.ysch)/100;
+
+ if(sseq->mainb) {
+ give_ibuf_prefetch_request(
+ rectx, recty, (G.scene->r.cfra), sseq->chanshown);
+ }
+}
+
void drawseqspace(ScrArea *sa, void *spacedata)
{
SpaceSeq *sseq= sa->spacedata.first;
@@ -1379,6 +1456,9 @@ void drawseqspace(ScrArea *sa, void *spacedata)
draw_extra_seqinfo();
+ /* Draw markers */
+ draw_markers_timespace(1);
+
/* restore viewport */
mywinset(sa->win);
diff --git a/source/blender/src/drawsound.c b/source/blender/src/drawsound.c
index 1fe10bf2c17..fd82430e3b7 100644
--- a/source/blender/src/drawsound.c
+++ b/source/blender/src/drawsound.c
@@ -58,6 +58,8 @@
#include "BSE_time.h"
#include "BMF_Api.h"
+#include "blendef.h"
+
/* local */
void drawsoundspace(ScrArea *sa, void *spacedata);
@@ -99,7 +101,7 @@ static void draw_sample(bSample *sample)
short *sp, sampdx;
/* one sample is where in v2d space? (v2d space in frames!) */
- sampfac= ((float)G.scene->r.frs_sec)/(sample->rate);
+ sampfac= FPS/(sample->rate);
/* how many samples? */
samples= sample->len/(sample->channels*(sample->bits/8));
@@ -161,8 +163,8 @@ static void draw_cfra_sound(SpaceSound *ssound)
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
if(ssound->flag & SND_DRAWFRAMES)
- sprintf(str, " %d\n", (G.scene->r.cfra));
- else sprintf(str, " %.2f\n", (G.scene->r.cfra/(float)G.scene->r.frs_sec));
+ sprintf(str, " %d\n", CFRA);
+ else sprintf(str, " %.2f\n", FRA2TIME(CFRA));
glRasterPos2f(x, y);
glColor3ub(0, 0, 0);
@@ -219,7 +221,7 @@ void drawsoundspace(ScrArea *sa, void *spacedata)
}
draw_cfra_sound(spacedata);
- draw_markers_timespace();
+ draw_markers_timespace(0);
/* restore viewport */
mywinset(curarea->win);
diff --git a/source/blender/src/drawtime.c b/source/blender/src/drawtime.c
index 9b9cba4dc98..d4c4c091aa0 100644
--- a/source/blender/src/drawtime.c
+++ b/source/blender/src/drawtime.c
@@ -54,17 +54,32 @@
#include "BKE_utildefines.h"
#include "BKE_global.h"
+#include "BIF_editaction.h"
#include "BIF_gl.h"
+#include "BIF_interface.h"
#include "BIF_interface_icons.h"
#include "BIF_mywindow.h"
#include "BIF_screen.h"
#include "BIF_resources.h"
+#include "BIF_language.h"
#include "BSE_drawipo.h"
#include "BSE_view.h"
-#include "BMF_Api.h"
#include "blendef.h"
+#include "interface.h" /* for ui_rasterpos_safe */
+
+#define TIMELINE_STIPPLE \
+{ \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0, \
+ 136,136,136,136,0,0,0,0,34,34,34,34,0,0,0,0 \
+}
/* ---- prototypes ------ */
void drawtimespace(ScrArea *, void *);
@@ -92,8 +107,10 @@ static void draw_cfra_time(SpaceTime *stime)
if(stime->flag & TIME_CFRA_NUM) {
short mval[2];
float x, y;
+ float xscale, yscale;
char str[32];
- /* little box with frame */
+
+ /* little box with frame drawn beside */
glFlush(); // huhh... without this glColor won't work for the text...
getmouseco_areawin(mval);
@@ -107,81 +124,102 @@ static void draw_cfra_time(SpaceTime *stime)
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
if(stime->flag & TIME_DRAWFRAMES)
- sprintf(str, " %d\n", (G.scene->r.cfra));
- else sprintf(str, " %.2f\n", (G.scene->r.cfra/(float)G.scene->r.frs_sec));
+ sprintf(str, " %d", CFRA);
+ else sprintf(str, " %.2f", FRA2TIME(CFRA));
/* HACK! somehow the green color won't go away... */
glColor4ub(0, 0, 0, 0);
BIF_ThemeColor(TH_TEXT);
- glRasterPos2f(x, y);
- BMF_DrawString(G.fonts, str);
+ xscale = (G.v2d->mask.xmax-G.v2d->mask.xmin)/(G.v2d->cur.xmax-G.v2d->cur.xmin);
+ yscale = (G.v2d->mask.ymax-G.v2d->mask.ymin)/(G.v2d->cur.ymax-G.v2d->cur.ymin);
+
+ /* because the frame number text is subject to the same scaling as the contents of the view */
+ glScalef( 1.0/xscale, 1.0/yscale, 1.0);
+ ui_rasterpos_safe(x * xscale, y * yscale, 1.0);
+ BIF_DrawString(G.fonts, str, 0);
+ glScalef(xscale, yscale, 1.0);
}
}
-static void draw_marker(TimeMarker *marker)
+static void draw_marker(TimeMarker *marker, int lines)
{
- float xpos, xspace, yspace, xpixels, ypixels;
+ float xpos, ypixels, xscale, yscale;
xpos = marker->frame;
/* no time correction for framelen! space is drawn with old values */
- xspace= G.v2d->cur.xmax - G.v2d->cur.xmin;
- yspace= G.v2d->cur.ymax - G.v2d->cur.ymin;
- xpixels= G.v2d->mask.xmax-G.v2d->mask.xmin;
ypixels= G.v2d->mask.ymax-G.v2d->mask.ymin;
+ xscale = (G.v2d->mask.xmax-G.v2d->mask.xmin)/(G.v2d->cur.xmax-G.v2d->cur.xmin);
+ yscale = (G.v2d->mask.ymax-G.v2d->mask.ymin)/(G.v2d->cur.ymax-G.v2d->cur.ymin);
+ glScalef( 1.0/xscale, 1.0/yscale, 1.0);
+
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ /* verticle line */
+ if (lines) {
+ setlinestyle(3);
+ if(marker->flag & SELECT)
+ glColor4ub(255,255,255, 96);
+ else
+ glColor4ub(0,0,0, 96);
+
+ glBegin(GL_LINES);
+ glVertex2f((xpos*xscale)+0.5, 12);
+ glVertex2f((xpos*xscale)+0.5, 34*yscale); /* a bit lazy but we know it cant be greater then 34 strips high*/
+ glEnd();
+ setlinestyle(0);
+ }
+
/* 5 px to offset icon to align properly, space / pixels corrects for zoom */
if(marker->flag & SELECT)
- BIF_icon_draw(xpos-(5.0*(xspace/xpixels)), 12.0*yspace/ypixels, ICON_MARKER_HLT);
+ BIF_icon_draw(xpos*xscale-5.0, 12.0, ICON_MARKER_HLT);
else
- BIF_icon_draw(xpos-(5.0*(xspace/xpixels)), 12.0*yspace/ypixels, ICON_MARKER);
+ BIF_icon_draw(xpos*xscale-5.0, 12.0, ICON_MARKER);
glBlendFunc(GL_ONE, GL_ZERO);
- glDisable(GL_BLEND);
-
+ glDisable(GL_BLEND);
+
/* and the marker name too, shifted slightly to the top-right */
if(marker->name && marker->name[0]) {
if(marker->flag & SELECT) {
BIF_ThemeColor(TH_TEXT_HI);
- glRasterPos2f(xpos+(4.0*(xspace/xpixels)),
- ((ypixels<=39.0)?(ypixels-10.0):29.0)*yspace/ypixels);
+ ui_rasterpos_safe(xpos*xscale+4.0, (ypixels<=39.0)?(ypixels-10.0):29.0, 1.0);
}
else {
BIF_ThemeColor(TH_TEXT);
if((marker->frame <= G.scene->r.cfra) && (marker->frame+5 > G.scene->r.cfra))
- glRasterPos2f(xpos+(4.0*(xspace/xpixels)),
- ((ypixels<=39.0)?(ypixels-10.0):29.0)*yspace/ypixels);
+ ui_rasterpos_safe(xpos*xscale+4.0, (ypixels<=39.0)?(ypixels-10.0):29.0, 1.0);
else
- glRasterPos2f(xpos+(4.0*(xspace/xpixels)), 17.0*yspace/ypixels);
+ ui_rasterpos_safe(xpos*xscale+4.0, 17.0, 1.0);
}
- BMF_DrawString(G.font, marker->name);
+ BIF_DrawString(G.font, marker->name, 0);
}
+ glScalef(xscale, yscale, 1.0);
}
-static void draw_markers_time(void)
+static void draw_markers_time(int lines)
{
TimeMarker *marker;
/* unselected markers are drawn at the first time */
for(marker= G.scene->markers.first; marker; marker= marker->next) {
- if(!(marker->flag & SELECT)) draw_marker(marker);
+ if(!(marker->flag & SELECT)) draw_marker(marker, lines);
}
/* selected markers are drawn later ... selected markers have to cover unselected
* markers laying at the same position as selected markers
* (jiri: it is hack, it could be solved better) */
for(marker= G.scene->markers.first; marker; marker= marker->next) {
- if(marker->flag & SELECT) draw_marker(marker);
+ if(marker->flag & SELECT) draw_marker(marker, lines);
}
}
-void draw_markers_timespace()
+void draw_markers_timespace(int lines)
{
TimeMarker *marker;
float yspace, ypixels;
@@ -196,13 +234,13 @@ void draw_markers_timespace()
/* unselected markers are drawn at the first time */
for(marker= G.scene->markers.first; marker; marker= marker->next) {
- if(!(marker->flag & SELECT)) draw_marker(marker);
+ if(!(marker->flag & SELECT)) draw_marker(marker, lines);
}
/* selected markers are drawn later ... selected markers have to cover unselected
* markers laying at the same position as selected markers */
for(marker= G.scene->markers.first; marker; marker= marker->next) {
- if(marker->flag & SELECT) draw_marker(marker);
+ if(marker->flag & SELECT) draw_marker(marker, lines);
}
glTranslatef(0.0f, -G.v2d->cur.ymin, 0.0f);
@@ -250,6 +288,27 @@ static void draw_sfra_efra()
glDisable(GL_BLEND);
}
+static void draw_mapoldnew()
+{
+ float anim_end; /* the end of the blender frames that are actually animated (map old)*/
+ float frames_end; /* the end of the frames that get rendered and saved to disk (map new) */
+ GLubyte timeline_stipple[32*32/8] = TIMELINE_STIPPLE;
+
+ if (G.scene->r.framelen == 1.0) return;
+
+ anim_end = PEFRA * G.scene->r.framelen;
+ frames_end = PEFRA;
+
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(timeline_stipple);
+ BIF_ThemeColorShade(TH_BACK, -65);
+
+ if (anim_end < frames_end)
+ glRectf(anim_end, G.v2d->cur.ymin, frames_end, G.v2d->cur.ymax);
+
+ glDisable(GL_POLYGON_STIPPLE);
+}
+
/*draw all the keys in a list (elems) as lines */
static void draw_key_list(ListBase elems, char col[3])
{
@@ -267,66 +326,84 @@ static void draw_key_list(ListBase elems, char col[3])
}
}
+/* This function draws keyframes that the active object has (as long as
+ * it is not in EditMode). Some filters are available to optimise the
+ * drawing efficiency.
+ */
static void draw_ob_keys()
{
- /*mostly copied from drawobject.c, draw_object() */
- Object *ob;
- bActionChannel *achan;
- bAction *act;
- ListBase elems;
- int a;
+ /* mostly copied from drawobject.c, draw_object() */
+ SpaceTime *stime= curarea->spacedata.first;
+ ListBase elems= {0, 0};
+
+ Object *ob= OBACT;
+ short filter, ok;
char col[3];
+ int a;
- if (OBACT) {
- ob = OBACT;
+ if (ob && ob!=G.obedit) {
+ /* Object's IPO block - show all keys */
+ if (ob->ipo) {
+ /* convert the ipo to a list of 'current frame elements' */
+ elems.first= elems.last= NULL;
+ make_cfra_list(ob->ipo, &elems);
+
+ /* draw the list of current frame elements */
+ col[0] = 0xDD; col[1] = 0xD7; col[2] = 0x00;
+ draw_key_list(elems, col);
+
+ BLI_freelistN(&elems);
+ }
- if(ob) {
- if(ob!=G.obedit) {
- if(ob->ipo) {
- /* convert the ipo to a list of 'current frame elements' */
-
+ /* Object's Action block - may be filtered in some cases */
+ if (ob->action) {
+ bAction *act = ob->action;
+ bActionChannel *achan;
+
+ /* only apply filter if action is likely to be for pose channels + filter is on */
+ filter= ((stime->flag & TIME_ONLYACTSEL) &&
+ (ob->pose) && (ob->flag & OB_POSEMODE));
+
+ /* go through each channel in the action */
+ for (achan=act->chanbase.first; achan; achan=achan->next) {
+ /* if filtering, check if this channel passes */
+ if (filter) {
+ ok= (SEL_ACHAN(achan))? 1 : 0;
+ }
+ else ok= 1;
+
+ /* convert the ipo to a list of 'current frame elements' */
+ if (achan->ipo && ok) {
elems.first= elems.last= NULL;
- make_cfra_list(ob->ipo, &elems);
+ make_cfra_list(achan->ipo, &elems);
- /* draw the list of current frame elements */
- col[0] = 0xDD; col[1] = 0xD7; col[2] = 0x00;
+ col[0] = 0x00; col[1] = 0x82; col[2] = 0x8B;
draw_key_list(elems, col);
BLI_freelistN(&elems);
}
+ }
+ }
+
+ /* Materials (only relevant for geometry objects) - some filtering might occur */
+ filter= (stime->flag & TIME_ONLYACTSEL);
+ for (a=0; a<ob->totcol; a++) {
+ Material *ma= give_current_material(ob, a+1);
+
+ /* the only filter we apply right now is only showing the active material */
+ if (filter) {
+ ok= (ob->actcol==a)? 1 : 0;
+ }
+ else ok= 1;
+
+ if (ma && ma->ipo && ok) {
+ elems.first= elems.last= NULL;
+ make_cfra_list(ma->ipo, &elems);
- if(ob->action) {
- act = ob->action;
-
- /* go through each channel in the action */
- for (achan=act->chanbase.first; achan; achan=achan->next){
- /* convert the ipo to a list of 'current frame elements' */
- if(achan->ipo) {
- elems.first= elems.last= NULL;
- make_cfra_list(achan->ipo, &elems);
-
- col[0] = 0x00; col[1] = 0x82; col[2] = 0x8B;
- draw_key_list(elems, col);
-
- BLI_freelistN(&elems);
- }
- }
- }
-
- for(a=0; a<ob->totcol; a++) {
- Material *ma= give_current_material(ob, a+1);
-
- if(ma && ma->ipo) {
- elems.first= elems.last= NULL;
- make_cfra_list(ma->ipo, &elems);
-
- col[0] = 0xDD; col[1] = 0xA7; col[2] = 0x00;
- draw_key_list(elems, col);
-
- BLI_freelistN(&elems);
- }
- }
+ col[0] = 0xDD; col[1] = 0xA7; col[2] = 0x00;
+ draw_key_list(elems, col);
+ BLI_freelistN(&elems);
}
}
}
@@ -349,6 +426,7 @@ void drawtimespace(ScrArea *sa, void *spacedata)
* frame range used is preview range or scene range
*/
draw_sfra_efra();
+ draw_mapoldnew();
/* boundbox_seq(); */
calc_ipogrid();
@@ -356,7 +434,7 @@ void drawtimespace(ScrArea *sa, void *spacedata)
draw_cfra_time(spacedata);
draw_ob_keys();
- draw_markers_time();
+ draw_markers_time(0);
/* restore viewport */
mywinset(curarea->win);
diff --git a/source/blender/src/drawview.c b/source/blender/src/drawview.c
index 6f1230b66ff..c00c3ddf157 100644
--- a/source/blender/src/drawview.c
+++ b/source/blender/src/drawview.c
@@ -71,6 +71,7 @@
#include "DNA_meshdata_types.h"
#include "DNA_meta_types.h"
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
@@ -101,6 +102,7 @@
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_scene.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -110,6 +112,7 @@
#include "BIF_editgroup.h"
#include "BIF_editarmature.h"
#include "BIF_editmesh.h"
+#include "BIF_editparticle.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "BIF_interface.h"
@@ -136,6 +139,7 @@
#include "BSE_filesel.h"
#include "BSE_headerbuttons.h"
#include "BSE_seqaudio.h"
+#include "BSE_sequence.h"
#include "BSE_trans_types.h"
#include "BSE_time.h"
#include "BSE_view.h"
@@ -436,10 +440,13 @@ static void draw_bgpic(void)
glPushMatrix();
glaDefine2DArea(&curarea->winrct);
+
glEnable(GL_BLEND);
- glPixelTransferf(GL_ALPHA_SCALE, (1.0f-bgpic->blend));
+
glPixelZoom(zoomx, zoomy);
- glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
+ glColor4f(1.0, 1.0, 1.0, 1.0-bgpic->blend);
+ glaDrawPixelsTex(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect);
+
glPixelZoom(1.0, 1.0);
glPixelTransferf(GL_ALPHA_SCALE, 1.0f);
@@ -1017,11 +1024,13 @@ static void drawviewborder(void)
BIF_ThemeColor(TH_WIRE);
glRectf(x1, y1, x2, y2);
- /* camera name */
+ /* camera name - draw in highlighted text color */
if (ca && (ca->flag & CAM_SHOWNAME)) {
+ BIF_ThemeColor(TH_TEXT_HI);
glRasterPos2f(x1, y1-15);
BMF_DrawString(G.font, G.vd->camera->id.name+2);
+ BIF_ThemeColor(TH_WIRE);
}
@@ -1075,7 +1084,7 @@ void backdrawview3d(int test)
int m;
#endif
- if(G.f & (G_VERTEXPAINT|G_FACESELECT|G_TEXTUREPAINT|G_WEIGHTPAINT));
+ if(G.f & G_VERTEXPAINT || G.f & G_WEIGHTPAINT || G.f & G_TEXTUREPAINT);
else if(G.obedit && G.vd->drawtype>OB_WIRE && (G.vd->flag & V3D_ZBUF_SELECT));
else {
G.vd->flag &= ~V3D_NEEDBACKBUFDRAW;
@@ -1503,8 +1512,8 @@ static void draw_viewport_name(ScrArea *sa)
name = (G.vd->flag2 & V3D_OPP_DIRECTION_NAME) ? "Bottom Ortho" : "Top Ortho";
break;
default:
- if(G.vd->persp==V3D_PERSP_USE_THE_CAMERA) {
- if (G.vd->camera->type == OB_CAMERA) {
+ if (G.vd->persp==V3D_PERSP_USE_THE_CAMERA) {
+ if ((G.vd->camera) && (G.vd->camera->type == OB_CAMERA)) {
Camera *cam;
cam = G.vd->camera->data;
name = (cam->type != CAM_ORTHO) ? "Camera Persp" : "Camera Ortho";
@@ -1691,7 +1700,6 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
Mat4MulVecfl(ob->obmat, median);
if(block) { // buttons
-
uiBlockBeginAlign(block);
if((ob->parent) && (ob->partype == PARBONE)) {
uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, REDRAWVIEW3D, "Global", 160, 135, 70, 19, &G.vd->flag, 0, 0, 0, 0, "Displays global values");
@@ -1736,6 +1744,15 @@ static void v3d_editvertex_buts(uiBlock *block, Object *ob, float lim)
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Weight:", 10, 20, 290, 19, &(tfp->ve_median[4]), 0.0, 1.0, 10, 3, "Weight is used for SoftBody Goal");
}
+ if(ob->type==OB_CURVE && (totw==0)) { /* bez curves have no w */
+ uiBlockBeginAlign(block);
+ uiDefBut(block, BUT,B_SETPT_AUTO,"Auto", 10, 44, 72, 19, 0, 0, 0, 0, 0, "Auto handles (Shift H)");
+ uiDefBut(block, BUT,B_SETPT_VECTOR,"Vector",82, 44, 73, 19, 0, 0, 0, 0, 0, "Vector handles (V)");
+ uiDefBut(block, BUT,B_SETPT_ALIGN,"Align",155, 44, 73, 19, 0, 0, 0, 0, 0, "Align handles (H Toggles)");
+ uiDefBut(block, BUT,B_SETPT_FREE,"Free", 227, 44, 72, 19, 0, 0, 0, 0, 0, "Align handles (H Toggles)");
+ uiBlockEndAlign(block);
+ }
+
if(totedge==1)
uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Crease W:", 10, 30, 290, 19, &(tfp->ve_median[3]), 0.0, 1.0, 10, 3, "");
else if(totedge>1)
@@ -1864,7 +1881,6 @@ static void validate_bonebutton_cb(void *bonev, void *namev)
}
}
-
static void v3d_posearmature_buts(uiBlock *block, Object *ob, float lim)
{
uiBut *but;
@@ -1944,20 +1960,20 @@ static void v3d_editarmature_buts(uiBlock *block, Object *ob, float lim)
uiButSetFunc(but, validate_editbonebutton_cb, ebone, NULL);
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "RootX:", 10, 70, 140, 19, ebone->head, -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "RootY:", 10, 50, 140, 19, ebone->head+1, -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "RootZ:", 10, 30, 140, 19, ebone->head+2, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadX:", 10, 70, 140, 19, ebone->head, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadY:", 10, 50, 140, 19, ebone->head+1, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadZ:", 10, 30, 140, 19, ebone->head+2, -lim, lim, 10, 3, "");
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "TipX:", 160, 70, 140, 19, ebone->tail, -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "TipY:", 160, 50, 140, 19, ebone->tail+1, -lim, lim, 10, 3, "");
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "TipZ:", 160, 30, 140, 19, ebone->tail+2, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailX:", 160, 70, 140, 19, ebone->tail, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailY:", 160, 50, 140, 19, ebone->tail+1, -lim, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailZ:", 160, 30, 140, 19, ebone->tail+2, -lim, lim, 10, 3, "");
uiBlockEndAlign(block);
+
tfp->ob_eul[0]= 180.0*ebone->roll/M_PI;
uiDefButF(block, NUM, B_ARMATUREPANEL1, "Roll:", 10, 100, 140, 19, tfp->ob_eul, -lim, lim, 1000, 3, "");
-
uiBlockBeginAlign(block);
- uiDefButF(block, NUM, B_ARMATUREPANEL1, "TipRadius:", 10, 150, 140, 19, &ebone->rad_tail, 0, lim, 10, 3, "");
+ uiDefButF(block, NUM, B_ARMATUREPANEL1, "TailRadius:", 10, 150, 140, 19, &ebone->rad_tail, 0, lim, 10, 3, "");
if (ebone->parent && ebone->flag & BONE_CONNECTED )
uiDefButF(block, NUM, B_ARMATUREPANEL1, "HeadRadius:", 10, 130, 140, 19, &ebone->parent->rad_tail, 0, lim, 10, 3, "");
else
@@ -2211,7 +2227,6 @@ void do_viewbuts(unsigned short event)
}
}
-
static void view3d_panel_object(short cntrl) // VIEW3D_HANDLER_OBJECT
{
uiBlock *block;
@@ -2232,12 +2247,20 @@ static void view3d_panel_object(short cntrl) // VIEW3D_HANDLER_OBJECT
uiPanelControl(UI_PNL_SOLID | UI_PNL_CLOSE | cntrl);
uiSetPanelHandler(VIEW3D_HANDLER_OBJECT); // for close and esc
- if(!uiNewPanel(curarea, block, "Transform Properties", "View3d", 10, 230, 318, 204))
- return;
+ if((G.f & G_SCULPTMODE) && !G.obedit) {
+ if(!uiNewPanel(curarea, block, "Transform Properties", "View3d", 10, 230, 425, 234))
+ return;
+ } else if(G.f & G_PARTICLEEDIT && !G.obedit){
+ if(!uiNewPanel(curarea, block, "Transform Properties", "View3d", 10, 230, 318, 234))
+ return;
+ } else {
+ if(!uiNewPanel(curarea, block, "Transform Properties", "View3d", 10, 230, 318, 204))
+ return;
+ }
uiSetButLock(object_data_is_libdata(ob), ERROR_LIBDATA_MESSAGE);
- if(G.f & (G_VERTEXPAINT|G_FACESELECT|G_TEXTUREPAINT|G_WEIGHTPAINT)) {
+ if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) {
uiBlockSetFlag(block, UI_BLOCK_FRONTBUFFER); // force old style frontbuffer draw
}
else {
@@ -2249,13 +2272,17 @@ static void view3d_panel_object(short cntrl) // VIEW3D_HANDLER_OBJECT
uiButSetFunc(bt, test_idbutton_cb, ob->id.name, NULL);
#endif
-
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_OBJECTPANELPARENT, "Par:", 160, 180, 140, 20, &ob->parent, "Parent Object");
- if((ob->parent) && (ob->partype == PARBONE)) {
- if (G.f & G_SCULPTMODE)
- uiDefBut(block, TEX, B_OBJECTPANELPARENT, "ParBone:", 310, 180, 140, 20, ob->parsubstr, 0.0, 32.0, 0, 0, "");
- else
- uiDefBut(block, TEX, B_OBJECTPANELPARENT, "ParBone:", 160, 160, 140, 20, ob->parsubstr, 0.0, 32.0, 0, 0, "");
+ if((G.f & G_PARTICLEEDIT)==0) {
+ uiBlockBeginAlign(block);
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_OBJECTPANELPARENT, "Par:", 160, 180, 140, 20, &ob->parent, "Parent Object");
+ if((ob->parent) && (ob->partype == PARBONE)) {
+ bt= uiDefBut(block, TEX, B_OBJECTPANELPARENT, "ParBone:", 160, 160, 140, 20, ob->parsubstr, 0, 30, 0, 0, "");
+ uiButSetCompleteFunc(bt, autocomplete_bone, (void *)ob->parent);
+ }
+ else {
+ strcpy(ob->parsubstr, "");
+ }
+ uiBlockEndAlign(block);
}
}
@@ -2290,6 +2317,9 @@ static void view3d_panel_object(short cntrl) // VIEW3D_HANDLER_OBJECT
else if(G.f & G_SCULPTMODE) {
uiNewPanelTitle(block, "Sculpt Properties");
sculptmode_draw_interface_tools(block,10,150);
+ } else if(G.f & G_PARTICLEEDIT){
+ uiNewPanelTitle(block, "Particle Edit Properties");
+ particle_edit_buttons(block);
} else {
BoundBox *bb = NULL;
@@ -2380,7 +2410,7 @@ static void view3d_panel_background(short cntrl) // VIEW3D_HANDLER_BACKGROUND
uiSetPanelHandler(VIEW3D_HANDLER_BACKGROUND); // for close and esc
if(uiNewPanel(curarea, block, "Background Image", "View3d", 340, 10, 318, 204)==0) return;
- if(G.f & (G_VERTEXPAINT|G_FACESELECT|G_TEXTUREPAINT|G_WEIGHTPAINT)) {
+ if(G.f & G_VERTEXPAINT || G.f & G_WEIGHTPAINT || G.f & G_TEXTUREPAINT) {
uiBlockSetFlag(block, UI_BLOCK_FRONTBUFFER); // force old style frontbuffer draw
}
@@ -2395,12 +2425,12 @@ static void view3d_panel_background(short cntrl) // VIEW3D_HANDLER_BACKGROUND
}
if(!(vd->flag & V3D_DISPBGPIC)) {
- uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use Background Image", 10, 180, 150, 20, &vd->flag, 0, 0, 0, 0, "Display an image in the background of the 3D View");
+ uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use Background Image", 10, 180, 150, 20, &vd->flag, 0, 0, 0, 0, "Display an image in the background of this 3D View");
uiDefBut(block, LABEL, 1, " ", 160, 180, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
}
else {
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use", 10, 225, 50, 20, &vd->flag, 0, 0, 0, 0, "Display an image in the background of the 3D View");
+ uiDefButBitS(block, TOG, V3D_DISPBGPIC, B_REDR, "Use", 10, 225, 50, 20, &vd->flag, 0, 0, 0, 0, "Display an image in the background of this 3D View");
uiDefButF(block, NUMSLI, B_REDR, "Blend:", 60, 225, 150, 20, &vd->bgpic->blend, 0.0,1.0, 0, 0, "Set the transparency of the background image");
uiDefButF(block, NUM, B_REDR, "Size:", 210, 225, 100, 20, &vd->bgpic->size, 0.1, 250.0*vd->grid, 100, 0, "Set the size (width) of the background image");
@@ -2435,8 +2465,8 @@ static void view3d_panel_properties(short cntrl) // VIEW3D_HANDLER_SETTINGS
uiDefBut(block, LABEL, 1, "Grid:", 10, 220, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButF(block, NUM, REDRAWVIEW3D, "Spacing:", 10, 200, 140, 19, &vd->grid, 0.001, 100.0, 10, 0, "Set the distance between grid lines");
- uiDefButS(block, NUM, REDRAWVIEW3D, "Lines:", 10, 180, 140, 19, &vd->gridlines, 0.0, 100.0, 100, 0, "Set the number of grid lines");
- uiDefButS(block, NUM, REDRAWVIEW3D, "Divisions:", 10, 160, 140, 19, &vd->gridsubdiv, 0.0, 100.0, 100, 0, "Set the number of grid lines");
+ uiDefButS(block, NUM, REDRAWVIEW3D, "Lines:", 10, 180, 140, 19, &vd->gridlines, 0.0, 100.0, 100, 0, "Set the number of grid lines in perspective view");
+ uiDefButS(block, NUM, REDRAWVIEW3D, "Divisions:", 10, 160, 140, 19, &vd->gridsubdiv, 1.0, 100.0, 100, 0, "Set the number of grid lines");
uiBlockEndAlign(block);
uiDefBut(block, LABEL, 1, "3D Display:", 160, 220, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
@@ -2468,11 +2498,12 @@ static void view3d_panel_properties(short cntrl) // VIEW3D_HANDLER_SETTINGS
uiDefButBitS(block, TOG, V3D_SELECT_OUTLINE, REDRAWVIEW3D, "Outline Selected", 10, 30, 140, 19, &vd->flag, 0, 0, 0, 0, "Highlight selected objects with an outline, in Solid, Shaded or Textured viewport shading modes");
uiDefButBitS(block, TOG, V3D_DRAW_CENTERS, REDRAWVIEW3D, "All Object Centers", 10, 10, 140, 19, &vd->flag, 0, 0, 0, 0, "Draw the center points on all objects");
uiDefButBitS(block, TOGN, V3D_HIDE_HELPLINES, REDRAWVIEW3D, "Relationship Lines", 10, -10, 140, 19, &vd->flag, 0, 0, 0, 0, "Draw dashed lines indicating Parent, Constraint, or Hook relationships");
+ uiDefButBitS(block, TOG, V3D_SOLID_TEX, REDRAWVIEW3D, "Solid Tex", 10, -30, 140, 19, &vd->flag2, 0, 0, 0, 0, "Display textures in Solid draw type (Shift T)");
uiBlockEndAlign(block);
uiDefBut(block, LABEL, 1, "View Locking:", 160, 50, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
uiBlockBeginAlign(block);
- uiDefIDPoinBut(block, test_obpoin_but, ID_OB, REDRAWVIEW3D, "Object:", 160, 30, 140, 19, &vd->ob_centre, "Lock view to center always on this Object");
+ uiDefIDPoinBut(block, test_obpoin_but, ID_OB, REDRAWVIEW3D, "Object:", 160, 30, 140, 19, &vd->ob_centre, "Lock view to center to this Object");
uiDefBut(block, TEX, REDRAWVIEW3D, "Bone:", 160, 10, 140, 19, vd->ob_centre_bone, 1, 31, 0, 0, "If view locked to Object, use this Bone to lock to view to");
}
@@ -2755,6 +2786,7 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
for(SETLOOPER(G.scene->set, base))
object_handle_update(base->object); // bke_object.h
}
+
for(base= G.scene->base.first; base; base= base->next)
object_handle_update(base->object); // bke_object.h
@@ -2890,7 +2922,8 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
if(G.moving) {
BIF_drawConstraint();
- if(G.obedit) BIF_drawPropCircle(); // only editmode has proportional edit
+ if(G.obedit || (G.f & G_PARTICLEEDIT))
+ BIF_drawPropCircle(); // only editmode and particles have proportional edit
BIF_drawSnap();
}
@@ -2920,6 +2953,10 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
PropsetData *pd= sculpt_session()->propset;
short r1=100, r2=100, r3=100;
short mouse[2];
+
+ if(sculpt_data()->flags & SCULPT_INPUT_SMOOTH)
+ sculpt_stroke_draw();
+
if(pd) {
if(pd->mode == PropsetSize) {
r1= sculptmode_brush()->size;
@@ -2942,7 +2979,6 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glPushMatrix();
glTranslatef(pd->origloc[0], pd->origloc[1], 0);
@@ -2976,7 +3012,7 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
sdrawXORline(pd->origloc[0], pd->origloc[1], mouse[0], mouse[1]);
}
}
- else if(sculpt_data()->draw_flag & SCULPTDRAW_BRUSH) {
+ else if(sculpt_data()->flags & SCULPT_DRAW_BRUSH) {
short csc[2], car[2];
getmouseco_sc(csc);
getmouseco_areawin(car);
@@ -2989,6 +3025,17 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
}
retopo_draw_paint_lines();
+ if(!G.obedit && OBACT && G.f&G_PARTICLEEDIT && area_is_active_area(v3d->area)){
+ ParticleSystem *psys = PE_get_current(OBACT);
+ ParticleEditSettings *pset = PE_settings();
+
+ short c[2];
+ if(psys && psys->edit && pset->brushtype>=0){
+ getmouseco_areawin(c);
+ fdrawXORcirc((float)c[0], (float)c[1], (float)pset->brush[pset->brushtype].size);
+ }
+ }
+
if(v3d->persp>1) drawviewborder();
if(v3d->flag2 & V3D_FLYMODE) drawviewborder_flymode();
if(!(G.f & G_PLAYANIM)) drawcursor(v3d);
@@ -3012,7 +3059,7 @@ void drawview3dspace(ScrArea *sa, void *spacedata)
sa->win_swap= WIN_BACK_OK;
- if(G.f & (G_VERTEXPAINT|G_FACESELECT|G_TEXTUREPAINT|G_WEIGHTPAINT)) {
+ if(G.f & G_VERTEXPAINT || G.f & G_WEIGHTPAINT || G.f & G_TEXTUREPAINT) {
v3d->flag |= V3D_NEEDBACKBUFDRAW;
addafterqueue(sa->win, BACKBUFDRAW, 1);
}
@@ -3162,13 +3209,20 @@ void drawview3d_render(struct View3D *v3d, int winx, int winy)
double tottime = 0.0;
+static ScrArea *oldsa;
+static double swaptime;
+static int curmode;
int update_time(void)
{
static double ltime;
double time;
- if ((U.mixbufsize)&&(audiostream_pos() != CFRA)&&(G.scene->audio.flag & AUDIO_SYNC)) return 0;
+ if ((U.mixbufsize)
+ && (audiostream_pos() != CFRA)
+ && (G.scene->audio.flag & AUDIO_SYNC)) {
+ return 0;
+ }
time = PIL_check_seconds_timer();
@@ -3177,60 +3231,169 @@ int update_time(void)
return (tottime < 0.0);
}
-void inner_play_anim_loop(int init, int mode)
+static void inner_play_prefetch_frame(int mode, int cfra)
{
ScrArea *sa;
- static ScrArea *oldsa;
- static double swaptime;
- static int curmode;
-
- /* init */
- if(init) {
- oldsa= curarea;
- swaptime= 1.0/(float)G.scene->r.frs_sec;
- tottime= 0.0;
- curmode= mode;
+ int oldcfra = CFRA;
+ ScrArea *oldcurarea = curarea;
+ if (!U.prefetchframes) {
return;
}
- set_timecursor(CFRA);
-
- update_for_newframe_nodraw(1); /* adds no events in UI */
+ CFRA = cfra;
sa= G.curscreen->areabase.first;
while(sa) {
if(sa==oldsa) {
- scrarea_do_windraw(sa);
+ scrarea_do_winprefetchdraw(sa);
}
- else if(curmode & 1) { /* all view3d and seq spaces */
+ else if(mode & 1) { /* all view3d and seq spaces */
if ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_SEQ) {
- scrarea_do_windraw(sa);
+ scrarea_do_winprefetchdraw(sa);
}
}
- else if(curmode & 4) { /* all seq spaces */
+ else if(mode & 4) { /* all seq spaces */
if (sa->spacetype == SPACE_SEQ) {
- scrarea_do_windraw(sa);
+ scrarea_do_winprefetchdraw(sa);
}
}
sa= sa->next;
}
+
+ CFRA = oldcfra;
+ curarea = oldcurarea;
+}
+
+static void inner_play_prefetch_startup(int mode)
+{
+ int i;
+
+ if (!U.prefetchframes) {
+ return;
+ }
+
+ seq_start_threads();
+
+ for (i = 0; i <= U.prefetchframes; i++) {
+ int cfra = CFRA + i;
+ inner_play_prefetch_frame(mode, cfra);
+ }
+
+ seq_wait_for_prefetch_ready();
+}
+
+static void inner_play_prefetch_shutdown(int mode)
+{
+ if (!U.prefetchframes) {
+ return;
+ }
+ seq_stop_threads();
+}
+
+void inner_play_anim_loop(int init, int mode)
+{
+ ScrArea *sa;
+ static int last_cfra = -1;
+
+ /* init */
+ if(init) {
+ oldsa= curarea;
+ swaptime= 1.0/FPS;
+ tottime= 0.0;
+ curmode= mode;
+ last_cfra = -1;
+
+ return;
+ }
+
+ if (CFRA != last_cfra) {
+ int pf;
+ set_timecursor(CFRA);
+ update_for_newframe_nodraw(1); /* adds no events in UI */
+
+ sa= G.curscreen->areabase.first;
+ while(sa) {
+ if(sa==oldsa) {
+ scrarea_do_windraw(sa);
+ }
+ else if(curmode & 1) { /* all view3d and seq spaces */
+ if ELEM(sa->spacetype, SPACE_VIEW3D, SPACE_SEQ) {
+ scrarea_do_windraw(sa);
+ }
+ }
+ else if(curmode & 4) { /* all seq spaces */
+ if (sa->spacetype == SPACE_SEQ) {
+ scrarea_do_windraw(sa);
+ }
+ }
+
+ sa= sa->next;
+ }
+
+ if (last_cfra == -1) {
+ last_cfra = CFRA - 1;
+ }
+
+ if (U.prefetchframes) {
+ pf = last_cfra;
+
+ if (CFRA - last_cfra >= U.prefetchframes ||
+ CFRA - last_cfra < 0) {
+ pf = CFRA - U.prefetchframes;
+ fprintf(stderr,
+ "SEQ-THREAD: Lost sync, "
+ "stopping threads, "
+ "back to skip mode...\n");
+ seq_stop_threads();
+ } else {
+ while (pf < CFRA) {
+ int c;
+ pf++;
+ c = pf + U.prefetchframes;
+ if (c >= PEFRA) {
+ c -= PEFRA;
+ c += PSFRA;
+ }
+
+ inner_play_prefetch_frame(curmode, c);
+ }
+ }
+
+ }
+ }
+
+ last_cfra = CFRA;
+
/* make sure that swaptime passed by */
tottime -= swaptime;
- while (update_time()) PIL_sleep_ms(1);
-
- if(CFRA>=PEFRA) {
- if (tottime > 0.0) tottime = 0.0;
- CFRA= PSFRA;
+ while (update_time()) {
+ PIL_sleep_ms(1);
+ }
+
+ if (CFRA >= PEFRA) {
+ if (tottime > 0.0) {
+ tottime = 0.0;
+ }
+ CFRA = PSFRA;
audiostream_stop();
audiostream_start( CFRA );
+ } else {
+ if (U.mixbufsize
+ && (G.scene->audio.flag & AUDIO_SYNC)) {
+ CFRA = audiostream_pos();
+ } else {
+ CFRA++;
+ }
+ if (CFRA < last_cfra) {
+ fprintf(stderr,
+ "SEQ-THREAD: CFRA running backwards: %d\n",
+ CFRA);
+ }
}
- else {
- if (U.mixbufsize && (G.scene->audio.flag & AUDIO_SYNC)) CFRA = audiostream_pos();
- else CFRA++;
- }
+
}
/* play_anim: 'mode' defines where to play and if repeat is on (now bitfield):
@@ -3251,22 +3414,24 @@ int play_anim(int mode)
if(PSFRA>PEFRA) return 0;
- update_time();
-
/* waitcursor(1); */
G.f |= G_PLAYANIM; /* in sequence.c and view.c this is handled */
cfraont= CFRA;
oldsa= curarea;
- audiostream_start( CFRA );
-
if (curarea && curarea->spacetype == SPACE_SEQ) {
SpaceSeq *sseq = curarea->spacedata.first;
if (sseq->mainb == 0) mode |= 4;
}
+
+ inner_play_prefetch_startup(mode);
+
+ update_time();
inner_play_anim_loop(1, mode); /* 1==init */
+
+ audiostream_start( CFRA );
/* forces all buffers to be OK for current frame (otherwise other windows get redrawn with CFRA+1) */
curarea->win_swap= WIN_BACK_OK;
@@ -3307,6 +3472,7 @@ int play_anim(int mode)
if(event==SPACEKEY);
else CFRA= cfraont;
+ inner_play_prefetch_shutdown(mode);
audiostream_stop();
if(oldsa!=curarea) areawinset(oldsa->win);
diff --git a/source/blender/src/edit.c b/source/blender/src/edit.c
index 5a088ec6bef..accdd4b8990 100644
--- a/source/blender/src/edit.c
+++ b/source/blender/src/edit.c
@@ -52,12 +52,14 @@
#include "DNA_action_types.h"
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
+#include "DNA_group_types.h"
#include "DNA_ipo_types.h"
#include "DNA_lattice_types.h"
#include "DNA_meta_types.h"
#include "DNA_mesh_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
@@ -81,6 +83,7 @@
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_utildefines.h"
#ifdef WITH_VERSE
@@ -90,6 +93,7 @@
#include "BIF_editmesh.h"
#include "BIF_editview.h"
#include "BIF_editarmature.h"
+#include "BIF_editparticle.h"
#include "BIF_gl.h"
#include "BIF_glutil.h"
#include "BIF_interface.h"
@@ -120,6 +124,7 @@
/*#include "armature.h"*/
/* #include "edit.h" */
#include "nla.h"
+#include "transform.h"
#ifdef __NLA
#include "BIF_editarmature.h"
@@ -421,9 +426,12 @@ int get_border(rcti *rect, short flag)
circle_selectCB(&obedit_selectionCB);
}
}
- else if (G.f&G_FACESELECT) {
+ else if (FACESEL_PAINT_TEST) {
circle_selectCB(&obedit_selectionCB);
}
+ else if (G.f&G_PARTICLEEDIT) {
+ circle_selectCB(&PE_selectionCB);
+ }
return 0;
case SPACE_IMAGE: // brush select in UV editor
@@ -476,7 +484,7 @@ void draw_sel_circle(short *mval, short *mvalo, float rad, float rado, int selec
void circle_selectCB(select_CBfunc callback)
{
static float rad= 40.0;
- float rado;
+ float rado= rad;
int firsttime=1;
int escape= 0;
unsigned short event;
@@ -494,8 +502,6 @@ void circle_selectCB(select_CBfunc callback)
draw_sel_circle(mval, NULL, rad, 0.0, selecting); // draws frontbuffer, but sets backbuf again
- rado= rad;
-
while(TRUE) {
if(mval[0]!=mvalo[0] || mval[1]!=mvalo[1] || rado!=rad || firsttime) {
@@ -768,7 +774,7 @@ void countall()
allqueue(REDRAWINFO, 1); /* 1, because header->win==0! */
return;
}
- else if(G.f & (G_FACESELECT + G_VERTEXPAINT + G_TEXTUREPAINT +G_WEIGHTPAINT)) {
+ else if(FACESEL_PAINT_TEST) {
me= get_mesh((G.scene->basact) ? (G.scene->basact->object) : 0);
if(me) {
G.totface= me->totface;
@@ -786,8 +792,47 @@ void countall()
ob= base->object; /* warning, ob not is obact anymore */
if(base->flag & SELECT) G.totobjsel++;
-
- if(ob->parent && (ob->parent->transflag & (OB_DUPLIVERTS|OB_DUPLIFACES))) {
+
+ if(ob->transflag & OB_DUPLIPARTS) {
+ ParticleSystem *psys;
+ ParticleSettings *part;
+ int step_nbr;
+
+ for(psys=ob->particlesystem.first; psys; psys=psys->next){
+ part=psys->part;
+
+ //if(psys->flag&PSYS_BAKED && part->draw&PART_DRAW_KEYS)
+ // step_nbr=part->keys_step;
+ //else
+ step_nbr=1;
+
+ if(part->draw_as==PART_DRAW_OB && part->dup_ob){
+ int tot=count_particles(psys);
+ count_object(part->dup_ob, 0, tot*step_nbr);
+ }
+ else if(part->draw_as==PART_DRAW_GR && part->dup_group){
+ GroupObject *go;
+ int tot, totgroup=0, cur=0;
+
+ go= part->dup_group->gobject.first;
+ while(go){
+ go=go->next;
+ totgroup++;
+ }
+ go= part->dup_group->gobject.first;
+ while(go){
+ tot=count_particles_mod(psys,totgroup,cur);
+ count_object(go->ob, 0, tot*step_nbr);
+ cur++;
+ go=go->next;
+ }
+ }
+ }
+
+ count_object(ob, base->flag & SELECT, 1);
+ G.totobj++;
+ }
+ else if(ob->parent && (ob->parent->transflag & (OB_DUPLIVERTS|OB_DUPLIFACES))) {
int tot= count_duplilist(ob->parent);
G.totobj+=tot;
count_object(ob, base->flag & SELECT, tot);
@@ -883,7 +928,7 @@ static void special_transvert_update(void)
}
/* copied from editobject.c, needs to be replaced with new transform code still */
-/* mode: 1 = proportional */
+/* mode: 1 = proportional, 2 = all joints (for bones only) */
static void make_trans_verts(float *min, float *max, int mode)
{
extern ListBase editNurb;
@@ -955,7 +1000,7 @@ static void make_trans_verts(float *min, float *max, int mode)
}
/* proportional edit exception... */
- if(mode==1 && tottrans) {
+ if((mode & 1) && tottrans) {
for(eve= em->verts.first; eve; eve= eve->next) {
if(eve->h==0) {
eve->f1 |= 2;
@@ -991,8 +1036,9 @@ static void make_trans_verts(float *min, float *max, int mode)
short rootok= (!(ebo->parent && (ebo->flag & BONE_CONNECTED) && ebo->parent->flag & BONE_TIPSEL));
if ((tipsel && rootsel) || (rootsel)) {
- /* Only add the root if there is no connection.
- * Don't add the tip, otherwise we get zero-length bones.
+ /* Don't add the tip (unless mode & 2, for getting all joints),
+ * otherwise we get zero-length bones as tips will snap to the same
+ * location as heads.
*/
if (rootok) {
VECCOPY (tv->oldloc, ebo->head);
@@ -1002,6 +1048,15 @@ static void make_trans_verts(float *min, float *max, int mode)
tv++;
tottrans++;
}
+
+ if ((mode & 2) && (tipsel)) {
+ VECCOPY (tv->oldloc, ebo->tail);
+ tv->loc= ebo->tail;
+ tv->nor= NULL;
+ tv->flag= 1;
+ tv++;
+ tottrans++;
+ }
}
else if (tipsel) {
VECCOPY (tv->oldloc, ebo->tail);
@@ -1022,14 +1077,14 @@ static void make_trans_verts(float *min, float *max, int mode)
bezt= nu->bezt;
while(a--) {
if(bezt->hide==0) {
- if(mode==1 || (bezt->f1 & 1)) {
+ if((mode & 1) || (bezt->f1 & 1)) {
VECCOPY(tv->oldloc, bezt->vec[0]);
tv->loc= bezt->vec[0];
tv->flag= bezt->f1 & 1;
tv++;
tottrans++;
}
- if(mode==1 || (bezt->f2 & 1)) {
+ if((mode & 1) || (bezt->f2 & 1)) {
VECCOPY(tv->oldloc, bezt->vec[1]);
tv->loc= bezt->vec[1];
tv->val= &(bezt->alfa);
@@ -1038,7 +1093,7 @@ static void make_trans_verts(float *min, float *max, int mode)
tv++;
tottrans++;
}
- if(mode==1 || (bezt->f3 & 1)) {
+ if((mode & 1) || (bezt->f3 & 1)) {
VECCOPY(tv->oldloc, bezt->vec[2]);
tv->loc= bezt->vec[2];
tv->flag= bezt->f3 & 1;
@@ -1054,7 +1109,7 @@ static void make_trans_verts(float *min, float *max, int mode)
bp= nu->bp;
while(a--) {
if(bp->hide==0) {
- if(mode==1 || (bp->f1 & 1)) {
+ if((mode & 1) || (bp->f1 & 1)) {
VECCOPY(tv->oldloc, bp->vec);
tv->loc= bp->vec;
tv->val= &(bp->alfa);
@@ -1092,7 +1147,7 @@ static void make_trans_verts(float *min, float *max, int mode)
a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
while(a--) {
- if(mode==1 || (bp->f1 & 1)) {
+ if((mode & 1) || (bp->f1 & 1)) {
if(bp->hide==0) {
VECCOPY(tv->oldloc, bp->vec);
tv->loc= bp->vec;
@@ -1147,13 +1202,13 @@ void snap_sel_to_grid()
if ELEM6(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
make_trans_verts(bmat[0], bmat[1], 0);
if(tottrans==0) return;
-
+
Mat3CpyMat4(bmat, G.obedit->obmat);
Mat3Inv(imat, bmat);
-
+
tv= transvmain;
for(a=0; a<tottrans; a++, tv++) {
-
+
VECCOPY(vec, tv->loc);
Mat3MulVecfl(bmat, vec);
VecAddf(vec, vec, G.obedit->obmat[3]);
@@ -1161,17 +1216,17 @@ void snap_sel_to_grid()
vec[1]= G.vd->gridview*floor(.5+ vec[1]/gridf);
vec[2]= G.vd->gridview*floor(.5+ vec[2]/gridf);
VecSubf(vec, vec, G.obedit->obmat[3]);
-
+
Mat3MulVecfl(imat, vec);
VECCOPY(tv->loc, vec);
-
+
}
-
+
special_transvert_update();
MEM_freeN(transvmain);
transvmain= 0;
-
+
allqueue(REDRAWVIEW3D, 0);
return;
}
@@ -1209,7 +1264,10 @@ void snap_sel_to_grid()
}
}
ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- ob->recalc |= OB_RECALC_DATA;
+
+ /* auto-keyframing */
+ autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -1217,10 +1275,10 @@ void snap_sel_to_grid()
vec[0]= -ob->obmat[3][0]+G.vd->gridview*floor(.5+ ob->obmat[3][0]/gridf);
vec[1]= -ob->obmat[3][1]+G.vd->gridview*floor(.5+ ob->obmat[3][1]/gridf);
vec[2]= -ob->obmat[3][2]+G.vd->gridview*floor(.5+ ob->obmat[3][2]/gridf);
-
+
if(ob->parent) {
where_is_object(ob);
-
+
Mat3Inv(imat, originmat);
Mat3MulVecfl(imat, vec);
ob->loc[0]+= vec[0];
@@ -1235,6 +1293,9 @@ void snap_sel_to_grid()
#ifdef WITH_VERSE
if(ob->vnode) b_verse_send_transformation(ob);
#endif
+
+ /* auto-keyframing */
+ autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
}
}
@@ -1257,31 +1318,29 @@ void snap_sel_to_curs()
if(G.obedit) {
tottrans= 0;
-
+
if ELEM6(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
make_trans_verts(bmat[0], bmat[1], 0);
if(tottrans==0) return;
-
+
Mat3CpyMat4(bmat, G.obedit->obmat);
Mat3Inv(imat, bmat);
-
+
tv= transvmain;
for(a=0; a<tottrans; a++, tv++) {
-
vec[0]= curs[0]-G.obedit->obmat[3][0];
vec[1]= curs[1]-G.obedit->obmat[3][1];
vec[2]= curs[2]-G.obedit->obmat[3][2];
-
+
Mat3MulVecfl(imat, vec);
VECCOPY(tv->loc, vec);
-
}
special_transvert_update();
MEM_freeN(transvmain);
transvmain= 0;
-
+
allqueue(REDRAWVIEW3D, 0);
return;
}
@@ -1318,7 +1377,10 @@ void snap_sel_to_curs()
}
}
ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- ob->recalc |= OB_RECALC_DATA;
+
+ /* auto-keyframing */
+ autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -1326,10 +1388,10 @@ void snap_sel_to_curs()
vec[0]= -ob->obmat[3][0] + curs[0];
vec[1]= -ob->obmat[3][1] + curs[1];
vec[2]= -ob->obmat[3][2] + curs[2];
-
+
if(ob->parent) {
where_is_object(ob);
-
+
Mat3Inv(imat, originmat);
Mat3MulVecfl(imat, vec);
ob->loc[0]+= vec[0];
@@ -1344,6 +1406,9 @@ void snap_sel_to_curs()
#ifdef WITH_VERSE
if(ob->vnode) b_verse_send_transformation(ob);
#endif
+
+ /* auto-keyframing */
+ autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
}
}
@@ -1365,7 +1430,6 @@ void snap_curs_to_grid()
curs[2]= G.vd->gridview*floor(.5+curs[2]/gridf);
allqueue(REDRAWVIEW3D, 0);
-
}
void snap_curs_to_sel()
@@ -1383,13 +1447,13 @@ void snap_curs_to_sel()
if(G.obedit) {
tottrans=0;
-
+
if ELEM6(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
- make_trans_verts(bmat[0], bmat[1], 0);
+ make_trans_verts(bmat[0], bmat[1], 2);
if(tottrans==0) return;
-
+
Mat3CpyMat4(bmat, G.obedit->obmat);
-
+
tv= transvmain;
for(a=0; a<tottrans; a++, tv++) {
VECCOPY(vec, tv->loc);
@@ -1398,7 +1462,7 @@ void snap_curs_to_sel()
VecAddf(centroid, centroid, vec);
DO_MINMAX(vec, min, max);
}
-
+
if(G.vd->around==V3D_CENTROID) {
VecMulf(centroid, 1.0/(float)tottrans);
VECCOPY(curs, centroid);
@@ -1469,20 +1533,20 @@ void snap_curs_to_firstsel()
if(G.obedit) {
tottrans=0;
-
+
if ELEM6(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
make_trans_verts(bmat[0], bmat[1], 0);
if(tottrans==0) return;
-
+
Mat3CpyMat4(bmat, G.obedit->obmat);
-
+
tv= transvmain;
VECCOPY(vec, tv->loc);
/*Mat3MulVecfl(bmat, vec);
VecAddf(vec, vec, G.obedit->obmat[3]);
VecAddf(centroid, centroid, vec);
DO_MINMAX(vec, min, max);*/
-
+
if(G.vd->around==V3D_CENTROID) {
VecMulf(vec, 1.0/(float)tottrans);
VECCOPY(curs, vec);
@@ -1538,14 +1602,14 @@ void snap_to_center()
if(G.obedit) {
tottrans= 0;
-
+
if ELEM6(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
make_trans_verts(bmat[0], bmat[1], 0);
if(tottrans==0) return;
-
+
Mat3CpyMat4(bmat, G.obedit->obmat);
Mat3Inv(imat, bmat);
-
+
tv= transvmain;
for(a=0; a<tottrans; a++, tv++) {
VECCOPY(vec, tv->loc);
@@ -1554,7 +1618,7 @@ void snap_to_center()
VecAddf(centroid, centroid, vec);
DO_MINMAX(vec, min, max);
}
-
+
if(G.vd->around==V3D_CENTROID) {
VecMulf(centroid, 1.0/(float)tottrans);
VECCOPY(snaploc, centroid);
@@ -1567,7 +1631,6 @@ void snap_to_center()
MEM_freeN(transvmain);
transvmain= 0;
-
}
else {
base= (G.scene->base.first);
@@ -1615,21 +1678,20 @@ void snap_to_center()
/* Snap the selection to the snaplocation (duh!) */
if(G.obedit) {
tottrans= 0;
-
+
if ELEM6(G.obedit->type, OB_ARMATURE, OB_LATTICE, OB_MESH, OB_SURF, OB_CURVE, OB_MBALL)
make_trans_verts(bmat[0], bmat[1], 0);
if(tottrans==0) return;
-
+
Mat3CpyMat4(bmat, G.obedit->obmat);
Mat3Inv(imat, bmat);
-
+
tv= transvmain;
for(a=0; a<tottrans; a++, tv++) {
-
vec[0]= snaploc[0]-G.obedit->obmat[3][0];
vec[1]= snaploc[1]-G.obedit->obmat[3][1];
vec[2]= snaploc[2]-G.obedit->obmat[3][2];
-
+
Mat3MulVecfl(imat, vec);
VECCOPY(tv->loc, vec);
}
@@ -1638,7 +1700,7 @@ void snap_to_center()
MEM_freeN(transvmain);
transvmain= 0;
-
+
allqueue(REDRAWVIEW3D, 0);
return;
}
@@ -1667,8 +1729,11 @@ void snap_to_center()
}
}
}
- ob->pose->flag |= (POSE_LOCKED|POSE_DO_UNLOCK);
- ob->recalc |= OB_RECALC_DATA;
+
+ /* auto-keyframing */
+ ob->pose->flag |= POSE_DO_UNLOCK;
+ autokeyframe_pose_cb_func(ob, TFM_TRANSLATION, 0);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
else {
ob->recalc |= OB_RECALC_OB;
@@ -1676,10 +1741,10 @@ void snap_to_center()
vec[0]= -ob->obmat[3][0] + snaploc[0];
vec[1]= -ob->obmat[3][1] + snaploc[1];
vec[2]= -ob->obmat[3][2] + snaploc[2];
-
+
if(ob->parent) {
where_is_object(ob);
-
+
Mat3Inv(imat, originmat);
Mat3MulVecfl(imat, vec);
ob->loc[0]+= vec[0];
@@ -1694,9 +1759,12 @@ void snap_to_center()
#ifdef WITH_VERSE
if(ob->vnode) b_verse_send_transformation(ob);
#endif
+
+ /* auto-keyframing */
+ autokeyframe_ob_cb_func(ob, TFM_TRANSLATION);
}
}
-
+
base= base->next;
}
DAG_scene_flush_update(G.scene, screen_view3d_layers());
@@ -1794,6 +1862,9 @@ void delete_context_selected(void)
else if(G.obedit->type==OB_MBALL) delete_mball();
else if (G.obedit->type==OB_ARMATURE) delete_armature();
}
+ else if(G.f & G_PARTICLEEDIT){
+ PE_delete_particle();
+ }
else delete_obj(0);
}
@@ -1805,9 +1876,9 @@ void duplicate_context_selected(void)
else if(G.obedit->type==OB_MBALL) adduplicate_mball();
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) adduplicate_nurb();
}
- else {
+ else if(G.f & G_PARTICLEEDIT);
+ else
adduplicate(0, U.dupflag);
- }
}
void toggle_shading(void)
diff --git a/source/blender/src/editaction.c b/source/blender/src/editaction.c
index 95a61707141..48a39875cc2 100644
--- a/source/blender/src/editaction.c
+++ b/source/blender/src/editaction.c
@@ -80,6 +80,7 @@
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_toolbox.h"
+#include "BIF_transform.h"
#include "BSE_edit.h"
#include "BSE_drawipo.h"
@@ -172,34 +173,6 @@ void remake_action_ipos (bAction *act)
synchronize_action_strips();
}
-static void remake_meshaction_ipos (Ipo *ipo)
-{
- /* this puts the bezier triples in proper
- * order and makes sure the bezier handles
- * aren't too strange.
- */
- IpoCurve *icu;
-
- for (icu = ipo->curve.first; icu; icu=icu->next) {
- sort_time_ipocurve(icu);
- testhandles_ipocurve(icu);
- }
-}
-
-static void meshkey_do_redraw (Key *key)
-{
- if(key->ipo)
- remake_meshaction_ipos(key->ipo);
-
- DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
-
- allspace(REMAKEIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWNLA, 0);
-
-}
-
/* **************************************************** */
/* FILTER->EDIT STRUCTURES */
/*
@@ -324,6 +297,10 @@ static void actdata_filter_action (ListBase *act_data, bAction *act, int filter_
if (ale) BLI_addtail(act_data, ale);
}
}
+ else {
+ /* only consider selected channels - achan not selected */
+ continue;
+ }
/* check if expanded - if not, continue on to next action channel */
if (EXPANDED_ACHAN(achan) == 0 && (filter_mode & ACTFILTER_ONLYICU)==0)
@@ -380,19 +357,53 @@ static void actdata_filter_action (ListBase *act_data, bAction *act, int filter_
static void actdata_filter_shapekey (ListBase *act_data, Key *key, int filter_mode)
{
bActListElem *ale;
+ KeyBlock *kb;
IpoCurve *icu;
+ int i;
- /* loop over ipo curves if present */
- if (key->ipo) {
- if (filter_mode & ACTFILTER_IPOKEYS) {
- ale= make_new_actlistelem(key->ipo, ACTTYPE_IPO, key, ACTTYPE_SHAPEKEY);
- if (ale) BLI_addtail(act_data, ale);
+ /* are we filtering for display or editing */
+ if (filter_mode & ACTFILTER_FORDRAWING) {
+ /* for display - loop over shapekeys, adding ipo-curve references where needed */
+ kb= key->block.first;
+
+ /* loop through possible shapekeys, manually creating entries */
+ for (i= 1; i < key->totkey; i++) {
+ ale= MEM_callocN(sizeof(bActListElem), "bActListElem");
+ kb = kb->next;
+
+ ale->data= kb;
+ ale->type= ACTTYPE_SHAPEKEY; /* 'abused' usage of this type */
+ ale->owner= key;
+ ale->ownertype= ACTTYPE_SHAPEKEY;
+ ale->datatype= ALE_NONE;
+ ale->index = i;
+
+ if (key->ipo) {
+ for (icu= key->ipo->curve.first; icu; icu=icu->next) {
+ if (icu->adrcode == i) {
+ ale->key_data= icu;
+ ale->datatype= ALE_ICU;
+ break;
+ }
+ }
+ }
+
+ BLI_addtail(act_data, ale);
}
- else {
- for (icu= key->ipo->curve.first; icu; icu=icu->next) {
- ale= make_new_actlistelem(icu, ACTTYPE_ICU, key, ACTTYPE_SHAPEKEY);
+ }
+ else {
+ /* loop over ipo curves if present - for editing */
+ if (key->ipo) {
+ if (filter_mode & ACTFILTER_IPOKEYS) {
+ ale= make_new_actlistelem(key->ipo, ACTTYPE_IPO, key, ACTTYPE_SHAPEKEY);
if (ale) BLI_addtail(act_data, ale);
}
+ else {
+ for (icu= key->ipo->curve.first; icu; icu=icu->next) {
+ ale= make_new_actlistelem(icu, ACTTYPE_ICU, key, ACTTYPE_SHAPEKEY);
+ if (ale) BLI_addtail(act_data, ale);
+ }
+ }
}
}
}
@@ -446,23 +457,24 @@ void actdata_filter (ListBase *act_data, int filter_mode, void *data, short data
* returns key data for RVK type meshes). If there
* is an action that is pinned, return null
*/
+/* Note: there's a similar function in key.c (ob_get_key) */
Key *get_action_mesh_key(void)
{
Object *ob;
Key *key;
ob = OBACT;
- if (!ob) return NULL;
+ if (ob == NULL)
+ return NULL;
if (G.saction->pin) return NULL;
- if (ob->type==OB_MESH ) {
+ if (ob->type==OB_MESH)
key = ((Mesh *)ob->data)->key;
- }
- else if (ob->type==OB_LATTICE ) {
+ else if (ob->type==OB_LATTICE)
key = ((Lattice *)ob->data)->key;
- }
- else return NULL;
+ else
+ return NULL;
if (key) {
if (key->type == KEY_RELATIVE)
@@ -521,7 +533,7 @@ void *get_nearest_act_channel (short mval[], short *ret_type)
}
/* filter data */
- filter= (ACTFILTER_VISIBLE | ACTFILTER_CHANNELS);
+ filter= (ACTFILTER_FORDRAWING | ACTFILTER_VISIBLE | ACTFILTER_CHANNELS);
actdata_filter(&act_data, filter, data, datatype);
for (ale= act_data.first; ale; ale= ale->next) {
@@ -547,82 +559,24 @@ void *get_nearest_act_channel (short mval[], short *ret_type)
return NULL;
}
-/* helper for get_nearest_[action,mesh]channel_key */
-static IpoCurve *get_nearest_icu_key (IpoCurve *curve, float *selx, short *sel, float xrange[])
-{
- /* try to find first beztriple in bounds that is selected */
- IpoCurve *icu, *firsticu=NULL;
- int foundsel=0;
- float firstvert=-1, foundx=-1;
- int i;
-
- if (curve == NULL)
- return NULL;
-
- /* lets loop through the IpoCurves trying to find the closest bezier */
- for (icu= curve; icu ; icu= icu->next) {
- /* loop through the beziers in the curve */
- for (i=0; i<icu->totvert; i++) {
- /* Is this bezier in the right area? */
- if (icu->bezt[i].vec[1][0] > xrange[0] &&
- icu->bezt[i].vec[1][0] <= xrange[1] ) {
-
- /* if no other curves have been picked ... */
- if (firsticu==NULL) {
- /* mark this curve/bezier as the first selected */
- firsticu= icu;
- firstvert= icu->bezt[i].vec[1][0];
-
- /* sel = (is the bezier is already selected) ? 1 : 0; */
- *sel = (icu->bezt[i].f2 & 1);
- }
-
- /* if the bezier is selected ... */
- if (icu->bezt[i].f2 & 1) {
- /* if we haven't found a selected one yet ... */
- if (!foundsel) {
- /* record the found x value */
- foundsel=1;
- foundx = icu->bezt[i].vec[1][0];
-
- }
- }
-
- /* if the bezier is unselected and not at the x
- * position of a previous found selected bezier ...
- */
- else if (foundsel && icu->bezt[i].vec[1][0] != foundx){
- /* lets return this found curve/bezier */
- *sel = 0;
- *selx= icu->bezt[i].vec[1][0];
- return icu;
- }
- }
- }
- }
-
- /* return what we've found */
- *selx=firstvert;
- return firsticu;
-}
-
/* used only by mouse_action. It is used to find the location of the nearest
* keyframe to where the mouse clicked,
*/
static void *get_nearest_action_key (float *selx, short *sel, short *ret_type, bActionChannel **par)
{
ListBase act_data = {NULL, NULL};
+ ListBase act_keys = {NULL, NULL};
bActListElem *ale;
+ ActKeyColumn *ak;
void *data;
short datatype;
int filter;
- IpoCurve *icu;
rctf rectf;
float xmin, xmax, x, y;
- float xrange[2];
int clickmin, clickmax;
short mval[2];
+ short found = 0;
getmouseco_areawin (mval);
@@ -646,7 +600,7 @@ static void *get_nearest_action_key (float *selx, short *sel, short *ret_type, b
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
/* if action is mapped in NLA, it returns a correction */
- if (G.saction->pin==0 && OBACT && datatype==ACTCONT_ACTION) {
+ if (NLA_ACTION_SCALED && datatype==ACTCONT_ACTION) {
xmin= get_action_frame(OBACT, rectf.xmin);
xmax= get_action_frame(OBACT, rectf.xmax);
}
@@ -659,12 +613,9 @@ static void *get_nearest_action_key (float *selx, short *sel, short *ret_type, b
*ret_type= ACTTYPE_NONE;
return NULL;
}
-
- xrange[0]= xmin;
- xrange[1]= xmax;
-
+
/* filter data */
- filter= (ACTFILTER_VISIBLE | ACTFILTER_CHANNELS);
+ filter= (ACTFILTER_FORDRAWING | ACTFILTER_VISIBLE | ACTFILTER_CHANNELS);
actdata_filter(&act_data, filter, data, datatype);
for (ale= act_data.first; ale; ale= ale->next) {
@@ -672,30 +623,51 @@ static void *get_nearest_action_key (float *selx, short *sel, short *ret_type, b
break;
if (clickmin <= 0) {
/* found match */
- *ret_type= ale->type;
- /* find location of keyframe (if applicable) */
+ /* make list of keyframes */
if (ale->key_data) {
switch (ale->datatype) {
case ALE_IPO:
{
Ipo *ipo= (Ipo *)ale->key_data;
- icu= get_nearest_icu_key(ipo->curve.first, selx, sel, xrange);
+ ipo_to_keylist(ipo, &act_keys, NULL);
}
break;
case ALE_ICU:
{
- icu= (IpoCurve *)ale->key_data;
- icu= get_nearest_icu_key(icu, selx, sel, xrange);
+ IpoCurve *icu= (IpoCurve *)ale->key_data;
+ icu_to_keylist(icu, &act_keys, NULL);
}
break;
}
}
+ /* loop through keyframes, finding one that was clicked on */
+ for (ak= act_keys.first; ak; ak= ak->next) {
+ if (IN_RANGE(ak->cfra, xmin, xmax)) {
+ *selx= ak->cfra;
+ found= 1;
+ break;
+ }
+ }
+ /* no matching keyframe found - set to mean frame value so it doesn't actually select anything */
+ if (found == 0)
+ *selx= ((xmax+xmin) / 2);
+
/* figure out what to return */
- if (datatype == ACTCONT_ACTION)
+ if (datatype == ACTCONT_ACTION) {
*par= ale->owner; /* assume that this is an action channel */
- data = ale->data;
+ *ret_type= ale->type;
+ data = ale->data;
+ }
+ else if (datatype == ACTCONT_SHAPEKEY) {
+ data = ale->key_data;
+ *ret_type= ACTTYPE_ICU;
+ }
+
+ /* cleanup tempolary lists */
+ BLI_freelistN(&act_keys);
+ act_keys.first = act_keys.last = NULL;
BLI_freelistN(&act_data);
@@ -738,329 +710,9 @@ void *get_action_context (short *datatype)
/* **************************************************** */
/* TRANSFORM TOOLS */
-/* initialise the transform data - create transverts */
-static TransVert *transform_action_init (int *tvtot, float *minx, float *maxx)
-{
- ListBase act_data = {NULL, NULL};
- bActListElem *ale;
- TransVert *tv;
- void *data;
- short datatype;
- int filter;
- int count= 0;
- float min= 0, max= 0;
- int i;
-
- /* initialise the values being passed by reference */
- *tvtot = *minx = *maxx = 0;
-
- /* determine what type of data we are operating on */
- data = get_action_context(&datatype);
- if (data == NULL) return NULL;
-
- /* filter data */
- filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
- actdata_filter(&act_data, filter, data, datatype);
-
- /* loop 1: fully select ipo-keys and count how many BezTriples are selected */
- for (ale= act_data.first; ale; ale= ale->next)
- count += fullselect_ipo_keys(ale->key_data);
-
- /* stop if trying to build list if nothing selected */
- if (count == 0) return NULL;
-
- /* Build the transvert structure */
- tv = MEM_callocN (sizeof(TransVert) * count, "transVert");
-
- /* loop 2: build transvert structure */
- for (ale= act_data.first; ale; ale= ale->next)
- *tvtot = add_trans_ipo_keys(ale->key_data, tv, *tvtot);
-
- /* min max, only every other three */
- min= max= tv[1].loc[0];
- for (i=1; i<count; i+=3){
- if(min>tv[i].loc[0]) min= tv[i].loc[0];
- if(max<tv[i].loc[0]) max= tv[i].loc[0];
- }
- *minx= min;
- *maxx= max;
-
- /* cleanup temp list */
- BLI_freelistN(&act_data);
-
- /* return created transverts */
- return tv;
-}
-
-/* main transform loop for action editor */
-static short transform_action_loop (TransVert *tv, int tvtot, char mode, short context, float minx, float maxx)
-{
- Object *ob= OBACT;
- float deltax, startx;
- float cenf[2];
- float sval[2], cval[2], lastcval[2]={0,0};
- float fac=0.0f;
- int loop=1, invert=0;
- int i;
- short cancel=0, firsttime=1;
- short mvals[2], mvalc[2], cent[2];
- char str[256];
-
- /* Do the event loop */
- cent[0] = curarea->winx + (G.saction->v2d.hor.xmax)/2;
- cent[1] = curarea->winy + (G.saction->v2d.hor.ymax)/2;
- areamouseco_to_ipoco(G.v2d, cent, &cenf[0], &cenf[1]);
-
- getmouseco_areawin (mvals);
- areamouseco_to_ipoco(G.v2d, mvals, &sval[0], &sval[1]);
-
- if(G.saction->pin==0 && OBACT)
- sval[0]= get_action_frame(OBACT, sval[0]);
-
- /* used for drawing */
- if(mode=='t') {
- G.saction->flag |= SACTION_MOVING;
- G.saction->timeslide= sval[0];
- }
-
- startx=sval[0];
- while (loop) {
- if(mode=='t' && minx==maxx)
- break;
-
- /* Get the input */
- /* If we're cancelling, reset transformations */
- /* Else calc new transformation */
- /* Perform the transformations */
- while (qtest()) {
- short val;
- unsigned short event= extern_qread(&val);
-
- if (val) {
- switch (event) {
- case LEFTMOUSE:
- case SPACEKEY:
- case RETKEY:
- loop=0;
- break;
- case XKEY:
- break;
- case ESCKEY:
- case RIGHTMOUSE:
- cancel=1;
- loop=0;
- break;
- default:
- arrows_move_cursor(event);
- break;
- };
- }
- }
-
- if (cancel) {
- for (i=0; i<tvtot; i++) {
- tv[i].loc[0]=tv[i].oldloc[0];
- tv[i].loc[1]=tv[i].oldloc[1];
- }
- }
- else {
- getmouseco_areawin (mvalc);
- areamouseco_to_ipoco(G.v2d, mvalc, &cval[0], &cval[1]);
-
- if(G.saction->pin==0 && OBACT)
- cval[0]= get_action_frame(OBACT, cval[0]);
-
- if(mode=='t')
- G.saction->timeslide= cval[0];
-
- if (!firsttime && lastcval[0]==cval[0] && lastcval[1]==cval[1]) {
- PIL_sleep_ms(1);
- }
- else {
- short autosnap= 0;
-
- /* determine mode of keyframe snapping/autosnap */
- if (mode != 't') {
- switch (G.saction->autosnap) {
- case SACTSNAP_OFF:
- if (G.qual == LR_CTRLKEY)
- autosnap= SACTSNAP_STEP;
- else if (G.qual == LR_SHIFTKEY)
- autosnap= SACTSNAP_FRAME;
- else
- autosnap= SACTSNAP_OFF;
- break;
- case SACTSNAP_STEP:
- autosnap= (G.qual==LR_CTRLKEY)? SACTSNAP_OFF: SACTSNAP_STEP;
- break;
- case SACTSNAP_FRAME:
- autosnap= (G.qual==LR_SHIFTKEY)? SACTSNAP_OFF: SACTSNAP_FRAME;
- break;
- }
- }
-
- for (i=0; i<tvtot; i++) {
- tv[i].loc[0]=tv[i].oldloc[0];
-
- switch (mode) {
- case 't':
- if( sval[0] > minx && sval[0] < maxx) {
- float timefac, cvalc= CLAMPIS(cval[0], minx, maxx);
-
- /* left half */
- if(tv[i].oldloc[0] < sval[0]) {
- timefac= ( sval[0] - tv[i].oldloc[0])/(sval[0] - minx);
- tv[i].loc[0]= cvalc - timefac*( cvalc - minx);
- }
- else {
- timefac= (tv[i].oldloc[0] - sval[0])/(maxx - sval[0]);
- tv[i].loc[0]= cvalc + timefac*(maxx- cvalc);
- }
- }
- break;
- case 'g':
- if (G.saction->pin==0 && OBACT && context==ACTCONT_ACTION) {
- deltax = get_action_frame_inv(OBACT, cval[0]);
- deltax -= get_action_frame_inv(OBACT, sval[0]);
-
- if (autosnap == SACTSNAP_STEP)
- deltax= 1.0f*floor(deltax/1.0f + 0.5f);
-
- fac = get_action_frame_inv(OBACT, tv[i].loc[0]);
- fac += deltax;
- tv[i].loc[0] = get_action_frame(OBACT, fac);
- }
- else {
- deltax = cval[0] - sval[0];
- fac= deltax;
-
- if (autosnap == SACTSNAP_STEP)
- fac= 1.0f*floor(fac/1.0f + 0.5f);
-
- tv[i].loc[0]+=fac;
- }
- break;
- case 's':
- startx=mvals[0]-(ACTWIDTH/2+(curarea->winrct.xmax-curarea->winrct.xmin)/2);
- deltax=mvalc[0]-(ACTWIDTH/2+(curarea->winrct.xmax-curarea->winrct.xmin)/2);
- fac= fabs(deltax/startx);
-
- if (autosnap == SACTSNAP_STEP) {
- fac= 1.0f*floor(fac/1.0f + 0.5f);
- }
-
- if (invert){
- if (i % 03 == 0){
- memcpy (tv[i].loc, tv[i].oldloc, sizeof(tv[i+2].oldloc));
- }
- if (i % 03 == 2){
- memcpy (tv[i].loc, tv[i].oldloc, sizeof(tv[i-2].oldloc));
- }
-
- fac*=-1;
- }
- startx= (G.scene->r.cfra);
- if(G.saction->pin==0 && OBACT && context==ACTCONT_ACTION)
- startx= get_action_frame(OBACT, startx);
-
- tv[i].loc[0]-= startx;
- tv[i].loc[0]*=fac;
- tv[i].loc[0]+= startx;
-
- break;
- }
-
- /* snap key to nearest frame? */
- if (autosnap == SACTSNAP_FRAME) {
- float snapval;
-
- /* convert frame to nla-action time (if needed) */
- if (G.saction->pin==0 && OBACT && context==ACTCONT_ACTION)
- snapval= get_action_frame_inv(OBACT, tv[i].loc[0]);
- else
- snapval= tv[i].loc[0];
-
- /* snap to nearest frame */
- snapval= (float)(floor(snapval+0.5));
-
- /* convert frame out of nla-action time */
- if (G.saction->pin==0 && OBACT && context==ACTCONT_ACTION)
- tv[i].loc[0]= get_action_frame(OBACT, snapval);
- else
- tv[i].loc[0]= snapval;
- }
- }
-
- if (mode=='s') {
- sprintf(str, "scaleX: %.3f", fac);
- headerprint(str);
- }
- else if (mode=='g') {
- if(G.saction->pin==0 && OBACT && context==ACTCONT_ACTION) {
- /* recalculate the delta based on 'visual' times */
- fac = get_action_frame_inv(OBACT, cval[0]);
- fac -= get_action_frame_inv(OBACT, sval[0]);
-
- if (autosnap == SACTSNAP_STEP)
- fac= 1.0f*floor(fac/1.0f + 0.5f);
- }
- sprintf(str, "deltaX: %.3f", fac);
- headerprint(str);
- }
- else if (mode=='t') {
- float fac= 2.0*(cval[0]-sval[0])/(maxx-minx);
- CLAMP(fac, -1.0f, 1.0f);
- sprintf(str, "TimeSlide: %.3f", fac);
- headerprint(str);
- }
-
- if (G.saction->lock) {
- if (context == ACTCONT_ACTION) {
- if(ob) {
- ob->ctime= -1234567.0f;
- if(ob->pose || ob_get_key(ob))
- DAG_object_flush_update(G.scene, ob, OB_RECALC);
- else
- DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
- }
- force_draw_plus(SPACE_VIEW3D, 0);
- }
- else if (context == ACTCONT_SHAPEKEY) {
- DAG_object_flush_update(G.scene, OBACT, OB_RECALC_OB|OB_RECALC_DATA);
- allqueue (REDRAWVIEW3D, 0);
- allqueue (REDRAWACTION, 0);
- allqueue (REDRAWIPO, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWTIME, 0);
- force_draw_all(0);
- }
- }
- else {
- force_draw(0);
- }
- }
- }
-
- lastcval[0]= cval[0];
- lastcval[1]= cval[1];
- firsttime= 0;
- }
-
- return cancel;
-}
-
/* main call to start transforming keyframes */
-/* NOTE: someday, this should be integrated with the transform system
- * instead of relying on our own methods
- */
void transform_action_keys (int mode, int dummy)
{
- Object *ob= OBACT;
- TransVert *tv;
- int tvtot= 0;
- short cancel;
- float minx, maxx;
-
void *data;
short datatype;
@@ -1068,44 +720,32 @@ void transform_action_keys (int mode, int dummy)
data = get_action_context(&datatype);
if (data == NULL) return;
- /* initialise transform */
- tv= transform_action_init(&tvtot, &minx, &maxx);
- if (tv == NULL) return;
-
- /* do transform loop */
- cancel= transform_action_loop(tv, tvtot, mode, datatype, minx, maxx);
-
- /* cleanup */
- if (datatype == ACTCONT_ACTION) {
- /* Update the curve */
- /* Depending on the lock status, draw necessary views */
- if(ob) {
- ob->ctime= -1234567.0f;
-
- if(ob->pose || ob_get_key(ob))
- DAG_object_flush_update(G.scene, ob, OB_RECALC);
- else
- DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
+ switch (mode) {
+ case 'g':
+ {
+ initTransform(TFM_TIME_TRANSLATE, CTX_NONE);
+ Transform();
}
-
- remake_action_ipos((bAction *)data);
-
- G.saction->flag &= ~SACTION_MOVING;
-
- if (cancel==0) BIF_undo_push("Transform Action"); // does it have to be here?
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWTIME, 0);
- }
- else if (datatype == ACTCONT_SHAPEKEY) {
- /* fix up the Ipocurves and redraw stuff */
- meshkey_do_redraw((Key *)data);
- if (cancel==0) BIF_undo_push("Transform Action");
+ break;
+ case 's':
+ {
+ initTransform(TFM_TIME_SCALE, CTX_NONE);
+ Transform();
+ }
+ break;
+ case 't':
+ {
+ initTransform(TFM_TIME_SLIDE, CTX_NONE);
+ Transform();
+ }
+ break;
+ case 'e':
+ {
+ initTransform(TFM_TIME_EXTEND, CTX_NONE);
+ Transform();
+ }
+ break;
}
-
- MEM_freeN(tv);
}
/* ----------------------------------------- */
@@ -1152,29 +792,35 @@ void snap_action_keys(short mode)
/* get data */
data= get_action_context(&datatype);
if (data == NULL) return;
-
- /* filter data */
- filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
- actdata_filter(&act_data, filter, data, datatype);
-
+
/* determine mode */
switch (mode) {
case 1:
strcpy(str, "Snap Keys To Nearest Frame");
break;
case 2:
- strcpy(str, "Snap Keys To Current Frame");
+ if (G.saction->flag & SACTION_DRAWTIME)
+ strcpy(str, "Snap Keys To Current Time");
+ else
+ strcpy(str, "Snap Keys To Current Frame");
break;
case 3:
strcpy(str, "Snap Keys To Nearest Marker");
break;
+ case 4:
+ strcpy(str, "Snap Keys To Nearest Second");
+ break;
default:
return;
}
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
+ actdata_filter(&act_data, filter, data, datatype);
+
/* snap to frame */
for (ale= act_data.first; ale; ale= ale->next) {
- if (datatype==ACTCONT_ACTION && G.saction->pin==0 && OBACT) {
+ if (NLA_ACTION_SCALED && datatype==ACTCONT_ACTION) {
actstrip_map_ipo_keys(OBACT, ale->key_data, 0, 1);
snap_ipo_keys(ale->key_data, mode);
actstrip_map_ipo_keys(OBACT, ale->key_data, 1, 1);
@@ -1207,11 +853,7 @@ void mirror_action_keys(short mode)
/* get data */
data= get_action_context(&datatype);
if (data == NULL) return;
-
- /* filter data */
- filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
- actdata_filter(&act_data, filter, data, datatype);
-
+
/* determine mode */
switch (mode) {
case 1:
@@ -1230,9 +872,13 @@ void mirror_action_keys(short mode)
return;
}
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
+ actdata_filter(&act_data, filter, data, datatype);
+
/* mirror */
for (ale= act_data.first; ale; ale= ale->next) {
- if (datatype==ACTCONT_ACTION && G.saction->pin==0 && OBACT) {
+ if (NLA_ACTION_SCALED && datatype==ACTCONT_ACTION) {
actstrip_map_ipo_keys(OBACT, ale->key_data, 0, 1);
mirror_ipo_keys(ale->key_data, mode);
actstrip_map_ipo_keys(OBACT, ale->key_data, 1, 1);
@@ -1280,7 +926,7 @@ void insertkey_action(void)
/* ask user what to keyframe */
mode = pupmenu("Insert Key%t|All Channels%x1|Only Selected Channels%x2");
- if (mode == 0) return;
+ if (mode <= 0) return;
/* filter data */
filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_ONLYICU );
@@ -1296,9 +942,9 @@ void insertkey_action(void)
IpoCurve *icu= (IpoCurve *)ale->key_data;
if (ob)
- insertkey((ID *)ob, icu->blocktype, achan->name, NULL, icu->adrcode);
+ insertkey((ID *)ob, icu->blocktype, achan->name, NULL, icu->adrcode, 0);
else
- insert_vert_ipo(icu, cfra, icu->curval);
+ insert_vert_icu(icu, cfra, icu->curval, 0);
}
}
@@ -1311,11 +957,11 @@ void insertkey_action(void)
/* ask user if they want to insert a keyframe */
mode = okee("Insert Keyframe?");
- if (mode == 0) return;
+ if (mode <= 0) return;
if (key->ipo) {
for (icu= key->ipo->curve.first; icu; icu=icu->next) {
- insert_vert_ipo(icu, cfra, icu->curval);
+ insert_vert_icu(icu, cfra, icu->curval, 0);
}
}
}
@@ -1458,18 +1104,181 @@ void clean_action (void)
}
/* **************************************************** */
+/* COPY/PASTE FOR ACTIONS */
+/* - The copy/paste buffer currently stores a set of IPO curves, with no
+ * repeating curve-types (i.e. no curves with the same adrcode).
+ * - Only selected keyframes from the source curves are placed here.
+ * - Only 'compatible' pastes are done.
+ */
+
+/* globals for copy/paste data (like for other copy/paste buffers) */
+ListBase actcopybuf = {NULL, NULL};
+
+/* This function frees any MEM_calloc'ed copy/paste buffer data */
+void free_actcopybuf ()
+{
+ IpoCurve *icu;
+
+ while( (icu= actcopybuf.first) ) {
+ BLI_remlink(&actcopybuf, icu);
+ free_ipo_curve(icu);
+ }
+}
+
+/* This function adds data to the copy/paste buffer, freeing existing data first
+ * Only the active action channel gets its selected keyframes copied.
+ */
+void copy_actdata ()
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+
+ /* clear buffer first */
+ free_actcopybuf();
+
+ /* get data */
+ data= get_action_context(&datatype);
+ if (data == NULL) return;
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_ONLYICU);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ /* each of these entries should be an ipo curve */
+ for (ale= act_data.first; ale; ale= ale->next) {
+ IpoCurve *icu= ale->key_data;
+ IpoCurve *icn;
+ BezTriple *bezt;
+ short nin_buffer= 1;
+ int i;
+
+ /* check if a curve like this exists already in buffer */
+ for (icn= actcopybuf.first; icn; icn= icn->next) {
+ if ((icn->blocktype==icu->blocktype) && (icn->adrcode==icu->adrcode)) {
+ nin_buffer= 0;
+ break;
+ }
+ }
+ /* allocate memory for a new curve if a valid one wasn't found */
+ if (nin_buffer) {
+ icn= MEM_callocN(sizeof(IpoCurve), "actcopybuf");
+
+ *icn= *icu;
+ icn->totvert= 0;
+ icn->bezt = NULL;
+ icn->driver = NULL;
+
+ BLI_addtail(&actcopybuf, icn);
+ }
+
+ /* find selected BezTriples to add to the buffer */
+ for (i=0, bezt=icu->bezt; i < icu->totvert; i++, bezt++) {
+ if (BEZSELECTED(bezt))
+ insert_bezt_icu(icn, bezt);
+ }
+ }
+
+ /* check if anything ended up in the buffer */
+ if (actcopybuf.first==NULL || actcopybuf.last==NULL)
+ error("Nothing copied to buffer");
+
+ /* free temp memory */
+ BLI_freelistN(&act_data);
+}
+
+void paste_actdata ()
+{
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ int filter;
+ void *data;
+ short datatype;
+
+ /* check if buffer is empty */
+ if (actcopybuf.first==NULL || actcopybuf.last==NULL) {
+ error("No data in buffer to paste");
+ return;
+ }
+
+ /* get data */
+ data= get_action_context(&datatype);
+ if (data == NULL) return;
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_FOREDIT | ACTFILTER_ONLYICU);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ /* from selected channels */
+ for (ale= act_data.first; ale; ale= ale->next) {
+ IpoCurve *icu= ale->key_data;
+ IpoCurve *ico;
+ BezTriple *bezt;
+ int i;
+ float offset= 0.0f;
+ short offsetInit= 1;
+
+ /* find matching ipo-curve */
+ for (ico= actcopybuf.first; ico; ico= ico->next) {
+ if ((ico->blocktype==icu->blocktype) && (ico->adrcode==icu->adrcode)) {
+ /* just start pasting, with the the first keyframe on the current frame, and so on */
+ for (i=0, bezt=ico->bezt; i < ico->totvert; i++, bezt++) {
+ /* initialise offset (if not already done) */
+ if (offsetInit) {
+ offset= CFRA - bezt->vec[1][0];
+ offsetInit= 0;
+ }
+
+ /* temporarily apply offset to src beztriple while copying */
+ bezt->vec[0][0] += offset;
+ bezt->vec[1][0] += offset;
+ bezt->vec[2][0] += offset;
+
+ /* insert the keyframe */
+ insert_bezt_icu(icu, bezt);
+
+ /* un-apply offset from src beztriple after copying */
+ bezt->vec[0][0] -= offset;
+ bezt->vec[1][0] -= offset;
+ bezt->vec[2][0] -= offset;
+ }
+
+ /* recalculate channel's handles? */
+ calchandles_ipocurve(icu);
+
+ /* done for this channel */
+ break;
+ }
+ }
+ }
+
+ /* free temp memory */
+ BLI_freelistN(&act_data);
+
+ /* undo and redraw stuff */
+ allqueue(REDRAWVIEW3D, 0);
+ allspace(REMAKEIPO, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWNLA, 0);
+ BIF_undo_push("Paste Action Keyframes");
+}
+
+/* **************************************************** */
/* VARIOUS SETTINGS */
-/* this function combines several features related to setting
+/* This function combines several features related to setting
* various ipo extrapolation/interpolation
*/
-void action_set_ipo_flags (int mode)
+void action_set_ipo_flags (short mode, short event)
{
ListBase act_data = {NULL, NULL};
bActListElem *ale;
void *data;
short datatype;
- int filter, event;
+ int filter;
/* determine what type of data we are operating on */
data = get_action_context(&datatype);
@@ -1486,7 +1295,7 @@ void action_set_ipo_flags (int mode)
"Extrapolation %x12|"
"Cyclic %x13|"
"Cyclic extrapolation %x14");
- if(event < 1) return;
+ if (event < 1) return;
}
break;
case SET_IPO_POPUP:
@@ -1497,16 +1306,20 @@ void action_set_ipo_flags (int mode)
"Constant %x1|"
"Linear %x2|"
"Bezier %x3");
- if(event < 1) return;
+ if (event < 1) return;
}
break;
+ case SET_IPO_MENU: /* called from menus */
+ case SET_EXTEND_MENU:
+ break;
+
default: /* weird, unhandled case */
return;
}
/* filter data */
- filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_SEL | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
actdata_filter(&act_data, filter, data, datatype);
/* loop through setting flags */
@@ -1516,6 +1329,7 @@ void action_set_ipo_flags (int mode)
/* depending on the mode */
switch (mode) {
case SET_EXTEND_POPUP: /* extrapolation */
+ case SET_EXTEND_MENU:
{
switch (event) {
case SET_EXTEND_CONSTANT:
@@ -1534,6 +1348,7 @@ void action_set_ipo_flags (int mode)
}
break;
case SET_IPO_POPUP: /* interpolation */
+ case SET_IPO_MENU:
{
setipotype_ipo(ipo, event);
}
@@ -1554,8 +1369,7 @@ void action_set_ipo_flags (int mode)
allqueue(REDRAWNLA, 0);
}
-/* this function sets the handles on keyframes
- */
+/* this function sets the handles on keyframes */
void sethandles_action_keys (int code)
{
ListBase act_data = {NULL, NULL};
@@ -1591,93 +1405,73 @@ void sethandles_action_keys (int code)
/* ----------------------------------------- */
-static void clever_keyblock_names (Key *key, short *mval)
-{
- KeyBlock *kb;
- int but=0, i, keynum;
- char str[64];
- float x;
-
- /* get the keynum cooresponding to the y value
- * of the mouse pointer, return if this is
- * an invalid key number (and we don't deal
- * with the speed ipo).
- */
-
- keynum = get_nearest_key_num(key, mval, &x);
- if ( (keynum < 1) || (keynum >= key->totkey) )
- return;
-
- kb= key->block.first;
- for (i=0; i<keynum; ++i) kb = kb->next;
-
- if (kb->name[0] == '\0') {
- sprintf(str, "Key %d", keynum);
- }
- else {
- strcpy(str, kb->name);
- }
-
- if ( (kb->slidermin >= kb->slidermax) ) {
- kb->slidermin = 0.0;
- kb->slidermax = 1.0;
- }
-
- add_numbut(but++, TEX, "KB: ", 0, 24, str,
- "Does this really need a tool tip?");
- add_numbut(but++, NUM|FLO, "Slider Min:",
- -10000, kb->slidermax, &kb->slidermin, 0);
- add_numbut(but++, NUM|FLO, "Slider Max:",
- kb->slidermin, 10000, &kb->slidermax, 0);
-
- if (do_clever_numbuts(str, but, REDRAW)) {
- strcpy(kb->name, str);
- allqueue (REDRAWACTION, 0);
- allspace(REMAKEIPO, 0);
- allqueue (REDRAWIPO, 0);
- }
-}
-
-static void clever_achannel_names (short *mval)
+/* this gets called when nkey is pressed (no Transform Properties panel yet) */
+static void numbuts_action ()
{
+ void *data;
+ short datatype;
+
void *act_channel;
+ short chantype;
+
bActionChannel *achan= NULL;
bConstraintChannel *conchan= NULL;
IpoCurve *icu= NULL;
+ KeyBlock *kb= NULL;
+
+ short mval[2];
int but=0;
char str[64];
- short expand, protect, chantype;
+ short expand, protect, mute;
float slidermin, slidermax;
+
+ /* determine what type of data we are operating on */
+ data = get_action_context(&datatype);
+ if (data == NULL) return;
+
/* figure out what is under cursor */
+ getmouseco_areawin(mval);
+ if (mval[0] < NAMEWIDTH)
+ return;
act_channel= get_nearest_act_channel(mval, &chantype);
/* create items for clever-numbut */
if (chantype == ACTTYPE_ACHAN) {
+ /* Action Channel */
achan= (bActionChannel *)act_channel;
strcpy(str, achan->name);
protect= (achan->flag & ACHAN_PROTECTED);
expand = (achan->flag & ACHAN_EXPANDED);
-
+ mute = (achan->ipo)? (achan->ipo->muteipo): 0;
+
add_numbut(but++, TEX, "ActChan: ", 0, 31, str, "Name of Action Channel");
add_numbut(but++, TOG|SHO, "Expanded", 0, 24, &expand, "Action Channel is Expanded");
+ add_numbut(but++, TOG|SHO, "Muted", 0, 24, &mute, "Channel is Muted");
add_numbut(but++, TOG|SHO, "Protected", 0, 24, &protect, "Channel is Protected");
}
else if (chantype == ACTTYPE_CONCHAN) {
+ /* Constraint Channel */
conchan= (bConstraintChannel *)act_channel;
strcpy(str, conchan->name);
protect= (conchan->flag & CONSTRAINT_CHANNEL_PROTECTED);
+ mute = (conchan->ipo)? (conchan->ipo->muteipo): 0;
add_numbut(but++, TEX, "ConChan: ", 0, 29, str, "Name of Constraint Channel");
+ add_numbut(but++, TOG|SHO, "Muted", 0, 24, &mute, "Channel is Muted");
add_numbut(but++, TOG|SHO, "Protected", 0, 24, &protect, "Channel is Protected");
}
else if (chantype == ACTTYPE_ICU) {
+ /* IPO Curve */
icu= (IpoCurve *)act_channel;
- strcpy(str, getname_ipocurve(icu));
+ if (G.saction->pin)
+ sprintf(str, getname_ipocurve(icu, NULL));
+ else
+ sprintf(str, getname_ipocurve(icu, OBACT));
if (IS_EQ(icu->slide_max, icu->slide_min)) {
if (IS_EQ(icu->ymax, icu->ymin)) {
@@ -1693,11 +1487,38 @@ static void clever_achannel_names (short *mval)
slidermax= icu->slide_max;
//protect= (icu->flag & IPO_PROTECT);
+ mute = (icu->flag & IPO_MUTE);
add_numbut(but++, NUM|FLO, "Slider Min:", -10000, slidermax, &slidermin, 0);
add_numbut(but++, NUM|FLO, "Slider Max:", slidermin, 10000, &slidermax, 0);
+ add_numbut(but++, TOG|SHO, "Muted", 0, 24, &mute, "Channel is Muted");
//add_numbut(but++, TOG|SHO, "Protected", 0, 24, &protect, "Channel is Protected");
}
+ else if (chantype == ACTTYPE_SHAPEKEY) {
+ /* Shape Key */
+ kb= (KeyBlock *)act_channel;
+
+ if (kb->name[0] == '\0') {
+ Key *key= (Key *)data;
+ int keynum= BLI_findindex(&key->block, kb);
+
+ sprintf(str, "Key %d", keynum);
+ }
+ else
+ strcpy(str, kb->name);
+
+ if (kb->slidermin >= kb->slidermax) {
+ kb->slidermin = 0.0;
+ kb->slidermax = 1.0;
+ }
+
+ add_numbut(but++, TEX, "KB: ", 0, 24, str,
+ "Does this really need a tool tip?");
+ add_numbut(but++, NUM|FLO, "Slider Min:",
+ -10000, kb->slidermax, &kb->slidermin, 0);
+ add_numbut(but++, NUM|FLO, "Slider Max:",
+ kb->slidermin, 10000, &kb->slidermax, 0);
+ }
else {
/* nothing under-cursor */
return;
@@ -1712,12 +1533,17 @@ static void clever_achannel_names (short *mval)
//if (protect) icu->flag |= IPO_PROTECT;
//else icu->flag &= ~IPO_PROTECT;
+ if (mute) icu->flag |= IPO_MUTE;
+ else icu->flag &= ~IPO_MUTE;
}
else if (conchan) {
strcpy(conchan->name, str);
if (protect) conchan->flag |= CONSTRAINT_CHANNEL_PROTECTED;
else conchan->flag &= ~CONSTRAINT_CHANNEL_PROTECTED;
+
+ if (conchan->ipo)
+ conchan->ipo->muteipo = mute;
}
else if (achan) {
strcpy(achan->name, str);
@@ -1727,37 +1553,18 @@ static void clever_achannel_names (short *mval)
if (protect) achan->flag |= ACHAN_PROTECTED;
else achan->flag &= ~ACHAN_PROTECTED;
+
+ if (achan->ipo)
+ achan->ipo->muteipo = mute;
}
- allqueue (REDRAWACTION, 0);
- allqueue (REDRAWVIEW3D, 0);
+ allqueue(REDRAWACTION, 0);
+ allspace(REMAKEIPO, 0);
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWVIEW3D, 0);
}
}
-/* this gets called when nkey is pressed (no Transform Properties panel yet) */
-static void numbuts_action (void)
-{
- /* now called from action window event loop, plus reacts on mouseclick */
- /* removed Hos grunts for that reason! :) (ton) */
- void *data;
- short datatype;
- short mval[2];
-
- /* determine what type of data we are operating on */
- data = get_action_context(&datatype);
- getmouseco_areawin(mval);
-
- if (mval[0] < NAMEWIDTH) {
- switch (datatype) {
- case ACTCONT_ACTION:
- clever_achannel_names(mval);
- break;
- case ACTCONT_SHAPEKEY:
- clever_keyblock_names(data, mval);
- break;
- }
- }
-}
/* **************************************************** */
@@ -2147,7 +1954,7 @@ void markers_selectkeys_between (void)
/* select keys in-between */
for (ale= act_data.first; ale; ale= ale->next) {
- if(G.saction->pin==0 && OBACT && datatype==ACTCONT_ACTION) {
+ if(NLA_ACTION_SCALED && datatype==ACTCONT_ACTION) {
actstrip_map_ipo_keys(OBACT, ale->key_data, 0, 1);
borderselect_ipo_key(ale->key_data, min, max, SELECT_ADD);
actstrip_map_ipo_keys(OBACT, ale->key_data, 1, 1);
@@ -2216,7 +2023,7 @@ void column_select_action_keys(int mode)
make_marker_cfra_list(&elems, 1);
/* apply scaled action correction if needed */
- if (G.saction->pin==0 && OBACT && datatype==ACTCONT_ACTION) {
+ if (NLA_ACTION_SCALED && datatype==ACTCONT_ACTION) {
for (ce= elems.first; ce; ce= ce->next)
ce->cfra= get_action_frame(OBACT, ce->cfra);
}
@@ -2249,6 +2056,11 @@ void column_select_action_keys(int mode)
BLI_freelistN(&elems);
}
+/* some quick defines for borderselect modes */
+#define ACTEDIT_BORDERSEL_ALL 0
+#define ACTEDIT_BORDERSEL_FRA 1
+#define ACTEDIT_BORDERSEL_CHA 2
+
/* borderselect: for keyframes only */
void borderselect_action (void)
{
@@ -2260,15 +2072,24 @@ void borderselect_action (void)
rcti rect;
rctf rectf;
- int val, selectmode;
+ int val, selectmode, mode;
int (*select_function)(BezTriple *);
- short mval[2];
- float ymin, ymax;
+ short mval[2];
+ float ymin, ymax;
/* determine what type of data we are operating on */
data = get_action_context(&datatype);
if (data == NULL) return;
+ /* what should be selected (based on the starting location of cursor) */
+ getmouseco_areawin(mval);
+ if (IN_2D_VERT_SCROLL(mval))
+ mode = ACTEDIT_BORDERSEL_CHA;
+ else if (IN_2D_HORIZ_SCROLL(mval))
+ mode = ACTEDIT_BORDERSEL_FRA;
+ else
+ mode = ACTEDIT_BORDERSEL_ALL;
+
/* draw and handle the borderselect stuff (ui) and get the select rect */
if ( (val = get_border(&rect, 3)) ) {
if (val == LEFTMOUSE) {
@@ -2288,7 +2109,7 @@ void borderselect_action (void)
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
/* if action is mapped in NLA, it returns a correction */
- if (G.saction->pin==0 && OBACT && datatype==ACTCONT_ACTION) {
+ if (NLA_ACTION_SCALED && datatype==ACTCONT_ACTION) {
rectf.xmin= get_action_frame(OBACT, rectf.xmin);
rectf.xmax= get_action_frame(OBACT, rectf.xmax);
}
@@ -2302,14 +2123,38 @@ void borderselect_action (void)
/* loop over data, doing border select */
for (ale= act_data.first; ale; ale= ale->next) {
ymin=ymax-(CHANNELHEIGHT+CHANNELSKIP);
- if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) {
+
+ /* what gets selected depends on the mode (based on initial position of cursor) */
+ switch (mode) {
+ case ACTEDIT_BORDERSEL_FRA: /* all in frame(s) */
if (ale->key_data) {
if (ale->datatype == ALE_IPO)
borderselect_ipo_key(ale->key_data, rectf.xmin, rectf.xmax, selectmode);
else if (ale->datatype == ALE_ICU)
borderselect_icu_key(ale->key_data, rectf.xmin, rectf.xmax, select_function);
}
+ break;
+ case ACTEDIT_BORDERSEL_CHA: /* all in channel(s) */
+ if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) {
+ if (ale->key_data) {
+ if (ale->datatype == ALE_IPO)
+ select_ipo_bezier_keys(ale->key_data, selectmode);
+ else if (ale->datatype == ALE_ICU)
+ select_icu_bezier_keys(ale->key_data, selectmode);
+ }
+ }
+ break;
+ default: /* any keyframe inside region defined by region */
+ if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) {
+ if (ale->key_data) {
+ if (ale->datatype == ALE_IPO)
+ borderselect_ipo_key(ale->key_data, rectf.xmin, rectf.xmax, selectmode);
+ else if (ale->datatype == ALE_ICU)
+ borderselect_icu_key(ale->key_data, rectf.xmin, rectf.xmax, select_function);
+ }
+ }
}
+
ymax=ymin;
}
@@ -2331,11 +2176,13 @@ static void mouse_action (int selectmode)
{
void *data;
short datatype;
+
bAction *act= NULL;
bActionChannel *achan= NULL;
bConstraintChannel *conchan= NULL;
IpoCurve *icu= NULL;
TimeMarker *marker;
+
void *act_channel;
short sel, act_type;
float selx;
@@ -2356,8 +2203,11 @@ static void mouse_action (int selectmode)
case ACTTYPE_CONCHAN:
conchan= (bConstraintChannel *)act_channel;
break;
- default:
+ case ACTTYPE_ACHAN:
achan= (bActionChannel *)act_channel;
+ break;
+ default:
+ return;
}
if (selectmode == SELECT_REPLACE) {
@@ -2409,11 +2259,7 @@ static void mouse_action (int selectmode)
std_rmouse_transform(transform_markers);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
}
@@ -2441,6 +2287,10 @@ static void mouse_actionchannels (short mval[])
/* toggle protect */
achan->flag ^= ACHAN_PROTECTED;
}
+ else if ((mval[0] >= (NAMEWIDTH-32)) && (achan->ipo)) {
+ /* toggle mute */
+ achan->ipo->muteipo = (achan->ipo->muteipo)? 0: 1;
+ }
else if (mval[0] <= 17) {
/* toggle expand */
achan->flag ^= ACHAN_EXPANDED;
@@ -2496,10 +2346,16 @@ static void mouse_actionchannels (short mval[])
{
IpoCurve *icu= (IpoCurve *)act_channel;
+#if 0 /* disabled until all ipo tools support this -------> */
if (mval[0] >= (NAMEWIDTH-16)) {
/* toggle protection */
icu->flag ^= IPO_PROTECT;
}
+#endif /* <------- end of disabled code */
+ if (mval[0] >= (NAMEWIDTH-16)) {
+ /* toggle mute */
+ icu->flag ^= IPO_MUTE;
+ }
else {
/* select/deselect */
select_icu_channel(act, icu, SELECT_INVERT);
@@ -2514,6 +2370,10 @@ static void mouse_actionchannels (short mval[])
/* toggle protection */
conchan->flag ^= CONSTRAINT_CHANNEL_PROTECTED;
}
+ else if ((mval[0] >= (NAMEWIDTH-32)) && (conchan->ipo)) {
+ /* toggle mute */
+ conchan->ipo->muteipo = (conchan->ipo->muteipo)? 0: 1;
+ }
else {
/* select/deselect */
select_constraint_channel(act, conchan, SELECT_INVERT);
@@ -2524,18 +2384,19 @@ static void mouse_actionchannels (short mval[])
return;
}
- allqueue (REDRAWIPO, 0);
- allqueue (REDRAWVIEW3D, 0);
- allqueue (REDRAWACTION, 0);
- allqueue (REDRAWNLA, 0);
- allqueue (REDRAWOOPS, 0);
- allqueue (REDRAWBUTSALL, 0);
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWNLA, 0);
+ allqueue(REDRAWTIME, 0);
+ allqueue(REDRAWOOPS, 0);
+ allqueue(REDRAWBUTSALL, 0);
}
/* **************************************************** */
/* ACTION CHANNEL RE-ORDERING */
-void top_sel_action()
+void top_sel_action ()
{
bAction *act;
bActionChannel *achan;
@@ -2571,7 +2432,7 @@ void top_sel_action()
allqueue(REDRAWNLA, 0);
}
-void up_sel_action()
+void up_sel_action ()
{
bAction *act;
bActionChannel *achan, *prev;
@@ -2610,7 +2471,7 @@ void up_sel_action()
allqueue(REDRAWNLA, 0);
}
-void down_sel_action()
+void down_sel_action ()
{
bAction *act;
bActionChannel *achan, *next;
@@ -2655,7 +2516,7 @@ void down_sel_action()
allqueue(REDRAWNLA, 0);
}
-void bottom_sel_action()
+void bottom_sel_action ()
{
bAction *act;
bActionChannel *achan;
@@ -2696,8 +2557,8 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
extern void do_actionbuts(unsigned short event); // drawaction.c
SpaceAction *saction;
- bAction *act;
- Key *key;
+ void *data;
+ short datatype;
float dx, dy;
int doredraw= 0;
int cfra;
@@ -2706,14 +2567,13 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
short val= evt->val;
short mousebut = L_MOUSE;
- if(curarea->win==0) return;
+ if (curarea->win==0) return;
saction= curarea->spacedata.first;
if (!saction)
return;
- act=saction->action;
- key = get_action_mesh_key();
+ data= get_action_context(&datatype);
if (val) {
if ( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
@@ -2791,7 +2651,12 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
duplicate_action_keys();
}
break;
-
+
+ case EKEY:
+ if (mval[0] >= ACTWIDTH)
+ transform_action_keys('e', 0);
+ break;
+
case GKEY:
if (G.qual & LR_CTRLKEY) {
transform_markers('g', 0);
@@ -2803,12 +2668,12 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case HKEY:
- if(G.qual & LR_SHIFTKEY) {
- if(okee("Set Keys to Auto Handle"))
+ if (G.qual & LR_SHIFTKEY) {
+ if (okee("Set Keys to Auto Handle"))
sethandles_action_keys(HD_AUTO);
}
else {
- if(okee("Toggle Keys Aligned Handle"))
+ if (okee("Toggle Keys Aligned Handle"))
sethandles_action_keys(HD_ALIGN);
}
break;
@@ -2822,17 +2687,18 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
column_select_action_keys(val);
}
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case MKEY:
if (G.qual & LR_SHIFTKEY) {
/* mirror keyframes */
- if (act || key) {
- val = pupmenu("Mirror Keys Over%t|Current Frame%x1|Vertical Axis%x2|Horizontal Axis %x3|Selected Marker %x4");
+ if (data) {
+ if (G.saction->flag & SACTION_DRAWTIME)
+ val = pupmenu("Mirror Keys Over%t|Current Time%x1|Vertical Axis%x2|Horizontal Axis %x3|Selected Marker %x4");
+ else
+ val = pupmenu("Mirror Keys Over%t|Current Frame%x1|Vertical Axis%x2|Horizontal Axis %x3|Selected Marker %x4");
+
mirror_action_keys(val);
}
}
@@ -2844,11 +2710,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
rename_marker();
else
break;
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
break;
@@ -2871,40 +2733,53 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
anim_previewrange_set();
else if (G.qual & LR_ALTKEY) /* clear preview range */
anim_previewrange_clear();
- allqueue(REDRAWTIME, 0);
+
+ allqueue(REDRAWMARKER, 0);
allqueue(REDRAWBUTSALL, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWIPO, 0);
break;
case SKEY:
if (mval[0]>=ACTWIDTH) {
- if(G.qual & LR_SHIFTKEY) {
- if (act || key) {
- val = pupmenu("Snap Keys To%t|Nearest Frame%x1|Current Frame%x2|Nearest Marker %x3");
+ if (G.qual & LR_SHIFTKEY) {
+ if (data) {
+ if (G.saction->flag & SACTION_DRAWTIME)
+ val = pupmenu("Snap Keys To%t|Nearest Second%x4|Current Time%x2|Nearest Marker %x3");
+ else
+ val = pupmenu("Snap Keys To%t|Nearest Frame%x1|Current Frame%x2|Nearest Marker %x3");
+
snap_action_keys(val);
}
}
- else
- transform_action_keys ('s', 0);
+ else {
+ transform_action_keys('s', 0);
+ }
}
break;
case TKEY:
- if(G.qual & LR_SHIFTKEY)
- action_set_ipo_flags(SET_IPO_POPUP);
+ if (G.qual & LR_SHIFTKEY)
+ action_set_ipo_flags(SET_IPO_POPUP, 0);
+ else if (G.qual & LR_CTRLKEY) {
+ val= pupmenu("Time value%t|Frames %x1|Seconds%x2");
+
+ if (val > 0) {
+ if (val == 2) saction->flag |= SACTION_DRAWTIME;
+ else saction->flag &= ~SACTION_DRAWTIME;
+
+ doredraw= 1;
+ }
+ }
else
transform_action_keys ('t', 0);
break;
-
+
case VKEY:
- if(okee("Set Keys to Vector Handle"))
+ if (okee("Set Keys to Vector Handle"))
sethandles_action_keys(HD_VECT);
break;
-
+
case PAGEUPKEY:
- if (act) {
+ if (datatype == ACTCONT_ACTION) {
if(G.qual & LR_SHIFTKEY)
top_sel_action();
else if (G.qual & LR_CTRLKEY)
@@ -2912,13 +2787,13 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else
nextprev_marker(1);
}
- else if (key) {
+ else if (datatype == ACTCONT_SHAPEKEY) {
/* only jump to markers possible (key channels can't be moved yet) */
nextprev_marker(1);
}
break;
case PAGEDOWNKEY:
- if (act) {
+ if (datatype == ACTCONT_ACTION) {
if(G.qual & LR_SHIFTKEY)
bottom_sel_action();
else if (G.qual & LR_CTRLKEY)
@@ -2926,7 +2801,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else
nextprev_marker(-1);
}
- else if (key) {
+ else if (datatype == ACTCONT_SHAPEKEY) {
/* only jump to markers possible (key channels can't be moved yet) */
nextprev_marker(-1);
}
@@ -2957,7 +2832,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case LEFTMOUSE:
if(view2dmove(LEFTMOUSE)) // only checks for sliders
break;
- else if (mval[0]>ACTWIDTH) {
+ else if ((G.v2d->mask.xmin==0) || (mval[0]>ACTWIDTH)) {
do {
getmouseco_areawin(mval);
@@ -2979,17 +2854,17 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
/* passed on as selection */
case RIGHTMOUSE:
/* Clicking in the channel area */
- if (mval[0]<NAMEWIDTH) {
- if (act) {
+ if ((G.v2d->mask.xmin) && (mval[0]<NAMEWIDTH)) {
+ if (datatype == ACTCONT_ACTION) {
/* mouse is over action channels */
if (G.qual & LR_CTRLKEY)
- clever_achannel_names(mval);
+ numbuts_action();
else
mouse_actionchannels(mval);
}
else numbuts_action();
}
- else if (mval[0]>ACTWIDTH) {
+ else {
short select_mode= (G.qual & LR_SHIFTKEY)? SELECT_INVERT: SELECT_REPLACE;
/* Clicking in the vertical scrollbar selects
@@ -3016,7 +2891,7 @@ void winqreadactionspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
view2d_zoom(G.v2d, 0.1154, sa->winx, sa->winy);
test_view2d(G.v2d, sa->winx, sa->winy);
view2d_do_locks(curarea, V2D_LOCK_COPY);
-
+
doredraw= 1;
break;
case PADMINUS:
diff --git a/source/blender/src/editarmature.c b/source/blender/src/editarmature.c
index 338147827da..24c8382a445 100644
--- a/source/blender/src/editarmature.c
+++ b/source/blender/src/editarmature.c
@@ -55,6 +55,7 @@
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
#include "DNA_modifier_types.h"
@@ -67,6 +68,7 @@
#include "BKE_constraint.h"
#include "BKE_deform.h"
#include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_object.h"
@@ -82,6 +84,8 @@
#include "BIF_gl.h"
#include "BIF_graphics.h"
#include "BIF_interface.h"
+#include "BIF_meshlaplacian.h"
+#include "BIF_meshtools.h"
#include "BIF_poseobject.h"
#include "BIF_mywindow.h"
#include "BIF_resources.h"
@@ -343,12 +347,12 @@ void apply_rot_armature (Object *ob, float mat[3][3])
ListBase list;
EditBone *ebone;
bArmature *arm;
-
+ float scale = Mat3ToScalef(mat); /* store the scale of the matrix here to use on envelopes */
arm = get_armature(ob);
if (!arm)
- return;
-
+ return;
+
/* Put the armature into editmode */
list.first= list.last = NULL;
make_boneList(&list, &arm->bonebase, NULL);
@@ -357,6 +361,10 @@ void apply_rot_armature (Object *ob, float mat[3][3])
for (ebone = list.first; ebone; ebone=ebone->next){
Mat3MulVecfl(mat, ebone->head);
Mat3MulVecfl(mat, ebone->tail);
+
+ ebone->rad_head *= scale;
+ ebone->rad_tail *= scale;
+ ebone->dist *= scale;
}
/* Turn the list into an armature */
@@ -444,16 +452,28 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
pose= ob->pose;
for (pchant= pose->chanbase.first; pchant; pchant= pchant->next) {
for (con= pchant->constraints.first; con; con= con->next) {
- Object *conOb;
- char *subtarget;
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
/* constraint targets */
- conOb= get_constraint_target(con, &subtarget);
- if (conOb == srcArm) {
- if (strcmp(subtarget, "")==0)
- set_constraint_target(con, tarArm, "");
- else if (strcmp(pchan->name, subtarget)==0)
- set_constraint_target(con, tarArm, curbone->name);
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar == srcArm) {
+ if (strcmp(ct->subtarget, "")==0) {
+ ct->tar = tarArm;
+ }
+ else if (strcmp(ct->subtarget, pchan->name)==0) {
+ ct->tar = tarArm;
+ strcpy(ct->subtarget, curbone->name);
+ }
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
}
/* action constraint? */
@@ -479,15 +499,28 @@ static void joined_armature_fix_links(Object *tarArm, Object *srcArm, bPoseChann
/* fix object-level constraints */
if (ob != srcArm) {
for (con= ob->constraints.first; con; con= con->next) {
- Object *conOb;
- char *subtarget;
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
- conOb= get_constraint_target(con, &subtarget);
- if (conOb == srcArm) {
- if (strcmp(subtarget, "")==0)
- set_constraint_target(con, tarArm, "");
- else if (strcmp(pchan->name, subtarget)==0)
- set_constraint_target(con, tarArm, curbone->name);
+ /* constraint targets */
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar == srcArm) {
+ if (strcmp(ct->subtarget, "")==0) {
+ ct->tar = tarArm;
+ }
+ else if (strcmp(ct->subtarget, pchan->name)==0) {
+ ct->tar = tarArm;
+ strcpy(ct->subtarget, curbone->name);
+ }
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
}
}
}
@@ -1042,10 +1075,23 @@ void delete_armature(void)
bConstraint *con;
TEST_EDITARMATURE;
- if(okee("Erase selected bone(s)")==0) return;
+ if (okee("Erase selected bone(s)")==0) return;
+
+ /* Select mirrored bones */
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for (curBone=G.edbo.first; curBone; curBone=curBone->next) {
+ if (arm->layer & curBone->layer) {
+ if (curBone->flag & BONE_SELECTED) {
+ next = armature_bone_get_mirrored(curBone);
+ if (next)
+ next->flag |= BONE_SELECTED;
+ }
+ }
+ }
+ }
/* First erase any associated pose channel */
- if (G.obedit->pose){
+ if (G.obedit->pose) {
bPoseChannel *chan, *next;
for (chan=G.obedit->pose->chanbase.first; chan; chan=next) {
next= chan->next;
@@ -1056,14 +1102,28 @@ void delete_armature(void)
BLI_freelinkN (&G.obedit->pose->chanbase, chan);
}
else {
- for(con= chan->constraints.first; con; con= con->next) {
- char *subtarget = get_con_subtarget_name(con, G.obedit);
- if (subtarget) {
- curBone = editbone_name_exists (&G.edbo, subtarget);
- if (curBone && (curBone->flag & BONE_SELECTED) && (arm->layer & curBone->layer)) {
- con->flag |= CONSTRAINT_DISABLE;
- subtarget[0]= 0;
+ for (con= chan->constraints.first; con; con= con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar == G.obedit) {
+ if (ct->subtarget[0]) {
+ curBone = editbone_name_exists(&G.edbo, ct->subtarget);
+ if (curBone && (curBone->flag & BONE_SELECTED) && (arm->layer & curBone->layer)) {
+ con->flag |= CONSTRAINT_DISABLE;
+ ct->subtarget[0]= 0;
+ }
+ }
+ }
}
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
}
}
}
@@ -1071,9 +1131,9 @@ void delete_armature(void)
}
- for (curBone=G.edbo.first;curBone;curBone=next){
+ for (curBone=G.edbo.first;curBone;curBone=next) {
next=curBone->next;
- if(arm->layer & curBone->layer)
+ if (arm->layer & curBone->layer)
if (curBone->flag & BONE_SELECTED)
delete_bone(curBone);
}
@@ -1266,37 +1326,86 @@ void deselectall_armature(int toggle, int doundo)
}
}
-void auto_align_armature(void)
-/* Sets the roll value of selected bones so that their zaxes point upwards */
+/* Sets the roll value of selected bones, depending on the mode
+ * mode == 0: their z-axes point upwards
+ * mode == 1: their z-axes point towards 3d-cursor
+ */
+void auto_align_armature(short mode)
{
bArmature *arm= G.obedit->data;
EditBone *ebone;
- float xaxis[3]={1.0, 0.0, 0.0}, yaxis[3], zaxis[3]={0.0, 0.0, 1.0};
- float targetmat[3][3], imat[3][3];
- float curmat[3][3], diffmat[3][3];
+ EditBone *flipbone = NULL;
float delta[3];
-
- for (ebone = G.edbo.first; ebone; ebone=ebone->next){
- if(arm->layer & ebone->layer) {
- if (ebone->flag & BONE_SELECTED){
- /* Find the current bone matrix */
- VecSubf(delta, ebone->tail, ebone->head);
- vec_roll_to_mat3(delta, 0.0, curmat);
-
- /* Make new matrix based on y axis & z-up */
- VECCOPY (yaxis, curmat[1]);
-
- Mat3One(targetmat);
- VECCOPY (targetmat[0], xaxis);
- VECCOPY (targetmat[1], yaxis);
- VECCOPY (targetmat[2], zaxis);
- Mat3Ortho(targetmat);
-
- /* Find the difference between the two matrices */
- Mat3Inv(imat, targetmat);
- Mat3MulMat3(diffmat, imat, curmat);
-
- ebone->roll = atan2(diffmat[2][0], diffmat[2][2]);
+ float curmat[3][3];
+ float *cursor= give_cursor();
+
+ for (ebone = G.edbo.first; ebone; ebone=ebone->next) {
+ if (arm->layer & ebone->layer) {
+ if (arm->flag & ARM_MIRROR_EDIT)
+ flipbone = armature_bone_get_mirrored(ebone);
+
+ if ((ebone->flag & BONE_SELECTED) ||
+ (flipbone && flipbone->flag & BONE_SELECTED))
+ {
+ /* specific method used to calculate roll depends on mode */
+ if (mode == 1) {
+ /* Z-Axis point towards cursor */
+ float mat[4][4], tmat[4][4], imat[4][4];
+ float rmat[4][4], rot[3];
+ float vec[3];
+
+ /* find the current bone matrix as a 4x4 matrix (in Armature Space) */
+ VecSubf(delta, ebone->tail, ebone->head);
+ vec_roll_to_mat3(delta, ebone->roll, curmat);
+ Mat4CpyMat3(mat, curmat);
+ VECCOPY(mat[3], ebone->head);
+
+ /* multiply bone-matrix by object matrix (so that bone-matrix is in WorldSpace) */
+ Mat4MulMat4(tmat, mat, G.obedit->obmat);
+ Mat4Invert(imat, tmat);
+
+ /* find position of cursor relative to bone */
+ VecMat4MulVecfl(vec, imat, cursor);
+
+ /* check that cursor is in usable position */
+ if ((IS_EQ(vec[0], 0)==0) && (IS_EQ(vec[2], 0)==0)) {
+ /* Compute a rotation matrix around y */
+ rot[1] = atan2(vec[0], vec[2]);
+ rot[0] = rot[2] = 0.0f;
+ EulToMat4(rot, rmat);
+
+ /* Multiply the bone matrix by rotation matrix. This should be new bone-matrix */
+ Mat4MulMat4(tmat, rmat, mat);
+ Mat3CpyMat4(curmat, tmat);
+
+ /* Now convert from new bone-matrix, back to a roll value (in radians) */
+ mat3_to_vec_roll(curmat, delta, &ebone->roll);
+ }
+ }
+ else {
+ /* Z-Axis Point Up */
+ float xaxis[3]={1.0, 0.0, 0.0}, yaxis[3], zaxis[3]={0.0, 0.0, 1.0};
+ float targetmat[3][3], imat[3][3], diffmat[3][3];
+
+ /* Find the current bone matrix */
+ VecSubf(delta, ebone->tail, ebone->head);
+ vec_roll_to_mat3(delta, 0.0, curmat);
+
+ /* Make new matrix based on y axis & z-up */
+ VECCOPY (yaxis, curmat[1]);
+
+ Mat3One(targetmat);
+ VECCOPY (targetmat[0], xaxis);
+ VECCOPY (targetmat[1], yaxis);
+ VECCOPY (targetmat[2], zaxis);
+ Mat3Ortho(targetmat);
+
+ /* Find the difference between the two matrices */
+ Mat3Inv(imat, targetmat);
+ Mat3MulMat3(diffmat, imat, curmat);
+
+ ebone->roll = atan2(diffmat[2][0], diffmat[2][2]);
+ }
}
}
}
@@ -1396,7 +1505,7 @@ static EditBone *add_editbone(char *name)
return bone;
}
-static void add_primitive_bone(Object *ob)
+static void add_primitive_bone(Object *ob, short newob)
{
float obmat[3][3], curs[3], viewmat[3][3], totmat[3][3], imat[3][3];
EditBone *bone;
@@ -1407,7 +1516,9 @@ static void add_primitive_bone(Object *ob)
Mat4Invert(G.obedit->imat, G.obedit->obmat);
Mat4MulVecfl(G.obedit->imat, curs);
- Mat3CpyMat4(obmat, G.vd->viewmat);
+ if ( !(newob) || U.flag & USER_ADD_VIEWALIGNED) Mat3CpyMat4(obmat, G.vd->viewmat);
+ else Mat3One(obmat);
+
Mat3CpyMat4(viewmat, G.obedit->obmat);
Mat3MulMat3(totmat, obmat, viewmat);
Mat3Inv(imat, totmat);
@@ -1418,19 +1529,25 @@ static void add_primitive_bone(Object *ob)
bone= add_editbone("Bone");
VECCOPY(bone->head, curs);
- VecAddf(bone->tail, bone->head, imat[1]); // bone with unit length 1
+
+ if ( !(newob) || U.flag & USER_ADD_VIEWALIGNED)
+ VecAddf(bone->tail, bone->head, imat[1]); // bone with unit length 1
+ else
+ VecAddf(bone->tail, bone->head, imat[2]); // bone with unit length 1, pointing up Z
}
void add_primitiveArmature(int type)
{
+ short newob=0;
+
if(G.scene->id.lib) return;
/* this function also comes from an info window */
if ELEM(curarea->spacetype, SPACE_VIEW3D, SPACE_INFO); else return;
if(G.vd==NULL) return;
- G.f &= ~(G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT+G_WEIGHTPAINT);
+ G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT);
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
check_editmode(OB_ARMATURE);
@@ -1445,13 +1562,18 @@ void add_primitiveArmature(int type)
make_editArmature();
setcursor_space(SPACE_VIEW3D, CURSOR_EDIT);
+ newob=1;
}
/* no primitive support yet */
- add_primitive_bone(G.obedit);
+ add_primitive_bone(G.obedit, newob);
countall(); // flushes selection!
+ if ( (newob) && !(U.flag & USER_ADD_EDITMODE)) {
+ exit_editmode(2);
+ }
+
allqueue(REDRAWALL, 0);
BIF_undo_push("Add primitive");
}
@@ -1562,28 +1684,43 @@ static void update_dup_subtarget(EditBone *dupBone)
bPoseChannel *chan;
bConstraint *curcon;
ListBase *conlist;
- char *subname;
- if ( (chan = verify_pose_channel(OBACT->pose, dupBone->name)) )
- if ( (conlist = &chan->constraints) )
+ if ( (chan = verify_pose_channel(OBACT->pose, dupBone->name)) ) {
+ if ( (conlist = &chan->constraints) ) {
for (curcon = conlist->first; curcon; curcon=curcon->next) {
/* does this constraint have a subtarget in
* this armature?
*/
- subname = get_con_subtarget_name(curcon, G.obedit);
- oldtarget = get_named_editbone(subname);
- if (oldtarget)
- /* was the subtarget bone duplicated too? If
- * so, update the constraint to point at the
- * duplicate of the old subtarget.
- */
- if (oldtarget->flag & BONE_SELECTED){
- newtarget = (EditBone*) oldtarget->temp;
- strcpy(subname, newtarget->name);
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(curcon);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(curcon, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if ((ct->tar == G.obedit) && (ct->subtarget[0])) {
+ oldtarget = get_named_editbone(ct->subtarget);
+ if (oldtarget) {
+ /* was the subtarget bone duplicated too? If
+ * so, update the constraint to point at the
+ * duplicate of the old subtarget.
+ */
+ if (oldtarget->flag & BONE_SELECTED){
+ newtarget = (EditBone *) oldtarget->temp;
+ strcpy(ct->subtarget, newtarget->name);
+ }
+ }
+ }
}
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(curcon, &targets, 0);
+ }
}
-
+ }
+ }
}
@@ -1595,11 +1732,24 @@ void adduplicate_armature(void)
EditBone *firstDup=NULL; /* The beginning of the duplicated bones in the edbo list */
countall(); // flushes selection!
+
+ /* Select mirrored bones */
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ for (curBone=G.edbo.first; curBone; curBone=curBone->next) {
+ if (arm->layer & curBone->layer) {
+ if (curBone->flag & BONE_SELECTED) {
+ eBone = armature_bone_get_mirrored(curBone);
+ if (eBone)
+ eBone->flag |= BONE_SELECTED;
+ }
+ }
+ }
+ }
/* Find the selected bones and duplicate them as needed */
for (curBone=G.edbo.first; curBone && curBone!=firstDup; curBone=curBone->next){
- if(arm->layer & curBone->layer) {
- if (curBone->flag & BONE_SELECTED){
+ if (arm->layer & curBone->layer) {
+ if (curBone->flag & BONE_SELECTED) {
eBone=MEM_callocN(sizeof(EditBone), "addup_editbone");
eBone->flag |= BONE_SELECTED;
@@ -1615,9 +1765,9 @@ void adduplicate_armature(void)
if (!firstDup)
firstDup=eBone;
- /* Lets duplicate the list of constraits that the
- * current bone has.
- */
+ /* Lets duplicate the list of constraints that the
+ * current bone has.
+ */
if (OBACT->pose) {
bPoseChannel *chanold, *channew;
ListBase *listold, *listnew;
@@ -1625,7 +1775,10 @@ void adduplicate_armature(void)
chanold = verify_pose_channel (OBACT->pose, curBone->name);
if (chanold) {
listold = &chanold->constraints;
- if (listold){
+ if (listold) {
+ /* WARNING: this creates a new posechannel, but there will not be an attached bone
+ * yet as the new bones created here are still 'EditBones' not 'Bones'.
+ */
channew =
verify_pose_channel(OBACT->pose, eBone->name);
if (channew) {
@@ -1646,7 +1799,6 @@ void adduplicate_armature(void)
}
}
}
-
}
}
}
@@ -1764,104 +1916,172 @@ void show_all_armature_bones(void)
BIF_undo_push("Reveal Bones");
}
-void make_bone_parent(void)
+/* check for null, before calling! */
+static void bone_connect_to_existing_parent(EditBone *bone)
+{
+ bone->flag |= BONE_CONNECTED;
+ VECCOPY(bone->head, bone->parent->tail);
+ bone->rad_head = bone->parent->rad_tail;
+}
+
+static void bone_connect_to_new_parent(EditBone *selbone, EditBone *actbone, short mode)
{
- bArmature *arm= G.obedit->data;
EditBone *ebone;
float offset[3];
- short val;
- val= pupmenu("Make Parent%t|Connected%x1|Keep Offset%x2");
+ if ((selbone->parent) && (selbone->flag & BONE_CONNECTED))
+ selbone->parent->flag &= ~(BONE_TIPSEL);
- if(val<1) return;
+ /* make actbone the parent of selbone */
+ selbone->parent= actbone;
- /* find active */
- for (ebone = G.edbo.first; ebone; ebone=ebone->next)
- if(arm->layer & ebone->layer)
- if(ebone->flag & BONE_ACTIVE) break;
+ /* in actbone tree we cannot have a loop */
+ for (ebone= actbone->parent; ebone; ebone= ebone->parent) {
+ if (ebone->parent==selbone) {
+ ebone->parent= NULL;
+ ebone->flag &= ~BONE_CONNECTED;
+ }
+ }
- if(ebone) {
- EditBone *actbone= ebone, *selbone= NULL;
+ if (mode == 1) {
+ /* Connected: Child bones will be moved to the parent tip */
+ selbone->flag |= BONE_CONNECTED;
+ VecSubf(offset, actbone->tail, selbone->head);
+
+ VECCOPY(selbone->head, actbone->tail);
+ selbone->rad_head= actbone->rad_tail;
- /* find selected */
+ VecAddf(selbone->tail, selbone->tail, offset);
+
+ /* offset for all its children */
for (ebone = G.edbo.first; ebone; ebone=ebone->next) {
- if(arm->layer & ebone->layer) {
- if(ebone->flag & BONE_SELECTED) {
- if(ebone!=actbone) {
- if(selbone==NULL) selbone= ebone;
- else {
- error("Need one active and one selected bone");
- return;
- }
- }
+ EditBone *par;
+
+ for (par= ebone->parent; par; par= par->parent) {
+ if (par==selbone) {
+ VecAddf(ebone->head, ebone->head, offset);
+ VecAddf(ebone->tail, ebone->tail, offset);
+ break;
}
}
}
- if(selbone==NULL) {
- /* we make sure bone is connected */
- if(val==1 && actbone->parent) {
- actbone->flag |= BONE_CONNECTED;
- VECCOPY(actbone->head, actbone->parent->tail);
- actbone->rad_head= actbone->parent->rad_tail;
- countall(); // checks selection
- allqueue(REDRAWVIEW3D, 0);
- BIF_undo_push("Connect to Parent");
- }
- else error("Need one active and one selected bone");
+ }
+ else {
+ /* Offset: Child bones will retain their distance from the parent tip */
+ selbone->flag &= ~BONE_CONNECTED;
+ }
+}
+
+void make_bone_parent(void)
+{
+ bArmature *arm= G.obedit->data;
+ EditBone *actbone, *ebone, *selbone;
+ EditBone *flipbone, *flippar;
+ short allchildbones= 0, foundselbone= 0;
+ short val;
+
+ /* find active bone to parent to */
+ for (actbone = G.edbo.first; actbone; actbone=actbone->next) {
+ if (arm->layer & actbone->layer) {
+ if (actbone->flag & BONE_ACTIVE)
+ break;
}
- else {
- /* if selbone had a parent we clear parent tip */
- if(selbone->parent && (selbone->flag & BONE_CONNECTED))
- selbone->parent->flag &= ~(BONE_TIPSEL);
-
- selbone->parent= actbone;
-
- /* in actbone tree we cannot have a loop */
- for(ebone= actbone->parent; ebone; ebone= ebone->parent) {
- if(ebone->parent==selbone) {
- ebone->parent= NULL;
- ebone->flag &= ~BONE_CONNECTED;
- }
- }
-
- if(val==1) { // connected
- selbone->flag |= BONE_CONNECTED;
- VecSubf(offset, actbone->tail, selbone->head);
-
- VECCOPY(selbone->head, actbone->tail);
- selbone->rad_head= actbone->rad_tail;
+ }
+ if (actbone == NULL) {
+ error("Needs an active bone");
+ return;
+ }
- VecAddf(selbone->tail, selbone->tail, offset);
-
- // offset for all its children
- for (ebone = G.edbo.first; ebone; ebone=ebone->next) {
- EditBone *par;
- for(par= ebone->parent; par; par= par->parent) {
- if(par==selbone) {
- VecAddf(ebone->head, ebone->head, offset);
- VecAddf(ebone->tail, ebone->tail, offset);
- break;
+ /* find selected bones */
+ for (ebone = G.edbo.first; ebone; ebone=ebone->next) {
+ if (arm->layer & ebone->layer) {
+ if ((ebone->flag & BONE_SELECTED) && (ebone != actbone)) {
+ foundselbone++;
+ if (ebone->parent != actbone) allchildbones= 1;
+ }
+ }
+ }
+ /* abort if no selected bones, and active bone doesn't have a parent to work with instead */
+ if (foundselbone==0 && actbone->parent==NULL) {
+ error("Need selected bone(s)");
+ return;
+ }
+
+ /* 'Keep Offset' option is only displayed if it's likely to be useful */
+ if (allchildbones)
+ val= pupmenu("Make Parent%t|Connected%x1|Keep Offset%x2");
+ else
+ val= pupmenu("Make Parent%t|Connected%x1");
+
+ if (val < 1) return;
+
+ if (foundselbone==0 && actbone->parent) {
+ /* When only the active bone is selected, and it has a parent,
+ * connect it to the parent, as that is the only possible outcome.
+ */
+ bone_connect_to_existing_parent(actbone);
+
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ flipbone = armature_bone_get_mirrored(actbone);
+ if (flipbone)
+ bone_connect_to_existing_parent(flipbone);
+ }
+ }
+ else {
+ /* loop through all editbones, parenting all selected bones to the active bone */
+ for (selbone = G.edbo.first; selbone; selbone=selbone->next) {
+ if (arm->layer & selbone->layer) {
+ if ((selbone->flag & BONE_SELECTED) && (selbone!=actbone)) {
+ /* parent selbone to actbone */
+ bone_connect_to_new_parent(selbone, actbone, val);
+
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ /* - if there's a mirrored copy of selbone, try to find a mirrored copy of actbone
+ * (i.e. selbone="child.L" and actbone="parent.L", find "child.R" and "parent.R").
+ * This is useful for arm-chains, for example parenting lower arm to upper arm
+ * - if there's no mirrored copy of actbone (i.e. actbone = "parent.C" or "parent")
+ * then just use actbone. Useful when doing upper arm to spine.
+ */
+ flipbone = armature_bone_get_mirrored(selbone);
+ flippar = armature_bone_get_mirrored(actbone);
+
+ if (flipbone) {
+ if (flippar)
+ bone_connect_to_new_parent(flipbone, flippar, val);
+ else
+ bone_connect_to_new_parent(flipbone, actbone, val);
}
}
}
}
- else {
- selbone->flag &= ~BONE_CONNECTED;
- }
-
- countall(); // checks selection
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSEDIT, 0);
- allqueue(REDRAWOOPS, 0);
- BIF_undo_push("Make Parent");
}
}
+
+ countall(); /* checks selection */
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWOOPS, 0);
+ BIF_undo_push("Make Parent");
+
+ return;
+}
+
+static void editbone_clear_parent(EditBone *ebone, int mode)
+{
+ if (ebone->parent) {
+ /* for nice selection */
+ ebone->parent->flag &= ~(BONE_TIPSEL);
+ }
+
+ if(mode==1) ebone->parent= NULL;
+ ebone->flag &= ~BONE_CONNECTED;
}
void clear_bone_parent(void)
{
bArmature *arm= G.obedit->data;
EditBone *ebone;
+ EditBone *flipbone = NULL;
short val;
val= pupmenu("Clear Parent%t|Clear Parent%x1|Disconnect Bone%x2");
@@ -1870,13 +2090,13 @@ void clear_bone_parent(void)
for (ebone = G.edbo.first; ebone; ebone=ebone->next) {
if(arm->layer & ebone->layer) {
if(ebone->flag & BONE_SELECTED) {
- if(ebone->parent) {
- /* for nice selection */
- ebone->parent->flag &= ~(BONE_TIPSEL);
+
+ if(arm->flag & ARM_MIRROR_EDIT)
+ flipbone = armature_bone_get_mirrored(ebone);
- if(val==1) ebone->parent= NULL;
- ebone->flag &= ~BONE_CONNECTED;
- }
+ if (flipbone)
+ editbone_clear_parent(flipbone, val);
+ editbone_clear_parent(ebone, val);
}
}
}
@@ -2062,53 +2282,77 @@ void extrude_armature(int forked)
}
/* context; editmode armature */
-void subdivide_armature(void)
+void subdivide_armature(int numcuts)
{
bArmature *arm= G.obedit->data;
EditBone *ebone, *newbone, *tbone, *mbone;
- int a;
+ int a, i;
+ if(numcuts < 1) return;
+
for (mbone = G.edbo.last; mbone; mbone= mbone->prev) {
if(arm->layer & mbone->layer) {
if(mbone->flag & BONE_SELECTED) {
-
- /* take care of mirrored stuff */
- for(a=0; a<2; a++) {
- if(a==0) ebone= mbone;
- else {
- if(arm->flag & ARM_MIRROR_EDIT)
- ebone= armature_bone_get_mirrored(mbone);
- else ebone= NULL;
- }
- if(ebone) {
-
- newbone= MEM_mallocN(sizeof(EditBone), "ebone subdiv");
- *newbone = *ebone;
- BLI_addtail(&G.edbo, newbone);
-
- VecMidf(newbone->head, ebone->head, ebone->tail);
- VECCOPY(newbone->tail, ebone->tail);
- VECCOPY(ebone->tail, newbone->head);
-
- newbone->rad_head= 0.5*(ebone->rad_head+ebone->rad_tail);
- ebone->rad_tail= newbone->rad_head;
-
- newbone->flag |= BONE_CONNECTED;
-
- unique_editbone_name (&G.edbo, newbone->name);
+ for(i=numcuts+1; i>1; i--) {
+ /* compute cut ratio first */
+ float cutratio= 1/(float)i;
+ float cutratioI= 1-cutratio;
+
+ /* take care of mirrored stuff */
+ for(a=0; a<2; a++) {
+ float val1[3];
+ float val2[3];
+ float val3[3];
- /* correct parent bones */
- for (tbone = G.edbo.first; tbone; tbone=tbone->next){
- if(tbone->parent==ebone)
- tbone->parent= newbone;
+ /* try to find mirrored bone on a != 0 */
+ if(a) {
+ if(arm->flag & ARM_MIRROR_EDIT)
+ ebone= armature_bone_get_mirrored(mbone);
+ else ebone= NULL;
+ }
+ else
+ ebone= mbone;
+
+ if(ebone) {
+ newbone= MEM_mallocN(sizeof(EditBone), "ebone subdiv");
+ *newbone = *ebone;
+ BLI_addtail(&G.edbo, newbone);
+
+ /* calculate location of newbone->head */
+ VECCOPY(val1, ebone->head);
+ VECCOPY(val2, ebone->tail);
+ VECCOPY(val3, newbone->head);
+
+ val3[0]= val1[0]*cutratio+val2[0]*cutratioI;
+ val3[1]= val1[1]*cutratio+val2[1]*cutratioI;
+ val3[2]= val1[2]*cutratio+val2[2]*cutratioI;
+
+ VECCOPY(newbone->head, val3);
+ VECCOPY(newbone->tail, ebone->tail);
+ VECCOPY(ebone->tail, newbone->head);
+
+ newbone->rad_head= 0.5*(ebone->rad_head+ebone->rad_tail);
+ ebone->rad_tail= newbone->rad_head;
+
+ newbone->flag |= BONE_CONNECTED;
+
+ unique_editbone_name (&G.edbo, newbone->name);
+
+ /* correct parent bones */
+ for (tbone = G.edbo.first; tbone; tbone=tbone->next){
+ if(tbone->parent==ebone)
+ tbone->parent= newbone;
+ }
+ newbone->parent= ebone;
}
- newbone->parent= ebone;
}
}
}
}
}
- BIF_undo_push("Subdivide");
+
+ if(numcuts==1) BIF_undo_push("Subdivide");
+ else BIF_undo_push("Subdivide multi");
}
/* ***************** Pose tools ********************* */
@@ -2126,7 +2370,7 @@ void clear_armature(Object *ob, char mode)
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
if(pchan->bone && (pchan->bone->flag & BONE_SELECTED)) {
if(arm->layer & pchan->bone->layer) {
- switch (mode){
+ switch (mode) {
case 'r':
pchan->quat[1]=pchan->quat[2]=pchan->quat[3]=0.0F; pchan->quat[0]=1.0F;
break;
@@ -2138,6 +2382,9 @@ void clear_armature(Object *ob, char mode)
break;
}
+
+ /* the current values from IPO's may not be zero, so tag as unkeyed */
+ pchan->bone->flag |= BONE_UNKEYED;
}
}
}
@@ -2168,6 +2415,8 @@ int do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits)
nearBone= get_bone_from_selectbuffer(base, buffer, hits, 1);
if (nearBone) {
+ bArmature *arm= ob->data;
+
/* since we do unified select, we don't shift+select a bone if the armature object was not active yet */
if (!(G.qual & LR_SHIFTKEY) || base!=BASACT){
deselectall_posearmature(ob, 0, 0);
@@ -2178,9 +2427,7 @@ int do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits)
if (nearBone->flag & BONE_SELECTED) {
/* if not active, we make it active */
if((nearBone->flag & BONE_ACTIVE)==0) {
- bArmature *arm= ob->data;
bone_looper(ob, arm->bonebase.first, NULL, clear_active_flag);
-
nearBone->flag |= BONE_ACTIVE;
}
else {
@@ -2189,7 +2436,6 @@ int do_pose_selectbuffer(Base *base, unsigned int *buffer, short hits)
}
}
else{
- bArmature *arm= ob->data;
bone_looper(ob, arm->bonebase.first, NULL, clear_active_flag);
nearBone->flag |= (BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL|BONE_ACTIVE);
@@ -2332,14 +2578,16 @@ static int bone_skinnable(Object *ob, Bone *bone, void *data)
*/
Bone ***hbone;
- if (!(bone->flag & BONE_NO_DEFORM)) {
- if (data != NULL) {
- hbone = (Bone ***) data;
- **hbone = bone;
- ++*hbone;
- }
- return 1;
- }
+ if(!(G.f & G_WEIGHTPAINT) || !(bone->flag & BONE_HIDDEN_P)) {
+ if (!(bone->flag & BONE_NO_DEFORM)) {
+ if (data != NULL) {
+ hbone = (Bone ***) data;
+ **hbone = bone;
+ ++*hbone;
+ }
+ return 1;
+ }
+ }
return 0;
}
@@ -2385,57 +2633,97 @@ static int dgroup_skinnable(Object *ob, Bone *bone, void *data)
*/
bDeformGroup ***hgroup, *defgroup;
- if (!(bone->flag & BONE_NO_DEFORM)) {
- if ( !(defgroup = get_named_vertexgroup(ob, bone->name)) ) {
- defgroup = add_defgroup_name(ob, bone->name);
- }
-
- if (data != NULL) {
- hgroup = (bDeformGroup ***) data;
- **hgroup = defgroup;
- ++*hgroup;
- }
- return 1;
- }
+ if(!(G.f & G_WEIGHTPAINT) || !(bone->flag & BONE_HIDDEN_P)) {
+ if (!(bone->flag & BONE_NO_DEFORM)) {
+ if ( !(defgroup = get_named_vertexgroup(ob, bone->name)) ) {
+ defgroup = add_defgroup_name(ob, bone->name);
+ }
+
+ if (data != NULL) {
+ hgroup = (bDeformGroup ***) data;
+ **hgroup = defgroup;
+ ++*hgroup;
+ }
+ return 1;
+ }
+ }
return 0;
}
-static void add_verts_to_closest_dgroup(Object *ob, Object *par)
-{
- /* This function implements a crude form of
- * auto-skinning: vertices are assigned to the
- * deformation groups associated with bones based
- * on thier proximity to a bone. Every vert is
- * given a weight of 1.0 to the weight group
- * cooresponding to the bone that it is
- * closest to. The vertex may also be assigned to
- * a deformation group associated to a bone
- * that is within 10% of the mninimum distance
- * between the bone and the nearest vert -- the
- * cooresponding weight will fall-off to zero
- * as the distance approaches the 10% tolerance mark.
- * If the mesh has subsurf enabled then the verts
- * on the subsurf limit surface is used to generate
- * the weights rather than the verts on the cage
- * mesh.
+static void add_vgroups__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
+{
+ /* DerivedMesh mapFunc for getting final coords in weight paint mode */
+
+ float (*verts)[3] = userData;
+ VECCOPY(verts[index], co);
+}
+
+static void envelope_bone_weighting(Object *ob, Mesh *mesh, float (*verts)[3], int numbones, Bone **bonelist, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3], int *selected, float scale)
+{
+ /* Create vertex group weights from envelopes */
+
+ Bone *bone;
+ bDeformGroup *dgroup;
+ float distance;
+ int i, iflip, j;
+
+ /* for each vertex in the mesh */
+ for (i=0; i < mesh->totvert; i++) {
+ iflip = (dgroupflip)? mesh_get_x_mirror_vert(ob, i): 0;
+
+ /* for each skinnable bone */
+ for (j=0; j < numbones; ++j) {
+ if(!selected[j])
+ continue;
+
+ bone = bonelist[j];
+ dgroup = dgrouplist[j];
+
+ /* store the distance-factor from the vertex to the bone */
+ distance = distfactor_to_bone (verts[i], root[j], tip[j],
+ 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)
+ add_vert_to_defgroup (ob, dgroup, i, distance, WEIGHT_REPLACE);
+ else
+ remove_vert_defgroup (ob, dgroup, i);
+
+ /* do same for mirror */
+ if (dgroupflip && dgroupflip[j] && iflip >= 0) {
+ if (distance!=0.0)
+ add_vert_to_defgroup (ob, dgroupflip[j], iflip, distance,
+ WEIGHT_REPLACE);
+ else
+ remove_vert_defgroup (ob, dgroupflip[j], iflip);
+ }
+ }
+ }
+}
+
+void add_verts_to_dgroups(Object *ob, Object *par, int heat, int mirror)
+{
+ /* This functions implements the automatic computation of vertex group
+ * weights, either through envelopes or using a heat equilibrium.
*
- * ("Limit surface" = same amount of vertices as mesh, but vertices
- * moved to the subsurfed position, like for 'optimal').
+ * This function can be called both when parenting a mesh to an armature,
+ * or in weightpaint + posemode. In the latter case selection is taken
+ * into account and vertex weights can be mirrored.
+ *
+ * The mesh vertex positions used are either the final deformed coords
+ * from the derivedmesh in weightpaint mode, the final subsurf coords
+ * when parenting, or simply the original mesh coords.
*/
bArmature *arm;
Bone **bonelist, **bonehandle, *bone;
- bDeformGroup **dgrouplist, **dgrouphandle, *defgroup;
- float *distance;
- float root[3];
- float tip[3];
- float real_co[3];
- float *subverts = NULL;
- float *subvert;
- Mesh *mesh;
- MVert *vert;
-
- int numbones, i, j;
+ bDeformGroup **dgrouplist, **dgroupflip, **dgrouphandle;
+ bDeformGroup *dgroup, *curdg;
+ Mesh *mesh;
+ float (*root)[3], (*tip)[3], (*verts)[3];
+ int *selected;
+ int numbones, vertsfilled = 0, i, j;
+ int wpmode = (G.f & G_WEIGHTPAINT);
/* If the parent object is not an armature exit */
arm = get_armature(par);
@@ -2443,97 +2731,113 @@ static void add_verts_to_closest_dgroup(Object *ob, Object *par)
return;
/* count the number of skinnable bones */
- numbones = bone_looper(ob, arm->bonebase.first, NULL,
- bone_skinnable);
+ numbones = bone_looper(ob, arm->bonebase.first, NULL, bone_skinnable);
+
+ if (numbones == 0)
+ return;
/* create an array of pointer to bones that are skinnable
- * and fill it with all of the skinnable bones
- */
- bonelist = MEM_mallocN(numbones*sizeof(Bone *), "bonelist");
+ * and fill it with all of the skinnable bones */
+ bonelist = MEM_callocN(numbones*sizeof(Bone *), "bonelist");
bonehandle = bonelist;
- bone_looper(ob, arm->bonebase.first, &bonehandle,
- bone_skinnable);
+ bone_looper(ob, arm->bonebase.first, &bonehandle, bone_skinnable);
/* create an array of pointers to the deform groups that
* coorespond to the skinnable bones (creating them
- * as necessary.
- */
- dgrouplist = MEM_mallocN(numbones*sizeof(bDeformGroup *), "dgrouplist");
+ * as necessary. */
+ dgrouplist = MEM_callocN(numbones*sizeof(bDeformGroup *), "dgrouplist");
+ dgroupflip = MEM_callocN(numbones*sizeof(bDeformGroup *), "dgroupflip");
+
dgrouphandle = dgrouplist;
- bone_looper(ob, arm->bonebase.first, &dgrouphandle,
- dgroup_skinnable);
+ bone_looper(ob, arm->bonebase.first, &dgrouphandle, dgroup_skinnable);
- /* create an array of floats that will be used for each vert
- * to hold the distance-factor to each bone.
- */
- distance = MEM_mallocN(numbones*sizeof(float), "distance");
+ /* create an array of root and tip positions transformed into
+ * global coords */
+ root = MEM_callocN(numbones*sizeof(float)*3, "root");
+ tip = MEM_callocN(numbones*sizeof(float)*3, "tip");
+ selected = MEM_callocN(numbones*sizeof(int), "selected");
- mesh = (Mesh*)ob->data;
+ for (j=0; j < numbones; ++j) {
+ bone = bonelist[j];
+ dgroup = dgrouplist[j];
- /* Is subsurf on? Lets use the verts on the limit surface then */
- if (modifiers_findByType(ob, eModifierType_Subsurf)) {
- subverts = MEM_mallocN(3*mesh->totvert*sizeof(float), "subverts");
- subsurf_calculate_limit_positions(mesh, (void *)subverts); /* (ton) made void*, dunno how to cast */
- }
+ /* compute root and tip */
+ VECCOPY(root[j], bone->arm_head);
+ Mat4MulVecfl(par->obmat, root[j]);
- /* for each vertex in the mesh ...
- */
- for ( i=0 ; i < mesh->totvert ; ++i ) {
- /* get the vert in global coords
- */
-
- if (subverts) {
- subvert = subverts + i*3;
- VECCOPY (real_co, subvert);
+ VECCOPY(tip[j], bone->arm_tail);
+ Mat4MulVecfl(par->obmat, tip[j]);
+
+ /* set selected */
+ if(wpmode) {
+ if ((arm->layer & bone->layer) && (bone->flag & BONE_SELECTED))
+ selected[j] = 1;
}
- else {
- vert = mesh->mvert + i;
- VECCOPY (real_co, vert->co);
+ else
+ selected[j] = 1;
+
+ /* find flipped group */
+ if(mirror) {
+ char name[32];
+
+ BLI_strncpy(name, dgroup->name, 32);
+ // 0 = don't strip off number extensions
+ bone_flip_name(name, 0);
+
+ for (curdg = ob->defbase.first; curdg; curdg=curdg->next)
+ if (!strcmp(curdg->name, name))
+ break;
+
+ dgroupflip[j] = curdg;
}
- Mat4MulVecfl(ob->obmat, real_co);
+ }
+ /* create verts */
+ mesh = (Mesh*)ob->data;
+ verts = MEM_callocN(mesh->totvert*sizeof(*verts), "closestboneverts");
- /* for each skinnable bone ...
- */
- for (j=0; j < numbones; ++j) {
- bone = bonelist[j];
-
- /* get the root of the bone in global coords
- */
- VECCOPY(root, bone->arm_head);
- Mat4MulVecfl(par->obmat, root);
-
- /* get the tip of the bone in global coords
- */
- VECCOPY(tip, bone->arm_tail);
- Mat4MulVecfl(par->obmat, tip);
-
- /* store the distance-factor from the vertex to
- * the bone
- */
- distance[j]= distfactor_to_bone (real_co, root, tip, bone->rad_head, bone->rad_tail, bone->dist);
- }
-
- /* for each deform group ...
- */
- for (j=0; j < numbones; ++j) {
- defgroup = dgrouplist[j];
-
- /* add the vert to the deform group if weight!=0.0
- */
- if (distance[j]!=0.0)
- add_vert_to_defgroup (ob, defgroup, i, distance[j], WEIGHT_REPLACE);
- else
- remove_vert_defgroup (ob, defgroup, i);
- }
- }
+ if (wpmode) {
+ /* if in weight paint mode, use final verts from derivedmesh */
+ DerivedMesh *dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
- /* free the memory allocated
- */
+ if(dm->foreachMappedVert) {
+ dm->foreachMappedVert(dm, add_vgroups__mapFunc, (void*)verts);
+ vertsfilled = 1;
+ }
+
+ dm->release(dm);
+ }
+ else if (modifiers_findByType(ob, eModifierType_Subsurf)) {
+ /* is subsurf on? Lets use the verts on the limit surface then.
+ * = same amount of vertices as mesh, but vertices moved to the
+ * subsurfed position, like for 'optimal'. */
+ subsurf_calculate_limit_positions(mesh, verts);
+ vertsfilled = 1;
+ }
+
+ /* transform verts to global space */
+ for (i=0; i < mesh->totvert; i++) {
+ if (!vertsfilled)
+ VECCOPY(verts[i], mesh->mvert[i].co)
+ Mat4MulVecfl(ob->obmat, verts[i]);
+ }
+
+ /* compute the weights based on gathered vertices and bones */
+ if (heat)
+ heat_bone_weighting(ob, mesh, verts, numbones, dgrouplist, dgroupflip,
+ root, tip, selected);
+ else
+ envelope_bone_weighting(ob, mesh, verts, numbones, bonelist, dgrouplist,
+ dgroupflip, root, tip, selected, Mat4ToScalef(par->obmat));
+
+ /* free the memory allocated */
MEM_freeN(bonelist);
MEM_freeN(dgrouplist);
- MEM_freeN(distance);
- if (subverts) MEM_freeN(subverts);
+ MEM_freeN(dgroupflip);
+ MEM_freeN(root);
+ MEM_freeN(tip);
+ MEM_freeN(selected);
+ MEM_freeN(verts);
}
void create_vgroups_from_armature(Object *ob, Object *par)
@@ -2555,7 +2859,8 @@ void create_vgroups_from_armature(Object *ob, Object *par)
mode= pupmenu("Create Vertex Groups? %t|"
"Don't Create Groups %x1|"
"Name Groups %x2|"
- "Create From Closest Bones %x3");
+ "Create From Envelopes %x3|"
+ "Create From Bone Heat %x4|");
switch (mode){
case 2:
/* Traverse the bone list, trying to create empty vertex
@@ -2569,11 +2874,12 @@ void create_vgroups_from_armature(Object *ob, Object *par)
break;
case 3:
+ case 4:
/* Traverse the bone list, trying to create vertex groups
* that are populated with the vertices for which the
* bone is closest.
*/
- add_verts_to_closest_dgroup(ob, par);
+ add_verts_to_dgroups(ob, par, (mode == 4), 0);
break;
}
@@ -2706,13 +3012,25 @@ void unique_bone_name (bArmature *arm, char *name)
static void constraint_bone_name_fix(Object *ob, ListBase *conlist, char *oldname, char *newname)
{
bConstraint *curcon;
- char *subtarget;
+ bConstraintTarget *ct;
- for (curcon = conlist->first; curcon; curcon=curcon->next){
- subtarget = get_con_subtarget_name(curcon, ob);
- if (subtarget)
- if (!strcmp(subtarget, oldname) )
- BLI_strncpy(subtarget, newname, MAXBONENAME);
+ for (curcon = conlist->first; curcon; curcon=curcon->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(curcon);
+ ListBase targets = {NULL, NULL};
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(curcon, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if (ct->tar == ob) {
+ if (!strcmp(ct->subtarget, oldname) )
+ BLI_strncpy(ct->subtarget, newname, MAXBONENAME);
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(curcon, &targets, 0);
+ }
}
}
@@ -2894,6 +3212,7 @@ void transform_armature_mirror_update(void)
}
if(ebo->flag & BONE_SELECTED) {
eboflip->dist= ebo->dist;
+ eboflip->roll= -ebo->roll;
eboflip->xwidth= ebo->xwidth;
eboflip->zwidth= ebo->zwidth;
}
@@ -2902,3 +3221,6 @@ void transform_armature_mirror_update(void)
}
}
+
+
+
diff --git a/source/blender/src/editconstraint.c b/source/blender/src/editconstraint.c
index 2eef0f55978..e0588b4c2a0 100644
--- a/source/blender/src/editconstraint.c
+++ b/source/blender/src/editconstraint.c
@@ -45,6 +45,7 @@
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_text_types.h"
#include "DNA_view3d_types.h"
#include "BKE_action.h"
@@ -52,6 +53,7 @@
#include "BKE_constraint.h"
#include "BKE_depsgraph.h"
#include "BKE_global.h"
+#include "BKE_main.h"
#include "BKE_ipo.h"
#include "BKE_object.h"
#include "BKE_utildefines.h"
@@ -65,6 +67,8 @@
#include "BIF_space.h"
#include "BIF_toolbox.h"
+#include "BPY_extern.h"
+
#include "blendef.h"
#include "nla.h"
#include "mydevice.h"
@@ -152,10 +156,10 @@ bConstraint *get_active_constraint(Object *ob)
{
ListBase *lb= get_active_constraints(ob);
- if(lb) {
+ if (lb) {
bConstraint *con;
- for(con= lb->first; con; con=con->next)
- if(con->flag & CONSTRAINT_ACTIVE)
+ for (con= lb->first; con; con=con->next)
+ if (con->flag & CONSTRAINT_ACTIVE)
return con;
}
return NULL;
@@ -172,15 +176,15 @@ bConstraintChannel *get_active_constraint_channel(Object *ob)
bPoseChannel *pchan;
pchan = get_active_posechannel(ob);
- if(pchan) {
- for(con= pchan->constraints.first; con; con= con->next)
- if(con->flag & CONSTRAINT_ACTIVE)
+ if (pchan) {
+ for (con= pchan->constraints.first; con; con= con->next)
+ if (con->flag & CONSTRAINT_ACTIVE)
break;
- if(con) {
+ if (con) {
bActionChannel *achan = get_action_channel(ob->action, pchan->name);
- if(achan) {
- for(chan= achan->constraintChannels.first; chan; chan= chan->next)
- if(!strcmp(chan->name, con->name))
+ if (achan) {
+ for (chan= achan->constraintChannels.first; chan; chan= chan->next)
+ if (!strcmp(chan->name, con->name))
break;
return chan;
}
@@ -211,16 +215,26 @@ bConstraintChannel *get_active_constraint_channel(Object *ob)
bConstraint *add_new_constraint(short type)
{
bConstraint *con;
+ bConstraintTypeInfo *cti;
con = MEM_callocN(sizeof(bConstraint), "constraint");
-
+
/* Set up a generic constraint datablock */
con->type = type;
con->flag |= CONSTRAINT_EXPAND;
- con->enforce=1.0F;
+ con->enforce = 1.0F;
+ strcpy(con->name, "Const");
+
/* Load the data for it */
- con->data = new_constraint_data(con->type);
- strcpy (con->name, "Const");
+ cti = constraint_get_typeinfo(con);
+ if (cti) {
+ con->data = MEM_callocN(cti->size, cti->structName);
+
+ /* only constraints that change any settings need this */
+ if (cti->new_data)
+ cti->new_data(con->data);
+ }
+
return con;
}
@@ -234,99 +248,15 @@ void add_constraint_to_object(bConstraint *con, Object *ob)
BLI_addtail(list, con);
con->flag |= CONSTRAINT_ACTIVE;
- for(con= con->prev; con; con= con->prev)
+ for (con= con->prev; con; con= con->prev)
con->flag &= ~CONSTRAINT_ACTIVE;
}
}
-
-char *get_con_subtarget_name(bConstraint *con, Object *target)
-{
- /*
- * If the target for this constraint is target, return a pointer
- * to the name for this constraints subtarget ... NULL otherwise
- */
- switch (con->type) {
-
- case CONSTRAINT_TYPE_ACTION:
- {
- bActionConstraint *data = con->data;
- if (data->tar==target) return data->subtarget;
- }
- break;
- case CONSTRAINT_TYPE_LOCLIKE:
- {
- bLocateLikeConstraint *data = con->data;
- if (data->tar==target) return data->subtarget;
- }
- break;
- case CONSTRAINT_TYPE_ROTLIKE:
- {
- bRotateLikeConstraint *data = con->data;
- if (data->tar==target) return data->subtarget;
- }
- break;
- case CONSTRAINT_TYPE_SIZELIKE:
- {
- bSizeLikeConstraint *data = con->data;
- if (data->tar==target) return data->subtarget;
- }
- break;
- case CONSTRAINT_TYPE_KINEMATIC:
- {
- bKinematicConstraint *data = con->data;
- if (data->tar==target) return data->subtarget;
- }
- break;
- case CONSTRAINT_TYPE_TRACKTO:
- {
- bTrackToConstraint *data = con->data;
- if (data->tar==target) return data->subtarget;
- }
- break;
- case CONSTRAINT_TYPE_MINMAX:
- {
- bMinMaxConstraint *data = con->data;
- if (data->tar==target) return data->subtarget;
- }
- break;
- case CONSTRAINT_TYPE_LOCKTRACK:
- {
- bLockTrackConstraint *data = con->data;
- if (data->tar==target) return data->subtarget;
- }
- break;
- case CONSTRAINT_TYPE_STRETCHTO:
- {
- bStretchToConstraint *data = con->data;
- if (data->tar==target) return data->subtarget;
- }
- break;
- case CONSTRAINT_TYPE_FOLLOWPATH:
- /* wonder if this is relevent, since this constraint
- * cannot have a subtarget - theeth
- */
- {
- /*
- * bFollowPathConstraint *data = con->data;
- */
- return NULL;
- }
- break;
- case CONSTRAINT_TYPE_CLAMPTO:
- {
- /* cannot have subtarget. if followpath is removed from here, remove this too... */
- return NULL;
- }
- break;
- }
-
- return NULL;
-}
-
/* checks validity of object pointers, and NULLs,
- if Bone doesnt exist it sets the CONSTRAINT_DISABLE flag */
-static void test_constraints (Object *owner, const char* substring)
+ * if Bone doesnt exist it sets the CONSTRAINT_DISABLE flag
+ */
+static void test_constraints (Object *owner, const char substring[])
{
bConstraint *curcon;
@@ -338,49 +268,67 @@ static void test_constraints (Object *owner, const char* substring)
/* Check parents */
/* Get the constraint list for this object */
- if (strlen (substring)){
- switch (owner->type){
+ if (strlen (substring)) {
+ switch (owner->type) {
case OB_ARMATURE:
- type = TARGET_BONE;
+ type = CONSTRAINT_OBTYPE_BONE;
break;
default:
- type = TARGET_OBJECT;
+ type = CONSTRAINT_OBTYPE_OBJECT;
break;
}
}
else
- type = TARGET_OBJECT;
+ type = CONSTRAINT_OBTYPE_OBJECT;
- switch (type){
- case TARGET_OBJECT:
+ switch (type) {
+ case CONSTRAINT_OBTYPE_OBJECT:
conlist = &owner->constraints;
break;
- case TARGET_BONE:
+ case CONSTRAINT_OBTYPE_BONE:
{
Bone *bone;
bPoseChannel *chan;
- bone = get_named_bone(((bArmature*)owner->data), substring);
- chan = get_pose_channel (owner->pose, substring);
- if (bone && chan){
+ bone = get_named_bone( ((bArmature *)owner->data ), substring );
+ chan = get_pose_channel(owner->pose, substring);
+ if (bone && chan) {
conlist = &chan->constraints;
}
}
break;
}
- /* Cycle constraints */
- if (conlist){
- for (curcon = conlist->first; curcon; curcon=curcon->next){
+ /* Check all constraints - is constraint valid? */
+ if (conlist) {
+ for (curcon = conlist->first; curcon; curcon=curcon->next) {
curcon->flag &= ~CONSTRAINT_DISABLE;
- switch (curcon->type){
+ switch (curcon->type) {
+ case CONSTRAINT_TYPE_PYTHON:
+ {
+ bPythonConstraint *data = curcon->data;
+
+ /* is there are valid script? */
+ if (!data->text) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ break;
+ }
+ else if (!BPY_is_pyconstraint(data->text)) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ break;
+ }
+
+ /* does the constraint require target input... also validates targets */
+ BPY_pyconstraint_update(owner, curcon);
+ }
+ break;
case CONSTRAINT_TYPE_ACTION:
{
bActionConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
@@ -398,7 +346,7 @@ static void test_constraints (Object *owner, const char* substring)
{
bLocateLikeConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
@@ -416,7 +364,7 @@ static void test_constraints (Object *owner, const char* substring)
{
bMinMaxConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
@@ -434,7 +382,7 @@ static void test_constraints (Object *owner, const char* substring)
{
bRotateLikeConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
@@ -452,7 +400,7 @@ static void test_constraints (Object *owner, const char* substring)
{
bSizeLikeConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
@@ -469,18 +417,26 @@ static void test_constraints (Object *owner, const char* substring)
case CONSTRAINT_TYPE_KINEMATIC:
{
bKinematicConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
- break;
}
-
- if ( (data->tar == owner) &&
+ else if ( (data->tar == owner) &&
(!get_named_bone(get_armature(owner),
data->subtarget))) {
curcon->flag |= CONSTRAINT_DISABLE;
- break;
}
+
+ if (data->poletar && !exist_object(data->poletar)) {
+ data->poletar = NULL;
+ }
+ else if ( (data->poletar == owner) &&
+ (!get_named_bone(get_armature(owner),
+ data->polesubtarget))) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ }
+
}
break;
case CONSTRAINT_TYPE_TRACKTO:
@@ -498,11 +454,11 @@ static void test_constraints (Object *owner, const char* substring)
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
- if (data->reserved2==data->reserved1){
+ if (data->reserved2==data->reserved1) {
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
- if (data->reserved2+3==data->reserved1){
+ if (data->reserved2+3==data->reserved1) {
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
@@ -512,7 +468,7 @@ static void test_constraints (Object *owner, const char* substring)
{
bLockTrackConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
@@ -525,11 +481,11 @@ static void test_constraints (Object *owner, const char* substring)
break;
}
- if (data->lockflag==data->trackflag){
+ if (data->lockflag==data->trackflag) {
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
- if (data->lockflag+3==data->trackflag){
+ if (data->lockflag+3==data->trackflag) {
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
@@ -539,7 +495,7 @@ static void test_constraints (Object *owner, const char* substring)
{
bStretchToConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
@@ -557,21 +513,21 @@ static void test_constraints (Object *owner, const char* substring)
{
bFollowPathConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
- if (data->tar->type != OB_CURVE){
+ if (data->tar->type != OB_CURVE) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
- if (data->upflag==data->trackflag){
+ if (data->upflag==data->trackflag) {
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
- if (data->upflag+3==data->trackflag){
+ if (data->upflag+3==data->trackflag) {
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
@@ -581,13 +537,13 @@ static void test_constraints (Object *owner, const char* substring)
{
bClampToConstraint *data = curcon->data;
- if (!exist_object(data->tar)){
+ if (!exist_object(data->tar)) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
}
- if (data->tar->type != OB_CURVE){
+ if (data->tar->type != OB_CURVE) {
data->tar = NULL;
curcon->flag |= CONSTRAINT_DISABLE;
break;
@@ -600,6 +556,24 @@ static void test_constraints (Object *owner, const char* substring)
}
}
break;
+ case CONSTRAINT_TYPE_TRANSFORM:
+ {
+ bTransformConstraint *data = curcon->data;
+
+ if (!exist_object(data->tar)) {
+ data->tar = NULL;
+ curcon->flag |= CONSTRAINT_DISABLE;
+ break;
+ }
+
+ if ( (data->tar == owner) &&
+ (!get_named_bone(get_armature(owner),
+ data->subtarget))) {
+ curcon->flag |= CONSTRAINT_DISABLE;
+ break;
+ }
+ }
+ break;
}
}
}
@@ -629,6 +603,41 @@ void object_test_constraints (Object *owner)
}
+/* helper function for add_constriant - sets the last target for the active constraint */
+static void set_constraint_nth_target(bConstraint *con, Object *target, char subtarget[], int index)
+{
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
+ int num_targets, i;
+
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+ num_targets= BLI_countlist(&targets);
+
+ if (index < 0) {
+ if (abs(index) < num_targets)
+ index= num_targets - abs(index);
+ else
+ index= num_targets - 1;
+ }
+ else if (index >= num_targets) {
+ index= num_targets - 1;
+ }
+
+ for (ct=targets.first, i=0; ct; ct= ct->next, i++) {
+ if (i == index) {
+ ct->tar= target;
+ strcpy(ct->subtarget, subtarget);
+ break;
+ }
+ }
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 0);
+ }
+}
+
/* context: active object in posemode, active channel, optional selected channel */
void add_constraint(int only_IK)
{
@@ -688,21 +697,21 @@ void add_constraint(int only_IK)
else {
if(pchanact) {
if(pchansel)
- nr= pupmenu("Add Constraint to Active Bone%t|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Track To%x3|Floor%x4|Locked Track%x5|Stretch To%x7|Action%x16");
+ nr= pupmenu("Add Constraint to Active Bone%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|%l|Track To%x3|Floor%x4|Locked Track%x5|Stretch To%x7|%l|Action%x16|Script%x18");
else if(obsel && obsel->type==OB_CURVE)
- nr= pupmenu("Add Constraint to Active Object%t|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Track To%x3|Floor%x4|Locked Track%x5|Follow Path%x6|Clamp To%x17|Stretch To%x7|Action%x16");
+ nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|%l|Track To%x3|Floor%x4|Locked Track%x5|Follow Path%x6|Clamp To%x17|Stretch To%x7|%l|Action%x16|Script%x18");
else if(obsel)
- nr= pupmenu("Add Constraint to Active Object%t|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Track To%x3|Floor%x4|Locked Track%x5|Stretch To%x7|Action%x16");
+ nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|%l|Track To%x3|Floor%x4|Locked Track%x5|Stretch To%x7|%l|Action%x16|Script%x18");
else
- nr= pupmenu("Add Constraint to New Empty Object%t|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Track To%x3|Floor%x4|Locked Track%x5|Stretch To%x7");
+ nr= pupmenu("Add Constraint to New Empty Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|%l|Track To%x3|Floor%x4|Locked Track%x5|Stretch To%x7|%l|Action%x16|Script%x18");
}
else {
if(obsel && obsel->type==OB_CURVE)
- nr= pupmenu("Add Constraint to Active Object%t|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Track To%x3|Floor%x4|Locked Track%x5|Follow Path%x6|Clamp To%x17");
+ nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|%l|Track To%x3|Floor%x4|Locked Track%x5|Follow Path%x6|Clamp To%x17|%l|Action%x16|Script%x18");
else if(obsel)
- nr= pupmenu("Add Constraint to Active Object%t|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Track To%x3|Floor%x4|Locked Track%x5");
+ nr= pupmenu("Add Constraint to Active Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|%l|Track To%x3|Floor%x4|Locked Track%x5|%l|Action%x16|Script%x18");
else
- nr= pupmenu("Add Constraint to New Empty Object%t|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|Track To%x3|Floor%x4|Locked Track%x5");
+ nr= pupmenu("Add Constraint to New Empty Object%t|Child Of%x19|Transformation%x20|%l|Copy Location%x1|Copy Rotation%x2|Copy Scale%x8|%l|Limit Location%x13|Limit Rotation%x14|Limit Scale%x15|%l|Track To%x3|Floor%x4|Locked Track%x5|%l|Action%x16|Script%x18");
}
}
@@ -741,31 +750,65 @@ void add_constraint(int only_IK)
}
else {
- if(nr==1) con = add_new_constraint(CONSTRAINT_TYPE_LOCLIKE);
- else if(nr==2) con = add_new_constraint(CONSTRAINT_TYPE_ROTLIKE);
- else if(nr==3) con = add_new_constraint(CONSTRAINT_TYPE_TRACKTO);
- else if(nr==4) con = add_new_constraint(CONSTRAINT_TYPE_MINMAX);
- else if(nr==5) con = add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK);
- else if(nr==6) {
+ if (nr==1) con = add_new_constraint(CONSTRAINT_TYPE_LOCLIKE);
+ else if (nr==2) con = add_new_constraint(CONSTRAINT_TYPE_ROTLIKE);
+ else if (nr==3) con = add_new_constraint(CONSTRAINT_TYPE_TRACKTO);
+ else if (nr==4) con = add_new_constraint(CONSTRAINT_TYPE_MINMAX);
+ else if (nr==5) con = add_new_constraint(CONSTRAINT_TYPE_LOCKTRACK);
+ else if (nr==6) {
Curve *cu= obsel->data;
cu->flag |= CU_PATH;
con = add_new_constraint(CONSTRAINT_TYPE_FOLLOWPATH);
}
- else if(nr==7) con = add_new_constraint(CONSTRAINT_TYPE_STRETCHTO);
- else if(nr==8) con = add_new_constraint(CONSTRAINT_TYPE_SIZELIKE);
- else if(nr==13) con = add_new_constraint(CONSTRAINT_TYPE_LOCLIMIT);
- else if(nr==14) con = add_new_constraint(CONSTRAINT_TYPE_ROTLIMIT);
- else if(nr==15) con = add_new_constraint(CONSTRAINT_TYPE_SIZELIMIT);
- else if(nr==16) con = add_new_constraint(CONSTRAINT_TYPE_ACTION);
- else if(nr==17) {
+ else if (nr==7) con = add_new_constraint(CONSTRAINT_TYPE_STRETCHTO);
+ else if (nr==8) con = add_new_constraint(CONSTRAINT_TYPE_SIZELIKE);
+ else if (nr==13) con = add_new_constraint(CONSTRAINT_TYPE_LOCLIMIT);
+ else if (nr==14) con = add_new_constraint(CONSTRAINT_TYPE_ROTLIMIT);
+ else if (nr==15) con = add_new_constraint(CONSTRAINT_TYPE_SIZELIMIT);
+ else if (nr==16) {
+ /* TODO: add a popup-menu to display list of available actions to use (like for pyconstraints) */
+ con = add_new_constraint(CONSTRAINT_TYPE_ACTION);
+ }
+ else if (nr==17) {
Curve *cu= obsel->data;
cu->flag |= CU_PATH;
con = add_new_constraint(CONSTRAINT_TYPE_CLAMPTO);
}
+ else if (nr==18) {
+ char *menustr;
+ int scriptint= 0;
+
+ /* popup a list of usable scripts */
+ menustr = buildmenu_pyconstraints(NULL, &scriptint);
+ scriptint = pupmenu(menustr);
+ MEM_freeN(menustr);
+
+ /* only add constraint if a script was chosen */
+ if (scriptint) {
+ /* add constraint */
+ con = add_new_constraint(CONSTRAINT_TYPE_PYTHON);
+ validate_pyconstraint_cb(con->data, &scriptint);
+
+ /* make sure target allowance is set correctly */
+ BPY_pyconstraint_update(ob, con);
+ }
+ }
+ else if (nr==19) {
+ con = add_new_constraint(CONSTRAINT_TYPE_CHILDOF);
+
+ /* if this constraint is being added to a posechannel, make sure
+ * the constraint gets evaluated in pose-space
+ */
+ if (pchanact) {
+ con->ownspace = CONSTRAINT_SPACE_POSE;
+ con->flag |= CONSTRAINT_SPACEONCE;
+ }
+ }
+ else if (nr==20) con = add_new_constraint(CONSTRAINT_TYPE_TRANSFORM);
- if(con==NULL) return; /* paranoia */
+ if (con==NULL) return; /* paranoia */
- if(pchanact) {
+ if (pchanact) {
BLI_addtail(&pchanact->constraints, con);
unique_constraint_name(con, &pchanact->constraints);
pchanact->constflag |= PCHAN_HAS_CONST; /* for draw */
@@ -777,13 +820,13 @@ void add_constraint(int only_IK)
}
/* set the target */
- if(pchansel) {
- set_constraint_target(con, ob, pchansel->name);
+ if (pchansel) {
+ set_constraint_nth_target(con, ob, pchansel->name, 0);
}
else if(obsel) {
- set_constraint_target(con, obsel, NULL);
+ set_constraint_nth_target(con, obsel, "", 0);
}
- else if(ELEM4(nr, 11, 13, 14, 15)==0) { /* add new empty as target */
+ else if (ELEM4(nr, 11, 13, 14, 15)==0) { /* add new empty as target */
Base *base= BASACT, *newbase;
Object *obt;
@@ -794,7 +837,7 @@ void add_constraint(int only_IK)
obt->lay= newbase->lay;
/* transform cent to global coords for loc */
- if(pchanact) {
+ if (pchanact) {
if(only_IK)
VecMat4MulVecfl(obt->loc, ob->obmat, pchanact->pose_tail);
else
@@ -803,14 +846,13 @@ void add_constraint(int only_IK)
else
VECCOPY(obt->loc, ob->obmat[3]);
- set_constraint_target(con, obt, NULL);
+ set_constraint_nth_target(con, obt, "", 0);
/* restore, add_object sets active */
BASACT= base;
base->flag |= SELECT;
}
-
-
+
/* active flag */
con->flag |= CONSTRAINT_ACTIVE;
for(con= con->prev; con; con= con->prev)
@@ -818,7 +860,7 @@ void add_constraint(int only_IK)
DAG_scene_sort(G.scene); // sort order of objects
- if(pchanact) {
+ if (pchanact) {
ob->pose->flag |= POSE_RECALC; // sort pose channels
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA); // and all its relations
}
@@ -829,7 +871,7 @@ void add_constraint(int only_IK)
allqueue (REDRAWBUTSOBJECT, 0);
allqueue (REDRAWOOPS, 0);
- if(only_IK)
+ if (only_IK)
BIF_undo_push("Add IK Constraint");
else
BIF_undo_push("Add Constraint");
@@ -921,3 +963,141 @@ void rename_constraint(Object *ob, bConstraint *con, char *oldname)
}
+/* ********************** CONSTRAINT-SPECIFIC STUFF ********************* */
+/* ------------- PyConstraints ------------------ */
+
+/* this callback sets the text-file to be used for selected menu item */
+void validate_pyconstraint_cb(void *arg1, void *arg2)
+{
+ bPythonConstraint *data = arg1;
+ Text *text;
+ int index = *((int *)arg2);
+ int i;
+
+ /* innovative use of a for...loop to search */
+ for (text=G.main->text.first, i=1; text && index!=i; i++, text=text->id.next);
+ data->text = text;
+}
+
+/* this returns a string for the list of usable pyconstraint script names */
+char *buildmenu_pyconstraints(Text *con_text, int *pyconindex)
+{
+ Text *text;
+ char *menustr = MEM_callocN(128, "menustr pyconstraints");
+ char *name, stmp[128];
+ int buf = 128;
+ int used = strlen("Scripts: %t") + 1;
+ int i;
+
+ sprintf(menustr, "%s", "Scripts: %t");
+
+ for (text=G.main->text.first, i=1; text; i++, text=text->id.next) {
+ /* this is important to ensure that right script is shown as active */
+ if (text == con_text) *pyconindex = i;
+
+ /* menu entry is length of name + 3(len(|%X)) + 6 characters for the int.*/
+ if (BPY_is_pyconstraint(text)) {
+ name= text->id.name;
+ if (strlen(name)+used+10 >= buf) {
+ char *newbuf = MEM_callocN(buf+128, "menustr pyconstraints 2");
+ memcpy(newbuf, menustr, used);
+ MEM_freeN(menustr);
+ menustr = newbuf;
+ buf += 128;
+ }
+ sprintf(stmp, "|%s%%x%d", name, i);
+ strcat(menustr, stmp);
+ used += strlen(name)+10;
+ }
+ }
+
+ return menustr;
+}
+
+/* this callback gets called when the 'refresh' button of a pyconstraint gets pressed */
+void update_pyconstraint_cb(void *arg1, void *arg2)
+{
+ Object *owner= (Object *)arg1;
+ bConstraint *con= (bConstraint *)arg2;
+
+ if (owner && con)
+ BPY_pyconstraint_update(owner, con);
+}
+
+/* ------------- Child-Of Constraint ------------------ */
+
+/* ChildOf Constraint - set inverse callback */
+void childof_const_setinv (void *conv, void *unused)
+{
+ bChildOfConstraint *data= (bChildOfConstraint *)conv;
+ Object *ob= OBACT;
+ bPoseChannel *pchan= NULL;
+
+ /* try to find a pose channel */
+ if (ob && ob->pose)
+ pchan= get_active_posechannel(ob);
+
+ /* calculate/set inverse matrix */
+ if (pchan) {
+ bConstraintOb *cob;
+ float ctime= bsystem_time(ob, (float)G.scene->r.cfra, 0.0); /* not accurate... */
+ float pmat[4][4], chmat[4][4], cimat[4][4];
+ float vec0[3]={0,0,0}, vec1[3]={1,1,1};
+
+ /* make copies of pchan's original matrices (to be restored later) */
+ Mat4CpyMat4(pmat, pchan->pose_mat);
+ Mat4CpyMat4(chmat, pchan->chan_mat);
+ Mat4CpyMat4(cimat, pchan->constinv);
+
+
+ /* clear pchan's transform (for constraint solving) */
+ LocEulSizeToMat4(pchan->chan_mat, vec0, vec0, vec1);
+ Mat4MulMat4(pchan->pose_mat, pmat, cimat);
+ Mat4One(pchan->constinv);
+ Mat4One(data->invmat);
+
+
+ /* do constraint solving on pose-matrix containing no transforms
+ * N.B. code is copied from armature.c (where_is_pose_bone)
+ */
+ cob= constraints_make_evalob(ob, pchan, CONSTRAINT_OBTYPE_BONE);
+ solve_constraints(&pchan->constraints, cob, ctime);
+ constraints_clear_evalob(cob);
+
+
+ /* parent-inverse matrix for this constraint is given by taking the
+ * local-space (i.e. without any standard parents + restpose) pose_matrix
+ * (that was calulated with no transforms applied), and inverting it.
+ */
+ Mat4CpyMat4(pchan->constinv, pchan->pose_mat);
+
+ constraint_mat_convertspace(ob, pchan, pchan->constinv,
+ CONSTRAINT_SPACE_POSE, CONSTRAINT_SPACE_LOCAL);
+
+ Mat4Invert(data->invmat, pchan->constinv);
+
+
+ /* restore original matrices of pchan */
+ Mat4CpyMat4(pchan->pose_mat, pmat);
+ Mat4CpyMat4(pchan->chan_mat, chmat);
+ Mat4CpyMat4(pchan->constinv, cimat);
+ }
+ else if (ob) {
+ /* use what_does_parent to find inverse - just like for normal parenting.
+ * NOTE: what_does_parent uses a static workob defined in object.c
+ */
+ what_does_parent(ob);
+ Mat4Invert(data->invmat, workob.obmat);
+ }
+ else
+ Mat4One(data->invmat);
+}
+
+/* ChildOf Constraint - clear inverse callback */
+void childof_const_clearinv (void *conv, void *unused)
+{
+ bChildOfConstraint *data= (bChildOfConstraint *)conv;
+
+ /* simply clear the matrix */
+ Mat4One(data->invmat);
+}
diff --git a/source/blender/src/editcurve.c b/source/blender/src/editcurve.c
index 31083d860fc..358e6332d6d 100644
--- a/source/blender/src/editcurve.c
+++ b/source/blender/src/editcurve.c
@@ -1081,6 +1081,219 @@ void switchdirection_knots(float *base, int tot)
MEM_freeN(tempf);
}
+void setweightNurb(void)
+{
+ static float weight= 1.0f;
+ extern ListBase editNurb;
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ int a;
+
+ if(fbutton(&weight, 0.0f, 1.0f, 10, 10, "Set Weight")) {
+ for(nu= editNurb.first; nu; nu= nu->next) {
+ if(nu->bezt) {
+ for(bezt=nu->bezt, a=0; a<nu->pntsu; a++, bezt++) {
+ if(bezt->f2 & SELECT)
+ bezt->weight= weight;
+ }
+ }
+ else if(nu->bp) {
+ for(bp=nu->bp, a=0; a<nu->pntsu*nu->pntsv; a++, bp++) {
+ if(bp->f1 & SELECT)
+ bp->weight= weight;
+ }
+ }
+ }
+ }
+ BIF_undo_push("Set Curve Weight");
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+void setradiusNurb( void )
+{
+ static float radius= 1.0f;
+ extern ListBase editNurb;
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ int a;
+
+ if(fbutton(&radius, 0.0001f, 10.0f, 10, 10, "Set Radius")) {
+ for(nu= editNurb.first; nu; nu= nu->next) {
+ if(nu->bezt) {
+ for(bezt=nu->bezt, a=0; a<nu->pntsu; a++, bezt++) {
+ if(bezt->f2 & SELECT)
+ bezt->radius= radius;
+ }
+ }
+ else if(nu->bp) {
+ for(bp=nu->bp, a=0; a<nu->pntsu*nu->pntsv; a++, bp++) {
+ if(bp->f1 & SELECT)
+ bp->radius= radius;
+ }
+ }
+ }
+ }
+ BIF_undo_push("Set Curve Radius");
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSALL, 0);
+ allqueue(REDRAWINFO, 1); /* 1, because header->win==0! */
+}
+
+
+/* TODO, make smoothing distance based */
+void smoothradiusNurb( void )
+{
+ extern ListBase editNurb;
+ Nurb *nu;
+ BezTriple *bezt;
+ BPoint *bp;
+ int a;
+
+ /* use for smoothing */
+ int last_sel;
+ int start_sel, end_sel; /* selection indicies, inclusive */
+ float start_rad, end_rad, fac, range;
+
+ for(nu= editNurb.first; nu; nu= nu->next) {
+ if(nu->bezt) {
+
+ for (last_sel=0; last_sel < nu->pntsu; last_sel++) {
+ /* loop over selection segments of a curve, smooth each */
+
+ /* Start BezTriple code, this is duplicated below for points, make sure these functions stay in sync */
+ start_sel = end_sel = -1;
+ for(bezt=nu->bezt+last_sel, a=last_sel; a<nu->pntsu; a++, bezt++) {
+ if(bezt->f2 & SELECT) {
+ start_sel = a;
+ break;
+ }
+ }
+ /* incase there are no other selected verts */
+ end_sel = start_sel;
+ for(bezt=nu->bezt+(start_sel+1), a=start_sel+1; a<nu->pntsu; a++, bezt++) {
+ if((bezt->f2 & SELECT)==0) {
+ break;
+ }
+ end_sel = a;
+ }
+
+ if (start_sel == -1) {
+ last_sel = nu->pntsu; /* next... */
+ } else {
+ last_sel = end_sel; /* before we modify it */
+
+ /* now blend between start and end sel */
+ start_rad = end_rad = -1.0;
+
+ if (start_sel == end_sel) {
+ /* simple, only 1 point selected */
+ 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;
+ } else {
+ /* if endpoints selected, then use them */
+ if (start_sel==0) {
+ start_rad = (nu->bezt+start_sel)->radius;
+ start_sel++; /* we dont want to edit the selected endpoint */
+ } else {
+ start_rad = (nu->bezt+start_sel-1)->radius;
+ }
+ if (end_sel==nu->pntsu-1) {
+ end_rad = (nu->bezt+end_sel)->radius;
+ end_sel--; /* we dont want to edit the selected endpoint */
+ } else {
+ end_rad = (nu->bezt+end_sel+1)->radius;
+ }
+
+ /* Now Blend between the points */
+ 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;
+ }
+ }
+ }
+ }
+ } else if (nu->bp) {
+ /* Same as above, keep these the same! */
+ for (last_sel=0; last_sel < nu->pntsu; last_sel++) {
+ /* loop over selection segments of a curve, smooth each */
+
+ /* Start BezTriple code, this is duplicated below for points, make sure these functions stay in sync */
+ start_sel = end_sel = -1;
+ for(bp=nu->bp+last_sel, a=last_sel; a<nu->pntsu; a++, bp++) {
+ if(bp->f1 & SELECT) {
+ start_sel = a;
+ break;
+ }
+ }
+ /* incase there are no other selected verts */
+ end_sel = start_sel;
+ for(bp=nu->bp+(start_sel+1), a=start_sel+1; a<nu->pntsu; a++, bp++) {
+ if((bp->f1 & SELECT)==0) {
+ break;
+ }
+ end_sel = a;
+ }
+
+ if (start_sel == -1) {
+ last_sel = nu->pntsu; /* next... */
+ } else {
+ last_sel = end_sel; /* before we modify it */
+
+ /* now blend between start and end sel */
+ start_rad = end_rad = -1.0;
+
+ if (start_sel == end_sel) {
+ /* simple, only 1 point selected */
+ 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;
+ } else {
+ /* if endpoints selected, then use them */
+ if (start_sel==0) {
+ start_rad = (nu->bp+start_sel)->radius;
+ start_sel++; /* we dont want to edit the selected endpoint */
+ } else {
+ start_rad = (nu->bp+start_sel-1)->radius;
+ }
+ if (end_sel==nu->pntsu-1) {
+ end_rad = (nu->bp+end_sel)->radius;
+ end_sel--; /* we dont want to edit the selected endpoint */
+ } else {
+ end_rad = (nu->bp+end_sel+1)->radius;
+ }
+
+ /* Now Blend between the points */
+ 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;
+ }
+ }
+ }
+ }
+ }
+ }
+ BIF_undo_push("Smooth Curve Radius");
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSALL, 0);
+ allqueue(REDRAWINFO, 1); /* 1, because header->win==0! */
+}
+
+
+
/* **************** EDIT ************************ */
/* next == 1 -> select next */
@@ -2514,6 +2727,10 @@ void mouse_nurb()
}
+/* from what I can gather, the mode==0 magic number spins and bridges the nurbs based on the
+ * orientation of the global 3d view (yuck yuck!) mode==1 does the same, but doesn't bridge up
+ * up the new geometry, mode==2 now does the same as 0, but aligned to world axes, not the view.
+*/
static void spin_nurb(float *dvec, short mode)
{
Nurb *nu;
@@ -2525,7 +2742,8 @@ static void spin_nurb(float *dvec, short mode)
if(G.vd==0 || G.obedit==0 || G.obedit->type!=OB_SURF) return;
if( (G.vd->lay & G.obedit->lay)==0 ) return;
- Mat3CpyMat4(persmat, G.vd->viewmat);
+ if (mode != 2) Mat3CpyMat4(persmat, G.vd->viewmat);
+ else Mat3One(persmat);
Mat3Inv(persinv, persmat);
/* imat and center and size */
@@ -2537,7 +2755,7 @@ static void spin_nurb(float *dvec, short mode)
VecSubf(cent, cent, G.obedit->obmat[3]);
Mat3MulVecfl(imat,cent);
- if(dvec) {
+ if(dvec || mode==2) {
n[0]=n[1]= 0.0;
n[2]= 1.0;
} else {
@@ -2578,7 +2796,7 @@ static void spin_nurb(float *dvec, short mode)
ok= 1;
for(a=0;a<7;a++) {
- if(mode==0) ok= extrudeflagNurb(1);
+ if(mode==0 || mode==2) ok= extrudeflagNurb(1);
else adduplicateflagNurb(1);
if(ok==0) {
error("Can't spin");
@@ -2586,7 +2804,7 @@ static void spin_nurb(float *dvec, short mode)
}
rotateflagNurb(1,cent,rotmat);
- if(mode==0) {
+ if(mode==0 || mode==2) {
if( (a & 1)==0 ) {
rotateflagNurb(1,cent,scalemat1);
weightflagNurb(1, 0.25*sqrt(2.0), 1);
@@ -2702,6 +2920,7 @@ void addvert_Nurb(int mode)
newbp->f1= 1;
MEM_freeN(nu->bp);
nu->bp= newbp;
+ bp= newbp + 1;
}
else if(bp== (nu->bp+nu->pntsu-1)) { /* last */
bp->f1= 0;
@@ -2713,15 +2932,16 @@ void addvert_Nurb(int mode)
nu->bp= newbp;
newbp+= nu->pntsu;
newbp->f1= 1;
+ bp= newbp - 1;
}
else bp= 0;
if(bp) {
nu->pntsu++;
-
+
if(nu->resolu<3) nu->resolu++;
makeknots(nu, 1, nu->flagu>>1);
-
+
if(mode=='e') {
VECCOPY(newbp->vec, bp->vec);
}
@@ -3804,7 +4024,8 @@ Nurb *addNurbprim(int type, int stype, int newname)
cent[2]-= G.obedit->obmat[3][2];
if (G.vd) {
- Mat3CpyMat4(imat, G.vd->viewmat);
+ if ( !(newname) || U.flag & USER_ADD_VIEWALIGNED) Mat3CpyMat4(imat, G.vd->viewmat);
+ else Mat3One(imat);
Mat3MulVecfl(imat, cent);
Mat3MulMat3(cmat, imat, mat);
Mat3Inv(imat, cmat);
@@ -4059,7 +4280,7 @@ Nurb *addNurbprim(int type, int stype, int newname)
rename_id((ID *)G.obedit->data, "SurfTube");
}
- nu= addNurbprim(4, 1, 0); /* circle */
+ nu= addNurbprim(4, 1, newname); /* circle */
nu->resolu= 32;
nu->flag= CU_SMOOTH;
BLI_addtail(&editNurb, nu); /* temporal for extrude and translate */
@@ -4114,7 +4335,8 @@ Nurb *addNurbprim(int type, int stype, int newname)
makeknots(nu, 1, nu->flagu>>1);
BLI_addtail(&editNurb, nu); /* temporal for spin */
- spin_nurb(0, 0);
+ if(newname) spin_nurb(0, 2);
+ else spin_nurb(0, 0);
makeknots(nu, 2, nu->flagv>>1);
@@ -4135,13 +4357,14 @@ Nurb *addNurbprim(int type, int stype, int newname)
}
xzproj= 1;
- nu= addNurbprim(4, 1, 0); /* circle */
+ nu= addNurbprim(4, 1, newname); /* circle */
xzproj= 0;
nu->resolu= 24;
nu->resolv= 32;
nu->flag= CU_SMOOTH;
BLI_addtail(&editNurb, nu); /* temporal for extrude and translate */
- spin_nurb(0, 0);
+ if(newname) spin_nurb(0, 2);
+ else spin_nurb(0, 0);
BLI_remlink(&editNurb, nu);
@@ -4254,11 +4477,17 @@ void add_primitiveCurve(int stype)
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
countall();
- allqueue(REDRAWALL, 0);
/* if a new object was created, it stores it in Curve, for reload original data and undo */
- if(newname) load_editNurb();
- BIF_undo_push("Add primitive");
+ if ( !(newname) || U.flag & USER_ADD_EDITMODE) {
+ if(newname) load_editNurb();
+ } else {
+ exit_editmode(2);
+ }
+
+ allqueue(REDRAWALL, 0);
+
+ BIF_undo_push("Add Curve");
}
void add_primitiveNurb(int type)
@@ -4289,11 +4518,16 @@ void add_primitiveNurb(int type)
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
countall();
- allqueue(REDRAWALL, 0);
-
+
/* if a new object was created, it stores it in Curve, for reload original data and undo */
- if(newname) load_editNurb();
- else BIF_undo_push("Add primitive");
+ if ( !(newname) || U.flag & USER_ADD_EDITMODE) {
+ if(newname) load_editNurb();
+ } else {
+ exit_editmode(2);
+ }
+ allqueue(REDRAWALL, 0);
+
+ BIF_undo_push("Add Surface");
}
diff --git a/source/blender/src/editdeform.c b/source/blender/src/editdeform.c
index 7a086ed5be3..6d0c34f2bf8 100644
--- a/source/blender/src/editdeform.c
+++ b/source/blender/src/editdeform.c
@@ -334,11 +334,13 @@ void del_defgroup (Object *ob)
MDeformVert *dvert= editLatt->dvert;
int a, tot;
- tot= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- for(a=0, bp= editLatt->def; a<tot; a++, bp++, dvert++) {
- for (i=0; i<dvert->totweight; i++){
- if (dvert->dw[i].def_nr > (ob->actdef-1))
- dvert->dw[i].def_nr--;
+ if (dvert) {
+ tot= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
+ for(a=0, bp= editLatt->def; a<tot; a++, bp++, dvert++) {
+ for (i=0; i<dvert->totweight; i++){
+ if (dvert->dw[i].def_nr > (ob->actdef-1))
+ dvert->dw[i].def_nr--;
+ }
}
}
}
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c
index 21ccac16da9..be3d9429d31 100644
--- a/source/blender/src/editface.c
+++ b/source/blender/src/editface.c
@@ -40,6 +40,7 @@
#include "BLI_arithb.h"
#include "BLI_heap.h"
#include "BLI_edgehash.h"
+#include "BLI_editVert.h"
#include "MTC_matrixops.h"
@@ -65,12 +66,14 @@
#include "BKE_object.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
+#include "BKE_customdata.h"
#include "BSE_view.h"
#include "BSE_edit.h"
#include "BSE_drawview.h" /* for backdrawview3d */
#include "BIF_editsima.h"
+#include "BIF_editmesh.h"
#include "BIF_interface.h"
#include "BIF_mywindow.h"
#include "BIF_toolbox.h"
@@ -124,7 +127,7 @@
/* returns 0 if not found, otherwise 1 */
int facesel_face_pick(Mesh *me, short *mval, unsigned int *index, short rect)
{
- if (!me || !me->mtface || me->totface==0)
+ if (!me || me->totface==0)
return 0;
if (G.vd->flag & V3D_NEEDBACKBUFDRAW) {
@@ -175,27 +178,24 @@ static int facesel_edge_pick(Mesh *me, short *mval, unsigned int *index)
return 1;
}
-static void uv_calc_center_vector(float *result, Object *ob, Mesh *me)
+/* only operates on the edit object - this is all thats needed at the moment */
+static void uv_calc_center_vector(float *result, Object *ob, EditMesh *em)
{
float min[3], max[3], *cursx;
- int a;
- MTFace *tface;
- MFace *mface;
-
+
+ EditFace *efa;
switch (G.vd->around)
{
case V3D_CENTER: /* bounding box center */
min[0]= min[1]= min[2]= 1e20f;
max[0]= max[1]= max[2]= -1e20f;
- tface= me->mtface;
- mface= me->mface;
- for(a=0; a<me->totface; a++, mface++, tface++) {
- if(mface->flag & ME_FACE_SEL) {
- DO_MINMAX((me->mvert+mface->v1)->co, min, max);
- DO_MINMAX((me->mvert+mface->v2)->co, min, max);
- DO_MINMAX((me->mvert+mface->v3)->co, min, max);
- if(mface->v4) DO_MINMAX((me->mvert+mface->v4)->co, min, max);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->f & SELECT) {
+ DO_MINMAX(efa->v1->co, min, max);
+ DO_MINMAX(efa->v2->co, min, max);
+ DO_MINMAX(efa->v3->co, min, max);
+ if(efa->v4) DO_MINMAX(efa->v4->co, min, max);
}
}
VecMidf(result, min, max);
@@ -340,27 +340,42 @@ static void uv_calc_shift_project(float *target, float *shift, float rotmat[][4]
void calculate_uv_map(unsigned short mapmode)
{
- Mesh *me;
MTFace *tface;
- MFace *mface;
Object *ob;
float dx, dy, rotatematrix[4][4], radius= 1.0, min[3], cent[3], max[3];
float fac= 1.0, upangledeg= 0.0, sideangledeg= 90.0;
- int i, b, mi, a, n;
+ int i, b, mi, n;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+
if(G.scene->toolsettings->uvcalc_mapdir==1) {
upangledeg= 90.0;
sideangledeg= 0.0;
- }
- else {
+ } else {
upangledeg= 0.0;
if(G.scene->toolsettings->uvcalc_mapalign==1) sideangledeg= 0.0;
else sideangledeg= 90.0;
}
-
- me= get_mesh(ob=OBACT);
- if(me==0 || me->mtface==0) return;
- if(me->totface==0) return;
+
+ /* add uvs if there not here */
+ if (!EM_texFaceCheck()) {
+ if (em && em->faces.first)
+ EM_add_data_layer(&em->fdata, CD_MTFACE);
+
+ if (!EM_texFaceCheck())
+ return;
+
+ /* select new UV's */
+ if ((G.sima && G.sima->flag & SI_SYNC_UVSEL)==0) {
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ MTFace *tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ simaFaceSel_Set(efa, tf);
+ }
+ }
+ }
+
+ ob=OBACT;
switch(mapmode) {
case B_UVAUTO_BOUNDS:
@@ -369,28 +384,26 @@ void calculate_uv_map(unsigned short mapmode)
cent[0] = cent[1] = cent[2] = 0.0;
uv_calc_map_matrix(rotatematrix, ob, upangledeg, sideangledeg, 1.0f);
-
- tface= me->mtface;
- mface= me->mface;
- for(a=0; a<me->totface; a++, mface++, tface++) {
- if(mface->flag & ME_FACE_SEL) {
- uv_calc_shift_project(tface->uv[0],cent,rotatematrix,3,(me->mvert+mface->v1)->co,min,max);
- uv_calc_shift_project(tface->uv[1],cent,rotatematrix,3,(me->mvert+mface->v2)->co,min,max);
- uv_calc_shift_project(tface->uv[2],cent,rotatematrix,3,(me->mvert+mface->v3)->co,min,max);
- if(mface->v4)
- uv_calc_shift_project(tface->uv[3],cent,rotatematrix,3,(me->mvert+mface->v4)->co,min,max);
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->f & SELECT) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ uv_calc_shift_project(tface->uv[0],cent,rotatematrix,3, efa->v1->co, min,max);
+ uv_calc_shift_project(tface->uv[1],cent,rotatematrix,3, efa->v2->co, min,max);
+ uv_calc_shift_project(tface->uv[2],cent,rotatematrix,3, efa->v3->co,min,max);
+ if(efa->v4)
+ uv_calc_shift_project(tface->uv[3],cent,rotatematrix,3, efa->v4->co,min,max);
}
}
- /* rescale UV to be in 0..1,1/2,1/4,1/8 */
+ /* rescale UV to be in 1/1 */
dx= (max[0]-min[0]);
dy= (max[1]-min[1]);
- tface= me->mtface;
- mface= me->mface;
- for(a=0; a<me->totface; a++, mface++, tface++) {
- if(mface->flag & ME_FACE_SEL) {
- if(mface->v4) b= 3; else b= 2;
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->f & SELECT) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if(efa->v4) b= 3; else b= 2;
for(; b>=0; b--) {
tface->uv[b][0]= ((tface->uv[b][0]-min[0])*fac)/dx;
tface->uv[b][1]= 1.0-fac+((tface->uv[b][1]-min[1])/* *fac */)/dy;
@@ -402,31 +415,30 @@ void calculate_uv_map(unsigned short mapmode)
case B_UVAUTO_WINDOW:
cent[0] = cent[1] = cent[2] = 0.0;
Mat4CpyMat4(rotatematrix,ob->obmat);
-
- tface= me->mtface;
- mface= me->mface;
- for(a=0; a<me->totface; a++, mface++, tface++) {
- if(mface->flag & ME_FACE_SEL) {
- uv_calc_shift_project(tface->uv[0],cent,rotatematrix,4,(me->mvert+mface->v1)->co,NULL,NULL);
- uv_calc_shift_project(tface->uv[1],cent,rotatematrix,4,(me->mvert+mface->v2)->co,NULL,NULL);
- uv_calc_shift_project(tface->uv[2],cent,rotatematrix,4,(me->mvert+mface->v3)->co,NULL,NULL);
- if(mface->v4)
- uv_calc_shift_project(tface->uv[3],cent,rotatematrix,4,(me->mvert+mface->v4)->co,NULL,NULL);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->f & SELECT) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ uv_calc_shift_project(tface->uv[0],cent,rotatematrix,4, efa->v1->co, NULL,NULL);
+ uv_calc_shift_project(tface->uv[1],cent,rotatematrix,4, efa->v2->co, NULL,NULL);
+ uv_calc_shift_project(tface->uv[2],cent,rotatematrix,4, efa->v3->co, NULL,NULL);
+ if(efa->v4)
+ uv_calc_shift_project(tface->uv[3],cent,rotatematrix,4, efa->v4->co, NULL,NULL);
}
}
break;
case B_UVAUTO_RESET:
- tface= me->mtface;
- mface= me->mface;
- for(a=0; a<me->totface; a++, tface++, mface++)
- if(mface->flag & ME_FACE_SEL)
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->f & SELECT) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
default_uv(tface->uv, 1.0);
+ }
+ }
break;
case B_UVAUTO_CYLINDER:
case B_UVAUTO_SPHERE:
- uv_calc_center_vector(cent, ob, me);
+ uv_calc_center_vector(cent, ob, em);
if(mapmode==B_UVAUTO_CYLINDER) radius = G.scene->toolsettings->uvcalc_radius;
@@ -435,17 +447,15 @@ void calculate_uv_map(unsigned short mapmode)
Mat4One(rotatematrix);
else
uv_calc_map_matrix(rotatematrix,ob,upangledeg,sideangledeg,radius);
-
- tface= me->mtface;
- mface= me->mface;
- for(a=0; a<me->totface; a++, mface++, tface++) {
- if(mface->flag & ME_FACE_SEL) {
- uv_calc_shift_project(tface->uv[0],cent,rotatematrix,mapmode,(me->mvert+mface->v1)->co,NULL,NULL);
- uv_calc_shift_project(tface->uv[1],cent,rotatematrix,mapmode,(me->mvert+mface->v2)->co,NULL,NULL);
- uv_calc_shift_project(tface->uv[2],cent,rotatematrix,mapmode,(me->mvert+mface->v3)->co,NULL,NULL);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->f & SELECT) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ uv_calc_shift_project(tface->uv[0],cent,rotatematrix,mapmode, efa->v1->co, NULL,NULL);
+ uv_calc_shift_project(tface->uv[1],cent,rotatematrix,mapmode, efa->v2->co, NULL,NULL);
+ uv_calc_shift_project(tface->uv[2],cent,rotatematrix,mapmode, efa->v3->co, NULL,NULL);
n = 3;
- if(mface->v4) {
- uv_calc_shift_project(tface->uv[3],cent,rotatematrix,mapmode,(me->mvert+mface->v4)->co,NULL,NULL);
+ if(efa->v4) {
+ uv_calc_shift_project(tface->uv[3],cent,rotatematrix,mapmode, efa->v4->co, NULL,NULL);
n=4;
}
@@ -471,15 +481,14 @@ void calculate_uv_map(unsigned short mapmode)
float no[3];
short cox, coy;
float *loc= ob->obmat[3];
- MVert *mv= me->mvert;
+ /*MVert *mv= me->mvert;*/
float cubesize = G.scene->toolsettings->uvcalc_cubesize;
- tface= me->mtface;
- mface= me->mface;
- for(a=0; a<me->totface; a++, mface++, tface++) {
- if(mface->flag & ME_FACE_SEL) {
- CalcNormFloat((mv+mface->v1)->co, (mv+mface->v2)->co, (mv+mface->v3)->co, no);
-
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->f & SELECT) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ CalcNormFloat(efa->v1->co, efa->v2->co, efa->v3->co, no);
+
no[0]= fabs(no[0]);
no[1]= fabs(no[1]);
no[2]= fabs(no[2]);
@@ -489,43 +498,42 @@ void calculate_uv_map(unsigned short mapmode)
else if(no[1]>=no[0] && no[1]>=no[2]) coy= 2;
else { cox= 1; coy= 2; }
- tface->uv[0][0]= 0.5+0.5*cubesize*(loc[cox] + (mv+mface->v1)->co[cox]);
- tface->uv[0][1]= 0.5+0.5*cubesize*(loc[coy] + (mv+mface->v1)->co[coy]);
+ tface->uv[0][0]= 0.5+0.5*cubesize*(loc[cox] + efa->v1->co[cox]);
+ tface->uv[0][1]= 0.5+0.5*cubesize*(loc[coy] + efa->v1->co[coy]);
dx = floor(tface->uv[0][0]);
dy = floor(tface->uv[0][1]);
tface->uv[0][0] -= dx;
tface->uv[0][1] -= dy;
- tface->uv[1][0]= 0.5+0.5*cubesize*(loc[cox] + (mv+mface->v2)->co[cox]);
- tface->uv[1][1]= 0.5+0.5*cubesize*(loc[coy] + (mv+mface->v2)->co[coy]);
+ tface->uv[1][0]= 0.5+0.5*cubesize*(loc[cox] + efa->v2->co[cox]);
+ tface->uv[1][1]= 0.5+0.5*cubesize*(loc[coy] + efa->v2->co[coy]);
tface->uv[1][0] -= dx;
tface->uv[1][1] -= dy;
- tface->uv[2][0]= 0.5+0.5*cubesize*(loc[cox] + (mv+mface->v3)->co[cox]);
- tface->uv[2][1]= 0.5+0.5*cubesize*(loc[coy] + (mv+mface->v3)->co[coy]);
+ tface->uv[2][0]= 0.5+0.5*cubesize*(loc[cox] + efa->v3->co[cox]);
+ tface->uv[2][1]= 0.5+0.5*cubesize*(loc[coy] + efa->v3->co[coy]);
tface->uv[2][0] -= dx;
tface->uv[2][1] -= dy;
- if(mface->v4) {
- tface->uv[3][0]= 0.5+0.5*cubesize*(loc[cox] + (mv+mface->v4)->co[cox]);
- tface->uv[3][1]= 0.5+0.5*cubesize*(loc[coy] + (mv+mface->v4)->co[coy]);
+ if(efa->v4) {
+ tface->uv[3][0]= 0.5+0.5*cubesize*(loc[cox] + efa->v4->co[cox]);
+ tface->uv[3][1]= 0.5+0.5*cubesize*(loc[coy] + efa->v4->co[coy]);
tface->uv[3][0] -= dx;
tface->uv[3][1] -= dy;
}
}
}
+ break;
}
- break;
default:
return;
} /* end switch mapmode */
/* clipping and wrapping */
if(G.sima && G.sima->flag & SI_CLIP_UV) {
- tface= me->mtface;
- mface= me->mface;
- for(a=0; a<me->totface; a++, mface++, tface++) {
- if(!(mface->flag & ME_FACE_SEL)) continue;
-
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (!(efa->f & SELECT)) continue;
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+
dx= dy= 0;
- if(mface->v4) b= 3; else b= 2;
+ if(efa->v4) b= 3; else b= 2;
for(; b>=0; b--) {
while(tface->uv[b][0] + dx < 0.0) dx+= 0.5;
while(tface->uv[b][0] + dx > 1.0) dx-= 0.5;
@@ -533,7 +541,7 @@ void calculate_uv_map(unsigned short mapmode)
while(tface->uv[b][1] + dy > 1.0) dy-= 0.5;
}
- if(mface->v4) b= 3; else b= 2;
+ if(efa->v4) b= 3; else b= 2;
for(; b>=0; b--) {
tface->uv[b][0]+= dx;
CLAMP(tface->uv[b][0], 0.0, 1.0);
@@ -552,42 +560,50 @@ void calculate_uv_map(unsigned short mapmode)
allqueue(REDRAWIMAGE, 0);
}
-MTFace *get_active_tface(MCol **mcol)
+/* last_sel, use em->act_face otherwise get the last selected face in the editselections
+ * at the moment, last_sel is mainly useful for gaking sure the space image dosnt flicker */
+MTFace *get_active_mtface(EditFace **act_efa, MCol **mcol, short sloppy)
{
- Mesh *me;
- MTFace *tf;
- MFace *mf;
- int a;
-
- if(OBACT==NULL || OBACT->type!=OB_MESH)
- return NULL;
+ EditMesh *em = G.editMesh;
+ EditFace *efa = NULL;
+ EditSelection *ese;
- me= get_mesh(OBACT);
- if(me==0 || me->mtface==0)
+ if(!EM_texFaceCheck())
return NULL;
- for(a=0, tf=me->mtface; a < me->totface; a++, tf++) {
- if(tf->flag & TF_ACTIVE) {
- if(mcol) *mcol = (me->mcol)? &me->mcol[a*4]: NULL;
- return tf;
+ /* first check the active face */
+ if (sloppy && em->act_face) {
+ efa = em->act_face;
+ } else {
+ ese = em->selected.last;
+ for (; ese; ese=ese->prev){
+ if(ese->type == EDITFACE) {
+ efa = (EditFace *)ese->data;
+
+ if (efa->h) efa= NULL;
+ else break;
+ }
}
}
-
- for(a=0, tf=me->mtface, mf=me->mface; a < me->totface; a++, tf++, mf++) {
- if(mf->flag & ME_FACE_SEL) {
- if(mcol) *mcol = (me->mcol)? &me->mcol[a*4]: NULL;
- return tf;
+ if (sloppy && !efa) {
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->f & SELECT)
+ break;
}
}
-
- for(a=0, tf=me->mtface, mf=me->mface; a < me->totface; a++, tf++, mf++) {
- if((mf->flag & ME_HIDE)==0) {
- if(mcol) *mcol = (me->mcol)? &me->mcol[a*4]: NULL;
- return tf;
+
+ if (efa) {
+ if (mcol) {
+ if (CustomData_has_layer(&em->fdata, CD_MCOL))
+ *mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ else
+ *mcol = NULL;
}
+ if (act_efa) *act_efa = efa;
+ return CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
}
-
+ if (act_efa) *act_efa= NULL;
if(mcol) *mcol = NULL;
return NULL;
}
@@ -634,7 +650,7 @@ void reveal_tface()
int a;
me= get_mesh(OBACT);
- if(me==0 || me->mtface==0 || me->totface==0) return;
+ if(me==0 || me->totface==0) return;
mface= me->mface;
a= me->totface;
@@ -646,7 +662,7 @@ void reveal_tface()
mface++;
}
- BIF_undo_push("Reveal UV face");
+ BIF_undo_push("Reveal face");
object_tface_flags_changed(OBACT, 0);
}
@@ -658,7 +674,7 @@ void hide_tface()
int a;
me= get_mesh(OBACT);
- if(me==0 || me->mtface==0 || me->totface==0) return;
+ if(me==0 || me->totface==0) return;
if(G.qual & LR_ALTKEY) {
reveal_tface();
@@ -682,7 +698,7 @@ void hide_tface()
mface++;
}
- BIF_undo_push("Hide UV face");
+ BIF_undo_push("Hide face");
object_tface_flags_changed(OBACT, 0);
}
@@ -696,7 +712,7 @@ void select_linked_tfaces(int mode)
ob = OBACT;
me = get_mesh(ob);
- if(me==0 || me->mtface==0 || me->totface==0) return;
+ if(me==0 || me->totface==0) return;
if (mode==0 || mode==1) {
if (!(ob->lay & G.vd->lay))
@@ -716,7 +732,7 @@ void deselectall_tface()
int a, sel;
me= get_mesh(OBACT);
- if(me==0 || me->mtface==0) return;
+ if(me==0) return;
mface= me->mface;
a= me->totface;
@@ -738,7 +754,7 @@ void deselectall_tface()
mface++;
}
- BIF_undo_push("(De)select all UV face");
+ BIF_undo_push("(De)select all faces");
object_tface_flags_changed(OBACT, 0);
}
@@ -750,7 +766,7 @@ void selectswap_tface(void)
int a;
me= get_mesh(OBACT);
- if(me==0 || me->mtface==0) return;
+ if(me==0) return;
mface= me->mface;
a= me->totface;
@@ -763,158 +779,11 @@ void selectswap_tface(void)
mface++;
}
- BIF_undo_push("Select inverse UV face");
+ BIF_undo_push("Select inverse face");
object_tface_flags_changed(OBACT, 0);
}
-void rotate_uv_tface()
-{
- Mesh *me;
- MFace *mf;
- MCol *mcol;
- MTFace *tf;
- short mode;
- int a;
-
- me= get_mesh(OBACT);
- if(me==0 || me->mtface==0) return;
-
- mode= pupmenu("Rotate %t|UV Co-ordinates %x1|Vertex Colors %x2");
-
- if (mode == 1 && me->mtface) {
- tf= me->mtface;
- mf= me->mface;
- for(a=0; a<me->totface; a++, tf++, mf++) {
- if(mf->flag & ME_FACE_SEL) {
- float u1= tf->uv[0][0];
- float v1= tf->uv[0][1];
-
- tf->uv[0][0]= tf->uv[1][0];
- tf->uv[0][1]= tf->uv[1][1];
-
- tf->uv[1][0]= tf->uv[2][0];
- tf->uv[1][1]= tf->uv[2][1];
-
- if(mf->v4) {
- tf->uv[2][0]= tf->uv[3][0];
- tf->uv[2][1]= tf->uv[3][1];
-
- tf->uv[3][0]= u1;
- tf->uv[3][1]= v1;
- }
- else {
- tf->uv[2][0]= u1;
- tf->uv[2][1]= v1;
- }
- }
- }
-
- BIF_undo_push("Rotate UV face");
- object_uvs_changed(OBACT);
- }
- else if (mode == 2 && me->mcol) {
- tf= me->mtface;
- mcol= me->mcol;
- mf= me->mface;
- for(a=0; a<me->totface; a++, tf++, mf++, mcol+=4) {
- if(mf->flag & ME_FACE_SEL) {
- MCol tmpcol= mcol[0];
-
- mcol[0]= mcol[1];
- mcol[1]= mcol[2];
-
- if(mf->v4) {
- mcol[2]= mcol[3];
- mcol[3]= tmpcol;
- }
- else
- mcol[2]= tmpcol;
- }
- }
-
- BIF_undo_push("Rotate color face");
- object_uvs_changed(OBACT);
- }
-}
-
-void mirror_uv_tface()
-{
- Mesh *me;
- MFace *mf;
- MTFace *tf;
- MCol *mcol;
- short mode;
- int a;
-
- me= get_mesh(OBACT);
- if(me==0 || me->mtface==0) return;
-
- mode= pupmenu("Mirror %t|UV Co-ordinates %x1|Vertex Colors %x2");
-
- if (mode==1 && me->mtface) {
- mf= me->mface;
- tf= me->mtface;
-
- for (a=0; a<me->totface; a++, tf++, mf++) {
- if(mf->flag & ME_FACE_SEL) {
- float u1= tf->uv[0][0];
- float v1= tf->uv[0][1];
- if(mf->v4) {
- tf->uv[0][0]= tf->uv[3][0];
- tf->uv[0][1]= tf->uv[3][1];
-
- tf->uv[3][0]= u1;
- tf->uv[3][1]= v1;
-
- u1= tf->uv[1][0];
- v1= tf->uv[1][1];
-
- tf->uv[1][0]= tf->uv[2][0];
- tf->uv[1][1]= tf->uv[2][1];
-
- tf->uv[2][0]= u1;
- tf->uv[2][1]= v1;
- }
- else {
- tf->uv[0][0]= tf->uv[2][0];
- tf->uv[0][1]= tf->uv[2][1];
- tf->uv[2][0]= u1;
- tf->uv[2][1]= v1;
- }
- }
- }
- }
- else if(mode==2 && me->mcol) {
- mf= me->mface;
- tf= me->mtface;
- mcol= me->mcol;
-
- for (a=0; a<me->totface; a++, tf++, mf++, mcol+=4) {
- if(mf->flag & ME_FACE_SEL) {
- MCol tmpcol= mcol[0];
-
- if(mf->v4) {
- mcol[0]= mcol[3];
- mcol[3]= tmpcol;
-
- tmpcol = mcol[1];
- mcol[1]= mcol[2];
- mcol[2]= tmpcol;
- }
- else {
- mcol[0]= mcol[2];
- mcol[2]= tmpcol;
- }
- }
- }
- }
-
- BIF_undo_push("Mirror UV face");
-
- object_uvs_changed(OBACT);
-}
-
int minmax_tface(float *min, float *max)
{
Object *ob;
@@ -1182,7 +1051,7 @@ void seam_mark_clear_tface(short mode)
int a;
me= get_mesh(OBACT);
- if(me==0 || me->mtface==0 || me->totface==0) return;
+ if(me==0 || me->totface==0) return;
if (mode == 0)
mode = pupmenu("Seams%t|Mark Border Seam %x1|Clear Seam %x2");
@@ -1237,7 +1106,6 @@ void face_select()
{
Object *ob;
Mesh *me;
- MTFace *tface, *tsel;
MFace *mface, *msel;
short mval[2];
unsigned int a, index;
@@ -1257,27 +1125,20 @@ void face_select()
if (!facesel_face_pick(me, mval, &index, 1)) return;
- tsel= (((MTFace*)me->mtface)+index);
msel= (((MFace*)me->mface)+index);
-
if (msel->flag & ME_HIDE) return;
/* clear flags */
- tface = me->mtface;
mface = me->mface;
a = me->totface;
- while (a--) {
- if (G.qual & LR_SHIFTKEY)
- tface->flag &= ~TF_ACTIVE;
- else {
- tface->flag &= ~TF_ACTIVE;
+ if ((G.qual & LR_SHIFTKEY)==0) {
+ while (a--) {
mface->flag &= ~ME_FACE_SEL;
+ mface++;
}
- tface++;
- mface++;
}
- tsel->flag |= TF_ACTIVE;
+ me->act_face = (int)index;
if (G.qual & LR_SHIFTKEY) {
if (msel->flag & ME_FACE_SEL)
@@ -1297,7 +1158,6 @@ void face_select()
void face_borderselect()
{
Mesh *me;
- MTFace *tface;
MFace *mface;
rcti rect;
struct ImBuf *ibuf;
@@ -1306,7 +1166,7 @@ void face_borderselect()
char *selar;
me= get_mesh(OBACT);
- if(me==0 || me->mtface==0) return;
+ if(me==0) return;
if(me->totface==0) return;
val= get_border(&rect, 3);
@@ -1339,7 +1199,7 @@ void face_borderselect()
}
mface= me->mface;
- for(a=1; a<=me->totface; a++, tface++, mface++) {
+ for(a=1; a<=me->totface; a++, mface++) {
if(selar[a]) {
if(mface->flag & ME_HIDE);
else {
@@ -1420,50 +1280,6 @@ void uv_autocalc_tface()
}
}
-void set_faceselect() /* toggle */
-{
- Object *ob = OBACT;
- Mesh *me = 0;
-
- if(ob==NULL) return;
- if(object_data_is_libdata(ob)) {
- error_libdata();
- return;
- }
-
- me= get_mesh(ob);
-
- scrarea_queue_headredraw(curarea);
-
- if(me) /* make sure modifiers are updated for mapping requirements */
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
-
- if(G.f & G_FACESELECT) {
- G.f &= ~G_FACESELECT;
-
- if((G.f & (G_WEIGHTPAINT|G_VERTEXPAINT|G_TEXTUREPAINT))==0) {
- if(me)
- reveal_tface();
- setcursor_space(SPACE_VIEW3D, CURSOR_STD);
- BIF_undo_push("End UV Faceselect");
- }
- }
- else if (me && (ob->lay & G.vd->lay)) {
- G.f |= G_FACESELECT;
- if(me->mtface==NULL)
- make_tfaces(me);
-
- setcursor_space(SPACE_VIEW3D, CURSOR_FACESEL);
- BIF_undo_push("Set UV Faceselect");
- }
-
- countall();
-
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSEDIT, 0);
- allqueue(REDRAWIMAGE, 0);
-}
-
/* Texture Paint */
void set_texturepaint() /* toggle */
@@ -1502,81 +1318,74 @@ void set_texturepaint() /* toggle */
allqueue(REDRAWBUTSEDIT, 0);
}
-/* Get the barycentric coordinates of 2d point p in 2d triangle (v1, v2, v3) */
-static void texpaint_barycentric_2d(float *v1, float *v2, float *v3, float *p, float *w)
+static void texpaint_project(Object *ob, float *model, float *proj, float *co, float *pco)
{
- float b[2], c[2], h[2], div;
-
- Vec2Subf(b, v1, v3);
- Vec2Subf(c, v2, v3);
- Vec2Subf(h, p, v3);
+ VECCOPY(pco, co);
+ pco[3]= 1.0f;
- div= b[0]*c[1] - b[1]*c[0];
-
- if (div == 0.0) {
- w[0]= w[1]= w[2]= 1.0f/3.0f;
- }
- else {
- div = 1.0/div;
- w[0] = (h[0]*c[1] - h[1]*c[0])*div;
- w[1] = (b[0]*h[1] - b[1]*h[0])*div;
- w[2] = 1.0 - w[0] - w[1];
- }
+ Mat4MulVecfl(ob->obmat, pco);
+ Mat4MulVecfl((float(*)[4])model, pco);
+ Mat4MulVec4fl((float(*)[4])proj, pco);
}
-/* Get 2d vertex coordinates of tface projected onto screen */
-static void texpaint_project(Object *ob, double *model, double *proj, GLint *view, float *co, float *pco)
+static void texpaint_tri_weights(Object *ob, float *v1, float *v2, float *v3, float *co, float *w)
{
- float obco[3];
- double winx, winy, winz;
-
- VecCopyf(obco, co);
- Mat4MulVecfl(ob->obmat, obco);
- gluProject(obco[0], obco[1], obco[2], model, proj, view, &winx, &winy, &winz);
-
- pco[0]= (float)winx;
- pco[1]= (float)winy;
-}
-
-static int texpaint_projected_verts(Object *ob, MFace *mf, MTFace *tf, MVert *mv, float *v1, float *v2, float *v3, float *v4)
-{
- double model[16], proj[16];
+ float pv1[4], pv2[4], pv3[4], h[3], divw;
+ float model[16], proj[16], wmat[3][3], invwmat[3][3];
GLint view[4];
- persp(PERSP_VIEW);
+ /* compute barycentric coordinates */
/* get the needed opengl matrices */
glGetIntegerv(GL_VIEWPORT, view);
- glGetDoublev(GL_MODELVIEW_MATRIX, model);
- glGetDoublev(GL_PROJECTION_MATRIX, proj);
+ glGetFloatv(GL_MODELVIEW_MATRIX, model);
+ glGetFloatv(GL_PROJECTION_MATRIX, proj);
view[0] = view[1] = 0;
/* project the verts */
- texpaint_project(ob, model, proj, view, mv[0].co, v1);
- texpaint_project(ob, model, proj, view, mv[1].co, v2);
- texpaint_project(ob, model, proj, view, mv[2].co, v3);
- if(mf->v4)
- texpaint_project(ob, model, proj, view, mv[3].co, v4);
+ texpaint_project(ob, model, proj, v1, pv1);
+ texpaint_project(ob, model, proj, v2, pv2);
+ texpaint_project(ob, model, proj, v3, pv3);
- return (mf->v4? 4: 3);
+ /* do inverse view mapping, see gluProject man page */
+ h[0]= (co[0] - view[0])*2.0f/view[2] - 1;
+ h[1]= (co[1] - view[1])*2.0f/view[3] - 1;
+ h[2]= 1.0f;
+
+ /* solve for (w1,w2,w3)/perspdiv in:
+ h*perspdiv = Project*Model*(w1*v1 + w2*v2 + w3*v3) */
+
+ wmat[0][0]= pv1[0]; wmat[1][0]= pv2[0]; wmat[2][0]= pv3[0];
+ wmat[0][1]= pv1[1]; wmat[1][1]= pv2[1]; wmat[2][1]= pv3[1];
+ wmat[0][2]= pv1[3]; wmat[1][2]= pv2[3]; wmat[2][2]= pv3[3];
+
+ Mat3Inv(invwmat, wmat);
+ Mat3MulVecfl(invwmat, h);
+
+ VECCOPY(w, h);
+
+ /* w is still divided by perspdiv, make it sum to one */
+ divw= w[0] + w[1] + w[2];
+ if(divw != 0.0f)
+ VecMulf(w, 1.0f/divw);
}
/* compute uv coordinates of mouse in face */
void texpaint_pick_uv(Object *ob, Mesh *mesh, unsigned int faceindex, short *xy, float *uv)
{
- float v1[2], v2[2], v3[2], v4[2], p[2], w[3];
- float absw, minabsw;
- int nvert;
DerivedMesh *dm = mesh_get_derived_final(ob, CD_MASK_BAREMESH);
int *index = dm->getFaceDataArray(dm, CD_ORIGINDEX);
MTFace *tface = dm->getFaceDataArray(dm, CD_MTFACE), *tf;
int numfaces = dm->getNumFaces(dm), a;
+ float p[2], w[3], absw, minabsw;
MFace mf;
MVert mv[4];
minabsw = 1e10;
uv[0] = uv[1] = 0.0;
+ persp(PERSP_VIEW);
+
/* test all faces in the derivedmesh with the original index of the picked face */
for (a = 0; a < numfaces; a++) {
if (index[a] == faceindex) {
@@ -1590,18 +1399,13 @@ void texpaint_pick_uv(Object *ob, Mesh *mesh, unsigned int faceindex, short *xy,
tf= &tface[a];
- /* compute barycentric coordinates of point in face and interpolate uv's.
- it's ok to compute the barycentric coords on the projected positions,
- because they are invariant under affine transform */
- nvert= texpaint_projected_verts(ob, &mf, tf, mv, v1, v2, v3, v4);
-
p[0]= xy[0];
p[1]= xy[1];
- if (nvert == 4) {
- /* the triangle with the largest absolute values is the one with the
- most negative weights */
- texpaint_barycentric_2d(v1, v2, v4, p, w);
+ if (mf.v4) {
+ /* the triangle with the largest absolute values is the one
+ with the most negative weights */
+ texpaint_tri_weights(ob, mv[0].co, mv[1].co, mv[3].co, p, w);
absw= fabs(w[0]) + fabs(w[1]) + fabs(w[2]);
if(absw < minabsw) {
uv[0]= tf->uv[0][0]*w[0] + tf->uv[1][0]*w[1] + tf->uv[3][0]*w[2];
@@ -1609,7 +1413,7 @@ void texpaint_pick_uv(Object *ob, Mesh *mesh, unsigned int faceindex, short *xy,
minabsw = absw;
}
- texpaint_barycentric_2d(v2, v3, v4, p, w);
+ texpaint_tri_weights(ob, mv[1].co, mv[2].co, mv[3].co, p, w);
absw= fabs(w[0]) + fabs(w[1]) + fabs(w[2]);
if (absw < minabsw) {
uv[0]= tf->uv[1][0]*w[0] + tf->uv[2][0]*w[1] + tf->uv[3][0]*w[2];
@@ -1618,7 +1422,7 @@ void texpaint_pick_uv(Object *ob, Mesh *mesh, unsigned int faceindex, short *xy,
}
}
else {
- texpaint_barycentric_2d(v1, v2, v3, p, w);
+ texpaint_tri_weights(ob, mv[0].co, mv[1].co, mv[2].co, p, w);
absw= fabs(w[0]) + fabs(w[1]) + fabs(w[2]);
if (absw < minabsw) {
uv[0]= tf->uv[0][0]*w[0] + tf->uv[1][0]*w[1] + tf->uv[2][0]*w[2];
@@ -1631,71 +1435,3 @@ void texpaint_pick_uv(Object *ob, Mesh *mesh, unsigned int faceindex, short *xy,
dm->release(dm);
}
-
- /* Selects all faces which have the same uv-texture as the active face
- * @author Roel Spruit
- * @return Void
- * Errors: - Active object not in this layer
- * - No active face or active face has no UV-texture
- */
-void get_same_uv(void)
-{
- Object *ob;
- Mesh *me;
- MTFace *tface;
- MFace *mface;
- short a, foundtex=0;
- Image *ima;
- char uvname[160];
-
- ob = OBACT;
- if (!(ob->lay & G.vd->lay)) {
- error("The active object is not in this layer");
- return;
- }
- me = get_mesh(ob);
-
-
- /* Search for the active face with a UV-Texture */
- tface = me->mtface;
- a = me->totface;
- while (a--) {
- if(tface->flag & TF_ACTIVE){
- ima=tface->tpage;
- if(ima && ima->name){
- strcpy(uvname,ima->name);
- a=0;
- foundtex=1;
- }
- }
- tface++;
- }
-
- if(!foundtex) {
- error("No active face, or active face has no UV texture");
- return;
- }
-
- /* select everything with the same texture */
- tface = me->mtface;
- mface = me->mface;
- a = me->totface;
- while (a--) {
- ima=tface->tpage;
- if(!(mface->flag & ME_HIDE) && ima && ima->name){
- if(!strcmp(ima->name, uvname)){
- mface->flag |= ME_FACE_SEL;
- }
- else mface->flag &= ~ME_FACE_SEL;
- }
- else mface->flag &= ~ME_FACE_SEL;
- tface++;
- mface++;
- }
-
- /* image window redraw */
- BIF_undo_push("Get same UV");
-
- object_tface_flags_changed(OBACT, 0);
-}
-
diff --git a/source/blender/src/editimasel.c b/source/blender/src/editimasel.c
index f3f9aa31d07..d57df3aaccf 100644
--- a/source/blender/src/editimasel.c
+++ b/source/blender/src/editimasel.c
@@ -43,411 +43,1111 @@
#include <sys/times.h>
#endif
-#include "PIL_time.h"
+#include "MEM_guardedalloc.h"
+
+#include "BKE_global.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_depsgraph.h"
+#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
+#include "BLI_storage_types.h"
-#include "DNA_screen_types.h"
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
+
+#include "DNA_armature_types.h"
+#include "DNA_action_types.h"
+#include "DNA_curve_types.h"
+#include "DNA_image_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_object_types.h"
+#include "DNA_texture_types.h"
#include "DNA_space_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_screen_types.h"
#include "DNA_userdef_types.h"
+#include "DNA_vfont_types.h"
+#include "DNA_view3d_types.h"
-#include "BKE_global.h"
-#include "BIF_fsmenu.h"
+#include "BIF_filelist.h"
+#include "BIF_space.h"
#include "BIF_screen.h"
#include "BIF_interface.h"
-#include "BIF_imasel.h"
#include "BIF_mywindow.h"
+#include "BIF_imasel.h"
+#include "BIF_gl.h"
+#include "BIF_fsmenu.h"
+#include "BIF_editview.h"
#include "BIF_toolbox.h"
-#include "BSE_filesel.h"
+#include "BLO_readfile.h"
+
+#include "BPI_script.h"
+
+#include "BSE_drawipo.h"
#include "BSE_drawimasel.h"
+#include "BSE_edit.h"
-#include "BDR_editcurve.h"
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
#include "blendef.h"
#include "mydevice.h"
-#define XIC 20
-#define YIC 21
+/* for events */
+#define NOTACTIVE 0
+#define ACTIVATE 1
+#define INACTIVATE 2
+/* for state of file */
+#define ACTIVE 2
-/* GLOBALS */
-extern char *fsmenu;
+static void imasel_select_objects(SpaceImaSel *simasel);
-void winqreadimaselspace(ScrArea *, void *, BWinEvent *);
+static int imasel_has_func(SpaceImaSel *simasel)
+{
+ if(simasel->returnfunc || simasel->returnfunc_event || simasel->returnfunc_args)
+ return 1;
+ return 0;
+}
-void winqreadimaselspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
+#if defined __BeOS
+static int fnmatch(const char *pattern, const char *string, int flags)
+{
+ return 0;
+}
+#elif defined WIN32 && !defined _LIBC
+ /* use fnmatch included in blenlib */
+ #include "BLI_fnmatch.h"
+#else
+ #include <fnmatch.h>
+#endif
+
+static void imasel_split_file(SpaceImaSel *simasel, char *s1)
+{
+ char string[FILE_MAX], dir[FILE_MAX], file[FILE_MAX];
+
+ BLI_strncpy(string, s1, sizeof(string));
+
+ BLI_split_dirfile(string, dir, file);
+
+ if(simasel->files) {
+ BIF_filelist_free(simasel->files);
+ }
+ BLI_strncpy(simasel->file, file, sizeof(simasel->file));
+ BLI_strncpy(simasel->dir, dir, sizeof(simasel->dir));
+
+ BIF_filelist_setdir(simasel->files, dir);
+
+ BLI_make_file_string(G.sce, simasel->dir, dir, "");
+}
+
+/**************** IMAGESELECT ******************************/
+
+/* the complete call; pulldown menu, and three callback types */
+static void activate_imageselect_(int type, char *title, char *file, short *menup, char *pupmenu,
+ void (*func)(char *),
+ void (*func_event)(unsigned short),
+ void (*func_args)(char *, void *arg1, void *arg2),
+ void *arg1, void *arg2)
{
- unsigned short event= evt->event;
- short val= evt->val;
SpaceImaSel *simasel;
+ char group[24], name[FILE_MAX], temp[FILE_MAX];
- short mval[2];
- short area_event;
- short queredraw = 0;
- int ret = 0;
- char name[256];
- char *selname;
- static double prevtime=0;
+ if(curarea==0) return;
+ if(curarea->win==0) return;
+
+ newspace(curarea, SPACE_IMASEL);
+ scrarea_queue_winredraw(curarea);
+ /* sometime double, when area already is SPACE_IMASEL with a different file name */
+ if(curarea->headwin) addqueue(curarea->headwin, CHANGED, 1);
+
+ name[2]= 0;
+ BLI_strncpy(name, file, sizeof(name));
- if(val==0) return;
simasel= curarea->spacedata.first;
+
+ simasel->returnfunc= func;
+ simasel->returnfunc_event= func_event;
+ simasel->returnfunc_args= func_args;
+ simasel->arg1= arg1;
+ simasel->arg2= arg2;
- area_event = 0;
- getmouseco_areawin(mval);
- simasel->mx= mval[0];
- simasel->my= mval[1];
+ simasel->type= type;
+ simasel->scrollpos = 0.0f;
+
+ if(simasel->pupmenu)
+ MEM_freeN(simasel->pupmenu);
+ simasel->pupmenu= pupmenu;
+ simasel->menup= menup;
- if (simasel->desx > 0){
- if ( (mval[0] > simasel->dssx) && (mval[0] < simasel->dsex) && (mval[1] > simasel->dssy) && (mval[1] < simasel->dsey) ) area_event = IMS_INDIRSLI;
- if ( (mval[0] > simasel->desx) && (mval[0] < simasel->deex) && (mval[1] > simasel->desy) && (mval[1] < simasel->deey) ) area_event = IMS_INDIR;
+ /* sfile->act is used for databrowse: double names of library objects */
+ simasel->active_file= -1;
+
+ if(!simasel->files) {
+ simasel->files = BIF_filelist_new();
+ }
+
+ if(G.relbase_valid && BLI_convertstringcode(name, G.sce, G.scene->r.cfra))
+ simasel->flag |= FILE_STRINGCODE;
+ else
+ simasel->flag &= ~FILE_STRINGCODE;
+
+ if (U.uiflag & USER_HIDE_DOT)
+ simasel->flag |= FILE_HIDE_DOT;
+
+ if(type==FILE_MAIN) {
+ char *groupname;
+
+ BLI_strncpy(simasel->file, name+2, sizeof(simasel->file));
+
+ groupname = BLO_idcode_to_name( GS(name) );
+ if (groupname) {
+ BLI_strncpy(simasel->dir, groupname, sizeof(simasel->dir) - 1);
+ strcat(simasel->dir, "/");
+ }
+
+ /* free all */
+ if (simasel->files) {
+ BIF_filelist_freelib(simasel->files);
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+ BIF_filelist_settype(simasel->files, type);
+ }
+ }
+ else if(type==FILE_LOADLIB) {
+
+ if( BIF_filelist_islibrary(simasel->files, temp, group) ) {
+ /* force a reload of the library-filelist */
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_freelib(simasel->files);
+ BLI_strncpy(simasel->dir, name, sizeof(simasel->dir));
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+ BIF_filelist_settype(simasel->files, type);
+ }
+ else {
+ imasel_split_file(simasel, name);
+ BIF_filelist_freelib(simasel->files);
+ BIF_filelist_settype(simasel->files, type);
+ }
}
- if (simasel->fesx > 0){
- if ( (mval[0] > simasel->fssx) && (mval[0] < simasel->fsex) && (mval[1] > simasel->fssy) && (mval[1] < simasel->fsey) ) area_event = IMS_INFILESLI;
- if ( (mval[0] > simasel->fesx) && (mval[0] < simasel->feex) && (mval[1] > simasel->fesy) && (mval[1] < simasel->feey) ) area_event = IMS_INFILE;
- }
+ else { /* FILE_BLENDER */
+ imasel_split_file(simasel, name);
+ BIF_filelist_settype(simasel->files, type);
+
+ BLI_cleanup_dir(G.sce, simasel->dir);
+
+ /* free: filelist and libfiledata became incorrect */
+ BIF_filelist_freelib(simasel->files);
+ }
+ BLI_strncpy(simasel->title, title, sizeof(simasel->title));
+ /* filetoname= 1; */ /* TODO: elubie - check what this means */
+}
+
+void activate_imageselect(int type, char *title, char *file, void (*func)(char *))
+{
+ activate_imageselect_(type, title, file, NULL, NULL, func, NULL, NULL, NULL, NULL);
+}
+
+void activate_imageselect_menu(int type, char *title, char *file, char *pupmenu, short *menup, void (*func)(char *))
+{
+ activate_imageselect_(type, title, file, menup, pupmenu, func, NULL, NULL, NULL, NULL);
+}
+
+void activate_imageselect_args(int type, char *title, char *file, void (*func)(char *, void *, void *), void *arg1, void *arg2)
+{
+ activate_imageselect_(type, title, file, NULL, NULL, NULL, NULL, func, arg1, arg2);
+}
+
+void activate_databrowse_imasel(ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short))
+{
+ ListBase *lb;
+ SpaceImaSel *simasel;
+ char str[32];
- if( event!=RETKEY && event!=PADENTER)
- if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
-
- switch(event) {
- case AFTERPIBREAD:
- get_pib_file(simasel);
- queredraw = 1;
- break;
-
- case AFTERIMASELIMA:
- if (bitset(simasel->fase, IMS_DOTHE_INF)){
- get_file_info(simasel);
-
- if (!bitset(simasel->fase, IMS_KNOW_INF)){
- addafterqueue(curarea->win, AFTERIMASELIMA, 1);
-
- }else{
- simasel->subfase = 0;
- simasel->imafase = 0;
- simasel->fase |= IMS_DOTHE_IMA;
- addafterqueue(curarea->win, AFTERIMASELGET, 1);
+ if(id==NULL) {
+ lb= wich_libbase(G.main, idcode);
+ id= lb->first;
+ }
+
+ if(id) BLI_strncpy(str, id->name, sizeof(str));
+ else return;
+
+ activate_imageselect_(FILE_MAIN, "SELECT DATABLOCK", str, menup, NULL, NULL, func, NULL, NULL, NULL);
+
+ simasel= curarea->spacedata.first;
+ simasel->retval= retval;
+ simasel->menup= menup;
+
+ BIF_filelist_setipotype(simasel->files, fromcode);
+ BIF_filelist_hasfunc(simasel->files, imasel_has_func(simasel));
+}
+
+
+static void set_active_file(SpaceImaSel *simasel, short x, short y)
+{
+ short tilex, tiley;
+ int active_tile;
+ int active_file;
+ int stridex;
+ struct direntry* file;
+ rcti viewrect = simasel->viewrect;
+ int fileoffset;
+ int rowoffset;
+ int rowleftover;
+ float scrollofs;
+ int numfiles;
+ int tilewidth = simasel->prv_w + TILE_BORDER_X*4;
+ int tileheight = simasel->prv_h + TILE_BORDER_Y*4 + U.fontsize;
+
+ numfiles = BIF_filelist_numfiles(simasel->files);
+
+ if (simasel->numtilesx > 0) {
+ fileoffset = numfiles*(simasel->scrollpos / simasel->scrollarea) + 0.5;
+ rowoffset = (fileoffset / simasel->numtilesx)*simasel->numtilesx;
+ rowleftover = fileoffset % simasel->numtilesx;
+ scrollofs = (float)tileheight*(float)rowleftover/(float)simasel->numtilesx;
+
+ stridex = (viewrect.xmax - viewrect.xmin) / (tilewidth);
+ tilex = ( (x-viewrect.xmin)) / (tilewidth);
+ tiley = (viewrect.ymax - viewrect.ymin + scrollofs - y) / (tileheight);
+ if (tilex >= simasel->numtilesx) tilex = simasel->numtilesx-1;
+ if (tiley >= simasel->numtilesy+1) tiley = simasel->numtilesy;
+ if (tilex < 0) tilex=0;
+ if (tiley < 0) tiley = 0;
+ active_tile = tilex + stridex*tiley;
+ active_file = rowoffset + active_tile;
+
+ if (active_file >= 0 && active_file < BIF_filelist_numfiles(simasel->files) )
+ {
+ simasel->active_file = active_file;
+ if (simasel->selstate & ACTIVATE) {
+ file = BIF_filelist_file(simasel->files, simasel->active_file);
+ file->flags |= ACTIVE;
}
+ } else {
+ simasel->active_file = -1;
}
- break;
- case AFTERIMASELGET:
- if (bitset(simasel->fase, IMS_DOTHE_IMA)){
- get_next_image(simasel);
- if (simasel->ima_redraw > 0){
- double newtime = PIL_check_seconds_timer();
- if ((newtime - prevtime) > 0.03) {
- simasel->ima_redraw = 0;
- queredraw = 1;
- prevtime = newtime;
+ } else {
+ simasel->active_file = -1;
+ }
+}
+
+static void set_active_bookmark(SpaceImaSel *simasel, short y)
+{
+ int nentries = fsmenu_get_nentries();
+ short posy = simasel->bookmarkrect.ymax - TILE_BORDER_Y - y;
+ simasel->active_bookmark = ((float)posy / (U.fontsize*3.0f/2.0f));
+ if (simasel->active_bookmark < 0 || simasel->active_bookmark > nentries) {
+ simasel->active_bookmark = -1;
+ }
+}
+
+static void imasel_prevspace()
+{
+ SpaceImaSel *simasel;
+
+ simasel= curarea->spacedata.first;
+
+ /* cleanup */
+ if(simasel->spacetype==SPACE_IMASEL) {
+ if(simasel->pupmenu) {
+ MEM_freeN(simasel->pupmenu);
+ simasel->pupmenu= NULL;
+ }
+ }
+
+ if(simasel->next) {
+
+ BLI_remlink(&curarea->spacedata, simasel);
+ BLI_addtail(&curarea->spacedata, simasel);
+
+ simasel= curarea->spacedata.first;
+
+ if (simasel->spacetype == SPACE_SCRIPT) {
+ SpaceScript *sc = (SpaceScript *)simasel;
+ if (sc->script) sc->script->flags &=~SCRIPT_FILESEL;
+ }
+
+ newspace(curarea, simasel->spacetype);
+ }
+ else newspace(curarea, SPACE_INFO);
+}
+
+static void free_imasel_spec(char *dir)
+{
+ /* all filesels with 'dir' are freed */
+ bScreen *sc;
+
+ sc= G.main->screen.first;
+ while(sc) {
+ ScrArea *sa= sc->areabase.first;
+ while(sa) {
+ SpaceLink *sl= sa->spacedata.first;
+ while(sl) {
+ if(sl->spacetype==SPACE_FILE) {
+ SpaceImaSel *simasel= (SpaceImaSel*) sl;
+ if (BLI_streq(simasel->dir, dir)) {
+ BIF_filelist_free(simasel->files);
+ }
}
-
+ sl= sl->next;
}
- if (!bitset(simasel->fase, IMS_KNOW_IMA)){
- addafterqueue(curarea->win, AFTERIMASELGET, 1);
- }else{
- simasel->ima_redraw = 0;
- simasel->subfase = 0;
- simasel->imafase = 0;
- addqueue(curarea->win, AFTERIMAWRITE, 1);
- queredraw = 1;
+ sa= sa->next;
+ }
+ sc= sc->id.next;
+ }
+}
+
+static void do_library_append(SpaceImaSel *simasel)
+{
+ Library *lib;
+ char dir[FILE_MAXDIR], group[32];
+
+ if ( BIF_filelist_islibrary(simasel->files, dir, group)==0 ) {
+ error("Not a library");
+ } else if (!BIF_filelist_lib(simasel->files) ) {
+ error("Library not loaded");
+ } else if (group[0]==0) {
+ error("Nothing indicated");
+ } else if (BLI_streq(G.main->name, dir)) {
+ error("Cannot use current file as library");
+ } else {
+ Object *ob;
+ int idcode = BIF_groupname_to_code(group);
+
+ if((simasel->flag & FILE_LINK)==0) {
+ /* tag everything, all untagged data can be made local */
+ ID *id;
+ ListBase *lbarray[MAX_LIBARRAY];
+ int a;
+
+ a= set_listbasepointers(G.main, lbarray);
+ while(a--) {
+ for(id= lbarray[a]->first; id; id= id->next) id->flag |= LIB_APPEND_TAG;
}
}
- break;
- case AFTERIMAWRITE:
- if (bitset(simasel->fase, IMS_KNOW_IMA)){
- write_new_pib(simasel);
- queredraw = 1;
+
+ BIF_filelist_append_library(simasel->files, dir, simasel->file, simasel->flag, idcode);
+
+ /* DISPLISTS? */
+ ob= G.main->object.first;
+ while(ob) {
+ if(ob->id.lib) {
+ ob->recalc |= OB_RECALC;
+ }
+ ob= ob->id.next;
}
- break;
- case RIGHTMOUSE:
- if ((area_event == IMS_INFILE) && (simasel->hilite_ima)){
- select_ima_files(simasel);
- queredraw = 1;
+ /* and now find the latest append lib file */
+ lib= G.main->library.first;
+ while(lib) {
+ if (BLI_streq(dir, lib->filename)) break;
+ lib= lib->id.next;
}
- break;
- case UI_BUT_EVENT:
- /* bug: blender's interface kit also returns a '4'... what is it! */
+ /* make local */
+ if(lib) {
+ if((simasel->flag & FILE_LINK)==0)
+ all_local(lib,1);
+ }
- switch(val) {
- case 13: /* 'P' */
- imadir_parent(simasel);
- queredraw = 1;
-
- case 1: /* dir entry */
- BLI_cleanup_dir(G.sce, simasel->dir);
- clear_ima_dir(simasel);
- queredraw = 1;
- break;
+ DAG_scene_sort(G.scene);
+
+ /* in sfile->dir is the whole lib name */
+ BLI_strncpy(G.lib, simasel->dir, sizeof(G.lib) );
- case 3: /* fsmenu */
- selname= fsmenu_get_entry(simasel->fileselmenuitem-1);
- if (selname) {
- strcpy(simasel->dir, selname);
- BLI_cleanup_dir(G.sce, simasel->dir);
- clear_ima_dir(simasel);
- queredraw = 1;
- }
- break;
+ }
+}
- case 5:
- if (simasel->returnfunc) {
- char name[256];
- strcpy(name, simasel->dir);
- strcat(name, simasel->file);
- filesel_prevspace();
- simasel->returnfunc(name);
+/* NOTE: this is called for file read, after the execfunc no UI memory is valid! */
+static void imasel_execute(SpaceImaSel *simasel)
+{
+ struct direntry *file;
+ char name[FILE_MAX];
+ int a;
+ int n;
+
+ imasel_prevspace();
+
+ if(simasel->type==FILE_LOADLIB) {
+ if(simasel->flag & FILE_STRINGCODE) {
+ if (!G.relbase_valid) {
+ okee("You have to save the .blend file before using relative paths! Using absolute path instead.");
+ simasel->flag &= ~FILE_STRINGCODE;
}
- break;
- case 6:
- filesel_prevspace();
- break;
-
}
- break;
-
- case LEFTMOUSE:
- case MIDDLEMOUSE:
+
+ do_library_append(simasel);
+ BIF_undo_push("Append from file");
+ allqueue(REDRAWALL, 1);
+ }
+ else if(imasel_has_func(simasel)) {
+ fsmenu_insert_entry(simasel->dir, 1, 0);
- /* No button pressed */
- switch (area_event){
- case IMS_INDIRSLI:
- move_imadir_sli(simasel);
- queredraw = 1;
- break;
- case IMS_INFILESLI:
- move_imafile_sli(simasel);
- queredraw = 1;
- break;
- case IMS_INDIR:
- if (simasel->hilite > -1){
- change_imadir(simasel);
- queredraw = 1;
- }
- break;
- case IMS_INFILE:
- if (simasel->hilite_ima){
- strcpy(simasel->fole, simasel->hilite_ima->file_name);
- strcpy(simasel->file, simasel->hilite_ima->file_name);
-
- if (event == LEFTMOUSE) addqueue(curarea->win, IMALEFTMOUSE, 1);
-
- if ((event == MIDDLEMOUSE)&&(simasel->returnfunc)){
- strcpy(name, simasel->dir);
- strcat(name, simasel->file);
-
- if(simasel->mode & IMS_STRINGCODE) BLI_makestringcode(G.sce, name);
+ if(simasel->type==FILE_MAIN) { /* DATABROWSE */
+ if (simasel->menup) { /* with value pointing to ID block index */
+ int notfound = 1;
+
+ /* Need special handling since hiding .* datablocks means that
+ simasel->active_file is no longer the same as files->nr.
+
+ Also, toggle HIDE_DOT on and off can make simasel->active_file not longer
+ correct (meaning it doesn't point to the correct item in the filelist.
- filesel_prevspace();
- simasel->returnfunc(name);
+ simasel->file is always correct, so first with check if, for the item
+ corresponding to simasel->active_file, the name is the same.
+
+ If it isn't (or if simasel->active_file is not good), go over filelist and take
+ the correct one.
+
+ This means that selecting a datablock than hiding it makes it
+ unselectable. Not really a problem.
+
+ - theeth
+ */
+
+ *simasel->menup= -1;
+ n = BIF_filelist_numfiles(simasel->files);
+ if(simasel->files) {
+ if( (simasel->active_file>=0) && (simasel->active_file < n) ) {
+ file = BIF_filelist_file(simasel->files, simasel->active_file);
+ if ( strcmp(file->relname, simasel->file)==0) {
+ notfound = 0;
+ *simasel->menup= file->nr;
+ }
+ }
+ if (notfound) {
+ for(a=0; a<n; a++) {
+ file = BIF_filelist_file(simasel->files, a);
+ if( strcmp(file->relname, simasel->file)==0) {
+ *simasel->menup= file->nr;
+ break;
+ }
+ }
+ }
}
- queredraw = 1;
}
- break;
+ if(simasel->returnfunc_event)
+ simasel->returnfunc_event(simasel->retval);
+ else if(simasel->returnfunc_args)
+ simasel->returnfunc_args(NULL, simasel->arg1, simasel->arg2);
}
- break;
+ else {
+ if(strncmp(simasel->title, "Save", 4)==0) free_imasel_spec(simasel->dir);
+ if(strncmp(simasel->title, "Export", 6)==0) free_imasel_spec(simasel->dir);
+
+ BLI_strncpy(name, simasel->dir, sizeof(name));
+ strcat(name, simasel->file);
+
+ if(simasel->flag & FILE_STRINGCODE) {
+ /* still weak, but we don't want saving files to make relative paths */
+ if(G.relbase_valid && strncmp(simasel->title, "Save", 4)) {
+ BLI_makestringcode(G.sce, name);
+ } else {
+ /* if we don't have a valid relative base (.blend file hasn't been saved yet)
+ then we don't save the path as relative (for texture images, background image).
+ Warning message not shown when saving files (doesn't make sense there)
+ */
+ if (strncmp(simasel->title, "Save", 4)) {
+ printf("Relative path setting has been ignored because .blend file hasn't been saved yet.\n");
+ }
+ simasel->flag &= ~FILE_STRINGCODE;
+ }
+ }
+ if(simasel->returnfunc)
+ simasel->returnfunc(name);
+ else if(simasel->returnfunc_args)
+ simasel->returnfunc_args(name, simasel->arg1, simasel->arg2);
+ }
+ }
+}
+
+static void do_imasel_buttons(short event, SpaceImaSel *simasel)
+{
+ char butname[FILE_MAX];
- case MOUSEX:
- case MOUSEY:
- getmouseco_areawin(mval); /* local screen coordinates */
- calc_hilite(simasel);
- if (simasel->mouse_move_redraw ){
- simasel->mouse_move_redraw = 0;
- queredraw = 1;
+ if (event == B_FS_FILENAME) {
+ if (strchr(simasel->file, '*') || strchr(simasel->file, '?') || strchr(simasel->file, '[')) {
+ int i, match = FALSE;
+ struct direntry *file;
+ int n = BIF_filelist_numfiles(simasel->files);
+ for (i = 2; i < n; i++) {
+ file = BIF_filelist_file(simasel->files, i);
+ if (fnmatch(simasel->file, file->relname, 0) == 0) {
+ file->flags |= ACTIVE;
+ match = TRUE;
+ }
+ }
+ if (match) simasel->file[0] = '\0';
+ if(simasel->type==FILE_MAIN) imasel_select_objects(simasel);
+ scrarea_queue_winredraw(curarea);
}
- break;
+ }
+ else if(event== B_FS_DIRNAME) {
+ /* reuse the butname variable */
+ BLI_cleanup_dir(G.sce, simasel->dir);
+
+ BLI_make_file_string(G.sce, butname, simasel->dir, "");
+ BLI_strncpy(simasel->dir, butname, sizeof(simasel->dir));
+
+ /* strip the trailing slash if its a real dir */
+ if (strlen(butname)!=1)
+ butname[strlen(butname)-1]=0;
- case WHEELUPMOUSE:
- case WHEELDOWNMOUSE:
- switch(area_event){
- case IMS_INDIRSLI:
- case IMS_INDIR:
- if (simasel->dirsli){
- if (event == WHEELUPMOUSE) simasel->topdir -= U.wheellinescroll;
- if (event == WHEELDOWNMOUSE) simasel->topdir += U.wheellinescroll;
- queredraw = 1;
+ /* updating the directory in the filelist */
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+
+ if(simasel->type & FILE_UNIX) {
+ if (!BLI_exists(butname)) {
+ if (okee("Makedir")) {
+ BLI_recurdir_fileops(butname);
+ if (!BLI_exists(butname)) {
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_parent(simasel->files);
+ BLI_strncpy(simasel->dir, BIF_filelist_dir(simasel->files), 80);
+ }
+ } else {
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_parent(simasel->files);
+ BLI_strncpy(simasel->dir, BIF_filelist_dir(simasel->files), 80);
+ }
}
- break;
- case IMS_INFILESLI:
- case IMS_INFILE:
- if(simasel->imasli){
- if (event == WHEELUPMOUSE) simasel->image_slider -= 0.2 * simasel->slider_height;
- if (event == WHEELDOWNMOUSE) simasel->image_slider += 0.2 * simasel->slider_height;
-
- if(simasel->image_slider < 0.0) simasel->image_slider = 0.0;
- if(simasel->image_slider > 1.0) simasel->image_slider = 1.0;
- queredraw = 1;
- }
- break;
}
- break;
-
- case PAGEUPKEY:
- case PAGEDOWNKEY:
- switch(area_event){
- case IMS_INDIRSLI:
- case IMS_INDIR:
- if (simasel->dirsli){
- if (event == PAGEUPKEY) simasel->topdir -= (simasel->dirsli_lines - 1);
- if (event == PAGEDOWNKEY) simasel->topdir += (simasel->dirsli_lines - 1);
- queredraw = 1;
- }
- break;
- case IMS_INFILESLI:
- case IMS_INFILE:
- if(simasel->imasli){
- if (event == PAGEUPKEY) simasel->image_slider -= simasel->slider_height;
- if (event == PAGEDOWNKEY) simasel->image_slider += simasel->slider_height;
-
- if(simasel->image_slider < 0.0) simasel->image_slider = 0.0;
- if(simasel->image_slider > 1.0) simasel->image_slider = 1.0;
- queredraw = 1;
- }
- break;
+ BIF_filelist_free(simasel->files);
+ simasel->file[0] = '\0';
+ simasel->scrollpos = 0;
+ simasel->active_file = -1;
+ scrarea_queue_winredraw(curarea);
+ }
+ else if(event== B_FS_DIR_MENU) {
+ char *selected= fsmenu_get_entry(simasel->menu-1);
+
+ /* which string */
+ if (selected) {
+ BLI_strncpy(simasel->dir, selected, sizeof(simasel->dir));
+ BLI_make_exist(simasel->dir);
+ BLI_cleanup_dir(G.sce, simasel->dir);
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+ simasel->file[0] = '\0';
+ simasel->scrollpos = 0;
+ simasel->active_file = -1;
+ scrarea_queue_redraw(curarea);
}
- break;
+
+ simasel->active_file = -1;
+
+ }
+ else if(event== B_FS_PARDIR) {
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_parent(simasel->files);
+ BLI_strncpy(simasel->dir, BIF_filelist_dir(simasel->files), 80);
+ simasel->file[0] = '\0';
+ simasel->active_file = -1;
+ simasel->scrollpos = 0;
+ scrarea_queue_redraw(curarea);
+ }
+ else if(event== B_FS_LOAD) {
+ if(simasel->type)
+ imasel_execute(simasel);
+ }
+ else if(event== B_FS_CANCEL)
+ imasel_prevspace();
+ else if(event== B_FS_LIBNAME) {
+ Library *lib= BLI_findlink(&G.main->library, simasel->menu);
+ if(lib) {
+ BLI_strncpy(simasel->dir, lib->filename, sizeof(simasel->dir));
+ BLI_make_exist(simasel->dir);
+ BLI_cleanup_dir(G.sce, simasel->dir);
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+ simasel->file[0] = '\0';
+ simasel->scrollpos = 0;
+ simasel->active_file = -1;
+ scrarea_queue_winredraw(curarea);
+ }
+ } else if(event== B_FS_BOOKMARK) {
+ char name[FILE_MAX];
+ BLI_make_file_string(G.sce, name, BLI_gethome(), ".Bfs");
+ fsmenu_insert_entry(simasel->dir, 1, 1);
+ scrarea_queue_winredraw(curarea);
+ fsmenu_write_file(name);
+ }
+
+}
+
+static void imasel_home(ScrArea *sa, SpaceImaSel *simasel)
+{
+ simasel->v2d.cur.xmin= simasel->v2d.cur.ymin= 0.0f;
+ simasel->v2d.cur.xmax= sa->winx;
+ simasel->v2d.cur.ymax= sa->winy;
+
+ simasel->v2d.tot= simasel->v2d.cur;
+ test_view2d(G.v2d, sa->winx, sa->winy);
+
+}
+
+static struct direntry* get_hilited_entry(SpaceImaSel *simasel)
+{
+ struct direntry *file;
+ file = BIF_filelist_file(simasel->files, simasel->active_file);
+ return file;
+}
+
+static void do_filescroll(SpaceImaSel *simasel)
+{
+ short mval[2], oldy, yo;
+ float scrollarea, scrollstep;
+
+ /* for beauty */
+ scrarea_do_windraw(curarea);
+ screen_swapbuffers();
+
+ getmouseco_areawin(mval);
+ oldy= yo= mval[1];
- case HOMEKEY:
- simasel->image_slider = 0.0;
- queredraw = 1;
- break;
-
- case ENDKEY:
- simasel->image_slider = 1.0;
- queredraw = 1;
- break;
+ while(get_mbut()&L_MOUSE) {
+ getmouseco_areawin(mval);
+
+ if(yo!=mval[1]) {
+ scrollarea = ((float)simasel->v2d.vert.ymax - (float)simasel->v2d.vert.ymin);
+ scrollstep = yo - mval[1];
+ simasel->scrollpos += scrollstep;
- case AKEY:
- if (G.qual == 0){
- ima_select_all(simasel);
- queredraw = 1;
- }
- break;
+ if (simasel->scrollpos<0)
+ simasel->scrollpos=0;
+ if (simasel->scrollpos > scrollarea - simasel->scrollheight)
+ simasel->scrollpos = scrollarea - simasel->scrollheight;
+ scrarea_do_windraw(curarea);
+ screen_swapbuffers();
- case IKEY:
- if ((G.qual == 0)&&(simasel->file)){
- sprintf(name, "$IMAGEEDITOR %s%s", simasel->dir, simasel->file);
- system(name);
- queredraw = 1;
+ yo= mval[1];
}
+ else BIF_wait_for_statechange();
+ }
- break;
+ /* for beauty */
+ scrarea_do_windraw(curarea);
+ screen_swapbuffers();
- case PKEY:
- if(G.qual & LR_SHIFTKEY) {
- extern char bprogname[]; /* usiblender.c */
-#ifdef WIN32
- sprintf(name, "%s -a \"%s%s\"", bprogname, simasel->dir, simasel->file);
-#else
- sprintf(name, "\"%s\" -a \"%s%s\"", bprogname, simasel->dir, simasel->file);
-#endif
- system(name);
- }
- if(G.qual & LR_CTRLKEY) {
- if(bitset(simasel->fase, IMS_KNOW_IMA)) pibplay(simasel);
+}
+
+/* ******************* DATA SELECT ********************* */
+
+static void imasel_select_objects(SpaceImaSel *simasel)
+{
+ Object *ob;
+ Base *base;
+ Scene *sce;
+ struct direntry* file;
+ int a;
+ int totfile;
+
+ /* only when F4 DATABROWSE */
+ if(imasel_has_func(simasel)) return;
+
+ totfile = BIF_filelist_numfiles(simasel->files);
+
+ if( strcmp(simasel->dir, "Object/")==0 ) {
+ for(a=0; a<totfile; a++) {
+ file = BIF_filelist_file(simasel->files, a);
+ ob= (Object *)file->poin;
+
+ if(ob) {
+ if(file->flags & ACTIVE) ob->flag |= SELECT;
+ else ob->flag &= ~SELECT;
+ }
+
}
- if (G.qual == 0){
- imadir_parent(simasel);
- BLI_cleanup_dir(G.sce, simasel->dir);
- clear_ima_dir(simasel);
- queredraw = 1;
+ base= FIRSTBASE;
+ while(base) {
+ base->flag= base->object->flag;
+ base= base->next;
}
- break;
+ countall();
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWOOPS, 0);
+ }
+ else if( strcmp(simasel->dir, "Scene/")==0 ) {
- case RKEY:
- case XKEY:
- if (simasel->hilite_ima){
- strcpy(name, simasel->dir);
- strcat(name, simasel->hilite_ima->file_name);
-
- if( okee("Delete %s", name) ) {
- ret = BLI_delete(name, 0, 0);
- if (ret) {
- error("Command failed, see console");
- } else {
- clear_ima_dir(simasel);
- queredraw = 1;
- }
+ for(a=0; a<totfile; a++) {
+ file = BIF_filelist_file(simasel->files, a);
+ sce= (Scene *)file->poin;
+ if(sce) {
+ if(file->flags & ACTIVE) sce->r.scemode |= R_BG_RENDER;
+ else sce->r.scemode &= ~R_BG_RENDER;
}
+
}
- break;
+ allqueue(REDRAWBUTSSCENE, 0);
+ }
+}
- case PADPLUSKEY:
- case EQUALKEY:
- BLI_newname(simasel->file, +1);
- queredraw = 1;
- break;
-
- case PADMINUS:
- case MINUSKEY:
- BLI_newname(simasel->file, -1);
- queredraw = 1;
- break;
-
- case BACKSLASHKEY:
- case SLASHKEY:
-#ifdef WIN32
- strcpy(simasel->dir, "\\");
-#else
- strcpy(simasel->dir, "/");
-#endif
- clear_ima_dir(simasel);
- simasel->image_slider = 0.0;
- queredraw = 1;
- break;
-
- case PERIODKEY:
- clear_ima_dir(simasel);
- queredraw = 1;
- break;
+static void active_imasel_object(SpaceImaSel *simasel)
+{
+ Object *ob;
+ struct direntry* file;
+
+ /* only when F4 DATABROWSE */
+ if(imasel_has_func(simasel)) return;
- case ESCKEY:
- filesel_prevspace();
- break;
-
- case PADENTER:
- case RETKEY:
- if (simasel->returnfunc){
- strcpy(name, simasel->dir);
- strcat(name, simasel->file);
- filesel_prevspace();
- simasel->returnfunc(name);
+ if( strcmp(simasel->dir, "Object/")==0 ) {
+ int n = BIF_filelist_numfiles(simasel->files);
+ if(simasel->active_file >= 0 && simasel->active_file < n) {
+ file = BIF_filelist_file(simasel->files, simasel->active_file);
+ ob= (Object *)file->poin;
+
+ if(ob) {
+ set_active_object(ob);
+ if(BASACT && BASACT->object==ob) {
+ BASACT->flag |= SELECT;
+ file->flags |= ACTIVE;
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWOOPS, 0);
+ scrarea_queue_winredraw(curarea);
+ }
+ }
}
- break;
}
+}
+
+
+
+void winqreadimaselspace(ScrArea *, void *, BWinEvent *);
+
+
+void winqreadimaselspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
+{
+ unsigned short event= evt->event;
+ short val= evt->val;
+ SpaceImaSel *simasel;
+ char str[FILE_MAXDIR+FILE_MAXFILE+12];
+ short mval[2];
+ short do_draw = 0;
+ short do_headdraw = 0;
+ int numfiles;
+ struct direntry *file;
+ float scrollstep = 0;
+ float scrollarea;
+
+ // if(val==0) return;
+ simasel= curarea->spacedata.first;
+
+ if (!simasel->files)
+ return;
+
+ if (BIF_filelist_empty(simasel->files))
+ return;
+
+ numfiles = BIF_filelist_numfiles(simasel->files);
+
+ /* calc_scrollrcts(sa, &(simasel->v2d), sa->winx, sa->winy); */
+ calc_imasel_rcts(simasel, sa->winx, sa->winy);
+
+ /* prevent looping */
+ if(simasel->selstate && !(get_mbut() & R_MOUSE)) simasel->selstate= 0;
+
+ if(val) {
+
+ if( event!=RETKEY && event!=PADENTER)
+ if( uiDoBlocks(&curarea->uiblocks, event)!=UI_NOTHING ) event= 0;
+
+ switch(event) {
- if (queredraw) scrarea_queue_winredraw(curarea);
+ case UI_BUT_EVENT:
+ do_imasel_buttons(val, simasel);
+ break;
+ case RENDERPREVIEW:
+ do_draw= 1;
+ /* draw_imasel_previews(sa, simasel); */
+ break;
+ case REDRAWIMASEL:
+ do_draw= 1;
+ break;
+ case WHEELDOWNMOUSE:
+ numfiles = BIF_filelist_numfiles(simasel->files);
+ scrollarea = ((float)simasel->v2d.vert.ymax - (float)simasel->v2d.vert.ymin);
+ scrollstep = ((scrollarea-simasel->scrollheight)/numfiles)*simasel->numtilesx;
+ simasel->scrollpos += scrollstep;
+ if (simasel->scrollpos > scrollarea - simasel->scrollheight)
+ simasel->scrollpos = scrollarea - simasel->scrollheight;
+ do_draw= 1;
+ break;
+ case WHEELUPMOUSE:
+ numfiles = BIF_filelist_numfiles(simasel->files);
+ scrollarea = ((float)simasel->v2d.vert.ymax - (float)simasel->v2d.vert.ymin);
+ scrollstep = ((scrollarea-simasel->scrollheight)/numfiles)*simasel->numtilesx;
+ simasel->scrollpos -= scrollstep;
+ if (simasel->scrollpos<0)
+ simasel->scrollpos=0;
+ do_draw= 1;
+ break;
+ case PAGEUPKEY:
+ numfiles = BIF_filelist_numfiles(simasel->files);
+ scrollarea = ((float)simasel->v2d.vert.ymax - (float)simasel->v2d.vert.ymin);
+ scrollstep = ((scrollarea-simasel->scrollheight)/numfiles)
+ *simasel->numtilesx*simasel->numtilesy;
+ simasel->scrollpos -= scrollstep;
+ if (simasel->scrollpos<0)
+ simasel->scrollpos=0;
+ do_draw= 1;
+ break;
+ case PAGEDOWNKEY:
+ numfiles = BIF_filelist_numfiles(simasel->files);
+ scrollarea = ((float)simasel->v2d.vert.ymax - (float)simasel->v2d.vert.ymin);
+ scrollstep = ((scrollarea-simasel->scrollheight)/numfiles)
+ * simasel->numtilesx*simasel->numtilesy;
+ simasel->scrollpos += scrollstep;
+ if (simasel->scrollpos > scrollarea - simasel->scrollheight)
+ simasel->scrollpos = scrollarea - simasel->scrollheight;
+ do_draw= 1;
+ break;
+ case HOMEKEY:
+ simasel->scrollpos=0;
+ imasel_home(sa, simasel);
+ do_draw= 1;
+ break;
+ case ENDKEY:
+ simasel->scrollpos = simasel->scrollarea;
+ do_draw= 1;
+ break;
+
+ case ESCKEY:
+ BIF_filelist_free(simasel->files);
+ imasel_prevspace();
+ break;
+ case PERIODKEY:
+ BIF_filelist_free(simasel->files);
+ simasel->active_file = -1;
+ do_draw = 1;
+ break;
+ case LEFTMOUSE:
+ case MIDDLEMOUSE:
+ getmouseco_areawin(mval);
+ if(mval[0]>simasel->v2d.vert.xmin && mval[0]<simasel->v2d.vert.xmax && mval[1]>simasel->v2d.vert.ymin && mval[1]<simasel->v2d.vert.ymax) {
+ do_filescroll(simasel);
+ }
+ else if(mval[0]>simasel->viewrect.xmin && mval[0]<simasel->viewrect.xmax
+ && mval[1]>simasel->viewrect.ymin && mval[1]<simasel->viewrect.ymax) {
+ set_active_file(simasel, mval[0], mval[1]);
+ if (simasel->active_file >= 0 && simasel->active_file < numfiles) {
+ file = BIF_filelist_file(simasel->files, simasel->active_file);
+
+ if(file && S_ISDIR(file->type)) {
+ strcat(simasel->dir, file->relname);
+ strcat(simasel->dir,"/");
+ simasel->file[0] = '\0';
+ BLI_cleanup_dir(G.sce, simasel->dir);
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+ BIF_filelist_free(simasel->files);
+ simasel->active_file = -1;
+ simasel->scrollpos = 0;
+ do_draw = 1;
+ do_headdraw = 1;
+ }
+ else if (file)
+ {
+ if (file->relname) {
+ if (simasel->img) {
+ IMB_freeImBuf(simasel->img);
+ simasel->img = NULL;
+ }
+ BLI_strncpy(simasel->file, file->relname, FILE_MAXFILE);
+ if(event==MIDDLEMOUSE && BIF_filelist_gettype(simasel->files))
+ imasel_execute(simasel);
+ }
+
+ }
+ if(BIF_filelist_gettype(simasel->files)==FILE_MAIN) {
+ active_imasel_object(simasel);
+ }
+
+ do_draw = 1;
+ }
+ }
+ else {
+ simasel->active_file = -1;
+ if (simasel->flag & FILE_BOOKMARKS) {
+ if(mval[0]>simasel->bookmarkrect.xmin && mval[0]<simasel->bookmarkrect.xmax && mval[1]>simasel->bookmarkrect.ymin && mval[1]<simasel->bookmarkrect.ymax) {
+ int nentries = fsmenu_get_nentries();
+
+ set_active_bookmark(simasel, mval[1]);
+ if (simasel->active_bookmark >= 0 && simasel->active_bookmark < nentries) {
+ char *selected= fsmenu_get_entry(simasel->active_bookmark);
+ /* which string */
+ if (selected) {
+ BLI_strncpy(simasel->dir, selected, sizeof(simasel->dir));
+ BLI_make_exist(simasel->dir);
+ BLI_cleanup_dir(G.sce, simasel->dir);
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+ simasel->file[0] = '\0';
+ simasel->scrollpos = 0;
+ simasel->active_file = -1;
+ do_headdraw = 1;
+ }
+ }
+ } else {
+ simasel->active_bookmark = -1;
+ }
+ do_draw= 1;
+ }
+ }
+ break;
+ case RIGHTMOUSE:
+ getmouseco_areawin(mval);
+ if(mval[0]>simasel->viewrect.xmin && mval[0]<simasel->viewrect.xmax
+ && mval[1]>simasel->viewrect.ymin && mval[1]<simasel->viewrect.ymax) {
+ set_active_file(simasel, mval[0], mval[1]);
+ if(simasel->active_file >=0 && simasel->active_file<numfiles) {
+ simasel->selstate = NOTACTIVE;
+ file = BIF_filelist_file(simasel->files, simasel->active_file);
+ if (file->flags & ACTIVE) {
+ file->flags &= ~ACTIVE;
+ simasel->selstate = INACTIVATE;
+ }
+ else {
+ file->flags |= ACTIVE;
+ simasel->selstate = ACTIVATE;
+ }
+ do_draw= 1;
+ }
+ }
+ break;
+ case MOUSEY:
+ case MOUSEX:
+ getmouseco_areawin(mval);
+ if(mval[0]>simasel->viewrect.xmin && mval[0]<simasel->viewrect.xmax && mval[1]>simasel->viewrect.ymin && mval[1]<simasel->viewrect.ymax) {
+ set_active_file(simasel, mval[0], mval[1]);
+ simasel->active_bookmark = -1;
+ if(simasel->active_file >=0 && simasel->active_file<numfiles) {
+ file = BIF_filelist_file(simasel->files, simasel->active_file);
+ if (simasel->selstate == INACTIVATE) {
+ file->flags &= ~ACTIVE;
+ }
+ else if (simasel->selstate == ACTIVATE) {
+ file->flags |= ACTIVE;
+ }
+ do_draw= 1;
+ }
+ } else {
+ simasel->active_file = -1;
+ if (simasel->flag & FILE_BOOKMARKS) {
+ if(mval[0]>simasel->bookmarkrect.xmin && mval[0]<simasel->bookmarkrect.xmax && mval[1]>simasel->bookmarkrect.ymin && mval[1]<simasel->bookmarkrect.ymax) {
+ set_active_bookmark(simasel, mval[1]);
+ } else {
+ simasel->active_bookmark = -1;
+ }
+ do_draw= 1;
+ }
+ }
+ break;
+ case AKEY:
+ BIF_filelist_swapselect(simasel->files);
+ if(simasel->type==FILE_MAIN) imasel_select_objects(simasel);
+ do_draw= 1;
+ break;
+ case BKEY:
+ toggle_blockhandler(sa, IMASEL_HANDLER_IMAGE, UI_PNL_UNSTOW);
+ scrarea_queue_winredraw(sa);
+ break;
+ case PKEY:
+ if(G.qual & LR_SHIFTKEY) {
+ extern char bprogname[]; /* usiblender.c */
+
+ sprintf(str, "%s -a \"%s%s\"", bprogname, simasel->dir, simasel->file);
+ system(str);
+ }
+ else
+ {
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_parent(simasel->files);
+ BLI_strncpy(simasel->dir, BIF_filelist_dir(simasel->files), 80);
+ simasel->file[0] = '\0';
+ simasel->active_file = -1;
+ simasel->scrollpos = 0;
+ do_headdraw = 1;
+ }
+ do_draw = 1;
+ break;
+ case XKEY:
+ getmouseco_areawin(mval);
+ if (simasel->flag & FILE_BOOKMARKS) {
+ if(mval[0]>simasel->bookmarkrect.xmin && mval[0]<simasel->bookmarkrect.xmax && mval[1]>simasel->bookmarkrect.ymin && mval[1]<simasel->bookmarkrect.ymax) {
+ int nentries = fsmenu_get_nentries();
+ set_active_bookmark(simasel, mval[1]);
+ if (simasel->active_bookmark >= 0 && simasel->active_bookmark < nentries) {
+ char name[FILE_MAX];
+ BLI_make_file_string(G.sce, name, BLI_gethome(), ".Bfs");
+ fsmenu_remove_entry(simasel->active_bookmark);
+ fsmenu_write_file(name);
+ simasel->active_bookmark = -1;
+ do_draw = 1;
+ }
+ }
+ }
+ break;
+ }
+ }
+ else if(event==RIGHTMOUSE) {
+ simasel->selstate = NOTACTIVE;
+ if(simasel->type==FILE_MAIN) imasel_select_objects(simasel);
+ }
+ else if(event==LEFTMOUSE) {
+ if(simasel->type==FILE_MAIN) {
+ getmouseco_areawin(mval);
+ set_active_file(simasel, mval[0], mval[1]);
+ }
+ }
+ /* XXX, stupid patch, curarea can become undone
+ * because of file loading... fixme zr
+ */
+ if(curarea) {
+ if(do_draw) scrarea_queue_winredraw(curarea);
+ if(do_headdraw) scrarea_queue_headredraw(curarea);
+ }
}
+/* copied from filesel.c */
void clever_numbuts_imasel()
{
SpaceImaSel *simasel;
- static char orgname[FILE_MAXDIR+FILE_MAXFILE+12];
- static char filename[FILE_MAXDIR+FILE_MAXFILE+12];
- static char newname[FILE_MAXDIR+FILE_MAXFILE+12];
+ char orgname[FILE_MAXDIR+FILE_MAXFILE+12];
+ char filename[FILE_MAXDIR+FILE_MAXFILE+12];
+ char newname[FILE_MAXDIR+FILE_MAXFILE+12];
+ struct direntry *file;
int len;
simasel= curarea->spacedata.first;
+
+ if(BIF_filelist_gettype(simasel->files)==FILE_MAIN) return;
+
len = 110;
+ file = get_hilited_entry(simasel);
+
+ if (file != NULL && !(S_ISDIR(file->type))){
+
+ BLI_make_file_string(G.sce, orgname, simasel->dir, file->relname);
+ BLI_strncpy(filename, file->relname, sizeof(filename));
- if (simasel->hilite_ima){
- BLI_make_file_string(G.sce, orgname, simasel->dir, simasel->hilite_ima->file_name);
- strcpy(filename, simasel->hilite_ima->file_name);
+ add_numbut(0, TEX, "", 0, len, filename, "Rename File");
- add_numbut(0, TEX, "", 0, len, filename, "Rename Image");
- if( do_clever_numbuts("Rename Image", 1, REDRAW) ) {
+ if( do_clever_numbuts("Rename File", 1, REDRAW) ) {
BLI_make_file_string(G.sce, newname, simasel->dir, filename);
if( strcmp(orgname, newname) != 0 ) {
BLI_rename(orgname, newname);
-
- clear_ima_dir(simasel);
+ BIF_filelist_free(simasel->files);
}
}
diff --git a/source/blender/src/editipo.c b/source/blender/src/editipo.c
index ad5ffacf103..5873bb94732 100644
--- a/source/blender/src/editipo.c
+++ b/source/blender/src/editipo.c
@@ -20,7 +20,8 @@
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
- * Contributor(s): Blender Foundation, 2005. Full recode
+ * Contributor(s): Blender Foundation, 2005. Full recode.
+ * Roland Hess, 2007. Visual Key refactor.
*
* ***** END GPL LICENSE BLOCK *****
*/
@@ -61,6 +62,7 @@
#include "DNA_material_types.h"
#include "DNA_object_types.h"
#include "DNA_object_fluidsim.h"
+#include "DNA_particle_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
@@ -81,6 +83,7 @@
#include "BKE_ipo.h"
#include "BKE_key.h"
#include "BKE_material.h"
+#include "BKE_particle.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -116,6 +119,7 @@
#include "blendef.h"
#include "mydevice.h"
+#include "transform.h"
extern int ob_ar[];
extern int ma_ar[];
@@ -129,6 +133,7 @@ extern int ac_ar[];
extern int co_ar[];
extern int te_ar[];
extern int fluidsim_ar[]; // NT
+extern int part_ar[];
/* forwards */
#define IPOTHRESH 0.9
@@ -247,7 +252,7 @@ void editipo_changed(SpaceIpo *si, int doredraw)
if(ei->flag & IPO_VISIBLE) {
- boundbox_ipocurve(ei->icu);
+ boundbox_ipocurve(ei->icu, 0);
sort_time_ipocurve(ei->icu);
if(first) {
si->v2d.tot= ei->icu->totrct;
@@ -342,6 +347,22 @@ void editipo_changed(SpaceIpo *si, int doredraw)
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
}
+ else if(si->blocktype==ID_PA){
+ Object *ob=OBACT;
+ ParticleSystem *psys = ob->particlesystem.first;
+
+ /* find out if we need to initialize particles */
+ for(; psys; psys=psys->next) {
+ if(psys->part->ipo==si->ipo) {
+ ei= si->editipo;
+ for(a=0; a<si->totipo; a++, ei++)
+ if(ei->icu && ELEM3(ei->icu->adrcode,PART_EMIT_FREQ,PART_EMIT_LIFE,PART_EMIT_SIZE))
+ psys_flush_settings(psys->part,PSYS_INIT,1);
+ }
+ }
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ }
}
if(si->showkey) make_ipokey();
@@ -434,6 +455,49 @@ static void make_ob_editipo(Object *ob, SpaceIpo *si)
//fprintf(stderr,"FSIMAKE_OPBJ call %d \n", si->totipo);
}
+static void make_part_editipo(SpaceIpo *si)
+{
+ EditIpo *ei;
+ int a;
+ char *name;
+
+ if(si->from==0) return;
+
+ ei= si->editipo= MEM_callocN(PART_TOTIPO*sizeof(EditIpo), "editipo");
+
+ si->totipo= PART_TOTIPO;
+
+ for(a=0; a<PART_TOTIPO; a++) {
+ name = getname_part_ei(part_ar[a]);
+ strcpy(ei->name, name);
+ ei->adrcode= part_ar[a];
+
+ //if(ei->adrcode & MA_MAP1) {
+ // ei->adrcode-= MA_MAP1;
+ // ei->adrcode |= texchannel_to_adrcode(si->channel);
+ //}
+ //else {
+ // if(ei->adrcode==MA_MODE) ei->disptype= IPO_DISPBITS;
+ //}
+
+ ei->col= ipo_rainbow(a, PART_TOTIPO);
+
+ //len= strlen(ei->name);
+ //if(len) {
+ // if( ei->name[ len-1 ]=='R') ei->col= 0x5050FF;
+ // else if( ei->name[ len-1 ]=='G') ei->col= 0x50FF50;
+ // else if( ei->name[ len-1 ]=='B') ei->col= 0xFF7050;
+ //}
+
+ ei->icu= find_ipocurve(si->ipo, ei->adrcode);
+ if(ei->icu) {
+ ei->flag= ei->icu->flag;
+ }
+
+ ei++;
+ }
+}
+
// copied from make_seq_editipo
static void make_fluidsim_editipo(SpaceIpo *si) // NT
{
@@ -911,6 +975,12 @@ static void make_editipo(void)
make_fluidsim_editipo(G.sipo);
}
}
+ else if(G.sipo->blocktype==ID_PA) {
+ if (ob) {
+ ob->ipowin= ID_PA;
+ make_part_editipo(G.sipo);
+ }
+ }
if(G.sipo->editipo==0) return;
@@ -1095,6 +1165,13 @@ static void get_ipo_context(short blocktype, ID **from, Ipo **ipo, char *actname
if(fss) *ipo= fss->ipo;
}
}
+ else if(blocktype==ID_PA) {
+ ParticleSystem *psys = psys_get_current(ob);
+ if(psys){
+ *from= (ID *)ob;
+ *ipo= psys->part->ipo;
+ }
+ }
}
/* called on each redraw, check if editipo data has to be remade */
@@ -1372,7 +1449,7 @@ void mouse_select_ipo(void)
marker=find_nearest_marker(1);
/* map ipo-points for editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
actstrip_map_ipo_keys(OBACT, G.sipo->ipo, 0, 0);
}
@@ -1535,7 +1612,7 @@ void mouse_select_ipo(void)
}
/* undo mapping of ipo-points for editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
actstrip_map_ipo_keys(OBACT, G.sipo->ipo, 1, 0);
}
@@ -1758,6 +1835,16 @@ Ipo *verify_ipo(ID *from, short blocktype, char *actname, char *constname)
return fss->ipo;
}
}
+ else if(blocktype== ID_PA){
+ Object *ob= (Object *)from;
+ ParticleSystem *psys= psys_get_current(ob);
+ if(psys){
+ if(psys->part->ipo==0)
+ psys->part->ipo= add_ipo("ParticleIpo", ID_PA);
+ return psys->part->ipo;
+ }
+ return NULL;
+ }
}
break;
case ID_MA:
@@ -1892,55 +1979,48 @@ IpoCurve *verify_ipocurve(ID *from, short blocktype, char *actname, char *constn
return icu;
}
-void insert_vert_ipo(IpoCurve *icu, float x, float y)
+/* This function adds a given BezTriple to an IPO-Curve. It will allocate
+ * memory for the array if needed, and will insert the BezTriple into a
+ * suitable place in chronological order.
+ *
+ * NOTE: any recalculate of the IPO-Curve that needs to be done will need to
+ * be done by the caller.
+ */
+int insert_bezt_icu (IpoCurve *icu, BezTriple *bezt)
{
- BezTriple *bezt, beztr, *newbezt;
- int a = 0, h1, h2;
+ BezTriple *newb, *beztd;
+ int i= 0;
- memset(&beztr, 0, sizeof(BezTriple));
- beztr.vec[0][0]= x; // set all three points, for nicer start position
- beztr.vec[0][1]= y;
- beztr.vec[1][0]= x;
- beztr.vec[1][1]= y;
- beztr.vec[2][0]= x;
- beztr.vec[2][1]= y;
- beztr.hide= IPO_BEZ;
- beztr.f1= beztr.f2= beztr.f3= SELECT;
- beztr.h1= beztr.h2= HD_AUTO;
-
- bezt= icu->bezt;
-
- if(bezt==NULL) {
- icu->bezt= MEM_callocN( sizeof(BezTriple), "beztriple");
- *(icu->bezt)= beztr;
+ if (icu->bezt == NULL) {
+ icu->bezt= MEM_callocN(sizeof(BezTriple), "beztriple");
+ *(icu->bezt)= *bezt;
icu->totvert= 1;
}
else {
- /* all vertices deselect */
- for(a=0; a<icu->totvert; a++, bezt++) {
- bezt->f1= bezt->f2= bezt->f3= 0;
- }
-
- bezt= icu->bezt;
- for(a=0; a<=icu->totvert; a++, bezt++) {
-
- /* no double points */
- if(a<icu->totvert && IS_EQ(bezt->vec[1][0], x)) {
- *(bezt)= beztr;
+ beztd= icu->bezt;
+ for (i = 0; i <= icu->totvert; i++, beztd++) {
+ /* no double points - threshold to determine this should be good enough */
+ if ((i < icu->totvert) && IS_EQT(beztd->vec[1][0], bezt->vec[1][0], 0.00001)) {
+ *(beztd)= *bezt;
break;
}
- if(a==icu->totvert || bezt->vec[1][0] > x) {
- newbezt= MEM_callocN( (icu->totvert+1)*sizeof(BezTriple), "beztriple");
+ /* if we've reached the end of the icu array, or bezt is to be pasted before current */
+ if (i==icu->totvert || beztd->vec[1][0] > bezt->vec[1][0]) {
+ newb= MEM_callocN( (icu->totvert+1)*sizeof(BezTriple), "beztriple");
- if(a>0) memcpy(newbezt, icu->bezt, a*sizeof(BezTriple));
+ /* add the beztriples that should occur before the beztriple to be pasted (originally in ei->icu) */
+ if (i > 0)
+ memcpy(newb, icu->bezt, i*sizeof(BezTriple));
- bezt= newbezt+a;
- *(bezt)= beztr;
+ /* add beztriple to paste at index j */
+ *(newb+i)= *bezt;
- if(a<icu->totvert) memcpy(newbezt+a+1, icu->bezt+a, (icu->totvert-a)*sizeof(BezTriple));
+ /* add the beztriples that occur after the beztriple to be pasted (originally in icu) */
+ if (i < icu->totvert)
+ memcpy(newb+i+1, icu->bezt+i, (icu->totvert-i)*sizeof(BezTriple));
MEM_freeN(icu->bezt);
- icu->bezt= newbezt;
+ icu->bezt= newb;
icu->totvert++;
break;
@@ -1948,18 +2028,53 @@ void insert_vert_ipo(IpoCurve *icu, float x, float y)
}
}
+ /* we need to return the index, so that some tools which do post-processing can
+ * detect where we added the BezTriple in the array
+ */
+ return i;
+}
+
+/* This function is a wrapper for insert_bezt_icu, and should be used when
+ * adding a new keyframe to a curve, when the keyframe doesn't exist anywhere
+ * else yet.
+ *
+ * 'fast' - is only for the python API where importing BVH's would take an extreamly long time.
+ */
+void insert_vert_icu (IpoCurve *icu, float x, float y, short fast)
+{
+ BezTriple beztr;
+ int a, h1, h2;
- calchandles_ipocurve(icu);
+ /* set all three points, for nicer start position */
+ memset(&beztr, 0, sizeof(BezTriple));
+ beztr.vec[0][0]= x;
+ beztr.vec[0][1]= y;
+ beztr.vec[1][0]= x;
+ beztr.vec[1][1]= y;
+ beztr.vec[2][0]= x;
+ beztr.vec[2][1]= y;
+ beztr.hide= IPO_BEZ;
+ beztr.f1= beztr.f2= beztr.f3= SELECT;
+ beztr.h1= beztr.h2= HD_AUTO;
+
+ /* add temp beztriple to keyframes */
+ a= insert_bezt_icu(icu, &beztr);
+ if (!fast) calchandles_ipocurve(icu);
/* set handletype */
- if(icu->totvert>2) {
+ if (icu->totvert > 2) {
+ BezTriple *bezt;
+
h1= h2= HD_AUTO;
- if(a>0) h1= (bezt-1)->h2;
- if(a<icu->totvert-1) h2= (bezt+1)->h1;
+ bezt= (icu->bezt + a);
+
+ if (a > 0) h1= (bezt-1)->h2;
+ if (a < icu->totvert-1) h2= (bezt+1)->h1;
+
bezt->h1= h1;
bezt->h2= h2;
-
- calchandles_ipocurve(icu);
+
+ if (!fast) calchandles_ipocurve(icu);
}
}
@@ -1990,7 +2105,7 @@ void add_vert_ipo(void)
areamouseco_to_ipoco(G.v2d, mval, &x, &y);
/* convert click-time to ipo-time */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
x= get_action_frame(OBACT, x);
}
@@ -2012,7 +2127,7 @@ void add_vert_ipo(void)
y= (float)(1 << val);
}
- insert_vert_ipo(ei->icu, x, y);
+ insert_vert_icu(ei->icu, x, y, 0);
/* to be sure: if icu was 0, or only 1 curve visible */
ei->flag |= IPO_SELECT;
@@ -2154,42 +2269,270 @@ static int new_key_needed(IpoCurve *icu, float cFrame, float nValue)
return KEYNEEDED_JUSTADD;
}
-void insertkey(ID *id, int blocktype, char *actname, char *constname, int adrcode)
+/* a duplicate of insertkey that does not check for routing to insertmatrixkey
+ to avoid recursion problems */
+static void insertkey_nonrecurs(ID *id, int blocktype, char *actname, char *constname, int adrcode)
{
IpoCurve *icu;
Object *ob;
void *poin= NULL;
float curval, cfra;
int vartype;
+ int matset=0;
- icu= verify_ipocurve(id, blocktype, actname, constname, adrcode);
-
- if(icu) {
-
- poin= get_context_ipo_poin(id, blocktype, actname, icu, &vartype);
+ if (matset==0) {
+ icu= verify_ipocurve(id, blocktype, actname, constname, adrcode);
- if(poin) {
- curval= read_ipo_poin(poin, vartype);
+ if(icu) {
- cfra= frame_to_float(CFRA);
+ poin= get_context_ipo_poin(id, blocktype, actname, icu, &vartype);
- /* if action is mapped in NLA, it returns a correction */
- if(actname && actname[0] && GS(id->name)==ID_OB)
- cfra= get_action_frame((Object *)id, cfra);
+ if(poin) {
+ curval= read_ipo_poin(poin, vartype);
+
+ cfra= frame_to_float(CFRA);
+
+ /* if action is mapped in NLA, it returns a correction */
+ if(actname && actname[0] && GS(id->name)==ID_OB)
+ cfra= get_action_frame((Object *)id, cfra);
+
+ if( GS(id->name)==ID_OB ) {
+ ob= (Object *)id;
+ if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
+ /* actually frametofloat calc again! */
+ cfra-= ob->sf*G.scene->r.framelen;
+ }
+ }
+
+ insert_vert_icu(icu, cfra, curval, 0);
+ }
+ }
+ }
+}
+
+int insertmatrixkey(ID *id, int blocktype, char *actname, char *constname, int adrcode)
+{
+ int matindex=0;
+ /* branch on adrcode and blocktype, generating the proper matrix-based
+ values to send to insertfloatkey */
+ if (GS(id->name)==ID_OB) {
+ Object *ob= (Object *)id;
+
+ if ( blocktype==ID_OB ){ //working with an object
+ if ((ob)&&!(ob->parent)) {
+ if ((adrcode==OB_ROT_X)||(adrcode==OB_ROT_Y)||(adrcode==OB_ROT_Z)) { //get a rotation
+ float eul[3];
+ switch (adrcode) {
+ case OB_ROT_X:
+ matindex=0;
+ break;
+ case OB_ROT_Y:
+ matindex=1;
+ break;
+ case OB_ROT_Z:
+ matindex=2;
+ break;
+ }
+ Mat4ToEul(ob->obmat, eul);
+ insertfloatkey(id, ID_OB, actname, NULL, adrcode, eul[matindex]*(5.72958));
+ return 1;
+ } else if ((adrcode==OB_LOC_X)||(adrcode==OB_LOC_Y)||(adrcode==OB_LOC_Z)) {//get a translation
+ switch (adrcode) {
+ case OB_LOC_X:
+ matindex=0;
+ break;
+ case OB_LOC_Y:
+ matindex=1;
+ break;
+ case OB_LOC_Z:
+ matindex=2;
+ break;
+ }
+ insertfloatkey(id, ID_OB, actname, NULL, adrcode, ob->obmat[3][matindex]);
+ return 1;
+ }
+ }
+ } else if ( blocktype==ID_PO) { //working with a pose channel
+ bPoseChannel *pchan= get_pose_channel(ob->pose, actname);
+ if (pchan) {
+ if ((adrcode==AC_LOC_X)||(adrcode==AC_LOC_Y)||(adrcode==AC_LOC_Z)) {
+ switch (adrcode) {
+ case AC_LOC_X:
+ matindex=0;
+ break;
+ case AC_LOC_Y:
+ matindex=1;
+ break;
+ case AC_LOC_Z:
+ matindex=2;
+ break;
+ }
+ if (!(pchan->bone->parent)||((pchan->bone->parent)&&!(pchan->bone->flag&BONE_CONNECTED))) { /* don't use for non-connected child bones */
+ float delta_mat[4][4];
+ armature_mat_pose_to_delta(delta_mat, pchan->pose_mat, pchan->bone->arm_mat);
+ insertfloatkey(id, ID_PO, pchan->name, NULL, adrcode, delta_mat[3][matindex]);
+ return 1;
+ }
+ } else if ((adrcode==AC_QUAT_W)||(adrcode==AC_QUAT_X)||(adrcode==AC_QUAT_Y)||(adrcode==AC_QUAT_Z)) {
+ float tmat[4][4], trimat[3][3], localQuat[4];
+
+ switch (adrcode) {
+ case AC_QUAT_W:
+ matindex=0;
+ break;
+ case AC_QUAT_X:
+ matindex=1;
+ break;
+ case AC_QUAT_Y:
+ matindex=2;
+ break;
+ case AC_QUAT_Z:
+ matindex=3;
+ break;
+ }
+
+ /* it should be reasonable to assume that we are keyframing on the active object, although it is not
+ * strictly required for this particular space conversion, arg1 must not be null for this to work
+ */
+ Mat4CpyMat4(tmat, pchan->pose_mat);
+ constraint_mat_convertspace(OBACT, pchan, tmat, CONSTRAINT_SPACE_POSE, CONSTRAINT_SPACE_LOCAL);
+
+ Mat3CpyMat4(trimat, tmat);
+ Mat3ToQuat_is_ok(trimat, localQuat);
+ insertfloatkey(id, ID_PO, pchan->name, NULL, adrcode, localQuat[matindex]);
+
+ return 1;
+ }
+ }
+ }
+ }
+ /* failed to set a matrix key -- use traditional, but the non-recursing version */
+ insertkey_nonrecurs(id,blocktype,actname,constname,adrcode);
+ return 0;
+}
+
+static int match_adr_constraint(ID * id, int blocktype, char *actname, int adrcode)
+{ /* This function matches constraint blocks with adrcodes to see if the
+ visual keying method should be used. For example, an object looking to key
+ location and having a CopyLoc constraint would return true. */
+
+ Object *ob=NULL;
+ int foundmatch=0;
+ int searchtype=0;
+ bConstraint *conref=NULL, *con=NULL;
+
+ /*Retrieve constraint list*/
+ if( GS(id->name)==ID_OB )
+ ob= (Object *)id;
+ if (ob) {
+ if (blocktype==ID_PO) {
+ bPoseChannel *pchan= get_pose_channel(ob->pose, actname);
+ conref=pchan->constraints.first;
+ } else if (blocktype==ID_OB) {
+ conref=ob->constraints.first;
+ }
+
+ if (conref) {
+ /*Set search type: 1 is for translation contraints, 2 is for rotation*/
+ if ((adrcode==OB_LOC_X)||(adrcode==OB_LOC_Y)||(adrcode==OB_LOC_Z)||(adrcode==AC_LOC_X)||(adrcode==AC_LOC_Y)||(adrcode==AC_LOC_Z)) {
+ searchtype=1;
+ } else if ((adrcode==OB_ROT_X)||(adrcode==OB_ROT_Y)||(adrcode==OB_ROT_Z)||(adrcode==AC_QUAT_W)||(adrcode==AC_QUAT_X)||(adrcode==AC_QUAT_Y)||(adrcode==AC_QUAT_Z)) {
+ searchtype=2;
+ }
- if( GS(id->name)==ID_OB ) {
- ob= (Object *)id;
- if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
- /* actually frametofloat calc again! */
- cfra-= ob->sf*G.scene->r.framelen;
+ if (searchtype>0) {
+ for (con=conref; (con)&&(foundmatch==0); con=con->next) {
+ switch (con->type) {
+ /* match constraint types to which kinds of keying they would affect */
+ case CONSTRAINT_TYPE_CHILDOF:
+ foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_TRACKTO:
+ if (searchtype==2) foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_FOLLOWPATH:
+ foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_ROTLIMIT:
+ if (searchtype==2) foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_LOCLIMIT:
+ if (searchtype==1) foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_ROTLIKE:
+ if (searchtype==2) foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_LOCLIKE:
+ if (searchtype==1) foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_LOCKTRACK:
+ if (searchtype==2) foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_DISTANCELIMIT:
+ if (searchtype==1) foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_MINMAX:
+ if (searchtype==1) foundmatch=1;
+ break;
+ case CONSTRAINT_TYPE_TRANSFORM:
+ foundmatch=1;
+ break;
+ default:
+ break;
+ }
}
}
+ }
+ }
+
+ return foundmatch;
- insert_vert_ipo(icu, cfra, curval);
+}
+
+void insertkey(ID *id, int blocktype, char *actname, char *constname, int adrcode, short fast)
+{
+ IpoCurve *icu;
+ Object *ob;
+ void *poin= NULL;
+ float curval, cfra;
+ int vartype;
+ int matset=0;
+
+ if ((G.flags&G_AUTOMATKEYS)&&(match_adr_constraint(id, blocktype, actname, adrcode))) {
+ matset=insertmatrixkey(id, blocktype, actname, constname, adrcode);
+ }
+ if (matset==0) {
+ icu= verify_ipocurve(id, blocktype, actname, constname, adrcode);
+
+ if(icu) {
+
+ poin= get_context_ipo_poin(id, blocktype, actname, icu, &vartype);
+
+ if(poin) {
+ curval= read_ipo_poin(poin, vartype);
+
+ cfra= frame_to_float(CFRA);
+
+ /* if action is mapped in NLA, it returns a correction */
+ if(actname && actname[0] && GS(id->name)==ID_OB)
+ cfra= get_action_frame((Object *)id, cfra);
+
+ if( GS(id->name)==ID_OB ) {
+ ob= (Object *)id;
+ if(ob->sf!=0.0 && (ob->ipoflag & OB_OFFS_OB) ) {
+ /* actually frametofloat calc again! */
+ cfra-= ob->sf*G.scene->r.framelen;
+ }
+ }
+
+ insert_vert_icu(icu, cfra, curval, fast);
+ }
}
}
}
+
+
/* This function is a 'smarter' version of the insert key code.
* It uses an auxilliary function to check whether a keyframe is really needed */
void insertkey_smarter(ID *id, int blocktype, char *actname, char *constname, int adrcode)
@@ -2229,7 +2572,7 @@ void insertkey_smarter(ID *id, int blocktype, char *actname, char *constname, in
/* insert new keyframe at current frame */
if (insert_mode)
- insert_vert_ipo(icu, cfra, curval);
+ insert_vert_icu(icu, cfra, curval, 0);
/* delete keyframe immediately before/after newly added */
switch (insert_mode) {
@@ -2244,9 +2587,8 @@ void insertkey_smarter(ID *id, int blocktype, char *actname, char *constname, in
}
}
-/* For inserting keys based on the object matrix - not on the current IPO value
- Generically - it inserts the passed float value into the appropriate IPO */
-void insertmatrixkey(ID *id, int blocktype, char *actname, char *constname, int adrcode, float matrixvalue)
+/* For inserting keys based on an arbitrary float value */
+void insertfloatkey(ID *id, int blocktype, char *actname, char *constname, int adrcode, float floatkey)
{
IpoCurve *icu;
Object *ob;
@@ -2275,7 +2617,9 @@ void insertmatrixkey(ID *id, int blocktype, char *actname, char *constname, int
cfra-= ob->sf*G.scene->r.framelen;
}
}
- insert_vert_ipo(icu, cfra, matrixvalue);
+
+ /* insert new keyframe at current frame */
+ insert_vert_icu(icu, cfra, floatkey, 0);
}
}
}
@@ -2306,16 +2650,16 @@ void insertkey_editipo(void)
ei->icu->totvert= 0;
ei->icu->bezt= NULL;
- insert_vert_ipo(ei->icu, 0.0f, 0.0f);
+ insert_vert_icu(ei->icu, 0.0f, 0.0f, 0);
if(ELEM3(driver->adrcode, OB_ROT_X, OB_ROT_Y, OB_ROT_Z)) {
if(ei->disptype==IPO_DISPDEGR)
- insert_vert_ipo(ei->icu, 18.0f, 18.0f);
+ insert_vert_icu(ei->icu, 18.0f, 18.0f, 0);
else
- insert_vert_ipo(ei->icu, 18.0f, 1.0f);
+ insert_vert_icu(ei->icu, 18.0f, 1.0f, 0);
}
else
- insert_vert_ipo(ei->icu, 1.0f, 1.0f);
+ insert_vert_icu(ei->icu, 1.0f, 1.0f, 0);
ei->flag |= IPO_SELECT|IPO_VISIBLE;
ei->icu->flag= ei->flag;
@@ -2363,7 +2707,7 @@ void insertkey_editipo(void)
}
/* convert cfra to ipo-time */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
cfra= get_action_frame(OBACT, cfra);
}
@@ -2392,7 +2736,7 @@ void insertkey_editipo(void)
}
fp= insertvals;
for(a=0; a<tot; a++, fp+=2) {
- insert_vert_ipo(ei->icu, fp[0], fp[1]);
+ insert_vert_icu(ei->icu, fp[0], fp[1], 0);
}
MEM_freeN(insertvals);
@@ -2445,58 +2789,58 @@ void common_insertkey(void)
map= texchannel_to_adrcode(ma->texact);
if(event==0 || event==10) {
- insertkey(id, ID_MA, NULL, NULL, MA_COL_R);
- insertkey(id, ID_MA, NULL, NULL, MA_COL_G);
- insertkey(id, ID_MA, NULL, NULL, MA_COL_B);
+ insertkey(id, ID_MA, NULL, NULL, MA_COL_R, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_COL_G, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_COL_B, 0);
}
if(event==1 || event==10) {
- insertkey(id, ID_MA, NULL, NULL, MA_ALPHA);
+ insertkey(id, ID_MA, NULL, NULL, MA_ALPHA, 0);
}
if(event==2 || event==10) {
- insertkey(id, ID_MA, NULL, NULL, MA_HASIZE);
+ insertkey(id, ID_MA, NULL, NULL, MA_HASIZE, 0);
}
if(event==3 || event==10) {
- insertkey(id, ID_MA, NULL, NULL, MA_MODE);
+ insertkey(id, ID_MA, NULL, NULL, MA_MODE, 0);
}
if(event==10) {
- insertkey(id, ID_MA, NULL, NULL, MA_SPEC_R);
- insertkey(id, ID_MA, NULL, NULL, MA_SPEC_G);
- insertkey(id, ID_MA, NULL, NULL, MA_SPEC_B);
- insertkey(id, ID_MA, NULL, NULL, MA_REF);
- insertkey(id, ID_MA, NULL, NULL, MA_EMIT);
- insertkey(id, ID_MA, NULL, NULL, MA_AMB);
- insertkey(id, ID_MA, NULL, NULL, MA_SPEC);
- insertkey(id, ID_MA, NULL, NULL, MA_HARD);
- insertkey(id, ID_MA, NULL, NULL, MA_MODE);
- insertkey(id, ID_MA, NULL, NULL, MA_TRANSLU);
- insertkey(id, ID_MA, NULL, NULL, MA_ADD);
+ insertkey(id, ID_MA, NULL, NULL, MA_SPEC_R, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_SPEC_G, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_SPEC_B, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_REF, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_EMIT, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_AMB, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_SPEC, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_HARD, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_MODE, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_TRANSLU, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_ADD, 0);
}
if(event==14) {
- insertkey(id, ID_MA, NULL, NULL, MA_RAYM);
- insertkey(id, ID_MA, NULL, NULL, MA_FRESMIR);
- insertkey(id, ID_MA, NULL, NULL, MA_FRESMIRI);
- insertkey(id, ID_MA, NULL, NULL, MA_FRESTRA);
- insertkey(id, ID_MA, NULL, NULL, MA_FRESTRAI);
+ insertkey(id, ID_MA, NULL, NULL, MA_RAYM, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_FRESMIR, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_FRESMIRI, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_FRESTRA, 0);
+ insertkey(id, ID_MA, NULL, NULL, MA_FRESTRAI, 0);
}
if(event==12 || event==11) {
- insertkey(id, ID_MA, NULL, NULL, map+MAP_OFS_X);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_OFS_Y);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_OFS_Z);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_OFS_X, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_OFS_Y, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_OFS_Z, 0);
}
if(event==13 || event==11) {
- insertkey(id, ID_MA, NULL, NULL, map+MAP_SIZE_X);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_SIZE_Y);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_SIZE_Z);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_SIZE_X, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_SIZE_Y, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_SIZE_Z, 0);
}
if(event==11) {
- insertkey(id, ID_MA, NULL, NULL, map+MAP_R);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_G);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_B);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_DVAR);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_COLF);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_NORF);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_VARF);
- insertkey(id, ID_MA, NULL, NULL, map+MAP_DISP);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_R, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_G, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_B, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_DVAR, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_COLF, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_NORF, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_VARF, 0);
+ insertkey(id, ID_MA, NULL, NULL, map+MAP_DISP, 0);
}
}
}
@@ -2510,37 +2854,37 @@ void common_insertkey(void)
map= texchannel_to_adrcode(wo->texact);
if(event==0) {
- insertkey(id, ID_WO, NULL, NULL, WO_ZEN_R);
- insertkey(id, ID_WO, NULL, NULL, WO_ZEN_G);
- insertkey(id, ID_WO, NULL, NULL, WO_ZEN_B);
+ insertkey(id, ID_WO, NULL, NULL, WO_ZEN_R, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_ZEN_G, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_ZEN_B, 0);
}
if(event==1) {
- insertkey(id, ID_WO, NULL, NULL, WO_HOR_R);
- insertkey(id, ID_WO, NULL, NULL, WO_HOR_G);
- insertkey(id, ID_WO, NULL, NULL, WO_HOR_B);
+ insertkey(id, ID_WO, NULL, NULL, WO_HOR_R, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_HOR_G, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_HOR_B, 0);
}
if(event==2) {
- insertkey(id, ID_WO, NULL, NULL, WO_MISI);
- insertkey(id, ID_WO, NULL, NULL, WO_MISTDI);
- insertkey(id, ID_WO, NULL, NULL, WO_MISTSTA);
- insertkey(id, ID_WO, NULL, NULL, WO_MISTHI);
+ insertkey(id, ID_WO, NULL, NULL, WO_MISI, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_MISTDI, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_MISTSTA, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_MISTHI, 0);
}
if(event==3) {
- insertkey(id, ID_WO, NULL, NULL, WO_STAR_R);
- insertkey(id, ID_WO, NULL, NULL, WO_STAR_G);
- insertkey(id, ID_WO, NULL, NULL, WO_STAR_B);
- insertkey(id, ID_WO, NULL, NULL, WO_STARDIST);
- insertkey(id, ID_WO, NULL, NULL, WO_STARSIZE);
+ insertkey(id, ID_WO, NULL, NULL, WO_STAR_R, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_STAR_G, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_STAR_B, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_STARDIST, 0);
+ insertkey(id, ID_WO, NULL, NULL, WO_STARSIZE, 0);
}
if(event==12) {
- insertkey(id, ID_WO, NULL, NULL, map+MAP_OFS_X);
- insertkey(id, ID_WO, NULL, NULL, map+MAP_OFS_Y);
- insertkey(id, ID_WO, NULL, NULL, map+MAP_OFS_Z);
+ insertkey(id, ID_WO, NULL, NULL, map+MAP_OFS_X, 0);
+ insertkey(id, ID_WO, NULL, NULL, map+MAP_OFS_Y, 0);
+ insertkey(id, ID_WO, NULL, NULL, map+MAP_OFS_Z, 0);
}
if(event==13) {
- insertkey(id, ID_WO, NULL, NULL, map+MAP_SIZE_X);
- insertkey(id, ID_WO, NULL, NULL, map+MAP_SIZE_Y);
- insertkey(id, ID_WO, NULL, NULL, map+MAP_SIZE_Z);
+ insertkey(id, ID_WO, NULL, NULL, map+MAP_SIZE_X, 0);
+ insertkey(id, ID_WO, NULL, NULL, map+MAP_SIZE_Y, 0);
+ insertkey(id, ID_WO, NULL, NULL, map+MAP_SIZE_Z, 0);
}
}
}
@@ -2554,25 +2898,25 @@ void common_insertkey(void)
map= texchannel_to_adrcode(la->texact);
if(event==0) {
- insertkey(id, ID_LA, NULL, NULL, LA_COL_R);
- insertkey(id, ID_LA, NULL, NULL, LA_COL_G);
- insertkey(id, ID_LA, NULL, NULL, LA_COL_B);
+ insertkey(id, ID_LA, NULL, NULL, LA_COL_R, 0);
+ insertkey(id, ID_LA, NULL, NULL, LA_COL_G, 0);
+ insertkey(id, ID_LA, NULL, NULL, LA_COL_B, 0);
}
if(event==1) {
- insertkey(id, ID_LA, NULL, NULL, LA_ENERGY);
+ insertkey(id, ID_LA, NULL, NULL, LA_ENERGY, 0);
}
if(event==2) {
- insertkey(id, ID_LA, NULL, NULL, LA_SPOTSI);
+ insertkey(id, ID_LA, NULL, NULL, LA_SPOTSI, 0);
}
if(event==12) {
- insertkey(id, ID_LA, NULL, NULL, map+MAP_OFS_X);
- insertkey(id, ID_LA, NULL, NULL, map+MAP_OFS_Y);
- insertkey(id, ID_LA, NULL, NULL, map+MAP_OFS_Z);
+ insertkey(id, ID_LA, NULL, NULL, map+MAP_OFS_X, 0);
+ insertkey(id, ID_LA, NULL, NULL, map+MAP_OFS_Y, 0);
+ insertkey(id, ID_LA, NULL, NULL, map+MAP_OFS_Z, 0);
}
if(event==13) {
- insertkey(id, ID_LA, NULL, NULL, map+MAP_SIZE_X);
- insertkey(id, ID_LA, NULL, NULL, map+MAP_SIZE_Y);
- insertkey(id, ID_LA, NULL, NULL, map+MAP_SIZE_Z);
+ insertkey(id, ID_LA, NULL, NULL, map+MAP_SIZE_X, 0);
+ insertkey(id, ID_LA, NULL, NULL, map+MAP_SIZE_Y, 0);
+ insertkey(id, ID_LA, NULL, NULL, map+MAP_SIZE_Z, 0);
}
}
@@ -2585,102 +2929,107 @@ void common_insertkey(void)
if(event== -1) return;
if(event==0) {
- insertkey(id, ID_TE, NULL, NULL, TE_NSIZE);
- insertkey(id, ID_TE, NULL, NULL, TE_NDEPTH);
- insertkey(id, ID_TE, NULL, NULL, TE_NTYPE);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP);
- insertkey(id, ID_TE, NULL, NULL, TE_N_BAS1);
+ insertkey(id, ID_TE, NULL, NULL, TE_NSIZE, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_NDEPTH, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_NTYPE, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_N_BAS1, 0);
}
if(event==1) {
- insertkey(id, ID_TE, NULL, NULL, TE_NSIZE);
- insertkey(id, ID_TE, NULL, NULL, TE_NDEPTH);
- insertkey(id, ID_TE, NULL, NULL, TE_NTYPE);
- insertkey(id, ID_TE, NULL, NULL, TE_TURB);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP);
- insertkey(id, ID_TE, NULL, NULL, TE_N_BAS1);
- insertkey(id, ID_TE, NULL, NULL, TE_N_BAS2);
+ insertkey(id, ID_TE, NULL, NULL, TE_NSIZE, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_NDEPTH, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_NTYPE, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_TURB, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_N_BAS1, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_N_BAS2, 0);
}
if(event==2) {
- insertkey(id, ID_TE, NULL, NULL, TE_NSIZE);
- insertkey(id, ID_TE, NULL, NULL, TE_NTYPE);
- insertkey(id, ID_TE, NULL, NULL, TE_TURB);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP);
- insertkey(id, ID_TE, NULL, NULL, TE_N_BAS1);
+ insertkey(id, ID_TE, NULL, NULL, TE_NSIZE, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_NTYPE, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_TURB, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_N_BAS1, 0);
}
if(event==3) {
- insertkey(id, ID_TE, NULL, NULL, TE_NSIZE);
- insertkey(id, ID_TE, NULL, NULL, TE_NTYPE);
- insertkey(id, ID_TE, NULL, NULL, TE_TURB);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP);
- insertkey(id, ID_TE, NULL, NULL, TE_N_BAS1);
- insertkey(id, ID_TE, NULL, NULL, TE_N_BAS2);
+ insertkey(id, ID_TE, NULL, NULL, TE_NSIZE, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_NTYPE, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_TURB, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_N_BAS1, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_N_BAS2, 0);
}
if(event==4) {
- insertkey(id, ID_TE, NULL, NULL, TE_NDEPTH);
- insertkey(id, ID_TE, NULL, NULL, TE_TURB);
+ insertkey(id, ID_TE, NULL, NULL, TE_NDEPTH, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_TURB, 0);
}
if(event==5) {
- insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP, 0);
}
if(event==6) {
- insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP);
- insertkey(id, ID_TE, NULL, NULL, TE_MGH);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_LAC);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_OCT);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_OFF);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_GAIN);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_TYP, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MGH, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_LAC, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_OCT, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_OFF, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_GAIN, 0);
}
if(event==7) {
- insertkey(id, ID_TE, NULL, NULL, TE_VNW1);
- insertkey(id, ID_TE, NULL, NULL, TE_VNW2);
- insertkey(id, ID_TE, NULL, NULL, TE_VNW3);
- insertkey(id, ID_TE, NULL, NULL, TE_VNW4);
- insertkey(id, ID_TE, NULL, NULL, TE_VNMEXP);
- insertkey(id, ID_TE, NULL, NULL, TE_VN_DISTM);
- insertkey(id, ID_TE, NULL, NULL, TE_VN_COLT);
- insertkey(id, ID_TE, NULL, NULL, TE_ISCA);
- insertkey(id, ID_TE, NULL, NULL, TE_NSIZE);
+ insertkey(id, ID_TE, NULL, NULL, TE_VNW1, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_VNW2, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_VNW3, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_VNW4, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_VNMEXP, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_VN_DISTM, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_VN_COLT, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_ISCA, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_NSIZE, 0);
}
if(event==8) {
- insertkey(id, ID_TE, NULL, NULL, TE_MG_OCT);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_OFF);
- insertkey(id, ID_TE, NULL, NULL, TE_MG_GAIN);
- insertkey(id, ID_TE, NULL, NULL, TE_DISTA);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_OCT, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_OFF, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_MG_GAIN, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_DISTA, 0);
}
if(event==9) {
- insertkey(id, ID_TE, NULL, NULL, TE_COL_R);
- insertkey(id, ID_TE, NULL, NULL, TE_COL_G);
- insertkey(id, ID_TE, NULL, NULL, TE_COL_B);
- insertkey(id, ID_TE, NULL, NULL, TE_BRIGHT);
- insertkey(id, ID_TE, NULL, NULL, TE_CONTRA);
+ insertkey(id, ID_TE, NULL, NULL, TE_COL_R, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_COL_G, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_COL_B, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_BRIGHT, 0);
+ insertkey(id, ID_TE, NULL, NULL, TE_CONTRA, 0);
}
}
}
}
else if(G.buts->mainb==CONTEXT_OBJECT) {
ob= OBACT;
- if(ob && ob->type==OB_MESH) {
+ if(ob) {
id= (ID *) (ob);
if(id) {
- event= pupmenu("Insert Key %t|Surface Damping%x0|Random Damping%x1|Permeability%x2|Force Strength%x3|Force Falloff%x4");
- if(event== -1) return;
+ if(ob->type==OB_MESH)
+ event= pupmenu("Insert Key %t|Surface Damping%x0|Random Damping%x1|Permeability%x2|Force Strength%x3|Force Falloff%x4");
+ else
+ event= pupmenu("Insert Key %t|Force Strength%x3|Force Falloff%x4");
+ if(event == -1) return;
if(event==0) {
- insertkey(id, ID_OB, NULL, NULL, OB_PD_SDAMP);
+ insertkey(id, ID_OB, NULL, NULL, OB_PD_SDAMP, 0);
}
if(event==1) {
- insertkey(id, ID_OB, NULL, NULL, OB_PD_RDAMP);
+ insertkey(id, ID_OB, NULL, NULL, OB_PD_RDAMP, 0);
}
if(event==2) {
- insertkey(id, ID_OB, NULL, NULL, OB_PD_PERM);
+ insertkey(id, ID_OB, NULL, NULL, OB_PD_PERM, 0);
}
if(event==3) {
- insertkey(id, ID_OB, NULL, NULL, OB_PD_FSTR);
+ insertkey(id, ID_OB, NULL, NULL, OB_PD_FSTR, 0);
}
if(event==4) {
- insertkey(id, ID_OB, NULL, NULL, OB_PD_FFALL);
+ insertkey(id, ID_OB, NULL, NULL, OB_PD_FFALL, 0);
+ }
+ if(event==5) {
+ insertkey(id, ID_OB, NULL, NULL, OB_PD_FMAXD, 0);
}
-
}
}
}
@@ -2698,21 +3047,21 @@ void common_insertkey(void)
if(event== -1) return;
if(event==0) {
- insertkey(id, ID_CA, NULL, NULL, CAM_LENS);
+ insertkey(id, ID_CA, NULL, NULL, CAM_LENS, 0);
}
else if(event==1) {
- insertkey(id, ID_CA, NULL, NULL, CAM_STA);
- insertkey(id, ID_CA, NULL, NULL, CAM_END);
+ insertkey(id, ID_CA, NULL, NULL, CAM_STA, 0);
+ insertkey(id, ID_CA, NULL, NULL, CAM_END, 0);
}
else if(event==2) {
- insertkey(id, ID_CA, NULL, NULL, CAM_YF_APERT);
+ insertkey(id, ID_CA, NULL, NULL, CAM_YF_APERT, 0);
}
else if(event==3) {
- insertkey(id, ID_CA, NULL, NULL, CAM_YF_FDIST);
+ insertkey(id, ID_CA, NULL, NULL, CAM_YF_FDIST, 0);
}
else if(event==4) {
- insertkey(id, ID_CA, NULL, NULL, CAM_SHIFT_X);
- insertkey(id, ID_CA, NULL, NULL, CAM_SHIFT_Y);
+ insertkey(id, ID_CA, NULL, NULL, CAM_SHIFT_X, 0);
+ insertkey(id, ID_CA, NULL, NULL, CAM_SHIFT_Y, 0);
}
}
}
@@ -2725,16 +3074,16 @@ void common_insertkey(void)
if(event== -1) return;
if(event==0) {
- insertkey(id, ID_SO, NULL, NULL, SND_VOLUME);
+ insertkey(id, ID_SO, NULL, NULL, SND_VOLUME, 0);
}
if(event==1) {
- insertkey(id, ID_SO, NULL, NULL, SND_PITCH);
+ insertkey(id, ID_SO, NULL, NULL, SND_PITCH, 0);
}
if(event==2) {
- insertkey(id, ID_SO, NULL, NULL, SND_PANNING);
+ insertkey(id, ID_SO, NULL, NULL, SND_PANNING, 0);
}
if(event==3) {
- insertkey(id, ID_SO, NULL, NULL, SND_ATTEN);
+ insertkey(id, ID_SO, NULL, NULL, SND_ATTEN, 0);
}
}
}
@@ -2754,7 +3103,7 @@ void common_insertkey(void)
if (ob && (ob->flag & OB_POSEMODE)) {
bPoseChannel *pchan;
- set_pose_keys(ob); // sets pchan->flag to POSE_KEY if bone selected
+ set_pose_keys(ob); /* sets pchan->flag to POSE_KEY if bone selected, and clears if not */
for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next)
if (pchan->flag & POSE_KEY)
break;
@@ -2788,84 +3137,78 @@ void common_insertkey(void)
if (ob && (ob->flag & OB_POSEMODE)){
bPoseChannel *pchan;
-
+ short recalc_bonepaths= 0;
+
if (ob->action && ob->action->id.lib) {
error ("Can't key libactions");
return;
}
-
+
id= &ob->id;
for (pchan=ob->pose->chanbase.first; pchan; pchan=pchan->next) {
- if (pchan->flag & POSE_KEY){
+ if (pchan->flag & POSE_KEY) {
+ /* insert relevant keyframes */
if(event==0 || event==3 ||event==4) {
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X);
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y);
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z, 0);
}
- if(event==1 || event==3 ||event==4) {
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W);
+ if(event==1 || event==3 || event==4) {
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W, 0);
}
if(event==2 || event==4) {
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_X);
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Y);
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Z);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_X, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Y, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Z, 0);
}
if (event==9 && ob->action) {
bActionChannel *achan;
-
+
for (achan = ob->action->chanbase.first; achan; achan=achan->next){
if (achan->ipo && !strcmp (achan->name, pchan->name)){
for (icu = achan->ipo->curve.first; icu; icu=icu->next){
- insertkey(id, ID_PO, achan->name, NULL, icu->adrcode);
+ insertkey(id, ID_PO, achan->name, NULL, icu->adrcode, 0);
}
break;
}
}
}
if(event==11 || event==13) {
- float delta_mat[4][4];
-
- armature_mat_pose_to_delta(delta_mat, pchan->pose_mat, pchan->bone->arm_mat);
- insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_LOC_X, delta_mat[3][0]);
- insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y, delta_mat[3][1]);
- insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z, delta_mat[3][2]);
+ int matok=0;
+ /* check one to make sure we're not trying to set visual loc keys on
+ bones inside of a chain, which only leads to tears. */
+ matok= insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_LOC_X);
+ insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y);
+ insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z);
+
+ if (matok == 0) {
+ insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z, 0);
+ }
}
if(event==12 || event==13) {
- float delta_mat[4][4];
- float localQuat[4], oldQuat[4];
-
- /* obtain rotation caused by constraints/IK*/
- armature_mat_pose_to_delta(delta_mat, pchan->pose_mat, pchan->bone->arm_mat);
- Mat4ToQuat(delta_mat, localQuat);
-
- /* bad hack warning:
- * Write the 'visual' rotation onto the
- * bone's quat/rotation values and use standard
- * keyframing method to insert a keyframe with this
- * value.
- *
- * Needed, as rotation wouldn't get keyed correctly
- * otherwise for some strange reason. As a side-effect,
- * sometimes there may be slightly un-updated bones, but
- * still, it is better that this worked.
- */
-
- QUATCOPY(oldQuat, pchan->quat);
- QUATCOPY(pchan->quat, localQuat);
-
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z);
+ int matok=0;
+ /* check one to make sure we're not trying to set visual rot keys on
+ bones inside of a chain, which only leads to tears. */
+ matok= insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W);
+ insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X);
+ insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y);
+ insertmatrixkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z);
- QUATCOPY(pchan->quat, oldQuat);
+ if (matok == 0) {
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z, 0);
+ }
}
if (event==15 && ob->action) {
bActionChannel *achan;
-
+
for (achan = ob->action->chanbase.first; achan; achan=achan->next){
if (achan->ipo && !strcmp (achan->name, pchan->name)){
for (icu = achan->ipo->curve.first; icu; icu=icu->next){
@@ -2874,12 +3217,28 @@ void common_insertkey(void)
break;
}
}
- }
+ }
+
+ /* clear unkeyed flag (it doesn't matter if it's set or not) */
+ if (pchan->bone)
+ pchan->bone->flag &= ~BONE_UNKEYED;
+
+ /* check if bone has a path */
+ if (pchan->path)
+ recalc_bonepaths = 1;
}
}
+
+ /* recalculate ipo handles, etc. */
if(ob->action)
remake_action_ipos(ob->action);
-
+
+ /* recalculate bone-paths on adding new keyframe? */
+ // TODO: currently, there is no setting to turn this on/off globally
+ if (recalc_bonepaths)
+ pose_calculate_path(ob);
+
+
allqueue(REDRAWIPO, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWNLA, 0);
@@ -2915,7 +3274,7 @@ void common_insertkey(void)
switch (event) {
case 9:
- insertkey(id, ID_OB, actname, NULL, icu->adrcode);
+ insertkey(id, ID_OB, actname, NULL, icu->adrcode, 0);
break;
case 15:
insertkey_smarter(id, ID_OB, actname, NULL, icu->adrcode);
@@ -2926,39 +3285,36 @@ void common_insertkey(void)
}
if(event==0 || event==3 ||event==4) {
- insertkey(id, ID_OB, actname, NULL, OB_LOC_X);
- insertkey(id, ID_OB, actname, NULL, OB_LOC_Y);
- insertkey(id, ID_OB, actname, NULL, OB_LOC_Z);
+ insertkey(id, ID_OB, actname, NULL, OB_LOC_X, 0);
+ insertkey(id, ID_OB, actname, NULL, OB_LOC_Y, 0);
+ insertkey(id, ID_OB, actname, NULL, OB_LOC_Z, 0);
}
if(event==1 || event==3 ||event==4) {
- insertkey(id, ID_OB, actname, NULL, OB_ROT_X);
- insertkey(id, ID_OB, actname, NULL, OB_ROT_Y);
- insertkey(id, ID_OB, actname, NULL, OB_ROT_Z);
+ insertkey(id, ID_OB, actname, NULL, OB_ROT_X, 0);
+ insertkey(id, ID_OB, actname, NULL, OB_ROT_Y, 0);
+ insertkey(id, ID_OB, actname, NULL, OB_ROT_Z, 0);
}
if(event==2 || event==4) {
- insertkey(id, ID_OB, actname, NULL, OB_SIZE_X);
- insertkey(id, ID_OB, actname, NULL, OB_SIZE_Y);
- insertkey(id, ID_OB, actname, NULL, OB_SIZE_Z);
+ insertkey(id, ID_OB, actname, NULL, OB_SIZE_X, 0);
+ insertkey(id, ID_OB, actname, NULL, OB_SIZE_Y, 0);
+ insertkey(id, ID_OB, actname, NULL, OB_SIZE_Z, 0);
}
if(event==5) {
/* remove localview */
tlay= base->object->lay;
base->object->lay &= 0xFFFFFF;
- insertkey(id, ID_OB, actname, NULL, OB_LAY);
+ insertkey(id, ID_OB, actname, NULL, OB_LAY, 0);
base->object->lay= tlay;
}
if(event==11 || event==13) {
- insertmatrixkey(id, ID_OB, actname, NULL, OB_LOC_X, ob->obmat[3][0]);
- insertmatrixkey(id, ID_OB, actname, NULL, OB_LOC_Y, ob->obmat[3][1]);
- insertmatrixkey(id, ID_OB, actname, NULL, OB_LOC_Z, ob->obmat[3][2]);
+ insertmatrixkey(id, ID_OB, actname, NULL, OB_LOC_X);
+ insertmatrixkey(id, ID_OB, actname, NULL, OB_LOC_Y);
+ insertmatrixkey(id, ID_OB, actname, NULL, OB_LOC_Z);
}
if(event==12 || event==13) {
- float eul[3];
-
- Mat4ToEul(ob->obmat, eul);
- insertmatrixkey(id, ID_OB, actname, NULL, OB_ROT_X, eul[0]*(5.72958));
- insertmatrixkey(id, ID_OB, actname, NULL, OB_ROT_Y, eul[1]*(5.72958));
- insertmatrixkey(id, ID_OB, actname, NULL, OB_ROT_Z, eul[2]*(5.72958));
+ insertmatrixkey(id, ID_OB, actname, NULL, OB_ROT_X);
+ insertmatrixkey(id, ID_OB, actname, NULL, OB_ROT_Y);
+ insertmatrixkey(id, ID_OB, actname, NULL, OB_ROT_Z);
}
base->object->recalc |= OB_RECALC_OB;
}
@@ -3178,51 +3534,73 @@ void clean_ipo(void)
void clean_ipo_curve(IpoCurve *icu)
{
- BezTriple *bezt=NULL, *beztn=NULL;
- BezTriple *newb, *newbs;
- int totCount, newCount, i;
+ BezTriple *old_bezts, *bezt, *beztn;
+ BezTriple *lastb;
+ int totCount, i;
float thresh;
/* check if any points */
- if (!icu) return;
- totCount= icu->totvert;
- newCount= 1;
- if (totCount<=1) return;
+ if (icu == NULL || icu->totvert <= 1)
+ return;
/* get threshold for match-testing */
thresh= G.scene->toolsettings->clean_thresh;
- /* add first keyframe and setup tempolary array of beztriples */
- newb = newbs = MEM_callocN(sizeof(BezTriple)*totCount, "NewBeztriples");
- bezt= icu->bezt;
- *newb= *bezt;
- bezt++;
+ /* make a copy of the old BezTriples, and clear IPO curve */
+ old_bezts = icu->bezt;
+ totCount = icu->totvert;
+ icu->bezt = NULL;
+ icu->totvert = 0;
- /* loop through beztriples, comparing them */
- for (i=0; i<totCount && newCount<totCount; i++, bezt++) {
+ /* now insert first keyframe, as it should be ok */
+ bezt = old_bezts;
+ insert_vert_icu(icu, bezt->vec[1][0], bezt->vec[1][1], 0);
+
+ /* Loop through BezTriples, comparing them. Skip any that do
+ * not fit the criteria for "ok" points.
+ */
+ for (i=1; i<totCount; i++) {
float prev[2], cur[2], next[2];
- /* get references for quicker access */
- memcpy(prev, newb->vec[1], 8);
- memcpy(cur, bezt->vec[1], 8);
-
+ /* get BezTriples and their values */
if (i < (totCount - 1)) {
- beztn = (bezt + 1);
- memcpy(next, beztn->vec[1], 8);
+ beztn = (old_bezts + (i+1));
+ next[0]= beztn->vec[1][0]; next[1]= beztn->vec[1][1];
}
else {
beztn = NULL;
next[0] = next[1] = 0.0f;
}
+ lastb= (icu->bezt + (icu->totvert - 1));
+ bezt= (old_bezts + i);
+
+ /* get references for quicker access */
+ prev[0] = lastb->vec[1][0]; prev[1] = lastb->vec[1][1];
+ cur[0] = bezt->vec[1][0]; cur[1] = bezt->vec[1][1];
/* check if current bezt occurs at same time as last ok */
- if ((cur[0] - prev[0]) <= thresh) {
- /* only add if values are a considerable distance apart */
- if (IS_EQT(cur[1], prev[1], thresh) == 0) {
+ if (IS_EQT(cur[0], prev[0], thresh)) {
+ /* If there is a next beztriple, and if occurs at the same time, only insert
+ * if there is a considerable distance between the points, and also if the
+ * current is further away than the next one is to the previous.
+ */
+ if (beztn && (IS_EQT(cur[0], next[0], thresh)) &&
+ (IS_EQT(next[1], prev[1], thresh)==0))
+ {
+ /* only add if current is further away from previous */
+ if (cur[1] > next[1]) {
+ if (IS_EQT(cur[1], prev[1], thresh) == 0) {
+ /* add new keyframe */
+ insert_vert_icu(icu, cur[0], cur[1], 0);
+ }
+ }
+ }
+ else {
+ /* only add if values are a considerable distance apart */
+ if (IS_EQT(cur[1], prev[1], thresh) == 0) {
/* add new keyframe */
- newCount++;
- newb++;
- *newb = *bezt;
+ insert_vert_icu(icu, cur[0], cur[1], 0);
+ }
}
}
else {
@@ -3231,51 +3609,26 @@ void clean_ipo_curve(IpoCurve *icu)
/* does current have same value as previous and next? */
if (IS_EQT(cur[1], prev[1], thresh) == 0) {
/* add new keyframe*/
- newb++;
- *newb = *bezt;
- newCount++;
+ insert_vert_icu(icu, cur[0], cur[1], 0);
}
else if (IS_EQT(cur[1], next[1], thresh) == 0) {
/* add new keyframe */
- newb++;
- *newb = *bezt;
- newCount++;
+ insert_vert_icu(icu, cur[0], cur[1], 0);
}
}
else {
/* add if value doesn't equal that of previous */
if (IS_EQT(cur[1], prev[1], thresh) == 0) {
/* add new keyframe */
- newb++;
- *newb = *bezt;
- newCount++;
+ insert_vert_icu(icu, cur[0], cur[1], 0);
}
}
}
}
-
- /* we only need to free stuff if the number of verts changed */
- if (totCount != newCount) {
- BezTriple *newbz;
-
- /* make better sized list */
- newbz= MEM_callocN(sizeof(BezTriple)*newCount, "BezTriples");
- memcpy(newbz, newbs, sizeof(BezTriple)*newCount);
-
- /* free and assign new */
- MEM_freeN(icu->bezt);
- MEM_freeN(newbs);
- icu->bezt= newbz;
- icu->totvert= newCount;
- }
- else {
- /* free memory we used */
- MEM_freeN(newbs);
- }
- /* fix up handles and make sure points are in order */
- sort_time_ipocurve(icu);
- calchandles_ipocurve(icu);
+ /* now free the memory used by the old BezTriples */
+ if (old_bezts)
+ MEM_freeN(old_bezts);
}
void smooth_ipo(void)
@@ -3512,7 +3865,7 @@ void ipo_snap(short event)
get_status_editipo();
/* map ipo-points for editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
actstrip_map_ipo_keys(OBACT, G.sipo->ipo, 0, 0);
}
@@ -3585,7 +3938,7 @@ void ipo_snap(short event)
}
/* undo mapping of ipo-points for editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
actstrip_map_ipo_keys(OBACT, G.sipo->ipo, 1, 0);
}
@@ -3609,7 +3962,7 @@ void ipo_mirror(short mode)
BezTriple *bezt;
int a, b;
- int ok, ok2;
+ short ok, ok2, i;
float diff;
/* what's this for? */
@@ -3620,7 +3973,7 @@ void ipo_mirror(short mode)
if (!ei) return;
/* map ipo-points for editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
actstrip_map_ipo_keys(OBACT, G.sipo->ipo, 0, 0);
}
@@ -3649,20 +4002,26 @@ void ipo_mirror(short mode)
switch (mode) {
case 1: /* mirror over current frame */
{
- diff= ((float)CFRA - bezt->vec[1][0]);
- bezt->vec[1][0]= ((float)CFRA + diff);
+ for (i=0; i<3; i++) {
+ diff= ((float)CFRA - bezt->vec[i][0]);
+ bezt->vec[i][0]= ((float)CFRA + diff);
+ }
}
break;
case 2: /* mirror over vertical axis (frame 0) */
{
- diff= (0.0f - bezt->vec[1][0]);
- bezt->vec[1][0]= (0.0f + diff);
+ for (i=0; i<3; i++) {
+ diff= (0.0f - bezt->vec[i][0]);
+ bezt->vec[i][0]= (0.0f + diff);
+ }
}
break;
case 3: /* mirror over horizontal axis */
{
- diff= (0.0f - bezt->vec[1][1]);
- bezt->vec[1][1]= (0.0f + diff);
+ for (i=0; i<3; i++) {
+ diff= (0.0f - bezt->vec[i][1]);
+ bezt->vec[i][1]= (0.0f + diff);
+ }
}
break;
}
@@ -3679,7 +4038,7 @@ void ipo_mirror(short mode)
}
/* undo mapping of ipo-points for editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
actstrip_map_ipo_keys(OBACT, G.sipo->ipo, 1, 0);
}
@@ -3877,64 +4236,108 @@ void paste_editipo(void)
{
EditIpo *ei;
IpoCurve *icu;
- int a, ok;
+ int a;
- if(G.sipo->showkey) return;
+ if (G.sipo->showkey) return;
- if(totipocopybuf==0) return;
- if(G.sipo->ipo==0) return;
- if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
+ if (totipocopybuf==0) return;
+ if (G.sipo->ipo==0) return;
+ if (G.sipo->ipo && G.sipo->ipo->id.lib) return;
get_status_editipo();
- if(totipo_vis==0) {
+ if (totipo_vis==0) {
error("No visible channels");
+ return;
}
- else if(totipo_vis!=totipocopybuf && totipo_sel!=totipocopybuf) {
+ else if (totipo_vis!=totipocopybuf && totipo_sel!=totipocopybuf) {
error("Incompatible paste");
+ return;
}
- else {
- /* prevent problems: splines visible that are not selected */
- if(totipo_vis==totipo_sel) totipo_vis= 0;
-
- icu= ipocopybuf.first;
- if(icu==0) return;
-
- ei= G.sipo->editipo;
- for(a=0; a<G.sipo->totipo; a++, ei++) {
- if(ei->flag & IPO_VISIBLE) {
- ok= 0;
- if(totipo_vis==totipocopybuf) ok= 1;
- if(totipo_sel==totipocopybuf && (ei->flag & IPO_SELECT)) ok= 1;
- if(ok) {
+ icu= ipocopybuf.first;
+
+ for (a=0, ei=G.sipo->editipo; a<G.sipo->totipo; a++, ei++) {
+ if (ei->flag & IPO_VISIBLE) {
+ /* don't attempt pasting if no valid buffer-curve to paste from anymore */
+ if (icu == 0) return;
- ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode);
- if(ei->icu==NULL) return;
-
- if(ei->icu->bezt) MEM_freeN(ei->icu->bezt);
- ei->icu->bezt= NULL;
- if(ei->icu->driver) MEM_freeN(ei->icu->driver);
- ei->icu->driver= NULL;
-
- ei->icu->totvert= icu->totvert;
- ei->icu->flag= ei->flag= icu->flag;
- ei->icu->extrap= icu->extrap;
- ei->icu->ipo= icu->ipo;
-
- if(icu->bezt)
- ei->icu->bezt= MEM_dupallocN(icu->bezt);
- if(icu->driver)
- ei->icu->driver= MEM_dupallocN(icu->driver);
+ /* if in editmode, paste keyframes */
+ if (ei->flag & IPO_EDIT) {
+ BezTriple *bezt;
+ float offset= 0.0f;
+ short offsetInit= 0;
+ int i;
+
+ /* make sure an ipo-curve exists (it may not, as this is an editipo) */
+ ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode);
+ if (ei->icu == NULL) return;
+
+ /* Copy selected beztriples from source icu onto this edit-icu,
+ * with all added keyframes being offsetted by the difference between
+ * the first source keyframe and the current frame.
+ */
+ for (i=0, bezt=icu->bezt; i < icu->totvert; i++, bezt++) {
+ /* skip if not selected */
+ if (BEZSELECTED(bezt) == 0) continue;
- icu= icu->next;
+ /* initialise offset (if not already done) */
+ if (offsetInit==0) {
+ offset= CFRA - bezt->vec[1][0];
+ offsetInit= 1;
+ }
+ /* temporarily apply offset to src beztriple while copying */
+ bezt->vec[0][0] += offset;
+ bezt->vec[1][0] += offset;
+ bezt->vec[2][0] += offset;
+
+ /* insert the keyframe */
+ insert_bezt_icu(ei->icu, bezt);
+ /* un-apply offset from src beztriple after copying */
+ bezt->vec[0][0] -= offset;
+ bezt->vec[1][0] -= offset;
+ bezt->vec[2][0] -= offset;
}
+
+ /* recalculate handles of curve that data was pasted into */
+ calchandles_ipocurve(ei->icu);
+
+ /* advance to next copy/paste buffer ipo-curve */
+ icu= icu->next;
+ }
+
+ /* otherwise paste entire curve data if selected */
+ else if (ei->flag & IPO_SELECT) {
+ /* make sure an ipo-curve exists (it may not, as this is an editipo) */
+ ei->icu= verify_ipocurve(G.sipo->from, G.sipo->blocktype, G.sipo->actname, G.sipo->constname, ei->adrcode);
+ if (ei->icu==NULL) return;
+
+ /* clear exisiting dynamic memory (keyframes, driver) */
+ if (ei->icu->bezt) MEM_freeN(ei->icu->bezt);
+ ei->icu->bezt= NULL;
+ if (ei->icu->driver) MEM_freeN(ei->icu->driver);
+ ei->icu->driver= NULL;
+
+ ei->icu->totvert= icu->totvert;
+ ei->icu->flag= ei->flag= icu->flag;
+ ei->icu->extrap= icu->extrap;
+ ei->icu->ipo= icu->ipo;
+
+ /* make a copy of the source icu's data */
+ if (icu->bezt)
+ ei->icu->bezt= MEM_dupallocN(icu->bezt);
+ if (icu->driver)
+ ei->icu->driver= MEM_dupallocN(icu->driver);
+
+ /* advance to next copy/paste buffer ipo-curve */
+ icu= icu->next;
}
}
- editipo_changed(G.sipo, 1);
- BIF_undo_push("Paste Ipo curves");
}
+
+ editipo_changed(G.sipo, 1);
+ BIF_undo_push("Paste Ipo curves");
}
/* *********************** */
@@ -3972,7 +4375,7 @@ void set_speed_editipo(float speed)
EditIpo *ei;
BezTriple *bezt, *beztar[3];
float vec1[3], vec2[3];
- int a, b, totvert, didit=0;
+ int a, b, totvert, didit=0, done_error = 0;
if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
@@ -4021,7 +4424,10 @@ void set_speed_editipo(float speed)
didit= 1;
}
else {
- error("Only works for 3 visible curves with handles");
+ if (done_error==0) {
+ error("Only works for 3 visible curves with handles");
+ }
+ done_error = 1;
}
}
}
@@ -4154,7 +4560,7 @@ void make_ipokey(void)
else ik->flag= 0;
/* map ipo-keys for drawing/editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
ik->val= get_action_frame_inv(OBACT, ik->val);
}
@@ -4258,7 +4664,7 @@ void make_ipokey_transform(Object *ob, ListBase *lb, int sel)
ik= lb->first;
while(ik) {
/* map ipo-keys for drawing/editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
ik->val= get_action_frame_inv(OBACT, ik->val);
}
@@ -4278,7 +4684,7 @@ void update_ipokey_val(void) /* after moving vertices */
ik->val= ik->data[a]->vec[1][0];
/* map ipo-keys for drawing/editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
ik->val= get_action_frame_inv(OBACT, ik->val);
}
break;
@@ -4470,485 +4876,435 @@ void movekey_obipo(int dir) /* only call external from view3d queue */
}
/* **************************************************** */
+/* IPO TRANSFORM TOOLS
+ *
+ * Only the helper functions are stored here these days. They are here as
+ * there are heaps of ugly globals which the IPO editor relies on.
+ * However, the actual transforms go through the transform system these days.
+ */
-
-void remake_ipo_transverts(TransVert *transmain, float *dvec, int tot)
+/* Helper function for make_ipo_transdata, which is reponsible for associating
+ * source data with transform data
+ */
+static void bezt_to_transdata (TransData *td, TransData2D *td2d, float *loc, float *cent, short selected, short onlytime)
{
- EditIpo *ei;
- TransVert *tv;
- BezTriple *bezt;
- int a, b;
+ /* New location from td gets dumped onto the old-location of td2d, which then
+ * gets copied to the actual data at td2d->loc2d (bezt->vec[n])
+ *
+ * Due to NLA scaling, we apply NLA scaling to some of the verts here,
+ * and then that scaling will be undone after transform is done.
+ */
- ei= G.sipo->editipo;
- for(a=0; a<G.sipo->totipo; a++, ei++) {
+ if (NLA_IPO_SCALED) {
+ td2d->loc[0] = get_action_frame_inv(OBACT, loc[0]);
+ td2d->loc[1] = loc[1];
+ td2d->loc[2] = 0.0f;
+ td2d->loc2d = loc;
- if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
-
- if(ei->icu->bezt) {
- sort_time_ipocurve(ei->icu);
- }
- }
+ td->flag = 0;
+ td->loc = td2d->loc;
+ VECCOPY(td->center, cent);
+ VECCOPY(td->iloc, td->loc);
}
-
- ei= G.sipo->editipo;
- tv= transmain;
- for(a=0; a<G.sipo->totipo; a++, ei++) {
+ else {
+ td2d->loc[0] = loc[0];
+ td2d->loc[1] = loc[1];
+ td2d->loc[2] = 0.0f;
+ td2d->loc2d = loc;
- if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
- if( (ei->flag & IPO_EDIT) || G.sipo->showkey) {
- if(ei->icu->bezt) {
- bezt= ei->icu->bezt;
- b= ei->icu->totvert;
- while(b--) {
- if(ei->icu->ipo==IPO_BEZ) {
- if(bezt->f1 & 1) {
- tv->loc= bezt->vec[0];
- tv++;
- }
- if(bezt->f3 & 1) {
- tv->loc= bezt->vec[2];
- tv++;
- }
- }
- if(bezt->f2 & 1) {
- tv->loc= bezt->vec[1];
- tv++;
- }
-
- bezt++;
- }
- testhandles_ipocurve(ei->icu);
- }
- }
- }
+ td->flag = 0;
+ td->loc = td2d->loc;
+ VECCOPY(td->center, cent);
+ VECCOPY(td->iloc, td->loc);
+ }
+
+ memset(td->axismtx, 0, sizeof(td->axismtx));
+ td->axismtx[2][2] = 1.0f;
+
+ td->ext= NULL; td->tdi= NULL; td->val= NULL;
+
+ if (selected) {
+ td->flag |= TD_SELECTED;
+ td->dist= 0.0;
}
+ else
+ td->dist= MAXFLOAT;
+
+ if (onlytime)
+ td->flag |= TD_TIMEONLY;
+
+ Mat3One(td->mtx);
+ Mat3One(td->smtx);
+}
+
+/* This function is called by createTransIpoData and remake_ipo_transdata to
+ * create the TransData and TransData2D arrays for transform. The costly counting
+ * stage is only performed for createTransIpoData case, and is indicated by t->total==-1;
+ */
+void make_ipo_transdata (TransInfo *t)
+{
+ TransData *td = NULL;
+ TransData2D *td2d = NULL;
- if(G.sipo->showkey) make_ipokey();
+ EditIpo *ei;
+ BezTriple *bezt;
+ int a, b;
- if(dvec==0) return;
+ /* countsel and propmode are used for proportional edit, which is not yet available */
+ int count=0/*, countsel=0*/;
+ /*int propmode = t->flag & T_PROP_EDIT;*/
- tv= transmain;
- for(a=0; a<tot; a++, tv++) {
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
- tv->oldloc[0] = get_action_frame_inv(OBACT, tv->loc[0]);
- tv->oldloc[0]-= dvec[0];
- tv->oldloc[0] = get_action_frame(OBACT, tv->loc[0]);
+ /* count data and allocate memory (if needed) */
+ if (t->total == 0) {
+ /* count data first */
+ if (totipo_vertsel) {
+ /* we're probably in editmode, so only selected verts */
+ count= totipo_vertsel;
+ }
+ else if (totipo_edit==0 && totipo_sel!=0) {
+ /* we're not in editmode, so entire curves get moved */
+ ei= G.sipo->editipo;
+ for (a=0; a<G.sipo->totipo; a++, ei++) {
+ if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu)) {
+ if (ei->icu->bezt && ei->icu->ipo==IPO_BEZ)
+ count+= 3*ei->icu->totvert;
+ else
+ count+= ei->icu->totvert;
+ }
+ }
+ if (count==0) return;
}
else {
- tv->oldloc[0]= tv->loc[0]-dvec[0];
+ /* this case should not happen */
+ return;
}
- tv->oldloc[1]= tv->loc[1]-dvec[1];
+
+ /* memory allocation */
+ /*t->total= (propmode)? count: countsel;*/
+ t->total= count;
+ t->data= MEM_callocN(t->total*sizeof(TransData), "TransData (IPO Editor)");
+ /* for each 2d vert a 3d vector is allocated, so that they can be treated just as if they were 3d verts */
+ t->data2d= MEM_callocN(t->total*sizeof(TransData2D), "TransData2D (IPO Editor)");
}
-}
-
-#define CLAMP_OFF 0
-#define CLAMP_X 1
-#define CLAMP_Y 2
-
-void transform_ipo(int mode)
-{
- EditIpo *ei;
- BezTriple *bezt;
- TransVert *transmain = NULL, *tv;
- float dx, dy, dvec[2], min[3], max[3], vec[2], div, cent[2], size[2], sizefac;
- int tot=0, a, b, firsttime=1, afbreek=0, dosort, clampAxis=CLAMP_OFF;
- unsigned short event = 0;
- short mval[2], val, xo, yo, xn, yn, xc, yc;
- char str[64];
-
- if(G.sipo->ipo && G.sipo->ipo->id.lib) return;
- if(G.sipo->editipo==0) return;
- if(mode=='r') return; /* from gesture */
- INIT_MINMAX(min, max);
+ td= t->data;
+ td2d= t->data2d;
- /* which vertices are involved */
- get_status_editipo();
- if(totipo_vertsel) {
- tot= totipo_vertsel;
- tv=transmain= MEM_callocN(tot*sizeof(TransVert), "transmain");
-
+ /* add verts */
+ if (totipo_vertsel) {
+ /* we're probably in editmode, so only selected verts */
ei= G.sipo->editipo;
- for(a=0; a<G.sipo->totipo; a++, ei++) {
-
+ for (a=0; a<G.sipo->totipo; a++, ei++) {
+ /* only consider those curves that are visible and are being edited/used for showkeys */
if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
- if( (ei->flag & IPO_EDIT) || G.sipo->showkey) {
-
-
- if(ei->icu->bezt) {
+ if ( (ei->flag & IPO_EDIT) || G.sipo->showkey) {
+ if (ei->icu->bezt) {
+ short onlytime= (ei->disptype==IPO_DISPBITS) ? 1 : (G.sipo->showkey) ? 1 : 0;
bezt= ei->icu->bezt;
- b= ei->icu->totvert;
- while(b--) {
- if(ei->icu->ipo==IPO_BEZ) {
- if(bezt->f1 & 1) {
- tv->loc= bezt->vec[0];
- VECCOPY(tv->oldloc, tv->loc);
- if(ei->disptype==IPO_DISPBITS) tv->flag= 1;
-
- /* we take the middle vertex */
- DO_MINMAX2(bezt->vec[1], min, max);
-
- tv++;
- }
- if(bezt->f3 & 1) {
- tv->loc= bezt->vec[2];
- VECCOPY(tv->oldloc, tv->loc);
- if(ei->disptype==IPO_DISPBITS) tv->flag= 1;
-
- /* we take the middle vertex */
- DO_MINMAX2(bezt->vec[1], min, max);
-
- tv++;
- }
+
+ for (b=0; b < ei->icu->totvert; b++, bezt++) {
+ /* only include handles if selected, and interpolaton mode uses beztriples */
+ if (ei->icu->ipo==IPO_BEZ) {
+ if (bezt->f1 & 1)
+ bezt_to_transdata(td++, td2d++, bezt->vec[0], bezt->vec[1], 1, onlytime);
+ if (bezt->f3 & 1)
+ bezt_to_transdata(td++, td2d++, bezt->vec[2], bezt->vec[1], 1, onlytime);
}
- if(bezt->f2 & 1) {
- tv->loc= bezt->vec[1];
- VECCOPY(tv->oldloc, tv->loc);
- if(ei->disptype==IPO_DISPBITS) tv->flag= 1;
- DO_MINMAX2(bezt->vec[1], min, max);
- tv++;
+
+ /* only include main vert if selected */
+ if (bezt->f2 & 1) {
+ bezt_to_transdata(td++, td2d++, bezt->vec[1], bezt->vec[1], 1, onlytime);
}
- bezt++;
}
}
}
}
}
-
}
- else if(totipo_edit==0 && totipo_sel!=0) {
-
- ei= G.sipo->editipo;
- for(a=0; a<G.sipo->totipo; a++, ei++) {
- if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu)) {
- if(ei->icu->bezt && ei->icu->ipo==IPO_BEZ) tot+= 3*ei->icu->totvert;
- else tot+= ei->icu->totvert;
- }
- }
- if(tot==0) return;
-
- tv=transmain= MEM_callocN(tot*sizeof(TransVert), "transmain");
-
+ else if (totipo_edit==0 && totipo_sel!=0) {
+ /* we're not in editmode, so entire curves get moved */
ei= G.sipo->editipo;
- for(a=0; a<G.sipo->totipo; a++, ei++) {
+ for (a=0; a<G.sipo->totipo; a++, ei++) {
+ /* only include curves that are visible and selected */
if (ISPOIN3(ei, flag & IPO_VISIBLE, flag & IPO_SELECT, icu)) {
- if(ei->icu->bezt) {
-
+ if (ei->icu->bezt) {
+ short onlytime= (ei->disptype==IPO_DISPBITS) ? 1 : (G.sipo->showkey) ? 1 : 0;
bezt= ei->icu->bezt;
b= ei->icu->totvert;
- while(b--) {
- if(ei->icu->ipo==IPO_BEZ) {
- tv->loc= bezt->vec[0];
- VECCOPY(tv->oldloc, tv->loc);
- if(ei->disptype==IPO_DISPBITS) tv->flag= 1;
- tv++;
-
- tv->loc= bezt->vec[2];
- VECCOPY(tv->oldloc, tv->loc);
- if(ei->disptype==IPO_DISPBITS) tv->flag= 1;
- tv++;
+
+ for (b=0; b < ei->icu->totvert; b++, bezt++) {
+ /* only include handles if interpolation mode is bezier not bpoint */
+ if (ei->icu->ipo==IPO_BEZ) {
+ bezt_to_transdata(td++, td2d++, bezt->vec[0], bezt->vec[1], 1, onlytime);
+ bezt_to_transdata(td++, td2d++, bezt->vec[2], bezt->vec[1], 1, onlytime);
}
- tv->loc= bezt->vec[1];
- VECCOPY(tv->oldloc, tv->loc);
- if(ei->disptype==IPO_DISPBITS) tv->flag= 1;
-
- DO_MINMAX2(bezt->vec[1], min, max);
-
- tv++;
- bezt++;
+ /* always include the main handle */
+ bezt_to_transdata(td++, td2d++, bezt->vec[1], bezt->vec[1], 1, onlytime);
}
}
}
}
-
}
+}
- if(tot==0) {
- if(totipo_edit==0) move_keys(OBACT);
- return;
- }
+/* ------------------------ */
- cent[0]= (float)((min[0]+max[0])/2.0);
- cent[1]= (float)((min[1]+max[1])/2.0);
+/* struct for use in re-sorting BezTriples during IPO transform */
+typedef struct BeztMap {
+ BezTriple *bezt;
+ int oldIndex; /* index of bezt in icu->bezt array before sorting */
+ int newIndex; /* index of bezt in icu->bezt array after sorting */
+ short swapHs; /* swap order of handles (-1=clear; 0=not checked, 1=swap) */
+} BeztMap;
- if(G.sipo->showkey) {
- clampAxis = CLAMP_Y;
- }
+
+/* This function converts an IpoCurve's BezTriple array to a BeztMap array
+ * NOTE: this allocates memory that will need to get freed later
+ */
+static BeztMap *bezt_to_beztmaps (BezTriple *bezts, int totvert)
+{
+ BezTriple *bezt= bezts;
+ BeztMap *bezm, *bezms;
+ int i;
- ipoco_to_areaco(G.v2d, cent, mval);
- xc= mval[0];
- yc= mval[1];
+ /* allocate memory for this array */
+ if (totvert==0 || bezts==NULL)
+ return NULL;
+ bezm= bezms= MEM_callocN(sizeof(BeztMap)*totvert, "BeztMaps");
- getmouseco_areawin(mval);
- xo= xn= mval[0];
- yo= yn= mval[1];
- dvec[0]= dvec[1]= 0.0;
+ /* assign beztriples to beztmaps */
+ for (i=0; i < totvert; i++, bezm++, bezt++) {
+ bezm->bezt= bezt;
+ bezm->oldIndex= i;
+ bezm->newIndex= i;
+ }
- sizefac= (float)(sqrt( (float)((yc-yn)*(yc-yn)+(xn-xc)*(xn-xc)) ));
- if(sizefac<2.0) sizefac= 2.0;
+ return bezms;
+}
- while(afbreek==0) {
- getmouseco_areawin(mval);
- if(mval[0]!=xo || mval[1]!=yo || firsttime) {
-
- if(mode=='g') {
-
- dx= (float)(mval[0]- xo);
- dy= (float)(mval[1]- yo);
-
- div= (float)(G.v2d->mask.xmax-G.v2d->mask.xmin);
- dvec[0]+= (G.v2d->cur.xmax-G.v2d->cur.xmin)*(dx)/div;
+/* This function copies the code of sort_time_ipocurve, but acts on BeztMap structs instead */
+static void sort_time_beztmaps (BeztMap *bezms, int totvert)
+{
+ BeztMap *bezm;
+ int i, ok= 1;
- div= (float)(G.v2d->mask.ymax-G.v2d->mask.ymin);
- dvec[1]+= (G.v2d->cur.ymax-G.v2d->cur.ymin)*(dy)/div;
-
- if(clampAxis) dvec[clampAxis-1]= 0.0;
-
- /* vec is reused below: remake_ipo_transverts */
- vec[0]= dvec[0];
- vec[1]= dvec[1];
-
- apply_keyb_grid(vec, 0.0, (float)1.0, (float)0.1, U.flag & USER_AUTOGRABGRID);
- apply_keyb_grid(vec+1, 0.0, (float)1.0, (float)0.1, 0);
-
- tv= transmain;
- for(a=0; a<tot; a++, tv++) {
- /* adjust times for scaled ipos */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
- tv->loc[0] = get_action_frame_inv(OBACT, tv->oldloc[0]);
- tv->loc[0]+= vec[0];
- tv->loc[0] = get_action_frame(OBACT, tv->loc[0]);
- }
- else {
- tv->loc[0]= tv->oldloc[0]+vec[0];
- }
-
- if(tv->flag==0) tv->loc[1]= tv->oldloc[1]+vec[1];
- }
-
- if (clampAxis == CLAMP_Y)
- sprintf(str, "X: %.3f ", vec[0]);
- else if (clampAxis == CLAMP_X)
- sprintf(str, "Y: %.3f ", vec[1]);
- else
- sprintf(str, "X: %.3f Y: %.3f ", vec[0], vec[1]);
-
- headerprint(str);
- }
- else if(mode=='s') {
-
- size[0]=size[1]=(float)( (sqrt( (float)((yc-mval[1])*(yc-mval[1])+(mval[0]-xc)*(mval[0]-xc)) ))/sizefac);
-
- if(clampAxis) size[clampAxis-1]= 1.0;
-
- apply_keyb_grid(size, 0.0, (float)0.2, (float)0.1, U.flag & USER_AUTOSIZEGRID);
- apply_keyb_grid(size+1, 0.0, (float)0.2, (float)0.1, U.flag & USER_AUTOSIZEGRID);
-
- tv= transmain;
-
- for(a=0; a<tot; a++, tv++) {
- /* adjust times for scaled ipo's */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
- tv->loc[0] = get_action_frame_inv(OBACT, tv->oldloc[0]) - get_action_frame_inv(OBACT, cent[0]);
- tv->loc[0]*= size[0];
- tv->loc[0]+= get_action_frame_inv(OBACT, cent[0]);
- tv->loc[0] = get_action_frame(OBACT, tv->loc[0]);
- }
- else {
- tv->loc[0]= size[0]*(tv->oldloc[0]-cent[0])+ cent[0];
- }
+ /* keep repeating the process until nothing is out of place anymore */
+ while (ok) {
+ ok= 0;
+
+ bezm= bezms;
+ i= totvert;
+ while (i--) {
+ /* is current bezm out of order (i.e. occurs later than next)? */
+ if (i > 0) {
+ if (bezm->bezt->vec[1][0] > (bezm+1)->bezt->vec[1][0]) {
+ bezm->newIndex++;
+ (bezm+1)->newIndex--;
- if(tv->flag==0) tv->loc[1]= size[1]*(tv->oldloc[1]-cent[1])+ cent[1];
- }
-
- if (clampAxis == CLAMP_Y)
- sprintf(str, "scaleX: %.3f ", size[0]);
- else if (clampAxis == CLAMP_X)
- sprintf(str, "scaleY: %.3f ", size[1]);
- else
- sprintf(str, "scaleX: %.3f scaleY: %.3f ", size[0], size[1]);
-
- headerprint(str);
-
- }
-
- xo= mval[0];
- yo= mval[1];
-
- dosort= 0;
- ei= G.sipo->editipo;
- for(a=0; a<G.sipo->totipo; a++, ei++) {
- if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
+ SWAP(BeztMap, *bezm, *(bezm+1));
- /* watch it: if the time is wrong: do not correct handles */
- if (test_time_ipocurve(ei->icu) ) dosort++;
- else testhandles_ipocurve(ei->icu);
+ ok= 1;
}
}
- if(dosort) {
- if(mode=='g') remake_ipo_transverts(transmain, vec, tot);
- else remake_ipo_transverts(transmain, 0, tot);
+ /* do we need to check if the handles need to be swapped?
+ * optimisation: this only needs to be performed in the first loop
+ */
+ if (bezm->swapHs == 0) {
+ if ( (bezm->bezt->vec[0][0] > bezm->bezt->vec[1][0]) &&
+ (bezm->bezt->vec[2][0] < bezm->bezt->vec[1][0]) )
+ {
+ /* handles need to be swapped */
+ bezm->swapHs = 1;
+ }
+ else {
+ /* handles need to be cleared */
+ bezm->swapHs = -1;
+ }
}
- if(G.sipo->showkey) update_ipokey_val();
- calc_ipo(G.sipo->ipo, (float)CFRA);
+ bezm++;
+ }
+ }
+}
- /* update realtime */
- if(G.sipo->lock) {
- if(G.sipo->blocktype==ID_MA || G.sipo->blocktype==ID_TE) {
- do_ipo(G.sipo->ipo);
- force_draw_plus(SPACE_BUTS, 0);
- }
- else if(G.sipo->blocktype==ID_CA) {
- do_ipo(G.sipo->ipo);
- force_draw_plus(SPACE_VIEW3D, 0);
- }
- else if(G.sipo->blocktype==ID_KE) {
- Object *ob= OBACT;
- if(ob) {
- ob->shapeflag &= ~OB_SHAPE_TEMPLOCK;
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+/* This function firstly adjusts the pointers that the transdata has to each BezTriple*/
+static void beztmap_to_data (TransInfo *t, EditIpo *ei, BeztMap *bezms, int totvert)
+{
+ BezTriple *bezts = ei->icu->bezt;
+ BeztMap *bezm;
+ TransData2D *td;
+ int i, j;
+ char *adjusted;
+
+ /* dynamically allocate an array of chars to mark whether an TransData's
+ * pointers have been fixed already, so that we don't override ones that are
+ * already done
+ */
+ adjusted= MEM_callocN(t->total, "beztmap_adjusted_map");
+
+ /* for each beztmap item, find if it is used anywhere */
+ bezm= bezms;
+ for (i= 0; i < totvert; i++, bezm++) {
+ /* 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++) {
+ /* skip item if already marked */
+ if (adjusted[j] != 0) continue;
+
+ if (totipo_vertsel) {
+ /* only selected verts */
+ if (ei->icu->ipo==IPO_BEZ) {
+ if (bezm->bezt->f1 & 1) {
+ 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;
+ }
}
- force_draw_plus(SPACE_VIEW3D, 0);
- }
- else if(G.sipo->blocktype==ID_PO) {
- Object *ob= OBACT;
- if(ob && ob->pose) {
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ if (bezm->bezt->f3 & 1) {
+ 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;
+ }
}
- force_draw_plus(SPACE_VIEW3D, 0);
}
- else if(G.sipo->blocktype==ID_OB) {
- Base *base= FIRSTBASE;
-
- while(base) {
- if(base->object->ipo==G.sipo->ipo) {
- do_ob_ipo(base->object);
- base->object->recalc |= OB_RECALC_OB;
- }
- base= base->next;
+ if (bezm->bezt->f2 & 1) {
+ if (td->loc2d == bezm->bezt->vec[1]) {
+ td->loc2d= (bezts + bezm->newIndex)->vec[1];
+ adjusted[j] = 1;
}
- DAG_scene_flush_update(G.scene, screen_view3d_layers());
- force_draw_plus(SPACE_VIEW3D, 0);
}
- else force_draw(0);
}
else {
- force_draw(0);
- }
- firsttime= 0;
- }
- else BIF_wait_for_statechange();
-
- while(qtest()) {
- event= extern_qread(&val);
- if(val) {
- switch(event) {
- case ESCKEY:
- case LEFTMOUSE:
- case RIGHTMOUSE:
- case SPACEKEY:
- case RETKEY:
- afbreek= 1;
- break;
- case MIDDLEMOUSE:
- if(G.sipo->showkey==0) {
- if (clampAxis == CLAMP_OFF)
- {
- if( abs(mval[0]-xn) > abs(mval[1]-yn))
- clampAxis = CLAMP_Y;
- else
- clampAxis = CLAMP_X;
- }
+ /* whole curve */
+ if (ei->icu->ipo==IPO_BEZ) {
+ if (td->loc2d == bezm->bezt->vec[0]) {
+ if (bezm->swapHs == 1)
+ td->loc2d= (bezts + bezm->newIndex)->vec[2];
else
- {
- clampAxis = CLAMP_OFF;
- }
- firsttime= 1;
+ td->loc2d= (bezts + bezm->newIndex)->vec[0];
+ adjusted[j] = 1;
}
- break;
- case XKEY:
- /* clampAxis is the axis that will be Zeroed out, which is why we clamp
- * on Y when pressing X
- */
- if (clampAxis == CLAMP_Y)
- clampAxis = CLAMP_OFF; // Clamp Off if already on Y
- else
- clampAxis = CLAMP_Y; // On otherwise
- firsttime= 1;
- break;
- case YKEY:
- /* clampAxis is the axis that will be Zeroed out, which is why we clamp
- * on X when pressing Y
- */
- if (clampAxis == CLAMP_X)
- clampAxis = CLAMP_OFF; // Clamp Off if already on X
- else
- clampAxis = CLAMP_X; // On otherwise
- firsttime= 1;
- break;
- case LEFTCTRLKEY:
- case RIGHTCTRLKEY:
- firsttime= 1;
- break;
- default:
- if(mode=='g') {
- if(G.qual & LR_CTRLKEY) {
- if(event==LEFTARROWKEY) {dvec[0]-= 1.0; firsttime= 1;}
- else if(event==RIGHTARROWKEY) {dvec[0]+= 1.0; firsttime= 1;}
- else if(event==UPARROWKEY) {dvec[1]+= 1.0; firsttime= 1;}
- else if(event==DOWNARROWKEY) {dvec[1]-= 1.0; firsttime= 1;}
- }
- else arrows_move_cursor(event);
+
+ 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 arrows_move_cursor(event);
}
- }
- if(afbreek) break;
- }
- }
-
- if(event==ESCKEY || event==RIGHTMOUSE) {
- tv= transmain;
- for(a=0; a<tot; a++, tv++) {
- tv->loc[0]= tv->oldloc[0];
- tv->loc[1]= tv->oldloc[1];
- }
-
- dosort= 0;
- ei= G.sipo->editipo;
- for(a=0; a<G.sipo->totipo; a++, ei++) {
- if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
- if( (ei->flag & IPO_EDIT) || G.sipo->showkey) {
- if( test_time_ipocurve(ei->icu)) {
- dosort= 1;
- break;
- }
+ if (td->loc2d == bezm->bezt->vec[1]) {
+ td->loc2d= (bezts + bezm->newIndex)->vec[1];
+ adjusted[j] = 1;
}
}
}
- if(dosort) remake_ipo_transverts(transmain, 0, tot);
-
- ei= G.sipo->editipo;
- for(a=0; a<G.sipo->totipo; a++, ei++) {
- if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
- if( (ei->flag & IPO_EDIT) || G.sipo->showkey) {
- testhandles_ipocurve(ei->icu);
- }
+ }
+
+ /* free temp memory used for 'adjusted' array */
+ MEM_freeN(adjusted);
+}
+
+/* This function is called by recalcData during the Transform loop to recalculate
+ * the handles of curves and sort the keyframes so that the curves draw correctly.
+ * It is only called if some keyframes have moved out of order.
+ */
+void remake_ipo_transdata (TransInfo *t)
+{
+ EditIpo *ei;
+ int a;
+
+ /* sort and reassign verts */
+ ei= G.sipo->editipo;
+ for (a=0; a<G.sipo->totipo; a++, ei++) {
+ if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
+ if (ei->icu->bezt) {
+ BeztMap *bezm;
+
+ /* adjust transform-data pointers */
+ bezm= bezt_to_beztmaps(ei->icu->bezt, ei->icu->totvert);
+ sort_time_beztmaps(bezm, ei->icu->totvert);
+ beztmap_to_data(t, ei, bezm, ei->icu->totvert);
+
+ /* re-sort actual beztriples (perhaps this could be done using the beztmaps to save time?) */
+ sort_time_ipocurve(ei->icu);
+
+ /* free mapping stuff */
+ MEM_freeN(bezm);
+
+ /* make sure handles are all set correctly */
+ testhandles_ipocurve(ei->icu);
}
}
- calc_ipo(G.sipo->ipo, (float)CFRA);
}
- else BIF_undo_push("Transform Ipo");
+
+ /* remake ipokeys */
+ if (G.sipo->showkey) make_ipokey();
+}
+/* This function acts as the entrypoint for transforms in the IPO editor (as for
+ * the Action and NLA editors). The actual transform loop is not here anymore.
+ */
+void transform_ipo (int mode)
+{
+ short tmode;
+
+ /* data-validation */
+ if (G.sipo->ipo && G.sipo->ipo->id.lib) return;
+ if (G.sipo->editipo==0) return;
+
+ /* convert ascii-based mode to transform system constants (mode) */
+ switch (mode) {
+ case 'g':
+ tmode= TFM_TRANSLATION;
+ break;
+ case 'r':
+ tmode= TFM_ROTATION;
+ break;
+ case 's':
+ tmode= TFM_RESIZE;
+ break;
+ default:
+ tmode= 0;
+ return;
+ }
+
+ /* the transform system method involved depends on the selection */
+ get_status_editipo();
+ if (totipo_vertsel) {
+ /* we're probably in editmode, so only selected verts - transform system */
+ initTransform(tmode, CTX_NONE);
+ Transform();
+ }
+ else if (totipo_edit==0 && totipo_sel!=0) {
+ /* we're not in editmode, so entire curves get moved - transform system*/
+ initTransform(tmode, CTX_NONE);
+ Transform();
+ }
+ else {
+ /* shapekey mode? special transform code */
+ if (totipo_edit==0)
+ move_keys(OBACT);
+ return;
+ }
+
+ /* cleanup */
editipo_changed(G.sipo, 1);
-
- MEM_freeN(transmain);
}
+/**************************************************/
+
void filter_sampledata(float *data, int sfra, int efra)
{
float *da;
@@ -5096,7 +5452,7 @@ void ipo_record(void)
waitcursor(1);
tottime= 0.0;
- swaptime= 1.0/(float)G.scene->r.frs_sec;
+ swaptime= 1.0/FPS;
cfrao= CFRA;
cfra=efra= SFRA;
diff --git a/source/blender/src/editipo_lib.c b/source/blender/src/editipo_lib.c
index 96be44e1234..b0d15910d95 100644
--- a/source/blender/src/editipo_lib.c
+++ b/source/blender/src/editipo_lib.c
@@ -34,12 +34,15 @@
#include "DNA_curve_types.h"
#include "DNA_ipo_types.h"
+#include "DNA_key_types.h"
+#include "DNA_object_types.h"
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
#include "DNA_view3d_types.h"
#include "BKE_global.h"
#include "BKE_ipo.h"
+#include "BKE_key.h"
#include "BKE_utildefines.h"
#include "BIF_resources.h"
@@ -56,9 +59,9 @@ char *ob_ic_names[OB_TOTNAM] = { "LocX", "LocY", "LocZ", "dLocX", "dLocY", "dLoc
"RotX", "RotY", "RotZ", "dRotX", "dRotY", "dRotZ",
"ScaleX", "ScaleY", "ScaleZ", "dScaleX", "dScaleY", "dScaleZ",
"Layer", "Time", "ColR", "ColG", "ColB", "ColA",
- "FStreng", "FFall", "RDamp", "Damping", "Perm" };
+ "FStreng", "FFall", "RDamp", "Damping", "Perm", "FMaxD" };
-char *co_ic_names[CO_TOTNAM] = { "Inf" };
+char *co_ic_names[CO_TOTNAM] = { "Inf", "HeadTail" };
char *mtex_ic_names[TEX_TOTNAM] = { "OfsX", "OfsY", "OfsZ", "SizeX", "SizeY", "SizeZ",
"texR", "texG", "texB", "DefVar", "Col", "Nor", "Var",
"Disp" };
@@ -98,6 +101,9 @@ char *ac_ic_names[AC_TOTNAM] = {"LocX", "LocY", "LocZ", "ScaleX", "ScaleY",
"ScaleZ", "QuatW", "QuatX", "QuatY", "QuatZ"};
char *ic_name_empty[1] ={ "" };
char *fluidsim_ic_names[FLUIDSIM_TOTNAM] = { "Fac-Visc", "Fac-Time", "GravX","GravY","GravZ", "VelX","VelY","VelZ", "Active" };
+char *part_ic_names[PART_TOTNAM] = { "E_Freq", "E_Life", "E_Speed", "E_Angular", "E_Size",
+"Angular", "Size", "Drag", "Brown", "Damp", "Length", "Clump",
+"GravX", "GravY", "GravZ", "KinkAmp", "KinkFreq", "KinkShape", "BBTilt"};
/* gets the appropriate icon for the given blocktype */
int geticon_ipo_blocktype(short blocktype)
@@ -130,8 +136,11 @@ int geticon_ipo_blocktype(short blocktype)
}
}
-/* get name of ipo-curve (icu should be valid pointer) */
-char *getname_ipocurve(IpoCurve *icu)
+/* get name of ipo-curve
+ * - icu should be valid pointer
+ * - ob is only needed for a shapekey-related hack
+ */
+char *getname_ipocurve(IpoCurve *icu, Object *ob)
{
switch (icu->blocktype) {
case ID_OB:
@@ -140,11 +149,17 @@ char *getname_ipocurve(IpoCurve *icu)
return getname_ac_ei(icu->adrcode);
case ID_KE:
{
- /* quick 'hack' - must find a better solution to this
- * although shapekey ipo-curves can have names,
- * we don't have access to that info yet.
- */
static char name[32];
+ Key *key= ob_get_key(ob);
+ KeyBlock *kb= key_get_keyblock(key, icu->adrcode);
+
+ /* only return name if it has been set, otherwise use
+ * default method using static string (Key #)
+ */
+ if ((kb) && (kb->name[0] != '\0'))
+ return kb->name; /* return keyblock's name */
+
+ /* in case keyblock is not named or no key/keyblock was found */
sprintf(name, "Key %d", icu->adrcode);
return name;
}
@@ -179,6 +194,7 @@ char *getname_co_ei(int nr)
{
switch(nr){
case CO_ENFORCE:
+ case CO_HEADTAIL:
return co_ic_names[nr-1];
}
return ic_name_empty[0];
@@ -186,7 +202,7 @@ char *getname_co_ei(int nr)
char *getname_ob_ei(int nr, int colipo)
{
- if(nr>=OB_LOC_X && nr <= OB_PD_PERM) return ob_ic_names[nr-1];
+ if(nr>=OB_LOC_X && nr <= OB_PD_FMAXD) return ob_ic_names[nr-1];
return ic_name_empty[0];
}
@@ -261,9 +277,14 @@ char *getname_fluidsim_ei(int nr)
if(nr <= FLUIDSIM_TOTIPO) return fluidsim_ic_names[nr-1];
return ic_name_empty[0];
}
+char *getname_part_ei(int nr)
+{
+ if(nr <= PART_TOTIPO) return part_ic_names[nr-1];
+ return ic_name_empty[0];
+}
-void boundbox_ipocurve(IpoCurve *icu)
+void boundbox_ipocurve(IpoCurve *icu, int selectedonly)
{
BezTriple *bezt;
float vec[3]={0.0,0.0,0.0};
@@ -278,20 +299,25 @@ void boundbox_ipocurve(IpoCurve *icu)
bezt= icu->bezt;
while(a--) {
if(icu->vartype & IPO_BITS) {
- vec[0]= bezt->vec[1][0];
- vec[1]= 0.0;
- DO_MINMAX(vec, min, max);
-
- vec[1]= 16.0;
- DO_MINMAX(vec, min, max);
+ if((bezt->f2 & 1) || !selectedonly) {
+ vec[0]= bezt->vec[1][0];
+ vec[1]= 0.0;
+ DO_MINMAX(vec, min, max);
+
+ vec[1]= 16.0;
+ DO_MINMAX(vec, min, max);
+ }
}
else {
- if(icu->ipo==IPO_BEZ && a!=icu->totvert-1) {
- DO_MINMAX(bezt->vec[0], min, max);
+ if((bezt->f1 & 1) || !selectedonly) {
+ if(icu->ipo==IPO_BEZ && a!=icu->totvert-1)
+ DO_MINMAX(bezt->vec[0], min, max);
}
- DO_MINMAX(bezt->vec[1], min, max);
- if(icu->ipo==IPO_BEZ && a!=0) {
- DO_MINMAX(bezt->vec[2], min, max);
+ if((bezt->f2 & 1) || !selectedonly)
+ DO_MINMAX(bezt->vec[1], min, max);
+ if((bezt->f3 & 1) || !selectedonly) {
+ if(icu->ipo==IPO_BEZ && a!=0)
+ DO_MINMAX(bezt->vec[2], min, max);
}
}
@@ -313,7 +339,7 @@ void boundbox_ipocurve(IpoCurve *icu)
}
}
-void boundbox_ipo(Ipo *ipo, rctf *bb)
+void boundbox_ipo(Ipo *ipo, rctf *bb, int selectedonly)
{
IpoCurve *icu;
int first= 1;
@@ -321,7 +347,7 @@ void boundbox_ipo(Ipo *ipo, rctf *bb)
icu= ipo->curve.first;
while(icu) {
- boundbox_ipocurve(icu);
+ boundbox_ipocurve(icu, selectedonly);
if(first) {
*bb= icu->totrct;
@@ -371,3 +397,5 @@ int texchannel_to_adrcode(int channel)
}
+
+
diff --git a/source/blender/src/editipo_mods.c b/source/blender/src/editipo_mods.c
index 2621ad54979..c0fea15ac88 100644
--- a/source/blender/src/editipo_mods.c
+++ b/source/blender/src/editipo_mods.c
@@ -58,6 +58,7 @@
#include "BKE_key.h"
#include "BKE_utildefines.h"
+#include "BIF_editaction.h"
#include "BIF_interface.h"
#include "BIF_screen.h"
#include "BIF_space.h"
@@ -574,6 +575,14 @@ static int snap_bezier_nearest(BezTriple *bezt)
return 0;
}
+static int snap_bezier_nearestsec(BezTriple *bezt)
+{
+ float secf = FPS;
+ if(bezt->f2 & SELECT)
+ bezt->vec[1][0]= (float)(floor(bezt->vec[1][0]/secf + 0.5f) * secf);
+ return 0;
+}
+
static int snap_bezier_cframe(BezTriple *bezt)
{
if(bezt->f2 & SELECT)
@@ -592,7 +601,7 @@ static int snap_bezier_nearmarker(BezTriple *bezt)
void snap_ipo_keys(Ipo *ipo, short snaptype)
{
switch (snaptype) {
- case 1: /* snap to nearest */
+ case 1: /* snap to nearest frame */
ipo_keys_bezier_loop(ipo, snap_bezier_nearest, calchandles_ipocurve);
break;
case 2: /* snap to current frame */
@@ -601,6 +610,9 @@ void snap_ipo_keys(Ipo *ipo, short snaptype)
case 3: /* snap to nearest marker */
ipo_keys_bezier_loop(ipo, snap_bezier_nearmarker, calchandles_ipocurve);
break;
+ case 4: /* snap to nearest second */
+ ipo_keys_bezier_loop(ipo, snap_bezier_nearestsec, calchandles_ipocurve);
+ break;
default: /* just in case */
ipo_keys_bezier_loop(ipo, snap_bezier_nearest, calchandles_ipocurve);
break;
@@ -860,9 +872,8 @@ void setipotype_ipo(Ipo *ipo, int code)
void setexprap_ipoloop(Ipo *ipo, int code)
{
IpoCurve *icu;
-
- /* Loop through each curve in the Ipo
- */
+
+ /* Loop through each curve in the Ipo */
for (icu=ipo->curve.first; icu; icu=icu->next)
icu->extrap= code;
}
@@ -927,7 +938,7 @@ void borderselect_ipo(void)
if(val) {
/* map ipo-points for editing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
actstrip_map_ipo_keys(OBACT, G.sipo->ipo, 0, 0);
}
@@ -979,7 +990,7 @@ void borderselect_ipo(void)
}
/* undo mapping of ipo-points for drawing if scaled ipo */
- if (OBACT && OBACT->action && G.sipo->pin==0 && G.sipo->actname) {
+ if (NLA_IPO_SCALED) {
actstrip_map_ipo_keys(OBACT, G.sipo->ipo, 1, 0);
}
diff --git a/source/blender/src/editkey.c b/source/blender/src/editkey.c
index 975f792d2b9..671889d6431 100644
--- a/source/blender/src/editkey.c
+++ b/source/blender/src/editkey.c
@@ -184,8 +184,8 @@ static void rvk_slider_func(void *voidob, void *voidkeynum)
/* create the bezier triple if one doesn't exist,
* otherwise modify it's value
*/
- if (!bezt) {
- insert_vert_ipo(icu, cfra, meshslidervals[keynum]);
+ if (bezt == NULL) {
+ insert_vert_icu(icu, cfra, meshslidervals[keynum], 0);
}
else {
bezt->vec[1][1] = meshslidervals[keynum];
@@ -381,7 +381,7 @@ static KeyBlock *add_keyblock(Key *key)
if(key->type == KEY_RELATIVE)
kb->pos= curpos+0.1;
else {
- curpos= bsystem_time(0, 0, (float)CFRA, 0.0);
+ curpos= bsystem_time(0, (float)CFRA, 0.0);
if(calc_ipo_spec(key->ipo, KEY_SPEED, &curpos)==0) {
curpos /= 100.0;
}
@@ -613,6 +613,7 @@ void insert_shapekey(Object *ob)
key= ob_get_key(ob);
ob->shapenr= BLI_countlist(&key->block);
+ BIF_undo_push("Add Shapekey");
allspace(REMAKEIPO, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWACTION, 0);
@@ -674,6 +675,7 @@ void delete_key(Object *ob)
DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+ BIF_undo_push("Delete Shapekey");
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSEDIT, 0);
allspace(REMAKEIPO, 0);
@@ -762,6 +764,7 @@ void move_keys(Object *ob)
/* for boundbox */
editipo_changed(G.sipo, 0);
+ BIF_undo_push("Move Shapekey(s)");
allspace(REMAKEIPO, 0);
allqueue(REDRAWIPO, 0);
allqueue(REDRAWVIEW3D, 0);
diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c
index fe6708f5959..15f4e652490 100644
--- a/source/blender/src/editmesh.c
+++ b/source/blender/src/editmesh.c
@@ -333,6 +333,10 @@ void free_editface(EditFace *efa)
}
#endif
EM_remove_selection(efa, EDITFACE);
+
+ if (G.editMesh->act_face==efa)
+ EM_set_actFace(NULL);
+
CustomData_em_free_block(&G.editMesh->fdata, &efa->data);
if(efa->fast==0)
free(efa);
@@ -809,10 +813,11 @@ void make_editMesh()
/* because of reload */
free_editMesh(em);
+ em->act_face = NULL;
G.totvert= tot= me->totvert;
G.totedge= me->totedge;
G.totface= me->totface;
-
+
if(tot==0) {
countall();
return;
@@ -838,7 +843,7 @@ void make_editMesh()
evlist[a]= eve;
// face select sets selection in next loop
- if( (G.f & G_FACESELECT)==0 )
+ if( (FACESEL_PAINT_TEST)==0 )
eve->f |= (mvert->flag & 1);
if (mvert->flag & ME_HIDE) eve->h= 1;
@@ -904,8 +909,11 @@ void make_editMesh()
}
if(mface->flag & ME_HIDE) efa->h= 1;
- if((G.f & G_FACESELECT) && (efa->f & SELECT))
+ if((FACESEL_PAINT_TEST) && (efa->f & SELECT))
EM_select_face(efa, 1); /* flush down */
+
+ if (a==me->act_face)
+ em->act_face = efa;
}
}
}
@@ -924,7 +932,7 @@ void make_editMesh()
for(a=0; a<me->totselect; a++, mselect++){
/*check if recorded selection is still valid, if so copy into editmesh*/
- if( (mselect->type == EDITVERT && me->mvert[mselect->index].flag & SELECT) || (mselect->type == EDITEDGE && me->medge[mselect->index].flag & SELECT) || (mselect->type == EDITFACE && me->mface[mselect->index].flag & SELECT) ){
+ if( (mselect->type == EDITVERT && me->mvert[mselect->index].flag & SELECT) || (mselect->type == EDITEDGE && me->medge[mselect->index].flag & SELECT) || (mselect->type == EDITFACE && me->mface[mselect->index].flag & ME_FACE_SEL) ){
ese = MEM_callocN(sizeof(EditSelection), "Edit Selection");
ese->type = mselect->type;
if(ese->type == EDITVERT) ese->data = EM_get_vert_for_index(mselect->index); else
@@ -1086,6 +1094,7 @@ void load_editMesh(void)
a = 0;
efa= em->faces.first;
i = 0;
+ me->act_face = -1;
while(efa) {
mface= &((MFace *) me->mface)[i];
@@ -1140,6 +1149,9 @@ void load_editMesh(void)
/* no index '0' at location 3 or 4 */
test_index_face(mface, &me->fdata, i, efa->v4?4:3);
+
+ if (EM_get_actFace() == efa)
+ me->act_face = a;
#ifdef WITH_VERSE
if(efa->vface) {
@@ -2164,3 +2176,30 @@ EditFace *EM_get_face_for_index(int index)
{
return g_em_face_array?g_em_face_array[index]:NULL;
}
+
+/* can we edit UV's for this mesh?*/
+int EM_texFaceCheck(void)
+{
+ /* some of these checks could be a touch overkill */
+ if ( (G.obedit) &&
+ (G.obedit->type == OB_MESH) &&
+ (G.editMesh) &&
+ (G.editMesh->faces.first) &&
+ (CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE)))
+ return 1;
+ return 0;
+}
+
+/* can we edit colors for this mesh?*/
+int EM_vertColorCheck(void)
+{
+ /* some of these checks could be a touch overkill */
+ if ( (G.obedit) &&
+ (G.obedit->type == OB_MESH) &&
+ (G.editMesh) &&
+ (G.editMesh->faces.first) &&
+ (CustomData_has_layer(&G.editMesh->fdata, CD_MCOL)))
+ return 1;
+ return 0;
+}
+
diff --git a/source/blender/src/editmesh_add.c b/source/blender/src/editmesh_add.c
index bb1d5d00957..8fb21549172 100644
--- a/source/blender/src/editmesh_add.c
+++ b/source/blender/src/editmesh_add.c
@@ -48,6 +48,7 @@
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
+#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
#include "BLI_blenlib.h"
@@ -960,7 +961,7 @@ void make_prim(int type, float imat[3][3], int tot, int seg,
rotateflag(2, v1->co, cmat);
}
- removedoublesflag(4, 0.0001);
+ removedoublesflag(4, 0, 0.0001);
/* and now do imat */
eve= em->verts.first;
@@ -1178,7 +1179,7 @@ void add_primitiveMesh(int type)
char *name=NULL;
if(G.scene->id.lib) return;
-
+
/* this function also comes from an info window */
if ELEM(curarea->spacetype, SPACE_VIEW3D, SPACE_INFO); else return;
if(G.vd==0) return;
@@ -1188,8 +1189,8 @@ void add_primitiveMesh(int type)
/* if editmode exists for other type, it exits */
check_editmode(OB_MESH);
- if(G.f & (G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT)) {
- G.f &= ~(G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT);
+ if(G.f & (G_VERTEXPAINT+G_TEXTUREPAINT)) {
+ G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT);
setcursor_space(SPACE_VIEW3D, CURSOR_EDIT);
}
@@ -1278,7 +1279,7 @@ void add_primitiveMesh(int type)
undostr="Add UV Sphere";
break;
case 12: /* Icosphere */
- add_numbut(0, NUM|INT, "Subdivision:", 1, 500, &subdiv, NULL);
+ add_numbut(0, NUM|INT, "Subdivision:", 1, 8, &subdiv, NULL);
add_numbut(1, NUM|FLO, "Radius:", 0.001*G.vd->grid, 100*G.vd->grid, &dia, NULL);
if (!(do_clever_numbuts("Add Ico Sphere", 2, REDRAW))) return;
@@ -1308,7 +1309,8 @@ void add_primitiveMesh(int type)
cent[1]-= G.obedit->obmat[3][1];
cent[2]-= G.obedit->obmat[3][2];
- Mat3CpyMat4(imat, G.vd->viewmat);
+ if ( !(newob) || U.flag & USER_ADD_VIEWALIGNED) Mat3CpyMat4(imat, G.vd->viewmat);
+ else Mat3One(imat);
Mat3MulVecfl(imat, cent);
Mat3MulMat3(cmat, imat, mat);
Mat3Inv(imat,cmat);
@@ -1320,8 +1322,7 @@ void add_primitiveMesh(int type)
phid= 2*M_PI/tot;
phi= .25*M_PI;
- make_prim(type, imat, tot, seg, subdiv, dia, d,
- ext, fill, cent);
+ make_prim(type, imat, tot, seg, subdiv, dia, d, ext, fill, cent);
if(type<2) tot = totoud;
@@ -1331,12 +1332,18 @@ void add_primitiveMesh(int type)
if(type!=0 && type!=13) righthandfaces(1); /* otherwise monkey has eyes in wrong direction... */
countall();
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+
+ /* if a new object was created, it stores it in Mesh, for reload original data and undo */
+ if ( !(newob) || U.flag & USER_ADD_EDITMODE) {
+ if(newob) load_editMesh();
+ } else {
+ exit_editmode(2);
+ }
+
allqueue(REDRAWINFO, 1); /* 1, because header->win==0! */
allqueue(REDRAWALL, 0);
- DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
-
- /* if a new object was created, it stores it in Mesh, for reload original data and undo */
- if(newob) load_editMesh();
+
BIF_undo_push(undostr);
}
diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c
index 78cf2d17c04..d9b8fa93eb9 100644
--- a/source/blender/src/editmesh_lib.c
+++ b/source/blender/src/editmesh_lib.c
@@ -72,6 +72,17 @@ editmesh_lib: generic (no UI, no menus) operations/evaluators for editmesh data
#include "editmesh.h"
+/* this replaces the active flag used in uv/face mode */
+void EM_set_actFace(EditFace *efa)
+{
+ G.editMesh->act_face = efa;
+}
+
+EditFace * EM_get_actFace(void)
+{
+ return G.editMesh->act_face;
+}
+
/* ********* Selection History ************ */
static int EM_check_selection(void *data)
{
@@ -1131,26 +1142,39 @@ static short extrudeflag_edge(short flag, float *nor)
MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
+ float mtx[4][4];
+ if (mmd->mirror_ob) {
+ float imtx[4][4];
+ Mat4Invert(imtx, mmd->mirror_ob->obmat);
+ Mat4MulMat4(mtx, G.obedit->obmat, imtx);
+ }
+
for (eed= em->edges.first; eed; eed= eed->next) {
if(eed->f2 == 1) {
+ float co1[3], co2[3];
+
+ VecCopyf(co1, eed->v1->co);
+ VecCopyf(co2, eed->v2->co);
- switch(mmd->axis){
- case 0:
- if ( (fabs(eed->v1->co[0]) < mmd->tolerance) &&
- (fabs(eed->v2->co[0]) < mmd->tolerance) )
- ++eed->f2;
- break;
- case 1:
- if ( (fabs(eed->v1->co[1]) < mmd->tolerance) &&
- (fabs(eed->v2->co[1]) < mmd->tolerance) )
- ++eed->f2;
- break;
- case 2:
- if ( (fabs(eed->v1->co[2]) < mmd->tolerance) &&
- (fabs(eed->v2->co[2]) < mmd->tolerance) )
- ++eed->f2;
- break;
+ if (mmd->mirror_ob) {
+ VecMat4MulVecfl(co1, mtx, co1);
+ VecMat4MulVecfl(co2, mtx, co2);
}
+
+ if (mmd->flag & MOD_MIR_AXIS_X)
+ if ( (fabs(co1[0]) < mmd->tolerance) &&
+ (fabs(co2[0]) < mmd->tolerance) )
+ ++eed->f2;
+
+ if (mmd->flag & MOD_MIR_AXIS_Y)
+ if ( (fabs(co1[1]) < mmd->tolerance) &&
+ (fabs(co2[1]) < mmd->tolerance) )
+ ++eed->f2;
+
+ if (mmd->flag & MOD_MIR_AXIS_Z)
+ if ( (fabs(co1[2]) < mmd->tolerance) &&
+ (fabs(co2[2]) < mmd->tolerance) )
+ ++eed->f2;
}
}
}
@@ -1400,26 +1424,38 @@ short extrudeflag_vert(short flag, float *nor)
MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
+ float mtx[4][4];
+ if (mmd->mirror_ob) {
+ float imtx[4][4];
+ Mat4Invert(imtx, mmd->mirror_ob->obmat);
+ Mat4MulMat4(mtx, G.obedit->obmat, imtx);
+ }
+
for (eed= em->edges.first; eed; eed= eed->next) {
if(eed->f2 == 2) {
+ float co1[3], co2[3];
+
+ VecCopyf(co1, eed->v1->co);
+ VecCopyf(co2, eed->v2->co);
- switch(mmd->axis){
- case 0:
- if ( (fabs(eed->v1->co[0]) < mmd->tolerance) &&
- (fabs(eed->v2->co[0]) < mmd->tolerance) )
- ++eed->f2;
- break;
- case 1:
- if ( (fabs(eed->v1->co[1]) < mmd->tolerance) &&
- (fabs(eed->v2->co[1]) < mmd->tolerance) )
- ++eed->f2;
- break;
- case 2:
- if ( (fabs(eed->v1->co[2]) < mmd->tolerance) &&
- (fabs(eed->v2->co[2]) < mmd->tolerance) )
- ++eed->f2;
- break;
+ if (mmd->mirror_ob) {
+ VecMat4MulVecfl(co1, mtx, co1);
+ VecMat4MulVecfl(co2, mtx, co2);
}
+
+ if (mmd->flag & MOD_MIR_AXIS_X)
+ if ( (fabs(co1[0]) < mmd->tolerance) &&
+ (fabs(co2[0]) < mmd->tolerance) )
+ ++eed->f2;
+
+ if (mmd->flag & MOD_MIR_AXIS_Y)
+ if ( (fabs(co1[1]) < mmd->tolerance) &&
+ (fabs(co2[1]) < mmd->tolerance) )
+ ++eed->f2;
+ if (mmd->flag & MOD_MIR_AXIS_Z)
+ if ( (fabs(co1[2]) < mmd->tolerance) &&
+ (fabs(co2[2]) < mmd->tolerance) )
+ ++eed->f2;
}
}
}
@@ -2070,3 +2106,134 @@ void EM_fgon_flags(void)
}
}
+
+/* editmesh vertmap, copied from intern.mesh.c
+ * if do_face_idx_array is 0 it means we need to run it as well as freeing
+ * */
+
+UvVertMap *make_uv_vert_map_EM(int selected, int do_face_idx_array, float *limit)
+{
+ EditMesh *em = G.editMesh;
+ EditVert *ev;
+ EditFace *efa;
+ int totverts;
+
+ /* vars from original func */
+ UvVertMap *vmap;
+ UvMapVert *buf;
+ MTFace *tf;
+ unsigned int a;
+ int i, totuv, nverts;
+
+ if (do_face_idx_array)
+ EM_init_index_arrays(0, 0, 1);
+
+ /* we need the vert */
+ for (ev= em->verts.first, totverts=0; ev; ev= ev->next, totverts++) {
+ ev->tmp.l = totverts;
+ }
+
+ totuv = 0;
+
+ /* generate UvMapVert array */
+ for (efa= em->faces.first; efa; efa= efa->next)
+ if(!selected || ((!efa->h) && (efa->f & SELECT)))
+ totuv += (efa->v4)? 4: 3;
+
+ if(totuv==0)
+ return NULL;
+
+ vmap= (UvVertMap*)MEM_mallocN(sizeof(*vmap), "UvVertMap");
+ if (!vmap)
+ return NULL;
+
+ vmap->vert= (UvMapVert**)MEM_callocN(sizeof(*vmap->vert)*totverts, "UvMapVert*");
+ buf= vmap->buf= (UvMapVert*)MEM_mallocN(sizeof(*vmap->buf)*totuv, "UvMapVert");
+
+ if (!vmap->vert || !vmap->buf) {
+ free_uv_vert_map(vmap);
+ return NULL;
+ }
+
+ for (a=0, efa= em->faces.first; efa; a++, efa= efa->next) {
+ if(!selected || ((!efa->h) && (efa->f & SELECT))) {
+ nverts= (efa->v4)? 4: 3;
+
+ for(i=0; i<nverts; i++) {
+ buf->tfindex= i;
+ buf->f= a;
+ buf->separate = 0;
+
+ buf->next= vmap->vert[(*(&efa->v1 + i))->tmp.l];
+ vmap->vert[(*(&efa->v1 + i))->tmp.l]= buf;
+
+ buf++;
+ }
+ }
+ }
+
+ /* sort individual uvs for each vert */
+ for(a=0, ev=em->verts.first; ev; a++, ev= ev->next) {
+ UvMapVert *newvlist= NULL, *vlist=vmap->vert[a];
+ UvMapVert *iterv, *v, *lastv, *next;
+ float *uv, *uv2, uvdiff[2];
+
+ while(vlist) {
+ v= vlist;
+ vlist= vlist->next;
+ v->next= newvlist;
+ newvlist= v;
+
+ efa = EM_get_face_for_index(v->f);
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ uv = tf->uv[v->tfindex];
+
+ lastv= NULL;
+ iterv= vlist;
+
+ while(iterv) {
+ next= iterv->next;
+ efa = EM_get_face_for_index(iterv->f);
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ uv2 = tf->uv[iterv->tfindex];
+
+ Vec2Subf(uvdiff, uv2, uv);
+
+ if(fabs(uv[0]-uv2[0]) < limit[0] && fabs(uv[1]-uv2[1]) < limit[1]) {
+ if(lastv) lastv->next= next;
+ else vlist= next;
+ iterv->next= newvlist;
+ newvlist= iterv;
+ }
+ else
+ lastv=iterv;
+
+ iterv= next;
+ }
+
+ newvlist->separate = 1;
+ }
+
+ vmap->vert[a]= newvlist;
+ }
+
+ if (do_face_idx_array)
+ EM_free_index_arrays();
+
+ return vmap;
+}
+
+UvMapVert *get_uv_map_vert_EM(UvVertMap *vmap, unsigned int v)
+{
+ return vmap->vert[v];
+}
+
+void free_uv_vert_map_EM(UvVertMap *vmap)
+{
+ if (vmap) {
+ if (vmap->vert) MEM_freeN(vmap->vert);
+ if (vmap->buf) MEM_freeN(vmap->buf);
+ MEM_freeN(vmap);
+ }
+}
+
diff --git a/source/blender/src/editmesh_loop.c b/source/blender/src/editmesh_loop.c
index 013a6b2947b..c44a0607464 100644
--- a/source/blender/src/editmesh_loop.c
+++ b/source/blender/src/editmesh_loop.c
@@ -515,13 +515,12 @@ static CutCurve *get_mouse_trail(int *len, char mode, char cutmode, struct GHash
G.scene->selectmode = oldmode;
}
glDrawBuffer(GL_FRONT);
- headerprint("LMB to draw, CTRL while drawing for vertex snap. Enter to finish (with CTRL to leave only the "
- "cut line selected), ESC to abort.");
+ headerprint("(LMB) draw, (Ctrl held while drawing) snap to vertex, (MMB) constrain to x/y screen axis, (Enter) cut "
+ "(with Ctrl to select cut line), (Esc) cancel");
}
else{
glDrawBuffer(GL_FRONT);
- headerprint("LMB to draw, Enter to finish (with CTRL to leave only the "
- "cut line selected), ESC to abort.");
+ headerprint("(LMB) draw, (MMB) constrain to x/y screen axis, (Enter) cut (with Ctrl to select cut line), (Esc) cancel");
}
persp(PERSP_WIN);
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index e3bc718858a..ae10cef0879 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -52,6 +52,7 @@ editmesh_mods.c, UI level access, no geometry changes
#include "DNA_texture_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
#include "DNA_view3d_types.h"
#include "BLI_blenlib.h"
@@ -85,6 +86,7 @@ editmesh_mods.c, UI level access, no geometry changes
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_toolbox.h"
+#include "BIF_editsima.h"
#ifdef WITH_VERSE
#include "BIF_verse.h"
@@ -129,6 +131,21 @@ void EM_select_mirrored(void)
}
}
+void EM_automerge(int update) {
+ int len;
+ if (G.scene->automerge) {
+ if (G.obedit && G.obedit->type==OB_MESH) {
+ len = removedoublesflag(1, 1, G.scene->toolsettings->doublimit);
+ if (len) {
+ G.totvert -= len; /* saves doing a countall */
+ if (update) {
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+ }
+ }
+ }
+ }
+}
+
/* ****************************** SELECTION ROUTINES **************** */
unsigned int em_solidoffs=0, em_wireoffs=0, em_vertoffs=0; /* set in drawobject.c ... for colorindices */
@@ -239,7 +256,7 @@ int EM_mask_init_backbuf_border(short mcords[][2], short tot, short xmin, short
/* method in use for face selecting too */
if(G.obedit==NULL) {
- if(G.f & G_FACESELECT);
+ if(FACESEL_PAINT_TEST);
else return 0;
}
else if(G.vd->drawtype<OB_SOLID || (G.vd->flag & V3D_ZBUF_SELECT)==0) return 0;
@@ -301,7 +318,7 @@ int EM_init_backbuf_circle(short xs, short ys, short rads)
/* method in use for face selecting too */
if(G.obedit==NULL) {
- if(G.f & G_FACESELECT);
+ if(FACESEL_PAINT_TEST);
else return 0;
}
else if(G.vd->drawtype<OB_SOLID || (G.vd->flag & V3D_ZBUF_SELECT)==0) return 0;
@@ -696,7 +713,7 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa)
}
}
- if(G.scene->selectmode & SCE_SELECT_FACE) {
+ if(G.scene->selectmode & SCE_SELECT_FACE && (G.vd->drawtype!=OB_TEXTURE)) {
if(efa->fgonf==0) {
glPointSize(BIF_GetThemeValuef(TH_FACEDOT_SIZE));
BIF_ThemeColor((efa->f & SELECT)?TH_FACE_DOT:TH_WIRE);
@@ -933,6 +950,8 @@ EDGE GROUP
mode 3: same number of face users
mode 4: similar face angles.
mode 5: similar crease
+ mode 6: similar seam
+ mode 7: similar sharp
*/
/* this function is only used by edgegroup_select's edge angle */
@@ -1104,6 +1123,34 @@ int edgegroup_select(short mode)
return selcount;
}
}
+ } else if (mode==6) { /* edge seam */
+ for(eed= em->edges.first; eed; eed= eed->next) {
+ if (
+ !(eed->f & SELECT) &&
+ !eed->h &&
+ (eed->seam == base_eed->seam)
+ ) {
+ EM_select_edge(eed, 1);
+ selcount++;
+ deselcount--;
+ if (!deselcount) /*have we selected all posible faces?, if so return*/
+ return selcount;
+ }
+ }
+ } else if (mode==7) { /* edge sharp */
+ for(eed= em->edges.first; eed; eed= eed->next) {
+ if (
+ !(eed->f & SELECT) &&
+ !eed->h &&
+ (eed->sharp == base_eed->sharp)
+ ) {
+ EM_select_edge(eed, 1);
+ selcount++;
+ deselcount--;
+ if (!deselcount) /*have we selected all posible faces?, if so return*/
+ return selcount;
+ }
+ }
}
}
}
@@ -1239,24 +1286,35 @@ facegroup_select/edgegroup_select/vertgroup_select do all the work
void select_mesh_group_menu()
{
short ret;
- int selcount, first_item=1;
- char str[512] = "Select Grouped%t"; /* total max length is 404 at the moment */
-
+ int selcount, first_item=1, multi=0;
+ char str[512] = "Select Similar "; /* total max length is 404 at the moment */
+
+ if (!ELEM3(G.scene->selectmode, SCE_SELECT_VERTEX, SCE_SELECT_EDGE, SCE_SELECT_FACE)) {
+ multi=1;
+ }
+
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
+ if (multi) strcat(str, "%t|Vertices%x-1|");
+ else strcat(str, "Vertices %t|");
+ strcat(str, " Normal %x1| Face Users %x2| Shared Vertex Groups%x3");
first_item=0;
- strcat(str, "|Verts...%x-1| Similar Normal %x1| Same Face Users %x2| Shared Vertex Groups%x3");
}
if(G.scene->selectmode & SCE_SELECT_EDGE) {
- if (!first_item) strcat(str, "|%l");
- else first_item=1;
+ if (multi) {
+ if (first_item) strcat(str, "%t|Edges%x-1|");
+ else strcat(str, "|%l|Edges%x-1|");
+ } else strcat(str, "Edges %t|");
- strcat(str, "|Edges...%x-1| Similar Length %x10| Similar Direction %x20| Same Face Users%x30| Similar Face Angle%x40| Similar Crease%x50");
+ strcat(str, " Length %x10| Direction %x20| Face Users%x30| Face Angle%x40| Crease%x50| Seam%x60| Sharp%x70");
+ first_item=0;
}
if(G.scene->selectmode & SCE_SELECT_FACE) {
- if (!first_item) strcat(str, "|%l");
- strcat(str, "|Faces...%x-1| Same Material %x100| Same Image %x200| Similar Area %x300| Similar Perimeter %x400| Similar Normal %x500| Similar Co-Planer %x600");
+ if (multi) {
+ strcat(str, "|%l|Faces%x-1|");
+ } else strcat(str, "Faces %t|");
+ strcat(str, " Material %x100| Image %x200| Area %x300| Perimeter %x400| Normal %x500| Co-Planar %x600");
}
@@ -1269,7 +1327,9 @@ void select_mesh_group_menu()
EM_select_flush(); /* so that selected verts, go onto select faces */
G.totvertsel += selcount;
allqueue(REDRAWVIEW3D, 0);
- BIF_undo_push("Select Grouped Verts");
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+ BIF_undo_push("Select Similar Vertices");
}
return;
}
@@ -1281,7 +1341,9 @@ void select_mesh_group_menu()
/*EM_select_flush();*/ /* dont use because it can end up selecting more edges and is not usefull*/
G.totedgesel+=selcount;
allqueue(REDRAWVIEW3D, 0);
- BIF_undo_push("Select Grouped Edges");
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+ BIF_undo_push("Select Similar Edges");
}
return;
}
@@ -1291,12 +1353,398 @@ void select_mesh_group_menu()
if (selcount) { /* update if data was selected */
G.totfacesel+=selcount;
allqueue(REDRAWVIEW3D, 0);
- BIF_undo_push("Select Grouped Faces");
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+ BIF_undo_push("Select Similar Faces");
}
return;
}
}
+int mesh_layers_menu_charlen(CustomData *data, int type)
+{
+ int i, len = 0;
+ /* see if there is a duplicate */
+ for(i=0; i<data->totlayer; i++) {
+ if((&data->layers[i])->type == type) {
+ /* we could count the chars here but we'll just assumeme each
+ * is 32 chars with some room for the menu text - 40 should be fine */
+ len+=40;
+ }
+ }
+ return len;
+}
+
+/* this function adds menu text into an existing string.
+ * this string's size should be allocated with mesh_layers_menu_charlen */
+void mesh_layers_menu_concat(CustomData *data, int type, char *str) {
+ int i, count = 0;
+ char *str_pt = str;
+ CustomDataLayer *layer;
+
+ /* see if there is a duplicate */
+ for(i=0; i<data->totlayer; i++) {
+ layer = &data->layers[i];
+ if(layer->type == type) {
+ str_pt += sprintf(str_pt, "%s%%x%d|", layer->name, count);
+ count++;
+ }
+ }
+}
+
+int mesh_layers_menu(CustomData *data, int type) {
+ int ret;
+ char *str_pt, *str;
+
+ str_pt = str = MEM_mallocN(mesh_layers_menu_charlen(data, type) + 18, "layer menu");
+ str[0] = '\0';
+
+ str_pt += sprintf(str_pt, "Layers%%t|");
+
+ mesh_layers_menu_concat(data, type, str_pt);
+
+ ret = pupmenu(str);
+ MEM_freeN(str);
+ return ret;
+}
+
+/* ctrl+c in mesh editmode */
+void mesh_copy_menu(void)
+{
+ EditMesh *em = G.editMesh;
+ EditSelection *ese;
+ short ret, change=0;
+
+ if (!em) return;
+
+ ese = em->selected.last;
+
+ if (!ese) return;
+
+ if(ese->type == EDITVERT) {
+ /*EditVert *ev, *ev_act = (EditVert*)ese->data;
+ ret= pupmenu("");*/
+ } else if(ese->type == EDITEDGE) {
+ EditEdge *eed, *eed_act = (EditEdge*)ese->data;
+ float vec[3], vec_mid[3], eed_len, eed_len_act;
+
+ ret= pupmenu("Copy Active Edge to Selected%t|Crease%x1|Length%x2");
+ if (ret<1) return;
+
+ eed_len_act = VecLenf(eed_act->v1->co, eed_act->v2->co);
+
+ switch (ret) {
+ case 1: /* copy crease */
+ for(eed=em->edges.first; eed; eed=eed->next) {
+ if (eed->f & SELECT && eed != eed_act && eed->crease != eed_act->crease) {
+ eed->crease = eed_act->crease;
+ change = 1;
+ }
+ }
+ break;
+
+ case 2: /* copy length */
+
+ for(eed=em->edges.first; eed; eed=eed->next) {
+ if (eed->f & SELECT && eed != eed_act) {
+
+ eed_len = VecLenf(eed->v1->co, eed->v2->co);
+
+ if (eed_len == eed_len_act) continue;
+ /* if this edge is zero length we cont do anything with it*/
+ if (eed_len == 0.0f) continue;
+ if (eed_len_act == 0.0f) {
+ VecAddf(vec_mid, eed->v1->co, eed->v2->co);
+ VecMulf(vec_mid, 0.5);
+ VECCOPY(eed->v1->co, vec_mid);
+ VECCOPY(eed->v2->co, vec_mid);
+ } else {
+ /* copy the edge length */
+ VecAddf(vec_mid, eed->v1->co, eed->v2->co);
+ VecMulf(vec_mid, 0.5);
+
+ /* SCALE 1 */
+ VecSubf(vec, eed->v1->co, vec_mid);
+ VecMulf(vec, eed_len_act/eed_len);
+ VecAddf(eed->v1->co, vec, vec_mid);
+
+ /* SCALE 2 */
+ VecSubf(vec, eed->v2->co, vec_mid);
+ VecMulf(vec, eed_len_act/eed_len);
+ VecAddf(eed->v2->co, vec, vec_mid);
+ }
+ change = 1;
+ }
+ }
+
+ if (change)
+ recalc_editnormals();
+
+
+ break;
+ }
+
+ } else if(ese->type == EDITFACE) {
+ EditFace *efa, *efa_act = (EditFace*)ese->data;
+ MTFace *tf, *tf_act;
+ MCol *mcol, *mcol_act;
+
+ ret= pupmenu(
+ "Copy Face Selected%t|"
+ "Active Material%x1|Active Image%x2|Active UV Coords%x3|"
+ "Active Mode%x4|Active Transp%x5|Active Vertex Colors%x6|%l|"
+
+ "TexFace UVs from layer%x7|"
+ "TexFace Images from layer%x8|"
+ "TexFace All from layer%x9|"
+ "Vertex Colors from layer%x10");
+
+ if (ret<1) return;
+
+ tf_act = CustomData_em_get(&em->fdata, efa_act->data, CD_MTFACE);
+ mcol_act = CustomData_em_get(&em->fdata, efa_act->data, CD_MCOL);
+
+ switch (ret) {
+ case 1: /* copy material */
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT && efa->mat_nr != efa_act->mat_nr) {
+ efa->mat_nr = efa_act->mat_nr;
+ change = 1;
+ }
+ }
+ break;
+ case 2: /* copy image */
+ if (!tf_act) {
+ error("mesh has no uv/image layers");
+ return;
+ }
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT && efa != efa_act) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (tf_act->tpage) {
+ tf->tpage = tf_act->tpage;
+ tf->mode |= TF_TEX;
+ } else {
+ tf->tpage = NULL;
+ tf->mode &= ~TF_TEX;
+ }
+ tf->tile= tf_act->tile;
+ change = 1;
+ }
+ }
+ break;
+
+ case 3: /* copy UV's */
+ if (!tf_act) {
+ error("mesh has no uv/image layers");
+ return;
+ }
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT && efa != efa_act) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ memcpy(tf->uv, tf_act->uv, sizeof(tf->uv));
+ change = 1;
+ }
+ }
+ break;
+ case 4: /* mode's */
+ if (!tf_act) {
+ error("mesh has no uv/image layers");
+ return;
+ }
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT && efa != efa_act) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ tf->mode= tf_act->mode;
+ change = 1;
+ }
+ }
+ break;
+ case 5: /* copy transp's */
+ if (!tf_act) {
+ error("mesh has no uv/image layers");
+ return;
+ }
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT && efa != efa_act) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ tf->transp= tf_act->transp;
+ change = 1;
+ }
+ }
+ break;
+
+ case 6: /* copy vcols's */
+ if (!mcol_act) {
+ error("mesh has no color layers");
+ return;
+ } else {
+ /* guess the 4th color if needs be */
+ float val =- 1;
+
+ if (!efa_act->v4) {
+ /* guess the othe vale, we may need to use it
+ *
+ * Modifying the 4th value of the mcol is ok here since its not seen
+ * on a triangle
+ * */
+ val = ((float)(mcol_act->r + (mcol_act+1)->r + (mcol_act+2)->r)) / 3; CLAMP(val, 0, 255);
+ (mcol_act+3)->r = (char)val;
+
+ val = ((float)(mcol_act->g + (mcol_act+1)->g + (mcol_act+2)->g)) / 3; CLAMP(val, 0, 255);
+ (mcol_act+3)->g = (char)val;
+
+ val = ((float)(mcol_act->b + (mcol_act+1)->b + (mcol_act+2)->b)) / 3; CLAMP(val, 0, 255);
+ (mcol_act+3)->b = (char)val;
+ }
+
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT && efa != efa_act) {
+ /* TODO - make copy from tri to quad guess the 4th vert */
+ mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ memcpy(mcol, mcol_act, sizeof(MCol)*4);
+ change = 1;
+ }
+ }
+ }
+
+ break;
+
+
+ /* copy from layer */
+ case 7:
+ case 8:
+ case 9:
+ if (!tf_act) {
+ error("mesh has no uv/image layers");
+ return;
+ } else if (CustomData_number_of_layers(&em->fdata, CD_MTFACE)<2) {
+ error("mesh does not have multiple uv/image layers");
+ return;
+ } else {
+ int layer_orig_idx, layer_idx;
+
+ layer_idx = mesh_layers_menu(&em->fdata, CD_MTFACE);
+ if (layer_idx<0) return;
+
+ /* warning, have not updated mesh pointers however this is not needed since we swicth back */
+ layer_orig_idx = CustomData_get_active_layer(&em->fdata, CD_MTFACE);
+ if (layer_idx==layer_orig_idx)
+ return;
+
+ /* get the tfaces */
+ CustomData_set_layer_active(&em->fdata, CD_MTFACE, (int)layer_idx);
+ /* store the tfaces in our temp */
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ efa->tmp.p = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ }
+ }
+ CustomData_set_layer_active(&em->fdata, CD_MTFACE, layer_orig_idx);
+ }
+ break;
+
+ case 10: /* select vcol layers - make sure this stays in sync with above code */
+ if (!mcol_act) {
+ error("mesh has no color layers");
+ return;
+ } else if (CustomData_number_of_layers(&em->fdata, CD_MCOL)<2) {
+ error("mesh does not have multiple color layers");
+ return;
+ } else {
+ int layer_orig_idx, layer_idx;
+
+ layer_idx = mesh_layers_menu(&em->fdata, CD_MCOL);
+ if (layer_idx<0) return;
+
+ /* warning, have not updated mesh pointers however this is not needed since we swicth back */
+ layer_orig_idx = CustomData_get_active_layer(&em->fdata, CD_MCOL);
+ if (layer_idx==layer_orig_idx)
+ return;
+
+ /* get the tfaces */
+ CustomData_set_layer_active(&em->fdata, CD_MCOL, (int)layer_idx);
+ /* store the tfaces in our temp */
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ efa->tmp.p = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ }
+ }
+ CustomData_set_layer_active(&em->fdata, CD_MCOL, layer_orig_idx);
+
+ }
+ break;
+ }
+
+ /* layer copy only - sanity checks done above */
+ switch (ret) {
+ case 7: /* copy UV's only */
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ tf_act = (MTFace *)efa->tmp.p; /* not active but easier to use this way */
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ memcpy(tf->uv, tf_act->uv, sizeof(tf->uv));
+ change = 1;
+ }
+ }
+ break;
+ case 8: /* copy image settings only */
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ tf_act = (MTFace *)efa->tmp.p; /* not active but easier to use this way */
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (tf_act->tpage) {
+ tf->tpage = tf_act->tpage;
+ tf->mode |= TF_TEX;
+ } else {
+ tf->tpage = NULL;
+ tf->mode &= ~TF_TEX;
+ }
+ tf->tile= tf_act->tile;
+ change = 1;
+ }
+ }
+ break;
+ case 9: /* copy all tface info */
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ tf_act = (MTFace *)efa->tmp.p; /* not active but easier to use this way */
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ memcpy(tf->uv, ((MTFace *)efa->tmp.p)->uv, sizeof(tf->uv));
+ tf->tpage = tf_act->tpage;
+ tf->mode = tf_act->mode;
+ tf->transp = tf_act->transp;
+ change = 1;
+ }
+ }
+ break;
+ case 10:
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ mcol_act = (MCol *)efa->tmp.p;
+ mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ memcpy(mcol, mcol_act, sizeof(MCol)*4);
+ change = 1;
+ }
+ }
+ break;
+ }
+
+ }
+
+ if (change) {
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+
+ if(ese->type == EDITVERT) BIF_undo_push("Copy Vert Attribute");
+ else if (ese->type == EDITEDGE) BIF_undo_push("Copy Edge Attribute");
+ else if (ese->type == EDITFACE) BIF_undo_push("Copy Face Attribute");
+ }
+
+}
+
/* **************** LOOP SELECTS *************** */
@@ -1572,6 +2020,8 @@ void loop_multiselect(int looptype)
}
MEM_freeN(edarray);
allqueue(REDRAWVIEW3D,0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
}
/* ***************** MAIN MOUSE SELECTION ************** */
@@ -1612,8 +2062,9 @@ static void mouse_mesh_loop(void)
EM_selectmode_flush();
countall();
-
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
}
}
@@ -1631,6 +2082,8 @@ void mouse_mesh(void)
if((G.qual & LR_SHIFTKEY)==0) EM_clear_flag_all(SELECT);
if(efa) {
+ /* set the last selected face */
+ EM_set_actFace(efa);
if( (efa->f & SELECT)==0 ) {
EM_store_selection(efa, EDITFACE);
@@ -1667,15 +2120,19 @@ void mouse_mesh(void)
EM_selectmode_flush();
countall();
-
+
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck()) {
+ allqueue(REDRAWIMAGE, 0);
+ allqueue(REDRAWBUTSEDIT, 0); /* for the texture face panel */
+ }
}
rightmouse_transform();
}
-static void selectconnectedAll(void)
+void selectconnected_mesh_all(void)
{
EditMesh *em = G.editMesh;
EditVert *v1,*v2;
@@ -1719,10 +2176,12 @@ static void selectconnectedAll(void)
countall();
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
BIF_undo_push("Select Connected (All)");
}
-void selectconnected_mesh(int qual)
+void selectconnected_mesh(void)
{
EditMesh *em = G.editMesh;
EditVert *eve, *v1, *v2;
@@ -1731,12 +2190,6 @@ void selectconnected_mesh(int qual)
short done=1, sel, toggle=0;
if(em->edges.first==0) return;
-
- if(qual & LR_CTRLKEY) {
- selectconnectedAll();
- return;
- }
-
if( unified_findnearest(&eve, &eed, &efa)==0 ) {
error("Nothing indicated ");
@@ -1744,7 +2197,7 @@ void selectconnected_mesh(int qual)
}
sel= 1;
- if(qual & LR_SHIFTKEY) sel=0;
+ if(G.qual & LR_SHIFTKEY) sel=0;
/* clear test flags */
for(v1= em->verts.first; v1; v1= v1->next) v1->f1= 0;
@@ -1796,10 +2249,122 @@ void selectconnected_mesh(int qual)
countall();
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
BIF_undo_push("Select Linked");
}
+/* for use with selectconnected_delimit_mesh only! */
+#define is_edge_delimit_ok(eed) ((eed->tmp.l == 1) && (eed->seam==0))
+#define is_face_tag(efa) is_edge_delimit_ok(efa->e1) || is_edge_delimit_ok(efa->e2) || is_edge_delimit_ok(efa->e3) || (efa->v4 && is_edge_delimit_ok(efa->e4))
+
+#define face_tag(efa)\
+ if(efa->v4) efa->tmp.l= efa->e1->tmp.l= efa->e2->tmp.l= efa->e3->tmp.l= efa->e4->tmp.l= 1;\
+ else efa->tmp.l= efa->e1->tmp.l= efa->e2->tmp.l= efa->e3->tmp.l= 1;
+
+/* all - 1) use all faces for extending the selection 2) only use the mouse face
+ * sel - 1) select 0) deselect
+ * */
+static void selectconnected_delimit_mesh__internal(short all, short sel)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ short done=1, change=0;
+ int dist = 75;
+ EditEdge *eed;
+ if(em->faces.first==0) return;
+
+ /* flag all edges as off*/
+ for(eed= em->edges.first; eed; eed= eed->next)
+ eed->tmp.l=0;
+
+ if (all) {
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->f & SELECT) {
+ face_tag(efa);
+ } else {
+ efa->tmp.l = 0;
+ }
+ }
+ } else {
+ EditFace *efa_mouse = findnearestface(&dist);
+
+ if( !efa_mouse ) {
+ error("Nothing indicated ");
+ return;
+ }
+
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ efa->tmp.l = 0;
+ }
+ efa_mouse->tmp.l = 1;
+ face_tag(efa_mouse);
+ }
+
+ while(done==1) {
+ done= 0;
+ /* simple algo - select all faces that have a selected edge
+ * this intern selects the edge, repeat until nothing is left to do */
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ if ((efa->tmp.l == 0) && (!efa->h)) {
+ if (is_face_tag(efa)) {
+ face_tag(efa);
+ done= 1;
+ }
+ }
+ }
+ }
+
+ for(efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->tmp.l) {
+ if (sel) {
+ if (!(efa->f & SELECT)) {
+ EM_select_face(efa, 1);
+ change = 1;
+ }
+ } else {
+ if (efa->f & SELECT) {
+ EM_select_face(efa, 0);
+ change = 1;
+ }
+ }
+ }
+ }
+
+ if (!change)
+ return;
+
+ if (!sel) /* make sure de-selecting faces didnt de-select the verts/edges connected to selected faces, this is common with boundries */
+ for(efa= em->faces.first; efa; efa= efa->next)
+ if (efa->f & SELECT)
+ EM_select_face(efa, 1);
+
+ countall();
+
+ allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
+ BIF_undo_push("Select Linked Delimeted");
+
+}
+
+#undef is_edge_delimit_ok
+#undef is_face_tag
+#undef face_tag
+
+void selectconnected_delimit_mesh(void)
+{
+ selectconnected_delimit_mesh__internal(0, ((G.qual & LR_SHIFTKEY)==0));
+}
+void selectconnected_delimit_mesh_all(void)
+{
+ selectconnected_delimit_mesh__internal(1, 1);
+}
+
+
/* swap is 0 or 1, if 1 it hides not selected */
void hide_mesh(int swap)
{
@@ -1896,6 +2461,8 @@ void hide_mesh(int swap)
G.totedgesel= G.totfacesel= G.totvertsel= 0;
allqueue(REDRAWVIEW3D, 0);
+ if(EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
BIF_undo_push("Hide");
}
@@ -1936,10 +2503,91 @@ void reveal_mesh(void)
countall();
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
BIF_undo_push("Reveal");
}
+/* TODO - improve this with sync sel and selection flushing */
+void hide_tface_uv(int swap)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ MTFace *tface;
+
+ if( is_uv_tface_editing_allowed()==0 ) return;
+
+ /* call the mesh function if we are in mesh sync sel */
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ hide_mesh(swap);
+ return;
+ }
+
+ if(swap) {
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if(efa->f & SELECT) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if((tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))==0) {
+ if(!efa->v4)
+ EM_select_face(efa, 0);
+ else if(!(tface->flag & TF_SEL4))
+ EM_select_face(efa, 0);
+ }
+ }
+ }
+ } else {
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if(efa->f & SELECT) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if(tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))
+ EM_select_face(efa, 0);
+ else if(efa->v4 && tface->flag & TF_SEL4)
+ EM_select_face(efa, 0);
+ }
+ }
+ }
+
+ /*deselects too many but ok for now*/
+ EM_deselect_flush();
+ EM_validate_selections();
+
+ BIF_undo_push("Hide UV");
+
+ object_tface_flags_changed(OBACT, 0);
+}
+
+void reveal_tface_uv(void)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ MTFace *tface;
+
+ if( is_uv_tface_editing_allowed()==0 ) return;
+
+ /* call the mesh function if we are in mesh sync sel */
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ reveal_mesh();
+ return;
+ }
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (!(efa->h)) {
+ if (!(efa->f & SELECT)) {
+ EM_select_face(efa, 1);
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ tface->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+ }
+ }
+ }
+
+ EM_selectmode_flush();
+
+ BIF_undo_push("Reveal UV");
+
+ object_tface_flags_changed(OBACT, 0);
+}
+
void select_faces_by_numverts(int numverts)
{
EditMesh *em = G.editMesh;
@@ -1968,7 +2616,9 @@ void select_faces_by_numverts(int numverts)
countall();
addqueue(curarea->win, REDRAW, 0);
-
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
if (numverts==3)
BIF_undo_push("Select Triangles");
else if (numverts==4)
@@ -2075,6 +2725,9 @@ void select_sharp_edges(void)
countall();
addqueue(curarea->win, REDRAW, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
BIF_undo_push("Select Sharp Edges");
}
@@ -2218,6 +2871,8 @@ void select_linked_flat_faces(void)
countall();
addqueue(curarea->win, REDRAW, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
BIF_undo_push("Select Linked Flat Faces");
}
@@ -2288,6 +2943,8 @@ void select_non_manifold(void)
countall();
addqueue(curarea->win, REDRAW, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
BIF_undo_push("Select Non Manifold");
}
@@ -2326,6 +2983,8 @@ void selectswap_mesh(void) /* UI level */
countall();
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
BIF_undo_push("Select Swap");
@@ -2346,6 +3005,10 @@ void deselectall_mesh(void) /* this toggles!!!, UI level */
}
countall();
+
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
allqueue(REDRAWVIEW3D, 0);
}
}
@@ -2391,6 +3054,8 @@ void select_more(void)
countall();
addqueue(curarea->win, REDRAW, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
BIF_undo_push("Select More");
}
@@ -2458,6 +3123,8 @@ void select_less(void)
countall();
BIF_undo_push("Select Less");
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
}
@@ -2511,6 +3178,8 @@ void selectrandom_mesh(void) /* randomly selects a user-set % of vertices/edges/
BIF_undo_push("Select Random:Faces");
}
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
}
void editmesh_select_by_material(int index)
@@ -2576,6 +3245,8 @@ void EM_selectmode_menu(void)
}
allqueue(REDRAWVIEW3D, 1);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
}
}
@@ -2666,6 +3337,40 @@ void BME_Menu() {
}
}
+
+
+void Vertex_Menu() {
+ short ret;
+ ret= pupmenu("Vertex Specials%t|Remove Doubles%x1|Merge%x2|Smooth %x3|Select Vertex Path%x4|Blend From Shape%x5|Propagate To All Shapes%x6");
+
+ switch(ret)
+ {
+ case 1:
+ notice("Removed %d Vertices", removedoublesflag(1, 0, G.scene->toolsettings->doublimit));
+ BIF_undo_push("Remove Doubles");
+ break;
+ case 2:
+ mergemenu();
+ break;
+ case 3:
+ vertexsmooth();
+ break;
+ case 4:
+ pathselect();
+ BIF_undo_push("Select Vertex Path");
+ break;
+ case 5:
+ shape_copy_select_from();
+ break;
+ case 6:
+ shape_propagate();
+ break;
+ }
+ /* some items crashed because this is in the original W menu but not here. should really manage this better */
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+}
+
+
void Edge_Menu() {
short ret;
@@ -2716,6 +3421,72 @@ void Edge_Menu() {
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
break;
}
+ /* some items crashed because this is in the original W menu but not here. should really manage this better */
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+}
+
+void Face_Menu() {
+ short ret;
+ ret= pupmenu(
+ "Face Specials%t|Flip Normals%x1|Bevel%x2|Shade Smooth%x3|Shade Flat%x4|"
+ "Triangulate (Ctrl T)%x5|Quads from Triangles (Alt J)%x6|Flip Triangle Edges (Ctrl Shift F)%x7|%l|"
+ "Face Mode Set%x8|Face Mode Clear%x9|%l|"
+ "UV Rotate (Shift - CCW)%x10|UV Mirror (Shift - Switch Axis)%x11|"
+ "Color Rotate (Shift - CCW)%x12|Color Mirror (Shift - Switch Axis)%x13");
+
+ switch(ret)
+ {
+ case 1:
+ flip_editnormals();
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+ BIF_undo_push("Flip Normals");
+ allqueue(REDRAWVIEW3D, 0);
+ break;
+ case 2:
+ bevel_menu();
+ break;
+ case 3:
+ mesh_set_smooth_faces(1);
+ break;
+ case 4:
+ mesh_set_smooth_faces(0);
+ break;
+
+ case 5: /* Quads to Tris */
+ convert_to_triface(0);
+ allqueue(REDRAWVIEW3D, 0);
+ countall();
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+ break;
+ case 6: /* Tris to Quads */
+ join_triangles();
+ break;
+ case 7: /* Flip triangle edges */
+ edge_flip();
+ break;
+ case 8:
+ mesh_set_face_flags(1);
+ break;
+ case 9:
+ mesh_set_face_flags(0);
+ break;
+
+ /* uv texface options */
+ case 10:
+ mesh_rotate_uvs();
+ break;
+ case 11:
+ mesh_mirror_uvs();
+ break;
+ case 12:
+ mesh_rotate_colors();
+ break;
+ case 13:
+ mesh_mirror_colors();
+ break;
+ }
+ /* some items crashed because this is in the original W menu but not here. should really manage this better */
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
}
@@ -3140,7 +3911,7 @@ void vertexsmooth(void)
eve= em->verts.first;
while(eve) {
if(eve->f & SELECT) {
- eve->tmp.fp = adr;
+ eve->tmp.p = (void*)adr;
eve->f1= 0;
eve->f2= 0;
adr+= 3;
@@ -3188,11 +3959,11 @@ void vertexsmooth(void)
if((eed->v1->f & SELECT) && eed->v1->f1<255) {
eed->v1->f1++;
- VecAddf(eed->v1->tmp.fp, eed->v1->tmp.fp, fvec);
+ VecAddf(eed->v1->tmp.p, eed->v1->tmp.p, fvec);
}
if((eed->v2->f & SELECT) && eed->v2->f1<255) {
eed->v2->f1++;
- VecAddf(eed->v2->tmp.fp, eed->v2->tmp.fp, fvec);
+ VecAddf(eed->v2->tmp.p, eed->v2->tmp.p, fvec);
}
}
eed= eed->next;
@@ -3202,7 +3973,7 @@ void vertexsmooth(void)
while(eve) {
if(eve->f & SELECT) {
if(eve->f1) {
- adr = eve->tmp.fp;
+ adr = eve->tmp.p;
fac= 0.5/(float)eve->f1;
eve->co[0]= 0.5*eve->co[0]+fac*adr[0];
@@ -3222,7 +3993,7 @@ void vertexsmooth(void)
}
}
}
- eve->tmp.fp= 0;
+ eve->tmp.p= NULL;
}
eve= eve->next;
}
diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c
index b69ce4bdead..1992ea8468a 100644
--- a/source/blender/src/editmesh_tools.c
+++ b/source/blender/src/editmesh_tools.c
@@ -195,8 +195,15 @@ void convert_to_triface(int direction)
}
-int removedoublesflag(short flag, float limit) /* return amount */
+int removedoublesflag(short flag, short automerge, float limit) /* return amount */
{
+ /*
+ flag - Test with vert->flags
+ automerge - Alternative operation, merge unselected into selected.
+ Used for "Auto Weld" mode. warning.
+ limit - Quick manhattan distance between verts.
+ */
+
EditMesh *em = G.editMesh;
/* all verts with (flag & 'flag') are being evaluated */
EditVert *eve, *v1, *nextve;
@@ -204,17 +211,19 @@ int removedoublesflag(short flag, float limit) /* return amount */
EditFace *efa, *nextvl;
xvertsort *sortblock, *sb, *sb1;
struct facesort *vlsortblock, *vsb, *vsb1;
- float dist;
int a, b, test, amount;
if(multires_test()) return 0;
+
/* flag 128 is cleared, count */
+
+ /* Normal non weld operation */
eve= em->verts.first;
amount= 0;
while(eve) {
eve->f &= ~128;
- if(eve->h==0 && (eve->f & flag)) amount++;
+ if(eve->h==0 && (automerge || (eve->f & flag))) amount++;
eve= eve->next;
}
if(amount==0) return 0;
@@ -223,7 +232,7 @@ int removedoublesflag(short flag, float limit) /* return amount */
sb= sortblock= MEM_mallocN(sizeof(xvertsort)*amount,"sortremovedoub");
eve= em->verts.first;
while(eve) {
- if(eve->h==0 && (eve->f & flag)) {
+ if(eve->h==0 && (automerge || (eve->f & flag))) {
sb->x= eve->co[0]+eve->co[1]+eve->co[2];
sb->v1= eve;
sb++;
@@ -232,44 +241,72 @@ int removedoublesflag(short flag, float limit) /* return amount */
}
qsort(sortblock, amount, sizeof(xvertsort), vergxco);
+
/* test for doubles */
- sb= sortblock;
- for(a=0; a<amount; a++) {
- eve= sb->v1;
- if( (eve->f & 128)==0 ) {
- sb1= sb+1;
- for(b=a+1; b<amount; b++) {
- /* first test: simpel dist */
- dist= sb1->x - sb->x;
- if(dist > limit) break;
-
- /* second test: is vertex allowed */
- v1= sb1->v1;
- if( (v1->f & 128)==0 ) {
+ sb= sortblock;
+ if (automerge) {
+ for(a=0; a<amount; a++, sb++) {
+ eve= sb->v1;
+ if( (eve->f & 128)==0 ) {
+ sb1= sb+1;
+ for(b=a+1; b<amount && (eve->f & 128)==0; b++, sb1++) {
+ if(sb1->x - sb->x > limit) break;
- dist= (float)fabs(v1->co[0]-eve->co[0]);
- if(dist<=limit) {
- dist= (float)fabs(v1->co[1]-eve->co[1]);
- if(dist<=limit) {
- dist= (float)fabs(v1->co[2]-eve->co[2]);
- if(dist<=limit) {
+ /* when automarge, only allow unselected->selected */
+ v1= sb1->v1;
+ if( (v1->f & 128)==0 ) {
+ if ((eve->f & flag)==0 && (v1->f & flag)==1) {
+ if( (float)fabs(v1->co[0]-eve->co[0])<=limit &&
+ (float)fabs(v1->co[1]-eve->co[1])<=limit &&
+ (float)fabs(v1->co[2]-eve->co[2])<=limit)
+ { /* unique bit */
+ eve->f|= 128;
+ eve->tmp.v = v1;
+ }
+ } else if( (eve->f & flag)==1 && (v1->f & flag)==0 ) {
+ if( (float)fabs(v1->co[0]-eve->co[0])<=limit &&
+ (float)fabs(v1->co[1]-eve->co[1])<=limit &&
+ (float)fabs(v1->co[2]-eve->co[2])<=limit)
+ { /* unique bit */
v1->f|= 128;
v1->tmp.v = eve;
}
}
}
}
- sb1++;
}
}
- sb++;
+ } else {
+ for(a=0; a<amount; a++, sb++) {
+ eve= sb->v1;
+ if( (eve->f & 128)==0 ) {
+ sb1= sb+1;
+ for(b=a+1; b<amount; b++, sb1++) {
+ /* first test: simpel dist */
+ if(sb1->x - sb->x > limit) break;
+ v1= sb1->v1;
+
+ /* second test: is vertex allowed */
+ if( (v1->f & 128)==0 ) {
+ if( (float)fabs(v1->co[0]-eve->co[0])<=limit &&
+ (float)fabs(v1->co[1]-eve->co[1])<=limit &&
+ (float)fabs(v1->co[2]-eve->co[2])<=limit)
+ {
+ v1->f|= 128;
+ v1->tmp.v = eve;
+ }
+ }
+ }
+ }
+ }
}
MEM_freeN(sortblock);
-
- for(eve = em->verts.first; eve; eve=eve->next)
- if((eve->f & flag) && (eve->f & 128))
- EM_data_interp_from_verts(eve, eve->tmp.v, eve->tmp.v, 0.5f);
-
+
+ if (!automerge)
+ for(eve = em->verts.first; eve; eve=eve->next)
+ if((eve->f & flag) && (eve->f & 128))
+ EM_data_interp_from_verts(eve, eve->tmp.v, eve->tmp.v, 0.5f);
+
/* test edges and insert again */
eed= em->edges.first;
while(eed) {
@@ -445,7 +482,7 @@ int removedoublesflag(short flag, float limit) /* return amount */
eve= (struct EditVert *)em->verts.first;
while(eve) {
nextve= eve->next;
- if(eve->f & flag) {
+ if(automerge || eve->f & flag) {
if(eve->f & 128) {
a++;
BLI_remlink(&em->verts, eve);
@@ -642,15 +679,15 @@ void extrude_mesh(void)
/* individual faces? */
BIF_TransformSetUndo("Extrude");
if(nr==2) {
- initTransform(TFM_SHRINKFATTEN, CTX_NO_PET);
+ initTransform(TFM_SHRINKFATTEN, CTX_NO_PET|CTX_NO_MIRROR);
Transform();
}
else {
- initTransform(TFM_TRANSLATION, CTX_NO_PET);
+ initTransform(TFM_TRANSLATION, CTX_NO_PET|CTX_NO_MIRROR);
if(transmode=='n') {
Mat4MulVecfl(G.obedit->obmat, nor);
VecSubf(nor, nor, G.obedit->obmat[3]);
- BIF_setSingleAxisConstraint(nor, NULL);
+ BIF_setSingleAxisConstraint(nor, "along normal");
}
Transform();
}
@@ -756,14 +793,15 @@ void spin_mesh(int steps, float degr, float *dvec, int mode)
if(G.scene->toolsettings->editbutflag & B_CLOCKWISE) phi= -phi;
if(dvec) {
- n[0]=n[1]= 0.0;
- n[2]= 1.0;
+ n[0]= G.vd->viewinv[1][0];
+ n[1]= G.vd->viewinv[1][1];
+ n[2]= G.vd->viewinv[1][2];
} else {
n[0]= G.vd->viewinv[2][0];
n[1]= G.vd->viewinv[2][1];
n[2]= G.vd->viewinv[2][2];
- Normalize(n);
}
+ Normalize(n);
q[0]= (float)cos(phi);
si= (float)sin(phi);
@@ -824,12 +862,6 @@ void screw_mesh(int steps, int turns)
TEST_EDITMESH
if(multires_test()) return;
-
- /* first condition: we need frontview! */
- if(G.vd->view!=1) {
- error("Must be in Front View");
- return;
- }
/* clear flags */
eve= em->verts.first;
@@ -2919,8 +2951,6 @@ void beauty_fill(void)
totedge = count_selected_edges(em->edges.first);
if(totedge==0) return;
- if(okee("Beautify fill")==0) return;
-
/* temp block with face pointers */
efaar= (EVPTuple *) MEM_callocN(totedge * sizeof(EVPTuple), "beautyfill");
@@ -4030,7 +4060,7 @@ static void bevel_mesh(float bsize, int allfaces)
waitcursor(1);
- removedoublesflag(1, limit);
+ removedoublesflag(1, 0, limit);
/* tag all original faces */
efa= em->faces.first;
@@ -4385,7 +4415,7 @@ static void bevel_mesh(float bsize, int allfaces)
allqueue(REDRAWVIEW3D, 0);
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
- removedoublesflag(1, limit);
+ removedoublesflag(1, 0, limit);
/* flush selected vertices to edges/faces */
EM_select_flush();
@@ -4538,7 +4568,7 @@ int EdgeLoopDelete(void) {
return 0;
}
select_more();
- removedoublesflag(1,0.001);
+ removedoublesflag(1,0, 0.001);
EM_select_flush();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
return 1;
@@ -5086,6 +5116,8 @@ int EdgeSlide(short immediate, float imperc)
}
force_draw(0);
+
+ EM_automerge(0);
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
scrarea_queue_winredraw(curarea);
@@ -5110,6 +5142,58 @@ int EdgeSlide(short immediate, float imperc)
/* -------------------- More tools ------------------ */
+void mesh_set_face_flags(short mode)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ MTFace *tface;
+ short m_tex=0, m_tiles=0, m_shared=0, m_light=0, m_invis=0, m_collision=0, m_twoside=0, m_obcolor=0;
+ short flag = 0, change = 0;
+
+ if (!EM_texFaceCheck()) {
+ error("not a mesh with uv/image layers");
+ return;
+ }
+
+ add_numbut(0, TOG|SHO, "Texture", 0, 0, &m_tex, NULL);
+ add_numbut(1, TOG|SHO, "Tiles", 0, 0, &m_tiles, NULL);
+ add_numbut(2, TOG|SHO, "Shared", 0, 0, &m_shared, NULL);
+ add_numbut(3, TOG|SHO, "Light", 0, 0, &m_light, NULL);
+ add_numbut(4, TOG|SHO, "Invisible", 0, 0, &m_invis, NULL);
+ add_numbut(5, TOG|SHO, "Collision", 0, 0, &m_collision, NULL);
+ add_numbut(6, TOG|SHO, "Twoside", 0, 0, &m_twoside, NULL);
+ add_numbut(7, TOG|SHO, "ObColor", 0, 0, &m_obcolor, NULL);
+
+ if (!do_clever_numbuts((mode ? "Set Flags" : "Clear Flags"), 8, REDRAW))
+ return;
+
+ if (m_tex) flag |= TF_TEX;
+ if (m_tiles) flag |= TF_TILES;
+ if (m_shared) flag |= TF_SHAREDCOL;
+ if (m_light) flag |= TF_LIGHT;
+ if (m_invis) flag |= TF_INVISIBLE;
+ if (m_collision) flag |= TF_DYNAMIC;
+ if (m_twoside) flag |= TF_TWOSIDE;
+ if (m_obcolor) flag |= TF_OBCOL;
+
+ efa= em->faces.first;
+ while(efa) {
+ if(efa->f & SELECT) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (mode) tface->mode |= flag;
+ else tface->mode &= ~flag;
+ }
+ efa= efa->next;
+ }
+
+ if (change) {
+ BIF_undo_push((mode ? "Set Flags" : "Clear Flags"));
+
+ allqueue(REDRAWIMAGE, 0);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+}
+
void mesh_set_smooth_faces(short event)
{
EditMesh *em = G.editMesh;
@@ -5844,7 +5928,7 @@ static void collapse_edgeuvs(void)
int curtag, balanced, collectionfound= 0, vcount;
float avg[2];
- if (!CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE))
+ if (!EM_texFaceCheck())
return;
uvverts.first = uvverts.last = uvedges.first = uvedges.last = allcollections.first = allcollections.last = NULL;
@@ -5946,7 +6030,7 @@ static void collapseuvs(void)
int uvcount;
float uvav[2];
- if (!CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE))
+ if (!EM_texFaceCheck())
return;
uvcount = 0;
@@ -6054,7 +6138,7 @@ int collapseEdges(void)
VECCOPY(((EditEdge*)curredge->eed)->v2->co,avgcount);
}
- if (CustomData_has_layer(&G.editMesh->fdata, CD_MTFACE)) {
+ if (EM_texFaceCheck()) {
/*uv collapse*/
for(eve=G.editMesh->verts.first; eve; eve=eve->next) eve->f1 = 0;
for(eed=G.editMesh->edges.first; eed; eed=eed->next) eed->f1 = 0;
@@ -6068,11 +6152,13 @@ int collapseEdges(void)
}
freecollections(&allcollections);
- removedoublesflag(1, MERGELIMIT);
+ removedoublesflag(1, 0, MERGELIMIT);
/*get rid of this!*/
countall();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
return mergecount;
}
@@ -6110,7 +6196,7 @@ int merge_firstlast(int first, int uvmerge)
}
countall();
- return removedoublesflag(1,MERGELIMIT);
+ return removedoublesflag(1, 0, MERGELIMIT);
}
int merge_target(int target, int uvmerge)
@@ -6133,7 +6219,7 @@ int merge_target(int target, int uvmerge)
countall();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
- return removedoublesflag(1,MERGELIMIT);
+ return removedoublesflag(1, 0, MERGELIMIT);
}
#undef MERGELIMIT
@@ -6301,6 +6387,8 @@ void pathselect(void)
countall();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
}
}
else{
@@ -6338,6 +6426,8 @@ void region_to_loop(void)
countall();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
BIF_undo_push("Face Region to Edge Loop");
}
@@ -6496,6 +6586,215 @@ void loop_to_region(void)
freecollections(&allcollections);
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
BIF_undo_push("Edge Loop to Face Region");
}
+
+/* texface and vertex color editmode tools for the face menu */
+
+void mesh_rotate_uvs(void)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ short change = 0, ccw;
+ MTFace *tf;
+ float u1, v1;
+
+ if (!EM_texFaceCheck()) {
+ error("mesh has no uv/image layers");
+ return;
+ }
+
+ ccw = (G.qual == LR_SHIFTKEY);
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ u1= tf->uv[0][0];
+ v1= tf->uv[0][1];
+
+ if (ccw) {
+ if(efa->v4) {
+ tf->uv[0][0]= tf->uv[3][0];
+ tf->uv[0][1]= tf->uv[3][1];
+
+ tf->uv[3][0]= tf->uv[2][0];
+ tf->uv[3][1]= tf->uv[2][1];
+ } else {
+ tf->uv[0][0]= tf->uv[2][0];
+ tf->uv[0][1]= tf->uv[2][1];
+ }
+
+ tf->uv[2][0]= tf->uv[1][0];
+ tf->uv[2][1]= tf->uv[1][1];
+
+ tf->uv[1][0]= u1;
+ tf->uv[1][1]= v1;
+ } else {
+ tf->uv[0][0]= tf->uv[1][0];
+ tf->uv[0][1]= tf->uv[1][1];
+
+ tf->uv[1][0]= tf->uv[2][0];
+ tf->uv[1][1]= tf->uv[2][1];
+
+ if(efa->v4) {
+ tf->uv[2][0]= tf->uv[3][0];
+ tf->uv[2][1]= tf->uv[3][1];
+
+ tf->uv[3][0]= u1;
+ tf->uv[3][1]= v1;
+ }
+ else {
+ tf->uv[2][0]= u1;
+ tf->uv[2][1]= v1;
+ }
+ }
+ change = 1;
+ }
+ }
+
+ if (change) {
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ BIF_undo_push("Rotate UV face");
+ }
+}
+
+void mesh_mirror_uvs(void)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ short change = 0;
+ MTFace *tf;
+ float u1, v1;
+
+ if (!EM_texFaceCheck()) {
+ error("mesh has no uv/image layers");
+ return;
+ }
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ u1= tf->uv[0][0];
+ v1= tf->uv[0][1];
+ if(efa->v4) {
+ tf->uv[0][0]= tf->uv[3][0];
+ tf->uv[0][1]= tf->uv[3][1];
+
+ tf->uv[3][0]= u1;
+ tf->uv[3][1]= v1;
+
+ u1= tf->uv[1][0];
+ v1= tf->uv[1][1];
+
+ tf->uv[1][0]= tf->uv[2][0];
+ tf->uv[1][1]= tf->uv[2][1];
+
+ tf->uv[2][0]= u1;
+ tf->uv[2][1]= v1;
+ }
+ else {
+ tf->uv[0][0]= tf->uv[2][0];
+ tf->uv[0][1]= tf->uv[2][1];
+ tf->uv[2][0]= u1;
+ tf->uv[2][1]= v1;
+ }
+ change = 1;
+ }
+ }
+
+ if (change) {
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ BIF_undo_push("Mirror UV face");
+ }
+}
+
+void mesh_rotate_colors(void)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ short change = 0, ccw;
+ MCol tmpcol, *mcol;
+ if (!EM_vertColorCheck()) {
+ error("mesh has no color layers");
+ return;
+ }
+
+ ccw = (G.qual == LR_SHIFTKEY);
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ tmpcol= mcol[0];
+
+ if (ccw) {
+ if(efa->v4) {
+ mcol[0]= mcol[3];
+ mcol[3]= mcol[2];
+ } else {
+ mcol[0]= mcol[2];
+ }
+ mcol[2]= mcol[1];
+ mcol[1]= tmpcol;
+ } else {
+ mcol[0]= mcol[1];
+ mcol[1]= mcol[2];
+
+ if(efa->v4) {
+ mcol[2]= mcol[3];
+ mcol[3]= tmpcol;
+ }
+ else
+ mcol[2]= tmpcol;
+ }
+ change = 1;
+ }
+ }
+
+ if (change) {
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ BIF_undo_push("Rotate Color face");
+ }
+}
+
+void mesh_mirror_colors(void)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ short change = 0;
+ MCol tmpcol, *mcol;
+ if (!EM_vertColorCheck()) {
+ error("mesh has no color layers");
+ return;
+ }
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ if (efa->f & SELECT) {
+ mcol = CustomData_em_get(&em->fdata, efa->data, CD_MCOL);
+ tmpcol= mcol[0];
+
+ mcol[0]= mcol[1];
+ mcol[1]= mcol[2];
+
+ if(efa->v4) {
+ mcol[2]= mcol[3];
+ mcol[3]= tmpcol;
+ }
+ else {
+ mcol[2]= tmpcol;
+ }
+ change = 1;
+ }
+ }
+
+ if (change) {
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ BIF_undo_push("Mirror Color face");
+ }
+}
diff --git a/source/blender/src/editnla.c b/source/blender/src/editnla.c
index 85c6d6275c9..ec3b1c834e5 100644
--- a/source/blender/src/editnla.c
+++ b/source/blender/src/editnla.c
@@ -73,6 +73,7 @@
#include "BIF_toolbox.h"
#include "BIF_editnla.h"
#include "BIF_editaction.h"
+#include "BIF_transform.h"
#include "BSE_editipo.h"
#include "BSE_editnla_types.h"
@@ -426,6 +427,12 @@ void snap_action_strips(int snap_mode)
strip->end += diff;
}
}
+ else if (snap_mode==3) {
+ /* nearest second */
+ float secf = FPS;
+ strip->start= (float)(floor(strip->start/secf + 0.5f) * secf);
+ strip->end= (float)(floor(strip->end/secf + 0.5f) * secf);
+ }
}
}
@@ -825,8 +832,12 @@ static void mouse_nlachannels(short mval[2])
if(actclick) /* de-activate all strips */
set_active_strip(ob, NULL);
- else if(strip) /* set action */
- set_active_strip(ob, strip);
+ else if(strip) {
+ if(mval[0] >= (NLAWIDTH-16)) /* toggle strip muting */
+ strip->flag ^= ACTSTRIP_MUTE;
+ else /* set action */
+ set_active_strip(ob, strip);
+ }
/* icon toggles beside strip */
if (obclick && mval[0]<20) {
@@ -837,6 +848,10 @@ static void mouse_nlachannels(short mval[2])
/* override option for NLA */
ob->nlaflag ^= OB_NLA_OVERRIDE;
}
+ else if((obclick) && (ob->ipo) && (mval[0] >= (NLAWIDTH-16))) {
+ /* mute Object IPO-block */
+ ob->ipo->muteipo = (ob->ipo->muteipo)? 0: 1;
+ }
ob->ctime= -1234567.0f; // eveil!
DAG_object_flush_update(G.scene, ob, OB_RECALC_OB|OB_RECALC_DATA);
@@ -967,291 +982,26 @@ static void recalc_all_ipos(void)
void transform_nlachannel_keys(int mode, int dummy)
{
- Base *base;
- TransVert *tv;
- bActionChannel *chan;
- bActionStrip *strip;
- bConstraintChannel *conchan;
- float sval[2], cval[2], lastcval[2];
- float fac=0.0F;
- float deltax, startx;
- int i;
- int loop=1;
- int tvtot=0;
- int invert=0, firsttime=1;
- short mvals[2], mvalc[2];
- short cancel=0;
- char str[256];
-
- /* Ensure that partial selections result in beztriple selections */
- for (base=G.scene->base.first; base; base=base->next){
- /* Check object ipos */
- i= fullselect_ipo_keys(base->object->ipo);
- if(i) base->flag |= BA_HAS_RECALC_OB;
- tvtot+=i;
-
- /* Check object constraint ipos */
- for(conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next)
- tvtot+=fullselect_ipo_keys(conchan->ipo);
-
- /* skip actions and nlastrips if object is collapsed */
- if (base->object->nlaflag & OB_NLA_COLLAPSED)
- continue;
-
- /* Check action ipos */
- if (base->object->action){
- /* exclude if strip is selected too */
- for (strip=base->object->nlastrips.first; strip; strip=strip->next) {
- if (strip->flag & ACTSTRIP_SELECT)
- if(strip->act==base->object->action)
- break;
- }
- if(strip==NULL) {
-
- for (chan=base->object->action->chanbase.first; chan; chan=chan->next) {
- if (EDITABLE_ACHAN(chan)) {
- i= fullselect_ipo_keys(chan->ipo);
- if(i) base->flag |= BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA;
- tvtot+=i;
-
- /* Check action constraint ipos */
- if (EXPANDED_ACHAN(chan) && FILTER_CON_ACHAN(chan)) {
- for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) {
- if (EDITABLE_CONCHAN(conchan))
- tvtot+=fullselect_ipo_keys(conchan->ipo);
- }
- }
- }
- }
- }
- }
-
- /* Check nlastrips */
- for (strip=base->object->nlastrips.first; strip; strip=strip->next){
- if (strip->flag & ACTSTRIP_SELECT) {
- base->flag |= BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA;
- tvtot+=2;
- }
- }
- }
-
- /* If nothing is selected, bail out */
- if (!tvtot)
- return;
-
-
- /* Build the transvert structure */
- tv = MEM_callocN (sizeof(TransVert) * tvtot, "transVert");
- tvtot=0;
- for (base=G.scene->base.first; base; base=base->next){
- /* Manipulate object ipos */
- tvtot=add_trans_ipo_keys(base->object->ipo, tv, tvtot);
-
- /* Manipulate object constraint ipos */
- for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next)
- tvtot=add_trans_ipo_keys(conchan->ipo, tv, tvtot);
-
- /* skip actions and nlastrips if object collapsed */
- if (base->object->nlaflag & OB_NLA_COLLAPSED)
- continue;
-
- /* Manipulate action ipos */
- if (base->object->action){
- /* exclude if strip is selected too */
- for (strip=base->object->nlastrips.first; strip; strip=strip->next){
- if (strip->flag & ACTSTRIP_SELECT)
- if(strip->act==base->object->action)
- break;
- }
-
- /* can include - no selected strip is action */
- if(strip==NULL) {
- for (chan=base->object->action->chanbase.first; chan; chan=chan->next){
- if (EDITABLE_ACHAN(chan)) {
- tvtot=add_trans_ipo_keys(chan->ipo, tv, tvtot);
-
- /* Manipulate action constraint ipos */
- if (EXPANDED_ACHAN(chan) && FILTER_CON_ACHAN(chan)) {
- for (conchan=chan->constraintChannels.first; conchan; conchan=conchan->next) {
- if (EDITABLE_CONCHAN(conchan))
- tvtot=add_trans_ipo_keys(conchan->ipo, tv, tvtot);
- }
- }
- }
- }
- }
- }
-
- /* Manipulate nlastrips */
- for (strip=base->object->nlastrips.first; strip; strip=strip->next){
- if (strip->flag & ACTSTRIP_SELECT){
- tv[tvtot+0].val=&strip->start;
- tv[tvtot+1].val=&strip->end;
-
- tv[tvtot+0].oldval = strip->start;
- tv[tvtot+1].oldval = strip->end;
-
- tvtot+=2;
- }
- }
- }
-
- /* Do the event loop */
- // cent[0] = curarea->winx + (G.snla->v2d.hor.xmax)/2;
- // cent[1] = curarea->winy + (G.snla->v2d.hor.ymax)/2;
-
- // areamouseco_to_ipoco(cent, &cenf[0], &cenf[1]);
-
- getmouseco_areawin (mvals);
- areamouseco_to_ipoco(G.v2d, mvals, &sval[0], &sval[1]);
-
- startx=sval[0];
- while (loop) {
- /* Get the input */
- /* If we're cancelling, reset transformations */
- /* Else calc new transformation */
- /* Perform the transformations */
- while (qtest()) {
- short val;
- unsigned short event= extern_qread(&val);
-
- if (val) {
- switch (event) {
- case LEFTMOUSE:
- case SPACEKEY:
- case RETKEY:
- loop=0;
- break;
- case XKEY:
- break;
- case ESCKEY:
- case RIGHTMOUSE:
- cancel=1;
- loop=0;
- break;
- default:
- arrows_move_cursor(event);
- break;
- };
- }
+ switch (mode) {
+ case 'g':
+ {
+ initTransform(TFM_TIME_TRANSLATE, CTX_NONE);
+ Transform();
}
-
- if (cancel) {
- for (i=0; i<tvtot; i++) {
- if (tv[i].loc){
- tv[i].loc[0]=tv[i].oldloc[0];
- tv[i].loc[1]=tv[i].oldloc[1];
- }
- if (tv[i].val)
- tv[i].val[0]=tv[i].oldval;
- }
+ break;
+ case 's':
+ {
+ initTransform(TFM_TIME_SCALE, CTX_NONE);
+ Transform();
}
- else {
- getmouseco_areawin (mvalc);
- areamouseco_to_ipoco(G.v2d, mvalc, &cval[0], &cval[1]);
-
- if (!firsttime && lastcval[0]==cval[0] && lastcval[1]==cval[1]) {
- PIL_sleep_ms(10);
- }
- else {
- for (i=0; i<tvtot; i++){
- if (tv[i].loc)
- tv[i].loc[0]=tv[i].oldloc[0];
- if (tv[i].val)
- tv[i].val[0]=tv[i].oldval;
-
- switch (mode){
- case 'g':
- deltax = cval[0]-sval[0];
- fac= deltax;
-
- apply_keyb_grid(&fac, 0.0F, 1.0F, 0.1F, U.flag & USER_AUTOGRABGRID);
-
- if (tv[i].loc)
- tv[i].loc[0]+=fac;
- if (tv[i].val)
- tv[i].val[0]+=fac;
- break;
- case 's':
- startx=mvals[0]-(NLAWIDTH/2+(curarea->winrct.xmax-curarea->winrct.xmin)/2);
- deltax=mvalc[0]-(NLAWIDTH/2+(curarea->winrct.xmax-curarea->winrct.xmin)/2);
- fac= (float)fabs(deltax/startx);
-
- apply_keyb_grid(&fac, 0.0F, 0.2F, 0.1F, U.flag & USER_AUTOSIZEGRID);
-
- if (invert){
- if (i % 03 == 0){
- memcpy (tv[i].loc, tv[i].oldloc, sizeof(tv[i+2].oldloc));
- }
- if (i % 03 == 2){
- memcpy (tv[i].loc, tv[i].oldloc, sizeof(tv[i-2].oldloc));
- }
-
- fac*=-1;
- }
- startx= (G.scene->r.cfra);
-
- if (tv[i].loc){
- tv[i].loc[0]-= startx;
- tv[i].loc[0]*=fac;
- tv[i].loc[0]+= startx;
- }
- if (tv[i].val){
- tv[i].val[0]-= startx;
- tv[i].val[0]*=fac;
- tv[i].val[0]+= startx;
- }
-
- break;
- }
- }
-
- if (mode=='s'){
- sprintf(str, "scaleX: %.3f", fac);
- headerprint(str);
- }
- else if (mode=='g'){
- sprintf(str, "deltaX: %.3f", fac);
- headerprint(str);
- }
-
- if (G.snla->lock) {
- for (base=G.scene->base.first; base; base=base->next){
- if(base->flag & BA_HAS_RECALC_OB)
- base->object->recalc |= OB_RECALC_OB;
- if(base->flag & BA_HAS_RECALC_DATA)
- base->object->recalc |= OB_RECALC_DATA;
-
- if(base->object->recalc) base->object->ctime= -1234567.0f; // eveil!
- }
-
- DAG_scene_flush_update(G.scene, screen_view3d_layers());
-
- force_draw_all(0);
- }
- else {
- force_draw(0);
- }
- }
+ break;
+ case 'e':
+ {
+ initTransform(TFM_TIME_EXTEND, CTX_NONE);
+ Transform();
}
-
- lastcval[0]= cval[0];
- lastcval[1]= cval[1];
- firsttime= 0;
+ break;
}
-
- synchronize_action_strips();
-
- /* cleanup */
- for (base=G.scene->base.first; base; base=base->next)
- base->flag &= ~(BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA);
-
- if(cancel==0) BIF_undo_push("Select all NLA");
- recalc_all_ipos(); // bad
- allqueue (REDRAWVIEW3D, 0);
- allqueue (REDRAWNLA, 0);
- allqueue (REDRAWIPO, 0);
- MEM_freeN (tv);
}
void delete_nlachannel_keys(void)
@@ -1298,10 +1048,10 @@ void delete_nlachannel_keys(void)
}
}
+ recalc_all_ipos(); // bad
synchronize_action_strips();
BIF_undo_push("Delete NLA keys");
- recalc_all_ipos(); // bad
allspace(REMAKEIPO,0);
allqueue (REDRAWVIEW3D, 0);
allqueue(REDRAWNLA, 0);
@@ -1459,11 +1209,7 @@ void borderselect_nla(void)
}
}
BIF_undo_push("Border select NLA");
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
}
@@ -1518,11 +1264,7 @@ static void mouse_nla(int selectmode)
std_rmouse_transform(transform_markers);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
else {
/* Try action ipo selection */
@@ -1981,11 +1723,7 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
shift_nlastrips_up();
else {
nextprev_marker(1);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
break;
@@ -1998,11 +1736,7 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
shift_nlastrips_down();
else {
nextprev_marker(-1);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
break;
@@ -2014,11 +1748,7 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
else if (G.qual & LR_CTRLKEY) {
deselect_markers(1, 0);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
else{
if (mval[0]>=NLAWIDTH)
@@ -2067,6 +1797,13 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
+ case EKEY:
+ if (mval[0] >= NLAWIDTH) {
+ transform_nlachannel_keys ('e', 0);
+ update_for_newframe_muted();
+ }
+ break;
+
case GKEY:
if (mval[0]>=NLAWIDTH) {
if (G.qual & LR_CTRLKEY) {
@@ -2087,11 +1824,7 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
rename_marker();
else
break;
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case NKEY:
@@ -2112,11 +1845,7 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
anim_previewrange_set();
else if (G.qual & LR_ALTKEY) /* clear preview range */
anim_previewrange_clear();
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWBUTSALL, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case SKEY:
@@ -2128,8 +1857,11 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
reset_action_strips(2);
}
else if(G.qual & LR_SHIFTKEY) {
- val= pupmenu("Snap To%t|Nearest Frame%x1|Current Frame%x2");
- if (val==1 || val==2)
+ if (snla->flag & SNLA_DRAWTIME)
+ val= pupmenu("Snap To%t|Nearest Second%x3|Current Time%x2");
+ else
+ val= pupmenu("Snap To%t|Nearest Frame%x1|Current Frame%x2");
+ if (ELEM3(val, 1, 2, 3))
snap_action_strips(val);
}
else {
@@ -2139,20 +1871,29 @@ void winqreadnlaspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
+ case TKEY:
+ if (G.qual & LR_CTRLKEY) {
+ val= pupmenu("Time value%t|Frames %x1|Seconds%x2");
+
+ if (val > 0) {
+ if (val == 2) snla->flag |= SNLA_DRAWTIME;
+ else snla->flag &= ~SNLA_DRAWTIME;
+
+ doredraw= 1;
+ }
+ }
+ break;
+
case DELKEY:
case XKEY:
if (mval[0]>=NLAWIDTH) {
if (okee("Erase selected?")) {
- remove_marker();
-
delete_nlachannel_keys();
update_for_newframe_muted();
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ remove_marker();
+
+ allqueue(REDRAWMARKER, 0);
}
}
break;
diff --git a/source/blender/src/editnode.c b/source/blender/src/editnode.c
index 28c1d898a62..e5e83152ae2 100644
--- a/source/blender/src/editnode.c
+++ b/source/blender/src/editnode.c
@@ -60,6 +60,7 @@
#include "BIF_editview.h"
#include "BIF_gl.h"
#include "BIF_graphics.h"
+#include "BIF_imasel.h"
#include "BIF_interface.h"
#include "BIF_mywindow.h"
#include "BIF_previewrender.h"
@@ -279,8 +280,11 @@ static void composit_node_event(SpaceNode *snode, short event)
if(node->id)
strcpy(name, ((Image *)node->id)->name);
else strcpy(name, U.textudir);
-
- activate_fileselect(FILE_SPECIAL, "SELECT IMAGE", name, load_node_image);
+ if (G.qual & LR_CTRLKEY) {
+ activate_imageselect(FILE_SPECIAL, "SELECT IMAGE", name, load_node_image);
+ } else {
+ activate_fileselect(FILE_SPECIAL, "SELECT IMAGE", name, load_node_image);
+ }
break;
}
case B_NODE_TREE_EXEC:
@@ -836,15 +840,28 @@ static int find_indicated_socket(SpaceNode *snode, bNode **nodep, bNodeSocket **
short mval[2];
getmouseco_areawin(mval);
- areamouseco_to_ipoco(G.v2d, mval, &rect.xmin, &rect.ymin);
-
- rect.xmin -= NODE_SOCKSIZE+3;
- rect.ymin -= NODE_SOCKSIZE+3;
- rect.xmax = rect.xmin + 2*NODE_SOCKSIZE+6;
- rect.ymax = rect.ymin + 2*NODE_SOCKSIZE+6;
/* check if we click in a socket */
for(node= snode->edittree->nodes.first; node; node= node->next) {
+
+ areamouseco_to_ipoco(G.v2d, mval, &rect.xmin, &rect.ymin);
+
+ rect.xmin -= NODE_SOCKSIZE+3;
+ rect.ymin -= NODE_SOCKSIZE+3;
+ rect.xmax = rect.xmin + 2*NODE_SOCKSIZE+6;
+ rect.ymax = rect.ymin + 2*NODE_SOCKSIZE+6;
+
+ if (!(node->flag & NODE_HIDDEN)) {
+ /* extra padding inside and out - allow dragging on the text areas too */
+ if (in_out == SOCK_IN) {
+ rect.xmax += NODE_SOCKSIZE;
+ rect.xmin -= NODE_SOCKSIZE*4;
+ } else if (in_out == SOCK_OUT) {
+ rect.xmax += NODE_SOCKSIZE*4;
+ rect.xmin -= NODE_SOCKSIZE;
+ }
+ }
+
if(in_out & SOCK_IN) {
for(sock= node->inputs.first; sock; sock= sock->next) {
if(!(sock->flag & (SOCK_HIDDEN|SOCK_UNAVAIL))) {
@@ -1909,6 +1926,33 @@ void node_read_renderlayers(SpaceNode *snode)
snode_handle_recalc(snode);
}
+/* called from header_info, when deleting a scene
+ * goes over all scenes other than the input, checks if they have
+ * render layer nodes referencing the to-be-deleted scene, and
+ * resets them to NULL. */
+void clear_scene_in_nodes(Scene *sce)
+{
+ Scene *sce1;
+ bNode *node;
+
+ sce1= G.main->scene.first;
+ while(sce1) {
+ if(sce1!=sce) {
+ if (sce1->nodetree) {
+ for(node= sce1->nodetree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_LAYERS) {
+ Scene *nodesce= (Scene *)node->id;
+
+ if (nodesce==sce) node->id = NULL;
+ }
+ }
+ }
+ }
+ sce1= sce1->id.next;
+ }
+}
+
+
/* gets active viewer user */
struct ImageUser *ntree_get_active_iuser(bNodeTree *ntree)
{
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 04d751418a8..995606282c3 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -74,11 +74,13 @@
#include "DNA_meta_types.h"
#include "DNA_nla_types.h"
#include "DNA_object_types.h"
+#include "DNA_object_fluidsim.h"
#include "DNA_object_force.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
#include "DNA_screen_types.h"
#include "DNA_texture_types.h"
+#include "DNA_particle_types.h"
#include "DNA_property_types.h"
#include "DNA_userdef_types.h"
#include "DNA_view3d_types.h"
@@ -117,6 +119,7 @@
#include "BKE_mesh.h"
#include "BKE_nla.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_property.h"
#include "BKE_sca.h"
#include "BKE_scene.h"
@@ -133,6 +136,7 @@
#include "BIF_editlattice.h"
#include "BIF_editmesh.h"
#include "BIF_editoops.h"
+#include "BIF_editparticle.h"
#include "BIF_editview.h"
#include "BIF_editarmature.h"
#include "BIF_gl.h"
@@ -182,11 +186,22 @@
/* --------------------------------- */
+void exit_paint_modes(void)
+{
+ if(G.f & G_VERTEXPAINT) set_vpaint();
+ if(G.f & G_TEXTUREPAINT) set_texturepaint();
+ if(G.f & G_WEIGHTPAINT) set_wpaint();
+ if(G.f & G_SCULPTMODE) set_sculptmode();
+ if(G.f & G_PARTICLEEDIT) PE_set_particle_edit();
+
+ G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE+G_PARTICLEEDIT);
+}
+
void add_object_draw(int type) /* for toolbox or menus, only non-editmode stuff */
{
Object *ob;
- G.f &= ~(G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE);
+ exit_paint_modes();
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
if ELEM3(curarea->spacetype, SPACE_VIEW3D, SPACE_BUTS, SPACE_INFO) {
@@ -261,8 +276,6 @@ void delete_obj(int ok)
if(G.obedit) return;
if(G.scene->id.lib) return;
- if(G.f & G_SCULPTMODE) set_sculptmode();
-
base= FIRSTBASE;
while(base) {
Base *nbase= base->next;
@@ -279,6 +292,8 @@ void delete_obj(int ok)
}
}
+ exit_paint_modes();
+
if(base->object->type==OB_LAMP) islamp= 1;
#ifdef WITH_VERSE
if(base->object->vnode) b_verse_delete_object(base->object);
@@ -306,7 +321,6 @@ void delete_obj(int ok)
}
countall();
- G.f &= ~(G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT+G_WEIGHTPAINT);
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
if(islamp) reshadeall_displist(); /* only frees displist */
@@ -999,9 +1013,15 @@ void clear_object(char mode)
if TESTBASELIB(base) {
ob= base->object;
- if( (ob->flag & OB_POSEMODE) && ob==OBACT) {
- clear_armature(ob, mode);
- armature_clear= 1; /* silly system to prevent another dag update, so no action applied */
+ if ((ob->flag & OB_POSEMODE)) {
+ /* only clear pose transforms if:
+ * - with a mesh in weightpaint mode, it's related armature needs to be cleared
+ * - with clearing transform of object being edited at the time
+ */
+ if ((G.f & G_WEIGHTPAINT) || ob==OBACT) {
+ clear_armature(ob, mode);
+ armature_clear= 1; /* silly system to prevent another dag update, so no action applied */
+ }
}
else if((G.f & G_WEIGHTPAINT)==0) {
@@ -1075,7 +1095,7 @@ void reset_slowparents(void)
{
/* back to original locations */
Base *base;
-
+
base= FIRSTBASE;
while(base) {
if(base->object->parent) {
@@ -1371,9 +1391,6 @@ void make_parent(void)
}
}
else if(par->type == OB_CURVE){
- bConstraint *con;
- bFollowPathConstraint *data;
-
mode= pupmenu("Make Parent %t|Normal Parent %x1|Follow Path %x2|Curve Deform %x3|Path Constraint %x4");
if(mode<=0){
return;
@@ -1395,24 +1412,26 @@ void make_parent(void)
mode= PARSKEL;
}
else if(mode==4) {
-
+ bConstraint *con;
+ bFollowPathConstraint *data;
+
base= FIRSTBASE;
while(base) {
if TESTBASELIB(base) {
if(base!=BASACT) {
- float cmat[4][4], vec[3], size[3];
-
+ float cmat[4][4], vec[3];
+
con = add_new_constraint(CONSTRAINT_TYPE_FOLLOWPATH);
strcpy (con->name, "AutoPath");
-
+
data = con->data;
data->tar = BASACT->object;
-
+
add_constraint_to_object(con, base->object);
-
- get_constraint_target_matrix(con, TARGET_OBJECT, NULL, cmat, size, G.scene->r.cfra - base->object->sf);
+
+ get_constraint_target_matrix(con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, G.scene->r.cfra - base->object->sf);
VecSubf(vec, base->object->obmat[3], cmat[3]);
-
+
base->object->loc[0] = vec[0];
base->object->loc[1] = vec[1];
base->object->loc[2] = vec[2];
@@ -1423,7 +1442,7 @@ void make_parent(void)
allqueue(REDRAWVIEW3D, 0);
DAG_scene_sort(G.scene);
- BIF_undo_push("make Parent");
+ BIF_undo_push("Make Parent");
return;
}
}
@@ -1607,11 +1626,26 @@ void enter_editmode(int wc)
G.obedit= ob;
make_editMesh();
allqueue(REDRAWBUTSLOGIC, 0);
- if(G.f & G_FACESELECT) allqueue(REDRAWIMAGE, 0);
+ /*if(G.f & G_FACESELECT) allqueue(REDRAWIMAGE, 0);*/
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
}
if (ob->type==OB_ARMATURE){
arm= base->object->data;
if (!arm) return;
+ /*
+ * The function object_data_is_libdata make a problem here, the
+ * check for ob->proxy return 0 and let blender enter to edit mode
+ * this causa a crash when you try leave the edit mode.
+ * The problem is that i can't remove the ob->proxy check from
+ * object_data_is_libdata that prevent the bugfix #6614, so
+ * i add this little hack here.
+ */
+ if(arm->id.lib) {
+ error_libdata();
+ return;
+ }
ok=1;
G.obedit=ob;
make_editArmature();
@@ -1670,7 +1704,10 @@ void exit_editmode(int flag) /* freedata==0 at render, 1= freedata, 2= do undo b
/* temporal */
countall();
-
+
+ if(EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
if(retopo_mesh_paint_check())
retopo_end_okee();
@@ -1681,9 +1718,7 @@ void exit_editmode(int flag) /* freedata==0 at render, 1= freedata, 2= do undo b
load_editMesh();
if(freedata) free_editMesh(G.editMesh);
-
- if(G.f & G_FACESELECT)
- allqueue(REDRAWIMAGE, 0);
+
if(G.f & G_WEIGHTPAINT)
mesh_octree_table(G.obedit, NULL, 'e');
}
@@ -1717,7 +1752,7 @@ void exit_editmode(int flag) /* freedata==0 at render, 1= freedata, 2= do undo b
/* total remake of softbody data */
if(modifiers_isSoftbodyEnabled(ob)) {
if (ob->soft && ob->soft->keys) {
- notice("Erased Baked SoftBody");
+ notice("Erase Baked SoftBody");
}
sbObjectToSoftbody(ob);
@@ -2036,7 +2071,7 @@ void docenter(int centermode)
/* Warn if any errors occured */
if (tot_lib_error+tot_key_error+tot_multiuser_arm_error) {
char err[512];
- sprintf(err, "Warning %i Object(s) Not Centered, %i Changed%%t", tot_lib_error+tot_key_error+tot_multiuser_arm_error, tot_change);
+ sprintf(err, "Warning %i Object(s) Not Centered, %i Changed:", tot_lib_error+tot_key_error+tot_multiuser_arm_error, tot_change);
if (tot_lib_error)
sprintf(err+strlen(err), "|%i linked library objects", tot_lib_error);
@@ -2045,7 +2080,7 @@ void docenter(int centermode)
if (tot_multiuser_arm_error)
sprintf(err+strlen(err), "|%i multiuser armature object(s)", tot_multiuser_arm_error);
- pupmenu(err);
+ error(err);
}
}
@@ -2179,7 +2214,7 @@ void special_editmenu(void)
if(ob->flag & OB_POSEMODE) {
pose_special_editmenu();
}
- else if(G.f & G_FACESELECT) {
+ else if(FACESEL_PAINT_TEST) {
Mesh *me= get_mesh(ob);
MTFace *tface;
MFace *mface;
@@ -2245,13 +2280,46 @@ void special_editmenu(void)
}
else if(G.f & G_WEIGHTPAINT) {
Object *par= modifiers_isDeformedByArmature(ob);
+
if(par && (par->flag & OB_POSEMODE)) {
- nr= pupmenu("Specials%t|Apply Bone Envelopes to VertexGroups %x1");
- if(nr==1) {
- pose_adds_vgroups(ob);
- BIF_undo_push("Apply Bone Envelopes to VertexGroups");
- }
+ nr= pupmenu("Specials%t|Apply Bone Envelopes to Vertex Groups %x1|Apply Bone Heat Weights to Vertex Groups %x2");
+
+ if(nr==1 || nr==2)
+ pose_adds_vgroups(ob, (nr == 2));
+ }
+ }
+ else if(G.f & G_PARTICLEEDIT) {
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleEditSettings *pset = PE_settings();
+
+ if(!psys)
+ return;
+
+ if(G.scene->selectmode & SCE_SELECT_POINT)
+ nr= pupmenu("Specials%t|Rekey%x1|Subdivide%x2|Select First%x3|Select Last%x4");
+ else
+ nr= pupmenu("Specials%t|Rekey%x1");
+
+ switch(nr) {
+ case 1:
+ if(button(&pset->totrekey, 2, 100, "Number of Keys:")==0) return;
+ waitcursor(1);
+ PE_rekey();
+ break;
+ case 2:
+ PE_subdivide();
+ break;
+ case 3:
+ PE_select_root();
+ break;
+ case 4:
+ PE_select_tip();
+ break;
}
+
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
+
+ if(nr>0) waitcursor(0);
}
else {
Base *base, *base_select= NULL;
@@ -2328,7 +2396,44 @@ void special_editmenu(void)
}
}
else if(G.obedit->type==OB_MESH) {
-
+ /* This is all that is needed, since all other functionality is in Ctrl+ V/E/F but some users didnt like, so for now have the old/big menu */
+ /*
+ nr= pupmenu("Subdivide Mesh%t|Subdivide%x1|Subdivide Multi%x2|Subdivide Multi Fractal%x3|Subdivide Smooth%x4");
+ switch(nr) {
+ case 1:
+ waitcursor(1);
+ esubdivideflag(1, 0.0, G.scene->toolsettings->editbutflag, 1, 0);
+
+ BIF_undo_push("ESubdivide Single");
+ break;
+ case 2:
+ if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
+ waitcursor(1);
+ esubdivideflag(1, 0.0, G.scene->toolsettings->editbutflag, numcuts, 0);
+ BIF_undo_push("ESubdivide");
+ break;
+ case 3:
+ if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
+ randfac= 10;
+ if(button(&randfac, 1, 100, "Rand fac:")==0) return;
+ waitcursor(1);
+ fac= -( (float)randfac )/100;
+ esubdivideflag(1, fac, G.scene->toolsettings->editbutflag, numcuts, 0);
+ BIF_undo_push("Subdivide Fractal");
+ break;
+
+ case 4:
+ fac= 1.0f;
+ if(fbutton(&fac, 0.0f, 5.0f, 10, 10, "Smooth:")==0) return;
+ fac= 0.292f*fac;
+
+ waitcursor(1);
+ esubdivideflag(1, fac, G.scene->toolsettings->editbutflag | B_SMOOTH, 1, 0);
+ BIF_undo_push("Subdivide Smooth");
+ break;
+ }
+ */
+
nr= pupmenu("Specials%t|Subdivide%x1|Subdivide Multi%x2|Subdivide Multi Fractal%x3|Subdivide Smooth%x12|Merge%x4|Remove Doubles%x5|Hide%x6|Reveal%x7|Select Swap%x8|Flip Normals %x9|Smooth %x10|Bevel %x11|Set Smooth %x14|Set Solid %x15|Blend From Shape%x16|Propagate To All Shapes%x17|Select Vertex Path%x18");
switch(nr) {
@@ -2364,12 +2469,12 @@ void special_editmenu(void)
esubdivideflag(1, fac, G.scene->toolsettings->editbutflag | B_SMOOTH, 1, 0);
BIF_undo_push("Subdivide Smooth");
break;
-
+
case 4:
mergemenu();
break;
case 5:
- notice("Removed %d Vertices", removedoublesflag(1, G.scene->toolsettings->doublimit));
+ notice("Removed %d Vertices", removedoublesflag(1, 0, G.scene->toolsettings->doublimit));
BIF_undo_push("Remove Doubles");
break;
case 6:
@@ -2409,6 +2514,7 @@ void special_editmenu(void)
break;
}
+
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
if(nr>0) waitcursor(0);
@@ -2416,7 +2522,7 @@ void special_editmenu(void)
}
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
- nr= pupmenu("Specials%t|Subdivide%x1|Switch Direction%x2|Set Goal Weight %x3|Set Radius %x4");
+ nr= pupmenu("Specials%t|Subdivide%x1|Switch Direction%x2|Set Goal Weight %x3|Set Radius %x4|Smooth Radius %x5");
switch(nr) {
case 1:
@@ -2426,74 +2532,27 @@ void special_editmenu(void)
switchdirectionNurb2();
break;
case 3:
- {
- static float weight= 1.0f;
- extern ListBase editNurb;
- Nurb *nu;
- BezTriple *bezt;
- BPoint *bp;
- int a;
-
- if(fbutton(&weight, 0.0f, 1.0f, 10, 10, "Set Weight")) {
- for(nu= editNurb.first; nu; nu= nu->next) {
- if(nu->bezt) {
- for(bezt=nu->bezt, a=0; a<nu->pntsu; a++, bezt++) {
- if(bezt->f2 & SELECT)
- bezt->weight= weight;
- }
- }
- else if(nu->bp) {
- for(bp=nu->bp, a=0; a<nu->pntsu*nu->pntsv; a++, bp++) {
- if(bp->f1 & SELECT)
- bp->weight= weight;
- }
- }
- }
- }
- }
+ setweightNurb();
break;
case 4:
- {
- static float radius= 1.0f;
- extern ListBase editNurb;
- Nurb *nu;
- BezTriple *bezt;
- BPoint *bp;
- int a;
-
- if(fbutton(&radius, 0.0001f, 10.0f, 10, 10, "Set Radius")) {
- for(nu= editNurb.first; nu; nu= nu->next) {
- if(nu->bezt) {
- for(bezt=nu->bezt, a=0; a<nu->pntsu; a++, bezt++) {
- if(bezt->f2 & SELECT)
- bezt->radius= radius;
- }
- }
- else if(nu->bp) {
- for(bp=nu->bp, a=0; a<nu->pntsu*nu->pntsv; a++, bp++) {
- if(bp->f1 & SELECT)
- bp->radius= radius;
- }
- }
- }
- }
-
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSALL, 0);
- allqueue(REDRAWINFO, 1); /* 1, because header->win==0! */
-
- }
+ setradiusNurb();
+ break;
+ case 5:
+ smoothradiusNurb();
break;
}
-
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
}
else if(G.obedit->type==OB_ARMATURE) {
- nr= pupmenu("Specials%t|Subdivide %x1|Flip Left-Right Names%x2");
+ nr= pupmenu("Specials%t|Subdivide %x1|Subdivide Multi%x2|Flip Left-Right Names%x3");
if(nr==1)
- subdivide_armature();
- else if(nr==2)
+ subdivide_armature(1);
+ if(nr==2) {
+ if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
+ waitcursor(1);
+ subdivide_armature(numcuts);
+ }
+ else if(nr==3)
armature_flip_names();
}
else if(G.obedit->type==OB_LATTICE) {
@@ -3316,6 +3375,9 @@ void copy_attr(short event)
else if(event==29) { /* protected bits */
base->object->protectflag= ob->protectflag;
}
+ else if(event==30) { /* index object */
+ base->object->index= ob->index;
+ }
}
}
base= base->next;
@@ -3334,101 +3396,60 @@ void copy_attr(short event)
BIF_undo_push("Copy Attributes");
}
-void copy_attr_tface(short event)
-{
- /* Face Select Mode */
- Object *ob= OBACT;
- Mesh *me= get_mesh(ob);
- MTFace *tface;
- MFace *mface;
- MCol *activemcol;
- MTFace *activetf= get_active_tface(&activemcol);
- int a;
-
- if(activetf==NULL) return;
-
- tface= me->mtface;
- mface= me->mface;
- for(a=0; a<me->totface; a++, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- switch(event) {
- case 1:
- tface->tpage = activetf->tpage;
- tface->tile= activetf->tile;
- tface->mode |= TF_TEX;
- break;
- case 2:
- memcpy(tface->uv, activetf->uv, sizeof(tface->uv)); break;
- case 3:
- if(activemcol)
- memcpy(&me->mcol[a*4], activemcol, sizeof(MCol)*4); break;
- case 4:
- tface->mode = activetf->mode; break;
- case 5:
- tface->transp= activetf->transp; break;
- }
- }
- }
- DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSEDIT, 0);
- BIF_undo_push("Copy texture face");
-}
-
void copy_attr_menu()
{
Object *ob;
short event;
+ char str[512];
if(!(ob=OBACT)) return;
- if ((G.obedit)) return; /* no editmode copy yet */
+ if (G.obedit) {
+ if (ob->type == OB_MESH)
+ mesh_copy_menu();
+ return;
+ }
- if(G.f & G_FACESELECT) {
- event= pupmenu("Copy Active Texface%t|Image%x1|UV Coords%x2|Color%x3|Mode%x4|Transp%x5");
- copy_attr_tface(event);
+ /* Object Mode */
- } else { /* Object Mode */
-
- /* If you change this menu, don't forget to update the menu in header_view3d.c
- * view3d_edit_object_copyattrmenu() and in toolbox.c
- */
-
- char str[512];
-
- strcpy(str, "Copy Attributes %t|Location%x1|Rotation%x2|Size%x3|Drawtype%x4|Time Offset%x5|Dupli%x6|%l|Mass%x7|Damping%x8|Properties%x9|Logic Bricks%x10|Protected Transform%x29|%l");
-
- strcat (str, "|Object Constraints%x22");
- strcat (str, "|NLA Strips%x26");
-
- if ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL) {
- strcat(str, "|Texture Space%x17");
- }
-
- if(ob->type == OB_FONT) strcat(str, "|Font Settings%x18|Bevel Settings%x19");
- if(ob->type == OB_CURVE) strcat(str, "|Bevel Settings%x19|UV Orco%x28");
-
- if((ob->type == OB_FONT) || (ob->type == OB_CURVE)) {
- strcat(str, "|Curve Resolution%x25");
- }
-
- if(ob->type==OB_MESH){
- strcat(str, "|Subsurf Settings%x21|AutoSmooth%x27");
- }
+ /* If you change this menu, don't forget to update the menu in header_view3d.c
+ * view3d_edit_object_copyattrmenu() and in toolbox.c
+ */
+
+ strcpy(str, "Copy Attributes %t|Location%x1|Rotation%x2|Size%x3|Draw Options%x4|Time Offset%x5|Dupli%x6|%l|Mass%x7|Damping%x8|Properties%x9|Logic Bricks%x10|Protected Transform%x29|%l");
+
+ strcat (str, "|Object Constraints%x22");
+ strcat (str, "|NLA Strips%x26");
+
+ if ELEM5(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_MBALL) {
+ strcat(str, "|Texture Space%x17");
+ }
+
+ if(ob->type == OB_FONT) strcat(str, "|Font Settings%x18|Bevel Settings%x19");
+ if(ob->type == OB_CURVE) strcat(str, "|Bevel Settings%x19|UV Orco%x28");
+
+ if((ob->type == OB_FONT) || (ob->type == OB_CURVE)) {
+ strcat(str, "|Curve Resolution%x25");
+ }
- if( give_parteff(ob) ) strcat(str, "|Particle Settings%x20");
+ if(ob->type==OB_MESH){
+ strcat(str, "|Subsurf Settings%x21|AutoSmooth%x27");
+ }
- if(ob->soft) strcat(str, "|Soft Body Settings%x23");
-
- if(ob->type==OB_MESH || ob->type==OB_CURVE || ob->type==OB_LATTICE || ob->type==OB_SURF){
- strcat(str, "|Modifiers ...%x24");
- }
+ if( give_parteff(ob) ) strcat(str, "|Particle Settings%x20");
- event= pupmenu(str);
- if(event<= 0) return;
-
- copy_attr(event);
+ if(ob->soft) strcat(str, "|Soft Body Settings%x23");
+
+ strcat(str, "|Pass Index%x30");
+
+ if(ob->type==OB_MESH || ob->type==OB_CURVE || ob->type==OB_LATTICE || ob->type==OB_SURF){
+ strcat(str, "|Modifiers ...%x24");
}
+
+ event= pupmenu(str);
+ if(event<= 0) return;
+
+ copy_attr(event);
}
@@ -3512,7 +3533,7 @@ void make_links(short event)
return;
}
else {
- event= pupmenu(strp);
+ event= pupmenu_col(strp, 20);
MEM_freeN(strp);
if(event<= 0) return;
@@ -3710,7 +3731,9 @@ void apply_object()
where_is_object(ob);
}
else if ELEM(ob->type, OB_CURVE, OB_SURF) {
+ float scale;
object_to_mat3(ob, mat);
+ scale = Mat3ToScalef(mat);
cu= ob->data;
if(cu->id.us>1) {
@@ -3731,6 +3754,7 @@ void apply_object()
Mat3MulVecfl(mat, bezt->vec[0]);
Mat3MulVecfl(mat, bezt->vec[1]);
Mat3MulVecfl(mat, bezt->vec[2]);
+ bezt->radius *= scale;
bezt++;
}
}
@@ -4792,6 +4816,11 @@ void adduplicate(int mode, int dupflag)
ID_NEW_US2( obn->data )
else {
obn->data= copy_mesh(obn->data);
+
+ if(obn->fluidsimSettings) {
+ obn->fluidsimSettings->orgMesh = (Mesh *)obn->data;
+ }
+
didit= 1;
}
id->us--;
@@ -5368,7 +5397,10 @@ void mirrormenu(void)
short mode = 0;
- if (G.obedit==0) {
+ if(G.f & G_PARTICLEEDIT) {
+ PE_mirror_x(0);
+ }
+ else if (G.obedit==0) {
mode=pupmenu("Mirror Axis %t|X Local%x4|Y Local%x5|Z Local%x6|");
if (mode==-1) return; /* return */
@@ -5468,14 +5500,17 @@ int object_data_is_libdata(Object *ob)
void hide_objects(int select)
{
Base *base;
- int changed = 0;
+ short changed = 0, changed_act = 0;
for(base = FIRSTBASE; base; base=base->next){
if(TESTBASELIB(base)==select){
base->flag &= ~SELECT;
base->object->flag = base->flag;
base->object->restrictflag |= OB_RESTRICT_VIEW;
changed = 1;
- if (base==BASACT) BASACT= NULL;
+ if (base==BASACT) {
+ BASACT= NULL;
+ changed_act = 1;
+ }
}
}
if (changed) {
@@ -5484,6 +5519,12 @@ void hide_objects(int select)
DAG_scene_sort(G.scene);
allqueue(REDRAWVIEW3D,0);
allqueue(REDRAWOOPS,0);
+ allqueue(REDRAWDATASELECT,0);
+ if (changed_act) { /* these spaces depend on the active object */
+ allqueue(REDRAWBUTSALL,0);
+ allqueue(REDRAWIPO,0);
+ allqueue(REDRAWACTION,0);
+ }
countall();
}
}
diff --git a/source/blender/src/editparticle.c b/source/blender/src/editparticle.c
new file mode 100644
index 00000000000..bdc15c4183a
--- /dev/null
+++ b/source/blender/src/editparticle.c
@@ -0,0 +1,2999 @@
+/* editparticle.c
+ *
+ *
+ * $Id: editparticle.c $
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+#include "DNA_object_force.h"
+#include "DNA_object_types.h"
+#include "DNA_vec_types.h"
+#include "DNA_userdef_types.h"
+#include "DNA_view3d_types.h"
+#include "DNA_screen_types.h"
+#include "DNA_space_types.h"
+
+#include "BKE_bad_level_calls.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_depsgraph.h"
+
+#include "BKE_global.h"
+#include "BKE_object.h"
+#include "BKE_modifier.h"
+#include "BKE_particle.h"
+#include "BKE_scene.h"
+#include "BKE_utildefines.h"
+
+#include "BSE_edit.h"
+
+#include "BLI_arithb.h"
+#include "BLI_blenlib.h"
+#include "BLI_dynstr.h"
+#include "BLI_kdtree.h"
+#include "BLI_rand.h"
+
+#include "PIL_time.h"
+
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+#include "BIF_graphics.h"
+#include "BIF_editparticle.h"
+#include "BIF_editview.h"
+#include "BIF_interface.h"
+#include "BIF_meshtools.h"
+#include "BIF_mywindow.h"
+#include "BIF_resources.h"
+#include "BIF_screen.h"
+#include "BIF_space.h"
+
+#include "BSE_view.h"
+
+#include "BDR_editobject.h" //rightmouse_transform()
+#include "BDR_drawobject.h"
+
+#include "blendef.h"
+#include "mydevice.h"
+
+static void ParticleUndo_clear(ParticleSystem *psys);
+
+#define LOOP_PARTICLES(i,pa) for(i=0, pa=psys->particles; i<totpart; i++, pa++)
+#define LOOP_KEYS(k,key) if(psys->edit)for(k=0, key=psys->edit->keys[i]; k<pa->totkey; k++, key++)
+
+void PE_free_particle_edit(ParticleSystem *psys)
+{
+ ParticleEdit *edit=psys->edit;
+ int i, totpart=psys->totpart;
+
+ if(edit==0) return;
+
+ ParticleUndo_clear(psys);
+
+ if(edit->keys){
+ for(i=0; i<totpart; i++){
+ if(edit->keys[i])
+ MEM_freeN(edit->keys[i]);
+ }
+ MEM_freeN(edit->keys);
+ }
+
+ if(edit->mirror_cache)
+ MEM_freeN(edit->mirror_cache);
+
+ if(edit->emitter_cosnos){
+ MEM_freeN(edit->emitter_cosnos);
+ edit->emitter_cosnos=0;
+ }
+
+ if(edit->emitter_field){
+ BLI_kdtree_free(edit->emitter_field);
+ edit->emitter_field=0;
+ }
+
+ MEM_freeN(edit);
+
+ psys->edit=NULL;
+}
+/************************************************/
+/* Edit Mode Helpers */
+/************************************************/
+static int PE_can_edit(ParticleSystem *psys)
+{
+ return (psys && psys->edit && (G.f & G_PARTICLEEDIT));
+}
+
+ParticleEditSettings *PE_settings()
+{
+ return &G.scene->toolsettings->particle;
+}
+
+void PE_change_act(void *ob_v, void *act_v)
+{
+ Object *ob = ob_v;
+ ParticleSystem *psys;
+ short act = *((short*)act_v) - 1;
+
+ if((psys=psys_get_current(ob)))
+ psys->flag &= ~PSYS_CURRENT;
+
+ if(act>=0){
+ if((psys=BLI_findlink(&ob->particlesystem,act))) {
+ psys->flag |= PSYS_CURRENT;
+ if(G.f & G_PARTICLEEDIT && !psys->edit)
+ PE_create_particle_edit(ob, psys);
+ PE_recalc_world_cos(ob, psys);
+ }
+ }
+}
+
+/* always gets atleast the first particlesystem even if PSYS_CURRENT flag is not set */
+ParticleSystem *PE_get_current(Object *ob)
+{
+ ParticleSystem *psys;
+
+ if(ob==NULL)
+ return NULL;
+
+ psys= ob->particlesystem.first;
+ while(psys){
+ if(psys->flag & PSYS_CURRENT)
+ break;
+ psys=psys->next;
+ }
+
+ if(psys==NULL && ob->particlesystem.first){
+ psys=ob->particlesystem.first;
+ psys->flag |= PSYS_CURRENT;
+ }
+
+ if(psys && ob == OBACT && (G.f & G_PARTICLEEDIT))
+ if(psys->part->type == PART_HAIR && psys->flag & PSYS_EDITED)
+ if(psys->edit == NULL)
+ PE_create_particle_edit(ob, psys);
+
+ return psys;
+}
+/* returns -1 if no system has PSYS_CURRENT flag */
+short PE_get_current_num(Object *ob)
+{
+ short num=0;
+ ParticleSystem *psys = ob->particlesystem.first;
+
+ while(psys){
+ if(psys->flag & PSYS_CURRENT)
+ return num;
+ num++;
+ psys=psys->next;
+ }
+
+ return -1;
+}
+
+void PE_hide_keys_time(ParticleSystem *psys, float cfra)
+{
+ ParticleData *pa;
+ ParticleEditKey *key;
+ ParticleEditSettings *pset=PE_settings();
+ int i,k,totpart=psys->totpart;
+
+ if(pset->draw_timed && G.scene->selectmode==SCE_SELECT_POINT){
+ LOOP_PARTICLES(i,pa){
+ LOOP_KEYS(k,key){
+ if(fabs(cfra-*key->time) < pset->draw_timed)
+ key->flag &= ~PEK_HIDE;
+ else{
+ key->flag |= PEK_HIDE;
+ key->flag &= ~PEK_SELECT;
+ }
+ }
+ }
+ }
+ else{
+ LOOP_PARTICLES(i,pa){
+ LOOP_KEYS(k,key){
+ key->flag &= ~PEK_HIDE;
+ }
+ }
+ }
+}
+
+static int key_inside_circle(short mco[2], float rad, float co[3], float *distance)
+{
+ float dx,dy,dist;
+ short vertco[2];
+
+ project_short(co,vertco);
+ dx=(float)(mco[0]-vertco[0]);
+ dy=(float)(mco[1]-vertco[1]);
+ dist=(float)sqrt((double)(dx*dx + dy*dy));
+
+ if(dist<=rad){
+ if(distance) *distance=dist;
+ return 1;
+ }
+ else
+ return 0;
+}
+static int key_inside_rect(rcti *rect, float co[3])
+{
+ short vertco[2];
+
+ project_short(co,vertco);
+
+ if(vertco[0] > rect->xmin && vertco[0] < rect->xmax &&
+ vertco[1] > rect->ymin && vertco[1] < rect->ymax)
+ return 1;
+ else
+ return 0;
+}
+static int test_key_depth(float *co, bglMats *mats){
+ double ux, uy, uz;
+ float depth;
+ short wco[3], x,y;
+
+ if((G.vd->flag & V3D_ZBUF_SELECT)==0) return 1;
+
+ gluProject(co[0],co[1],co[2], mats->modelview, mats->projection,
+ (GLint *)mats->viewport, &ux, &uy, &uz );
+
+ project_short(co,wco);
+
+ x=wco[0];
+ y=wco[1];
+
+ if(G.vd->depths && x<G.vd->depths->w && y<G.vd->depths->h){
+ if((float)uz>G.vd->depths->depths[y*G.vd->depths->w+x])
+ return 0;
+ else
+ return 1;
+ }
+ else{
+ x+= (short)curarea->winrct.xmin;
+ y+= (short)curarea->winrct.ymin;
+
+ glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
+
+ if((float)uz>depth)
+ return 0;
+ else
+ return 1;
+ }
+}
+
+static int particle_is_selected(ParticleSystem *psys, ParticleData *pa)
+{
+ ParticleEditKey *key;
+ int sel, i, k;
+
+ if(pa->flag&PARS_HIDE) return 0;
+
+ sel=0;
+ i= pa - psys->particles;
+ LOOP_KEYS(k,key)
+ if(key->flag&PEK_SELECT)
+ return 1;
+
+ return 0;
+}
+
+/*-----iterators over editable particles-----*/
+static void for_mouse_hit_keys(int nearest, ParticleSystem *psys, void (*func)(ParticleSystem *psys, int pa_index, int key_index, void *userData), void *userData){
+ /* these are allways the first in this userData */
+ struct { short *mval; float rad; rcti *rect;} *data = userData;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ bglMats mats;
+ int i,k, totpart, nearest_pa=-1, nearest_key=-1;
+ float dist=data->rad;
+
+ if(psys==0 || G.scene->selectmode==SCE_SELECT_PATH) return;
+
+ totpart=psys->totpart;
+
+ bgl_get_mats(&mats);
+
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag & PARS_HIDE) continue;
+
+ if(G.scene->selectmode==SCE_SELECT_END){
+ key=psys->edit->keys[i]+pa->totkey-1;
+
+ if(nearest){
+ if(key_inside_circle(data->mval,dist,key->world_co,&dist) && test_key_depth(key->world_co,&mats)){
+ nearest_pa=i;
+ nearest_key=pa->totkey-1;
+ }
+ }
+ else if(((data->mval)?
+ key_inside_circle(data->mval,data->rad,key->world_co,0):
+ key_inside_rect(data->rect,key->world_co)) && test_key_depth(key->world_co,&mats))
+ func(psys,i,pa->totkey-1,userData);
+ }
+ else{
+ key=psys->edit->keys[i];
+
+ LOOP_KEYS(k,key){
+ if(key->flag&PEK_HIDE) continue;
+
+ if(nearest){
+ if(key_inside_circle(data->mval,dist,key->world_co,&dist) && test_key_depth(key->world_co,&mats)){
+ nearest_pa=i;
+ nearest_key=k;
+ }
+ }
+ else if(((data->mval)?
+ key_inside_circle(data->mval,data->rad,key->world_co,0):
+ key_inside_rect(data->rect,key->world_co)) && test_key_depth(key->world_co,&mats))
+ func(psys,i,k,userData);
+ }
+ }
+ }
+ if(nearest && nearest_pa>-1){
+ func(psys,nearest_pa,nearest_key,userData);
+ }
+}
+static void foreach_mouse_hit_element(int selected, ParticleSystem *psys,void (*func)(ParticleSystem *psys, int index, void *userData), void *userData){
+ /* these are allways the first in this userData */
+ struct { short *mval; float rad; rcti* rect; float dist;} *data = userData;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ bglMats mats;
+ int i,k, totpart;
+
+ if(psys==0) return;
+
+ totpart=psys->totpart;
+
+ bgl_get_mats(&mats);
+
+ if(G.scene->selectmode==SCE_SELECT_PATH)
+ selected=0;
+
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag & PARS_HIDE) continue;
+
+ if(G.scene->selectmode==SCE_SELECT_END){
+ key=psys->edit->keys[i]+pa->totkey-1;
+ if(key_inside_circle(data->mval,data->rad,key->world_co,&data->dist) && (selected==0 || key->flag&PEK_SELECT) && test_key_depth(key->world_co,&mats))
+ func(psys,i,userData);
+ }
+ else{
+ LOOP_KEYS(k,key){
+ if(key->flag&PEK_HIDE) continue;
+
+ if(key_inside_circle(data->mval,data->rad,key->world_co,&data->dist) && (selected==0 || key->flag&PEK_SELECT) && test_key_depth(key->world_co,&mats)){
+ func(psys,i,userData);
+ break;
+ }
+ }
+ }
+ }
+}
+static void foreach_mouse_hit_key(int selected, ParticleSystem *psys,void (*func)(ParticleSystem *psys, float mat[][4], float imat[][4], int bel_index, int key_index, void *userData), void *userData){
+ /* these are allways the first in this userData */
+ struct { Object *ob; short *mval; float rad; rcti* rect; float dist;} *data = userData;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ ParticleSystemModifierData *psmd=0;
+ bglMats mats;
+ int i,k, totpart;
+ float mat[4][4], imat[4][4];
+
+ if(psys==0) return;
+
+ psmd=psys_get_modifier(data->ob,psys);
+
+ totpart=psys->totpart;
+
+ bgl_get_mats(&mats);
+
+ if(G.scene->selectmode==SCE_SELECT_PATH)
+ selected=0;
+
+ Mat4One(imat);
+ Mat4One(mat);
+
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag & PARS_HIDE) continue;
+
+ psys_mat_hair_to_global(data->ob, psmd->dm, psys->part->from, pa, mat);
+ //psys_geometry_mat(psmd->dm,pa,tmat);
+ //Mat4MulMat4(mat,tmat,data->ob->obmat);
+ Mat4Invert(imat,mat);
+
+ if(G.scene->selectmode==SCE_SELECT_END){
+ key=psys->edit->keys[i]+pa->totkey-1;
+ if(key_inside_circle(data->mval,data->rad,key->world_co,&data->dist) && (selected==0 || key->flag&PEK_SELECT) && test_key_depth(key->world_co,&mats))
+ func(psys,mat,imat,i,pa->totkey-1,userData);
+ }
+ else{
+ LOOP_KEYS(k,key){
+ if(key->flag&PEK_HIDE) continue;
+
+ if(key_inside_circle(data->mval,data->rad,key->world_co,&data->dist) && (selected==0 || key->flag&PEK_SELECT) && test_key_depth(key->world_co,&mats)){
+ func(psys,mat,imat,i,k,userData);
+ }
+ }
+ }
+ }
+}
+static void foreach_selected_element(ParticleSystem *psys, void (*func)(ParticleSystem *psys, int index, void *userData), void *userData){
+ ParticleData *pa;
+ int i,totpart;
+
+ if(psys==0) return;
+
+ totpart=psys->totpart;
+
+ LOOP_PARTICLES(i,pa)
+ if(particle_is_selected(psys, pa))
+ func(psys,i,userData);
+}
+static void foreach_selected_key(ParticleSystem *psys, void (*func)(ParticleSystem *psys, int pa_index, int key_index, void *userData), void *userData){
+ ParticleData *pa;
+ ParticleEditKey *key;
+ int i,k,totpart;
+
+ if(psys==0) return;
+
+ totpart=psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag&PARS_HIDE) continue;
+
+ key=psys->edit->keys[i];
+ LOOP_KEYS(k,key){
+ if(key->flag&PEK_SELECT)
+ func(psys,i,k,userData);
+ }
+ }
+}
+void PE_foreach_element(ParticleSystem *psys, void (*func)(ParticleSystem *psys, int index, void *userData), void *userData)
+{
+ int i,totpart;
+
+ if(psys==0) return;
+
+ totpart=psys->totpart;
+
+ for(i=0; i<totpart; i++)
+ func(psys,i,userData);
+}
+static int count_selected_keys(ParticleSystem *psys)
+{
+ ParticleData *pa;
+ ParticleEditKey *key;
+ int i,k,totpart,sel=0;
+
+ if(psys==0) return 0;
+
+ totpart=psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag&PARS_HIDE) continue;
+
+ key=psys->edit->keys[i];
+ if(G.scene->selectmode==SCE_SELECT_POINT){
+ for(k=0; k<pa->totkey; k++,key++){
+ if(key->flag&PEK_SELECT)
+ sel++;
+ }
+ }
+ else if(G.scene->selectmode==SCE_SELECT_END){
+ key+=pa->totkey-1;
+ if(key->flag&PEK_SELECT)
+ sel++;
+ }
+ }
+ return sel;
+}
+
+/************************************************/
+/* Particle Edit Mirroring */
+/************************************************/
+
+static void PE_update_mirror_cache(Object *ob, ParticleSystem *psys)
+{
+ ParticleEdit *edit;
+ ParticleData *pa;
+ ParticleSystemModifierData *psmd;
+ KDTree *tree;
+ KDTreeNearest nearest;
+ float mat[4][4], co[3];
+ int i, index, totpart;
+
+ edit= psys->edit;
+ psmd= psys_get_modifier(ob, psys);
+ totpart= psys->totpart;
+
+ tree= BLI_kdtree_new(totpart);
+
+ /* insert particles into kd tree */
+ LOOP_PARTICLES(i,pa) {
+ psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, mat);
+ VECCOPY(co, pa->hair[0].co);
+ Mat4MulVecfl(mat, co);
+ BLI_kdtree_insert(tree, i, co, NULL);
+ }
+
+ BLI_kdtree_balance(tree);
+
+ /* lookup particles and set in mirror cache */
+ if(!edit->mirror_cache)
+ edit->mirror_cache= MEM_callocN(sizeof(int)*totpart, "PE mirror cache");
+
+ LOOP_PARTICLES(i,pa) {
+ psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, mat);
+ VECCOPY(co, pa->hair[0].co);
+ Mat4MulVecfl(mat, co);
+ co[0]= -co[0];
+
+ index= BLI_kdtree_find_nearest(tree, co, NULL, &nearest);
+
+ /* this needs a custom threshold still, duplicated for editmode mirror */
+ if(index != -1 && index != i && (nearest.dist <= 0.0002f))
+ edit->mirror_cache[i]= index;
+ else
+ edit->mirror_cache[i]= -1;
+ }
+
+ /* make sure mirrors are in two directions */
+ LOOP_PARTICLES(i,pa) {
+ if(edit->mirror_cache[i]) {
+ index= edit->mirror_cache[i];
+ if(edit->mirror_cache[index] != i)
+ edit->mirror_cache[i]= -1;
+ }
+ }
+
+ BLI_kdtree_free(tree);
+}
+
+static void PE_mirror_particle(Object *ob, DerivedMesh *dm, ParticleSystem *psys, ParticleData *pa, ParticleData *mpa)
+{
+ HairKey *hkey, *mhkey;
+ ParticleEditKey *key, *mkey;
+ ParticleEdit *edit;
+ float mat[4][4], mmat[4][4], immat[4][4];
+ int i, mi, k;
+
+ edit= psys->edit;
+ i= pa - psys->particles;
+
+ /* find mirrored particle if needed */
+ if(!mpa) {
+ if(!edit->mirror_cache)
+ PE_update_mirror_cache(ob, psys);
+
+ mi= edit->mirror_cache[i];
+ if(mi == -1)
+ return;
+ mpa= psys->particles + mi;
+ }
+ else
+ mi= mpa - psys->particles;
+
+ /* make sure they have the same amount of keys */
+ if(pa->totkey != mpa->totkey) {
+ if(mpa->hair) MEM_freeN(mpa->hair);
+ if(edit->keys[mi]) MEM_freeN(edit->keys[mi]);
+
+ mpa->hair= MEM_dupallocN(pa->hair);
+ edit->keys[mi]= MEM_dupallocN(edit->keys[i]);
+ mpa->totkey= pa->totkey;
+
+ mhkey= mpa->hair;
+ mkey= edit->keys[mi];
+ for(k=0; k<mpa->totkey; k++, mkey++, mhkey++) {
+ mkey->co= mhkey->co;
+ mkey->time= &mhkey->time;
+ mkey->flag &= PEK_SELECT;
+ }
+ }
+
+ /* mirror positions and tags */
+ psys_mat_hair_to_object(ob, dm, psys->part->from, pa, mat);
+ psys_mat_hair_to_object(ob, dm, psys->part->from, mpa, mmat);
+ Mat4Invert(immat, mmat);
+
+ hkey=pa->hair;
+ mhkey=mpa->hair;
+ key= edit->keys[i];
+ mkey= edit->keys[mi];
+ for(k=0; k<pa->totkey; k++, hkey++, mhkey++, key++, mkey++) {
+ VECCOPY(mhkey->co, hkey->co);
+ Mat4MulVecfl(mat, mhkey->co);
+ mhkey->co[0]= -mhkey->co[0];
+ Mat4MulVecfl(immat, mhkey->co);
+
+ if(key->flag & PEK_TAG)
+ mkey->flag |= PEK_TAG;
+ }
+
+ if(pa->flag & PARS_TAG)
+ mpa->flag |= PARS_TAG;
+ if(pa->flag & PARS_EDIT_RECALC)
+ mpa->flag |= PARS_EDIT_RECALC;
+}
+
+static void PE_apply_mirror(Object *ob, ParticleSystem *psys)
+{
+ ParticleEdit *edit;
+ ParticleData *pa;
+ ParticleSystemModifierData *psmd;
+ int i, totpart;
+
+ edit= psys->edit;
+ psmd= psys_get_modifier(ob, psys);
+ totpart= psys->totpart;
+
+ /* we delay settings the PARS_EDIT_RECALC for mirrored particles
+ * to avoid doing mirror twice */
+ LOOP_PARTICLES(i,pa) {
+ if(pa->flag & PARS_EDIT_RECALC) {
+ PE_mirror_particle(ob, psmd->dm, psys, pa, NULL);
+
+ if(edit->mirror_cache[i] != -1)
+ psys->particles[edit->mirror_cache[i]].flag &= ~PARS_EDIT_RECALC;
+ }
+ }
+
+ LOOP_PARTICLES(i,pa)
+ if(pa->flag & PARS_EDIT_RECALC)
+ if(edit->mirror_cache[i] != -1)
+ psys->particles[edit->mirror_cache[i]].flag |= PARS_EDIT_RECALC;
+
+ edit->totkeys= psys_count_keys(psys);
+}
+
+/************************************************/
+/* Edit Calculation */
+/************************************************/
+/* tries to stop edited particles from going through the emitter's surface */
+static void PE_deflect_emitter(Object *ob, ParticleSystem *psys)
+{
+ ParticleEdit *edit;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ ParticleEditSettings *pset = PE_settings();
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
+ int i,k,totpart,index;
+ float *vec, *nor, dvec[3], dot, dist_1st;
+ float hairimat[4][4], hairmat[4][4];
+
+ if(psys==0)
+ return;
+
+ if((pset->flag & PE_DEFLECT_EMITTER)==0)
+ return;
+
+ edit=psys->edit;
+ totpart=psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ if(!(pa->flag & PARS_EDIT_RECALC))
+ continue;
+
+ psys_mat_hair_to_object(ob, psmd->dm, psys->part->from, pa, hairmat);
+
+ LOOP_KEYS(k,key){
+ Mat4MulVecfl(hairmat, key->co);
+ }
+ //}
+
+ //LOOP_PARTICLES(i,pa){
+ key=psys->edit->keys[i]+1;
+
+ dist_1st=VecLenf((key-1)->co,key->co);
+ dist_1st*=0.75f*pset->emitterdist;
+
+ for(k=1; k<pa->totkey; k++, key++){
+ index= BLI_kdtree_find_nearest(edit->emitter_field,key->co,NULL,NULL);
+
+ vec=edit->emitter_cosnos +index*6;
+ nor=vec+3;
+
+ VecSubf(dvec, key->co, vec);
+
+ dot=Inpf(dvec,nor);
+ VECCOPY(dvec,nor);
+
+ if(dot>0.0f){
+ if(dot<dist_1st){
+ Normalize(dvec);
+ VecMulf(dvec,dist_1st-dot);
+ VecAddf(key->co,key->co,dvec);
+ }
+ }
+ else{
+ Normalize(dvec);
+ VecMulf(dvec,dist_1st-dot);
+ VecAddf(key->co,key->co,dvec);
+ }
+ if(k==1)
+ dist_1st*=1.3333f;
+ }
+ //}
+
+ //LOOP_PARTICLES(i,pa){
+
+ Mat4Invert(hairimat,hairmat);
+
+ LOOP_KEYS(k,key){
+ Mat4MulVecfl(hairimat, key->co);
+ }
+ }
+}
+/* force set distances between neighbouring keys */
+void PE_apply_lengths(ParticleSystem *psys)
+{
+ ParticleEdit *edit;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ ParticleEditSettings *pset=PE_settings();
+ int i,k,totpart;
+ float dv1[3];
+
+ if(psys==0)
+ return;
+
+ if((pset->flag & PE_KEEP_LENGTHS)==0)
+ return;
+
+ edit=psys->edit;
+ totpart=psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ if(!(pa->flag & PARS_EDIT_RECALC))
+ continue;
+
+ for(k=1, key=edit->keys[i] + 1; k<pa->totkey; k++, key++){
+ VecSubf(dv1, key->co, (key - 1)->co);
+ Normalize(dv1);
+ VecMulf(dv1, (key - 1)->length);
+ VecAddf(key->co, (key - 1)->co, dv1);
+ }
+ }
+}
+/* try to find a nice solution to keep distances between neighbouring keys */
+static void PE_iterate_lengths(ParticleSystem *psys)
+{
+ ParticleEdit *edit;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ ParticleEditSettings *pset=PE_settings();
+ int i, j, k,totpart;
+ float tlen;
+ float dv0[3] = {0.0f, 0.0f, 0.0f};
+ float dv1[3] = {0.0f, 0.0f, 0.0f};
+ float dv2[3] = {0.0f, 0.0f, 0.0f};
+
+ if(psys==0)
+ return;
+
+ if((pset->flag & PE_KEEP_LENGTHS)==0)
+ return;
+
+ edit=psys->edit;
+ totpart=psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ if(!(pa->flag & PARS_EDIT_RECALC))
+ continue;
+
+ for(j=1; j<pa->totkey; j++){
+ float mul = 1.0f / (float)pa->totkey;
+
+ if(pset->flag & PE_LOCK_FIRST){
+ key = edit->keys[i] + 1;
+ k = 1;
+ dv1[0] = dv1[1] = dv1[2] = 0.0;
+ }
+ else{
+ key = edit->keys[i];
+ k = 0;
+ dv0[0] = dv0[1] = dv0[2] = 0.0;
+ }
+
+ for(; k<pa->totkey; k++, key++){
+ if(k){
+ VecSubf(dv0, (key - 1)->co, key->co);
+ tlen = Normalize(dv0);
+ VecMulf(dv0, (mul * (tlen - (key - 1)->length)));
+ }
+
+ if(k < pa->totkey - 1){
+ VecSubf(dv2, (key + 1)->co, key->co);
+ tlen = Normalize(dv2);
+ VecMulf(dv2, mul * (tlen - key->length));
+ }
+
+ if(k){
+ VecAddf((key-1)->co,(key-1)->co,dv1);
+ }
+
+ VECADD(dv1,dv0,dv2);
+ }
+ }
+ }
+}
+/* set current distances to be kept between neighbouting keys */
+static void recalc_lengths(ParticleSystem *psys)
+{
+ ParticleData *pa;
+ ParticleEditKey *key;
+ int i, k, totpart;
+
+ if(psys==0)
+ return;
+
+ totpart = psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ key = psys->edit->keys[i];
+ for(k=0; k<pa->totkey-1; k++, key++){
+ key->length = VecLenf(key->co, (key + 1)->co);
+ }
+ }
+}
+/* calculate and store key locations in world coordinates */
+void PE_recalc_world_cos(Object *ob, ParticleSystem *psys)
+{
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob, psys);
+ ParticleData *pa;
+ ParticleEditKey *key;
+ int i, k, totpart;
+ float hairmat[4][4];
+
+ if(psys==0)
+ return;
+
+ totpart = psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
+
+ LOOP_KEYS(k,key){
+ VECCOPY(key->world_co,key->co);
+ Mat4MulVecfl(hairmat, key->world_co);
+ }
+ }
+}
+/* calculate a tree for finding nearest emitter's vertice */
+static void recalc_emitter_field(Object *ob, ParticleSystem *psys)
+{
+ DerivedMesh *dm=psys_get_modifier(ob,psys)->dm;
+ ParticleEdit *edit = psys->edit;
+ MFace *mface;
+ MVert *mvert;
+ float *vec, *nor;
+ int i, totface, totvert;
+
+ if(edit->emitter_cosnos)
+ MEM_freeN(edit->emitter_cosnos);
+
+ BLI_kdtree_free(edit->emitter_field);
+
+ totface=dm->getNumFaces(dm);
+ totvert=dm->getNumVerts(dm);
+
+ edit->emitter_cosnos=MEM_callocN(totface*6*sizeof(float),"emitter cosnos");
+
+ edit->emitter_field= BLI_kdtree_new(totface);
+
+ vec=edit->emitter_cosnos;
+ nor=vec+3;
+
+ mvert=dm->getVertDataArray(dm,CD_MVERT);
+ for(i=0; i<totface; i++, vec+=6, nor+=6){
+ mface=dm->getFaceData(dm,i,CD_MFACE);
+
+ mvert=dm->getVertData(dm,mface->v1,CD_MVERT);
+ VECCOPY(vec,mvert->co);
+ VECCOPY(nor,mvert->no);
+
+ mvert=dm->getVertData(dm,mface->v2,CD_MVERT);
+ VECADD(vec,vec,mvert->co);
+ VECADD(nor,nor,mvert->no);
+
+ mvert=dm->getVertData(dm,mface->v3,CD_MVERT);
+ VECADD(vec,vec,mvert->co);
+ VECADD(nor,nor,mvert->no);
+
+ if (mface->v4){
+ mvert=dm->getVertData(dm,mface->v4,CD_MVERT);
+ VECADD(vec,vec,mvert->co);
+ VECADD(nor,nor,mvert->no);
+
+ VecMulf(vec,0.25);
+ }
+ else
+ VecMulf(vec,0.3333f);
+
+ Normalize(nor);
+
+ BLI_kdtree_insert(edit->emitter_field, i, vec, NULL);
+ }
+
+ BLI_kdtree_balance(edit->emitter_field);
+}
+
+void PE_update_selection(Object *ob)
+{
+ ParticleSystem *psys= PE_get_current(ob);
+ ParticleEdit *edit= psys->edit;
+ ParticleData *pa;
+ HairKey *hkey;
+ ParticleEditKey *key;
+ int i, k, totpart;
+
+ totpart= psys->totpart;
+
+ /* flush edit key flag to hair key flag to preserve selection
+ * on save */
+ LOOP_PARTICLES(i,pa) {
+ key = edit->keys[i];
+
+ for(k=0, hkey=pa->hair; k<pa->totkey; k++, hkey++, key++)
+ hkey->editflag= key->flag;
+ }
+
+ psys_cache_paths(ob, psys, CFRA, 0);
+}
+
+void PE_update_object(Object *ob, int useflag)
+{
+ ParticleSystem *psys= PE_get_current(ob);
+ ParticleEditSettings *pset= PE_settings();
+ ParticleSettings *part= psys->part;
+ ParticleData *pa;
+ float cfra= CFRA;
+ int i, totpart= psys->totpart;
+
+ /* flag all particles to be updated if not using flag */
+ if(!useflag)
+ LOOP_PARTICLES(i,pa)
+ pa->flag |= PARS_EDIT_RECALC;
+
+ /* do post process on particle edit keys */
+ PE_iterate_lengths(psys);
+ PE_deflect_emitter(ob,psys);
+ PE_apply_lengths(psys);
+ if(pset->flag & PE_X_MIRROR)
+ PE_apply_mirror(ob,psys);
+ PE_recalc_world_cos(ob,psys);
+ PE_hide_keys_time(psys,cfra);
+
+ /* regenerate path caches */
+ psys_cache_paths(ob, psys, cfra, 1);
+
+ if(part->childtype && (pset->flag & PE_SHOW_CHILD))
+ psys_cache_child_paths(ob, psys, cfra, 1);
+
+ /* disable update flag */
+ LOOP_PARTICLES(i,pa)
+ pa->flag &= ~PARS_EDIT_RECALC;
+}
+
+/* initialize needed data for bake edit */
+void PE_create_particle_edit(Object *ob, ParticleSystem *psys)
+{
+ ParticleEdit *edit=psys->edit;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ HairKey *hkey;
+ int i,k, totpart=psys->totpart, alloc=1;
+
+ if((psys->flag & PSYS_EDITED)==0)
+ return;
+
+ if(edit){
+ int newtotkeys = psys_count_keys(psys);
+ if(newtotkeys == edit->totkeys)
+ alloc=0;
+ }
+
+ if(alloc){
+ if(edit){
+ error("ParticleEdit exists allready! Poke jahka!");
+ PE_free_particle_edit(psys);
+ }
+
+ edit=psys->edit=MEM_callocN(sizeof(ParticleEdit), "PE_create_particle_edit");
+
+ edit->keys=MEM_callocN(totpart*sizeof(ParticleEditKey*),"ParticleEditKey array");
+
+ LOOP_PARTICLES(i,pa){
+ key = edit->keys[i] = MEM_callocN(pa->totkey*sizeof(ParticleEditKey),"ParticleEditKeys");
+ for(k=0, hkey=pa->hair; k<pa->totkey; k++, hkey++, key++){
+ key->co = hkey->co;
+ key->time = &hkey->time;
+ key->flag= hkey->editflag;
+ }
+ }
+
+ edit->totkeys = psys_count_keys(psys);
+ }
+
+ recalc_lengths(psys);
+ recalc_emitter_field(ob, psys);
+ PE_recalc_world_cos(ob, psys);
+
+ if(alloc) {
+ ParticleUndo_clear(psys);
+ PE_undo_push("Original");
+ }
+}
+
+/* toggle particle mode on & off */
+void PE_set_particle_edit(void)
+{
+ Object *ob= OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+
+ scrarea_queue_headredraw(curarea);
+
+ //if(!ob || ob->id.lib) return; /* is the id.lib test needed? -jahka*/
+ if(ob==0 || psys==0) return;
+
+ if(psys==0){
+ if(ob->particlesystem.first){
+ psys=ob->particlesystem.first;
+ psys->flag |= PSYS_CURRENT;
+ }
+ else
+ return;
+ }
+
+ if((G.f & G_PARTICLEEDIT)==0){
+ if(psys && psys->part->type == PART_HAIR && psys->flag & PSYS_EDITED) {
+ if(psys->edit==0)
+ PE_create_particle_edit(ob, psys);
+ PE_recalc_world_cos(ob, psys);
+ }
+
+ G.f |= G_PARTICLEEDIT;
+ }
+ else{
+ G.f &= ~G_PARTICLEEDIT;
+
+ if(psys->soft)
+ psys->softflag |= OB_SB_REDO;
+ }
+
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+
+ allqueue(REDRAWVIEW3D, 1); /* including header */
+ allqueue(REDRAWBUTSOBJECT, 0);
+}
+/************************************************/
+/* Edit Selections */
+/************************************************/
+/*-----selection callbacks-----*/
+static void select_key(ParticleSystem *psys, int pa_index, int key_index, void *userData)
+{
+ struct { short *mval; float rad; rcti* rect; int select; } *data = userData;
+ ParticleEditKey *key = psys->edit->keys[pa_index] + key_index;
+
+ if(data->select)
+ key->flag|=PEK_SELECT;
+ else
+ key->flag&=~PEK_SELECT;
+}
+static void select_keys(ParticleSystem *psys, int pa_index, int key_index, void *userData)
+{
+ struct { short *mval; float rad; rcti* rect; int select; } *data = userData;
+ ParticleData *pa = psys->particles + pa_index;
+ ParticleEditKey *key = psys->edit->keys[pa_index];
+ int k;
+
+ for(k=0; k<pa->totkey; k++,key++){
+ if(data->select)
+ key->flag|=PEK_SELECT;
+ else
+ key->flag&=~PEK_SELECT;
+ }
+
+}
+static void toggle_key_select(ParticleSystem *psys, int pa_index, int key_index, void *userData)
+{
+ if(psys->edit->keys[pa_index][key_index].flag&PEK_SELECT)
+ psys->edit->keys[pa_index][key_index].flag&=~PEK_SELECT;
+ else
+ psys->edit->keys[pa_index][key_index].flag|=PEK_SELECT;
+}
+static void select_root(ParticleSystem *psys, int index, void *userData)
+{
+ psys->edit->keys[index]->flag |= PEK_SELECT;
+}
+
+static void select_tip(ParticleSystem *psys, int index, void *userData)
+{
+ ParticleData *pa = psys->particles + index;
+ ParticleEditKey *key = psys->edit->keys[index] + pa->totkey-1;
+
+ key->flag |= PEK_SELECT;
+}
+static void select_more_keys(ParticleSystem *psys, int index, void *userData)
+{
+ ParticleEdit *edit = psys->edit;
+ ParticleData *pa = psys->particles+index;
+ ParticleEditKey *key;
+ int k;
+
+ for(k=0,key=edit->keys[index]; k<pa->totkey; k++,key++){
+ if(key->flag&PEK_SELECT) continue;
+
+ if(k==0){
+ if((key+1)->flag&PEK_SELECT)
+ key->flag |= PEK_TO_SELECT;
+ }
+ else if(k==pa->totkey-1){
+ if((key-1)->flag&PEK_SELECT)
+ key->flag |= PEK_TO_SELECT;
+ }
+ else{
+ if(((key-1)->flag | (key+1)->flag) & PEK_SELECT)
+ key->flag |= PEK_TO_SELECT;
+ }
+ }
+
+ for(k=0,key=edit->keys[index]; k<pa->totkey; k++,key++){
+ if(key->flag&PEK_TO_SELECT){
+ key->flag &= ~PEK_TO_SELECT;
+ key->flag |= PEK_SELECT;
+ }
+ }
+}
+
+static void select_less_keys(ParticleSystem *psys, int index, void *userData)
+{
+ ParticleEdit *edit = psys->edit;
+ ParticleData *pa = psys->particles+index;
+ ParticleEditKey *key;
+ int k;
+
+ for(k=0,key=edit->keys[index]; k<pa->totkey; k++,key++){
+ if((key->flag&PEK_SELECT)==0) continue;
+
+ if(k==0){
+ if(((key+1)->flag&PEK_SELECT)==0)
+ key->flag |= PEK_TO_SELECT;
+ }
+ else if(k==pa->totkey-1){
+ if(((key-1)->flag&PEK_SELECT)==0)
+ key->flag |= PEK_TO_SELECT;
+ }
+ else{
+ if((((key-1)->flag & (key+1)->flag) & PEK_SELECT)==0)
+ key->flag |= PEK_TO_SELECT;
+ }
+ }
+
+ for(k=0,key=edit->keys[index]; k<pa->totkey; k++,key++){
+ if(key->flag&PEK_TO_SELECT)
+ key->flag &= ~(PEK_TO_SELECT|PEK_SELECT);
+ }
+}
+
+/*-----using above callbacks-----*/
+void PE_deselectall(void)
+{
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleEdit *edit = 0;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ int i,k,totpart, sel = 0;
+
+ if(!PE_can_edit(psys)) return;
+
+ edit = psys->edit;
+
+ totpart = psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag & PARS_HIDE) continue;
+ LOOP_KEYS(k,key){
+ if(key->flag&PEK_SELECT){
+ sel = 1;
+ key->flag &= ~PEK_SELECT;
+ }
+ }
+ }
+
+ if(sel==0){
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag & PARS_HIDE) continue;
+ LOOP_KEYS(k,key){
+ key->flag |= PEK_SELECT;
+ }
+ }
+ }
+
+ PE_update_selection(ob);
+
+ BIF_undo_push("(De)select all keys");
+ allqueue(REDRAWVIEW3D, 1);
+}
+void PE_mouse_particles(void)
+{
+ struct { short *mval; float rad; rcti* rect; int select; } data;
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleEdit *edit = 0;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ short mval[2];
+ int i,k,totpart;
+
+ if(!PE_can_edit(psys)) return;
+
+ edit = psys->edit;
+
+ totpart = psys->totpart;
+
+ bglFlush();
+ glReadBuffer(GL_BACK);
+ glDrawBuffer(GL_BACK);
+ persp(PERSP_VIEW);
+
+ if(G.qual != LR_SHIFTKEY)
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag & PARS_HIDE) continue;
+ LOOP_KEYS(k,key){
+ key->flag &= ~PEK_SELECT;
+ }
+ }
+
+ getmouseco_areawin(mval);
+
+ data.mval=mval;
+ data.rad=75.0f;
+ data.rect=0;
+ data.select=0;
+
+ for_mouse_hit_keys(1,psys,toggle_key_select,&data);
+
+ PE_update_selection(ob);
+
+ rightmouse_transform();
+
+ allqueue(REDRAWVIEW3D, 1);
+}
+void PE_select_root()
+{
+ Object *ob=OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+
+ if(!PE_can_edit(psys)) return;
+
+ PE_foreach_element(psys,select_root,NULL);
+ BIF_undo_push("Select first");
+}
+void PE_select_tip()
+{
+ Object *ob=OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+
+ if(!PE_can_edit(psys)) return;
+
+ PE_foreach_element(psys,select_tip,NULL);
+ BIF_undo_push("Select last");
+}
+void PE_select_linked(void)
+{
+ struct { short *mval; float rad; rcti* rect; int select; } data;
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ short mval[2];
+
+ if(!PE_can_edit(psys)) return;
+
+ getmouseco_areawin(mval);
+
+ data.mval=mval;
+ data.rad=75.0f;
+ data.rect=0;
+ data.select=(G.qual != LR_SHIFTKEY);
+
+ for_mouse_hit_keys(1,psys,select_keys,&data);
+
+ PE_update_selection(ob);
+
+ BIF_undo_push("Select linked keys");
+
+ allqueue(REDRAWVIEW3D, 1);
+ return;
+}
+void PE_borderselect(void)
+{
+ struct { short *mval; float rad; rcti* rect; int select; } data;
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ rcti rect;
+ int val;
+
+ if(!PE_can_edit(psys)) return;
+
+ setlinestyle(2);
+ val= get_border(&rect, 3);
+ setlinestyle(0);
+
+ if(val==0) return;
+
+ data.mval=0;
+ data.rect=&rect;
+ data.select=(val==LEFTMOUSE);
+
+ for_mouse_hit_keys(0,psys,select_key,&data);
+
+ PE_update_selection(ob);
+
+ BIF_undo_push("Select keys");
+
+ allqueue(REDRAWVIEW3D, 1);
+ return;
+}
+void PE_selectionCB(short selecting, Object *editobj, short *mval, float rad)
+{
+ struct { short *mval; float rad; rcti* rect; int select; } data;
+ ParticleSystem *psys = PE_get_current(OBACT);
+
+ if(!PE_can_edit(psys)) return;
+
+ data.mval=mval;
+ data.rad=rad;
+ data.rect=0;
+ data.select=(selecting==LEFTMOUSE);
+
+ for_mouse_hit_keys(0,psys,select_key,&data);
+
+ draw_sel_circle(0, 0, 0, 0, 0); /* signal */
+ force_draw(0);
+}
+void PE_do_lasso_select(short mcords[][2], short moves, short select)
+{
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleSystemModifierData *psmd;
+ ParticleEdit *edit;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ float co[3], mat[4][4];
+ short vertco[2];
+ int i, k, totpart;
+
+ if(!PE_can_edit(psys)) return;
+
+ psmd= psys_get_modifier(ob, psys);
+ edit=psys->edit;
+ totpart=psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag & PARS_HIDE) continue;
+
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, mat);
+
+ if(G.scene->selectmode==SCE_SELECT_POINT){
+ LOOP_KEYS(k,key){
+ VECCOPY(co, key->co);
+ Mat4MulVecfl(mat, co);
+ project_short(co,vertco);
+ if(lasso_inside(mcords,moves,vertco[0],vertco[1])){
+ if(select)
+ key->flag|=PEK_SELECT;
+ else
+ key->flag&=~PEK_SELECT;
+ }
+ }
+ }
+ else if(G.scene->selectmode==SCE_SELECT_END){
+ key = edit->keys[i] + pa->totkey - 1;
+
+ VECCOPY(co, key->co);
+ Mat4MulVecfl(mat, co);
+ project_short(co,vertco);
+ if(lasso_inside(mcords,moves,vertco[0],vertco[1])){
+ if(select)
+ key->flag|=PEK_SELECT;
+ else
+ key->flag&=~PEK_SELECT;
+ }
+ }
+ }
+
+ PE_update_selection(ob);
+
+ BIF_undo_push("Lasso select particles");
+
+ allqueue(REDRAWVIEW3D, 1);
+}
+void PE_hide(int mode)
+{
+ ParticleSystem *psys = PE_get_current(OBACT);
+ ParticleEdit *edit;
+ ParticleData *pa;
+ int i,totpart;
+
+ if(!PE_can_edit(psys)) return;
+
+ edit = psys->edit;
+ totpart = psys->totpart;
+
+ if(mode == 0){ /* reveal all particles */
+ LOOP_PARTICLES(i,pa){
+ pa->flag &= ~PARS_HIDE;
+ }
+ }
+ else if(mode == 1){ /* hide unselected particles */
+ LOOP_PARTICLES(i,pa)
+ if(particle_is_selected(psys, pa))
+ pa->flag |= PARS_HIDE;
+ }
+ else{ /* hide selected particles */
+ LOOP_PARTICLES(i,pa)
+ if(particle_is_selected(psys, pa))
+ pa->flag |= PARS_HIDE;
+ }
+
+ BIF_undo_push("(Un)hide elements");
+
+ allqueue(REDRAWVIEW3D, 1);
+}
+void PE_select_less(void)
+{
+ ParticleSystem *psys = PE_get_current(OBACT);
+
+ if(!PE_can_edit(psys)) return;
+
+ PE_foreach_element(psys,select_less_keys,NULL);
+
+ BIF_undo_push("Select less");
+ allqueue(REDRAWVIEW3D, 1);
+}
+void PE_select_more(void)
+{
+ ParticleSystem *psys = PE_get_current(OBACT);
+
+ if(!PE_can_edit(psys)) return;
+
+ PE_foreach_element(psys,select_more_keys,NULL);
+
+ BIF_undo_push("Select more");
+ allqueue(REDRAWVIEW3D, 1);
+}
+/************************************************/
+/* Edit Rekey */
+/************************************************/
+static void rekey_element(ParticleSystem *psys, int index, void *userData)
+{
+ struct { Object *ob; float dval; } *data = userData;
+ ParticleData *pa = psys->particles + index;
+ ParticleEdit *edit = psys->edit;
+ ParticleEditSettings *pset = PE_settings();
+ ParticleKey state;
+ HairKey *key, *new_keys;
+ ParticleEditKey *ekey;
+ float dval, sta, end;
+ int k;
+
+ pa->flag |= PARS_REKEY;
+
+ key = new_keys = MEM_callocN(pset->totrekey * sizeof(HairKey),"Hair re-key keys");
+
+ /* root and tip stay the same */
+ VECCOPY(key->co, pa->hair->co);
+ VECCOPY((key + pset->totrekey - 1)->co, (pa->hair + pa->totkey - 1)->co);
+
+ sta = key->time = pa->hair->time;
+ end = (key + pset->totrekey - 1)->time = (pa->hair + pa->totkey - 1)->time;
+ dval = (end - sta) / (float)(pset->totrekey - 1);
+
+ /* interpolate new keys from old ones */
+ for(k=1,key++; k<pset->totrekey-1; k++,key++) {
+ state.time = (float)k / (float)(pset->totrekey-1);
+ psys_get_particle_on_path(data->ob, psys, index, &state, 0);
+ VECCOPY(key->co, state.co);
+ key->time = sta + k * dval;
+ }
+
+ /* replace keys */
+ if(pa->hair)
+ MEM_freeN(pa->hair);
+ pa->hair = new_keys;
+
+ pa->totkey=pset->totrekey;
+
+ if(edit->keys[index])
+ MEM_freeN(edit->keys[index]);
+ ekey = edit->keys[index] = MEM_callocN(pa->totkey * sizeof(ParticleEditKey),"Hair re-key edit keys");
+
+ for(k=0, key=pa->hair; k<pa->totkey; k++, key++, ekey++) {
+ ekey->co = key->co;
+ ekey->time = &key->time;
+ }
+
+ pa->flag &= ~PARS_REKEY;
+ pa->flag |= PARS_EDIT_RECALC;
+}
+void PE_rekey(void)
+{
+ Object *ob=OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleEditSettings *pset = PE_settings();
+ struct { Object *ob; float dval; } data;
+
+ if(!PE_can_edit(psys)) return;
+
+ data.ob = ob;
+ data.dval = 1.0f / (float)(pset->totrekey-1);
+
+ foreach_selected_element(psys,rekey_element,&data);
+
+ psys->edit->totkeys = psys_count_keys(psys);
+
+ recalc_lengths(psys);
+
+ PE_update_object(ob, 1);
+
+ BIF_undo_push("Re-key particles");
+}
+static void rekey_element_to_time(int index, float path_time)
+{
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleEdit *edit=0;
+ ParticleData *pa;
+ ParticleKey state;
+ HairKey *new_keys, *key;
+ ParticleEditKey *ekey;
+ int k;
+
+ if(psys==0) return;
+
+ edit = psys->edit;
+
+ pa = psys->particles + index;
+
+ pa->flag |= PARS_REKEY;
+
+ key = new_keys = MEM_dupallocN(pa->hair);
+
+ /* interpolate new keys from old ones (roots stay the same) */
+ for(k=1, key++; k < pa->totkey; k++, key++) {
+ state.time = path_time * (float)k / (float)(pa->totkey-1);
+ psys_get_particle_on_path(ob, psys, index, &state, 0);
+ VECCOPY(key->co, state.co);
+ }
+
+ /* replace hair keys */
+ if(pa->hair)
+ MEM_freeN(pa->hair);
+ pa->hair = new_keys;
+
+ /* update edit pointers */
+ for(k=0, key=pa->hair, ekey=edit->keys[index]; k<pa->totkey; k++, key++, ekey++) {
+ ekey->co = key->co;
+ ekey->time = &key->time;
+ }
+
+ pa->flag &= ~PARS_REKEY;
+}
+static void remove_tagged_elements(Object *ob, ParticleSystem *psys)
+{
+ ParticleEdit *edit = psys->edit;
+ ParticleEditSettings *pset = PE_settings();
+ ParticleData *pa, *npa=0, *new_pars=0;
+ ParticleEditKey **key, **nkey=0, **new_keys=0;
+ ParticleSystemModifierData *psmd;
+ int i, totpart, new_totpart = psys->totpart;
+
+ if(pset->flag & PE_X_MIRROR) {
+ /* mirror tags */
+ psmd = psys_get_modifier(ob, psys);
+ totpart = psys->totpart;
+
+ LOOP_PARTICLES(i,pa)
+ if(pa->flag & PARS_TAG)
+ PE_mirror_particle(ob, psmd->dm, psys, pa, NULL);
+ }
+
+ for(i=0, pa=psys->particles; i<psys->totpart; i++, pa++)
+ if(pa->flag & PARS_TAG)
+ new_totpart--;
+
+ if(new_totpart != psys->totpart) {
+ if(new_totpart) {
+ npa = new_pars = MEM_callocN(new_totpart * sizeof(ParticleData), "ParticleData array");
+ nkey = new_keys = MEM_callocN(new_totpart * sizeof(ParticleEditKey *), "ParticleEditKey array");
+ }
+
+ pa = psys->particles;
+ key = edit->keys;
+ for(i=0; i<psys->totpart; i++, pa++, key++) {
+ if(pa->flag & PARS_TAG) {
+ if(*key)
+ MEM_freeN(*key);
+ if(pa->hair)
+ MEM_freeN(pa->hair);
+ }
+ else {
+ memcpy(npa, pa, sizeof(ParticleData));
+ memcpy(nkey, key, sizeof(ParticleEditKey*));
+ npa++;
+ nkey++;
+ }
+ }
+
+ MEM_freeN(psys->particles);
+ psys->particles = new_pars;
+
+ MEM_freeN(edit->keys);
+ edit->keys = new_keys;
+
+ if(edit->mirror_cache) {
+ MEM_freeN(edit->mirror_cache);
+ edit->mirror_cache = NULL;
+ }
+
+ psys->totpart = new_totpart;
+
+ edit->totkeys = psys_count_keys(psys);
+ }
+}
+static void remove_tagged_keys(Object *ob, ParticleSystem *psys)
+{
+ ParticleEdit *edit = psys->edit;
+ ParticleEditSettings *pset = PE_settings();
+ ParticleData *pa;
+ HairKey *key, *nkey, *new_keys=0;
+ ParticleEditKey *ekey;
+ ParticleSystemModifierData *psmd;
+ int i, k, totpart = psys->totpart;
+ short new_totkey;
+
+ if(pset->flag & PE_X_MIRROR) {
+ /* mirror key tags */
+ psmd = psys_get_modifier(ob, psys);
+
+ LOOP_PARTICLES(i,pa) {
+ LOOP_KEYS(k,ekey) {
+ if(ekey->flag & PEK_TAG) {
+ PE_mirror_particle(ob, psmd->dm, psys, pa, NULL);
+ break;
+ }
+ }
+ }
+ }
+
+ LOOP_PARTICLES(i,pa) {
+ new_totkey = pa->totkey;
+ LOOP_KEYS(k,ekey) {
+ if(ekey->flag & PEK_TAG)
+ new_totkey--;
+ }
+ /* we can't have elements with less than two keys*/
+ if(new_totkey < 2)
+ pa->flag |= PARS_TAG;
+ }
+ remove_tagged_elements(ob, psys);
+
+ totpart = psys->totpart;
+
+ LOOP_PARTICLES(i,pa) {
+ new_totkey = pa->totkey;
+ LOOP_KEYS(k,ekey) {
+ if(ekey->flag & PEK_TAG)
+ new_totkey--;
+ }
+ if(new_totkey != pa->totkey) {
+ key = pa->hair;
+ nkey = new_keys = MEM_callocN(new_totkey*sizeof(HairKey), "HairKeys");
+
+ for(k=0, ekey=edit->keys[i]; k<new_totkey; k++, key++, nkey++, ekey++) {
+ while(ekey->flag & PEK_TAG && key < pa->hair + pa->totkey) {
+ key++;
+ ekey++;
+ }
+
+ if(key < pa->hair + pa->totkey) {
+ VECCOPY(nkey->co, key->co);
+ nkey->time = key->time;
+ nkey->weight = key->weight;
+ }
+ }
+ if(pa->hair)
+ MEM_freeN(pa->hair);
+
+ pa->hair = new_keys;
+
+ pa->totkey=new_totkey;
+
+ if(edit->keys[i])
+ MEM_freeN(edit->keys[i]);
+ ekey = edit->keys[i] = MEM_callocN(new_totkey*sizeof(ParticleEditKey), "particle edit keys");
+
+ for(k=0, key=pa->hair; k<pa->totkey; k++, key++, ekey++) {
+ ekey->co = key->co;
+ ekey->time = &key->time;
+ }
+ }
+ }
+
+ edit->totkeys = psys_count_keys(psys);
+}
+/* works like normal edit mode subdivide, inserts keys between neighbouring selected keys */
+static void subdivide_element(ParticleSystem *psys, int index, void *userData)
+{
+ struct { Object *ob; } *data = userData;
+ ParticleEdit *edit = psys->edit;
+ ParticleData *pa = psys->particles + index;
+
+ ParticleKey state;
+ HairKey *key, *nkey, *new_keys;
+ ParticleEditKey *ekey, *nekey, *new_ekeys;
+
+ int k;
+ short totnewkey=0;
+ float endtime;
+
+ for(k=0, ekey=edit->keys[index]; k<pa->totkey-1; k++,ekey++){
+ if(ekey->flag&PEK_SELECT && (ekey+1)->flag&PEK_SELECT)
+ totnewkey++;
+ }
+
+ if(totnewkey==0) return;
+
+ pa->flag |= PARS_REKEY;
+
+ nkey = new_keys = MEM_callocN((pa->totkey+totnewkey)*(sizeof(HairKey)),"Hair subdivide keys");
+ nekey = new_ekeys = MEM_callocN((pa->totkey+totnewkey)*(sizeof(ParticleEditKey)),"Hair subdivide edit keys");
+ endtime = pa->hair[pa->totkey-1].time;
+
+ for(k=0, key=pa->hair, ekey=edit->keys[index]; k<pa->totkey-1; k++, key++, ekey++){
+
+ memcpy(nkey,key,sizeof(HairKey));
+ memcpy(nekey,ekey,sizeof(ParticleEditKey));
+
+ nekey->co = nkey->co;
+ nekey->time = &nkey->time;
+
+ nkey++;
+ nekey++;
+
+ if(ekey->flag & PEK_SELECT && (ekey+1)->flag & PEK_SELECT){
+ nkey->time= (key->time + (key+1)->time)*0.5f;
+ state.time = (endtime != 0.0f)? nkey->time/endtime: 0.0f;
+ psys_get_particle_on_path(data->ob, psys, index, &state, 0);
+ VECCOPY(nkey->co, state.co);
+
+ nekey->co= nkey->co;
+ nekey->time= &nkey->time;
+ nekey->flag |= PEK_SELECT;
+
+ nekey++;
+ nkey++;
+ }
+ }
+ /*tip still not copied*/
+ memcpy(nkey,key,sizeof(HairKey));
+ memcpy(nekey,ekey,sizeof(ParticleEditKey));
+
+ nekey->co = nkey->co;
+ nekey->time = &nkey->time;
+
+ if(pa->hair)
+ MEM_freeN(pa->hair);
+ pa->hair = new_keys;
+
+ if(edit->keys[index])
+ MEM_freeN(edit->keys[index]);
+
+ edit->keys[index] = new_ekeys;
+
+ pa->totkey += totnewkey;
+ pa->flag |= PARS_EDIT_RECALC;
+ pa->flag &= ~PARS_REKEY;
+}
+void PE_subdivide(void)
+{
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ struct { Object *ob; } data;
+
+ if(!PE_can_edit(psys)) return;
+
+ data.ob= ob;
+ PE_foreach_element(psys,subdivide_element,&data);
+
+ psys->edit->totkeys = psys_count_keys(psys);
+
+ recalc_lengths(psys);
+ PE_recalc_world_cos(ob, psys);
+
+ PE_update_object(ob, 1);
+
+ BIF_undo_push("Subdivide hair(s)");
+}
+/************************************************/
+/* Edit Brushes */
+/************************************************/
+static void brush_comb(ParticleSystem *psys, float mat[][4], float imat[][4], int pa_index, int key_index, void *userData)
+{
+ struct {Object *ob; short *mval; float rad; rcti* rect; float dist; float *dvec; float combfac;} *data = userData;
+ ParticleData *pa= &psys->particles[pa_index];
+ ParticleEditSettings *pset= PE_settings();
+ HairKey *key = pa->hair + key_index;
+ float cvec[3], fac;
+
+ if(pset->flag & PE_LOCK_FIRST && key_index == 0) return;
+
+ fac = (float)pow((double)(1.0f - data->dist / data->rad), (double)data->combfac);
+
+ VECCOPY(cvec,data->dvec);
+ Mat4Mul3Vecfl(imat,cvec);
+ VecMulf(cvec, fac);
+ VECADD(key->co, key->co, cvec);
+
+ pa->flag |= PARS_EDIT_RECALC;
+}
+static void brush_cut(ParticleSystem *psys, int index, void *userData)
+{
+ struct { short *mval; float rad; rcti* rect; int selected; float cutfac;} *data = userData;
+ ParticleData *pa= &psys->particles[index];
+ ParticleCacheKey *key = psys->pathcache[index];
+ float rad2, cut_time = 1.0;
+ float x0, x1, v0, v1, o0, o1, xo0, xo1, d, dv;
+ int k, cut, keys = (int)pow(2.0, (double)psys->part->draw_step);
+ short vertco[2];
+
+ /* blunt scissors */
+ if(BLI_frand() > data->cutfac) return;
+
+ rad2 = data->rad * data->rad;
+
+ cut=0;
+
+ project_short(key->co, vertco);
+ x0 = (float)vertco[0];
+ x1 = (float)vertco[1];
+
+ o0 = (float)data->mval[0];
+ o1 = (float)data->mval[1];
+
+ xo0 = x0 - o0;
+ xo1 = x1 - o1;
+
+ /* check if root is inside circle */
+ if(xo0*xo0 + xo1*xo1 < rad2) {
+ cut_time = -1.0f;
+ cut = 1;
+ }
+ else {
+ /* calculate path time closest to root that was inside the circle */
+ for(k=1, key++; k<=keys; k++, key++){
+ project_short(key->co, vertco);
+
+ v0 = (float)vertco[0] - x0;
+ v1 = (float)vertco[1] - x1;
+
+ dv = v0*v0 + v1*v1;
+
+ d = (v0*xo1 - v1*xo0);
+
+ d = dv * rad2 - d*d;
+
+ if(d > 0.0f) {
+ d = sqrt(d);
+
+ cut_time = -(v0*xo0 + v1*xo1 + d);
+
+ if(cut_time > 0.0f) {
+ cut_time /= dv;
+
+ if(cut_time < 1.0f) {
+ cut_time += (float)(k-1);
+ cut_time /= (float)keys;
+ cut = 1;
+ break;
+ }
+ }
+ }
+
+ x0 = (float)vertco[0];
+ x1 = (float)vertco[1];
+
+ xo0 = x0 - o0;
+ xo1 = x1 - o1;
+ }
+ }
+
+ if(cut) {
+ if(cut_time < 0.0f) {
+ pa->flag |= PARS_TAG;
+ }
+ else {
+ rekey_element_to_time(index, cut_time);
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+ }
+}
+static void brush_length(ParticleSystem *psys, int index, void *userData)
+{
+ struct { short *mval; float rad; rcti* rect; float dist; float growfac; } *data = userData;
+ ParticleData *pa = &psys->particles[index];
+ HairKey *key;
+ float dvec[3],pvec[3];
+ int k;
+
+ key = pa->hair;
+ VECCOPY(pvec,key->co);
+
+ for(k=1, key++; k<pa->totkey; k++,key++){
+ VECSUB(dvec,key->co,pvec);
+ VECCOPY(pvec,key->co);
+ VecMulf(dvec,data->growfac);
+ VECADD(key->co,(key-1)->co,dvec);
+ }
+
+ pa->flag |= PARS_EDIT_RECALC;
+}
+static void brush_puff(ParticleSystem *psys, int index, void *userData)
+{
+ struct { short *mval; float rad; rcti* rect; float dist;
+ Object *ob; DerivedMesh *dm; float pufffac; int invert; } *data = userData;
+ ParticleData *pa = &psys->particles[index];
+ ParticleEdit *edit = psys->edit;
+ HairKey *key;
+ float mat[4][4], imat[4][4];
+ float lastco[3], rootco[3], co[3], nor[3], kco[3], dco[3], fac, length;
+ int k;
+
+ psys_mat_hair_to_global(data->ob, data->dm, psys->part->from, pa, mat);
+ Mat4Invert(imat,mat);
+
+ /* find root coordinate and normal on emitter */
+ key = pa->hair;
+ VECCOPY(co, key->co);
+ Mat4MulVecfl(mat, co);
+
+ index= BLI_kdtree_find_nearest(edit->emitter_field, co, NULL, NULL);
+ if(index == -1) return;
+
+ VECCOPY(rootco, co);
+ VecCopyf(nor, &psys->edit->emitter_cosnos[index*6+3]);
+ Normalize(nor);
+ length= 0.0f;
+
+ fac= (float)pow((double)(1.0f - data->dist / data->rad), (double)data->pufffac);
+ fac *= 0.025f;
+ if(data->invert)
+ fac= -fac;
+
+ for(k=1, key++; k<pa->totkey; k++, key++){
+ /* compute position as if hair was standing up straight */
+ VECCOPY(lastco, co);
+ VECCOPY(co, key->co);
+ Mat4MulVecfl(mat, co);
+ length += VecLenf(lastco, co);
+
+ VECADDFAC(kco, rootco, nor, length);
+
+ /* blend between the current and straight position */
+ VECSUB(dco, kco, co);
+ VECADDFAC(co, co, dco, fac);
+
+ VECCOPY(key->co, co);
+ Mat4MulVecfl(imat, key->co);
+ }
+
+ pa->flag |= PARS_EDIT_RECALC;
+}
+static void brush_smooth_get(ParticleSystem *psys, float mat[][4], float imat[][4], int pa_index, int key_index, void *userData)
+{
+ struct { Object *ob; short *mval; float rad; rcti* rect; float dist; float vec[3]; int tot; float smoothfac;} *data = userData;
+ ParticleData *pa= &psys->particles[pa_index];
+ HairKey *key = pa->hair + key_index;
+
+ if(key_index){
+ float dvec[3];
+
+ VecSubf(dvec,key->co,(key-1)->co);
+ Mat4Mul3Vecfl(mat,dvec);
+ VECADD(data->vec,data->vec,dvec);
+ data->tot++;
+ }
+}
+static void brush_smooth_do(ParticleSystem *psys, float mat[][4], float imat[][4], int pa_index, int key_index, void *userData)
+{
+ struct { Object *ob; short *mval; float rad; rcti* rect; float dist; float vec[3]; int tot; float smoothfac;} *data = userData;
+ ParticleData *pa= &psys->particles[pa_index];
+ HairKey *key = pa->hair + key_index;
+ float vec[3], dvec[3];
+
+ if(key_index){
+ VECCOPY(vec,data->vec);
+ Mat4Mul3Vecfl(imat,vec);
+
+ VecSubf(dvec,key->co,(key-1)->co);
+
+ VECSUB(dvec,vec,dvec);
+ VecMulf(dvec,data->smoothfac);
+
+ VECADD(key->co,key->co,dvec);
+ }
+
+ pa->flag |= PARS_EDIT_RECALC;
+}
+#define EXPERIMENTAL_DEFORM_ONLY_PAINTING 1
+static void brush_add(Object *ob, ParticleSystem *psys, short *mval, short number)
+{
+ ParticleData *add_pars = MEM_callocN(number*sizeof(ParticleData),"ParticleData add");
+ ParticleSystemModifierData *psmd = psys_get_modifier(ob,psys);
+ ParticleEditSettings *pset= PE_settings();
+ ParticleEdit *edit = psys->edit;
+ int i, k, n = 0, totpart = psys->totpart;
+ short dmx = 0, dmy = 0;
+ short mx = mval[0] - curarea->winx / 2, my = mval[1] - curarea->winy / 2;
+ float co1[3], co2[3], vec[4], min_d, imat[4][4], dx, dy;
+ float framestep, timestep = psys_get_timestep(psys->part);
+ short size = pset->brush[PE_BRUSH_ADD].size;
+ short size2 = size*size;
+#if EXPERIMENTAL_DEFORM_ONLY_PAINTING
+ DerivedMesh *dm=0;
+#endif
+ Mat4Invert(imat,ob->obmat);
+
+ BLI_srandom(psys->seed+mval[0]+mval[1]);
+
+ /* painting onto the deformed mesh, could be an option? */
+#if EXPERIMENTAL_DEFORM_ONLY_PAINTING
+ if (psmd->dm->deformedOnly)
+ dm = psmd->dm;
+ else
+ dm = mesh_get_derived_deform(ob, CD_MASK_BAREMESH);
+#endif
+ for(i=0; i<number; i++){
+ if(number>1){
+ dmx=dmy=size;
+ while(dmx*dmx+dmy*dmy>size2){
+ dmx=(short)((2.0f*BLI_frand()-1.0f)*size);
+ dmy=(short)((2.0f*BLI_frand()-1.0f)*size);
+ }
+ }
+
+ /* create intersection coordinates in view Z direction at mouse coordinates */
+ /* Thanks to who ever wrote the "Mouse Location 3D Space" tutorial in "Blender 3D: Blending Into Python/Cookbook". */
+ if(G.vd->persp){
+ dx = G.vd->persmat[3][3] * (2.0f*(mx+dmx)/curarea->winx) - G.vd->persmat[3][0];
+ dy = G.vd->persmat[3][3] * (2.0f*(my+dmy)/curarea->winy) - G.vd->persmat[3][1];
+
+ co2[0]=G.vd->persinv[0][0]*dx + G.vd->persinv[1][0]*dy;
+ co2[1]=G.vd->persinv[0][1]*dx + G.vd->persinv[1][1]*dy;
+ co2[2]=G.vd->persinv[0][2]*dx + G.vd->persinv[1][2]*dy;
+
+ VECCOPY(co1,G.vd->viewinv[3]);
+
+ VECSUB(vec,co2,co1)
+
+ VECADDFAC(co2,co1,vec,1000.0f);
+ }
+ else{
+ vec[0] = 2.0f*(mx+dmx)/curarea->winx;
+ vec[1] = 2.0f*(my+dmy)/curarea->winy;
+ vec[2] = 0.0f;
+ vec[3] = 1.0f;
+
+ Mat4MulVec4fl(G.vd->persinv,vec);
+
+ VECADDFAC(co1,vec,G.vd->viewinv[2],1000.0f);
+ VECADDFAC(co2,vec,G.vd->viewinv[2],-1000.0f);
+ }
+
+ Mat4MulVecfl(imat,co1);
+ Mat4MulVecfl(imat,co2);
+ min_d=2.0;
+
+ /* warning, returns the derived mesh face */
+#if EXPERIMENTAL_DEFORM_ONLY_PAINTING
+ if(psys_intersect_dm(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,dm,add_pars[n].num,add_pars[n].fuv,NULL);
+ n++;
+ }
+#else
+#if 0
+ if (psmd->dm->deformedOnly) {
+ if(psys_intersect_dm(ob,psmd->dm,0,co1,co2,&min_d,&add_pars[n].num,add_pars[n].fuv,0,0,0,0)){
+ n++;
+ }
+ } else {
+ /* we need to test against the cage mesh, because 1) its faster and 2) then we can avoid converting the fuv back which is not simple */
+ if(psys_intersect_dm(ob,psmd->dm,0,co1,co2,&min_d,&add_pars[n].num,add_pars[n].fuv,0,0,0,0)){
+ MFace *mface;
+ float fuv_mod[3] = {0.0, 0.0, 0.0};
+ OrigSpaceFace *osface;
+
+ mface= psmd->dm->getFaceData(psmd->dm,add_pars[n].num,CD_MFACE);
+ osface= psmd->dm->getFaceData(psmd->dm, add_pars[n].num, CD_ORIGSPACE);
+
+ add_pars[n].fuv[2]=0.0;
+
+ /* use the original index for num and the derived index for num_dmcache */
+ add_pars[n].num_dmcache = add_pars[n].num;
+ add_pars[n].num = *(int *)psmd->dm->getFaceData(psmd->dm, add_pars[n].num, CD_ORIGINDEX);
+
+ /* This is totally unaceptable code (fakeing mesh dara) but changing the target function isnt really nice either, do this temporarily */
+ if (1) { /* Evilness*/
+ MFace mface_fake;
+ MVert mvert_fake[4];
+ //int test1,test2;
+ //test1 = add_pars[n].num_dmcache;
+ //test2 = add_pars[n].num;
+
+ mvert_fake[0].co[2] = mvert_fake[1].co[2] = mvert_fake[2].co[2] = mvert_fake[3].co[2] = 0.0;
+
+ mface_fake.v1 = 0;
+ mface_fake.v2 = 1;
+ mface_fake.v3 = 2;
+
+ if (mface->v4) {
+ mface_fake.v4 = 3;
+ } else {
+ mface_fake.v4 = 0;
+ }
+
+ Vec2Copyf(mvert_fake[0].co, osface->uv[0]);
+ Vec2Copyf(mvert_fake[1].co, osface->uv[1]);
+ Vec2Copyf(mvert_fake[2].co, osface->uv[2]);
+ Vec2Copyf(mvert_fake[3].co, osface->uv[3]);
+ //printf("before %f %f %i %i\n", add_pars[n].fuv[0], add_pars[n].fuv[1], test1, test2);
+ psys_interpolate_face(&mvert_fake, &mface_fake, NULL, &add_pars[n].fuv, &fuv_mod, NULL, NULL, NULL);
+
+ /* Apply as the UV */
+ Vec2Copyf(add_pars[n].fuv, fuv_mod);
+ //printf("after %f %f\n", add_pars[n].fuv[0], add_pars[n].fuv[1]);
+ }
+ /* Make a fake face, for calculating the derived face's fuv on the original face */
+ //PointInFace2DUV(mface->v4, osface->uv[0], osface->uv[1], osface->uv[2], osface->uv[3], add_pars[n].fuv, fuv_mod);
+ //Vec2Copyf(add_pars[n].fuv, fuv_mod);
+
+ n++;
+ }
+ }
+#endif
+#endif
+ }
+ if(n){
+ int newtotpart=totpart+n;
+ float hairmat[4][4], cur_co[3];
+ KDTree *tree=0;
+ ParticleData *pa, *new_pars = MEM_callocN(newtotpart*sizeof(ParticleData),"ParticleData new");
+ ParticleEditKey *ekey, **key, **new_keys = MEM_callocN(newtotpart*sizeof(ParticleEditKey *),"ParticleEditKey array new");
+ HairKey *hkey;
+
+ /* save existing elements */
+ memcpy(new_pars, psys->particles, totpart * sizeof(ParticleData));
+ memcpy(new_keys, edit->keys, totpart * sizeof(ParticleEditKey*));
+
+ /* change old arrays to new ones */
+ MEM_freeN(psys->particles);
+ psys->particles = new_pars;
+
+ MEM_freeN(edit->keys);
+ edit->keys = new_keys;
+
+ if(edit->mirror_cache) {
+ MEM_freeN(edit->mirror_cache);
+ edit->mirror_cache = NULL;
+ }
+
+ psys->totpart = newtotpart;
+
+ /* create tree for interpolation */
+ if(pset->flag & PE_INTERPOLATE_ADDED && psys->totpart){
+ tree=BLI_kdtree_new(psys->totpart);
+
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++) {
+ psys_particle_on_dm(ob,psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,cur_co,0,0,0);
+ BLI_kdtree_insert(tree, i, cur_co, NULL);
+ }
+
+ BLI_kdtree_balance(tree);
+ }
+
+ /* create new elements */
+ pa = psys->particles + totpart;
+ key = edit->keys + totpart;
+
+ for(i=totpart; i<newtotpart; i++, pa++, key++){
+ memcpy(pa, add_pars + i - totpart, sizeof(ParticleData));
+ pa->hair = MEM_callocN(pset->totaddkey * sizeof(HairKey), "BakeKey key add");
+ ekey = *key = MEM_callocN(pset->totaddkey * sizeof(ParticleEditKey), "ParticleEditKey add");
+ pa->totkey = pset->totaddkey;
+
+ for(k=0, hkey=pa->hair; k<pa->totkey; k++, hkey++, ekey++) {
+ ekey->co = hkey->co;
+ ekey->time = &hkey->time;
+ }
+
+ initialize_particle(pa,i,ob,psys,psmd);
+ reset_particle(pa,psys,psmd,ob,0.0,1.0,0,0,0);
+ pa->flag |= PARS_EDIT_RECALC;
+ if(pset->flag & PE_X_MIRROR)
+ pa->flag |= PARS_TAG; /* signal for duplicate */
+
+ framestep = pa->lifetime/(float)(pset->totaddkey-1);
+
+ if(tree){
+ HairKey *hkey;
+ ParticleKey key[3];
+ KDTreeNearest ptn[3];
+ int w, maxw;
+ float maxd, mind, dd, totw=0.0, weight[3];
+
+ psys_particle_on_dm(ob,psmd->dm,psys->part->from,pa->num,pa->num_dmcache,pa->fuv,pa->foffset,co1,0,0,0);
+ maxw = BLI_kdtree_find_n_nearest(tree,3,co1,NULL,ptn);
+
+ maxd = ptn[maxw-1].dist;
+ mind = ptn[0].dist;
+ dd = maxd - mind;
+
+ for(w=0; w<maxw; w++){
+ weight[w] = (float)pow(2.0, (double)(-6.0f * ptn[w].dist / maxd));
+ totw += weight[w];
+ }
+ for(;w<3; w++){
+ weight[w] = 0.0f;
+ }
+
+ for(w=0; w<maxw; w++)
+ weight[w] /= totw;
+
+ for(k=0; k<pset->totaddkey; k++) {
+ hkey = pa->hair + k;
+ hkey->time = pa->time + k * framestep;
+
+ key[0].time = hkey->time/ 100.0f;
+ psys_get_particle_on_path(ob, psys, ptn[0].index, key, 0);
+ VecMulf(key[0].co, weight[0]);
+
+ if(maxw>1) {
+ key[1].time = key[0].time;
+ psys_get_particle_on_path(ob, psys, ptn[1].index, key + 1, 0);
+ VecMulf(key[1].co, weight[1]);
+ VECADD(key[0].co, key[0].co, key[1].co);
+
+ if(maxw>2) {
+ key[2].time = key[0].time;
+ psys_get_particle_on_path(ob, psys, ptn[2].index, key + 2, 0);
+ VecMulf(key[2].co, weight[2]);
+ VECADD(key[0].co, key[0].co, key[2].co);
+ }
+ }
+
+ if(k==0)
+ VECSUB(co1, pa->state.co, key[0].co);
+
+ VECADD(pa->hair[k].co, key[0].co, co1);
+
+ pa->hair[k].time = key[0].time;
+ }
+ }
+ else{
+ for(k=0, hkey=pa->hair; k<pset->totaddkey; k++, hkey++) {
+ VECADDFAC(hkey->co, pa->state.co, pa->state.vel, k * framestep * timestep);
+ pa->hair[k].time += k * framestep;
+ }
+ }
+ for(k=0, hkey=pa->hair; k<pset->totaddkey; k++, hkey++) {
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, hairmat);
+ Mat4Invert(imat,hairmat);
+ Mat4MulVecfl(imat, hkey->co);
+ }
+ }
+ edit->totkeys = psys_count_keys(psys);
+
+ if(tree)
+ BLI_kdtree_free(tree);
+ }
+ if(add_pars)
+ MEM_freeN(add_pars);
+
+/* painting onto the deformed mesh, could be an option? */
+#if EXPERIMENTAL_DEFORM_ONLY_PAINTING
+ if (!psmd->dm->deformedOnly)
+ dm->release(dm);
+#endif
+}
+static void brush_weight(ParticleSystem *psys, float mat[][4], float imat[][4], int pa_index, int key_index, void *userData)
+{
+ struct { Object *ob; short *mval; float rad; rcti* rect; float dist; float weightfac;} *data = userData;
+ ParticleData *pa;
+
+ /* roots have full weight allways */
+ if(key_index) {
+ pa= &psys->particles[pa_index];
+ pa->hair[key_index].weight = data->weightfac;
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+}
+
+/* returns 0 if no brush was used */
+int PE_brush_particles(void)
+{
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleEdit *edit;
+ ParticleEditSettings *pset = PE_settings();
+ ParticleSystemModifierData *psmd;
+ ParticleBrushData *brush;
+ float vec1[3], vec2[3];
+ short mval[2], mvalo[2], firsttime = 1, dx, dy, mousebut;
+ int selected = 0, flip;
+
+ if(!PE_can_edit(psys)) return 0;
+
+ edit = psys->edit;
+ psmd= psys_get_modifier(ob, psys);
+
+ /* check for left mouse / right mouse button select */
+ if (U.flag & USER_LMOUSESELECT) mousebut = R_MOUSE;
+ else mousebut = L_MOUSE;
+ flip= (get_qual() == LR_SHIFTKEY);
+
+ if(pset->brushtype<0) return 0;
+ brush= &pset->brush[pset->brushtype];
+
+ initgrabz(ob->obmat[3][0], ob->obmat[3][1], ob->obmat[3][2]);
+
+ getmouseco_areawin(mvalo);
+
+ mval[0] = mvalo[0]; mval[1] = mvalo[1];
+
+ while(get_mbut() & mousebut){
+ bglFlush();
+ glReadBuffer(GL_BACK);
+ glDrawBuffer(GL_BACK);
+ persp(PERSP_VIEW);
+
+ dx=mval[0]-mvalo[0];
+ dy=mval[1]-mvalo[1];
+ if(((pset->brushtype == PE_BRUSH_ADD) ?
+ (sqrt(dx * dx + dy * dy) > pset->brush[PE_BRUSH_ADD].step) : (dx != 0 || dy != 0))
+ || firsttime){
+ firsttime = 0;
+
+ selected = (short)count_selected_keys(psys);
+
+ switch(pset->brushtype){
+ case PE_BRUSH_COMB:
+ {
+ struct { Object *ob; short *mval; float rad; rcti* rect; float dist; float *dvec; float combfac;} data;
+
+ data.ob = ob;
+ data.mval = mval;
+ data.rad = (float)brush->size;
+
+ data.combfac = (float)(brush->strength - 50) / 50.0f;
+ if(data.combfac < 0.0f)
+ data.combfac = 1.0f - 9.0f * data.combfac;
+ else
+ data.combfac = 1.0f - data.combfac;
+
+ Mat4Invert(ob->imat, ob->obmat);
+
+ window_to_3d(vec1, mvalo[0], mvalo[1]);
+ window_to_3d(vec2, mval[0], mval[1]);
+ VECSUB(vec1, vec2, vec1);
+ data.dvec = vec1;
+
+ foreach_mouse_hit_key(selected, psys,brush_comb, &data);
+ break;
+ }
+ case PE_BRUSH_CUT:
+ {
+ struct { short *mval; float rad; rcti* rect; int selected; float cutfac;} data;
+
+ data.mval = mval;
+ data.rad = (float)brush->size;
+
+ data.selected = selected;
+
+ data.cutfac = (float)(brush->strength / 100.0f);
+
+ if(selected)
+ foreach_selected_element(psys, brush_cut, &data);
+ else
+ PE_foreach_element(psys, brush_cut, &data);
+
+ remove_tagged_elements(ob, psys);
+ if(pset->flag & PE_KEEP_LENGTHS)
+ recalc_lengths(psys);
+ break;
+ }
+ case PE_BRUSH_LENGTH:
+ {
+ struct { short *mval; float rad; rcti* rect; float dist; float growfac; } data;
+
+ data.mval = mval;
+
+ data.rad = (float)brush->size;
+ data.growfac = (float)brush->strength / 5000.0f;
+
+ if(brush->invert ^ flip)
+ data.growfac = 1.0f - data.growfac;
+ else
+ data.growfac = 1.0f + data.growfac;
+
+ foreach_mouse_hit_element(selected, psys, brush_length, &data);
+
+ if(pset->flag & PE_KEEP_LENGTHS)
+ recalc_lengths(psys);
+ break;
+ }
+ case PE_BRUSH_PUFF:
+ {
+ struct { short *mval; float rad; rcti* rect; float dist;
+ Object *ob; DerivedMesh *dm; float pufffac; int invert; } data;
+
+ data.ob = ob;
+ data.dm = psmd->dm;
+ data.mval = mval;
+ data.rad = (float)brush->size;
+
+ data.pufffac = (float)(brush->strength - 50) / 50.0f;
+ if(data.pufffac < 0.0f)
+ data.pufffac = 1.0f - 9.0f * data.pufffac;
+ else
+ data.pufffac = 1.0f - data.pufffac;
+
+ data.invert= (brush->invert ^ flip);
+ Mat4Invert(ob->imat, ob->obmat);
+
+ foreach_mouse_hit_element(selected, psys, brush_puff, &data);
+ break;
+ }
+ case PE_BRUSH_ADD:
+ if(psys->part->from==PART_FROM_FACE){
+ brush_add(ob, psys, mval, brush->strength);
+ if(pset->flag & PE_KEEP_LENGTHS)
+ recalc_lengths(psys);
+ }
+ break;
+ case PE_BRUSH_WEIGHT:
+ {
+ struct { Object *ob; short *mval; float rad; rcti* rect; float dist; float weightfac;} data;
+
+ data.ob = ob;
+ data.mval = mval;
+ data.rad = (float)brush->size;
+
+ data.weightfac = (float)(brush->strength / 100.0f);
+
+ foreach_mouse_hit_key(selected, psys, brush_weight, &data);
+ break;
+ }
+ case PE_BRUSH_SMOOTH:
+ {
+ struct { Object *ob; short *mval; float rad; rcti* rect; float dist; float vec[3]; int tot; float smoothfac;} data;
+
+ data.ob = ob;
+ data.mval = mval;
+ data.rad = (float)brush->size;
+
+ data.vec[0] = data.vec[1] = data.vec[2] = 0.0f;
+ data.tot = 0;
+
+ data.smoothfac = (float)(brush->strength / 100.0f);
+
+ Mat4Invert(ob->imat, ob->obmat);
+
+ foreach_mouse_hit_key(selected, psys, brush_smooth_get, &data);
+
+ if(data.tot){
+ VecMulf(data.vec, 1.0f / (float)data.tot);
+ foreach_mouse_hit_key(selected, psys, brush_smooth_do, &data);
+ }
+
+ break;
+ }
+ }
+ if((pset->flag & PE_KEEP_LENGTHS)==0)
+ recalc_lengths(psys);
+
+ if(pset->brushtype == PE_BRUSH_ADD) {
+ if(pset->flag & PE_X_MIRROR)
+ PE_mirror_x(1);
+ PE_recalc_world_cos(ob,psys);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ else
+ PE_update_object(ob, 1);
+
+ mvalo[0] = mval[0];
+ mvalo[1] = mval[1];
+ }
+
+ force_draw(0);
+
+ PIL_sleep_ms(10);
+
+ getmouseco_areawin(mval);
+ }
+ allqueue(REDRAWVIEW3D, 1);
+
+ BIF_undo_push("Brush edit particles");
+
+ return 1;
+}
+static void set_delete_particle(ParticleSystem *psys, int index, void *userData)
+{
+ psys->particles[index].flag |= PARS_TAG;
+}
+static void set_delete_particle_key(ParticleSystem *psys, int pa_index, int key_index, void *userData)
+{
+ psys->edit->keys[pa_index][key_index].flag |= PEK_TAG;
+}
+void PE_delete_particle(void)
+{
+ Object *ob=OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ short event=0;
+
+ if(!PE_can_edit(psys)) return;
+
+ event= pupmenu("Erase %t|Particle%x2|Key%x1");
+
+ if(event<1) return;
+
+ if(event==1){
+ foreach_selected_key(psys, set_delete_particle_key, 0);
+ remove_tagged_keys(ob, psys);
+ recalc_lengths(psys);
+ }
+ else if(event==2){
+ foreach_selected_element(psys, set_delete_particle, 0);
+ remove_tagged_elements(ob, psys);
+ recalc_lengths(psys);
+ }
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 1);
+ BIF_undo_push("Delete particles/keys");
+}
+
+void PE_mirror_x(int tagged)
+{
+ Object *ob=OBACT;
+ Mesh *me= (Mesh*)(ob->data);
+ ParticleSystemModifierData *psmd;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleEdit *edit;
+ ParticleData *pa, *newpa, *new_pars;
+ ParticleEditKey *ekey, **newkey, **key, **new_keys;
+ HairKey *hkey;
+ int *mirrorfaces;
+ int i, k, rotation, totpart, newtotpart;
+
+ if(!PE_can_edit(psys)) return;
+
+ edit= psys->edit;
+ psmd= psys_get_modifier(ob, psys);
+
+ mirrorfaces= mesh_get_x_mirror_faces(ob);
+
+ if(!edit->mirror_cache)
+ PE_update_mirror_cache(ob, psys);
+
+ totpart= psys->totpart;
+ newtotpart= psys->totpart;
+ LOOP_PARTICLES(i,pa) {
+ if(pa->flag&PARS_HIDE) continue;
+
+ if(!tagged) {
+ if(particle_is_selected(psys, pa)) {
+ if(edit->mirror_cache[i] != -1) {
+ /* already has a mirror, don't need to duplicate */
+ PE_mirror_particle(ob, psmd->dm, psys, pa, NULL);
+ continue;
+ }
+ else
+ pa->flag |= PARS_TAG;
+ }
+ }
+
+ if((pa->flag & PARS_TAG) && mirrorfaces[pa->num*2] != -1)
+ newtotpart++;
+ }
+
+ if(newtotpart != psys->totpart) {
+ /* allocate new arrays and copy existing */
+ new_pars= MEM_callocN(newtotpart*sizeof(ParticleData), "ParticleData new");
+ new_keys= MEM_callocN(newtotpart*sizeof(ParticleEditKey*), "ParticleEditKey new");
+
+ memcpy(new_pars, psys->particles, totpart*sizeof(ParticleData));
+ memcpy(new_keys, edit->keys, totpart*sizeof(ParticleEditKey*));
+
+ MEM_freeN(psys->particles);
+ psys->particles= new_pars;
+
+ MEM_freeN(edit->keys);
+ edit->keys= new_keys;
+
+ if(edit->mirror_cache) {
+ MEM_freeN(edit->mirror_cache);
+ edit->mirror_cache= NULL;
+ }
+
+ psys->totpart= newtotpart;
+
+ /* create new elements */
+ pa= psys->particles;
+ newpa= psys->particles + totpart;
+ key= edit->keys;
+ newkey= edit->keys + totpart;
+
+ for(i=0; i<totpart; i++, pa++, key++) {
+ if(pa->flag&PARS_HIDE) continue;
+
+ if(!(pa->flag & PARS_TAG) || mirrorfaces[pa->num*2] == -1)
+ continue;
+
+ /* duplicate */
+ *newpa= *pa;
+ if(pa->hair) newpa->hair= MEM_dupallocN(pa->hair);
+ if(pa->keys) newpa->keys= MEM_dupallocN(pa->keys);
+ if(*key) *newkey= MEM_dupallocN(*key);
+
+ /* rotate weights according to vertex index rotation */
+ rotation= mirrorfaces[pa->num*2+1];
+ newpa->fuv[0]= pa->fuv[2];
+ newpa->fuv[1]= pa->fuv[1];
+ newpa->fuv[2]= pa->fuv[0];
+ newpa->fuv[3]= pa->fuv[3];
+ while(rotation-- > 0)
+ if(me->mface[pa->num].v4)
+ SHIFT4(float, newpa->fuv[0], newpa->fuv[1], newpa->fuv[2], newpa->fuv[3])
+ else
+ SHIFT3(float, newpa->fuv[0], newpa->fuv[1], newpa->fuv[2])
+
+ /* assign face inddex */
+ newpa->num= mirrorfaces[pa->num*2];
+ newpa->num_dmcache= psys_particle_dm_face_lookup(ob,psmd->dm,newpa->num,newpa->fuv, NULL);
+
+ /* update edit key pointers */
+ ekey= *newkey;
+ for(k=0, hkey=newpa->hair; k<newpa->totkey; k++, hkey++, ekey++) {
+ ekey->co= hkey->co;
+ ekey->time= &hkey->time;
+ }
+
+ /* map key positions as mirror over x axis */
+ PE_mirror_particle(ob, psmd->dm, psys, pa, newpa);
+
+ newpa++;
+ newkey++;
+ }
+
+ edit->totkeys = psys_count_keys(psys);
+ }
+
+ for(pa=psys->particles, i=0; i<psys->totpart; i++, pa++)
+ pa->flag &= ~PARS_TAG;
+
+ MEM_freeN(mirrorfaces);
+
+ if(!tagged) {
+ PE_recalc_world_cos(ob,psys);
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 1);
+ BIF_undo_push("Mirror particles");
+ }
+}
+
+/************************************************/
+/* Particle Edit Undo */
+/************************************************/
+static void free_ParticleUndo(ParticleUndo *undo)
+{
+ ParticleData *pa;
+ int i;
+
+ for(i=0, pa=undo->particles; i<undo->totpart; i++, pa++) {
+ if(pa->hair)
+ MEM_freeN(pa->hair);
+ if(undo->keys[i])
+ MEM_freeN(undo->keys[i]);
+ }
+ if(undo->keys)
+ MEM_freeN(undo->keys);
+
+ if(undo->particles)
+ MEM_freeN(undo->particles);
+
+ //if(undo->emitter_cosnos)
+ // MEM_freeN(undo->emitter_cosnos);
+}
+static void make_ParticleUndo(ParticleSystem *psys, ParticleUndo *undo)
+{
+ ParticleData *pa,*upa;
+ int i;
+
+ undo->totpart = psys->totpart;
+ undo->totkeys = psys->edit->totkeys;
+
+ upa = undo->particles = MEM_dupallocN(psys->particles);
+ undo->keys = MEM_dupallocN(psys->edit->keys);
+
+ for(i=0, pa=psys->particles; i<undo->totpart; i++, pa++, upa++) {
+ upa->hair = MEM_dupallocN(pa->hair);
+ undo->keys[i] = MEM_dupallocN(psys->edit->keys[i]);
+ /* no need to update edit key->co & key->time pointers here */
+ }
+}
+static void get_ParticleUndo(ParticleSystem *psys, ParticleUndo *undo)
+{
+ ParticleData *pa, *upa;
+ ParticleEditKey *key;
+ HairKey *hkey;
+ int i, k, totpart = psys->totpart;
+
+ LOOP_PARTICLES(i,pa) {
+ if(pa->hair)
+ MEM_freeN(pa->hair);
+
+ if(psys->edit->keys[i])
+ MEM_freeN(psys->edit->keys[i]);
+ }
+ if(psys->particles)
+ MEM_freeN(psys->particles);
+ if(psys->edit->keys)
+ MEM_freeN(psys->edit->keys);
+ if(psys->edit->mirror_cache) {
+ MEM_freeN(psys->edit->mirror_cache);
+ psys->edit->mirror_cache= NULL;
+ }
+
+ pa = psys->particles = MEM_dupallocN(undo->particles);
+ psys->edit->keys = MEM_dupallocN(undo->keys);
+
+ for(i=0,upa=undo->particles; i<undo->totpart; i++, upa++, pa++){
+ hkey = pa->hair = MEM_dupallocN(upa->hair);
+ key = psys->edit->keys[i] = MEM_dupallocN(undo->keys[i]);
+ for(k=0; k<pa->totkey; k++, hkey++, key++) {
+ key->co = hkey->co;
+ key->time = &hkey->time;
+ }
+ }
+
+ psys->totpart = undo->totpart;
+ psys->edit->totkeys = undo->totkeys;
+}
+void PE_undo_push(char *str)
+{
+ ParticleSystem *psys = PE_get_current(OBACT);
+ ParticleEdit *edit = 0;
+ ParticleUndo *undo;
+ int nr;
+
+ if(!PE_can_edit(psys)) return;
+ edit = psys->edit;
+
+ /* remove all undos after (also when curundo==NULL) */
+ while(edit->undo.last != edit->curundo) {
+ undo= edit->undo.last;
+ BLI_remlink(&edit->undo, undo);
+ free_ParticleUndo(undo);
+ MEM_freeN(undo);
+ }
+
+ /* make new */
+ edit->curundo= undo= MEM_callocN(sizeof(ParticleUndo), "particle undo file");
+ strncpy(undo->name, str, 64-1);
+ BLI_addtail(&edit->undo, undo);
+
+ /* and limit amount to the maximum */
+ nr= 0;
+ undo= edit->undo.last;
+ while(undo) {
+ nr++;
+ if(nr==U.undosteps) break;
+ undo= undo->prev;
+ }
+ if(undo) {
+ while(edit->undo.first!=undo) {
+ ParticleUndo *first= edit->undo.first;
+ BLI_remlink(&edit->undo, first);
+ free_ParticleUndo(first);
+ MEM_freeN(first);
+ }
+ }
+
+ /* copy */
+ make_ParticleUndo(psys,edit->curundo);
+}
+void PE_undo_step(int step)
+{
+ ParticleSystem *psys = PE_get_current(OBACT);
+ ParticleEdit *edit = 0;
+
+ if(!PE_can_edit(psys)) return;
+ edit=psys->edit;
+
+ if(step==0) {
+ get_ParticleUndo(psys,edit->curundo);
+ }
+ else if(step==1) {
+
+ if(edit->curundo==NULL || edit->curundo->prev==NULL) error("No more steps to undo");
+ else {
+ if(G.f & G_DEBUG) printf("undo %s\n", edit->curundo->name);
+ edit->curundo= edit->curundo->prev;
+ get_ParticleUndo(psys, edit->curundo);
+ }
+ }
+ else {
+ /* curundo has to remain current situation! */
+
+ if(edit->curundo==NULL || edit->curundo->next==NULL) error("No more steps to redo");
+ else {
+ get_ParticleUndo(psys, edit->curundo->next);
+ edit->curundo= edit->curundo->next;
+ if(G.f & G_DEBUG) printf("redo %s\n", edit->curundo->name);
+ }
+ }
+
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 1);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWIMAGE, 0);
+}
+static void ParticleUndo_number(ParticleEdit *edit, int nr)
+{
+ ParticleUndo *undo;
+ int a=1;
+
+ for(undo= edit->undo.first; undo; undo= undo->next, a++) {
+ if(a==nr) break;
+ }
+ edit->curundo= undo;
+ PE_undo_step(0);
+}
+static void ParticleUndo_clear(ParticleSystem *psys)
+{
+ ParticleUndo *undo;
+ ParticleEdit *edit;
+
+ if(psys==0) return;
+
+ edit = psys->edit;
+
+ if(edit==0) return;
+
+ undo= edit->undo.first;
+ while(undo) {
+ free_ParticleUndo(undo);
+ undo= undo->next;
+ }
+ BLI_freelistN(&edit->undo);
+ edit->curundo= NULL;
+}
+void PE_undo(void)
+{
+ PE_undo_step(1);
+}
+void PE_redo(void)
+{
+ PE_undo_step(-1);
+}
+void PE_undo_menu(void)
+{
+ ParticleSystem *psys = PE_get_current(OBACT);
+ ParticleEdit *edit = 0;
+ ParticleUndo *undo;
+ DynStr *ds;
+ short event;
+ char *menu;
+
+ if(!PE_can_edit(psys)) return;
+ edit = psys->edit;
+
+ ds= BLI_dynstr_new();
+
+ BLI_dynstr_append(ds, "Particlemode Undo History %t");
+
+ for(undo= edit->undo.first; undo; undo= undo->next) {
+ BLI_dynstr_append(ds, "|");
+ BLI_dynstr_append(ds, undo->name);
+ }
+
+ menu= BLI_dynstr_get_cstring(ds);
+ BLI_dynstr_free(ds);
+
+ event= pupmenu_col(menu, 20);
+ MEM_freeN(menu);
+
+ if(event>0) ParticleUndo_number(edit,event);
+}
+
+void PE_get_colors(char sel[4], char nosel[4])
+{
+ BIF_GetThemeColor3ubv(TH_EDGE_SELECT, sel);
+ BIF_GetThemeColor3ubv(TH_WIRE, nosel);
+}
+
+int PE_minmax(float *min, float *max)
+{
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleSystemModifierData *psmd;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ float co[3], mat[4][4];
+ int i, k, totpart, ok = 0;
+
+ if(!PE_can_edit(psys)) return ok;
+
+ psmd= psys_get_modifier(ob, psys);
+ totpart= psys->totpart;
+
+ LOOP_PARTICLES(i,pa){
+ if(pa->flag&PARS_HIDE) continue;
+
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, mat);
+
+ LOOP_KEYS(k,key){
+ if(key->flag&PEK_SELECT) {
+ VECCOPY(co, key->co);
+ Mat4MulVecfl(mat, co);
+ DO_MINMAX(co, min, max);
+ ok= 1;
+ }
+ }
+ }
+
+ if(!ok) {
+ minmax_object(ob, min, max);
+ ok= 1;
+ }
+
+ return ok;
+}
+
diff --git a/source/blender/src/editscreen.c b/source/blender/src/editscreen.c
index 6bca8b32322..57d4bde9b8a 100644
--- a/source/blender/src/editscreen.c
+++ b/source/blender/src/editscreen.c
@@ -176,8 +176,9 @@ static int choose_cursor(ScrArea *sa)
if(G.obedit) return CURSOR_EDIT;
else if(G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT))
return CURSOR_VPAINT;
- else if(G.f & G_FACESELECT) return CURSOR_FACESEL;
+ else if(FACESEL_PAINT_TEST) return CURSOR_FACESEL;
else if(G.f & G_SCULPTMODE) return CURSOR_EDIT;
+ else if(G.f & G_PARTICLEEDIT) return CURSOR_EDIT;
else return CURSOR_STD;
}
else if (sa->spacetype==SPACE_TEXT) {
@@ -358,6 +359,11 @@ void areawinset(short win)
G.v2d= &snode->v2d;
}
break;
+ case SPACE_IMASEL:
+ {
+ SpaceImaSel *simasel= curarea->spacedata.first;
+ G.v2d= &simasel->v2d;
+ }
default:
break;
}
@@ -1114,7 +1120,9 @@ static void animated_screen(bScreen *sc, short val)
}
if(val & TIME_ALL_ANIM_WIN) allqueue(REDRAWANIM, 0);
if(val & TIME_ALL_BUTS_WIN) allqueue(REDRAWBUTSALL, 0);
- if(val & TIME_SEQ) allqueue(REDRAWSEQ, 0);
+ if(val & TIME_SEQ) {
+ allqueue(REDRAWSEQ, 0);
+ }
allqueue(REDRAWTIME, 0);
}
@@ -1131,7 +1139,7 @@ int do_screenhandlers(bScreen *sc)
short a, done= 0;
time = PIL_check_seconds_timer();
- swaptime= 1.0/(float)G.scene->r.frs_sec;
+ swaptime= 1.0/FPS;
/* only now do the handlers */
if(swaptime < time-ltime || ltime==0.0) {
@@ -3069,7 +3077,7 @@ static void splitarea_interactive(ScrArea *area, ScrEdge *onedge)
ScrArea *scr, *sa= area;
float fac= 0.0;
unsigned short event;
- short ok= 0, val, split = 0, mval[2], mvalo[2], first= 1;
+ short ok= 0, val, split = 0, mval[2], mvalo[2]= {-1, -1}, first= 1;
char dir;
if(sa->win==0) return;
@@ -3113,7 +3121,7 @@ static void splitarea_interactive(ScrArea *area, ScrEdge *onedge)
}
}
- if (first || mval[0]!=mvalo[0] || mval[1]!=mvalo[1]) {
+ if (first || (dir=='v' && mval[0]!=mvalo[0]) || (dir=='h' && mval[1]!=mvalo[1])) {
if (!first) {
scrarea_draw_splitpoint(sa, dir, fac);
}
@@ -3389,7 +3397,7 @@ static void moveareas(ScrEdge *edge)
{
ScrVert *v1;
ScrArea *sa;
- short mvalo[2];
+ short mvalo[2], mval_prev=-1;
short edge_start, edge_end, edge_position;
short bigger, smaller, headery, areaminy;
int delta, doit;
@@ -3478,13 +3486,18 @@ static void moveareas(ScrEdge *edge)
short mval[2];
getmouseco_sc(mval);
-
- draw_front_xor_dirdist_line(dir, edge_position+delta, edge_start, edge_end);
+ if ((dir=='h' && mval_prev != mval[1]) || (dir=='v' && mval_prev != mval[0])) {
+ /* update the previous val with this one for comparison next loop */
+ if (dir=='h') mval_prev = mval[1];
+ else mval_prev = mval[0];
+
+ draw_front_xor_dirdist_line(dir, edge_position+delta, edge_start, edge_end);
- delta= (dir=='h')?(mval[1]-mvalo[1]):(mval[0]-mvalo[0]);
- delta= CLAMPIS(delta, -smaller, bigger);
- draw_front_xor_dirdist_line(dir, edge_position+delta, edge_start, edge_end);
- bglFlush();
+ delta= (dir=='h')?(mval[1]-mvalo[1]):(mval[0]-mvalo[0]);
+ delta= CLAMPIS(delta, -smaller, bigger);
+ draw_front_xor_dirdist_line(dir, edge_position+delta, edge_start, edge_end);
+ bglFlush();
+ }
}
else if (event==LEFTMOUSE) {
doit= 1;
diff --git a/source/blender/src/editseq.c b/source/blender/src/editseq.c
index 1677fe49c59..27ee7a14315 100644
--- a/source/blender/src/editseq.c
+++ b/source/blender/src/editseq.c
@@ -83,6 +83,7 @@
#include "BIF_editview.h"
#include "BIF_scrarea.h"
#include "BIF_editsound.h"
+#include "BIF_imasel.h"
#include "BSE_edit.h"
#include "BSE_sequence.h"
@@ -90,6 +91,7 @@
#include "BSE_filesel.h"
#include "BSE_drawipo.h"
#include "BSE_seqaudio.h"
+#include "BSE_time.h"
#include "BDR_editobject.h"
@@ -137,12 +139,134 @@ void set_last_seq(Sequence *seq)
_last_seq_init = 1;
}
-void clear_last_seq()
+void clear_last_seq(Sequence *seq)
{
_last_seq = NULL;
_last_seq_init = 0;
}
+Sequence *get_forground_frame_seq(int frame)
+{
+ Editing *ed;
+ Sequence *seq, *best_seq=NULL;
+ int best_machine = -1;
+ ed= G.scene->ed;
+ if(!ed) return NULL;
+
+ for (seq=ed->seqbasep->first; seq; seq= seq->next) {
+ if(seq->startdisp > frame || seq->enddisp <= frame)
+ continue;
+ /* only use elements you can see - not */
+ if (ELEM6(seq->type, SEQ_IMAGE, SEQ_META, SEQ_SCENE, SEQ_MOVIE, SEQ_MOVIE_AND_HD_SOUND, SEQ_COLOR)) {
+ if (seq->machine > best_machine) {
+ best_seq = seq;
+ best_machine = seq->machine;
+ }
+ }
+ }
+ return best_seq;
+}
+
+/* seq funcs's for transforming internally
+ notice the difference between start/end and left/right.
+
+ left and right are the bounds at which the setuence is rendered,
+start and end are from the start and fixed length of the sequence.
+*/
+int seq_tx_get_start(Sequence *seq) {
+ return seq->start;
+}
+int seq_tx_get_end(Sequence *seq)
+{
+ return seq->start+seq->len;
+}
+
+int seq_tx_get_final_left(Sequence *seq)
+{
+ return (seq->start - seq->startstill) + seq->startofs;
+}
+int seq_tx_get_final_right(Sequence *seq)
+{
+ return ((seq->start+seq->len) + seq->endstill) - seq->endofs;
+}
+
+void seq_tx_set_final_left(Sequence *seq, int val)
+{
+ if (val < (seq)->start) {
+ seq->startstill = abs(val - (seq)->start);
+ (seq)->startofs = 0;
+ } else {
+ seq->startofs = abs(val - (seq)->start);
+ seq->startstill = 0;
+ }
+}
+
+void seq_tx_set_final_right(Sequence *seq, int val)
+{
+ if (val > (seq)->start + (seq)->len) {
+ seq->endstill = abs(val - (seq->start + (seq)->len));
+ (seq)->endofs = 0;
+ } else {
+ seq->endofs = abs(val - ((seq)->start + (seq)->len));
+ seq->endstill = 0;
+ }
+}
+
+/* check if one side can be transformed */
+int seq_tx_check_left(Sequence *seq)
+{
+ if (seq->flag & SELECT) {
+ if (seq->flag & SEQ_LEFTSEL)
+ return 1;
+ else if (seq->flag & SEQ_RIGHTSEL)
+ return 0;
+
+ return 1; /* selected and neither left or right handles are, so let us move both */
+ }
+ return 0;
+}
+
+int seq_tx_check_right(Sequence *seq)
+{
+ if (seq->flag & SELECT) {
+ if (seq->flag & SEQ_RIGHTSEL)
+ return 1;
+ else if (seq->flag & SEQ_LEFTSEL)
+ return 0;
+
+ return 1; /* selected and neither left or right handles are, so let us move both */
+ }
+ return 0;
+}
+
+/* used so we can do a quick check for single image seq
+ since they work a bit differently to normal image seq's (during transform) */
+int check_single_seq(Sequence *seq)
+{
+ if ( seq->len==1 && (seq->type == SEQ_IMAGE || seq->type == SEQ_COLOR))
+ return 1;
+ else
+ return 0;
+}
+
+static void fix_single_image_seq(Sequence *seq)
+{
+ int left, start, offset;
+ if (!check_single_seq(seq))
+ return;
+
+ /* make sure the image is always at the start since there is only one,
+ adjusting its start should be ok */
+ left = seq_tx_get_final_left(seq);
+ start = seq->start;
+ if (start != left) {
+ offset = left - start;
+ seq_tx_set_final_left( seq, seq_tx_get_final_left(seq) - offset );
+ seq_tx_set_final_right( seq, seq_tx_get_final_right(seq) - offset );
+ seq->start += offset;
+ }
+}
+
static void change_plugin_seq(char *str) /* called from fileselect */
{
struct SeqEffectHandle sh;
@@ -160,7 +284,7 @@ static void change_plugin_seq(char *str) /* called from fileselect */
if( test_overlap_seq(last_seq) ) shuffle_seq(last_seq);
- BIF_undo_push("Load/change Sequencer plugin");
+ BIF_undo_push("Load/Change Plugin, Sequencer");
}
@@ -201,6 +325,92 @@ int sequence_is_free_transformable(Sequence * seq)
|| (get_sequence_effect_num_inputs(seq->type) == 0);
}
+Sequence *find_neighboring_sequence(Sequence *test, int lr, int sel) {
+/* looks to the left on lr==1, to the right on lr==2
+ sel - 0==unselected, 1==selected, -1==done care*/
+ Sequence *seq;
+ Editing *ed;
+
+ ed= G.scene->ed;
+ if(ed==0) return 0;
+
+ if (sel>0) sel = SELECT;
+
+ seq= ed->seqbasep->first;
+ while(seq) {
+ if( (seq!=test) &&
+ (test->machine==seq->machine) &&
+ (test->depth==seq->depth) &&
+ ((sel == -1) || (sel && (seq->flag & SELECT)) || (sel==0 && (seq->flag & SELECT)==0) ))
+ {
+ switch (lr) {
+ case 1:
+ if (test->startdisp == (seq->enddisp)) {
+ return seq;
+ }
+ break;
+ case 2:
+ if (test->enddisp == (seq->startdisp)) {
+ return seq;
+ }
+ break;
+ }
+ }
+ seq= seq->next;
+ }
+ return NULL;
+}
+
+Sequence *find_next_prev_sequence(Sequence *test, int lr, int sel) {
+/* looks to the left on lr==1, to the right on lr==2
+ sel - 0==unselected, 1==selected, -1==done care*/
+ Sequence *seq,*best_seq = NULL;
+ Editing *ed;
+
+ int dist, best_dist;
+ best_dist = MAXFRAME*2;
+
+ ed= G.scene->ed;
+ if(ed==0) return 0;
+
+ if (sel) sel = SELECT;
+
+ seq= ed->seqbasep->first;
+ while(seq) {
+ if( (seq!=test) &&
+ (test->machine==seq->machine) &&
+ (test->depth==seq->depth) &&
+ ((sel == -1) || (sel==(seq->flag & SELECT))))
+ {
+ dist = MAXFRAME*2;
+
+ switch (lr) {
+ case 1:
+ if (seq->enddisp <= test->startdisp) {
+ dist = test->enddisp - seq->startdisp;
+ }
+ break;
+ case 2:
+ if (seq->startdisp >= test->enddisp) {
+ dist = seq->startdisp - test->enddisp;
+ }
+ break;
+ }
+
+ if (dist==0) {
+ best_seq = seq;
+ break;
+ } else if (dist < best_dist) {
+ best_dist = dist;
+ best_seq = seq;
+ }
+ }
+ seq= seq->next;
+ }
+ return best_seq; /* can be null */
+}
+
+
Sequence *find_nearest_seq(int *hand)
{
Sequence *seq;
@@ -209,7 +419,7 @@ Sequence *find_nearest_seq(int *hand)
short mval[2];
float pixelx;
float handsize;
- float minhandle, maxhandle;
+ float displen;
View2D *v2d = G.v2d;
*hand= 0;
@@ -224,22 +434,33 @@ Sequence *find_nearest_seq(int *hand)
seq= ed->seqbasep->first;
while(seq) {
- /* clamp handles to defined size in pixel space */
- handsize = seq->handsize;
- minhandle = 7;
- maxhandle = 28;
- CLAMP(handsize, minhandle*pixelx, maxhandle*pixelx);
-
if(seq->machine == (int)y) {
/* check for both normal strips, and strips that have been flipped horizontally */
if( ((seq->startdisp < seq->enddisp) && (seq->startdisp<=x && seq->enddisp>=x)) ||
((seq->startdisp > seq->enddisp) && (seq->startdisp>=x && seq->enddisp<=x)) )
{
if(sequence_is_free_transformable(seq)) {
- if( handsize+seq->startdisp >=x )
- *hand= 1;
- else if( -handsize+seq->enddisp <=x )
- *hand= 2;
+
+ /* clamp handles to defined size in pixel space */
+
+ handsize = seq->handsize;
+ displen = (float)abs(seq->startdisp - seq->enddisp);
+
+ if (displen / pixelx > 16) { /* dont even try to grab the handles of small strips */
+ /* Set the max value to handle to 1/3 of the total len when its less then 28.
+ * This is important because otherwise selecting handles happens even when you click in the middle */
+
+ if ((displen/3) < 30*pixelx) {
+ handsize = displen/3;
+ } else {
+ CLAMP(handsize, 7*pixelx, 30*pixelx);
+ }
+
+ if( handsize+seq->startdisp >=x )
+ *hand= 1;
+ else if( -handsize+seq->enddisp <=x )
+ *hand= 2;
+ }
}
return seq;
}
@@ -395,7 +616,7 @@ static void deselect_all_seq(void)
}
END_SEQ
- BIF_undo_push("(De)select all Sequencer");
+ BIF_undo_push("(De)select all Strips, Sequencer");
}
static void recurs_sel_seq(Sequence *seqm)
@@ -437,60 +658,253 @@ void swap_select_seq(void)
END_SEQ
allqueue(REDRAWSEQ, 0);
- BIF_undo_push("Swap select all Sequencer");
+ BIF_undo_push("Swap Selected Strips, Sequencer");
}
-void mouse_select_seq(void)
-{
+void select_channel_direction(Sequence *test,int lr) {
+/* selects all strips in a channel to one direction of the passed strip */
Sequence *seq;
- int hand;
+ Editing *ed;
- seq= find_nearest_seq(&hand);
+ ed= G.scene->ed;
+ if(ed==0) return;
- if(!(G.qual & LR_SHIFTKEY)) deselect_all_seq();
+ seq= ed->seqbasep->first;
+ while(seq) {
+ if(seq!=test) {
+ if (test->machine==seq->machine) {
+ if(test->depth==seq->depth) {
+ if (((lr==1)&&(test->startdisp > (seq->startdisp)))||((lr==2)&&(test->startdisp < (seq->startdisp)))) {
+ seq->flag |= SELECT;
+ recurs_sel_seq(seq);
+ }
+ }
+ }
+ }
+ seq= seq->next;
+ }
+ test->flag |= SELECT;
+ recurs_sel_seq(test);
+}
- if(seq) {
- set_last_seq(seq);
+void select_dir_from_last(int lr)
+{
+ Sequence *seq=get_last_seq();
+ if (seq==NULL)
+ return;
+
+ select_channel_direction(seq,lr);
+ allqueue(REDRAWSEQ, 0);
+
+ if (lr==1) BIF_undo_push("Select Strips to the Left, Sequencer");
+ else BIF_undo_push("Select Strips to the Right, Sequencer");
+}
- if ((seq->type == SEQ_IMAGE) || (seq->type == SEQ_MOVIE)) {
- if(seq->strip) {
- strncpy(last_imagename, seq->strip->dir, FILE_MAXDIR-1);
- }
- } else
- if (seq->type == SEQ_HD_SOUND || seq->type == SEQ_RAM_SOUND) {
- if(seq->strip) {
- strncpy(last_sounddir, seq->strip->dir, FILE_MAXDIR-1);
+void select_surrounding_handles(Sequence *test)
+{
+ Sequence *neighbor;
+
+ neighbor=find_neighboring_sequence(test, 1, -1);
+ if (neighbor) {
+ neighbor->flag |= SELECT;
+ recurs_sel_seq(neighbor);
+ neighbor->flag |= SEQ_RIGHTSEL;
+ }
+ neighbor=find_neighboring_sequence(test, 2, -1);
+ if (neighbor) {
+ neighbor->flag |= SELECT;
+ recurs_sel_seq(neighbor);
+ neighbor->flag |= SEQ_LEFTSEL;
+ }
+ test->flag |= SELECT;
+}
+
+void select_surround_from_last()
+{
+ Sequence *seq=get_last_seq();
+
+ if (seq==NULL)
+ return;
+
+ select_surrounding_handles(seq);
+ allqueue(REDRAWSEQ, 0);
+ BIF_undo_push("Select Surrounding Handles, Sequencer");
+}
+
+void select_neighbor_from_last(int lr)
+{
+ Sequence *seq=get_last_seq();
+ Sequence *neighbor;
+ int change = 0;
+ if (seq) {
+ neighbor=find_neighboring_sequence(seq, lr, -1);
+ if (neighbor) {
+ switch (lr) {
+ case 1:
+ neighbor->flag |= SELECT;
+ recurs_sel_seq(neighbor);
+ neighbor->flag |= SEQ_RIGHTSEL;
+ seq->flag |= SEQ_LEFTSEL;
+ break;
+ case 2:
+ neighbor->flag |= SELECT;
+ recurs_sel_seq(neighbor);
+ neighbor->flag |= SEQ_LEFTSEL;
+ seq->flag |= SEQ_RIGHTSEL;
+ break;
}
+ seq->flag |= SELECT;
+ change = 1;
}
+ }
+ if (change) {
+ allqueue(REDRAWSEQ, 0);
+
+ if (lr==1) BIF_undo_push("Select Left Handles, Sequencer");
+ else BIF_undo_push("Select Right Handles, Sequencer");
+ }
+}
- if((G.qual & LR_SHIFTKEY) && (seq->flag & SELECT)) {
- if(hand==0) seq->flag &= SEQ_DESEL;
- else if(hand==1) {
- if(seq->flag & SEQ_LEFTSEL)
- seq->flag &= ~SEQ_LEFTSEL;
- else seq->flag |= SEQ_LEFTSEL;
- }
- else if(hand==2) {
- if(seq->flag & SEQ_RIGHTSEL)
- seq->flag &= ~SEQ_RIGHTSEL;
- else seq->flag |= SEQ_RIGHTSEL;
- }
+void mouse_select_seq(void)
+{
+ Sequence *seq,*neighbor;
+ int hand,seldir;
+ TimeMarker *marker;
+
+ marker=find_nearest_marker(1);
+
+ if (marker) {
+ int oldflag;
+ /* select timeline marker */
+ if (G.qual & LR_SHIFTKEY) {
+ oldflag= marker->flag;
+ deselect_markers(0, 0);
+
+ if (oldflag & SELECT)
+ marker->flag &= ~SELECT;
+ else
+ marker->flag |= SELECT;
}
else {
- seq->flag |= SELECT;
- if(hand==1) seq->flag |= SEQ_LEFTSEL;
- if(hand==2) seq->flag |= SEQ_RIGHTSEL;
+ marker->flag |= SELECT;
}
- recurs_sel_seq(seq);
- }
+ allqueue(REDRAWMARKER, 0);
+ force_draw(0);
- force_draw(0);
+ BIF_undo_push("Select Strips, Sequencer");
+
+ } else {
+
+ seq= find_nearest_seq(&hand);
+ if(!(G.qual & LR_SHIFTKEY)&&!(G.qual & LR_ALTKEY)&&!(G.qual & LR_CTRLKEY)) deselect_all_seq();
+
+ if(seq) {
+ set_last_seq(seq);
+
+ if ((seq->type == SEQ_IMAGE) || (seq->type == SEQ_MOVIE)) {
+ if(seq->strip) {
+ strncpy(last_imagename, seq->strip->dir, FILE_MAXDIR-1);
+ }
+ } else
+ if (seq->type == SEQ_HD_SOUND || seq->type == SEQ_RAM_SOUND) {
+ if(seq->strip) {
+ strncpy(last_sounddir, seq->strip->dir, FILE_MAXDIR-1);
+ }
+ }
+
+ if((G.qual & LR_SHIFTKEY) && (seq->flag & SELECT)) {
+ if(hand==0) seq->flag &= SEQ_DESEL;
+ else if(hand==1) {
+ if(seq->flag & SEQ_LEFTSEL)
+ seq->flag &= ~SEQ_LEFTSEL;
+ else seq->flag |= SEQ_LEFTSEL;
+ }
+ else if(hand==2) {
+ if(seq->flag & SEQ_RIGHTSEL)
+ seq->flag &= ~SEQ_RIGHTSEL;
+ else seq->flag |= SEQ_RIGHTSEL;
+ }
+ }
+ else {
+ seq->flag |= SELECT;
+ if(hand==1) seq->flag |= SEQ_LEFTSEL;
+ if(hand==2) seq->flag |= SEQ_RIGHTSEL;
+ }
+
+ /* On Ctrl-Alt selection, select the strip and bordering handles */
+ if ((G.qual & LR_CTRLKEY) && (G.qual & LR_ALTKEY)) {
+ if (!(G.qual & LR_SHIFTKEY)) deselect_all_seq();
+ seq->flag |= SELECT;
+ select_surrounding_handles(seq);
+
+ /* Ctrl signals Left, Alt signals Right
+ First click selects adjacent handles on that side.
+ Second click selects all strips in that direction.
+ If there are no adjacent strips, it just selects all in that direction. */
+ } else if (((G.qual & LR_CTRLKEY) || (G.qual & LR_ALTKEY)) && (seq->flag & SELECT)) {
+
+ if (G.qual & LR_CTRLKEY) seldir=1;
+ else seldir=2;
+ neighbor=find_neighboring_sequence(seq, seldir, -1);
+ if (neighbor) {
+ switch (seldir) {
+ case 1:
+ if ((seq->flag & SEQ_LEFTSEL)&&(neighbor->flag & SEQ_RIGHTSEL)) {
+ if (!(G.qual & LR_SHIFTKEY)) deselect_all_seq();
+ select_channel_direction(seq,1);
+ } else {
+ neighbor->flag |= SELECT;
+ recurs_sel_seq(neighbor);
+ neighbor->flag |= SEQ_RIGHTSEL;
+ seq->flag |= SEQ_LEFTSEL;
+ }
+ break;
+ case 2:
+ if ((seq->flag & SEQ_RIGHTSEL)&&(neighbor->flag & SEQ_LEFTSEL)) {
+ if (!(G.qual & LR_SHIFTKEY)) deselect_all_seq();
+ select_channel_direction(seq,2);
+ } else {
+ neighbor->flag |= SELECT;
+ recurs_sel_seq(neighbor);
+ neighbor->flag |= SEQ_LEFTSEL;
+ seq->flag |= SEQ_RIGHTSEL;
+ }
+ break;
+ }
+ } else {
+ if (!(G.qual & LR_SHIFTKEY)) deselect_all_seq();
+ select_channel_direction(seq,seldir);
+ }
+ }
- if(get_last_seq()) allqueue(REDRAWIPO, 0);
- BIF_undo_push("Select Sequencer");
+ recurs_sel_seq(seq);
+ }
+ force_draw(0);
+
+ if(get_last_seq()) allqueue(REDRAWIPO, 0);
+ BIF_undo_push("Select Strips, Sequencer");
- std_rmouse_transform(transform_seq);
+ std_rmouse_transform(transform_seq_nomarker);
+ }
+
+ /* marker transform */
+ if (marker) {
+ short mval[2], xo, yo;
+ getmouseco_areawin(mval);
+ xo= mval[0];
+ yo= mval[1];
+
+ while(get_mbut()&R_MOUSE) {
+ getmouseco_areawin(mval);
+ if(abs(mval[0]-xo)+abs(mval[1]-yo) > 4) {
+ transform_markers('g', 0);
+ allqueue(REDRAWMARKER, 0);
+ return;
+ }
+ BIF_wait_for_statechange();
+ }
+ }
}
@@ -571,7 +985,6 @@ static Sequence *sfile_to_sequence(SpaceFile *sfile, int cfra, int machine, int
if(sfile->filelist[a].flags & ACTIVE) {
if( (sfile->filelist[a].type & S_IFDIR)==0 ) {
strncpy(se->name, sfile->filelist[a].relname, FILE_MAXFILE-1);
- se->ok= 1;
se++;
}
}
@@ -579,7 +992,6 @@ static Sequence *sfile_to_sequence(SpaceFile *sfile, int cfra, int machine, int
/* no selected file: */
if(totsel==1 && se==strip->stripdata) {
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
- se->ok= 1;
}
/* last active name */
@@ -596,7 +1008,7 @@ static int sfile_to_mv_sequence_load(SpaceFile *sfile, int cfra,
struct anim *anim;
Strip *strip;
StripElem *se;
- int totframe, a;
+ int totframe;
char name[160], rel[160];
char str[FILE_MAXDIR+FILE_MAXFILE];
@@ -640,7 +1052,7 @@ static int sfile_to_mv_sequence_load(SpaceFile *sfile, int cfra,
strip->len= totframe;
strip->us= 1;
strncpy(strip->dir, name, FILE_MAXDIR-1);
- strip->stripdata= se= MEM_callocN(totframe*sizeof(StripElem), "stripelem");
+ strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
/* name movie in first strip */
if(index<0)
@@ -648,11 +1060,6 @@ static int sfile_to_mv_sequence_load(SpaceFile *sfile, int cfra,
else
strncpy(se->name, sfile->filelist[index].relname, FILE_MAXFILE-1);
- for(a=1; a<=totframe; a++, se++) {
- se->ok= 1;
- se->nr= a;
- }
-
/* last active name */
strncpy(last_imagename, seq->strip->dir, FILE_MAXDIR-1);
return(cfra+totframe);
@@ -697,7 +1104,6 @@ static Sequence *sfile_to_ramsnd_sequence(SpaceFile *sfile,
Strip *strip;
StripElem *se;
double totframe;
- int a;
char name[160], rel[160];
char str[256];
@@ -719,7 +1125,8 @@ static Sequence *sfile_to_ramsnd_sequence(SpaceFile *sfile,
sound->flags |= SOUND_FLAGS_SEQUENCE;
audio_makestream(sound);
- totframe= (int) ( ((float)(sound->streamlen-1)/( (float)G.scene->audio.mixrate*4.0 ))* (float)G.scene->r.frs_sec);
+ totframe= (int) ( ((float)(sound->streamlen-1)/
+ ( (float)G.scene->audio.mixrate*4.0 ))* FPS);
/* make seq */
seq= alloc_sequence(((Editing *)G.scene->ed)->seqbasep, cfra, machine);
@@ -742,17 +1149,11 @@ static Sequence *sfile_to_ramsnd_sequence(SpaceFile *sfile,
strip->len= totframe;
strip->us= 1;
strncpy(strip->dir, name, FILE_MAXDIR-1);
- strip->stripdata= se= MEM_callocN(totframe*sizeof(StripElem), "stripelem");
+ strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
/* name sound in first strip */
strncpy(se->name, sfile->file, FILE_MAXFILE-1);
- for(a=1; a<=totframe; a++, se++) {
- se->ok= 2; /* why? */
- se->ibuf= 0;
- se->nr= a;
- }
-
/* last active name */
strncpy(last_sounddir, seq->strip->dir, FILE_MAXDIR-1);
@@ -766,7 +1167,7 @@ static int sfile_to_hdsnd_sequence_load(SpaceFile *sfile, int cfra,
struct hdaudio *hdaudio;
Strip *strip;
StripElem *se;
- int totframe, a;
+ int totframe;
char name[160], rel[160];
char str[FILE_MAXDIR+FILE_MAXFILE];
@@ -786,7 +1187,7 @@ static int sfile_to_hdsnd_sequence_load(SpaceFile *sfile, int cfra,
return(cfra);
}
- totframe= sound_hdaudio_get_duration(hdaudio, G.scene->r.frs_sec);
+ totframe= sound_hdaudio_get_duration(hdaudio, FPS);
/* make seq */
seq= alloc_sequence(((Editing *)G.scene->ed)->seqbasep, cfra, machine);
@@ -809,7 +1210,7 @@ static int sfile_to_hdsnd_sequence_load(SpaceFile *sfile, int cfra,
strip->len= totframe;
strip->us= 1;
strncpy(strip->dir, name, FILE_MAXDIR-1);
- strip->stripdata= se= MEM_callocN(totframe*sizeof(StripElem), "stripelem");
+ strip->stripdata= se= MEM_callocN(sizeof(StripElem), "stripelem");
/* name movie in first strip */
if(index<0)
@@ -817,12 +1218,6 @@ static int sfile_to_hdsnd_sequence_load(SpaceFile *sfile, int cfra,
else
strncpy(se->name, sfile->filelist[index].relname, FILE_MAXFILE-1);
- for(a=1; a<=totframe; a++, se++) {
- se->ok= 2;
- se->ibuf = 0;
- se->nr= a;
- }
-
/* last active name */
strncpy(last_sounddir, seq->strip->dir, FILE_MAXDIR-1);
return(cfra+totframe);
@@ -917,8 +1312,8 @@ static void add_image_strips(char *name)
waitcursor(0);
- BIF_undo_push("Add image strip Sequencer");
- transform_seq('g', 0);
+ BIF_undo_push("Add Image Strip, Sequencer");
+ transform_seq_nomarker('g', 0);
}
@@ -952,8 +1347,8 @@ static void add_movie_strip(char *name)
waitcursor(0);
- BIF_undo_push("Add movie strip Sequencer");
- transform_seq('g', 0);
+ BIF_undo_push("Add Movie Strip, Sequencer");
+ transform_seq_nomarker('g', 0);
}
@@ -988,8 +1383,8 @@ static void add_movie_and_hdaudio_strip(char *name)
waitcursor(0);
- BIF_undo_push("Add movie and HD-audio strip Sequencer");
- transform_seq('g', 0);
+ BIF_undo_push("Add Movie and HD-Audio Strip, Sequencer");
+ transform_seq_nomarker('g', 0);
}
@@ -1017,8 +1412,8 @@ static void add_sound_strip_ram(char *name)
waitcursor(0);
- BIF_undo_push("Add ram sound strip Sequencer");
- transform_seq('g', 0);
+ BIF_undo_push("Add Sound (RAM) Strip, Sequencer");
+ transform_seq_nomarker('g', 0);
}
static void add_sound_strip_hd(char *name)
@@ -1045,8 +1440,8 @@ static void add_sound_strip_hd(char *name)
waitcursor(0);
- BIF_undo_push("Add hd sound strip Sequencer");
- transform_seq('g', 0);
+ BIF_undo_push("Add Sound (HD) Strip, Sequencer");
+ transform_seq_nomarker('g', 0);
}
#if 0
@@ -1286,12 +1681,12 @@ static int add_seq_effect(int type, char *str)
/* push undo and go into grab mode */
if(newseq->type == SEQ_PLUGIN) {
- BIF_undo_push("Add plugin strip Sequencer");
+ BIF_undo_push("Add Plugin Strip, Sequencer");
} else {
- BIF_undo_push("Add effect strip Sequencer");
+ BIF_undo_push("Add Effect Strip, Sequencer");
}
- transform_seq('g', 0);
+ transform_seq_nomarker('g', 0);
return 1;
}
@@ -1382,7 +1777,7 @@ void add_sequence(int type)
}
else {
event= pupmenu("Add Sequence Strip%t"
- "|Images%x1"
+ "|Image Sequence%x1"
"|Movie%x102"
#ifdef WITH_FFMPEG
"|Movie + Audio (HD)%x105"
@@ -1418,8 +1813,11 @@ void add_sequence(int type)
switch(event) {
case 1:
-
- activate_fileselect(FILE_SPECIAL, "Select Images", last_imagename, add_image_strips);
+ /* Image Dosnt work at the moment - TODO */
+ //if(G.qual & LR_CTRLKEY)
+ // activate_imageselect(FILE_SPECIAL, "Select Images", last_imagename, add_image_strips);
+ //else
+ activate_fileselect(FILE_SPECIAL, "Select Images", last_imagename, add_image_strips);
break;
case 105:
activate_fileselect(FILE_SPECIAL, "Select Movie+Audio", last_imagename, add_movie_and_hdaudio_strip);
@@ -1465,8 +1863,8 @@ void add_sequence(int type)
strip->us= 1;
if(seq->len>0) strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
- BIF_undo_push("Add scene strip Sequencer");
- transform_seq('g', 0);
+ BIF_undo_push("Add Scene Strip, Sequencer");
+ transform_seq_nomarker('g', 0);
}
}
MEM_freeN(str);
@@ -1571,7 +1969,7 @@ void change_sequence(void)
update_changed_seq_and_deps(last_seq, 0, 1);
allqueue(REDRAWSEQ, 0);
- BIF_undo_push("Change effect Sequencer");
+ BIF_undo_push("Change Strip Effect, Sequencer");
}
}
else if(last_seq->type == SEQ_IMAGE) {
@@ -1593,6 +1991,10 @@ void change_sequence(void)
last_seq->len= sce->r.efra - sce->r.sfra + 1;
last_seq->sfra= sce->r.sfra;
+
+ /* bad code to change seq->len? update_changed_seq_and_deps() expects the strip->len to be OK */
+ new_tstripdata(last_seq);
+
update_changed_seq_and_deps(last_seq, 1, 1);
allqueue(REDRAWSEQ, 0);
@@ -1601,6 +2003,19 @@ void change_sequence(void)
}
+void reload_sequence(void)
+{
+ Editing *ed= G.scene->ed;
+ Sequence *seq;
+ WHILE_SEQ(ed->seqbasep) {
+ if(seq->flag & SELECT) {
+ update_changed_seq_and_deps(seq, 0, 1);
+ }
+ }
+ END_SEQ
+ allqueue(REDRAWSEQ, 0);
+}
+
void reassign_inputs_seq_effect()
{
Editing *ed= G.scene->ed;
@@ -1728,31 +2143,29 @@ void del_seq(void)
ms= ms->prev;
}
- BIF_undo_push("Delete from Sequencer");
+ BIF_undo_push("Delete Strip(s), Sequencer");
allqueue(REDRAWSEQ, 0);
}
static void recurs_dupli_seq(ListBase *old, ListBase *new)
{
- Sequence *seq, *seqn;
+ Sequence *seq;
+ Sequence *seqn = 0;
Sequence *last_seq = get_last_seq();
- StripElem *se;
- int a;
seq= old->first;
while(seq) {
- seq->newseq= 0;
+ seq->tmp= NULL;
if(seq->flag & SELECT) {
-
if(seq->type==SEQ_META) {
seqn= MEM_dupallocN(seq);
- seq->newseq= seqn;
+ seq->tmp= seqn;
BLI_addtail(new, seqn);
seqn->strip= MEM_dupallocN(seq->strip);
-
- if(seq->len>0) seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ seqn->strip->stripdata = 0;
+ seqn->strip->tstripdata = 0;
seq->flag &= SEQ_DESEL;
seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
@@ -1763,107 +2176,83 @@ static void recurs_dupli_seq(ListBase *old, ListBase *new)
}
else if(seq->type == SEQ_SCENE) {
seqn= MEM_dupallocN(seq);
- seq->newseq= seqn;
+ seq->tmp= seqn;
BLI_addtail(new, seqn);
seqn->strip= MEM_dupallocN(seq->strip);
-
- if(seq->len>0) seqn->strip->stripdata = MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ seqn->strip->stripdata = 0;
+ seqn->strip->tstripdata = 0;
seq->flag &= SEQ_DESEL;
seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
}
else if(seq->type == SEQ_MOVIE) {
seqn= MEM_dupallocN(seq);
- seq->newseq= seqn;
+ seq->tmp= seqn;
BLI_addtail(new, seqn);
seqn->strip= MEM_dupallocN(seq->strip);
+ seqn->strip->stripdata =
+ MEM_dupallocN(seq->strip->stripdata);
+ seqn->strip->tstripdata = 0;
seqn->anim= 0;
- if(seqn->len>0) {
- seqn->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
- /* copy first elem */
- *seqn->strip->stripdata= *seq->strip->stripdata;
- se= seqn->strip->stripdata;
- a= seq->len;
- while(a--) {
- se->ok= 1;
- se++;
- }
- }
-
seq->flag &= SEQ_DESEL;
seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
}
else if(seq->type == SEQ_RAM_SOUND) {
seqn= MEM_dupallocN(seq);
- seq->newseq= seqn;
+ seq->tmp= seqn;
BLI_addtail(new, seqn);
seqn->strip= MEM_dupallocN(seq->strip);
+ seqn->strip->stripdata =
+ MEM_dupallocN(seq->strip->stripdata);
+ seqn->strip->tstripdata = 0;
+
seqn->anim= 0;
seqn->sound->id.us++;
if(seqn->ipo) seqn->ipo->id.us++;
- if(seqn->len>0) {
- seqn->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
- /* copy first elem */
- *seqn->strip->stripdata= *seq->strip->stripdata;
- se= seqn->strip->stripdata;
- a= seq->len;
- while(a--) {
- se->ok= 1;
- se++;
- }
- }
-
seq->flag &= SEQ_DESEL;
seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
}
else if(seq->type == SEQ_HD_SOUND) {
seqn= MEM_dupallocN(seq);
- seq->newseq= seqn;
+ seq->tmp= seqn;
BLI_addtail(new, seqn);
seqn->strip= MEM_dupallocN(seq->strip);
+ seqn->strip->stripdata =
+ MEM_dupallocN(seq->strip->stripdata);
+ seqn->strip->tstripdata = 0;
seqn->anim= 0;
seqn->hdaudio = 0;
if(seqn->ipo) seqn->ipo->id.us++;
- if(seqn->len>0) {
- seqn->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
- /* copy first elem */
- *seqn->strip->stripdata= *seq->strip->stripdata;
- se= seqn->strip->stripdata;
- a= seq->len;
- while(a--) {
- se->ok= 1;
- se++;
- }
- }
-
seq->flag &= SEQ_DESEL;
seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
- }
- else if(seq->type < SEQ_EFFECT) {
+ } else if(seq->type == SEQ_IMAGE) {
seqn= MEM_dupallocN(seq);
- seq->newseq= seqn;
+ seq->tmp= seqn;
BLI_addtail(new, seqn);
- seqn->strip->us++;
+ seqn->strip= MEM_dupallocN(seq->strip);
+ seqn->strip->stripdata =
+ MEM_dupallocN(seq->strip->stripdata);
+ seqn->strip->tstripdata = 0;
+
seq->flag &= SEQ_DESEL;
seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
- }
- else {
+ } else if(seq->type >= SEQ_EFFECT) {
seqn= MEM_dupallocN(seq);
- seq->newseq= seqn;
+ seq->tmp= seqn;
BLI_addtail(new, seqn);
- if(seq->seq1 && seq->seq1->newseq) seqn->seq1= seq->seq1->newseq;
- if(seq->seq2 && seq->seq2->newseq) seqn->seq2= seq->seq2->newseq;
- if(seq->seq3 && seq->seq3->newseq) seqn->seq3= seq->seq3->newseq;
+ if(seq->seq1 && seq->seq1->tmp) seqn->seq1= seq->seq1->tmp;
+ if(seq->seq2 && seq->seq2->tmp) seqn->seq2= seq->seq2->tmp;
+ if(seq->seq3 && seq->seq3->tmp) seqn->seq3= seq->seq3->tmp;
if(seqn->ipo) seqn->ipo->id.us++;
@@ -1875,12 +2264,16 @@ static void recurs_dupli_seq(ListBase *old, ListBase *new)
}
seqn->strip= MEM_dupallocN(seq->strip);
-
- if(seq->len>0) seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelem");
+ seqn->strip->stripdata = 0;
+ seqn->strip->tstripdata = 0;
seq->flag &= SEQ_DESEL;
seqn->flag &= ~(SEQ_LEFTSEL+SEQ_RIGHTSEL);
+ } else {
+ fprintf(stderr, "Aiiiiekkk! sequence type not "
+ "handled in duplicate!\nExpect a crash"
+ " now...\n");
}
if (seq == last_seq) {
set_last_seq(seqn);
@@ -1903,8 +2296,8 @@ void add_duplicate_seq(void)
recurs_dupli_seq(ed->seqbasep, &new);
addlisttolist(ed->seqbasep, &new);
- BIF_undo_push("Add duplicate Sequencer");
- transform_seq('g', 0);
+ BIF_undo_push("Add Duplicate, Sequencer");
+ transform_seq_nomarker('g', 0);
}
int insert_gap(int gap, int cfra)
@@ -1981,6 +2374,48 @@ void set_filter_seq(void)
}
+void seq_remap_paths(void)
+{
+ Sequence *seq, *last_seq = get_last_seq();
+ Editing *ed;
+ char from[FILE_MAX], to[FILE_MAX], stripped[FILE_MAX];
+
+ ed= G.scene->ed;
+ if(ed==NULL || last_seq==NULL)
+ return;
+
+ BLI_strncpy(from, last_seq->strip->dir, FILE_MAX);
+ if (0==sbutton(from, 0, sizeof(from)-1, "From: "))
+ return;
+
+ strcpy(to, from);
+ if (0==sbutton(to, 0, sizeof(to)-1, "To: "))
+ return;
+
+ if (strcmp(to, from)==0)
+ return;
+
+ WHILE_SEQ(ed->seqbasep) {
+ if(seq->flag & SELECT) {
+ if(strncmp(seq->strip->dir, from, strlen(from))==0) {
+ printf("found %s\n", seq->strip->dir);
+
+ /* strip off the beginning */
+ stripped[0]= 0;
+ BLI_strncpy(stripped, seq->strip->dir + strlen(from), FILE_MAX);
+
+ /* new path */
+ BLI_strncpy(seq->strip->dir, to, FILE_MAX);
+ strcat(seq->strip->dir, stripped);
+ printf("new %s\n", seq->strip->dir);
+ }
+ }
+ }
+ END_SEQ
+
+ BIF_undo_push("Remap Paths, Sequencer");
+ allqueue(REDRAWSEQ, 0);
+}
void no_gaps(void)
@@ -2005,7 +2440,7 @@ void no_gaps(void)
}
}
- BIF_undo_push("No gaps Sequencer");
+ BIF_undo_push("No Gaps, Sequencer");
allqueue(REDRAWSEQ, 0);
}
@@ -2087,10 +2522,10 @@ void make_meta(void)
seqm->strip= MEM_callocN(sizeof(Strip), "metastrip");
seqm->strip->len= seqm->len;
seqm->strip->us= 1;
- if(seqm->len) seqm->strip->stripdata= MEM_callocN(seqm->len*sizeof(StripElem), "metastripdata");
+
set_meta_stripdata(seqm);
- BIF_undo_push("Make Meta Sequencer");
+ BIF_undo_push("Make Meta Strip, Sequencer");
allqueue(REDRAWSEQ, 0);
}
@@ -2113,7 +2548,7 @@ void un_meta(void)
if(last_seq==0 || last_seq->type!=SEQ_META) return;
- if(okee("Un Meta")==0) return;
+ if(okee("Un Meta Strip")==0) return;
addlisttolist(ed->seqbasep, &last_seq->seqbase);
@@ -2143,7 +2578,7 @@ void un_meta(void)
sort_seq();
- BIF_undo_push("Un-make Meta Sequencer");
+ BIF_undo_push("Un-Make Meta Strip, Sequencer");
allqueue(REDRAWSEQ, 0);
}
@@ -2182,7 +2617,7 @@ void exit_meta(void)
MEM_freeN(ms);
allqueue(REDRAWSEQ, 0);
- BIF_undo_push("Exit meta strip Sequence");
+ BIF_undo_push("Exit Meta Strip, Sequence");
}
@@ -2209,173 +2644,495 @@ void enter_meta(void)
set_last_seq(NULL);
allqueue(REDRAWSEQ, 0);
- BIF_undo_push("Enter meta strip Sequence");
+ BIF_undo_push("Enter Meta Strip, Sequence");
}
/* ****************** END META ************************* */
+static int seq_get_snaplimit(void)
+{
+ /* fake mouse coords to get the snap value
+ a bit lazy but its only done once pre transform */
+ float xmouse, ymouse, x;
+ short mval[2] = {24, 0}; /* 24 screen px snap */
+ areamouseco_to_ipoco(G.v2d, mval, &xmouse, &ymouse);
+ x = xmouse;
+ mval[0] = 0;
+ areamouseco_to_ipoco(G.v2d, mval, &xmouse, &ymouse);
+ return (int)(x - xmouse);
+}
typedef struct TransSeq {
int start, machine;
int startstill, endstill;
int startdisp, enddisp;
int startofs, endofs;
+ int final_left, final_right;
int len;
} TransSeq;
+/* use to impose limits when dragging/extending - so impossible situations dont happen */
+static void transform_grab_xlimits(Sequence *seq, int leftflag, int rightflag)
+{
+ if(leftflag) {
+ if (seq_tx_get_final_left(seq) >= seq_tx_get_final_right(seq)) {
+ seq_tx_set_final_left(seq, seq_tx_get_final_right(seq)-1);
+ }
+
+ if (check_single_seq(seq)==0) {
+ if (seq_tx_get_final_left(seq) >= seq_tx_get_end(seq)) {
+ seq_tx_set_final_left(seq, seq_tx_get_end(seq)-1);
+ }
+
+ /* dosnt work now - TODO */
+ /*
+ if (seq_tx_get_start(seq) >= seq_tx_get_final_right(seq)) {
+ int ofs;
+ ofs = seq_tx_get_start(seq) - seq_tx_get_final_right(seq);
+ seq->start -= ofs;
+ seq_tx_set_final_left(seq, seq_tx_get_final_left(seq) + ofs );
+ }*/
+
+ }
+ }
+
+ if(rightflag) {
+ if (seq_tx_get_final_right(seq) <= seq_tx_get_final_left(seq)) {
+ seq_tx_set_final_right(seq, seq_tx_get_final_left(seq)+1);
+ }
+
+ if (check_single_seq(seq)==0) {
+ if (seq_tx_get_final_right(seq) <= seq_tx_get_start(seq)) {
+ seq_tx_set_final_right(seq, seq_tx_get_start(seq)+1);
+ }
+ }
+ }
+
+ /* sounds cannot be extended past their endpoints */
+ if (seq->type == SEQ_RAM_SOUND || seq->type == SEQ_HD_SOUND) {
+ seq->startstill= 0;
+ seq->endstill= 0;
+ }
+}
+
void transform_seq(int mode, int context)
{
- Sequence *seq;
+ SpaceSeq *sseq= curarea->spacedata.first;
+ Sequence *seq, *last_seq;
Editing *ed;
float dx, dy, dvec[2], div;
TransSeq *transmain, *ts;
- int tot=0, ix, iy, firsttime=1, afbreek=0, midtog= 0, proj= 0;
+ int totstrip=0, firsttime=1, afbreek=0, midtog= 0, proj= 0;
+ int ix, iy; /* these values are used for storing the mouses offset from its original location */
+ int ix_old = 0;
unsigned short event = 0;
short mval[2], val, xo, yo, xn, yn;
char str[32];
-
- if(mode!='g') return; /* from gesture */
+ char side= 'L'; /* for extend mode only - use to know which side to extend on */
+ char marker_moved=0; /* if we mvoed a marker, redraw all marker views */
+ /* used for extend in a number of places */
+ int cfra = CFRA;
+
+ /* for snapping */
+ char snapskip = 0, snap, snap_old= 0;
+ int snapdist_max = seq_get_snaplimit();
+ /* at the moment there are only 4 possible snap points,
+ - last_seq (start,end)
+ - selected bounds (start/end)
+ - last_seq (next/prev)
+ - current frame */
+ int snap_points[4], snap_point_num = 0;
+ int j; /* loop on snap_points */
+
+ /* for markers */
+ int *oldframe = NULL, totmark=0, a;
+ TimeMarker *marker;
+
+
+ if(mode!='g' && mode!='e') return; /* from gesture */
/* which seqs are involved */
ed= G.scene->ed;
if(ed==0) return;
WHILE_SEQ(ed->seqbasep) {
- if(seq->flag & SELECT) tot++;
+ if(seq->flag & SELECT) totstrip++;
}
END_SEQ
- if(tot==0) return;
-
+
+ if (sseq->flag & SEQ_MARKER_TRANS) {
+ for(marker= G.scene->markers.first; marker; marker= marker->next) {
+ if(marker->flag & SELECT) totmark++;
+ }
+ }
+ if(totstrip==0 && totmark==0) return;
+
G.moving= 1;
-
- ts=transmain= MEM_callocN(tot*sizeof(TransSeq), "transseq");
+
+ last_seq = get_last_seq();
+
+ ts=transmain= MEM_callocN(totstrip*sizeof(TransSeq), "transseq");
WHILE_SEQ(ed->seqbasep) {
if(seq->flag & SELECT) {
-
ts->start= seq->start;
ts->machine= seq->machine;
ts->startstill= seq->startstill;
ts->endstill= seq->endstill;
ts->startofs= seq->startofs;
ts->endofs= seq->endofs;
-
+
+ /* for extend only */
+ if (mode=='e') {
+ ts->final_left = seq_tx_get_final_left(seq);
+ ts->final_right = seq_tx_get_final_right(seq);
+ }
ts++;
}
}
END_SEQ
-
+
getmouseco_areawin(mval);
+
+ /* choose the side based on which side of the playhead the mouse is on */
+ if (mode=='e') {
+ float xmouse, ymouse;
+ areamouseco_to_ipoco(G.v2d, mval, &xmouse, &ymouse);
+ side = (xmouse > cfra) ? 'R' : 'L';
+ }
+
+ /* Markers */
+ if (sseq->flag & SEQ_MARKER_TRANS && totmark) {
+ oldframe= MEM_mallocN(totmark*sizeof(int), "marker array");
+ for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
+ if(marker->flag & SELECT) {
+ if (mode=='e') {
+
+ /* when extending, invalidate markers on the other side by using an invalid frame value */
+ if ((side == 'L' && marker->frame > cfra) || (side == 'R' && marker->frame < cfra)) {
+ oldframe[a] = MAXFRAME+1;
+ } else {
+ oldframe[a]= marker->frame;
+ }
+ } else {
+ oldframe[a]= marker->frame;
+ }
+ a++;
+ }
+ }
+ }
+
xo=xn= mval[0];
yo=yn= mval[1];
dvec[0]= dvec[1]= 0.0;
while(afbreek==0) {
getmouseco_areawin(mval);
- if(mval[0]!=xo || mval[1]!=yo || firsttime) {
- firsttime= 0;
+ G.qual = get_qual();
+ snap = (G.qual & LR_CTRLKEY) ? 1 : 0;
+
+ if(mval[0]!=xo || mval[1]!=yo || firsttime || snap != snap_old) {
+ if (firsttime) {
+ snap_old = snap;
+ firsttime= 0;
+ }
+
+ /* run for either grab or extend */
+ dx= mval[0]- xo;
+ dy= mval[1]- yo;
- if(mode=='g') {
+ div= G.v2d->mask.xmax-G.v2d->mask.xmin;
+ dx= (G.v2d->cur.xmax-G.v2d->cur.xmin)*(dx)/div;
- dx= mval[0]- xo;
- dy= mval[1]- yo;
+ div= G.v2d->mask.ymax-G.v2d->mask.ymin;
+ dy= (G.v2d->cur.ymax-G.v2d->cur.ymin)*(dy)/div;
- div= G.v2d->mask.xmax-G.v2d->mask.xmin;
- dx= (G.v2d->cur.xmax-G.v2d->cur.xmin)*(dx)/div;
+ if(G.qual & LR_SHIFTKEY) {
+ if(dx>1.0) dx= 1.0; else if(dx<-1.0) dx= -1.0;
+ }
- div= G.v2d->mask.ymax-G.v2d->mask.ymin;
- dy= (G.v2d->cur.ymax-G.v2d->cur.ymin)*(dy)/div;
+ dvec[0]+= dx;
+ dvec[1]+= dy;
- if(G.qual & LR_SHIFTKEY) {
- if(dx>1.0) dx= 1.0; else if(dx<-1.0) dx= -1.0;
+ if(midtog) dvec[proj]= 0.0;
+ ix= floor(dvec[0]+0.5);
+ iy= floor(dvec[1]+0.5);
+
+ ts= transmain;
+
+ /* SNAP! use the active Seq */
+ snap = G.qual & LR_CTRLKEY ? 1 : 0;
+
+ if (!snap) {
+ snapskip = 0;
+ } else {
+ int dist;
+ int snap_ofs= 0;
+ int snap_dist= snapdist_max;
+
+ /* Get sequence points to snap to the markers */
+
+ snap_point_num=0;
+ if (last_seq && (last_seq->flag & SELECT)) { /* active seq bounds */
+ if(seq_tx_check_left(last_seq))
+ snap_points[snap_point_num++] = seq_tx_get_final_left(last_seq);
+ if(seq_tx_check_right(last_seq))
+ snap_points[snap_point_num++] = seq_tx_get_final_right(last_seq);
+
+ }
+ if (totstrip > 1) { /* selection bounds */
+ int bounds_left = MAXFRAME*2;
+ int bounds_right = -(MAXFRAME*2);
+
+ WHILE_SEQ(ed->seqbasep) {
+ if(seq->flag & SELECT) {
+ if(seq_tx_check_left(seq))
+ bounds_left = MIN2(bounds_left, seq_tx_get_final_left(seq));
+ if(seq_tx_check_right(seq))
+ bounds_right = MAX2(bounds_right,seq_tx_get_final_right(seq));
+ }
+ }
+ END_SEQ
+
+ /* its possible there were no points to set on either side */
+ if (bounds_left != MAXFRAME*2)
+ snap_points[snap_point_num++] = bounds_left;
+ if (bounds_right != -(MAXFRAME*2))
+ snap_points[snap_point_num++] = bounds_right;
+ }
+
+
+ /* Define so we can snap to other points without hassle */
+
+#define TESTSNAP(test_frame)\
+ for(j=0; j<snap_point_num; j++) {\
+ /* see if this beats the current best snap point */\
+ dist = abs(snap_points[j] - test_frame);\
+ if (dist < snap_dist) {\
+ snap_ofs = test_frame - snap_points[j];\
+ snap_dist = dist;\
+ }\
+ }
+
+
+ /* Detect the best marker to snap to! */
+ for(a=0, marker= G.scene->markers.first; marker; a++, marker= marker->next) {
+
+ /* dont snap to a marker on the wrong extend side */
+ if (mode=='e' && ((side == 'L' && marker->frame > cfra) || (side == 'R' && marker->frame < cfra)))
+ continue;
+
+ /* when we are moving markers, dont snap to selected markers, durr */
+ if ((sseq->flag & SEQ_MARKER_TRANS)==0 || (marker->flag & SELECT)==0) {
+
+ /* loop over the sticky points - max 4 */
+ TESTSNAP(marker->frame);
+ if (snap_dist == 0) break; /* alredy snapped? - stop looking */
+ }
+ }
+
+ if (snap_dist) {
+ TESTSNAP(cfra);
+ }
+
+ /* check seq's next to the active also - nice for quick snapping */
+ if (snap_dist && last_seq && seq_tx_check_left(last_seq)) {
+ seq = find_next_prev_sequence(last_seq, 1, 0); /* left */
+ if(seq && !seq_tx_check_right(seq))
+ TESTSNAP(seq_tx_get_final_right(seq));
+ }
+
+ if (snap_dist && last_seq && seq_tx_check_right(last_seq)) {
+ seq = find_next_prev_sequence(last_seq, 2, 0); /* right */
+ if(seq && !seq_tx_check_left(seq))
+ TESTSNAP(seq_tx_get_final_left(seq));
}
- dvec[0]+= dx;
- dvec[1]+= dy;
-
- if(midtog) dvec[proj]= 0.0;
- ix= floor(dvec[0]+0.5);
- iy= floor(dvec[1]+0.5);
-
-
- ts= transmain;
-
+#undef TESTSNAP
+
+ if (abs(ix_old-ix) >= snapdist_max) {
+ /* mouse has moved out of snap range */
+ snapskip = 0;
+ } else if (snap_dist==0) {
+ /* nowhere to move, dont do anything */
+ snapskip = 1;
+ } else if (snap_dist < snapdist_max) {
+ /* do the snapping by adjusting the mouse offset value */
+ ix = ix_old + snap_ofs;
+ }
+ }
+
+ if (mode=='g' && !snapskip) {
+ /* Grab */
WHILE_SEQ(ed->seqbasep) {
if(seq->flag & SELECT) {
+ int myofs;
+ // SEQ_DEBUG_INFO(seq);
+
+ /* X Transformation */
if(seq->flag & SEQ_LEFTSEL) {
- if(ts->startstill) {
- seq->startstill= ts->startstill-ix;
- if(seq->startstill<0) seq->startstill= 0;
- }
- else if(ts->startofs) {
- seq->startofs= ts->startofs+ix;
- if(seq->startofs<0) seq->startofs= 0;
- }
- else {
- if(ix>0) {
- seq->startofs= ix;
- seq->startstill= 0;
- }
- else if (seq->type != SEQ_RAM_SOUND && seq->type != SEQ_HD_SOUND) {
- seq->startstill= -ix;
- seq->startofs= 0;
- }
- }
- if(seq->len <= seq->startofs+seq->endofs) {
- seq->startofs= seq->len-seq->endofs-1;
- }
+ myofs = (ts->startofs - ts->startstill);
+ seq_tx_set_final_left(seq, ts->start + (myofs + ix));
}
if(seq->flag & SEQ_RIGHTSEL) {
- if(ts->endstill) {
- seq->endstill= ts->endstill+ix;
- if(seq->endstill<0) seq->endstill= 0;
- }
- else if(ts->endofs) {
- seq->endofs= ts->endofs-ix;
- if(seq->endofs<0) seq->endofs= 0;
- }
- else {
- if(ix<0) {
- seq->endofs= -ix;
- seq->endstill= 0;
- }
- else if (seq->type != SEQ_RAM_SOUND && seq->type != SEQ_HD_SOUND) {
- seq->endstill= ix;
- seq->endofs= 0;
- }
- }
- if(seq->len <= seq->startofs+seq->endofs) {
- seq->endofs= seq->len-seq->startofs-1;
- }
+ myofs = (ts->endstill - ts->endofs);
+ seq_tx_set_final_right(seq, ts->start + seq->len + (myofs + ix));
}
+ transform_grab_xlimits(seq, seq->flag & SEQ_LEFTSEL, seq->flag & SEQ_RIGHTSEL);
+
if( (seq->flag & (SEQ_LEFTSEL+SEQ_RIGHTSEL))==0 ) {
if(sequence_is_free_transformable(seq)) seq->start= ts->start+ ix;
+ /* Y Transformation */
if(seq->depth==0) seq->machine= ts->machine+ iy;
if(seq->machine<1) seq->machine= 1;
else if(seq->machine>= MAXSEQ) seq->machine= MAXSEQ;
}
-
calc_sequence(seq);
-
ts++;
}
}
END_SEQ
-
- sprintf(str, "X: %d Y: %d ", ix, iy);
- headerprint(str);
+
+ /* Markers */
+ if (sseq->flag & SEQ_MARKER_TRANS) {
+ for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
+ if(marker->flag & SELECT) {
+ marker->frame= oldframe[a] + ix;
+ marker_moved=1;
+ a++;
+ }
+ }
+ }
+
+ /* Extend, grabs one side of the current frame */
+ } else if (mode=='e' && !snapskip) {
+ int myofs; /* offset from start of the seq clip */
+ int xnew, final_left, final_right; /* just to store results from seq_tx_get_final_left/right */
+
+ /* we dont use seq side selection flags for this,
+ instead we need to calculate which sides to move
+ based on its initial position from the cursor */
+ int move_left, move_right;
+
+ /* Extend, Similar to grab but operate on one side of the cursor */
+ WHILE_SEQ(ed->seqbasep) {
+ if(seq->flag & SELECT) {
+ /* only move the contents of the metastrip otherwise the transformation is applied twice */
+ if (sequence_is_free_transformable(seq) && seq->type != SEQ_META) {
+
+ move_left = move_right = 0;
+
+ //SEQ_DEBUG_INFO(seq);
+
+ final_left = seq_tx_get_final_left(seq);
+ final_right = seq_tx_get_final_right(seq);
+
+ /* Only X Axis moving */
+
+ /* work out which sides to move first */
+ if (side=='L') {
+ if (final_left <= cfra || ts->final_left <= cfra) move_left = 1;
+ if (final_right <= cfra || ts->final_right <= cfra) move_right = 1;
+ } else {
+ if (final_left >= cfra || ts->final_left >= cfra) move_left = 1;
+ if (final_right >= cfra || ts->final_right >= cfra) move_right = 1;
+ }
+
+ if (move_left && move_right) {
+ /* simple move - dont need to do anything complicated */
+ seq->start= ts->start+ ix;
+ } else {
+ if (side=='L') {
+ if (move_left) {
+
+ /* Similar to other funcs */
+ myofs = (ts->startofs - ts->startstill);
+ xnew = ts->start + (ix + myofs);
+
+ /* make sure the we dont resize down to 0 or less in size
+ also include the startstill so the contense dosnt go outside the bounds,
+ if the seq->startofs is 0 then its ignored */
+
+ /* TODO remove, add check to transform_grab_xlimits, works ok for now */
+ if (xnew + seq->startstill > final_right-1) {
+ xnew = (final_right-1) - seq->startstill;
+ }
+ /* Note, this is the only case where the start needs to be adjusted
+ since its not needed when modifying the end or when moving the entire sequence */
+ //seq->start = ts->start+ix; // This works when xnew is not clamped, line below takes clamping into account
+ seq->start= xnew - myofs; /* TODO see above */
+ /* done with unique stuff */
+
+ seq_tx_set_final_left(seq, xnew);
+ transform_grab_xlimits(seq, 1, 0);
+
+ /* Special case again - setting the end back to what it was */
+ seq_tx_set_final_right(seq, final_right);
+ }
+ if (move_right) {
+ myofs = (ts->endstill - ts->endofs);
+ xnew = ts->start + seq->len + (myofs + ix);
+ seq_tx_set_final_right(seq, xnew);
+ transform_grab_xlimits(seq, 0, 1);
+ }
+ } else { /* R */
+ if (move_left) {
+ myofs = (ts->startofs - ts->startstill);
+ xnew = ts->start + (myofs + ix);
+ seq_tx_set_final_left(seq, xnew);
+ transform_grab_xlimits(seq, 1, 0);
+ }
+ if (move_right) {
+ myofs = (ts->endstill - ts->endofs);
+ xnew = ts->start + seq->len + (myofs + ix);
+ seq_tx_set_final_right(seq, xnew);
+ transform_grab_xlimits(seq, 0, 1);
+ }
+ }
+ }
+ }
+ calc_sequence(seq);
+ ts++;
+ }
+ }
+ END_SEQ
+
+ /* markers */
+ if (sseq->flag & SEQ_MARKER_TRANS) {
+ for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {\
+ if (marker->flag & SELECT) {
+ if(oldframe[a] != MAXFRAME+1) {
+ marker->frame= oldframe[a] + ix;
+ marker_moved=1;
+ }
+ a++;
+ }
+ }
+ }
}
-
+
+ sprintf(str, "X: %d Y: %d ", ix, iy);
+ headerprint(str);
+
+ /* remember the last value for snapping,
+ only set if we are not currently snapped,
+ prevents locking on a keyframe */
+ if (!snapskip)
+ ix_old = ix;
+
+ /* just to tell if ctrl was pressed, this means we get a recalc when pressing ctrl */
+ snap_old = snap;
+
+ /* rememver last mouse values so we can skip transform when nothing happens */
xo= mval[0];
yo= mval[1];
/* test for effect and overlap */
-
WHILE_SEQ(ed->seqbasep) {
if(seq->flag & SELECT) {
seq->flag &= ~SEQ_OVERLAP;
@@ -2392,6 +3149,7 @@ void transform_seq(int mode, int context)
END_SEQ;
force_draw(0);
+
}
else BIF_wait_for_statechange();
@@ -2443,14 +3201,32 @@ void transform_seq(int mode, int context)
else if(seq->seq2 && seq->seq2->flag & SELECT) calc_sequence(seq);
else if(seq->seq3 && seq->seq3->flag & SELECT) calc_sequence(seq);
}
-
}
END_SEQ
- }
- else {
+
+
+ /* Markers */
+ if (sseq->flag & SEQ_MARKER_TRANS) {
+ for(a=0, marker= G.scene->markers.first; marker; marker= marker->next) {
+ if (marker->flag & SELECT) {
+ if(oldframe[a] != MAXFRAME+1) {
+ marker->frame= oldframe[a];
+ }
+ a++;
+ }
+ }
+ marker_moved = 0;
+ }
+ } else {
/* images, effects and overlap */
WHILE_SEQ(ed->seqbasep) {
+
+ /* fixes single image strips - makes sure their start is not out of bounds
+ ideally this would be done during transform since data is rendered at that time
+ however it ends up being a lot messier! - Campbell */
+ fix_single_image_seq(seq);
+
if(seq->type == SEQ_META) {
calc_sequence(seq);
seq->flag &= ~SEQ_OVERLAP;
@@ -2471,9 +3247,33 @@ void transform_seq(int mode, int context)
G.moving= 0;
MEM_freeN(transmain);
+
+ if (sseq->flag & SEQ_MARKER_TRANS && totmark)
+ MEM_freeN(oldframe);
+
+ if (mode=='g')
+ BIF_undo_push("Transform Grab, Sequencer");
+ else if (mode=='e')
+ BIF_undo_push("Transform Extend, Sequencer");
+
+ if (marker_moved)
+ allqueue(REDRAWMARKER, 0);
+ else
+ allqueue(REDRAWSEQ, 0);
+}
- BIF_undo_push("Transform Sequencer");
- allqueue(REDRAWSEQ, 0);
+/* since grab can move markers, we must turn this off before adding a new sequence
+ I am not so happy with this, but the baddness in contained here - Campbell */
+void transform_seq_nomarker(int mode, int context) {
+ SpaceSeq *sseq= curarea->spacedata.first;
+ int flag_back;
+ if (!sseq) return; /* should never happen */
+ flag_back = sseq->flag;
+ sseq->flag &= ~SEQ_MARKER_TRANS;
+
+ transform_seq(mode, context);
+
+ sseq->flag = flag_back;
}
void seq_cut(int cutframe)
@@ -2495,7 +3295,7 @@ void seq_cut(int cutframe)
}
}
if(seq) {
- error("Cannot cut Meta strips");
+ error("Cannot Cut Meta Strips");
return;
}
@@ -2510,7 +3310,7 @@ void seq_cut(int cutframe)
}
if(tot==0) {
- error("No strips to cut");
+ error("No Strips to Cut");
return;
}
@@ -2604,6 +3404,177 @@ void seq_cut(int cutframe)
MEM_freeN(transmain);
allqueue(REDRAWSEQ, 0);
+ BIF_undo_push("Cut Strips, Sequencer");
+}
+
+void seq_separate_images(void)
+{
+ Editing *ed;
+ Sequence *seq, *seq_new, *seq_next;
+ Strip *strip_new;
+ StripElem *se, *se_new;
+ int start_ofs, cfra, frame_end;
+ static int step= 1;
+
+ add_numbut(0, NUM|INT, "Image Duration:", 1, 256, &step, NULL);
+ if (!do_clever_numbuts("Separate Images", 1, REDRAW))
+ return;
+
+ ed= G.scene->ed;
+ if(ed==0) return;
+
+ seq= ed->seqbasep->first;
+
+ while (seq) {
+ if((seq->flag & SELECT) && (seq->type == SEQ_IMAGE) && (seq->len > 1)) {
+ /* remove seq so overlap tests dont conflict,
+ see free_sequence below for the real free'ing */
+ seq_next = seq->next;
+ BLI_remlink(ed->seqbasep, seq);
+ if(seq->ipo) seq->ipo->id.us--;
+
+ start_ofs = cfra = seq_tx_get_final_left(seq);
+ frame_end = seq_tx_get_final_right(seq);
+
+ while (cfra < frame_end) {
+ /* new seq */
+ se = give_stripelem(seq, cfra);
+
+ seq_new= alloc_sequence(((Editing *)G.scene->ed)->seqbasep, start_ofs, seq->machine);
+ seq_new->type= SEQ_IMAGE;
+ seq_new->len = 1;
+ seq_new->endstill = step-1;
+
+ /* new strip */
+ seq_new->strip= strip_new= MEM_callocN(sizeof(Strip)*1, "strip");
+ strip_new->len= 1;
+ strip_new->us= 1;
+ strncpy(strip_new->dir, seq->strip->dir, FILE_MAXDIR-1);
+
+ /* new stripdata */
+ strip_new->stripdata= se_new= MEM_callocN(sizeof(StripElem)*1, "stripelem");
+ strncpy(se_new->name, se->name, FILE_MAXFILE-1);
+ calc_sequence(seq_new);
+ seq_new->flag &= ~SEQ_OVERLAP;
+ if (test_overlap_seq(seq_new)) {
+ shuffle_seq(seq_new);
+ }
+
+ cfra++;
+ start_ofs += step;
+ }
+
+ free_sequence(seq);
+ seq = seq->next;
+ } else {
+ seq = seq->next;
+ }
+ }
+
+ /* as last: */
+ sort_seq();
+ BIF_undo_push("Separate Image Strips, Sequencer");
+ allqueue(REDRAWSEQ, 0);
+}
+
+/* run recursivly to select linked */
+static int select_more_less_seq__internal(int sel, int linked) {
+ Editing *ed;
+ Sequence *seq, *neighbor;
+ int change=0;
+ int isel;
+
+ ed= G.scene->ed;
+ if(ed==0) return 0;
+
+ if (sel) {
+ sel = SELECT;
+ isel = 0;
+ } else {
+ sel = 0;
+ isel = SELECT;
+ }
+
+ if (!linked) {
+ /* if not linked we only want to touch each seq once, newseq */
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
+ seq->tmp = NULL;
+ }
+ }
+
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
+ if((int)(seq->flag & SELECT) == sel) {
+ if ((linked==0 && seq->tmp)==0) {
+ /* only get unselected nabours */
+ neighbor = find_neighboring_sequence(seq, 1, isel);
+ if (neighbor) {
+ if (sel) {neighbor->flag |= SELECT; recurs_sel_seq(neighbor);}
+ else neighbor->flag &= ~SELECT;
+ if (linked==0) neighbor->tmp = (Sequence *)1;
+ change = 1;
+ }
+ neighbor = find_neighboring_sequence(seq, 2, isel);
+ if (neighbor) {
+ if (sel) {neighbor->flag |= SELECT; recurs_sel_seq(neighbor);}
+ else neighbor->flag &= ~SELECT;
+ if (linked==0) neighbor->tmp = (void *)1;
+ change = 1;
+ }
+ }
+ }
+ }
+
+ return change;
+}
+
+void select_less_seq(void)
+{
+ if (select_more_less_seq__internal(0, 0)) {
+ BIF_undo_push("Select Less, Sequencer");
+ allqueue(REDRAWSEQ, 0);
+ }
+}
+
+void select_more_seq(void)
+{
+ if (select_more_less_seq__internal(1, 0)) {
+ BIF_undo_push("Select More, Sequencer");
+ allqueue(REDRAWSEQ, 0);
+ }
+}
+
+/* TODO not all modes supported - if you feel like being picky, add them! ;) */
+void select_linked_seq(int mode) {
+ Editing *ed;
+ Sequence *seq, *mouse_seq;
+ int selected, hand;
+
+ ed= G.scene->ed;
+ if(ed==0) return;
+
+ /* replace current selection */
+ if (mode==0 || mode==2) {
+ /* this works like UV, not mesh */
+ if (mode==0) {
+ mouse_seq= find_nearest_seq(&hand);
+ if (!mouse_seq)
+ return; /* user error as with mesh?? */
+
+ for(seq= ed->seqbasep->first; seq; seq= seq->next) {
+ seq->flag &= ~SELECT;
+ }
+ mouse_seq->flag |= SELECT;
+ recurs_sel_seq(mouse_seq);
+ }
+
+ selected = 1;
+ while (selected) {
+ selected = select_more_less_seq__internal(1, 1);
+ }
+ BIF_undo_push("Select Linked, Sequencer");
+ allqueue(REDRAWSEQ, 0);
+ }
+ /* TODO - more modes... */
}
void seq_snap_menu(void)
@@ -2645,9 +3616,12 @@ void seq_snap(short event)
}
}
else if(seq->type & SEQ_EFFECT) {
- if(seq->seq1->flag & SELECT) calc_sequence(seq);
- else if(seq->seq2->flag & SELECT) calc_sequence(seq);
- else if(seq->seq3->flag & SELECT) calc_sequence(seq);
+ if(seq->seq1 && (seq->seq1->flag & SELECT))
+ calc_sequence(seq);
+ else if(seq->seq2 && (seq->seq2->flag & SELECT))
+ calc_sequence(seq);
+ else if(seq->seq3 && (seq->seq3->flag & SELECT))
+ calc_sequence(seq);
}
}
END_SEQ;
@@ -2655,7 +3629,7 @@ void seq_snap(short event)
/* as last: */
sort_seq();
- BIF_undo_push("Snap menu Sequencer");
+ BIF_undo_push("Snap Strips, Sequencer");
allqueue(REDRAWSEQ, 0);
}
@@ -2704,7 +3678,7 @@ void borderselect_seq(void)
seq= seq->next;
}
- BIF_undo_push("Border select Sequencer");
+ BIF_undo_push("Border Select, Sequencer");
addqueue(curarea->win, REDRAW, 1);
}
}
diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c
index 3f257bb848f..ce1d70527ed 100644
--- a/source/blender/src/editsima.c
+++ b/source/blender/src/editsima.c
@@ -47,6 +47,7 @@
#include "BLI_blenlib.h"
#include "BLI_arithb.h"
+#include "BLI_editVert.h"
#include "IMB_imbuf_types.h"
#include "IMB_imbuf.h"
@@ -79,6 +80,7 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "BIF_imasel.h"
#include "BIF_interface.h"
#include "BIF_drawimage.h"
#include "BIF_editview.h"
@@ -90,6 +92,7 @@
#include "BIF_toolbox.h"
#include "BIF_transform.h"
#include "BIF_writeimage.h"
+#include "BIF_editmesh.h"
#include "BSE_drawipo.h"
#include "BSE_edit.h"
@@ -106,10 +109,10 @@
#include "blendef.h"
#include "multires.h"
#include "mydevice.h"
+#include "editmesh.h"
/* local prototypes */
-void clever_numbuts_sima(void);
-void sel_uvco_inside_radius(short , MTFace *, int , float *, float *, short);
+void sel_uvco_inside_radius(short , EditFace *efa, MTFace *, int , float *, float *, short);
void uvedit_selectionCB(short , Object *, short *, float ); /* used in edit.c*/
void object_uvs_changed(Object *ob)
@@ -129,21 +132,15 @@ void object_tface_flags_changed(Object *ob, int updateButtons)
int is_uv_tface_editing_allowed_silent(void)
{
- Mesh *me;
-
- if(G.obedit) return 0;
+ if(!EM_texFaceCheck()) return 0;
if(G.sima->mode!=SI_TEXTURE) return 0;
- if(!(G.f & G_FACESELECT)) return 0;
- me= get_mesh(OBACT);
- if(me==0 || me->mtface==0) return 0;
- if(multires_level1_test()) return 0;
-
+ if(multires_level1_test()) return 0;
return 1;
}
int is_uv_tface_editing_allowed(void)
{
- if(G.obedit) error("Unable to perform action in Edit Mode");
+ if(!G.obedit) error("Enter Edit Mode to perform this action");
return is_uv_tface_editing_allowed_silent();
}
@@ -159,111 +156,16 @@ void get_connected_limit_tface_uv(float *limit)
limit[0]= limit[1]= 0.05/256.0;
}
-void clever_numbuts_sima(void)
-{
- float ocent[2], cent[2]= {0.0, 0.0};
- int imx= 256, imy= 256;
- int i, nactive= 0;
- Mesh *me;
-
- if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
-
- if (G.sima->image) {
- ImBuf *ibuf= BKE_image_get_ibuf(G.sima->image, &G.sima->iuser);
- if(ibuf) {
- imx= ibuf->x;
- imy= ibuf->y;
- }
- }
-
- for (i=0; i<me->totface; i++) {
- MFace *mf= &((MFace*) me->mface)[i];
- MTFace *tf= &((MTFace*) me->mtface)[i];
-
- if (!(mf->flag & ME_FACE_SEL))
- continue;
-
- if (tf->flag & TF_SEL1) {
- cent[0]+= tf->uv[0][0];
- cent[1]+= tf->uv[0][1];
- nactive++;
- }
- if (tf->flag & TF_SEL2) {
- cent[0]+= tf->uv[1][0];
- cent[1]+= tf->uv[1][1];
- nactive++;
- }
- if (tf->flag & TF_SEL3) {
- cent[0]+= tf->uv[2][0];
- cent[1]+= tf->uv[2][1];
- nactive++;
- }
- if (mf->v4 && (tf->flag & TF_SEL4)) {
- cent[0]+= tf->uv[3][0];
- cent[1]+= tf->uv[3][1];
- nactive++;
- }
- }
-
- if (nactive) {
- cent[0]= (cent[0]*imx)/nactive;
- cent[1]= (cent[1]*imy)/nactive;
-
- add_numbut(0, NUM|FLO, "LocX:", -imx*20, imx*20, &cent[0], NULL);
- add_numbut(1, NUM|FLO, "LocY:", -imy*20, imy*20, &cent[1], NULL);
-
- ocent[0]= cent[0];
- ocent[1]= cent[1];
- if (do_clever_numbuts((nactive==1)?"Active Vertex":"Selected Center", 2, REDRAW)) {
- float delta[2];
-
- delta[0]= (cent[0]-ocent[0])/imx;
- delta[1]= (cent[1]-ocent[1])/imy;
-
- for (i=0; i<me->totface; i++) {
- MFace *mf= &((MFace*) me->mface)[i];
- MTFace *tf= &((MTFace*) me->mtface)[i];
-
- if (!(mf->flag & ME_FACE_SEL))
- continue;
-
- if (tf->flag & TF_SEL1) {
- tf->uv[0][0]+= delta[0];
- tf->uv[0][1]+= delta[1];
- }
- if (tf->flag & TF_SEL2) {
- tf->uv[1][0]+= delta[0];
- tf->uv[1][1]+= delta[1];
- }
- if (tf->flag & TF_SEL3) {
- tf->uv[2][0]+= delta[0];
- tf->uv[2][1]+= delta[1];
- }
- if (mf->v4 && (tf->flag & TF_SEL4)) {
- tf->uv[3][0]+= delta[0];
- tf->uv[3][1]+= delta[1];
- }
- }
-
- object_uvs_changed(OBACT);
- }
- }
-}
-
-void be_square_tface_uv(Mesh *me)
+void be_square_tface_uv(EditMesh *em)
{
+ EditFace *efa;
MTFace *tface;
- MFace *mface;
- int a;
-
/* if 1 vertex selected: doit (with the selected vertex) */
- mface= (MFace*)me->mface;
- tface= (MTFace*)me->mtface;
- for(a=me->totface; a>0; a--, tface++, mface++) {
- if(mface->v4) {
- if(mface->flag & ME_FACE_SEL) {
- if(tface->flag & TF_SEL1) {
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->v4) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0)) {
if( tface->uv[1][0] == tface->uv[2][0] ) {
tface->uv[1][1]= tface->uv[0][1];
tface->uv[3][0]= tface->uv[0][0];
@@ -274,7 +176,7 @@ void be_square_tface_uv(Mesh *me)
}
}
- if(tface->flag & TF_SEL2) {
+ if (simaUVSel_Check(efa, tface, 1)) {
if( tface->uv[2][1] == tface->uv[3][1] ) {
tface->uv[2][0]= tface->uv[1][0];
tface->uv[0][1]= tface->uv[1][1];
@@ -285,7 +187,7 @@ void be_square_tface_uv(Mesh *me)
}
}
- if(tface->flag & TF_SEL3) {
+ if (simaUVSel_Check(efa, tface, 2)) {
if( tface->uv[3][0] == tface->uv[0][0] ) {
tface->uv[3][1]= tface->uv[2][1];
tface->uv[1][0]= tface->uv[2][0];
@@ -295,7 +197,7 @@ void be_square_tface_uv(Mesh *me)
tface->uv[1][1]= tface->uv[2][1];
}
}
- if(tface->flag & TF_SEL4) {
+ if (simaUVSel_Check(efa, tface, 3)) {
if( tface->uv[0][1] == tface->uv[1][1] ) {
tface->uv[0][0]= tface->uv[3][0];
tface->uv[2][1]= tface->uv[3][1];
@@ -314,10 +216,13 @@ void be_square_tface_uv(Mesh *me)
void transform_aspect_ratio_tface_uv(float *aspx, float *aspy)
{
int w, h;
-
+ float xuser_asp, yuser_asp;
+
+ aspect_sima(G.sima, &xuser_asp, &yuser_asp);
+
transform_width_height_tface_uv(&w, &h);
- *aspx= (float)w/256.0f;
- *aspy= (float)h/256.0f;
+ *aspx= (float)w/256.0f * xuser_asp;
+ *aspy= (float)h/256.0f * yuser_asp;
}
void transform_width_height_tface_uv(int *width, int *height)
@@ -360,50 +265,41 @@ void mirrormenu_tface_uv(void)
void weld_align_tface_uv(char tool)
{
- MFace *mface;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
MTFace *tface;
- Mesh *me;
- float min[2], max[2], cent[2];
- int a;
+ float cent[2];
if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
-
- if (!minmax_tface_uv(min, max))
- return;
-
- cent[0]= (min[0]+max[0])/2.0;
- cent[1]= (min[1]+max[1])/2.0;
+ cent_tface_uv(cent, 0);
if(tool == 'x' || tool == 'w') {
- tface= me->mtface;
- mface= me->mface;
- for(a=me->totface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- if(tface->flag & TF_SEL1)
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0))
tface->uv[0][0]= cent[0];
- if(tface->flag & TF_SEL2)
+ if (simaUVSel_Check(efa, tface, 1))
tface->uv[1][0]= cent[0];
- if(tface->flag & TF_SEL3)
+ if (simaUVSel_Check(efa, tface, 2))
tface->uv[2][0]= cent[0];
- if(mface->v4 && (tface->flag & TF_SEL4))
+ if (efa->v4 && simaUVSel_Check(efa, tface, 3))
tface->uv[3][0]= cent[0];
}
}
}
if(tool == 'y' || tool == 'w') {
- tface= me->mtface;
- mface= me->mface;
- for(a=me->totface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- if(tface->flag & TF_SEL1)
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0))
tface->uv[0][1]= cent[1];
- if(tface->flag & TF_SEL2)
+ if (simaUVSel_Check(efa, tface, 1))
tface->uv[1][1]= cent[1];
- if(tface->flag & TF_SEL3)
+ if (simaUVSel_Check(efa, tface, 2))
tface->uv[2][1]= cent[1];
- if(mface->v4 && (tface->flag & TF_SEL4))
+ if (efa->v4 && simaUVSel_Check(efa, tface, 3))
tface->uv[3][1]= cent[1];
}
}
@@ -412,16 +308,100 @@ void weld_align_tface_uv(char tool)
object_uvs_changed(OBACT);
}
+// just for averaging UV's
+typedef struct UVVertAverage {
+ float uv[2];
+ int count;
+} UVVertAverage;
+
+void stitch_vert_uv_tface(void)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ EditVert *eve;
+ MTFace *tface;
+ int count;
+ UVVertAverage *uv_average, *uvav;
+
+ if( is_uv_tface_editing_allowed()==0 ) return;
+
+ // index and count verts
+ for (count=0, eve=em->verts.first; eve; count++, eve= eve->next) {
+ eve->tmp.l = count;
+ }
+
+ uv_average = MEM_callocN(sizeof(UVVertAverage) * count, "Stitch");
+
+ // gather uv averages per vert
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0)) {
+ uvav = uv_average + efa->v1->tmp.l;
+ uvav->count++;
+ uvav->uv[0] += tface->uv[0][0];
+ uvav->uv[1] += tface->uv[0][1];
+ }
+ if (simaUVSel_Check(efa, tface, 1)) {
+ uvav = uv_average + efa->v2->tmp.l;
+ uvav->count++;
+ uvav->uv[0] += tface->uv[1][0];
+ uvav->uv[1] += tface->uv[1][1];
+ }
+ if (simaUVSel_Check(efa, tface, 2)) {
+ uvav = uv_average + efa->v3->tmp.l;
+ uvav->count++;
+ uvav->uv[0] += tface->uv[2][0];
+ uvav->uv[1] += tface->uv[2][1];
+ }
+ if (efa->v4 && simaUVSel_Check(efa, tface, 3)) {
+ uvav = uv_average + efa->v4->tmp.l;
+ uvav->count++;
+ uvav->uv[0] += tface->uv[3][0];
+ uvav->uv[1] += tface->uv[3][1];
+ }
+ }
+ }
+
+ // apply uv welding
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0)) {
+ uvav = uv_average + efa->v1->tmp.l;
+ tface->uv[0][0] = uvav->uv[0]/uvav->count;
+ tface->uv[0][1] = uvav->uv[1]/uvav->count;
+ }
+ if (simaUVSel_Check(efa, tface, 1)) {
+ uvav = uv_average + efa->v2->tmp.l;
+ tface->uv[1][0] = uvav->uv[0]/uvav->count;
+ tface->uv[1][1] = uvav->uv[1]/uvav->count;
+ }
+ if (simaUVSel_Check(efa, tface, 2)) {
+ uvav = uv_average + efa->v3->tmp.l;
+ tface->uv[2][0] = uvav->uv[0]/uvav->count;
+ tface->uv[2][1] = uvav->uv[1]/uvav->count;
+ }
+ if (efa->v4 && simaUVSel_Check(efa, tface, 3)) {
+ uvav = uv_average + efa->v4->tmp.l;
+ tface->uv[3][0] = uvav->uv[0]/uvav->count;
+ tface->uv[3][1] = uvav->uv[1]/uvav->count;
+ }
+ }
+ }
+ MEM_freeN(uv_average);
+ object_uvs_changed(OBACT);
+}
+
void weld_align_menu_tface_uv(void)
{
short mode= 0;
if( is_uv_tface_editing_allowed()==0 ) return;
- mode= pupmenu("Weld/Align%t|Weld%x1|Align X%x2|Align Y%x3|");
+ mode= pupmenu("Weld/Align%t|Weld%x1|Align X%x2|Align Y%x3");
if(mode==-1) return;
-
if(mode==1) weld_align_tface_uv('w');
else if(mode==2) weld_align_tface_uv('x');
else if(mode==3) weld_align_tface_uv('y');
@@ -432,24 +412,28 @@ void weld_align_menu_tface_uv(void)
void select_invert_tface_uv(void)
{
- Mesh *me;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
MTFace *tface;
- MFace *mface;
- int a;
if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
- mface= me->mface;
-
- for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- tface->flag ^= TF_SEL1;
- tface->flag ^= TF_SEL2;
- tface->flag ^= TF_SEL3;
- if(mface->v4) tface->flag ^= TF_SEL4;
+
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ /* Warning, this is not that good (calling editmode stuff from UV),
+ TODO look into changing it */
+ selectswap_mesh();
+ return;
+ } else {
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ tface->flag ^= TF_SEL1;
+ tface->flag ^= TF_SEL2;
+ tface->flag ^= TF_SEL3;
+ if(efa->v4) tface->flag ^= TF_SEL4;
+ }
}
}
-
BIF_undo_push("Select Inverse UV");
allqueue(REDRAWIMAGE, 0);
@@ -457,39 +441,43 @@ void select_invert_tface_uv(void)
void select_swap_tface_uv(void)
{
- Mesh *me;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
MTFace *tface;
- MFace *mface;
- int a, sel=0;
+ int sel=0;
if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
-
- mface= me->mface;
- for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- if(tface->flag & (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4)) {
- sel= 1;
- break;
+
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ deselectall_mesh();
+ return;
+ } else {
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if(tface->flag & (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4)) {
+ sel= 1;
+ break;
+ }
}
}
- }
- mface= me->mface;
- for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- if(mface->v4) {
- if(sel) tface->flag &= ~(TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4);
- else tface->flag |= (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4);
- }
- else {
- if(sel) tface->flag &= ~(TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4);
- else tface->flag |= (TF_SEL1+TF_SEL2+TF_SEL3);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if(efa->v4) {
+ if(sel) tface->flag &= ~(TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4);
+ else tface->flag |= (TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4);
+ }
+ else {
+ if(sel) tface->flag &= ~(TF_SEL1+TF_SEL2+TF_SEL3+TF_SEL4);
+ else tface->flag |= (TF_SEL1+TF_SEL2+TF_SEL3);
+ }
}
}
}
-
- BIF_undo_push("Select swap UV");
+ BIF_undo_push("Select swap");
allqueue(REDRAWIMAGE, 0);
}
@@ -510,29 +498,25 @@ static int msel_hit(float *limit, unsigned int *hitarray, unsigned int vertexid,
return 0;
}
-static void find_nearest_tface(MTFace **nearesttf, MFace **nearestmf)
+static void find_nearest_tface(MTFace **nearesttf, EditFace **nearestefa)
{
- Mesh *me;
+ EditMesh *em= G.editMesh;
MTFace *tf;
- MFace *mf;
- int a, i, nverts, mindist, dist, fcenter[2], uval[2];
+ EditFace *efa;
+ int i, nverts, mindist, dist, fcenter[2], uval[2];
short mval[2];
getmouseco_areawin(mval);
mindist= 0x7FFFFFF;
*nearesttf= NULL;
- *nearestmf= NULL;
-
- me= get_mesh(OBACT);
- mf= (MFace*)me ->mface;
- tf= (MTFace*)me->mtface;
-
- for(a=me->totface; a>0; a--, tf++, mf++) {
- if(mf->flag & ME_FACE_SEL) {
-
+ *nearestefa= NULL;
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
fcenter[0]= fcenter[1]= 0;
- nverts= mf->v4? 4: 3;
+ nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
uvco_to_areaco_noclip(tf->uv[i], uval);
fcenter[0] += uval[0];
@@ -545,7 +529,7 @@ static void find_nearest_tface(MTFace **nearesttf, MFace **nearestmf)
dist= abs(mval[0]- fcenter[0])+ abs(mval[1]- fcenter[1]);
if (dist < mindist) {
*nearesttf= tf;
- *nearestmf= mf;
+ *nearestefa= efa;
mindist= dist;
}
}
@@ -579,32 +563,35 @@ static int nearest_uv_between(MTFace *tf, int nverts, int id, short *mval, int *
return (c1*c2 >= 0.0f);
}
-static void find_nearest_uv(MTFace **nearesttf, unsigned int *nearestv, int *nearestuv)
+void find_nearest_uv(MTFace **nearesttf, EditFace **nearestefa, unsigned int *nearestv, int *nearestuv)
{
- Mesh *me;
+ EditMesh *em= G.editMesh;
+ EditFace *efa;
MTFace *tf;
- MFace *mf;
- int a, i, nverts, mindist, dist, uval[2];
+ int i, nverts, mindist, dist, uval[2];
short mval[2];
getmouseco_areawin(mval);
mindist= 0x7FFFFFF;
- *nearesttf= NULL;
-
- me= get_mesh(OBACT);
- mf= (MFace*)me->mface;
- tf= (MTFace*)me->mtface;
-
- for(a=me->totface; a>0; a--, tf++, mf++) {
- if(mf->flag & ME_FACE_SEL) {
-
- nverts= mf->v4? 4: 3;
+ if (nearesttf) *nearesttf= NULL;
+ if (nearestefa) *nearestefa= NULL;
+
+ if (nearestv) {
+ EditVert *ev;
+ for (i=0, ev=em->verts.first; ev; ev = ev->next, i++)
+ ev->tmp.l = i;
+ }
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
uvco_to_areaco_noclip(tf->uv[i], uval);
dist= abs(mval[0]-uval[0]) + abs(mval[1]-uval[1]);
- if(tf->flag & TF_SEL_MASK(i))
+ if (simaUVSel_Check(efa, tf, i))
dist += 5;
if(dist<=mindist) {
@@ -612,15 +599,17 @@ static void find_nearest_uv(MTFace **nearesttf, unsigned int *nearestv, int *nea
if (!nearest_uv_between(tf, nverts, i, mval, uval))
continue;
- mindist= dist;
-
- *nearesttf= tf;
+ mindist= dist;
*nearestuv= i;
-
- if (i==0) *nearestv= mf->v1;
- else if (i==1) *nearestv= mf->v2;
- else if (i==2) *nearestv= mf->v3;
- else *nearestv= mf->v4;
+
+ if (nearesttf) *nearesttf= tf;
+ if (nearestefa) *nearestefa= efa;
+ if (nearestv) {
+ if (i==0) *nearestv= efa->v1->tmp.l;
+ else if (i==1) *nearestv= efa->v2->tmp.l;
+ else if (i==2) *nearestv= efa->v3->tmp.l;
+ else *nearestv= efa->v4->tmp.l;
+ }
}
}
}
@@ -629,46 +618,69 @@ static void find_nearest_uv(MTFace **nearesttf, unsigned int *nearestv, int *nea
void mouse_select_sima(void)
{
- Mesh *me;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
MTFace *tf, *nearesttf;
- MFace *mf, *nearestmf=NULL;
- int a, selectsticky, sticky, actface, nearestuv, i;
+ EditFace *nearestefa=NULL;
+ int a, selectsticky, actface, nearestuv, i;
+ char sticky= 0;
+ short flush = 0; /* 0 == dont flush, 1 == sel, -1 == desel; only use when selection sync is enabled */
unsigned int hitv[4], nearestv;
float *hituv[4], limit[2];
if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
get_connected_limit_tface_uv(limit);
- actface= (G.qual & LR_ALTKEY || G.sima->flag & SI_SELACTFACE);
-
- if(G.qual & LR_CTRLKEY) {
- if(G.sima->flag & SI_STICKYUVS) sticky= 0;
- else sticky= 1;
- }
- else {
- if(G.sima->flag & SI_STICKYUVS) sticky= 1;
- else if(G.sima->flag & SI_LOCALSTICKY) sticky= 2;
- else sticky= 0;
+
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ /* copy from mesh */
+ if (G.scene->selectmode == SCE_SELECT_FACE) {
+ actface= 1;
+ sticky= 0;
+ } else {
+ actface= (G.qual & LR_ALTKEY || G.sima->flag & SI_SELACTFACE);
+ sticky= 2;
+ }
+ } else {
+ /* normal operation */
+ actface= (G.qual & LR_ALTKEY || G.sima->flag & SI_SELACTFACE);
+
+ switch(G.sima->sticky) {
+ case SI_STICKY_LOC:
+ sticky=2;
+ break;
+ case SI_STICKY_DISABLE:
+ sticky=0;
+ break;
+ case SI_STICKY_VERTEX:
+ if(G.qual & LR_CTRLKEY) {
+ sticky=0;
+ } else {
+ sticky=1;
+ }
+ break;
+ }
}
if(actface) {
- find_nearest_tface(&nearesttf, &nearestmf);
+ find_nearest_tface(&nearesttf, &nearestefa);
if(nearesttf==NULL)
return;
-
- nearesttf->flag |= TF_ACTIVE;
+
+ EM_set_actFace(nearestefa);
for (i=0; i<4; i++)
hituv[i]= nearesttf->uv[i];
- hitv[0]= nearestmf->v1;
- hitv[1]= nearestmf->v2;
- hitv[2]= nearestmf->v3;
- hitv[3]= nearestmf->v4? nearestmf->v4: 0xFFFFFFFF;
+ hitv[0]= nearestefa->v1->tmp.l;
+ hitv[1]= nearestefa->v2->tmp.l;
+ hitv[2]= nearestefa->v3->tmp.l;
+
+ if (nearestefa->v4) hitv[3]= nearestefa->v4->tmp.l;
+ else hitv[3]= 0xFFFFFFFF;
}
else {
- find_nearest_uv(&nearesttf, &nearestv, &nearestuv);
+ find_nearest_uv(&nearesttf, &nearestefa, &nearestv, &nearestuv);
if(nearesttf==NULL)
return;
@@ -683,130 +695,149 @@ void mouse_select_sima(void)
if(G.qual & LR_SHIFTKEY) {
/* (de)select face */
if(actface) {
- if(!(~nearesttf->flag & (TF_SEL1|TF_SEL2|TF_SEL3))
- && (!nearestmf->v4 || nearesttf->flag & TF_SEL4)) {
- nearesttf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+ if(simaFaceSel_Check(nearestefa, nearesttf)) {
+ simaFaceSel_UnSet(nearestefa, nearesttf);
selectsticky= 0;
}
else {
- nearesttf->flag |= TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4;
+ simaFaceSel_Set(nearestefa, nearesttf);
selectsticky= 1;
}
+ flush = -1;
}
/* (de)select uv node */
else {
- if(nearesttf->flag & TF_SEL_MASK(nearestuv)) {
- nearesttf->flag &= ~TF_SEL_MASK(nearestuv);
+ if (simaUVSel_Check(nearestefa, nearesttf, nearestuv)) {
+ simaUVSel_UnSet(nearestefa, nearesttf, nearestuv);
selectsticky= 0;
}
else {
- nearesttf->flag |= TF_SEL_MASK(nearestuv);
+ simaUVSel_Set(nearestefa, nearesttf, nearestuv);
selectsticky= 1;
}
+ flush = 1;
}
/* (de)select sticky uv nodes */
if(sticky || actface) {
- mf= (MFace*)me->mface;
- tf= (MTFace*)me->mtface;
+ EditVert *ev;
+
+ for (a=0, ev=em->verts.first; ev; ev = ev->next, a++)
+ ev->tmp.l = a;
+
/* deselect */
if(selectsticky==0) {
- for(a=me->totface; a>0; a--, tf++, mf++) {
- if(!(mf->flag & ME_FACE_SEL)) continue;
- if(nearesttf && tf!=nearesttf) tf->flag &=~ TF_ACTIVE;
- if (!sticky) continue;
-
- if(msel_hit(limit, hitv, mf->v1, hituv, tf->uv[0], sticky))
- tf->flag &= ~TF_SEL1;
- if(msel_hit(limit, hitv, mf->v2, hituv, tf->uv[1], sticky))
- tf->flag &= ~TF_SEL2;
- if(msel_hit(limit, hitv, mf->v3, hituv, tf->uv[2], sticky))
- tf->flag &= ~TF_SEL3;
- if (mf->v4)
- if(msel_hit(limit, hitv, mf->v4, hituv, tf->uv[3], sticky))
- tf->flag &= ~TF_SEL4;
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ /*if(nearesttf && tf!=nearesttf) tf->flag &=~ TF_ACTIVE;*/ /* TODO - deal with editmesh active face */
+ if (!sticky) continue;
+
+ if(msel_hit(limit, hitv, efa->v1->tmp.l, hituv, tf->uv[0], sticky))
+ simaUVSel_UnSet(efa, tf, 0);
+ if(msel_hit(limit, hitv, efa->v2->tmp.l, hituv, tf->uv[1], sticky))
+ simaUVSel_UnSet(efa, tf, 1);
+ if(msel_hit(limit, hitv, efa->v3->tmp.l, hituv, tf->uv[2], sticky))
+ simaUVSel_UnSet(efa, tf, 2);
+ if (efa->v4)
+ if(msel_hit(limit, hitv, efa->v4->tmp.l, hituv, tf->uv[3], sticky))
+ simaUVSel_UnSet(efa, tf, 3);
+ }
}
+ flush = -1;
}
/* select */
else {
- for(a=me->totface; a>0; a--, tf++, mf++) {
- if(!(mf->flag & ME_FACE_SEL)) continue;
- if(nearesttf && tf!=nearesttf)
- tf->flag &=~ TF_ACTIVE;
- if (!sticky) continue;
-
- if(msel_hit(limit, hitv, mf->v1, hituv, tf->uv[0], sticky))
- tf->flag |= TF_SEL1;
- if(msel_hit(limit, hitv, mf->v2, hituv, tf->uv[1], sticky))
- tf->flag |= TF_SEL2;
- if(msel_hit(limit, hitv, mf->v3, hituv, tf->uv[2], sticky))
- tf->flag |= TF_SEL3;
- if (mf->v4)
- if(msel_hit(limit, hitv, mf->v4, hituv, tf->uv[3], sticky))
- tf->flag |= TF_SEL4;
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ if (!sticky) continue;
+ if(msel_hit(limit, hitv, efa->v1->tmp.l, hituv, tf->uv[0], sticky))
+ simaUVSel_Set(efa, tf, 0);
+ if(msel_hit(limit, hitv, efa->v2->tmp.l, hituv, tf->uv[1], sticky))
+ simaUVSel_Set(efa, tf, 1);
+ if(msel_hit(limit, hitv, efa->v3->tmp.l, hituv, tf->uv[2], sticky))
+ simaUVSel_Set(efa, tf, 2);
+ if (efa->v4)
+ if(msel_hit(limit, hitv, efa->v4->tmp.l, hituv, tf->uv[3], sticky))
+ simaUVSel_Set(efa, tf, 3);
+ }
}
- }
+ EM_set_actFace(nearestefa);
+ flush = 1;
+ }
}
}
else {
/* select face and deselect other faces */
if(actface) {
- mf= (MFace*)me->mface;
- tf= (MTFace*)me->mtface;
- for(a=me->totface; a>0; a--, tf++, mf++) {
- tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
- if(nearesttf && tf!=nearesttf)
- tf->flag &= ~TF_ACTIVE;
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ simaFaceSel_UnSet(efa, tf);
+ }
+ if(nearesttf) {
+ simaFaceSel_Set(nearestefa, nearesttf);
+ EM_set_actFace(nearestefa);
}
- if(nearesttf)
- nearesttf->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+
}
/* deselect uvs, and select sticky uvs */
- mf= (MFace*)me->mface;
- tf= (MTFace*)me->mtface;
- for(a=me->totface; a>0; a--, tf++, mf++) {
- if(mf->flag & ME_FACE_SEL) {
- if(!actface) tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ if(!actface) simaFaceSel_UnSet(efa, tf);
if(!sticky) continue;
- if(msel_hit(limit, hitv, mf->v1, hituv, tf->uv[0], sticky))
- tf->flag |= TF_SEL1;
- if(msel_hit(limit, hitv, mf->v2, hituv, tf->uv[1], sticky))
- tf->flag |= TF_SEL2;
- if(msel_hit(limit, hitv, mf->v3, hituv, tf->uv[2], sticky))
- tf->flag |= TF_SEL3;
- if(mf->v4)
- if(msel_hit(limit, hitv, mf->v4, hituv, tf->uv[3], sticky))
- tf->flag |= TF_SEL4;
+ if(msel_hit(limit, hitv, efa->v1->tmp.l, hituv, tf->uv[0], sticky))
+ simaUVSel_Set(efa, tf, 0);
+ if(msel_hit(limit, hitv, efa->v2->tmp.l, hituv, tf->uv[1], sticky))
+ simaUVSel_Set(efa, tf, 1);
+ if(msel_hit(limit, hitv, efa->v3->tmp.l, hituv, tf->uv[2], sticky))
+ simaUVSel_Set(efa, tf, 2);
+ if(efa->v4)
+ if(msel_hit(limit, hitv, efa->v4->tmp.l, hituv, tf->uv[3], sticky))
+ simaUVSel_Set(efa, tf, 3);
+ flush= 1;
}
}
- if(!actface)
- nearesttf->flag |= TF_SEL_MASK(nearestuv);
+ if(!actface) {
+ simaUVSel_Set(nearestefa, nearesttf, nearestuv);
+ flush= 1;
+ }
}
force_draw(1);
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ /* flush for mesh selection */
+ if (G.scene->selectmode != SCE_SELECT_FACE) {
+ if (flush==1) EM_select_flush();
+ else if (flush==-1) EM_deselect_flush();
+ }
+ allqueue(REDRAWVIEW3D, 0); /* mesh selection has changed */
+ }
+
BIF_undo_push("Select UV");
rightmouse_transform();
}
void borderselect_sima(short whichuvs)
{
- Mesh *me;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
MTFace *tface;
- MFace *mface;
rcti rect;
rctf rectf;
- int a, val;
- short mval[2];
+ int val, ok = 1;
+ short mval[2], select;
- if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
+ if( is_uv_tface_editing_allowed()==0) return;
val= get_border(&rect, 3);
-
+ select = (val==LEFTMOUSE) ? 1 : 0;
+
if(val) {
mval[0]= rect.xmin;
mval[1]= rect.ymin;
@@ -814,62 +845,325 @@ void borderselect_sima(short whichuvs)
mval[0]= rect.xmax;
mval[1]= rect.ymax;
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
-
- mface= me->mface;
- for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
-
- if (whichuvs == UV_SELECT_ALL) {
-
- if(BLI_in_rctf(&rectf, (float)tface->uv[0][0], (float)tface->uv[0][1])) {
- if(val==LEFTMOUSE) tface->flag |= TF_SEL1;
- else tface->flag &= ~TF_SEL1;
- }
- if(BLI_in_rctf(&rectf, (float)tface->uv[1][0], (float)tface->uv[1][1])) {
- if(val==LEFTMOUSE) tface->flag |= TF_SEL2;
- else tface->flag &= ~TF_SEL2;
- }
- if(BLI_in_rctf(&rectf, (float)tface->uv[2][0], (float)tface->uv[2][1])) {
- if(val==LEFTMOUSE) tface->flag |= TF_SEL3;
- else tface->flag &= ~TF_SEL3;
- }
- if(mface->v4 && BLI_in_rctf(&rectf, (float)tface->uv[3][0], (float)tface->uv[3][1])) {
- if(val==LEFTMOUSE) tface->flag |= TF_SEL4;
- else tface->flag &= ~TF_SEL4;
- }
- } else if (whichuvs == UV_SELECT_PINNED) {
- if ((tface->unwrap & TF_PIN1) &&
- BLI_in_rctf(&rectf, (float)tface->uv[0][0], (float)tface->uv[0][1])) {
-
- if(val==LEFTMOUSE) tface->flag |= TF_SEL1;
- else tface->flag &= ~TF_SEL1;
- }
- if ((tface->unwrap & TF_PIN2) &&
- BLI_in_rctf(&rectf, (float)tface->uv[1][0], (float)tface->uv[1][1])) {
-
- if(val==LEFTMOUSE) tface->flag |= TF_SEL2;
- else tface->flag &= ~TF_SEL2;
- }
- if ((tface->unwrap & TF_PIN3) &&
- BLI_in_rctf(&rectf, (float)tface->uv[2][0], (float)tface->uv[2][1])) {
-
- if(val==LEFTMOUSE) tface->flag |= TF_SEL3;
- else tface->flag &= ~TF_SEL3;
- }
- if ((mface->v4) && (tface->unwrap & TF_PIN4) && BLI_in_rctf(&rectf, (float)tface->uv[3][0], (float)tface->uv[3][1])) {
- if(val==LEFTMOUSE) tface->flag |= TF_SEL4;
- else tface->flag &= ~TF_SEL4;
+ if (draw_uvs_face_check() && whichuvs != UV_SELECT_PINNED) {
+ float cent[2];
+ ok = 0;
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ /* assume not touched */
+ efa->tmp.l = 0;
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ tface_center(tface, cent, (void *)efa->v4);
+ if(BLI_in_rctf(&rectf, cent[0], cent[1])) {
+ efa->tmp.l = ok = 1;
}
}
}
+ /* (de)selects all tagged faces and deals with sticky modes */
+ if (ok)
+ uvface_setsel__internal(select);
+ } else {
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (whichuvs == UV_SELECT_ALL || (G.sima->flag & SI_SYNC_UVSEL) ) {
+ /* SI_SYNC_UVSEL - cant do pinned selection */
+ if(BLI_in_rctf(&rectf, tface->uv[0][0], tface->uv[0][1])) {
+ if(select) simaUVSel_Set(efa, tface, 0);
+ else simaUVSel_UnSet(efa, tface, 0);
+ }
+ if(BLI_in_rctf(&rectf, tface->uv[1][0], tface->uv[1][1])) {
+ if(select) simaUVSel_Set(efa, tface, 1);
+ else simaUVSel_UnSet(efa, tface, 1);
+ }
+ if(BLI_in_rctf(&rectf, tface->uv[2][0], tface->uv[2][1])) {
+ if(select) simaUVSel_Set(efa, tface, 2);
+ else simaUVSel_UnSet(efa, tface, 2);
+ }
+ if(efa->v4 && BLI_in_rctf(&rectf, tface->uv[3][0], tface->uv[3][1])) {
+ if(select) simaUVSel_Set(efa, tface, 3);
+ else simaUVSel_UnSet(efa, tface, 3);
+ }
+ } else if (whichuvs == UV_SELECT_PINNED) {
+ if ((tface->unwrap & TF_PIN1) &&
+ BLI_in_rctf(&rectf, tface->uv[0][0], tface->uv[0][1])) {
+ if(select) simaUVSel_Set(efa, tface, 0);
+ else simaUVSel_UnSet(efa, tface, 0);
+ }
+ if ((tface->unwrap & TF_PIN2) &&
+ BLI_in_rctf(&rectf, tface->uv[1][0], tface->uv[1][1])) {
+
+ if(select) simaUVSel_Set(efa, tface, 1);
+ else simaUVSel_UnSet(efa, tface, 1);
+ }
+ if ((tface->unwrap & TF_PIN3) &&
+ BLI_in_rctf(&rectf, tface->uv[2][0], tface->uv[2][1])) {
+
+ if(select) simaUVSel_Set(efa, tface, 2);
+ else simaUVSel_UnSet(efa, tface, 2);
+ }
+ if ((efa->v4) && (tface->unwrap & TF_PIN4) && BLI_in_rctf(&rectf, tface->uv[3][0], tface->uv[3][1])) {
+ if(select) simaUVSel_Set(efa, tface, 3);
+ else simaUVSel_UnSet(efa, tface, 3);
+ }
+ }
+ }
+ }
+ }
+ if (ok) {
+ /* make sure newly selected vert selection is updated*/
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ if (G.scene->selectmode != SCE_SELECT_FACE) {
+ if (select) EM_select_flush();
+ else EM_deselect_flush();
+ }
+ }
+ allqueue(REDRAWVIEW3D, 0); /* mesh selection has changed */
+
+ BIF_undo_push("Border select UV");
+ scrarea_queue_winredraw(curarea);
+ }
+ }
+}
+
+int snap_uv_sel_to_curs(void)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ MTFace *tface;
+ short change = 0;
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0)) VECCOPY2D(tface->uv[0], G.v2d->cursor);
+ if (simaUVSel_Check(efa, tface, 1)) VECCOPY2D(tface->uv[1], G.v2d->cursor);
+ if (simaUVSel_Check(efa, tface, 2)) VECCOPY2D(tface->uv[2], G.v2d->cursor);
+ if (efa->v4)
+ if (simaUVSel_Check(efa, tface, 3)) VECCOPY2D(tface->uv[3], G.v2d->cursor);
+ change = 1;
}
- BIF_undo_push("Border select UV");
- scrarea_queue_winredraw(curarea);
}
+ return change;
}
+int snap_uv_sel_to_adj_unsel(void)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ EditVert *eve;
+ MTFace *tface;
+ short change = 0;
+ int count = 0;
+ float *coords;
+ short *usercount, users;
+
+ /* set all verts to -1 : an unused index*/
+ for (eve= em->verts.first; eve; eve= eve->next)
+ eve->tmp.l=-1;
+
+ /* index every vert that has a selected UV using it, but only once so as to
+ * get unique indicies and to count how much to malloc */
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0) && efa->v1->tmp.l==-1) efa->v1->tmp.l= count++;
+ if (simaUVSel_Check(efa, tface, 1) && efa->v2->tmp.l==-1) efa->v2->tmp.l= count++;
+ if (simaUVSel_Check(efa, tface, 2) && efa->v3->tmp.l==-1) efa->v3->tmp.l= count++;
+ if (efa->v4)
+ if (simaUVSel_Check(efa, tface, 3) && efa->v4->tmp.l==-1) efa->v4->tmp.l= count++;
+ change = 1;
+
+ /* optional speedup */
+ efa->tmp.p = tface;
+ } else {
+ efa->tmp.p = NULL;
+ }
+ }
+
+ coords = MEM_callocN(sizeof(float)*count*2, "snap to adjacent coords");
+ usercount = MEM_callocN(sizeof(short)*count, "snap to adjacent counts");
+
+ /* add all UV coords from visible, unselected UV coords as well as counting them to average later */
+ for (efa= em->faces.first; efa; efa= efa->next) {
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+ if ((tface=(MTFace *)efa->tmp.p)) {
+
+ /* is this an unselected UV we can snap to? */
+ if (efa->v1->tmp.l >= 0 && (!simaUVSel_Check(efa, tface, 0))) {
+ coords[efa->v1->tmp.l*2] += tface->uv[0][0];
+ coords[(efa->v1->tmp.l*2)+1] += tface->uv[0][1];
+ usercount[efa->v1->tmp.l]++;
+ change = 1;
+ }
+ if (efa->v2->tmp.l >= 0 && (!simaUVSel_Check(efa, tface, 1))) {
+ coords[efa->v2->tmp.l*2] += tface->uv[1][0];
+ coords[(efa->v2->tmp.l*2)+1] += tface->uv[1][1];
+ usercount[efa->v2->tmp.l]++;
+ change = 1;
+ }
+ if (efa->v3->tmp.l >= 0 && (!simaUVSel_Check(efa, tface, 2))) {
+ coords[efa->v3->tmp.l*2] += tface->uv[2][0];
+ coords[(efa->v3->tmp.l*2)+1] += tface->uv[2][1];
+ usercount[efa->v3->tmp.l]++;
+ change = 1;
+ }
+
+ if (efa->v4) {
+ if (efa->v4->tmp.l >= 0 && (!simaUVSel_Check(efa, tface, 3))) {
+ coords[efa->v4->tmp.l*2] += tface->uv[3][0];
+ coords[(efa->v4->tmp.l*2)+1] += tface->uv[3][1];
+ usercount[efa->v4->tmp.l]++;
+ change = 1;
+ }
+ }
+ }
+ }
+
+ /* no other verts selected, bail out */
+ if (!change) {
+ MEM_freeN(coords);
+ MEM_freeN(usercount);
+ return change;
+ }
+
+ /* copy the averaged unselected UVs back to the selected UVs */
+ for (efa= em->faces.first; efa; efa= efa->next) {
+// tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+// if (simaFaceDraw_Check(efa, tface)) {
+ if ((tface=(MTFace *)efa->tmp.p)) {
+
+ if ( simaUVSel_Check(efa, tface, 0) &&
+ efa->v1->tmp.l >= 0 &&
+ (users = usercount[efa->v1->tmp.l])
+ ) {
+ tface->uv[0][0] = coords[efa->v1->tmp.l*2] / users;
+ tface->uv[0][1] = coords[(efa->v1->tmp.l*2)+1] / users;
+ }
+
+ if ( simaUVSel_Check(efa, tface, 1) &&
+ efa->v2->tmp.l >= 0 &&
+ (users = usercount[efa->v2->tmp.l])
+ ) {
+ tface->uv[1][0] = coords[efa->v2->tmp.l*2] / users;
+ tface->uv[1][1] = coords[(efa->v2->tmp.l*2)+1] / users;
+ }
+
+ if ( simaUVSel_Check(efa, tface, 2) &&
+ efa->v3->tmp.l >= 0 &&
+ (users = usercount[efa->v3->tmp.l])
+ ) {
+ tface->uv[2][0] = coords[efa->v3->tmp.l*2] / users;
+ tface->uv[2][1] = coords[(efa->v3->tmp.l*2)+1] / users;
+ }
+
+ if (efa->v4) {
+ if ( simaUVSel_Check(efa, tface, 3) &&
+ efa->v4->tmp.l >= 0 &&
+ (users = usercount[efa->v4->tmp.l])
+ ) {
+ tface->uv[3][0] = coords[efa->v4->tmp.l*2] / users;
+ tface->uv[3][1] = coords[(efa->v4->tmp.l*2)+1] / users;
+ }
+ }
+ }
+ }
+
+ MEM_freeN(coords);
+ MEM_freeN(usercount);
+ return change;
+}
+
+void snap_coord_to_pixel(float *uvco, float w, float h)
+{
+ uvco[0] = ((float) ((int)((uvco[0]*w) + 0.5))) / w;
+ uvco[1] = ((float) ((int)((uvco[1]*h) + 0.5))) / h;
+}
+
+int snap_uv_sel_to_pixels(void) /* warning, sanity checks must alredy be done */
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ MTFace *tface;
+ int wi, hi;
+ float w, h;
+ short change = 0;
+
+ transform_width_height_tface_uv(&wi, &hi);
+ w = (float)wi;
+ h = (float)hi;
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (simaUVSel_Check(efa, tface, 0)) snap_coord_to_pixel(tface->uv[0], w, h);
+ if (simaUVSel_Check(efa, tface, 1)) snap_coord_to_pixel(tface->uv[1], w, h);
+ if (simaUVSel_Check(efa, tface, 2)) snap_coord_to_pixel(tface->uv[2], w, h);
+ if (efa->v4)
+ if (simaUVSel_Check(efa, tface, 3)) snap_coord_to_pixel(tface->uv[3], w, h);
+ change = 1;
+ }
+ }
+ return change;
+}
+
+void snap_uv_curs_to_pixels(void)
+{
+ int wi, hi;
+ float w, h;
+
+ transform_width_height_tface_uv(&wi, &hi);
+ w = (float)wi;
+ h = (float)hi;
+ snap_coord_to_pixel(G.v2d->cursor, w, h);
+}
+
+int snap_uv_curs_to_sel(void)
+{
+ if( is_uv_tface_editing_allowed()==0 ) return 0;
+ return cent_tface_uv(G.v2d->cursor, 0);
+}
+
+void snap_menu_sima(void)
+{
+ short event;
+ if( is_uv_tface_editing_allowed()==0 || !G.v2d) return; /* !G.v2d should never happen */
+
+ event = pupmenu("Snap %t|Selection -> Pixels%x1|Selection -> Cursor%x2|Selection -> Adjacent Unselected%x3|Cursor -> Pixel%x4|Cursor -> Selection%x5");
+ switch (event) {
+ case 1:
+ if (snap_uv_sel_to_pixels()) {
+ BIF_undo_push("Snap UV Selection to Pixels");
+ object_uvs_changed(OBACT);
+ }
+ break;
+ case 2:
+ if (snap_uv_sel_to_curs()) {
+ BIF_undo_push("Snap UV Selection to Cursor");
+ object_uvs_changed(OBACT);
+ }
+ break;
+ case 3:
+ if (snap_uv_sel_to_adj_unsel()) {
+ BIF_undo_push("Snap UV Selection to Cursor");
+ object_uvs_changed(OBACT);
+ }
+ break;
+ case 4:
+ snap_uv_curs_to_pixels();
+ scrarea_queue_winredraw(curarea);
+ break;
+ case 5:
+ if (snap_uv_curs_to_sel())
+ allqueue(REDRAWIMAGE, 0);
+ break;
+ }
+}
+
+
/** This is an ugly function to set the Tface selection flags depending
* on whether its UV coordinates are inside the normalized
* area with radius rad and offset offset. These coordinates must be
@@ -877,7 +1171,7 @@ void borderselect_sima(short whichuvs)
* Just for readability...
*/
-void sel_uvco_inside_radius(short sel, MTFace *tface, int index, float *offset, float *ell, short select_mask)
+void sel_uvco_inside_radius(short sel, EditFace *efa, MTFace *tface, int index, float *offset, float *ell, short select_index)
{
// normalized ellipse: ell[0] = scaleX,
// [1] = scaleY
@@ -890,8 +1184,8 @@ void sel_uvco_inside_radius(short sel, MTFace *tface, int index, float *offset,
r2 = x * x + y * y;
if (r2 < 1.0) {
- if (sel == LEFTMOUSE) tface->flag |= select_mask;
- else tface->flag &= ~select_mask;
+ if (sel == LEFTMOUSE) simaUVSel_Set(efa, tface, select_index);
+ else simaUVSel_UnSet(efa, tface, select_index);
}
}
@@ -900,16 +1194,13 @@ void sel_uvco_inside_radius(short sel, MTFace *tface, int index, float *offset,
static void getSpaceImageDimension(SpaceImage *sima, float *xy)
{
ImBuf *ibuf= BKE_image_get_ibuf(sima->image, &sima->iuser);
- float z;
-
- z = sima->zoom;
if (ibuf) {
- xy[0] = ibuf->x * z;
- xy[1] = ibuf->y * z;
+ xy[0] = ibuf->x * sima->zoom;
+ xy[1] = ibuf->y * sima->zoom;
} else {
- xy[0] = 256 * z;
- xy[1] = 256 * z;
+ xy[0] = 256 * sima->zoom;
+ xy[1] = 256 * sima->zoom;
}
}
@@ -919,37 +1210,28 @@ static void getSpaceImageDimension(SpaceImage *sima, float *xy)
void uvedit_selectionCB(short selecting, Object *editobj, short *mval, float rad)
{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
float offset[2];
- Mesh *me;
- MFace *mface;
MTFace *tface;
- int i;
-
float ellipse[2]; // we need to deal with ellipses, as
// non square textures require for circle
// selection. this ellipse is normalized; r = 1.0
-
- me = get_mesh(editobj);
getSpaceImageDimension(curarea->spacedata.first, ellipse);
ellipse[0] /= rad;
ellipse[1] /= rad;
areamouseco_to_ipoco(G.v2d, mval, &offset[0], &offset[1]);
-
- mface= me->mface;
- tface= me->mtface;
-
+
if (selecting) {
- for(i = 0; i < me->totface; i++) {
- sel_uvco_inside_radius(selecting, tface, 0, offset, ellipse, TF_SEL1);
- sel_uvco_inside_radius(selecting, tface, 1, offset, ellipse, TF_SEL2);
- sel_uvco_inside_radius(selecting, tface, 2, offset, ellipse, TF_SEL3);
- if (mface->v4)
- sel_uvco_inside_radius(selecting, tface, 3, offset, ellipse, TF_SEL4);
-
- tface++; mface++;
-
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ sel_uvco_inside_radius(selecting, efa, tface, 0, offset, ellipse, 0);
+ sel_uvco_inside_radius(selecting, efa, tface, 1, offset, ellipse, 1);
+ sel_uvco_inside_radius(selecting, efa, tface, 2, offset, ellipse, 2);
+ if (efa->v4)
+ sel_uvco_inside_radius(selecting, efa, tface, 3, offset, ellipse, 3);
}
if(G.f & G_DRAWFACES) { /* full redraw only if necessary */
@@ -958,11 +1240,18 @@ void uvedit_selectionCB(short selecting, Object *editobj, short *mval, float rad
}
else { /* force_draw() is no good here... */
glDrawBuffer(GL_FRONT);
- draw_tfaces();
+ draw_uvs_sima();
bglFlush();
glDrawBuffer(GL_BACK);
}
- }
+
+
+ if (selecting == LEFTMOUSE) EM_select_flush();
+ else EM_deselect_flush();
+
+ if (G.sima->lock && (G.sima->flag & SI_SYNC_UVSEL))
+ force_draw_plus(SPACE_VIEW3D, 0);
+ }
}
@@ -1001,95 +1290,46 @@ void mouseco_to_curtile(void)
G.sima->flag &= ~SI_EDITTILE;
- image_changed(G.sima, 1);
+ image_set_tile(G.sima, 2);
allqueue(REDRAWVIEW3D, 0);
scrarea_queue_winredraw(curarea);
}
}
-void hide_tface_uv(int swap)
+/* Could be used for other 2D views also */
+void mouseco_to_cursor_sima(void)
{
- Mesh *me;
- MTFace *tface;
- MFace *mface;
- int a;
-
- if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
-
- if(swap) {
- mface= me->mface;
- for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- if((tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))==0) {
- if(!mface->v4)
- mface->flag &= ~ME_FACE_SEL;
- else if(!(tface->flag & TF_SEL4))
- mface->flag &= ~ME_FACE_SEL;
- }
- }
- }
- } else {
- mface= me->mface;
- for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- if(tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3))
- mface->flag &= ~ME_FACE_SEL;
- else if(mface->v4 && tface->flag & TF_SEL4)
- mface->flag &= ~ME_FACE_SEL;
- }
- }
- }
-
- BIF_undo_push("Hide UV");
-
- object_tface_flags_changed(OBACT, 0);
-}
-
-void reveal_tface_uv(void)
-{
- Mesh *me;
- MTFace *tface;
- MFace *mface;
- int a;
-
- if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
-
- mface= me->mface;
- for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
- if(!(mface->flag & ME_HIDE)) {
- if(!(mface->flag & ME_FACE_SEL)) {
- mface->flag |= ME_FACE_SEL;
- tface->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
- }
- }
- }
-
- BIF_undo_push("Reveal UV");
-
- object_tface_flags_changed(OBACT, 0);
+ short mval[2];
+ getmouseco_areawin(mval);
+ areamouseco_to_ipoco(G.v2d, mval, &G.v2d->cursor[0], &G.v2d->cursor[1]);
+ scrarea_queue_winredraw(curarea);
}
-void stitch_uv_tface(int mode)
+void stitch_limit_uv_tface(void)
{
- Mesh *me;
MTFace *tf;
int a, vtot;
float newuv[2], limit[2];
- UvMapVert *vlist, *iterv, *v;
- UvVertMap *vmap;
+ UvMapVert *vlist, *iterv;
+ EditMesh *em = G.editMesh;
+ EditVert *ev;
+ EditFace *efa;
+
+ struct UvVertMap *vmap;
+
if(is_uv_tface_editing_allowed()==0)
return;
-
- limit[0]= limit[1]= 20.0;
- if(mode==1) {
- add_numbut(0, NUM|FLO, "Limit:", 0.1, 1000.0, &limit[0], NULL);
- if (!do_clever_numbuts("Stitch UVs", 1, REDRAW))
- return;
+ if(G.sima->flag & SI_SYNC_UVSEL) {
+ error("Can't stitch when Sync Mesh Selection is enabled");
+ return;
}
+
+ limit[0]= limit[1]= 20.0;
+ add_numbut(0, NUM|FLO, "Limit:", 0.1, 1000.0, &limit[0], NULL);
+ if (!do_clever_numbuts("Stitch UVs", 1, REDRAW))
+ return;
limit[0]= limit[1]= limit[0]/256.0;
if(G.sima->image) {
@@ -1101,27 +1341,28 @@ void stitch_uv_tface(int mode)
}
}
- me= get_mesh(OBACT);
- tf= me->mtface;
-
- vmap= make_uv_vert_map(me->mface, tf, me->totface, me->totvert, 1, limit);
+ /*vmap= make_uv_vert_map(me->mface, tf, me->totface, me->totvert, 1, limit);*/
+ EM_init_index_arrays(0, 0, 1);
+ vmap= make_uv_vert_map_EM(1, 0, limit);
if(vmap == NULL)
return;
- if(mode==0) {
- for(a=0; a<me->totvert; a++) {
- v = get_uv_map_vert(vmap, a);
-
- if(v == NULL)
- continue;
+ for(a=0, ev= em->verts.first; ev; a++, ev= ev->next) {
+ vlist= get_uv_map_vert_EM(vmap, a);
+ while(vlist) {
newuv[0]= 0; newuv[1]= 0;
vtot= 0;
- for(iterv=v; iterv; iterv=iterv->next) {
+ for(iterv=vlist; iterv; iterv=iterv->next) {
+ if((iterv != vlist) && iterv->separate)
+ break;
+ efa = EM_get_face_for_index(iterv->f);
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+
if (tf[iterv->f].flag & TF_SEL_MASK(iterv->tfindex)) {
- newuv[0] += tf[iterv->f].uv[iterv->tfindex][0];
- newuv[1] += tf[iterv->f].uv[iterv->tfindex][1];
+ newuv[0] += tf->uv[iterv->tfindex][0];
+ newuv[1] += tf->uv[iterv->tfindex][1];
vtot++;
}
}
@@ -1129,126 +1370,108 @@ void stitch_uv_tface(int mode)
if (vtot > 1) {
newuv[0] /= vtot; newuv[1] /= vtot;
- for(iterv=v; iterv; iterv=iterv->next) {
- if (tf[iterv->f].flag & TF_SEL_MASK(iterv->tfindex)) {
- tf[iterv->f].uv[iterv->tfindex][0]= newuv[0];
- tf[iterv->f].uv[iterv->tfindex][1]= newuv[1];
- }
- }
- }
- }
- } else if(mode==1) {
- for(a=0; a<me->totvert; a++) {
- vlist= get_uv_map_vert(vmap, a);
-
- while(vlist) {
- newuv[0]= 0; newuv[1]= 0;
- vtot= 0;
-
for(iterv=vlist; iterv; iterv=iterv->next) {
if((iterv != vlist) && iterv->separate)
break;
- if (tf[iterv->f].flag & TF_SEL_MASK(iterv->tfindex)) {
- newuv[0] += tf[iterv->f].uv[iterv->tfindex][0];
- newuv[1] += tf[iterv->f].uv[iterv->tfindex][1];
- vtot++;
+ efa = EM_get_face_for_index(iterv->f);
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (tf->flag & TF_SEL_MASK(iterv->tfindex)) {
+ tf->uv[iterv->tfindex][0]= newuv[0];
+ tf->uv[iterv->tfindex][1]= newuv[1];
}
}
-
- if (vtot > 1) {
- newuv[0] /= vtot; newuv[1] /= vtot;
-
- for(iterv=vlist; iterv; iterv=iterv->next) {
- if((iterv != vlist) && iterv->separate)
- break;
- if (tf[iterv->f].flag & TF_SEL_MASK(iterv->tfindex)) {
- tf[iterv->f].uv[iterv->tfindex][0]= newuv[0];
- tf[iterv->f].uv[iterv->tfindex][1]= newuv[1];
- }
- }
- }
-
- vlist= iterv;
}
+ vlist= iterv;
}
}
- free_uv_vert_map(vmap);
-
- if(G.sima->flag & SI_BE_SQUARE) be_square_tface_uv(me);
+ free_uv_vert_map_EM(vmap);
+ EM_free_index_arrays();
+
+ if(G.sima->flag & SI_BE_SQUARE) be_square_tface_uv(em);
BIF_undo_push("Stitch UV");
object_uvs_changed(OBACT);
}
-void select_linked_tface_uv(int mode)
+void select_linked_tface_uv(int mode) /* TODO */
{
- Mesh *me;
- MFace *mf;
+ EditMesh *em= G.editMesh;
+ EditFace *efa, *nearestefa=NULL;
MTFace *tf, *nearesttf=NULL;
UvVertMap *vmap;
UvMapVert *vlist, *iterv, *startv;
unsigned int *stack, stacksize= 0, nearestv;
char *flag;
- int a, nearestuv, i, nverts;
+ int a, nearestuv, i, nverts, j;
float limit[2];
-
if(is_uv_tface_editing_allowed()==0)
return;
- me= get_mesh(OBACT);
-
+ if(G.sima->flag & SI_SYNC_UVSEL) {
+ error("Can't select linked when Sync Mesh Selection is enabled");
+ return;
+ }
+
if (mode == 2) {
nearesttf= NULL;
nearestuv= 0;
}
if (mode!=2) {
- find_nearest_uv(&nearesttf, &nearestv, &nearestuv);
+ find_nearest_uv(&nearesttf, &nearestefa, &nearestv, &nearestuv);
if(nearesttf==NULL)
return;
}
get_connected_limit_tface_uv(limit);
- vmap= make_uv_vert_map(me->mface, me->mtface, me->totface, me->totvert, 1, limit);
+ vmap= make_uv_vert_map_EM(1, 1, limit);
if(vmap == NULL)
return;
- stack= MEM_mallocN(sizeof(*stack)*me->totface, "UvLinkStack");
- flag= MEM_callocN(sizeof(*flag)*me->totface, "UvLinkFlag");
+ stack= MEM_mallocN(sizeof(*stack)* BLI_countlist(&em->faces), "UvLinkStack");
+ flag= MEM_callocN(sizeof(*flag)*BLI_countlist(&em->faces), "UvLinkFlag");
if (mode == 2) {
- tf= me->mtface;
- mf= me->mface;
- for(a=0; a<me->totface; a++, tf++, mf++)
- if(!(mf->flag & ME_HIDE) && (mf->flag & ME_FACE_SEL))
+ for (a=0, efa= em->faces.first; efa; efa= efa->next, a++) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
if(tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)) {
stack[stacksize]= a;
stacksize++;
flag[a]= 1;
}
- }
- else {
- tf= me->mtface;
- for(a=0; a<me->totface; a++, tf++)
+ }
+ }
+ } else {
+ for (a=0, efa= em->faces.first; efa; efa= efa->next, a++) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(tf == nearesttf) {
stack[stacksize]= a;
stacksize++;
flag[a]= 1;
break;
}
+ }
}
while(stacksize > 0) {
stacksize--;
a= stack[stacksize];
- mf= me->mface+a;
- tf= me->mtface+a;
+
+ for (j=0, efa= em->faces.first; efa; efa= efa->next, j++) {
+ if (j==a) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ break;
+ }
+ }
- nverts= mf->v4? 4: 3;
+ nverts= efa->v4? 4: 3;
for(i=0; i<nverts; i++) {
- vlist= get_uv_map_vert(vmap, *(&mf->v1 + i));
+ /* make_uv_vert_map_EM sets verts tmp.l to the indicies */
+ vlist= get_uv_map_vert_EM(vmap, (*(&efa->v1 + i))->tmp.l);
+
startv= vlist;
for(iterv=vlist; iterv; iterv=iterv->next) {
@@ -1271,17 +1494,19 @@ void select_linked_tface_uv(int mode)
}
if(mode==0 || mode==2) {
- for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
+ for (a=0, efa= em->faces.first; efa; efa= efa->next, a++) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(flag[a])
tf->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
else
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+ }
}
else if(mode==1) {
- mf= me->mface;
- for(a=0, tf=me->mtface; a<me->totface; a++, tf++, mf++) {
+ for (a=0, efa= em->faces.first; efa; efa= efa->next, a++) {
if(flag[a]) {
- if (mf->v4) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (efa->v4) {
if((tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)))
break;
}
@@ -1290,21 +1515,27 @@ void select_linked_tface_uv(int mode)
}
}
- if (a<me->totface) {
- for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
- if(flag[a])
+ if (efa) {
+ for (a=0, efa= em->faces.first; efa; efa= efa->next, a++) {
+ if(flag[a]) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+ }
+ }
}
else {
- for(a=0, tf=me->mtface; a<me->totface; a++, tf++)
- if(flag[a])
+ for (a=0, efa= em->faces.first; efa; efa= efa->next, a++) {
+ if(flag[a]) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
tf->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+ }
+ }
}
}
MEM_freeN(stack);
MEM_freeN(flag);
- free_uv_vert_map(vmap);
+ free_uv_vert_map_EM(vmap);
BIF_undo_push("Select linked UV");
scrarea_queue_winredraw(curarea);
@@ -1312,18 +1543,21 @@ void select_linked_tface_uv(int mode)
void unlink_selection(void)
{
- Mesh *me;
+ EditMesh *em= G.editMesh;
+ EditFace *efa;
MTFace *tface;
- MFace *mface;
- int a;
if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
- mface= me->mface;
- for(a=me->totface, tface= me->mtface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- if(mface->v4) {
+ if(G.sima->flag & SI_SYNC_UVSEL) {
+ error("Can't select unlinked when Sync Mesh Selection is enabled");
+ return;
+ }
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if(efa->v4) {
if(~tface->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4))
tface->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
} else {
@@ -1337,56 +1571,173 @@ void unlink_selection(void)
scrarea_queue_winredraw(curarea);
}
-void toggle_uv_select(int mode)
-{
- switch(mode){
- case 'f':
- G.sima->flag ^= SI_SELACTFACE;
- break;
- case 's':
- G.sima->flag ^= SI_STICKYUVS;
- if (G.sima->flag & SI_STICKYUVS) G.sima->flag &= ~SI_LOCALSTICKY;
- else G.sima->flag |= SI_LOCALSTICKY;
- break;
- case 'l':
- G.sima->flag ^= SI_LOCALSTICKY;
- if (G.sima->flag & SI_LOCALSTICKY) G.sima->flag &= ~SI_STICKYUVS;
- break;
- case 'o':
- G.sima->flag &= ~SI_STICKYUVS;
- G.sima->flag &= ~SI_LOCALSTICKY;
- break;
+/* this function sets the selection on tagged faces
+ * This is needed because setting the selection on a face is done in
+ * a number of places but it also needs to respect the sticky modes
+ * for the UV verts - dealing with the sticky modes is best done in a seperate function
+ *
+ * de-selects faces that have been tagged on efa->tmp.l
+ */
+void uvface_setsel__internal(short select)
+{
+
+ /* All functions calling this should call
+ * draw_uvs_face_check()
+ */
+
+
+ /* selecting UV Faces with some modes requires us to change
+ * the selection in other faces (depending on the stickt mode)
+ *
+ * This only needs to be done when the Mesh is not used for selection
+ * (So for sticky modes - vertex or location based)
+ * */
+
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ MTFace *tf;
+ int nverts, i;
+
+ if ((G.sima->flag & SI_SYNC_UVSEL)==0 && G.sima->sticky == SI_STICKY_VERTEX) {
+ /* tag all verts as untouched,
+ * then touch the ones that have a face center in the loop
+ * and select all MTFace UV's that use a touched vert */
+
+ EditVert *eve;
+
+ for (eve= em->verts.first; eve; eve= eve->next)
+ eve->tmp.l = 0;
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->tmp.l) {
+ if (efa->v4) {
+ efa->v1->tmp.l= efa->v2->tmp.l= efa->v3->tmp.l= efa->v4->tmp.l=1;
+ } else {
+ efa->v1->tmp.l= efa->v2->tmp.l= efa->v3->tmp.l= 1;
+ }
+ }
+ }
+ /* now select tagged verts */
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ nverts= efa->v4? 4: 3;
+ for(i=0; i<nverts; i++) {
+ if ((*(&efa->v1 + i))->tmp.l) {
+ if (select) {
+ simaUVSel_Set(efa, tf, i);
+ } else {
+ simaUVSel_UnSet(efa, tf, i);
+ }
+ }
+ }
+ }
+ } else if ((G.sima->flag & SI_SYNC_UVSEL)==0 && G.sima->sticky == SI_STICKY_LOC) {
+ EditFace *efa_vlist;
+ MTFace *tf_vlist;
+ UvMapVert *vlist, *start_vlist=NULL, *vlist_iter;
+ struct UvVertMap *vmap;
+ float limit[2];
+ int efa_index;
+ //EditVert *eve; /* removed vert counting for now */
+ //int a;
+
+ get_connected_limit_tface_uv(limit);
+
+ EM_init_index_arrays(0, 0, 1);
+ vmap= make_uv_vert_map_EM(0, 0, limit);
+
+ /* verts are numbered above in make_uv_vert_map_EM, make sure this stays true! */
+ /*for (a=0, eve= em->verts.first; eve; a++, eve= eve->next)
+ eve->tmp.l = a; */
+
+ if(vmap == NULL)
+ return;
+
+ for (efa_index=0, efa= em->faces.first; efa; efa_index++, efa= efa->next) {
+ if (efa->tmp.l) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ nverts= efa->v4? 4: 3;
+ for(i=0; i<nverts; i++) {
+ if (select) {
+ simaUVSel_Set(efa, tf, i);
+ } else {
+ simaUVSel_UnSet(efa, tf, i);
+ }
+
+ vlist= vlist_iter= get_uv_map_vert_EM(vmap, (*(&efa->v1 + i))->tmp.l);
+
+ while (vlist_iter) {
+ if (vlist_iter->separate)
+ start_vlist = vlist_iter;
+
+ if (efa_index == vlist_iter->f) {
+ break;
+ }
+ vlist_iter = vlist_iter->next;
+ }
+
+ vlist_iter = start_vlist;
+ while (vlist_iter) {
+
+ if (vlist_iter != start_vlist && vlist_iter->separate)
+ break;
+
+ if (efa_index != vlist_iter->f) {
+ efa_vlist = EM_get_face_for_index(vlist_iter->f);
+ tf_vlist = CustomData_em_get(&em->fdata, efa_vlist->data, CD_MTFACE);
+
+ if (select) {
+ simaUVSel_Set(efa_vlist, tf_vlist, vlist_iter->tfindex);
+ } else {
+ simaUVSel_UnSet(efa_vlist, tf_vlist, vlist_iter->tfindex);
+ }
+ }
+ vlist_iter = vlist_iter->next;
+ }
+ }
+ }
+ }
+ EM_free_index_arrays();
+ free_uv_vert_map_EM(vmap);
+
+ } else { /* SI_STICKY_DISABLE or G.sima->flag & SI_SYNC_UVSEL */
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ if (efa->tmp.l) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (select) {
+ simaFaceSel_Set(efa, tf);
+ } else {
+ simaFaceSel_UnSet(efa, tf);
+ }
+ }
+ }
}
- allqueue(REDRAWIMAGE, 0);
}
void pin_tface_uv(int mode)
{
- Mesh *me;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
MTFace *tface;
- MFace *mface;
- int a;
if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
-
- mface= me->mface;
- tface= me->mtface;
- for(a=me->totface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
- if(mode ==1){
- if(tface->flag & TF_SEL1) tface->unwrap |= TF_PIN1;
- if(tface->flag & TF_SEL2) tface->unwrap |= TF_PIN2;
- if(tface->flag & TF_SEL3) tface->unwrap |= TF_PIN3;
- if(mface->v4)
- if(tface->flag & TF_SEL4) tface->unwrap |= TF_PIN4;
- }
- else if (mode ==0){
- if(tface->flag & TF_SEL1) tface->unwrap &= ~TF_PIN1;
- if(tface->flag & TF_SEL2) tface->unwrap &= ~TF_PIN2;
- if(tface->flag & TF_SEL3) tface->unwrap &= ~TF_PIN3;
- if(mface->v4)
- if(tface->flag & TF_SEL4) tface->unwrap &= ~TF_PIN4;
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if(mode ==1) {
+ if(simaUVSel_Check(efa, tface, 0)) tface->unwrap |= TF_PIN1;
+ if(simaUVSel_Check(efa, tface, 1)) tface->unwrap |= TF_PIN2;
+ if(simaUVSel_Check(efa, tface, 2)) tface->unwrap |= TF_PIN3;
+ if(efa->v4)
+ if(simaUVSel_Check(efa, tface, 3)) tface->unwrap |= TF_PIN4;
+ }
+ else if (mode ==0) {
+ if(simaUVSel_Check(efa, tface, 0)) tface->unwrap &= ~TF_PIN1;
+ if(simaUVSel_Check(efa, tface, 1)) tface->unwrap &= ~TF_PIN2;
+ if(simaUVSel_Check(efa, tface, 2)) tface->unwrap &= ~TF_PIN3;
+ if(efa->v4)
+ if(simaUVSel_Check(efa, tface, 3)) tface->unwrap &= ~TF_PIN4;
}
}
}
@@ -1397,72 +1748,91 @@ void pin_tface_uv(int mode)
void select_pinned_tface_uv(void)
{
- Mesh *me;
+ EditMesh *em= G.editMesh;
+ EditFace *efa;
MTFace *tface;
- MFace *mface;
- int a;
if( is_uv_tface_editing_allowed()==0 ) return;
- me= get_mesh(OBACT);
- mface= me->mface;
- tface= me->mtface;
- for(a=me->totface; a>0; a--, tface++, mface++) {
- if(mface->flag & ME_FACE_SEL) {
-
- if (tface->unwrap & TF_PIN1) tface->flag |= TF_SEL1;
- if (tface->unwrap & TF_PIN2) tface->flag |= TF_SEL2;
- if (tface->unwrap & TF_PIN3) tface->flag |= TF_SEL3;
- if(mface->v4) {
- if (tface->unwrap & TF_PIN4) tface->flag |= TF_SEL4;
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tface = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tface)) {
+ if (tface->unwrap & TF_PIN1) simaUVSel_Set(efa, tface, 0);
+ if (tface->unwrap & TF_PIN2) simaUVSel_Set(efa, tface, 1);
+ if (tface->unwrap & TF_PIN3) simaUVSel_Set(efa, tface, 2);
+ if(efa->v4) {
+ if (tface->unwrap & TF_PIN4) simaUVSel_Set(efa, tface, 3);
}
}
}
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ allqueue(REDRAWVIEW3D, 0); /* mesh selection has changed */
+ }
+
BIF_undo_push("Select Pinned UVs");
scrarea_queue_winredraw(curarea);
}
int minmax_tface_uv(float *min, float *max)
{
- Mesh *me;
+ EditMesh *em= G.editMesh;
+ EditFace *efa;
MTFace *tf;
- MFace *mf;
- int a, sel;
-
+ int sel;
+
if( is_uv_tface_editing_allowed()==0 ) return 0;
- me= get_mesh(OBACT);
INIT_MINMAX2(min, max);
sel= 0;
- mf= (MFace*)me->mface;
- tf= (MTFace*)me->mtface;
- for(a=me->totface; a>0; a--, tf++, mf++) {
- if(mf->flag & ME_HIDE);
- else if(mf->flag & ME_FACE_SEL) {
-
- if (tf->flag & TF_SEL1) {
- DO_MINMAX2(tf->uv[0], min, max);
- }
- if (tf->flag & TF_SEL2) {
- DO_MINMAX2(tf->uv[1], min, max);
- }
- if (tf->flag & TF_SEL3) {
- DO_MINMAX2(tf->uv[2], min, max);
- }
- if (mf->v4 && tf->flag & TF_SEL4) {
- DO_MINMAX2(tf->uv[3], min, max);
- }
-
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ if (simaUVSel_Check(efa, tf, 0)) DO_MINMAX2(tf->uv[0], min, max);
+ if (simaUVSel_Check(efa, tf, 1)) DO_MINMAX2(tf->uv[1], min, max);
+ if (simaUVSel_Check(efa, tf, 2)) DO_MINMAX2(tf->uv[2], min, max);
+ if (efa->v4 && (simaUVSel_Check(efa, tf, 3))) DO_MINMAX2(tf->uv[3], min, max);
sel = 1;
}
}
-
return sel;
}
+int cent_tface_uv(float *cent, int mode)
+{
+ float min[2], max[2];
+ short change= 0;
+
+ if (mode==0) {
+ if (minmax_tface_uv(min, max))
+ change = 1;
+
+ } else if (mode==1) {
+ EditFace *efa;
+ MTFace *tf;
+ INIT_MINMAX2(min, max);
+
+ for (efa= G.editMesh->faces.first; efa; efa= efa->next) {
+ tf = CustomData_em_get(&G.editMesh->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ if (simaUVSel_Check(efa, tf, 0)) { DO_MINMAX2(tf->uv[0], min, max); change= 1;}
+ if (simaUVSel_Check(efa, tf, 1)) { DO_MINMAX2(tf->uv[1], min, max); change= 1;}
+ if (simaUVSel_Check(efa, tf, 2)) { DO_MINMAX2(tf->uv[2], min, max); change= 1;}
+ if (efa->v4 && (simaUVSel_Check(efa, tf, 3))) { DO_MINMAX2(tf->uv[3], min, max); change= 1;}
+ }
+ }
+ }
+
+ if (change) {
+ cent[0]= (min[0]+max[0])/2.0;
+ cent[1]= (min[1]+max[1])/2.0;
+ return 1;
+ }
+ return 0;
+}
+
static void sima_show_info(int channels, int x, int y, char *cp, float *fp, int *zp, float *zpf)
{
short ofs;
@@ -1577,88 +1947,26 @@ void sima_sample_color(void)
static void load_image_filesel(char *str) /* called from fileselect */
{
Image *ima= NULL;
-
- if(G.obedit) {
- error("Can't perfom this in editmode");
- return;
- }
ima= BKE_add_image_file(str);
if(ima) {
-
- G.sima->image= ima;
-
BKE_image_signal(ima, &G.sima->iuser, IMA_SIGNAL_RELOAD);
- image_changed(G.sima, 0);
-
+ image_changed(G.sima, ima);
}
BIF_undo_push("Load image UV");
allqueue(REDRAWIMAGE, 0);
}
-static void image_replace(Image *old, Image *new)
-{
- MTFace *tface;
- Mesh *me;
- int a, rep=0;
-
- new->tpageflag= old->tpageflag;
- new->twsta= old->twsta;
- new->twend= old->twend;
- new->xrep= old->xrep;
- new->yrep= old->yrep;
-
- me= G.main->mesh.first;
- while(me) {
-
- if(me->id.lib==NULL && me->mtface) {
- tface= me->mtface;
- a= me->totface;
- while(a--) {
- if(tface->tpage==old) {
- tface->tpage= new;
- rep++;
- }
- tface++;
- }
- }
- me= me->id.next;
-
- }
- if(rep) {
- if(new->id.us==0) id_us_plus(&new->id);
- else id_lib_extern(&new->id);
-
- }
- else error("Nothing replaced");
-}
-
static void replace_image_filesel(char *str) /* called from fileselect */
{
- Image *ima=0;
-
- if(G.obedit) {
- error("Can't perfom this in editmode");
+ if (!G.sima->image)
return;
- }
-
- ima= BKE_add_image_file(str);
- if(ima) {
-
- if(G.sima->image && G.sima->image != ima) {
- image_replace(G.sima->image, ima);
- }
-
- G.sima->image= ima;
-
- BKE_image_signal(ima, &G.sima->iuser, IMA_SIGNAL_RELOAD);
-
- /* replace also assigns: */
- image_changed(G.sima, 0);
-
- }
+
+ strncpy(G.sima->image->name, str, sizeof(G.sima->image->name)-1); /* we cant do much if the str is longer then 240 :/ */
+ BKE_image_signal(G.sima->image, &G.sima->iuser, IMA_SIGNAL_RELOAD);
BIF_undo_push("Replace image UV");
allqueue(REDRAWIMAGE, 0);
+ allqueue(REDRAWVIEW3D, 0);
}
@@ -1808,7 +2116,7 @@ void save_as_image_sima(void)
if(ima->rr && !(ima->source==IMA_SRC_SEQUENCE && ima->type==IMA_TYPE_MULTILAYER))
G.sima->imtypenr= R_MULTILAYER;
else if(ima->type==IMA_TYPE_R_RESULT)
- G.sima->imtypenr= R_MULTILAYER;
+ G.sima->imtypenr= G.scene->r.imtype;
else G.sima->imtypenr= BKE_ftype_to_imtype(ibuf->ftype);
activate_fileselect_menu(FILE_SPECIAL, "Save Image", name, strp, &G.sima->imtypenr, save_image_doit);
@@ -1896,10 +2204,9 @@ void save_image_sequence_sima(void)
void reload_image_sima(void)
{
-
if (G.sima ) {
BKE_image_signal(G.sima->image, &G.sima->iuser, IMA_SIGNAL_RELOAD);
- image_changed(G.sima, 0);
+ /* image_changed(G.sima, 0); - do we really need this? */
}
allqueue(REDRAWIMAGE, 0);
@@ -1913,7 +2220,8 @@ void new_image_sima(void)
static short uvtestgrid= 0;
static float color[] = {0, 0, 0, 1};
char name[22];
-
+ Image *ima;
+
strcpy(name, "Untitled");
add_numbut(0, TEX, "Name:", 0, 21, name, NULL);
@@ -1925,10 +2233,9 @@ void new_image_sima(void)
if (!do_clever_numbuts("New Image", 6, REDRAW))
return;
- G.sima->image= BKE_add_image_size(width, height, name, uvtestgrid, color);
+ ima = BKE_add_image_size(width, height, name, uvtestgrid, color);
+ image_changed(G.sima, ima);
BKE_image_signal(G.sima->image, &G.sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE);
- image_changed(G.sima, 0);
-
BIF_undo_push("Add image");
allqueue(REDRAWIMAGE, 0);
@@ -2018,3 +2325,112 @@ void BIF_image_update_frame(void)
}
}
+void aspect_sima(SpaceImage *sima, float *x, float *y)
+{
+ *x = *y = 1.0;
+
+ if( (sima->image == 0) ||
+ (sima->image->type == IMA_TYPE_R_RESULT) ||
+ (sima->image->type == IMA_TYPE_COMPOSITE) ||
+ (sima->image->tpageflag & IMA_TILES) ||
+ (sima->image->aspx==0.0 || sima->image->aspy==0.0)
+ ) {
+ return;
+ }
+
+ /* x is always 1 */
+ *y = sima->image->aspy / sima->image->aspx;
+}
+
+
+/* Face selection tests - Keep these together */
+
+/* this checks weather a face is drarn without the local image check */
+int simaFaceDraw_Check_nolocal( EditFace *efa )
+{
+ if (G.sima && G.sima->flag & SI_SYNC_UVSEL) {
+ return (efa->h==0);
+ } else {
+ return (efa->h==0 && efa->f & SELECT);
+ }
+ return 0;
+}
+
+int simaFaceDraw_Check( EditFace *efa, MTFace *tf )
+{
+ if (G.sima && G.sima->flag & SI_LOCAL_UV) {
+ if (tf->tpage==G.sima->image) {
+ return simaFaceDraw_Check_nolocal(efa);
+ } else {
+ return 0;
+ }
+ } else {
+ return simaFaceDraw_Check_nolocal(efa);
+ }
+}
+
+int simaFaceSel_Check( struct EditFace *efa, struct MTFace *tf )
+{
+ if (G.sima && G.sima->flag & SI_SYNC_UVSEL) {
+ return (efa->f & SELECT);
+ } else {
+ return (!(~tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3)) &&(!efa->v4 || tf->flag & TF_SEL4));
+ }
+}
+
+void simaFaceSel_Set( struct EditFace *efa, struct MTFace *tf )
+{
+ if (G.sima && G.sima->flag & SI_SYNC_UVSEL) {
+ EM_select_face(efa, 1);
+ } else {
+ tf->flag |= (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+ }
+}
+
+void simaFaceSel_UnSet( struct EditFace *efa, struct MTFace *tf )
+{
+ if (G.sima && G.sima->flag & SI_SYNC_UVSEL) {
+ EM_select_face(efa, 0);
+ } else {
+ tf->flag &= ~(TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4);
+ }
+}
+
+int simaUVSel_Check( struct EditFace *efa, struct MTFace *tf, int i)
+{
+ if (G.sima && G.sima->flag & SI_SYNC_UVSEL) {
+ if (G.scene->selectmode == SCE_SELECT_FACE) {
+ return efa->f & SELECT;
+ } else {
+ return (*(&efa->v1 + i))->f & SELECT;
+ }
+ } else {
+ return tf->flag & TF_SEL_MASK(i);
+ }
+}
+
+void simaUVSel_Set( struct EditFace *efa, struct MTFace *tf, int i)
+{
+ if (G.sima && G.sima->flag & SI_SYNC_UVSEL) {
+ if (G.scene->selectmode == SCE_SELECT_FACE) {
+ EM_select_face(efa, 1);
+ } else {
+ (*(&efa->v1 + i))->f |= SELECT;
+ }
+ } else {
+ tf->flag |= TF_SEL_MASK(i);
+ }
+}
+
+void simaUVSel_UnSet( struct EditFace *efa, struct MTFace *tf, int i)
+{
+ if (G.sima && G.sima->flag & SI_SYNC_UVSEL) {
+ if (G.scene->selectmode == SCE_SELECT_FACE) {
+ EM_select_face(efa, 0);
+ } else {
+ (*(&efa->v1 + i))->f &= ~SELECT;
+ }
+ } else {
+ tf->flag &= ~TF_SEL_MASK(i);
+ }
+}
diff --git a/source/blender/src/editsound.c b/source/blender/src/editsound.c
index e167ebbafb4..2e333b9f43e 100644
--- a/source/blender/src/editsound.c
+++ b/source/blender/src/editsound.c
@@ -219,11 +219,7 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case AKEY: /* select/deselect all */
deselect_markers(1, 0);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case BKEY: /* borderselect markers */
@@ -234,11 +230,7 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if (G.qual & LR_SHIFTKEY) {
duplicate_marker();
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
break;
@@ -252,11 +244,7 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else
add_marker(CFRA);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case TKEY: /* toggle time display */
@@ -273,12 +261,7 @@ void winqreadsoundspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case XKEY:
if (okee("Erase selected")) {
remove_marker();
-
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
break;
}
diff --git a/source/blender/src/edittime.c b/source/blender/src/edittime.c
index 83e8e5473e1..f90fd1c2eda 100644
--- a/source/blender/src/edittime.c
+++ b/source/blender/src/edittime.c
@@ -103,6 +103,8 @@ void add_marker(int frame)
BIF_undo_push("Add Marker");
}
+
+
/* remove selected TimeMarkers */
void remove_marker(void)
{
@@ -167,6 +169,7 @@ void transform_markers(int mode, int smode) // mode and smode unused here, for c
{
SpaceLink *slink= curarea->spacedata.first;
SpaceTime *stime= curarea->spacedata.first;
+ SpaceAction *saction = curarea->spacedata.first;
TimeMarker *marker, *selmarker=NULL;
float dx, fac;
int a, ret_val= 0, totmark=0, *oldframe, offs, firsttime=1;
@@ -205,7 +208,7 @@ void transform_markers(int mode, int smode) // mode and smode unused here, for c
fac= (((float)(mval[0] - pmval[0]))*dx);
if (ELEM(slink->spacetype, SPACE_TIME, SPACE_SOUND))
- apply_keyb_grid(&fac, 0.0, (float)G.scene->r.frs_sec, 0.1*(float)G.scene->r.frs_sec, 0);
+ apply_keyb_grid(&fac, 0.0, FPS, 0.1*FPS, 0);
else
apply_keyb_grid(&fac, 0.0, 1.0, 0.1, U.flag & USER_AUTOGRABGRID);
offs= (int)fac;
@@ -219,10 +222,16 @@ void transform_markers(int mode, int smode) // mode and smode unused here, for c
if(totmark==1) { // we print current marker value
if (ELEM(slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
- if(stime->flag & TIME_DRAWFRAMES)
+ if (stime->flag & TIME_DRAWFRAMES)
sprintf(str, "Marker %d offset %d", selmarker->frame, offs);
else
- sprintf(str, "Marker %.2f offset %.2f", (selmarker->frame/(float)G.scene->r.frs_sec), (offs/(float)G.scene->r.frs_sec));
+ sprintf(str, "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
+ }
+ else if (slink->spacetype == SPACE_ACTION) {
+ if (saction->flag & SACTION_DRAWTIME)
+ sprintf(str, "Marker %.2f offset %.2f", FRA2TIME(selmarker->frame), FRA2TIME(offs));
+ else
+ sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
}
else {
sprintf(str, "Marker %.2f offset %.2f", (double)(selmarker->frame), (double)(offs));
@@ -230,10 +239,16 @@ void transform_markers(int mode, int smode) // mode and smode unused here, for c
}
else {
if (ELEM(slink->spacetype, SPACE_TIME, SPACE_SOUND)) {
- if(stime->flag & TIME_DRAWFRAMES)
+ if (stime->flag & TIME_DRAWFRAMES)
sprintf(str, "Marker offset %d ", offs);
else
- sprintf(str, "Marker offset %.2f ", (offs/(float)G.scene->r.frs_sec));
+ sprintf(str, "Marker offset %.2f ", FRA2TIME(offs));
+ }
+ else if (slink->spacetype == SPACE_ACTION) {
+ if (saction->flag & SACTION_DRAWTIME)
+ sprintf(str, "Marker offset %.2f ", FRA2TIME(offs));
+ else
+ sprintf(str, "Marker offset %.2f ", (double)(offs));
}
else {
sprintf(str, "Marker offset %.2f ", (double)(offs));
@@ -269,11 +284,7 @@ void transform_markers(int mode, int smode) // mode and smode unused here, for c
BIF_undo_push("Move Markers");
}
MEM_freeN(oldframe);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
/* select/deselect all TimeMarkers
@@ -374,11 +385,7 @@ void borderselect_markers(void)
borderselect_markers_func(rectf.xmin, rectf.xmax, selectmode);
BIF_undo_push("Border Select Markers");
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
}
@@ -599,6 +606,8 @@ void anim_previewrange_set()
areamouseco_to_ipoco(G.v2d, mval, &rectf.xmax, &rectf.ymax);
/* set preview-range */
+ if (rectf.xmin < 1) rectf.xmin = 1.0f;
+ if (rectf.xmax < 1) rectf.xmax = 1.0f;
G.scene->r.psfra= rectf.xmin;
G.scene->r.pefra= rectf.xmax;
@@ -726,6 +735,27 @@ void nextprev_timeline_key(short dir)
}
}
+/* return the current marker for this frame,
+we can have more then 1 marker per frame, this just returns the first :/ */
+TimeMarker *get_frame_marker(int frame)
+{
+ TimeMarker *marker, *best_marker = NULL;
+ int best_frame = -MAXFRAME*2;
+ for (marker= G.scene->markers.first; marker; marker= marker->next) {
+ if (marker->frame==frame) {
+ return marker;
+ }
+
+ if ( marker->frame > best_frame && marker->frame < frame) {
+ best_marker = marker;
+ best_frame = marker->frame;
+ }
+ }
+
+ return best_marker;
+}
+
+
void timeline_frame_to_center(void)
{
float dtime;
@@ -904,11 +934,7 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case AKEY:
/* deselect all TimeMarkers */
deselect_markers(1, 0);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case BKEY:
/* borderselect markers */
@@ -939,11 +965,7 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
rename_marker();
else
add_marker(CFRA);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case PKEY: /* preview-range stuff */
if (G.qual & LR_CTRLKEY) /* set preview range */
@@ -974,11 +996,7 @@ void winqreadtimespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if( okee("Erase selected")==0 ) break;
remove_marker();
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
}
}
diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c
index 9bed12cb3da..f1e4017c264 100644
--- a/source/blender/src/editview.c
+++ b/source/blender/src/editview.c
@@ -73,11 +73,15 @@
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_object.h" /* fly mode where_is_object to get camera location */
+#include "BKE_particle.h"
#include "BKE_utildefines.h"
+#include "BKE_customdata.h"
+#include "BIF_drawimage.h"
#include "BIF_butspace.h"
#include "BIF_editaction.h"
#include "BIF_editarmature.h"
+#include "BIF_editparticle.h"
#include "BIF_editgroup.h"
#include "BIF_editmesh.h"
#include "BIF_editoops.h"
@@ -246,7 +250,7 @@ static int edge_inside_rect(rcti *rect, short x1, short y1, short x2, short y2)
#define MOVES_GESTURE 50
#define MOVES_LASSO 500
-static int lasso_inside(short mcords[][2], short moves, short sx, short sy)
+int lasso_inside(short mcords[][2], short moves, short sx, short sy)
{
/* we do the angle rule, define that all added angles should be about zero or 2*PI */
float angletot=0.0, len, dot, ang, cross, fp1[2], fp2[2];
@@ -467,6 +471,62 @@ static void do_lasso_select_mesh(short mcords[][2], short moves, short select)
EM_selectmode_flush();
}
+/* this is an exception in that its the only lasso that dosnt use the 3d view (uses space image view) */
+static void do_lasso_select_mesh_uv(short mcords[][2], short moves, short select)
+{
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+ MTFace *tf;
+ int screenUV[2], nverts, i, ok = 1;
+ rcti rect;
+
+ lasso_select_boundbox(&rect, mcords, moves);
+
+ if (draw_uvs_face_check()) { /* Face Center Sel */
+ float cent[2];
+ ok = 0;
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ /* assume not touched */
+ efa->tmp.l = 0;
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if ((select) != (simaFaceSel_Check(efa, tf))) {
+ tface_center(tf, cent, (void *)efa->v4);
+ uvco_to_areaco_noclip(cent, screenUV);
+ if (BLI_in_rcti(&rect, screenUV[0], screenUV[1]) && lasso_inside(mcords, moves, screenUV[0], screenUV[1])) {
+ efa->tmp.l = ok = 1;
+ }
+ }
+ }
+ /* (de)selects all tagged faces and deals with sticky modes */
+ if (ok)
+ uvface_setsel__internal(select);
+
+ } else { /* Vert Sel*/
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf = CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ nverts= efa->v4? 4: 3;
+ for(i=0; i<nverts; i++) {
+ if ((select) != (simaUVSel_Check(efa, tf, i))) {
+ uvco_to_areaco_noclip(tf->uv[i], screenUV);
+ if (BLI_in_rcti(&rect, screenUV[0], screenUV[1]) && lasso_inside(mcords, moves, screenUV[0], screenUV[1])) {
+ if (select) {
+ simaUVSel_Set(efa, tf, i);
+ } else {
+ simaUVSel_UnSet(efa, tf, i);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ if (ok && G.sima->flag & SI_SYNC_UVSEL) {
+ if (select) EM_select_flush();
+ else EM_deselect_flush();
+ }
+}
+
static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp, BezTriple *bezt, int beztindex, int x, int y)
{
struct { short (*mcords)[2]; short moves; short select; } *data = userData;
@@ -475,12 +535,17 @@ static void do_lasso_select_curve__doSelect(void *userData, Nurb *nu, BPoint *bp
if (bp) {
bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
} else {
- if (beztindex==0) {
- bezt->f1 = data->select?(bezt->f1|1):(bezt->f1&~1);
- } else if (beztindex==1) {
- bezt->f2 = data->select?(bezt->f2|1):(bezt->f2&~1);
+ if (G.f & G_HIDDENHANDLES) {
+ /* can only be beztindex==0 here since handles are hidden */
+ bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f1|1):(bezt->f1&~1);
} else {
- bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
+ if (beztindex==0) {
+ bezt->f1 = data->select?(bezt->f1|1):(bezt->f1&~1);
+ } else if (beztindex==1) {
+ bezt->f2 = data->select?(bezt->f2|1):(bezt->f2&~1);
+ } else {
+ bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
+ }
}
}
}
@@ -574,16 +639,22 @@ static void do_lasso_select_facemode(short mcords[][2], short moves, short selec
static void do_lasso_select(short mcords[][2], short moves, short select)
{
if(G.obedit==NULL) {
- if(G.f & G_FACESELECT)
+ if(FACESEL_PAINT_TEST)
do_lasso_select_facemode(mcords, moves, select);
else if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT))
;
+ else if(G.f & G_PARTICLEEDIT)
+ PE_do_lasso_select(mcords, moves, select);
else
do_lasso_select_objects(mcords, moves, select);
}
- else if(G.obedit->type==OB_MESH)
- do_lasso_select_mesh(mcords, moves, select);
- else if(G.obedit->type==OB_CURVE || G.obedit->type==OB_SURF)
+ else if(G.obedit->type==OB_MESH) {
+ if(curarea->spacetype==SPACE_VIEW3D) {
+ do_lasso_select_mesh(mcords, moves, select);
+ } else if (EM_texFaceCheck()){
+ do_lasso_select_mesh_uv(mcords, moves, select);
+ }
+ } else if(G.obedit->type==OB_CURVE || G.obedit->type==OB_SURF)
do_lasso_select_curve(mcords, moves, select);
else if(G.obedit->type==OB_LATTICE)
do_lasso_select_lattice(mcords, moves, select);
@@ -591,7 +662,10 @@ static void do_lasso_select(short mcords[][2], short moves, short select)
do_lasso_select_armature(mcords, moves, select);
BIF_undo_push("Lasso select");
-
+
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
allqueue(REDRAWVIEW3D, 0);
countall();
}
@@ -748,6 +822,10 @@ int gesture(void)
if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT|G_WEIGHTPAINT)) return 0;
}
lasso= 1;
+ } else if (curarea->spacetype==SPACE_IMAGE) {
+ if(G.obedit) {
+ lasso= 1;
+ }
}
}
@@ -1087,22 +1165,8 @@ void set_active_base(Base *base)
Base *tbase;
/* activating a non-mesh, should end a couple of modes... */
- if(base) {
- if(base->object->type!=OB_MESH) {
- if(G.f & G_SCULPTMODE)
- set_sculptmode(); /* toggle */
- if(G.f & G_WEIGHTPAINT)
- set_wpaint(); /* toggle */
- if(G.f & G_VERTEXPAINT)
- set_vpaint(); /* toggle */
- if(G.f & G_TEXTUREPAINT)
- set_texturepaint(); /* Switch off tex paint */
- }
- /* always end this */
- if(G.f & G_FACESELECT) {
- set_faceselect(); /* toggle */
- }
- }
+ if(base && base->object->type!=OB_MESH)
+ exit_paint_modes();
/* sets scene->basact */
BASACT= base;
@@ -1537,12 +1601,17 @@ static void do_nurbs_box_select__doSelect(void *userData, Nurb *nu, BPoint *bp,
if (bp) {
bp->f1 = data->select?(bp->f1|1):(bp->f1&~1);
} else {
- if (beztindex==0) {
- bezt->f1 = data->select?(bezt->f1|1):(bezt->f1&~1);
- } else if (beztindex==1) {
- bezt->f2 = data->select?(bezt->f2|1):(bezt->f2&~1);
+ if (G.f & G_HIDDENHANDLES) {
+ /* can only be beztindex==0 here since handles are hidden */
+ bezt->f1 = bezt->f2 = bezt->f3 = data->select?(bezt->f1|1):(bezt->f1&~1);
} else {
- bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
+ if (beztindex==0) {
+ bezt->f1 = data->select?(bezt->f1|1):(bezt->f1&~1);
+ } else if (beztindex==1) {
+ bezt->f2 = data->select?(bezt->f2|1):(bezt->f2&~1);
+ } else {
+ bezt->f3 = data->select?(bezt->f3|1):(bezt->f3&~1);
+ }
}
}
}
@@ -1666,10 +1735,14 @@ void borderselect(void)
int a, index;
short hits, val;
- if(G.obedit==NULL && (G.f & G_FACESELECT)) {
+ if(G.obedit==NULL && (FACESEL_PAINT_TEST)) {
face_borderselect();
return;
}
+ else if(G.obedit==NULL && (G.f & G_PARTICLEEDIT)) {
+ PE_borderselect();
+ return;
+ }
a = 0;
#ifdef __APPLE__
@@ -1679,13 +1752,19 @@ void borderselect(void)
val= get_border(&rect, 3);
if (!a) setlinestyle(0);
- if(val==0)
+ if(val==0) {
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
return;
+ }
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
do_mesh_box_select(&rect, (val==LEFTMOUSE));
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
}
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
do_nurbs_box_select(&rect, val==LEFTMOUSE);
@@ -1912,7 +1991,7 @@ static void mesh_selectionCB(int selecting, Object *editobj, short *mval, float
EditMesh *em = G.editMesh;
int bbsel;
- if(!G.obedit && (G.f&G_FACESELECT)) {
+ if(!G.obedit && (FACESEL_PAINT_TEST)) {
Mesh *me = get_mesh(OBACT);
if (me) {
@@ -2057,15 +2136,23 @@ void set_render_border(void)
G.scene->r.border.ymin= ((float)rect.ymin-vb.ymin)/(vb.ymax-vb.ymin);
G.scene->r.border.xmax= ((float)rect.xmax-vb.xmin)/(vb.xmax-vb.xmin);
G.scene->r.border.ymax= ((float)rect.ymax-vb.ymin)/(vb.ymax-vb.ymin);
-
+
CLAMP(G.scene->r.border.xmin, 0.0, 1.0);
CLAMP(G.scene->r.border.ymin, 0.0, 1.0);
CLAMP(G.scene->r.border.xmax, 0.0, 1.0);
CLAMP(G.scene->r.border.ymax, 0.0, 1.0);
-
+
allqueue(REDRAWVIEWCAM, 1);
- /* if it was not set, we do this */
- G.scene->r.mode |= R_BORDER;
+
+ /* drawing a border surrounding the entire camera view switches off border rendering */
+ if (G.scene->r.border.xmin <= 0.0 && G.scene->r.border.xmax >= 1.0 &&
+ G.scene->r.border.ymin <= 0.0 && G.scene->r.border.ymax >= 1.0)
+ {
+ G.scene->r.mode &= ~R_BORDER;
+ } else {
+ G.scene->r.mode |= R_BORDER;
+ }
+
allqueue(REDRAWBUTSSCENE, 1);
}
}
@@ -2550,14 +2637,14 @@ void fly(void)
cfra = G.scene->r.cfra;
if (xlock || zlock || moffset[0] || moffset[1]) {
- insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_ROT_X);
- insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_ROT_Y);
- insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_ROT_Z);
+ insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_ROT_X, 0);
+ insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_ROT_Y, 0);
+ insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_ROT_Z, 0);
}
if (speed) {
- insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_LOC_X);
- insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_LOC_Y);
- insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_LOC_Z);
+ insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_LOC_X, 0);
+ insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_LOC_Y, 0);
+ insertkey(&G.vd->camera->id, ID_OB, actname, NULL, OB_LOC_Z, 0);
}
}
}
diff --git a/source/blender/src/filelist.c b/source/blender/src/filelist.c
new file mode 100644
index 00000000000..59430ef8778
--- /dev/null
+++ b/source/blender/src/filelist.c
@@ -0,0 +1,1135 @@
+/**
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+
+/* global includes */
+
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifndef WIN32
+#include <unistd.h>
+#else
+#include <io.h>
+#include <direct.h>
+#endif
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_linklist.h"
+#include "BLI_storage_types.h"
+
+#ifdef WIN32
+#include "BLI_winstuff.h"
+#endif
+
+#include "BKE_utildefines.h"
+#include "BKE_global.h"
+#include "BIF_filelist.h"
+#include "BKE_library.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BLO_readfile.h"
+
+#include "DNA_space_types.h"
+#include "DNA_ipo_types.h"
+#include "DNA_ID.h"
+#include "DNA_object_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_texture_types.h"
+#include "DNA_world_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_userdef_types.h"
+
+#include "IMB_imbuf.h"
+#include "IMB_imbuf_types.h"
+#include "IMB_thumbs.h"
+
+#include "PIL_time.h"
+
+#include "datatoc.h"
+
+/* Elubie: VERY, really very ugly and evil! Remove asap!!! */
+/* for state of file */
+#define ACTIVE 2
+
+/* max length of library group name within filesel */
+#define GROUP_MAX 32
+
+typedef struct FileList
+{
+ struct direntry *filelist;
+ int *fidx;
+
+ int numfiles;
+ int numfiltered;
+ char dir[FILE_MAXDIR];
+ short type;
+ short ipotype;
+ struct BlendHandle *libfiledata;
+ int has_func;
+ short prv_w;
+ short prv_h;
+ short hide_dot;
+ unsigned int filter;
+} FileList;
+
+int BIF_groupname_to_code(char *group)
+{
+ char buf[32];
+ char *lslash;
+
+ BLI_strncpy(buf, group, 31);
+ lslash= BLI_last_slash(buf);
+ if (lslash)
+ lslash[0]= '\0';
+
+ return BLO_idcode_from_name(buf);
+}
+
+
+#define SPECIAL_IMG_SIZE 48
+#define SPECIAL_IMG_ROWS 4
+#define SPECIAL_IMG_COLS 4
+
+#define SPECIAL_IMG_FOLDER 0
+#define SPECIAL_IMG_PARENT 1
+#define SPECIAL_IMG_REFRESH 2
+#define SPECIAL_IMG_BLENDFILE 3
+#define SPECIAL_IMG_SOUNDFILE 4
+#define SPECIAL_IMG_MOVIEFILE 5
+#define SPECIAL_IMG_PYTHONFILE 6
+#define SPECIAL_IMG_TEXTFILE 7
+#define SPECIAL_IMG_FONTFILE 8
+#define SPECIAL_IMG_UNKNOWNFILE 9
+#define SPECIAL_IMG_MAX SPECIAL_IMG_UNKNOWNFILE + 1
+
+static ImBuf* gSpecialFileImages[SPECIAL_IMG_MAX];
+
+
+/* ******************* SORT ******************* */
+
+static int compare_name(const void *a1, const void *a2)
+{
+ const struct direntry *entry1=a1, *entry2=a2;
+
+ /* type is is equal to stat.st_mode */
+
+ if (S_ISDIR(entry1->type)){
+ if (S_ISDIR(entry2->type)==0) return (-1);
+ } else{
+ if (S_ISDIR(entry2->type)) return (1);
+ }
+ if (S_ISREG(entry1->type)){
+ if (S_ISREG(entry2->type)==0) return (-1);
+ } else{
+ if (S_ISREG(entry2->type)) return (1);
+ }
+ if ((entry1->type & S_IFMT) < (entry2->type & S_IFMT)) return (-1);
+ if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
+
+ /* make sure "." and ".." are always first */
+ if( strcmp(entry1->relname, ".")==0 ) return (-1);
+ if( strcmp(entry2->relname, ".")==0 ) return (1);
+ if( strcmp(entry1->relname, "..")==0 ) return (-1);
+
+ return (BLI_strcasecmp(entry1->relname,entry2->relname));
+}
+
+static int compare_date(const void *a1, const void *a2)
+{
+ const struct direntry *entry1=a1, *entry2=a2;
+
+ /* type is equal to stat.st_mode */
+
+ if (S_ISDIR(entry1->type)){
+ if (S_ISDIR(entry2->type)==0) return (-1);
+ } else{
+ if (S_ISDIR(entry2->type)) return (1);
+ }
+ if (S_ISREG(entry1->type)){
+ if (S_ISREG(entry2->type)==0) return (-1);
+ } else{
+ if (S_ISREG(entry2->type)) return (1);
+ }
+ if ((entry1->type & S_IFMT) < (entry2->type & S_IFMT)) return (-1);
+ if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
+
+ /* make sure "." and ".." are always first */
+ if( strcmp(entry1->relname, ".")==0 ) return (-1);
+ if( strcmp(entry2->relname, ".")==0 ) return (1);
+ if( strcmp(entry1->relname, "..")==0 ) return (-1);
+
+ if ( entry1->s.st_mtime < entry2->s.st_mtime) return 1;
+ if ( entry1->s.st_mtime > entry2->s.st_mtime) return -1;
+
+ else return BLI_strcasecmp(entry1->relname,entry2->relname);
+}
+
+static int compare_size(const void *a1, const void *a2)
+{
+ const struct direntry *entry1=a1, *entry2=a2;
+
+ /* type is equal to stat.st_mode */
+
+ if (S_ISDIR(entry1->type)){
+ if (S_ISDIR(entry2->type)==0) return (-1);
+ } else{
+ if (S_ISDIR(entry2->type)) return (1);
+ }
+ if (S_ISREG(entry1->type)){
+ if (S_ISREG(entry2->type)==0) return (-1);
+ } else{
+ if (S_ISREG(entry2->type)) return (1);
+ }
+ if ((entry1->type & S_IFMT) < (entry2->type & S_IFMT)) return (-1);
+ if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
+
+ /* make sure "." and ".." are always first */
+ if( strcmp(entry1->relname, ".")==0 ) return (-1);
+ if( strcmp(entry2->relname, ".")==0 ) return (1);
+ if( strcmp(entry1->relname, "..")==0 ) return (-1);
+
+ if ( entry1->s.st_size < entry2->s.st_size) return 1;
+ if ( entry1->s.st_size > entry2->s.st_size) return -1;
+ else return BLI_strcasecmp(entry1->relname,entry2->relname);
+}
+
+static int compare_extension(const void *a1, const void *a2) {
+ const struct direntry *entry1=a1, *entry2=a2;
+ char *sufix1, *sufix2;
+ char *nil="";
+
+ if (!(sufix1= strstr (entry1->relname, ".blend.gz")))
+ sufix1= strrchr (entry1->relname, '.');
+ if (!(sufix2= strstr (entry2->relname, ".blend.gz")))
+ sufix2= strrchr (entry2->relname, '.');
+ if (!sufix1) sufix1= nil;
+ if (!sufix2) sufix2= nil;
+
+ /* type is is equal to stat.st_mode */
+
+ if (S_ISDIR(entry1->type)){
+ if (S_ISDIR(entry2->type)==0) return (-1);
+ } else{
+ if (S_ISDIR(entry2->type)) return (1);
+ }
+ if (S_ISREG(entry1->type)){
+ if (S_ISREG(entry2->type)==0) return (-1);
+ } else{
+ if (S_ISREG(entry2->type)) return (1);
+ }
+ if ((entry1->type & S_IFMT) < (entry2->type & S_IFMT)) return (-1);
+ if ((entry1->type & S_IFMT) > (entry2->type & S_IFMT)) return (1);
+
+ /* make sure "." and ".." are always first */
+ if( strcmp(entry1->relname, ".")==0 ) return (-1);
+ if( strcmp(entry2->relname, ".")==0 ) return (1);
+ if( strcmp(entry1->relname, "..")==0 ) return (-1);
+ if( strcmp(entry2->relname, "..")==0 ) return (-1);
+
+ return (BLI_strcasecmp(sufix1, sufix2));
+}
+
+void BIF_filelist_filter(FileList* filelist)
+{
+ char dir[FILE_MAX], group[GROUP_MAX];
+ int num_filtered = 0;
+ int i, j;
+
+ if (!filelist->filelist)
+ return;
+
+ if ( ( (filelist->type == FILE_LOADLIB) && BIF_filelist_islibrary(filelist, dir, group))
+ || (filelist->type == FILE_MAIN) ) {
+ filelist->filter = 0;
+ }
+
+ if (!filelist->filter) {
+ if (filelist->fidx) {
+ MEM_freeN(filelist->fidx);
+ filelist->fidx = NULL;
+ }
+ filelist->fidx = (int *)MEM_callocN(filelist->numfiles*sizeof(int), "filteridx");
+ for (i = 0; i < filelist->numfiles; ++i) {
+ filelist->fidx[i] = i;
+ }
+ filelist->numfiltered = filelist->numfiles;
+ return;
+ }
+
+ // How many files are left after filter ?
+ for (i = 0; i < filelist->numfiles; ++i) {
+ if (filelist->filelist[i].flags & filelist->filter) {
+ num_filtered++;
+ }
+ else if (filelist->filelist[i].type & S_IFDIR) {
+ if (filelist->filter & FOLDERFILE) {
+ num_filtered++;
+ }
+ }
+ }
+
+ if (filelist->fidx) {
+ MEM_freeN(filelist->fidx);
+ filelist->fidx = NULL;
+ }
+ filelist->fidx = (int *)MEM_callocN(num_filtered*sizeof(int), "filteridx");
+ filelist->numfiltered = num_filtered;
+
+ for (i = 0, j=0; i < filelist->numfiles; ++i) {
+ if (filelist->filelist[i].flags & filelist->filter) {
+ filelist->fidx[j++] = i;
+ }
+ else if (filelist->filelist[i].type & S_IFDIR) {
+ if (filelist->filter & FOLDERFILE) {
+ filelist->fidx[j++] = i;
+ }
+ }
+ }
+}
+
+void BIF_filelist_init_icons()
+{
+ short x, y, k;
+ ImBuf *bbuf;
+ ImBuf *ibuf;
+ bbuf = IMB_ibImageFromMemory((int *)datatoc_prvicons, datatoc_prvicons_size, IB_rect);
+ if (bbuf) {
+ for (y=0; y<SPECIAL_IMG_ROWS; y++) {
+ for (x=0; x<SPECIAL_IMG_COLS; x++) {
+ int tile = SPECIAL_IMG_COLS*y + x;
+ if (tile < SPECIAL_IMG_MAX) {
+ ibuf = IMB_allocImBuf(SPECIAL_IMG_SIZE, SPECIAL_IMG_SIZE, 32, IB_rect, 0);
+ for (k=0; k<SPECIAL_IMG_SIZE; k++) {
+ memcpy(&ibuf->rect[k*SPECIAL_IMG_SIZE], &bbuf->rect[(k+y*SPECIAL_IMG_SIZE)*SPECIAL_IMG_SIZE*SPECIAL_IMG_COLS+x*SPECIAL_IMG_SIZE], SPECIAL_IMG_SIZE*sizeof(int));
+ }
+ gSpecialFileImages[tile] = ibuf;
+ }
+ }
+ }
+ IMB_freeImBuf(bbuf);
+ }
+
+}
+
+void BIF_filelist_free_icons()
+{
+ int i;
+ for (i=0; i < SPECIAL_IMG_MAX; ++i) {
+ IMB_freeImBuf(gSpecialFileImages[i]);
+ gSpecialFileImages[i] = NULL;
+ }
+}
+
+struct FileList* BIF_filelist_new()
+{
+ FileList* p = MEM_callocN( sizeof(FileList), "filelist" );
+ p->filelist = 0;
+ p->numfiles = 0;
+ p->dir[0] = '\0';
+ p->libfiledata = 0;
+ p->type = 0;
+ p->has_func = 0;
+ p->filter = 0;
+ return p;
+}
+
+struct FileList* BIF_filelist_copy(struct FileList* filelist)
+{
+ FileList* p = BIF_filelist_new();
+ BLI_strncpy(p->dir, filelist->dir, FILE_MAXDIR);
+ p->filelist = NULL;
+ p->fidx = NULL;
+ p->type = filelist->type;
+ p->ipotype = filelist->ipotype;
+ p->has_func = filelist->has_func;
+
+ return p;
+}
+
+void BIF_filelist_free(struct FileList* filelist)
+{
+ int i;
+
+ if (!filelist) {
+ printf("Attemtping to delete empty filelist.\n");
+ return;
+ }
+
+ if (filelist->fidx) {
+ MEM_freeN(filelist->fidx);
+ filelist->fidx = NULL;
+ }
+
+ for (i = 0; i < filelist->numfiles; ++i) {
+ if (filelist->filelist[i].image) {
+ IMB_freeImBuf(filelist->filelist[i].image);
+ }
+ filelist->filelist[i].image = 0;
+ if (filelist->filelist[i].relname)
+ MEM_freeN(filelist->filelist[i].relname);
+ filelist->filelist[i].relname = 0;
+ if (filelist->filelist[i].string)
+ MEM_freeN(filelist->filelist[i].string);
+ filelist->filelist[i].string = 0;
+ }
+
+ filelist->numfiles = 0;
+ free(filelist->filelist);
+ filelist->filelist = 0;
+ filelist->filter = 0;
+ filelist->numfiltered =0;
+}
+
+void BIF_filelist_freelib(struct FileList* filelist)
+{
+ if(filelist->libfiledata)
+ BLO_blendhandle_close(filelist->libfiledata);
+ filelist->libfiledata= 0;
+}
+
+struct BlendHandle *BIF_filelist_lib(struct FileList* filelist)
+{
+ return filelist->libfiledata;
+}
+
+int BIF_filelist_numfiles(struct FileList* filelist)
+{
+ return filelist->numfiltered;
+}
+
+const char * BIF_filelist_dir(struct FileList* filelist)
+{
+ return filelist->dir;
+}
+
+void BIF_filelist_setdir(struct FileList* filelist, const char *dir)
+{
+ BLI_strncpy(filelist->dir, dir, FILE_MAXDIR);
+}
+
+void BIF_filelist_imgsize(struct FileList* filelist, short w, short h)
+{
+ filelist->prv_w = w;
+ filelist->prv_h = h;
+}
+
+void BIF_filelist_loadimage(struct FileList* filelist, int index)
+{
+ ImBuf *imb = NULL;
+ int imgwidth = filelist->prv_w;
+ int imgheight = filelist->prv_h;
+ short ex, ey, dx, dy;
+ float scaledx, scaledy;
+ int fidx = 0;
+
+ if ( (index < 0) || (index >= filelist->numfiltered) ) {
+ return;
+ }
+ fidx = filelist->fidx[index];
+
+ if (!filelist->filelist[fidx].image)
+ {
+ if (filelist->type != FILE_MAIN)
+ {
+ if ( filelist->filelist[fidx].flags & IMAGEFILE ) {
+ imb = IMB_thumb_manage(filelist->dir, filelist->filelist[fidx].relname, THB_NORMAL, THB_SOURCE_IMAGE);
+ } else if ( filelist->filelist[fidx].flags & MOVIEFILE ) {
+ imb = IMB_thumb_manage(filelist->dir, filelist->filelist[fidx].relname, THB_NORMAL, THB_SOURCE_MOVIE);
+ if (!imb) {
+ /* remember that file can't be loaded via IMB_open_anim */
+ filelist->filelist[fidx].flags &= ~MOVIEFILE;
+ filelist->filelist[fidx].flags |= MOVIEFILE_ICON;
+ }
+ }
+ if (imb) {
+ if (imb->x > imb->y) {
+ scaledx = (float)imgwidth;
+ scaledy = ( (float)imb->y/(float)imb->x )*imgwidth;
+ }
+ else {
+ scaledy = (float)imgheight;
+ scaledx = ( (float)imb->x/(float)imb->y )*imgheight;
+ }
+ ex = (short)scaledx;
+ ey = (short)scaledy;
+
+ dx = imgwidth - ex;
+ dy = imgheight - ey;
+
+ IMB_scaleImBuf(imb, ex, ey);
+
+ }
+ filelist->filelist[fidx].image = imb;
+
+ }
+ }
+}
+
+struct ImBuf * BIF_filelist_getimage(struct FileList* filelist, int index)
+{
+ ImBuf* ibuf = NULL;
+ int fidx = 0;
+ if ( (index < 0) || (index >= filelist->numfiltered) ) {
+ return NULL;
+ }
+ fidx = filelist->fidx[index];
+ ibuf = filelist->filelist[fidx].image;
+
+ if (ibuf == NULL) {
+ struct direntry *file = &filelist->filelist[fidx];
+ if (file->type & S_IFDIR) {
+ if ( strcmp(filelist->filelist[fidx].relname, "..") == 0) {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_PARENT];
+ } else if ( strcmp(filelist->filelist[fidx].relname, ".") == 0) {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_REFRESH];
+ } else {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_FOLDER];
+ }
+ } else {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_UNKNOWNFILE];
+ }
+
+ if (file->flags & BLENDERFILE) {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_BLENDFILE];
+ } else if ( (file->flags & MOVIEFILE) || (file->flags & MOVIEFILE_ICON) ) {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_MOVIEFILE];
+ } else if (file->flags & SOUNDFILE) {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_SOUNDFILE];
+ } else if (file->flags & PYSCRIPTFILE) {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_PYTHONFILE];
+ } else if (file->flags & FTFONTFILE) {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_FONTFILE];
+ } else if (file->flags & TEXTFILE) {
+ ibuf = gSpecialFileImages[SPECIAL_IMG_TEXTFILE];
+ }
+ }
+ return ibuf;
+}
+
+struct direntry * BIF_filelist_file(struct FileList* filelist, int index)
+{
+ int fidx = 0;
+
+ if ( (index < 0) || (index >= filelist->numfiltered) ) {
+ return NULL;
+ }
+ fidx = filelist->fidx[index];
+
+ return &filelist->filelist[fidx];
+}
+
+int BIF_filelist_find(struct FileList* filelist, char *file)
+{
+ int index = -1;
+ int i;
+ int fidx = -1;
+
+ if (!filelist->fidx)
+ return fidx;
+
+
+ for (i = 0; i < filelist->numfiles; ++i) {
+ if ( strcmp(filelist->filelist[i].relname, file) == 0) {
+ index = i;
+ break;
+ }
+ }
+
+ for (i = 0; i < filelist->numfiltered; ++i) {
+ if (filelist->fidx[i] == index) {
+ fidx = i;
+ break;
+ }
+ }
+ return fidx;
+}
+
+void BIF_filelist_hidedot(struct FileList* filelist, short hide)
+{
+ filelist->hide_dot = hide;
+}
+
+void BIF_filelist_setfilter(struct FileList* filelist, unsigned int filter)
+{
+ filelist->filter = filter;
+}
+
+void BIF_filelist_readdir(struct FileList* filelist)
+{
+ char wdir[FILE_MAXDIR];
+ int finished = 0;
+
+ if (!filelist) return;
+ filelist->fidx = 0;
+ filelist->filelist = 0;
+
+ if(filelist->type==FILE_MAIN) {
+ BIF_filelist_from_main(filelist);
+ finished = 1;
+ } else if(filelist->type==FILE_LOADLIB) {
+ BLI_cleanup_dir(G.sce, filelist->dir);
+ BIF_filelist_from_library(filelist);
+ if(filelist->libfiledata) {
+ finished = 1;
+ }
+ }
+
+ if (!finished) {
+ BLI_getwdN(wdir);
+
+ BLI_cleanup_dir(G.sce, filelist->dir);
+ BLI_hide_dot_files(filelist->hide_dot);
+ filelist->numfiles = BLI_getdir(filelist->dir, &(filelist->filelist));
+
+ chdir(wdir);
+ BIF_filelist_setfiletypes(filelist, G.have_quicktime);
+ BIF_filelist_filter(filelist);
+
+ }
+}
+
+int BIF_filelist_empty(struct FileList* filelist)
+{
+ return filelist->filelist == 0;
+}
+
+void BIF_filelist_parent(struct FileList* filelist)
+{
+#ifdef WIN32
+ char c = '\\';
+#else
+ char c = '/';
+#endif
+ char *dir = filelist->dir;
+ size_t len = strlen(dir);
+
+ while( (len > 0) && (dir[len-1] == c) )
+ {
+ --len;
+ dir[len] = '\0';
+ }
+ while ( (len > 0) && (dir[len-1] != c) )
+ {
+ --len;
+ dir[len] = '\0';
+ }
+ if (len == 0)
+ {
+ dir[0] = c; dir[1] = '\0';
+ }
+#ifdef WIN32
+ strcat(filelist->dir, "\\");
+#else
+ strcat(filelist->dir, "/");
+#endif
+
+ BLI_cleanup_dir(G.sce, filelist->dir);
+ BLI_make_exist(filelist->dir);
+ BIF_filelist_readdir(filelist);
+}
+
+void BIF_filelist_setfiletypes(struct FileList* filelist, short has_quicktime)
+{
+ struct direntry *file;
+ int num;
+
+ file= filelist->filelist;
+
+ for(num=0; num<filelist->numfiles; num++, file++) {
+ file->flags= 0;
+ file->type= file->s.st_mode; /* restore the mess below */
+
+ /* Don't check extensions for directories */
+ if (file->type & S_IFDIR)
+ continue;
+
+
+
+ if(BLO_has_bfile_extension(file->relname)) {
+ file->flags |= BLENDERFILE;
+ if(filelist->type==FILE_LOADLIB) {
+ char name[FILE_MAXDIR+FILE_MAXFILE];
+ BLI_strncpy(name, filelist->dir, sizeof(name));
+ strcat(name, file->relname);
+
+ /* prevent current file being used as acceptable dir */
+ if (BLI_streq(G.main->name, name)==0) {
+ file->type &= ~S_IFMT;
+ file->type |= S_IFDIR;
+ }
+ }
+ } else if(BLI_testextensie(file->relname, ".py")) {
+ file->flags |= PYSCRIPTFILE;
+ } else if(BLI_testextensie(file->relname, ".txt")) {
+ file->flags |= TEXTFILE;
+ } else if( BLI_testextensie(file->relname, ".ttf")
+ || BLI_testextensie(file->relname, ".ttc")
+ || BLI_testextensie(file->relname, ".pfb")
+ || BLI_testextensie(file->relname, ".otf")
+ || BLI_testextensie(file->relname, ".otc")) {
+ file->flags |= FTFONTFILE;
+ } else if (has_quicktime){
+ if( BLI_testextensie(file->relname, ".int")
+ || BLI_testextensie(file->relname, ".inta")
+ || BLI_testextensie(file->relname, ".jpg")
+ || BLI_testextensie(file->relname, ".jpeg")
+ || BLI_testextensie(file->relname, ".tga")
+ || BLI_testextensie(file->relname, ".rgb")
+ || BLI_testextensie(file->relname, ".rgba")
+ || BLI_testextensie(file->relname, ".bmp")
+ || BLI_testextensie(file->relname, ".png")
+ || BLI_testextensie(file->relname, ".iff")
+ || BLI_testextensie(file->relname, ".lbm")
+ || BLI_testextensie(file->relname, ".gif")
+ || BLI_testextensie(file->relname, ".psd")
+ || BLI_testextensie(file->relname, ".tif")
+ || BLI_testextensie(file->relname, ".tiff")
+ || BLI_testextensie(file->relname, ".pct")
+ || BLI_testextensie(file->relname, ".pict")
+ || BLI_testextensie(file->relname, ".pntg") //macpaint
+ || BLI_testextensie(file->relname, ".qtif")
+ || BLI_testextensie(file->relname, ".sgi")
+#ifdef WITH_DDS
+ || BLI_testextensie(file->relname, ".dds")
+#endif
+#ifdef WITH_OPENEXR
+ || BLI_testextensie(file->relname, ".exr")
+#endif
+ ) {
+ file->flags |= IMAGEFILE;
+ }
+ else if(BLI_testextensie(file->relname, ".avi")
+ || BLI_testextensie(file->relname, ".flc")
+ || BLI_testextensie(file->relname, ".mov")
+ || BLI_testextensie(file->relname, ".movie")
+ || BLI_testextensie(file->relname, ".mp4")
+ || BLI_testextensie(file->relname, ".m4v")
+ || BLI_testextensie(file->relname, ".mv")) {
+ file->flags |= MOVIEFILE;
+ }
+ else if(BLI_testextensie(file->relname, ".wav")) {
+ file->flags |= SOUNDFILE;
+ }
+ } else { // no quicktime
+ if(BLI_testextensie(file->relname, ".int")
+ || BLI_testextensie(file->relname, ".inta")
+ || BLI_testextensie(file->relname, ".jpg")
+ || BLI_testextensie(file->relname, ".tga")
+ || BLI_testextensie(file->relname, ".rgb")
+ || BLI_testextensie(file->relname, ".rgba")
+ || BLI_testextensie(file->relname, ".bmp")
+ || BLI_testextensie(file->relname, ".png")
+ || BLI_testextensie(file->relname, ".iff")
+ || BLI_testextensie(file->relname, ".tif")
+ || BLI_testextensie(file->relname, ".tiff")
+#ifdef WITH_DDS
+ || BLI_testextensie(file->relname, ".dds")
+#endif
+#ifdef WITH_OPENEXR
+ || BLI_testextensie(file->relname, ".exr")
+#endif
+ || BLI_testextensie(file->relname, ".lbm")
+ || BLI_testextensie(file->relname, ".sgi")) {
+ file->flags |= IMAGEFILE;
+ }
+ else if(BLI_testextensie(file->relname, ".avi")
+ || BLI_testextensie(file->relname, ".mp4")
+ || BLI_testextensie(file->relname, ".mv")) {
+ file->flags |= MOVIEFILE;
+ }
+ else if(BLI_testextensie(file->relname, ".wav")) {
+ file->flags |= SOUNDFILE;
+ }
+ }
+ }
+}
+
+void BIF_filelist_swapselect(struct FileList* filelist)
+{
+ struct direntry *file;
+ int num, act= 0;
+
+ file= filelist->filelist;
+ for(num=0; num<filelist->numfiles; num++, file++) {
+ if(file->flags & ACTIVE) {
+ act= 1;
+ break;
+ }
+ }
+ file= filelist->filelist+2;
+ for(num=2; num<filelist->numfiles; num++, file++) {
+ if(act) file->flags &= ~ACTIVE;
+ else file->flags |= ACTIVE;
+ }
+}
+
+int BIF_filelist_islibrary(struct FileList* filelist, char* dir, char* group)
+{
+ /* return ok when a blenderfile, in dir is the filename,
+ * in group the type of libdata
+ */
+ int len;
+ char *fd;
+
+ strcpy(dir, filelist->dir);
+ len= strlen(dir);
+ if(len<7) return 0;
+ if( dir[len-1] != '/' && dir[len-1] != '\\') return 0;
+
+ group[0]= 0;
+ dir[len-1]= 0;
+
+ /* Find the last slash */
+ fd= (strrchr(dir, '/')>strrchr(dir, '\\'))?strrchr(dir, '/'):strrchr(dir, '\\');
+
+ if(fd==0) return 0;
+ *fd= 0;
+ if(BLO_has_bfile_extension(fd+1)) {
+ *fd= '/';
+ }
+ else {
+ char *gp = fd+1; // in case we have a .blend file, gp points to the group
+
+ /* Find the last slash */
+ fd= (strrchr(dir, '/')>strrchr(dir, '\\'))?strrchr(dir, '/'):strrchr(dir, '\\');
+ if (!fd || !BLO_has_bfile_extension(fd+1)) return 0;
+
+ /* now we know that we are in a blend file and it is safe to
+ assume that gp actually points to a group */
+ BLI_strncpy(group, gp, GROUP_MAX);
+ }
+ return 1;
+}
+
+void BIF_filelist_from_library(struct FileList* filelist)
+{
+ LinkNode *l, *names, *previews;
+ struct ImBuf* ima;
+ int ok, i, nnames, idcode;
+ char filename[FILE_MAXDIR+FILE_MAXFILE];
+ char dir[FILE_MAXDIR], group[GROUP_MAX];
+
+ filelist->type = FILE_LOADLIB;
+
+ /* name test */
+ ok= BIF_filelist_islibrary(filelist, dir, group);
+ if (!ok) {
+ /* free */
+ if(filelist->libfiledata) BLO_blendhandle_close(filelist->libfiledata);
+ filelist->libfiledata= 0;
+ return;
+ }
+
+ BLI_strncpy(filename, G.sce, sizeof(filename)); // G.sce = last file loaded, for UI
+
+ /* 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;
+ }
+
+ idcode= BIF_groupname_to_code(group);
+
+ // memory for strings is passed into filelist[i].relname
+ // and free'd in freefilelist
+ previews = NULL;
+ if (idcode) {
+ previews= BLO_blendhandle_get_previews(filelist->libfiledata, idcode);
+ names= BLO_blendhandle_get_datablock_names(filelist->libfiledata, idcode);
+ /* ugh, no rewind, need to reopen */
+ BLO_blendhandle_close(filelist->libfiledata);
+ filelist->libfiledata= BLO_blendhandle_from_file(dir);
+
+ } else {
+ names= BLO_blendhandle_get_linkable_groups(filelist->libfiledata);
+ }
+
+ nnames= BLI_linklist_length(names);
+
+ filelist->numfiles= nnames + 2;
+ filelist->filelist= malloc(filelist->numfiles * sizeof(*filelist->filelist));
+ memset(filelist->filelist, 0, filelist->numfiles * sizeof(*filelist->filelist));
+
+ filelist->filelist[0].relname= BLI_strdup(".");
+ filelist->filelist[0].type |= S_IFDIR;
+ filelist->filelist[1].relname= BLI_strdup("..");
+ filelist->filelist[1].type |= S_IFDIR;
+
+ for (i=0, l= names; i<nnames; i++, l= l->next) {
+ char *blockname= l->link;
+
+ filelist->filelist[i + 2].relname= BLI_strdup(blockname);
+ if (!idcode)
+ filelist->filelist[i + 2].type |= S_IFDIR;
+ }
+
+ if(previews) {
+ for (i=0, l= previews; i<nnames; i++, l= l->next) {
+ PreviewImage *img= l->link;
+
+ if (img) {
+ unsigned int w = img->w[PREVIEW_MIPMAP_LARGE];
+ unsigned int h = img->h[PREVIEW_MIPMAP_LARGE];
+ unsigned int *rect = img->rect[PREVIEW_MIPMAP_LARGE];
+
+ /* first allocate imbuf for copying preview into it */
+ if (w > 0 && h > 0 && rect) {
+ ima = IMB_allocImBuf(w, h, 32, IB_rect, 0);
+ memcpy(ima->rect, rect, w*h*sizeof(unsigned int));
+ filelist->filelist[i + 2].image = ima;
+ filelist->filelist[i + 2].flags = IMAGEFILE;
+ }
+ }
+ }
+ }
+
+ BLI_linklist_free(names, free);
+ if (previews) BLI_linklist_free(previews, (void(*)(void*)) MEM_freeN);
+
+ BIF_filelist_sort(filelist, FILE_SORTALPHA);
+
+ BLI_strncpy(G.sce, filename, sizeof(filename)); // prevent G.sce to change
+
+ filelist->filter = 0;
+ BIF_filelist_filter(filelist);
+}
+
+void BIF_filelist_append_library(struct FileList *filelist, char *dir, char *file, short flag, int idcode)
+{
+ BLO_library_append_(&filelist->libfiledata, filelist->filelist, filelist->numfiles, dir, file, flag, idcode);
+}
+
+void BIF_filelist_from_main(struct FileList *filelist)
+{
+ ID *id;
+ struct direntry *files, *firstlib = NULL;
+ ListBase *lb;
+ int a, fake, idcode, ok, totlib, totbl;
+
+ filelist->type = FILE_MAIN;
+
+ if(filelist->dir[0]=='/') filelist->dir[0]= 0;
+
+ if(filelist->dir[0]) {
+ idcode= BIF_groupname_to_code(filelist->dir);
+ if(idcode==0) filelist->dir[0]= 0;
+ }
+
+ if( filelist->dir[0]==0) {
+
+ /* make directories */
+ filelist->numfiles= 23;
+ filelist->filelist= (struct direntry *)malloc(filelist->numfiles * sizeof(struct direntry));
+
+ for(a=0; a<filelist->numfiles; a++) {
+ memset( &(filelist->filelist[a]), 0 , sizeof(struct direntry));
+ filelist->filelist[a].type |= S_IFDIR;
+ }
+
+ filelist->filelist[0].relname= BLI_strdup("..");
+ filelist->filelist[1].relname= BLI_strdup(".");
+ filelist->filelist[2].relname= BLI_strdup("Scene");
+ filelist->filelist[3].relname= BLI_strdup("Object");
+ filelist->filelist[4].relname= BLI_strdup("Mesh");
+ filelist->filelist[5].relname= BLI_strdup("Curve");
+ filelist->filelist[6].relname= BLI_strdup("Metaball");
+ filelist->filelist[7].relname= BLI_strdup("Material");
+ filelist->filelist[8].relname= BLI_strdup("Texture");
+ filelist->filelist[9].relname= BLI_strdup("Image");
+ filelist->filelist[10].relname= BLI_strdup("Ika");
+ filelist->filelist[11].relname= BLI_strdup("Wave");
+ filelist->filelist[12].relname= BLI_strdup("Lattice");
+ filelist->filelist[13].relname= BLI_strdup("Lamp");
+ filelist->filelist[14].relname= BLI_strdup("Camera");
+ filelist->filelist[15].relname= BLI_strdup("Ipo");
+ filelist->filelist[16].relname= BLI_strdup("World");
+ filelist->filelist[17].relname= BLI_strdup("Screen");
+ filelist->filelist[18].relname= BLI_strdup("VFont");
+ filelist->filelist[19].relname= BLI_strdup("Text");
+ filelist->filelist[20].relname= BLI_strdup("Armature");
+ filelist->filelist[21].relname= BLI_strdup("Action");
+ filelist->filelist[22].relname= BLI_strdup("NodeTree");
+ BIF_filelist_sort(filelist, FILE_SORTALPHA);
+ }
+ else {
+
+ /* make files */
+ idcode= BIF_groupname_to_code(filelist->dir);
+
+ lb= wich_libbase(G.main, idcode );
+ if(lb==0) return;
+
+ id= lb->first;
+ filelist->numfiles= 0;
+ while(id) {
+
+ if(filelist->has_func && idcode==ID_IP) {
+ if(filelist->ipotype== ((Ipo *)id)->blocktype) filelist->numfiles++;
+ }
+ else if (!filelist->hide_dot || id->name[2] != '.') {
+ filelist->numfiles++;
+ }
+
+ id= id->next;
+ }
+
+ if(!filelist->has_func) filelist->numfiles+= 2;
+ filelist->filelist= (struct direntry *)malloc(filelist->numfiles * sizeof(struct direntry));
+
+ files = filelist->filelist;
+
+ if(!filelist->has_func) {
+ memset( &(filelist->filelist[0]), 0 , sizeof(struct direntry));
+ filelist->filelist[0].relname= BLI_strdup(".");
+ filelist->filelist[0].type |= S_IFDIR;
+ memset( &(filelist->filelist[1]), 0 , sizeof(struct direntry));
+ filelist->filelist[1].relname= BLI_strdup("..");
+ filelist->filelist[1].type |= S_IFDIR;
+
+ files+= 2;
+ }
+
+ id= lb->first;
+ totlib= totbl= 0;
+
+ while(id) {
+
+ ok= 0;
+ if(filelist->has_func && idcode==ID_IP) {
+ if(filelist->ipotype== ((Ipo *)id)->blocktype) ok= 1;
+ }
+ else ok= 1;
+
+ if(ok) {
+ /* TODO: hide dot files - elubie */
+ memset( files, 0 , sizeof(struct direntry));
+ if(id->lib==NULL)
+ files->relname= BLI_strdup(id->name+2);
+ else {
+ 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; */
+ if(!filelist->has_func) { /* F4 DATA BROWSE */
+ if(idcode==ID_OB) {
+ if( ((Object *)id)->flag & SELECT) files->flags |= ACTIVE;
+ }
+ else if(idcode==ID_SCE) {
+ if( ((Scene *)id)->r.scemode & R_BG_RENDER) files->flags |= ACTIVE;
+ }
+ }
+ files->nr= totbl+1;
+ files->poin= id;
+ fake= id->flag & LIB_FAKEUSER;
+ if(idcode == ID_MA || idcode == ID_TE || idcode == ID_LA || idcode == ID_WO || idcode == ID_IM) {
+ files->flags |= IMAGEFILE;
+ }
+ if(id->lib && fake) sprintf(files->extra, "LF %d", id->us);
+ else if(id->lib) sprintf(files->extra, "L %d", id->us);
+ else if(fake) sprintf(files->extra, "F %d", id->us);
+ else sprintf(files->extra, " %d", id->us);
+
+ if(id->lib) {
+ if(totlib==0) firstlib= files;
+ totlib++;
+ }
+
+ files++;
+ totbl++;
+ }
+
+ id= id->next;
+ }
+
+ /* only qsort of library blocks */
+ if(totlib>1) {
+ qsort(firstlib, totlib, sizeof(struct direntry), compare_name);
+ }
+ }
+ filelist->filter = 0;
+ BIF_filelist_filter(filelist);
+}
+
+
+void BIF_filelist_settype(struct FileList* filelist, int type)
+{
+ filelist->type = type;
+}
+
+short BIF_filelist_gettype(struct FileList* filelist)
+{
+ return filelist->type;
+}
+
+void BIF_filelist_sort(struct FileList* filelist, short sort)
+{
+ struct direntry *file;
+ int num;/* , act= 0; */
+
+ switch(sort) {
+ case FILE_SORTALPHA:
+ qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_name);
+ break;
+ case FILE_SORTDATE:
+ qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_date);
+ break;
+ case FILE_SORTSIZE:
+ qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_size);
+ break;
+ case FILE_SORTEXTENS:
+ qsort(filelist->filelist, filelist->numfiles, sizeof(struct direntry), compare_extension);
+ }
+
+ file= filelist->filelist;
+ for(num=0; num<filelist->numfiles; num++, file++) {
+ file->flags &= ~HILITE;
+ }
+ BIF_filelist_filter(filelist);
+}
+
+
+void BIF_filelist_setipotype(struct FileList* filelist, short ipotype)
+{
+ filelist->ipotype = ipotype;
+}
+
+void BIF_filelist_hasfunc(struct FileList* filelist, int has_func)
+{
+ filelist->has_func = has_func;
+}
+
diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c
index 025ee86e563..599c6d5aae2 100644
--- a/source/blender/src/filesel.c
+++ b/source/blender/src/filesel.c
@@ -86,6 +86,7 @@
#include "BKE_utildefines.h"
#include "BIF_editview.h"
+#include "BIF_filelist.h"
#include "BIF_gl.h"
#include "BIF_interface.h"
#include "BIF_language.h"
@@ -111,15 +112,18 @@
#include "BIF_fsmenu.h" /* include ourselves */
-#if defined WITH_ICONV
- #include "iconv.h"
+#ifdef INTERNATIONAL
+#include "FTF_Api.h"
#endif
-#if defined WIN32 || defined __BeOS
-int fnmatch(const char *pattern, const char *string, int flags)
+#if defined __BeOS
+static int fnmatch(const char *pattern, const char *string, int flags)
{
return 0;
}
+#elif defined WIN32 && !defined _LIBC
+ /* use fnmatch included in blenlib */
+ #include "BLI_fnmatch.h"
#else
#include <fnmatch.h>
#endif
@@ -170,155 +174,6 @@ static float pixels_to_ofs;
static char otherdir[FILE_MAX];
static ScrArea *otherarea;
-/* FSMENU HANDLING */
-
- /* FSMenuEntry's without paths indicate seperators */
-typedef struct _FSMenuEntry FSMenuEntry;
-struct _FSMenuEntry {
- FSMenuEntry *next;
-
- char *path;
-};
-
-static FSMenuEntry *fsmenu= 0;
-
-int fsmenu_get_nentries(void)
-{
- FSMenuEntry *fsme;
- int count= 0;
-
- for (fsme= fsmenu; fsme; fsme= fsme->next)
- count++;
-
- return count;
-}
-int fsmenu_is_entry_a_seperator(int idx)
-{
- FSMenuEntry *fsme;
-
- for (fsme= fsmenu; fsme && idx; fsme= fsme->next)
- idx--;
-
- return (fsme && !fsme->path)?1:0;
-}
-char *fsmenu_get_entry(int idx)
-{
- FSMenuEntry *fsme;
-
- for (fsme= fsmenu; fsme && idx; fsme= fsme->next)
- idx--;
-
- return fsme?fsme->path:NULL;
-}
-char *fsmenu_build_menu(void)
-{
- DynStr *ds= BLI_dynstr_new();
- FSMenuEntry *fsme;
- char *menustr;
-
- for (fsme= fsmenu; fsme; fsme= fsme->next) {
- if (!fsme->path) {
- /* clean consecutive seperators and ignore trailing ones */
- if (fsme->next) {
- if (fsme->next->path) {
- BLI_dynstr_append(ds, "%l|");
- } else {
- FSMenuEntry *next= fsme->next;
- fsme->next= next->next;
- MEM_freeN(next);
- }
- }
- } else {
- BLI_dynstr_append(ds, fsme->path);
- if (fsme->next) BLI_dynstr_append(ds, "|");
- }
- }
-
- menustr= BLI_dynstr_get_cstring(ds);
- BLI_dynstr_free(ds);
- return menustr;
-}
-static FSMenuEntry *fsmenu_get_last_separator(void)
-{
- FSMenuEntry *fsme, *lsep=NULL;
-
- for (fsme= fsmenu; fsme; fsme= fsme->next)
- if (!fsme->path)
- lsep= fsme;
-
- return lsep;
-}
-void fsmenu_insert_entry(char *path, int sorted)
-{
- FSMenuEntry *prev= fsmenu_get_last_separator();
- FSMenuEntry *fsme= prev?prev->next:fsmenu;
-
- for (; fsme; prev= fsme, fsme= fsme->next) {
- if (fsme->path) {
- if (BLI_streq(path, fsme->path)) {
- return;
- } else if (sorted && strcmp(path, fsme->path)<0) {
- break;
- }
- }
- }
-
- fsme= MEM_mallocN(sizeof(*fsme), "fsme");
- fsme->path= BLI_strdup(path);
-
- if (prev) {
- fsme->next= prev->next;
- prev->next= fsme;
- } else {
- fsme->next= fsmenu;
- fsmenu= fsme;
- }
-}
-void fsmenu_append_seperator(void)
-{
- if (fsmenu) {
- FSMenuEntry *fsme= fsmenu;
-
- while (fsme->next) fsme= fsme->next;
-
- fsme->next= MEM_mallocN(sizeof(*fsme), "fsme");
- fsme->next->next= NULL;
- fsme->next->path= NULL;
- }
-}
-void fsmenu_remove_entry(int idx)
-{
- FSMenuEntry *prev= NULL, *fsme= fsmenu;
-
- for (fsme= fsmenu; fsme && idx; prev= fsme, fsme= fsme->next)
- if (fsme->path)
- idx--;
-
- if (fsme) {
- if (prev) {
- prev->next= fsme->next;
- } else {
- fsmenu= fsme->next;
- }
-
- MEM_freeN(fsme->path);
- MEM_freeN(fsme);
- }
-}
-void fsmenu_free(void)
-{
- FSMenuEntry *fsme= fsmenu;
-
- while (fsme) {
- FSMenuEntry *n= fsme->next;
-
- if (fsme->path) MEM_freeN(fsme->path);
- MEM_freeN(fsme);
-
- fsme= n;
- }
-}
-
/* ******************* SORT ******************* */
static int compare_name(const void *a1, const void *a2)
@@ -511,7 +366,7 @@ void test_flags_file(SpaceFile *sfile)
}
}
}
- } else if (sfile->type==FILE_SPECIAL){
+ } else if (sfile->type==FILE_SPECIAL || sfile->type==FILE_LOADFONT){
if(BLI_testextensie(file->relname, ".py")) {
file->flags |= PYSCRIPTFILE;
} else if( BLI_testextensie(file->relname, ".ttf")
@@ -535,6 +390,9 @@ void test_flags_file(SpaceFile *sfile)
|| BLI_testextensie(file->relname, ".rgb")
|| BLI_testextensie(file->relname, ".bmp")
|| BLI_testextensie(file->relname, ".png")
+#ifdef WITH_DDS
+ || BLI_testextensie(file->relname, ".dds")
+#endif
|| BLI_testextensie(file->relname, ".iff")
|| BLI_testextensie(file->relname, ".lbm")
|| BLI_testextensie(file->relname, ".gif")
@@ -566,6 +424,9 @@ void test_flags_file(SpaceFile *sfile)
|| BLI_testextensie(file->relname, ".rgb")
|| BLI_testextensie(file->relname, ".bmp")
|| BLI_testextensie(file->relname, ".png")
+#ifdef WITH_DDS
+ || BLI_testextensie(file->relname, ".dds")
+#endif
|| BLI_testextensie(file->relname, ".iff")
|| BLI_testextensie(file->relname, ".lbm")
|| BLI_testextensie(file->relname, ".cin")
@@ -896,32 +757,6 @@ static void linerect(int id, int x, int y)
}
-#ifdef WITH_ICONV
-static void string_to_utf8(char *original, char *utf_8, char *code)
-{
- size_t inbytesleft=strlen(original);
- size_t outbytesleft=512;
- size_t rv=0;
- iconv_t cd;
-
- cd=iconv_open("UTF-8", code);
-
- if (cd == (iconv_t)(-1)) {
- printf("iconv_open Error");
- *utf_8='\0';
- return ;
- }
- rv=iconv(cd, &original, &inbytesleft, &utf_8, &outbytesleft);
- if (rv == (size_t) -1) {
- printf("iconv Error\n");
- return ;
- }
- *utf_8 = '\0';
- iconv_close(cd);
-}
-#endif
-
-
static void print_line(SpaceFile *sfile, struct direntry *files, int x, int y)
{
int boxcol=0;
@@ -972,25 +807,24 @@ static void print_line(SpaceFile *sfile, struct direntry *files, int x, int y)
#ifdef WITH_ICONV
{
struct LANGMenuEntry *lme;
- char utf_8[512];
-
- lme = find_language(U.language);
-
- if (!strcmp(lme->code, "ja_JP")) { /* japanese */
- string_to_utf8(files->relname, utf_8, "Shift_JIS");
- BIF_RasterPos((float)x, (float)y); /* texture fonts */
- BIF_DrawString(G.font, utf_8, (U.transopts & USER_TR_MENUS));
- } else if (!strcmp(lme->code, "zh_CN")) { /* chinese */
- string_to_utf8(files->relname, utf_8, "gb2312");
- BIF_RasterPos((float)x, (float)y); /* texture fonts */
- BIF_DrawString(G.font, utf_8, (U.transopts & USER_TR_MENUS));
+ lme = find_language(U.language);
+
+ if ((lme !=NULL) && (!strcmp(lme->code, "ja_JP") ||
+ !strcmp(lme->code, "zh_CN")))
+ {
+ BIF_RasterPos((float)x, (float)y);
+#ifdef WIN32
+ BIF_DrawString(G.font, files->relname, ((U.transopts & USER_TR_MENUS) | CONVERT_TO_UTF8));
+#else
+ BIF_DrawString(G.font, files->relname, (U.transopts & USER_TR_MENUS));
+#endif
} else {
BMF_DrawString(G.font, files->relname);
}
}
#else
BMF_DrawString(G.font, files->relname);
-#endif
+#endif /* WITH_ICONV */
x += sfile->maxnamelen + 100;
@@ -1208,7 +1042,7 @@ void drawfilespace(ScrArea *sa, void *spacedata)
else loadbutton= 0;
uiBlockBeginAlign(block);
- uiDefBut(block, TEX, B_FS_DIRNAME,"", textrct.xmin + (strp?20:0), filebuty2, textrct.xmax-textrct.xmin-loadbutton - (strp?20:0), 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "Directory, enter a directory and press enter to create it"); /* Directory input */
+ uiDefBut(block, TEX, B_FS_DIRNAME,"", textrct.xmin + (strp?20:0), filebuty2, textrct.xmax-textrct.xmin-loadbutton - (strp?20:0), 21, sfile->dir, 0.0, (float)FILE_MAXDIR-1, 0, 0, "Directory, enter a directory and press enter to create it"); /* Directory input */
if(loadbutton) {
uiSetCurFont(block, UI_HELV);
uiDefBut(block, BUT, B_FS_LOAD, sfile->title, textrct.xmax-loadbutton, filebuty2, loadbutton, 21, sfile->dir, 0.0, (float)FILE_MAXFILE-1, 0, 0, "");
@@ -1358,8 +1192,10 @@ static void activate_fileselect_(int type, char *title, char *file, short *menup
/* sfile->act is used for databrowse: double names of library objects */
sfile->act= -1;
- if(BLI_convertstringcode(name, G.sce, G.scene->r.cfra)) sfile->flag |= FILE_STRINGCODE;
- else sfile->flag &= ~FILE_STRINGCODE;
+ if(G.relbase_valid && BLI_convertstringcode(name, G.sce, G.scene->r.cfra))
+ sfile->flag |= FILE_STRINGCODE;
+ else
+ sfile->flag &= ~FILE_STRINGCODE;
if (U.uiflag & USER_HIDE_DOT)
sfile->flag |= FILE_HIDE_DOT;
@@ -1393,7 +1229,7 @@ static void activate_fileselect_(int type, char *title, char *file, short *menup
sfile->libfiledata= NULL;
}
}
- else { /* FILE_BLENDER */
+ else { /* FILE_BLENDER or FILE_LOADFONT */
split_sfile(sfile, name); /* test filelist too */
BLI_cleanup_dir(G.sce, sfile->dir);
@@ -1420,41 +1256,6 @@ void activate_fileselect_args(int type, char *title, char *file, void (*func)(ch
activate_fileselect_(type, title, file, NULL, NULL, NULL, NULL, func, arg1, arg2);
}
-
-void activate_imageselect(int type, char *title, char *file, void (*func)(char *))
-{
- SpaceImaSel *simasel;
- char dir[FILE_MAX], name[FILE_MAX];
-
- if(curarea==NULL) return;
- if(curarea->win==0) return;
-
- newspace(curarea, SPACE_IMASEL);
-
- /* sometimes double, when area is already SPACE_FILE with a different file name */
- addqueue(curarea->headwin, CHANGED, 1);
- addqueue(curarea->win, CHANGED, 1);
-
- name[2]= 0;
- BLI_strncpy(name, file, sizeof(name));
-
- simasel= curarea->spacedata.first;
- simasel->returnfunc= func;
-
- if(BLI_convertstringcode(name, G.sce, G.scene->r.cfra)) simasel->mode |= IMS_STRINGCODE;
- else simasel->mode &= ~IMS_STRINGCODE;
-
- BLI_split_dirfile(name, dir, simasel->file);
- BLI_cleanup_dir(G.sce, simasel->dir);
- if(strcmp(dir, simasel->dir)!=0) simasel->fase= 0;
-
- BLI_strncpy(simasel->dir, dir, sizeof(simasel->dir));
- BLI_strncpy(simasel->title, title, sizeof(simasel->title));
-
- /* filetoname= 1; */
-}
-
-
void activate_databrowse(ID *id, int idcode, int fromcode, int retval, short *menup, void (*func)(unsigned short))
{
ListBase *lb;
@@ -1624,7 +1425,7 @@ static void filesel_execute(SpaceFile *sfile)
allqueue(REDRAWALL, 1);
}
else if(filesel_has_func(sfile)) {
- fsmenu_insert_entry(sfile->dir, 1);
+ fsmenu_insert_entry(sfile->dir, 1, 0);
if(sfile->type==FILE_MAIN) { /* DATABROWSE */
if (sfile->menup) { /* with value pointing to ID block index */
@@ -1682,8 +1483,18 @@ static void filesel_execute(SpaceFile *sfile)
if(sfile->flag & FILE_STRINGCODE) {
/* still weak, but we don't want saving files to make relative paths */
- if(strncmp(sfile->title, "Save", 4))
+ if(G.relbase_valid && strncmp(sfile->title, "Save", 4)) {
BLI_makestringcode(G.sce, name);
+ } else {
+ /* if we don't have a valid relative base (.blend file hasn't been saved yet)
+ then we don't save the path as relative (for texture images, background image).
+ Warning message not shown when saving files (doesn't make sense there)
+ */
+ if (strncmp(sfile->title, "Save", 4)) {
+ printf("Relative path setting has been ignored because .blend file hasn't been saved yet.\n");
+ }
+ sfile->flag &= ~FILE_STRINGCODE;
+ }
}
if(sfile->returnfunc)
sfile->returnfunc(name);
@@ -2035,17 +1846,34 @@ void winqreadfilespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if(act>=0 && act<sfile->totfile) {
if(S_ISDIR(sfile->filelist[act].type)) {
- strcat(sfile->dir, sfile->filelist[act].relname);
- strcat(sfile->dir,"/");
- BLI_cleanup_dir(G.sce, sfile->dir);
- freefilelist(sfile);
- sfile->ofs= 0;
- do_draw= 1;
+ /* the path is too long and we are not going up! */
+ if (strcmp(sfile->filelist[act].relname, ".") &&
+ strcmp(sfile->filelist[act].relname, "..") &&
+ strlen(sfile->dir) + strlen(sfile->filelist[act].relname) >= FILE_MAXDIR )
+ {
+ error("Path too long, cannot enter this directory");
+ } else {
+ strcat(sfile->dir, sfile->filelist[act].relname);
+ strcat(sfile->dir,"/");
+ BLI_cleanup_dir(G.sce, sfile->dir);
+ freefilelist(sfile);
+ sfile->ofs= 0;
+ do_draw= 1;
+ }
}
else {
if( strcmp(sfile->file, sfile->filelist[act].relname)) {
+ char tmpstr[240];
do_draw= 1;
BLI_strncpy(sfile->file, sfile->filelist[act].relname, sizeof(sfile->file));
+ if (sfile->f_fp) {
+ sprintf (tmpstr, "%s%s", sfile->dir, sfile->file);
+ /* printf ("%s\n", tmpstr); */
+ #ifdef INTERNATIONAL
+ if (!FTF_GetNewFont ((const unsigned char *)tmpstr, 0, U.fontsize))
+ error ("No font file");
+ #endif
+ }
}
if(event==MIDDLEMOUSE && sfile->type) filesel_execute(sfile);
}
@@ -2373,7 +2201,8 @@ static int is_a_library(SpaceFile *sfile, char *dir, char *group)
/* now we know that we are in a blend file and it is safe to
assume that gp actually points to a group */
- BLI_strncpy(group, gp, GROUP_MAX);
+ if (BLI_streq("Screen", gp)==0)
+ BLI_strncpy(group, gp, GROUP_MAX);
}
return 1;
}
diff --git a/source/blender/src/fluidsim.c b/source/blender/src/fluidsim.c
index 3eae54b3482..e9609d40570 100644
--- a/source/blender/src/fluidsim.c
+++ b/source/blender/src/fluidsim.c
@@ -226,8 +226,8 @@ static Mesh *fluidsimCopyMesh(Mesh *me)
Mesh *dup = MEM_dupallocN(me);
CustomData_copy(&me->vdata, &dup->vdata, CD_MASK_MESH, CD_DUPLICATE, me->totvert);
- CustomData_copy(&me->vdata, &dup->vdata, CD_MASK_MESH, CD_DUPLICATE, me->totvert);
- CustomData_copy(&me->vdata, &dup->vdata, CD_MASK_MESH, CD_DUPLICATE, me->totvert);
+ CustomData_copy(&me->edata, &dup->edata, CD_MASK_MESH, CD_DUPLICATE, me->totedge);
+ CustomData_copy(&me->fdata, &dup->fdata, CD_MASK_MESH, CD_DUPLICATE, me->totface);
return dup;
}
diff --git a/source/blender/src/fsmenu.c b/source/blender/src/fsmenu.c
new file mode 100644
index 00000000000..319fb8de48f
--- /dev/null
+++ b/source/blender/src/fsmenu.c
@@ -0,0 +1,257 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "BMF_Api.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_linklist.h"
+#include "BLI_dynstr.h"
+#include "BIF_usiblender.h"
+
+
+#include "BIF_fsmenu.h" /* include ourselves */
+
+
+/* FSMENU HANDLING */
+
+ /* FSMenuEntry's without paths indicate seperators */
+typedef struct _FSMenuEntry FSMenuEntry;
+struct _FSMenuEntry {
+ FSMenuEntry *next;
+
+ char *path;
+ short save;
+};
+
+static FSMenuEntry *fsmenu= 0;
+
+int fsmenu_get_nentries(void)
+{
+ FSMenuEntry *fsme;
+ int count= 0;
+
+ for (fsme= fsmenu; fsme; fsme= fsme->next)
+ count++;
+
+ return count;
+}
+int fsmenu_is_entry_a_seperator(int idx)
+{
+ FSMenuEntry *fsme;
+
+ for (fsme= fsmenu; fsme && idx; fsme= fsme->next)
+ idx--;
+
+ return (fsme && !fsme->path)?1:0;
+}
+char *fsmenu_get_entry(int idx)
+{
+ FSMenuEntry *fsme;
+
+ for (fsme= fsmenu; fsme && idx; fsme= fsme->next)
+ idx--;
+
+ return fsme?fsme->path:NULL;
+}
+char *fsmenu_build_menu(void)
+{
+ DynStr *ds= BLI_dynstr_new();
+ FSMenuEntry *fsme;
+ char *menustr;
+
+ for (fsme= fsmenu; fsme; fsme= fsme->next) {
+ if (!fsme->path) {
+ /* clean consecutive seperators and ignore trailing ones */
+ if (fsme->next) {
+ if (fsme->next->path) {
+ BLI_dynstr_append(ds, "%l|");
+ } else {
+ FSMenuEntry *next= fsme->next;
+ fsme->next= next->next;
+ MEM_freeN(next);
+ }
+ }
+ } else {
+ if (fsme->save) {
+ BLI_dynstr_append(ds, "o ");
+ } else {
+ BLI_dynstr_append(ds, " ");
+ }
+ BLI_dynstr_append(ds, fsme->path);
+ if (fsme->next) BLI_dynstr_append(ds, "|");
+ }
+ }
+
+ menustr= BLI_dynstr_get_cstring(ds);
+ BLI_dynstr_free(ds);
+ return menustr;
+}
+static FSMenuEntry *fsmenu_get_last_separator(void)
+{
+ FSMenuEntry *fsme, *lsep=NULL;
+
+ for (fsme= fsmenu; fsme; fsme= fsme->next)
+ if (!fsme->path)
+ lsep= fsme;
+
+ return lsep;
+}
+
+static FSMenuEntry *fsmenu_get_first_separator(void)
+{
+ FSMenuEntry *fsme, *lsep=NULL;
+
+ for (fsme= fsmenu; fsme; fsme= fsme->next)
+ if (!fsme->path) {
+ lsep= fsme;
+ break;
+ }
+
+ return lsep;
+}
+
+void fsmenu_insert_entry(char *path, int sorted, short save)
+{
+ FSMenuEntry *prev;
+ FSMenuEntry *fsme;
+
+ if (save) {
+ prev = fsmenu_get_first_separator();
+ } else {
+ prev = fsmenu_get_last_separator();
+ }
+ fsme= prev?prev->next:fsmenu;
+
+ for (; fsme; prev= fsme, fsme= fsme->next) {
+ if (fsme->path) {
+ if (BLI_streq(path, fsme->path)) {
+ return;
+ } else if (sorted && strcmp(path, fsme->path)<0) {
+ break;
+ }
+ } else {
+ // if we're bookmarking this, file should come
+ // before the last separator, only automatically added
+ // current dir go after the last sep.
+ if (save) {
+ break;
+ }
+ }
+ }
+
+ fsme= MEM_mallocN(sizeof(*fsme), "fsme");
+ fsme->path= BLI_strdup(path);
+ fsme->save = save;
+
+ if (prev) {
+ fsme->next= prev->next;
+ prev->next= fsme;
+ } else {
+ fsme->next= fsmenu;
+ fsmenu= fsme;
+ }
+}
+void fsmenu_append_separator(void)
+{
+ if (fsmenu) {
+ FSMenuEntry *fsme= fsmenu;
+
+ while (fsme->next) fsme= fsme->next;
+
+ fsme->next= MEM_mallocN(sizeof(*fsme), "fsme");
+ fsme->next->next= NULL;
+ fsme->next->path= NULL;
+ }
+}
+void fsmenu_remove_entry(int idx)
+{
+ FSMenuEntry *prev= NULL, *fsme= fsmenu;
+
+ for (fsme= fsmenu; fsme && idx; prev= fsme, fsme= fsme->next)
+ idx--;
+
+ if (fsme) {
+ /* you should only be able to remove entries that were
+ not added by default, like windows drives.
+ also separators (where path == NULL) shouldn't be removed */
+ if (fsme->save && fsme->path) {
+
+ /* remove fsme from list */
+ if (prev) {
+ prev->next= fsme->next;
+ } else {
+ fsmenu= fsme->next;
+ }
+ /* free entry */
+ MEM_freeN(fsme->path);
+ MEM_freeN(fsme);
+ }
+ }
+}
+
+void fsmenu_write_file(const char *filename)
+{
+ FSMenuEntry *fsme= fsmenu;
+
+ FILE *fp = fopen(filename, "w");
+ if (!fp) return;
+
+ for (fsme= fsmenu; fsme; fsme= fsme->next) {
+ if (fsme->path && fsme->save) {
+ fprintf(fp, "%s\n", fsme->path);
+ }
+ }
+ fclose(fp);
+}
+
+void fsmenu_free(void)
+{
+ FSMenuEntry *fsme= fsmenu;
+
+ while (fsme) {
+ FSMenuEntry *n= fsme->next;
+
+ if (fsme->path) MEM_freeN(fsme->path);
+ MEM_freeN(fsme);
+
+ fsme= n;
+ }
+}
+
+
+
diff --git a/source/blender/src/ghostwinlay.c b/source/blender/src/ghostwinlay.c
index 4a76d2d292f..597a23a20d7 100644
--- a/source/blender/src/ghostwinlay.c
+++ b/source/blender/src/ghostwinlay.c
@@ -63,6 +63,8 @@
#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#define __CARBONSOUND__
+ /* XXX BIG WARNING: carbon.h should not be included in blender/src code, it conflicts with struct ID */
+#define ID ID_
#include <Carbon/Carbon.h>
/*declarations*/
diff --git a/source/blender/src/glutil.c b/source/blender/src/glutil.c
index 248d36dcb1e..13922bb7eef 100644
--- a/source/blender/src/glutil.c
+++ b/source/blender/src/glutil.c
@@ -50,6 +50,11 @@
#include "BIF_glutil.h"
#include "BIF_mywindow.h"
+#ifndef GL_CLAMP_TO_EDGE
+#define GL_CLAMP_TO_EDGE 0x812F
+#endif
+
+
/* Invert line handling */
#define glToggle(mode, onoff) (((onoff)?glEnable:glDisable)(mode))
@@ -263,10 +268,17 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *
int nsubparts_x= (img_w+(tex_w-1))/tex_w;
int nsubparts_y= (img_h+(tex_h-1))/tex_h;
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ /* Specify the color outside this function, and tex will modulate it.
+ * This is useful for changing alpha without using glPixelTransferf()
+ */
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glPixelStorei(GL_UNPACK_ROW_LENGTH, img_w);
glBindTexture(GL_TEXTURE_2D, texid);
+ /* don't want nasty border artifacts */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
for (subpart_y=0; subpart_y<nsubparts_y; subpart_y++) {
for (subpart_x=0; subpart_x<nsubparts_x; subpart_x++) {
int subpart_w= (subpart_x==nsubparts_x-1)?(img_w-subpart_x*tex_w):tex_w;
@@ -278,17 +290,16 @@ void glaDrawPixelsTex(float x, float y, int img_w, int img_h, int format, void *
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_FLOAT, &f_rect[(subpart_y*tex_w)*img_w*4 + (subpart_x*tex_w)*4]);
else
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, subpart_w, subpart_h, GL_RGBA, GL_UNSIGNED_BYTE, &uc_rect[(subpart_y*tex_w)*img_w*4 + (subpart_x*tex_w)*4]);
-
- glColor3ub(255, 255, 255);
+
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(rast_x, rast_y);
- glTexCoord2f((float) subpart_w/tex_w, 0);
+ glTexCoord2f((float) (subpart_w-1)/tex_w, 0);
glVertex2f(rast_x+subpart_w*xzoom, rast_y);
- glTexCoord2f((float) subpart_w/tex_w, (float) subpart_h/tex_h);
+ glTexCoord2f((float) (subpart_w-1)/tex_w, (float) subpart_h/tex_h);
glVertex2f(rast_x+subpart_w*xzoom, rast_y+subpart_h*yzoom);
glTexCoord2f(0, (float) subpart_h/tex_h);
diff --git a/source/blender/src/hddaudio.c b/source/blender/src/hddaudio.c
index 0b1989dc6d0..b655671a051 100644
--- a/source/blender/src/hddaudio.c
+++ b/source/blender/src/hddaudio.c
@@ -200,7 +200,7 @@ struct hdaudio * sound_copy_hdaudio(struct hdaudio * c)
#endif
}
-long sound_hdaudio_get_duration(struct hdaudio * hdaudio, int frame_rate)
+long sound_hdaudio_get_duration(struct hdaudio * hdaudio, double frame_rate)
{
#ifdef WITH_FFMPEG
return hdaudio->pFormatCtx->duration * frame_rate / AV_TIME_BASE;
diff --git a/source/blender/src/header_action.c b/source/blender/src/header_action.c
index 340a8008883..4a803926a94 100644
--- a/source/blender/src/header_action.c
+++ b/source/blender/src/header_action.c
@@ -30,7 +30,7 @@
*
* The Original Code is: all of this file.
*
- * Contributor(s): none yet.
+ * Contributor(s): 2007, Joshua Leung (Action Editor recode)
*
* ***** END GPL/BL DUAL LICENSE BLOCK *****
*/
@@ -79,82 +79,110 @@
#include "blendef.h"
#include "mydevice.h"
-#define ACTMENU_VIEW_CENTERVIEW 0
-#define ACTMENU_VIEW_AUTOUPDATE 1
-#define ACTMENU_VIEW_PLAY3D 2
-#define ACTMENU_VIEW_PLAYALL 3
-#define ACTMENU_VIEW_ALL 4
-#define ACTMENU_VIEW_MAXIMIZE 5
-#define ACTMENU_VIEW_LOCK 6
-#define ACTMENU_VIEW_SLIDERS 7
-#define ACTMENU_VIEW_NEXTMARKER 8
-#define ACTMENU_VIEW_PREVMARKER 9
-
-#define ACTMENU_SEL_BORDER 0
-#define ACTMENU_SEL_BORDERM 1
-#define ACTMENU_SEL_ALL_KEYS 2
-#define ACTMENU_SEL_ALL_CHAN 3
-#define ACTMENU_SEL_ALL_MARKERS 4
-#define ACTMENU_SEL_INVERSE_KEYS 5
-#define ACTMENU_SEL_INVERSE_MARKERS 6
-
-#define ACTMENU_SEL_COLUMN_KEYS 1
-#define ACTMENU_SEL_COLUMN_MARKERSCOLUMN 2
-#define ACTMENU_SEL_COLUMN_MARKERSBETWEEN 3
-
-#define ACTMENU_KEY_DUPLICATE 0
-#define ACTMENU_KEY_DELETE 1
-#define ACTMENU_KEY_BAKE 2
-#define ACTMENU_KEY_CLEAN 3
-
-#define ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_UP 0
-#define ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_DOWN 1
-#define ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_TOP 2
-#define ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_BOTTOM 3
-
-#define ACTMENU_KEY_TRANSFORM_MOVE 0
-#define ACTMENU_KEY_TRANSFORM_SCALE 1
-#define ACTMENU_KEY_TRANSFORM_SLIDE 2
-
-#define ACTMENU_KEY_HANDLE_AUTO 0
-#define ACTMENU_KEY_HANDLE_ALIGN 1
-#define ACTMENU_KEY_HANDLE_FREE 2
-#define ACTMENU_KEY_HANDLE_VECTOR 3
-
-#define ACTMENU_KEY_INTERP_CONST 0
-#define ACTMENU_KEY_INTERP_LINEAR 1
-#define ACTMENU_KEY_INTERP_BEZIER 2
-
-#define ACTMENU_KEY_EXTEND_CONST 0
-#define ACTMENU_KEY_EXTEND_EXTRAPOLATION 1
-#define ACTMENU_KEY_EXTEND_CYCLIC 2
-#define ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION 3
-
-#define ACTMENU_KEY_SNAP_NEARFRAME 1
-#define ACTMENU_KEY_SNAP_CURFRAME 2
-#define ACTMENU_KEY_SNAP_NEARMARK 3
-
-#define ACTMENU_KEY_MIRROR_CURFRAME 1
-#define ACTMENU_KEY_MIRROR_YAXIS 2
-#define ACTMENU_KEY_MIRROR_XAXIS 3
-#define ACTMENU_KEY_MIRROR_MARKER 4
-
-#define ACTMENU_MARKERS_ADD 0
-#define ACTMENU_MARKERS_DUPLICATE 1
-#define ACTMENU_MARKERS_DELETE 2
-#define ACTMENU_MARKERS_NAME 3
-#define ACTMENU_MARKERS_MOVE 4
+/* enums declaring constants that are used as menu event codes */
+
+enum {
+ ACTMENU_VIEW_CENTERVIEW= 0,
+ ACTMENU_VIEW_AUTOUPDATE,
+ ACTMENU_VIEW_PLAY3D,
+ ACTMENU_VIEW_PLAYALL,
+ ACTMENU_VIEW_ALL,
+ ACTMENU_VIEW_MAXIMIZE,
+ ACTMENU_VIEW_LOCK,
+ ACTMENU_VIEW_SLIDERS,
+ ACTMENU_VIEW_NEXTMARKER,
+ ACTMENU_VIEW_PREVMARKER,
+ ACTMENU_VIEW_TIME,
+};
+
+enum {
+ ACTMENU_SEL_BORDER = 0,
+ ACTMENU_SEL_BORDERM,
+ ACTMENU_SEL_ALL_KEYS,
+ ACTMENU_SEL_ALL_CHAN,
+ ACTMENU_SEL_ALL_MARKERS,
+ ACTMENU_SEL_INVERSE_KEYS,
+ ACTMENU_SEL_INVERSE_MARKERS
+};
+
+enum {
+ ACTMENU_SEL_COLUMN_KEYS = 1,
+ ACTMENU_SEL_COLUMN_MARKERSCOLUMN,
+ ACTMENU_SEL_COLUMN_MARKERSBETWEEN
+};
+
+enum {
+ ACTMENU_KEY_DUPLICATE = 0,
+ ACTMENU_KEY_DELETE,
+ ACTMENU_KEY_CLEAN
+};
+
+enum {
+ ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_UP = 0,
+ ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_DOWN,
+ ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_TOP,
+ ACTMENU_KEY_CHANPOS_MOVE_CHANNEL_BOTTOM
+};
+
+enum {
+ ACTMENU_KEY_TRANSFORM_MOVE = 0,
+ ACTMENU_KEY_TRANSFORM_SCALE,
+ ACTMENU_KEY_TRANSFORM_SLIDE,
+ ACTMENU_KEY_TRANSFORM_EXTEND
+};
+
+enum {
+ ACTMENU_KEY_HANDLE_AUTO = 0,
+ ACTMENU_KEY_HANDLE_ALIGN,
+ ACTMENU_KEY_HANDLE_FREE,
+ ACTMENU_KEY_HANDLE_VECTOR
+};
+
+enum {
+ ACTMENU_KEY_INTERP_CONST = 0,
+ ACTMENU_KEY_INTERP_LINEAR,
+ ACTMENU_KEY_INTERP_BEZIER
+};
+
+enum {
+ ACTMENU_KEY_EXTEND_CONST = 0,
+ ACTMENU_KEY_EXTEND_EXTRAPOLATION,
+ ACTMENU_KEY_EXTEND_CYCLIC,
+ ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION
+};
+
+enum {
+ ACTMENU_KEY_SNAP_NEARFRAME = 1,
+ ACTMENU_KEY_SNAP_CURFRAME,
+ ACTMENU_KEY_SNAP_NEARMARK,
+ ACTMENU_KEY_SNAP_NEARTIME,
+};
+
+enum {
+ ACTMENU_KEY_MIRROR_CURFRAME = 1,
+ ACTMENU_KEY_MIRROR_YAXIS,
+ ACTMENU_KEY_MIRROR_XAXIS,
+ ACTMENU_KEY_MIRROR_MARKER
+};
+
+enum {
+ ACTMENU_MARKERS_ADD = 0,
+ ACTMENU_MARKERS_DUPLICATE,
+ ACTMENU_MARKERS_DELETE,
+ ACTMENU_MARKERS_NAME,
+ ACTMENU_MARKERS_MOVE
+};
void do_action_buttons(unsigned short event)
{
Object *ob= OBACT;
switch(event) {
- case B_ACTHOME:
+ case B_ACTHOME: /* HOMEKEY in Action Editor */
/* Find X extents */
G.v2d->cur.xmin = 0;
G.v2d->cur.ymin=-SCROLLB;
-
+
if (G.saction->action) {
float extra;
@@ -171,24 +199,24 @@ void do_action_buttons(unsigned short event)
G.v2d->cur.xmax= -5;
G.v2d->cur.xmax= 100;
}
-
- G.v2d->cur.ymin= -(count_action_levels(G.saction->action)*(CHANNELHEIGHT+CHANNELSKIP));
- G.v2d->cur.ymax= 0;
}
else { /* shapekeys and/or no action */
- G.v2d->cur.xmax= -5;
- G.v2d->cur.xmax= 100;
- G.v2d->cur.ymax= 1000;
- G.v2d->cur.ymin= 0;
+ G.v2d->cur.xmin= -5.0;
+ G.v2d->cur.xmax= 65.0;
}
+ G.v2d->cur.ymin= -75.0;
+ G.v2d->cur.ymax= 5.0;
+
G.v2d->tot= G.v2d->cur;
test_view2d(G.v2d, curarea->winx, curarea->winy);
view2d_do_locks(curarea, V2D_LOCK_COPY);
-
+
addqueue (curarea->win, REDRAW, 1);
-
+
break;
+
+ /* copy/paste/paste-flip buttons in 3d-view header in PoseMode */
case B_ACTCOPY:
copy_posebuf();
allqueue(REDRAWVIEW3D, 1);
@@ -201,6 +229,14 @@ void do_action_buttons(unsigned short event)
paste_posebuf(1);
allqueue(REDRAWVIEW3D, 1);
break;
+
+ /* copy/paste buttons in Action Editor header */
+ case B_ACTCOPYKEYS:
+ copy_actdata();
+ break;
+ case B_ACTPASTEKEYS:
+ paste_actdata();
+ break;
case B_ACTPIN: /* __PINFAKE */
/* if (G.saction->flag & SACTION_PIN) {
@@ -257,6 +293,9 @@ static void do_action_viewmenu(void *arg, int event)
case ACTMENU_VIEW_PREVMARKER: /* jump to previous marker */
nextprev_marker(-1);
break;
+ case ACTMENU_VIEW_TIME: /* switch between frames and seconds display */
+ G.saction->flag ^= SACTION_DRAWTIME;
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -277,6 +316,21 @@ static uiBlock *action_viewmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ if (G.saction->flag & SACTION_DRAWTIME) {
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Show Frames|Ctrl T", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1,
+ ACTMENU_VIEW_TIME, "");
+ }
+ else {
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Show Seconds|Ctrl T", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1,
+ ACTMENU_VIEW_TIME, "");
+ }
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, (G.saction->flag & SACTION_SLIDERS)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
"Show Sliders|", 0, yco-=20,
@@ -445,11 +499,7 @@ static void do_action_selectmenu(void *arg, int event)
case ACTMENU_SEL_ALL_MARKERS: /* select/deselect all markers */
deselect_markers(1, 0);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case ACTMENU_SEL_INVERSE_KEYS: /* invert selection status of keys */
@@ -461,11 +511,7 @@ static void do_action_selectmenu(void *arg, int event)
case ACTMENU_SEL_INVERSE_MARKERS: /* invert selection of markers */
deselect_markers(0, 2);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
}
}
@@ -543,10 +589,13 @@ static void do_action_keymenu_transformmenu(void *arg, int event)
transform_action_keys('g', 0);
break;
case ACTMENU_KEY_TRANSFORM_SCALE:
- transform_action_keys ('s', 0);
+ transform_action_keys('s', 0);
break;
case ACTMENU_KEY_TRANSFORM_SLIDE:
- transform_action_keys ('t', 0);
+ transform_action_keys('t', 0);
+ break;
+ case ACTMENU_KEY_TRANSFORM_EXTEND:
+ transform_action_keys('e', 0);
break;
}
@@ -566,6 +615,9 @@ static uiBlock *action_keymenu_transformmenu(void *arg_unused)
"Grab/Move|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_TRANSFORM_MOVE, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Grab/Extend from Frame|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_TRANSFORM_EXTEND, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
"Scale|S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_TRANSFORM_SCALE, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
@@ -636,13 +688,13 @@ static void do_action_keymenu_intpolmenu(void *arg, int event)
switch(event)
{
case ACTMENU_KEY_INTERP_CONST:
- action_set_ipo_flags(SET_IPO_CONSTANT);
+ action_set_ipo_flags(SET_IPO_MENU, SET_IPO_CONSTANT);
break;
case ACTMENU_KEY_INTERP_LINEAR:
- action_set_ipo_flags(SET_IPO_LINEAR);
+ action_set_ipo_flags(SET_IPO_MENU, SET_IPO_LINEAR);
break;
case ACTMENU_KEY_INTERP_BEZIER:
- action_set_ipo_flags(SET_IPO_BEZIER);
+ action_set_ipo_flags(SET_IPO_MENU, SET_IPO_BEZIER);
break;
}
@@ -659,15 +711,15 @@ static uiBlock *action_keymenu_intpolmenu(void *arg_unused)
uiBlockSetButmFunc(block, do_action_keymenu_intpolmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Constant", 0, yco-=20,
+ "Constant|Shift T, 1", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_INTERP_CONST, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Linear", 0, yco-=20,
+ "Linear|Shift T, 2", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_INTERP_LINEAR, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Bezier", 0, yco-=20,
+ "Bezier|Shift T, 3", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
ACTMENU_KEY_INTERP_BEZIER, "");
@@ -682,16 +734,16 @@ static void do_action_keymenu_extendmenu(void *arg, int event)
switch(event)
{
case ACTMENU_KEY_EXTEND_CONST:
- action_set_ipo_flags(SET_EXTEND_CONSTANT);
+ action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_CONSTANT);
break;
case ACTMENU_KEY_EXTEND_EXTRAPOLATION:
- action_set_ipo_flags(SET_EXTEND_EXTRAPOLATION);
+ action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_EXTRAPOLATION);
break;
case ACTMENU_KEY_EXTEND_CYCLIC:
- action_set_ipo_flags(SET_EXTEND_CYCLIC);
+ action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_CYCLIC);
break;
case ACTMENU_KEY_EXTEND_CYCLICEXTRAPOLATION:
- action_set_ipo_flags(SET_EXTEND_CYCLICEXTRAPOLATION);
+ action_set_ipo_flags(SET_EXTEND_MENU, SET_EXTEND_CYCLICEXTRAPOLATION);
break;
}
@@ -794,6 +846,7 @@ static void do_action_keymenu_snapmenu(void *arg, int event)
case ACTMENU_KEY_SNAP_NEARFRAME:
case ACTMENU_KEY_SNAP_CURFRAME:
case ACTMENU_KEY_SNAP_NEARMARK:
+ case ACTMENU_KEY_SNAP_NEARTIME:
snap_action_keys(event);
break;
}
@@ -810,14 +863,27 @@ static uiBlock *action_keymenu_snapmenu(void *arg_unused)
UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
uiBlockSetButmFunc(block, do_action_keymenu_snapmenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Nearest Frame|Shift S, 1", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_SNAP_NEARFRAME, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Current Frame|Shift S, 2", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 0,
- ACTMENU_KEY_SNAP_CURFRAME, "");
+ if (G.saction->flag & SACTION_DRAWTIME) {
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Nearest Second|Shift S, 1", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_SNAP_NEARTIME, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Current Time|Shift S, 2", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_SNAP_CURFRAME, "");
+
+ }
+ else {
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Nearest Frame|Shift S, 1", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_SNAP_NEARFRAME, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
+ "Current Frame|Shift S, 2", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 0,
+ ACTMENU_KEY_SNAP_CURFRAME, "");
+ }
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
"Nearest Marker|Shift S, 3", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 0,
@@ -994,11 +1060,7 @@ static void do_action_markermenu(void *arg, int event)
break;
}
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
static uiBlock *action_markermenu(void *arg_unused)
@@ -1042,23 +1104,23 @@ void action_buttons(void)
{
uiBlock *block;
short xco, xmax;
- char naam[256];
+ char name[256];
Object *ob;
ID *from;
- if (!G.saction)
+ if (G.saction == NULL)
return;
- // copy from drawactionspace....
+ /* copied from drawactionspace.... */
if (!G.saction->pin) {
if (OBACT)
G.saction->action = OBACT->action;
else
- G.saction->action=NULL;
+ G.saction->action= NULL;
}
- sprintf(naam, "header %d", curarea->headwin);
- block= uiNewBlock(&curarea->uiblocks, naam,
+ sprintf(name, "header %d", curarea->headwin);
+ block= uiNewBlock(&curarea->uiblocks, name,
UI_EMBOSS, UI_HELV, curarea->headwin);
if (area_is_active_area(curarea))
@@ -1096,10 +1158,10 @@ void action_buttons(void)
uiBlockSetEmboss(block, UI_EMBOSS);
xco+=XIC;
- if((curarea->flag & HEADER_NO_PULLDOWN)==0) {
+ if ((curarea->flag & HEADER_NO_PULLDOWN)==0) {
/* pull down menus */
uiBlockSetEmboss(block, UI_EMBOSSP);
-
+
xmax= GetButStringLength("View");
uiDefPulldownBut(block, action_viewmenu, NULL,
"View", xco, -2, xmax-3, 24, "");
@@ -1124,8 +1186,8 @@ void action_buttons(void)
uiBlockSetEmboss(block, UI_EMBOSS);
/* NAME ETC */
- ob=OBACT;
- from = (ID*) ob;
+ ob= OBACT;
+ from = (ID *)ob;
xco= std_libbuttons(block, xco, 0, B_ACTPIN, &G.saction->pin,
B_ACTIONBROWSE, ID_AC, 0, (ID*)G.saction->action,
@@ -1135,22 +1197,42 @@ void action_buttons(void)
uiClearButLock();
/* draw AUTOSNAP */
- xco+= 8;
+ xco += 8;
- uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_PROP_OFF,
- "Auto-Snap Keys %t|Off %x0|Frame Step %x1|Nearest Frame %x2",
- xco,0,XIC+10,YIC, &(G.saction->autosnap), 0, 1, 0, 0,
- "Auto-snapping mode for keys when transforming");
+ if (G.saction->flag & SACTION_DRAWTIME) {
+ uiDefButS(block, MENU, B_REDR,
+ "Auto-Snap Keyframes %t|Off %x0|Second Step %x1|Nearest Second %x2|Nearest Marker %x3",
+ xco,0,70,YIC, &(G.saction->autosnap), 0, 1, 0, 0,
+ "Auto-snapping mode for keyframes when transforming");
+ }
+ else {
+ uiDefButS(block, MENU, B_REDR,
+ "Auto-Snap Keyframes %t|Off %x0|Frame Step %x1|Nearest Frame %x2|Nearest Marker %x3",
+ xco,0,70,YIC, &(G.saction->autosnap), 0, 1, 0, 0,
+ "Auto-snapping mode for keyframes when transforming");
+ }
- xco+= (XIC + 18);
+ xco += (70 + 8);
- /* draw LOCK*/
-
+ /* COPY PASTE */
+ uiBlockBeginAlign(block);
+ if (curarea->headertype==HEADERTOP) {
+ uiDefIconBut(block, BUT, B_ACTCOPYKEYS, ICON_COPYUP, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected keyframes from the selected channel(s) to the buffer");
+ uiDefIconBut(block, BUT, B_ACTPASTEKEYS, ICON_PASTEUP, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the keyframes from the buffer");
+ }
+ else {
+ uiDefIconBut(block, BUT, B_ACTCOPYKEYS, ICON_COPYDOWN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "Copies the selected keyframes from the selected channel(s) to the buffer");
+ uiDefIconBut(block, BUT, B_ACTPASTEKEYS, ICON_PASTEDOWN, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Pastes the keyframes from the buffer");
+ }
+ uiBlockEndAlign(block);
+ xco += (XIC + 8);
+
+ /* draw LOCK */
uiDefIconButS(block, ICONTOG, 1, ICON_UNLOCKED, xco, 0, XIC, YIC,
&(G.saction->lock), 0, 0, 0, 0,
"Updates other affected window spaces automatically "
"to reflect changes in real time");
-
+
/* always as last */
curarea->headbutlen = xco + 2*XIC;
diff --git a/source/blender/src/header_buttonswin.c b/source/blender/src/header_buttonswin.c
index 15ef5962e99..07a63a46903 100644
--- a/source/blender/src/header_buttonswin.c
+++ b/source/blender/src/header_buttonswin.c
@@ -690,7 +690,8 @@ void buts_buttons(void)
case CONTEXT_OBJECT:
uiBlockBeginAlign(block);
uiDefIconButC(block, ROW, B_CONTEXT_SWITCH, ICON_OBJECT, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_OBJECT]), 1.0, (float)TAB_OBJECT_OBJECT, 0, 0, "Object buttons ");
- uiDefIconButC(block, ROW, B_CONTEXT_SWITCH, ICON_EFFECTS, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_OBJECT]), 1.0, (float)TAB_OBJECT_PHYSICS, 0, 0, "Physics buttons");
+ uiDefIconButC(block, ROW, B_CONTEXT_SWITCH, ICON_PHYSICS, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_OBJECT]), 1.0, (float)TAB_OBJECT_PHYSICS, 0, 0, "Physics buttons");
+ uiDefIconButC(block, ROW, B_CONTEXT_SWITCH, ICON_PARTICLES, xco+=XIC, t_base, XIC, YIC, &(G.buts->tab[CONTEXT_OBJECT]), 1.0, (float)TAB_OBJECT_PARTICLE, 0, 0, "Particle buttons");
break;
case CONTEXT_SHADING:
diff --git a/source/blender/src/header_filesel.c b/source/blender/src/header_filesel.c
index 3424c4b7c3d..999fa2733af 100644
--- a/source/blender/src/header_filesel.c
+++ b/source/blender/src/header_filesel.c
@@ -158,6 +158,15 @@ void file_buttons(void)
xco+= 100; // scroll
}
+ #ifdef INTERNATIONAL
+ else if(sfile->type==FILE_LOADFONT) {
+ uiDefIconButBitS(block, TOG, FILE_SHOWSHORT, B_SORTFILELIST, ICON_FONTPREVIEW, xco+= XIC, 0, XIC, YIC, &sfile->f_fp, 0, 0, 0, 0, "Activate font preview");
+ if (sfile->f_fp)
+ uiDefButC(block, FTPREVIEW, 0, "Font preview", xco+= XIC, 0, 100, YIC, sfile->fp_str, (float)0, (float)16, 0, 0, "Font preview");
+
+ xco+= 100; // scroll
+ }
+ #endif
uiDrawBlock(block);
@@ -179,7 +188,7 @@ void file_buttons(void)
BIF_DrawString(G.font, naam, 0);
}
-
+
/* always do as last */
curarea->headbutlen= xco+2*XIC;
}
diff --git a/source/blender/src/header_image.c b/source/blender/src/header_image.c
index d6878d70165..5b8c33309a0 100644
--- a/source/blender/src/header_image.c
+++ b/source/blender/src/header_image.c
@@ -50,6 +50,7 @@
#include "DNA_space_types.h"
#include "DNA_texture_types.h"
#include "DNA_userdef_types.h"
+#include "DNA_customdata_types.h" /* for UV layer menu */
#include "BLI_blenlib.h"
@@ -62,16 +63,20 @@
#include "BKE_image.h"
#include "BKE_main.h"
#include "BKE_utildefines.h"
+#include "BLI_editVert.h" /* for UV layer menu */
+#include "BKE_customdata.h" /* ditto */
#include "BIF_butspace.h"
#include "BIF_drawimage.h"
#include "BIF_editsima.h"
+#include "BIF_imasel.h"
#include "BIF_interface.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_transform.h"
#include "BIF_toolbox.h"
+#include "BIF_editmesh.h"
#include "BSE_drawview.h"
#include "BSE_filesel.h"
@@ -104,14 +109,22 @@ void do_image_buttons(unsigned short event)
}
switch(event) {
+ case B_SIMAPIN:
+ allqueue (REDRAWIMAGE, 0);
+ break;
case B_SIMAGEHOME:
image_home();
break;
case B_SIMABROWSE:
if(G.sima->imanr== -2) {
- activate_databrowse((ID *)G.sima->image, ID_IM, 0, B_SIMABROWSE,
+ if(G.qual & LR_CTRLKEY) {
+ activate_databrowse_imasel((ID *)G.sima->image, ID_IM, 0, B_SIMABROWSE,
+ &G.sima->imanr, do_image_buttons);
+ } else {
+ activate_databrowse((ID *)G.sima->image, ID_IM, 0, B_SIMABROWSE,
&G.sima->imanr, do_image_buttons);
+ }
return;
}
if(G.sima->imanr < 0) break;
@@ -131,31 +144,22 @@ void do_image_buttons(unsigned short event)
allqueue(REDRAWIMAGE, 0);
}
/* also when image is the same: assign! 0==no tileflag: */
- image_changed(G.sima, 0);
+ image_changed(G.sima, (Image *)idtest);
BIF_undo_push("Assign image UV");
break;
-
- case B_SIMAGEDRAW:
- if(G.f & G_FACESELECT) {
- make_repbind(G.sima->image);
- image_changed(G.sima, 1);
- }
- /* XXX might be another event needed for this? */
- if(G.sima->image)
- if(ELEM(G.sima->image->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE))
- if(G.sima->iuser.flag & IMA_ANIM_ALWAYS)
- BKE_image_user_calc_imanr(&G.sima->iuser, G.scene->r.cfra, 0);
+ case B_SIMAGETILE:
+ image_set_tile(G.sima, 1); /* 1: only tileflag */
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWIMAGE, 0);
break;
-
- case B_SIMAGEDRAW1:
- image_changed(G.sima, 2); /* 2: only tileflag */
+ case B_SIMA3DVIEWDRAW:
+ allqueue(REDRAWVIEW3D, 0);
+ break;
+ case B_SIMA_REDR_IMA_3D:
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWIMAGE, 0);
break;
-
case B_SIMAGEPAINTTOOL:
if(G.sima->flag & SI_DRAWTOOL)
/* add new brush if none exists */
@@ -204,12 +208,8 @@ void do_image_buttons(unsigned short event)
BLI_strncpy(str, G.sima->image->name, sizeof(str));
ima= BKE_add_image_file(str);
if(ima) {
-
- G.sima->image= ima;
-
BKE_image_signal(ima, &G.sima->iuser, IMA_SIGNAL_RELOAD);
- image_changed(G.sima, 0);
-
+ image_changed(G.sima, ima);
}
BIF_undo_push("Load image");
allqueue(REDRAWIMAGE, 0);
@@ -224,6 +224,9 @@ void do_image_buttons(unsigned short event)
case B_TRANS_IMAGE:
image_editvertex_buts(NULL);
break;
+ case B_CURSOR_IMAGE:
+ image_editcursor_buts(NULL);
+ break;
case B_TWINANIM:
{
@@ -311,7 +314,11 @@ void do_image_buttons(unsigned short event)
if(G.sima->menunr==-2) {
MTex *mtex= brush->mtex[brush->texact];
ID *id= (ID*)((mtex)? mtex->tex: NULL);
- activate_databrowse(id, ID_TE, 0, B_SIMABTEXBROWSE, &G.sima->menunr, do_global_buttons);
+ if(G.qual & LR_CTRLKEY) {
+ activate_databrowse_imasel(id, ID_TE, 0, B_SIMABTEXBROWSE, &G.sima->menunr, do_image_buttons);
+ } else {
+ activate_databrowse(id, ID_TE, 0, B_SIMABTEXBROWSE, &G.sima->menunr, do_image_buttons);
+ }
break;
}
else if(G.sima->menunr < 0) break;
@@ -343,6 +350,16 @@ void do_image_buttons(unsigned short event)
}
}
+static void do_image_buttons_set_uvlayer_callback(void *act, void *data)
+{
+ CustomData_set_layer_active(&G.editMesh->fdata, CD_MTFACE, *((int *)act));
+
+ BIF_undo_push("Set Active UV Texture");
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+ allqueue(REDRAWIMAGE, 0);
+}
+
static void do_image_view_viewnavmenu(void *arg, int event)
{
switch(event) {
@@ -418,18 +435,15 @@ static void do_image_viewmenu(void *arg, int event)
case 2: /* Maximize Window */
/* using event B_FULL */
break;
+ case 4: /* Realtime Panel... */
+ add_blockhandler(curarea, IMAGE_HANDLER_VIEW_PROPERTIES, UI_PNL_UNSTOW);
+ break;
case 5: /* Draw Shadow Mesh */
- if(G.sima->flag & SI_DRAWSHADOW)
- G.sima->flag &= ~SI_DRAWSHADOW;
- else
- G.sima->flag |= SI_DRAWSHADOW;
+ G.sima->flag ^= SI_DRAWSHADOW;
allqueue(REDRAWIMAGE, 0);
break;
case 6: /* Draw Faces */
- if(G.f & G_DRAWFACES)
- G.f &= ~G_DRAWFACES;
- else
- G.f |= G_DRAWFACES;
+ G.f ^= G_DRAWFACES;
allqueue(REDRAWIMAGE, 0);
break;
case 7: /* Properties Panel */
@@ -454,7 +468,10 @@ static void do_image_viewmenu(void *arg, int event)
case 13: /* Realtime Panel... */
add_blockhandler(curarea, IMAGE_HANDLER_GAME_PROPERTIES, UI_PNL_UNSTOW);
break;
-
+ case 14: /* Draw active image UV's only*/
+ G.sima->flag ^= SI_LOCAL_UV;
+ allqueue(REDRAWIMAGE, 0);
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -468,7 +485,8 @@ static uiBlock *image_viewmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "image_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_image_viewmenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "View Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Image Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Real-time Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Paint Tool...|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Curves Tool...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
@@ -482,6 +500,14 @@ static uiBlock *image_viewmenu(void *arg_unused)
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Draw Shadow Mesh|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ if(G.sima->flag & SI_LOCAL_UV) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "UV Local View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
+ else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "UV Local View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
+ if(!(G.sima->flag & SI_LOCAL_UV)) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "UV Global View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
+ else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "UV Global View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
uiDefIconTextBlockBut(block, image_view_viewnavmenu, NULL, ICON_RIGHTARROW_THIN, "View Navigation", 0, yco-=20, 120, 19, "");
if(G.sima->lock) {
@@ -533,26 +559,6 @@ static void do_image_selectmenu(void *arg, int event)
case 3: /* Linked UVs */
select_linked_tface_uv(2);
break;
- case 4: /* Toggle Local UVs Stick to Vertex in Mesh */
- if(G.sima->flag & SI_LOCALSTICKY)
- G.sima->flag &= ~SI_LOCALSTICKY;
- else {
- G.sima->flag |= SI_LOCALSTICKY;
- G.sima->flag &= ~SI_STICKYUVS;
- }
- allqueue(REDRAWIMAGE, 0);
- break;
- case 5: /* Toggle UVs Stick to Vertex in Mesh */
- if(G.sima->flag & SI_STICKYUVS) {
- G.sima->flag &= ~SI_STICKYUVS;
- G.sima->flag |= SI_LOCALSTICKY;
- }
- else {
- G.sima->flag |= SI_STICKYUVS;
- G.sima->flag &= ~SI_LOCALSTICKY;
- }
- allqueue(REDRAWIMAGE, 0);
- break;
case 6: /* Toggle Active Face Select */
if(G.sima->flag & SI_SELACTFACE)
G.sima->flag &= ~SI_SELACTFACE;
@@ -573,20 +579,15 @@ static uiBlock *image_selectmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "image_selectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_image_selectmenu, NULL);
-
- if(G.sima->flag & SI_SELACTFACE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Active Face Select|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Active Face Select|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if(G.sima->flag & SI_LOCALSTICKY) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Stick Local UVs to Mesh Vertex|Shift C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Stick Local UVs to Mesh Vertex|Shift C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
-
- if(G.sima->flag & SI_STICKYUVS) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Stick UVs to Mesh Vertex|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Stick UVs to Mesh Vertex|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
+
+
+ if ((G.sima->flag & SI_SYNC_UVSEL)==0 || (G.sima->flag & SI_SYNC_UVSEL && (G.scene->selectmode != SCE_SELECT_FACE))) {
+ if(G.sima->flag & SI_SELACTFACE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Active Face Select|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
+ else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Active Face Select|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ }
+
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select Pinned|Shift B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
@@ -967,6 +968,9 @@ static void do_image_uvsmenu(void *arg, int event)
{
switch(event) {
+// case 0: /* UV Transform Properties Panel... */
+// add_blockhandler(curarea, IMAGE_HANDLER_TRANSFORM_PROPERTIES, UI_PNL_UNSTOW);
+// break;
case 1: /* UVs Constrained Rectangular */
if(G.sima->flag & SI_BE_SQUARE) G.sima->flag &= ~SI_BE_SQUARE;
else G.sima->flag |= SI_BE_SQUARE;
@@ -976,10 +980,10 @@ static void do_image_uvsmenu(void *arg, int event)
else G.sima->flag |= SI_CLIP_UV;
break;
case 3: /* Limit Stitch UVs */
- stitch_uv_tface(1);
+ stitch_limit_uv_tface();
break;
case 4: /* Stitch UVs */
- stitch_uv_tface(0);
+ stitch_vert_uv_tface();
break;
case 5: /* Proportional Edit (toggle) */
if(G.scene->proportional)
@@ -1019,9 +1023,9 @@ static uiBlock *image_uvsmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "image_uvsmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_image_uvsmenu, NULL);
-
- // uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Transform Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
- // uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ //uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
if(G.sima->flag & SI_PIXELSNAP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap to Pixels|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap to Pixels|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
@@ -1089,8 +1093,15 @@ void image_buttons(void)
uiBlock *block;
short xco, xmax;
char naam[256], *menuname;
+ char is_render; /* true if the image is a render or composite */
+
+ int allow_pin= B_SIMAPIN;
+
/* This should not be a static var */
static int headerbuttons_packdummy;
+
+
+ is_render = ((G.sima->image!=NULL) && ((G.sima->image->type == IMA_TYPE_R_RESULT) || (G.sima->image->type == IMA_TYPE_COMPOSITE)));
headerbuttons_packdummy = 0;
@@ -1132,7 +1143,7 @@ void image_buttons(void)
uiDefPulldownBut(block, image_viewmenu, NULL, "View", xco, -2, xmax-3, 24, "");
xco+= xmax;
- if((G.f & G_FACESELECT) && !(ima && (G.sima->flag & SI_DRAWTOOL))) {
+ if((EM_texFaceCheck()) && !(ima && (G.sima->flag & SI_DRAWTOOL))) {
xmax= GetButStringLength("Select");
uiDefPulldownBut(block, image_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
xco+= xmax;
@@ -1145,8 +1156,7 @@ void image_buttons(void)
xmax= GetButStringLength(menuname);
uiDefPulldownBut(block, image_imagemenu, NULL, menuname, xco, -2, xmax-3, 24, "");
xco+= xmax;
-
- if((G.f & G_FACESELECT) && !(ima && (G.sima->flag & SI_DRAWTOOL))) {
+ if((EM_texFaceCheck()) && !(ima && (G.sima->flag & SI_DRAWTOOL))) {
xmax= GetButStringLength("UVs");
uiDefPulldownBut(block, image_uvsmenu, NULL, "UVs", xco, -2, xmax-3, 24, "");
xco+= xmax;
@@ -1156,8 +1166,91 @@ void image_buttons(void)
/* other buttons: */
uiBlockSetEmboss(block, UI_EMBOSS);
- xco= std_libbuttons(block, xco, 0, 0, NULL, B_SIMABROWSE, ID_IM, 0, (ID *)ima, 0, &(G.sima->imanr), 0, 0, B_IMAGEDELETE, 0, 0);
+ if (is_render)
+ allow_pin = 0;
+
+ xco= 8 + std_libbuttons(block, xco, 0, allow_pin, &G.sima->pin, B_SIMABROWSE, ID_IM, 0, (ID *)ima, 0, &(G.sima->imanr), 0, 0, B_IMAGEDELETE, 0, 0);
+
+ if( ima && !ELEM3(ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE, IMA_SRC_VIEWER) && ima->ok) {
+ if (ima->packedfile) {
+ headerbuttons_packdummy = 1;
+ }
+ if (ima->packedfile && ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
+ uiDefIconButBitI(block, TOG, 1, B_SIMA_REPACK, ICON_UGLYPACKAGE, xco,0,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Re-Pack this image as PNG");
+ else
+ uiDefIconButBitI(block, TOG, 1, B_SIMAPACKIMA, ICON_PACKAGE, xco,0,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Pack/Unpack this image");
+
+ xco+= XIC+8;
+ }
+
+ /* UV EditMode buttons, not painting or rencering or compositing */
+ if ( EM_texFaceCheck() && (G.sima->flag & SI_DRAWTOOL)==0 && !is_render) {
+ uiBut *ubut;
+ int layercount;
+
+ uiDefIconTextButS(block, ICONTEXTROW, B_NOP, ICON_ROTATE,
+ "Pivot: %t|Bounding Box Center %x0|Median Point %x3|2D Cursor %x1",
+ xco,0,XIC+10,YIC, &(G.v2d->around), 0, 3.0, 0, 0,
+ "Rotation/Scaling Pivot (Hotkeys: Comma, Shift Comma, Period)");
+ xco+= XIC + 18;
+
+ uiBlockBeginAlign(block);
+ uiDefIconButBitI(block, TOGN, SI_SYNC_UVSEL, B_REDR, ICON_NO_GO_LEFT, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Mesh independant selection");
+ xco+= XIC;
+ if ((G.sima->flag & SI_SYNC_UVSEL)==0) {
+
+ /* would use these if const's could go in strings
+ * SI_STICKY_LOC SI_STICKY_DISABLE SI_STICKY_VERTEX */
+ ubut = uiDefIconTextButC(block, ICONTEXTROW, B_REDR, ICON_STICKY_UVS_LOC,
+ "Sticky UV Selection: %t|Disable%x1|Shared Location%x0|Shared Vertex%x2",
+ xco,0,XIC+10,YIC, &(G.sima->sticky), 0, 3.0, 0, 0,
+ "Sticky UV Selection (Hotkeys: Shift C, Alt C, Ctrl C)");
+ xco+= XIC + 16;
+
+ } else {
+ xco+= 6;
+ }
+ uiBlockEndAlign(block);
+
+ /* Snap copied right out of view3d header */
+ uiBlockBeginAlign(block);
+
+ if (G.scene->snap_flag & SCE_SNAP) {
+ uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEO,xco,0,XIC,YIC, &G.scene->snap_flag, 0, 0, 0, 0, "Use Snap or Grid (Shift Tab)");
+ xco+= XIC;
+ uiDefButS(block, MENU, B_NOP, "Mode%t|Closest%x0|Center%x1|Median%x2",xco,0,70,YIC, &G.scene->snap_target, 0, 0, 0, 0, "Snap Target Mode");
+ xco+= 70;
+ } else {
+ uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEAR,xco,0,XIC,YIC, &G.scene->snap_flag, 0, 0, 0, 0, "Snap while Ctrl is held during transform (Shift Tab)");
+ xco+= XIC;
+ }
+
+ uiBlockEndAlign(block);
+ xco+= 10;
+ /* end snap */
+
+ /* Layer Menu */
+ layercount = CustomData_number_of_layers(&G.editMesh->fdata, CD_MTFACE);
+ if (layercount>1 && layercount < 12) { /* could allow any number but limit of 11 means no malloc needed */
+ static int act;
+ char str_menu[384], *str_pt; /*384 allows for 11 layers */
+
+
+ act = CustomData_get_active_layer(&G.editMesh->fdata, CD_MTFACE);
+
+ /*str_pt = (char *)MEM_mallocN(layercount*40 , "uvmenu"); str[0]='\0';*/
+ str_pt = str_menu;
+ str_pt[0]='\0';
+ mesh_layers_menu_concat(&G.editMesh->fdata, CD_MTFACE, str_pt);
+ ubut = uiDefButI(block, MENU, B_NOP, str_menu ,xco,0,85,YIC, &act, 0, 0, 0, 0, "Active UV Layer for editing");
+ uiButSetFunc(ubut, do_image_buttons_set_uvlayer_callback, &act, NULL);
+
+ /*MEM_freeN(str);*/
+ xco+= 90;
+ }
+ }
+
if (ima) {
RenderResult *rr= BKE_image_get_renderresult(ima);
@@ -1169,20 +1262,8 @@ void image_buttons(void)
uiBlockEndAlign(block);
xco+= 166;
}
- if( !ELEM3(ima->source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE, IMA_SRC_VIEWER) && ima->ok) {
-
- if (ima->packedfile) {
- headerbuttons_packdummy = 1;
- }
- if (ima->packedfile && ibuf && (ibuf->userflags & IB_BITMAPDIRTY))
- uiDefIconButBitI(block, TOG, 1, B_SIMA_REPACK, ICON_UGLYPACKAGE, xco,0,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Re-Pack this image as PNG");
- else
- uiDefIconButBitI(block, TOG, 1, B_SIMAPACKIMA, ICON_PACKAGE, xco,0,XIC,YIC, &headerbuttons_packdummy, 0, 0, 0, 0, "Pack/Unpack this image");
-
- xco+= XIC+8;
- }
-
uiDefIconButBitI(block, TOG, SI_DRAWTOOL, B_SIMAGEPAINTTOOL, ICON_TPAINT_HLT, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Enables painting textures on the image with left mouse button");
+
xco+= XIC+8;
uiBlockBeginAlign(block);
@@ -1197,7 +1278,6 @@ void image_buttons(void)
uiDefIconButBitI(block, TOG, SI_SHOW_ZBUF, B_SIMA_SHOW_ZBUF, ICON_SOLID, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Draws zbuffer values");
xco+= XIC;
}
- else G.sima->flag &= ~SI_SHOW_ZBUF; /* no confusing display for non-zbuf images */
}
xco+= 8;
@@ -1213,7 +1293,7 @@ void image_buttons(void)
uiBlockEndAlign(block);
xco+= 8;
}
-
+
/* draw LOCK */
uiDefIconButS(block, ICONTOG, 0, ICON_UNLOCKED, xco,0,XIC,YIC, &(G.sima->lock), 0, 0, 0, 0, "Updates other affected window spaces automatically to reflect changes in real time");
diff --git a/source/blender/src/header_imasel.c b/source/blender/src/header_imasel.c
index c99112248b7..1402e8c244e 100644
--- a/source/blender/src/header_imasel.c
+++ b/source/blender/src/header_imasel.c
@@ -44,19 +44,23 @@
#endif
#include "BMF_Api.h"
-#include "BIF_language.h"
+
+#include "BKE_global.h"
+#include "BKE_main.h"
+#include "BKE_utildefines.h"
#include "DNA_ID.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
+#include "DNA_userdef_types.h"
+#include "BIF_filelist.h"
#include "BIF_gl.h"
#include "BIF_imasel.h"
#include "BIF_interface.h"
+#include "BIF_language.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
-#include "BKE_global.h"
-#include "BKE_main.h"
#include "BSE_headerbuttons.h"
#include "blendef.h"
@@ -65,26 +69,30 @@
void do_imasel_buttons(short event)
{
SpaceImaSel *simasel;
- char name[256];
-
+
simasel= curarea->spacedata.first;
if(curarea->win==0) return;
switch(event) {
- case B_IMASELHOME:
+ case B_SORTIMASELLIST:
+ BIF_filelist_sort(simasel->files, simasel->sort);
+ scrarea_queue_winredraw(curarea);
break;
- case B_IMASELREMOVEBIP:
-
- if(bitset(simasel->fase, IMS_FOUND_BIP)){
-
- strcpy(name, simasel->dir);
- strcat(name, ".Bpib");
-
- remove(name);
-
- simasel->fase &= ~ IMS_FOUND_BIP;
+ case B_RELOADIMASELDIR:
+ BIF_filelist_free(simasel->files);
+ scrarea_queue_winredraw(curarea);
+ break;
+ case B_FILTERIMASELDIR:
+ if (simasel->flag & FILE_FILTER) {
+ BIF_filelist_setfilter(simasel->files,simasel->filter);
+ BIF_filelist_filter(simasel->files);
+ scrarea_queue_winredraw(curarea);
+ } else {
+ BIF_filelist_setfilter(simasel->files,0);
+ BIF_filelist_filter(simasel->files);
+ scrarea_queue_winredraw(curarea);
}
break;
}
@@ -94,9 +102,12 @@ void imasel_buttons(void)
{
SpaceImaSel *simasel;
uiBlock *block;
- short xco;
+ short xco, xcotitle;
char naam[256];
-
+ char dir[FILE_MAXDIR], group[32];
+ short type;
+ int do_filter = 0;
+
simasel= curarea->spacedata.first;
sprintf(naam, "header %d", curarea->headwin);
@@ -117,24 +128,82 @@ void imasel_buttons(void)
if(curarea->full) uiDefIconBut(block, BUT,B_FULL, ICON_SPLITSCREEN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "");
else uiDefIconBut(block, BUT,B_FULL, ICON_FULLSCREEN, xco,0,XIC,YIC, 0, 0, 0, 0, 0, "");
+ /* SORT TYPE */
xco+=XIC;
- if (simasel->title){
- xco+=25;
- glRasterPos2i(xco, 4);
- BMF_DrawString(G.font, simasel->title);
- xco+=BMF_GetStringWidth(G.fonts, simasel->title);
- xco+=25;
- }
-
uiBlockBeginAlign(block);
- uiDefIconBut(block, BUT, B_IMASELREMOVEBIP, ICON_BPIBFOLDER_X, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "");/* remove */
+ uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTALPHA, xco+=XIC,0,XIC,YIC, &simasel->sort, 1.0, 0.0, 0, 0, "Sorts files alphabetically");
+ uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTBYEXT, xco+=XIC,0,XIC,YIC, &simasel->sort, 1.0, 3.0, 0, 0, "Sorts files by extension");
+ uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTTIME, xco+=XIC,0,XIC,YIC, &simasel->sort, 1.0, 1.0, 0, 0, "Sorts files by time");
+ uiDefIconButS(block, ROW, B_SORTIMASELLIST, ICON_SORTSIZE, xco+=XIC,0,XIC,YIC, &simasel->sort, 1.0, 2.0, 0, 0, "Sorts files by size");
+ uiBlockEndAlign(block);
+
+ cpack(0x0);
+ xco+=XIC+10;
+ uiDefIconButBitS(block, TOG, FILE_BOOKMARKS, B_RELOADIMASELDIR, ICON_BOOKMARKS,xco+=XIC,0,XIC,YIC, &simasel->flag, 0, 0, 0, 0, "Toggles Bookmarks on/off");
+ xco+=XIC+10;
+
+ xcotitle= xco;
+ xco+= BIF_GetStringWidth(G.font, simasel->title, (U.transopts & USER_TR_BUTTONS));
- uiDefIconButS(block, TOG|BIT|0, B_REDR, ICON_BPIBFOLDERGREY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "Toggles display of directory information");/* dir */
- uiDefIconButS(block, TOG|BIT|1, B_REDR, ICON_INFO, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "Toggles display of selected image information");/* info */
- uiDefIconButS(block, TOG|BIT|2, B_REDR, ICON_IMAGE_COL, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "");/* image */
- uiDefIconButS(block, TOG|BIT|3, B_REDR, ICON_MAGNIFY, xco+=XIC,0,XIC,YIC, &simasel->mode, 0, 0, 0, 0, "Toggles magnified view of thumbnail of images under mouse pointer");/* magnify */
+ if(simasel->pupmenu && simasel->menup) {
+ uiDefButS(block, MENU, B_NOP, simasel->pupmenu, xco+10,0,90,20, simasel->menup, 0, 0, 0, 0, "");
+ xco+= 100;
+ }
+ uiBlockBeginAlign(block);
+ uiDefIconButBitS(block, TOG, FILE_HIDE_DOT, B_RELOADIMASELDIR, ICON_GHOST,xco+=XIC,0,XIC,YIC, &simasel->flag, 0, 0, 0, 0, "Hides dot files");
uiBlockEndAlign(block);
+ xco+=20;
+
+ type = simasel->type;
+ if (type == FILE_LOADLIB) {
+ do_filter = !BIF_filelist_islibrary(simasel->files, dir, group);
+ } else {
+ do_filter = (type != FILE_MAIN);
+ }
+ if ( do_filter ) {
+ uiDefIconButBitS(block, TOG, FILE_FILTER, B_FILTERIMASELDIR, ICON_SORTBYEXT,xco+=XIC,0,XIC,YIC, &simasel->flag, 0, 0, 0, 0, "Filter files");
+ if (simasel->flag & FILE_FILTER) {
+ xco+=4;
+ uiBlockBeginAlign(block);
+ uiDefIconButBitS(block, TOG, IMAGEFILE, B_FILTERIMASELDIR, ICON_IMAGE_COL,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show images");
+ uiDefIconButBitS(block, TOG, BLENDERFILE, B_FILTERIMASELDIR, ICON_BLENDER,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show .blend files");
+ uiDefIconButBitS(block, TOG, MOVIEFILE, B_FILTERIMASELDIR, ICON_SEQUENCE,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show movies");
+ uiDefIconButBitS(block, TOG, PYSCRIPTFILE, B_FILTERIMASELDIR, ICON_PYTHON,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show python scripts");
+ uiDefIconButBitS(block, TOG, FTFONTFILE, B_FILTERIMASELDIR, ICON_SYNTAX,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show fonts");
+ uiDefIconButBitS(block, TOG, SOUNDFILE, B_FILTERIMASELDIR, ICON_SOUND,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show sound files");
+ uiDefIconButBitS(block, TOG, TEXTFILE, B_FILTERIMASELDIR, ICON_TEXT,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show text files");
+ uiDefIconButBitS(block, TOG, FOLDERFILE, B_FILTERIMASELDIR, ICON_FILESEL,xco+=XIC,0,XIC,YIC, &simasel->filter, 0, 0, 0, 0, "Show folders");
+ uiBlockEndAlign(block);
+ }
+ }
+
+ uiDefButBitS(block, TOG, FILE_STRINGCODE, 0, "Relative Paths", xco+=XIC+20,0,100,YIC, &simasel->flag, 0, 0, 0, 0, "Makes sure returned paths are relative to the current .blend file");
+ xco+=90;
+
+ if(simasel->type==FILE_LOADLIB) {
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOGN, FILE_LINK, B_REDR, "Append", xco+=XIC,0,100,YIC, &simasel->flag, 0, 0, 0, 0, "Copies selected data into current project");
+ uiDefButBitS(block, TOG, FILE_LINK, B_REDR, "Link", xco+=100,0,100,YIC, &simasel->flag, 0, 0, 0, 0, "Creates a link to selected data from current project");
+ uiBlockEndAlign(block);
+ uiBlockBeginAlign(block);
+ uiDefButBitS(block, TOG, FILE_AUTOSELECT, B_REDR, "Autosel", xco+=125,0,65,YIC, &simasel->flag, 0, 0, 0, 0, "Autoselect imported objects");
+ uiDefButBitS(block, TOG, FILE_ACTIVELAY, B_REDR, "Active Layer", xco+=65,0,80,YIC, &simasel->flag, 0, 0, 0, 0, "Append object(s) in active layer");
+ uiDefButBitS(block, TOG, FILE_ATCURSOR, B_REDR, "At Cursor", xco+=80,0,65,YIC, &simasel->flag, 0, 0, 0, 0, "Append object(s) at cursor, use centroid if more than one object is selected");
+ uiBlockEndAlign(block);
+
+ xco+= 100; // scroll
+
+ } else if(simasel->type==FILE_BLENDER) {
+ uiDefButBitI(block, TOGN, G_FILE_NO_UI, B_REDR, "Load UI", xco+=XIC,0,80,YIC, &G.fileflags, 0, 0, 0, 0, "Load the UI setup as well as the scene data");
+ xco+= 100; // scroll
+ }
+
+ glRasterPos2f((float)xcotitle, 5.0);
+ BIF_RasterPos((float)xcotitle, 5.0); // stupid texture fonts
+ BIF_ThemeColor(TH_TEXT);
+ BIF_DrawString(uiBlockGetCurFont(block), simasel->title, (U.transopts & USER_TR_BUTTONS));
+
/* always do as last */
curarea->headbutlen= xco+2*XIC;
diff --git a/source/blender/src/header_info.c b/source/blender/src/header_info.c
index 6e8aa70a88f..bf4beacaa58 100644
--- a/source/blender/src/header_info.c
+++ b/source/blender/src/header_info.c
@@ -105,7 +105,9 @@
#include "BSE_editipo.h"
#include "BSE_filesel.h"
+#include "BIF_imasel.h"
#include "BSE_headerbuttons.h"
+#include "BSE_node.h"
#include "BSE_sequence.h"
#include "BSE_edit.h"
@@ -395,7 +397,10 @@ void do_info_buttons(unsigned short event)
}
/* last item: NEW SCREEN */
if(sc==0) {
- duplicate_screen();
+ nr= pupmenu("New Screen%t|Empty%x1|Duplicate%x2");
+
+ if(nr==1) default_twosplit();
+ if(nr==2) duplicate_screen();
}
break;
case B_INFODELSCR:
@@ -481,10 +486,7 @@ void do_info_buttons(unsigned short event)
/* exit modes... could become single call once */
exit_editmode(EM_FREEDATA|EM_WAITCURSOR);
- if(G.f & G_VERTEXPAINT) set_vpaint(); /* Switch off vertex paint */
- if(G.f & G_TEXTUREPAINT) set_texturepaint(); /* Switch off tex paint */
- if(G.f & G_WEIGHTPAINT) set_wpaint(); /* Switch off weight paint */
- if(G.f & G_FACESELECT) set_faceselect(); /* Switch off face select */
+ exit_paint_modes();
/* check all sets */
sce1= G.main->scene.first;
@@ -496,6 +498,9 @@ void do_info_buttons(unsigned short event)
/* check all sequences */
clear_scene_in_allseqs(G.scene);
+ /* check render layer nodes in other scenes */
+ clear_scene_in_nodes(G.scene);
+
/* al screens */
sc= G.main->screen.first;
while(sc) {
@@ -832,6 +837,9 @@ static void do_info_filemenu(void *arg, int event)
case 6: /* save image */
BIF_save_rendered_image_fs();
break;
+ case 7:
+ activate_imageselect(FILE_LOADLIB, "Load Library", G.lib, 0);
+ break;
case 22: /* save runtime */
activate_fileselect(FILE_SPECIAL, "Save Runtime", "", write_runtime_check);
break;
@@ -984,6 +992,7 @@ static uiBlock *info_filemenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link|Shift F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Append or Link (Image Browser)|Ctrl F1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
uiDefIconTextBlockBut(block, info_file_importmenu, NULL, ICON_RIGHTARROW_THIN, "Import", 0, yco-=20, menuwidth, 19, "");
uiDefIconTextBlockBut(block, info_file_exportmenu, NULL, ICON_RIGHTARROW_THIN, "Export", 0, yco-=20, menuwidth, 19, "");
diff --git a/source/blender/src/header_ipo.c b/source/blender/src/header_ipo.c
index 1c117e0331e..75a438738bb 100644
--- a/source/blender/src/header_ipo.c
+++ b/source/blender/src/header_ipo.c
@@ -54,6 +54,7 @@
#include "DNA_material_types.h"
#include "DNA_object_types.h"
#include "DNA_object_fluidsim.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_texture_types.h"
@@ -69,6 +70,7 @@
#include "BKE_key.h"
#include "BKE_main.h"
#include "BKE_material.h"
+#include "BKE_particle.h"
#include "BKE_texture.h"
#include "BKE_utildefines.h"
@@ -94,7 +96,6 @@
#include "blendef.h"
#include "mydevice.h"
-static int viewmovetemp = 0;
extern int totipo_edit, totipo_sel;
/* headerbutton call, assuming full context is set */
@@ -153,6 +154,15 @@ void spaceipo_assign_ipo(SpaceIpo *si, Ipo *ipo)
}
ob->fluidsimSettings->ipo = ipo;
}
+ else if(si->blocktype==ID_PA) {
+ ParticleSystem *psys=psys_get_current(ob);
+ if(psys){
+ if(psys->part->ipo){
+ psys->part->ipo->id.us--;
+ }
+ psys->part->ipo = ipo;
+ }
+ }
else if(si->blocktype==ID_OB) {
if(ob->ipo)
ob->ipo->id.us--;
@@ -263,7 +273,10 @@ static void do_ipo_editmenu_transformmenu(void *arg, int event)
case 0: /* grab/move */
transform_ipo('g');
break;
- case 1: /* scale */
+ case 1: /* rotate */
+ transform_ipo('r');
+ break;
+ case 2: /* scale */
transform_ipo('s');
break;
}
@@ -278,7 +291,8 @@ static uiBlock *ipo_editmenu_transformmenu(void *arg_unused)
uiBlockSetButmFunc(block, do_ipo_editmenu_transformmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
@@ -640,7 +654,7 @@ static uiBlock *ipo_editmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Record Mouse Movement|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Record Mouse Movement|Ctrl R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clean IPO Curves|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Smooth IPO Curves|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
@@ -714,6 +728,9 @@ static void do_ipo_viewmenu(void *arg, int event)
center_currframe();
scrarea_queue_winredraw(curarea);
break;
+ case 11:
+ do_ipo_buttons(B_IPOVIEWCENTER);
+ break;
}
}
@@ -749,7 +766,7 @@ static uiBlock *ipo_viewmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
+
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center on Current Frame|Shift C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
uiDefIconTextBut(block, BUTM, 1, (G.v2d->flag & V2D_VIEWLOCK)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
"Lock Time to Other Windows|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
@@ -758,6 +775,10 @@ static uiBlock *ipo_viewmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Current Frame to Selected|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
}
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
if(!curarea->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,20, "");
else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 20, "");
@@ -786,14 +807,11 @@ static void do_ipo_selectmenu(void *arg, int event)
break;
case 2:
borderselect_markers();
+ allqueue(REDRAWMARKER, 0);
break;
case 3:
deselect_markers(1, 0);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
}
}
@@ -848,11 +866,7 @@ static void do_ipo_markermenu(void *arg, int event)
break;
}
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
static uiBlock *ipo_markermenu(void *arg_unused)
@@ -932,6 +946,10 @@ static char *ipo_modeselect_pup(void)
if(ob->fluidsimFlag & OB_FLUIDSIM_ENABLE) {
str += sprintf(str,formatstring,"Fluidsim",ID_FLUIDSIM, ICON_WORLD);
}
+
+ if(ob->particlesystem.first) {
+ str += sprintf(str,formatstring,"Particles",ID_PA, ICON_PARTICLES);
+ }
}
str += sprintf(str,formatstring, "Sequence",ID_SEQ, ICON_SEQUENCE);
@@ -952,6 +970,7 @@ void do_ipo_buttons(short event)
if(curarea->win==0) return;
switch(event) {
+ case B_IPOVIEWCENTER:
case B_IPOHOME:
/* boundbox */
@@ -970,7 +989,7 @@ void do_ipo_buttons(short event)
for(a=0; a<G.sipo->totipo; a++, ei++) {
if ISPOIN(ei, flag & IPO_VISIBLE, icu) {
- boundbox_ipocurve(ei->icu);
+ boundbox_ipocurve(ei->icu, (event==B_IPOVIEWCENTER));
if(first) {
v2d->tot= ei->icu->totrct;
@@ -1065,7 +1084,6 @@ void do_ipo_buttons(short event)
allqueue(REDRAWVIEW3D, 0);
break;
case B_VIEW2DZOOM:
- viewmovetemp= 0;
view2dzoom(event);
scrarea_queue_headredraw(curarea);
break;
@@ -1149,7 +1167,14 @@ void do_ipo_buttons(short event)
}
}
break;
- }
+ case B_IPOVIEWALL:
+ /* set visible active */
+ for(a=0, ei=G.sipo->editipo; a<G.sipo->totipo; a++, ei++) {
+ if (ei->icu) ei->flag |= IPO_VISIBLE;
+ else ei->flag &= ~IPO_VISIBLE;
+ }
+ break;
+ }
}
void ipo_buttons(void)
@@ -1261,6 +1286,12 @@ void ipo_buttons(void)
uiClearButLock();
}
+ /* ipo muting */
+ if (G.sipo->ipo) {
+ uiDefIconButS(block, ICONTOG, 1, ICON_MUTE_IPO_OFF, xco,0,XIC,YIC, &(G.sipo->ipo->muteipo), 0, 0, 0, 0, "Mute IPO-block");
+ xco += XIC;
+ }
+
/* mainmenu, only when data is there and no pin */
uiSetButLock(G.sipo->pin, "Can't change because of pinned data");
@@ -1288,6 +1319,8 @@ void ipo_buttons(void)
icon = ICON_TEXTURE;
else if(G.sipo->blocktype == ID_FLUIDSIM)
icon = ICON_WORLD;
+ else if(G.sipo->blocktype == ID_PA)
+ icon = ICON_PARTICLES;
uiDefIconTextButS(block, MENU, B_IPOMAIN, icon, ipo_modeselect_pup(), xco,0,100,20, &(G.sipo->blocktype), 0, 0, 0, 0, "Show IPO type");
diff --git a/source/blender/src/header_nla.c b/source/blender/src/header_nla.c
index 918383478e5..96ea6c3d792 100644
--- a/source/blender/src/header_nla.c
+++ b/source/blender/src/header_nla.c
@@ -122,6 +122,9 @@ static void do_nla_viewmenu(void *arg, int event)
case 6: /* Show all objects that have keyframes? */
G.snla->flag ^= SNLA_ALLKEYED;
break;
+ case 7: /* Show timing in Frames or Seconds */
+ G.snla->flag ^= SNLA_DRAWTIME;
+ break;
}
}
@@ -137,6 +140,12 @@ static uiBlock *nla_viewmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, (G.snla->flag & SNLA_ALLKEYED)?ICON_CHECKBOX_DEHLT:ICON_CHECKBOX_HLT,
"Only Objects On Visible Layers|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+ if (G.snla->flag & SNLA_DRAWTIME) {
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
+ } else {
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Seconds|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
+ }
+
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
if(BTST(G.snla->lock, 0)) {
@@ -193,11 +202,7 @@ static void do_nla_selectmenu(void *arg, int event)
break;
case 3: /* Select/Deselect All Markers */
deselect_markers(1, 0);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case 4: /* Borderselect markers */
borderselect_markers();
@@ -264,12 +269,16 @@ static void do_nla_strip_transformmenu(void *arg, int event)
{
switch(event) {
case 0: /* grab/move */
- transform_nlachannel_keys ('g', 0);
- update_for_newframe_muted();
+ transform_nlachannel_keys('g', 0);
+ update_for_newframe_muted();
break;
case 1: /* scale */
- transform_nlachannel_keys ('s', 0);
- update_for_newframe_muted();
+ transform_nlachannel_keys('s', 0);
+ update_for_newframe_muted();
+ break;
+ case 2: /* extend */
+ transform_nlachannel_keys('e', 0);
+ update_for_newframe_muted();
break;
}
allqueue(REDRAWVIEW3D, 0);
@@ -284,8 +293,10 @@ static uiBlock *nla_strip_transformmenu(void *arg_unused)
uiBlockSetButmFunc(block, do_nla_strip_transformmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Extend from Frame|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
-
+
+
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
@@ -396,11 +407,7 @@ static void do_nla_markermenu(void *arg, int event)
break;
}
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
static uiBlock *nla_markermenu(void *arg_unused)
@@ -501,6 +508,24 @@ void nla_buttons(void)
uiBlockSetEmboss(block, UI_EMBOSS);
+ /* draw AUTOSNAP */
+ xco += 8;
+
+ if (G.snla->flag & SNLA_DRAWTIME) {
+ uiDefButS(block, MENU, B_REDR,
+ "Auto-Snap Strips/Keyframes %t|Off %x0|Second Step %x1|Nearest Second %x2|Nearest Marker %x3",
+ xco,0,70,YIC, &(G.snla->autosnap), 0, 1, 0, 0,
+ "Auto-snapping mode for strips and keyframes when transforming");
+ }
+ else {
+ uiDefButS(block, MENU, B_REDR,
+ "Auto-Snap Strips/Keyframes %t|Off %x0|Frame Step %x1|Nearest Frame %x2|Nearest Marker %x3",
+ xco,0,70,YIC, &(G.snla->autosnap), 0, 1, 0, 0,
+ "Auto-snapping mode for strips and keyframes when transforming");
+ }
+
+ xco += (70 + 8);
+
/* FULL WINDOW */
diff --git a/source/blender/src/header_seq.c b/source/blender/src/header_seq.c
index e3bffc550b5..4075371108b 100644
--- a/source/blender/src/header_seq.c
+++ b/source/blender/src/header_seq.c
@@ -63,7 +63,7 @@
#include "BSE_drawipo.h"
#include "BSE_headerbuttons.h"
#include "BSE_sequence.h"
-
+#include "BSE_time.h"
#include "blendef.h"
#include "mydevice.h"
@@ -115,10 +115,22 @@ static uiBlock *seq_viewmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "seq_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_seq_viewmenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation in 3D View|Alt Shift A", 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ if (sseq->mainb == 0) {
+ 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_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, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -126,12 +138,12 @@ static uiBlock *seq_viewmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
+
/* Lock Time */
uiDefIconTextBut(block, BUTM, 1, (G.v2d->flag & V2D_VIEWLOCK)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
"Lock Time to Other Windows|", 0, yco-=20,
menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
-
+
/* Draw time or frames.*/
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -167,6 +179,24 @@ static void do_seq_selectmenu(void *arg, int event)
case 1:
swap_select_seq();
break;
+ case 2:
+ select_dir_from_last(1);
+ break;
+ case 3:
+ select_dir_from_last(2);
+ break;
+ case 4:
+ select_surround_from_last();
+ break;
+ case 5:
+ select_neighbor_from_last(1);
+ break;
+ case 6:
+ select_neighbor_from_last(2);
+ break;
+ case 7:
+ select_linked_seq(2);
+ break;
}
}
@@ -177,9 +207,17 @@ static uiBlock *seq_selectmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "seq_selectmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_seq_selectmenu, NULL);
-
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Strips to the Left", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Strips to the Right", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surrounding Handles", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Left Handles", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Right Handles", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked|Ctrl L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
if(curarea->headertype==HEADERTOP) {
@@ -364,6 +402,9 @@ static void do_seq_editmenu(void *arg, int event)
case 6: /* Delete */
del_seq();
break;
+ case 7: /* Grab/Extend */
+ transform_seq('e', 0);
+ break;
case 8:
set_filter_seq();
break;
@@ -385,6 +426,15 @@ static void do_seq_editmenu(void *arg, int event)
case 14:
reassign_inputs_seq_effect();
break;
+ case 15:
+ seq_remap_paths();
+ break;
+ case 16:
+ seq_separate_images();
+ break;
+ case 17:
+ reload_sequence();
+ break;
}
}
@@ -403,11 +453,13 @@ static uiBlock *seq_editmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Strip Properties...|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Extend from frame|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Snap to Current Frame|Shift S, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cut at Current Frame|K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate Images to Strips|Y", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -423,6 +475,10 @@ static uiBlock *seq_editmenu(void *arg_unused)
}
else if(last_seq->type == SEQ_IMAGE) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Change Image...|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Change Scene...|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
+
+ if(last_seq->type==SEQ_IMAGE)
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remap Paths...|Shift R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
+
}
/* if (last_seq != NULL && last_seq->type == SEQ_MOVIE) {
@@ -444,6 +500,9 @@ static uiBlock *seq_editmenu(void *arg_unused)
}
}
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reload Strip Data...|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
+
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
@@ -458,6 +517,78 @@ static uiBlock *seq_editmenu(void *arg_unused)
return block;
}
+static void do_seq_markermenu(void *arg, int event)
+{
+ SpaceSeq *sseq= curarea->spacedata.first;
+
+ switch(event)
+ {
+ case 1:
+ add_marker(CFRA);
+ break;
+ case 2:
+ duplicate_marker();
+ break;
+ case 3:
+ remove_marker();
+ break;
+ case 4:
+ rename_marker();
+ break;
+ case 5:
+ transform_markers('g', 0);
+ break;
+ case 6:
+ sseq->flag ^= SEQ_MARKER_TRANS;
+ break;
+
+ }
+
+ allqueue(REDRAWMARKER, 0);
+}
+
+static uiBlock *seq_markermenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco= 0, menuwidth=120;
+
+ SpaceSeq *sseq= curarea->spacedata.first;
+
+ block= uiNewBlock(&curarea->uiblocks, "ipo_markermenu",
+ UI_EMBOSSP, UI_HELV, curarea->headwin);
+ uiBlockSetButmFunc(block, do_seq_markermenu, NULL);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Marker|Ctrl Alt M", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Marker|Ctrl Shift D", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Marker", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "(Re)Name Marker|Ctrl M", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move Marker|Ctrl G", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, (sseq->flag & SEQ_MARKER_TRANS)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
+ "Transform Markers", 0, yco-=20,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+
+ if(curarea->headertype==HEADERTOP) {
+ uiBlockSetDirection(block, UI_DOWN);
+ } else {
+ uiBlockSetDirection(block, UI_TOP);
+ uiBlockFlipOrder(block);
+ }
+
+ uiTextBoundsBlock(block, 50);
+
+ return block;
+}
void do_seq_buttons(short event)
{
@@ -533,6 +664,10 @@ void seq_buttons()
uiDefPulldownBut(block,seq_selectmenu, NULL, "Select", xco, -2, xmax-3, 24, "");
xco+=xmax;
+ xmax= GetButStringLength("Marker");
+ uiDefPulldownBut(block,seq_markermenu, NULL, "Marker", xco, -2, xmax-3, 24, "");
+ xco+=xmax;
+
xmax= GetButStringLength("Add");
uiDefPulldownBut(block, seq_addmenu, NULL, "Add", xco, -2, xmax-3, 24, "");
xco+= xmax;
@@ -581,6 +716,8 @@ void seq_buttons()
uiDefIconBut(block, BUT, B_IPOBORDER, ICON_BORDERMOVE, xco+=XIC,0,XIC,YIC, 0, 0, 0, 0, 0, "Zooms view to fit area");
uiBlockEndAlign(block);
+ /* CLEAR MEM */
+ xco+= 8;
/* CLEAR MEM */
xco+= 8;
diff --git a/source/blender/src/header_sound.c b/source/blender/src/header_sound.c
index 55c14f1a0aa..c2fb72d7d17 100644
--- a/source/blender/src/header_sound.c
+++ b/source/blender/src/header_sound.c
@@ -269,11 +269,7 @@ static void do_sound_markermenu(void *arg, int event)
break;
}
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
static uiBlock *sound_markermenu(void *arg_unused)
diff --git a/source/blender/src/header_text.c b/source/blender/src/header_text.c
index 92a5a49a681..04c354fb2b1 100644
--- a/source/blender/src/header_text.c
+++ b/source/blender/src/header_text.c
@@ -52,6 +52,8 @@
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_text_types.h"
+#include "DNA_constraint_types.h"
+#include "DNA_action_types.h"
#include "BIF_drawtext.h"
#include "BIF_interface.h"
@@ -59,11 +61,14 @@
#include "BIF_screen.h"
#include "BIF_space.h"
#include "BIF_toolbox.h"
+
#include "BKE_global.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_sca.h"
#include "BKE_text.h"
+#include "BKE_depsgraph.h"
+
#include "BSE_filesel.h"
#include "BPY_extern.h"
@@ -135,27 +140,68 @@ void do_text_buttons(unsigned short event)
break;
case B_TEXTDELETE:
-
- text= st->text;
- if (!text) return;
-
- /* make the previous text active, if its not there make the next text active */
- if (st->text->id.prev) {
- st->text = st->text->id.prev;
- pop_space_text(st);
- } else if (st->text->id.next) {
- st->text = st->text->id.next;
- pop_space_text(st);
- }
+ {
+ Object *obt;
+ bConstraint *con;
+ int update;
- BPY_clear_bad_scriptlinks(text);
- free_text_controllers(text);
-
- unlink_text(text);
- free_libblock(&G.main->text, text);
-
- allqueue(REDRAWTEXT, 0);
- allqueue(REDRAWHEADERS, 0);
+ text= st->text;
+ if (!text) return;
+
+ /* make the previous text active, if its not there make the next text active */
+ if (st->text->id.prev) {
+ st->text = st->text->id.prev;
+ pop_space_text(st);
+ } else if (st->text->id.next) {
+ st->text = st->text->id.next;
+ pop_space_text(st);
+ }
+
+ /*check all pyconstraints*/
+ for (obt=G.main->object.first; obt; obt=obt->id.next) {
+ update = 0;
+ if(obt->type==OB_ARMATURE && obt->pose) {
+ bPoseChannel *pchan;
+ for(pchan= obt->pose->chanbase.first; pchan; pchan= pchan->next) {
+ for (con = pchan->constraints.first; con; con=con->next) {
+ if (con->type==CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data = con->data;
+ if (data->text==text) data->text = NULL;
+ update = 1;
+
+ }
+ }
+ }
+ }
+ for (con = obt->constraints.first; con; con=con->next) {
+ if (con->type==CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data = con->data;
+ if (data->text==text) data->text = NULL;
+ update = 1;
+ }
+ }
+
+ if (update) {
+ DAG_object_flush_update(G.scene, obt, OB_RECALC_DATA);
+ }
+ }
+
+ BPY_clear_bad_scriptlinks(text);
+ free_text_controllers(text);
+
+ unlink_text(text);
+ free_libblock(&G.main->text, text);
+
+ allqueue(REDRAWTEXT, 0);
+ allqueue(REDRAWHEADERS, 0);
+
+ /*for if any object constraints were changed.*/
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
+
+ BIF_undo_push("Delete Text");
+ }
break;
/*
@@ -240,7 +286,7 @@ static void do_text_filemenu(void *arg, int event)
case 1:
st->text= add_empty_text( "Text" );
st->top=0;
-
+
allqueue(REDRAWTEXT, 0);
allqueue(REDRAWHEADERS, 0);
break;
@@ -265,6 +311,42 @@ static void do_text_filemenu(void *arg, int event)
case 6:
run_python_script(st);
break;
+ case 7:
+ {
+ Object *ob;
+ bConstraint *con;
+ short update;
+
+ /* check all pyconstraints */
+ for (ob= G.main->object.first; ob; ob= ob->id.next) {
+ update = 0;
+ if (ob->type==OB_ARMATURE && ob->pose) {
+ bPoseChannel *pchan;
+ for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ for (con = pchan->constraints.first; con; con= con->next) {
+ if (con->type==CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data = con->data;
+ if (data->text==text) BPY_pyconstraint_update(ob, con);
+ update = 1;
+
+ }
+ }
+ }
+ }
+ for (con = ob->constraints.first; con; con= con->next) {
+ if (con->type==CONSTRAINT_TYPE_PYTHON) {
+ bPythonConstraint *data = con->data;
+ if (data->text==text) BPY_pyconstraint_update(ob, con);
+ update = 1;
+ }
+ }
+
+ if (update) {
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ }
+ }
+ break;
default:
break;
}
@@ -608,13 +690,23 @@ static uiBlock *text_filemenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "New|Alt N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Open...|Alt O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
+
if(text) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reopen|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
+
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Save As...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
+
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Run Python Script|Alt P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
+
+ if (BPY_is_pyconstraint(text))
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Refresh All PyConstraints", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
}
uiDefIconTextBlockBut(block, text_template_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Script Templates", 0, yco-=20, 120, 19, "");
diff --git a/source/blender/src/header_time.c b/source/blender/src/header_time.c
index 00ce8987d27..53b22fc4e39 100644
--- a/source/blender/src/header_time.c
+++ b/source/blender/src/header_time.c
@@ -136,7 +136,7 @@ static void do_time_redrawmenu(void *arg, int event)
}
else {
if(event==1001) {
- button(&G.scene->r.frs_sec,1,120,"Frames/Second:");
+ button(&G.scene->r.frs_sec,1,120,"FPS:");
}
}
}
@@ -180,7 +180,7 @@ static uiBlock *time_redrawmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- sprintf(str, "Set Frames/Sec (%d)", G.scene->r.frs_sec);
+ sprintf(str, "Set Frames/Sec (%d/%f)", G.scene->r.frs_sec, G.scene->r.frs_sec_base);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, str, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1001, "");
@@ -241,6 +241,9 @@ static void do_time_viewmenu(void *arg, int event)
if(G.v2d->flag & V2D_VIEWLOCK)
view2d_do_locks(curarea, 0);
break;
+ case 12: /* only show keyframes from selected data */
+ stime->flag ^= TIME_ONLYACTSEL;
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -265,6 +268,9 @@ static uiBlock *time_viewmenu(void *arg_unused)
else
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Frames|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
+ uiDefIconTextBut(block, BUTM, 1, (stime->flag & TIME_ONLYACTSEL)?ICON_CHECKBOX_HLT:ICON_CHECKBOX_DEHLT,
+ "Only Selected Data Keys|", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
+
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Jump To Next Marker|PageUp", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
diff --git a/source/blender/src/header_view3d.c b/source/blender/src/header_view3d.c
index 98b90485415..f212a467b99 100644
--- a/source/blender/src/header_view3d.c
+++ b/source/blender/src/header_view3d.c
@@ -71,6 +71,8 @@
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
+#include "BKE_modifier.h"
+#include "BKE_particle.h"
#include "BKE_utildefines.h" /* for VECCOPY */
#ifdef WITH_VERSE
@@ -97,6 +99,7 @@
#include "BIF_editlattice.h"
#include "BIF_editarmature.h"
+#include "BIF_editparticle.h"
#include "BIF_editconstraint.h"
#include "BIF_editdeform.h"
#include "BIF_editfont.h"
@@ -144,17 +147,16 @@
#define V3D_OBJECTMODE_SEL ICON_OBJECT
#define V3D_EDITMODE_SEL ICON_EDITMODE_HLT
#define V3D_SCULPTMODE_SEL ICON_SCULPTMODE_HLT
-#define V3D_FACESELECTMODE_SEL ICON_FACESEL_HLT
+#define V3D_FACESELECT_SEL ICON_FACESEL_HLT /* this is not a mode anymore - just a switch */
#define V3D_VERTEXPAINTMODE_SEL ICON_VPAINT_HLT
#define V3D_TEXTUREPAINTMODE_SEL ICON_TPAINT_HLT
#define V3D_WEIGHTPAINTMODE_SEL ICON_WPAINT_HLT
#define V3D_POSEMODE_SEL ICON_POSE_HLT
+#define V3D_PARTICLEEDITMODE_SEL ICON_ANIM
#define TEST_EDITMESH if(G.obedit==0) return; \
if( (G.vd->lay & G.obedit->lay)==0 ) return;
-static int viewmovetemp = 0;
-
void do_layer_buttons(short event)
{
static int oldlay= 1;
@@ -386,7 +388,7 @@ static void do_view3d_view_alignviewmenu(void *arg, int event)
case 2:
if ((G.obedit) && (G.obedit->type == OB_MESH)) {
editmesh_align_view_to_selected(v3d, event);
- } else if (G.f & G_FACESELECT) {
+ } else if (FACESEL_PAINT_TEST) {
Object *obact= OBACT;
if (obact && obact->type==OB_MESH) {
Mesh *me= obact->data;
@@ -438,7 +440,7 @@ static uiBlock *view3d_view_alignviewmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor and View All|Shift C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align Active Camera to View|Ctrl Alt NumPad 0", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
- if (((G.obedit) && (G.obedit->type == OB_MESH)) || (G.f & G_FACESELECT)) {
+ if (((G.obedit) && (G.obedit->type == OB_MESH)) || (FACESEL_PAINT_TEST)) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Top)|Shift V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Front)|Shift V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Side)|Shift V", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
@@ -595,6 +597,9 @@ static void do_view3d_viewmenu(void *arg, int event)
case 18: /* render preview */
toggle_blockhandler(curarea, VIEW3D_HANDLER_PREVIEW, 0);
break;
+ case 19: /* zoom within border */
+ view3d_border_zoom();
+ break;
}
allqueue(REDRAWVIEW3D, 1);
}
@@ -652,6 +657,7 @@ static uiBlock *view3d_viewmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Clipping Border|Alt B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
else
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Clipping Border|Alt B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
+ if (v3d->persp==0) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Within Border...|Shift B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 19, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
if(!curarea->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
@@ -859,6 +865,7 @@ void do_view3d_select_object_groupedmenu(void *arg, int event)
case 6: /* Objects on Shared Layers */
case 7: /* Objects in Same Group */
case 8: /* Object Hooks*/
+ case 9: /* Object PassIndex*/
select_object_grouped((short)event);
break;
}
@@ -881,7 +888,8 @@ static uiBlock *view3d_select_object_groupedmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Objects on Shared Layers|Shift G, 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Objects in Same Group|Shift G, 7", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Hooks|Shift G, 8", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
-
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object PassIndex|Shift G, 9", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
+
uiBlockSetDirection(block, UI_RIGHT);
uiTextBoundsBlock(block, 60);
return block;
@@ -954,7 +962,7 @@ void do_view3d_select_meshmenu(void *arg, int event)
selectswap_mesh();
break;
case 4: /* select linked vertices */
- selectconnected_mesh(LR_CTRLKEY);
+ selectconnected_mesh_all();
break;
case 5: /* select random */
selectrandom_mesh();
@@ -1021,7 +1029,7 @@ static uiBlock *view3d_select_meshmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -1034,7 +1042,7 @@ static uiBlock *view3d_select_meshmenu(void *arg_unused)
"Sharp Edges|Ctrl Alt Shift S",
0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Linked flat faces|Ctrl Alt Shift F",
+ "Linked Flat Faces|Ctrl Alt Shift F",
0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
@@ -1050,7 +1058,7 @@ static uiBlock *view3d_select_meshmenu(void *arg_unused)
"Non-Triangles/Quads|Ctrl Alt Shift 5",
0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1,
- "Group From Selection|Shift G",
+ "Similar to Selection...|Shift G",
0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6,
@@ -1393,10 +1401,7 @@ void do_view3d_select_faceselmenu(void *arg, int event)
case 3: /* Select Inverse */
selectswap_tface();
break;
- case 4: /* Select Same UV */
- get_same_uv();
- break;
- case 5: /* Select Linked */
+ case 4: /* Select Linked */
select_linked_tfaces(2);
break;
}
@@ -1419,10 +1424,9 @@ static uiBlock *view3d_select_faceselmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Same UV", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Faces|Ctrl L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Faces|Ctrl L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -1744,19 +1748,19 @@ static void do_view3d_transformmenu(void *arg, int event)
Transform();
break;
case 15:
- G.vd->flag2 &= ~V3D_TRANSFORM_SNAP;
+ G.scene->snap_flag &= ~SCE_SNAP;
break;
case 16:
- G.vd->flag2 |= V3D_TRANSFORM_SNAP;
+ G.scene->snap_flag |= SCE_SNAP;
break;
case 17:
- G.vd->snap_target = V3D_SNAP_TARGET_CLOSEST;
+ G.scene->snap_target = SCE_SNAP_TARGET_CLOSEST;
break;
case 18:
- G.vd->snap_target = V3D_SNAP_TARGET_CENTER;
+ G.scene->snap_target = SCE_SNAP_TARGET_CENTER;
break;
case 19:
- G.vd->snap_target = V3D_SNAP_TARGET_MEDIAN;
+ G.scene->snap_target = SCE_SNAP_TARGET_MEDIAN;
break;
}
allqueue(REDRAWVIEW3D, 0);
@@ -1813,7 +1817,7 @@ static uiBlock *view3d_transformmenu(void *arg_unused)
{
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- if (G.vd->flag2 & V3D_TRANSFORM_SNAP)
+ if (G.scene->snap_flag & SCE_SNAP)
{
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Grid", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
@@ -1826,19 +1830,19 @@ static uiBlock *view3d_transformmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- switch(G.vd->snap_target)
+ switch(G.scene->snap_target)
{
- case V3D_SNAP_TARGET_CLOSEST:
+ case SCE_SNAP_TARGET_CLOSEST:
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Closest", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
break;
- case V3D_SNAP_TARGET_CENTER:
+ case SCE_SNAP_TARGET_CENTER:
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Center", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
break;
- case V3D_SNAP_TARGET_MEDIAN:
+ case SCE_SNAP_TARGET_MEDIAN:
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Median", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
@@ -2091,6 +2095,7 @@ static void do_view3d_edit_object_copyattrmenu(void *arg, int event)
case 25:
case 26:
case 29:
+ case 30:
copy_attr((short)event);
break;
}
@@ -2154,6 +2159,8 @@ static uiBlock *view3d_edit_object_copyattrmenu(void *arg_unused)
if( give_parteff(ob) ) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Particle Settings|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
}
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Pass Index|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 30, "");
}
uiBlockSetDirection(block, UI_RIGHT);
@@ -2532,7 +2539,7 @@ void do_view3d_edit_mesh_verticesmenu(void *arg, int event)
make_parent();
break;
case 1: /* remove doubles */
- count= removedoublesflag(1, G.scene->toolsettings->doublimit);
+ count= removedoublesflag(1, 0, G.scene->toolsettings->doublimit);
notice("Removed: %d", count);
if (count) { /* only undo and redraw if an action is taken */
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
@@ -2590,6 +2597,8 @@ static uiBlock *view3d_edit_mesh_verticesmenu(void *arg_unused)
return block;
}
+extern void editmesh_mark_sharp(int set); /* declared in editmesh_mods.c */
+
void do_view3d_edit_mesh_edgesmenu(void *arg, int event)
{
float fac;
@@ -2767,7 +2776,7 @@ static uiBlock *view3d_edit_mesh_facesmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Quads to Triangles|Ctrl T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Triangles to Quads|Alt J", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Triangle Edges|Ctrl F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Triangle Edges|Ctrl Shift F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -2972,13 +2981,20 @@ static void do_view3d_edit_meshmenu(void *arg, int event)
if(G.scene->proportional) G.scene->proportional= 0;
else G.scene->proportional= 1;
break;
+ case 13: /* automerge edit (toggle) */
+ if(G.scene->automerge) G.scene->automerge= 0;
+ else G.scene->automerge= 1;
+ break;
#ifdef WITH_VERSE
- case 13:
+ case 14:
if(session_list.first != session_list.last) session = session_menu();
else session = session_list.first;
if(session) b_verse_push_object(session, G.obedit);
break;
#endif
+ case 15:
+ uv_autocalc_tface();
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -2995,13 +3011,13 @@ static uiBlock *view3d_edit_meshmenu(void *arg_unused)
#ifdef WITH_VERSE
if((session_list.first != NULL) && (!G.obedit->vnode)) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Share at Verse Server",
- 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
}
#endif
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Shift U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Editing|Ctrl Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Redo Editing|Ctrl Shift Z", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBlockBut(block, editmode_undohistorymenu, NULL, ICON_RIGHTARROW_THIN, "Undo History", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -3017,6 +3033,10 @@ static uiBlock *view3d_edit_meshmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
@@ -3031,6 +3051,8 @@ static uiBlock *view3d_edit_meshmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+
if(G.scene->proportional) {
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
} else {
@@ -3040,6 +3062,14 @@ static uiBlock *view3d_edit_meshmenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ if(G.scene->automerge) {
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "AutoMerge Editing", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
+ } else {
+ uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "AutoMerge Editing", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
+ }
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
uiDefIconTextBlockBut(block, view3d_edit_mesh_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Vertices", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -3228,6 +3258,9 @@ static void do_view3d_edit_curvemenu(void *arg, int event)
initTransform(TFM_WARP, CTX_NONE);
Transform();
break;
+ case 15:
+ uv_autocalc_tface();
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -3255,6 +3288,10 @@ static uiBlock *view3d_edit_curvemenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extrude|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Segment|F", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
@@ -3348,6 +3385,9 @@ static void do_view3d_edit_metaballmenu(void *arg, int event)
break;
case 7: /* Transform Properties */
add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, 0);
+ break;
+ case 8:
+ uv_autocalc_tface();
break;
}
allqueue(REDRAWVIEW3D, 0);
@@ -3373,6 +3413,10 @@ static uiBlock *view3d_edit_metaballmenu(void *arg_unused)
uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
@@ -3558,6 +3602,9 @@ static void do_view3d_edit_latticemenu(void *arg, int event)
if(G.scene->proportional) G.scene->proportional= 0;
else G.scene->proportional= 1;
break;
+ case 6:
+ uv_autocalc_tface();
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -3584,6 +3631,10 @@ static uiBlock *view3d_edit_latticemenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
if(G.scene->proportional) {
uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Proportional Editing|O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
} else {
@@ -3632,8 +3683,43 @@ static uiBlock *view3d_edit_armature_parentmenu(void *arg_unused)
return block;
}
+void do_view3d_edit_armature_rollmenu(void *arg, int event)
+{
+ if (event == 1 || event == 2)
+ /* set roll based on aligning z-axis */
+ auto_align_armature(event);
+ else if (event == 3) {
+ /* interactively set bone roll */
+ initTransform(TFM_BONE_ROLL, CTX_NONE);
+ Transform();
+ }
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+static uiBlock *view3d_edit_armature_rollmenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco = 20, menuwidth = 120;
+
+ block= uiNewBlock(&curarea->uiblocks, "view3d_edit_armature_rollmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_view3d_edit_armature_rollmenu, NULL);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Roll (Z-Axis Up)|Ctrl N, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Roll to Cursor|Ctrl N, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Roll|Ctrl R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+ uiTextBoundsBlock(block, 60);
+ return block;
+}
+
static void do_view3d_edit_armaturemenu(void *arg, int event)
{
+ static short numcuts= 2;
+
switch(event) {
case 0: /* Undo Editing */
@@ -3661,19 +3747,29 @@ static void do_view3d_edit_armaturemenu(void *arg, int event)
case 10: /* forked! */
extrude_armature(1);
break;
- case 11: /* clear roll */
- auto_align_armature();
- break;
case 12: /* subdivide */
- subdivide_armature();
+ subdivide_armature(1);
break;
case 13: /* flip left and right names */
armature_flip_names();
break;
- case 14: /* interactively set bone roll */
- initTransform(TFM_BONE_ROLL, CTX_NONE);
+ case 15: /* subdivide multi */
+ if(button(&numcuts, 1, 128, "Number of Cuts:")==0) return;
+ waitcursor(1);
+ subdivide_armature(numcuts);
+ break;
+ case 16: /* Alt-S transform (BoneSize) */
+ initTransform(TFM_BONESIZE, CTX_NONE);
Transform();
+ break;
+ case 17: /* move to layer */
+ pose_movetolayer();
+ break;
+ case 18:
+ uv_autocalc_tface();
+ break;
}
+
allqueue(REDRAWVIEW3D, 0);
}
@@ -3728,8 +3824,12 @@ static uiBlock *view3d_edit_armaturemenu(void *arg_unused)
uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Bone Roll Angle|Ctrl R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Bone Roll Angle|Ctrl N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
+ uiDefIconTextBlockBut(block, view3d_edit_armature_rollmenu, NULL, ICON_RIGHTARROW_THIN, "Bone Roll", 0, yco-=20, 120, 19, "");
+
+ if (arm->drawtype==ARM_ENVELOPE)
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale Envelope Distance|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
+ else if (arm->drawtype==ARM_B_BONE)
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale B-Bone Width|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -3743,7 +3843,17 @@ static uiBlock *view3d_edit_armaturemenu(void *arg_unused)
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Left & Right Names|W, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Multi|W, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip Left & Right Names|W, 3", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Switch Armature Layers|Shift M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Bone To Layer|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "UV Unwrap|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -3978,7 +4088,11 @@ static void do_view3d_pose_armaturemenu(void *arg, int event)
}
}
break;
+ case 14: /* move bone to layer / change armature layer */
+ pose_movetolayer();
+ break;
}
+
allqueue(REDRAWVIEW3D, 0);
}
@@ -4004,7 +4118,7 @@ static uiBlock *view3d_pose_armaturemenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Current Pose", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Paste Pose", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Paste Flipped Pose", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
-
+
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
uiDefIconTextBlockBut(block, view3d_pose_armature_motionpathsmenu, NULL, ICON_RIGHTARROW_THIN, "Motion Paths", 0, yco-=20, 120, 19, "");
@@ -4016,6 +4130,10 @@ static uiBlock *view3d_pose_armaturemenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Flip L/R Names|W", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Attributes...|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Switch Armature Layers|Shift M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move Bone To Layer|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
@@ -4046,7 +4164,7 @@ static void do_view3d_vpaintmenu(void *arg, int event)
BIF_undo();
break;
case 1: /* set vertex colors/weight */
- if(G.f & G_FACESELECT)
+ if(FACESEL_PAINT_TEST)
clear_vpaint_selectedfaces();
else /* we know were in vertex paint mode */
clear_vpaint();
@@ -4127,9 +4245,10 @@ static uiBlock *view3d_tpaintmenu(void *arg_unused)
static void do_view3d_wpaintmenu(void *arg, int event)
{
+ Object *ob= OBACT;
- /* events >= 2 are registered bpython scripts */
- if (event >= 2) BPY_menu_do_python(PYMENU_WEIGHTPAINT, event - 2);
+ /* events >= 3 are registered bpython scripts */
+ if (event >= 4) BPY_menu_do_python(PYMENU_WEIGHTPAINT, event - 4);
switch(event) {
case 0: /* undo weight painting */
@@ -4138,6 +4257,12 @@ static void do_view3d_wpaintmenu(void *arg, int event)
case 1: /* set vertex colors/weight */
clear_wpaint_selectedfaces();
break;
+ case 2: /* vgroups from envelopes */
+ pose_adds_vgroups(ob, 0);
+ break;
+ case 3: /* vgroups from bone heat */
+ pose_adds_vgroups(ob, 1);
+ break;
}
allqueue(REDRAWVIEW3D, 0);
}
@@ -4148,22 +4273,30 @@ static uiBlock *view3d_wpaintmenu(void *arg_unused)
short yco= 0, menuwidth=120, menunr=1;
BPyMenu *pym;
int i=0;
-
+
block= uiNewBlock(&curarea->uiblocks, "view3d_paintmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_view3d_wpaintmenu, NULL);
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Undo Weight Painting|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- if (G.f & G_FACESELECT) {
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Bone Heat Weights to Vertex Groups|W, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Bone Envelopes to Vertex Groups|W, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ if (FACESEL_PAINT_TEST) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Weight|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
menunr++;
}
- /* note that we account for the 2 previous entries with i+2:
+ /* note that we account for the 4 previous entries with i+4:
even if the last item isnt displayed, it dosent matter */
for (pym = BPyMenuTable[PYMENU_WEIGHTPAINT]; pym; pym = pym->next, i++) {
uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
- menuwidth, 19, NULL, 0.0, 0.0, 1, i+2,
+ menuwidth, 19, NULL, 0.0, 0.0, 1, i+4,
pym->tooltip?pym->tooltip:pym->filename);
}
@@ -4186,9 +4319,7 @@ void do_view3d_sculpt_inputmenu(void *arg, int event)
switch(event) {
case 0:
- val= sd->averaging;
- if(button(&val,1,10,"Averaging:")==0) return;
- sd->averaging= val;
+ sd->flags ^= SCULPT_INPUT_SMOOTH;
break;
case 1:
val= sd->tablet_size;
@@ -4233,10 +4364,10 @@ void do_view3d_sculptmenu(void *arg, int event)
G.vd->pivot_last= !G.vd->pivot_last;
break;
case 12:
- sd->draw_flag ^= SCULPTDRAW_FAST;
+ sd->flags ^= SCULPT_DRAW_FAST;
break;
case 13:
- sd->draw_flag ^= SCULPTDRAW_BRUSH;
+ sd->flags ^= SCULPT_DRAW_BRUSH;
break;
case 14:
add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
@@ -4262,11 +4393,12 @@ uiBlock *view3d_sculpt_inputmenu(void *arg_unused)
{
uiBlock *block;
short yco= 0, menuwidth= 120;
+ SculptData *sd= &G.scene->sculptdata;
block= uiNewBlock(&curarea->uiblocks, "view3d_sculpt_inputmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
uiBlockSetButmFunc(block, do_view3d_sculpt_inputmenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Averaging", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefIconTextBut(block, BUTM, 1, ((sd->flags & SCULPT_INPUT_SMOOTH) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Smooth Stroke", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tablet Size Adjust", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tablet Strength Adjust", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
@@ -4287,10 +4419,10 @@ uiBlock *view3d_sculptmenu(void *arg_unused)
uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Sculpt Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBlockBut(block, view3d_sculpt_inputmenu, NULL, ICON_RIGHTARROW_THIN, "Input Devices", 0, yco-=20, 120, 19, "");
+ uiDefIconTextBlockBut(block, view3d_sculpt_inputmenu, NULL, ICON_RIGHTARROW_THIN, "Input Settings", 0, yco-=20, 120, 19, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ((sd->draw_flag & SCULPTDRAW_BRUSH) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Display Brush", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
- uiDefIconTextBut(block, BUTM, 1, ((sd->draw_flag & SCULPTDRAW_FAST) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Partial Redraw", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
+ uiDefIconTextBut(block, BUTM, 1, ((sd->flags & SCULPT_DRAW_BRUSH) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Display Brush", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
+ uiDefIconTextBut(block, BUTM, 1, ((sd->flags & SCULPT_DRAW_FAST) ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Partial Redraw", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
if(G.vd)
uiDefIconTextBut(block, BUTM, 1, (G.vd->pivot_last ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Pivot Last", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
@@ -4314,7 +4446,7 @@ uiBlock *view3d_sculptmenu(void *arg_unused)
}
}
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==FLATTEN_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Flatten", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+ uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==FLATTEN_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Flatten|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==LAYER_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Layer|L", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==GRAB_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Grab|G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
uiDefIconTextBut(block, BUTM, 1, (sd->brush_type==INFLATE_BRUSH ? ICON_CHECKBOX_HLT : ICON_CHECKBOX_DEHLT), "Inflate|I", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
@@ -4336,126 +4468,6 @@ uiBlock *view3d_sculptmenu(void *arg_unused)
return block;
}
-static void do_view3d_facesel_propertiesmenu(void *arg, int event)
-{
- MTFace *tf = get_active_tface(NULL);
-
- if (tf) {
- switch(event) {
- case 0: /* textured */
- tf->mode ^= TF_TEX;
- break;
- case 1: /* tiled*/
- tf->mode ^= TF_TILES;
- break;
- case 2: /* light */
- tf->mode ^= TF_LIGHT;
- break;
- case 3: /* invisible */
- tf->mode ^= TF_INVISIBLE;
- break;
- case 4: /* collision */
- tf->mode ^= TF_DYNAMIC;
- break;
- case 5: /* shared vertex colors */
- tf->mode ^= TF_SHAREDCOL;
- break;
- case 6: /* two sided */
- tf->mode ^= TF_TWOSIDE;
- break;
- case 7: /* use object color */
- tf->mode ^= TF_OBCOL;
- break;
- case 8: /* halo */
- tf->mode ^= TF_BILLBOARD;
- break;
- case 9: /* billboard */
- tf->mode ^= TF_BILLBOARD2;
- break;
- case 10: /* shadow */
- tf->mode ^= TF_SHADOW;
- break;
- case 11: /* text */
- tf->mode ^= TF_BMFONT;
- break;
- case 12: /* opaque blend mode */
- tf->transp = TF_SOLID;
- break;
- case 13: /* additive blend mode */
- tf->transp |= TF_ADD;
- break;
- case 14: /* alpha blend mode */
- tf->transp = TF_ALPHA;
- break;
- }
- }
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWBUTSEDIT, 0);
-}
-
-static uiBlock *view3d_facesel_propertiesmenu(void *arg_unused)
-{
- MTFace *tf = get_active_tface(NULL);
- uiBlock *block;
- short yco = 20, menuwidth = 120;
-
- /* display ticks/crosses depending on active tface properties */
-
- block= uiNewBlock(&curarea->uiblocks, "view3d_facesel_propertiesmenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
- uiBlockSetButmFunc(block, do_view3d_facesel_propertiesmenu, NULL);
-
- if (tf->mode & TF_TEX) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Textured", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Textured", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
-
- if (tf->mode & TF_TILES) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Tiled", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Tiled", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
-
- if (tf->mode & TF_LIGHT) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Light", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Light", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
-
- if (tf->mode & TF_INVISIBLE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Invisible", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Invisible", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
-
- if (tf->mode & TF_DYNAMIC) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Collision", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Collision", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
-
- if (tf->mode & TF_SHAREDCOL) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Shared Vertex Colors", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Shared Vertex Colors", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
-
- if (tf->mode & TF_TWOSIDE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Two Sided", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Two Sided", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
-
- if (tf->mode & TF_OBCOL) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Use Object Color", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Use Object Color", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
-
- if (tf->mode & TF_BILLBOARD) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Halo", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Halo", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
-
- if (tf->mode & TF_BILLBOARD2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Billboard", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Billboard", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
-
- if (tf->mode & TF_SHADOW) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Shadow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Shadow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
-
- if (tf->mode & TF_BMFONT) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Text", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Text", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
-
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
-
- if (tf->transp == TF_SOLID) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Opaque Blend Mode", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 12, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Opaque Blend Mode", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 12, "");
-
- if (tf->transp == TF_ADD) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Additive Blend Mode", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Additive Blend Mode", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
-
- if (tf->transp == TF_ALPHA) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Alpha Blend Mode", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
- else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Alpha Blend Mode", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 14, "");
-
- uiBlockSetDirection(block, UI_RIGHT);
- uiTextBoundsBlock(block, 60);
- return block;
-}
-
static void do_view3d_facesel_showhidemenu(void *arg, int event)
{
switch(event) {
@@ -4493,61 +4505,14 @@ static uiBlock *view3d_facesel_showhidemenu(void *arg_unused)
static void do_view3d_faceselmenu(void *arg, int event)
{
- /* code copied from buttons.c :(
- would be nice if it was split up into functions */
- Mesh *me;
- MTFace *tf, *activetf;
- MFace *mf;
- MCol *activemcol;
- int a;
-
switch(event) {
- case 0: /* copy draw mode */
- case 1: /* copy UVs */
- case 2: /* copy vertex colors */
- me= get_mesh(OBACT);
- activetf = get_active_tface(&activemcol);
-
- if (me && activetf) {
- mf = me->mface;
- for (a=0, tf=me->mtface; a < me->totface; a++, tf++, mf++) {
- if(tf!=activetf && (mf->flag & ME_FACE_SEL)) {
- if(event==0) {
- tf->mode= activetf->mode;
- tf->transp= activetf->transp;
- } else if(event==1) {
- memcpy(tf->uv, activetf->uv, sizeof(tf->uv));
- tf->tpage= activetf->tpage;
- tf->tile= activetf->tile;
-
- if(activetf->mode & TF_TILES) tf->mode |= TF_TILES;
- else tf->mode &= ~TF_TILES;
-
- }
- else if(event==2 && activemcol)
- memcpy(&me->mcol[a*4], activemcol, sizeof(MCol)*4);
- }
- }
-
- do_shared_vertexcol(me);
- }
- break;
- case 3: /* set vertex colors */
+ case 0: /* set vertex colors */
clear_vpaint_selectedfaces();
break;
- case 8: /* uv calculation */
- uv_autocalc_tface();
- break;
- case 7: /* rotate UVs */
- rotate_uv_tface();
- break;
- case 9: /* mirror UVs */
- mirror_uv_tface();
- break;
- case 10: /* mark border seam */
+ case 1: /* mark border seam */
seam_mark_clear_tface(1);
break;
- case 11: /* clear seam */
+ case 2: /* clear seam */
seam_mark_clear_tface(2);
break;
}
@@ -4562,30 +4527,194 @@ static uiBlock *view3d_faceselmenu(void *arg_unused)
block= uiNewBlock(&curarea->uiblocks, "view3d_faceselmenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
uiBlockSetButmFunc(block, do_view3d_faceselmenu, NULL);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Vertex Colors|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefIconTextBlockBut(block, view3d_facesel_propertiesmenu, NULL, ICON_RIGHTARROW_THIN, "Active Draw Mode", 0, yco-=20, 120, 19, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Draw Mode", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Border Seam|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Unwrap UVs|U", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate UVs|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mirror UVs|M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
+ uiDefIconTextBlockBut(block, view3d_facesel_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Faces", 0, yco-=20, 120, 19, "");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ if(curarea->headertype==HEADERTOP) {
+ uiBlockSetDirection(block, UI_DOWN);
+ }
+ else {
+ uiBlockSetDirection(block, UI_TOP);
+ uiBlockFlipOrder(block);
+ }
+
+ uiTextBoundsBlock(block, 50);
+ return block;
+}
+
+void do_view3d_select_particlemenu(void *arg, int event)
+{
+ /* events >= 6 are registered bpython scripts */
+ if (event >= 6) BPY_menu_do_python(PYMENU_FACESELECT, event - 6);
+
+ switch(event) {
+ case 0:
+ PE_borderselect();
+ break;
+ case 1:
+ PE_deselectall();
+ break;
+ case 2:
+ PE_select_root();
+ break;
+ case 3:
+ PE_select_tip();
+ break;
+ case 4:
+ PE_select_more();
+ break;
+ case 5:
+ PE_select_less();
+ break;
+ case 7:
+ PE_select_linked();
+ break;
+ }
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+static uiBlock *view3d_select_particlemenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco= 0, menuwidth=120;
+
+ block= uiNewBlock(&curarea->uiblocks, "view3d_select_particlemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
+ uiBlockSetButmFunc(block, do_view3d_select_particlemenu, NULL);
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy UVs & Textures", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Copy Vertex Colors", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Vertex Colors|Shift K", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, SEPR, 0, "",
+ 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
- uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Border Seam|Ctrl E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Linked|L",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Last|W, 4",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select First|W, 3",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
- uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+ uiDefBut(block, SEPR, 0, "",
+ 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
- uiDefIconTextBlockBut(block, view3d_facesel_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Faces", 0, yco-=20, 120, 19, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "More|Ctrl NumPad +",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Less|Ctrl NumPad -",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
+
+
+ if(curarea->headertype==HEADERTOP) {
+ uiBlockSetDirection(block, UI_DOWN);
+ }
+ else {
+ uiBlockSetDirection(block, UI_TOP);
+ uiBlockFlipOrder(block);
+ }
+
+ uiTextBoundsBlock(block, 50);
+ return block;
+}
+
+void do_view3d_particle_showhidemenu(void *arg, int event)
+{
+ switch(event) {
+ case 1: /* show hidden */
+ PE_hide(0);
+ break;
+ case 2: /* hide selected */
+ PE_hide(2);
+ break;
+ case 3: /* hide deselected */
+ PE_hide(1);
+ break;
+ }
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+static uiBlock *view3d_particle_showhidemenu(void *arg_unused)
+{
+ uiBlock *block;
+ short yco = 20, menuwidth = 120;
+
+ block= uiNewBlock(&curarea->uiblocks, "view3d_particle_showhidemenu", UI_EMBOSSP, UI_HELV, G.curscreen->mainwin);
+ uiBlockSetButmFunc(block, do_view3d_particle_showhidemenu, NULL);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected|Shift H",
+ 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+
+ uiBlockSetDirection(block, UI_RIGHT);
+ uiTextBoundsBlock(block, 60);
+ return block;
+}
+
+void do_view3d_particlemenu(void *arg, int event)
+{
+ ParticleEditSettings *pset= PE_settings();
+
+ switch(event) {
+ case 1:
+ add_blockhandler(curarea, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
+ break;
+ case 2:
+ if(button(&pset->totrekey, 2, 100, "Number of Keys:")==0) return;
+ PE_rekey();
+ break;
+ case 3:
+ PE_subdivide();
+ break;
+ case 4:
+ PE_delete_particle();
+ break;
+ case 5:
+ PE_mirror_x(0);
+ break;
+ case 6:
+ pset->flag ^= PE_X_MIRROR;
+ break;
+ }
+
+ allqueue(REDRAWVIEW3D, 0);
+}
+
+uiBlock *view3d_particlemenu(void *arg_unused)
+{
+ uiBlock *block;
+ ParticleEditSettings *pset= PE_settings();
+ short yco= 0, menuwidth= 120;
+
+ block= uiNewBlock(&curarea->uiblocks, "view3d_particlemenu", UI_EMBOSSP, UI_HELV, curarea->headwin);
+ uiBlockSetButmFunc(block, do_view3d_particlemenu, NULL);
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Particle Edit Properties|N", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, (pset->flag & PE_X_MIRROR)? ICON_CHECKBOX_HLT: ICON_CHECKBOX_DEHLT, "X-Axis Mirror Editing", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mirror|Ctrl M", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete...|X", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
+ if(G.scene->selectmode & SCE_SELECT_POINT)
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rekey|W, 1", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
+ uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
+
+ uiDefIconTextBlockBut(block, view3d_particle_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Particles", 0, yco-=20, menuwidth, 19, "");
if(curarea->headertype==HEADERTOP) {
uiBlockSetDirection(block, UI_DOWN);
@@ -4596,6 +4725,7 @@ static uiBlock *view3d_faceselmenu(void *arg_unused)
}
uiTextBoundsBlock(block, 50);
+
return block;
}
@@ -4624,7 +4754,7 @@ static char *view3d_modeselect_pup(void)
if (ob->type == OB_MESH) {
str += sprintf(str, formatstr, "Sculpt Mode", V3D_SCULPTMODE_SEL, ICON_SCULPTMODE_HLT);
- str += sprintf(str, formatstr, "UV Face Select", V3D_FACESELECTMODE_SEL, ICON_FACESEL_HLT);
+ /*str += sprintf(str, formatstr, "Face Select", V3D_FACESELECTMODE_SEL, ICON_FACESEL_HLT);*/
str += sprintf(str, formatstr, "Vertex Paint", V3D_VERTEXPAINTMODE_SEL, ICON_VPAINT_HLT);
str += sprintf(str, formatstr, "Texture Paint", V3D_TEXTUREPAINTMODE_SEL, ICON_TPAINT_HLT);
str += sprintf(str, formatstr, "Weight Paint", V3D_WEIGHTPAINTMODE_SEL, ICON_WPAINT_HLT);
@@ -4635,7 +4765,11 @@ static char *view3d_modeselect_pup(void)
if (ob->type==OB_ARMATURE) {
str += sprintf(str, formatstr, "Pose Mode", V3D_POSEMODE_SEL, ICON_POSE_HLT);
}
-
+
+ if (ob->particlesystem.first) {
+ str += sprintf(str, formatstr, "Particle Mode", V3D_PARTICLEEDITMODE_SEL, ICON_PHYSICS);
+ }
+
return (string);
}
@@ -4663,7 +4797,10 @@ static char *around_pup(void)
str += sprintf(str, "%s", "|Median Point %x3");
str += sprintf(str, "%s", "|3D Cursor %x1");
str += sprintf(str, "%s", "|Individual Centers %x2");
- str += sprintf(str, "%s", "|Active Object %x4");
+ if ((G.obedit) && (G.obedit->type == OB_MESH))
+ str += sprintf(str, "%s", "|Active Vert/Edge/Face %x4");
+ else
+ str += sprintf(str, "%s", "|Active Object %x4");
return string;
}
@@ -4752,37 +4889,18 @@ void do_view3d_buttons(short event)
start_game();
}
break;
- case B_VIEWZOOM:
- viewmovetemp= 0;
- viewmove(2);
- scrarea_queue_headredraw(curarea);
- break;
- case B_VIEWTRANS:
- viewmovetemp= 0;
- viewmove(1);
- scrarea_queue_headredraw(curarea);
- break;
-
case B_MODESELECT:
if (G.vd->modeselect == V3D_OBJECTMODE_SEL) {
G.vd->flag &= ~V3D_MODE;
- if(G.f & G_SCULPTMODE) set_sculptmode(); /* Switch off sculptmode */
- if(G.f & G_VERTEXPAINT) set_vpaint(); /* Switch off vertex paint */
- if(G.f & G_TEXTUREPAINT) set_texturepaint(); /* Switch off tex paint */
- if(G.f & G_WEIGHTPAINT) set_wpaint(); /* Switch off weight paint */
- if(G.f & G_FACESELECT) set_faceselect(); /* Switch off face select */
+ exit_paint_modes();
if(ob) exit_posemode(); /* exit posemode for active object */
if(G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
}
else if (G.vd->modeselect == V3D_EDITMODE_SEL) {
if(!G.obedit) {
G.vd->flag &= ~V3D_MODE;
- if(G.f & G_SCULPTMODE) set_sculptmode(); /* Switch off sculptmode */
- if(G.f & G_VERTEXPAINT) set_vpaint(); /* Switch off vertex paint */
- if(G.f & G_TEXTUREPAINT) set_texturepaint(); /* Switch off tex paint */
- if(G.f & G_WEIGHTPAINT) set_wpaint(); /* Switch off weight paint */
-
+ exit_paint_modes();
enter_editmode(EM_WAITCURSOR);
BIF_undo_push("Original"); /* here, because all over code enter_editmode is abused */
}
@@ -4790,39 +4908,16 @@ void do_view3d_buttons(short event)
else if (G.vd->modeselect == V3D_SCULPTMODE_SEL) {
if (!(G.f & G_SCULPTMODE)) {
G.vd->flag &= ~V3D_MODE;
- if(G.f & G_FACESELECT) set_faceselect(); /* Switch off face select */
- if(G.f & G_VERTEXPAINT) set_vpaint(); /* Switch off vertex paint */
- if(G.f & G_TEXTUREPAINT) set_texturepaint(); /* Switch off tex paint */
- if(G.f & G_WEIGHTPAINT) set_wpaint(); /* Switch off weight paint */
+ exit_paint_modes();
if(G.obedit) exit_editmode(2); /* exit editmode and undo */
set_sculptmode();
}
- }
- else if (G.vd->modeselect == V3D_FACESELECTMODE_SEL) {
- if ((G.obedit) && (G.f & G_FACESELECT)) {
- exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
- } else if ((G.f & G_FACESELECT) && (G.f & G_VERTEXPAINT)) {
- if(G.f & G_VERTEXPAINT) set_vpaint(); /* Switch off vertex paint */
- } else if ((G.f & G_FACESELECT) && (G.f & G_TEXTUREPAINT)) {
- if(G.f & G_TEXTUREPAINT) set_texturepaint(); /* Switch off tex paint */
- } else {
- G.vd->flag &= ~V3D_MODE;
- if(G.f & G_SCULPTMODE) set_sculptmode(); /* Switch off sculptmode */
- if(G.f & G_VERTEXPAINT) set_vpaint(); /* Switch off vertex paint */
- if(G.f & G_TEXTUREPAINT) set_texturepaint(); /* Switch off tex paint */
- if(G.f & G_WEIGHTPAINT) set_wpaint(); /* Switch off weight paint */
- if (G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
-
- set_faceselect();
- }
- }
+ }
else if (G.vd->modeselect == V3D_VERTEXPAINTMODE_SEL) {
if (!(G.f & G_VERTEXPAINT)) {
G.vd->flag &= ~V3D_MODE;
- if(G.f & G_SCULPTMODE) set_sculptmode(); /* Switch off sculptmode */
- if(G.f & G_TEXTUREPAINT) set_texturepaint(); /* Switch off tex paint */
- if(G.f & G_WEIGHTPAINT) set_wpaint(); /* Switch off weight paint */
+ exit_paint_modes();
if(G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
set_vpaint();
@@ -4831,9 +4926,7 @@ void do_view3d_buttons(short event)
else if (G.vd->modeselect == V3D_TEXTUREPAINTMODE_SEL) {
if (!(G.f & G_TEXTUREPAINT)) {
G.vd->flag &= ~V3D_MODE;
- if(G.f & G_SCULPTMODE) set_sculptmode(); /* Switch off sculptmode */
- if(G.f & G_VERTEXPAINT) set_vpaint(); /* Switch off vertex paint */
- if(G.f & G_WEIGHTPAINT) set_wpaint(); /* Switch off weight paint */
+ exit_paint_modes();
if(G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
set_texturepaint();
@@ -4842,9 +4935,7 @@ void do_view3d_buttons(short event)
else if (G.vd->modeselect == V3D_WEIGHTPAINTMODE_SEL) {
if (!(G.f & G_WEIGHTPAINT) && (ob && ob->type == OB_MESH) ) {
G.vd->flag &= ~V3D_MODE;
- if(G.f & G_SCULPTMODE) set_sculptmode(); /* Switch off sculptmode */
- if(G.f & G_VERTEXPAINT) set_vpaint(); /* Switch off vertex paint */
- if(G.f & G_TEXTUREPAINT) set_texturepaint(); /* Switch off tex paint */
+ exit_paint_modes();
if(G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
set_wpaint();
@@ -4859,6 +4950,15 @@ void do_view3d_buttons(short event)
enter_posemode();
}
}
+ else if(G.vd->modeselect == V3D_PARTICLEEDITMODE_SEL){
+ if (!(G.f & G_PARTICLEEDIT)) {
+ G.vd->flag &= ~V3D_MODE;
+ exit_paint_modes();
+ if(G.obedit) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); /* exit editmode and undo */
+
+ PE_set_particle_edit();
+ }
+ }
allqueue(REDRAWVIEW3D, 1);
break;
@@ -4874,6 +4974,7 @@ void do_view3d_buttons(short event)
countall();
BIF_undo_push("Selectmode Set: Vertex");
allqueue(REDRAWVIEW3D, 1);
+ allqueue(REDRAWIMAGE, 0); /* only needed in cases where mesh and UV selection are in sync */
break;
case B_SEL_EDGE:
if( (G.qual & LR_SHIFTKEY)==0 || G.scene->selectmode==0){
@@ -4886,6 +4987,7 @@ void do_view3d_buttons(short event)
countall();
BIF_undo_push("Selectmode Set: Edge");
allqueue(REDRAWVIEW3D, 1);
+ allqueue(REDRAWIMAGE, 0); /* only needed in cases where mesh and UV selection are in sync */
break;
case B_SEL_FACE:
if( (G.qual & LR_SHIFTKEY)==0 || G.scene->selectmode==0){
@@ -4898,6 +5000,23 @@ void do_view3d_buttons(short event)
countall();
BIF_undo_push("Selectmode Set: Face");
allqueue(REDRAWVIEW3D, 1);
+ allqueue(REDRAWIMAGE, 0); /* only needed in cases where mesh and UV selection are in sync */
+ break;
+
+ case B_SEL_PATH:
+ G.scene->selectmode= SCE_SELECT_PATH;
+ BIF_undo_push("Selectmode Set: Path");
+ allqueue(REDRAWVIEW3D, 1);
+ break;
+ case B_SEL_POINT:
+ G.scene->selectmode = SCE_SELECT_POINT;
+ BIF_undo_push("Selectmode Set: Point");
+ allqueue(REDRAWVIEW3D, 1);
+ break;
+ case B_SEL_END:
+ G.scene->selectmode = SCE_SELECT_END;
+ BIF_undo_push("Selectmode Set: End point");
+ allqueue(REDRAWVIEW3D, 1);
break;
case B_MAN_TRANS:
@@ -4998,12 +5117,14 @@ static void view3d_header_pulldowns(uiBlock *block, short *xcoord)
} else if (ob && ob->type == OB_ARMATURE) {
uiDefPulldownBut(block, view3d_select_armaturemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
}
- } else if (G.f & G_FACESELECT) {
+ } else if (FACESEL_PAINT_TEST) {
if (ob && ob->type == OB_MESH) {
uiDefPulldownBut(block, view3d_select_faceselmenu, NULL, "Select", xco,-2, xmax-3, 24, "");
}
} else if ((G.f & G_VERTEXPAINT) || (G.f & G_TEXTUREPAINT) || (G.f & G_WEIGHTPAINT)) {
uiDefBut(block, LABEL,0,"", xco, 0, xmax, 20, 0, 0, 0, 0, 0, "");
+ } else if (G.f & G_PARTICLEEDIT) {
+ uiDefPulldownBut(block, view3d_select_particlemenu, NULL, "Select", xco,-2, xmax-3, 24, "");
} else {
if (ob && (ob->flag & OB_POSEMODE))
@@ -5043,6 +5164,7 @@ static void view3d_header_pulldowns(uiBlock *block, short *xcoord)
uiDefPulldownBut(block, view3d_edit_armaturemenu, NULL, "Armature", xco,-2, xmax-3, 24, "");
xco+= xmax;
}
+
}
else if (G.f & G_WEIGHTPAINT) {
xmax= GetButStringLength("Paint");
@@ -5064,13 +5186,19 @@ static void view3d_header_pulldowns(uiBlock *block, short *xcoord)
uiDefPulldownBut(block, view3d_sculptmenu, NULL, "Sculpt", xco, -2, xmax-3, 24, "");
xco+= xmax;
}
- else if (G.f & G_FACESELECT) {
+ else if (FACESEL_PAINT_TEST) {
if (ob && ob->type == OB_MESH) {
xmax= GetButStringLength("Face");
uiDefPulldownBut(block, view3d_faceselmenu, NULL, "Face", xco,-2, xmax-3, 24, "");
xco+= xmax;
}
- } else {
+ }
+ else if(G.f & G_PARTICLEEDIT) {
+ xmax= GetButStringLength("Particle");
+ uiDefPulldownBut(block, view3d_particlemenu, NULL, "Particle", xco,-2, xmax-3, 24, "");
+ xco+= xmax;
+ }
+ else {
if (ob && (ob->flag & OB_POSEMODE)) {
xmax= GetButStringLength("Pose");
uiDefPulldownBut(block, view3d_pose_armaturemenu, NULL, "Pose", xco,-2, xmax-3, 24, "");
@@ -5132,7 +5260,8 @@ void view3d_buttons(void)
else if (G.f & G_WEIGHTPAINT) G.vd->modeselect = V3D_WEIGHTPAINTMODE_SEL;
else if (G.f & G_VERTEXPAINT) G.vd->modeselect = V3D_VERTEXPAINTMODE_SEL;
else if (G.f & G_TEXTUREPAINT) G.vd->modeselect = V3D_TEXTUREPAINTMODE_SEL;
- else if(G.f & G_FACESELECT) G.vd->modeselect = V3D_FACESELECTMODE_SEL;
+ /*else if(G.f & G_FACESELECT) G.vd->modeselect = V3D_FACESELECTMODE_SEL;*/
+ else if(G.f & G_PARTICLEEDIT) G.vd->modeselect = V3D_PARTICLEEDITMODE_SEL;
G.vd->flag &= ~V3D_MODE;
@@ -5142,10 +5271,10 @@ void view3d_buttons(void)
if(G.f & G_VERTEXPAINT) G.vd->flag |= V3D_VERTEXPAINT;
if(G.f & G_WEIGHTPAINT) G.vd->flag |= V3D_WEIGHTPAINT;
if (G.f & G_TEXTUREPAINT) G.vd->flag |= V3D_TEXTUREPAINT;
- if(G.f & G_FACESELECT) G.vd->flag |= V3D_FACESELECT;
+ if(FACESEL_PAINT_TEST) G.vd->flag |= V3D_FACESELECT;
uiDefIconTextButS(block, MENU, B_MODESELECT, (G.vd->modeselect),view3d_modeselect_pup() ,
- xco,0,126,20, &(G.vd->modeselect), 0, 0, 0, 0, "Mode (Hotkeys: Tab, F, V, Ctrl Tab)");
+ xco,0,126,20, &(G.vd->modeselect), 0, 0, 0, 0, "Mode (Hotkeys: Tab, V, Ctrl Tab)");
xco+= 126+8;
@@ -5187,35 +5316,41 @@ void view3d_buttons(void)
uiBlockEndAlign(block);
}
} else {
- uiDefIconTextButS(block, ICONTEXTROW,B_AROUND, ICON_ROTATE, around_pup(), xco,0,XIC+10,YIC, &(G.vd->around), 0, 3.0, 0, 0, "Rotation/Scaling Pivot (Hotkeys: Comma, Shift Comma, Period) ");
-
- xco+= XIC+10;
-
- uiDefIconButBitS(block, TOG, V3D_ALIGN, B_AROUND, ICON_ALIGN,
- xco,0,XIC,YIC,
- &G.vd->flag, 0, 0, 0, 0, "Move object centers only");
- uiBlockEndAlign(block);
-
- xco+= XIC+8;
+ if (G.obedit==NULL && (G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT|G_SCULPTMODE))) {
+ uiDefIconButBitI(block, TOG, G_FACESELECT, B_REDR, ICON_FACESEL_HLT,xco,0,XIC,YIC, &G.f, 0, 0, 0, 0, "Painting Mask (FKey)");
+ xco+= XIC+10;
+ } else {
+ /* Manipulators arnt used in weight paint mode */
+ uiDefIconTextButS(block, ICONTEXTROW,B_AROUND, ICON_ROTATE, around_pup(), xco,0,XIC+10,YIC, &(G.vd->around), 0, 3.0, 0, 0, "Rotation/Scaling Pivot (Hotkeys: Comma, Shift Comma, Period, Ctrl Period, Alt Period)");
- /* Transform widget / manipulators */
- uiBlockBeginAlign(block);
- uiDefIconButBitS(block, TOG, V3D_USE_MANIPULATOR, B_REDR, ICON_MANIPUL,xco,0,XIC,YIC, &G.vd->twflag, 0, 0, 0, 0, "Use 3d transform manipulator (Ctrl Space)");
- xco+= XIC;
+ xco+= XIC+10;
+
+ uiDefIconButBitS(block, TOG, V3D_ALIGN, B_AROUND, ICON_ALIGN,
+ xco,0,XIC,YIC,
+ &G.vd->flag, 0, 0, 0, 0, "Move object centers only");
+ uiBlockEndAlign(block);
+
+ xco+= XIC+8;
- if(G.vd->twflag & V3D_USE_MANIPULATOR) {
- uiDefIconButBitS(block, TOG, V3D_MANIP_TRANSLATE, B_MAN_TRANS, ICON_MAN_TRANS, xco,0,XIC,YIC, &G.vd->twtype, 1.0, 0.0, 0, 0, "Translate manipulator mode (Ctrl Alt G)");
- xco+= XIC;
- uiDefIconButBitS(block, TOG, V3D_MANIP_ROTATE, B_MAN_ROT, ICON_MAN_ROT, xco,0,XIC,YIC, &G.vd->twtype, 1.0, 0.0, 0, 0, "Rotate manipulator mode (Ctrl Alt R)");
- xco+= XIC;
- uiDefIconButBitS(block, TOG, V3D_MANIP_SCALE, B_MAN_SCALE, ICON_MAN_SCALE, xco,0,XIC,YIC, &G.vd->twtype, 1.0, 0.0, 0, 0, "Scale manipulator mode (Ctrl Alt S)");
+ /* Transform widget / manipulators */
+ uiBlockBeginAlign(block);
+ uiDefIconButBitS(block, TOG, V3D_USE_MANIPULATOR, B_REDR, ICON_MANIPUL,xco,0,XIC,YIC, &G.vd->twflag, 0, 0, 0, 0, "Use 3d transform manipulator (Ctrl Space)");
xco+= XIC;
- }
- uiDefButS(block, MENU, B_NOP, "Orientation%t|Global%x0|Local%x1|Normal%x2|View%x3",xco,0,70,YIC, &G.vd->twmode, 0, 0, 0, 0, "Transform Orientation (Alt Space)");
- xco+= 70;
- uiBlockEndAlign(block);
- xco+= 8;
-
+
+ if(G.vd->twflag & V3D_USE_MANIPULATOR) {
+ uiDefIconButBitS(block, TOG, V3D_MANIP_TRANSLATE, B_MAN_TRANS, ICON_MAN_TRANS, xco,0,XIC,YIC, &G.vd->twtype, 1.0, 0.0, 0, 0, "Translate manipulator mode (Ctrl Alt G)");
+ xco+= XIC;
+ uiDefIconButBitS(block, TOG, V3D_MANIP_ROTATE, B_MAN_ROT, ICON_MAN_ROT, xco,0,XIC,YIC, &G.vd->twtype, 1.0, 0.0, 0, 0, "Rotate manipulator mode (Ctrl Alt R)");
+ xco+= XIC;
+ uiDefIconButBitS(block, TOG, V3D_MANIP_SCALE, B_MAN_SCALE, ICON_MAN_SCALE, xco,0,XIC,YIC, &G.vd->twtype, 1.0, 0.0, 0, 0, "Scale manipulator mode (Ctrl Alt S)");
+ xco+= XIC;
+ }
+ uiDefButS(block, MENU, B_NOP, "Orientation%t|Global%x0|Local%x1|Normal%x2|View%x3",xco,0,70,YIC, &G.vd->twmode, 0, 0, 0, 0, "Transform Orientation (Alt Space)");
+ xco+= 70;
+ uiBlockEndAlign(block);
+ xco+= 8;
+ }
+
/* LAYERS */
if(G.obedit==NULL && G.vd->localview==0) {
uiBlockBeginAlign(block);
@@ -5236,13 +5371,13 @@ void view3d_buttons(void)
xco+= (a-2)*(XIC/2)+3;
/* LOCK */
- uiDefIconButS(block, ICONTOG, B_SCENELOCK, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.vd->scenelock), 0, 0, 0, 0, "Locks layers and used Camera to Scene (Ctrl `)");
+ uiDefIconButS(block, ICONTOG, B_SCENELOCK, ICON_UNLOCKED, xco+=XIC,0,XIC,YIC, &(G.vd->scenelock), 0, 0, 0, 0, "Locks Active Camera and layers to Scene (Ctrl `)");
xco+= XIC+10;
}
/* proportional falloff */
- if(G.obedit && (G.obedit->type == OB_MESH || G.obedit->type == OB_CURVE || G.obedit->type == OB_SURF || G.obedit->type == OB_LATTICE)) {
+ if((G.obedit && (G.obedit->type == OB_MESH || G.obedit->type == OB_CURVE || G.obedit->type == OB_SURF || G.obedit->type == OB_LATTICE)) || G.f & G_PARTICLEEDIT) {
uiBlockBeginAlign(block);
uiDefIconTextButS(block, ICONTEXTROW,B_REDR, ICON_PROP_OFF, "Proportional %t|Off %x0|On %x1|Connected %x2", xco,0,XIC+10,YIC, &(G.scene->proportional), 0, 1.0, 0, 0, "Proportional Edit Falloff (Hotkeys: O, Alt O) ");
@@ -5259,18 +5394,15 @@ void view3d_buttons(void)
if(G.obedit && (G.obedit->type == OB_MESH)) { // Only Mesh for now
uiBlockBeginAlign(block);
- if (G.vd->flag2 & V3D_TRANSFORM_SNAP)
- {
- uiDefIconButBitS(block, TOG, V3D_TRANSFORM_SNAP, B_REDR, ICON_SNAP_GEO,xco,0,XIC,YIC, &G.vd->flag2, 0, 0, 0, 0, "Use Snap or Grid (Shift Tab)");
+ if (G.scene->snap_flag & SCE_SNAP) {
+ uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEO,xco,0,XIC,YIC, &G.scene->snap_flag, 0, 0, 0, 0, "Use Snap or Grid (Shift Tab)");
xco+= XIC;
- uiDefButS(block, MENU, B_NOP, "Mode%t|Closest%x0|Center%x1|Median%x2",xco,0,70,YIC, &G.vd->snap_target, 0, 0, 0, 0, "Snap Target Mode");
+ uiDefButS(block, MENU, B_NOP, "Mode%t|Closest%x0|Center%x1|Median%x2",xco,0,70,YIC, &G.scene->snap_target, 0, 0, 0, 0, "Snap Target Mode");
xco+= 70;
- }
- else
- {
- uiDefIconButBitS(block, TOG, V3D_TRANSFORM_SNAP, B_REDR, ICON_SNAP_GEAR,xco,0,XIC,YIC, &G.vd->flag2, 0, 0, 0, 0, "Use Snap or Grid (Shift Tab)");
+ } else {
+ uiDefIconButBitS(block, TOG, SCE_SNAP, B_REDR, ICON_SNAP_GEAR,xco,0,XIC,YIC, &G.scene->snap_flag, 0, 0, 0, 0, "Snap while Ctrl is held during transform (Shift Tab)");
xco+= XIC;
- }
+ }
uiBlockEndAlign(block);
xco+= 10;
@@ -5287,6 +5419,21 @@ void view3d_buttons(void)
xco+= XIC;
uiBlockEndAlign(block);
if(G.vd->drawtype > OB_WIRE) {
+ uiDefIconButBitS(block, TOG, V3D_ZBUF_SELECT, B_REDR, ICON_ORTHO, xco,0,XIC,YIC, &G.vd->flag, 1.0, 0.0, 0, 0, "Occlude background geometry");
+ xco+= XIC;
+ }
+ xco+= 20;
+ }
+ else if(G.f & G_PARTICLEEDIT) {
+ uiBlockBeginAlign(block);
+ uiDefIconButBitS(block, TOG, SCE_SELECT_PATH, B_SEL_PATH, ICON_EDGESEL, xco,0,XIC,YIC, &G.scene->selectmode, 1.0, 0.0, 0, 0, "Path edit mode (Ctrl Tab 1)");
+ xco+= XIC;
+ uiDefIconButBitS(block, TOG, SCE_SELECT_POINT, B_SEL_POINT, ICON_VERTEXSEL, xco,0,XIC,YIC, &G.scene->selectmode, 1.0, 0.0, 0, 0, "Point select mode (Ctrl Tab 2)");
+ xco+= XIC;
+ uiDefIconButBitS(block, TOG, SCE_SELECT_END, B_SEL_END, ICON_FACESEL, xco,0,XIC,YIC, &G.scene->selectmode, 1.0, 0.0, 0, 0, "Tip select mode (Ctrl Tab 3)");
+ xco+= XIC;
+ uiBlockEndAlign(block);
+ if(G.vd->drawtype > OB_WIRE) {
uiDefIconButBitS(block, TOG, V3D_ZBUF_SELECT, B_REDR, ICON_ORTHO, xco,0,XIC,YIC, &G.vd->flag, 1.0, 0.0, 0, 0, "Limit selection to visible (clipped with depth buffer)");
xco+= XIC;
}
diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c
index 7685ec99b2e..18bbba89ce8 100644
--- a/source/blender/src/headerbuttons.c
+++ b/source/blender/src/headerbuttons.c
@@ -255,7 +255,7 @@ int std_libbuttons(uiBlock *block, short xco, short yco,
if(browse) {
char *extrastr= NULL;
- if(ELEM3(id_code, ID_MA, ID_TE, ID_BR)) add_addbutton= 1;
+ if(ELEM4(id_code, ID_MA, ID_TE, ID_BR, ID_PA)) add_addbutton= 1;
lb= wich_libbase(G.main, id_code);
@@ -265,7 +265,7 @@ int std_libbuttons(uiBlock *block, short xco, short yco,
uiBlockSetCol(block, TH_BUT_SETTING2);
}
- if ELEM8( id_code, ID_SCE, ID_SCR, ID_MA, ID_TE, ID_WO, ID_IP, ID_AC, ID_BR) extrastr= "ADD NEW %x 32767";
+ if (ELEM8( id_code, ID_SCE, ID_SCR, ID_MA, ID_TE, ID_WO, ID_IP, ID_AC, ID_BR) || id_code == ID_PA) extrastr= "ADD NEW %x 32767";
else if (id_code==ID_TXT) extrastr= "OPEN NEW %x 32766 |ADD NEW %x 32767";
else if (id_code==ID_SO) extrastr= "OPEN NEW %x 32766";
@@ -457,11 +457,12 @@ static void show_splash(void)
char buffer[1024];
extern char * build_date;
extern char * build_time;
+ extern char * build_rev;
extern char * build_platform;
extern char * build_type;
string = &buffer[0];
- sprintf(string,"Built on %s %s Version %s %s", build_date, build_time, build_platform, build_type);
+ sprintf(string,"Built on %s %s, Rev-%s Version %s %s", build_date, build_time, build_rev, build_platform, build_type);
#endif
splash((void *)datatoc_splash_jpg, datatoc_splash_jpg_size, string);
@@ -587,7 +588,10 @@ void do_global_buttons(unsigned short event)
ScrArea *sa;
Brush *br;
int nr= 1;
+
+#ifdef INTERNATIONAL
char buf[FILE_MAX];
+#endif
ob= OBACT;
@@ -709,7 +713,12 @@ void do_global_buttons(unsigned short event)
else return;
if(*menunr== -2) {
- activate_databrowse((ID *)lockpoin, ID_MA, 0, B_MATBROWSE, menunr, do_global_buttons);
+ if(G.qual & LR_CTRLKEY) {
+ activate_databrowse_imasel((ID *)lockpoin, ID_MA, 0, B_MATBROWSE, menunr, do_global_buttons);
+ }
+ else {
+ activate_databrowse((ID *)lockpoin, ID_MA, 0, B_MATBROWSE, menunr, do_global_buttons);
+ }
return;
}
@@ -854,8 +863,12 @@ void do_global_buttons(unsigned short event)
if(mtex) id= (ID *)mtex->tex;
}
}
-
- activate_databrowse(id, ID_TE, 0, B_TEXBROWSE, &G.buts->texnr, do_global_buttons);
+ if(G.qual & LR_CTRLKEY) {
+ activate_databrowse_imasel(id, ID_TE, 0, B_TEXBROWSE, &G.buts->texnr, do_global_buttons);
+ }
+ else {
+ activate_databrowse(id, ID_TE, 0, B_TEXBROWSE, &G.buts->texnr, do_global_buttons);
+ }
return;
}
if(G.buts->texnr < 0) break;
@@ -949,13 +962,43 @@ void do_global_buttons(unsigned short event)
else {
/* Store current action */
- if (!idtest){
+ if (!idtest) {
+ /* 'Add New' option:
+ * - make a copy of an exisiting action
+ * - or make a new empty action if no existing action
+ */
if (act) {
idtest= (ID *)copy_action(act);
- } else {
+ }
+ else {
if (ID_OB==ob->type) {
+ /* for empties */
idtest=(ID *)add_empty_action("ObAction");
- } else {
+ }
+ else if (ELEM(ob->type, OB_MESH, OB_LATTICE) && ob_get_key(ob)) {
+ /* shapekey - like if B_IPO_ACTION_KEY is triggered */
+ bActionChannel *achan;
+ Key *key= ob_get_key(ob);
+
+ ob->ipoflag |= OB_ACTION_KEY;
+
+ act = add_empty_action("ShapeAction");
+ idtest=(ID *)act;
+
+ achan= verify_action_channel(act, "Shape");
+ achan->flag = (ACHAN_HILIGHTED|ACHAN_SELECTED|ACHAN_EXPANDED|ACHAN_SHOWIPO);
+
+ if(achan->ipo==NULL && key->ipo) {
+ achan->ipo= key->ipo;
+ key->ipo= NULL;
+
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWOOPS, 0);
+ }
+ }
+ else {
+ /* a plain action */
idtest=(ID *)add_empty_action("Action");
}
}
@@ -1032,6 +1075,8 @@ void do_global_buttons(unsigned short event)
else if(nr==ID_LA) idtest= (ID *)add_ipo("LaIpo", nr);
else if(nr==ID_CA) idtest= (ID *)add_ipo("CaIpo", nr);
else if(nr==ID_SO) idtest= (ID *)add_ipo("SndIpo", nr);
+ else if(nr==ID_FLUIDSIM) idtest= (ID *)add_ipo("FluidsimIpo", nr);
+ else if(nr==ID_PA) idtest= (ID *)add_ipo("PaIpo", nr);
else error("Warn bugtracker!");
}
idtest->us--;
@@ -1262,18 +1307,16 @@ void do_global_buttons(unsigned short event)
break;
case B_IMAGEDELETE:
-
- if(G.sima->image && BLI_streq(G.sima->image->id.name+2, "Render Result")==0) {
- /* Run on non render images, unlink normally */
- G.sima->image= NULL;
- image_changed(G.sima, 0);
- BIF_undo_push("Unlink Image");
- allqueue(REDRAWIMAGE, 0);
- } else {
+ if(G.sima->image && (G.sima->image->type == IMA_TYPE_R_RESULT || G.sima->image->type == IMA_TYPE_COMPOSITE)) {
/* Run if G.sima is render, remove the render and display the meshes image if it exists */
G.sima->image= NULL;
what_image(G.sima);
allqueue(REDRAWIMAGE, 0);
+ } else {
+ /* Run on non render images, unlink normally */
+ image_changed(G.sima, NULL);
+ BIF_undo_push("Unlink Image");
+ allqueue(REDRAWIMAGE, 0);
}
break;
diff --git a/source/blender/src/imagepaint.c b/source/blender/src/imagepaint.c
index 3809d731473..7b8efd0ed75 100644
--- a/source/blender/src/imagepaint.c
+++ b/source/blender/src/imagepaint.c
@@ -559,6 +559,9 @@ static int imapaint_paint_sub_stroke(ImagePaintState *s, BrushPainter *painter,
ImBuf *ibuf= BKE_image_get_ibuf(image, G.sima?&G.sima->iuser:NULL);
float pos[2];
+ if(!ibuf)
+ return 0;
+
pos[0] = uv[0]*ibuf->x;
pos[1] = uv[1]*ibuf->y;
diff --git a/source/blender/src/imasel.c b/source/blender/src/imasel.c
index 6c232ea6464..78fc3f1be2a 100644
--- a/source/blender/src/imasel.c
+++ b/source/blender/src/imasel.c
@@ -57,864 +57,29 @@
#include "BKE_global.h"
#include "BIF_imasel.h"
+#include "BIF_filelist.h"
#include "BIF_space.h"
#include "BIF_screen.h"
#include "blendef.h"
#include "mydevice.h"
-#ifndef WIN32
-#include <dirent.h>
-#endif
-
-#include <sys/stat.h>
-#include "datatoc.h"
-
-/* locals */
-void longtochar(char *des, unsigned int *src, int size);
-void chartolong(unsigned int *des, char *src, int size);
-int dir_compare(const void *a1, const void *a2);
-void issort( int te, ImaDir **firstentry);
-int ima_compare(const void *a1, const void *a2);
-void imsort(OneSelectableIma **firstentry);
-void append_pib(SpaceImaSel *simasel, OneSelectableIma *ima);
-void add_ima(int who, SpaceImaSel *simasel, ImaDir *direntry);
-
-/* implementation */
-int bitset(int l, int bit)
-{ return (( l & bit) == bit); }
-
-void longtochar(char *des, unsigned int *src, int size)
-{ int i;for (i = 0; i<size; i++){ des[i] = src[i] & 0xFF; }}
-
-void chartolong(unsigned int *des, char *src, int size)
-{ int i;for (i = 0; i<size; i++){ des[i] = src[i]; }}
-
-int dir_compare(const void *a1, const void *a2)
-{
- ImaDir **in1, **in2;
- ImaDir *use1, *use2;
-
- in1= (ImaDir **)a1;
- in2= (ImaDir **)a2;
-
- use1 = *in1;
- use2 = *in2;
-
- return BLI_strcasecmp(use1->name, use2->name);
-}
-
-void issort( int te, ImaDir **firstentry)
-{
- ImaDir **sort;
- ImaDir *use;
- int i = 0;
-
- sort = MEM_mallocN(te * sizeof(void *), "dir Sorteer temp");
- use = *firstentry;
-
- while (use){
- sort[i++] = use;
- use = use->next;
- }
-
- qsort (sort, te, sizeof(void *), dir_compare);
-
- *firstentry = sort[0];
- use = *firstentry;
-
-
- for (i=0; i<te; i++){
- if (i != 0) use->prev = sort[i-1]; else use->prev = 0;
- if (i != te-1) use->next = sort[i+1]; else use->next = 0;
-
- use = use->next;
- }
-
- MEM_freeN(sort);
-}
-
-
-int ima_compare(const void *a1, const void *a2)
-{
- OneSelectableIma **in1, **in2;
- OneSelectableIma *use1, *use2;
-
- in1= (OneSelectableIma **)a1;
- in2= (OneSelectableIma **)a2;
-
- use1 = *in1; use2 = *in2;
- return BLI_strcasecmp(use1->file_name, use2->file_name);
-}
-
-void imsort(OneSelectableIma **firstentry)
-{
- OneSelectableIma **sort;
- OneSelectableIma *use;
- int tot = 0, i = 0;
-
- use = *firstentry;
- while (use){
- tot++;
- use = use->next;
- }
-
- if (tot){
- sort = MEM_mallocN(tot * sizeof(void *), "Sorteer imsort temp");
- use = *firstentry;
- while (use){
- sort[i++] = use;
- use = use->next;
- }
-
- qsort (sort, tot, sizeof(void *), ima_compare);
-
- *firstentry = sort[0];
- use = *firstentry;
- for (i=0; i<tot; i++){
- if (i != 0) use->prev = sort[i-1]; else use->prev = 0;
- if (i != tot-1) use->next = sort[i+1]; else use->next = 0;
-
- use = use->next;
- }
- MEM_freeN(sort);
- }
-}
-
-static int write_msb_int(int fd, int i) {
- unsigned int ui= (unsigned int) i;
- unsigned char buf[4];
- buf[0]= (ui>>24)&0xFF;
- buf[1]= (ui>>16)&0xFF;
- buf[2]= (ui>>8)&0xFF;
- buf[3]= (ui>>0)&0xFF;
- return write(fd, buf, 4);
-}
-static int write_msb_short(int fd, short s) {
- unsigned short us= (unsigned short) s;
- unsigned char buf[2];
- buf[0]= (us>>8)&0xFF;
- buf[1]= (us>>0)&0xFF;
- return write(fd, buf, 2);
-}
-
-static int read_msb_int(int fd, int *i_r) {
- unsigned char buf[4];
- int rcount= read(fd, buf, 4);
-
- if (i_r)
- *i_r= (buf[0]<<24)|(buf[1]<<16)|(buf[2]<<8)|(buf[3]<<0);
-
- return rcount;
-}
-static int read_msb_short(int fd, short *s_r) {
- unsigned char buf[2];
- int rcount= read(fd, buf, 2);
-
- if (s_r)
- *s_r= (buf[0]<<8)|(buf[1]<<0);
-
- return rcount;
-}
-
-void append_pib(SpaceImaSel *simasel, OneSelectableIma *ima)
-{
- int file;
- char name[FILE_MAXDIR+FILE_MAXFILE];
-
- if ( bitset (simasel->fase, IMS_WRITE_NO_BIP)) return;
-
- strcpy(name, simasel->dir);
- strcat(name, ".Bpib");
-
- file = open(name, O_BINARY|O_APPEND | O_RDWR | O_CREAT, 0666);
- if (file == -1) {
- /* printf("Could not write .Bpib file in dir %s\n", simasel->dir); */
- simasel->fase |= IMS_WRITE_NO_BIP;
- return;
- }
-
- lseek(file, 0, SEEK_END);
-
- write(file, "BIP2", 4);
- write_msb_int(file, ima->ibuf_type);
- write_msb_int(file, 0);
- write_msb_int(file, 0);
- write_msb_int(file, 0);
- write_msb_short(file, ima->cmap);
- write_msb_short(file, ima->image);
- write_msb_short(file, ima->draw_me);
- write_msb_short(file, ima->rt);
- write_msb_short(file, ima->sx);
- write_msb_short(file, ima->sy);
- write_msb_short(file, ima->ex);
- write_msb_short(file, ima->ey);
- write_msb_short(file, ima->dw);
- write_msb_short(file, ima->dh);
- write_msb_short(file, ima->selectable);
- write_msb_short(file, ima->selected);
- write_msb_int(file, ima->mtime);
- write_msb_int(file, ima->disksize);
- write(file, ima->file_name, 64);
- write_msb_short(file, ima->orgx);
- write_msb_short(file, ima->orgy);
- write_msb_short(file, ima->orgd);
- write_msb_short(file, ima->anim);
- write_msb_int(file, 0); /* pad to 128 boundary */
- write(file, ima->pict_rect, 3968);
-
- close(file);
-}
-
-void write_new_pib(SpaceImaSel *simasel)
-{
- OneSelectableIma *ima;
- char name[FILE_MAXDIR+FILE_MAXFILE];
-
- strcpy(name, simasel->dir);
- strcat(name, ".Bpib");
- remove(name);
-
- ima = simasel->first_sel_ima;
- while (ima) {
- append_pib(simasel, ima);
- ima = ima->next;
- }
-}
-
-void free_ima_dir(ImaDir *firstdir)
-{
- ImaDir *n;
-
- while(firstdir){
- n = firstdir->next;
- MEM_freeN(firstdir);
- firstdir = n;
- }
-}
-void free_sel_ima(OneSelectableIma *firstima)
-{
- OneSelectableIma *n;
-
- while(firstima){
-
- if (firstima->pict) {
- IMB_freeImBuf(firstima->pict);
- }
- n = firstima->next;
- MEM_freeN(firstima);
- firstima = n;
- }
-}
-
-void check_for_pib(SpaceImaSel *simasel)
-{
- ImaDir *direntry;
-
- direntry = simasel->firstfile;
- while(direntry){
- if ((strlen(direntry->name) > 4) && (0==strcmp(direntry->name, ".Bpib")) ){
- simasel->fase |= IMS_FOUND_BIP;
- direntry = 0;
- }else{
- direntry = direntry->next;
- }
- }
-}
-
-void clear_ima_dir(SpaceImaSel *simasel)
-{
- if(simasel->first_sel_ima) free_sel_ima(simasel->first_sel_ima);
- if(simasel->firstdir) free_ima_dir(simasel->firstdir);
- if(simasel->firstfile) free_ima_dir(simasel->firstfile);
-
- simasel->first_sel_ima = 0;
- simasel->firstdir = 0;
- simasel->firstfile = 0;
-
- simasel->totaldirs = 0;
- simasel->totalfiles = 0;
- simasel->totalima = 0;
- simasel->topdir = -1;
- simasel->topfile = -1;
- simasel->topima = 0;
- simasel->image_slider = 0.0;
- simasel->slider_height = 0.0;
- simasel->slider_space = 0.0;
- simasel->hilite = -1;
- simasel->curimax = 0;
- simasel->curimay = 0;
-
- simasel->total_selected = 0;
- simasel->fase = 0;
- simasel->subfase = 0;
- simasel->imafase = 0;
- simasel->ima_redraw = 0;
-}
-
-int get_ima_dir(char *dirname, int dtype, int *td, ImaDir **first)
-{
- DIR *dirp;
- struct dirent *dep;
- struct ImaDir *temp;
- struct ImaDir *dnext = NULL, *fnext;
- struct stat status;
- char olddir[FILE_MAXDIR+FILE_MAXFILE];
- char getdirname[FILE_MAXDIR+FILE_MAXFILE];
- int /* i=0, */ tot=0;
- int isdir;
-
- if(!BLI_getwdN(olddir)) return -1;
-
- if (chdir(dirname) == -1) return(-1);
-
- strcpy(getdirname, ".");
-
- dirp = (DIR *) opendir(getdirname);
- if (dirp == NULL) return (-1);
-
- waitcursor(1);
-
- while((dep = (struct dirent*) readdir(dirp)) != NULL){
-
- strcpy(getdirname, dirname);
- strcat(getdirname,dep->d_name);
-
- stat(getdirname, &status);
- isdir = S_ISDIR(status.st_mode);
-
- if ( ((dtype == IMS_DIR) && isdir) || ((dtype == IMS_FILE) && !isdir)){
- /* yes, searching for this type */
- tot++;
- if (tot == 1){
- dnext = MEM_callocN(sizeof(struct ImaDir), "get first");
- *first = dnext;
-
- dnext->prev = 0;
- dnext->next = 0;
- }else{
- fnext = MEM_callocN(sizeof(struct ImaDir), "get nextdir");
- dnext->next = fnext;
-
- temp = dnext;
- dnext = fnext;
-
- dnext ->prev = temp;
- dnext ->next = 0;
- }
-
- dnext->type = dtype;
- dnext->selected = 0;
- dnext->hilite = 0;
-
- dnext->mtime = status.st_ctime;
- dnext->size = (int)status.st_size;
- strcpy(dnext->name, dep->d_name);
- }
- }
- closedir(dirp);
-
- if (tot) issort(tot, first);
-
- waitcursor(0);
-
- *td = tot;
-
- chdir (olddir);
-
- return (tot);
-}
-
-void imadir_parent(SpaceImaSel *simasel)
-{
-
-#ifdef WIN32
- if (strlen(simasel->dir) > 1){
- simasel->dir[strlen(simasel->dir)-1] = 0;
- while(simasel->dir[strlen(simasel->dir)-1] != '\\'){
- if(strlen(simasel->dir)==0) break;
- simasel->dir[strlen(simasel->dir)-1] = 0;
- }
- }
-#else
- if (strlen(simasel->dir) > 1){
- simasel->dir[strlen(simasel->dir)-1] = 0;
- while(simasel->dir[strlen(simasel->dir)-1] != '/') {
- if(strlen(simasel->dir)==0) break;
- simasel->dir[strlen(simasel->dir)-1] = 0;
- }
- }
-#endif
-}
-
-
-void get_next_image(SpaceImaSel *simasel)
-{
- OneSelectableIma * ima;
- ImBuf * ibuf;
- struct anim * anim;
- int i = 0, size;
- char name[FILE_MAXDIR+FILE_MAXFILE];
-
- ima = simasel->first_sel_ima;
- if (ima == 0){
- simasel->imafase = 0;
- simasel->fase |= IMS_KNOW_IMA;
- simasel->fase &= ~IMS_DOTHE_IMA;
- return;
- }
- if (simasel->imafase > simasel->totalima){
- simasel->imafase = 0;
- simasel->fase &= ~IMS_DOTHE_IMA;
- simasel->fase |= IMS_KNOW_IMA;
- }
-
- ima = simasel->first_sel_ima;
- i = 0;
- while(i < simasel->imafase){
- if ((ima) && (ima->next)) ima = ima->next;
- i++;
- }
-
- if (ima->image == 0) {
- if (ima->anim == 1) {
- /* open movie, get len, get middle picture */
-
- strcpy(name, simasel->dir);
- strcat(name, ima->file_name);
-
- anim = IMB_open_anim(name, IB_rect);
-
- if (anim == 0) {
- // ibuf= IMB_loadiffmem((int*)datatoc_cmovie_tga, IB_rect);
- ibuf= IMB_ibImageFromMemory((int *)datatoc_cmovie_tga, datatoc_cmovie_tga_size, IB_rect);
- }
- else{
- int animlen;
-
- ibuf = IMB_anim_nextpic(anim);
- IMB_freeImBuf(ibuf);
-
- animlen= IMB_anim_get_duration(anim);
- ibuf = IMB_anim_absolute(anim, animlen / 2);
-
- if(ibuf) {
- //get icon dimensions for movie
- ima->orgx = ibuf->x;
- ima->orgy = ibuf->y;
-// ima->orgd = ibuf->depth;
-
- if (ima->orgx > ima->orgy){
- ima->dw = 64;
- ima->dh = (short)(62 * ((float)ima->orgy / (float)ima->orgx));
- }else{
- ima->dw = (short)(64 * ((float)ima->orgx / (float)ima->orgy));
- ima->dh = 62;
- }
- }
-
- IMB_free_anim(anim);
- }
- }
- else {
-
- strcpy(name, simasel->dir);
- strcat(name, ima->file_name);
-
- ibuf = IMB_loadiffname(name, IB_rect);
- if(ibuf && ibuf->zbuf) IMB_freezbufImBuf(ibuf);
- }
-
- if (ibuf){
- if (ima->dw < 4) ima->dw = 4;
- if (ima->dh < 4) ima->dh = 4;
-
- IMB_scaleImBuf(ibuf, ima->dw, ima->dh);
- /* the whole cmap system is wacko */
-
- if (G.order==B_ENDIAN)
- IMB_convert_rgba_to_abgr(ibuf);
-
- ibuf->mincol = 0;
- ibuf->maxcol = 256;
- ibuf->cbits = 5;
- ibuf->depth = 8;
-
- IMB_freecmapImBuf(ibuf);
- ibuf->cmap = simasel->cmap->cmap;
-
- IMB_converttocmap(ibuf);
-
- /* copy ibuf->rect to ima->pict_rect */
- size = ima->dw * ima->dh; if (size > 3968) size = 3968;
- longtochar(ima->pict_rect, ibuf->rect, size);
-
- IMB_applycmap(ibuf);
- IMB_convert_rgba_to_abgr(ibuf);
-
- if (ima->pict) IMB_freeImBuf(ima->pict);
- ima->pict = ibuf;
- ibuf = 0;
- ima->cmap = 1;
- ima->image = 1;
-
- append_pib(simasel, ima);
- }
- }
- simasel->ima_redraw++;
- simasel->imafase ++;
- if (simasel->imafase == simasel->totalima){
- simasel->imafase = 0;
- simasel->fase &= ~IMS_DOTHE_IMA;
- simasel->fase |= IMS_KNOW_IMA;
- }
-}
-
-void add_ima(int who, SpaceImaSel *simasel, ImaDir *direntry)
-{
- OneSelectableIma *ima, *prev_ima;
- ImBuf *ibuf;
- char name[FILE_MAXDIR+FILE_MAXFILE];
-
- strcpy(name , simasel->dir);
- strcat(name , direntry->name);
-
- prev_ima = simasel->first_sel_ima;
- while((prev_ima)&&(prev_ima->next)){
- prev_ima = prev_ima->next;
- }
-
- ima = MEM_callocN(sizeof(OneSelectableIma), "OSIbip");
- if (direntry->type == IMS_IMA){
- /* Picture is an Image */
- ibuf = IMB_loadiffname(name, IB_test);
- if (ibuf){
- ima->anim = 0;
- ima->pict = ibuf;
- ima->ibuf_type= ibuf->ftype;
- ima->orgx = ibuf->x;
- ima->orgy = ibuf->y;
- ima->orgd = ibuf->depth;
-
- ima->dw = 64;
- ima->dh = 51;
- ima->cmap = 0;
- ima->image = 0;
- if (ima->orgx > ima->orgy){
- ima->dw = 64;
- ima->dh = (short)(62 * ((float)ima->orgy / (float)ima->orgx));
- }else{
- ima->dw = (short)(64 * ((float)ima->orgx / (float)ima->orgy));
- ima->dh = 62;
- }
- }else{
- printf("%s image with no imbuf ???\n", name);
- }
- ibuf = 0;
- }else{
- /* Picture is an Animation */
-
- ima->pict = 0;
- ima->anim = 1;
- ima->ibuf_type= 0;
- ima->orgx = 64;
- ima->orgy = 51;
- ima->orgd = 24;
-
- ima->dw = 64;
- ima->dh = 51;
- ima->cmap = 0;
- ima->image = 0;
- }
-
- strcpy(name, direntry->name); name[63] = 0;
- strcpy(ima->file_name, name);
- ima->disksize = (int)direntry->size;
- ima->mtime = (int)direntry->mtime;
-
- ima->next = 0;
- ima->prev = prev_ima;
-
- if (prev_ima) {
- prev_ima->next = ima;
- }else{
- simasel->first_sel_ima = ima;
- }
-
- simasel->ima_redraw++;
- simasel->totalima++;
-}
-
-
-void get_file_info(SpaceImaSel *simasel)
-{
- OneSelectableIma *prev_ima;
- ImaDir *direntry;
- char name[FILE_MAXDIR+FILE_MAXFILE];
- int i = 0;
-
- if (!simasel->firstfile){
- simasel->subfase = 0;
- simasel->fase |= IMS_KNOW_INF;
- simasel->fase &= ~IMS_DOTHE_INF;
- return;
- }
- if (simasel->subfase > simasel->totalfiles){
- simasel->subfase = 0;
- simasel->fase |= IMS_KNOW_INF;
- simasel->fase &= ~IMS_DOTHE_INF;
- }
-
- direntry = simasel->firstfile;
- while(i < simasel->subfase){
- direntry = direntry->next;
- i++;
- }
-
- prev_ima = simasel->first_sel_ima;
- while((prev_ima)&&(prev_ima->next)){
- prev_ima = prev_ima->next;
- }
-
- strcpy(name , simasel->dir);
- strcat(name , direntry->name);
-
- if(direntry->name[0] == '.') {
- direntry->type = IMS_NOIMA;
- } else {
- if (IMB_ispic(name)) {
- direntry->type = IMS_IMA;
- }else{
- if (IMB_isanim(name)) {
- direntry->type = IMS_ANIM;
- }else{
- direntry->type = IMS_NOIMA;
- }
- }
- }
-
- if (direntry->type != IMS_NOIMA){
- add_ima(1, simasel, direntry);
- }
-
- simasel->subfase++;
-
- if (simasel->subfase == simasel->totalfiles){
- simasel->subfase = 0;
- simasel->fase |= IMS_KNOW_INF;
- simasel->fase &= ~IMS_DOTHE_INF;
- }
-}
-
-/* Note: the thumbnails are saved in ABGR format in the .Bpib
-cache file */
-
-void get_pib_file(SpaceImaSel *simasel)
-{
- ImaDir *direntry, *prev_dir, *next_dir;
- OneSelectableIma *ima, *prev_ima;
- int flen;
- int dl, file, first, trd=0, rd, size, found, ima_added = 0;
- char name[FILE_MAXDIR+FILE_MAXFILE];
-
- if (bitset(simasel->fase , IMS_KNOW_BIP)) return;
-
- waitcursor(1);
-
- strcpy(name, simasel->dir);
- strcat(name, ".Bpib");
-
- file = open(name, O_BINARY|O_RDONLY);
-
- flen = BLI_filesize(file);
-
- simasel->totalima = 0;
- prev_ima = 0;
- first = 1;
- trd = 0;
-
- while(trd < flen){
- char header[5];
-
- ima = MEM_callocN(sizeof(OneSelectableIma), "Ima");
-
- rd= 0;
- rd+= read(file, header, 4);
- rd+= read_msb_int(file, &ima->ibuf_type);
- rd+= read_msb_int(file, NULL);
- rd+= read_msb_int(file, NULL);
- rd+= read_msb_int(file, NULL);
- rd+= read_msb_short(file, &ima->cmap);
- rd+= read_msb_short(file, &ima->image);
- rd+= read_msb_short(file, &ima->draw_me);
- rd+= read_msb_short(file, &ima->rt);
- rd+= read_msb_short(file, &ima->sx);
- rd+= read_msb_short(file, &ima->sy);
- rd+= read_msb_short(file, &ima->ex);
- rd+= read_msb_short(file, &ima->ey);
- rd+= read_msb_short(file, &ima->dw);
- rd+= read_msb_short(file, &ima->dh);
- rd+= read_msb_short(file, &ima->selectable);
- rd+= read_msb_short(file, &ima->selected);
- rd+= read_msb_int(file, &ima->mtime);
- rd+= read_msb_int(file, &ima->disksize);
- rd+= read(file, ima->file_name, 64);
- rd+= read_msb_short(file, &ima->orgx);
- rd+= read_msb_short(file, &ima->orgy);
- rd+= read_msb_short(file, &ima->orgd);
- rd+= read_msb_short(file, &ima->anim);
- rd+= read_msb_int(file, NULL);
- rd+= read(file, ima->pict_rect, 3968);
-
- found = 0;
-
- if (rd != sizeof(OneSelectableIma) || memcmp(header, "BIP2", 4)!=0) {
- printf("Error in Bpib file\n");
- strcpy(name, simasel->dir);
- strcat(name, ".Bpib");
- dl = remove(name);
- if (dl == 0) printf("corrupt Bpib file removed\n");
- trd = flen;
- } else {
- /* find matching direntry (if possible) */
- for (direntry= simasel->firstfile; direntry; direntry= direntry->next)
- if (BLI_streq(direntry->name, ima->file_name))
- break;
-
- if (direntry) {
- if (direntry->mtime == ima->mtime) {
- /* ima found and same, load pic */
- size = ima->dw * ima->dh;
- if (size > 3968) size = 3968;
- if (size) {
- ima->pict = IMB_allocImBuf(ima->dw, ima->dh, 24, IB_rect | IB_cmap, 0);
- chartolong(ima->pict->rect, ima->pict_rect, size);
- ima->pict->cmap = simasel->cmap->cmap;
- ima->pict->maxcol = 256;
- IMB_applycmap(ima->pict);
- IMB_convert_rgba_to_abgr(ima->pict);
- }
- ima->selected = 0;
- ima->selectable = 0;
-
- if(prev_ima) prev_ima->next = ima;
- ima->next = 0;
- ima->prev = prev_ima;
-
- prev_ima = ima;
-
- if (first){ first = 0;simasel->first_sel_ima = ima; }
- simasel->totalima++;
- found = 1;
- }
-
- /* remove direntry */
- prev_dir = direntry->prev;
- next_dir = direntry->next;
-
- if(prev_dir) prev_dir->next = next_dir;
- if(next_dir) next_dir->prev = prev_dir;
-
- MEM_freeN(direntry);
- }
- }
- if (!found) MEM_freeN(ima);
-
- trd+=rd;
- }
- close(file);
-
- direntry = simasel->firstfile;
-
- while(direntry){
-
- strcpy(name , simasel->dir);
- strcat(name , direntry->name);
-
- if (IMB_ispic(name)) {
- direntry->type = IMS_IMA;
- }else{
- if (IMB_isanim(name)) {
- direntry->type = IMS_ANIM;
- }else{
- direntry->type = IMS_NOIMA;
- }
- }
-
- if (direntry->type != IMS_NOIMA){
- prev_ima = simasel->first_sel_ima;
- while((prev_ima)&&(prev_ima->next)){
- prev_ima = prev_ima->next;
- }
- add_ima(2, simasel, direntry);
- ima_added = 1;
- }
- direntry = direntry->next;
- }
-
- imsort(&simasel->first_sel_ima);
-
- simasel->fase |= IMS_KNOW_BIP;
- simasel->fase |= IMS_KNOW_INF;
- simasel->fase |= IMS_KNOW_IMA;
-
- if (ima_added){
- simasel->fase |= IMS_DOTHE_IMA;
- simasel->fase &= ~IMS_KNOW_IMA;
- addafterqueue(curarea->win, AFTERIMASELGET, 1);
- }else{
- write_new_pib(simasel);
- }
-
- waitcursor(0);
-}
-
-void change_imadir(SpaceImaSel *simasel)
+void free_imasel(SpaceImaSel *simasel)
{
- ImaDir *direntry;
- int i;
-
- direntry = simasel->firstdir;
- for (i=0; i<simasel->hilite; i++){
- direntry = direntry->next;
+ /* do not free imasel itself */
+ if(simasel->files) {
+ BIF_filelist_freelib(simasel->files);
+ BIF_filelist_free(simasel->files);
+ MEM_freeN(simasel->files);
+ simasel->files = NULL;
}
-
- if(direntry==NULL);
- else if (direntry->name[0] != '.'){
- strcat(simasel->dir, direntry->name);
- strcat(simasel->dir, "/");
+ if (simasel->img) {
+ IMB_freeImBuf(simasel->img);
}
- else {
- if (direntry->name[1] == '.'){
- imadir_parent(simasel);
- }
+ if(simasel->pupmenu) {
+ MEM_freeN(simasel->pupmenu);
+ simasel->pupmenu = NULL;
}
-
- clear_ima_dir(simasel);
-}
-
-void check_imasel_copy(SpaceImaSel *simasel)
-{
-
- /* WATCH IT: also used when reading blender file */
- /* initialize stuff, malloc, etc */
- simasel->first_sel_ima = 0;
- simasel->hilite_ima = 0;
- simasel->firstdir = 0;
- simasel->firstfile = 0;
- simasel->cmap = 0;
- clear_ima_dir(simasel);
-
- // simasel->cmap= IMB_loadiffmem((int*)datatoc_cmap_tga, IB_rect|IB_cmap);
- simasel->cmap= IMB_ibImageFromMemory((int *)datatoc_cmap_tga, datatoc_cmap_tga_size, IB_rect|IB_cmap);
-}
-
-void free_imasel(SpaceImaSel *simasel)
-{
- /* do not free imasel itself */
-
- clear_ima_dir(simasel);
- IMB_freeImBuf(simasel->cmap);
}
diff --git a/source/blender/src/interface.c b/source/blender/src/interface.c
index 56e2c6326b7..07debe8f864 100644
--- a/source/blender/src/interface.c
+++ b/source/blender/src/interface.c
@@ -482,6 +482,7 @@ static int ui_but_copy_paste(uiBut *but, char mode)
}
else {
ui_set_but_val(but, but_copypaste_val);
+ uibut_do_func(but);
ui_check_but(but);
return 1;
}
@@ -4725,7 +4726,7 @@ static int ui_do_block(uiBlock *block, uiEvent *uevent)
/* add undo pushes if... */
if( !(block->flag & UI_BLOCK_LOOP)) {
if(!G.obedit) {
- if ELEM4(but->type, BLOCK, BUT, LABEL, PULLDOWN);
+ if ELEM5(but->type, BLOCK, BUT, LABEL, PULLDOWN, ROUNDBOX);
else {
/* define which string to use for undo */
if ELEM(but->type, LINK, INLINK) screen_delayed_undo_push("Add button link");
@@ -4805,30 +4806,15 @@ static uiOverDraw *ui_draw_but_tip(uiBut *but)
{
uiOverDraw *od;
float x1, x2, y1, y2;
+ rctf tip_bbox;
-#ifdef INTERNATIONAL
- if(G.ui_international == TRUE) {
- float llx,lly,llz,urx,ury,urz; //for FTF_GetBoundingBox()
+ BIF_GetBoundingBox(but->font, but->tip, (U.transopts & USER_TR_TOOLTIPS), &tip_bbox);
+
+ x1= (but->x1+but->x2)/2;
+ x2= x1+but->aspect*((tip_bbox.xmax-tip_bbox.xmin) + 8);
+ y2= but->y1-10;
+ y1= y2-but->aspect*((tip_bbox.ymax+(tip_bbox.ymax-tip_bbox.ymin)));
- if(U.transopts & USER_TR_TOOLTIPS) {
- FTF_GetBoundingBox(but->tip, &llx,&lly,&llz,&urx,&ury,&urz, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
-
- x1= (but->x1+but->x2)/2; x2= 10+x1+ but->aspect*FTF_GetStringWidth(but->tip, FTF_USE_GETTEXT | FTF_INPUT_UTF8); //BMF_GetStringWidth(but->font, but->tip);
- y1= but->y1-(ury+FTF_GetSize())-12; y2= but->y1-12;
- } else {
- FTF_GetBoundingBox(but->tip, &llx,&lly,&llz,&urx,&ury,&urz, FTF_NO_TRANSCONV | FTF_INPUT_UTF8);
-
- x1= (but->x1+but->x2)/2; x2= 10+x1+ but->aspect*FTF_GetStringWidth(but->tip, FTF_NO_TRANSCONV | FTF_INPUT_UTF8); //BMF_GetStringWidth(but->font, but->tip);
- y1= but->y1-(ury+FTF_GetSize())-12; y2= but->y1-12;
- }
- } else {
- x1= (but->x1+but->x2)/2; x2= 10+x1+ but->aspect*BMF_GetStringWidth(but->font, but->tip);
- y1= but->y1-30; y2= but->y1-12;
- }
-#else
- x1= (but->x1+but->x2)/2; x2= 10+x1+ but->aspect*BMF_GetStringWidth(but->font, but->tip);
- y1= but->y1-30; y2= but->y1-12;
-#endif
/* for pulldown menus it doesnt work */
if(mywinget()==G.curscreen->mainwin);
@@ -4846,13 +4832,6 @@ static uiOverDraw *ui_draw_but_tip(uiBut *but)
y2 += 36;
}
- // adjust tooltip heights
- if(mywinget()==G.curscreen->mainwin)
- y2 -= G.ui_international ? 4:1; //tip is from pulldownmenu
- else if(curarea->win != mywinget())
- y2 -= G.ui_international ? 5:1; //tip is from a windowheader
-// else y2 += 1; //tip is from button area
-
od= ui_begin_overdraw((int)(x1-1), (int)(y1-2), (int)(x2+4), (int)(y2+4));
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -4874,7 +4853,10 @@ static uiOverDraw *ui_draw_but_tip(uiBut *but)
glRectf(x1, y1, x2, y2);
glColor3ub(0,0,0);
- ui_rasterpos_safe( x1+3, y1+5.0/but->aspect, but->aspect);
+ /* set the position for drawing text +4 in from the left edge, and leaving an equal gap between the top of the background box
+ * and the top of the string's tip_bbox, and the bottom of the background box, and the bottom of the string's tip_bbox
+ */
+ ui_rasterpos_safe(x1+4, ((y2-tip_bbox.ymax)+(y1+tip_bbox.ymin))/2 - tip_bbox.ymin, but->aspect);
BIF_SetScale(1.0);
BIF_DrawString(but->font, but->tip, (U.transopts & USER_TR_TOOLTIPS));
diff --git a/source/blender/src/interface_draw.c b/source/blender/src/interface_draw.c
index 4c6734a7be4..4f1d5056111 100644
--- a/source/blender/src/interface_draw.c
+++ b/source/blender/src/interface_draw.c
@@ -1604,7 +1604,15 @@ static void ui_draw_text_icon(uiBut *but)
ui_rasterpos_safe(x, (but->y1+but->y2- 9.0)/2.0, but->aspect);
if(but->type==IDPOIN) transopts= 0; // no translation, of course!
else transopts= (U.transopts & USER_TR_BUTTONS);
+
+ #ifdef INTERNATIONAL
+ if (but->type == FTPREVIEW)
+ FTF_DrawNewFontString (but->drawstr+but->ofs, FTF_INPUT_UTF8);
+ else
+ BIF_DrawString(but->font, but->drawstr+but->ofs, transopts);
+ #else
BIF_DrawString(but->font, but->drawstr+but->ofs, transopts);
+ #endif
/* part text right aligned */
if(cpoin) {
@@ -2232,7 +2240,9 @@ static void ui_draw_but_CURVE(uiBut *but)
}
/* the curve */
- BIF_ThemeColor(TH_TEXT);
+ BIF_ThemeColorBlend(TH_TEXT, TH_BUT_NEUTRAL, 0.35);
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
glBegin(GL_LINE_STRIP);
if(cuma->table==NULL)
@@ -2261,6 +2271,8 @@ static void ui_draw_but_CURVE(uiBut *but)
glVertex2f(fx, fy);
}
glEnd();
+ glDisable(GL_LINE_SMOOTH);
+ glDisable(GL_BLEND);
/* the points, use aspect to make them visible on edges */
cmp= cuma->curve;
@@ -2423,3 +2435,33 @@ void ui_draw_but(uiBut *but)
}
}
+void ui_dropshadow(rctf *rct, float radius, float aspect, int select)
+{
+ float rad;
+ float a;
+ char alpha= 2;
+
+ glEnable(GL_BLEND);
+
+ if(radius > (rct->ymax-rct->ymin-10.0f)/2.0f)
+ rad= (rct->ymax-rct->ymin-10.0f)/2.0f;
+ else
+ rad= radius;
+
+ if(select) a= 12.0f*aspect; else a= 12.0f*aspect;
+ for(; a>0.0f; a-=aspect) {
+ /* alpha ranges from 2 to 20 or so */
+ glColor4ub(0, 0, 0, alpha);
+ alpha+= 2;
+
+ gl_round_box(GL_POLYGON, rct->xmin - a, rct->ymin - a, rct->xmax + a, rct->ymax-10.0f + a, rad+a);
+ }
+
+ /* outline emphasis */
+ glEnable( GL_LINE_SMOOTH );
+ glColor4ub(0, 0, 0, 100);
+ gl_round_box(GL_LINE_LOOP, rct->xmin-0.5f, rct->ymin-0.5f, rct->xmax+0.5f, rct->ymax+0.5f, radius);
+ glDisable( GL_LINE_SMOOTH );
+
+ glDisable(GL_BLEND);
+}
diff --git a/source/blender/src/interface_icons.c b/source/blender/src/interface_icons.c
index d257f2f37f8..d93834d8d8a 100644
--- a/source/blender/src/interface_icons.c
+++ b/source/blender/src/interface_icons.c
@@ -90,11 +90,6 @@
#include "datatoc.h"
#include "mydevice.h"
-/* OpenGL textures have to be size 2n+2 x 2m+2 for some n,m */
-/* choose ICON_RENDERSIZE accordingly */
-#define ICON_RENDERSIZE 32
-#define ICON_MIPMAPS 8
-
#define ICON_IMAGE_W 512
#define ICON_IMAGE_H 256
@@ -105,52 +100,60 @@
#define ICON_GRID_W 15
#define ICON_GRID_H 16
+typedef struct IconImage {
+ int w;
+ int h;
+ unsigned int *rect;
+} IconImage;
+
typedef struct DrawInfo {
int w;
int h;
- int rw;
- int rh;
- VectorDrawFunc drawFunc; /* If drawFunc is defined then it is a vector icon, otherwise use rect */
float aspect;
- unsigned int *rect;
+ VectorDrawFunc drawFunc; /* If drawFunc is defined then it is a vector icon, otherwise use rect */
+ IconImage* icon;
} DrawInfo;
-
/* ******************* 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 int preview_render_size(int miplevel);
+
/* **************************************************** */
static void def_internal_icon(ImBuf *bbuf, int icon_id, int xofs, int yofs)
{
Icon *new_icon = NULL;
+ IconImage *iimg = NULL;
DrawInfo *di;
int y = 0;
new_icon = MEM_callocN(sizeof(Icon), "texicon");
new_icon->obj = 0; /* icon is not for library object */
- new_icon->type = 0;
- new_icon->changed = 0;
-
+ new_icon->type = 0;
di = MEM_callocN(sizeof(DrawInfo), "drawinfo");
di->drawFunc = 0;
di->w = ICON_DEFAULT_HEIGHT;
di->h = ICON_DEFAULT_HEIGHT;
- di->rw = ICON_DEFAULT_HEIGHT;
- di->rh = ICON_DEFAULT_HEIGHT;
di->aspect = 1.0f;
- di->rect = MEM_mallocN(ICON_DEFAULT_HEIGHT*ICON_DEFAULT_HEIGHT*sizeof(unsigned int), "icon_rect");
+ iimg = MEM_mallocN(sizeof(IconImage), "icon_img");
+ iimg->rect = MEM_mallocN(ICON_DEFAULT_HEIGHT*ICON_DEFAULT_HEIGHT*sizeof(unsigned int), "icon_rect");
+ iimg->w = ICON_DEFAULT_HEIGHT;
+ iimg->h = ICON_DEFAULT_HEIGHT;
+
/* Here we store the rect in the icon - same as before */
for (y=0; y<ICON_DEFAULT_HEIGHT; y++) {
- memcpy(&di->rect[y*ICON_DEFAULT_HEIGHT], &bbuf->rect[(y+yofs)*512+xofs], ICON_DEFAULT_HEIGHT*sizeof(int));
+ memcpy(&iimg->rect[y*ICON_DEFAULT_HEIGHT], &bbuf->rect[(y+yofs)*512+xofs], ICON_DEFAULT_HEIGHT*sizeof(int));
}
+ di->icon = iimg;
+
new_icon->drawinfo_free = BIF_icons_free_drawinfo;
new_icon->drawinfo = di;
@@ -166,17 +169,14 @@ static void def_internal_vicon( int icon_id, VectorDrawFunc drawFunc)
new_icon->obj = 0; /* icon is not for library object */
new_icon->type = 0;
- new_icon->changed = 0;
-
+
di = MEM_callocN(sizeof(DrawInfo), "drawinfo");
di->drawFunc =drawFunc;
di->w = ICON_DEFAULT_HEIGHT;
di->h = ICON_DEFAULT_HEIGHT;
- di->rw = ICON_DEFAULT_HEIGHT;
- di->rh = ICON_DEFAULT_HEIGHT;
di->aspect = 1.0f;
- di->rect = NULL;
-
+ di->icon = NULL;
+
new_icon->drawinfo_free = 0;
new_icon->drawinfo = di;
@@ -693,7 +693,10 @@ void BIF_icons_free_drawinfo(void *drawinfo)
if (di)
{
- MEM_freeN(di->rect);
+ if (di->icon) {
+ MEM_freeN(di->icon->rect);
+ MEM_freeN(di->icon);
+ }
MEM_freeN(di);
}
}
@@ -705,11 +708,9 @@ static DrawInfo *icon_create_drawinfo()
di = MEM_callocN(sizeof(DrawInfo), "di_icon");
di->drawFunc = 0;
- di->w = 16;
- di->h = 16;
- di->rw = ICON_RENDERSIZE;
- di->rh = ICON_RENDERSIZE;
- di->rect = 0;
+ di->w = ICON_DEFAULT_HEIGHT;
+ di->h = ICON_DEFAULT_HEIGHT;
+ di->icon = NULL;
di->aspect = 1.0f;
return di;
@@ -771,7 +772,7 @@ void BIF_icons_init(int first_dyn_id)
init_internal_icons();
}
-static void icon_copy_rect(ImBuf *ibuf, RenderInfo *ri)
+static void icon_copy_rect(ImBuf *ibuf, unsigned int w, unsigned int h, unsigned int *rect)
{
struct ImBuf *ima;
unsigned int *drect, *srect;
@@ -789,19 +790,19 @@ static void icon_copy_rect(ImBuf *ibuf, RenderInfo *ri)
return;
if (ima->x > ima->y) {
- scaledx = (float)ri->pr_rectx;
- scaledy = ( (float)ima->y/(float)ima->x )*(float)ri->pr_rectx;
+ scaledx = (float)w;
+ scaledy = ( (float)ima->y/(float)ima->x )*(float)w;
}
else {
- scaledx = ( (float)ima->x/(float)ima->y )*(float)ri->pr_recty;
- scaledy = (float)ri->pr_recty;
+ scaledx = ( (float)ima->x/(float)ima->y )*(float)h;
+ scaledy = (float)h;
}
ex = (short)scaledx;
ey = (short)scaledy;
- dx = (ri->pr_rectx - ex) / 2;
- dy = (ri->pr_recty - ey) / 2;
+ dx = (w - ex) / 2;
+ dy = (h - ey) / 2;
IMB_scalefastImBuf(ima, ex, ey);
@@ -810,61 +811,66 @@ static void icon_copy_rect(ImBuf *ibuf, RenderInfo *ri)
IMB_rect_from_float(ima);
srect = ima->rect;
- drect = ri->rect;
+ drect = rect;
- drect+= dy*ri->pr_rectx+dx;
+ drect+= dy*w+dx;
for (;ey > 0; ey--){
memcpy(drect,srect, ex * sizeof(int));
- drect += ri->pr_rectx;
+ drect += w;
srect += ima->x;
}
IMB_freeImBuf(ima);
}
+static void icon_create_mipmap(struct PreviewImage* prv_img, int miplevel)
+{
+ unsigned int size = preview_render_size(miplevel);
+
+ if (!prv_img) {
+ printf("Error: requested preview image does not exist");
+ }
+ if (!prv_img->rect[miplevel]) {
+ prv_img->w[miplevel] = size;
+ prv_img->h[miplevel] = size;
+ prv_img->changed[miplevel] = 1;
+ prv_img->rect[miplevel] = MEM_callocN(size*size*sizeof(unsigned int), "prv_rect");
+ }
+}
+
/* create single icon from jpg, png etc. */
-static void icon_from_image(Image *img, RenderInfo *ri)
+static void icon_from_image(Image *img, int miplevel)
{
- unsigned int pr_size = ri->pr_rectx*ri->pr_recty*sizeof(unsigned int);
+ unsigned int pr_size;
+ short image_loaded = 0;
+ struct ImBuf* ibuf=NULL;
+ PreviewImage* pi;
/* img->ok is zero when Image cannot load */
if (img==NULL || img->ok==0)
return;
-
- if (!ri->rect) {
- ri->rect= MEM_callocN(pr_size, "butsrect");
- memset(ri->rect, 0x00, pr_size);
+
+ /* elubie: this needs to be changed: here image is always loaded if not
+ already there. Very expensive for large images. Need to find a way to
+ only get existing ibuf */
+ ibuf = BKE_image_get_ibuf(img, NULL);
+ if(ibuf==NULL || ibuf->rect==NULL) {
+ return;
}
- /* we only load image if there's no preview saved already ...
- always loading and reducing images is too expensive */
- /* new rule: never read images, so icons get created while user works,
- not always on first use of a menu */
- if(!img->preview) {
- ImBuf *ibuf;
- if(img->ok!=IMA_OK_LOADED) {
- return;
- }
- ibuf= BKE_image_get_ibuf(img, NULL);
- icon_copy_rect(ibuf, ri);
-
- /* now copy the created preview to the DNA struct to be saved in file */
- img->preview = MEM_callocN(sizeof(PreviewImage), "img_prv");
- if (img->preview) {
- printf("created image prv\n");
- img->preview->w = ri->pr_rectx;
- img->preview->h = ri->pr_recty;
- img->preview->rect = MEM_callocN(pr_size, "prv_rect");
- memcpy(img->preview->rect, ri->rect, pr_size);
- }
- }
- else {
- unsigned int img_prv_size = img->preview->w*img->preview->h*sizeof(unsigned int);
- if (!img->preview->rect || img_prv_size != pr_size) {
- printf("Missing preview or wrong preview size!\n");
- return;
- }
- memcpy(ri->rect, img->preview->rect, pr_size);
+ pi = BKE_previewimg_get((ID*)img);
+
+ if(!pi) {
+ printf("preview image could'nt be allocated");
+ return;
}
+ /* we can only create the preview rect here, since loading possibly deallocated
+ old preview */
+ icon_create_mipmap(pi, miplevel);
+
+ pr_size = img->preview->w[miplevel]*img->preview->h[miplevel]*sizeof(unsigned int);
+
+ image_loaded = 1;
+ icon_copy_rect(ibuf, img->preview->w[miplevel], img->preview->h[miplevel], img->preview->rect[miplevel]);
}
static void set_alpha(char* cp, int sizex, int sizey, char alpha)
@@ -879,27 +885,36 @@ static void set_alpha(char* cp, int sizex, int sizey, char alpha)
/* only called when icon has changed */
/* only call with valid pointer from BIF_icon_draw */
-static void icon_set_image(ID *id, DrawInfo *di)
+static void icon_set_image(ID *id, DrawInfo *di, PreviewImage* prv_img, int miplevel)
{
RenderInfo ri;
-
- if (!di) return;
-
- if (!di->rect)
- di->rect = MEM_callocN(di->rw*di->rh*sizeof(unsigned int), "laprevrect");
+ unsigned int pr_size = 0;
+
+ if (!di) return;
- ri.curtile= 0;
- ri.tottile= 0;
- ri.rect = NULL;
- ri.pr_rectx = di->rw;
- ri.pr_recty = di->rh;
+ if (!prv_img) {
+ printf("No preview image for this ID: %s\n", id->name);
+ return;
+ }
/* no drawing (see last parameter doDraw, just calculate preview image
- hopefully small enough to be fast */
if (GS(id->name) == ID_IM)
- icon_from_image((struct Image*)id, &ri);
- else {
+ icon_from_image((struct Image*)id, miplevel);
+ else {
+ /* create the preview rect */
+ icon_create_mipmap(prv_img, miplevel);
+
+ ri.curtile= 0;
+ ri.tottile= 0;
+ ri.rect = NULL;
+ ri.pr_rectx = prv_img->w[miplevel];
+ ri.pr_recty = prv_img->h[miplevel];
+
+ pr_size = ri.pr_rectx*ri.pr_recty*sizeof(unsigned int);
+
BIF_previewrender(id, &ri, NULL, PR_ICON_RENDER);
+
/* world is rendered with alpha=0, so it wasn't displayed
this could be render option for sky to, for later */
if (GS(id->name) == ID_WO) {
@@ -909,25 +924,74 @@ static void icon_set_image(ID *id, DrawInfo *di)
Material* mat = (Material*)id;
if (mat->mode & MA_HALO) {
set_alpha( (char*) ri.rect, ri.pr_rectx, ri.pr_recty, 255);
- }
+ }
+ }
+
+ if (ri.rect) {
+ memcpy(prv_img->rect[miplevel], ri.rect, pr_size);
+
+ /* and clean up */
+ MEM_freeN(ri.rect);
+ ri.rect = 0;
}
}
+}
- /* and copy the image into the icon */
- if (ri.rect) {
- memcpy(di->rect, ri.rect,di->rw*di->rh*sizeof(unsigned int));
+static void icon_draw_rect(float x, float y, int w, int h, float aspect, int rw, int rh, unsigned int *rect)
+{
+ ui_rasterpos_safe(x, y, aspect);
+
+ if(w<1 || h<1) {
+ printf("what the heck!\n");
+ }
+ /* rect contains image in 'rendersize', we only scale if needed */
+ else if(rw!=w && rh!=h) {
+ ImBuf *ima;
+ if(w>2000 || h>2000) { /* something has gone wrong! */
+ printf("insane icon size w=%d h=%d\n",w,h);
+ return;
+ }
+ /* first allocate imbuf for scaling and copy preview into it */
+ ima = IMB_allocImBuf(rw, rh, 32, IB_rect, 0);
+ memcpy(ima->rect, rect, rw*rh*sizeof(unsigned int));
+
+ /* scale it */
+ IMB_scaleImBuf(ima, w, h);
+ glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, ima->rect);
+
+ IMB_freeImBuf(ima);
+ }
+ else
+ glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, rect);
+}
- /* and clean up */
- MEM_freeN(ri.rect);
- ri.rect = 0;
+/* Render size for preview images at level miplevel */
+static int preview_render_size(int miplevel)
+{
+ switch (miplevel) {
+ case 0: return 32;
+ case 1: return PREVIEW_DEFAULT_HEIGHT;
}
+ return 0;
}
-void BIF_icon_draw_aspect(float x, float y, int icon_id, float aspect)
+/* Drawing size for preview images at level miplevel */
+static int preview_size(int miplevel)
+{
+ switch (miplevel) {
+ case 0: return ICON_DEFAULT_HEIGHT;
+ case 1: return PREVIEW_DEFAULT_HEIGHT;
+ }
+ return 0;
+}
+
+
+static void icon_draw_mipmap(float x, float y, int icon_id, float aspect, int miplevel, int nocreate)
{
Icon *icon = NULL;
DrawInfo *di = NULL;
-
+ int draw_size = preview_size(miplevel);
+
icon = BKE_icon_get(icon_id);
if (!icon) {
@@ -939,65 +1003,61 @@ void BIF_icon_draw_aspect(float x, float y, int icon_id, float aspect)
if (!di) {
di = icon_create_drawinfo();
-
- icon->changed = 1;
+
icon->drawinfo = di;
icon->drawinfo_free = BIF_icons_free_drawinfo;
}
di->aspect = aspect;
/* scale width and height according to aspect */
- di->w = (int)(ICON_DEFAULT_HEIGHT/di->aspect + 0.5f);
- di->h = (int)(ICON_DEFAULT_HEIGHT/di->aspect + 0.5f);
+ di->w = (int)(draw_size/di->aspect + 0.5f);
+ di->h = (int)(draw_size/di->aspect + 0.5f);
if (di->drawFunc) {
/* vector icons use the uiBlock transformation, they are not drawn
with untransformed coordinates like the other icons */
di->drawFunc(x, y, ICON_DEFAULT_HEIGHT, ICON_DEFAULT_HEIGHT, 1.0f);
+ }
+ else if (di->icon) {
+ /* it is a builtin icon */
+ if (!di->icon->rect) return; /* something has gone wrong! */
+
+ icon_draw_rect(x,y,di->w, di->h, di->aspect, di->icon->w, di->icon->h, di->icon->rect);
}
else {
- if (icon->changed) /* changed only ever set by dynamic icons */
- {
- waitcursor(1);
- icon_set_image((ID*)icon->obj, icon->drawinfo);
- icon->changed = 0;
- waitcursor(0);
- }
-
- if (!di->rect) return; /* something has gone wrong! */
-
- ui_rasterpos_safe(x, y, di->aspect);
-
- if(di->w<1 || di->h<1) {
- printf("what the heck!\n");
- }
- /* di->rect contains image in 'rendersize', we only scale if needed */
- else if(di->rw!=di->w && di->rh!=di->h) {
- ImBuf *ima;
- if(di->w>2000 || di->h>2000) { /* something has gone wrong! */
- printf("insane icon size di->w %d di->h %d\n",di->w,di->h);
- return;
+ PreviewImage* pi = BKE_previewimg_get((ID*)icon->obj);
+
+ if (pi) {
+ if (!nocreate && (pi->changed[miplevel] ||!pi->rect[miplevel])) /* changed only ever set by dynamic icons */
+ {
+ waitcursor(1);
+ /* create the preview rect if necessary */
+ icon_set_image((ID*)icon->obj, icon->drawinfo, pi, miplevel);
+ pi->changed[miplevel] = 0;
+ waitcursor(0);
}
- /* first allocate imbuf for scaling and copy preview into it */
- ima = IMB_allocImBuf(di->rw, di->rh, 32, IB_rect, 0);
- memcpy(ima->rect, di->rect, di->rw*di->rh*sizeof(unsigned int));
- /* scale it */
- IMB_scaleImBuf(ima, di->w, di->h);
- glDrawPixels(di->w, di->h, GL_RGBA, GL_UNSIGNED_BYTE, ima->rect);
+ if (!pi->rect[miplevel]) return; /* something has gone wrong! */
- IMB_freeImBuf(ima);
+ icon_draw_rect(x,y,di->w, di->h, di->aspect, pi->w[miplevel], pi->h[miplevel], pi->rect[miplevel]);
}
- else
- glDrawPixels(di->w, di->h, GL_RGBA, GL_UNSIGNED_BYTE, di->rect);
}
}
+void BIF_icon_draw_aspect(float x, float y, int icon_id, float aspect)
+{
+ icon_draw_mipmap(x,y,icon_id, aspect, PREVIEW_MIPMAP_ZERO, 0);
+}
+
void BIF_icon_draw(float x, float y, int icon_id)
{
BIF_icon_draw_aspect(x, y, icon_id, 1.0f);
}
+void BIF_icon_draw_preview(float x, float y, int icon_id, int nocreate)
+{
+ icon_draw_mipmap(x,y,icon_id, 1.0f, PREVIEW_MIPMAP_LARGE, nocreate);
+}
void BIF_icon_draw_aspect_blended(float x, float y, int icon_id, float aspect, int shade)
{
diff --git a/source/blender/src/interface_panel.c b/source/blender/src/interface_panel.c
index bafc544daa7..de7f53c2af7 100644
--- a/source/blender/src/interface_panel.c
+++ b/source/blender/src/interface_panel.c
@@ -1805,6 +1805,13 @@ static void panel_clicked_tabs(uiBlock *block, int mousex)
}
addqueue(curarea->win, REDRAW, 1);
+
+ /* panels now differ size.. */
+ if(curarea->spacetype==SPACE_BUTS) {
+ SpaceButs *sbuts= curarea->spacedata.first;
+ if(sbuts->align)
+ uiAlignPanelStep(curarea, 1.0);
+ }
}
}
diff --git a/source/blender/src/language.c b/source/blender/src/language.c
index 4c485bad8d3..c289d75f88b 100644
--- a/source/blender/src/language.c
+++ b/source/blender/src/language.c
@@ -33,6 +33,7 @@
#include "DNA_listBase.h"
#include "DNA_userdef_types.h"
+#include "DNA_vec_types.h"
#include "BKE_global.h" /* G */
#include "BKE_utildefines.h"
@@ -52,6 +53,33 @@
#include "BMF_Api.h"
+#ifdef WITH_ICONV
+#include "iconv.h"
+
+void string_to_utf8(char *original, char *utf_8, char *code)
+{
+ size_t inbytesleft=strlen(original);
+ size_t outbytesleft=512;
+ size_t rv=0;
+ iconv_t cd;
+
+ cd=iconv_open("UTF-8", code);
+
+ if (cd == (iconv_t)(-1)) {
+ printf("iconv_open Error");
+ *utf_8='\0';
+ return ;
+ }
+ rv=iconv(cd, &original, &inbytesleft, &utf_8, &outbytesleft);
+ if (rv == (size_t) -1) {
+ printf("iconv Error\n");
+ return ;
+ }
+ *utf_8 = '\0';
+ iconv_close(cd);
+}
+#endif // WITH_ICONV
+
#ifdef INTERNATIONAL
#include "FTF_Api.h"
@@ -92,23 +120,33 @@ int BIF_DrawString(BMF_Font* font, char *str, int translate)
#ifdef INTERNATIONAL
if(G.ui_international == TRUE) {
if(translate)
- return FTF_DrawString(str, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
+ {
+#ifdef WITH_ICONV
+ if(translate & CONVERT_TO_UTF8) {
+ char utf_8[512];
+
+ struct LANGMenuEntry *lme;
+ lme = find_language(U.language);
+
+ if (lme !=NULL) {
+ if (!strcmp(lme->code, "ja_JP"))
+ string_to_utf8(str, utf_8, "Shift_JIS"); /* Japanese */
+ else if (!strcmp(lme->code, "zh_CN"))
+ string_to_utf8(str, utf_8, "GB2312"); /* Chinese */
+ }
+
+ return FTF_DrawString(utf_8, FTF_INPUT_UTF8);
+ }
+ else
+#endif // WITH_ICONV
+ return FTF_DrawString(str, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
+ }
else
return FTF_DrawString(str, FTF_NO_TRANSCONV | FTF_INPUT_UTF8);
} else {
return BMF_DrawString(font, str);
-/*
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- BMF_GetFontTexture(font);??
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- BMF_DrawStringTexture(font, str, pen_x, pen_y, 0.0);
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
- return 0;
-*/
}
-#else
+#else // INTERNATIONAL
return BMF_DrawString(font, str);
#endif
@@ -134,6 +172,21 @@ float BIF_GetStringWidth(BMF_Font* font, char *str, int translate)
return rt;
}
+void BIF_GetBoundingBox(struct BMF_Font* font, char* str, int translate, rctf *bbox){
+ float dummy;
+#ifdef INTERNATIONAL
+ if(G.ui_international == TRUE)
+ if(translate && (U.transopts & USER_TR_BUTTONS))
+ FTF_GetBoundingBox(str, &bbox->xmin, &bbox->ymin, &dummy, &bbox->xmax, &bbox->ymax, &dummy, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
+ else
+ FTF_GetBoundingBox(str, &bbox->xmin, &bbox->ymin, &dummy, &bbox->xmax, &bbox->ymax, &dummy, FTF_NO_TRANSCONV | FTF_INPUT_UTF8);
+ else
+ BMF_GetStringBoundingBox(font, str, &bbox->xmin, &bbox->ymin, &bbox->xmax, &bbox->ymax);
+#else
+ BMF_GetStringBoundingBox(font, str, &bbox->xmin, &bbox->ymin, &bbox->xmax, &bbox->ymax);
+#endif
+}
+
#ifdef INTERNATIONAL
diff --git a/source/blender/src/meshlaplacian.c b/source/blender/src/meshlaplacian.c
new file mode 100644
index 00000000000..5d15dbf47b0
--- /dev/null
+++ b/source/blender/src/meshlaplacian.c
@@ -0,0 +1,1838 @@
+/**
+ * $Id$
+ *
+ * ***** BEGIN GPL/BL DUAL 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. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ * meshlaplacian.c: Algorithms using the mesh laplacian.
+ */
+
+#include <math.h>
+#include <string.h>
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_listBase.h"
+#include "DNA_object_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
+
+#include "BLI_arithb.h"
+#include "BLI_edgehash.h"
+#include "BLI_memarena.h"
+
+#include "BKE_DerivedMesh.h"
+#include "BKE_utildefines.h"
+
+#include "BIF_editdeform.h"
+#include "BIF_meshlaplacian.h"
+#include "BIF_meshtools.h"
+#include "BIF_screen.h"
+#include "BIF_toolbox.h"
+
+#include "BSE_headerbuttons.h"
+
+#ifdef RIGID_DEFORM
+#include "BLI_editVert.h"
+#include "BLI_polardecomp.h"
+#endif
+
+#include "RE_raytrace.h"
+
+#include "ONL_opennl.h"
+
+/************************** Laplacian System *****************************/
+
+struct LaplacianSystem {
+ NLContext context; /* opennl context */
+
+ int totvert, totface;
+
+ float **verts; /* vertex coordinates */
+ float *varea; /* vertex weights for laplacian computation */
+ char *vpinned; /* vertex pinning */
+ int (*faces)[3]; /* face vertex indices */
+ float (*fweights)[3]; /* cotangent weights per face */
+
+ int areaweights; /* use area in cotangent weights? */
+ int storeweights; /* store cotangent weights in fweights */
+ int nlbegun; /* nlBegin(NL_SYSTEM/NL_MATRIX) done */
+
+ EdgeHash *edgehash; /* edge hash for construction */
+
+ struct HeatWeighting {
+ Mesh *mesh;
+ float (*verts)[3]; /* vertex coordinates */
+ float (*vnors)[3]; /* vertex normals */
+
+ float (*root)[3]; /* bone root */
+ float (*tip)[3]; /* bone tip */
+ int numbones;
+
+ float *H; /* diagonal H matrix */
+ float *p; /* values from all p vectors */
+ float *mindist; /* minimum distance to a bone for all vertices */
+
+ RayTree *raytree; /* ray tracing acceleration structure */
+ MFace **vface; /* a face that the vertex belongs to */
+ } heat;
+
+#ifdef RIGID_DEFORM
+ struct RigidDeformation {
+ EditMesh *mesh;
+
+ float (*R)[3][3];
+ float (*rhs)[3];
+ float (*origco)[3];
+ int thrownerror;
+ } rigid;
+#endif
+};
+
+/* Laplacian matrix construction */
+
+/* Computation of these weights for the laplacian is based on:
+ "Discrete Differential-Geometry Operators for Triangulated 2-Manifolds",
+ Meyer et al, 2002. Section 3.5, formula (8).
+
+ We do it a bit different by going over faces instead of going over each
+ vertex and adjacent faces, since we don't store this adjacency. Also, the
+ formulas are tweaked a bit to work for non-manifold meshes. */
+
+static void laplacian_increase_edge_count(EdgeHash *edgehash, int v1, int v2)
+{
+ void **p = BLI_edgehash_lookup_p(edgehash, v1, v2);
+
+ if(p)
+ *p = (void*)((long)*p + (long)1);
+ else
+ BLI_edgehash_insert(edgehash, v1, v2, (void*)(long)1);
+}
+
+static int laplacian_edge_count(EdgeHash *edgehash, int v1, int v2)
+{
+ return (int)(long)BLI_edgehash_lookup(edgehash, v1, v2);
+}
+
+static float cotan_weight(float *v1, float *v2, float *v3)
+{
+ float a[3], b[3], c[3], clen;
+
+ VecSubf(a, v2, v1);
+ VecSubf(b, v3, v1);
+ Crossf(c, a, b);
+
+ clen = VecLength(c);
+
+ if (clen == 0.0f)
+ return 0.0f;
+
+ return Inpf(a, b)/clen;
+}
+
+static void laplacian_triangle_area(LaplacianSystem *sys, int i1, int i2, int i3)
+{
+ float t1, t2, t3, len1, len2, len3, area;
+ float *varea= sys->varea, *v1, *v2, *v3;
+ int obtuse = 0;
+
+ v1= sys->verts[i1];
+ v2= sys->verts[i2];
+ v3= sys->verts[i3];
+
+ t1= cotan_weight(v1, v2, v3);
+ t2= cotan_weight(v2, v3, v1);
+ t3= cotan_weight(v3, v1, v2);
+
+ if(VecAngle3(v2, v1, v3) > 90) obtuse= 1;
+ else if(VecAngle3(v1, v2, v3) > 90) obtuse= 2;
+ else if(VecAngle3(v1, v3, v2) > 90) obtuse= 3;
+
+ if (obtuse > 0) {
+ area= AreaT3Dfl(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;
+ }
+ else {
+ len1= VecLenf(v2, v3);
+ len2= VecLenf(v1, v3);
+ len3= VecLenf(v1, v2);
+
+ t1 *= len1*len1;
+ t2 *= len2*len2;
+ t3 *= len3*len3;
+
+ varea[i1] += (t2 + t3)*0.25f;
+ varea[i2] += (t1 + t3)*0.25f;
+ varea[i3] += (t1 + t2)*0.25f;
+ }
+}
+
+static void laplacian_triangle_weights(LaplacianSystem *sys, int f, int i1, int i2, int i3)
+{
+ float t1, t2, t3;
+ float *varea= sys->varea, *v1, *v2, *v3;
+
+ v1= sys->verts[i1];
+ v2= sys->verts[i2];
+ v3= sys->verts[i3];
+
+ /* instead of *0.5 we divided by the number of faces of the edge, it still
+ needs to be varified that this is indeed the correct thing to do! */
+ t1= cotan_weight(v1, v2, v3)/laplacian_edge_count(sys->edgehash, i2, i3);
+ t2= cotan_weight(v2, v3, v1)/laplacian_edge_count(sys->edgehash, i3, i1);
+ t3= cotan_weight(v3, v1, v2)/laplacian_edge_count(sys->edgehash, i1, i2);
+
+ nlMatrixAdd(i1, i1, (t2+t3)*varea[i1]);
+ nlMatrixAdd(i2, i2, (t1+t3)*varea[i2]);
+ nlMatrixAdd(i3, i3, (t1+t2)*varea[i3]);
+
+ nlMatrixAdd(i1, i2, -t3*varea[i1]);
+ nlMatrixAdd(i2, i1, -t3*varea[i2]);
+
+ nlMatrixAdd(i2, i3, -t1*varea[i2]);
+ nlMatrixAdd(i3, i2, -t1*varea[i3]);
+
+ nlMatrixAdd(i3, i1, -t2*varea[i3]);
+ nlMatrixAdd(i1, i3, -t2*varea[i1]);
+
+ if(sys->storeweights) {
+ sys->fweights[f][0]= t1*varea[i1];
+ sys->fweights[f][1]= t2*varea[i2];
+ sys->fweights[f][2]= t3*varea[i3];
+ }
+}
+
+LaplacianSystem *laplacian_system_construct_begin(int totvert, int totface)
+{
+ LaplacianSystem *sys;
+
+ sys= MEM_callocN(sizeof(LaplacianSystem), "LaplacianSystem");
+
+ sys->verts= MEM_callocN(sizeof(float*)*totvert, "LaplacianSystemVerts");
+ sys->vpinned= MEM_callocN(sizeof(char)*totvert, "LaplacianSystemVpinned");
+ sys->faces= MEM_callocN(sizeof(int)*3*totface, "LaplacianSystemFaces");
+
+ sys->totvert= 0;
+ sys->totface= 0;
+
+ sys->areaweights= 1;
+ sys->storeweights= 0;
+
+ /* create opennl context */
+ nlNewContext();
+ nlSolverParameteri(NL_NB_VARIABLES, totvert);
+
+ sys->context= nlGetCurrent();
+
+ return sys;
+}
+
+void laplacian_add_vertex(LaplacianSystem *sys, float *co, int pinned)
+{
+ sys->verts[sys->totvert]= co;
+ sys->vpinned[sys->totvert]= pinned;
+ sys->totvert++;
+}
+
+void laplacian_add_triangle(LaplacianSystem *sys, int v1, int v2, int v3)
+{
+ sys->faces[sys->totface][0]= v1;
+ sys->faces[sys->totface][1]= v2;
+ sys->faces[sys->totface][2]= v3;
+ sys->totface++;
+}
+
+void laplacian_system_construct_end(LaplacianSystem *sys)
+{
+ int (*face)[3];
+ int a, totvert=sys->totvert, totface=sys->totface;
+
+ laplacian_begin_solve(sys, 0);
+
+ sys->varea= MEM_callocN(sizeof(float)*totvert, "LaplacianSystemVarea");
+
+ sys->edgehash= BLI_edgehash_new();
+ for(a=0, face=sys->faces; a<sys->totface; a++, face++) {
+ laplacian_increase_edge_count(sys->edgehash, (*face)[0], (*face)[1]);
+ laplacian_increase_edge_count(sys->edgehash, (*face)[1], (*face)[2]);
+ laplacian_increase_edge_count(sys->edgehash, (*face)[2], (*face)[0]);
+ }
+
+ if(sys->areaweights)
+ for(a=0, face=sys->faces; a<sys->totface; a++, face++)
+ laplacian_triangle_area(sys, (*face)[0], (*face)[1], (*face)[2]);
+
+ for(a=0; a<totvert; a++) {
+ if(sys->areaweights) {
+ if(sys->varea[a] != 0.0f)
+ sys->varea[a]= 0.5f/sys->varea[a];
+ }
+ else
+ sys->varea[a]= 1.0f;
+
+ /* for heat weighting */
+ if(sys->heat.H)
+ nlMatrixAdd(a, a, sys->heat.H[a]);
+ }
+
+ if(sys->storeweights)
+ sys->fweights= MEM_callocN(sizeof(float)*3*totface, "LaplacianFWeight");
+
+ for(a=0, face=sys->faces; a<totface; a++, face++)
+ laplacian_triangle_weights(sys, a, (*face)[0], (*face)[1], (*face)[2]);
+
+ MEM_freeN(sys->faces);
+ sys->faces= NULL;
+
+ if(sys->varea) {
+ MEM_freeN(sys->varea);
+ sys->varea= NULL;
+ }
+
+ BLI_edgehash_free(sys->edgehash, NULL);
+ sys->edgehash= NULL;
+}
+
+void laplacian_system_delete(LaplacianSystem *sys)
+{
+ if(sys->verts) MEM_freeN(sys->verts);
+ if(sys->varea) MEM_freeN(sys->varea);
+ if(sys->vpinned) MEM_freeN(sys->vpinned);
+ if(sys->faces) MEM_freeN(sys->faces);
+ if(sys->fweights) MEM_freeN(sys->fweights);
+
+ nlDeleteContext(sys->context);
+ MEM_freeN(sys);
+}
+
+void laplacian_begin_solve(LaplacianSystem *sys, int index)
+{
+ int a;
+
+ if (!sys->nlbegun) {
+ nlBegin(NL_SYSTEM);
+
+ if(index >= 0) {
+ for(a=0; a<sys->totvert; a++) {
+ if(sys->vpinned[a]) {
+ nlSetVariable(0, a, sys->verts[a][index]);
+ nlLockVariable(a);
+ }
+ }
+ }
+
+ nlBegin(NL_MATRIX);
+ sys->nlbegun = 1;
+ }
+}
+
+void laplacian_add_right_hand_side(LaplacianSystem *sys, int v, float value)
+{
+ nlRightHandSideAdd(0, v, value);
+}
+
+int laplacian_system_solve(LaplacianSystem *sys)
+{
+ nlEnd(NL_MATRIX);
+ nlEnd(NL_SYSTEM);
+ sys->nlbegun = 0;
+
+ //nlPrintMatrix();
+
+ return nlSolveAdvanced(NULL, NL_TRUE);
+}
+
+float laplacian_system_get_solution(int v)
+{
+ return nlGetVariable(0, v);
+}
+
+/************************* Heat Bone Weighting ******************************/
+/* From "Automatic Rigging and Animation of 3D Characters"
+ Ilya Baran and Jovan Popovic, SIGGRAPH 2007 */
+
+#define C_WEIGHT 1.0f
+#define WEIGHT_LIMIT 0.05f
+#define DISTANCE_EPSILON 1e-4f
+
+/* Raytracing for vertex to bone visibility */
+
+static LaplacianSystem *HeatSys = NULL;
+
+static void heat_ray_coords_func(RayFace *face, float **v1, float **v2, float **v3, float **v4)
+{
+ MFace *mface= (MFace*)face;
+ float (*verts)[3]= HeatSys->heat.verts;
+
+ *v1= verts[mface->v1];
+ *v2= verts[mface->v2];
+ *v3= verts[mface->v3];
+ *v4= (mface->v4)? verts[mface->v4]: NULL;
+}
+
+static int heat_ray_check_func(Isect *is, RayFace *face)
+{
+ float *v1, *v2, *v3, *v4, nor[3];
+
+ /* don't intersect if the ray faces along the face normal */
+ heat_ray_coords_func(face, &v1, &v2, &v3, &v4);
+
+ if(v4) CalcNormFloat4(v1, v2, v3, v4, nor);
+ else CalcNormFloat(v1, v2, v3, nor);
+
+ return (INPR(nor, is->vec) < 0);
+}
+
+static void heat_ray_tree_create(LaplacianSystem *sys)
+{
+ Mesh *me = sys->heat.mesh;
+ RayTree *tree;
+ MFace *mface;
+ float min[3], max[3];
+ int a;
+
+ /* create a raytrace tree from the mesh */
+ INIT_MINMAX(min, max);
+
+ for(a=0; a<me->totvert; a++)
+ DO_MINMAX(sys->heat.verts[a], min, max);
+
+ tree= RE_ray_tree_create(64, me->totface, min, max,
+ heat_ray_coords_func, heat_ray_check_func);
+
+ sys->heat.vface= MEM_callocN(sizeof(MFace*)*me->totvert, "HeatVFaces");
+
+ HeatSys= sys;
+
+ for(a=0, mface=me->mface; a<me->totface; a++, mface++) {
+ RE_ray_tree_add_face(tree, mface);
+
+ sys->heat.vface[mface->v1]= mface;
+ sys->heat.vface[mface->v2]= mface;
+ sys->heat.vface[mface->v3]= mface;
+ if(mface->v4) sys->heat.vface[mface->v4]= mface;
+ }
+
+ HeatSys= NULL;
+
+ RE_ray_tree_done(tree);
+
+ sys->heat.raytree= tree;
+}
+
+static int heat_ray_bone_visible(LaplacianSystem *sys, int vertex, int bone)
+{
+ Isect isec;
+ MFace *mface;
+ float dir[3];
+ int visible;
+
+ mface= sys->heat.vface[vertex];
+ if(!mface)
+ return 1;
+
+ /* setup isec */
+ memset(&isec, 0, sizeof(isec));
+ isec.mode= RE_RAY_SHADOW;
+ isec.lay= -1;
+ isec.face_last= NULL;
+ isec.faceorig= mface;
+
+ VECCOPY(isec.start, sys->heat.verts[vertex]);
+ PclosestVL3Dfl(isec.end, isec.start,
+ sys->heat.root[bone], sys->heat.tip[bone]);
+
+ /* add an extra offset to the start position to avoid self intersection */
+ VECSUB(dir, isec.end, isec.start);
+ Normalize(dir);
+ VecMulf(dir, 1e-5);
+ VecAddf(isec.start, isec.start, dir);
+
+ HeatSys= sys;
+ visible= !RE_ray_tree_intersect(sys->heat.raytree, &isec);
+ HeatSys= NULL;
+
+ return visible;
+}
+
+static float heat_bone_distance(LaplacianSystem *sys, int vertex, int bone)
+{
+ float closest[3], d[3], dist, cosine;
+
+ /* compute euclidian distance */
+ PclosestVL3Dfl(closest, sys->heat.verts[vertex],
+ sys->heat.root[bone], sys->heat.tip[bone]);
+
+ VecSubf(d, sys->heat.verts[vertex], closest);
+ dist= Normalize(d);
+
+ /* if the vertex normal does not point along the bone, increase distance */
+ cosine= INPR(d, sys->heat.vnors[vertex]);
+
+ return dist/(0.5f*(cosine + 1.001f));
+}
+
+static int heat_bone_closest(LaplacianSystem *sys, int vertex, int bone)
+{
+ float dist;
+
+ dist= heat_bone_distance(sys, vertex, bone);
+
+ if(dist <= sys->heat.mindist[vertex]*(1.0f + DISTANCE_EPSILON))
+ if(heat_ray_bone_visible(sys, vertex, bone))
+ return 1;
+
+ return 0;
+}
+
+static void heat_set_H(LaplacianSystem *sys, int vertex)
+{
+ float dist, mindist, h;
+ int j, numclosest = 0;
+
+ mindist= 1e10;
+
+ /* compute minimum distance */
+ for(j=0; j<sys->heat.numbones; j++) {
+ dist= heat_bone_distance(sys, vertex, j);
+
+ if(dist < mindist)
+ mindist= dist;
+ }
+
+ sys->heat.mindist[vertex]= mindist;
+
+ /* count number of bones with approximately this minimum distance */
+ for(j=0; j<sys->heat.numbones; j++)
+ if(heat_bone_closest(sys, vertex, j))
+ numclosest++;
+
+ sys->heat.p[vertex]= (numclosest > 0)? 1.0f/numclosest: 0.0f;
+
+ /* compute H entry */
+ if(numclosest > 0) {
+ if(mindist > 1e-5)
+ h= numclosest*C_WEIGHT/(mindist*mindist);
+ else
+ h= 1e10f;
+ }
+ else
+ h= 0.0f;
+
+ sys->heat.H[vertex]= h;
+}
+
+void heat_calc_vnormals(LaplacianSystem *sys)
+{
+ float fnor[3];
+ int a, v1, v2, v3, (*face)[3];
+
+ sys->heat.vnors= MEM_callocN(sizeof(float)*3*sys->totvert, "HeatVNors");
+
+ for(a=0, face=sys->faces; a<sys->totface; a++, face++) {
+ v1= (*face)[0];
+ v2= (*face)[1];
+ v3= (*face)[2];
+
+ CalcNormFloat(sys->verts[v1], sys->verts[v2], sys->verts[v3], fnor);
+
+ VecAddf(sys->heat.vnors[v1], sys->heat.vnors[v1], fnor);
+ VecAddf(sys->heat.vnors[v2], sys->heat.vnors[v2], fnor);
+ VecAddf(sys->heat.vnors[v3], sys->heat.vnors[v3], fnor);
+ }
+
+ for(a=0; a<sys->totvert; a++)
+ Normalize(sys->heat.vnors[a]);
+}
+
+static void heat_laplacian_create(LaplacianSystem *sys)
+{
+ Mesh *me = sys->heat.mesh;
+ MFace *mface;
+ int a;
+
+ /* heat specific definitions */
+ sys->heat.mindist= MEM_callocN(sizeof(float)*me->totvert, "HeatMinDist");
+ sys->heat.H= MEM_callocN(sizeof(float)*me->totvert, "HeatH");
+ sys->heat.p= MEM_callocN(sizeof(float)*me->totvert, "HeatP");
+
+ /* add verts and faces to laplacian */
+ for(a=0; a<me->totvert; a++)
+ laplacian_add_vertex(sys, sys->heat.verts[a], 0);
+
+ for(a=0, mface=me->mface; a<me->totface; a++, mface++) {
+ laplacian_add_triangle(sys, mface->v1, mface->v2, mface->v3);
+ if(mface->v4)
+ laplacian_add_triangle(sys, mface->v1, mface->v3, mface->v4);
+ }
+
+ /* for distance computation in set_H */
+ heat_calc_vnormals(sys);
+
+ for(a=0; a<me->totvert; a++)
+ heat_set_H(sys, a);
+}
+
+void heat_bone_weighting(Object *ob, Mesh *me, float (*verts)[3], int numbones, bDeformGroup **dgrouplist, bDeformGroup **dgroupflip, float (*root)[3], float (*tip)[3], int *selected)
+{
+ LaplacianSystem *sys;
+ MFace *mface;
+ float solution;
+ int a, aflip, totface, j, thrownerror = 0;
+
+ /* count triangles */
+ for(totface=0, a=0, mface=me->mface; a<me->totface; a++, mface++) {
+ totface++;
+ if(mface->v4) totface++;
+ }
+
+ /* create laplacian */
+ sys = laplacian_system_construct_begin(me->totvert, totface);
+
+ sys->heat.mesh= me;
+ sys->heat.verts= verts;
+ sys->heat.root= root;
+ sys->heat.tip= tip;
+ sys->heat.numbones= numbones;
+
+ heat_ray_tree_create(sys);
+ heat_laplacian_create(sys);
+
+ laplacian_system_construct_end(sys);
+
+ /* compute weights per bone */
+ for(j=0; j<numbones; j++) {
+ if(!selected[j])
+ continue;
+
+ laplacian_begin_solve(sys, -1);
+
+ for(a=0; a<me->totvert; a++)
+ if(heat_bone_closest(sys, a, j))
+ laplacian_add_right_hand_side(sys, a,
+ sys->heat.H[a]*sys->heat.p[a]);
+
+ if(laplacian_system_solve(sys)) {
+ for(a=0; a<me->totvert; a++) {
+ solution= laplacian_system_get_solution(a);
+
+ if(solution > WEIGHT_LIMIT)
+ add_vert_to_defgroup(ob, dgrouplist[j], a, solution,
+ WEIGHT_REPLACE);
+ else
+ remove_vert_defgroup(ob, dgrouplist[j], a);
+
+ /* do same for mirror */
+ aflip = (dgroupflip)? mesh_get_x_mirror_vert(ob, a): 0;
+ if (dgroupflip && dgroupflip[j] && aflip >= 0) {
+ if(solution > WEIGHT_LIMIT)
+ add_vert_to_defgroup(ob, dgroupflip[j], aflip,
+ solution, WEIGHT_REPLACE);
+ else
+ remove_vert_defgroup(ob, dgroupflip[j], aflip);
+ }
+ }
+ }
+ else if(!thrownerror) {
+ error("Bone Heat Weighting:"
+ " failed to find solution for one or more bones");
+ thrownerror= 1;
+ break;
+ }
+ }
+
+ /* free */
+ RE_ray_tree_free(sys->heat.raytree);
+ MEM_freeN(sys->heat.vface);
+
+ MEM_freeN(sys->heat.mindist);
+ MEM_freeN(sys->heat.H);
+ MEM_freeN(sys->heat.p);
+ MEM_freeN(sys->heat.vnors);
+
+ laplacian_system_delete(sys);
+}
+
+#ifdef RIGID_DEFORM
+/********************** As-Rigid-As-Possible Deformation ******************/
+/* From "As-Rigid-As-Possible Surface Modeling",
+ Olga Sorkine and Marc Alexa, ESGP 2007. */
+
+/* investigate:
+ - transpose R in orthogonal
+ - flipped normals and per face adding
+ - move cancelling to transform, make origco pointer
+*/
+
+static LaplacianSystem *RigidDeformSystem = NULL;
+
+static void rigid_add_half_edge_to_R(LaplacianSystem *sys, EditVert *v1, EditVert *v2, float w)
+{
+ float e[3], e_[3];
+ int i;
+
+ VecSubf(e, sys->rigid.origco[v1->tmp.l], sys->rigid.origco[v2->tmp.l]);
+ VecSubf(e_, v1->co, v2->co);
+
+ /* formula (5) */
+ for (i=0; i<3; i++) {
+ sys->rigid.R[v1->tmp.l][i][0] += w*e[0]*e_[i];
+ sys->rigid.R[v1->tmp.l][i][1] += w*e[1]*e_[i];
+ sys->rigid.R[v1->tmp.l][i][2] += w*e[2]*e_[i];
+ }
+}
+
+static void rigid_add_edge_to_R(LaplacianSystem *sys, EditVert *v1, EditVert *v2, float w)
+{
+ rigid_add_half_edge_to_R(sys, v1, v2, w);
+ rigid_add_half_edge_to_R(sys, v2, v1, w);
+}
+
+static void rigid_orthogonalize_R(float R[][3])
+{
+ HMatrix M, Q, S;
+
+ Mat4CpyMat3(M, R);
+ polar_decomp(M, Q, S);
+ Mat3CpyMat4(R, Q);
+}
+
+static void rigid_add_half_edge_to_rhs(LaplacianSystem *sys, EditVert *v1, EditVert *v2, float w)
+{
+ /* formula (8) */
+ float Rsum[3][3], rhs[3];
+
+ if (sys->vpinned[v1->tmp.l])
+ return;
+
+ Mat3AddMat3(Rsum, sys->rigid.R[v1->tmp.l], sys->rigid.R[v2->tmp.l]);
+ Mat3Transp(Rsum);
+
+ VecSubf(rhs, sys->rigid.origco[v1->tmp.l], sys->rigid.origco[v2->tmp.l]);
+ Mat3MulVecfl(Rsum, rhs);
+ VecMulf(rhs, 0.5f);
+ VecMulf(rhs, w);
+
+ VecAddf(sys->rigid.rhs[v1->tmp.l], sys->rigid.rhs[v1->tmp.l], rhs);
+}
+
+static void rigid_add_edge_to_rhs(LaplacianSystem *sys, EditVert *v1, EditVert *v2, float w)
+{
+ rigid_add_half_edge_to_rhs(sys, v1, v2, w);
+ rigid_add_half_edge_to_rhs(sys, v2, v1, w);
+}
+
+void rigid_deform_iteration()
+{
+ LaplacianSystem *sys= RigidDeformSystem;
+ EditMesh *em;
+ EditVert *eve;
+ EditFace *efa;
+ int a, i;
+
+ if(!sys)
+ return;
+
+ nlMakeCurrent(sys->context);
+ em= sys->rigid.mesh;
+
+ /* compute R */
+ memset(sys->rigid.R, 0, sizeof(float)*3*3*sys->totvert);
+ memset(sys->rigid.rhs, 0, sizeof(float)*3*sys->totvert);
+
+ for(a=0, efa=em->faces.first; efa; efa=efa->next, a++) {
+ rigid_add_edge_to_R(sys, efa->v1, efa->v2, sys->fweights[a][2]);
+ rigid_add_edge_to_R(sys, efa->v2, efa->v3, sys->fweights[a][0]);
+ rigid_add_edge_to_R(sys, efa->v3, efa->v1, sys->fweights[a][1]);
+
+ if(efa->v4) {
+ a++;
+ rigid_add_edge_to_R(sys, efa->v1, efa->v3, sys->fweights[a][2]);
+ rigid_add_edge_to_R(sys, efa->v3, efa->v4, sys->fweights[a][0]);
+ rigid_add_edge_to_R(sys, efa->v4, efa->v1, sys->fweights[a][1]);
+ }
+ }
+
+ for(a=0, eve=em->verts.first; eve; eve=eve->next, a++) {
+ rigid_orthogonalize_R(sys->rigid.R[a]);
+ eve->tmp.l= a;
+ }
+
+ /* compute right hand sides for solving */
+ for(a=0, efa=em->faces.first; efa; efa=efa->next, a++) {
+ rigid_add_edge_to_rhs(sys, efa->v1, efa->v2, sys->fweights[a][2]);
+ rigid_add_edge_to_rhs(sys, efa->v2, efa->v3, sys->fweights[a][0]);
+ rigid_add_edge_to_rhs(sys, efa->v3, efa->v1, sys->fweights[a][1]);
+
+ if(efa->v4) {
+ a++;
+ rigid_add_edge_to_rhs(sys, efa->v1, efa->v3, sys->fweights[a][2]);
+ rigid_add_edge_to_rhs(sys, efa->v3, efa->v4, sys->fweights[a][0]);
+ rigid_add_edge_to_rhs(sys, efa->v4, efa->v1, sys->fweights[a][1]);
+ }
+ }
+
+ /* solve for positions, for X,Y and Z separately */
+ for(i=0; i<3; i++) {
+ laplacian_begin_solve(sys, i);
+
+ for(a=0; a<sys->totvert; a++)
+ if(!sys->vpinned[a])
+ laplacian_add_right_hand_side(sys, a, sys->rigid.rhs[a][i]);
+
+ if(laplacian_system_solve(sys)) {
+ for(a=0, eve=em->verts.first; eve; eve=eve->next, a++)
+ eve->co[i]= laplacian_system_get_solution(a);
+ }
+ else {
+ if(!sys->rigid.thrownerror) {
+ error("RigidDeform: failed to find solution.");
+ sys->rigid.thrownerror= 1;
+ }
+ break;
+ }
+ }
+}
+
+static void rigid_laplacian_create(LaplacianSystem *sys)
+{
+ EditMesh *em = sys->rigid.mesh;
+ EditVert *eve;
+ EditFace *efa;
+ int a;
+
+ /* add verts and faces to laplacian */
+ for(a=0, eve=em->verts.first; eve; eve=eve->next, a++) {
+ laplacian_add_vertex(sys, eve->co, eve->pinned);
+ eve->tmp.l= a;
+ }
+
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ laplacian_add_triangle(sys,
+ efa->v1->tmp.l, efa->v2->tmp.l, efa->v3->tmp.l);
+ if(efa->v4)
+ laplacian_add_triangle(sys,
+ efa->v1->tmp.l, efa->v3->tmp.l, efa->v4->tmp.l);
+ }
+}
+
+void rigid_deform_begin(EditMesh *em)
+{
+ LaplacianSystem *sys;
+ EditVert *eve;
+ EditFace *efa;
+ int a, totvert, totface;
+
+ /* count vertices, triangles */
+ for(totvert=0, eve=em->verts.first; eve; eve=eve->next)
+ totvert++;
+
+ for(totface=0, efa=em->faces.first; efa; efa=efa->next) {
+ totface++;
+ if(efa->v4) totface++;
+ }
+
+ /* create laplacian */
+ sys = laplacian_system_construct_begin(totvert, totface);
+
+ sys->rigid.mesh= em;
+ sys->rigid.R = MEM_callocN(sizeof(float)*3*3*totvert, "RigidDeformR");
+ sys->rigid.rhs = MEM_callocN(sizeof(float)*3*totvert, "RigidDeformRHS");
+ sys->rigid.origco = MEM_callocN(sizeof(float)*3*totvert, "RigidDeformCo");
+
+ for(a=0, eve=em->verts.first; eve; eve=eve->next, a++)
+ VecCopyf(sys->rigid.origco[a], eve->co);
+
+ sys->areaweights= 0;
+ sys->storeweights= 1;
+
+ rigid_laplacian_create(sys);
+
+ laplacian_system_construct_end(sys);
+
+ RigidDeformSystem = sys;
+}
+
+void rigid_deform_end(int cancel)
+{
+ LaplacianSystem *sys = RigidDeformSystem;
+
+ if(sys) {
+ EditMesh *em = sys->rigid.mesh;
+ EditVert *eve;
+ int a;
+
+ if(cancel)
+ for(a=0, eve=em->verts.first; eve; eve=eve->next, a++)
+ if(!eve->pinned)
+ VecCopyf(eve->co, sys->rigid.origco[a]);
+
+ if(sys->rigid.R) MEM_freeN(sys->rigid.R);
+ if(sys->rigid.rhs) MEM_freeN(sys->rigid.rhs);
+ if(sys->rigid.origco) MEM_freeN(sys->rigid.origco);
+
+ /* free */
+ laplacian_system_delete(sys);
+ }
+
+ RigidDeformSystem = NULL;
+}
+#endif
+
+/************************** Harmonic Coordinates ****************************/
+/* From "Harmonic Coordinates for Character Articulation",
+ Pushkar Joshi, Mark Meyer, Tony DeRose, Brian Green and Tom Sanocki,
+ SIGGRAPH 2007. */
+
+#define EPSILON 0.0001f
+
+#define MESHDEFORM_TAG_UNTYPED 0
+#define MESHDEFORM_TAG_BOUNDARY 1
+#define MESHDEFORM_TAG_INTERIOR 2
+#define MESHDEFORM_TAG_EXTERIOR 3
+
+#define MESHDEFORM_LEN_THRESHOLD 1e-6
+
+#define MESHDEFORM_MIN_INFLUENCE 0.005
+
+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}};
+
+typedef struct MDefBoundIsect {
+ float co[3], uvw[4];
+ int nvert, v[4], facing;
+ float len;
+} MDefBoundIsect;
+
+typedef struct MDefBindInfluence {
+ struct MDefBindInfluence *next;
+ float weight;
+ int vertex;
+} MDefBindInfluence;
+
+typedef struct MeshDeformBind {
+ /* grid dimensions */
+ float min[3], max[3];
+ float width[3], halfwidth[3];
+ int size, size3;
+
+ /* meshes */
+ DerivedMesh *cagedm;
+ float (*cagecos)[3];
+ float (*vertexcos)[3];
+ int totvert, totcagevert;
+
+ /* grids */
+ MemArena *memarena;
+ MDefBoundIsect *(*boundisect)[6];
+ int *semibound;
+ int *tag;
+ float *phi, *totalphi;
+
+ /* mesh stuff */
+ int *inside;
+ float *weights;
+ MDefBindInfluence **dyngrid;
+ float cagemat[4][4];
+
+ /* direct solver */
+ int *varidx;
+
+ /* raytrace */
+ RayTree *raytree;
+} MeshDeformBind;
+
+/* ray intersection */
+
+/* our own triangle intersection, so we can fully control the epsilons and
+ * prevent corner case from going wrong*/
+static int meshdeform_tri_intersect(float orig[3], float end[3], float vert0[3],
+ float vert1[3], float vert2[3], float *isectco, float *uvw)
+{
+ float edge1[3], edge2[3], tvec[3], pvec[3], qvec[3];
+ float det,inv_det, u, v, dir[3], isectdir[3];
+
+ VECSUB(dir, end, orig);
+
+ /* find vectors for two edges sharing vert0 */
+ VECSUB(edge1, vert1, vert0);
+ VECSUB(edge2, vert2, vert0);
+
+ /* begin calculating determinant - also used to calculate U parameter */
+ Crossf(pvec, dir, edge2);
+
+ /* if determinant is near zero, ray lies in plane of triangle */
+ det = INPR(edge1, pvec);
+
+ if (det == 0.0f)
+ return 0;
+ inv_det = 1.0f / det;
+
+ /* calculate distance from vert0 to ray origin */
+ VECSUB(tvec, orig, vert0);
+
+ /* calculate U parameter and test bounds */
+ u = INPR(tvec, pvec) * inv_det;
+ if (u < -EPSILON || u > 1.0f+EPSILON)
+ return 0;
+
+ /* prepare to test V parameter */
+ Crossf(qvec, tvec, edge1);
+
+ /* calculate V parameter and test bounds */
+ v = INPR(dir, qvec) * inv_det;
+ if (v < -EPSILON || u + v > 1.0f+EPSILON)
+ return 0;
+
+ isectco[0]= (1.0f - u - v)*vert0[0] + u*vert1[0] + v*vert2[0];
+ 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[1]= u;
+ uvw[2]= v;
+
+ /* check if it is within the length of the line segment */
+ VECSUB(isectdir, isectco, orig);
+
+ if(INPR(dir, isectdir) < -EPSILON)
+ return 0;
+
+ if(INPR(dir, dir) + EPSILON < INPR(isectdir, isectdir))
+ return 0;
+
+ return 1;
+}
+
+/* blender's raytracer is not use now, even though it is much faster. it can
+ * give problems with rays falling through, so we use our own intersection
+ * function above with tweaked epsilons */
+
+#if 0
+static MeshDeformBind *MESHDEFORM_BIND = NULL;
+
+static void meshdeform_ray_coords_func(RayFace *face, float **v1, float **v2, float **v3, float **v4)
+{
+ MFace *mface= (MFace*)face;
+ float (*cagecos)[3]= MESHDEFORM_BIND->cagecos;
+
+ *v1= cagecos[mface->v1];
+ *v2= cagecos[mface->v2];
+ *v3= cagecos[mface->v3];
+ *v4= (mface->v4)? cagecos[mface->v4]: NULL;
+}
+
+static int meshdeform_ray_check_func(Isect *is, RayFace *face)
+{
+ return 1;
+}
+
+static void meshdeform_ray_tree_create(MeshDeformBind *mdb)
+{
+ MFace *mface;
+ float min[3], max[3];
+ int a, totface;
+
+ /* create a raytrace tree from the mesh */
+ INIT_MINMAX(min, max);
+
+ for(a=0; a<mdb->totcagevert; a++)
+ DO_MINMAX(mdb->cagecos[a], min, max)
+
+ MESHDEFORM_BIND= mdb;
+
+ mface= mdb->cagedm->getFaceArray(mdb->cagedm);
+ totface= mdb->cagedm->getNumFaces(mdb->cagedm);
+
+ mdb->raytree= RE_ray_tree_create(64, totface, min, max,
+ meshdeform_ray_coords_func, meshdeform_ray_check_func);
+
+ for(a=0; a<totface; a++, mface++)
+ RE_ray_tree_add_face(mdb->raytree, mface);
+
+ RE_ray_tree_done(mdb->raytree);
+}
+
+static void meshdeform_ray_tree_free(MeshDeformBind *mdb)
+{
+ MESHDEFORM_BIND= NULL;
+ RE_ray_tree_free(mdb->raytree);
+}
+#endif
+
+static int meshdeform_intersect(MeshDeformBind *mdb, Isect *isec)
+{
+ MFace *mface;
+ float face[4][3], co[3], uvw[3], len, nor[3];
+ int f, hit, is= 0, totface;
+
+ isec->labda= 1e10;
+
+ mface= mdb->cagedm->getFaceArray(mdb->cagedm);
+ totface= mdb->cagedm->getNumFaces(mdb->cagedm);
+
+ for(f=0; f<totface; f++, mface++) {
+ VECCOPY(face[0], mdb->cagecos[mface->v1]);
+ VECCOPY(face[1], mdb->cagecos[mface->v2]);
+ VECCOPY(face[2], mdb->cagecos[mface->v3]);
+
+ if(mface->v4) {
+ VECCOPY(face[3], mdb->cagecos[mface->v4]);
+ hit= meshdeform_tri_intersect(isec->start, isec->end, face[0], face[1], face[2], co, uvw);
+
+ if(hit) {
+ CalcNormFloat(face[0], face[1], face[2], nor);
+ }
+ else {
+ hit= meshdeform_tri_intersect(isec->start, isec->end, face[0], face[2], face[3], co, uvw);
+ CalcNormFloat(face[0], face[2], face[3], nor);
+ }
+ }
+ else {
+ hit= meshdeform_tri_intersect(isec->start, isec->end, face[0], face[1], face[2], co, uvw);
+ CalcNormFloat(face[0], face[1], face[2], nor);
+ }
+
+ if(hit) {
+ len= VecLenf(isec->start, co)/VecLenf(isec->start, isec->end);
+ if(len < isec->labda) {
+ isec->labda= len;
+ isec->face= mface;
+ isec->isect= (INPR(isec->vec, nor) <= 0.0f);
+ is= 1;
+ }
+ }
+ }
+
+ return is;
+}
+
+static MDefBoundIsect *meshdeform_ray_tree_intersect(MeshDeformBind *mdb, float *co1, float *co2)
+{
+ MDefBoundIsect *isect;
+ Isect isec;
+ float (*cagecos)[3];
+ MFace *mface;
+ float vert[4][3], len;
+ static float epsilon[3]= {0, 0, 0}; //1e-4, 1e-4, 1e-4};
+
+ /* setup isec */
+ memset(&isec, 0, sizeof(isec));
+ isec.mode= RE_RAY_MIRROR; /* we want the closest intersection */
+ isec.lay= -1;
+ isec.face_last= NULL;
+ isec.faceorig= NULL;
+ isec.labda= 1e10f;
+
+ VECADD(isec.start, co1, epsilon);
+ VECADD(isec.end, co2, epsilon);
+ VECSUB(isec.vec, isec.end, isec.start);
+
+#if 0
+ /*if(RE_ray_tree_intersect(mdb->raytree, &isec)) {*/
+#endif
+
+ if(meshdeform_intersect(mdb, &isec)) {
+ len= isec.labda;
+ mface= isec.face;
+
+ /* create MDefBoundIsect */
+ isect= BLI_memarena_alloc(mdb->memarena, sizeof(*isect));
+
+ /* compute intersection coordinate */
+ isect->co[0]= co1[0] + isec.vec[0]*len;
+ isect->co[1]= co1[1] + isec.vec[1]*len;
+ isect->co[2]= co1[2] + isec.vec[2]*len;
+
+ isect->len= VecLenf(co1, isect->co);
+ if(isect->len < MESHDEFORM_LEN_THRESHOLD)
+ isect->len= MESHDEFORM_LEN_THRESHOLD;
+
+ isect->v[0]= mface->v1;
+ isect->v[1]= mface->v2;
+ isect->v[2]= mface->v3;
+ isect->v[3]= mface->v4;
+ isect->nvert= (mface->v4)? 4: 3;
+
+ isect->facing= isec.isect;
+
+ /* compute mean value coordinates for interpolation */
+ cagecos= mdb->cagecos;
+ VECCOPY(vert[0], cagecos[mface->v1]);
+ VECCOPY(vert[1], cagecos[mface->v2]);
+ VECCOPY(vert[2], cagecos[mface->v3]);
+ if(mface->v4) VECCOPY(vert[3], cagecos[mface->v4]);
+ MeanValueWeights(vert, isect->nvert, isect->co, isect->uvw);
+
+ return isect;
+ }
+
+ return NULL;
+}
+
+static int meshdeform_inside_cage(MeshDeformBind *mdb, float *co)
+{
+ MDefBoundIsect *isect;
+ float outside[3], start[3], dir[3];
+ int i, counter;
+
+ for(i=1; i<=6; i++) {
+ counter = 0;
+
+ outside[0] = co[0] + (mdb->max[0] - mdb->min[0] + 1.0f)*MESHDEFORM_OFFSET[i][0];
+ outside[1] = co[1] + (mdb->max[1] - mdb->min[1] + 1.0f)*MESHDEFORM_OFFSET[i][1];
+ outside[2] = co[2] + (mdb->max[2] - mdb->min[2] + 1.0f)*MESHDEFORM_OFFSET[i][2];
+
+ VECSUB(dir, outside, start);
+ Normalize(dir);
+ VECCOPY(start, co);
+
+ isect = meshdeform_ray_tree_intersect(mdb, start, outside);
+ if(isect && !isect->facing)
+ return 1;
+ }
+
+ return 0;
+}
+
+/* solving */
+
+static int meshdeform_index(MeshDeformBind *mdb, int x, int y, int z, int n)
+{
+ int size= mdb->size;
+
+ x += MESHDEFORM_OFFSET[n][0];
+ y += MESHDEFORM_OFFSET[n][1];
+ z += MESHDEFORM_OFFSET[n][2];
+
+ if(x < 0 || x >= mdb->size)
+ return -1;
+ if(y < 0 || y >= mdb->size)
+ return -1;
+ if(z < 0 || z >= mdb->size)
+ return -1;
+
+ return x + y*size + z*size*size;
+}
+
+static void meshdeform_cell_center(MeshDeformBind *mdb, int x, int y, int z, int n, float *center)
+{
+ x += MESHDEFORM_OFFSET[n][0];
+ y += MESHDEFORM_OFFSET[n][1];
+ z += MESHDEFORM_OFFSET[n][2];
+
+ center[0]= mdb->min[0] + x*mdb->width[0] + mdb->halfwidth[0];
+ center[1]= mdb->min[1] + y*mdb->width[1] + mdb->halfwidth[1];
+ center[2]= mdb->min[2] + z*mdb->width[2] + mdb->halfwidth[2];
+}
+
+static void meshdeform_add_intersections(MeshDeformBind *mdb, int x, int y, int z)
+{
+ MDefBoundIsect *isect;
+ float center[3], ncenter[3];
+ int i, a;
+
+ a= meshdeform_index(mdb, x, y, z, 0);
+ meshdeform_cell_center(mdb, x, y, z, 0, center);
+
+ /* check each outgoing edge for intersection */
+ for(i=1; i<=6; i++) {
+ if(meshdeform_index(mdb, x, y, z, i) == -1)
+ continue;
+
+ meshdeform_cell_center(mdb, x, y, z, i, ncenter);
+
+ isect= meshdeform_ray_tree_intersect(mdb, center, ncenter);
+ if(isect) {
+ mdb->boundisect[a][i-1]= isect;
+ mdb->tag[a]= MESHDEFORM_TAG_BOUNDARY;
+ }
+ }
+}
+
+static void meshdeform_bind_floodfill(MeshDeformBind *mdb)
+{
+ int *stack, *tag= mdb->tag;
+ int a, b, i, xyz[3], stacksize, size= mdb->size;
+
+ stack= MEM_callocN(sizeof(int)*mdb->size3, "MeshDeformBindStack");
+
+ /* we know lower left corner is EXTERIOR because of padding */
+ tag[0]= MESHDEFORM_TAG_EXTERIOR;
+ stack[0]= 0;
+ stacksize= 1;
+
+ /* floodfill exterior tag */
+ while(stacksize > 0) {
+ a= stack[--stacksize];
+
+ xyz[2]= a/(size*size);
+ xyz[1]= (a - xyz[2]*size*size)/size;
+ xyz[0]= a - xyz[1]*size - xyz[2]*size*size;
+
+ for(i=1; i<=6; i++) {
+ b= meshdeform_index(mdb, xyz[0], xyz[1], xyz[2], i);
+
+ if(b != -1) {
+ if(tag[b] == MESHDEFORM_TAG_UNTYPED ||
+ (tag[b] == MESHDEFORM_TAG_BOUNDARY && !mdb->boundisect[a][i-1])) {
+ tag[b]= MESHDEFORM_TAG_EXTERIOR;
+ stack[stacksize++]= b;
+ }
+ }
+ }
+ }
+
+ /* other cells are interior */
+ for(a=0; a<size*size*size; a++)
+ if(tag[a]==MESHDEFORM_TAG_UNTYPED)
+ tag[a]= MESHDEFORM_TAG_INTERIOR;
+
+#if 0
+ {
+ int tb, ti, te, ts;
+ tb= ti= te= ts= 0;
+ for(a=0; a<size*size*size; a++)
+ if(tag[a]==MESHDEFORM_TAG_BOUNDARY)
+ tb++;
+ else if(tag[a]==MESHDEFORM_TAG_INTERIOR)
+ ti++;
+ else if(tag[a]==MESHDEFORM_TAG_EXTERIOR) {
+ te++;
+
+ if(mdb->semibound[a])
+ ts++;
+ }
+
+ printf("interior %d exterior %d boundary %d semi-boundary %d\n", ti, te, tb, ts);
+ }
+#endif
+
+ MEM_freeN(stack);
+}
+
+static float meshdeform_boundary_phi(MeshDeformBind *mdb, MDefBoundIsect *isect, int cagevert)
+{
+ int a;
+
+ for(a=0; a<isect->nvert; a++)
+ if(isect->v[a] == cagevert)
+ return isect->uvw[a];
+
+ return 0.0f;
+}
+
+static float meshdeform_interp_w(MeshDeformBind *mdb, float *gridvec, float *vec, int cagevert)
+{
+ float dvec[3], ivec[3], wx, wy, wz, result=0.0f;
+ float weight, totweight= 0.0f;
+ int i, a, x, y, z;
+
+ for(i=0; i<3; i++) {
+ ivec[i]= (int)gridvec[i];
+ dvec[i]= gridvec[i] - ivec[i];
+ }
+
+ for(i=0; i<8; i++) {
+ if(i & 1) { x= ivec[0]+1; wx= dvec[0]; }
+ else { x= ivec[0]; wx= 1.0f-dvec[0]; }
+
+ if(i & 2) { y= ivec[1]+1; wy= dvec[1]; }
+ else { y= ivec[1]; wy= 1.0f-dvec[1]; }
+
+ if(i & 4) { z= ivec[2]+1; wz= dvec[2]; }
+ else { z= ivec[2]; wz= 1.0f-dvec[2]; }
+
+ CLAMP(x, 0, mdb->size-1);
+ CLAMP(y, 0, mdb->size-1);
+ CLAMP(z, 0, mdb->size-1);
+
+ a= meshdeform_index(mdb, x, y, z, 0);
+ weight= wx*wy*wz;
+ result += weight*mdb->phi[a];
+ totweight += weight;
+ }
+
+ if(totweight > 0.0f)
+ result /= totweight;
+
+ return result;
+}
+
+static void meshdeform_check_semibound(MeshDeformBind *mdb, int x, int y, int z)
+{
+ int i, a;
+
+ a= meshdeform_index(mdb, x, y, z, 0);
+ if(mdb->tag[a] != MESHDEFORM_TAG_EXTERIOR)
+ return;
+
+ for(i=1; i<=6; i++)
+ if(mdb->boundisect[a][i-1])
+ mdb->semibound[a]= 1;
+}
+
+static float meshdeform_boundary_total_weight(MeshDeformBind *mdb, int x, int y, int z)
+{
+ float weight, totweight= 0.0f;
+ int i, a;
+
+ a= meshdeform_index(mdb, x, y, z, 0);
+
+ /* count weight for neighbour cells */
+ for(i=1; i<=6; i++) {
+ if(meshdeform_index(mdb, x, y, z, i) == -1)
+ continue;
+
+ if(mdb->boundisect[a][i-1])
+ weight= 1.0f/mdb->boundisect[a][i-1]->len;
+ else if(!mdb->semibound[a])
+ weight= 1.0f/mdb->width[0];
+ else
+ weight= 0.0f;
+
+ totweight += weight;
+ }
+
+ return totweight;
+}
+
+static void meshdeform_matrix_add_cell(MeshDeformBind *mdb, int x, int y, int z)
+{
+ MDefBoundIsect *isect;
+ float weight, totweight;
+ int i, a, acenter;
+
+ acenter= meshdeform_index(mdb, x, y, z, 0);
+ if(mdb->tag[acenter] == MESHDEFORM_TAG_EXTERIOR)
+ return;
+
+ nlMatrixAdd(mdb->varidx[acenter], mdb->varidx[acenter], 1.0f);
+
+ totweight= meshdeform_boundary_total_weight(mdb, x, y, z);
+ for(i=1; i<=6; i++) {
+ a= meshdeform_index(mdb, x, y, z, i);
+ if(a == -1 || mdb->tag[a] == MESHDEFORM_TAG_EXTERIOR)
+ continue;
+
+ isect= mdb->boundisect[acenter][i-1];
+ if (!isect) {
+ weight= (1.0f/mdb->width[0])/totweight;
+ nlMatrixAdd(mdb->varidx[acenter], mdb->varidx[a], -weight);
+ }
+ }
+}
+
+static void meshdeform_matrix_add_rhs(MeshDeformBind *mdb, int x, int y, int z, int cagevert)
+{
+ MDefBoundIsect *isect;
+ float rhs, weight, totweight;
+ int i, a, acenter;
+
+ acenter= meshdeform_index(mdb, x, y, z, 0);
+ if(mdb->tag[acenter] == MESHDEFORM_TAG_EXTERIOR)
+ return;
+
+ totweight= meshdeform_boundary_total_weight(mdb, x, y, z);
+ for(i=1; i<=6; i++) {
+ a= meshdeform_index(mdb, x, y, z, i);
+ if(a == -1)
+ continue;
+
+ isect= mdb->boundisect[acenter][i-1];
+
+ if (isect) {
+ weight= (1.0f/isect->len)/totweight;
+ rhs= weight*meshdeform_boundary_phi(mdb, isect, cagevert);
+ nlRightHandSideAdd(0, mdb->varidx[acenter], rhs);
+ }
+ }
+}
+
+static void meshdeform_matrix_add_semibound_phi(MeshDeformBind *mdb, int x, int y, int z, int cagevert)
+{
+ MDefBoundIsect *isect;
+ float rhs, weight, totweight;
+ int i, a;
+
+ a= meshdeform_index(mdb, x, y, z, 0);
+ if(!mdb->semibound[a])
+ return;
+
+ mdb->phi[a]= 0.0f;
+
+ totweight= meshdeform_boundary_total_weight(mdb, x, y, z);
+ for(i=1; i<=6; i++) {
+ isect= mdb->boundisect[a][i-1];
+
+ if (isect) {
+ weight= (1.0f/isect->len)/totweight;
+ rhs= weight*meshdeform_boundary_phi(mdb, isect, cagevert);
+ mdb->phi[a] += rhs;
+ }
+ }
+}
+
+static void meshdeform_matrix_add_exterior_phi(MeshDeformBind *mdb, int x, int y, int z, int cagevert)
+{
+ float phi, totweight;
+ int i, a, acenter;
+
+ acenter= meshdeform_index(mdb, x, y, z, 0);
+ if(mdb->tag[acenter] != MESHDEFORM_TAG_EXTERIOR || mdb->semibound[acenter])
+ return;
+
+ phi= 0.0f;
+ totweight= 0.0f;
+ for(i=1; i<=6; i++) {
+ a= meshdeform_index(mdb, x, y, z, i);
+
+ if(a != -1 && mdb->semibound[a]) {
+ phi += mdb->phi[a];
+ totweight += 1.0f;
+ }
+ }
+
+ if(totweight != 0.0f)
+ mdb->phi[acenter]= phi/totweight;
+}
+
+static void meshdeform_matrix_solve(MeshDeformBind *mdb)
+{
+ NLContext *context;
+ float vec[3], gridvec[3];
+ int a, b, x, y, z, totvar;
+ char message[1024];
+
+ /* setup variable indices */
+ mdb->varidx= MEM_callocN(sizeof(int)*mdb->size3, "MeshDeformDSvaridx");
+ for(a=0, totvar=0; a<mdb->size3; a++)
+ mdb->varidx[a]= (mdb->tag[a] == MESHDEFORM_TAG_EXTERIOR)? -1: totvar++;
+
+ if(totvar == 0) {
+ MEM_freeN(mdb->varidx);
+ return;
+ }
+
+ progress_bar(0, "Starting mesh deform solve");
+
+ /* setup opennl solver */
+ nlNewContext();
+ context= nlGetCurrent();
+
+ nlSolverParameteri(NL_NB_VARIABLES, totvar);
+ nlSolverParameteri(NL_NB_ROWS, totvar);
+ nlSolverParameteri(NL_NB_RIGHT_HAND_SIDES, 1);
+
+ nlBegin(NL_SYSTEM);
+ nlBegin(NL_MATRIX);
+
+ /* build matrix */
+ for(z=0; z<mdb->size; z++)
+ for(y=0; y<mdb->size; y++)
+ for(x=0; x<mdb->size; x++)
+ meshdeform_matrix_add_cell(mdb, x, y, z);
+
+ /* solve for each cage vert */
+ for(a=0; a<mdb->totcagevert; a++) {
+ if(a != 0) {
+ nlBegin(NL_SYSTEM);
+ nlBegin(NL_MATRIX);
+ }
+
+ /* fill in right hand side and solve */
+ for(z=0; z<mdb->size; z++)
+ for(y=0; y<mdb->size; y++)
+ for(x=0; x<mdb->size; x++)
+ meshdeform_matrix_add_rhs(mdb, x, y, z, a);
+
+ nlEnd(NL_MATRIX);
+ nlEnd(NL_SYSTEM);
+
+#if 0
+ nlPrintMatrix();
+#endif
+
+ if(nlSolveAdvanced(NULL, NL_TRUE)) {
+ for(z=0; z<mdb->size; z++)
+ for(y=0; y<mdb->size; y++)
+ for(x=0; x<mdb->size; x++)
+ meshdeform_matrix_add_semibound_phi(mdb, x, y, z, a);
+
+ for(z=0; z<mdb->size; z++)
+ for(y=0; y<mdb->size; y++)
+ for(x=0; x<mdb->size; x++)
+ meshdeform_matrix_add_exterior_phi(mdb, x, y, z, a);
+
+ for(b=0; b<mdb->size3; b++) {
+ if(mdb->tag[b] != MESHDEFORM_TAG_EXTERIOR)
+ mdb->phi[b]= nlGetVariable(0, mdb->varidx[b]);
+ mdb->totalphi[b] += mdb->phi[b];
+ }
+
+ if(mdb->weights) {
+ /* static bind : compute weights for each vertex */
+ for(b=0; b<mdb->totvert; b++) {
+ if(mdb->inside[b]) {
+ VECCOPY(vec, mdb->vertexcos[b]);
+ Mat4MulVecfl(mdb->cagemat, vec);
+ gridvec[0]= (vec[0] - mdb->min[0] - mdb->halfwidth[0])/mdb->width[0];
+ gridvec[1]= (vec[1] - mdb->min[1] - mdb->halfwidth[1])/mdb->width[1];
+ gridvec[2]= (vec[2] - mdb->min[2] - mdb->halfwidth[2])/mdb->width[2];
+
+ mdb->weights[b*mdb->totcagevert + a]= meshdeform_interp_w(mdb, gridvec, vec, a);
+ }
+ }
+ }
+ else {
+ MDefBindInfluence *inf;
+
+ /* dynamic bind */
+ for(b=0; b<mdb->size3; b++) {
+ if(mdb->phi[b] >= MESHDEFORM_MIN_INFLUENCE) {
+ inf= BLI_memarena_alloc(mdb->memarena, sizeof(*inf));
+ inf->vertex= a;
+ inf->weight= mdb->phi[b];
+ inf->next= mdb->dyngrid[b];
+ mdb->dyngrid[b]= inf;
+ }
+ }
+ }
+ }
+ else {
+ error("Mesh Deform: failed to find solution.");
+ break;
+ }
+
+ sprintf(message, "Mesh deform solve %d / %d |||", a+1, mdb->totcagevert);
+ progress_bar((float)(a+1)/(float)(mdb->totcagevert), message);
+ }
+
+#if 0
+ /* sanity check */
+ for(b=0; b<mdb->size3; b++)
+ if(mdb->tag[b] != MESHDEFORM_TAG_EXTERIOR)
+ if(fabs(mdb->totalphi[b] - 1.0f) > 1e-4)
+ printf("totalphi deficiency [%s|%d] %d: %.10f\n",
+ (mdb->tag[b] == MESHDEFORM_TAG_INTERIOR)? "interior": "boundary", mdb->semibound[b], mdb->varidx[b], mdb->totalphi[b]);
+#endif
+
+ /* free */
+ MEM_freeN(mdb->varidx);
+
+ nlDeleteContext(context);
+}
+
+void harmonic_coordinates_bind(MeshDeformModifierData *mmd, float (*vertexcos)[3], int totvert, float cagemat[][4])
+{
+ MeshDeformBind mdb;
+ MDefBindInfluence *inf;
+ MDefInfluence *mdinf;
+ MDefCell *cell;
+ MVert *mvert;
+ float center[3], vec[3], maxwidth, totweight;
+ int a, b, x, y, z, totinside, offset;
+
+ waitcursor(1);
+ start_progress_bar();
+
+ memset(&mdb, 0, sizeof(MeshDeformBind));
+
+ /* get mesh and cage mesh */
+ mdb.vertexcos= vertexcos;
+ mdb.totvert= totvert;
+
+ mdb.cagedm= mesh_create_derived_no_deform(mmd->object, NULL, CD_MASK_BAREMESH);
+ mdb.totcagevert= mdb.cagedm->getNumVerts(mdb.cagedm);
+ mdb.cagecos= MEM_callocN(sizeof(*mdb.cagecos)*mdb.totcagevert, "MeshDeformBindCos");
+ Mat4CpyMat4(mdb.cagemat, cagemat);
+
+ mvert= mdb.cagedm->getVertArray(mdb.cagedm);
+ for(a=0; a<mdb.totcagevert; a++)
+ VECCOPY(mdb.cagecos[a], mvert[a].co)
+
+ /* compute bounding box of the cage mesh */
+ INIT_MINMAX(mdb.min, mdb.max);
+
+ for(a=0; a<mdb.totcagevert; a++)
+ DO_MINMAX(mdb.cagecos[a], mdb.min, mdb.max);
+
+ /* allocate memory */
+ mdb.size= (2<<(mmd->gridsize-1)) + 2;
+ mdb.size3= mdb.size*mdb.size*mdb.size;
+ mdb.tag= MEM_callocN(sizeof(int)*mdb.size3, "MeshDeformBindTag");
+ mdb.phi= MEM_callocN(sizeof(float)*mdb.size3, "MeshDeformBindPhi");
+ mdb.totalphi= MEM_callocN(sizeof(float)*mdb.size3, "MeshDeformBindTotalPhi");
+ mdb.boundisect= MEM_callocN(sizeof(*mdb.boundisect)*mdb.size3, "MDefBoundIsect");
+ mdb.semibound= MEM_callocN(sizeof(int)*mdb.size3, "MDefSemiBound");
+
+ mdb.inside= MEM_callocN(sizeof(int)*mdb.totvert, "MDefInside");
+
+ if(mmd->flag & MOD_MDEF_DYNAMIC_BIND)
+ mdb.dyngrid= MEM_callocN(sizeof(MDefBindInfluence*)*mdb.size3, "MDefDynGrid");
+ else
+ mdb.weights= MEM_callocN(sizeof(float)*mdb.totvert*mdb.totcagevert, "MDefWeights");
+
+ mdb.memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
+ BLI_memarena_use_calloc(mdb.memarena);
+
+ /* make bounding box equal size in all directions, add padding, and compute
+ * width of the cells */
+ maxwidth = -1.0f;
+ for(a=0; a<3; a++)
+ if(mdb.max[a]-mdb.min[a] > maxwidth)
+ maxwidth= mdb.max[a]-mdb.min[a];
+
+ for(a=0; a<3; a++) {
+ center[a]= (mdb.min[a]+mdb.max[a])*0.5f;
+ mdb.min[a]= center[a] - maxwidth*0.5f;
+ mdb.max[a]= center[a] + maxwidth*0.5f;
+
+ mdb.width[a]= (mdb.max[a]-mdb.min[a])/(mdb.size-4);
+ mdb.min[a] -= 2.1f*mdb.width[a];
+ mdb.max[a] += 2.1f*mdb.width[a];
+
+ mdb.width[a]= (mdb.max[a]-mdb.min[a])/mdb.size;
+ mdb.halfwidth[a]= mdb.width[a]*0.5f;
+ }
+
+ progress_bar(0, "Setting up mesh deform system");
+
+#if 0
+ /* create ray tree */
+ meshdeform_ray_tree_create(&mdb);
+#endif
+
+ totinside= 0;
+ for(a=0; a<mdb.totvert; a++) {
+ VECCOPY(vec, mdb.vertexcos[a]);
+ Mat4MulVecfl(mdb.cagemat, vec);
+ mdb.inside[a]= meshdeform_inside_cage(&mdb, vec);
+ if(mdb.inside[a])
+ totinside++;
+ }
+
+ /* free temporary MDefBoundIsects */
+ BLI_memarena_free(mdb.memarena);
+ mdb.memarena= BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE);
+
+ /* start with all cells untyped */
+ for(a=0; a<mdb.size3; a++)
+ mdb.tag[a]= MESHDEFORM_TAG_UNTYPED;
+
+ /* detect intersections and tag boundary cells */
+ for(z=0; z<mdb.size; z++)
+ for(y=0; y<mdb.size; y++)
+ for(x=0; x<mdb.size; x++)
+ meshdeform_add_intersections(&mdb, x, y, z);
+
+#if 0
+ /* free ray tree */
+ meshdeform_ray_tree_free(&mdb);
+#endif
+
+ /* compute exterior and interior tags */
+ meshdeform_bind_floodfill(&mdb);
+
+ for(z=0; z<mdb.size; z++)
+ for(y=0; y<mdb.size; y++)
+ for(x=0; x<mdb.size; x++)
+ meshdeform_check_semibound(&mdb, x, y, z);
+
+ /* solve */
+ meshdeform_matrix_solve(&mdb);
+
+ /* assign results */
+ mmd->bindcos= (float*)mdb.cagecos;
+ mmd->totvert= mdb.totvert;
+ mmd->totcagevert= mdb.totcagevert;
+ Mat4CpyMat4(mmd->bindmat, mmd->object->obmat);
+
+ if(mmd->flag & MOD_MDEF_DYNAMIC_BIND) {
+ mmd->totinfluence= 0;
+ for(a=0; a<mdb.size3; a++)
+ for(inf=mdb.dyngrid[a]; inf; inf=inf->next)
+ mmd->totinfluence++;
+
+ /* convert MDefBindInfluences to smaller MDefInfluences */
+ mmd->dyngrid= MEM_callocN(sizeof(MDefCell)*mdb.size3, "MDefDynGrid");
+ mmd->dyninfluences= MEM_callocN(sizeof(MDefInfluence)*mmd->totinfluence, "MDefInfluence");
+ offset= 0;
+ for(a=0; a<mdb.size3; a++) {
+ cell= &mmd->dyngrid[a];
+ cell->offset= offset;
+
+ totweight= 0.0f;
+ mdinf= mmd->dyninfluences + cell->offset;
+ for(inf=mdb.dyngrid[a]; inf; inf=inf->next, mdinf++) {
+ mdinf->weight= inf->weight;
+ mdinf->vertex= inf->vertex;
+ totweight += mdinf->weight;
+ cell->totinfluence++;
+ }
+
+ if(totweight > 0.0f) {
+ mdinf= mmd->dyninfluences + cell->offset;
+ for(b=0; b<cell->totinfluence; b++, mdinf++)
+ mdinf->weight /= totweight;
+ }
+
+ offset += cell->totinfluence;
+ }
+
+ mmd->dynverts= mdb.inside;
+ mmd->dyngridsize= mdb.size;
+ VECCOPY(mmd->dyncellmin, mdb.min);
+ mmd->dyncellwidth= mdb.width[0];
+ MEM_freeN(mdb.dyngrid);
+ }
+ else {
+ mmd->bindweights= mdb.weights;
+ MEM_freeN(mdb.inside);
+ }
+
+ /* transform bindcos to world space */
+ for(a=0; a<mdb.totcagevert; a++)
+ Mat4MulVecfl(mmd->object->obmat, mmd->bindcos+a*3);
+
+ /* free */
+ mdb.cagedm->release(mdb.cagedm);
+ MEM_freeN(mdb.tag);
+ MEM_freeN(mdb.phi);
+ MEM_freeN(mdb.totalphi);
+ MEM_freeN(mdb.boundisect);
+ MEM_freeN(mdb.semibound);
+ BLI_memarena_free(mdb.memarena);
+
+ end_progress_bar();
+ waitcursor(0);
+}
+
diff --git a/source/blender/src/meshtools.c b/source/blender/src/meshtools.c
index 41a9bece61a..d901644c19f 100644
--- a/source/blender/src/meshtools.c
+++ b/source/blender/src/meshtools.c
@@ -93,6 +93,7 @@ void sort_faces(void);
#include "BDR_sculptmode.h"
#include "BLI_editVert.h"
+#include "BLI_ghash.h"
#include "BLI_threads.h"
#include "BLI_rand.h" /* for randome face sorting */
@@ -820,6 +821,100 @@ EditVert *editmesh_get_x_mirror_vert(Object *ob, float *co)
return NULL;
}
+static unsigned int mirror_facehash(void *ptr)
+{
+ MFace *mf= ptr;
+ int v0, v1;
+
+ if(mf->v4) {
+ v0= MIN4(mf->v1, mf->v2, mf->v3, mf->v4);
+ v1= MAX4(mf->v1, mf->v2, mf->v3, mf->v4);
+ }
+ else {
+ v0= MIN3(mf->v1, mf->v2, mf->v3);
+ v1= MAX3(mf->v1, mf->v2, mf->v3);
+ }
+
+ return ((v0*39)^(v1*31));
+}
+
+static int mirror_facerotation(MFace *a, MFace *b)
+{
+ if(b->v4) {
+ if(a->v1==b->v1 && a->v2==b->v2 && a->v3==b->v3 && a->v4==b->v4)
+ return 0;
+ else if(a->v4==b->v1 && a->v1==b->v2 && a->v2==b->v3 && a->v3==b->v4)
+ return 1;
+ else if(a->v3==b->v1 && a->v4==b->v2 && a->v1==b->v3 && a->v2==b->v4)
+ return 2;
+ else if(a->v2==b->v1 && a->v3==b->v2 && a->v4==b->v3 && a->v1==b->v4)
+ return 3;
+ }
+ else {
+ if(a->v1==b->v1 && a->v2==b->v2 && a->v3==b->v3)
+ return 0;
+ else if(a->v3==b->v1 && a->v1==b->v2 && a->v2==b->v3)
+ return 1;
+ else if(a->v2==b->v1 && a->v3==b->v2 && a->v1==b->v3)
+ return 2;
+ }
+
+ return -1;
+}
+
+static int mirror_facecmp(void *a, void *b)
+{
+ return (mirror_facerotation((MFace*)a, (MFace*)b) == -1);
+}
+
+int *mesh_get_x_mirror_faces(Object *ob)
+{
+ Mesh *me= ob->data;
+ MVert *mv, *mvert= me->mvert;
+ MFace mirrormf, *mf, *hashmf, *mface= me->mface;
+ GHash *fhash;
+ int *mirrorverts, *mirrorfaces;
+ float vec[3];
+ int a;
+
+ mirrorverts= MEM_callocN(sizeof(int)*me->totvert, "MirrorVerts");
+ mirrorfaces= MEM_callocN(sizeof(int)*2*me->totface, "MirrorFaces");
+
+ mesh_octree_table(ob, NULL, 's');
+
+ for(a=0, mv=mvert; a<me->totvert; a++, mv++) {
+ vec[0]= -mv->co[0];
+ vec[1]= mv->co[1];
+ vec[2]= mv->co[2];
+ mirrorverts[a]= mesh_octree_table(ob, vec, 'u');
+ }
+
+ mesh_octree_table(ob, NULL, 'e');
+
+ fhash= BLI_ghash_new(mirror_facehash, mirror_facecmp);
+ for(a=0, mf=mface; a<me->totface; a++, mf++)
+ BLI_ghash_insert(fhash, mf, mf);
+
+ for(a=0, mf=mface; a<me->totface; a++, mf++) {
+ mirrormf.v1= mirrorverts[mf->v3];
+ mirrormf.v2= mirrorverts[mf->v2];
+ mirrormf.v3= mirrorverts[mf->v1];
+ mirrormf.v4= (mf->v4)? mirrorverts[mf->v4]: 0;
+
+ hashmf= BLI_ghash_lookup(fhash, &mirrormf);
+ if(hashmf) {
+ mirrorfaces[a*2]= hashmf - mface;
+ mirrorfaces[a*2+1]= mirror_facerotation(&mirrormf, hashmf);
+ }
+ else
+ mirrorfaces[a*2]= -1;
+ }
+
+ BLI_ghash_free(fhash, NULL, NULL);
+ MEM_freeN(mirrorverts);
+
+ return mirrorfaces;
+}
/* ****************** render BAKING ********************** */
diff --git a/source/blender/src/multires.c b/source/blender/src/multires.c
index 0b870d0f350..8704f9abfa4 100644
--- a/source/blender/src/multires.c
+++ b/source/blender/src/multires.c
@@ -823,14 +823,21 @@ void multires_add_level(void *ob, void *me_v)
{
int i,j, curf, cure;
Mesh *me= me_v;
- MultiresLevel *lvl= MEM_callocN(sizeof(MultiresLevel), "multireslevel");
+ MultiresLevel *lvl= NULL;
MultiApplyData data;
MVert *oldverts= NULL;
multires_check_state();
+ if(CustomData_number_of_layers(G.obedit ? &G.editMesh->fdata : &me->fdata, CD_MCOL) > 1) {
+ int ret= okee("Adding a level will delete all but the active vertex color layer, proceed?");
+ if(!ret)
+ return;
+ }
+
waitcursor(1);
+ lvl= MEM_callocN(sizeof(MultiresLevel), "multireslevel");
if(me->pv) sculptmode_pmv_off(me);
check_colors(me);
@@ -1058,7 +1065,7 @@ void multires_level_to_mesh(Object *ob, Mesh *me, const int render)
/* Remove editmesh elements */
free_editMesh(em);
- eves= MEM_callocN(sizeof(EditVert)*lvl->totvert, "editvert pointers");
+ eves= MEM_callocN(sizeof(EditVert*)*lvl->totvert, "editvert pointers");
} else {
CustomData_free_layer_active(&me->vdata, CD_MVERT, me->totvert);
CustomData_free_layer_active(&me->edata, CD_MEDGE, me->totedge);
@@ -1611,7 +1618,7 @@ void multires_edge_level_update(void *ob, void *me_v)
if(me->mr->edgelvl >= me->mr->current || i<threshold)
me->medge[ndx].flag |= ME_EDGEDRAW | ME_EDGERENDER;
else
- me->medge[ndx].flag &= ~ME_EDGEDRAW | ~ME_EDGERENDER;
+ me->medge[ndx].flag &= ~ME_EDGEDRAW & ~ME_EDGERENDER;
}
}
diff --git a/source/blender/src/outliner.c b/source/blender/src/outliner.c
index 271d002e464..3e969e4ca9c 100644
--- a/source/blender/src/outliner.c
+++ b/source/blender/src/outliner.c
@@ -261,6 +261,20 @@ static void outliner_height(SpaceOops *soops, ListBase *lb, int *h)
}
}
+static void outliner_width(SpaceOops *soops, ListBase *lb, int *w)
+{
+ TreeElement *te= lb->first;
+ while(te) {
+ TreeStoreElem *tselem= TREESTORE(te);
+ if(tselem->flag & TSE_CLOSED) {
+ if (te->xend > *w)
+ *w = te->xend;
+ }
+ outliner_width(soops, &te->subtree, w);
+ te= te->next;
+ }
+}
+
static TreeElement *outliner_find_tree_element(ListBase *lb, int store_index)
{
TreeElement *te= lb->first, *tes;
@@ -577,19 +591,22 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
pchan->prev= (bPoseChannel *)ten;
if(pchan->constraints.first) {
- Object *target;
+ //Object *target;
bConstraint *con;
TreeElement *ten1;
TreeElement *tenla1= outliner_add_element(soops, &ten->subtree, ob, ten, TSE_CONSTRAINT_BASE, 0);
- char *str;
+ //char *str;
tenla1->name= "Constraints";
for(con= pchan->constraints.first; con; con= con->next, const_index++) {
ten1= outliner_add_element(soops, &tenla1->subtree, ob, tenla1, TSE_CONSTRAINT, const_index);
+#if 0 /* disabled as it needs to be reworked for recoded constraints system */
target= get_constraint_target(con, &str);
if(str && str[0]) ten1->name= str;
else if(target) ten1->name= target->id.name+2;
else ten1->name= con->name;
+#endif
+ ten1->name= con->name;
ten1->directdata= con;
/* possible add all other types links? */
}
@@ -627,20 +644,23 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
outliner_add_element(soops, &te->subtree, ob->mat[a], te, 0, a);
if(ob->constraints.first) {
- Object *target;
+ //Object *target;
bConstraint *con;
TreeElement *ten;
TreeElement *tenla= outliner_add_element(soops, &te->subtree, ob, te, TSE_CONSTRAINT_BASE, 0);
int a= 0;
- char *str;
+ //char *str;
tenla->name= "Constraints";
for(con= ob->constraints.first; con; con= con->next, a++) {
ten= outliner_add_element(soops, &tenla->subtree, ob, tenla, TSE_CONSTRAINT, a);
+#if 0 /* disabled due to constraints system targets recode... code here needs review */
target= get_constraint_target(con, &str);
if(str && str[0]) ten->name= str;
else if(target) ten->name= target->id.name+2;
else ten->name= con->name;
+#endif
+ ten->name= con->name;
ten->directdata= con;
/* possible add all other types links? */
}
@@ -2042,7 +2062,7 @@ void outliner_show_active(struct ScrArea *sa)
{
SpaceOops *so= sa->spacedata.first;
TreeElement *te;
- int ytop;
+ int xdelta, ytop;
if(OBACT == NULL) return;
@@ -2053,6 +2073,12 @@ void outliner_show_active(struct ScrArea *sa)
if(ytop>0) ytop= 0;
so->v2d.cur.ymax= ytop;
so->v2d.cur.ymin= ytop-(so->v2d.mask.ymax-so->v2d.mask.ymin);
+
+ /* make te->xs ==> te->xend center of view */
+ xdelta = te->xs - so->v2d.cur.xmin;
+ so->v2d.cur.xmin += xdelta;
+ so->v2d.cur.xmax += xdelta;
+
so->storeflag |= SO_TREESTORE_REDRAW;
scrarea_queue_redraw(sa);
}
@@ -2062,7 +2088,7 @@ void outliner_show_selected(struct ScrArea *sa)
{
SpaceOops *so= sa->spacedata.first;
TreeElement *te;
- int ytop;
+ int xdelta, ytop;
te= outliner_find_id(so, &so->tree, (ID *)OBACT);
if(te) {
@@ -2071,6 +2097,12 @@ void outliner_show_selected(struct ScrArea *sa)
if(ytop>0) ytop= 0;
so->v2d.cur.ymax= ytop;
so->v2d.cur.ymin= ytop-(so->v2d.mask.ymax-so->v2d.mask.ymin);
+
+ /* make te->xs ==> te->xend center of view */
+ xdelta = te->xs - so->v2d.cur.xmin;
+ so->v2d.cur.xmin += xdelta;
+ so->v2d.cur.xmax += xdelta;
+
so->storeflag |= SO_TREESTORE_REDRAW;
scrarea_queue_redraw(sa);
}
@@ -2149,7 +2181,7 @@ void outliner_find_panel(struct ScrArea *sa, int again, int flags)
TreeElement *te= NULL;
TreeElement *last_find;
TreeStoreElem *tselem;
- int ytop, prevFound=0;
+ int ytop, xdelta, prevFound=0;
char name[33];
/* get last found tree-element based on stored search_tse */
@@ -2196,6 +2228,11 @@ void outliner_find_panel(struct ScrArea *sa, int again, int flags)
soops->v2d.cur.ymax= ytop;
soops->v2d.cur.ymin= ytop-(soops->v2d.mask.ymax-soops->v2d.mask.ymin);
+ /* make te->xs ==> te->xend center of view */
+ xdelta = te->xs - soops->v2d.cur.xmin;
+ soops->v2d.cur.xmin += xdelta;
+ soops->v2d.cur.xmax += xdelta;
+
/* store selection */
soops->search_tse= *tselem;
@@ -2208,7 +2245,8 @@ void outliner_find_panel(struct ScrArea *sa, int again, int flags)
}
}
else {
- if (name) error("Not found: %s", name);
+ /* no tree-element found */
+ error("Not found: %s", name);
}
}
@@ -2501,7 +2539,7 @@ static void object_delete_cb(TreeElement *te, TreeStoreElem *tsep, TreeStoreElem
if(G.obedit==base->object) exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR);
if(base==BASACT) {
- G.f &= ~(G_VERTEXPAINT+G_FACESELECT+G_TEXTUREPAINT+G_WEIGHTPAINT);
+ G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT);
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
}
@@ -2646,7 +2684,7 @@ void outliner_operation_menu(ScrArea *sa)
//else pupmenu("Scene Operations%t|Delete");
}
else if(objectlevel) {
- short event= pupmenu("Select%x1|Deselect%x2|Delete%x4|Make Local%x5");
+ short event= pupmenu("Select%x1|Deselect%x2|Delete%x4"); /* make local: does not work... it doesn't set lib_extern flags... so data gets lost */
if(event>0) {
char *str="";
@@ -2666,7 +2704,7 @@ void outliner_operation_menu(ScrArea *sa)
DAG_scene_sort(G.scene);
str= "Delete Objects";
}
- else if(event==5) {
+ else if(event==5) { /* disabled, see above (ton) */
outliner_do_object_operation(soops, &soops->tree, id_local_cb);
str= "Localized Objects";
}
@@ -3174,7 +3212,7 @@ static void outliner_draw_selection(SpaceOops *soops, ListBase *lb, int *starty)
/* selection status */
if(tselem->flag & TSE_SELECTED) {
- glRecti(0, *starty+1, (int)soops->v2d.mask.xmax, *starty+OL_H-1);
+ glRecti(0, *starty+1, (int)soops->v2d.cur.xmax, *starty+OL_H-1);
}
*starty-= OL_H;
if((tselem->flag & TSE_CLOSED)==0) outliner_draw_selection(soops, &te->subtree, starty);
@@ -3225,7 +3263,7 @@ static void outliner_back(SpaceOops *soops)
ystart= OL_H*(ystart/(OL_H));
while(ystart > soops->v2d.cur.ymin) {
- glRecti(0, ystart, (int)soops->v2d.mask.xmax, ystart+OL_H);
+ glRecti(0, ystart, (int)soops->v2d.cur.xmax, ystart+OL_H);
ystart-= 2*OL_H;
}
}
@@ -3236,35 +3274,35 @@ static void outliner_draw_restrictcols(SpaceOops *soops)
/* background underneath */
BIF_ThemeColor(TH_BACK);
- glRecti((int)soops->v2d.mask.xmax-(OL_TOGW+SCROLLB), soops->v2d.cur.ymin, (int)soops->v2d.mask.xmax, soops->v2d.tot.ymax);
+ glRecti((int)soops->v2d.cur.xmax-OL_TOGW, soops->v2d.cur.ymin, (int)soops->v2d.cur.xmax, soops->v2d.cur.ymax);
BIF_ThemeColorShade(TH_BACK, 6);
ystart= soops->v2d.tot.ymax;
ystart= OL_H*(ystart/(OL_H));
while(ystart > soops->v2d.cur.ymin) {
- glRecti((int)soops->v2d.mask.xmax-(OL_TOGW+SCROLLB), ystart, (int)soops->v2d.mask.xmax, ystart+OL_H);
+ glRecti((int)soops->v2d.cur.xmax-OL_TOGW, ystart, (int)soops->v2d.cur.xmax, ystart+OL_H);
ystart-= 2*OL_H;
}
BIF_ThemeColorShadeAlpha(TH_BACK, -15, -200);
/* view */
- fdrawline(soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB),
- soops->v2d.tot.ymax,
- soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB),
+ fdrawline(soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX,
+ soops->v2d.cur.ymax,
+ soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX,
soops->v2d.cur.ymin);
/* render */
- fdrawline(soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB),
- soops->v2d.tot.ymax,
- soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB),
+ fdrawline(soops->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX,
+ soops->v2d.cur.ymax,
+ soops->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX,
soops->v2d.cur.ymin);
/* render */
- fdrawline(soops->v2d.mask.xmax-(OL_TOG_RESTRICT_RENDERX+SCROLLB),
- soops->v2d.tot.ymax,
- soops->v2d.mask.xmax-(OL_TOG_RESTRICT_RENDERX+SCROLLB),
+ fdrawline(soops->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX,
+ soops->v2d.cur.ymax,
+ soops->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX,
soops->v2d.cur.ymin);
}
@@ -3341,7 +3379,7 @@ static void namebutton_cb(void *tep, void *oldnamep)
if (te->idcode == ID_LI) {
char expanded[FILE_MAXDIR + FILE_MAXFILE];
BLI_strncpy(expanded, ((Library *)tselem->id)->name, FILE_MAXDIR + FILE_MAXFILE);
-
+ BLI_convertstringcode(expanded, G.sce, G.scene->r.cfra);
if (!BLI_exists(expanded)) {
error("This path does not exist, correct this before saving");
}
@@ -3419,12 +3457,76 @@ static void namebutton_cb(void *tep, void *oldnamep)
scrarea_queue_redraw(curarea);
}
+static void outliner_draw_restrictbuts(uiBlock *block, SpaceOops *soops, ListBase *lb)
+{
+ uiBut *bt;
+ TreeElement *te;
+ TreeStoreElem *tselem;
+ Object *ob;
+
+ for(te= lb->first; te; te= te->next) {
+ tselem= TREESTORE(te);
+ if(te->ys >= soops->v2d.cur.ymin && te->ys <= soops->v2d.cur.ymax) {
+ /* objects have toggle-able restriction flags */
+ if(tselem->type==0 && te->idcode==ID_OB) {
+ ob = (Object *)tselem->id;
+
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+ bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_VIEW, REDRAWALL, ICON_RESTRICT_VIEW_OFF,
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
+ uiButSetFunc(bt, restrictbutton_view_cb, ob, NULL);
+ uiButSetFlag(bt, UI_NO_HILITE);
+
+ bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_SELECT, REDRAWALL, ICON_RESTRICT_SELECT_OFF,
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
+ uiButSetFunc(bt, restrictbutton_sel_cb, ob, NULL);
+ uiButSetFlag(bt, UI_NO_HILITE);
+
+ bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_RENDER, REDRAWALL, ICON_RESTRICT_RENDER_OFF,
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_RENDERX, te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow renderability");
+ uiButSetFunc(bt, restrictbutton_rend_cb, NULL, NULL);
+ uiButSetFlag(bt, UI_NO_HILITE);
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+ /* scene render layers and passes have toggle-able flags too! */
+ else if(tselem->type==TSE_R_LAYER) {
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ bt= uiDefIconButBitI(block, ICONTOGN, SCE_LAY_DISABLE, REDRAWBUTSSCENE, ICON_CHECKBOX_HLT-1,
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer");
+ uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+ else if(tselem->type==TSE_R_PASS) {
+ int *layflag= te->directdata;
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ /* NOTE: tselem->nr is short! */
+ bt= uiDefIconButBitI(block, ICONTOG, tselem->nr, REDRAWBUTSSCENE, ICON_CHECKBOX_HLT-1,
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_VIEWX, te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass");
+ uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
+
+ layflag++; /* is lay_xor */
+ if(ELEM6(tselem->nr, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_RADIO))
+ bt= uiDefIconButBitI(block, TOG, tselem->nr, REDRAWBUTSSCENE, (*layflag & tselem->nr)?ICON_DOT:ICON_BLANK1,
+ (int)soops->v2d.cur.xmax-OL_TOG_RESTRICT_SELECTX, te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined");
+ uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
+
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+ }
+
+ if((tselem->flag & TSE_CLOSED)==0) outliner_draw_restrictbuts(block, soops, &te->subtree);
+ }
+}
+
static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
{
uiBut *bt;
TreeElement *te;
TreeStoreElem *tselem;
- Object *ob;
int dx, len;
for(te= lb->first; te; te= te->next) {
@@ -3451,59 +3553,6 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
/* otherwise keeps open on ESC */
tselem->flag &= ~TSE_TEXTBUT;
}
-
- if (!(soops->flag & SO_HIDE_RESTRICTCOLS)) {
-
- /* objects have toggle-able restriction flags */
- if(tselem->type==0 && te->idcode==ID_OB) {
- ob = (Object *)tselem->id;
-
- uiBlockSetEmboss(block, UI_EMBOSSN);
- bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_VIEW, REDRAWALL, ICON_RESTRICT_VIEW_OFF,
- (int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB), te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow visibility in the 3D View");
- uiButSetFunc(bt, restrictbutton_view_cb, ob, NULL);
- uiButSetFlag(bt, UI_NO_HILITE);
-
- bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_SELECT, REDRAWALL, ICON_RESTRICT_SELECT_OFF,
- (int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB), te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow selection in the 3D View");
- uiButSetFunc(bt, restrictbutton_sel_cb, ob, NULL);
- uiButSetFlag(bt, UI_NO_HILITE);
-
- bt= uiDefIconButBitS(block, ICONTOG, OB_RESTRICT_RENDER, REDRAWALL, ICON_RESTRICT_RENDER_OFF,
- (int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_RENDERX+SCROLLB), te->ys, 17, OL_H-1, &(ob->restrictflag), 0, 0, 0, 0, "Restrict/Allow renderability");
- uiButSetFunc(bt, restrictbutton_rend_cb, NULL, NULL);
- uiButSetFlag(bt, UI_NO_HILITE);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
- }
- /* scene render layers and passes have toggle-able flags too! */
- else if(tselem->type==TSE_R_LAYER) {
- uiBlockSetEmboss(block, UI_EMBOSSN);
-
- bt= uiDefIconButBitI(block, ICONTOGN, SCE_LAY_DISABLE, REDRAWBUTSSCENE, ICON_CHECKBOX_HLT-1,
- (int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB), te->ys, 17, OL_H-1, te->directdata, 0, 0, 0, 0, "Render this RenderLayer");
- uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
- }
- else if(tselem->type==TSE_R_PASS) {
- int *layflag= te->directdata;
- uiBlockSetEmboss(block, UI_EMBOSSN);
-
- /* NOTE: tselem->nr is short! */
- bt= uiDefIconButBitI(block, ICONTOG, tselem->nr, REDRAWBUTSSCENE, ICON_CHECKBOX_HLT-1,
- (int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_VIEWX+SCROLLB), te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Render this Pass");
- uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
-
- layflag++; /* is lay_xor */
- if(ELEM6(tselem->nr, SCE_PASS_SPEC, SCE_PASS_SHADOW, SCE_PASS_AO, SCE_PASS_REFLECT, SCE_PASS_REFRACT, SCE_PASS_RADIO))
- bt= uiDefIconButBitI(block, TOG, tselem->nr, REDRAWBUTSSCENE, (*layflag & tselem->nr)?ICON_DOT:ICON_BLANK1,
- (int)soops->v2d.mask.xmax-(OL_TOG_RESTRICT_SELECTX+SCROLLB), te->ys, 17, OL_H-1, layflag, 0, 0, 0, 0, "Exclude this Pass from Combined");
- uiButSetFunc(bt, restrictbutton_r_lay_cb, NULL, NULL);
-
- uiBlockSetEmboss(block, UI_EMBOSS);
- }
- }
}
if((tselem->flag & TSE_CLOSED)==0) outliner_buttons(block, soops, &te->subtree);
@@ -3513,11 +3562,18 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
void draw_outliner(ScrArea *sa, SpaceOops *soops)
{
uiBlock *block;
- int sizey;
+ int sizey, sizex;
short ofsx, ofsy;
- calc_scrollrcts(sa, G.v2d, sa->winx, sa->winy);
-
+ /* version patch for old outliners here - do_versions patch doesn't work */
+ if (G.v2d->scroll != L_SCROLL+B_SCROLLO) {
+ init_v2d_oops(curarea, soops);
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ calc_scrollrcts(sa, G.v2d, sa->winx, sa->winy);
+ }
+ else
+ calc_scrollrcts(sa, G.v2d, sa->winx, sa->winy);
+
if(sa->winx>SCROLLB+10 && sa->winy>SCROLLH+10) {
if(G.v2d->scroll) {
ofsx= sa->winrct.xmin; /* because mywin */
@@ -3528,12 +3584,21 @@ void draw_outliner(ScrArea *sa, SpaceOops *soops)
}
outliner_build_tree(soops); // always
- sizey= 0;
+ sizey = sizex = 0;
outliner_height(soops, &soops->tree, &sizey);
+ outliner_width(soops, &soops->tree, &sizex);
- /* we init all tot rect vars, only really needed on window size change tho */
+ /* we init all tot rect vars, only really needed on window size change though */
G.v2d->tot.xmin= 0.0;
G.v2d->tot.xmax= (G.v2d->mask.xmax-G.v2d->mask.xmin);
+ if(soops->flag & SO_HIDE_RESTRICTCOLS) {
+ if(G.v2d->tot.xmax <= sizex)
+ G.v2d->tot.xmax= 2*sizex;
+ }
+ else {
+ if(G.v2d->tot.xmax-OL_TOGW <= sizex)
+ G.v2d->tot.xmax= 2*sizex;
+ }
G.v2d->tot.ymax= 0.0;
G.v2d->tot.ymin= -sizey*OL_H;
test_view2d(G.v2d, sa->winx, sa->winy);
@@ -3546,20 +3611,26 @@ void draw_outliner(ScrArea *sa, SpaceOops *soops)
myortho2(G.v2d->cur.xmin-0.375, G.v2d->cur.xmax-0.375, G.v2d->cur.ymin-0.375, G.v2d->cur.ymax-0.375);
- /* draw outliner stuff */
+ /* draw outliner stuff (background and hierachy lines) */
outliner_back(soops);
outliner_draw_tree(soops);
- if (!(soops->flag & SO_HIDE_RESTRICTCOLS))
- outliner_draw_restrictcols(soops);
/* restore viewport */
mywinset(sa->win);
- /* ortho corrected */
- myortho2(G.v2d->cur.xmin-SCROLLB-0.375, G.v2d->cur.xmax-0.375, G.v2d->cur.ymin-0.375, G.v2d->cur.ymax-0.375);
+ /* ortho corrected - 'pixel space' */
+ myortho2(G.v2d->cur.xmin-SCROLLB-0.375, G.v2d->cur.xmax-0.375, G.v2d->cur.ymin-SCROLLH-0.375, G.v2d->cur.ymax-0.375);
+ /* draw icons and names */
block= uiNewBlock(&sa->uiblocks, "outliner buttons", UI_EMBOSS, UI_HELV, sa->win);
outliner_buttons(block, soops, &soops->tree);
+
+ /* draw restriction columns */
+ if (!(soops->flag & SO_HIDE_RESTRICTCOLS)) {
+ outliner_draw_restrictcols(soops);
+ outliner_draw_restrictbuts(block, soops, &soops->tree);
+ }
+
uiDrawBlock(block);
/* clear flag that allows quick redraws */
diff --git a/source/blender/src/parametrizer.c b/source/blender/src/parametrizer.c
index d70d25ecd31..f54bd22c79e 100644
--- a/source/blender/src/parametrizer.c
+++ b/source/blender/src/parametrizer.c
@@ -2213,7 +2213,7 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
nlBegin(NL_MATRIX);
for (i = 0; i < nvar; i++)
- nlRightHandSideAdd(i, sys->bInterior[i]);
+ nlRightHandSideAdd(0, i, sys->bInterior[i]);
for (f=chart->faces; f; f=f->nextlink) {
float wi1, wi2, wi3, b, si, beta[3], j2[3][3], W[3][3];
@@ -2259,8 +2259,8 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
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;
- nlRightHandSideAdd(v1->u.id, j2[0][0]*beta[0]);
- nlRightHandSideAdd(ninterior + v1->u.id, j2[1][0]*beta[1] + j2[2][0]*beta[2]);
+ nlRightHandSideAdd(0, v1->u.id, j2[0][0]*beta[0]);
+ nlRightHandSideAdd(0, ninterior + v1->u.id, j2[1][0]*beta[1] + j2[2][0]*beta[2]);
row1[0] = j2[0][0]*W[0][0];
row2[0] = j2[0][0]*W[1][0];
@@ -2279,8 +2279,8 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
sys->J2dt[e2->u.id][1] = j2[1][1] = 1.0*wi2;
sys->J2dt[e3->u.id][1] = j2[2][1] = p_abf_compute_sin_product(sys, v2, e3->u.id)*wi3;
- nlRightHandSideAdd(v2->u.id, j2[1][1]*beta[1]);
- nlRightHandSideAdd(ninterior + v2->u.id, j2[0][1]*beta[0] + j2[2][1]*beta[2]);
+ nlRightHandSideAdd(0, v2->u.id, j2[1][1]*beta[1]);
+ nlRightHandSideAdd(0, ninterior + v2->u.id, j2[0][1]*beta[0] + j2[2][1]*beta[2]);
row1[1] = j2[1][1]*W[0][1];
row2[1] = j2[1][1]*W[1][1];
@@ -2299,8 +2299,8 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
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;
- nlRightHandSideAdd(v3->u.id, j2[2][2]*beta[2]);
- nlRightHandSideAdd(ninterior + v3->u.id, j2[0][2]*beta[0] + j2[1][2]*beta[1]);
+ 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]);
row1[2] = j2[2][2]*W[0][2];
row2[2] = j2[2][2]*W[1][2];
@@ -2357,24 +2357,24 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
pre[0] = pre[1] = pre[2] = 0.0;
if (v1->flag & PVERT_INTERIOR) {
- float x = nlGetVariable(v1->u.id);
- float x2 = nlGetVariable(ninterior + v1->u.id);
+ float x = nlGetVariable(0, v1->u.id);
+ float x2 = nlGetVariable(0, ninterior + v1->u.id);
pre[0] += sys->J2dt[e1->u.id][0]*x;
pre[1] += sys->J2dt[e2->u.id][0]*x2;
pre[2] += sys->J2dt[e3->u.id][0]*x2;
}
if (v2->flag & PVERT_INTERIOR) {
- float x = nlGetVariable(v2->u.id);
- float x2 = nlGetVariable(ninterior + v2->u.id);
+ float x = nlGetVariable(0, v2->u.id);
+ float x2 = nlGetVariable(0, ninterior + v2->u.id);
pre[0] += sys->J2dt[e1->u.id][1]*x2;
pre[1] += sys->J2dt[e2->u.id][1]*x;
pre[2] += sys->J2dt[e3->u.id][1]*x2;
}
if (v3->flag & PVERT_INTERIOR) {
- float x = nlGetVariable(v3->u.id);
- float x2 = nlGetVariable(ninterior + v3->u.id);
+ float x = nlGetVariable(0, v3->u.id);
+ float x2 = nlGetVariable(0, ninterior + v3->u.id);
pre[0] += sys->J2dt[e1->u.id][2]*x2;
pre[1] += sys->J2dt[e2->u.id][2]*x2;
pre[2] += sys->J2dt[e3->u.id][2]*x;
@@ -2405,8 +2405,8 @@ static PBool p_abf_matrix_invert(PAbfSystem *sys, PChart *chart)
}
for (i = 0; i < ninterior; i++) {
- sys->lambdaPlanar[i] += nlGetVariable(i);
- sys->lambdaLength[i] += nlGetVariable(ninterior + i);
+ sys->lambdaPlanar[i] += nlGetVariable(0, i);
+ sys->lambdaLength[i] += nlGetVariable(0, ninterior + i);
}
}
@@ -2738,8 +2738,8 @@ static void p_chart_lscm_load_solution(PChart *chart)
PVert *v;
for (v=chart->verts; v; v=v->nextlink) {
- v->uv[0] = nlGetVariable(2*v->u.id);
- v->uv[1] = nlGetVariable(2*v->u.id + 1);
+ v->uv[0] = nlGetVariable(0, 2*v->u.id);
+ v->uv[1] = nlGetVariable(0, 2*v->u.id + 1);
}
}
@@ -2771,8 +2771,6 @@ static void p_chart_lscm_begin(PChart *chart, PBool live, PBool abf)
#endif
if (abf) {
- PBool p_chart_abf_solve(PChart *chart);
-
if (!p_chart_abf_solve(chart))
param_warning("ABF solving failed: falling back to LSCM.\n");
}
@@ -2798,6 +2796,7 @@ static void p_chart_lscm_begin(PChart *chart, PBool live, PBool abf)
nlNewContext();
nlSolverParameteri(NL_NB_VARIABLES, 2*chart->nverts);
+ nlSolverParameteri(NL_NB_ROWS, 2*chart->nfaces);
nlSolverParameteri(NL_LEAST_SQUARES, NL_TRUE);
chart->u.lscm.context = nlGetCurrent();
@@ -2809,6 +2808,7 @@ static PBool p_chart_lscm_solve(PChart *chart)
PVert *v, *pin1 = chart->u.lscm.pin1, *pin2 = chart->u.lscm.pin2;
PFace *f;
float *alpha = chart->u.lscm.abf_alpha;
+ int row;
nlMakeCurrent(chart->u.lscm.context);
@@ -2828,10 +2828,10 @@ static PBool p_chart_lscm_solve(PChart *chart)
nlLockVariable(2*pin2->u.id);
nlLockVariable(2*pin2->u.id + 1);
- nlSetVariable(2*pin1->u.id, pin1->uv[0]);
- nlSetVariable(2*pin1->u.id + 1, pin1->uv[1]);
- nlSetVariable(2*pin2->u.id, pin2->uv[0]);
- nlSetVariable(2*pin2->u.id + 1, pin2->uv[1]);
+ nlSetVariable(0, 2*pin1->u.id, pin1->uv[0]);
+ nlSetVariable(0, 2*pin1->u.id + 1, pin1->uv[1]);
+ nlSetVariable(0, 2*pin2->u.id, pin2->uv[0]);
+ nlSetVariable(0, 2*pin2->u.id + 1, pin2->uv[1]);
}
else {
/* set and lock the pins */
@@ -2840,8 +2840,8 @@ static PBool p_chart_lscm_solve(PChart *chart)
nlLockVariable(2*v->u.id);
nlLockVariable(2*v->u.id + 1);
- nlSetVariable(2*v->u.id, v->uv[0]);
- nlSetVariable(2*v->u.id + 1, v->uv[1]);
+ nlSetVariable(0, 2*v->u.id, v->uv[0]);
+ nlSetVariable(0, 2*v->u.id + 1, v->uv[1]);
}
}
}
@@ -2850,6 +2850,7 @@ static PBool p_chart_lscm_solve(PChart *chart)
nlBegin(NL_MATRIX);
+ row = 0;
for (f=chart->faces; f; f=f->nextlink) {
PEdge *e1 = f->edge, *e2 = e1->next, *e3 = e2->next;
PVert *v1 = e1->vert, *v2 = e2->vert, *v3 = e3->vert;
@@ -2872,9 +2873,6 @@ static PBool p_chart_lscm_solve(PChart *chart)
sinmax = MAX3(sina1, sina2, sina3);
/* shift vertices to find most stable order */
- #define SHIFT3(type, a, b, c) \
- { type tmp; tmp = a; a = c; c = b; b = tmp; }
-
if (sina3 != sinmax) {
SHIFT3(PVert*, v1, v2, v3);
SHIFT3(float, a1, a2, a3);
@@ -2892,6 +2890,7 @@ static PBool p_chart_lscm_solve(PChart *chart)
cosine = cos(a1)*ratio;
sine = sina1*ratio;
+#if 0
nlBegin(NL_ROW);
nlCoefficient(2*v1->u.id, cosine - 1.0);
nlCoefficient(2*v1->u.id+1, -sine);
@@ -2907,6 +2906,21 @@ static PBool p_chart_lscm_solve(PChart *chart)
nlCoefficient(2*v2->u.id+1, -cosine);
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+1, -sine);
+ nlMatrixAdd(row, 2*v2->u.id, -cosine);
+ nlMatrixAdd(row, 2*v2->u.id+1, sine);
+ nlMatrixAdd(row, 2*v3->u.id, 1.0);
+ row++;
+
+ nlMatrixAdd(row, 2*v1->u.id, sine);
+ nlMatrixAdd(row, 2*v1->u.id+1, cosine - 1.0);
+ nlMatrixAdd(row, 2*v2->u.id, -sine);
+ nlMatrixAdd(row, 2*v2->u.id+1, -cosine);
+ nlMatrixAdd(row, 2*v3->u.id+1, 1.0);
+ row++;
+#endif
}
nlEnd(NL_MATRIX);
diff --git a/source/blender/src/poseobject.c b/source/blender/src/poseobject.c
index 0b78601ab9b..68af3d7c64c 100644
--- a/source/blender/src/poseobject.c
+++ b/source/blender/src/poseobject.c
@@ -51,7 +51,6 @@
#include "BKE_constraint.h"
#include "BKE_deform.h"
#include "BKE_depsgraph.h"
-#include "BKE_DerivedMesh.h"
#include "BKE_displist.h"
#include "BKE_global.h"
#include "BKE_modifier.h"
@@ -66,7 +65,6 @@
#include "BIF_graphics.h"
#include "BIF_interface.h"
#include "BIF_poseobject.h"
-#include "BIF_meshtools.h"
#include "BIF_space.h"
#include "BIF_toolbox.h"
#include "BIF_screen.h"
@@ -115,7 +113,7 @@ void enter_posemode(void)
}
if (G.obedit) exit_editmode(EM_FREEDATA|EM_WAITCURSOR);
- G.f &= ~(G_VERTEXPAINT | G_FACESELECT | G_TEXTUREPAINT | G_WEIGHTPAINT);
+ G.f &= ~(G_VERTEXPAINT | G_TEXTUREPAINT | G_WEIGHTPAINT);
}
void set_pose_keys (Object *ob)
@@ -231,7 +229,7 @@ void pose_calculate_path(Object *ob)
int cfra;
int sfra, efra;
- if(ob==NULL || ob->pose==NULL)
+ if (ob==NULL || ob->pose==NULL)
return;
arm= ob->data;
@@ -240,14 +238,24 @@ void pose_calculate_path(Object *ob)
arm->pathsf = SFRA;
arm->pathef = EFRA;
}
+ if ((arm->pathbc == 0) || (arm->pathac == 0)) {
+ arm->pathbc = 15;
+ arm->pathac = 15;
+ }
if (arm->pathsize == 0) {
arm->pathsize = 1;
}
/* set frame values */
cfra= CFRA;
- sfra = arm->pathsf;
- efra = arm->pathef;
+ if (arm->pathflag & ARM_PATH_ACFRA) {
+ sfra = cfra - arm->pathbc;
+ efra = cfra + arm->pathac;
+ }
+ else {
+ sfra = arm->pathsf;
+ efra = arm->pathef;
+ }
if (efra<=sfra) return;
DAG_object_update_flags(G.scene, ob, screen_view3d_layers());
@@ -331,23 +339,30 @@ void pose_select_constraint_target(void)
bConstraint *con;
/* paranoia checks */
- if(!ob && !ob->pose) return;
- if(ob==G.obedit || (ob->flag & OB_POSEMODE)==0) return;
+ if (!ob && !ob->pose) return;
+ if (ob==G.obedit || (ob->flag & OB_POSEMODE)==0) return;
for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(arm->layer & pchan->bone->layer) {
- if(pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
-
- for(con= pchan->constraints.first; con; con= con->next) {
- char *subtarget;
- Object *target= get_constraint_target(con, &subtarget);
+ if (arm->layer & pchan->bone->layer) {
+ if (pchan->bone->flag & (BONE_ACTIVE|BONE_SELECTED)) {
+ for (con= pchan->constraints.first; con; con= con->next) {
+ bConstraintTypeInfo *cti= constraint_get_typeinfo(con);
+ ListBase targets = {NULL, NULL};
+ bConstraintTarget *ct;
- if(ob==target) {
- if(subtarget) {
- bPoseChannel *pchanc= get_pose_channel(ob->pose, subtarget);
- if(pchanc)
- pchanc->bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+ if (cti && cti->get_constraint_targets) {
+ cti->get_constraint_targets(con, &targets);
+
+ for (ct= targets.first; ct; ct= ct->next) {
+ if ((ct->tar == ob) && (ct->subtarget[0])) {
+ bPoseChannel *pchanc= get_pose_channel(ob->pose, ct->subtarget);
+ if(pchanc)
+ pchanc->bone->flag |= BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
+ }
}
+
+ if (cti->flush_constraint_targets)
+ cti->flush_constraint_targets(con, &targets, 1);
}
}
}
@@ -682,7 +697,7 @@ void paste_posebuf (int flip)
/* Safely merge all of the channels in this pose into
any existing pose */
- for (chan=g_posebuf->chanbase.first; chan; chan=chan->next){
+ for (chan=g_posebuf->chanbase.first; chan; chan=chan->next) {
if (chan->flag & POSE_KEY) {
BLI_strncpy(name, chan->name, sizeof(name));
if (flip)
@@ -691,7 +706,7 @@ void paste_posebuf (int flip)
/* only copy when channel exists, poses are not meant to add random channels to anymore */
pchan= get_pose_channel(ob->pose, name);
- if(pchan) {
+ if (pchan) {
/* only loc rot size */
/* only copies transform info for the pose */
VECCOPY(pchan->loc, chan->loc);
@@ -699,35 +714,44 @@ void paste_posebuf (int flip)
QUATCOPY(pchan->quat, chan->quat);
pchan->flag= chan->flag;
- if (flip){
+ if (flip) {
pchan->loc[0]*= -1;
-
+
QuatToEul(pchan->quat, eul);
eul[1]*= -1;
eul[2]*= -1;
EulToQuat(eul, pchan->quat);
}
-
- if (G.flags & G_RECORDKEYS){
+
+ if (G.flags & G_RECORDKEYS) {
ID *id= &ob->id;
-
+
/* Set keys on pose */
- if (chan->flag & POSE_ROT){
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z);
- insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W);
+ if (chan->flag & POSE_ROT) {
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_X, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Y, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_Z, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_QUAT_W, 0);
}
- if (chan->flag & POSE_SIZE){
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_X);
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Y);
- insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Z);
+ if (chan->flag & POSE_SIZE) {
+ insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_X, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Y, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_SIZE_Z, 0);
}
- if (chan->flag & POSE_LOC){
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X);
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y);
- insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z);
+ if (chan->flag & POSE_LOC) {
+ insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_X, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Y, 0);
+ insertkey(id, ID_PO, pchan->name, NULL, AC_LOC_Z, 0);
}
+
+ /* clear any unkeyed tags */
+ if (chan->bone)
+ chan->bone->flag &= ~BONE_UNKEYED;
+ }
+ else {
+ /* add unkeyed tags */
+ if (chan->bone)
+ chan->bone->flag |= BONE_UNKEYED;
}
}
}
@@ -754,114 +778,29 @@ void paste_posebuf (int flip)
/* ********************************************** */
-struct vgroup_map {
- float head[3], tail[3];
- Bone *bone;
- bDeformGroup *dg, *dgflip;
- Object *meshobj;
-};
-
-static void pose_adds_vgroups__mapFunc(void *userData, int index, float *co, float *no_f, short *no_s)
-{
- struct vgroup_map *map= userData;
- float vec[3], fac;
-
- VECCOPY(vec, co);
- Mat4MulVecfl(map->meshobj->obmat, vec);
-
- /* get the distance-factor from the vertex to bone */
- fac= distfactor_to_bone (vec, map->head, map->tail, map->bone->rad_head, map->bone->rad_tail, map->bone->dist);
-
- /* add to vgroup. this call also makes me->dverts */
- if(fac!=0.0f)
- add_vert_to_defgroup (map->meshobj, map->dg, index, fac, WEIGHT_REPLACE);
- else
- remove_vert_defgroup (map->meshobj, map->dg, index);
-
- if(map->dgflip) {
- int j= mesh_get_x_mirror_vert(map->meshobj, index);
- if(j>=0) {
- if(fac!=0.0f)
- add_vert_to_defgroup (map->meshobj, map->dgflip, j, fac, WEIGHT_REPLACE);
- else
- remove_vert_defgroup (map->meshobj, map->dgflip, j);
- }
- }
-}
-
/* context weightpaint and deformer in posemode */
-void pose_adds_vgroups(Object *meshobj)
+void pose_adds_vgroups(Object *meshobj, int heatweights)
{
extern VPaint Gwp; /* from vpaint */
- struct vgroup_map map;
- DerivedMesh *dm;
Object *poseobj= modifiers_isDeformedByArmature(meshobj);
- bArmature *arm= poseobj->data;
- bPoseChannel *pchan;
- Bone *bone;
- bDeformGroup *dg, *curdef;
-
- if(poseobj==NULL || (poseobj->flag & OB_POSEMODE)==0) return;
-
- dm = mesh_get_derived_final(meshobj, CD_MASK_BAREMESH);
-
- map.meshobj= meshobj;
-
- for(pchan= poseobj->pose->chanbase.first; pchan; pchan= pchan->next) {
- bone= pchan->bone;
- if(arm->layer & pchan->bone->layer) {
- if(bone->flag & (BONE_SELECTED)) {
-
- /* check if mesh has vgroups */
- dg= get_named_vertexgroup(meshobj, bone->name);
- if(dg==NULL)
- dg= add_defgroup_name(meshobj, bone->name);
-
- /* flipped bone */
- if(Gwp.flag & VP_MIRROR_X) {
- char name[32];
-
- BLI_strncpy(name, dg->name, 32);
- bone_flip_name(name, 0); // 0 = don't strip off number extensions
-
- for (curdef = meshobj->defbase.first; curdef; curdef=curdef->next)
- if (!strcmp(curdef->name, name))
- break;
- map.dgflip= curdef;
- }
- else map.dgflip= NULL;
-
- /* get the root of the bone in global coords */
- VECCOPY(map.head, bone->arm_head);
- Mat4MulVecfl(poseobj->obmat, map.head);
-
- /* get the tip of the bone in global coords */
- VECCOPY(map.tail, bone->arm_tail);
- Mat4MulVecfl(poseobj->obmat, map.tail);
-
- /* use the optimal vertices instead of mverts */
- map.dg= dg;
- map.bone= bone;
- if(dm->foreachMappedVert)
- dm->foreachMappedVert(dm, pose_adds_vgroups__mapFunc, (void*) &map);
- else {
- Mesh *me= meshobj->data;
- int i;
- for(i=0; i<me->totvert; i++)
- pose_adds_vgroups__mapFunc(&map, i, (me->mvert+i)->co, NULL, NULL);
- }
-
- }
- }
+
+ if(poseobj==NULL || (poseobj->flag & OB_POSEMODE)==0) {
+ error("The active object must have a deforming armature in pose mode");
+ return;
}
-
- dm->release(dm);
+
+ add_verts_to_dgroups(meshobj, poseobj, heatweights, (Gwp.flag & VP_MIRROR_X));
+
+ if(heatweights)
+ BIF_undo_push("Apply Bone Heat Weights to Vertex Groups");
+ else
+ BIF_undo_push("Apply Bone Envelopes to Vertex Groups");
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWBUTSEDIT, 0);
- DAG_object_flush_update(G.scene, meshobj, OB_RECALC_DATA); // and all its relations
-
+ // and all its relations
+ DAG_object_flush_update(G.scene, meshobj, OB_RECALC_DATA);
}
/* ********************************************** */
@@ -950,20 +889,23 @@ void pose_activate_flipped_bone(void)
}
}
-
+/* This function pops up the move-to-layer popup widgets when the user
+ * presses either SHIFT-MKEY or MKEY in PoseMode OR EditMode (for Armatures)
+ */
void pose_movetolayer(void)
{
Object *ob= OBACT;
bArmature *arm;
short lay= 0;
- if(ob==NULL) return;
+ if (ob==NULL) return;
arm= ob->data;
- if(G.qual & LR_SHIFTKEY) {
+ if (G.qual & LR_SHIFTKEY) {
+ /* armature layers */
lay= arm->layer;
- if( movetolayer_short_buts(&lay, "Armature Layers")==0 ) return;
- if(lay==0) return;
+ if ( movetolayer_short_buts(&lay, "Armature Layers")==0 ) return;
+ if (lay==0) return;
arm->layer= lay;
if(ob->pose)
ob->pose->proxy_layer= lay;
@@ -971,33 +913,66 @@ void pose_movetolayer(void)
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWBUTSEDIT, 0);
+ }
+ else if (G.obedit) {
+ /* the check for editbone layer moving needs to occur before posemode one to work */
+ EditBone *ebo;
+ EditBone *flipBone;
+
+ for (ebo= G.edbo.first; ebo; ebo= ebo->next) {
+ if (arm->layer & ebo->layer) {
+ if (ebo->flag & BONE_SELECTED)
+ lay |= ebo->layer;
+ }
+ }
+ if (lay==0) return;
+
+ if ( movetolayer_short_buts(&lay, "Bone Layers")==0 ) return;
+ if (lay==0) return;
+
+ for (ebo= G.edbo.first; ebo; ebo= ebo->next) {
+ if (arm->layer & ebo->layer) {
+ if (ebo->flag & BONE_SELECTED) {
+ ebo->layer= lay;
+ if (arm->flag & ARM_MIRROR_EDIT) {
+ flipBone = armature_bone_get_mirrored(ebo);
+ if (flipBone)
+ flipBone->layer = lay;
+ }
+ }
+ }
+ }
+ BIF_undo_push("Move Bone Layer");
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWBUTSEDIT, 0);
}
- else if(ob->flag & OB_POSEMODE) {
+ else if (ob->flag & OB_POSEMODE) {
+ /* pose-channel layers */
bPoseChannel *pchan;
- if(pose_has_protected_selected(ob, 0))
+ if (pose_has_protected_selected(ob, 0))
return;
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(arm->layer & pchan->bone->layer) {
- if(pchan->bone->flag & BONE_SELECTED)
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (arm->layer & pchan->bone->layer) {
+ if (pchan->bone->flag & BONE_SELECTED)
lay |= pchan->bone->layer;
}
}
- if(lay==0) return;
+ if (lay==0) return;
- if( movetolayer_short_buts(&lay, "Bone Layers")==0 ) return;
- if(lay==0) return;
-
- for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
- if(arm->layer & pchan->bone->layer) {
- if(pchan->bone->flag & BONE_SELECTED)
+ if ( movetolayer_short_buts(&lay, "Bone Layers")==0 ) return;
+ if (lay==0) return;
+
+ for (pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next) {
+ if (arm->layer & pchan->bone->layer) {
+ if (pchan->bone->flag & BONE_SELECTED)
pchan->bone->layer= lay;
}
}
- BIF_undo_push("Move Bone layer");
+ BIF_undo_push("Move Bone Layer");
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWBUTSEDIT, 0);
diff --git a/source/blender/src/preview.blend.c b/source/blender/src/preview.blend.c
index b88d16c5699..945fbd9a962 100644
--- a/source/blender/src/preview.blend.c
+++ b/source/blender/src/preview.blend.c
@@ -1,1934 +1,4620 @@
/* DataToC output of file <preview_blend> */
-int datatoc_preview_blend_size= 459544;
+int datatoc_preview_blend_size= 444636;
char datatoc_preview_blend[]= {
- 66, 76, 69, 78, 68, 69, 82, 95, 86, 50, 52, 50, 82, 69, 78, 68, 0, 0, 0, 32,191,255,236,148,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 20,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 0, 0, 0, 32,191,255,235,240, 0, 0, 0,139, 0, 0, 0, 1, 32, 32, 32, 52,
- 0, 4, 0, 0, 0,240, 0, 0, 0, 1, 1, 0, 2,236, 30,176, 5, 30,236, 32, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 83, 82,
- 0, 0, 0,120, 2,236, 30,176, 0, 0, 0,134, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 83, 82,115, 99,114,101,101,110, 0, 45, 83, 99,114,105,112,116,105,110,103, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2,235, 18,144, 2,236, 32, 16, 2,236, 32, 80, 2,236, 34,208, 2,236, 35, 16, 2,236,136,160, 5, 30,236, 32,
- 0, 0, 4,198, 0, 49, 3, 84, 4,199, 3, 36, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 2,235, 18,144, 0, 0, 0,135, 0, 0, 0, 1, 2,235,137,224,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 2,235,137,224, 0, 0, 0,135,
- 0, 0, 0, 1, 2,235, 63,144, 2,235, 18,144, 0, 0, 0, 0, 0, 0, 3, 36, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20,
- 2,235, 63,144, 0, 0, 0,135, 0, 0, 0, 1, 2,228,196,160, 2,235,137,224, 0, 0, 0, 0, 4,199, 3, 36, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 20, 2,228,196,160, 0, 0, 0,135, 0, 0, 0, 1, 2,236, 31, 80, 2,235, 63,144, 0, 0, 0, 0,
- 4,199, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 20, 2,236, 31, 80, 0, 0, 0,135, 0, 0, 0, 1, 2,236, 31,144,
- 2,228,196,160, 0, 0, 0, 0, 0, 0, 3, 10, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20, 2,236, 31,144, 0, 0, 0,135,
- 0, 0, 0, 1, 2,236, 31,208, 2,236, 31, 80, 0, 0, 0, 0, 4,199, 3, 10, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 20,
- 2,236, 31,208, 0, 0, 0,135, 0, 0, 0, 1, 2,236, 32, 16, 2,236, 31,144, 0, 0, 0, 0, 3,208, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 20, 2,236, 32, 16, 0, 0, 0,135, 0, 0, 0, 1, 0, 0, 0, 0, 2,236, 31,208, 0, 0, 0, 0,
- 3,208, 3, 10, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 0, 24, 2,236, 32, 80, 0, 0, 0,136, 0, 0, 0, 1, 2,236, 32,144,
- 0, 0, 0, 0, 2,235, 63,144, 2,235,137,224, 0, 1, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236, 32,144,
- 0, 0, 0,136, 0, 0, 0, 1, 2,236, 32,208, 2,236, 32, 80, 2,235,137,224, 2,236, 31, 80, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 2,236, 32,208, 0, 0, 0,136, 0, 0, 0, 1, 2,236, 33, 16, 2,236, 32,144, 2,235, 63,144,
- 2,236, 31,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236, 33, 16, 0, 0, 0,136, 0, 0, 0, 1,
- 2,236, 33, 80, 2,236, 32,208, 2,236, 31, 80, 2,236, 31,144, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 2,236, 33, 80, 0, 0, 0,136, 0, 0, 0, 1, 2,236, 33,144, 2,236, 33, 16, 2,228,196,160, 2,236, 31,208, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236, 33,144, 0, 0, 0,136, 0, 0, 0, 1, 2,236, 33,208, 2,236, 33, 80,
- 2,236, 31,144, 2,236, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236, 33,208, 0, 0, 0,136,
- 0, 0, 0, 1, 2,236, 34, 16, 2,236, 33,144, 2,236, 31,208, 2,236, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 24, 2,236, 34, 16, 0, 0, 0,136, 0, 0, 0, 1, 2,236, 34, 80, 2,236, 33,208, 2,228,196,160, 2,236, 31,144,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236, 34, 80, 0, 0, 0,136, 0, 0, 0, 1, 2,236, 34,144,
- 2,236, 34, 16, 2,235, 18,144, 2,236, 31, 80, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236, 34,144,
- 0, 0, 0,136, 0, 0, 0, 1, 2,236, 34,208, 2,236, 34, 80, 2,236, 31, 80, 2,236, 32, 16, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 2,236, 34,208, 0, 0, 0,136, 0, 0, 0, 1, 0, 0, 0, 0, 2,236, 34,144, 2,235, 18,144,
- 2,236, 31,208, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,204, 2,236, 35, 16, 0, 0, 0,138, 0, 0, 0, 1,
- 2,236, 79,160, 0, 0, 0, 0, 2,236, 31, 80, 2,235,137,224, 2,235, 63,144, 2,236, 31,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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,199, 0, 0, 3, 11, 0, 0, 3, 36, 0, 0, 0, 0, 0, 0, 4,199, 0, 0, 3, 11, 0, 0, 3, 37, 0, 0, 0, 0,
- 0, 0, 4,199, 0, 0, 3, 36, 0, 0, 3, 36, 0, 5, 0, 4, 0, 1, 7, 7, 4,200, 0, 1, 1, 0, 1, 0, 2,189, 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, 2,237, 23,112,
- 2,237, 23,112, 2,236, 36, 16, 2,236, 78,144, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 36, 16, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 37, 32, 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,
+ 66, 76, 69, 78, 68, 69, 82, 45,118, 50, 52, 53, 82, 69, 78, 68, 32, 0, 0, 0, 80, 67,123,102,255,127, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0,112,114,101,118,105,101,119, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 71, 76, 79, 66, 40, 0, 0, 0, 80, 67,123,102,255,127, 0, 0,150, 0, 0, 0, 1, 0, 0, 0,
+ 32, 32, 32, 56, 8, 0, 0, 0,240, 0, 0, 0, 1, 0, 0, 1, 64, 39,115, 1, 0, 0, 0, 0,128,199,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 64, 0, 0, 0, 83, 82, 0, 0,168, 0, 0, 0, 64, 39,115, 1, 0, 0, 0, 0,145, 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, 82,115, 99,114,101,101,110, 0, 45, 83, 99,114,105,112,116,105,110,103, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 48, 40,115, 1, 0, 0, 0, 0,208, 42,115, 1, 0, 0, 0, 0, 48, 43,115, 1, 0, 0, 0, 0,
+144, 47,115, 1, 0, 0, 0, 0, 0, 48,115, 1, 0, 0, 0, 0,192,167,115, 1, 0, 0, 0, 0,128,199,115, 1, 0, 0, 0, 0,
+ 0, 0,127, 7, 25, 0,125, 4,128, 7,101, 4, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 8, 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, 48, 40,115, 1, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,
+144, 40,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 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,144, 40,115, 1, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,240, 40,115, 1, 0, 0, 0, 0,
+ 48, 40,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,101, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+240, 40,115, 1, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0, 80, 41,115, 1, 0, 0, 0, 0,144, 40,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,128, 7,101, 4, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0, 80, 41,115, 1, 0, 0, 0, 0,
+146, 0, 0, 0, 1, 0, 0, 0,176, 41,115, 1, 0, 0, 0, 0,240, 40,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+128, 7, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,176, 41,115, 1, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,
+ 16, 42,115, 1, 0, 0, 0, 0, 80, 41,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 4, 1, 0, 0, 0,
+ 68, 65, 84, 65, 32, 0, 0, 0, 16, 42,115, 1, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,112, 42,115, 1, 0, 0, 0, 0,
+176, 41,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 7, 68, 4, 1, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,
+112, 42,115, 1, 0, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0,208, 42,115, 1, 0, 0, 0, 0, 16, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,252, 5, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 32, 0, 0, 0,208, 42,115, 1, 0, 0, 0, 0,
+146, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112, 42,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+252, 5, 68, 4, 1, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 48, 43,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+160, 43,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 40,115, 1, 0, 0, 0, 0,240, 40,115, 1, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,160, 43,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+ 16, 44,115, 1, 0, 0, 0, 0, 48, 43,115, 1, 0, 0, 0, 0,144, 40,115, 1, 0, 0, 0, 0,176, 41,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 16, 44,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+128, 44,115, 1, 0, 0, 0, 0,160, 43,115, 1, 0, 0, 0, 0,240, 40,115, 1, 0, 0, 0, 0, 16, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,128, 44,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+240, 44,115, 1, 0, 0, 0, 0, 16, 44,115, 1, 0, 0, 0, 0,176, 41,115, 1, 0, 0, 0, 0, 16, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,240, 44,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+ 96, 45,115, 1, 0, 0, 0, 0,128, 44,115, 1, 0, 0, 0, 0, 80, 41,115, 1, 0, 0, 0, 0,112, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 96, 45,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+208, 45,115, 1, 0, 0, 0, 0,240, 44,115, 1, 0, 0, 0, 0, 16, 42,115, 1, 0, 0, 0, 0,208, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,208, 45,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+ 64, 46,115, 1, 0, 0, 0, 0, 96, 45,115, 1, 0, 0, 0, 0,112, 42,115, 1, 0, 0, 0, 0,208, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64, 46,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+176, 46,115, 1, 0, 0, 0, 0,208, 45,115, 1, 0, 0, 0, 0, 80, 41,115, 1, 0, 0, 0, 0, 16, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,176, 46,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+ 32, 47,115, 1, 0, 0, 0, 0, 64, 46,115, 1, 0, 0, 0, 0, 48, 40,115, 1, 0, 0, 0, 0,176, 41,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 32, 47,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+144, 47,115, 1, 0, 0, 0, 0,176, 46,115, 1, 0, 0, 0, 0,176, 41,115, 1, 0, 0, 0, 0,208, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,144, 47,115, 1, 0, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32, 47,115, 1, 0, 0, 0, 0, 48, 40,115, 1, 0, 0, 0, 0,112, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 0, 48,115, 1, 0, 0, 0, 0,149, 0, 0, 0, 1, 0, 0, 0,
+ 0, 98,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 41,115, 1, 0, 0, 0, 0,144, 40,115, 1, 0, 0, 0, 0,
+240, 40,115, 1, 0, 0, 0, 0, 16, 42,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 7, 0, 0,
+ 69, 4, 0, 0,101, 4, 0, 0, 0, 0, 0, 0,128, 7, 0, 0, 69, 4, 0, 0, 95, 4, 0, 0, 0, 0, 0, 0,128, 7, 0, 0,
+ 96, 4, 0, 0,101, 4, 0, 0, 5, 0, 4, 0, 1, 0, 7, 7,129, 7, 6, 0, 1, 0, 1, 0,189, 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, 32, 52, 88, 1, 0, 0, 0, 0,160,144,104, 1, 0, 0, 0, 0, 80, 49,115, 1, 0, 0, 0, 0,
+208, 96,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 80, 49,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+128, 50,115, 1, 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,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 37, 32, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 38, 48, 2,236, 36, 16,
- 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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,128, 50,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,176, 51,115, 1, 0, 0, 0, 0, 80, 49,115, 1, 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, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 1, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+176, 51,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,224, 52,115, 1, 0, 0, 0, 0,128, 50,115, 1, 0, 0, 0, 0,
+ 65,110,105,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,
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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 38, 48, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 39, 64, 2,236, 37, 32, 65,110,105,109, 0, 0, 0, 0,
+140, 2, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,224, 52,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 16, 54,115, 1, 0, 0, 0, 0,
+176, 51,115, 1, 0, 0, 0, 0, 70,111,114,109, 97,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, 0, 0, 0, 0, 0, 0, 82,101,110,100,101,114, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,140, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 39, 64,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 40, 80, 2,236, 38, 48, 70,111,114,109, 97,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,210, 3, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 16, 54,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 64, 55,115, 1, 0, 0, 0, 0,224, 52,115, 1, 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, 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, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 40, 80, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 41, 96, 2,236, 39, 64, 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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 64, 55,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,112, 56,115, 1, 0, 0, 0, 0, 16, 54,115, 1, 0, 0, 0, 0, 76, 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, 76, 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, 76, 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, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 41, 96, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 42,112, 2,236, 40, 80,
- 76, 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, 70, 1, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+112, 56,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,160, 57,115, 1, 0, 0, 0, 0, 64, 55,115, 1, 0, 0, 0, 0,
+ 83,104, 97,100,111,119, 32, 97,110,100, 32, 83,112,111,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,
76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 42,112, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 43,128, 2,236, 41, 96, 83,104, 97,100,111,119, 32, 97,
-110,100, 32, 83,112,111,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, 76, 97,109,112, 0, 0, 0, 0,
+140, 2, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,160, 57,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,208, 58,115, 1, 0, 0, 0, 0,
+112, 56,115, 1, 0, 0, 0, 0, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,140, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 43,128,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 44,144, 2,236, 42,112, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 0, 0, 0,210, 3, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,208, 58,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 0, 60,115, 1, 0, 0, 0, 0,160, 57,115, 1, 0, 0, 0, 0, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 44,144, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 45,160, 2,236, 43,128, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 3, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,160, 57,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 0, 60,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 48, 61,115, 1, 0, 0, 0, 0,208, 58,115, 1, 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, 76, 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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236, 43,128, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 45,160, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 46,176, 2,236, 44,144,
- 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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+ 48, 61,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 96, 62,115, 1, 0, 0, 0, 0, 0, 60,115, 1, 0, 0, 0, 0,
+ 76,105,110,107,115, 32, 97,110,100, 32, 80,105,112,101,108,105,110,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,
77, 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,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 46,176, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 47,192, 2,236, 45,160, 76,105,110,107,115, 32, 97,110,
-100, 32, 80,105,112,101,108,105,110,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, 77, 97,116,101,114,105, 97,108,
+ 70, 1, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0, 96, 62,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,144, 63,115, 1, 0, 0, 0, 0,
+ 48, 61,115, 1, 0, 0, 0, 0, 77, 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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 70, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 47,192,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 48,208, 2,236, 46,176, 77, 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,140, 2, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,144, 63,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+192, 64,115, 1, 0, 0, 0, 0, 96, 62,115, 1, 0, 0, 0, 0, 82, 97,109,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, 0, 0, 0, 0, 0, 0, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 48,208, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 49,224, 2,236, 47,192, 82, 97,109,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,140, 2, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96, 62,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,192, 64,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,240, 65,115, 1, 0, 0, 0, 0,144, 63,115, 1, 0, 0, 0, 0, 83,104, 97,100,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, 77, 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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236, 47,192, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 49,224, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 50,240, 2,236, 48,208,
- 83,104, 97,100,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,210, 3, 0, 0, 62, 1,204, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 65,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+240, 65,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 32, 67,115, 1, 0, 0, 0, 0,192, 64,115, 1, 0, 0, 0, 0,
+ 77,105,114,114,111,114, 32, 84,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,
77, 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,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236, 50,240, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 50,240, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 52, 0, 2,236, 49,224, 77,105,114,114,111,114, 32, 84,
-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, 77, 97,116,101,114,105, 97,108,
+210, 3, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0, 32, 67,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 80, 68,115, 1, 0, 0, 0, 0,
+240, 65,115, 1, 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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,210, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 52, 0,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 53, 16, 2,236, 50,240, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 5, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 80, 68,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+128, 69,115, 1, 0, 0, 0, 0, 32, 67,115, 1, 0, 0, 0, 0, 77, 97,112, 32, 73,110,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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 53, 16, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 54, 32, 2,236, 52, 0, 77, 97,112, 32, 73,110,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, 24, 5, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32, 67,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,128, 69,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,176, 70,115, 1, 0, 0, 0, 0, 80, 68,115, 1, 0, 0, 0, 0, 77, 97,112, 32, 84,111, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236, 52, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 54, 32, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 55, 48, 2,236, 53, 16,
- 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 5, 0, 0, 62, 1,204, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 67,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+176, 70,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,224, 71,115, 1, 0, 0, 0, 0,128, 69,115, 1, 0, 0, 0, 0,
+ 76,105,110,107, 32, 97,110,100, 32, 77, 97,116,101,114,105, 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,
- 77, 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,
+ 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236, 52, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 55, 48, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 56, 64, 2,236, 54, 32, 76,105,110,107, 32, 97,110,100,
- 32, 77, 97,116,101,114,105, 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, 69,100,105,116,105,110,103, 0,
+ 0, 0, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,224, 71,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 16, 73,115, 1, 0, 0, 0, 0,
+176, 70,115, 1, 0, 0, 0, 0, 77,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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 56, 64,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 57, 80, 2,236, 55, 48, 77,101,115,104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 70, 1, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 16, 73,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 64, 74,115, 1, 0, 0, 0, 0,224, 71,115, 1, 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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 57, 80, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 58, 96, 2,236, 56, 64, 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,140, 2, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 64, 74,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,112, 75,115, 1, 0, 0, 0, 0, 16, 73,115, 1, 0, 0, 0, 0, 83,104, 97,112,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, 69,100,105,116,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, 69,100,105,116,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, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 58, 96, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 59,112, 2,236, 57, 80,
- 83,104, 97,112,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,140, 2, 0, 0, 62, 1,204, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 73,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+112, 75,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,160, 76,115, 1, 0, 0, 0, 0, 64, 74,115, 1, 0, 0, 0, 0,
+ 77,101,115,104, 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,
69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236, 57, 80, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 59,112, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 60,128, 2,236, 58, 96, 77,101,115,104, 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, 69,100,105,116,105,110,103, 0,
+210, 3, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,160, 76,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,208, 77,115, 1, 0, 0, 0, 0,
+112, 75,115, 1, 0, 0, 0, 0, 77,101,115,104, 32, 84,111,111,108,115, 32, 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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,210, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 60,128,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 61,144, 2,236, 59,112, 77,101,115,104, 32, 84,111,111,108,115, 32, 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, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 24, 5, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,208, 77,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 0, 79,115, 1, 0, 0, 0, 0,160, 76,115, 1, 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, 87,111,114,108,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, 5, 24, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 61,144, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 62,160, 2,236, 60,128, 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, 87,111,114,108,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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 0, 79,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 48, 80,115, 1, 0, 0, 0, 0,208, 77,115, 1, 0, 0, 0, 0, 87,111,114,108,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, 87,111,114,108,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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 62,160, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 63,176, 2,236, 61,144,
- 87,111,114,108,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, 70, 1, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+ 48, 80,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 96, 81,115, 1, 0, 0, 0, 0, 0, 79,115, 1, 0, 0, 0, 0,
+ 77,105,115,116, 32, 47, 32, 83,116, 97,114,115, 32, 47, 32, 80,104,121,115,105, 99,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,
87,111,114,108,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,
- 1, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 63,176, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 64,192, 2,236, 62,160, 77,105,115,116, 32, 47, 32, 83,
-116, 97,114,115, 32, 47, 32, 80,104,121,115,105, 99,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, 87,111,114,108,100, 0, 0, 0,
+140, 2, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0, 96, 81,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,144, 82,115, 1, 0, 0, 0, 0,
+ 48, 80,115, 1, 0, 0, 0, 0, 65,109, 98, 32, 79, 99, 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, 87,111,114,108,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, 2,140, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 64,192,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 65,208, 2,236, 63,176, 65,109, 98, 32, 79, 99, 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,140, 2, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 48, 80,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,144, 82,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+192, 83,115, 1, 0, 0, 0, 0, 96, 81,115, 1, 0, 0, 0, 0, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 87,111,114,108,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, 2,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2,236, 63,176, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 65,208, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 66,224, 2,236, 64,192, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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,210, 3, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,192, 83,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,240, 84,115, 1, 0, 0, 0, 0,144, 82,115, 1, 0, 0, 0, 0, 77, 97,112, 32, 84,111, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114,108,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, 87,111,114,108,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, 3,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 66,224, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 67,240, 2,236, 65,208,
- 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,210, 3, 0, 0, 62, 1,204, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 82,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+240, 84,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 32, 86,115, 1, 0, 0, 0, 0,192, 83,115, 1, 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,
- 87,111,114,108,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,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236, 65,208, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 67,240, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 69, 0, 2,236, 66,224, 80,114,101,118,105,101,119, 0,
+ 0, 0, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0, 32, 86,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 80, 87,115, 1, 0, 0, 0, 0,
+240, 84,115, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 69, 0,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 70, 16, 2,236, 67,240, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 70, 1, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 80, 87,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+128, 88,115, 1, 0, 0, 0, 0, 32, 86,115, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 70, 16, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 71, 32, 2,236, 69, 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, 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, 70, 1, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 32, 86,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,128, 88,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,176, 89,115, 1, 0, 0, 0, 0, 80, 87,115, 1, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 97,
+110,100, 32, 76,105,110,107,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, 79, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236, 69, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 71, 32, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 72, 48, 2,236, 70, 16,
- 79, 98,106,101, 99,116, 32, 97,110,100, 32, 76,105,110,107,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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+176, 89,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,224, 90,115, 1, 0, 0, 0, 0,128, 88,115, 1, 0, 0, 0, 0,
+ 65,110,105,109, 32,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, 0, 0, 0,
79, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 72, 48, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 73, 64, 2,236, 71, 32, 65,110,105,109, 32,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, 0, 0, 0, 79, 98,106,101, 99,116, 0, 0,
+ 70, 1, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,224, 90,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 16, 92,115, 1, 0, 0, 0, 0,
+176, 89,115, 1, 0, 0, 0, 0, 68,114, 97,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, 79, 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, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 70, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 73, 64,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 74, 80, 2,236, 72, 48, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,140, 2, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 16, 92,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 64, 93,115, 1, 0, 0, 0, 0,224, 90,115, 1, 0, 0, 0, 0, 67,111,110,115,116,114, 97,105,110,116,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, 79, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 74, 80, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 75, 96, 2,236, 73, 64, 67,111,110,115,116,114, 97,105,110,116,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,210, 3, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 64, 93,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,112, 94,115, 1, 0, 0, 0, 0, 16, 92,115, 1, 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, 79, 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, 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, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,210, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 75, 96, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 76,112, 2,236, 74, 80,
- 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, 0, 0, 0, 0, 0, 0,140, 2, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+112, 94,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,160, 95,115, 1, 0, 0, 0, 0, 64, 93,115, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 76,112, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 77,128, 2,236, 75, 96, 83,116,117, 99, 99,105, 0, 0,
+140, 2, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,160, 95,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,208, 96,115, 1, 0, 0, 0, 0,
+112, 94,115, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,140, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 77,128,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 78,144, 2,236, 76,112, 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, 84,101,120,116,117,114,101, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,140, 2, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,208, 96,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,160, 95,115, 1, 0, 0, 0, 0, 82,101,110,100,101,114, 32, 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, 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, 0, 0, 0, 0, 0, 0, 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,140, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 78,144, 0, 0, 0,137, 0, 0, 0, 1,
- 0, 0, 0, 0, 2,236, 77,128, 82,101,110,100,101,114, 32, 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, 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80, 49,115, 1, 0, 0, 0, 0, 68, 65, 84, 65, 8, 1, 0, 0, 0, 98,115, 1, 0, 0, 0, 0,
+149, 0, 0, 0, 1, 0, 0, 0,192,167,115, 1, 0, 0, 0, 0, 0, 48,115, 1, 0, 0, 0, 0,112, 42,115, 1, 0, 0, 0, 0,
+208, 42,115, 1, 0, 0, 0, 0, 16, 42,115, 1, 0, 0, 0, 0, 80, 41,115, 1, 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,171, 68, 45, 65, 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,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128,
+253, 5, 0, 0,128, 7, 0, 0, 0, 0, 0, 0, 67, 4, 0, 0,253, 5, 0, 0,128, 7, 0, 0, 41, 4, 0, 0, 67, 4, 0, 0,
+253, 5, 0, 0,128, 7, 0, 0, 0, 0, 0, 0, 40, 4, 0, 0, 7, 0, 6, 0, 2, 0, 4, 4,132, 1, 41, 4, 1, 0, 1, 0,
+136, 1, 4, 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,
+192,152,115, 1, 0, 0, 0, 0,208,165,115, 1, 0, 0, 0, 0,208,145,196, 1, 0, 0, 0, 0, 48, 29, 88, 1, 0, 0, 0, 0,
+ 80, 99,115, 1, 0, 0, 0, 0, 80,143,114, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 80, 99,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,128,100,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,
+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, 73,112,111, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236, 36, 16, 68, 65, 84, 65, 0, 0, 0,204, 2,236, 79,160, 0, 0, 0,138, 0, 0, 0, 1, 2,236,136,160, 2,236, 35, 16,
- 2,236, 31,208, 2,236, 32, 16, 2,236, 31,144, 2,228,196,160, 0, 0, 0, 0, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 45, 68,171, 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, 0, 0, 3,209, 0, 0, 4,199, 0, 0, 0, 0,
- 0, 0, 3, 9, 0, 0, 3,209, 0, 0, 4,199, 0, 0, 2,239, 0, 0, 3, 9, 0, 0, 3,209, 0, 0, 4,199, 0, 0, 0, 0,
- 0, 0, 2,238, 0, 7, 0, 6, 0, 2, 4, 4, 0,247, 2,239, 1, 0, 1, 0, 1,136, 0, 68, 0, 7, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,127, 96, 2,236,135, 16, 2,232,159,176, 2,232,206,176, 2,236, 80,160,
- 2,232,193, 80, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 80,160, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 81,176, 0, 0, 0, 0,
- 84,114, 97,110,115,102,111,114,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, 33, 0,167, 0, 62, 1,204, 0,
+ 0, 0, 0, 0,162, 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,
+128,100,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,176,101,115, 1, 0, 0, 0, 0, 80, 99,115, 1, 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,
- 73,112,111, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 33, 0,167, 1, 62, 0,204, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 81,176, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 82,192, 2,236, 80,160, 79,117,116,112,117,116, 0, 0,
+ 0, 0, 0, 0, 62, 1,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 80,137,115, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0,176,101,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,224,102,115, 1, 0, 0, 0, 0,
+128,100,115, 1, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 62, 0,204,
- 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 2,236,114,160, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 82,192,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 83,208, 2,236, 81,176, 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, 24,255, 62, 1,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,224,102,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 16,104,115, 1, 0, 0, 0, 0,176,101,115, 1, 0, 0, 0, 0, 65,110,105,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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 1, 62, 0,204, 0, 0, 0, 1, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 83,208, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 84,224, 2,236, 82,192, 65,110,105,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, 48,254, 62, 1,204, 0, 0, 0, 1, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 16,104,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 64,105,115, 1, 0, 0, 0, 0,224,102,115, 1, 0, 0, 0, 0, 70,111,114,109, 97,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, 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, 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, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 1, 62, 0,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 84,224, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 85,240, 2,236, 83,208,
- 70,111,114,109, 97,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, 72,253, 62, 1,204, 0,
+ 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+ 64,105,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,112,106,115, 1, 0, 0, 0, 0, 16,104,115, 1, 0, 0, 0, 0,
+ 76,105,110,107, 32, 97,110,100, 32, 77, 97,116,101,114,105, 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,
- 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,
+ 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 85,240, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 87, 0, 2,236, 84,224, 76,105,110,107, 32, 97,110,100,
- 32, 77, 97,116,101,114,105, 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, 69,100,105,116,105,110,103, 0,
+ 0, 0, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0,112,106,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,160,107,115, 1, 0, 0, 0, 0,
+ 64,105,115, 1, 0, 0, 0, 0, 67, 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,
+ 0, 0, 0, 0, 0, 0, 0, 0, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 87, 0,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 88, 16, 2,236, 85,240, 67, 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, 0, 0, 0, 0, 0, 0, 0, 0, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,160,107,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+208,108,115, 1, 0, 0, 0, 0,112,106,115, 1, 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, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 88, 16, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 89, 32, 2,236, 87, 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, 76, 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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,208,108,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 0,110,115, 1, 0, 0, 0, 0,160,107,115, 1, 0, 0, 0, 0, 76, 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, 76, 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, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 89, 32, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 90, 48, 2,236, 88, 16,
- 76, 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, 0, 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,255, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+ 0,110,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 48,111,115, 1, 0, 0, 0, 0,208,108,115, 1, 0, 0, 0, 0,
+ 83,104, 97,100,111,119, 32, 97,110,100, 32, 83,112,111,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,
76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 90, 48, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 91, 64, 2,236, 89, 32, 83,104, 97,100,111,119, 32, 97,
-110,100, 32, 83,112,111,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, 76, 97,109,112, 0, 0, 0, 0,
+ 0, 0, 48,254, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0, 48,111,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 96,112,115, 1, 0, 0, 0, 0,
+ 0,110,115, 1, 0, 0, 0, 0, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 48, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 91, 64,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 92, 80, 2,236, 90, 48, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 0, 0, 0, 0, 0, 72,253, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 96,112,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+144,113,115, 1, 0, 0, 0, 0, 48,111,115, 1, 0, 0, 0, 0, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 92, 80, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 93, 96, 2,236, 91, 64, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,253, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 48,111,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,144,113,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,192,114,115, 1, 0, 0, 0, 0, 96,112,115, 1, 0, 0, 0, 0, 77,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, 76, 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, 69,100,105,116,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, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236, 91, 64, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 93, 96, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 94,112, 2,236, 92, 80,
- 77,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, 24,255, 62, 1,204, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+192,114,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,240,115,115, 1, 0, 0, 0, 0,144,113,115, 1, 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,
69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 94,112, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 95,128, 2,236, 93, 96, 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, 69,100,105,116,105,110,103, 0,
+ 0, 0, 72,253, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0,240,115,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 32,117,115, 1, 0, 0, 0, 0,
+192,114,115, 1, 0, 0, 0, 0, 83,104, 97,112,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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 72, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 95,128,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236, 96,144, 2,236, 94,112, 83,104, 97,112,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, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,253, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
+192,114,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 32,117,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 80,118,115, 1, 0, 0, 0, 0,240,115,115, 1, 0, 0, 0, 0, 77,101,115,104, 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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 12, 2,236, 94,112, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 96,144, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236, 97,160, 2,236, 95,128, 77,101,115,104, 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, 69,100,105,116,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, 72,253, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 80,118,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,128,119,115, 1, 0, 0, 0, 0, 32,117,115, 1, 0, 0, 0, 0, 77,101,115,104, 32, 84,111,111,
+108,115, 32, 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, 69,100,105,116,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, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 97,160, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 98,176, 2,236, 96,144,
- 77,101,115,104, 32, 84,111,111,108,115, 32, 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, 96,252, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+128,119,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,176,120,115, 1, 0, 0, 0, 0, 80,118,115, 1, 0, 0, 0, 0,
+ 84,101,120,116,117,114,101, 32,102, 97, 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,
69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236, 98,176, 0, 0, 0,137, 0, 0, 0, 1, 2,236, 99,192, 2,236, 97,160, 84,101,120,116,117,114,101, 32,
-102, 97, 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, 69,100,105,116,105,110,103, 0,
+ 0, 0, 0, 0, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,120,115, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0,176,120,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,224,121,115, 1, 0, 0, 0, 0,
+128,119,115, 1, 0, 0, 0, 0, 85, 86, 32, 67, 97,108, 99,117,108, 97,116,105,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, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236, 99,192, 68, 65, 84, 65, 0, 0, 0,228, 2,236, 99,192,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,100,208, 2,236, 98,176, 85, 86, 32, 67, 97,108, 99,117,108, 97,116,105,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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,224,121,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 16,123,115, 1, 0, 0, 0, 0,176,120,115, 1, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,100,208, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236,101,224, 2,236, 99,192, 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, 0, 0, 0, 0, 0, 0, 69,100,105,116,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, 48,254, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 16,123,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 64,124,115, 1, 0, 0, 0, 0,224,121,115, 1, 0, 0, 0, 0, 67,117,114,118,101, 32, 97,110,
+100, 32, 83,117,114,102, 97, 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, 69,100,105,116,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, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,101,224, 0, 0, 0,137, 0, 0, 0, 1, 2,236,102,240, 2,236,100,208,
- 67,117,114,118,101, 32, 97,110,100, 32, 83,117,114,102, 97, 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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+ 64,124,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,112,125,115, 1, 0, 0, 0, 0, 16,123,115, 1, 0, 0, 0, 0,
+ 67,117,114,118,101, 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,
69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,102,240, 0, 0, 0,137, 0, 0, 0, 1, 2,236,104, 0, 2,236,101,224, 67,117,114,118,101, 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, 69,100,105,116,105,110,103, 0,
+ 0, 0, 24,255, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,112,125,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,160,126,115, 1, 0, 0, 0, 0,
+ 64,124,115, 1, 0, 0, 0, 0, 67,117,114,118,101, 32, 84,111,111,108,115, 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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 24, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,104, 0,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,105, 16, 2,236,102,240, 67,117,114,118,101, 32, 84,111,111,108,115, 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, 69,100,105,116,105,110,103, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72,253, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,160,126,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+208,127,115, 1, 0, 0, 0, 0,112,125,115, 1, 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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,105, 16, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236,106, 32, 2,236,104, 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, 77, 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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,208,127,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 0,129,115, 1, 0, 0, 0, 0,160,126,115, 1, 0, 0, 0, 0, 76,105,110,107,115, 32, 97,110,
+100, 32, 80,105,112,101,108,105,110,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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,106, 32, 0, 0, 0,137, 0, 0, 0, 1, 2,236,107, 48, 2,236,105, 16,
- 76,105,110,107,115, 32, 97,110,100, 32, 80,105,112,101,108,105,110,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, 24,255, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+ 0,129,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 48,130,115, 1, 0, 0, 0, 0,208,127,115, 1, 0, 0, 0, 0,
+ 77, 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,
77, 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,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,107, 48, 0, 0, 0,137, 0, 0, 0, 1, 2,236,108, 64, 2,236,106, 32, 77, 97,116,101,114,105, 97,108,
+ 0, 0, 48,254, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0, 48,130,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 96,131,115, 1, 0, 0, 0, 0,
+ 0,129,115, 1, 0, 0, 0, 0, 82, 97,109,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 97,116,101,114,105, 97,108,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 48, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,108, 64,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,109, 80, 2,236,107, 48, 82, 97,109,112,115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,254, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0,129,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 96,131,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+144,132,115, 1, 0, 0, 0, 0, 48,130,115, 1, 0, 0, 0, 0, 83,104, 97,100,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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2,236,107, 48, 68, 65, 84, 65, 0, 0, 0,228, 2,236,109, 80, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236,110, 96, 2,236,108, 64, 83,104, 97,100,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, 77, 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, 72,253, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,144,132,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,144,132,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,192,133,115, 1, 0, 0, 0, 0, 96,131,115, 1, 0, 0, 0, 0, 77,105,114,114,111,114, 32, 84,
+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, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236,110, 96, 68, 65, 84, 65, 0, 0, 0,228, 2,236,110, 96, 0, 0, 0,137, 0, 0, 0, 1, 2,236,111,112, 2,236,109, 80,
- 77,105,114,114,111,114, 32, 84,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, 72,253, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+192,133,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,240,134,115, 1, 0, 0, 0, 0,144,132,115, 1, 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,
77, 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,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,111,112, 0, 0, 0,137, 0, 0, 0, 1, 2,236,112,128, 2,236,110, 96, 84,101,120,116,117,114,101, 0,
+ 0, 0, 96,252, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,240,134,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 32,136,115, 1, 0, 0, 0, 0,
+192,133,115, 1, 0, 0, 0, 0, 77, 97,112, 32, 73,110,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, 0, 0, 0, 77, 97,116,101,114,105, 97,108,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 96, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,112,128,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,113,144, 2,236,111,112, 77, 97,112, 32, 73,110,112,117,116, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,252, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+192,133,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 32,136,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 80,137,115, 1, 0, 0, 0, 0,240,134,115, 1, 0, 0, 0, 0, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2,236,111,112, 68, 65, 84, 65, 0, 0, 0,228, 2,236,113,144, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236,114,160, 2,236,112,128, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,252, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,192,133,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 80,137,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,128,138,115, 1, 0, 0, 0, 0, 32,136,115, 1, 0, 0, 0, 0, 82,101,110,100,101,114, 32, 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, 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, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,252, 96, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236,111,112, 68, 65, 84, 65, 0, 0, 0,228, 2,236,114,160, 0, 0, 0,137, 0, 0, 0, 1, 2,236,115,176, 2,236,113,144,
- 82,101,110,100,101,114, 32, 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,
- 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, 62, 1,204, 0,
+ 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+128,138,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,176,139,115, 1, 0, 0, 0, 0, 80,137,115, 1, 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,
+ 87,111,114,108,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, 1, 62, 0,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,115,176, 0, 0, 0,137, 0, 0, 0, 1, 2,236,116,192, 2,236,114,160, 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, 87,111,114,108,100, 0, 0, 0,
+ 0, 0, 48,254, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,176,139,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,224,140,115, 1, 0, 0, 0, 0,
+128,138,115, 1, 0, 0, 0, 0, 87,111,114,108,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, 87,111,114,108,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,254, 48, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,116,192,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,117,208, 2,236,115,176, 87,111,114,108,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, 72,253, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,224,140,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 16,142,115, 1, 0, 0, 0, 0,176,139,115, 1, 0, 0, 0, 0, 77,105,115,116, 32, 47, 32, 83,116, 97,114,115, 32, 47, 32, 80,
+104,121,115,105, 99,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, 87,111,114,108,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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,117,208, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236,118,224, 2,236,116,192, 77,105,115,116, 32, 47, 32, 83,116, 97,114,115, 32, 47, 32, 80,104,121,115,105, 99,115, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 16,142,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 64,143,115, 1, 0, 0, 0, 0,224,140,115, 1, 0, 0, 0, 0, 65,109, 98, 32, 79, 99, 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, 87,111,114,108,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, 87,111,114,108,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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,118,224, 0, 0, 0,137, 0, 0, 0, 1, 2,236,119,240, 2,236,117,208,
- 65,109, 98, 32, 79, 99, 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, 62, 1,204, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,140,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+ 64,143,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,112,144,115, 1, 0, 0, 0, 0, 16,142,115, 1, 0, 0, 0, 0,
+ 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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,
87,111,114,108,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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,117,208, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,119,240, 0, 0, 0,137, 0, 0, 0, 1, 2,236,121, 0, 2,236,118,224, 84,101,120,116,117,114,101, 32,
- 97,110,100, 32, 73,110,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, 87,111,114,108,100, 0, 0, 0,
+ 0, 0, 24,255, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,112,144,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,160,145,115, 1, 0, 0, 0, 0,
+ 64,143,115, 1, 0, 0, 0, 0, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114,108,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,255, 24, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,121, 0,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,122, 16, 2,236,119,240, 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,114,108,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24,255, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64,143,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,160,145,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+208,146,115, 1, 0, 0, 0, 0,112,144,115, 1, 0, 0, 0, 0, 77,117,108,116,105,114,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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 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, 24, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2,236,119,240, 68, 65, 84, 65, 0, 0, 0,228, 2,236,122, 16, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236,123, 32, 2,236,121, 0, 77,117,108,116,105,114,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, 69,100,105,116,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, 48,254, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,208,146,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 0,148,115, 1, 0, 0, 0, 0,160,145,115, 1, 0, 0, 0, 0, 79, 98,106,101, 99,116, 32, 97,
+110,100, 32, 76,105,110,107,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, 79, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,123, 32, 0, 0, 0,137, 0, 0, 0, 1, 2,236,124, 48, 2,236,122, 16,
- 79, 98,106,101, 99,116, 32, 97,110,100, 32, 76,105,110,107,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, 62, 1,204, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+ 0,148,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 48,149,115, 1, 0, 0, 0, 0,208,146,115, 1, 0, 0, 0, 0,
+ 65,110,105,109, 32,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, 0, 0, 0,
79, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,124, 48, 0, 0, 0,137, 0, 0, 0, 1, 2,236,125, 64, 2,236,123, 32, 65,110,105,109, 32,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, 0, 0, 0, 79, 98,106,101, 99,116, 0, 0,
+ 0, 0, 24,255, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0, 48,149,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 96,150,115, 1, 0, 0, 0, 0,
+ 0,148,115, 1, 0, 0, 0, 0, 68,114, 97,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, 79, 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, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 24, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,125, 64,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,126, 80, 2,236,124, 48, 68,114, 97,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,254, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 96,150,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+144,151,115, 1, 0, 0, 0, 0, 48,149,115, 1, 0, 0, 0, 0, 67,111,110,115,116,114, 97,105,110,116,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, 79, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,126, 80, 0, 0, 0,137, 0, 0, 0, 1,
- 2,232,193, 80, 2,236,125, 64, 67,111,110,115,116,114, 97,105,110,116,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, 72,253, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,144,151,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,144,144,114, 1, 0, 0, 0, 0, 96,150,115, 1, 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, 79, 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, 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, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,232,193, 80, 0, 0, 0,137, 0, 0, 0, 1, 0, 0, 0, 0, 2,236,126, 80,
- 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, 48,254, 62, 1,204, 0,
+ 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0,224,102,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+144,144,114, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,192, 26,122, 1, 0, 0, 0, 0,144,151,115, 1, 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,
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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 1, 62, 0,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 2,236, 83,208, 68, 65, 84, 65,
- 0, 0, 0,204, 2,236,127, 96, 0, 0, 0,118, 0, 0, 0, 1, 5, 30,228, 32, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0,
- 2,236, 79,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, 2, 0, 0,
-193, 0, 0, 0, 67,163, 0, 0,196,106, 0, 0, 67,104, 0, 0,194,173, 94,108, 67,202, 87,155,196,148,152,252, 67,152,156, 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, 67,128, 0, 0, 66, 40, 0, 0, 69, 0, 0, 0, 67,225, 0, 0,
- 63, 0, 0, 0, 63,154,225, 72, 0, 0, 0, 1, 0, 1, 0, 1, 0,247, 2,239, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0,
- 5, 30,236, 32,255,255, 0, 0, 0, 0, 0, 0, 1,150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 3, 0, 5, 30,228, 32, 0, 0, 0,113, 0, 0, 0, 1, 2,236,128, 96, 2,236,127, 96, 0, 0, 0, 1, 63, 51, 51, 51,
- 2,236, 79,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,127,198, 52,188,166, 29,146, 61, 22,153, 97,
- 0, 0, 0, 0, 61, 43,252, 13, 62,247, 11, 89,191, 95,248, 90, 0, 0, 0, 0, 52, 67,176,196, 63, 96, 42,246, 62,247, 67, 44,
- 0, 0, 0, 0, 64, 78, 45, 74, 62,172, 87,201,194, 41,171, 79, 63,128, 0, 0, 63,127,198, 53, 61, 43,251,248, 52, 80, 0, 0,
- 0, 0, 0, 0,188,166, 29,186, 62,247, 11,119, 63, 96, 43, 16, 0, 0, 0, 0, 61, 22,153, 99,191, 95,248,117, 62,247, 67, 75,
- 0, 0, 0, 0,191,211,125,192,194, 21,161,185, 65,161,133, 59, 63,128, 0, 0, 63,139,224,100,190, 96,221, 21,189, 22,154,236,
-189, 22,153, 97, 61, 60, 27,174, 64,167, 52,239, 63, 95,250,166, 63, 95,248, 90, 52, 86, 9, 86, 65, 23,185, 41,190,247, 69,181,
-190,247, 67, 44, 64, 97,129,137, 64,105, 75, 27, 66, 41,152,145, 66, 41,171, 79, 63,105,225, 95, 61, 39,247, 84,186,185, 46,176,
-184,146,196,144,186,245,126,178, 61, 54,117, 48, 61,165,157, 23, 52,153,160, 0, 66,165, 56,225, 68,233,202,192,196,124, 94, 18,
-194, 71,254, 87,194,165, 77,102,196,233,177, 39, 68,124, 65,193, 66, 72, 0,101, 63,140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 65, 45, 68,171, 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, 63,127,198, 52,188,166, 29,146, 61, 22,153, 97,
- 0, 0, 0, 0, 61, 43,252, 13, 62,247, 11, 89,191, 95,248, 90, 0, 0, 0, 0, 52, 67,176,196, 63, 96, 42,246, 62,247, 67, 44,
- 0, 0, 0, 0, 64, 78, 45, 74, 62,172, 87,201,194, 41,171, 79, 63,128, 0, 0, 63, 92, 99,141,191, 2, 35, 43,188, 46,238,188,
-188,148, 32, 94, 66, 25,240, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 5, 30,248, 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, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0,
-255,226, 0, 0, 66, 12, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 58,124, 56, 68, 60, 35,215, 10, 67,250, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 64, 68, 77,201, 64,111, 66,228,191,205, 97,230, 60,149,191,128,191, 77,109,116, 63,230,165,248, 0, 20, 0, 0,
- 0, 7, 0, 99, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,255,255, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 24, 24, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 40, 2,236,128, 96, 0, 0, 0,117,
- 0, 0, 0, 1, 2,236,129,176, 5, 30,228, 32, 0, 0, 0, 2, 63, 51, 51, 51, 2,236, 79,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, 67,122, 0, 0,189,204,204,205, 63,140,204,205,
- 63,128, 0, 0, 67,122, 0, 0,192,160, 0, 0, 64,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 2,235,
- 0, 0, 0, 16, 0, 0, 3,168, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 3,168, 0, 0, 0, 16, 0, 0, 2,235,
- 60, 35,215, 10, 60, 35,215, 10, 70,106, 96, 0, 68,122, 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, 5, 31, 16, 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, 29, 0, 0,
- 0, 0, 0, 0, 0, 0, 79, 66, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 67,122, 0, 0,189,204,204,205, 63,140,204,205, 68, 65, 84, 65, 0, 0, 0,120, 2,236,129,176, 0, 0, 0,124, 0, 0, 0, 1,
- 2,236,130, 80, 2,236,128, 96, 0, 0, 0, 9, 63, 51, 51, 51, 2,236, 79,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2,236,183,112, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 5, 0, 0, 0, 17,
- 0, 0, 2,225, 0, 0, 2,227, 0, 0, 0, 5, 0, 0, 0, 17, 0, 0, 2,207, 0, 0, 2,227, 68, 65, 84, 65, 0, 0, 0,248,
- 2,236,130, 80, 0, 0, 0,122, 0, 0, 0, 1, 2,236,131,112, 2,236,129,176, 0, 0, 0, 6, 63, 51, 51, 51, 2,236, 79,160,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 67,128, 0, 0,
-190,120, 0, 0, 63,159, 0, 0,190,242, 0, 0, 63,188,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, 1,124, 0, 0, 0, 0, 0, 0, 1,242,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 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, 1, 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, 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, 68, 65, 84, 65, 0, 0, 0,248, 2,236,131,112, 0, 0, 0,121, 0, 0, 0, 1, 2,236,132,144, 2,236,130, 80,
- 0, 0, 0, 3, 63, 51, 51, 51, 2,236, 79,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 67,182, 0, 0,195,209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,195,190, 0, 0,181, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,
- 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,124,195,190, 0, 0,195,190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1,108, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,142,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2,236,132,144, 0, 0, 0,194,
- 0, 0, 0, 1, 2,236,133, 96, 2,236,131,112, 0, 0, 0, 11, 63, 51, 51, 51, 2,236, 79,160,192,128, 0, 0, 67,122, 0, 0,
-192,128, 0, 0, 67,127, 0, 0,192,128, 0, 0, 66, 72, 0, 0,192,128, 0, 0, 67,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, 1,124, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,124,
- 0, 0, 0, 16, 0, 0, 1,124, 63,128, 0, 0, 67,129,128, 0, 70,250, 0, 0, 67,129,128, 0, 61,204,204,205, 65, 32, 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, 68, 65, 84, 65, 0, 0, 0,164, 2,236,133, 96, 0, 0, 0,123, 0, 0, 0, 1, 2,236,134, 48, 2,236,132,144,
- 0, 0, 0, 13, 63, 51, 51, 51, 2,236, 79,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, 63,128, 0, 0, 68,122, 0, 0, 0, 0, 0, 0, 68,122, 0, 0,192,160, 0, 0, 66,130, 0, 0, 0, 0, 0, 0,
- 67,182, 0, 0, 0, 0, 1,108, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0,196, 0, 0, 1,108, 0, 0, 0, 0,
- 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 1,108, 0, 0, 0, 16, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 68,122, 0, 0,
- 68,122, 0, 0, 61,204,204,205, 66, 72, 0, 0, 0, 10, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,176, 2,236,134, 48, 0, 0, 0,203, 0, 0, 0, 1, 2,236,135, 16, 2,236,133, 96, 0, 0, 0, 12, 63, 51, 51, 51,
- 2,236, 79,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 0, 66, 2, 0, 0,193,128, 0, 0,
- 67,247, 0, 0,191, 0, 0, 0, 66, 2, 0, 0,193,128, 0, 0, 67,247, 0, 0, 0, 0, 1,108, 0, 0, 1,124, 0, 0, 0, 0,
- 0, 0, 2, 14, 0, 0, 0,128, 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 1,108, 0, 0, 0, 16,
- 0, 0, 2, 14, 0, 0, 0, 0, 0, 0, 0, 0, 70,250, 0, 0, 68,122, 0, 0, 60, 35,215, 10, 66, 72, 0, 0, 0, 10, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 1,104, 2,236,135, 16, 0, 0, 0,120, 0, 0, 0, 1, 0, 0, 0, 0, 2,236,134, 48, 0, 0, 0, 5,
- 63, 51, 51, 51, 2,236, 79,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,150,
- 83, 97,118,101, 32, 70,105,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 85,115,101,114,115, 47,116,
-111,110, 47, 68,101,115,107,116,111,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,112,114,101,118,105,101,119, 46,
- 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, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 82, 0, 0, 0, 0, 1, 76, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65,
- 0, 0, 0,204, 2,236,136,160, 0, 0, 0,138, 0, 0, 0, 1, 0, 0, 0, 0, 2,236, 79,160, 2,235, 18,144, 2,236, 31, 80,
- 2,236, 32, 16, 2,236, 31,208, 0, 0, 0, 0, 63, 79, 65,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,134,173, 25, 0, 0, 0, 0, 0, 0, 0, 0,189, 60, 82,171,188,131, 1,211,191,153,211,206,191,128, 0, 0,128, 0, 0, 0,
-128, 0, 0, 0,193, 65,236,225,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,207, 0, 0, 0, 0, 0, 0, 3, 9, 0, 0, 0, 0,
- 0, 0, 3,207, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 3,207, 0, 0, 0, 27, 0, 0, 3, 9, 0, 9, 0, 8,
- 0, 1, 1, 1, 3,208, 2,239, 1, 0, 1, 0, 2,195, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5, 30,232, 32, 2,236,159, 32, 2,232,189,144, 2,232,189,144, 2,236,137,160, 2,236,150, 96, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,137,160, 0, 0, 0,137, 0, 0, 0, 1, 2,236,138,176, 0, 0, 0, 0, 84,114, 97,110,115,102,111,114,
-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, 73,112,111, 0, 0, 0, 0, 0,
+ 0, 0, 72,253, 62, 1,204, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 16,104,115, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0,192, 26,122, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,144,161,135, 1, 0, 0, 0, 0,
+144,144,114, 1, 0, 0, 0, 0, 80, 97,114,116,105, 99,108,101, 32, 83,121,115,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, 80, 97,114,116,105, 99,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0,167, 1, 62, 0,204,
- 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,138,176,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,139,192, 2,236,137,160, 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, 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, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,144,161,135, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 64,247,121, 1, 0, 0, 0, 0,192, 26,122, 1, 0, 0, 0, 0, 80,104,121,115,105, 99,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, 80, 97,114,116,105, 99,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,255, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 64,247,121, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 64, 62,114, 1, 0, 0, 0, 0,144,161,135, 1, 0, 0, 0, 0, 86,105,115,117, 97,108,105,122,
+ 97,116,105,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 97,114,116,105, 99,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, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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,254, 62, 1,204, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+ 64, 62,114, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 80,143,114, 1, 0, 0, 0, 0, 64,247,121, 1, 0, 0, 0, 0,
+ 69,120,116,114, 97,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,
+ 80, 97,114,116,105, 99,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,253, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,240, 0, 0, 0, 80,143,114, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64, 62,114, 1, 0, 0, 0, 0, 67,104,105,108,100,114,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, 0, 0, 0, 0, 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, 97,114,116,105, 99,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,253, 62, 1,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0,
+ 64, 62,114, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,192,152,115, 1, 0, 0, 0, 0,129, 0, 0, 0, 1, 0, 0, 0,
+240,153,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 98,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,193, 0, 0,163, 67, 0, 0,106,196, 0, 0,104, 67,108, 94,173,194,155, 87,202, 67,176,132,139,196,193,149,104, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,139,192, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236,140,208, 2,236,138,176, 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,128, 67, 0, 0, 40, 66, 0, 0, 0, 69, 0, 0,225, 67,
+ 0, 0, 0, 63, 72,225,154, 63, 0, 0, 1, 0, 1, 0, 1, 0,132, 1, 41, 4, 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,128,199,115, 1, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0,
+150, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 68, 65, 84, 65, 56, 3, 0, 0,240,153,115, 1, 0, 0, 0, 0,
+124, 0, 0, 0, 1, 0, 0, 0,112,157,115, 1, 0, 0, 0, 0,192,152,115, 1, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63,
+ 0, 98,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52,198,127, 63,146, 29,166,188,
+ 97,153, 22, 61, 0, 0, 0, 0, 13,252, 43, 61, 89, 11,247, 62, 90,248, 95,191, 0, 0, 0, 0,196,176, 67, 52,246, 42, 96, 63,
+ 44, 67,247, 62, 0, 0, 0, 0, 74, 45, 78, 64,201, 87,172, 62, 79,171, 41,194, 0, 0,128, 63, 53,198,127, 63,248,251, 43, 61,
+ 0, 0, 80, 52, 0, 0, 0, 0,186, 29,166,188,119, 11,247, 62, 16, 43, 96, 63, 0, 0, 0, 0, 99,153, 22, 61,117,248, 95,191,
+ 75, 67,247, 62, 0, 0, 0, 0,192,125,211,191,185,161, 21,194, 59,133,161, 65, 0, 0,128, 63,100,224,139, 63, 21,221, 96,190,
+236,154, 22,189, 97,153, 22,189,174, 27, 60, 61,239, 52,167, 64,166,250, 95, 63, 90,248, 95, 63, 86, 9, 86, 52, 41,185, 23, 65,
+181, 69,247,190, 44, 67,247,190,137,129, 97, 64, 27, 75,105, 64,145,152, 41, 66, 79,171, 41, 66, 95,225,105, 63, 84,247, 39, 61,
+176, 46,185,186,144,196,146,184,178,126,245,186, 48,117, 54, 61, 23,157,165, 61, 0,160,153, 52,225, 56,165, 66,192,202,233, 68,
+ 18, 94,124,196, 87,254, 71,194,102, 77,165,194, 39,177,233,196,193, 65,124, 68,101, 0, 72, 66, 0, 0,140, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,171, 68, 45, 65, 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,128, 0, 0, 0,128,226,215,163,188, 0, 0, 0,128, 52,198,127, 63,146, 29,166,188,
+ 97,153, 22, 61, 0, 0, 0, 0, 13,252, 43, 61, 89, 11,247, 62, 90,248, 95,191, 0, 0, 0, 0,196,176, 67, 52,246, 42, 96, 63,
+ 44, 67,247, 62, 0, 0, 0, 0, 74, 45, 78, 64,201, 87,172, 62, 79,171, 41,194, 0, 0,128, 63,141, 99, 92, 63, 43, 35, 2,191,
+188,238, 46,188, 94, 32,148,188, 23,240, 25, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,160,248,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+226,255, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63, 68, 56,124, 58, 10,215, 35, 60, 0, 0,250, 67, 0, 0, 0, 0,
+ 0, 0, 0, 0,201, 77, 68, 64,228, 66,111, 64,230, 97,205,191,128,191,149, 60,116,109, 77,191,248,165,230, 63, 20, 0, 0, 0,
+ 7, 0, 99, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,255,255, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 24, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 88, 1, 0, 0,112,157,115, 1, 0, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0, 16,159,115, 1, 0, 0, 0, 0,
+240,153,115, 1, 0, 0, 0, 0, 2, 0, 0, 0, 51, 51, 51, 63, 0, 98,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63,
+ 0, 0,128, 63, 0, 0,122, 67, 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,235, 2, 0, 0,
+ 16, 0, 0, 0,168, 3, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,235, 2, 0, 0,
+ 10,215, 35, 60, 10,215, 35, 60, 0, 96,106, 70, 0, 0,122, 68, 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, 32, 20,116, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63, 68, 65, 84, 65,136, 0, 0, 0, 16,159,115, 1, 0, 0, 0, 0,
+135, 0, 0, 0, 1, 0, 0, 0,224,159,115, 1, 0, 0, 0, 0,112,157,115, 1, 0, 0, 0, 0, 9, 0, 0, 0, 51, 51, 51, 63,
+ 0, 98,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,237,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 12, 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,205,204,204, 61, 5, 0, 0, 0, 17, 0, 0, 0,225, 2, 0, 0,227, 2, 0, 0,
+ 5, 0, 0, 0, 17, 0, 0, 0,207, 2, 0, 0,227, 2, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,224,159,115, 1, 0, 0, 0, 0,
+133, 0, 0, 0, 1, 0, 0, 0, 80,161,115, 1, 0, 0, 0, 0, 16,159,115, 1, 0, 0, 0, 0, 6, 0, 0, 0, 51, 51, 51, 63,
+ 0, 98,115, 1, 0, 0, 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, 67,
+ 0, 0, 0, 0, 0, 0,128, 67, 0, 0,120,190, 0, 0,159, 63, 0, 0,242,190, 0,128,188, 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,124, 1, 0, 0,
+ 0, 0, 0, 0,242, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 1, 0,
+ 0, 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,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, 68, 65, 84, 65, 48, 1, 0, 0,
+ 80,161,115, 1, 0, 0, 0, 0,132, 0, 0, 0, 1, 0, 0, 0,192,162,115, 1, 0, 0, 0, 0,224,159,115, 1, 0, 0, 0, 0,
+ 3, 0, 0, 0, 51, 51, 51, 63, 0, 98,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,182, 67, 0, 0,209,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67, 0, 0,190,195, 0, 0, 0,181,
+ 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0,190,195, 0, 0,190,195, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 1, 0, 1, 0, 1, 0, 1, 0,108, 1,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,142, 3, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,192,162,115, 1, 0, 0, 0, 0,206, 0, 0, 0, 1, 0, 0, 0,192,163,115, 1, 0, 0, 0, 0,
+ 80,161,115, 1, 0, 0, 0, 0, 11, 0, 0, 0, 51, 51, 51, 63, 0, 98,115, 1, 0, 0, 0, 0, 0, 0,128,192, 0, 0,122, 67,
+ 0, 0,128,192, 0, 0,127, 67, 0, 0,128,192, 0, 0, 72, 66, 0, 0,128,192, 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,
+ 16, 0, 0, 0,124, 1, 0, 0, 0, 0,128, 63, 0,128,129, 67, 0, 0,250, 70, 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65,
+ 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, 68, 65, 84, 65,192, 0, 0, 0,
+192,163,115, 1, 0, 0, 0, 0,134, 0, 0, 0, 1, 0, 0, 0,192,164,115, 1, 0, 0, 0, 0,192,162,115, 1, 0, 0, 0, 0,
+ 13, 0, 0, 0, 51, 51, 51, 63, 0, 98,115, 1, 0, 0, 0, 0, 0, 0, 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,122, 68, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,160,192, 0, 0,130, 66,
+ 0, 0, 0, 0, 0, 0,182, 67,108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,196, 0, 0, 0,108, 1, 0, 0,
+ 0, 0, 0, 0, 16, 0, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,122, 68, 0, 0,122, 68,205,204,204, 61, 0, 0, 72, 66, 10, 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, 68, 65, 84, 65,208, 0, 0, 0,192,164,115, 1, 0, 0, 0, 0,
+215, 0, 0, 0, 1, 0, 0, 0,208,165,115, 1, 0, 0, 0, 0,192,163,115, 1, 0, 0, 0, 0, 12, 0, 0, 0, 51, 51, 51, 63,
+ 0, 98,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 2, 66,
+ 0, 0,122,196, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 2, 66, 0, 0,150,194, 0, 0,160, 64,108, 1, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0, 14, 2, 0, 0,128, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 0,108, 1, 0, 0,
+ 16, 0, 0, 0, 14, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 70, 0, 0,122, 68, 10,215, 35, 60, 0, 0, 72, 66,
+ 10, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,168, 1, 0, 0,
+208,165,115, 1, 0, 0, 0, 0,131, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,164,115, 1, 0, 0, 0, 0,
+ 5, 0, 0, 0, 51, 51, 51, 63, 0, 98,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,150, 0, 0, 0, 83, 97,118,101, 32, 70,105,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,111,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,112,114,101,118,105,101,119, 46, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 82, 0, 0, 0, 0, 0, 76, 1, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,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, 68, 65, 84, 65, 8, 1, 0, 0,
+192,167,115, 1, 0, 0, 0, 0,149, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98,115, 1, 0, 0, 0, 0,
+ 48, 40,115, 1, 0, 0, 0, 0,176, 41,115, 1, 0, 0, 0, 0,208, 42,115, 1, 0, 0, 0, 0,112, 42,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,252, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 17,149, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0,170, 82, 60,189,241, 1,131,188,206,211,153,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
+225,236, 65,193, 0, 0, 0, 0, 0, 0, 0, 0,251, 5, 0, 0, 0, 0, 0, 0, 67, 4, 0, 0, 0, 0, 0, 0,251, 5, 0, 0,
+ 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0,251, 5, 0, 0, 27, 0, 0, 0, 67, 4, 0, 0, 9, 0, 8, 0, 1, 0, 1, 1,
+252, 5, 41, 4, 1, 0, 1, 0,195, 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,128,184,115, 1, 0, 0, 0, 0,144,197,115, 1, 0, 0, 0, 0,144, 46,106, 1, 0, 0, 0, 0,
+144, 46,106, 1, 0, 0, 0, 0, 16,169,115, 1, 0, 0, 0, 0, 80,183,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+ 16,169,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 64,170,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 84,114, 97,110,115,102,111,114,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,
+ 73,112,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 33, 0,167, 0, 62, 1,204, 0, 0, 0, 0, 0,162, 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, 64,170,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,112,171,115, 1, 0, 0, 0, 0,
+ 16,169,115, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,140,208, 0, 0, 0,137, 0, 0, 0, 1, 2,236,141,224, 2,236,139,192,
- 65,110,105,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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,112,171,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+160,172,115, 1, 0, 0, 0, 0, 64,170,115, 1, 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,
- 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 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,128, 0, 0, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,141,224, 0, 0, 0,137, 0, 0, 0, 1, 2,236,142,240, 2,236,140,208, 70,111,114,109, 97,116, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,160,172,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,208,173,115, 1, 0, 0, 0, 0,112,171,115, 1, 0, 0, 0, 0, 65,110,105,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, 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, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,192, 0, 0, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,142,240,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,144, 0, 2,236,141,224, 76,105,110,107, 32, 97,110,100, 32, 77, 97,116,101,114,105, 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, 69,100,105,116,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,128, 2, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+208,173,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 0,175,115, 1, 0, 0, 0, 0,160,172,115, 1, 0, 0, 0, 0,
+ 70,111,114,109, 97,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,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,144, 0, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236,145, 16, 2,236,142,240, 67, 97,109,101,114, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+192, 3, 0, 0, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0, 0,175,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 48,176,115, 1, 0, 0, 0, 0,
+208,173,115, 1, 0, 0, 0, 0, 76,105,110,107, 32, 97,110,100, 32, 77, 97,116,101,114,105, 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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,145, 16, 0, 0, 0,137, 0, 0, 0, 1, 2,236,146, 32, 2,236,144, 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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 48,176,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 96,177,115, 1, 0, 0, 0, 0, 0,175,115, 1, 0, 0, 0, 0, 67, 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,
- 76, 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, 69,100,105,116,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,146, 32, 0, 0, 0,137, 0, 0, 0, 1, 2,236,147, 48, 2,236,145, 16, 76, 97,109,112, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 1, 0, 0, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 96,177,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0,144,178,115, 1, 0, 0, 0, 0, 48,176,115, 1, 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, 76, 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, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 24, 1, 62, 0,204,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,147, 48,
- 0, 0, 0,137, 0, 0, 0, 1, 2,236,148, 64, 2,236,146, 32, 83,104, 97,100,111,119, 32, 97,110,100, 32, 83,112,111,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, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,
+144,178,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,192,179,115, 1, 0, 0, 0, 0, 96,177,115, 1, 0, 0, 0, 0,
+ 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 97,109,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,148, 64, 0, 0, 0,137, 0, 0, 0, 1,
- 2,236,149, 80, 2,236,147, 48, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,112,117,116, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 24,255, 62, 1,204, 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,
+ 68, 65, 84, 65,240, 0, 0, 0,192,179,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,240,180,115, 1, 0, 0, 0, 0,
+144,178,115, 1, 0, 0, 0, 0, 83,104, 97,100,111,119, 32, 97,110,100, 32, 83,112,111,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, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,228, 2,236,149, 80, 0, 0, 0,137, 0, 0, 0, 1, 2,236,150, 96, 2,236,148, 64,
- 77, 97,112, 32, 84,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,254, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0,240,180,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0,
+ 32,182,115, 1, 0, 0, 0, 0,192,179,115, 1, 0, 0, 0, 0, 84,101,120,116,117,114,101, 32, 97,110,100, 32, 73,110,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, 76, 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,
- 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,253, 62, 1,204, 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, 68, 65, 84, 65,240, 0, 0, 0, 32,182,115, 1, 0, 0, 0, 0,
+148, 0, 0, 0, 1, 0, 0, 0, 80,183,115, 1, 0, 0, 0, 0,240,180,115, 1, 0, 0, 0, 0, 77, 97,112, 32, 84,111, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,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, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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,253, 62, 1,204, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,180,115, 1, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0,
+ 80,183,115, 1, 0, 0, 0, 0,148, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32,182,115, 1, 0, 0, 0, 0,
+ 84,114, 97,110,115,102,111,114,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,
+ 86,105,101,119, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,228, 0, 62, 1,204, 0, 0, 0, 0, 0,162, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 56, 3, 0, 0,128,184,115, 1, 0, 0, 0, 0,124, 0, 0, 0, 1, 0, 0, 0, 0,188,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 51, 51, 51, 63,192,167,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,255,255,127, 37, 0, 0,128, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 51,
+ 0, 0,128,191, 0, 0, 0, 0, 0, 0,128,165, 0, 0,128, 63,104, 33,162, 51, 0, 0, 0, 0, 78,199, 41, 60,210,129,230,191,
+225,230, 30,193, 0, 0,128, 63, 0, 0,128, 63,254,255,127, 37,255,255,127,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,127, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,128,191, 0, 0,160, 51, 0, 0, 0, 0, 79,199, 41,188,226,230, 30,193,
+216,129,230, 63, 0, 0,128, 63,252, 65, 79, 63,219, 5,147, 37,206,211,153,165, 0, 0,128,165,170, 82, 60, 61, 32, 2,131, 60,
+206,211,153, 63, 0, 0,128, 63,198,137,110,177,228, 17,149, 63, 54,216,194,179,104, 33,162,179, 88, 21,238, 62, 0, 31,248,191,
+ 0,126, 61,190,225,230, 30, 65, 71, 26,158, 63, 70, 26,158, 37, 70, 26,158,165, 0, 0, 0, 26, 0, 0, 0,179, 0, 0,128, 51,
+254,208, 91, 63, 0, 0,128,179,192, 31, 96, 58, 5,196, 81, 63, 84, 37, 24,190,230,248,168,189, 23,210,108,189,230, 37,122, 60,
+168,200, 40, 62, 29, 17,203, 61,252, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 17,149, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0,170, 82, 60,189,241, 1,131,188,206,211,153,191, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
+225,236, 65,193, 0, 0, 0, 0, 0, 0,128, 63,255,255,127, 37, 0, 0,128, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160, 51,
+ 0, 0,128,191, 0, 0, 0, 0, 0, 0,128,165, 0, 0,128, 63,104, 33,162, 51, 0, 0, 0, 0, 78,199, 41, 60,210,129,230,191,
+225,230, 30,193, 0, 0,128, 63,244, 4, 53, 63,243, 4, 53,191,243, 4, 53,165,242, 4,181, 36,147,160, 98, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0,160,248,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,251,255, 0, 0, 0, 0, 12, 66, 0, 0,128, 63, 0, 0,128, 63,
+155, 90,211, 58, 10,215, 35, 60, 0, 0,250, 67,228, 18,218,188, 37,180, 23,188, 81, 35, 24, 62, 64, 52, 55,190,244,153,230,191,
+ 0, 0,224, 54, 56,146, 88, 63,198, 37, 71, 64, 20, 0, 0, 0, 7, 0,207, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,255,255,
+ 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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, 24,
+ 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,240, 0, 0, 0, 0,188,115, 1, 0, 0, 0, 0,
+129, 0, 0, 0, 1, 0, 0, 0, 48,189,115, 1, 0, 0, 0, 0,128,184,115, 1, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+192,167,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 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, 4, 0, 0, 0, 0, 0, 0, 0,160, 68, 0, 0, 46,196, 0, 0,100, 67,197,197,136, 55,118,209, 78, 68,
+ 40,222,231,195,172,158, 25, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 67, 0, 0, 40, 66,
+ 0, 0, 0, 69, 0, 0,225, 67, 0, 0, 0, 63, 72,225,154, 63, 0, 0, 1, 0, 1, 0, 1, 0,233, 3,235, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255, 0, 0, 0, 0, 0, 0,150, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 68, 65, 84, 65, 88, 1, 0, 0,
+ 48,189,115, 1, 0, 0, 0, 0,128, 0, 0, 0, 1, 0, 0, 0,208,190,115, 1, 0, 0, 0, 0, 0,188,115, 1, 0, 0, 0, 0,
+ 2, 0, 0, 0, 51, 51, 51, 63,192,167,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67,205,204,204,189,205,204,140, 63, 0, 0,128, 63, 0, 0,122, 67,
+ 0, 0,160,192, 0, 0,160, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,235, 2, 0, 0, 16, 0, 0, 0,168, 3, 0, 0,
+ 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 0,168, 3, 0, 0, 16, 0, 0, 0,235, 2, 0, 0, 10,215, 35, 60, 10,215, 35, 60,
+ 0, 96,106, 70, 0, 0,122, 68, 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, 32, 20,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 79, 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 67,
+205,204,204,189,205,204,140, 63, 68, 65, 84, 65,136, 0, 0, 0,208,190,115, 1, 0, 0, 0, 0,135, 0, 0, 0, 1, 0, 0, 0,
+160,191,115, 1, 0, 0, 0, 0, 48,189,115, 1, 0, 0, 0, 0, 9, 0, 0, 0, 51, 51, 51, 63,192,167,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,237,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 12, 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,205,204,204, 61, 5, 0, 0, 0, 17, 0, 0, 0,225, 2, 0, 0,227, 2, 0, 0, 5, 0, 0, 0, 17, 0, 0, 0,
+207, 2, 0, 0,227, 2, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,160,191,115, 1, 0, 0, 0, 0,133, 0, 0, 0, 1, 0, 0, 0,
+ 16,193,115, 1, 0, 0, 0, 0,208,190,115, 1, 0, 0, 0, 0, 6, 0, 0, 0, 51, 51, 51, 63,192,167,115, 1, 0, 0, 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, 67, 0, 0, 0, 0, 0, 0,128, 67,
+ 0, 0,120,190, 0, 0,159, 63, 0, 0,242,190, 0,128,188, 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,124, 1, 0, 0, 0, 0, 0, 0,242, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 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,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, 68, 65, 84, 65, 48, 1, 0, 0, 16,193,115, 1, 0, 0, 0, 0,
+132, 0, 0, 0, 1, 0, 0, 0,128,194,115, 1, 0, 0, 0, 0,160,191,115, 1, 0, 0, 0, 0, 3, 0, 0, 0, 51, 51, 51, 63,
+192,167,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67,
+ 0, 0,209,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,182, 67, 0, 0,190,195, 0, 0, 0,181, 0, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0,190,195, 0, 0,190,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 1, 0, 1, 0, 1, 0,108, 1,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,142, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,
+128,194,115, 1, 0, 0, 0, 0,206, 0, 0, 0, 1, 0, 0, 0,128,195,115, 1, 0, 0, 0, 0, 16,193,115, 1, 0, 0, 0, 0,
+ 11, 0, 0, 0, 51, 51, 51, 63,192,167,115, 1, 0, 0, 0, 0, 0, 0,128,192, 0, 0,122, 67, 0, 0,128,192, 0, 0,127, 67,
+ 0, 0,128,192, 0, 0, 72, 66, 0, 0,128,192, 0, 0,127, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0,124, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0,
+ 0, 0,128, 63, 0,128,129, 67, 0, 0,250, 70, 0,128,129, 67,205,204,204, 61, 0, 0, 32, 65, 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, 68, 65, 84, 65,192, 0, 0, 0,128,195,115, 1, 0, 0, 0, 0,
+134, 0, 0, 0, 1, 0, 0, 0,128,196,115, 1, 0, 0, 0, 0,128,194,115, 1, 0, 0, 0, 0, 13, 0, 0, 0, 51, 51, 51, 63,
+192,167,115, 1, 0, 0, 0, 0, 0, 0, 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,122, 68, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,160,192, 0, 0,130, 66, 0, 0, 0, 0, 0, 0,182, 67,
+108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,124, 1, 0, 0,196, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,
+196, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,122, 68, 0, 0,122, 68,
+205,204,204, 61, 0, 0, 72, 66, 10, 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, 68, 65, 84, 65,208, 0, 0, 0,128,196,115, 1, 0, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,
+144,197,115, 1, 0, 0, 0, 0,128,195,115, 1, 0, 0, 0, 0, 12, 0, 0, 0, 51, 51, 51, 63,192,167,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 2, 66, 0, 0,122,196, 0, 0, 0, 0,
+ 0, 0, 0,191, 0, 0, 2, 66, 0, 0,150,194, 0, 0,160, 64,108, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 14, 2, 0, 0,
+128, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 0,108, 1, 0, 0, 16, 0, 0, 0, 14, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250, 70, 0, 0,122, 68, 10,215, 35, 60, 0, 0, 72, 66, 10, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,168, 1, 0, 0,144,197,115, 1, 0, 0, 0, 0,
+131, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,196,115, 1, 0, 0, 0, 0, 5, 0, 0, 0, 51, 51, 51, 63,
+192,167,115, 1, 0, 0, 0, 0, 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, 0, 0, 0, 83, 97,118,101, 32, 70,105,108,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 85,115,101,
+114,115, 47,116,111,110, 47, 68,101,115,107,116,111,112, 47, 0,114, 47,114,101,108,101, 97,115,101, 47,100, 97,116, 97,102,105,
+108,101,115, 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, 0,112,114,101,118,
+105,101,119, 46, 98,108,101,110,100, 0, 0, 0, 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, 0, 0, 0, 8, 0, 46, 0, 0, 0, 0, 0, 85, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 24, 6, 0, 0,128,199,115, 1, 0, 0, 0, 0,
+122, 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, 67,112,114,101,118,105,101,119, 0, 0, 99,101,110,101, 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,160,248,115, 1, 0, 0, 0, 0,224,235,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,205,115, 1, 0, 0, 0, 0,128,215,115, 1, 0, 0, 0, 0,
+192,206,115, 1, 0, 0, 0, 0, 84,213,149, 63,126,238, 7,193, 36,109,142, 63, 52, 84,142, 55,194, 12,188,192, 28, 38, 71, 64,
+ 52, 84,142, 55,194, 12,188,192, 28, 38, 71, 64, 52, 84,142, 55,194, 12,188,192, 28, 38, 71, 64, 1, 0, 0, 0, 65,245,214, 62,
+ 1, 0, 0, 0, 0, 0, 0, 0, 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,215,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,216,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 20, 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, 0, 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, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 25, 0,141, 0, 88, 2, 88, 2,100, 0,100, 0, 2, 0, 2, 0, 0, 0,
+ 24, 0, 4, 0, 0, 0, 0, 0, 90, 0, 16, 0, 0, 0, 32, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 5, 0, 25, 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, 0, 0, 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,217,115, 1, 0, 0, 0, 0, 64,217,115, 1, 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,
+ 5, 0, 2, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47,102,116,121,112,101, 0, 64, 38, 35, 0, 0, 0, 0, 0, 64, 94, 0, 0, 64, 38, 94, 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, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,192,249,117, 1, 0, 0, 0, 0, 1, 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,
+ 68, 65, 84, 65, 40, 0, 0, 0,224,205,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 80,206,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 34, 3, 28, 2,176, 6,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 80,206,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,192,206,115, 1, 0, 0, 0, 0,
+224,205,115, 1, 0, 0, 0, 0, 14, 4, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 34, 3,228, 2, 0, 2,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,192,206,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 48,207,115, 1, 0, 0, 0, 0,
+ 80,206,115, 1, 0, 0, 0, 0, 0, 4, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0,116, 3,187, 1,144, 88,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 48,207,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,160,207,115, 1, 0, 0, 0, 0,
+192,206,115, 1, 0, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 0, 0, 16, 0, 0,224, 46, 49, 1, 96, 46,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,160,207,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 16,208,115, 1, 0, 0, 0, 0,
+ 48,207,115, 1, 0, 0, 0, 0, 33, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 34, 3, 28, 2,192, 50,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 16,208,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,128,208,115, 1, 0, 0, 0, 0,
+160,207,115, 1, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 20, 0, 0,224, 46, 52, 0, 0, 42,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,128,208,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,240,208,115, 1, 0, 0, 0, 0,
+ 16,208,115, 1, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 20, 0, 0,224, 46, 47, 0,160, 37,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,240,208,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 96,209,115, 1, 0, 0, 0, 0,
+128,208,115, 1, 0, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 20, 0, 0,224, 46, 85, 1, 64, 33,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 96,209,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,208,209,115, 1, 0, 0, 0, 0,
+240,208,115, 1, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 20, 0, 0,224, 46,158, 0,224, 28,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,208,209,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 64,210,115, 1, 0, 0, 0, 0,
+ 96,209,115, 1, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 20, 0, 0,224, 46,100, 0,128, 24,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 64,210,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,176,210,115, 1, 0, 0, 0, 0,
+208,209,115, 1, 0, 0, 0, 0, 4, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0,254, 1,152, 1,224, 83,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,176,210,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 32,211,115, 1, 0, 0, 0, 0,
+ 64,210,115, 1, 0, 0, 0, 0, 14, 4, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 34, 3,228, 2, 0,253,115, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 32,211,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,144,211,115, 1, 0, 0, 0, 0,
+176,210,115, 1, 0, 0, 0, 0, 64, 0, 0, 0, 13, 0, 0, 0, 0, 16, 0, 0,252, 1,162, 2,208, 74,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,144,211,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 0,212,115, 1, 0, 0, 0, 0,
+ 32,211,115, 1, 0, 0, 0, 0, 64, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,249, 1,199, 1, 48, 79,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 0,212,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,112,212,115, 1, 0, 0, 0, 0,
+144,211,115, 1, 0, 0, 0, 0, 32, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,253, 1,124, 1,144, 95,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,112,212,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,224,212,115, 1, 0, 0, 0, 0,
+ 0,212,115, 1, 0, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,254, 1,125, 1, 32, 70,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,224,212,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 80,213,115, 1, 0, 0, 0, 0,
+112,212,115, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 31, 3, 28, 2,112, 55,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 80,213,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,192,213,115, 1, 0, 0, 0, 0,
+224,212,115, 1, 0, 0, 0, 0, 28, 4, 0, 0, 4, 0, 0, 0, 0, 20, 0, 0,224, 46,152, 1, 96, 11,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,192,213,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 48,214,115, 1, 0, 0, 0, 0,
+ 80,213,115, 1, 0, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0,254, 1,125, 1,112, 65,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 48,214,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,160,214,115, 1, 0, 0, 0, 0,
+192,213,115, 1, 0, 0, 0, 0, 28, 4, 0, 0, 5, 0, 0, 0, 0, 20, 0, 0,224, 46, 44, 0, 32, 20,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,160,214,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 16,215,115, 1, 0, 0, 0, 0,
+ 48,214,115, 1, 0, 0, 0, 0, 8, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0,194, 1,152, 1, 32, 60,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0, 16,215,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0,128,215,115, 1, 0, 0, 0, 0,
+160,214,115, 1, 0, 0, 0, 0, 28, 4, 0, 0, 6, 0, 0, 0, 0, 20, 0, 0,224, 46, 20, 0,192, 15,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,128,215,115, 1, 0, 0, 0, 0,107, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 16,215,115, 1, 0, 0, 0, 0,223, 5, 0, 0, 7, 0, 0, 0, 0, 4, 0, 0,224, 46, 62, 0,160,248,115, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,240,215,115, 1, 0, 0, 0, 0,106, 0, 0, 0, 1, 0, 0, 0, 44, 1, 0, 0, 1, 0, 2, 0,
+ 1, 0, 2, 0, 0, 0, 1, 0,244, 1,200, 0,100, 0, 20, 0, 16, 39, 0, 0,205,204,204, 61, 0, 0,240, 65, 0, 0, 0, 64,
+ 68, 65, 84, 65,152, 0, 0, 0, 96,216,115, 1, 0, 0, 0, 0,119, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0,205,204, 76, 63,
+ 0, 0,180, 66, 9, 0, 1, 0, 0, 0,128, 63,111, 18,131, 58, 32, 0, 32, 0, 32, 0, 1, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 5, 0, 5, 0,255,255,
+ 50, 0, 50, 0, 10, 0, 0, 0, 50, 0,100, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0,
+ 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 50, 0, 50, 0, 10, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 0,
+ 23,183,209, 56,205,204,204, 61, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 80, 0, 0, 0, 64,217,115, 1, 0, 0, 0, 0,
+112, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 32, 82,101,110,100,101,114,
+ 76, 97,121,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,
+160,243,115, 1, 0, 0, 0, 0,255,255, 15, 0,255,127, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 73, 77, 0, 0,176, 1, 0, 0,
+208,217,115, 1, 0, 0, 0, 0, 28, 0, 0, 0, 1, 0, 0, 0,224,201,114, 1, 0, 0, 0, 0, 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, 73,109, 97,103,101, 46, 48, 48, 49, 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, 85,110,116,105,116,108,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,108,110,134, 68, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 73, 77, 0, 0,176, 1, 0, 0,224,201,114, 1, 0, 0, 0, 0, 28, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+208,217,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 82,101,110,100,101,114,
+ 32, 82,101,115,117,108,116, 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, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 4, 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, 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, 1, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0,168, 0, 0, 0,192,219,115, 1, 0, 0, 0, 0, 26, 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, 46, 48, 48, 49, 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, 12, 0,205,204, 76, 62,117,148, 96, 66, 76, 39,176, 64,210, 69,112, 66, 0, 0,240, 65,
+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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,104, 1, 0, 0,176,220,115, 1, 0, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0,
+ 96,222,115, 1, 0, 0, 0, 0, 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, 46, 48, 48, 50, 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, 1, 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,160, 65,182,152,143, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+ 32,105,122, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 63, 0, 0, 32, 66, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,
+ 0, 2, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0, 32,105,122, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0,
+ 1, 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, 64, 75,122, 1, 0, 0, 0, 0,128,143,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 24, 0, 0, 0, 64, 75,122, 1, 0, 0, 0, 0,
+ 0, 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,
+ 76, 65, 0, 0,104, 1, 0, 0, 96,222,115, 1, 0, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0, 16,224,115, 1, 0, 0, 0, 0,
+176,220,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 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, 8, 16, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,205,204, 12, 64,247,255,239, 65,
+ 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0,192,118, 1, 0, 0, 0, 0,
+ 4, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0, 1, 0, 0, 0,
+ 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 48, 1, 0, 0, 0,192,118, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 1, 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,
+112,193,118, 1, 0, 0, 0, 0,192, 63,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 24, 0, 0, 0,112,193,118, 1, 0, 0, 0, 0, 0, 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, 76, 65, 0, 0,104, 1, 0, 0,
+ 16,224,115, 1, 0, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0,192,225,115, 1, 0, 0, 0, 0, 96,222,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 49, 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, 16, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,102,102,102, 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, 0, 0, 0, 0, 0,176,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 46, 26,128, 63,
+ 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,
+ 0,176,118, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 1, 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,112,177,118, 1, 0, 0, 0, 0,
+144,132,117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 68, 65, 84, 65, 24, 0, 0, 0,112,177,118, 1, 0, 0, 0, 0, 0, 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, 76, 65, 0, 0,104, 1, 0, 0,192,225,115, 1, 0, 0, 0, 0,
+ 36, 0, 0, 0, 1, 0, 0, 0,112,227,115, 1, 0, 0, 0, 0, 16,224,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 51, 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, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63,200,182, 27, 63,
+ 0, 0,128, 63, 0, 0, 0, 0,208,155,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66,
+ 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,208,155,118, 1, 0, 0, 0, 0,
+ 2, 1, 0, 0, 1, 0, 0, 0, 1, 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, 64,157,118, 1, 0, 0, 0, 0,224,144,117, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 24, 0, 0, 0,
+ 64,157,118, 1, 0, 0, 0, 0, 0, 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, 76, 65, 0, 0,104, 1, 0, 0,112,227,115, 1, 0, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0,
+ 32,229,115, 1, 0, 0, 0, 0,192,225,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 76, 65, 83,112,111,116, 46, 48, 48, 52, 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, 16, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+205,204,204, 62,247,255,239, 65, 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63,200,182, 27, 63, 0, 0,128, 63, 0, 0, 0, 0,
+160,157,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,
+ 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,160,157,118, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0,
+ 1, 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, 16,159,118, 1, 0, 0, 0, 0, 48,157,117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 24, 0, 0, 0, 16,159,118, 1, 0, 0, 0, 0,
+ 0, 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,
+ 76, 65, 0, 0,104, 1, 0, 0, 32,229,115, 1, 0, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0,208,230,115, 1, 0, 0, 0, 0,
+112,227,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48,
+ 48, 53, 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, 8, 16, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 80, 78, 83, 63,247,255,239, 65,
+ 0, 0,150, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,112,159,118, 1, 0, 0, 0, 0,
+ 4, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0, 1, 0, 0, 0,
+ 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 48, 1, 0, 0,112,159,118, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 1, 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,
+224,160,118, 1, 0, 0, 0, 0,128,169,117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 24, 0, 0, 0,224,160,118, 1, 0, 0, 0, 0, 0, 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, 76, 65, 0, 0,104, 1, 0, 0,
+208,230,115, 1, 0, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0,128,232,115, 1, 0, 0, 0, 0, 32,229,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 54, 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, 2, 0, 8, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 51, 51,179, 63,247,255,239, 65, 0, 0, 72, 66,171,156, 8, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 16, 76,118, 1, 0, 0, 0, 0, 4, 0, 0, 0, 78,207, 68, 65,
+ 25, 4,240, 65, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64, 0, 2, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,
+ 16, 76,118, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 1, 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,128, 77,118, 1, 0, 0, 0, 0,
+208,181,117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,
+ 68, 65, 84, 65, 24, 0, 0, 0,128, 77,118, 1, 0, 0, 0, 0, 0, 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, 76, 65, 0, 0,104, 1, 0, 0,128,232,115, 1, 0, 0, 0, 0,
+ 36, 0, 0, 0, 1, 0, 0, 0, 48,234,115, 1, 0, 0, 0, 0,208,230,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 55, 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, 16, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 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, 0, 0, 0, 0,224, 77,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 46, 26,128, 63, 25, 4,240, 65, 0, 0, 52, 66,
+ 0, 0,128, 63, 0, 0, 64, 64, 64, 11, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,224, 77,118, 1, 0, 0, 0, 0,
+ 2, 1, 0, 0, 1, 0, 0, 0, 1, 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, 80, 79,118, 1, 0, 0, 0, 0, 32,194,117, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 24, 0, 0, 0,
+ 80, 79,118, 1, 0, 0, 0, 0, 0, 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, 76, 65, 0, 0,104, 1, 0, 0, 48,234,115, 1, 0, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,128,232,115, 1, 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, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0,192, 63, 0, 0,160, 65, 0, 0, 52, 66,154,153, 25, 62, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+176, 79,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 63, 0, 0, 32, 66, 0, 0, 52, 66, 0, 0,128, 63, 0, 0, 64, 64,
+ 0, 2, 3, 0, 1, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 1, 0, 0,176, 79,118, 1, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0,
+ 1, 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, 32, 81,118, 1, 0, 0, 0, 0,176,207,117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 68, 65, 84, 65, 24, 0, 0, 0, 32, 81,118, 1, 0, 0, 0, 0,
+ 0, 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,
+ 87, 79, 0, 0,152, 1, 0, 0,224,235,115, 1, 0, 0, 0, 0,105, 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,141, 47, 79, 62, 64, 19,209, 62, 73, 23, 14, 63, 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,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, 1, 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, 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, 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, 84, 88, 0, 0,152, 0, 0, 0,192,237,115, 1, 0, 0, 0, 0,
+ 24, 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, 88, 84,101,120,116, 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, 7, 0, 0, 0, 1, 0, 0, 0,
+160,238,115, 1, 0, 0, 0, 0,160,238,115, 1, 0, 0, 0, 0,160,238,115, 1, 0, 0, 0, 0,160,238,115, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 96,239,115, 1, 0, 0, 0, 0,255,255,255,255, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 40, 0, 0, 0,160,238,115, 1, 0, 0, 0, 0, 23, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 16,239,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69, 69, 82, 70,
+ 68, 65, 84, 65, 4, 0, 0, 0, 16,239,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 71, 82, 0, 0,
+ 96, 0, 0, 0,160,243,115, 1, 0, 0, 0, 0,208, 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, 71, 82, 79,118,101,114,114,105,100,101, 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, 64,244,115, 1,
+ 0, 0, 0, 0, 48,248,115, 1, 0, 0, 0, 0,255,255, 15, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 64,244,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0,176,244,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 46,116, 1,
+ 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,176,244,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0, 32,245,115, 1, 0, 0, 0, 0, 64,244,115, 1, 0, 0, 0, 0, 0, 42,116, 1,
+ 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, 32,245,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0,144,245,115, 1, 0, 0, 0, 0,176,244,115, 1, 0, 0, 0, 0,160, 37,116, 1,
+ 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,144,245,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0, 0,246,115, 1, 0, 0, 0, 0, 32,245,115, 1, 0, 0, 0, 0, 64, 33,116, 1,
+ 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, 0,246,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0,112,246,115, 1, 0, 0, 0, 0,144,245,115, 1, 0, 0, 0, 0,224, 28,116, 1,
+ 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,112,246,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0,224,246,115, 1, 0, 0, 0, 0, 0,246,115, 1, 0, 0, 0, 0,128, 24,116, 1,
+ 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,224,246,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0, 80,247,115, 1, 0, 0, 0, 0,112,246,115, 1, 0, 0, 0, 0,208, 74,116, 1,
+ 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, 80,247,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0,192,247,115, 1, 0, 0, 0, 0,224,246,115, 1, 0, 0, 0, 0, 96, 11,116, 1,
+ 0, 0, 0, 0,160, 44,191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0,192,247,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0, 48,248,115, 1, 0, 0, 0, 0, 80,247,115, 1, 0, 0, 0, 0, 32, 20,116, 1,
+ 0, 0, 0, 0,240,189,126, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 40, 0, 0, 0, 48,248,115, 1,
+ 0, 0, 0, 0,207, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,247,115, 1, 0, 0, 0, 0,192, 15,116, 1,
+ 0, 0, 0, 0,176, 51,191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 32, 4, 0, 0,160,248,115, 1,
+ 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0, 0,253,115, 1, 0, 0, 0, 0, 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, 46, 48, 48, 49, 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, 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,253, 72, 1, 62, 0,204, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,148, 64, 68, 65, 84, 65,
- 0, 0, 0,228, 2,236,150, 96, 0, 0, 0,137, 0, 0, 0, 1, 0, 0, 0, 0, 2,236,149, 80, 84,114, 97,110,115,102,111,114,
-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, 86,105,101,119, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,228, 1, 62, 0,204,
- 0, 0, 0, 0, 0,162, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 0, 5, 30,232, 32,
- 0, 0, 0,113, 0, 0, 0, 1, 2,236,151,112, 0, 0, 0, 0, 0, 0, 0, 1, 63, 51, 51, 51, 2,236,136,160, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 37,127,255,255, 37,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 51,160, 0, 0,191,128, 0, 0, 0, 0, 0, 0,165,128, 0, 0, 63,128, 0, 0, 51,162, 33,104, 0, 0, 0, 0, 60, 41,199, 78,
-191,230,129,210,193, 30,230,225, 63,128, 0, 0, 63,128, 0, 0, 37,127,255,254,165,127,255,255, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,127,255,255, 0, 0, 0, 0, 0, 0, 0, 0,191,128, 0, 1, 51,160, 0, 0, 0, 0, 0, 0,188, 41,199, 79,
-193, 30,230,226, 63,230,129,216, 63,128, 0, 0, 63, 79, 65,254, 37,132,161, 17,165,153,211,206,165,128, 0, 0, 61, 60, 82,171,
- 60,131, 1,253, 63,153,211,206, 63,128, 0, 0,177,110,137,200, 63,134,173, 25,179,194,216, 54,179,162, 33,104, 62,238, 21, 90,
-191,222, 51, 78,190, 61,126, 0, 65, 30,230,225, 63,158, 26, 70, 37,158, 26, 69,165,158, 26, 71,153,128, 0, 0, 0, 0, 0, 0,
- 51,144, 0, 0, 63,115, 79, 65, 0, 0, 0, 0, 58, 96, 32, 0, 63, 81,196, 5,190, 24, 37, 84,189,168,248,231,189,108,210, 23,
- 60,122, 37,233, 62, 39, 71,242, 61,203, 17, 30, 63, 79, 65,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,134,173, 25, 0, 0, 0, 0, 0, 0, 0, 0,189, 60, 82,171,188,131, 1,211,191,153,211,206,191,128, 0, 0,128, 0, 0, 0,
-128, 0, 0, 0,193, 65,236,225,128, 0, 0, 0, 63,128, 0, 0, 37,127,255,255, 37,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 51,160, 0, 0,191,128, 0, 0, 0, 0, 0, 0,165,128, 0, 0, 63,128, 0, 0, 51,162, 33,104, 0, 0, 0, 0, 60, 41,199, 78,
-191,230,129,210,193, 30,230,225, 63,128, 0, 0, 63, 53, 4,244,191, 53, 4,243,165, 53, 4,243, 36,181, 4,242, 65, 98,160,147,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 5, 30,248, 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, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0,255,251, 0, 0, 66, 12, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 59, 37,224,208, 60, 35,215, 10, 67,250, 0, 0,188,218, 18,228,188, 23,180, 37, 62, 24, 35, 81,
-190, 55, 52, 64,191,230,153,244, 54,224, 0, 0, 63, 88,146, 56, 64, 71, 37,198, 0, 20, 0, 0, 0, 7, 0,207, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0,255,255, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 10,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,204, 2,236,151,112, 0, 0, 0,118, 0, 0, 0, 1, 2,236,152,112,
- 5, 30,232, 32, 0, 0, 0, 4, 0, 0, 0, 0, 2,236,136,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, 2, 0, 4, 0, 0, 0, 0, 68,160, 0, 0,196, 46, 0, 0, 67,100, 0, 0, 55,136,197,197,
- 68, 78,209,118,195,231,222, 40, 67, 25,158,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,128, 0, 0,
- 66, 40, 0, 0, 69, 0, 0, 0, 67,225, 0, 0, 63, 0, 0, 0, 63,154,225, 72, 0, 0, 0, 1, 0, 1, 0, 1, 3,233, 2,235,
- 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0, 0, 1,150, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 4, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 40, 2,236,152,112, 0, 0, 0,117, 0, 0, 0, 1, 2,236,153,192,
- 2,236,151,112, 0, 0, 0, 2, 63, 51, 51, 51, 2,236,136,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, 67,122, 0, 0,189,204,204,205, 63,140,204,205, 63,128, 0, 0, 67,122, 0, 0,
-192,160, 0, 0, 64,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 2,235, 0, 0, 0, 16, 0, 0, 3,168,
- 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 16, 0, 0, 3,168, 0, 0, 0, 16, 0, 0, 2,235, 60, 35,215, 10, 60, 35,215, 10,
- 70,106, 96, 0, 68,122, 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, 5, 31, 16, 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, 29, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,122, 0, 0,189,204,204,205,
- 63,140,204,205, 68, 65, 84, 65, 0, 0, 0,120, 2,236,153,192, 0, 0, 0,124, 0, 0, 0, 1, 2,236,154, 96, 2,236,152,112,
- 0, 0, 0, 9, 63, 51, 51, 51, 2,236,136,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,183,112,
- 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 5, 0, 0, 0, 17, 0, 0, 2,225, 0, 0, 2,227,
- 0, 0, 0, 5, 0, 0, 0, 17, 0, 0, 2,207, 0, 0, 2,227, 68, 65, 84, 65, 0, 0, 0,248, 2,236,154, 96, 0, 0, 0,122,
- 0, 0, 0, 1, 2,236,155,128, 2,236,153,192, 0, 0, 0, 6, 63, 51, 51, 51, 2,236,136,160, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,128, 0, 0, 0, 0, 0, 0, 67,128, 0, 0,190,120, 0, 0, 63,159, 0, 0,
-190,242, 0, 0, 63,188,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, 1,124, 0, 0, 0, 0, 0, 0, 1,242, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 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, 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, 68, 65, 84, 65,
- 0, 0, 0,248, 2,236,155,128, 0, 0, 0,121, 0, 0, 0, 1, 2,236,156,160, 2,236,154, 96, 0, 0, 0, 3, 63, 51, 51, 51,
- 2,236,136,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,195,209, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 67,182, 0, 0,195,190, 0, 0,181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0,
- 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 1,124, 0, 0, 0, 0,
- 0, 0, 1,124,195,190, 0, 0,195,190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 1, 0, 1,
- 0, 1, 0, 1, 1,108, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,142, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2,236,156,160, 0, 0, 0,194, 0, 0, 0, 1, 2,236,157,112,
- 2,236,155,128, 0, 0, 0, 11, 63, 51, 51, 51, 2,236,136,160,192,128, 0, 0, 67,122, 0, 0,192,128, 0, 0, 67,127, 0, 0,
-192,128, 0, 0, 66, 72, 0, 0,192,128, 0, 0, 67,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, 1,124, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0, 16, 0, 0, 1,124,
- 63,128, 0, 0, 67,129,128, 0, 70,250, 0, 0, 67,129,128, 0, 61,204,204,205, 65, 32, 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, 68, 65, 84, 65,
- 0, 0, 0,164, 2,236,157,112, 0, 0, 0,123, 0, 0, 0, 1, 2,236,158, 64, 2,236,156,160, 0, 0, 0, 13, 63, 51, 51, 51,
- 2,236,136,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, 63,128, 0, 0,
- 68,122, 0, 0, 0, 0, 0, 0, 68,122, 0, 0,192,160, 0, 0, 66,130, 0, 0, 0, 0, 0, 0, 67,182, 0, 0, 0, 0, 1,108,
- 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 1,124, 0, 0, 0,196, 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,196,
- 0, 0, 1,108, 0, 0, 0, 16, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 0, 68,122, 0, 0, 68,122, 0, 0, 61,204,204,205,
- 66, 72, 0, 0, 0, 10, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,176, 2,236,158, 64,
- 0, 0, 0,203, 0, 0, 0, 1, 2,236,159, 32, 2,236,157,112, 0, 0, 0, 12, 63, 51, 51, 51, 2,236,136,160, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 0, 0, 0, 66, 2, 0, 0,193,128, 0, 0, 67,247, 0, 0,191, 0, 0, 0,
- 66, 2, 0, 0,193,128, 0, 0, 67,247, 0, 0, 0, 0, 1,108, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 2, 14, 0, 0, 0,128,
- 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 1,108, 0, 0, 0, 16, 0, 0, 2, 14, 0, 0, 0, 0,
- 0, 0, 0, 0, 70,250, 0, 0, 68,122, 0, 0, 60, 35,215, 10, 66, 72, 0, 0, 0, 10, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1,104,
- 2,236,159, 32, 0, 0, 0,120, 0, 0, 0, 1, 0, 0, 0, 0, 2,236,158, 64, 0, 0, 0, 5, 63, 51, 51, 51, 2,236,136,160,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 83, 97,118,101, 32, 70,105,108,
-101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 85,115,101,114,115, 47,116,111,110, 47, 68,101,115,107,116,
-111,112, 47, 0,114, 47,114,101,108,101, 97,115,101, 47,100, 97,116, 97,102,105,108,101,115, 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, 0,112,114,101,118,105,101,119, 46, 98,108,101,110,100, 0, 0, 0,
- 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, 0, 0, 0,
- 0, 8, 0, 46, 0, 0, 0, 0, 1, 85, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67, 0, 0, 4,156, 5, 30,236, 32,
- 0, 0, 0,111, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 67,112,114,101,118,105,101,
-119, 0, 0, 99,101,110,101, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 30,248, 32,
- 2,236,182, 32, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,160,176, 2,236,167,144, 2,236,165,176, 63,149,213, 84,193, 7,238,126,
- 63,142,109, 36, 55,142, 84, 52,192,188, 12,194, 64, 71, 38, 28, 55,142, 84, 52,192,188, 12,194, 64, 71, 38, 28, 55,142, 84, 52,
-192,188, 12,194, 64, 71, 38, 28, 0, 0, 0, 1, 62,214,245, 65, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236,167,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,168, 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, 2, 0, 0, 0, 1, 0, 0, 0, 20,
- 0, 0, 0,100, 0, 0, 0,100, 0, 0, 0, 1, 0, 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, 2,128, 1,224, 0, 60, 0, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 25, 0,141, 2, 88,
- 2, 88, 0,100, 0,100, 0, 2, 0, 2, 0, 0, 0, 24, 0, 4, 0, 0, 0, 0, 0, 90, 0, 16, 0, 0, 0, 0, 0, 0, 0, 64,
- 0, 0, 0, 0, 0, 0, 0, 5, 0, 25, 0, 10, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,168,176,
- 2,236,168,176, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 5, 0, 2, 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, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 47,102,116,
-121,112,101, 0, 64, 38, 35, 0, 0, 0, 0, 0, 64, 94, 0, 0, 64, 38, 94, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2,233, 81,160, 0, 1, 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, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,160,176, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,161, 0, 0, 0, 0, 0,
- 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 0, 1,255, 1,124, 5, 31, 4, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,161, 0,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,161, 80, 2,236,160,176, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 0, 1,255, 1,252,
- 5, 31, 0, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,161, 80, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,161,160, 2,236,161, 0,
- 0, 0, 4, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1,203, 1, 72, 5, 31, 76, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,161,160,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,161,240, 2,236,161, 80, 0, 0, 0, 32, 0, 0, 0, 4, 0, 0, 16, 0, 46,224, 1, 49,
- 5, 31, 40, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,161,240, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,162, 64, 2,236,161,160,
- 0, 0, 0, 33, 0, 0, 0, 2, 0, 0, 0, 0, 1,255, 1,124, 5, 31, 44, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,162, 64,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,162,144, 2,236,161,240, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 20, 0, 46,224, 0, 52,
- 5, 31, 36, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,162,144, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,162,224, 2,236,162, 64,
- 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 20, 0, 46,224, 0, 47, 5, 31, 32, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,162,224,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,163, 48, 2,236,162,144, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 20, 0, 46,224, 1, 85,
- 5, 31, 28, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,163, 48, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,163,128, 2,236,162,224,
- 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 20, 0, 46,224, 0,158, 5, 31, 24, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,163,128,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,163,208, 2,236,163, 48, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 20, 0, 46,224, 0,100,
- 5, 31, 20, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,163,208, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,164, 32, 2,236,163,128,
- 0, 0, 0, 4, 0, 0, 0, 11, 0, 0, 0, 0, 1,254, 1,152, 5, 31, 72, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,164, 32,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,164,112, 2,236,163,208, 0, 0, 4, 14, 0, 0, 0, 5, 0, 0, 0, 0, 1,255, 1,252,
- 5, 30,252, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,164,112, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,164,192, 2,236,164, 32,
- 0, 0, 0, 64, 0, 0, 0, 13, 0, 0, 16, 0, 1,252, 2,162, 5, 31, 64, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,164,192,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,165, 16, 2,236,164,112, 0, 0, 0, 64, 0, 0, 0, 14, 0, 0, 0, 0, 1,249, 1,199,
- 5, 31, 68, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,165, 16, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,165, 96, 2,236,164,192,
- 0, 0, 0, 32, 0, 0, 0, 15, 0, 0, 0, 0, 1,253, 1,124, 5, 31, 80, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,165, 96,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,165,176, 2,236,165, 16, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 0, 1,254, 1,125,
- 5, 31, 60, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,165,176, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,166, 0, 2,236,165, 96,
- 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 1, 1,253, 1,125, 5, 31, 48, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,166, 0,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,166, 80, 2,236,165,176, 0, 0, 4, 28, 0, 0, 0, 2, 0, 0, 20, 0, 46,224, 1,152,
- 5, 31, 8, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,166, 80, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,166,160, 2,236,166, 0,
- 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 0, 1,254, 1,125, 5, 31, 56, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,166,160,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,166,240, 2,236,166, 80, 0, 0, 4, 28, 0, 0, 0, 3, 0, 0, 20, 0, 46,224, 0, 44,
- 5, 31, 16, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,166,240, 0, 0, 0, 98, 0, 0, 0, 1, 2,236,167, 64, 2,236,166,160,
- 0, 0, 0, 8, 0, 0, 0, 21, 0, 0, 0, 0, 1,194, 1,152, 5, 31, 52, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,167, 64,
- 0, 0, 0, 98, 0, 0, 0, 1, 2,236,167,144, 2,236,166,240, 0, 0, 4, 28, 0, 0, 0, 4, 0, 0, 20, 0, 46,224, 0, 20,
- 5, 31, 12, 32, 68, 65, 84, 65, 0, 0, 0, 28, 2,236,167,144, 0, 0, 0, 98, 0, 0, 0, 1, 0, 0, 0, 0, 2,236,167, 64,
- 0, 0, 5,223, 0, 0, 0, 6, 0, 0, 4, 0, 46,224, 0, 62, 5, 30,248, 32, 68, 65, 84, 65, 0, 0, 0, 40, 2,236,167,224,
- 0, 0, 0, 97, 0, 0, 0, 1, 1, 44, 0, 0, 0, 1, 0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 1,244, 0,200, 0,100, 0, 20,
- 0, 0, 39, 16, 61,204,204,205, 65,240, 0, 0, 64, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 76, 2,236,168, 48, 0, 0, 0,108,
- 0, 0, 0, 1, 0, 1, 0, 1, 63, 76,204,205, 66,180, 0, 0, 0, 9, 0, 1, 63,128, 0, 0, 58,131, 18,111, 0, 32, 0, 32,
- 0, 32, 0, 1, 63,128, 0, 0, 63,128, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 56,209,183, 23, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 64, 2,236,168,176, 0, 0, 0,103,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 49, 32, 82,101,110,100,101,114, 76, 97,121,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, 2,236,184, 64, 0, 15,255,255, 0, 0,127,255, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 73, 77, 0, 0, 1,116, 2,236,169, 32, 0, 0, 0, 28, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 73, 77, 73,109, 97,103,101, 46, 48, 48, 49, 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, 85,110,116,105,116,108,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, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,134,110,108,
- 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 67, 65, 0, 0, 0,128, 2,236,170,192, 0, 0, 0, 25, 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, 46, 48, 48, 49, 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, 12, 62, 76,204,205, 0, 0, 0, 0,
- 64,176, 39, 76, 66,112, 69,210, 65,240, 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, 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, 0, 2,236,171,112, 0, 0, 0, 36, 0, 0, 0, 1, 2,236,172,160, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 76, 65, 76, 97,109,112, 46, 48, 48, 50, 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, 2, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 65,160, 0, 0, 66,143,152,182, 62, 25,153,154, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 66, 32, 0, 0, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 2, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 2,236,172,160,
- 0, 0, 0, 36, 0, 0, 0, 1, 2,236,173,208, 2,236,171,112, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 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, 16, 8,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 64, 12,204,205, 65,239,255,247, 66,150, 0, 0,
- 62, 25,153,154, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0,
- 64, 64, 0, 0, 11, 64, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 2,236,173,208, 0, 0, 0, 36, 0, 0, 0, 1, 2,236,175, 0,
- 2,236,172,160, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 49, 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, 16, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,102,102,102, 65,239,255,247, 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 11, 64, 0, 3, 0, 1, 0, 0,
- 0, 0, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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, 0, 2,236,175, 0, 0, 0, 0, 36, 0, 0, 0, 1, 2,236,176, 48, 2,236,173,208, 0, 0, 0, 0, 0, 0, 0, 0,
- 76, 65, 83,112,111,116, 46, 48, 48, 51, 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, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 65,239,255,247, 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0, 63, 27,182,200, 63,128, 0, 0, 63,128, 26, 46, 65,240, 4, 25,
- 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 11, 64, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 2,236,176, 48, 0, 0, 0, 36,
- 0, 0, 0, 1, 2,236,177, 96, 2,236,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 52, 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, 16, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62,204,204,205, 65,239,255,247, 66,150, 0, 0, 62, 25,153,154,
- 63,128, 0, 0, 63, 27,182,200, 63,128, 0, 0, 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0,
- 11, 64, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 2,236,177, 96, 0, 0, 0, 36, 0, 0, 0, 1, 2,236,178,144, 2,236,176, 48,
- 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 53, 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, 16, 8, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63, 83, 78, 80, 65,239,255,247, 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 11, 64, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1,
- 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 0,
- 2,236,178,144, 0, 0, 0, 36, 0, 0, 0, 1, 2,236,179,192, 2,236,177, 96, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,
-111,116, 46, 48, 48, 54, 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, 2, 0, 8, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,179, 51, 51, 65,239,255,247,
- 66, 72, 0, 0, 63, 8,156,171, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 65, 68,207, 78, 65,240, 4, 25, 66, 52, 0, 0,
- 63,128, 0, 0, 64, 64, 0, 0, 2, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 2,236,179,192, 0, 0, 0, 36, 0, 0, 0, 1,
- 2,236,180,240, 2,236,178,144, 0, 0, 0, 0, 0, 0, 0, 0, 76, 65, 83,112,111,116, 46, 48, 48, 55, 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, 16, 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, 65,239,255,247, 66,150, 0, 0, 62, 25,153,154, 63,128, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 63,128, 26, 46, 65,240, 4, 25, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 11, 64, 0, 3,
- 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 2,236,180,240, 0, 0, 0, 36, 0, 0, 0, 1, 0, 0, 0, 0, 2,236,179,192, 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, 1, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,192, 0, 0, 65,160, 0, 0, 66, 52, 0, 0, 62, 25,153,154, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0,
- 66, 32, 0, 0, 66, 52, 0, 0, 63,128, 0, 0, 64, 64, 0, 0, 2, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1,
- 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 1, 40, 2,236,182, 32,
- 0, 0, 0, 96, 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, 62, 79, 47,141, 62,209, 19, 64, 63, 14, 23, 73, 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, 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, 1, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 88, 0, 0, 0,104, 2,236,183,112, 0, 0, 0, 23,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 88, 84,101,120,116, 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, 7,
- 0, 0, 0, 1, 2,236,184, 0, 2,236,184, 0, 2,236,184, 0, 2,236,184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 30,242, 32,
-255,255,255,255, 0, 0, 4, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236,184, 0, 0, 0, 0, 22, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 2,233, 30,112, 0, 0, 0, 0, 0, 0, 0, 0, 70, 82, 69, 69, 68, 65, 84, 65, 0, 0, 0, 4,
- 2,233, 30,112, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 71, 82, 0, 0, 0, 68, 2,236,184, 64, 0, 0, 0,196,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 82, 79,118,101,114,114,105,100,101, 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, 2,236,184,176, 2,236,186,240,
- 0, 15,255,255, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236,184,176, 0, 0, 0,195, 0, 0, 0, 1, 2,236,184,240,
- 0, 0, 0, 0, 5, 31, 40, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236,184,240,
- 0, 0, 0,195, 0, 0, 0, 1, 2,236,185, 48, 2,236,184,176, 5, 31, 36, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 24, 2,236,185, 48, 0, 0, 0,195, 0, 0, 0, 1, 2,236,185,112, 2,236,184,240, 5, 31, 32, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236,185,112, 0, 0, 0,195, 0, 0, 0, 1,
- 2,236,185,176, 2,236,185, 48, 5, 31, 28, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24,
- 2,236,185,176, 0, 0, 0,195, 0, 0, 0, 1, 2,236,185,240, 2,236,185,112, 5, 31, 24, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236,185,240, 0, 0, 0,195, 0, 0, 0, 1, 2,236,186, 48, 2,236,185,176,
- 5, 31, 20, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236,186, 48, 0, 0, 0,195,
- 0, 0, 0, 1, 2,236,186,112, 2,236,185,240, 5, 31, 64, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 24, 2,236,186,112, 0, 0, 0,195, 0, 0, 0, 1, 2,236,186,176, 2,236,186, 48, 5, 31, 8, 32, 5,157,146, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236,186,176, 0, 0, 0,195, 0, 0, 0, 1, 2,236,186,240,
- 2,236,186,112, 5, 31, 16, 32, 5,157,150, 32, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 24, 2,236,186,240,
- 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0, 0, 2,236,186,176, 5, 31, 12, 32, 5,157,154, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 79, 66, 0, 0, 3, 16, 5, 30,248, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 30,252, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 66, 67, 97,109,101,114, 97, 46, 48, 48, 49, 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, 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, 2,236,170,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,188, 41,199, 78,
-193, 30,230,225, 63,230,129,216, 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,201, 15,218, 37,128, 0, 0,
- 37,127,255,255, 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, 63,128, 0, 0, 37,127,255,255,165,128, 0, 0, 0, 0, 0, 0,
- 37,127,255,255, 51,162, 33,105, 63,128, 0, 0, 0, 0, 0, 0, 37,128, 0, 0,191,128, 0, 0, 51,162, 33,105, 0, 0, 0, 0,
-188, 41,199, 78,193, 30,230,225, 63,230,129,216, 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,137,145,110, 60, 24,136,133,160, 0, 0, 0, 0,
- 25,127,255,254, 63,128, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,165,127,255,255,176,136, 90, 64, 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, 5,223, 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,
- 64, 0, 0, 0, 63,128, 0, 0, 63,100, 41, 6, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 63,100, 41, 6, 0, 0, 0, 0,
- 2, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 3, 16, 5, 30,252, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 0, 32, 5, 30,248, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 49, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0,
- 0, 1, 4, 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, 2,236,213, 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, 2,235, 92,144,
- 55,142, 84, 52,192,188, 12,194, 64, 71, 38, 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, 64,190, 36, 69, 64,190, 36, 69, 64,190, 36, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-128, 0, 0, 0, 63, 73, 15,218, 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, 64,134,115, 83, 64,134,115, 82, 0, 0, 0, 0,
- 0, 0, 0, 0,192,134,115, 82, 64,134,115, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,190, 36, 68,
- 0, 0, 0, 0, 55,142, 84, 52,192,188, 12,194, 64, 71, 38, 28, 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,243,183,207,189,243,183,205, 37,162, 83,160,
- 0, 0, 0, 0, 50, 26, 90, 29, 50, 26, 90, 31, 62, 44, 85,173, 0, 0, 0, 0,189,243,183,205,189,243,183,207, 50, 87,107, 24,
- 0, 0, 0, 0,190,247,176,158,190,246,108,212,190, 97,232, 64, 63,128, 0, 0, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 68,
- 0, 1, 0, 2, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205,
- 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 64, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,235,190, 48, 2,235,196, 48, 0, 0, 0, 89,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,235, 92,144, 0, 0, 0, 0, 0, 0, 0, 1, 2,236,191,224,
- 0, 0, 79, 66, 0, 0, 3, 16, 5, 31, 0, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 4, 32, 5, 30,252, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2,236,208,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, 2,235,151,176, 55,142, 84, 52,
-192,188, 12,194, 64, 71, 38, 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,
- 64,190, 36, 69, 64,190, 36, 69, 64,190, 36, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,
- 63, 73, 15,218, 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, 64,134,115, 83, 64,134,115, 82, 0, 0, 0, 0, 0, 0, 0, 0,
-192,134,115, 82, 64,134,115, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,190, 36, 68, 0, 0, 0, 0,
- 55,142, 84, 52,192,188, 12,194, 64, 71, 38, 28, 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,243,183,207,189,243,183,205, 37,162, 83,160, 0, 0, 0, 0,
- 50, 26, 90, 29, 50, 26, 90, 31, 62, 44, 85,173, 0, 0, 0, 0,189,243,183,205,189,243,183,207, 50, 87,107, 24, 0, 0, 0, 0,
-190,247,176,158,190,246,108,212,190, 97,232, 64, 63,128, 0, 0, 0, 0, 4, 14, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2,
- 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0,
- 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 64, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,235,177,128, 2,235,183,144, 0, 0, 0, 89, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,235,151,176, 0, 0, 0, 0, 0, 0, 0, 1, 2,236,189, 96, 0, 0, 79, 66,
- 0, 0, 3, 16, 5, 31, 4, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 8, 32, 5, 31, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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,
- 2,236,218, 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, 2,230, 6, 0, 60,102,131, 0, 64,164,112, 14,
- 63,229,211, 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, 65, 34,159,178,
- 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,178, 89,250,166,
- 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, 65, 34,159,178,180, 10,120,151, 0, 0, 0, 0, 0, 0, 0, 0, 52, 10,120,151,
- 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0, 60,102,131, 0,
- 64,164,112, 14, 63,229,211, 24, 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,201,126,231, 48,171,145,219,163,201, 66, 34, 0, 0, 0, 0,164,167,209, 65,
- 49,255, 57, 51, 61,201,126,232, 0, 0, 0, 0, 48,172, 66,235,189,201,126,231, 49,251,201, 70, 0, 0, 0, 0,187, 29,136, 18,
-191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 1, 1,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,229,237, 0, 2,229,242,240, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 2,230, 6, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,236,191,224, 0, 0, 79, 66, 0, 0, 3, 16,
- 5, 31, 8, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 12, 32, 5, 31, 4, 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, 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, 2,236,172,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, 65,110, 57, 42, 64, 11,114,237, 64,121, 99,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, 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,103, 90, 85,190,186, 45,254, 63,128,209,115, 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, 62,255,247,136, 63, 74, 39, 37, 62,182, 26,138, 0, 0, 0, 0,191, 44, 21,164, 61,194, 67, 28,
- 63, 59,248,176, 0, 0, 0, 0, 63, 11,203,251,191, 27, 45,217, 63, 20, 7, 47, 0, 0, 0, 0, 65,110, 57, 42, 64, 11,114,237,
- 64,121, 99,120, 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, 62,255,247,138,191, 44, 21,164, 63, 11,203,251, 0, 0, 0, 0, 62,182, 26,141, 63, 59,248,176,
- 63, 20, 7, 45, 0, 0, 0, 0,191, 74, 39, 37,189,194, 67, 9, 63, 27, 45,217, 0, 0, 0, 0,193,142, 14,147, 64,234,125, 35,
-192, 0,119, 85, 63,128, 0, 0, 0, 0, 4, 28, 20, 0, 0, 0, 0, 0, 0, 68, 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,
- 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 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, 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, 79, 66,
- 0, 0, 3, 16, 5, 31, 12, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 16, 32, 5, 31, 8, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66, 76, 97,109,112, 46, 48, 48, 49, 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, 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,
- 2,236,173,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,191,210, 76, 84,193, 71,162,178,
- 64,178,186,210, 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,103, 90, 85,190,186, 45,254, 63,128,209,115,
- 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, 62,255,247,136, 63, 74, 39, 37, 62,182, 26,138, 0, 0, 0, 0,191, 44, 21,164,
- 61,194, 67, 28, 63, 59,248,176, 0, 0, 0, 0, 63, 11,203,251,191, 27, 45,217, 63, 20, 7, 47, 0, 0, 0, 0,191,210, 76, 84,
-193, 71,162,178, 64,178,186,210, 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, 62,255,247,136,191, 44, 21,164, 63, 11,203,251, 0, 0, 0, 0, 62,182, 26,139,
- 63, 59,248,173, 63, 20, 7, 44, 0, 0, 0, 0,191, 74, 39, 36,189,194, 67, 17, 63, 27, 45,217, 0, 0, 0, 0, 63,189,129,191,
-192,104,159,176,192, 53,194,132, 63,128, 0, 0, 0, 0, 4, 28, 20, 0, 0, 0, 0, 0, 0, 68, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 0, 0,
- 1, 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, 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, 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, 79, 66, 0, 0, 3, 16, 5, 31, 16, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 20, 32, 5, 31, 12, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 50, 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, 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, 2,236,178,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 16,188,238,
-193, 57,119,229, 65,141,218, 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,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 15, 79,202,191, 12,100,179,
- 63,234, 92,112, 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,190, 96,197,171, 63, 83, 27,149, 63, 5,118, 10, 0, 0, 0, 0,
-191, 99,218,142, 61, 75, 4,109,190,232, 3,179, 0, 0, 0, 0,190,204,142,233,191, 16, 64,104, 63, 57, 28,174, 0, 0, 0, 0,
-193, 16,188,238,193, 57,119,229, 65,141,218, 17, 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,190, 96,197,175,191, 99,218,143,190,204,142,235, 0, 0, 0, 0,
- 63, 5,118, 11,190,232, 3,179, 63, 57, 28,172, 0, 0, 0, 0,191, 83, 27,150,189, 75, 4,119, 63, 16, 64,105, 0, 0, 0, 0,
-193, 14,181,128,191, 61,177,214,193,128,133, 29, 63,128, 0, 0, 0, 0, 4, 28, 20, 0, 0, 0, 0, 0, 0, 68, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0,
- 4, 0, 0, 0, 1, 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, 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, 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, 79, 66, 0, 0, 3, 16, 5, 31, 20, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 24, 32, 5, 31, 16, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 51, 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, 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, 2,236,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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,104,147,176,193, 23, 84, 42, 64,171, 77,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, 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,103, 90, 85,
-190,186, 45,254, 63,128,209,115, 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, 62,255,247,136, 63, 74, 39, 37, 62,182, 26,138,
- 0, 0, 0, 0,191, 44, 21,164, 61,194, 67, 28, 63, 59,248,176, 0, 0, 0, 0, 63, 11,203,251,191, 27, 45,217, 63, 20, 7, 47,
- 0, 0, 0, 0, 64,104,147,176,193, 23, 84, 42, 64,171, 77,116, 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, 62,255,247,137,191, 44, 21,165, 63, 11,203,251,
- 0, 0, 0, 0, 62,182, 26,141, 63, 59,248,176, 63, 20, 7, 46, 0, 0, 0, 0,191, 74, 39, 37,189,194, 67, 20, 63, 27, 45,217,
- 0, 0, 0, 0,192, 93, 99, 91,190, 80, 98,136,192,112,119,223, 63,128, 0, 0, 0, 0, 0, 1, 20, 0, 0, 0, 0, 0, 0, 68,
- 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205,
- 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 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, 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, 79, 66, 0, 0, 3, 16, 5, 31, 24, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 28, 32,
- 5, 31, 20, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 52, 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, 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, 2,236,176, 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,192,251,147,249,193, 24, 0,206,192,104,131, 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, 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,103, 90, 85,190,186, 45,254, 63,128,209,115, 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, 62,255,247,136, 63, 74, 39, 37,
- 62,182, 26,138, 0, 0, 0, 0,191, 44, 21,164, 61,194, 67, 28, 63, 59,248,176, 0, 0, 0, 0, 63, 11,203,251,191, 27, 45,217,
- 63, 20, 7, 47, 0, 0, 0, 0,192,251,147,249,193, 24, 0,206,192,104,131, 67, 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, 62,255,247,137,191, 44, 21,165,
- 63, 11,203,251, 0, 0, 0, 0, 62,182, 26,139, 63, 59,248,176, 63, 20, 7, 45, 0, 0, 0, 0,191, 74, 39, 36,189,194, 67, 19,
- 63, 27, 45,217, 0, 0, 0, 0, 64,176,142,147,191,170, 22, 97, 64,246, 28, 27, 63,128, 0, 0, 0, 0, 0, 1, 20, 0, 0, 0,
- 0, 0, 0, 68, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0,
- 61,204,204,205, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 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, 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, 79, 66, 0, 0, 3, 16, 5, 31, 28, 32, 0, 0, 0, 90, 0, 0, 0, 1,
- 5, 31, 32, 32, 5, 31, 24, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 53, 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, 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, 2,236,177, 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, 65, 54, 41,142,191,115,124, 24,192, 58,215,162, 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,103, 90, 85,190,186, 45,254, 63,128,209,115, 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, 62,255,247,136,
- 63, 74, 39, 37, 62,182, 26,138, 0, 0, 0, 0,191, 44, 21,164, 61,194, 67, 28, 63, 59,248,176, 0, 0, 0, 0, 63, 11,203,251,
-191, 27, 45,217, 63, 20, 7, 47, 0, 0, 0, 0, 65, 54, 41,142,191,115,124, 24,192, 58,215,162, 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, 62,255,247,136,
-191, 44, 21,164, 63, 11,203,251, 0, 0, 0, 0, 62,182, 26,139, 63, 59,248,175, 63, 20, 7, 46, 0, 0, 0, 0,191, 74, 39, 36,
-189,194, 67, 25, 63, 27, 45,217, 0, 0, 0, 0,193, 49,192,139, 65, 36, 99, 40, 63,249,156, 89, 63,128, 0, 0, 0, 0, 0, 2,
- 20, 0, 0, 0, 0, 0, 0, 68, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205,
- 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 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, 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, 79, 66, 0, 0, 3, 16, 5, 31, 32, 32, 0, 0, 0, 90,
- 0, 0, 0, 1, 5, 31, 36, 32, 5, 31, 28, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48, 48, 54, 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, 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, 2,236,178,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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 19,239,220,193, 54,239,215, 65, 60, 9, 42, 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,191,103,251, 67,191, 24, 27,164, 64, 3,136, 37, 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,
-190,197,143, 31, 63, 59,184,209, 63, 15, 80,138, 0, 0, 0, 0,191, 64, 66, 57, 61,210,119,132,191, 38,249,118, 0, 0, 0, 0,
-191, 9, 43, 37,191, 44, 15, 35, 63, 2,212,114, 0, 0, 0, 0,193, 19,239,220,193, 54,239,215, 65, 60, 9, 42, 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,
-190,197,143, 31,191, 64, 66, 56,191, 9, 43, 35, 0, 0, 0, 0, 63, 15, 80,139,191, 38,249,117, 63, 2,212,112, 0, 0, 0, 0,
-191, 59,184,208,189,210,119,142, 63, 44, 15, 35, 0, 0, 0, 0,193, 0,135,195,190,148,252,127,193, 48,180, 8, 63,128, 0, 0,
- 0, 0, 0, 2, 20, 0, 0, 0, 0, 0, 0, 68, 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, 61, 35,215, 10, 63,128, 0, 0,
- 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 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, 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, 79, 66, 0, 0, 3, 16, 5, 31, 36, 32,
- 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 40, 32, 5, 31, 32, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,109,112, 46, 48,
- 48, 55, 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, 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, 2,236,179,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,192,164, 99,104,193, 51,244,239, 64, 19,110,188, 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,103, 90, 85,190,186, 45,254, 63,128,209,115, 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, 62,255,247,136, 63, 74, 39, 37, 62,182, 26,138, 0, 0, 0, 0,191, 44, 21,164, 61,194, 67, 28, 63, 59,248,176,
- 0, 0, 0, 0, 63, 11,203,251,191, 27, 45,217, 63, 20, 7, 47, 0, 0, 0, 0,192,164, 99,104,193, 51,244,239, 64, 19,110,188,
- 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, 62,255,247,137,191, 44, 21,165, 63, 11,203,251, 0, 0, 0, 0, 62,182, 26,139, 63, 59,248,178, 63, 20, 7, 45,
- 0, 0, 0, 0,191, 74, 39, 36,189,194, 67, 18, 63, 27, 45,217, 0, 0, 0, 0, 64, 91, 24, 96,192,108, 50,226, 63,219, 9,101,
- 63,128, 0, 0, 0, 0, 0, 2, 20, 0, 0, 0, 0, 0, 0, 68, 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, 61, 35,215, 10,
- 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 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, 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, 79, 66, 0, 0, 3, 16,
- 5, 31, 40, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 44, 32, 5, 31, 36, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 76, 97,
-109,112, 46, 48, 48, 56, 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, 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, 2,236,180,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, 63,188, 75,145,193,107,197, 44, 64, 81,147, 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, 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,201, 15,218, 37,128, 0, 0, 37,127,255,255, 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, 63,128, 0, 0, 37,127,255,255,165,128, 0, 0, 0, 0, 0, 0, 37,127,255,255, 51,162, 33,105,
- 63,128, 0, 0, 0, 0, 0, 0, 37,128, 0, 0,191,128, 0, 0, 51,162, 33,105, 0, 0, 0, 0, 63,188, 75,145,193,107,197, 44,
- 64, 81,147, 5, 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,178, 23, 25, 45,179, 75,199,107, 0, 0, 0, 0,153,236,127, 0, 63,128, 0, 0,
- 40, 0, 0, 0, 0, 0, 0, 0,177,108,127, 0, 50, 29, 9,206, 63,128, 0, 0, 0, 0, 0, 0,191,189,159, 32,191,188,164, 47,
-192,153,188,150, 63,128, 0, 0, 0, 0, 0, 32, 16, 0, 0, 0, 0, 0, 0, 68, 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,
- 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 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,
- 0, 0, 3, 16, 5, 31, 44, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 48, 32, 5, 31, 40, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66, 99,104,101, 99,107,101,114,115, 0, 0,108, 97,110,101, 46, 48, 48, 51, 0, 0, 0, 0, 0, 1, 4, 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,
- 2,236,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,233, 65, 80, 60,102,131, 0, 64,164,112, 14,
- 63,229,211, 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, 65, 34,159,178,
- 65, 34,159,178, 65, 34,159,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 0, 0,178, 89,250,166,
- 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, 65, 34,159,178,180, 10,120,151, 0, 0, 0, 0, 0, 0, 0, 0, 52, 10,120,151,
- 65, 34,159,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, 34,159,177, 0, 0, 0, 0, 60,102,131, 0,
- 64,164,112, 14, 63,229,211, 24, 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,201,126,231, 48,171,145,219,163,201, 66, 34, 0, 0, 0, 0,164,167,209, 65,
- 49,255, 57, 51, 61,201,126,232, 0, 0, 0, 0, 48,172, 66,235,189,201,126,231, 49,251,201, 70, 0, 0, 0, 0,187, 29,136, 18,
-191,189,200,203, 58, 9,139,180, 63,128, 0, 0, 0, 0, 0, 33, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 1, 1,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,232,181,208, 2,233, 28, 32, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 2,233, 65, 80, 0, 0, 0, 0, 0, 0, 0, 1, 2,236,189, 96, 0, 0, 79, 66, 0, 0, 3, 16,
- 5, 31, 48, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 52, 32, 5, 31, 44, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,
-101,118,105,101,119, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,236,248,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, 2,230, 32,176,189, 7, 82,100,191,103,204, 21, 63,230,165,241,
- 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,155, 39,153, 64,155, 39,153,
- 64,155, 39,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,201, 15,218, 37,192, 0, 0, 36,255,255,255, 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, 64,155, 39,153, 38, 27, 39,152,166,232,187,102, 0, 0, 0, 0, 38,232,187,102, 52,196,134,157,
- 64,155, 39,153, 0, 0, 0, 0, 38, 27, 39,154,192,155, 39,153, 52,196,134,157, 0, 0, 0, 0,189, 7, 82,100,191,103,204, 21,
- 63,230,165,241, 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, 62, 83, 50, 25, 35,211, 50, 28,163,211, 50, 23, 0, 0, 0, 0,163,211, 50, 27, 62, 83, 50, 25,
- 38,174, 59,158, 0, 0, 0, 0,173,204, 94, 0,175, 96, 79,158, 62, 83, 50, 25, 0, 0, 0, 0, 59,153, 62,135,185,110, 94,217,
- 63,238, 71,118, 63,128, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 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,
- 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2,235,168, 32, 2,235,172,208, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 4, 2,230, 32,176, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 16, 5, 31, 52, 32,
- 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 56, 32, 5, 31, 48, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,
-119, 46, 48, 48, 50, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2,236,203,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, 2,236,187, 48, 2,236,187, 48, 2,233, 41,192,191,213,187,242, 63,134,145,194, 64, 35,100,254, 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, 0,243, 65, 28, 0,246, 65, 28, 0,243,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,135,110, 48, 62, 59,169,180,191, 1,115,138, 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, 65, 6, 49,198,192,148,154,115,191,227,113, 3, 0, 0, 0, 0, 64,106,250,159, 64, 91,207,189, 65, 5,170, 80,
- 0, 0, 0, 0,192, 86,151, 46,192,251, 94,125, 64,150,127,188, 0, 0, 0, 0,191,213,187,242, 63,134,145,194, 64, 35,100,254,
- 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,180,174,143, 61, 30, 48,160,189, 16,118,223, 0, 0, 0, 0,188,153, 29,162, 61,179,248, 38, 61, 74,162,115,
- 0, 0, 0, 0, 61, 72, 21, 15,189, 19,250,160, 61,169, 57, 88, 0, 0, 0, 0, 63, 50,107, 4,190,204, 46, 88, 63, 79,206,177,
- 63,128, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 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, 61, 35,215, 10,
- 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2,230, 90, 96, 2,235, 93,240, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
- 2,233, 41,192, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 68, 2,236,187, 48, 0, 0, 0, 69,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 31, 83,117, 98,115,117,114,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, 1, 0, 1, 0, 8,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 16, 5, 31, 56, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 60, 32,
- 5, 31, 52, 32, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 51, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 4, 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, 2,236,243,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,
- 2,230, 42, 80,187,203,194, 16, 63, 45, 89,155, 63,230,153,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, 63, 72,135, 56, 63, 72,135, 56, 63, 72,135, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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, 63, 72,135, 56, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 72,135, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 72,135, 56, 0, 0, 0, 0,187,203,194, 16, 63, 45, 89,155, 63,230,153,244, 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,163,104,144, 37,163,104,143,
-165,163,104,143, 0, 0, 0, 0, 37,165,104, 66, 51,206,250,252, 63,163,104,144, 0, 0, 0, 0,173,202,240, 60,191,163,104,144,
- 51,204, 63,183, 0, 0, 0, 0,187,173, 93,105,193, 88,176,172,186,118, 52, 95, 63,128, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
- 0, 0, 0, 68, 0, 1, 0, 2, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0,
- 61,204,204,205, 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 32, 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, 2,236, 8,208, 2,236, 13,128,
- 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,230, 42, 80, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 3, 16, 5, 31, 60, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 64, 32, 5, 31, 56, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 4, 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, 2,236,243,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, 2,233,103, 32,
- 58, 10, 31, 0, 63,236, 94, 59, 63,231, 84,236, 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,110,188, 91, 63,110,188, 91, 63,110,188, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,201, 15,218,
-128, 0, 0, 0,128, 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, 63,110,188, 91, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 51,151, 50, 90, 63,110,188, 91, 0, 0, 0, 0, 0, 0, 0, 0,191,110,188, 91, 51,151, 50, 90,
- 0, 0, 0, 0, 58, 10, 31, 0, 63,236, 94, 59, 63,231, 84,236, 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,137, 65,160,165,137, 65,159,165,137, 65,161,
- 0, 0, 0, 0, 37,137, 65,160, 63,137, 65,160, 40, 19, 46,157, 0, 0, 0, 0, 45, 14,127,248,176,150,195,159, 63,137, 65,161,
- 0, 0, 0, 0,188, 63, 80, 29,187,226, 95, 62, 65, 74, 19, 87, 63,128, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 68,
- 0, 1, 0, 2, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205,
- 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 32, 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, 2,235,222, 64, 2,235,117, 16, 0, 0, 0, 25,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,233,103, 32, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 79, 66, 0, 0, 3, 16, 5, 31, 64, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 68, 32, 5, 31, 60, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 53, 0, 48, 48, 51, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2,236,171,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,189,195,155,128,
- 64,188,145, 20, 65, 88,220, 94, 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,134,180,221, 37,141,190, 48,
- 35, 57, 55,253, 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, 63,128, 0, 0, 35, 57, 55,253,165,141,190, 48, 0, 0, 0, 0,
- 37,112,128,219, 62,253,177, 52, 63, 94, 93, 94, 0, 0, 0, 0, 37, 22,133, 52,191, 94, 93, 94, 62,253,177, 52, 0, 0, 0, 0,
-189,195,155,128, 64,188,145, 20, 65, 88,220, 94, 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, 37, 16,252, 23,165, 70,176,196, 0, 0, 0, 0,
-174,231, 90, 80, 63, 94, 93, 94, 62,253,177, 52, 0, 0, 0, 0,172,239, 68, 0,190,253,177, 50, 63, 94, 93, 95, 0, 0, 0, 0,
- 61,174, 98,150,193,144,101, 85, 64,253,124,196, 63,128, 0, 0, 0, 0, 0, 64, 16, 0, 0, 0, 0, 0, 0, 68, 0, 5, 0, 1,
- 0, 0, 0, 0, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0,
- 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 64, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 3, 16, 5, 31, 68, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 72, 32, 5, 31, 64, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 4, 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, 2,237, 7, 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, 2,228, 97, 96,
-190,252, 52, 94, 65,228,101,174, 65, 17,116,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, 66, 30,239,235, 66, 30,239,236, 66, 30,239,235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 95,174,138,
- 37,123,132, 98,165, 87, 56, 61, 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, 66, 30,239,235,168, 5,158,105,168, 28, 39,108,
- 0, 0, 0, 0, 40, 77,129,212, 65,204, 15, 66, 65,243,186,158, 0, 0, 0, 0,165, 13, 89, 55,193,243,186,156, 65,204, 15, 65,
- 0, 0, 0, 0,190,252, 52, 94, 65,228,101,174, 65, 17,116,141, 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, 60,206, 43,101, 34,240,217,143,163, 18,165,201,
- 0, 0, 0, 0, 31,231, 14,226, 60,158, 20,101, 60,132, 89,193, 0, 0, 0, 0, 34,173, 83,190,188,132, 89,192, 60,158, 20,103,
- 0, 0, 0, 0, 60, 70,215, 11,191, 67, 43, 61, 63, 31,241,185, 63,128, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 68,
- 0, 1, 0, 2, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205,
- 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 64, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,235,205,112, 2,235,242,224, 0, 0, 0, 25,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,228, 97, 96, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 79, 66, 0, 0, 3, 16, 5, 31, 72, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 76, 32, 5, 31, 68, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 99,117, 98,101, 0,117, 98,101, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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, 2,237, 14,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, 2,233,120, 16, 59, 88,253,128,
- 63,160,118,220, 64, 37, 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,
- 64, 68, 88, 84, 64, 68, 88, 84, 64, 68, 88, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,237,190, 1,190,217,230,108,
- 63, 52,151, 20, 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, 64, 8, 38, 67, 63,231,228,191, 63,162, 31,186, 0, 0, 0, 0,
-192, 13,118, 35, 63,220, 61, 2, 63,160, 44, 31, 0, 0, 0, 0, 60,234, 52,166,191,227,223,102, 64, 31,229, 55, 0, 0, 0, 0,
- 59, 88,253,128, 63,160,118,220, 64, 37, 15, 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, 62,103,115, 10,190,112,122,201, 59, 71, 17,255, 0, 0, 0, 0,
- 62, 9,205,116, 62, 8, 36,205, 62,135,232,136, 0, 0, 0, 0,190, 69, 27, 1,190, 59, 50,224, 62, 65,176, 25, 0, 0, 0, 0,
-192, 16,176,110,192, 9, 71,158, 63,244, 90,115, 63,128, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2,
- 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0,
- 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0,
- 0, 0, 64, 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, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,235,226, 64, 2,235,211, 0, 0, 0, 0, 25, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,233,120, 16, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 79, 66,
- 0, 0, 3, 16, 5, 31, 76, 32, 0, 0, 0, 90, 0, 0, 0, 1, 5, 31, 80, 32, 5, 31, 72, 32, 0, 0, 0, 0, 0, 0, 0, 0,
- 79, 66,112,114,101,118,105,101,119,104, 97,105,114, 0,108, 97,110,101, 0, 0, 0, 0, 0, 0, 0, 1, 4, 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,
- 2,236,237,192, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,187,160, 2,236,187,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, 2,228, 54, 96, 63,200, 92, 86, 63,227,205, 7,
-189, 9,199,149, 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, 47,126,234,
- 64, 47,126,234, 64, 47,126,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 2, 80,225,191, 15,211, 5, 62, 18,219, 92,
- 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, 64, 18,254,224, 62,169,209, 23, 63,186,251, 27, 0, 0, 0, 0,191,133,254, 71,
- 64, 17, 40,207, 63,144,194,229, 0, 0, 0, 0,191,137, 38, 78,191,192,162, 48, 64, 1,176,125, 0, 0, 0, 0, 63,200, 92, 86,
- 63,227,205, 7,189, 9,199,149, 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, 62,156,100,244,190, 14,143,135,190, 17,235, 52, 0, 0, 0, 0, 62, 70,239,175,
- 62, 26, 4,102, 62,137,251, 72, 0, 0, 0, 0,189, 52,172,174,190,154,112,211, 62, 76,243, 67, 0, 0, 0, 0,191, 36, 56,149,
-192, 66, 98,139, 64, 68, 5,168, 63,128, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205, 0, 0, 0, 0, 4, 0, 1, 1,
- 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 0, 64, 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, 2,236,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, 25, 0, 0, 0, 0, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 4, 2,228, 54, 96, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 56,
- 2,236,187,160, 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 13, 0, 1, 0, 1, 0, 0, 0, 0,
- 63,128, 0, 0, 66,200, 0, 0, 66, 72, 0, 0, 0, 0, 0,150, 0, 0, 0, 8, 0, 0, 0, 0, 61,125,243, 64, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,189, 35,214,240, 0, 0, 0, 0,189,196,155,184, 0, 0, 0, 0, 61, 76,204,205,
- 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, 66, 72, 0, 0, 66, 72, 0, 0, 66, 72, 0, 0, 66, 72, 0, 0, 0, 4, 0, 4, 0, 4, 0, 4,
- 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 5, 0, 1, 0, 1, 0, 8, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62,156,100,244,
-190, 14,143,134,190, 17,235, 52, 0, 0, 0, 0, 61, 52,172,172, 62,154,112,211,190, 76,243, 69, 0, 0, 0, 0, 62, 70,239,176,
- 62, 26, 4,102, 62,137,251, 73, 0, 0, 0, 0,191, 12,211,188,190,160,176,198, 63, 22,156, 56, 63,128, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 44, 2,236,189, 0, 0, 0, 0, 92, 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, 61,204,204,205, 62, 76,204,205,
- 60,163,215, 10, 0, 0, 79, 66, 0, 0, 3, 16, 5, 31, 80, 32, 0, 0, 0, 90, 0, 0, 0, 1, 0, 0, 0, 0, 5, 31, 76, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,116,101,120,116,117,114,101, 0,114,101,118,105,101,119, 46, 48, 48, 53, 0, 0, 0, 0,
- 0, 1, 4, 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, 2,237, 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, 2,228,195, 96,
-188,183, 16, 61,191,103,204, 21, 63,228,234, 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, 64,155, 39,153, 64,155, 39,153, 64,155, 39,153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,201, 15,218,
- 37,192, 0, 0, 36,255,255,255, 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, 64,155, 39,153, 38, 27, 39,152,166,232,187,102,
- 0, 0, 0, 0, 38,232,187,102, 52,196,134,157, 64,155, 39,153, 0, 0, 0, 0, 38, 27, 39,154,192,155, 39,153, 52,196,134,157,
- 0, 0, 0, 0,188,183, 16, 61,191,103,204, 21, 63,228,234, 48, 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, 62, 83, 50, 25, 35,211, 50, 28,163,211, 50, 23,
- 0, 0, 0, 0,163,211, 50, 27, 62, 83, 50, 25, 38,174, 59,158, 0, 0, 0, 0,173, 44, 24, 0,175, 94,165,224, 62, 83, 50, 25,
- 0, 0, 0, 0, 59, 33,251,236, 59, 40, 37,135, 63,238, 71,118, 63,128, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 68,
- 0, 1, 0, 2, 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, 61, 35,215, 10, 63,128, 0, 0, 62,204,204,205, 0, 0, 0, 0, 61,204,204,205,
- 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 0, 64, 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,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,235, 92,192, 2,235,104,176, 0, 0, 0, 25,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,228,195, 96, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 77, 65, 0, 0, 1,184, 2,236,189, 96, 0, 0, 0, 38, 0, 0, 0, 1, 2,236,191,224, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 65, 99,104,101, 99,107,101,114,100, 97,114,107, 0, 0, 0, 97,116,101,114,105, 97, 0, 0, 0, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 61,221, 1,116, 61,220,251,200, 61,220,251,200, 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, 0, 0, 0,
- 63, 89,153,154, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 76,204,205, 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, 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128, 0, 0, 0, 2, 0, 2, 0, 1, 0, 6, 1, 64, 0, 3, 1, 64, 0, 3, 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, 1, 0, 0, 0, 0, 0, 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, 8, 16, 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, 2,236,191, 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, 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, 68, 65, 84, 65, 0, 0, 0,120, 2,236,191, 64, 0, 0, 0, 29, 0, 0, 0, 1,
- 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,202,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, 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,192, 0, 1, 63,192, 0, 1, 63,192, 0, 1, 0, 0, 0, 0, 56,209,183, 23, 56,209,177,184, 56,209,177,184, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 0, 0, 77, 65, 0, 0, 1,184,
- 2,236,191,224, 0, 0, 0, 38, 0, 0, 0, 1, 2,236,194, 96, 2,236,189, 96, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65, 99,104,
-101, 99,107,101,114,108,105,103,104,116, 0, 0, 0, 97,116,101,114,105, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 3, 0, 1, 62,157, 65,188, 62,157, 61,178, 62,157, 61,178, 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, 0, 0, 0, 63, 89,153,154, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 76,204,205, 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, 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 0, 2, 0, 2,
- 0, 1, 0, 6, 1, 64, 0, 3, 1, 64, 0, 3, 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, 2, 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, 8, 16, 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, 2,236,193,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, 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, 68, 65, 84, 65, 0, 0, 0,120, 2,236,193,192, 0, 0, 0, 29, 0, 0, 0, 1, 0, 16, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 2,236,202,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, 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, 56,209,183, 23, 56,209,177,184, 56,209,177,184, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63, 0, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 0, 0, 77, 65, 0, 0, 1,184, 2,236,194, 96, 0, 0, 0, 38,
- 0, 0, 0, 1, 2,236,196,224, 2,236,191,224, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,112,114,101,118,105,101,119, 0, 0, 97,
-116,101,114,105, 97,108, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63,128, 0, 0,
- 63, 54,232, 61, 63, 23,161,184, 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, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 62, 68,248,188,
- 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,130,121,198, 63,160, 0, 0,
- 0, 0, 0, 0, 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,205, 0, 2, 0, 2, 0, 50, 0, 6, 3, 17, 0, 3,
- 3, 17, 0, 3, 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, 1, 0, 0, 0, 0, 1, 0, 0, 0, 2,
- 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, 8, 1, 0, 1, 5, 31, 84, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 2,236,196, 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, 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, 68, 65, 84, 65,
- 0, 0, 0,120, 2,236,196, 64, 0, 0, 0, 29, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,201, 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,
- 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, 16, 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, 0, 0, 0, 63,128, 0, 0,
- 62, 76,204,205, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 3, 8, 5, 31, 84, 32, 0, 0, 0, 32, 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, 62,220, 40,245, 0, 0, 0, 0, 63,125,112,164,
- 63,128, 0, 0, 63, 24,214,106, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 1, 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,192,219,115, 1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,199, 41,188,225,230, 30,193,216,129,230, 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,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218, 15,201, 63, 0, 0,128, 37,255,255,127, 37, 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,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,255,255,127, 37, 0, 0,128,165, 0, 0, 0, 0,255,255,127, 37,105, 33,162, 51,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 37, 0, 0,128,191,105, 33,162, 51, 0, 0, 0, 0, 78,199, 41,188,225,230, 30,193,
+216,129,230, 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,
+ 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, 60,110,145,137,160,133,136, 24, 0, 0, 0, 0,254,255,127, 25, 0, 0,128, 63,
+ 0, 0, 0, 40, 0, 0, 0, 0,255,255,127,165, 64, 90,136,176, 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, 60,110,145,137,160,133,136, 24, 0, 0, 0, 0,254,255,127, 25, 0, 0,128, 63,
+ 0, 0, 0, 40, 0, 0, 0, 0,255,255,127,165, 64, 90,136,176, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,223, 5, 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, 0, 0, 0, 64, 0, 0,128, 63,
+ 6, 41,100, 63, 0, 0,128, 63,205,204,204, 62, 6, 41,100, 63, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 4, 0, 0, 0,253,115, 1, 0, 0, 0, 0, 99, 0, 0, 0,
+ 1, 0, 0, 0, 0, 2,116, 1, 0, 0, 0, 0,160,248,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48, 48, 49, 0, 46, 48, 48, 49, 0, 0, 0, 0, 0, 1, 0, 0, 4,
+ 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, 77, 65, 0, 0, 1,184, 2,236,196,224, 0, 0, 0, 38, 0, 0, 0, 1, 2,236,199, 96, 2,236,194, 96,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,116,101,120,116,117,114,101, 0,114,101,118,105,101,119, 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, 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,
- 63, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,204,205, 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, 63,160, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,204,204,205, 0, 2, 0, 2, 0, 50, 0, 6, 3, 1, 0, 71, 3, 1, 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, 3, 0, 0, 0, 2, 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, 8, 1, 0,129, 5, 31, 88, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 2,236,198,192, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 83,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2,236,198,192, 0, 0, 0, 29,
- 0, 0, 0, 1, 0, 1, 0,129, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,201, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,176, 1,116, 1, 0, 0, 0, 0, 52, 84,142, 55,194, 12,188,192, 28, 38, 71, 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, 69, 36,190, 64, 69, 36,190, 64, 68, 36,190, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,218, 15, 73, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 83,115,134, 64, 82,115,134, 64, 0, 0, 0, 0, 0, 0, 0, 0, 82,115,134,192, 83,115,134, 64, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 36,190, 64, 0, 0, 0, 0, 52, 84,142, 55,194, 12,188,192, 28, 38, 71, 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, 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,128,179, 0, 0, 0, 0, 0, 0,128, 63,
+207,183,243, 61,205,183,243,189,160, 83,162, 37, 0, 0, 0, 0, 29, 90, 26, 50, 31, 90, 26, 50,173, 85, 44, 62, 0, 0, 0, 0,
+205,183,243,189,207,183,243,189, 24,107, 87, 50, 0, 0, 0, 0,158,176,247,190,212,108,246,190, 64,232, 97,190, 0, 0,128, 63,
+ 14, 4, 0, 0, 0, 4, 1, 0, 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,
+205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,117,127, 1, 0, 0, 0, 0, 80,133,127, 1, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0,176, 1,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,224,103,116, 1,
+ 0, 0, 0, 0, 79, 66, 0, 0, 32, 4, 0, 0, 0, 2,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0,176, 6,116, 1,
+ 0, 0, 0, 0, 0,253,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,
+101, 99,107,101,114,115, 46, 48, 48, 50, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 6,116, 1,
+ 0, 0, 0, 0, 52, 84,142, 55,194, 12,188,192, 28, 38, 71, 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, 69, 36,190, 64, 69, 36,190, 64, 68, 36,190, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0,128,218, 15, 73, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 83,115,134, 64, 82,115,134, 64,
+ 0, 0, 0, 0, 0, 0, 0, 0, 82,115,134,192, 83,115,134, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 68, 36,190, 64, 0, 0, 0, 0, 52, 84,142, 55,194, 12,188,192, 28, 38, 71, 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, 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,128,179, 0, 0, 0, 0, 0, 0,128, 63,207,183,243, 61,205,183,243,189,
+160, 83,162, 37, 0, 0, 0, 0, 29, 90, 26, 50, 31, 90, 26, 50,173, 85, 44, 62, 0, 0, 0, 0,205,183,243,189,207,183,243,189,
+ 24,107, 87, 50, 0, 0, 0, 0,158,176,247,190,212,108,246,190, 64,232, 97,190, 0, 0,128, 63, 14, 4, 0, 0, 0, 4, 1, 0,
+ 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61,
+ 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 32,105, 1,
+ 0, 0, 0, 0,144,244,123, 1, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 8, 0, 0, 0, 96, 6,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 64,100,116, 1, 0, 0, 0, 0, 79, 66, 0, 0,
+ 32, 4, 0, 0,176, 6,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0, 96, 11,116, 1, 0, 0, 0, 0, 0, 2,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 46, 48,
+ 48, 51, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,162,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 11,116, 1, 0, 0, 0, 0, 0,131,102, 60,
+ 14,112,164, 64, 24,211,229, 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,
+178,159, 34, 65,178,159, 34, 65,177,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,
+166,250, 89,178, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,
+151,120, 10, 52,178,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0,
+ 0,131,102, 60, 14,112,164, 64, 24,211,229, 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, 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,231,126,201, 61,219,145,171, 48, 34, 66,201,163, 0, 0, 0, 0,
+ 65,209,167,164, 51, 57,255, 49,232,126,201, 61, 0, 0, 0, 0,235, 66,172, 48,231,126,201,189, 70,201,251, 49, 0, 0, 0, 0,
+ 18,136, 29,187,203,200,189,191,180,139, 9, 58, 0, 0,128, 63, 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 1, 1,
+ 1, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 36, 78, 1, 0, 0, 0, 0,128,105, 65, 1,
+ 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, 16, 11,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,224,103,116, 1, 0, 0, 0, 0, 79, 66, 0, 0, 32, 4, 0, 0, 96, 11,116, 1,
+ 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0,192, 15,116, 1, 0, 0, 0, 0,176, 6,116, 1, 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, 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, 96,222,115, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 57,110, 65,237,114, 11, 64,120, 99,121, 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, 85, 90,103, 63,254, 45,186,190,115,209,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,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0,136,247,255, 62, 37, 39, 74, 63,138, 26,182, 62, 0, 0, 0, 0,164, 21, 44,191, 28, 67,194, 61,
+176,248, 59, 63, 0, 0, 0, 0,251,203, 11, 63,217, 45, 27,191, 47, 7, 20, 63, 0, 0, 0, 0, 42, 57,110, 65,237,114, 11, 64,
+120, 99,121, 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,254,255,255, 38, 0, 0, 0, 51, 0, 0, 0, 0,254,255,255, 50,254,255,127, 63,
+254,255,127, 38, 0, 0, 0, 0, 0, 0, 64,179,254,255,127, 51, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0,128, 63,138,247,255, 62,164, 21, 44,191,251,203, 11, 63, 0, 0, 0, 0,141, 26,182, 62,176,248, 59, 63,
+ 45, 7, 20, 63, 0, 0, 0, 0, 37, 39, 74,191, 9, 67,194,189,217, 45, 27, 63, 0, 0, 0, 0,147, 14,142,193, 35,125,234, 64,
+ 85,119, 0,192, 0, 0,128, 63, 28, 4, 0, 0, 0, 20, 0, 0, 0, 0, 68, 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,
+ 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 4, 0, 0,192, 15,116, 1, 0, 0, 0, 0, 99, 0, 0, 0,
+ 1, 0, 0, 0, 32, 20,116, 1, 0, 0, 0, 0, 96, 11,116, 1, 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, 46, 48, 48, 49, 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, 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, 16,224,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 76,210,191,178,162, 71,193,210,186,178, 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, 85, 90,103, 63,254, 45,186,190,115,209,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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+136,247,255, 62, 37, 39, 74, 63,138, 26,182, 62, 0, 0, 0, 0,164, 21, 44,191, 28, 67,194, 61,176,248, 59, 63, 0, 0, 0, 0,
+251,203, 11, 63,217, 45, 27,191, 47, 7, 20, 63, 0, 0, 0, 0, 84, 76,210,191,178,162, 71,193,210,186,178, 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,
+254,255,127, 63,251,255,255, 50,251,255, 47, 52, 0, 0, 0, 0,251,255,127,180, 1, 0,128, 63,249,255,127, 52, 0, 0, 0, 0,
+251,255,159, 52,250,255,127,179,250,255,127, 63, 0, 0, 0, 0,254,255,127,181,251,255,255,168,251,255, 47,170, 0, 0,128, 63,
+136,247,255, 62,164, 21, 44,191,251,203, 11, 63, 0, 0, 0, 0,139, 26,182, 62,173,248, 59, 63, 44, 7, 20, 63, 0, 0, 0, 0,
+ 36, 39, 74,191, 17, 67,194,189,217, 45, 27, 63, 0, 0, 0, 0,191,129,189, 63,176,159,104,192,132,194, 53,192, 0, 0,128, 63,
+ 28, 4, 0, 0, 0, 20, 0, 0, 0, 0, 68, 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, 10,215, 35, 61, 0, 0,128, 63,
+205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 4, 0, 0, 32, 20,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0,128, 24,116, 1,
+ 0, 0, 0, 0,192, 15,116, 1, 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, 46, 48, 48, 50, 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, 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,208,230,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,238,188, 16,193,229,119, 57,193, 17,218,141, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+202, 79, 15,191,179,100, 12,191,112, 92,234, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,171,197, 96,190,149, 27, 83, 63,
+ 10,118, 5, 63, 0, 0, 0, 0,142,218, 99,191,109, 4, 75, 61,179, 3,232,190, 0, 0, 0, 0,233,142,204,190,104, 64, 16,191,
+174, 28, 57, 63, 0, 0, 0, 0,238,188, 16,193,229,119, 57,193, 17,218,141, 65, 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,179,
+ 2, 0,128, 51, 0, 0, 0, 0, 1, 0,160,179, 0, 0,128, 63, 0, 0, 32,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 2, 0,192,180, 3, 0,128, 51, 0, 0, 0, 54, 0, 0,128, 63,175,197, 96,190,143,218, 99,191,
+235,142,204,190, 0, 0, 0, 0, 11,118, 5, 63,179, 3,232,190,172, 28, 57, 63, 0, 0, 0, 0,150, 27, 83,191,119, 4, 75,189,
+105, 64, 16, 63, 0, 0, 0, 0,128,181, 14,193,214,177, 61,191, 29,133,128,193, 0, 0,128, 63, 28, 4, 0, 0, 0, 20, 0, 0,
+ 0, 0, 68, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61,
+ 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 0, 0,
+ 32, 4, 0, 0,128, 24,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0,224, 28,116, 1, 0, 0, 0, 0, 32, 20,116, 1,
+ 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, 46, 48, 48, 51, 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, 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,192,225,115, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,147,104, 64,
+ 42, 84, 23,193,116, 77,171, 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, 85, 90,103, 63,254, 45,186,190,
+115,209,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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,136,247,255, 62, 37, 39, 74, 63,138, 26,182, 62, 0, 0, 0, 0,
+164, 21, 44,191, 28, 67,194, 61,176,248, 59, 63, 0, 0, 0, 0,251,203, 11, 63,217, 45, 27,191, 47, 7, 20, 63, 0, 0, 0, 0,
+176,147,104, 64, 42, 84, 23,193,116, 77,171, 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,254,255,127, 63, 0, 0, 0, 0,255,255,191, 51, 0, 0, 0, 0,
+255,255,127, 51, 0, 0,128, 63,255,255,127,179, 0, 0, 0, 0,254,255,127,179, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0,
+255,255,127, 52, 0, 0,160, 52, 0, 0,128, 39, 0, 0,128, 63,137,247,255, 62,165, 21, 44,191,251,203, 11, 63, 0, 0, 0, 0,
+141, 26,182, 62,176,248, 59, 63, 46, 7, 20, 63, 0, 0, 0, 0, 37, 39, 74,191, 20, 67,194,189,217, 45, 27, 63, 0, 0, 0, 0,
+ 91, 99, 93,192,136, 98, 80,190,223,119,112,192, 0, 0,128, 63, 1, 0, 0, 0, 0, 16, 0, 0, 0, 0, 68, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 0, 0,
+ 1, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 4, 0, 0,224, 28,116, 1,
+ 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0, 64, 33,116, 1, 0, 0, 0, 0,128, 24,116, 1, 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, 46, 48, 48, 52, 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, 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,112,227,115, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,249,147,251,192,206, 0, 24,193, 67,131,104,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,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 90,103, 63,254, 45,186,190,115,209,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,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0,136,247,255, 62, 37, 39, 74, 63,138, 26,182, 62, 0, 0, 0, 0,164, 21, 44,191, 28, 67,194, 61,
+176,248, 59, 63, 0, 0, 0, 0,251,203, 11, 63,217, 45, 27,191, 47, 7, 20, 63, 0, 0, 0, 0,249,147,251,192,206, 0, 24,193,
+ 67,131,104,192, 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,254,255,255, 50, 0, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 0,254,255,127, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 50,254,255,255, 50, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128,181,255,255,191,180,
+ 1, 0,224, 52, 0, 0,128, 63,137,247,255, 62,165, 21, 44,191,251,203, 11, 63, 0, 0, 0, 0,139, 26,182, 62,176,248, 59, 63,
+ 45, 7, 20, 63, 0, 0, 0, 0, 36, 39, 74,191, 19, 67,194,189,217, 45, 27, 63, 0, 0, 0, 0,147,142,176, 64, 97, 22,170,191,
+ 27, 28,246, 64, 0, 0,128, 63, 1, 0, 0, 0, 0, 16, 0, 0, 0, 0, 68, 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,
+ 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 4, 0, 0, 64, 33,116, 1, 0, 0, 0, 0, 99, 0, 0, 0,
+ 1, 0, 0, 0,160, 37,116, 1, 0, 0, 0, 0,224, 28,116, 1, 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, 46, 48, 48, 53, 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, 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, 32,229,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 41, 54, 65, 24,124,115,191,162,215, 58,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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 85, 90,103, 63,254, 45,186,190,115,209,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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+136,247,255, 62, 37, 39, 74, 63,138, 26,182, 62, 0, 0, 0, 0,164, 21, 44,191, 28, 67,194, 61,176,248, 59, 63, 0, 0, 0, 0,
+251,203, 11, 63,217, 45, 27,191, 47, 7, 20, 63, 0, 0, 0, 0,142, 41, 54, 65, 24,124,115,191,162,215, 58,192, 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,
+136,247,255, 62,164, 21, 44,191,251,203, 11, 63, 0, 0, 0, 0,139, 26,182, 62,175,248, 59, 63, 46, 7, 20, 63, 0, 0, 0, 0,
+ 36, 39, 74,191, 25, 67,194,189,217, 45, 27, 63, 0, 0, 0, 0,139,192, 49,193, 40, 99, 36, 65, 89,156,249, 63, 0, 0,128, 63,
+ 2, 0, 0, 0, 0, 16, 0, 0, 0, 0, 68, 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, 10,215, 35, 61, 0, 0,128, 63,
+205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 4, 0, 0,160, 37,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0, 0, 42,116, 1,
+ 0, 0, 0, 0, 64, 33,116, 1, 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, 46, 48, 48, 54, 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, 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,208,230,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,239, 19,193,215,239, 54,193, 42, 9, 60, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 67,251,103,191,164, 27, 24,191, 37,136, 3, 64, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 31,143,197,190,209,184, 59, 63,
+138, 80, 15, 63, 0, 0, 0, 0, 57, 66, 64,191,132,119,210, 61,118,249, 38,191, 0, 0, 0, 0, 37, 43, 9,191, 35, 15, 44,191,
+114,212, 2, 63, 0, 0, 0, 0,220,239, 19,193,215,239, 54,193, 42, 9, 60, 65, 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, 31,143,197,190, 56, 66, 64,191,
+ 35, 43, 9,191, 0, 0, 0, 0,139, 80, 15, 63,117,249, 38,191,112,212, 2, 63, 0, 0, 0, 0,208,184, 59,191,142,119,210,189,
+ 35, 15, 44, 63, 0, 0, 0, 0,195,135, 0,193,127,252,148,190, 8,180, 48,193, 0, 0,128, 63, 2, 0, 0, 0, 0, 16, 0, 0,
+ 0, 0, 68, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61,
+ 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 0, 0,
+ 32, 4, 0, 0, 0, 42,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0, 96, 46,116, 1, 0, 0, 0, 0,160, 37,116, 1,
+ 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, 46, 48, 48, 55, 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, 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,128,232,115, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 99,164,192,
+239,244, 51,193,188,110, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85, 90,103, 63,254, 45,186,190,
+115,209,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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,136,247,255, 62, 37, 39, 74, 63,138, 26,182, 62, 0, 0, 0, 0,
+164, 21, 44,191, 28, 67,194, 61,176,248, 59, 63, 0, 0, 0, 0,251,203, 11, 63,217, 45, 27,191, 47, 7, 20, 63, 0, 0, 0, 0,
+104, 99,164,192,239,244, 51,193,188,110, 19, 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, 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,137,247,255, 62,165, 21, 44,191,251,203, 11, 63, 0, 0, 0, 0,
+139, 26,182, 62,178,248, 59, 63, 45, 7, 20, 63, 0, 0, 0, 0, 36, 39, 74,191, 18, 67,194,189,217, 45, 27, 63, 0, 0, 0, 0,
+ 96, 24, 91, 64,226, 50,108,192,101, 9,219, 63, 0, 0,128, 63, 2, 0, 0, 0, 0, 16, 0, 0, 0, 0, 68, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 0, 0,
+ 1, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 4, 0, 0, 96, 46,116, 1,
+ 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0,192, 50,116, 1, 0, 0, 0, 0, 0, 42,116, 1, 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, 46, 48, 48, 56, 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, 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, 48,234,115, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 75,188, 63, 44,197,107,193, 5,147, 81, 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,218, 15,201, 63, 0, 0,128, 37,255,255,127, 37, 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,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,255,255,127, 37, 0, 0,128,165, 0, 0, 0, 0,255,255,127, 37,105, 33,162, 51,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 37, 0, 0,128,191,105, 33,162, 51, 0, 0, 0, 0,145, 75,188, 63, 44,197,107,193,
+ 5,147, 81, 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, 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, 45, 25, 23,178,107,199, 75,179, 0, 0, 0, 0, 0,127,236,153, 0, 0,128, 63,
+ 0, 0, 0, 40, 0, 0, 0, 0, 0,127,108,177,206, 9, 29, 50, 0, 0,128, 63, 0, 0, 0, 0, 32,159,189,191, 47,164,188,191,
+150,188,153,192, 0, 0,128, 63, 32, 0, 0, 0, 0, 16, 0, 0, 0, 0, 68, 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,
+ 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 4, 0, 0,192, 50,116, 1, 0, 0, 0, 0, 99, 0, 0, 0,
+ 1, 0, 0, 0,112, 55,116, 1, 0, 0, 0, 0, 96, 46,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66, 99,104,101, 99,107,101,114,115, 0, 0,108, 97,110,101, 46, 48, 48, 51, 0, 0, 0, 0, 1, 0, 0, 4,
+ 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,144,178,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 55,116, 1, 0, 0, 0, 0, 0,131,102, 60, 14,112,164, 64, 24,211,229, 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,178,159, 34, 65,178,159, 34, 65,177,159, 34, 65, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,166,250, 89,178, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+178,159, 34, 65,151,120, 10,180, 0, 0, 0, 0, 0, 0, 0, 0,151,120, 10, 52,178,159, 34, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,177,159, 34, 65, 0, 0, 0, 0, 0,131,102, 60, 14,112,164, 64, 24,211,229, 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, 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,
+231,126,201, 61,219,145,171, 48, 34, 66,201,163, 0, 0, 0, 0, 65,209,167,164, 51, 57,255, 49,232,126,201, 61, 0, 0, 0, 0,
+235, 66,172, 48,231,126,201,189, 70,201,251, 49, 0, 0, 0, 0, 18,136, 29,187,203,200,189,191,180,139, 9, 58, 0, 0,128, 63,
+ 33, 0, 0, 0, 0, 0, 1, 0, 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,
+205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 70, 88, 1, 0, 0, 0, 0,128,224,117, 1, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, 32, 55,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 64,100,116, 1,
+ 0, 0, 0, 0, 79, 66, 0, 0, 32, 4, 0, 0,112, 55,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0, 32, 60,116, 1,
+ 0, 0, 0, 0,192, 50,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,
+101,118,105,101,119, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,192, 66,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 59,116, 1,
+ 0, 0, 0, 0,100, 82, 7,189, 21,204,103,191,241,165,230, 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,153, 39,155, 64,153, 39,155, 64,153, 39,155, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+218, 15,201, 63, 0, 0,192, 37,255,255,255, 36, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,153, 39,155, 64,152, 39, 27, 38,
+102,187,232,166, 0, 0, 0, 0,102,187,232, 38,157,134,196, 52,153, 39,155, 64, 0, 0, 0, 0,154, 39, 27, 38,153, 39,155,192,
+157,134,196, 52, 0, 0, 0, 0,100, 82, 7,189, 21,204,103,191,241,165,230, 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, 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,
+ 32,222,204,151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,120,200,204, 24, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 0, 0, 0, 0,128, 63, 25, 50, 83, 62, 28, 50,211, 35,
+ 23, 50,211,163, 0, 0, 0, 0, 27, 50,211,163, 25, 50, 83, 62,158, 59,174, 38, 0, 0, 0, 0, 0, 94,204,173,158, 79, 96,175,
+ 25, 50, 83, 62, 0, 0, 0, 0,135, 62,153, 59,217, 94,110,185,118, 71,238, 63, 0, 0,128, 63, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61,
+ 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,233,117, 1,
+ 0, 0, 0, 0,240,240,117, 1, 0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 8, 0, 0, 0,208, 59,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,
+ 32, 4, 0, 0, 32, 60,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0,112, 65,116, 1, 0, 0, 0, 0,112, 55,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48,
+ 50, 0, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,130,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64,116, 1, 0, 0, 0, 0,128, 64,116, 1, 0, 0, 0, 0, 32, 65,116, 1, 0, 0, 0, 0,242,187,213,191,
+194,145,134, 63,254,100, 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,
+243, 0, 28, 65,246, 0, 28, 65,243, 0, 28, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,110,135, 63,180,169, 59, 62,
+138,115, 1,191, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,198, 49, 6, 65,115,154,148,192, 3,113,227,191, 0, 0, 0, 0,
+159,250,106, 64,189,207, 91, 64, 80,170, 5, 65, 0, 0, 0, 0, 46,151, 86,192,125, 94,251,192,188,127,150, 64, 0, 0, 0, 0,
+242,187,213,191,194,145,134, 63,254,100, 35, 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, 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,143,174,180, 61,160, 48, 30, 61,223,118, 16,189, 0, 0, 0, 0,
+162, 29,153,188, 38,248,179, 61,115,162, 74, 61, 0, 0, 0, 0, 15, 21, 72, 61,160,250, 19,189, 88, 57,169, 61, 0, 0, 0, 0,
+ 4,107, 50, 63, 88, 46,204,190,177,206, 79, 63, 0, 0,128, 63, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 1, 1,
+ 1, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, 32, 65,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 88, 0, 0, 0,128, 64,116, 1,
+ 0, 0, 0, 0, 73, 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, 0, 0,
+ 31, 0, 0, 0, 83,117, 98,115,117,114,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, 1, 0, 1, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66, 0, 0, 32, 4, 0, 0,112, 65,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0, 32, 70,116, 1,
+ 0, 0, 0, 0, 32, 60,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,
+101,118,105,101,119, 46, 48, 48, 51, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,202,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 69,116, 1,
+ 0, 0, 0, 0, 16,194,203,187,155, 89, 45, 63,244,153,230, 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, 56,135, 72, 63, 56,135, 72, 63, 56,135, 72, 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,128, 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, 56,135, 72, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56,135, 72, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 56,135, 72, 63, 0, 0, 0, 0, 16,194,203,187,155, 89, 45, 63,244,153,230, 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, 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,144,104,163, 63,143,104,163, 37,
+143,104,163,165, 0, 0, 0, 0, 66,104,165, 37,252,250,206, 51,144,104,163, 63, 0, 0, 0, 0, 60,240,202,173,144,104,163,191,
+183, 63,204, 51, 0, 0, 0, 0,105, 93,173,187,172,176, 88,193, 95, 52,118,186, 0, 0,128, 63, 2, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61,
+ 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 0, 0, 0, 0, 0, 0, 32, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 8, 0, 0, 0,208, 69,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,
+ 32, 4, 0, 0, 32, 70,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0,208, 74,116, 1, 0, 0, 0, 0,112, 65,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48,
+ 52, 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, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,202,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 74,116, 1, 0, 0, 0, 0, 0, 31, 10, 58,
+ 59, 94,236, 63,236, 84,231, 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,
+ 91,188,110, 63, 91,188,110, 63, 91,188,110, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218, 15,201, 63, 0, 0, 0,128,
+ 0, 0, 0,128, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 91,188,110, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 90, 50,151, 51, 91,188,110, 63, 0, 0, 0, 0, 0, 0, 0, 0, 91,188,110,191, 90, 50,151, 51, 0, 0, 0, 0,
+ 0, 31, 10, 58, 59, 94,236, 63,236, 84,231, 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, 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,160, 65,137, 63,159, 65,137,165,161, 65,137,165, 0, 0, 0, 0,
+160, 65,137, 37,160, 65,137, 63,157, 46, 19, 40, 0, 0, 0, 0,248,127, 14, 45,159,195,150,176,161, 65,137, 63, 0, 0, 0, 0,
+ 29, 80, 63,188, 62, 95,226,187, 87, 19, 74, 65, 0, 0,128, 63, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 1, 1,
+ 1, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 0, 0, 0, 0, 0, 0, 32, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0,128, 74,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 32, 4, 0, 0,208, 74,116, 1,
+ 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0, 48, 79,116, 1, 0, 0, 0, 0, 32, 70,116, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 53, 0, 48, 48, 51, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 4, 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,176,220,115, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,155,195,189, 20,145,188, 64, 94,220, 88, 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,128, 63, 0, 0,128, 63,
+ 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221,180,134, 63, 48,190,141, 37,253, 55, 57, 35, 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,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,253, 55, 57, 35, 48,190,141,165, 0, 0, 0, 0,219,128,112, 37, 52,177,253, 62,
+ 94, 93, 94, 63, 0, 0, 0, 0, 52,133, 22, 37, 94, 93, 94,191, 52,177,253, 62, 0, 0, 0, 0,128,155,195,189, 20,145,188, 64,
+ 94,220, 88, 65, 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, 23,252, 16, 37,196,176, 70,165, 0, 0, 0, 0, 80, 90,231,174, 94, 93, 94, 63,
+ 52,177,253, 62, 0, 0, 0, 0, 0, 68,239,172, 50,177,253,190, 95, 93, 94, 63, 0, 0, 0, 0,150, 98,174, 61, 85,101,144,193,
+196,124,253, 64, 0, 0,128, 63, 64, 0, 0, 0, 0, 16, 0, 0, 0, 0, 68, 0, 5, 0, 1, 0, 0, 0, 0, 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,
+ 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 32, 4, 0, 0, 48, 79,116, 1, 0, 0, 0, 0, 99, 0, 0, 0,
+ 1, 0, 0, 0,224, 83,116, 1, 0, 0, 0, 0,208, 74,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119, 46, 48, 48, 54, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 85,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 83,116, 1, 0, 0, 0, 0, 94, 52,252,190,174,101,228, 65,141,116, 17, 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,235,239, 30, 66,236,239, 30, 66,235,239, 30, 66, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,138,174, 95, 63, 98,132,123, 37, 61, 56, 87,165, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+235,239, 30, 66,105,158, 5,168,108, 39, 28,168, 0, 0, 0, 0,212,129, 77, 40, 66, 15,204, 65,158,186,243, 65, 0, 0, 0, 0,
+ 55, 89, 13,165,156,186,243,193, 65, 15,204, 65, 0, 0, 0, 0, 94, 52,252,190,174,101,228, 65,141,116, 17, 65, 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,
+101, 43,206, 60,143,217,240, 34,201,165, 18,163, 0, 0, 0, 0,226, 14,231, 31,101, 20,158, 60,193, 89,132, 60, 0, 0, 0, 0,
+190, 83,173, 34,192, 89,132,188,103, 20,158, 60, 0, 0, 0, 0, 11,215, 70, 60, 61, 43, 67,191,185,241, 31, 63, 0, 0,128, 63,
+ 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,
+205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0,144, 83,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66, 0, 0, 32, 4, 0, 0,224, 83,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0,144, 88,116, 1,
+ 0, 0, 0, 0, 48, 79,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,
+101,118,105,101,119, 99,117, 98,101, 0,117, 98,101, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 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,112, 94,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 88,116, 1,
+ 0, 0, 0, 0,128,253, 88, 59,220,118,160, 63, 0, 15, 37, 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, 84, 88, 68, 64, 84, 88, 68, 64, 83, 88, 68, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1,190,237, 62,108,230,217,190, 20,151, 52, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 67, 38, 8, 64,191,228,231, 63,
+186, 31,162, 63, 0, 0, 0, 0, 35,118, 13,192, 2, 61,220, 63, 31, 44,160, 63, 0, 0, 0, 0,166, 52,234, 60,102,223,227,191,
+ 55,229, 31, 64, 0, 0, 0, 0,128,253, 88, 59,220,118,160, 63, 0, 15, 37, 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, 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, 10,115,103, 62,201,122,112,190,
+255, 17, 71, 59, 0, 0, 0, 0,116,205, 9, 62,205, 36, 8, 62,136,232,135, 62, 0, 0, 0, 0, 1, 27, 69,190,224, 50, 59,190,
+ 25,176, 65, 62, 0, 0, 0, 0,110,176, 16,192,158, 71, 9,192,115, 90,244, 63, 0, 0,128, 63, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61,
+ 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 8, 0, 0, 0, 64, 88,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0,
+ 32, 4, 0, 0,144, 88,116, 1, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0,144, 95,116, 1, 0, 0, 0, 0,224, 83,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 66,112,114,101,118,105,101,119,104, 97,105,
+114, 0,108, 97,110,101, 0, 0, 0, 0, 0, 0, 1, 0, 0, 4, 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,144,194,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,224,223,117, 1, 0, 0, 0, 0,224,223,117, 1, 0, 0, 0, 0, 64, 95,116, 1, 0, 0, 0, 0, 86, 92,200, 63,
+ 7,205,227, 63,149,199, 9,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,
+234,126, 47, 64,234,126, 47, 64,236,126, 47, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,225, 80, 2, 63, 5,211, 15,191,
+ 92,219, 18, 62, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,224,254, 18, 64, 23,209,169, 62, 27,251,186, 63, 0, 0, 0, 0,
+ 71,254,133,191,207, 40, 17, 64,229,194,144, 63, 0, 0, 0, 0, 78, 38,137,191, 48,162,192,191,125,176, 1, 64, 0, 0, 0, 0,
+ 86, 92,200, 63, 7,205,227, 63,149,199, 9,189, 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, 2, 0, 64,179, 0, 0,128,179, 0, 0, 0, 0,
+ 2, 0, 64, 51, 1, 0,128, 63, 2, 0, 64,167, 0, 0, 0, 0, 0, 0,192,179, 0, 0, 0,179, 0, 0,128, 63, 0, 0, 0, 0,
+255,255,127,179, 2, 0,192,179, 0, 0, 0,180, 0, 0,128, 63,244,100,156, 62,135,143, 14,190, 52,235, 17,190, 0, 0, 0, 0,
+175,239, 70, 62,102, 4, 26, 62, 72,251,137, 62, 0, 0, 0, 0,174,172, 52,189,211,112,154,190, 67,243, 76, 62, 0, 0, 0, 0,
+149, 56, 36,191,139, 98, 66,192,168, 5, 68, 64, 0, 0,128, 63, 0, 4, 0, 0, 1, 4, 0, 0, 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 1, 1,
+ 1, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 64, 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,220,117, 1, 0, 0, 0, 0, 0,220,117, 1,
+ 0, 0, 0, 0,128, 94,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0, 64, 95,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,120, 0, 0, 0,128, 94,116, 1,
+ 0, 0, 0, 0,101, 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,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, 68, 65, 84, 65,104, 1, 0, 0, 0,220,117, 1, 0, 0, 0, 0, 12, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176,221,117, 1, 0, 0, 0, 0,240, 21,124, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,193,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244,100,156, 62,
+135,143, 14,190, 52,235, 17,190, 0, 0, 0, 0,175,239, 70, 62,102, 4, 26, 62, 72,251,137, 62, 0, 0, 0, 0,174,172, 52,189,
+211,112,154,190, 67,243, 76, 62, 0, 0, 0, 0,149, 56, 36,191,139, 98, 66,192,168, 5, 68, 64, 0, 0,128, 63, 0, 0, 0, 64,
+ 0, 0, 0, 0, 17, 2, 0, 0,150, 0, 0, 0, 0, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,224,121, 0, 0,240, 21,124, 1, 0, 0, 0, 0, 10, 1, 0, 0,150, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 21,135, 17,192, 32,121, 97,192,108, 32,141, 63,190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+198,206,183,190,203,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80, 96,114, 1,
+ 0, 0, 0, 0, 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, 96, 32, 63,
+185,201,160, 62,160, 3, 6, 63, 11, 34,248,190,192, 53,185, 60,192,197,178, 61,174,184, 53, 63,224,172,162,190,108,136,224, 62,
+142,173, 61,191,181, 96, 10, 60,201,196,163, 61, 78,182, 99, 63,165,242,180, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,248,112,150, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,109, 46, 7,192,144, 26, 60,192, 25,147,207, 63,
+190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 32, 19,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, 6,121,229,190,108, 50, 41,191,136,152, 7,191,155,100,146,190,146,141, 25,191,
+ 40, 92,142, 62,212,104, 18, 63,228,105,105,190,112,156, 96, 62,137,226, 69,191,146,247, 17, 61, 49,172, 44, 62, 17,125, 54, 63,
+ 69,195,169, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,144, 63,245, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,224,103,174,189, 59, 88, 17,192,230, 35, 76, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,176,101,114, 1,
+ 0, 0, 0, 0, 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,160,155, 62,
+ 58, 87,152, 62,118,199, 84,191, 84, 89,183, 62,120,103,231, 62,112, 47,177,189,156, 8, 4,191,100, 60,199, 62,200, 40,177,189,
+ 0, 14, 46, 62,101, 96, 39, 62,100,119,242, 61,188,168,146, 62, 55, 9,221, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,135, 36, 87, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,102,131,192,184,241, 26, 63,143,198, 76, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128,127, 92, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 80, 39, 63,171, 26,218,190, 88,118, 16, 63,131, 72,138,190,168,255,122,190,
+185,111, 14,191, 22,207, 38, 63, 80,252,211, 61,198,177, 80,191, 40,154,203,189,226,146, 53, 61, 63,180,115, 63,246,113, 42, 59,
+153, 63,144, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,175, 95,142, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32, 43,226,189,254, 85,220,191,226,104,101, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,208,220,114, 1,
+ 0, 0, 0, 0, 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, 97, 45, 63,
+120, 47,205,190, 35,117, 19, 63,168,125, 98, 62,240,195, 73, 62,124,228,243, 62,120, 86, 11, 63, 72,156, 89, 62,230,232, 88, 63,
+130, 53,204,190,248,120,128, 62, 17,194, 20, 62, 61, 15, 90, 62, 94, 30,200, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 53,129,253, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,108,159,129,191, 4,210, 6, 63, 35,221,152, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0,219,135, 1, 0, 0, 0, 0, 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,167,210,190,195,172,139, 62,250,220, 35, 63, 30,182, 22,191,128, 3,136, 61,
+110,164,176,190, 30,153,147,190, 0,249, 10,188,234, 90,160,190, 90,241,205,190,148,235, 25, 63,206,172,146, 62,143,195, 52, 61,
+104,142,139, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 37,227, 77, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,114,167,189,191,212, 59,104,192,184,179,184, 63,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,
+200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80, 0,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 45,121, 62,
+121,126, 98, 63, 56,171,135,189,139,174,200,190,220,142, 21, 63, 77, 70, 40,191,116, 70,150, 62, 0,245, 92, 61,160,118,174,190,
+176,217, 49, 63,120,167,104, 60,164,104,235, 60,217,251, 73, 63, 12, 25, 44, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,217, 2,247, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,112, 30, 63,112, 69, 82,192, 58,191, 51, 64,
+190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,200,206,183,190,199,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224, 45,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49,227,137,190,206,195, 71,191, 70, 31, 96,190,127, 46, 5, 63, 96, 51,214,189,
+228, 61, 67,191,136, 90, 2, 62,120,214,146,190, 32,111, 33, 62,136,229,187,190, 28,112,241, 60, 3,187,177, 60, 6,134,171, 62,
+164, 35, 29, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,130,192, 56, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,116,148,176,191,100,200, 1, 63, 89, 48,146, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16,144,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, 43,169, 82,190,
+102,214, 57, 63, 55,112, 36,191, 61,205, 9, 62,184,139, 5, 63,104, 32, 43,190,120, 62, 37,191,220,215, 15, 63,180, 2, 8, 63,
+196,170,163, 62,159,178, 8, 63,184,164,184, 62, 70, 72, 63, 61, 17,104,112, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 97,249,192, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,198, 80,168,191, 7,154,165,191,229,248, 80, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 48,145,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, 56,145, 5,191, 84, 77,126, 62, 14,133, 63,191,190, 5,167, 62,124,212, 96,190,
+232,136,176, 62, 32,193, 80,189,144, 49, 18, 62,224, 40, 25, 62, 59,204, 10,191,177, 46,104, 62, 36,106,150, 62, 1, 61,138, 62,
+ 4,131, 86, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 39, 27, 19, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,224,189,246,189,236,129, 90,192,226,155, 20, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,112,111,105, 1,
+ 0, 0, 0, 0, 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, 77, 14,191,
+232, 81,154, 62, 41,220, 22,191,104,189, 0,191,214,167,160,190,140, 60, 22,190, 38, 85, 74, 63, 32,253, 8,191, 96,146, 23, 61,
+196, 30,177,190, 80, 25,187, 60,206,244,194, 60, 50,234,253, 62,235, 52,234, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,218, 21, 79, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144,231, 67,190,176,104, 11,189,211,111,153, 64,
+190, 81, 55,191,106,243, 71,191,102,237, 42, 63,233,163,214, 62,201,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,144,112,105, 1, 0, 0, 0, 0, 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,110,205, 62,147,226, 27,191, 69, 95,219, 61, 76, 3, 45, 63,222,109,147,190,
+152,196, 40, 63, 36,136,116,190,180, 21,190,190,210, 38,213,190,112,230,183, 62,207,217, 24, 63, 57,222, 25, 62,255, 49,134, 61,
+140,161, 63, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,180, 67,127, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 58,217,158, 63,120,225, 17,192,212,158,120, 64,190, 81, 55,191,106,243, 71,191,102,237, 42, 63,233,163,214, 62,
+201,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,160,161,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,175, 95, 22, 63,
+171, 95,210,190,114, 70, 46,191, 69, 71, 26, 62,192,164,234, 61,121,120, 78,191,192,229,108,188,144,225, 72,190,196,218, 42,190,
+ 83,104,114,191, 26,213, 73, 62,213,230, 49, 61,216,117,187, 61,145,253, 42, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,226,144, 95, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23,205,127,191,229,116,142,191,114, 64,100, 64,
+190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192,162,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 25,132,189, 67,167, 41,191,248,145,174,190,170,227, 41, 63, 80,208, 94, 62,
+ 98, 21, 50, 63,138,162, 46,191,136, 53, 56,191, 8, 44,160, 62, 14, 42,188,190,111,124,145, 62, 46, 84,135, 62, 93, 56, 95, 62,
+104, 38,111, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,183,116, 87, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,142,106, 67,192,223, 1,236, 62,229,139,105, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192,145,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 62, 72, 62,
+146,226,176, 62, 67,185, 48,191, 0,216, 26,191, 0,159,254,187, 90,238,201,190,100,166, 39, 63,102,238, 3,191,208,229, 10, 62,
+164, 53,230, 62, 35,227,100, 62,229, 38, 54, 63, 91, 4, 43, 61,170, 1,190, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,213, 26,126, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110, 63, 58,191,238, 44,102,191,240,155,119, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224,146,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,202,238,131, 61, 49, 99, 58,191, 62,180, 26, 63,201, 92,162,190,112,254,209, 62,
+150, 67, 12, 63, 80,138,197, 62,198,116, 72,191,118,129,182,190,184,137, 76, 62,232,134,178, 62, 21,134,113, 62,234,242, 46, 62,
+ 45,121,122, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,248, 12,169, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,236,173,175, 62,216,194,141, 61, 0,239,164, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0,148,114, 1,
+ 0, 0, 0, 0, 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, 38, 28, 63,
+ 74,248,166, 60,227,199, 67,191,127,123, 83,190,122,119,224,190, 72, 46,149, 62,136, 43, 62, 62, 32,175,199, 62, 98,224, 2, 63,
+180,198,250, 62,209, 97, 48, 63, 39,134,130, 61,168, 53, 8, 61, 57, 40, 91, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 93,115,157, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131,188, 36,192, 82,192, 42,192, 16, 24,202, 63,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16, 45,105, 1, 0, 0, 0, 0, 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,121, 82,190,233,142,216,190, 95,156, 83,191,222, 73,158, 62,170,207, 3, 63,
+ 64, 41, 39,191, 4,164,147, 62, 36,187, 38,191, 0, 1,218, 62,145,119, 32,191,146,242,154, 60, 19,165,130, 62,128,236, 49, 63,
+ 79, 44,253, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 13,194,130, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,183,117, 51, 63, 38,247, 44,192, 85, 59, 82, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 48, 46,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221,175, 71, 59,
+214, 55, 18,191, 64, 82,223,190,142, 2, 50, 63,240, 17,202, 61, 52,118,199, 62,128,125, 72, 63, 86,250, 36,191, 64, 99, 90, 61,
+124, 38, 25, 63,229, 50,227, 61, 58,152,110, 61,163, 58,104, 62,119,161, 26, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 21, 69, 35, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22,218, 44,192,101,112,159,190, 70,196, 80, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80, 47,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 65, 39,191,175,203,203,190, 23, 58, 8,191,133,178,185,190, 48,133, 27, 63,
+166,150, 35, 63,192,164,174,189,144, 20,209,189,124, 43, 3,191,220,188, 54, 63, 27,126, 53, 62, 93,113, 22, 63, 28,104, 42, 62,
+169,168,140, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 90,122,222, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,218,253, 61,191,188,216, 43,190,219,239,140, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192,216,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 62,251,190,
+156,207,132, 62,191,198, 19,191,122, 82, 25,191,178,114,169,190,242, 80, 46,191,160, 92,100,189,124,103,188, 62, 0,234, 23,191,
+ 12,140, 22, 63, 23, 36,252, 62,188,130,121, 62,100,245,198, 61,101,186, 42, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 62,205, 89, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,194,168,212,191, 48,175, 30,192, 93,228, 12, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224,217,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244,136, 6, 62,240,135, 58,191, 94,198,233, 61, 57,148, 41, 63,152,188,189,190,
+156, 72,189,190,184, 14, 86, 63,186, 54,165,190,128,220, 49, 62, 64, 87,189,189,118,198,167, 61, 93,200, 80, 62,158,210, 10, 63,
+240, 9, 48, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,186,132,181, 61,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,114,184,238,190,239,206,230,191,208,122, 85, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0,219,114, 1,
+ 0, 0, 0, 0, 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,165, 30, 63,
+159, 50,249,190,187,213, 86,189,178, 10, 29,191,227,247, 49,191,208,139, 7,189,224,249,154,189,152, 77, 23,191,160, 58, 14, 63,
+ 64, 47, 15, 61,135,132, 94, 62,167,190, 48, 62,203, 41,136, 62,156, 52,176, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 38,177,233, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 19,104, 63,177,122,254,191,116, 37,123, 64,
+190, 81, 55,191,109,243, 71,191,102,237, 42, 63,236,163,214, 62,200,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 64,235,104, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,231,181, 62, 36, 19, 51, 63,126, 5, 6,191,231, 27,170,190,128,253, 35,189,
+184, 11,151,189, 76,171,178, 62,128,231, 49, 63,204,146,128, 62, 88,100, 17, 62,198,245,124, 62, 33,108,130, 61,205,152,229, 61,
+240,193, 19, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 56,156, 79, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,172,106,191, 63,110,225, 42,192, 6,170,110, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 96,236,104, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49,227, 27,191,
+ 17, 83, 26, 63, 27,229, 2,191, 86, 48,135, 61,200,244,134, 62, 56, 37,151,190,208,195,237,189,248, 39, 17, 63,160, 1, 76, 61,
+ 76,194, 79,191,241, 99,249, 61,190, 88,249, 60,171, 20,183, 61, 38, 38, 66, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,150, 40,178, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,119, 3, 12,192, 71, 11,252,190,144,136, 89, 64,
+190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128,237,104, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 59, 20,191, 31, 36, 17, 63,112, 57,252,190, 32,101,162, 62,140, 6,160, 62,
+ 64,160, 80, 61,112,243,245, 61, 40, 18,224,190,192,154,227,188,238,196,139,190,172, 28,108, 62,189,152,246, 62,202, 50, 61, 62,
+ 34,254,210, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 20,166, 56, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,250,104,187,191,168, 86,139,189,145, 23,131, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128, 5,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,227, 80, 19,191,
+120,138, 16,191,122,210, 6,191,144, 14,138, 62, 72, 65,189, 62, 16, 89,244,189,208, 5, 83, 62, 92,159,107,190, 20,199,255, 62,
+ 16,124, 48,190, 13, 67,208, 62,184, 57,190, 62,121,154,219, 61,111,114,234, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,203, 51,223, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 56,161, 62,253,221,207,191,204,110,120, 64,
+188, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,203,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,160, 6,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,138,124, 47, 63, 11,193, 0, 63,126, 39,176, 62, 68, 3,204,190,128,180, 43, 61,
+ 64,184,104,189, 69,173, 54,191, 16,239,116,189,192,183, 53,190,120, 91,198,190,123, 33,150, 62, 70, 30,226, 61,225,121, 27, 62,
+ 3,154,227, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,117, 22, 35, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 89, 41,192,114,107, 25,192,178,245,222, 63,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,
+200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192, 7,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, 65,202,207, 62,
+211, 32, 47, 63,139,219, 0,191,197,212,172,190,196, 68, 65, 63,104,152,217,190,160,218,214,190, 84,113, 84,190,194,108,158,190,
+224,217,235, 61,107,179,202, 60,195,106,157, 62,210,197, 33, 63, 28,243, 18, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 1,162,102, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96,238,220,191, 89, 70,150,191,200,192, 72, 64,
+190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224, 8,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,175, 95, 22, 63,171, 95,210,190,114, 70, 46,191, 69, 71, 26, 62,192,164,234, 61,
+121,120, 78,191,192,229,108,188,144,225, 72,190,196,218, 42,190, 83,104,114,191, 14,183, 77, 62,160,153,182, 62, 65, 59,143, 62,
+ 51,159, 38, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,226,144, 95, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60,234,116,192, 32,103,238,188,165, 20, 56, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 10,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,244,136, 6, 62,
+240,135, 58,191, 94,198,233, 61, 57,148, 41, 63,152,188,189,190,156, 72,189,190,184, 14, 86, 63,186, 54,165,190,128,220, 49, 62,
+ 64, 87,189,189, 29,255,242, 60,231,194, 83, 63,189, 56, 5, 62, 66,188, 85, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,186,132,181, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,209,240,189,182,183, 95, 63, 5, 67,176, 64,
+192, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,200,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 32, 11,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,107,114, 86,191,137,141, 2,191,201,140,105, 61, 69,121, 63,190,132,242,218, 62,
+236,163,132,190, 0,236, 16, 60, 84,203,248, 62, 79,244, 80,191,104, 0,148, 62,154,189, 85, 63,146,104,200, 61,242, 55,142, 60,
+ 69, 57, 76, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 31,252, 33, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,205, 54, 25,192,189,197,162, 62, 8, 16,121, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,
+200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 32,124,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,219,100,244,190,
+182, 69, 91,191, 61,137,144,189,165,126, 59, 62, 28,228,200,190, 60, 49,170, 62,224,139,250,189,248,143,111, 62,252,103,100,191,
+144, 32, 79, 62,103,246,163, 62, 91,201, 16, 63, 24,104,136, 61,228,230, 66, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,182, 88, 41, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 57, 61,192,232, 53, 39,191,172,221, 55, 64,
+190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,198,206,183,190,203,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 64,125,114, 1, 0, 0, 0, 0, 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, 43, 35,190,245,210,225, 61,197, 58, 30, 63,229, 8, 67, 63,208,176,222, 61,
+ 70, 15, 12, 63, 80,195,165, 62,224, 72,227, 61,188, 66, 87,191,144,213,195, 62, 46,218,212, 61,242, 20, 25, 63,124, 70,118, 62,
+167,226,107, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,173, 74, 64, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,249, 62, 40,191, 32,113, 26, 63, 50,179,160, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 96,126,114, 1,
+ 0, 0, 0, 0, 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, 29,224,190,
+239, 44, 4, 63,125,217, 49, 63,107, 25,121,190,116,172,217, 62,240, 98,116,190,148,162, 42, 63,142,178,199,190, 54,105, 13,191,
+ 84,107,163,190, 64,186, 45, 63,110,122, 91, 62, 32,134, 21, 61, 18,118,144, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,113,107, 73, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 51,138,191,200, 14,110,192, 13, 66,203, 63,
+190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128,127,114, 1, 0, 0, 0, 0, 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, 78, 39, 63,128, 50,251,190,139,185,189,190,173, 4,226, 62,118, 23,153,190,
+ 68,228,120,190, 50,226, 42,191,239,243, 86,191, 36, 42,189,190, 66, 1,190,190,234,223,153, 59, 20,174,243, 59,232,160, 60, 63,
+248,135,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,167,245,105, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 44, 75,186,191,173,205,204,191,131,169, 61, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,160,128,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117,223,155, 62,
+249,196, 3,191,115, 12,163,190,212, 73, 60,191, 56,208, 85, 62, 64, 11,155, 62, 24, 17,173,189, 20, 16,254,190,212,229, 32, 63,
+224,221, 28,189, 77, 19, 52, 62,228, 52,146, 62,193,228,171, 62,107,185, 79, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 45,184, 37, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,118,219, 63,227, 73, 28,192, 81,117,128, 64,
+192, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,197,206,183,190,202,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192,129,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167,109,254, 62,209,146, 4, 63,232,131, 23, 63, 68,212,187, 62, 10,109,158,190,
+ 72, 12,216, 62, 0, 20,153, 59, 8, 2, 7, 62, 96,134, 91, 62, 44,128, 33,191,191, 75, 51, 62,208,251,144, 60,197, 49, 19, 61,
+ 21,114, 69, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,221,100,115, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,177, 59,194,191, 34, 29, 13,192, 13,208, 30, 64,192, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+200,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 64,106,127, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117,223,155, 62,
+249,196, 3,191,115, 12,163,190,212, 73, 60,191, 56,208, 85, 62, 64, 11,155, 62, 24, 17,173,189, 20, 16,254,190,212,229, 32, 63,
+224,221, 28,189, 96, 31,227, 61,168,207,104, 62, 38, 89,237, 62, 91,238, 74, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 45,184, 37, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,197,190, 82,192, 3,149,174, 62, 30,189, 91, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 96,107,127, 1, 0, 0, 0, 0, 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,132, 10,191, 82, 61,237, 62,127,191,223,190, 11,148, 12, 63,240,142, 92, 62,
+ 18,199, 32, 63,160,206,242,189,198,114, 15, 63, 92, 82, 33,191, 4,247,167,190,212, 10, 37, 62,124,152, 65, 63, 17,110,106, 61,
+172,189,207, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 40, 23,140, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,112,157,163,190, 48,219, 33, 63,250, 25,167, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128,108,127, 1,
+ 0, 0, 0, 0, 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,175, 4,191,
+158,200, 50,190,247,214, 77, 63,225,194,110,190,144, 10,198, 61,208,213, 62, 62,144,163,253, 61,112,130,160, 61,201,229,101,191,
+104,145, 50, 62, 53,192, 61, 63, 16, 50, 23, 62, 37, 56, 1, 61, 41,254,162, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 89, 81,220, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,135, 63, 79, 63, 22,225,203,191,183, 83,133, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,160,109,127, 1, 0, 0, 0, 0, 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,155,194,190, 81, 93, 3,191, 23,133, 19,191,178,146, 2,191,128,198,104, 62,
+ 16,189, 93, 63, 76,226,209,190,158,122, 21,191,168,192,234,190, 16,128, 35, 63, 10,188,167, 62,140,167,138, 61,186,163,185, 61,
+147,152, 3, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 25,249,236, 59,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 20,218, 89, 62,170, 21, 81,192, 50,226, 38, 64,190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+198,206,183,190,203,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192,110,127, 1,
+ 0, 0, 0, 0, 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,169, 52, 63,
+ 96,163,156, 62, 27,132,184,190, 82, 25, 7, 63,128,117,151, 62,252,206,247, 62, 28,144, 76, 63,148, 57,204, 62,192,181,246,188,
+196,222, 19, 63,175,237, 18, 61, 50, 0, 0, 61,180, 45,208, 62, 72,186, 6, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 61,195,186, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 91,166,190,195,138,151, 62,233, 4,159, 64,
+188, 81, 55,191,109,243, 71,191,102,237, 42, 63,237,163,214, 62,198,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224,111,127, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,212,240, 7, 63,213, 2, 18,191,228, 90, 5,191,222, 92,178, 62, 8,236, 16, 63,
+ 92,216,151, 62,156,193,128, 62, 64, 60,245,188,118,129,160,190, 47,157,113,191,112,117, 40, 63,168, 92, 37, 62, 75,198, 78, 61,
+ 7, 28, 5, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,137, 96,226, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,106,137,191,191,137,156,208,190,238,245,116, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0,113,127, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,173,218, 49,191,
+113,109, 23,191, 30, 16, 55, 62, 55,117,188,190, 24, 20,208, 62,118,245, 46,191, 0,158,236,186, 55, 10, 97,191,140,128,183, 62,
+178,230,146,190,120,217,174, 62, 45, 55,188, 62, 42, 76, 25, 62,138,146, 16, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 96, 85, 48, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 6, 78,191,236,247, 2,191, 2,181,131, 64,
+190, 81, 55,191,109,243, 71,191,102,237, 42, 63,236,163,214, 62,200,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16,133,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,178, 25,236,189,127,158, 27, 63,122,235,239, 62, 59,108, 33, 63,244,198,103,190,
+252,192,187, 62,180, 39,101,190,108,210,138, 62,145,168, 54,191,208, 20, 63,190,236,209,211, 62, 2,168,129, 62,107,237, 7, 62,
+185, 30, 77, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 2,210,109, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 97,181,251,191,176, 67, 79, 63, 85,115,143, 64,188, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+203,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 48,134,114, 1,
+ 0, 0, 0, 0, 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,243,237, 61,
+ 12,234,169,190,211,226, 55,191,185,175, 25,191, 24,201, 39, 63,204, 23, 71,190, 88, 61,218, 62, 32,211, 39, 63,108,101,215,190,
+ 32,125,244,189, 31, 56,250, 62,175,208,248, 62, 52, 43, 79, 60,247,186, 79, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 83,130,186, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165,143, 16,192,220, 40, 31,192,184,165,240, 63,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80,135,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193,157, 15,191, 48, 51,205,190,152, 40,136,190,128,122, 44, 63,194,144, 92, 63,
+236, 36, 99,190,244, 22,206,190,144, 32,220, 62,170,244, 19, 63,160,205,238,189, 90,255, 69, 61,125,237,129, 62,202,113, 29, 63,
+ 20,188,169, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,249,139,151, 61,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 47, 16, 46,192,250,135, 17, 62,198,174,101, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,112,136,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186,110,162,190,
+145,104,105,190,247,168,239, 62, 3,235, 74, 63,140, 77,178,190, 80, 49, 72, 63,168, 45,112, 62, 42,101, 44, 63, 96,162,173, 62,
+180,215,104,190,132,185,112, 62, 76,198, 31, 63, 80,148,186, 61,145,140, 75, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,161,174,120, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,222, 76, 34,192,190, 63,220,191,102, 92, 19, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,144,137,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 89, 32, 62,234, 91, 82, 63, 19, 79, 86, 60, 22, 61, 12, 63,250,120,178,190,
+203, 19, 37,191,128, 65, 24, 63,196,226, 52, 63,219,214, 0,191,204,228,210,190,193, 5,144, 61, 31,251,203, 62, 4,217,232, 62,
+185,169,156, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 7,165,113, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,209,208,191,175, 98, 57,192,212, 39,244, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,176,138,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,244,136, 6, 62,
+240,135, 58,191, 94,198,233, 61, 57,148, 41, 63,152,188,189,190,156, 72,189,190,184, 14, 86, 63,186, 54,165,190,128,220, 49, 62,
+ 64, 87,189,189, 40,142,100, 61,205, 81, 18, 62, 52,238, 34, 63,214,209, 40, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,186,132,181, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,156,146, 19,192,144,169, 38, 63,119,240,133, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,208,139,114, 1, 0, 0, 0, 0, 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,191,104,191, 90, 12,172,190,102, 97,112, 62,249, 67,150, 61,240,234,241, 61,
+120, 15, 65,190,224, 2, 61, 62,158, 38,233,190,128, 62,191,187,106,119, 29, 63,176, 98,202, 62,157,134, 14, 63,239,140,213, 60,
+ 93,116,179, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,159,173, 69, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 95,209,211, 63, 77, 57, 64,192,236, 52,100, 64,192, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+197,206,183,190,202,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,144, 2,114, 1,
+ 0, 0, 0, 0, 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, 46,157,190,
+239,142, 47,191,248,128,219, 60,123,203, 40, 63, 0,175,122,189,180, 33,139, 62,160, 8, 63, 61, 74,191, 26,191, 48,191,189, 61,
+124,188,100,190,133,222,112, 61,149,149,161, 60,121,188,202, 61,220,141, 82, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 34, 78, 58, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,204, 40,195, 62,168, 66, 22,192, 54, 69, 88, 64,
+190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,198,206,183,190,203,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,176, 3,114, 1, 0, 0, 0, 0, 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, 69, 25, 63, 77,123,124, 62,100,238, 32,191,234,140,220, 62, 96,159,120, 61,
+192,254,244, 61,104,215, 59, 63,244,235, 71,190, 9,172, 73,191, 94,228,165,190,238,198, 39, 62,233,166,180, 61, 35, 45,106, 62,
+ 32,238, 4, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,128,255,104, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,179, 41,124, 63,215, 52, 92,192, 2,194, 56, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,208, 4,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,191,175, 62,
+ 72,210, 67, 63, 93, 44,255,190, 34,232, 97, 62,184, 89, 70,191, 58, 37,246,190,112,174,211, 61,224,174,119,189,237, 2,119,191,
+176,205, 35, 62,226,119,158, 59, 63,185, 89, 59, 58, 41,150, 62,186,212, 50, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 78,102, 32, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 76,215, 66,192, 80,102, 17,189,252, 64, 82, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,240, 5,114, 1, 0, 0, 0, 0, 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, 15,158,190, 97, 48, 27,191, 48,181, 41,191, 31, 19,160,190, 88, 23,153,189,
+100,243,110,190,182,169,164,190, 97,129,120,191,128,101, 90, 60,192, 53,186, 61, 94, 65, 31, 62,150, 57, 45, 63,119,240,248, 61,
+ 59,128, 61, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,196, 79,137, 61,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,246,234,243, 63, 15,199, 50,192,250,173,118, 64,188, 81, 55,191,109,243, 71,191,100,237, 42, 63,235,163,214, 62,
+201,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16, 7,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,133,137,136, 62,
+101, 7,106,191,250,249,155,190,188,218,155, 60,192,212,184,188, 72,215,201,189, 40,244, 61,191,128,234, 70, 61,154,226, 1,191,
+118,139, 91, 63,202, 64,207, 61, 44,106, 89, 60, 30, 53, 13, 61,236,222, 89, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 6, 40, 87, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,170,176, 54,191, 97,173,187,191,212, 31, 93, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 48, 8,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221,175, 71, 59,214, 55, 18,191, 64, 82,223,190,142, 2, 50, 63,240, 17,202, 61,
+ 52,118,199, 62,128,125, 72, 63, 86,250, 36,191, 64, 99, 90, 61,124, 38, 25, 63,101,144,129, 62,185, 1, 91, 62, 60, 67,121, 62,
+ 32, 77,148, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 21, 69, 35, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,237,131,100,192,234,185, 81,191, 36, 50, 27, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80, 9,114, 1,
+ 0, 0, 0, 0, 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, 43, 35,190,
+245,210,225, 61,197, 58, 30, 63,229, 8, 67, 63,208,176,222, 61, 70, 15, 12, 63, 80,195,165, 62,224, 72,227, 61,188, 66, 87,191,
+144,213,195, 62,157,146, 70, 60, 81,125, 44, 63, 69,124,156, 62, 99,144, 10, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,173, 74, 64, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226, 77,248,190,220,108,103,190,232,231,143, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,112, 10,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 62,251,190,156,207,132, 62,191,198, 19,191,122, 82, 25,191,178,114,169,190,
+242, 80, 46,191,160, 92,100,189,124,103,188, 62, 0,234, 23,191, 12,140, 22, 63, 56,173, 3, 63,188,233, 78, 62, 70,225,187, 61,
+197,112, 68, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 62,205, 89, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,129, 80, 10, 64,250,130, 74,192,126,179,109, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,144, 11,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221,175, 71, 59,
+214, 55, 18,191, 64, 82,223,190,142, 2, 50, 63,240, 17,202, 61, 52,118,199, 62,128,125, 72, 63, 86,250, 36,191, 64, 99, 90, 61,
+124, 38, 25, 63,214, 2,202, 60, 34,116,181, 59,235,167,204, 60,194,223,113, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 21, 69, 35, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73, 37, 55,192, 93, 44,210,191,133, 20, 12, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,208,191,105, 1, 0, 0, 0, 0, 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, 7, 15, 63,134,194, 46,190, 35, 82,148, 62,186, 22, 66,191,210,135, 53, 63,
+112, 29,172,190,200, 68,229, 62,252,167,140, 62,180,223, 99,190, 34,226,176,190,143,158, 50, 61, 52,247,230, 62,255, 25,236, 62,
+225,215, 52, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,202,199,214, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2,163,152,191,233,189, 16,192,148, 29, 39, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,240,192,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,178, 25,236,189,
+127,158, 27, 63,122,235,239, 62, 59,108, 33, 63,244,198,103,190,252,192,187, 62,180, 39,101,190,108,210,138, 62,145,168, 54,191,
+208, 20, 63,190,112,136,250, 61,107, 45, 71, 62,247,240,222, 62,108,172,125, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 2,210,109, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92,219,213, 63,121,221, 77,192, 99,157, 90, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16,194,105, 1, 0, 0, 0, 0, 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,225, 4,191,238,172, 35, 63, 92, 44, 4,191, 90,166,112,190,228,149,176,190,
+232,184, 6, 63, 91,120, 44,191,208, 36, 20, 63,166, 84, 79, 63,192,145, 89, 61,107,154,192, 60,171,233, 43, 60, 72, 13, 0, 62,
+ 52, 72, 87, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 34,131, 32, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,122, 39,106,191,130, 29,114, 63,156,123,164, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 48,195,105, 1,
+ 0, 0, 0, 0, 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, 97, 45, 63,
+120, 47,205,190, 35,117, 19, 63,168,125, 98, 62,240,195, 73, 62,124,228,243, 62,120, 86, 11, 63, 72,156, 89, 62,230,232, 88, 63,
+130, 53,204,190,148, 27, 54, 63,245, 38,133, 62,230, 55, 53, 60, 90,130,143, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 53,129,253, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 71,102,192, 7,110,194,190,108, 39, 47, 64,
+192, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,200,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80,196,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98,157,105,188,148, 8,184, 62,181,109, 7,191,177,194, 68,191,162, 77,220,190,
+ 58,120,101, 63, 0,106, 25, 61, 72,197, 86, 62,214, 78,236,190,126,136, 46, 63,150,203, 22, 61,130,161, 61, 63, 69,196, 79, 62,
+ 80, 22,160, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,112,148, 93, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 12,224,214, 63,227,182, 5,192,246, 59,136, 64,190, 81, 55,191,109,243, 71,191,102,237, 42, 63,236,163,214, 62,
+200,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,112,197,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 46, 24,191,
+ 41, 20, 43,191,185,184,183, 62, 44,173,136, 62, 76, 75, 50, 63, 40, 83,126, 62,188,195, 8, 63,232,211,238, 62, 64, 36,152, 61,
+236,106,145, 62,209, 28,131, 62, 30,255, 46, 60, 17,165,139, 60,114, 88, 55, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 93,122, 57, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99,158, 92, 63,115,243, 67,192, 15,154, 70, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,144,198,105, 1, 0, 0, 0, 0, 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,175, 4,191,158,200, 50,190,247,214, 77, 63,225,194,110,190,144, 10,198, 61,
+208,213, 62, 62,144,163,253, 61,112,130,160, 61,201,229,101,191,104,145, 50, 62,103, 55,104, 61, 9, 23, 9, 61,208, 82,129, 62,
+177, 65, 40, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 89, 81,220, 60,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 87,234, 31,192,204,234, 65,192,108,200,172, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,176,199,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162,180, 99, 63,
+129,169,145, 62,112, 95,174, 62,161,121,223,189,174,190, 73, 63,120, 72, 51,190,116, 48,162,190, 56, 98,139,189, 76,245,191, 62,
+ 80,124,253, 61,197,252, 48, 60,163,176, 62, 62,216, 93, 72, 63, 94, 65,166, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 81, 69, 12, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74,122,189,191,238,243,102,191,158,253, 93, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,208,200,105, 1, 0, 0, 0, 0, 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,139,218,189,160, 81,222,190, 77, 71,151,190, 48, 33, 88,191,152,174,128,190,
+ 44,218,107,190, 40, 96, 66,190,220, 29,113,190, 88,240,184,190,152, 92,204, 62,101,159,135, 62,252,216,174, 62,218, 99, 96, 62,
+104,171, 50, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 5, 27,207, 61,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,223, 75, 67, 63,208,124, 78, 61,200,150,171, 64,190, 81, 55,191,106,243, 71,191,102,237, 42, 63,233,163,214, 62,
+201,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,240,201,105, 1,
+ 0, 0, 0, 0, 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, 19,190,190,
+189,203,147, 62, 26,242, 2, 62,224,138, 95, 63,128, 50, 24, 60,148,174, 64, 63,196,158, 11,191,220, 22, 64, 63,100, 35, 19,190,
+216, 93, 44, 62,192,115, 58, 63,107,198, 2, 60,236,102,167, 59,175,100,132, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,189,176, 27, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240, 36,139, 62,248,230, 62, 63,173,205,179, 64,
+192, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,200,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16,203,105, 1, 0, 0, 0, 0, 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,220,239, 60,168,204, 46,191, 74, 95, 84, 61, 8,105, 58,191,232,245, 43, 63,
+ 92,254,151, 62, 80,143,206, 61,176,139, 42, 63, 26,107,196,190,150,211,139,190, 50, 23, 92, 63,172, 27, 15, 61, 11, 43, 83, 60,
+ 57, 83,189, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,121,221, 49, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 34,247,225,191, 36,175, 81,192,248,254,198, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80,166,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60,132,130, 62,
+129,166,120,190, 15,191,109,191,174,164,238, 61, 20, 93, 78,190,248,164,231,189, 0,255, 16, 62, 62,189,234,190,112,167,116,189,
+ 68,175, 16, 63, 66,132, 2, 61,192, 37,189, 61,173, 5, 64, 63, 91,181, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,129, 93, 2, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232,110,165, 61,209, 43,239, 62,128,243,169, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,201,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,112,167,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,173,218, 49,191,113,109, 23,191, 30, 16, 55, 62, 55,117,188,190, 24, 20,208, 62,
+118,245, 46,191, 0,158,236,186, 55, 10, 97,191,140,128,183, 62,178,230,146,190, 62,109, 66, 63,246,159,170, 61, 85,150,243, 60,
+ 72,136, 2, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 96, 85, 48, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 14,158,243,191,244,237,104,192,136, 34,155, 63,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,144,168,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,155, 22, 49,191,
+222,232,165, 62,133,208, 6,191, 93,253,190,190,190,234,194,190,240, 89, 29,191,134,110, 23,191, 8,217, 30,191,108,159,205,190,
+ 18, 94,185,190,229,106, 92, 60, 23, 25, 35, 61,136,111, 93, 63,212,105,167, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,252,153,132, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, 74, 8, 63,255,239, 1,192, 28,123,108, 64,
+190, 81, 55,191,106,243, 71,191,102,237, 42, 63,233,163,214, 62,201,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,176,169,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,217,155,104, 63,216,164, 29,190,175, 60,179,190,203,201, 43, 62, 96, 60, 67, 61,
+176, 42, 90,189, 68, 85, 4,191, 68,249,130, 62,230,199,133,190,148, 14,107, 63,233,242,101, 62,183,120,181, 61,232,136, 43, 62,
+245,241, 4, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,252,179,108, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 30, 24,231,191, 44,105, 21,191,187, 32, 98, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,208,170,114, 1,
+ 0, 0, 0, 0, 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, 52, 49,191,
+202, 9, 43, 63,166,234, 96,190,182,210, 37,190,192, 58, 54, 61,232, 1, 63, 63,134,173, 34,191, 4,154,170,190, 92,112, 51, 63,
+ 18, 61, 23,191, 67,189,138, 62,116,103,210, 62,114,128, 62, 62, 32, 54, 7, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 33,132,126, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,145, 52, 5,191, 10,103, 49,192,233,154, 37, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,240,171,114, 1, 0, 0, 0, 0, 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, 96, 32, 63,185,201,160, 62,160, 3, 6, 63, 11, 34,248,190,192, 53,185, 60,
+192,197,178, 61,174,184, 53, 63,224,172,162,190,108,136,224, 62,142,173, 61,191,135, 47,184, 61,247,157,207, 61,168, 0,225, 62,
+249, 11,189, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,248,112,150, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,134, 45,177,191, 34,253, 99, 63, 8, 58,155, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16,173,114, 1,
+ 0, 0, 0, 0, 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,202, 55, 63,
+247,235, 89,190,127, 18, 92,190,146,129, 32,191, 8,212, 8,190,168, 50,171,190, 96,120,123, 62,232,152,249,189,140, 18,149, 62,
+ 32,111, 13, 61,147,253, 28, 63,230,184,184, 62, 51, 48, 58, 60, 59, 78,111, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,115, 61, 18, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34,255, 57,191,231, 4, 65,192, 78, 7, 19, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 48,174,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,204,218,133,189,113, 10,176,189,186,237, 10, 63, 14, 61, 85, 63,180,219, 38,190,
+176,175,206, 62, 46,240, 10, 63, 32,232,114,190, 92,162,207,190,172, 85,193,190,228,255,128, 61, 73, 32,172, 61,146,152, 5, 63,
+206,134,169, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 62, 38,212, 60,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,182, 68,137,191,204,177,226, 61,196,247,141, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80,175,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,137,138,146, 61,
+191, 75, 8,187, 25,235, 68, 62,122,141,122, 63,116,117, 92, 63, 8,147,125,190, 88, 49,147,190, 8, 88, 41, 63, 64,255, 2, 63,
+ 64, 44,126, 61,107,166, 0, 63, 23, 29,154, 62, 34,214,165, 61, 42,130,236, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,241,170,103, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20,103, 82,192, 72, 75,201,191, 3,247, 0, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,112,176,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,120,168, 62,178,154, 7,191, 41,180, 48, 63,240,232,187,190, 9, 35,104,191,
+224, 8,114, 62, 76,143,177,190,106, 29, 28,191,208,112,234, 62, 8,249, 92,190, 78,110,118, 59,167,155, 4, 63, 69, 2,243, 62,
+182,199,108, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 74, 4,184, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,196,241,246,191, 95,130,236, 62, 50,209,135, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,144,177,114, 1,
+ 0, 0, 0, 0, 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,197,223, 62,
+ 33,243,189,190,199,213,140,190, 13,149, 69,191,222,235,199,190,160, 79,240, 62,112,202, 14,190,184,168, 60,190, 4,145,220,190,
+ 44, 8,148, 62, 47, 99,219, 62, 87, 73,242, 62,132, 14, 79, 61, 70,141, 67, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,157,236,192, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,228,149,189, 15, 14,221,190,209,251,145, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,176,178,114, 1, 0, 0, 0, 0, 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, 19,190,190,189,203,147, 62, 26,242, 2, 62,224,138, 95, 63,128, 50, 24, 60,
+148,174, 64, 63,196,158, 11,191,220, 22, 64, 63,100, 35, 19,190,216, 93, 44, 62,196,141, 4, 63, 1, 71, 19, 62, 65,186,174, 61,
+103,146,129, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,189,176, 27, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 20,120, 89, 62, 92,169,120,190, 29, 78,155, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,208,179,114, 1,
+ 0, 0, 0, 0, 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,201, 94, 63,
+194,189,213, 62,141, 27, 67, 62,215, 93, 55,190, 6,154,131,190,132, 48,178,190,140, 11,192,190, 40,123,147,189, 28,130, 57,191,
+ 44,253, 33,190,226, 89, 24, 63,192,174,198, 61, 0,152,101, 61,141,237,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 59,122,117, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 80, 26,192,152, 3,239,189,183,210, 99, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,240,180,114, 1, 0, 0, 0, 0, 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, 16,153,190,223, 1, 33,191, 43,253,168, 62,253, 36, 35, 63,124,255, 19,191,
+ 70, 97,138,190,192,109, 6, 62, 64, 58,223,190,152,121,189,189, 8,126,170, 62,117,248,126, 62, 83, 41, 12, 63,152, 55, 4, 62,
+ 62, 85,152, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 74,244,106, 61,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 80,245, 70,190,135,148, 37,192, 40,107, 57, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16,182,114, 1,
+ 0, 0, 0, 0, 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,246,249, 62,
+199,102,140, 62,155,199, 10, 63, 39,102, 32, 63, 78, 10, 19,191,224,238,250,190, 0, 13,111,190,240,232,187, 61,104, 10, 99, 62,
+164, 96,221, 62,208,237,239, 61, 8, 34,210, 61, 61,101,181, 62,204, 22,218, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 35,143, 25, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,173, 25,191, 65,234,249,191, 59,217, 73, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 48,183,114, 1, 0, 0, 0, 0, 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,109,230, 62, 67, 47,189,190,208,119,155,189,238, 53, 79,191,223,144, 88,191,
+ 88,163,146, 62, 64, 99,208,190,236,235,130, 62, 72, 10, 17,190,124,223, 15, 63, 12,172, 64, 62,161, 24, 51, 62,145, 49,156, 62,
+ 24,236,169, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,254,237, 72, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 63, 60,192,189, 70,245,191,243,177,248, 63,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80,184,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50,162, 16, 63,
+ 33,180,219,190, 24,166,177,190,234, 8, 29,191, 24, 26, 48,190,240, 70,115,190, 0,197, 54, 63, 72,201, 75, 62, 32,174, 10,189,
+ 82,128, 78, 63,159,109,175, 60, 10,135,214, 62, 58, 12, 9, 63,133,154,198, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 34, 50,138, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6,125,162, 63, 64,233, 64,192,144,167, 86, 64,
+190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16, 51,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,234,120, 11, 63,200, 35,253,190, 3,152,233,190, 0, 38, 0,191,214, 3, 36,191,
+ 4,239, 45,190,136,175, 9,191, 16,130, 42,190,156,197, 38, 63,182, 37,238,190, 3, 49,119, 61,118,251,224, 60, 93, 5, 47, 62,
+189,195, 61, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 89,162,191, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,184, 96, 27,192,250, 23,179,191,194, 77, 38, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 48, 52,105, 1,
+ 0, 0, 0, 0, 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,231, 32,191,
+150, 89,239, 62,128,156,188,190,225, 45, 0,191,248,133,210, 62, 52,169, 40, 63,146,184, 26, 63,210, 39,223,190,182,238, 15,191,
+ 74, 63,146,190,168,161,213, 61,218,242,218, 62, 37, 18,191, 62, 88, 74,194, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 81,236,129, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,181, 0, 21,191,137,241, 14,192,206, 27, 61, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80, 53,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 79,213,190, 94, 19, 10, 63, 60, 25, 56,191,192,193, 10, 62,128,232, 10,190,
+160,126, 93,190, 24,169, 7, 63, 38,209,221,190, 52,214,186, 62, 20, 63, 41,191, 59, 36, 27, 62,244,151, 28, 62, 83, 23,179, 62,
+150, 10,177, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 98,241, 41, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 80, 57,189,194, 80,166,191,242,172,123, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,112, 54,105, 1,
+ 0, 0, 0, 0, 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,174,232, 62,
+ 63, 99,164, 61, 41,108, 12, 63,106,126, 50,191, 64,117,124, 62,134, 54, 82, 63, 36, 55,191, 62,120,232,197,190,192,203, 70,189,
+ 26, 88, 51,191,198,225,170, 62,113, 67, 23, 62,201, 56, 33, 62, 27,224,184, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,216,213,138, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,218,106,219,190, 34,216,127, 63,142,251,173, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,144, 55,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,215, 79,213,190, 94, 19, 10, 63, 60, 25, 56,191,192,193, 10, 62,128,232, 10,190,
+160,126, 93,190, 24,169, 7, 63, 38,209,221,190, 52,214,186, 62, 20, 63, 41,191, 7,203, 79, 63,111, 14, 32, 62,255,238, 44, 60,
+ 59,180,175, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 98,241, 41, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,110, 39, 91,192, 65, 81,150,191, 89, 68, 15, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,
+200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,176, 56,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,131,212, 0,191,
+ 16,161, 38,191,131,203,123,190,208, 48, 3,191,112, 6, 64, 63,136, 53, 34,190,175,202, 6,191, 64,241, 19, 62,120,105, 85,190,
+144,246,146, 61, 23, 88, 25, 60, 83, 74, 25, 63,200,185,196, 62,208,179,249, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,198,223, 90, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,231, 17, 40, 63,155, 44,153,190, 68,123,161, 64,
+190, 81, 55,191,109,243, 71,191,102,237, 42, 63,236,163,214, 62,200,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,208, 57,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69,219, 68, 63,191, 75, 74, 62,251,129,229, 62,197, 78,210,190, 64, 63, 59,188,
+172,173,214, 62, 16,159, 85, 62, 24,160,185,189,169,193, 46,191,176, 21, 77,190,202,133, 32, 63, 25,163, 36, 61, 44,136,225, 60,
+132, 71,156, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 22,208,141, 61,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 50, 95,160, 63, 33,101,249,191,177, 96,132, 64,190, 81, 55,191,109,243, 71,191,102,237, 42, 63,236,163,214, 62,
+200,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,240, 58,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,178, 25,236,189,
+127,158, 27, 63,122,235,239, 62, 59,108, 33, 63,244,198,103,190,252,192,187, 62,180, 39,101,190,108,210,138, 62,145,168, 54,191,
+208, 20, 63,190, 62, 45,138, 62, 35,142, 30, 61,173, 78,128, 61,170,246, 32, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 2,210,109, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,110,133, 6,192,171,152,225,191, 84, 16, 32, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16, 60,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,186, 57,241, 62,210,244,173, 62,197,195,188, 61,228, 10, 79, 63, 14,223, 34,191,
+172, 65, 40,190,160,228, 38, 61,186,225, 12, 63,192,196, 13,189,186,253, 14,191,241,107,217, 61,249,147,174, 62,230,232,218, 62,
+ 70, 80, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 8,168,183, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 82, 99,228,190, 40, 59, 51,191,220, 75,133, 64,190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+198,206,183,190,203,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 48, 61,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,191, 23, 63,
+250,209, 82, 62, 34, 21,204, 62, 21, 58, 43, 63, 0, 3,139, 61, 48,159,135, 61, 32,117, 36,189,232,123,244, 62, 80,104,185, 62,
+ 18, 73, 33, 63,114,208,213, 62,122,118, 76, 62, 34,254, 5, 62, 63,245,128, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,179,246, 4, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86,101, 74,192,162,185,105,191, 18,141, 36, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 80, 62,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,221,157, 3, 63, 67, 81,215, 62,135, 46, 5, 63,121,108, 9,191, 36, 83, 16,190,
+ 38,244,130,190,192, 18,216, 62,222, 44, 53, 63,152,136,162,189, 80,138,252,190,222,214,102, 61, 50, 22, 25, 63,139, 42,157, 62,
+164,113, 30, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,145,208, 26, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,124,234,218,191, 45,177,232,191,109,174, 42, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,112, 63,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, 41, 59,191,
+238, 70,252, 61, 77, 96, 25,191, 33,195,154,190, 32,119,242,190,124, 79,204,190, 24, 53, 18,190,102, 31,214,190,166,174,199,190,
+ 32,105,169,188,231, 50, 8, 62,230,251,148, 62,128, 65,206, 62, 72, 82, 49, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 44,230, 5, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,254,106,206,191,179, 36,150, 62, 96, 42,137, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,144, 64,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51,191, 23, 63,250,209, 82, 62, 34, 21,204, 62, 21, 58, 43, 63, 0, 3,139, 61,
+ 48,159,135, 61, 32,117, 36,189,232,123,244, 62, 80,104,185, 62, 18, 73, 33, 63, 87, 15,231, 62, 50,237,207, 62,254, 43,141, 61,
+226,225,150, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,179,246, 4, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,200, 61,167, 63,119, 5,171,191, 88,214,147, 64,190, 81, 55,191,109,243, 71,191,102,237, 42, 63,236,163,214, 62,
+200,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,176, 65,105, 1,
+ 0, 0, 0, 0, 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, 39, 70, 63,
+ 89,103,218,188, 45, 24, 30, 63, 26, 81, 12, 62, 26,129, 16, 63,208,153,162, 61, 11,203, 31,191,222,132, 2, 63, 26, 4,154,190,
+200,112,100, 62,215, 36,214, 62,168, 85,122, 60, 41,247,142, 60,132,140, 12, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 48, 61,115, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,196, 14,251,191, 16,213,105,190,166,188,109, 64,
+190, 81, 55,191,106,243, 71,191,102,237, 42, 63,233,163,214, 62,201,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,208, 66,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,173, 49, 3,191,179,133, 9, 63,104, 18, 16, 63,157, 16,186, 62,184,147,245, 62,
+224, 88,111, 62,220, 25, 2, 63, 80, 44, 77,191, 76,136,152, 62,128,242,176, 61,239, 13,155, 62, 41, 17,234, 62, 93,128, 13, 62,
+225,130,208, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 65,147,208, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,105, 47, 46,192, 88,212, 45, 63, 62, 35,127, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,240, 67,105, 1,
+ 0, 0, 0, 0, 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,164, 48, 63,
+ 32,100, 38,191,163,157,157,190, 14, 78,167, 61, 0, 8, 54, 59,140,155,147,190, 10, 41, 50, 63, 28,101,140, 62,242,237,110, 63,
+ 0,188,179, 59, 76, 31,165, 62,210,208, 37, 63, 76,227,141, 60, 10, 28, 76, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,129, 24, 80, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22,203, 83,191,127, 15, 29,192,240, 82, 42, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 16, 69,105, 1, 0, 0, 0, 0, 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,194,232,190,155,110, 35, 63,233,200, 75,190,170,158, 22,191, 80,122,193,189,
+216, 58,149,189, 80, 15, 18,191, 64, 37,145,189, 96,184,219,189, 70,185, 86,191, 38,150,239, 61,142,193, 24, 62, 40, 71,217, 62,
+137,114,158, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,122,231, 75, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 51, 71,102, 63, 24, 13, 44,191, 26,187,156, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192, 74,105, 1,
+ 0, 0, 0, 0, 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, 40, 61,190,
+150,196, 15,191,159,219, 54,191,233,195,191, 62,104, 96,122,190,192, 71, 74,191, 16,230, 56,190, 64,156,203, 61,224, 39,177, 61,
+ 26,222,193,190,177,206, 13, 63,144,101,237, 60, 18,227,198, 60, 19, 30,201, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 74,137,189, 61, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,172,210,252, 62,212, 58, 44,191, 99,217,149, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,201,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224, 75,105, 1, 0, 0, 0, 0, 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,152, 38, 63,169,225, 17,191, 60,217,140,189, 67,124,254,190, 16, 65, 17, 62,
+230,204, 15, 63,180,148,241, 62,175,210, 73,191,182,161, 21, 63,192,222,169,188,235,174, 4, 63,126,216,156, 61,114,228,115, 61,
+126,239,176, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 86,104,165, 61,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,181,210, 46,192, 59, 4,135,191,167, 99, 44, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,
+200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 77,105, 1,
+ 0, 0, 0, 0, 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, 97, 45, 63,
+120, 47,205,190, 35,117, 19, 63,168,125, 98, 62,240,195, 73, 62,124,228,243, 62,120, 86, 11, 63, 72,156, 89, 62,230,232, 88, 63,
+130, 53,204,190,152, 69,201, 61, 74,143, 3, 63,155, 10,162, 62,186, 21,146, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 53,129,253, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,231, 64, 60,203,210,147, 63,204, 32,185, 64,
+192, 81, 55,191,109,243, 71,191, 98,237, 42, 63,233,163,214, 62,199,206,183,190,198,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 32, 78,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,133,137,136, 62,101, 7,106,191,250,249,155,190,188,218,155, 60,192,212,184,188,
+ 72,215,201,189, 40,244, 61,191,128,234, 70, 61,154,226, 1,191,118,139, 91, 63,135,168,109, 63, 85, 44,112, 61, 69, 72,115, 59,
+186, 90, 24, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 6, 40, 87, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,159,185, 0,192,197,235, 38,192,184,221,245, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 64, 79,105, 1,
+ 0, 0, 0, 0, 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, 54,241, 62,
+ 25, 75, 60,190,136, 31,166,190, 26,162, 76, 63,212, 23,180, 62,134, 28, 22,191,188,125,184, 62,170,143, 49, 63, 40,100,208, 62,
+202,182, 12, 63, 90,123,103, 61,230, 65, 90, 62, 33,215, 29, 63,131, 5,233, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,233, 6, 78, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,134,118,247,191, 86, 66, 8,192, 90, 88, 20, 64,
+190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,198,206,183,190,203,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 96, 80,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,149,157, 62,171,241,150, 62,211, 72, 5, 63,196, 98, 61,191, 94, 43,103,191,
+144,249, 13, 62,108, 40, 28,190,176,143, 89,189,160,169,180, 62, 50,210,102, 63, 12,245,186, 61,252,211,140, 62,239,184,252, 62,
+162,107, 15, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,234, 53,126, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,112,252, 2,190,192, 32, 63,192,250,176, 40, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128, 81,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,226,185,185, 62,
+ 69, 55,133,190, 78,101,246, 62,146, 32, 65,191, 12,142, 47,190,208,240, 16,191,192, 47,250, 60,148, 12,135, 62,250,130,192,190,
+182,224, 63, 63,110,251,141, 61,211, 15,135, 61,153,122,212, 62,150, 66,230, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,194, 22,201, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,184, 37, 60,192,208, 36, 19,192,202,102,212, 63,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,160, 82,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,133,116,253,190,160,178, 23, 63,114, 78, 32,191, 59, 97,221, 61,192,244,236,189,
+204, 56,214, 62, 76,142, 40,191, 32, 48,161, 61, 82, 95, 7, 63,244, 70, 62,190,199,146,141, 59, 23,189,182, 62, 10, 24, 34, 63,
+ 60, 34,183, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 51, 4, 90, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 62,165,155, 63, 34,188,200,191,156,201,140, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192, 83,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68,198,205, 62,
+ 50, 21, 99, 63, 18,246, 86,190,239, 24,178,189,232,177, 74, 62,232, 94,174,190, 16,113, 17,189,144,148,211, 62,156,182, 80,190,
+ 18,214, 66,191, 55,112,182, 62,157,202, 2, 61, 67,146, 40, 61, 23, 18, 18, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,229, 84,124, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,134, 48, 1, 63,115, 14,211, 62,119,209,175, 64,
+192, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,200,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224, 84,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 0,181, 60,183, 21, 39, 63,174, 28, 42,191,206,254,185, 62, 64,101,180, 61,
+224,164,162, 62,169, 22, 78,191, 14,164,146,190, 68, 47,188, 62,233,255, 63,191, 26, 61, 76, 63,219,234,171, 60,236,187, 47, 60,
+123,146, 46, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,113,195, 41, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,196,144, 98, 62, 53,190,112,191,153,224,138, 64,190, 81, 55,191,106,243, 71,191,102,237, 42, 63,233,163,214, 62,
+201,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 86,105, 1,
+ 0, 0, 0, 0, 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, 80,148,190,
+ 18,138, 5, 63,169, 16, 38, 62,107, 50, 73,191,214,126, 32, 63,144, 14,148, 62,182, 31, 4,191, 72,152,145, 62, 16, 32, 89,189,
+ 64,239,100, 62, 51,212,220, 62, 48, 96,238, 61, 2,246,205, 61, 65, 22,180, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,247, 33, 76, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,243, 2,192, 18, 84, 91,191,110, 0, 77, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 32, 87,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49,146, 69,191,235,123, 69,190,179,188, 26,191,213,182, 47,189, 96, 14,105,191,
+ 56,120, 31,190,136, 41, 18, 62,208, 73,183,189,112, 99, 57,189, 32,155,137,190,111,143, 79, 62, 12, 36,220, 62,207,171,119, 62,
+169,124, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,184,151,199, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,228, 81, 34, 62,178, 55, 39,192, 87, 36, 68, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 64, 88,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,230,148, 3, 63,
+224, 68,239, 62, 74, 64,241, 62, 71, 35, 11,191,248,202, 31,191, 68, 98,182, 62, 18,127, 48,191,160,108, 26,189,144, 93,173,190,
+160,155, 16,191,143, 72,244, 61,152, 98,173, 61, 16,243,154, 62, 39,162,252, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 69,111,245, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224,206,132,191,153,157,254,191, 61, 78, 57, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 96, 89,105, 1, 0, 0, 0, 0, 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, 64,217, 62,153, 24,213,190, 97,174,187, 61,103,136, 76, 63, 26, 1, 32, 63,
+232, 95,162,189,124, 18, 29,191, 76, 78,155,190,124,134, 43,191,174,202,184,190, 49,138, 35, 62,234,209, 85, 62,126, 75,186, 62,
+115, 6,137, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,111,100, 76, 61,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,220,163,237, 62, 54, 20, 58,192, 9,122, 64, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128, 90,105, 1,
+ 0, 0, 0, 0, 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, 95, 55,189,
+ 43, 21,181,190,230, 3,101,191, 87,248,137, 62, 8,208, 75, 62, 0,116,115, 59,100,196, 95,190,192, 15, 83, 62, 84,222, 81,191,
+ 36, 58,169, 62,187,215,163, 61, 90,207, 92, 61,187,248,152, 62,181, 59, 17, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,230,119,112, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 59,148,191,188,242, 56,191,189,111,113, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,160, 91,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,203, 21,192, 61,216, 22, 8, 63,188, 84, 66, 63,159, 70,186, 62,240,211, 98, 62,
+124, 7,155, 62, 12,134,246, 62,108, 16, 79,190,248,197,252,189, 80,188, 39, 63, 42,204,169, 62,204,195,154, 62,146,225, 51, 62,
+125,254, 66, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,123, 26, 81, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 32,179,252,191, 87,102,184,191,168,174, 51, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192, 92,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,233, 50,144,190,
+207, 31, 50,191,179,203, 40,191,211, 99, 45,189,108,153, 34,190,239, 94, 10,191,114,186,212,190, 40,234, 19,190, 72, 26, 97,191,
+128,105, 99, 61, 46,210, 21, 62,250, 32,186, 62,196,126,178, 62, 86,238, 16, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,131,240,124, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,244, 77,192, 37, 52,163,190, 30,234, 62, 64,
+190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224, 93,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,125, 41,112, 63, 48,166,164, 61, 88, 4,240, 61, 15,172,161, 62,106,126,191,190,
+116, 33, 64, 63,128,227,184, 62, 92, 20,244,190,208,168,180,189, 60, 25, 43,191, 90,246,198, 61, 31,130, 46, 63,224,241, 54, 62,
+222, 41, 46, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,190,196,107, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,251, 27,122, 63,181,229,133,191, 64, 39,149, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 95,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 46, 24,191,
+ 41, 20, 43,191,185,184,183, 62, 44,173,136, 62, 76, 75, 50, 63, 40, 83,126, 62,188,195, 8, 63,232,211,238, 62, 64, 36,152, 61,
+236,106,145, 62,215, 4,239, 62,239,100, 21, 61,177, 73, 20, 61, 82,197,235, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 93,122, 57, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 66,151,191,209,139, 62,192, 97,118, 5, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 32, 96,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,158,160, 32,190,190, 39, 52,191,142,138, 9,191,138, 13,224, 62,168,218,242, 62,
+ 92, 71, 26, 63, 32, 22, 52, 62,232, 52,124, 62,164, 91,192,190,148,111, 86,191,207,101,120, 61, 65, 26,221, 61,159, 82, 22, 63,
+241, 14,122, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,195, 96, 22, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,208, 63, 46,190,222,105,107,191,197,191,132, 64,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128, 3,105, 1,
+ 0, 0, 0, 0, 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,202, 55, 63,
+247,235, 89,190,127, 18, 92,190,146,129, 32,191, 8,212, 8,190,168, 50,171,190, 96,120,123, 62,232,152,249,189,140, 18,149, 62,
+ 32,111, 13, 61, 91,238,204, 62, 9, 90, 39, 62,122,156, 6, 62, 99, 22,156, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,115, 61, 18, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,250,148,234,190, 11,179, 97,192, 16,215, 3, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,160, 4,105, 1, 0, 0, 0, 0, 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,227,248,190,160,134,192,190,155,159,184, 62,105,157, 51, 63, 2, 56, 54, 63,
+ 88,126,182, 62, 0,207, 4,187, 40,216,198, 62,140, 66, 73,191,144,126,248, 61,250, 26,119, 60, 35,207,150, 60,170,176, 20, 63,
+225,120,197, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,208,234,216, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,202,177,135,191,150,220, 86,192,144, 9,239, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192, 5,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,201,122, 18,191,
+155, 68,163,190,236, 36, 39,191,221,182,194,190,216, 47, 98,190, 98, 46,230,190,196,236,134, 62,192, 40,187, 60,112, 92,179,189,
+ 72, 17, 54, 63, 87,169, 5, 61,120,116, 92, 61,179,253, 38, 63,225,192,133, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,100, 58,154, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,214,105,108,192,107,145,223, 62,196,182, 82, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224, 6,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,244, 32,190,175,189,218,190,167, 11, 55, 62,157, 75, 95,191, 32,155,243,190,
+180, 86, 90,191, 56,237, 86, 62,224,198,126,190, 32, 34,101, 61, 92,239,180,190,206, 82,204, 61, 44,113, 89, 63, 62, 63, 23, 61,
+219, 33,100, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 6, 63, 50, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 92, 23,243, 62, 46,133,166,191, 79,153,134, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 8,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,173,218, 49,191,
+113,109, 23,191, 30, 16, 55, 62, 55,117,188,190, 24, 20,208, 62,118,245, 46,191, 0,158,236,186, 55, 10, 97,191,140,128,183, 62,
+178,230,146,190,158, 2,190, 62, 33,141,193, 61,217, 93,214, 61,163, 2,220, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 96, 85, 48, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,130,192,214,190,181, 57, 73,192,176, 83, 23, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 32, 9,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,206,172, 34,191, 67, 79,187, 62,140,197, 11, 62,199,135, 42, 63, 96, 91,148, 61,
+128, 75, 25, 60, 56,126,232,189,208,190,220,189, 8,158,186, 62,182, 62,225,190,213,103, 84, 61, 92,194,115, 61,146,216,253, 62,
+ 40, 34,201, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 38,103,162, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,123, 4,133,192, 83,136,128, 62,136, 58, 58, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 64, 10,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,147,206,137, 62,
+234,207, 11, 63,195,144,225, 62,162,225, 40, 63, 24, 69,148,190, 48,238,190, 61, 13, 31, 86,191,218,106, 71, 63,248, 60, 1, 62,
+160,250,136, 62,231, 78,156, 58,143,100,108, 63, 18, 72,153, 61, 52, 34, 17, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,174,199, 41, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,116, 40, 12, 62,101, 32, 1,192,220,178, 95, 64,
+190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 96, 11,105, 1, 0, 0, 0, 0, 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, 57, 95, 63,237,148,214, 62, 88,249,109, 62,231,220,204,189,240,118,221,189,
+121,162, 19,191,202, 50, 48,191, 56,232, 80,190,142,100, 8,191,228,142, 19, 63,225,196, 88, 62,137, 94,237, 61,140, 5, 97, 62,
+ 40,195,231, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 75, 11, 15, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,211,109, 80, 63, 95,210, 20,192,246,253,103, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128, 12,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 32,133, 62,
+ 13,201,189,190, 54, 43, 66, 63, 73,254,239, 62, 0,164,179, 62, 0,181,171,188,128, 8,196, 60,214, 27, 14,191, 86, 32,128,190,
+190, 27,208,190, 68,196, 53, 62,136,184,135, 61,240,250, 35, 62, 34,153, 24, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,224, 93,234, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,142,147,191, 8, 7,166,190, 61, 69,130, 64,
+190, 81, 55,191,106,243, 71,191,102,237, 42, 63,233,163,214, 62,201,206,183,190,202,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,160, 13,105, 1, 0, 0, 0, 0, 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,246,249, 62,199,102,140, 62,155,199, 10, 63, 39,102, 32, 63, 78, 10, 19,191,
+224,238,250,190, 0, 13,111,190,240,232,187, 61,104, 10, 99, 62,164, 96,221, 62, 56,243,206, 62,109,170,159, 62,223,145, 2, 62,
+211, 50, 32, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 35,143, 25, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 6,254, 89,191,191,197, 85,192,180,197,254, 63,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192, 14,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,121,125,204, 62,
+ 38, 10, 46, 63, 69, 71, 26,190,131,168, 24, 63,116,105, 36,190,144,220, 32, 63, 12,167,231, 62,152,145,179, 62, 32, 72, 36,190,
+ 42, 67, 50,191,130, 3, 11, 61, 13, 3, 76, 61,228,181, 28, 63,102,179,155, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,244,186,188, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 46,253,191,200,126,214, 61,251, 1,125, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224, 15,105, 1, 0, 0, 0, 0, 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,218,181,190,161,100, 80, 63, 86, 18,175,190,141, 51,157,190, 18, 35, 4,191,
+208,113,210, 62, 0,170, 11, 63,134,126,165,190,144, 47, 59, 62,104,163, 62,191, 20,251,181, 62,223,163,242, 62, 90, 98,191, 61,
+223, 33,158, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 83, 76,104, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,114, 18, 94,192,208, 61, 49, 61, 94,153, 71, 64,190, 81, 55,191,107,243, 71,191,100,237, 42, 63,233,163,214, 62,
+200,206,183,190,204,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 17,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,125, 41,112, 63,
+ 48,166,164, 61, 88, 4,240, 61, 15,172,161, 62,106,126,191,190,116, 33, 64, 63,128,227,184, 62, 92, 20,244,190,208,168,180,189,
+ 60, 25, 43,191,145,188,190, 61,117,157, 68, 63,105,119,224, 61,118,129,239, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,190,196,107, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 34,141,191,223,140, 39,192,178, 55, 25, 64,
+190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 32, 18,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,193, 40, 85, 63,120, 79,146,190, 68,249,203,190,206,217,131, 62,230, 65, 22, 63,
+120,104, 63, 63,176,135,124,189,130,179,190,190,208, 81,171, 62,210,132, 69, 63,122, 6,189, 61, 59,195, 23, 62, 10,114,254, 62,
+188,106,134, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,179,102, 20, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,149, 14, 63,192, 64,204,165,191, 11, 96, 24, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,
+202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 64, 19,105, 1,
+ 0, 0, 0, 0, 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, 81, 30,191,
+157, 39,223, 62,214, 30, 11, 63, 76, 51,186, 62,208,228, 83, 62,224,146, 0, 61, 22,106,121, 63, 0,124, 6,187, 0,234, 71,187,
+216,190,173, 62, 15, 67, 83, 61,192,186, 4, 63, 40,206,197, 62,178,159, 50, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,208, 19, 52, 60, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,183,180, 22,192,125,173, 4,192,238,189, 8, 64,
+190, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,198,206,183,190,203,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 96, 20,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105, 59, 20,191, 31, 36, 17, 63,112, 57,252,190, 32,101,162, 62,140, 6,160, 62,
+ 64,160, 80, 61,112,243,245, 61, 40, 18,224,190,192,154,227,188,238,196,139,190,133, 49,131, 61,129, 33,167, 62,160,225, 5, 63,
+124, 59,177, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 20,166, 56, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 24,160, 97, 63,127,220,163,191,193,248,141, 64,192, 81, 55,191,107,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+197,206,183,190,202,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,128, 21,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,180,149,157, 62,
+171,241,150, 62,211, 72, 5, 63,196, 98, 61,191, 94, 43,103,191,144,249, 13, 62,108, 40, 28,190,176,143, 89,189,160,169,180, 62,
+ 50,210,102, 63, 78,174,206, 62, 66,159, 93, 61,158, 84,118, 61, 56,211,246, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,234, 53,126, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,223, 18,192,153,169,140,191,151, 18, 57, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,160, 22,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,187, 63, 44, 63,134,104,136, 62, 45,117, 32, 63,178,227,147,190,254, 77, 90, 63,
+ 0,117,175,190,120, 69,167, 62,240, 73,138, 61, 56,211,189, 62,210, 28, 37,191,245, 96, 21, 62, 38,104,227, 62, 82, 62,154, 62,
+ 62,164,222, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,130, 27,151, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,100,193,179,191,252,111, 78,192,161, 64,228, 63,190, 81, 55,191,109,243, 71,191, 98,237, 42, 63,234,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,192, 23,105, 1,
+ 0, 0, 0, 0, 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,101, 4,191,
+237, 90, 0, 63,105,125,239,190,131, 31, 3, 63,200,160,212,190,114,217, 27, 63, 56,189, 6,190,132,223, 22,190, 4,241,223,190,
+ 4, 70, 0,190, 38,242, 35, 61,205,214,171, 61,176, 25, 46, 63, 82,177, 72, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,184,249,202, 62, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 90,124,191,113, 48,212,191, 57,208, 74, 64,
+190, 81, 55,191,109,243, 71,191,100,237, 42, 63,232,163,214, 62,202,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,224, 24,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,178, 25,236,189,127,158, 27, 63,122,235,239, 62, 59,108, 33, 63,244,198,103,190,
+252,192,187, 62,180, 39,101,190,108,210,138, 62,145,168, 54,191,208, 20, 63,190,188,178, 81, 62,178, 57,108, 62, 93,177,153, 62,
+110, 88,135, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 2,210,109, 63,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,252,231, 33,192,132, 2, 59,191, 77,162, 66, 64,190, 81, 55,191,109,243, 71,191,100,237, 42, 63,233,163,214, 62,
+201,206,183,190,200,137, 61,190,158, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 26,105, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,191, 46, 24,191,
+ 41, 20, 43,191,185,184,183, 62, 44,173,136, 62, 76, 75, 50, 63, 40, 83,126, 62,188,195, 8, 63,232,211,238, 62, 64, 36,152, 61,
+236,106,145, 62,215, 15, 30, 62,227,209, 4, 63,181,148,117, 62,217, 39,178, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 93,122, 57, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4,185,138, 63,193,128, 41,192,138,193, 97, 64,
+190, 81, 55,191,109,243, 71,191,102,237, 42, 63,236,163,214, 62,200,206,183,190,203,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0,190,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,229,120,168, 62,178,154, 7,191, 41,180, 48, 63,240,232,187,190, 9, 35,104,191,
+224, 8,114, 62, 76,143,177,190,106, 29, 28,191,208,112,234, 62, 8,249, 92,190,244,195,250, 61, 74,120, 62, 61,198, 12, 31, 62,
+203,252, 44, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 74, 4,184, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,234, 63,243,190, 82,176,159,191,246,150,111, 64,190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,
+202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 32,191,114, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, 26, 58,191,
+ 2, 70,159, 62,113,111, 2, 63,234,187,173,190,116, 51,237, 62,128, 53,247, 62,244,199, 26,190,232, 88,172,189,120,115,244, 62,
+ 34,147, 5,191,219, 77,158, 62, 43,131, 72, 62,117,208, 68, 62, 85, 8,155, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63,253,152,110, 63, 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,198,178, 48,191,138, 39, 52, 62, 40,252,149, 64,
+190, 81, 55,191,107,243, 71,191,102,237, 42, 63,233,163,214, 62,202,206,183,190,201,137, 61,190,157, 38, 80,191, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 64,192,114, 1, 0, 0, 0, 0, 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,167,210,190,195,172,139, 62,250,220, 35, 63, 30,182, 22,191,128, 3,136, 61,
+110,164,176,190, 30,153,147,190, 0,249, 10,188,234, 90,160,190, 90,241,205,190, 62, 71, 19, 63,111,215,107, 62, 63, 71,138, 61,
+242,231, 1, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,200, 66, 0, 0,200, 66, 0, 0, 0, 0, 0, 0,128, 63, 37,227, 77, 62,
+ 0, 0, 0, 0,255,255,255,255, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 80, 96,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,
+151,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 31,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 32, 19,124, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187, 63,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 23,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,151,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 39, 85,145,189, 35,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,176,101,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 71, 85,145,187,191,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 55, 85,145,188,255,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,251, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,192,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,128,127, 92, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 15, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,128,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 3, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,139,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 19,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,208,220,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,255,222,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+223, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,223, 84,145,188,223,223,124, 61,128,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,152,127, 35,189, 3, 62, 14, 62,166,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,
+135,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,251, 84,145,189, 19,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 0,219,135, 1, 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,128, 63, 0, 0, 0, 0, 7, 80,145,186,
+255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,191,223,124, 60,189, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,126, 35,188,255, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,135, 84,145,188,255,223,124, 61,128,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 20,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,104,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,235,137, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,231, 84,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 80, 0,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,
+255, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,167, 84,145,188, 15,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,120,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,251,137, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,239, 84,145,189, 27,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224, 45,122, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,191,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,239, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188, 15,224,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 7,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 16,144,124, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,255,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,255,142,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,136,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,
+147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 23,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 48,145,124, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 7, 62, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188, 23,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,151,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 29,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,112,111,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187, 63,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+ 7, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 7,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+149,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 29,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144,112,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,221,124, 59, 54,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,127,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,191, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,135, 84,145,188,191,223,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 20,227,188,
+239,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,104,127, 35,189,255, 61, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,235,137, 94,189,131,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,223, 84,145,189, 11,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,160,161,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,255,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,136,127, 35,189,255, 61, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,251,137, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,231, 84,145,189, 15,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,192,162,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,222,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,232,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 19,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,155,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 27, 85,145,189, 35,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192,145,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187, 63,224,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,
+ 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+147,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 39, 85,145,189, 27,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224,146,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,191,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,104,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,187, 20,227,188,
+ 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 3, 85,145,189, 27,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0,148,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,221,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 83,145,187,127,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,126, 35,188,
+223, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,167, 84,145,188,223,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,239,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,120,127, 35,189,247, 61, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,
+127,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,239, 84,145,189, 7,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16, 45,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,143,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 48, 46,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,239,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 3, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 19,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80, 47,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,191,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192,216,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,222,124, 59, 55,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188, 15,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188, 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,120,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,
+147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 27,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224,217,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,151,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 19, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0,219,114, 1, 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,128, 63, 0, 0, 0, 0,135, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+ 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 31, 85,145,188, 31,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,243, 20,227,188, 23,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,180,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 71,138, 94,189,
+155,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 25, 85,145,189, 35,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 64,235,104, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,127,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,223, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188,223,223,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189,255, 61, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,135,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 11, 85,145,189, 15,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 96,236,104, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,255,223,124, 59, 60,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+223, 61, 14, 61,222,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188,255,223,124, 61,128,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,200,127, 35,189, 7, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+135,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,143, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,128,237,104, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 19,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,128, 5,124, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 85,145,187, 63,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188, 31,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 23,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 19, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+151,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189, 27,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,160, 6,124, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+255,221,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,127,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,255, 84,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,195, 20,227,188,
+255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,148,127, 35,189,255, 61, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 31,138, 94,189,131,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 1, 85,145,189, 11,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192, 7,124, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,247, 84,145,188,255,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,160,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 23,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224, 8,124, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187, 31,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 23, 85,145,188, 31,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,251, 20,227,188,
+ 31,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,192,127, 35,189, 19, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 83,138, 94,189,153,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0, 10,124, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187, 63,224,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 15, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,
+143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 15,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 32, 11,124, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,
+255,221,124, 59, 54,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 86,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 31,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 21,227,188,
+ 31,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,151,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 32,124,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,127,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,223,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+247, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188, 7,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,136,127, 35,189, 9, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,
+141,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 21,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 64,125,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 23,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 19, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 31,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 96,126,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,127,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+223, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,123,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,255,142,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,136,127, 35,189, 7, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,
+143,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 23,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,128,127,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+127,224,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187, 31,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 23, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 39,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 27,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 21, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,157,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 31, 85,145,189, 41,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,160,128,114, 1, 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,128, 63, 0, 0, 0, 0,135, 85,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+ 7, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,255, 84,145,188, 15,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,176,127, 35,189, 13, 62, 14, 62,166,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,
+147,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 27,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,192,129,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188, 31, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 31,224,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,
+ 31,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,120,127, 35,189, 23, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,167,155, 65, 62,182,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,247, 84,145,189, 47,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 64,106,127, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,127,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,247, 84,145,188, 31,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 23,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,160,127, 35,189, 19, 62, 14, 62,166,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,
+155,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 39,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 96,107,127, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,189, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 15, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 7, 62, 14, 62,166,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,143,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 19,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,128,108,127, 1, 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,128, 63, 0, 0, 0, 0, 7, 80,145,186,255,223,124, 59, 52,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,127,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+223, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,135, 84,145,188,255,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 20,227,188,239,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,104,127, 35,189,255, 61, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,235,137, 94,189,
+135,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,231, 84,145,189, 19,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,160,109,127, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 60,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,231, 84,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,135,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192,110,127, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188,255,223,124, 61,124,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,
+145,155, 65, 62,182,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189, 23,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224,111,127, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,
+255,223,124, 59, 60,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 86,145,187,127,223,124, 60,189, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,222,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188,255,223,124, 61,129,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 43, 21,227,188,
+255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,216,127, 35,189, 3, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,139,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 31, 85,145,189, 19,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0,113,127, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187,191,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,
+255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,255,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188, 3,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,136,127, 35,189, 7, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,
+143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,239, 84,145,189, 23,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16,133,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 90,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,151,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 48,134,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,191,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,239,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 20,227,188,243,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,104,127, 35,189, 1, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,235,137, 94,189,
+133,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 15,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80,135,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,104,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,187, 20,227,188,
+ 23,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 19, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,151,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,255, 84,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,112,136,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,222,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,247,223,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,247,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,136,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,
+139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 19,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144,137,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 39, 85,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,184,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,180,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 19, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,176,138,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187, 63,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+ 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 23,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+151,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208,139,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,223,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,199, 84,145,188, 15,224,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,
+ 7,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,136,127, 35,189, 9, 62, 14, 62,163,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 23,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,144, 2,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,255,225,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+ 31, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188, 31,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188, 47,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 23, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,
+167,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 47,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,176, 3,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,222,124, 59, 55,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,123,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+255,142,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 3, 62, 14, 62,163,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,143,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 23,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,208, 4,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,255,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,216,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,
+135,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 19,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,240, 5,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,
+255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187, 63,224,124, 60,189, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 15, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,147,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 16, 7,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,255,225,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+223, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188,255,223,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 48, 8,114, 1, 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,128, 63, 0, 0, 0, 0,135, 84,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,167, 84,145,187,191,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,120,127, 35,188,239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188,255,223,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,155, 20,227,188,
+255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,128,127, 35,189, 3, 62, 14, 62,166,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,135,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,247, 84,145,189, 15,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 80, 9,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,255,142,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,
+143,155, 65, 62,182,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,112, 10,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 80,145,186,
+255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,191,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,223, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,199, 84,145,188,239,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,
+255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,136,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,139,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,239, 84,145,189, 19,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,144, 11,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 60,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,189, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 31, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 31,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,152,127, 35,189, 7, 62, 14, 62,166,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,
+135,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208,191,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 19, 85,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,240,192,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+ 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 23,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,251, 20,227,188, 19,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,176,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+149,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 27,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16,194,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,
+255,223,124, 59, 54,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,123,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,
+ 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 7, 62, 14, 62,163,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,143,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,247, 84,145,189, 15,224,124, 62,139, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 48,195,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,221,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+223, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,135, 84,145,188,255,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188, 7,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,104,127, 35,189, 7, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,235,137, 94,189,
+143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,231, 84,145,189, 23,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80,196,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 19, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,155,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,112,197,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,255,221,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,127,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,223,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,176,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,
+135,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 27, 85,145,189, 15,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144,198,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,222,124, 59, 55,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,239, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 7,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 7, 62, 14, 62,163,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,139,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,247, 84,145,189, 19,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,176,199,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,255,223,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208,200,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+127,224,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187, 31,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 7, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 23,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 19,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 13, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,255, 84,145,189, 25,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,240,201,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 54,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+223, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,167, 84,145,188,255,223,124, 61,123,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,107, 20,227,188,255,142,197, 61, 78, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,120,127, 35,189,255, 61, 14, 62,162,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,251,137, 94,189,
+135,155, 65, 62,182,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,231, 84,145,189, 23,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16,203,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,225,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 86,145,187,127,224,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 31, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,128,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 31,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 23, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,159,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 39,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 80,166,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+151,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,112,167,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 80,145,186,
+255,223,124, 59, 60,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 83,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,126, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,135, 84,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,107, 20,227,188,
+255,142,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,104,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,251,137, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,231, 84,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,144,168,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 55,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 23,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 19, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,107,138, 94,189,
+155,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 39, 85,145,189, 31,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,176,169,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+255,221,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,127,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,223, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,199, 84,145,188,207,223,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,
+231,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,128,127, 35,189,247, 61, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 19,138, 94,189,127,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,243, 84,145,189, 7,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,208,170,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 85,145,187, 31,224,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+ 7, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188, 23,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 17, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+149,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 29,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,240,171,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,223,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,247, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,
+ 3,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 9, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,255, 84,145,189, 23,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 16,173,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 80,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,126, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,135, 84,145,188, 15,224,124, 61,124,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 20,227,188, 7,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,104,127, 35,189, 11, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,235,137, 94,189,
+143,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,231, 84,145,189, 23,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 48,174,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 55,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,191,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,199, 84,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,
+ 11,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,120,127, 35,189, 11, 62, 14, 62,163,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,251,137, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,231, 84,145,189, 25,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 80,175,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,224,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 85,145,187, 63,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,
+ 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 31,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 23,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+155,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 35,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,112,176,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187, 63,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 11, 85,145,189, 19,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,144,177,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,255,222,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 86,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,
+247, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188,255,223,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 3,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,200,127, 35,189, 7, 62, 14, 62,166,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+143,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 15,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,176,178,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,163,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,143,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 27,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,208,179,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,221,124, 59, 60,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187,127,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+191, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,191,223,124, 61,128,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,239,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,152,127, 35,189,255, 61, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,
+135,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 15,224,124, 62,143, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,240,180,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,223,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,126, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,199, 84,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,136,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,247, 84,145,189, 19,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 16,182,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,127,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,
+239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188,239,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,255,142,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,200,127, 35,189, 9, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 27,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 48,183,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,104,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,187, 20,227,188,
+ 11,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,255, 84,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 80,184,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 39, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,216,127, 35,188,
+ 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 31, 85,145,188, 15,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 3, 21,227,188, 23,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,196,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 83,138, 94,189,
+155,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 29, 85,145,189, 35,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16, 51,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,221,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,127,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188,255,223,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 21,227,188,
+ 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,232,127, 35,189, 7, 62, 14, 62,163,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,139,138, 94,189,151,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 47, 85,145,189, 27,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 48, 52,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 23,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 19, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 27,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80, 53,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 71, 85,145,187, 63,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 23, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,151,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 11, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,112, 54,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,199, 84,145,187,191,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,239,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,172,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,
+139,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189, 19,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144, 55,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 80,145,186,
+255,221,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,255,222,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,191, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,135, 84,145,188,191,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 20,227,188,
+239,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0, 72,127, 35,189,247, 61, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,203,137, 94,189,127,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,231, 84,145,189, 7,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,176, 56,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,224,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187, 63,224,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,144,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,
+139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 19,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208, 57,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 7, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,240, 58,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,225,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+223, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188,223,223,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,239,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,160,127, 35,189,255, 61, 14, 62,166,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,
+135,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 15,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16, 60,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,231, 84,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,255, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,164,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 47,138, 94,189,143,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 13, 85,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 48, 61,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,255,224,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,127,224,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 31, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 31,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 31,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 19, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,
+159,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 39,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 80, 62,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,255, 84,145,189, 23,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,112, 63,105, 1, 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,128, 63, 0, 0, 0, 0,135, 85,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,231, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+ 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 23,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 19,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,172,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,
+145,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 29,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,144, 64,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,255, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 13, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,147,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,176, 65,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,255,223,124, 59, 55,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,127,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,247, 84,145,188,223,223,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 7, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,
+135,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,208, 66,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,
+255,222,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,191,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,135, 84,145,188,247,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,107, 20,227,188,
+255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0, 88,127, 35,189, 3, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,219,137, 94,189,139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,223, 84,145,189, 15,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,240, 67,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 80,145,186,255,223,124, 59, 55,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+ 7, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188, 15,224,124, 61,124,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188, 11,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,136,127, 35,189, 11, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 11,138, 94,189,
+143,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,247, 84,145,189, 23,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 16, 69,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+127,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,223,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188, 7,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188,
+ 11,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,160,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,147,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 19, 85,145,189, 31,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192, 74,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,232,127, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 55, 85,145,188,255,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,251, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,192,127, 35,189, 7, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 19, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224, 75,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,221,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,127,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,223, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,187, 20,227,188,
+255,142,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,152,127, 35,189,255, 61, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,135,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 3, 85,145,189, 15,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0, 77,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188,255,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,152,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,
+139,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 3, 85,145,189, 15,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 32, 78,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 63, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 63,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 47,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 23, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,107,138, 94,189,159,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 39,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 64, 79,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,255,223,124, 59, 60,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+255, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 15,224,124, 61,128,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,176,127, 35,189, 15, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,
+151,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 31,224,124, 62,143, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 96, 80,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 23,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 19, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,151,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 31,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,128, 81,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,239,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,160, 82,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,176,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 15,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192, 83,105, 1, 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,128, 63, 0, 0, 0, 0,135, 84,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 39, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,168,127, 35,188,
+255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 23, 85,145,188, 31,224,124, 61,124,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,251, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,192,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,
+151,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 27, 85,145,189, 31,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224, 84,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,225,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,127,224,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 31, 62, 14, 61,222,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 63,224,124, 61,128,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 43, 21,227,188,
+ 31,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 23, 62, 14, 62,166,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,159,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 47,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0, 86,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 83,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 84,145,187,127,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,
+223, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,183, 84,145,188,255,223,124, 61,124,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,255,142,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,128,127, 35,189, 3, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 3,138, 94,189,
+139,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,235, 84,145,189, 19,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 32, 87,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,147,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 64, 88,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188, 15,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 27,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 96, 89,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,
+127,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,223,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,104,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188, 15,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,187, 20,227,188,
+ 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,144,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,251, 84,145,189, 27,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,128, 90,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+239, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,239,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 3, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+139,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,160, 91,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,222,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,191,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,255, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 11,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,145,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192, 92,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,199, 84,145,187, 31,224,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 23,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188, 19,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,176,127, 35,189, 13, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+149,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 11, 85,145,189, 25,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224, 93,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187, 63,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 72,127, 35,188,255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,167, 84,145,188,255,223,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,139, 20,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,136,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 27,138, 94,189,143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,247, 84,145,189, 23,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0, 95,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 83,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,124,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,
+151,155, 65, 62,182,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 32, 96,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187, 31,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 7, 85,145,188, 23,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 19,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,147,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,128, 3,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 71, 85,145,187,127,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188,255,223,124, 61,124,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 7,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,192,127, 35,189, 11, 62, 14, 62,163,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,
+151,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 27, 85,145,189, 31,224,124, 62,140, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,160, 4,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187, 63,224,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 15, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,231, 84,145,188, 31,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,171, 20,227,188,
+ 23,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,151,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 33,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192, 5,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 7, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+151,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 23, 85,145,189, 31,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224, 6,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 88,145,186,
+255,222,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 86,145,187, 63,224,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 15, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 7,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 7, 62, 14, 62,166,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,143,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 39, 85,145,189, 19,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0, 8,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,221,124, 59, 55,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,152,127, 35,188,
+223, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,223,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,227, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 67,138, 94,189,
+135,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 15,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 32, 9,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,222,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188, 15,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,
+ 7,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 11, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,143,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 25,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 64, 10,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,189, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 71, 85,145,188, 31,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+143,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189, 31,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 96, 11,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188, 31,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,192,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 83,138, 94,189,151,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 31, 85,145,189, 31,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,128, 12,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,221,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187,127,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+223, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,199, 84,145,188,223,223,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,239,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189,255, 61, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,
+135,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 7, 85,145,189, 15,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,160, 13,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 84,145,187,255,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,127, 35,188,255, 61, 14, 61,218,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,167, 84,145,188, 15,224,124, 61,124,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,107, 20,227,188,
+ 15,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,104,127, 35,189, 15, 62, 14, 62,163,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,235,137, 94,189,147,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,231, 84,145,189, 27,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192, 14,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,127,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 84,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+ 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,231, 84,145,188, 23,224,124, 61,127,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188, 19,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,165,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+149,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 29,224,124, 62,143, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224, 15,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+127,223,124, 59, 61,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,223,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,255, 61, 14, 61,222,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 71, 85,145,188, 15,224,124, 61,128,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188,
+ 11,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,184,127, 35,189, 11, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,145,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 15, 85,145,189, 21,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0, 17,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,168,127, 35,189, 11, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 15,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 32, 18,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188, 7, 62, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188, 23,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+ 19,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,155,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 31, 85,145,189, 35,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 64, 19,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,188, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+255, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188, 15,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,
+147,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 23,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 96, 20,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+255,223,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,255,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,239, 84,145,188, 31,224,124, 61,125,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,187, 20,227,188,
+ 23,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 15, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 43,138, 94,189,151,155, 65, 62,183,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 27,224,124, 62,140, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,128, 21,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,255,225,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,231, 84,145,187,255,224,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,104,127, 35,188,
+ 63, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0,239, 84,145,188, 63,224,124, 61,126,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,195, 20,227,188, 47,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,156,127, 35,189, 31, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 55,138, 94,189,
+175,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 5, 85,145,189, 55,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,160, 22,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 84,145,186,
+127,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,223,223,124, 60,186, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,104,127, 35,188, 7, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188, 7,224,124, 61,126,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,219, 20,227,188,
+ 19,143,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 17, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,149,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 11, 85,145,189, 29,224,124, 62,141, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0,192, 23,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0,135, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,
+ 15, 62, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 39, 85,145,188, 15,224,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188, 23,143,197, 61, 80, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,200,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 91,138, 94,189,
+155,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 31, 85,145,189, 35,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0,224, 24,105, 1, 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,128, 63, 0, 0, 0, 0,135, 84,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0,199, 84,145,187,223,223,124, 60,187, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188, 7, 62, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,247, 84,145,188, 7,224,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,211, 20,227,188,
+ 11,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,168,127, 35,189, 13, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 51,138, 94,189,147,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 7, 85,145,189, 27,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 0, 26,105, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,255,222,124, 59, 57,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,187, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,200,127, 35,188,
+255, 61, 14, 61,219,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,235, 20,227,188, 15,143,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,184,127, 35,189, 15, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 59,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0, 15, 85,145,189, 27,224,124, 62,142, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 0,190,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 86,145,186,
+255,223,124, 59, 58,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 85,145,187,255,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0, 8,128, 35,188,223, 61, 14, 61,221,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0, 39, 85,145,188,255,223,124, 61,127,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 11, 21,227,188,
+255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,200,127, 35,189, 7, 62, 14, 62,164,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 75,138, 94,189,135,155, 65, 62,186,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0, 23, 85,145,189, 15,224,124, 62,142, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+216, 0, 0, 0, 32,191,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 85,145,186,255,223,124, 59, 56,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63,
+ 0, 0, 0, 0, 7, 85,145,187,191,223,124, 60,186, 71, 2, 63, 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,127, 35,188,
+239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63, 0, 0, 0, 0, 7, 85,145,188,255,223,124, 61,125,101,127, 63,
+ 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0,203, 20,227,188,255,142,197, 61, 81, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62,
+ 0, 0, 0, 0,160,127, 35,189, 7, 62, 14, 62,164,172,187, 63, 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0, 35,138, 94,189,
+143,155, 65, 62,184,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62, 0, 0, 0, 0,255, 84,145,189, 23,224,124, 62,141, 17,245, 63,
+ 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,216, 0, 0, 0, 64,192,114, 1, 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,128, 63, 0, 0, 0, 0, 7, 82,145,186,
+255,223,124, 59, 59,146,131, 62, 0, 0, 72, 65, 0, 0, 96, 63, 0, 0, 0, 0, 7, 84,145,187,191,223,124, 60,188, 71, 2, 63,
+ 0, 0,200, 65, 0, 0, 64, 63, 0, 0, 0, 0,136,126, 35,188,239, 61, 14, 61,220,123, 65, 63, 0, 0, 22, 66, 0, 0, 32, 63,
+ 0, 0, 0, 0,135, 84,145,188,239,223,124, 61,128,101,127, 63, 0, 0, 72, 66, 0, 0, 0, 63, 0, 0, 0, 0, 75, 20,227,188,
+255,142,197, 61, 82, 2,158, 63, 0, 0,122, 66, 0, 0,192, 62, 0, 0, 0, 0,104,127, 35,189, 3, 62, 14, 62,165,172,187, 63,
+ 0, 0,150, 66, 0, 0,128, 62, 0, 0, 0, 0,235,137, 94,189,139,155, 65, 62,185,177,216, 63, 0, 0,175, 66, 0, 0, 0, 62,
+ 0, 0, 0, 0,231, 84,145,189, 19,224,124, 62,143, 17,245, 63, 0, 0,200, 66, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 88, 0, 0, 0,224,223,117, 1, 0, 0, 0, 0, 93, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 19, 0, 0, 0, 23, 0, 0, 0, 80, 97,114,116,105, 99,108,101, 83,121,115,116,101,109, 32, 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,220,117, 1, 0, 0, 0, 0,224,235,196, 1,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 79, 66, 0, 0, 32, 4, 0, 0,144, 95,116, 1, 0, 0, 0, 0, 99, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,144, 88,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 79, 66,116,101,120,116,117,114,101, 0,114,101,118,105,101,119, 46, 48, 48, 53, 0, 0, 0, 0, 1, 0, 0, 4,
+ 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, 16, 76,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 99,116, 1, 0, 0, 0, 0, 61, 16,183,188, 21,204,103,191, 48,234,228, 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,153, 39,155, 64,153, 39,155, 64,153, 39,155, 64, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,218, 15,201, 63, 0, 0,192, 37,255,255,255, 36, 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,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+153, 39,155, 64,152, 39, 27, 38,102,187,232,166, 0, 0, 0, 0,102,187,232, 38,157,134,196, 52,153, 39,155, 64, 0, 0, 0, 0,
+154, 39, 27, 38,153, 39,155,192,157,134,196, 52, 0, 0, 0, 0, 61, 16,183,188, 21,204,103,191, 48,234,228, 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, 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,
+ 25, 50, 83, 62, 28, 50,211, 35, 23, 50,211,163, 0, 0, 0, 0, 27, 50,211,163, 25, 50, 83, 62,158, 59,174, 38, 0, 0, 0, 0,
+ 0, 24, 44,173,224,165, 94,175, 25, 50, 83, 62, 0, 0, 0, 0,236,251, 33, 59,135, 37, 40, 59,118, 71,238, 63, 0, 0,128, 63,
+ 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, 1, 0, 2, 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, 10,215, 35, 61, 0, 0,128, 63,
+205,204,204, 62,205,204,204, 61, 0, 0, 0, 0, 4, 0, 1, 1, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 8, 0, 0, 0,240, 99,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 77, 65, 0, 0,144, 2, 0, 0, 64,100,116, 1, 0, 0, 0, 0, 38, 0, 0, 0, 1, 0, 0, 0,224,103,116, 1,
+ 0, 0, 0, 0, 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, 99,104,
+101, 99,107,101,114,100, 97,114,107, 0, 0, 0, 97,116,101,114,105, 97, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 1, 0,116, 1,221, 61,200,251,220, 61,200,251,220, 61, 0, 0,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, 63,154,153, 89, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, 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,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 2, 0, 2, 0, 1, 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, 0, 0, 3, 0, 64, 1, 3, 0, 64, 1, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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, 0, 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, 16, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 16,103,116, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,205,204, 76, 63,205,204, 76, 63,205,204, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,136, 0, 0, 0, 16,103,116, 1, 0, 0, 0, 0, 29, 0, 0, 0,
+ 1, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,128,116, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 1, 0,192, 63, 1, 0,192, 63, 1, 0,192, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 23,183,209, 56,184,177,209, 56,184,177,209, 56, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63,
+ 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 77, 65, 0, 0,144, 2, 0, 0,224,103,116, 1, 0, 0, 0, 0, 38, 0, 0, 0,
+ 1, 0, 0, 0,128,107,116, 1, 0, 0, 0, 0, 64,100,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 77, 65, 99,104,101, 99,107,101,114,108,105,103,104,116, 0, 0, 0, 97,116,101,114,105, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0,188, 65,157, 62,178, 61,157, 62,178, 61,157, 62, 0, 0,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, 63,154,153, 89, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,205,204, 76, 63, 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,160, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0,205,204,204, 61, 2, 0, 2, 0, 1, 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, 0, 0, 3, 0, 64, 1, 3, 0, 64, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2, 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, 16, 8, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,176,106,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,205,204, 76, 63,205,204, 76, 63,205,204, 76, 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, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,136, 0, 0, 0,176,106,116, 1,
+ 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,128,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 23,183,209, 56,184,177,209, 56,184,177,209, 56, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0, 0, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 77, 65, 0, 0,144, 2, 0, 0,128,107,116, 1,
+ 0, 0, 0, 0, 38, 0, 0, 0, 1, 0, 0, 0,112,114,116, 1, 0, 0, 0, 0,224,103,116, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,112,114,101,118,105,101,119, 0, 0, 97,116,101,114,105, 97,108, 0, 0,
+ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128, 63, 61,232, 54, 63,
+184,161, 23, 63, 0, 0,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, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,188,248, 68, 62, 0, 0,128, 63,
+205,204, 76, 63, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,198,121,130, 63, 0, 0,160, 63, 0, 0, 0, 0,
+ 0, 0,160, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61, 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, 0, 0, 3, 0, 17, 3, 3, 0, 17, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 1, 0, 0, 0, 2, 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,
+ 1, 8, 1, 0, 32,111,116, 1, 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, 80,110,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,205,204, 76, 63,205,204, 76, 63,
+205,204, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+136, 0, 0, 0, 80,110,116, 1, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,128,127,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16, 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, 0, 63, 0, 0,128, 63,205,204, 76, 62, 0, 0, 0, 0, 68, 65, 84, 65,
+ 8, 3, 0, 0, 32,111,116, 1, 0, 0, 0, 0, 32, 0, 0, 0, 1, 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,245, 40,220, 62, 0, 0, 0, 0,164,112,125, 63, 0, 0,128, 63,106,214, 24, 63,
+ 0, 0,128, 63, 0, 0,128, 63, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 0, 0,
+144, 2, 0, 0,112,114,116, 1, 0, 0, 0, 0, 38, 0, 0, 0, 1, 0, 0, 0, 96,121,116, 1, 0, 0, 0, 0,128,107,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,116,101,120,116,117,114,101, 0,114,101,
+118,105,101,119, 46, 48, 48, 49, 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, 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, 63, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 63, 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,160, 63, 0, 0, 0, 0, 0, 0, 0, 0,205,204,204, 61, 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, 0, 0,
+ 71, 0, 1, 3, 67, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 3, 0,
+ 0, 0, 2, 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, 1, 8,129, 0, 16,118,116, 1, 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, 64,117,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 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, 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,
+205,204, 76, 63,205,204, 76, 63,205,204, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,136, 0, 0, 0, 64,117,116, 1, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 1, 0,129, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,127,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 62, 76,204,205, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 3, 8, 5, 31, 88, 32, 0, 0, 0, 32, 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, 62,220, 40,245, 0, 0, 0, 0, 63,125,112,164, 63,128, 0, 0, 63, 24,214,106, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 1, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 16, 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,128, 63, 0, 0, 0, 63, 0, 0,128, 63,205,204, 76, 62,
+ 0, 0, 0, 0, 68, 65, 84, 65, 8, 3, 0, 0, 16,118,116, 1, 0, 0, 0, 0, 32, 0, 0, 0, 1, 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,245, 40,220, 62, 0, 0, 0, 0,164,112,125, 63,
+ 0, 0,128, 63,106,214, 24, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -1936,1800 +4622,1878 @@ char datatoc_preview_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, 77, 65, 0, 0,144, 2, 0, 0, 96,121,116, 1, 0, 0, 0, 0, 38, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,112,114,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,116,101,
+120,116,117,114,101, 46, 48, 48, 49, 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,128, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0,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, 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, 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,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, 0, 0, 3, 0, 1, 3, 3, 0, 1, 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, 0, 0, 0, 0, 0, 0,
+ 0, 0, 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,
+ 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 2, 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, 48,124,116, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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,205,204, 76, 63,205,204, 76, 63,205,204, 76, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 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, 0, 0, 1,184,
- 2,236,199, 96, 0, 0, 0, 38, 0, 0, 0, 1, 0, 0, 0, 0, 2,236,196,224, 0, 0, 0, 0, 0, 0, 0, 0, 77, 65,116,101,
-120,116,117,114,101, 46, 48, 48, 49, 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, 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, 0, 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, 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, 63,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 0, 2, 0, 2,
- 0, 50, 0, 6, 3, 1, 0, 3, 3, 1, 0, 3, 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, 1, 0, 2, 0,
- 0, 0, 0, 3, 0, 0, 0, 2, 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, 5, 31, 92, 32, 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, 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, 68, 65, 84, 65, 0, 0, 3, 8, 5, 31, 92, 32, 0, 0, 0, 32, 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, 62,220, 40,245, 0, 0, 0, 0, 63,125,112,164, 63,128, 0, 0,
- 63, 24,214,106, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 2,236,201, 64, 0, 0, 0, 34, 0, 0, 0, 1, 2,236,202,112, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 84, 69,112,114,101,118,105,101,119, 0,101,120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 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, 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, 5, 0, 8, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 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, 1, 0, 2, 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, 84, 69, 0, 0, 1, 0, 2,236,202,112,
- 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 0, 2,236,201, 64, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69,102, 97,107,101,115,104,
- 97,100,111,119, 0, 0, 76,101,110,100, 0,101,120, 0, 0, 0, 0, 2, 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,
- 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, 5, 0, 40, 0, 5, 0, 4,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 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, 1, 0, 2, 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, 77, 69, 0, 0, 1, 20, 2,236,203,160, 0, 0, 0, 50, 0, 0, 0, 1, 2,236,208,112,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 67,117, 98,101, 46, 48, 48, 49, 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, 2,235,160,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2,233, 45, 16, 5, 31,184, 32, 8,102,176, 32, 8,170,144, 32, 5, 31, 96, 32, 5, 31,136, 32, 0, 0, 0, 0,
- 5, 31,232, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,204,224, 0, 0, 0, 1,
- 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 2,236,206, 16, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 2,236,207, 64, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 1,249, 0, 0, 3,237, 0, 0, 1,244,
- 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 61, 88,133,192,189, 85, 45,184,190, 24,181,196, 63, 35, 71,185, 62,235, 31,153,
- 62,203,102,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 1, 0, 1,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,233, 45, 16, 0, 0, 0, 0,
- 0, 0, 0, 1, 2,236,194, 96, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,204,224, 0, 0, 0,242, 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, 5, 31, 96, 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,
- 68, 65, 84, 65, 0, 0, 39,116, 5, 31, 96, 32, 0, 0, 0, 56, 0, 0, 1,249, 62,131,144,140, 60,200,163,119, 62, 85, 9,156,
- 92,125,170, 70, 21,228, 0,255,190, 26,222, 50, 60,200,163,119, 62, 85, 9,156,163,131,170, 70, 21,228, 0,255, 62,146,126, 61,
-188, 8, 37,223, 62, 47,183, 99, 76,247,194,191, 81,228, 2,255,190, 56,185,147,188, 8, 37,223, 62, 47,183, 99,179, 9,194,191,
- 81,228, 2,255, 62,157,176,129,188,217, 91,211, 61,246,238,244, 84, 31,181,226, 61,191, 2,255,190, 79, 30, 28,188,217, 91,211,
- 61,246,238,244,171,225,181,226, 61,191, 2,255, 62, 94, 19,115,189,128,251,103, 62, 14, 32,150, 9,241,144,155, 62, 64, 2,255,
-189,227,161, 26,189,128,251,103, 62, 14, 32,150,246, 15,144,155, 62, 64, 2,255, 62, 94, 19,115,189, 25,118,251, 62, 62,165, 20,
- 14,184,163,144, 87, 76, 2,255,189,227,161, 26,189, 25,118,251, 62, 62,165, 20,241, 72,163,144, 87, 76, 2,255, 62, 94, 19,115,
- 60, 34,107,232, 62, 92,128,116, 3, 3,131,121, 29,110, 0,255,189,227,161, 26, 60, 34,107,232, 62, 92,128,116,252,253,131,121,
- 29,110, 0,255, 62, 56,193, 58, 60,200,163,119, 62, 99,247, 77,171, 56,167,117, 36,206, 0,255,189,152,252,168, 60,200,163,119,
- 62, 99,247, 77, 84,200,167,117, 36,206, 0,255, 62, 23, 42,109,188, 8, 37,223, 62, 73,215, 88,217,152,203,122,110, 56, 0,255,
- 62, 0,197,229,188,217, 91,211, 62, 29, 14, 71,184,179,175, 93, 69, 66, 2,255,188,164, 23,249,188,217, 91,211, 62, 29, 14, 71,
- 71, 77,175, 93, 69, 66, 2,255, 61,182,231, 88, 61,121,154,159, 62, 32,201,179,151,181,255,104, 74, 51, 2,255, 60,134,121,207,
- 61,121,154,159, 62, 32,201,179,104, 75,255,104, 74, 51, 2,255, 61,242,158, 25, 61,121,154,159, 62, 73,215, 88,171, 78,255,150,
- 95,246, 2,255,188, 80,194,110, 61,121,154,159, 62, 73,215, 88, 84,178,255,150, 95,246, 2,255, 62, 41,211,138, 61,121,154,159,
- 62, 99,247, 77,133,152,254,153, 37, 98, 0,255,189,118, 66,143, 61,121,154,159, 62, 99,247, 77,122,104,254,153, 37, 98, 0,255,
- 62, 56,193, 58, 61,206,232,154, 62, 99,247, 77,170, 24, 88, 13, 35, 89, 0,255,189,152,252,168, 61,206,232,154, 62, 99,247, 77,
- 85,232, 88, 13, 35, 89, 0,255, 62, 23, 42,109, 62, 5, 79,173, 62, 73,215, 88,200,249, 65,221, 94,244, 2,255,189, 43,158, 31,
- 62, 5, 79,173, 62, 73,215, 88, 55, 7, 65,221, 94,244, 2,255, 62, 0,197,229, 62, 27,180, 54, 62, 29, 14, 71,186, 51, 78, 86,
- 73, 78, 2,255,188,164, 23,249, 62, 27,180, 54, 62, 29, 14, 71, 69,205, 78, 86, 73, 78, 2,255, 62, 94, 19,115, 62, 65, 6,111,
- 62, 14, 32,150, 11, 2,107,152, 68,114, 2,255,189,227,161, 26, 62, 65, 6,111, 62, 14, 32,150,244,254,107,152, 68,114, 2,255,
- 62, 94, 19,115, 62, 35, 43, 14, 62, 62,165, 20, 14,201, 91,180, 88, 14, 2,255,189,227,161, 26, 62, 35, 43, 14, 62, 62,165, 20,
-241, 55, 91,180, 88, 14, 2,255, 62, 94, 19,115, 61,236,195,250, 62, 92,128,116, 2,134,125, 29, 26,228, 0,255,189,227,161, 26,
- 61,236,195,250, 62, 92,128,116,253,122,125, 29, 26,228, 0,255, 62,131,144,140, 61,206,232,154, 62, 85, 9,156, 93, 54, 85, 67,
- 20,154, 0,255,190, 26,222, 50, 61,206,232,154, 62, 85, 9,156,162,202, 85, 67, 20,154, 0,255, 62,146,126, 61, 62, 5, 79,173,
- 62, 47,183, 99, 76,241, 60,161, 82, 97, 2,255,190, 56,185,147, 62, 5, 79,173, 62, 47,183, 99,179, 15, 60,161, 82, 97, 2,255,
- 62,157,176,129, 62, 27,180, 54, 61,246,238,244, 83,179, 71,157, 65, 45, 2,255,190, 79, 30, 28, 62, 27,180, 54, 61,246,238,244,
-172, 77, 71,157, 65, 45, 2,255, 62,176, 89,157, 61,121,154,159, 61,232, 1, 67,111, 40,255,113, 63,117, 2,255,190,116,112, 84,
- 61,121,154,159, 61,232, 1, 67,144,216,255,113, 63,117, 2,255, 62,161,107,237, 61,121,154,159, 62, 40, 64,139,100, 48,255,154,
- 79,167, 2,255,190, 86,148,244, 61,121,154,159, 62, 40, 64,139,155,208,255,154, 79,167, 2,255, 62,139, 7,100, 61,121,154,159,
- 62, 81, 78, 48,126,117,254,181, 19,185, 0,255,190, 41,203,227, 61,121,154,159, 62, 81, 78, 48,129,139,254,181, 19,185, 0,255,
- 62,140,229, 26, 61,121,154,159, 62, 88,197, 8,120,160,254,106, 42,198, 2,255,190, 45,135, 79, 61,121,154,159, 62, 88,197, 8,
-135, 96,254,106, 42,198, 2,255, 62,133,110, 66, 61,214, 95,114, 62, 92,128,116, 93,173, 74,126, 45, 93, 2,255,190, 30,153,158,
- 61,214, 95,114, 62, 92,128,116,162, 83, 74,126, 45, 93, 2,255, 62, 94, 19,115, 61,251,177,170, 62,103,178,185, 11, 9,115, 31,
- 54,216, 2,255,189,227,161, 26, 61,251,177,170, 62,103,178,185,244,247,115, 31, 54,216, 2,255, 62, 53, 5,206, 61,214, 95,114,
- 62,111, 41,145,181, 9, 80,184, 65, 43, 2,255,189,145,133,208, 61,214, 95,114, 62,111, 41,145, 74,247, 80,184, 65, 43, 2,255,
- 62, 34, 92,178, 61,121,154,159, 62,111, 41,145,146,116,254, 57, 66, 43, 2,255,189, 88,103, 48, 61,121,154,159, 62,111, 41,145,
-109,140,254, 57, 66, 43, 2,255, 62, 53, 5,206, 60,170,200, 22, 62,111, 41,145,182, 34,173,181, 64,115, 2,255,189,145,133,208,
- 60,170,200, 22, 62,111, 41,145, 73,222,173,181, 64,115, 2,255, 62, 94, 19,115, 61,121,154,159, 62,114,228,253, 24, 74,255,139,
-125,171, 2,255,189,227,161, 26, 61,121,154,159, 62,114,228,253,231,182,255,139,125,171, 2,255, 62, 94, 19,115, 59, 43,249,149,
- 62,103,178,185, 10,218,140,140, 54, 45, 2,255,189,227,161, 26, 59, 43,249,149, 62,103,178,185,245, 38,140,140, 54, 45, 2,255,
- 62,133,110, 66, 60,170,200, 22, 62, 92,128,116, 92,141,179,203, 44,210, 2,255,190, 30,153,158, 60,170,200, 22, 62, 92,128,116,
-163,115,179,203, 44,210, 2,255, 61, 88,133,203, 62, 23,248,202, 62, 73,215, 88, 0, 0,124, 43, 31, 17, 0,255, 61, 88,133,203,
- 61,229, 77, 34, 62,111, 41,145, 0, 0,249, 63,127,209, 0,255, 61, 88,133,203,190,188,254,150, 62, 70, 27,236, 0, 0,251,204,
-127,237, 0,255, 61, 88,133,203,190, 78, 79,191, 62, 92,128,116, 0, 0,150, 33, 71,238, 2,255, 61, 88,133,203,190, 14,221,146,
- 62, 99,247, 77, 0, 0,100, 28, 79,192, 0,255, 61, 88,133,203,190,211, 99, 30, 62, 62,165, 20, 0, 0,142,184, 59,147, 2,255,
- 61, 88,133,203, 62, 12,198,133, 62, 6,169,190, 0, 0,103,143, 75, 57, 0,255, 61, 88,133,203, 62, 91, 38, 99, 61,239,120, 28,
- 0, 0, 78,115,101, 34, 0,255, 61, 88,133,203, 62,187,243, 16,190,206,250,170, 0, 0,110,190,191,212, 2,255, 61, 88,133,203,
- 62, 87,106,247,191, 11,224,178, 0, 0, 35,144,133, 12, 3,255, 61, 88,133,203,188,157,165, 18,191, 9, 20, 33, 0, 0,214,194,
-134,213, 2,255, 61, 88,133,203,190,108, 43, 32,190,160, 83,227, 0, 0,134,154,215,113, 2,255, 62, 23, 42,109,190, 14,221,146,
- 61,232, 1, 67,113,144,198,122, 13, 79, 0,255,189, 43,158, 31,190, 14,221,146, 61,232, 1, 67,142,112,198,122, 13, 79, 0,255,
- 62, 75,106, 87,190,131, 37,138, 61,239,120, 28,122,196, 31, 19, 18,152, 2,255,189,190, 78,225,190,131, 37,138, 61,239,120, 28,
-133, 60, 31, 19, 18,152, 2,255, 62, 94, 19,115,190,192,186, 2, 61,239,120, 28,125,167, 12,146, 20,226, 0,255,189,227,161, 26,
-190,192,186, 2, 61,239,120, 28,130, 89, 12,146, 20,226, 0,255, 62,101,138, 75,190,239, 96,200, 61,202, 37,227,124,113,242,142,
- 26,196, 2,255,189,242,142,203,190,239, 96,200, 61,202, 37,227,131,143,242,142, 26,196, 2,255, 62, 82,225, 47,190,252,112,195,
- 61,194,175, 10, 79,159,159, 44, 25,210, 2,255,189,205, 60,146,190,252,112,195, 61,194,175, 10,176, 97,159, 44, 25,210, 2,255,
- 62, 11,248, 41,191, 1, 4,242, 61,224,138,107, 19,143,131, 13, 19,178, 2,255,188,253,170, 27,191, 1, 4,242, 61,224,138,107,
-236,113,131, 13, 19,178, 2,255, 61, 88,133,203,191, 2,226,168, 61,246,238,244, 0, 0,130, 75, 24, 21, 2,255, 62,131,144,140,
-189,240,242, 18, 61,202, 37,227, 47,114,137,117, 8,232, 2,255,190, 26,222, 50,189,240,242, 18, 61,202, 37,227,208,142,137,117,
- 8,232, 2,255, 62,178, 55, 83,189,143,233, 23, 61,209,156,187, 77, 25,154,198, 13,214, 2,255,190,120, 43,193,189,143,233, 23,
- 61,209,156,187,178,231,154,198, 13,214, 2,255, 62,224,222, 26, 60,140,236,182, 61,112, 21, 49,113,216,198,247, 12,255, 2,255,
-190,170,188,167, 60,140,236,182, 61,112, 21, 49,142, 40,198,247, 12,255, 2,255, 62,232, 84,243, 62, 23,248,202, 62, 2,238, 82,
-113,104, 51, 31, 30, 32, 2,255,190,178, 51,128, 62, 23,248,202, 62, 2,238, 82,142,152, 51, 31, 30, 32, 2,255, 62,196,224,112,
- 62, 50, 24,190, 62, 17,220, 2, 64,216,106,225, 27,121, 0,255,190,142,190,253, 62, 50, 24,190, 62, 17,220, 2,191, 40,106,225,
- 27,121, 0,255, 62,144,160,134, 62,106, 20, 20, 62, 47,183, 99, 75,137,101, 82, 20, 70, 0,255,190, 52,254, 39, 62,106, 20, 20,
- 62, 47,183, 99,180,119,101, 82, 20, 70, 0,255, 62, 79, 37,195, 62,154, 92, 67, 62, 70, 27,236, 38,241,119, 19, 26, 54, 2,255,
-189,197,197,186, 62,154, 92, 67, 62, 70, 27,236,217, 15,119, 19, 26, 54, 2,255, 62, 0,197,229, 62,145, 7,181, 62, 81, 78, 48,
-175, 21, 96, 54, 24, 12, 2,255,188,164, 23,249, 62,145, 7,181, 62, 81, 78, 48, 80,235, 96, 54, 24, 12, 2,255, 61,167,249,168,
- 62, 53,212, 42, 62, 77,146,196,155,174, 76,128, 21,151, 0,255, 60,194, 48,144, 62, 53,212, 42, 62, 77,146,196,100, 82, 76,128,
- 21,151, 0,255, 62, 4,129, 81, 62, 16,129,241, 62, 88,197, 8, 25, 0,237, 4,124, 22, 0,255,188,193,243, 89, 62, 16,129,241,
- 62, 88,197, 8,231, 0,237, 4,124, 22, 0,255, 61,227,176,105, 61,184,132, 17, 62, 85, 9,156,255,160,232,126,125,209, 0,255,
-187,178,169,214, 61,184,132, 17, 62, 85, 9,156, 0, 96,232,126,125,209, 0,255,189, 43,158, 31,188, 8, 37,223, 62, 73,215, 88,
- 38,104,203,122,110, 56, 0,255, 62,105, 69,184,189, 55, 82, 92, 62, 55, 46, 59, 34,106,200,119,110, 16, 0,255,189,250, 5,163,
-189, 55, 82, 92, 62, 55, 46, 59,221,150,200,119,110, 16, 0,255, 62,144,160,134,188,187,128,115, 62, 40, 64,139, 55,161,207, 60,
-104,115, 0,255,190, 52,254, 39,188,187,128,115, 62, 40, 64,139,200, 95,207, 60,104,115, 0,255, 62,176, 89,157, 61, 17, 26,205,
- 62, 29, 14, 71, 58,181,226,123,109,214, 0,255,190,116,112, 84, 61, 17, 26,205, 62, 29, 14, 71,197, 75,226,123,109,214, 0,255,
- 62,180, 21, 9, 61,177, 13, 57, 62, 29, 14, 71, 49,157,230, 61,115, 36, 0,255,190,123,231, 45, 61,177, 13, 57, 62, 29, 14, 71,
-206, 99,230, 61,115, 36, 0,255, 62,170,192,123, 61,251,177,170, 62, 36,133, 31, 39,206,234,175,119,196, 0,255,190,105, 62, 16,
- 61,251,177,170, 62, 36,133, 31,216, 50,234,175,119,196, 0,255, 62,129,178,214, 62, 27,180, 54, 62, 62,165, 20, 24, 62,255, 85,
-125,173, 0,255,190, 23, 34,198, 62, 27,180, 54, 62, 62,165, 20,231,194,255, 85,125,173, 0,255, 62, 45,142,246, 62, 42,161,230,
- 62, 81, 78, 48, 31,251,247, 40,123,158, 0,255,189,130,152, 32, 62, 42,161,230, 62, 81, 78, 48,224, 5,247, 40,123,158, 0,255,
- 61, 88,133,203,190,209,133,104, 62, 70, 27,236, 0, 0,210,148,119,170, 0,255, 61,212,194,185,190,198, 83, 36, 62, 70, 27,236,
- 19, 39,222, 65,121,248, 0,255, 58,240,196,191,190,198, 83, 36, 62, 70, 27,236,236,217,222, 65,121,248, 0,255, 61,220, 57,145,
-190,226, 80,207, 62, 58,233,167, 2,134,217,132,122, 12, 0,255,186,236,241, 77,190,226, 80,207, 62, 58,233,167,253,122,217,132,
-122, 12, 0,255, 61,167,249,168,190,237,131, 19, 62, 51,114,207,252, 13,214,169,121, 18, 0,255, 60,194, 48,144,190,237,131, 19,
- 62, 51,114,207, 3,243,214,169,121, 18, 0,255, 61, 88,133,203,190,239, 96,200, 62, 47,183, 99, 0, 0,219,150,122,180, 0,255,
- 61, 88,133,203,190, 18,152,254, 62, 77,146,196, 0, 0, 97, 46, 83, 76, 0,255, 61, 88,133,203,189,240,242, 18, 62, 73,215, 88,
- 0, 0,104,197, 73,134, 0,255, 61,205, 75,225,189,248,104,235, 62, 73,215, 88, 36, 52, 53, 2,110,187, 0,255, 59,179,158,179,
-189,248,104,235, 62, 73,215, 88,219,204, 53, 2,110,187, 0,255, 61,227,176,105,190, 33,134,174, 62, 77,146,196, 95,187,212, 14,
- 72,182, 0,255,187,178,169,214,190, 33,134,174, 62, 77,146,196,160, 69,212, 14, 72,182, 0,255, 61,190, 94, 48,190, 63, 98, 15,
- 62, 73,215, 88, 64,117,207,117, 99, 90, 0,255, 60, 81, 60,220,190, 63, 98, 15, 62, 73,215, 88,191,139,207,117, 99, 90, 0,255,
- 62,116,119,252,189,151, 95,239, 62, 40, 64,139, 49,103,196,157,102, 13, 0,255,190, 8, 53, 22,189,151, 95,239, 62, 40, 64,139,
-206,153,196,157,102, 13, 0,255, 62,174,123,231,188,217, 91,211, 62, 17,220, 2, 59,142,204,107,100,223, 2,255,190,112,180,232,
-188,217, 91,211, 62, 17,220, 2,196,114,204,107,100,223, 2,255, 62,200,155,220, 61, 46,246, 45, 62, 6,169,190, 66,102,217, 11,
-102, 65, 0,255,190,146,122,105, 61, 46,246, 45, 62, 6,169,190,189,154,217, 11,102, 65, 0,255, 62,204, 87, 72, 61,251,177,170,
- 62, 32,201,179, 54, 87,228,142,112,151, 0,255,190,150, 53,213, 61,251,177,170, 62, 32,201,179,201,169,228,142,112,151, 0,255,
- 62,191, 71, 78, 62, 16,129,241, 62, 66, 96,128, 42, 82,247, 97,120,125, 2,255,190,137, 37,219, 62, 16,129,241, 62, 66, 96,128,
-213,174,247, 97,120,125, 2,255, 62,131,144,140, 62, 79,244, 31, 62, 99,247, 77, 41,192,254,216,120,253, 0,255,190, 26,222, 50,
- 62, 79,244, 31, 62, 99,247, 77,214, 64,254,216,120,253, 0,255, 62, 75,106, 87, 62,124,189, 48, 62,118,160,105, 28,217, 7, 53,
-124,126, 0,255,189,190, 78,225, 62,124,189, 48, 62,118,160,105,227, 39, 7, 53,124,126, 0,255, 62, 23, 42,109, 62,113,138,236,
- 62,126, 23, 65,255,125, 5, 44,127,227, 0,255,189, 43,158, 31, 62,113,138,236, 62,126, 23, 65, 0,131, 5, 44,127,227, 0,255,
- 61,205, 75,225, 62, 23,248,202, 62,122, 91,213,238,130, 2, 89,126,197, 0,255, 59,179,158,179, 62, 23,248,202, 62,122, 91,213,
- 17,126, 2, 89,126,197, 0,255, 61,227,176,105,189,203,159,217, 62,107,110, 37, 23,115,230, 27,123, 34, 0,255,187,178,169,214,
-189,203,159,217, 62,107,110, 37,232,141,230, 27,123, 34, 0,255, 62, 26,229,218,190,133, 3, 64, 62, 58,233,167, 74,212, 14, 28,
-102,225, 2,255,189, 58,139,207,190,133, 3, 64, 62, 58,233,167,181, 44, 14, 28,102,225, 2,255, 62, 45,142,246,190,194,151,184,
- 62, 47,183, 99, 72,235,252, 17,105, 31, 2,255,189,130,152, 32,190,194,151,184, 62, 47,183, 99,183, 21,252, 17,105, 31, 2,255,
- 62, 53, 5,206,190,222,149, 99, 62, 36,133, 31, 66,179,225,197,104,249, 2,255,189,145,133,208,190,222,149, 99, 62, 36,133, 31,
-189, 77,225,197,104,249, 2,255, 62, 38, 24, 30,190,244,249,234, 62, 21,151,111, 44, 62,183, 4, 95, 98, 2,255,189,103, 84,224,
-190,244,249,234, 62, 21,151,111,211,194,183, 4, 95, 98, 2,255, 62, 4,129, 81,190,248,181, 86, 62, 21,151,111, 19,155,158, 52,
- 80, 54, 2,255,188,193,243, 89,190,248,181, 86, 62, 21,151,111,236,101,158, 52, 80, 54, 2,255, 61, 88,133,203,190,252,112,195,
- 62, 25, 82,219, 0, 0,154,201, 78, 88, 2,255, 61, 88,133,203,188,247, 55, 52, 62, 66, 96,128, 0, 0,252, 2,127,239, 0,255,
- 61, 88,133,203, 61, 61,227,222, 62, 85, 9,156, 0, 0,227,112,124,196, 0,255, 62, 82,225, 47, 62, 46, 93, 82, 62, 73,215, 88,
- 21, 58,254,234,126, 56, 0,255,189,205, 60,146, 62, 46, 93, 82, 62, 73,215, 88,234,198,254,234,126, 56, 0,255, 62, 4,129, 81,
- 60, 94, 34,170, 62, 77,146,196,214, 37,232,110,118,163, 0,255,188,193,243, 89, 60, 94, 34,170, 62, 77,146,196, 41,219,232,110,
-118,163, 0,255, 61,235, 39, 65, 61, 61,227,222, 62, 81, 78, 48,232,150,230,127,123, 57, 0,255,188, 21, 11,173, 61, 61,227,222,
- 62, 81, 78, 48, 23,106,230,127,123, 57, 0,255, 61,220, 57,145,190,190,220, 76, 62, 70, 27,236, 20,117,248,197,126, 36, 0,255,
-186,236,241, 77,190,190,220, 76, 62, 70, 27,236,235,139,248,197,126, 36, 0,255, 61,182,231, 88,190,133, 3, 64, 62, 77,146,196,
- 19, 43, 0,128,126,141, 2,255, 60,134,121,207,190,133, 3, 64, 62, 77,146,196,236,213, 0,128,126,141, 2,255, 61, 88,133,203,
-190,133, 3, 64, 62, 77,146,196, 0, 0,255,122,127,254, 0,255, 61, 88,133,203,190, 82, 11, 43, 62, 73,215, 88, 0, 0,184,121,
-106, 36, 0,255, 61,197,213, 8,190, 55,235, 55, 62, 92,128,116, 66,167,160,139, 53, 45, 2,255, 60, 21,134, 27,190, 55,235, 55,
- 62, 92,128,116,189, 89,160,139, 53, 45, 2,255, 61,235, 39, 65,190, 33,134,174, 62, 99,247, 77,118,133,224,215, 36,239, 2,255,
-188, 21, 11,173,190, 33,134,174, 62, 99,247, 77,137,123,224,215, 36,239, 2,255, 61,212,194,185,189,233,123, 57, 62, 92,128,116,
- 81,167, 95,141, 24, 49, 2,255, 58,240,196,191,189,233,123, 57, 62, 92,128,116,174, 89, 95,141, 24, 49, 2,255, 61,145,149, 31,
-189,226, 4, 97, 62, 92,128,116,200,189,108,160, 39, 26, 2,255, 61, 13,225, 89,189,226, 4, 97, 62, 92,128,116, 55, 67,108,160,
- 39, 26, 2,255, 61, 88,133,203,190, 22, 84,106, 62,114,228,253, 0, 0, 23, 42,125,225, 0,255, 61,153, 11,247,189,248,104,235,
- 62,107,110, 37,231,186, 78, 89, 98, 66, 2,255, 60,253,231, 82,189,248,104,235, 62,107,110, 37, 24, 70, 78, 89, 98, 66, 2,255,
- 61,197,213, 8,189,255,223,195, 62,107,110, 37, 43, 88, 62,134,102,237, 2,255, 60, 21,134, 27,189,255,223,195, 62,107,110, 37,
-212,168, 62,134,102,237, 2,255, 61,212,194,185,190, 33,134,174, 62,114,228,253, 46,247,233, 89,116,228, 2,255, 58,240,196,191,
-190, 33,134,174, 62,114,228,253,209, 9,233, 89,116,228, 2,255, 61,182,231, 88,190, 44,184,243, 62,103,178,185, 31, 46,181,198,
- 99,128, 2,255, 60,134,121,207,190, 44,184,243, 62,103,178,185,224,210,181,198, 99,128, 2,255, 61, 88,133,203,190, 63, 98, 15,
- 62,103,178,185, 0, 0,191,185,110,175, 2,255, 62, 49, 74, 98,190, 74,148, 83, 61,224,138,107,120, 23, 41, 34, 16, 99, 0,255,
-189,138, 14,248,190, 74,148, 83, 61,224,138,107,135,233, 41, 34, 16, 99, 0,255, 62, 4,129, 81,190, 40,253,134, 62, 58,233,167,
- 80,251,250, 26, 98,241, 0,255,188,193,243, 89,190, 40,253,134, 62, 58,233,167,175, 5,250, 26, 98,241, 0,255, 62, 11,248, 41,
-190, 74,148, 83, 62, 58,233,167, 83,215, 16,153, 95, 71, 0,255,188,253,170, 27,190, 74,148, 83, 62, 58,233,167,172, 41, 16,153,
- 95, 71, 0,255, 62, 38, 24, 30,190, 44,184,243, 61,224,138,107,122, 24, 35, 67, 15, 64, 0,255,189,103, 84,224,190, 44,184,243,
- 61,224,138,107,133,232, 35, 67, 15, 64, 0,255, 61, 88,133,203,190,235,165, 93, 62, 47,183, 99, 0, 0, 86,139, 94, 77, 0,255,
- 61,153, 11,247,190,233,199,167, 62, 47,183, 99,206,144, 70,200, 94,125, 0,255, 60,253,231, 82,190,233,199,167, 62, 47,183, 99,
- 49,112, 70,200, 94,125, 0,255, 61,197,213, 8,190,222,149, 99, 62, 58,233,167,164,253, 17,109, 88, 75, 0,255, 60, 21,134, 27,
-190,222,149, 99, 62, 58,233,167, 91, 3, 17,109, 88, 75, 0,255, 61,197,213, 8,190,203,236, 70, 62, 66, 96,128,225,141,168, 87,
- 88, 39, 0,255, 60, 21,134, 27,190,203,236, 70, 62, 66, 96,128, 30,115,168, 87, 88, 39, 0,255, 61, 88,133,203,190,213, 64,212,
- 62, 32,201,179, 0, 0,159, 20, 83,153, 0,255, 61,197,213, 8,190,205,201,252, 62, 36,133, 31,230, 5,177,250, 98, 20, 0,255,
- 60, 21,134, 27,190,205,201,252, 62, 36,133, 31, 25,251,177,250, 98, 20, 0,255, 61,197,213, 8,190,220,183,173, 62, 25, 82,219,
-152, 18, 24, 8, 70,188, 0,255, 60, 21,134, 27,190,220,183,173, 62, 25, 82,219,103,238, 24, 8, 70,188, 0,255, 61,153, 11,247,
-190,230, 12, 59, 62, 21,151,111,222, 26, 49,242,112,221, 0,255, 60,253,231, 82,190,230, 12, 59, 62, 21,151,111, 33,230, 49,242,
-112,221, 0,255, 61, 88,133,203,190,231,233,241, 62, 21,151,111, 0, 0, 60, 18,113, 5, 0,255, 62, 8, 60,189, 61, 76,209,142,
- 62, 92,128,116, 30, 4,244, 93,123,225, 0,255,188,223,206,186, 61, 76,209,142, 62, 92,128,116,225,252,244, 93,123,225, 0,255,
- 62, 15,179,149, 60,170,200, 22, 62, 88,197, 8, 9, 71,251, 34,127,144, 0,255,189, 13,194,190, 60,170,200, 22, 62, 88,197, 8,
-246,185,251, 34,127,144, 0,255, 62, 86,156,155, 62, 23,248,202, 62, 81, 78, 48, 17, 81, 2, 74,126,204, 0,255,189,212,179,106,
- 62, 23,248,202, 62, 81, 78, 48,238,175, 2, 74,126,204, 0,255, 62, 56,193, 58, 62, 20, 61, 94, 62, 88,197, 8, 25,218,253,177,
-125, 86, 2,255,189,152,252,168, 62, 20, 61, 94, 62, 88,197, 8,230, 38,253,177,125, 86, 2,255, 62,127,170, 64, 62, 9, 11, 25,
- 62, 88,197, 8, 21,182,240,210,125, 57, 2,255,190, 19,103, 90, 62, 9, 11, 25, 62, 88,197, 8,234, 74,240,210,125, 57, 2,255,
- 62,161,107,237, 61,229, 77, 34, 62, 51,114,207, 28,143,237,249,123,117, 0,255,190, 86,148,244, 61,229, 77, 34, 62, 51,114,207,
-227,113,237,249,123,117, 0,255, 62,167, 5, 15, 61,169,150, 97, 62, 47,183, 99, 15,209,246,217,126,175, 0,255,190, 97,199, 56,
- 61,169,150, 97, 62, 47,183, 99,240, 47,246,217,126,175, 0,255, 62,165, 39, 89, 61, 32, 8,125, 62, 43,251,247, 24,177,253,190,
-125,146, 0,255,190, 94, 11,204, 61, 32, 8,125, 62, 43,251,247,231, 79,253,190,125,146, 0,255, 62,140,229, 26,187,152,222, 60,
- 62, 62,165, 20, 33, 20, 2, 75,123,160, 0,255,190, 45,135, 79,187,152,222, 60, 62, 62,165, 20,222,236, 2, 75,123,160, 0,255,
- 62,105, 69,184,188,187,128,115, 62, 73,215, 88, 26, 85,248,238,125, 14, 0,255,189,250, 5,163,188,187,128,115, 62, 73,215, 88,
-229,171,248,238,125, 14, 0,255, 62, 34, 92,178,186,133,194,226, 62, 92,128,116, 7, 8,250,142,127,175, 0,255,189, 88,103, 48,
-186,133,194,226, 62, 92,128,116,248,248,250,142,127,175, 0,255, 62, 11,248, 41, 61,177, 13, 57, 62, 92,128,116, 34,169,240, 2,
-122, 43, 0,255,188,253,170, 27, 61,177, 13, 57, 62, 92,128,116,221, 87,240, 2,122, 43, 0,255, 62, 26,229,218, 61,251,177,170,
- 62, 92,128,116, 27,126,239,108,123,231, 0,255,189, 58,139,207, 61,251,177,170, 62, 92,128,116,228,130,239,108,123,231, 0,255,
- 62, 38, 24, 30, 61,236,195,250, 62, 81, 78, 48, 64,226,207, 13, 98,224, 0,255,189,103, 84,224, 61,236,195,250, 62, 81, 78, 48,
-191, 30,207, 13, 98,224, 0,255, 62, 19,111, 1, 61,177, 13, 57, 62, 81, 78, 48, 96, 29,229,169, 80, 81, 0,255,189, 28,176,110,
- 61,177, 13, 57, 62, 81, 78, 48,159,227,229,169, 80, 81, 0,255, 62, 41,211,138, 59,205,106, 77, 62, 81, 78, 48, 55, 36, 71,122,
- 90,188, 0,255,189,118, 66,143, 59,205,106, 77, 62, 81, 78, 48,200,220, 71,122, 90,188, 0,255, 62,105, 69,184,188, 67,220,161,
- 62, 66, 96,128, 21, 76, 78, 90, 98,241, 0,255,189,250, 5,163,188, 67,220,161, 62, 66, 96,128,234,180, 78, 90, 98,241, 0,255,
- 62,137, 41,174, 59, 43,249,149, 62, 55, 46, 59,245, 85, 69, 69,107, 25, 0,255,190, 38, 16,118, 59, 43,249,149, 62, 55, 46, 59,
- 10,171, 69, 69,107, 25, 0,255, 62,157,176,129, 61, 61,227,222, 62, 40, 64,139,223,232, 29,211,120, 67, 0,255,190, 79, 30, 28,
- 61, 61,227,222, 62, 40, 64,139, 32, 24, 29,211,120, 67, 0,255, 62,159,142, 55, 61,162, 31,137, 62, 40, 64,139,210,148,238,123,
-118, 95, 0,255,190, 82,217,136, 61,162, 31,137, 62, 40, 64,139, 45,108,238,123,118, 95, 0,255, 62,153,245, 21, 61,214, 95,114,
- 62, 43,251,247,229,216,179,108, 99, 43, 0,255,190, 71,167, 67, 61,214, 95,114, 62, 43,251,247, 26, 40,179,108, 99, 43, 0,255,
- 62,123,238,212, 62, 5, 79,173, 62, 77,146,196,237,202,158,179, 81, 35, 2,255,190, 15,171,238, 62, 5, 79,173, 62, 77,146,196,
- 18, 54,158,179, 81, 35, 2,255, 62, 60,124,166, 62, 9, 11, 25, 62, 85, 9,156, 39, 24,212,118,113,214, 2,255,189,160,115,129,
- 62, 9, 11, 25, 62, 85, 9,156,216,232,212,118,113,214, 2,255, 62, 86,156,155, 62, 12,198,133, 62, 77,146,196, 1,213,193,189,
-111,208, 0,255,189,212,179,106, 62, 12,198,133, 62, 77,146,196,254, 43,193,189,111,208, 0,255, 62, 23, 42,109, 60,230,126,216,
- 62, 77,146,196, 84,226, 42,192, 85,187, 0,255,189, 43,158, 31, 60,230,126,216, 62, 77,146,196,171, 30, 42,192, 85,187, 0,255,
- 62, 19,111, 1, 61, 91,191, 63, 62, 77,146,196,102,235, 2,196, 76, 11, 0,255,189, 28,176,110, 61, 91,191, 63, 62, 77,146,196,
-153, 21, 2,196, 76, 11, 0,255, 61,212,194,185, 62, 38,230,122, 62, 10,101, 42,182,183,104,118,246, 5, 0,255, 58,240,196,191,
- 62, 38,230,122, 62, 10,101, 42, 73, 73,104,118,246, 5, 0,255, 62, 19,111, 1, 62,131,247,186, 62, 14, 32,150,192,208, 66,221,
-167, 3, 2,255,189, 28,176,110, 62,131,247,186, 62, 14, 32,150, 63, 48, 66,221,167, 3, 2,255, 62, 86,156,155, 62,137,144,220,
- 62, 2,238, 82, 9, 59, 90, 89,165,208, 2,255,189,212,179,106, 62,137,144,220, 62, 2,238, 82,246,197, 90, 89,165,208, 2,255,
- 62,142,194,208, 62, 83,175,139, 61,224,138,107, 37,165,114,104,212,176, 0,255,190, 49, 66,187, 62, 83,175,139, 61,224,138,107,
-218, 91,114,104,212,176, 0,255, 62,189,105,152, 62, 35, 43, 14, 61,164,211,170, 45, 67,116, 40,227, 1, 0,255,190,135, 72, 37,
- 62, 35, 43, 14, 61,164,211,170,210,189,116, 40,227, 1, 0,255, 62,217,103, 66, 62, 12,198,133, 61,134,248, 73, 94,100, 79,237,
-223, 18, 0,255,190,163, 69,207, 62, 12,198,133, 61,134,248, 73,161,156, 79,237,223, 18, 0,255, 62,211,206, 32, 60,200,163,119,
- 60,211,115,252,120,247,221,255,231,165, 0,255,190,157,172,173, 60,200,163,119, 60,211,115,252,135, 9,221,255,231,165, 0,255,
- 62,170,192,123,189, 85, 45,188, 61, 52, 94,112, 76,155,154,106,242, 19, 0,255,190,105, 62, 16,189, 85, 45,188, 61, 52, 94,112,
-179,101,154,106,242, 19, 0,255, 62,131,144,140,189,196, 41, 0, 61,142,111, 33, 56,204,142, 26, 13,138, 0,255,190, 26,222, 50,
-189,196, 41, 0, 61,142,111, 33,199, 52,142, 26, 13,138, 0,255, 61, 88,133,203, 62,187,243, 16,188,105,242, 89, 0, 0,106,155,
- 70,214, 2,255, 61, 88,133,203, 62,208,121,226,190, 62, 7,254, 0, 0,127,243, 3, 82, 2,255, 61, 88,133,203,190, 18,152,254,
-190,236,214, 11, 0, 0,164, 54,166,204, 3,255, 61, 88,133,203,190,136,190,173,189,124,142,139, 0, 0,129,179,235, 65, 0,255,
- 61, 88,133,203,191, 1,243,205, 61,134,248, 73, 0, 0,151,182,181,204, 2,255, 61, 88,133,203,190,218,217,247, 60, 56, 12,241,
- 0, 0,221,231,132,162, 2,255, 61, 88,133,203,190,162,222,161, 57,157, 21,147, 0, 0,212, 16,135,201, 0,255, 61, 88,133,203,
-190,142, 87,207,188,146,212,141, 0, 0,147,245,187, 97, 0,255, 62,230,119, 61, 61,106,172,239,189,253, 43,161,125,164,235,181,
- 13,156, 0,255,190,176, 85,202, 61,106,172,239,189,253, 43,161,130, 92,235,181, 13,156, 0,255, 62,232, 84,243, 61,199,113,194,
-190, 47, 26, 78,126,174,238, 23,252, 66, 0,255,190,178, 51,128, 61,199,113,194,190, 47, 26, 78,129, 82,238, 23,252, 66, 0,255,
- 62,211,206, 32, 61,147, 49,216,190,180,218,181, 81, 70, 13,148,158, 15, 1,255,190,157,172,173, 61,147, 49,216,190,180,218,181,
-174,186, 13,148,158, 15, 1,255, 62,137, 41,174, 62, 27,180, 54,190,244, 76,226, 58,123, 21,228,144, 70, 3,255,190, 38, 16,118,
- 62, 27,180, 54,190,244, 76,226,197,133, 21,228,144, 70, 3,255, 62,202,121,146,189,151, 95,239,189,238, 61,240, 89, 76,164,139,
- 6,161, 2,255,190,148, 88, 31,189,151, 95,239,189,238, 61,240,166,180,164,139, 6,161, 2,255, 62,168,226,197,189,226, 4, 97,
-190,103, 21,163, 38, 93,134, 34, 7,182, 0,255,190,101,130,164,189,226, 4, 97,190,103, 21,163,217,163,134, 34, 7,182, 0,255,
- 62,180, 21, 9,189,100, 27,109,190,178,252,255, 43,106,170,219,170,222, 1,255,190,123,231, 45,189,100, 27,109,190,178,252,255,
-212,150,170,219,170,222, 1,255, 62, 86,156,155,188,217, 91,211,190,234,248, 85, 55,168,213,109,148,229, 2,255,189,212,179,106,
-188,217, 91,211,190,234,248, 85,200, 88,213,109,148,229, 2,255, 62, 38, 24, 30,190, 93, 61,112, 61, 37,112,191,120,197,255, 36,
-213,158, 0,255,189,103, 84,224,190, 93, 61,112, 61, 37,112,191,135, 59,255, 36,213,158, 0,255, 62, 11,248, 41,190,123, 24,209,
-188,236,102,176, 84,188,181, 20,196, 24, 0,255,188,253,170, 27,190,123, 24,209,188,236,102,176,171, 68,181, 20,196, 24, 0,255,
- 62, 64, 56, 19,190,196,117,110, 60,241, 79, 92, 79,131,254, 86,155,183, 2,255,189,167,234, 89,190,196,117,110, 60,241, 79, 92,
-176,125,254, 86,155,183, 2,255, 62, 45,142,246,190,146, 19, 59, 61, 7,149, 95, 99, 5, 1, 8,174,231, 0,255,189,130,152, 32,
-190,146, 19, 59, 61, 7,149, 95,156,251, 1, 8,174,231, 0,255, 62, 82,225, 47,190,244,249,234, 61, 22,131, 15, 62, 65,185,227,
-168,224, 2,255,189,205, 60,146,190,244,249,234, 61, 22,131, 15,193,191,185,227,168,224, 2,255, 61,242,158, 25,190,207,167,178,
- 60,181,152,155, 16,133,232,208,131, 55, 0,255,188, 80,194,110,190,207,167,178, 60,181,152,155,239,123,232,208,131, 55, 0,255,
- 61,227,176,105,190,155,103,201, 60,151,189, 58, 48, 7,224,163,141,149, 0,255,187,178,169,214,190,155,103,201, 60,151,189, 58,
-207,249,224,163,141,149, 0,255, 62, 4,129, 81,190,252,112,195, 61, 97, 39,129, 12, 68,158,218,173,147, 0,255,188,193,243, 89,
-190,252,112,195, 61, 97, 39,129,243,188,158,218,173,147, 0,255, 62, 30,161, 70,190, 59,166,163, 61, 82, 57,208,124,195,227,106,
-255,203, 0,255,189, 73,121,127,190, 59,166,163, 61, 82, 57,208,131, 61,227,106,255,203, 0,255, 62, 26,229,218,190, 33,134,174,
- 61,142,111, 33,120, 29,231,105, 36,193, 0,255,189, 58,139,207,190, 33,134,174, 61,142,111, 33,135,227,231,105, 36,193, 0,255,
- 62, 23, 42,109,190, 7,102,186, 61,172, 74,130,101,160,182,164, 25,240, 0,255,189, 43,158, 31,190, 7,102,186, 61,172, 74,130,
-154, 96,182,164, 25,240, 0,255, 62, 26,229,218,190,111,230,140,189,148,171,206, 84,120,159,221,253,198, 0,255,189, 58,139,207,
-190,111,230,140,189,148,171,206,171,136,159,221,253,198, 0,255, 62, 67,243,127,190, 74,148, 83,190,139,205, 16, 67,255,151, 42,
-228, 73, 2,255,189,175, 97, 49,190, 74,148, 83,190,139,205, 16,188, 1,151, 42,228, 73, 2,255, 62, 90, 88, 7,189,248,104,235,
-190,205, 28,244, 63,201,176, 25,179, 0, 3,255,189,220, 42, 66,189,248,104,235,190,205, 28,244,192, 55,176, 25,179, 0, 3,255,
- 62,135, 75,248, 62,180,124, 55,190,167,202,187, 56, 34, 95,160,192, 17, 2,255,190, 34, 85, 10, 62,180,124, 55,190,167,202,187,
-199,222, 95,160,192, 17, 2,255, 62,135, 75,248, 62,195,105,232,190, 58, 76,146, 55, 54,115,120, 0,239, 2,255,190, 34, 85, 10,
- 62,195,105,232,190, 58, 76,146,200,202,115,120, 0,239, 2,255, 62,135, 75,248, 62,176,192,203,189, 34,252,105, 63,239, 92,164,
- 60,238, 2,255,190, 34, 85, 10, 62,176,192,203,189, 34,252,105,192, 17, 92,164, 60,238, 2,255, 62,137, 41,174, 62, 68,193,219,
- 61, 82, 57,208, 49,123,102,255, 57,170, 0,255,190, 38, 16,118, 62, 68,193,219, 61, 82, 57,208,206,133,102,255, 57,170, 0,255,
- 62,200,155,220, 62, 12,198,133, 59,248,172, 95, 98,142, 73,198, 35, 6, 0,255,190,146,122,105, 62, 12,198,133, 59,248,172, 95,
-157,114, 73,198, 35, 6, 0,255, 62,178, 55, 83, 62, 35, 43, 14,188,146,212,141, 61,129,106,254, 33,241, 0,255,190,120, 43,193,
- 62, 35, 43, 14,188,146,212,141,194,127,106,254, 33,241, 0,255, 62,180, 21, 9, 62,141, 76, 72,189,253, 43,161, 76,234, 87,151,
- 52,221, 0,255,190,123,231, 45, 62,141, 76, 72,189,253, 43,161,179, 22, 87,151, 52,221, 0,255, 62,217,103, 66, 62, 87,106,247,
-189,185,254, 7,101,187, 66, 28, 40,199, 2,255,190,163, 69,207, 62, 87,106,247,189,185,254, 7,154, 69, 66, 28, 40,199, 2,255,
- 62,217,103, 66, 62,113,138,236,190, 80,177, 26,113,183, 58, 68,248,119, 2,255,190,163, 69,207, 62,113,138,236,190, 80,177, 26,
-142, 73, 58, 68,248,119, 2,255, 62,180, 21, 9, 62,152,126,141,190,118, 3, 83, 86,235, 93,238,253,205, 0,255,190,123,231, 45,
- 62,152,126,141,190,118, 3, 83,169, 21, 93,238,253,205, 0,255, 62,180, 21, 9, 62,135,179, 38,190,182,184,107, 85,232, 70,154,
-192,157, 2,255,190,123,231, 45, 62,135,179, 38,190,182,184,107,170, 24, 70,154,192,157, 2,255, 62,217,103, 66, 62, 76, 56,179,
-190,162, 49,153,110,166, 42,177,207,222, 2,255,190,163, 69,207, 62, 76, 56,179,190,162, 49,153,145, 90, 42,177,207,222, 2,255,
- 62,174,123,231, 61,206,232,154,190,216, 79, 56, 75, 58, 1, 57,152,116, 3,255,190,112,180,232, 61,206,232,154,190,216, 79, 56,
-180,198, 1, 57,152,116, 3,255, 62,142,194,208,189, 40,100,171,190,206,250,170, 70, 73,187,147,173,200, 1,255,190, 49, 66,187,
-189, 40,100,171,190,206,250,170,185,183,187,147,173,200, 0,255, 62,223, 0,100, 61,206,232,154,190,121,190,191,114,194, 41, 80,
- 38,207, 0,255,190,168,222,241, 61,206,232,154,190,121,190,191,141, 62, 41, 80, 38,207, 0,255, 62,120, 51,104,190, 7,102,186,
-189,163,153,127, 74,232,154,153, 22, 28, 0,255,190, 11,240,130,190, 7,102,186,189,163,153,127,181, 24,154,153, 22, 28, 0,255,
- 62,129,178,214,190, 18,152,254,190,125,122, 44, 71, 89,151,115,237, 1, 0,255,190, 23, 34,198,190, 18,152,254,190,125,122, 44,
-184,167,151,115,237, 1, 0,255, 62,239,203,202, 62, 12,198,133,190,132, 86, 56,220, 72, 93,207, 79,106, 2,255,190,185,170, 88,
- 62, 12,198,133,190,132, 86, 56, 35,184, 93,207, 79,106, 2,255, 62,211,206, 32,189,240,242, 18,190, 84,108,135, 15, 30,150, 34,
- 70, 84, 2,255,190,157,172,173,189,240,242, 18,190, 84,108,135,240,226,150, 34, 70, 84, 2,255, 63, 9,160, 38,189,203,159,217,
-190,154,186,192, 67,164,166,138, 61,172, 0,255,190,221, 30,219,189,203,159,217,190,154,186,192,188, 92,166,138, 61,172, 0,255,
- 63, 38,140,172,188,217, 91,211,190,178,252,255, 83,179,206,223, 83,114, 0,255,191, 11,123,244,188,217, 91,211,190,178,252,255,
-172, 77,206,223, 83,114, 0,255, 63, 46,242, 95, 61,199,113,194,190,177, 31, 73, 92, 54, 12,232, 87,210, 2,255,191, 19,225,167,
- 61,199,113,194,190,177, 31, 73,163,202, 12,232, 87,210, 2,255, 63, 32,243,138, 62, 61, 75, 3,190,177, 31, 73, 62,247, 83,221,
- 73, 97, 0,255,191, 5,226,209, 62, 61, 75, 3,190,177, 31, 73,193, 9, 83,221, 73, 97, 0,255, 63, 7,194,112, 62, 46, 93, 82,
-190,150,255, 84, 5,181,111, 80, 62,236, 0,255,190,217, 99,111, 62, 46, 93, 82,190,150,255, 84,250, 75,111, 80, 62,236, 0,255,
- 63, 6,211,149, 62, 16,129,241,190,145,102, 50, 69,236,239,117,105,236, 0,255,190,215,133,185, 62, 16,129,241,190,145,102, 50,
-186, 20,239,117,105,236, 0,255, 63, 27, 90,104, 62, 27,180, 54,190,169,168,113, 24, 34,231,205,123, 89, 0,255,191, 0, 73,175,
- 62, 27,180, 54,190,169,168,113,231,222,231,205,123, 89, 0,255, 63, 36,174,246, 61,169,150, 97,190,173, 99,221,223, 69,252, 16,
-123,173, 0,255,191, 9,158, 62, 61,169,150, 97,190,173, 99,221, 32,187,252, 16,123,173, 0,255, 63, 30, 38,249,188,127,147, 98,
-190,173, 99,221,239,171, 39, 0,120,207, 0,255,191, 3, 22, 64,188,127,147, 98,190,173, 99,221, 16, 85, 39, 0,120,207, 0,255,
- 63, 8,177, 75,189,143,233, 23,190,149, 33,158, 51, 9, 45, 56,108, 82, 0,255,190,219, 65, 37,189,143,233, 23,190,149, 33,158,
-204,247, 45, 56,108, 82, 0,255, 62,224,222, 26,189,173,196,120,190, 88, 39,243, 38,147, 62,224,104,153, 2,255,190,170,188,167,
-189,173,196,120,190, 88, 39,243,217,109, 62,224,104,153, 2,255, 62,247, 66,162, 61,236,195,250,190,128,154,204, 62,218,243,152,
-110,206, 2,255,190,193, 33, 48, 61,236,195,250,190,128,154,204,193, 38,243,152,110,206, 2,255, 62,252,219,196, 61,184,132, 17,
-190,145,102, 50, 87, 10,182, 73, 58, 19, 0,255,190,198,186, 82, 61,184,132, 17,190,145,102, 50,168,246,182, 73, 58, 19, 0,255,
- 62,237,238, 21,189,128,251,103,190,125,122, 44, 15,232,121,106, 37, 64, 0,255,190,183,204,162,189,128,251,103,190,125,122, 44,
-240, 24,121,106, 37, 64, 0,255, 63, 9,160, 38,189, 85, 45,188,190,164, 15, 79,239,157,122, 89, 33,212, 0,255,190,221, 30,219,
-189, 85, 45,188,190,164, 15, 79, 16, 99,122, 89, 33,212, 0,255, 63, 27, 90,104,188, 8, 37,223,190,182,184,107,158, 8, 81,202,
- 9,185, 0,255,191, 0, 73,175,188, 8, 37,223,190,182,184,107, 97,248, 81,202, 9,185, 0,255, 63, 32,243,138, 61,132, 68, 40,
-190,182,184,107,131, 60,239,145, 23, 95, 0,255,191, 5,226,209, 61,132, 68, 40,190,182,184,107,124,196,239,145, 23, 95, 0,255,
- 63, 25,124,178, 61,236,195,250,190,180,218,181,228, 27,153, 22, 70,206, 0,255,190,252,215,242, 61,236,195,250,190,180,218,181,
- 27,229,153, 22, 70,206, 0,255, 63, 7,194,112, 61,221,214, 74,190,162, 49,153, 68, 65,168,253, 64,113, 0,255,190,217, 99,111,
- 61,221,214, 74,190,162, 49,153,187,191,168,253, 64,113, 0,255, 62,228,153,135, 61,169,150, 97,190,125,122, 44, 86,113,222,190,
- 88, 87, 0,255,190,174,120, 20, 61,169,150, 97,190,125,122, 44,169,143,222,190, 88, 87, 0,255, 62,226,187,209, 60,230,126,216,
-190,141,170,198, 95,196,182,107, 42,100, 0,255,190,172,154, 93, 60,230,126,216,190,141,170,198,160, 60,182,107, 42,100, 0,255,
- 62,208, 18,180,188, 8, 37,223,190,141,170,198,111, 42, 14, 21, 61,220, 0,255,190,153,241, 65,188, 8, 37,223,190,141,170,198,
-144,214, 14, 21, 61,220, 0,255, 62,223, 0,100,188, 67,220,161,190,141,170,198, 79, 3, 91, 4, 43, 19, 2,255,190,168,222,241,
-188, 67,220,161,190,141,170,198,176,253, 91, 4, 43, 19, 2,255, 62,228,153,135,189, 55, 82, 92,190,141,170,198,107,207,254,198,
- 68,250, 2,255,190,174,120, 20,189, 55, 82, 92,190,141,170,198,148, 49,254,198, 68,250, 2,255, 62,221, 34,174,189,115, 9, 29,
-190,141,170,198, 82, 7, 64,225, 73,200, 0,255,190,167, 1, 59,189,115, 9, 29,190,141,170,198,173,249, 64,225, 73,200, 0,255,
- 62,200,155,220,189, 85, 45,188,190, 58, 76,146,117, 38,207, 66,239, 47, 0,255,190,146,122,105,189, 85, 45,188,190, 58, 76,146,
-138,218,207, 66,239, 47, 0,255, 62,198,190, 38,189,128,251,103,190,106,209, 15, 97,150, 18,139, 80,184, 0,255,190,144,156,179,
-189,128,251,103,190,106,209, 15,158,106, 18,139, 80,184, 0,255, 62,198,190, 38,189, 10,137, 74,190,114, 71,231,116, 17,240, 66,
- 51,154, 0,255,190,144,156,179,189, 10,137, 74,190,114, 71,231,139,239,240, 66, 51,154, 0,255, 62,217,103, 66, 61, 46,246, 45,
-190,125,122, 44,113,112,204,245, 30, 39, 0,255,190,163, 69,207, 61, 46,246, 45,190,125,122, 44,142,144,204,245, 30, 39, 0,255,
- 62,239,203,202, 61,121,154,159,190,139,205, 16, 90,105,185, 61, 56,146, 0,255,190,185,170, 88, 61,121,154,159,190,139,205, 16,
-165,151,185, 61, 56,146, 0,255, 62,239,203,202, 61,106,172,239,190,152,221, 10, 82,191,204,102, 82,230, 0,255,190,185,170, 88,
- 61,106,172,239,190,152,221, 10,173, 65,204,102, 82,230, 0,255, 62,221, 34,174,189,115, 9, 29,190,152,221, 10, 29,246, 98, 64,
- 76, 94, 0,255,190,167, 1, 59,189,115, 9, 29,190,152,221, 10,226, 10, 98, 64, 76, 94, 0,255, 62,230,119, 61,189, 55, 82, 92,
-190,152,221, 10, 77,150, 17,111,100, 75, 0,255,190,176, 85,202,189, 55, 82, 92,190,152,221, 10,178,106, 17,111,100, 75, 0,255,
- 62,224,222, 26,188,127,147, 98,190,152,221, 10, 60,239, 60,190, 94,195, 0,255,190,170,188,167,188,127,147, 98,190,152,221, 10,
-195, 17, 60,190, 94,195, 0,255, 62,209,240,106,188, 8, 37,223,190,152,221, 10, 83,199, 23,178, 93,209, 0,255,190,155,206,247,
-188, 8, 37,223,190,152,221, 10,172, 57, 23,178, 93,209, 0,255, 62,228,153,135, 60,230,126,216,190,152,221, 10, 73, 98,200, 1,
- 88,170, 0,255,190,174,120, 20, 60,230,126,216,190,152,221, 10,182,158,200, 1, 88,170, 0,255, 63, 9,160, 38, 61,206,232,154,
-190,175, 65,147, 68, 23,223,166,103,112, 0,255,190,221, 30,219, 61,206,232,154,190,175, 65,147,187,233,223,166,103,112, 0,255,
- 63, 27, 90,104, 61,221,214, 74,190,192, 12,249, 18,165,216,156,120, 89, 0,255,191, 0, 73,175, 61,221,214, 74,190,192, 12,249,
-237, 91,216,156,120, 89, 0,255, 63, 35,192, 27, 61,121,154,159,190,193,234,175,185, 25,231, 29,103,157, 0,255,191, 8,175, 98,
- 61,121,154,159,190,193,234,175, 70,231,231, 29,103,157, 0,255, 63, 30, 38,249,188, 67,220,161,190,192, 12,249,209, 43, 64, 0,
-100,119, 0,255,191, 3, 22, 64,188, 67,220,161,190,192, 12,249, 46,213, 64, 0,100,119, 0,255, 63, 10,143, 1,189, 85, 45,188,
-190,177, 31, 73, 26, 52, 92,240, 84, 3, 0,255,190,222,252,145,189, 85, 45,188,190,177, 31, 73,229,204, 92,240, 84, 3, 0,255,
- 62,237,238, 21,189,115, 9, 29,190,139,205, 16, 8, 58,111,116, 62,101, 0,255,190,183,204,162,189,115, 9, 29,190,139,205, 16,
-247,198,111,116, 62,101, 0,255, 62,254,185,122, 61,169,150, 97,190,158,118, 45, 80,198,213,102, 89,175, 0,255,190,200,152, 8,
- 61,169,150, 97,190,158,118, 45,175, 58,213,102, 89,175, 0,255, 62,239,203,202,186,133,194,226,190,154,186,192, 25,136, 0,130,
-125,108, 0,255,190,185,170, 88,186,133,194,226,190,154,186,192,230,120, 0,130,125,108, 0,255, 62,250,254, 14,188,187,128,115,
-190,156,152,119, 27, 2, 30, 58,121,104, 0,255,190,196,220,156,188,187,128,115,190,156,152,119,228,254, 30, 58,121,104, 0,255,
- 63, 4,245,223, 59,205,106, 77,190,164, 15, 79, 55,218,253,126,115, 35, 0,255,190,211,202, 76, 59,205,106, 77,190,164, 15, 79,
-200, 38,253,126,115, 35, 0,255, 63, 0, 75,152, 60,230,126,216,190,160, 83,227, 41,164,255,199,121, 8, 0,255,190,202,117,190,
- 60,230,126,216,190,160, 83,227,214, 92,255,199,121, 8, 0,255, 63, 6,211,149, 61,106,172,239,190,165,237, 5, 39,237, 9,191,
-121, 55, 0,255,190,215,133,185, 61,106,172,239,190,165,237, 5,216, 19, 9,191,121, 55, 0,255, 63, 11,125,220, 61, 17, 26,205,
-190,167,202,187, 46,208,244, 41,118,137, 0,255,190,224,218, 71, 61, 17, 26,205,190,167,202,187,209, 48,244, 41,118,137, 0,255,
- 63, 18, 5,218, 61, 61,227,222,190,169,168,113, 53, 70, 3, 84,116, 85, 2,255,190,237,234, 65, 61, 61,227,222,190,169,168,113,
-202,186, 3, 84,116, 85, 2,255, 63, 15, 57, 73, 61,154,168,176,190,169,168,113, 44, 99, 38, 36,113,212, 2,255,190,232, 81, 31,
- 61,154,168,176,190,169,168,113,211,157, 38, 36,113,212, 2,255, 63, 7,194,112, 62, 27,180, 54,190,192, 12,249,198,249, 72, 3,
-166,222, 3,255,190,217, 99,111, 62, 27,180, 54,190,192, 12,249, 57, 7, 72, 3,166,222, 3,255, 63, 34,209, 64, 62, 42,161,230,
-190,206,250,170, 37,198, 68,123,154,174, 3,255,191, 7,192,135, 62, 42,161,230,190,206,250,170,218, 58, 68,123,154,174, 3,255,
- 63, 48,208, 21, 61,177, 13, 57,190,195,200,102,121, 3, 17,201,218, 73, 3,255,191, 21,191, 93, 61,177, 13, 57,190,195,200,102,
-134,253, 17,201,218, 73, 3,255, 63, 42, 72, 24,188,217, 91,211,190,203, 63, 62, 82, 59,200, 75,175, 70, 3,255,191, 15, 55, 96,
-188,217, 91,211,190,203, 63, 62,173,197,200, 75,175, 70, 3,255, 63, 9,160, 38,189,188,178, 40,190,193,234,175,249,134,165,184,
-165,129, 3,255,190,221, 30,219,189,188,178, 40,190,193,234,175, 6,122,165,184,165,129, 3,255, 62,215,137,140,189,226, 4, 97,
-190,154,186,192,249,126,163,122,167,205, 1,255,190,161,104, 25,189,226, 4, 97,190,154,186,192, 6,130,163,122,167,205, 1,255,
- 62,232, 84,243, 62, 1,148, 65,190,167,202,187,193, 93, 65,224,165,229, 1,255,190,178, 51,128, 62, 1,148, 65,190,167,202,187,
- 62,163, 65,224,165,229, 1,255, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,206, 16, 0, 0, 0,242, 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, 5, 31,136, 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,
- 68, 65, 84, 65, 0, 0, 47, 28, 5, 31,136, 32, 0, 0, 0, 53, 0, 0, 3,237, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 34,
- 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 43, 0, 0, 0, 45,
- 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 44,
- 0, 0, 0, 46, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 41, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 42, 0, 0, 0, 34, 0, 0, 0, 2,
- 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 34,
- 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 7,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 9,
- 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, 34,
- 0, 0, 0, 12, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 13,
- 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 7,
- 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 19, 0, 0, 0, 34,
- 0, 0, 0, 15, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 18,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 20,
- 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 23, 0, 0, 0, 34,
- 0, 0, 0, 23, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 26,
- 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 25,
- 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 28, 0, 0, 0, 34,
- 0, 0, 0, 18, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 31,
- 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 26,
- 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 33, 0, 0, 0, 34,
- 0, 0, 0, 31, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 34,
- 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 31,
- 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 38, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 34,
- 0, 0, 0, 32, 0, 0, 0, 38, 0, 0, 0, 34, 0, 0, 0, 37, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 39,
- 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 40, 0, 0, 0, 34, 0, 0, 0, 37,
- 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 39, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 44, 0, 0, 0, 34,
- 0, 0, 0, 40, 0, 0, 0, 42, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 46,
- 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 45,
- 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 34,
- 0, 0, 0, 48, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 51,
- 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0, 52, 0, 0, 0, 34, 0, 0, 0, 23,
- 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 54, 0, 0, 0, 34,
- 0, 0, 0, 52, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 55,
- 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 12,
- 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 58, 0, 0, 0, 34,
- 0, 0, 0, 56, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61,
- 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 34,
- 0, 0, 0, 62, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 64,
- 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 60,
- 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 61, 0, 0, 0, 34,
- 0, 0, 0, 60, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 60,
- 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 53,
- 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 59, 0, 0, 0, 34,
- 0, 0, 0, 52, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0, 60,
- 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0,171, 0, 0, 0, 34, 0, 0, 0,171, 0, 0, 0,173, 0, 0, 0, 34, 0, 0, 0, 89,
- 0, 0, 0,173, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0,172, 0, 0, 0,173, 0, 0, 0, 34,
- 0, 0, 0, 88, 0, 0, 0,172, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0,169,
- 0, 0, 0, 34, 0, 0, 0,169, 0, 0, 0,171, 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0,170,
- 0, 0, 0,172, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0,170, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 88, 0, 0, 0, 34,
- 0, 0, 0, 83, 0, 0, 0,167, 0, 0, 0, 34, 0, 0, 0,167, 0, 0, 0,169, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 85,
- 0, 0, 0, 34, 0, 0, 0,168, 0, 0, 0,170, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0,168, 0, 0, 0, 34, 0, 0, 0, 84,
- 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0,165, 0, 0, 0, 34, 0, 0, 0,165, 0, 0, 0,167, 0, 0, 0, 34,
- 0, 0, 0, 81, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0,166, 0, 0, 0,168, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0,166,
- 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0,163, 0, 0, 0, 34, 0, 0, 0,163,
- 0, 0, 0,165, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 81, 0, 0, 0, 34, 0, 0, 0,164, 0, 0, 0,166, 0, 0, 0, 34,
- 0, 0, 0, 80, 0, 0, 0,164, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 0, 90,
- 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0,143, 0, 0, 0, 34, 0, 0, 0,143, 0, 0, 0,161, 0, 0, 0, 34, 0, 0, 0, 77,
- 0, 0, 0,161, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0,144, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0, 91, 0, 0, 0, 34,
- 0, 0, 0, 78, 0, 0, 0,162, 0, 0, 0, 34, 0, 0, 0,144, 0, 0, 0,162, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 92,
- 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0,145, 0, 0, 0, 34, 0, 0, 0,143, 0, 0, 0,145, 0, 0, 0, 34, 0, 0, 0, 93,
- 0, 0, 0,146, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0,144, 0, 0, 0,146, 0, 0, 0, 34,
- 0, 0, 0, 92, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0,147, 0, 0, 0, 34, 0, 0, 0,145, 0, 0, 0,147,
- 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0,148, 0, 0, 0, 34, 0, 0, 0, 93, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0,146,
- 0, 0, 0,148, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0,149, 0, 0, 0, 34,
- 0, 0, 0,147, 0, 0, 0,149, 0, 0, 0, 34, 0, 0, 0, 97, 0, 0, 0,150, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 97,
- 0, 0, 0, 34, 0, 0, 0,148, 0, 0, 0,150, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 98,
- 0, 0, 0,151, 0, 0, 0, 34, 0, 0, 0,149, 0, 0, 0,151, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,152, 0, 0, 0, 34,
- 0, 0, 0, 97, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0,150, 0, 0, 0,152, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,100,
- 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,153, 0, 0, 0, 34, 0, 0, 0,151, 0, 0, 0,153, 0, 0, 0, 34, 0, 0, 0,101,
- 0, 0, 0,154, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0,152, 0, 0, 0,154, 0, 0, 0, 34,
- 0, 0, 0,100, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,155, 0, 0, 0, 34, 0, 0, 0,153, 0, 0, 0,155,
- 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,156, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,154,
- 0, 0, 0,156, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,157, 0, 0, 0, 34,
- 0, 0, 0,155, 0, 0, 0,157, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,158, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,105,
- 0, 0, 0, 34, 0, 0, 0,156, 0, 0, 0,158, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0,106,
- 0, 0, 0,159, 0, 0, 0, 34, 0, 0, 0,157, 0, 0, 0,159, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,160, 0, 0, 0, 34,
- 0, 0, 0,105, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,158, 0, 0, 0,160, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0,106,
- 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0,159, 0, 0, 0, 34, 0, 0, 0, 65,
- 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0,160, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,125, 0, 0, 0, 34,
- 0, 0, 0,125, 0, 0, 0,157, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,159, 0, 0, 0, 34, 0, 0, 0,126, 0, 0, 0,158,
- 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,126, 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,160, 0, 0, 0, 34, 0, 0, 0,125,
- 0, 0, 0,176, 0, 0, 0, 34, 0, 0, 0,155, 0, 0, 0,176, 0, 0, 0, 34, 0, 0, 0,156, 0, 0, 0,177, 0, 0, 0, 34,
- 0, 0, 0,126, 0, 0, 0,177, 0, 0, 0, 34, 0, 0, 0,123, 0, 0, 0,153, 0, 0, 0, 34, 0, 0, 0,123, 0, 0, 0,176,
- 0, 0, 0, 34, 0, 0, 0,124, 0, 0, 0,154, 0, 0, 0, 34, 0, 0, 0,124, 0, 0, 0,177, 0, 0, 0, 34, 0, 0, 0,121,
- 0, 0, 0,151, 0, 0, 0, 34, 0, 0, 0,121, 0, 0, 0,123, 0, 0, 0, 34, 0, 0, 0,122, 0, 0, 0,152, 0, 0, 0, 34,
- 0, 0, 0,122, 0, 0, 0,124, 0, 0, 0, 34, 0, 0, 0,119, 0, 0, 0,149, 0, 0, 0, 34, 0, 0, 0,119, 0, 0, 0,121,
- 0, 0, 0, 34, 0, 0, 0,120, 0, 0, 0,150, 0, 0, 0, 34, 0, 0, 0,120, 0, 0, 0,122, 0, 0, 0, 34, 0, 0, 0,117,
- 0, 0, 0,147, 0, 0, 0, 34, 0, 0, 0,117, 0, 0, 0,119, 0, 0, 0, 34, 0, 0, 0,118, 0, 0, 0,148, 0, 0, 0, 34,
- 0, 0, 0,118, 0, 0, 0,120, 0, 0, 0, 34, 0, 0, 0,115, 0, 0, 0,145, 0, 0, 0, 34, 0, 0, 0,115, 0, 0, 0,117,
- 0, 0, 0, 34, 0, 0, 0,116, 0, 0, 0,146, 0, 0, 0, 34, 0, 0, 0,116, 0, 0, 0,118, 0, 0, 0, 34, 0, 0, 0,113,
- 0, 0, 0,143, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0,114, 0, 0, 0,144, 0, 0, 0, 34,
- 0, 0, 0,114, 0, 0, 0,116, 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,162, 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,114,
- 0, 0, 0, 34, 0, 0, 0,174, 0, 0, 0,178, 0, 0, 0, 34, 0, 0, 0,161, 0, 0, 0,174, 0, 0, 0, 34, 0, 0, 0,174,
- 0, 0, 0,179, 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,179, 0, 0, 0, 34, 0, 0, 0,162, 0, 0, 0,174, 0, 0, 0, 34,
- 0, 0, 0, 66, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,111,
- 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0,175, 0, 0, 0, 34, 0, 0, 0,175,
- 0, 0, 0,180, 0, 0, 0, 34, 0, 0, 0,110, 0, 0, 0,180, 0, 0, 0, 34, 0, 0, 0,111, 0, 0, 0,181, 0, 0, 0, 34,
- 0, 0, 0,175, 0, 0, 0,181, 0, 0, 0, 34, 0, 0, 0,178, 0, 0, 0,180, 0, 0, 0, 34, 0, 0, 0,174, 0, 0, 0,175,
- 0, 0, 0, 32, 0, 0, 0,179, 0, 0, 0,181, 0, 0, 0, 34, 0, 0, 0,132, 0, 0, 0,134, 0, 0, 0, 34, 0, 0, 0,134,
- 0, 0, 0,173, 0, 0, 0, 34, 0, 0, 0,132, 0, 0, 0,171, 0, 0, 0, 34, 0, 0, 0,133, 0, 0, 0,134, 0, 0, 0, 34,
- 0, 0, 0,133, 0, 0, 0,172, 0, 0, 0, 34, 0, 0, 0,130, 0, 0, 0,132, 0, 0, 0, 34, 0, 0, 0,130, 0, 0, 0,169,
- 0, 0, 0, 34, 0, 0, 0,131, 0, 0, 0,133, 0, 0, 0, 34, 0, 0, 0,131, 0, 0, 0,170, 0, 0, 0, 34, 0, 0, 0,128,
- 0, 0, 0,130, 0, 0, 0, 34, 0, 0, 0,128, 0, 0, 0,167, 0, 0, 0, 34, 0, 0, 0,129, 0, 0, 0,131, 0, 0, 0, 34,
- 0, 0, 0,129, 0, 0, 0,168, 0, 0, 0, 34, 0, 0, 0,163, 0, 0, 0,184, 0, 0, 0, 34, 0, 0, 0,182, 0, 0, 0,184,
- 0, 0, 0, 34, 0, 0, 0,165, 0, 0, 0,182, 0, 0, 0, 34, 0, 0, 0,183, 0, 0, 0,185, 0, 0, 0, 34, 0, 0, 0,164,
- 0, 0, 0,185, 0, 0, 0, 34, 0, 0, 0,166, 0, 0, 0,183, 0, 0, 0, 34, 0, 0, 0,128, 0, 0, 0,182, 0, 0, 0, 34,
- 0, 0, 0,129, 0, 0, 0,183, 0, 0, 0, 34, 0, 0, 0,141, 0, 0, 0,187, 0, 0, 0, 34, 0, 0, 0,186, 0, 0, 0,187,
- 0, 0, 0, 32, 0, 0, 0,184, 0, 0, 0,186, 0, 0, 0, 34, 0, 0, 0,141, 0, 0, 0,184, 0, 0, 0, 34, 0, 0, 0,142,
- 0, 0, 0,187, 0, 0, 0, 34, 0, 0, 0,142, 0, 0, 0,185, 0, 0, 0, 34, 0, 0, 0,185, 0, 0, 0,186, 0, 0, 0, 34,
- 0, 0, 0, 67, 0, 0, 0,186, 0, 0, 0, 32, 0, 0, 0, 67, 0, 0, 0,182, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0,183,
- 0, 0, 0, 34, 0, 0, 0,127, 0, 0, 0,128, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0,127, 0, 0, 0, 32, 0, 0, 0,127,
- 0, 0, 0,129, 0, 0, 0, 34, 0, 0, 0,139, 0, 0, 0,190, 0, 0, 0, 34, 0, 0, 0,188, 0, 0, 0,190, 0, 0, 0, 34,
- 0, 0, 0,141, 0, 0, 0,188, 0, 0, 0, 34, 0, 0, 0,139, 0, 0, 0,141, 0, 0, 0, 34, 0, 0, 0,189, 0, 0, 0,191,
- 0, 0, 0, 34, 0, 0, 0,140, 0, 0, 0,191, 0, 0, 0, 34, 0, 0, 0,140, 0, 0, 0,142, 0, 0, 0, 34, 0, 0, 0,142,
- 0, 0, 0,189, 0, 0, 0, 34, 0, 0, 0,137, 0, 0, 0,192, 0, 0, 0, 34, 0, 0, 0,190, 0, 0, 0,192, 0, 0, 0, 34,
- 0, 0, 0,137, 0, 0, 0,139, 0, 0, 0, 34, 0, 0, 0,191, 0, 0, 0,193, 0, 0, 0, 34, 0, 0, 0,138, 0, 0, 0,193,
- 0, 0, 0, 34, 0, 0, 0,138, 0, 0, 0,140, 0, 0, 0, 34, 0, 0, 0,136, 0, 0, 0,194, 0, 0, 0, 34, 0, 0, 0,192,
- 0, 0, 0,194, 0, 0, 0, 34, 0, 0, 0,136, 0, 0, 0,137, 0, 0, 0, 34, 0, 0, 0,193, 0, 0, 0,195, 0, 0, 0, 34,
- 0, 0, 0,136, 0, 0, 0,195, 0, 0, 0, 34, 0, 0, 0,136, 0, 0, 0,138, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,135,
- 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,194, 0, 0, 0, 34, 0, 0, 0,135, 0, 0, 0,136, 0, 0, 0, 34, 0, 0, 0, 69,
- 0, 0, 0,195, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0,188, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0,187, 0, 0, 0, 34,
- 0, 0, 0, 68, 0, 0, 0,189, 0, 0, 0, 34, 0, 0, 0,188, 0, 0, 0,203, 0, 0, 0, 34, 0, 0, 0,203, 0, 0, 0,205,
- 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0,205, 0, 0, 0, 34, 0, 0, 0,189, 0, 0, 0,204, 0, 0, 0, 34, 0, 0, 0,204,
- 0, 0, 0,205, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,196, 0, 0, 0, 34, 0, 0, 0,196, 0, 0, 0,197, 0, 0, 0, 34,
- 0, 0, 0,194, 0, 0, 0,197, 0, 0, 0, 34, 0, 0, 0,196, 0, 0, 0,198, 0, 0, 0, 34, 0, 0, 0,195, 0, 0, 0,198,
- 0, 0, 0, 34, 0, 0, 0,197, 0, 0, 0,199, 0, 0, 0, 34, 0, 0, 0,192, 0, 0, 0,199, 0, 0, 0, 34, 0, 0, 0,198,
- 0, 0, 0,200, 0, 0, 0, 34, 0, 0, 0,193, 0, 0, 0,200, 0, 0, 0, 34, 0, 0, 0,199, 0, 0, 0,201, 0, 0, 0, 34,
- 0, 0, 0,190, 0, 0, 0,201, 0, 0, 0, 34, 0, 0, 0,200, 0, 0, 0,202, 0, 0, 0, 34, 0, 0, 0,191, 0, 0, 0,202,
- 0, 0, 0, 34, 0, 0, 0,201, 0, 0, 0,203, 0, 0, 0, 34, 0, 0, 0,202, 0, 0, 0,204, 0, 0, 0, 34, 0, 0, 0,196,
- 0, 0, 0,201, 0, 0, 0, 34, 0, 0, 0,196, 0, 0, 0,202, 0, 0, 0, 34, 0, 0, 0,196, 0, 0, 0,205, 0, 0, 0, 34,
- 0, 0, 0,137, 0, 0, 0,161, 0, 0, 0, 34, 0, 0, 0,136, 0, 0, 0,174, 0, 0, 0, 34, 0, 0, 0,138, 0, 0, 0,162,
- 0, 0, 0, 34, 0, 0, 0,139, 0, 0, 0,208, 0, 0, 0, 34, 0, 0, 0,161, 0, 0, 0,208, 0, 0, 0, 34, 0, 0, 0,140,
- 0, 0, 0,209, 0, 0, 0, 34, 0, 0, 0,162, 0, 0, 0,209, 0, 0, 0, 34, 0, 0, 0,141, 0, 0, 0,210, 0, 0, 0, 34,
- 0, 0, 0,208, 0, 0, 0,210, 0, 0, 0, 34, 0, 0, 0,142, 0, 0, 0,211, 0, 0, 0, 34, 0, 0, 0,209, 0, 0, 0,211,
- 0, 0, 0, 34, 0, 0, 0,163, 0, 0, 0,210, 0, 0, 0, 34, 0, 0, 0,164, 0, 0, 0,211, 0, 0, 0, 34, 0, 0, 0, 79,
- 0, 0, 0,206, 0, 0, 0, 34, 0, 0, 0,206, 0, 0, 0,210, 0, 0, 0, 34, 0, 0, 0,207, 0, 0, 0,211, 0, 0, 0, 34,
- 0, 0, 0, 80, 0, 0, 0,207, 0, 0, 0, 34, 0, 0, 0,206, 0, 0, 0,212, 0, 0, 0, 34, 0, 0, 0,208, 0, 0, 0,212,
- 0, 0, 0, 34, 0, 0, 0,209, 0, 0, 0,213, 0, 0, 0, 34, 0, 0, 0,207, 0, 0, 0,213, 0, 0, 0, 34, 0, 0, 0, 77,
- 0, 0, 0,212, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0,213, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,127, 0, 0, 0, 34,
- 0, 0, 0, 70, 0, 0, 0,219, 0, 0, 0, 34, 0, 0, 0,128, 0, 0, 0,219, 0, 0, 0, 34, 0, 0, 0,129, 0, 0, 0,220,
- 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,220, 0, 0, 0, 34, 0, 0, 0,217, 0, 0, 0,219, 0, 0, 0, 34, 0, 0, 0,130,
- 0, 0, 0,217, 0, 0, 0, 34, 0, 0, 0,131, 0, 0, 0,218, 0, 0, 0, 34, 0, 0, 0,218, 0, 0, 0,220, 0, 0, 0, 34,
- 0, 0, 0,215, 0, 0, 0,217, 0, 0, 0, 34, 0, 0, 0,132, 0, 0, 0,215, 0, 0, 0, 34, 0, 0, 0,133, 0, 0, 0,216,
- 0, 0, 0, 34, 0, 0, 0,216, 0, 0, 0,218, 0, 0, 0, 34, 0, 0, 0,214, 0, 0, 0,215, 0, 0, 0, 34, 0, 0, 0,134,
- 0, 0, 0,214, 0, 0, 0, 34, 0, 0, 0,214, 0, 0, 0,216, 0, 0, 0, 34, 0, 0, 0,215, 0, 0, 0,226, 0, 0, 0, 34,
- 0, 0, 0,226, 0, 0, 0,228, 0, 0, 0, 34, 0, 0, 0,214, 0, 0, 0,228, 0, 0, 0, 34, 0, 0, 0,216, 0, 0, 0,227,
- 0, 0, 0, 34, 0, 0, 0,227, 0, 0, 0,228, 0, 0, 0, 34, 0, 0, 0,217, 0, 0, 0,224, 0, 0, 0, 34, 0, 0, 0,224,
- 0, 0, 0,226, 0, 0, 0, 34, 0, 0, 0,218, 0, 0, 0,225, 0, 0, 0, 34, 0, 0, 0,225, 0, 0, 0,227, 0, 0, 0, 34,
- 0, 0, 0,219, 0, 0, 0,222, 0, 0, 0, 34, 0, 0, 0,222, 0, 0, 0,224, 0, 0, 0, 34, 0, 0, 0,220, 0, 0, 0,223,
- 0, 0, 0, 34, 0, 0, 0,223, 0, 0, 0,225, 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,221, 0, 0, 0, 34, 0, 0, 0,221,
- 0, 0, 0,222, 0, 0, 0, 34, 0, 0, 0,221, 0, 0, 0,223, 0, 0, 0, 34, 0, 0, 0,221, 0, 0, 0,228, 0, 0, 0, 34,
- 0, 0, 0,222, 0, 0, 0,226, 0, 0, 0, 34, 0, 0, 0,223, 0, 0, 0,227, 0, 0, 0, 34, 0, 0, 0,178, 0, 0, 0,231,
- 0, 0, 0, 34, 0, 0, 0,229, 0, 0, 0,231, 0, 0, 0, 34, 0, 0, 0,180, 0, 0, 0,229, 0, 0, 0, 34, 0, 0, 0,179,
- 0, 0, 0,232, 0, 0, 0, 34, 0, 0, 0,181, 0, 0, 0,230, 0, 0, 0, 34, 0, 0, 0,230, 0, 0, 0,232, 0, 0, 0, 34,
- 0, 0, 0,229, 0, 0, 0,251, 0, 0, 0, 34, 0, 0, 0,110, 0, 0, 0,251, 0, 0, 0, 34, 0, 0, 0,111, 0, 0, 0,252,
- 0, 0, 0, 34, 0, 0, 0,230, 0, 0, 0,252, 0, 0, 0, 34, 0, 0, 0,251, 0, 0, 0,253, 0, 0, 0, 34, 0, 0, 0,108,
- 0, 0, 0,253, 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,254, 0, 0, 0, 34, 0, 0, 0,252, 0, 0, 0,254, 0, 0, 0, 34,
- 0, 0, 0,231, 0, 0, 0,249, 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,250, 0, 0, 0, 34, 0, 0, 0,232, 0, 0, 0,250,
- 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,247, 0, 0, 0, 34, 0, 0, 0,247, 0, 0, 0,249, 0, 0, 0, 34, 0, 0, 0,114,
- 0, 0, 0,248, 0, 0, 0, 34, 0, 0, 0,248, 0, 0, 0,250, 0, 0, 0, 34, 0, 0, 0,115, 0, 0, 0,245, 0, 0, 0, 34,
- 0, 0, 0,245, 0, 0, 0,247, 0, 0, 0, 34, 0, 0, 0,116, 0, 0, 0,246, 0, 0, 0, 34, 0, 0, 0,246, 0, 0, 0,248,
- 0, 0, 0, 34, 0, 0, 0,117, 0, 0, 0,243, 0, 0, 0, 34, 0, 0, 0,243, 0, 0, 0,245, 0, 0, 0, 34, 0, 0, 0,118,
- 0, 0, 0,244, 0, 0, 0, 34, 0, 0, 0,244, 0, 0, 0,246, 0, 0, 0, 34, 0, 0, 0,119, 0, 0, 0,241, 0, 0, 0, 34,
- 0, 0, 0,241, 0, 0, 0,243, 0, 0, 0, 34, 0, 0, 0,120, 0, 0, 0,242, 0, 0, 0, 34, 0, 0, 0,242, 0, 0, 0,244,
- 0, 0, 0, 34, 0, 0, 0,121, 0, 0, 0,239, 0, 0, 0, 34, 0, 0, 0,239, 0, 0, 0,241, 0, 0, 0, 34, 0, 0, 0,122,
- 0, 0, 0,240, 0, 0, 0, 34, 0, 0, 0,240, 0, 0, 0,242, 0, 0, 0, 34, 0, 0, 0,123, 0, 0, 0,237, 0, 0, 0, 34,
- 0, 0, 0,237, 0, 0, 0,239, 0, 0, 0, 34, 0, 0, 0,124, 0, 0, 0,238, 0, 0, 0, 34, 0, 0, 0,238, 0, 0, 0,240,
- 0, 0, 0, 34, 0, 0, 0,176, 0, 0, 0,233, 0, 0, 0, 34, 0, 0, 0,233, 0, 0, 0,237, 0, 0, 0, 34, 0, 0, 0,177,
- 0, 0, 0,234, 0, 0, 0, 34, 0, 0, 0,234, 0, 0, 0,238, 0, 0, 0, 34, 0, 0, 0,125, 0, 0, 0,235, 0, 0, 0, 34,
- 0, 0, 0,233, 0, 0, 0,235, 0, 0, 0, 34, 0, 0, 0,126, 0, 0, 0,236, 0, 0, 0, 34, 0, 0, 0,234, 0, 0, 0,236,
- 0, 0, 0, 34, 0, 0, 0,235, 0, 0, 0,253, 0, 0, 0, 34, 0, 0, 0,236, 0, 0, 0,254, 0, 0, 0, 34, 0, 0, 0,253,
- 0, 0, 0,255, 0, 0, 0, 34, 0, 0, 0,255, 0, 0, 1, 17, 0, 0, 0, 34, 0, 0, 0,235, 0, 0, 1, 17, 0, 0, 0, 34,
- 0, 0, 0,254, 0, 0, 1, 0, 0, 0, 0, 34, 0, 0, 0,236, 0, 0, 1, 18, 0, 0, 0, 34, 0, 0, 1, 0, 0, 0, 1, 18,
- 0, 0, 0, 34, 0, 0, 1, 17, 0, 0, 1, 19, 0, 0, 0, 34, 0, 0, 0,233, 0, 0, 1, 19, 0, 0, 0, 34, 0, 0, 0,234,
- 0, 0, 1, 20, 0, 0, 0, 34, 0, 0, 1, 18, 0, 0, 1, 20, 0, 0, 0, 34, 0, 0, 1, 15, 0, 0, 1, 19, 0, 0, 0, 34,
- 0, 0, 0,237, 0, 0, 1, 15, 0, 0, 0, 34, 0, 0, 0,238, 0, 0, 1, 16, 0, 0, 0, 34, 0, 0, 1, 16, 0, 0, 1, 20,
- 0, 0, 0, 34, 0, 0, 1, 13, 0, 0, 1, 15, 0, 0, 0, 34, 0, 0, 0,239, 0, 0, 1, 13, 0, 0, 0, 34, 0, 0, 0,240,
- 0, 0, 1, 14, 0, 0, 0, 34, 0, 0, 1, 14, 0, 0, 1, 16, 0, 0, 0, 34, 0, 0, 1, 11, 0, 0, 1, 13, 0, 0, 0, 34,
- 0, 0, 0,241, 0, 0, 1, 11, 0, 0, 0, 34, 0, 0, 0,242, 0, 0, 1, 12, 0, 0, 0, 34, 0, 0, 1, 12, 0, 0, 1, 14,
- 0, 0, 0, 34, 0, 0, 1, 9, 0, 0, 1, 11, 0, 0, 0, 34, 0, 0, 0,243, 0, 0, 1, 9, 0, 0, 0, 34, 0, 0, 0,244,
- 0, 0, 1, 10, 0, 0, 0, 34, 0, 0, 1, 10, 0, 0, 1, 12, 0, 0, 0, 34, 0, 0, 1, 7, 0, 0, 1, 9, 0, 0, 0, 34,
- 0, 0, 0,245, 0, 0, 1, 7, 0, 0, 0, 34, 0, 0, 0,246, 0, 0, 1, 8, 0, 0, 0, 34, 0, 0, 1, 8, 0, 0, 1, 10,
- 0, 0, 0, 34, 0, 0, 1, 5, 0, 0, 1, 7, 0, 0, 0, 34, 0, 0, 0,247, 0, 0, 1, 5, 0, 0, 0, 34, 0, 0, 0,248,
- 0, 0, 1, 6, 0, 0, 0, 34, 0, 0, 1, 6, 0, 0, 1, 8, 0, 0, 0, 34, 0, 0, 1, 3, 0, 0, 1, 5, 0, 0, 0, 34,
- 0, 0, 0,249, 0, 0, 1, 3, 0, 0, 0, 34, 0, 0, 0,250, 0, 0, 1, 4, 0, 0, 0, 34, 0, 0, 1, 4, 0, 0, 1, 6,
- 0, 0, 0, 34, 0, 0, 1, 3, 0, 0, 1, 21, 0, 0, 0, 34, 0, 0, 0,231, 0, 0, 1, 21, 0, 0, 0, 34, 0, 0, 0,232,
- 0, 0, 1, 22, 0, 0, 0, 34, 0, 0, 1, 4, 0, 0, 1, 22, 0, 0, 0, 34, 0, 0, 0,251, 0, 0, 1, 1, 0, 0, 0, 34,
- 0, 0, 0,255, 0, 0, 1, 1, 0, 0, 0, 34, 0, 0, 0,252, 0, 0, 1, 2, 0, 0, 0, 34, 0, 0, 1, 0, 0, 0, 1, 2,
- 0, 0, 0, 34, 0, 0, 0,229, 0, 0, 1, 23, 0, 0, 0, 34, 0, 0, 1, 1, 0, 0, 1, 23, 0, 0, 0, 34, 0, 0, 0,230,
- 0, 0, 1, 24, 0, 0, 0, 34, 0, 0, 1, 2, 0, 0, 1, 24, 0, 0, 0, 34, 0, 0, 1, 21, 0, 0, 1, 23, 0, 0, 0, 34,
- 0, 0, 1, 22, 0, 0, 1, 24, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 1, 25, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 1, 25,
- 0, 0, 0, 38, 0, 0, 0, 65, 0, 0, 0, 71, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 1, 26, 0, 0, 0, 34, 0, 0, 0, 71,
- 0, 0, 1, 26, 0, 0, 0, 38, 0, 0, 0,104, 0, 0, 1, 27, 0, 0, 0, 34, 0, 0, 1, 25, 0, 0, 1, 27, 0, 0, 0, 34,
- 0, 0, 0,105, 0, 0, 1, 28, 0, 0, 0, 34, 0, 0, 1, 26, 0, 0, 1, 28, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 1, 29,
- 0, 0, 0, 34, 0, 0, 1, 27, 0, 0, 1, 29, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 1, 30, 0, 0, 0, 34, 0, 0, 1, 28,
- 0, 0, 1, 30, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 1, 31, 0, 0, 0, 34, 0, 0, 1, 29, 0, 0, 1, 31, 0, 0, 0, 34,
- 0, 0, 0,101, 0, 0, 1, 32, 0, 0, 0, 34, 0, 0, 1, 30, 0, 0, 1, 32, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 1, 33,
- 0, 0, 0, 34, 0, 0, 1, 31, 0, 0, 1, 33, 0, 0, 0, 38, 0, 0, 0, 99, 0, 0, 1, 34, 0, 0, 0, 34, 0, 0, 1, 32,
- 0, 0, 1, 34, 0, 0, 0, 38, 0, 0, 0, 96, 0, 0, 1, 35, 0, 0, 0, 34, 0, 0, 1, 33, 0, 0, 1, 35, 0, 0, 0, 34,
- 0, 0, 0, 97, 0, 0, 1, 36, 0, 0, 0, 34, 0, 0, 1, 34, 0, 0, 1, 36, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 1, 37,
- 0, 0, 0, 34, 0, 0, 1, 35, 0, 0, 1, 37, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 1, 38, 0, 0, 0, 34, 0, 0, 1, 36,
- 0, 0, 1, 38, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 1, 39, 0, 0, 0, 34, 0, 0, 1, 37, 0, 0, 1, 39, 0, 0, 0, 34,
- 0, 0, 0, 93, 0, 0, 1, 40, 0, 0, 0, 34, 0, 0, 1, 38, 0, 0, 1, 40, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 1, 41,
- 0, 0, 0, 34, 0, 0, 1, 39, 0, 0, 1, 41, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 1, 42, 0, 0, 0, 34, 0, 0, 1, 40,
- 0, 0, 1, 42, 0, 0, 0, 34, 0, 0, 1, 49, 0, 0, 1, 50, 0, 0, 0, 38, 0, 0, 1, 50, 0, 0, 1, 69, 0, 0, 0, 34,
- 0, 0, 1, 69, 0, 0, 1, 79, 0, 0, 0, 34, 0, 0, 1, 49, 0, 0, 1, 79, 0, 0, 0, 34, 0, 0, 1, 50, 0, 0, 1, 70,
- 0, 0, 0, 34, 0, 0, 1, 49, 0, 0, 1, 80, 0, 0, 0, 34, 0, 0, 1, 70, 0, 0, 1, 80, 0, 0, 0, 34, 0, 0, 1, 48,
- 0, 0, 1, 49, 0, 0, 0, 38, 0, 0, 1, 77, 0, 0, 1, 79, 0, 0, 0, 34, 0, 0, 1, 48, 0, 0, 1, 77, 0, 0, 0, 34,
- 0, 0, 1, 48, 0, 0, 1, 78, 0, 0, 0, 34, 0, 0, 1, 78, 0, 0, 1, 80, 0, 0, 0, 34, 0, 0, 1, 47, 0, 0, 1, 48,
- 0, 0, 0, 38, 0, 0, 1, 77, 0, 0, 1, 81, 0, 0, 0, 34, 0, 0, 1, 47, 0, 0, 1, 81, 0, 0, 0, 34, 0, 0, 1, 47,
- 0, 0, 1, 82, 0, 0, 0, 34, 0, 0, 1, 78, 0, 0, 1, 82, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 1, 47, 0, 0, 0, 38,
- 0, 0, 0, 87, 0, 0, 1, 81, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 1, 82, 0, 0, 0, 34, 0, 0, 1, 75, 0, 0, 1, 81,
- 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 1, 75, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 1, 76, 0, 0, 0, 34, 0, 0, 1, 76,
- 0, 0, 1, 82, 0, 0, 0, 34, 0, 0, 1, 71, 0, 0, 1, 75, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 1, 71, 0, 0, 0, 34,
- 0, 0, 0, 84, 0, 0, 1, 72, 0, 0, 0, 34, 0, 0, 1, 72, 0, 0, 1, 76, 0, 0, 0, 34, 0, 0, 1, 71, 0, 0, 1, 73,
- 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 1, 73, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 1, 74, 0, 0, 0, 34, 0, 0, 1, 72,
- 0, 0, 1, 74, 0, 0, 0, 34, 0, 0, 1, 71, 0, 0, 1, 77, 0, 0, 0, 34, 0, 0, 1, 73, 0, 0, 1, 79, 0, 0, 0, 34,
- 0, 0, 1, 72, 0, 0, 1, 78, 0, 0, 0, 34, 0, 0, 1, 74, 0, 0, 1, 80, 0, 0, 0, 34, 0, 0, 1, 67, 0, 0, 1, 73,
- 0, 0, 0, 34, 0, 0, 1, 67, 0, 0, 1, 69, 0, 0, 0, 34, 0, 0, 1, 68, 0, 0, 1, 74, 0, 0, 0, 34, 0, 0, 1, 68,
- 0, 0, 1, 70, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 1, 67, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 1, 68, 0, 0, 0, 34,
- 0, 0, 0,206, 0, 0, 1, 83, 0, 0, 0, 34, 0, 0, 1, 83, 0, 0, 1, 85, 0, 0, 0, 34, 0, 0, 0,212, 0, 0, 1, 85,
- 0, 0, 0, 34, 0, 0, 1, 84, 0, 0, 1, 86, 0, 0, 0, 34, 0, 0, 0,207, 0, 0, 1, 84, 0, 0, 0, 34, 0, 0, 0,213,
- 0, 0, 1, 86, 0, 0, 0, 34, 0, 0, 1, 67, 0, 0, 1, 83, 0, 0, 0, 34, 0, 0, 1, 68, 0, 0, 1, 84, 0, 0, 0, 34,
- 0, 0, 1, 85, 0, 0, 1, 87, 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 1, 87, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 1, 88,
- 0, 0, 0, 34, 0, 0, 1, 86, 0, 0, 1, 88, 0, 0, 0, 34, 0, 0, 1, 41, 0, 0, 1, 87, 0, 0, 0, 34, 0, 0, 1, 42,
- 0, 0, 1, 88, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 1, 65, 0, 0, 0, 34, 0, 0, 1, 65, 0, 0, 1, 93, 0, 0, 0, 34,
- 0, 0, 1, 45, 0, 0, 1, 93, 0, 0, 0, 39, 0, 0, 0, 75, 0, 0, 1, 45, 0, 0, 0, 38, 0, 0, 1, 66, 0, 0, 1, 94,
- 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 1, 66, 0, 0, 0, 34, 0, 0, 1, 45, 0, 0, 1, 94, 0, 0, 0, 39, 0, 0, 1, 91,
- 0, 0, 1, 93, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 1, 91, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 1, 45, 0, 0, 0, 38,
- 0, 0, 1, 92, 0, 0, 1, 94, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 1, 92, 0, 0, 0, 34, 0, 0, 1, 89, 0, 0, 1, 91,
- 0, 0, 0, 34, 0, 0, 1, 46, 0, 0, 1, 89, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 1, 46, 0, 0, 0, 38, 0, 0, 1, 90,
- 0, 0, 1, 92, 0, 0, 0, 34, 0, 0, 1, 46, 0, 0, 1, 90, 0, 0, 0, 34, 0, 0, 1, 69, 0, 0, 1, 89, 0, 0, 0, 34,
- 0, 0, 1, 46, 0, 0, 1, 50, 0, 0, 0, 38, 0, 0, 1, 70, 0, 0, 1, 90, 0, 0, 0, 34, 0, 0, 1, 83, 0, 0, 1, 89,
- 0, 0, 0, 34, 0, 0, 1, 84, 0, 0, 1, 90, 0, 0, 0, 34, 0, 0, 1, 39, 0, 0, 1, 59, 0, 0, 0, 34, 0, 0, 1, 51,
- 0, 0, 1, 59, 0, 0, 0, 34, 0, 0, 1, 37, 0, 0, 1, 51, 0, 0, 0, 34, 0, 0, 1, 40, 0, 0, 1, 60, 0, 0, 0, 34,
- 0, 0, 1, 38, 0, 0, 1, 52, 0, 0, 0, 34, 0, 0, 1, 52, 0, 0, 1, 60, 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 1, 57,
- 0, 0, 0, 39, 0, 0, 1, 57, 0, 0, 1, 65, 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 0, 75, 0, 0, 0, 38, 0, 0, 1, 58,
- 0, 0, 1, 66, 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 1, 58, 0, 0, 0, 39, 0, 0, 1, 43, 0, 0, 1, 99, 0, 0, 0, 34,
- 0, 0, 1, 97, 0, 0, 1, 99, 0, 0, 0, 34, 0, 0, 1, 44, 0, 0, 1, 97, 0, 0, 0, 34, 0, 0, 1, 43, 0, 0, 1, 44,
- 0, 0, 0, 38, 0, 0, 1, 98, 0, 0, 1,100, 0, 0, 0, 34, 0, 0, 1, 43, 0, 0, 1,100, 0, 0, 0, 34, 0, 0, 1, 44,
- 0, 0, 1, 98, 0, 0, 0, 34, 0, 0, 1, 95, 0, 0, 1, 97, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 1, 95, 0, 0, 0, 34,
- 0, 0, 0, 73, 0, 0, 1, 44, 0, 0, 0, 38, 0, 0, 1, 96, 0, 0, 1, 98, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 1, 96,
- 0, 0, 0, 34, 0, 0, 1, 57, 0, 0, 1, 95, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 38, 0, 0, 1, 58,
- 0, 0, 1, 96, 0, 0, 0, 34, 0, 0, 1, 35, 0, 0, 1,103, 0, 0, 0, 34, 0, 0, 1,103, 0, 0, 1,105, 0, 0, 0, 34,
- 0, 0, 1, 33, 0, 0, 1,105, 0, 0, 0, 34, 0, 0, 1, 36, 0, 0, 1,104, 0, 0, 0, 34, 0, 0, 1, 34, 0, 0, 1,106,
- 0, 0, 0, 34, 0, 0, 1,104, 0, 0, 1,106, 0, 0, 0, 34, 0, 0, 1,103, 0, 0, 1,109, 0, 0, 0, 34, 0, 0, 1,107,
- 0, 0, 1,109, 0, 0, 0, 34, 0, 0, 1,105, 0, 0, 1,107, 0, 0, 0, 34, 0, 0, 1,104, 0, 0, 1,110, 0, 0, 0, 34,
- 0, 0, 1,106, 0, 0, 1,108, 0, 0, 0, 34, 0, 0, 1,108, 0, 0, 1,110, 0, 0, 0, 34, 0, 0, 1,109, 0, 0, 1,111,
- 0, 0, 0, 34, 0, 0, 1,111, 0, 0, 1,113, 0, 0, 0, 34, 0, 0, 1,107, 0, 0, 1,113, 0, 0, 0, 34, 0, 0, 1,110,
- 0, 0, 1,112, 0, 0, 0, 34, 0, 0, 1,108, 0, 0, 1,114, 0, 0, 0, 34, 0, 0, 1,112, 0, 0, 1,114, 0, 0, 0, 34,
- 0, 0, 1,111, 0, 0, 1,117, 0, 0, 0, 34, 0, 0, 1,115, 0, 0, 1,117, 0, 0, 0, 34, 0, 0, 1,113, 0, 0, 1,115,
- 0, 0, 0, 34, 0, 0, 1,112, 0, 0, 1,118, 0, 0, 0, 34, 0, 0, 1,114, 0, 0, 1,116, 0, 0, 0, 34, 0, 0, 1,116,
- 0, 0, 1,118, 0, 0, 0, 34, 0, 0, 1, 55, 0, 0, 1,119, 0, 0, 0, 39, 0, 0, 1,115, 0, 0, 1,119, 0, 0, 0, 34,
- 0, 0, 1, 55, 0, 0, 1,117, 0, 0, 0, 34, 0, 0, 1,116, 0, 0, 1,120, 0, 0, 0, 34, 0, 0, 1, 56, 0, 0, 1,120,
- 0, 0, 0, 39, 0, 0, 1, 56, 0, 0, 1,118, 0, 0, 0, 34, 0, 0, 1, 95, 0, 0, 1,115, 0, 0, 0, 34, 0, 0, 1, 57,
- 0, 0, 1,119, 0, 0, 0, 39, 0, 0, 1, 96, 0, 0, 1,116, 0, 0, 0, 34, 0, 0, 1, 58, 0, 0, 1,120, 0, 0, 0, 39,
- 0, 0, 1, 97, 0, 0, 1,113, 0, 0, 0, 34, 0, 0, 1, 98, 0, 0, 1,114, 0, 0, 0, 34, 0, 0, 1, 99, 0, 0, 1,107,
- 0, 0, 0, 34, 0, 0, 1,100, 0, 0, 1,108, 0, 0, 0, 34, 0, 0, 1, 99, 0, 0, 1,101, 0, 0, 0, 34, 0, 0, 1,101,
- 0, 0, 1,105, 0, 0, 0, 34, 0, 0, 1,102, 0, 0, 1,106, 0, 0, 0, 34, 0, 0, 1,100, 0, 0, 1,102, 0, 0, 0, 34,
- 0, 0, 1, 31, 0, 0, 1,101, 0, 0, 0, 34, 0, 0, 1, 32, 0, 0, 1,102, 0, 0, 0, 34, 0, 0, 0, 72, 0, 0, 1,101,
- 0, 0, 0, 34, 0, 0, 0, 72, 0, 0, 1, 43, 0, 0, 0, 38, 0, 0, 0, 72, 0, 0, 1,102, 0, 0, 0, 34, 0, 0, 1, 25,
- 0, 0, 1, 31, 0, 0, 0, 38, 0, 0, 1, 26, 0, 0, 1, 32, 0, 0, 0, 38, 0, 0, 0, 72, 0, 0, 1, 25, 0, 0, 0, 34,
- 0, 0, 0, 72, 0, 0, 1, 26, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 38, 0, 0, 1, 51, 0, 0, 1,103,
- 0, 0, 0, 34, 0, 0, 1, 52, 0, 0, 1,104, 0, 0, 0, 34, 0, 0, 1, 51, 0, 0, 1, 53, 0, 0, 0, 34, 0, 0, 1, 53,
- 0, 0, 1,109, 0, 0, 0, 34, 0, 0, 1, 54, 0, 0, 1,110, 0, 0, 0, 34, 0, 0, 1, 52, 0, 0, 1, 54, 0, 0, 0, 34,
- 0, 0, 1, 53, 0, 0, 1,123, 0, 0, 0, 34, 0, 0, 1,111, 0, 0, 1,123, 0, 0, 0, 34, 0, 0, 1,112, 0, 0, 1,124,
- 0, 0, 0, 34, 0, 0, 1, 54, 0, 0, 1,124, 0, 0, 0, 34, 0, 0, 1, 55, 0, 0, 1,123, 0, 0, 0, 34, 0, 0, 1, 56,
- 0, 0, 1,124, 0, 0, 0, 34, 0, 0, 1, 91, 0, 0, 1,127, 0, 0, 0, 34, 0, 0, 1,125, 0, 0, 1,127, 0, 0, 0, 34,
- 0, 0, 1, 89, 0, 0, 1,125, 0, 0, 0, 34, 0, 0, 1, 92, 0, 0, 1,128, 0, 0, 0, 34, 0, 0, 1, 90, 0, 0, 1,126,
- 0, 0, 0, 34, 0, 0, 1,126, 0, 0, 1,128, 0, 0, 0, 34, 0, 0, 1, 59, 0, 0, 1,125, 0, 0, 0, 34, 0, 0, 1, 61,
- 0, 0, 1,127, 0, 0, 0, 34, 0, 0, 1, 59, 0, 0, 1, 61, 0, 0, 0, 34, 0, 0, 1, 60, 0, 0, 1,126, 0, 0, 0, 34,
- 0, 0, 1, 60, 0, 0, 1, 62, 0, 0, 0, 34, 0, 0, 1, 62, 0, 0, 1,128, 0, 0, 0, 34, 0, 0, 1, 41, 0, 0, 1,125,
- 0, 0, 0, 34, 0, 0, 1, 42, 0, 0, 1,126, 0, 0, 0, 34, 0, 0, 1, 41, 0, 0, 1, 85, 0, 0, 0, 34, 0, 0, 1, 83,
- 0, 0, 1,125, 0, 0, 0, 34, 0, 0, 1, 42, 0, 0, 1, 86, 0, 0, 0, 34, 0, 0, 1, 84, 0, 0, 1,126, 0, 0, 0, 34,
- 0, 0, 1, 55, 0, 0, 1, 63, 0, 0, 0, 34, 0, 0, 1, 63, 0, 0, 1,121, 0, 0, 0, 39, 0, 0, 1,119, 0, 0, 1,121,
- 0, 0, 0, 34, 0, 0, 1, 64, 0, 0, 1,122, 0, 0, 0, 39, 0, 0, 1, 56, 0, 0, 1, 64, 0, 0, 0, 34, 0, 0, 1,120,
- 0, 0, 1,122, 0, 0, 0, 34, 0, 0, 1, 65, 0, 0, 1,121, 0, 0, 0, 34, 0, 0, 1, 66, 0, 0, 1,122, 0, 0, 0, 34,
- 0, 0, 1,121, 0, 0, 1,127, 0, 0, 0, 34, 0, 0, 1, 61, 0, 0, 1, 63, 0, 0, 0, 34, 0, 0, 1,122, 0, 0, 1,128,
- 0, 0, 0, 34, 0, 0, 1, 62, 0, 0, 1, 64, 0, 0, 0, 34, 0, 0, 1, 93, 0, 0, 1,121, 0, 0, 0, 39, 0, 0, 1, 94,
- 0, 0, 1,122, 0, 0, 0, 39, 0, 0, 1,129, 0, 0, 1,141, 0, 0, 0, 34, 0, 0, 1,129, 0, 0, 1,155, 0, 0, 0, 34,
- 0, 0, 1,143, 0, 0, 1,155, 0, 0, 0, 34, 0, 0, 1,141, 0, 0, 1,143, 0, 0, 0, 34, 0, 0, 1,130, 0, 0, 1,156,
- 0, 0, 0, 34, 0, 0, 1,130, 0, 0, 1,142, 0, 0, 0, 34, 0, 0, 1,142, 0, 0, 1,144, 0, 0, 0, 34, 0, 0, 1,144,
- 0, 0, 1,156, 0, 0, 0, 34, 0, 0, 1,143, 0, 0, 1,145, 0, 0, 0, 34, 0, 0, 1,139, 0, 0, 1,145, 0, 0, 0, 34,
- 0, 0, 1,139, 0, 0, 1,141, 0, 0, 0, 34, 0, 0, 1,144, 0, 0, 1,146, 0, 0, 0, 34, 0, 0, 1,140, 0, 0, 1,142,
- 0, 0, 0, 34, 0, 0, 1,140, 0, 0, 1,146, 0, 0, 0, 34, 0, 0, 1,145, 0, 0, 1,147, 0, 0, 0, 34, 0, 0, 1,137,
- 0, 0, 1,147, 0, 0, 0, 34, 0, 0, 1,137, 0, 0, 1,139, 0, 0, 0, 34, 0, 0, 1,146, 0, 0, 1,148, 0, 0, 0, 34,
- 0, 0, 1,138, 0, 0, 1,140, 0, 0, 0, 34, 0, 0, 1,138, 0, 0, 1,148, 0, 0, 0, 34, 0, 0, 1,147, 0, 0, 1,149,
- 0, 0, 0, 34, 0, 0, 1,135, 0, 0, 1,149, 0, 0, 0, 34, 0, 0, 1,135, 0, 0, 1,137, 0, 0, 0, 34, 0, 0, 1,148,
- 0, 0, 1,150, 0, 0, 0, 34, 0, 0, 1,136, 0, 0, 1,138, 0, 0, 0, 34, 0, 0, 1,136, 0, 0, 1,150, 0, 0, 0, 34,
- 0, 0, 1,149, 0, 0, 1,151, 0, 0, 0, 34, 0, 0, 1,133, 0, 0, 1,151, 0, 0, 0, 34, 0, 0, 1,133, 0, 0, 1,135,
- 0, 0, 0, 34, 0, 0, 1,150, 0, 0, 1,152, 0, 0, 0, 34, 0, 0, 1,134, 0, 0, 1,136, 0, 0, 0, 34, 0, 0, 1,134,
- 0, 0, 1,152, 0, 0, 0, 34, 0, 0, 1,151, 0, 0, 1,153, 0, 0, 0, 34, 0, 0, 1,131, 0, 0, 1,153, 0, 0, 0, 34,
- 0, 0, 1,131, 0, 0, 1,133, 0, 0, 0, 34, 0, 0, 1,152, 0, 0, 1,154, 0, 0, 0, 34, 0, 0, 1,132, 0, 0, 1,134,
- 0, 0, 0, 34, 0, 0, 1,132, 0, 0, 1,154, 0, 0, 0, 34, 0, 0, 1,151, 0, 0, 1,161, 0, 0, 0, 34, 0, 0, 1,159,
- 0, 0, 1,161, 0, 0, 0, 34, 0, 0, 1,153, 0, 0, 1,159, 0, 0, 0, 34, 0, 0, 1,160, 0, 0, 1,162, 0, 0, 0, 34,
- 0, 0, 1,152, 0, 0, 1,162, 0, 0, 0, 34, 0, 0, 1,154, 0, 0, 1,160, 0, 0, 0, 34, 0, 0, 1,149, 0, 0, 1,163,
- 0, 0, 0, 34, 0, 0, 1,161, 0, 0, 1,163, 0, 0, 0, 34, 0, 0, 1,162, 0, 0, 1,164, 0, 0, 0, 34, 0, 0, 1,150,
- 0, 0, 1,164, 0, 0, 0, 34, 0, 0, 1,147, 0, 0, 1,165, 0, 0, 0, 34, 0, 0, 1,163, 0, 0, 1,165, 0, 0, 0, 34,
- 0, 0, 1,164, 0, 0, 1,166, 0, 0, 0, 34, 0, 0, 1,148, 0, 0, 1,166, 0, 0, 0, 34, 0, 0, 1,145, 0, 0, 1,167,
- 0, 0, 0, 34, 0, 0, 1,165, 0, 0, 1,167, 0, 0, 0, 34, 0, 0, 1,166, 0, 0, 1,168, 0, 0, 0, 34, 0, 0, 1,146,
- 0, 0, 1,168, 0, 0, 0, 34, 0, 0, 1,143, 0, 0, 1,169, 0, 0, 0, 34, 0, 0, 1,167, 0, 0, 1,169, 0, 0, 0, 34,
- 0, 0, 1,168, 0, 0, 1,170, 0, 0, 0, 34, 0, 0, 1,144, 0, 0, 1,170, 0, 0, 0, 34, 0, 0, 1,155, 0, 0, 1,157,
- 0, 0, 0, 34, 0, 0, 1,157, 0, 0, 1,169, 0, 0, 0, 34, 0, 0, 1,156, 0, 0, 1,158, 0, 0, 0, 34, 0, 0, 1,158,
- 0, 0, 1,170, 0, 0, 0, 34, 0, 0, 1, 61, 0, 0, 1,185, 0, 0, 0, 34, 0, 0, 1,183, 0, 0, 1,185, 0, 0, 0, 34,
- 0, 0, 1, 59, 0, 0, 1,183, 0, 0, 0, 34, 0, 0, 1, 62, 0, 0, 1,186, 0, 0, 0, 34, 0, 0, 1, 60, 0, 0, 1,184,
- 0, 0, 0, 34, 0, 0, 1,184, 0, 0, 1,186, 0, 0, 0, 34, 0, 0, 1, 61, 0, 0, 1,131, 0, 0, 0, 34, 0, 0, 1,153,
- 0, 0, 1,185, 0, 0, 0, 34, 0, 0, 1, 62, 0, 0, 1,132, 0, 0, 0, 34, 0, 0, 1,154, 0, 0, 1,186, 0, 0, 0, 34,
- 0, 0, 1, 53, 0, 0, 1,183, 0, 0, 0, 34, 0, 0, 1, 54, 0, 0, 1,184, 0, 0, 0, 34, 0, 0, 1,123, 0, 0, 1,171,
- 0, 0, 0, 34, 0, 0, 1,155, 0, 0, 1,171, 0, 0, 0, 34, 0, 0, 1,123, 0, 0, 1,129, 0, 0, 0, 34, 0, 0, 1,156,
- 0, 0, 1,172, 0, 0, 0, 34, 0, 0, 1,124, 0, 0, 1,172, 0, 0, 0, 34, 0, 0, 1,124, 0, 0, 1,130, 0, 0, 0, 34,
- 0, 0, 1,159, 0, 0, 1,181, 0, 0, 0, 34, 0, 0, 1,181, 0, 0, 1,185, 0, 0, 0, 34, 0, 0, 1,160, 0, 0, 1,182,
- 0, 0, 0, 34, 0, 0, 1,182, 0, 0, 1,186, 0, 0, 0, 34, 0, 0, 1,179, 0, 0, 1,187, 0, 0, 0, 34, 0, 0, 1,185,
- 0, 0, 1,187, 0, 0, 0, 34, 0, 0, 1,179, 0, 0, 1,181, 0, 0, 0, 34, 0, 0, 1,186, 0, 0, 1,188, 0, 0, 0, 34,
- 0, 0, 1,180, 0, 0, 1,188, 0, 0, 0, 34, 0, 0, 1,180, 0, 0, 1,182, 0, 0, 0, 34, 0, 0, 1,175, 0, 0, 1,187,
- 0, 0, 0, 34, 0, 0, 1,177, 0, 0, 1,179, 0, 0, 0, 34, 0, 0, 1,175, 0, 0, 1,177, 0, 0, 0, 34, 0, 0, 1,176,
- 0, 0, 1,188, 0, 0, 0, 34, 0, 0, 1,176, 0, 0, 1,178, 0, 0, 0, 34, 0, 0, 1,178, 0, 0, 1,180, 0, 0, 0, 34,
- 0, 0, 1,173, 0, 0, 1,189, 0, 0, 0, 34, 0, 0, 1,187, 0, 0, 1,189, 0, 0, 0, 34, 0, 0, 1,173, 0, 0, 1,175,
- 0, 0, 0, 34, 0, 0, 1,188, 0, 0, 1,190, 0, 0, 0, 34, 0, 0, 1,174, 0, 0, 1,190, 0, 0, 0, 34, 0, 0, 1,174,
- 0, 0, 1,176, 0, 0, 0, 34, 0, 0, 1,171, 0, 0, 1,189, 0, 0, 0, 34, 0, 0, 1,173, 0, 0, 1,191, 0, 0, 0, 34,
- 0, 0, 1,171, 0, 0, 1,191, 0, 0, 0, 32, 0, 0, 1,172, 0, 0, 1,190, 0, 0, 0, 34, 0, 0, 1,172, 0, 0, 1,192,
- 0, 0, 0, 32, 0, 0, 1,174, 0, 0, 1,192, 0, 0, 0, 34, 0, 0, 1,157, 0, 0, 1,191, 0, 0, 0, 34, 0, 0, 1,158,
- 0, 0, 1,192, 0, 0, 0, 34, 0, 0, 1, 53, 0, 0, 1,189, 0, 0, 0, 34, 0, 0, 1, 54, 0, 0, 1,190, 0, 0, 0, 34,
- 0, 0, 1,183, 0, 0, 1,187, 0, 0, 0, 34, 0, 0, 1,184, 0, 0, 1,188, 0, 0, 0, 34, 0, 0, 1,191, 0, 0, 1,193,
- 0, 0, 0, 34, 0, 0, 1,193, 0, 0, 1,217, 0, 0, 0, 34, 0, 0, 1,157, 0, 0, 1,217, 0, 0, 0, 34, 0, 0, 1,192,
- 0, 0, 1,194, 0, 0, 0, 34, 0, 0, 1,158, 0, 0, 1,218, 0, 0, 0, 34, 0, 0, 1,194, 0, 0, 1,218, 0, 0, 0, 34,
- 0, 0, 1,173, 0, 0, 1,203, 0, 0, 0, 34, 0, 0, 1,193, 0, 0, 1,203, 0, 0, 0, 34, 0, 0, 1,174, 0, 0, 1,204,
- 0, 0, 0, 34, 0, 0, 1,194, 0, 0, 1,204, 0, 0, 0, 34, 0, 0, 1,175, 0, 0, 1,201, 0, 0, 0, 34, 0, 0, 1,201,
- 0, 0, 1,203, 0, 0, 0, 34, 0, 0, 1,176, 0, 0, 1,202, 0, 0, 0, 34, 0, 0, 1,202, 0, 0, 1,204, 0, 0, 0, 34,
- 0, 0, 1,177, 0, 0, 1,199, 0, 0, 0, 34, 0, 0, 1,199, 0, 0, 1,201, 0, 0, 0, 34, 0, 0, 1,178, 0, 0, 1,200,
- 0, 0, 0, 34, 0, 0, 1,200, 0, 0, 1,202, 0, 0, 0, 34, 0, 0, 1,179, 0, 0, 1,197, 0, 0, 0, 34, 0, 0, 1,197,
- 0, 0, 1,199, 0, 0, 0, 34, 0, 0, 1,180, 0, 0, 1,198, 0, 0, 0, 34, 0, 0, 1,198, 0, 0, 1,200, 0, 0, 0, 34,
- 0, 0, 1,181, 0, 0, 1,195, 0, 0, 0, 34, 0, 0, 1,195, 0, 0, 1,197, 0, 0, 0, 34, 0, 0, 1,182, 0, 0, 1,196,
- 0, 0, 0, 34, 0, 0, 1,196, 0, 0, 1,198, 0, 0, 0, 34, 0, 0, 1,159, 0, 0, 1,215, 0, 0, 0, 34, 0, 0, 1,195,
- 0, 0, 1,215, 0, 0, 0, 34, 0, 0, 1,160, 0, 0, 1,216, 0, 0, 0, 34, 0, 0, 1,196, 0, 0, 1,216, 0, 0, 0, 34,
- 0, 0, 1,205, 0, 0, 1,217, 0, 0, 0, 34, 0, 0, 1,169, 0, 0, 1,205, 0, 0, 0, 34, 0, 0, 1,170, 0, 0, 1,206,
- 0, 0, 0, 34, 0, 0, 1,206, 0, 0, 1,218, 0, 0, 0, 34, 0, 0, 1,205, 0, 0, 1,207, 0, 0, 0, 34, 0, 0, 1,167,
- 0, 0, 1,207, 0, 0, 0, 34, 0, 0, 1,168, 0, 0, 1,208, 0, 0, 0, 34, 0, 0, 1,206, 0, 0, 1,208, 0, 0, 0, 34,
- 0, 0, 1,207, 0, 0, 1,209, 0, 0, 0, 34, 0, 0, 1,165, 0, 0, 1,209, 0, 0, 0, 34, 0, 0, 1,166, 0, 0, 1,210,
- 0, 0, 0, 34, 0, 0, 1,208, 0, 0, 1,210, 0, 0, 0, 34, 0, 0, 1,209, 0, 0, 1,211, 0, 0, 0, 34, 0, 0, 1,163,
- 0, 0, 1,211, 0, 0, 0, 34, 0, 0, 1,164, 0, 0, 1,212, 0, 0, 0, 34, 0, 0, 1,210, 0, 0, 1,212, 0, 0, 0, 34,
- 0, 0, 1,211, 0, 0, 1,213, 0, 0, 0, 34, 0, 0, 1,161, 0, 0, 1,213, 0, 0, 0, 34, 0, 0, 1,162, 0, 0, 1,214,
- 0, 0, 0, 34, 0, 0, 1,212, 0, 0, 1,214, 0, 0, 0, 34, 0, 0, 1,213, 0, 0, 1,215, 0, 0, 0, 34, 0, 0, 1,214,
- 0, 0, 1,216, 0, 0, 0, 34, 0, 0, 1,197, 0, 0, 1,221, 0, 0, 0, 34, 0, 0, 1,219, 0, 0, 1,221, 0, 0, 0, 34,
- 0, 0, 1,199, 0, 0, 1,219, 0, 0, 0, 34, 0, 0, 1,198, 0, 0, 1,222, 0, 0, 0, 34, 0, 0, 1,200, 0, 0, 1,220,
- 0, 0, 0, 34, 0, 0, 1,220, 0, 0, 1,222, 0, 0, 0, 34, 0, 0, 1,221, 0, 0, 1,223, 0, 0, 0, 34, 0, 0, 1,223,
- 0, 0, 1,225, 0, 0, 0, 32, 0, 0, 1,219, 0, 0, 1,225, 0, 0, 0, 34, 0, 0, 1,222, 0, 0, 1,224, 0, 0, 0, 34,
- 0, 0, 1,220, 0, 0, 1,226, 0, 0, 0, 34, 0, 0, 1,224, 0, 0, 1,226, 0, 0, 0, 32, 0, 0, 1,223, 0, 0, 1,229,
- 0, 0, 0, 34, 0, 0, 1,227, 0, 0, 1,229, 0, 0, 0, 34, 0, 0, 1,225, 0, 0, 1,227, 0, 0, 0, 34, 0, 0, 1,224,
- 0, 0, 1,230, 0, 0, 0, 34, 0, 0, 1,226, 0, 0, 1,228, 0, 0, 0, 34, 0, 0, 1,228, 0, 0, 1,230, 0, 0, 0, 34,
- 0, 0, 1,229, 0, 0, 1,231, 0, 0, 0, 34, 0, 0, 1,231, 0, 0, 1,233, 0, 0, 0, 34, 0, 0, 1,227, 0, 0, 1,233,
- 0, 0, 0, 34, 0, 0, 1,230, 0, 0, 1,232, 0, 0, 0, 34, 0, 0, 1,228, 0, 0, 1,234, 0, 0, 0, 34, 0, 0, 1,232,
- 0, 0, 1,234, 0, 0, 0, 34, 0, 0, 1,217, 0, 0, 1,227, 0, 0, 0, 34, 0, 0, 1,205, 0, 0, 1,233, 0, 0, 0, 34,
- 0, 0, 1,218, 0, 0, 1,228, 0, 0, 0, 34, 0, 0, 1,206, 0, 0, 1,234, 0, 0, 0, 34, 0, 0, 1,193, 0, 0, 1,225,
- 0, 0, 0, 34, 0, 0, 1,194, 0, 0, 1,226, 0, 0, 0, 34, 0, 0, 1,203, 0, 0, 1,219, 0, 0, 0, 34, 0, 0, 1,204,
- 0, 0, 1,220, 0, 0, 0, 34, 0, 0, 1,215, 0, 0, 1,221, 0, 0, 0, 34, 0, 0, 1,216, 0, 0, 1,222, 0, 0, 0, 34,
- 0, 0, 1,213, 0, 0, 1,223, 0, 0, 0, 34, 0, 0, 1,214, 0, 0, 1,224, 0, 0, 0, 34, 0, 0, 1,211, 0, 0, 1,229,
- 0, 0, 0, 34, 0, 0, 1,212, 0, 0, 1,230, 0, 0, 0, 34, 0, 0, 1,209, 0, 0, 1,231, 0, 0, 0, 34, 0, 0, 1,210,
- 0, 0, 1,232, 0, 0, 0, 34, 0, 0, 1,207, 0, 0, 1,233, 0, 0, 0, 34, 0, 0, 1,208, 0, 0, 1,234, 0, 0, 0, 34,
- 0, 0, 1,131, 0, 0, 1,245, 0, 0, 0, 34, 0, 0, 1,243, 0, 0, 1,245, 0, 0, 0, 39, 0, 0, 1,133, 0, 0, 1,243,
- 0, 0, 0, 34, 0, 0, 1,132, 0, 0, 1,246, 0, 0, 0, 34, 0, 0, 1,134, 0, 0, 1,244, 0, 0, 0, 34, 0, 0, 1,244,
- 0, 0, 1,246, 0, 0, 0, 39, 0, 0, 1,241, 0, 0, 1,243, 0, 0, 0, 39, 0, 0, 1,135, 0, 0, 1,241, 0, 0, 0, 34,
- 0, 0, 1,136, 0, 0, 1,242, 0, 0, 0, 34, 0, 0, 1,242, 0, 0, 1,244, 0, 0, 0, 39, 0, 0, 1,239, 0, 0, 1,241,
- 0, 0, 0, 39, 0, 0, 1,137, 0, 0, 1,239, 0, 0, 0, 34, 0, 0, 1,138, 0, 0, 1,240, 0, 0, 0, 34, 0, 0, 1,240,
- 0, 0, 1,242, 0, 0, 0, 39, 0, 0, 1,237, 0, 0, 1,239, 0, 0, 0, 39, 0, 0, 1,139, 0, 0, 1,237, 0, 0, 0, 34,
- 0, 0, 1,140, 0, 0, 1,238, 0, 0, 0, 34, 0, 0, 1,238, 0, 0, 1,240, 0, 0, 0, 39, 0, 0, 1,235, 0, 0, 1,237,
- 0, 0, 0, 39, 0, 0, 1,141, 0, 0, 1,235, 0, 0, 0, 34, 0, 0, 1,142, 0, 0, 1,236, 0, 0, 0, 34, 0, 0, 1,236,
- 0, 0, 1,238, 0, 0, 0, 39, 0, 0, 1,235, 0, 0, 1,247, 0, 0, 0, 39, 0, 0, 1,129, 0, 0, 1,247, 0, 0, 0, 34,
- 0, 0, 1,130, 0, 0, 1,248, 0, 0, 0, 34, 0, 0, 1,236, 0, 0, 1,248, 0, 0, 0, 39, 0, 0, 1,235, 0, 0, 1,243,
- 0, 0, 0, 34, 0, 0, 1,245, 0, 0, 1,247, 0, 0, 0, 34, 0, 0, 1,236, 0, 0, 1,244, 0, 0, 0, 34, 0, 0, 1,246,
- 0, 0, 1,248, 0, 0, 0, 34, 0, 0, 1,237, 0, 0, 1,241, 0, 0, 0, 34, 0, 0, 1,238, 0, 0, 1,242, 0, 0, 0, 34,
- 0, 0, 1, 55, 0, 0, 1,247, 0, 0, 0, 39, 0, 0, 1, 56, 0, 0, 1,248, 0, 0, 0, 39, 0, 0, 1, 63, 0, 0, 1,245,
- 0, 0, 0, 39, 0, 0, 1, 64, 0, 0, 1,246, 0, 0, 0, 39, 0, 0, 0, 14, 0, 0, 0,249, 0, 0, 0, 34, 0, 0, 0, 14,
- 0, 0, 0,178, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0,113, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0,161, 0, 0, 0, 34,
- 0, 0, 0, 20, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0,112,
- 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0,112, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,207, 64, 0, 0, 0,242,
- 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, 5, 31,184, 32, 0, 0, 0, 5, 0, 0, 0, 20,
- 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 84,101,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, 8,102,176, 32, 0, 0, 0, 6, 0, 0, 0, 64, 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, 5, 31,232, 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, 68, 65, 84, 65, 0, 0, 39, 16, 5, 31,184, 32, 0, 0, 0, 52, 0, 0, 1,244, 0, 0, 0, 45,
- 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 43, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 46, 0, 0, 0, 44,
- 0, 0, 0, 1, 0, 0, 0, 43, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 41, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 3,
- 0, 0, 0, 44, 0, 0, 0, 42, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 1,
- 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 8,
- 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 9, 0, 0, 0, 11, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 10,
- 0, 0, 0, 12, 0, 0, 0, 14, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0,112, 0, 0, 0, 13, 0, 0, 0, 11, 0, 0, 0, 9,
- 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 6, 0, 0, 0, 1, 0, 0, 0, 16, 0, 0, 0,112,
- 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0, 19, 0, 0, 0, 17, 0, 0, 0, 15, 0, 0, 0, 1,
- 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0,112, 0, 0, 0, 16, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 21, 0, 0, 0, 19,
- 0, 0, 0, 14, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0, 22, 0, 0, 0, 13, 0, 0, 0,112, 0, 0, 0, 1, 0, 0, 0, 21,
- 0, 0, 0, 23, 0, 0, 0, 25, 0, 0, 0, 19, 0, 0, 0, 1, 0, 0, 0, 26, 0, 0, 0, 24, 0, 0, 0, 22, 0, 0, 0, 20,
- 0, 0, 0, 1, 0, 0, 0, 19, 0, 0, 0, 25, 0, 0, 0, 27, 0, 0, 0, 17, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 26,
- 0, 0, 0, 20, 0, 0, 0, 18, 0, 0, 0, 1, 0, 0, 0, 25, 0, 0, 0, 31, 0, 0, 0, 29, 0, 0, 0, 27, 0, 0, 0, 1,
- 0, 0, 0, 30, 0, 0, 0, 32, 0, 0, 0, 26, 0, 0, 0, 28, 0, 0, 0, 1, 0, 0, 0, 23, 0, 0, 0, 33, 0, 0, 0, 31,
- 0, 0, 0, 25, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 26, 0, 0, 0, 1, 0, 0, 0, 33,
- 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 0, 31, 0, 0, 0, 1, 0, 0, 0, 38, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 32,
- 0, 0, 0, 1, 0, 0, 0, 31, 0, 0, 0, 37, 0, 0, 0, 39, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 40, 0, 0, 0, 38,
- 0, 0, 0, 32, 0, 0, 0, 30, 0, 0, 0, 1, 0, 0, 0, 37, 0, 0, 0, 43, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 1,
- 0, 0, 0, 42, 0, 0, 0, 44, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 0, 43,
- 0, 0, 0, 37, 0, 0, 0, 1, 0, 0, 0, 44, 0, 0, 0, 46, 0, 0, 0, 36, 0, 0, 0, 38, 0, 0, 0, 1, 0, 0, 0, 45,
- 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 0, 47, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 0, 36, 0, 0, 0, 46, 0, 0, 0, 48,
- 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 0, 51, 0, 0, 0, 49, 0, 0, 0, 1, 0, 0, 0, 52, 0, 0, 0, 34,
- 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0, 33, 0, 0, 0, 23, 0, 0, 0, 53, 0, 0, 0, 51, 0, 0, 0, 1,
- 0, 0, 0, 54, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0, 23, 0, 0, 0, 21, 0, 0, 0, 55,
- 0, 0, 0, 53, 0, 0, 0, 1, 0, 0, 0, 56, 0, 0, 0, 22, 0, 0, 0, 24, 0, 0, 0, 54, 0, 0, 0, 1, 0, 0, 0, 21,
- 0, 0, 0, 12, 0, 0, 0, 57, 0, 0, 0, 55, 0, 0, 0, 1, 0, 0, 0, 58, 0, 0, 0, 13, 0, 0, 0, 22, 0, 0, 0, 56,
- 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 10, 0, 0, 0, 61, 0, 0, 0, 57, 0, 0, 0, 1, 0, 0, 0, 62, 0, 0, 0, 11,
- 0, 0, 0, 13, 0, 0, 0, 58, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 61, 0, 0, 0, 1,
- 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 62, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 47,
- 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 48, 0, 0, 0, 46, 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 1, 0, 0, 0, 59,
- 0, 0, 0, 63, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 48, 0, 0, 0, 64, 0, 0, 0, 60, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 61, 0, 0, 0, 63, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 60, 0, 0, 0, 64,
- 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 62, 0, 0, 0, 58, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 57,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 58, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59,
- 0, 0, 0, 53, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 56, 0, 0, 0, 54, 0, 0, 0, 60, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 51, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 54, 0, 0, 0, 52,
- 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 49, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 52, 0, 0, 0, 50, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 59, 0, 0, 0, 47, 0, 0, 0, 49,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 50, 0, 0, 0, 48, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 87,
- 0, 0, 0,171, 0, 0, 0,173, 0, 0, 0, 89, 0, 0, 0, 1, 0, 0, 0,173, 0, 0, 0,172, 0, 0, 0, 88, 0, 0, 0, 89,
- 0, 0, 0, 1, 0, 0, 0, 85, 0, 0, 0,169, 0, 0, 0,171, 0, 0, 0, 87, 0, 0, 0, 1, 0, 0, 0,172, 0, 0, 0,170,
- 0, 0, 0, 86, 0, 0, 0, 88, 0, 0, 0, 1, 0, 0, 0, 83, 0, 0, 0,167, 0, 0, 0,169, 0, 0, 0, 85, 0, 0, 0, 1,
- 0, 0, 0,170, 0, 0, 0,168, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0, 1, 0, 0, 0, 81, 0, 0, 0,165, 0, 0, 0,167,
- 0, 0, 0, 83, 0, 0, 0, 1, 0, 0, 0,168, 0, 0, 0,166, 0, 0, 0, 82, 0, 0, 0, 84, 0, 0, 0, 1, 0, 0, 0, 79,
- 0, 0, 0,163, 0, 0, 0,165, 0, 0, 0, 81, 0, 0, 0, 1, 0, 0, 0,166, 0, 0, 0,164, 0, 0, 0, 80, 0, 0, 0, 82,
- 0, 0, 0, 1, 0, 0, 0, 77, 0, 0, 0, 90, 0, 0, 0,143, 0, 0, 0,161, 0, 0, 0, 1, 0, 0, 0,144, 0, 0, 0, 91,
- 0, 0, 0, 78, 0, 0, 0,162, 0, 0, 0, 1, 0, 0, 0, 90, 0, 0, 0, 92, 0, 0, 0,145, 0, 0, 0,143, 0, 0, 0, 1,
- 0, 0, 0,146, 0, 0, 0, 93, 0, 0, 0, 91, 0, 0, 0,144, 0, 0, 0, 1, 0, 0, 0, 92, 0, 0, 0, 94, 0, 0, 0,147,
- 0, 0, 0,145, 0, 0, 0, 1, 0, 0, 0,148, 0, 0, 0, 95, 0, 0, 0, 93, 0, 0, 0,146, 0, 0, 0, 1, 0, 0, 0, 94,
- 0, 0, 0, 96, 0, 0, 0,149, 0, 0, 0,147, 0, 0, 0, 1, 0, 0, 0,150, 0, 0, 0, 97, 0, 0, 0, 95, 0, 0, 0,148,
- 0, 0, 0, 1, 0, 0, 0, 96, 0, 0, 0, 98, 0, 0, 0,151, 0, 0, 0,149, 0, 0, 0, 1, 0, 0, 0,152, 0, 0, 0, 99,
- 0, 0, 0, 97, 0, 0, 0,150, 0, 0, 0, 1, 0, 0, 0, 98, 0, 0, 0,100, 0, 0, 0,153, 0, 0, 0,151, 0, 0, 0, 1,
- 0, 0, 0,154, 0, 0, 0,101, 0, 0, 0, 99, 0, 0, 0,152, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0,102, 0, 0, 0,155,
- 0, 0, 0,153, 0, 0, 0, 1, 0, 0, 0,156, 0, 0, 0,103, 0, 0, 0,101, 0, 0, 0,154, 0, 0, 0, 1, 0, 0, 0,102,
- 0, 0, 0,104, 0, 0, 0,157, 0, 0, 0,155, 0, 0, 0, 1, 0, 0, 0,158, 0, 0, 0,105, 0, 0, 0,103, 0, 0, 0,156,
- 0, 0, 0, 1, 0, 0, 0,104, 0, 0, 0,106, 0, 0, 0,159, 0, 0, 0,157, 0, 0, 0, 1, 0, 0, 0,160, 0, 0, 0,107,
- 0, 0, 0,105, 0, 0, 0,158, 0, 0, 0, 1, 0, 0, 0,106, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0,159, 0, 0, 0, 1,
- 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0,107, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,108, 0, 0, 0,125, 0, 0, 0,157,
- 0, 0, 0,159, 0, 0, 0, 1, 0, 0, 0,158, 0, 0, 0,126, 0, 0, 0,109, 0, 0, 0,160, 0, 0, 0, 1, 0, 0, 0,125,
- 0, 0, 0,176, 0, 0, 0,155, 0, 0, 0,157, 0, 0, 0, 1, 0, 0, 0,156, 0, 0, 0,177, 0, 0, 0,126, 0, 0, 0,158,
- 0, 0, 0, 1, 0, 0, 0,123, 0, 0, 0,153, 0, 0, 0,155, 0, 0, 0,176, 0, 0, 0, 1, 0, 0, 0,156, 0, 0, 0,154,
- 0, 0, 0,124, 0, 0, 0,177, 0, 0, 0, 1, 0, 0, 0,121, 0, 0, 0,151, 0, 0, 0,153, 0, 0, 0,123, 0, 0, 0, 1,
- 0, 0, 0,154, 0, 0, 0,152, 0, 0, 0,122, 0, 0, 0,124, 0, 0, 0, 1, 0, 0, 0,119, 0, 0, 0,149, 0, 0, 0,151,
- 0, 0, 0,121, 0, 0, 0, 1, 0, 0, 0,152, 0, 0, 0,150, 0, 0, 0,120, 0, 0, 0,122, 0, 0, 0, 1, 0, 0, 0,117,
- 0, 0, 0,147, 0, 0, 0,149, 0, 0, 0,119, 0, 0, 0, 1, 0, 0, 0,150, 0, 0, 0,148, 0, 0, 0,118, 0, 0, 0,120,
- 0, 0, 0, 1, 0, 0, 0,115, 0, 0, 0,145, 0, 0, 0,147, 0, 0, 0,117, 0, 0, 0, 1, 0, 0, 0,148, 0, 0, 0,146,
- 0, 0, 0,116, 0, 0, 0,118, 0, 0, 0, 1, 0, 0, 0,113, 0, 0, 0,143, 0, 0, 0,145, 0, 0, 0,115, 0, 0, 0, 1,
- 0, 0, 0,146, 0, 0, 0,144, 0, 0, 0,114, 0, 0, 0,116, 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0,161, 0, 0, 0,143,
- 0, 0, 0,113, 0, 0, 0, 1, 0, 0, 0,144, 0, 0, 0,162, 0, 0, 0,112, 0, 0, 0,114, 0, 0, 0, 1, 0, 0, 0, 14,
- 0, 0, 0,178, 0, 0, 0,174, 0, 0, 0,161, 0, 0, 0, 1, 0, 0, 0,174, 0, 0, 0,179, 0, 0, 0,112, 0, 0, 0,162,
- 0, 0, 0, 1, 0, 0, 0,108, 0, 0, 0,159, 0, 0, 0, 66, 0, 0, 0,110, 0, 0, 0, 1, 0, 0, 0, 66, 0, 0, 0,160,
- 0, 0, 0,109, 0, 0, 0,111, 0, 0, 0, 1, 0, 0, 0,110, 0, 0, 0, 66, 0, 0, 0,175, 0, 0, 0,180, 0, 0, 0, 1,
- 0, 0, 0,175, 0, 0, 0, 66, 0, 0, 0,111, 0, 0, 0,181, 0, 0, 0, 1, 0, 0, 0,174, 0, 0, 0,178, 0, 0, 0,180,
- 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0,181, 0, 0, 0,179, 0, 0, 0,174, 0, 0, 0,175, 0, 0, 0, 1, 0, 0, 0,132,
- 0, 0, 0,134, 0, 0, 0,173, 0, 0, 0,171, 0, 0, 0, 1, 0, 0, 0,173, 0, 0, 0,134, 0, 0, 0,133, 0, 0, 0,172,
- 0, 0, 0, 1, 0, 0, 0,130, 0, 0, 0,132, 0, 0, 0,171, 0, 0, 0,169, 0, 0, 0, 1, 0, 0, 0,172, 0, 0, 0,133,
- 0, 0, 0,131, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0,128, 0, 0, 0,130, 0, 0, 0,169, 0, 0, 0,167, 0, 0, 0, 1,
- 0, 0, 0,170, 0, 0, 0,131, 0, 0, 0,129, 0, 0, 0,168, 0, 0, 0, 1, 0, 0, 0,163, 0, 0, 0,184, 0, 0, 0,182,
- 0, 0, 0,165, 0, 0, 0, 1, 0, 0, 0,183, 0, 0, 0,185, 0, 0, 0,164, 0, 0, 0,166, 0, 0, 0, 1, 0, 0, 0,128,
- 0, 0, 0,167, 0, 0, 0,165, 0, 0, 0,182, 0, 0, 0, 1, 0, 0, 0,166, 0, 0, 0,168, 0, 0, 0,129, 0, 0, 0,183,
- 0, 0, 0, 1, 0, 0, 0,141, 0, 0, 0,187, 0, 0, 0,186, 0, 0, 0,184, 0, 0, 0, 1, 0, 0, 0,186, 0, 0, 0,187,
- 0, 0, 0,142, 0, 0, 0,185, 0, 0, 0, 1, 0, 0, 0,182, 0, 0, 0,184, 0, 0, 0,186, 0, 0, 0, 67, 0, 0, 0, 1,
- 0, 0, 0,186, 0, 0, 0,185, 0, 0, 0,183, 0, 0, 0, 67, 0, 0, 0, 1, 0, 0, 0,127, 0, 0, 0,128, 0, 0, 0,182,
- 0, 0, 0, 67, 0, 0, 0, 1, 0, 0, 0,183, 0, 0, 0,129, 0, 0, 0,127, 0, 0, 0, 67, 0, 0, 0, 1, 0, 0, 0,139,
- 0, 0, 0,190, 0, 0, 0,188, 0, 0, 0,141, 0, 0, 0, 1, 0, 0, 0,189, 0, 0, 0,191, 0, 0, 0,140, 0, 0, 0,142,
- 0, 0, 0, 1, 0, 0, 0,137, 0, 0, 0,192, 0, 0, 0,190, 0, 0, 0,139, 0, 0, 0, 1, 0, 0, 0,191, 0, 0, 0,193,
- 0, 0, 0,138, 0, 0, 0,140, 0, 0, 0, 1, 0, 0, 0,136, 0, 0, 0,194, 0, 0, 0,192, 0, 0, 0,137, 0, 0, 0, 1,
- 0, 0, 0,193, 0, 0, 0,195, 0, 0, 0,136, 0, 0, 0,138, 0, 0, 0, 1, 0, 0, 0,135, 0, 0, 0, 69, 0, 0, 0,194,
- 0, 0, 0,136, 0, 0, 0, 1, 0, 0, 0,195, 0, 0, 0, 69, 0, 0, 0,135, 0, 0, 0,136, 0, 0, 0, 1, 0, 0, 0,187,
- 0, 0, 0,141, 0, 0, 0,188, 0, 0, 0, 68, 0, 0, 0, 1, 0, 0, 0,189, 0, 0, 0,142, 0, 0, 0,187, 0, 0, 0, 68,
- 0, 0, 0, 1, 0, 0, 0, 68, 0, 0, 0,188, 0, 0, 0,203, 0, 0, 0,205, 0, 0, 0, 1, 0, 0, 0,204, 0, 0, 0,189,
- 0, 0, 0, 68, 0, 0, 0,205, 0, 0, 0, 1, 0, 0, 0, 69, 0, 0, 0,196, 0, 0, 0,197, 0, 0, 0,194, 0, 0, 0, 1,
- 0, 0, 0,198, 0, 0, 0,196, 0, 0, 0, 69, 0, 0, 0,195, 0, 0, 0, 1, 0, 0, 0,194, 0, 0, 0,197, 0, 0, 0,199,
- 0, 0, 0,192, 0, 0, 0, 1, 0, 0, 0,200, 0, 0, 0,198, 0, 0, 0,195, 0, 0, 0,193, 0, 0, 0, 1, 0, 0, 0,192,
- 0, 0, 0,199, 0, 0, 0,201, 0, 0, 0,190, 0, 0, 0, 1, 0, 0, 0,202, 0, 0, 0,200, 0, 0, 0,193, 0, 0, 0,191,
- 0, 0, 0, 1, 0, 0, 0,190, 0, 0, 0,201, 0, 0, 0,203, 0, 0, 0,188, 0, 0, 0, 1, 0, 0, 0,204, 0, 0, 0,202,
- 0, 0, 0,191, 0, 0, 0,189, 0, 0, 0, 1, 0, 0, 0,196, 0, 0, 0,201, 0, 0, 0,199, 0, 0, 0,197, 0, 0, 0, 1,
- 0, 0, 0,200, 0, 0, 0,202, 0, 0, 0,196, 0, 0, 0,198, 0, 0, 0, 1, 0, 0, 0,196, 0, 0, 0,205, 0, 0, 0,203,
- 0, 0, 0,201, 0, 0, 0, 1, 0, 0, 0,204, 0, 0, 0,205, 0, 0, 0,196, 0, 0, 0,202, 0, 0, 0, 1, 0, 0, 0,136,
- 0, 0, 0,137, 0, 0, 0,161, 0, 0, 0,174, 0, 0, 0, 1, 0, 0, 0,162, 0, 0, 0,138, 0, 0, 0,136, 0, 0, 0,174,
- 0, 0, 0, 1, 0, 0, 0,137, 0, 0, 0,139, 0, 0, 0,208, 0, 0, 0,161, 0, 0, 0, 1, 0, 0, 0,209, 0, 0, 0,140,
- 0, 0, 0,138, 0, 0, 0,162, 0, 0, 0, 1, 0, 0, 0,139, 0, 0, 0,141, 0, 0, 0,210, 0, 0, 0,208, 0, 0, 0, 1,
- 0, 0, 0,211, 0, 0, 0,142, 0, 0, 0,140, 0, 0, 0,209, 0, 0, 0, 1, 0, 0, 0,141, 0, 0, 0,184, 0, 0, 0,163,
- 0, 0, 0,210, 0, 0, 0, 1, 0, 0, 0,164, 0, 0, 0,185, 0, 0, 0,142, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, 79,
- 0, 0, 0,206, 0, 0, 0,210, 0, 0, 0,163, 0, 0, 0, 1, 0, 0, 0,211, 0, 0, 0,207, 0, 0, 0, 80, 0, 0, 0,164,
- 0, 0, 0, 1, 0, 0, 0,206, 0, 0, 0,212, 0, 0, 0,208, 0, 0, 0,210, 0, 0, 0, 1, 0, 0, 0,209, 0, 0, 0,213,
- 0, 0, 0,207, 0, 0, 0,211, 0, 0, 0, 1, 0, 0, 0, 77, 0, 0, 0,161, 0, 0, 0,208, 0, 0, 0,212, 0, 0, 0, 1,
- 0, 0, 0,209, 0, 0, 0,162, 0, 0, 0, 78, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0,128, 0, 0, 0,127, 0, 0, 0, 70,
- 0, 0, 0,219, 0, 0, 0, 1, 0, 0, 0, 70, 0, 0, 0,127, 0, 0, 0,129, 0, 0, 0,220, 0, 0, 0, 1, 0, 0, 0,130,
- 0, 0, 0,128, 0, 0, 0,219, 0, 0, 0,217, 0, 0, 0, 1, 0, 0, 0,220, 0, 0, 0,129, 0, 0, 0,131, 0, 0, 0,218,
- 0, 0, 0, 1, 0, 0, 0,132, 0, 0, 0,130, 0, 0, 0,217, 0, 0, 0,215, 0, 0, 0, 1, 0, 0, 0,218, 0, 0, 0,131,
- 0, 0, 0,133, 0, 0, 0,216, 0, 0, 0, 1, 0, 0, 0,134, 0, 0, 0,132, 0, 0, 0,215, 0, 0, 0,214, 0, 0, 0, 1,
- 0, 0, 0,216, 0, 0, 0,133, 0, 0, 0,134, 0, 0, 0,214, 0, 0, 0, 1, 0, 0, 0,214, 0, 0, 0,215, 0, 0, 0,226,
- 0, 0, 0,228, 0, 0, 0, 1, 0, 0, 0,227, 0, 0, 0,216, 0, 0, 0,214, 0, 0, 0,228, 0, 0, 0, 1, 0, 0, 0,215,
- 0, 0, 0,217, 0, 0, 0,224, 0, 0, 0,226, 0, 0, 0, 1, 0, 0, 0,225, 0, 0, 0,218, 0, 0, 0,216, 0, 0, 0,227,
- 0, 0, 0, 1, 0, 0, 0,217, 0, 0, 0,219, 0, 0, 0,222, 0, 0, 0,224, 0, 0, 0, 1, 0, 0, 0,223, 0, 0, 0,220,
- 0, 0, 0,218, 0, 0, 0,225, 0, 0, 0, 1, 0, 0, 0,219, 0, 0, 0, 70, 0, 0, 0,221, 0, 0, 0,222, 0, 0, 0, 1,
- 0, 0, 0,221, 0, 0, 0, 70, 0, 0, 0,220, 0, 0, 0,223, 0, 0, 0, 1, 0, 0, 0,221, 0, 0, 0,228, 0, 0, 0,226,
- 0, 0, 0,222, 0, 0, 0, 1, 0, 0, 0,227, 0, 0, 0,228, 0, 0, 0,221, 0, 0, 0,223, 0, 0, 0, 1, 0, 0, 0,222,
- 0, 0, 0,226, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,225, 0, 0, 0,227, 0, 0, 0,223, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0,180, 0, 0, 0,178, 0, 0, 0,231, 0, 0, 0,229, 0, 0, 0, 1, 0, 0, 0,232, 0, 0, 0,179,
- 0, 0, 0,181, 0, 0, 0,230, 0, 0, 0, 1, 0, 0, 0,110, 0, 0, 0,180, 0, 0, 0,229, 0, 0, 0,251, 0, 0, 0, 1,
- 0, 0, 0,230, 0, 0, 0,181, 0, 0, 0,111, 0, 0, 0,252, 0, 0, 0, 1, 0, 0, 0,108, 0, 0, 0,110, 0, 0, 0,251,
- 0, 0, 0,253, 0, 0, 0, 1, 0, 0, 0,252, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,254, 0, 0, 0, 1, 0, 0, 0,178,
- 0, 0, 0, 14, 0, 0, 0,249, 0, 0, 0,231, 0, 0, 0, 1, 0, 0, 0,250, 0, 0, 0,112, 0, 0, 0,179, 0, 0, 0,232,
- 0, 0, 0, 1, 0, 0, 0, 14, 0, 0, 0,113, 0, 0, 0,247, 0, 0, 0,249, 0, 0, 0, 1, 0, 0, 0,248, 0, 0, 0,114,
- 0, 0, 0,112, 0, 0, 0,250, 0, 0, 0, 1, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0,245, 0, 0, 0,247, 0, 0, 0, 1,
- 0, 0, 0,246, 0, 0, 0,116, 0, 0, 0,114, 0, 0, 0,248, 0, 0, 0, 1, 0, 0, 0,115, 0, 0, 0,117, 0, 0, 0,243,
- 0, 0, 0,245, 0, 0, 0, 1, 0, 0, 0,244, 0, 0, 0,118, 0, 0, 0,116, 0, 0, 0,246, 0, 0, 0, 1, 0, 0, 0,117,
- 0, 0, 0,119, 0, 0, 0,241, 0, 0, 0,243, 0, 0, 0, 1, 0, 0, 0,242, 0, 0, 0,120, 0, 0, 0,118, 0, 0, 0,244,
- 0, 0, 0, 1, 0, 0, 0,119, 0, 0, 0,121, 0, 0, 0,239, 0, 0, 0,241, 0, 0, 0, 1, 0, 0, 0,240, 0, 0, 0,122,
- 0, 0, 0,120, 0, 0, 0,242, 0, 0, 0, 1, 0, 0, 0,121, 0, 0, 0,123, 0, 0, 0,237, 0, 0, 0,239, 0, 0, 0, 1,
- 0, 0, 0,238, 0, 0, 0,124, 0, 0, 0,122, 0, 0, 0,240, 0, 0, 0, 1, 0, 0, 0,123, 0, 0, 0,176, 0, 0, 0,233,
- 0, 0, 0,237, 0, 0, 0, 1, 0, 0, 0,234, 0, 0, 0,177, 0, 0, 0,124, 0, 0, 0,238, 0, 0, 0, 1, 0, 0, 0,176,
- 0, 0, 0,125, 0, 0, 0,235, 0, 0, 0,233, 0, 0, 0, 1, 0, 0, 0,236, 0, 0, 0,126, 0, 0, 0,177, 0, 0, 0,234,
- 0, 0, 0, 1, 0, 0, 0,125, 0, 0, 0,108, 0, 0, 0,253, 0, 0, 0,235, 0, 0, 0, 1, 0, 0, 0,254, 0, 0, 0,109,
- 0, 0, 0,126, 0, 0, 0,236, 0, 0, 0, 1, 0, 0, 0,235, 0, 0, 0,253, 0, 0, 0,255, 0, 0, 1, 17, 0, 0, 0, 1,
- 0, 0, 1, 0, 0, 0, 0,254, 0, 0, 0,236, 0, 0, 1, 18, 0, 0, 0, 1, 0, 0, 0,233, 0, 0, 0,235, 0, 0, 1, 17,
- 0, 0, 1, 19, 0, 0, 0, 1, 0, 0, 1, 18, 0, 0, 0,236, 0, 0, 0,234, 0, 0, 1, 20, 0, 0, 0, 1, 0, 0, 0,237,
- 0, 0, 0,233, 0, 0, 1, 19, 0, 0, 1, 15, 0, 0, 0, 1, 0, 0, 1, 20, 0, 0, 0,234, 0, 0, 0,238, 0, 0, 1, 16,
- 0, 0, 0, 1, 0, 0, 0,239, 0, 0, 0,237, 0, 0, 1, 15, 0, 0, 1, 13, 0, 0, 0, 1, 0, 0, 1, 16, 0, 0, 0,238,
- 0, 0, 0,240, 0, 0, 1, 14, 0, 0, 0, 1, 0, 0, 0,241, 0, 0, 0,239, 0, 0, 1, 13, 0, 0, 1, 11, 0, 0, 0, 1,
- 0, 0, 1, 14, 0, 0, 0,240, 0, 0, 0,242, 0, 0, 1, 12, 0, 0, 0, 1, 0, 0, 0,243, 0, 0, 0,241, 0, 0, 1, 11,
- 0, 0, 1, 9, 0, 0, 0, 1, 0, 0, 1, 12, 0, 0, 0,242, 0, 0, 0,244, 0, 0, 1, 10, 0, 0, 0, 1, 0, 0, 0,245,
- 0, 0, 0,243, 0, 0, 1, 9, 0, 0, 1, 7, 0, 0, 0, 1, 0, 0, 1, 10, 0, 0, 0,244, 0, 0, 0,246, 0, 0, 1, 8,
- 0, 0, 0, 1, 0, 0, 0,247, 0, 0, 0,245, 0, 0, 1, 7, 0, 0, 1, 5, 0, 0, 0, 1, 0, 0, 1, 8, 0, 0, 0,246,
- 0, 0, 0,248, 0, 0, 1, 6, 0, 0, 0, 1, 0, 0, 0,249, 0, 0, 0,247, 0, 0, 1, 5, 0, 0, 1, 3, 0, 0, 0, 1,
- 0, 0, 1, 6, 0, 0, 0,248, 0, 0, 0,250, 0, 0, 1, 4, 0, 0, 0, 1, 0, 0, 0,231, 0, 0, 0,249, 0, 0, 1, 3,
- 0, 0, 1, 21, 0, 0, 0, 1, 0, 0, 1, 4, 0, 0, 0,250, 0, 0, 0,232, 0, 0, 1, 22, 0, 0, 0, 1, 0, 0, 0,253,
- 0, 0, 0,251, 0, 0, 1, 1, 0, 0, 0,255, 0, 0, 0, 1, 0, 0, 1, 2, 0, 0, 0,252, 0, 0, 0,254, 0, 0, 1, 0,
- 0, 0, 0, 1, 0, 0, 0,251, 0, 0, 0,229, 0, 0, 1, 23, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 24, 0, 0, 0,230,
- 0, 0, 0,252, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 0,229, 0, 0, 0,231, 0, 0, 1, 21, 0, 0, 1, 23, 0, 0, 0, 1,
- 0, 0, 1, 22, 0, 0, 0,232, 0, 0, 0,230, 0, 0, 1, 24, 0, 0, 0, 1, 0, 0, 0, 65, 0, 0, 0,106, 0, 0, 1, 25,
- 0, 0, 0, 71, 0, 0, 0, 1, 0, 0, 1, 26, 0, 0, 0,107, 0, 0, 0, 65, 0, 0, 0, 71, 0, 0, 0, 1, 0, 0, 0,106,
- 0, 0, 0,104, 0, 0, 1, 27, 0, 0, 1, 25, 0, 0, 0, 1, 0, 0, 1, 28, 0, 0, 0,105, 0, 0, 0,107, 0, 0, 1, 26,
- 0, 0, 0, 1, 0, 0, 0,104, 0, 0, 0,102, 0, 0, 1, 29, 0, 0, 1, 27, 0, 0, 0, 1, 0, 0, 1, 30, 0, 0, 0,103,
- 0, 0, 0,105, 0, 0, 1, 28, 0, 0, 0, 1, 0, 0, 0,102, 0, 0, 0,100, 0, 0, 1, 31, 0, 0, 1, 29, 0, 0, 0, 1,
- 0, 0, 1, 32, 0, 0, 0,101, 0, 0, 0,103, 0, 0, 1, 30, 0, 0, 0, 1, 0, 0, 0,100, 0, 0, 0, 98, 0, 0, 1, 33,
- 0, 0, 1, 31, 0, 0, 0, 1, 0, 0, 1, 34, 0, 0, 0, 99, 0, 0, 0,101, 0, 0, 1, 32, 0, 0, 0, 1, 0, 0, 0, 98,
- 0, 0, 0, 96, 0, 0, 1, 35, 0, 0, 1, 33, 0, 0, 0, 1, 0, 0, 1, 36, 0, 0, 0, 97, 0, 0, 0, 99, 0, 0, 1, 34,
- 0, 0, 0, 1, 0, 0, 0, 96, 0, 0, 0, 94, 0, 0, 1, 37, 0, 0, 1, 35, 0, 0, 0, 1, 0, 0, 1, 38, 0, 0, 0, 95,
- 0, 0, 0, 97, 0, 0, 1, 36, 0, 0, 0, 1, 0, 0, 0, 94, 0, 0, 0, 92, 0, 0, 1, 39, 0, 0, 1, 37, 0, 0, 0, 1,
- 0, 0, 1, 40, 0, 0, 0, 93, 0, 0, 0, 95, 0, 0, 1, 38, 0, 0, 0, 1, 0, 0, 0, 92, 0, 0, 0, 90, 0, 0, 1, 41,
- 0, 0, 1, 39, 0, 0, 0, 1, 0, 0, 1, 42, 0, 0, 0, 91, 0, 0, 0, 93, 0, 0, 1, 40, 0, 0, 0, 1, 0, 0, 1, 49,
- 0, 0, 1, 50, 0, 0, 1, 69, 0, 0, 1, 79, 0, 0, 0, 1, 0, 0, 1, 70, 0, 0, 1, 50, 0, 0, 1, 49, 0, 0, 1, 80,
- 0, 0, 0, 1, 0, 0, 1, 48, 0, 0, 1, 49, 0, 0, 1, 79, 0, 0, 1, 77, 0, 0, 0, 1, 0, 0, 1, 80, 0, 0, 1, 49,
- 0, 0, 1, 48, 0, 0, 1, 78, 0, 0, 0, 1, 0, 0, 1, 47, 0, 0, 1, 48, 0, 0, 1, 77, 0, 0, 1, 81, 0, 0, 0, 1,
- 0, 0, 1, 78, 0, 0, 1, 48, 0, 0, 1, 47, 0, 0, 1, 82, 0, 0, 0, 1, 0, 0, 0, 87, 0, 0, 0, 89, 0, 0, 1, 47,
- 0, 0, 1, 81, 0, 0, 0, 1, 0, 0, 1, 47, 0, 0, 0, 89, 0, 0, 0, 88, 0, 0, 1, 82, 0, 0, 0, 1, 0, 0, 0, 85,
- 0, 0, 0, 87, 0, 0, 1, 81, 0, 0, 1, 75, 0, 0, 0, 1, 0, 0, 1, 82, 0, 0, 0, 88, 0, 0, 0, 86, 0, 0, 1, 76,
- 0, 0, 0, 1, 0, 0, 0, 83, 0, 0, 0, 85, 0, 0, 1, 75, 0, 0, 1, 71, 0, 0, 0, 1, 0, 0, 1, 76, 0, 0, 0, 86,
- 0, 0, 0, 84, 0, 0, 1, 72, 0, 0, 0, 1, 0, 0, 0, 81, 0, 0, 0, 83, 0, 0, 1, 71, 0, 0, 1, 73, 0, 0, 0, 1,
- 0, 0, 1, 72, 0, 0, 0, 84, 0, 0, 0, 82, 0, 0, 1, 74, 0, 0, 0, 1, 0, 0, 1, 71, 0, 0, 1, 77, 0, 0, 1, 79,
- 0, 0, 1, 73, 0, 0, 0, 1, 0, 0, 1, 80, 0, 0, 1, 78, 0, 0, 1, 72, 0, 0, 1, 74, 0, 0, 0, 1, 0, 0, 1, 71,
- 0, 0, 1, 75, 0, 0, 1, 81, 0, 0, 1, 77, 0, 0, 0, 1, 0, 0, 1, 82, 0, 0, 1, 76, 0, 0, 1, 72, 0, 0, 1, 78,
- 0, 0, 0, 1, 0, 0, 1, 67, 0, 0, 1, 73, 0, 0, 1, 79, 0, 0, 1, 69, 0, 0, 0, 1, 0, 0, 1, 80, 0, 0, 1, 74,
- 0, 0, 1, 68, 0, 0, 1, 70, 0, 0, 0, 1, 0, 0, 0, 79, 0, 0, 0, 81, 0, 0, 1, 73, 0, 0, 1, 67, 0, 0, 0, 1,
- 0, 0, 1, 74, 0, 0, 0, 82, 0, 0, 0, 80, 0, 0, 1, 68, 0, 0, 0, 1, 0, 0, 0,206, 0, 0, 1, 83, 0, 0, 1, 85,
- 0, 0, 0,212, 0, 0, 0, 1, 0, 0, 1, 86, 0, 0, 1, 84, 0, 0, 0,207, 0, 0, 0,213, 0, 0, 0, 1, 0, 0, 0, 79,
- 0, 0, 1, 67, 0, 0, 1, 83, 0, 0, 0,206, 0, 0, 0, 1, 0, 0, 1, 84, 0, 0, 1, 68, 0, 0, 0, 80, 0, 0, 0,207,
- 0, 0, 0, 1, 0, 0, 0, 77, 0, 0, 0,212, 0, 0, 1, 85, 0, 0, 1, 87, 0, 0, 0, 1, 0, 0, 1, 86, 0, 0, 0,213,
- 0, 0, 0, 78, 0, 0, 1, 88, 0, 0, 0, 1, 0, 0, 0, 77, 0, 0, 1, 87, 0, 0, 1, 41, 0, 0, 0, 90, 0, 0, 0, 1,
- 0, 0, 1, 42, 0, 0, 1, 88, 0, 0, 0, 78, 0, 0, 0, 91, 0, 0, 0, 1, 0, 0, 0, 75, 0, 0, 1, 65, 0, 0, 1, 93,
- 0, 0, 1, 45, 0, 0, 0, 1, 0, 0, 1, 94, 0, 0, 1, 66, 0, 0, 0, 75, 0, 0, 1, 45, 0, 0, 0, 1, 0, 0, 1, 45,
- 0, 0, 1, 93, 0, 0, 1, 91, 0, 0, 0, 76, 0, 0, 0, 1, 0, 0, 1, 92, 0, 0, 1, 94, 0, 0, 1, 45, 0, 0, 0, 76,
- 0, 0, 0, 1, 0, 0, 0, 76, 0, 0, 1, 91, 0, 0, 1, 89, 0, 0, 1, 46, 0, 0, 0, 1, 0, 0, 1, 90, 0, 0, 1, 92,
- 0, 0, 0, 76, 0, 0, 1, 46, 0, 0, 0, 1, 0, 0, 1, 46, 0, 0, 1, 89, 0, 0, 1, 69, 0, 0, 1, 50, 0, 0, 0, 1,
- 0, 0, 1, 70, 0, 0, 1, 90, 0, 0, 1, 46, 0, 0, 1, 50, 0, 0, 0, 1, 0, 0, 1, 67, 0, 0, 1, 69, 0, 0, 1, 89,
- 0, 0, 1, 83, 0, 0, 0, 1, 0, 0, 1, 90, 0, 0, 1, 70, 0, 0, 1, 68, 0, 0, 1, 84, 0, 0, 0, 1, 0, 0, 1, 37,
- 0, 0, 1, 39, 0, 0, 1, 59, 0, 0, 1, 51, 0, 0, 0, 1, 0, 0, 1, 60, 0, 0, 1, 40, 0, 0, 1, 38, 0, 0, 1, 52,
- 0, 0, 0, 1, 0, 0, 0, 74, 0, 0, 1, 57, 0, 0, 1, 65, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 1, 66, 0, 0, 1, 58,
- 0, 0, 0, 74, 0, 0, 0, 75, 0, 0, 0, 1, 0, 0, 1, 43, 0, 0, 1, 99, 0, 0, 1, 97, 0, 0, 1, 44, 0, 0, 0, 1,
- 0, 0, 1, 98, 0, 0, 1,100, 0, 0, 1, 43, 0, 0, 1, 44, 0, 0, 0, 1, 0, 0, 1, 44, 0, 0, 1, 97, 0, 0, 1, 95,
- 0, 0, 0, 73, 0, 0, 0, 1, 0, 0, 1, 96, 0, 0, 1, 98, 0, 0, 1, 44, 0, 0, 0, 73, 0, 0, 0, 1, 0, 0, 0, 73,
- 0, 0, 1, 95, 0, 0, 1, 57, 0, 0, 0, 74, 0, 0, 0, 1, 0, 0, 1, 58, 0, 0, 1, 96, 0, 0, 0, 73, 0, 0, 0, 74,
- 0, 0, 0, 1, 0, 0, 1, 33, 0, 0, 1, 35, 0, 0, 1,103, 0, 0, 1,105, 0, 0, 0, 1, 0, 0, 1,104, 0, 0, 1, 36,
- 0, 0, 1, 34, 0, 0, 1,106, 0, 0, 0, 1, 0, 0, 1,105, 0, 0, 1,103, 0, 0, 1,109, 0, 0, 1,107, 0, 0, 0, 1,
- 0, 0, 1,110, 0, 0, 1,104, 0, 0, 1,106, 0, 0, 1,108, 0, 0, 0, 1, 0, 0, 1,107, 0, 0, 1,109, 0, 0, 1,111,
- 0, 0, 1,113, 0, 0, 0, 1, 0, 0, 1,112, 0, 0, 1,110, 0, 0, 1,108, 0, 0, 1,114, 0, 0, 0, 1, 0, 0, 1,113,
- 0, 0, 1,111, 0, 0, 1,117, 0, 0, 1,115, 0, 0, 0, 1, 0, 0, 1,118, 0, 0, 1,112, 0, 0, 1,114, 0, 0, 1,116,
- 0, 0, 0, 1, 0, 0, 1, 55, 0, 0, 1,119, 0, 0, 1,115, 0, 0, 1,117, 0, 0, 0, 1, 0, 0, 1,116, 0, 0, 1,120,
- 0, 0, 1, 56, 0, 0, 1,118, 0, 0, 0, 1, 0, 0, 1, 57, 0, 0, 1, 95, 0, 0, 1,115, 0, 0, 1,119, 0, 0, 0, 1,
- 0, 0, 1,116, 0, 0, 1, 96, 0, 0, 1, 58, 0, 0, 1,120, 0, 0, 0, 1, 0, 0, 1, 95, 0, 0, 1, 97, 0, 0, 1,113,
- 0, 0, 1,115, 0, 0, 0, 1, 0, 0, 1,114, 0, 0, 1, 98, 0, 0, 1, 96, 0, 0, 1,116, 0, 0, 0, 1, 0, 0, 1, 97,
- 0, 0, 1, 99, 0, 0, 1,107, 0, 0, 1,113, 0, 0, 0, 1, 0, 0, 1,108, 0, 0, 1,100, 0, 0, 1, 98, 0, 0, 1,114,
- 0, 0, 0, 1, 0, 0, 1, 99, 0, 0, 1,101, 0, 0, 1,105, 0, 0, 1,107, 0, 0, 0, 1, 0, 0, 1,106, 0, 0, 1,102,
- 0, 0, 1,100, 0, 0, 1,108, 0, 0, 0, 1, 0, 0, 1, 31, 0, 0, 1, 33, 0, 0, 1,105, 0, 0, 1,101, 0, 0, 0, 1,
- 0, 0, 1,106, 0, 0, 1, 34, 0, 0, 1, 32, 0, 0, 1,102, 0, 0, 0, 1, 0, 0, 0, 72, 0, 0, 1,101, 0, 0, 1, 99,
- 0, 0, 1, 43, 0, 0, 0, 1, 0, 0, 1,100, 0, 0, 1,102, 0, 0, 0, 72, 0, 0, 1, 43, 0, 0, 0, 1, 0, 0, 1, 25,
- 0, 0, 1, 27, 0, 0, 1, 29, 0, 0, 1, 31, 0, 0, 0, 1, 0, 0, 1, 30, 0, 0, 1, 28, 0, 0, 1, 26, 0, 0, 1, 32,
- 0, 0, 0, 1, 0, 0, 1, 25, 0, 0, 1, 31, 0, 0, 1,101, 0, 0, 0, 72, 0, 0, 0, 1, 0, 0, 1,102, 0, 0, 1, 32,
- 0, 0, 1, 26, 0, 0, 0, 72, 0, 0, 0, 1, 0, 0, 0, 71, 0, 0, 1, 25, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 72, 0, 0, 1, 26, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 35, 0, 0, 1, 37, 0, 0, 1, 51,
- 0, 0, 1,103, 0, 0, 0, 1, 0, 0, 1, 52, 0, 0, 1, 38, 0, 0, 1, 36, 0, 0, 1,104, 0, 0, 0, 1, 0, 0, 1, 51,
- 0, 0, 1, 53, 0, 0, 1,109, 0, 0, 1,103, 0, 0, 0, 1, 0, 0, 1,110, 0, 0, 1, 54, 0, 0, 1, 52, 0, 0, 1,104,
- 0, 0, 0, 1, 0, 0, 1, 53, 0, 0, 1,123, 0, 0, 1,111, 0, 0, 1,109, 0, 0, 0, 1, 0, 0, 1,112, 0, 0, 1,124,
- 0, 0, 1, 54, 0, 0, 1,110, 0, 0, 0, 1, 0, 0, 1, 55, 0, 0, 1,117, 0, 0, 1,111, 0, 0, 1,123, 0, 0, 0, 1,
- 0, 0, 1,112, 0, 0, 1,118, 0, 0, 1, 56, 0, 0, 1,124, 0, 0, 0, 1, 0, 0, 1, 89, 0, 0, 1, 91, 0, 0, 1,127,
- 0, 0, 1,125, 0, 0, 0, 1, 0, 0, 1,128, 0, 0, 1, 92, 0, 0, 1, 90, 0, 0, 1,126, 0, 0, 0, 1, 0, 0, 1, 59,
- 0, 0, 1,125, 0, 0, 1,127, 0, 0, 1, 61, 0, 0, 0, 1, 0, 0, 1,128, 0, 0, 1,126, 0, 0, 1, 60, 0, 0, 1, 62,
- 0, 0, 0, 1, 0, 0, 1, 39, 0, 0, 1, 41, 0, 0, 1,125, 0, 0, 1, 59, 0, 0, 0, 1, 0, 0, 1,126, 0, 0, 1, 42,
- 0, 0, 1, 40, 0, 0, 1, 60, 0, 0, 0, 1, 0, 0, 1, 41, 0, 0, 1, 85, 0, 0, 1, 83, 0, 0, 1,125, 0, 0, 0, 1,
- 0, 0, 1, 84, 0, 0, 1, 86, 0, 0, 1, 42, 0, 0, 1,126, 0, 0, 0, 1, 0, 0, 1, 83, 0, 0, 1, 89, 0, 0, 1,125,
- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,126, 0, 0, 1, 90, 0, 0, 1, 84, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 41,
- 0, 0, 1, 87, 0, 0, 1, 85, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 86, 0, 0, 1, 88, 0, 0, 1, 42, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 1, 55, 0, 0, 1, 63, 0, 0, 1,121, 0, 0, 1,119, 0, 0, 0, 1, 0, 0, 1,122, 0, 0, 1, 64,
- 0, 0, 1, 56, 0, 0, 1,120, 0, 0, 0, 1, 0, 0, 1, 57, 0, 0, 1,119, 0, 0, 1,121, 0, 0, 1, 65, 0, 0, 0, 1,
- 0, 0, 1,122, 0, 0, 1,120, 0, 0, 1, 58, 0, 0, 1, 66, 0, 0, 0, 1, 0, 0, 1, 61, 0, 0, 1,127, 0, 0, 1,121,
- 0, 0, 1, 63, 0, 0, 0, 1, 0, 0, 1,122, 0, 0, 1,128, 0, 0, 1, 62, 0, 0, 1, 64, 0, 0, 0, 1, 0, 0, 1, 91,
- 0, 0, 1, 93, 0, 0, 1,121, 0, 0, 1,127, 0, 0, 0, 1, 0, 0, 1,122, 0, 0, 1, 94, 0, 0, 1, 92, 0, 0, 1,128,
- 0, 0, 0, 1, 0, 0, 1, 65, 0, 0, 1,121, 0, 0, 1, 93, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 94, 0, 0, 1,122,
- 0, 0, 1, 66, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,141, 0, 0, 1,129, 0, 0, 1,155, 0, 0, 1,143, 0, 0, 0, 1,
- 0, 0, 1,156, 0, 0, 1,130, 0, 0, 1,142, 0, 0, 1,144, 0, 0, 0, 1, 0, 0, 1,141, 0, 0, 1,143, 0, 0, 1,145,
- 0, 0, 1,139, 0, 0, 0, 1, 0, 0, 1,146, 0, 0, 1,144, 0, 0, 1,142, 0, 0, 1,140, 0, 0, 0, 1, 0, 0, 1,139,
- 0, 0, 1,145, 0, 0, 1,147, 0, 0, 1,137, 0, 0, 0, 1, 0, 0, 1,148, 0, 0, 1,146, 0, 0, 1,140, 0, 0, 1,138,
- 0, 0, 0, 1, 0, 0, 1,137, 0, 0, 1,147, 0, 0, 1,149, 0, 0, 1,135, 0, 0, 0, 1, 0, 0, 1,150, 0, 0, 1,148,
- 0, 0, 1,138, 0, 0, 1,136, 0, 0, 0, 1, 0, 0, 1,135, 0, 0, 1,149, 0, 0, 1,151, 0, 0, 1,133, 0, 0, 0, 1,
- 0, 0, 1,152, 0, 0, 1,150, 0, 0, 1,136, 0, 0, 1,134, 0, 0, 0, 1, 0, 0, 1,133, 0, 0, 1,151, 0, 0, 1,153,
- 0, 0, 1,131, 0, 0, 0, 1, 0, 0, 1,154, 0, 0, 1,152, 0, 0, 1,134, 0, 0, 1,132, 0, 0, 0, 1, 0, 0, 1,151,
- 0, 0, 1,161, 0, 0, 1,159, 0, 0, 1,153, 0, 0, 0, 1, 0, 0, 1,160, 0, 0, 1,162, 0, 0, 1,152, 0, 0, 1,154,
- 0, 0, 0, 1, 0, 0, 1,149, 0, 0, 1,163, 0, 0, 1,161, 0, 0, 1,151, 0, 0, 0, 1, 0, 0, 1,162, 0, 0, 1,164,
- 0, 0, 1,150, 0, 0, 1,152, 0, 0, 0, 1, 0, 0, 1,147, 0, 0, 1,165, 0, 0, 1,163, 0, 0, 1,149, 0, 0, 0, 1,
- 0, 0, 1,164, 0, 0, 1,166, 0, 0, 1,148, 0, 0, 1,150, 0, 0, 0, 1, 0, 0, 1,145, 0, 0, 1,167, 0, 0, 1,165,
- 0, 0, 1,147, 0, 0, 0, 1, 0, 0, 1,166, 0, 0, 1,168, 0, 0, 1,146, 0, 0, 1,148, 0, 0, 0, 1, 0, 0, 1,143,
- 0, 0, 1,169, 0, 0, 1,167, 0, 0, 1,145, 0, 0, 0, 1, 0, 0, 1,168, 0, 0, 1,170, 0, 0, 1,144, 0, 0, 1,146,
- 0, 0, 0, 1, 0, 0, 1,143, 0, 0, 1,155, 0, 0, 1,157, 0, 0, 1,169, 0, 0, 0, 1, 0, 0, 1,158, 0, 0, 1,156,
- 0, 0, 1,144, 0, 0, 1,170, 0, 0, 0, 1, 0, 0, 1, 59, 0, 0, 1, 61, 0, 0, 1,185, 0, 0, 1,183, 0, 0, 0, 1,
- 0, 0, 1,186, 0, 0, 1, 62, 0, 0, 1, 60, 0, 0, 1,184, 0, 0, 0, 1, 0, 0, 1, 61, 0, 0, 1,131, 0, 0, 1,153,
- 0, 0, 1,185, 0, 0, 0, 1, 0, 0, 1,154, 0, 0, 1,132, 0, 0, 1, 62, 0, 0, 1,186, 0, 0, 0, 1, 0, 0, 1, 51,
- 0, 0, 1, 59, 0, 0, 1,183, 0, 0, 1, 53, 0, 0, 0, 1, 0, 0, 1,184, 0, 0, 1, 60, 0, 0, 1, 52, 0, 0, 1, 54,
- 0, 0, 0, 1, 0, 0, 1,123, 0, 0, 1,171, 0, 0, 1,155, 0, 0, 1,129, 0, 0, 0, 1, 0, 0, 1,156, 0, 0, 1,172,
- 0, 0, 1,124, 0, 0, 1,130, 0, 0, 0, 1, 0, 0, 1,153, 0, 0, 1,159, 0, 0, 1,181, 0, 0, 1,185, 0, 0, 0, 1,
- 0, 0, 1,182, 0, 0, 1,160, 0, 0, 1,154, 0, 0, 1,186, 0, 0, 0, 1, 0, 0, 1,179, 0, 0, 1,187, 0, 0, 1,185,
- 0, 0, 1,181, 0, 0, 0, 1, 0, 0, 1,186, 0, 0, 1,188, 0, 0, 1,180, 0, 0, 1,182, 0, 0, 0, 1, 0, 0, 1,175,
- 0, 0, 1,187, 0, 0, 1,179, 0, 0, 1,177, 0, 0, 0, 1, 0, 0, 1,180, 0, 0, 1,188, 0, 0, 1,176, 0, 0, 1,178,
- 0, 0, 0, 1, 0, 0, 1,173, 0, 0, 1,189, 0, 0, 1,187, 0, 0, 1,175, 0, 0, 0, 1, 0, 0, 1,188, 0, 0, 1,190,
- 0, 0, 1,174, 0, 0, 1,176, 0, 0, 0, 1, 0, 0, 1,171, 0, 0, 1,189, 0, 0, 1,173, 0, 0, 1,191, 0, 0, 0, 1,
- 0, 0, 1,174, 0, 0, 1,190, 0, 0, 1,172, 0, 0, 1,192, 0, 0, 0, 1, 0, 0, 1,155, 0, 0, 1,171, 0, 0, 1,191,
- 0, 0, 1,157, 0, 0, 0, 1, 0, 0, 1,192, 0, 0, 1,172, 0, 0, 1,156, 0, 0, 1,158, 0, 0, 0, 1, 0, 0, 1, 53,
- 0, 0, 1,189, 0, 0, 1,171, 0, 0, 1,123, 0, 0, 0, 1, 0, 0, 1,172, 0, 0, 1,190, 0, 0, 1, 54, 0, 0, 1,124,
- 0, 0, 0, 1, 0, 0, 1, 53, 0, 0, 1,183, 0, 0, 1,187, 0, 0, 1,189, 0, 0, 0, 1, 0, 0, 1,188, 0, 0, 1,184,
- 0, 0, 1, 54, 0, 0, 1,190, 0, 0, 0, 1, 0, 0, 1,183, 0, 0, 1,185, 0, 0, 1,187, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 1,188, 0, 0, 1,186, 0, 0, 1,184, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,157, 0, 0, 1,191, 0, 0, 1,193,
- 0, 0, 1,217, 0, 0, 0, 1, 0, 0, 1,194, 0, 0, 1,192, 0, 0, 1,158, 0, 0, 1,218, 0, 0, 0, 1, 0, 0, 1,191,
- 0, 0, 1,173, 0, 0, 1,203, 0, 0, 1,193, 0, 0, 0, 1, 0, 0, 1,204, 0, 0, 1,174, 0, 0, 1,192, 0, 0, 1,194,
- 0, 0, 0, 1, 0, 0, 1,173, 0, 0, 1,175, 0, 0, 1,201, 0, 0, 1,203, 0, 0, 0, 1, 0, 0, 1,202, 0, 0, 1,176,
- 0, 0, 1,174, 0, 0, 1,204, 0, 0, 0, 1, 0, 0, 1,175, 0, 0, 1,177, 0, 0, 1,199, 0, 0, 1,201, 0, 0, 0, 1,
- 0, 0, 1,200, 0, 0, 1,178, 0, 0, 1,176, 0, 0, 1,202, 0, 0, 0, 1, 0, 0, 1,177, 0, 0, 1,179, 0, 0, 1,197,
- 0, 0, 1,199, 0, 0, 0, 1, 0, 0, 1,198, 0, 0, 1,180, 0, 0, 1,178, 0, 0, 1,200, 0, 0, 0, 1, 0, 0, 1,179,
- 0, 0, 1,181, 0, 0, 1,195, 0, 0, 1,197, 0, 0, 0, 1, 0, 0, 1,196, 0, 0, 1,182, 0, 0, 1,180, 0, 0, 1,198,
- 0, 0, 0, 1, 0, 0, 1,181, 0, 0, 1,159, 0, 0, 1,215, 0, 0, 1,195, 0, 0, 0, 1, 0, 0, 1,216, 0, 0, 1,160,
- 0, 0, 1,182, 0, 0, 1,196, 0, 0, 0, 1, 0, 0, 1,169, 0, 0, 1,157, 0, 0, 1,217, 0, 0, 1,205, 0, 0, 0, 1,
- 0, 0, 1,218, 0, 0, 1,158, 0, 0, 1,170, 0, 0, 1,206, 0, 0, 0, 1, 0, 0, 1,167, 0, 0, 1,169, 0, 0, 1,205,
- 0, 0, 1,207, 0, 0, 0, 1, 0, 0, 1,206, 0, 0, 1,170, 0, 0, 1,168, 0, 0, 1,208, 0, 0, 0, 1, 0, 0, 1,165,
- 0, 0, 1,167, 0, 0, 1,207, 0, 0, 1,209, 0, 0, 0, 1, 0, 0, 1,208, 0, 0, 1,168, 0, 0, 1,166, 0, 0, 1,210,
- 0, 0, 0, 1, 0, 0, 1,163, 0, 0, 1,165, 0, 0, 1,209, 0, 0, 1,211, 0, 0, 0, 1, 0, 0, 1,210, 0, 0, 1,166,
- 0, 0, 1,164, 0, 0, 1,212, 0, 0, 0, 1, 0, 0, 1,161, 0, 0, 1,163, 0, 0, 1,211, 0, 0, 1,213, 0, 0, 0, 1,
- 0, 0, 1,212, 0, 0, 1,164, 0, 0, 1,162, 0, 0, 1,214, 0, 0, 0, 1, 0, 0, 1,159, 0, 0, 1,161, 0, 0, 1,213,
- 0, 0, 1,215, 0, 0, 0, 1, 0, 0, 1,214, 0, 0, 1,162, 0, 0, 1,160, 0, 0, 1,216, 0, 0, 0, 1, 0, 0, 1,199,
- 0, 0, 1,197, 0, 0, 1,221, 0, 0, 1,219, 0, 0, 0, 1, 0, 0, 1,222, 0, 0, 1,198, 0, 0, 1,200, 0, 0, 1,220,
- 0, 0, 0, 1, 0, 0, 1,219, 0, 0, 1,221, 0, 0, 1,223, 0, 0, 1,225, 0, 0, 0, 1, 0, 0, 1,224, 0, 0, 1,222,
- 0, 0, 1,220, 0, 0, 1,226, 0, 0, 0, 1, 0, 0, 1,225, 0, 0, 1,223, 0, 0, 1,229, 0, 0, 1,227, 0, 0, 0, 1,
- 0, 0, 1,230, 0, 0, 1,224, 0, 0, 1,226, 0, 0, 1,228, 0, 0, 0, 1, 0, 0, 1,227, 0, 0, 1,229, 0, 0, 1,231,
- 0, 0, 1,233, 0, 0, 0, 1, 0, 0, 1,232, 0, 0, 1,230, 0, 0, 1,228, 0, 0, 1,234, 0, 0, 0, 1, 0, 0, 1,205,
- 0, 0, 1,217, 0, 0, 1,227, 0, 0, 1,233, 0, 0, 0, 1, 0, 0, 1,228, 0, 0, 1,218, 0, 0, 1,206, 0, 0, 1,234,
- 0, 0, 0, 1, 0, 0, 1,193, 0, 0, 1,225, 0, 0, 1,227, 0, 0, 1,217, 0, 0, 0, 1, 0, 0, 1,228, 0, 0, 1,226,
- 0, 0, 1,194, 0, 0, 1,218, 0, 0, 0, 1, 0, 0, 1,193, 0, 0, 1,203, 0, 0, 1,219, 0, 0, 1,225, 0, 0, 0, 1,
- 0, 0, 1,220, 0, 0, 1,204, 0, 0, 1,194, 0, 0, 1,226, 0, 0, 0, 1, 0, 0, 1,199, 0, 0, 1,219, 0, 0, 1,203,
- 0, 0, 1,201, 0, 0, 0, 1, 0, 0, 1,204, 0, 0, 1,220, 0, 0, 1,200, 0, 0, 1,202, 0, 0, 0, 1, 0, 0, 1,195,
- 0, 0, 1,215, 0, 0, 1,221, 0, 0, 1,197, 0, 0, 0, 1, 0, 0, 1,222, 0, 0, 1,216, 0, 0, 1,196, 0, 0, 1,198,
- 0, 0, 0, 1, 0, 0, 1,213, 0, 0, 1,223, 0, 0, 1,221, 0, 0, 1,215, 0, 0, 0, 1, 0, 0, 1,222, 0, 0, 1,224,
- 0, 0, 1,214, 0, 0, 1,216, 0, 0, 0, 1, 0, 0, 1,211, 0, 0, 1,229, 0, 0, 1,223, 0, 0, 1,213, 0, 0, 0, 1,
- 0, 0, 1,224, 0, 0, 1,230, 0, 0, 1,212, 0, 0, 1,214, 0, 0, 0, 1, 0, 0, 1,209, 0, 0, 1,231, 0, 0, 1,229,
- 0, 0, 1,211, 0, 0, 0, 1, 0, 0, 1,230, 0, 0, 1,232, 0, 0, 1,210, 0, 0, 1,212, 0, 0, 0, 1, 0, 0, 1,207,
- 0, 0, 1,233, 0, 0, 1,231, 0, 0, 1,209, 0, 0, 0, 1, 0, 0, 1,232, 0, 0, 1,234, 0, 0, 1,208, 0, 0, 1,210,
- 0, 0, 0, 1, 0, 0, 1,205, 0, 0, 1,233, 0, 0, 1,207, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,208, 0, 0, 1,234,
- 0, 0, 1,206, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,133, 0, 0, 1,131, 0, 0, 1,245, 0, 0, 1,243, 0, 0, 0, 1,
- 0, 0, 1,246, 0, 0, 1,132, 0, 0, 1,134, 0, 0, 1,244, 0, 0, 0, 1, 0, 0, 1,135, 0, 0, 1,133, 0, 0, 1,243,
- 0, 0, 1,241, 0, 0, 0, 1, 0, 0, 1,244, 0, 0, 1,134, 0, 0, 1,136, 0, 0, 1,242, 0, 0, 0, 1, 0, 0, 1,137,
- 0, 0, 1,135, 0, 0, 1,241, 0, 0, 1,239, 0, 0, 0, 1, 0, 0, 1,242, 0, 0, 1,136, 0, 0, 1,138, 0, 0, 1,240,
- 0, 0, 0, 1, 0, 0, 1,139, 0, 0, 1,137, 0, 0, 1,239, 0, 0, 1,237, 0, 0, 0, 1, 0, 0, 1,240, 0, 0, 1,138,
- 0, 0, 1,140, 0, 0, 1,238, 0, 0, 0, 1, 0, 0, 1,141, 0, 0, 1,139, 0, 0, 1,237, 0, 0, 1,235, 0, 0, 0, 1,
- 0, 0, 1,238, 0, 0, 1,140, 0, 0, 1,142, 0, 0, 1,236, 0, 0, 0, 1, 0, 0, 1,129, 0, 0, 1,141, 0, 0, 1,235,
- 0, 0, 1,247, 0, 0, 0, 1, 0, 0, 1,236, 0, 0, 1,142, 0, 0, 1,130, 0, 0, 1,248, 0, 0, 0, 1, 0, 0, 1,235,
- 0, 0, 1,243, 0, 0, 1,245, 0, 0, 1,247, 0, 0, 0, 1, 0, 0, 1,246, 0, 0, 1,244, 0, 0, 1,236, 0, 0, 1,248,
- 0, 0, 0, 1, 0, 0, 1,235, 0, 0, 1,237, 0, 0, 1,241, 0, 0, 1,243, 0, 0, 0, 1, 0, 0, 1,242, 0, 0, 1,238,
- 0, 0, 1,236, 0, 0, 1,244, 0, 0, 0, 1, 0, 0, 1,237, 0, 0, 1,239, 0, 0, 1,241, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 1,242, 0, 0, 1,240, 0, 0, 1,238, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 55, 0, 0, 1,123, 0, 0, 1,129,
- 0, 0, 1,247, 0, 0, 0, 1, 0, 0, 1,130, 0, 0, 1,124, 0, 0, 1, 56, 0, 0, 1,248, 0, 0, 0, 1, 0, 0, 1, 55,
- 0, 0, 1,247, 0, 0, 1,245, 0, 0, 1, 63, 0, 0, 0, 1, 0, 0, 1,246, 0, 0, 1,248, 0, 0, 1, 56, 0, 0, 1, 64,
- 0, 0, 0, 1, 0, 0, 1, 61, 0, 0, 1, 63, 0, 0, 1,245, 0, 0, 1,131, 0, 0, 0, 1, 0, 0, 1,246, 0, 0, 1, 64,
- 0, 0, 1, 62, 0, 0, 1,132, 0, 0, 0, 1, 68, 65, 84, 65, 0, 0, 85,240, 8,102,176, 32, 0, 0, 0, 60, 0, 0, 1,244,
- 63, 28,112, 3, 62,236,178,185, 63, 27,124,224, 62,232, 65,235, 63, 30, 63,144, 62,226,195,233, 63, 32,152,118, 62,236,167, 37,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,209,232, 2, 62,226, 21,222, 62,215,109,102, 62,231,147,222, 62,213,135, 28,
- 62,236, 4,172, 62,205, 54, 56, 62,235,249, 22, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 32,152,118, 62,236,167, 37,
- 63, 30, 63,144, 62,226,195,233, 63, 33,235,108, 62,220,235,197, 63, 37,151,209, 62,236,161, 89, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,240, 62,202,144, 76, 62,220, 61,186, 62,209,232, 2, 62,226, 21,222, 62,205, 54, 56, 62,235,249, 22, 62,195, 55,128,
- 62,235,243, 70, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 30, 63,144, 62,226,195,233, 63, 25, 55, 20, 62,223, 35, 1,
- 63, 25,178,200, 62,214,233, 77, 63, 33,235,108, 62,220,235,197, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,219, 1,146,
- 62,214, 59, 66, 62,219,248,248, 62,222,116,246, 62,209,232, 2, 62,226, 21,222, 62,202,144, 76, 62,220, 61,186, 2,236,169, 32,
- 61, 0, 0, 5, 0, 0, 0,240, 63, 27,124,224, 62,232, 65,235, 63, 24,252, 87, 62,230,111, 93, 63, 25, 55, 20, 62,223, 35, 1,
- 63, 30, 63,144, 62,226,195,233, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,219,248,248, 62,222,116,246, 62,220,110,118,
- 62,229,193, 78, 62,215,109,102, 62,231,147,222, 62,209,232, 2, 62,226, 21,222, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240,
- 63, 24,252, 87, 62,230,111, 93, 63, 22,195, 22, 62,232, 90,195, 63, 20, 91,191, 62,227, 18,193, 63, 25, 55, 20, 62,223, 35, 1,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,229,175,162, 62,226,100,178, 62,224,224,248, 62,231,172,182, 62,220,110,118,
- 62,229,193, 78, 62,219,248,248, 62,222,116,246, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 25, 55, 20, 62,223, 35, 1,
- 63, 20, 91,191, 62,227, 18,193, 63, 17,165,187, 62,221, 6,225, 63, 25,178,200, 62,214,233, 77, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,240, 62,235, 27,170, 62,220, 88,214, 62,229,175,162, 62,226,100,178, 62,219,248,248, 62,222,116,246, 62,219, 1,146,
- 62,214, 59, 66, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 20, 91,191, 62,227, 18,193, 63, 18, 18,164, 62,236,201,173,
- 63, 13,231,157, 62,236,161, 89, 63, 17,165,187, 62,221, 6,225, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,242,151,232,
- 62,235,243, 70, 62,234, 65,216, 62,236, 27,158, 62,229,175,162, 62,226,100,178, 62,235, 27,170, 62,220, 88,214, 2,236,169, 32,
- 61, 0, 0, 5, 0, 0, 0,240, 63, 22,195, 22, 62,232, 90,195, 63, 21,202, 11, 62,236,189, 1, 63, 18, 18,164, 62,236,201,173,
- 63, 20, 91,191, 62,227, 18,193, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,234, 65,216, 62,236, 27,158, 62,226,211, 12,
- 62,236, 14,246, 62,224,224,248, 62,231,172,182, 62,229,175,162, 62,226,100,178, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240,
- 63, 21,202, 11, 62,236,189, 1, 63, 22,202,215, 62,241,124,237, 63, 20,105,125, 62,246, 71, 1, 63, 18, 18,164, 62,236,201,173,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,229,148, 42, 62,245,152,246, 62,224,209,112, 62,240,206,226, 62,226,211, 12,
- 62,236, 14,246, 62,234, 65,216, 62,236, 27,158, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 18, 18,164, 62,236,201,173,
- 63, 20,105,125, 62,246, 71, 1, 63, 17,173, 44, 62,252,149,231, 63, 13,231,157, 62,236,161, 89, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,240, 62,235, 12,206, 62,251,231,218, 62,229,148, 42, 62,245,152,246, 62,234, 65,216, 62,236, 27,158, 62,242,151,232,
- 62,235,243, 70, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 20,105,125, 62,246, 71, 1, 63, 25, 59, 37, 62,250, 73, 49,
- 63, 25,178,108, 63, 1,108,218, 63, 17,173, 44, 62,252,149,231, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,219, 2, 76,
- 63, 1, 21,213, 62,219,240,216, 62,249,155, 38, 62,229,148, 42, 62,245,152,246, 62,235, 12,206, 62,251,231,218, 2,236,169, 32,
- 61, 0, 0, 5, 0, 0, 0,240, 63, 22,202,215, 62,241,124,237, 63, 25, 1,195, 62,243,102,169, 63, 25, 59, 37, 62,250, 73, 49,
- 63, 20,105,125, 62,246, 71, 1, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,219,240,216, 62,249,155, 38, 62,220, 99,156,
- 62,242,184,154, 62,224,209,112, 62,240,206,226, 62,229,148, 42, 62,245,152,246, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240,
- 63, 25, 1,195, 62,243,102,169, 63, 27,125,176, 62,241,145,149, 63, 30, 74,167, 62,246,153, 3, 63, 25, 59, 37, 62,250, 73, 49,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,209,209,212, 62,245,234,246, 62,215,107,192, 62,240,227,138, 62,220, 99,156,
- 62,242,184,154, 62,219,240,216, 62,249,155, 38, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 25, 59, 37, 62,250, 73, 49,
- 63, 30, 74,167, 62,246,153, 3, 63, 33,230,204, 62,252,232,107, 63, 25,178,108, 63, 1,108,218, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,240, 62,202,153,132, 62,252, 58, 94, 62,209,209,212, 62,245,234,246, 62,219,240,216, 62,249,155, 38, 62,219, 2, 76,
- 63, 1, 21,213, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 30, 74,167, 62,246,153, 3, 63, 32,152,118, 62,236,167, 37,
- 63, 37,151,209, 62,236,161, 89, 63, 33,230,204, 62,252,232,107, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,195, 55,128,
- 62,235,243, 70, 62,205, 54, 56, 62,235,249, 22, 62,209,209,212, 62,245,234,246, 62,202,153,132, 62,252, 58, 94, 2,236,169, 32,
- 61, 0, 0, 5, 0, 0, 0,240, 63, 27,125,176, 62,241,145,149, 63, 28,112, 3, 62,236,178,185, 63, 32,152,118, 62,236,167, 37,
- 63, 30, 74,167, 62,246,153, 3, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,205, 54, 56, 62,235,249, 22, 62,213,135, 28,
- 62,236, 4,172, 62,215,107,192, 62,240,227,138, 62,209,209,212, 62,245,234,246, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240,
- 63, 28,112, 3, 62,236,178,185, 63, 27,125,176, 62,241,145,149, 63, 27, 39, 42, 62,241, 1, 57, 63, 27,249,140, 62,236,186,115,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,216, 24,206, 62,240, 83, 46, 62,215,107,192, 62,240,227,138, 62,213,135, 28,
- 62,236, 4,172, 62,214,116, 8, 62,236, 12,102, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 27,125,176, 62,241,145,149,
- 63, 25, 1,195, 62,243,102,169, 63, 24,248, 6, 62,242, 91,185, 63, 27, 39, 42, 62,241, 1, 57, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,240, 62,220,119, 22, 62,241,173,174, 62,220, 99,156, 62,242,184,154, 62,215,107,192, 62,240,227,138, 62,216, 24,206,
- 62,240, 83, 46, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 25, 1,195, 62,243,102,169, 63, 22,202,215, 62,241,124,237,
- 63, 23, 38,157, 62,240,173,225, 63, 24,248, 6, 62,242, 91,185, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,224, 25,234,
- 62,239,255,214, 62,224,209,112, 62,240,206,226, 62,220, 99,156, 62,242,184,154, 62,220,119, 22, 62,241,173,174, 2,236,169, 32,
- 61, 0, 0, 5, 0, 0, 0,240, 63, 22,202,215, 62,241,124,237, 63, 21,202, 11, 62,236,189, 1, 63, 22, 89, 13, 62,236,196,247,
- 63, 23, 38,157, 62,240,173,225, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,225,181, 8, 62,236, 22,234, 62,226,211, 12,
- 62,236, 14,246, 62,224,209,112, 62,240,206,226, 62,224, 25,234, 62,239,255,214, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240,
- 63, 21,202, 11, 62,236,189, 1, 63, 22,195, 22, 62,232, 90,195, 63, 23, 33, 88, 62,233, 47, 69, 63, 22, 89, 13, 62,236,196,247,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,224, 36,112, 62,232,129, 58, 62,224,224,248, 62,231,172,182, 62,226,211, 12,
- 62,236, 14,246, 62,225,181, 8, 62,236, 22,234, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 22,195, 22, 62,232, 90,195,
- 63, 24,252, 87, 62,230,111, 93, 63, 24,243,100, 62,231,123, 5, 63, 23, 33, 88, 62,233, 47, 69, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,240, 62,220,128, 90, 62,230,204,248, 62,220,110,118, 62,229,193, 78, 62,224,224,248, 62,231,172,182, 62,224, 36,112,
- 62,232,129, 58, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240, 63, 24,252, 87, 62,230,111, 93, 63, 27,124,224, 62,232, 65,235,
- 63, 27, 37,169, 62,232,211, 35, 63, 24,243,100, 62,231,123, 5, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,216, 27,206,
- 62,232, 37, 22, 62,215,109,102, 62,231,147,222, 62,220,110,118, 62,229,193, 78, 62,220,128, 90, 62,230,204,248, 2,236,169, 32,
- 61, 0, 0, 5, 0, 0, 0,240, 63, 27,124,224, 62,232, 65,235, 63, 28,112, 3, 62,236,178,185, 63, 27,249,140, 62,236,186,115,
- 63, 27, 37,169, 62,232,211, 35, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,214,116, 8, 62,236, 12,102, 62,213,135, 28,
- 62,236, 4,172, 62,215,109,102, 62,231,147,222, 62,216, 27,206, 62,232, 37, 22, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,240,
- 63, 24,242,138, 62,236,194, 21, 63, 27, 37,169, 62,232,211, 35, 63, 27,249,140, 62,236,186,115, 63,128, 0, 0, 63,128, 0, 0,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,112, 62,214,116, 8, 62,236, 12,102, 62,216, 27,206, 62,232, 37, 22, 62,220,130, 16,
- 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,112, 63, 24,243,100, 62,231,123, 5,
- 63, 27, 37,169, 62,232,211, 35, 63, 24,242,138, 62,236,194, 21, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,112, 62,220,130, 16, 62,236, 20, 6, 62,216, 27,206, 62,232, 37, 22, 62,220,128, 90, 62,230,204,248, 63,128, 0, 0,
- 63,128, 0, 0, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21, 63, 23, 33, 88, 62,233, 47, 69,
- 63, 24,243,100, 62,231,123, 5, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,112, 62,220,128, 90,
- 62,230,204,248, 62,224, 36,112, 62,232,129, 58, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32,
- 61, 0, 0, 5, 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21, 63, 22, 89, 13, 62,236,196,247, 63, 23, 33, 88, 62,233, 47, 69,
- 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,112, 62,224, 36,112, 62,232,129, 58, 62,225,181, 8,
- 62,236, 22,234, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,112,
- 63, 24,242,138, 62,236,194, 21, 63, 23, 38,157, 62,240,173,225, 63, 22, 89, 13, 62,236,196,247, 63,128, 0, 0, 63,128, 0, 0,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,112, 62,225,181, 8, 62,236, 22,234, 62,224, 25,234, 62,239,255,214, 62,220,130, 16,
- 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21,
- 63, 24,248, 6, 62,242, 91,185, 63, 23, 38,157, 62,240,173,225, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,112, 62,224, 25,234, 62,239,255,214, 62,220,119, 22, 62,241,173,174, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0,
- 63,128, 0, 0, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21, 63, 27, 39, 42, 62,241, 1, 57,
- 63, 24,248, 6, 62,242, 91,185, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,112, 62,220,119, 22,
- 62,241,173,174, 62,216, 24,206, 62,240, 83, 46, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32,
- 61, 0, 0, 5, 0, 0, 0,112, 63, 24,242,138, 62,236,194, 21, 63, 27,249,140, 62,236,186,115, 63, 27, 39, 42, 62,241, 1, 57,
- 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,112, 62,216, 24,206, 62,240, 83, 46, 62,214,116, 8,
- 62,236, 12,102, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 61, 0, 0, 5, 0, 0, 0,112,
- 63, 16,254,174, 62, 34, 45, 94, 63, 13,190, 79, 62, 46,193,160, 63, 3,199,220, 62, 24,219, 89, 63, 3,199,219, 61,229, 28, 18,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16, 63, 3,199,220, 62, 24,219, 89, 62,243,150, 14, 62, 47, 79,204, 62,236,248,140,
- 62, 34,202,182, 63, 3,199,219, 61,229, 28, 18, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64, 63, 21,152,184, 62, 53, 47,182,
- 63, 16,104,250, 62, 55,113, 16, 63, 13,190, 79, 62, 46,193,160, 63, 16,254,174, 62, 34, 45, 94, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,128, 62,243,150, 14, 62, 47, 79,204, 62,238, 68,200, 62, 56, 62, 76, 62,227,207,183, 62, 54, 75,250, 62,236,248,140,
- 62, 34,202,182, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 63, 22, 57,137, 62, 61, 93, 81, 63, 16,186,206, 62, 72,129, 85,
- 63, 16,104,250, 62, 55,113, 16, 63, 21,152,184, 62, 53, 47,182, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,238, 68,200,
- 62, 56, 62, 76, 62,237,187,192, 62, 73,118,194, 62,226,152,122, 62, 62,166,190, 62,227,207,183, 62, 54, 75,250, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 22,249,250, 62, 88,251,160, 63, 16, 32,222, 62, 93,106, 34, 63, 16,186,206, 62, 72,129, 85,
- 63, 22, 57,137, 62, 61, 93, 81, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,237,187,192, 62, 73,118,194, 62,239, 19, 21,
- 62, 94,110,121, 62,225, 83, 90, 62, 90,153, 21, 62,226,152,122, 62, 62,166,190, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 25, 81, 20, 62,132, 56, 17, 63, 15,243,206, 62,136,207,182, 63, 16, 32,222, 62, 93,106, 34, 63, 22,249,250, 62, 88,251,160,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,239, 19, 21, 62, 94,110,121, 62,239,193, 92, 62,137, 61,113, 62,221, 42, 54,
- 62,133, 25,209, 62,225, 83, 90, 62, 90,153, 21, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,239,111, 62,166, 77,159,
- 63, 37, 94, 91, 62,187,120,107, 63, 30, 21, 66, 62,200,139,178, 63, 12,237,158, 62,187,241, 38, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,211,125,139, 62,200,171,170, 62,197, 28,156, 62,187,130,166, 62,216, 21,115, 62,166,177, 14, 62,245,175, 15,
- 62,188, 14,188, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 37, 94, 91, 62,187,120,107, 63, 43, 57, 87, 62,206, 58,222,
- 63, 39,163, 24, 62,216, 95,174, 63, 30, 21, 66, 62,200,139,178, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,191,194, 98,
- 62,216, 94, 42, 62,184,207,130, 62,206, 27, 42, 62,197, 28,156, 62,187,130,166, 62,211,125,139, 62,200,171,170, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 43, 57, 87, 62,206, 58,222, 63, 50,229, 38, 62,226, 32,169, 63, 43, 79,177, 62,231,194,202,
- 63, 39,163, 24, 62,216, 95,174, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,183,201, 60, 62,231,218, 82, 62,168, 39,196,
- 62,226, 11,206, 62,184,207,130, 62,206, 27, 42, 62,191,194, 98, 62,216, 94, 42, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 50,229, 38, 62,226, 32,169, 63, 48,134, 62, 62,249,107, 37, 63, 43,190,154, 62,249, 0,192, 63, 43, 79,177, 62,231,194,202,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,182,190,138, 62,249, 49, 35, 62,172,229,172, 62,249,127,116, 62,168, 39,196,
- 62,226, 11,206, 62,183,201, 60, 62,231,218, 82, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 48,134, 62, 62,249,107, 37,
- 63, 46, 88,238, 63, 2,223,146, 63, 40,207,123, 62,254,175,218, 63, 43,190,154, 62,249, 0,192, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,188,184, 2, 62,255, 0,140, 62,177, 87,173, 63, 3, 9,102, 62,172,229,172, 62,249,127,116, 62,182,190,138,
- 62,249, 49, 35, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 46, 88,238, 63, 2,223,146, 63, 34,158,220, 63, 10, 23,175,
- 63, 30, 77,126, 63, 5, 88,156, 63, 40,207,123, 62,254,175,218, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,210, 65, 89,
- 63, 5,158, 56, 62,201,109,124, 63, 10,121, 72, 62,177, 87,173, 63, 3, 9,102, 62,188,184, 2, 62,255, 0,140, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 34,158,220, 63, 10, 23,175, 63, 26,105, 28, 63, 11,194,242, 63, 25,120,244, 63, 7,242, 78,
- 63, 30, 77,126, 63, 5, 88,156, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,220, 39, 0, 63, 8, 58,252, 62,218, 73,220,
- 63, 12, 31,169, 62,201,109,124, 63, 10,121, 72, 62,210, 65, 89, 63, 5,158, 56, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 26,105, 28, 63, 11,194,242, 63, 22,244,173, 63, 11,215,236, 63, 22, 47,202, 63, 8, 60,156, 63, 25,120,244, 63, 7,242, 78,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,226,221, 11, 63, 8,125, 90, 62,225, 89,220, 63, 12, 42, 77, 62,218, 73,220,
- 63, 12, 31,169, 62,220, 39, 0, 63, 8, 58,252, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22,244,173, 63, 11,215,236,
- 63, 11,169, 67, 63, 11,197, 18, 63, 12,252,106, 63, 3,173,180, 63, 22, 47,202, 63, 8, 60,156, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,245,114, 35, 63, 3,196,233, 62,248, 72, 55, 63, 11,232, 91, 62,225, 89,220, 63, 12, 42, 77, 62,226,221, 11,
- 63, 8,125, 90, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 11,169, 67, 63, 11,197, 18, 63, 3,232,148, 63, 11, 17,164,
- 63, 3,220,162, 63, 0, 88, 45, 63, 12,252,106, 63, 3,173,180, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,220,162,
- 63, 0, 88, 45, 63, 3,232,148, 63, 11, 17,164, 62,248, 72, 55, 63, 11,232, 91, 62,245,114, 35, 63, 3,196,233, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 17, 59,103, 62,255,195,120, 63, 22, 81,240, 63, 1, 70,114, 63, 22, 47,202, 63, 8, 60,156,
- 63, 12,252,106, 63, 3,173,180, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,226,221, 11, 63, 8,125, 90, 62,226,128,106,
- 63, 1,111,198, 62,236,213,209, 62,255,250, 4, 62,245,114, 35, 63, 3,196,233, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 22, 81,240, 63, 1, 70,114, 63, 25,182,151, 63, 1, 9,130, 63, 25,120,244, 63, 7,242, 78, 63, 22, 47,202, 63, 8, 60,156,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,220, 39, 0, 63, 8, 58,252, 62,219,150,213, 63, 1, 55, 50, 62,226,128,106,
- 63, 1,111,198, 62,226,221, 11, 63, 8,125, 90, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 30, 49, 96, 62,254,229,121,
- 63, 30, 77,126, 63, 5, 88,156, 63, 25,120,244, 63, 7,242, 78, 63, 25,182,151, 63, 1, 9,130, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,220, 39, 0, 63, 8, 58,252, 62,210, 65, 89, 63, 5,158, 56, 62,210,116,176, 62,255, 62,227, 62,219,150,213,
- 63, 1, 55, 50, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 37,113, 25, 62,247,157, 35, 63, 40,207,123, 62,254,175,218,
- 63, 30, 77,126, 63, 5, 88,156, 63, 30, 49, 96, 62,254,229,121, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,210, 65, 89,
- 63, 5,158, 56, 62,188,184, 2, 62,255, 0,140, 62,195,165,189, 62,247,232,139, 62,210,116,176, 62,255, 62,227, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 39, 62, 92, 62,240, 75,121, 63, 43,190,154, 62,249, 0,192, 63, 40,207,123, 62,254,175,218,
- 63, 37,113, 25, 62,247,157, 35, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,188,184, 2, 62,255, 0,140, 62,182,190,138,
- 62,249, 49, 35, 62,192, 10,222, 62,240,128,163, 62,195,165,189, 62,247,232,139, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 38,149,140, 62,229, 95, 38, 63, 43, 79,177, 62,231,194,202, 63, 43,190,154, 62,249, 0,192, 63, 39, 62, 92, 62,240, 75,121,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,182,190,138, 62,249, 49, 35, 62,183,201, 60, 62,231,218, 82, 62,193,140,168,
- 62,229,129, 94, 62,192, 10,222, 62,240,128,163, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 33,120, 14, 62,214,238,166,
- 63, 39,163, 24, 62,216, 95,174, 63, 43, 79,177, 62,231,194,202, 63, 38,149,140, 62,229, 95, 38, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,183,201, 60, 62,231,218, 82, 62,191,194, 98, 62,216, 94, 42, 62,204, 75,168, 62,215, 7, 62, 62,193,140,168,
- 62,229,129, 94, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,178,165, 62,208, 17,128, 63, 30, 21, 66, 62,200,139,178,
- 63, 39,163, 24, 62,216, 95,174, 63, 33,120, 14, 62,214,238,166, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,191,194, 98,
- 62,216, 94, 42, 62,211,125,139, 62,200,171,170, 62,216, 24, 6, 62,208, 57,128, 62,204, 75,168, 62,215, 7, 62, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 17, 97, 15, 62,214, 34,220, 63, 12,237,158, 62,187,241, 38, 63, 30, 21, 66, 62,200,139,178,
- 63, 27,178,165, 62,208, 17,128, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,211,125,139, 62,200,171,170, 62,245,175, 15,
- 62,188, 14,188, 62,236,200,217, 62,214, 49,134, 62,216, 24, 6, 62,208, 57,128, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 17, 97, 15, 62,214, 34,220, 63, 14,244,149, 62,221, 42, 4, 63, 3,230,147, 62,208, 47, 78, 63, 12,237,158, 62,187,241, 38,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,230,147, 62,208, 47, 78, 62,241,144,141, 62,221, 52,244, 62,236,200,217,
- 62,214, 49,134, 62,245,175, 15, 62,188, 14,188, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 17, 59,103, 62,255,195,120,
- 63, 12,252,106, 63, 3,173,180, 63, 3,220,162, 63, 0, 88, 45, 63, 13, 25, 71, 62,243,163,116, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 3,220,162, 63, 0, 88, 45, 62,245,114, 35, 63, 3,196,233, 62,236,213,209, 62,255,250, 4, 62,245, 45, 0,
- 62,243,185,206, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 13, 25, 71, 62,243,163,116, 63, 3,220,162, 63, 0, 88, 45,
- 63, 3,220,215, 62,231,189,148, 63, 13, 2, 64, 62,230,215, 52, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,220,215,
- 62,231,189,148, 63, 3,220,162, 63, 0, 88, 45, 62,245, 45, 0, 62,243,185,206, 62,245,100,219, 62,230,230,184, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,230,147, 62,208, 47, 78, 63, 14,244,149, 62,221, 42, 4, 63, 13, 2, 64, 62,230,215, 52,
- 63, 3,220,215, 62,231,189,148, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,245,100,219, 62,230,230,184, 62,241,144,141,
- 62,221, 52,244, 63, 3,230,147, 62,208, 47, 78, 63, 3,220,215, 62,231,189,148, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 7, 61,250, 62, 54, 31,148, 63, 3,202,193, 62, 49,174,214, 63, 3,199,220, 62, 24,219, 89, 63, 13,190, 79, 62, 46,193,160,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,199,220, 62, 24,219, 89, 63, 3,202,193, 62, 49,174,214, 63, 0, 87,175,
- 62, 54, 90,251, 62,243,150, 14, 62, 47, 79,204, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 9,214, 68, 62, 66,237,246,
- 63, 7, 61,250, 62, 54, 31,148, 63, 13,190, 79, 62, 46,193,160, 63, 16,104,250, 62, 55,113, 16, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,243,150, 14, 62, 47, 79,204, 63, 0, 87,175, 62, 54, 90,251, 62,251,137,104, 62, 67, 92,179, 62,238, 68,200,
- 62, 56, 62, 76, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 8,221,237, 62, 91, 90,218, 63, 9,214, 68, 62, 66,237,246,
- 63, 16,104,250, 62, 55,113, 16, 63, 16,186,206, 62, 72,129, 85, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,238, 68,200,
- 62, 56, 62, 76, 62,251,137,104, 62, 67, 92,179, 62,253,153, 39, 62, 91,195, 27, 62,237,187,192, 62, 73,118,194, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 15,243,206, 62,136,207,182, 63, 8, 32, 77, 62,139, 39, 10, 63, 9,117, 22, 62, 97,203,146,
- 63, 16, 32,222, 62, 93,106, 34, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,252,110,192, 62, 98, 68, 79, 62,255, 89,219,
- 62,139, 79,116, 62,239,193, 92, 62,137, 61,113, 62,239, 19, 21, 62, 94,110,121, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 8,221,237, 62, 91, 90,218, 63, 16,186,206, 62, 72,129, 85, 63, 16, 32,222, 62, 93,106, 34, 63, 9,117, 22, 62, 97,203,146,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,239, 19, 21, 62, 94,110,121, 62,237,187,192, 62, 73,118,194, 62,253,153, 39,
- 62, 91,195, 27, 62,252,110,192, 62, 98, 68, 79, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 9,125,119, 62,158,112, 7,
- 63, 3,233, 70, 62,154, 27, 88, 63, 3,229,235, 62,139,108, 97, 63, 8, 32, 77, 62,139, 39, 10, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 3,229,235, 62,139,108, 97, 63, 3,233, 70, 62,154, 27, 88, 62,252,179,165, 62,158,140,163, 62,255, 89,219,
- 62,139, 79,116, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 9,117, 22, 62, 97,203,146, 63, 8, 32, 77, 62,139, 39, 10,
- 63, 3,229,235, 62,139,108, 97, 63, 3,215,246, 62,101, 56,143, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,229,235,
- 62,139,108, 97, 62,255, 89,219, 62,139, 79,116, 62,252,110,192, 62, 98, 68, 79, 63, 3,215,246, 62,101, 56,143, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,210,147, 62, 86, 95,221, 63, 8,221,237, 62, 91, 90,218, 63, 9,117, 22, 62, 97,203,146,
- 63, 3,215,246, 62,101, 56,143, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,252,110,192, 62, 98, 68, 79, 62,253,153, 39,
- 62, 91,195, 27, 63, 3,210,147, 62, 86, 95,221, 63, 3,215,246, 62,101, 56,143, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 12, 54, 5, 62,167,183,188, 63, 9, 61,250, 62,168,214,252, 63, 8,143,152, 62,163,107, 45, 63, 9,125,119, 62,158,112, 7,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,254,136,100, 62,163,123, 38, 62,253, 39,110, 62,168,224,103, 62,247, 68, 98,
- 62,167,206,146, 62,252,179,165, 62,158,140,163, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 10,196,135, 62,178,208, 52,
- 63, 8,233, 25, 62,175,110,116, 63, 9, 61,250, 62,168,214,252, 63, 12, 54, 5, 62,167,183,188, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,253, 39,110, 62,168,224,103, 62,253,195,102, 62,175,102,184, 62,250, 14, 98, 62,178,202,149, 62,247, 68, 98,
- 62,167,206,146, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 4, 17, 69, 62,182,176,105, 63, 6,138, 69, 62,177,180, 80,
- 63, 8,233, 25, 62,175,110,116, 63, 10,196,135, 62,178,208, 52, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,253,195,102,
- 62,175,102,184, 63, 1, 49, 14, 62,177,150, 62, 63, 4, 17, 69, 62,182,176,105, 62,250, 14, 98, 62,178,202,149, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,124,209, 62,177, 0, 70, 63, 3,232, 11, 62,174, 4,140, 63, 6,138, 69, 62,177,180, 80,
- 63, 4, 17, 69, 62,182,176,105, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 49, 14, 62,177,150, 62, 63, 3,232, 11,
- 62,174, 4,140, 63, 3,124,209, 62,177, 0, 70, 63, 4, 17, 69, 62,182,176,105, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 3,233, 70, 62,154, 27, 88, 63, 9,125,119, 62,158,112, 7, 63, 8,143,152, 62,163,107, 45, 63, 3,232,212, 62,158,152, 58,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,254,136,100, 62,163,123, 38, 62,252,179,165, 62,158,140,163, 63, 3,233, 70,
- 62,154, 27, 88, 63, 3,232,212, 62,158,152, 58, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,232,212, 62,158,152, 58,
- 63, 8,143,152, 62,163,107, 45, 63, 7, 91,121, 62,166, 51,134, 63, 3,231,205, 62,162,149, 58, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 0,116, 44, 62,166, 56,255, 62,254,136,100, 62,163,123, 38, 63, 3,232,212, 62,158,152, 58, 63, 3,231,205,
- 62,162,149, 58, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,232, 11, 62,174, 4,140, 63, 3,233,214, 62,170,154,198,
- 63, 6,110,233, 62,174,152, 94, 63, 6,138, 69, 62,177,180, 80, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 82,228,
- 62,174,140, 95, 63, 3,233,214, 62,170,154,198, 63, 3,232, 11, 62,174, 4,140, 63, 1, 49, 14, 62,177,150, 62, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 6,138, 69, 62,177,180, 80, 63, 6,110,233, 62,174,152, 94, 63, 7,236, 59, 62,173,123, 19,
- 63, 8,233, 25, 62,175,110,116, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,255,185,217, 62,173,116, 92, 63, 1, 82,228,
- 62,174,140, 95, 63, 1, 49, 14, 62,177,150, 62, 62,253,195,102, 62,175,102,184, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 8,233, 25, 62,175,110,116, 63, 7,236, 59, 62,173,123, 19, 63, 7,249, 85, 62,169, 52, 92, 63, 9, 61,250, 62,168,214,252,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,255,169,160, 62,169, 57, 6, 62,255,185,217, 62,173,116, 92, 62,253,195,102,
- 62,175,102,184, 62,253, 39,110, 62,168,224,103, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 9, 61,250, 62,168,214,252,
- 63, 7,249, 85, 62,169, 52, 92, 63, 7, 91,121, 62,166, 51,134, 63, 8,143,152, 62,163,107, 45, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 0,116, 44, 62,166, 56,255, 62,255,169,160, 62,169, 57, 6, 62,253, 39,110, 62,168,224,103, 62,254,136,100,
- 62,163,123, 38, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,233,214, 62,170,154,198, 63, 7,249, 85, 62,169, 52, 92,
- 63, 7,236, 59, 62,173,123, 19, 63, 6,110,233, 62,174,152, 94, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,255,185,217,
- 62,173,116, 92, 62,255,169,160, 62,169, 57, 6, 63, 3,233,214, 62,170,154,198, 63, 1, 82,228, 62,174,140, 95, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,233,214, 62,170,154,198, 63, 3,231,205, 62,162,149, 58, 63, 7, 91,121, 62,166, 51,134,
- 63, 7,249, 85, 62,169, 52, 92, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 0,116, 44, 62,166, 56,255, 63, 3,231,205,
- 62,162,149, 58, 63, 3,233,214, 62,170,154,198, 62,255,169,160, 62,169, 57, 6, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 4, 17, 69, 62,182,176,105, 63, 10,196,135, 62,178,208, 52, 63, 12,237,158, 62,187,241, 38, 63, 3,230,147, 62,208, 47, 78,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,245,175, 15, 62,188, 14,188, 62,250, 14, 98, 62,178,202,149, 63, 4, 17, 69,
- 62,182,176,105, 63, 3,230,147, 62,208, 47, 78, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 10,196,135, 62,178,208, 52,
- 63, 12, 54, 5, 62,167,183,188, 63, 16, 0,112, 62,164,246,254, 63, 12,237,158, 62,187,241, 38, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,239,187,207, 62,165, 42, 19, 62,247, 68, 98, 62,167,206,146, 62,250, 14, 98, 62,178,202,149, 62,245,175, 15,
- 62,188, 14,188, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 12, 54, 5, 62,167,183,188, 63, 9,125,119, 62,158,112, 7,
- 63, 15,250, 44, 62,154, 0,109, 63, 16, 0,112, 62,164,246,254, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,239,205, 56,
- 62,154, 71, 8, 62,252,179,165, 62,158,140,163, 62,247, 68, 98, 62,167,206,146, 62,239,187,207, 62,165, 42, 19, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 9,125,119, 62,158,112, 7, 63, 8, 32, 77, 62,139, 39, 10, 63, 15,243,206, 62,136,207,182,
- 63, 15,250, 44, 62,154, 0,109, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,239,193, 92, 62,137, 61,113, 62,255, 89,219,
- 62,139, 79,116, 62,252,179,165, 62,158,140,163, 62,239,205, 56, 62,154, 71, 8, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 25, 81, 20, 62,132, 56, 17, 63, 27, 46,208, 62,148, 35,149, 63, 15,250, 44, 62,154, 0,109, 63, 15,243,206, 62,136,207,182,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,239,205, 56, 62,154, 71, 8, 62,217,166,238, 62,148,221,229, 62,221, 42, 54,
- 62,133, 25,209, 62,239,193, 92, 62,137, 61,113, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27, 46,208, 62,148, 35,149,
- 63, 27,177, 36, 62,156,151,158, 63, 16, 0,112, 62,164,246,254, 63, 15,250, 44, 62,154, 0,109, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,239,187,207, 62,165, 42, 19, 62,216,160, 0, 62,157, 44,127, 62,217,166,238, 62,148,221,229, 62,239,205, 56,
- 62,154, 71, 8, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,239,111, 62,166, 77,159, 63, 12,237,158, 62,187,241, 38,
- 63, 16, 0,112, 62,164,246,254, 63, 27,177, 36, 62,156,151,158, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,239,187,207,
- 62,165, 42, 19, 62,245,175, 15, 62,188, 14,188, 62,216, 21,115, 62,166,177, 14, 62,216,160, 0, 62,157, 44,127, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 8,221,237, 62, 91, 90,218, 63, 3,210,147, 62, 86, 95,221, 63, 3,211,129, 62, 83,168,248,
- 63, 8, 33,170, 62, 86,149,254, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,211,129, 62, 83,168,248, 63, 3,210,147,
- 62, 86, 95,221, 62,253,153, 39, 62, 91,195, 27, 62,255, 14, 8, 62, 86,232, 58, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 9,214, 68, 62, 66,237,246, 63, 8,221,237, 62, 91, 90,218, 63, 8, 33,170, 62, 86,149,254, 63, 8,180, 20, 62, 69, 29, 94,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,255, 14, 8, 62, 86,232, 58, 62,253,153, 39, 62, 91,195, 27, 62,251,137,104,
- 62, 67, 92,179, 62,253,210, 19, 62, 69,114, 55, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 7, 61,250, 62, 54, 31,148,
- 63, 9,214, 68, 62, 66,237,246, 63, 8,180, 20, 62, 69, 29, 94, 63, 6, 82,168, 62, 57, 43, 80, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,253,210, 19, 62, 69,114, 55, 62,251,137,104, 62, 67, 92,179, 63, 0, 87,175, 62, 54, 90,251, 63, 1, 68, 48,
- 62, 57, 84,166, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,202,193, 62, 49,174,214, 63, 7, 61,250, 62, 54, 31,148,
- 63, 6, 82,168, 62, 57, 43, 80, 63, 3,202,205, 62, 54, 22, 8, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 68, 48,
- 62, 57, 84,166, 63, 0, 87,175, 62, 54, 90,251, 63, 3,202,193, 62, 49,174,214, 63, 3,202,205, 62, 54, 22, 8, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,202,205, 62, 54, 22, 8, 63, 6, 82,168, 62, 57, 43, 80, 63, 5, 24,246, 62, 66,150, 26,
- 63, 3,205,213, 62, 64,232,220, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 2,131, 29, 62, 66,172, 22, 63, 1, 68, 48,
- 62, 57, 84,166, 63, 3,202,205, 62, 54, 22, 8, 63, 3,205,213, 62, 64,232,220, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 6, 82,168, 62, 57, 43, 80, 63, 8,180, 20, 62, 69, 29, 94, 63, 6, 83, 39, 62, 70,114,191, 63, 5, 24,246, 62, 66,150, 26,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 75,185, 62, 70,160,222, 62,253,210, 19, 62, 69,114, 55, 63, 1, 68, 48,
- 62, 57, 84,166, 63, 2,131, 29, 62, 66,172, 22, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 8,180, 20, 62, 69, 29, 94,
- 63, 8, 33,170, 62, 86,149,254, 63, 6,111, 4, 62, 76,172, 40, 63, 6, 83, 39, 62, 70,114,191, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 63, 1, 51,157, 62, 76,218,158, 62,255, 14, 8, 62, 86,232, 58, 62,253,210, 19, 62, 69,114, 55, 63, 1, 75,185,
- 62, 70,160,222, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 8, 33,170, 62, 86,149,254, 63, 3,211,129, 62, 83,168,248,
- 63, 3,208,234, 62, 75, 43,146, 63, 6,111, 4, 62, 76,172, 40, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,208,234,
- 62, 75, 43,146, 63, 3,211,129, 62, 83,168,248, 62,255, 14, 8, 62, 86,232, 58, 63, 1, 51,157, 62, 76,218,158, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,208,234, 62, 75, 43,146, 63, 3,205,213, 62, 64,232,220, 63, 5, 24,246, 62, 66,150, 26,
- 63, 6,111, 4, 62, 76,172, 40, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 2,131, 29, 62, 66,172, 22, 63, 3,205,213,
- 62, 64,232,220, 63, 3,208,234, 62, 75, 43,146, 63, 1, 51,157, 62, 76,218,158, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 6,111, 4, 62, 76,172, 40, 63, 5, 24,246, 62, 66,150, 26, 63, 6, 83, 39, 62, 70,114,191, 63,128, 0, 0, 63,128, 0, 0,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 1, 75,185, 62, 70,160,222, 63, 2,131, 29, 62, 66,172, 22, 63, 1, 51,157,
- 62, 76,218,158, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 13, 2, 64, 62,230,215, 52,
- 63, 14,244,149, 62,221, 42, 4, 63, 16,216, 4, 62,224, 24,160, 63, 15,200,120, 62,231,255, 84, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,237,193,119, 62,224, 38,190, 62,241,144,141, 62,221, 52,244, 62,245,100,219, 62,230,230,184, 62,239,211, 21,
- 62,232, 18,185, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 13, 25, 71, 62,243,163,116, 63, 13, 2, 64, 62,230,215, 52,
- 63, 15,200,120, 62,231,255, 84, 63, 16,171,184, 62,241,133, 40, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,239,211, 21,
- 62,232, 18,185, 62,245,100,219, 62,230,230,184, 62,245, 45, 0, 62,243,185,206, 62,237,252,218, 62,241,160, 62, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 17, 59,103, 62,255,195,120, 63, 13, 25, 71, 62,243,163,116, 63, 16,171,184, 62,241,133, 40,
- 63, 19, 44, 55, 62,250, 21, 86, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,237,252,218, 62,241,160, 62, 62,245, 45, 0,
- 62,243,185,206, 62,236,213,209, 62,255,250, 4, 62,232,228,153, 62,250, 67,154, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 14,244,149, 62,221, 42, 4, 63, 17, 97, 15, 62,214, 34,220, 63, 19, 53,217, 62,218,211, 16, 63, 16,216, 4, 62,224, 24,160,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,233, 14, 8, 62,218,226, 66, 62,236,200,217, 62,214, 49,134, 62,241,144,141,
- 62,221, 52,244, 62,237,193,119, 62,224, 38,190, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 17, 97, 15, 62,214, 34,220,
- 63, 27,178,165, 62,208, 17,128, 63, 26,198,205, 62,214,184,124, 63, 19, 53,217, 62,218,211, 16, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,217,214,216, 62,214,224,218, 62,216, 24, 6, 62,208, 57,128, 62,236,200,217, 62,214, 49,134, 62,233, 14, 8,
- 62,218,226, 66, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,178,165, 62,208, 17,128, 63, 33,120, 14, 62,214,238,166,
- 63, 31,136,156, 62,219,138,194, 63, 26,198,205, 62,214,184,124, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,208, 30,254,
- 62,219,177,204, 62,204, 75,168, 62,215, 7, 62, 62,216, 24, 6, 62,208, 57,128, 62,217,214,216, 62,214,224,218, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 33,120, 14, 62,214,238,166, 63, 38,149,140, 62,229, 95, 38, 63, 36, 9, 79, 62,229,224, 94,
- 63, 31,136,156, 62,219,138,194, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,198,192,148, 62,230, 11,182, 62,193,140,168,
- 62,229,129, 94, 62,204, 75,168, 62,215, 7, 62, 62,208, 30,254, 62,219,177,204, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 38,149,140, 62,229, 95, 38, 63, 39, 62, 92, 62,240, 75,121, 63, 36, 49, 14, 62,239, 88,253, 63, 36, 9, 79, 62,229,224, 94,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,198, 71, 97, 62,239,149,192, 62,192, 10,222, 62,240,128,163, 62,193,140,168,
- 62,229,129, 94, 62,198,192,148, 62,230, 11,182, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 39, 62, 92, 62,240, 75,121,
- 63, 37,113, 25, 62,247,157, 35, 63, 35, 33,243, 62,245,143, 80, 63, 36, 49, 14, 62,239, 88,253, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,200, 99, 87, 62,245,217,172, 62,195,165,189, 62,247,232,139, 62,192, 10,222, 62,240,128,163, 62,198, 71, 97,
- 62,239,149,192, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 37,113, 25, 62,247,157, 35, 63, 30, 49, 96, 62,254,229,121,
- 63, 29, 49,223, 62,250,140,199, 63, 35, 33,243, 62,245,143, 80, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,212,124,147,
- 62,250,215,146, 62,210,116,176, 62,255, 62,227, 62,195,165,189, 62,247,232,139, 62,200, 99, 87, 62,245,217,172, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 30, 49, 96, 62,254,229,121, 63, 25,182,151, 63, 1, 9,130, 63, 25,181, 50, 62,253,111,118,
- 63, 29, 49,223, 62,250,140,199, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,219,151, 52, 62,253,186, 68, 62,219,150,213,
- 63, 1, 55, 50, 62,210,116,176, 62,255, 62,227, 62,212,124,147, 62,250,215,146, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 25,182,151, 63, 1, 9,130, 63, 22, 81,240, 63, 1, 70,114, 63, 22,188,241, 62,253,149, 28, 63, 25,181, 50, 62,253,111,118,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,225,163,212, 62,253,215, 91, 62,226,128,106, 63, 1,111,198, 62,219,150,213,
- 63, 1, 55, 50, 62,219,151, 52, 62,253,186, 68, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22, 81,240, 63, 1, 70,114,
- 63, 17, 59,103, 62,255,195,120, 63, 19, 44, 55, 62,250, 21, 86, 63, 22,188,241, 62,253,149, 28, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,232,228,153, 62,250, 67,154, 62,236,213,209, 62,255,250, 4, 62,226,128,106, 63, 1,111,198, 62,225,163,212,
- 62,253,215, 91, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22,188,241, 62,253,149, 28, 63, 19, 44, 55, 62,250, 21, 86,
- 63, 20,165, 9, 62,247, 99,248, 63, 23, 0, 20, 62,251, 57, 6, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,229,232,232,
- 62,247,142, 74, 62,232,228,153, 62,250, 67,154, 62,225,163,212, 62,253,215, 91, 62,225, 26,145, 62,251,116,114, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 25,181, 50, 62,253,111,118, 63, 22,188,241, 62,253,149, 28, 63, 23, 0, 20, 62,251, 57, 6,
- 63, 25,144,130, 62,251, 7,128, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,225, 26,145, 62,251,116,114, 62,225,163,212,
- 62,253,215, 91, 62,219,151, 52, 62,253,186, 68, 62,219,225,177, 62,251, 75, 67, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 29, 49,223, 62,250,140,199, 63, 25,181, 50, 62,253,111,118, 63, 25,144,130, 62,251, 7,128, 63, 28,195, 80, 62,248,166, 55,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,219,225,177, 62,251, 75, 67, 62,219,151, 52, 62,253,186, 68, 62,212,124,147,
- 62,250,215,146, 62,213, 95,233, 62,248,237, 20, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 35, 33,243, 62,245,143, 80,
- 63, 29, 49,223, 62,250,140,199, 63, 28,195, 80, 62,248,166, 55, 63, 33,164, 22, 62,243, 75,102, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,213, 95,233, 62,248,237, 20, 62,212,124,147, 62,250,215,146, 62,200, 99, 87, 62,245,217,172, 62,203,114, 65,
- 62,243,143,159, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 36, 49, 14, 62,239, 88,253, 63, 35, 33,243, 62,245,143, 80,
- 63, 33,164, 22, 62,243, 75,102, 63, 34,160, 30, 62,238, 47,169, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,203,114, 65,
- 62,243,143,159, 62,200, 99, 87, 62,245,217,172, 62,198, 71, 97, 62,239,149,192, 62,201,128,188, 62,238,110,126, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 36, 9, 79, 62,229,224, 94, 63, 36, 49, 14, 62,239, 88,253, 63, 34,160, 30, 62,238, 47,169,
- 63, 34,144,131, 62,231, 87,253, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,201,128,188, 62,238,110,126, 62,198, 71, 97,
- 62,239,149,192, 62,198,192,148, 62,230, 11,182, 62,201,190,141, 62,231,140,124, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 31,136,156, 62,219,138,194, 63, 36, 9, 79, 62,229,224, 94, 63, 34,144,131, 62,231, 87,253, 63, 30,208, 21, 62,221,182,174,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,201,190,141, 62,231,140,124, 62,198,192,148, 62,230, 11,182, 62,208, 30,254,
- 62,219,177,204, 62,209,133,168, 62,221,221, 51, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 26,198,205, 62,214,184,124,
- 63, 31,136,156, 62,219,138,194, 63, 30,208, 21, 62,221,182,174, 63, 26,218,128, 62,217,206, 68, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,209,133,168, 62,221,221, 51, 62,208, 30,254, 62,219,177,204, 62,217,214,216, 62,214,224,218, 62,217,157, 11,
- 62,217,243, 64, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 19, 53,217, 62,218,211, 16, 63, 26,198,205, 62,214,184,124,
- 63, 26,218,128, 62,217,206, 68, 63, 20, 53,103, 62,221, 84,236, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,217,157, 11,
- 62,217,243, 64, 62,217,214,216, 62,214,224,218, 62,233, 14, 8, 62,218,226, 66, 62,231, 5, 68, 62,221,101,234, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 16,216, 4, 62,224, 24,160, 63, 19, 53,217, 62,218,211, 16, 63, 20, 53,103, 62,221, 84,236,
- 63, 18, 87, 81, 62,226,175, 33, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,231, 5, 68, 62,221,101,234, 62,233, 14, 8,
- 62,218,226, 66, 62,237,193,119, 62,224, 38,190, 62,234,187,180, 62,226,190,249, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 19, 44, 55, 62,250, 21, 86, 63, 16,171,184, 62,241,133, 40, 63, 18, 68, 98, 62,240,197,150, 63, 20,165, 9, 62,247, 99,248,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,234,197, 35, 62,240,226,215, 62,237,252,218, 62,241,160, 62, 62,232,228,153,
- 62,250, 67,154, 62,229,232,232, 62,247,142, 74, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 16,171,184, 62,241,133, 40,
- 63, 15,200,120, 62,231,255, 84, 63, 18, 4,161, 62,232,184,138, 63, 18, 68, 98, 62,240,197,150, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,235, 85,154, 62,232,206, 92, 62,239,211, 21, 62,232, 18,185, 62,237,252,218, 62,241,160, 62, 62,234,197, 35,
- 62,240,226,215, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 15,200,120, 62,231,255, 84, 63, 16,216, 4, 62,224, 24,160,
- 63, 18, 87, 81, 62,226,175, 33, 63, 18, 4,161, 62,232,184,138, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,234,187,180,
- 62,226,190,249, 62,237,193,119, 62,224, 38,190, 62,239,211, 21, 62,232, 18,185, 62,235, 85,154, 62,232,206, 92, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 3,232,148, 63, 11, 17,164, 63, 11,169, 67, 63, 11,197, 18, 63, 13,120,216, 63, 23, 81,160,
- 63, 4, 15,147, 63, 23,248,227, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,245, 27, 64, 63, 23,166,100, 62,248, 72, 55,
- 63, 11,232, 91, 63, 3,232,148, 63, 11, 17,164, 63, 4, 15,147, 63, 23,248,227, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 11,169, 67, 63, 11,197, 18, 63, 22,244,173, 63, 11,215,236, 63, 23,233, 94, 63, 16, 60,186, 63, 13,120,216, 63, 23, 81,160,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,223,130,109, 63, 16,165,118, 62,225, 89,220, 63, 12, 42, 77, 62,248, 72, 55,
- 63, 11,232, 91, 62,245, 27, 64, 63, 23,166,100, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22,244,173, 63, 11,215,236,
- 63, 26,105, 28, 63, 11,194,242, 63, 28, 56,220, 63, 14,250, 66, 63, 23,233, 94, 63, 16, 60,186, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,214,161,157, 63, 15,110,219, 62,218, 73,220, 63, 12, 31,169, 62,225, 89,220, 63, 12, 42, 77, 62,223,130,109,
- 63, 16,165,118, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 26,105, 28, 63, 11,194,242, 63, 34,158,220, 63, 10, 23,175,
- 63, 39, 44,109, 63, 19,221,107, 63, 28, 56,220, 63, 14,250, 66, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,192, 26,156,
- 63, 20,139, 31, 62,201,109,124, 63, 10,121, 72, 62,218, 73,220, 63, 12, 31,169, 62,214,161,157, 63, 15,110,219, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 34,158,220, 63, 10, 23,175, 63, 46, 88,238, 63, 2,223,146, 63, 56, 80,242, 63, 6,244, 44,
- 63, 39, 44,109, 63, 19,221,107, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64, 62,156,208, 61, 63, 7, 16,204, 62,177, 87,173,
- 63, 3, 9,102, 62,201,109,124, 63, 10,121, 72, 62,192, 26,156, 63, 20,139, 31, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16,
- 63, 46, 88,238, 63, 2,223,146, 63, 48,134, 62, 62,249,107, 37, 63, 54,173,195, 62,252,106,239, 63, 56, 80,242, 63, 6,244, 44,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 62,160, 36,202, 62,252, 51, 94, 62,172,229,172, 62,249,127,116, 62,177, 87,173,
- 63, 3, 9,102, 62,156,208, 61, 63, 7, 16,204, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 63, 48,134, 62, 62,249,107, 37,
- 63, 50,229, 38, 62,226, 32,169, 63, 53, 88,154, 62,221,146,240, 63, 54,173,195, 62,252,106,239, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 64, 62,162,172,128, 62,221,169, 17, 62,168, 39,196, 62,226, 11,206, 62,172,229,172, 62,249,127,116, 62,160, 36,202,
- 62,252, 51, 94, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16, 63, 50,229, 38, 62,226, 32,169, 63, 43, 57, 87, 62,206, 58,222,
- 63, 49,117,240, 62,198,138,164, 63, 53, 88,154, 62,221,146,240, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 62,172,137,147,
- 62,198, 19,148, 62,184,207,130, 62,206, 27, 42, 62,168, 39,196, 62,226, 11,206, 62,162,172,128, 62,221,169, 17, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0,128, 63, 43, 57, 87, 62,206, 58,222, 63, 37, 94, 91, 62,187,120,107, 63, 41,160,156, 62,182,175, 56,
- 63, 49,117,240, 62,198,138,164, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,188,212,202, 62,182,163,245, 62,197, 28,156,
- 62,187,130,166, 62,184,207,130, 62,206, 27, 42, 62,172,137,147, 62,198, 19,148, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 48,252,165, 62, 85, 33,133, 63, 48, 54,112, 62, 96, 19, 20, 63, 46, 36,172, 62,129, 7,208, 63, 42, 17,240, 62, 97, 84,129,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,181, 71, 76, 62,131,200,204, 62,175,121,117, 62,106,185,183, 62,172, 24,217,
- 62, 92,237, 21, 62,187, 81,138, 62,103, 40, 59, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 48, 89,204, 62, 4,194,134,
- 63, 48,252,165, 62, 85, 33,133, 63, 42, 17,240, 62, 97, 84,129, 63, 37,125,160, 62, 46,211, 50, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 16, 62,187, 81,138, 62,103, 40, 59, 62,172, 24,217, 62, 92,237, 21, 62,172,197, 94, 62, 4,200,109, 62,195,121, 25,
- 62, 48,253, 46, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64, 63, 20, 44, 11, 61,163, 26, 20, 63, 48, 89,204, 62, 4,194,134,
- 63, 37,125,160, 62, 46,211, 50, 63, 24, 92, 40, 62, 21,184,214, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 32, 62,195,121, 25,
- 62, 48,253, 46, 62,172,197, 94, 62, 4,200,109, 62,230,122,140, 61,161,248,202, 62,222, 13,216, 62, 22,116,222, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 32, 63, 16,254,174, 62, 34, 45, 94, 63, 3,199,219, 61,229, 28, 18, 63, 20, 44, 11, 61,163, 26, 20,
- 63, 24, 92, 40, 62, 21,184,214, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16, 62,230,122,140, 61,161,248,202, 63, 3,199,219,
- 61,229, 28, 18, 62,236,248,140, 62, 34,202,182, 62,222, 13,216, 62, 22,116,222, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64,
- 63, 21,152,184, 62, 53, 47,182, 63, 16,254,174, 62, 34, 45, 94, 63, 24, 92, 40, 62, 21,184,214, 63, 25, 52,209, 62, 51,140, 76,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 32, 62,222, 13,216, 62, 22,116,222, 62,236,248,140, 62, 34,202,182, 62,227,207,183,
- 62, 54, 75,250, 62,220,137,229, 62, 52,228,185, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 32, 63, 22, 57,137, 62, 61, 93, 81,
- 63, 21,152,184, 62, 53, 47,182, 63, 25, 52,209, 62, 51,140, 76, 63, 30,166,193, 62, 73,168,114, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,220,137,229, 62, 52,228,185, 62,227,207,183, 62, 54, 75,250, 62,226,152,122, 62, 62,166,190, 62,209,198, 54,
- 62, 75,240, 18, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 22,249,250, 62, 88,251,160, 63, 22, 57,137, 62, 61, 93, 81,
- 63, 30,166,193, 62, 73,168,114, 63, 36, 0, 75, 62,116, 47,229, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,209,198, 54,
- 62, 75,240, 18, 62,226,152,122, 62, 62,166,190, 62,225, 83, 90, 62, 90,153, 21, 62,199,231,211, 62,119,237,216, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 30,166,193, 62, 73,168,114, 63, 37,125,160, 62, 46,211, 50, 63, 42, 17,240, 62, 97, 84,129,
- 63, 36, 0, 75, 62,116, 47,229, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,187, 81,138, 62,103, 40, 59, 62,195,121, 25,
- 62, 48,253, 46, 62,209,198, 54, 62, 75,240, 18, 62,199,231,211, 62,119,237,216, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 30,166,193, 62, 73,168,114, 63, 25, 52,209, 62, 51,140, 76, 63, 24, 92, 40, 62, 21,184,214, 63, 37,125,160, 62, 46,211, 50,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,222, 13,216, 62, 22,116,222, 62,220,137,229, 62, 52,228,185, 62,209,198, 54,
- 62, 75,240, 18, 62,195,121, 25, 62, 48,253, 46, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 36,163, 37, 62,140,168,191,
- 63, 36, 0, 75, 62,116, 47,229, 63, 42, 17,240, 62, 97, 84,129, 63, 46, 36,172, 62,129, 7,208, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,187, 81,138, 62,103, 40, 59, 62,199,231,211, 62,119,237,216, 62,199, 64, 6, 62,142, 6,105, 62,181, 71, 76,
- 62,131,200,204, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 25, 81, 20, 62,132, 56, 17, 63, 22,249,250, 62, 88,251,160,
- 63, 36, 0, 75, 62,116, 47,229, 63, 36,163, 37, 62,140,168,191, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,199,231,211,
- 62,119,237,216, 62,225, 83, 90, 62, 90,153, 21, 62,221, 42, 54, 62,133, 25,209, 62,199, 64, 6, 62,142, 6,105, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 27, 46,208, 62,148, 35,149, 63, 36, 60, 91, 62,150,222,221, 63, 33,170,222, 62,158,126, 74,
- 63, 27,177, 36, 62,156,151,158, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,204,234, 72, 62,159, 63, 56, 62,199,245,150,
- 62,152, 15, 85, 62,217,166,238, 62,148,221,229, 62,216,160, 0, 62,157, 44,127, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 25, 81, 20, 62,132, 56, 17, 63, 36,163, 37, 62,140,168,191, 63, 36, 60, 91, 62,150,222,221, 63, 27, 46,208, 62,148, 35,149,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,199,245,150, 62,152, 15, 85, 62,199, 64, 6, 62,142, 6,105, 62,221, 42, 54,
- 62,133, 25,209, 62,217,166,238, 62,148,221,229, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,239,111, 62,166, 77,159,
- 63, 27,177, 36, 62,156,151,158, 63, 33,170,222, 62,158,126, 74, 63, 31,212,102, 62,164,192,144, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,204,234, 72, 62,159, 63, 56, 62,216,160, 0, 62,157, 44,127, 62,216, 21,115, 62,166,177, 14, 62,208,119, 17,
- 62,165, 65,201, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 27,239,111, 62,166, 77,159, 63, 31,212,102, 62,164,192,144,
- 63, 41,160,156, 62,182,175, 56, 63, 37, 94, 91, 62,187,120,107, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,188,212,202,
- 62,182,163,245, 62,208,119, 17, 62,165, 65,201, 62,216, 21,115, 62,166,177, 14, 62,197, 28,156, 62,187,130,166, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 62,194,119,104, 63, 82,189,164, 62,212, 73, 23, 63, 90,239,152, 62,205,192,100, 63, 97,238, 46,
- 62,185, 56, 38, 63, 91,154, 72, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,141, 94,228, 63,100,234, 86, 62,150, 66, 84,
- 63, 94,154,114, 62,173, 86,230, 63, 98, 66, 79, 62,162,143, 20, 63,106,173, 44, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240,
- 63, 87,122, 72, 62, 62, 8,216, 63, 84,106,202, 62,113,185,137, 63, 72, 77,226, 62,121, 21,204, 63, 71,225,158, 62, 68, 34,113,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16, 62,137, 32,132, 62,121, 65,181, 62,107,179,168, 62,103,127,139, 62,114,147,210,
- 62, 61,116,212, 62,142,125,248, 62, 80, 4, 30, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64, 63, 71,225,158, 62, 68, 34,113,
- 63, 72, 77,226, 62,121, 21,204, 63, 51, 7, 8, 62,130,186, 5, 63, 49,166, 3, 62, 96, 57,232, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,172,197, 18, 62,133,112, 41, 62,137, 32,132, 62,121, 65,181, 62,142,125,248, 62, 80, 4, 30, 62,174,228,121,
- 62,109, 79, 52, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 49,166, 3, 62, 96, 57,232, 63, 51, 7, 8, 62,130,186, 5,
- 63, 46, 36,172, 62,129, 7,208, 63, 48, 54,112, 62, 96, 19, 20, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,181, 71, 76,
- 62,131,200,204, 62,172,197, 18, 62,133,112, 41, 62,174,228,121, 62,109, 79, 52, 62,175,121,117, 62,106,185,183, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 36,163, 37, 62,140,168,191, 63, 46, 36,172, 62,129, 7,208, 63, 51, 7, 8, 62,130,186, 5,
- 63, 36, 60, 91, 62,150,222,221, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,172,197, 18, 62,133,112, 41, 62,181, 71, 76,
- 62,131,200,204, 62,199, 64, 6, 62,142, 6,105, 62,199,245,150, 62,152, 15, 85, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 53, 88,154, 62,221,146,240, 63, 49,117,240, 62,198,138,164, 63, 69, 19,224, 62,190, 68, 24, 63, 74, 64, 53, 62,224, 31,171,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16, 62,134, 78,250, 62,186,213,148, 62,172,137,147, 62,198, 19,148, 62,162,172,128,
- 62,221,169, 17, 62,114,112,184, 62,220,169,248, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64, 62,214, 74, 54, 63, 70, 55, 20,
- 62,233,130, 48, 63, 83, 69,188, 62,212, 73, 23, 63, 90,239,152, 62,194,119,104, 63, 82,189,164, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,240, 62,150, 66, 84, 63, 94,154,114, 62,153, 1, 66, 63, 81,149,245, 62,185, 56, 38, 63, 83,110,102, 62,173, 86,230,
- 63, 98, 66, 79, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 63, 66,242,106, 63, 25, 94,202, 63, 70,100,190, 63, 15,234,222,
- 63, 77,189, 90, 63, 17, 88,233, 63, 74,206, 8, 63, 27,118, 88, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 96, 32, 22,
- 63, 16, 60, 66, 62,125, 87, 86, 63, 15, 5,174, 62,132,187, 78, 63, 24, 44,180, 62,108, 79, 26, 63, 26, 1,124, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 74,206, 8, 63, 27,118, 88, 63, 77,189, 90, 63, 17, 88,233, 63, 85,139, 72, 63, 19, 51,103,
- 63, 85,119,220, 63, 31, 71, 77, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 64,199, 64, 63, 18, 40, 26, 62, 96, 32, 22,
- 63, 16, 60, 66, 62,108, 79, 26, 63, 26, 1,124, 62, 67,191, 44, 63, 30, 89, 90, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 85,119,220, 63, 31, 71, 77, 63, 85,139, 72, 63, 19, 51,103, 63,100,213,228, 63, 20,156, 72, 63, 96, 82, 18, 63, 34,133,128,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 62, 1, 50,226, 63, 20, 68,184, 62, 64,199, 64, 63, 18, 40, 26, 62, 67,191, 44,
- 63, 30, 89, 90, 62, 24,204,194, 63, 34,186, 32, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 63, 56, 80,242, 63, 6,244, 44,
- 63, 54,173,195, 62,252,106,239, 63, 60,205,115, 62,253,150,213, 63, 64, 14,166, 63, 4, 80, 81, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 16, 62,147, 85,190, 62,252,176, 91, 62,160, 36,202, 62,252, 51, 94, 62,156,208, 61, 63, 7, 16,204, 62,140,121,160,
- 63, 3,197, 74, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64, 63, 64, 14,166, 63, 4, 80, 81, 63, 60,205,115, 62,253,150,213,
- 63, 73,103, 68, 63, 0,248,233, 63, 75, 12,248, 63, 8,206, 64, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,115, 59,144,
- 62,255,143,102, 62,147, 85,190, 62,252,176, 91, 62,140,121,160, 63, 3,197, 74, 62,107,135, 78, 63, 7,182, 88, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 75, 12,248, 63, 8,206, 64, 63, 73,103, 68, 63, 0,248,233, 63, 82,151,239, 63, 3,223, 86,
- 63, 82,227,181, 63, 11,102,189, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 77, 17, 82, 63, 2, 98,162, 62,115, 59,144,
- 62,255,143,102, 62,107,135, 78, 63, 7,182, 88, 62, 75, 98,202, 63, 10, 43,108, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 82,227,181, 63, 11,102,189, 63, 82,151,239, 63, 3,223, 86, 63, 91,224, 92, 63, 5,144,239, 63, 90,148,161, 63, 13, 95,146,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 38, 40,178, 63, 3,230, 14, 62, 77, 17, 82, 63, 2, 98,162, 62, 75, 98,202,
- 63, 10, 43,108, 62, 43,162, 10, 63, 12, 50, 8, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,103, 89,120, 63, 2, 76,105,
- 63,103,179,170, 63, 12,105,142, 63, 90,148,161, 63, 13, 95,146, 63, 91,224, 92, 63, 5,144,239, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62, 43,162, 10, 63, 12, 50, 8, 61,231, 41,168, 63, 11, 83,158, 61,234,128,116, 63, 0, 39,200, 62, 38, 40,178,
- 63, 3,230, 14, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,100,213,228, 63, 20,156, 72, 63, 85,139, 72, 63, 19, 51,103,
- 63, 90,148,161, 63, 13, 95,146, 63,103,179,170, 63, 12,105,142, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 43,162, 10,
- 63, 12, 50, 8, 62, 64,199, 64, 63, 18, 40, 26, 62, 1, 50,226, 63, 20, 68,184, 61,231, 41,168, 63, 11, 83,158, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 85,139, 72, 63, 19, 51,103, 63, 77,189, 90, 63, 17, 88,233, 63, 82,227,181, 63, 11,102,189,
- 63, 90,148,161, 63, 13, 95,146, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 75, 98,202, 63, 10, 43,108, 62, 96, 32, 22,
- 63, 16, 60, 66, 62, 64,199, 64, 63, 18, 40, 26, 62, 43,162, 10, 63, 12, 50, 8, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 77,189, 90, 63, 17, 88,233, 63, 70,100,190, 63, 15,234,222, 63, 75, 12,248, 63, 8,206, 64, 63, 82,227,181, 63, 11,102,189,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,107,135, 78, 63, 7,182, 88, 62,125, 87, 86, 63, 15, 5,174, 62, 96, 32, 22,
- 63, 16, 60, 66, 62, 75, 98,202, 63, 10, 43,108, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 70,100,190, 63, 15,234,222,
- 63, 60,235, 82, 63, 12, 12, 27, 63, 64, 14,166, 63, 4, 80, 81, 63, 75, 12,248, 63, 8,206, 64, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,140,121,160, 63, 3,197, 74, 62,145,230, 78, 63, 11,225,148, 62,125, 87, 86, 63, 15, 5,174, 62,107,135, 78,
- 63, 7,182, 88, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 57,118, 31, 63, 12, 79,230, 63, 56, 80,242, 63, 6,244, 44,
- 63, 64, 14,166, 63, 4, 80, 81, 63, 60,235, 82, 63, 12, 12, 27, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 32, 62,140,121,160,
- 63, 3,197, 74, 62,156,208, 61, 63, 7, 16,204, 62,152,199, 0, 63, 12,133, 13, 62,145,230, 78, 63, 11,225,148, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 32, 63, 57,240,195, 63, 23,138, 10, 63, 60,235, 82, 63, 12, 12, 27, 63, 70,100,190, 63, 15,234,222,
- 63, 66,242,106, 63, 25, 94,202, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,125, 87, 86, 63, 15, 5,174, 62,145,230, 78,
- 63, 11,225,148, 62,150, 7,247, 63, 23, 12, 96, 62,132,187, 78, 63, 24, 44,180, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 13,120,216, 63, 23, 81,160, 63, 23,233, 94, 63, 16, 60,186, 63, 28, 56,220, 63, 14,250, 66, 63, 39, 44,109, 63, 19,221,107,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,214,161,157, 63, 15,110,219, 62,223,130,109, 63, 16,165,118, 62,245, 27, 64,
- 63, 23,166,100, 62,192, 26,156, 63, 20,139, 31, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 56, 29,176, 63, 20,206, 88,
- 63, 57,118, 31, 63, 12, 79,230, 63, 60,235, 82, 63, 12, 12, 27, 63, 57,240,195, 63, 23,138, 10, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,145,230, 78, 63, 11,225,148, 62,152,199, 0, 63, 12,133, 13, 62,153,211,239, 63, 20,159,220, 62,150, 7,247,
- 63, 23, 12, 96, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 54,148, 48, 63, 22,206,220, 63, 56, 29,176, 63, 20,206, 88,
- 63, 57,240,195, 63, 23,138, 10, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,150, 7,247,
- 63, 23, 12, 96, 62,153,211,239, 63, 20,159,220, 62,156,106,108, 63, 22,154,146, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 54,173,195, 62,252,106,239, 63, 53, 88,154, 62,221,146,240, 63, 74, 64, 53, 62,224, 31,171,
- 63, 60,205,115, 62,253,150,213, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 32, 62,114,112,184, 62,220,169,248, 62,162,172,128,
- 62,221,169, 17, 62,160, 36,202, 62,252, 51, 94, 62,147, 85,190, 62,252,176, 91, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 32,
- 63, 74, 64, 53, 62,224, 31,171, 63, 81,106,217, 62,232,214, 14, 63, 73,103, 68, 63, 0,248,233, 63, 60,205,115, 62,253,150,213,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,115, 59,144, 62,255,143,102, 62, 84, 93, 88, 62,228,105, 50, 62,114,112,184,
- 62,220,169,248, 62,147, 85,190, 62,252,176, 91, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 81,106,217, 62,232,214, 14,
- 63, 93,154,106, 62,233, 26,226, 63, 82,151,239, 63, 3,223, 86, 63, 73,103, 68, 63, 0,248,233, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62, 77, 17, 82, 63, 2, 98,162, 62, 33, 1,128, 62,226,210, 70, 62, 84, 93, 88, 62,228,105, 50, 62,115, 59,144,
- 62,255,143,102, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,103, 89,120, 63, 2, 76,105, 63, 91,224, 92, 63, 5,144,239,
- 63, 82,151,239, 63, 3,223, 86, 63, 93,154,106, 62,233, 26,226, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 77, 17, 82,
- 63, 2, 98,162, 62, 38, 40,178, 63, 3,230, 14, 61,234,128,116, 63, 0, 39,200, 62, 33, 1,128, 62,226,210, 70, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 51, 7, 8, 62,130,186, 5, 63, 72, 77,226, 62,121, 21,204, 63, 73,254,154, 62,140, 82,178,
- 63, 56,188, 90, 62,159,207,103, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,130,249,249, 62,137,175,246, 62,137, 32,132,
- 62,121, 65,181, 62,172,197, 18, 62,133,112, 41, 62,161, 5,192, 62,159, 40,228, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 69, 19,224, 62,190, 68, 24, 63, 56,188, 90, 62,159,207,103, 63, 73,254,154, 62,140, 82,178, 63, 77,217,216, 62,157,228, 7,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 62,130,249,249, 62,137,175,246, 62,161, 5,192, 62,159, 40,228, 62,134, 78,250,
- 62,186,213,148, 62,111,118,154, 62,152,108,120, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 63, 49,117,240, 62,198,138,164,
- 63, 41,160,156, 62,182,175, 56, 63, 56,188, 90, 62,159,207,103, 63, 69, 19,224, 62,190, 68, 24, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62,161, 5,192, 62,159, 40,228, 62,188,212,202, 62,182,163,245, 62,172,137,147, 62,198, 19,148, 62,134, 78,250,
- 62,186,213,148, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 41,160,156, 62,182,175, 56, 63, 33,170,222, 62,158,126, 74,
- 63, 36, 60, 91, 62,150,222,221, 63, 56,188, 90, 62,159,207,103, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,199,245,150,
- 62,152, 15, 85, 62,204,234, 72, 62,159, 63, 56, 62,188,212,202, 62,182,163,245, 62,161, 5,192, 62,159, 40,228, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 36, 60, 91, 62,150,222,221, 63, 51, 7, 8, 62,130,186, 5, 63, 56,188, 90, 62,159,207,103,
- 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,161, 5,192, 62,159, 40,228, 62,172,197, 18,
- 62,133,112, 41, 62,199,245,150, 62,152, 15, 85, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 41,160,156, 62,182,175, 56, 63, 31,212,102, 62,164,192,144, 63, 33,170,222, 62,158,126, 74, 63,128, 0, 0, 63,128, 0, 0,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,204,234, 72, 62,159, 63, 56, 62,208,119, 17, 62,165, 65,201, 62,188,212,202,
- 62,182,163,245, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,245, 44,226, 63, 96,140,129,
- 62,227,135, 42, 63,101, 2, 58, 62,219,168,136, 63, 95,236, 30, 62,238, 30,135, 63, 90, 41,200, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,240, 62,137,240,216, 63, 93,226, 90, 62,122,103,110, 63, 92,255,236, 62,120, 84, 74, 63, 83, 32,104, 62,138,193, 32,
- 63, 83, 3, 16, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,233,130, 48, 63, 83, 69,188, 62,238, 30,135, 63, 90, 41,200,
- 62,219,168,136, 63, 95,236, 30, 62,212, 73, 23, 63, 90,239,152, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62,137,240,216,
- 63, 93,226, 90, 62,138,193, 32, 63, 83, 3, 16, 62,153, 1, 66, 63, 81,149,245, 62,150, 66, 84, 63, 94,154,114, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0,240, 63, 77,217,216, 62,157,228, 7, 63, 73,254,154, 62,140, 82,178, 63, 90, 61, 33, 62,124,207,195,
- 63, 90,225,160, 62,137,121,110, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16, 62, 81,207, 98, 62,110, 1,109, 62,130,249,249,
- 62,137,175,246, 62,111,118,154, 62,152,108,120, 62, 74,125,166, 62,130, 30,252, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64,
- 63, 72, 77,226, 62,121, 21,204, 63, 84,106,202, 62,113,185,137, 63, 90, 61, 33, 62,124,207,195, 63, 73,254,154, 62,140, 82,178,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 81,207, 98, 62,110, 1,109, 62,107,179,168, 62,103,127,139, 62,137, 32,132,
- 62,121, 65,181, 62,130,249,249, 62,137,175,246, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,212, 73, 23, 63, 90,239,152,
- 62,219,168,136, 63, 95,236, 30, 62,205,192,100, 63, 97,238, 46, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,112, 62,141, 94,228, 63,100,234, 86, 62,137,240,216, 63, 93,226, 90, 62,150, 66, 84, 63, 94,154,114, 63,128, 0, 0,
- 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,112, 63,109,178, 31, 62,228, 68,224, 63,102,178, 46, 62,232,184,100,
- 63,101,251,100, 62,227,198,238, 63,107,173, 94, 62,225,130,168, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,249,209, 68,
- 62,219,134, 70, 61,242,216,120, 62,225, 40,124, 61,177, 27, 28, 62,219,240, 42, 61,196,131, 76, 62,216, 97,196, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63,109,178, 31, 62,228, 68,224, 63,107,173, 94, 62,225,130,168, 63,114,102,144, 62,220, 23,198,
- 63,116, 76, 41, 62,222,153,139, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,120,163, 56, 62,208,252, 58, 61,196,131, 76,
- 62,216, 97,196, 61,177, 27, 28, 62,219,240, 42, 61, 73,183,128, 62,213,108, 84, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63,116, 76, 41, 62,222,153,139, 63,114,102,144, 62,220, 23,198, 63,117, 87, 84, 62,211,255,221, 63,119,115,183, 62,215, 49,140,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61, 55, 29,144, 62,194,183,207, 61,120,163, 56, 62,208,252, 58, 61, 73,183,128,
- 62,213,108, 84, 60,231,111,224, 62,198,142,100, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,119,115,183, 62,215, 49,140,
- 63,117, 87, 84, 62,211,255,221, 63,118, 20,150, 62,196,110, 60, 63,122, 12, 49, 62,197, 8,246, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 61,103,197, 96, 62,170,206, 15, 61, 55, 29,144, 62,194,183,207, 60,231,111,224, 62,198,142,100, 61, 16, 54,240,
- 62,167, 4,120, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,122, 12, 49, 62,197, 8,246, 63,118, 20,150, 62,196,110, 60,
- 63,108,155, 17, 62,178,201,130, 63,110,190, 84, 62,172, 77,223, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,246,252,148,
- 62,160,116,164, 61,103,197, 96, 62,170,206, 15, 61, 16, 54,240, 62,167, 4,120, 61,246, 66, 8, 62,152,161, 28, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63,110,190, 84, 62,172, 77,223, 63,108,155, 17, 62,178,201,130, 63, 92,180, 21, 62,173, 95,202,
- 63, 90, 5,151, 62,167, 61,138, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 54,216,144, 62,163, 76, 35, 61,246,252,148,
- 62,160,116,164, 61,246, 66, 8, 62,152,161, 28, 62, 66,251,194, 62,158,102,163, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63,108,155, 17, 62,178,201,130, 63,109,132,198, 62,186,157,182, 63, 97, 32, 68, 62,178, 12,192, 63, 92,180, 21, 62,173, 95,202,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 36,185, 48, 62,166, 7, 16, 61,221, 91, 40, 62,167,194, 4, 61,246,252,148,
- 62,160,116,164, 62, 54,216,144, 62,163, 76, 35, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,118, 20,150, 62,196,110, 60,
- 63,115,225, 84, 62,198, 85,208, 63,109,132,198, 62,186,157,182, 63,108,155, 17, 62,178,201,130, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 61,221, 91, 40, 62,167,194, 4, 61,134,221,244, 62,175,164,121, 61,103,197, 96, 62,170,206, 15, 61,246,252,148,
- 62,160,116,164, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,117, 87, 84, 62,211,255,221, 63,116, 48,222, 62,209, 8,169,
- 63,115,225, 84, 62,198, 85,208, 63,118, 20,150, 62,196,110, 60, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,134,221,244,
- 62,175,164,121, 61, 93,108,160, 62,190,207, 17, 61, 55, 29,144, 62,194,183,207, 61,103,197, 96, 62,170,206, 15, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63,114,102,144, 62,220, 23,198, 63,113,151,174, 62,214,229, 26, 63,116, 48,222, 62,209, 8,169,
- 63,117, 87, 84, 62,211,255,221, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61, 93,108,160, 62,190,207, 17, 61,135,155, 12,
- 62,201, 39,166, 61,120,163, 56, 62,208,252, 58, 61, 55, 29,144, 62,194,183,207, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63,107,173, 94, 62,225,130,168, 63,107,239,228, 62,218, 59, 62, 63,113,151,174, 62,214,229, 26, 63,114,102,144, 62,220, 23,198,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,135,155, 12, 62,201, 39,166, 61,195, 47,128, 62,207, 11, 6, 61,196,131, 76,
- 62,216, 97,196, 61,120,163, 56, 62,208,252, 58, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,107,173, 94, 62,225,130,168,
- 63,101,251,100, 62,227,198,238, 63,102,205, 71, 62,219, 94,132, 63,107,239,228, 62,218, 59, 62, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 61,244,157,192, 62,209,137,157, 61,249,209, 68, 62,219,134, 70, 61,196,131, 76, 62,216, 97,196, 61,195, 47,128,
- 62,207, 11, 6, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 69, 19,224, 62,190, 68, 24, 63, 77,217,216, 62,157,228, 7,
- 63, 85, 35,236, 62,181,201,164, 63, 78, 92, 56, 62,188,114,177, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 32, 62, 80, 91,122,
- 62,174, 18, 72, 62,111,118,154, 62,152,108,120, 62,134, 78,250, 62,186,213,148, 62,104,163,162, 62,182,180,150, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 32, 63, 77,217,216, 62,157,228, 7, 63, 90, 5,151, 62,167, 61,138, 63, 92,180, 21, 62,173, 95,202,
- 63, 85, 35,236, 62,181,201,164, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16, 62, 54,216,144, 62,163, 76, 35, 62, 66,251,194,
- 62,158,102,163, 62,111,118,154, 62,152,108,120, 62, 80, 91,122, 62,174, 18, 72, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64,
- 63, 74, 64, 53, 62,224, 31,171, 63, 69, 19,224, 62,190, 68, 24, 63, 78, 92, 56, 62,188,114,177, 63, 81,106,217, 62,232,214, 14,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62,104,163,162, 62,182,180,150, 62,134, 78,250, 62,186,213,148, 62,114,112,184,
- 62,220,169,248, 62, 84, 93, 88, 62,228,105, 50, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 93,154,106, 62,233, 26,226,
- 63, 94,229,196, 62,224,195,128, 63,101,251,100, 62,227,198,238, 63,102,178, 46, 62,232,184,100, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 61,249,209, 68, 62,219,134, 70, 62, 28,187,108, 62,217, 86, 48, 62, 33, 1,128, 62,226,210, 70, 61,242,216,120,
- 62,225, 40,124, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 92,180, 21, 62,173, 95,202, 63, 97, 32, 68, 62,178, 12,192,
- 63, 94,215, 9, 62,186, 54, 4, 63, 85, 35,236, 62,181,201,164, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 41,122, 60,
- 62,175, 58, 16, 62, 36,185, 48, 62,166, 7, 16, 62, 54,216,144, 62,163, 76, 35, 62, 80, 91,122, 62,174, 18, 72, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 95, 78,230, 62,189,233, 4, 63, 86,188, 32, 62,190, 62, 44, 63, 85, 35,236, 62,181,201,164,
- 63, 94,215, 9, 62,186, 54, 4, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 80, 91,122, 62,174, 18, 72, 62, 71,118, 78,
- 62,182, 49, 27, 62, 37,225, 52, 62,179, 12, 40, 62, 41,122, 60, 62,175, 58, 16, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 92,166, 70, 62,197,166, 0, 63, 86,188, 32, 62,190, 62, 44, 63, 95, 78,230, 62,189,233, 4, 63, 95, 13,226, 62,194,152, 37,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 37,225, 52, 62,179, 12, 40, 62, 71,118, 78, 62,182, 49, 27, 62, 45,143,142,
- 62,188, 37,237, 62, 36,230,106, 62,184, 27,222, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 95, 90,248, 62,207,122,100,
- 63, 90,249,108, 62,212,199, 58, 63, 86,188, 32, 62,190, 62, 44, 63, 92,166, 70, 62,197,166, 0, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62, 71,118, 78, 62,182, 49, 27, 62, 48, 56,110, 62,205, 43,230, 62, 30,250,174, 62,198, 12, 26, 62, 45,143,142,
- 62,188, 37,237, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 94,229,196, 62,224,195,128, 63, 90,249,108, 62,212,199, 58,
- 63, 95, 90,248, 62,207,122,100, 63, 98,104, 92, 62,215,136,197, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 30,250,174,
- 62,198, 12, 26, 62, 48, 56,110, 62,205, 43,230, 62, 28,187,108, 62,217, 86, 48, 62, 15, 59,212, 62,206, 50,224, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63,101,251,100, 62,227,198,238, 63, 94,229,196, 62,224,195,128, 63, 98,104, 92, 62,215,136,197,
- 63,102,205, 71, 62,219, 94,132, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 15, 59,212, 62,206, 50,224, 62, 28,187,108,
- 62,217, 86, 48, 61,249,209, 68, 62,219,134, 70, 61,244,157,192, 62,209,137,157, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 81,106,217, 62,232,214, 14, 63, 90,249,108, 62,212,199, 58, 63, 94,229,196, 62,224,195,128, 63, 93,154,106, 62,233, 26,226,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 28,187,108, 62,217, 86, 48, 62, 48, 56,110, 62,205, 43,230, 62, 84, 93, 88,
- 62,228,105, 50, 62, 33, 1,128, 62,226,210, 70, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 81,106,217, 62,232,214, 14,
- 63, 78, 92, 56, 62,188,114,177, 63, 86,188, 32, 62,190, 62, 44, 63, 90,249,108, 62,212,199, 58, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62, 71,118, 78, 62,182, 49, 27, 62,104,163,162, 62,182,180,150, 62, 84, 93, 88, 62,228,105, 50, 62, 48, 56,110,
- 62,205, 43,230, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 78, 92, 56, 62,188,114,177, 63, 85, 35,236, 62,181,201,164,
- 63, 86,188, 32, 62,190, 62, 44, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 71,118, 78,
- 62,182, 49, 27, 62, 80, 91,122, 62,174, 18, 72, 62,104,163,162, 62,182,180,150, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63,102,205, 71, 62,219, 94,132, 63, 98,104, 92, 62,215,136,197, 63,100,109,182, 62,210,255,149,
- 63,104, 86, 54, 62,214,241,209, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 7,107,160, 62,200,103, 34, 62, 15, 59,212,
- 62,206, 50,224, 61,244,157,192, 62,209,137,157, 61,232, 2, 8, 62,203,214, 20, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 98,104, 92, 62,215,136,197, 63, 95, 90,248, 62,207,122,100, 63, 97,206,112, 62,204,202, 10, 63,100,109,182, 62,210,255,149,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 21, 68, 64, 62,194, 55,107, 62, 30,250,174, 62,198, 12, 26, 62, 15, 59,212,
- 62,206, 50,224, 62, 7,107,160, 62,200,103, 34, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 95, 90,248, 62,207,122,100,
- 63, 92,166, 70, 62,197,166, 0, 63, 94,241, 82, 62,198,103, 40, 63, 97,206,112, 62,204,202, 10, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62, 35,225, 20, 62,188, 50, 39, 62, 45,143,142, 62,188, 37,237, 62, 30,250,174, 62,198, 12, 26, 62, 21, 68, 64,
- 62,194, 55,107, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 92,166, 70, 62,197,166, 0, 63, 95, 13,226, 62,194,152, 37,
- 63, 97, 1,118, 62,195,226, 47, 63, 94,241, 82, 62,198,103, 40, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 28, 43, 12,
- 62,184,177,186, 62, 36,230,106, 62,184, 27,222, 62, 45,143,142, 62,188, 37,237, 62, 35,225, 20, 62,188, 50, 39, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 95, 13,226, 62,194,152, 37, 63, 95, 78,230, 62,189,233, 4, 63, 97,113, 51, 62,189,151, 92,
- 63, 97, 1,118, 62,195,226, 47, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 29, 67,104, 62,177,199, 58, 62, 37,225, 52,
- 62,179, 12, 40, 62, 36,230,106, 62,184, 27,222, 62, 28, 43, 12, 62,184,177,186, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 95, 78,230, 62,189,233, 4, 63, 94,215, 9, 62,186, 54, 4, 63, 96, 69, 96, 62,187,133,152, 63, 97,113, 51, 62,189,151, 92,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 35, 14,140, 62,176, 19, 33, 62, 41,122, 60, 62,175, 58, 16, 62, 37,225, 52,
- 62,179, 12, 40, 62, 29, 67,104, 62,177,199, 58, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63, 94,215, 9, 62,186, 54, 4,
- 63, 97, 32, 68, 62,178, 12,192, 63, 98, 91,112, 62,182,128,149, 63, 96, 69, 96, 62,187,133,152, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62, 29,107,228, 62,169,230, 95, 62, 36,185, 48, 62,166, 7, 16, 62, 41,122, 60, 62,175, 58, 16, 62, 35, 14,140,
- 62,176, 19, 33, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,107,239,228, 62,218, 59, 62, 63,102,205, 71, 62,219, 94,132,
- 63,104, 86, 54, 62,214,241,209, 63,109, 27, 34, 62,214,254,155, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,232, 2, 8,
- 62,203,214, 20, 61,244,157,192, 62,209,137,157, 61,195, 47,128, 62,207, 11, 6, 61,184,174, 36, 62,202,130,216, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63,113,151,174, 62,214,229, 26, 63,107,239,228, 62,218, 59, 62, 63,109, 27, 34, 62,214,254,155,
- 63,113,134, 69, 62,212, 82,156, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,184,174, 36, 62,202,130,216, 61,195, 47,128,
- 62,207, 11, 6, 61,135,155, 12, 62,201, 39,166, 61,138,114, 60, 62,197, 61, 28, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63,116, 48,222, 62,209, 8,169, 63,113,151,174, 62,214,229, 26, 63,113,134, 69, 62,212, 82,156, 63,114,143, 42, 62,207,168, 24,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,138,114, 60, 62,197, 61, 28, 61,135,155, 12, 62,201, 39,166, 61, 93,108,160,
- 62,190,207, 17, 61,132, 85,184, 62,189,211, 22, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,115,225, 84, 62,198, 85,208,
- 63,116, 48,222, 62,209, 8,169, 63,114,143, 42, 62,207,168, 24, 63,114,125,203, 62,200,114, 96, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 61,132, 85,184, 62,189,211, 22, 61, 93,108,160, 62,190,207, 17, 61,134,221,244, 62,175,164,121, 61,145,152, 16,
- 62,179,214, 84, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,109,132,198, 62,186,157,182, 63,115,225, 84, 62,198, 85,208,
- 63,114,125,203, 62,200,114, 96, 63,109,192,177, 62,190,240,152, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,145,152, 16,
- 62,179,214, 84, 61,134,221,244, 62,175,164,121, 61,221, 91, 40, 62,167,194, 4, 61,208,226, 64, 62,172, 58,232, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 97, 32, 68, 62,178, 12,192, 63,109,132,198, 62,186,157,182, 63,109,192,177, 62,190,240,152,
- 63, 98, 91,112, 62,182,128,149, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,208,226, 64, 62,172, 58,232, 61,221, 91, 40,
- 62,167,194, 4, 62, 36,185, 48, 62,166, 7, 16, 62, 29,107,228, 62,169,230, 95, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 97, 1,118, 62,195,226, 47, 63, 97,113, 51, 62,189,151, 92, 63,102,139,215, 62,193,109, 15, 63,100, 47, 54, 62,198,115,186,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 5,169, 92, 62,179,115,168, 62, 29, 67,104, 62,177,199, 58, 62, 28, 43, 12,
- 62,184,177,186, 62, 13, 97, 50, 62,186, 42, 50, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,100, 47, 54, 62,198,115,186,
- 63,102,139,215, 62,193,109, 15, 63,105,241,174, 62,200, 8,204, 63,103,233, 71, 62,204, 42,178, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 61,229,171,228, 62,185, 42, 41, 62, 5,169, 92, 62,179,115,168, 62, 13, 97, 50, 62,186, 42, 50, 61,243,248, 92,
- 62,191, 22, 96, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,103,233, 71, 62,204, 42,178, 63,105,241,174, 62,200, 8,204,
- 63,108, 37, 51, 62,205, 3,249, 63,106,212, 56, 62,208,238, 96, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,202, 99,120,
- 62,190, 49,192, 61,229,171,228, 62,185, 42, 41, 61,243,248, 92, 62,191, 22, 96, 61,211,209,160, 62,195,159,108, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63,106,212, 56, 62,208,238, 96, 63,108, 37, 51, 62,205, 3,249, 63,110, 73, 56, 62,206,119,186,
- 63,109,191, 46, 62,210, 64, 92, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,179,234,244, 62,190,219,240, 61,202, 99,120,
- 62,190, 49,192, 61,211,209,160, 62,195,159,108, 61,181,129,196, 62,196, 14,204, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63,109, 27, 34, 62,214,254,155, 63,104, 86, 54, 62,214,241,209, 63,106,212, 56, 62,208,238, 96, 63,109,191, 46, 62,210, 64, 92,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,211,209,160, 62,195,159,108, 61,232, 2, 8, 62,203,214, 20, 61,184,174, 36,
- 62,202,130,216, 61,181,129,196, 62,196, 14,204, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,100,109,182, 62,210,255,149,
- 63,103,233, 71, 62,204, 42,178, 63,106,212, 56, 62,208,238, 96, 63,104, 86, 54, 62,214,241,209, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 61,211,209,160, 62,195,159,108, 61,243,248, 92, 62,191, 22, 96, 62, 7,107,160, 62,200,103, 34, 61,232, 2, 8,
- 62,203,214, 20, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,100,109,182, 62,210,255,149, 63, 97,206,112, 62,204,202, 10,
- 63,100, 47, 54, 62,198,115,186, 63,103,233, 71, 62,204, 42,178, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 13, 97, 50,
- 62,186, 42, 50, 62, 21, 68, 64, 62,194, 55,107, 62, 7,107,160, 62,200,103, 34, 61,243,248, 92, 62,191, 22, 96, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63, 97, 1,118, 62,195,226, 47, 63,100, 47, 54, 62,198,115,186, 63, 97,206,112, 62,204,202, 10,
- 63, 94,241, 82, 62,198,103, 40, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 21, 68, 64, 62,194, 55,107, 62, 13, 97, 50,
- 62,186, 42, 50, 62, 28, 43, 12, 62,184,177,186, 62, 35,225, 20, 62,188, 50, 39, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63, 96, 69, 96, 62,187,133,152, 63, 98, 91,112, 62,182,128,149, 63,102,139,215, 62,193,109, 15, 63, 97,113, 51, 62,189,151, 92,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 62, 5,169, 92, 62,179,115,168, 62, 29,107,228, 62,169,230, 95, 62, 35, 14,140,
- 62,176, 19, 33, 62, 29, 67,104, 62,177,199, 58, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,109,192,177, 62,190,240,152,
- 63,105,241,174, 62,200, 8,204, 63,102,139,215, 62,193,109, 15, 63, 98, 91,112, 62,182,128,149, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 62, 5,169, 92, 62,179,115,168, 61,229,171,228, 62,185, 42, 41, 61,208,226, 64, 62,172, 58,232, 62, 29,107,228,
- 62,169,230, 95, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,114,125,203, 62,200,114, 96, 63,108, 37, 51, 62,205, 3,249,
- 63,105,241,174, 62,200, 8,204, 63,109,192,177, 62,190,240,152, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,229,171,228,
- 62,185, 42, 41, 61,202, 99,120, 62,190, 49,192, 61,145,152, 16, 62,179,214, 84, 61,208,226, 64, 62,172, 58,232, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63,114,143, 42, 62,207,168, 24, 63,110, 73, 56, 62,206,119,186, 63,108, 37, 51, 62,205, 3,249,
- 63,114,125,203, 62,200,114, 96, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,202, 99,120, 62,190, 49,192, 61,179,234,244,
- 62,190,219,240, 61,132, 85,184, 62,189,211, 22, 61,145,152, 16, 62,179,214, 84, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 63,113,134, 69, 62,212, 82,156, 63,109,191, 46, 62,210, 64, 92, 63,110, 73, 56, 62,206,119,186, 63,114,143, 42, 62,207,168, 24,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,179,234,244, 62,190,219,240, 61,181,129,196, 62,196, 14,204, 61,138,114, 60,
- 62,197, 61, 28, 61,132, 85,184, 62,189,211, 22, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,109, 27, 34, 62,214,254,155,
- 63,109,191, 46, 62,210, 64, 92, 63,113,134, 69, 62,212, 82,156, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 61,138,114, 60, 62,197, 61, 28, 61,181,129,196, 62,196, 14,204, 61,184,174, 36, 62,202,130,216, 63,128, 0, 0,
- 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,110,190, 84, 62,172, 77,223, 63, 90, 5,151, 62,167, 61,138,
- 63, 96, 25, 22, 62,149,248,246, 63,122,176,162, 62,161,215,145, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 62, 54,234, 64,
- 62,140,219,146, 62, 66,251,194, 62,158,102,163, 61,246, 66, 8, 62,152,161, 28, 61,189,241,172, 62,132,107, 13, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0, 0, 63,122, 12, 49, 62,197, 8,246, 63,110,190, 84, 62,172, 77,223, 63,122,176,162, 62,161,215,145,
- 63,126,255,188, 62,198,248,115, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64, 61,189,241,172, 62,132,107, 13, 61,246, 66, 8,
- 62,152,161, 28, 61, 16, 54,240, 62,167, 4,120, 58,163, 8, 0, 62,162, 69, 39, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128,
- 63,119,115,183, 62,215, 49,140, 63,122, 12, 49, 62,197, 8,246, 63,126,255,188, 62,198,248,115, 63,122, 6, 47, 62,216,157,248,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 58,163, 8, 0, 62,162, 69, 39, 61, 16, 54,240, 62,167, 4,120, 60,231,111,224,
- 62,198,142,100, 60, 14,248,224, 62,198,141, 70, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16, 63,116, 76, 41, 62,222,153,139,
- 63,119,115,183, 62,215, 49,140, 63,122, 6, 47, 62,216,157,248, 63,119, 98,134, 62,225, 37,204, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 0, 60, 14,248,224, 62,198,141, 70, 60,231,111,224, 62,198,142,100, 61, 73,183,128, 62,213,108, 84, 60,229,210, 80,
- 62,218,239, 32, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 63,109,178, 31, 62,228, 68,224, 63,116, 76, 41, 62,222,153,139,
- 63,119, 98,134, 62,225, 37,204, 63,115,185, 46, 62,234,157, 90, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,128, 60,229,210, 80,
- 62,218,239, 32, 61, 73,183,128, 62,213,108, 84, 61,177, 27, 28, 62,219,240, 42, 61,122,103, 56, 62,230, 10, 30, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0,128, 63,102,178, 46, 62,232,184,100, 63,109,178, 31, 62,228, 68,224, 63,115,185, 46, 62,234,157, 90,
- 63,106,134,244, 62,246, 64,234, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64, 61,122,103, 56, 62,230, 10, 30, 61,177, 27, 28,
- 62,219,240, 42, 61,242,216,120, 62,225, 40,124, 61,209,222,212, 62,240,123,238, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 16,
- 63, 5,188,235, 63, 98, 74,252, 62,248,111,200, 63,112,105,197, 62,231, 49, 0, 63,107,190,118, 62,255, 57,150, 63, 96, 14, 53,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62, 95, 99, 80, 63, 94,194,149, 62, 62, 8, 58, 63, 89,154, 10, 62, 92, 24, 40,
- 63, 74, 82, 14, 62,112, 11,112, 63, 78,133,157, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 63, 5,188,235, 63, 98, 74,252,
- 63, 12,139,136, 63,101,233,138, 63, 6, 45,116, 63,113,245,112, 62,248,111,200, 63,112,105,197, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0,240, 62, 36,219, 68, 63, 81,186,249, 62, 65,254, 28, 63, 70, 55, 20, 62, 92, 24, 40, 63, 74, 82, 14, 62, 62, 8, 58,
- 63, 89,154, 10, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 63, 12,139,136, 63,101,233,138, 63, 12,130, 5, 63,108,216,149,
- 63, 6, 45,116, 63,113,245,112, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,112, 62, 36,219, 68,
- 63, 81,186,249, 62, 42, 1, 76, 63, 73,178, 39, 62, 65,254, 28, 63, 70, 55, 20, 63,128, 0, 0, 63,128, 0, 0, 2,236,169, 32,
- 1, 0, 0, 5, 0, 0, 0,112, 63,103, 89,120, 63, 2, 76,105, 63, 93,154,106, 62,233, 26,226, 63,102,178, 46, 62,232,184,100,
- 63,106,134,244, 62,246, 64,234, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0, 61,242,216,120, 62,225, 40,124, 62, 33, 1,128,
- 62,226,210, 70, 61,234,128,116, 63, 0, 39,200, 61,209,222,212, 62,240,123,238, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 0,
- 62,245, 44,226, 63, 96,140,129, 62,255, 57,150, 63, 96, 14, 53, 62,231, 49, 0, 63,107,190,118, 62,227,135, 42, 63,101, 2, 58,
- 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 62, 95, 99, 80, 63, 94,194,149, 62,112, 11,112, 63, 78,133,157, 62,120, 84, 74,
- 63, 83, 32,104, 62,122,103,110, 63, 92,255,236, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0,240, 63, 77,217,216, 62,157,228, 7,
- 63, 90,225,160, 62,137,121,110, 63, 96, 25, 22, 62,149,248,246, 63, 90, 5,151, 62,167, 61,138, 2,236,169, 32, 1, 0, 0, 5,
- 0, 0, 0, 16, 62, 54,234, 64, 62,140,219,146, 62, 74,125,166, 62,130, 30,252, 62,111,118,154, 62,152,108,120, 62, 66,251,194,
- 62,158,102,163, 2,236,169, 32, 1, 0, 0, 5, 0, 0, 0, 64, 68, 65, 84, 65, 0, 0, 31, 64, 5, 31,232, 32, 0, 0, 0, 57,
- 0, 0, 7,208,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 8, 3, 0, 0, 48,124,116, 1, 0, 0, 0, 0, 32, 0, 0, 0,
+ 1, 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,245, 40,220, 62,
+ 0, 0, 0, 0,164,112,125, 63, 0, 0,128, 63,106,214, 24, 63, 0, 0,128, 63, 0, 0,128, 63, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 1, 0, 0,128,127,116, 1, 0, 0, 0, 0, 34, 0, 0, 0,
+ 1, 0, 0, 0,240,128,116, 1, 0, 0, 0, 0, 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,112,114,101,118,105,101,119, 0,101,120, 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,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, 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, 5, 0, 8, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63,
+ 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, 1, 0, 0, 0, 2, 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, 84, 69, 0, 0, 48, 1, 0, 0,240,128,116, 1,
+ 0, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,127,116, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 69,102, 97,107,101,115,104, 97,100,111,119, 0, 0, 76,101,110,100, 0,101,
+120, 0, 0, 0, 2, 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, 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, 5, 0, 40, 0, 5, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 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, 1, 0, 0, 0, 2, 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, 77, 69, 0, 0,
+120, 1, 0, 0, 96,130,116, 1, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0, 32, 2,118, 1, 0, 0, 0, 0, 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, 46, 48, 48, 49, 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,208, 1,118, 1, 0, 0, 0, 0,192,223,116, 1, 0, 0, 0, 0, 16, 7,117, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,160,133,116, 1, 0, 0, 0, 0,224,174,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16,101,117, 1,
+ 0, 0, 0, 0, 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,132,116, 1,
+ 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 96,173,116, 1, 0, 0, 0, 0, 1, 0, 0, 0,
+ 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 64,222,116, 1, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0,
+ 0, 0, 0, 0,249, 1, 0, 0,237, 3, 0, 0,244, 1, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,192,133, 88, 61,
+184, 45, 85,189,196,181, 24,190,185, 71, 35, 63,153, 31,235, 62,130,102,203, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 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, 68, 65, 84, 65, 8, 0, 0, 0,208, 1,118, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0,128,107,116, 1, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 32,132,116, 1, 0, 0, 0, 0, 5, 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,160,133,116, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,116, 39, 0, 0,160,133,116, 1, 0, 0, 0, 0, 56, 0, 0, 0,249, 1, 0, 0,140,144,131, 62,
+119,163,200, 60,156, 9, 85, 62,125, 92, 70,170,228, 21, 0,255, 50,222, 26,190,119,163,200, 60,156, 9, 85, 62,131,163, 70,170,
+228, 21, 0,255, 61,126,146, 62,223, 37, 8,188, 99,183, 47, 62,247, 76,191,194,228, 81, 2,255,147,185, 56,190,223, 37, 8,188,
+ 99,183, 47, 62, 9,179,191,194,228, 81, 2,255,129,176,157, 62,211, 91,217,188,244,238,246, 61, 31, 84,226,181,191, 61, 2,255,
+ 28, 30, 79,190,211, 91,217,188,244,238,246, 61,225,171,226,181,191, 61, 2,255,115, 19, 94, 62,103,251,128,189,150, 32, 14, 62,
+241, 9,155,144, 64, 62, 2,255, 26,161,227,189,103,251,128,189,150, 32, 14, 62, 15,246,155,144, 64, 62, 2,255,115, 19, 94, 62,
+251,118, 25,189, 20,165, 62, 62,184, 14,144,163, 76, 87, 2,255, 26,161,227,189,251,118, 25,189, 20,165, 62, 62, 72,241,144,163,
+ 76, 87, 2,255,115, 19, 94, 62,232,107, 34, 60,116,128, 92, 62, 3, 3,121,131,110, 29, 0,255, 26,161,227,189,232,107, 34, 60,
+116,128, 92, 62,253,252,121,131,110, 29, 0,255, 58,193, 56, 62,119,163,200, 60, 77,247, 99, 62, 56,171,117,167,206, 36, 0,255,
+168,252,152,189,119,163,200, 60, 77,247, 99, 62,200, 84,117,167,206, 36, 0,255,109, 42, 23, 62,223, 37, 8,188, 88,215, 73, 62,
+152,217,122,203, 56,110, 0,255,229,197, 0, 62,211, 91,217,188, 71, 14, 29, 62,179,184, 93,175, 66, 69, 2,255,249, 23,164,188,
+211, 91,217,188, 71, 14, 29, 62, 77, 71, 93,175, 66, 69, 2,255, 88,231,182, 61,159,154,121, 61,179,201, 32, 62,181,151,104,255,
+ 51, 74, 2,255,207,121,134, 60,159,154,121, 61,179,201, 32, 62, 75,104,104,255, 51, 74, 2,255, 25,158,242, 61,159,154,121, 61,
+ 88,215, 73, 62, 78,171,150,255,246, 95, 2,255,110,194, 80,188,159,154,121, 61, 88,215, 73, 62,178, 84,150,255,246, 95, 2,255,
+138,211, 41, 62,159,154,121, 61, 77,247, 99, 62,152,133,153,254, 98, 37, 0,255,143, 66,118,189,159,154,121, 61, 77,247, 99, 62,
+104,122,153,254, 98, 37, 0,255, 58,193, 56, 62,154,232,206, 61, 77,247, 99, 62, 24,170, 13, 88, 89, 35, 0,255,168,252,152,189,
+154,232,206, 61, 77,247, 99, 62,232, 85, 13, 88, 89, 35, 0,255,109, 42, 23, 62,173, 79, 5, 62, 88,215, 73, 62,249,200,221, 65,
+244, 94, 2,255, 31,158, 43,189,173, 79, 5, 62, 88,215, 73, 62, 7, 55,221, 65,244, 94, 2,255,229,197, 0, 62, 54,180, 27, 62,
+ 71, 14, 29, 62, 51,186, 86, 78, 78, 73, 2,255,249, 23,164,188, 54,180, 27, 62, 71, 14, 29, 62,205, 69, 86, 78, 78, 73, 2,255,
+115, 19, 94, 62,111, 6, 65, 62,150, 32, 14, 62, 2, 11,152,107,114, 68, 2,255, 26,161,227,189,111, 6, 65, 62,150, 32, 14, 62,
+254,244,152,107,114, 68, 2,255,115, 19, 94, 62, 14, 43, 35, 62, 20,165, 62, 62,201, 14,180, 91, 14, 88, 2,255, 26,161,227,189,
+ 14, 43, 35, 62, 20,165, 62, 62, 55,241,180, 91, 14, 88, 2,255,115, 19, 94, 62,250,195,236, 61,116,128, 92, 62,134, 2, 29,125,
+228, 26, 0,255, 26,161,227,189,250,195,236, 61,116,128, 92, 62,122,253, 29,125,228, 26, 0,255,140,144,131, 62,154,232,206, 61,
+156, 9, 85, 62, 54, 93, 67, 85,154, 20, 0,255, 50,222, 26,190,154,232,206, 61,156, 9, 85, 62,202,162, 67, 85,154, 20, 0,255,
+ 61,126,146, 62,173, 79, 5, 62, 99,183, 47, 62,241, 76,161, 60, 97, 82, 2,255,147,185, 56,190,173, 79, 5, 62, 99,183, 47, 62,
+ 15,179,161, 60, 97, 82, 2,255,129,176,157, 62, 54,180, 27, 62,244,238,246, 61,179, 83,157, 71, 45, 65, 2,255, 28, 30, 79,190,
+ 54,180, 27, 62,244,238,246, 61, 77,172,157, 71, 45, 65, 2,255,157, 89,176, 62,159,154,121, 61, 67, 1,232, 61, 40,111,113,255,
+117, 63, 2,255, 84,112,116,190,159,154,121, 61, 67, 1,232, 61,216,144,113,255,117, 63, 2,255,237,107,161, 62,159,154,121, 61,
+139, 64, 40, 62, 48,100,154,255,167, 79, 2,255,244,148, 86,190,159,154,121, 61,139, 64, 40, 62,208,155,154,255,167, 79, 2,255,
+100, 7,139, 62,159,154,121, 61, 48, 78, 81, 62,117,126,181,254,185, 19, 0,255,227,203, 41,190,159,154,121, 61, 48, 78, 81, 62,
+139,129,181,254,185, 19, 0,255, 26,229,140, 62,159,154,121, 61, 8,197, 88, 62,160,120,106,254,198, 42, 2,255, 79,135, 45,190,
+159,154,121, 61, 8,197, 88, 62, 96,135,106,254,198, 42, 2,255, 66,110,133, 62,114, 95,214, 61,116,128, 92, 62,173, 93,126, 74,
+ 93, 45, 2,255,158,153, 30,190,114, 95,214, 61,116,128, 92, 62, 83,162,126, 74, 93, 45, 2,255,115, 19, 94, 62,170,177,251, 61,
+185,178,103, 62, 9, 11, 31,115,216, 54, 2,255, 26,161,227,189,170,177,251, 61,185,178,103, 62,247,244, 31,115,216, 54, 2,255,
+206, 5, 53, 62,114, 95,214, 61,145, 41,111, 62, 9,181,184, 80, 43, 65, 2,255,208,133,145,189,114, 95,214, 61,145, 41,111, 62,
+247, 74,184, 80, 43, 65, 2,255,178, 92, 34, 62,159,154,121, 61,145, 41,111, 62,116,146, 57,254, 43, 66, 2,255, 48,103, 88,189,
+159,154,121, 61,145, 41,111, 62,140,109, 57,254, 43, 66, 2,255,206, 5, 53, 62, 22,200,170, 60,145, 41,111, 62, 34,182,181,173,
+115, 64, 2,255,208,133,145,189, 22,200,170, 60,145, 41,111, 62,222, 73,181,173,115, 64, 2,255,115, 19, 94, 62,159,154,121, 61,
+253,228,114, 62, 74, 24,139,255,171,125, 2,255, 26,161,227,189,159,154,121, 61,253,228,114, 62,182,231,139,255,171,125, 2,255,
+115, 19, 94, 62,149,249, 43, 59,185,178,103, 62,218, 10,140,140, 45, 54, 2,255, 26,161,227,189,149,249, 43, 59,185,178,103, 62,
+ 38,245,140,140, 45, 54, 2,255, 66,110,133, 62, 22,200,170, 60,116,128, 92, 62,141, 92,203,179,210, 44, 2,255,158,153, 30,190,
+ 22,200,170, 60,116,128, 92, 62,115,163,203,179,210, 44, 2,255,203,133, 88, 61,202,248, 23, 62, 88,215, 73, 62, 0, 0, 43,124,
+ 17, 31, 0,255,203,133, 88, 61, 34, 77,229, 61,145, 41,111, 62, 0, 0, 63,249,209,127, 0,255,203,133, 88, 61,150,254,188,190,
+236, 27, 70, 62, 0, 0,204,251,237,127, 0,255,203,133, 88, 61,191, 79, 78,190,116,128, 92, 62, 0, 0, 33,150,238, 71, 2,255,
+203,133, 88, 61,146,221, 14,190, 77,247, 99, 62, 0, 0, 28,100,192, 79, 0,255,203,133, 88, 61, 30, 99,211,190, 20,165, 62, 62,
+ 0, 0,184,142,147, 59, 2,255,203,133, 88, 61,133,198, 12, 62,190,169, 6, 62, 0, 0,143,103, 57, 75, 0,255,203,133, 88, 61,
+ 99, 38, 91, 62, 28,120,239, 61, 0, 0,115, 78, 34,101, 0,255,203,133, 88, 61, 16,243,187, 62,170,250,206,190, 0, 0,190,110,
+212,191, 2,255,203,133, 88, 61,247,106, 87, 62,178,224, 11,191, 0, 0,144, 35, 12,133, 3,255,203,133, 88, 61, 18,165,157,188,
+ 33, 20, 9,191, 0, 0,194,214,213,134, 2,255,203,133, 88, 61, 32, 43,108,190,227, 83,160,190, 0, 0,154,134,113,215, 2,255,
+109, 42, 23, 62,146,221, 14,190, 67, 1,232, 61,144,113,122,198, 79, 13, 0,255, 31,158, 43,189,146,221, 14,190, 67, 1,232, 61,
+112,142,122,198, 79, 13, 0,255, 87,106, 75, 62,138, 37,131,190, 28,120,239, 61,196,122, 19, 31,152, 18, 2,255,225, 78,190,189,
+138, 37,131,190, 28,120,239, 61, 60,133, 19, 31,152, 18, 2,255,115, 19, 94, 62, 2,186,192,190, 28,120,239, 61,167,125,146, 12,
+226, 20, 0,255, 26,161,227,189, 2,186,192,190, 28,120,239, 61, 89,130,146, 12,226, 20, 0,255, 75,138,101, 62,200, 96,239,190,
+227, 37,202, 61,113,124,142,242,196, 26, 2,255,203,142,242,189,200, 96,239,190,227, 37,202, 61,143,131,142,242,196, 26, 2,255,
+ 47,225, 82, 62,195,112,252,190, 10,175,194, 61,159, 79, 44,159,210, 25, 2,255,146, 60,205,189,195,112,252,190, 10,175,194, 61,
+ 97,176, 44,159,210, 25, 2,255, 41,248, 11, 62,242, 4, 1,191,107,138,224, 61,143, 19, 13,131,178, 19, 2,255, 27,170,253,188,
+242, 4, 1,191,107,138,224, 61,113,236, 13,131,178, 19, 2,255,203,133, 88, 61,168,226, 2,191,244,238,246, 61, 0, 0, 75,130,
+ 21, 24, 2,255,140,144,131, 62, 18,242,240,189,227, 37,202, 61,114, 47,117,137,232, 8, 2,255, 50,222, 26,190, 18,242,240,189,
+227, 37,202, 61,142,208,117,137,232, 8, 2,255, 83, 55,178, 62, 23,233,143,189,187,156,209, 61, 25, 77,198,154,214, 13, 2,255,
+193, 43,120,190, 23,233,143,189,187,156,209, 61,231,178,198,154,214, 13, 2,255, 26,222,224, 62,182,236,140, 60, 49, 21,112, 61,
+216,113,247,198,255, 12, 2,255,167,188,170,190,182,236,140, 60, 49, 21,112, 61, 40,142,247,198,255, 12, 2,255,243, 84,232, 62,
+202,248, 23, 62, 82,238, 2, 62,104,113, 31, 51, 32, 30, 2,255,128, 51,178,190,202,248, 23, 62, 82,238, 2, 62,152,142, 31, 51,
+ 32, 30, 2,255,112,224,196, 62,190, 24, 50, 62, 2,220, 17, 62,216, 64,225,106,121, 27, 0,255,253,190,142,190,190, 24, 50, 62,
+ 2,220, 17, 62, 40,191,225,106,121, 27, 0,255,134,160,144, 62, 20, 20,106, 62, 99,183, 47, 62,137, 75, 82,101, 70, 20, 0,255,
+ 39,254, 52,190, 20, 20,106, 62, 99,183, 47, 62,119,180, 82,101, 70, 20, 0,255,195, 37, 79, 62, 67, 92,154, 62,236, 27, 70, 62,
+241, 38, 19,119, 54, 26, 2,255,186,197,197,189, 67, 92,154, 62,236, 27, 70, 62, 15,217, 19,119, 54, 26, 2,255,229,197, 0, 62,
+181, 7,145, 62, 48, 78, 81, 62, 21,175, 54, 96, 12, 24, 2,255,249, 23,164,188,181, 7,145, 62, 48, 78, 81, 62,235, 80, 54, 96,
+ 12, 24, 2,255,168,249,167, 61, 42,212, 53, 62,196,146, 77, 62,174,155,128, 76,151, 21, 0,255,144, 48,194, 60, 42,212, 53, 62,
+196,146, 77, 62, 82,100,128, 76,151, 21, 0,255, 81,129, 4, 62,241,129, 16, 62, 8,197, 88, 62, 0, 25, 4,237, 22,124, 0,255,
+ 89,243,193,188,241,129, 16, 62, 8,197, 88, 62, 0,231, 4,237, 22,124, 0,255,105,176,227, 61, 17,132,184, 61,156, 9, 85, 62,
+160,255,126,232,209,125, 0,255,214,169,178,187, 17,132,184, 61,156, 9, 85, 62, 96, 0,126,232,209,125, 0,255, 31,158, 43,189,
+223, 37, 8,188, 88,215, 73, 62,104, 38,122,203, 56,110, 0,255,184, 69,105, 62, 92, 82, 55,189, 59, 46, 55, 62,106, 34,119,200,
+ 16,110, 0,255,163, 5,250,189, 92, 82, 55,189, 59, 46, 55, 62,150,221,119,200, 16,110, 0,255,134,160,144, 62,115,128,187,188,
+139, 64, 40, 62,161, 55, 60,207,115,104, 0,255, 39,254, 52,190,115,128,187,188,139, 64, 40, 62, 95,200, 60,207,115,104, 0,255,
+157, 89,176, 62,205, 26, 17, 61, 71, 14, 29, 62,181, 58,123,226,214,109, 0,255, 84,112,116,190,205, 26, 17, 61, 71, 14, 29, 62,
+ 75,197,123,226,214,109, 0,255, 9, 21,180, 62, 57, 13,177, 61, 71, 14, 29, 62,157, 49, 61,230, 36,115, 0,255, 45,231,123,190,
+ 57, 13,177, 61, 71, 14, 29, 62, 99,206, 61,230, 36,115, 0,255,123,192,170, 62,170,177,251, 61, 31,133, 36, 62,206, 39,175,234,
+196,119, 0,255, 16, 62,105,190,170,177,251, 61, 31,133, 36, 62, 50,216,175,234,196,119, 0,255,214,178,129, 62, 54,180, 27, 62,
+ 20,165, 62, 62, 62, 24, 85,255,173,125, 0,255,198, 34, 23,190, 54,180, 27, 62, 20,165, 62, 62,194,231, 85,255,173,125, 0,255,
+246,142, 45, 62,230,161, 42, 62, 48, 78, 81, 62,251, 31, 40,247,158,123, 0,255, 32,152,130,189,230,161, 42, 62, 48, 78, 81, 62,
+ 5,224, 40,247,158,123, 0,255,203,133, 88, 61,104,133,209,190,236, 27, 70, 62, 0, 0,148,210,170,119, 0,255,185,194,212, 61,
+ 36, 83,198,190,236, 27, 70, 62, 39, 19, 65,222,248,121, 0,255,191,196,240, 58, 36, 83,198,190,236, 27, 70, 62,217,236, 65,222,
+248,121, 0,255,145, 57,220, 61,207, 80,226,190,167,233, 58, 62,134, 2,132,217, 12,122, 0,255, 77,241,236,186,207, 80,226,190,
+167,233, 58, 62,122,253,132,217, 12,122, 0,255,168,249,167, 61, 19,131,237,190,207,114, 51, 62, 13,252,169,214, 18,121, 0,255,
+144, 48,194, 60, 19,131,237,190,207,114, 51, 62,243, 3,169,214, 18,121, 0,255,203,133, 88, 61,200, 96,239,190, 99,183, 47, 62,
+ 0, 0,150,219,180,122, 0,255,203,133, 88, 61,254,152, 18,190,196,146, 77, 62, 0, 0, 46, 97, 76, 83, 0,255,203,133, 88, 61,
+ 18,242,240,189, 88,215, 73, 62, 0, 0,197,104,134, 73, 0,255,225, 75,205, 61,235,104,248,189, 88,215, 73, 62, 52, 36, 2, 53,
+187,110, 0,255,179,158,179, 59,235,104,248,189, 88,215, 73, 62,204,219, 2, 53,187,110, 0,255,105,176,227, 61,174,134, 33,190,
+196,146, 77, 62,187, 95, 14,212,182, 72, 0,255,214,169,178,187,174,134, 33,190,196,146, 77, 62, 69,160, 14,212,182, 72, 0,255,
+ 48, 94,190, 61, 15, 98, 63,190, 88,215, 73, 62,117, 64,117,207, 90, 99, 0,255,220, 60, 81, 60, 15, 98, 63,190, 88,215, 73, 62,
+139,191,117,207, 90, 99, 0,255,252,119,116, 62,239, 95,151,189,139, 64, 40, 62,103, 49,157,196, 13,102, 0,255, 22, 53, 8,190,
+239, 95,151,189,139, 64, 40, 62,153,206,157,196, 13,102, 0,255,231,123,174, 62,211, 91,217,188, 2,220, 17, 62,142, 59,107,204,
+223,100, 2,255,232,180,112,190,211, 91,217,188, 2,220, 17, 62,114,196,107,204,223,100, 2,255,220,155,200, 62, 45,246, 46, 61,
+190,169, 6, 62,102, 66, 11,217, 65,102, 0,255,105,122,146,190, 45,246, 46, 61,190,169, 6, 62,154,189, 11,217, 65,102, 0,255,
+ 72, 87,204, 62,170,177,251, 61,179,201, 32, 62, 87, 54,142,228,151,112, 0,255,213, 53,150,190,170,177,251, 61,179,201, 32, 62,
+169,201,142,228,151,112, 0,255, 78, 71,191, 62,241,129, 16, 62,128, 96, 66, 62, 82, 42, 97,247,125,120, 2,255,219, 37,137,190,
+241,129, 16, 62,128, 96, 66, 62,174,213, 97,247,125,120, 2,255,140,144,131, 62, 31,244, 79, 62, 77,247, 99, 62,192, 41,216,254,
+253,120, 0,255, 50,222, 26,190, 31,244, 79, 62, 77,247, 99, 62, 64,214,216,254,253,120, 0,255, 87,106, 75, 62, 48,189,124, 62,
+105,160,118, 62,217, 28, 53, 7,126,124, 0,255,225, 78,190,189, 48,189,124, 62,105,160,118, 62, 39,227, 53, 7,126,124, 0,255,
+109, 42, 23, 62,236,138,113, 62, 65, 23,126, 62,125,255, 44, 5,227,127, 0,255, 31,158, 43,189,236,138,113, 62, 65, 23,126, 62,
+131, 0, 44, 5,227,127, 0,255,225, 75,205, 61,202,248, 23, 62,213, 91,122, 62,130,238, 89, 2,197,126, 0,255,179,158,179, 59,
+202,248, 23, 62,213, 91,122, 62,126, 17, 89, 2,197,126, 0,255,105,176,227, 61,217,159,203,189, 37,110,107, 62,115, 23, 27,230,
+ 34,123, 0,255,214,169,178,187,217,159,203,189, 37,110,107, 62,141,232, 27,230, 34,123, 0,255,218,229, 26, 62, 64, 3,133,190,
+167,233, 58, 62,212, 74, 28, 14,225,102, 2,255,207,139, 58,189, 64, 3,133,190,167,233, 58, 62, 44,181, 28, 14,225,102, 2,255,
+246,142, 45, 62,184,151,194,190, 99,183, 47, 62,235, 72, 17,252, 31,105, 2,255, 32,152,130,189,184,151,194,190, 99,183, 47, 62,
+ 21,183, 17,252, 31,105, 2,255,206, 5, 53, 62, 99,149,222,190, 31,133, 36, 62,179, 66,197,225,249,104, 2,255,208,133,145,189,
+ 99,149,222,190, 31,133, 36, 62, 77,189,197,225,249,104, 2,255, 30, 24, 38, 62,234,249,244,190,111,151, 21, 62, 62, 44, 4,183,
+ 98, 95, 2,255,224, 84,103,189,234,249,244,190,111,151, 21, 62,194,211, 4,183, 98, 95, 2,255, 81,129, 4, 62, 86,181,248,190,
+111,151, 21, 62,155, 19, 52,158, 54, 80, 2,255, 89,243,193,188, 86,181,248,190,111,151, 21, 62,101,236, 52,158, 54, 80, 2,255,
+203,133, 88, 61,195,112,252,190,219, 82, 25, 62, 0, 0,201,154, 88, 78, 2,255,203,133, 88, 61, 52, 55,247,188,128, 96, 66, 62,
+ 0, 0, 2,252,239,127, 0,255,203,133, 88, 61,222,227, 61, 61,156, 9, 85, 62, 0, 0,112,227,196,124, 0,255, 47,225, 82, 62,
+ 82, 93, 46, 62, 88,215, 73, 62, 58, 21,234,254, 56,126, 0,255,146, 60,205,189, 82, 93, 46, 62, 88,215, 73, 62,198,234,234,254,
+ 56,126, 0,255, 81,129, 4, 62,170, 34, 94, 60,196,146, 77, 62, 37,214,110,232,163,118, 0,255, 89,243,193,188,170, 34, 94, 60,
+196,146, 77, 62,219, 41,110,232,163,118, 0,255, 65, 39,235, 61,222,227, 61, 61, 48, 78, 81, 62,150,232,127,230, 57,123, 0,255,
+173, 11, 21,188,222,227, 61, 61, 48, 78, 81, 62,106, 23,127,230, 57,123, 0,255,145, 57,220, 61, 76,220,190,190,236, 27, 70, 62,
+117, 20,197,248, 36,126, 0,255, 77,241,236,186, 76,220,190,190,236, 27, 70, 62,139,235,197,248, 36,126, 0,255, 88,231,182, 61,
+ 64, 3,133,190,196,146, 77, 62, 43, 19,128, 0,141,126, 2,255,207,121,134, 60, 64, 3,133,190,196,146, 77, 62,213,236,128, 0,
+141,126, 2,255,203,133, 88, 61, 64, 3,133,190,196,146, 77, 62, 0, 0,122,255,254,127, 0,255,203,133, 88, 61, 43, 11, 82,190,
+ 88,215, 73, 62, 0, 0,121,184, 36,106, 0,255, 8,213,197, 61, 55,235, 55,190,116,128, 92, 62,167, 66,139,160, 45, 53, 2,255,
+ 27,134, 21, 60, 55,235, 55,190,116,128, 92, 62, 89,189,139,160, 45, 53, 2,255, 65, 39,235, 61,174,134, 33,190, 77,247, 99, 62,
+133,118,215,224,239, 36, 2,255,173, 11, 21,188,174,134, 33,190, 77,247, 99, 62,123,137,215,224,239, 36, 2,255,185,194,212, 61,
+ 57,123,233,189,116,128, 92, 62,167, 81,141, 95, 49, 24, 2,255,191,196,240, 58, 57,123,233,189,116,128, 92, 62, 89,174,141, 95,
+ 49, 24, 2,255, 31,149,145, 61, 97, 4,226,189,116,128, 92, 62,189,200,160,108, 26, 39, 2,255, 89,225, 13, 61, 97, 4,226,189,
+116,128, 92, 62, 67, 55,160,108, 26, 39, 2,255,203,133, 88, 61,106, 84, 22,190,253,228,114, 62, 0, 0, 42, 23,225,125, 0,255,
+247, 11,153, 61,235,104,248,189, 37,110,107, 62,186,231, 89, 78, 66, 98, 2,255, 82,231,253, 60,235,104,248,189, 37,110,107, 62,
+ 70, 24, 89, 78, 66, 98, 2,255, 8,213,197, 61,195,223,255,189, 37,110,107, 62, 88, 43,134, 62,237,102, 2,255, 27,134, 21, 60,
+195,223,255,189, 37,110,107, 62,168,212,134, 62,237,102, 2,255,185,194,212, 61,174,134, 33,190,253,228,114, 62,247, 46, 89,233,
+228,116, 2,255,191,196,240, 58,174,134, 33,190,253,228,114, 62, 9,209, 89,233,228,116, 2,255, 88,231,182, 61,243,184, 44,190,
+185,178,103, 62, 46, 31,198,181,128, 99, 2,255,207,121,134, 60,243,184, 44,190,185,178,103, 62,210,224,198,181,128, 99, 2,255,
+203,133, 88, 61, 15, 98, 63,190,185,178,103, 62, 0, 0,185,191,175,110, 2,255, 98, 74, 49, 62, 83,148, 74,190,107,138,224, 61,
+ 23,120, 34, 41, 99, 16, 0,255,248, 14,138,189, 83,148, 74,190,107,138,224, 61,233,135, 34, 41, 99, 16, 0,255, 81,129, 4, 62,
+134,253, 40,190,167,233, 58, 62,251, 80, 26,250,241, 98, 0,255, 89,243,193,188,134,253, 40,190,167,233, 58, 62, 5,175, 26,250,
+241, 98, 0,255, 41,248, 11, 62, 83,148, 74,190,167,233, 58, 62,215, 83,153, 16, 71, 95, 0,255, 27,170,253,188, 83,148, 74,190,
+167,233, 58, 62, 41,172,153, 16, 71, 95, 0,255, 30, 24, 38, 62,243,184, 44,190,107,138,224, 61, 24,122, 67, 35, 64, 15, 0,255,
+224, 84,103,189,243,184, 44,190,107,138,224, 61,232,133, 67, 35, 64, 15, 0,255,203,133, 88, 61, 93,165,235,190, 99,183, 47, 62,
+ 0, 0,139, 86, 77, 94, 0,255,247, 11,153, 61,167,199,233,190, 99,183, 47, 62,144,206,200, 70,125, 94, 0,255, 82,231,253, 60,
+167,199,233,190, 99,183, 47, 62,112, 49,200, 70,125, 94, 0,255, 8,213,197, 61, 99,149,222,190,167,233, 58, 62,253,164,109, 17,
+ 75, 88, 0,255, 27,134, 21, 60, 99,149,222,190,167,233, 58, 62, 3, 91,109, 17, 75, 88, 0,255, 8,213,197, 61, 70,236,203,190,
+128, 96, 66, 62,141,225, 87,168, 39, 88, 0,255, 27,134, 21, 60, 70,236,203,190,128, 96, 66, 62,115, 30, 87,168, 39, 88, 0,255,
+203,133, 88, 61,212, 64,213,190,179,201, 32, 62, 0, 0, 20,159,153, 83, 0,255, 8,213,197, 61,252,201,205,190, 31,133, 36, 62,
+ 5,230,250,177, 20, 98, 0,255, 27,134, 21, 60,252,201,205,190, 31,133, 36, 62,251, 25,250,177, 20, 98, 0,255, 8,213,197, 61,
+173,183,220,190,219, 82, 25, 62, 18,152, 8, 24,188, 70, 0,255, 27,134, 21, 60,173,183,220,190,219, 82, 25, 62,238,103, 8, 24,
+188, 70, 0,255,247, 11,153, 61, 59, 12,230,190,111,151, 21, 62, 26,222,242, 49,221,112, 0,255, 82,231,253, 60, 59, 12,230,190,
+111,151, 21, 62,230, 33,242, 49,221,112, 0,255,203,133, 88, 61,241,233,231,190,111,151, 21, 62, 0, 0, 18, 60, 5,113, 0,255,
+189, 60, 8, 62,142,209, 76, 61,116,128, 92, 62, 4, 30, 93,244,225,123, 0,255,186,206,223,188,142,209, 76, 61,116,128, 92, 62,
+252,225, 93,244,225,123, 0,255,149,179, 15, 62, 22,200,170, 60, 8,197, 88, 62, 71, 9, 34,251,144,127, 0,255,190,194, 13,189,
+ 22,200,170, 60, 8,197, 88, 62,185,246, 34,251,144,127, 0,255,155,156, 86, 62,202,248, 23, 62, 48, 78, 81, 62, 81, 17, 74, 2,
+204,126, 0,255,106,179,212,189,202,248, 23, 62, 48, 78, 81, 62,175,238, 74, 2,204,126, 0,255, 58,193, 56, 62, 94, 61, 20, 62,
+ 8,197, 88, 62,218, 25,177,253, 86,125, 2,255,168,252,152,189, 94, 61, 20, 62, 8,197, 88, 62, 38,230,177,253, 86,125, 2,255,
+ 64,170,127, 62, 25, 11, 9, 62, 8,197, 88, 62,182, 21,210,240, 57,125, 2,255, 90,103, 19,190, 25, 11, 9, 62, 8,197, 88, 62,
+ 74,234,210,240, 57,125, 2,255,237,107,161, 62, 34, 77,229, 61,207,114, 51, 62,143, 28,249,237,117,123, 0,255,244,148, 86,190,
+ 34, 77,229, 61,207,114, 51, 62,113,227,249,237,117,123, 0,255, 15, 5,167, 62, 97,150,169, 61, 99,183, 47, 62,209, 15,217,246,
+175,126, 0,255, 56,199, 97,190, 97,150,169, 61, 99,183, 47, 62, 47,240,217,246,175,126, 0,255, 89, 39,165, 62,125, 8, 32, 61,
+247,251, 43, 62,177, 24,190,253,146,125, 0,255,204, 11, 94,190,125, 8, 32, 61,247,251, 43, 62, 79,231,190,253,146,125, 0,255,
+ 26,229,140, 62, 60,222,152,187, 20,165, 62, 62, 20, 33, 75, 2,160,123, 0,255, 79,135, 45,190, 60,222,152,187, 20,165, 62, 62,
+236,222, 75, 2,160,123, 0,255,184, 69,105, 62,115,128,187,188, 88,215, 73, 62, 85, 26,238,248, 14,125, 0,255,163, 5,250,189,
+115,128,187,188, 88,215, 73, 62,171,229,238,248, 14,125, 0,255,178, 92, 34, 62,226,194,133,186,116,128, 92, 62, 8, 7,142,250,
+175,127, 0,255, 48,103, 88,189,226,194,133,186,116,128, 92, 62,248,248,142,250,175,127, 0,255, 41,248, 11, 62, 57, 13,177, 61,
+116,128, 92, 62,169, 34, 2,240, 43,122, 0,255, 27,170,253,188, 57, 13,177, 61,116,128, 92, 62, 87,221, 2,240, 43,122, 0,255,
+218,229, 26, 62,170,177,251, 61,116,128, 92, 62,126, 27,108,239,231,123, 0,255,207,139, 58,189,170,177,251, 61,116,128, 92, 62,
+130,228,108,239,231,123, 0,255, 30, 24, 38, 62,250,195,236, 61, 48, 78, 81, 62,226, 64, 13,207,224, 98, 0,255,224, 84,103,189,
+250,195,236, 61, 48, 78, 81, 62, 30,191, 13,207,224, 98, 0,255, 1,111, 19, 62, 57, 13,177, 61, 48, 78, 81, 62, 29, 96,169,229,
+ 81, 80, 0,255,110,176, 28,189, 57, 13,177, 61, 48, 78, 81, 62,227,159,169,229, 81, 80, 0,255,138,211, 41, 62, 77,106,205, 59,
+ 48, 78, 81, 62, 36, 55,122, 71,188, 90, 0,255,143, 66,118,189, 77,106,205, 59, 48, 78, 81, 62,220,200,122, 71,188, 90, 0,255,
+184, 69,105, 62,161,220, 67,188,128, 96, 66, 62, 76, 21, 90, 78,241, 98, 0,255,163, 5,250,189,161,220, 67,188,128, 96, 66, 62,
+180,234, 90, 78,241, 98, 0,255,174, 41,137, 62,149,249, 43, 59, 59, 46, 55, 62, 85,245, 69, 69, 25,107, 0,255,118, 16, 38,190,
+149,249, 43, 59, 59, 46, 55, 62,171, 10, 69, 69, 25,107, 0,255,129,176,157, 62,222,227, 61, 61,139, 64, 40, 62,232,223,211, 29,
+ 67,120, 0,255, 28, 30, 79,190,222,227, 61, 61,139, 64, 40, 62, 24, 32,211, 29, 67,120, 0,255, 55,142,159, 62,137, 31,162, 61,
+139, 64, 40, 62,148,210,123,238, 95,118, 0,255,136,217, 82,190,137, 31,162, 61,139, 64, 40, 62,108, 45,123,238, 95,118, 0,255,
+ 21,245,153, 62,114, 95,214, 61,247,251, 43, 62,216,229,108,179, 43, 99, 0,255, 67,167, 71,190,114, 95,214, 61,247,251, 43, 62,
+ 40, 26,108,179, 43, 99, 0,255,212,238,123, 62,173, 79, 5, 62,196,146, 77, 62,202,237,179,158, 35, 81, 2,255,238,171, 15,190,
+173, 79, 5, 62,196,146, 77, 62, 54, 18,179,158, 35, 81, 2,255,166,124, 60, 62, 25, 11, 9, 62,156, 9, 85, 62, 24, 39,118,212,
+214,113, 2,255,129,115,160,189, 25, 11, 9, 62,156, 9, 85, 62,232,216,118,212,214,113, 2,255,155,156, 86, 62,133,198, 12, 62,
+196,146, 77, 62,213, 1,189,193,208,111, 0,255,106,179,212,189,133,198, 12, 62,196,146, 77, 62, 43,254,189,193,208,111, 0,255,
+109, 42, 23, 62,216,126,230, 60,196,146, 77, 62,226, 84,192, 42,187, 85, 0,255, 31,158, 43,189,216,126,230, 60,196,146, 77, 62,
+ 30,171,192, 42,187, 85, 0,255, 1,111, 19, 62, 63,191, 91, 61,196,146, 77, 62,235,102,196, 2, 11, 76, 0,255,110,176, 28,189,
+ 63,191, 91, 61,196,146, 77, 62, 21,153,196, 2, 11, 76, 0,255,185,194,212, 61,122,230, 38, 62, 42,101, 10, 62,183,182,118,104,
+ 5,246, 0,255,191,196,240, 58,122,230, 38, 62, 42,101, 10, 62, 73, 73,118,104, 5,246, 0,255, 1,111, 19, 62,186,247,131, 62,
+150, 32, 14, 62,208,192,221, 66, 3,167, 2,255,110,176, 28,189,186,247,131, 62,150, 32, 14, 62, 48, 63,221, 66, 3,167, 2,255,
+155,156, 86, 62,220,144,137, 62, 82,238, 2, 62, 59, 9, 89, 90,208,165, 2,255,106,179,212,189,220,144,137, 62, 82,238, 2, 62,
+197,246, 89, 90,208,165, 2,255,208,194,142, 62,139,175, 83, 62,107,138,224, 61,165, 37,104,114,176,212, 0,255,187, 66, 49,190,
+139,175, 83, 62,107,138,224, 61, 91,218,104,114,176,212, 0,255,152,105,189, 62, 14, 43, 35, 62,170,211,164, 61, 67, 45, 40,116,
+ 1,227, 0,255, 37, 72,135,190, 14, 43, 35, 62,170,211,164, 61,189,210, 40,116, 1,227, 0,255, 66,103,217, 62,133,198, 12, 62,
+ 73,248,134, 61,100, 94,237, 79, 18,223, 0,255,207, 69,163,190,133,198, 12, 62, 73,248,134, 61,156,161,237, 79, 18,223, 0,255,
+ 32,206,211, 62,119,163,200, 60,252,115,211, 60,247,120,255,221,165,231, 0,255,173,172,157,190,119,163,200, 60,252,115,211, 60,
+ 9,135,255,221,165,231, 0,255,123,192,170, 62,188, 45, 85,189,112, 94, 52, 61,155, 76,106,154, 19,242, 0,255, 16, 62,105,190,
+188, 45, 85,189,112, 94, 52, 61,101,179,106,154, 19,242, 0,255,140,144,131, 62, 0, 41,196,189, 33,111,142, 61,204, 56, 26,142,
+138, 13, 0,255, 50,222, 26,190, 0, 41,196,189, 33,111,142, 61, 52,199, 26,142,138, 13, 0,255,203,133, 88, 61, 16,243,187, 62,
+ 89,242,105,188, 0, 0,155,106,214, 70, 2,255,203,133, 88, 61,226,121,208, 62,254, 7, 62,190, 0, 0,243,127, 82, 3, 2,255,
+203,133, 88, 61,254,152, 18,190, 11,214,236,190, 0, 0, 54,164,204,166, 3,255,203,133, 88, 61,173,190,136,190,139,142,124,189,
+ 0, 0,179,129, 65,235, 0,255,203,133, 88, 61,205,243, 1,191, 73,248,134, 61, 0, 0,182,151,204,181, 2,255,203,133, 88, 61,
+247,217,218,190,241, 12, 56, 60, 0, 0,231,221,162,132, 2,255,203,133, 88, 61,161,222,162,190,147, 21,157, 57, 0, 0, 16,212,
+201,135, 0,255,203,133, 88, 61,207, 87,142,190,141,212,146,188, 0, 0,245,147, 97,187, 0,255, 61,119,230, 62,239,172,106, 61,
+161, 43,253,189,164,125,181,235,156, 13, 0,255,202, 85,176,190,239,172,106, 61,161, 43,253,189, 92,130,181,235,156, 13, 0,255,
+243, 84,232, 62,194,113,199, 61, 78, 26, 47,190,174,126, 23,238, 66,252, 0,255,128, 51,178,190,194,113,199, 61, 78, 26, 47,190,
+ 82,129, 23,238, 66,252, 0,255, 32,206,211, 62,216, 49,147, 61,181,218,180,190, 70, 81,148, 13, 15,158, 1,255,173,172,157,190,
+216, 49,147, 61,181,218,180,190,186,174,148, 13, 15,158, 1,255,174, 41,137, 62, 54,180, 27, 62,226, 76,244,190,123, 58,228, 21,
+ 70,144, 3,255,118, 16, 38,190, 54,180, 27, 62,226, 76,244,190,133,197,228, 21, 70,144, 3,255,146,121,202, 62,239, 95,151,189,
+240, 61,238,189, 76, 89,139,164,161, 6, 2,255, 31, 88,148,190,239, 95,151,189,240, 61,238,189,180,166,139,164,161, 6, 2,255,
+197,226,168, 62, 97, 4,226,189,163, 21,103,190, 93, 38, 34,134,182, 7, 0,255,164,130,101,190, 97, 4,226,189,163, 21,103,190,
+163,217, 34,134,182, 7, 0,255, 9, 21,180, 62,109, 27,100,189,255,252,178,190,106, 43,219,170,222,170, 1,255, 45,231,123,190,
+109, 27,100,189,255,252,178,190,150,212,219,170,222,170, 1,255,155,156, 86, 62,211, 91,217,188, 85,248,234,190,168, 55,109,213,
+229,148, 2,255,106,179,212,189,211, 91,217,188, 85,248,234,190, 88,200,109,213,229,148, 2,255, 30, 24, 38, 62,112, 61, 93,190,
+191,112, 37, 61,197,120, 36,255,158,213, 0,255,224, 84,103,189,112, 61, 93,190,191,112, 37, 61, 59,135, 36,255,158,213, 0,255,
+ 41,248, 11, 62,209, 24,123,190,176,102,236,188,188, 84, 20,181, 24,196, 0,255, 27,170,253,188,209, 24,123,190,176,102,236,188,
+ 68,171, 20,181, 24,196, 0,255, 19, 56, 64, 62,110,117,196,190, 92, 79,241, 60,131, 79, 86,254,183,155, 2,255, 89,234,167,189,
+110,117,196,190, 92, 79,241, 60,125,176, 86,254,183,155, 2,255,246,142, 45, 62, 59, 19,146,190, 95,149, 7, 61, 5, 99, 8, 1,
+231,174, 0,255, 32,152,130,189, 59, 19,146,190, 95,149, 7, 61,251,156, 8, 1,231,174, 0,255, 47,225, 82, 62,234,249,244,190,
+ 15,131, 22, 61, 65, 62,227,185,224,168, 2,255,146, 60,205,189,234,249,244,190, 15,131, 22, 61,191,193,227,185,224,168, 2,255,
+ 25,158,242, 61,178,167,207,190,155,152,181, 60,133, 16,208,232, 55,131, 0,255,110,194, 80,188,178,167,207,190,155,152,181, 60,
+123,239,208,232, 55,131, 0,255,105,176,227, 61,201,103,155,190, 58,189,151, 60, 7, 48,163,224,149,141, 0,255,214,169,178,187,
+201,103,155,190, 58,189,151, 60,249,207,163,224,149,141, 0,255, 81,129, 4, 62,195,112,252,190,129, 39, 97, 61, 68, 12,218,158,
+147,173, 0,255, 89,243,193,188,195,112,252,190,129, 39, 97, 61,188,243,218,158,147,173, 0,255, 70,161, 30, 62,163,166, 59,190,
+208, 57, 82, 61,195,124,106,227,203,255, 0,255,127,121, 73,189,163,166, 59,190,208, 57, 82, 61, 61,131,106,227,203,255, 0,255,
+218,229, 26, 62,174,134, 33,190, 33,111,142, 61, 29,120,105,231,193, 36, 0,255,207,139, 58,189,174,134, 33,190, 33,111,142, 61,
+227,135,105,231,193, 36, 0,255,109, 42, 23, 62,186,102, 7,190,130, 74,172, 61,160,101,164,182,240, 25, 0,255, 31,158, 43,189,
+186,102, 7,190,130, 74,172, 61, 96,154,164,182,240, 25, 0,255,218,229, 26, 62,140,230,111,190,206,171,148,189,120, 84,221,159,
+198,253, 0,255,207,139, 58,189,140,230,111,190,206,171,148,189,136,171,221,159,198,253, 0,255,127,243, 67, 62, 83,148, 74,190,
+ 16,205,139,190,255, 67, 42,151, 73,228, 2,255, 49, 97,175,189, 83,148, 74,190, 16,205,139,190, 1,188, 42,151, 73,228, 2,255,
+ 7, 88, 90, 62,235,104,248,189,244, 28,205,190,201, 63, 25,176, 0,179, 3,255, 66, 42,220,189,235,104,248,189,244, 28,205,190,
+ 55,192, 25,176, 0,179, 3,255,248, 75,135, 62, 55,124,180, 62,187,202,167,190, 34, 56,160, 95, 17,192, 2,255, 10, 85, 34,190,
+ 55,124,180, 62,187,202,167,190,222,199,160, 95, 17,192, 2,255,248, 75,135, 62,232,105,195, 62,146, 76, 58,190, 54, 55,120,115,
+239, 0, 2,255, 10, 85, 34,190,232,105,195, 62,146, 76, 58,190,202,200,120,115,239, 0, 2,255,248, 75,135, 62,203,192,176, 62,
+105,252, 34,189,239, 63,164, 92,238, 60, 2,255, 10, 85, 34,190,203,192,176, 62,105,252, 34,189, 17,192,164, 92,238, 60, 2,255,
+174, 41,137, 62,219,193, 68, 62,208, 57, 82, 61,123, 49,255,102,170, 57, 0,255,118, 16, 38,190,219,193, 68, 62,208, 57, 82, 61,
+133,206,255,102,170, 57, 0,255,220,155,200, 62,133,198, 12, 62, 95,172,248, 59,142, 98,198, 73, 6, 35, 0,255,105,122,146,190,
+133,198, 12, 62, 95,172,248, 59,114,157,198, 73, 6, 35, 0,255, 83, 55,178, 62, 14, 43, 35, 62,141,212,146,188,129, 61,254,106,
+241, 33, 0,255,193, 43,120,190, 14, 43, 35, 62,141,212,146,188,127,194,254,106,241, 33, 0,255, 9, 21,180, 62, 72, 76,141, 62,
+161, 43,253,189,234, 76,151, 87,221, 52, 0,255, 45,231,123,190, 72, 76,141, 62,161, 43,253,189, 22,179,151, 87,221, 52, 0,255,
+ 66,103,217, 62,247,106, 87, 62, 7,254,185,189,187,101, 28, 66,199, 40, 2,255,207, 69,163,190,247,106, 87, 62, 7,254,185,189,
+ 69,154, 28, 66,199, 40, 2,255, 66,103,217, 62,236,138,113, 62, 26,177, 80,190,183,113, 68, 58,119,248, 2,255,207, 69,163,190,
+236,138,113, 62, 26,177, 80,190, 73,142, 68, 58,119,248, 2,255, 9, 21,180, 62,141,126,152, 62, 83, 3,118,190,235, 86,238, 93,
+205,253, 0,255, 45,231,123,190,141,126,152, 62, 83, 3,118,190, 21,169,238, 93,205,253, 0,255, 9, 21,180, 62, 38,179,135, 62,
+107,184,182,190,232, 85,154, 70,157,192, 2,255, 45,231,123,190, 38,179,135, 62,107,184,182,190, 24,170,154, 70,157,192, 2,255,
+ 66,103,217, 62,179, 56, 76, 62,153, 49,162,190,166,110,177, 42,222,207, 2,255,207, 69,163,190,179, 56, 76, 62,153, 49,162,190,
+ 90,145,177, 42,222,207, 2,255,231,123,174, 62,154,232,206, 61, 56, 79,216,190, 58, 75, 57, 1,116,152, 3,255,232,180,112,190,
+154,232,206, 61, 56, 79,216,190,198,180, 57, 1,116,152, 3,255,208,194,142, 62,171,100, 40,189,170,250,206,190, 73, 70,147,187,
+200,173, 1,255,187, 66, 49,190,171,100, 40,189,170,250,206,190,183,185,147,187,200,173, 0,255,100, 0,223, 62,154,232,206, 61,
+191,190,121,190,194,114, 80, 41,207, 38, 0,255,241,222,168,190,154,232,206, 61,191,190,121,190, 62,141, 80, 41,207, 38, 0,255,
+104, 51,120, 62,186,102, 7,190,127,153,163,189,232, 74,153,154, 28, 22, 0,255,130,240, 11,190,186,102, 7,190,127,153,163,189,
+ 24,181,153,154, 28, 22, 0,255,214,178,129, 62,254,152, 18,190, 44,122,125,190, 89, 71,115,151, 1,237, 0,255,198, 34, 23,190,
+254,152, 18,190, 44,122,125,190,167,184,115,151, 1,237, 0,255,202,203,239, 62,133,198, 12, 62, 56, 86,132,190, 72,220,207, 93,
+106, 79, 2,255, 88,170,185,190,133,198, 12, 62, 56, 86,132,190,184, 35,207, 93,106, 79, 2,255, 32,206,211, 62, 18,242,240,189,
+135,108, 84,190, 30, 15, 34,150, 84, 70, 2,255,173,172,157,190, 18,242,240,189,135,108, 84,190,226,240, 34,150, 84, 70, 2,255,
+ 38,160, 9, 63,217,159,203,189,192,186,154,190,164, 67,138,166,172, 61, 0,255,219, 30,221,190,217,159,203,189,192,186,154,190,
+ 92,188,138,166,172, 61, 0,255,172,140, 38, 63,211, 91,217,188,255,252,178,190,179, 83,223,206,114, 83, 0,255,244,123, 11,191,
+211, 91,217,188,255,252,178,190, 77,172,223,206,114, 83, 0,255, 95,242, 46, 63,194,113,199, 61, 73, 31,177,190, 54, 92,232, 12,
+210, 87, 2,255,167,225, 19,191,194,113,199, 61, 73, 31,177,190,202,163,232, 12,210, 87, 2,255,138,243, 32, 63, 3, 75, 61, 62,
+ 73, 31,177,190,247, 62,221, 83, 97, 73, 0,255,209,226, 5,191, 3, 75, 61, 62, 73, 31,177,190, 9,193,221, 83, 97, 73, 0,255,
+112,194, 7, 63, 82, 93, 46, 62, 84,255,150,190,181, 5, 80,111,236, 62, 0,255,111, 99,217,190, 82, 93, 46, 62, 84,255,150,190,
+ 75,250, 80,111,236, 62, 0,255,149,211, 6, 63,241,129, 16, 62, 50,102,145,190,236, 69,117,239,236,105, 0,255,185,133,215,190,
+241,129, 16, 62, 50,102,145,190, 20,186,117,239,236,105, 0,255,104, 90, 27, 63, 54,180, 27, 62,113,168,169,190, 34, 24,205,231,
+ 89,123, 0,255,175, 73, 0,191, 54,180, 27, 62,113,168,169,190,222,231,205,231, 89,123, 0,255,246,174, 36, 63, 97,150,169, 61,
+221, 99,173,190, 69,223, 16,252,173,123, 0,255, 62,158, 9,191, 97,150,169, 61,221, 99,173,190,187, 32, 16,252,173,123, 0,255,
+249, 38, 30, 63, 98,147,127,188,221, 99,173,190,171,239, 0, 39,207,120, 0,255, 64, 22, 3,191, 98,147,127,188,221, 99,173,190,
+ 85, 16, 0, 39,207,120, 0,255, 75,177, 8, 63, 23,233,143,189,158, 33,149,190, 9, 51, 56, 45, 82,108, 0,255, 37, 65,219,190,
+ 23,233,143,189,158, 33,149,190,247,204, 56, 45, 82,108, 0,255, 26,222,224, 62,120,196,173,189,243, 39, 88,190,147, 38,224, 62,
+153,104, 2,255,167,188,170,190,120,196,173,189,243, 39, 88,190,109,217,224, 62,153,104, 2,255,162, 66,247, 62,250,195,236, 61,
+204,154,128,190,218, 62,152,243,206,110, 2,255, 48, 33,193,190,250,195,236, 61,204,154,128,190, 38,193,152,243,206,110, 2,255,
+196,219,252, 62, 17,132,184, 61, 50,102,145,190, 10, 87, 73,182, 19, 58, 0,255, 82,186,198,190, 17,132,184, 61, 50,102,145,190,
+246,168, 73,182, 19, 58, 0,255, 21,238,237, 62,103,251,128,189, 44,122,125,190,232, 15,106,121, 64, 37, 0,255,162,204,183,190,
+103,251,128,189, 44,122,125,190, 24,240,106,121, 64, 37, 0,255, 38,160, 9, 63,188, 45, 85,189, 79, 15,164,190,157,239, 89,122,
+212, 33, 0,255,219, 30,221,190,188, 45, 85,189, 79, 15,164,190, 99, 16, 89,122,212, 33, 0,255,104, 90, 27, 63,223, 37, 8,188,
+107,184,182,190, 8,158,202, 81,185, 9, 0,255,175, 73, 0,191,223, 37, 8,188,107,184,182,190,248, 97,202, 81,185, 9, 0,255,
+138,243, 32, 63, 40, 68,132, 61,107,184,182,190, 60,131,145,239, 95, 23, 0,255,209,226, 5,191, 40, 68,132, 61,107,184,182,190,
+196,124,145,239, 95, 23, 0,255,178,124, 25, 63,250,195,236, 61,181,218,180,190, 27,228, 22,153,206, 70, 0,255,242,215,252,190,
+250,195,236, 61,181,218,180,190,229, 27, 22,153,206, 70, 0,255,112,194, 7, 63, 74,214,221, 61,153, 49,162,190, 65, 68,253,168,
+113, 64, 0,255,111, 99,217,190, 74,214,221, 61,153, 49,162,190,191,187,253,168,113, 64, 0,255,135,153,228, 62, 97,150,169, 61,
+ 44,122,125,190,113, 86,190,222, 87, 88, 0,255, 20,120,174,190, 97,150,169, 61, 44,122,125,190,143,169,190,222, 87, 88, 0,255,
+209,187,226, 62,216,126,230, 60,198,170,141,190,196, 95,107,182,100, 42, 0,255, 93,154,172,190,216,126,230, 60,198,170,141,190,
+ 60,160,107,182,100, 42, 0,255,180, 18,208, 62,223, 37, 8,188,198,170,141,190, 42,111, 21, 14,220, 61, 0,255, 65,241,153,190,
+223, 37, 8,188,198,170,141,190,214,144, 21, 14,220, 61, 0,255,100, 0,223, 62,161,220, 67,188,198,170,141,190, 3, 79, 4, 91,
+ 19, 43, 2,255,241,222,168,190,161,220, 67,188,198,170,141,190,253,176, 4, 91, 19, 43, 2,255,135,153,228, 62, 92, 82, 55,189,
+198,170,141,190,207,107,198,254,250, 68, 2,255, 20,120,174,190, 92, 82, 55,189,198,170,141,190, 49,148,198,254,250, 68, 2,255,
+174, 34,221, 62, 29, 9,115,189,198,170,141,190, 7, 82,225, 64,200, 73, 0,255, 59, 1,167,190, 29, 9,115,189,198,170,141,190,
+249,173,225, 64,200, 73, 0,255,220,155,200, 62,188, 45, 85,189,146, 76, 58,190, 38,117, 66,207, 47,239, 0,255,105,122,146,190,
+188, 45, 85,189,146, 76, 58,190,218,138, 66,207, 47,239, 0,255, 38,190,198, 62,103,251,128,189, 15,209,106,190,150, 97,139, 18,
+184, 80, 0,255,179,156,144,190,103,251,128,189, 15,209,106,190,106,158,139, 18,184, 80, 0,255, 38,190,198, 62, 74,137, 10,189,
+231, 71,114,190, 17,116, 66,240,154, 51, 0,255,179,156,144,190, 74,137, 10,189,231, 71,114,190,239,139, 66,240,154, 51, 0,255,
+ 66,103,217, 62, 45,246, 46, 61, 44,122,125,190,112,113,245,204, 39, 30, 0,255,207, 69,163,190, 45,246, 46, 61, 44,122,125,190,
+144,142,245,204, 39, 30, 0,255,202,203,239, 62,159,154,121, 61, 16,205,139,190,105, 90, 61,185,146, 56, 0,255, 88,170,185,190,
+159,154,121, 61, 16,205,139,190,151,165, 61,185,146, 56, 0,255,202,203,239, 62,239,172,106, 61, 10,221,152,190,191, 82,102,204,
+230, 82, 0,255, 88,170,185,190,239,172,106, 61, 10,221,152,190, 65,173,102,204,230, 82, 0,255,174, 34,221, 62, 29, 9,115,189,
+ 10,221,152,190,246, 29, 64, 98, 94, 76, 0,255, 59, 1,167,190, 29, 9,115,189, 10,221,152,190, 10,226, 64, 98, 94, 76, 0,255,
+ 61,119,230, 62, 92, 82, 55,189, 10,221,152,190,150, 77,111, 17, 75,100, 0,255,202, 85,176,190, 92, 82, 55,189, 10,221,152,190,
+106,178,111, 17, 75,100, 0,255, 26,222,224, 62, 98,147,127,188, 10,221,152,190,239, 60,190, 60,195, 94, 0,255,167,188,170,190,
+ 98,147,127,188, 10,221,152,190, 17,195,190, 60,195, 94, 0,255,106,240,209, 62,223, 37, 8,188, 10,221,152,190,199, 83,178, 23,
+209, 93, 0,255,247,206,155,190,223, 37, 8,188, 10,221,152,190, 57,172,178, 23,209, 93, 0,255,135,153,228, 62,216,126,230, 60,
+ 10,221,152,190, 98, 73, 1,200,170, 88, 0,255, 20,120,174,190,216,126,230, 60, 10,221,152,190,158,182, 1,200,170, 88, 0,255,
+ 38,160, 9, 63,154,232,206, 61,147, 65,175,190, 23, 68,166,223,112,103, 0,255,219, 30,221,190,154,232,206, 61,147, 65,175,190,
+233,187,166,223,112,103, 0,255,104, 90, 27, 63, 74,214,221, 61,249, 12,192,190,165, 18,156,216, 89,120, 0,255,175, 73, 0,191,
+ 74,214,221, 61,249, 12,192,190, 91,237,156,216, 89,120, 0,255, 27,192, 35, 63,159,154,121, 61,175,234,193,190, 25,185, 29,231,
+157,103, 0,255, 98,175, 8,191,159,154,121, 61,175,234,193,190,231, 70, 29,231,157,103, 0,255,249, 38, 30, 63,161,220, 67,188,
+249, 12,192,190, 43,209, 0, 64,119,100, 0,255, 64, 22, 3,191,161,220, 67,188,249, 12,192,190,213, 46, 0, 64,119,100, 0,255,
+ 1,143, 10, 63,188, 45, 85,189, 73, 31,177,190, 52, 26,240, 92, 3, 84, 0,255,145,252,222,190,188, 45, 85,189, 73, 31,177,190,
+204,229,240, 92, 3, 84, 0,255, 21,238,237, 62, 29, 9,115,189, 16,205,139,190, 58, 8,116,111,101, 62, 0,255,162,204,183,190,
+ 29, 9,115,189, 16,205,139,190,198,247,116,111,101, 62, 0,255,122,185,254, 62, 97,150,169, 61, 45,118,158,190,198, 80,102,213,
+175, 89, 0,255, 8,152,200,190, 97,150,169, 61, 45,118,158,190, 58,175,102,213,175, 89, 0,255,202,203,239, 62,226,194,133,186,
+192,186,154,190,136, 25,130, 0,108,125, 0,255, 88,170,185,190,226,194,133,186,192,186,154,190,120,230,130, 0,108,125, 0,255,
+ 14,254,250, 62,115,128,187,188,119,152,156,190, 2, 27, 58, 30,104,121, 0,255,156,220,196,190,115,128,187,188,119,152,156,190,
+254,228, 58, 30,104,121, 0,255,223,245, 4, 63, 77,106,205, 59, 79, 15,164,190,218, 55,126,253, 35,115, 0,255, 76,202,211,190,
+ 77,106,205, 59, 79, 15,164,190, 38,200,126,253, 35,115, 0,255,152, 75, 0, 63,216,126,230, 60,227, 83,160,190,164, 41,199,255,
+ 8,121, 0,255,190,117,202,190,216,126,230, 60,227, 83,160,190, 92,214,199,255, 8,121, 0,255,149,211, 6, 63,239,172,106, 61,
+ 5,237,165,190,237, 39,191, 9, 55,121, 0,255,185,133,215,190,239,172,106, 61, 5,237,165,190, 19,216,191, 9, 55,121, 0,255,
+220,125, 11, 63,205, 26, 17, 61,187,202,167,190,208, 46, 41,244,137,118, 0,255, 71,218,224,190,205, 26, 17, 61,187,202,167,190,
+ 48,209, 41,244,137,118, 0,255,218, 5, 18, 63,222,227, 61, 61,113,168,169,190, 70, 53, 84, 3, 85,116, 2,255, 65,234,237,190,
+222,227, 61, 61,113,168,169,190,186,202, 84, 3, 85,116, 2,255, 73, 57, 15, 63,176,168,154, 61,113,168,169,190, 99, 44, 36, 38,
+212,113, 2,255, 31, 81,232,190,176,168,154, 61,113,168,169,190,157,211, 36, 38,212,113, 2,255,112,194, 7, 63, 54,180, 27, 62,
+249, 12,192,190,249,198, 3, 72,222,166, 3,255,111, 99,217,190, 54,180, 27, 62,249, 12,192,190, 7, 57, 3, 72,222,166, 3,255,
+ 64,209, 34, 63,230,161, 42, 62,170,250,206,190,198, 37,123, 68,174,154, 3,255,135,192, 7,191,230,161, 42, 62,170,250,206,190,
+ 58,218,123, 68,174,154, 3,255, 21,208, 48, 63, 57, 13,177, 61,102,200,195,190, 3,121,201, 17, 73,218, 3,255, 93,191, 21,191,
+ 57, 13,177, 61,102,200,195,190,253,134,201, 17, 73,218, 3,255, 24, 72, 42, 63,211, 91,217,188, 62, 63,203,190, 59, 82, 75,200,
+ 70,175, 3,255, 96, 55, 15,191,211, 91,217,188, 62, 63,203,190,197,173, 75,200, 70,175, 3,255, 38,160, 9, 63, 40,178,188,189,
+175,234,193,190,134,249,184,165,129,165, 3,255,219, 30,221,190, 40,178,188,189,175,234,193,190,122, 6,184,165,129,165, 3,255,
+140,137,215, 62, 97, 4,226,189,192,186,154,190,126,249,122,163,205,167, 1,255, 25,104,161,190, 97, 4,226,189,192,186,154,190,
+130, 6,122,163,205,167, 1,255,243, 84,232, 62, 65,148, 1, 62,187,202,167,190, 93,193,224, 65,229,165, 1,255,128, 51,178,190,
+ 65,148, 1, 62,187,202,167,190,163, 62,224, 65,229,165, 1,255, 68, 65, 84, 65, 64, 1, 0, 0, 96,173,116, 1, 0, 0, 0, 0,
+ 5, 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,
+224,174,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 28, 47, 0, 0,224,174,116, 1, 0, 0, 0, 0, 53, 0, 0, 0,237, 3, 0, 0,
+ 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 43, 0, 0, 0,
+ 0, 0, 34, 0, 43, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 46, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 41, 0, 0, 0, 43, 0, 0, 0,
+ 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0,
+ 42, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 6, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 34, 0, 5, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0,
+ 10, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0,
+ 10, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 34, 0, 11, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0,
+ 15, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0,
+ 17, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 34, 0, 16, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 23, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 25, 0, 0, 0,
+ 0, 0, 34, 0, 24, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0,
+ 26, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0,
+ 26, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0, 31, 0, 0, 0,
+ 0, 0, 34, 0, 29, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0,
+ 32, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 30, 0, 0, 0, 0, 0, 34, 0,
+ 23, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 34, 0, 0, 0,
+ 0, 0, 34, 0, 24, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0,
+ 37, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 38, 0, 0, 0, 0, 0, 34, 0,
+ 34, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 38, 0, 0, 0, 0, 0, 34, 0, 37, 0, 0, 0, 39, 0, 0, 0,
+ 0, 0, 34, 0, 29, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 40, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0,
+ 40, 0, 0, 0, 0, 0, 34, 0, 37, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 39, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0,
+ 38, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0, 42, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 45, 0, 0, 0,
+ 0, 0, 34, 0, 36, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 35, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0,
+ 49, 0, 0, 0, 0, 0, 34, 0, 45, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0,
+ 46, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 51, 0, 0, 0,
+ 0, 0, 34, 0, 49, 0, 0, 0, 51, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,
+ 52, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0,
+ 24, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 55, 0, 0, 0,
+ 0, 0, 34, 0, 53, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0,
+ 13, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 61, 0, 0, 0,
+ 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0,
+ 62, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 61, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0,
+ 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 34, 0, 48, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0,
+ 59, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0,
+ 59, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 34, 0, 58, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0,
+ 60, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0,
+ 51, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 49, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 34, 0, 50, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0,171, 0, 0, 0, 0, 0, 34, 0,171, 0, 0, 0,
+173, 0, 0, 0, 0, 0, 34, 0, 89, 0, 0, 0,173, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0,
+172, 0, 0, 0,173, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0,172, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 89, 0, 0, 0,
+ 0, 0, 34, 0, 85, 0, 0, 0,169, 0, 0, 0, 0, 0, 34, 0,169, 0, 0, 0,171, 0, 0, 0, 0, 0, 34, 0, 85, 0, 0, 0,
+ 87, 0, 0, 0, 0, 0, 34, 0,170, 0, 0, 0,172, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0,170, 0, 0, 0, 0, 0, 34, 0,
+ 86, 0, 0, 0, 88, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0,167, 0, 0, 0, 0, 0, 34, 0,167, 0, 0, 0,169, 0, 0, 0,
+ 0, 0, 34, 0, 83, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0,168, 0, 0, 0,170, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,
+168, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 86, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0,165, 0, 0, 0, 0, 0, 34, 0,
+165, 0, 0, 0,167, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0,166, 0, 0, 0,168, 0, 0, 0,
+ 0, 0, 34, 0, 82, 0, 0, 0,166, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0,
+163, 0, 0, 0, 0, 0, 34, 0,163, 0, 0, 0,165, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 81, 0, 0, 0, 0, 0, 34, 0,
+164, 0, 0, 0,166, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,164, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0, 82, 0, 0, 0,
+ 0, 0, 34, 0, 77, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0,143, 0, 0, 0, 0, 0, 34, 0,143, 0, 0, 0,
+161, 0, 0, 0, 0, 0, 34, 0, 77, 0, 0, 0,161, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0,144, 0, 0, 0, 0, 0, 34, 0,
+ 78, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,162, 0, 0, 0, 0, 0, 34, 0,144, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 34, 0, 90, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,145, 0, 0, 0, 0, 0, 34, 0,143, 0, 0, 0,
+145, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0,146, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0,
+144, 0, 0, 0,146, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0,147, 0, 0, 0,
+ 0, 0, 34, 0,145, 0, 0, 0,147, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0,148, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0,
+ 95, 0, 0, 0, 0, 0, 34, 0,146, 0, 0, 0,148, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0,
+ 96, 0, 0, 0,149, 0, 0, 0, 0, 0, 34, 0,147, 0, 0, 0,149, 0, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0,150, 0, 0, 0,
+ 0, 0, 34, 0, 95, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0,148, 0, 0, 0,150, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0,
+ 98, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,151, 0, 0, 0, 0, 0, 34, 0,149, 0, 0, 0,151, 0, 0, 0, 0, 0, 34, 0,
+ 99, 0, 0, 0,152, 0, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0,150, 0, 0, 0,152, 0, 0, 0,
+ 0, 0, 34, 0, 98, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,153, 0, 0, 0, 0, 0, 34, 0,151, 0, 0, 0,
+153, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,154, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,
+152, 0, 0, 0,154, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,155, 0, 0, 0,
+ 0, 0, 34, 0,153, 0, 0, 0,155, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,156, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,
+103, 0, 0, 0, 0, 0, 34, 0,154, 0, 0, 0,156, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,
+104, 0, 0, 0,157, 0, 0, 0, 0, 0, 34, 0,155, 0, 0, 0,157, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,158, 0, 0, 0,
+ 0, 0, 34, 0,103, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,156, 0, 0, 0,158, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,
+106, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,159, 0, 0, 0, 0, 0, 34, 0,157, 0, 0, 0,159, 0, 0, 0, 0, 0, 34, 0,
+107, 0, 0, 0,160, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,158, 0, 0, 0,160, 0, 0, 0,
+ 0, 0, 34, 0, 65, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,
+159, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,160, 0, 0, 0, 0, 0, 34, 0,
+108, 0, 0, 0,125, 0, 0, 0, 0, 0, 34, 0,125, 0, 0, 0,157, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,159, 0, 0, 0,
+ 0, 0, 34, 0,126, 0, 0, 0,158, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,126, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,
+160, 0, 0, 0, 0, 0, 34, 0,125, 0, 0, 0,176, 0, 0, 0, 0, 0, 34, 0,155, 0, 0, 0,176, 0, 0, 0, 0, 0, 34, 0,
+156, 0, 0, 0,177, 0, 0, 0, 0, 0, 34, 0,126, 0, 0, 0,177, 0, 0, 0, 0, 0, 34, 0,123, 0, 0, 0,153, 0, 0, 0,
+ 0, 0, 34, 0,123, 0, 0, 0,176, 0, 0, 0, 0, 0, 34, 0,124, 0, 0, 0,154, 0, 0, 0, 0, 0, 34, 0,124, 0, 0, 0,
+177, 0, 0, 0, 0, 0, 34, 0,121, 0, 0, 0,151, 0, 0, 0, 0, 0, 34, 0,121, 0, 0, 0,123, 0, 0, 0, 0, 0, 34, 0,
+122, 0, 0, 0,152, 0, 0, 0, 0, 0, 34, 0,122, 0, 0, 0,124, 0, 0, 0, 0, 0, 34, 0,119, 0, 0, 0,149, 0, 0, 0,
+ 0, 0, 34, 0,119, 0, 0, 0,121, 0, 0, 0, 0, 0, 34, 0,120, 0, 0, 0,150, 0, 0, 0, 0, 0, 34, 0,120, 0, 0, 0,
+122, 0, 0, 0, 0, 0, 34, 0,117, 0, 0, 0,147, 0, 0, 0, 0, 0, 34, 0,117, 0, 0, 0,119, 0, 0, 0, 0, 0, 34, 0,
+118, 0, 0, 0,148, 0, 0, 0, 0, 0, 34, 0,118, 0, 0, 0,120, 0, 0, 0, 0, 0, 34, 0,115, 0, 0, 0,145, 0, 0, 0,
+ 0, 0, 34, 0,115, 0, 0, 0,117, 0, 0, 0, 0, 0, 34, 0,116, 0, 0, 0,146, 0, 0, 0, 0, 0, 34, 0,116, 0, 0, 0,
+118, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,143, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0,
+114, 0, 0, 0,144, 0, 0, 0, 0, 0, 34, 0,114, 0, 0, 0,116, 0, 0, 0, 0, 0, 34, 0,112, 0, 0, 0,162, 0, 0, 0,
+ 0, 0, 34, 0,112, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0,174, 0, 0, 0,178, 0, 0, 0, 0, 0, 34, 0,161, 0, 0, 0,
+174, 0, 0, 0, 0, 0, 34, 0,174, 0, 0, 0,179, 0, 0, 0, 0, 0, 34, 0,112, 0, 0, 0,179, 0, 0, 0, 0, 0, 34, 0,
+162, 0, 0, 0,174, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,110, 0, 0, 0,
+ 0, 0, 34, 0,109, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,
+175, 0, 0, 0, 0, 0, 34, 0,175, 0, 0, 0,180, 0, 0, 0, 0, 0, 34, 0,110, 0, 0, 0,180, 0, 0, 0, 0, 0, 34, 0,
+111, 0, 0, 0,181, 0, 0, 0, 0, 0, 34, 0,175, 0, 0, 0,181, 0, 0, 0, 0, 0, 34, 0,178, 0, 0, 0,180, 0, 0, 0,
+ 0, 0, 34, 0,174, 0, 0, 0,175, 0, 0, 0, 0, 0, 32, 0,179, 0, 0, 0,181, 0, 0, 0, 0, 0, 34, 0,132, 0, 0, 0,
+134, 0, 0, 0, 0, 0, 34, 0,134, 0, 0, 0,173, 0, 0, 0, 0, 0, 34, 0,132, 0, 0, 0,171, 0, 0, 0, 0, 0, 34, 0,
+133, 0, 0, 0,134, 0, 0, 0, 0, 0, 34, 0,133, 0, 0, 0,172, 0, 0, 0, 0, 0, 34, 0,130, 0, 0, 0,132, 0, 0, 0,
+ 0, 0, 34, 0,130, 0, 0, 0,169, 0, 0, 0, 0, 0, 34, 0,131, 0, 0, 0,133, 0, 0, 0, 0, 0, 34, 0,131, 0, 0, 0,
+170, 0, 0, 0, 0, 0, 34, 0,128, 0, 0, 0,130, 0, 0, 0, 0, 0, 34, 0,128, 0, 0, 0,167, 0, 0, 0, 0, 0, 34, 0,
+129, 0, 0, 0,131, 0, 0, 0, 0, 0, 34, 0,129, 0, 0, 0,168, 0, 0, 0, 0, 0, 34, 0,163, 0, 0, 0,184, 0, 0, 0,
+ 0, 0, 34, 0,182, 0, 0, 0,184, 0, 0, 0, 0, 0, 34, 0,165, 0, 0, 0,182, 0, 0, 0, 0, 0, 34, 0,183, 0, 0, 0,
+185, 0, 0, 0, 0, 0, 34, 0,164, 0, 0, 0,185, 0, 0, 0, 0, 0, 34, 0,166, 0, 0, 0,183, 0, 0, 0, 0, 0, 34, 0,
+128, 0, 0, 0,182, 0, 0, 0, 0, 0, 34, 0,129, 0, 0, 0,183, 0, 0, 0, 0, 0, 34, 0,141, 0, 0, 0,187, 0, 0, 0,
+ 0, 0, 34, 0,186, 0, 0, 0,187, 0, 0, 0, 0, 0, 32, 0,184, 0, 0, 0,186, 0, 0, 0, 0, 0, 34, 0,141, 0, 0, 0,
+184, 0, 0, 0, 0, 0, 34, 0,142, 0, 0, 0,187, 0, 0, 0, 0, 0, 34, 0,142, 0, 0, 0,185, 0, 0, 0, 0, 0, 34, 0,
+185, 0, 0, 0,186, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0,186, 0, 0, 0, 0, 0, 32, 0, 67, 0, 0, 0,182, 0, 0, 0,
+ 0, 0, 34, 0, 67, 0, 0, 0,183, 0, 0, 0, 0, 0, 34, 0,127, 0, 0, 0,128, 0, 0, 0, 0, 0, 34, 0, 67, 0, 0, 0,
+127, 0, 0, 0, 0, 0, 32, 0,127, 0, 0, 0,129, 0, 0, 0, 0, 0, 34, 0,139, 0, 0, 0,190, 0, 0, 0, 0, 0, 34, 0,
+188, 0, 0, 0,190, 0, 0, 0, 0, 0, 34, 0,141, 0, 0, 0,188, 0, 0, 0, 0, 0, 34, 0,139, 0, 0, 0,141, 0, 0, 0,
+ 0, 0, 34, 0,189, 0, 0, 0,191, 0, 0, 0, 0, 0, 34, 0,140, 0, 0, 0,191, 0, 0, 0, 0, 0, 34, 0,140, 0, 0, 0,
+142, 0, 0, 0, 0, 0, 34, 0,142, 0, 0, 0,189, 0, 0, 0, 0, 0, 34, 0,137, 0, 0, 0,192, 0, 0, 0, 0, 0, 34, 0,
+190, 0, 0, 0,192, 0, 0, 0, 0, 0, 34, 0,137, 0, 0, 0,139, 0, 0, 0, 0, 0, 34, 0,191, 0, 0, 0,193, 0, 0, 0,
+ 0, 0, 34, 0,138, 0, 0, 0,193, 0, 0, 0, 0, 0, 34, 0,138, 0, 0, 0,140, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,
+194, 0, 0, 0, 0, 0, 34, 0,192, 0, 0, 0,194, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,137, 0, 0, 0, 0, 0, 34, 0,
+193, 0, 0, 0,195, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,195, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,138, 0, 0, 0,
+ 0, 0, 34, 0, 69, 0, 0, 0,135, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,194, 0, 0, 0, 0, 0, 34, 0,135, 0, 0, 0,
+136, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,195, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0,188, 0, 0, 0, 0, 0, 34, 0,
+ 68, 0, 0, 0,187, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0,189, 0, 0, 0, 0, 0, 34, 0,188, 0, 0, 0,203, 0, 0, 0,
+ 0, 0, 34, 0,203, 0, 0, 0,205, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0,205, 0, 0, 0, 0, 0, 34, 0,189, 0, 0, 0,
+204, 0, 0, 0, 0, 0, 34, 0,204, 0, 0, 0,205, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,196, 0, 0, 0, 0, 0, 34, 0,
+196, 0, 0, 0,197, 0, 0, 0, 0, 0, 34, 0,194, 0, 0, 0,197, 0, 0, 0, 0, 0, 34, 0,196, 0, 0, 0,198, 0, 0, 0,
+ 0, 0, 34, 0,195, 0, 0, 0,198, 0, 0, 0, 0, 0, 34, 0,197, 0, 0, 0,199, 0, 0, 0, 0, 0, 34, 0,192, 0, 0, 0,
+199, 0, 0, 0, 0, 0, 34, 0,198, 0, 0, 0,200, 0, 0, 0, 0, 0, 34, 0,193, 0, 0, 0,200, 0, 0, 0, 0, 0, 34, 0,
+199, 0, 0, 0,201, 0, 0, 0, 0, 0, 34, 0,190, 0, 0, 0,201, 0, 0, 0, 0, 0, 34, 0,200, 0, 0, 0,202, 0, 0, 0,
+ 0, 0, 34, 0,191, 0, 0, 0,202, 0, 0, 0, 0, 0, 34, 0,201, 0, 0, 0,203, 0, 0, 0, 0, 0, 34, 0,202, 0, 0, 0,
+204, 0, 0, 0, 0, 0, 34, 0,196, 0, 0, 0,201, 0, 0, 0, 0, 0, 34, 0,196, 0, 0, 0,202, 0, 0, 0, 0, 0, 34, 0,
+196, 0, 0, 0,205, 0, 0, 0, 0, 0, 34, 0,137, 0, 0, 0,161, 0, 0, 0, 0, 0, 34, 0,136, 0, 0, 0,174, 0, 0, 0,
+ 0, 0, 34, 0,138, 0, 0, 0,162, 0, 0, 0, 0, 0, 34, 0,139, 0, 0, 0,208, 0, 0, 0, 0, 0, 34, 0,161, 0, 0, 0,
+208, 0, 0, 0, 0, 0, 34, 0,140, 0, 0, 0,209, 0, 0, 0, 0, 0, 34, 0,162, 0, 0, 0,209, 0, 0, 0, 0, 0, 34, 0,
+141, 0, 0, 0,210, 0, 0, 0, 0, 0, 34, 0,208, 0, 0, 0,210, 0, 0, 0, 0, 0, 34, 0,142, 0, 0, 0,211, 0, 0, 0,
+ 0, 0, 34, 0,209, 0, 0, 0,211, 0, 0, 0, 0, 0, 34, 0,163, 0, 0, 0,210, 0, 0, 0, 0, 0, 34, 0,164, 0, 0, 0,
+211, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0,206, 0, 0, 0, 0, 0, 34, 0,206, 0, 0, 0,210, 0, 0, 0, 0, 0, 34, 0,
+207, 0, 0, 0,211, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,207, 0, 0, 0, 0, 0, 34, 0,206, 0, 0, 0,212, 0, 0, 0,
+ 0, 0, 34, 0,208, 0, 0, 0,212, 0, 0, 0, 0, 0, 34, 0,209, 0, 0, 0,213, 0, 0, 0, 0, 0, 34, 0,207, 0, 0, 0,
+213, 0, 0, 0, 0, 0, 34, 0, 77, 0, 0, 0,212, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,213, 0, 0, 0, 0, 0, 34, 0,
+ 70, 0, 0, 0,127, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0,219, 0, 0, 0, 0, 0, 34, 0,128, 0, 0, 0,219, 0, 0, 0,
+ 0, 0, 34, 0,129, 0, 0, 0,220, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0,220, 0, 0, 0, 0, 0, 34, 0,217, 0, 0, 0,
+219, 0, 0, 0, 0, 0, 34, 0,130, 0, 0, 0,217, 0, 0, 0, 0, 0, 34, 0,131, 0, 0, 0,218, 0, 0, 0, 0, 0, 34, 0,
+218, 0, 0, 0,220, 0, 0, 0, 0, 0, 34, 0,215, 0, 0, 0,217, 0, 0, 0, 0, 0, 34, 0,132, 0, 0, 0,215, 0, 0, 0,
+ 0, 0, 34, 0,133, 0, 0, 0,216, 0, 0, 0, 0, 0, 34, 0,216, 0, 0, 0,218, 0, 0, 0, 0, 0, 34, 0,214, 0, 0, 0,
+215, 0, 0, 0, 0, 0, 34, 0,134, 0, 0, 0,214, 0, 0, 0, 0, 0, 34, 0,214, 0, 0, 0,216, 0, 0, 0, 0, 0, 34, 0,
+215, 0, 0, 0,226, 0, 0, 0, 0, 0, 34, 0,226, 0, 0, 0,228, 0, 0, 0, 0, 0, 34, 0,214, 0, 0, 0,228, 0, 0, 0,
+ 0, 0, 34, 0,216, 0, 0, 0,227, 0, 0, 0, 0, 0, 34, 0,227, 0, 0, 0,228, 0, 0, 0, 0, 0, 34, 0,217, 0, 0, 0,
+224, 0, 0, 0, 0, 0, 34, 0,224, 0, 0, 0,226, 0, 0, 0, 0, 0, 34, 0,218, 0, 0, 0,225, 0, 0, 0, 0, 0, 34, 0,
+225, 0, 0, 0,227, 0, 0, 0, 0, 0, 34, 0,219, 0, 0, 0,222, 0, 0, 0, 0, 0, 34, 0,222, 0, 0, 0,224, 0, 0, 0,
+ 0, 0, 34, 0,220, 0, 0, 0,223, 0, 0, 0, 0, 0, 34, 0,223, 0, 0, 0,225, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0,
+221, 0, 0, 0, 0, 0, 34, 0,221, 0, 0, 0,222, 0, 0, 0, 0, 0, 34, 0,221, 0, 0, 0,223, 0, 0, 0, 0, 0, 34, 0,
+221, 0, 0, 0,228, 0, 0, 0, 0, 0, 34, 0,222, 0, 0, 0,226, 0, 0, 0, 0, 0, 34, 0,223, 0, 0, 0,227, 0, 0, 0,
+ 0, 0, 34, 0,178, 0, 0, 0,231, 0, 0, 0, 0, 0, 34, 0,229, 0, 0, 0,231, 0, 0, 0, 0, 0, 34, 0,180, 0, 0, 0,
+229, 0, 0, 0, 0, 0, 34, 0,179, 0, 0, 0,232, 0, 0, 0, 0, 0, 34, 0,181, 0, 0, 0,230, 0, 0, 0, 0, 0, 34, 0,
+230, 0, 0, 0,232, 0, 0, 0, 0, 0, 34, 0,229, 0, 0, 0,251, 0, 0, 0, 0, 0, 34, 0,110, 0, 0, 0,251, 0, 0, 0,
+ 0, 0, 34, 0,111, 0, 0, 0,252, 0, 0, 0, 0, 0, 34, 0,230, 0, 0, 0,252, 0, 0, 0, 0, 0, 34, 0,251, 0, 0, 0,
+253, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,253, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,254, 0, 0, 0, 0, 0, 34, 0,
+252, 0, 0, 0,254, 0, 0, 0, 0, 0, 34, 0,231, 0, 0, 0,249, 0, 0, 0, 0, 0, 34, 0,112, 0, 0, 0,250, 0, 0, 0,
+ 0, 0, 34, 0,232, 0, 0, 0,250, 0, 0, 0, 0, 0, 34, 0,113, 0, 0, 0,247, 0, 0, 0, 0, 0, 34, 0,247, 0, 0, 0,
+249, 0, 0, 0, 0, 0, 34, 0,114, 0, 0, 0,248, 0, 0, 0, 0, 0, 34, 0,248, 0, 0, 0,250, 0, 0, 0, 0, 0, 34, 0,
+115, 0, 0, 0,245, 0, 0, 0, 0, 0, 34, 0,245, 0, 0, 0,247, 0, 0, 0, 0, 0, 34, 0,116, 0, 0, 0,246, 0, 0, 0,
+ 0, 0, 34, 0,246, 0, 0, 0,248, 0, 0, 0, 0, 0, 34, 0,117, 0, 0, 0,243, 0, 0, 0, 0, 0, 34, 0,243, 0, 0, 0,
+245, 0, 0, 0, 0, 0, 34, 0,118, 0, 0, 0,244, 0, 0, 0, 0, 0, 34, 0,244, 0, 0, 0,246, 0, 0, 0, 0, 0, 34, 0,
+119, 0, 0, 0,241, 0, 0, 0, 0, 0, 34, 0,241, 0, 0, 0,243, 0, 0, 0, 0, 0, 34, 0,120, 0, 0, 0,242, 0, 0, 0,
+ 0, 0, 34, 0,242, 0, 0, 0,244, 0, 0, 0, 0, 0, 34, 0,121, 0, 0, 0,239, 0, 0, 0, 0, 0, 34, 0,239, 0, 0, 0,
+241, 0, 0, 0, 0, 0, 34, 0,122, 0, 0, 0,240, 0, 0, 0, 0, 0, 34, 0,240, 0, 0, 0,242, 0, 0, 0, 0, 0, 34, 0,
+123, 0, 0, 0,237, 0, 0, 0, 0, 0, 34, 0,237, 0, 0, 0,239, 0, 0, 0, 0, 0, 34, 0,124, 0, 0, 0,238, 0, 0, 0,
+ 0, 0, 34, 0,238, 0, 0, 0,240, 0, 0, 0, 0, 0, 34, 0,176, 0, 0, 0,233, 0, 0, 0, 0, 0, 34, 0,233, 0, 0, 0,
+237, 0, 0, 0, 0, 0, 34, 0,177, 0, 0, 0,234, 0, 0, 0, 0, 0, 34, 0,234, 0, 0, 0,238, 0, 0, 0, 0, 0, 34, 0,
+125, 0, 0, 0,235, 0, 0, 0, 0, 0, 34, 0,233, 0, 0, 0,235, 0, 0, 0, 0, 0, 34, 0,126, 0, 0, 0,236, 0, 0, 0,
+ 0, 0, 34, 0,234, 0, 0, 0,236, 0, 0, 0, 0, 0, 34, 0,235, 0, 0, 0,253, 0, 0, 0, 0, 0, 34, 0,236, 0, 0, 0,
+254, 0, 0, 0, 0, 0, 34, 0,253, 0, 0, 0,255, 0, 0, 0, 0, 0, 34, 0,255, 0, 0, 0, 17, 1, 0, 0, 0, 0, 34, 0,
+235, 0, 0, 0, 17, 1, 0, 0, 0, 0, 34, 0,254, 0, 0, 0, 0, 1, 0, 0, 0, 0, 34, 0,236, 0, 0, 0, 18, 1, 0, 0,
+ 0, 0, 34, 0, 0, 1, 0, 0, 18, 1, 0, 0, 0, 0, 34, 0, 17, 1, 0, 0, 19, 1, 0, 0, 0, 0, 34, 0,233, 0, 0, 0,
+ 19, 1, 0, 0, 0, 0, 34, 0,234, 0, 0, 0, 20, 1, 0, 0, 0, 0, 34, 0, 18, 1, 0, 0, 20, 1, 0, 0, 0, 0, 34, 0,
+ 15, 1, 0, 0, 19, 1, 0, 0, 0, 0, 34, 0,237, 0, 0, 0, 15, 1, 0, 0, 0, 0, 34, 0,238, 0, 0, 0, 16, 1, 0, 0,
+ 0, 0, 34, 0, 16, 1, 0, 0, 20, 1, 0, 0, 0, 0, 34, 0, 13, 1, 0, 0, 15, 1, 0, 0, 0, 0, 34, 0,239, 0, 0, 0,
+ 13, 1, 0, 0, 0, 0, 34, 0,240, 0, 0, 0, 14, 1, 0, 0, 0, 0, 34, 0, 14, 1, 0, 0, 16, 1, 0, 0, 0, 0, 34, 0,
+ 11, 1, 0, 0, 13, 1, 0, 0, 0, 0, 34, 0,241, 0, 0, 0, 11, 1, 0, 0, 0, 0, 34, 0,242, 0, 0, 0, 12, 1, 0, 0,
+ 0, 0, 34, 0, 12, 1, 0, 0, 14, 1, 0, 0, 0, 0, 34, 0, 9, 1, 0, 0, 11, 1, 0, 0, 0, 0, 34, 0,243, 0, 0, 0,
+ 9, 1, 0, 0, 0, 0, 34, 0,244, 0, 0, 0, 10, 1, 0, 0, 0, 0, 34, 0, 10, 1, 0, 0, 12, 1, 0, 0, 0, 0, 34, 0,
+ 7, 1, 0, 0, 9, 1, 0, 0, 0, 0, 34, 0,245, 0, 0, 0, 7, 1, 0, 0, 0, 0, 34, 0,246, 0, 0, 0, 8, 1, 0, 0,
+ 0, 0, 34, 0, 8, 1, 0, 0, 10, 1, 0, 0, 0, 0, 34, 0, 5, 1, 0, 0, 7, 1, 0, 0, 0, 0, 34, 0,247, 0, 0, 0,
+ 5, 1, 0, 0, 0, 0, 34, 0,248, 0, 0, 0, 6, 1, 0, 0, 0, 0, 34, 0, 6, 1, 0, 0, 8, 1, 0, 0, 0, 0, 34, 0,
+ 3, 1, 0, 0, 5, 1, 0, 0, 0, 0, 34, 0,249, 0, 0, 0, 3, 1, 0, 0, 0, 0, 34, 0,250, 0, 0, 0, 4, 1, 0, 0,
+ 0, 0, 34, 0, 4, 1, 0, 0, 6, 1, 0, 0, 0, 0, 34, 0, 3, 1, 0, 0, 21, 1, 0, 0, 0, 0, 34, 0,231, 0, 0, 0,
+ 21, 1, 0, 0, 0, 0, 34, 0,232, 0, 0, 0, 22, 1, 0, 0, 0, 0, 34, 0, 4, 1, 0, 0, 22, 1, 0, 0, 0, 0, 34, 0,
+251, 0, 0, 0, 1, 1, 0, 0, 0, 0, 34, 0,255, 0, 0, 0, 1, 1, 0, 0, 0, 0, 34, 0,252, 0, 0, 0, 2, 1, 0, 0,
+ 0, 0, 34, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 34, 0,229, 0, 0, 0, 23, 1, 0, 0, 0, 0, 34, 0, 1, 1, 0, 0,
+ 23, 1, 0, 0, 0, 0, 34, 0,230, 0, 0, 0, 24, 1, 0, 0, 0, 0, 34, 0, 2, 1, 0, 0, 24, 1, 0, 0, 0, 0, 34, 0,
+ 21, 1, 0, 0, 23, 1, 0, 0, 0, 0, 34, 0, 22, 1, 0, 0, 24, 1, 0, 0, 0, 0, 34, 0,106, 0, 0, 0, 25, 1, 0, 0,
+ 0, 0, 34, 0, 71, 0, 0, 0, 25, 1, 0, 0, 0, 0, 38, 0, 65, 0, 0, 0, 71, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,
+ 26, 1, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0, 26, 1, 0, 0, 0, 0, 38, 0,104, 0, 0, 0, 27, 1, 0, 0, 0, 0, 34, 0,
+ 25, 1, 0, 0, 27, 1, 0, 0, 0, 0, 34, 0,105, 0, 0, 0, 28, 1, 0, 0, 0, 0, 34, 0, 26, 1, 0, 0, 28, 1, 0, 0,
+ 0, 0, 34, 0,102, 0, 0, 0, 29, 1, 0, 0, 0, 0, 34, 0, 27, 1, 0, 0, 29, 1, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,
+ 30, 1, 0, 0, 0, 0, 34, 0, 28, 1, 0, 0, 30, 1, 0, 0, 0, 0, 34, 0,100, 0, 0, 0, 31, 1, 0, 0, 0, 0, 34, 0,
+ 29, 1, 0, 0, 31, 1, 0, 0, 0, 0, 34, 0,101, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 0, 30, 1, 0, 0, 32, 1, 0, 0,
+ 0, 0, 34, 0, 98, 0, 0, 0, 33, 1, 0, 0, 0, 0, 34, 0, 31, 1, 0, 0, 33, 1, 0, 0, 0, 0, 38, 0, 99, 0, 0, 0,
+ 34, 1, 0, 0, 0, 0, 34, 0, 32, 1, 0, 0, 34, 1, 0, 0, 0, 0, 38, 0, 96, 0, 0, 0, 35, 1, 0, 0, 0, 0, 34, 0,
+ 33, 1, 0, 0, 35, 1, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0, 36, 1, 0, 0, 0, 0, 34, 0, 34, 1, 0, 0, 36, 1, 0, 0,
+ 0, 0, 34, 0, 94, 0, 0, 0, 37, 1, 0, 0, 0, 0, 34, 0, 35, 1, 0, 0, 37, 1, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0,
+ 38, 1, 0, 0, 0, 0, 34, 0, 36, 1, 0, 0, 38, 1, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 39, 1, 0, 0, 0, 0, 34, 0,
+ 37, 1, 0, 0, 39, 1, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0, 40, 1, 0, 0, 0, 0, 34, 0, 38, 1, 0, 0, 40, 1, 0, 0,
+ 0, 0, 34, 0, 90, 0, 0, 0, 41, 1, 0, 0, 0, 0, 34, 0, 39, 1, 0, 0, 41, 1, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0,
+ 42, 1, 0, 0, 0, 0, 34, 0, 40, 1, 0, 0, 42, 1, 0, 0, 0, 0, 34, 0, 49, 1, 0, 0, 50, 1, 0, 0, 0, 0, 38, 0,
+ 50, 1, 0, 0, 69, 1, 0, 0, 0, 0, 34, 0, 69, 1, 0, 0, 79, 1, 0, 0, 0, 0, 34, 0, 49, 1, 0, 0, 79, 1, 0, 0,
+ 0, 0, 34, 0, 50, 1, 0, 0, 70, 1, 0, 0, 0, 0, 34, 0, 49, 1, 0, 0, 80, 1, 0, 0, 0, 0, 34, 0, 70, 1, 0, 0,
+ 80, 1, 0, 0, 0, 0, 34, 0, 48, 1, 0, 0, 49, 1, 0, 0, 0, 0, 38, 0, 77, 1, 0, 0, 79, 1, 0, 0, 0, 0, 34, 0,
+ 48, 1, 0, 0, 77, 1, 0, 0, 0, 0, 34, 0, 48, 1, 0, 0, 78, 1, 0, 0, 0, 0, 34, 0, 78, 1, 0, 0, 80, 1, 0, 0,
+ 0, 0, 34, 0, 47, 1, 0, 0, 48, 1, 0, 0, 0, 0, 38, 0, 77, 1, 0, 0, 81, 1, 0, 0, 0, 0, 34, 0, 47, 1, 0, 0,
+ 81, 1, 0, 0, 0, 0, 34, 0, 47, 1, 0, 0, 82, 1, 0, 0, 0, 0, 34, 0, 78, 1, 0, 0, 82, 1, 0, 0, 0, 0, 34, 0,
+ 89, 0, 0, 0, 47, 1, 0, 0, 0, 0, 38, 0, 87, 0, 0, 0, 81, 1, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 82, 1, 0, 0,
+ 0, 0, 34, 0, 75, 1, 0, 0, 81, 1, 0, 0, 0, 0, 34, 0, 85, 0, 0, 0, 75, 1, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0,
+ 76, 1, 0, 0, 0, 0, 34, 0, 76, 1, 0, 0, 82, 1, 0, 0, 0, 0, 34, 0, 71, 1, 0, 0, 75, 1, 0, 0, 0, 0, 34, 0,
+ 83, 0, 0, 0, 71, 1, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 72, 1, 0, 0, 0, 0, 34, 0, 72, 1, 0, 0, 76, 1, 0, 0,
+ 0, 0, 34, 0, 71, 1, 0, 0, 73, 1, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 73, 1, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0,
+ 74, 1, 0, 0, 0, 0, 34, 0, 72, 1, 0, 0, 74, 1, 0, 0, 0, 0, 34, 0, 71, 1, 0, 0, 77, 1, 0, 0, 0, 0, 34, 0,
+ 73, 1, 0, 0, 79, 1, 0, 0, 0, 0, 34, 0, 72, 1, 0, 0, 78, 1, 0, 0, 0, 0, 34, 0, 74, 1, 0, 0, 80, 1, 0, 0,
+ 0, 0, 34, 0, 67, 1, 0, 0, 73, 1, 0, 0, 0, 0, 34, 0, 67, 1, 0, 0, 69, 1, 0, 0, 0, 0, 34, 0, 68, 1, 0, 0,
+ 74, 1, 0, 0, 0, 0, 34, 0, 68, 1, 0, 0, 70, 1, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 67, 1, 0, 0, 0, 0, 34, 0,
+ 80, 0, 0, 0, 68, 1, 0, 0, 0, 0, 34, 0,206, 0, 0, 0, 83, 1, 0, 0, 0, 0, 34, 0, 83, 1, 0, 0, 85, 1, 0, 0,
+ 0, 0, 34, 0,212, 0, 0, 0, 85, 1, 0, 0, 0, 0, 34, 0, 84, 1, 0, 0, 86, 1, 0, 0, 0, 0, 34, 0,207, 0, 0, 0,
+ 84, 1, 0, 0, 0, 0, 34, 0,213, 0, 0, 0, 86, 1, 0, 0, 0, 0, 34, 0, 67, 1, 0, 0, 83, 1, 0, 0, 0, 0, 34, 0,
+ 68, 1, 0, 0, 84, 1, 0, 0, 0, 0, 34, 0, 85, 1, 0, 0, 87, 1, 0, 0, 0, 0, 34, 0, 77, 0, 0, 0, 87, 1, 0, 0,
+ 0, 0, 34, 0, 78, 0, 0, 0, 88, 1, 0, 0, 0, 0, 34, 0, 86, 1, 0, 0, 88, 1, 0, 0, 0, 0, 34, 0, 41, 1, 0, 0,
+ 87, 1, 0, 0, 0, 0, 34, 0, 42, 1, 0, 0, 88, 1, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 65, 1, 0, 0, 0, 0, 34, 0,
+ 65, 1, 0, 0, 93, 1, 0, 0, 0, 0, 34, 0, 45, 1, 0, 0, 93, 1, 0, 0, 0, 0, 39, 0, 75, 0, 0, 0, 45, 1, 0, 0,
+ 0, 0, 38, 0, 66, 1, 0, 0, 94, 1, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0, 66, 1, 0, 0, 0, 0, 34, 0, 45, 1, 0, 0,
+ 94, 1, 0, 0, 0, 0, 39, 0, 91, 1, 0, 0, 93, 1, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0, 91, 1, 0, 0, 0, 0, 34, 0,
+ 76, 0, 0, 0, 45, 1, 0, 0, 0, 0, 38, 0, 92, 1, 0, 0, 94, 1, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0, 92, 1, 0, 0,
+ 0, 0, 34, 0, 89, 1, 0, 0, 91, 1, 0, 0, 0, 0, 34, 0, 46, 1, 0, 0, 89, 1, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0,
+ 46, 1, 0, 0, 0, 0, 38, 0, 90, 1, 0, 0, 92, 1, 0, 0, 0, 0, 34, 0, 46, 1, 0, 0, 90, 1, 0, 0, 0, 0, 34, 0,
+ 69, 1, 0, 0, 89, 1, 0, 0, 0, 0, 34, 0, 46, 1, 0, 0, 50, 1, 0, 0, 0, 0, 38, 0, 70, 1, 0, 0, 90, 1, 0, 0,
+ 0, 0, 34, 0, 83, 1, 0, 0, 89, 1, 0, 0, 0, 0, 34, 0, 84, 1, 0, 0, 90, 1, 0, 0, 0, 0, 34, 0, 39, 1, 0, 0,
+ 59, 1, 0, 0, 0, 0, 34, 0, 51, 1, 0, 0, 59, 1, 0, 0, 0, 0, 34, 0, 37, 1, 0, 0, 51, 1, 0, 0, 0, 0, 34, 0,
+ 40, 1, 0, 0, 60, 1, 0, 0, 0, 0, 34, 0, 38, 1, 0, 0, 52, 1, 0, 0, 0, 0, 34, 0, 52, 1, 0, 0, 60, 1, 0, 0,
+ 0, 0, 34, 0, 74, 0, 0, 0, 57, 1, 0, 0, 0, 0, 39, 0, 57, 1, 0, 0, 65, 1, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0,
+ 75, 0, 0, 0, 0, 0, 38, 0, 58, 1, 0, 0, 66, 1, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0, 58, 1, 0, 0, 0, 0, 39, 0,
+ 43, 1, 0, 0, 99, 1, 0, 0, 0, 0, 34, 0, 97, 1, 0, 0, 99, 1, 0, 0, 0, 0, 34, 0, 44, 1, 0, 0, 97, 1, 0, 0,
+ 0, 0, 34, 0, 43, 1, 0, 0, 44, 1, 0, 0, 0, 0, 38, 0, 98, 1, 0, 0,100, 1, 0, 0, 0, 0, 34, 0, 43, 1, 0, 0,
+100, 1, 0, 0, 0, 0, 34, 0, 44, 1, 0, 0, 98, 1, 0, 0, 0, 0, 34, 0, 95, 1, 0, 0, 97, 1, 0, 0, 0, 0, 34, 0,
+ 73, 0, 0, 0, 95, 1, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 44, 1, 0, 0, 0, 0, 38, 0, 96, 1, 0, 0, 98, 1, 0, 0,
+ 0, 0, 34, 0, 73, 0, 0, 0, 96, 1, 0, 0, 0, 0, 34, 0, 57, 1, 0, 0, 95, 1, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0,
+ 74, 0, 0, 0, 0, 0, 38, 0, 58, 1, 0, 0, 96, 1, 0, 0, 0, 0, 34, 0, 35, 1, 0, 0,103, 1, 0, 0, 0, 0, 34, 0,
+103, 1, 0, 0,105, 1, 0, 0, 0, 0, 34, 0, 33, 1, 0, 0,105, 1, 0, 0, 0, 0, 34, 0, 36, 1, 0, 0,104, 1, 0, 0,
+ 0, 0, 34, 0, 34, 1, 0, 0,106, 1, 0, 0, 0, 0, 34, 0,104, 1, 0, 0,106, 1, 0, 0, 0, 0, 34, 0,103, 1, 0, 0,
+109, 1, 0, 0, 0, 0, 34, 0,107, 1, 0, 0,109, 1, 0, 0, 0, 0, 34, 0,105, 1, 0, 0,107, 1, 0, 0, 0, 0, 34, 0,
+104, 1, 0, 0,110, 1, 0, 0, 0, 0, 34, 0,106, 1, 0, 0,108, 1, 0, 0, 0, 0, 34, 0,108, 1, 0, 0,110, 1, 0, 0,
+ 0, 0, 34, 0,109, 1, 0, 0,111, 1, 0, 0, 0, 0, 34, 0,111, 1, 0, 0,113, 1, 0, 0, 0, 0, 34, 0,107, 1, 0, 0,
+113, 1, 0, 0, 0, 0, 34, 0,110, 1, 0, 0,112, 1, 0, 0, 0, 0, 34, 0,108, 1, 0, 0,114, 1, 0, 0, 0, 0, 34, 0,
+112, 1, 0, 0,114, 1, 0, 0, 0, 0, 34, 0,111, 1, 0, 0,117, 1, 0, 0, 0, 0, 34, 0,115, 1, 0, 0,117, 1, 0, 0,
+ 0, 0, 34, 0,113, 1, 0, 0,115, 1, 0, 0, 0, 0, 34, 0,112, 1, 0, 0,118, 1, 0, 0, 0, 0, 34, 0,114, 1, 0, 0,
+116, 1, 0, 0, 0, 0, 34, 0,116, 1, 0, 0,118, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0,119, 1, 0, 0, 0, 0, 39, 0,
+115, 1, 0, 0,119, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0,117, 1, 0, 0, 0, 0, 34, 0,116, 1, 0, 0,120, 1, 0, 0,
+ 0, 0, 34, 0, 56, 1, 0, 0,120, 1, 0, 0, 0, 0, 39, 0, 56, 1, 0, 0,118, 1, 0, 0, 0, 0, 34, 0, 95, 1, 0, 0,
+115, 1, 0, 0, 0, 0, 34, 0, 57, 1, 0, 0,119, 1, 0, 0, 0, 0, 39, 0, 96, 1, 0, 0,116, 1, 0, 0, 0, 0, 34, 0,
+ 58, 1, 0, 0,120, 1, 0, 0, 0, 0, 39, 0, 97, 1, 0, 0,113, 1, 0, 0, 0, 0, 34, 0, 98, 1, 0, 0,114, 1, 0, 0,
+ 0, 0, 34, 0, 99, 1, 0, 0,107, 1, 0, 0, 0, 0, 34, 0,100, 1, 0, 0,108, 1, 0, 0, 0, 0, 34, 0, 99, 1, 0, 0,
+101, 1, 0, 0, 0, 0, 34, 0,101, 1, 0, 0,105, 1, 0, 0, 0, 0, 34, 0,102, 1, 0, 0,106, 1, 0, 0, 0, 0, 34, 0,
+100, 1, 0, 0,102, 1, 0, 0, 0, 0, 34, 0, 31, 1, 0, 0,101, 1, 0, 0, 0, 0, 34, 0, 32, 1, 0, 0,102, 1, 0, 0,
+ 0, 0, 34, 0, 72, 0, 0, 0,101, 1, 0, 0, 0, 0, 34, 0, 72, 0, 0, 0, 43, 1, 0, 0, 0, 0, 38, 0, 72, 0, 0, 0,
+102, 1, 0, 0, 0, 0, 34, 0, 25, 1, 0, 0, 31, 1, 0, 0, 0, 0, 38, 0, 26, 1, 0, 0, 32, 1, 0, 0, 0, 0, 38, 0,
+ 72, 0, 0, 0, 25, 1, 0, 0, 0, 0, 34, 0, 72, 0, 0, 0, 26, 1, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0, 72, 0, 0, 0,
+ 0, 0, 38, 0, 51, 1, 0, 0,103, 1, 0, 0, 0, 0, 34, 0, 52, 1, 0, 0,104, 1, 0, 0, 0, 0, 34, 0, 51, 1, 0, 0,
+ 53, 1, 0, 0, 0, 0, 34, 0, 53, 1, 0, 0,109, 1, 0, 0, 0, 0, 34, 0, 54, 1, 0, 0,110, 1, 0, 0, 0, 0, 34, 0,
+ 52, 1, 0, 0, 54, 1, 0, 0, 0, 0, 34, 0, 53, 1, 0, 0,123, 1, 0, 0, 0, 0, 34, 0,111, 1, 0, 0,123, 1, 0, 0,
+ 0, 0, 34, 0,112, 1, 0, 0,124, 1, 0, 0, 0, 0, 34, 0, 54, 1, 0, 0,124, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0,
+123, 1, 0, 0, 0, 0, 34, 0, 56, 1, 0, 0,124, 1, 0, 0, 0, 0, 34, 0, 91, 1, 0, 0,127, 1, 0, 0, 0, 0, 34, 0,
+125, 1, 0, 0,127, 1, 0, 0, 0, 0, 34, 0, 89, 1, 0, 0,125, 1, 0, 0, 0, 0, 34, 0, 92, 1, 0, 0,128, 1, 0, 0,
+ 0, 0, 34, 0, 90, 1, 0, 0,126, 1, 0, 0, 0, 0, 34, 0,126, 1, 0, 0,128, 1, 0, 0, 0, 0, 34, 0, 59, 1, 0, 0,
+125, 1, 0, 0, 0, 0, 34, 0, 61, 1, 0, 0,127, 1, 0, 0, 0, 0, 34, 0, 59, 1, 0, 0, 61, 1, 0, 0, 0, 0, 34, 0,
+ 60, 1, 0, 0,126, 1, 0, 0, 0, 0, 34, 0, 60, 1, 0, 0, 62, 1, 0, 0, 0, 0, 34, 0, 62, 1, 0, 0,128, 1, 0, 0,
+ 0, 0, 34, 0, 41, 1, 0, 0,125, 1, 0, 0, 0, 0, 34, 0, 42, 1, 0, 0,126, 1, 0, 0, 0, 0, 34, 0, 41, 1, 0, 0,
+ 85, 1, 0, 0, 0, 0, 34, 0, 83, 1, 0, 0,125, 1, 0, 0, 0, 0, 34, 0, 42, 1, 0, 0, 86, 1, 0, 0, 0, 0, 34, 0,
+ 84, 1, 0, 0,126, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0, 63, 1, 0, 0, 0, 0, 34, 0, 63, 1, 0, 0,121, 1, 0, 0,
+ 0, 0, 39, 0,119, 1, 0, 0,121, 1, 0, 0, 0, 0, 34, 0, 64, 1, 0, 0,122, 1, 0, 0, 0, 0, 39, 0, 56, 1, 0, 0,
+ 64, 1, 0, 0, 0, 0, 34, 0,120, 1, 0, 0,122, 1, 0, 0, 0, 0, 34, 0, 65, 1, 0, 0,121, 1, 0, 0, 0, 0, 34, 0,
+ 66, 1, 0, 0,122, 1, 0, 0, 0, 0, 34, 0,121, 1, 0, 0,127, 1, 0, 0, 0, 0, 34, 0, 61, 1, 0, 0, 63, 1, 0, 0,
+ 0, 0, 34, 0,122, 1, 0, 0,128, 1, 0, 0, 0, 0, 34, 0, 62, 1, 0, 0, 64, 1, 0, 0, 0, 0, 34, 0, 93, 1, 0, 0,
+121, 1, 0, 0, 0, 0, 39, 0, 94, 1, 0, 0,122, 1, 0, 0, 0, 0, 39, 0,129, 1, 0, 0,141, 1, 0, 0, 0, 0, 34, 0,
+129, 1, 0, 0,155, 1, 0, 0, 0, 0, 34, 0,143, 1, 0, 0,155, 1, 0, 0, 0, 0, 34, 0,141, 1, 0, 0,143, 1, 0, 0,
+ 0, 0, 34, 0,130, 1, 0, 0,156, 1, 0, 0, 0, 0, 34, 0,130, 1, 0, 0,142, 1, 0, 0, 0, 0, 34, 0,142, 1, 0, 0,
+144, 1, 0, 0, 0, 0, 34, 0,144, 1, 0, 0,156, 1, 0, 0, 0, 0, 34, 0,143, 1, 0, 0,145, 1, 0, 0, 0, 0, 34, 0,
+139, 1, 0, 0,145, 1, 0, 0, 0, 0, 34, 0,139, 1, 0, 0,141, 1, 0, 0, 0, 0, 34, 0,144, 1, 0, 0,146, 1, 0, 0,
+ 0, 0, 34, 0,140, 1, 0, 0,142, 1, 0, 0, 0, 0, 34, 0,140, 1, 0, 0,146, 1, 0, 0, 0, 0, 34, 0,145, 1, 0, 0,
+147, 1, 0, 0, 0, 0, 34, 0,137, 1, 0, 0,147, 1, 0, 0, 0, 0, 34, 0,137, 1, 0, 0,139, 1, 0, 0, 0, 0, 34, 0,
+146, 1, 0, 0,148, 1, 0, 0, 0, 0, 34, 0,138, 1, 0, 0,140, 1, 0, 0, 0, 0, 34, 0,138, 1, 0, 0,148, 1, 0, 0,
+ 0, 0, 34, 0,147, 1, 0, 0,149, 1, 0, 0, 0, 0, 34, 0,135, 1, 0, 0,149, 1, 0, 0, 0, 0, 34, 0,135, 1, 0, 0,
+137, 1, 0, 0, 0, 0, 34, 0,148, 1, 0, 0,150, 1, 0, 0, 0, 0, 34, 0,136, 1, 0, 0,138, 1, 0, 0, 0, 0, 34, 0,
+136, 1, 0, 0,150, 1, 0, 0, 0, 0, 34, 0,149, 1, 0, 0,151, 1, 0, 0, 0, 0, 34, 0,133, 1, 0, 0,151, 1, 0, 0,
+ 0, 0, 34, 0,133, 1, 0, 0,135, 1, 0, 0, 0, 0, 34, 0,150, 1, 0, 0,152, 1, 0, 0, 0, 0, 34, 0,134, 1, 0, 0,
+136, 1, 0, 0, 0, 0, 34, 0,134, 1, 0, 0,152, 1, 0, 0, 0, 0, 34, 0,151, 1, 0, 0,153, 1, 0, 0, 0, 0, 34, 0,
+131, 1, 0, 0,153, 1, 0, 0, 0, 0, 34, 0,131, 1, 0, 0,133, 1, 0, 0, 0, 0, 34, 0,152, 1, 0, 0,154, 1, 0, 0,
+ 0, 0, 34, 0,132, 1, 0, 0,134, 1, 0, 0, 0, 0, 34, 0,132, 1, 0, 0,154, 1, 0, 0, 0, 0, 34, 0,151, 1, 0, 0,
+161, 1, 0, 0, 0, 0, 34, 0,159, 1, 0, 0,161, 1, 0, 0, 0, 0, 34, 0,153, 1, 0, 0,159, 1, 0, 0, 0, 0, 34, 0,
+160, 1, 0, 0,162, 1, 0, 0, 0, 0, 34, 0,152, 1, 0, 0,162, 1, 0, 0, 0, 0, 34, 0,154, 1, 0, 0,160, 1, 0, 0,
+ 0, 0, 34, 0,149, 1, 0, 0,163, 1, 0, 0, 0, 0, 34, 0,161, 1, 0, 0,163, 1, 0, 0, 0, 0, 34, 0,162, 1, 0, 0,
+164, 1, 0, 0, 0, 0, 34, 0,150, 1, 0, 0,164, 1, 0, 0, 0, 0, 34, 0,147, 1, 0, 0,165, 1, 0, 0, 0, 0, 34, 0,
+163, 1, 0, 0,165, 1, 0, 0, 0, 0, 34, 0,164, 1, 0, 0,166, 1, 0, 0, 0, 0, 34, 0,148, 1, 0, 0,166, 1, 0, 0,
+ 0, 0, 34, 0,145, 1, 0, 0,167, 1, 0, 0, 0, 0, 34, 0,165, 1, 0, 0,167, 1, 0, 0, 0, 0, 34, 0,166, 1, 0, 0,
+168, 1, 0, 0, 0, 0, 34, 0,146, 1, 0, 0,168, 1, 0, 0, 0, 0, 34, 0,143, 1, 0, 0,169, 1, 0, 0, 0, 0, 34, 0,
+167, 1, 0, 0,169, 1, 0, 0, 0, 0, 34, 0,168, 1, 0, 0,170, 1, 0, 0, 0, 0, 34, 0,144, 1, 0, 0,170, 1, 0, 0,
+ 0, 0, 34, 0,155, 1, 0, 0,157, 1, 0, 0, 0, 0, 34, 0,157, 1, 0, 0,169, 1, 0, 0, 0, 0, 34, 0,156, 1, 0, 0,
+158, 1, 0, 0, 0, 0, 34, 0,158, 1, 0, 0,170, 1, 0, 0, 0, 0, 34, 0, 61, 1, 0, 0,185, 1, 0, 0, 0, 0, 34, 0,
+183, 1, 0, 0,185, 1, 0, 0, 0, 0, 34, 0, 59, 1, 0, 0,183, 1, 0, 0, 0, 0, 34, 0, 62, 1, 0, 0,186, 1, 0, 0,
+ 0, 0, 34, 0, 60, 1, 0, 0,184, 1, 0, 0, 0, 0, 34, 0,184, 1, 0, 0,186, 1, 0, 0, 0, 0, 34, 0, 61, 1, 0, 0,
+131, 1, 0, 0, 0, 0, 34, 0,153, 1, 0, 0,185, 1, 0, 0, 0, 0, 34, 0, 62, 1, 0, 0,132, 1, 0, 0, 0, 0, 34, 0,
+154, 1, 0, 0,186, 1, 0, 0, 0, 0, 34, 0, 53, 1, 0, 0,183, 1, 0, 0, 0, 0, 34, 0, 54, 1, 0, 0,184, 1, 0, 0,
+ 0, 0, 34, 0,123, 1, 0, 0,171, 1, 0, 0, 0, 0, 34, 0,155, 1, 0, 0,171, 1, 0, 0, 0, 0, 34, 0,123, 1, 0, 0,
+129, 1, 0, 0, 0, 0, 34, 0,156, 1, 0, 0,172, 1, 0, 0, 0, 0, 34, 0,124, 1, 0, 0,172, 1, 0, 0, 0, 0, 34, 0,
+124, 1, 0, 0,130, 1, 0, 0, 0, 0, 34, 0,159, 1, 0, 0,181, 1, 0, 0, 0, 0, 34, 0,181, 1, 0, 0,185, 1, 0, 0,
+ 0, 0, 34, 0,160, 1, 0, 0,182, 1, 0, 0, 0, 0, 34, 0,182, 1, 0, 0,186, 1, 0, 0, 0, 0, 34, 0,179, 1, 0, 0,
+187, 1, 0, 0, 0, 0, 34, 0,185, 1, 0, 0,187, 1, 0, 0, 0, 0, 34, 0,179, 1, 0, 0,181, 1, 0, 0, 0, 0, 34, 0,
+186, 1, 0, 0,188, 1, 0, 0, 0, 0, 34, 0,180, 1, 0, 0,188, 1, 0, 0, 0, 0, 34, 0,180, 1, 0, 0,182, 1, 0, 0,
+ 0, 0, 34, 0,175, 1, 0, 0,187, 1, 0, 0, 0, 0, 34, 0,177, 1, 0, 0,179, 1, 0, 0, 0, 0, 34, 0,175, 1, 0, 0,
+177, 1, 0, 0, 0, 0, 34, 0,176, 1, 0, 0,188, 1, 0, 0, 0, 0, 34, 0,176, 1, 0, 0,178, 1, 0, 0, 0, 0, 34, 0,
+178, 1, 0, 0,180, 1, 0, 0, 0, 0, 34, 0,173, 1, 0, 0,189, 1, 0, 0, 0, 0, 34, 0,187, 1, 0, 0,189, 1, 0, 0,
+ 0, 0, 34, 0,173, 1, 0, 0,175, 1, 0, 0, 0, 0, 34, 0,188, 1, 0, 0,190, 1, 0, 0, 0, 0, 34, 0,174, 1, 0, 0,
+190, 1, 0, 0, 0, 0, 34, 0,174, 1, 0, 0,176, 1, 0, 0, 0, 0, 34, 0,171, 1, 0, 0,189, 1, 0, 0, 0, 0, 34, 0,
+173, 1, 0, 0,191, 1, 0, 0, 0, 0, 34, 0,171, 1, 0, 0,191, 1, 0, 0, 0, 0, 32, 0,172, 1, 0, 0,190, 1, 0, 0,
+ 0, 0, 34, 0,172, 1, 0, 0,192, 1, 0, 0, 0, 0, 32, 0,174, 1, 0, 0,192, 1, 0, 0, 0, 0, 34, 0,157, 1, 0, 0,
+191, 1, 0, 0, 0, 0, 34, 0,158, 1, 0, 0,192, 1, 0, 0, 0, 0, 34, 0, 53, 1, 0, 0,189, 1, 0, 0, 0, 0, 34, 0,
+ 54, 1, 0, 0,190, 1, 0, 0, 0, 0, 34, 0,183, 1, 0, 0,187, 1, 0, 0, 0, 0, 34, 0,184, 1, 0, 0,188, 1, 0, 0,
+ 0, 0, 34, 0,191, 1, 0, 0,193, 1, 0, 0, 0, 0, 34, 0,193, 1, 0, 0,217, 1, 0, 0, 0, 0, 34, 0,157, 1, 0, 0,
+217, 1, 0, 0, 0, 0, 34, 0,192, 1, 0, 0,194, 1, 0, 0, 0, 0, 34, 0,158, 1, 0, 0,218, 1, 0, 0, 0, 0, 34, 0,
+194, 1, 0, 0,218, 1, 0, 0, 0, 0, 34, 0,173, 1, 0, 0,203, 1, 0, 0, 0, 0, 34, 0,193, 1, 0, 0,203, 1, 0, 0,
+ 0, 0, 34, 0,174, 1, 0, 0,204, 1, 0, 0, 0, 0, 34, 0,194, 1, 0, 0,204, 1, 0, 0, 0, 0, 34, 0,175, 1, 0, 0,
+201, 1, 0, 0, 0, 0, 34, 0,201, 1, 0, 0,203, 1, 0, 0, 0, 0, 34, 0,176, 1, 0, 0,202, 1, 0, 0, 0, 0, 34, 0,
+202, 1, 0, 0,204, 1, 0, 0, 0, 0, 34, 0,177, 1, 0, 0,199, 1, 0, 0, 0, 0, 34, 0,199, 1, 0, 0,201, 1, 0, 0,
+ 0, 0, 34, 0,178, 1, 0, 0,200, 1, 0, 0, 0, 0, 34, 0,200, 1, 0, 0,202, 1, 0, 0, 0, 0, 34, 0,179, 1, 0, 0,
+197, 1, 0, 0, 0, 0, 34, 0,197, 1, 0, 0,199, 1, 0, 0, 0, 0, 34, 0,180, 1, 0, 0,198, 1, 0, 0, 0, 0, 34, 0,
+198, 1, 0, 0,200, 1, 0, 0, 0, 0, 34, 0,181, 1, 0, 0,195, 1, 0, 0, 0, 0, 34, 0,195, 1, 0, 0,197, 1, 0, 0,
+ 0, 0, 34, 0,182, 1, 0, 0,196, 1, 0, 0, 0, 0, 34, 0,196, 1, 0, 0,198, 1, 0, 0, 0, 0, 34, 0,159, 1, 0, 0,
+215, 1, 0, 0, 0, 0, 34, 0,195, 1, 0, 0,215, 1, 0, 0, 0, 0, 34, 0,160, 1, 0, 0,216, 1, 0, 0, 0, 0, 34, 0,
+196, 1, 0, 0,216, 1, 0, 0, 0, 0, 34, 0,205, 1, 0, 0,217, 1, 0, 0, 0, 0, 34, 0,169, 1, 0, 0,205, 1, 0, 0,
+ 0, 0, 34, 0,170, 1, 0, 0,206, 1, 0, 0, 0, 0, 34, 0,206, 1, 0, 0,218, 1, 0, 0, 0, 0, 34, 0,205, 1, 0, 0,
+207, 1, 0, 0, 0, 0, 34, 0,167, 1, 0, 0,207, 1, 0, 0, 0, 0, 34, 0,168, 1, 0, 0,208, 1, 0, 0, 0, 0, 34, 0,
+206, 1, 0, 0,208, 1, 0, 0, 0, 0, 34, 0,207, 1, 0, 0,209, 1, 0, 0, 0, 0, 34, 0,165, 1, 0, 0,209, 1, 0, 0,
+ 0, 0, 34, 0,166, 1, 0, 0,210, 1, 0, 0, 0, 0, 34, 0,208, 1, 0, 0,210, 1, 0, 0, 0, 0, 34, 0,209, 1, 0, 0,
+211, 1, 0, 0, 0, 0, 34, 0,163, 1, 0, 0,211, 1, 0, 0, 0, 0, 34, 0,164, 1, 0, 0,212, 1, 0, 0, 0, 0, 34, 0,
+210, 1, 0, 0,212, 1, 0, 0, 0, 0, 34, 0,211, 1, 0, 0,213, 1, 0, 0, 0, 0, 34, 0,161, 1, 0, 0,213, 1, 0, 0,
+ 0, 0, 34, 0,162, 1, 0, 0,214, 1, 0, 0, 0, 0, 34, 0,212, 1, 0, 0,214, 1, 0, 0, 0, 0, 34, 0,213, 1, 0, 0,
+215, 1, 0, 0, 0, 0, 34, 0,214, 1, 0, 0,216, 1, 0, 0, 0, 0, 34, 0,197, 1, 0, 0,221, 1, 0, 0, 0, 0, 34, 0,
+219, 1, 0, 0,221, 1, 0, 0, 0, 0, 34, 0,199, 1, 0, 0,219, 1, 0, 0, 0, 0, 34, 0,198, 1, 0, 0,222, 1, 0, 0,
+ 0, 0, 34, 0,200, 1, 0, 0,220, 1, 0, 0, 0, 0, 34, 0,220, 1, 0, 0,222, 1, 0, 0, 0, 0, 34, 0,221, 1, 0, 0,
+223, 1, 0, 0, 0, 0, 34, 0,223, 1, 0, 0,225, 1, 0, 0, 0, 0, 32, 0,219, 1, 0, 0,225, 1, 0, 0, 0, 0, 34, 0,
+222, 1, 0, 0,224, 1, 0, 0, 0, 0, 34, 0,220, 1, 0, 0,226, 1, 0, 0, 0, 0, 34, 0,224, 1, 0, 0,226, 1, 0, 0,
+ 0, 0, 32, 0,223, 1, 0, 0,229, 1, 0, 0, 0, 0, 34, 0,227, 1, 0, 0,229, 1, 0, 0, 0, 0, 34, 0,225, 1, 0, 0,
+227, 1, 0, 0, 0, 0, 34, 0,224, 1, 0, 0,230, 1, 0, 0, 0, 0, 34, 0,226, 1, 0, 0,228, 1, 0, 0, 0, 0, 34, 0,
+228, 1, 0, 0,230, 1, 0, 0, 0, 0, 34, 0,229, 1, 0, 0,231, 1, 0, 0, 0, 0, 34, 0,231, 1, 0, 0,233, 1, 0, 0,
+ 0, 0, 34, 0,227, 1, 0, 0,233, 1, 0, 0, 0, 0, 34, 0,230, 1, 0, 0,232, 1, 0, 0, 0, 0, 34, 0,228, 1, 0, 0,
+234, 1, 0, 0, 0, 0, 34, 0,232, 1, 0, 0,234, 1, 0, 0, 0, 0, 34, 0,217, 1, 0, 0,227, 1, 0, 0, 0, 0, 34, 0,
+205, 1, 0, 0,233, 1, 0, 0, 0, 0, 34, 0,218, 1, 0, 0,228, 1, 0, 0, 0, 0, 34, 0,206, 1, 0, 0,234, 1, 0, 0,
+ 0, 0, 34, 0,193, 1, 0, 0,225, 1, 0, 0, 0, 0, 34, 0,194, 1, 0, 0,226, 1, 0, 0, 0, 0, 34, 0,203, 1, 0, 0,
+219, 1, 0, 0, 0, 0, 34, 0,204, 1, 0, 0,220, 1, 0, 0, 0, 0, 34, 0,215, 1, 0, 0,221, 1, 0, 0, 0, 0, 34, 0,
+216, 1, 0, 0,222, 1, 0, 0, 0, 0, 34, 0,213, 1, 0, 0,223, 1, 0, 0, 0, 0, 34, 0,214, 1, 0, 0,224, 1, 0, 0,
+ 0, 0, 34, 0,211, 1, 0, 0,229, 1, 0, 0, 0, 0, 34, 0,212, 1, 0, 0,230, 1, 0, 0, 0, 0, 34, 0,209, 1, 0, 0,
+231, 1, 0, 0, 0, 0, 34, 0,210, 1, 0, 0,232, 1, 0, 0, 0, 0, 34, 0,207, 1, 0, 0,233, 1, 0, 0, 0, 0, 34, 0,
+208, 1, 0, 0,234, 1, 0, 0, 0, 0, 34, 0,131, 1, 0, 0,245, 1, 0, 0, 0, 0, 34, 0,243, 1, 0, 0,245, 1, 0, 0,
+ 0, 0, 39, 0,133, 1, 0, 0,243, 1, 0, 0, 0, 0, 34, 0,132, 1, 0, 0,246, 1, 0, 0, 0, 0, 34, 0,134, 1, 0, 0,
+244, 1, 0, 0, 0, 0, 34, 0,244, 1, 0, 0,246, 1, 0, 0, 0, 0, 39, 0,241, 1, 0, 0,243, 1, 0, 0, 0, 0, 39, 0,
+135, 1, 0, 0,241, 1, 0, 0, 0, 0, 34, 0,136, 1, 0, 0,242, 1, 0, 0, 0, 0, 34, 0,242, 1, 0, 0,244, 1, 0, 0,
+ 0, 0, 39, 0,239, 1, 0, 0,241, 1, 0, 0, 0, 0, 39, 0,137, 1, 0, 0,239, 1, 0, 0, 0, 0, 34, 0,138, 1, 0, 0,
+240, 1, 0, 0, 0, 0, 34, 0,240, 1, 0, 0,242, 1, 0, 0, 0, 0, 39, 0,237, 1, 0, 0,239, 1, 0, 0, 0, 0, 39, 0,
+139, 1, 0, 0,237, 1, 0, 0, 0, 0, 34, 0,140, 1, 0, 0,238, 1, 0, 0, 0, 0, 34, 0,238, 1, 0, 0,240, 1, 0, 0,
+ 0, 0, 39, 0,235, 1, 0, 0,237, 1, 0, 0, 0, 0, 39, 0,141, 1, 0, 0,235, 1, 0, 0, 0, 0, 34, 0,142, 1, 0, 0,
+236, 1, 0, 0, 0, 0, 34, 0,236, 1, 0, 0,238, 1, 0, 0, 0, 0, 39, 0,235, 1, 0, 0,247, 1, 0, 0, 0, 0, 39, 0,
+129, 1, 0, 0,247, 1, 0, 0, 0, 0, 34, 0,130, 1, 0, 0,248, 1, 0, 0, 0, 0, 34, 0,236, 1, 0, 0,248, 1, 0, 0,
+ 0, 0, 39, 0,235, 1, 0, 0,243, 1, 0, 0, 0, 0, 34, 0,245, 1, 0, 0,247, 1, 0, 0, 0, 0, 34, 0,236, 1, 0, 0,
+244, 1, 0, 0, 0, 0, 34, 0,246, 1, 0, 0,248, 1, 0, 0, 0, 0, 34, 0,237, 1, 0, 0,241, 1, 0, 0, 0, 0, 34, 0,
+238, 1, 0, 0,242, 1, 0, 0, 0, 0, 34, 0, 55, 1, 0, 0,247, 1, 0, 0, 0, 0, 39, 0, 56, 1, 0, 0,248, 1, 0, 0,
+ 0, 0, 39, 0, 63, 1, 0, 0,245, 1, 0, 0, 0, 0, 39, 0, 64, 1, 0, 0,246, 1, 0, 0, 0, 0, 39, 0, 14, 0, 0, 0,
+249, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0,178, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,
+ 14, 0, 0, 0,161, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0,112, 0, 0, 0,
+ 0, 0, 34, 0, 9, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65,
+ 64, 1, 0, 0, 64,222,116, 1, 0, 0, 0, 0, 5, 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,192,223,116, 1, 0, 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, 85, 86, 84,101,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, 16, 7,117, 1, 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, 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, 16,101,117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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, 39, 0, 0,192,223,116, 1,
+ 0, 0, 0, 0, 52, 0, 0, 0,244, 1, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 1,
+ 3, 0, 0, 0, 1, 0, 0, 0, 46, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 1, 43, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0,
+ 41, 0, 0, 0, 0, 0, 0, 1, 5, 0, 0, 0, 3, 0, 0, 0, 44, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0,
+ 8, 0, 0, 0, 6, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 7, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 9, 0, 0, 0, 11, 0, 0, 0,
+ 1, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 0, 12, 0, 0, 0, 14, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1,
+112, 0, 0, 0, 13, 0, 0, 0, 11, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 1, 8, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 0, 1, 16, 0, 0, 0,112, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 1, 14, 0, 0, 0,
+ 19, 0, 0, 0, 17, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 1, 18, 0, 0, 0, 20, 0, 0, 0,112, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 1, 12, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 1, 20, 0, 0, 0, 22, 0, 0, 0,
+ 13, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 1, 21, 0, 0, 0, 23, 0, 0, 0, 25, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 1,
+ 26, 0, 0, 0, 24, 0, 0, 0, 22, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 1, 19, 0, 0, 0, 25, 0, 0, 0, 27, 0, 0, 0,
+ 17, 0, 0, 0, 0, 0, 0, 1, 28, 0, 0, 0, 26, 0, 0, 0, 20, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 1, 25, 0, 0, 0,
+ 31, 0, 0, 0, 29, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 1, 30, 0, 0, 0, 32, 0, 0, 0, 26, 0, 0, 0, 28, 0, 0, 0,
+ 0, 0, 0, 1, 23, 0, 0, 0, 33, 0, 0, 0, 31, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 1, 32, 0, 0, 0, 34, 0, 0, 0,
+ 24, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 1, 33, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 1,
+ 38, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 1, 31, 0, 0, 0, 37, 0, 0, 0, 39, 0, 0, 0,
+ 29, 0, 0, 0, 0, 0, 0, 1, 40, 0, 0, 0, 38, 0, 0, 0, 32, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 1, 37, 0, 0, 0,
+ 43, 0, 0, 0, 41, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 1, 42, 0, 0, 0, 44, 0, 0, 0, 38, 0, 0, 0, 40, 0, 0, 0,
+ 0, 0, 0, 1, 35, 0, 0, 0, 45, 0, 0, 0, 43, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 1, 44, 0, 0, 0, 46, 0, 0, 0,
+ 36, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 1, 45, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 1,
+ 50, 0, 0, 0, 36, 0, 0, 0, 46, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 1, 35, 0, 0, 0, 33, 0, 0, 0, 51, 0, 0, 0,
+ 49, 0, 0, 0, 0, 0, 0, 1, 52, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 1, 33, 0, 0, 0,
+ 23, 0, 0, 0, 53, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 1, 54, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0,
+ 0, 0, 0, 1, 23, 0, 0, 0, 21, 0, 0, 0, 55, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 1, 56, 0, 0, 0, 22, 0, 0, 0,
+ 24, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 1, 21, 0, 0, 0, 12, 0, 0, 0, 57, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 1,
+ 58, 0, 0, 0, 13, 0, 0, 0, 22, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 1, 12, 0, 0, 0, 10, 0, 0, 0, 61, 0, 0, 0,
+ 57, 0, 0, 0, 0, 0, 0, 1, 62, 0, 0, 0, 11, 0, 0, 0, 13, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 1, 10, 0, 0, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 62, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 45, 0, 0, 0, 47, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 1, 48, 0, 0, 0, 46, 0, 0, 0,
+ 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0, 63, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 48, 0, 0, 0, 64, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 61, 0, 0, 0, 63, 0, 0, 0, 59, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 60, 0, 0, 0, 64, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0,
+ 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 62, 0, 0, 0, 58, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 59, 0, 0, 0, 55, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 58, 0, 0, 0, 56, 0, 0, 0,
+ 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0, 53, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 56, 0, 0, 0, 54, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0, 51, 0, 0, 0, 53, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 54, 0, 0, 0, 52, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 59, 0, 0, 0,
+ 49, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 52, 0, 0, 0, 50, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 59, 0, 0, 0, 47, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 50, 0, 0, 0, 48, 0, 0, 0,
+ 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 87, 0, 0, 0,171, 0, 0, 0,173, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1,
+173, 0, 0, 0,172, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 1, 85, 0, 0, 0,169, 0, 0, 0,171, 0, 0, 0,
+ 87, 0, 0, 0, 0, 0, 0, 1,172, 0, 0, 0,170, 0, 0, 0, 86, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 1, 83, 0, 0, 0,
+167, 0, 0, 0,169, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 1,170, 0, 0, 0,168, 0, 0, 0, 84, 0, 0, 0, 86, 0, 0, 0,
+ 0, 0, 0, 1, 81, 0, 0, 0,165, 0, 0, 0,167, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 1,168, 0, 0, 0,166, 0, 0, 0,
+ 82, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 1, 79, 0, 0, 0,163, 0, 0, 0,165, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 1,
+166, 0, 0, 0,164, 0, 0, 0, 80, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 1, 77, 0, 0, 0, 90, 0, 0, 0,143, 0, 0, 0,
+161, 0, 0, 0, 0, 0, 0, 1,144, 0, 0, 0, 91, 0, 0, 0, 78, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 1, 90, 0, 0, 0,
+ 92, 0, 0, 0,145, 0, 0, 0,143, 0, 0, 0, 0, 0, 0, 1,146, 0, 0, 0, 93, 0, 0, 0, 91, 0, 0, 0,144, 0, 0, 0,
+ 0, 0, 0, 1, 92, 0, 0, 0, 94, 0, 0, 0,147, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 1,148, 0, 0, 0, 95, 0, 0, 0,
+ 93, 0, 0, 0,146, 0, 0, 0, 0, 0, 0, 1, 94, 0, 0, 0, 96, 0, 0, 0,149, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 1,
+150, 0, 0, 0, 97, 0, 0, 0, 95, 0, 0, 0,148, 0, 0, 0, 0, 0, 0, 1, 96, 0, 0, 0, 98, 0, 0, 0,151, 0, 0, 0,
+149, 0, 0, 0, 0, 0, 0, 1,152, 0, 0, 0, 99, 0, 0, 0, 97, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 1, 98, 0, 0, 0,
+100, 0, 0, 0,153, 0, 0, 0,151, 0, 0, 0, 0, 0, 0, 1,154, 0, 0, 0,101, 0, 0, 0, 99, 0, 0, 0,152, 0, 0, 0,
+ 0, 0, 0, 1,100, 0, 0, 0,102, 0, 0, 0,155, 0, 0, 0,153, 0, 0, 0, 0, 0, 0, 1,156, 0, 0, 0,103, 0, 0, 0,
+101, 0, 0, 0,154, 0, 0, 0, 0, 0, 0, 1,102, 0, 0, 0,104, 0, 0, 0,157, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 1,
+158, 0, 0, 0,105, 0, 0, 0,103, 0, 0, 0,156, 0, 0, 0, 0, 0, 0, 1,104, 0, 0, 0,106, 0, 0, 0,159, 0, 0, 0,
+157, 0, 0, 0, 0, 0, 0, 1,160, 0, 0, 0,107, 0, 0, 0,105, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 1,106, 0, 0, 0,
+ 65, 0, 0, 0, 66, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 1, 66, 0, 0, 0, 65, 0, 0, 0,107, 0, 0, 0,160, 0, 0, 0,
+ 0, 0, 0, 1,108, 0, 0, 0,125, 0, 0, 0,157, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 1,158, 0, 0, 0,126, 0, 0, 0,
+109, 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 1,125, 0, 0, 0,176, 0, 0, 0,155, 0, 0, 0,157, 0, 0, 0, 0, 0, 0, 1,
+156, 0, 0, 0,177, 0, 0, 0,126, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 1,123, 0, 0, 0,153, 0, 0, 0,155, 0, 0, 0,
+176, 0, 0, 0, 0, 0, 0, 1,156, 0, 0, 0,154, 0, 0, 0,124, 0, 0, 0,177, 0, 0, 0, 0, 0, 0, 1,121, 0, 0, 0,
+151, 0, 0, 0,153, 0, 0, 0,123, 0, 0, 0, 0, 0, 0, 1,154, 0, 0, 0,152, 0, 0, 0,122, 0, 0, 0,124, 0, 0, 0,
+ 0, 0, 0, 1,119, 0, 0, 0,149, 0, 0, 0,151, 0, 0, 0,121, 0, 0, 0, 0, 0, 0, 1,152, 0, 0, 0,150, 0, 0, 0,
+120, 0, 0, 0,122, 0, 0, 0, 0, 0, 0, 1,117, 0, 0, 0,147, 0, 0, 0,149, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 1,
+150, 0, 0, 0,148, 0, 0, 0,118, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 1,115, 0, 0, 0,145, 0, 0, 0,147, 0, 0, 0,
+117, 0, 0, 0, 0, 0, 0, 1,148, 0, 0, 0,146, 0, 0, 0,116, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 1,113, 0, 0, 0,
+143, 0, 0, 0,145, 0, 0, 0,115, 0, 0, 0, 0, 0, 0, 1,146, 0, 0, 0,144, 0, 0, 0,114, 0, 0, 0,116, 0, 0, 0,
+ 0, 0, 0, 1, 14, 0, 0, 0,161, 0, 0, 0,143, 0, 0, 0,113, 0, 0, 0, 0, 0, 0, 1,144, 0, 0, 0,162, 0, 0, 0,
+112, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 1, 14, 0, 0, 0,178, 0, 0, 0,174, 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 1,
+174, 0, 0, 0,179, 0, 0, 0,112, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 1,108, 0, 0, 0,159, 0, 0, 0, 66, 0, 0, 0,
+110, 0, 0, 0, 0, 0, 0, 1, 66, 0, 0, 0,160, 0, 0, 0,109, 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 1,110, 0, 0, 0,
+ 66, 0, 0, 0,175, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 1,175, 0, 0, 0, 66, 0, 0, 0,111, 0, 0, 0,181, 0, 0, 0,
+ 0, 0, 0, 1,174, 0, 0, 0,178, 0, 0, 0,180, 0, 0, 0,175, 0, 0, 0, 0, 0, 0, 1,181, 0, 0, 0,179, 0, 0, 0,
+174, 0, 0, 0,175, 0, 0, 0, 0, 0, 0, 1,132, 0, 0, 0,134, 0, 0, 0,173, 0, 0, 0,171, 0, 0, 0, 0, 0, 0, 1,
+173, 0, 0, 0,134, 0, 0, 0,133, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 1,130, 0, 0, 0,132, 0, 0, 0,171, 0, 0, 0,
+169, 0, 0, 0, 0, 0, 0, 1,172, 0, 0, 0,133, 0, 0, 0,131, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 1,128, 0, 0, 0,
+130, 0, 0, 0,169, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 1,170, 0, 0, 0,131, 0, 0, 0,129, 0, 0, 0,168, 0, 0, 0,
+ 0, 0, 0, 1,163, 0, 0, 0,184, 0, 0, 0,182, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 1,183, 0, 0, 0,185, 0, 0, 0,
+164, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 1,128, 0, 0, 0,167, 0, 0, 0,165, 0, 0, 0,182, 0, 0, 0, 0, 0, 0, 1,
+166, 0, 0, 0,168, 0, 0, 0,129, 0, 0, 0,183, 0, 0, 0, 0, 0, 0, 1,141, 0, 0, 0,187, 0, 0, 0,186, 0, 0, 0,
+184, 0, 0, 0, 0, 0, 0, 1,186, 0, 0, 0,187, 0, 0, 0,142, 0, 0, 0,185, 0, 0, 0, 0, 0, 0, 1,182, 0, 0, 0,
+184, 0, 0, 0,186, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 1,186, 0, 0, 0,185, 0, 0, 0,183, 0, 0, 0, 67, 0, 0, 0,
+ 0, 0, 0, 1,127, 0, 0, 0,128, 0, 0, 0,182, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 1,183, 0, 0, 0,129, 0, 0, 0,
+127, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 1,139, 0, 0, 0,190, 0, 0, 0,188, 0, 0, 0,141, 0, 0, 0, 0, 0, 0, 1,
+189, 0, 0, 0,191, 0, 0, 0,140, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 1,137, 0, 0, 0,192, 0, 0, 0,190, 0, 0, 0,
+139, 0, 0, 0, 0, 0, 0, 1,191, 0, 0, 0,193, 0, 0, 0,138, 0, 0, 0,140, 0, 0, 0, 0, 0, 0, 1,136, 0, 0, 0,
+194, 0, 0, 0,192, 0, 0, 0,137, 0, 0, 0, 0, 0, 0, 1,193, 0, 0, 0,195, 0, 0, 0,136, 0, 0, 0,138, 0, 0, 0,
+ 0, 0, 0, 1,135, 0, 0, 0, 69, 0, 0, 0,194, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 1,195, 0, 0, 0, 69, 0, 0, 0,
+135, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 1,187, 0, 0, 0,141, 0, 0, 0,188, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 1,
+189, 0, 0, 0,142, 0, 0, 0,187, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 1, 68, 0, 0, 0,188, 0, 0, 0,203, 0, 0, 0,
+205, 0, 0, 0, 0, 0, 0, 1,204, 0, 0, 0,189, 0, 0, 0, 68, 0, 0, 0,205, 0, 0, 0, 0, 0, 0, 1, 69, 0, 0, 0,
+196, 0, 0, 0,197, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 1,198, 0, 0, 0,196, 0, 0, 0, 69, 0, 0, 0,195, 0, 0, 0,
+ 0, 0, 0, 1,194, 0, 0, 0,197, 0, 0, 0,199, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 1,200, 0, 0, 0,198, 0, 0, 0,
+195, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 1,192, 0, 0, 0,199, 0, 0, 0,201, 0, 0, 0,190, 0, 0, 0, 0, 0, 0, 1,
+202, 0, 0, 0,200, 0, 0, 0,193, 0, 0, 0,191, 0, 0, 0, 0, 0, 0, 1,190, 0, 0, 0,201, 0, 0, 0,203, 0, 0, 0,
+188, 0, 0, 0, 0, 0, 0, 1,204, 0, 0, 0,202, 0, 0, 0,191, 0, 0, 0,189, 0, 0, 0, 0, 0, 0, 1,196, 0, 0, 0,
+201, 0, 0, 0,199, 0, 0, 0,197, 0, 0, 0, 0, 0, 0, 1,200, 0, 0, 0,202, 0, 0, 0,196, 0, 0, 0,198, 0, 0, 0,
+ 0, 0, 0, 1,196, 0, 0, 0,205, 0, 0, 0,203, 0, 0, 0,201, 0, 0, 0, 0, 0, 0, 1,204, 0, 0, 0,205, 0, 0, 0,
+196, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 1,136, 0, 0, 0,137, 0, 0, 0,161, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 1,
+162, 0, 0, 0,138, 0, 0, 0,136, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 1,137, 0, 0, 0,139, 0, 0, 0,208, 0, 0, 0,
+161, 0, 0, 0, 0, 0, 0, 1,209, 0, 0, 0,140, 0, 0, 0,138, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 1,139, 0, 0, 0,
+141, 0, 0, 0,210, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 1,211, 0, 0, 0,142, 0, 0, 0,140, 0, 0, 0,209, 0, 0, 0,
+ 0, 0, 0, 1,141, 0, 0, 0,184, 0, 0, 0,163, 0, 0, 0,210, 0, 0, 0, 0, 0, 0, 1,164, 0, 0, 0,185, 0, 0, 0,
+142, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 1, 79, 0, 0, 0,206, 0, 0, 0,210, 0, 0, 0,163, 0, 0, 0, 0, 0, 0, 1,
+211, 0, 0, 0,207, 0, 0, 0, 80, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 1,206, 0, 0, 0,212, 0, 0, 0,208, 0, 0, 0,
+210, 0, 0, 0, 0, 0, 0, 1,209, 0, 0, 0,213, 0, 0, 0,207, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 1, 77, 0, 0, 0,
+161, 0, 0, 0,208, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 1,209, 0, 0, 0,162, 0, 0, 0, 78, 0, 0, 0,213, 0, 0, 0,
+ 0, 0, 0, 1,128, 0, 0, 0,127, 0, 0, 0, 70, 0, 0, 0,219, 0, 0, 0, 0, 0, 0, 1, 70, 0, 0, 0,127, 0, 0, 0,
+129, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 1,130, 0, 0, 0,128, 0, 0, 0,219, 0, 0, 0,217, 0, 0, 0, 0, 0, 0, 1,
+220, 0, 0, 0,129, 0, 0, 0,131, 0, 0, 0,218, 0, 0, 0, 0, 0, 0, 1,132, 0, 0, 0,130, 0, 0, 0,217, 0, 0, 0,
+215, 0, 0, 0, 0, 0, 0, 1,218, 0, 0, 0,131, 0, 0, 0,133, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 1,134, 0, 0, 0,
+132, 0, 0, 0,215, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 1,216, 0, 0, 0,133, 0, 0, 0,134, 0, 0, 0,214, 0, 0, 0,
+ 0, 0, 0, 1,214, 0, 0, 0,215, 0, 0, 0,226, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 1,227, 0, 0, 0,216, 0, 0, 0,
+214, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 1,215, 0, 0, 0,217, 0, 0, 0,224, 0, 0, 0,226, 0, 0, 0, 0, 0, 0, 1,
+225, 0, 0, 0,218, 0, 0, 0,216, 0, 0, 0,227, 0, 0, 0, 0, 0, 0, 1,217, 0, 0, 0,219, 0, 0, 0,222, 0, 0, 0,
+224, 0, 0, 0, 0, 0, 0, 1,223, 0, 0, 0,220, 0, 0, 0,218, 0, 0, 0,225, 0, 0, 0, 0, 0, 0, 1,219, 0, 0, 0,
+ 70, 0, 0, 0,221, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 1,221, 0, 0, 0, 70, 0, 0, 0,220, 0, 0, 0,223, 0, 0, 0,
+ 0, 0, 0, 1,221, 0, 0, 0,228, 0, 0, 0,226, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 1,227, 0, 0, 0,228, 0, 0, 0,
+221, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 1,222, 0, 0, 0,226, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+225, 0, 0, 0,227, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,180, 0, 0, 0,178, 0, 0, 0,231, 0, 0, 0,
+229, 0, 0, 0, 0, 0, 0, 1,232, 0, 0, 0,179, 0, 0, 0,181, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 1,110, 0, 0, 0,
+180, 0, 0, 0,229, 0, 0, 0,251, 0, 0, 0, 0, 0, 0, 1,230, 0, 0, 0,181, 0, 0, 0,111, 0, 0, 0,252, 0, 0, 0,
+ 0, 0, 0, 1,108, 0, 0, 0,110, 0, 0, 0,251, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 1,252, 0, 0, 0,111, 0, 0, 0,
+109, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 1,178, 0, 0, 0, 14, 0, 0, 0,249, 0, 0, 0,231, 0, 0, 0, 0, 0, 0, 1,
+250, 0, 0, 0,112, 0, 0, 0,179, 0, 0, 0,232, 0, 0, 0, 0, 0, 0, 1, 14, 0, 0, 0,113, 0, 0, 0,247, 0, 0, 0,
+249, 0, 0, 0, 0, 0, 0, 1,248, 0, 0, 0,114, 0, 0, 0,112, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 1,113, 0, 0, 0,
+115, 0, 0, 0,245, 0, 0, 0,247, 0, 0, 0, 0, 0, 0, 1,246, 0, 0, 0,116, 0, 0, 0,114, 0, 0, 0,248, 0, 0, 0,
+ 0, 0, 0, 1,115, 0, 0, 0,117, 0, 0, 0,243, 0, 0, 0,245, 0, 0, 0, 0, 0, 0, 1,244, 0, 0, 0,118, 0, 0, 0,
+116, 0, 0, 0,246, 0, 0, 0, 0, 0, 0, 1,117, 0, 0, 0,119, 0, 0, 0,241, 0, 0, 0,243, 0, 0, 0, 0, 0, 0, 1,
+242, 0, 0, 0,120, 0, 0, 0,118, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 1,119, 0, 0, 0,121, 0, 0, 0,239, 0, 0, 0,
+241, 0, 0, 0, 0, 0, 0, 1,240, 0, 0, 0,122, 0, 0, 0,120, 0, 0, 0,242, 0, 0, 0, 0, 0, 0, 1,121, 0, 0, 0,
+123, 0, 0, 0,237, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 1,238, 0, 0, 0,124, 0, 0, 0,122, 0, 0, 0,240, 0, 0, 0,
+ 0, 0, 0, 1,123, 0, 0, 0,176, 0, 0, 0,233, 0, 0, 0,237, 0, 0, 0, 0, 0, 0, 1,234, 0, 0, 0,177, 0, 0, 0,
+124, 0, 0, 0,238, 0, 0, 0, 0, 0, 0, 1,176, 0, 0, 0,125, 0, 0, 0,235, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 1,
+236, 0, 0, 0,126, 0, 0, 0,177, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 1,125, 0, 0, 0,108, 0, 0, 0,253, 0, 0, 0,
+235, 0, 0, 0, 0, 0, 0, 1,254, 0, 0, 0,109, 0, 0, 0,126, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 1,235, 0, 0, 0,
+253, 0, 0, 0,255, 0, 0, 0, 17, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0,254, 0, 0, 0,236, 0, 0, 0, 18, 1, 0, 0,
+ 0, 0, 0, 1,233, 0, 0, 0,235, 0, 0, 0, 17, 1, 0, 0, 19, 1, 0, 0, 0, 0, 0, 1, 18, 1, 0, 0,236, 0, 0, 0,
+234, 0, 0, 0, 20, 1, 0, 0, 0, 0, 0, 1,237, 0, 0, 0,233, 0, 0, 0, 19, 1, 0, 0, 15, 1, 0, 0, 0, 0, 0, 1,
+ 20, 1, 0, 0,234, 0, 0, 0,238, 0, 0, 0, 16, 1, 0, 0, 0, 0, 0, 1,239, 0, 0, 0,237, 0, 0, 0, 15, 1, 0, 0,
+ 13, 1, 0, 0, 0, 0, 0, 1, 16, 1, 0, 0,238, 0, 0, 0,240, 0, 0, 0, 14, 1, 0, 0, 0, 0, 0, 1,241, 0, 0, 0,
+239, 0, 0, 0, 13, 1, 0, 0, 11, 1, 0, 0, 0, 0, 0, 1, 14, 1, 0, 0,240, 0, 0, 0,242, 0, 0, 0, 12, 1, 0, 0,
+ 0, 0, 0, 1,243, 0, 0, 0,241, 0, 0, 0, 11, 1, 0, 0, 9, 1, 0, 0, 0, 0, 0, 1, 12, 1, 0, 0,242, 0, 0, 0,
+244, 0, 0, 0, 10, 1, 0, 0, 0, 0, 0, 1,245, 0, 0, 0,243, 0, 0, 0, 9, 1, 0, 0, 7, 1, 0, 0, 0, 0, 0, 1,
+ 10, 1, 0, 0,244, 0, 0, 0,246, 0, 0, 0, 8, 1, 0, 0, 0, 0, 0, 1,247, 0, 0, 0,245, 0, 0, 0, 7, 1, 0, 0,
+ 5, 1, 0, 0, 0, 0, 0, 1, 8, 1, 0, 0,246, 0, 0, 0,248, 0, 0, 0, 6, 1, 0, 0, 0, 0, 0, 1,249, 0, 0, 0,
+247, 0, 0, 0, 5, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 1, 6, 1, 0, 0,248, 0, 0, 0,250, 0, 0, 0, 4, 1, 0, 0,
+ 0, 0, 0, 1,231, 0, 0, 0,249, 0, 0, 0, 3, 1, 0, 0, 21, 1, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0,250, 0, 0, 0,
+232, 0, 0, 0, 22, 1, 0, 0, 0, 0, 0, 1,253, 0, 0, 0,251, 0, 0, 0, 1, 1, 0, 0,255, 0, 0, 0, 0, 0, 0, 1,
+ 2, 1, 0, 0,252, 0, 0, 0,254, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1,251, 0, 0, 0,229, 0, 0, 0, 23, 1, 0, 0,
+ 1, 1, 0, 0, 0, 0, 0, 1, 24, 1, 0, 0,230, 0, 0, 0,252, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1,229, 0, 0, 0,
+231, 0, 0, 0, 21, 1, 0, 0, 23, 1, 0, 0, 0, 0, 0, 1, 22, 1, 0, 0,232, 0, 0, 0,230, 0, 0, 0, 24, 1, 0, 0,
+ 0, 0, 0, 1, 65, 0, 0, 0,106, 0, 0, 0, 25, 1, 0, 0, 71, 0, 0, 0, 0, 0, 0, 1, 26, 1, 0, 0,107, 0, 0, 0,
+ 65, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 1,106, 0, 0, 0,104, 0, 0, 0, 27, 1, 0, 0, 25, 1, 0, 0, 0, 0, 0, 1,
+ 28, 1, 0, 0,105, 0, 0, 0,107, 0, 0, 0, 26, 1, 0, 0, 0, 0, 0, 1,104, 0, 0, 0,102, 0, 0, 0, 29, 1, 0, 0,
+ 27, 1, 0, 0, 0, 0, 0, 1, 30, 1, 0, 0,103, 0, 0, 0,105, 0, 0, 0, 28, 1, 0, 0, 0, 0, 0, 1,102, 0, 0, 0,
+100, 0, 0, 0, 31, 1, 0, 0, 29, 1, 0, 0, 0, 0, 0, 1, 32, 1, 0, 0,101, 0, 0, 0,103, 0, 0, 0, 30, 1, 0, 0,
+ 0, 0, 0, 1,100, 0, 0, 0, 98, 0, 0, 0, 33, 1, 0, 0, 31, 1, 0, 0, 0, 0, 0, 1, 34, 1, 0, 0, 99, 0, 0, 0,
+101, 0, 0, 0, 32, 1, 0, 0, 0, 0, 0, 1, 98, 0, 0, 0, 96, 0, 0, 0, 35, 1, 0, 0, 33, 1, 0, 0, 0, 0, 0, 1,
+ 36, 1, 0, 0, 97, 0, 0, 0, 99, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 1, 96, 0, 0, 0, 94, 0, 0, 0, 37, 1, 0, 0,
+ 35, 1, 0, 0, 0, 0, 0, 1, 38, 1, 0, 0, 95, 0, 0, 0, 97, 0, 0, 0, 36, 1, 0, 0, 0, 0, 0, 1, 94, 0, 0, 0,
+ 92, 0, 0, 0, 39, 1, 0, 0, 37, 1, 0, 0, 0, 0, 0, 1, 40, 1, 0, 0, 93, 0, 0, 0, 95, 0, 0, 0, 38, 1, 0, 0,
+ 0, 0, 0, 1, 92, 0, 0, 0, 90, 0, 0, 0, 41, 1, 0, 0, 39, 1, 0, 0, 0, 0, 0, 1, 42, 1, 0, 0, 91, 0, 0, 0,
+ 93, 0, 0, 0, 40, 1, 0, 0, 0, 0, 0, 1, 49, 1, 0, 0, 50, 1, 0, 0, 69, 1, 0, 0, 79, 1, 0, 0, 0, 0, 0, 1,
+ 70, 1, 0, 0, 50, 1, 0, 0, 49, 1, 0, 0, 80, 1, 0, 0, 0, 0, 0, 1, 48, 1, 0, 0, 49, 1, 0, 0, 79, 1, 0, 0,
+ 77, 1, 0, 0, 0, 0, 0, 1, 80, 1, 0, 0, 49, 1, 0, 0, 48, 1, 0, 0, 78, 1, 0, 0, 0, 0, 0, 1, 47, 1, 0, 0,
+ 48, 1, 0, 0, 77, 1, 0, 0, 81, 1, 0, 0, 0, 0, 0, 1, 78, 1, 0, 0, 48, 1, 0, 0, 47, 1, 0, 0, 82, 1, 0, 0,
+ 0, 0, 0, 1, 87, 0, 0, 0, 89, 0, 0, 0, 47, 1, 0, 0, 81, 1, 0, 0, 0, 0, 0, 1, 47, 1, 0, 0, 89, 0, 0, 0,
+ 88, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 1, 85, 0, 0, 0, 87, 0, 0, 0, 81, 1, 0, 0, 75, 1, 0, 0, 0, 0, 0, 1,
+ 82, 1, 0, 0, 88, 0, 0, 0, 86, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 1, 83, 0, 0, 0, 85, 0, 0, 0, 75, 1, 0, 0,
+ 71, 1, 0, 0, 0, 0, 0, 1, 76, 1, 0, 0, 86, 0, 0, 0, 84, 0, 0, 0, 72, 1, 0, 0, 0, 0, 0, 1, 81, 0, 0, 0,
+ 83, 0, 0, 0, 71, 1, 0, 0, 73, 1, 0, 0, 0, 0, 0, 1, 72, 1, 0, 0, 84, 0, 0, 0, 82, 0, 0, 0, 74, 1, 0, 0,
+ 0, 0, 0, 1, 71, 1, 0, 0, 77, 1, 0, 0, 79, 1, 0, 0, 73, 1, 0, 0, 0, 0, 0, 1, 80, 1, 0, 0, 78, 1, 0, 0,
+ 72, 1, 0, 0, 74, 1, 0, 0, 0, 0, 0, 1, 71, 1, 0, 0, 75, 1, 0, 0, 81, 1, 0, 0, 77, 1, 0, 0, 0, 0, 0, 1,
+ 82, 1, 0, 0, 76, 1, 0, 0, 72, 1, 0, 0, 78, 1, 0, 0, 0, 0, 0, 1, 67, 1, 0, 0, 73, 1, 0, 0, 79, 1, 0, 0,
+ 69, 1, 0, 0, 0, 0, 0, 1, 80, 1, 0, 0, 74, 1, 0, 0, 68, 1, 0, 0, 70, 1, 0, 0, 0, 0, 0, 1, 79, 0, 0, 0,
+ 81, 0, 0, 0, 73, 1, 0, 0, 67, 1, 0, 0, 0, 0, 0, 1, 74, 1, 0, 0, 82, 0, 0, 0, 80, 0, 0, 0, 68, 1, 0, 0,
+ 0, 0, 0, 1,206, 0, 0, 0, 83, 1, 0, 0, 85, 1, 0, 0,212, 0, 0, 0, 0, 0, 0, 1, 86, 1, 0, 0, 84, 1, 0, 0,
+207, 0, 0, 0,213, 0, 0, 0, 0, 0, 0, 1, 79, 0, 0, 0, 67, 1, 0, 0, 83, 1, 0, 0,206, 0, 0, 0, 0, 0, 0, 1,
+ 84, 1, 0, 0, 68, 1, 0, 0, 80, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 1, 77, 0, 0, 0,212, 0, 0, 0, 85, 1, 0, 0,
+ 87, 1, 0, 0, 0, 0, 0, 1, 86, 1, 0, 0,213, 0, 0, 0, 78, 0, 0, 0, 88, 1, 0, 0, 0, 0, 0, 1, 77, 0, 0, 0,
+ 87, 1, 0, 0, 41, 1, 0, 0, 90, 0, 0, 0, 0, 0, 0, 1, 42, 1, 0, 0, 88, 1, 0, 0, 78, 0, 0, 0, 91, 0, 0, 0,
+ 0, 0, 0, 1, 75, 0, 0, 0, 65, 1, 0, 0, 93, 1, 0, 0, 45, 1, 0, 0, 0, 0, 0, 1, 94, 1, 0, 0, 66, 1, 0, 0,
+ 75, 0, 0, 0, 45, 1, 0, 0, 0, 0, 0, 1, 45, 1, 0, 0, 93, 1, 0, 0, 91, 1, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1,
+ 92, 1, 0, 0, 94, 1, 0, 0, 45, 1, 0, 0, 76, 0, 0, 0, 0, 0, 0, 1, 76, 0, 0, 0, 91, 1, 0, 0, 89, 1, 0, 0,
+ 46, 1, 0, 0, 0, 0, 0, 1, 90, 1, 0, 0, 92, 1, 0, 0, 76, 0, 0, 0, 46, 1, 0, 0, 0, 0, 0, 1, 46, 1, 0, 0,
+ 89, 1, 0, 0, 69, 1, 0, 0, 50, 1, 0, 0, 0, 0, 0, 1, 70, 1, 0, 0, 90, 1, 0, 0, 46, 1, 0, 0, 50, 1, 0, 0,
+ 0, 0, 0, 1, 67, 1, 0, 0, 69, 1, 0, 0, 89, 1, 0, 0, 83, 1, 0, 0, 0, 0, 0, 1, 90, 1, 0, 0, 70, 1, 0, 0,
+ 68, 1, 0, 0, 84, 1, 0, 0, 0, 0, 0, 1, 37, 1, 0, 0, 39, 1, 0, 0, 59, 1, 0, 0, 51, 1, 0, 0, 0, 0, 0, 1,
+ 60, 1, 0, 0, 40, 1, 0, 0, 38, 1, 0, 0, 52, 1, 0, 0, 0, 0, 0, 1, 74, 0, 0, 0, 57, 1, 0, 0, 65, 1, 0, 0,
+ 75, 0, 0, 0, 0, 0, 0, 1, 66, 1, 0, 0, 58, 1, 0, 0, 74, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 1, 43, 1, 0, 0,
+ 99, 1, 0, 0, 97, 1, 0, 0, 44, 1, 0, 0, 0, 0, 0, 1, 98, 1, 0, 0,100, 1, 0, 0, 43, 1, 0, 0, 44, 1, 0, 0,
+ 0, 0, 0, 1, 44, 1, 0, 0, 97, 1, 0, 0, 95, 1, 0, 0, 73, 0, 0, 0, 0, 0, 0, 1, 96, 1, 0, 0, 98, 1, 0, 0,
+ 44, 1, 0, 0, 73, 0, 0, 0, 0, 0, 0, 1, 73, 0, 0, 0, 95, 1, 0, 0, 57, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 1,
+ 58, 1, 0, 0, 96, 1, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 1, 33, 1, 0, 0, 35, 1, 0, 0,103, 1, 0, 0,
+105, 1, 0, 0, 0, 0, 0, 1,104, 1, 0, 0, 36, 1, 0, 0, 34, 1, 0, 0,106, 1, 0, 0, 0, 0, 0, 1,105, 1, 0, 0,
+103, 1, 0, 0,109, 1, 0, 0,107, 1, 0, 0, 0, 0, 0, 1,110, 1, 0, 0,104, 1, 0, 0,106, 1, 0, 0,108, 1, 0, 0,
+ 0, 0, 0, 1,107, 1, 0, 0,109, 1, 0, 0,111, 1, 0, 0,113, 1, 0, 0, 0, 0, 0, 1,112, 1, 0, 0,110, 1, 0, 0,
+108, 1, 0, 0,114, 1, 0, 0, 0, 0, 0, 1,113, 1, 0, 0,111, 1, 0, 0,117, 1, 0, 0,115, 1, 0, 0, 0, 0, 0, 1,
+118, 1, 0, 0,112, 1, 0, 0,114, 1, 0, 0,116, 1, 0, 0, 0, 0, 0, 1, 55, 1, 0, 0,119, 1, 0, 0,115, 1, 0, 0,
+117, 1, 0, 0, 0, 0, 0, 1,116, 1, 0, 0,120, 1, 0, 0, 56, 1, 0, 0,118, 1, 0, 0, 0, 0, 0, 1, 57, 1, 0, 0,
+ 95, 1, 0, 0,115, 1, 0, 0,119, 1, 0, 0, 0, 0, 0, 1,116, 1, 0, 0, 96, 1, 0, 0, 58, 1, 0, 0,120, 1, 0, 0,
+ 0, 0, 0, 1, 95, 1, 0, 0, 97, 1, 0, 0,113, 1, 0, 0,115, 1, 0, 0, 0, 0, 0, 1,114, 1, 0, 0, 98, 1, 0, 0,
+ 96, 1, 0, 0,116, 1, 0, 0, 0, 0, 0, 1, 97, 1, 0, 0, 99, 1, 0, 0,107, 1, 0, 0,113, 1, 0, 0, 0, 0, 0, 1,
+108, 1, 0, 0,100, 1, 0, 0, 98, 1, 0, 0,114, 1, 0, 0, 0, 0, 0, 1, 99, 1, 0, 0,101, 1, 0, 0,105, 1, 0, 0,
+107, 1, 0, 0, 0, 0, 0, 1,106, 1, 0, 0,102, 1, 0, 0,100, 1, 0, 0,108, 1, 0, 0, 0, 0, 0, 1, 31, 1, 0, 0,
+ 33, 1, 0, 0,105, 1, 0, 0,101, 1, 0, 0, 0, 0, 0, 1,106, 1, 0, 0, 34, 1, 0, 0, 32, 1, 0, 0,102, 1, 0, 0,
+ 0, 0, 0, 1, 72, 0, 0, 0,101, 1, 0, 0, 99, 1, 0, 0, 43, 1, 0, 0, 0, 0, 0, 1,100, 1, 0, 0,102, 1, 0, 0,
+ 72, 0, 0, 0, 43, 1, 0, 0, 0, 0, 0, 1, 25, 1, 0, 0, 27, 1, 0, 0, 29, 1, 0, 0, 31, 1, 0, 0, 0, 0, 0, 1,
+ 30, 1, 0, 0, 28, 1, 0, 0, 26, 1, 0, 0, 32, 1, 0, 0, 0, 0, 0, 1, 25, 1, 0, 0, 31, 1, 0, 0,101, 1, 0, 0,
+ 72, 0, 0, 0, 0, 0, 0, 1,102, 1, 0, 0, 32, 1, 0, 0, 26, 1, 0, 0, 72, 0, 0, 0, 0, 0, 0, 1, 71, 0, 0, 0,
+ 25, 1, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 72, 0, 0, 0, 26, 1, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 35, 1, 0, 0, 37, 1, 0, 0, 51, 1, 0, 0,103, 1, 0, 0, 0, 0, 0, 1, 52, 1, 0, 0, 38, 1, 0, 0,
+ 36, 1, 0, 0,104, 1, 0, 0, 0, 0, 0, 1, 51, 1, 0, 0, 53, 1, 0, 0,109, 1, 0, 0,103, 1, 0, 0, 0, 0, 0, 1,
+110, 1, 0, 0, 54, 1, 0, 0, 52, 1, 0, 0,104, 1, 0, 0, 0, 0, 0, 1, 53, 1, 0, 0,123, 1, 0, 0,111, 1, 0, 0,
+109, 1, 0, 0, 0, 0, 0, 1,112, 1, 0, 0,124, 1, 0, 0, 54, 1, 0, 0,110, 1, 0, 0, 0, 0, 0, 1, 55, 1, 0, 0,
+117, 1, 0, 0,111, 1, 0, 0,123, 1, 0, 0, 0, 0, 0, 1,112, 1, 0, 0,118, 1, 0, 0, 56, 1, 0, 0,124, 1, 0, 0,
+ 0, 0, 0, 1, 89, 1, 0, 0, 91, 1, 0, 0,127, 1, 0, 0,125, 1, 0, 0, 0, 0, 0, 1,128, 1, 0, 0, 92, 1, 0, 0,
+ 90, 1, 0, 0,126, 1, 0, 0, 0, 0, 0, 1, 59, 1, 0, 0,125, 1, 0, 0,127, 1, 0, 0, 61, 1, 0, 0, 0, 0, 0, 1,
+128, 1, 0, 0,126, 1, 0, 0, 60, 1, 0, 0, 62, 1, 0, 0, 0, 0, 0, 1, 39, 1, 0, 0, 41, 1, 0, 0,125, 1, 0, 0,
+ 59, 1, 0, 0, 0, 0, 0, 1,126, 1, 0, 0, 42, 1, 0, 0, 40, 1, 0, 0, 60, 1, 0, 0, 0, 0, 0, 1, 41, 1, 0, 0,
+ 85, 1, 0, 0, 83, 1, 0, 0,125, 1, 0, 0, 0, 0, 0, 1, 84, 1, 0, 0, 86, 1, 0, 0, 42, 1, 0, 0,126, 1, 0, 0,
+ 0, 0, 0, 1, 83, 1, 0, 0, 89, 1, 0, 0,125, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,126, 1, 0, 0, 90, 1, 0, 0,
+ 84, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 41, 1, 0, 0, 87, 1, 0, 0, 85, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
+ 86, 1, 0, 0, 88, 1, 0, 0, 42, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 55, 1, 0, 0, 63, 1, 0, 0,121, 1, 0, 0,
+119, 1, 0, 0, 0, 0, 0, 1,122, 1, 0, 0, 64, 1, 0, 0, 56, 1, 0, 0,120, 1, 0, 0, 0, 0, 0, 1, 57, 1, 0, 0,
+119, 1, 0, 0,121, 1, 0, 0, 65, 1, 0, 0, 0, 0, 0, 1,122, 1, 0, 0,120, 1, 0, 0, 58, 1, 0, 0, 66, 1, 0, 0,
+ 0, 0, 0, 1, 61, 1, 0, 0,127, 1, 0, 0,121, 1, 0, 0, 63, 1, 0, 0, 0, 0, 0, 1,122, 1, 0, 0,128, 1, 0, 0,
+ 62, 1, 0, 0, 64, 1, 0, 0, 0, 0, 0, 1, 91, 1, 0, 0, 93, 1, 0, 0,121, 1, 0, 0,127, 1, 0, 0, 0, 0, 0, 1,
+122, 1, 0, 0, 94, 1, 0, 0, 92, 1, 0, 0,128, 1, 0, 0, 0, 0, 0, 1, 65, 1, 0, 0,121, 1, 0, 0, 93, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1, 94, 1, 0, 0,122, 1, 0, 0, 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,141, 1, 0, 0,
+129, 1, 0, 0,155, 1, 0, 0,143, 1, 0, 0, 0, 0, 0, 1,156, 1, 0, 0,130, 1, 0, 0,142, 1, 0, 0,144, 1, 0, 0,
+ 0, 0, 0, 1,141, 1, 0, 0,143, 1, 0, 0,145, 1, 0, 0,139, 1, 0, 0, 0, 0, 0, 1,146, 1, 0, 0,144, 1, 0, 0,
+142, 1, 0, 0,140, 1, 0, 0, 0, 0, 0, 1,139, 1, 0, 0,145, 1, 0, 0,147, 1, 0, 0,137, 1, 0, 0, 0, 0, 0, 1,
+148, 1, 0, 0,146, 1, 0, 0,140, 1, 0, 0,138, 1, 0, 0, 0, 0, 0, 1,137, 1, 0, 0,147, 1, 0, 0,149, 1, 0, 0,
+135, 1, 0, 0, 0, 0, 0, 1,150, 1, 0, 0,148, 1, 0, 0,138, 1, 0, 0,136, 1, 0, 0, 0, 0, 0, 1,135, 1, 0, 0,
+149, 1, 0, 0,151, 1, 0, 0,133, 1, 0, 0, 0, 0, 0, 1,152, 1, 0, 0,150, 1, 0, 0,136, 1, 0, 0,134, 1, 0, 0,
+ 0, 0, 0, 1,133, 1, 0, 0,151, 1, 0, 0,153, 1, 0, 0,131, 1, 0, 0, 0, 0, 0, 1,154, 1, 0, 0,152, 1, 0, 0,
+134, 1, 0, 0,132, 1, 0, 0, 0, 0, 0, 1,151, 1, 0, 0,161, 1, 0, 0,159, 1, 0, 0,153, 1, 0, 0, 0, 0, 0, 1,
+160, 1, 0, 0,162, 1, 0, 0,152, 1, 0, 0,154, 1, 0, 0, 0, 0, 0, 1,149, 1, 0, 0,163, 1, 0, 0,161, 1, 0, 0,
+151, 1, 0, 0, 0, 0, 0, 1,162, 1, 0, 0,164, 1, 0, 0,150, 1, 0, 0,152, 1, 0, 0, 0, 0, 0, 1,147, 1, 0, 0,
+165, 1, 0, 0,163, 1, 0, 0,149, 1, 0, 0, 0, 0, 0, 1,164, 1, 0, 0,166, 1, 0, 0,148, 1, 0, 0,150, 1, 0, 0,
+ 0, 0, 0, 1,145, 1, 0, 0,167, 1, 0, 0,165, 1, 0, 0,147, 1, 0, 0, 0, 0, 0, 1,166, 1, 0, 0,168, 1, 0, 0,
+146, 1, 0, 0,148, 1, 0, 0, 0, 0, 0, 1,143, 1, 0, 0,169, 1, 0, 0,167, 1, 0, 0,145, 1, 0, 0, 0, 0, 0, 1,
+168, 1, 0, 0,170, 1, 0, 0,144, 1, 0, 0,146, 1, 0, 0, 0, 0, 0, 1,143, 1, 0, 0,155, 1, 0, 0,157, 1, 0, 0,
+169, 1, 0, 0, 0, 0, 0, 1,158, 1, 0, 0,156, 1, 0, 0,144, 1, 0, 0,170, 1, 0, 0, 0, 0, 0, 1, 59, 1, 0, 0,
+ 61, 1, 0, 0,185, 1, 0, 0,183, 1, 0, 0, 0, 0, 0, 1,186, 1, 0, 0, 62, 1, 0, 0, 60, 1, 0, 0,184, 1, 0, 0,
+ 0, 0, 0, 1, 61, 1, 0, 0,131, 1, 0, 0,153, 1, 0, 0,185, 1, 0, 0, 0, 0, 0, 1,154, 1, 0, 0,132, 1, 0, 0,
+ 62, 1, 0, 0,186, 1, 0, 0, 0, 0, 0, 1, 51, 1, 0, 0, 59, 1, 0, 0,183, 1, 0, 0, 53, 1, 0, 0, 0, 0, 0, 1,
+184, 1, 0, 0, 60, 1, 0, 0, 52, 1, 0, 0, 54, 1, 0, 0, 0, 0, 0, 1,123, 1, 0, 0,171, 1, 0, 0,155, 1, 0, 0,
+129, 1, 0, 0, 0, 0, 0, 1,156, 1, 0, 0,172, 1, 0, 0,124, 1, 0, 0,130, 1, 0, 0, 0, 0, 0, 1,153, 1, 0, 0,
+159, 1, 0, 0,181, 1, 0, 0,185, 1, 0, 0, 0, 0, 0, 1,182, 1, 0, 0,160, 1, 0, 0,154, 1, 0, 0,186, 1, 0, 0,
+ 0, 0, 0, 1,179, 1, 0, 0,187, 1, 0, 0,185, 1, 0, 0,181, 1, 0, 0, 0, 0, 0, 1,186, 1, 0, 0,188, 1, 0, 0,
+180, 1, 0, 0,182, 1, 0, 0, 0, 0, 0, 1,175, 1, 0, 0,187, 1, 0, 0,179, 1, 0, 0,177, 1, 0, 0, 0, 0, 0, 1,
+180, 1, 0, 0,188, 1, 0, 0,176, 1, 0, 0,178, 1, 0, 0, 0, 0, 0, 1,173, 1, 0, 0,189, 1, 0, 0,187, 1, 0, 0,
+175, 1, 0, 0, 0, 0, 0, 1,188, 1, 0, 0,190, 1, 0, 0,174, 1, 0, 0,176, 1, 0, 0, 0, 0, 0, 1,171, 1, 0, 0,
+189, 1, 0, 0,173, 1, 0, 0,191, 1, 0, 0, 0, 0, 0, 1,174, 1, 0, 0,190, 1, 0, 0,172, 1, 0, 0,192, 1, 0, 0,
+ 0, 0, 0, 1,155, 1, 0, 0,171, 1, 0, 0,191, 1, 0, 0,157, 1, 0, 0, 0, 0, 0, 1,192, 1, 0, 0,172, 1, 0, 0,
+156, 1, 0, 0,158, 1, 0, 0, 0, 0, 0, 1, 53, 1, 0, 0,189, 1, 0, 0,171, 1, 0, 0,123, 1, 0, 0, 0, 0, 0, 1,
+172, 1, 0, 0,190, 1, 0, 0, 54, 1, 0, 0,124, 1, 0, 0, 0, 0, 0, 1, 53, 1, 0, 0,183, 1, 0, 0,187, 1, 0, 0,
+189, 1, 0, 0, 0, 0, 0, 1,188, 1, 0, 0,184, 1, 0, 0, 54, 1, 0, 0,190, 1, 0, 0, 0, 0, 0, 1,183, 1, 0, 0,
+185, 1, 0, 0,187, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,188, 1, 0, 0,186, 1, 0, 0,184, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1,157, 1, 0, 0,191, 1, 0, 0,193, 1, 0, 0,217, 1, 0, 0, 0, 0, 0, 1,194, 1, 0, 0,192, 1, 0, 0,
+158, 1, 0, 0,218, 1, 0, 0, 0, 0, 0, 1,191, 1, 0, 0,173, 1, 0, 0,203, 1, 0, 0,193, 1, 0, 0, 0, 0, 0, 1,
+204, 1, 0, 0,174, 1, 0, 0,192, 1, 0, 0,194, 1, 0, 0, 0, 0, 0, 1,173, 1, 0, 0,175, 1, 0, 0,201, 1, 0, 0,
+203, 1, 0, 0, 0, 0, 0, 1,202, 1, 0, 0,176, 1, 0, 0,174, 1, 0, 0,204, 1, 0, 0, 0, 0, 0, 1,175, 1, 0, 0,
+177, 1, 0, 0,199, 1, 0, 0,201, 1, 0, 0, 0, 0, 0, 1,200, 1, 0, 0,178, 1, 0, 0,176, 1, 0, 0,202, 1, 0, 0,
+ 0, 0, 0, 1,177, 1, 0, 0,179, 1, 0, 0,197, 1, 0, 0,199, 1, 0, 0, 0, 0, 0, 1,198, 1, 0, 0,180, 1, 0, 0,
+178, 1, 0, 0,200, 1, 0, 0, 0, 0, 0, 1,179, 1, 0, 0,181, 1, 0, 0,195, 1, 0, 0,197, 1, 0, 0, 0, 0, 0, 1,
+196, 1, 0, 0,182, 1, 0, 0,180, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 1,181, 1, 0, 0,159, 1, 0, 0,215, 1, 0, 0,
+195, 1, 0, 0, 0, 0, 0, 1,216, 1, 0, 0,160, 1, 0, 0,182, 1, 0, 0,196, 1, 0, 0, 0, 0, 0, 1,169, 1, 0, 0,
+157, 1, 0, 0,217, 1, 0, 0,205, 1, 0, 0, 0, 0, 0, 1,218, 1, 0, 0,158, 1, 0, 0,170, 1, 0, 0,206, 1, 0, 0,
+ 0, 0, 0, 1,167, 1, 0, 0,169, 1, 0, 0,205, 1, 0, 0,207, 1, 0, 0, 0, 0, 0, 1,206, 1, 0, 0,170, 1, 0, 0,
+168, 1, 0, 0,208, 1, 0, 0, 0, 0, 0, 1,165, 1, 0, 0,167, 1, 0, 0,207, 1, 0, 0,209, 1, 0, 0, 0, 0, 0, 1,
+208, 1, 0, 0,168, 1, 0, 0,166, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 1,163, 1, 0, 0,165, 1, 0, 0,209, 1, 0, 0,
+211, 1, 0, 0, 0, 0, 0, 1,210, 1, 0, 0,166, 1, 0, 0,164, 1, 0, 0,212, 1, 0, 0, 0, 0, 0, 1,161, 1, 0, 0,
+163, 1, 0, 0,211, 1, 0, 0,213, 1, 0, 0, 0, 0, 0, 1,212, 1, 0, 0,164, 1, 0, 0,162, 1, 0, 0,214, 1, 0, 0,
+ 0, 0, 0, 1,159, 1, 0, 0,161, 1, 0, 0,213, 1, 0, 0,215, 1, 0, 0, 0, 0, 0, 1,214, 1, 0, 0,162, 1, 0, 0,
+160, 1, 0, 0,216, 1, 0, 0, 0, 0, 0, 1,199, 1, 0, 0,197, 1, 0, 0,221, 1, 0, 0,219, 1, 0, 0, 0, 0, 0, 1,
+222, 1, 0, 0,198, 1, 0, 0,200, 1, 0, 0,220, 1, 0, 0, 0, 0, 0, 1,219, 1, 0, 0,221, 1, 0, 0,223, 1, 0, 0,
+225, 1, 0, 0, 0, 0, 0, 1,224, 1, 0, 0,222, 1, 0, 0,220, 1, 0, 0,226, 1, 0, 0, 0, 0, 0, 1,225, 1, 0, 0,
+223, 1, 0, 0,229, 1, 0, 0,227, 1, 0, 0, 0, 0, 0, 1,230, 1, 0, 0,224, 1, 0, 0,226, 1, 0, 0,228, 1, 0, 0,
+ 0, 0, 0, 1,227, 1, 0, 0,229, 1, 0, 0,231, 1, 0, 0,233, 1, 0, 0, 0, 0, 0, 1,232, 1, 0, 0,230, 1, 0, 0,
+228, 1, 0, 0,234, 1, 0, 0, 0, 0, 0, 1,205, 1, 0, 0,217, 1, 0, 0,227, 1, 0, 0,233, 1, 0, 0, 0, 0, 0, 1,
+228, 1, 0, 0,218, 1, 0, 0,206, 1, 0, 0,234, 1, 0, 0, 0, 0, 0, 1,193, 1, 0, 0,225, 1, 0, 0,227, 1, 0, 0,
+217, 1, 0, 0, 0, 0, 0, 1,228, 1, 0, 0,226, 1, 0, 0,194, 1, 0, 0,218, 1, 0, 0, 0, 0, 0, 1,193, 1, 0, 0,
+203, 1, 0, 0,219, 1, 0, 0,225, 1, 0, 0, 0, 0, 0, 1,220, 1, 0, 0,204, 1, 0, 0,194, 1, 0, 0,226, 1, 0, 0,
+ 0, 0, 0, 1,199, 1, 0, 0,219, 1, 0, 0,203, 1, 0, 0,201, 1, 0, 0, 0, 0, 0, 1,204, 1, 0, 0,220, 1, 0, 0,
+200, 1, 0, 0,202, 1, 0, 0, 0, 0, 0, 1,195, 1, 0, 0,215, 1, 0, 0,221, 1, 0, 0,197, 1, 0, 0, 0, 0, 0, 1,
+222, 1, 0, 0,216, 1, 0, 0,196, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 1,213, 1, 0, 0,223, 1, 0, 0,221, 1, 0, 0,
+215, 1, 0, 0, 0, 0, 0, 1,222, 1, 0, 0,224, 1, 0, 0,214, 1, 0, 0,216, 1, 0, 0, 0, 0, 0, 1,211, 1, 0, 0,
+229, 1, 0, 0,223, 1, 0, 0,213, 1, 0, 0, 0, 0, 0, 1,224, 1, 0, 0,230, 1, 0, 0,212, 1, 0, 0,214, 1, 0, 0,
+ 0, 0, 0, 1,209, 1, 0, 0,231, 1, 0, 0,229, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 1,230, 1, 0, 0,232, 1, 0, 0,
+210, 1, 0, 0,212, 1, 0, 0, 0, 0, 0, 1,207, 1, 0, 0,233, 1, 0, 0,231, 1, 0, 0,209, 1, 0, 0, 0, 0, 0, 1,
+232, 1, 0, 0,234, 1, 0, 0,208, 1, 0, 0,210, 1, 0, 0, 0, 0, 0, 1,205, 1, 0, 0,233, 1, 0, 0,207, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 1,208, 1, 0, 0,234, 1, 0, 0,206, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,133, 1, 0, 0,
+131, 1, 0, 0,245, 1, 0, 0,243, 1, 0, 0, 0, 0, 0, 1,246, 1, 0, 0,132, 1, 0, 0,134, 1, 0, 0,244, 1, 0, 0,
+ 0, 0, 0, 1,135, 1, 0, 0,133, 1, 0, 0,243, 1, 0, 0,241, 1, 0, 0, 0, 0, 0, 1,244, 1, 0, 0,134, 1, 0, 0,
+136, 1, 0, 0,242, 1, 0, 0, 0, 0, 0, 1,137, 1, 0, 0,135, 1, 0, 0,241, 1, 0, 0,239, 1, 0, 0, 0, 0, 0, 1,
+242, 1, 0, 0,136, 1, 0, 0,138, 1, 0, 0,240, 1, 0, 0, 0, 0, 0, 1,139, 1, 0, 0,137, 1, 0, 0,239, 1, 0, 0,
+237, 1, 0, 0, 0, 0, 0, 1,240, 1, 0, 0,138, 1, 0, 0,140, 1, 0, 0,238, 1, 0, 0, 0, 0, 0, 1,141, 1, 0, 0,
+139, 1, 0, 0,237, 1, 0, 0,235, 1, 0, 0, 0, 0, 0, 1,238, 1, 0, 0,140, 1, 0, 0,142, 1, 0, 0,236, 1, 0, 0,
+ 0, 0, 0, 1,129, 1, 0, 0,141, 1, 0, 0,235, 1, 0, 0,247, 1, 0, 0, 0, 0, 0, 1,236, 1, 0, 0,142, 1, 0, 0,
+130, 1, 0, 0,248, 1, 0, 0, 0, 0, 0, 1,235, 1, 0, 0,243, 1, 0, 0,245, 1, 0, 0,247, 1, 0, 0, 0, 0, 0, 1,
+246, 1, 0, 0,244, 1, 0, 0,236, 1, 0, 0,248, 1, 0, 0, 0, 0, 0, 1,235, 1, 0, 0,237, 1, 0, 0,241, 1, 0, 0,
+243, 1, 0, 0, 0, 0, 0, 1,242, 1, 0, 0,238, 1, 0, 0,236, 1, 0, 0,244, 1, 0, 0, 0, 0, 0, 1,237, 1, 0, 0,
+239, 1, 0, 0,241, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,242, 1, 0, 0,240, 1, 0, 0,238, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 55, 1, 0, 0,123, 1, 0, 0,129, 1, 0, 0,247, 1, 0, 0, 0, 0, 0, 1,130, 1, 0, 0,124, 1, 0, 0,
+ 56, 1, 0, 0,248, 1, 0, 0, 0, 0, 0, 1, 55, 1, 0, 0,247, 1, 0, 0,245, 1, 0, 0, 63, 1, 0, 0, 0, 0, 0, 1,
+246, 1, 0, 0,248, 1, 0, 0, 56, 1, 0, 0, 64, 1, 0, 0, 0, 0, 0, 1, 61, 1, 0, 0, 63, 1, 0, 0,245, 1, 0, 0,
+131, 1, 0, 0, 0, 0, 0, 1,246, 1, 0, 0, 64, 1, 0, 0, 62, 1, 0, 0,132, 1, 0, 0, 0, 0, 0, 1, 68, 65, 84, 65,
+192, 93, 0, 0, 16, 7,117, 1, 0, 0, 0, 0, 60, 0, 0, 0,244, 1, 0, 0, 3,112, 28, 63,185,178,236, 62,224,124, 27, 63,
+235, 65,232, 62,144, 63, 30, 63,233,195,226, 62,118,152, 32, 63, 37,167,236, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 2,232,209, 62,222, 21,226, 62,102,109,215, 62,222,147,231, 62, 28,135,213, 62,172, 4,236, 62, 56, 54,205, 62,
+ 22,249,235, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,118,152, 32, 63, 37,167,236, 62,144, 63, 30, 63,
+233,195,226, 62,108,235, 33, 63,197,235,220, 62,209,151, 37, 63, 89,161,236, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 76,144,202, 62,186, 61,220, 62, 2,232,209, 62,222, 21,226, 62, 56, 54,205, 62, 22,249,235, 62,128, 55,195, 62,
+ 70,243,235, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,144, 63, 30, 63,233,195,226, 62, 20, 55, 25, 63,
+ 1, 35,223, 62,200,178, 25, 63, 77,233,214, 62,108,235, 33, 63,197,235,220, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,146, 1,219, 62, 66, 59,214, 62,248,248,219, 62,246,116,222, 62, 2,232,209, 62,222, 21,226, 62, 76,144,202, 62,
+186, 61,220, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,224,124, 27, 63,235, 65,232, 62, 87,252, 24, 63,
+ 93,111,230, 62, 20, 55, 25, 63, 1, 35,223, 62,144, 63, 30, 63,233,195,226, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,248,248,219, 62,246,116,222, 62,118,110,220, 62, 78,193,229, 62,102,109,215, 62,222,147,231, 62, 2,232,209, 62,
+222, 21,226, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0, 87,252, 24, 63, 93,111,230, 62, 22,195, 22, 63,
+195, 90,232, 62,191, 91, 20, 63,193, 18,227, 62, 20, 55, 25, 63, 1, 35,223, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,162,175,229, 62,178,100,226, 62,248,224,224, 62,182,172,231, 62,118,110,220, 62, 78,193,229, 62,248,248,219, 62,
+246,116,222, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0, 20, 55, 25, 63, 1, 35,223, 62,191, 91, 20, 63,
+193, 18,227, 62,187,165, 17, 63,225, 6,221, 62,200,178, 25, 63, 77,233,214, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,170, 27,235, 62,214, 88,220, 62,162,175,229, 62,178,100,226, 62,248,248,219, 62,246,116,222, 62,146, 1,219, 62,
+ 66, 59,214, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,191, 91, 20, 63,193, 18,227, 62,164, 18, 18, 63,
+173,201,236, 62,157,231, 13, 63, 89,161,236, 62,187,165, 17, 63,225, 6,221, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,232,151,242, 62, 70,243,235, 62,216, 65,234, 62,158, 27,236, 62,162,175,229, 62,178,100,226, 62,170, 27,235, 62,
+214, 88,220, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0, 22,195, 22, 63,195, 90,232, 62, 11,202, 21, 63,
+ 1,189,236, 62,164, 18, 18, 63,173,201,236, 62,191, 91, 20, 63,193, 18,227, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,216, 65,234, 62,158, 27,236, 62, 12,211,226, 62,246, 14,236, 62,248,224,224, 62,182,172,231, 62,162,175,229, 62,
+178,100,226, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0, 11,202, 21, 63, 1,189,236, 62,215,202, 22, 63,
+237,124,241, 62,125,105, 20, 63, 1, 71,246, 62,164, 18, 18, 63,173,201,236, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 42,148,229, 62,246,152,245, 62,112,209,224, 62,226,206,240, 62, 12,211,226, 62,246, 14,236, 62,216, 65,234, 62,
+158, 27,236, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,164, 18, 18, 63,173,201,236, 62,125,105, 20, 63,
+ 1, 71,246, 62, 44,173, 17, 63,231,149,252, 62,157,231, 13, 63, 89,161,236, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,206, 12,235, 62,218,231,251, 62, 42,148,229, 62,246,152,245, 62,216, 65,234, 62,158, 27,236, 62,232,151,242, 62,
+ 70,243,235, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,125,105, 20, 63, 1, 71,246, 62, 37, 59, 25, 63,
+ 49, 73,250, 62,108,178, 25, 63,218,108, 1, 63, 44,173, 17, 63,231,149,252, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 76, 2,219, 62,213, 21, 1, 63,216,240,219, 62, 38,155,249, 62, 42,148,229, 62,246,152,245, 62,206, 12,235, 62,
+218,231,251, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,215,202, 22, 63,237,124,241, 62,195, 1, 25, 63,
+169,102,243, 62, 37, 59, 25, 63, 49, 73,250, 62,125,105, 20, 63, 1, 71,246, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,216,240,219, 62, 38,155,249, 62,156, 99,220, 62,154,184,242, 62,112,209,224, 62,226,206,240, 62, 42,148,229, 62,
+246,152,245, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,195, 1, 25, 63,169,102,243, 62,176,125, 27, 63,
+149,145,241, 62,167, 74, 30, 63, 3,153,246, 62, 37, 59, 25, 63, 49, 73,250, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,212,209,209, 62,246,234,245, 62,192,107,215, 62,138,227,240, 62,156, 99,220, 62,154,184,242, 62,216,240,219, 62,
+ 38,155,249, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0, 37, 59, 25, 63, 49, 73,250, 62,167, 74, 30, 63,
+ 3,153,246, 62,204,230, 33, 63,107,232,252, 62,108,178, 25, 63,218,108, 1, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,132,153,202, 62, 94, 58,252, 62,212,209,209, 62,246,234,245, 62,216,240,219, 62, 38,155,249, 62, 76, 2,219, 62,
+213, 21, 1, 63,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,167, 74, 30, 63, 3,153,246, 62,118,152, 32, 63,
+ 37,167,236, 62,209,151, 37, 63, 89,161,236, 62,204,230, 33, 63,107,232,252, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,128, 55,195, 62, 70,243,235, 62, 56, 54,205, 62, 22,249,235, 62,212,209,209, 62,246,234,245, 62,132,153,202, 62,
+ 94, 58,252, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,176,125, 27, 63,149,145,241, 62, 3,112, 28, 63,
+185,178,236, 62,118,152, 32, 63, 37,167,236, 62,167, 74, 30, 63, 3,153,246, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 56, 54,205, 62, 22,249,235, 62, 28,135,213, 62,172, 4,236, 62,192,107,215, 62,138,227,240, 62,212,209,209, 62,
+246,234,245, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0, 3,112, 28, 63,185,178,236, 62,176,125, 27, 63,
+149,145,241, 62, 42, 39, 27, 63, 57, 1,241, 62,140,249, 27, 63,115,186,236, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,206, 24,216, 62, 46, 83,240, 62,192,107,215, 62,138,227,240, 62, 28,135,213, 62,172, 4,236, 62, 8,116,214, 62,
+102, 12,236, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,176,125, 27, 63,149,145,241, 62,195, 1, 25, 63,
+169,102,243, 62, 6,248, 24, 63,185, 91,242, 62, 42, 39, 27, 63, 57, 1,241, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 22,119,220, 62,174,173,241, 62,156, 99,220, 62,154,184,242, 62,192,107,215, 62,138,227,240, 62,206, 24,216, 62,
+ 46, 83,240, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,195, 1, 25, 63,169,102,243, 62,215,202, 22, 63,
+237,124,241, 62,157, 38, 23, 63,225,173,240, 62, 6,248, 24, 63,185, 91,242, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,234, 25,224, 62,214,255,239, 62,112,209,224, 62,226,206,240, 62,156, 99,220, 62,154,184,242, 62, 22,119,220, 62,
+174,173,241, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,215,202, 22, 63,237,124,241, 62, 11,202, 21, 63,
+ 1,189,236, 62, 13, 89, 22, 63,247,196,236, 62,157, 38, 23, 63,225,173,240, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 8,181,225, 62,234, 22,236, 62, 12,211,226, 62,246, 14,236, 62,112,209,224, 62,226,206,240, 62,234, 25,224, 62,
+214,255,239, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0, 11,202, 21, 63, 1,189,236, 62, 22,195, 22, 63,
+195, 90,232, 62, 88, 33, 23, 63, 69, 47,233, 62, 13, 89, 22, 63,247,196,236, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,112, 36,224, 62, 58,129,232, 62,248,224,224, 62,182,172,231, 62, 12,211,226, 62,246, 14,236, 62, 8,181,225, 62,
+234, 22,236, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0, 22,195, 22, 63,195, 90,232, 62, 87,252, 24, 63,
+ 93,111,230, 62,100,243, 24, 63, 5,123,231, 62, 88, 33, 23, 63, 69, 47,233, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 90,128,220, 62,248,204,230, 62,118,110,220, 62, 78,193,229, 62,248,224,224, 62,182,172,231, 62,112, 36,224, 62,
+ 58,129,232, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0, 87,252, 24, 63, 93,111,230, 62,224,124, 27, 63,
+235, 65,232, 62,169, 37, 27, 63, 35,211,232, 62,100,243, 24, 63, 5,123,231, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,206, 27,216, 62, 22, 37,232, 62,102,109,215, 62,222,147,231, 62,118,110,220, 62, 78,193,229, 62, 90,128,220, 62,
+248,204,230, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,224,124, 27, 63,235, 65,232, 62, 3,112, 28, 63,
+185,178,236, 62,140,249, 27, 63,115,186,236, 62,169, 37, 27, 63, 35,211,232, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 8,116,214, 62,102, 12,236, 62, 28,135,213, 62,172, 4,236, 62,102,109,215, 62,222,147,231, 62,206, 27,216, 62,
+ 22, 37,232, 62,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,240, 0,138,242, 24, 63, 21,194,236, 62,169, 37, 27, 63,
+ 35,211,232, 62,140,249, 27, 63,115,186,236, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0, 8,116,214, 62,102, 12,236, 62,206, 27,216, 62, 22, 37,232, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,112, 0,100,243, 24, 63, 5,123,231, 62,169, 37, 27, 63,
+ 35,211,232, 62,138,242, 24, 63, 21,194,236, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0, 16,130,220, 62, 6, 20,236, 62,206, 27,216, 62, 22, 37,232, 62, 90,128,220, 62,248,204,230, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62, 88, 33, 23, 63,
+ 69, 47,233, 62,100,243, 24, 63, 5,123,231, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0, 90,128,220, 62,248,204,230, 62,112, 36,224, 62, 58,129,232, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62, 13, 89, 22, 63,
+247,196,236, 62, 88, 33, 23, 63, 69, 47,233, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0,112, 36,224, 62, 58,129,232, 62, 8,181,225, 62,234, 22,236, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62,157, 38, 23, 63,
+225,173,240, 62, 13, 89, 22, 63,247,196,236, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0, 8,181,225, 62,234, 22,236, 62,234, 25,224, 62,214,255,239, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62, 6,248, 24, 63,
+185, 91,242, 62,157, 38, 23, 63,225,173,240, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0,234, 25,224, 62,214,255,239, 62, 22,119,220, 62,174,173,241, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62, 42, 39, 27, 63,
+ 57, 1,241, 62, 6,248, 24, 63,185, 91,242, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0, 22,119,220, 62,174,173,241, 62,206, 24,216, 62, 46, 83,240, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,112, 0,138,242, 24, 63, 21,194,236, 62,140,249, 27, 63,
+115,186,236, 62, 42, 39, 27, 63, 57, 1,241, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0,206, 24,216, 62, 46, 83,240, 62, 8,116,214, 62,102, 12,236, 62, 16,130,220, 62, 6, 20,236, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 61, 0, 5, 0, 0, 0,112, 0,174,254, 16, 63, 94, 45, 34, 62, 79,190, 13, 63,
+160,193, 46, 62,220,199, 3, 63, 89,219, 24, 62,219,199, 3, 63, 18, 28,229, 61,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 16, 0,220,199, 3, 63, 89,219, 24, 62, 14,150,243, 62,204, 79, 47, 62,140,248,236, 62,182,202, 34, 62,219,199, 3, 63,
+ 18, 28,229, 61,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 64, 0,184,152, 21, 63,182, 47, 53, 62,250,104, 16, 63,
+ 16,113, 55, 62, 79,190, 13, 63,160,193, 46, 62,174,254, 16, 63, 94, 45, 34, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,128, 0, 14,150,243, 62,204, 79, 47, 62,200, 68,238, 62, 76, 62, 56, 62,183,207,227, 62,250, 75, 54, 62,140,248,236, 62,
+182,202, 34, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,128, 0,137, 57, 22, 63, 81, 93, 61, 62,206,186, 16, 63,
+ 85,129, 72, 62,250,104, 16, 63, 16,113, 55, 62,184,152, 21, 63,182, 47, 53, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,200, 68,238, 62, 76, 62, 56, 62,192,187,237, 62,194,118, 73, 62,122,152,226, 62,190,166, 62, 62,183,207,227, 62,
+250, 75, 54, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,250,249, 22, 63,160,251, 88, 62,222, 32, 16, 63,
+ 34,106, 93, 62,206,186, 16, 63, 85,129, 72, 62,137, 57, 22, 63, 81, 93, 61, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,192,187,237, 62,194,118, 73, 62, 21, 19,239, 62,121,110, 94, 62, 90, 83,225, 62, 21,153, 90, 62,122,152,226, 62,
+190,166, 62, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 20, 81, 25, 63, 17, 56,132, 62,206,243, 15, 63,
+182,207,136, 62,222, 32, 16, 63, 34,106, 93, 62,250,249, 22, 63,160,251, 88, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 21, 19,239, 62,121,110, 94, 62, 92,193,239, 62,113, 61,137, 62, 54, 42,221, 62,209, 25,133, 62, 90, 83,225, 62,
+ 21,153, 90, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,111,239, 27, 63,159, 77,166, 62, 91, 94, 37, 63,
+107,120,187, 62, 66, 21, 30, 63,178,139,200, 62,158,237, 12, 63, 38,241,187, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,139,125,211, 62,170,171,200, 62,156, 28,197, 62,166,130,187, 62,115, 21,216, 62, 14,177,166, 62, 15,175,245, 62,
+188, 14,188, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 91, 94, 37, 63,107,120,187, 62, 87, 57, 43, 63,
+222, 58,206, 62, 24,163, 39, 63,174, 95,216, 62, 66, 21, 30, 63,178,139,200, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 98,194,191, 62, 42, 94,216, 62,130,207,184, 62, 42, 27,206, 62,156, 28,197, 62,166,130,187, 62,139,125,211, 62,
+170,171,200, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 87, 57, 43, 63,222, 58,206, 62, 38,229, 50, 63,
+169, 32,226, 62,177, 79, 43, 63,202,194,231, 62, 24,163, 39, 63,174, 95,216, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 60,201,183, 62, 82,218,231, 62,196, 39,168, 62,206, 11,226, 62,130,207,184, 62, 42, 27,206, 62, 98,194,191, 62,
+ 42, 94,216, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 38,229, 50, 63,169, 32,226, 62, 62,134, 48, 63,
+ 37,107,249, 62,154,190, 43, 63,192, 0,249, 62,177, 79, 43, 63,202,194,231, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,138,190,182, 62, 35, 49,249, 62,172,229,172, 62,116,127,249, 62,196, 39,168, 62,206, 11,226, 62, 60,201,183, 62,
+ 82,218,231, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 62,134, 48, 63, 37,107,249, 62,238, 88, 46, 63,
+146,223, 2, 63,123,207, 40, 63,218,175,254, 62,154,190, 43, 63,192, 0,249, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 2,184,188, 62,140, 0,255, 62,173, 87,177, 62,102, 9, 3, 63,172,229,172, 62,116,127,249, 62,138,190,182, 62,
+ 35, 49,249, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,238, 88, 46, 63,146,223, 2, 63,220,158, 34, 63,
+175, 23, 10, 63,126, 77, 30, 63,156, 88, 5, 63,123,207, 40, 63,218,175,254, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 89, 65,210, 62, 56,158, 5, 63,124,109,201, 62, 72,121, 10, 63,173, 87,177, 62,102, 9, 3, 63, 2,184,188, 62,
+140, 0,255, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,220,158, 34, 63,175, 23, 10, 63, 28,105, 26, 63,
+242,194, 11, 63,244,120, 25, 63, 78,242, 7, 63,126, 77, 30, 63,156, 88, 5, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 0, 39,220, 62,252, 58, 8, 63,220, 73,218, 62,169, 31, 12, 63,124,109,201, 62, 72,121, 10, 63, 89, 65,210, 62,
+ 56,158, 5, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 28,105, 26, 63,242,194, 11, 63,173,244, 22, 63,
+236,215, 11, 63,202, 47, 22, 63,156, 60, 8, 63,244,120, 25, 63, 78,242, 7, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 11,221,226, 62, 90,125, 8, 63,220, 89,225, 62, 77, 42, 12, 63,220, 73,218, 62,169, 31, 12, 63, 0, 39,220, 62,
+252, 58, 8, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,173,244, 22, 63,236,215, 11, 63, 67,169, 11, 63,
+ 18,197, 11, 63,106,252, 12, 63,180,173, 3, 63,202, 47, 22, 63,156, 60, 8, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 35,114,245, 62,233,196, 3, 63, 55, 72,248, 62, 91,232, 11, 63,220, 89,225, 62, 77, 42, 12, 63, 11,221,226, 62,
+ 90,125, 8, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 67,169, 11, 63, 18,197, 11, 63,148,232, 3, 63,
+164, 17, 11, 63,162,220, 3, 63, 45, 88, 0, 63,106,252, 12, 63,180,173, 3, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,162,220, 3, 63, 45, 88, 0, 63,148,232, 3, 63,164, 17, 11, 63, 55, 72,248, 62, 91,232, 11, 63, 35,114,245, 62,
+233,196, 3, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,103, 59, 17, 63,120,195,255, 62,240, 81, 22, 63,
+114, 70, 1, 63,202, 47, 22, 63,156, 60, 8, 63,106,252, 12, 63,180,173, 3, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 11,221,226, 62, 90,125, 8, 63,106,128,226, 62,198,111, 1, 63,209,213,236, 62, 4,250,255, 62, 35,114,245, 62,
+233,196, 3, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,240, 81, 22, 63,114, 70, 1, 63,151,182, 25, 63,
+130, 9, 1, 63,244,120, 25, 63, 78,242, 7, 63,202, 47, 22, 63,156, 60, 8, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 0, 39,220, 62,252, 58, 8, 63,213,150,219, 62, 50, 55, 1, 63,106,128,226, 62,198,111, 1, 63, 11,221,226, 62,
+ 90,125, 8, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 96, 49, 30, 63,121,229,254, 62,126, 77, 30, 63,
+156, 88, 5, 63,244,120, 25, 63, 78,242, 7, 63,151,182, 25, 63,130, 9, 1, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 0, 39,220, 62,252, 58, 8, 63, 89, 65,210, 62, 56,158, 5, 63,176,116,210, 62,227, 62,255, 62,213,150,219, 62,
+ 50, 55, 1, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 25,113, 37, 63, 35,157,247, 62,123,207, 40, 63,
+218,175,254, 62,126, 77, 30, 63,156, 88, 5, 63, 96, 49, 30, 63,121,229,254, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 89, 65,210, 62, 56,158, 5, 63, 2,184,188, 62,140, 0,255, 62,189,165,195, 62,139,232,247, 62,176,116,210, 62,
+227, 62,255, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 92, 62, 39, 63,121, 75,240, 62,154,190, 43, 63,
+192, 0,249, 62,123,207, 40, 63,218,175,254, 62, 25,113, 37, 63, 35,157,247, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 2,184,188, 62,140, 0,255, 62,138,190,182, 62, 35, 49,249, 62,222, 10,192, 62,163,128,240, 62,189,165,195, 62,
+139,232,247, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,140,149, 38, 63, 38, 95,229, 62,177, 79, 43, 63,
+202,194,231, 62,154,190, 43, 63,192, 0,249, 62, 92, 62, 39, 63,121, 75,240, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,138,190,182, 62, 35, 49,249, 62, 60,201,183, 62, 82,218,231, 62,168,140,193, 62, 94,129,229, 62,222, 10,192, 62,
+163,128,240, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 14,120, 33, 63,166,238,214, 62, 24,163, 39, 63,
+174, 95,216, 62,177, 79, 43, 63,202,194,231, 62,140,149, 38, 63, 38, 95,229, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 60,201,183, 62, 82,218,231, 62, 98,194,191, 62, 42, 94,216, 62,168, 75,204, 62, 62, 7,215, 62,168,140,193, 62,
+ 94,129,229, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,165,178, 27, 63,128, 17,208, 62, 66, 21, 30, 63,
+178,139,200, 62, 24,163, 39, 63,174, 95,216, 62, 14,120, 33, 63,166,238,214, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 98,194,191, 62, 42, 94,216, 62,139,125,211, 62,170,171,200, 62, 6, 24,216, 62,128, 57,208, 62,168, 75,204, 62,
+ 62, 7,215, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 15, 97, 17, 63,220, 34,214, 62,158,237, 12, 63,
+ 38,241,187, 62, 66, 21, 30, 63,178,139,200, 62,165,178, 27, 63,128, 17,208, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,139,125,211, 62,170,171,200, 62, 15,175,245, 62,188, 14,188, 62,217,200,236, 62,134, 49,214, 62, 6, 24,216, 62,
+128, 57,208, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 15, 97, 17, 63,220, 34,214, 62,149,244, 14, 63,
+ 4, 42,221, 62,147,230, 3, 63, 78, 47,208, 62,158,237, 12, 63, 38,241,187, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,147,230, 3, 63, 78, 47,208, 62,141,144,241, 62,244, 52,221, 62,217,200,236, 62,134, 49,214, 62, 15,175,245, 62,
+188, 14,188, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,103, 59, 17, 63,120,195,255, 62,106,252, 12, 63,
+180,173, 3, 63,162,220, 3, 63, 45, 88, 0, 63, 71, 25, 13, 63,116,163,243, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,162,220, 3, 63, 45, 88, 0, 63, 35,114,245, 62,233,196, 3, 63,209,213,236, 62, 4,250,255, 62, 0, 45,245, 62,
+206,185,243, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 71, 25, 13, 63,116,163,243, 62,162,220, 3, 63,
+ 45, 88, 0, 63,215,220, 3, 63,148,189,231, 62, 64, 2, 13, 63, 52,215,230, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,215,220, 3, 63,148,189,231, 62,162,220, 3, 63, 45, 88, 0, 63, 0, 45,245, 62,206,185,243, 62,219,100,245, 62,
+184,230,230, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,147,230, 3, 63, 78, 47,208, 62,149,244, 14, 63,
+ 4, 42,221, 62, 64, 2, 13, 63, 52,215,230, 62,215,220, 3, 63,148,189,231, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,219,100,245, 62,184,230,230, 62,141,144,241, 62,244, 52,221, 62,147,230, 3, 63, 78, 47,208, 62,215,220, 3, 63,
+148,189,231, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,250, 61, 7, 63,148, 31, 54, 62,193,202, 3, 63,
+214,174, 49, 62,220,199, 3, 63, 89,219, 24, 62, 79,190, 13, 63,160,193, 46, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,220,199, 3, 63, 89,219, 24, 62,193,202, 3, 63,214,174, 49, 62,175, 87, 0, 63,251, 90, 54, 62, 14,150,243, 62,
+204, 79, 47, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 68,214, 9, 63,246,237, 66, 62,250, 61, 7, 63,
+148, 31, 54, 62, 79,190, 13, 63,160,193, 46, 62,250,104, 16, 63, 16,113, 55, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 14,150,243, 62,204, 79, 47, 62,175, 87, 0, 63,251, 90, 54, 62,104,137,251, 62,179, 92, 67, 62,200, 68,238, 62,
+ 76, 62, 56, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,237,221, 8, 63,218, 90, 91, 62, 68,214, 9, 63,
+246,237, 66, 62,250,104, 16, 63, 16,113, 55, 62,206,186, 16, 63, 85,129, 72, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,200, 68,238, 62, 76, 62, 56, 62,104,137,251, 62,179, 92, 67, 62, 39,153,253, 62, 27,195, 91, 62,192,187,237, 62,
+194,118, 73, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,206,243, 15, 63,182,207,136, 62, 77, 32, 8, 63,
+ 10, 39,139, 62, 22,117, 9, 63,146,203, 97, 62,222, 32, 16, 63, 34,106, 93, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,192,110,252, 62, 79, 68, 98, 62,219, 89,255, 62,116, 79,139, 62, 92,193,239, 62,113, 61,137, 62, 21, 19,239, 62,
+121,110, 94, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,237,221, 8, 63,218, 90, 91, 62,206,186, 16, 63,
+ 85,129, 72, 62,222, 32, 16, 63, 34,106, 93, 62, 22,117, 9, 63,146,203, 97, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 21, 19,239, 62,121,110, 94, 62,192,187,237, 62,194,118, 73, 62, 39,153,253, 62, 27,195, 91, 62,192,110,252, 62,
+ 79, 68, 98, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,119,125, 9, 63, 7,112,158, 62, 70,233, 3, 63,
+ 88, 27,154, 62,235,229, 3, 63, 97,108,139, 62, 77, 32, 8, 63, 10, 39,139, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,235,229, 3, 63, 97,108,139, 62, 70,233, 3, 63, 88, 27,154, 62,165,179,252, 62,163,140,158, 62,219, 89,255, 62,
+116, 79,139, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 22,117, 9, 63,146,203, 97, 62, 77, 32, 8, 63,
+ 10, 39,139, 62,235,229, 3, 63, 97,108,139, 62,246,215, 3, 63,143, 56,101, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,235,229, 3, 63, 97,108,139, 62,219, 89,255, 62,116, 79,139, 62,192,110,252, 62, 79, 68, 98, 62,246,215, 3, 63,
+143, 56,101, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,147,210, 3, 63,221, 95, 86, 62,237,221, 8, 63,
+218, 90, 91, 62, 22,117, 9, 63,146,203, 97, 62,246,215, 3, 63,143, 56,101, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,192,110,252, 62, 79, 68, 98, 62, 39,153,253, 62, 27,195, 91, 62,147,210, 3, 63,221, 95, 86, 62,246,215, 3, 63,
+143, 56,101, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 5, 54, 12, 63,188,183,167, 62,250, 61, 9, 63,
+252,214,168, 62,152,143, 8, 63, 45,107,163, 62,119,125, 9, 63, 7,112,158, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,100,136,254, 62, 38,123,163, 62,110, 39,253, 62,103,224,168, 62, 98, 68,247, 62,146,206,167, 62,165,179,252, 62,
+163,140,158, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,135,196, 10, 63, 52,208,178, 62, 25,233, 8, 63,
+116,110,175, 62,250, 61, 9, 63,252,214,168, 62, 5, 54, 12, 63,188,183,167, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,110, 39,253, 62,103,224,168, 62,102,195,253, 62,184,102,175, 62, 98, 14,250, 62,149,202,178, 62, 98, 68,247, 62,
+146,206,167, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 69, 17, 4, 63,105,176,182, 62, 69,138, 6, 63,
+ 80,180,177, 62, 25,233, 8, 63,116,110,175, 62,135,196, 10, 63, 52,208,178, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,102,195,253, 62,184,102,175, 62, 14, 49, 1, 63, 62,150,177, 62, 69, 17, 4, 63,105,176,182, 62, 98, 14,250, 62,
+149,202,178, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,209,124, 3, 63, 70, 0,177, 62, 11,232, 3, 63,
+140, 4,174, 62, 69,138, 6, 63, 80,180,177, 62, 69, 17, 4, 63,105,176,182, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 14, 49, 1, 63, 62,150,177, 62, 11,232, 3, 63,140, 4,174, 62,209,124, 3, 63, 70, 0,177, 62, 69, 17, 4, 63,
+105,176,182, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 70,233, 3, 63, 88, 27,154, 62,119,125, 9, 63,
+ 7,112,158, 62,152,143, 8, 63, 45,107,163, 62,212,232, 3, 63, 58,152,158, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,100,136,254, 62, 38,123,163, 62,165,179,252, 62,163,140,158, 62, 70,233, 3, 63, 88, 27,154, 62,212,232, 3, 63,
+ 58,152,158, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,212,232, 3, 63, 58,152,158, 62,152,143, 8, 63,
+ 45,107,163, 62,121, 91, 7, 63,134, 51,166, 62,205,231, 3, 63, 58,149,162, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 44,116, 0, 63,255, 56,166, 62,100,136,254, 62, 38,123,163, 62,212,232, 3, 63, 58,152,158, 62,205,231, 3, 63,
+ 58,149,162, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 11,232, 3, 63,140, 4,174, 62,214,233, 3, 63,
+198,154,170, 62,233,110, 6, 63, 94,152,174, 62, 69,138, 6, 63, 80,180,177, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,228, 82, 1, 63, 95,140,174, 62,214,233, 3, 63,198,154,170, 62, 11,232, 3, 63,140, 4,174, 62, 14, 49, 1, 63,
+ 62,150,177, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 69,138, 6, 63, 80,180,177, 62,233,110, 6, 63,
+ 94,152,174, 62, 59,236, 7, 63, 19,123,173, 62, 25,233, 8, 63,116,110,175, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,217,185,255, 62, 92,116,173, 62,228, 82, 1, 63, 95,140,174, 62, 14, 49, 1, 63, 62,150,177, 62,102,195,253, 62,
+184,102,175, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 25,233, 8, 63,116,110,175, 62, 59,236, 7, 63,
+ 19,123,173, 62, 85,249, 7, 63, 92, 52,169, 62,250, 61, 9, 63,252,214,168, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,160,169,255, 62, 6, 57,169, 62,217,185,255, 62, 92,116,173, 62,102,195,253, 62,184,102,175, 62,110, 39,253, 62,
+103,224,168, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,250, 61, 9, 63,252,214,168, 62, 85,249, 7, 63,
+ 92, 52,169, 62,121, 91, 7, 63,134, 51,166, 62,152,143, 8, 63, 45,107,163, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 44,116, 0, 63,255, 56,166, 62,160,169,255, 62, 6, 57,169, 62,110, 39,253, 62,103,224,168, 62,100,136,254, 62,
+ 38,123,163, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,214,233, 3, 63,198,154,170, 62, 85,249, 7, 63,
+ 92, 52,169, 62, 59,236, 7, 63, 19,123,173, 62,233,110, 6, 63, 94,152,174, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,217,185,255, 62, 92,116,173, 62,160,169,255, 62, 6, 57,169, 62,214,233, 3, 63,198,154,170, 62,228, 82, 1, 63,
+ 95,140,174, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,214,233, 3, 63,198,154,170, 62,205,231, 3, 63,
+ 58,149,162, 62,121, 91, 7, 63,134, 51,166, 62, 85,249, 7, 63, 92, 52,169, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 44,116, 0, 63,255, 56,166, 62,205,231, 3, 63, 58,149,162, 62,214,233, 3, 63,198,154,170, 62,160,169,255, 62,
+ 6, 57,169, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 69, 17, 4, 63,105,176,182, 62,135,196, 10, 63,
+ 52,208,178, 62,158,237, 12, 63, 38,241,187, 62,147,230, 3, 63, 78, 47,208, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 15,175,245, 62,188, 14,188, 62, 98, 14,250, 62,149,202,178, 62, 69, 17, 4, 63,105,176,182, 62,147,230, 3, 63,
+ 78, 47,208, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,135,196, 10, 63, 52,208,178, 62, 5, 54, 12, 63,
+188,183,167, 62,112, 0, 16, 63,254,246,164, 62,158,237, 12, 63, 38,241,187, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,207,187,239, 62, 19, 42,165, 62, 98, 68,247, 62,146,206,167, 62, 98, 14,250, 62,149,202,178, 62, 15,175,245, 62,
+188, 14,188, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 5, 54, 12, 63,188,183,167, 62,119,125, 9, 63,
+ 7,112,158, 62, 44,250, 15, 63,109, 0,154, 62,112, 0, 16, 63,254,246,164, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 56,205,239, 62, 8, 71,154, 62,165,179,252, 62,163,140,158, 62, 98, 68,247, 62,146,206,167, 62,207,187,239, 62,
+ 19, 42,165, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,119,125, 9, 63, 7,112,158, 62, 77, 32, 8, 63,
+ 10, 39,139, 62,206,243, 15, 63,182,207,136, 62, 44,250, 15, 63,109, 0,154, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 92,193,239, 62,113, 61,137, 62,219, 89,255, 62,116, 79,139, 62,165,179,252, 62,163,140,158, 62, 56,205,239, 62,
+ 8, 71,154, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 20, 81, 25, 63, 17, 56,132, 62,208, 46, 27, 63,
+149, 35,148, 62, 44,250, 15, 63,109, 0,154, 62,206,243, 15, 63,182,207,136, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 56,205,239, 62, 8, 71,154, 62,238,166,217, 62,229,221,148, 62, 54, 42,221, 62,209, 25,133, 62, 92,193,239, 62,
+113, 61,137, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,208, 46, 27, 63,149, 35,148, 62, 36,177, 27, 63,
+158,151,156, 62,112, 0, 16, 63,254,246,164, 62, 44,250, 15, 63,109, 0,154, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,207,187,239, 62, 19, 42,165, 62, 0,160,216, 62,127, 44,157, 62,238,166,217, 62,229,221,148, 62, 56,205,239, 62,
+ 8, 71,154, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,111,239, 27, 63,159, 77,166, 62,158,237, 12, 63,
+ 38,241,187, 62,112, 0, 16, 63,254,246,164, 62, 36,177, 27, 63,158,151,156, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,207,187,239, 62, 19, 42,165, 62, 15,175,245, 62,188, 14,188, 62,115, 21,216, 62, 14,177,166, 62, 0,160,216, 62,
+127, 44,157, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,237,221, 8, 63,218, 90, 91, 62,147,210, 3, 63,
+221, 95, 86, 62,129,211, 3, 63,248,168, 83, 62,170, 33, 8, 63,254,149, 86, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,129,211, 3, 63,248,168, 83, 62,147,210, 3, 63,221, 95, 86, 62, 39,153,253, 62, 27,195, 91, 62, 8, 14,255, 62,
+ 58,232, 86, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 68,214, 9, 63,246,237, 66, 62,237,221, 8, 63,
+218, 90, 91, 62,170, 33, 8, 63,254,149, 86, 62, 20,180, 8, 63, 94, 29, 69, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 8, 14,255, 62, 58,232, 86, 62, 39,153,253, 62, 27,195, 91, 62,104,137,251, 62,179, 92, 67, 62, 19,210,253, 62,
+ 55,114, 69, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,250, 61, 7, 63,148, 31, 54, 62, 68,214, 9, 63,
+246,237, 66, 62, 20,180, 8, 63, 94, 29, 69, 62,168, 82, 6, 63, 80, 43, 57, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 19,210,253, 62, 55,114, 69, 62,104,137,251, 62,179, 92, 67, 62,175, 87, 0, 63,251, 90, 54, 62, 48, 68, 1, 63,
+166, 84, 57, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,193,202, 3, 63,214,174, 49, 62,250, 61, 7, 63,
+148, 31, 54, 62,168, 82, 6, 63, 80, 43, 57, 62,205,202, 3, 63, 8, 22, 54, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 48, 68, 1, 63,166, 84, 57, 62,175, 87, 0, 63,251, 90, 54, 62,193,202, 3, 63,214,174, 49, 62,205,202, 3, 63,
+ 8, 22, 54, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,205,202, 3, 63, 8, 22, 54, 62,168, 82, 6, 63,
+ 80, 43, 57, 62,246, 24, 5, 63, 26,150, 66, 62,213,205, 3, 63,220,232, 64, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 29,131, 2, 63, 22,172, 66, 62, 48, 68, 1, 63,166, 84, 57, 62,205,202, 3, 63, 8, 22, 54, 62,213,205, 3, 63,
+220,232, 64, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,168, 82, 6, 63, 80, 43, 57, 62, 20,180, 8, 63,
+ 94, 29, 69, 62, 39, 83, 6, 63,191,114, 70, 62,246, 24, 5, 63, 26,150, 66, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,185, 75, 1, 63,222,160, 70, 62, 19,210,253, 62, 55,114, 69, 62, 48, 68, 1, 63,166, 84, 57, 62, 29,131, 2, 63,
+ 22,172, 66, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 20,180, 8, 63, 94, 29, 69, 62,170, 33, 8, 63,
+254,149, 86, 62, 4,111, 6, 63, 40,172, 76, 62, 39, 83, 6, 63,191,114, 70, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,157, 51, 1, 63,158,218, 76, 62, 8, 14,255, 62, 58,232, 86, 62, 19,210,253, 62, 55,114, 69, 62,185, 75, 1, 63,
+222,160, 70, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,170, 33, 8, 63,254,149, 86, 62,129,211, 3, 63,
+248,168, 83, 62,234,208, 3, 63,146, 43, 75, 62, 4,111, 6, 63, 40,172, 76, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,234,208, 3, 63,146, 43, 75, 62,129,211, 3, 63,248,168, 83, 62, 8, 14,255, 62, 58,232, 86, 62,157, 51, 1, 63,
+158,218, 76, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,234,208, 3, 63,146, 43, 75, 62,213,205, 3, 63,
+220,232, 64, 62,246, 24, 5, 63, 26,150, 66, 62, 4,111, 6, 63, 40,172, 76, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 29,131, 2, 63, 22,172, 66, 62,213,205, 3, 63,220,232, 64, 62,234,208, 3, 63,146, 43, 75, 62,157, 51, 1, 63,
+158,218, 76, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 4,111, 6, 63, 40,172, 76, 62,246, 24, 5, 63,
+ 26,150, 66, 62, 39, 83, 6, 63,191,114, 70, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,185, 75, 1, 63,222,160, 70, 62, 29,131, 2, 63, 22,172, 66, 62,157, 51, 1, 63,158,218, 76, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 64, 2, 13, 63, 52,215,230, 62,149,244, 14, 63,
+ 4, 42,221, 62, 4,216, 16, 63,160, 24,224, 62,120,200, 15, 63, 84,255,231, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,119,193,237, 62,190, 38,224, 62,141,144,241, 62,244, 52,221, 62,219,100,245, 62,184,230,230, 62, 21,211,239, 62,
+185, 18,232, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 71, 25, 13, 63,116,163,243, 62, 64, 2, 13, 63,
+ 52,215,230, 62,120,200, 15, 63, 84,255,231, 62,184,171, 16, 63, 40,133,241, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 21,211,239, 62,185, 18,232, 62,219,100,245, 62,184,230,230, 62, 0, 45,245, 62,206,185,243, 62,218,252,237, 62,
+ 62,160,241, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,103, 59, 17, 63,120,195,255, 62, 71, 25, 13, 63,
+116,163,243, 62,184,171, 16, 63, 40,133,241, 62, 55, 44, 19, 63, 86, 21,250, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,218,252,237, 62, 62,160,241, 62, 0, 45,245, 62,206,185,243, 62,209,213,236, 62, 4,250,255, 62,153,228,232, 62,
+154, 67,250, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,149,244, 14, 63, 4, 42,221, 62, 15, 97, 17, 63,
+220, 34,214, 62,217, 53, 19, 63, 16,211,218, 62, 4,216, 16, 63,160, 24,224, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 8, 14,233, 62, 66,226,218, 62,217,200,236, 62,134, 49,214, 62,141,144,241, 62,244, 52,221, 62,119,193,237, 62,
+190, 38,224, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 15, 97, 17, 63,220, 34,214, 62,165,178, 27, 63,
+128, 17,208, 62,205,198, 26, 63,124,184,214, 62,217, 53, 19, 63, 16,211,218, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,216,214,217, 62,218,224,214, 62, 6, 24,216, 62,128, 57,208, 62,217,200,236, 62,134, 49,214, 62, 8, 14,233, 62,
+ 66,226,218, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,165,178, 27, 63,128, 17,208, 62, 14,120, 33, 63,
+166,238,214, 62,156,136, 31, 63,194,138,219, 62,205,198, 26, 63,124,184,214, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,254, 30,208, 62,204,177,219, 62,168, 75,204, 62, 62, 7,215, 62, 6, 24,216, 62,128, 57,208, 62,216,214,217, 62,
+218,224,214, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 14,120, 33, 63,166,238,214, 62,140,149, 38, 63,
+ 38, 95,229, 62, 79, 9, 36, 63, 94,224,229, 62,156,136, 31, 63,194,138,219, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,148,192,198, 62,182, 11,230, 62,168,140,193, 62, 94,129,229, 62,168, 75,204, 62, 62, 7,215, 62,254, 30,208, 62,
+204,177,219, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,140,149, 38, 63, 38, 95,229, 62, 92, 62, 39, 63,
+121, 75,240, 62, 14, 49, 36, 63,253, 88,239, 62, 79, 9, 36, 63, 94,224,229, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 97, 71,198, 62,192,149,239, 62,222, 10,192, 62,163,128,240, 62,168,140,193, 62, 94,129,229, 62,148,192,198, 62,
+182, 11,230, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 92, 62, 39, 63,121, 75,240, 62, 25,113, 37, 63,
+ 35,157,247, 62,243, 33, 35, 63, 80,143,245, 62, 14, 49, 36, 63,253, 88,239, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 87, 99,200, 62,172,217,245, 62,189,165,195, 62,139,232,247, 62,222, 10,192, 62,163,128,240, 62, 97, 71,198, 62,
+192,149,239, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 25,113, 37, 63, 35,157,247, 62, 96, 49, 30, 63,
+121,229,254, 62,223, 49, 29, 63,199,140,250, 62,243, 33, 35, 63, 80,143,245, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,147,124,212, 62,146,215,250, 62,176,116,210, 62,227, 62,255, 62,189,165,195, 62,139,232,247, 62, 87, 99,200, 62,
+172,217,245, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 96, 49, 30, 63,121,229,254, 62,151,182, 25, 63,
+130, 9, 1, 63, 50,181, 25, 63,118,111,253, 62,223, 49, 29, 63,199,140,250, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 52,151,219, 62, 68,186,253, 62,213,150,219, 62, 50, 55, 1, 63,176,116,210, 62,227, 62,255, 62,147,124,212, 62,
+146,215,250, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,151,182, 25, 63,130, 9, 1, 63,240, 81, 22, 63,
+114, 70, 1, 63,241,188, 22, 63, 28,149,253, 62, 50,181, 25, 63,118,111,253, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,212,163,225, 62, 91,215,253, 62,106,128,226, 62,198,111, 1, 63,213,150,219, 62, 50, 55, 1, 63, 52,151,219, 62,
+ 68,186,253, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,240, 81, 22, 63,114, 70, 1, 63,103, 59, 17, 63,
+120,195,255, 62, 55, 44, 19, 63, 86, 21,250, 62,241,188, 22, 63, 28,149,253, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,153,228,232, 62,154, 67,250, 62,209,213,236, 62, 4,250,255, 62,106,128,226, 62,198,111, 1, 63,212,163,225, 62,
+ 91,215,253, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,241,188, 22, 63, 28,149,253, 62, 55, 44, 19, 63,
+ 86, 21,250, 62, 9,165, 20, 63,248, 99,247, 62, 20, 0, 23, 63, 6, 57,251, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,232,232,229, 62, 74,142,247, 62,153,228,232, 62,154, 67,250, 62,212,163,225, 62, 91,215,253, 62,145, 26,225, 62,
+114,116,251, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 50,181, 25, 63,118,111,253, 62,241,188, 22, 63,
+ 28,149,253, 62, 20, 0, 23, 63, 6, 57,251, 62,130,144, 25, 63,128, 7,251, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,145, 26,225, 62,114,116,251, 62,212,163,225, 62, 91,215,253, 62, 52,151,219, 62, 68,186,253, 62,177,225,219, 62,
+ 67, 75,251, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,223, 49, 29, 63,199,140,250, 62, 50,181, 25, 63,
+118,111,253, 62,130,144, 25, 63,128, 7,251, 62, 80,195, 28, 63, 55,166,248, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,177,225,219, 62, 67, 75,251, 62, 52,151,219, 62, 68,186,253, 62,147,124,212, 62,146,215,250, 62,233, 95,213, 62,
+ 20,237,248, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,243, 33, 35, 63, 80,143,245, 62,223, 49, 29, 63,
+199,140,250, 62, 80,195, 28, 63, 55,166,248, 62, 22,164, 33, 63,102, 75,243, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,233, 95,213, 62, 20,237,248, 62,147,124,212, 62,146,215,250, 62, 87, 99,200, 62,172,217,245, 62, 65,114,203, 62,
+159,143,243, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 14, 49, 36, 63,253, 88,239, 62,243, 33, 35, 63,
+ 80,143,245, 62, 22,164, 33, 63,102, 75,243, 62, 30,160, 34, 63,169, 47,238, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 65,114,203, 62,159,143,243, 62, 87, 99,200, 62,172,217,245, 62, 97, 71,198, 62,192,149,239, 62,188,128,201, 62,
+126,110,238, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 79, 9, 36, 63, 94,224,229, 62, 14, 49, 36, 63,
+253, 88,239, 62, 30,160, 34, 63,169, 47,238, 62,131,144, 34, 63,253, 87,231, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,188,128,201, 62,126,110,238, 62, 97, 71,198, 62,192,149,239, 62,148,192,198, 62,182, 11,230, 62,141,190,201, 62,
+124,140,231, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,156,136, 31, 63,194,138,219, 62, 79, 9, 36, 63,
+ 94,224,229, 62,131,144, 34, 63,253, 87,231, 62, 21,208, 30, 63,174,182,221, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,141,190,201, 62,124,140,231, 62,148,192,198, 62,182, 11,230, 62,254, 30,208, 62,204,177,219, 62,168,133,209, 62,
+ 51,221,221, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,205,198, 26, 63,124,184,214, 62,156,136, 31, 63,
+194,138,219, 62, 21,208, 30, 63,174,182,221, 62,128,218, 26, 63, 68,206,217, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,168,133,209, 62, 51,221,221, 62,254, 30,208, 62,204,177,219, 62,216,214,217, 62,218,224,214, 62, 11,157,217, 62,
+ 64,243,217, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,217, 53, 19, 63, 16,211,218, 62,205,198, 26, 63,
+124,184,214, 62,128,218, 26, 63, 68,206,217, 62,103, 53, 20, 63,236, 84,221, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 11,157,217, 62, 64,243,217, 62,216,214,217, 62,218,224,214, 62, 8, 14,233, 62, 66,226,218, 62, 68, 5,231, 62,
+234,101,221, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 4,216, 16, 63,160, 24,224, 62,217, 53, 19, 63,
+ 16,211,218, 62,103, 53, 20, 63,236, 84,221, 62, 81, 87, 18, 63, 33,175,226, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 68, 5,231, 62,234,101,221, 62, 8, 14,233, 62, 66,226,218, 62,119,193,237, 62,190, 38,224, 62,180,187,234, 62,
+249,190,226, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 55, 44, 19, 63, 86, 21,250, 62,184,171, 16, 63,
+ 40,133,241, 62, 98, 68, 18, 63,150,197,240, 62, 9,165, 20, 63,248, 99,247, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 35,197,234, 62,215,226,240, 62,218,252,237, 62, 62,160,241, 62,153,228,232, 62,154, 67,250, 62,232,232,229, 62,
+ 74,142,247, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,184,171, 16, 63, 40,133,241, 62,120,200, 15, 63,
+ 84,255,231, 62,161, 4, 18, 63,138,184,232, 62, 98, 68, 18, 63,150,197,240, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,154, 85,235, 62, 92,206,232, 62, 21,211,239, 62,185, 18,232, 62,218,252,237, 62, 62,160,241, 62, 35,197,234, 62,
+215,226,240, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,120,200, 15, 63, 84,255,231, 62, 4,216, 16, 63,
+160, 24,224, 62, 81, 87, 18, 63, 33,175,226, 62,161, 4, 18, 63,138,184,232, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,180,187,234, 62,249,190,226, 62,119,193,237, 62,190, 38,224, 62, 21,211,239, 62,185, 18,232, 62,154, 85,235, 62,
+ 92,206,232, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,148,232, 3, 63,164, 17, 11, 63, 67,169, 11, 63,
+ 18,197, 11, 63,216,120, 13, 63,160, 81, 23, 63,147, 15, 4, 63,227,248, 23, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 64, 27,245, 62,100,166, 23, 63, 55, 72,248, 62, 91,232, 11, 63,148,232, 3, 63,164, 17, 11, 63,147, 15, 4, 63,
+227,248, 23, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 67,169, 11, 63, 18,197, 11, 63,173,244, 22, 63,
+236,215, 11, 63, 94,233, 23, 63,186, 60, 16, 63,216,120, 13, 63,160, 81, 23, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,109,130,223, 62,118,165, 16, 63,220, 89,225, 62, 77, 42, 12, 63, 55, 72,248, 62, 91,232, 11, 63, 64, 27,245, 62,
+100,166, 23, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,173,244, 22, 63,236,215, 11, 63, 28,105, 26, 63,
+242,194, 11, 63,220, 56, 28, 63, 66,250, 14, 63, 94,233, 23, 63,186, 60, 16, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,157,161,214, 62,219,110, 15, 63,220, 73,218, 62,169, 31, 12, 63,220, 89,225, 62, 77, 42, 12, 63,109,130,223, 62,
+118,165, 16, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 28,105, 26, 63,242,194, 11, 63,220,158, 34, 63,
+175, 23, 10, 63,109, 44, 39, 63,107,221, 19, 63,220, 56, 28, 63, 66,250, 14, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,156, 26,192, 62, 31,139, 20, 63,124,109,201, 62, 72,121, 10, 63,220, 73,218, 62,169, 31, 12, 63,157,161,214, 62,
+219,110, 15, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,220,158, 34, 63,175, 23, 10, 63,238, 88, 46, 63,
+146,223, 2, 63,242, 80, 56, 63, 44,244, 6, 63,109, 44, 39, 63,107,221, 19, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 64, 0, 61,208,156, 62,204, 16, 7, 63,173, 87,177, 62,102, 9, 3, 63,124,109,201, 62, 72,121, 10, 63,156, 26,192, 62,
+ 31,139, 20, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 16, 0,238, 88, 46, 63,146,223, 2, 63, 62,134, 48, 63,
+ 37,107,249, 62,195,173, 54, 63,239,106,252, 62,242, 80, 56, 63, 44,244, 6, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,128, 0,202, 36,160, 62, 94, 51,252, 62,172,229,172, 62,116,127,249, 62,173, 87,177, 62,102, 9, 3, 63, 61,208,156, 62,
+204, 16, 7, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,128, 0, 62,134, 48, 63, 37,107,249, 62, 38,229, 50, 63,
+169, 32,226, 62,154, 88, 53, 63,240,146,221, 62,195,173, 54, 63,239,106,252, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 64, 0,128,172,162, 62, 17,169,221, 62,196, 39,168, 62,206, 11,226, 62,172,229,172, 62,116,127,249, 62,202, 36,160, 62,
+ 94, 51,252, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 16, 0, 38,229, 50, 63,169, 32,226, 62, 87, 57, 43, 63,
+222, 58,206, 62,240,117, 49, 63,164,138,198, 62,154, 88, 53, 63,240,146,221, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,128, 0,147,137,172, 62,148, 19,198, 62,130,207,184, 62, 42, 27,206, 62,196, 39,168, 62,206, 11,226, 62,128,172,162, 62,
+ 17,169,221, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,128, 0, 87, 57, 43, 63,222, 58,206, 62, 91, 94, 37, 63,
+107,120,187, 62,156,160, 41, 63, 56,175,182, 62,240,117, 49, 63,164,138,198, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,202,212,188, 62,245,163,182, 62,156, 28,197, 62,166,130,187, 62,130,207,184, 62, 42, 27,206, 62,147,137,172, 62,
+148, 19,198, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,165,252, 48, 63,133, 33, 85, 62,112, 54, 48, 63,
+ 20, 19, 96, 62,172, 36, 46, 63,208, 7,129, 62,240, 17, 42, 63,129, 84, 97, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 76, 71,181, 62,204,200,131, 62,117,121,175, 62,183,185,106, 62,217, 24,172, 62, 21,237, 92, 62,138, 81,187, 62,
+ 59, 40,103, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,204, 89, 48, 63,134,194, 4, 62,165,252, 48, 63,
+133, 33, 85, 62,240, 17, 42, 63,129, 84, 97, 62,160,125, 37, 63, 50,211, 46, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 16, 0,138, 81,187, 62, 59, 40,103, 62,217, 24,172, 62, 21,237, 92, 62, 94,197,172, 62,109,200, 4, 62, 25,121,195, 62,
+ 46,253, 48, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 64, 0, 11, 44, 20, 63, 20, 26,163, 61,204, 89, 48, 63,
+134,194, 4, 62,160,125, 37, 63, 50,211, 46, 62, 40, 92, 24, 63,214,184, 21, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 32, 0, 25,121,195, 62, 46,253, 48, 62, 94,197,172, 62,109,200, 4, 62,140,122,230, 62,202,248,161, 61,216, 13,222, 62,
+222,116, 22, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 32, 0,174,254, 16, 63, 94, 45, 34, 62,219,199, 3, 63,
+ 18, 28,229, 61, 11, 44, 20, 63, 20, 26,163, 61, 40, 92, 24, 63,214,184, 21, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 16, 0,140,122,230, 62,202,248,161, 61,219,199, 3, 63, 18, 28,229, 61,140,248,236, 62,182,202, 34, 62,216, 13,222, 62,
+222,116, 22, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 64, 0,184,152, 21, 63,182, 47, 53, 62,174,254, 16, 63,
+ 94, 45, 34, 62, 40, 92, 24, 63,214,184, 21, 62,209, 52, 25, 63, 76,140, 51, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 32, 0,216, 13,222, 62,222,116, 22, 62,140,248,236, 62,182,202, 34, 62,183,207,227, 62,250, 75, 54, 62,229,137,220, 62,
+185,228, 52, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 32, 0,137, 57, 22, 63, 81, 93, 61, 62,184,152, 21, 63,
+182, 47, 53, 62,209, 52, 25, 63, 76,140, 51, 62,193,166, 30, 63,114,168, 73, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,229,137,220, 62,185,228, 52, 62,183,207,227, 62,250, 75, 54, 62,122,152,226, 62,190,166, 62, 62, 54,198,209, 62,
+ 18,240, 75, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,250,249, 22, 63,160,251, 88, 62,137, 57, 22, 63,
+ 81, 93, 61, 62,193,166, 30, 63,114,168, 73, 62, 75, 0, 36, 63,229, 47,116, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 54,198,209, 62, 18,240, 75, 62,122,152,226, 62,190,166, 62, 62, 90, 83,225, 62, 21,153, 90, 62,211,231,199, 62,
+216,237,119, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,193,166, 30, 63,114,168, 73, 62,160,125, 37, 63,
+ 50,211, 46, 62,240, 17, 42, 63,129, 84, 97, 62, 75, 0, 36, 63,229, 47,116, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,138, 81,187, 62, 59, 40,103, 62, 25,121,195, 62, 46,253, 48, 62, 54,198,209, 62, 18,240, 75, 62,211,231,199, 62,
+216,237,119, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,193,166, 30, 63,114,168, 73, 62,209, 52, 25, 63,
+ 76,140, 51, 62, 40, 92, 24, 63,214,184, 21, 62,160,125, 37, 63, 50,211, 46, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,216, 13,222, 62,222,116, 22, 62,229,137,220, 62,185,228, 52, 62, 54,198,209, 62, 18,240, 75, 62, 25,121,195, 62,
+ 46,253, 48, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 37,163, 36, 63,191,168,140, 62, 75, 0, 36, 63,
+229, 47,116, 62,240, 17, 42, 63,129, 84, 97, 62,172, 36, 46, 63,208, 7,129, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,138, 81,187, 62, 59, 40,103, 62,211,231,199, 62,216,237,119, 62, 6, 64,199, 62,105, 6,142, 62, 76, 71,181, 62,
+204,200,131, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 20, 81, 25, 63, 17, 56,132, 62,250,249, 22, 63,
+160,251, 88, 62, 75, 0, 36, 63,229, 47,116, 62, 37,163, 36, 63,191,168,140, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,211,231,199, 62,216,237,119, 62, 90, 83,225, 62, 21,153, 90, 62, 54, 42,221, 62,209, 25,133, 62, 6, 64,199, 62,
+105, 6,142, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,208, 46, 27, 63,149, 35,148, 62, 91, 60, 36, 63,
+221,222,150, 62,222,170, 33, 63, 74,126,158, 62, 36,177, 27, 63,158,151,156, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 72,234,204, 62, 56, 63,159, 62,150,245,199, 62, 85, 15,152, 62,238,166,217, 62,229,221,148, 62, 0,160,216, 62,
+127, 44,157, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 20, 81, 25, 63, 17, 56,132, 62, 37,163, 36, 63,
+191,168,140, 62, 91, 60, 36, 63,221,222,150, 62,208, 46, 27, 63,149, 35,148, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,150,245,199, 62, 85, 15,152, 62, 6, 64,199, 62,105, 6,142, 62, 54, 42,221, 62,209, 25,133, 62,238,166,217, 62,
+229,221,148, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,111,239, 27, 63,159, 77,166, 62, 36,177, 27, 63,
+158,151,156, 62,222,170, 33, 63, 74,126,158, 62,102,212, 31, 63,144,192,164, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 72,234,204, 62, 56, 63,159, 62, 0,160,216, 62,127, 44,157, 62,115, 21,216, 62, 14,177,166, 62, 17,119,208, 62,
+201, 65,165, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,111,239, 27, 63,159, 77,166, 62,102,212, 31, 63,
+144,192,164, 62,156,160, 41, 63, 56,175,182, 62, 91, 94, 37, 63,107,120,187, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,202,212,188, 62,245,163,182, 62, 17,119,208, 62,201, 65,165, 62,115, 21,216, 62, 14,177,166, 62,156, 28,197, 62,
+166,130,187, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,104,119,194, 62,164,189, 82, 63, 23, 73,212, 62,
+152,239, 90, 63,100,192,205, 62, 46,238, 97, 63, 38, 56,185, 62, 72,154, 91, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,228, 94,141, 62, 86,234,100, 63, 84, 66,150, 62,114,154, 94, 63,230, 86,173, 62, 79, 66, 98, 63, 20,143,162, 62,
+ 44,173,106, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,240, 0, 72,122, 87, 63,216, 8, 62, 62,202,106, 84, 63,
+137,185,113, 62,226, 77, 72, 63,204, 21,121, 62,158,225, 71, 63,113, 34, 68, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 16, 0,132, 32,137, 62,181, 65,121, 62,168,179,107, 62,139,127,103, 62,210,147,114, 62,212,116, 61, 62,248,125,142, 62,
+ 30, 4, 80, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 64, 0,158,225, 71, 63,113, 34, 68, 62,226, 77, 72, 63,
+204, 21,121, 62, 8, 7, 51, 63, 5,186,130, 62, 3,166, 49, 63,232, 57, 96, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 18,197,172, 62, 41,112,133, 62,132, 32,137, 62,181, 65,121, 62,248,125,142, 62, 30, 4, 80, 62,121,228,174, 62,
+ 52, 79,109, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 3,166, 49, 63,232, 57, 96, 62, 8, 7, 51, 63,
+ 5,186,130, 62,172, 36, 46, 63,208, 7,129, 62,112, 54, 48, 63, 20, 19, 96, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 76, 71,181, 62,204,200,131, 62, 18,197,172, 62, 41,112,133, 62,121,228,174, 62, 52, 79,109, 62,117,121,175, 62,
+183,185,106, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 37,163, 36, 63,191,168,140, 62,172, 36, 46, 63,
+208, 7,129, 62, 8, 7, 51, 63, 5,186,130, 62, 91, 60, 36, 63,221,222,150, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 18,197,172, 62, 41,112,133, 62, 76, 71,181, 62,204,200,131, 62, 6, 64,199, 62,105, 6,142, 62,150,245,199, 62,
+ 85, 15,152, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,154, 88, 53, 63,240,146,221, 62,240,117, 49, 63,
+164,138,198, 62,224, 19, 69, 63, 24, 68,190, 62, 53, 64, 74, 63,171, 31,224, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 16, 0,250, 78,134, 62,148,213,186, 62,147,137,172, 62,148, 19,198, 62,128,172,162, 62, 17,169,221, 62,184,112,114, 62,
+248,169,220, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 64, 0, 54, 74,214, 62, 20, 55, 70, 63, 48,130,233, 62,
+188, 69, 83, 63, 23, 73,212, 62,152,239, 90, 63,104,119,194, 62,164,189, 82, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 84, 66,150, 62,114,154, 94, 63, 66, 1,153, 62,245,149, 81, 63, 38, 56,185, 62,102,110, 83, 63,230, 86,173, 62,
+ 79, 66, 98, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,240, 0,106,242, 66, 63,202, 94, 25, 63,190,100, 70, 63,
+222,234, 15, 63, 90,189, 77, 63,233, 88, 17, 63, 8,206, 74, 63, 88,118, 27, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 22, 32, 96, 62, 66, 60, 16, 63, 86, 87,125, 62,174, 5, 15, 63, 78,187,132, 62,180, 44, 24, 63, 26, 79,108, 62,
+124, 1, 26, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 8,206, 74, 63, 88,118, 27, 63, 90,189, 77, 63,
+233, 88, 17, 63, 72,139, 85, 63,103, 51, 19, 63,220,119, 85, 63, 77, 71, 31, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 64,199, 64, 62, 26, 40, 18, 63, 22, 32, 96, 62, 66, 60, 16, 63, 26, 79,108, 62,124, 1, 26, 63, 44,191, 67, 62,
+ 90, 89, 30, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,220,119, 85, 63, 77, 71, 31, 63, 72,139, 85, 63,
+103, 51, 19, 63,228,213,100, 63, 72,156, 20, 63, 18, 82, 96, 63,128,133, 34, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,128, 0,226, 50, 1, 62,184, 68, 20, 63, 64,199, 64, 62, 26, 40, 18, 63, 44,191, 67, 62, 90, 89, 30, 63,194,204, 24, 62,
+ 32,186, 34, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,128, 0,242, 80, 56, 63, 44,244, 6, 63,195,173, 54, 63,
+239,106,252, 62,115,205, 60, 63,213,150,253, 62,166, 14, 64, 63, 81, 80, 4, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 16, 0,190, 85,147, 62, 91,176,252, 62,202, 36,160, 62, 94, 51,252, 62, 61,208,156, 62,204, 16, 7, 63,160,121,140, 62,
+ 74,197, 3, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 64, 0,166, 14, 64, 63, 81, 80, 4, 63,115,205, 60, 63,
+213,150,253, 62, 68,103, 73, 63,233,248, 0, 63,248, 12, 75, 63, 64,206, 8, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,144, 59,115, 62,102,143,255, 62,190, 85,147, 62, 91,176,252, 62,160,121,140, 62, 74,197, 3, 63, 78,135,107, 62,
+ 88,182, 7, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,248, 12, 75, 63, 64,206, 8, 63, 68,103, 73, 63,
+233,248, 0, 63,239,151, 82, 63, 86,223, 3, 63,181,227, 82, 63,189,102, 11, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 82, 17, 77, 62,162, 98, 2, 63,144, 59,115, 62,102,143,255, 62, 78,135,107, 62, 88,182, 7, 63,202, 98, 75, 62,
+108, 43, 10, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,181,227, 82, 63,189,102, 11, 63,239,151, 82, 63,
+ 86,223, 3, 63, 92,224, 91, 63,239,144, 5, 63,161,148, 90, 63,146, 95, 13, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,178, 40, 38, 62, 14,230, 3, 63, 82, 17, 77, 62,162, 98, 2, 63,202, 98, 75, 62,108, 43, 10, 63, 10,162, 43, 62,
+ 8, 50, 12, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,120, 89,103, 63,105, 76, 2, 63,170,179,103, 63,
+142,105, 12, 63,161,148, 90, 63,146, 95, 13, 63, 92,224, 91, 63,239,144, 5, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 10,162, 43, 62, 8, 50, 12, 63,168, 41,231, 61,158, 83, 11, 63,116,128,234, 61,200, 39, 0, 63,178, 40, 38, 62,
+ 14,230, 3, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,228,213,100, 63, 72,156, 20, 63, 72,139, 85, 63,
+103, 51, 19, 63,161,148, 90, 63,146, 95, 13, 63,170,179,103, 63,142,105, 12, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 10,162, 43, 62, 8, 50, 12, 63, 64,199, 64, 62, 26, 40, 18, 63,226, 50, 1, 62,184, 68, 20, 63,168, 41,231, 61,
+158, 83, 11, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 72,139, 85, 63,103, 51, 19, 63, 90,189, 77, 63,
+233, 88, 17, 63,181,227, 82, 63,189,102, 11, 63,161,148, 90, 63,146, 95, 13, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,202, 98, 75, 62,108, 43, 10, 63, 22, 32, 96, 62, 66, 60, 16, 63, 64,199, 64, 62, 26, 40, 18, 63, 10,162, 43, 62,
+ 8, 50, 12, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 90,189, 77, 63,233, 88, 17, 63,190,100, 70, 63,
+222,234, 15, 63,248, 12, 75, 63, 64,206, 8, 63,181,227, 82, 63,189,102, 11, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 78,135,107, 62, 88,182, 7, 63, 86, 87,125, 62,174, 5, 15, 63, 22, 32, 96, 62, 66, 60, 16, 63,202, 98, 75, 62,
+108, 43, 10, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,190,100, 70, 63,222,234, 15, 63, 82,235, 60, 63,
+ 27, 12, 12, 63,166, 14, 64, 63, 81, 80, 4, 63,248, 12, 75, 63, 64,206, 8, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,160,121,140, 62, 74,197, 3, 63, 78,230,145, 62,148,225, 11, 63, 86, 87,125, 62,174, 5, 15, 63, 78,135,107, 62,
+ 88,182, 7, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 31,118, 57, 63,230, 79, 12, 63,242, 80, 56, 63,
+ 44,244, 6, 63,166, 14, 64, 63, 81, 80, 4, 63, 82,235, 60, 63, 27, 12, 12, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 32, 0,160,121,140, 62, 74,197, 3, 63, 61,208,156, 62,204, 16, 7, 63, 0,199,152, 62, 13,133, 12, 63, 78,230,145, 62,
+148,225, 11, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 32, 0,195,240, 57, 63, 10,138, 23, 63, 82,235, 60, 63,
+ 27, 12, 12, 63,190,100, 70, 63,222,234, 15, 63,106,242, 66, 63,202, 94, 25, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 86, 87,125, 62,174, 5, 15, 63, 78,230,145, 62,148,225, 11, 63,247, 7,150, 62, 96, 12, 23, 63, 78,187,132, 62,
+180, 44, 24, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,216,120, 13, 63,160, 81, 23, 63, 94,233, 23, 63,
+186, 60, 16, 63,220, 56, 28, 63, 66,250, 14, 63,109, 44, 39, 63,107,221, 19, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,157,161,214, 62,219,110, 15, 63,109,130,223, 62,118,165, 16, 63, 64, 27,245, 62,100,166, 23, 63,156, 26,192, 62,
+ 31,139, 20, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,176, 29, 56, 63, 88,206, 20, 63, 31,118, 57, 63,
+230, 79, 12, 63, 82,235, 60, 63, 27, 12, 12, 63,195,240, 57, 63, 10,138, 23, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 78,230,145, 62,148,225, 11, 63, 0,199,152, 62, 13,133, 12, 63,239,211,153, 62,220,159, 20, 63,247, 7,150, 62,
+ 96, 12, 23, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 48,148, 54, 63,220,206, 22, 63,176, 29, 56, 63,
+ 88,206, 20, 63,195,240, 57, 63, 10,138, 23, 63, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,247, 7,150, 62, 96, 12, 23, 63,239,211,153, 62,220,159, 20, 63,108,106,156, 62,146,154, 22, 63, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,195,173, 54, 63,239,106,252, 62,154, 88, 53, 63,
+240,146,221, 62, 53, 64, 74, 63,171, 31,224, 62,115,205, 60, 63,213,150,253, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 32, 0,184,112,114, 62,248,169,220, 62,128,172,162, 62, 17,169,221, 62,202, 36,160, 62, 94, 51,252, 62,190, 85,147, 62,
+ 91,176,252, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 32, 0, 53, 64, 74, 63,171, 31,224, 62,217,106, 81, 63,
+ 14,214,232, 62, 68,103, 73, 63,233,248, 0, 63,115,205, 60, 63,213,150,253, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,144, 59,115, 62,102,143,255, 62, 88, 93, 84, 62, 50,105,228, 62,184,112,114, 62,248,169,220, 62,190, 85,147, 62,
+ 91,176,252, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,217,106, 81, 63, 14,214,232, 62,106,154, 93, 63,
+226, 26,233, 62,239,151, 82, 63, 86,223, 3, 63, 68,103, 73, 63,233,248, 0, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 82, 17, 77, 62,162, 98, 2, 63,128, 1, 33, 62, 70,210,226, 62, 88, 93, 84, 62, 50,105,228, 62,144, 59,115, 62,
+102,143,255, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,120, 89,103, 63,105, 76, 2, 63, 92,224, 91, 63,
+239,144, 5, 63,239,151, 82, 63, 86,223, 3, 63,106,154, 93, 63,226, 26,233, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 82, 17, 77, 62,162, 98, 2, 63,178, 40, 38, 62, 14,230, 3, 63,116,128,234, 61,200, 39, 0, 63,128, 1, 33, 62,
+ 70,210,226, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 8, 7, 51, 63, 5,186,130, 62,226, 77, 72, 63,
+204, 21,121, 62,154,254, 73, 63,178, 82,140, 62, 90,188, 56, 63,103,207,159, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,249,249,130, 62,246,175,137, 62,132, 32,137, 62,181, 65,121, 62, 18,197,172, 62, 41,112,133, 62,192, 5,161, 62,
+228, 40,159, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,224, 19, 69, 63, 24, 68,190, 62, 90,188, 56, 63,
+103,207,159, 62,154,254, 73, 63,178, 82,140, 62,216,217, 77, 63, 7,228,157, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,128, 0,249,249,130, 62,246,175,137, 62,192, 5,161, 62,228, 40,159, 62,250, 78,134, 62,148,213,186, 62,154,118,111, 62,
+120,108,152, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,128, 0,240,117, 49, 63,164,138,198, 62,156,160, 41, 63,
+ 56,175,182, 62, 90,188, 56, 63,103,207,159, 62,224, 19, 69, 63, 24, 68,190, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,192, 5,161, 62,228, 40,159, 62,202,212,188, 62,245,163,182, 62,147,137,172, 62,148, 19,198, 62,250, 78,134, 62,
+148,213,186, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,156,160, 41, 63, 56,175,182, 62,222,170, 33, 63,
+ 74,126,158, 62, 91, 60, 36, 63,221,222,150, 62, 90,188, 56, 63,103,207,159, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,150,245,199, 62, 85, 15,152, 62, 72,234,204, 62, 56, 63,159, 62,202,212,188, 62,245,163,182, 62,192, 5,161, 62,
+228, 40,159, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 91, 60, 36, 63,221,222,150, 62, 8, 7, 51, 63,
+ 5,186,130, 62, 90,188, 56, 63,103,207,159, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,192, 5,161, 62,228, 40,159, 62, 18,197,172, 62, 41,112,133, 62,150,245,199, 62, 85, 15,152, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,156,160, 41, 63, 56,175,182, 62,102,212, 31, 63,
+144,192,164, 62,222,170, 33, 63, 74,126,158, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 72,234,204, 62, 56, 63,159, 62, 17,119,208, 62,201, 65,165, 62,202,212,188, 62,245,163,182, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,226, 44,245, 62,129,140, 96, 63, 42,135,227, 62,
+ 58, 2,101, 63,136,168,219, 62, 30,236, 95, 63,135, 30,238, 62,200, 41, 90, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,216,240,137, 62, 90,226, 93, 63,110,103,122, 62,236,255, 92, 63, 74, 84,120, 62,104, 32, 83, 63, 32,193,138, 62,
+ 16, 3, 83, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,240, 0, 48,130,233, 62,188, 69, 83, 63,135, 30,238, 62,
+200, 41, 90, 63,136,168,219, 62, 30,236, 95, 63, 23, 73,212, 62,152,239, 90, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0,216,240,137, 62, 90,226, 93, 63, 32,193,138, 62, 16, 3, 83, 63, 66, 1,153, 62,245,149, 81, 63, 84, 66,150, 62,
+114,154, 94, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,240, 0,216,217, 77, 63, 7,228,157, 62,154,254, 73, 63,
+178, 82,140, 62, 33, 61, 90, 63,195,207,124, 62,160,225, 90, 63,110,121,137, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 16, 0, 98,207, 81, 62,109, 1,110, 62,249,249,130, 62,246,175,137, 62,154,118,111, 62,120,108,152, 62,166,125, 74, 62,
+252, 30,130, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 64, 0,226, 77, 72, 63,204, 21,121, 62,202,106, 84, 63,
+137,185,113, 62, 33, 61, 90, 63,195,207,124, 62,154,254, 73, 63,178, 82,140, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 98,207, 81, 62,109, 1,110, 62,168,179,107, 62,139,127,103, 62,132, 32,137, 62,181, 65,121, 62,249,249,130, 62,
+246,175,137, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 23, 73,212, 62,152,239, 90, 63,136,168,219, 62,
+ 30,236, 95, 63,100,192,205, 62, 46,238, 97, 63, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0,228, 94,141, 62, 86,234,100, 63,216,240,137, 62, 90,226, 93, 63, 84, 66,150, 62,114,154, 94, 63, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,112, 0, 31,178,109, 63,224, 68,228, 62, 46,178,102, 63,
+100,184,232, 62,100,251,101, 63,238,198,227, 62, 94,173,107, 63,168,130,225, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 68,209,249, 61, 70,134,219, 62,120,216,242, 61,124, 40,225, 62, 28, 27,177, 61, 42,240,219, 62, 76,131,196, 61,
+196, 97,216, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 31,178,109, 63,224, 68,228, 62, 94,173,107, 63,
+168,130,225, 62,144,102,114, 63,198, 23,220, 62, 41, 76,116, 63,139,153,222, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 56,163,120, 61, 58,252,208, 62, 76,131,196, 61,196, 97,216, 62, 28, 27,177, 61, 42,240,219, 62,128,183, 73, 61,
+ 84,108,213, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 41, 76,116, 63,139,153,222, 62,144,102,114, 63,
+198, 23,220, 62, 84, 87,117, 63,221,255,211, 62,183,115,119, 63,140, 49,215, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,144, 29, 55, 61,207,183,194, 62, 56,163,120, 61, 58,252,208, 62,128,183, 73, 61, 84,108,213, 62,224,111,231, 60,
+100,142,198, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,183,115,119, 63,140, 49,215, 62, 84, 87,117, 63,
+221,255,211, 62,150, 20,118, 63, 60,110,196, 62, 49, 12,122, 63,246, 8,197, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 96,197,103, 61, 15,206,170, 62,144, 29, 55, 61,207,183,194, 62,224,111,231, 60,100,142,198, 62,240, 54, 16, 61,
+120, 4,167, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 49, 12,122, 63,246, 8,197, 62,150, 20,118, 63,
+ 60,110,196, 62, 17,155,108, 63,130,201,178, 62, 84,190,110, 63,223, 77,172, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,148,252,246, 61,164,116,160, 62, 96,197,103, 61, 15,206,170, 62,240, 54, 16, 61,120, 4,167, 62, 8, 66,246, 61,
+ 28,161,152, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 84,190,110, 63,223, 77,172, 62, 17,155,108, 63,
+130,201,178, 62, 21,180, 92, 63,202, 95,173, 62,151, 5, 90, 63,138, 61,167, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,144,216, 54, 62, 35, 76,163, 62,148,252,246, 61,164,116,160, 62, 8, 66,246, 61, 28,161,152, 62,194,251, 66, 62,
+163,102,158, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 17,155,108, 63,130,201,178, 62,198,132,109, 63,
+182,157,186, 62, 68, 32, 97, 63,192, 12,178, 62, 21,180, 92, 63,202, 95,173, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 48,185, 36, 62, 16, 7,166, 62, 40, 91,221, 61, 4,194,167, 62,148,252,246, 61,164,116,160, 62,144,216, 54, 62,
+ 35, 76,163, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,150, 20,118, 63, 60,110,196, 62, 84,225,115, 63,
+208, 85,198, 62,198,132,109, 63,182,157,186, 62, 17,155,108, 63,130,201,178, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 40, 91,221, 61, 4,194,167, 62,244,221,134, 61,121,164,175, 62, 96,197,103, 61, 15,206,170, 62,148,252,246, 61,
+164,116,160, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 84, 87,117, 63,221,255,211, 62,222, 48,116, 63,
+169, 8,209, 62, 84,225,115, 63,208, 85,198, 62,150, 20,118, 63, 60,110,196, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,244,221,134, 61,121,164,175, 62,160,108, 93, 61, 17,207,190, 62,144, 29, 55, 61,207,183,194, 62, 96,197,103, 61,
+ 15,206,170, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,144,102,114, 63,198, 23,220, 62,174,151,113, 63,
+ 26,229,214, 62,222, 48,116, 63,169, 8,209, 62, 84, 87,117, 63,221,255,211, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,160,108, 93, 61, 17,207,190, 62, 12,155,135, 61,166, 39,201, 62, 56,163,120, 61, 58,252,208, 62,144, 29, 55, 61,
+207,183,194, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 94,173,107, 63,168,130,225, 62,228,239,107, 63,
+ 62, 59,218, 62,174,151,113, 63, 26,229,214, 62,144,102,114, 63,198, 23,220, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 12,155,135, 61,166, 39,201, 62,128, 47,195, 61, 6, 11,207, 62, 76,131,196, 61,196, 97,216, 62, 56,163,120, 61,
+ 58,252,208, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 94,173,107, 63,168,130,225, 62,100,251,101, 63,
+238,198,227, 62, 71,205,102, 63,132, 94,219, 62,228,239,107, 63, 62, 59,218, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,192,157,244, 61,157,137,209, 62, 68,209,249, 61, 70,134,219, 62, 76,131,196, 61,196, 97,216, 62,128, 47,195, 61,
+ 6, 11,207, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,224, 19, 69, 63, 24, 68,190, 62,216,217, 77, 63,
+ 7,228,157, 62,236, 35, 85, 63,164,201,181, 62, 56, 92, 78, 63,177,114,188, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 32, 0,122, 91, 80, 62, 72, 18,174, 62,154,118,111, 62,120,108,152, 62,250, 78,134, 62,148,213,186, 62,162,163,104, 62,
+150,180,182, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 32, 0,216,217, 77, 63, 7,228,157, 62,151, 5, 90, 63,
+138, 61,167, 62, 21,180, 92, 63,202, 95,173, 62,236, 35, 85, 63,164,201,181, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 16, 0,144,216, 54, 62, 35, 76,163, 62,194,251, 66, 62,163,102,158, 62,154,118,111, 62,120,108,152, 62,122, 91, 80, 62,
+ 72, 18,174, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 64, 0, 53, 64, 74, 63,171, 31,224, 62,224, 19, 69, 63,
+ 24, 68,190, 62, 56, 92, 78, 63,177,114,188, 62,217,106, 81, 63, 14,214,232, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,162,163,104, 62,150,180,182, 62,250, 78,134, 62,148,213,186, 62,184,112,114, 62,248,169,220, 62, 88, 93, 84, 62,
+ 50,105,228, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,106,154, 93, 63,226, 26,233, 62,196,229, 94, 63,
+128,195,224, 62,100,251,101, 63,238,198,227, 62, 46,178,102, 63,100,184,232, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 68,209,249, 61, 70,134,219, 62,108,187, 28, 62, 48, 86,217, 62,128, 1, 33, 62, 70,210,226, 62,120,216,242, 61,
+124, 40,225, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 21,180, 92, 63,202, 95,173, 62, 68, 32, 97, 63,
+192, 12,178, 62, 9,215, 94, 63, 4, 54,186, 62,236, 35, 85, 63,164,201,181, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 60,122, 41, 62, 16, 58,175, 62, 48,185, 36, 62, 16, 7,166, 62,144,216, 54, 62, 35, 76,163, 62,122, 91, 80, 62,
+ 72, 18,174, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,230, 78, 95, 63, 4,233,189, 62, 32,188, 86, 63,
+ 44, 62,190, 62,236, 35, 85, 63,164,201,181, 62, 9,215, 94, 63, 4, 54,186, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,122, 91, 80, 62, 72, 18,174, 62, 78,118, 71, 62, 27, 49,182, 62, 52,225, 37, 62, 40, 12,179, 62, 60,122, 41, 62,
+ 16, 58,175, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 70,166, 92, 63, 0,166,197, 62, 32,188, 86, 63,
+ 44, 62,190, 62,230, 78, 95, 63, 4,233,189, 62,226, 13, 95, 63, 37,152,194, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 52,225, 37, 62, 40, 12,179, 62, 78,118, 71, 62, 27, 49,182, 62,142,143, 45, 62,237, 37,188, 62,106,230, 36, 62,
+222, 27,184, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,248, 90, 95, 63,100,122,207, 62,108,249, 90, 63,
+ 58,199,212, 62, 32,188, 86, 63, 44, 62,190, 62, 70,166, 92, 63, 0,166,197, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 78,118, 71, 62, 27, 49,182, 62,110, 56, 48, 62,230, 43,205, 62,174,250, 30, 62, 26, 12,198, 62,142,143, 45, 62,
+237, 37,188, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,196,229, 94, 63,128,195,224, 62,108,249, 90, 63,
+ 58,199,212, 62,248, 90, 95, 63,100,122,207, 62, 92,104, 98, 63,197,136,215, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,174,250, 30, 62, 26, 12,198, 62,110, 56, 48, 62,230, 43,205, 62,108,187, 28, 62, 48, 86,217, 62,212, 59, 15, 62,
+224, 50,206, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,100,251,101, 63,238,198,227, 62,196,229, 94, 63,
+128,195,224, 62, 92,104, 98, 63,197,136,215, 62, 71,205,102, 63,132, 94,219, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,212, 59, 15, 62,224, 50,206, 62,108,187, 28, 62, 48, 86,217, 62, 68,209,249, 61, 70,134,219, 62,192,157,244, 61,
+157,137,209, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,217,106, 81, 63, 14,214,232, 62,108,249, 90, 63,
+ 58,199,212, 62,196,229, 94, 63,128,195,224, 62,106,154, 93, 63,226, 26,233, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,108,187, 28, 62, 48, 86,217, 62,110, 56, 48, 62,230, 43,205, 62, 88, 93, 84, 62, 50,105,228, 62,128, 1, 33, 62,
+ 70,210,226, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,217,106, 81, 63, 14,214,232, 62, 56, 92, 78, 63,
+177,114,188, 62, 32,188, 86, 63, 44, 62,190, 62,108,249, 90, 63, 58,199,212, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 78,118, 71, 62, 27, 49,182, 62,162,163,104, 62,150,180,182, 62, 88, 93, 84, 62, 50,105,228, 62,110, 56, 48, 62,
+230, 43,205, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 56, 92, 78, 63,177,114,188, 62,236, 35, 85, 63,
+164,201,181, 62, 32,188, 86, 63, 44, 62,190, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 78,118, 71, 62, 27, 49,182, 62,122, 91, 80, 62, 72, 18,174, 62,162,163,104, 62,150,180,182, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 71,205,102, 63,132, 94,219, 62, 92,104, 98, 63,
+197,136,215, 62,182,109,100, 63,149,255,210, 62, 54, 86,104, 63,209,241,214, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,160,107, 7, 62, 34,103,200, 62,212, 59, 15, 62,224, 50,206, 62,192,157,244, 61,157,137,209, 62, 8, 2,232, 61,
+ 20,214,203, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 92,104, 98, 63,197,136,215, 62,248, 90, 95, 63,
+100,122,207, 62,112,206, 97, 63, 10,202,204, 62,182,109,100, 63,149,255,210, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 64, 68, 21, 62,107, 55,194, 62,174,250, 30, 62, 26, 12,198, 62,212, 59, 15, 62,224, 50,206, 62,160,107, 7, 62,
+ 34,103,200, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,248, 90, 95, 63,100,122,207, 62, 70,166, 92, 63,
+ 0,166,197, 62, 82,241, 94, 63, 40,103,198, 62,112,206, 97, 63, 10,202,204, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 20,225, 35, 62, 39, 50,188, 62,142,143, 45, 62,237, 37,188, 62,174,250, 30, 62, 26, 12,198, 62, 64, 68, 21, 62,
+107, 55,194, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 70,166, 92, 63, 0,166,197, 62,226, 13, 95, 63,
+ 37,152,194, 62,118, 1, 97, 63, 47,226,195, 62, 82,241, 94, 63, 40,103,198, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 12, 43, 28, 62,186,177,184, 62,106,230, 36, 62,222, 27,184, 62,142,143, 45, 62,237, 37,188, 62, 20,225, 35, 62,
+ 39, 50,188, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,226, 13, 95, 63, 37,152,194, 62,230, 78, 95, 63,
+ 4,233,189, 62, 51,113, 97, 63, 92,151,189, 62,118, 1, 97, 63, 47,226,195, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,104, 67, 29, 62, 58,199,177, 62, 52,225, 37, 62, 40, 12,179, 62,106,230, 36, 62,222, 27,184, 62, 12, 43, 28, 62,
+186,177,184, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,230, 78, 95, 63, 4,233,189, 62, 9,215, 94, 63,
+ 4, 54,186, 62, 96, 69, 96, 63,152,133,187, 62, 51,113, 97, 63, 92,151,189, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,140, 14, 35, 62, 33, 19,176, 62, 60,122, 41, 62, 16, 58,175, 62, 52,225, 37, 62, 40, 12,179, 62,104, 67, 29, 62,
+ 58,199,177, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 9,215, 94, 63, 4, 54,186, 62, 68, 32, 97, 63,
+192, 12,178, 62,112, 91, 98, 63,149,128,182, 62, 96, 69, 96, 63,152,133,187, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,228,107, 29, 62, 95,230,169, 62, 48,185, 36, 62, 16, 7,166, 62, 60,122, 41, 62, 16, 58,175, 62,140, 14, 35, 62,
+ 33, 19,176, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,228,239,107, 63, 62, 59,218, 62, 71,205,102, 63,
+132, 94,219, 62, 54, 86,104, 63,209,241,214, 62, 34, 27,109, 63,155,254,214, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 8, 2,232, 61, 20,214,203, 62,192,157,244, 61,157,137,209, 62,128, 47,195, 61, 6, 11,207, 62, 36,174,184, 61,
+216,130,202, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,174,151,113, 63, 26,229,214, 62,228,239,107, 63,
+ 62, 59,218, 62, 34, 27,109, 63,155,254,214, 62, 69,134,113, 63,156, 82,212, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 36,174,184, 61,216,130,202, 62,128, 47,195, 61, 6, 11,207, 62, 12,155,135, 61,166, 39,201, 62, 60,114,138, 61,
+ 28, 61,197, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,222, 48,116, 63,169, 8,209, 62,174,151,113, 63,
+ 26,229,214, 62, 69,134,113, 63,156, 82,212, 62, 42,143,114, 63, 24,168,207, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 60,114,138, 61, 28, 61,197, 62, 12,155,135, 61,166, 39,201, 62,160,108, 93, 61, 17,207,190, 62,184, 85,132, 61,
+ 22,211,189, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 84,225,115, 63,208, 85,198, 62,222, 48,116, 63,
+169, 8,209, 62, 42,143,114, 63, 24,168,207, 62,203,125,114, 63, 96,114,200, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,184, 85,132, 61, 22,211,189, 62,160,108, 93, 61, 17,207,190, 62,244,221,134, 61,121,164,175, 62, 16,152,145, 61,
+ 84,214,179, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,198,132,109, 63,182,157,186, 62, 84,225,115, 63,
+208, 85,198, 62,203,125,114, 63, 96,114,200, 62,177,192,109, 63,152,240,190, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 16,152,145, 61, 84,214,179, 62,244,221,134, 61,121,164,175, 62, 40, 91,221, 61, 4,194,167, 62, 64,226,208, 61,
+232, 58,172, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 68, 32, 97, 63,192, 12,178, 62,198,132,109, 63,
+182,157,186, 62,177,192,109, 63,152,240,190, 62,112, 91, 98, 63,149,128,182, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 64,226,208, 61,232, 58,172, 62, 40, 91,221, 61, 4,194,167, 62, 48,185, 36, 62, 16, 7,166, 62,228,107, 29, 62,
+ 95,230,169, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,118, 1, 97, 63, 47,226,195, 62, 51,113, 97, 63,
+ 92,151,189, 62,215,139,102, 63, 15,109,193, 62, 54, 47,100, 63,186,115,198, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 92,169, 5, 62,168,115,179, 62,104, 67, 29, 62, 58,199,177, 62, 12, 43, 28, 62,186,177,184, 62, 50, 97, 13, 62,
+ 50, 42,186, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 54, 47,100, 63,186,115,198, 62,215,139,102, 63,
+ 15,109,193, 62,174,241,105, 63,204, 8,200, 62, 71,233,103, 63,178, 42,204, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,228,171,229, 61, 41, 42,185, 62, 92,169, 5, 62,168,115,179, 62, 50, 97, 13, 62, 50, 42,186, 62, 92,248,243, 61,
+ 96, 22,191, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 71,233,103, 63,178, 42,204, 62,174,241,105, 63,
+204, 8,200, 62, 51, 37,108, 63,249, 3,205, 62, 56,212,106, 63, 96,238,208, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,120, 99,202, 61,192, 49,190, 62,228,171,229, 61, 41, 42,185, 62, 92,248,243, 61, 96, 22,191, 62,160,209,211, 61,
+108,159,195, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 56,212,106, 63, 96,238,208, 62, 51, 37,108, 63,
+249, 3,205, 62, 56, 73,110, 63,186,119,206, 62, 46,191,109, 63, 92, 64,210, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,244,234,179, 61,240,219,190, 62,120, 99,202, 61,192, 49,190, 62,160,209,211, 61,108,159,195, 62,196,129,181, 61,
+204, 14,196, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 34, 27,109, 63,155,254,214, 62, 54, 86,104, 63,
+209,241,214, 62, 56,212,106, 63, 96,238,208, 62, 46,191,109, 63, 92, 64,210, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,160,209,211, 61,108,159,195, 62, 8, 2,232, 61, 20,214,203, 62, 36,174,184, 61,216,130,202, 62,196,129,181, 61,
+204, 14,196, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,182,109,100, 63,149,255,210, 62, 71,233,103, 63,
+178, 42,204, 62, 56,212,106, 63, 96,238,208, 62, 54, 86,104, 63,209,241,214, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,160,209,211, 61,108,159,195, 62, 92,248,243, 61, 96, 22,191, 62,160,107, 7, 62, 34,103,200, 62, 8, 2,232, 61,
+ 20,214,203, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,182,109,100, 63,149,255,210, 62,112,206, 97, 63,
+ 10,202,204, 62, 54, 47,100, 63,186,115,198, 62, 71,233,103, 63,178, 42,204, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 50, 97, 13, 62, 50, 42,186, 62, 64, 68, 21, 62,107, 55,194, 62,160,107, 7, 62, 34,103,200, 62, 92,248,243, 61,
+ 96, 22,191, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,118, 1, 97, 63, 47,226,195, 62, 54, 47,100, 63,
+186,115,198, 62,112,206, 97, 63, 10,202,204, 62, 82,241, 94, 63, 40,103,198, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 64, 68, 21, 62,107, 55,194, 62, 50, 97, 13, 62, 50, 42,186, 62, 12, 43, 28, 62,186,177,184, 62, 20,225, 35, 62,
+ 39, 50,188, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 96, 69, 96, 63,152,133,187, 62,112, 91, 98, 63,
+149,128,182, 62,215,139,102, 63, 15,109,193, 62, 51,113, 97, 63, 92,151,189, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 92,169, 5, 62,168,115,179, 62,228,107, 29, 62, 95,230,169, 62,140, 14, 35, 62, 33, 19,176, 62,104, 67, 29, 62,
+ 58,199,177, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,177,192,109, 63,152,240,190, 62,174,241,105, 63,
+204, 8,200, 62,215,139,102, 63, 15,109,193, 62,112, 91, 98, 63,149,128,182, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 92,169, 5, 62,168,115,179, 62,228,171,229, 61, 41, 42,185, 62, 64,226,208, 61,232, 58,172, 62,228,107, 29, 62,
+ 95,230,169, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,203,125,114, 63, 96,114,200, 62, 51, 37,108, 63,
+249, 3,205, 62,174,241,105, 63,204, 8,200, 62,177,192,109, 63,152,240,190, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,228,171,229, 61, 41, 42,185, 62,120, 99,202, 61,192, 49,190, 62, 16,152,145, 61, 84,214,179, 62, 64,226,208, 61,
+232, 58,172, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 42,143,114, 63, 24,168,207, 62, 56, 73,110, 63,
+186,119,206, 62, 51, 37,108, 63,249, 3,205, 62,203,125,114, 63, 96,114,200, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,120, 99,202, 61,192, 49,190, 62,244,234,179, 61,240,219,190, 62,184, 85,132, 61, 22,211,189, 62, 16,152,145, 61,
+ 84,214,179, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 69,134,113, 63,156, 82,212, 62, 46,191,109, 63,
+ 92, 64,210, 62, 56, 73,110, 63,186,119,206, 62, 42,143,114, 63, 24,168,207, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,244,234,179, 61,240,219,190, 62,196,129,181, 61,204, 14,196, 62, 60,114,138, 61, 28, 61,197, 62,184, 85,132, 61,
+ 22,211,189, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 34, 27,109, 63,155,254,214, 62, 46,191,109, 63,
+ 92, 64,210, 62, 69,134,113, 63,156, 82,212, 62, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 60,114,138, 61, 28, 61,197, 62,196,129,181, 61,204, 14,196, 62, 36,174,184, 61,216,130,202, 62, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 84,190,110, 63,223, 77,172, 62,151, 5, 90, 63,
+138, 61,167, 62, 22, 25, 96, 63,246,248,149, 62,162,176,122, 63,145,215,161, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,128, 0, 64,234, 54, 62,146,219,140, 62,194,251, 66, 62,163,102,158, 62, 8, 66,246, 61, 28,161,152, 62,172,241,189, 61,
+ 13,107,132, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 49, 12,122, 63,246, 8,197, 62, 84,190,110, 63,
+223, 77,172, 62,162,176,122, 63,145,215,161, 62,188,255,126, 63,115,248,198, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 64, 0,172,241,189, 61, 13,107,132, 62, 8, 66,246, 61, 28,161,152, 62,240, 54, 16, 61,120, 4,167, 62, 0, 8,163, 58,
+ 39, 69,162, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,128, 0,183,115,119, 63,140, 49,215, 62, 49, 12,122, 63,
+246, 8,197, 62,188,255,126, 63,115,248,198, 62, 47, 6,122, 63,248,157,216, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0, 0, 8,163, 58, 39, 69,162, 62,240, 54, 16, 61,120, 4,167, 62,224,111,231, 60,100,142,198, 62,224,248, 14, 60,
+ 70,141,198, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 16, 0, 41, 76,116, 63,139,153,222, 62,183,115,119, 63,
+140, 49,215, 62, 47, 6,122, 63,248,157,216, 62,134, 98,119, 63,204, 37,225, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,224,248, 14, 60, 70,141,198, 62,224,111,231, 60,100,142,198, 62,128,183, 73, 61, 84,108,213, 62, 80,210,229, 60,
+ 32,239,218, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0, 31,178,109, 63,224, 68,228, 62, 41, 76,116, 63,
+139,153,222, 62,134, 98,119, 63,204, 37,225, 62, 46,185,115, 63, 90,157,234, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,128, 0, 80,210,229, 60, 32,239,218, 62,128,183, 73, 61, 84,108,213, 62, 28, 27,177, 61, 42,240,219, 62, 56,103,122, 61,
+ 30, 10,230, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,128, 0, 46,178,102, 63,100,184,232, 62, 31,178,109, 63,
+224, 68,228, 62, 46,185,115, 63, 90,157,234, 62,244,134,106, 63,234, 64,246, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 64, 0, 56,103,122, 61, 30, 10,230, 62, 28, 27,177, 61, 42,240,219, 62,120,216,242, 61,124, 40,225, 62,212,222,209, 61,
+238,123,240, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 16, 0,235,188, 5, 63,252, 74, 98, 63,200,111,248, 62,
+197,105,112, 63, 0, 49,231, 62,118,190,107, 63,150, 57,255, 62, 53, 14, 96, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 80, 99, 95, 62,149,194, 94, 63, 58, 8, 62, 62, 10,154, 89, 63, 40, 24, 92, 62, 14, 82, 74, 63,112, 11,112, 62,
+157,133, 78, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,240, 0,235,188, 5, 63,252, 74, 98, 63,136,139, 12, 63,
+138,233,101, 63,116, 45, 6, 63,112,245,113, 63,200,111,248, 62,197,105,112, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 68,219, 36, 62,249,186, 81, 63, 28,254, 65, 62, 20, 55, 70, 63, 40, 24, 92, 62, 14, 82, 74, 63, 58, 8, 62, 62,
+ 10,154, 89, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,240, 0,136,139, 12, 63,138,233,101, 63, 5,130, 12, 63,
+149,216,108, 63,116, 45, 6, 63,112,245,113, 63, 0, 0,128, 63, 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,112, 0, 68,219, 36, 62,249,186, 81, 63, 76, 1, 42, 62, 39,178, 73, 63, 28,254, 65, 62, 20, 55, 70, 63, 0, 0,128, 63,
+ 0, 0,128, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,112, 0,120, 89,103, 63,105, 76, 2, 63,106,154, 93, 63,
+226, 26,233, 62, 46,178,102, 63,100,184,232, 62,244,134,106, 63,234, 64,246, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 0, 0,120,216,242, 61,124, 40,225, 62,128, 1, 33, 62, 70,210,226, 62,116,128,234, 61,200, 39, 0, 63,212,222,209, 61,
+238,123,240, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, 0,226, 44,245, 62,129,140, 96, 63,150, 57,255, 62,
+ 53, 14, 96, 63, 0, 49,231, 62,118,190,107, 63, 42,135,227, 62, 58, 2,101, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0,240, 0, 80, 99, 95, 62,149,194, 94, 63,112, 11,112, 62,157,133, 78, 63, 74, 84,120, 62,104, 32, 83, 63,110,103,122, 62,
+236,255, 92, 63,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0,240, 0,216,217, 77, 63, 7,228,157, 62,160,225, 90, 63,
+110,121,137, 62, 22, 25, 96, 63,246,248,149, 62,151, 5, 90, 63,138, 61,167, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0,
+ 0, 0, 16, 0, 64,234, 54, 62,146,219,140, 62,166,125, 74, 62,252, 30,130, 62,154,118,111, 62,120,108,152, 62,194,251, 66, 62,
+163,102,158, 62,208,217,115, 1, 0, 0, 0, 0, 1, 0, 5, 0, 0, 0, 64, 0, 68, 65, 84, 65, 64, 31, 0, 0, 16,101,117, 1,
+ 0, 0, 0, 0, 57, 0, 0, 0,208, 7, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
@@ -3979,6107 +6743,5097 @@ char datatoc_preview_blend[]= {
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 68, 65, 84, 65, 0, 0,117, 48, 8,170,144, 32, 0, 0, 0, 51, 0, 0, 1,244, 2,236,169, 32, 63, 28,112, 3,
- 62,236,178,185, 63, 27,124,224, 62,232, 65,235, 63, 30, 63,144, 62,226,195,233, 63, 32,152,118, 62,236,167, 37,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,209,232, 2, 62,226, 21,222,
- 62,215,109,102, 62,231,147,222, 62,213,135, 28, 62,236, 4,172, 62,205, 54, 56, 62,235,249, 22,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 32,152,118, 62,236,167, 37, 63, 30, 63,144,
- 62,226,195,233, 63, 33,235,108, 62,220,235,197, 63, 37,151,209, 62,236,161, 89,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,202,144, 76, 62,220, 61,186, 62,209,232, 2, 62,226, 21,222,
- 62,205, 54, 56, 62,235,249, 22, 62,195, 55,128, 62,235,243, 70,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 30, 63,144, 62,226,195,233, 63, 25, 55, 20, 62,223, 35, 1, 63, 25,178,200,
- 62,214,233, 77, 63, 33,235,108, 62,220,235,197,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,240, 2,236,169, 32, 62,219, 1,146, 62,214, 59, 66, 62,219,248,248, 62,222,116,246, 62,209,232, 2, 62,226, 21,222,
- 62,202,144, 76, 62,220, 61,186,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240,
- 2,236,169, 32, 63, 27,124,224, 62,232, 65,235, 63, 24,252, 87, 62,230,111, 93, 63, 25, 55, 20, 62,223, 35, 1, 63, 30, 63,144,
- 62,226,195,233,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32,
- 62,219,248,248, 62,222,116,246, 62,220,110,118, 62,229,193, 78, 62,215,109,102, 62,231,147,222, 62,209,232, 2, 62,226, 21,222,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 24,252, 87,
- 62,230,111, 93, 63, 22,195, 22, 62,232, 90,195, 63, 20, 91,191, 62,227, 18,193, 63, 25, 55, 20, 62,223, 35, 1,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,229,175,162, 62,226,100,178,
- 62,224,224,248, 62,231,172,182, 62,220,110,118, 62,229,193, 78, 62,219,248,248, 62,222,116,246,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 25, 55, 20, 62,223, 35, 1, 63, 20, 91,191,
- 62,227, 18,193, 63, 17,165,187, 62,221, 6,225, 63, 25,178,200, 62,214,233, 77,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,235, 27,170, 62,220, 88,214, 62,229,175,162, 62,226,100,178,
- 62,219,248,248, 62,222,116,246, 62,219, 1,146, 62,214, 59, 66,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 20, 91,191, 62,227, 18,193, 63, 18, 18,164, 62,236,201,173, 63, 13,231,157,
- 62,236,161, 89, 63, 17,165,187, 62,221, 6,225,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,240, 2,236,169, 32, 62,242,151,232, 62,235,243, 70, 62,234, 65,216, 62,236, 27,158, 62,229,175,162, 62,226,100,178,
- 62,235, 27,170, 62,220, 88,214,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240,
- 2,236,169, 32, 63, 22,195, 22, 62,232, 90,195, 63, 21,202, 11, 62,236,189, 1, 63, 18, 18,164, 62,236,201,173, 63, 20, 91,191,
- 62,227, 18,193,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32,
- 62,234, 65,216, 62,236, 27,158, 62,226,211, 12, 62,236, 14,246, 62,224,224,248, 62,231,172,182, 62,229,175,162, 62,226,100,178,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 21,202, 11,
- 62,236,189, 1, 63, 22,202,215, 62,241,124,237, 63, 20,105,125, 62,246, 71, 1, 63, 18, 18,164, 62,236,201,173,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,229,148, 42, 62,245,152,246,
- 62,224,209,112, 62,240,206,226, 62,226,211, 12, 62,236, 14,246, 62,234, 65,216, 62,236, 27,158,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 18, 18,164, 62,236,201,173, 63, 20,105,125,
- 62,246, 71, 1, 63, 17,173, 44, 62,252,149,231, 63, 13,231,157, 62,236,161, 89,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,235, 12,206, 62,251,231,218, 62,229,148, 42, 62,245,152,246,
- 62,234, 65,216, 62,236, 27,158, 62,242,151,232, 62,235,243, 70,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 20,105,125, 62,246, 71, 1, 63, 25, 59, 37, 62,250, 73, 49, 63, 25,178,108,
- 63, 1,108,218, 63, 17,173, 44, 62,252,149,231,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,240, 2,236,169, 32, 62,219, 2, 76, 63, 1, 21,213, 62,219,240,216, 62,249,155, 38, 62,229,148, 42, 62,245,152,246,
- 62,235, 12,206, 62,251,231,218,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240,
- 2,236,169, 32, 63, 22,202,215, 62,241,124,237, 63, 25, 1,195, 62,243,102,169, 63, 25, 59, 37, 62,250, 73, 49, 63, 20,105,125,
- 62,246, 71, 1,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32,
- 62,219,240,216, 62,249,155, 38, 62,220, 99,156, 62,242,184,154, 62,224,209,112, 62,240,206,226, 62,229,148, 42, 62,245,152,246,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 25, 1,195,
- 62,243,102,169, 63, 27,125,176, 62,241,145,149, 63, 30, 74,167, 62,246,153, 3, 63, 25, 59, 37, 62,250, 73, 49,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,209,209,212, 62,245,234,246,
- 62,215,107,192, 62,240,227,138, 62,220, 99,156, 62,242,184,154, 62,219,240,216, 62,249,155, 38,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 25, 59, 37, 62,250, 73, 49, 63, 30, 74,167,
- 62,246,153, 3, 63, 33,230,204, 62,252,232,107, 63, 25,178,108, 63, 1,108,218,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,202,153,132, 62,252, 58, 94, 62,209,209,212, 62,245,234,246,
- 62,219,240,216, 62,249,155, 38, 62,219, 2, 76, 63, 1, 21,213,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 30, 74,167, 62,246,153, 3, 63, 32,152,118, 62,236,167, 37, 63, 37,151,209,
- 62,236,161, 89, 63, 33,230,204, 62,252,232,107,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,240, 2,236,169, 32, 62,195, 55,128, 62,235,243, 70, 62,205, 54, 56, 62,235,249, 22, 62,209,209,212, 62,245,234,246,
- 62,202,153,132, 62,252, 58, 94,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240,
- 2,236,169, 32, 63, 27,125,176, 62,241,145,149, 63, 28,112, 3, 62,236,178,185, 63, 32,152,118, 62,236,167, 37, 63, 30, 74,167,
- 62,246,153, 3,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32,
- 62,205, 54, 56, 62,235,249, 22, 62,213,135, 28, 62,236, 4,172, 62,215,107,192, 62,240,227,138, 62,209,209,212, 62,245,234,246,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 28,112, 3,
- 62,236,178,185, 63, 27,125,176, 62,241,145,149, 63, 27, 39, 42, 62,241, 1, 57, 63, 27,249,140, 62,236,186,115,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,216, 24,206, 62,240, 83, 46,
- 62,215,107,192, 62,240,227,138, 62,213,135, 28, 62,236, 4,172, 62,214,116, 8, 62,236, 12,102,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 27,125,176, 62,241,145,149, 63, 25, 1,195,
- 62,243,102,169, 63, 24,248, 6, 62,242, 91,185, 63, 27, 39, 42, 62,241, 1, 57,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,220,119, 22, 62,241,173,174, 62,220, 99,156, 62,242,184,154,
- 62,215,107,192, 62,240,227,138, 62,216, 24,206, 62,240, 83, 46,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 25, 1,195, 62,243,102,169, 63, 22,202,215, 62,241,124,237, 63, 23, 38,157,
- 62,240,173,225, 63, 24,248, 6, 62,242, 91,185,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,240, 2,236,169, 32, 62,224, 25,234, 62,239,255,214, 62,224,209,112, 62,240,206,226, 62,220, 99,156, 62,242,184,154,
- 62,220,119, 22, 62,241,173,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240,
- 2,236,169, 32, 63, 22,202,215, 62,241,124,237, 63, 21,202, 11, 62,236,189, 1, 63, 22, 89, 13, 62,236,196,247, 63, 23, 38,157,
- 62,240,173,225,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32,
- 62,225,181, 8, 62,236, 22,234, 62,226,211, 12, 62,236, 14,246, 62,224,209,112, 62,240,206,226, 62,224, 25,234, 62,239,255,214,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 21,202, 11,
- 62,236,189, 1, 63, 22,195, 22, 62,232, 90,195, 63, 23, 33, 88, 62,233, 47, 69, 63, 22, 89, 13, 62,236,196,247,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,224, 36,112, 62,232,129, 58,
- 62,224,224,248, 62,231,172,182, 62,226,211, 12, 62,236, 14,246, 62,225,181, 8, 62,236, 22,234,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 22,195, 22, 62,232, 90,195, 63, 24,252, 87,
- 62,230,111, 93, 63, 24,243,100, 62,231,123, 5, 63, 23, 33, 88, 62,233, 47, 69,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,220,128, 90, 62,230,204,248, 62,220,110,118, 62,229,193, 78,
- 62,224,224,248, 62,231,172,182, 62,224, 36,112, 62,232,129, 58,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 24,252, 87, 62,230,111, 93, 63, 27,124,224, 62,232, 65,235, 63, 27, 37,169,
- 62,232,211, 35, 63, 24,243,100, 62,231,123, 5,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,240, 2,236,169, 32, 62,216, 27,206, 62,232, 37, 22, 62,215,109,102, 62,231,147,222, 62,220,110,118, 62,229,193, 78,
- 62,220,128, 90, 62,230,204,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240,
- 2,236,169, 32, 63, 27,124,224, 62,232, 65,235, 63, 28,112, 3, 62,236,178,185, 63, 27,249,140, 62,236,186,115, 63, 27, 37,169,
- 62,232,211, 35,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32,
- 62,214,116, 8, 62,236, 12,102, 62,213,135, 28, 62,236, 4,172, 62,215,109,102, 62,231,147,222, 62,216, 27,206, 62,232, 37, 22,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 24,242,138,
- 62,236,194, 21, 63, 27, 37,169, 62,232,211, 35, 63, 27,249,140, 62,236,186,115, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 62,214,116, 8, 62,236, 12,102,
- 62,216, 27,206, 62,232, 37, 22, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 63, 24,243,100, 62,231,123, 5, 63, 27, 37,169,
- 62,232,211, 35, 63, 24,242,138, 62,236,194, 21, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 62,220,130, 16, 62,236, 20, 6, 62,216, 27,206, 62,232, 37, 22,
- 62,220,128, 90, 62,230,204,248, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 63, 24,242,138, 62,236,194, 21, 63, 23, 33, 88, 62,233, 47, 69, 63, 24,243,100,
- 62,231,123, 5, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,112, 2,236,169, 32, 62,220,128, 90, 62,230,204,248, 62,224, 36,112, 62,232,129, 58, 62,220,130, 16, 62,236, 20, 6,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,112,
- 2,236,169, 32, 63, 24,242,138, 62,236,194, 21, 63, 22, 89, 13, 62,236,196,247, 63, 23, 33, 88, 62,233, 47, 69, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32,
- 62,224, 36,112, 62,232,129, 58, 62,225,181, 8, 62,236, 22,234, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 63, 24,242,138,
- 62,236,194, 21, 63, 23, 38,157, 62,240,173,225, 63, 22, 89, 13, 62,236,196,247, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 62,225,181, 8, 62,236, 22,234,
- 62,224, 25,234, 62,239,255,214, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 63, 24,242,138, 62,236,194, 21, 63, 24,248, 6,
- 62,242, 91,185, 63, 23, 38,157, 62,240,173,225, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 62,224, 25,234, 62,239,255,214, 62,220,119, 22, 62,241,173,174,
- 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 63, 24,242,138, 62,236,194, 21, 63, 27, 39, 42, 62,241, 1, 57, 63, 24,248, 6,
- 62,242, 91,185, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,112, 2,236,169, 32, 62,220,119, 22, 62,241,173,174, 62,216, 24,206, 62,240, 83, 46, 62,220,130, 16, 62,236, 20, 6,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,112,
- 2,236,169, 32, 63, 24,242,138, 62,236,194, 21, 63, 27,249,140, 62,236,186,115, 63, 27, 39, 42, 62,241, 1, 57, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32,
- 62,216, 24,206, 62,240, 83, 46, 62,214,116, 8, 62,236, 12,102, 62,220,130, 16, 62,236, 20, 6, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 63, 16,254,174,
- 62, 34, 45, 94, 63, 13,190, 79, 62, 46,193,160, 63, 3,199,220, 62, 24,219, 89, 63, 3,199,219, 61,229, 28, 18,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 63, 3,199,220, 62, 24,219, 89,
- 62,243,150, 14, 62, 47, 79,204, 62,236,248,140, 62, 34,202,182, 63, 3,199,219, 61,229, 28, 18,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32, 63, 21,152,184, 62, 53, 47,182, 63, 16,104,250,
- 62, 55,113, 16, 63, 13,190, 79, 62, 46,193,160, 63, 16,254,174, 62, 34, 45, 94,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128, 2,236,169, 32, 62,243,150, 14, 62, 47, 79,204, 62,238, 68,200, 62, 56, 62, 76,
- 62,227,207,183, 62, 54, 75,250, 62,236,248,140, 62, 34,202,182,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0,128, 2,236,169, 32, 63, 22, 57,137, 62, 61, 93, 81, 63, 16,186,206, 62, 72,129, 85, 63, 16,104,250,
- 62, 55,113, 16, 63, 21,152,184, 62, 53, 47,182,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,238, 68,200, 62, 56, 62, 76, 62,237,187,192, 62, 73,118,194, 62,226,152,122, 62, 62,166,190,
- 62,227,207,183, 62, 54, 75,250,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 22,249,250, 62, 88,251,160, 63, 16, 32,222, 62, 93,106, 34, 63, 16,186,206, 62, 72,129, 85, 63, 22, 57,137,
- 62, 61, 93, 81,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,237,187,192, 62, 73,118,194, 62,239, 19, 21, 62, 94,110,121, 62,225, 83, 90, 62, 90,153, 21, 62,226,152,122, 62, 62,166,190,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 25, 81, 20,
- 62,132, 56, 17, 63, 15,243,206, 62,136,207,182, 63, 16, 32,222, 62, 93,106, 34, 63, 22,249,250, 62, 88,251,160,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,239, 19, 21, 62, 94,110,121,
- 62,239,193, 92, 62,137, 61,113, 62,221, 42, 54, 62,133, 25,209, 62,225, 83, 90, 62, 90,153, 21,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 27,239,111, 62,166, 77,159, 63, 37, 94, 91,
- 62,187,120,107, 63, 30, 21, 66, 62,200,139,178, 63, 12,237,158, 62,187,241, 38,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,211,125,139, 62,200,171,170, 62,197, 28,156, 62,187,130,166,
- 62,216, 21,115, 62,166,177, 14, 62,245,175, 15, 62,188, 14,188,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 37, 94, 91, 62,187,120,107, 63, 43, 57, 87, 62,206, 58,222, 63, 39,163, 24,
- 62,216, 95,174, 63, 30, 21, 66, 62,200,139,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,191,194, 98, 62,216, 94, 42, 62,184,207,130, 62,206, 27, 42, 62,197, 28,156, 62,187,130,166,
- 62,211,125,139, 62,200,171,170,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 43, 57, 87, 62,206, 58,222, 63, 50,229, 38, 62,226, 32,169, 63, 43, 79,177, 62,231,194,202, 63, 39,163, 24,
- 62,216, 95,174,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,183,201, 60, 62,231,218, 82, 62,168, 39,196, 62,226, 11,206, 62,184,207,130, 62,206, 27, 42, 62,191,194, 98, 62,216, 94, 42,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 50,229, 38,
- 62,226, 32,169, 63, 48,134, 62, 62,249,107, 37, 63, 43,190,154, 62,249, 0,192, 63, 43, 79,177, 62,231,194,202,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,182,190,138, 62,249, 49, 35,
- 62,172,229,172, 62,249,127,116, 62,168, 39,196, 62,226, 11,206, 62,183,201, 60, 62,231,218, 82,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 48,134, 62, 62,249,107, 37, 63, 46, 88,238,
- 63, 2,223,146, 63, 40,207,123, 62,254,175,218, 63, 43,190,154, 62,249, 0,192,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,188,184, 2, 62,255, 0,140, 62,177, 87,173, 63, 3, 9,102,
- 62,172,229,172, 62,249,127,116, 62,182,190,138, 62,249, 49, 35,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 46, 88,238, 63, 2,223,146, 63, 34,158,220, 63, 10, 23,175, 63, 30, 77,126,
- 63, 5, 88,156, 63, 40,207,123, 62,254,175,218,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,210, 65, 89, 63, 5,158, 56, 62,201,109,124, 63, 10,121, 72, 62,177, 87,173, 63, 3, 9,102,
- 62,188,184, 2, 62,255, 0,140,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 34,158,220, 63, 10, 23,175, 63, 26,105, 28, 63, 11,194,242, 63, 25,120,244, 63, 7,242, 78, 63, 30, 77,126,
- 63, 5, 88,156,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,220, 39, 0, 63, 8, 58,252, 62,218, 73,220, 63, 12, 31,169, 62,201,109,124, 63, 10,121, 72, 62,210, 65, 89, 63, 5,158, 56,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 26,105, 28,
- 63, 11,194,242, 63, 22,244,173, 63, 11,215,236, 63, 22, 47,202, 63, 8, 60,156, 63, 25,120,244, 63, 7,242, 78,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,226,221, 11, 63, 8,125, 90,
- 62,225, 89,220, 63, 12, 42, 77, 62,218, 73,220, 63, 12, 31,169, 62,220, 39, 0, 63, 8, 58,252,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 22,244,173, 63, 11,215,236, 63, 11,169, 67,
- 63, 11,197, 18, 63, 12,252,106, 63, 3,173,180, 63, 22, 47,202, 63, 8, 60,156,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,245,114, 35, 63, 3,196,233, 62,248, 72, 55, 63, 11,232, 91,
- 62,225, 89,220, 63, 12, 42, 77, 62,226,221, 11, 63, 8,125, 90,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 11,169, 67, 63, 11,197, 18, 63, 3,232,148, 63, 11, 17,164, 63, 3,220,162,
- 63, 0, 88, 45, 63, 12,252,106, 63, 3,173,180,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 63, 3,220,162, 63, 0, 88, 45, 63, 3,232,148, 63, 11, 17,164, 62,248, 72, 55, 63, 11,232, 91,
- 62,245,114, 35, 63, 3,196,233,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 17, 59,103, 62,255,195,120, 63, 22, 81,240, 63, 1, 70,114, 63, 22, 47,202, 63, 8, 60,156, 63, 12,252,106,
- 63, 3,173,180,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,226,221, 11, 63, 8,125, 90, 62,226,128,106, 63, 1,111,198, 62,236,213,209, 62,255,250, 4, 62,245,114, 35, 63, 3,196,233,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 22, 81,240,
- 63, 1, 70,114, 63, 25,182,151, 63, 1, 9,130, 63, 25,120,244, 63, 7,242, 78, 63, 22, 47,202, 63, 8, 60,156,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,220, 39, 0, 63, 8, 58,252,
- 62,219,150,213, 63, 1, 55, 50, 62,226,128,106, 63, 1,111,198, 62,226,221, 11, 63, 8,125, 90,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 30, 49, 96, 62,254,229,121, 63, 30, 77,126,
- 63, 5, 88,156, 63, 25,120,244, 63, 7,242, 78, 63, 25,182,151, 63, 1, 9,130,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,220, 39, 0, 63, 8, 58,252, 62,210, 65, 89, 63, 5,158, 56,
- 62,210,116,176, 62,255, 62,227, 62,219,150,213, 63, 1, 55, 50,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 37,113, 25, 62,247,157, 35, 63, 40,207,123, 62,254,175,218, 63, 30, 77,126,
- 63, 5, 88,156, 63, 30, 49, 96, 62,254,229,121,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,210, 65, 89, 63, 5,158, 56, 62,188,184, 2, 62,255, 0,140, 62,195,165,189, 62,247,232,139,
- 62,210,116,176, 62,255, 62,227,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 39, 62, 92, 62,240, 75,121, 63, 43,190,154, 62,249, 0,192, 63, 40,207,123, 62,254,175,218, 63, 37,113, 25,
- 62,247,157, 35,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,188,184, 2, 62,255, 0,140, 62,182,190,138, 62,249, 49, 35, 62,192, 10,222, 62,240,128,163, 62,195,165,189, 62,247,232,139,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 38,149,140,
- 62,229, 95, 38, 63, 43, 79,177, 62,231,194,202, 63, 43,190,154, 62,249, 0,192, 63, 39, 62, 92, 62,240, 75,121,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,182,190,138, 62,249, 49, 35,
- 62,183,201, 60, 62,231,218, 82, 62,193,140,168, 62,229,129, 94, 62,192, 10,222, 62,240,128,163,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 33,120, 14, 62,214,238,166, 63, 39,163, 24,
- 62,216, 95,174, 63, 43, 79,177, 62,231,194,202, 63, 38,149,140, 62,229, 95, 38,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,183,201, 60, 62,231,218, 82, 62,191,194, 98, 62,216, 94, 42,
- 62,204, 75,168, 62,215, 7, 62, 62,193,140,168, 62,229,129, 94,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 27,178,165, 62,208, 17,128, 63, 30, 21, 66, 62,200,139,178, 63, 39,163, 24,
- 62,216, 95,174, 63, 33,120, 14, 62,214,238,166,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,191,194, 98, 62,216, 94, 42, 62,211,125,139, 62,200,171,170, 62,216, 24, 6, 62,208, 57,128,
- 62,204, 75,168, 62,215, 7, 62,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 17, 97, 15, 62,214, 34,220, 63, 12,237,158, 62,187,241, 38, 63, 30, 21, 66, 62,200,139,178, 63, 27,178,165,
- 62,208, 17,128,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,211,125,139, 62,200,171,170, 62,245,175, 15, 62,188, 14,188, 62,236,200,217, 62,214, 49,134, 62,216, 24, 6, 62,208, 57,128,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 17, 97, 15,
- 62,214, 34,220, 63, 14,244,149, 62,221, 42, 4, 63, 3,230,147, 62,208, 47, 78, 63, 12,237,158, 62,187,241, 38,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 3,230,147, 62,208, 47, 78,
- 62,241,144,141, 62,221, 52,244, 62,236,200,217, 62,214, 49,134, 62,245,175, 15, 62,188, 14,188,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 17, 59,103, 62,255,195,120, 63, 12,252,106,
- 63, 3,173,180, 63, 3,220,162, 63, 0, 88, 45, 63, 13, 25, 71, 62,243,163,116,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 3,220,162, 63, 0, 88, 45, 62,245,114, 35, 63, 3,196,233,
- 62,236,213,209, 62,255,250, 4, 62,245, 45, 0, 62,243,185,206,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 13, 25, 71, 62,243,163,116, 63, 3,220,162, 63, 0, 88, 45, 63, 3,220,215,
- 62,231,189,148, 63, 13, 2, 64, 62,230,215, 52,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 63, 3,220,215, 62,231,189,148, 63, 3,220,162, 63, 0, 88, 45, 62,245, 45, 0, 62,243,185,206,
- 62,245,100,219, 62,230,230,184,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 3,230,147, 62,208, 47, 78, 63, 14,244,149, 62,221, 42, 4, 63, 13, 2, 64, 62,230,215, 52, 63, 3,220,215,
- 62,231,189,148,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,245,100,219, 62,230,230,184, 62,241,144,141, 62,221, 52,244, 63, 3,230,147, 62,208, 47, 78, 63, 3,220,215, 62,231,189,148,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 7, 61,250,
- 62, 54, 31,148, 63, 3,202,193, 62, 49,174,214, 63, 3,199,220, 62, 24,219, 89, 63, 13,190, 79, 62, 46,193,160,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 3,199,220, 62, 24,219, 89,
- 63, 3,202,193, 62, 49,174,214, 63, 0, 87,175, 62, 54, 90,251, 62,243,150, 14, 62, 47, 79,204,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 9,214, 68, 62, 66,237,246, 63, 7, 61,250,
- 62, 54, 31,148, 63, 13,190, 79, 62, 46,193,160, 63, 16,104,250, 62, 55,113, 16,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,243,150, 14, 62, 47, 79,204, 63, 0, 87,175, 62, 54, 90,251,
- 62,251,137,104, 62, 67, 92,179, 62,238, 68,200, 62, 56, 62, 76,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 8,221,237, 62, 91, 90,218, 63, 9,214, 68, 62, 66,237,246, 63, 16,104,250,
- 62, 55,113, 16, 63, 16,186,206, 62, 72,129, 85,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,238, 68,200, 62, 56, 62, 76, 62,251,137,104, 62, 67, 92,179, 62,253,153, 39, 62, 91,195, 27,
- 62,237,187,192, 62, 73,118,194,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 15,243,206, 62,136,207,182, 63, 8, 32, 77, 62,139, 39, 10, 63, 9,117, 22, 62, 97,203,146, 63, 16, 32,222,
- 62, 93,106, 34,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,252,110,192, 62, 98, 68, 79, 62,255, 89,219, 62,139, 79,116, 62,239,193, 92, 62,137, 61,113, 62,239, 19, 21, 62, 94,110,121,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 8,221,237,
- 62, 91, 90,218, 63, 16,186,206, 62, 72,129, 85, 63, 16, 32,222, 62, 93,106, 34, 63, 9,117, 22, 62, 97,203,146,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,239, 19, 21, 62, 94,110,121,
- 62,237,187,192, 62, 73,118,194, 62,253,153, 39, 62, 91,195, 27, 62,252,110,192, 62, 98, 68, 79,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 9,125,119, 62,158,112, 7, 63, 3,233, 70,
- 62,154, 27, 88, 63, 3,229,235, 62,139,108, 97, 63, 8, 32, 77, 62,139, 39, 10,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 3,229,235, 62,139,108, 97, 63, 3,233, 70, 62,154, 27, 88,
- 62,252,179,165, 62,158,140,163, 62,255, 89,219, 62,139, 79,116,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 9,117, 22, 62, 97,203,146, 63, 8, 32, 77, 62,139, 39, 10, 63, 3,229,235,
- 62,139,108, 97, 63, 3,215,246, 62,101, 56,143,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 63, 3,229,235, 62,139,108, 97, 62,255, 89,219, 62,139, 79,116, 62,252,110,192, 62, 98, 68, 79,
- 63, 3,215,246, 62,101, 56,143,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 3,210,147, 62, 86, 95,221, 63, 8,221,237, 62, 91, 90,218, 63, 9,117, 22, 62, 97,203,146, 63, 3,215,246,
- 62,101, 56,143,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,252,110,192, 62, 98, 68, 79, 62,253,153, 39, 62, 91,195, 27, 63, 3,210,147, 62, 86, 95,221, 63, 3,215,246, 62,101, 56,143,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 12, 54, 5,
- 62,167,183,188, 63, 9, 61,250, 62,168,214,252, 63, 8,143,152, 62,163,107, 45, 63, 9,125,119, 62,158,112, 7,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,254,136,100, 62,163,123, 38,
- 62,253, 39,110, 62,168,224,103, 62,247, 68, 98, 62,167,206,146, 62,252,179,165, 62,158,140,163,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 10,196,135, 62,178,208, 52, 63, 8,233, 25,
- 62,175,110,116, 63, 9, 61,250, 62,168,214,252, 63, 12, 54, 5, 62,167,183,188,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,253, 39,110, 62,168,224,103, 62,253,195,102, 62,175,102,184,
- 62,250, 14, 98, 62,178,202,149, 62,247, 68, 98, 62,167,206,146,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 4, 17, 69, 62,182,176,105, 63, 6,138, 69, 62,177,180, 80, 63, 8,233, 25,
- 62,175,110,116, 63, 10,196,135, 62,178,208, 52,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,253,195,102, 62,175,102,184, 63, 1, 49, 14, 62,177,150, 62, 63, 4, 17, 69, 62,182,176,105,
- 62,250, 14, 98, 62,178,202,149,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 3,124,209, 62,177, 0, 70, 63, 3,232, 11, 62,174, 4,140, 63, 6,138, 69, 62,177,180, 80, 63, 4, 17, 69,
- 62,182,176,105,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 63, 1, 49, 14, 62,177,150, 62, 63, 3,232, 11, 62,174, 4,140, 63, 3,124,209, 62,177, 0, 70, 63, 4, 17, 69, 62,182,176,105,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 3,233, 70,
- 62,154, 27, 88, 63, 9,125,119, 62,158,112, 7, 63, 8,143,152, 62,163,107, 45, 63, 3,232,212, 62,158,152, 58,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,254,136,100, 62,163,123, 38,
- 62,252,179,165, 62,158,140,163, 63, 3,233, 70, 62,154, 27, 88, 63, 3,232,212, 62,158,152, 58,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 3,232,212, 62,158,152, 58, 63, 8,143,152,
- 62,163,107, 45, 63, 7, 91,121, 62,166, 51,134, 63, 3,231,205, 62,162,149, 58,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 0,116, 44, 62,166, 56,255, 62,254,136,100, 62,163,123, 38,
- 63, 3,232,212, 62,158,152, 58, 63, 3,231,205, 62,162,149, 58,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 3,232, 11, 62,174, 4,140, 63, 3,233,214, 62,170,154,198, 63, 6,110,233,
- 62,174,152, 94, 63, 6,138, 69, 62,177,180, 80,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 63, 1, 82,228, 62,174,140, 95, 63, 3,233,214, 62,170,154,198, 63, 3,232, 11, 62,174, 4,140,
- 63, 1, 49, 14, 62,177,150, 62,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 6,138, 69, 62,177,180, 80, 63, 6,110,233, 62,174,152, 94, 63, 7,236, 59, 62,173,123, 19, 63, 8,233, 25,
- 62,175,110,116,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,255,185,217, 62,173,116, 92, 63, 1, 82,228, 62,174,140, 95, 63, 1, 49, 14, 62,177,150, 62, 62,253,195,102, 62,175,102,184,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 8,233, 25,
- 62,175,110,116, 63, 7,236, 59, 62,173,123, 19, 63, 7,249, 85, 62,169, 52, 92, 63, 9, 61,250, 62,168,214,252,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,255,169,160, 62,169, 57, 6,
- 62,255,185,217, 62,173,116, 92, 62,253,195,102, 62,175,102,184, 62,253, 39,110, 62,168,224,103,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 9, 61,250, 62,168,214,252, 63, 7,249, 85,
- 62,169, 52, 92, 63, 7, 91,121, 62,166, 51,134, 63, 8,143,152, 62,163,107, 45,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 0,116, 44, 62,166, 56,255, 62,255,169,160, 62,169, 57, 6,
- 62,253, 39,110, 62,168,224,103, 62,254,136,100, 62,163,123, 38,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 3,233,214, 62,170,154,198, 63, 7,249, 85, 62,169, 52, 92, 63, 7,236, 59,
- 62,173,123, 19, 63, 6,110,233, 62,174,152, 94,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,255,185,217, 62,173,116, 92, 62,255,169,160, 62,169, 57, 6, 63, 3,233,214, 62,170,154,198,
- 63, 1, 82,228, 62,174,140, 95,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 3,233,214, 62,170,154,198, 63, 3,231,205, 62,162,149, 58, 63, 7, 91,121, 62,166, 51,134, 63, 7,249, 85,
- 62,169, 52, 92,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 63, 0,116, 44, 62,166, 56,255, 63, 3,231,205, 62,162,149, 58, 63, 3,233,214, 62,170,154,198, 62,255,169,160, 62,169, 57, 6,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 4, 17, 69,
- 62,182,176,105, 63, 10,196,135, 62,178,208, 52, 63, 12,237,158, 62,187,241, 38, 63, 3,230,147, 62,208, 47, 78,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,245,175, 15, 62,188, 14,188,
- 62,250, 14, 98, 62,178,202,149, 63, 4, 17, 69, 62,182,176,105, 63, 3,230,147, 62,208, 47, 78,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 10,196,135, 62,178,208, 52, 63, 12, 54, 5,
- 62,167,183,188, 63, 16, 0,112, 62,164,246,254, 63, 12,237,158, 62,187,241, 38,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,239,187,207, 62,165, 42, 19, 62,247, 68, 98, 62,167,206,146,
- 62,250, 14, 98, 62,178,202,149, 62,245,175, 15, 62,188, 14,188,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 12, 54, 5, 62,167,183,188, 63, 9,125,119, 62,158,112, 7, 63, 15,250, 44,
- 62,154, 0,109, 63, 16, 0,112, 62,164,246,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,239,205, 56, 62,154, 71, 8, 62,252,179,165, 62,158,140,163, 62,247, 68, 98, 62,167,206,146,
- 62,239,187,207, 62,165, 42, 19,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 9,125,119, 62,158,112, 7, 63, 8, 32, 77, 62,139, 39, 10, 63, 15,243,206, 62,136,207,182, 63, 15,250, 44,
- 62,154, 0,109,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,239,193, 92, 62,137, 61,113, 62,255, 89,219, 62,139, 79,116, 62,252,179,165, 62,158,140,163, 62,239,205, 56, 62,154, 71, 8,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 25, 81, 20,
- 62,132, 56, 17, 63, 27, 46,208, 62,148, 35,149, 63, 15,250, 44, 62,154, 0,109, 63, 15,243,206, 62,136,207,182,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,239,205, 56, 62,154, 71, 8,
- 62,217,166,238, 62,148,221,229, 62,221, 42, 54, 62,133, 25,209, 62,239,193, 92, 62,137, 61,113,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 27, 46,208, 62,148, 35,149, 63, 27,177, 36,
- 62,156,151,158, 63, 16, 0,112, 62,164,246,254, 63, 15,250, 44, 62,154, 0,109,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,239,187,207, 62,165, 42, 19, 62,216,160, 0, 62,157, 44,127,
- 62,217,166,238, 62,148,221,229, 62,239,205, 56, 62,154, 71, 8,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 27,239,111, 62,166, 77,159, 63, 12,237,158, 62,187,241, 38, 63, 16, 0,112,
- 62,164,246,254, 63, 27,177, 36, 62,156,151,158,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,239,187,207, 62,165, 42, 19, 62,245,175, 15, 62,188, 14,188, 62,216, 21,115, 62,166,177, 14,
- 62,216,160, 0, 62,157, 44,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 8,221,237, 62, 91, 90,218, 63, 3,210,147, 62, 86, 95,221, 63, 3,211,129, 62, 83,168,248, 63, 8, 33,170,
- 62, 86,149,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 63, 3,211,129, 62, 83,168,248, 63, 3,210,147, 62, 86, 95,221, 62,253,153, 39, 62, 91,195, 27, 62,255, 14, 8, 62, 86,232, 58,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 9,214, 68,
- 62, 66,237,246, 63, 8,221,237, 62, 91, 90,218, 63, 8, 33,170, 62, 86,149,254, 63, 8,180, 20, 62, 69, 29, 94,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,255, 14, 8, 62, 86,232, 58,
- 62,253,153, 39, 62, 91,195, 27, 62,251,137,104, 62, 67, 92,179, 62,253,210, 19, 62, 69,114, 55,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 7, 61,250, 62, 54, 31,148, 63, 9,214, 68,
- 62, 66,237,246, 63, 8,180, 20, 62, 69, 29, 94, 63, 6, 82,168, 62, 57, 43, 80,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,253,210, 19, 62, 69,114, 55, 62,251,137,104, 62, 67, 92,179,
- 63, 0, 87,175, 62, 54, 90,251, 63, 1, 68, 48, 62, 57, 84,166,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 3,202,193, 62, 49,174,214, 63, 7, 61,250, 62, 54, 31,148, 63, 6, 82,168,
- 62, 57, 43, 80, 63, 3,202,205, 62, 54, 22, 8,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 63, 1, 68, 48, 62, 57, 84,166, 63, 0, 87,175, 62, 54, 90,251, 63, 3,202,193, 62, 49,174,214,
- 63, 3,202,205, 62, 54, 22, 8,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 3,202,205, 62, 54, 22, 8, 63, 6, 82,168, 62, 57, 43, 80, 63, 5, 24,246, 62, 66,150, 26, 63, 3,205,213,
- 62, 64,232,220,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 63, 2,131, 29, 62, 66,172, 22, 63, 1, 68, 48, 62, 57, 84,166, 63, 3,202,205, 62, 54, 22, 8, 63, 3,205,213, 62, 64,232,220,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 6, 82,168,
- 62, 57, 43, 80, 63, 8,180, 20, 62, 69, 29, 94, 63, 6, 83, 39, 62, 70,114,191, 63, 5, 24,246, 62, 66,150, 26,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 1, 75,185, 62, 70,160,222,
- 62,253,210, 19, 62, 69,114, 55, 63, 1, 68, 48, 62, 57, 84,166, 63, 2,131, 29, 62, 66,172, 22,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 8,180, 20, 62, 69, 29, 94, 63, 8, 33,170,
- 62, 86,149,254, 63, 6,111, 4, 62, 76,172, 40, 63, 6, 83, 39, 62, 70,114,191,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 1, 51,157, 62, 76,218,158, 62,255, 14, 8, 62, 86,232, 58,
- 62,253,210, 19, 62, 69,114, 55, 63, 1, 75,185, 62, 70,160,222,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 8, 33,170, 62, 86,149,254, 63, 3,211,129, 62, 83,168,248, 63, 3,208,234,
- 62, 75, 43,146, 63, 6,111, 4, 62, 76,172, 40,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 63, 3,208,234, 62, 75, 43,146, 63, 3,211,129, 62, 83,168,248, 62,255, 14, 8, 62, 86,232, 58,
- 63, 1, 51,157, 62, 76,218,158,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 3,208,234, 62, 75, 43,146, 63, 3,205,213, 62, 64,232,220, 63, 5, 24,246, 62, 66,150, 26, 63, 6,111, 4,
- 62, 76,172, 40,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 63, 2,131, 29, 62, 66,172, 22, 63, 3,205,213, 62, 64,232,220, 63, 3,208,234, 62, 75, 43,146, 63, 1, 51,157, 62, 76,218,158,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 6,111, 4,
- 62, 76,172, 40, 63, 5, 24,246, 62, 66,150, 26, 63, 6, 83, 39, 62, 70,114,191, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 1, 75,185, 62, 70,160,222,
- 63, 2,131, 29, 62, 66,172, 22, 63, 1, 51,157, 62, 76,218,158, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 13, 2, 64, 62,230,215, 52, 63, 14,244,149,
- 62,221, 42, 4, 63, 16,216, 4, 62,224, 24,160, 63, 15,200,120, 62,231,255, 84,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,237,193,119, 62,224, 38,190, 62,241,144,141, 62,221, 52,244,
- 62,245,100,219, 62,230,230,184, 62,239,211, 21, 62,232, 18,185,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 13, 25, 71, 62,243,163,116, 63, 13, 2, 64, 62,230,215, 52, 63, 15,200,120,
- 62,231,255, 84, 63, 16,171,184, 62,241,133, 40,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,239,211, 21, 62,232, 18,185, 62,245,100,219, 62,230,230,184, 62,245, 45, 0, 62,243,185,206,
- 62,237,252,218, 62,241,160, 62,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 17, 59,103, 62,255,195,120, 63, 13, 25, 71, 62,243,163,116, 63, 16,171,184, 62,241,133, 40, 63, 19, 44, 55,
- 62,250, 21, 86,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,237,252,218, 62,241,160, 62, 62,245, 45, 0, 62,243,185,206, 62,236,213,209, 62,255,250, 4, 62,232,228,153, 62,250, 67,154,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 14,244,149,
- 62,221, 42, 4, 63, 17, 97, 15, 62,214, 34,220, 63, 19, 53,217, 62,218,211, 16, 63, 16,216, 4, 62,224, 24,160,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,233, 14, 8, 62,218,226, 66,
- 62,236,200,217, 62,214, 49,134, 62,241,144,141, 62,221, 52,244, 62,237,193,119, 62,224, 38,190,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 17, 97, 15, 62,214, 34,220, 63, 27,178,165,
- 62,208, 17,128, 63, 26,198,205, 62,214,184,124, 63, 19, 53,217, 62,218,211, 16,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,217,214,216, 62,214,224,218, 62,216, 24, 6, 62,208, 57,128,
- 62,236,200,217, 62,214, 49,134, 62,233, 14, 8, 62,218,226, 66,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 27,178,165, 62,208, 17,128, 63, 33,120, 14, 62,214,238,166, 63, 31,136,156,
- 62,219,138,194, 63, 26,198,205, 62,214,184,124,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,208, 30,254, 62,219,177,204, 62,204, 75,168, 62,215, 7, 62, 62,216, 24, 6, 62,208, 57,128,
- 62,217,214,216, 62,214,224,218,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 33,120, 14, 62,214,238,166, 63, 38,149,140, 62,229, 95, 38, 63, 36, 9, 79, 62,229,224, 94, 63, 31,136,156,
- 62,219,138,194,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,198,192,148, 62,230, 11,182, 62,193,140,168, 62,229,129, 94, 62,204, 75,168, 62,215, 7, 62, 62,208, 30,254, 62,219,177,204,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 38,149,140,
- 62,229, 95, 38, 63, 39, 62, 92, 62,240, 75,121, 63, 36, 49, 14, 62,239, 88,253, 63, 36, 9, 79, 62,229,224, 94,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,198, 71, 97, 62,239,149,192,
- 62,192, 10,222, 62,240,128,163, 62,193,140,168, 62,229,129, 94, 62,198,192,148, 62,230, 11,182,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 39, 62, 92, 62,240, 75,121, 63, 37,113, 25,
- 62,247,157, 35, 63, 35, 33,243, 62,245,143, 80, 63, 36, 49, 14, 62,239, 88,253,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,200, 99, 87, 62,245,217,172, 62,195,165,189, 62,247,232,139,
- 62,192, 10,222, 62,240,128,163, 62,198, 71, 97, 62,239,149,192,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 37,113, 25, 62,247,157, 35, 63, 30, 49, 96, 62,254,229,121, 63, 29, 49,223,
- 62,250,140,199, 63, 35, 33,243, 62,245,143, 80,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,212,124,147, 62,250,215,146, 62,210,116,176, 62,255, 62,227, 62,195,165,189, 62,247,232,139,
- 62,200, 99, 87, 62,245,217,172,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 30, 49, 96, 62,254,229,121, 63, 25,182,151, 63, 1, 9,130, 63, 25,181, 50, 62,253,111,118, 63, 29, 49,223,
- 62,250,140,199,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,219,151, 52, 62,253,186, 68, 62,219,150,213, 63, 1, 55, 50, 62,210,116,176, 62,255, 62,227, 62,212,124,147, 62,250,215,146,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 25,182,151,
- 63, 1, 9,130, 63, 22, 81,240, 63, 1, 70,114, 63, 22,188,241, 62,253,149, 28, 63, 25,181, 50, 62,253,111,118,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,225,163,212, 62,253,215, 91,
- 62,226,128,106, 63, 1,111,198, 62,219,150,213, 63, 1, 55, 50, 62,219,151, 52, 62,253,186, 68,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 22, 81,240, 63, 1, 70,114, 63, 17, 59,103,
- 62,255,195,120, 63, 19, 44, 55, 62,250, 21, 86, 63, 22,188,241, 62,253,149, 28,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,232,228,153, 62,250, 67,154, 62,236,213,209, 62,255,250, 4,
- 62,226,128,106, 63, 1,111,198, 62,225,163,212, 62,253,215, 91,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 22,188,241, 62,253,149, 28, 63, 19, 44, 55, 62,250, 21, 86, 63, 20,165, 9,
- 62,247, 99,248, 63, 23, 0, 20, 62,251, 57, 6,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,229,232,232, 62,247,142, 74, 62,232,228,153, 62,250, 67,154, 62,225,163,212, 62,253,215, 91,
- 62,225, 26,145, 62,251,116,114,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 25,181, 50, 62,253,111,118, 63, 22,188,241, 62,253,149, 28, 63, 23, 0, 20, 62,251, 57, 6, 63, 25,144,130,
- 62,251, 7,128,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,225, 26,145, 62,251,116,114, 62,225,163,212, 62,253,215, 91, 62,219,151, 52, 62,253,186, 68, 62,219,225,177, 62,251, 75, 67,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 29, 49,223,
- 62,250,140,199, 63, 25,181, 50, 62,253,111,118, 63, 25,144,130, 62,251, 7,128, 63, 28,195, 80, 62,248,166, 55,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,219,225,177, 62,251, 75, 67,
- 62,219,151, 52, 62,253,186, 68, 62,212,124,147, 62,250,215,146, 62,213, 95,233, 62,248,237, 20,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 35, 33,243, 62,245,143, 80, 63, 29, 49,223,
- 62,250,140,199, 63, 28,195, 80, 62,248,166, 55, 63, 33,164, 22, 62,243, 75,102,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,213, 95,233, 62,248,237, 20, 62,212,124,147, 62,250,215,146,
- 62,200, 99, 87, 62,245,217,172, 62,203,114, 65, 62,243,143,159,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 36, 49, 14, 62,239, 88,253, 63, 35, 33,243, 62,245,143, 80, 63, 33,164, 22,
- 62,243, 75,102, 63, 34,160, 30, 62,238, 47,169,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,203,114, 65, 62,243,143,159, 62,200, 99, 87, 62,245,217,172, 62,198, 71, 97, 62,239,149,192,
- 62,201,128,188, 62,238,110,126,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 36, 9, 79, 62,229,224, 94, 63, 36, 49, 14, 62,239, 88,253, 63, 34,160, 30, 62,238, 47,169, 63, 34,144,131,
- 62,231, 87,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,201,128,188, 62,238,110,126, 62,198, 71, 97, 62,239,149,192, 62,198,192,148, 62,230, 11,182, 62,201,190,141, 62,231,140,124,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 31,136,156,
- 62,219,138,194, 63, 36, 9, 79, 62,229,224, 94, 63, 34,144,131, 62,231, 87,253, 63, 30,208, 21, 62,221,182,174,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,201,190,141, 62,231,140,124,
- 62,198,192,148, 62,230, 11,182, 62,208, 30,254, 62,219,177,204, 62,209,133,168, 62,221,221, 51,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 26,198,205, 62,214,184,124, 63, 31,136,156,
- 62,219,138,194, 63, 30,208, 21, 62,221,182,174, 63, 26,218,128, 62,217,206, 68,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,209,133,168, 62,221,221, 51, 62,208, 30,254, 62,219,177,204,
- 62,217,214,216, 62,214,224,218, 62,217,157, 11, 62,217,243, 64,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 19, 53,217, 62,218,211, 16, 63, 26,198,205, 62,214,184,124, 63, 26,218,128,
- 62,217,206, 68, 63, 20, 53,103, 62,221, 84,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,217,157, 11, 62,217,243, 64, 62,217,214,216, 62,214,224,218, 62,233, 14, 8, 62,218,226, 66,
- 62,231, 5, 68, 62,221,101,234,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 16,216, 4, 62,224, 24,160, 63, 19, 53,217, 62,218,211, 16, 63, 20, 53,103, 62,221, 84,236, 63, 18, 87, 81,
- 62,226,175, 33,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,231, 5, 68, 62,221,101,234, 62,233, 14, 8, 62,218,226, 66, 62,237,193,119, 62,224, 38,190, 62,234,187,180, 62,226,190,249,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 19, 44, 55,
- 62,250, 21, 86, 63, 16,171,184, 62,241,133, 40, 63, 18, 68, 98, 62,240,197,150, 63, 20,165, 9, 62,247, 99,248,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,234,197, 35, 62,240,226,215,
- 62,237,252,218, 62,241,160, 62, 62,232,228,153, 62,250, 67,154, 62,229,232,232, 62,247,142, 74,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 16,171,184, 62,241,133, 40, 63, 15,200,120,
- 62,231,255, 84, 63, 18, 4,161, 62,232,184,138, 63, 18, 68, 98, 62,240,197,150,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,235, 85,154, 62,232,206, 92, 62,239,211, 21, 62,232, 18,185,
- 62,237,252,218, 62,241,160, 62, 62,234,197, 35, 62,240,226,215,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 15,200,120, 62,231,255, 84, 63, 16,216, 4, 62,224, 24,160, 63, 18, 87, 81,
- 62,226,175, 33, 63, 18, 4,161, 62,232,184,138,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,234,187,180, 62,226,190,249, 62,237,193,119, 62,224, 38,190, 62,239,211, 21, 62,232, 18,185,
- 62,235, 85,154, 62,232,206, 92,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 3,232,148, 63, 11, 17,164, 63, 11,169, 67, 63, 11,197, 18, 63, 13,120,216, 63, 23, 81,160, 63, 4, 15,147,
- 63, 23,248,227,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,245, 27, 64, 63, 23,166,100, 62,248, 72, 55, 63, 11,232, 91, 63, 3,232,148, 63, 11, 17,164, 63, 4, 15,147, 63, 23,248,227,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 11,169, 67,
- 63, 11,197, 18, 63, 22,244,173, 63, 11,215,236, 63, 23,233, 94, 63, 16, 60,186, 63, 13,120,216, 63, 23, 81,160,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,223,130,109, 63, 16,165,118,
- 62,225, 89,220, 63, 12, 42, 77, 62,248, 72, 55, 63, 11,232, 91, 62,245, 27, 64, 63, 23,166,100,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 22,244,173, 63, 11,215,236, 63, 26,105, 28,
- 63, 11,194,242, 63, 28, 56,220, 63, 14,250, 66, 63, 23,233, 94, 63, 16, 60,186,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,214,161,157, 63, 15,110,219, 62,218, 73,220, 63, 12, 31,169,
- 62,225, 89,220, 63, 12, 42, 77, 62,223,130,109, 63, 16,165,118,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 26,105, 28, 63, 11,194,242, 63, 34,158,220, 63, 10, 23,175, 63, 39, 44,109,
- 63, 19,221,107, 63, 28, 56,220, 63, 14,250, 66,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,192, 26,156, 63, 20,139, 31, 62,201,109,124, 63, 10,121, 72, 62,218, 73,220, 63, 12, 31,169,
- 62,214,161,157, 63, 15,110,219,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 34,158,220, 63, 10, 23,175, 63, 46, 88,238, 63, 2,223,146, 63, 56, 80,242, 63, 6,244, 44, 63, 39, 44,109,
- 63, 19,221,107,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32,
- 62,156,208, 61, 63, 7, 16,204, 62,177, 87,173, 63, 3, 9,102, 62,201,109,124, 63, 10,121, 72, 62,192, 26,156, 63, 20,139, 31,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 63, 46, 88,238,
- 63, 2,223,146, 63, 48,134, 62, 62,249,107, 37, 63, 54,173,195, 62,252,106,239, 63, 56, 80,242, 63, 6,244, 44,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128, 2,236,169, 32, 62,160, 36,202, 62,252, 51, 94,
- 62,172,229,172, 62,249,127,116, 62,177, 87,173, 63, 3, 9,102, 62,156,208, 61, 63, 7, 16,204,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128, 2,236,169, 32, 63, 48,134, 62, 62,249,107, 37, 63, 50,229, 38,
- 62,226, 32,169, 63, 53, 88,154, 62,221,146,240, 63, 54,173,195, 62,252,106,239,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32, 62,162,172,128, 62,221,169, 17, 62,168, 39,196, 62,226, 11,206,
- 62,172,229,172, 62,249,127,116, 62,160, 36,202, 62,252, 51, 94,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 63, 50,229, 38, 62,226, 32,169, 63, 43, 57, 87, 62,206, 58,222, 63, 49,117,240,
- 62,198,138,164, 63, 53, 88,154, 62,221,146,240,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,128, 2,236,169, 32, 62,172,137,147, 62,198, 19,148, 62,184,207,130, 62,206, 27, 42, 62,168, 39,196, 62,226, 11,206,
- 62,162,172,128, 62,221,169, 17,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128,
- 2,236,169, 32, 63, 43, 57, 87, 62,206, 58,222, 63, 37, 94, 91, 62,187,120,107, 63, 41,160,156, 62,182,175, 56, 63, 49,117,240,
- 62,198,138,164,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,188,212,202, 62,182,163,245, 62,197, 28,156, 62,187,130,166, 62,184,207,130, 62,206, 27, 42, 62,172,137,147, 62,198, 19,148,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 48,252,165,
- 62, 85, 33,133, 63, 48, 54,112, 62, 96, 19, 20, 63, 46, 36,172, 62,129, 7,208, 63, 42, 17,240, 62, 97, 84,129,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,181, 71, 76, 62,131,200,204,
- 62,175,121,117, 62,106,185,183, 62,172, 24,217, 62, 92,237, 21, 62,187, 81,138, 62,103, 40, 59,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 48, 89,204, 62, 4,194,134, 63, 48,252,165,
- 62, 85, 33,133, 63, 42, 17,240, 62, 97, 84,129, 63, 37,125,160, 62, 46,211, 50,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 62,187, 81,138, 62,103, 40, 59, 62,172, 24,217, 62, 92,237, 21,
- 62,172,197, 94, 62, 4,200,109, 62,195,121, 25, 62, 48,253, 46,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32, 63, 20, 44, 11, 61,163, 26, 20, 63, 48, 89,204, 62, 4,194,134, 63, 37,125,160,
- 62, 46,211, 50, 63, 24, 92, 40, 62, 21,184,214,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 32, 2,236,169, 32, 62,195,121, 25, 62, 48,253, 46, 62,172,197, 94, 62, 4,200,109, 62,230,122,140, 61,161,248,202,
- 62,222, 13,216, 62, 22,116,222,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 32,
- 2,236,169, 32, 63, 16,254,174, 62, 34, 45, 94, 63, 3,199,219, 61,229, 28, 18, 63, 20, 44, 11, 61,163, 26, 20, 63, 24, 92, 40,
- 62, 21,184,214,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32,
- 62,230,122,140, 61,161,248,202, 63, 3,199,219, 61,229, 28, 18, 62,236,248,140, 62, 34,202,182, 62,222, 13,216, 62, 22,116,222,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32, 63, 21,152,184,
- 62, 53, 47,182, 63, 16,254,174, 62, 34, 45, 94, 63, 24, 92, 40, 62, 21,184,214, 63, 25, 52,209, 62, 51,140, 76,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 32, 2,236,169, 32, 62,222, 13,216, 62, 22,116,222,
- 62,236,248,140, 62, 34,202,182, 62,227,207,183, 62, 54, 75,250, 62,220,137,229, 62, 52,228,185,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 32, 2,236,169, 32, 63, 22, 57,137, 62, 61, 93, 81, 63, 21,152,184,
- 62, 53, 47,182, 63, 25, 52,209, 62, 51,140, 76, 63, 30,166,193, 62, 73,168,114,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,220,137,229, 62, 52,228,185, 62,227,207,183, 62, 54, 75,250,
- 62,226,152,122, 62, 62,166,190, 62,209,198, 54, 62, 75,240, 18,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 22,249,250, 62, 88,251,160, 63, 22, 57,137, 62, 61, 93, 81, 63, 30,166,193,
- 62, 73,168,114, 63, 36, 0, 75, 62,116, 47,229,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,209,198, 54, 62, 75,240, 18, 62,226,152,122, 62, 62,166,190, 62,225, 83, 90, 62, 90,153, 21,
- 62,199,231,211, 62,119,237,216,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 30,166,193, 62, 73,168,114, 63, 37,125,160, 62, 46,211, 50, 63, 42, 17,240, 62, 97, 84,129, 63, 36, 0, 75,
- 62,116, 47,229,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,187, 81,138, 62,103, 40, 59, 62,195,121, 25, 62, 48,253, 46, 62,209,198, 54, 62, 75,240, 18, 62,199,231,211, 62,119,237,216,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 30,166,193,
- 62, 73,168,114, 63, 25, 52,209, 62, 51,140, 76, 63, 24, 92, 40, 62, 21,184,214, 63, 37,125,160, 62, 46,211, 50,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,222, 13,216, 62, 22,116,222,
- 62,220,137,229, 62, 52,228,185, 62,209,198, 54, 62, 75,240, 18, 62,195,121, 25, 62, 48,253, 46,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 36,163, 37, 62,140,168,191, 63, 36, 0, 75,
- 62,116, 47,229, 63, 42, 17,240, 62, 97, 84,129, 63, 46, 36,172, 62,129, 7,208,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,187, 81,138, 62,103, 40, 59, 62,199,231,211, 62,119,237,216,
- 62,199, 64, 6, 62,142, 6,105, 62,181, 71, 76, 62,131,200,204,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 25, 81, 20, 62,132, 56, 17, 63, 22,249,250, 62, 88,251,160, 63, 36, 0, 75,
- 62,116, 47,229, 63, 36,163, 37, 62,140,168,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,199,231,211, 62,119,237,216, 62,225, 83, 90, 62, 90,153, 21, 62,221, 42, 54, 62,133, 25,209,
- 62,199, 64, 6, 62,142, 6,105,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 27, 46,208, 62,148, 35,149, 63, 36, 60, 91, 62,150,222,221, 63, 33,170,222, 62,158,126, 74, 63, 27,177, 36,
- 62,156,151,158,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,204,234, 72, 62,159, 63, 56, 62,199,245,150, 62,152, 15, 85, 62,217,166,238, 62,148,221,229, 62,216,160, 0, 62,157, 44,127,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 25, 81, 20,
- 62,132, 56, 17, 63, 36,163, 37, 62,140,168,191, 63, 36, 60, 91, 62,150,222,221, 63, 27, 46,208, 62,148, 35,149,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,199,245,150, 62,152, 15, 85,
- 62,199, 64, 6, 62,142, 6,105, 62,221, 42, 54, 62,133, 25,209, 62,217,166,238, 62,148,221,229,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 27,239,111, 62,166, 77,159, 63, 27,177, 36,
- 62,156,151,158, 63, 33,170,222, 62,158,126, 74, 63, 31,212,102, 62,164,192,144,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,204,234, 72, 62,159, 63, 56, 62,216,160, 0, 62,157, 44,127,
- 62,216, 21,115, 62,166,177, 14, 62,208,119, 17, 62,165, 65,201,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 27,239,111, 62,166, 77,159, 63, 31,212,102, 62,164,192,144, 63, 41,160,156,
- 62,182,175, 56, 63, 37, 94, 91, 62,187,120,107,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,188,212,202, 62,182,163,245, 62,208,119, 17, 62,165, 65,201, 62,216, 21,115, 62,166,177, 14,
- 62,197, 28,156, 62,187,130,166,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 62,194,119,104, 63, 82,189,164, 62,212, 73, 23, 63, 90,239,152, 62,205,192,100, 63, 97,238, 46, 62,185, 56, 38,
- 63, 91,154, 72,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32,
- 62,141, 94,228, 63,100,234, 86, 62,150, 66, 84, 63, 94,154,114, 62,173, 86,230, 63, 98, 66, 79, 62,162,143, 20, 63,106,173, 44,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 87,122, 72,
- 62, 62, 8,216, 63, 84,106,202, 62,113,185,137, 63, 72, 77,226, 62,121, 21,204, 63, 71,225,158, 62, 68, 34,113,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 62,137, 32,132, 62,121, 65,181,
- 62,107,179,168, 62,103,127,139, 62,114,147,210, 62, 61,116,212, 62,142,125,248, 62, 80, 4, 30,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32, 63, 71,225,158, 62, 68, 34,113, 63, 72, 77,226,
- 62,121, 21,204, 63, 51, 7, 8, 62,130,186, 5, 63, 49,166, 3, 62, 96, 57,232,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,172,197, 18, 62,133,112, 41, 62,137, 32,132, 62,121, 65,181,
- 62,142,125,248, 62, 80, 4, 30, 62,174,228,121, 62,109, 79, 52,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 49,166, 3, 62, 96, 57,232, 63, 51, 7, 8, 62,130,186, 5, 63, 46, 36,172,
- 62,129, 7,208, 63, 48, 54,112, 62, 96, 19, 20,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,181, 71, 76, 62,131,200,204, 62,172,197, 18, 62,133,112, 41, 62,174,228,121, 62,109, 79, 52,
- 62,175,121,117, 62,106,185,183,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 36,163, 37, 62,140,168,191, 63, 46, 36,172, 62,129, 7,208, 63, 51, 7, 8, 62,130,186, 5, 63, 36, 60, 91,
- 62,150,222,221,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,172,197, 18, 62,133,112, 41, 62,181, 71, 76, 62,131,200,204, 62,199, 64, 6, 62,142, 6,105, 62,199,245,150, 62,152, 15, 85,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 53, 88,154,
- 62,221,146,240, 63, 49,117,240, 62,198,138,164, 63, 69, 19,224, 62,190, 68, 24, 63, 74, 64, 53, 62,224, 31,171,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 62,134, 78,250, 62,186,213,148,
- 62,172,137,147, 62,198, 19,148, 62,162,172,128, 62,221,169, 17, 62,114,112,184, 62,220,169,248,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32, 62,214, 74, 54, 63, 70, 55, 20, 62,233,130, 48,
- 63, 83, 69,188, 62,212, 73, 23, 63, 90,239,152, 62,194,119,104, 63, 82,189,164,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,150, 66, 84, 63, 94,154,114, 62,153, 1, 66, 63, 81,149,245,
- 62,185, 56, 38, 63, 83,110,102, 62,173, 86,230, 63, 98, 66, 79,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 66,242,106, 63, 25, 94,202, 63, 70,100,190, 63, 15,234,222, 63, 77,189, 90,
- 63, 17, 88,233, 63, 74,206, 8, 63, 27,118, 88,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62, 96, 32, 22, 63, 16, 60, 66, 62,125, 87, 86, 63, 15, 5,174, 62,132,187, 78, 63, 24, 44,180,
- 62,108, 79, 26, 63, 26, 1,124,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 74,206, 8, 63, 27,118, 88, 63, 77,189, 90, 63, 17, 88,233, 63, 85,139, 72, 63, 19, 51,103, 63, 85,119,220,
- 63, 31, 71, 77,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62, 64,199, 64, 63, 18, 40, 26, 62, 96, 32, 22, 63, 16, 60, 66, 62,108, 79, 26, 63, 26, 1,124, 62, 67,191, 44, 63, 30, 89, 90,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 85,119,220,
- 63, 31, 71, 77, 63, 85,139, 72, 63, 19, 51,103, 63,100,213,228, 63, 20,156, 72, 63, 96, 82, 18, 63, 34,133,128,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128, 2,236,169, 32, 62, 1, 50,226, 63, 20, 68,184,
- 62, 64,199, 64, 63, 18, 40, 26, 62, 67,191, 44, 63, 30, 89, 90, 62, 24,204,194, 63, 34,186, 32,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128, 2,236,169, 32, 63, 56, 80,242, 63, 6,244, 44, 63, 54,173,195,
- 62,252,106,239, 63, 60,205,115, 62,253,150,213, 63, 64, 14,166, 63, 4, 80, 81,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 62,147, 85,190, 62,252,176, 91, 62,160, 36,202, 62,252, 51, 94,
- 62,156,208, 61, 63, 7, 16,204, 62,140,121,160, 63, 3,197, 74,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32, 63, 64, 14,166, 63, 4, 80, 81, 63, 60,205,115, 62,253,150,213, 63, 73,103, 68,
- 63, 0,248,233, 63, 75, 12,248, 63, 8,206, 64,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,115, 59,144, 62,255,143,102, 62,147, 85,190, 62,252,176, 91, 62,140,121,160, 63, 3,197, 74,
- 62,107,135, 78, 63, 7,182, 88,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 75, 12,248, 63, 8,206, 64, 63, 73,103, 68, 63, 0,248,233, 63, 82,151,239, 63, 3,223, 86, 63, 82,227,181,
- 63, 11,102,189,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62, 77, 17, 82, 63, 2, 98,162, 62,115, 59,144, 62,255,143,102, 62,107,135, 78, 63, 7,182, 88, 62, 75, 98,202, 63, 10, 43,108,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 82,227,181,
- 63, 11,102,189, 63, 82,151,239, 63, 3,223, 86, 63, 91,224, 92, 63, 5,144,239, 63, 90,148,161, 63, 13, 95,146,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 38, 40,178, 63, 3,230, 14,
- 62, 77, 17, 82, 63, 2, 98,162, 62, 75, 98,202, 63, 10, 43,108, 62, 43,162, 10, 63, 12, 50, 8,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,103, 89,120, 63, 2, 76,105, 63,103,179,170,
- 63, 12,105,142, 63, 90,148,161, 63, 13, 95,146, 63, 91,224, 92, 63, 5,144,239,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 43,162, 10, 63, 12, 50, 8, 61,231, 41,168, 63, 11, 83,158,
- 61,234,128,116, 63, 0, 39,200, 62, 38, 40,178, 63, 3,230, 14,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,100,213,228, 63, 20,156, 72, 63, 85,139, 72, 63, 19, 51,103, 63, 90,148,161,
- 63, 13, 95,146, 63,103,179,170, 63, 12,105,142,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62, 43,162, 10, 63, 12, 50, 8, 62, 64,199, 64, 63, 18, 40, 26, 62, 1, 50,226, 63, 20, 68,184,
- 61,231, 41,168, 63, 11, 83,158,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 85,139, 72, 63, 19, 51,103, 63, 77,189, 90, 63, 17, 88,233, 63, 82,227,181, 63, 11,102,189, 63, 90,148,161,
- 63, 13, 95,146,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62, 75, 98,202, 63, 10, 43,108, 62, 96, 32, 22, 63, 16, 60, 66, 62, 64,199, 64, 63, 18, 40, 26, 62, 43,162, 10, 63, 12, 50, 8,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 77,189, 90,
- 63, 17, 88,233, 63, 70,100,190, 63, 15,234,222, 63, 75, 12,248, 63, 8,206, 64, 63, 82,227,181, 63, 11,102,189,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,107,135, 78, 63, 7,182, 88,
- 62,125, 87, 86, 63, 15, 5,174, 62, 96, 32, 22, 63, 16, 60, 66, 62, 75, 98,202, 63, 10, 43,108,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 70,100,190, 63, 15,234,222, 63, 60,235, 82,
- 63, 12, 12, 27, 63, 64, 14,166, 63, 4, 80, 81, 63, 75, 12,248, 63, 8,206, 64,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,140,121,160, 63, 3,197, 74, 62,145,230, 78, 63, 11,225,148,
- 62,125, 87, 86, 63, 15, 5,174, 62,107,135, 78, 63, 7,182, 88,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 57,118, 31, 63, 12, 79,230, 63, 56, 80,242, 63, 6,244, 44, 63, 64, 14,166,
- 63, 4, 80, 81, 63, 60,235, 82, 63, 12, 12, 27,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 32, 2,236,169, 32, 62,140,121,160, 63, 3,197, 74, 62,156,208, 61, 63, 7, 16,204, 62,152,199, 0, 63, 12,133, 13,
- 62,145,230, 78, 63, 11,225,148,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 32,
- 2,236,169, 32, 63, 57,240,195, 63, 23,138, 10, 63, 60,235, 82, 63, 12, 12, 27, 63, 70,100,190, 63, 15,234,222, 63, 66,242,106,
- 63, 25, 94,202,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,125, 87, 86, 63, 15, 5,174, 62,145,230, 78, 63, 11,225,148, 62,150, 7,247, 63, 23, 12, 96, 62,132,187, 78, 63, 24, 44,180,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 13,120,216,
- 63, 23, 81,160, 63, 23,233, 94, 63, 16, 60,186, 63, 28, 56,220, 63, 14,250, 66, 63, 39, 44,109, 63, 19,221,107,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,214,161,157, 63, 15,110,219,
- 62,223,130,109, 63, 16,165,118, 62,245, 27, 64, 63, 23,166,100, 62,192, 26,156, 63, 20,139, 31,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 56, 29,176, 63, 20,206, 88, 63, 57,118, 31,
- 63, 12, 79,230, 63, 60,235, 82, 63, 12, 12, 27, 63, 57,240,195, 63, 23,138, 10,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,145,230, 78, 63, 11,225,148, 62,152,199, 0, 63, 12,133, 13,
- 62,153,211,239, 63, 20,159,220, 62,150, 7,247, 63, 23, 12, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 54,148, 48, 63, 22,206,220, 63, 56, 29,176, 63, 20,206, 88, 63, 57,240,195,
- 63, 23,138, 10, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,150, 7,247, 63, 23, 12, 96, 62,153,211,239, 63, 20,159,220, 62,156,106,108, 63, 22,154,146,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 54,173,195, 62,252,106,239, 63, 53, 88,154, 62,221,146,240, 63, 74, 64, 53, 62,224, 31,171, 63, 60,205,115,
- 62,253,150,213,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 32, 2,236,169, 32,
- 62,114,112,184, 62,220,169,248, 62,162,172,128, 62,221,169, 17, 62,160, 36,202, 62,252, 51, 94, 62,147, 85,190, 62,252,176, 91,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 32, 2,236,169, 32, 63, 74, 64, 53,
- 62,224, 31,171, 63, 81,106,217, 62,232,214, 14, 63, 73,103, 68, 63, 0,248,233, 63, 60,205,115, 62,253,150,213,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,115, 59,144, 62,255,143,102,
- 62, 84, 93, 88, 62,228,105, 50, 62,114,112,184, 62,220,169,248, 62,147, 85,190, 62,252,176, 91,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 81,106,217, 62,232,214, 14, 63, 93,154,106,
- 62,233, 26,226, 63, 82,151,239, 63, 3,223, 86, 63, 73,103, 68, 63, 0,248,233,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 77, 17, 82, 63, 2, 98,162, 62, 33, 1,128, 62,226,210, 70,
- 62, 84, 93, 88, 62,228,105, 50, 62,115, 59,144, 62,255,143,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,103, 89,120, 63, 2, 76,105, 63, 91,224, 92, 63, 5,144,239, 63, 82,151,239,
- 63, 3,223, 86, 63, 93,154,106, 62,233, 26,226,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62, 77, 17, 82, 63, 2, 98,162, 62, 38, 40,178, 63, 3,230, 14, 61,234,128,116, 63, 0, 39,200,
- 62, 33, 1,128, 62,226,210, 70,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 51, 7, 8, 62,130,186, 5, 63, 72, 77,226, 62,121, 21,204, 63, 73,254,154, 62,140, 82,178, 63, 56,188, 90,
- 62,159,207,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,130,249,249, 62,137,175,246, 62,137, 32,132, 62,121, 65,181, 62,172,197, 18, 62,133,112, 41, 62,161, 5,192, 62,159, 40,228,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 69, 19,224,
- 62,190, 68, 24, 63, 56,188, 90, 62,159,207,103, 63, 73,254,154, 62,140, 82,178, 63, 77,217,216, 62,157,228, 7,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128, 2,236,169, 32, 62,130,249,249, 62,137,175,246,
- 62,161, 5,192, 62,159, 40,228, 62,134, 78,250, 62,186,213,148, 62,111,118,154, 62,152,108,120,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128, 2,236,169, 32, 63, 49,117,240, 62,198,138,164, 63, 41,160,156,
- 62,182,175, 56, 63, 56,188, 90, 62,159,207,103, 63, 69, 19,224, 62,190, 68, 24,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,161, 5,192, 62,159, 40,228, 62,188,212,202, 62,182,163,245,
- 62,172,137,147, 62,198, 19,148, 62,134, 78,250, 62,186,213,148,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 41,160,156, 62,182,175, 56, 63, 33,170,222, 62,158,126, 74, 63, 36, 60, 91,
- 62,150,222,221, 63, 56,188, 90, 62,159,207,103,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62,199,245,150, 62,152, 15, 85, 62,204,234, 72, 62,159, 63, 56, 62,188,212,202, 62,182,163,245,
- 62,161, 5,192, 62,159, 40,228,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 36, 60, 91, 62,150,222,221, 63, 51, 7, 8, 62,130,186, 5, 63, 56,188, 90, 62,159,207,103, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62,161, 5,192, 62,159, 40,228, 62,172,197, 18, 62,133,112, 41, 62,199,245,150, 62,152, 15, 85, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 41,160,156,
- 62,182,175, 56, 63, 31,212,102, 62,164,192,144, 63, 33,170,222, 62,158,126, 74, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,204,234, 72, 62,159, 63, 56,
- 62,208,119, 17, 62,165, 65,201, 62,188,212,202, 62,182,163,245, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,245, 44,226, 63, 96,140,129, 62,227,135, 42,
- 63,101, 2, 58, 62,219,168,136, 63, 95,236, 30, 62,238, 30,135, 63, 90, 41,200,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,137,240,216, 63, 93,226, 90, 62,122,103,110, 63, 92,255,236,
- 62,120, 84, 74, 63, 83, 32,104, 62,138,193, 32, 63, 83, 3, 16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62,233,130, 48, 63, 83, 69,188, 62,238, 30,135, 63, 90, 41,200, 62,219,168,136,
- 63, 95,236, 30, 62,212, 73, 23, 63, 90,239,152,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,240, 2,236,169, 32, 62,137,240,216, 63, 93,226, 90, 62,138,193, 32, 63, 83, 3, 16, 62,153, 1, 66, 63, 81,149,245,
- 62,150, 66, 84, 63, 94,154,114,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240,
- 2,236,169, 32, 63, 77,217,216, 62,157,228, 7, 63, 73,254,154, 62,140, 82,178, 63, 90, 61, 33, 62,124,207,195, 63, 90,225,160,
- 62,137,121,110,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32,
- 62, 81,207, 98, 62,110, 1,109, 62,130,249,249, 62,137,175,246, 62,111,118,154, 62,152,108,120, 62, 74,125,166, 62,130, 30,252,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32, 63, 72, 77,226,
- 62,121, 21,204, 63, 84,106,202, 62,113,185,137, 63, 90, 61, 33, 62,124,207,195, 63, 73,254,154, 62,140, 82,178,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 81,207, 98, 62,110, 1,109,
- 62,107,179,168, 62,103,127,139, 62,137, 32,132, 62,121, 65,181, 62,130,249,249, 62,137,175,246,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,212, 73, 23, 63, 90,239,152, 62,219,168,136,
- 63, 95,236, 30, 62,205,192,100, 63, 97,238, 46, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 62,141, 94,228, 63,100,234, 86, 62,137,240,216, 63, 93,226, 90,
- 62,150, 66, 84, 63, 94,154,114, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0,112, 2,236,169, 32, 63,109,178, 31, 62,228, 68,224, 63,102,178, 46, 62,232,184,100, 63,101,251,100,
- 62,227,198,238, 63,107,173, 94, 62,225,130,168,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 61,249,209, 68, 62,219,134, 70, 61,242,216,120, 62,225, 40,124, 61,177, 27, 28, 62,219,240, 42,
- 61,196,131, 76, 62,216, 97,196,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63,109,178, 31, 62,228, 68,224, 63,107,173, 94, 62,225,130,168, 63,114,102,144, 62,220, 23,198, 63,116, 76, 41,
- 62,222,153,139,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 61,120,163, 56, 62,208,252, 58, 61,196,131, 76, 62,216, 97,196, 61,177, 27, 28, 62,219,240, 42, 61, 73,183,128, 62,213,108, 84,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,116, 76, 41,
- 62,222,153,139, 63,114,102,144, 62,220, 23,198, 63,117, 87, 84, 62,211,255,221, 63,119,115,183, 62,215, 49,140,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61, 55, 29,144, 62,194,183,207,
- 61,120,163, 56, 62,208,252, 58, 61, 73,183,128, 62,213,108, 84, 60,231,111,224, 62,198,142,100,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,119,115,183, 62,215, 49,140, 63,117, 87, 84,
- 62,211,255,221, 63,118, 20,150, 62,196,110, 60, 63,122, 12, 49, 62,197, 8,246,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,103,197, 96, 62,170,206, 15, 61, 55, 29,144, 62,194,183,207,
- 60,231,111,224, 62,198,142,100, 61, 16, 54,240, 62,167, 4,120,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,122, 12, 49, 62,197, 8,246, 63,118, 20,150, 62,196,110, 60, 63,108,155, 17,
- 62,178,201,130, 63,110,190, 84, 62,172, 77,223,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 61,246,252,148, 62,160,116,164, 61,103,197, 96, 62,170,206, 15, 61, 16, 54,240, 62,167, 4,120,
- 61,246, 66, 8, 62,152,161, 28,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63,110,190, 84, 62,172, 77,223, 63,108,155, 17, 62,178,201,130, 63, 92,180, 21, 62,173, 95,202, 63, 90, 5,151,
- 62,167, 61,138,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62, 54,216,144, 62,163, 76, 35, 61,246,252,148, 62,160,116,164, 61,246, 66, 8, 62,152,161, 28, 62, 66,251,194, 62,158,102,163,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,108,155, 17,
- 62,178,201,130, 63,109,132,198, 62,186,157,182, 63, 97, 32, 68, 62,178, 12,192, 63, 92,180, 21, 62,173, 95,202,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 36,185, 48, 62,166, 7, 16,
- 61,221, 91, 40, 62,167,194, 4, 61,246,252,148, 62,160,116,164, 62, 54,216,144, 62,163, 76, 35,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,118, 20,150, 62,196,110, 60, 63,115,225, 84,
- 62,198, 85,208, 63,109,132,198, 62,186,157,182, 63,108,155, 17, 62,178,201,130,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,221, 91, 40, 62,167,194, 4, 61,134,221,244, 62,175,164,121,
- 61,103,197, 96, 62,170,206, 15, 61,246,252,148, 62,160,116,164,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,117, 87, 84, 62,211,255,221, 63,116, 48,222, 62,209, 8,169, 63,115,225, 84,
- 62,198, 85,208, 63,118, 20,150, 62,196,110, 60,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 61,134,221,244, 62,175,164,121, 61, 93,108,160, 62,190,207, 17, 61, 55, 29,144, 62,194,183,207,
- 61,103,197, 96, 62,170,206, 15,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63,114,102,144, 62,220, 23,198, 63,113,151,174, 62,214,229, 26, 63,116, 48,222, 62,209, 8,169, 63,117, 87, 84,
- 62,211,255,221,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 61, 93,108,160, 62,190,207, 17, 61,135,155, 12, 62,201, 39,166, 61,120,163, 56, 62,208,252, 58, 61, 55, 29,144, 62,194,183,207,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,107,173, 94,
- 62,225,130,168, 63,107,239,228, 62,218, 59, 62, 63,113,151,174, 62,214,229, 26, 63,114,102,144, 62,220, 23,198,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,135,155, 12, 62,201, 39,166,
- 61,195, 47,128, 62,207, 11, 6, 61,196,131, 76, 62,216, 97,196, 61,120,163, 56, 62,208,252, 58,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,107,173, 94, 62,225,130,168, 63,101,251,100,
- 62,227,198,238, 63,102,205, 71, 62,219, 94,132, 63,107,239,228, 62,218, 59, 62,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,244,157,192, 62,209,137,157, 61,249,209, 68, 62,219,134, 70,
- 61,196,131, 76, 62,216, 97,196, 61,195, 47,128, 62,207, 11, 6,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 69, 19,224, 62,190, 68, 24, 63, 77,217,216, 62,157,228, 7, 63, 85, 35,236,
- 62,181,201,164, 63, 78, 92, 56, 62,188,114,177,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 32, 2,236,169, 32, 62, 80, 91,122, 62,174, 18, 72, 62,111,118,154, 62,152,108,120, 62,134, 78,250, 62,186,213,148,
- 62,104,163,162, 62,182,180,150,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 32,
- 2,236,169, 32, 63, 77,217,216, 62,157,228, 7, 63, 90, 5,151, 62,167, 61,138, 63, 92,180, 21, 62,173, 95,202, 63, 85, 35,236,
- 62,181,201,164,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32,
- 62, 54,216,144, 62,163, 76, 35, 62, 66,251,194, 62,158,102,163, 62,111,118,154, 62,152,108,120, 62, 80, 91,122, 62,174, 18, 72,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32, 63, 74, 64, 53,
- 62,224, 31,171, 63, 69, 19,224, 62,190, 68, 24, 63, 78, 92, 56, 62,188,114,177, 63, 81,106,217, 62,232,214, 14,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,104,163,162, 62,182,180,150,
- 62,134, 78,250, 62,186,213,148, 62,114,112,184, 62,220,169,248, 62, 84, 93, 88, 62,228,105, 50,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 93,154,106, 62,233, 26,226, 63, 94,229,196,
- 62,224,195,128, 63,101,251,100, 62,227,198,238, 63,102,178, 46, 62,232,184,100,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,249,209, 68, 62,219,134, 70, 62, 28,187,108, 62,217, 86, 48,
- 62, 33, 1,128, 62,226,210, 70, 61,242,216,120, 62,225, 40,124,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 92,180, 21, 62,173, 95,202, 63, 97, 32, 68, 62,178, 12,192, 63, 94,215, 9,
- 62,186, 54, 4, 63, 85, 35,236, 62,181,201,164,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62, 41,122, 60, 62,175, 58, 16, 62, 36,185, 48, 62,166, 7, 16, 62, 54,216,144, 62,163, 76, 35,
- 62, 80, 91,122, 62,174, 18, 72,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 95, 78,230, 62,189,233, 4, 63, 86,188, 32, 62,190, 62, 44, 63, 85, 35,236, 62,181,201,164, 63, 94,215, 9,
- 62,186, 54, 4,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62, 80, 91,122, 62,174, 18, 72, 62, 71,118, 78, 62,182, 49, 27, 62, 37,225, 52, 62,179, 12, 40, 62, 41,122, 60, 62,175, 58, 16,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 92,166, 70,
- 62,197,166, 0, 63, 86,188, 32, 62,190, 62, 44, 63, 95, 78,230, 62,189,233, 4, 63, 95, 13,226, 62,194,152, 37,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 37,225, 52, 62,179, 12, 40,
- 62, 71,118, 78, 62,182, 49, 27, 62, 45,143,142, 62,188, 37,237, 62, 36,230,106, 62,184, 27,222,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 95, 90,248, 62,207,122,100, 63, 90,249,108,
- 62,212,199, 58, 63, 86,188, 32, 62,190, 62, 44, 63, 92,166, 70, 62,197,166, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 71,118, 78, 62,182, 49, 27, 62, 48, 56,110, 62,205, 43,230,
- 62, 30,250,174, 62,198, 12, 26, 62, 45,143,142, 62,188, 37,237,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 94,229,196, 62,224,195,128, 63, 90,249,108, 62,212,199, 58, 63, 95, 90,248,
- 62,207,122,100, 63, 98,104, 92, 62,215,136,197,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62, 30,250,174, 62,198, 12, 26, 62, 48, 56,110, 62,205, 43,230, 62, 28,187,108, 62,217, 86, 48,
- 62, 15, 59,212, 62,206, 50,224,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63,101,251,100, 62,227,198,238, 63, 94,229,196, 62,224,195,128, 63, 98,104, 92, 62,215,136,197, 63,102,205, 71,
- 62,219, 94,132,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62, 15, 59,212, 62,206, 50,224, 62, 28,187,108, 62,217, 86, 48, 61,249,209, 68, 62,219,134, 70, 61,244,157,192, 62,209,137,157,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 81,106,217,
- 62,232,214, 14, 63, 90,249,108, 62,212,199, 58, 63, 94,229,196, 62,224,195,128, 63, 93,154,106, 62,233, 26,226,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 28,187,108, 62,217, 86, 48,
- 62, 48, 56,110, 62,205, 43,230, 62, 84, 93, 88, 62,228,105, 50, 62, 33, 1,128, 62,226,210, 70,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 81,106,217, 62,232,214, 14, 63, 78, 92, 56,
- 62,188,114,177, 63, 86,188, 32, 62,190, 62, 44, 63, 90,249,108, 62,212,199, 58,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 71,118, 78, 62,182, 49, 27, 62,104,163,162, 62,182,180,150,
- 62, 84, 93, 88, 62,228,105, 50, 62, 48, 56,110, 62,205, 43,230,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 78, 92, 56, 62,188,114,177, 63, 85, 35,236, 62,181,201,164, 63, 86,188, 32,
- 62,190, 62, 44, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62, 71,118, 78, 62,182, 49, 27, 62, 80, 91,122, 62,174, 18, 72, 62,104,163,162, 62,182,180,150,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63,102,205, 71, 62,219, 94,132, 63, 98,104, 92, 62,215,136,197, 63,100,109,182, 62,210,255,149, 63,104, 86, 54,
- 62,214,241,209,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62, 7,107,160, 62,200,103, 34, 62, 15, 59,212, 62,206, 50,224, 61,244,157,192, 62,209,137,157, 61,232, 2, 8, 62,203,214, 20,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 98,104, 92,
- 62,215,136,197, 63, 95, 90,248, 62,207,122,100, 63, 97,206,112, 62,204,202, 10, 63,100,109,182, 62,210,255,149,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 21, 68, 64, 62,194, 55,107,
- 62, 30,250,174, 62,198, 12, 26, 62, 15, 59,212, 62,206, 50,224, 62, 7,107,160, 62,200,103, 34,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 95, 90,248, 62,207,122,100, 63, 92,166, 70,
- 62,197,166, 0, 63, 94,241, 82, 62,198,103, 40, 63, 97,206,112, 62,204,202, 10,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 35,225, 20, 62,188, 50, 39, 62, 45,143,142, 62,188, 37,237,
- 62, 30,250,174, 62,198, 12, 26, 62, 21, 68, 64, 62,194, 55,107,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 92,166, 70, 62,197,166, 0, 63, 95, 13,226, 62,194,152, 37, 63, 97, 1,118,
- 62,195,226, 47, 63, 94,241, 82, 62,198,103, 40,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62, 28, 43, 12, 62,184,177,186, 62, 36,230,106, 62,184, 27,222, 62, 45,143,142, 62,188, 37,237,
- 62, 35,225, 20, 62,188, 50, 39,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 95, 13,226, 62,194,152, 37, 63, 95, 78,230, 62,189,233, 4, 63, 97,113, 51, 62,189,151, 92, 63, 97, 1,118,
- 62,195,226, 47,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62, 29, 67,104, 62,177,199, 58, 62, 37,225, 52, 62,179, 12, 40, 62, 36,230,106, 62,184, 27,222, 62, 28, 43, 12, 62,184,177,186,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 95, 78,230,
- 62,189,233, 4, 63, 94,215, 9, 62,186, 54, 4, 63, 96, 69, 96, 62,187,133,152, 63, 97,113, 51, 62,189,151, 92,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 35, 14,140, 62,176, 19, 33,
- 62, 41,122, 60, 62,175, 58, 16, 62, 37,225, 52, 62,179, 12, 40, 62, 29, 67,104, 62,177,199, 58,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 94,215, 9, 62,186, 54, 4, 63, 97, 32, 68,
- 62,178, 12,192, 63, 98, 91,112, 62,182,128,149, 63, 96, 69, 96, 62,187,133,152,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 29,107,228, 62,169,230, 95, 62, 36,185, 48, 62,166, 7, 16,
- 62, 41,122, 60, 62,175, 58, 16, 62, 35, 14,140, 62,176, 19, 33,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,107,239,228, 62,218, 59, 62, 63,102,205, 71, 62,219, 94,132, 63,104, 86, 54,
- 62,214,241,209, 63,109, 27, 34, 62,214,254,155,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 61,232, 2, 8, 62,203,214, 20, 61,244,157,192, 62,209,137,157, 61,195, 47,128, 62,207, 11, 6,
- 61,184,174, 36, 62,202,130,216,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63,113,151,174, 62,214,229, 26, 63,107,239,228, 62,218, 59, 62, 63,109, 27, 34, 62,214,254,155, 63,113,134, 69,
- 62,212, 82,156,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 61,184,174, 36, 62,202,130,216, 61,195, 47,128, 62,207, 11, 6, 61,135,155, 12, 62,201, 39,166, 61,138,114, 60, 62,197, 61, 28,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,116, 48,222,
- 62,209, 8,169, 63,113,151,174, 62,214,229, 26, 63,113,134, 69, 62,212, 82,156, 63,114,143, 42, 62,207,168, 24,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,138,114, 60, 62,197, 61, 28,
- 61,135,155, 12, 62,201, 39,166, 61, 93,108,160, 62,190,207, 17, 61,132, 85,184, 62,189,211, 22,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,115,225, 84, 62,198, 85,208, 63,116, 48,222,
- 62,209, 8,169, 63,114,143, 42, 62,207,168, 24, 63,114,125,203, 62,200,114, 96,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,132, 85,184, 62,189,211, 22, 61, 93,108,160, 62,190,207, 17,
- 61,134,221,244, 62,175,164,121, 61,145,152, 16, 62,179,214, 84,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,109,132,198, 62,186,157,182, 63,115,225, 84, 62,198, 85,208, 63,114,125,203,
- 62,200,114, 96, 63,109,192,177, 62,190,240,152,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 61,145,152, 16, 62,179,214, 84, 61,134,221,244, 62,175,164,121, 61,221, 91, 40, 62,167,194, 4,
- 61,208,226, 64, 62,172, 58,232,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 97, 32, 68, 62,178, 12,192, 63,109,132,198, 62,186,157,182, 63,109,192,177, 62,190,240,152, 63, 98, 91,112,
- 62,182,128,149,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 61,208,226, 64, 62,172, 58,232, 61,221, 91, 40, 62,167,194, 4, 62, 36,185, 48, 62,166, 7, 16, 62, 29,107,228, 62,169,230, 95,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 97, 1,118,
- 62,195,226, 47, 63, 97,113, 51, 62,189,151, 92, 63,102,139,215, 62,193,109, 15, 63,100, 47, 54, 62,198,115,186,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 5,169, 92, 62,179,115,168,
- 62, 29, 67,104, 62,177,199, 58, 62, 28, 43, 12, 62,184,177,186, 62, 13, 97, 50, 62,186, 42, 50,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,100, 47, 54, 62,198,115,186, 63,102,139,215,
- 62,193,109, 15, 63,105,241,174, 62,200, 8,204, 63,103,233, 71, 62,204, 42,178,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,229,171,228, 62,185, 42, 41, 62, 5,169, 92, 62,179,115,168,
- 62, 13, 97, 50, 62,186, 42, 50, 61,243,248, 92, 62,191, 22, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,103,233, 71, 62,204, 42,178, 63,105,241,174, 62,200, 8,204, 63,108, 37, 51,
- 62,205, 3,249, 63,106,212, 56, 62,208,238, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 61,202, 99,120, 62,190, 49,192, 61,229,171,228, 62,185, 42, 41, 61,243,248, 92, 62,191, 22, 96,
- 61,211,209,160, 62,195,159,108,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63,106,212, 56, 62,208,238, 96, 63,108, 37, 51, 62,205, 3,249, 63,110, 73, 56, 62,206,119,186, 63,109,191, 46,
- 62,210, 64, 92,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 61,179,234,244, 62,190,219,240, 61,202, 99,120, 62,190, 49,192, 61,211,209,160, 62,195,159,108, 61,181,129,196, 62,196, 14,204,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,109, 27, 34,
- 62,214,254,155, 63,104, 86, 54, 62,214,241,209, 63,106,212, 56, 62,208,238, 96, 63,109,191, 46, 62,210, 64, 92,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,211,209,160, 62,195,159,108,
- 61,232, 2, 8, 62,203,214, 20, 61,184,174, 36, 62,202,130,216, 61,181,129,196, 62,196, 14,204,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,100,109,182, 62,210,255,149, 63,103,233, 71,
- 62,204, 42,178, 63,106,212, 56, 62,208,238, 96, 63,104, 86, 54, 62,214,241,209,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,211,209,160, 62,195,159,108, 61,243,248, 92, 62,191, 22, 96,
- 62, 7,107,160, 62,200,103, 34, 61,232, 2, 8, 62,203,214, 20,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,100,109,182, 62,210,255,149, 63, 97,206,112, 62,204,202, 10, 63,100, 47, 54,
- 62,198,115,186, 63,103,233, 71, 62,204, 42,178,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 62, 13, 97, 50, 62,186, 42, 50, 62, 21, 68, 64, 62,194, 55,107, 62, 7,107,160, 62,200,103, 34,
- 61,243,248, 92, 62,191, 22, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63, 97, 1,118, 62,195,226, 47, 63,100, 47, 54, 62,198,115,186, 63, 97,206,112, 62,204,202, 10, 63, 94,241, 82,
- 62,198,103, 40,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 62, 21, 68, 64, 62,194, 55,107, 62, 13, 97, 50, 62,186, 42, 50, 62, 28, 43, 12, 62,184,177,186, 62, 35,225, 20, 62,188, 50, 39,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63, 96, 69, 96,
- 62,187,133,152, 63, 98, 91,112, 62,182,128,149, 63,102,139,215, 62,193,109, 15, 63, 97,113, 51, 62,189,151, 92,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 5,169, 92, 62,179,115,168,
- 62, 29,107,228, 62,169,230, 95, 62, 35, 14,140, 62,176, 19, 33, 62, 29, 67,104, 62,177,199, 58,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,109,192,177, 62,190,240,152, 63,105,241,174,
- 62,200, 8,204, 63,102,139,215, 62,193,109, 15, 63, 98, 91,112, 62,182,128,149,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62, 5,169, 92, 62,179,115,168, 61,229,171,228, 62,185, 42, 41,
- 61,208,226, 64, 62,172, 58,232, 62, 29,107,228, 62,169,230, 95,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,114,125,203, 62,200,114, 96, 63,108, 37, 51, 62,205, 3,249, 63,105,241,174,
- 62,200, 8,204, 63,109,192,177, 62,190,240,152,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0, 0, 2,236,169, 32, 61,229,171,228, 62,185, 42, 41, 61,202, 99,120, 62,190, 49,192, 61,145,152, 16, 62,179,214, 84,
- 61,208,226, 64, 62,172, 58,232,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63,114,143, 42, 62,207,168, 24, 63,110, 73, 56, 62,206,119,186, 63,108, 37, 51, 62,205, 3,249, 63,114,125,203,
- 62,200,114, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 61,202, 99,120, 62,190, 49,192, 61,179,234,244, 62,190,219,240, 61,132, 85,184, 62,189,211, 22, 61,145,152, 16, 62,179,214, 84,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,113,134, 69,
- 62,212, 82,156, 63,109,191, 46, 62,210, 64, 92, 63,110, 73, 56, 62,206,119,186, 63,114,143, 42, 62,207,168, 24,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,179,234,244, 62,190,219,240,
- 61,181,129,196, 62,196, 14,204, 61,138,114, 60, 62,197, 61, 28, 61,132, 85,184, 62,189,211, 22,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,109, 27, 34, 62,214,254,155, 63,109,191, 46,
- 62,210, 64, 92, 63,113,134, 69, 62,212, 82,156, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 61,138,114, 60, 62,197, 61, 28, 61,181,129,196, 62,196, 14,204,
- 61,184,174, 36, 62,202,130,216, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,110,190, 84, 62,172, 77,223, 63, 90, 5,151, 62,167, 61,138, 63, 96, 25, 22,
- 62,149,248,246, 63,122,176,162, 62,161,215,145,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,128, 2,236,169, 32, 62, 54,234, 64, 62,140,219,146, 62, 66,251,194, 62,158,102,163, 61,246, 66, 8, 62,152,161, 28,
- 61,189,241,172, 62,132,107, 13,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0,
- 2,236,169, 32, 63,122, 12, 49, 62,197, 8,246, 63,110,190, 84, 62,172, 77,223, 63,122,176,162, 62,161,215,145, 63,126,255,188,
- 62,198,248,115,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32,
- 61,189,241,172, 62,132,107, 13, 61,246, 66, 8, 62,152,161, 28, 61, 16, 54,240, 62,167, 4,120, 58,163, 8, 0, 62,162, 69, 39,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128, 2,236,169, 32, 63,119,115,183,
- 62,215, 49,140, 63,122, 12, 49, 62,197, 8,246, 63,126,255,188, 62,198,248,115, 63,122, 6, 47, 62,216,157,248,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 58,163, 8, 0, 62,162, 69, 39,
- 61, 16, 54,240, 62,167, 4,120, 60,231,111,224, 62,198,142,100, 60, 14,248,224, 62,198,141, 70,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 63,116, 76, 41, 62,222,153,139, 63,119,115,183,
- 62,215, 49,140, 63,122, 6, 47, 62,216,157,248, 63,119, 98,134, 62,225, 37,204,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 60, 14,248,224, 62,198,141, 70, 60,231,111,224, 62,198,142,100,
- 61, 73,183,128, 62,213,108, 84, 60,229,210, 80, 62,218,239, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 63,109,178, 31, 62,228, 68,224, 63,116, 76, 41, 62,222,153,139, 63,119, 98,134,
- 62,225, 37,204, 63,115,185, 46, 62,234,157, 90,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,128, 2,236,169, 32, 60,229,210, 80, 62,218,239, 32, 61, 73,183,128, 62,213,108, 84, 61,177, 27, 28, 62,219,240, 42,
- 61,122,103, 56, 62,230, 10, 30,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,128,
- 2,236,169, 32, 63,102,178, 46, 62,232,184,100, 63,109,178, 31, 62,228, 68,224, 63,115,185, 46, 62,234,157, 90, 63,106,134,244,
- 62,246, 64,234,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 64, 2,236,169, 32,
- 61,122,103, 56, 62,230, 10, 30, 61,177, 27, 28, 62,219,240, 42, 61,242,216,120, 62,225, 40,124, 61,209,222,212, 62,240,123,238,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 63, 5,188,235,
- 63, 98, 74,252, 62,248,111,200, 63,112,105,197, 62,231, 49, 0, 63,107,190,118, 62,255, 57,150, 63, 96, 14, 53,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62, 95, 99, 80, 63, 94,194,149,
- 62, 62, 8, 58, 63, 89,154, 10, 62, 92, 24, 40, 63, 74, 82, 14, 62,112, 11,112, 63, 78,133,157,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 5,188,235, 63, 98, 74,252, 63, 12,139,136,
- 63,101,233,138, 63, 6, 45,116, 63,113,245,112, 62,248,111,200, 63,112,105,197,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62, 36,219, 68, 63, 81,186,249, 62, 65,254, 28, 63, 70, 55, 20,
- 62, 92, 24, 40, 63, 74, 82, 14, 62, 62, 8, 58, 63, 89,154, 10,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 12,139,136, 63,101,233,138, 63, 12,130, 5, 63,108,216,149, 63, 6, 45,116,
- 63,113,245,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5,
- 0, 0, 0,112, 2,236,169, 32, 62, 36,219, 68, 63, 81,186,249, 62, 42, 1, 76, 63, 73,178, 39, 62, 65,254, 28, 63, 70, 55, 20,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,112,
- 2,236,169, 32, 63,103, 89,120, 63, 2, 76,105, 63, 93,154,106, 62,233, 26,226, 63,102,178, 46, 62,232,184,100, 63,106,134,244,
- 62,246, 64,234,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32,
- 61,242,216,120, 62,225, 40,124, 62, 33, 1,128, 62,226,210, 70, 61,234,128,116, 63, 0, 39,200, 61,209,222,212, 62,240,123,238,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 0, 2,236,169, 32, 62,245, 44,226,
- 63, 96,140,129, 62,255, 57,150, 63, 96, 14, 53, 62,231, 49, 0, 63,107,190,118, 62,227,135, 42, 63,101, 2, 58,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 62, 95, 99, 80, 63, 94,194,149,
- 62,112, 11,112, 63, 78,133,157, 62,120, 84, 74, 63, 83, 32,104, 62,122,103,110, 63, 92,255,236,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 5, 0, 0, 0,240, 2,236,169, 32, 63, 77,217,216, 62,157,228, 7, 63, 90,225,160,
- 62,137,121,110, 63, 96, 25, 22, 62,149,248,246, 63, 90, 5,151, 62,167, 61,138,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 5, 0, 0, 0, 16, 2,236,169, 32, 62, 54,234, 64, 62,140,219,146, 62, 74,125,166, 62,130, 30,252,
- 62,111,118,154, 62,152,108,120, 62, 66,251,194, 62,158,102,163,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 5, 0, 0, 0, 64, 0, 0, 77, 69, 0, 0, 1, 20, 2,236,208,112, 0, 0, 0, 50, 0, 0, 0, 1, 2,236,213, 64,
- 2,236,203,160, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 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, 2,235,189,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2,230, 87, 96, 5, 32, 40, 32, 5, 32, 48, 32, 5, 30, 70, 32, 5, 32, 8, 32, 5, 32, 24, 32, 0, 0, 0, 0,
- 5, 32, 62, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,209,176, 0, 0, 0, 1,
- 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 2,236,210,224, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 2,236,212, 16, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0,188, 0, 0, 1, 53, 0, 0, 0, 76,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 63, 76,204,213, 63, 76,204,255,182,104, 0, 0, 63,128, 0, 30, 63,128, 0,140,
- 63,127,255,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,230, 87, 96, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,209,176, 0, 0, 0,242, 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, 5, 32, 8, 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,
- 68, 65, 84, 65, 0, 0, 14,176, 5, 32, 8, 32, 0, 0, 0, 56, 0, 0, 0,188, 63,230,102,133, 63,179, 51,208, 63,127,255,146,
-165,127, 0, 0, 90,129, 2,255, 63,230,102,133, 63, 25,154,206, 63,127,255,146,165,127, 0, 0, 90,129, 2,255, 63,179, 51, 81,
- 63,179, 51,210, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 28, 63,179, 51,212, 63,127,255,152, 0, 0, 0, 0,
-127,255, 2,255, 63, 25,153,207, 63,179, 51,214, 63,127,255,154, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,152, 63,179, 51,216,
- 63,127,255,156, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 63,128, 0,158, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255,
- 63,128, 0, 27, 63,128, 0,160, 63,127,255,150, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,204, 63,128, 0,162, 63,127,255,154,
- 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140, 63,128, 0,163, 63,127,255,156, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80,
- 63, 25,154,209, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 27, 63, 25,154,213, 63,127,255,150, 0, 0, 0, 0,
-127,255, 2,255, 63, 25,153,204, 63, 25,154,217, 63,127,255,154, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140, 63, 25,154,221,
- 63,127,255,156, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 62, 76,209,160, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255,
- 63,128, 0, 27, 62, 76,209,176, 63,127,255,150, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,204, 62, 76,209,188, 63,127,255,152,
- 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140, 62, 76,209,204, 63,127,255,154, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140,
- 63,230,103, 8, 63,127,255,148, 0, 0,165,127, 90,129, 0,255, 63, 25,153,204, 63,230,103, 10, 63,127,255,146, 0, 0,165,127,
- 90,129, 0,255, 63,128, 0, 27, 63,230,103, 10, 63,127,255,142, 0, 0,165,127, 90,129, 0,255, 63,179, 51, 80, 63,230,103, 12,
- 63,127,255,140, 0, 0,165,127, 90,129, 0,255,190, 76,205,152, 63,230,103, 12, 63,127,255,140, 0, 0,165,127, 90,129, 0,255,
-190, 76,205,152, 62, 76,209,160, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255,190, 76,205,152, 63, 25,154,209, 63,127,255,148,
- 0, 0, 0, 0,127,255, 2,255,190, 76,205,152, 63,128, 0,158, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255,190, 76,205,144,
- 63,179, 51,210, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255, 63,230,102,131, 63,230,103, 7, 63,127,255,148, 0, 0,165,127,
- 90,129, 0,255, 63,230,102,131, 63,128, 0,160, 63,127,255,142,165,127, 0, 0, 90,129, 2,255, 63,230,102,127, 62, 76,208, 28,
- 63,127,255,148,165,127, 0, 0, 90,129, 2,255,190, 76,205,146,190, 76,208, 72, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255,
- 62, 76,205,150,190, 76,208, 24, 63,127,255,156, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,207,190, 76,208, 40, 63,127,255,154,
- 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 28,190, 76,208, 56, 63,127,255,152, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 81,
-190, 76,208, 72, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255, 63,230,102,133,190, 76,208, 88, 63,127,255,146, 0, 0, 0, 0,
-127,255, 2,255, 63,230,102,133,190, 76,208, 88,191,128, 0, 4, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 81,190, 76,208, 72,
-191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 28,190, 76,208, 56,191,128, 0, 1, 0, 0, 0, 0,127,255, 2,255,
- 63, 25,153,207,190, 76,208, 40,191,128, 0, 0, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,150,190, 76,208, 24,191,127,255,254,
- 0, 0, 0, 0,127,255, 2,255,190, 76,205,146,190, 76,208, 72,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 63,230,102,127,
- 62, 76,208, 28,191, 25,153,155,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131,190, 76,201,136,191, 25,153,159,128, 1, 0, 0,
- 0, 0, 2,255, 63,230,102,127, 62, 76,208, 28,190, 76,204,193,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131,190, 76,201,136,
-190, 76,204,209,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,127, 62, 76,208, 28, 62, 76,204,219,128, 1, 0, 0, 0, 0, 2,255,
- 63,230,102,131,190, 76,201,136, 62, 76,204,203,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,127, 62, 76,208, 28, 63, 25,153,159,
-128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131,190, 76,201,136, 63, 25,153,155,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,127,
- 62, 76,208, 28,191,128, 0, 3,165,127, 0, 0, 90,129, 2,255, 63,230,102,131, 63,128, 0,160,191,128, 0, 6,165,127, 0, 0,
- 90,129, 2,255, 63,230,102,131, 63,230,103, 7,191,128, 0, 3, 0, 0,165,127, 90,129, 0,255, 63,230,102,135, 63, 25,154,207,
- 63, 25,153,151,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,128, 0,156, 63, 25,153,151,128, 1, 0, 0, 0, 0, 2,255,
- 63,230,102,131, 63,179, 51,212, 63, 25,153,155,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,230,103, 7, 63, 25,153,159,
-165,127,165,127, 0, 0, 2,255, 63,230,102,135, 63, 25,154,207, 62, 76,204,171,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131,
- 63,128, 0,160, 62, 76,204,187,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,179, 51,212, 62, 76,204,203,128, 1, 0, 0,
- 0, 0, 2,255, 63,230,102,131, 63,230,103, 7, 62, 76,204,219,165,127,165,127, 0, 0, 2,255, 63,230,102,135, 63, 25,154,207,
-190, 76,204,241,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,128, 0,160,190, 76,204,225,128, 1, 0, 0, 0, 0, 2,255,
- 63,230,102,131, 63,179, 51,212,190, 76,204,209,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,230,103, 7,190, 76,204,193,
-165,127,165,127, 0, 0, 2,255, 63,230,102,135, 63, 25,154,207,191, 25,153,167,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131,
- 63,128, 0,160,191, 25,153,163,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,179, 51,212,191, 25,153,159,128, 1, 0, 0,
- 0, 0, 2,255, 63,230,102,131, 63,230,103, 7,191, 25,153,155,165,127,165,127, 0, 0, 2,255,190, 76,205,144, 63,179, 51,210,
-191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255,190, 76,205,152, 63,128, 0,158,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255,
-190, 76,205,152, 63, 25,154,209,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255,190, 76,205,152, 62, 76,209,160,191,128, 0, 3,
- 0, 0, 0, 0,127,255, 2,255,190, 76,205,152, 63,230,103, 12,191, 25,153,168, 0, 0,128, 1, 0, 0, 2,255,190, 76,205,152,
- 63,230,103, 12,190, 76,204,244, 0, 0,128, 1, 0, 0, 2,255,190, 76,205,152, 63,230,103, 12, 62, 76,204,168, 0, 0,128, 1,
- 0, 0, 2,255,190, 76,205,144, 63,230,103, 12, 63, 25,153,150, 0, 0,128, 1, 0, 0, 2,255,190, 76,205,152, 63,230,103, 12,
-191,128, 0, 7, 0, 0,165,127, 90,129, 0,255, 63,179, 51, 80, 63,230,103, 12,191,128, 0, 7, 0, 0,165,127, 90,129, 0,255,
- 63,128, 0, 27, 63,230,103, 10,191,128, 0, 6, 0, 0,165,127, 90,129, 0,255, 63, 25,153,204, 63,230,103, 10,191,128, 0, 4,
- 0, 0,165,127, 90,129, 0,255, 62, 76,205,140, 63,230,103, 8,191,128, 0, 3, 0, 0,165,127, 90,129, 0,255, 63,179, 51, 81,
- 63,230,103, 12, 63, 25,153,150, 0, 0,128, 1, 0, 0, 2,255, 63,128, 0, 28, 63,230,103, 10, 63, 25,153,150, 0, 0,128, 1,
- 0, 0, 2,255, 63, 25,153,207, 63,230,103, 10, 63, 25,153,154, 0, 0,128, 1, 0, 0, 2,255, 62, 76,205,152, 63,230,103, 8,
- 63, 25,153,158, 0, 0,128, 1, 0, 0, 2,255, 63,179, 51, 80, 63,230,103, 12, 62, 76,204,168, 0, 0,128, 1, 0, 0, 2,255,
- 63,128, 0, 27, 63,230,103, 10, 62, 76,204,184, 0, 0,128, 1, 0, 0, 2,255, 63, 25,153,204, 63,230,103, 10, 62, 76,204,200,
- 0, 0,128, 1, 0, 0, 2,255, 62, 76,205,140, 63,230,103, 8, 62, 76,204,216, 0, 0,128, 1, 0, 0, 2,255, 63,179, 51, 80,
- 63,230,103, 12,190, 76,204,244, 0, 0,128, 1, 0, 0, 2,255, 63,128, 0, 27, 63,230,103, 10,190, 76,204,228, 0, 0,128, 1,
- 0, 0, 2,255, 63, 25,153,204, 63,230,103, 10,190, 76,204,212, 0, 0,128, 1, 0, 0, 2,255, 62, 76,205,140, 63,230,103, 8,
-190, 76,204,196, 0, 0,128, 1, 0, 0, 2,255, 63,179, 51, 80, 63,230,103, 12,191, 25,153,168, 0, 0,128, 1, 0, 0, 2,255,
- 63,128, 0, 27, 63,230,103, 10,191, 25,153,164, 0, 0,128, 1, 0, 0, 2,255, 63, 25,153,204, 63,230,103, 10,191, 25,153,160,
- 0, 0,128, 1, 0, 0, 2,255, 62, 76,205,140, 63,230,103, 8,191, 25,153,156, 0, 0,128, 1, 0, 0, 2,255, 62, 76,205,140,
- 62, 76,209,204,191,127,255,255, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,204, 62, 76,209,188,191,128, 0, 1, 0, 0, 0, 0,
-127,255, 2,255, 63,128, 0, 27, 62, 76,209,176,191,128, 0, 2, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 62, 76,209,160,
-191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140, 63, 25,154,221,191,127,255,254, 0, 0, 0, 0,127,255, 2,255,
- 63, 25,153,204, 63, 25,154,217,191,128, 0, 0, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 27, 63, 25,154,213,191,128, 0, 2,
- 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 63, 25,154,209,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140,
- 63,128, 0,163,191,127,255,254, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,204, 63,128, 0,162,191,128, 0, 0, 0, 0, 0, 0,
-127,255, 2,255, 63,128, 0, 27, 63,128, 0,160,191,128, 0, 2, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 63,128, 0,158,
-191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,152, 63,179, 51,216,191,127,255,254, 0, 0, 0, 0,127,255, 2,255,
- 63, 25,153,207, 63,179, 51,214,191,128, 0, 0, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 28, 63,179, 51,212,191,128, 0, 1,
- 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 81, 63,179, 51,210,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 63,230,102,133,
- 63, 25,154,206,191,128, 0, 4,165,127, 0, 0, 90,129, 2,255, 63,230,102,133, 63,179, 51,208,191,128, 0, 4,165,127, 0, 0,
- 90,129, 2,255,190, 76,205,128, 62, 76,201,116,191,128, 0, 5,127,255, 0, 0, 0, 0, 16,255,190, 76,205,136, 63,127,255, 48,
-191,128, 0, 5,127,255, 0, 0, 0, 0, 16,255,190, 76,205,112,190, 76,208, 64,191, 25,153,156,127,255, 0, 0, 0, 0, 16,255,
-190, 76,205,112, 62, 76,201, 84,191, 25,153,160,127,255, 0, 0, 0, 0, 18,255,190, 76,205,120, 63, 25,152,190,191, 25,153,164,
-127,255, 0, 0, 0, 0, 18,255,190, 76,205,152, 63,127,255, 46,191, 25,153,168,127,255, 0, 0, 0, 0, 18,255,190, 76,205,112,
-190, 76,208, 64,190, 76,204,195,127,255, 0, 0, 0, 0, 16,255,190, 76,205,112, 62, 76,201, 84,190, 76,204,211,127,255, 0, 0,
- 0, 0, 18,255,190, 76,205,120, 63, 25,152,190,190, 76,204,227,127,255, 0, 0, 0, 0, 18,255,190, 76,205,152, 63,127,255, 46,
-190, 76,204,243,127,255, 0, 0, 0, 0, 18,255,190, 76,205,112,190, 76,208, 64, 62, 76,204,221,127,255, 0, 0, 0, 0, 16,255,
-190, 76,205,112, 62, 76,201, 84, 62, 76,204,205,127,255, 0, 0, 0, 0, 18,255,190, 76,205,120, 63, 25,152,190, 62, 76,204,189,
-127,255, 0, 0, 0, 0, 18,255,190, 76,205,152, 63,127,255, 46, 62, 76,204,173,127,255, 0, 0, 0, 0, 18,255,190, 76,205,112,
-190, 76,208, 64, 63, 25,153,160,127,255, 0, 0, 0, 0, 16,255,190, 76,205,112, 62, 76,201, 84, 63, 25,153,156,127,255, 0, 0,
- 0, 0, 18,255,190, 76,205,120, 63, 25,152,198, 63, 25,153,152,127,255, 0, 0, 0, 0, 18,255,190, 76,205,152, 63,127,255, 46,
- 63, 25,153,152,127,255, 0, 0, 0, 0, 18,255,190, 76,205,112,190, 76,208, 64,191,128, 0, 4,231, 94,231, 94,132,215, 16,255,
-190, 76,205,120, 63, 25,152,190,191,128, 0, 7,127,255, 0, 0, 0, 0, 16,255,190, 76,205, 96, 63,179, 50,251,191,128, 0, 4,
-127,255, 0, 0, 0, 0, 16,255,190, 76,205,128, 63,230,102, 48, 63, 25,153,156,127,255, 0, 0, 0, 0, 18,255,190, 76,205, 96,
- 63,179, 50,251, 63, 25,153,160,127,255, 0, 0, 0, 0, 18,255,190, 76,205,128, 63,230,102, 48, 62, 76,204,205,127,255, 0, 0,
- 0, 0, 18,255,190, 76,205, 96, 63,179, 50,251, 62, 76,204,221,127,255, 0, 0, 0, 0, 18,255,190, 76,205,128, 63,230,102, 48,
-190, 76,204,211,127,255, 0, 0, 0, 0, 18,255,190, 76,205, 96, 63,179, 50,251,190, 76,204,195,127,255, 0, 0, 0, 0, 18,255,
-190, 76,205,128, 63,230,102, 48,191, 25,153,160,127,255, 0, 0, 0, 0, 18,255,190, 76,205, 96, 63,179, 50,251,191, 25,153,156,
-127,255, 0, 0, 0, 0, 18,255,190, 76,205,144, 63,230,103, 10,191,128, 0, 5,243,161,111, 93,194, 34, 16,255,190, 76,205,144,
- 63,230,103, 10, 63,127,255,148,243,161,111, 93, 61,222, 16,255,190, 76,205, 96, 63,179, 50,251, 63,127,255,150,127,255, 0, 0,
- 0, 0, 16,255,190, 76,205,120, 63, 25,152,190, 63,127,255,144,127,255, 0, 0, 0, 0, 16,255,190, 76,205,112,190, 76,208, 64,
- 63,127,255,150,231, 94,231, 94,123, 41, 16,255,190, 76,205,136, 63,127,255, 48, 63,127,255,148,127,255, 0, 0, 0, 0, 16,255,
-190, 76,205,128, 62, 76,201,116, 63,127,255,148,127,255, 0, 0, 0, 0, 16,255, 63,179, 51, 36,190, 76,208, 56,191, 25,153,157,
- 0, 0,127,255, 0, 0, 3,255, 63,127,255,222,190, 76,208, 80,191, 25,153,161, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,
-190, 76,208, 80,191, 25,153,165, 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 44,190, 76,208,104,191, 25,153,169, 0, 0,127,255,
- 0, 0, 3,255, 63,179, 51, 36,190, 76,208, 56,190, 76,204,198, 0, 0,127,255, 0, 0, 3,255, 63,127,255,222,190, 76,208, 80,
-190, 76,204,214, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,190, 76,208, 80,190, 76,204,230, 0, 0,127,255, 0, 0, 3,255,
- 62, 76,204, 44,190, 76,208,104,190, 76,204,246, 0, 0,127,255, 0, 0, 3,255, 63,179, 51, 36,190, 76,208, 56, 62, 76,204,218,
- 0, 0,127,255, 0, 0, 3,255, 63,127,255,222,190, 76,208, 80, 62, 76,204,202, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,
-190, 76,208, 80, 62, 76,204,186, 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 44,190, 76,208,104, 62, 76,204,170, 0, 0,127,255,
- 0, 0, 3,255, 63,179, 51, 34,190, 76,208, 56, 63, 25,153,159, 0, 0,127,255, 0, 0, 3,255, 63,127,255,220,190, 76,208, 80,
- 63, 25,153,155, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,114,190, 76,208, 80, 63, 25,153,151, 0, 0,127,255, 0, 0, 3,255,
- 62, 76,204, 36,190, 76,208,104, 63, 25,153,151, 0, 0,127,255, 0, 0, 3,255, 63,179, 51, 36,190, 76,208, 56,191,128, 0, 4,
- 0, 0,127,255, 0, 0, 3,255, 63,127,255,222,190, 76,208, 80,191,128, 0, 5, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,
-190, 76,208, 80,191,128, 0, 7, 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 44,190, 76,208,104,191,128, 0, 8, 0, 0,127,255,
- 0, 0, 3,255, 63,230,102,136,190, 76,208, 88,191,128, 0, 8, 0, 0,127,255, 0, 0, 3,255, 63,230,102,135,190, 76,208, 88,
- 63, 25,153,151, 0, 0,127,255, 0, 0, 3,255, 63,230,102,136,190, 76,208, 88, 62, 76,204,170, 0, 0,127,255, 0, 0, 3,255,
- 63,230,102,136,190, 76,208, 88,190, 76,204,246, 0, 0,127,255, 0, 0, 3,255, 63,230,102,136,190, 76,208, 88,191, 25,153,169,
- 0, 0,127,255, 0, 0, 3,255,190, 76,205,112,190, 76,208, 64,191, 25,153,156, 0, 0,127,255, 0, 0, 1,255,190, 76,205,112,
-190, 76,208, 64,190, 76,204,195, 0, 0,127,255, 0, 0, 1,255,190, 76,205,112,190, 76,208, 64, 62, 76,204,221, 0, 0,127,255,
- 0, 0, 1,255,190, 76,205,112,190, 76,208, 64, 63, 25,153,160, 0, 0,127,255, 0, 0, 1,255,190, 76,205,112,190, 76,208, 64,
-191,128, 0, 4, 0, 0,127,255, 0, 0, 3,255,190, 76,205,112,190, 76,208, 64, 63,127,255,150, 0, 0,127,255, 0, 0, 3,255,
- 63,230,102,136,190, 76,208, 88, 63,127,255,142, 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 44,190, 76,208,104, 63,127,255,142,
- 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,190, 76,208, 80, 63,127,255,144, 0, 0,127,255, 0, 0, 3,255, 63,127,255,222,
-190, 76,208, 80, 63,127,255,148, 0, 0,127,255, 0, 0, 3,255, 63,179, 51, 36,190, 76,208, 56, 63,127,255,150, 0, 0,127,255,
- 0, 0, 3,255, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,210,224, 0, 0, 0,242, 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, 5, 32, 24, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,120, 1, 0, 0, 32, 2,118, 1, 0, 0, 0, 0, 50, 0, 0, 0,
+ 1, 0, 0, 0, 80, 83,118, 1, 0, 0, 0, 0, 96,130,116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 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,208, 4,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, 83,118, 1, 0, 0, 0, 0, 16, 38,118, 1,
+ 0, 0, 0, 0, 64, 44,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 5,118, 1, 0, 0, 0, 0,208, 21,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 58,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,224, 3,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 0, 80, 20,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,144, 36,118, 1,
+ 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0,188, 0, 0, 0, 53, 1, 0, 0, 76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,213,204, 76, 63,255,204, 76, 63, 0, 0,104,182, 30, 0,128, 63,140, 0,128, 63,
+214,255,127, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 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,
+ 8, 0, 0, 0, 0, 83,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 64, 1, 0, 0,224, 3,118, 1, 0, 0, 0, 0, 5, 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, 96, 5,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 14,124, 5, 32, 24, 32, 0, 0, 0, 53, 0, 0, 1, 53, 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 34, 0, 0, 0, 20,
- 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 85, 0, 0, 0, 34,
- 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 54,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 29,
- 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 9,
- 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 7,
- 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 34,
- 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13,
- 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 7,
- 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 34,
- 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 17,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 11,
- 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 34,
- 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 20,
- 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 22,
- 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 34,
- 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 24, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 25,
- 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 26, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 29, 0, 0, 0, 34,
- 0, 0, 0, 21, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 28,
- 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 32,
- 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 34,
- 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 32,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 39,
- 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 37, 0, 0, 0,101, 0, 0, 0, 34,
- 0, 0, 0, 41, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 39,
- 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 51,
- 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 34,
- 0, 0, 0, 64, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 82,
- 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 65,
- 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0,115, 0, 0, 0, 34,
- 0, 0, 0, 51, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0,114, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 50,
- 0, 0, 0, 34, 0, 0, 0, 43, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 42,
- 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 46, 0, 0, 0, 34,
- 0, 0, 0, 47, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 48,
- 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 54,
- 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0, 34,
- 0, 0, 0, 59, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 59,
- 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 53,
- 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 34,
- 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 62, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 62,
- 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 64,
- 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 63, 0, 0, 0, 67, 0, 0, 0, 34,
- 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 34, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 65, 0, 0, 0, 66,
- 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 65, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 51,
- 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 34,
- 0, 0, 0, 44, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 42, 0, 0, 0, 65, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0,110,
- 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0, 72,
- 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0, 34,
- 0, 0, 0, 75, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 77, 0, 0, 0, 81,
- 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 74,
- 0, 0, 0, 75, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0,110, 0, 0, 0, 34,
- 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0,113,
- 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 34, 0, 0, 0, 83,
- 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 34,
- 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0, 88, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 88,
- 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 82,
- 0, 0, 0, 86, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 34,
- 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 87, 0, 0, 0, 91,
- 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0, 93,
- 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 96, 0, 0, 0, 34,
- 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 95,
- 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 94, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 80,
- 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 79, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0, 94, 0, 0, 0, 34,
- 0, 0, 0,101, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,104,
- 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0, 98,
- 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,114, 0, 0, 0, 34,
- 0, 0, 0,105, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,108,
- 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,102,
- 0, 0, 0,103, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,113, 0, 0, 0, 34,
- 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,108,
- 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,106,
- 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0, 34, 0, 0, 0,112, 0, 0, 0,113, 0, 0, 0, 34,
- 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 34, 0, 0, 0,110, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,121, 0, 0, 0,144,
- 0, 0, 0, 50, 0, 0, 0,125, 0, 0, 0,142, 0, 0, 0, 50, 0, 0, 0,129, 0, 0, 0,140, 0, 0, 0, 50, 0, 0, 0,133,
- 0, 0, 0,138, 0, 0, 0, 50, 0, 0, 0,120, 0, 0, 0,135, 0, 0, 0, 50, 0, 0, 0,118, 0, 0, 0,134, 0, 0, 0,178,
- 0, 0, 0,121, 0, 0, 0,125, 0, 0, 0, 50, 0, 0, 0,120, 0, 0, 0,121, 0, 0, 0, 50, 0, 0, 0,120, 0, 0, 0,124,
- 0, 0, 0, 50, 0, 0, 0,120, 0, 0, 0,119, 0, 0, 0, 50, 0, 0, 0,119, 0, 0, 0,123, 0, 0, 0, 50, 0, 0, 0,118,
- 0, 0, 0,119, 0, 0, 0, 50, 0, 0, 0,118, 0, 0, 0,122, 0, 0, 0, 50, 0, 0, 0,125, 0, 0, 0,129, 0, 0, 0, 50,
- 0, 0, 0,124, 0, 0, 0,125, 0, 0, 0, 50, 0, 0, 0,124, 0, 0, 0,128, 0, 0, 0, 50, 0, 0, 0,123, 0, 0, 0,124,
- 0, 0, 0, 50, 0, 0, 0,123, 0, 0, 0,127, 0, 0, 0, 50, 0, 0, 0,122, 0, 0, 0,123, 0, 0, 0, 50, 0, 0, 0,122,
- 0, 0, 0,126, 0, 0, 0,178, 0, 0, 0,129, 0, 0, 0,133, 0, 0, 0, 50, 0, 0, 0,128, 0, 0, 0,129, 0, 0, 0, 50,
- 0, 0, 0,128, 0, 0, 0,132, 0, 0, 0, 50, 0, 0, 0,127, 0, 0, 0,128, 0, 0, 0, 50, 0, 0, 0,127, 0, 0, 0,131,
- 0, 0, 0, 50, 0, 0, 0,126, 0, 0, 0,127, 0, 0, 0, 50, 0, 0, 0,126, 0, 0, 0,130, 0, 0, 0, 50, 0, 0, 0,132,
- 0, 0, 0,133, 0, 0, 0, 50, 0, 0, 0,131, 0, 0, 0,132, 0, 0, 0, 50, 0, 0, 0,130, 0, 0, 0,131, 0, 0, 0, 50,
- 0, 0, 0,137, 0, 0, 0,138, 0, 0, 0, 50, 0, 0, 0,138, 0, 0, 0,140, 0, 0, 0, 50, 0, 0, 0,139, 0, 0, 0,140,
- 0, 0, 0, 50, 0, 0, 0,137, 0, 0, 0,139, 0, 0, 0, 50, 0, 0, 0,140, 0, 0, 0,142, 0, 0, 0, 50, 0, 0, 0,141,
- 0, 0, 0,142, 0, 0, 0, 50, 0, 0, 0,142, 0, 0, 0,144, 0, 0, 0, 50, 0, 0, 0,143, 0, 0, 0,144, 0, 0, 0, 50,
- 0, 0, 0,141, 0, 0, 0,143, 0, 0, 0, 50, 0, 0, 0,136, 0, 0, 0,144, 0, 0, 0, 50, 0, 0, 0,117, 0, 0, 0,135,
- 0, 0, 0,178, 0, 0, 0,116, 0, 0, 0,135, 0, 0, 0, 50, 0, 0, 0,116, 0, 0, 0,134, 0, 0, 0,178, 0, 0, 0,119,
- 0, 0, 0,116, 0, 0, 0, 50, 0, 0, 0,117, 0, 0, 0,121, 0, 0, 0, 50, 0, 0, 0,117, 0, 0, 0,136, 0, 0, 0, 50,
- 0, 0, 0,136, 0, 0, 0,145, 0, 0, 0,178, 0, 0, 0,146, 0, 0, 0,147, 0, 0, 0,178, 0, 0, 0,147, 0, 0, 0,150,
- 0, 0, 0, 50, 0, 0, 0,149, 0, 0, 0,151, 0, 0, 0,178, 0, 0, 0,148, 0, 0, 0,151, 0, 0, 0, 50, 0, 0, 0,148,
- 0, 0, 0,150, 0, 0, 0,178, 0, 0, 0,138, 0, 0, 0,147, 0, 0, 0, 50, 0, 0, 0,130, 0, 0, 0,149, 0, 0, 0,178,
- 0, 0, 0,131, 0, 0, 0,151, 0, 0, 0, 50, 0, 0, 0,132, 0, 0, 0,148, 0, 0, 0, 50, 0, 0, 0,133, 0, 0, 0,150,
- 0, 0, 0, 50, 0, 0, 0,155, 0, 0, 0,171, 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 0,170, 0, 0, 0, 35, 0, 0, 0,153,
- 0, 0, 0,169, 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 0,168, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 0,159, 0, 0, 0, 35,
- 0, 0, 0,154, 0, 0, 0,155, 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 0,158, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 0,154,
- 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 0,157, 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 0,153, 0, 0, 0, 35, 0, 0, 0,152,
- 0, 0, 0,156, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 0,163, 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 0,159, 0, 0, 0, 35,
- 0, 0, 0,158, 0, 0, 0,162, 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 0,158, 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 0,161,
- 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 0,157, 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 0,160, 0, 0, 0, 35, 0, 0, 0,163,
- 0, 0, 0,167, 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 0,163, 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 0,166, 0, 0, 0, 35,
- 0, 0, 0,161, 0, 0, 0,162, 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 0,165, 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 0,161,
- 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 0,164, 0, 0, 0, 35, 0, 0, 0,166, 0, 0, 0,167, 0, 0, 0, 35, 0, 0, 0,165,
- 0, 0, 0,166, 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 0,165, 0, 0, 0, 35, 0, 0, 0,169, 0, 0, 0,170, 0, 0, 0, 35,
- 0, 0, 0,174, 0, 0, 0,175, 0, 0, 0, 35, 0, 0, 0,172, 0, 0, 0,176, 0, 0, 0, 35, 0, 0, 0,168, 0, 0, 0,172,
- 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 0,173, 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 0,174, 0, 0, 0, 35, 0, 0, 0,156,
- 0, 0, 0,175, 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 0,176, 0, 0, 0, 35, 0, 0, 0,177, 0, 0, 0,181, 0, 0, 0, 35,
- 0, 0, 0,177, 0, 0, 0,178, 0, 0, 0,163, 0, 0, 0,178, 0, 0, 0,179, 0, 0, 0, 35, 0, 0, 0,179, 0, 0, 0,180,
- 0, 0, 0,163, 0, 0, 0,171, 0, 0, 0,181, 0, 0, 0, 35, 0, 0, 0,167, 0, 0, 0,180, 0, 0, 0, 35, 0, 0, 0,163,
- 0, 0, 0,179, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 0,178, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 0,177, 0, 0, 0, 35,
- 0, 0, 0,182, 0, 0, 0,184, 0, 0, 0, 35, 0, 0, 0,183, 0, 0, 0,187, 0, 0, 0, 35, 0, 0, 0,185, 0, 0, 0,186,
- 0, 0, 0, 35, 0, 0, 0,180, 0, 0, 0,182, 0, 0, 0, 35, 0, 0, 0,173, 0, 0, 0,183, 0, 0, 0, 35, 0, 0, 0,164,
- 0, 0, 0,187, 0, 0, 0, 35, 0, 0, 0,165, 0, 0, 0,186, 0, 0, 0, 35, 0, 0, 0,166, 0, 0, 0,185, 0, 0, 0, 35,
- 0, 0, 0,167, 0, 0, 0,184, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,212, 16, 0, 0, 0,242, 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, 5, 32, 40, 32, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0,
- 0, 0, 0, 0, 85, 86, 84,101,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, 5, 32, 48, 32, 0, 0, 0, 6, 0, 0, 0, 64, 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, 5, 32, 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, 68, 65, 84, 65, 0, 0, 5,240, 5, 32, 40, 32, 0, 0, 0, 52, 0, 0, 0, 76, 0, 0, 0, 18, 0, 0, 0, 22,
- 0, 0, 0, 26, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 9,
- 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 9,
- 0, 0, 0, 25, 0, 0, 0, 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 11,
- 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13,
- 0, 0, 0, 17, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 14, 0, 0, 0, 0,
- 0, 0, 0, 17, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 32,
- 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 42,
- 0, 0, 0, 65, 0, 0, 0,114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 42, 0, 0, 0, 43,
- 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48,
- 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0, 48, 0, 0, 0, 0,
- 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 60,
- 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 58,
- 0, 0, 0, 59, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 68, 0, 0, 0, 67,
- 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 51,
- 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0, 0,
- 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 82,
- 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 82,
- 0, 0, 0, 83, 0, 0, 0, 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 75, 0, 0, 0, 74, 0, 0, 0, 93,
- 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 86,
- 0, 0, 0, 90, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0,
- 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 73, 0, 0, 0, 77,
- 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 78,
- 0, 0, 0, 52, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0,101,
- 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 72,
- 0, 0, 0, 41, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0,
- 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0,109, 0, 0, 0,105,
- 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106,
- 0, 0, 0, 70, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,112, 0, 0, 0,108, 0, 0, 0,109,
- 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,115,
- 0, 0, 0, 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 0,
- 0, 0, 0, 81, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,135, 0, 0, 0,120,
- 0, 0, 0,119, 0, 0, 0, 16, 0, 0, 0,125, 0, 0, 0,124, 0, 0, 0,120, 0, 0, 0,121, 0, 0, 0, 16, 0, 0, 0,123,
- 0, 0, 0,122, 0, 0, 0,118, 0, 0, 0,119, 0, 0, 0, 16, 0, 0, 0,128, 0, 0, 0,127, 0, 0, 0,123, 0, 0, 0,124,
- 0, 0, 0, 16, 0, 0, 0,133, 0, 0, 0,132, 0, 0, 0,128, 0, 0, 0,129, 0, 0, 0, 16, 0, 0, 0,131, 0, 0, 0,130,
- 0, 0, 0,126, 0, 0, 0,127, 0, 0, 0, 16, 0, 0, 0,148, 0, 0, 0,151, 0, 0, 0,131, 0, 0, 0,132, 0, 0, 0, 16,
- 0, 0, 0,147, 0, 0, 0,150, 0, 0, 0,133, 0, 0, 0,138, 0, 0, 0, 16, 0, 0, 0,137, 0, 0, 0,138, 0, 0, 0,140,
- 0, 0, 0,139, 0, 0, 0, 16, 0, 0, 0,140, 0, 0, 0,129, 0, 0, 0,125, 0, 0, 0,142, 0, 0, 0, 16, 0, 0, 0,141,
- 0, 0, 0,142, 0, 0, 0,144, 0, 0, 0,143, 0, 0, 0, 16, 0, 0, 0,144, 0, 0, 0,121, 0, 0, 0,117, 0, 0, 0,136,
- 0, 0, 0, 16, 0, 0, 0,171, 0, 0, 0,181, 0, 0, 0,177, 0, 0, 0,155, 0, 0, 0, 2, 0, 0, 0,154, 0, 0, 0,153,
- 0, 0, 0,169, 0, 0, 0,170, 0, 0, 0, 2, 0, 0, 0,152, 0, 0, 0,176, 0, 0, 0,172, 0, 0, 0,168, 0, 0, 0, 2,
- 0, 0, 0,159, 0, 0, 0,158, 0, 0, 0,154, 0, 0, 0,155, 0, 0, 0, 2, 0, 0, 0,157, 0, 0, 0,156, 0, 0, 0,152,
- 0, 0, 0,153, 0, 0, 0, 2, 0, 0, 0,179, 0, 0, 0,163, 0, 0, 0,159, 0, 0, 0,178, 0, 0, 0, 2, 0, 0, 0,162,
- 0, 0, 0,161, 0, 0, 0,157, 0, 0, 0,158, 0, 0, 0, 2, 0, 0, 0,160, 0, 0, 0,174, 0, 0, 0,175, 0, 0, 0,156,
- 0, 0, 0, 2, 0, 0, 0,167, 0, 0, 0,166, 0, 0, 0,162, 0, 0, 0,163, 0, 0, 0, 2, 0, 0, 0,165, 0, 0, 0,164,
- 0, 0, 0,160, 0, 0, 0,161, 0, 0, 0, 2, 0, 0, 0,182, 0, 0, 0,184, 0, 0, 0,167, 0, 0, 0,180, 0, 0, 0, 2,
- 0, 0, 0,185, 0, 0, 0,186, 0, 0, 0,165, 0, 0, 0,166, 0, 0, 0, 2, 0, 0, 0,187, 0, 0, 0,183, 0, 0, 0,173,
- 0, 0, 0,164, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 13, 16, 5, 32, 48, 32, 0, 0, 0, 60, 0, 0, 0, 76, 63, 27,168,250,
- 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 21, 59, 93,211, 96, 63, 81,128,146, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96,
- 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,227, 59, 93,211, 96, 63,185,131,174,
- 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 63,158,151,225, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 81,128,149, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,227, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,131,172, 24,
- 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,246, 59, 93,211, 96,
- 62,203,162, 86, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63,131,172, 24, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 21,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,174, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96,
- 63,158,151,226, 59, 93,211, 96, 63,185,131,176, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,144,
- 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96,
- 63,158,151,224, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96, 62,203,162, 85,
- 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 63, 27,168,248, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63,131,172, 22, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,185,131,176, 59, 93,211, 96, 63,185,131,174,
- 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76,
- 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161,
- 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236,
- 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161,
- 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 72, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236,
- 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52,
- 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,174, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,172,
- 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102,
- 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52,
- 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102,
- 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 56,
- 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 56, 63, 3, 28,220,
-189,188,105, 96, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200,
- 63, 79, 65,244, 61,104, 84,200, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 0,188,190, 63,160,188,171, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,200, 63, 79, 65,242,189,188,105, 96, 63, 41, 47,120,189,188,105,128,
- 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128,
- 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242,
- 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188,
- 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120,
- 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26,
- 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
-189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160,
- 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,140,131,180, 62,186, 19,116, 63,159,140,244, 63, 3, 28, 50, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 42,
- 63, 3, 28,244, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 62,186, 21, 0, 63, 38,207, 51, 62, 91,224, 24,
- 63, 76,226,112, 61,135, 38, 64, 63,114,244,240, 62, 91,221, 4, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,185,
- 61,135, 44, 96, 62,181, 84, 61,189,169,104,176, 63, 0,189, 93,190,109, 1, 80, 63, 38,207,248,189,169,109,144, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63, 41, 47,116, 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174, 62,186, 21, 0,
- 63,114,244, 42, 63, 3, 28,244, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,185, 62,186, 21, 0, 62,181, 84,122,
- 62, 91,224, 32, 63, 0,188,185, 61,135, 44, 96, 63, 38,207, 51, 62, 91,224, 24, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63, 79, 65,236, 63, 76,225,174, 63, 41, 47,116, 63,114,244, 44, 63, 79, 65,236,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63, 41, 47,120, 62,181, 84,122, 63, 3, 28,248, 63, 0,188,185,
- 62,186, 21, 0, 63, 38,207, 52, 63, 3, 28,248, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 14, 62,186, 21, 0,
- 61,104, 82,144, 62, 91,223,128, 62, 82, 94,138, 61,135, 43, 48, 62,181, 84,122, 62, 91,224, 32, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 0,188,190, 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242, 63, 0,188,188, 63, 41, 47,120, 63, 38,207, 52,
- 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63, 41, 47,120, 61,104, 84,160, 63, 3, 29, 0,
- 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122, 63, 3, 28,248, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190,
- 63,117, 84,102, 63, 38,207, 56, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120,
- 62,181, 84,127, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64,
- 63, 3, 28,216,189,188,106,128, 62,186, 20,176, 61,104, 84,160, 63, 3, 29, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,207, 56, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172,
- 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111,
- 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102,
- 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52,
- 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111,
- 63, 76,225,174, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 72, 63,114,244, 44,
- 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44,
- 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210,
- 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99,
- 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,
- 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26,
- 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,
-189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26,
- 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122,
- 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102,
- 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128,
- 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102,
- 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,200,
- 63, 79, 65,242,189,188,105, 96, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,190, 63,160,188,171, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113,
- 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200,
- 63, 79, 65,244, 61,104, 84,200, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
-189,188,105, 96, 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 56, 63, 3, 28,220,189,188,105, 96, 63, 41, 47,120,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 4,192, 5, 32, 62, 32, 0, 0, 0, 57, 0, 0, 1, 48,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 68, 65, 84, 65, 0, 0, 17,208, 5, 30, 70, 32, 0, 0, 0, 51, 0, 0, 0, 76, 0, 0, 0, 0, 63, 27,168,250, 59, 93,211, 96,
- 62,203,162, 84, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,131,172, 21, 59, 93,211, 96, 63, 81,128,146,
- 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,158,151,227, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96,
- 63,185,131,174, 59, 93,211, 96, 63,158,151,225, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 81,128,149, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 63, 27,168,246,
- 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,158,151,227, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96,
- 63,158,151,226, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 27,168,246, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 63, 27,168,247,
- 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,131,172, 24, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,185,131,174,
- 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,185,131,176, 59, 93,211, 96,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96,
- 63, 27,168,247, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,131,172, 21,
- 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96,
- 62,203,162, 86, 59, 93,211, 96, 63, 27,168,248, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144,
- 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,185,131,176, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96,
- 63,158,151,224, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99,
- 63, 41, 47, 76,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,140,131, 99,
- 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210,
- 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 72, 63,114,244, 44,
- 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111,
- 63, 38,207, 52, 63,141,179,111, 63, 76,225,174, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188,
- 63,160,188,173, 63, 38,207, 52, 63,141,179,111,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102,
- 63,114,244, 44, 63, 79, 65,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172,
- 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244, 44,
- 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111,
- 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,190,118,127, 56,
- 63, 3, 28,220,190,118,127, 56, 63, 3, 28,220,189,188,105, 96, 63, 41, 47,120,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200, 63, 79, 65,244,
- 61,104, 84,200, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,190, 63,160,188,171, 62,181, 84,122, 63,141,179,113, 62,181, 84,122,
- 63,141,179,113, 63, 0,188,188, 63,160,188,173,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,104, 84,200, 63, 79, 65,242,189,188,105, 96, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120,
- 61,104, 84,160, 63, 79, 65,242,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122,
- 63,141,179,113,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 82, 95, 26,
- 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173,
- 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128,
- 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102,
- 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64,
- 63, 3, 28,216,189,188,105,128, 63, 41, 47,120,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242,
- 62, 82, 95, 26, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 62,181, 84,122,
- 63,141,179,113,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,140,131,180, 62,186, 19,116, 63,159,140,244, 63, 3, 28, 50, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 42, 63, 3, 28,244,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,225,174,
- 62,186, 21, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 76,226,112, 61,135, 38, 64, 63,114,244,240, 62, 91,221, 4,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,185, 61,135, 44, 96,
- 62,181, 84, 61,189,169,104,176, 63, 0,189, 93,190,109, 1, 80, 63, 38,207,248,189,169,109,144,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,225,174, 63, 41, 47,116, 63, 38,207, 52,
- 63, 3, 28,248, 63, 76,225,174, 62,186, 21, 0, 63,114,244, 42, 63, 3, 28,244,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,185, 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32,
- 63, 0,188,185, 61,135, 44, 96, 63, 38,207, 51, 62, 91,224, 24,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63, 79, 65,236, 63, 76,225,174,
- 63, 41, 47,116, 63,114,244, 44, 63, 79, 65,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,188, 63, 41, 47,120, 62,181, 84,122, 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0,
- 63, 38,207, 52, 63, 3, 28,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 82, 95, 14, 62,186, 21, 0, 61,104, 82,144, 62, 91,223,128, 62, 82, 94,138, 61,135, 43, 48, 62,181, 84,122,
- 62, 91,224, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 0,188,190, 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242, 63, 0,188,188, 63, 41, 47,120, 63, 38,207, 52, 63, 79, 65,236,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 82, 95, 26,
- 63, 41, 47,120, 61,104, 84,160, 63, 3, 29, 0, 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122, 63, 3, 28,248,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,190, 63,117, 84,102,
- 63, 38,207, 56, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160,
- 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120, 62,181, 84,127, 63, 79, 65,242,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,
-189,188,106,128, 62,186, 20,176, 61,104, 84,160, 63, 3, 29, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172,
- 63,117, 84,102, 63, 38,207, 52, 63,141,179,111,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102,
- 63,114,244, 44, 63, 79, 65,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52,
- 63,141,179,111,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244, 44,
- 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111,
- 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52,
- 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,174, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 72, 63,114,244, 44, 63, 79, 65,236,
- 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99,
- 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236,
- 63,140,131, 99, 63, 41, 47, 76,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161,
- 63, 3, 28,210,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122,
- 63,141,179,113, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102,
- 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64,
- 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102,
- 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128,
- 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113,
- 63, 0,188,188, 63,160,188,173,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26,
- 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
-189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122,
- 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,104, 84,200, 63, 79, 65,242,
-189,188,105, 96, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,190, 63,160,188,171, 62,181, 84,122,
- 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200, 63, 79, 65,244,
- 61,104, 84,200, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 56,
- 63, 3, 28,220,189,188,105, 96, 63, 41, 47,120,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 1, 20, 2,236,213, 64, 0, 0, 0, 50, 0, 0, 0, 1, 2,236,218, 64, 2,236,208,112,
- 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 49, 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, 2,235,202, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236,214,128, 5, 32,118, 32, 5, 32,124, 32, 5, 30, 70, 32, 5, 32, 86, 32, 5, 32,102, 32, 0, 0, 0, 0, 5, 32,138, 32,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,214,176, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 20, 0, 0, 0, 0, 2,236,215,224, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 2,236,217, 16,
- 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0,182, 0, 0, 1, 45, 0, 0, 0, 74, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1, 63, 76,204,213, 63, 76,204,255,182,104, 0, 0, 63,128, 0, 30, 63,128, 0,140, 63,127,255,214,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,236,214,128, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,214,176, 0, 0, 0,242, 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, 5, 32, 86, 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, 68, 65, 84, 65,176, 14, 0, 0, 96, 5,118, 1,
+ 0, 0, 0, 0, 56, 0, 0, 0,188, 0, 0, 0,133,102,230, 63,208, 51,179, 63,146,255,127, 63,127,165, 0, 0,129, 90, 2,255,
+133,102,230, 63,206,154, 25, 63,146,255,127, 63,127,165, 0, 0,129, 90, 2,255, 81, 51,179, 63,210, 51,179, 63,148,255,127, 63,
+ 0, 0, 0, 0,255,127, 2,255, 28, 0,128, 63,212, 51,179, 63,152,255,127, 63, 0, 0, 0, 0,255,127, 2,255,207,153, 25, 63,
+214, 51,179, 63,154,255,127, 63, 0, 0, 0, 0,255,127, 2,255,152,205, 76, 62,216, 51,179, 63,156,255,127, 63, 0, 0, 0, 0,
+255,127, 2,255, 80, 51,179, 63,158, 0,128, 63,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,160, 0,128, 63,
+150,255,127, 63, 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,162, 0,128, 63,154,255,127, 63, 0, 0, 0, 0,255,127, 2,255,
+140,205, 76, 62,163, 0,128, 63,156,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 80, 51,179, 63,209,154, 25, 63,148,255,127, 63,
+ 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,213,154, 25, 63,150,255,127, 63, 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,
+217,154, 25, 63,154,255,127, 63, 0, 0, 0, 0,255,127, 2,255,140,205, 76, 62,221,154, 25, 63,156,255,127, 63, 0, 0, 0, 0,
+255,127, 2,255, 80, 51,179, 63,160,209, 76, 62,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,176,209, 76, 62,
+150,255,127, 63, 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,188,209, 76, 62,152,255,127, 63, 0, 0, 0, 0,255,127, 2,255,
+140,205, 76, 62,204,209, 76, 62,154,255,127, 63, 0, 0, 0, 0,255,127, 2,255,140,205, 76, 62, 8,103,230, 63,148,255,127, 63,
+ 0, 0,127,165,129, 90, 0,255,204,153, 25, 63, 10,103,230, 63,146,255,127, 63, 0, 0,127,165,129, 90, 0,255, 27, 0,128, 63,
+ 10,103,230, 63,142,255,127, 63, 0, 0,127,165,129, 90, 0,255, 80, 51,179, 63, 12,103,230, 63,140,255,127, 63, 0, 0,127,165,
+129, 90, 0,255,152,205, 76,190, 12,103,230, 63,140,255,127, 63, 0, 0,127,165,129, 90, 0,255,152,205, 76,190,160,209, 76, 62,
+148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,152,205, 76,190,209,154, 25, 63,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,
+152,205, 76,190,158, 0,128, 63,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,144,205, 76,190,210, 51,179, 63,148,255,127, 63,
+ 0, 0, 0, 0,255,127, 2,255,131,102,230, 63, 7,103,230, 63,148,255,127, 63, 0, 0,127,165,129, 90, 0,255,131,102,230, 63,
+160, 0,128, 63,142,255,127, 63,127,165, 0, 0,129, 90, 2,255,127,102,230, 63, 28,208, 76, 62,148,255,127, 63,127,165, 0, 0,
+129, 90, 2,255,146,205, 76,190, 72,208, 76,190,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,150,205, 76, 62, 24,208, 76,190,
+156,255,127, 63, 0, 0, 0, 0,255,127, 2,255,207,153, 25, 63, 40,208, 76,190,154,255,127, 63, 0, 0, 0, 0,255,127, 2,255,
+ 28, 0,128, 63, 56,208, 76,190,152,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 81, 51,179, 63, 72,208, 76,190,148,255,127, 63,
+ 0, 0, 0, 0,255,127, 2,255,133,102,230, 63, 88,208, 76,190,146,255,127, 63, 0, 0, 0, 0,255,127, 2,255,133,102,230, 63,
+ 88,208, 76,190, 4, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 81, 51,179, 63, 72,208, 76,190, 3, 0,128,191, 0, 0, 0, 0,
+255,127, 2,255, 28, 0,128, 63, 56,208, 76,190, 1, 0,128,191, 0, 0, 0, 0,255,127, 2,255,207,153, 25, 63, 40,208, 76,190,
+ 0, 0,128,191, 0, 0, 0, 0,255,127, 2,255,150,205, 76, 62, 24,208, 76,190,254,255,127,191, 0, 0, 0, 0,255,127, 2,255,
+146,205, 76,190, 72,208, 76,190, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,127,102,230, 63, 28,208, 76, 62,155,153, 25,191,
+ 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,136,201, 76,190,159,153, 25,191, 1,128, 0, 0, 0, 0, 2,255,127,102,230, 63,
+ 28,208, 76, 62,193,204, 76,190, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,136,201, 76,190,209,204, 76,190, 1,128, 0, 0,
+ 0, 0, 2,255,127,102,230, 63, 28,208, 76, 62,219,204, 76, 62, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,136,201, 76,190,
+203,204, 76, 62, 1,128, 0, 0, 0, 0, 2,255,127,102,230, 63, 28,208, 76, 62,159,153, 25, 63, 1,128, 0, 0, 0, 0, 2,255,
+131,102,230, 63,136,201, 76,190,155,153, 25, 63, 1,128, 0, 0, 0, 0, 2,255,127,102,230, 63, 28,208, 76, 62, 3, 0,128,191,
+127,165, 0, 0,129, 90, 2,255,131,102,230, 63,160, 0,128, 63, 6, 0,128,191,127,165, 0, 0,129, 90, 2,255,131,102,230, 63,
+ 7,103,230, 63, 3, 0,128,191, 0, 0,127,165,129, 90, 0,255,135,102,230, 63,207,154, 25, 63,151,153, 25, 63, 1,128, 0, 0,
+ 0, 0, 2,255,131,102,230, 63,156, 0,128, 63,151,153, 25, 63, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,212, 51,179, 63,
+155,153, 25, 63, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63, 7,103,230, 63,159,153, 25, 63,127,165,127,165, 0, 0, 2,255,
+135,102,230, 63,207,154, 25, 63,171,204, 76, 62, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,160, 0,128, 63,187,204, 76, 62,
+ 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,212, 51,179, 63,203,204, 76, 62, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,
+ 7,103,230, 63,219,204, 76, 62,127,165,127,165, 0, 0, 2,255,135,102,230, 63,207,154, 25, 63,241,204, 76,190, 1,128, 0, 0,
+ 0, 0, 2,255,131,102,230, 63,160, 0,128, 63,225,204, 76,190, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,212, 51,179, 63,
+209,204, 76,190, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63, 7,103,230, 63,193,204, 76,190,127,165,127,165, 0, 0, 2,255,
+135,102,230, 63,207,154, 25, 63,167,153, 25,191, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,160, 0,128, 63,163,153, 25,191,
+ 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,212, 51,179, 63,159,153, 25,191, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,
+ 7,103,230, 63,155,153, 25,191,127,165,127,165, 0, 0, 2,255,144,205, 76,190,210, 51,179, 63, 3, 0,128,191, 0, 0, 0, 0,
+255,127, 2,255,152,205, 76,190,158, 0,128, 63, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,152,205, 76,190,209,154, 25, 63,
+ 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,152,205, 76,190,160,209, 76, 62, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,
+152,205, 76,190, 12,103,230, 63,168,153, 25,191, 0, 0, 1,128, 0, 0, 2,255,152,205, 76,190, 12,103,230, 63,244,204, 76,190,
+ 0, 0, 1,128, 0, 0, 2,255,152,205, 76,190, 12,103,230, 63,168,204, 76, 62, 0, 0, 1,128, 0, 0, 2,255,144,205, 76,190,
+ 12,103,230, 63,150,153, 25, 63, 0, 0, 1,128, 0, 0, 2,255,152,205, 76,190, 12,103,230, 63, 7, 0,128,191, 0, 0,127,165,
+129, 90, 0,255, 80, 51,179, 63, 12,103,230, 63, 7, 0,128,191, 0, 0,127,165,129, 90, 0,255, 27, 0,128, 63, 10,103,230, 63,
+ 6, 0,128,191, 0, 0,127,165,129, 90, 0,255,204,153, 25, 63, 10,103,230, 63, 4, 0,128,191, 0, 0,127,165,129, 90, 0,255,
+140,205, 76, 62, 8,103,230, 63, 3, 0,128,191, 0, 0,127,165,129, 90, 0,255, 81, 51,179, 63, 12,103,230, 63,150,153, 25, 63,
+ 0, 0, 1,128, 0, 0, 2,255, 28, 0,128, 63, 10,103,230, 63,150,153, 25, 63, 0, 0, 1,128, 0, 0, 2,255,207,153, 25, 63,
+ 10,103,230, 63,154,153, 25, 63, 0, 0, 1,128, 0, 0, 2,255,152,205, 76, 62, 8,103,230, 63,158,153, 25, 63, 0, 0, 1,128,
+ 0, 0, 2,255, 80, 51,179, 63, 12,103,230, 63,168,204, 76, 62, 0, 0, 1,128, 0, 0, 2,255, 27, 0,128, 63, 10,103,230, 63,
+184,204, 76, 62, 0, 0, 1,128, 0, 0, 2,255,204,153, 25, 63, 10,103,230, 63,200,204, 76, 62, 0, 0, 1,128, 0, 0, 2,255,
+140,205, 76, 62, 8,103,230, 63,216,204, 76, 62, 0, 0, 1,128, 0, 0, 2,255, 80, 51,179, 63, 12,103,230, 63,244,204, 76,190,
+ 0, 0, 1,128, 0, 0, 2,255, 27, 0,128, 63, 10,103,230, 63,228,204, 76,190, 0, 0, 1,128, 0, 0, 2,255,204,153, 25, 63,
+ 10,103,230, 63,212,204, 76,190, 0, 0, 1,128, 0, 0, 2,255,140,205, 76, 62, 8,103,230, 63,196,204, 76,190, 0, 0, 1,128,
+ 0, 0, 2,255, 80, 51,179, 63, 12,103,230, 63,168,153, 25,191, 0, 0, 1,128, 0, 0, 2,255, 27, 0,128, 63, 10,103,230, 63,
+164,153, 25,191, 0, 0, 1,128, 0, 0, 2,255,204,153, 25, 63, 10,103,230, 63,160,153, 25,191, 0, 0, 1,128, 0, 0, 2,255,
+140,205, 76, 62, 8,103,230, 63,156,153, 25,191, 0, 0, 1,128, 0, 0, 2,255,140,205, 76, 62,204,209, 76, 62,255,255,127,191,
+ 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,188,209, 76, 62, 1, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,
+176,209, 76, 62, 2, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 80, 51,179, 63,160,209, 76, 62, 3, 0,128,191, 0, 0, 0, 0,
+255,127, 2,255,140,205, 76, 62,221,154, 25, 63,254,255,127,191, 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,217,154, 25, 63,
+ 0, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,213,154, 25, 63, 2, 0,128,191, 0, 0, 0, 0,255,127, 2,255,
+ 80, 51,179, 63,209,154, 25, 63, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,140,205, 76, 62,163, 0,128, 63,254,255,127,191,
+ 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,162, 0,128, 63, 0, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,
+160, 0,128, 63, 2, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 80, 51,179, 63,158, 0,128, 63, 3, 0,128,191, 0, 0, 0, 0,
+255,127, 2,255,152,205, 76, 62,216, 51,179, 63,254,255,127,191, 0, 0, 0, 0,255,127, 2,255,207,153, 25, 63,214, 51,179, 63,
+ 0, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 28, 0,128, 63,212, 51,179, 63, 1, 0,128,191, 0, 0, 0, 0,255,127, 2,255,
+ 81, 51,179, 63,210, 51,179, 63, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,133,102,230, 63,206,154, 25, 63, 4, 0,128,191,
+127,165, 0, 0,129, 90, 2,255,133,102,230, 63,208, 51,179, 63, 4, 0,128,191,127,165, 0, 0,129, 90, 2,255,128,205, 76,190,
+116,201, 76, 62, 5, 0,128,191,255,127, 0, 0, 0, 0, 16,255,136,205, 76,190, 48,255,127, 63, 5, 0,128,191,255,127, 0, 0,
+ 0, 0, 16,255,112,205, 76,190, 64,208, 76,190,156,153, 25,191,255,127, 0, 0, 0, 0, 16,255,112,205, 76,190, 84,201, 76, 62,
+160,153, 25,191,255,127, 0, 0, 0, 0, 18,255,120,205, 76,190,190,152, 25, 63,164,153, 25,191,255,127, 0, 0, 0, 0, 18,255,
+152,205, 76,190, 46,255,127, 63,168,153, 25,191,255,127, 0, 0, 0, 0, 18,255,112,205, 76,190, 64,208, 76,190,195,204, 76,190,
+255,127, 0, 0, 0, 0, 16,255,112,205, 76,190, 84,201, 76, 62,211,204, 76,190,255,127, 0, 0, 0, 0, 18,255,120,205, 76,190,
+190,152, 25, 63,227,204, 76,190,255,127, 0, 0, 0, 0, 18,255,152,205, 76,190, 46,255,127, 63,243,204, 76,190,255,127, 0, 0,
+ 0, 0, 18,255,112,205, 76,190, 64,208, 76,190,221,204, 76, 62,255,127, 0, 0, 0, 0, 16,255,112,205, 76,190, 84,201, 76, 62,
+205,204, 76, 62,255,127, 0, 0, 0, 0, 18,255,120,205, 76,190,190,152, 25, 63,189,204, 76, 62,255,127, 0, 0, 0, 0, 18,255,
+152,205, 76,190, 46,255,127, 63,173,204, 76, 62,255,127, 0, 0, 0, 0, 18,255,112,205, 76,190, 64,208, 76,190,160,153, 25, 63,
+255,127, 0, 0, 0, 0, 16,255,112,205, 76,190, 84,201, 76, 62,156,153, 25, 63,255,127, 0, 0, 0, 0, 18,255,120,205, 76,190,
+198,152, 25, 63,152,153, 25, 63,255,127, 0, 0, 0, 0, 18,255,152,205, 76,190, 46,255,127, 63,152,153, 25, 63,255,127, 0, 0,
+ 0, 0, 18,255,112,205, 76,190, 64,208, 76,190, 4, 0,128,191, 94,231, 94,231,215,132, 16,255,120,205, 76,190,190,152, 25, 63,
+ 7, 0,128,191,255,127, 0, 0, 0, 0, 16,255, 96,205, 76,190,251, 50,179, 63, 4, 0,128,191,255,127, 0, 0, 0, 0, 16,255,
+128,205, 76,190, 48,102,230, 63,156,153, 25, 63,255,127, 0, 0, 0, 0, 18,255, 96,205, 76,190,251, 50,179, 63,160,153, 25, 63,
+255,127, 0, 0, 0, 0, 18,255,128,205, 76,190, 48,102,230, 63,205,204, 76, 62,255,127, 0, 0, 0, 0, 18,255, 96,205, 76,190,
+251, 50,179, 63,221,204, 76, 62,255,127, 0, 0, 0, 0, 18,255,128,205, 76,190, 48,102,230, 63,211,204, 76,190,255,127, 0, 0,
+ 0, 0, 18,255, 96,205, 76,190,251, 50,179, 63,195,204, 76,190,255,127, 0, 0, 0, 0, 18,255,128,205, 76,190, 48,102,230, 63,
+160,153, 25,191,255,127, 0, 0, 0, 0, 18,255, 96,205, 76,190,251, 50,179, 63,156,153, 25,191,255,127, 0, 0, 0, 0, 18,255,
+144,205, 76,190, 10,103,230, 63, 5, 0,128,191,161,243, 93,111, 34,194, 16,255,144,205, 76,190, 10,103,230, 63,148,255,127, 63,
+161,243, 93,111,222, 61, 16,255, 96,205, 76,190,251, 50,179, 63,150,255,127, 63,255,127, 0, 0, 0, 0, 16,255,120,205, 76,190,
+190,152, 25, 63,144,255,127, 63,255,127, 0, 0, 0, 0, 16,255,112,205, 76,190, 64,208, 76,190,150,255,127, 63, 94,231, 94,231,
+ 41,123, 16,255,136,205, 76,190, 48,255,127, 63,148,255,127, 63,255,127, 0, 0, 0, 0, 16,255,128,205, 76,190,116,201, 76, 62,
+148,255,127, 63,255,127, 0, 0, 0, 0, 16,255, 36, 51,179, 63, 56,208, 76,190,157,153, 25,191, 0, 0,255,127, 0, 0, 3,255,
+222,255,127, 63, 80,208, 76,190,161,153, 25,191, 0, 0,255,127, 0, 0, 3,255,116,153, 25, 63, 80,208, 76,190,165,153, 25,191,
+ 0, 0,255,127, 0, 0, 3,255, 44,204, 76, 62,104,208, 76,190,169,153, 25,191, 0, 0,255,127, 0, 0, 3,255, 36, 51,179, 63,
+ 56,208, 76,190,198,204, 76,190, 0, 0,255,127, 0, 0, 3,255,222,255,127, 63, 80,208, 76,190,214,204, 76,190, 0, 0,255,127,
+ 0, 0, 3,255,116,153, 25, 63, 80,208, 76,190,230,204, 76,190, 0, 0,255,127, 0, 0, 3,255, 44,204, 76, 62,104,208, 76,190,
+246,204, 76,190, 0, 0,255,127, 0, 0, 3,255, 36, 51,179, 63, 56,208, 76,190,218,204, 76, 62, 0, 0,255,127, 0, 0, 3,255,
+222,255,127, 63, 80,208, 76,190,202,204, 76, 62, 0, 0,255,127, 0, 0, 3,255,116,153, 25, 63, 80,208, 76,190,186,204, 76, 62,
+ 0, 0,255,127, 0, 0, 3,255, 44,204, 76, 62,104,208, 76,190,170,204, 76, 62, 0, 0,255,127, 0, 0, 3,255, 34, 51,179, 63,
+ 56,208, 76,190,159,153, 25, 63, 0, 0,255,127, 0, 0, 3,255,220,255,127, 63, 80,208, 76,190,155,153, 25, 63, 0, 0,255,127,
+ 0, 0, 3,255,114,153, 25, 63, 80,208, 76,190,151,153, 25, 63, 0, 0,255,127, 0, 0, 3,255, 36,204, 76, 62,104,208, 76,190,
+151,153, 25, 63, 0, 0,255,127, 0, 0, 3,255, 36, 51,179, 63, 56,208, 76,190, 4, 0,128,191, 0, 0,255,127, 0, 0, 3,255,
+222,255,127, 63, 80,208, 76,190, 5, 0,128,191, 0, 0,255,127, 0, 0, 3,255,116,153, 25, 63, 80,208, 76,190, 7, 0,128,191,
+ 0, 0,255,127, 0, 0, 3,255, 44,204, 76, 62,104,208, 76,190, 8, 0,128,191, 0, 0,255,127, 0, 0, 3,255,136,102,230, 63,
+ 88,208, 76,190, 8, 0,128,191, 0, 0,255,127, 0, 0, 3,255,135,102,230, 63, 88,208, 76,190,151,153, 25, 63, 0, 0,255,127,
+ 0, 0, 3,255,136,102,230, 63, 88,208, 76,190,170,204, 76, 62, 0, 0,255,127, 0, 0, 3,255,136,102,230, 63, 88,208, 76,190,
+246,204, 76,190, 0, 0,255,127, 0, 0, 3,255,136,102,230, 63, 88,208, 76,190,169,153, 25,191, 0, 0,255,127, 0, 0, 3,255,
+112,205, 76,190, 64,208, 76,190,156,153, 25,191, 0, 0,255,127, 0, 0, 1,255,112,205, 76,190, 64,208, 76,190,195,204, 76,190,
+ 0, 0,255,127, 0, 0, 1,255,112,205, 76,190, 64,208, 76,190,221,204, 76, 62, 0, 0,255,127, 0, 0, 1,255,112,205, 76,190,
+ 64,208, 76,190,160,153, 25, 63, 0, 0,255,127, 0, 0, 1,255,112,205, 76,190, 64,208, 76,190, 4, 0,128,191, 0, 0,255,127,
+ 0, 0, 3,255,112,205, 76,190, 64,208, 76,190,150,255,127, 63, 0, 0,255,127, 0, 0, 3,255,136,102,230, 63, 88,208, 76,190,
+142,255,127, 63, 0, 0,255,127, 0, 0, 3,255, 44,204, 76, 62,104,208, 76,190,142,255,127, 63, 0, 0,255,127, 0, 0, 3,255,
+116,153, 25, 63, 80,208, 76,190,144,255,127, 63, 0, 0,255,127, 0, 0, 3,255,222,255,127, 63, 80,208, 76,190,148,255,127, 63,
+ 0, 0,255,127, 0, 0, 3,255, 36, 51,179, 63, 56,208, 76,190,150,255,127, 63, 0, 0,255,127, 0, 0, 3,255, 68, 65, 84, 65,
+ 64, 1, 0, 0, 80, 20,118, 1, 0, 0, 0, 0, 5, 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,208, 21,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,124, 14, 0, 0,208, 21,118, 1,
+ 0, 0, 0, 0, 53, 0, 0, 0, 53, 1, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 83, 0, 0, 0,
+ 0, 0, 34, 0, 19, 0, 0, 0, 84, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0,
+ 76, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0,
+ 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 48, 0, 0, 0,
+ 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0,
+ 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 34, 0, 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0,
+ 8, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 34, 0, 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0,
+ 10, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0,
+ 12, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0,
+ 4, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 26, 0, 0, 0,
+ 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0,
+ 23, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0,
+ 5, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 28, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0,
+ 27, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 29, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0,
+ 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 33, 0, 0, 0,
+ 0, 0, 34, 0, 29, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 30, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0,
+ 34, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0,
+ 17, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0, 98, 0, 0, 0, 0, 0, 34, 0, 39, 0, 0, 0, 99, 0, 0, 0,
+ 0, 0, 34, 0, 38, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 37, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0, 41, 0, 0, 0,
+ 72, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0,
+ 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,109, 0, 0, 0,
+ 0, 0, 34, 0, 50, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0,
+ 90, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 86, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0,
+ 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0,114, 0, 0, 0,
+ 0, 0, 34, 0, 67, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,
+115, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0,
+ 43, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 44, 0, 0, 0,
+ 0, 0, 34, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0,
+ 49, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0,
+ 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 55, 0, 0, 0,
+ 0, 0, 34, 0, 53, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0,
+ 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0,
+ 54, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 58, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 57, 0, 0, 0,
+ 0, 0, 34, 0, 60, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 63, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0,
+ 63, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0,
+ 61, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 68, 0, 0, 0,
+ 0, 0, 34, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 63, 0, 0, 0, 67, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0,
+ 67, 0, 0, 0, 0, 0, 34, 0, 62, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0,
+ 61, 0, 0, 0, 65, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 66, 0, 0, 0,
+ 0, 0, 34, 0, 48, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 57, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0,
+ 61, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 65, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,
+ 70, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0, 72, 0, 0, 0, 98, 0, 0, 0,
+ 0, 0, 34, 0, 73, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 75, 0, 0, 0,
+ 89, 0, 0, 0, 0, 0, 34, 0, 76, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 77, 0, 0, 0, 81, 0, 0, 0, 0, 0, 34, 0,
+ 70, 0, 0, 0, 71, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 74, 0, 0, 0, 75, 0, 0, 0,
+ 0, 0, 34, 0, 69, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,
+111, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,
+ 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0, 84, 0, 0, 0,
+ 0, 0, 34, 0, 82, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0, 85, 0, 0, 0, 89, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0,
+ 89, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0, 88, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0, 88, 0, 0, 0, 0, 0, 34, 0,
+ 83, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0, 82, 0, 0, 0, 86, 0, 0, 0,
+ 0, 0, 34, 0, 89, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0,
+ 92, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 92, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0,
+ 90, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0, 97, 0, 0, 0,
+ 0, 0, 34, 0, 96, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0,
+ 96, 0, 0, 0, 0, 0, 34, 0, 91, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0,
+ 90, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0, 96, 0, 0, 0,
+ 0, 0, 34, 0, 79, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,
+105, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,
+ 99, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0, 99, 0, 0, 0,
+ 0, 0, 34, 0, 98, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,114, 0, 0, 0, 0, 0, 34, 0,105, 0, 0, 0,
+109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,
+103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,103, 0, 0, 0,
+ 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,
+109, 0, 0, 0, 0, 0, 34, 0,108, 0, 0, 0,112, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,
+107, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,110, 0, 0, 0,
+ 0, 0, 34, 0,113, 0, 0, 0,115, 0, 0, 0, 0, 0, 34, 0,112, 0, 0, 0,113, 0, 0, 0, 0, 0, 34, 0,111, 0, 0, 0,
+112, 0, 0, 0, 0, 0, 34, 0,110, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0,121, 0, 0, 0,144, 0, 0, 0, 0, 0, 50, 0,
+125, 0, 0, 0,142, 0, 0, 0, 0, 0, 50, 0,129, 0, 0, 0,140, 0, 0, 0, 0, 0, 50, 0,133, 0, 0, 0,138, 0, 0, 0,
+ 0, 0, 50, 0,120, 0, 0, 0,135, 0, 0, 0, 0, 0, 50, 0,118, 0, 0, 0,134, 0, 0, 0, 0, 0,178, 0,121, 0, 0, 0,
+125, 0, 0, 0, 0, 0, 50, 0,120, 0, 0, 0,121, 0, 0, 0, 0, 0, 50, 0,120, 0, 0, 0,124, 0, 0, 0, 0, 0, 50, 0,
+120, 0, 0, 0,119, 0, 0, 0, 0, 0, 50, 0,119, 0, 0, 0,123, 0, 0, 0, 0, 0, 50, 0,118, 0, 0, 0,119, 0, 0, 0,
+ 0, 0, 50, 0,118, 0, 0, 0,122, 0, 0, 0, 0, 0, 50, 0,125, 0, 0, 0,129, 0, 0, 0, 0, 0, 50, 0,124, 0, 0, 0,
+125, 0, 0, 0, 0, 0, 50, 0,124, 0, 0, 0,128, 0, 0, 0, 0, 0, 50, 0,123, 0, 0, 0,124, 0, 0, 0, 0, 0, 50, 0,
+123, 0, 0, 0,127, 0, 0, 0, 0, 0, 50, 0,122, 0, 0, 0,123, 0, 0, 0, 0, 0, 50, 0,122, 0, 0, 0,126, 0, 0, 0,
+ 0, 0,178, 0,129, 0, 0, 0,133, 0, 0, 0, 0, 0, 50, 0,128, 0, 0, 0,129, 0, 0, 0, 0, 0, 50, 0,128, 0, 0, 0,
+132, 0, 0, 0, 0, 0, 50, 0,127, 0, 0, 0,128, 0, 0, 0, 0, 0, 50, 0,127, 0, 0, 0,131, 0, 0, 0, 0, 0, 50, 0,
+126, 0, 0, 0,127, 0, 0, 0, 0, 0, 50, 0,126, 0, 0, 0,130, 0, 0, 0, 0, 0, 50, 0,132, 0, 0, 0,133, 0, 0, 0,
+ 0, 0, 50, 0,131, 0, 0, 0,132, 0, 0, 0, 0, 0, 50, 0,130, 0, 0, 0,131, 0, 0, 0, 0, 0, 50, 0,137, 0, 0, 0,
+138, 0, 0, 0, 0, 0, 50, 0,138, 0, 0, 0,140, 0, 0, 0, 0, 0, 50, 0,139, 0, 0, 0,140, 0, 0, 0, 0, 0, 50, 0,
+137, 0, 0, 0,139, 0, 0, 0, 0, 0, 50, 0,140, 0, 0, 0,142, 0, 0, 0, 0, 0, 50, 0,141, 0, 0, 0,142, 0, 0, 0,
+ 0, 0, 50, 0,142, 0, 0, 0,144, 0, 0, 0, 0, 0, 50, 0,143, 0, 0, 0,144, 0, 0, 0, 0, 0, 50, 0,141, 0, 0, 0,
+143, 0, 0, 0, 0, 0, 50, 0,136, 0, 0, 0,144, 0, 0, 0, 0, 0, 50, 0,117, 0, 0, 0,135, 0, 0, 0, 0, 0,178, 0,
+116, 0, 0, 0,135, 0, 0, 0, 0, 0, 50, 0,116, 0, 0, 0,134, 0, 0, 0, 0, 0,178, 0,119, 0, 0, 0,116, 0, 0, 0,
+ 0, 0, 50, 0,117, 0, 0, 0,121, 0, 0, 0, 0, 0, 50, 0,117, 0, 0, 0,136, 0, 0, 0, 0, 0, 50, 0,136, 0, 0, 0,
+145, 0, 0, 0, 0, 0,178, 0,146, 0, 0, 0,147, 0, 0, 0, 0, 0,178, 0,147, 0, 0, 0,150, 0, 0, 0, 0, 0, 50, 0,
+149, 0, 0, 0,151, 0, 0, 0, 0, 0,178, 0,148, 0, 0, 0,151, 0, 0, 0, 0, 0, 50, 0,148, 0, 0, 0,150, 0, 0, 0,
+ 0, 0,178, 0,138, 0, 0, 0,147, 0, 0, 0, 0, 0, 50, 0,130, 0, 0, 0,149, 0, 0, 0, 0, 0,178, 0,131, 0, 0, 0,
+151, 0, 0, 0, 0, 0, 50, 0,132, 0, 0, 0,148, 0, 0, 0, 0, 0, 50, 0,133, 0, 0, 0,150, 0, 0, 0, 0, 0, 50, 0,
+155, 0, 0, 0,171, 0, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,170, 0, 0, 0, 0, 0, 35, 0,153, 0, 0, 0,169, 0, 0, 0,
+ 0, 0, 35, 0,152, 0, 0, 0,168, 0, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,159, 0, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,
+155, 0, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,158, 0, 0, 0, 0, 0, 35, 0,153, 0, 0, 0,154, 0, 0, 0, 0, 0, 35, 0,
+153, 0, 0, 0,157, 0, 0, 0, 0, 0, 35, 0,152, 0, 0, 0,153, 0, 0, 0, 0, 0, 35, 0,152, 0, 0, 0,156, 0, 0, 0,
+ 0, 0, 35, 0,159, 0, 0, 0,163, 0, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,159, 0, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,
+162, 0, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,158, 0, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,161, 0, 0, 0, 0, 0, 35, 0,
+156, 0, 0, 0,157, 0, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,160, 0, 0, 0, 0, 0, 35, 0,163, 0, 0, 0,167, 0, 0, 0,
+ 0, 0, 35, 0,162, 0, 0, 0,163, 0, 0, 0, 0, 0, 35, 0,162, 0, 0, 0,166, 0, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,
+162, 0, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,165, 0, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,161, 0, 0, 0, 0, 0, 35, 0,
+160, 0, 0, 0,164, 0, 0, 0, 0, 0, 35, 0,166, 0, 0, 0,167, 0, 0, 0, 0, 0, 35, 0,165, 0, 0, 0,166, 0, 0, 0,
+ 0, 0, 35, 0,164, 0, 0, 0,165, 0, 0, 0, 0, 0, 35, 0,169, 0, 0, 0,170, 0, 0, 0, 0, 0, 35, 0,174, 0, 0, 0,
+175, 0, 0, 0, 0, 0, 35, 0,172, 0, 0, 0,176, 0, 0, 0, 0, 0, 35, 0,168, 0, 0, 0,172, 0, 0, 0, 0, 0, 35, 0,
+164, 0, 0, 0,173, 0, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,174, 0, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,175, 0, 0, 0,
+ 0, 0, 35, 0,152, 0, 0, 0,176, 0, 0, 0, 0, 0, 35, 0,177, 0, 0, 0,181, 0, 0, 0, 0, 0, 35, 0,177, 0, 0, 0,
+178, 0, 0, 0, 0, 0,163, 0,178, 0, 0, 0,179, 0, 0, 0, 0, 0, 35, 0,179, 0, 0, 0,180, 0, 0, 0, 0, 0,163, 0,
+171, 0, 0, 0,181, 0, 0, 0, 0, 0, 35, 0,167, 0, 0, 0,180, 0, 0, 0, 0, 0, 35, 0,163, 0, 0, 0,179, 0, 0, 0,
+ 0, 0, 35, 0,159, 0, 0, 0,178, 0, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,177, 0, 0, 0, 0, 0, 35, 0,182, 0, 0, 0,
+184, 0, 0, 0, 0, 0, 35, 0,183, 0, 0, 0,187, 0, 0, 0, 0, 0, 35, 0,185, 0, 0, 0,186, 0, 0, 0, 0, 0, 35, 0,
+180, 0, 0, 0,182, 0, 0, 0, 0, 0, 35, 0,173, 0, 0, 0,183, 0, 0, 0, 0, 0, 35, 0,164, 0, 0, 0,187, 0, 0, 0,
+ 0, 0, 35, 0,165, 0, 0, 0,186, 0, 0, 0, 0, 0, 35, 0,166, 0, 0, 0,185, 0, 0, 0, 0, 0, 35, 0,167, 0, 0, 0,
+184, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 64, 1, 0, 0,144, 36,118, 1, 0, 0, 0, 0, 5, 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, 16, 38,118, 1, 0, 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, 85, 86, 84,101,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, 64, 44,118, 1, 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, 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,192, 58,118, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 5, 0, 0, 16, 38,118, 1, 0, 0, 0, 0, 52, 0, 0, 0, 76, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0,
+ 26, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 19, 0, 0, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0,
+ 25, 0, 0, 0, 24, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 11, 0, 0, 0,
+ 0, 0, 0, 0, 28, 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0,
+ 17, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0,
+ 17, 0, 0, 0, 23, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 32, 0, 0, 0,
+ 33, 0, 0, 0, 0, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0,
+ 65, 0, 0, 0,114, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 0,
+ 0, 0, 0, 0, 46, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0,
+ 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 1, 0, 0, 0, 53, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0,
+ 28, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 60, 0, 0, 0,
+ 59, 0, 0, 0, 0, 0, 0, 0, 53, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0,
+ 59, 0, 0, 0, 63, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 68, 0, 0, 0, 67, 0, 0, 0,
+ 0, 0, 0, 0, 61, 0, 0, 0, 62, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 51, 0, 0, 0,
+ 66, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 76, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0,
+ 20, 0, 0, 0, 19, 0, 0, 0, 84, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 21, 0, 0, 0, 82, 0, 0, 0,
+ 56, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 85, 0, 0, 0, 89, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0,
+ 83, 0, 0, 0, 87, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 75, 0, 0, 0, 74, 0, 0, 0, 93, 0, 0, 0,
+ 0, 0, 0, 0, 87, 0, 0, 0, 88, 0, 0, 0, 92, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 86, 0, 0, 0,
+ 90, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0,
+ 90, 0, 0, 0, 91, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 97, 0, 0, 0, 73, 0, 0, 0, 77, 0, 0, 0,
+ 81, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0,
+ 52, 0, 0, 0, 68, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 50, 0, 0, 0,101, 0, 0, 0,
+ 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 39, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 72, 0, 0, 0,
+ 41, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,
+103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0,
+114, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0,
+ 70, 0, 0, 0, 71, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,112, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0,
+ 0, 0, 0, 0,111, 0, 0, 0,110, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0,
+ 52, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0,111, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0,
+ 81, 0, 0, 0, 77, 0, 0, 0, 69, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0,135, 0, 0, 0,120, 0, 0, 0,
+119, 0, 0, 0, 0, 0, 0, 16,125, 0, 0, 0,124, 0, 0, 0,120, 0, 0, 0,121, 0, 0, 0, 0, 0, 0, 16,123, 0, 0, 0,
+122, 0, 0, 0,118, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 16,128, 0, 0, 0,127, 0, 0, 0,123, 0, 0, 0,124, 0, 0, 0,
+ 0, 0, 0, 16,133, 0, 0, 0,132, 0, 0, 0,128, 0, 0, 0,129, 0, 0, 0, 0, 0, 0, 16,131, 0, 0, 0,130, 0, 0, 0,
+126, 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 16,148, 0, 0, 0,151, 0, 0, 0,131, 0, 0, 0,132, 0, 0, 0, 0, 0, 0, 16,
+147, 0, 0, 0,150, 0, 0, 0,133, 0, 0, 0,138, 0, 0, 0, 0, 0, 0, 16,137, 0, 0, 0,138, 0, 0, 0,140, 0, 0, 0,
+139, 0, 0, 0, 0, 0, 0, 16,140, 0, 0, 0,129, 0, 0, 0,125, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 16,141, 0, 0, 0,
+142, 0, 0, 0,144, 0, 0, 0,143, 0, 0, 0, 0, 0, 0, 16,144, 0, 0, 0,121, 0, 0, 0,117, 0, 0, 0,136, 0, 0, 0,
+ 0, 0, 0, 16,171, 0, 0, 0,181, 0, 0, 0,177, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 2,154, 0, 0, 0,153, 0, 0, 0,
+169, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 2,152, 0, 0, 0,176, 0, 0, 0,172, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 2,
+159, 0, 0, 0,158, 0, 0, 0,154, 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 2,157, 0, 0, 0,156, 0, 0, 0,152, 0, 0, 0,
+153, 0, 0, 0, 0, 0, 0, 2,179, 0, 0, 0,163, 0, 0, 0,159, 0, 0, 0,178, 0, 0, 0, 0, 0, 0, 2,162, 0, 0, 0,
+161, 0, 0, 0,157, 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 2,160, 0, 0, 0,174, 0, 0, 0,175, 0, 0, 0,156, 0, 0, 0,
+ 0, 0, 0, 2,167, 0, 0, 0,166, 0, 0, 0,162, 0, 0, 0,163, 0, 0, 0, 0, 0, 0, 2,165, 0, 0, 0,164, 0, 0, 0,
+160, 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 2,182, 0, 0, 0,184, 0, 0, 0,167, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 2,
+185, 0, 0, 0,186, 0, 0, 0,165, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 2,187, 0, 0, 0,183, 0, 0, 0,173, 0, 0, 0,
+164, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 64, 14, 0, 0, 64, 44,118, 1, 0, 0, 0, 0, 60, 0, 0, 0, 76, 0, 0, 0,
+250,168, 27, 63, 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59,251,168, 27, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 21,172,131, 63, 96,211, 93, 59,146,128, 81, 63, 96,211, 93, 59,
+149,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+227,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,225,151,158, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,149,128, 81, 63, 96,211, 93, 59,251,168, 27, 63, 96,211, 93, 59,
+246,168, 27, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+227,151,158, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,246,168, 27, 63, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59,
+ 85,162,203, 62, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+ 24,172,131, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,174,131,185, 63, 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,
+226,151,158, 63, 96,211, 93, 59,176,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,226,151,158, 63, 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59,
+ 22,172,131, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+247,168, 27, 63, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59, 86,162,203, 62, 96,211, 93, 59,248,168, 27, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,
+144,128, 81, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,
+226,151,158, 63, 96,211, 93, 59,176,131,185, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59,
+ 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63,
+ 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63,
+ 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 72, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63,
+ 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+174,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,174,225, 76, 63,102, 84,117, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,
+188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63,
+ 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,
+172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 56,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63,
+ 56,127,118,190,220, 28, 3, 63, 96,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,102, 84,117, 63,200, 84,104, 61,244, 65, 79, 63,200, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,171,188,160, 63,122, 84,181, 62,113,179,141, 63,
+122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+200, 84,104, 61,242, 65, 79, 63, 96,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,
+160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,
+128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63,
+ 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63,
+188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+180,131,140, 63,116, 19,186, 62,244,140,159, 63, 50, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63, 0, 21,186, 62, 51,207, 38, 63, 24,224, 91, 62,
+112,226, 76, 63, 64, 38,135, 61,240,244,114, 63, 4,221, 91, 62, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+185,188, 0, 63, 96, 44,135, 61, 61, 84,181, 62,176,104,169,189, 93,189, 0, 63, 80, 1,109,190,248,207, 38, 63,144,109,169,189,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,116, 47, 41, 63, 52,207, 38, 63,248, 28, 3, 63,
+174,225, 76, 63, 0, 21,186, 62, 42,244,114, 63,244, 28, 3, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+185,188, 0, 63, 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,185,188, 0, 63, 96, 44,135, 61, 51,207, 38, 63, 24,224, 91, 62,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,236, 65, 79, 63,
+174,225, 76, 63,116, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+188,188, 0, 63,120, 47, 41, 63,122, 84,181, 62,248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 52,207, 38, 63,248, 28, 3, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 14, 95, 82, 62, 0, 21,186, 62,144, 82,104, 61,128,223, 91, 62,
+138, 94, 82, 62, 48, 43,135, 61,122, 84,181, 62, 32,224, 91, 62, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+190,188, 0, 63,102, 84,117, 63,127, 84,181, 62,242, 65, 79, 63,188,188, 0, 63,120, 47, 41, 63, 52,207, 38, 63,236, 65, 79, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,120, 47, 41, 63,160, 84,104, 61, 0, 29, 3, 63,
+ 14, 95, 82, 62, 0, 21,186, 62,122, 84,181, 62,248, 28, 3, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+190,188, 0, 63,102, 84,117, 63, 56,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,
+ 26, 95, 82, 62,120, 47, 41, 63,127, 84,181, 62,242, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63,128,106,188,189,176, 20,186, 62,160, 84,104, 61, 0, 29, 3, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 56,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63,
+172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,
+188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,102, 84,117, 63,
+172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63,
+ 52,207, 38, 63,111,179,141, 63,174,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 99,131,140, 63, 72, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63,
+188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63,
+ 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,
+128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,
+160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+200, 84,104, 61,242, 65, 79, 63, 96,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,190,188, 0, 63,171,188,160, 63,122, 84,181, 62,113,179,141, 63,
+122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 26, 95, 82, 62,102, 84,117, 63,200, 84,104, 61,244, 65, 79, 63,200, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63,
+ 56,127,118,190,220, 28, 3, 63, 96,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65,192, 4, 0, 0,192, 58,118, 1, 0, 0, 0, 0, 57, 0, 0, 0, 48, 1, 0, 0,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,120, 1, 0, 0,
+ 80, 83,118, 1, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0,144,162,118, 1, 0, 0, 0, 0, 32, 2,118, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 49, 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, 96,149,127, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 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,162,118, 1, 0, 0, 0, 0,112,118,118, 1, 0, 0, 0, 0,128,124,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+144, 86,118, 1, 0, 0, 0, 0,144,102,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,160,138,118, 1, 0, 0, 0, 0,
+ 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, 85,118, 1, 0, 0, 0, 0,
+ 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 16,101,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0,
+ 12, 0, 0, 0, 0, 0, 0, 0,240,116,118, 1, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0,
+182, 0, 0, 0, 45, 1, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,213,204, 76, 63,255,204, 76, 63,
+ 0, 0,104,182, 30, 0,128, 63,140, 0,128, 63,214,255,127, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 30, 0, 4, 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, 8, 0, 0, 0, 64,162,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 16, 85,118, 1, 0, 0, 0, 0, 5, 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,144, 86,118, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 14, 0, 0,144, 86,118, 1, 0, 0, 0, 0, 56, 0, 0, 0,182, 0, 0, 0,133,102,230, 63,208, 51,179, 63,
+ 4, 0,128,191,127,165, 0, 0,129, 90, 2,255,133,102,230, 63,206,154, 25, 63, 4, 0,128,191,127,165, 0, 0,129, 90, 2,255,
+ 81, 51,179, 63,210, 51,179, 63, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 28, 0,128, 63,212, 51,179, 63, 1, 0,128,191,
+ 0, 0, 0, 0,255,127, 2,255,207,153, 25, 63,214, 51,179, 63, 0, 0,128,191, 0, 0, 0, 0,255,127, 2,255,152,205, 76, 62,
+216, 51,179, 63,254,255,127,191, 0, 0, 0, 0,255,127, 2,255, 80, 51,179, 63,158, 0,128, 63, 3, 0,128,191, 0, 0, 0, 0,
+255,127, 2,255, 27, 0,128, 63,160, 0,128, 63, 2, 0,128,191, 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,162, 0,128, 63,
+ 0, 0,128,191, 0, 0, 0, 0,255,127, 2,255,140,205, 76, 62,163, 0,128, 63,254,255,127,191, 0, 0, 0, 0,255,127, 2,255,
+ 80, 51,179, 63,209,154, 25, 63, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,213,154, 25, 63, 2, 0,128,191,
+ 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,217,154, 25, 63, 0, 0,128,191, 0, 0, 0, 0,255,127, 2,255,140,205, 76, 62,
+221,154, 25, 63,254,255,127,191, 0, 0, 0, 0,255,127, 2,255, 80, 51,179, 63,160,209, 76, 62, 3, 0,128,191, 0, 0, 0, 0,
+255,127, 2,255, 27, 0,128, 63,176,209, 76, 62, 2, 0,128,191, 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,188,209, 76, 62,
+ 1, 0,128,191, 0, 0, 0, 0,255,127, 2,255,140,205, 76, 62,204,209, 76, 62,255,255,127,191, 0, 0, 0, 0,255,127, 2,255,
+140,205, 76, 62, 8,103,230, 63,156,153, 25,191, 0, 0, 1,128, 0, 0, 2,255,204,153, 25, 63, 10,103,230, 63,160,153, 25,191,
+ 0, 0, 1,128, 0, 0, 2,255, 27, 0,128, 63, 10,103,230, 63,164,153, 25,191, 0, 0, 1,128, 0, 0, 2,255, 80, 51,179, 63,
+ 12,103,230, 63,168,153, 25,191, 0, 0, 1,128, 0, 0, 2,255,140,205, 76, 62, 8,103,230, 63,196,204, 76,190, 0, 0, 1,128,
+ 0, 0, 2,255,204,153, 25, 63, 10,103,230, 63,212,204, 76,190, 0, 0, 1,128, 0, 0, 2,255, 27, 0,128, 63, 10,103,230, 63,
+228,204, 76,190, 0, 0, 1,128, 0, 0, 2,255, 80, 51,179, 63, 12,103,230, 63,244,204, 76,190, 0, 0, 1,128, 0, 0, 2,255,
+140,205, 76, 62, 8,103,230, 63,216,204, 76, 62, 0, 0, 1,128, 0, 0, 2,255,204,153, 25, 63, 10,103,230, 63,200,204, 76, 62,
+ 0, 0, 1,128, 0, 0, 2,255, 27, 0,128, 63, 10,103,230, 63,184,204, 76, 62, 0, 0, 1,128, 0, 0, 2,255, 80, 51,179, 63,
+ 12,103,230, 63,168,204, 76, 62, 0, 0, 1,128, 0, 0, 2,255,152,205, 76, 62, 8,103,230, 63,158,153, 25, 63, 0, 0, 1,128,
+ 0, 0, 2,255,207,153, 25, 63, 10,103,230, 63,154,153, 25, 63, 0, 0, 1,128, 0, 0, 2,255, 28, 0,128, 63, 10,103,230, 63,
+150,153, 25, 63, 0, 0, 1,128, 0, 0, 2,255, 81, 51,179, 63, 12,103,230, 63,150,153, 25, 63, 0, 0, 1,128, 0, 0, 2,255,
+140,205, 76, 62, 8,103,230, 63, 3, 0,128,191, 0, 0,127,165,129, 90, 0,255,204,153, 25, 63, 10,103,230, 63, 4, 0,128,191,
+ 0, 0,127,165,129, 90, 0,255, 27, 0,128, 63, 10,103,230, 63, 6, 0,128,191, 0, 0,127,165,129, 90, 0,255, 80, 51,179, 63,
+ 12,103,230, 63, 7, 0,128,191, 0, 0,127,165,129, 90, 0,255,144,205, 76,190, 12,103,230, 63,150,153, 25, 63, 0, 0, 1,128,
+ 0, 0, 2,255,152,205, 76,190, 12,103,230, 63,168,204, 76, 62, 0, 0, 1,128, 0, 0, 2,255,152,205, 76,190, 12,103,230, 63,
+244,204, 76,190, 0, 0, 1,128, 0, 0, 2,255,152,205, 76,190, 12,103,230, 63,168,153, 25,191, 0, 0, 1,128, 0, 0, 2,255,
+152,205, 76,190,160,209, 76, 62, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,152,205, 76,190,209,154, 25, 63, 3, 0,128,191,
+ 0, 0, 0, 0,255,127, 2,255,152,205, 76,190,158, 0,128, 63, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,144,205, 76,190,
+210, 51,179, 63, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,131,102,230, 63, 7,103,230, 63,155,153, 25,191,127,165,127,165,
+ 0, 0, 2,255,131,102,230, 63,212, 51,179, 63,159,153, 25,191, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,160, 0,128, 63,
+163,153, 25,191, 1,128, 0, 0, 0, 0, 2,255,135,102,230, 63,207,154, 25, 63,167,153, 25,191, 1,128, 0, 0, 0, 0, 2,255,
+131,102,230, 63, 7,103,230, 63,193,204, 76,190,127,165,127,165, 0, 0, 2,255,131,102,230, 63,212, 51,179, 63,209,204, 76,190,
+ 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,160, 0,128, 63,225,204, 76,190, 1,128, 0, 0, 0, 0, 2,255,135,102,230, 63,
+207,154, 25, 63,241,204, 76,190, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63, 7,103,230, 63,219,204, 76, 62,127,165,127,165,
+ 0, 0, 2,255,131,102,230, 63,212, 51,179, 63,203,204, 76, 62, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,160, 0,128, 63,
+187,204, 76, 62, 1,128, 0, 0, 0, 0, 2,255,135,102,230, 63,207,154, 25, 63,171,204, 76, 62, 1,128, 0, 0, 0, 0, 2,255,
+131,102,230, 63, 7,103,230, 63,159,153, 25, 63,127,165,127,165, 0, 0, 2,255,131,102,230, 63,212, 51,179, 63,155,153, 25, 63,
+ 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,156, 0,128, 63,151,153, 25, 63, 1,128, 0, 0, 0, 0, 2,255,135,102,230, 63,
+207,154, 25, 63,151,153, 25, 63, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63, 7,103,230, 63, 3, 0,128,191, 1,128, 0, 0,
+ 0, 0, 2,255,131,102,230, 63,160, 0,128, 63, 6, 0,128,191,127,165, 0, 0,129, 90, 2,255,127,102,230, 63, 28,208, 76, 62,
+ 3, 0,128,191,127,165, 0, 0,129, 90, 2,255,131,102,230, 63,136,201, 76,190,155,153, 25, 63, 1,128, 0, 0, 0, 0, 2,255,
+127,102,230, 63, 28,208, 76, 62,159,153, 25, 63, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,136,201, 76,190,203,204, 76, 62,
+ 1,128, 0, 0, 0, 0, 2,255,127,102,230, 63, 28,208, 76, 62,219,204, 76, 62, 1,128, 0, 0, 0, 0, 2,255,131,102,230, 63,
+136,201, 76,190,209,204, 76,190, 1,128, 0, 0, 0, 0, 2,255,127,102,230, 63, 28,208, 76, 62,193,204, 76,190, 1,128, 0, 0,
+ 0, 0, 2,255,131,102,230, 63,136,201, 76,190,159,153, 25,191, 1,128, 0, 0, 0, 0, 2,255,127,102,230, 63, 28,208, 76, 62,
+155,153, 25,191, 1,128, 0, 0, 0, 0, 2,255,150,205, 76, 62, 24,208, 76,190,254,255,127,191, 0, 0, 0, 0,255,127, 2,255,
+207,153, 25, 63, 40,208, 76,190, 0, 0,128,191, 0, 0, 0, 0,255,127, 2,255, 28, 0,128, 63, 56,208, 76,190, 1, 0,128,191,
+ 0, 0, 0, 0,255,127, 2,255, 81, 51,179, 63, 72,208, 76,190, 3, 0,128,191, 0, 0, 0, 0,255,127, 2,255,133,102,230, 63,
+ 88,208, 76,190, 4, 0,128,191, 1,128, 0, 0, 0, 0, 2,255,133,102,230, 63, 88,208, 76,190,146,255,127, 63, 1,128, 0, 0,
+ 0, 0, 2,255, 81, 51,179, 63, 72,208, 76,190,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 28, 0,128, 63, 56,208, 76,190,
+152,255,127, 63, 0, 0, 0, 0,255,127, 2,255,207,153, 25, 63, 40,208, 76,190,154,255,127, 63, 0, 0, 0, 0,255,127, 2,255,
+150,205, 76, 62, 24,208, 76,190,156,255,127, 63, 0, 0, 0, 0,255,127, 2,255,127,102,230, 63, 28,208, 76, 62,148,255,127, 63,
+127,165, 0, 0,129, 90, 2,255,131,102,230, 63,160, 0,128, 63,142,255,127, 63,127,165, 0, 0,129, 90, 2,255,131,102,230, 63,
+ 7,103,230, 63,148,255,127, 63, 1,128, 0, 0, 0, 0, 2,255,144,205, 76,190,210, 51,179, 63,148,255,127, 63, 0, 0, 0, 0,
+255,127, 2,255,152,205, 76,190,158, 0,128, 63,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,152,205, 76,190,209,154, 25, 63,
+148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,152,205, 76,190,160,209, 76, 62,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,
+ 80, 51,179, 63, 12,103,230, 63,140,255,127, 63, 0, 0,127,165,129, 90, 2,255, 27, 0,128, 63, 10,103,230, 63,142,255,127, 63,
+ 0, 0,127,165,129, 90, 2,255,204,153, 25, 63, 10,103,230, 63,146,255,127, 63, 0, 0,127,165,129, 90, 2,255,140,205, 76, 62,
+ 8,103,230, 63,148,255,127, 63, 0, 0,127,165,129, 90, 2,255,140,205, 76, 62,204,209, 76, 62,154,255,127, 63, 0, 0, 0, 0,
+255,127, 2,255,204,153, 25, 63,188,209, 76, 62,152,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,176,209, 76, 62,
+150,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 80, 51,179, 63,160,209, 76, 62,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,
+140,205, 76, 62,221,154, 25, 63,156,255,127, 63, 0, 0, 0, 0,255,127, 2,255,204,153, 25, 63,217,154, 25, 63,154,255,127, 63,
+ 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,213,154, 25, 63,150,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 80, 51,179, 63,
+209,154, 25, 63,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,140,205, 76, 62,163, 0,128, 63,156,255,127, 63, 0, 0, 0, 0,
+255,127, 2,255,204,153, 25, 63,162, 0,128, 63,154,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 27, 0,128, 63,160, 0,128, 63,
+150,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 80, 51,179, 63,158, 0,128, 63,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,
+152,205, 76, 62,216, 51,179, 63,156,255,127, 63, 0, 0, 0, 0,255,127, 2,255,207,153, 25, 63,214, 51,179, 63,154,255,127, 63,
+ 0, 0, 0, 0,255,127, 2,255, 28, 0,128, 63,212, 51,179, 63,152,255,127, 63, 0, 0, 0, 0,255,127, 2,255, 81, 51,179, 63,
+210, 51,179, 63,148,255,127, 63, 0, 0, 0, 0,255,127, 2,255,133,102,230, 63,206,154, 25, 63,146,255,127, 63,127,165, 0, 0,
+129, 90, 2,255,133,102,230, 63,208, 51,179, 63,146,255,127, 63,127,165, 0, 0,129, 90, 2,255,144,205, 76,190,140,201, 76, 62,
+148,255,127, 63,255,127, 0, 0, 0, 0, 1,255,136,205, 76,190, 52,255,127, 63,148,255,127, 63,255,127, 0, 0, 0, 0, 1,255,
+128,205, 76,190, 48,208, 76,190,150,255,127, 63,255,127, 0, 0, 0, 0, 3,255,120,205, 76,190,194,152, 25, 63,144,255,127, 63,
+255,127, 0, 0, 0, 0, 1,255, 80,205, 76,190,254, 50,179, 63,150,255,127, 63,255,127, 0, 0, 0, 0, 1,255,128,205, 76,190,
+ 12,103,230, 63,148,255,127, 63,255,127, 0, 0, 0, 0, 3,255,128,205, 76,190, 12,103,230, 63, 5, 0,128,191,255,127, 0, 0,
+ 0, 0, 3,255, 80,205, 76,190,254, 50,179, 63,156,153, 25,191,255,127, 0, 0, 0, 0, 3,255,112,205, 76,190, 50,102,230, 63,
+160,153, 25,191,255,127, 0, 0, 0, 0, 3,255, 80,205, 76,190,254, 50,179, 63,195,204, 76,190,255,127, 0, 0, 0, 0, 3,255,
+112,205, 76,190, 50,102,230, 63,211,204, 76,190,255,127, 0, 0, 0, 0, 3,255, 80,205, 76,190,254, 50,179, 63,221,204, 76, 62,
+255,127, 0, 0, 0, 0, 3,255,112,205, 76,190, 50,102,230, 63,205,204, 76, 62,255,127, 0, 0, 0, 0, 3,255, 80,205, 76,190,
+254, 50,179, 63,160,153, 25, 63,255,127, 0, 0, 0, 0, 3,255,112,205, 76,190, 50,102,230, 63,156,153, 25, 63,255,127, 0, 0,
+ 0, 0, 3,255, 80,205, 76,190,254, 50,179, 63, 4, 0,128,191,255,127, 0, 0, 0, 0, 1,255,120,205, 76,190,194,152, 25, 63,
+ 7, 0,128,191,255,127, 0, 0, 0, 0, 1,255,128,205, 76,190, 48,208, 76,190, 4, 0,128,191,255,127, 0, 0, 0, 0, 3,255,
+152,205, 76,190, 52,255,127, 63,152,153, 25, 63,255,127, 0, 0, 0, 0, 3,255,120,205, 76,190,202,152, 25, 63,152,153, 25, 63,
+255,127, 0, 0, 0, 0, 3,255,128,205, 76,190,108,201, 76, 62,156,153, 25, 63,255,127, 0, 0, 0, 0, 3,255,128,205, 76,190,
+ 48,208, 76,190,160,153, 25, 63,255,127, 0, 0, 0, 0, 1,255,152,205, 76,190, 52,255,127, 63,173,204, 76, 62,255,127, 0, 0,
+ 0, 0, 3,255,120,205, 76,190,194,152, 25, 63,189,204, 76, 62,255,127, 0, 0, 0, 0, 3,255,128,205, 76,190,108,201, 76, 62,
+205,204, 76, 62,255,127, 0, 0, 0, 0, 3,255,128,205, 76,190, 48,208, 76,190,221,204, 76, 62,255,127, 0, 0, 0, 0, 1,255,
+152,205, 76,190, 52,255,127, 63,243,204, 76,190,255,127, 0, 0, 0, 0, 3,255,120,205, 76,190,194,152, 25, 63,227,204, 76,190,
+255,127, 0, 0, 0, 0, 3,255,128,205, 76,190,108,201, 76, 62,211,204, 76,190,255,127, 0, 0, 0, 0, 3,255,128,205, 76,190,
+ 48,208, 76,190,195,204, 76,190,255,127, 0, 0, 0, 0, 1,255,152,205, 76,190, 52,255,127, 63,168,153, 25,191,255,127, 0, 0,
+ 0, 0, 3,255,120,205, 76,190,194,152, 25, 63,164,153, 25,191,255,127, 0, 0, 0, 0, 3,255,128,205, 76,190,108,201, 76, 62,
+160,153, 25,191,255,127, 0, 0, 0, 0, 3,255,128,205, 76,190, 48,208, 76,190,156,153, 25,191,255,127, 0, 0, 0, 0, 1,255,
+136,205, 76,190, 52,255,127, 63, 5, 0,128,191,255,127, 0, 0, 0, 0, 1,255,144,205, 76,190,140,201, 76, 62, 5, 0,128,191,
+255,127, 0, 0, 0, 0, 1,255, 36, 51,179, 63, 56,208, 76,190,150,255,127, 63, 0, 0,255,127, 0, 0, 3,255,222,255,127, 63,
+ 80,208, 76,190,148,255,127, 63, 0, 0,255,127, 0, 0, 3,255,116,153, 25, 63, 80,208, 76,190,144,255,127, 63, 0, 0,255,127,
+ 0, 0, 3,255, 44,204, 76, 62,104,208, 76,190,142,255,127, 63, 0, 0,255,127, 0, 0, 3,255,112,205, 76,190, 64,208, 76,190,
+150,255,127, 63, 94,231, 94,231, 41,123, 1,255,112,205, 76,190, 64,208, 76,190, 4, 0,128,191, 94,231, 94,231,215,132, 1,255,
+112,205, 76,190, 64,208, 76,190,160,153, 25, 63, 0, 0,255,127, 0, 0, 1,255,112,205, 76,190, 64,208, 76,190,221,204, 76, 62,
+ 0, 0,255,127, 0, 0, 1,255,112,205, 76,190, 64,208, 76,190,195,204, 76,190, 0, 0,255,127, 0, 0, 1,255,112,205, 76,190,
+ 64,208, 76,190,156,153, 25,191, 0, 0,255,127, 0, 0, 1,255,136,102,230, 63, 88,208, 76,190,169,153, 25,191, 0, 0,255,127,
+ 0, 0, 3,255,136,102,230, 63, 88,208, 76,190,246,204, 76,190, 0, 0,255,127, 0, 0, 3,255,136,102,230, 63, 88,208, 76,190,
+170,204, 76, 62, 0, 0,255,127, 0, 0, 3,255,135,102,230, 63, 88,208, 76,190,151,153, 25, 63, 0, 0,255,127, 0, 0, 3,255,
+ 44,204, 76, 62,104,208, 76,190, 8, 0,128,191, 0, 0,255,127, 0, 0, 3,255,116,153, 25, 63, 80,208, 76,190, 7, 0,128,191,
+ 0, 0,255,127, 0, 0, 3,255,222,255,127, 63, 80,208, 76,190, 5, 0,128,191, 0, 0,255,127, 0, 0, 3,255, 36, 51,179, 63,
+ 56,208, 76,190, 4, 0,128,191, 0, 0,255,127, 0, 0, 3,255, 36,204, 76, 62,104,208, 76,190,151,153, 25, 63, 0, 0,255,127,
+ 0, 0, 3,255,114,153, 25, 63, 80,208, 76,190,151,153, 25, 63, 0, 0,255,127, 0, 0, 3,255,220,255,127, 63, 80,208, 76,190,
+155,153, 25, 63, 0, 0,255,127, 0, 0, 3,255, 34, 51,179, 63, 56,208, 76,190,159,153, 25, 63, 0, 0,255,127, 0, 0, 3,255,
+ 44,204, 76, 62,104,208, 76,190,170,204, 76, 62, 0, 0,255,127, 0, 0, 3,255,116,153, 25, 63, 80,208, 76,190,186,204, 76, 62,
+ 0, 0,255,127, 0, 0, 3,255,222,255,127, 63, 80,208, 76,190,202,204, 76, 62, 0, 0,255,127, 0, 0, 3,255, 36, 51,179, 63,
+ 56,208, 76,190,218,204, 76, 62, 0, 0,255,127, 0, 0, 3,255, 44,204, 76, 62,104,208, 76,190,246,204, 76,190, 0, 0,255,127,
+ 0, 0, 3,255,116,153, 25, 63, 80,208, 76,190,230,204, 76,190, 0, 0,255,127, 0, 0, 3,255,222,255,127, 63, 80,208, 76,190,
+214,204, 76,190, 0, 0,255,127, 0, 0, 3,255, 36, 51,179, 63, 56,208, 76,190,198,204, 76,190, 0, 0,255,127, 0, 0, 3,255,
+ 44,204, 76, 62,104,208, 76,190,169,153, 25,191, 0, 0,255,127, 0, 0, 3,255,116,153, 25, 63, 80,208, 76,190,165,153, 25,191,
+ 0, 0,255,127, 0, 0, 3,255,222,255,127, 63, 80,208, 76,190,161,153, 25,191, 0, 0,255,127, 0, 0, 3,255, 36, 51,179, 63,
+ 56,208, 76,190,157,153, 25,191, 0, 0,255,127, 0, 0, 3,255, 68, 65, 84, 65, 64, 1, 0, 0, 16,101,118, 1, 0, 0, 0, 0,
+ 5, 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,
+144,102,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 28, 14, 0, 0,144,102,118, 1, 0, 0, 0, 0, 53, 0, 0, 0, 45, 1, 0, 0,
+ 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 34, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 9, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0,
+ 3, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 34, 0, 9, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 8, 0, 0, 0,
+ 12, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 12, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0,
+ 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 34, 0, 13, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 12, 0, 0, 0,
+ 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0,
+ 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 14, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 37, 0, 0, 0,
+ 0, 0, 34, 0, 20, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0,
+ 34, 0, 0, 0, 0, 0, 34, 0, 21, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0,
+ 20, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 23, 0, 0, 0,
+ 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0,
+ 29, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 34, 0, 24, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0,
+ 23, 0, 0, 0, 24, 0, 0, 0, 0, 0, 34, 0, 23, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 23, 0, 0, 0,
+ 0, 0, 34, 0, 22, 0, 0, 0, 26, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0,
+ 29, 0, 0, 0, 0, 0, 34, 0, 28, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, 34, 0,
+ 27, 0, 0, 0, 31, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 27, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 30, 0, 0, 0,
+ 0, 0, 34, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0, 32, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0,
+ 31, 0, 0, 0, 0, 0, 34, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 34, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 37, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 36, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 35, 0, 0, 0,
+ 0, 0, 34, 0, 5, 0, 0, 0, 34, 0, 0, 0, 0, 0, 34, 0, 38, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 40, 0, 0, 0,
+ 41, 0, 0, 0, 0, 0, 34, 0, 42, 0, 0, 0, 43, 0, 0, 0, 0, 0, 34, 0, 44, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0,
+ 30, 0, 0, 0, 38, 0, 0, 0, 0, 0, 34, 0, 26, 0, 0, 0, 39, 0, 0, 0, 0, 0, 34, 0, 22, 0, 0, 0, 40, 0, 0, 0,
+ 0, 0, 34, 0, 18, 0, 0, 0, 41, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 42, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0,
+ 43, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 44, 0, 0, 0, 0, 0, 34, 0, 5, 0, 0, 0, 45, 0, 0, 0, 0, 0, 34, 0,
+ 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 68, 0, 0, 0,
+ 0, 0, 34, 0, 61, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0,
+ 62, 0, 0, 0, 0, 0, 34, 0, 49, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 48, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0,
+ 48, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 34, 0, 47, 0, 0, 0, 51, 0, 0, 0,
+ 0, 0, 34, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 34, 0, 46, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0, 53, 0, 0, 0,
+ 57, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 34, 0, 52, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0,
+ 51, 0, 0, 0, 52, 0, 0, 0, 0, 0, 34, 0, 51, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 50, 0, 0, 0, 51, 0, 0, 0,
+ 0, 0, 34, 0, 50, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 57, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0,
+ 57, 0, 0, 0, 0, 0, 34, 0, 56, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 34, 0,
+ 55, 0, 0, 0, 59, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 55, 0, 0, 0, 0, 0, 34, 0, 54, 0, 0, 0, 58, 0, 0, 0,
+ 0, 0, 34, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0, 60, 0, 0, 0, 0, 0, 34, 0, 58, 0, 0, 0,
+ 59, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 66, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0,
+ 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 34, 0, 68, 0, 0, 0, 70, 0, 0, 0, 0, 0, 34, 0, 69, 0, 0, 0, 70, 0, 0, 0,
+ 0, 0, 34, 0, 67, 0, 0, 0, 69, 0, 0, 0, 0, 0, 34, 0, 70, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0,
+ 72, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 72, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0,
+ 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 47, 0, 0, 0,
+ 0, 0, 34, 0, 1, 0, 0, 0, 49, 0, 0, 0, 0, 0, 34, 0, 1, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0,
+ 58, 0, 0, 0, 0, 0, 34, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 34, 0, 25, 0, 0, 0, 50, 0, 0, 0, 0, 0, 34, 0,
+ 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 34, 0, 75, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 34, 0, 71, 0, 0, 0,
+ 77, 0, 0, 0, 0, 0, 34, 0, 64, 0, 0, 0, 77, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 76, 0, 0, 0, 0, 0, 34, 0,
+ 15, 0, 0, 0, 75, 0, 0, 0, 0, 0, 34, 0, 16, 0, 0, 0, 74, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 73, 0, 0, 0,
+ 0, 0, 34, 0, 82, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 81, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 80, 0, 0, 0,
+ 96, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 78, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0,
+ 81, 0, 0, 0, 82, 0, 0, 0, 0, 0, 34, 0, 79, 0, 0, 0, 80, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,105, 0, 0, 0,
+ 0, 0, 34, 0, 83, 0, 0, 0, 97, 0, 0, 0, 0, 0, 34, 0, 83, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 85, 0, 0, 0,
+111, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 84, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,
+ 86, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0, 98, 0, 0, 0,
+ 0, 0, 34, 0, 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 34, 0, 86, 0, 0, 0, 87, 0, 0, 0, 0, 0, 34, 0, 88, 0, 0, 0,
+ 89, 0, 0, 0, 0, 0, 34, 0, 93, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0, 92, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,
+ 91, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0, 90, 0, 0, 0, 91, 0, 0, 0,
+ 0, 0, 34, 0, 92, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 97, 0, 0, 0,101, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0,
+ 97, 0, 0, 0, 0, 0, 34, 0, 96, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 34, 0,
+ 95, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 95, 0, 0, 0, 0, 0, 34, 0, 94, 0, 0, 0, 98, 0, 0, 0,
+ 0, 0, 34, 0,101, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0,101, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,
+101, 0, 0, 0, 0, 0, 34, 0,100, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0, 99, 0, 0, 0,100, 0, 0, 0, 0, 0, 34, 0,
+ 99, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 34, 0, 98, 0, 0, 0,102, 0, 0, 0,
+ 0, 0, 34, 0,105, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 34, 0,104, 0, 0, 0,
+108, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 34, 0,103, 0, 0, 0,107, 0, 0, 0, 0, 0, 34, 0,
+102, 0, 0, 0,103, 0, 0, 0, 0, 0, 34, 0,102, 0, 0, 0,106, 0, 0, 0, 0, 0, 34, 0,109, 0, 0, 0,111, 0, 0, 0,
+ 0, 0, 34, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 34, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 34, 0,106, 0, 0, 0,
+107, 0, 0, 0, 0, 0, 34, 0, 65, 0, 0, 0, 78, 0, 0, 0, 0, 0, 34, 0, 66, 0, 0, 0, 83, 0, 0, 0, 0, 0, 34, 0,
+ 58, 0, 0, 0, 85, 0, 0, 0, 0, 0, 34, 0, 59, 0, 0, 0,111, 0, 0, 0, 0, 0, 34, 0, 60, 0, 0, 0, 84, 0, 0, 0,
+ 0, 0, 34, 0, 61, 0, 0, 0,110, 0, 0, 0, 0, 0, 34, 0, 30, 0, 0, 0, 93, 0, 0, 0, 0, 0, 34, 0, 31, 0, 0, 0,
+ 92, 0, 0, 0, 0, 0, 34, 0, 32, 0, 0, 0, 91, 0, 0, 0, 0, 0, 34, 0, 33, 0, 0, 0, 90, 0, 0, 0, 0, 0, 34, 0,
+113, 0, 0, 0,130, 0, 0, 0, 0, 0, 35, 0,115, 0, 0, 0,131, 0, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,132, 0, 0, 0,
+ 0, 0, 35, 0,114, 0, 0, 0,133, 0, 0, 0, 0, 0, 35, 0,116, 0, 0, 0,125, 0, 0, 0, 0, 0, 35, 0,117, 0, 0, 0,
+126, 0, 0, 0, 0, 0, 35, 0,113, 0, 0, 0,115, 0, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,115, 0, 0, 0, 0, 0,163, 0,
+112, 0, 0, 0,114, 0, 0, 0, 0, 0, 35, 0,113, 0, 0, 0,116, 0, 0, 0, 0, 0,163, 0,116, 0, 0, 0,117, 0, 0, 0,
+ 0, 0, 35, 0,118, 0, 0, 0,127, 0, 0, 0, 0, 0, 35, 0,118, 0, 0, 0,120, 0, 0, 0, 0, 0, 35, 0,127, 0, 0, 0,
+146, 0, 0, 0, 0, 0,163, 0,142, 0, 0, 0,146, 0, 0, 0, 0, 0, 35, 0,144, 0, 0, 0,147, 0, 0, 0, 0, 0, 35, 0,
+129, 0, 0, 0,147, 0, 0, 0, 0, 0, 35, 0,128, 0, 0, 0,147, 0, 0, 0, 0, 0,163, 0,128, 0, 0, 0,146, 0, 0, 0,
+ 0, 0, 35, 0,119, 0, 0, 0,127, 0, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,120, 0, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,
+121, 0, 0, 0, 0, 0, 35, 0,122, 0, 0, 0,124, 0, 0, 0, 0, 0, 35, 0,121, 0, 0, 0,122, 0, 0, 0, 0, 0, 35, 0,
+121, 0, 0, 0,123, 0, 0, 0, 0, 0, 35, 0,123, 0, 0, 0,124, 0, 0, 0, 0, 0, 35, 0,123, 0, 0, 0,125, 0, 0, 0,
+ 0, 0, 35, 0,125, 0, 0, 0,126, 0, 0, 0, 0, 0, 35, 0,132, 0, 0, 0,133, 0, 0, 0, 0, 0, 35, 0,131, 0, 0, 0,
+132, 0, 0, 0, 0, 0, 35, 0,130, 0, 0, 0,131, 0, 0, 0, 0, 0, 35, 0,133, 0, 0, 0,137, 0, 0, 0, 0, 0,163, 0,
+136, 0, 0, 0,137, 0, 0, 0, 0, 0, 35, 0,132, 0, 0, 0,136, 0, 0, 0, 0, 0, 35, 0,135, 0, 0, 0,136, 0, 0, 0,
+ 0, 0, 35, 0,131, 0, 0, 0,135, 0, 0, 0, 0, 0, 35, 0,134, 0, 0, 0,135, 0, 0, 0, 0, 0, 35, 0,130, 0, 0, 0,
+134, 0, 0, 0, 0, 0, 35, 0,137, 0, 0, 0,141, 0, 0, 0, 0, 0, 35, 0,140, 0, 0, 0,141, 0, 0, 0, 0, 0, 35, 0,
+136, 0, 0, 0,140, 0, 0, 0, 0, 0, 35, 0,139, 0, 0, 0,140, 0, 0, 0, 0, 0, 35, 0,135, 0, 0, 0,139, 0, 0, 0,
+ 0, 0, 35, 0,138, 0, 0, 0,139, 0, 0, 0, 0, 0, 35, 0,134, 0, 0, 0,138, 0, 0, 0, 0, 0, 35, 0,141, 0, 0, 0,
+145, 0, 0, 0, 0, 0,163, 0,144, 0, 0, 0,145, 0, 0, 0, 0, 0, 35, 0,140, 0, 0, 0,144, 0, 0, 0, 0, 0, 35, 0,
+143, 0, 0, 0,144, 0, 0, 0, 0, 0, 35, 0,139, 0, 0, 0,143, 0, 0, 0, 0, 0, 35, 0,142, 0, 0, 0,143, 0, 0, 0,
+ 0, 0, 35, 0,138, 0, 0, 0,142, 0, 0, 0, 0, 0, 35, 0,129, 0, 0, 0,145, 0, 0, 0, 0, 0, 35, 0,128, 0, 0, 0,
+143, 0, 0, 0, 0, 0, 35, 0,125, 0, 0, 0,130, 0, 0, 0, 0, 0, 35, 0,123, 0, 0, 0,134, 0, 0, 0, 0, 0, 35, 0,
+121, 0, 0, 0,138, 0, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,142, 0, 0, 0, 0, 0, 35, 0,151, 0, 0, 0,166, 0, 0, 0,
+ 0, 0, 35, 0,150, 0, 0, 0,167, 0, 0, 0, 0, 0, 35, 0,149, 0, 0, 0,168, 0, 0, 0, 0, 0, 35, 0,148, 0, 0, 0,
+169, 0, 0, 0, 0, 0, 35, 0,152, 0, 0, 0,154, 0, 0, 0, 0, 0,163, 0,148, 0, 0, 0,149, 0, 0, 0, 0, 0, 35, 0,
+150, 0, 0, 0,151, 0, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,178, 0, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,174, 0, 0, 0,
+ 0, 0, 35, 0,155, 0, 0, 0,170, 0, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,166, 0, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,
+155, 0, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,156, 0, 0, 0, 0, 0,163, 0,156, 0, 0, 0,157, 0, 0, 0, 0, 0, 35, 0,
+153, 0, 0, 0,157, 0, 0, 0, 0, 0,163, 0,158, 0, 0, 0,181, 0, 0, 0, 0, 0, 35, 0,159, 0, 0, 0,177, 0, 0, 0,
+ 0, 0, 35, 0,160, 0, 0, 0,173, 0, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,169, 0, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,
+159, 0, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,161, 0, 0, 0, 0, 0, 35, 0,162, 0, 0, 0,163, 0, 0, 0, 0, 0, 35, 0,
+164, 0, 0, 0,165, 0, 0, 0, 0, 0, 35, 0,168, 0, 0, 0,169, 0, 0, 0, 0, 0, 35, 0,167, 0, 0, 0,168, 0, 0, 0,
+ 0, 0, 35, 0,166, 0, 0, 0,167, 0, 0, 0, 0, 0, 35, 0,169, 0, 0, 0,173, 0, 0, 0, 0, 0, 35, 0,172, 0, 0, 0,
+173, 0, 0, 0, 0, 0, 35, 0,168, 0, 0, 0,172, 0, 0, 0, 0, 0, 35, 0,171, 0, 0, 0,172, 0, 0, 0, 0, 0, 35, 0,
+167, 0, 0, 0,171, 0, 0, 0, 0, 0, 35, 0,170, 0, 0, 0,171, 0, 0, 0, 0, 0, 35, 0,166, 0, 0, 0,170, 0, 0, 0,
+ 0, 0, 35, 0,173, 0, 0, 0,177, 0, 0, 0, 0, 0, 35, 0,176, 0, 0, 0,177, 0, 0, 0, 0, 0, 35, 0,172, 0, 0, 0,
+176, 0, 0, 0, 0, 0, 35, 0,175, 0, 0, 0,176, 0, 0, 0, 0, 0, 35, 0,171, 0, 0, 0,175, 0, 0, 0, 0, 0, 35, 0,
+174, 0, 0, 0,175, 0, 0, 0, 0, 0, 35, 0,170, 0, 0, 0,174, 0, 0, 0, 0, 0, 35, 0,177, 0, 0, 0,181, 0, 0, 0,
+ 0, 0, 35, 0,180, 0, 0, 0,181, 0, 0, 0, 0, 0, 35, 0,176, 0, 0, 0,180, 0, 0, 0, 0, 0, 35, 0,179, 0, 0, 0,
+180, 0, 0, 0, 0, 0, 35, 0,175, 0, 0, 0,179, 0, 0, 0, 0, 0, 35, 0,178, 0, 0, 0,179, 0, 0, 0, 0, 0, 35, 0,
+174, 0, 0, 0,178, 0, 0, 0, 0, 0, 35, 0,165, 0, 0, 0,181, 0, 0, 0, 0, 0, 35, 0,164, 0, 0, 0,180, 0, 0, 0,
+ 0, 0, 35, 0,163, 0, 0, 0,179, 0, 0, 0, 0, 0, 35, 0,162, 0, 0, 0,178, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65,
+ 64, 1, 0, 0,240,116,118, 1, 0, 0, 0, 0, 5, 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,112,118,118, 1, 0, 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, 85, 86, 84,101,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,128,124,118, 1, 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, 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,160,138,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,200, 5, 0, 0,112,118,118, 1,
+ 0, 0, 0, 0, 52, 0, 0, 0, 74, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 37, 0, 0, 0, 36, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0,
+ 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 2, 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0,
+ 42, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0,
+ 74, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 76, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0,
+ 20, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0,
+ 0, 0, 0, 0, 50, 0, 0, 0, 25, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 23, 0, 0, 0,
+ 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0,
+ 29, 0, 0, 0, 28, 0, 0, 0, 24, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 26, 0, 0, 0, 22, 0, 0, 0,
+ 23, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 33, 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0,
+ 31, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 26, 0, 0, 0,
+ 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 32, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,
+ 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 62, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 51, 0, 0, 0, 47, 0, 0, 0,
+ 48, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 56, 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0,
+ 54, 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0,
+ 0, 0, 0, 0,110, 0, 0, 0, 84, 0, 0, 0, 60, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 85, 0, 0, 0,
+ 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0,
+ 66, 0, 0, 0, 61, 0, 0, 0, 57, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0,
+ 69, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 53, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0,
+ 72, 0, 0, 0, 64, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0,
+ 0, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 82, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,101, 0, 0, 0,
+ 97, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 99, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0,
+ 98, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,
+101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,102, 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,
+109, 0, 0, 0,105, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0,
+ 0, 0, 0, 0,106, 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,
+108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0,
+120, 0, 0, 0,119, 0, 0, 0,127, 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 2,121, 0, 0, 0,138, 0, 0, 0,142, 0, 0, 0,
+119, 0, 0, 0, 0, 0, 0, 2,124, 0, 0, 0,123, 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0, 0, 0, 0, 2,125, 0, 0, 0,
+130, 0, 0, 0,134, 0, 0, 0,123, 0, 0, 0, 0, 0, 0, 2,117, 0, 0, 0,116, 0, 0, 0,125, 0, 0, 0,126, 0, 0, 0,
+ 0, 0, 0, 2,112, 0, 0, 0,114, 0, 0, 0,133, 0, 0, 0,132, 0, 0, 0, 0, 0, 0, 2,113, 0, 0, 0,115, 0, 0, 0,
+131, 0, 0, 0,130, 0, 0, 0, 0, 0, 0, 2,131, 0, 0, 0,132, 0, 0, 0,136, 0, 0, 0,135, 0, 0, 0, 0, 0, 0, 2,
+136, 0, 0, 0,137, 0, 0, 0,141, 0, 0, 0,140, 0, 0, 0, 0, 0, 0, 2,134, 0, 0, 0,135, 0, 0, 0,139, 0, 0, 0,
+138, 0, 0, 0, 0, 0, 0, 2,139, 0, 0, 0,140, 0, 0, 0,144, 0, 0, 0,143, 0, 0, 0, 0, 0, 0, 2,129, 0, 0, 0,
+147, 0, 0, 0,144, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 2,142, 0, 0, 0,143, 0, 0, 0,128, 0, 0, 0,146, 0, 0, 0,
+ 0, 0, 0, 2,149, 0, 0, 0,148, 0, 0, 0,169, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 2,151, 0, 0, 0,150, 0, 0, 0,
+167, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 2,169, 0, 0, 0,161, 0, 0, 0,160, 0, 0, 0,173, 0, 0, 0, 0, 0, 0, 2,
+167, 0, 0, 0,168, 0, 0, 0,172, 0, 0, 0,171, 0, 0, 0, 0, 0, 0, 2,154, 0, 0, 0,166, 0, 0, 0,170, 0, 0, 0,
+155, 0, 0, 0, 0, 0, 0, 2,172, 0, 0, 0,173, 0, 0, 0,177, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 2,170, 0, 0, 0,
+171, 0, 0, 0,175, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 2,177, 0, 0, 0,159, 0, 0, 0,158, 0, 0, 0,181, 0, 0, 0,
+ 0, 0, 0, 2,175, 0, 0, 0,176, 0, 0, 0,180, 0, 0, 0,179, 0, 0, 0, 0, 0, 0, 2,156, 0, 0, 0,174, 0, 0, 0,
+178, 0, 0, 0,157, 0, 0, 0, 0, 0, 0, 2,180, 0, 0, 0,181, 0, 0, 0,165, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 2,
+178, 0, 0, 0,179, 0, 0, 0,163, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65,224, 13, 0, 0,128,124,118, 1,
+ 0, 0, 0, 0, 60, 0, 0, 0, 74, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,
+ 0, 29, 3, 63, 26, 95, 82, 62,120, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63,127, 84,181, 62,242, 65, 79, 63,190,188, 0, 63,102, 84,117, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61, 0, 29, 3, 63,128,106,188,189,176, 20,186, 62,144, 82,104, 61,
+128,223, 91, 62, 14, 95, 82, 62, 0, 21,186, 62, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,127, 84,181, 62,
+242, 65, 79, 63, 26, 95, 82, 62,120, 47, 41, 63,122, 84,181, 62,248, 28, 3, 63,188,188, 0, 63,120, 47, 41, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 56,207, 38, 63,111,179,141, 63,190,188, 0, 63,102, 84,117, 63, 52,207, 38, 63,
+236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+248, 28, 3, 63, 14, 95, 82, 62, 0, 21,186, 62,122, 84,181, 62, 32,224, 91, 62,185,188, 0, 63, 0, 21,186, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,236, 65, 79, 63,188,188, 0, 63,120, 47, 41, 63, 52,207, 38, 63,
+248, 28, 3, 63,174,225, 76, 63,116, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+ 32,224, 91, 62,138, 94, 82, 62, 48, 43,135, 61, 61, 84,181, 62,176,104,169,189,185,188, 0, 63, 96, 44,135, 61, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,248, 28, 3, 63,185,188, 0, 63, 0, 21,186, 62, 51,207, 38, 63,
+ 24,224, 91, 62,174,225, 76, 63, 0, 21,186, 62, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,
+236, 65, 79, 63,174,225, 76, 63,116, 47, 41, 63, 42,244,114, 63,244, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 51,207, 38, 63, 24,224, 91, 62,185,188, 0, 63, 96, 44,135, 61,248,207, 38, 63,
+144,109,169,189,112,226, 76, 63, 64, 38,135, 61, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,240,244,114, 63,
+ 4,221, 91, 62,180,131,140, 63,116, 19,186, 62, 42,244,114, 63,244, 28, 3, 63,174,225, 76, 63, 0, 21,186, 62, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,
+102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,
+242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,
+113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,
+102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,
+216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,
+120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,
+173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,200, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,
+242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,
+120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,
+102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,200, 84,104, 61,
+244, 65, 79, 63, 96,105,188,189,120, 47, 41, 63, 96,105,188,189,120, 47, 41, 63,200, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,
+102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,
+173,188,160, 63, 56,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,
+111,179,141, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,
+236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,
+173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,
+102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,174,225, 76, 63,102, 84,117, 63,174,225, 76, 63,
+102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,
+111,179,141, 63,190,188, 0, 63,171,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,162,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 72, 47, 41, 63, 99,131,140, 63,
+ 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63,
+ 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63,
+ 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63,
+ 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63,
+ 76, 47, 41, 63,244,140,159, 63, 50, 28, 3, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63,
+ 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,144,128, 81, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,248,168, 27, 63,
+ 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,176,131,185, 63,
+ 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59,224,151,158, 63, 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 21,172,131, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59,144,128, 81, 63,
+ 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,247,168, 27, 63,
+ 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59, 85,162,203, 62, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,226,151,158, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59, 21,172,131, 63,
+ 96,211, 93, 59,226,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,142,128, 81, 63,
+ 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59,247,168, 27, 63, 96,211, 93, 59,144,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,174,131,185, 63, 96,211, 93, 59,227,151,158, 63, 96,211, 93, 59,226,151,158, 63,
+ 96,211, 93, 59,174,131,185, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 22,172,131, 63,
+ 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59,142,128, 81, 63, 96,211, 93, 59, 24,172,131, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,251,168, 27, 63, 96,211, 93, 59, 84,162,203, 62, 96,211, 93, 59, 86,162,203, 62,
+ 96,211, 93, 59,246,168, 27, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,225,151,158, 63,
+ 96,211, 93, 59, 21,172,131, 63, 96,211, 93, 59, 22,172,131, 63, 96,211, 93, 59,227,151,158, 63, 96,211, 93, 59, 0, 0, 0, 0,
+ 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,146,128, 81, 63, 96,211, 93, 59,250,168, 27, 63, 96,211, 93, 59,251,168, 27, 63,
+ 96,211, 93, 59,149,128, 81, 63, 96,211, 93, 59, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,
+210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,244,140,159, 63, 50, 28, 3, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,
+236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,161,140,159, 63,
+210, 28, 3, 63, 99,131,140, 63, 76, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 99,131,140, 63, 76, 47, 41, 63, 44,244,114, 63,236, 65, 79, 63, 44,244,114, 63,
+236, 65, 79, 63, 99,131,140, 63, 76, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,162,140,159, 63,
+210, 28, 3, 63, 99,131,140, 63, 72, 47, 41, 63, 99,131,140, 63, 76, 47, 41, 63,161,140,159, 63,210, 28, 3, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,111,179,141, 63,190,188, 0, 63,171,188,160, 63,188,188, 0, 63,
+173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,
+236, 65, 79, 63,174,225, 76, 63,102, 84,117, 63,174,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,174,225, 76, 63,102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,
+111,179,141, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 52,207, 38, 63,
+111,179,141, 63,188,188, 0, 63,173,188,160, 63,188,188, 0, 63,173,188,160, 63, 52,207, 38, 63,111,179,141, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,
+102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,172,225, 76, 63,
+102, 84,117, 63, 52,207, 38, 63,111,179,141, 63, 52,207, 38, 63,111,179,141, 63,172,225, 76, 63,102, 84,117, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63, 56,207, 38, 63,111,179,141, 63, 52,207, 38, 63,
+111,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 44,244,114, 63,
+236, 65, 79, 63,172,225, 76, 63,102, 84,117, 63,172,225, 76, 63,102, 84,117, 63, 44,244,114, 63,236, 65, 79, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,200, 84,104, 61,244, 65, 79, 63, 96,105,188,189,120, 47, 41, 63, 96,105,188,189,
+120, 47, 41, 63,200, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 96,105,188,189,120, 47, 41, 63, 56,127,118,190,220, 28, 3, 63, 64,127,118,190,
+216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,
+102, 84,117, 63,200, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,
+113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,
+242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,
+102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,128,105,188,189,
+120, 47, 41, 63, 64,127,118,190,216, 28, 3, 63, 64,127,118,190,216, 28, 3, 63,128,105,188,189,120, 47, 41, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 26, 95, 82, 62,102, 84,117, 63,160, 84,104, 61,242, 65, 79, 63,160, 84,104, 61,
+242, 65, 79, 63, 26, 95, 82, 62,102, 84,117, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,188,188, 0, 63,
+173,188,160, 63,122, 84,181, 62,113,179,141, 63,122, 84,181, 62,113,179,141, 63,188,188, 0, 63,173,188,160, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,160, 84,104, 61,242, 65, 79, 63,128,105,188,189,120, 47, 41, 63,128,105,188,189,
+120, 47, 41, 63,160, 84,104, 61,242, 65, 79, 63, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0,122, 84,181, 62,
+113,179,141, 63, 26, 95, 82, 62,102, 84,117, 63, 26, 95, 82, 62,102, 84,117, 63,122, 84,181, 62,113,179,141, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 60, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,160, 4, 0, 0,160,138,118, 1, 0, 0, 0, 0, 57, 0, 0, 0,
+ 40, 1, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255, 77, 69, 0, 0,120, 1, 0, 0,144,162,118, 1, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0,144,178,118, 1,
+ 0, 0, 0, 0, 80, 83,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108,
+ 97,110,101, 46, 48, 48, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,144, 69, 88, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,178,118, 1, 0, 0, 0, 0,160,172,118, 1, 0, 0, 0, 0,128,173,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,208,165,118, 1, 0, 0, 0, 0, 96,169,118, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 64,175,118, 1, 0, 0, 0, 0, 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,164,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,224,167,118, 1,
+ 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 32,171,118, 1, 0, 0, 0, 0, 3, 0, 0, 0,
+ 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 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, 4,205, 76, 63,172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 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, 8, 0, 0, 0, 64,178,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 80,164,118, 1,
+ 0, 0, 0, 0, 5, 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,208,165,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 14, 56, 5, 32, 86, 32, 0, 0, 0, 56, 0, 0, 0,182, 63,230,102,133, 63,179, 51,208,191,128, 0, 4,165,127, 0, 0,
- 90,129, 2,255, 63,230,102,133, 63, 25,154,206,191,128, 0, 4,165,127, 0, 0, 90,129, 2,255, 63,179, 51, 81, 63,179, 51,210,
-191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 28, 63,179, 51,212,191,128, 0, 1, 0, 0, 0, 0,127,255, 2,255,
- 63, 25,153,207, 63,179, 51,214,191,128, 0, 0, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,152, 63,179, 51,216,191,127,255,254,
- 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 63,128, 0,158,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 27,
- 63,128, 0,160,191,128, 0, 2, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,204, 63,128, 0,162,191,128, 0, 0, 0, 0, 0, 0,
-127,255, 2,255, 62, 76,205,140, 63,128, 0,163,191,127,255,254, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 63, 25,154,209,
-191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 27, 63, 25,154,213,191,128, 0, 2, 0, 0, 0, 0,127,255, 2,255,
- 63, 25,153,204, 63, 25,154,217,191,128, 0, 0, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140, 63, 25,154,221,191,127,255,254,
- 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 62, 76,209,160,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 27,
- 62, 76,209,176,191,128, 0, 2, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,204, 62, 76,209,188,191,128, 0, 1, 0, 0, 0, 0,
-127,255, 2,255, 62, 76,205,140, 62, 76,209,204,191,127,255,255, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140, 63,230,103, 8,
-191, 25,153,156, 0, 0,128, 1, 0, 0, 2,255, 63, 25,153,204, 63,230,103, 10,191, 25,153,160, 0, 0,128, 1, 0, 0, 2,255,
- 63,128, 0, 27, 63,230,103, 10,191, 25,153,164, 0, 0,128, 1, 0, 0, 2,255, 63,179, 51, 80, 63,230,103, 12,191, 25,153,168,
- 0, 0,128, 1, 0, 0, 2,255, 62, 76,205,140, 63,230,103, 8,190, 76,204,196, 0, 0,128, 1, 0, 0, 2,255, 63, 25,153,204,
- 63,230,103, 10,190, 76,204,212, 0, 0,128, 1, 0, 0, 2,255, 63,128, 0, 27, 63,230,103, 10,190, 76,204,228, 0, 0,128, 1,
- 0, 0, 2,255, 63,179, 51, 80, 63,230,103, 12,190, 76,204,244, 0, 0,128, 1, 0, 0, 2,255, 62, 76,205,140, 63,230,103, 8,
- 62, 76,204,216, 0, 0,128, 1, 0, 0, 2,255, 63, 25,153,204, 63,230,103, 10, 62, 76,204,200, 0, 0,128, 1, 0, 0, 2,255,
- 63,128, 0, 27, 63,230,103, 10, 62, 76,204,184, 0, 0,128, 1, 0, 0, 2,255, 63,179, 51, 80, 63,230,103, 12, 62, 76,204,168,
- 0, 0,128, 1, 0, 0, 2,255, 62, 76,205,152, 63,230,103, 8, 63, 25,153,158, 0, 0,128, 1, 0, 0, 2,255, 63, 25,153,207,
- 63,230,103, 10, 63, 25,153,154, 0, 0,128, 1, 0, 0, 2,255, 63,128, 0, 28, 63,230,103, 10, 63, 25,153,150, 0, 0,128, 1,
- 0, 0, 2,255, 63,179, 51, 81, 63,230,103, 12, 63, 25,153,150, 0, 0,128, 1, 0, 0, 2,255, 62, 76,205,140, 63,230,103, 8,
-191,128, 0, 3, 0, 0,165,127, 90,129, 0,255, 63, 25,153,204, 63,230,103, 10,191,128, 0, 4, 0, 0,165,127, 90,129, 0,255,
- 63,128, 0, 27, 63,230,103, 10,191,128, 0, 6, 0, 0,165,127, 90,129, 0,255, 63,179, 51, 80, 63,230,103, 12,191,128, 0, 7,
- 0, 0,165,127, 90,129, 0,255,190, 76,205,144, 63,230,103, 12, 63, 25,153,150, 0, 0,128, 1, 0, 0, 2,255,190, 76,205,152,
- 63,230,103, 12, 62, 76,204,168, 0, 0,128, 1, 0, 0, 2,255,190, 76,205,152, 63,230,103, 12,190, 76,204,244, 0, 0,128, 1,
- 0, 0, 2,255,190, 76,205,152, 63,230,103, 12,191, 25,153,168, 0, 0,128, 1, 0, 0, 2,255,190, 76,205,152, 62, 76,209,160,
-191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255,190, 76,205,152, 63, 25,154,209,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255,
-190, 76,205,152, 63,128, 0,158,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255,190, 76,205,144, 63,179, 51,210,191,128, 0, 3,
- 0, 0, 0, 0,127,255, 2,255, 63,230,102,131, 63,230,103, 7,191, 25,153,155,165,127,165,127, 0, 0, 2,255, 63,230,102,131,
- 63,179, 51,212,191, 25,153,159,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,128, 0,160,191, 25,153,163,128, 1, 0, 0,
- 0, 0, 2,255, 63,230,102,135, 63, 25,154,207,191, 25,153,167,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,230,103, 7,
-190, 76,204,193,165,127,165,127, 0, 0, 2,255, 63,230,102,131, 63,179, 51,212,190, 76,204,209,128, 1, 0, 0, 0, 0, 2,255,
- 63,230,102,131, 63,128, 0,160,190, 76,204,225,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,135, 63, 25,154,207,190, 76,204,241,
-128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,230,103, 7, 62, 76,204,219,165,127,165,127, 0, 0, 2,255, 63,230,102,131,
- 63,179, 51,212, 62, 76,204,203,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,128, 0,160, 62, 76,204,187,128, 1, 0, 0,
- 0, 0, 2,255, 63,230,102,135, 63, 25,154,207, 62, 76,204,171,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,230,103, 7,
- 63, 25,153,159,165,127,165,127, 0, 0, 2,255, 63,230,102,131, 63,179, 51,212, 63, 25,153,155,128, 1, 0, 0, 0, 0, 2,255,
- 63,230,102,131, 63,128, 0,156, 63, 25,153,151,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,135, 63, 25,154,207, 63, 25,153,151,
-128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131, 63,230,103, 7,191,128, 0, 3,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131,
- 63,128, 0,160,191,128, 0, 6,165,127, 0, 0, 90,129, 2,255, 63,230,102,127, 62, 76,208, 28,191,128, 0, 3,165,127, 0, 0,
- 90,129, 2,255, 63,230,102,131,190, 76,201,136, 63, 25,153,155,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,127, 62, 76,208, 28,
- 63, 25,153,159,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131,190, 76,201,136, 62, 76,204,203,128, 1, 0, 0, 0, 0, 2,255,
- 63,230,102,127, 62, 76,208, 28, 62, 76,204,219,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131,190, 76,201,136,190, 76,204,209,
-128, 1, 0, 0, 0, 0, 2,255, 63,230,102,127, 62, 76,208, 28,190, 76,204,193,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,131,
-190, 76,201,136,191, 25,153,159,128, 1, 0, 0, 0, 0, 2,255, 63,230,102,127, 62, 76,208, 28,191, 25,153,155,128, 1, 0, 0,
- 0, 0, 2,255, 62, 76,205,150,190, 76,208, 24,191,127,255,254, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,207,190, 76,208, 40,
-191,128, 0, 0, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 28,190, 76,208, 56,191,128, 0, 1, 0, 0, 0, 0,127,255, 2,255,
- 63,179, 51, 81,190, 76,208, 72,191,128, 0, 3, 0, 0, 0, 0,127,255, 2,255, 63,230,102,133,190, 76,208, 88,191,128, 0, 4,
-128, 1, 0, 0, 0, 0, 2,255, 63,230,102,133,190, 76,208, 88, 63,127,255,146,128, 1, 0, 0, 0, 0, 2,255, 63,179, 51, 81,
-190, 76,208, 72, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 28,190, 76,208, 56, 63,127,255,152, 0, 0, 0, 0,
-127,255, 2,255, 63, 25,153,207,190, 76,208, 40, 63,127,255,154, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,150,190, 76,208, 24,
- 63,127,255,156, 0, 0, 0, 0,127,255, 2,255, 63,230,102,127, 62, 76,208, 28, 63,127,255,148,165,127, 0, 0, 90,129, 2,255,
- 63,230,102,131, 63,128, 0,160, 63,127,255,142,165,127, 0, 0, 90,129, 2,255, 63,230,102,131, 63,230,103, 7, 63,127,255,148,
-128, 1, 0, 0, 0, 0, 2,255,190, 76,205,144, 63,179, 51,210, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255,190, 76,205,152,
- 63,128, 0,158, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255,190, 76,205,152, 63, 25,154,209, 63,127,255,148, 0, 0, 0, 0,
-127,255, 2,255,190, 76,205,152, 62, 76,209,160, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 63,230,103, 12,
- 63,127,255,140, 0, 0,165,127, 90,129, 2,255, 63,128, 0, 27, 63,230,103, 10, 63,127,255,142, 0, 0,165,127, 90,129, 2,255,
- 63, 25,153,204, 63,230,103, 10, 63,127,255,146, 0, 0,165,127, 90,129, 2,255, 62, 76,205,140, 63,230,103, 8, 63,127,255,148,
- 0, 0,165,127, 90,129, 2,255, 62, 76,205,140, 62, 76,209,204, 63,127,255,154, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,204,
- 62, 76,209,188, 63,127,255,152, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 27, 62, 76,209,176, 63,127,255,150, 0, 0, 0, 0,
-127,255, 2,255, 63,179, 51, 80, 62, 76,209,160, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140, 63, 25,154,221,
- 63,127,255,156, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,204, 63, 25,154,217, 63,127,255,154, 0, 0, 0, 0,127,255, 2,255,
- 63,128, 0, 27, 63, 25,154,213, 63,127,255,150, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 80, 63, 25,154,209, 63,127,255,148,
- 0, 0, 0, 0,127,255, 2,255, 62, 76,205,140, 63,128, 0,163, 63,127,255,156, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,204,
- 63,128, 0,162, 63,127,255,154, 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 27, 63,128, 0,160, 63,127,255,150, 0, 0, 0, 0,
-127,255, 2,255, 63,179, 51, 80, 63,128, 0,158, 63,127,255,148, 0, 0, 0, 0,127,255, 2,255, 62, 76,205,152, 63,179, 51,216,
- 63,127,255,156, 0, 0, 0, 0,127,255, 2,255, 63, 25,153,207, 63,179, 51,214, 63,127,255,154, 0, 0, 0, 0,127,255, 2,255,
- 63,128, 0, 28, 63,179, 51,212, 63,127,255,152, 0, 0, 0, 0,127,255, 2,255, 63,179, 51, 81, 63,179, 51,210, 63,127,255,148,
- 0, 0, 0, 0,127,255, 2,255, 63,230,102,133, 63, 25,154,206, 63,127,255,146,165,127, 0, 0, 90,129, 2,255, 63,230,102,133,
- 63,179, 51,208, 63,127,255,146,165,127, 0, 0, 90,129, 2,255,190, 76,205,144, 62, 76,201,140, 63,127,255,148,127,255, 0, 0,
- 0, 0, 1,255,190, 76,205,136, 63,127,255, 52, 63,127,255,148,127,255, 0, 0, 0, 0, 1,255,190, 76,205,128,190, 76,208, 48,
- 63,127,255,150,127,255, 0, 0, 0, 0, 3,255,190, 76,205,120, 63, 25,152,194, 63,127,255,144,127,255, 0, 0, 0, 0, 1,255,
-190, 76,205, 80, 63,179, 50,254, 63,127,255,150,127,255, 0, 0, 0, 0, 1,255,190, 76,205,128, 63,230,103, 12, 63,127,255,148,
-127,255, 0, 0, 0, 0, 3,255,190, 76,205,128, 63,230,103, 12,191,128, 0, 5,127,255, 0, 0, 0, 0, 3,255,190, 76,205, 80,
- 63,179, 50,254,191, 25,153,156,127,255, 0, 0, 0, 0, 3,255,190, 76,205,112, 63,230,102, 50,191, 25,153,160,127,255, 0, 0,
- 0, 0, 3,255,190, 76,205, 80, 63,179, 50,254,190, 76,204,195,127,255, 0, 0, 0, 0, 3,255,190, 76,205,112, 63,230,102, 50,
-190, 76,204,211,127,255, 0, 0, 0, 0, 3,255,190, 76,205, 80, 63,179, 50,254, 62, 76,204,221,127,255, 0, 0, 0, 0, 3,255,
-190, 76,205,112, 63,230,102, 50, 62, 76,204,205,127,255, 0, 0, 0, 0, 3,255,190, 76,205, 80, 63,179, 50,254, 63, 25,153,160,
-127,255, 0, 0, 0, 0, 3,255,190, 76,205,112, 63,230,102, 50, 63, 25,153,156,127,255, 0, 0, 0, 0, 3,255,190, 76,205, 80,
- 63,179, 50,254,191,128, 0, 4,127,255, 0, 0, 0, 0, 1,255,190, 76,205,120, 63, 25,152,194,191,128, 0, 7,127,255, 0, 0,
- 0, 0, 1,255,190, 76,205,128,190, 76,208, 48,191,128, 0, 4,127,255, 0, 0, 0, 0, 3,255,190, 76,205,152, 63,127,255, 52,
- 63, 25,153,152,127,255, 0, 0, 0, 0, 3,255,190, 76,205,120, 63, 25,152,202, 63, 25,153,152,127,255, 0, 0, 0, 0, 3,255,
-190, 76,205,128, 62, 76,201,108, 63, 25,153,156,127,255, 0, 0, 0, 0, 3,255,190, 76,205,128,190, 76,208, 48, 63, 25,153,160,
-127,255, 0, 0, 0, 0, 1,255,190, 76,205,152, 63,127,255, 52, 62, 76,204,173,127,255, 0, 0, 0, 0, 3,255,190, 76,205,120,
- 63, 25,152,194, 62, 76,204,189,127,255, 0, 0, 0, 0, 3,255,190, 76,205,128, 62, 76,201,108, 62, 76,204,205,127,255, 0, 0,
- 0, 0, 3,255,190, 76,205,128,190, 76,208, 48, 62, 76,204,221,127,255, 0, 0, 0, 0, 1,255,190, 76,205,152, 63,127,255, 52,
-190, 76,204,243,127,255, 0, 0, 0, 0, 3,255,190, 76,205,120, 63, 25,152,194,190, 76,204,227,127,255, 0, 0, 0, 0, 3,255,
-190, 76,205,128, 62, 76,201,108,190, 76,204,211,127,255, 0, 0, 0, 0, 3,255,190, 76,205,128,190, 76,208, 48,190, 76,204,195,
-127,255, 0, 0, 0, 0, 1,255,190, 76,205,152, 63,127,255, 52,191, 25,153,168,127,255, 0, 0, 0, 0, 3,255,190, 76,205,120,
- 63, 25,152,194,191, 25,153,164,127,255, 0, 0, 0, 0, 3,255,190, 76,205,128, 62, 76,201,108,191, 25,153,160,127,255, 0, 0,
- 0, 0, 3,255,190, 76,205,128,190, 76,208, 48,191, 25,153,156,127,255, 0, 0, 0, 0, 1,255,190, 76,205,136, 63,127,255, 52,
-191,128, 0, 5,127,255, 0, 0, 0, 0, 1,255,190, 76,205,144, 62, 76,201,140,191,128, 0, 5,127,255, 0, 0, 0, 0, 1,255,
- 63,179, 51, 36,190, 76,208, 56, 63,127,255,150, 0, 0,127,255, 0, 0, 3,255, 63,127,255,222,190, 76,208, 80, 63,127,255,148,
- 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,190, 76,208, 80, 63,127,255,144, 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 44,
-190, 76,208,104, 63,127,255,142, 0, 0,127,255, 0, 0, 3,255,190, 76,205,112,190, 76,208, 64, 63,127,255,150,231, 94,231, 94,
-123, 41, 1,255,190, 76,205,112,190, 76,208, 64,191,128, 0, 4,231, 94,231, 94,132,215, 1,255,190, 76,205,112,190, 76,208, 64,
- 63, 25,153,160, 0, 0,127,255, 0, 0, 1,255,190, 76,205,112,190, 76,208, 64, 62, 76,204,221, 0, 0,127,255, 0, 0, 1,255,
-190, 76,205,112,190, 76,208, 64,190, 76,204,195, 0, 0,127,255, 0, 0, 1,255,190, 76,205,112,190, 76,208, 64,191, 25,153,156,
- 0, 0,127,255, 0, 0, 1,255, 63,230,102,136,190, 76,208, 88,191, 25,153,169, 0, 0,127,255, 0, 0, 3,255, 63,230,102,136,
-190, 76,208, 88,190, 76,204,246, 0, 0,127,255, 0, 0, 3,255, 63,230,102,136,190, 76,208, 88, 62, 76,204,170, 0, 0,127,255,
- 0, 0, 3,255, 63,230,102,135,190, 76,208, 88, 63, 25,153,151, 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 44,190, 76,208,104,
-191,128, 0, 8, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,190, 76,208, 80,191,128, 0, 7, 0, 0,127,255, 0, 0, 3,255,
- 63,127,255,222,190, 76,208, 80,191,128, 0, 5, 0, 0,127,255, 0, 0, 3,255, 63,179, 51, 36,190, 76,208, 56,191,128, 0, 4,
- 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 36,190, 76,208,104, 63, 25,153,151, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,114,
-190, 76,208, 80, 63, 25,153,151, 0, 0,127,255, 0, 0, 3,255, 63,127,255,220,190, 76,208, 80, 63, 25,153,155, 0, 0,127,255,
- 0, 0, 3,255, 63,179, 51, 34,190, 76,208, 56, 63, 25,153,159, 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 44,190, 76,208,104,
- 62, 76,204,170, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,190, 76,208, 80, 62, 76,204,186, 0, 0,127,255, 0, 0, 3,255,
- 63,127,255,222,190, 76,208, 80, 62, 76,204,202, 0, 0,127,255, 0, 0, 3,255, 63,179, 51, 36,190, 76,208, 56, 62, 76,204,218,
- 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 44,190, 76,208,104,190, 76,204,246, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,
-190, 76,208, 80,190, 76,204,230, 0, 0,127,255, 0, 0, 3,255, 63,127,255,222,190, 76,208, 80,190, 76,204,214, 0, 0,127,255,
- 0, 0, 3,255, 63,179, 51, 36,190, 76,208, 56,190, 76,204,198, 0, 0,127,255, 0, 0, 3,255, 62, 76,204, 44,190, 76,208,104,
-191, 25,153,169, 0, 0,127,255, 0, 0, 3,255, 63, 25,153,116,190, 76,208, 80,191, 25,153,165, 0, 0,127,255, 0, 0, 3,255,
- 63,127,255,222,190, 76,208, 80,191, 25,153,161, 0, 0,127,255, 0, 0, 3,255, 63,179, 51, 36,190, 76,208, 56,191, 25,153,157,
- 0, 0,127,255, 0, 0, 3,255, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,215,224, 0, 0, 0,242, 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, 5, 32,102, 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,
- 68, 65, 84, 65, 0, 0, 14, 28, 5, 32,102, 32, 0, 0, 0, 53, 0, 0, 1, 45, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34,
- 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 34, 0, 0, 0, 4,
- 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0, 34,
- 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 13,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 11,
- 0, 0, 0, 12, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 11, 0, 0, 0, 34,
- 0, 0, 0, 6, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 17,
- 0, 0, 0, 34, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 11, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34,
- 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 36,
- 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 34, 0, 0, 0, 21,
- 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 20, 0, 0, 0, 24, 0, 0, 0, 34,
- 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 19, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19,
- 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 24,
- 0, 0, 0, 25, 0, 0, 0, 34, 0, 0, 0, 24, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 23, 0, 0, 0, 24, 0, 0, 0, 34,
- 0, 0, 0, 23, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 26,
- 0, 0, 0, 34, 0, 0, 0, 29, 0, 0, 0, 33, 0, 0, 0, 34, 0, 0, 0, 28, 0, 0, 0, 29, 0, 0, 0, 34, 0, 0, 0, 28,
- 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 27, 0, 0, 0, 31, 0, 0, 0, 34,
- 0, 0, 0, 26, 0, 0, 0, 27, 0, 0, 0, 34, 0, 0, 0, 26, 0, 0, 0, 30, 0, 0, 0, 34, 0, 0, 0, 32, 0, 0, 0, 33,
- 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 32, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 34, 0, 0, 0, 34,
- 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 37, 0, 0, 0, 34,
- 0, 0, 0, 3, 0, 0, 0, 36, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 34,
- 0, 0, 0, 34, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 34, 0, 0, 0, 42,
- 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 44, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 34,
- 0, 0, 0, 26, 0, 0, 0, 39, 0, 0, 0, 34, 0, 0, 0, 22, 0, 0, 0, 40, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 41,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 42, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 34, 0, 0, 0, 9,
- 0, 0, 0, 44, 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 34, 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 34,
- 0, 0, 0, 53, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0, 66,
- 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 49,
- 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 49, 0, 0, 0, 34, 0, 0, 0, 48, 0, 0, 0, 52, 0, 0, 0, 34,
- 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 34, 0, 0, 0, 47, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 47,
- 0, 0, 0, 34, 0, 0, 0, 46, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 53, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 52,
- 0, 0, 0, 53, 0, 0, 0, 34, 0, 0, 0, 52, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 51, 0, 0, 0, 52, 0, 0, 0, 34,
- 0, 0, 0, 51, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 0, 34, 0, 0, 0, 50, 0, 0, 0, 54,
- 0, 0, 0, 34, 0, 0, 0, 57, 0, 0, 0, 61, 0, 0, 0, 34, 0, 0, 0, 56, 0, 0, 0, 57, 0, 0, 0, 34, 0, 0, 0, 56,
- 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 34, 0, 0, 0, 55, 0, 0, 0, 59, 0, 0, 0, 34,
- 0, 0, 0, 54, 0, 0, 0, 55, 0, 0, 0, 34, 0, 0, 0, 54, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 61,
- 0, 0, 0, 34, 0, 0, 0, 59, 0, 0, 0, 60, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 34, 0, 0, 0, 65,
- 0, 0, 0, 66, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0, 68, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 34,
- 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 34, 0, 0, 0, 67, 0, 0, 0, 69,
- 0, 0, 0, 34, 0, 0, 0, 70, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 64,
- 0, 0, 0, 72, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 34,
- 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 49,
- 0, 0, 0, 34, 0, 0, 0, 1, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 58, 0, 0, 0, 34, 0, 0, 0, 29,
- 0, 0, 0, 54, 0, 0, 0, 34, 0, 0, 0, 25, 0, 0, 0, 50, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 46, 0, 0, 0, 34,
- 0, 0, 0, 14, 0, 0, 0, 64, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0, 34, 0, 0, 0, 75, 0, 0, 0, 76,
- 0, 0, 0, 34, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 34, 0, 0, 0, 71, 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 64,
- 0, 0, 0, 77, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 76, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 75, 0, 0, 0, 34,
- 0, 0, 0, 16, 0, 0, 0, 74, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 34, 0, 0, 0, 82, 0, 0, 0, 94,
- 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 80, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 79,
- 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 78, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 81, 0, 0, 0, 82, 0, 0, 0, 34,
- 0, 0, 0, 79, 0, 0, 0, 80, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0, 97,
- 0, 0, 0, 34, 0, 0, 0, 83, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 85, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 84,
- 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 84, 0, 0, 0,110, 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0,106, 0, 0, 0, 34,
- 0, 0, 0, 87, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0, 89, 0, 0, 0, 94,
- 0, 0, 0, 34, 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0, 34, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 34, 0, 0, 0, 93,
- 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0, 34,
- 0, 0, 0, 90, 0, 0, 0,109, 0, 0, 0, 34, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 92, 0, 0, 0, 93,
- 0, 0, 0, 34, 0, 0, 0, 97, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0, 96, 0, 0, 0, 97, 0, 0, 0, 34, 0, 0, 0, 96,
- 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 34, 0, 0, 0, 95, 0, 0, 0, 99, 0, 0, 0, 34,
- 0, 0, 0, 94, 0, 0, 0, 95, 0, 0, 0, 34, 0, 0, 0, 94, 0, 0, 0, 98, 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,110,
- 0, 0, 0, 34, 0, 0, 0,101, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 34, 0, 0, 0,100,
- 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,100, 0, 0, 0, 34, 0, 0, 0, 99, 0, 0, 0,103, 0, 0, 0, 34,
- 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 34, 0, 0, 0, 98, 0, 0, 0,102, 0, 0, 0, 34, 0, 0, 0,105, 0, 0, 0,109,
- 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,105, 0, 0, 0, 34, 0, 0, 0,104, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,103,
- 0, 0, 0,104, 0, 0, 0, 34, 0, 0, 0,103, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0,102, 0, 0, 0,103, 0, 0, 0, 34,
- 0, 0, 0,102, 0, 0, 0,106, 0, 0, 0, 34, 0, 0, 0,109, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0,108, 0, 0, 0,109,
- 0, 0, 0, 34, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 34, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 34, 0, 0, 0, 65,
- 0, 0, 0, 78, 0, 0, 0, 34, 0, 0, 0, 66, 0, 0, 0, 83, 0, 0, 0, 34, 0, 0, 0, 58, 0, 0, 0, 85, 0, 0, 0, 34,
- 0, 0, 0, 59, 0, 0, 0,111, 0, 0, 0, 34, 0, 0, 0, 60, 0, 0, 0, 84, 0, 0, 0, 34, 0, 0, 0, 61, 0, 0, 0,110,
- 0, 0, 0, 34, 0, 0, 0, 30, 0, 0, 0, 93, 0, 0, 0, 34, 0, 0, 0, 31, 0, 0, 0, 92, 0, 0, 0, 34, 0, 0, 0, 32,
- 0, 0, 0, 91, 0, 0, 0, 34, 0, 0, 0, 33, 0, 0, 0, 90, 0, 0, 0, 34, 0, 0, 0,113, 0, 0, 0,130, 0, 0, 0, 35,
- 0, 0, 0,115, 0, 0, 0,131, 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 0,132, 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 0,133,
- 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 0,125, 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 0,126, 0, 0, 0, 35, 0, 0, 0,113,
- 0, 0, 0,115, 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 0,115, 0, 0, 0,163, 0, 0, 0,112, 0, 0, 0,114, 0, 0, 0, 35,
- 0, 0, 0,113, 0, 0, 0,116, 0, 0, 0,163, 0, 0, 0,116, 0, 0, 0,117, 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 0,127,
- 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 0,120, 0, 0, 0, 35, 0, 0, 0,127, 0, 0, 0,146, 0, 0, 0,163, 0, 0, 0,142,
- 0, 0, 0,146, 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 0,147, 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 0,147, 0, 0, 0, 35,
- 0, 0, 0,128, 0, 0, 0,147, 0, 0, 0,163, 0, 0, 0,128, 0, 0, 0,146, 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 0,127,
- 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 0,120, 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 0,121, 0, 0, 0, 35, 0, 0, 0,122,
- 0, 0, 0,124, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 0,123, 0, 0, 0, 35,
- 0, 0, 0,123, 0, 0, 0,124, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 0,125, 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 0,126,
- 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 0,133, 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 0,132, 0, 0, 0, 35, 0, 0, 0,130,
- 0, 0, 0,131, 0, 0, 0, 35, 0, 0, 0,133, 0, 0, 0,137, 0, 0, 0,163, 0, 0, 0,136, 0, 0, 0,137, 0, 0, 0, 35,
- 0, 0, 0,132, 0, 0, 0,136, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 0,136, 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 0,135,
- 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 0,135, 0, 0, 0, 35, 0, 0, 0,130, 0, 0, 0,134, 0, 0, 0, 35, 0, 0, 0,137,
- 0, 0, 0,141, 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 0,141, 0, 0, 0, 35, 0, 0, 0,136, 0, 0, 0,140, 0, 0, 0, 35,
- 0, 0, 0,139, 0, 0, 0,140, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 0,139, 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 0,139,
- 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 0,138, 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 0,145, 0, 0, 0,163, 0, 0, 0,144,
- 0, 0, 0,145, 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 0,144, 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 0,144, 0, 0, 0, 35,
- 0, 0, 0,139, 0, 0, 0,143, 0, 0, 0, 35, 0, 0, 0,142, 0, 0, 0,143, 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 0,142,
- 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 0,145, 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 0,143, 0, 0, 0, 35, 0, 0, 0,125,
- 0, 0, 0,130, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 0,134, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 0,138, 0, 0, 0, 35,
- 0, 0, 0,119, 0, 0, 0,142, 0, 0, 0, 35, 0, 0, 0,151, 0, 0, 0,166, 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 0,167,
- 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 0,168, 0, 0, 0, 35, 0, 0, 0,148, 0, 0, 0,169, 0, 0, 0, 35, 0, 0, 0,152,
- 0, 0, 0,154, 0, 0, 0,163, 0, 0, 0,148, 0, 0, 0,149, 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 0,151, 0, 0, 0, 35,
- 0, 0, 0,157, 0, 0, 0,178, 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 0,174, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 0,170,
- 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 0,166, 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 0,155, 0, 0, 0, 35, 0, 0, 0,155,
- 0, 0, 0,156, 0, 0, 0,163, 0, 0, 0,156, 0, 0, 0,157, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 0,157, 0, 0, 0,163,
- 0, 0, 0,158, 0, 0, 0,181, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 0,177, 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 0,173,
- 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 0,169, 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 0,159, 0, 0, 0, 35, 0, 0, 0,160,
- 0, 0, 0,161, 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 0,163, 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 0,165, 0, 0, 0, 35,
- 0, 0, 0,168, 0, 0, 0,169, 0, 0, 0, 35, 0, 0, 0,167, 0, 0, 0,168, 0, 0, 0, 35, 0, 0, 0,166, 0, 0, 0,167,
- 0, 0, 0, 35, 0, 0, 0,169, 0, 0, 0,173, 0, 0, 0, 35, 0, 0, 0,172, 0, 0, 0,173, 0, 0, 0, 35, 0, 0, 0,168,
- 0, 0, 0,172, 0, 0, 0, 35, 0, 0, 0,171, 0, 0, 0,172, 0, 0, 0, 35, 0, 0, 0,167, 0, 0, 0,171, 0, 0, 0, 35,
- 0, 0, 0,170, 0, 0, 0,171, 0, 0, 0, 35, 0, 0, 0,166, 0, 0, 0,170, 0, 0, 0, 35, 0, 0, 0,173, 0, 0, 0,177,
- 0, 0, 0, 35, 0, 0, 0,176, 0, 0, 0,177, 0, 0, 0, 35, 0, 0, 0,172, 0, 0, 0,176, 0, 0, 0, 35, 0, 0, 0,175,
- 0, 0, 0,176, 0, 0, 0, 35, 0, 0, 0,171, 0, 0, 0,175, 0, 0, 0, 35, 0, 0, 0,174, 0, 0, 0,175, 0, 0, 0, 35,
- 0, 0, 0,170, 0, 0, 0,174, 0, 0, 0, 35, 0, 0, 0,177, 0, 0, 0,181, 0, 0, 0, 35, 0, 0, 0,180, 0, 0, 0,181,
- 0, 0, 0, 35, 0, 0, 0,176, 0, 0, 0,180, 0, 0, 0, 35, 0, 0, 0,179, 0, 0, 0,180, 0, 0, 0, 35, 0, 0, 0,175,
- 0, 0, 0,179, 0, 0, 0, 35, 0, 0, 0,178, 0, 0, 0,179, 0, 0, 0, 35, 0, 0, 0,174, 0, 0, 0,178, 0, 0, 0, 35,
- 0, 0, 0,165, 0, 0, 0,181, 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 0,180, 0, 0, 0, 35, 0, 0, 0,163, 0, 0, 0,179,
- 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 0,178, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,217, 16, 0, 0, 0,242,
- 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, 5, 32,118, 32, 0, 0, 0, 5, 0, 0, 0, 20,
- 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 84,101,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, 5, 32,124, 32, 0, 0, 0, 6, 0, 0, 0, 64, 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, 5, 32,138, 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, 68, 65, 84, 65, 0, 0, 5,200, 5, 32,118, 32, 0, 0, 0, 52, 0, 0, 0, 74, 0, 0, 0, 35,
- 0, 0, 0, 34, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 36, 0, 0, 0, 3, 0, 0, 0, 2,
- 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 45, 0, 0, 0, 44, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4,
- 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 6, 0, 0, 0, 63, 0, 0, 0, 0,
- 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 13, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 11,
- 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 43, 0, 0, 0, 42, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 11,
- 0, 0, 0, 12, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, 64,
- 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 73, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 76,
- 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 0, 0, 36, 0, 0, 0, 37, 0, 0, 0, 0,
- 0, 0, 0, 19, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 25, 0, 0, 0, 21,
- 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 23, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 22,
- 0, 0, 0, 40, 0, 0, 0, 41, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 28, 0, 0, 0, 24, 0, 0, 0, 25,
- 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 26, 0, 0, 0, 22, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 33,
- 0, 0, 0, 29, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 31, 0, 0, 0, 27, 0, 0, 0, 28, 0, 0, 0, 0,
- 0, 0, 0, 30, 0, 0, 0, 38, 0, 0, 0, 39, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0, 32,
- 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 92, 0, 0, 0, 93, 0, 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 49,
- 0, 0, 0, 48, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 46,
- 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 51, 0, 0, 0, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 56,
- 0, 0, 0, 52, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 54, 0, 0, 0, 50, 0, 0, 0, 51, 0, 0, 0, 0,
- 0, 0, 0, 60, 0, 0, 0, 59, 0, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0, 84, 0, 0, 0, 60,
- 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0, 85, 0, 0, 0, 58, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 78,
- 0, 0, 0, 83, 0, 0, 0, 66, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 61, 0, 0, 0, 57, 0, 0, 0, 68,
- 0, 0, 0, 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 70, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 53,
- 0, 0, 0, 49, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 72, 0, 0, 0, 64, 0, 0, 0, 77, 0, 0, 0, 0,
- 0, 0, 0, 80, 0, 0, 0, 79, 0, 0, 0, 97, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 95, 0, 0, 0, 94, 0, 0, 0, 82,
- 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0,101, 0, 0, 0, 97, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0,100,
- 0, 0, 0, 99, 0, 0, 0, 95, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 88, 0, 0, 0, 89, 0, 0, 0, 94,
- 0, 0, 0, 0, 0, 0, 0,105, 0, 0, 0,104, 0, 0, 0,100, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0,103, 0, 0, 0,102,
- 0, 0, 0, 98, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0,111, 0, 0, 0,109, 0, 0, 0,105, 0, 0, 0, 84, 0, 0, 0, 0,
- 0, 0, 0,108, 0, 0, 0,107, 0, 0, 0,103, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0,106, 0, 0, 0, 86, 0, 0, 0, 87,
- 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 91, 0, 0, 0,108, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0, 92,
- 0, 0, 0, 93, 0, 0, 0,106, 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0,120, 0, 0, 0,119, 0, 0, 0,127, 0, 0, 0,118,
- 0, 0, 0, 2, 0, 0, 0,121, 0, 0, 0,138, 0, 0, 0,142, 0, 0, 0,119, 0, 0, 0, 2, 0, 0, 0,124, 0, 0, 0,123,
- 0, 0, 0,121, 0, 0, 0,122, 0, 0, 0, 2, 0, 0, 0,125, 0, 0, 0,130, 0, 0, 0,134, 0, 0, 0,123, 0, 0, 0, 2,
- 0, 0, 0,117, 0, 0, 0,116, 0, 0, 0,125, 0, 0, 0,126, 0, 0, 0, 2, 0, 0, 0,112, 0, 0, 0,114, 0, 0, 0,133,
- 0, 0, 0,132, 0, 0, 0, 2, 0, 0, 0,113, 0, 0, 0,115, 0, 0, 0,131, 0, 0, 0,130, 0, 0, 0, 2, 0, 0, 0,131,
- 0, 0, 0,132, 0, 0, 0,136, 0, 0, 0,135, 0, 0, 0, 2, 0, 0, 0,136, 0, 0, 0,137, 0, 0, 0,141, 0, 0, 0,140,
- 0, 0, 0, 2, 0, 0, 0,134, 0, 0, 0,135, 0, 0, 0,139, 0, 0, 0,138, 0, 0, 0, 2, 0, 0, 0,139, 0, 0, 0,140,
- 0, 0, 0,144, 0, 0, 0,143, 0, 0, 0, 2, 0, 0, 0,129, 0, 0, 0,147, 0, 0, 0,144, 0, 0, 0,145, 0, 0, 0, 2,
- 0, 0, 0,142, 0, 0, 0,143, 0, 0, 0,128, 0, 0, 0,146, 0, 0, 0, 2, 0, 0, 0,149, 0, 0, 0,148, 0, 0, 0,169,
- 0, 0, 0,168, 0, 0, 0, 2, 0, 0, 0,151, 0, 0, 0,150, 0, 0, 0,167, 0, 0, 0,166, 0, 0, 0, 2, 0, 0, 0,169,
- 0, 0, 0,161, 0, 0, 0,160, 0, 0, 0,173, 0, 0, 0, 2, 0, 0, 0,167, 0, 0, 0,168, 0, 0, 0,172, 0, 0, 0,171,
- 0, 0, 0, 2, 0, 0, 0,154, 0, 0, 0,166, 0, 0, 0,170, 0, 0, 0,155, 0, 0, 0, 2, 0, 0, 0,172, 0, 0, 0,173,
- 0, 0, 0,177, 0, 0, 0,176, 0, 0, 0, 2, 0, 0, 0,170, 0, 0, 0,171, 0, 0, 0,175, 0, 0, 0,174, 0, 0, 0, 2,
- 0, 0, 0,177, 0, 0, 0,159, 0, 0, 0,158, 0, 0, 0,181, 0, 0, 0, 2, 0, 0, 0,175, 0, 0, 0,176, 0, 0, 0,180,
- 0, 0, 0,179, 0, 0, 0, 2, 0, 0, 0,156, 0, 0, 0,174, 0, 0, 0,178, 0, 0, 0,157, 0, 0, 0, 2, 0, 0, 0,180,
- 0, 0, 0,181, 0, 0, 0,165, 0, 0, 0,164, 0, 0, 0, 2, 0, 0, 0,178, 0, 0, 0,179, 0, 0, 0,163, 0, 0, 0,162,
- 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 12,184, 5, 32,124, 32, 0, 0, 0, 60, 0, 0, 0, 74, 61,104, 84,160, 63, 79, 65,242,
-189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 3, 29, 0, 62, 82, 95, 26, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242, 63, 0,188,190,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 3, 29, 0,189,188,106,128, 62,186, 20,176,
- 61,104, 82,144, 62, 91,223,128, 62, 82, 95, 14, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,127,
- 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120, 62,181, 84,122, 63, 3, 28,248, 63, 0,188,188, 63, 41, 47,120, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111, 63, 0,188,190, 63,117, 84,102, 63, 38,207, 52, 63, 79, 65,236,
- 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63, 3, 28,248, 62, 82, 95, 14,
- 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32, 63, 0,188,185, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,207, 52, 63, 79, 65,236, 63, 0,188,188, 63, 41, 47,120, 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174, 63, 41, 47,116,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 62, 91,224, 32, 62, 82, 94,138, 61,135, 43, 48, 62,181, 84, 61,
-189,169,104,176, 63, 0,188,185, 61,135, 44, 96, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63, 3, 28,248,
- 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 76,225,174, 62,186, 21, 0, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63, 41, 47,116, 63,114,244, 42, 63, 3, 28,244, 63,140,131, 99,
- 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 0,188,185, 61,135, 44, 96,
- 63, 38,207,248,189,169,109,144, 63, 76,226,112, 61,135, 38, 64, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244,240,
- 62, 91,221, 4, 63,140,131,180, 62,186, 19,116, 63,114,244, 42, 63, 3, 28,244, 63, 76,225,174, 62,186, 21, 0, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102,
- 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128,
- 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160,
- 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,
-190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122,
- 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,
-189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188,
- 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242,
- 62, 82, 95, 26, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,190,118,127, 56,
- 63, 3, 28,220,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,200, 63, 79, 65,244,189,188,105, 96, 63, 41, 47,120,189,188,105, 96,
- 63, 41, 47,120, 61,104, 84,200, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236,
- 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 63, 38,207, 56, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188,
- 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111,
- 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44,
- 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173,
- 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52,
- 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,174, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,190, 63,160,188,171, 63, 0,188,188,
- 63,160,188,173, 63, 38,207, 52, 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,162, 63, 3, 28,210,
- 63,140,131, 99, 63, 41, 47, 72, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99,
- 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76,
- 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99,
- 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76,
- 63,159,140,244, 63, 3, 28, 50, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63,158,151,226,
- 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 27,168,248, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,176, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,224,
- 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 21, 59, 93,211, 96,
- 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 63, 27,168,247,
- 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96,
- 63,131,172, 21, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,142,
- 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63,185,131,174, 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96,
- 63,185,131,174, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63, 81,128,149,
- 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96, 63,131,172, 24, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 63, 27,168,251, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63,158,151,225, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,131,172, 22,
- 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 81,128,146, 59, 93,211, 96,
- 63, 27,168,250, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,244,
- 63, 3, 28, 50, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236,
- 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,161,
- 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236,
- 63,140,131, 99, 63, 41, 47, 76, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,159,140,162, 63, 3, 28,210, 63,140,131, 99,
- 63, 41, 47, 72, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,207, 52, 63,141,179,111, 63, 0,188,190, 63,160,188,171, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,174,
- 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102,
- 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52,
- 63,141,179,111, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102,
- 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 76,225,172,
- 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 63, 38,207, 56, 63,141,179,111, 63, 38,207, 52, 63,141,179,111,
- 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172,
- 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 61,104, 84,200, 63, 79, 65,244,189,188,105, 96, 63, 41, 47,120,189,188,105, 96, 63, 41, 47,120, 61,104, 84,200, 63, 79, 65,242,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26,
- 63,117, 84,102, 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,
-190,118,127, 56, 63, 3, 28,220,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26,
- 63,117, 84,102, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113,
- 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160,
- 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0,
- 60, 0, 0, 1, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102,
- 62,181, 84,122, 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64,
- 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0,
- 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,
- 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122,
- 63,141,179,113, 63, 0,188,188, 63,160,188,173, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,
-189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242, 0, 0, 0, 0, 60, 0, 0, 1,
- 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122,
- 63,141,179,113, 0, 0, 0, 0, 60, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 4,160, 5, 32,138, 32, 0, 0, 0, 57,
- 0, 0, 1, 40,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 68, 65, 84, 65, 0, 0, 17, 88, 5, 30, 70, 32, 0, 0, 0, 51, 0, 0, 0, 74, 0, 0, 0, 0, 61,104, 84,160,
- 63, 79, 65,242,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 3, 29, 0, 62, 82, 95, 26, 63, 41, 47,120,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,127, 63, 79, 65,242, 63, 0,188,190, 63,117, 84,102,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,104, 84,160, 63, 3, 29, 0,189,188,106,128,
- 62,186, 20,176, 61,104, 82,144, 62, 91,223,128, 62, 82, 95, 14, 62,186, 21, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,127, 63, 79, 65,242, 62, 82, 95, 26, 63, 41, 47,120,
- 62,181, 84,122, 63, 3, 28,248, 63, 0,188,188, 63, 41, 47,120,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,207, 56, 63,141,179,111, 63, 0,188,190, 63,117, 84,102, 63, 38,207, 52,
- 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122, 63, 3, 28,248, 62, 82, 95, 14, 62,186, 21, 0, 62,181, 84,122, 62, 91,224, 32,
- 63, 0,188,185, 62,186, 21, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,207, 52, 63, 79, 65,236, 63, 0,188,188, 63, 41, 47,120, 63, 38,207, 52, 63, 3, 28,248, 63, 76,225,174,
- 63, 41, 47,116,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,181, 84,122, 62, 91,224, 32, 62, 82, 94,138, 61,135, 43, 48, 62,181, 84, 61,189,169,104,176, 63, 0,188,185, 61,135, 44, 96,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,207, 52,
- 63, 3, 28,248, 63, 0,188,185, 62,186, 21, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 76,225,174, 62,186, 21, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236,
- 63, 76,225,174, 63, 41, 47,116, 63,114,244, 42, 63, 3, 28,244, 63,140,131, 99, 63, 41, 47, 76,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,207, 51, 62, 91,224, 24, 63, 0,188,185,
- 61,135, 44, 96, 63, 38,207,248,189,169,109,144, 63, 76,226,112, 61,135, 38, 64,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244,240, 62, 91,221, 4, 63,140,131,180, 62,186, 19,116,
- 63,114,244, 42, 63, 3, 28,244, 63, 76,225,174, 62,186, 21, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26,
- 63,117, 84,102, 62,181, 84,122, 63,141,179,113,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120,
- 61,104, 84,160, 63, 79, 65,242,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188,
- 63,160,188,173,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,188,105,128,
- 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128,
- 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113,
- 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,200, 63, 79, 65,242, 61,104, 84,160,
- 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,189,188,105, 96, 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 64, 63, 3, 28,216,
-189,188,105,128, 63, 41, 47,120,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122,
- 63,141,179,113,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,104, 84,200, 63, 79, 65,244,189,188,105, 96, 63, 41, 47,120,189,188,105, 96, 63, 41, 47,120, 61,104, 84,200, 63, 79, 65,242,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244, 44,
- 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173,
- 63, 38,207, 56, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52,
- 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102,
- 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,188, 63,160,188,173, 63, 0,188,188,
- 63,160,188,173, 63, 38,207, 52, 63,141,179,111,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,225,174, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111,
- 63, 76,225,172, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,174, 63,117, 84,102, 63,114,244, 44,
- 63, 79, 65,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 38,207, 52, 63,141,179,111, 63, 0,188,190, 63,160,188,171, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,159,140,162,
- 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 72, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76,
- 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99,
- 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236,
- 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99,
- 63, 41, 47, 76, 63,159,140,244, 63, 3, 28, 50,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96,
- 63,131,172, 22, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 81,128,144, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96, 63, 27,168,248, 59, 93,211, 96, 63, 81,128,144,
- 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,185,131,176, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96, 63,158,151,224, 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,131,172, 21,
- 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 27,168,247, 59, 93,211, 96,
- 62,203,162, 85, 59, 93,211, 96, 62,203,162, 85, 59, 93,211, 96, 63, 27,168,247, 59, 93,211, 96,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,158,151,226, 59, 93,211, 96, 63,131,172, 24,
- 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,158,151,226, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 81,128,142, 59, 93,211, 96, 63, 27,168,246, 59, 93,211, 96,
- 63, 27,168,247, 59, 93,211, 96, 63, 81,128,144, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,185,131,174, 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96, 63,158,151,226,
- 59, 93,211, 96, 63,185,131,174, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,131,172, 22, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96, 63, 81,128,142, 59, 93,211, 96,
- 63,131,172, 24, 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 27,168,251, 59, 93,211, 96, 62,203,162, 84, 59, 93,211, 96, 62,203,162, 86, 59, 93,211, 96, 63, 27,168,246,
- 59, 93,211, 96,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,158,151,225, 59, 93,211, 96, 63,131,172, 21, 59, 93,211, 96, 63,131,172, 22, 59, 93,211, 96, 63,158,151,227, 59, 93,211, 96,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 81,128,146,
- 59, 93,211, 96, 63, 27,168,250, 59, 93,211, 96, 63, 27,168,251, 59, 93,211, 96, 63, 81,128,149, 59, 93,211, 96,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210,
- 63,140,131, 99, 63, 41, 47, 76, 63,140,131, 99, 63, 41, 47, 76, 63,159,140,244, 63, 3, 28, 50,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44,
- 63, 79, 65,236, 63,114,244, 44, 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,159,140,161, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 76,
- 63,140,131, 99, 63, 41, 47, 76, 63,159,140,161, 63, 3, 28,210,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,140,131, 99, 63, 41, 47, 76, 63,114,244, 44, 63, 79, 65,236, 63,114,244, 44,
- 63, 79, 65,236, 63,140,131, 99, 63, 41, 47, 76,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,159,140,162, 63, 3, 28,210, 63,140,131, 99, 63, 41, 47, 72, 63,140,131, 99, 63, 41, 47, 76,
- 63,159,140,161, 63, 3, 28,210,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111, 63, 0,188,190, 63,160,188,171, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52,
- 63,141,179,111,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,114,244, 44, 63, 79, 65,236, 63, 76,225,174, 63,117, 84,102, 63, 76,225,174, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,225,174,
- 63,117, 84,102, 63, 38,207, 52, 63,141,179,111, 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,207, 52, 63,141,179,111,
- 63, 0,188,188, 63,160,188,173, 63, 0,188,188, 63,160,188,173, 63, 38,207, 52, 63,141,179,111,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172,
- 63,117, 84,102, 63, 76,225,172, 63,117, 84,102, 63,114,244, 44, 63, 79, 65,236,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,225,172, 63,117, 84,102, 63, 38,207, 52, 63,141,179,111,
- 63, 38,207, 52, 63,141,179,111, 63, 76,225,172, 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 63, 38,207, 56, 63,141,179,111, 63, 38,207, 52,
- 63,141,179,111, 63, 0,188,188, 63,160,188,173,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,114,244, 44, 63, 79, 65,236, 63, 76,225,172, 63,117, 84,102, 63, 76,225,172, 63,117, 84,102,
- 63,114,244, 44, 63, 79, 65,236,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,104, 84,200, 63, 79, 65,244,189,188,105, 96, 63, 41, 47,120,189,188,105, 96, 63, 41, 47,120, 61,104, 84,200,
- 63, 79, 65,242,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,189,188,105, 96,
- 63, 41, 47,120,190,118,127, 56, 63, 3, 28,220,190,118,127, 64, 63, 3, 28,216,189,188,105,128, 63, 41, 47,120,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102,
- 61,104, 84,200, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26, 63,117, 84,102,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0,188,188, 63,160,188,173, 62,181, 84,122,
- 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,104, 84,160, 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,
-189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113, 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26,
- 63,117, 84,102, 62,181, 84,122, 63,141,179,113,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0,189,188,105,128, 63, 41, 47,120,190,118,127, 64, 63, 3, 28,216,190,118,127, 64, 63, 3, 28,216,
-189,188,105,128, 63, 41, 47,120,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 82, 95, 26, 63,117, 84,102, 61,104, 84,160, 63, 79, 65,242, 61,104, 84,160, 63, 79, 65,242, 62, 82, 95, 26,
- 63,117, 84,102,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 0,188,188, 63,160,188,173, 62,181, 84,122, 63,141,179,113, 62,181, 84,122, 63,141,179,113, 63, 0,188,188, 63,160,188,173,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,104, 84,160,
- 63, 79, 65,242,189,188,105,128, 63, 41, 47,120,189,188,105,128, 63, 41, 47,120, 61,104, 84,160, 63, 79, 65,242,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,181, 84,122, 63,141,179,113,
- 62, 82, 95, 26, 63,117, 84,102, 62, 82, 95, 26, 63,117, 84,102, 62,181, 84,122, 63,141,179,113,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 60, 0, 0, 1, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 1, 20, 2,236,218, 64, 0, 0, 0, 50,
- 0, 0, 0, 1, 2,236,228, 0, 2,236,213, 64, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 50, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,232,181, 64, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,219,128, 2,236,224,240, 2,236,225,192, 5, 30, 54, 32, 5, 15,188, 32,
- 2,236,222, 16, 0, 0, 0, 0, 2,236,227, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2,236,219,176, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 2,236,220,224, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 12, 0, 0, 0, 0, 2,236,223,192, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 23,
- 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 76,205, 4, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4,
- 2,236,219,128, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,219,176, 0, 0, 0,242,
- 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, 5, 15,188, 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, 68, 65, 84, 65, 0, 0, 1,204, 5, 15,188, 32, 0, 0, 0, 56, 0, 0, 0, 23,191, 76,205, 4,
- 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1,190,204,205, 55, 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1,
- 0, 0, 3, 1,182, 70, 0, 0, 52,128, 0, 0,190,204,204,224, 0, 0,128, 1, 0, 0, 3, 1,191, 76,205, 4, 0, 0, 0, 0,
- 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
-182, 70, 0, 0, 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213,
- 0, 0,128, 1, 0, 0, 3, 1,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205, 0, 0,128, 1, 0, 0, 3, 1,182, 70, 0, 0,
- 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 3, 1,190,204,205, 47, 0, 0, 0, 0, 63, 76,204,206, 0, 0,128, 1,
- 0, 0, 3, 1,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 3, 1,191, 76,205, 4, 0, 0, 0, 0,
-191, 76,204,208, 0, 0,128, 1, 0, 0, 3, 1,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1, 0, 0, 3, 1,
-182, 70, 0, 0, 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 62,204,205, 47,180,128, 0, 0,191, 76,204,206,
- 0, 0,128, 1, 0, 0, 3, 1, 63, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210, 0, 0,128, 1, 0, 0, 3, 1, 62,204,205, 53,
-180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 3, 1, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1,
- 0, 0, 3, 1, 62,204,205, 47,180,128, 0, 0, 62,204,204,221, 0, 0,128, 1, 0, 0, 3, 1, 63, 76,205, 0, 0, 0, 0, 0,
- 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 3, 1, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1, 0, 0, 3, 1,
- 63, 76,205, 0, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 3, 1, 62,204,205, 47,180,128, 0, 0,190,204,204,200,
- 0, 0,128, 1, 0, 0, 3, 1, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,220,224, 0, 0, 0,242, 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, 2,236,222, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 2,236,222, 16, 0, 0, 0, 53, 0, 0, 0, 32, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 35,
- 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 13,
- 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 0,
- 0, 0, 0, 11, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 35,
- 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 8,
- 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 4,
- 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0, 10, 0, 0, 0, 35,
- 0, 0, 0, 8, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0, 9, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0, 7,
- 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 0, 10, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 35, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 35,
- 0, 0, 0, 15, 0, 0, 0, 17, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 0, 20, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0, 20,
- 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 35, 0, 0, 0, 19,
- 0, 0, 0, 21, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0, 22, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,223,192,
- 0, 0, 0,242, 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, 2,236,224,240, 0, 0, 0, 5,
- 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 84,101,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, 2,236,225,192, 0, 0, 0, 6, 0, 0, 0, 64, 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,
- 2,236,227, 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, 68, 65, 84, 65, 0, 0, 0,160, 2,236,224,240, 0, 0, 0, 52, 0, 0, 0, 8,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 1,
- 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 7, 0, 0, 0, 6, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0, 10,
- 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 2, 0, 0, 0, 15, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 17,
- 0, 0, 0, 2, 0, 0, 0, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 21,
- 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 2, 0, 0, 0, 22, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 2,
- 68, 65, 84, 65, 0, 0, 1, 96, 2,236,225,192, 0, 0, 0, 60, 0, 0, 0, 8, 62,137,192, 12, 63,125,226,162, 61,246,108,144,
- 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144,
- 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,229, 0, 63,125,226,162,
- 62,137,192, 18, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63, 55, 23,154, 63,125,226,162, 63, 17, 5, 34, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162,
- 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30,
- 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0,128, 2,236,227, 80,
- 0, 0, 0, 57, 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 68, 65, 84, 65, 0, 0, 1,224, 5, 30, 54, 32, 0, 0, 0, 51, 0, 0, 0, 8, 0, 0, 0, 0,
- 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,213,228,252,
- 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,213,229, 0, 63,125,226,162, 62,137,192, 18,
- 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 55, 23,154, 63,125,226,162, 63, 17, 5, 34, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252,
- 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 63, 55, 23,152, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 17, 5, 30, 63,125,226,162, 62,213,228,252, 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30,
- 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 77, 69,
- 0, 0, 1, 20, 2,236,228, 0, 0, 0, 0, 50, 0, 0, 0, 1, 2,236,237,192, 2,236,218, 64, 1, 94, 44, 64, 0, 0, 0, 0,
- 77, 69, 80,108, 97,110,101, 46, 48, 48, 51, 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, 2,231, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,229, 64, 2,236,234,176,
- 2,236,235,128, 5, 30, 54, 32, 5, 15,190, 32, 2,236,231,208, 0, 0, 0, 0, 2,236,237, 16, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,229,112, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0,
- 2,236,230,160, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 2,236,233,128, 0, 0, 0, 3, 0, 0, 0, 5,
- 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
-180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,205, 2, 55, 39,197,172, 63, 76,204,214, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,236,229, 64, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 1, 4, 2,236,229,112, 0, 0, 0,242, 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,
- 5, 15,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, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 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,204, 5, 15,190, 32,
- 0, 0, 0, 56, 0, 0, 0, 23, 62,204,205, 47,180,128, 0, 0,190,204,204,200, 0, 0,128, 1, 0, 0, 2, 0, 63, 76,205, 0,
- 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0, 62,204,205, 47,180,128, 0, 0, 52,240, 0, 0, 0, 0,128, 1,
- 0, 0, 2, 0, 63, 76,205, 0, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0, 62,204,205, 47,180,128, 0, 0,
- 62,204,204,221, 0, 0,128, 1, 0, 0, 2, 0, 63, 76,205, 0, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0,
- 62,204,205, 53,180,128, 0, 0, 63, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0, 62,204,205, 47,180,128, 0, 0,191, 76,204,206,
- 0, 0,128, 1, 0, 0, 2, 0, 63, 76,205, 0, 0, 0, 0, 0,191, 76,204,208, 0, 0,128, 1, 0, 0, 2, 0,182, 70, 0, 0,
- 52,128, 0, 0,191, 76,204,214, 0, 0,128, 1, 0, 0, 2, 0,190,204,205, 55, 0, 0, 0, 0,191, 76,204,212, 0, 0,128, 1,
- 0, 0, 2, 0,182, 62, 0, 0, 52,128, 0, 0, 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0,190,204,205, 47, 0, 0, 0, 0,
- 63, 76,204,206, 0, 0,128, 1, 0, 0, 2, 0,191, 76,205, 4, 0, 0, 0, 0, 63, 76,204,210, 0, 0,128, 1, 0, 0, 2, 0,
-182, 70, 0, 0, 52,128, 0, 0, 62,204,204,197, 0, 0,128, 1, 0, 0, 2, 0,190,204,205, 55, 0, 0, 0, 0, 62,204,204,205,
- 0, 0,128, 1, 0, 0, 2, 0,191, 76,205, 4, 0, 0, 0, 0, 62,204,204,213, 0, 0,128, 1, 0, 0, 2, 0,182, 70, 0, 0,
- 52,128, 0, 0,180,144, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,190,204,205, 55, 0, 0, 0, 0,179, 0, 0, 0, 0, 0,128, 1,
- 0, 0, 2, 0,191, 76,205, 4, 0, 0, 0, 0, 52, 96, 0, 0, 0, 0,128, 1, 0, 0, 2, 0,182, 70, 0, 0, 52,128, 0, 0,
-190,204,204,224, 0, 0,128, 1, 0, 0, 2, 0,190,204,205, 55, 0, 0, 0, 0,190,204,204,216, 0, 0,128, 1, 0, 0, 2, 0,
-191, 76,205, 4, 0, 0, 0, 0,190,204,204,208, 0, 0,128, 1, 0, 0, 2, 0, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,230,160,
- 0, 0, 0,242, 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, 2,236,231,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 2,236,231,208, 0, 0, 0, 53, 0, 0, 0, 32,
- 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 1,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 34, 0, 0, 0, 2,
- 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 34, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 34,
- 0, 0, 0, 4, 0, 0, 0, 6, 0, 0, 0, 34, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 10,
- 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 13, 0, 0, 0, 34, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 15,
- 0, 0, 0, 16, 0, 0, 0, 34, 0, 0, 0, 12, 0, 0, 0, 15, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 34,
- 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 34, 0, 0, 0, 15, 0, 0, 0, 18,
- 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 18, 0, 0, 0, 34, 0, 0, 0, 14, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 19,
- 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 21, 0, 0, 0, 22, 0, 0, 0, 34, 0, 0, 0, 18, 0, 0, 0, 21, 0, 0, 0, 34,
- 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0, 34, 0, 0, 0, 17, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 10, 0, 0, 0, 21,
- 0, 0, 0, 34, 0, 0, 0, 9, 0, 0, 0, 20, 0, 0, 0, 34, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 34, 0, 0, 0, 4,
- 0, 0, 0, 14, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 34,
- 68, 65, 84, 65, 0, 0, 1, 4, 2,236,233,128, 0, 0, 0,242, 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, 2,236,234,176, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 84,101,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, 2,236,235,128, 0, 0, 0, 6,
- 0, 0, 0, 64, 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, 2,236,237, 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,160,
- 2,236,234,176, 0, 0, 0, 52, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0,
- 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2,
- 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12,
- 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17,
- 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21,
- 0, 0, 0, 10, 0, 0, 0, 9, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 1, 96, 2,236,235,128, 0, 0, 0, 60, 0, 0, 0, 8,
- 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162,
- 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30,
- 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 63, 55, 23,152, 63,125,226,162,
- 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1,
- 0, 0, 0, 0, 63, 17, 5, 34, 63,125,226,162, 62,213,229, 0, 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30,
- 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 18, 63,125,226,162, 61,246,108,144, 63,125,226,162,
- 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252,
- 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0,
- 61, 0, 0, 1, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162,
- 62,137,192, 12, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12,
- 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162, 0, 0, 0, 0, 61, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0,128, 2,236,237, 16, 0, 0, 0, 57, 0, 0, 0, 32,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 68, 65, 84, 65, 0, 0, 1,224, 5, 30, 54, 32,
- 0, 0, 0, 51, 0, 0, 0, 8, 0, 0, 0, 0, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30,
- 63,125,226,162, 63, 55, 23,152, 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
- 62,213,228,252, 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 55, 23,152, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162, 63, 55, 23,152,
- 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 17, 5, 34, 63,125,226,162, 62,213,229, 0, 63,125,226,162, 62,213,228,252, 63,125,226,162, 63, 17, 5, 30, 63,125,226,162,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,137,192, 18,
- 63,125,226,162, 61,246,108,144, 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162,
- 62,137,192, 12, 63,125,226,162, 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,137,192, 12, 63,125,226,162, 61,246,108,144,
- 63,125,226,162, 61,246,108,144, 63,125,226,162, 62,137,192, 12, 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,213,228,252, 63,125,226,162, 62,137,192, 12, 63,125,226,162,
- 62,137,192, 12, 63,125,226,162, 62,213,228,252, 63,125,226,162,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 61, 0, 0, 1, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 1, 20, 2,236,237,192, 0, 0, 0, 50, 0, 0, 0, 1, 2,236,243,224,
- 2,236,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 52, 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, 2,236,239, 0, 2,236,243,160, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,240, 96, 2,236,242, 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, 2,236,239, 48, 0, 0, 0, 1,
- 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 2,236,240,224, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 2,236,242,112, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,179,128, 0, 0, 52, 64, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 2,
- 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, 30, 0, 4, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,236,239, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 2,236,194, 96, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,239, 48, 0, 0, 0,242, 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, 2,236,240, 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, 68, 65, 84, 65,204, 1, 0, 0,208,165,118, 1, 0, 0, 0, 0, 56, 0, 0, 0,
+ 23, 0, 0, 0, 4,205, 76,191, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 3, 1, 55,205,204,190, 0, 0, 0, 0,
+216,204,204,190, 0, 0, 1,128, 0, 0, 3, 1, 0, 0, 70,182, 0, 0,128, 52,224,204,204,190, 0, 0, 1,128, 0, 0, 3, 1,
+ 4,205, 76,191, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 3, 1, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179,
+ 0, 0, 1,128, 0, 0, 3, 1, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180, 0, 0, 1,128, 0, 0, 3, 1, 4,205, 76,191,
+ 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 3, 1, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128,
+ 0, 0, 3, 1, 0, 0, 70,182, 0, 0,128, 52,197,204,204, 62, 0, 0, 1,128, 0, 0, 3, 1, 47,205,204,190, 0, 0, 0, 0,
+206,204, 76, 63, 0, 0, 1,128, 0, 0, 3, 1, 0, 0, 62,182, 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 3, 1,
+ 4,205, 76,191, 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 3, 1, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191,
+ 0, 0, 1,128, 0, 0, 3, 1, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191, 0, 0, 1,128, 0, 0, 3, 1, 47,205,204, 62,
+ 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 3, 1, 4,205, 76, 63, 0, 0, 0, 0,210,204, 76, 63, 0, 0, 1,128,
+ 0, 0, 3, 1, 53,205,204, 62, 0, 0,128,180,214,204, 76, 63, 0, 0, 1,128, 0, 0, 3, 1, 0,205, 76, 63, 0, 0, 0, 0,
+213,204,204, 62, 0, 0, 1,128, 0, 0, 3, 1, 47,205,204, 62, 0, 0,128,180,221,204,204, 62, 0, 0, 1,128, 0, 0, 3, 1,
+ 0,205, 76, 63, 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 3, 1, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52,
+ 0, 0, 1,128, 0, 0, 3, 1, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190, 0, 0, 1,128, 0, 0, 3, 1, 47,205,204, 62,
+ 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 3, 1, 68, 65, 84, 65, 64, 1, 0, 0,224,167,118, 1, 0, 0, 0, 0,
+ 5, 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,
+ 96,169,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 2,236,240, 96, 0, 0, 0, 56, 0, 0, 0, 4, 63,128, 0, 0, 63,127,255,255, 0, 0, 0, 0,
- 0, 0, 0, 0,127,255, 3,255, 63,128, 0, 0,191,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,127,255, 3,255,191,128, 0, 1,
-191,127,255,253, 0, 0, 0, 0, 0, 0, 0, 0,127,255, 3,255,191,127,255,250, 63,128, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
-127,255, 3,255, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,240,224, 0, 0, 0,242, 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, 2,236,242, 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, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 2,236,242, 16, 0, 0, 0, 53, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 35, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 35,
- 68, 65, 84, 65, 0, 0, 1, 4, 2,236,242,112, 0, 0, 0,242, 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, 2,236,243,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, 68, 65, 84, 65, 0, 0, 0, 20,
- 2,236,243,160, 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2,
- 0, 0, 77, 69, 0, 0, 1, 20, 2,236,243,224, 0, 0, 0, 50, 0, 0, 0, 1, 2,236,248,224, 2,236,237,192, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,119, 0, 0, 0, 0,112,104,101,114,101, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 2,235,212, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,245, 32,
- 8,108, 16, 32, 8,108,128, 32, 8,172, 96, 32, 5, 32,170, 32, 8,107,176, 32, 0, 0, 0, 0, 8,109, 96, 32, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,245, 80, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20,
- 0, 0, 0, 0, 2,236,246,128, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 2,236,247,176, 0, 0, 0, 3,
- 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 2,130, 0, 0, 7,128, 0, 0, 5, 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, 64,186,224,117, 64,187, 13, 91, 64,186,240,160, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,236,245, 32, 0, 0, 0, 0, 0, 0, 0, 1, 2,236,194, 96,
- 68, 65, 84, 65, 0, 0, 1, 4, 2,236,245, 80, 0, 0, 0,242, 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, 5, 32,170, 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, 68, 65, 84, 65, 0, 0, 50, 40,
- 5, 32,170, 32, 0, 0, 0, 56, 0, 0, 2,130,191,141,136, 28, 62,244,243, 12,192,183, 86,198,231,212, 10,117,130,191, 3,255,
-192,131,102,240, 64,119,183, 30,191,199,169,109,166, 58, 84,158,221,230, 3,255, 63,239,108,119, 64,156, 85,213,192, 40, 58,188,
- 40,228,106,207,198,137, 3,255, 64,146,135, 95,191, 14, 54, 63,192,102,194,241,100, 27,243,219,177, 45, 3,255, 62,141, 84,239,
-192,157,220, 16,192, 73, 2, 14, 6, 8,148, 39,187, 86, 3,255,192,162,239,132,192, 12,165,206,191,240, 45,150,144,175,207,245,
-214,251, 3,255,190,141, 84,239, 64,157,220, 16, 64, 73, 2, 14,249,248,107,217, 68,170, 3,255, 64,162,239,132, 64, 12,165,206,
- 63,240, 45,150,111, 81, 48, 11, 41, 5, 3,255, 64,131,102,240,192,119,183, 30, 63,199,169,109, 89,198,171, 98, 34, 26, 3,255,
-191,239,108,119,192,156, 85,213, 64, 40, 58,188,215, 28,149, 49, 57,119, 3,255,192,146,135, 95, 63, 14, 54, 63, 64,102,194,241,
-155,229, 12, 37, 78,211, 3,255, 63,141,136, 28,190,244,243, 12, 64,183, 86,198, 24, 44,245,139,125, 65, 3,255,192, 68, 17,114,
- 64, 35,153,226,192,137, 26,154,189, 6, 55,226,162, 85, 3,255, 62,230, 40,155, 64, 73,199,239,192,157, 52,176, 9,211, 68,237,
-148,153, 3,255,191,168, 55,124, 64,164,177,224,192, 29,144, 58,227, 69,112,132,202, 46, 3,255,192,105, 35, 94,191,129, 88,230,
-192,143, 14,195,176, 93,233,233,158, 68, 3,255,192,173, 2, 37, 63,123,187,137,192, 1, 68, 56,137,206, 21,127,211,216, 3,255,
- 64, 2,168,234,189, 57,158,231,192,175,149, 65, 44,162,255, 3,136, 11, 3,255, 64,114,159, 19, 64, 34,226,254,192,106,133,196,
- 82,225, 55,164,175,228, 3,255,190,249,176,105,192, 39,148, 21,192,166,214,217,245, 87,198,194,142, 5, 3,255, 64, 54,163,227,
-192, 78,121, 86,192,125,202, 22, 62, 99,185,120,169, 79, 3,255,192, 53, 40,241,192,134, 31,200,192, 60,188,229,194, 30,164, 94,
-191,136, 3,255,192,181,230, 96,191,119, 24, 33, 63,130, 26,174,131,186,234,231, 22, 56, 3,255,192,163, 93,103, 64, 38,128,136,
- 63,153,235, 83,144,100, 56,224, 26, 74, 3,255,192, 36,219,238, 64,165,151,132, 63,109,226,165,199,176,113, 33, 20, 80, 3,255,
- 63,111,237, 24, 64,184,174,118, 62,154, 34,212, 20,125,126, 44, 6,148, 3,255, 64,130,244,163, 64,133, 58,157,190,226, 95,125,
- 89,119, 91, 5,246, 86, 3,255, 64,181,230, 96, 63,119, 24, 33,191,130, 26,174,124, 70, 21, 25,233,200, 3,255, 64,163, 93,103,
-192, 38,128,136,191,153,235, 83,111,156,199, 32,229,182, 3,255, 64, 36,219,238,192,165,151,132,191,109,226,165, 56, 80,142,223,
-235,176, 3,255,191,111,237, 24,192,184,174,118,190,154, 34,212,235,131,129,212,249,108, 3,255,192,130,244,163,192,133, 58,157,
- 62,226, 95,125,166,137,164,251, 9,170, 3,255,192, 54,163,227, 64, 78,121, 86, 64,125,202, 22,193,157, 70,136, 86,177, 3,255,
- 64, 53, 40,241, 64,134, 31,200, 64, 60,188,229, 61,226, 91,162, 64,120, 3,255, 64,173, 2, 37,191,123,187,137, 64, 1, 68, 56,
-118, 50,234,129, 44, 40, 3,255, 63,168, 55,124,192,164,177,224, 64, 29,144, 58, 28,187,143,124, 53,210, 3,255,192,114,159, 19,
-192, 34,226,254, 64,106,133,196,173, 31,200, 92, 80, 28, 3,255,192, 2,168,234, 61, 57,158,231, 64,175,149, 65,211, 94, 0,253,
-119,245, 3,255, 62,249,176,105, 64, 39,148, 21, 64,166,214,217, 10,169, 57, 62,113,251, 3,255, 64,105, 35, 94, 63,129, 88,230,
- 64,143, 14,195, 79,163, 22, 23, 97,188, 3,255, 64, 68, 17,114,192, 35,153,226, 64,137, 26,154, 66,250,200, 30, 93,171, 3,255,
-190,230, 40,155,192, 73,199,239, 64,157, 52,176,246, 45,187, 19,107,103, 3,255,192, 10,178, 37, 63,201,231,138,192,166,143,149,
-209,129, 33,140,141,145, 3,255,192,110,132, 3, 64, 85,203,243,192, 66,107,151,174, 16, 73,158,190,209, 3,255,190,174,161,116,
- 63,241,152, 81,192,177, 2,110,247,217, 40, 15,134,182, 3,255, 63,154, 91,138, 64,133,179,218,192,122,222,209, 27, 0, 92, 30,
-171, 86, 3,255,192, 52, 82, 7, 64,149,252, 82,192, 5,202, 64,193, 39,101,227,210,181, 3,255, 62,148, 12,179, 64,166,221,251,
-192, 41, 87,188, 7,192,113,224,198, 21, 3,255,192, 29,246,216,190,141,156, 17,192,169,167,209,203, 47,250,160,139,137, 3,255,
-192,145, 72, 99,191,213,114, 79,192, 83, 35,183,156, 26,219, 3,185, 12, 3,255,192,158, 58,115, 64, 33,120,129,191,238, 41,198,
-148,126, 56,116,215,137, 3,255,192,174,158,118,191, 33,148,103,192, 1,156,140,136,218,240,198,211,203, 3,255, 62,249, 14, 55,
- 62,102,133, 95,192,186,143,210, 9, 56, 5, 40,128,113, 3,255, 64, 92, 61,220,190,159,230, 56,192,151, 61, 6, 76, 94,248,242,
-153,135, 3,255, 64, 60, 86, 7, 64,119, 48, 60,192, 81, 88, 93, 63,119, 85,124,184,246, 3,255, 64,139, 55,252, 63,132, 95, 62,
-192,113,216,225, 95,118, 21, 54,173,107, 3,255,191, 84, 6, 18,191,142, 96,251,192,182, 4, 76,237,158,233, 20,131,109, 3,255,
-189,225, 74,109,192,123, 54, 51,192,138,246, 34,253,241,169, 39,162, 1, 3,255, 64,119, 66,153,191,251,154,127,192,123,220,161,
- 85, 59,214, 59,170, 34, 3,255, 63,208, 59,201,192,135,182,241,192,108,101,212, 34,103,162,133,175,160, 3,255,191,169,246,161,
-192,151,196,235,192, 74,149,170,228, 95,151,253,186,184, 3,255,192,131,198, 33,192, 84,137,218,192, 32,134, 37,164,247,184, 77,
-201,167, 3,255,192,179, 61,176,191,210,110,138,190,228,220, 24,133,210,219,130,244,238, 3,255,192,170,182, 73,190, 90, 16,136,
- 64, 25,194, 90,139,224,252, 8, 53,174, 3,255,192,153, 55, 75, 64, 87, 78, 4,190, 62, 54, 12,151,200, 74, 29,250,179, 3,255,
-192,161, 19,235, 63,210, 12,207, 64, 31,242,210,146, 50, 34,244, 55,182, 3,255,192, 94, 75, 60, 64,150,115,189,190,167,211,186,
-179, 98,102, 49,247,183, 3,255,191,189,191,186, 64,168, 32, 63, 64, 7,100,213,224,161,114,191, 47, 61, 3,255, 63,186,205,242,
- 64,177, 65,141,191,154,219,127, 32, 82,120,177,228, 61, 3,255, 62,175,245, 99, 64,178, 12, 97, 63,228,253,255, 6,247,121, 65,
- 40, 98, 3,255, 64, 70, 92,226, 64,150,131, 8,191,204, 77,182, 66,193,103, 37,220, 32, 3,255, 64,152,194,200, 64, 83,155,180,
- 63, 62,217,154,104,207, 71,101, 17, 87, 3,255, 64,170,182, 73, 62, 90, 16,136,192, 25,194, 90,116, 32, 3,248,202, 82, 3,255,
- 64,179, 61,176, 63,210,110,138, 62,228,220, 24,122, 46, 36,126, 11, 18, 3,255, 64,161, 19,235,191,210, 12,207,192, 31,242,210,
-109,206,221, 12,200, 74, 3,255, 64,153, 55, 75,192, 87, 78, 4, 62, 62, 54, 12,104, 56,181,227, 5, 77, 3,255, 63,189,191,186,
-192,168, 32, 63,192, 7,100,213, 31, 95,141, 65,208,195, 3,255, 64, 94, 75, 60,192,150,115,189, 62,167,211,186, 76,158,153,207,
- 8, 73, 3,255,190,175,245, 99,192,178, 12, 97,191,228,253,255,249, 9,134,191,215,158, 3,255,191,186,205,242,192,177, 65,141,
- 63,154,219,127,223,174,135, 79, 27,195, 3,255,192,152,194,200,192, 83,155,180,191, 62,217,154,151, 49,184,155,238,169, 3,255,
-192, 70, 92,226,192,150,131, 8, 63,204, 77,182,189, 63,152,219, 35,224, 3,255,191,208, 59,201, 64,135,182,241, 64,108,101,212,
-221,153, 93,123, 80, 96, 3,255,192,119, 66,153, 63,251,154,127, 64,123,220,161,170,197, 41,197, 85,222, 3,255, 63,169,246,161,
- 64,151,196,235, 64, 74,149,170, 27,161,104, 3, 69, 72, 3,255, 64,131,198, 33, 64, 84,137,218, 64, 32,134, 37, 91, 9, 71,179,
- 54, 89, 3,255, 64,174,158,118, 63, 33,148,103, 64, 1,156,140,119, 38, 15, 58, 44, 53, 3,255, 64,158, 58,115,192, 33,120,129,
- 63,238, 41,198,107,130,199,140, 40,119, 3,255, 64, 52, 82, 7,192,149,252, 82, 64, 5,202, 64, 62,217,154, 29, 45, 75, 3,255,
-190,148, 12,179,192,166,221,251, 64, 41, 87,188,248, 64,142, 32, 57,235, 3,255,192, 60, 86, 7,192,119, 48, 60, 64, 81, 88, 93,
-192,137,170,132, 71, 10, 3,255,192,139, 55,252,191,132, 95, 62, 64,113,216,225,160,138,234,202, 82,149, 3,255,192, 92, 61,220,
- 62,159,230, 56, 64,151, 61, 6,179,162, 7, 14,102,121, 3,255,190,249, 14, 55,190,102,133, 95, 64,186,143,210,246,200,250,216,
-127,143, 3,255, 61,225, 74,109, 64,123, 54, 51, 64,138,246, 34, 2, 15, 86,217, 93,255, 3,255, 63, 84, 6, 18, 63,142, 96,251,
- 64,182, 4, 76, 18, 98, 22,236,124,147, 3,255, 64,145, 72, 99, 63,213,114, 79, 64, 83, 35,183, 99,230, 36,253, 70,244, 3,255,
- 64, 29,246,216, 62,141,156, 17, 64,169,167,209, 52,209, 5, 96,116,119, 3,255, 64,110,132, 3,192, 85,203,243, 64, 66,107,151,
- 81,240,182, 98, 65, 47, 3,255, 64, 10,178, 37,191,201,231,138, 64,166,143,149, 46,127,222,116,114,111, 3,255,191,154, 91,138,
-192,133,179,218, 64,122,222,209,229, 0,163,226, 84,170, 3,255, 62,174,161,116,191,241,152, 81, 64,177, 2,110, 8, 39,215,241,
-121, 74, 3,255,192, 19, 76, 36, 64,129,151, 25,192, 98,254,212,206,231, 88, 97,177,131, 3,255,191,175,232, 93, 64, 64, 23,177,
-192,154,186, 69,225,227, 66,235,151, 34, 3,255,190,232,190,208, 64,139,160, 93,192,120, 33,191,244,183, 94,205,170,192, 3,255,
-192,142,126,210, 63,238, 49, 43,192, 84, 30,112,158,187, 39, 95,182,183, 3,255,192, 97,165,138, 63, 80, 9, 92,192,147, 74, 20,
-177,183, 17,233,156, 86, 3,255,192,152, 61, 98,188,106, 63, 87,192, 90, 97, 6,152,127, 0,251,180,183, 3,255, 64, 14,173,200,
- 64, 63,183,155,192,144, 75,192, 48,206, 64, 45,156,152, 3,255, 63,167,162, 95, 63,209, 29,144,192,174,245, 25, 29,250, 36, 75,
-136,250, 3,255, 64, 68, 62,211, 63,168, 56, 51,192,153,245, 13, 65,241, 29,192,150,106, 3,255, 64, 36,182, 33,191,220, 38, 34,
-192,159, 5,150, 54,233,217,211,146,223, 3,255, 63, 81, 34, 16,191,179, 64,129,192,180, 5,162, 18,242,224, 93,133,111, 3,255,
- 63,159, 56,212,192, 68,166,172,192,154,108,212, 27,176,190, 32,149,208, 3,255,191,223, 76,204,192,101, 32,170,192,137, 83, 65,
-216,199,178,195,161,198, 3,255,192, 10,249,249,191,244, 52, 62,192,162,236, 25,208, 9,213, 0,145,102, 3,255,192, 89,207, 42,
-192, 47, 6,251,192,121,165, 27,182,209,196, 18,169,198, 3,255,192,176,215,137, 63,241, 62, 25,190,219,254,179,134,179, 39,232,
-247, 78, 3,255,192,186,150, 28, 60, 28, 16,150,191, 7, 9,191,128,118, 1,131,245, 77, 3,255,192,181,132, 34, 63, 92, 60, 99,
- 63,149, 81,217,131,181, 18,238, 23,252, 3,255,190, 74,242,175, 64,183,173,164,191,145,105,227,250,117,125,160,232, 31, 3,255,
-192, 2,227,219, 64,173,164, 96,191, 78, 71,200,212,164,119, 52,238,226, 3,255,191, 92,140,181, 64,184, 38, 75, 63, 37,148,176,
-236,224,125,237, 12,159, 3,255, 64,159,104, 75, 63,236, 56,212,192, 29,126,240,108,211, 41,166,203, 9, 3,255, 64,132,159,215,
- 64, 97,184, 84,192, 10, 44, 30, 91,176, 76, 19,209, 56, 3,255, 64,164,122, 95, 64, 44,143,199,191, 68, 78, 53,112, 17, 59, 17,
-237,185, 3,255, 64, 54,176,255,192,141, 84,243,192, 36,176,237, 63,192,160, 9,200, 63, 3,255, 64,133,229, 93,192, 68, 21,217,
-192, 45,226,157, 90,249,187,187,197, 78, 3,255, 64,129, 56,203,192,130,211, 21,191,143,115,187, 87,252,166,194,229,252, 3,255,
-192,104,239,189,192,140,142, 82,191,168,178,178,177,134,158,245,227,155, 3,255,191,253,141, 50,192,167,155, 52,191,218,181,170,
-211,125,141,166,219,155, 3,255,192, 41, 58,164,192,167, 34,172, 61,151,232,206,197,232,141,243, 0, 26, 3,255,192,133,229, 93,
- 64, 68, 21,217, 64, 45,226,157,165, 7, 68, 69, 58,178, 3,255,192,129, 56,203, 64,130,211, 21, 63,143,115,187,168, 4, 89, 62,
- 26, 4, 3,255,192, 54,176,255, 64,141, 84,243, 64, 36,176,237,192, 64, 95,247, 55,193, 3,255, 63,253,141, 50, 64,167,155, 52,
- 63,218,181,170, 44,131,114, 90, 36,101, 3,255, 64, 41, 58,164, 64,167, 34,172,189,151,232,206, 58, 24,114, 13,255,230, 3,255,
- 64,104,239,189, 64,140,142, 82, 63,168,178,178, 78,122, 97, 11, 28,101, 3,255, 64,186,150, 28,188, 28, 16,150, 63, 7, 9,191,
-127,138,254,125, 10,179, 3,255, 64,181,132, 34,191, 92, 60, 99,191,149, 81,217,124, 75,237, 18,232, 4, 3,255, 64,176,215,137,
-191,241, 62, 25, 62,219,254,179,121, 77,216, 24, 8,178, 3,255, 64, 2,227,219,192,173,164, 96, 63, 78, 71,200, 43, 92,136,204,
- 17, 30, 3,255, 63, 92,140,181,192,184, 38, 75,191, 37,148,176, 19, 32,130, 19,243, 97, 3,255, 62, 74,242,175,192,183,173,164,
- 63,145,105,227, 5,139,130, 96, 23,225, 3,255,192,132,159,215,192, 97,184, 84, 64, 10, 44, 30,164, 80,179,237, 46,200, 3,255,
-192,164,122, 95,192, 44,143,199, 63, 68, 78, 53,143,239,196,239, 18, 71, 3,255,192,159,104, 75,191,236, 56,212, 64, 29,126,240,
-147, 45,214, 90, 52,247, 3,255,191,159, 56,212, 64, 68,166,172, 64,154,108,212,228, 80, 65,224,106, 48, 3,255,192, 36,182, 33,
- 63,220, 38, 34, 64,159, 5,150,201, 23, 38, 45,109, 33, 3,255,191, 81, 34, 16, 63,179, 64,129, 64,180, 5,162,237, 14, 31,163,
-122,145, 3,255, 64, 89,207, 42, 64, 47, 6,251, 64,121,165, 27, 73, 47, 59,238, 86, 58, 3,255, 63,223, 76,208, 64,101, 32,170,
- 64,137, 83, 65, 39, 57, 77, 61, 94, 58, 3,255, 64, 10,249,249, 63,244, 52, 62, 64,162,236, 25, 47,247, 43, 0,110,154, 3,255,
- 64,142,126,210,191,238, 49, 43, 64, 84, 30,112, 97, 69,216,161, 73, 73, 3,255, 64,152, 61, 98, 60,106, 63, 87, 64, 90, 97, 6,
-103,129,255, 5, 75, 73, 3,255, 64, 97,165,138,191, 80, 9, 92, 64,147, 74, 20, 78, 73,238, 23, 99,170, 3,255, 62,232,190,208,
-192,139,160, 93, 64,120, 33,191, 11, 73,161, 51, 85, 64, 3,255, 64, 19, 76, 36,192,129,151, 25, 64, 98,254,212, 49, 25,167,159,
- 78,125, 3,255, 63,175,232, 93,192, 64, 23,177, 64,154,186, 69, 30, 29,189, 21,104,222, 3,255,192, 68, 62,211,191,168, 56, 51,
- 64,153,245, 13,190, 15,226, 64,105,150, 3,255,192, 14,173,200,192, 63,183,155, 64,144, 75,192,207, 50,191,211, 99,104, 3,255,
-191,167,162, 95,191,209, 29,144, 64,174,245, 25,226, 6,219,181,119, 6, 3,255,191,211,156,158, 63,132,228,185,192,176,207,190,
-220,164, 21,231,134,244, 3,255,192, 41, 76, 0, 64, 5,199,190,192,153,157, 83,198,146, 45, 75,150,246, 3,255,192,125, 83,204,
- 64,105, 55,169,192, 20,162,244,169, 72, 79,246,206, 82, 3,255,192, 91,215,178, 64, 62,235,222,192,108,254,190,180,215, 65, 87,
-175,155, 3,255,191, 59, 63,242, 63,152,237,210,192,182, 21,251,239,125, 25, 26,131,149, 3,255, 61, 94,230, 86, 64, 35, 30,198,
-192,169, 15,233, 0,238, 55, 52,140,135, 3,255, 63,199, 4,220, 64,146,145, 7,192, 83,186,104, 34,109,100,137,184,168, 3,255,
- 63, 86,120, 9, 64,109, 91,149,192,142,242, 79, 18,133, 81, 64,158,218, 3,255,192, 95,243,103, 64,138, 91,221,191,236, 15,186,
-178,170, 93,219,216, 25, 3,255,192, 5,206, 46, 64,159, 41,121,192, 19, 91,154,209,230,108, 96,205,226, 3,255, 63,139,200,169,
- 64,163, 78,198,192, 42,146,201, 24,247,111, 59,197,206, 3,255,191, 4,128,187, 64,167,181,206,192, 37, 92, 74,245, 57,114, 96,
-199,145, 3,255,191,231, 16,151, 61,209,166,160,192,178, 95,167,217,136, 2,196,133,245, 3,255,192, 69,200,163,191, 38,143,178,
-192,158, 48,148,188,243,242, 11,147,223, 3,255,192,155,192, 43,191,250, 6,151,192, 39, 82,170,149, 79,212,247,199,231, 3,255,
-192,132,118,233,191,173,111,217,192,123,122, 67,165,100,226, 58,170,165, 3,255,192,146, 85,238, 64, 78,205,178,191,221, 54, 70,
-156,183, 71,134,218,120, 3,255,192,167,137, 76, 63,227, 31,111,191,251, 57,158,141,234, 39, 54,213, 59, 3,255,192,170,143, 39,
-191,183, 15,167,191,252, 85,251,139,217,223,169,213, 13, 3,255,192,175,214, 8, 62, 53,124,177,192, 2,241,206,136, 23, 3, 89,
-211, 92, 3,255,190,160,160, 77, 62,182, 20, 9,192,186,232,108,248, 8, 7,241,128,128, 3,255, 63,163,144, 33, 61,186,144,151,
-192,183, 47, 50, 27, 97, 2, 19,130,252, 3,255, 64,129,179,222,190,224,147,234,192,134,180, 38, 89, 83,246, 64,164,218, 3,255,
- 64, 49,138,114,190, 57, 97,246,192,165, 76, 57, 60,250,251,247,143,138, 3,255, 64, 27,158,249, 64,141,118,197,192, 62,196, 58,
- 52, 90, 97, 70,191, 90, 3,255, 64, 89,244, 98, 64, 79,120, 8,192, 96,128, 65, 74, 8, 71, 39,179,151, 3,255, 64,144,100, 13,
- 62,118,214,200,192,110,205, 64, 98,182, 4, 37,174,161, 3,255, 64,131,202, 42, 63,231,161, 60,192,112,245,142, 90, 10, 38,255,
-173,209, 3,255,191,122, 51,149,190,163,151, 52,192,184,157, 15,234,118,250, 36,129,248, 3,255,191, 42,113, 5,191,241,112, 31,
-192,176,119, 15,241, 93,215, 84,135,135, 3,255, 61,172, 55, 60,192,143, 64, 22,192,113,246,164, 2, 27,157,132,174, 71, 3,255,
-190,154,173,167,192, 83,224,111,192,154,169,198,249,136,183, 89,150,211, 3,255, 64,136,133,151,191,162,249, 9,192,115,219,106,
- 93,175,229, 47,173, 3, 3,255, 64, 89,124,110,192, 40, 6,135,192,127,195,223, 74,120,199, 31,168,208, 3,255, 63,117,248,244,
-192,148, 90,109,192, 93, 0,123, 20, 8,154, 66,180,249, 3,255, 64, 17, 0,162,192,113,196, 63,192,119,239, 52, 49, 10,173, 64,
-171,144, 3,255,191, 7,217,162,192,156,117, 21,192, 75,238,222,245,139,149, 20,186,108, 3,255,192, 6,144,171,192,144,158,112,
-192, 69,241,198,210,156,157, 55,188,115, 3,255,192,148,238,110,192, 50,109,115,192, 13,197,187,153,170,195,231,208, 17, 3,255,
-192, 96,252, 79,192,115, 40,140,192, 48,165,116,178,226,173, 98,195,236, 3,255,192,172,228,100,191,248,128,217,191,150, 93, 8,
-138, 91,213, 53,229, 86, 3,255,192,182,171, 82,191,168,250,216, 62,147, 15, 15,131,122,226,250, 5,203, 3,255,192,160, 73,215,
- 62, 49,165,124, 64, 66, 85,232,147, 33, 4, 84, 67, 42, 3,255,192,178, 89,171,191, 24,115,192, 63,221,116, 78,134,129,243, 64,
- 38, 50, 3,255,192,143,206, 51, 64,105,250,133,191, 97,251,119,158, 85, 80, 53,235,193, 3,255,192,160, 32, 62, 64, 65, 38,163,
- 63, 3,117,164,146,236, 66, 24, 10,193, 3,255,192,155,108,216, 63,141,255, 59, 64, 69,117,189,150, 61, 23,119, 68, 42, 3,255,
-192,164, 27, 85, 64, 9, 78,244, 63,239,193, 87,144, 33, 46,128, 41, 73, 3,255,192,117, 35,134, 64,138,152, 39,191,116, 86, 73,
-171,230, 94, 2,234, 73, 3,255,192, 67,220, 35, 64,159,218, 6, 62,155,103,242,188,240,108,215, 6, 55, 3,255,191, 99, 79,130,
- 64,164,182,215, 64, 42, 4, 10,237,118,112, 50, 58,190, 3,255,192, 3, 86,161, 64,168,205, 14, 63,197, 55, 60,211,148,115, 31,
- 33,255, 3,255, 63,215,101,229, 64,168,141, 84,191,248, 90, 16, 37, 11,114,148,212,159, 3,255, 63,155, 52, 99, 64,183, 17,198,
-190,235,199,232, 26,159,124,192,245,120, 3,255, 61, 10,179,105, 64,169,185, 25, 64, 31,119,120, 0, 77,115,101, 55, 96, 3,255,
- 63, 37,198,143, 64,183,120,123, 63,135,108,160, 13,240,125, 8, 23,144, 3,255, 64, 32,174,180, 64,155, 13, 65,192, 8,167,238,
- 53,247,105,245,208,163, 3,255, 64,104,199, 69, 64,143,135,177,191,132, 12, 41, 79, 10, 98, 10,233, 31, 3,255, 64,159,134,121,
- 64, 49,245, 49, 63,169,166,210,109, 27, 59,242, 29,190, 3,255, 64,143,133, 52, 64,113,200,119, 62, 29,206,186, 98, 20, 82, 39,
- 3,190, 3,255, 64,160, 73,215,190, 49,165,124,192, 66, 85,232,108,223,251,172,188,214, 3,255, 64,178, 89,171, 63, 24,115,192,
-191,221,116, 78,121,127, 12,192,217,206, 3,255, 64,172,228,100, 63,248,128,217, 63,150, 93, 8,117,165, 42,203, 26,170, 3,255,
- 64,182,171, 82, 63,168,250,216,190,147, 15, 15,124,134, 29, 6,250, 53, 3,255, 64,155,108,216,191,141,255, 59,192, 69,117,189,
-105,195,232,137,187,214, 3,255, 64,164, 27, 85,192, 9, 78,244,191,239,193, 87,111,223,209,128,214,183, 3,255, 64,143,206, 51,
-192,105,250,133, 63, 97,251,119, 97,171,175,203, 20, 63, 3,255, 64,160, 32, 62,192, 65, 38,163,191, 3,117,164,109, 20,189,232,
-245, 63, 3,255, 63, 99, 79,130,192,164,182,215,192, 42, 4, 10, 18,138,143,206,197, 66, 3,255, 64, 3, 86,161,192,168,205, 14,
-191,197, 55, 60, 44,108,140,225,222, 1, 3,255, 64,117, 35,134,192,138,152, 39, 63,116, 86, 73, 84, 26,161,254, 21,183, 3,255,
- 64, 67,220, 35,192,159,218, 6,190,155,103,242, 67, 16,147, 41,249,201, 3,255,189, 10,179,105,192,169,185, 25,192, 31,119,120,
-255,179,140,155,200,160, 3,255,191, 37,198,143,192,183,120,123,191,135,108,160,242, 16,130,248,232,112, 3,255,191,215,101,229,
-192,168,141, 84, 63,248, 90, 16,218,245,141,108, 43, 97, 3,255,191,155, 52, 99,192,183, 17,198, 62,235,199,232,229, 97,131, 64,
- 10,136, 3,255,192,159,134,121,192, 49,245, 49,191,169,166,210,146,229,196, 14,226, 66, 3,255,192,143,133, 52,192,113,200,119,
-190, 29,206,186,157,236,173,217,252, 66, 3,255,192, 32,174,180,192,155, 13, 65, 64, 8,167,238,202, 9,150, 11, 47, 93, 3,255,
-192,104,199, 69,192,143,135,177, 63,132, 12, 41,176,246,157,246, 22,225, 3,255,191,117,248,244, 64,148, 90,109, 64, 93, 0,123,
-235,248,101,190, 75, 7, 3,255,192, 17, 0,162, 64,113,196, 63, 64,119,239, 52,206,246, 82,192, 84,112, 3,255,192,136,133,151,
- 63,162,249, 9, 64,115,219,106,162, 81, 26,209, 82,253, 3,255,192, 89,124,110, 64, 40, 6,135, 64,127,195,223,181,136, 56,225,
- 87, 48, 3,255, 63, 7,217,162, 64,156,117, 21, 64, 75,238,222, 10,117,106,236, 69,148, 3,255, 64, 6,144,171, 64,144,158,112,
- 64, 69,241,198, 45,100, 98,201, 67,141, 3,255, 64,148,238,110, 64, 50,109,115, 64, 13,197,187,102, 86, 60, 25, 47,239, 3,255,
- 64, 96,252, 79, 64,115, 40,140, 64, 48,165,116, 77, 30, 82,158, 60, 20, 3,255, 64,170,143, 39, 63,183, 15,167, 63,252, 85,251,
-116, 39, 32, 87, 42,243, 3,255, 64,175,214, 8,190, 53,124,177, 64, 2,241,206,119,233,252,167, 44,164, 3,255, 64,146, 85,238,
-192, 78,205,178, 63,221, 54, 70, 99, 73,184,122, 37,136, 3,255, 64,167,137, 76,191,227, 31,111, 63,251, 57,158,114, 22,216,202,
- 42,197, 3,255, 64, 95,243,103,192,138, 91,221, 63,236, 15,186, 77, 86,162, 37, 39,231, 3,255, 64, 5,206, 46,192,159, 41,121,
- 64, 19, 91,154, 46, 26,147,160, 50, 30, 3,255,191,139,200,169,192,163, 78,198, 64, 42,146,201,231, 9,144,197, 58, 50, 3,255,
- 63, 4,128,187,192,167,181,206, 64, 37, 92, 74, 10,199,141,160, 56,111, 3,255,192, 27,158,249,192,141,118,197, 64, 62,196, 58,
-203,166,158,186, 64,166, 3,255,192, 89,244, 98,192, 79,120, 8, 64, 96,128, 65,181,248,184,217, 76,105, 3,255,192,144,100, 13,
-190,118,214,200, 64,110,205, 64,157, 74,251,219, 81, 95, 3,255,192,131,202, 42,191,231,161, 60, 64,112,245,142,165,246,217, 1,
- 82, 47, 3,255,192,129,179,222, 62,224,147,234, 64,134,180, 38,166,173, 9,192, 91, 38, 3,255,192, 49,138,114, 62, 57, 97,246,
- 64,165, 76, 57,195, 6, 4, 9,112,118, 3,255, 62,160,160, 77,190,182, 20, 9, 64,186,232,108, 7,248,248, 15,127,128, 3,255,
-191,163,144, 33,189,186,144,151, 64,183, 47, 50,228,159,253,237,125, 4, 3,255,189,172, 55, 60, 64,143, 64, 22, 64,113,246,164,
-253,229, 98,124, 81,185, 3,255, 62,154,173,167, 64, 83,224,111, 64,154,169,198, 6,120, 72,167,105, 45, 3,255, 63,122, 51,149,
- 62,163,151, 52, 64,184,157, 15, 21,138, 5,220,126, 8, 3,255, 63, 42,113, 5, 63,241,112, 31, 64,176,119, 15, 14,163, 40,172,
-120,121, 3,255, 64,155,192, 43, 63,250, 6,151, 64, 39, 82,170,106,177, 43, 9, 56, 25, 3,255, 64,132,118,233, 63,173,111,217,
- 64,123,122, 67, 90,156, 29,198, 85, 91, 3,255, 63,231, 16,151,189,209,166,160, 64,178, 95,167, 38,120,253, 60,122, 11, 3,255,
- 64, 69,200,163, 63, 38,143,178, 64,158, 48,148, 67, 13, 13,245,108, 33, 3,255, 64,125, 83,204,192,105, 55,169, 64, 20,162,244,
- 86,184,176, 10, 49,174, 3,255, 64, 91,215,178,192, 62,235,222, 64,108,254,190, 75, 41,190,169, 80,101, 3,255, 63,211,156,158,
-191,132,228,185, 64,176,207,190, 35, 92,234, 25,121, 12, 3,255, 64, 41, 76, 0,192, 5,199,190, 64,153,157, 83, 57,110,210,181,
-105, 10, 3,255,191,199, 4,220,192,146,145, 7, 64, 83,186,104,221,147,155,119, 71, 88, 3,255,191, 86,120, 9,192,109, 91,149,
- 64,142,242, 79,237,123,174,192, 97, 38, 3,255, 63, 59, 63,242,191,152,237,210, 64,182, 21,251, 16,131,230,230,124,107, 3,255,
-189, 94,230, 86,192, 35, 30,198, 64,169, 15,233,255, 18,200,204,115,121, 3,255,192, 46, 27,208, 64, 86,104,124,192,126, 52, 85,
-197,137, 72,226,168,134, 3,255,191,234,168, 82, 64,149, 62, 87,192, 67, 12,118,217, 5,101,188,188,210, 3,255,192, 16, 10,186,
- 64, 52,106,249,192,147,253,210,206,182, 62,131,155,198, 3,255,190,240, 33, 93, 64, 71,199,191,192,158, 47,142,245,214, 69, 40,
-148,199, 3,255,187, 71, 46, 19, 64,115,240,194,192,142,166,175,254,240, 82,161,158, 66, 3,255,191,101,194,188, 64,154, 84, 17,
-192, 77,193,240,235, 76,104,214,185,142, 3,255,192,115,246,246, 64, 15, 86,183,192,118,168, 51,172,249, 47,229,171, 45, 3,255,
-192,160, 1,101, 63,184,146, 47,192, 45, 38,153,146,225, 30, 96,196,102, 3,255,192, 85,229,215, 63,218,178,166,192,144, 55,183,
-182, 38, 37,133,158,110, 3,255,192,104,178,151,189,205,107,245,192,147, 60,175,175,178,253,205,156, 91, 3,255,192,136, 81,192,
-191, 4,239, 55,192,127,222, 24,163,130,245,158,168, 35, 3,255,192,164,241, 70, 62,251,218,102,192, 48, 82,143,143,222, 11,210,
-195,110, 3,255, 63,173,230,209, 64, 71,135,231,192,152,234, 27, 29,148, 67, 4,151, 11, 3,255, 64, 67,103,158, 64, 51,206, 82,
-192,132,168, 39, 66,203, 60, 63,164,242, 3,255, 63,100,131,136, 64, 27, 95, 16,192,168,115, 4, 20,122, 53,138,141,143, 3,255,
- 63,217,154, 77, 63, 78, 69,185,192,177,196,221, 38, 53, 17,236,135, 42, 3,255, 64, 37,195,107, 63, 36,213, 4,192,167, 33, 20,
- 55,151, 14,194,141,168, 3,255, 64, 94,139,103, 63,250,146,153,192,137,141, 72, 75, 19, 43,156,161,245, 3,255, 64, 21,195,231,
-191,101, 58,236,192,169,178,218, 49,247,236, 31,139,218, 3,255, 64, 48, 32,142,192, 32,140,155,192,145, 1,195, 59, 3,200,178,
-156,204, 3,255, 63,185,155, 70,191, 59,202, 12,192,180, 86,163, 32,149,239, 73,133, 91, 3,255, 62, 43, 97, 29,192, 2,118,144,
-192,175,231,125, 4,106,210,160,136,103, 3,255, 62,196,116, 97,192, 56,176, 10,192,162,239,120, 8,164,194, 20,144, 81, 3,255,
- 64, 5, 2,185,192, 76,105,217,192,142,173,135, 45,218,187, 79,158, 56, 3,255,191,144,243,163,192, 73, 41,252,192,154, 66,148,
-230,134,188, 73,150,107, 3,255,192, 20,133,147,192,124, 55,234,192,107, 3,176,204,110,170,196,175,164, 3,255,192, 60,186, 42,
-191,189,128,219,192,155, 43, 23,191, 41,222,189,150,199, 3,255,191,172,164, 52,192, 18,240,106,192,167, 58,141,226, 76,204,213,
-142,128, 3,255,192,100,171, 12,191,243, 33,249,192,135,221,106,178,248,214,143,162,143, 3,255,192, 74, 78,195,192, 96,206,241,
-192, 94, 88, 98,188, 4,179, 34,179,129, 3,255,192,177,110, 41, 63,186, 30, 81,191,158,249,105,134,160, 30,165,229, 86, 3,255,
-192,172,138, 45, 64, 17,149,114, 62,200,203,127,137,251, 48,171, 9, 56, 3,255,192,182, 94, 10, 63, 1, 5, 48,191,165, 81, 86,
-131,156, 12, 24,228, 94, 3,255,192,186,224,117,190,247,234, 37, 62,126, 56,147,128,132,246,101, 6, 46, 3,255,192,184, 78,204,
-189, 89,193, 19, 63,141,163,187,130, 22,254,208, 22,241, 3,255,192,174,232,105, 63,224,187,151, 63,153,183,156,136,137, 38,137,
- 25, 3, 3,255,191, 68,118, 42, 64,176,173,101,191,233,132,114,238, 57,120,142,216,217, 3,255, 62,191,172, 81, 64,186,208, 67,
-190,216,163,195, 7, 75,127,131,247,159, 3,255,191,218, 2,113, 64,171,151,172,191,212, 25,114,219,243,117,116,220, 30, 3,255,
-192, 21,244,251, 64,172, 12, 28, 61,128,151, 13,205,229,117,196, 1,226, 3,255,191,223, 39, 51, 64,177, 94,248, 63, 76,122,104,
-217,155,121, 3, 16, 65, 3,255, 61, 28,208, 72, 64,187, 13, 91, 62,245,215, 64, 0,187,127,168, 9, 66, 3,255, 64,142, 93, 45,
- 64, 14,137, 70,192, 70,202,147, 96,241, 49,173,188,202, 3,255, 64,173, 23,106, 63,182,131,157,191,225,176,175,118, 7, 32, 20,
-218, 72, 3,255, 64,128,203, 78, 64, 69, 14,124,192, 61, 0, 55, 88,168, 66, 80,191,199, 3,255, 64,133,175,133, 64,121,149, 28,
-191,168,212, 51, 92, 4, 84, 86,227,170, 3,255, 64,149,211, 8, 64, 94,166, 84,191, 29, 24, 68,101,221, 76, 30,241,113, 3,255,
- 64,175,169, 31, 63,237,176,138,191,103,168, 15,119,152, 40,128,235, 11, 3,255, 64, 57, 78,122,192,120, 12,224,192, 84, 56, 7,
- 64, 62,171,247,183,239, 3,255, 64, 48, 74, 0,192,155,165,245,191,227, 87,208, 61, 38,150, 68,217,192, 3,255, 64,100,108, 85,
-192, 76, 47,115,192, 88,224,149, 77,102,185, 90,182,131, 3,255, 64,150,191,173,192, 55,233,227,191,254,101,198,102,121,192, 79,
-213, 73, 3,255, 64,148, 97,119,192, 89, 33,200,191,150,225, 24,101, 7,182, 44,229, 20, 3,255, 64, 86,171, 75,192,150, 83, 36,
-191,133, 36, 22, 72,220,153,131,232, 32, 3,255,192, 81,251,116,192,139, 80,115,192, 10,124, 57,185, 81,160, 53,208,254, 3,255,
-192,122,239, 70,192,138,220, 53,190,227, 86,113,171, 68,160,132,246,195, 3,255,192, 28, 50, 14,192,153, 4,245,192, 23, 39,141,
-201,187,151,215,205, 33, 3,255,191,189,123, 34,192,178,168,203,191,130,106,149,222,209,134, 63,234,158, 3,255,191,232,127,176,
-192,178,107,177,189,236,189, 47,216, 65,134,100,252, 66, 3,255,192, 90,168, 53,192,152, 83,169, 62,133,201,227,181, 29,152, 77,
- 4,136, 3,255,192,150,191,173, 64, 55,233,227, 63,254,101,198,153,135, 63,177, 42,183, 3,255,192,100,108, 85, 64, 76, 47,115,
- 64, 88,224,149,178,154, 70,166, 73,125, 3,255,192,148, 97,119, 64, 89, 33,200, 63,150,225, 24,154,249, 73,212, 26,236, 3,255,
-192, 86,171, 75, 64,150, 83, 36, 63,133, 36, 22,183, 36,102,125, 23,224, 3,255,192, 48, 74, 0, 64,155,165,245, 63,227, 87,208,
-194,218,105,188, 38, 64, 3,255,192, 57, 78,122, 64,120, 12,224, 64, 84, 56, 7,191,194, 84, 9, 72, 17, 3,255, 63,189,123, 34,
- 64,178,168,203, 63,130,106,149, 33, 47,121,193, 21, 98, 3,255, 64, 28, 50, 14, 64,153, 4,245, 64, 23, 39,141, 54, 69,104, 41,
- 50,223, 3,255, 63,232,127,176, 64,178,107,177, 61,236,189, 47, 39,191,121,156, 3,190, 3,255, 64, 90,168, 53, 64,152, 83,169,
-190,133,201,227, 74,227,103,179,251,120, 3,255, 64,122,239, 70, 64,138,220, 53, 62,227, 86,113, 84,188, 95,124, 9, 61, 3,255,
- 64, 81,251,116, 64,139, 80,115, 64, 10,124, 57, 70,175, 95,203, 47, 2, 3,255, 64,186,224,117, 62,247,234, 37,190,126, 56,147,
-127,124, 9,155,249,210, 3,255, 64,182, 94, 10,191, 1, 5, 48, 63,165, 81, 86,124,100,243,232, 27,162, 3,255, 64,184, 78,204,
- 61, 89,193, 19,191,141,163,187,125,234, 1, 48,233, 15, 3,255, 64,174,232,105,191,224,187,151,191,153,183,156,119,119,217,119,
-230,253, 3,255, 64,172,138, 45,192, 17,149,114,190,200,203,127,118, 5,207, 85,246,200, 3,255, 64,177,110, 41,191,186, 30, 81,
- 63,158,249,105,121, 96,225, 91, 26,170, 3,255, 64, 21,244,251,192,172, 12, 28,189,128,151, 13, 50, 27,138, 60,254, 30, 3,255,
- 63,218, 2,113,192,171,151,172, 63,212, 25,114, 36, 13,138,140, 35,226, 3,255, 63,223, 39, 51,192,177, 94,248,191, 76,122,104,
- 38,101,134,253,239,191, 3,255,189, 28,208, 72,192,187, 13, 91,190,245,215, 64,255, 69,128, 88,246,190, 3,255,190,191,172, 81,
-192,186,208, 67, 62,216,163,195,248,181,128,125, 8, 97, 3,255, 63, 68,118, 42,192,176,173,101, 63,233,132,114, 17,199,135,114,
- 39, 39, 3,255,192,133,175,133,192,121,149, 28, 63,168,212, 51,163,252,171,170, 28, 86, 3,255,192,128,203, 78,192, 69, 14,124,
- 64, 61, 0, 55,167, 88,189,176, 64, 57, 3,255,192,175,169, 31,191,237,176,138, 63,103,168, 15,136,104,215,128, 20,245, 3,255,
-192,149,211, 8,192, 94,166, 84, 63, 29, 24, 68,154, 35,179,226, 14,143, 3,255,192,173, 23,106,191,182,131,157, 63,225,176,175,
-137,249,223,236, 37,184, 3,255,192,142, 93, 45,192, 14,137, 70, 64, 70,202,147,159, 15,206, 83, 67, 54, 3,255,192, 5, 2,185,
- 64, 76,105,217, 64,142,173,135,210, 38, 68,177, 97,200, 3,255,190,196,116, 97, 64, 56,176, 10, 64,162,239,120,247, 92, 61,236,
-111,175, 3,255,192, 48, 32,142, 64, 32,140,155, 64,145, 1,195,196,253, 55, 78, 99, 52, 3,255,192, 21,195,231, 63,101, 58,236,
- 64,169,178,218,206, 9, 19,225,116, 38, 3,255,191,185,155, 70, 63, 59,202, 12, 64,180, 86,163,223,107, 16,183,122,165, 3,255,
-190, 43, 97, 29, 64, 2,118,144, 64,175,231,125,251,150, 45, 96,119,153, 3,255, 64, 74, 78,195, 64, 96,206,241, 64, 94, 88, 98,
- 67,252, 76,222, 76,127, 3,255, 64,100,171, 12, 63,243, 33,249, 64,135,221,106, 77, 8, 41,113, 93,113, 3,255, 64, 20,133,147,
- 64,124, 55,234, 64,107, 3,176, 51,146, 85, 60, 80, 92, 3,255, 63,144,243,164, 64, 73, 41,252, 64,154, 66,148, 25,122, 67,183,
-105,149, 3,255, 63,172,164, 52, 64, 18,240,106, 64,167, 58,141, 29,180, 51, 43,113,128, 3,255, 64, 60,186, 42, 63,189,128,219,
- 64,155, 43, 23, 64,215, 33, 67,105, 57, 3,255, 64,160, 1,101,191,184,146, 47, 64, 45, 38,153,109, 31,225,160, 59,154, 3,255,
- 64,115,246,246,192, 15, 86,183, 64,118,168, 51, 83, 7,208, 27, 84,211, 3,255, 64,164,241, 70,190,251,218,102, 64, 48, 82,143,
-112, 34,244, 46, 60,146, 3,255, 64,136, 81,192, 63, 4,239, 55, 64,127,222, 24, 92,126, 10, 98, 87,221, 3,255, 64,104,178,151,
- 61,205,107,245, 64,147, 60,175, 80, 78, 2, 51, 99,165, 3,255, 64, 85,229,215,191,218,178,166, 64,144, 55,183, 73,218,218,123,
- 97,146, 3,255, 63,101,194,188,192,154, 84, 17, 64, 77,193,240, 20,180,151, 42, 70,114, 3,255, 59, 71, 46, 19,192,115,240,194,
- 64,142,166,175, 1, 16,173, 95, 97,190, 3,255, 63,234,168, 82,192,149, 62, 87, 64, 67, 12,118, 38,251,154, 68, 67, 46, 3,255,
- 64, 46, 27,208,192, 86,104,124, 64,126, 52, 85, 58,119,183, 30, 87,122, 3,255, 64, 16, 10,186,192, 52,106,249, 64,147,253,210,
- 49, 74,193,125,100, 58, 3,255, 62,240, 33, 93,192, 71,199,191, 64,158, 47,142, 10, 42,186,216,107, 57, 3,255,192, 94,139,103,
-191,250,146,153, 64,137,141, 72,180,237,212,100, 94, 11, 3,255,192, 37,195,107,191, 36,213, 4, 64,167, 33, 20,200,105,241, 62,
-114, 88, 3,255,192, 67,103,158,192, 51,206, 82, 64,132,168, 39,189, 53,195,193, 91, 14, 3,255,191,173,230,209,192, 71,135,231,
- 64,152,234, 27,226,108,188,252,104,245, 3,255,191,217,154, 77,191, 78, 69,185, 64,177,196,221,217,203,238, 20,120,214, 3,255,
-191,100,131,136,192, 27, 95, 16, 64,168,115, 4,235,134,202,118,114,113, 3,255,192, 37,220,139, 64,141,135,245,192, 54,173,114,
-199, 45, 96, 95,193,211, 3,255,192, 84,119,204, 64,130, 73, 93,192, 38,107,212,183, 58, 88,223,199,137, 3,255,192, 67, 76,208,
- 64,111,120, 62,192, 85, 89, 14,189, 80, 81,196,183,140, 3,255,191,238,147, 68, 64,100,230,166,192,136, 9,234,215,216, 78,130,
-163, 59, 3,255,191,109,149, 30, 64,111, 18, 40,192,141,100,171,235, 37, 81,201,159,199, 3,255,191,178,237,144, 64,136,136, 25,
-192,113, 1,121,225,117, 92,189,173, 62, 3,255, 63, 66, 82,214, 64,152,115,128,192, 85, 25,164, 16,241,104, 27,183,126, 3,255,
-189,171,155,119, 64,155, 40,138,192, 83, 96,113,254,128,105,196,183,238, 3,255, 62,194,138, 67, 64,138, 97,177,192,124,158, 75,
- 8,112, 94,134,170, 29, 3,255,191, 94,106,158, 64, 30,106,167,192,167,240,254,236,229, 53,187,141,105, 3,255,191,229,114, 22,
- 64, 20, 96,193,192,162,167,253,217, 22, 50, 93,144,244, 3,255,191,162,210, 45, 63,224,211,233,192,174, 67,184,228, 69, 37,245,
-136,244, 3,255,192,152, 61, 37, 64, 14, 9,230,192, 39,179,137,152, 85, 48,183,198,226, 3,255,192,140,187,232, 64, 62, 96, 6,
-192, 30,247,107,160, 7, 65, 68,202, 11, 3,255,192,132,134,116, 64, 40,130, 40,192, 77,207,237,165,139, 57,149,186, 30, 3,255,
-192,129,129, 12, 63,173,129,231,192,128,125,159,167, 62, 29, 15,168,123, 3,255,192,134,112,254, 62,207,146,126,192,130, 19,159,
-164, 15, 9,119,167,117, 3,255,192,149,121,189, 63,111,192,142,192, 90, 95, 76,154, 95, 20,107,180,236, 3,255,192,162, 65, 12,
-191,149, 84, 11,192, 44,202,172,145, 60,230, 47,197, 75, 3,255,192,165,120, 74,190,167, 78, 95,192, 48, 51,139,143, 54,248,140,
-195,244, 3,255,192,150,161, 61,191, 89,221,107,192, 89,113,118,153, 40,237, 79,182, 35, 3,255,192, 66, 56, 52, 62,139, 40,206,
-192,160,116, 21,190, 13, 6, 19,146,121, 3,255,192, 56,120,245, 63,154,213,118,192,158,227, 81,193, 81, 26, 47,147,133, 3,255,
-192, 22,104,220, 63, 40,221,204,192,170,137,115,205, 16, 14, 89,139,117, 3,255, 64, 39,143,145, 64, 94, 49,190,192,124, 27,165,
- 56,238, 75,252,170, 43, 3,255, 64, 6,168,130, 64,130,132,190,192,105, 96, 12, 45,226, 89, 91,176,173, 3,255, 63,222,169, 76,
- 64,104,107,205,192,136,142,150, 38, 23, 79,105,163, 33, 3,255, 63,229,207,137, 64, 22, 63, 30,192,161,235,207, 39,198, 50,227,
-145,127, 3,255, 64, 14, 11,239, 63,191,114,175,192,166,208,254, 48,133, 33, 81,142, 87, 3,255, 64, 43,222,239, 64, 11,226,212,
-192,151, 71,227, 58, 33, 47,140,152, 91, 3,255, 64,124,245, 0, 62,187, 32, 27,192,138, 6, 57, 86,138, 7,176,162, 2, 3,255,
- 64,112, 75, 42, 63,152, 42,228,192,139, 44, 25, 82, 0, 25,159,161, 31, 3,255, 64, 82,218,178, 63, 1,247,178,192,154,129,211,
- 72, 35, 11, 4,150,217, 3,255, 63,104,203,208, 63,113, 6,146,192,183, 5,108, 19,132, 20,150,131, 49, 3,255, 62,251, 68, 26,
- 63,228, 38,111,192,178, 48,114, 10,139, 38,158,134,109, 3,255, 61,149, 78,163, 63,137, 25, 65,192,184,102,234, 1, 54, 23, 52,
-130, 34, 3,255, 64, 80,140, 98,191,238,205,169,192,144, 69, 83, 71, 70,215,145,157,173, 3,255, 64,109, 39,177,191,147,213,155,
-192,140,143,238, 81, 57,230,247,160, 77, 3,255, 64, 66,225,100,191,131,191,146,192,157, 18,152, 66,178,233,128,149, 25, 3,255,
- 63,220, 24,190,191,202,163,163,192,171,244,160, 37, 99,220,199,138,196, 3,255, 63,133,219,227,192, 17, 47,172,192,169,160, 93,
- 23,126,206,164,140, 68, 3,255, 63,247,202, 46,192, 27,140, 23,192,158,252,116, 41,217,203, 77,147, 32, 3,255, 63, 68,220, 36,
-192,132,143, 24,192,130,105, 20, 16,163,165, 66,167, 72, 3,255, 63,185,255, 60,192,108,244,215,192,138, 7,129, 31,113,175, 11,
-161,251, 3,255, 63, 19, 18,220,192, 98,186,168,192,148,136, 66, 12,155,178,121,154,241, 3,255,187,172,119,131,191,162,209,182,
-192,183, 73,170,255,209,228,144,130,251, 3,255, 63, 40,230,165,191, 24,111,246,192,185,150, 50, 14, 19,243, 18,129,113, 3,255,
-190, 50, 45,123,190,230, 16,213,192,186,240,160,251,231,246,124,128,109, 3,255,191,199, 22,221,192,134,211, 71,192,113,161, 37,
-222, 98,163,255,173,157, 3,255,191, 58,131,171,192,140,178, 57,192,115,174,214,240,105,159,201,173, 11, 3,255,191,112,119,228,
-192,115, 46, 49,192,139,222,186,235,152,172,221,160,217, 3,255,191,254, 75,122,192, 50, 36, 18,192,152, 70, 84,211,253,195, 46,
-152, 87, 3,255,192, 52,239,190,192, 22,186,193,192,145,240,166,194,167,204, 3,156,108, 3,255,192, 39, 23, 51,192, 76,245, 14,
-192,132,248,105,199, 29,186,137,164,200, 3,255,192,140,137,202,192, 33,234, 4,192, 60,117,152,159,215,200,216,192, 6, 3,255,
-192,115,176, 68,192, 68, 49, 85,192, 79,173, 65,172,178,189, 81,185, 81, 3,255,192,128,173,131,192, 14,170, 50,192,105, 71,247,
-168, 30,207, 64,176,189, 3,255,192, 22, 80,230,191,141,155, 50,192,168, 95,108,205, 3,232, 6,141, 19, 3,255,191,194,113, 96,
-191,195,184,166,192,174,160, 31,222,205,222,245,136,227, 3,255,191,213,244,249,191, 52, 33, 10,192,178, 94,248,219,172,241, 3,
-134, 48, 3,255,192,167, 26, 30, 64, 42, 11, 62,190,159,163,199,142, 45, 58, 26,248,236, 3,255,192,157,242, 15, 64, 63, 35,177,
-191,132,230,242,148,115, 65,134,233, 39, 3,255,192,169,163, 58, 64, 14,207,184,191,148, 92, 43,140,122, 48,250,230,193, 3,255,
-192,184, 83,241, 63,117,241, 33,190,248, 69,204,130, 32, 20,245,246, 22, 3,255,192,186,178, 88, 62,226, 33,180, 62,165,211, 69,
-128,153, 10, 65, 6,196, 3,255,192,181,194,100, 63,178, 37,227, 62,191, 51, 65,131,199, 29,217, 7,201, 3,255,192,168, 68,140,
- 63, 57,100,162, 64, 31, 41, 90,141, 91, 15,195, 54,175, 3,255,192,173,114,185, 63,162, 11,147, 63,237,131,136,137,204, 27,106,
- 40,187, 3,255,192,178, 82, 90, 62,168, 0,181, 63,231, 64,125,134,136, 7, 78, 39,175, 3,255,192,185, 52,235,191, 83,185,191,
-190,252,176, 39,129,201,237,211,244,241, 3,255,192,182,222, 95,190,161, 32,178,191,165, 92, 48,131, 90,248,208,227,211, 3,255,
-192,179,119, 52,191,147,204,223,191,160,141,116,133,169,230,113,228,103, 3,255, 63, 35, 88,109, 64,182,186,129,191,152, 8,207,
- 14, 5,124,127,229,202, 3,255, 63, 99, 54,226, 64,174,134,172,191,250, 98, 96, 19,180,118,244,213, 14, 3,255, 61, 60,195,150,
- 64,177,121, 46,191,245, 6,174, 1, 84,120,249,214, 55, 3,255,191,145,160,228, 64,181, 59,121,191,123,252,246,231, 63,123,214,
-235, 42, 3,255,191,188,166, 29, 64,181,120,167,189,165,224, 4,224, 81,123,253,253,203, 3,255,191, 9,186, 26, 64,186,142,104,
-190,126, 74,128,243,158,127, 69,250, 88, 3,255,191, 19,205,179, 64,175,145, 33, 63,253,151,102,243,125,119,171, 43,167, 3,255,
-190,134,114,163, 64,183, 94, 81, 63,157,210, 73,250, 40,124,240, 27, 49, 3,255,191,151,217,253, 64,178, 89, 90, 63,178,246,210,
-230, 89,121,146, 30,187, 3,255,192, 50,200,107, 64,164, 21, 4,191, 18,252,143,194,229,111,189,243, 58, 3,255,192, 29,140,219,
- 64,163,216,164,191,187,160,163,202, 2,111,148,224, 27, 3,255,192, 76, 63, 8, 64,152, 92,149,191,157, 6,201,185,254,103,184,
-229, 25, 3,255, 64,167, 31,102, 63,133,113, 18,192, 29,150,122,113,214, 22,149,202, 5, 3,255, 64,157, 48,115, 63, 33,183, 74,
-192, 72,172, 21,107, 50, 13,106,187, 91, 3,255, 64,151, 48,250, 63,186,157,117,192, 74, 37,236,103, 41, 31,126,187, 23, 3,255,
- 64,148, 31,118, 64, 46, 99,144,192, 21,237, 95,101,101, 59,141,205,115, 3,255, 64,150,177, 40, 64, 73,250,101,191,189,252,104,
-103, 13, 68,113,223, 39, 3,255, 64,164, 67, 59, 64, 19,116,106,191,209,145, 96,111,204, 50,223,219,255, 3,255, 64,168, 99, 9,
- 64, 32,173,184, 63, 27, 16,129,114,228, 54,189, 13,164, 3,255, 64,174, 1,225, 64, 12,167, 65,190, 38, 1,199,118,149, 48, 17,
-252,195, 3,255, 64,160,156,172, 64, 66,121, 23,188, 53,253,220,109,155, 66, 25, 0, 0, 3,255, 64,106,184,230, 64,133, 83,117,
-191,243, 95, 76, 79,202, 90,251,214, 77, 3,255, 64,101,166,116, 64,111,107, 67,192, 47,233, 69, 78, 23, 81,219,196, 34, 3,255,
- 64, 68, 20,109, 64,139, 9,202,192, 29,255,124, 66,138, 95, 22,202, 6, 3,255, 64, 12,138, 46,192,156,168,195,192, 23,240, 99,
- 47,172,149, 54,203,252, 3,255, 63,201,189,110,192,154, 28, 48,192, 60,148,180, 34, 2,150,195,191,147, 3,255, 64, 17, 55, 21,
-192,140, 67,125,192, 75, 8,118, 49, 61,160, 50,186,221, 3,255, 64,100,126, 85,192,114,211,103,192, 43,176,187, 78, 60,172,241,
-198, 2, 3,255, 64,133,112, 29,192,104, 45,168,191,249, 44, 95, 90,154,176, 96,213, 48, 3,255, 64, 95,193,192,192,138, 5,221,
-191,239,219, 42, 76,181,162, 61,214,177, 3,255, 64,134, 21, 28,192,130,231,185, 62,133,210,175, 91,128,166,182, 6, 33, 3,255,
- 64,115,101,128,192,142,100,106,190,205,174,214, 83, 32,159, 12,247,127, 3,255, 64,142,250,187,192,113,123,178,190,242,120, 90,
- 97, 99,173,142,245,244, 3,255, 64,149, 83,115,192, 24,118, 25,192, 41, 5, 96,101,195,204, 61,198, 36, 3,255, 64,130, 97,236,
-192, 34,248,181,192, 87,132, 49, 89, 17,200,184,182,144, 3,255, 64,144,103,186,191,234, 9, 91,192, 80,226,150, 98,152,216,121,
-184,152, 3,255,192,136, 74,208,192,121,117,231,191,133,193, 32,162,248,171, 42,232,249, 3,255,192,144, 84, 31,192, 87, 19, 24,
-191,211, 65, 53,157, 74,182,248,219,224, 3,255,192,123, 90, 7,192,121,238,107,191,247,227,115,170, 22,171, 1,213,218, 3,255,
-192, 54,112,161,192,156, 77, 94,191,196,107,207,193,198,149, 23,223, 32, 3,255,192, 22, 41, 24,192,169,197, 1,191, 84, 68,191,
-204, 45,140,105,237,172, 3,255,192, 75,243, 73,192,156, 16, 86,191, 33,150,180,186,216,149, 63,241,194, 3,255,192, 19,246,140,
-192,166, 60,148, 63,182, 70, 11,205,164,142,159, 31,127, 3,255,192, 58, 21, 17,192,160,209,224, 63, 88,100,103,192,202,146, 72,
- 18,171, 3,255,192, 4,252,151,192,174, 89, 71, 63, 38, 93,215,210,148,137, 55, 14,122, 3,255,191,150,176, 53,192,174,252,238,
-191,226,172, 37,230,114,136,199,217, 20, 3,255,191,214,105,225,192,161,177,211,192, 29,229,160,219,197,145,175,202, 38, 3,255,
-191, 88,213, 62,192,167, 70,193,192, 32,217,212,237,221,141,232,200,230, 3,255,192,130, 97,236, 64, 34,248,181, 64, 87,132, 49,
-166,239, 55, 72, 73,112, 3,255,192,144,103,186, 63,234, 9, 91, 64, 80,226,150,157,104, 39,135, 71,104, 3,255,192,149, 83,115,
- 64, 24,118, 25, 64, 41, 5, 96,154, 61, 51,195, 57,220, 3,255,192,133,112, 29, 64,104, 45,168, 63,249, 44, 95,165,102, 79,160,
- 42,208, 3,255,192, 95,193,192, 64,138, 5,221, 63,239,219, 42,179, 75, 93,195, 41, 79, 3,255,192,100,126, 85, 64,114,211,103,
- 64, 43,176,187,177,196, 83, 15, 57,254, 3,255,191,201,189,110, 64,154, 28, 48, 64, 60,148,180,221,254,105, 61, 64,109, 3,255,
-192, 17, 55, 21, 64,140, 67,125, 64, 75, 8,118,206,195, 95,206, 69, 35, 3,255,192, 12,138, 46, 64,156,168,195, 64, 23,240, 99,
-208, 84,106,202, 52, 4, 3,255,192,115,101,128, 64,142,100,106, 62,205,174,214,172,224, 96,244, 8,129, 3,255,192,142,250,187,
- 64,113,123,178, 62,242,120, 90,158,157, 82,114, 10, 12, 3,255,192,134, 21, 28, 64,130,231,185,190,133,210,175,164,128, 89, 74,
-249,223, 3,255, 63,214,105,225, 64,161,177,211, 64, 29,229,160, 36, 59,110, 81, 53,218, 3,255, 63, 88,213, 62, 64,167, 70,193,
- 64, 32,217,212, 18, 35,114, 24, 55, 26, 3,255, 63,150,176, 53, 64,174,252,238, 63,226,172, 37, 25,142,119, 57, 38,236, 3,255,
- 64, 22, 41, 24, 64,169,197, 1, 63, 84, 68,191, 51,211,115,151, 18, 84, 3,255, 64, 75,243, 73, 64,156, 16, 86, 63, 33,150,180,
- 69, 40,106,193, 14, 62, 3,255, 64, 54,112,161, 64,156, 77, 94, 63,196,107,208, 62, 58,106,233, 32,224, 3,255, 64,144, 84, 31,
- 64, 87, 19, 24, 63,211, 65, 53, 98,182, 73, 8, 36, 32, 3,255, 64,123, 90, 7, 64,121,238,107, 63,247,227,115, 85,234, 84,255,
- 42, 38, 3,255, 64,136, 74,208, 64,121,117,231, 63,133,193, 32, 93, 8, 84,214, 23, 7, 3,255, 64, 58, 21, 17, 64,160,209,224,
-191, 88,100,103, 63, 54,109,184,237, 85, 3,255, 64, 4,252,151, 64,174, 89, 71,191, 38, 93,215, 45,108,118,201,241,134, 3,255,
- 64, 19,246,140, 64,166, 60,148,191,182, 70, 11, 50, 92,113, 97,224,129, 3,255, 64,182,222, 95, 62,161, 32,178, 63,165, 92, 48,
-124,166, 7, 48, 28, 45, 3,255, 64,179,119, 52, 63,147,204,223, 63,160,141,116,122, 87, 25,143, 27,153, 3,255, 64,185, 52,235,
- 63, 83,185,191, 62,252,176, 39,126, 55, 18, 45, 11, 15, 3,255, 64,186,178, 88,190,226, 33,180,190,165,211, 69,127,103,245,191,
-249, 60, 3,255, 64,181,194,100,191,178, 37,227,190,191, 51, 65,124, 57,226, 39,248, 55, 3,255, 64,184, 83,241,191,117,241, 33,
- 62,248, 69,204,125,224,235, 11, 9,234, 3,255, 64,157,242, 15,192, 63, 35,177, 63,132,230,242,107,141,190,122, 22,217, 3,255,
- 64,169,163, 58,192, 14,207,184, 63,148, 92, 43,115,134,207, 6, 25, 63, 3,255, 64,167, 26, 30,192, 42, 11, 62, 62,159,163,199,
-113,211,197,230, 7, 20, 3,255, 64,173,114,185,191,162, 11,147,191,237,131,136,118, 52,228,150,215, 69, 3,255, 64,178, 82, 90,
-190,168, 0,181,191,231, 64,125,121,120,248,178,216, 81, 3,255, 64,168, 68,140,191, 57,100,162,192, 31, 41, 90,114,165,240, 61,
-201, 81, 3,255, 64, 29,140,219,192,163,216,164, 63,187,160,163, 53,254,144,108, 31,229, 3,255, 64, 76, 63, 8,192,152, 92,149,
- 63,157, 6,201, 70, 2,152, 72, 26,231, 3,255, 64, 50,200,107,192,164, 21, 4, 63, 18,252,143, 61, 27,144, 67, 12,198, 3,255,
- 63,188,166, 29,192,181,120,167, 61,165,224, 4, 31,175,132, 3, 2, 53, 3,255, 63, 9,186, 26,192,186,142,104, 62,126, 74,128,
- 12, 98,128,187, 5,168, 3,255, 63,145,160,228,192,181, 59,121, 63,123,252,246, 24,193,132, 42, 20,214, 3,255,191, 99, 54,226,
-192,174,134,172, 63,250, 98, 96,236, 76,137, 12, 42,242, 3,255,189, 60,195,150,192,177,121, 46, 63,245, 6,174,254,172,135, 7,
- 41,201, 3,255,191, 35, 88,109,192,182,186,129, 63,152, 8,207,241,251,131,129, 26, 54, 3,255, 62,134,114,163,192,183, 94, 81,
-191,157,210, 73, 5,216,131, 16,228,207, 3,255, 63,151,217,253,192,178, 89, 90,191,178,246,210, 25,167,134,110,225, 69, 3,255,
- 63, 19,205,179,192,175,145, 33,191,253,151,102, 12,131,136, 85,212, 89, 3,255,192,101,166,116,192,111,107, 67, 64, 47,233, 69,
-177,233,174, 37, 59,222, 3,255,192, 68, 20,109,192,139, 9,202, 64, 29,255,124,189,118,160,234, 53,250, 3,255,192,106,184,230,
-192,133, 83,117, 63,243, 95, 76,176, 54,165, 5, 41,179, 3,255,192,150,177, 40,192, 73,250,101, 63,189,252,104,152,243,187,143,
- 32,217, 3,255,192,164, 67, 59,192, 19,116,106, 63,209,145, 96,144, 52,205, 33, 36, 1, 3,255,192,148, 31,118,192, 46, 99,144,
- 64, 21,237, 95,154,155,196,115, 50,141, 3,255,192,157, 48,115,191, 33,183, 74, 64, 72,172, 21,148,206,242,150, 68,165, 3,255,
-192,151, 48,250,191,186,157,117, 64, 74, 37,236,152,215,224,130, 68,233, 3,255,192,167, 31,102,191,133,113, 18, 64, 29,150,122,
-142, 42,233,107, 53,251, 3,255,192,174, 1,225,192, 12,167, 65, 62, 38, 1,199,137,107,207,239, 3, 61, 3,255,192,160,156,172,
-192, 66,121, 23, 60, 53,253,220,146,101,189,231, 0, 0, 3,255,192,168, 99, 9,192, 32,173,184,191, 27, 16,129,141, 28,201, 67,
-242, 92, 3,255,191, 19, 18,220, 64, 98,186,168, 64,148,136, 66,243,101, 77,135,101, 15, 3,255,191, 68,220, 36, 64,132,143, 24,
- 64,130,105, 20,239, 93, 90,190, 88,184, 3,255,191,185,255, 60, 64,108,244,215, 64,138, 7,129,224,143, 80,245, 94, 5, 3,255,
-191,247,202, 46, 64, 27,140, 23, 64,158,252,116,214, 39, 52,179,108,224, 3,255,191,220, 24,190, 63,202,163,163, 64,171,244,160,
-218,157, 35, 57,117, 60, 3,255,191,133,219,227, 64, 17, 47,172, 64,169,160, 93,232,130, 49, 92,115,188, 3,255, 62, 50, 45,123,
- 62,230, 16,213, 64,186,240,160, 4, 25, 9,132,127,147, 3,255, 59,172,119,131, 63,162,209,182, 64,183, 73,170, 0, 47, 27,112,
-125, 5, 3,255,191, 40,230,165, 63, 24,111,246, 64,185,150, 50,241,237, 12,238,126,143, 3,255,192, 66,225,100, 63,131,191,146,
- 64,157, 18,152,189, 78, 22,128,106,231, 3,255,192, 80,140, 98, 63,238,205,169, 64,144, 69, 83,184,186, 40,111, 98, 83, 3,255,
-192,109, 39,177, 63,147,213,154, 64,140,143,239,174,199, 25, 9, 95,179, 3,255, 64,128,173,131, 64, 14,170, 50, 64,105, 71,247,
- 87,226, 48,192, 79, 67, 3,255, 64,140,137,202, 64, 33,234, 4, 64, 60,117,152, 96, 41, 55, 40, 63,250, 3,255, 64,115,176, 68,
- 64, 68, 49, 85, 64, 79,173, 65, 83, 78, 66,175, 70,175, 3,255, 64, 39, 23, 51, 64, 76,245, 14, 64,132,248,105, 56,227, 69,119,
- 91, 56, 3,255, 63,254, 75,122, 64, 50, 36, 17, 64,152, 70, 83, 44, 3, 60,210,103,169, 3,255, 64, 52,239,190, 64, 22,186,193,
- 64,145,240,166, 61, 89, 51,253, 99,148, 3,255, 63,213,244,249, 63, 52, 33, 10, 64,178, 94,248, 36, 84, 14,253,121,208, 3,255,
- 64, 22, 80,230, 63,141,155, 50, 64,168, 95,108, 50,253, 23,250,114,237, 3,255, 63,194,113, 96, 63,195,184,166, 64,174,160, 31,
- 33, 51, 33, 11,119, 29, 3,255, 63,112,119,228, 64,115, 46, 49, 64,139,222,186, 20,104, 83, 35, 95, 40, 3,255, 63,199, 22,221,
- 64,134,211, 71, 64,113,161, 37, 33,158, 92, 1, 82, 99, 3,255, 63, 58,131,170, 64,140,178, 58, 64,115,174,213, 15,151, 96, 55,
- 82,245, 3,255, 64,132,134,116,192, 40,130, 40, 64, 77,207,237, 90,117,198,107, 69,226, 3,255, 64,140,187,232,192, 62, 96, 6,
- 64, 30,247,107, 95,249,190,188, 53,245, 3,255, 64,152, 61, 37,192, 14, 9,230, 64, 39,179,137,103,171,207, 73, 57, 30, 3,255,
- 64,149,121,189,191,111,192,142, 64, 90, 95, 76,101,161,235,149, 75, 20, 3,255, 64,134,112,254,190,207,146,126, 64,130, 19,159,
- 91,241,246,137, 88,139, 3,255, 64,129,129, 12,191,173,129,231, 64,128,125,159, 88,194,226,241, 87,133, 3,255, 64, 22,104,220,
-191, 40,221,204, 64,170,137,115, 50,240,241,167,116,139, 3,255, 64, 56,120,245,191,154,213,118, 64,158,227, 81, 62,175,229,209,
-108,123, 3,255, 64, 66, 56, 52,190,139, 40,206, 64,160,116, 21, 65,243,249,237,109,135, 3,255, 64,150,161, 61, 63, 89,221,107,
- 64, 89,113,118,102,216, 18,177, 73,221, 3,255, 64,165,120, 74, 62,167, 78, 95, 64, 48, 51,139,112,202, 7,116, 60, 12, 3,255,
- 64,162, 65, 12, 63,149, 84, 11, 64, 44,202,172,110,196, 25,209, 58,181, 3,255,190,194,138, 67,192,138, 97,177, 64,124,158, 75,
-247,144,161,122, 85,227, 3,255,191, 66, 82,214,192,152,115,128, 64, 85, 25,164,239, 15,151,229, 72,130, 3,255, 61,171,155,119,
-192,155, 40,138, 64, 83, 96,113, 1,128,150, 60, 72, 18, 3,255, 63,178,237,144,192,136,136, 25, 64,113, 1,121, 30,139,163, 67,
- 82,194, 3,255, 63,238,147, 68,192,100,230,166, 64,136, 9,234, 40, 40,177,126, 92,197, 3,255, 63,109,149, 30,192,111, 18, 40,
- 64,141,100,171, 20,219,174, 55, 96, 57, 3,255, 63,162,210, 45,191,224,211,233, 64,174, 67,184, 27,187,218, 11,119, 12, 3,255,
- 63, 94,106,158,192, 30,106,167, 64,167,240,254, 19, 27,202, 69,114,151, 3,255, 63,229,114, 22,192, 20, 96,193, 64,162,167,253,
- 38,234,205,163,111, 12, 3,255, 64, 67, 76,208,192,111,120, 62, 64, 85, 89, 14, 66,176,174, 60, 72,116, 3,255, 64, 37,220,139,
-192,141,135,245, 64, 54,173,114, 56,211,159,161, 62, 45, 3,255, 64, 84,119,204,192,130, 73, 93, 64, 38,107,212, 72,198,167, 33,
- 56,119, 3,255,192, 82,218,178,191, 1,247,178, 64,154,129,211,183,221,244,252,105, 39, 3,255,192,124,245, 0,190,187, 32, 27,
- 64,138, 6, 57,169,118,248, 80, 93,254, 3,255,192,112, 75, 42,191,152, 42,228, 64,139, 44, 25,174, 0,230, 97, 94,225, 3,255,
-192, 43,222,239,192, 11,226,212, 64,151, 71,227,197,223,208,116,103,165, 3,255,191,229,207,137,192, 22, 63, 30, 64,161,235,207,
-216, 58,205, 29,110,129, 3,255,192, 14, 11,239,191,191,114,175, 64,166,208,254,207,123,222,175,113,169, 3,255,189,149, 78,163,
-191,137, 25, 65, 64,184,102,234,254,202,232,204,125,222, 3,255,191,104,203,208,191,113, 6,146, 64,183, 5,108,236,124,235,106,
-124,207, 3,255,190,251, 68, 26,191,228, 38,111, 64,178, 48,114,245,117,217, 98,121,147, 3,255,191,222,169, 76,192,104,107,205,
- 64,136,142,150,217,233,176,151, 92,223, 3,255,192, 39,143,145,192, 94, 49,190, 64,124, 27,165,199, 18,180, 4, 85,213, 3,255,
-192, 6,168,130,192,130,132,190, 64,105, 96, 12,210, 30,166,165, 79, 83, 3,255, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,246,128,
- 0, 0, 0,242, 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, 8,107,176, 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, 68, 65, 84, 65, 0, 0, 90, 0, 8,107,176, 32, 0, 0, 0, 53, 0, 0, 7,128,
- 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 35, 0, 0, 0, 42, 0, 0, 0,162, 0, 0, 0, 35, 0, 0, 0, 12, 0, 0, 0,163,
- 0, 0, 0, 35, 0, 0, 0, 42, 0, 0, 0,163, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0,164, 0, 0, 0, 35, 0, 0, 0, 43,
- 0, 0, 0,164, 0, 0, 0, 35, 0, 0, 0, 12, 0, 0, 0,165, 0, 0, 0, 35, 0, 0, 0, 43, 0, 0, 0,165, 0, 0, 0, 35,
- 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 35, 0, 0, 0, 44, 0, 0, 0,166, 0, 0, 0, 35, 0, 0, 0, 13, 0, 0, 0,167,
- 0, 0, 0, 35, 0, 0, 0, 44, 0, 0, 0,167, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0,168, 0, 0, 0, 35, 0, 0, 0, 45,
- 0, 0, 0,168, 0, 0, 0, 35, 0, 0, 0, 13, 0, 0, 0,169, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 0,169, 0, 0, 0, 35,
- 0, 0, 0, 1, 0, 0, 0,170, 0, 0, 0, 35, 0, 0, 0, 46, 0, 0, 0,170, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0,171,
- 0, 0, 0, 35, 0, 0, 0, 46, 0, 0, 0,171, 0, 0, 0, 35, 0, 0, 0, 2, 0, 0, 0,172, 0, 0, 0, 35, 0, 0, 0, 47,
- 0, 0, 0,172, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 0,173, 0, 0, 0, 35, 0, 0, 0, 47, 0, 0, 0,173, 0, 0, 0, 35,
- 0, 0, 0, 0, 0, 0, 0,174, 0, 0, 0, 35, 0, 0, 0, 48, 0, 0, 0,174, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0,175,
- 0, 0, 0, 35, 0, 0, 0, 48, 0, 0, 0,175, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0,176, 0, 0, 0, 35, 0, 0, 0, 49,
- 0, 0, 0,176, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 0,177, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 0,177, 0, 0, 0, 35,
- 0, 0, 0, 1, 0, 0, 0,178, 0, 0, 0, 35, 0, 0, 0, 50, 0, 0, 0,178, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 0,179,
- 0, 0, 0, 35, 0, 0, 0, 50, 0, 0, 0,179, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0,180, 0, 0, 0, 35, 0, 0, 0, 51,
- 0, 0, 0,180, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 0,181, 0, 0, 0, 35, 0, 0, 0, 51, 0, 0, 0,181, 0, 0, 0, 35,
- 0, 0, 0, 0, 0, 0, 0,182, 0, 0, 0, 35, 0, 0, 0, 52, 0, 0, 0,182, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0,183,
- 0, 0, 0, 35, 0, 0, 0, 52, 0, 0, 0,183, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0,184, 0, 0, 0, 35, 0, 0, 0, 53,
- 0, 0, 0,184, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 0,185, 0, 0, 0, 35, 0, 0, 0, 53, 0, 0, 0,185, 0, 0, 0, 35,
- 0, 0, 0, 2, 0, 0, 0,186, 0, 0, 0, 35, 0, 0, 0, 54, 0, 0, 0,186, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 0,187,
- 0, 0, 0, 35, 0, 0, 0, 54, 0, 0, 0,187, 0, 0, 0, 35, 0, 0, 0, 3, 0, 0, 0,188, 0, 0, 0, 35, 0, 0, 0, 55,
- 0, 0, 0,188, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 0,189, 0, 0, 0, 35, 0, 0, 0, 55, 0, 0, 0,189, 0, 0, 0, 35,
- 0, 0, 0, 0, 0, 0, 0,190, 0, 0, 0, 35, 0, 0, 0, 56, 0, 0, 0,190, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0,191,
- 0, 0, 0, 35, 0, 0, 0, 56, 0, 0, 0,191, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0,192, 0, 0, 0, 35, 0, 0, 0, 57,
- 0, 0, 0,192, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 0,193, 0, 0, 0, 35, 0, 0, 0, 57, 0, 0, 0,193, 0, 0, 0, 35,
- 0, 0, 0, 3, 0, 0, 0,194, 0, 0, 0, 35, 0, 0, 0, 58, 0, 0, 0,194, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 0,195,
- 0, 0, 0, 35, 0, 0, 0, 58, 0, 0, 0,195, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0,196, 0, 0, 0, 35, 0, 0, 0, 59,
- 0, 0, 0,196, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 0,197, 0, 0, 0, 35, 0, 0, 0, 59, 0, 0, 0,197, 0, 0, 0, 35,
- 0, 0, 0, 4, 0, 0, 0,198, 0, 0, 0, 35, 0, 0, 0, 60, 0, 0, 0,198, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0,199,
- 0, 0, 0, 35, 0, 0, 0, 60, 0, 0, 0,199, 0, 0, 0, 35, 0, 0, 0, 5, 0, 0, 0,200, 0, 0, 0, 35, 0, 0, 0, 61,
- 0, 0, 0,200, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 0,201, 0, 0, 0, 35, 0, 0, 0, 61, 0, 0, 0,201, 0, 0, 0, 35,
- 0, 0, 0, 5, 0, 0, 0,202, 0, 0, 0, 35, 0, 0, 0, 62, 0, 0, 0,202, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 0,203,
- 0, 0, 0, 35, 0, 0, 0, 62, 0, 0, 0,203, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 0,204, 0, 0, 0, 35, 0, 0, 0, 63,
- 0, 0, 0,204, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 0,205, 0, 0, 0, 35, 0, 0, 0, 63, 0, 0, 0,205, 0, 0, 0, 35,
- 0, 0, 0, 1, 0, 0, 0,206, 0, 0, 0, 35, 0, 0, 0, 64, 0, 0, 0,206, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 0,207,
- 0, 0, 0, 35, 0, 0, 0, 64, 0, 0, 0,207, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 0,208, 0, 0, 0, 35, 0, 0, 0, 65,
- 0, 0, 0,208, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 0,209, 0, 0, 0, 35, 0, 0, 0, 65, 0, 0, 0,209, 0, 0, 0, 35,
- 0, 0, 0, 1, 0, 0, 0,210, 0, 0, 0, 35, 0, 0, 0, 66, 0, 0, 0,210, 0, 0, 0, 35, 0, 0, 0, 24, 0, 0, 0,211,
- 0, 0, 0, 35, 0, 0, 0, 66, 0, 0, 0,211, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0,212, 0, 0, 0, 35, 0, 0, 0, 67,
- 0, 0, 0,212, 0, 0, 0, 35, 0, 0, 0, 24, 0, 0, 0,213, 0, 0, 0, 35, 0, 0, 0, 67, 0, 0, 0,213, 0, 0, 0, 35,
- 0, 0, 0, 2, 0, 0, 0,214, 0, 0, 0, 35, 0, 0, 0, 68, 0, 0, 0,214, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 0,215,
- 0, 0, 0, 35, 0, 0, 0, 68, 0, 0, 0,215, 0, 0, 0, 35, 0, 0, 0, 6, 0, 0, 0,216, 0, 0, 0, 35, 0, 0, 0, 69,
- 0, 0, 0,216, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 0,217, 0, 0, 0, 35, 0, 0, 0, 69, 0, 0, 0,217, 0, 0, 0, 35,
- 0, 0, 0, 2, 0, 0, 0,218, 0, 0, 0, 35, 0, 0, 0, 70, 0, 0, 0,218, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 0,219,
- 0, 0, 0, 35, 0, 0, 0, 70, 0, 0, 0,219, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0,220, 0, 0, 0, 35, 0, 0, 0, 71,
- 0, 0, 0,220, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 0,221, 0, 0, 0, 35, 0, 0, 0, 71, 0, 0, 0,221, 0, 0, 0, 35,
- 0, 0, 0, 3, 0, 0, 0,222, 0, 0, 0, 35, 0, 0, 0, 72, 0, 0, 0,222, 0, 0, 0, 35, 0, 0, 0, 27, 0, 0, 0,223,
- 0, 0, 0, 35, 0, 0, 0, 72, 0, 0, 0,223, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0,224, 0, 0, 0, 35, 0, 0, 0, 73,
- 0, 0, 0,224, 0, 0, 0, 35, 0, 0, 0, 27, 0, 0, 0,225, 0, 0, 0, 35, 0, 0, 0, 73, 0, 0, 0,225, 0, 0, 0, 35,
- 0, 0, 0, 3, 0, 0, 0,226, 0, 0, 0, 35, 0, 0, 0, 74, 0, 0, 0,226, 0, 0, 0, 35, 0, 0, 0, 28, 0, 0, 0,227,
- 0, 0, 0, 35, 0, 0, 0, 74, 0, 0, 0,227, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0,228, 0, 0, 0, 35, 0, 0, 0, 75,
- 0, 0, 0,228, 0, 0, 0, 35, 0, 0, 0, 28, 0, 0, 0,229, 0, 0, 0, 35, 0, 0, 0, 75, 0, 0, 0,229, 0, 0, 0, 35,
- 0, 0, 0, 4, 0, 0, 0,230, 0, 0, 0, 35, 0, 0, 0, 76, 0, 0, 0,230, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0,231,
- 0, 0, 0, 35, 0, 0, 0, 76, 0, 0, 0,231, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0,232, 0, 0, 0, 35, 0, 0, 0, 77,
- 0, 0, 0,232, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 0,233, 0, 0, 0, 35, 0, 0, 0, 77, 0, 0, 0,233, 0, 0, 0, 35,
- 0, 0, 0, 4, 0, 0, 0,234, 0, 0, 0, 35, 0, 0, 0, 78, 0, 0, 0,234, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 0,235,
- 0, 0, 0, 35, 0, 0, 0, 78, 0, 0, 0,235, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 0,236, 0, 0, 0, 35, 0, 0, 0, 79,
- 0, 0, 0,236, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 0,237, 0, 0, 0, 35, 0, 0, 0, 79, 0, 0, 0,237, 0, 0, 0, 35,
- 0, 0, 0, 5, 0, 0, 0,238, 0, 0, 0, 35, 0, 0, 0, 80, 0, 0, 0,238, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 0,239,
- 0, 0, 0, 35, 0, 0, 0, 80, 0, 0, 0,239, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 0,240, 0, 0, 0, 35, 0, 0, 0, 81,
- 0, 0, 0,240, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 0,241, 0, 0, 0, 35, 0, 0, 0, 81, 0, 0, 0,241, 0, 0, 0, 35,
- 0, 0, 0, 6, 0, 0, 0,242, 0, 0, 0, 35, 0, 0, 0, 82, 0, 0, 0,242, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 0,243,
- 0, 0, 0, 35, 0, 0, 0, 82, 0, 0, 0,243, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 0,244, 0, 0, 0, 35, 0, 0, 0, 83,
- 0, 0, 0,244, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 0,245, 0, 0, 0, 35, 0, 0, 0, 83, 0, 0, 0,245, 0, 0, 0, 35,
- 0, 0, 0, 6, 0, 0, 0,246, 0, 0, 0, 35, 0, 0, 0, 84, 0, 0, 0,246, 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 0,247,
- 0, 0, 0, 35, 0, 0, 0, 84, 0, 0, 0,247, 0, 0, 0, 35, 0, 0, 0, 7, 0, 0, 0,248, 0, 0, 0, 35, 0, 0, 0, 85,
- 0, 0, 0,248, 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 0,249, 0, 0, 0, 35, 0, 0, 0, 85, 0, 0, 0,249, 0, 0, 0, 35,
- 0, 0, 0, 7, 0, 0, 0,250, 0, 0, 0, 35, 0, 0, 0, 86, 0, 0, 0,250, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0,251,
- 0, 0, 0, 35, 0, 0, 0, 86, 0, 0, 0,251, 0, 0, 0, 35, 0, 0, 0, 8, 0, 0, 0,252, 0, 0, 0, 35, 0, 0, 0, 87,
- 0, 0, 0,252, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 0,253, 0, 0, 0, 35, 0, 0, 0, 87, 0, 0, 0,253, 0, 0, 0, 35,
- 0, 0, 0, 8, 0, 0, 0,254, 0, 0, 0, 35, 0, 0, 0, 88, 0, 0, 0,254, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 0,255,
- 0, 0, 0, 35, 0, 0, 0, 88, 0, 0, 0,255, 0, 0, 0, 35, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 0, 35, 0, 0, 0, 89,
- 0, 0, 1, 0, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 1, 1, 0, 0, 0, 35, 0, 0, 0, 89, 0, 0, 1, 1, 0, 0, 0, 35,
- 0, 0, 0, 9, 0, 0, 1, 2, 0, 0, 0, 35, 0, 0, 0, 90, 0, 0, 1, 2, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1, 3,
- 0, 0, 0, 35, 0, 0, 0, 90, 0, 0, 1, 3, 0, 0, 0, 35, 0, 0, 0, 10, 0, 0, 1, 4, 0, 0, 0, 35, 0, 0, 0, 91,
- 0, 0, 1, 4, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1, 5, 0, 0, 0, 35, 0, 0, 0, 91, 0, 0, 1, 5, 0, 0, 0, 35,
- 0, 0, 0, 10, 0, 0, 1, 6, 0, 0, 0, 35, 0, 0, 0, 92, 0, 0, 1, 6, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1, 7,
- 0, 0, 0, 35, 0, 0, 0, 92, 0, 0, 1, 7, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 8, 0, 0, 0, 35, 0, 0, 0, 93,
- 0, 0, 1, 8, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1, 9, 0, 0, 0, 35, 0, 0, 0, 93, 0, 0, 1, 9, 0, 0, 0, 35,
- 0, 0, 0, 6, 0, 0, 1, 10, 0, 0, 0, 35, 0, 0, 0, 94, 0, 0, 1, 10, 0, 0, 0, 35, 0, 0, 0, 38, 0, 0, 1, 11,
- 0, 0, 0, 35, 0, 0, 0, 94, 0, 0, 1, 11, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 12, 0, 0, 0, 35, 0, 0, 0, 95,
- 0, 0, 1, 12, 0, 0, 0, 35, 0, 0, 0, 38, 0, 0, 1, 13, 0, 0, 0, 35, 0, 0, 0, 95, 0, 0, 1, 13, 0, 0, 0, 35,
- 0, 0, 0, 7, 0, 0, 1, 14, 0, 0, 0, 35, 0, 0, 0, 96, 0, 0, 1, 14, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1, 15,
- 0, 0, 0, 35, 0, 0, 0, 96, 0, 0, 1, 15, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 16, 0, 0, 0, 35, 0, 0, 0, 97,
- 0, 0, 1, 16, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1, 17, 0, 0, 0, 35, 0, 0, 0, 97, 0, 0, 1, 17, 0, 0, 0, 35,
- 0, 0, 0, 8, 0, 0, 1, 18, 0, 0, 0, 35, 0, 0, 0, 98, 0, 0, 1, 18, 0, 0, 0, 35, 0, 0, 0, 40, 0, 0, 1, 19,
- 0, 0, 0, 35, 0, 0, 0, 98, 0, 0, 1, 19, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 20, 0, 0, 0, 35, 0, 0, 0, 99,
- 0, 0, 1, 20, 0, 0, 0, 35, 0, 0, 0, 40, 0, 0, 1, 21, 0, 0, 0, 35, 0, 0, 0, 99, 0, 0, 1, 21, 0, 0, 0, 35,
- 0, 0, 0, 9, 0, 0, 1, 22, 0, 0, 0, 35, 0, 0, 0,100, 0, 0, 1, 22, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1, 23,
- 0, 0, 0, 35, 0, 0, 0,100, 0, 0, 1, 23, 0, 0, 0, 35, 0, 0, 0, 11, 0, 0, 1, 24, 0, 0, 0, 35, 0, 0, 0,101,
- 0, 0, 1, 24, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1, 25, 0, 0, 0, 35, 0, 0, 0,101, 0, 0, 1, 25, 0, 0, 0, 35,
- 0, 0, 0, 12, 0, 0, 1, 26, 0, 0, 0, 35, 0, 0, 0,102, 0, 0, 1, 26, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 1, 27,
- 0, 0, 0, 35, 0, 0, 0,102, 0, 0, 1, 27, 0, 0, 0, 35, 0, 0, 0, 12, 0, 0, 1, 28, 0, 0, 0, 35, 0, 0, 0,103,
- 0, 0, 1, 28, 0, 0, 0, 35, 0, 0, 0, 13, 0, 0, 1, 29, 0, 0, 0, 35, 0, 0, 0,103, 0, 0, 1, 29, 0, 0, 0, 35,
- 0, 0, 0, 13, 0, 0, 1, 30, 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1, 30, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 1, 31,
- 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1, 31, 0, 0, 0, 35, 0, 0, 0, 12, 0, 0, 1, 32, 0, 0, 0, 35, 0, 0, 0,105,
- 0, 0, 1, 32, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 1, 33, 0, 0, 0, 35, 0, 0, 0,105, 0, 0, 1, 33, 0, 0, 0, 35,
- 0, 0, 0, 12, 0, 0, 1, 34, 0, 0, 0, 35, 0, 0, 0,106, 0, 0, 1, 34, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 1, 35,
- 0, 0, 0, 35, 0, 0, 0,106, 0, 0, 1, 35, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 1, 36, 0, 0, 0, 35, 0, 0, 0,107,
- 0, 0, 1, 36, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 1, 37, 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1, 37, 0, 0, 0, 35,
- 0, 0, 0, 13, 0, 0, 1, 38, 0, 0, 0, 35, 0, 0, 0,108, 0, 0, 1, 38, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 1, 39,
- 0, 0, 0, 35, 0, 0, 0,108, 0, 0, 1, 39, 0, 0, 0, 35, 0, 0, 0, 13, 0, 0, 1, 40, 0, 0, 0, 35, 0, 0, 0,109,
- 0, 0, 1, 40, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 1, 41, 0, 0, 0, 35, 0, 0, 0,109, 0, 0, 1, 41, 0, 0, 0, 35,
- 0, 0, 0, 17, 0, 0, 1, 42, 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1, 42, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 1, 43,
- 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1, 43, 0, 0, 0, 35, 0, 0, 0, 17, 0, 0, 1, 44, 0, 0, 0, 35, 0, 0, 0,111,
- 0, 0, 1, 44, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 1, 45, 0, 0, 0, 35, 0, 0, 0,111, 0, 0, 1, 45, 0, 0, 0, 35,
- 0, 0, 0, 17, 0, 0, 1, 46, 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 1, 46, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 1, 47,
- 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 1, 47, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 1, 48, 0, 0, 0, 35, 0, 0, 0,113,
- 0, 0, 1, 48, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 1, 49, 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1, 49, 0, 0, 0, 35,
- 0, 0, 0, 19, 0, 0, 1, 50, 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 1, 50, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 1, 51,
- 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 1, 51, 0, 0, 0, 35, 0, 0, 0, 15, 0, 0, 1, 52, 0, 0, 0, 35, 0, 0, 0,115,
- 0, 0, 1, 52, 0, 0, 0, 35, 0, 0, 0, 19, 0, 0, 1, 53, 0, 0, 0, 35, 0, 0, 0,115, 0, 0, 1, 53, 0, 0, 0, 35,
- 0, 0, 0, 15, 0, 0, 1, 54, 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1, 54, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 1, 55,
- 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1, 55, 0, 0, 0, 35, 0, 0, 0, 16, 0, 0, 1, 56, 0, 0, 0, 35, 0, 0, 0,117,
- 0, 0, 1, 56, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 1, 57, 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 1, 57, 0, 0, 0, 35,
- 0, 0, 0, 16, 0, 0, 1, 58, 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 1, 58, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 1, 59,
- 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 1, 59, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 1, 60, 0, 0, 0, 35, 0, 0, 0,119,
- 0, 0, 1, 60, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 1, 61, 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1, 61, 0, 0, 0, 35,
- 0, 0, 0, 14, 0, 0, 1, 62, 0, 0, 0, 35, 0, 0, 0,120, 0, 0, 1, 62, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 1, 63,
- 0, 0, 0, 35, 0, 0, 0,120, 0, 0, 1, 63, 0, 0, 0, 35, 0, 0, 0, 14, 0, 0, 1, 64, 0, 0, 0, 35, 0, 0, 0,121,
- 0, 0, 1, 64, 0, 0, 0, 35, 0, 0, 0, 24, 0, 0, 1, 65, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 1, 65, 0, 0, 0, 35,
- 0, 0, 0, 24, 0, 0, 1, 66, 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1, 66, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 1, 67,
- 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1, 67, 0, 0, 0, 35, 0, 0, 0, 18, 0, 0, 1, 68, 0, 0, 0, 35, 0, 0, 0,123,
- 0, 0, 1, 68, 0, 0, 0, 35, 0, 0, 0, 27, 0, 0, 1, 69, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 1, 69, 0, 0, 0, 35,
- 0, 0, 0, 18, 0, 0, 1, 70, 0, 0, 0, 35, 0, 0, 0,124, 0, 0, 1, 70, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 1, 71,
- 0, 0, 0, 35, 0, 0, 0,124, 0, 0, 1, 71, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 1, 72, 0, 0, 0, 35, 0, 0, 0,125,
- 0, 0, 1, 72, 0, 0, 0, 35, 0, 0, 0, 27, 0, 0, 1, 73, 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1, 73, 0, 0, 0, 35,
- 0, 0, 0, 20, 0, 0, 1, 74, 0, 0, 0, 35, 0, 0, 0,126, 0, 0, 1, 74, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 1, 75,
- 0, 0, 0, 35, 0, 0, 0,126, 0, 0, 1, 75, 0, 0, 0, 35, 0, 0, 0, 20, 0, 0, 1, 76, 0, 0, 0, 35, 0, 0, 0,127,
- 0, 0, 1, 76, 0, 0, 0, 35, 0, 0, 0, 28, 0, 0, 1, 77, 0, 0, 0, 35, 0, 0, 0,127, 0, 0, 1, 77, 0, 0, 0, 35,
- 0, 0, 0, 28, 0, 0, 1, 78, 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1, 78, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 1, 79,
- 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1, 79, 0, 0, 0, 35, 0, 0, 0, 21, 0, 0, 1, 80, 0, 0, 0, 35, 0, 0, 0,129,
- 0, 0, 1, 80, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 1, 81, 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 1, 81, 0, 0, 0, 35,
- 0, 0, 0, 21, 0, 0, 1, 82, 0, 0, 0, 35, 0, 0, 0,130, 0, 0, 1, 82, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 1, 83,
- 0, 0, 0, 35, 0, 0, 0,130, 0, 0, 1, 83, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 1, 84, 0, 0, 0, 35, 0, 0, 0,131,
- 0, 0, 1, 84, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 1, 85, 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 1, 85, 0, 0, 0, 35,
- 0, 0, 0, 23, 0, 0, 1, 86, 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 1, 86, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 1, 87,
- 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 1, 87, 0, 0, 0, 35, 0, 0, 0, 23, 0, 0, 1, 88, 0, 0, 0, 35, 0, 0, 0,133,
- 0, 0, 1, 88, 0, 0, 0, 35, 0, 0, 0, 24, 0, 0, 1, 89, 0, 0, 0, 35, 0, 0, 0,133, 0, 0, 1, 89, 0, 0, 0, 35,
- 0, 0, 0, 24, 0, 0, 1, 90, 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 1, 90, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 1, 91,
- 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 1, 91, 0, 0, 0, 35, 0, 0, 0, 25, 0, 0, 1, 92, 0, 0, 0, 35, 0, 0, 0,135,
- 0, 0, 1, 92, 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 1, 93, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 1, 93, 0, 0, 0, 35,
- 0, 0, 0, 25, 0, 0, 1, 94, 0, 0, 0, 35, 0, 0, 0,136, 0, 0, 1, 94, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 1, 95,
- 0, 0, 0, 35, 0, 0, 0,136, 0, 0, 1, 95, 0, 0, 0, 35, 0, 0, 0, 26, 0, 0, 1, 96, 0, 0, 0, 35, 0, 0, 0,137,
- 0, 0, 1, 96, 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 1, 97, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 1, 97, 0, 0, 0, 35,
- 0, 0, 0, 27, 0, 0, 1, 98, 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 1, 98, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 1, 99,
- 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 1, 99, 0, 0, 0, 35, 0, 0, 0, 27, 0, 0, 1,100, 0, 0, 0, 35, 0, 0, 0,139,
- 0, 0, 1,100, 0, 0, 0, 35, 0, 0, 0, 28, 0, 0, 1,101, 0, 0, 0, 35, 0, 0, 0,139, 0, 0, 1,101, 0, 0, 0, 35,
- 0, 0, 0, 28, 0, 0, 1,102, 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 1,102, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 1,103,
- 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 1,103, 0, 0, 0, 35, 0, 0, 0, 29, 0, 0, 1,104, 0, 0, 0, 35, 0, 0, 0,141,
- 0, 0, 1,104, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 1,105, 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 1,105, 0, 0, 0, 35,
- 0, 0, 0, 29, 0, 0, 1,106, 0, 0, 0, 35, 0, 0, 0,142, 0, 0, 1,106, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 1,107,
- 0, 0, 0, 35, 0, 0, 0,142, 0, 0, 1,107, 0, 0, 0, 35, 0, 0, 0, 30, 0, 0, 1,108, 0, 0, 0, 35, 0, 0, 0,143,
- 0, 0, 1,108, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 1,109, 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 1,109, 0, 0, 0, 35,
- 0, 0, 0, 31, 0, 0, 1,110, 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 1,110, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1,111,
- 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 1,111, 0, 0, 0, 35, 0, 0, 0, 22, 0, 0, 1,112, 0, 0, 0, 35, 0, 0, 0,145,
- 0, 0, 1,112, 0, 0, 0, 35, 0, 0, 0, 31, 0, 0, 1,113, 0, 0, 0, 35, 0, 0, 0,145, 0, 0, 1,113, 0, 0, 0, 35,
- 0, 0, 0, 22, 0, 0, 1,114, 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 1,114, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1,115,
- 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 1,115, 0, 0, 0, 35, 0, 0, 0, 32, 0, 0, 1,116, 0, 0, 0, 35, 0, 0, 0,147,
- 0, 0, 1,116, 0, 0, 0, 35, 0, 0, 0, 38, 0, 0, 1,117, 0, 0, 0, 35, 0, 0, 0,147, 0, 0, 1,117, 0, 0, 0, 35,
- 0, 0, 0, 32, 0, 0, 1,118, 0, 0, 0, 35, 0, 0, 0,148, 0, 0, 1,118, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1,119,
- 0, 0, 0, 35, 0, 0, 0,148, 0, 0, 1,119, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1,120, 0, 0, 0, 35, 0, 0, 0,149,
- 0, 0, 1,120, 0, 0, 0, 35, 0, 0, 0, 38, 0, 0, 1,121, 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 1,121, 0, 0, 0, 35,
- 0, 0, 0, 33, 0, 0, 1,122, 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 1,122, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1,123,
- 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 1,123, 0, 0, 0, 35, 0, 0, 0, 33, 0, 0, 1,124, 0, 0, 0, 35, 0, 0, 0,151,
- 0, 0, 1,124, 0, 0, 0, 35, 0, 0, 0, 38, 0, 0, 1,125, 0, 0, 0, 35, 0, 0, 0,151, 0, 0, 1,125, 0, 0, 0, 35,
- 0, 0, 0, 38, 0, 0, 1,126, 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 1,126, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1,127,
- 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 1,127, 0, 0, 0, 35, 0, 0, 0, 34, 0, 0, 1,128, 0, 0, 0, 35, 0, 0, 0,153,
- 0, 0, 1,128, 0, 0, 0, 35, 0, 0, 0, 40, 0, 0, 1,129, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 1,129, 0, 0, 0, 35,
- 0, 0, 0, 34, 0, 0, 1,130, 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 1,130, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1,131,
- 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 1,131, 0, 0, 0, 35, 0, 0, 0, 39, 0, 0, 1,132, 0, 0, 0, 35, 0, 0, 0,155,
- 0, 0, 1,132, 0, 0, 0, 35, 0, 0, 0, 40, 0, 0, 1,133, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 1,133, 0, 0, 0, 35,
- 0, 0, 0, 35, 0, 0, 1,134, 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 1,134, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1,135,
- 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 1,135, 0, 0, 0, 35, 0, 0, 0, 35, 0, 0, 1,136, 0, 0, 0, 35, 0, 0, 0,157,
- 0, 0, 1,136, 0, 0, 0, 35, 0, 0, 0, 40, 0, 0, 1,137, 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 1,137, 0, 0, 0, 35,
- 0, 0, 0, 40, 0, 0, 1,138, 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 1,138, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1,139,
- 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 1,139, 0, 0, 0, 35, 0, 0, 0, 36, 0, 0, 1,140, 0, 0, 0, 35, 0, 0, 0,159,
- 0, 0, 1,140, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1,141, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 1,141, 0, 0, 0, 35,
- 0, 0, 0, 36, 0, 0, 1,142, 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 1,142, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1,143,
- 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 1,143, 0, 0, 0, 35, 0, 0, 0, 37, 0, 0, 1,144, 0, 0, 0, 35, 0, 0, 0,161,
- 0, 0, 1,144, 0, 0, 0, 35, 0, 0, 0, 41, 0, 0, 1,145, 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 1,145, 0, 0, 0, 35,
- 0, 0, 0, 46, 0, 0, 1,146, 0, 0, 0, 35, 0, 0, 0,102, 0, 0, 1,146, 0, 0, 0, 35, 0, 0, 0, 43, 0, 0, 1,147,
- 0, 0, 0, 33, 0, 0, 0, 46, 0, 0, 1,147, 0, 0, 0, 33, 0, 0, 0, 43, 0, 0, 1,148, 0, 0, 0, 35, 0, 0, 0,102,
- 0, 0, 1,148, 0, 0, 0, 35, 0, 0, 0,102, 0, 0, 1,149, 0, 0, 0, 35, 0, 0, 0,103, 0, 0, 1,149, 0, 0, 0, 35,
- 0, 0, 0,103, 0, 0, 1,150, 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1,150, 0, 0, 0, 35, 0, 0, 0,102, 0, 0, 1,151,
- 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 1,152, 0, 0, 0, 33, 0, 0, 0, 47,
- 0, 0, 1,152, 0, 0, 0, 33, 0, 0, 0, 47, 0, 0, 1,153, 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1,153, 0, 0, 0, 35,
- 0, 0, 0, 45, 0, 0, 1,154, 0, 0, 0, 35, 0, 0, 0,104, 0, 0, 1,154, 0, 0, 0, 35, 0, 0, 0, 44, 0, 0, 1,155,
- 0, 0, 0, 35, 0, 0, 0,103, 0, 0, 1,155, 0, 0, 0, 35, 0, 0, 0, 42, 0, 0, 1,156, 0, 0, 0, 35, 0, 0, 0,103,
- 0, 0, 1,156, 0, 0, 0, 35, 0, 0, 0, 42, 0, 0, 1,157, 0, 0, 0, 33, 0, 0, 0, 44, 0, 0, 1,157, 0, 0, 0, 33,
- 0, 0, 0, 50, 0, 0, 1,158, 0, 0, 0, 35, 0, 0, 0,105, 0, 0, 1,158, 0, 0, 0, 35, 0, 0, 0, 43, 0, 0, 1,159,
- 0, 0, 0, 33, 0, 0, 0, 50, 0, 0, 1,159, 0, 0, 0, 33, 0, 0, 0, 43, 0, 0, 1,160, 0, 0, 0, 35, 0, 0, 0,105,
- 0, 0, 1,160, 0, 0, 0, 35, 0, 0, 0,105, 0, 0, 1,161, 0, 0, 0, 35, 0, 0, 0,106, 0, 0, 1,161, 0, 0, 0, 35,
- 0, 0, 0,106, 0, 0, 1,162, 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1,162, 0, 0, 0, 35, 0, 0, 0,105, 0, 0, 1,163,
- 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 1,164, 0, 0, 0, 33, 0, 0, 0, 51,
- 0, 0, 1,164, 0, 0, 0, 33, 0, 0, 0, 51, 0, 0, 1,165, 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1,165, 0, 0, 0, 35,
- 0, 0, 0, 49, 0, 0, 1,166, 0, 0, 0, 35, 0, 0, 0,107, 0, 0, 1,166, 0, 0, 0, 35, 0, 0, 0, 48, 0, 0, 1,167,
- 0, 0, 0, 35, 0, 0, 0,106, 0, 0, 1,167, 0, 0, 0, 35, 0, 0, 0, 42, 0, 0, 1,168, 0, 0, 0, 35, 0, 0, 0,106,
- 0, 0, 1,168, 0, 0, 0, 35, 0, 0, 0, 42, 0, 0, 1,169, 0, 0, 0, 33, 0, 0, 0, 48, 0, 0, 1,169, 0, 0, 0, 33,
- 0, 0, 0, 54, 0, 0, 1,170, 0, 0, 0, 35, 0, 0, 0,108, 0, 0, 1,170, 0, 0, 0, 35, 0, 0, 0, 45, 0, 0, 1,171,
- 0, 0, 0, 33, 0, 0, 0, 54, 0, 0, 1,171, 0, 0, 0, 33, 0, 0, 0, 45, 0, 0, 1,172, 0, 0, 0, 35, 0, 0, 0,108,
- 0, 0, 1,172, 0, 0, 0, 35, 0, 0, 0,108, 0, 0, 1,173, 0, 0, 0, 35, 0, 0, 0,109, 0, 0, 1,173, 0, 0, 0, 35,
- 0, 0, 0,109, 0, 0, 1,174, 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1,174, 0, 0, 0, 35, 0, 0, 0,108, 0, 0, 1,175,
- 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 0, 53, 0, 0, 1,176, 0, 0, 0, 33, 0, 0, 0, 55,
- 0, 0, 1,176, 0, 0, 0, 33, 0, 0, 0, 55, 0, 0, 1,177, 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1,177, 0, 0, 0, 35,
- 0, 0, 0, 53, 0, 0, 1,178, 0, 0, 0, 35, 0, 0, 0,110, 0, 0, 1,178, 0, 0, 0, 35, 0, 0, 0, 52, 0, 0, 1,179,
- 0, 0, 0, 35, 0, 0, 0,109, 0, 0, 1,179, 0, 0, 0, 35, 0, 0, 0, 44, 0, 0, 1,180, 0, 0, 0, 35, 0, 0, 0,109,
- 0, 0, 1,180, 0, 0, 0, 35, 0, 0, 0, 44, 0, 0, 1,181, 0, 0, 0, 33, 0, 0, 0, 52, 0, 0, 1,181, 0, 0, 0, 33,
- 0, 0, 0, 58, 0, 0, 1,182, 0, 0, 0, 35, 0, 0, 0,111, 0, 0, 1,182, 0, 0, 0, 35, 0, 0, 0, 53, 0, 0, 1,183,
- 0, 0, 0, 33, 0, 0, 0, 58, 0, 0, 1,183, 0, 0, 0, 33, 0, 0, 0, 53, 0, 0, 1,184, 0, 0, 0, 35, 0, 0, 0,111,
- 0, 0, 1,184, 0, 0, 0, 35, 0, 0, 0,111, 0, 0, 1,185, 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 1,185, 0, 0, 0, 35,
- 0, 0, 0,112, 0, 0, 1,186, 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1,186, 0, 0, 0, 35, 0, 0, 0,111, 0, 0, 1,187,
- 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 0, 57, 0, 0, 1,188, 0, 0, 0, 33, 0, 0, 0, 59,
- 0, 0, 1,188, 0, 0, 0, 33, 0, 0, 0, 59, 0, 0, 1,189, 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1,189, 0, 0, 0, 35,
- 0, 0, 0, 57, 0, 0, 1,190, 0, 0, 0, 35, 0, 0, 0,113, 0, 0, 1,190, 0, 0, 0, 35, 0, 0, 0, 56, 0, 0, 1,191,
- 0, 0, 0, 35, 0, 0, 0,112, 0, 0, 1,191, 0, 0, 0, 35, 0, 0, 0, 52, 0, 0, 1,192, 0, 0, 0, 35, 0, 0, 0,112,
- 0, 0, 1,192, 0, 0, 0, 35, 0, 0, 0, 52, 0, 0, 1,193, 0, 0, 0, 33, 0, 0, 0, 56, 0, 0, 1,193, 0, 0, 0, 33,
- 0, 0, 0, 60, 0, 0, 1,194, 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 1,194, 0, 0, 0, 35, 0, 0, 0, 57, 0, 0, 1,195,
- 0, 0, 0, 33, 0, 0, 0, 60, 0, 0, 1,195, 0, 0, 0, 33, 0, 0, 0, 57, 0, 0, 1,196, 0, 0, 0, 35, 0, 0, 0,114,
- 0, 0, 1,196, 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 1,197, 0, 0, 0, 35, 0, 0, 0,115, 0, 0, 1,197, 0, 0, 0, 35,
- 0, 0, 0,115, 0, 0, 1,198, 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1,198, 0, 0, 0, 35, 0, 0, 0,114, 0, 0, 1,199,
- 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 0, 49, 0, 0, 1,200, 0, 0, 0, 33, 0, 0, 0, 61,
- 0, 0, 1,200, 0, 0, 0, 33, 0, 0, 0, 61, 0, 0, 1,201, 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1,201, 0, 0, 0, 35,
- 0, 0, 0, 49, 0, 0, 1,202, 0, 0, 0, 35, 0, 0, 0,116, 0, 0, 1,202, 0, 0, 0, 35, 0, 0, 0, 48, 0, 0, 1,203,
- 0, 0, 0, 35, 0, 0, 0,115, 0, 0, 1,203, 0, 0, 0, 35, 0, 0, 0, 56, 0, 0, 1,204, 0, 0, 0, 35, 0, 0, 0,115,
- 0, 0, 1,204, 0, 0, 0, 35, 0, 0, 0, 48, 0, 0, 1,205, 0, 0, 0, 33, 0, 0, 0, 56, 0, 0, 1,205, 0, 0, 0, 33,
- 0, 0, 0, 64, 0, 0, 1,206, 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 1,206, 0, 0, 0, 35, 0, 0, 0, 50, 0, 0, 1,207,
- 0, 0, 0, 33, 0, 0, 0, 64, 0, 0, 1,207, 0, 0, 0, 33, 0, 0, 0, 50, 0, 0, 1,208, 0, 0, 0, 35, 0, 0, 0,117,
- 0, 0, 1,208, 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 1,209, 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 1,209, 0, 0, 0, 35,
- 0, 0, 0,118, 0, 0, 1,210, 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1,210, 0, 0, 0, 35, 0, 0, 0,117, 0, 0, 1,211,
- 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 0, 63, 0, 0, 1,212, 0, 0, 0, 33, 0, 0, 0, 65,
- 0, 0, 1,212, 0, 0, 0, 33, 0, 0, 0, 65, 0, 0, 1,213, 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1,213, 0, 0, 0, 35,
- 0, 0, 0, 63, 0, 0, 1,214, 0, 0, 0, 35, 0, 0, 0,119, 0, 0, 1,214, 0, 0, 0, 35, 0, 0, 0, 62, 0, 0, 1,215,
- 0, 0, 0, 35, 0, 0, 0,118, 0, 0, 1,215, 0, 0, 0, 35, 0, 0, 0, 51, 0, 0, 1,216, 0, 0, 0, 35, 0, 0, 0,118,
- 0, 0, 1,216, 0, 0, 0, 35, 0, 0, 0, 51, 0, 0, 1,217, 0, 0, 0, 33, 0, 0, 0, 62, 0, 0, 1,217, 0, 0, 0, 33,
- 0, 0, 0, 68, 0, 0, 1,218, 0, 0, 0, 35, 0, 0, 0,120, 0, 0, 1,218, 0, 0, 0, 35, 0, 0, 0, 47, 0, 0, 1,219,
- 0, 0, 0, 33, 0, 0, 0, 68, 0, 0, 1,219, 0, 0, 0, 33, 0, 0, 0, 47, 0, 0, 1,220, 0, 0, 0, 35, 0, 0, 0,120,
- 0, 0, 1,220, 0, 0, 0, 35, 0, 0, 0,120, 0, 0, 1,221, 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 1,221, 0, 0, 0, 35,
- 0, 0, 0,121, 0, 0, 1,222, 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1,222, 0, 0, 0, 35, 0, 0, 0,120, 0, 0, 1,223,
- 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 0, 67, 0, 0, 1,224, 0, 0, 0, 33, 0, 0, 0, 69,
- 0, 0, 1,224, 0, 0, 0, 33, 0, 0, 0, 69, 0, 0, 1,225, 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1,225, 0, 0, 0, 35,
- 0, 0, 0, 67, 0, 0, 1,226, 0, 0, 0, 35, 0, 0, 0,122, 0, 0, 1,226, 0, 0, 0, 35, 0, 0, 0, 66, 0, 0, 1,227,
- 0, 0, 0, 35, 0, 0, 0,121, 0, 0, 1,227, 0, 0, 0, 35, 0, 0, 0, 46, 0, 0, 1,228, 0, 0, 0, 35, 0, 0, 0,121,
- 0, 0, 1,228, 0, 0, 0, 35, 0, 0, 0, 46, 0, 0, 1,229, 0, 0, 0, 33, 0, 0, 0, 66, 0, 0, 1,229, 0, 0, 0, 33,
- 0, 0, 0, 72, 0, 0, 1,230, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 1,230, 0, 0, 0, 35, 0, 0, 0, 55, 0, 0, 1,231,
- 0, 0, 0, 33, 0, 0, 0, 72, 0, 0, 1,231, 0, 0, 0, 33, 0, 0, 0, 55, 0, 0, 1,232, 0, 0, 0, 35, 0, 0, 0,123,
- 0, 0, 1,232, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 1,233, 0, 0, 0, 35, 0, 0, 0,124, 0, 0, 1,233, 0, 0, 0, 35,
- 0, 0, 0,124, 0, 0, 1,234, 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1,234, 0, 0, 0, 35, 0, 0, 0,123, 0, 0, 1,235,
- 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 0, 71, 0, 0, 1,236, 0, 0, 0, 33, 0, 0, 0, 73,
- 0, 0, 1,236, 0, 0, 0, 33, 0, 0, 0, 73, 0, 0, 1,237, 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1,237, 0, 0, 0, 35,
- 0, 0, 0, 71, 0, 0, 1,238, 0, 0, 0, 35, 0, 0, 0,125, 0, 0, 1,238, 0, 0, 0, 35, 0, 0, 0, 70, 0, 0, 1,239,
- 0, 0, 0, 35, 0, 0, 0,124, 0, 0, 1,239, 0, 0, 0, 35, 0, 0, 0, 54, 0, 0, 1,240, 0, 0, 0, 35, 0, 0, 0,124,
- 0, 0, 1,240, 0, 0, 0, 35, 0, 0, 0, 54, 0, 0, 1,241, 0, 0, 0, 33, 0, 0, 0, 70, 0, 0, 1,241, 0, 0, 0, 33,
- 0, 0, 0, 76, 0, 0, 1,242, 0, 0, 0, 35, 0, 0, 0,126, 0, 0, 1,242, 0, 0, 0, 35, 0, 0, 0, 59, 0, 0, 1,243,
- 0, 0, 0, 33, 0, 0, 0, 76, 0, 0, 1,243, 0, 0, 0, 33, 0, 0, 0, 59, 0, 0, 1,244, 0, 0, 0, 35, 0, 0, 0,126,
- 0, 0, 1,244, 0, 0, 0, 35, 0, 0, 0,126, 0, 0, 1,245, 0, 0, 0, 35, 0, 0, 0,127, 0, 0, 1,245, 0, 0, 0, 35,
- 0, 0, 0,127, 0, 0, 1,246, 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1,246, 0, 0, 0, 35, 0, 0, 0,126, 0, 0, 1,247,
- 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 0, 75, 0, 0, 1,248, 0, 0, 0, 33, 0, 0, 0, 77,
- 0, 0, 1,248, 0, 0, 0, 33, 0, 0, 0, 77, 0, 0, 1,249, 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1,249, 0, 0, 0, 35,
- 0, 0, 0, 75, 0, 0, 1,250, 0, 0, 0, 35, 0, 0, 0,128, 0, 0, 1,250, 0, 0, 0, 35, 0, 0, 0, 74, 0, 0, 1,251,
- 0, 0, 0, 35, 0, 0, 0,127, 0, 0, 1,251, 0, 0, 0, 35, 0, 0, 0, 58, 0, 0, 1,252, 0, 0, 0, 35, 0, 0, 0,127,
- 0, 0, 1,252, 0, 0, 0, 35, 0, 0, 0, 58, 0, 0, 1,253, 0, 0, 0, 33, 0, 0, 0, 74, 0, 0, 1,253, 0, 0, 0, 33,
- 0, 0, 0, 80, 0, 0, 1,254, 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 1,254, 0, 0, 0, 35, 0, 0, 0, 61, 0, 0, 1,255,
- 0, 0, 0, 33, 0, 0, 0, 80, 0, 0, 1,255, 0, 0, 0, 33, 0, 0, 0, 61, 0, 0, 2, 0, 0, 0, 0, 35, 0, 0, 0,129,
- 0, 0, 2, 0, 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 2, 1, 0, 0, 0, 35, 0, 0, 0,130, 0, 0, 2, 1, 0, 0, 0, 35,
- 0, 0, 0,130, 0, 0, 2, 2, 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 2, 2, 0, 0, 0, 35, 0, 0, 0,129, 0, 0, 2, 3,
- 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 0, 79, 0, 0, 2, 4, 0, 0, 0, 33, 0, 0, 0, 81,
- 0, 0, 2, 4, 0, 0, 0, 33, 0, 0, 0, 81, 0, 0, 2, 5, 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 2, 5, 0, 0, 0, 35,
- 0, 0, 0, 79, 0, 0, 2, 6, 0, 0, 0, 35, 0, 0, 0,131, 0, 0, 2, 6, 0, 0, 0, 35, 0, 0, 0, 78, 0, 0, 2, 7,
- 0, 0, 0, 35, 0, 0, 0,130, 0, 0, 2, 7, 0, 0, 0, 35, 0, 0, 0, 60, 0, 0, 2, 8, 0, 0, 0, 35, 0, 0, 0,130,
- 0, 0, 2, 8, 0, 0, 0, 35, 0, 0, 0, 60, 0, 0, 2, 9, 0, 0, 0, 33, 0, 0, 0, 78, 0, 0, 2, 9, 0, 0, 0, 33,
- 0, 0, 0, 83, 0, 0, 2, 10, 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 2, 10, 0, 0, 0, 35, 0, 0, 0, 65, 0, 0, 2, 11,
- 0, 0, 0, 33, 0, 0, 0, 83, 0, 0, 2, 11, 0, 0, 0, 33, 0, 0, 0, 65, 0, 0, 2, 12, 0, 0, 0, 35, 0, 0, 0,132,
- 0, 0, 2, 12, 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 2, 13, 0, 0, 0, 35, 0, 0, 0,133, 0, 0, 2, 13, 0, 0, 0, 35,
- 0, 0, 0,133, 0, 0, 2, 14, 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 2, 14, 0, 0, 0, 35, 0, 0, 0,132, 0, 0, 2, 15,
- 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 0, 67, 0, 0, 2, 16, 0, 0, 0, 33, 0, 0, 0, 82,
- 0, 0, 2, 16, 0, 0, 0, 33, 0, 0, 0, 82, 0, 0, 2, 17, 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 2, 17, 0, 0, 0, 35,
- 0, 0, 0, 67, 0, 0, 2, 18, 0, 0, 0, 35, 0, 0, 0,134, 0, 0, 2, 18, 0, 0, 0, 35, 0, 0, 0, 66, 0, 0, 2, 19,
- 0, 0, 0, 35, 0, 0, 0,133, 0, 0, 2, 19, 0, 0, 0, 35, 0, 0, 0, 64, 0, 0, 2, 20, 0, 0, 0, 35, 0, 0, 0,133,
- 0, 0, 2, 20, 0, 0, 0, 35, 0, 0, 0, 64, 0, 0, 2, 21, 0, 0, 0, 33, 0, 0, 0, 66, 0, 0, 2, 21, 0, 0, 0, 33,
- 0, 0, 0, 84, 0, 0, 2, 22, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 2, 22, 0, 0, 0, 35, 0, 0, 0, 69, 0, 0, 2, 23,
- 0, 0, 0, 33, 0, 0, 0, 84, 0, 0, 2, 23, 0, 0, 0, 33, 0, 0, 0, 69, 0, 0, 2, 24, 0, 0, 0, 35, 0, 0, 0,135,
- 0, 0, 2, 24, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 2, 25, 0, 0, 0, 35, 0, 0, 0,136, 0, 0, 2, 25, 0, 0, 0, 35,
- 0, 0, 0,136, 0, 0, 2, 26, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 2, 26, 0, 0, 0, 35, 0, 0, 0,135, 0, 0, 2, 27,
- 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 0, 71, 0, 0, 2, 28, 0, 0, 0, 33, 0, 0, 0, 85,
- 0, 0, 2, 28, 0, 0, 0, 33, 0, 0, 0, 85, 0, 0, 2, 29, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 2, 29, 0, 0, 0, 35,
- 0, 0, 0, 71, 0, 0, 2, 30, 0, 0, 0, 35, 0, 0, 0,137, 0, 0, 2, 30, 0, 0, 0, 35, 0, 0, 0, 70, 0, 0, 2, 31,
- 0, 0, 0, 35, 0, 0, 0,136, 0, 0, 2, 31, 0, 0, 0, 35, 0, 0, 0, 68, 0, 0, 2, 32, 0, 0, 0, 35, 0, 0, 0,136,
- 0, 0, 2, 32, 0, 0, 0, 35, 0, 0, 0, 68, 0, 0, 2, 33, 0, 0, 0, 33, 0, 0, 0, 70, 0, 0, 2, 33, 0, 0, 0, 33,
- 0, 0, 0, 86, 0, 0, 2, 34, 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 2, 34, 0, 0, 0, 35, 0, 0, 0, 73, 0, 0, 2, 35,
- 0, 0, 0, 33, 0, 0, 0, 86, 0, 0, 2, 35, 0, 0, 0, 33, 0, 0, 0, 73, 0, 0, 2, 36, 0, 0, 0, 35, 0, 0, 0,138,
- 0, 0, 2, 36, 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 2, 37, 0, 0, 0, 35, 0, 0, 0,139, 0, 0, 2, 37, 0, 0, 0, 35,
- 0, 0, 0,139, 0, 0, 2, 38, 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 2, 38, 0, 0, 0, 35, 0, 0, 0,138, 0, 0, 2, 39,
- 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 0, 75, 0, 0, 2, 40, 0, 0, 0, 33, 0, 0, 0, 87,
- 0, 0, 2, 40, 0, 0, 0, 33, 0, 0, 0, 87, 0, 0, 2, 41, 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 2, 41, 0, 0, 0, 35,
- 0, 0, 0, 75, 0, 0, 2, 42, 0, 0, 0, 35, 0, 0, 0,140, 0, 0, 2, 42, 0, 0, 0, 35, 0, 0, 0, 74, 0, 0, 2, 43,
- 0, 0, 0, 35, 0, 0, 0,139, 0, 0, 2, 43, 0, 0, 0, 35, 0, 0, 0, 72, 0, 0, 2, 44, 0, 0, 0, 35, 0, 0, 0,139,
- 0, 0, 2, 44, 0, 0, 0, 35, 0, 0, 0, 72, 0, 0, 2, 45, 0, 0, 0, 33, 0, 0, 0, 74, 0, 0, 2, 45, 0, 0, 0, 33,
- 0, 0, 0, 88, 0, 0, 2, 46, 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 2, 46, 0, 0, 0, 35, 0, 0, 0, 77, 0, 0, 2, 47,
- 0, 0, 0, 33, 0, 0, 0, 88, 0, 0, 2, 47, 0, 0, 0, 33, 0, 0, 0, 77, 0, 0, 2, 48, 0, 0, 0, 35, 0, 0, 0,141,
- 0, 0, 2, 48, 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 2, 49, 0, 0, 0, 35, 0, 0, 0,142, 0, 0, 2, 49, 0, 0, 0, 35,
- 0, 0, 0,142, 0, 0, 2, 50, 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 2, 50, 0, 0, 0, 35, 0, 0, 0,141, 0, 0, 2, 51,
- 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 0, 79, 0, 0, 2, 52, 0, 0, 0, 33, 0, 0, 0, 89,
- 0, 0, 2, 52, 0, 0, 0, 33, 0, 0, 0, 89, 0, 0, 2, 53, 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 2, 53, 0, 0, 0, 35,
- 0, 0, 0, 79, 0, 0, 2, 54, 0, 0, 0, 35, 0, 0, 0,143, 0, 0, 2, 54, 0, 0, 0, 35, 0, 0, 0, 78, 0, 0, 2, 55,
- 0, 0, 0, 35, 0, 0, 0,142, 0, 0, 2, 55, 0, 0, 0, 35, 0, 0, 0, 76, 0, 0, 2, 56, 0, 0, 0, 35, 0, 0, 0,142,
- 0, 0, 2, 56, 0, 0, 0, 35, 0, 0, 0, 76, 0, 0, 2, 57, 0, 0, 0, 33, 0, 0, 0, 78, 0, 0, 2, 57, 0, 0, 0, 33,
- 0, 0, 0, 90, 0, 0, 2, 58, 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 2, 58, 0, 0, 0, 35, 0, 0, 0, 81, 0, 0, 2, 59,
- 0, 0, 0, 33, 0, 0, 0, 90, 0, 0, 2, 59, 0, 0, 0, 33, 0, 0, 0, 81, 0, 0, 2, 60, 0, 0, 0, 35, 0, 0, 0,144,
- 0, 0, 2, 60, 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 2, 61, 0, 0, 0, 35, 0, 0, 0,145, 0, 0, 2, 61, 0, 0, 0, 35,
- 0, 0, 0,145, 0, 0, 2, 62, 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 2, 62, 0, 0, 0, 35, 0, 0, 0,144, 0, 0, 2, 63,
- 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 0, 63, 0, 0, 2, 64, 0, 0, 0, 33, 0, 0, 0, 91,
- 0, 0, 2, 64, 0, 0, 0, 33, 0, 0, 0, 91, 0, 0, 2, 65, 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 2, 65, 0, 0, 0, 35,
- 0, 0, 0, 63, 0, 0, 2, 66, 0, 0, 0, 35, 0, 0, 0,146, 0, 0, 2, 66, 0, 0, 0, 35, 0, 0, 0, 62, 0, 0, 2, 67,
- 0, 0, 0, 35, 0, 0, 0,145, 0, 0, 2, 67, 0, 0, 0, 35, 0, 0, 0, 80, 0, 0, 2, 68, 0, 0, 0, 35, 0, 0, 0,145,
- 0, 0, 2, 68, 0, 0, 0, 35, 0, 0, 0, 62, 0, 0, 2, 69, 0, 0, 0, 33, 0, 0, 0, 80, 0, 0, 2, 69, 0, 0, 0, 33,
- 0, 0, 0, 94, 0, 0, 2, 70, 0, 0, 0, 35, 0, 0, 0,147, 0, 0, 2, 70, 0, 0, 0, 35, 0, 0, 0, 82, 0, 0, 2, 71,
- 0, 0, 0, 33, 0, 0, 0, 94, 0, 0, 2, 71, 0, 0, 0, 33, 0, 0, 0, 82, 0, 0, 2, 72, 0, 0, 0, 35, 0, 0, 0,147,
- 0, 0, 2, 72, 0, 0, 0, 35, 0, 0, 0,147, 0, 0, 2, 73, 0, 0, 0, 35, 0, 0, 0,148, 0, 0, 2, 73, 0, 0, 0, 35,
- 0, 0, 0,148, 0, 0, 2, 74, 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 2, 74, 0, 0, 0, 35, 0, 0, 0,147, 0, 0, 2, 75,
- 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 0, 93, 0, 0, 2, 76, 0, 0, 0, 33, 0, 0, 0, 95,
- 0, 0, 2, 76, 0, 0, 0, 33, 0, 0, 0, 95, 0, 0, 2, 77, 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 2, 77, 0, 0, 0, 35,
- 0, 0, 0, 93, 0, 0, 2, 78, 0, 0, 0, 35, 0, 0, 0,149, 0, 0, 2, 78, 0, 0, 0, 35, 0, 0, 0, 92, 0, 0, 2, 79,
- 0, 0, 0, 35, 0, 0, 0,148, 0, 0, 2, 79, 0, 0, 0, 35, 0, 0, 0, 83, 0, 0, 2, 80, 0, 0, 0, 35, 0, 0, 0,148,
- 0, 0, 2, 80, 0, 0, 0, 35, 0, 0, 0, 83, 0, 0, 2, 81, 0, 0, 0, 33, 0, 0, 0, 92, 0, 0, 2, 81, 0, 0, 0, 33,
- 0, 0, 0, 96, 0, 0, 2, 82, 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 2, 82, 0, 0, 0, 35, 0, 0, 0, 85, 0, 0, 2, 83,
- 0, 0, 0, 33, 0, 0, 0, 96, 0, 0, 2, 83, 0, 0, 0, 33, 0, 0, 0, 85, 0, 0, 2, 84, 0, 0, 0, 35, 0, 0, 0,150,
- 0, 0, 2, 84, 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 2, 85, 0, 0, 0, 35, 0, 0, 0,151, 0, 0, 2, 85, 0, 0, 0, 35,
- 0, 0, 0,151, 0, 0, 2, 86, 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 2, 86, 0, 0, 0, 35, 0, 0, 0,150, 0, 0, 2, 87,
- 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 0, 95, 0, 0, 2, 88, 0, 0, 0, 33, 0, 0, 0, 97,
- 0, 0, 2, 88, 0, 0, 0, 33, 0, 0, 0, 97, 0, 0, 2, 89, 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 2, 89, 0, 0, 0, 35,
- 0, 0, 0, 95, 0, 0, 2, 90, 0, 0, 0, 35, 0, 0, 0,152, 0, 0, 2, 90, 0, 0, 0, 35, 0, 0, 0, 94, 0, 0, 2, 91,
- 0, 0, 0, 35, 0, 0, 0,151, 0, 0, 2, 91, 0, 0, 0, 35, 0, 0, 0, 84, 0, 0, 2, 92, 0, 0, 0, 35, 0, 0, 0,151,
- 0, 0, 2, 92, 0, 0, 0, 35, 0, 0, 0, 84, 0, 0, 2, 93, 0, 0, 0, 33, 0, 0, 0, 94, 0, 0, 2, 93, 0, 0, 0, 33,
- 0, 0, 0, 98, 0, 0, 2, 94, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 2, 94, 0, 0, 0, 35, 0, 0, 0, 87, 0, 0, 2, 95,
- 0, 0, 0, 33, 0, 0, 0, 98, 0, 0, 2, 95, 0, 0, 0, 33, 0, 0, 0, 87, 0, 0, 2, 96, 0, 0, 0, 35, 0, 0, 0,153,
- 0, 0, 2, 96, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 2, 97, 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 2, 97, 0, 0, 0, 35,
- 0, 0, 0,154, 0, 0, 2, 98, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 2, 98, 0, 0, 0, 35, 0, 0, 0,153, 0, 0, 2, 99,
- 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 0, 97, 0, 0, 2,100, 0, 0, 0, 33, 0, 0, 0, 99,
- 0, 0, 2,100, 0, 0, 0, 33, 0, 0, 0, 99, 0, 0, 2,101, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 2,101, 0, 0, 0, 35,
- 0, 0, 0, 97, 0, 0, 2,102, 0, 0, 0, 35, 0, 0, 0,155, 0, 0, 2,102, 0, 0, 0, 35, 0, 0, 0, 96, 0, 0, 2,103,
- 0, 0, 0, 35, 0, 0, 0,154, 0, 0, 2,103, 0, 0, 0, 35, 0, 0, 0, 86, 0, 0, 2,104, 0, 0, 0, 35, 0, 0, 0,154,
- 0, 0, 2,104, 0, 0, 0, 35, 0, 0, 0, 86, 0, 0, 2,105, 0, 0, 0, 33, 0, 0, 0, 96, 0, 0, 2,105, 0, 0, 0, 33,
- 0, 0, 0,100, 0, 0, 2,106, 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 2,106, 0, 0, 0, 35, 0, 0, 0, 89, 0, 0, 2,107,
- 0, 0, 0, 33, 0, 0, 0,100, 0, 0, 2,107, 0, 0, 0, 33, 0, 0, 0, 89, 0, 0, 2,108, 0, 0, 0, 35, 0, 0, 0,156,
- 0, 0, 2,108, 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 2,109, 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 2,109, 0, 0, 0, 35,
- 0, 0, 0,157, 0, 0, 2,110, 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 2,110, 0, 0, 0, 35, 0, 0, 0,156, 0, 0, 2,111,
- 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 0, 99, 0, 0, 2,112, 0, 0, 0, 33, 0, 0, 0,101,
- 0, 0, 2,112, 0, 0, 0, 33, 0, 0, 0,101, 0, 0, 2,113, 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 2,113, 0, 0, 0, 35,
- 0, 0, 0, 99, 0, 0, 2,114, 0, 0, 0, 35, 0, 0, 0,158, 0, 0, 2,114, 0, 0, 0, 35, 0, 0, 0, 98, 0, 0, 2,115,
- 0, 0, 0, 35, 0, 0, 0,157, 0, 0, 2,115, 0, 0, 0, 35, 0, 0, 0, 88, 0, 0, 2,116, 0, 0, 0, 35, 0, 0, 0,157,
- 0, 0, 2,116, 0, 0, 0, 35, 0, 0, 0, 88, 0, 0, 2,117, 0, 0, 0, 33, 0, 0, 0, 98, 0, 0, 2,117, 0, 0, 0, 33,
- 0, 0, 0, 92, 0, 0, 2,118, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 2,118, 0, 0, 0, 35, 0, 0, 0, 91, 0, 0, 2,119,
- 0, 0, 0, 33, 0, 0, 0, 92, 0, 0, 2,119, 0, 0, 0, 33, 0, 0, 0, 91, 0, 0, 2,120, 0, 0, 0, 35, 0, 0, 0,159,
- 0, 0, 2,120, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 2,121, 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 2,121, 0, 0, 0, 35,
- 0, 0, 0,160, 0, 0, 2,122, 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 2,122, 0, 0, 0, 35, 0, 0, 0,159, 0, 0, 2,123,
- 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 0, 93, 0, 0, 2,124, 0, 0, 0, 33, 0, 0, 0,101,
- 0, 0, 2,124, 0, 0, 0, 33, 0, 0, 0, 93, 0, 0, 2,125, 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 2,125, 0, 0, 0, 35,
- 0, 0, 0,101, 0, 0, 2,126, 0, 0, 0, 35, 0, 0, 0,161, 0, 0, 2,126, 0, 0, 0, 35, 0, 0, 0,100, 0, 0, 2,127,
- 0, 0, 0, 35, 0, 0, 0,160, 0, 0, 2,127, 0, 0, 0, 35, 0, 0, 0, 90, 0, 0, 2,128, 0, 0, 0, 35, 0, 0, 0,160,
- 0, 0, 2,128, 0, 0, 0, 35, 0, 0, 0, 90, 0, 0, 2,129, 0, 0, 0, 33, 0, 0, 0,100, 0, 0, 2,129, 0, 0, 0, 33,
- 0, 0, 1, 27, 0, 0, 1,146, 0, 0, 0, 35, 0, 0, 0,171, 0, 0, 1,146, 0, 0, 0, 35, 0, 0, 0,171, 0, 0, 1, 27,
- 0, 0, 0, 35, 0, 0, 1,146, 0, 0, 1,147, 0, 0, 0, 35, 0, 0, 1,146, 0, 0, 1,148, 0, 0, 0, 35, 0, 0, 1,147,
- 0, 0, 1,148, 0, 0, 0, 35, 0, 0, 0,165, 0, 0, 1, 26, 0, 0, 0, 35, 0, 0, 0,165, 0, 0, 1,148, 0, 0, 0, 35,
- 0, 0, 1, 26, 0, 0, 1,148, 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 1,147, 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 0,170,
- 0, 0, 0, 35, 0, 0, 0,170, 0, 0, 1,147, 0, 0, 0, 35, 0, 0, 1, 26, 0, 0, 1,149, 0, 0, 0, 35, 0, 0, 1, 28,
- 0, 0, 1,149, 0, 0, 0, 35, 0, 0, 1, 26, 0, 0, 1, 28, 0, 0, 0, 35, 0, 0, 1,149, 0, 0, 1,150, 0, 0, 0, 35,
- 0, 0, 1,149, 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 1,150, 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 1, 27, 0, 0, 1, 31,
- 0, 0, 0, 35, 0, 0, 1, 31, 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 1, 27, 0, 0, 1,151, 0, 0, 0, 35, 0, 0, 1, 30,
- 0, 0, 1,150, 0, 0, 0, 35, 0, 0, 1, 29, 0, 0, 1, 30, 0, 0, 0, 35, 0, 0, 1, 29, 0, 0, 1,150, 0, 0, 0, 35,
- 0, 0, 0,168, 0, 0, 1,152, 0, 0, 0, 35, 0, 0, 0,172, 0, 0, 1,152, 0, 0, 0, 35, 0, 0, 0,168, 0, 0, 0,172,
- 0, 0, 0, 35, 0, 0, 1,152, 0, 0, 1,153, 0, 0, 0, 35, 0, 0, 1,152, 0, 0, 1,154, 0, 0, 0, 35, 0, 0, 1,153,
- 0, 0, 1,154, 0, 0, 0, 35, 0, 0, 0,169, 0, 0, 1, 30, 0, 0, 0, 35, 0, 0, 1, 30, 0, 0, 1,154, 0, 0, 0, 35,
- 0, 0, 0,169, 0, 0, 1,154, 0, 0, 0, 35, 0, 0, 1, 31, 0, 0, 1,153, 0, 0, 0, 35, 0, 0, 0,173, 0, 0, 1, 31,
- 0, 0, 0, 35, 0, 0, 0,173, 0, 0, 1,153, 0, 0, 0, 35, 0, 0, 0,167, 0, 0, 1,155, 0, 0, 0, 35, 0, 0, 1, 29,
- 0, 0, 1,155, 0, 0, 0, 35, 0, 0, 0,167, 0, 0, 1, 29, 0, 0, 0, 35, 0, 0, 1,155, 0, 0, 1,156, 0, 0, 0, 35,
- 0, 0, 1,155, 0, 0, 1,157, 0, 0, 0, 35, 0, 0, 1,156, 0, 0, 1,157, 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 0,166,
- 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 1,157, 0, 0, 0, 35, 0, 0, 0,166, 0, 0, 1,157, 0, 0, 0, 35, 0, 0, 0,163,
- 0, 0, 1,156, 0, 0, 0, 35, 0, 0, 0,163, 0, 0, 1, 28, 0, 0, 0, 35, 0, 0, 1, 28, 0, 0, 1,156, 0, 0, 0, 35,
- 0, 0, 1, 33, 0, 0, 1,158, 0, 0, 0, 35, 0, 0, 0,179, 0, 0, 1, 33, 0, 0, 0, 35, 0, 0, 0,179, 0, 0, 1,158,
- 0, 0, 0, 35, 0, 0, 1,158, 0, 0, 1,159, 0, 0, 0, 35, 0, 0, 1,159, 0, 0, 1,160, 0, 0, 0, 35, 0, 0, 1,158,
- 0, 0, 1,160, 0, 0, 0, 35, 0, 0, 0,165, 0, 0, 1, 32, 0, 0, 0, 35, 0, 0, 1, 32, 0, 0, 1,160, 0, 0, 0, 35,
- 0, 0, 0,165, 0, 0, 1,160, 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 1,159, 0, 0, 0, 35, 0, 0, 0,178, 0, 0, 1,159,
- 0, 0, 0, 35, 0, 0, 0,164, 0, 0, 0,178, 0, 0, 0, 35, 0, 0, 1, 32, 0, 0, 1,161, 0, 0, 0, 35, 0, 0, 1, 32,
- 0, 0, 1, 34, 0, 0, 0, 35, 0, 0, 1, 34, 0, 0, 1,161, 0, 0, 0, 35, 0, 0, 1,161, 0, 0, 1,162, 0, 0, 0, 35,
- 0, 0, 1,162, 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 1,161, 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 1, 33, 0, 0, 1, 37,
- 0, 0, 0, 35, 0, 0, 1, 33, 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 1, 37, 0, 0, 1,163, 0, 0, 0, 35, 0, 0, 1, 36,
- 0, 0, 1,162, 0, 0, 0, 35, 0, 0, 1, 35, 0, 0, 1,162, 0, 0, 0, 35, 0, 0, 1, 35, 0, 0, 1, 36, 0, 0, 0, 35,
- 0, 0, 0,176, 0, 0, 1,164, 0, 0, 0, 35, 0, 0, 0,176, 0, 0, 0,180, 0, 0, 0, 35, 0, 0, 0,180, 0, 0, 1,164,
- 0, 0, 0, 35, 0, 0, 1,164, 0, 0, 1,165, 0, 0, 0, 35, 0, 0, 1,165, 0, 0, 1,166, 0, 0, 0, 35, 0, 0, 1,164,
- 0, 0, 1,166, 0, 0, 0, 35, 0, 0, 0,177, 0, 0, 1, 36, 0, 0, 0, 35, 0, 0, 0,177, 0, 0, 1,166, 0, 0, 0, 35,
- 0, 0, 1, 36, 0, 0, 1,166, 0, 0, 0, 35, 0, 0, 1, 37, 0, 0, 1,165, 0, 0, 0, 35, 0, 0, 0,181, 0, 0, 1,165,
- 0, 0, 0, 35, 0, 0, 0,181, 0, 0, 1, 37, 0, 0, 0, 35, 0, 0, 0,175, 0, 0, 1,167, 0, 0, 0, 35, 0, 0, 0,175,
- 0, 0, 1, 35, 0, 0, 0, 35, 0, 0, 1, 35, 0, 0, 1,167, 0, 0, 0, 35, 0, 0, 1,167, 0, 0, 1,168, 0, 0, 0, 35,
- 0, 0, 1,168, 0, 0, 1,169, 0, 0, 0, 35, 0, 0, 1,167, 0, 0, 1,169, 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 0,174,
- 0, 0, 0, 35, 0, 0, 0,174, 0, 0, 1,169, 0, 0, 0, 35, 0, 0, 0,162, 0, 0, 1,169, 0, 0, 0, 35, 0, 0, 0,163,
- 0, 0, 1,168, 0, 0, 0, 35, 0, 0, 1, 34, 0, 0, 1,168, 0, 0, 0, 35, 0, 0, 0,163, 0, 0, 1, 34, 0, 0, 0, 35,
- 0, 0, 1, 39, 0, 0, 1,170, 0, 0, 0, 35, 0, 0, 0,187, 0, 0, 1,170, 0, 0, 0, 35, 0, 0, 0,187, 0, 0, 1, 39,
- 0, 0, 0, 35, 0, 0, 1,170, 0, 0, 1,171, 0, 0, 0, 35, 0, 0, 1,170, 0, 0, 1,172, 0, 0, 0, 35, 0, 0, 1,171,
- 0, 0, 1,172, 0, 0, 0, 35, 0, 0, 0,169, 0, 0, 1, 38, 0, 0, 0, 35, 0, 0, 0,169, 0, 0, 1,172, 0, 0, 0, 35,
- 0, 0, 1, 38, 0, 0, 1,172, 0, 0, 0, 35, 0, 0, 0,168, 0, 0, 1,171, 0, 0, 0, 35, 0, 0, 0,168, 0, 0, 0,186,
- 0, 0, 0, 35, 0, 0, 0,186, 0, 0, 1,171, 0, 0, 0, 35, 0, 0, 1, 38, 0, 0, 1,173, 0, 0, 0, 35, 0, 0, 1, 40,
- 0, 0, 1,173, 0, 0, 0, 35, 0, 0, 1, 38, 0, 0, 1, 40, 0, 0, 0, 35, 0, 0, 1,173, 0, 0, 1,174, 0, 0, 0, 35,
- 0, 0, 1,173, 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 1,174, 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 1, 39, 0, 0, 1, 43,
- 0, 0, 0, 35, 0, 0, 1, 43, 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 1, 39, 0, 0, 1,175, 0, 0, 0, 35, 0, 0, 1, 42,
- 0, 0, 1,174, 0, 0, 0, 35, 0, 0, 1, 41, 0, 0, 1, 42, 0, 0, 0, 35, 0, 0, 1, 41, 0, 0, 1,174, 0, 0, 0, 35,
- 0, 0, 0,184, 0, 0, 1,176, 0, 0, 0, 35, 0, 0, 0,188, 0, 0, 1,176, 0, 0, 0, 35, 0, 0, 0,184, 0, 0, 0,188,
- 0, 0, 0, 35, 0, 0, 1,176, 0, 0, 1,177, 0, 0, 0, 35, 0, 0, 1,176, 0, 0, 1,178, 0, 0, 0, 35, 0, 0, 1,177,
- 0, 0, 1,178, 0, 0, 0, 35, 0, 0, 0,185, 0, 0, 1, 42, 0, 0, 0, 35, 0, 0, 1, 42, 0, 0, 1,178, 0, 0, 0, 35,
- 0, 0, 0,185, 0, 0, 1,178, 0, 0, 0, 35, 0, 0, 1, 43, 0, 0, 1,177, 0, 0, 0, 35, 0, 0, 0,189, 0, 0, 1, 43,
- 0, 0, 0, 35, 0, 0, 0,189, 0, 0, 1,177, 0, 0, 0, 35, 0, 0, 0,183, 0, 0, 1,179, 0, 0, 0, 35, 0, 0, 1, 41,
- 0, 0, 1,179, 0, 0, 0, 35, 0, 0, 0,183, 0, 0, 1, 41, 0, 0, 0, 35, 0, 0, 1,179, 0, 0, 1,180, 0, 0, 0, 35,
- 0, 0, 1,179, 0, 0, 1,181, 0, 0, 0, 35, 0, 0, 1,180, 0, 0, 1,181, 0, 0, 0, 35, 0, 0, 0,166, 0, 0, 0,182,
- 0, 0, 0, 35, 0, 0, 0,166, 0, 0, 1,181, 0, 0, 0, 35, 0, 0, 0,182, 0, 0, 1,181, 0, 0, 0, 35, 0, 0, 0,167,
- 0, 0, 1,180, 0, 0, 0, 35, 0, 0, 0,167, 0, 0, 1, 40, 0, 0, 0, 35, 0, 0, 1, 40, 0, 0, 1,180, 0, 0, 0, 35,
- 0, 0, 1, 45, 0, 0, 1,182, 0, 0, 0, 35, 0, 0, 0,195, 0, 0, 1,182, 0, 0, 0, 35, 0, 0, 0,195, 0, 0, 1, 45,
- 0, 0, 0, 35, 0, 0, 1,182, 0, 0, 1,183, 0, 0, 0, 35, 0, 0, 1,182, 0, 0, 1,184, 0, 0, 0, 35, 0, 0, 1,183,
- 0, 0, 1,184, 0, 0, 0, 35, 0, 0, 0,185, 0, 0, 1, 44, 0, 0, 0, 35, 0, 0, 0,185, 0, 0, 1,184, 0, 0, 0, 35,
- 0, 0, 1, 44, 0, 0, 1,184, 0, 0, 0, 35, 0, 0, 0,184, 0, 0, 1,183, 0, 0, 0, 35, 0, 0, 0,184, 0, 0, 0,194,
- 0, 0, 0, 35, 0, 0, 0,194, 0, 0, 1,183, 0, 0, 0, 35, 0, 0, 1, 44, 0, 0, 1,185, 0, 0, 0, 35, 0, 0, 1, 46,
- 0, 0, 1,185, 0, 0, 0, 35, 0, 0, 1, 44, 0, 0, 1, 46, 0, 0, 0, 35, 0, 0, 1,185, 0, 0, 1,186, 0, 0, 0, 35,
- 0, 0, 1,185, 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 1,186, 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 1, 45, 0, 0, 1, 49,
- 0, 0, 0, 35, 0, 0, 1, 49, 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 1, 45, 0, 0, 1,187, 0, 0, 0, 35, 0, 0, 1, 48,
- 0, 0, 1,186, 0, 0, 0, 35, 0, 0, 1, 47, 0, 0, 1, 48, 0, 0, 0, 35, 0, 0, 1, 47, 0, 0, 1,186, 0, 0, 0, 35,
- 0, 0, 0,192, 0, 0, 1,188, 0, 0, 0, 35, 0, 0, 0,196, 0, 0, 1,188, 0, 0, 0, 35, 0, 0, 0,192, 0, 0, 0,196,
- 0, 0, 0, 35, 0, 0, 1,188, 0, 0, 1,189, 0, 0, 0, 35, 0, 0, 1,188, 0, 0, 1,190, 0, 0, 0, 35, 0, 0, 1,189,
- 0, 0, 1,190, 0, 0, 0, 35, 0, 0, 0,193, 0, 0, 1, 48, 0, 0, 0, 35, 0, 0, 1, 48, 0, 0, 1,190, 0, 0, 0, 35,
- 0, 0, 0,193, 0, 0, 1,190, 0, 0, 0, 35, 0, 0, 1, 49, 0, 0, 1,189, 0, 0, 0, 35, 0, 0, 0,197, 0, 0, 1, 49,
- 0, 0, 0, 35, 0, 0, 0,197, 0, 0, 1,189, 0, 0, 0, 35, 0, 0, 0,191, 0, 0, 1,191, 0, 0, 0, 35, 0, 0, 1, 47,
- 0, 0, 1,191, 0, 0, 0, 35, 0, 0, 0,191, 0, 0, 1, 47, 0, 0, 0, 35, 0, 0, 1,191, 0, 0, 1,192, 0, 0, 0, 35,
- 0, 0, 1,191, 0, 0, 1,193, 0, 0, 0, 35, 0, 0, 1,192, 0, 0, 1,193, 0, 0, 0, 35, 0, 0, 0,182, 0, 0, 0,190,
- 0, 0, 0, 35, 0, 0, 0,182, 0, 0, 1,193, 0, 0, 0, 35, 0, 0, 0,190, 0, 0, 1,193, 0, 0, 0, 35, 0, 0, 0,183,
- 0, 0, 1,192, 0, 0, 0, 35, 0, 0, 0,183, 0, 0, 1, 46, 0, 0, 0, 35, 0, 0, 1, 46, 0, 0, 1,192, 0, 0, 0, 35,
- 0, 0, 1, 51, 0, 0, 1,194, 0, 0, 0, 35, 0, 0, 0,199, 0, 0, 1,194, 0, 0, 0, 35, 0, 0, 0,199, 0, 0, 1, 51,
- 0, 0, 0, 35, 0, 0, 1,194, 0, 0, 1,195, 0, 0, 0, 35, 0, 0, 1,194, 0, 0, 1,196, 0, 0, 0, 35, 0, 0, 1,195,
- 0, 0, 1,196, 0, 0, 0, 35, 0, 0, 0,193, 0, 0, 1, 50, 0, 0, 0, 35, 0, 0, 0,193, 0, 0, 1,196, 0, 0, 0, 35,
- 0, 0, 1, 50, 0, 0, 1,196, 0, 0, 0, 35, 0, 0, 0,192, 0, 0, 1,195, 0, 0, 0, 35, 0, 0, 0,192, 0, 0, 0,198,
- 0, 0, 0, 35, 0, 0, 0,198, 0, 0, 1,195, 0, 0, 0, 35, 0, 0, 1, 50, 0, 0, 1,197, 0, 0, 0, 35, 0, 0, 1, 53,
- 0, 0, 1,197, 0, 0, 0, 35, 0, 0, 1, 50, 0, 0, 1, 53, 0, 0, 0, 35, 0, 0, 1,197, 0, 0, 1,198, 0, 0, 0, 35,
- 0, 0, 1,197, 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 1,198, 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 1, 51, 0, 0, 1, 55,
- 0, 0, 0, 35, 0, 0, 1, 55, 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 1, 51, 0, 0, 1,199, 0, 0, 0, 35, 0, 0, 1, 54,
- 0, 0, 1,198, 0, 0, 0, 35, 0, 0, 1, 52, 0, 0, 1, 54, 0, 0, 0, 35, 0, 0, 1, 52, 0, 0, 1,198, 0, 0, 0, 35,
- 0, 0, 0,176, 0, 0, 1,200, 0, 0, 0, 35, 0, 0, 0,200, 0, 0, 1,200, 0, 0, 0, 35, 0, 0, 0,176, 0, 0, 0,200,
- 0, 0, 0, 35, 0, 0, 1,200, 0, 0, 1,201, 0, 0, 0, 35, 0, 0, 1,200, 0, 0, 1,202, 0, 0, 0, 35, 0, 0, 1,201,
- 0, 0, 1,202, 0, 0, 0, 35, 0, 0, 0,177, 0, 0, 1, 54, 0, 0, 0, 35, 0, 0, 1, 54, 0, 0, 1,202, 0, 0, 0, 35,
- 0, 0, 0,177, 0, 0, 1,202, 0, 0, 0, 35, 0, 0, 1, 55, 0, 0, 1,201, 0, 0, 0, 35, 0, 0, 0,201, 0, 0, 1, 55,
- 0, 0, 0, 35, 0, 0, 0,201, 0, 0, 1,201, 0, 0, 0, 35, 0, 0, 0,175, 0, 0, 1,203, 0, 0, 0, 35, 0, 0, 1, 52,
- 0, 0, 1,203, 0, 0, 0, 35, 0, 0, 0,175, 0, 0, 1, 52, 0, 0, 0, 35, 0, 0, 1,203, 0, 0, 1,204, 0, 0, 0, 35,
- 0, 0, 1,203, 0, 0, 1,205, 0, 0, 0, 35, 0, 0, 1,204, 0, 0, 1,205, 0, 0, 0, 35, 0, 0, 0,174, 0, 0, 0,190,
- 0, 0, 0, 35, 0, 0, 0,190, 0, 0, 1,205, 0, 0, 0, 35, 0, 0, 0,174, 0, 0, 1,205, 0, 0, 0, 35, 0, 0, 0,191,
- 0, 0, 1,204, 0, 0, 0, 35, 0, 0, 0,191, 0, 0, 1, 53, 0, 0, 0, 35, 0, 0, 1, 53, 0, 0, 1,204, 0, 0, 0, 35,
- 0, 0, 1, 57, 0, 0, 1,206, 0, 0, 0, 35, 0, 0, 0,207, 0, 0, 1, 57, 0, 0, 0, 35, 0, 0, 0,207, 0, 0, 1,206,
- 0, 0, 0, 35, 0, 0, 1,206, 0, 0, 1,207, 0, 0, 0, 35, 0, 0, 1,207, 0, 0, 1,208, 0, 0, 0, 35, 0, 0, 1,206,
- 0, 0, 1,208, 0, 0, 0, 35, 0, 0, 0,179, 0, 0, 1, 56, 0, 0, 0, 35, 0, 0, 1, 56, 0, 0, 1,208, 0, 0, 0, 35,
- 0, 0, 0,179, 0, 0, 1,208, 0, 0, 0, 35, 0, 0, 0,178, 0, 0, 1,207, 0, 0, 0, 35, 0, 0, 0,206, 0, 0, 1,207,
- 0, 0, 0, 35, 0, 0, 0,178, 0, 0, 0,206, 0, 0, 0, 35, 0, 0, 1, 56, 0, 0, 1,209, 0, 0, 0, 35, 0, 0, 1, 56,
- 0, 0, 1, 58, 0, 0, 0, 35, 0, 0, 1, 58, 0, 0, 1,209, 0, 0, 0, 35, 0, 0, 1,209, 0, 0, 1,210, 0, 0, 0, 35,
- 0, 0, 1,210, 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 1,209, 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 1, 57, 0, 0, 1, 61,
- 0, 0, 0, 35, 0, 0, 1, 57, 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 1, 61, 0, 0, 1,211, 0, 0, 0, 35, 0, 0, 1, 60,
- 0, 0, 1,210, 0, 0, 0, 35, 0, 0, 1, 59, 0, 0, 1,210, 0, 0, 0, 35, 0, 0, 1, 59, 0, 0, 1, 60, 0, 0, 0, 35,
- 0, 0, 0,204, 0, 0, 1,212, 0, 0, 0, 35, 0, 0, 0,204, 0, 0, 0,208, 0, 0, 0, 35, 0, 0, 0,208, 0, 0, 1,212,
- 0, 0, 0, 35, 0, 0, 1,212, 0, 0, 1,213, 0, 0, 0, 35, 0, 0, 1,213, 0, 0, 1,214, 0, 0, 0, 35, 0, 0, 1,212,
- 0, 0, 1,214, 0, 0, 0, 35, 0, 0, 0,205, 0, 0, 1, 60, 0, 0, 0, 35, 0, 0, 0,205, 0, 0, 1,214, 0, 0, 0, 35,
- 0, 0, 1, 60, 0, 0, 1,214, 0, 0, 0, 35, 0, 0, 1, 61, 0, 0, 1,213, 0, 0, 0, 35, 0, 0, 0,209, 0, 0, 1,213,
- 0, 0, 0, 35, 0, 0, 0,209, 0, 0, 1, 61, 0, 0, 0, 35, 0, 0, 0,203, 0, 0, 1,215, 0, 0, 0, 35, 0, 0, 0,203,
- 0, 0, 1, 59, 0, 0, 0, 35, 0, 0, 1, 59, 0, 0, 1,215, 0, 0, 0, 35, 0, 0, 1,215, 0, 0, 1,216, 0, 0, 0, 35,
- 0, 0, 1,216, 0, 0, 1,217, 0, 0, 0, 35, 0, 0, 1,215, 0, 0, 1,217, 0, 0, 0, 35, 0, 0, 0,180, 0, 0, 0,202,
- 0, 0, 0, 35, 0, 0, 0,202, 0, 0, 1,217, 0, 0, 0, 35, 0, 0, 0,180, 0, 0, 1,217, 0, 0, 0, 35, 0, 0, 0,181,
- 0, 0, 1,216, 0, 0, 0, 35, 0, 0, 1, 58, 0, 0, 1,216, 0, 0, 0, 35, 0, 0, 0,181, 0, 0, 1, 58, 0, 0, 0, 35,
- 0, 0, 1, 63, 0, 0, 1,218, 0, 0, 0, 35, 0, 0, 0,215, 0, 0, 1, 63, 0, 0, 0, 35, 0, 0, 0,215, 0, 0, 1,218,
- 0, 0, 0, 35, 0, 0, 1,218, 0, 0, 1,219, 0, 0, 0, 35, 0, 0, 1,219, 0, 0, 1,220, 0, 0, 0, 35, 0, 0, 1,218,
- 0, 0, 1,220, 0, 0, 0, 35, 0, 0, 0,173, 0, 0, 1, 62, 0, 0, 0, 35, 0, 0, 1, 62, 0, 0, 1,220, 0, 0, 0, 35,
- 0, 0, 0,173, 0, 0, 1,220, 0, 0, 0, 35, 0, 0, 0,172, 0, 0, 1,219, 0, 0, 0, 35, 0, 0, 0,214, 0, 0, 1,219,
- 0, 0, 0, 35, 0, 0, 0,172, 0, 0, 0,214, 0, 0, 0, 35, 0, 0, 1, 62, 0, 0, 1,221, 0, 0, 0, 35, 0, 0, 1, 62,
- 0, 0, 1, 64, 0, 0, 0, 35, 0, 0, 1, 64, 0, 0, 1,221, 0, 0, 0, 35, 0, 0, 1,221, 0, 0, 1,222, 0, 0, 0, 35,
- 0, 0, 1,222, 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 1,221, 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 1, 63, 0, 0, 1, 67,
- 0, 0, 0, 35, 0, 0, 1, 63, 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 1, 67, 0, 0, 1,223, 0, 0, 0, 35, 0, 0, 1, 66,
- 0, 0, 1,222, 0, 0, 0, 35, 0, 0, 1, 65, 0, 0, 1,222, 0, 0, 0, 35, 0, 0, 1, 65, 0, 0, 1, 66, 0, 0, 0, 35,
- 0, 0, 0,212, 0, 0, 1,224, 0, 0, 0, 35, 0, 0, 0,212, 0, 0, 0,216, 0, 0, 0, 35, 0, 0, 0,216, 0, 0, 1,224,
- 0, 0, 0, 35, 0, 0, 1,224, 0, 0, 1,225, 0, 0, 0, 35, 0, 0, 1,225, 0, 0, 1,226, 0, 0, 0, 35, 0, 0, 1,224,
- 0, 0, 1,226, 0, 0, 0, 35, 0, 0, 0,213, 0, 0, 1, 66, 0, 0, 0, 35, 0, 0, 0,213, 0, 0, 1,226, 0, 0, 0, 35,
- 0, 0, 1, 66, 0, 0, 1,226, 0, 0, 0, 35, 0, 0, 1, 67, 0, 0, 1,225, 0, 0, 0, 35, 0, 0, 0,217, 0, 0, 1,225,
- 0, 0, 0, 35, 0, 0, 0,217, 0, 0, 1, 67, 0, 0, 0, 35, 0, 0, 0,211, 0, 0, 1,227, 0, 0, 0, 35, 0, 0, 0,211,
- 0, 0, 1, 65, 0, 0, 0, 35, 0, 0, 1, 65, 0, 0, 1,227, 0, 0, 0, 35, 0, 0, 1,227, 0, 0, 1,228, 0, 0, 0, 35,
- 0, 0, 1,228, 0, 0, 1,229, 0, 0, 0, 35, 0, 0, 1,227, 0, 0, 1,229, 0, 0, 0, 35, 0, 0, 0,170, 0, 0, 0,210,
- 0, 0, 0, 35, 0, 0, 0,210, 0, 0, 1,229, 0, 0, 0, 35, 0, 0, 0,170, 0, 0, 1,229, 0, 0, 0, 35, 0, 0, 0,171,
- 0, 0, 1,228, 0, 0, 0, 35, 0, 0, 1, 64, 0, 0, 1,228, 0, 0, 0, 35, 0, 0, 0,171, 0, 0, 1, 64, 0, 0, 0, 35,
- 0, 0, 1, 69, 0, 0, 1,230, 0, 0, 0, 35, 0, 0, 0,223, 0, 0, 1, 69, 0, 0, 0, 35, 0, 0, 0,223, 0, 0, 1,230,
- 0, 0, 0, 35, 0, 0, 1,230, 0, 0, 1,231, 0, 0, 0, 35, 0, 0, 1,231, 0, 0, 1,232, 0, 0, 0, 35, 0, 0, 1,230,
- 0, 0, 1,232, 0, 0, 0, 35, 0, 0, 0,189, 0, 0, 1, 68, 0, 0, 0, 35, 0, 0, 1, 68, 0, 0, 1,232, 0, 0, 0, 35,
- 0, 0, 0,189, 0, 0, 1,232, 0, 0, 0, 35, 0, 0, 0,188, 0, 0, 1,231, 0, 0, 0, 35, 0, 0, 0,222, 0, 0, 1,231,
- 0, 0, 0, 35, 0, 0, 0,188, 0, 0, 0,222, 0, 0, 0, 35, 0, 0, 1, 68, 0, 0, 1,233, 0, 0, 0, 35, 0, 0, 1, 68,
- 0, 0, 1, 70, 0, 0, 0, 35, 0, 0, 1, 70, 0, 0, 1,233, 0, 0, 0, 35, 0, 0, 1,233, 0, 0, 1,234, 0, 0, 0, 35,
- 0, 0, 1,234, 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 1,233, 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 1, 69, 0, 0, 1, 73,
- 0, 0, 0, 35, 0, 0, 1, 69, 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 1, 73, 0, 0, 1,235, 0, 0, 0, 35, 0, 0, 1, 72,
- 0, 0, 1,234, 0, 0, 0, 35, 0, 0, 1, 71, 0, 0, 1,234, 0, 0, 0, 35, 0, 0, 1, 71, 0, 0, 1, 72, 0, 0, 0, 35,
- 0, 0, 0,220, 0, 0, 1,236, 0, 0, 0, 35, 0, 0, 0,220, 0, 0, 0,224, 0, 0, 0, 35, 0, 0, 0,224, 0, 0, 1,236,
- 0, 0, 0, 35, 0, 0, 1,236, 0, 0, 1,237, 0, 0, 0, 35, 0, 0, 1,237, 0, 0, 1,238, 0, 0, 0, 35, 0, 0, 1,236,
- 0, 0, 1,238, 0, 0, 0, 35, 0, 0, 0,221, 0, 0, 1, 72, 0, 0, 0, 35, 0, 0, 0,221, 0, 0, 1,238, 0, 0, 0, 35,
- 0, 0, 1, 72, 0, 0, 1,238, 0, 0, 0, 35, 0, 0, 1, 73, 0, 0, 1,237, 0, 0, 0, 35, 0, 0, 0,225, 0, 0, 1,237,
- 0, 0, 0, 35, 0, 0, 0,225, 0, 0, 1, 73, 0, 0, 0, 35, 0, 0, 0,219, 0, 0, 1,239, 0, 0, 0, 35, 0, 0, 0,219,
- 0, 0, 1, 71, 0, 0, 0, 35, 0, 0, 1, 71, 0, 0, 1,239, 0, 0, 0, 35, 0, 0, 1,239, 0, 0, 1,240, 0, 0, 0, 35,
- 0, 0, 1,240, 0, 0, 1,241, 0, 0, 0, 35, 0, 0, 1,239, 0, 0, 1,241, 0, 0, 0, 35, 0, 0, 0,186, 0, 0, 0,218,
- 0, 0, 0, 35, 0, 0, 0,218, 0, 0, 1,241, 0, 0, 0, 35, 0, 0, 0,186, 0, 0, 1,241, 0, 0, 0, 35, 0, 0, 0,187,
- 0, 0, 1,240, 0, 0, 0, 35, 0, 0, 1, 70, 0, 0, 1,240, 0, 0, 0, 35, 0, 0, 0,187, 0, 0, 1, 70, 0, 0, 0, 35,
- 0, 0, 1, 75, 0, 0, 1,242, 0, 0, 0, 35, 0, 0, 0,231, 0, 0, 1, 75, 0, 0, 0, 35, 0, 0, 0,231, 0, 0, 1,242,
- 0, 0, 0, 35, 0, 0, 1,242, 0, 0, 1,243, 0, 0, 0, 35, 0, 0, 1,243, 0, 0, 1,244, 0, 0, 0, 35, 0, 0, 1,242,
- 0, 0, 1,244, 0, 0, 0, 35, 0, 0, 0,197, 0, 0, 1, 74, 0, 0, 0, 35, 0, 0, 1, 74, 0, 0, 1,244, 0, 0, 0, 35,
- 0, 0, 0,197, 0, 0, 1,244, 0, 0, 0, 35, 0, 0, 0,196, 0, 0, 1,243, 0, 0, 0, 35, 0, 0, 0,230, 0, 0, 1,243,
- 0, 0, 0, 35, 0, 0, 0,196, 0, 0, 0,230, 0, 0, 0, 35, 0, 0, 1, 74, 0, 0, 1,245, 0, 0, 0, 35, 0, 0, 1, 74,
- 0, 0, 1, 76, 0, 0, 0, 35, 0, 0, 1, 76, 0, 0, 1,245, 0, 0, 0, 35, 0, 0, 1,245, 0, 0, 1,246, 0, 0, 0, 35,
- 0, 0, 1,246, 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 1,245, 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 1, 75, 0, 0, 1, 79,
- 0, 0, 0, 35, 0, 0, 1, 75, 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 1, 79, 0, 0, 1,247, 0, 0, 0, 35, 0, 0, 1, 78,
- 0, 0, 1,246, 0, 0, 0, 35, 0, 0, 1, 77, 0, 0, 1,246, 0, 0, 0, 35, 0, 0, 1, 77, 0, 0, 1, 78, 0, 0, 0, 35,
- 0, 0, 0,228, 0, 0, 1,248, 0, 0, 0, 35, 0, 0, 0,228, 0, 0, 0,232, 0, 0, 0, 35, 0, 0, 0,232, 0, 0, 1,248,
- 0, 0, 0, 35, 0, 0, 1,248, 0, 0, 1,249, 0, 0, 0, 35, 0, 0, 1,249, 0, 0, 1,250, 0, 0, 0, 35, 0, 0, 1,248,
- 0, 0, 1,250, 0, 0, 0, 35, 0, 0, 0,229, 0, 0, 1, 78, 0, 0, 0, 35, 0, 0, 0,229, 0, 0, 1,250, 0, 0, 0, 35,
- 0, 0, 1, 78, 0, 0, 1,250, 0, 0, 0, 35, 0, 0, 1, 79, 0, 0, 1,249, 0, 0, 0, 35, 0, 0, 0,233, 0, 0, 1,249,
- 0, 0, 0, 35, 0, 0, 0,233, 0, 0, 1, 79, 0, 0, 0, 35, 0, 0, 0,227, 0, 0, 1,251, 0, 0, 0, 35, 0, 0, 0,227,
- 0, 0, 1, 77, 0, 0, 0, 35, 0, 0, 1, 77, 0, 0, 1,251, 0, 0, 0, 35, 0, 0, 1,251, 0, 0, 1,252, 0, 0, 0, 35,
- 0, 0, 1,252, 0, 0, 1,253, 0, 0, 0, 35, 0, 0, 1,251, 0, 0, 1,253, 0, 0, 0, 35, 0, 0, 0,194, 0, 0, 0,226,
- 0, 0, 0, 35, 0, 0, 0,226, 0, 0, 1,253, 0, 0, 0, 35, 0, 0, 0,194, 0, 0, 1,253, 0, 0, 0, 35, 0, 0, 0,195,
- 0, 0, 1,252, 0, 0, 0, 35, 0, 0, 1, 76, 0, 0, 1,252, 0, 0, 0, 35, 0, 0, 0,195, 0, 0, 1, 76, 0, 0, 0, 35,
- 0, 0, 1, 81, 0, 0, 1,254, 0, 0, 0, 35, 0, 0, 0,239, 0, 0, 1, 81, 0, 0, 0, 35, 0, 0, 0,239, 0, 0, 1,254,
- 0, 0, 0, 35, 0, 0, 1,254, 0, 0, 1,255, 0, 0, 0, 35, 0, 0, 1,255, 0, 0, 2, 0, 0, 0, 0, 35, 0, 0, 1,254,
- 0, 0, 2, 0, 0, 0, 0, 35, 0, 0, 0,201, 0, 0, 1, 80, 0, 0, 0, 35, 0, 0, 1, 80, 0, 0, 2, 0, 0, 0, 0, 35,
- 0, 0, 0,201, 0, 0, 2, 0, 0, 0, 0, 35, 0, 0, 0,200, 0, 0, 1,255, 0, 0, 0, 35, 0, 0, 0,238, 0, 0, 1,255,
- 0, 0, 0, 35, 0, 0, 0,200, 0, 0, 0,238, 0, 0, 0, 35, 0, 0, 1, 80, 0, 0, 2, 1, 0, 0, 0, 35, 0, 0, 1, 80,
- 0, 0, 1, 82, 0, 0, 0, 35, 0, 0, 1, 82, 0, 0, 2, 1, 0, 0, 0, 35, 0, 0, 2, 1, 0, 0, 2, 2, 0, 0, 0, 35,
- 0, 0, 2, 2, 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 2, 1, 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 1, 81, 0, 0, 1, 85,
- 0, 0, 0, 35, 0, 0, 1, 81, 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 1, 85, 0, 0, 2, 3, 0, 0, 0, 35, 0, 0, 1, 84,
- 0, 0, 2, 2, 0, 0, 0, 35, 0, 0, 1, 83, 0, 0, 2, 2, 0, 0, 0, 35, 0, 0, 1, 83, 0, 0, 1, 84, 0, 0, 0, 35,
- 0, 0, 0,236, 0, 0, 2, 4, 0, 0, 0, 35, 0, 0, 0,236, 0, 0, 0,240, 0, 0, 0, 35, 0, 0, 0,240, 0, 0, 2, 4,
- 0, 0, 0, 35, 0, 0, 2, 4, 0, 0, 2, 5, 0, 0, 0, 35, 0, 0, 2, 5, 0, 0, 2, 6, 0, 0, 0, 35, 0, 0, 2, 4,
- 0, 0, 2, 6, 0, 0, 0, 35, 0, 0, 0,237, 0, 0, 1, 84, 0, 0, 0, 35, 0, 0, 0,237, 0, 0, 2, 6, 0, 0, 0, 35,
- 0, 0, 1, 84, 0, 0, 2, 6, 0, 0, 0, 35, 0, 0, 1, 85, 0, 0, 2, 5, 0, 0, 0, 35, 0, 0, 0,241, 0, 0, 2, 5,
- 0, 0, 0, 35, 0, 0, 0,241, 0, 0, 1, 85, 0, 0, 0, 35, 0, 0, 0,235, 0, 0, 2, 7, 0, 0, 0, 35, 0, 0, 0,235,
- 0, 0, 1, 83, 0, 0, 0, 35, 0, 0, 1, 83, 0, 0, 2, 7, 0, 0, 0, 35, 0, 0, 2, 7, 0, 0, 2, 8, 0, 0, 0, 35,
- 0, 0, 2, 8, 0, 0, 2, 9, 0, 0, 0, 35, 0, 0, 2, 7, 0, 0, 2, 9, 0, 0, 0, 35, 0, 0, 0,198, 0, 0, 0,234,
- 0, 0, 0, 35, 0, 0, 0,234, 0, 0, 2, 9, 0, 0, 0, 35, 0, 0, 0,198, 0, 0, 2, 9, 0, 0, 0, 35, 0, 0, 0,199,
- 0, 0, 2, 8, 0, 0, 0, 35, 0, 0, 1, 82, 0, 0, 2, 8, 0, 0, 0, 35, 0, 0, 0,199, 0, 0, 1, 82, 0, 0, 0, 35,
- 0, 0, 1, 87, 0, 0, 2, 10, 0, 0, 0, 35, 0, 0, 0,245, 0, 0, 2, 10, 0, 0, 0, 35, 0, 0, 0,245, 0, 0, 1, 87,
- 0, 0, 0, 35, 0, 0, 2, 10, 0, 0, 2, 11, 0, 0, 0, 35, 0, 0, 2, 10, 0, 0, 2, 12, 0, 0, 0, 35, 0, 0, 2, 11,
- 0, 0, 2, 12, 0, 0, 0, 35, 0, 0, 0,209, 0, 0, 1, 86, 0, 0, 0, 35, 0, 0, 0,209, 0, 0, 2, 12, 0, 0, 0, 35,
- 0, 0, 1, 86, 0, 0, 2, 12, 0, 0, 0, 35, 0, 0, 0,208, 0, 0, 2, 11, 0, 0, 0, 35, 0, 0, 0,208, 0, 0, 0,244,
- 0, 0, 0, 35, 0, 0, 0,244, 0, 0, 2, 11, 0, 0, 0, 35, 0, 0, 1, 86, 0, 0, 2, 13, 0, 0, 0, 35, 0, 0, 1, 88,
- 0, 0, 2, 13, 0, 0, 0, 35, 0, 0, 1, 86, 0, 0, 1, 88, 0, 0, 0, 35, 0, 0, 2, 13, 0, 0, 2, 14, 0, 0, 0, 35,
- 0, 0, 2, 13, 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 2, 14, 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 1, 87, 0, 0, 1, 91,
- 0, 0, 0, 35, 0, 0, 1, 91, 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 1, 87, 0, 0, 2, 15, 0, 0, 0, 35, 0, 0, 1, 90,
- 0, 0, 2, 14, 0, 0, 0, 35, 0, 0, 1, 89, 0, 0, 1, 90, 0, 0, 0, 35, 0, 0, 1, 89, 0, 0, 2, 14, 0, 0, 0, 35,
- 0, 0, 0,212, 0, 0, 2, 16, 0, 0, 0, 35, 0, 0, 0,242, 0, 0, 2, 16, 0, 0, 0, 35, 0, 0, 0,212, 0, 0, 0,242,
- 0, 0, 0, 35, 0, 0, 2, 16, 0, 0, 2, 17, 0, 0, 0, 35, 0, 0, 2, 16, 0, 0, 2, 18, 0, 0, 0, 35, 0, 0, 2, 17,
- 0, 0, 2, 18, 0, 0, 0, 35, 0, 0, 0,213, 0, 0, 1, 90, 0, 0, 0, 35, 0, 0, 1, 90, 0, 0, 2, 18, 0, 0, 0, 35,
- 0, 0, 0,213, 0, 0, 2, 18, 0, 0, 0, 35, 0, 0, 1, 91, 0, 0, 2, 17, 0, 0, 0, 35, 0, 0, 0,243, 0, 0, 1, 91,
- 0, 0, 0, 35, 0, 0, 0,243, 0, 0, 2, 17, 0, 0, 0, 35, 0, 0, 0,211, 0, 0, 2, 19, 0, 0, 0, 35, 0, 0, 1, 89,
- 0, 0, 2, 19, 0, 0, 0, 35, 0, 0, 0,211, 0, 0, 1, 89, 0, 0, 0, 35, 0, 0, 2, 19, 0, 0, 2, 20, 0, 0, 0, 35,
- 0, 0, 2, 19, 0, 0, 2, 21, 0, 0, 0, 35, 0, 0, 2, 20, 0, 0, 2, 21, 0, 0, 0, 35, 0, 0, 0,206, 0, 0, 0,210,
- 0, 0, 0, 35, 0, 0, 0,206, 0, 0, 2, 21, 0, 0, 0, 35, 0, 0, 0,210, 0, 0, 2, 21, 0, 0, 0, 35, 0, 0, 0,207,
- 0, 0, 2, 20, 0, 0, 0, 35, 0, 0, 0,207, 0, 0, 1, 88, 0, 0, 0, 35, 0, 0, 1, 88, 0, 0, 2, 20, 0, 0, 0, 35,
- 0, 0, 1, 93, 0, 0, 2, 22, 0, 0, 0, 35, 0, 0, 0,247, 0, 0, 2, 22, 0, 0, 0, 35, 0, 0, 0,247, 0, 0, 1, 93,
- 0, 0, 0, 35, 0, 0, 2, 22, 0, 0, 2, 23, 0, 0, 0, 35, 0, 0, 2, 22, 0, 0, 2, 24, 0, 0, 0, 35, 0, 0, 2, 23,
- 0, 0, 2, 24, 0, 0, 0, 35, 0, 0, 0,217, 0, 0, 1, 92, 0, 0, 0, 35, 0, 0, 0,217, 0, 0, 2, 24, 0, 0, 0, 35,
- 0, 0, 1, 92, 0, 0, 2, 24, 0, 0, 0, 35, 0, 0, 0,216, 0, 0, 2, 23, 0, 0, 0, 35, 0, 0, 0,216, 0, 0, 0,246,
- 0, 0, 0, 35, 0, 0, 0,246, 0, 0, 2, 23, 0, 0, 0, 35, 0, 0, 1, 92, 0, 0, 2, 25, 0, 0, 0, 35, 0, 0, 1, 94,
- 0, 0, 2, 25, 0, 0, 0, 35, 0, 0, 1, 92, 0, 0, 1, 94, 0, 0, 0, 35, 0, 0, 2, 25, 0, 0, 2, 26, 0, 0, 0, 35,
- 0, 0, 2, 25, 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 2, 26, 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 1, 93, 0, 0, 1, 97,
- 0, 0, 0, 35, 0, 0, 1, 97, 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 1, 93, 0, 0, 2, 27, 0, 0, 0, 35, 0, 0, 1, 96,
- 0, 0, 2, 26, 0, 0, 0, 35, 0, 0, 1, 95, 0, 0, 1, 96, 0, 0, 0, 35, 0, 0, 1, 95, 0, 0, 2, 26, 0, 0, 0, 35,
- 0, 0, 0,220, 0, 0, 2, 28, 0, 0, 0, 35, 0, 0, 0,248, 0, 0, 2, 28, 0, 0, 0, 35, 0, 0, 0,220, 0, 0, 0,248,
- 0, 0, 0, 35, 0, 0, 2, 28, 0, 0, 2, 29, 0, 0, 0, 35, 0, 0, 2, 28, 0, 0, 2, 30, 0, 0, 0, 35, 0, 0, 2, 29,
- 0, 0, 2, 30, 0, 0, 0, 35, 0, 0, 0,221, 0, 0, 1, 96, 0, 0, 0, 35, 0, 0, 1, 96, 0, 0, 2, 30, 0, 0, 0, 35,
- 0, 0, 0,221, 0, 0, 2, 30, 0, 0, 0, 35, 0, 0, 1, 97, 0, 0, 2, 29, 0, 0, 0, 35, 0, 0, 0,249, 0, 0, 1, 97,
- 0, 0, 0, 35, 0, 0, 0,249, 0, 0, 2, 29, 0, 0, 0, 35, 0, 0, 0,219, 0, 0, 2, 31, 0, 0, 0, 35, 0, 0, 1, 95,
- 0, 0, 2, 31, 0, 0, 0, 35, 0, 0, 0,219, 0, 0, 1, 95, 0, 0, 0, 35, 0, 0, 2, 31, 0, 0, 2, 32, 0, 0, 0, 35,
- 0, 0, 2, 31, 0, 0, 2, 33, 0, 0, 0, 35, 0, 0, 2, 32, 0, 0, 2, 33, 0, 0, 0, 35, 0, 0, 0,214, 0, 0, 0,218,
- 0, 0, 0, 35, 0, 0, 0,214, 0, 0, 2, 33, 0, 0, 0, 35, 0, 0, 0,218, 0, 0, 2, 33, 0, 0, 0, 35, 0, 0, 0,215,
- 0, 0, 2, 32, 0, 0, 0, 35, 0, 0, 0,215, 0, 0, 1, 94, 0, 0, 0, 35, 0, 0, 1, 94, 0, 0, 2, 32, 0, 0, 0, 35,
- 0, 0, 1, 99, 0, 0, 2, 34, 0, 0, 0, 35, 0, 0, 0,251, 0, 0, 2, 34, 0, 0, 0, 35, 0, 0, 0,251, 0, 0, 1, 99,
- 0, 0, 0, 35, 0, 0, 2, 34, 0, 0, 2, 35, 0, 0, 0, 35, 0, 0, 2, 34, 0, 0, 2, 36, 0, 0, 0, 35, 0, 0, 2, 35,
- 0, 0, 2, 36, 0, 0, 0, 35, 0, 0, 0,225, 0, 0, 1, 98, 0, 0, 0, 35, 0, 0, 0,225, 0, 0, 2, 36, 0, 0, 0, 35,
- 0, 0, 1, 98, 0, 0, 2, 36, 0, 0, 0, 35, 0, 0, 0,224, 0, 0, 2, 35, 0, 0, 0, 35, 0, 0, 0,224, 0, 0, 0,250,
- 0, 0, 0, 35, 0, 0, 0,250, 0, 0, 2, 35, 0, 0, 0, 35, 0, 0, 1, 98, 0, 0, 2, 37, 0, 0, 0, 35, 0, 0, 1,100,
- 0, 0, 2, 37, 0, 0, 0, 35, 0, 0, 1, 98, 0, 0, 1,100, 0, 0, 0, 35, 0, 0, 2, 37, 0, 0, 2, 38, 0, 0, 0, 35,
- 0, 0, 2, 37, 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 2, 38, 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 1, 99, 0, 0, 1,103,
- 0, 0, 0, 35, 0, 0, 1,103, 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 1, 99, 0, 0, 2, 39, 0, 0, 0, 35, 0, 0, 1,102,
- 0, 0, 2, 38, 0, 0, 0, 35, 0, 0, 1,101, 0, 0, 1,102, 0, 0, 0, 35, 0, 0, 1,101, 0, 0, 2, 38, 0, 0, 0, 35,
- 0, 0, 0,228, 0, 0, 2, 40, 0, 0, 0, 35, 0, 0, 0,252, 0, 0, 2, 40, 0, 0, 0, 35, 0, 0, 0,228, 0, 0, 0,252,
- 0, 0, 0, 35, 0, 0, 2, 40, 0, 0, 2, 41, 0, 0, 0, 35, 0, 0, 2, 40, 0, 0, 2, 42, 0, 0, 0, 35, 0, 0, 2, 41,
- 0, 0, 2, 42, 0, 0, 0, 35, 0, 0, 0,229, 0, 0, 1,102, 0, 0, 0, 35, 0, 0, 1,102, 0, 0, 2, 42, 0, 0, 0, 35,
- 0, 0, 0,229, 0, 0, 2, 42, 0, 0, 0, 35, 0, 0, 1,103, 0, 0, 2, 41, 0, 0, 0, 35, 0, 0, 0,253, 0, 0, 1,103,
- 0, 0, 0, 35, 0, 0, 0,253, 0, 0, 2, 41, 0, 0, 0, 35, 0, 0, 0,227, 0, 0, 2, 43, 0, 0, 0, 35, 0, 0, 1,101,
- 0, 0, 2, 43, 0, 0, 0, 35, 0, 0, 0,227, 0, 0, 1,101, 0, 0, 0, 35, 0, 0, 2, 43, 0, 0, 2, 44, 0, 0, 0, 35,
- 0, 0, 2, 43, 0, 0, 2, 45, 0, 0, 0, 35, 0, 0, 2, 44, 0, 0, 2, 45, 0, 0, 0, 35, 0, 0, 0,222, 0, 0, 0,226,
- 0, 0, 0, 35, 0, 0, 0,222, 0, 0, 2, 45, 0, 0, 0, 35, 0, 0, 0,226, 0, 0, 2, 45, 0, 0, 0, 35, 0, 0, 0,223,
- 0, 0, 2, 44, 0, 0, 0, 35, 0, 0, 0,223, 0, 0, 1,100, 0, 0, 0, 35, 0, 0, 1,100, 0, 0, 2, 44, 0, 0, 0, 35,
- 0, 0, 1,105, 0, 0, 2, 46, 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 2, 46, 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 1,105,
- 0, 0, 0, 35, 0, 0, 2, 46, 0, 0, 2, 47, 0, 0, 0, 35, 0, 0, 2, 46, 0, 0, 2, 48, 0, 0, 0, 35, 0, 0, 2, 47,
- 0, 0, 2, 48, 0, 0, 0, 35, 0, 0, 0,233, 0, 0, 1,104, 0, 0, 0, 35, 0, 0, 0,233, 0, 0, 2, 48, 0, 0, 0, 35,
- 0, 0, 1,104, 0, 0, 2, 48, 0, 0, 0, 35, 0, 0, 0,232, 0, 0, 2, 47, 0, 0, 0, 35, 0, 0, 0,232, 0, 0, 0,254,
- 0, 0, 0, 35, 0, 0, 0,254, 0, 0, 2, 47, 0, 0, 0, 35, 0, 0, 1,104, 0, 0, 2, 49, 0, 0, 0, 35, 0, 0, 1,106,
- 0, 0, 2, 49, 0, 0, 0, 35, 0, 0, 1,104, 0, 0, 1,106, 0, 0, 0, 35, 0, 0, 2, 49, 0, 0, 2, 50, 0, 0, 0, 35,
- 0, 0, 2, 49, 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 2, 50, 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 1,105, 0, 0, 1,109,
- 0, 0, 0, 35, 0, 0, 1,109, 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 1,105, 0, 0, 2, 51, 0, 0, 0, 35, 0, 0, 1,108,
- 0, 0, 2, 50, 0, 0, 0, 35, 0, 0, 1,107, 0, 0, 1,108, 0, 0, 0, 35, 0, 0, 1,107, 0, 0, 2, 50, 0, 0, 0, 35,
- 0, 0, 0,236, 0, 0, 2, 52, 0, 0, 0, 35, 0, 0, 1, 0, 0, 0, 2, 52, 0, 0, 0, 35, 0, 0, 0,236, 0, 0, 1, 0,
- 0, 0, 0, 35, 0, 0, 2, 52, 0, 0, 2, 53, 0, 0, 0, 35, 0, 0, 2, 52, 0, 0, 2, 54, 0, 0, 0, 35, 0, 0, 2, 53,
- 0, 0, 2, 54, 0, 0, 0, 35, 0, 0, 0,237, 0, 0, 1,108, 0, 0, 0, 35, 0, 0, 1,108, 0, 0, 2, 54, 0, 0, 0, 35,
- 0, 0, 0,237, 0, 0, 2, 54, 0, 0, 0, 35, 0, 0, 1,109, 0, 0, 2, 53, 0, 0, 0, 35, 0, 0, 1, 1, 0, 0, 1,109,
- 0, 0, 0, 35, 0, 0, 1, 1, 0, 0, 2, 53, 0, 0, 0, 35, 0, 0, 0,235, 0, 0, 2, 55, 0, 0, 0, 35, 0, 0, 1,107,
- 0, 0, 2, 55, 0, 0, 0, 35, 0, 0, 0,235, 0, 0, 1,107, 0, 0, 0, 35, 0, 0, 2, 55, 0, 0, 2, 56, 0, 0, 0, 35,
- 0, 0, 2, 55, 0, 0, 2, 57, 0, 0, 0, 35, 0, 0, 2, 56, 0, 0, 2, 57, 0, 0, 0, 35, 0, 0, 0,230, 0, 0, 0,234,
- 0, 0, 0, 35, 0, 0, 0,230, 0, 0, 2, 57, 0, 0, 0, 35, 0, 0, 0,234, 0, 0, 2, 57, 0, 0, 0, 35, 0, 0, 0,231,
- 0, 0, 2, 56, 0, 0, 0, 35, 0, 0, 0,231, 0, 0, 1,106, 0, 0, 0, 35, 0, 0, 1,106, 0, 0, 2, 56, 0, 0, 0, 35,
- 0, 0, 1,111, 0, 0, 2, 58, 0, 0, 0, 35, 0, 0, 1, 3, 0, 0, 2, 58, 0, 0, 0, 35, 0, 0, 1, 3, 0, 0, 1,111,
- 0, 0, 0, 35, 0, 0, 2, 58, 0, 0, 2, 59, 0, 0, 0, 35, 0, 0, 2, 58, 0, 0, 2, 60, 0, 0, 0, 35, 0, 0, 2, 59,
- 0, 0, 2, 60, 0, 0, 0, 35, 0, 0, 0,241, 0, 0, 1,110, 0, 0, 0, 35, 0, 0, 0,241, 0, 0, 2, 60, 0, 0, 0, 35,
- 0, 0, 1,110, 0, 0, 2, 60, 0, 0, 0, 35, 0, 0, 0,240, 0, 0, 2, 59, 0, 0, 0, 35, 0, 0, 0,240, 0, 0, 1, 2,
- 0, 0, 0, 35, 0, 0, 1, 2, 0, 0, 2, 59, 0, 0, 0, 35, 0, 0, 1,110, 0, 0, 2, 61, 0, 0, 0, 35, 0, 0, 1,113,
- 0, 0, 2, 61, 0, 0, 0, 35, 0, 0, 1,110, 0, 0, 1,113, 0, 0, 0, 35, 0, 0, 2, 61, 0, 0, 2, 62, 0, 0, 0, 35,
- 0, 0, 2, 61, 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 2, 62, 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 1,111, 0, 0, 1,115,
- 0, 0, 0, 35, 0, 0, 1,115, 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 1,111, 0, 0, 2, 63, 0, 0, 0, 35, 0, 0, 1,114,
- 0, 0, 2, 62, 0, 0, 0, 35, 0, 0, 1,112, 0, 0, 1,114, 0, 0, 0, 35, 0, 0, 1,112, 0, 0, 2, 62, 0, 0, 0, 35,
- 0, 0, 0,204, 0, 0, 2, 64, 0, 0, 0, 35, 0, 0, 1, 4, 0, 0, 2, 64, 0, 0, 0, 35, 0, 0, 0,204, 0, 0, 1, 4,
- 0, 0, 0, 35, 0, 0, 2, 64, 0, 0, 2, 65, 0, 0, 0, 35, 0, 0, 2, 64, 0, 0, 2, 66, 0, 0, 0, 35, 0, 0, 2, 65,
- 0, 0, 2, 66, 0, 0, 0, 35, 0, 0, 0,205, 0, 0, 1,114, 0, 0, 0, 35, 0, 0, 1,114, 0, 0, 2, 66, 0, 0, 0, 35,
- 0, 0, 0,205, 0, 0, 2, 66, 0, 0, 0, 35, 0, 0, 1,115, 0, 0, 2, 65, 0, 0, 0, 35, 0, 0, 1, 5, 0, 0, 1,115,
- 0, 0, 0, 35, 0, 0, 1, 5, 0, 0, 2, 65, 0, 0, 0, 35, 0, 0, 0,203, 0, 0, 2, 67, 0, 0, 0, 35, 0, 0, 1,112,
- 0, 0, 2, 67, 0, 0, 0, 35, 0, 0, 0,203, 0, 0, 1,112, 0, 0, 0, 35, 0, 0, 2, 67, 0, 0, 2, 68, 0, 0, 0, 35,
- 0, 0, 2, 67, 0, 0, 2, 69, 0, 0, 0, 35, 0, 0, 2, 68, 0, 0, 2, 69, 0, 0, 0, 35, 0, 0, 0,202, 0, 0, 0,238,
- 0, 0, 0, 35, 0, 0, 0,238, 0, 0, 2, 69, 0, 0, 0, 35, 0, 0, 0,202, 0, 0, 2, 69, 0, 0, 0, 35, 0, 0, 0,239,
- 0, 0, 2, 68, 0, 0, 0, 35, 0, 0, 0,239, 0, 0, 1,113, 0, 0, 0, 35, 0, 0, 1,113, 0, 0, 2, 68, 0, 0, 0, 35,
- 0, 0, 1,117, 0, 0, 2, 70, 0, 0, 0, 35, 0, 0, 1, 11, 0, 0, 1,117, 0, 0, 0, 35, 0, 0, 1, 11, 0, 0, 2, 70,
- 0, 0, 0, 35, 0, 0, 2, 70, 0, 0, 2, 71, 0, 0, 0, 35, 0, 0, 2, 71, 0, 0, 2, 72, 0, 0, 0, 35, 0, 0, 2, 70,
- 0, 0, 2, 72, 0, 0, 0, 35, 0, 0, 0,243, 0, 0, 1,116, 0, 0, 0, 35, 0, 0, 1,116, 0, 0, 2, 72, 0, 0, 0, 35,
- 0, 0, 0,243, 0, 0, 2, 72, 0, 0, 0, 35, 0, 0, 0,242, 0, 0, 2, 71, 0, 0, 0, 35, 0, 0, 1, 10, 0, 0, 2, 71,
- 0, 0, 0, 35, 0, 0, 0,242, 0, 0, 1, 10, 0, 0, 0, 35, 0, 0, 1,116, 0, 0, 2, 73, 0, 0, 0, 35, 0, 0, 1,116,
- 0, 0, 1,118, 0, 0, 0, 35, 0, 0, 1,118, 0, 0, 2, 73, 0, 0, 0, 35, 0, 0, 2, 73, 0, 0, 2, 74, 0, 0, 0, 35,
- 0, 0, 2, 74, 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 2, 73, 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 1,117, 0, 0, 1,121,
- 0, 0, 0, 35, 0, 0, 1,117, 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 1,121, 0, 0, 2, 75, 0, 0, 0, 35, 0, 0, 1,120,
- 0, 0, 2, 74, 0, 0, 0, 35, 0, 0, 1,119, 0, 0, 2, 74, 0, 0, 0, 35, 0, 0, 1,119, 0, 0, 1,120, 0, 0, 0, 35,
- 0, 0, 1, 8, 0, 0, 2, 76, 0, 0, 0, 35, 0, 0, 1, 8, 0, 0, 1, 12, 0, 0, 0, 35, 0, 0, 1, 12, 0, 0, 2, 76,
- 0, 0, 0, 35, 0, 0, 2, 76, 0, 0, 2, 77, 0, 0, 0, 35, 0, 0, 2, 77, 0, 0, 2, 78, 0, 0, 0, 35, 0, 0, 2, 76,
- 0, 0, 2, 78, 0, 0, 0, 35, 0, 0, 1, 9, 0, 0, 1,120, 0, 0, 0, 35, 0, 0, 1, 9, 0, 0, 2, 78, 0, 0, 0, 35,
- 0, 0, 1,120, 0, 0, 2, 78, 0, 0, 0, 35, 0, 0, 1,121, 0, 0, 2, 77, 0, 0, 0, 35, 0, 0, 1, 13, 0, 0, 2, 77,
- 0, 0, 0, 35, 0, 0, 1, 13, 0, 0, 1,121, 0, 0, 0, 35, 0, 0, 1, 7, 0, 0, 2, 79, 0, 0, 0, 35, 0, 0, 1, 7,
- 0, 0, 1,119, 0, 0, 0, 35, 0, 0, 1,119, 0, 0, 2, 79, 0, 0, 0, 35, 0, 0, 2, 79, 0, 0, 2, 80, 0, 0, 0, 35,
- 0, 0, 2, 80, 0, 0, 2, 81, 0, 0, 0, 35, 0, 0, 2, 79, 0, 0, 2, 81, 0, 0, 0, 35, 0, 0, 0,244, 0, 0, 1, 6,
- 0, 0, 0, 35, 0, 0, 1, 6, 0, 0, 2, 81, 0, 0, 0, 35, 0, 0, 0,244, 0, 0, 2, 81, 0, 0, 0, 35, 0, 0, 0,245,
- 0, 0, 2, 80, 0, 0, 0, 35, 0, 0, 1,118, 0, 0, 2, 80, 0, 0, 0, 35, 0, 0, 0,245, 0, 0, 1,118, 0, 0, 0, 35,
- 0, 0, 1,123, 0, 0, 2, 82, 0, 0, 0, 35, 0, 0, 1, 15, 0, 0, 1,123, 0, 0, 0, 35, 0, 0, 1, 15, 0, 0, 2, 82,
- 0, 0, 0, 35, 0, 0, 2, 82, 0, 0, 2, 83, 0, 0, 0, 35, 0, 0, 2, 83, 0, 0, 2, 84, 0, 0, 0, 35, 0, 0, 2, 82,
- 0, 0, 2, 84, 0, 0, 0, 35, 0, 0, 0,249, 0, 0, 1,122, 0, 0, 0, 35, 0, 0, 1,122, 0, 0, 2, 84, 0, 0, 0, 35,
- 0, 0, 0,249, 0, 0, 2, 84, 0, 0, 0, 35, 0, 0, 0,248, 0, 0, 2, 83, 0, 0, 0, 35, 0, 0, 1, 14, 0, 0, 2, 83,
- 0, 0, 0, 35, 0, 0, 0,248, 0, 0, 1, 14, 0, 0, 0, 35, 0, 0, 1,122, 0, 0, 2, 85, 0, 0, 0, 35, 0, 0, 1,122,
- 0, 0, 1,124, 0, 0, 0, 35, 0, 0, 1,124, 0, 0, 2, 85, 0, 0, 0, 35, 0, 0, 2, 85, 0, 0, 2, 86, 0, 0, 0, 35,
- 0, 0, 2, 86, 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 2, 85, 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 1,123, 0, 0, 1,127,
- 0, 0, 0, 35, 0, 0, 1,123, 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 1,127, 0, 0, 2, 87, 0, 0, 0, 35, 0, 0, 1,126,
- 0, 0, 2, 86, 0, 0, 0, 35, 0, 0, 1,125, 0, 0, 2, 86, 0, 0, 0, 35, 0, 0, 1,125, 0, 0, 1,126, 0, 0, 0, 35,
- 0, 0, 1, 12, 0, 0, 2, 88, 0, 0, 0, 35, 0, 0, 1, 12, 0, 0, 1, 16, 0, 0, 0, 35, 0, 0, 1, 16, 0, 0, 2, 88,
- 0, 0, 0, 35, 0, 0, 2, 88, 0, 0, 2, 89, 0, 0, 0, 35, 0, 0, 2, 89, 0, 0, 2, 90, 0, 0, 0, 35, 0, 0, 2, 88,
- 0, 0, 2, 90, 0, 0, 0, 35, 0, 0, 1, 13, 0, 0, 1,126, 0, 0, 0, 35, 0, 0, 1, 13, 0, 0, 2, 90, 0, 0, 0, 35,
- 0, 0, 1,126, 0, 0, 2, 90, 0, 0, 0, 35, 0, 0, 1,127, 0, 0, 2, 89, 0, 0, 0, 35, 0, 0, 1, 17, 0, 0, 2, 89,
- 0, 0, 0, 35, 0, 0, 1, 17, 0, 0, 1,127, 0, 0, 0, 35, 0, 0, 1, 11, 0, 0, 2, 91, 0, 0, 0, 35, 0, 0, 1, 11,
- 0, 0, 1,125, 0, 0, 0, 35, 0, 0, 1,125, 0, 0, 2, 91, 0, 0, 0, 35, 0, 0, 2, 91, 0, 0, 2, 92, 0, 0, 0, 35,
- 0, 0, 2, 92, 0, 0, 2, 93, 0, 0, 0, 35, 0, 0, 2, 91, 0, 0, 2, 93, 0, 0, 0, 35, 0, 0, 0,246, 0, 0, 1, 10,
- 0, 0, 0, 35, 0, 0, 1, 10, 0, 0, 2, 93, 0, 0, 0, 35, 0, 0, 0,246, 0, 0, 2, 93, 0, 0, 0, 35, 0, 0, 0,247,
- 0, 0, 2, 92, 0, 0, 0, 35, 0, 0, 1,124, 0, 0, 2, 92, 0, 0, 0, 35, 0, 0, 0,247, 0, 0, 1,124, 0, 0, 0, 35,
- 0, 0, 1,129, 0, 0, 2, 94, 0, 0, 0, 35, 0, 0, 1, 19, 0, 0, 1,129, 0, 0, 0, 35, 0, 0, 1, 19, 0, 0, 2, 94,
- 0, 0, 0, 35, 0, 0, 2, 94, 0, 0, 2, 95, 0, 0, 0, 35, 0, 0, 2, 95, 0, 0, 2, 96, 0, 0, 0, 35, 0, 0, 2, 94,
- 0, 0, 2, 96, 0, 0, 0, 35, 0, 0, 0,253, 0, 0, 1,128, 0, 0, 0, 35, 0, 0, 1,128, 0, 0, 2, 96, 0, 0, 0, 35,
- 0, 0, 0,253, 0, 0, 2, 96, 0, 0, 0, 35, 0, 0, 0,252, 0, 0, 2, 95, 0, 0, 0, 35, 0, 0, 1, 18, 0, 0, 2, 95,
- 0, 0, 0, 35, 0, 0, 0,252, 0, 0, 1, 18, 0, 0, 0, 35, 0, 0, 1,128, 0, 0, 2, 97, 0, 0, 0, 35, 0, 0, 1,128,
- 0, 0, 1,130, 0, 0, 0, 35, 0, 0, 1,130, 0, 0, 2, 97, 0, 0, 0, 35, 0, 0, 2, 97, 0, 0, 2, 98, 0, 0, 0, 35,
- 0, 0, 2, 98, 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 2, 97, 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 1,129, 0, 0, 1,133,
- 0, 0, 0, 35, 0, 0, 1,129, 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 1,133, 0, 0, 2, 99, 0, 0, 0, 35, 0, 0, 1,132,
- 0, 0, 2, 98, 0, 0, 0, 35, 0, 0, 1,131, 0, 0, 2, 98, 0, 0, 0, 35, 0, 0, 1,131, 0, 0, 1,132, 0, 0, 0, 35,
- 0, 0, 1, 16, 0, 0, 2,100, 0, 0, 0, 35, 0, 0, 1, 16, 0, 0, 1, 20, 0, 0, 0, 35, 0, 0, 1, 20, 0, 0, 2,100,
- 0, 0, 0, 35, 0, 0, 2,100, 0, 0, 2,101, 0, 0, 0, 35, 0, 0, 2,101, 0, 0, 2,102, 0, 0, 0, 35, 0, 0, 2,100,
- 0, 0, 2,102, 0, 0, 0, 35, 0, 0, 1, 17, 0, 0, 1,132, 0, 0, 0, 35, 0, 0, 1, 17, 0, 0, 2,102, 0, 0, 0, 35,
- 0, 0, 1,132, 0, 0, 2,102, 0, 0, 0, 35, 0, 0, 1,133, 0, 0, 2,101, 0, 0, 0, 35, 0, 0, 1, 21, 0, 0, 2,101,
- 0, 0, 0, 35, 0, 0, 1, 21, 0, 0, 1,133, 0, 0, 0, 35, 0, 0, 1, 15, 0, 0, 2,103, 0, 0, 0, 35, 0, 0, 1, 15,
- 0, 0, 1,131, 0, 0, 0, 35, 0, 0, 1,131, 0, 0, 2,103, 0, 0, 0, 35, 0, 0, 2,103, 0, 0, 2,104, 0, 0, 0, 35,
- 0, 0, 2,104, 0, 0, 2,105, 0, 0, 0, 35, 0, 0, 2,103, 0, 0, 2,105, 0, 0, 0, 35, 0, 0, 0,250, 0, 0, 1, 14,
- 0, 0, 0, 35, 0, 0, 1, 14, 0, 0, 2,105, 0, 0, 0, 35, 0, 0, 0,250, 0, 0, 2,105, 0, 0, 0, 35, 0, 0, 0,251,
- 0, 0, 2,104, 0, 0, 0, 35, 0, 0, 1,130, 0, 0, 2,104, 0, 0, 0, 35, 0, 0, 0,251, 0, 0, 1,130, 0, 0, 0, 35,
- 0, 0, 1,135, 0, 0, 2,106, 0, 0, 0, 35, 0, 0, 1, 23, 0, 0, 1,135, 0, 0, 0, 35, 0, 0, 1, 23, 0, 0, 2,106,
- 0, 0, 0, 35, 0, 0, 2,106, 0, 0, 2,107, 0, 0, 0, 35, 0, 0, 2,107, 0, 0, 2,108, 0, 0, 0, 35, 0, 0, 2,106,
- 0, 0, 2,108, 0, 0, 0, 35, 0, 0, 1, 1, 0, 0, 1,134, 0, 0, 0, 35, 0, 0, 1,134, 0, 0, 2,108, 0, 0, 0, 35,
- 0, 0, 1, 1, 0, 0, 2,108, 0, 0, 0, 35, 0, 0, 1, 0, 0, 0, 2,107, 0, 0, 0, 35, 0, 0, 1, 22, 0, 0, 2,107,
- 0, 0, 0, 35, 0, 0, 1, 0, 0, 0, 1, 22, 0, 0, 0, 35, 0, 0, 1,134, 0, 0, 2,109, 0, 0, 0, 35, 0, 0, 1,134,
- 0, 0, 1,136, 0, 0, 0, 35, 0, 0, 1,136, 0, 0, 2,109, 0, 0, 0, 35, 0, 0, 2,109, 0, 0, 2,110, 0, 0, 0, 35,
- 0, 0, 2,110, 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 2,109, 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 1,135, 0, 0, 1,139,
- 0, 0, 0, 35, 0, 0, 1,135, 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 1,139, 0, 0, 2,111, 0, 0, 0, 35, 0, 0, 1,138,
- 0, 0, 2,110, 0, 0, 0, 35, 0, 0, 1,137, 0, 0, 2,110, 0, 0, 0, 35, 0, 0, 1,137, 0, 0, 1,138, 0, 0, 0, 35,
- 0, 0, 1, 20, 0, 0, 2,112, 0, 0, 0, 35, 0, 0, 1, 20, 0, 0, 1, 24, 0, 0, 0, 35, 0, 0, 1, 24, 0, 0, 2,112,
- 0, 0, 0, 35, 0, 0, 2,112, 0, 0, 2,113, 0, 0, 0, 35, 0, 0, 2,113, 0, 0, 2,114, 0, 0, 0, 35, 0, 0, 2,112,
- 0, 0, 2,114, 0, 0, 0, 35, 0, 0, 1, 21, 0, 0, 1,138, 0, 0, 0, 35, 0, 0, 1, 21, 0, 0, 2,114, 0, 0, 0, 35,
- 0, 0, 1,138, 0, 0, 2,114, 0, 0, 0, 35, 0, 0, 1,139, 0, 0, 2,113, 0, 0, 0, 35, 0, 0, 1, 25, 0, 0, 2,113,
- 0, 0, 0, 35, 0, 0, 1, 25, 0, 0, 1,139, 0, 0, 0, 35, 0, 0, 1, 19, 0, 0, 2,115, 0, 0, 0, 35, 0, 0, 1, 19,
- 0, 0, 1,137, 0, 0, 0, 35, 0, 0, 1,137, 0, 0, 2,115, 0, 0, 0, 35, 0, 0, 2,115, 0, 0, 2,116, 0, 0, 0, 35,
- 0, 0, 2,116, 0, 0, 2,117, 0, 0, 0, 35, 0, 0, 2,115, 0, 0, 2,117, 0, 0, 0, 35, 0, 0, 0,254, 0, 0, 1, 18,
- 0, 0, 0, 35, 0, 0, 1, 18, 0, 0, 2,117, 0, 0, 0, 35, 0, 0, 0,254, 0, 0, 2,117, 0, 0, 0, 35, 0, 0, 0,255,
- 0, 0, 2,116, 0, 0, 0, 35, 0, 0, 1,136, 0, 0, 2,116, 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 1,136, 0, 0, 0, 35,
- 0, 0, 1,141, 0, 0, 2,118, 0, 0, 0, 35, 0, 0, 1, 7, 0, 0, 1,141, 0, 0, 0, 35, 0, 0, 1, 7, 0, 0, 2,118,
- 0, 0, 0, 35, 0, 0, 2,118, 0, 0, 2,119, 0, 0, 0, 35, 0, 0, 2,119, 0, 0, 2,120, 0, 0, 0, 35, 0, 0, 2,118,
- 0, 0, 2,120, 0, 0, 0, 35, 0, 0, 1, 5, 0, 0, 1,140, 0, 0, 0, 35, 0, 0, 1,140, 0, 0, 2,120, 0, 0, 0, 35,
- 0, 0, 1, 5, 0, 0, 2,120, 0, 0, 0, 35, 0, 0, 1, 4, 0, 0, 2,119, 0, 0, 0, 35, 0, 0, 1, 6, 0, 0, 2,119,
- 0, 0, 0, 35, 0, 0, 1, 4, 0, 0, 1, 6, 0, 0, 0, 35, 0, 0, 1,140, 0, 0, 2,121, 0, 0, 0, 35, 0, 0, 1,140,
- 0, 0, 1,142, 0, 0, 0, 35, 0, 0, 1,142, 0, 0, 2,121, 0, 0, 0, 35, 0, 0, 2,121, 0, 0, 2,122, 0, 0, 0, 35,
- 0, 0, 2,122, 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 2,121, 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 1,141, 0, 0, 1,144,
- 0, 0, 0, 35, 0, 0, 1,141, 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 1,144, 0, 0, 2,123, 0, 0, 0, 35, 0, 0, 1,145,
- 0, 0, 2,122, 0, 0, 0, 35, 0, 0, 1,143, 0, 0, 2,122, 0, 0, 0, 35, 0, 0, 1,143, 0, 0, 1,145, 0, 0, 0, 35,
- 0, 0, 1, 24, 0, 0, 2,124, 0, 0, 0, 35, 0, 0, 1, 8, 0, 0, 1, 24, 0, 0, 0, 35, 0, 0, 1, 8, 0, 0, 2,124,
- 0, 0, 0, 35, 0, 0, 2,124, 0, 0, 2,125, 0, 0, 0, 35, 0, 0, 2,125, 0, 0, 2,126, 0, 0, 0, 35, 0, 0, 2,124,
- 0, 0, 2,126, 0, 0, 0, 35, 0, 0, 1, 25, 0, 0, 1,145, 0, 0, 0, 35, 0, 0, 1, 25, 0, 0, 2,126, 0, 0, 0, 35,
- 0, 0, 1,145, 0, 0, 2,126, 0, 0, 0, 35, 0, 0, 1,144, 0, 0, 2,125, 0, 0, 0, 35, 0, 0, 1, 9, 0, 0, 2,125,
- 0, 0, 0, 35, 0, 0, 1, 9, 0, 0, 1,144, 0, 0, 0, 35, 0, 0, 1, 23, 0, 0, 2,127, 0, 0, 0, 35, 0, 0, 1, 23,
- 0, 0, 1,143, 0, 0, 0, 35, 0, 0, 1,143, 0, 0, 2,127, 0, 0, 0, 35, 0, 0, 2,127, 0, 0, 2,128, 0, 0, 0, 35,
- 0, 0, 2,128, 0, 0, 2,129, 0, 0, 0, 35, 0, 0, 2,127, 0, 0, 2,129, 0, 0, 0, 35, 0, 0, 1, 2, 0, 0, 1, 22,
- 0, 0, 0, 35, 0, 0, 1, 22, 0, 0, 2,129, 0, 0, 0, 35, 0, 0, 1, 2, 0, 0, 2,129, 0, 0, 0, 35, 0, 0, 1, 3,
- 0, 0, 2,128, 0, 0, 0, 35, 0, 0, 1,142, 0, 0, 2,128, 0, 0, 0, 35, 0, 0, 1, 3, 0, 0, 1,142, 0, 0, 0, 35,
- 68, 65, 84, 65, 0, 0, 1, 4, 2,236,247,176, 0, 0, 0,242, 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, 8,108, 16, 32, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 84,101,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, 8,108,128, 32, 0, 0, 0, 6,
- 0, 0, 0, 64, 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, 8,109, 96, 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, 68, 65, 84, 65, 0, 0,100, 0,
- 8,108, 16, 32, 0, 0, 0, 52, 0, 0, 5, 0, 0, 0, 1, 27, 0, 0, 0,102, 0, 0, 1,146, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,146, 0, 0, 0,171, 0, 0, 1, 27, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 14, 0, 0, 1, 27, 0, 0, 0,171,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,171, 0, 0, 1,146, 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,147,
- 0, 0, 0, 46, 0, 0, 1,146, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,146, 0, 0, 1,148, 0, 0, 1,147, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 43, 0, 0, 1,147, 0, 0, 1,148, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,148, 0, 0, 1,146,
- 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 26, 0, 0, 0, 12, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,165, 0, 0, 1,148, 0, 0, 1, 26, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,102, 0, 0, 1, 26, 0, 0, 1,148,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,148, 0, 0, 0,165, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,147,
- 0, 0, 0, 43, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,164, 0, 0, 0,170, 0, 0, 1,147, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 46, 0, 0, 1,147, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,170, 0, 0, 0,164,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 26, 0, 0, 0,102, 0, 0, 1,149, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,149, 0, 0, 1, 28, 0, 0, 1, 26, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 12, 0, 0, 1, 26, 0, 0, 1, 28,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 28, 0, 0, 1,149, 0, 0, 0,103, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,150,
- 0, 0, 0,103, 0, 0, 1,149, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,149, 0, 0, 1,151, 0, 0, 1,150, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,104, 0, 0, 1,150, 0, 0, 1,151, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,151, 0, 0, 1,149,
- 0, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 27, 0, 0, 0, 14, 0, 0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 31, 0, 0, 1,151, 0, 0, 1, 27, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,102, 0, 0, 1, 27, 0, 0, 1,151,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,151, 0, 0, 1, 31, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,150,
- 0, 0, 0,104, 0, 0, 1, 30, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 30, 0, 0, 1, 29, 0, 0, 1,150, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,103, 0, 0, 1,150, 0, 0, 1, 29, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 29, 0, 0, 1, 30,
- 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,168, 0, 0, 0, 45, 0, 0, 1,152, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,152, 0, 0, 0,172, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0,168, 0, 0, 0,172,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,172, 0, 0, 1,152, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,153,
- 0, 0, 0, 47, 0, 0, 1,152, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,152, 0, 0, 1,154, 0, 0, 1,153, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,104, 0, 0, 1,153, 0, 0, 1,154, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,154, 0, 0, 1,152,
- 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,169, 0, 0, 0, 13, 0, 0, 1, 30, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 30, 0, 0, 1,154, 0, 0, 0,169, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 45, 0, 0, 0,169, 0, 0, 1,154,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,154, 0, 0, 1, 30, 0, 0, 0,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,153,
- 0, 0, 0,104, 0, 0, 1, 31, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 31, 0, 0, 0,173, 0, 0, 1,153, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 47, 0, 0, 1,153, 0, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,173, 0, 0, 1, 31,
- 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,167, 0, 0, 0, 44, 0, 0, 1,155, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,155, 0, 0, 1, 29, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 13, 0, 0, 0,167, 0, 0, 1, 29,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 29, 0, 0, 1,155, 0, 0, 0,103, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,156,
- 0, 0, 0,103, 0, 0, 1,155, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,155, 0, 0, 1,157, 0, 0, 1,156, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 42, 0, 0, 1,156, 0, 0, 1,157, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,157, 0, 0, 1,155,
- 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,162, 0, 0, 1,157, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 44, 0, 0, 0,166, 0, 0, 1,157,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,157, 0, 0, 0,162, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,156,
- 0, 0, 0, 42, 0, 0, 0,163, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,163, 0, 0, 1, 28, 0, 0, 1,156, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,103, 0, 0, 1,156, 0, 0, 1, 28, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 28, 0, 0, 0,163,
- 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,158, 0, 0, 0,105, 0, 0, 1, 33, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 33, 0, 0, 0,179, 0, 0, 1,158, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 50, 0, 0, 1,158, 0, 0, 0,179,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,179, 0, 0, 1, 33, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,158,
- 0, 0, 0, 50, 0, 0, 1,159, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,159, 0, 0, 1,160, 0, 0, 1,158, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,105, 0, 0, 1,158, 0, 0, 1,160, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,160, 0, 0, 1,159,
- 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,165, 0, 0, 0, 12, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 32, 0, 0, 1,160, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 43, 0, 0, 0,165, 0, 0, 1,160,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,160, 0, 0, 1, 32, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,164,
- 0, 0, 0, 43, 0, 0, 1,159, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,159, 0, 0, 0,178, 0, 0, 0,164, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0,164, 0, 0, 0,178, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,178, 0, 0, 1,159,
- 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,161, 0, 0, 0,105, 0, 0, 1, 32, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 32, 0, 0, 1, 34, 0, 0, 1,161, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,106, 0, 0, 1,161, 0, 0, 1, 34,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 34, 0, 0, 1, 32, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,161,
- 0, 0, 0,106, 0, 0, 1,162, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,162, 0, 0, 1,163, 0, 0, 1,161, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,105, 0, 0, 1,161, 0, 0, 1,163, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,163, 0, 0, 1,162,
- 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 37, 0, 0, 0, 16, 0, 0, 1, 33, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 33, 0, 0, 1,163, 0, 0, 1, 37, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,107, 0, 0, 1, 37, 0, 0, 1,163,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,163, 0, 0, 1, 33, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 36,
- 0, 0, 0,107, 0, 0, 1,162, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,162, 0, 0, 1, 35, 0, 0, 1, 36, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 15, 0, 0, 1, 36, 0, 0, 1, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 35, 0, 0, 1,162,
- 0, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,164, 0, 0, 0, 49, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,176, 0, 0, 0,180, 0, 0, 1,164, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 51, 0, 0, 1,164, 0, 0, 0,180,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,180, 0, 0, 0,176, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,164,
- 0, 0, 0, 51, 0, 0, 1,165, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,165, 0, 0, 1,166, 0, 0, 1,164, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 49, 0, 0, 1,164, 0, 0, 1,166, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,166, 0, 0, 1,165,
- 0, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 36, 0, 0, 0, 15, 0, 0, 0,177, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,177, 0, 0, 1,166, 0, 0, 1, 36, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,107, 0, 0, 1, 36, 0, 0, 1,166,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,166, 0, 0, 0,177, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 37,
- 0, 0, 0,107, 0, 0, 1,165, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,165, 0, 0, 0,181, 0, 0, 1, 37, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 16, 0, 0, 1, 37, 0, 0, 0,181, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,181, 0, 0, 1,165,
- 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,167, 0, 0, 0, 48, 0, 0, 0,175, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,175, 0, 0, 1, 35, 0, 0, 1,167, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,106, 0, 0, 1,167, 0, 0, 1, 35,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 35, 0, 0, 0,175, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,167,
- 0, 0, 0,106, 0, 0, 1,168, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,168, 0, 0, 1,169, 0, 0, 1,167, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 48, 0, 0, 1,167, 0, 0, 1,169, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,169, 0, 0, 1,168,
- 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,174, 0, 0, 1,169, 0, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 42, 0, 0, 0,162, 0, 0, 1,169,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,169, 0, 0, 0,174, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,163,
- 0, 0, 0, 42, 0, 0, 1,168, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,168, 0, 0, 1, 34, 0, 0, 0,163, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 12, 0, 0, 0,163, 0, 0, 1, 34, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 34, 0, 0, 1,168,
- 0, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 39, 0, 0, 0,108, 0, 0, 1,170, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,170, 0, 0, 0,187, 0, 0, 1, 39, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 18, 0, 0, 1, 39, 0, 0, 0,187,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,187, 0, 0, 1,170, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,171,
- 0, 0, 0, 54, 0, 0, 1,170, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,170, 0, 0, 1,172, 0, 0, 1,171, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 45, 0, 0, 1,171, 0, 0, 1,172, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,172, 0, 0, 1,170,
- 0, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 38, 0, 0, 0, 13, 0, 0, 0,169, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,169, 0, 0, 1,172, 0, 0, 1, 38, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,108, 0, 0, 1, 38, 0, 0, 1,172,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,172, 0, 0, 0,169, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,171,
- 0, 0, 0, 45, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,168, 0, 0, 0,186, 0, 0, 1,171, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 54, 0, 0, 1,171, 0, 0, 0,186, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,186, 0, 0, 0,168,
- 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 38, 0, 0, 0,108, 0, 0, 1,173, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,173, 0, 0, 1, 40, 0, 0, 1, 38, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 13, 0, 0, 1, 38, 0, 0, 1, 40,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 40, 0, 0, 1,173, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,174,
- 0, 0, 0,109, 0, 0, 1,173, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,173, 0, 0, 1,175, 0, 0, 1,174, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,110, 0, 0, 1,174, 0, 0, 1,175, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,175, 0, 0, 1,173,
- 0, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 39, 0, 0, 0, 18, 0, 0, 1, 43, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 43, 0, 0, 1,175, 0, 0, 1, 39, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,108, 0, 0, 1, 39, 0, 0, 1,175,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,175, 0, 0, 1, 43, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,174,
- 0, 0, 0,110, 0, 0, 1, 42, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 42, 0, 0, 1, 41, 0, 0, 1,174, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,109, 0, 0, 1,174, 0, 0, 1, 41, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 41, 0, 0, 1, 42,
- 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,184, 0, 0, 0, 53, 0, 0, 1,176, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,176, 0, 0, 0,188, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0,184, 0, 0, 0,188,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,188, 0, 0, 1,176, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,177,
- 0, 0, 0, 55, 0, 0, 1,176, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,176, 0, 0, 1,178, 0, 0, 1,177, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,110, 0, 0, 1,177, 0, 0, 1,178, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,178, 0, 0, 1,176,
- 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,185, 0, 0, 0, 17, 0, 0, 1, 42, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 42, 0, 0, 1,178, 0, 0, 0,185, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 53, 0, 0, 0,185, 0, 0, 1,178,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,178, 0, 0, 1, 42, 0, 0, 0,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,177,
- 0, 0, 0,110, 0, 0, 1, 43, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 43, 0, 0, 0,189, 0, 0, 1,177, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 55, 0, 0, 1,177, 0, 0, 0,189, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,189, 0, 0, 1, 43,
- 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,183, 0, 0, 0, 52, 0, 0, 1,179, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,179, 0, 0, 1, 41, 0, 0, 0,183, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 17, 0, 0, 0,183, 0, 0, 1, 41,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 41, 0, 0, 1,179, 0, 0, 0,109, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,180,
- 0, 0, 0,109, 0, 0, 1,179, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,179, 0, 0, 1,181, 0, 0, 1,180, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 44, 0, 0, 1,180, 0, 0, 1,181, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,181, 0, 0, 1,179,
- 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,182, 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,166, 0, 0, 1,181, 0, 0, 0,182, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 52, 0, 0, 0,182, 0, 0, 1,181,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,181, 0, 0, 0,166, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,180,
- 0, 0, 0, 44, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,167, 0, 0, 1, 40, 0, 0, 1,180, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,109, 0, 0, 1,180, 0, 0, 1, 40, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 40, 0, 0, 0,167,
- 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 45, 0, 0, 0,111, 0, 0, 1,182, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,182, 0, 0, 0,195, 0, 0, 1, 45, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 1, 45, 0, 0, 0,195,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,195, 0, 0, 1,182, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,183,
- 0, 0, 0, 58, 0, 0, 1,182, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,182, 0, 0, 1,184, 0, 0, 1,183, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 53, 0, 0, 1,183, 0, 0, 1,184, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,184, 0, 0, 1,182,
- 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 44, 0, 0, 0, 17, 0, 0, 0,185, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,185, 0, 0, 1,184, 0, 0, 1, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,111, 0, 0, 1, 44, 0, 0, 1,184,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,184, 0, 0, 0,185, 0, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,183,
- 0, 0, 0, 53, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,184, 0, 0, 0,194, 0, 0, 1,183, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 58, 0, 0, 1,183, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,194, 0, 0, 0,184,
- 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 44, 0, 0, 0,111, 0, 0, 1,185, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,185, 0, 0, 1, 46, 0, 0, 1, 44, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 17, 0, 0, 1, 44, 0, 0, 1, 46,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 46, 0, 0, 1,185, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,186,
- 0, 0, 0,112, 0, 0, 1,185, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,185, 0, 0, 1,187, 0, 0, 1,186, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,113, 0, 0, 1,186, 0, 0, 1,187, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,187, 0, 0, 1,185,
- 0, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 45, 0, 0, 0, 20, 0, 0, 1, 49, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 49, 0, 0, 1,187, 0, 0, 1, 45, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,111, 0, 0, 1, 45, 0, 0, 1,187,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,187, 0, 0, 1, 49, 0, 0, 0,113, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,186,
- 0, 0, 0,113, 0, 0, 1, 48, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 48, 0, 0, 1, 47, 0, 0, 1,186, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,112, 0, 0, 1,186, 0, 0, 1, 47, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 47, 0, 0, 1, 48,
- 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,192, 0, 0, 0, 57, 0, 0, 1,188, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,188, 0, 0, 0,196, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0,192, 0, 0, 0,196,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,196, 0, 0, 1,188, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,189,
- 0, 0, 0, 59, 0, 0, 1,188, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,188, 0, 0, 1,190, 0, 0, 1,189, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,113, 0, 0, 1,189, 0, 0, 1,190, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,190, 0, 0, 1,188,
- 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,193, 0, 0, 0, 19, 0, 0, 1, 48, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 48, 0, 0, 1,190, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 57, 0, 0, 0,193, 0, 0, 1,190,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,190, 0, 0, 1, 48, 0, 0, 0,113, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,189,
- 0, 0, 0,113, 0, 0, 1, 49, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 49, 0, 0, 0,197, 0, 0, 1,189, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 59, 0, 0, 1,189, 0, 0, 0,197, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,197, 0, 0, 1, 49,
- 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,191, 0, 0, 0, 56, 0, 0, 1,191, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,191, 0, 0, 1, 47, 0, 0, 0,191, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 19, 0, 0, 0,191, 0, 0, 1, 47,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 47, 0, 0, 1,191, 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,192,
- 0, 0, 0,112, 0, 0, 1,191, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,191, 0, 0, 1,193, 0, 0, 1,192, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 52, 0, 0, 1,192, 0, 0, 1,193, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,193, 0, 0, 1,191,
- 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,190, 0, 0, 0, 0, 0, 0, 0,182, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,182, 0, 0, 1,193, 0, 0, 0,190, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 56, 0, 0, 0,190, 0, 0, 1,193,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,193, 0, 0, 0,182, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,192,
- 0, 0, 0, 52, 0, 0, 0,183, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,183, 0, 0, 1, 46, 0, 0, 1,192, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,112, 0, 0, 1,192, 0, 0, 1, 46, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 46, 0, 0, 0,183,
- 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 51, 0, 0, 0,114, 0, 0, 1,194, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,194, 0, 0, 0,199, 0, 0, 1, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 21, 0, 0, 1, 51, 0, 0, 0,199,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,199, 0, 0, 1,194, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,195,
- 0, 0, 0, 60, 0, 0, 1,194, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,194, 0, 0, 1,196, 0, 0, 1,195, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 57, 0, 0, 1,195, 0, 0, 1,196, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,196, 0, 0, 1,194,
- 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 50, 0, 0, 0, 19, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,193, 0, 0, 1,196, 0, 0, 1, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,114, 0, 0, 1, 50, 0, 0, 1,196,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,196, 0, 0, 0,193, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,195,
- 0, 0, 0, 57, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,192, 0, 0, 0,198, 0, 0, 1,195, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 60, 0, 0, 1,195, 0, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,198, 0, 0, 0,192,
- 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 50, 0, 0, 0,114, 0, 0, 1,197, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,197, 0, 0, 1, 53, 0, 0, 1, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 19, 0, 0, 1, 50, 0, 0, 1, 53,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 53, 0, 0, 1,197, 0, 0, 0,115, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,198,
- 0, 0, 0,115, 0, 0, 1,197, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,197, 0, 0, 1,199, 0, 0, 1,198, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,116, 0, 0, 1,198, 0, 0, 1,199, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,199, 0, 0, 1,197,
- 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 51, 0, 0, 0, 21, 0, 0, 1, 55, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 55, 0, 0, 1,199, 0, 0, 1, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,114, 0, 0, 1, 51, 0, 0, 1,199,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,199, 0, 0, 1, 55, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,198,
- 0, 0, 0,116, 0, 0, 1, 54, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 54, 0, 0, 1, 52, 0, 0, 1,198, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,115, 0, 0, 1,198, 0, 0, 1, 52, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 52, 0, 0, 1, 54,
- 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,176, 0, 0, 0, 49, 0, 0, 1,200, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,200, 0, 0, 0,200, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0,176, 0, 0, 0,200,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,200, 0, 0, 1,200, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,201,
- 0, 0, 0, 61, 0, 0, 1,200, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,200, 0, 0, 1,202, 0, 0, 1,201, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,116, 0, 0, 1,201, 0, 0, 1,202, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,202, 0, 0, 1,200,
- 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,177, 0, 0, 0, 15, 0, 0, 1, 54, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 54, 0, 0, 1,202, 0, 0, 0,177, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 49, 0, 0, 0,177, 0, 0, 1,202,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,202, 0, 0, 1, 54, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,201,
- 0, 0, 0,116, 0, 0, 1, 55, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 55, 0, 0, 0,201, 0, 0, 1,201, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 61, 0, 0, 1,201, 0, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,201, 0, 0, 1, 55,
- 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,175, 0, 0, 0, 48, 0, 0, 1,203, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,203, 0, 0, 1, 52, 0, 0, 0,175, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 15, 0, 0, 0,175, 0, 0, 1, 52,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 52, 0, 0, 1,203, 0, 0, 0,115, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,204,
- 0, 0, 0,115, 0, 0, 1,203, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,203, 0, 0, 1,205, 0, 0, 1,204, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 56, 0, 0, 1,204, 0, 0, 1,205, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,205, 0, 0, 1,203,
- 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 0,190, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,190, 0, 0, 1,205, 0, 0, 0,174, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 48, 0, 0, 0,174, 0, 0, 1,205,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,205, 0, 0, 0,190, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,204,
- 0, 0, 0, 56, 0, 0, 0,191, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,191, 0, 0, 1, 53, 0, 0, 1,204, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,115, 0, 0, 1,204, 0, 0, 1, 53, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 53, 0, 0, 0,191,
- 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,206, 0, 0, 0,117, 0, 0, 1, 57, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 57, 0, 0, 0,207, 0, 0, 1,206, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 64, 0, 0, 1,206, 0, 0, 0,207,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,207, 0, 0, 1, 57, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,206,
- 0, 0, 0, 64, 0, 0, 1,207, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,207, 0, 0, 1,208, 0, 0, 1,206, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,117, 0, 0, 1,206, 0, 0, 1,208, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,208, 0, 0, 1,207,
- 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,179, 0, 0, 0, 16, 0, 0, 1, 56, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 56, 0, 0, 1,208, 0, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 50, 0, 0, 0,179, 0, 0, 1,208,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,208, 0, 0, 1, 56, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,178,
- 0, 0, 0, 50, 0, 0, 1,207, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,207, 0, 0, 0,206, 0, 0, 0,178, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0,178, 0, 0, 0,206, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,206, 0, 0, 1,207,
- 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,209, 0, 0, 0,117, 0, 0, 1, 56, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 56, 0, 0, 1, 58, 0, 0, 1,209, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,118, 0, 0, 1,209, 0, 0, 1, 58,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 58, 0, 0, 1, 56, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,209,
- 0, 0, 0,118, 0, 0, 1,210, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,210, 0, 0, 1,211, 0, 0, 1,209, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,117, 0, 0, 1,209, 0, 0, 1,211, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,211, 0, 0, 1,210,
- 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 61, 0, 0, 0, 23, 0, 0, 1, 57, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 57, 0, 0, 1,211, 0, 0, 1, 61, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,119, 0, 0, 1, 61, 0, 0, 1,211,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,211, 0, 0, 1, 57, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 60,
- 0, 0, 0,119, 0, 0, 1,210, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,210, 0, 0, 1, 59, 0, 0, 1, 60, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 22, 0, 0, 1, 60, 0, 0, 1, 59, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 59, 0, 0, 1,210,
- 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,212, 0, 0, 0, 63, 0, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,204, 0, 0, 0,208, 0, 0, 1,212, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 65, 0, 0, 1,212, 0, 0, 0,208,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,208, 0, 0, 0,204, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,212,
- 0, 0, 0, 65, 0, 0, 1,213, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,213, 0, 0, 1,214, 0, 0, 1,212, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 63, 0, 0, 1,212, 0, 0, 1,214, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,214, 0, 0, 1,213,
- 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 60, 0, 0, 0, 22, 0, 0, 0,205, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,205, 0, 0, 1,214, 0, 0, 1, 60, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,119, 0, 0, 1, 60, 0, 0, 1,214,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,214, 0, 0, 0,205, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 61,
- 0, 0, 0,119, 0, 0, 1,213, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,213, 0, 0, 0,209, 0, 0, 1, 61, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 23, 0, 0, 1, 61, 0, 0, 0,209, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,209, 0, 0, 1,213,
- 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,215, 0, 0, 0, 62, 0, 0, 0,203, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,203, 0, 0, 1, 59, 0, 0, 1,215, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,118, 0, 0, 1,215, 0, 0, 1, 59,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 59, 0, 0, 0,203, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,215,
- 0, 0, 0,118, 0, 0, 1,216, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,216, 0, 0, 1,217, 0, 0, 1,215, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 62, 0, 0, 1,215, 0, 0, 1,217, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,217, 0, 0, 1,216,
- 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,180, 0, 0, 0, 5, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,202, 0, 0, 1,217, 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 51, 0, 0, 0,180, 0, 0, 1,217,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,217, 0, 0, 0,202, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,181,
- 0, 0, 0, 51, 0, 0, 1,216, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,216, 0, 0, 1, 58, 0, 0, 0,181, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 16, 0, 0, 0,181, 0, 0, 1, 58, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 58, 0, 0, 1,216,
- 0, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,218, 0, 0, 0,120, 0, 0, 1, 63, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 63, 0, 0, 0,215, 0, 0, 1,218, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 68, 0, 0, 1,218, 0, 0, 0,215,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,215, 0, 0, 1, 63, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,218,
- 0, 0, 0, 68, 0, 0, 1,219, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,219, 0, 0, 1,220, 0, 0, 1,218, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,120, 0, 0, 1,218, 0, 0, 1,220, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,220, 0, 0, 1,219,
- 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,173, 0, 0, 0, 14, 0, 0, 1, 62, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 62, 0, 0, 1,220, 0, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 47, 0, 0, 0,173, 0, 0, 1,220,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,220, 0, 0, 1, 62, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,172,
- 0, 0, 0, 47, 0, 0, 1,219, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,219, 0, 0, 0,214, 0, 0, 0,172, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0,172, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,214, 0, 0, 1,219,
- 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,221, 0, 0, 0,120, 0, 0, 1, 62, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 62, 0, 0, 1, 64, 0, 0, 1,221, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,121, 0, 0, 1,221, 0, 0, 1, 64,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 64, 0, 0, 1, 62, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,221,
- 0, 0, 0,121, 0, 0, 1,222, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,222, 0, 0, 1,223, 0, 0, 1,221, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,120, 0, 0, 1,221, 0, 0, 1,223, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,223, 0, 0, 1,222,
- 0, 0, 0,122, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 67, 0, 0, 0, 25, 0, 0, 1, 63, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 63, 0, 0, 1,223, 0, 0, 1, 67, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,122, 0, 0, 1, 67, 0, 0, 1,223,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,223, 0, 0, 1, 63, 0, 0, 0,120, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 66,
- 0, 0, 0,122, 0, 0, 1,222, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,222, 0, 0, 1, 65, 0, 0, 1, 66, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 24, 0, 0, 1, 66, 0, 0, 1, 65, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 65, 0, 0, 1,222,
- 0, 0, 0,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,224, 0, 0, 0, 67, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,212, 0, 0, 0,216, 0, 0, 1,224, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 69, 0, 0, 1,224, 0, 0, 0,216,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,216, 0, 0, 0,212, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,224,
- 0, 0, 0, 69, 0, 0, 1,225, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,225, 0, 0, 1,226, 0, 0, 1,224, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 67, 0, 0, 1,224, 0, 0, 1,226, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,226, 0, 0, 1,225,
- 0, 0, 0,122, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 66, 0, 0, 0, 24, 0, 0, 0,213, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,213, 0, 0, 1,226, 0, 0, 1, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,122, 0, 0, 1, 66, 0, 0, 1,226,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,226, 0, 0, 0,213, 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 67,
- 0, 0, 0,122, 0, 0, 1,225, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,225, 0, 0, 0,217, 0, 0, 1, 67, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 25, 0, 0, 1, 67, 0, 0, 0,217, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,217, 0, 0, 1,225,
- 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,227, 0, 0, 0, 66, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,211, 0, 0, 1, 65, 0, 0, 1,227, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,121, 0, 0, 1,227, 0, 0, 1, 65,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 65, 0, 0, 0,211, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,227,
- 0, 0, 0,121, 0, 0, 1,228, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,228, 0, 0, 1,229, 0, 0, 1,227, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 66, 0, 0, 1,227, 0, 0, 1,229, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,229, 0, 0, 1,228,
- 0, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,170, 0, 0, 0, 1, 0, 0, 0,210, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,210, 0, 0, 1,229, 0, 0, 0,170, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 46, 0, 0, 0,170, 0, 0, 1,229,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,229, 0, 0, 0,210, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,171,
- 0, 0, 0, 46, 0, 0, 1,228, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,228, 0, 0, 1, 64, 0, 0, 0,171, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 14, 0, 0, 0,171, 0, 0, 1, 64, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 64, 0, 0, 1,228,
- 0, 0, 0,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,230, 0, 0, 0,123, 0, 0, 1, 69, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 69, 0, 0, 0,223, 0, 0, 1,230, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 72, 0, 0, 1,230, 0, 0, 0,223,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,223, 0, 0, 1, 69, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,230,
- 0, 0, 0, 72, 0, 0, 1,231, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,231, 0, 0, 1,232, 0, 0, 1,230, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,123, 0, 0, 1,230, 0, 0, 1,232, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,232, 0, 0, 1,231,
- 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,189, 0, 0, 0, 18, 0, 0, 1, 68, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 68, 0, 0, 1,232, 0, 0, 0,189, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 55, 0, 0, 0,189, 0, 0, 1,232,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,232, 0, 0, 1, 68, 0, 0, 0,123, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,188,
- 0, 0, 0, 55, 0, 0, 1,231, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,231, 0, 0, 0,222, 0, 0, 0,188, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0,188, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,222, 0, 0, 1,231,
- 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,233, 0, 0, 0,123, 0, 0, 1, 68, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 68, 0, 0, 1, 70, 0, 0, 1,233, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,124, 0, 0, 1,233, 0, 0, 1, 70,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 70, 0, 0, 1, 68, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,233,
- 0, 0, 0,124, 0, 0, 1,234, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,234, 0, 0, 1,235, 0, 0, 1,233, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,123, 0, 0, 1,233, 0, 0, 1,235, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,235, 0, 0, 1,234,
- 0, 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 73, 0, 0, 0, 27, 0, 0, 1, 69, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 69, 0, 0, 1,235, 0, 0, 1, 73, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,125, 0, 0, 1, 73, 0, 0, 1,235,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,235, 0, 0, 1, 69, 0, 0, 0,123, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 72,
- 0, 0, 0,125, 0, 0, 1,234, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,234, 0, 0, 1, 71, 0, 0, 1, 72, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 26, 0, 0, 1, 72, 0, 0, 1, 71, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 71, 0, 0, 1,234,
- 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,236, 0, 0, 0, 71, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,220, 0, 0, 0,224, 0, 0, 1,236, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 73, 0, 0, 1,236, 0, 0, 0,224,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,224, 0, 0, 0,220, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,236,
- 0, 0, 0, 73, 0, 0, 1,237, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,237, 0, 0, 1,238, 0, 0, 1,236, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 71, 0, 0, 1,236, 0, 0, 1,238, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,238, 0, 0, 1,237,
- 0, 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 72, 0, 0, 0, 26, 0, 0, 0,221, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,221, 0, 0, 1,238, 0, 0, 1, 72, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,125, 0, 0, 1, 72, 0, 0, 1,238,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,238, 0, 0, 0,221, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 73,
- 0, 0, 0,125, 0, 0, 1,237, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,237, 0, 0, 0,225, 0, 0, 1, 73, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 27, 0, 0, 1, 73, 0, 0, 0,225, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,225, 0, 0, 1,237,
- 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,239, 0, 0, 0, 70, 0, 0, 0,219, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,219, 0, 0, 1, 71, 0, 0, 1,239, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,124, 0, 0, 1,239, 0, 0, 1, 71,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 71, 0, 0, 0,219, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,239,
- 0, 0, 0,124, 0, 0, 1,240, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,240, 0, 0, 1,241, 0, 0, 1,239, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 70, 0, 0, 1,239, 0, 0, 1,241, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,241, 0, 0, 1,240,
- 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,186, 0, 0, 0, 2, 0, 0, 0,218, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,218, 0, 0, 1,241, 0, 0, 0,186, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 54, 0, 0, 0,186, 0, 0, 1,241,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,241, 0, 0, 0,218, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,187,
- 0, 0, 0, 54, 0, 0, 1,240, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,240, 0, 0, 1, 70, 0, 0, 0,187, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 18, 0, 0, 0,187, 0, 0, 1, 70, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 70, 0, 0, 1,240,
- 0, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,242, 0, 0, 0,126, 0, 0, 1, 75, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 75, 0, 0, 0,231, 0, 0, 1,242, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 76, 0, 0, 1,242, 0, 0, 0,231,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,231, 0, 0, 1, 75, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,242,
- 0, 0, 0, 76, 0, 0, 1,243, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,243, 0, 0, 1,244, 0, 0, 1,242, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,126, 0, 0, 1,242, 0, 0, 1,244, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,244, 0, 0, 1,243,
- 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,197, 0, 0, 0, 20, 0, 0, 1, 74, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 74, 0, 0, 1,244, 0, 0, 0,197, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 59, 0, 0, 0,197, 0, 0, 1,244,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,244, 0, 0, 1, 74, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,196,
- 0, 0, 0, 59, 0, 0, 1,243, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,243, 0, 0, 0,230, 0, 0, 0,196, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0,196, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,230, 0, 0, 1,243,
- 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,245, 0, 0, 0,126, 0, 0, 1, 74, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 74, 0, 0, 1, 76, 0, 0, 1,245, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,127, 0, 0, 1,245, 0, 0, 1, 76,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 76, 0, 0, 1, 74, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,245,
- 0, 0, 0,127, 0, 0, 1,246, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,246, 0, 0, 1,247, 0, 0, 1,245, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,126, 0, 0, 1,245, 0, 0, 1,247, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,247, 0, 0, 1,246,
- 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 79, 0, 0, 0, 29, 0, 0, 1, 75, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 75, 0, 0, 1,247, 0, 0, 1, 79, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,128, 0, 0, 1, 79, 0, 0, 1,247,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,247, 0, 0, 1, 75, 0, 0, 0,126, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 78,
- 0, 0, 0,128, 0, 0, 1,246, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,246, 0, 0, 1, 77, 0, 0, 1, 78, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 28, 0, 0, 1, 78, 0, 0, 1, 77, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 77, 0, 0, 1,246,
- 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,248, 0, 0, 0, 75, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,228, 0, 0, 0,232, 0, 0, 1,248, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 77, 0, 0, 1,248, 0, 0, 0,232,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,232, 0, 0, 0,228, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,248,
- 0, 0, 0, 77, 0, 0, 1,249, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,249, 0, 0, 1,250, 0, 0, 1,248, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 75, 0, 0, 1,248, 0, 0, 1,250, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,250, 0, 0, 1,249,
- 0, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 78, 0, 0, 0, 28, 0, 0, 0,229, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,229, 0, 0, 1,250, 0, 0, 1, 78, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,128, 0, 0, 1, 78, 0, 0, 1,250,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,250, 0, 0, 0,229, 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 79,
- 0, 0, 0,128, 0, 0, 1,249, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,249, 0, 0, 0,233, 0, 0, 1, 79, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 29, 0, 0, 1, 79, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,233, 0, 0, 1,249,
- 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,251, 0, 0, 0, 74, 0, 0, 0,227, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,227, 0, 0, 1, 77, 0, 0, 1,251, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,127, 0, 0, 1,251, 0, 0, 1, 77,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 77, 0, 0, 0,227, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,251,
- 0, 0, 0,127, 0, 0, 1,252, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,252, 0, 0, 1,253, 0, 0, 1,251, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 74, 0, 0, 1,251, 0, 0, 1,253, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,253, 0, 0, 1,252,
- 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,194, 0, 0, 0, 3, 0, 0, 0,226, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,226, 0, 0, 1,253, 0, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 58, 0, 0, 0,194, 0, 0, 1,253,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,253, 0, 0, 0,226, 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,195,
- 0, 0, 0, 58, 0, 0, 1,252, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,252, 0, 0, 1, 76, 0, 0, 0,195, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 20, 0, 0, 0,195, 0, 0, 1, 76, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 76, 0, 0, 1,252,
- 0, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,254, 0, 0, 0,129, 0, 0, 1, 81, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 81, 0, 0, 0,239, 0, 0, 1,254, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 80, 0, 0, 1,254, 0, 0, 0,239,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,239, 0, 0, 1, 81, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,254,
- 0, 0, 0, 80, 0, 0, 1,255, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,255, 0, 0, 2, 0, 0, 0, 1,254, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,129, 0, 0, 1,254, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 1,255,
- 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,201, 0, 0, 0, 21, 0, 0, 1, 80, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 80, 0, 0, 2, 0, 0, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 61, 0, 0, 0,201, 0, 0, 2, 0,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 1, 80, 0, 0, 0,129, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,200,
- 0, 0, 0, 61, 0, 0, 1,255, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,255, 0, 0, 0,238, 0, 0, 0,200, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0,200, 0, 0, 0,238, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,238, 0, 0, 1,255,
- 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 1, 0, 0, 0,129, 0, 0, 1, 80, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 80, 0, 0, 1, 82, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,130, 0, 0, 2, 1, 0, 0, 1, 82,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 82, 0, 0, 1, 80, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 1,
- 0, 0, 0,130, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 2, 0, 0, 2, 3, 0, 0, 2, 1, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,129, 0, 0, 2, 1, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 3, 0, 0, 2, 2,
- 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 85, 0, 0, 0, 31, 0, 0, 1, 81, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 81, 0, 0, 2, 3, 0, 0, 1, 85, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,131, 0, 0, 1, 85, 0, 0, 2, 3,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 3, 0, 0, 1, 81, 0, 0, 0,129, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 84,
- 0, 0, 0,131, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 2, 0, 0, 1, 83, 0, 0, 1, 84, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 30, 0, 0, 1, 84, 0, 0, 1, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 83, 0, 0, 2, 2,
- 0, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 4, 0, 0, 0, 79, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,236, 0, 0, 0,240, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 81, 0, 0, 2, 4, 0, 0, 0,240,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,240, 0, 0, 0,236, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 4,
- 0, 0, 0, 81, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 5, 0, 0, 2, 6, 0, 0, 2, 4, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 79, 0, 0, 2, 4, 0, 0, 2, 6, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 6, 0, 0, 2, 5,
- 0, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 84, 0, 0, 0, 30, 0, 0, 0,237, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,237, 0, 0, 2, 6, 0, 0, 1, 84, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,131, 0, 0, 1, 84, 0, 0, 2, 6,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 6, 0, 0, 0,237, 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 85,
- 0, 0, 0,131, 0, 0, 2, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 5, 0, 0, 0,241, 0, 0, 1, 85, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 31, 0, 0, 1, 85, 0, 0, 0,241, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,241, 0, 0, 2, 5,
- 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 7, 0, 0, 0, 78, 0, 0, 0,235, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,235, 0, 0, 1, 83, 0, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,130, 0, 0, 2, 7, 0, 0, 1, 83,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 83, 0, 0, 0,235, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 7,
- 0, 0, 0,130, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 8, 0, 0, 2, 9, 0, 0, 2, 7, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 78, 0, 0, 2, 7, 0, 0, 2, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 9, 0, 0, 2, 8,
- 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,198, 0, 0, 0, 4, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,234, 0, 0, 2, 9, 0, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 60, 0, 0, 0,198, 0, 0, 2, 9,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 9, 0, 0, 0,234, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,199,
- 0, 0, 0, 60, 0, 0, 2, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 8, 0, 0, 1, 82, 0, 0, 0,199, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 21, 0, 0, 0,199, 0, 0, 1, 82, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 82, 0, 0, 2, 8,
- 0, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 87, 0, 0, 0,132, 0, 0, 2, 10, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 10, 0, 0, 0,245, 0, 0, 1, 87, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 32, 0, 0, 1, 87, 0, 0, 0,245,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,245, 0, 0, 2, 10, 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 11,
- 0, 0, 0, 83, 0, 0, 2, 10, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 10, 0, 0, 2, 12, 0, 0, 2, 11, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 65, 0, 0, 2, 11, 0, 0, 2, 12, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 12, 0, 0, 2, 10,
- 0, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 86, 0, 0, 0, 23, 0, 0, 0,209, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,209, 0, 0, 2, 12, 0, 0, 1, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,132, 0, 0, 1, 86, 0, 0, 2, 12,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 12, 0, 0, 0,209, 0, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 11,
- 0, 0, 0, 65, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,208, 0, 0, 0,244, 0, 0, 2, 11, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 83, 0, 0, 2, 11, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,244, 0, 0, 0,208,
- 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 86, 0, 0, 0,132, 0, 0, 2, 13, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 13, 0, 0, 1, 88, 0, 0, 1, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 23, 0, 0, 1, 86, 0, 0, 1, 88,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 88, 0, 0, 2, 13, 0, 0, 0,133, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 14,
- 0, 0, 0,133, 0, 0, 2, 13, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 13, 0, 0, 2, 15, 0, 0, 2, 14, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,134, 0, 0, 2, 14, 0, 0, 2, 15, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 15, 0, 0, 2, 13,
- 0, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 87, 0, 0, 0, 32, 0, 0, 1, 91, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 91, 0, 0, 2, 15, 0, 0, 1, 87, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,132, 0, 0, 1, 87, 0, 0, 2, 15,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 15, 0, 0, 1, 91, 0, 0, 0,134, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 14,
- 0, 0, 0,134, 0, 0, 1, 90, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 90, 0, 0, 1, 89, 0, 0, 2, 14, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,133, 0, 0, 2, 14, 0, 0, 1, 89, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 89, 0, 0, 1, 90,
- 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,212, 0, 0, 0, 67, 0, 0, 2, 16, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 16, 0, 0, 0,242, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0,212, 0, 0, 0,242,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,242, 0, 0, 2, 16, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 17,
- 0, 0, 0, 82, 0, 0, 2, 16, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 16, 0, 0, 2, 18, 0, 0, 2, 17, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,134, 0, 0, 2, 17, 0, 0, 2, 18, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 18, 0, 0, 2, 16,
- 0, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,213, 0, 0, 0, 24, 0, 0, 1, 90, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 90, 0, 0, 2, 18, 0, 0, 0,213, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 67, 0, 0, 0,213, 0, 0, 2, 18,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 18, 0, 0, 1, 90, 0, 0, 0,134, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 17,
- 0, 0, 0,134, 0, 0, 1, 91, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 91, 0, 0, 0,243, 0, 0, 2, 17, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 82, 0, 0, 2, 17, 0, 0, 0,243, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,243, 0, 0, 1, 91,
- 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,211, 0, 0, 0, 66, 0, 0, 2, 19, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 19, 0, 0, 1, 89, 0, 0, 0,211, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 24, 0, 0, 0,211, 0, 0, 1, 89,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 89, 0, 0, 2, 19, 0, 0, 0,133, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 20,
- 0, 0, 0,133, 0, 0, 2, 19, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 19, 0, 0, 2, 21, 0, 0, 2, 20, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 64, 0, 0, 2, 20, 0, 0, 2, 21, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 21, 0, 0, 2, 19,
- 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,210, 0, 0, 0, 1, 0, 0, 0,206, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,206, 0, 0, 2, 21, 0, 0, 0,210, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 66, 0, 0, 0,210, 0, 0, 2, 21,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 21, 0, 0, 0,206, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 20,
- 0, 0, 0, 64, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,207, 0, 0, 1, 88, 0, 0, 2, 20, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,133, 0, 0, 2, 20, 0, 0, 1, 88, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 88, 0, 0, 0,207,
- 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 93, 0, 0, 0,135, 0, 0, 2, 22, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 22, 0, 0, 0,247, 0, 0, 1, 93, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 33, 0, 0, 1, 93, 0, 0, 0,247,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,247, 0, 0, 2, 22, 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 23,
- 0, 0, 0, 84, 0, 0, 2, 22, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 22, 0, 0, 2, 24, 0, 0, 2, 23, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 69, 0, 0, 2, 23, 0, 0, 2, 24, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 24, 0, 0, 2, 22,
- 0, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 92, 0, 0, 0, 25, 0, 0, 0,217, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,217, 0, 0, 2, 24, 0, 0, 1, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,135, 0, 0, 1, 92, 0, 0, 2, 24,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 24, 0, 0, 0,217, 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 23,
- 0, 0, 0, 69, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,216, 0, 0, 0,246, 0, 0, 2, 23, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 84, 0, 0, 2, 23, 0, 0, 0,246, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,246, 0, 0, 0,216,
- 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 92, 0, 0, 0,135, 0, 0, 2, 25, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 25, 0, 0, 1, 94, 0, 0, 1, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 25, 0, 0, 1, 92, 0, 0, 1, 94,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 94, 0, 0, 2, 25, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 26,
- 0, 0, 0,136, 0, 0, 2, 25, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 25, 0, 0, 2, 27, 0, 0, 2, 26, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,137, 0, 0, 2, 26, 0, 0, 2, 27, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 27, 0, 0, 2, 25,
- 0, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 93, 0, 0, 0, 33, 0, 0, 1, 97, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 97, 0, 0, 2, 27, 0, 0, 1, 93, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,135, 0, 0, 1, 93, 0, 0, 2, 27,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 27, 0, 0, 1, 97, 0, 0, 0,137, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 26,
- 0, 0, 0,137, 0, 0, 1, 96, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 96, 0, 0, 1, 95, 0, 0, 2, 26, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,136, 0, 0, 2, 26, 0, 0, 1, 95, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 95, 0, 0, 1, 96,
- 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,220, 0, 0, 0, 71, 0, 0, 2, 28, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 28, 0, 0, 0,248, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0,220, 0, 0, 0,248,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,248, 0, 0, 2, 28, 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 29,
- 0, 0, 0, 85, 0, 0, 2, 28, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 28, 0, 0, 2, 30, 0, 0, 2, 29, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,137, 0, 0, 2, 29, 0, 0, 2, 30, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 30, 0, 0, 2, 28,
- 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,221, 0, 0, 0, 26, 0, 0, 1, 96, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 96, 0, 0, 2, 30, 0, 0, 0,221, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 71, 0, 0, 0,221, 0, 0, 2, 30,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 30, 0, 0, 1, 96, 0, 0, 0,137, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 29,
- 0, 0, 0,137, 0, 0, 1, 97, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 97, 0, 0, 0,249, 0, 0, 2, 29, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 85, 0, 0, 2, 29, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,249, 0, 0, 1, 97,
- 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,219, 0, 0, 0, 70, 0, 0, 2, 31, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 31, 0, 0, 1, 95, 0, 0, 0,219, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 26, 0, 0, 0,219, 0, 0, 1, 95,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 95, 0, 0, 2, 31, 0, 0, 0,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 32,
- 0, 0, 0,136, 0, 0, 2, 31, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 31, 0, 0, 2, 33, 0, 0, 2, 32, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 68, 0, 0, 2, 32, 0, 0, 2, 33, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 33, 0, 0, 2, 31,
- 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,218, 0, 0, 0, 2, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,214, 0, 0, 2, 33, 0, 0, 0,218, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 70, 0, 0, 0,218, 0, 0, 2, 33,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 33, 0, 0, 0,214, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 32,
- 0, 0, 0, 68, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,215, 0, 0, 1, 94, 0, 0, 2, 32, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,136, 0, 0, 2, 32, 0, 0, 1, 94, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 94, 0, 0, 0,215,
- 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 99, 0, 0, 0,138, 0, 0, 2, 34, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 34, 0, 0, 0,251, 0, 0, 1, 99, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 1, 99, 0, 0, 0,251,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,251, 0, 0, 2, 34, 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 35,
- 0, 0, 0, 86, 0, 0, 2, 34, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 34, 0, 0, 2, 36, 0, 0, 2, 35, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 73, 0, 0, 2, 35, 0, 0, 2, 36, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 36, 0, 0, 2, 34,
- 0, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 98, 0, 0, 0, 27, 0, 0, 0,225, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,225, 0, 0, 2, 36, 0, 0, 1, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,138, 0, 0, 1, 98, 0, 0, 2, 36,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 36, 0, 0, 0,225, 0, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 35,
- 0, 0, 0, 73, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,224, 0, 0, 0,250, 0, 0, 2, 35, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 86, 0, 0, 2, 35, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,250, 0, 0, 0,224,
- 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 98, 0, 0, 0,138, 0, 0, 2, 37, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 37, 0, 0, 1,100, 0, 0, 1, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 27, 0, 0, 1, 98, 0, 0, 1,100,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,100, 0, 0, 2, 37, 0, 0, 0,139, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 38,
- 0, 0, 0,139, 0, 0, 2, 37, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 37, 0, 0, 2, 39, 0, 0, 2, 38, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,140, 0, 0, 2, 38, 0, 0, 2, 39, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 39, 0, 0, 2, 37,
- 0, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 99, 0, 0, 0, 34, 0, 0, 1,103, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,103, 0, 0, 2, 39, 0, 0, 1, 99, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,138, 0, 0, 1, 99, 0, 0, 2, 39,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 39, 0, 0, 1,103, 0, 0, 0,140, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 38,
- 0, 0, 0,140, 0, 0, 1,102, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,102, 0, 0, 1,101, 0, 0, 2, 38, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,139, 0, 0, 2, 38, 0, 0, 1,101, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,101, 0, 0, 1,102,
- 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,228, 0, 0, 0, 75, 0, 0, 2, 40, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 40, 0, 0, 0,252, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0,228, 0, 0, 0,252,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,252, 0, 0, 2, 40, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 41,
- 0, 0, 0, 87, 0, 0, 2, 40, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 40, 0, 0, 2, 42, 0, 0, 2, 41, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,140, 0, 0, 2, 41, 0, 0, 2, 42, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 42, 0, 0, 2, 40,
- 0, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,229, 0, 0, 0, 28, 0, 0, 1,102, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,102, 0, 0, 2, 42, 0, 0, 0,229, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 75, 0, 0, 0,229, 0, 0, 2, 42,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 42, 0, 0, 1,102, 0, 0, 0,140, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 41,
- 0, 0, 0,140, 0, 0, 1,103, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,103, 0, 0, 0,253, 0, 0, 2, 41, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 87, 0, 0, 2, 41, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,253, 0, 0, 1,103,
- 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,227, 0, 0, 0, 74, 0, 0, 2, 43, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 43, 0, 0, 1,101, 0, 0, 0,227, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 28, 0, 0, 0,227, 0, 0, 1,101,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,101, 0, 0, 2, 43, 0, 0, 0,139, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 44,
- 0, 0, 0,139, 0, 0, 2, 43, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 43, 0, 0, 2, 45, 0, 0, 2, 44, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 72, 0, 0, 2, 44, 0, 0, 2, 45, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 45, 0, 0, 2, 43,
- 0, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,226, 0, 0, 0, 3, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,222, 0, 0, 2, 45, 0, 0, 0,226, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 74, 0, 0, 0,226, 0, 0, 2, 45,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 45, 0, 0, 0,222, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 44,
- 0, 0, 0, 72, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,223, 0, 0, 1,100, 0, 0, 2, 44, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,139, 0, 0, 2, 44, 0, 0, 1,100, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,100, 0, 0, 0,223,
- 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,105, 0, 0, 0,141, 0, 0, 2, 46, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 46, 0, 0, 0,255, 0, 0, 1,105, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 1,105, 0, 0, 0,255,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,255, 0, 0, 2, 46, 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 47,
- 0, 0, 0, 88, 0, 0, 2, 46, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 46, 0, 0, 2, 48, 0, 0, 2, 47, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 77, 0, 0, 2, 47, 0, 0, 2, 48, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 48, 0, 0, 2, 46,
- 0, 0, 0,141, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,104, 0, 0, 0, 29, 0, 0, 0,233, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,233, 0, 0, 2, 48, 0, 0, 1,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,141, 0, 0, 1,104, 0, 0, 2, 48,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 48, 0, 0, 0,233, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 47,
- 0, 0, 0, 77, 0, 0, 0,232, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,232, 0, 0, 0,254, 0, 0, 2, 47, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 88, 0, 0, 2, 47, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,254, 0, 0, 0,232,
- 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,104, 0, 0, 0,141, 0, 0, 2, 49, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 49, 0, 0, 1,106, 0, 0, 1,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 29, 0, 0, 1,104, 0, 0, 1,106,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,106, 0, 0, 2, 49, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 50,
- 0, 0, 0,142, 0, 0, 2, 49, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 49, 0, 0, 2, 51, 0, 0, 2, 50, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,143, 0, 0, 2, 50, 0, 0, 2, 51, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 51, 0, 0, 2, 49,
- 0, 0, 0,141, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,105, 0, 0, 0, 35, 0, 0, 1,109, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,109, 0, 0, 2, 51, 0, 0, 1,105, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,141, 0, 0, 1,105, 0, 0, 2, 51,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 51, 0, 0, 1,109, 0, 0, 0,143, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 50,
- 0, 0, 0,143, 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,108, 0, 0, 1,107, 0, 0, 2, 50, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,142, 0, 0, 2, 50, 0, 0, 1,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,107, 0, 0, 1,108,
- 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,236, 0, 0, 0, 79, 0, 0, 2, 52, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 52, 0, 0, 1, 0, 0, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 9, 0, 0, 0,236, 0, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0, 0, 0, 2, 52, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 53,
- 0, 0, 0, 89, 0, 0, 2, 52, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 52, 0, 0, 2, 54, 0, 0, 2, 53, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,143, 0, 0, 2, 53, 0, 0, 2, 54, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 54, 0, 0, 2, 52,
- 0, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,237, 0, 0, 0, 30, 0, 0, 1,108, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,108, 0, 0, 2, 54, 0, 0, 0,237, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 79, 0, 0, 0,237, 0, 0, 2, 54,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 54, 0, 0, 1,108, 0, 0, 0,143, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 53,
- 0, 0, 0,143, 0, 0, 1,109, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,109, 0, 0, 1, 1, 0, 0, 2, 53, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 89, 0, 0, 2, 53, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 1, 0, 0, 1,109,
- 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,235, 0, 0, 0, 78, 0, 0, 2, 55, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 55, 0, 0, 1,107, 0, 0, 0,235, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 30, 0, 0, 0,235, 0, 0, 1,107,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,107, 0, 0, 2, 55, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 56,
- 0, 0, 0,142, 0, 0, 2, 55, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 55, 0, 0, 2, 57, 0, 0, 2, 56, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 76, 0, 0, 2, 56, 0, 0, 2, 57, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 57, 0, 0, 2, 55,
- 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,234, 0, 0, 0, 4, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,230, 0, 0, 2, 57, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 78, 0, 0, 0,234, 0, 0, 2, 57,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 57, 0, 0, 0,230, 0, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 56,
- 0, 0, 0, 76, 0, 0, 0,231, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,231, 0, 0, 1,106, 0, 0, 2, 56, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,142, 0, 0, 2, 56, 0, 0, 1,106, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,106, 0, 0, 0,231,
- 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,111, 0, 0, 0,144, 0, 0, 2, 58, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 58, 0, 0, 1, 3, 0, 0, 1,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 36, 0, 0, 1,111, 0, 0, 1, 3,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 3, 0, 0, 2, 58, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 59,
- 0, 0, 0, 90, 0, 0, 2, 58, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 58, 0, 0, 2, 60, 0, 0, 2, 59, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 81, 0, 0, 2, 59, 0, 0, 2, 60, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 60, 0, 0, 2, 58,
- 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,110, 0, 0, 0, 31, 0, 0, 0,241, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,241, 0, 0, 2, 60, 0, 0, 1,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,144, 0, 0, 1,110, 0, 0, 2, 60,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 60, 0, 0, 0,241, 0, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 59,
- 0, 0, 0, 81, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,240, 0, 0, 1, 2, 0, 0, 2, 59, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 90, 0, 0, 2, 59, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 2, 0, 0, 0,240,
- 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,110, 0, 0, 0,144, 0, 0, 2, 61, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 61, 0, 0, 1,113, 0, 0, 1,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 31, 0, 0, 1,110, 0, 0, 1,113,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,113, 0, 0, 2, 61, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 62,
- 0, 0, 0,145, 0, 0, 2, 61, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 61, 0, 0, 2, 63, 0, 0, 2, 62, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,146, 0, 0, 2, 62, 0, 0, 2, 63, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 63, 0, 0, 2, 61,
- 0, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,111, 0, 0, 0, 36, 0, 0, 1,115, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,115, 0, 0, 2, 63, 0, 0, 1,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,144, 0, 0, 1,111, 0, 0, 2, 63,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 63, 0, 0, 1,115, 0, 0, 0,146, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 62,
- 0, 0, 0,146, 0, 0, 1,114, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,114, 0, 0, 1,112, 0, 0, 2, 62, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,145, 0, 0, 2, 62, 0, 0, 1,112, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,112, 0, 0, 1,114,
- 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,204, 0, 0, 0, 63, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 64, 0, 0, 1, 4, 0, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 0,204, 0, 0, 1, 4,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 4, 0, 0, 2, 64, 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 65,
- 0, 0, 0, 91, 0, 0, 2, 64, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 64, 0, 0, 2, 66, 0, 0, 2, 65, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,146, 0, 0, 2, 65, 0, 0, 2, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 66, 0, 0, 2, 64,
- 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,205, 0, 0, 0, 22, 0, 0, 1,114, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,114, 0, 0, 2, 66, 0, 0, 0,205, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 63, 0, 0, 0,205, 0, 0, 2, 66,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 66, 0, 0, 1,114, 0, 0, 0,146, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 65,
- 0, 0, 0,146, 0, 0, 1,115, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,115, 0, 0, 1, 5, 0, 0, 2, 65, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 91, 0, 0, 2, 65, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 5, 0, 0, 1,115,
- 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,203, 0, 0, 0, 62, 0, 0, 2, 67, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 2, 67, 0, 0, 1,112, 0, 0, 0,203, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 22, 0, 0, 0,203, 0, 0, 1,112,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,112, 0, 0, 2, 67, 0, 0, 0,145, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 68,
- 0, 0, 0,145, 0, 0, 2, 67, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 67, 0, 0, 2, 69, 0, 0, 2, 68, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 80, 0, 0, 2, 68, 0, 0, 2, 69, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 69, 0, 0, 2, 67,
- 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,202, 0, 0, 0, 5, 0, 0, 0,238, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0,238, 0, 0, 2, 69, 0, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 62, 0, 0, 0,202, 0, 0, 2, 69,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 69, 0, 0, 0,238, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 68,
- 0, 0, 0, 80, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,239, 0, 0, 1,113, 0, 0, 2, 68, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,145, 0, 0, 2, 68, 0, 0, 1,113, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,113, 0, 0, 0,239,
- 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 70, 0, 0, 0,147, 0, 0, 1,117, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,117, 0, 0, 1, 11, 0, 0, 2, 70, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 94, 0, 0, 2, 70, 0, 0, 1, 11,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 11, 0, 0, 1,117, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 70,
- 0, 0, 0, 94, 0, 0, 2, 71, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 71, 0, 0, 2, 72, 0, 0, 2, 70, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,147, 0, 0, 2, 70, 0, 0, 2, 72, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 72, 0, 0, 2, 71,
- 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,243, 0, 0, 0, 32, 0, 0, 1,116, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,116, 0, 0, 2, 72, 0, 0, 0,243, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 82, 0, 0, 0,243, 0, 0, 2, 72,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 72, 0, 0, 1,116, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,242,
- 0, 0, 0, 82, 0, 0, 2, 71, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 71, 0, 0, 1, 10, 0, 0, 0,242, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 6, 0, 0, 0,242, 0, 0, 1, 10, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 10, 0, 0, 2, 71,
- 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 73, 0, 0, 0,147, 0, 0, 1,116, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,116, 0, 0, 1,118, 0, 0, 2, 73, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,148, 0, 0, 2, 73, 0, 0, 1,118,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,118, 0, 0, 1,116, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 73,
- 0, 0, 0,148, 0, 0, 2, 74, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 74, 0, 0, 2, 75, 0, 0, 2, 73, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,147, 0, 0, 2, 73, 0, 0, 2, 75, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 75, 0, 0, 2, 74,
- 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,121, 0, 0, 0, 38, 0, 0, 1,117, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,117, 0, 0, 2, 75, 0, 0, 1,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,149, 0, 0, 1,121, 0, 0, 2, 75,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 75, 0, 0, 1,117, 0, 0, 0,147, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,120,
- 0, 0, 0,149, 0, 0, 2, 74, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 74, 0, 0, 1,119, 0, 0, 1,120, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 37, 0, 0, 1,120, 0, 0, 1,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,119, 0, 0, 2, 74,
- 0, 0, 0,148, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 76, 0, 0, 0, 93, 0, 0, 1, 8, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 8, 0, 0, 1, 12, 0, 0, 2, 76, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 95, 0, 0, 2, 76, 0, 0, 1, 12,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 12, 0, 0, 1, 8, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 76,
- 0, 0, 0, 95, 0, 0, 2, 77, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 77, 0, 0, 2, 78, 0, 0, 2, 76, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 93, 0, 0, 2, 76, 0, 0, 2, 78, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 78, 0, 0, 2, 77,
- 0, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,120, 0, 0, 0, 37, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 9, 0, 0, 2, 78, 0, 0, 1,120, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,149, 0, 0, 1,120, 0, 0, 2, 78,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 78, 0, 0, 1, 9, 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,121,
- 0, 0, 0,149, 0, 0, 2, 77, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 77, 0, 0, 1, 13, 0, 0, 1,121, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 38, 0, 0, 1,121, 0, 0, 1, 13, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 13, 0, 0, 2, 77,
- 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 79, 0, 0, 0, 92, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 7, 0, 0, 1,119, 0, 0, 2, 79, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,148, 0, 0, 2, 79, 0, 0, 1,119,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,119, 0, 0, 1, 7, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 79,
- 0, 0, 0,148, 0, 0, 2, 80, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 80, 0, 0, 2, 81, 0, 0, 2, 79, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 92, 0, 0, 2, 79, 0, 0, 2, 81, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 81, 0, 0, 2, 80,
- 0, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,244, 0, 0, 0, 10, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 6, 0, 0, 2, 81, 0, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 83, 0, 0, 0,244, 0, 0, 2, 81,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 81, 0, 0, 1, 6, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,245,
- 0, 0, 0, 83, 0, 0, 2, 80, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 80, 0, 0, 1,118, 0, 0, 0,245, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 32, 0, 0, 0,245, 0, 0, 1,118, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,118, 0, 0, 2, 80,
- 0, 0, 0,148, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 82, 0, 0, 0,150, 0, 0, 1,123, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,123, 0, 0, 1, 15, 0, 0, 2, 82, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 96, 0, 0, 2, 82, 0, 0, 1, 15,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 15, 0, 0, 1,123, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 82,
- 0, 0, 0, 96, 0, 0, 2, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 83, 0, 0, 2, 84, 0, 0, 2, 82, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,150, 0, 0, 2, 82, 0, 0, 2, 84, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 84, 0, 0, 2, 83,
- 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,249, 0, 0, 0, 33, 0, 0, 1,122, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,122, 0, 0, 2, 84, 0, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 85, 0, 0, 0,249, 0, 0, 2, 84,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 84, 0, 0, 1,122, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,248,
- 0, 0, 0, 85, 0, 0, 2, 83, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 83, 0, 0, 1, 14, 0, 0, 0,248, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 7, 0, 0, 0,248, 0, 0, 1, 14, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 14, 0, 0, 2, 83,
- 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 85, 0, 0, 0,150, 0, 0, 1,122, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,122, 0, 0, 1,124, 0, 0, 2, 85, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,151, 0, 0, 2, 85, 0, 0, 1,124,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,124, 0, 0, 1,122, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 85,
- 0, 0, 0,151, 0, 0, 2, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 86, 0, 0, 2, 87, 0, 0, 2, 85, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,150, 0, 0, 2, 85, 0, 0, 2, 87, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 87, 0, 0, 2, 86,
- 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,127, 0, 0, 0, 39, 0, 0, 1,123, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,123, 0, 0, 2, 87, 0, 0, 1,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,152, 0, 0, 1,127, 0, 0, 2, 87,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 87, 0, 0, 1,123, 0, 0, 0,150, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,126,
- 0, 0, 0,152, 0, 0, 2, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 86, 0, 0, 1,125, 0, 0, 1,126, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 38, 0, 0, 1,126, 0, 0, 1,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,125, 0, 0, 2, 86,
- 0, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 88, 0, 0, 0, 95, 0, 0, 1, 12, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 12, 0, 0, 1, 16, 0, 0, 2, 88, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 97, 0, 0, 2, 88, 0, 0, 1, 16,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 16, 0, 0, 1, 12, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 88,
- 0, 0, 0, 97, 0, 0, 2, 89, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 89, 0, 0, 2, 90, 0, 0, 2, 88, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 95, 0, 0, 2, 88, 0, 0, 2, 90, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 90, 0, 0, 2, 89,
- 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,126, 0, 0, 0, 38, 0, 0, 1, 13, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 13, 0, 0, 2, 90, 0, 0, 1,126, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,152, 0, 0, 1,126, 0, 0, 2, 90,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 90, 0, 0, 1, 13, 0, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,127,
- 0, 0, 0,152, 0, 0, 2, 89, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 89, 0, 0, 1, 17, 0, 0, 1,127, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 39, 0, 0, 1,127, 0, 0, 1, 17, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 17, 0, 0, 2, 89,
- 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 91, 0, 0, 0, 94, 0, 0, 1, 11, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 11, 0, 0, 1,125, 0, 0, 2, 91, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,151, 0, 0, 2, 91, 0, 0, 1,125,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,125, 0, 0, 1, 11, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 91,
- 0, 0, 0,151, 0, 0, 2, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 92, 0, 0, 2, 93, 0, 0, 2, 91, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 94, 0, 0, 2, 91, 0, 0, 2, 93, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 93, 0, 0, 2, 92,
- 0, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,246, 0, 0, 0, 6, 0, 0, 1, 10, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 10, 0, 0, 2, 93, 0, 0, 0,246, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 84, 0, 0, 0,246, 0, 0, 2, 93,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 93, 0, 0, 1, 10, 0, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,247,
- 0, 0, 0, 84, 0, 0, 2, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 92, 0, 0, 1,124, 0, 0, 0,247, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 33, 0, 0, 0,247, 0, 0, 1,124, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,124, 0, 0, 2, 92,
- 0, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 94, 0, 0, 0,153, 0, 0, 1,129, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,129, 0, 0, 1, 19, 0, 0, 2, 94, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 98, 0, 0, 2, 94, 0, 0, 1, 19,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 19, 0, 0, 1,129, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 94,
- 0, 0, 0, 98, 0, 0, 2, 95, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 95, 0, 0, 2, 96, 0, 0, 2, 94, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,153, 0, 0, 2, 94, 0, 0, 2, 96, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 96, 0, 0, 2, 95,
- 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,253, 0, 0, 0, 34, 0, 0, 1,128, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,128, 0, 0, 2, 96, 0, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 87, 0, 0, 0,253, 0, 0, 2, 96,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 96, 0, 0, 1,128, 0, 0, 0,153, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,252,
- 0, 0, 0, 87, 0, 0, 2, 95, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 95, 0, 0, 1, 18, 0, 0, 0,252, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 8, 0, 0, 0,252, 0, 0, 1, 18, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 18, 0, 0, 2, 95,
- 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 97, 0, 0, 0,153, 0, 0, 1,128, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,128, 0, 0, 1,130, 0, 0, 2, 97, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,154, 0, 0, 2, 97, 0, 0, 1,130,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,130, 0, 0, 1,128, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 97,
- 0, 0, 0,154, 0, 0, 2, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 98, 0, 0, 2, 99, 0, 0, 2, 97, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,153, 0, 0, 2, 97, 0, 0, 2, 99, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 99, 0, 0, 2, 98,
- 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,133, 0, 0, 0, 40, 0, 0, 1,129, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,129, 0, 0, 2, 99, 0, 0, 1,133, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,155, 0, 0, 1,133, 0, 0, 2, 99,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 99, 0, 0, 1,129, 0, 0, 0,153, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,132,
- 0, 0, 0,155, 0, 0, 2, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 98, 0, 0, 1,131, 0, 0, 1,132, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 39, 0, 0, 1,132, 0, 0, 1,131, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,131, 0, 0, 2, 98,
- 0, 0, 0,154, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,100, 0, 0, 0, 97, 0, 0, 1, 16, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 16, 0, 0, 1, 20, 0, 0, 2,100, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 99, 0, 0, 2,100, 0, 0, 1, 20,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 20, 0, 0, 1, 16, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,100,
- 0, 0, 0, 99, 0, 0, 2,101, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,101, 0, 0, 2,102, 0, 0, 2,100, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 97, 0, 0, 2,100, 0, 0, 2,102, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,102, 0, 0, 2,101,
- 0, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,132, 0, 0, 0, 39, 0, 0, 1, 17, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 17, 0, 0, 2,102, 0, 0, 1,132, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,155, 0, 0, 1,132, 0, 0, 2,102,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,102, 0, 0, 1, 17, 0, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,133,
- 0, 0, 0,155, 0, 0, 2,101, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,101, 0, 0, 1, 21, 0, 0, 1,133, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 40, 0, 0, 1,133, 0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 21, 0, 0, 2,101,
- 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,103, 0, 0, 0, 96, 0, 0, 1, 15, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 15, 0, 0, 1,131, 0, 0, 2,103, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,154, 0, 0, 2,103, 0, 0, 1,131,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,131, 0, 0, 1, 15, 0, 0, 0, 39, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,103,
- 0, 0, 0,154, 0, 0, 2,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,104, 0, 0, 2,105, 0, 0, 2,103, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 96, 0, 0, 2,103, 0, 0, 2,105, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,105, 0, 0, 2,104,
- 0, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,250, 0, 0, 0, 7, 0, 0, 1, 14, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 14, 0, 0, 2,105, 0, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 86, 0, 0, 0,250, 0, 0, 2,105,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,105, 0, 0, 1, 14, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,251,
- 0, 0, 0, 86, 0, 0, 2,104, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,104, 0, 0, 1,130, 0, 0, 0,251, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0,251, 0, 0, 1,130, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,130, 0, 0, 2,104,
- 0, 0, 0,154, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,106, 0, 0, 0,156, 0, 0, 1,135, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,135, 0, 0, 1, 23, 0, 0, 2,106, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,100, 0, 0, 2,106, 0, 0, 1, 23,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 23, 0, 0, 1,135, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,106,
- 0, 0, 0,100, 0, 0, 2,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,107, 0, 0, 2,108, 0, 0, 2,106, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,156, 0, 0, 2,106, 0, 0, 2,108, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,108, 0, 0, 2,107,
- 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 1, 0, 0, 0, 35, 0, 0, 1,134, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,134, 0, 0, 2,108, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 89, 0, 0, 1, 1, 0, 0, 2,108,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,108, 0, 0, 1,134, 0, 0, 0,156, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0,
- 0, 0, 0, 89, 0, 0, 2,107, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,107, 0, 0, 1, 22, 0, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 9, 0, 0, 1, 0, 0, 0, 1, 22, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 22, 0, 0, 2,107,
- 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,109, 0, 0, 0,156, 0, 0, 1,134, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,134, 0, 0, 1,136, 0, 0, 2,109, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,157, 0, 0, 2,109, 0, 0, 1,136,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,136, 0, 0, 1,134, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,109,
- 0, 0, 0,157, 0, 0, 2,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,110, 0, 0, 2,111, 0, 0, 2,109, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,156, 0, 0, 2,109, 0, 0, 2,111, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,111, 0, 0, 2,110,
- 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,139, 0, 0, 0, 41, 0, 0, 1,135, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,135, 0, 0, 2,111, 0, 0, 1,139, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,158, 0, 0, 1,139, 0, 0, 2,111,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,111, 0, 0, 1,135, 0, 0, 0,156, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,138,
- 0, 0, 0,158, 0, 0, 2,110, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,110, 0, 0, 1,137, 0, 0, 1,138, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 40, 0, 0, 1,138, 0, 0, 1,137, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,137, 0, 0, 2,110,
- 0, 0, 0,157, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,112, 0, 0, 0, 99, 0, 0, 1, 20, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 20, 0, 0, 1, 24, 0, 0, 2,112, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,101, 0, 0, 2,112, 0, 0, 1, 24,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 24, 0, 0, 1, 20, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,112,
- 0, 0, 0,101, 0, 0, 2,113, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,113, 0, 0, 2,114, 0, 0, 2,112, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 99, 0, 0, 2,112, 0, 0, 2,114, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,114, 0, 0, 2,113,
- 0, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,138, 0, 0, 0, 40, 0, 0, 1, 21, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 21, 0, 0, 2,114, 0, 0, 1,138, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,158, 0, 0, 1,138, 0, 0, 2,114,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,114, 0, 0, 1, 21, 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,139,
- 0, 0, 0,158, 0, 0, 2,113, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,113, 0, 0, 1, 25, 0, 0, 1,139, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 41, 0, 0, 1,139, 0, 0, 1, 25, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 25, 0, 0, 2,113,
- 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,115, 0, 0, 0, 98, 0, 0, 1, 19, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 19, 0, 0, 1,137, 0, 0, 2,115, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,157, 0, 0, 2,115, 0, 0, 1,137,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,137, 0, 0, 1, 19, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,115,
- 0, 0, 0,157, 0, 0, 2,116, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,116, 0, 0, 2,117, 0, 0, 2,115, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 98, 0, 0, 2,115, 0, 0, 2,117, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,117, 0, 0, 2,116,
- 0, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,254, 0, 0, 0, 8, 0, 0, 1, 18, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 18, 0, 0, 2,117, 0, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 88, 0, 0, 0,254, 0, 0, 2,117,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,117, 0, 0, 1, 18, 0, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,255,
- 0, 0, 0, 88, 0, 0, 2,116, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,116, 0, 0, 1,136, 0, 0, 0,255, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0,255, 0, 0, 1,136, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,136, 0, 0, 2,116,
- 0, 0, 0,157, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,118, 0, 0, 0,159, 0, 0, 1,141, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,141, 0, 0, 1, 7, 0, 0, 2,118, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 92, 0, 0, 2,118, 0, 0, 1, 7,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 7, 0, 0, 1,141, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,118,
- 0, 0, 0, 92, 0, 0, 2,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,119, 0, 0, 2,120, 0, 0, 2,118, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,159, 0, 0, 2,118, 0, 0, 2,120, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,120, 0, 0, 2,119,
- 0, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 5, 0, 0, 0, 36, 0, 0, 1,140, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,140, 0, 0, 2,120, 0, 0, 1, 5, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 91, 0, 0, 1, 5, 0, 0, 2,120,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,120, 0, 0, 1,140, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 4,
- 0, 0, 0, 91, 0, 0, 2,119, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,119, 0, 0, 1, 6, 0, 0, 1, 4, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 10, 0, 0, 1, 4, 0, 0, 1, 6, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 6, 0, 0, 2,119,
- 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,121, 0, 0, 0,159, 0, 0, 1,140, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,140, 0, 0, 1,142, 0, 0, 2,121, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,160, 0, 0, 2,121, 0, 0, 1,142,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,142, 0, 0, 1,140, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,121,
- 0, 0, 0,160, 0, 0, 2,122, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,122, 0, 0, 2,123, 0, 0, 2,121, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,159, 0, 0, 2,121, 0, 0, 2,123, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,123, 0, 0, 2,122,
- 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,144, 0, 0, 0, 37, 0, 0, 1,141, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1,141, 0, 0, 2,123, 0, 0, 1,144, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,161, 0, 0, 1,144, 0, 0, 2,123,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,123, 0, 0, 1,141, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,145,
- 0, 0, 0,161, 0, 0, 2,122, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,122, 0, 0, 1,143, 0, 0, 1,145, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 41, 0, 0, 1,145, 0, 0, 1,143, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,143, 0, 0, 2,122,
- 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,124, 0, 0, 0,101, 0, 0, 1, 24, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 24, 0, 0, 1, 8, 0, 0, 2,124, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 93, 0, 0, 2,124, 0, 0, 1, 8,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 8, 0, 0, 1, 24, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,124,
- 0, 0, 0, 93, 0, 0, 2,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,125, 0, 0, 2,126, 0, 0, 2,124, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,101, 0, 0, 2,124, 0, 0, 2,126, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,126, 0, 0, 2,125,
- 0, 0, 0,161, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,145, 0, 0, 0, 41, 0, 0, 1, 25, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 25, 0, 0, 2,126, 0, 0, 1,145, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,161, 0, 0, 1,145, 0, 0, 2,126,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,126, 0, 0, 1, 25, 0, 0, 0,101, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,144,
- 0, 0, 0,161, 0, 0, 2,125, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,125, 0, 0, 1, 9, 0, 0, 1,144, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 37, 0, 0, 1,144, 0, 0, 1, 9, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 9, 0, 0, 2,125,
- 0, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,127, 0, 0, 0,100, 0, 0, 1, 23, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 23, 0, 0, 1,143, 0, 0, 2,127, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0,160, 0, 0, 2,127, 0, 0, 1,143,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,143, 0, 0, 1, 23, 0, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,127,
- 0, 0, 0,160, 0, 0, 2,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,128, 0, 0, 2,129, 0, 0, 2,127, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0,100, 0, 0, 2,127, 0, 0, 2,129, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,129, 0, 0, 2,128,
- 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 2, 0, 0, 0, 9, 0, 0, 1, 22, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 1, 22, 0, 0, 2,129, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 90, 0, 0, 1, 2, 0, 0, 2,129,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,129, 0, 0, 1, 22, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 3,
- 0, 0, 0, 90, 0, 0, 2,128, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2,128, 0, 0, 1,142, 0, 0, 1, 3, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 36, 0, 0, 1, 3, 0, 0, 1,142, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1,142, 0, 0, 2,128,
- 0, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 3, 68, 65, 84, 65, 0, 0,220, 0, 8,108,128, 32, 0, 0, 0, 60, 0, 0, 5, 0,
- 63,110,222,166, 63, 55,205, 9, 63,105,132,212, 63, 65,236,201, 63,103,153,218, 63, 54,155,119, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,103,153,218, 63, 54,155,119, 63,108,148,118, 63, 44,160,211, 63,110,222,166,
- 63, 55,205, 9, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36, 63, 45, 28, 36,
- 63,110,222,166, 63, 55,205, 9, 63,108,148,118, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,108,148,118, 63, 44,160,211, 63,103,153,218, 63, 54,155,119, 63,102, 17, 87, 63, 43, 52,229, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 81, 56, 63, 52, 55,170, 63,102, 17, 87, 63, 43, 52,229,
- 63,103,153,218, 63, 54,155,119, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,103,153,218,
- 63, 54,155,119, 63, 97, 75, 9, 63, 63,233, 92, 63, 96, 81, 56, 63, 52, 55,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63, 60, 86, 49, 63, 96, 81, 56, 63, 52, 55,170, 63, 97, 75, 9, 63, 63,233, 92,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 97, 75, 9, 63, 63,233, 92, 63,103,153,218,
- 63, 54,155,119, 63,105,132,212, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 98,167,103, 63, 75, 39,168, 63, 89,153,138, 63, 82,228, 39, 63, 89,153,139, 63, 71,153,255, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139, 63, 71,153,255, 63, 97, 75, 9, 63, 63,233, 92, 63, 98,167,103,
- 63, 75, 39,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105,132,212, 63, 65,236,201,
- 63, 98,167,103, 63, 75, 39,168, 63, 97, 75, 9, 63, 63,233, 92, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 97, 75, 9, 63, 63,233, 92, 63, 89,153,139, 63, 71,153,255, 63, 89,153,138, 63, 60, 86, 49, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 81, 56, 63, 52, 55,170, 63, 89,153,138, 63, 60, 86, 49,
- 63, 89,153,139, 63, 49, 12, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139,
- 63, 49, 12, 79, 63, 95,182,205, 63, 40,228,222, 63, 96, 81, 56, 63, 52, 55,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,102, 17, 87, 63, 43, 52,229, 63, 96, 81, 56, 63, 52, 55,170, 63, 95,182,205, 63, 40,228,222,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 95,182,205, 63, 40,228,222, 63, 89,153,139,
- 63, 49, 12, 79, 63, 89,153,139, 63, 37,200, 45, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 98,167,103, 63, 75, 39,168, 63,105,132,212, 63, 65,236,201, 63,109, 83,168, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,109, 83,168, 63, 78, 83,207, 63,101, 85,135, 63, 88, 64,148, 63, 98,167,103,
- 63, 75, 39,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63, 82,228, 39,
- 63, 98,167,103, 63, 75, 39,168, 63,101, 85,135, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,101, 85,135, 63, 88, 64,148, 63,109, 83,168, 63, 78, 83,207, 63,115, 51, 36, 63, 90, 56, 22, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121, 18,162, 63, 78, 83,207, 63,115, 51, 36, 63, 90, 56, 22,
- 63,109, 83,168, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,109, 83,168,
- 63, 78, 83,207, 63,115, 51, 36, 63, 67, 23,115, 63,121, 18,162, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,124,225,116, 63, 65,236,202, 63,121, 18,162, 63, 78, 83,207, 63,115, 51, 36, 63, 67, 23,115,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36, 63, 67, 23,115, 63,109, 83,168,
- 63, 78, 83,207, 63,105,132,212, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,110,222,166, 63, 55,205, 9, 63,115, 51, 36, 63, 45, 28, 36, 63,119,135,163, 63, 55,205, 11, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,119,135,163, 63, 55,205, 11, 63,115, 51, 36, 63, 67, 23,115, 63,110,222,166,
- 63, 55,205, 9, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105,132,212, 63, 65,236,201,
- 63,110,222,166, 63, 55,205, 9, 63,115, 51, 36, 63, 67, 23,115, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,115, 51, 36, 63, 67, 23,115, 63,119,135,163, 63, 55,205, 11, 63,124,225,116, 63, 65,236,202, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121, 18,162, 63, 78, 83,207, 63,124,225,116, 63, 65,236,202,
- 63,129,223,113, 63, 75, 39,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,129,223,113,
- 63, 75, 39,170, 63,128,136, 98, 63, 88, 64,148, 63,121, 18,162, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36, 63, 90, 56, 22, 63,121, 18,162, 63, 78, 83,207, 63,128,136, 98, 63, 88, 64,148,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 59,136, 98, 95, 63, 88, 64,148, 60,111,184,160,
- 63, 75, 39,170, 61, 76,203,243, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 76,203,243, 63, 49, 12, 82, 61, 76,203,246, 63, 60, 86, 53, 60,194,162, 31, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,194,162, 31, 63, 52, 55,172, 60,213,239,111, 63, 40,228,223, 61, 76,203,243,
- 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,246, 63, 37,200, 48,
- 61, 76,203,243, 63, 49, 12, 82, 60,213,239,111, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 60,213,239,111, 63, 40,228,223, 60,194,162, 31, 63, 52, 55,172, 58,169,226,120, 63, 43, 52,230, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,126,204,111, 63, 54,155,121, 63,128, 42,121, 63, 43, 52,230,
- 63,131, 10,136, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,131, 10,136,
- 63, 52, 55,172, 63,130,141,160, 63, 63,233, 95, 63,126,204,111, 63, 54,155,121, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,124,225,116, 63, 65,236,202, 63,126,204,111, 63, 54,155,121, 63,130,141,160, 63, 63,233, 95,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,163,104, 11, 63, 63,233, 95, 60,194,162, 31,
- 63, 52, 55,172, 61, 76,203,246, 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 76,203,244, 63, 71,154, 2, 61, 76,203,243, 63, 82,228, 41, 60,111,184,160, 63, 75, 39,170, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,111,184,160, 63, 75, 39,170, 60,163,104, 11, 63, 63,233, 95, 61, 76,203,244,
- 63, 71,154, 2, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,246, 63, 60, 86, 53,
- 61, 76,203,244, 63, 71,154, 2, 60,163,104, 11, 63, 63,233, 95, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,130,141,160, 63, 63,233, 95, 63,129,223,113, 63, 75, 39,170, 63,124,225,116, 63, 65,236,202, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,126,204,111, 63, 54,155,121, 63,124,225,116, 63, 65,236,202,
- 63,119,135,163, 63, 55,205, 11, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,119,135,163,
- 63, 55,205, 11, 63,121,209,210, 63, 44,160,212, 63,126,204,111, 63, 54,155,121, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,128, 42,121, 63, 43, 52,230, 63,126,204,111, 63, 54,155,121, 63,121,209,210, 63, 44,160,212,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121,209,210, 63, 44,160,212, 63,119,135,163,
- 63, 55,205, 11, 63,115, 51, 36, 63, 45, 28, 36, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,134,102, 95, 63, 94, 46, 79, 63,134,102, 95, 63,105,114, 22, 63,124,205, 52, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124,205, 52, 63, 99, 26, 58, 63,128,136, 98, 63, 88, 64,148, 63,134,102, 95,
- 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,243, 63, 82,228, 41,
- 61, 76,203,234, 63, 94, 46, 79, 59,136, 98, 95, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,128,136, 98, 63, 88, 64,148, 63,124,205, 52, 63, 99, 26, 58, 63,115, 51, 36, 63, 90, 56, 22, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105,153, 21, 63, 99, 26, 58, 63,115, 51, 36, 63, 90, 56, 22,
- 63,124,205, 52, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124,205, 52,
- 63, 99, 26, 58, 63,115, 51, 32, 63,109,154,212, 63,105,153, 21, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63,105,114, 19, 63,105,153, 21, 63, 99, 26, 58, 63,115, 51, 32, 63,109,154,212,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 32, 63,109,154,212, 63,124,205, 52,
- 63, 99, 26, 58, 63,134,102, 95, 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,134,102, 95, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 63, 89,153,136, 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,136, 63,116,187,242, 63,115, 51, 32, 63,109,154,212, 63,134,102, 95,
- 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,134,102, 95, 63,105,114, 22,
- 63,134,102, 95, 63,116,187,242, 63,115, 51, 32, 63,109,154,212, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,115, 51, 32, 63,109,154,212, 63, 89,153,136, 63,116,187,242, 63, 89,153,138, 63,105,114, 19, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105,153, 21, 63, 99, 26, 58, 63, 89,153,138, 63,105,114, 19,
- 63, 89,153,138, 63, 94, 46, 77, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138,
- 63, 94, 46, 77, 63,101, 85,135, 63, 88, 64,148, 63,105,153, 21, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36, 63, 90, 56, 22, 63,105,153, 21, 63, 99, 26, 58, 63,101, 85,135, 63, 88, 64,148,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,101, 85,135, 63, 88, 64,148, 63, 89,153,138,
- 63, 94, 46, 77, 63, 89,153,138, 63, 82,228, 39, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 75,153, 67, 63, 54,155,113, 63, 73,174, 74, 63, 65,236,193, 63, 68, 84,124, 63, 55,204,255, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 68, 84,124, 63, 55,204,255, 63, 70,158,169, 63, 44,160,200, 63, 75,153, 67,
- 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 77, 33,196, 63, 43, 52,221,
- 63, 75,153, 67, 63, 54,155,113, 63, 70,158,169, 63, 44,160,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 70,158,169, 63, 44,160,200, 63, 68, 84,124, 63, 55,204,255, 63, 64, 0, 0, 63, 45, 28, 24, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 75,153, 67, 63, 54,155,113, 63, 77, 33,196, 63, 43, 52,221,
- 63, 82,225,225, 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,225,225,
- 63, 52, 55,165, 63, 81,232, 16, 63, 63,233, 89, 63, 75,153, 67, 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,174, 74, 63, 65,236,193, 63, 75,153, 67, 63, 54,155,113, 63, 81,232, 16, 63, 63,233, 89,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 81,232, 16, 63, 63,233, 89, 63, 82,225,225,
- 63, 52, 55,165, 63, 89,153,138, 63, 60, 86, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,139, 63, 71,153,255, 63, 89,153,138, 63, 82,228, 39, 63, 80,139,179, 63, 75, 39,164, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 80,139,179, 63, 75, 39,164, 63, 81,232, 16, 63, 63,233, 89, 63, 89,153,139,
- 63, 71,153,255, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63, 60, 86, 49,
- 63, 89,153,139, 63, 71,153,255, 63, 81,232, 16, 63, 63,233, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 81,232, 16, 63, 63,233, 89, 63, 80,139,179, 63, 75, 39,164, 63, 73,174, 74, 63, 65,236,193, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139, 63, 49, 12, 79, 63, 89,153,138, 63, 60, 86, 49,
- 63, 82,225,225, 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,225,225,
- 63, 52, 55,165, 63, 83,124, 75, 63, 40,228,217, 63, 89,153,139, 63, 49, 12, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139, 63, 37,200, 45, 63, 89,153,139, 63, 49, 12, 79, 63, 83,124, 75, 63, 40,228,217,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 83,124, 75, 63, 40,228,217, 63, 82,225,225,
- 63, 52, 55,165, 63, 77, 33,196, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 69,223,120, 63, 78, 83,198, 63, 73,174, 74, 63, 65,236,193, 63, 80,139,179, 63, 75, 39,164, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 80,139,179, 63, 75, 39,164, 63, 77,221,148, 63, 88, 64,140, 63, 69,223,120,
- 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 90, 56, 12,
- 63, 69,223,120, 63, 78, 83,198, 63, 77,221,148, 63, 88, 64,140, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 77,221,148, 63, 88, 64,140, 63, 80,139,179, 63, 75, 39,164, 63, 89,153,138, 63, 82,228, 39, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 69,223,120, 63, 78, 83,198, 63, 64, 0, 0, 63, 90, 56, 12,
- 63, 58, 32,136, 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 58, 32,136,
- 63, 78, 83,198, 63, 64, 0, 0, 63, 67, 23,106, 63, 69,223,120, 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,174, 74, 63, 65,236,193, 63, 69,223,120, 63, 78, 83,198, 63, 64, 0, 0, 63, 67, 23,106,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 67, 23,106, 63, 58, 32,136,
- 63, 78, 83,198, 63, 54, 81,182, 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 59,171,132, 63, 55,204,255, 63, 64, 0, 0, 63, 45, 28, 24, 63, 68, 84,124, 63, 55,204,255, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 68, 84,124, 63, 55,204,255, 63, 64, 0, 0, 63, 67, 23,106, 63, 59,171,132,
- 63, 55,204,255, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 81,182, 63, 65,236,193,
- 63, 59,171,132, 63, 55,204,255, 63, 64, 0, 0, 63, 67, 23,106, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 64, 0, 0, 63, 67, 23,106, 63, 68, 84,124, 63, 55,204,255, 63, 73,174, 74, 63, 65,236,193, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 47,116, 77, 63, 75, 39,164, 63, 54, 81,182, 63, 65,236,193,
- 63, 58, 32,136, 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 58, 32,136,
- 63, 78, 83,198, 63, 50, 34,108, 63, 88, 64,140, 63, 47,116, 77, 63, 75, 39,164, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,118, 63, 82,228, 38, 63, 47,116, 77, 63, 75, 39,164, 63, 50, 34,108, 63, 88, 64,140,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 50, 34,108, 63, 88, 64,140, 63, 58, 32,136,
- 63, 78, 83,198, 63, 64, 0, 0, 63, 90, 56, 12, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 45, 30, 31, 63, 52, 55,165, 63, 38,102,117, 63, 60, 86, 50, 63, 38,102,117, 63, 49, 12, 78, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 49, 12, 78, 63, 44,131,181, 63, 40,228,216, 63, 45, 30, 31,
- 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 50,222, 60, 63, 43, 52,221,
- 63, 45, 30, 31, 63, 52, 55,165, 63, 44,131,181, 63, 40,228,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 44,131,181, 63, 40,228,216, 63, 38,102,117, 63, 49, 12, 78, 63, 38,102,117, 63, 37,200, 45, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 30, 31, 63, 52, 55,165, 63, 50,222, 60, 63, 43, 52,221,
- 63, 52,102,189, 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 52,102,189,
- 63, 54,155,113, 63, 46, 23,240, 63, 63,233, 89, 63, 45, 30, 31, 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 60, 86, 50, 63, 45, 30, 31, 63, 52, 55,165, 63, 46, 23,240, 63, 63,233, 89,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 46, 23,240, 63, 63,233, 89, 63, 52,102,189,
- 63, 54,155,113, 63, 54, 81,182, 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 47,116, 77, 63, 75, 39,164, 63, 38,102,118, 63, 82,228, 38, 63, 38,102,117, 63, 71,153,255, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 71,153,255, 63, 46, 23,240, 63, 63,233, 89, 63, 47,116, 77,
- 63, 75, 39,164, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 81,182, 63, 65,236,193,
- 63, 47,116, 77, 63, 75, 39,164, 63, 46, 23,240, 63, 63,233, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 46, 23,240, 63, 63,233, 89, 63, 38,102,117, 63, 71,153,255, 63, 38,102,117, 63, 60, 86, 50, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 59,171,132, 63, 55,204,255, 63, 54, 81,182, 63, 65,236,193,
- 63, 52,102,189, 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 52,102,189,
- 63, 54,155,113, 63, 57, 97, 87, 63, 44,160,200, 63, 59,171,132, 63, 55,204,255, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 45, 28, 24, 63, 59,171,132, 63, 55,204,255, 63, 57, 97, 87, 63, 44,160,200,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 97, 87, 63, 44,160,200, 63, 52,102,189,
- 63, 54,155,113, 63, 50,222, 60, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 54,101,250, 63, 99, 26, 51, 63, 38,102,118, 63,105,114, 19, 63, 38,102,118, 63, 94, 46, 77, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,118, 63, 94, 46, 77, 63, 50, 34,108, 63, 88, 64,140, 63, 54,101,250,
- 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 90, 56, 12,
- 63, 54,101,250, 63, 99, 26, 51, 63, 50, 34,108, 63, 88, 64,140, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 50, 34,108, 63, 88, 64,140, 63, 38,102,118, 63, 94, 46, 77, 63, 38,102,118, 63, 82,228, 38, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,101,250, 63, 99, 26, 51, 63, 64, 0, 0, 63, 90, 56, 12,
- 63, 73,154, 6, 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,154, 6,
- 63, 99, 26, 51, 63, 64, 0, 0, 63,109,154,206, 63, 54,101,250, 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,118, 63,105,114, 19, 63, 54,101,250, 63, 99, 26, 51, 63, 64, 0, 0, 63,109,154,206,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63,109,154,206, 63, 73,154, 6,
- 63, 99, 26, 51, 63, 89,153,138, 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,136, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 63, 38,102,120, 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,120, 63,116,187,242, 63, 64, 0, 0, 63,109,154,206, 63, 89,153,136,
- 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63,105,114, 19,
- 63, 89,153,136, 63,116,187,242, 63, 64, 0, 0, 63,109,154,206, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 64, 0, 0, 63,109,154,206, 63, 38,102,120, 63,116,187,242, 63, 38,102,118, 63,105,114, 19, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63, 94, 46, 77, 63, 89,153,138, 63,105,114, 19,
- 63, 73,154, 6, 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,154, 6,
- 63, 99, 26, 51, 63, 77,221,148, 63, 88, 64,140, 63, 89,153,138, 63, 94, 46, 77, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,138, 63, 82,228, 39, 63, 89,153,138, 63, 94, 46, 77, 63, 77,221,148, 63, 88, 64,140,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 77,221,148, 63, 88, 64,140, 63, 73,154, 6,
- 63, 99, 26, 51, 63, 64, 0, 0, 63, 90, 56, 12, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 8, 71,167, 63, 55,205, 7, 61,229,192,170, 63, 65,236,200, 61,214,104,203, 63, 54,155,120, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,214,104,203, 63, 54,155,120, 61,254, 61,201, 63, 44,160,207, 62, 8, 71,167,
- 63, 55,205, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,173, 63, 45, 28, 27,
- 62, 8, 71,167, 63, 55,205, 7, 61,254, 61,201, 63, 44,160,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,254, 61,201, 63, 44,160,207, 61,214,104,203, 63, 54,155,120, 61,202, 36,175, 63, 43, 52,228, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,156, 35,145, 63, 52, 55,172, 61,202, 36,175, 63, 43, 52,228,
- 61,214,104,203, 63, 54,155,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,214,104,203,
- 63, 54,155,120, 61,163,242, 32, 63, 63,233, 96, 61,156, 35,145, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,246, 63, 60, 86, 53, 61,156, 35,145, 63, 52, 55,172, 61,163,242, 32, 63, 63,233, 96,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,163,242, 32, 63, 63,233, 96, 61,214,104,203,
- 63, 54,155,120, 61,229,192,170, 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,174,213, 17, 63, 75, 39,171, 61, 76,203,243, 63, 82,228, 41, 61, 76,203,244, 63, 71,154, 2, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,244, 63, 71,154, 2, 61,163,242, 32, 63, 63,233, 96, 61,174,213, 17,
- 63, 75, 39,171, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,229,192,170, 63, 65,236,200,
- 61,174,213, 17, 63, 75, 39,171, 61,163,242, 32, 63, 63,233, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,163,242, 32, 63, 63,233, 96, 61, 76,203,244, 63, 71,154, 2, 61, 76,203,246, 63, 60, 86, 53, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,156, 35,145, 63, 52, 55,172, 61, 76,203,246, 63, 60, 86, 53,
- 61, 76,203,243, 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,243,
- 63, 49, 12, 82, 61,151, 80, 53, 63, 40,228,223, 61,156, 35,145, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,202, 36,175, 63, 43, 52,228, 61,156, 35,145, 63, 52, 55,172, 61,151, 80, 53, 63, 40,228,223,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,151, 80, 53, 63, 40,228,223, 61, 76,203,243,
- 63, 49, 12, 82, 61, 76,203,246, 63, 37,200, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,174,213, 17, 63, 75, 39,171, 61,229,192,170, 63, 65,236,200, 62, 2, 27,169, 63, 78, 83,204, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 2, 27,169, 63, 78, 83,204, 61,196, 70, 23, 63, 88, 64,147, 61,174,213, 17,
- 63, 75, 39,171, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,243, 63, 82,228, 41,
- 61,174,213, 17, 63, 75, 39,171, 61,196, 70, 23, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,196, 70, 23, 63, 88, 64,147, 62, 2, 27,169, 63, 78, 83,204, 62, 25,153,160, 63, 90, 56, 14, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 49, 23,162, 63, 78, 83,195, 62, 25,153,160, 63, 90, 56, 14,
- 62, 2, 27,169, 63, 78, 83,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 2, 27,169,
- 63, 78, 83,204, 62, 25,153,172, 63, 67, 23,108, 62, 49, 23,162, 63, 78, 83,195, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 64, 82,240, 63, 65,236,183, 62, 49, 23,162, 63, 78, 83,195, 62, 25,153,172, 63, 67, 23,108,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,172, 63, 67, 23,108, 62, 2, 27,169,
- 63, 78, 83,204, 61,229,192,170, 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 8, 71,167, 63, 55,205, 7, 62, 25,153,173, 63, 45, 28, 27, 62, 42,235,173, 63, 55,204,254, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 42,235,173, 63, 55,204,254, 62, 25,153,172, 63, 67, 23,108, 62, 8, 71,167,
- 63, 55,205, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,229,192,170, 63, 65,236,200,
- 62, 8, 71,167, 63, 55,205, 7, 62, 25,153,172, 63, 67, 23,108, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 25,153,172, 63, 67, 23,108, 62, 42,235,173, 63, 55,204,254, 62, 64, 82,240, 63, 65,236,183, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 49, 23,162, 63, 78, 83,195, 62, 64, 82,240, 63, 65,236,183,
- 62, 91,200,166, 63, 75, 39,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 91,200,166,
- 63, 75, 39,147, 62, 81, 16, 34, 63, 88, 64,131, 62, 49, 23,162, 63, 78, 83,195, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,160, 63, 90, 56, 14, 62, 49, 23,162, 63, 78, 83,195, 62, 81, 16, 34, 63, 88, 64,131,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 81, 16, 34, 63, 88, 64,131, 62, 91,200,166,
- 63, 75, 39,147, 62,128, 0, 0, 63, 82,228, 13, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 63, 49, 12, 47, 62,128, 0, 0, 63, 60, 86, 19, 62,101, 33, 92, 63, 52, 55,146, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,101, 33, 92, 63, 52, 55,146, 62,103,139, 14, 63, 40,228,199, 62,128, 0, 0,
- 63, 49, 12, 47, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 37,200, 23,
- 62,128, 0, 0, 63, 49, 12, 47, 62,103,139, 14, 63, 40,228,199, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,103,139, 14, 63, 40,228,199, 62,101, 33, 92, 63, 52, 55,146, 62, 78, 32,230, 63, 43, 52,211, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 71,254,223, 63, 54,155,102, 62, 78, 32,230, 63, 43, 52,211,
- 62,101, 33, 92, 63, 52, 55,146, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,101, 33, 92,
- 63, 52, 55,146, 62, 97, 58, 23, 63, 63,233, 69, 62, 71,254,223, 63, 54,155,102, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 64, 82,240, 63, 65,236,183, 62, 71,254,223, 63, 54,155,102, 62, 97, 58, 23, 63, 63,233, 69,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 97, 58, 23, 63, 63,233, 69, 62,101, 33, 92,
- 63, 52, 55,146, 62,128, 0, 0, 63, 60, 86, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 63, 71,153,228, 62,128, 0, 0, 63, 82,228, 13, 62, 91,200,166, 63, 75, 39,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 91,200,166, 63, 75, 39,147, 62, 97, 58, 23, 63, 63,233, 69, 62,128, 0, 0,
- 63, 71,153,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 60, 86, 19,
- 62,128, 0, 0, 63, 71,153,228, 62, 97, 58, 23, 63, 63,233, 69, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 97, 58, 23, 63, 63,233, 69, 62, 91,200,166, 63, 75, 39,147, 62, 64, 82,240, 63, 65,236,183, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 71,254,223, 63, 54,155,102, 62, 64, 82,240, 63, 65,236,183,
- 62, 42,235,173, 63, 55,204,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 42,235,173,
- 63, 55,204,254, 62, 52, 20,105, 63, 44,160,198, 62, 71,254,223, 63, 54,155,102, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 78, 32,230, 63, 43, 52,211, 62, 71,254,223, 63, 54,155,102, 62, 52, 20,105, 63, 44,160,198,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 52, 20,105, 63, 44,160,198, 62, 42,235,173,
- 63, 55,204,254, 62, 25,153,173, 63, 45, 28, 27, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 63, 94, 46, 58, 62,128, 0, 0, 63,105,114, 8, 62, 64, 1,230, 63, 99, 26, 49, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 64, 1,230, 63, 99, 26, 49, 62, 81, 16, 34, 63, 88, 64,131, 62,128, 0, 0,
- 63, 94, 46, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 82,228, 13,
- 62,128, 0, 0, 63, 94, 46, 58, 62, 81, 16, 34, 63, 88, 64,131, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 81, 16, 34, 63, 88, 64,131, 62, 64, 1,230, 63, 99, 26, 49, 62, 25,153,160, 63, 90, 56, 14, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,230, 98,164, 63, 99, 26, 58, 62, 25,153,160, 63, 90, 56, 14,
- 62, 64, 1,230, 63, 99, 26, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 64, 1,230,
- 63, 99, 26, 49, 62, 25,153,159, 63,109,154,210, 61,230, 98,164, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,237, 63,105,114, 22, 61,230, 98,164, 63, 99, 26, 58, 62, 25,153,159, 63,109,154,210,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,159, 63,109,154,210, 62, 64, 1,230,
- 63, 99, 26, 49, 62,128, 0, 0, 63,105,114, 8, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 63,116,187,232, 63, 59,153, 3, 63,128, 0, 0, 63,134,102, 95, 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,210, 63,116,187,242, 62, 25,153,159, 63,109,154,210, 62,128, 0, 0,
- 63,116,187,232, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63,105,114, 8,
- 62,128, 0, 0, 63,116,187,232, 62, 25,153,159, 63,109,154,210, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 25,153,159, 63,109,154,210, 61, 76,203,210, 63,116,187,242, 61, 76,203,237, 63,105,114, 22, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,230, 98,164, 63, 99, 26, 58, 61, 76,203,237, 63,105,114, 22,
- 61, 76,203,234, 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,234,
- 63, 94, 46, 79, 61,196, 70, 23, 63, 88, 64,147, 61,230, 98,164, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,160, 63, 90, 56, 14, 61,230, 98,164, 63, 99, 26, 58, 61,196, 70, 23, 63, 88, 64,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,196, 70, 23, 63, 88, 64,147, 61, 76,203,234,
- 63, 94, 46, 79, 61, 76,203,243, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,170,138, 42, 63, 55,204,254, 62,159,214,136, 63, 65,236,183, 62,156, 0,145, 63, 54,155,102, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,156, 0,145, 63, 54,155,102, 62,165,245,204, 63, 44,160,198, 62,170,138, 42,
- 63, 55,204,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 42, 63, 45, 28, 28,
- 62,170,138, 42, 63, 55,204,254, 62,165,245,204, 63, 44,160,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,165,245,204, 63, 44,160,198, 62,156, 0,145, 63, 54,155,102, 62,152,239,141, 63, 43, 52,211, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141,111, 82, 63, 52, 55,146, 62,152,239,141, 63, 43, 52,211,
- 62,156, 0,145, 63, 54,155,102, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,156, 0,145,
- 63, 54,155,102, 62,143, 98,245, 63, 63,233, 68, 62,141,111, 82, 63, 52, 55,146, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 60, 86, 19, 62,141,111, 82, 63, 52, 55,146, 62,143, 98,245, 63, 63,233, 68,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,143, 98,245, 63, 63,233, 68, 62,156, 0,145,
- 63, 54,155,102, 62,159,214,136, 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,146, 27,173, 63, 75, 39,147, 62,128, 0, 0, 63, 82,228, 13, 62,128, 0, 0, 63, 71,153,228, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 71,153,228, 62,143, 98,245, 63, 63,233, 68, 62,146, 27,173,
- 63, 75, 39,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,214,136, 63, 65,236,183,
- 62,146, 27,173, 63, 75, 39,147, 62,143, 98,245, 63, 63,233, 68, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,143, 98,245, 63, 63,233, 68, 62,128, 0, 0, 63, 71,153,228, 62,128, 0, 0, 63, 60, 86, 19, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141,111, 82, 63, 52, 55,146, 62,128, 0, 0, 63, 60, 86, 19,
- 62,128, 0, 0, 63, 49, 12, 47, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0,
- 63, 49, 12, 47, 62,140, 58,121, 63, 40,228,199, 62,141,111, 82, 63, 52, 55,146, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,152,239,141, 63, 43, 52,211, 62,141,111, 82, 63, 52, 55,146, 62,140, 58,121, 63, 40,228,199,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,140, 58,121, 63, 40,228,199, 62,128, 0, 0,
- 63, 49, 12, 47, 62,128, 0, 0, 63, 37,200, 23, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,146, 27,173, 63, 75, 39,147, 62,159,214,136, 63, 65,236,183, 62,167,116, 47, 63, 78, 83,195, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,167,116, 47, 63, 78, 83,195, 62,151,119,239, 63, 88, 64,131, 62,146, 27,173,
- 63, 75, 39,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 82,228, 13,
- 62,146, 27,173, 63, 75, 39,147, 62,151,119,239, 63, 88, 64,131, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,151,119,239, 63, 88, 64,131, 62,167,116, 47, 63, 78, 83,195, 62,179, 51, 49, 63, 90, 56, 14, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,190,242, 44, 63, 78, 83,205, 62,179, 51, 49, 63, 90, 56, 14,
- 62,167,116, 47, 63, 78, 83,195, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,167,116, 47,
- 63, 78, 83,195, 62,179, 51, 42, 63, 67, 23,108, 62,190,242, 44, 63, 78, 83,205, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,198,143,214, 63, 65,236,200, 62,190,242, 44, 63, 78, 83,205, 62,179, 51, 42, 63, 67, 23,108,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 42, 63, 67, 23,108, 62,167,116, 47,
- 63, 78, 83,195, 62,159,214,136, 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,170,138, 42, 63, 55,204,254, 62,179, 51, 42, 63, 45, 28, 28, 62,187,220, 45, 63, 55,205, 7, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,187,220, 45, 63, 55,205, 7, 62,179, 51, 42, 63, 67, 23,108, 62,170,138, 42,
- 63, 55,204,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,214,136, 63, 65,236,183,
- 62,170,138, 42, 63, 55,204,254, 62,179, 51, 42, 63, 67, 23,108, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,179, 51, 42, 63, 67, 23,108, 62,187,220, 45, 63, 55,205, 7, 62,198,143,214, 63, 65,236,200, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,190,242, 44, 63, 78, 83,205, 62,198,143,214, 63, 65,236,200,
- 62,212, 74,188, 63, 75, 39,171, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,212, 74,188,
- 63, 75, 39,171, 62,206,238,122, 63, 88, 64,147, 62,190,242, 44, 63, 78, 83,205, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 49, 63, 90, 56, 14, 62,190,242, 44, 63, 78, 83,205, 62,206,238,122, 63, 88, 64,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,206,238,122, 63, 88, 64,147, 62,212, 74,188,
- 63, 75, 39,171, 62,230,102,130, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102,130, 63, 49, 12, 82, 62,230,102,129, 63, 60, 86, 53, 62,216,247, 28, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,216,247, 28, 63, 52, 55,172, 62,218, 43,243, 63, 40,228,223, 62,230,102,130,
- 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,129, 63, 37,200, 48,
- 62,230,102,130, 63, 49, 12, 82, 62,218, 43,243, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,218, 43,243, 63, 40,228,223, 62,216,247, 28, 63, 52, 55,172, 62,205,118,212, 63, 43, 52,228, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,202,101,206, 63, 54,155,120, 62,205,118,212, 63, 43, 52,228,
- 62,216,247, 28, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,216,247, 28,
- 63, 52, 55,172, 62,215, 3,120, 63, 63,233, 95, 62,202,101,206, 63, 54,155,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,198,143,214, 63, 65,236,200, 62,202,101,206, 63, 54,155,120, 62,215, 3,120, 63, 63,233, 95,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,215, 3,120, 63, 63,233, 95, 62,216,247, 28,
- 63, 52, 55,172, 62,230,102,129, 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102,130, 63, 71,154, 1, 62,230,102,130, 63, 82,228, 41, 62,212, 74,188, 63, 75, 39,171, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,212, 74,188, 63, 75, 39,171, 62,215, 3,120, 63, 63,233, 95, 62,230,102,130,
- 63, 71,154, 1, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,129, 63, 60, 86, 53,
- 62,230,102,130, 63, 71,154, 1, 62,215, 3,120, 63, 63,233, 95, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,215, 3,120, 63, 63,233, 95, 62,212, 74,188, 63, 75, 39,171, 62,198,143,214, 63, 65,236,200, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,202,101,206, 63, 54,155,120, 62,198,143,214, 63, 65,236,200,
- 62,187,220, 45, 63, 55,205, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,187,220, 45,
- 63, 55,205, 7, 62,192,112,142, 63, 44,160,207, 62,202,101,206, 63, 54,155,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,205,118,212, 63, 43, 52,228, 62,202,101,206, 63, 54,155,120, 62,192,112,142, 63, 44,160,207,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,192,112,142, 63, 44,160,207, 62,187,220, 45,
- 63, 55,205, 7, 62,179, 51, 42, 63, 45, 28, 28, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102,131, 63, 94, 46, 79, 62,230,102,131, 63,105,114, 22, 62,198,103, 87, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,103, 87, 63, 99, 26, 58, 62,206,238,122, 63, 88, 64,147, 62,230,102,131,
- 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,130, 63, 82,228, 41,
- 62,230,102,131, 63, 94, 46, 79, 62,206,238,122, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,206,238,122, 63, 88, 64,147, 62,198,103, 87, 63, 99, 26, 58, 62,179, 51, 49, 63, 90, 56, 14, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,255, 14, 63, 99, 26, 49, 62,179, 51, 49, 63, 90, 56, 14,
- 62,198,103, 87, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,103, 87,
- 63, 99, 26, 58, 62,179, 51, 49, 63,109,154,210, 62,159,255, 14, 63, 99, 26, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63,105,114, 8, 62,159,255, 14, 63, 99, 26, 49, 62,179, 51, 49, 63,109,154,210,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 49, 63,109,154,210, 62,198,103, 87,
- 63, 99, 26, 58, 62,230,102,131, 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102,134, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 62,128, 0, 0, 63,116,187,232, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63,116,187,232, 62,179, 51, 49, 63,109,154,210, 62,230,102,134,
- 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,131, 63,105,114, 22,
- 62,230,102,134, 63,116,187,242, 62,179, 51, 49, 63,109,154,210, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,179, 51, 49, 63,109,154,210, 62,128, 0, 0, 63,116,187,232, 62,128, 0, 0, 63,105,114, 8, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,255, 14, 63, 99, 26, 49, 62,128, 0, 0, 63,105,114, 8,
- 62,128, 0, 0, 63, 94, 46, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0,
- 63, 94, 46, 58, 62,151,119,239, 63, 88, 64,131, 62,159,255, 14, 63, 99, 26, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 49, 63, 90, 56, 14, 62,159,255, 14, 63, 99, 26, 49, 62,151,119,239, 63, 88, 64,131,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,151,119,239, 63, 88, 64,131, 62,128, 0, 0,
- 63, 94, 46, 58, 62,128, 0, 0, 63, 82,228, 13, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 8,120, 93, 63, 55,205, 11, 63, 3, 30,140, 63, 65,236,201, 63, 1, 51,145, 63, 54,155,121, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 1, 51,145, 63, 54,155,121, 63, 6, 46, 46, 63, 44,160,211, 63, 8,120, 93,
- 63, 55,205, 11, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220, 63, 45, 28, 35,
- 63, 8,120, 93, 63, 55,205, 11, 63, 6, 46, 46, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 6, 46, 46, 63, 44,160,211, 63, 1, 51,145, 63, 54,155,121, 62,255, 86, 30, 63, 43, 52,230, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243,213,222, 63, 52, 55,172, 62,255, 86, 30, 63, 43, 52,230,
- 63, 1, 51,145, 63, 54,155,121, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 1, 51,145,
- 63, 54,155,121, 62,245,201,128, 63, 63,233, 94, 62,243,213,222, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,129, 63, 60, 86, 53, 62,243,213,222, 63, 52, 55,172, 62,245,201,128, 63, 63,233, 94,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,245,201,128, 63, 63,233, 94, 63, 1, 51,145,
- 63, 54,155,121, 63, 3, 30,140, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,248,130, 59, 63, 75, 39,169, 62,230,102,130, 63, 82,228, 41, 62,230,102,130, 63, 71,154, 1, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,130, 63, 71,154, 1, 62,245,201,128, 63, 63,233, 94, 62,248,130, 59,
- 63, 75, 39,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3, 30,140, 63, 65,236,201,
- 62,248,130, 59, 63, 75, 39,169, 62,245,201,128, 63, 63,233, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,245,201,128, 63, 63,233, 94, 62,230,102,130, 63, 71,154, 1, 62,230,102,129, 63, 60, 86, 53, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243,213,222, 63, 52, 55,172, 62,230,102,129, 63, 60, 86, 53,
- 62,230,102,130, 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,130,
- 63, 49, 12, 82, 62,242,161, 9, 63, 40,228,223, 62,243,213,222, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,255, 86, 30, 63, 43, 52,230, 62,243,213,222, 63, 52, 55,172, 62,242,161, 9, 63, 40,228,223,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,242,161, 9, 63, 40,228,223, 62,230,102,130,
- 63, 49, 12, 82, 62,230,102,129, 63, 37,200, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,248,130, 59, 63, 75, 39,169, 63, 3, 30,140, 63, 65,236,201, 63, 6,237, 94, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6,237, 94, 63, 78, 83,207, 62,253,222,118, 63, 88, 64,148, 62,248,130, 59,
- 63, 75, 39,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,130, 63, 82,228, 41,
- 62,248,130, 59, 63, 75, 39,169, 62,253,222,118, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,253,222,118, 63, 88, 64,148, 63, 6,237, 94, 63, 78, 83,207, 63, 12,204,220, 63, 90, 56, 22, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 18,172, 88, 63, 78, 83,207, 63, 12,204,220, 63, 90, 56, 22,
- 63, 6,237, 94, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6,237, 94,
- 63, 78, 83,207, 63, 12,204,220, 63, 67, 23,115, 63, 18,172, 88, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,123, 44, 63, 65,236,201, 63, 18,172, 88, 63, 78, 83,207, 63, 12,204,220, 63, 67, 23,115,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220, 63, 67, 23,115, 63, 6,237, 94,
- 63, 78, 83,207, 63, 3, 30,140, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 8,120, 93, 63, 55,205, 11, 63, 12,204,220, 63, 45, 28, 35, 63, 17, 33, 91, 63, 55,205, 9, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 17, 33, 91, 63, 55,205, 9, 63, 12,204,220, 63, 67, 23,115, 63, 8,120, 93,
- 63, 55,205, 11, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3, 30,140, 63, 65,236,201,
- 63, 8,120, 93, 63, 55,205, 11, 63, 12,204,220, 63, 67, 23,115, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 12,204,220, 63, 67, 23,115, 63, 17, 33, 91, 63, 55,205, 9, 63, 22,123, 44, 63, 65,236,201, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 18,172, 88, 63, 78, 83,207, 63, 22,123, 44, 63, 65,236,201,
- 63, 29, 88,153, 63, 75, 39,167, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 29, 88,153,
- 63, 75, 39,167, 63, 26,170,121, 63, 88, 64,147, 63, 18,172, 88, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220, 63, 90, 56, 22, 63, 18,172, 88, 63, 78, 83,207, 63, 26,170,121, 63, 88, 64,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 26,170,121, 63, 88, 64,147, 63, 29, 88,153,
- 63, 75, 39,167, 63, 38,102,118, 63, 82,228, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,117, 63, 49, 12, 78, 63, 38,102,117, 63, 60, 86, 50, 63, 31,174,200, 63, 52, 55,169, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,174,200, 63, 52, 55,169, 63, 32, 73, 51, 63, 40,228,221, 63, 38,102,117,
- 63, 49, 12, 78, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 37,200, 45,
- 63, 38,102,117, 63, 49, 12, 78, 63, 32, 73, 51, 63, 40,228,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 32, 73, 51, 63, 40,228,221, 63, 31,174,200, 63, 52, 55,169, 63, 25,238,169, 63, 43, 52,229, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 24,102, 39, 63, 54,155,119, 63, 25,238,169, 63, 43, 52,229,
- 63, 31,174,200, 63, 52, 55,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,174,200,
- 63, 52, 55,169, 63, 30,180,246, 63, 63,233, 92, 63, 24,102, 39, 63, 54,155,119, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,123, 44, 63, 65,236,201, 63, 24,102, 39, 63, 54,155,119, 63, 30,180,246, 63, 63,233, 92,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 30,180,246, 63, 63,233, 92, 63, 31,174,200,
- 63, 52, 55,169, 63, 38,102,117, 63, 60, 86, 50, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,117, 63, 71,153,255, 63, 38,102,118, 63, 82,228, 38, 63, 29, 88,153, 63, 75, 39,167, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 29, 88,153, 63, 75, 39,167, 63, 30,180,246, 63, 63,233, 92, 63, 38,102,117,
- 63, 71,153,255, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 60, 86, 50,
- 63, 38,102,117, 63, 71,153,255, 63, 30,180,246, 63, 63,233, 92, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 30,180,246, 63, 63,233, 92, 63, 29, 88,153, 63, 75, 39,167, 63, 22,123, 44, 63, 65,236,201, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 24,102, 39, 63, 54,155,119, 63, 22,123, 44, 63, 65,236,201,
- 63, 17, 33, 91, 63, 55,205, 9, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 17, 33, 91,
- 63, 55,205, 9, 63, 19,107,138, 63, 44,160,211, 63, 24,102, 39, 63, 54,155,119, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,238,169, 63, 43, 52,229, 63, 24,102, 39, 63, 54,155,119, 63, 19,107,138, 63, 44,160,211,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,107,138, 63, 44,160,211, 63, 17, 33, 91,
- 63, 55,205, 9, 63, 12,204,220, 63, 45, 28, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,118, 63, 94, 46, 77, 63, 38,102,118, 63,105,114, 19, 63, 22,102,235, 63, 99, 26, 59, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,102,235, 63, 99, 26, 59, 63, 26,170,121, 63, 88, 64,147, 63, 38,102,118,
- 63, 94, 46, 77, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,118, 63, 82,228, 38,
- 63, 38,102,118, 63, 94, 46, 77, 63, 26,170,121, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 26,170,121, 63, 88, 64,147, 63, 22,102,235, 63, 99, 26, 59, 63, 12,204,220, 63, 90, 56, 22, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3, 50,204, 63, 99, 26, 58, 63, 12,204,220, 63, 90, 56, 22,
- 63, 22,102,235, 63, 99, 26, 59, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,102,235,
- 63, 99, 26, 59, 63, 12,204,224, 63,109,154,212, 63, 3, 50,204, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,131, 63,105,114, 22, 63, 3, 50,204, 63, 99, 26, 58, 63, 12,204,224, 63,109,154,212,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,224, 63,109,154,212, 63, 22,102,235,
- 63, 99, 26, 59, 63, 38,102,118, 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,120, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 62,230,102,134, 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,134, 63,116,187,242, 63, 12,204,224, 63,109,154,212, 63, 38,102,120,
- 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,118, 63,105,114, 19,
- 63, 38,102,120, 63,116,187,242, 63, 12,204,224, 63,109,154,212, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 12,204,224, 63,109,154,212, 62,230,102,134, 63,116,187,242, 62,230,102,131, 63,105,114, 22, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3, 50,204, 63, 99, 26, 58, 62,230,102,131, 63,105,114, 22,
- 62,230,102,131, 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,131,
- 63, 94, 46, 79, 62,253,222,118, 63, 88, 64,148, 63, 3, 50,204, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220, 63, 90, 56, 22, 63, 3, 50,204, 63, 99, 26, 58, 62,253,222,118, 63, 88, 64,148,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,253,222,118, 63, 88, 64,148, 62,230,102,131,
- 63, 94, 46, 79, 62,230,102,130, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 76,233,213, 63, 21, 48, 35, 63, 70,235,176, 63, 22,209,226, 63, 73,234, 80, 63, 11,111,146, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,234, 80, 63, 11,111,146, 63, 79,200, 1, 63, 9,152, 94, 63, 76,233,213,
- 63, 21, 48, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,215, 19, 63, 19, 29,252,
- 63, 76,233,213, 63, 21, 48, 35, 63, 79,200, 1, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 79,200, 1, 63, 9,152, 94, 63, 73,234, 80, 63, 11,111,146, 63, 76,204,193, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,233,213, 63, 21, 48, 35, 63, 82,215, 19, 63, 19, 29,252,
- 63, 80, 41,220, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 80, 41,220,
- 63, 31, 60,105, 63, 73,219,164, 63, 33, 23,173, 63, 76,233,213, 63, 21, 48, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,235,176, 63, 22,209,226, 63, 76,233,213, 63, 21, 48, 35, 63, 73,219,164, 63, 33, 23,173,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,219,164, 63, 33, 23,173, 63, 80, 41,220,
- 63, 31, 60,105, 63, 77, 33,196, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 70,158,169, 63, 44,160,200, 63, 64, 0, 0, 63, 45, 28, 24, 63, 67,171, 5, 63, 34, 17,216, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67,171, 5, 63, 34, 17,216, 63, 73,219,164, 63, 33, 23,173, 63, 70,158,169,
- 63, 44,160,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 77, 33,196, 63, 43, 52,221,
- 63, 70,158,169, 63, 44,160,200, 63, 73,219,164, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 73,219,164, 63, 33, 23,173, 63, 67,171, 5, 63, 34, 17,216, 63, 70,235,176, 63, 22,209,226, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 83,124, 75, 63, 40,228,217, 63, 77, 33,196, 63, 43, 52,221,
- 63, 80, 41,220, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 80, 41,220,
- 63, 31, 60,105, 63, 86, 20,218, 63, 28,140,143, 63, 83,124, 75, 63, 40,228,217, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,139, 63, 37,200, 45, 63, 83,124, 75, 63, 40,228,217, 63, 86, 20,218, 63, 28,140,143,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 20,218, 63, 28,140,143, 63, 80, 41,220,
- 63, 31, 60,105, 63, 82,215, 19, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 64, 0, 0, 63, 23, 32,182, 63, 70,235,176, 63, 22,209,226, 63, 67,171, 5, 63, 34, 17,216, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67,171, 5, 63, 34, 17,216, 63, 60, 84,251, 63, 34, 17,216, 63, 64, 0, 0,
- 63, 23, 32,182, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 20, 80, 63, 22,209,226,
- 63, 64, 0, 0, 63, 23, 32,182, 63, 60, 84,251, 63, 34, 17,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 60, 84,251, 63, 34, 17,216, 63, 67,171, 5, 63, 34, 17,216, 63, 64, 0, 0, 63, 45, 28, 24, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 23, 32,182, 63, 57, 20, 80, 63, 22,209,226,
- 63, 60,156,169, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60,156,169,
- 63, 11,116, 96, 63, 67, 99, 87, 63, 11,116, 96, 63, 64, 0, 0, 63, 23, 32,182, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,235,176, 63, 22,209,226, 63, 64, 0, 0, 63, 23, 32,182, 63, 67, 99, 87, 63, 11,116, 96,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67, 99, 87, 63, 11,116, 96, 63, 60,156,169,
- 63, 11,116, 96, 63, 64, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 70,102, 96, 63, 0, 1,244, 63, 76,204,193, 63, 0, 0, 0, 63, 73,234, 80, 63, 11,111,146, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,234, 80, 63, 11,111,146, 63, 67, 99, 87, 63, 11,116, 96, 63, 70,102, 96,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 0, 0, 0,
- 63, 70,102, 96, 63, 0, 1,244, 63, 67, 99, 87, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 67, 99, 87, 63, 11,116, 96, 63, 73,234, 80, 63, 11,111,146, 63, 70,235,176, 63, 22,209,226, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57,153,160, 63, 0, 1,244, 63, 64, 0, 0, 63, 0, 0, 0,
- 63, 60,156,169, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60,156,169,
- 63, 11,116, 96, 63, 54, 21,176, 63, 11,111,146, 63, 57,153,160, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 51, 51, 63, 63, 0, 0, 0, 63, 57,153,160, 63, 0, 1,244, 63, 54, 21,176, 63, 11,111,146,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 21,176, 63, 11,111,146, 63, 60,156,169,
- 63, 11,116, 96, 63, 57, 20, 80, 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 64, 0, 0, 62,217, 58, 93, 63, 57, 61,144, 62,217,196, 19, 63, 60,123, 85, 62,198,230,253, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60,123, 85, 62,198,230,253, 63, 67,132,171, 62,198,230,253, 63, 64, 0, 0,
- 62,217, 58, 93, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,194,112, 62,217,196, 19,
- 63, 64, 0, 0, 62,217, 58, 93, 63, 67,132,171, 62,198,230,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 67,132,171, 62,198,230,253, 63, 60,123, 85, 62,198,230,253, 63, 64, 0, 0, 62,180,111,211, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,217, 58, 93, 63, 70,194,112, 62,217,196, 19,
- 63, 67, 84,125, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67, 84,125,
- 62,236,211, 42, 63, 60,171,131, 62,236,211, 42, 63, 64, 0, 0, 62,217, 58, 93, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 61,144, 62,217,196, 19, 63, 64, 0, 0, 62,217, 58, 93, 63, 60,171,131, 62,236,211, 42,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60,171,131, 62,236,211, 42, 63, 67, 84,125,
- 62,236,211, 42, 63, 64, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 57,153,160, 63, 0, 1,244, 63, 51, 51, 63, 63, 0, 0, 0, 63, 54, 46,128, 62,236,207, 75, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 46,128, 62,236,207, 75, 63, 60,171,131, 62,236,211, 42, 63, 57,153,160,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 0, 0, 0,
- 63, 57,153,160, 63, 0, 1,244, 63, 60,171,131, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 60,171,131, 62,236,211, 42, 63, 54, 46,128, 62,236,207, 75, 63, 57, 61,144, 62,217,196, 19, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,102, 96, 63, 0, 1,244, 63, 64, 0, 0, 63, 0, 0, 0,
- 63, 67, 84,125, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67, 84,125,
- 62,236,211, 42, 63, 73,209,128, 62,236,207, 75, 63, 70,102, 96, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,204,193, 63, 0, 0, 0, 63, 70,102, 96, 63, 0, 1,244, 63, 73,209,128, 62,236,207, 75,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,209,128, 62,236,207, 75, 63, 67, 84,125,
- 62,236,211, 42, 63, 70,194,112, 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 51, 22, 43, 63, 21, 48, 35, 63, 45, 40,237, 63, 19, 29,252, 63, 48, 55,255, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 55,255, 63, 9,152, 94, 63, 54, 21,176, 63, 11,111,146, 63, 51, 22, 43,
- 63, 21, 48, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 20, 80, 63, 22,209,226,
- 63, 51, 22, 43, 63, 21, 48, 35, 63, 54, 21,176, 63, 11,111,146, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 54, 21,176, 63, 11,111,146, 63, 48, 55,255, 63, 9,152, 94, 63, 51, 51, 63, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 51, 22, 43, 63, 21, 48, 35, 63, 57, 20, 80, 63, 22,209,226,
- 63, 54, 36, 91, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 36, 91,
- 63, 33, 23,173, 63, 47,214, 36, 63, 31, 60,105, 63, 51, 22, 43, 63, 21, 48, 35, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 40,237, 63, 19, 29,252, 63, 51, 22, 43, 63, 21, 48, 35, 63, 47,214, 36, 63, 31, 60,105,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 47,214, 36, 63, 31, 60,105, 63, 54, 36, 91,
- 63, 33, 23,173, 63, 50,222, 60, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 44,131,181, 63, 40,228,216, 63, 38,102,117, 63, 37,200, 45, 63, 41,235, 38, 63, 28,140,141, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,235, 38, 63, 28,140,141, 63, 47,214, 36, 63, 31, 60,105, 63, 44,131,181,
- 63, 40,228,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 50,222, 60, 63, 43, 52,221,
- 63, 44,131,181, 63, 40,228,216, 63, 47,214, 36, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 47,214, 36, 63, 31, 60,105, 63, 41,235, 38, 63, 28,140,141, 63, 45, 40,237, 63, 19, 29,252, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 97, 87, 63, 44,160,200, 63, 50,222, 60, 63, 43, 52,221,
- 63, 54, 36, 91, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54, 36, 91,
- 63, 33, 23,173, 63, 60, 84,251, 63, 34, 17,216, 63, 57, 97, 87, 63, 44,160,200, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 63, 45, 28, 24, 63, 57, 97, 87, 63, 44,160,200, 63, 60, 84,251, 63, 34, 17,216,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 60, 84,251, 63, 34, 17,216, 63, 54, 36, 91,
- 63, 33, 23,173, 63, 57, 20, 80, 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,128, 14,134, 63, 21, 48, 39, 63,122, 30,227, 63, 22,209,233, 63,125, 29,138, 63, 11,111,150, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 29,138, 63, 11,111,150, 63,129,125,159, 63, 9,152, 94, 63,128, 14,134,
- 63, 21, 48, 39, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,193, 73,174, 63, 19, 29,253,
- 57,232, 92,209, 63, 21, 48, 39, 60, 62,207,114, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,129,125,159, 63, 9,152, 94, 63,125, 29,138, 63, 11,111,150, 63,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 57,232, 92,209, 63, 21, 48, 39, 60,193, 73,174, 63, 19, 29,253,
- 60, 87, 67,214, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,129,174,136,
- 63, 31, 60,110, 63,125, 14,213, 63, 33, 23,180, 63,128, 14,134, 63, 21, 48, 39, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,122, 30,227, 63, 22,209,233, 63,128, 14,134, 63, 21, 48, 39, 63,125, 14,213, 63, 33, 23,180,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 14,213, 63, 33, 23,180, 63,129,174,136,
- 63, 31, 60,110, 63,128, 42,121, 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,121,209,210, 63, 44,160,212, 63,115, 51, 36, 63, 45, 28, 36, 63,118,222, 49, 63, 34, 17,226, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,222, 49, 63, 34, 17,226, 63,125, 14,213, 63, 33, 23,180, 63,121,209,210,
- 63, 44,160,212, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,128, 42,121, 63, 43, 52,230,
- 63,121,209,210, 63, 44,160,212, 63,125, 14,213, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,125, 14,213, 63, 33, 23,180, 63,118,222, 49, 63, 34, 17,226, 63,122, 30,227, 63, 22,209,233, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,213,239,111, 63, 40,228,223, 58,169,226,120, 63, 43, 52,230,
- 60, 87, 67,214, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60, 87, 67,214,
- 63, 31, 60,110, 61, 20,129, 13, 63, 28,140,143, 60,213,239,111, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,203,246, 63, 37,200, 48, 60,213,239,111, 63, 40,228,223, 61, 20,129, 13, 63, 28,140,143,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 20,129, 13, 63, 28,140,143, 60, 87, 67,214,
- 63, 31, 60,110, 60,193, 73,174, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,115, 51, 44, 63, 23, 32,188, 63,122, 30,227, 63, 22,209,233, 63,118,222, 49, 63, 34, 17,226, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,222, 49, 63, 34, 17,226, 63,111,136, 31, 63, 34, 17,225, 63,115, 51, 44,
- 63, 23, 32,188, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108, 71,116, 63, 22,209,232,
- 63,115, 51, 44, 63, 23, 32,188, 63,111,136, 31, 63, 34, 17,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,111,136, 31, 63, 34, 17,225, 63,118,222, 49, 63, 34, 17,226, 63,115, 51, 36, 63, 45, 28, 36, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 44, 63, 23, 32,188, 63,108, 71,116, 63, 22,209,232,
- 63,111,207,213, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,207,213,
- 63, 11,116,100, 63,118,150,138, 63, 11,116,101, 63,115, 51, 44, 63, 23, 32,188, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,122, 30,227, 63, 22,209,233, 63,115, 51, 44, 63, 23, 32,188, 63,118,150,138, 63, 11,116,101,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,150,138, 63, 11,116,101, 63,111,207,213,
- 63, 11,116,100, 63,115, 51, 51, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,121,153,154, 63, 0, 1,244, 63,128, 0, 0, 63, 0, 0, 0, 63,125, 29,138, 63, 11,111,150, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 29,138, 63, 11,111,150, 63,118,150,138, 63, 11,116,101, 63,121,153,154,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 51, 63, 0, 0, 0,
- 63,121,153,154, 63, 0, 1,244, 63,118,150,138, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,118,150,138, 63, 11,116,101, 63,125, 29,138, 63, 11,111,150, 63,122, 30,227, 63, 22,209,233, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108,204,205, 63, 0, 1,244, 63,115, 51, 51, 63, 0, 0, 0,
- 63,111,207,213, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,207,213,
- 63, 11,116,100, 63,105, 72,213, 63, 11,111,149, 63,108,204,205, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,102,102,101, 63, 0, 0, 0, 63,108,204,205, 63, 0, 1,244, 63,105, 72,213, 63, 11,111,149,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105, 72,213, 63, 11,111,149, 63,111,207,213,
- 63, 11,116,100, 63,108, 71,116, 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,115, 51, 58, 62,217, 58, 73, 63,108,112,192, 62,217,196, 4, 63,111,174,139, 62,198,230,223, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,174,139, 62,198,230,223, 63,118,183,239, 62,198,230,227, 63,115, 51, 58,
- 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121,245,179, 62,217,196, 6,
- 63,115, 51, 58, 62,217, 58, 73, 63,118,183,239, 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,118,183,239, 62,198,230,227, 63,111,174,139, 62,198,230,223, 63,115, 51, 65, 62,180,111,160, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 58, 62,217, 58, 73, 63,121,245,179, 62,217,196, 6,
- 63,118,135,185, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,135,185,
- 62,236,211, 30, 63,111,222,180, 62,236,211, 30, 63,115, 51, 58, 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,108,112,192, 62,217,196, 4, 63,115, 51, 58, 62,217, 58, 73, 63,111,222,180, 62,236,211, 30,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,222,180, 62,236,211, 30, 63,118,135,185,
- 62,236,211, 30, 63,115, 51, 51, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,108,204,205, 63, 0, 1,244, 63,102,102,101, 63, 0, 0, 0, 63,105, 97,170, 62,236,207, 65, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105, 97,170, 62,236,207, 65, 63,111,222,180, 62,236,211, 30, 63,108,204,205,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 51, 63, 0, 0, 0,
- 63,108,204,205, 63, 0, 1,244, 63,111,222,180, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,111,222,180, 62,236,211, 30, 63,105, 97,170, 62,236,207, 65, 63,108,112,192, 62,217,196, 4, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121,153,154, 63, 0, 1,244, 63,115, 51, 51, 63, 0, 0, 0,
- 63,118,135,185, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,135,185,
- 62,236,211, 30, 63,125, 4,194, 62,236,207, 67, 63,121,153,154, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 63,121,153,154, 63, 0, 1,244, 63,125, 4,194, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 4,194, 62,236,207, 67, 63,118,135,185,
- 62,236,211, 30, 63,121,245,179, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,102, 73, 76, 63, 21, 48, 38, 63, 96, 92, 11, 63, 19, 29,253, 63, 99,107, 33, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,107, 33, 63, 9,152, 94, 63,105, 72,213, 63, 11,111,149, 63,102, 73, 76,
- 63, 21, 48, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108, 71,116, 63, 22,209,232,
- 63,102, 73, 76, 63, 21, 48, 38, 63,105, 72,213, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,105, 72,213, 63, 11,111,149, 63, 99,107, 33, 63, 9,152, 94, 63,102,102,101, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102, 73, 76, 63, 21, 48, 38, 63,108, 71,116, 63, 22,209,232,
- 63,105, 87,124, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105, 87,124,
- 63, 33, 23,180, 63, 99, 9, 65, 63, 31, 60,109, 63,102, 73, 76, 63, 21, 48, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 92, 11, 63, 19, 29,253, 63,102, 73, 76, 63, 21, 48, 38, 63, 99, 9, 65, 63, 31, 60,109,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99, 9, 65, 63, 31, 60,109, 63,105, 87,124,
- 63, 33, 23,180, 63,102, 17, 87, 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 95,182,205, 63, 40,228,222, 63, 89,153,139, 63, 37,200, 45, 63, 93, 30, 63, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 93, 30, 63, 63, 28,140,143, 63, 99, 9, 65, 63, 31, 60,109, 63, 95,182,205,
- 63, 40,228,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102, 17, 87, 63, 43, 52,229,
- 63, 95,182,205, 63, 40,228,222, 63, 99, 9, 65, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 99, 9, 65, 63, 31, 60,109, 63, 93, 30, 63, 63, 28,140,143, 63, 96, 92, 11, 63, 19, 29,253, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108,148,118, 63, 44,160,211, 63,102, 17, 87, 63, 43, 52,229,
- 63,105, 87,124, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105, 87,124,
- 63, 33, 23,180, 63,111,136, 31, 63, 34, 17,225, 63,108,148,118, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 36, 63, 45, 28, 36, 63,108,148,118, 63, 44,160,211, 63,111,136, 31, 63, 34, 17,225,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,111,136, 31, 63, 34, 17,225, 63,105, 87,124,
- 63, 33, 23,180, 63,108, 71,116, 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 77, 65, 65, 63, 21, 48, 32, 62, 53, 72,152, 63, 22,209,229, 62, 65, 67, 47, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 65, 67, 47, 63, 11,111,147, 62, 88,185,255, 63, 9,152, 90, 62, 77, 65, 65,
- 63, 21, 48, 32, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,100,246, 64, 63, 19, 29,246,
- 62, 77, 65, 65, 63, 21, 48, 32, 62, 88,185,255, 63, 9,152, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 88,185,255, 63, 9,152, 90, 62, 65, 67, 47, 63, 11,111,147, 62, 76,204,254, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 77, 65, 65, 63, 21, 48, 32, 62,100,246, 64, 63, 19, 29,246,
- 62, 90, 65, 89, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 90, 65, 89,
- 63, 31, 60, 94, 62, 65, 8,107, 63, 33, 23,170, 62, 77, 65, 65, 63, 21, 48, 32, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 53, 72,152, 63, 22,209,229, 62, 77, 65, 65, 63, 21, 48, 32, 62, 65, 8,107, 63, 33, 23,170,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 65, 8,107, 63, 33, 23,170, 62, 90, 65, 89,
- 63, 31, 60, 94, 62, 78, 32,230, 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 52, 20,105, 63, 44,160,198, 62, 25,153,173, 63, 45, 28, 27, 62, 40, 69,216, 63, 34, 17,220, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 40, 69,216, 63, 34, 17,220, 62, 65, 8,107, 63, 33, 23,170, 62, 52, 20,105,
- 63, 44,160,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 78, 32,230, 63, 43, 52,211,
- 62, 52, 20,105, 63, 44,160,198, 62, 65, 8,107, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 65, 8,107, 63, 33, 23,170, 62, 40, 69,216, 63, 34, 17,220, 62, 53, 72,152, 63, 22,209,229, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,103,139, 14, 63, 40,228,199, 62, 78, 32,230, 63, 43, 52,211,
- 62, 90, 65, 89, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 90, 65, 89,
- 63, 31, 60, 94, 62,113,237, 83, 63, 28,140,130, 62,103,139, 14, 63, 40,228,199, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 37,200, 23, 62,103,139, 14, 63, 40,228,199, 62,113,237, 83, 63, 28,140,130,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,113,237, 83, 63, 28,140,130, 62, 90, 65, 89,
- 63, 31, 60, 94, 62,100,246, 64, 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 25,153,180, 63, 23, 32,185, 62, 53, 72,152, 63, 22,209,229, 62, 40, 69,216, 63, 34, 17,220, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 40, 69,216, 63, 34, 17,220, 62, 10,237,133, 63, 34, 17,219, 62, 25,153,180,
- 63, 23, 32,185, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,251,213,147, 63, 22,209,228,
- 62, 25,153,180, 63, 23, 32,185, 62, 10,237,133, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 10,237,133, 63, 34, 17,219, 62, 40, 69,216, 63, 34, 17,220, 62, 25,153,173, 63, 45, 28, 27, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,180, 63, 23, 32,185, 61,251,213,147, 63, 22,209,228,
- 62, 12, 12, 67, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 12, 12, 67,
- 63, 11,116, 98, 62, 39, 39, 34, 63, 11,116, 98, 62, 25,153,180, 63, 23, 32,185, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 53, 72,152, 63, 22,209,229, 62, 25,153,180, 63, 23, 32,185, 62, 39, 39, 34, 63, 11,116, 98,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 39, 39, 34, 63, 11,116, 98, 62, 12, 12, 67,
- 63, 11,116, 98, 62, 25,153,181, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 51, 51, 92, 63, 0, 1,244, 62, 76,204,254, 63, 0, 0, 0, 62, 65, 67, 47, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 65, 67, 47, 63, 11,111,147, 62, 39, 39, 34, 63, 11,116, 98, 62, 51, 51, 92,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,181, 63, 0, 0, 0,
- 62, 51, 51, 92, 63, 0, 1,244, 62, 39, 39, 34, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 39, 39, 34, 63, 11,116, 98, 62, 65, 67, 47, 63, 11,111,147, 62, 53, 72,152, 63, 22,209,229, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 0, 0, 8, 63, 0, 1,244, 62, 25,153,181, 63, 0, 0, 0,
- 62, 12, 12, 67, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 12, 12, 67,
- 63, 11,116, 98, 61,227,224,109, 63, 11,111,147, 62, 0, 0, 8, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,204,204,215, 63, 0, 0, 0, 62, 0, 0, 8, 63, 0, 1,244, 61,227,224,109, 63, 11,111,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,227,224,109, 63, 11,111,147, 62, 12, 12, 67,
- 63, 11,116, 98, 61,251,213,147, 63, 22,209,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 25,153,196, 62,217, 58, 73, 61,253, 31,171, 62,217,196, 6, 62, 11,135, 1, 62,198,230,228, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 11,135, 1, 62,198,230,228, 62, 39,172,153, 62,198,230,230, 62, 25,153,196,
- 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 52,163,179, 62,217,196, 7,
- 62, 25,153,196, 62,217, 58, 73, 62, 39,172,153, 62,198,230,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 39,172,153, 62,198,230,230, 62, 11,135, 1, 62,198,230,228, 62, 25,153,214, 62,180,111,165, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,196, 62,217, 58, 73, 62, 52,163,179, 62,217,196, 7,
- 62, 38,235,202, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 38,235,202,
- 62,236,211, 33, 62, 12, 71,173, 62,236,211, 31, 62, 25,153,196, 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,253, 31,171, 62,217,196, 6, 62, 25,153,196, 62,217, 58, 73, 62, 12, 71,173, 62,236,211, 31,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 12, 71,173, 62,236,211, 31, 62, 38,235,202,
- 62,236,211, 33, 62, 25,153,181, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 0, 0, 8, 63, 0, 1,244, 61,204,204,215, 63, 0, 0, 0, 61,228,166,251, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,228,166,251, 62,236,207, 67, 62, 12, 71,173, 62,236,211, 31, 62, 0, 0, 8,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,181, 63, 0, 0, 0,
- 62, 0, 0, 8, 63, 0, 1,244, 62, 12, 71,173, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 12, 71,173, 62,236,211, 31, 61,228,166,251, 62,236,207, 67, 61,253, 31,171, 62,217,196, 6, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 51, 51, 92, 63, 0, 1,244, 62, 25,153,181, 63, 0, 0, 0,
- 62, 38,235,202, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 38,235,202,
- 62,236,211, 33, 62, 64,223,251, 62,236,207, 67, 62, 51, 51, 92, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 76,204,254, 63, 0, 0, 0, 62, 51, 51, 92, 63, 0, 1,244, 62, 64,223,251, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 64,223,251, 62,236,207, 67, 62, 38,235,202,
- 62,236,211, 33, 62, 52,163,179, 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,203,228, 42, 63, 21, 48, 37, 61,156,122, 1, 63, 19, 29,254, 61,180,242,172, 63, 9,152, 96, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,180,242,172, 63, 9,152, 96, 61,227,224,109, 63, 11,111,147, 61,203,228, 42,
- 63, 21, 48, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,251,213,147, 63, 22,209,228,
- 61,203,228, 42, 63, 21, 48, 37, 61,227,224,109, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,227,224,109, 63, 11,111,147, 61,180,242,172, 63, 9,152, 96, 61,204,204,215, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,203,228, 42, 63, 21, 48, 37, 61,251,213,147, 63, 22,209,228,
- 61,228, 85,208, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,228, 85,208,
- 63, 33, 23,179, 61,177,227,212, 63, 31, 60,110, 61,203,228, 42, 63, 21, 48, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,156,122, 1, 63, 19, 29,254, 61,203,228, 42, 63, 21, 48, 37, 61,177,227,212, 63, 31, 60,110,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,177,227,212, 63, 31, 60,110, 61,228, 85,208,
- 63, 33, 23,179, 61,202, 36,175, 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,151, 80, 53, 63, 40,228,223, 61, 76,203,246, 63, 37,200, 48, 61,130,139,166, 63, 28,140,145, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,130,139,166, 63, 28,140,145, 61,177,227,212, 63, 31, 60,110, 61,151, 80, 53,
- 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,202, 36,175, 63, 43, 52,228,
- 61,151, 80, 53, 63, 40,228,223, 61,177,227,212, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,177,227,212, 63, 31, 60,110, 61,130,139,166, 63, 28,140,145, 61,156,122, 1, 63, 19, 29,254, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,254, 61,201, 63, 44,160,207, 61,202, 36,175, 63, 43, 52,228,
- 61,228, 85,208, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,228, 85,208,
- 63, 33, 23,179, 62, 10,237,133, 63, 34, 17,219, 61,254, 61,201, 63, 44,160,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,173, 63, 45, 28, 27, 61,254, 61,201, 63, 44,160,207, 62, 10,237,133, 63, 34, 17,219,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 10,237,133, 63, 34, 17,219, 61,228, 85,208,
- 63, 33, 23,179, 61,251,213,147, 63, 22,209,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,205, 6,245, 63, 21, 48, 37, 62,193, 10,155, 63, 22,209,229, 62,199, 7,229, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,199, 7,229, 63, 11,111,147, 62,210,195, 85, 63, 9,152, 96, 62,205, 6,245,
- 63, 21, 48, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,216,225,128, 63, 19, 29,254,
- 62,205, 6,245, 63, 21, 48, 37, 62,210,195, 85, 63, 9,152, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,210,195, 85, 63, 9,152, 96, 62,199, 7,229, 63, 11,111,147, 62,204,204,202, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,205, 6,245, 63, 21, 48, 37, 62,216,225,128, 63, 19, 29,254,
- 62,211,135, 11, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,211,135, 11,
- 63, 31, 60,110, 62,198,234,140, 63, 33, 23,179, 62,205, 6,245, 63, 21, 48, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,193, 10,155, 63, 22,209,229, 62,205, 6,245, 63, 21, 48, 37, 62,198,234,140, 63, 33, 23,179,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,234,140, 63, 33, 23,179, 62,211,135, 11,
- 63, 31, 60,110, 62,205,118,212, 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,192,112,142, 63, 44,160,207, 62,179, 51, 42, 63, 45, 28, 28, 62,186,137, 61, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,186,137, 61, 63, 34, 17,219, 62,198,234,140, 63, 33, 23,179, 62,192,112,142,
- 63, 44,160,207, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,205,118,212, 63, 43, 52,228,
- 62,192,112,142, 63, 44,160,207, 62,198,234,140, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,198,234,140, 63, 33, 23,179, 62,186,137, 61, 63, 34, 17,219, 62,193, 10,155, 63, 22,209,229, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,218, 43,243, 63, 40,228,223, 62,205,118,212, 63, 43, 52,228,
- 62,211,135, 11, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,211,135, 11,
- 63, 31, 60,110, 62,223, 93, 22, 63, 28,140,145, 62,218, 43,243, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,129, 63, 37,200, 48, 62,218, 43,243, 63, 40,228,223, 62,223, 93, 22, 63, 28,140,145,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223, 93, 22, 63, 28,140,145, 62,211,135, 11,
- 63, 31, 60,110, 62,216,225,128, 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,179, 51, 38, 63, 23, 32,185, 62,193, 10,155, 63, 22,209,229, 62,186,137, 61, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,186,137, 61, 63, 34, 17,219, 62,171,221, 20, 63, 34, 17,219, 62,179, 51, 38,
- 63, 23, 32,185, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,165, 91,180, 63, 22,209,229,
- 62,179, 51, 38, 63, 23, 32,185, 62,171,221, 20, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,171,221, 20, 63, 34, 17,219, 62,186,137, 61, 63, 34, 17,219, 62,179, 51, 42, 63, 45, 28, 28, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 38, 63, 23, 32,185, 62,165, 91,180, 63, 22,209,229,
- 62,172,108,111, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,172,108,111,
- 63, 11,116, 98, 62,185,249,222, 63, 11,116, 98, 62,179, 51, 38, 63, 23, 32,185, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,193, 10,155, 63, 22,209,229, 62,179, 51, 38, 63, 23, 32,185, 62,185,249,222, 63, 11,116, 98,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,185,249,222, 63, 11,116, 98, 62,172,108,111,
- 63, 11,116, 98, 62,179, 51, 38, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,191,255,252, 63, 0, 1,244, 62,204,204,202, 63, 0, 0, 0, 62,199, 7,229, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,199, 7,229, 63, 11,111,147, 62,185,249,222, 63, 11,116, 98, 62,191,255,252,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 38, 63, 0, 0, 0,
- 62,191,255,252, 63, 0, 1,244, 62,185,249,222, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,185,249,222, 63, 11,116, 98, 62,199, 7,229, 63, 11,111,147, 62,193, 10,155, 63, 22,209,229, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,166,102, 82, 63, 0, 1,244, 62,179, 51, 38, 63, 0, 0, 0,
- 62,172,108,111, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,172,108,111,
- 63, 11,116, 98, 62,159, 94,104, 63, 11,111,147, 62,166,102, 82, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,153,153,129, 63, 0, 0, 0, 62,166,102, 82, 63, 0, 1,244, 62,159, 94,104, 63, 11,111,147,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159, 94,104, 63, 11,111,147, 62,172,108,111,
- 63, 11,116, 98, 62,165, 91,180, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,179, 51, 30, 62,217, 58, 73, 62,165,174, 39, 62,217,196, 7, 62,172, 41,180, 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,172, 41,180, 62,198,230,227, 62,186, 60,127, 62,198,230,225, 62,179, 51, 30,
- 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,192,184, 21, 62,217,196, 6,
- 62,179, 51, 30, 62,217, 58, 73, 62,186, 60,127, 62,198,230,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,186, 60,127, 62,198,230,225, 62,172, 41,180, 62,198,230,227, 62,179, 51, 21, 62,180,111,165, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 30, 62,217, 58, 73, 62,192,184, 21, 62,217,196, 6,
- 62,185,220, 42, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,185,220, 42,
- 62,236,211, 31, 62,172,138, 27, 62,236,211, 33, 62,179, 51, 30, 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,165,174, 39, 62,217,196, 7, 62,179, 51, 30, 62,217, 58, 73, 62,172,138, 27, 62,236,211, 33,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,172,138, 27, 62,236,211, 33, 62,185,220, 42,
- 62,236,211, 31, 62,179, 51, 38, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,166,102, 82, 63, 0, 1,244, 62,153,153,129, 63, 0, 0, 0, 62,159,144, 3, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,144, 3, 62,236,207, 67, 62,172,138, 27, 62,236,211, 33, 62,166,102, 82,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 38, 63, 0, 0, 0,
- 62,166,102, 82, 63, 0, 1,244, 62,172,138, 27, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,172,138, 27, 62,236,211, 33, 62,159,144, 3, 62,236,207, 67, 62,165,174, 39, 62,217,196, 7, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,191,255,252, 63, 0, 1,244, 62,179, 51, 38, 63, 0, 0, 0,
- 62,185,220, 42, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,185,220, 42,
- 62,236,211, 31, 62,198,214, 65, 62,236,207, 67, 62,191,255,252, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,204,204,202, 63, 0, 0, 0, 62,191,255,252, 63, 0, 1,244, 62,198,214, 65, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,214, 65, 62,236,207, 67, 62,185,220, 42,
- 62,236,211, 31, 62,192,184, 21, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,153, 95, 95, 63, 21, 48, 32, 62,141,132,224, 63, 19, 29,246, 62,147,163, 1, 63, 9,152, 91, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147,163, 1, 63, 9,152, 91, 62,159, 94,104, 63, 11,111,147, 62,153, 95, 95,
- 63, 21, 48, 32, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,165, 91,180, 63, 22,209,229,
- 62,153, 95, 95, 63, 21, 48, 32, 62,159, 94,104, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,159, 94,104, 63, 11,111,147, 62,147,163, 1, 63, 9,152, 91, 62,153,153,129, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,153, 95, 95, 63, 21, 48, 32, 62,165, 91,180, 63, 22,209,229,
- 62,159,123,203, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,123,203,
- 63, 33, 23,170, 62,146,223, 84, 63, 31, 60, 94, 62,153, 95, 95, 63, 21, 48, 32, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,141,132,224, 63, 19, 29,246, 62,153, 95, 95, 63, 21, 48, 32, 62,146,223, 84, 63, 31, 60, 94,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,146,223, 84, 63, 31, 60, 94, 62,159,123,203,
- 63, 33, 23,170, 62,152,239,141, 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,140, 58,121, 63, 40,228,199, 62,128, 0, 0, 63, 37,200, 23, 62,135, 9, 86, 63, 28,140,130, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,135, 9, 86, 63, 28,140,130, 62,146,223, 84, 63, 31, 60, 94, 62,140, 58,121,
- 63, 40,228,199, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,152,239,141, 63, 43, 52,211,
- 62,140, 58,121, 63, 40,228,199, 62,146,223, 84, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,146,223, 84, 63, 31, 60, 94, 62,135, 9, 86, 63, 28,140,130, 62,141,132,224, 63, 19, 29,246, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,165,245,204, 63, 44,160,198, 62,152,239,141, 63, 43, 52,211,
- 62,159,123,203, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,159,123,203,
- 63, 33, 23,170, 62,171,221, 20, 63, 34, 17,219, 62,165,245,204, 63, 44,160,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 42, 63, 45, 28, 28, 62,165,245,204, 63, 44,160,198, 62,171,221, 20, 63, 34, 17,219,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,171,221, 20, 63, 34, 17,219, 62,159,123,203,
- 63, 33, 23,170, 62,165, 91,180, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 25,182,180, 63, 21, 48, 38, 63, 19,184,140, 63, 22,209,232, 63, 22,183, 43, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,183, 43, 63, 11,111,149, 63, 28,148,223, 63, 9,152, 94, 63, 25,182,180,
- 63, 21, 48, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,163,245, 63, 19, 29,253,
- 63, 25,182,180, 63, 21, 48, 38, 63, 28,148,223, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 28,148,223, 63, 9,152, 94, 63, 22,183, 43, 63, 11,111,149, 63, 25,153,155, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,182,180, 63, 21, 48, 38, 63, 31,163,245, 63, 19, 29,253,
- 63, 28,246,191, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,246,191,
- 63, 31, 60,109, 63, 22,168,132, 63, 33, 23,180, 63, 25,182,180, 63, 21, 48, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,184,140, 63, 22,209,232, 63, 25,182,180, 63, 21, 48, 38, 63, 22,168,132, 63, 33, 23,180,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,168,132, 63, 33, 23,180, 63, 28,246,191,
- 63, 31, 60,109, 63, 25,238,169, 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 19,107,138, 63, 44,160,211, 63, 12,204,220, 63, 45, 28, 35, 63, 16,119,225, 63, 34, 17,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16,119,225, 63, 34, 17,225, 63, 22,168,132, 63, 33, 23,180, 63, 19,107,138,
- 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,238,169, 63, 43, 52,229,
- 63, 19,107,138, 63, 44,160,211, 63, 22,168,132, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 22,168,132, 63, 33, 23,180, 63, 16,119,225, 63, 34, 17,225, 63, 19,184,140, 63, 22,209,232, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 32, 73, 51, 63, 40,228,221, 63, 25,238,169, 63, 43, 52,229,
- 63, 28,246,191, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,246,191,
- 63, 31, 60,109, 63, 34,225,192, 63, 28,140,142, 63, 32, 73, 51, 63, 40,228,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,117, 63, 37,200, 45, 63, 32, 73, 51, 63, 40,228,221, 63, 34,225,192, 63, 28,140,142,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 34,225,192, 63, 28,140,142, 63, 28,246,191,
- 63, 31, 60,109, 63, 31,163,245, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 12,204,212, 63, 23, 32,188, 63, 19,184,140, 63, 22,209,232, 63, 16,119,225, 63, 34, 17,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16,119,225, 63, 34, 17,225, 63, 9, 33,207, 63, 34, 17,226, 63, 12,204,212,
- 63, 23, 32,188, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 5,225, 29, 63, 22,209,233,
- 63, 12,204,212, 63, 23, 32,188, 63, 9, 33,207, 63, 34, 17,226, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 9, 33,207, 63, 34, 17,226, 63, 16,119,225, 63, 34, 17,225, 63, 12,204,220, 63, 45, 28, 35, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,212, 63, 23, 32,188, 63, 5,225, 29, 63, 22,209,233,
- 63, 9,105,118, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9,105,118,
- 63, 11,116,101, 63, 16, 48, 43, 63, 11,116,100, 63, 12,204,212, 63, 23, 32,188, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,184,140, 63, 22,209,232, 63, 12,204,212, 63, 23, 32,188, 63, 16, 48, 43, 63, 11,116,100,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16, 48, 43, 63, 11,116,100, 63, 9,105,118,
- 63, 11,116,101, 63, 12,204,205, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 19, 51, 51, 63, 0, 1,244, 63, 25,153,155, 63, 0, 0, 0, 63, 22,183, 43, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,183, 43, 63, 11,111,149, 63, 16, 48, 43, 63, 11,116,100, 63, 19, 51, 51,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,205, 63, 0, 0, 0,
- 63, 19, 51, 51, 63, 0, 1,244, 63, 16, 48, 43, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 16, 48, 43, 63, 11,116,100, 63, 22,183, 43, 63, 11,111,149, 63, 19,184,140, 63, 22,209,232, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6,102,102, 63, 0, 1,244, 63, 12,204,205, 63, 0, 0, 0,
- 63, 9,105,118, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9,105,118,
- 63, 11,116,101, 63, 2,226,118, 63, 11,111,149, 63, 6,102,102, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 6,102,102, 63, 0, 1,244, 63, 2,226,118, 63, 11,111,149,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 2,226,118, 63, 11,111,149, 63, 9,105,118,
- 63, 11,116,101, 63, 5,225, 29, 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 12,204,198, 62,217, 58, 72, 63, 6, 10, 77, 62,217,196, 6, 63, 9, 72, 17, 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9, 72, 17, 62,198,230,227, 63, 16, 81,117, 62,198,230,223, 63, 12,204,198,
- 62,217, 58, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,143, 64, 62,217,196, 4,
- 63, 12,204,198, 62,217, 58, 72, 63, 16, 81,117, 62,198,230,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 16, 81,117, 62,198,230,223, 63, 9, 72, 17, 62,198,230,227, 63, 12,204,191, 62,180,111,160, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,198, 62,217, 58, 72, 63, 19,143, 64, 62,217,196, 4,
- 63, 16, 33, 76, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16, 33, 76,
- 62,236,211, 30, 63, 9,120, 71, 62,236,211, 30, 63, 12,204,198, 62,217, 58, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 6, 10, 77, 62,217,196, 6, 63, 12,204,198, 62,217, 58, 72, 63, 9,120, 71, 62,236,211, 30,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9,120, 71, 62,236,211, 30, 63, 16, 33, 76,
- 62,236,211, 30, 63, 12,204,205, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 6,102,102, 63, 0, 1,244, 63, 0, 0, 0, 63, 0, 0, 0, 63, 2,251, 62, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 2,251, 62, 62,236,207, 67, 63, 9,120, 71, 62,236,211, 30, 63, 6,102,102,
- 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,205, 63, 0, 0, 0,
- 63, 6,102,102, 63, 0, 1,244, 63, 9,120, 71, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 9,120, 71, 62,236,211, 30, 63, 2,251, 62, 62,236,207, 67, 63, 6, 10, 77, 62,217,196, 6, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19, 51, 51, 63, 0, 1,244, 63, 12,204,205, 63, 0, 0, 0,
- 63, 16, 33, 76, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16, 33, 76,
- 62,236,211, 30, 63, 22,158, 86, 62,236,207, 65, 63, 19, 51, 51, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,153,155, 63, 0, 0, 0, 63, 19, 51, 51, 63, 0, 1,244, 63, 22,158, 86, 62,236,207, 65,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,158, 86, 62,236,207, 65, 63, 16, 33, 76,
- 62,236,211, 30, 63, 19,143, 64, 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,255,197,233, 63, 21, 48, 39, 62,243,235,101, 63, 19, 29,252, 62,250, 9,132, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 9,132, 63, 9,152, 94, 63, 2,226,118, 63, 11,111,149, 62,255,197,233,
- 63, 21, 48, 39, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 5,225, 29, 63, 22,209,233,
- 62,255,197,233, 63, 21, 48, 39, 63, 2,226,118, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 2,226,118, 63, 11,111,149, 62,250, 9,132, 63, 9,152, 94, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,255,197,233, 63, 21, 48, 39, 63, 5,225, 29, 63, 22,209,233,
- 63, 2,241, 43, 63, 33, 23,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 2,241, 43,
- 63, 33, 23,181, 62,249, 69,225, 63, 31, 60,110, 62,255,197,233, 63, 21, 48, 39, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,243,235,101, 63, 19, 29,252, 62,255,197,233, 63, 21, 48, 39, 62,249, 69,225, 63, 31, 60,110,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,249, 69,225, 63, 31, 60,110, 63, 2,241, 43,
- 63, 33, 23,181, 62,255, 86, 30, 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,242,161, 9, 63, 40,228,223, 62,230,102,129, 63, 37,200, 48, 62,237,111,222, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237,111,222, 63, 28,140,143, 62,249, 69,225, 63, 31, 60,110, 62,242,161, 9,
- 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,255, 86, 30, 63, 43, 52,230,
- 62,242,161, 9, 63, 40,228,223, 62,249, 69,225, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,249, 69,225, 63, 31, 60,110, 62,237,111,222, 63, 28,140,143, 62,243,235,101, 63, 19, 29,252, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6, 46, 46, 63, 44,160,211, 62,255, 86, 30, 63, 43, 52,230,
- 63, 2,241, 43, 63, 33, 23,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 2,241, 43,
- 63, 33, 23,181, 63, 9, 33,207, 63, 34, 17,226, 63, 6, 46, 46, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,220, 63, 45, 28, 35, 63, 6, 46, 46, 63, 44,160,211, 63, 9, 33,207, 63, 34, 17,226,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 9, 33,207, 63, 34, 17,226, 63, 2,241, 43,
- 63, 33, 23,181, 63, 5,225, 29, 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 85,238,138, 62,187,220, 72, 63, 82,173,218, 62,210, 92, 55, 63, 79,189,229, 62,189,208,173, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,189,229, 62,189,208,173, 63, 82,250,230, 62,166,190,117, 63, 85,238,138,
- 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,149, 62,165,199,201,
- 63, 85,238,138, 62,187,220, 72, 63, 82,250,230, 62,166,190,117, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 82,250,230, 62,166,190,117, 63, 79,189,229, 62,189,208,173, 63, 76,119,198, 62,169,150, 90, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,111,170, 62,193,135, 68, 63, 76,119,198, 62,169,150, 90,
- 63, 79,189,229, 62,189,208,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,189,229,
- 62,189,208,173, 63, 76,175,176, 62,213,159,192, 63, 73,111,170, 62,193,135, 68, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,194,112, 62,217,196, 19, 63, 73,111,170, 62,193,135, 68, 63, 76,175,176, 62,213,159,192,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,175,176, 62,213,159,192, 63, 79,189,229,
- 62,189,208,173, 63, 82,173,218, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 79,175, 52, 62,233, 32,218, 63, 76,204,193, 63, 0, 0, 0, 63, 73,209,128, 62,236,207, 75, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,209,128, 62,236,207, 75, 63, 76,175,176, 62,213,159,192, 63, 79,175, 52,
- 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,173,218, 62,210, 92, 55,
- 63, 79,175, 52, 62,233, 32,218, 63, 76,175,176, 62,213,159,192, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 76,175,176, 62,213,159,192, 63, 73,209,128, 62,236,207, 75, 63, 70,194,112, 62,217,196, 19, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73,111,170, 62,193,135, 68, 63, 70,194,112, 62,217,196, 19,
- 63, 67,132,171, 62,198,230,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 67,132,171,
- 62,198,230,253, 63, 70, 29, 61, 62,174, 54,114, 63, 73,111,170, 62,193,135, 68, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,119,198, 62,169,150, 90, 63, 73,111,170, 62,193,135, 68, 63, 70, 29, 61, 62,174, 54,114,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70, 29, 61, 62,174, 54,114, 63, 67,132,171,
- 62,198,230,253, 63, 64, 0, 0, 62,180,111,211, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 79,175, 52, 62,233, 32,218, 63, 82,173,218, 62,210, 92, 55, 63, 86, 54, 56, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 54, 56, 62,233, 23, 58, 63, 83, 51, 41, 62,255,252, 24, 63, 79,175, 52,
- 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,204,193, 63, 0, 0, 0,
- 63, 79,175, 52, 62,233, 32,218, 63, 83, 51, 41, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 83, 51, 41, 62,255,252, 24, 63, 86, 54, 56, 62,233, 23, 58, 63, 89,153,147, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 92,252,239, 62,233, 23, 58, 63, 89,153,147, 63, 0, 0, 0,
- 63, 86, 54, 56, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 54, 56,
- 62,233, 23, 58, 63, 89,153,147, 62,209,190,143, 63, 92,252,239, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 96,133, 78, 62,210, 92, 55, 63, 92,252,239, 62,233, 23, 58, 63, 89,153,147, 62,209,190,143,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,147, 62,209,190,143, 63, 86, 54, 56,
- 62,233, 23, 58, 63, 82,173,218, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 85,238,138, 62,187,220, 72, 63, 89,153,149, 62,165,199,201, 63, 93, 68,159, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 93, 68,159, 62,187,220, 72, 63, 89,153,147, 62,209,190,143, 63, 85,238,138,
- 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,173,218, 62,210, 92, 55,
- 63, 85,238,138, 62,187,220, 72, 63, 89,153,147, 62,209,190,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 89,153,147, 62,209,190,143, 63, 93, 68,159, 62,187,220, 72, 63, 96,133, 78, 62,210, 92, 55, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 92,252,239, 62,233, 23, 58, 63, 96,133, 78, 62,210, 92, 55,
- 63, 99,131,242, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,131,242,
- 62,233, 32,218, 63, 95,255,254, 62,255,252, 24, 63, 92,252,239, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,147, 63, 0, 0, 0, 63, 92,252,239, 62,233, 23, 58, 63, 95,255,254, 62,255,252, 24,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 95,255,254, 62,255,252, 24, 63, 99,131,242,
- 62,233, 32,218, 63,102,102,101, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,111,174,139, 62,198,230,223, 63,108,112,192, 62,217,196, 4, 63,105,195,133, 62,193,135, 37, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105,195,133, 62,193,135, 37, 63,109, 21,249, 62,174, 54, 65, 63,111,174,139,
- 62,198,230,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62,180,111,160,
- 63,111,174,139, 62,198,230,223, 63,109, 21,249, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,109, 21,249, 62,174, 54, 65, 63,105,195,133, 62,193,135, 37, 63,102,187,106, 62,169,150, 54, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,117, 70, 62,189,208,155, 63,102,187,106, 62,169,150, 54,
- 63,105,195,133, 62,193,135, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,105,195,133,
- 62,193,135, 37, 63,102,131,123, 62,213,159,181, 63, 99,117, 70, 62,189,208,155, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 96,133, 78, 62,210, 92, 55, 63, 99,117, 70, 62,189,208,155, 63,102,131,123, 62,213,159,181,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102,131,123, 62,213,159,181, 63,105,195,133,
- 62,193,135, 37, 63,108,112,192, 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,105, 97,170, 62,236,207, 65, 63,102,102,101, 63, 0, 0, 0, 63, 99,131,242, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,131,242, 62,233, 32,218, 63,102,131,123, 62,213,159,181, 63,105, 97,170,
- 62,236,207, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108,112,192, 62,217,196, 4,
- 63,105, 97,170, 62,236,207, 65, 63,102,131,123, 62,213,159,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,102,131,123, 62,213,159,181, 63, 99,131,242, 62,233, 32,218, 63, 96,133, 78, 62,210, 92, 55, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99,117, 70, 62,189,208,155, 63, 96,133, 78, 62,210, 92, 55,
- 63, 93, 68,159, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 93, 68,159,
- 62,187,220, 72, 63, 96, 56, 71, 62,166,190, 99, 63, 99,117, 70, 62,189,208,155, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,102,187,106, 62,169,150, 54, 63, 99,117, 70, 62,189,208,155, 63, 96, 56, 71, 62,166,190, 99,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 56, 71, 62,166,190, 99, 63, 93, 68,159,
- 62,187,220, 72, 63, 89,153,149, 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 99,107, 33, 63, 9,152, 94, 63, 96, 92, 11, 63, 19, 29,253, 63, 92,238, 21, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 92,238, 21, 63, 9,150,112, 63, 95,255,254, 62,255,252, 24, 63, 99,107, 33,
- 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102,102,101, 63, 0, 0, 0,
- 63, 99,107, 33, 63, 9,152, 94, 63, 95,255,254, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 95,255,254, 62,255,252, 24, 63, 92,238, 21, 63, 9,150,112, 63, 89,153,147, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 69, 14, 63, 9,150,112, 63, 89,153,147, 63, 0, 0, 0,
- 63, 92,238, 21, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 92,238, 21,
- 63, 9,150,112, 63, 89,153,143, 63, 19, 98,219, 63, 86, 69, 14, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,215, 19, 63, 19, 29,252, 63, 86, 69, 14, 63, 9,150,112, 63, 89,153,143, 63, 19, 98,219,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,143, 63, 19, 98,219, 63, 92,238, 21,
- 63, 9,150,112, 63, 96, 92, 11, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 93, 30, 63, 63, 28,140,143, 63, 89,153,139, 63, 37,200, 45, 63, 86, 20,218, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 20,218, 63, 28,140,143, 63, 89,153,143, 63, 19, 98,219, 63, 93, 30, 63,
- 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 96, 92, 11, 63, 19, 29,253,
- 63, 93, 30, 63, 63, 28,140,143, 63, 89,153,143, 63, 19, 98,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 89,153,143, 63, 19, 98,219, 63, 86, 20,218, 63, 28,140,143, 63, 82,215, 19, 63, 19, 29,252, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 86, 69, 14, 63, 9,150,112, 63, 82,215, 19, 63, 19, 29,252,
- 63, 79,200, 1, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,200, 1,
- 63, 9,152, 94, 63, 83, 51, 41, 62,255,252, 24, 63, 86, 69, 14, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,147, 63, 0, 0, 0, 63, 86, 69, 14, 63, 9,150,112, 63, 83, 51, 41, 62,255,252, 24,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 83, 51, 41, 62,255,252, 24, 63, 79,200, 1,
- 63, 9,152, 94, 63, 76,204,193, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 18, 28,237, 62,187,220, 60, 60,188, 35,151, 62,210, 92, 46, 60, 60, 74,218, 62,189,208,150, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60, 60, 74,218, 62,189,208,150, 60,197,197,195, 62,166,190, 89, 61, 18, 28,237,
- 62,187,220, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205,194, 62,165,199,186,
- 61, 18, 28,237, 62,187,220, 60, 60,197,197,195, 62,166,190, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,131, 23, 23, 62,166,190, 89, 63,129,120,150, 62,189,208,150, 63,127,171, 15, 62,169,150, 52, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124,162,241, 62,193,135, 36, 63,127,171, 15, 62,169,150, 52,
- 63,129,120,150, 62,189,208,150, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,129,120,150,
- 62,189,208,150, 63,127,226,244, 62,213,159,179, 63,124,162,241, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,121,245,179, 62,217,196, 6, 63,124,162,241, 62,193,135, 36, 63,127,226,244, 62,213,159,179,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,127,226,244, 62,213,159,179, 63,129,120,150,
- 62,189,208,150, 63,130,240,142, 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,129,113, 59, 62,233, 32,214, 63,128, 0, 0, 63, 0, 0, 0, 63,125, 4,194, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,125, 4,194, 62,236,207, 67, 63,127,226,244, 62,213,159,179, 63,129,113, 59,
- 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,130,240,142, 62,210, 92, 46,
- 63,129,113, 59, 62,233, 32,214, 63,127,226,244, 62,213,159,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,127,226,244, 62,213,159,179, 63,125, 4,194, 62,236,207, 67, 63,121,245,179, 62,217,196, 6, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124,162,241, 62,193,135, 36, 63,121,245,179, 62,217,196, 6,
- 63,118,183,239, 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,118,183,239,
- 62,198,230,227, 63,121, 80,133, 62,174, 54, 65, 63,124,162,241, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,127,171, 15, 62,169,150, 52, 63,124,162,241, 62,193,135, 36, 63,121, 80,133, 62,174, 54, 65,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121, 80,133, 62,174, 54, 65, 63,118,183,239,
- 62,198,230,227, 63,115, 51, 65, 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 60, 56,157,110, 62,233, 32,214, 60,188, 35,151, 62,210, 92, 46, 61, 22,151, 95, 62,233, 23, 55, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 22,151, 95, 62,233, 23, 55, 60,204,204,176, 62,255,252, 24, 60, 56,157,110,
- 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 38, 11, 79,167, 63, 0, 0, 0,
- 60, 56,157,110, 62,233, 32,214, 60,204,204,176, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 60,204,204,176, 62,255,252, 24, 61, 22,151, 95, 62,233, 23, 55, 61, 76,204,215, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,129,129, 87, 62,233, 23, 57, 61, 76,204,215, 63, 0, 0, 0,
- 61, 22,151, 95, 62,233, 23, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 22,151, 95,
- 62,233, 23, 55, 61, 76,205, 68, 62,209,190,135, 61,129,129, 87, 62,233, 23, 57, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,157,196, 92, 62,210, 92, 49, 61,129,129, 87, 62,233, 23, 57, 61, 76,205, 68, 62,209,190,135,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205, 68, 62,209,190,135, 61, 22,151, 95,
- 62,233, 23, 55, 60,188, 35,151, 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 18, 28,237, 62,187,220, 60, 61, 76,205,194, 62,165,199,186, 61,131,191, 7, 62,187,220, 62, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,131,191, 7, 62,187,220, 62, 61, 76,205, 68, 62,209,190,135, 61, 18, 28,237,
- 62,187,220, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,188, 35,151, 62,210, 92, 46,
- 61, 18, 28,237, 62,187,220, 60, 61, 76,205, 68, 62,209,190,135, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61, 76,205, 68, 62,209,190,135, 61,131,191, 7, 62,187,220, 62, 61,157,196, 92, 62,210, 92, 49, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,129,129, 87, 62,233, 23, 57, 61,157,196, 92, 62,210, 92, 49,
- 61,181,185, 89, 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,181,185, 89,
- 62,233, 32,214, 61,153,153,154, 62,255,252, 25, 61,129,129, 87, 62,233, 23, 57, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,204,215, 63, 0, 0, 0, 61,129,129, 87, 62,233, 23, 57, 61,153,153,154, 62,255,252, 25,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,153,153,154, 62,255,252, 25, 61,181,185, 89,
- 62,233, 32,214, 61,204,204,215, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 11,135, 1, 62,198,230,228, 61,253, 31,171, 62,217,196, 6, 61,231,181,251, 62,193,135, 38, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,231,181,251, 62,193,135, 38, 62, 1, 36,204, 62,174, 54, 70, 62, 11,135, 1,
- 62,198,230,228, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62,180,111,165,
- 62, 11,135, 1, 62,198,230,228, 62, 1, 36,204, 62,174, 54, 70, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 1, 36,204, 62,174, 54, 70, 61,231,181,251, 62,193,135, 38, 61,207,117, 70, 62,169,150, 54, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,181, 68, 35, 62,189,208,153, 61,207,117, 70, 62,169,150, 54,
- 61,231,181,251, 62,193,135, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,231,181,251,
- 62,193,135, 38, 61,205,181,164, 62,213,159,180, 61,181, 68, 35, 62,189,208,153, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,157,196, 92, 62,210, 92, 49, 61,181, 68, 35, 62,189,208,153, 61,205,181,164, 62,213,159,180,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,205,181,164, 62,213,159,180, 61,231,181,251,
- 62,193,135, 38, 61,253, 31,171, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,228,166,251, 62,236,207, 67, 61,204,204,215, 63, 0, 0, 0, 61,181,185, 89, 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,181,185, 89, 62,233, 32,214, 61,205,181,164, 62,213,159,180, 61,228,166,251,
- 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,253, 31,171, 62,217,196, 6,
- 61,228,166,251, 62,236,207, 67, 61,205,181,164, 62,213,159,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,205,181,164, 62,213,159,180, 61,181,185, 89, 62,233, 32,214, 61,157,196, 92, 62,210, 92, 49, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,181, 68, 35, 62,189,208,153, 61,157,196, 92, 62,210, 92, 49,
- 61,131,191, 7, 62,187,220, 62, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,131,191, 7,
- 62,187,220, 62, 61,155, 92, 79, 62,166,190, 91, 61,181, 68, 35, 62,189,208,153, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,207,117, 70, 62,169,150, 54, 61,181, 68, 35, 62,189,208,153, 61,155, 92, 79, 62,166,190, 91,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,155, 92, 79, 62,166,190, 91, 61,131,191, 7,
- 62,187,220, 62, 61, 76,205,194, 62,165,199,186, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,180,242,172, 63, 9,152, 96, 61,156,122, 1, 63, 19, 29,254, 61,129, 10,100, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,129, 10,100, 63, 9,150,113, 61,153,153,154, 62,255,252, 25, 61,180,242,172,
- 63, 9,152, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,204,204,215, 63, 0, 0, 0,
- 61,180,242,172, 63, 9,152, 96, 61,153,153,154, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,153,153,154, 62,255,252, 25, 61,129, 10,100, 63, 9,150,113, 61, 76,204,215, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 23,132,109, 63, 9,150,113, 61, 76,204,215, 63, 0, 0, 0,
- 61,129, 10,100, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,129, 10,100,
- 63, 9,150,113, 61, 76,204, 91, 63, 19, 98,220, 61, 23,132,109, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 60,193, 73,174, 63, 19, 29,253, 61, 23,132,109, 63, 9,150,113, 61, 76,204, 91, 63, 19, 98,220,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,204, 91, 63, 19, 98,220, 61,129, 10,100,
- 63, 9,150,113, 61,156,122, 1, 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,130,139,166, 63, 28,140,145, 61, 76,203,246, 63, 37,200, 48, 61, 20,129, 13, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 20,129, 13, 63, 28,140,143, 61, 76,204, 91, 63, 19, 98,220, 61,130,139,166,
- 63, 28,140,145, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,156,122, 1, 63, 19, 29,254,
- 61,130,139,166, 63, 28,140,145, 61, 76,204, 91, 63, 19, 98,220, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61, 76,204, 91, 63, 19, 98,220, 61, 20,129, 13, 63, 28,140,143, 60,193, 73,174, 63, 19, 29,253, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 23,132,109, 63, 9,150,113, 60,193, 73,174, 63, 19, 29,253,
- 60, 62,207,114, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60, 62,207,114,
- 63, 9,152, 94, 60,204,204,176, 62,255,252, 24, 61, 23,132,109, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,204,215, 63, 0, 0, 0, 61, 23,132,109, 63, 9,150,113, 60,204,204,176, 62,255,252, 24,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,204,204,176, 62,255,252, 24, 60, 62,207,114,
- 63, 9,152, 94, 38, 11, 79,167, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,113, 83,237, 62,187,220, 79, 62,100, 81, 63, 62,210, 92, 60, 62, 88,145,110, 62,189,208,167, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 88,145,110, 62,189,208,167, 62,101,133, 91, 62,166,190,112, 62,113, 83,237,
- 62,187,220, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62,165,199,206,
- 62,113, 83,237, 62,187,220, 79, 62,101,133, 91, 62,166,190,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,101,133, 91, 62,166,190,112, 62, 88,145,110, 62,189,208,167, 62, 75,120,239, 62,169,150, 70, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 63, 88,144, 62,193,135, 46, 62, 75,120,239, 62,169,150, 70,
- 62, 88,145,110, 62,189,208,167, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 88,145,110,
- 62,189,208,167, 62, 76, 88,170, 62,213,159,187, 62, 63, 88,144, 62,193,135, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 52,163,179, 62,217,196, 7, 62, 63, 88,144, 62,193,135, 46, 62, 76, 88,170, 62,213,159,187,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 76, 88,170, 62,213,159,187, 62, 88,145,110,
- 62,189,208,167, 62,100, 81, 63, 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 88, 86,190, 62,233, 32,221, 62, 76,204,254, 63, 0, 0, 0, 62, 64,223,251, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 64,223,251, 62,236,207, 67, 62, 76, 88,170, 62,213,159,187, 62, 88, 86,190,
- 62,233, 32,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,100, 81, 63, 62,210, 92, 60,
- 62, 88, 86,190, 62,233, 32,221, 62, 76, 88,170, 62,213,159,187, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 76, 88,170, 62,213,159,187, 62, 64,223,251, 62,236,207, 67, 62, 52,163,179, 62,217,196, 7, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 63, 88,144, 62,193,135, 46, 62, 52,163,179, 62,217,196, 7,
- 62, 39,172,153, 62,198,230,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 39,172,153,
- 62,198,230,230, 62, 50, 14,213, 62,174, 54, 78, 62, 63, 88,144, 62,193,135, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 75,120,239, 62,169,150, 70, 62, 63, 88,144, 62,193,135, 46, 62, 50, 14,213, 62,174, 54, 78,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 50, 14,213, 62,174, 54, 78, 62, 39,172,153,
- 62,198,230,230, 62, 25,153,214, 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 88, 86,190, 62,233, 32,221, 62,100, 81, 63, 62,210, 92, 60, 62,114,114,166, 62,233, 23, 63, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,114,114,166, 62,233, 23, 63, 62,102,102,126, 62,255,252, 25, 62, 88, 86,190,
- 62,233, 32,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 76,204,254, 63, 0, 0, 0,
- 62, 88, 86,190, 62,233, 32,221, 62,102,102,126, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,102,102,126, 62,255,252, 25, 62,114,114,166, 62,233, 23, 63, 62,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,134,198,173, 62,233, 23, 63, 62,128, 0, 0, 63, 0, 0, 0,
- 62,114,114,166, 62,233, 23, 63, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,114,114,166,
- 62,233, 23, 63, 62,128, 0, 0, 62,209,190,149, 62,134,198,173, 62,233, 23, 63, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,141,215, 97, 62,210, 92, 60, 62,134,198,173, 62,233, 23, 63, 62,128, 0, 0, 62,209,190,149,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62,209,190,149, 62,114,114,166,
- 62,233, 23, 63, 62,100, 81, 63, 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,113, 83,237, 62,187,220, 79, 62,128, 0, 0, 62,165,199,206, 62,135, 86, 9, 62,187,220, 79, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,135, 86, 9, 62,187,220, 79, 62,128, 0, 0, 62,209,190,149, 62,113, 83,237,
- 62,187,220, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,100, 81, 63, 62,210, 92, 60,
- 62,113, 83,237, 62,187,220, 79, 62,128, 0, 0, 62,209,190,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,128, 0, 0, 62,209,190,149, 62,135, 86, 9, 62,187,220, 79, 62,141,215, 97, 62,210, 92, 60, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,134,198,173, 62,233, 23, 63, 62,141,215, 97, 62,210, 92, 60,
- 62,147,212,161, 62,233, 32,221, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147,212,161,
- 62,233, 32,221, 62,140,204,193, 62,255,252, 25, 62,134,198,173, 62,233, 23, 63, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 0, 0, 0, 62,134,198,173, 62,233, 23, 63, 62,140,204,193, 62,255,252, 25,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,140,204,193, 62,255,252, 25, 62,147,212,161,
- 62,233, 32,221, 62,153,153,129, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,172, 41,180, 62,198,230,227, 62,165,174, 39, 62,217,196, 7, 62,160, 83,184, 62,193,135, 46, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,160, 83,184, 62,193,135, 46, 62,166,248,150, 62,174, 54, 78, 62,172, 41,180,
- 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62,180,111,165,
- 62,172, 41,180, 62,198,230,227, 62,166,248,150, 62,174, 54, 78, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,166,248,150, 62,174, 54, 78, 62,160, 83,184, 62,193,135, 46, 62,154, 67,137, 62,169,150, 70, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147,183, 73, 62,189,208,167, 62,154, 67,137, 62,169,150, 70,
- 62,160, 83,184, 62,193,135, 46, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,160, 83,184,
- 62,193,135, 46, 62,153,211,171, 62,213,159,187, 62,147,183, 73, 62,189,208,167, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,141,215, 97, 62,210, 92, 60, 62,147,183, 73, 62,189,208,167, 62,153,211,171, 62,213,159,187,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,153,211,171, 62,213,159,187, 62,160, 83,184,
- 62,193,135, 46, 62,165,174, 39, 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,159,144, 3, 62,236,207, 67, 62,153,153,129, 63, 0, 0, 0, 62,147,212,161, 62,233, 32,221, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147,212,161, 62,233, 32,221, 62,153,211,171, 62,213,159,187, 62,159,144, 3,
- 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,165,174, 39, 62,217,196, 7,
- 62,159,144, 3, 62,236,207, 67, 62,153,211,171, 62,213,159,187, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,153,211,171, 62,213,159,187, 62,147,212,161, 62,233, 32,221, 62,141,215, 97, 62,210, 92, 60, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147,183, 73, 62,189,208,167, 62,141,215, 97, 62,210, 92, 60,
- 62,135, 86, 9, 62,187,220, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,135, 86, 9,
- 62,187,220, 79, 62,141, 61, 82, 62,166,190,112, 62,147,183, 73, 62,189,208,167, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,154, 67,137, 62,169,150, 70, 62,147,183, 73, 62,189,208,167, 62,141, 61, 82, 62,166,190,112,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141, 61, 82, 62,166,190,112, 62,135, 86, 9,
- 62,187,220, 79, 62,128, 0, 0, 62,165,199,206, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,147,163, 1, 63, 9,152, 91, 62,141,132,224, 63, 19, 29,246, 62,134,168,251, 63, 9,150,107, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,134,168,251, 63, 9,150,107, 62,140,204,193, 62,255,252, 25, 62,147,163, 1,
- 63, 9,152, 91, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,153,153,129, 63, 0, 0, 0,
- 62,147,163, 1, 63, 9,152, 91, 62,140,204,193, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,140,204,193, 62,255,252, 25, 62,134,168,251, 63, 9,150,107, 62,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,114,174, 11, 63, 9,150,107, 62,128, 0, 0, 63, 0, 0, 0,
- 62,134,168,251, 63, 9,150,107, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,134,168,251,
- 63, 9,150,107, 62,128, 0, 0, 63, 19, 98,209, 62,114,174, 11, 63, 9,150,107, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,100,246, 64, 63, 19, 29,246, 62,114,174, 11, 63, 9,150,107, 62,128, 0, 0, 63, 19, 98,209,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 19, 98,209, 62,134,168,251,
- 63, 9,150,107, 62,141,132,224, 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,135, 9, 86, 63, 28,140,130, 62,128, 0, 0, 63, 37,200, 23, 62,113,237, 83, 63, 28,140,130, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,113,237, 83, 63, 28,140,130, 62,128, 0, 0, 63, 19, 98,209, 62,135, 9, 86,
- 63, 28,140,130, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,141,132,224, 63, 19, 29,246,
- 62,135, 9, 86, 63, 28,140,130, 62,128, 0, 0, 63, 19, 98,209, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,128, 0, 0, 63, 19, 98,209, 62,113,237, 83, 63, 28,140,130, 62,100,246, 64, 63, 19, 29,246, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,114,174, 11, 63, 9,150,107, 62,100,246, 64, 63, 19, 29,246,
- 62, 88,185,255, 63, 9,152, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 88,185,255,
- 63, 9,152, 90, 62,102,102,126, 62,255,252, 25, 62,114,174, 11, 63, 9,150,107, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 63, 0, 0, 0, 62,114,174, 11, 63, 9,150,107, 62,102,102,126, 62,255,252, 25,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,102,102,126, 62,255,252, 25, 62, 88,185,255,
- 63, 9,152, 90, 62, 76,204,254, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,223, 16, 63, 62,187,220, 62, 62,216,142,233, 62,210, 92, 49, 62,210,174,248, 62,189,208,153, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,210,174,248, 62,189,208,153, 62,217, 40,237, 62,166,190, 91, 62,223, 16, 63,
- 62,187,220, 62, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 72, 62,165,199,183,
- 62,223, 16, 63, 62,187,220, 62, 62,217, 40,237, 62,166,190, 91, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,217, 40,237, 62,166,190, 91, 62,210,174,248, 62,189,208,153, 62,204, 34,175, 62,169,150, 54, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198, 18,129, 62,193,135, 37, 62,204, 34,175, 62,169,150, 54,
- 62,210,174,248, 62,189,208,153, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,210,174,248,
- 62,189,208,153, 62,204,146,151, 62,213,159,180, 62,198, 18,129, 62,193,135, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,192,184, 21, 62,217,196, 6, 62,198, 18,129, 62,193,135, 37, 62,204,146,151, 62,213,159,180,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,204,146,151, 62,213,159,180, 62,210,174,248,
- 62,189,208,153, 62,216,142,233, 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,210,145,170, 62,233, 32,214, 62,204,204,202, 63, 0, 0, 0, 62,198,214, 65, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198,214, 65, 62,236,207, 67, 62,204,146,151, 62,213,159,180, 62,210,145,170,
- 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,216,142,233, 62,210, 92, 49,
- 62,210,145,170, 62,233, 32,214, 62,204,146,151, 62,213,159,180, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,204,146,151, 62,213,159,180, 62,198,214, 65, 62,236,207, 67, 62,192,184, 21, 62,217,196, 6, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,198, 18,129, 62,193,135, 37, 62,192,184, 21, 62,217,196, 6,
- 62,186, 60,127, 62,198,230,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,186, 60,127,
- 62,198,230,225, 62,191,109,154, 62,174, 54, 68, 62,198, 18,129, 62,193,135, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,204, 34,175, 62,169,150, 54, 62,198, 18,129, 62,193,135, 37, 62,191,109,154, 62,174, 54, 68,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,191,109,154, 62,174, 54, 68, 62,186, 60,127,
- 62,198,230,225, 62,179, 51, 21, 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,210,145,170, 62,233, 32,214, 62,216,142,233, 62,210, 92, 49, 62,223,159,171, 62,233, 23, 57, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223,159,171, 62,233, 23, 57, 62,217,153,154, 62,255,252, 24, 62,210,145,170,
- 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,204,204,202, 63, 0, 0, 0,
- 62,210,145,170, 62,233, 32,214, 62,217,153,154, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,217,153,154, 62,255,252, 24, 62,223,159,171, 62,233, 23, 57, 62,230,102,101, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237, 45, 20, 62,233, 23, 55, 62,230,102,101, 63, 0, 0, 0,
- 62,223,159,171, 62,233, 23, 57, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223,159,171,
- 62,233, 23, 57, 62,230,102, 88, 62,209,190,135, 62,237, 45, 20, 62,233, 23, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,244, 61,199, 62,210, 92, 46, 62,237, 45, 20, 62,233, 23, 55, 62,230,102, 88, 62,209,190,135,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 88, 62,209,190,135, 62,223,159,171,
- 62,233, 23, 57, 62,216,142,233, 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,223, 16, 63, 62,187,220, 62, 62,230,102, 72, 62,165,199,183, 62,237,188, 99, 62,187,220, 60, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237,188, 99, 62,187,220, 60, 62,230,102, 88, 62,209,190,135, 62,223, 16, 63,
- 62,187,220, 62, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,216,142,233, 62,210, 92, 49,
- 62,223, 16, 63, 62,187,220, 62, 62,230,102, 88, 62,209,190,135, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,230,102, 88, 62,209,190,135, 62,237,188, 99, 62,187,220, 60, 62,244, 61,199, 62,210, 92, 46, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237, 45, 20, 62,233, 23, 55, 62,244, 61,199, 62,210, 92, 46,
- 62,250, 59, 21, 62,233, 32,213, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 59, 21,
- 62,233, 32,213, 62,243, 51, 53, 62,255,252, 24, 62,237, 45, 20, 62,233, 23, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,101, 63, 0, 0, 0, 62,237, 45, 20, 62,233, 23, 55, 62,243, 51, 53, 62,255,252, 24,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243, 51, 53, 62,255,252, 24, 62,250, 59, 21,
- 62,233, 32,213, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 9, 72, 17, 62,198,230,227, 63, 6, 10, 77, 62,217,196, 6, 63, 3, 93, 15, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3, 93, 15, 62,193,135, 36, 63, 6,175,123, 62,174, 54, 65, 63, 9, 72, 17,
- 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62,180,111,160,
- 63, 9, 72, 17, 62,198,230,227, 63, 6,175,123, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 6,175,123, 62,174, 54, 65, 63, 3, 93, 15, 62,193,135, 36, 63, 0, 84,241, 62,169,150, 52, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 29,169, 62,189,208,150, 63, 0, 84,241, 62,169,150, 52,
- 63, 3, 93, 15, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3, 93, 15,
- 62,193,135, 36, 63, 0, 29, 12, 62,213,159,179, 62,250, 29,169, 62,189,208,150, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,244, 61,199, 62,210, 92, 46, 62,250, 29,169, 62,189,208,150, 63, 0, 29, 12, 62,213,159,179,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 0, 29, 12, 62,213,159,179, 63, 3, 93, 15,
- 62,193,135, 36, 63, 6, 10, 77, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 2,251, 62, 62,236,207, 67, 63, 0, 0, 0, 63, 0, 0, 0, 62,250, 59, 21, 62,233, 32,213, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 59, 21, 62,233, 32,213, 63, 0, 29, 12, 62,213,159,179, 63, 2,251, 62,
- 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6, 10, 77, 62,217,196, 6,
- 63, 2,251, 62, 62,236,207, 67, 63, 0, 29, 12, 62,213,159,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 0, 29, 12, 62,213,159,179, 62,250, 59, 21, 62,233, 32,213, 62,244, 61,199, 62,210, 92, 46, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,250, 29,169, 62,189,208,150, 62,244, 61,199, 62,210, 92, 46,
- 62,237,188, 99, 62,187,220, 60, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237,188, 99,
- 62,187,220, 60, 62,243,163,164, 62,166,190, 89, 62,250, 29,169, 62,189,208,150, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 0, 84,241, 62,169,150, 52, 62,250, 29,169, 62,189,208,150, 62,243,163,164, 62,166,190, 89,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243,163,164, 62,166,190, 89, 62,237,188, 99,
- 62,187,220, 60, 62,230,102, 72, 62,165,199,183, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,250, 9,132, 63, 9,152, 94, 62,243,235,101, 63, 19, 29,252, 62,237, 15,114, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237, 15,114, 63, 9,150,113, 62,243, 51, 53, 62,255,252, 24, 62,250, 9,132,
- 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0,
- 62,250, 9,132, 63, 9,152, 94, 62,243, 51, 53, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,243, 51, 53, 62,255,252, 24, 62,237, 15,114, 63, 9,150,113, 62,230,102,101, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223,189,103, 63, 9,150,112, 62,230,102,101, 63, 0, 0, 0,
- 62,237, 15,114, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,237, 15,114,
- 63, 9,150,113, 62,230,102,117, 63, 19, 98,220, 62,223,189,103, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,216,225,128, 63, 19, 29,254, 62,223,189,103, 63, 9,150,112, 62,230,102,117, 63, 19, 98,220,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,117, 63, 19, 98,220, 62,237, 15,114,
- 63, 9,150,113, 62,243,235,101, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,237,111,222, 63, 28,140,143, 62,230,102,129, 63, 37,200, 48, 62,223, 93, 22, 63, 28,140,145, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223, 93, 22, 63, 28,140,145, 62,230,102,117, 63, 19, 98,220, 62,237,111,222,
- 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,243,235,101, 63, 19, 29,252,
- 62,237,111,222, 63, 28,140,143, 62,230,102,117, 63, 19, 98,220, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,230,102,117, 63, 19, 98,220, 62,223, 93, 22, 63, 28,140,145, 62,216,225,128, 63, 19, 29,254, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,223,189,103, 63, 9,150,112, 62,216,225,128, 63, 19, 29,254,
- 62,210,195, 85, 63, 9,152, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,210,195, 85,
- 63, 9,152, 96, 62,217,153,154, 62,255,252, 24, 62,223,189,103, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102,101, 63, 0, 0, 0, 62,223,189,103, 63, 9,150,112, 62,217,153,154, 62,255,252, 24,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,217,153,154, 62,255,252, 24, 62,210,195, 85,
- 63, 9,152, 96, 62,204,204,202, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 34,187, 97, 62,187,220, 72, 63, 31,122,178, 62,210, 92, 55, 63, 28,138,186, 62,189,208,155, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,138,186, 62,189,208,155, 63, 31,199,185, 62,166,190, 96, 63, 34,187, 97,
- 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,107, 62,165,199,201,
- 63, 34,187, 97, 62,187,220, 72, 63, 31,199,185, 62,166,190, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 31,199,185, 62,166,190, 96, 63, 28,138,186, 62,189,208,155, 63, 25, 68,150, 62,169,150, 54, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22, 60,123, 62,193,135, 36, 63, 25, 68,150, 62,169,150, 54,
- 63, 28,138,186, 62,189,208,155, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,138,186,
- 62,189,208,155, 63, 25,124,133, 62,213,159,181, 63, 22, 60,123, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,143, 64, 62,217,196, 4, 63, 22, 60,123, 62,193,135, 36, 63, 25,124,133, 62,213,159,181,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,124,133, 62,213,159,181, 63, 28,138,186,
- 62,189,208,155, 63, 31,122,178, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 28,124, 14, 62,233, 32,218, 63, 25,153,155, 63, 0, 0, 0, 63, 22,158, 86, 62,236,207, 65, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22,158, 86, 62,236,207, 65, 63, 25,124,133, 62,213,159,181, 63, 28,124, 14,
- 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,122,178, 62,210, 92, 55,
- 63, 28,124, 14, 62,233, 32,218, 63, 25,124,133, 62,213,159,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 25,124,133, 62,213,159,181, 63, 22,158, 86, 62,236,207, 65, 63, 19,143, 64, 62,217,196, 4, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 22, 60,123, 62,193,135, 36, 63, 19,143, 64, 62,217,196, 4,
- 63, 16, 81,117, 62,198,230,223, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 16, 81,117,
- 62,198,230,223, 63, 18,234, 7, 62,174, 54, 65, 63, 22, 60,123, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 25, 68,150, 62,169,150, 54, 63, 22, 60,123, 62,193,135, 36, 63, 18,234, 7, 62,174, 54, 65,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 18,234, 7, 62,174, 54, 65, 63, 16, 81,117,
- 62,198,230,223, 63, 12,204,191, 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 28,124, 14, 62,233, 32,218, 63, 31,122,178, 62,210, 92, 55, 63, 35, 3, 17, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 35, 3, 17, 62,233, 23, 58, 63, 32, 0, 2, 62,255,252, 24, 63, 28,124, 14,
- 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25,153,155, 63, 0, 0, 0,
- 63, 28,124, 14, 62,233, 32,218, 63, 32, 0, 2, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 32, 0, 2, 62,255,252, 24, 63, 35, 3, 17, 62,233, 23, 58, 63, 38,102,109, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,201,200, 62,233, 23, 58, 63, 38,102,109, 63, 0, 0, 0,
- 63, 35, 3, 17, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 35, 3, 17,
- 62,233, 23, 58, 63, 38,102,109, 62,209,190,143, 63, 41,201,200, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 82, 38, 62,210, 92, 55, 63, 41,201,200, 62,233, 23, 58, 63, 38,102,109, 62,209,190,143,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,109, 62,209,190,143, 63, 35, 3, 17,
- 62,233, 23, 58, 63, 31,122,178, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 34,187, 97, 62,187,220, 72, 63, 38,102,107, 62,165,199,201, 63, 42, 17,118, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 42, 17,118, 62,187,220, 72, 63, 38,102,109, 62,209,190,143, 63, 34,187, 97,
- 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,122,178, 62,210, 92, 55,
- 63, 34,187, 97, 62,187,220, 72, 63, 38,102,109, 62,209,190,143, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 38,102,109, 62,209,190,143, 63, 42, 17,118, 62,187,220, 72, 63, 45, 82, 38, 62,210, 92, 55, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,201,200, 62,233, 23, 58, 63, 45, 82, 38, 62,210, 92, 55,
- 63, 48, 80,204, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 80,204,
- 62,233, 32,218, 63, 44,204,215, 62,255,252, 23, 63, 41,201,200, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,109, 63, 0, 0, 0, 63, 41,201,200, 62,233, 23, 58, 63, 44,204,215, 62,255,252, 23,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 44,204,215, 62,255,252, 23, 63, 48, 80,204,
- 62,233, 32,218, 63, 51, 51, 63, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 60,123, 85, 62,198,230,253, 63, 57, 61,144, 62,217,196, 19, 63, 54,144, 86, 62,193,135, 68, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,144, 86, 62,193,135, 68, 63, 57,226,196, 62,174, 54,114, 63, 60,123, 85,
- 62,198,230,253, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,180,111,211,
- 63, 60,123, 85, 62,198,230,253, 63, 57,226,196, 62,174, 54,114, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 57,226,196, 62,174, 54,114, 63, 54,144, 86, 62,193,135, 68, 63, 51,136, 58, 62,169,150, 90, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 66, 27, 62,189,208,173, 63, 51,136, 58, 62,169,150, 90,
- 63, 54,144, 86, 62,193,135, 68, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,144, 86,
- 62,193,135, 68, 63, 51, 80, 80, 62,213,159,192, 63, 48, 66, 27, 62,189,208,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 82, 38, 62,210, 92, 55, 63, 48, 66, 27, 62,189,208,173, 63, 51, 80, 80, 62,213,159,192,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 51, 80, 80, 62,213,159,192, 63, 54,144, 86,
- 62,193,135, 68, 63, 57, 61,144, 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 54, 46,128, 62,236,207, 75, 63, 51, 51, 63, 63, 0, 0, 0, 63, 48, 80,204, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 80,204, 62,233, 32,218, 63, 51, 80, 80, 62,213,159,192, 63, 54, 46,128,
- 62,236,207, 75, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 61,144, 62,217,196, 19,
- 63, 54, 46,128, 62,236,207, 75, 63, 51, 80, 80, 62,213,159,192, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 51, 80, 80, 62,213,159,192, 63, 48, 80,204, 62,233, 32,218, 63, 45, 82, 38, 62,210, 92, 55, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 66, 27, 62,189,208,173, 63, 45, 82, 38, 62,210, 92, 55,
- 63, 42, 17,118, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 42, 17,118,
- 62,187,220, 72, 63, 45, 5, 26, 62,166,190,117, 63, 48, 66, 27, 62,189,208,173, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 51,136, 58, 62,169,150, 90, 63, 48, 66, 27, 62,189,208,173, 63, 45, 5, 26, 62,166,190,117,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 5, 26, 62,166,190,117, 63, 42, 17,118,
- 62,187,220, 72, 63, 38,102,107, 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 48, 55,255, 63, 9,152, 94, 63, 45, 40,237, 63, 19, 29,252, 63, 41,186,242, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,186,242, 63, 9,150,112, 63, 44,204,215, 62,255,252, 23, 63, 48, 55,255,
- 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 51, 51, 63, 63, 0, 0, 0,
- 63, 48, 55,255, 63, 9,152, 94, 63, 44,204,215, 62,255,252, 23, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 44,204,215, 62,255,252, 23, 63, 41,186,242, 63, 9,150,112, 63, 38,102,109, 63, 0, 0, 0, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 35, 17,235, 63, 9,150,112, 63, 38,102,109, 63, 0, 0, 0,
- 63, 41,186,242, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 41,186,242,
- 63, 9,150,112, 63, 38,102,113, 63, 19, 98,219, 63, 35, 17,235, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,163,245, 63, 19, 29,253, 63, 35, 17,235, 63, 9,150,112, 63, 38,102,113, 63, 19, 98,219,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,113, 63, 19, 98,219, 63, 41,186,242,
- 63, 9,150,112, 63, 45, 40,237, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 41,235, 38, 63, 28,140,141, 63, 38,102,117, 63, 37,200, 45, 63, 34,225,192, 63, 28,140,142, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 34,225,192, 63, 28,140,142, 63, 38,102,113, 63, 19, 98,219, 63, 41,235, 38,
- 63, 28,140,141, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 45, 40,237, 63, 19, 29,252,
- 63, 41,235, 38, 63, 28,140,141, 63, 38,102,113, 63, 19, 98,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 38,102,113, 63, 19, 98,219, 63, 34,225,192, 63, 28,140,142, 63, 31,163,245, 63, 19, 29,253, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 35, 17,235, 63, 9,150,112, 63, 31,163,245, 63, 19, 29,253,
- 63, 28,148,223, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,148,223,
- 63, 9,152, 94, 63, 32, 0, 2, 62,255,252, 24, 63, 35, 17,235, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,109, 63, 0, 0, 0, 63, 35, 17,235, 63, 9,150,112, 63, 32, 0, 2, 62,255,252, 24,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 32, 0, 2, 62,255,252, 24, 63, 28,148,223,
- 63, 9,152, 94, 63, 25,153,155, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,107,129,188, 62,128, 45, 66, 63, 99, 71,235, 62,120, 76,222, 63,106, 37, 94, 62, 83, 97, 84, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,106, 37, 94, 62, 83, 97, 84, 63,115, 51, 65, 62, 97,151,248, 63,107,129,188,
- 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62,135, 83,151,
- 63,107,129,188, 62,128, 45, 66, 63,115, 51, 65, 62, 97,151,248, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,115, 51, 65, 62, 97,151,248, 63,106, 37, 94, 62, 83, 97, 84, 63,115, 51, 65, 62, 52,111, 90, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,107,129,188, 62,128, 45, 66, 63,115, 51, 65, 62,135, 83,151,
- 63,108,123,142, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108,123,142,
- 62,151,144,169, 63,101, 50,231, 62,146,201, 17, 63,107,129,188, 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 99, 71,235, 62,120, 76,222, 63,107,129,188, 62,128, 45, 66, 63,101, 50,231, 62,146,201, 17,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,101, 50,231, 62,146,201, 17, 63,108,123,142,
- 62,151,144,169, 63,102,187,106, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 96, 56, 71, 62,166,190, 99, 63, 89,153,149, 62,165,199,201, 63, 93,238, 22, 62,144,101,243, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 93,238, 22, 62,144,101,243, 63,101, 50,231, 62,146,201, 17, 63, 96, 56, 71,
- 62,166,190, 99, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,102,187,106, 62,169,150, 54,
- 63, 96, 56, 71, 62,166,190, 99, 63,101, 50,231, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,101, 50,231, 62,146,201, 17, 63, 93,238, 22, 62,144,101,243, 63, 99, 71,235, 62,120, 76,222, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,109, 21,249, 62,174, 54, 65, 63,102,187,106, 62,169,150, 54,
- 63,108,123,142, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,108,123,142,
- 62,151,144,169, 63,115, 51, 65, 62,157,231, 93, 63,109, 21,249, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62,180,111,160, 63,109, 21,249, 62,174, 54, 65, 63,115, 51, 65, 62,157,231, 93,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62,157,231, 93, 63,108,123,142,
- 62,151,144,169, 63,115, 51, 65, 62,135, 83,151, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,149, 62,115,162, 79, 63, 99, 71,235, 62,120, 76,222, 63, 93,238, 22, 62,144,101,243, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 93,238, 22, 62,144,101,243, 63, 85, 69, 21, 62,144,102, 3, 63, 89,153,149,
- 62,115,162, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,235, 68, 62,120, 77, 37,
- 63, 89,153,149, 62,115,162, 79, 63, 85, 69, 21, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 85, 69, 21, 62,144,102, 3, 63, 93,238, 22, 62,144,101,243, 63, 89,153,149, 62,165,199,201, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,149, 62,115,162, 79, 63, 79,235, 68, 62,120, 77, 37,
- 63, 83,186, 24, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 83,186, 24,
- 62, 70,176,245, 63, 95,121, 22, 62, 70,176,204, 63, 89,153,149, 62,115,162, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 99, 71,235, 62,120, 76,222, 63, 89,153,149, 62,115,162, 79, 63, 95,121, 22, 62, 70,176,204,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 95,121, 22, 62, 70,176,204, 63, 83,186, 24,
- 62, 70,176,245, 63, 89,153,152, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,103,119, 61, 62, 30,253,179, 63,115, 51, 65, 62, 52,111, 90, 63,106, 37, 94, 62, 83, 97, 84, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,106, 37, 94, 62, 83, 97, 84, 63, 95,121, 22, 62, 70,176,204, 63,103,119, 61,
- 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,152, 62, 23, 31,198,
- 63,103,119, 61, 62, 30,253,179, 63, 95,121, 22, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 95,121, 22, 62, 70,176,204, 63,106, 37, 94, 62, 83, 97, 84, 63, 99, 71,235, 62,120, 76,222, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 75,187,248, 62, 30,253,241, 63, 89,153,152, 62, 23, 31,198,
- 63, 83,186, 24, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 83,186, 24,
- 62, 70,176,245, 63, 73, 13,214, 62, 83, 97,181, 63, 75,187,248, 62, 30,253,241, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 52,111,202, 63, 75,187,248, 62, 30,253,241, 63, 73, 13,214, 62, 83, 97,181,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 73, 13,214, 62, 83, 97,181, 63, 83,186, 24,
- 62, 70,176,245, 63, 79,235, 68, 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 89,153,152, 61,147, 41,111, 63, 64, 0, 0, 61,180,111,195, 63, 64, 0, 0, 61, 52, 65,111, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 61, 52, 65,111, 63,117, 49, 38, 61, 52, 64,225, 63, 89,153,152,
- 61,147, 41,111, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 61,180,111, 83,
- 63, 89,153,152, 61,147, 41,111, 63,117, 49, 38, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,117, 49, 38, 61, 52, 64,225, 63, 64, 0, 0, 61, 52, 65,111, 63,121,222,208,178,239, 9,102, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,152, 61,147, 41,111, 63,115, 51, 65, 61,180,111, 83,
- 63, 99, 51,172, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99, 51,172,
- 61,231, 46, 48, 63, 79,255,135, 61,231, 46,120, 63, 89,153,152, 61,147, 41,111, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 61,180,111,195, 63, 89,153,152, 61,147, 41,111, 63, 79,255,135, 61,231, 46,120,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,255,135, 61,231, 46,120, 63, 99, 51,172,
- 61,231, 46, 48, 63, 89,153,152, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 75,187,248, 62, 30,253,241, 63, 64, 0, 0, 62, 52,111,202, 63, 64, 0, 0, 62, 7, 71, 24, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 7, 71, 24, 63, 79,255,135, 61,231, 46,120, 63, 75,187,248,
- 62, 30,253,241, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,152, 62, 23, 31,198,
- 63, 75,187,248, 62, 30,253,241, 63, 79,255,135, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 79,255,135, 61,231, 46,120, 63, 64, 0, 0, 62, 7, 71, 24, 63, 64, 0, 0, 61,180,111,195, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,103,119, 61, 62, 30,253,179, 63, 89,153,152, 62, 23, 31,198,
- 63, 99, 51,172, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 99, 51,172,
- 61,231, 46, 48, 63,115, 51, 66, 62, 7, 70,199, 63,103,119, 61, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62, 52,111, 90, 63,103,119, 61, 62, 30,253,179, 63,115, 51, 66, 62, 7, 70,199,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 66, 62, 7, 70,199, 63, 99, 51,172,
- 61,231, 46, 48, 63,115, 51, 65, 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 71,177,122, 62,128, 45,120, 63, 64, 0, 0, 62,135, 83,218, 63, 64, 0, 0, 62, 97,152,115, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 97,152,115, 63, 73, 13,214, 62, 83, 97,181, 63, 71,177,122,
- 62,128, 45,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 79,235, 68, 62,120, 77, 37,
- 63, 71,177,122, 62,128, 45,120, 63, 73, 13,214, 62, 83, 97,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 73, 13,214, 62, 83, 97,181, 63, 64, 0, 0, 62, 97,152,115, 63, 64, 0, 0, 62, 52,111,202, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 71,177,122, 62,128, 45,120, 63, 79,235, 68, 62,120, 77, 37,
- 63, 78, 0, 72, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 78, 0, 72,
- 62,146,201, 52, 63, 70,183,169, 62,151,144,219, 63, 71,177,122, 62,128, 45,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,135, 83,218, 63, 71,177,122, 62,128, 45,120, 63, 70,183,169, 62,151,144,219,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 70,183,169, 62,151,144,219, 63, 78, 0, 72,
- 62,146,201, 52, 63, 76,119,198, 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 70, 29, 61, 62,174, 54,114, 63, 64, 0, 0, 62,180,111,211, 63, 64, 0, 0, 62,157,231,162, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,157,231,162, 63, 70,183,169, 62,151,144,219, 63, 70, 29, 61,
- 62,174, 54,114, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 76,119,198, 62,169,150, 90,
- 63, 70, 29, 61, 62,174, 54,114, 63, 70,183,169, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 70,183,169, 62,151,144,219, 63, 64, 0, 0, 62,157,231,162, 63, 64, 0, 0, 62,135, 83,218, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 82,250,230, 62,166,190,117, 63, 76,119,198, 62,169,150, 90,
- 63, 78, 0, 72, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 78, 0, 72,
- 62,146,201, 52, 63, 85, 69, 21, 62,144,102, 3, 63, 82,250,230, 62,166,190,117, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 89,153,149, 62,165,199,201, 63, 82,250,230, 62,166,190,117, 63, 85, 69, 21, 62,144,102, 3,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 85, 69, 21, 62,144,102, 3, 63, 78, 0, 72,
- 62,146,201, 52, 63, 79,235, 68, 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,245,167,179, 62,128, 45, 72, 61,179,217, 94, 62,120, 76,222, 61,234,196,202, 62, 83, 97,100, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,234,196,202, 62, 83, 97,100, 62, 25,153,212, 62, 97,152, 2, 61,245,167,179,
- 62,128, 45, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62,135, 83,156,
- 61,245,167,179, 62,128, 45, 72, 62, 25,153,212, 62, 97,152, 2, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 25,153,212, 62, 97,152, 2, 61,234,196,202, 62, 83, 97,100, 62, 25,153,214, 62, 52,111,106, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,245,167,179, 62,128, 45, 72, 62, 25,153,214, 62,135, 83,156,
- 61,253,118, 62, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,253,118, 62,
- 62,151,144,174, 61,195, 49, 53, 62,146,201, 17, 61,245,167,179, 62,128, 45, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,179,217, 94, 62,120, 76,222, 61,245,167,179, 62,128, 45, 72, 61,195, 49, 53, 62,146,201, 17,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,195, 49, 53, 62,146,201, 17, 61,253,118, 62,
- 62,151,144,174, 61,207,117, 70, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,155, 92, 79, 62,166,190, 91, 61, 76,205,194, 62,165,199,186, 61,137, 10,212, 62,144,101,238, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,137, 10,212, 62,144,101,238, 61,195, 49, 53, 62,146,201, 17, 61,155, 92, 79,
- 62,166,190, 91, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,207,117, 70, 62,169,150, 54,
- 61,155, 92, 79, 62,166,190, 91, 61,195, 49, 53, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,195, 49, 53, 62,146,201, 17, 61,137, 10,212, 62,144,101,238, 61,179,217, 94, 62,120, 76,222, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 1, 36,204, 62,174, 54, 70, 61,207,117, 70, 62,169,150, 54,
- 61,253,118, 62, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,253,118, 62,
- 62,151,144,174, 62, 25,153,213, 62,157,231,100, 62, 1, 36,204, 62,174, 54, 70, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62,180,111,165, 62, 1, 36,204, 62,174, 54, 70, 62, 25,153,213, 62,157,231,100,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,213, 62,157,231,100, 61,253,118, 62,
- 62,151,144,174, 62, 25,153,214, 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61, 76,205,188, 62,115,162, 53, 61,179,217, 94, 62,120, 76,222, 61,137, 10,212, 62,144,101,238, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,137, 10,212, 62,144,101,238, 61, 7,133,207, 62,144,101,236, 61, 76,205,188,
- 62,115,162, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60, 71,162,255, 62,120, 76,216,
- 61, 76,205,188, 62,115,162, 53, 61, 7,133,207, 62,144,101,236, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61, 7,133,207, 62,144,101,236, 61,137, 10,212, 62,144,101,238, 61, 76,205,194, 62,165,199,186, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205,188, 62,115,162, 53, 60, 71,162,255, 62,120, 76,216,
- 60,221,171,190, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,221,171,190,
- 62, 70,176,194, 61,149, 98,194, 62, 70,176,194, 61, 76,205,188, 62,115,162, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61,179,217, 94, 62,120, 76,222, 61, 76,205,188, 62,115,162, 53, 61,149, 98,194, 62, 70,176,194,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,149, 98,194, 62, 70,176,194, 60,221,171,190,
- 62, 70,176,194, 61, 76,205,193, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 61,213, 83,198, 62, 30,253,179, 62, 25,153,214, 62, 52,111,106, 61,234,196,202, 62, 83, 97,100, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,234,196,202, 62, 83, 97,100, 61,149, 98,194, 62, 70,176,194, 61,213, 83,198,
- 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205,193, 62, 23, 31,168,
- 61,213, 83,198, 62, 30,253,179, 61,149, 98,194, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 61,149, 98,194, 62, 70,176,194, 61,234,196,202, 62, 83, 97,100, 61,179,217, 94, 62,120, 76,222, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,126,239, 59, 62, 30,253,174, 63,131,105,154, 62, 23, 31,168,
- 63,131,118,175, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,131,118,175,
- 62, 70,176,194, 63,124, 65, 30, 62, 83, 97, 90, 63,126,239, 59, 62, 30,253,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62, 52,111, 90, 63,126,239, 59, 62, 30,253,174, 63,124, 65, 30, 62, 83, 97, 90,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,124, 65, 30, 62, 83, 97, 90, 63,131,118,175,
- 62, 70,176,194, 63,129,143, 70, 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,131,105,156, 61,147, 41,101, 63,115, 51, 65, 61,180,111, 83, 63,117, 49, 38, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,117, 49, 38, 61, 52, 64,225, 63,135,148,232, 60,125,158,144, 63,131,105,156,
- 61,147, 41,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,215, 61,180,111,104,
- 61,128,245,122, 61,147, 41,101, 62, 25,153,224, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,135,148,232, 60,125,158,144, 63,117, 49, 38, 61, 52, 64,225, 63,121,222,208,178,239, 9,102, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,128,245,122, 61,147, 41,101, 62, 25,153,215, 61,180,111,104,
- 61,179, 55, 89, 61,231, 46, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,179, 55, 89,
- 61,231, 46, 38, 60,208,147, 96, 61,231, 46, 48, 61,128,245,122, 61,147, 41,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 61,180,111, 83, 63,131,105,156, 61,147, 41,101, 63,129,153,102, 61,231, 46, 48,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 60,208,147, 96, 61,231, 46, 48, 61,179, 55, 89,
- 61,231, 46, 38, 61, 76,205,193, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,126,239, 59, 62, 30,253,174, 63,115, 51, 65, 62, 52,111, 90, 63,115, 51, 66, 62, 7, 70,199, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 66, 62, 7, 70,199, 63,129,153,102, 61,231, 46, 48, 63,126,239, 59,
- 62, 30,253,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,131,105,154, 62, 23, 31,168,
- 63,126,239, 59, 62, 30,253,174, 63,129,153,102, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,129,153,102, 61,231, 46, 48, 63,115, 51, 66, 62, 7, 70,199, 63,115, 51, 65, 61,180,111, 83, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,213, 83,198, 62, 30,253,179, 61, 76,205,193, 62, 23, 31,168,
- 61,179, 55, 89, 61,231, 46, 38, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61,179, 55, 89,
- 61,231, 46, 38, 62, 25,153,217, 62, 7, 70,204, 61,213, 83,198, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62, 52,111,106, 61,213, 83,198, 62, 30,253,179, 62, 25,153,217, 62, 7, 70,204,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,217, 62, 7, 70,204, 61,179, 55, 89,
- 61,231, 46, 38, 62, 25,153,215, 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,122,228,192, 62,128, 45, 66, 63,115, 51, 65, 62,135, 83,151, 63,115, 51, 65, 62, 97,151,248, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62, 97,151,248, 63,124, 65, 30, 62, 83, 97, 90, 63,122,228,192,
- 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,129,143, 70, 62,120, 76,216,
- 63,122,228,192, 62,128, 45, 66, 63,124, 65, 30, 62, 83, 97, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,124, 65, 30, 62, 83, 97, 90, 63,115, 51, 65, 62, 97,151,248, 63,115, 51, 65, 62, 52,111, 90, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,122,228,192, 62,128, 45, 66, 63,129,143, 70, 62,120, 76,216,
- 63,128,153,201, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,128,153,201,
- 62,146,201, 14, 63,121,234,239, 62,151,144,169, 63,122,228,192, 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62,135, 83,151, 63,122,228,192, 62,128, 45, 66, 63,121,234,239, 62,151,144,169,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,121,234,239, 62,151,144,169, 63,128,153,201,
- 62,146,201, 14, 63,127,171, 15, 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63,121, 80,133, 62,174, 54, 65, 63,115, 51, 65, 62,180,111,160, 63,115, 51, 65, 62,157,231, 93, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,115, 51, 65, 62,157,231, 93, 63,121,234,239, 62,151,144,169, 63,121, 80,133,
- 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,127,171, 15, 62,169,150, 52,
- 63,121, 80,133, 62,174, 54, 65, 63,121,234,239, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63,121,234,239, 62,151,144,169, 63,115, 51, 65, 62,157,231, 93, 63,115, 51, 65, 62,135, 83,151, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63,131, 23, 23, 62,166,190, 89, 63,127,171, 15, 62,169,150, 52,
- 63,128,153,201, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 59,153,200,136,
- 62,146,201, 14, 61, 7,133,207, 62,144,101,236, 60,197,197,195, 62,166,190, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 61, 76,205,194, 62,165,199,186, 60,197,197,195, 62,166,190, 89, 61, 7,133,207, 62,144,101,236,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 61, 7,133,207, 62,144,101,236, 59,153,200,136,
- 62,146,201, 14, 60, 71,162,255, 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,163,208, 32, 62,128, 45, 79, 62,147, 92,147, 62,120, 76,252, 62,161, 23,102, 62, 83, 97,115, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,161, 23,102, 62, 83, 97,115, 62,179, 51, 22, 62, 97,152, 2, 62,163,208, 32,
- 62,128, 45, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62,135, 83,156,
- 62,163,208, 32, 62,128, 45, 79, 62,179, 51, 22, 62, 97,152, 2, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,179, 51, 22, 62, 97,152, 2, 62,161, 23,102, 62, 83, 97,115, 62,179, 51, 21, 62, 52,111,101, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,163,208, 32, 62,128, 45, 79, 62,179, 51, 21, 62,135, 83,156,
- 62,165,195,194, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,165,195,194,
- 62,151,144,181, 62,151, 50,134, 62,146,201, 29, 62,163,208, 32, 62,128, 45, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,147, 92,147, 62,120, 76,252, 62,163,208, 32, 62,128, 45, 79, 62,151, 50,134, 62,146,201, 29,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,151, 50,134, 62,146,201, 29, 62,165,195,194,
- 62,151,144,181, 62,154, 67,137, 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,141, 61, 82, 62,166,190,112, 62,128, 0, 0, 62,165,199,206, 62,136,168,247, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,136,168,247, 62,144,102, 3, 62,151, 50,134, 62,146,201, 29, 62,141, 61, 82,
- 62,166,190,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,154, 67,137, 62,169,150, 70,
- 62,141, 61, 82, 62,166,190,112, 62,151, 50,134, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,151, 50,134, 62,146,201, 29, 62,136,168,247, 62,144,102, 3, 62,147, 92,147, 62,120, 76,252, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,166,248,150, 62,174, 54, 78, 62,154, 67,137, 62,169,150, 70,
- 62,165,195,194, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,165,195,194,
- 62,151,144,181, 62,179, 51, 21, 62,157,231, 98, 62,166,248,150, 62,174, 54, 78, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62,180,111,165, 62,166,248,150, 62,174, 54, 78, 62,179, 51, 21, 62,157,231, 98,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62,157,231, 98, 62,165,195,194,
- 62,151,144,181, 62,179, 51, 21, 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,128, 0, 0, 62,115,162, 89, 62,147, 92,147, 62,120, 76,252, 62,136,168,247, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,136,168,247, 62,144,102, 3, 62,110,174, 18, 62,144,102, 3, 62,128, 0, 0,
- 62,115,162, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 89, 70,217, 62,120, 76,252,
- 62,128, 0, 0, 62,115,162, 89, 62,110,174, 18, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,110,174, 18, 62,144,102, 3, 62,136,168,247, 62,144,102, 3, 62,128, 0, 0, 62,165,199,206, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62,115,162, 89, 62, 89, 70,217, 62,120, 76,252,
- 62,104,130, 30, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,104,130, 30,
- 62, 70,176,230, 62,139,190,241, 62, 70,176,230, 62,128, 0, 0, 62,115,162, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,147, 92,147, 62,120, 76,252, 62,128, 0, 0, 62,115,162, 89, 62,139,190,241, 62, 70,176,230,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,139,190,241, 62, 70,176,230, 62,104,130, 30,
- 62, 70,176,230, 62,128, 0, 0, 62, 23, 31,208, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,155,187, 41, 62, 30,253,205, 62,179, 51, 21, 62, 52,111,101, 62,161, 23,102, 62, 83, 97,115, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,161, 23,102, 62, 83, 97,115, 62,139,190,241, 62, 70,176,230, 62,155,187, 41,
- 62, 30,253,205, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62, 23, 31,208,
- 62,155,187, 41, 62, 30,253,205, 62,139,190,241, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,139,190,241, 62, 70,176,230, 62,161, 23,102, 62, 83, 97,115, 62,147, 92,147, 62,120, 76,252, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 72,137,174, 62, 30,253,205, 62,128, 0, 0, 62, 23, 31,208,
- 62,104,130, 30, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,104,130, 30,
- 62, 70,176,230, 62, 61,209, 51, 62, 83, 97,115, 62, 72,137,174, 62, 30,253,205, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62, 52,111,106, 62, 72,137,174, 62, 30,253,205, 62, 61,209, 51, 62, 83, 97,115,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 61,209, 51, 62, 83, 97,115, 62,104,130, 30,
- 62, 70,176,230, 62, 89, 70,217, 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,127,255,255, 61,147, 41,141, 62, 25,153,215, 61,180,111,104, 62, 25,153,224, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,224, 61, 52, 64,225, 62,179, 51, 15, 61, 52, 64,225, 62,127,255,255,
- 61,147, 41,141, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 20, 61,180,111,104,
- 62,127,255,255, 61,147, 41,141, 62,179, 51, 15, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,179, 51, 15, 61, 52, 64,225, 62, 25,153,224, 61, 52, 64,225, 62,161,175,144,178,239, 9,102, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,127,255,255, 61,147, 41,141, 62,179, 51, 20, 61,180,111,104,
- 62,147, 52, 12, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147, 52, 12,
- 61,231, 46,109, 62, 89,151,231, 61,231, 46,109, 62,127,255,255, 61,147, 41,141, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,215, 61,180,111,104, 62,127,255,255, 61,147, 41,141, 62, 89,151,231, 61,231, 46,109,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 89,151,231, 61,231, 46,109, 62,147, 52, 12,
- 61,231, 46,109, 62,128, 0, 0, 62, 23, 31,208, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 72,137,174, 62, 30,253,205, 62, 25,153,214, 62, 52,111,106, 62, 25,153,217, 62, 7, 70,204, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,217, 62, 7, 70,204, 62, 89,151,231, 61,231, 46,109, 62, 72,137,174,
- 62, 30,253,205, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62, 23, 31,208,
- 62, 72,137,174, 62, 30,253,205, 62, 89,151,231, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 89,151,231, 61,231, 46,109, 62, 25,153,217, 62, 7, 70,204, 62, 25,153,215, 61,180,111,104, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,155,187, 41, 62, 30,253,205, 62,128, 0, 0, 62, 23, 31,208,
- 62,147, 52, 12, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,147, 52, 12,
- 61,231, 46,109, 62,179, 51, 19, 62, 7, 70,204, 62,155,187, 41, 62, 30,253,205, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62, 52,111,101, 62,155,187, 41, 62, 30,253,205, 62,179, 51, 19, 62, 7, 70,204,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 19, 62, 7, 70,204, 62,147, 52, 12,
- 61,231, 46,109, 62,179, 51, 20, 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 56, 95,192, 62,128, 45, 79, 62, 25,153,214, 62,135, 83,156, 62, 25,153,212, 62, 97,152, 2, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,212, 62, 97,152, 2, 62, 61,209, 51, 62, 83, 97,115, 62, 56, 95,192,
- 62,128, 45, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 89, 70,217, 62,120, 76,252,
- 62, 56, 95,192, 62,128, 45, 79, 62, 61,209, 51, 62, 83, 97,115, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 61,209, 51, 62, 83, 97,115, 62, 25,153,212, 62, 97,152, 2, 62, 25,153,214, 62, 52,111,106, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 56, 95,192, 62,128, 45, 79, 62, 89, 70,217, 62,120, 76,252,
- 62, 81,154,245, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 81,154,245,
- 62,146,201, 29, 62, 52,120,125, 62,151,144,181, 62, 56, 95,192, 62,128, 45, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,214, 62,135, 83,156, 62, 56, 95,192, 62,128, 45, 79, 62, 52,120,125, 62,151,144,181,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 52,120,125, 62,151,144,181, 62, 81,154,245,
- 62,146,201, 29, 62, 75,120,239, 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62, 50, 14,213, 62,174, 54, 78, 62, 25,153,214, 62,180,111,165, 62, 25,153,213, 62,157,231,100, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 25,153,213, 62,157,231,100, 62, 52,120,125, 62,151,144,181, 62, 50, 14,213,
- 62,174, 54, 78, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 75,120,239, 62,169,150, 70,
- 62, 50, 14,213, 62,174, 54, 78, 62, 52,120,125, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62, 52,120,125, 62,151,144,181, 62, 25,153,213, 62,157,231,100, 62, 25,153,214, 62,135, 83,156, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,101,133, 91, 62,166,190,112, 62, 75,120,239, 62,169,150, 70,
- 62, 81,154,245, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62, 81,154,245,
- 62,146,201, 29, 62,110,174, 18, 62,144,102, 3, 62,101,133, 91, 62,166,190,112, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,128, 0, 0, 62,165,199,206, 62,101,133, 91, 62,166,190,112, 62,110,174, 18, 62,144,102, 3,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,110,174, 18, 62,144,102, 3, 62, 81,154,245,
- 62,146,201, 29, 62, 89, 70,217, 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 5, 27, 64, 62,128, 45, 66, 62,249,194,232, 62,120, 76,216, 63, 3,190,226, 62, 83, 97, 90, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3,190,226, 62, 83, 97, 90, 63, 12,204,191, 62, 97,151,248, 63, 5, 27, 64,
- 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62,135, 83,149,
- 63, 5, 27, 64, 62,128, 45, 66, 63, 12,204,191, 62, 97,151,248, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 12,204,191, 62, 97,151,248, 63, 3,190,226, 62, 83, 97, 90, 63, 12,204,191, 62, 52,111, 90, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 5, 27, 64, 62,128, 45, 66, 63, 12,204,191, 62,135, 83,149,
- 63, 6, 21, 17, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6, 21, 17,
- 62,151,144,169, 62,253,152,222, 62,146,201, 14, 63, 5, 27, 64, 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,249,194,232, 62,120, 76,216, 63, 5, 27, 64, 62,128, 45, 66, 62,253,152,222, 62,146,201, 14,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,253,152,222, 62,146,201, 14, 63, 6, 21, 17,
- 62,151,144,169, 63, 0, 84,241, 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,243,163,164, 62,166,190, 89, 62,230,102, 72, 62,165,199,183, 62,239, 15, 70, 62,144,101,233, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,239, 15, 70, 62,144,101,233, 62,253,152,222, 62,146,201, 14, 62,243,163,164,
- 62,166,190, 89, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 0, 84,241, 62,169,150, 52,
- 62,243,163,164, 62,166,190, 89, 62,253,152,222, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,253,152,222, 62,146,201, 14, 62,239, 15, 70, 62,144,101,233, 62,249,194,232, 62,120, 76,216, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6,175,123, 62,174, 54, 65, 63, 0, 84,241, 62,169,150, 52,
- 63, 6, 21, 17, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 6, 21, 17,
- 62,151,144,169, 63, 12,204,191, 62,157,231, 90, 63, 6,175,123, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62,180,111,160, 63, 6,175,123, 62,174, 54, 65, 63, 12,204,191, 62,157,231, 90,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62,157,231, 90, 63, 6, 21, 17,
- 62,151,144,169, 63, 12,204,191, 62,135, 83,149, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102, 72, 62,115,162, 53, 62,249,194,232, 62,120, 76,216, 62,239, 15, 70, 62,144,101,233, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,239, 15, 70, 62,144,101,233, 62,221,189, 75, 62,144,101,238, 62,230,102, 72,
- 62,115,162, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,211, 9,168, 62,120, 76,222,
- 62,230,102, 72, 62,115,162, 53, 62,221,189, 75, 62,144,101,238, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,221,189, 75, 62,144,101,238, 62,239, 15, 70, 62,144,101,233, 62,230,102, 72, 62,165,199,183, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 72, 62,115,162, 53, 62,211, 9,168, 62,120, 76,222,
- 62,218,167, 80, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,218,167, 80,
- 62, 70,176,194, 62,242, 37, 68, 62, 70,176,194, 62,230,102, 72, 62,115,162, 53, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,249,194,232, 62,120, 76,216, 62,230,102, 72, 62,115,162, 53, 62,242, 37, 68, 62, 70,176,194,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,242, 37, 68, 62, 70,176,194, 62,218,167, 80,
- 62, 70,176,194, 62,230,102, 72, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 1, 16,197, 62, 30,253,174, 63, 12,204,191, 62, 52,111, 90, 63, 3,190,226, 62, 83, 97, 90, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 3,190,226, 62, 83, 97, 90, 62,242, 37, 68, 62, 70,176,194, 63, 1, 16,197,
- 62, 30,253,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 72, 62, 23, 31,168,
- 63, 1, 16,197, 62, 30,253,174, 62,242, 37, 68, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,242, 37, 68, 62, 70,176,194, 63, 3,190,226, 62, 83, 97, 90, 62,249,194,232, 62,120, 76,216, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,202,171, 14, 62, 30,253,179, 62,230,102, 72, 62, 23, 31,168,
- 62,218,167, 80, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,218,167, 80,
- 62, 70,176,194, 62,197, 78,205, 62, 83, 97, 95, 62,202,171, 14, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62, 52,111,101, 62,202,171, 14, 62, 30,253,179, 62,197, 78,205, 62, 83, 97, 95,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,197, 78,205, 62, 83, 97, 95, 62,218,167, 80,
- 62, 70,176,194, 62,211, 9,168, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,230,102, 63, 61,147, 41,101, 62,179, 51, 20, 61,180,111,104, 62,179, 51, 15, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 15, 61, 52, 64,225, 63, 12,204,189, 61, 52, 64,225, 62,230,102, 63,
- 61,147, 41,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 61,180,111, 83,
- 62,230,102, 63, 61,147, 41,101, 63, 12,204,189, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 12,204,189, 61, 52, 64,225, 62,179, 51, 15, 61, 52, 64,225, 62,161,175,144,178,239, 9,102, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 63, 61,147, 41,101, 63, 12,204,191, 61,180,111, 83,
- 62,249,154,104, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,249,154,104,
- 61,231, 46, 48, 62,211, 50, 42, 61,231, 46, 48, 62,230,102, 63, 61,147, 41,101, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 20, 61,180,111,104, 62,230,102, 63, 61,147, 41,101, 62,211, 50, 42, 61,231, 46, 48,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,211, 50, 42, 61,231, 46, 48, 62,249,154,104,
- 61,231, 46, 48, 62,230,102, 72, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,202,171, 14, 62, 30,253,179, 62,179, 51, 21, 62, 52,111,101, 62,179, 51, 19, 62, 7, 70,204, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 19, 62, 7, 70,204, 62,211, 50, 42, 61,231, 46, 48, 62,202,171, 14,
- 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 72, 62, 23, 31,168,
- 62,202,171, 14, 62, 30,253,179, 62,211, 50, 42, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,211, 50, 42, 61,231, 46, 48, 62,179, 51, 19, 62, 7, 70,204, 62,179, 51, 20, 61,180,111,104, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 1, 16,197, 62, 30,253,174, 62,230,102, 72, 62, 23, 31,168,
- 62,249,154,104, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,249,154,104,
- 61,231, 46, 48, 63, 12,204,191, 62, 7, 70,199, 63, 1, 16,197, 62, 30,253,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 52,111, 90, 63, 1, 16,197, 62, 30,253,174, 63, 12,204,191, 62, 7, 70,199,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 7, 70,199, 62,249,154,104,
- 61,231, 46, 48, 63, 12,204,191, 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,194,150, 19, 62,128, 45, 72, 62,179, 51, 21, 62,135, 83,156, 62,179, 51, 22, 62, 97,152, 2, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 22, 62, 97,152, 2, 62,197, 78,205, 62, 83, 97, 95, 62,194,150, 19,
- 62,128, 45, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,211, 9,168, 62,120, 76,222,
- 62,194,150, 19, 62,128, 45, 72, 62,197, 78,205, 62, 83, 97, 95, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,197, 78,205, 62, 83, 97, 95, 62,179, 51, 22, 62, 97,152, 2, 62,179, 51, 21, 62, 52,111,101, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,194,150, 19, 62,128, 45, 72, 62,211, 9,168, 62,120, 76,222,
- 62,207, 51,179, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,207, 51,179,
- 62,146,201, 17, 62,192,162,113, 62,151,144,174, 62,194,150, 19, 62,128, 45, 72, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62,135, 83,156, 62,194,150, 19, 62,128, 45, 72, 62,192,162,113, 62,151,144,174,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,192,162,113, 62,151,144,174, 62,207, 51,179,
- 62,146,201, 17, 62,204, 34,175, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 62,191,109,154, 62,174, 54, 68, 62,179, 51, 21, 62,180,111,165, 62,179, 51, 21, 62,157,231, 98, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,179, 51, 21, 62,157,231, 98, 62,192,162,113, 62,151,144,174, 62,191,109,154,
- 62,174, 54, 68, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,204, 34,175, 62,169,150, 54,
- 62,191,109,154, 62,174, 54, 68, 62,192,162,113, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 62,192,162,113, 62,151,144,174, 62,179, 51, 21, 62,157,231, 98, 62,179, 51, 21, 62,135, 83,156, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,217, 40,237, 62,166,190, 91, 62,204, 34,175, 62,169,150, 54,
- 62,207, 51,179, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,207, 51,179,
- 62,146,201, 17, 62,221,189, 75, 62,144,101,238, 62,217, 40,237, 62,166,190, 91, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 62,230,102, 72, 62,165,199,183, 62,217, 40,237, 62,166,190, 91, 62,221,189, 75, 62,144,101,238,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 62,221,189, 75, 62,144,101,238, 62,207, 51,179,
- 62,146,201, 17, 62,211, 9,168, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 56, 78,134, 62,128, 45,117, 63, 48, 20,188, 62,120, 77, 37, 63, 54,242, 42, 62, 83, 97,181, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,242, 42, 62, 83, 97,181, 63, 64, 0, 0, 62, 97,152,115, 63, 56, 78,134,
- 62,128, 45,117, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,135, 83,218,
- 63, 56, 78,134, 62,128, 45,117, 63, 64, 0, 0, 62, 97,152,115, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 64, 0, 0, 62, 97,152,115, 63, 54,242, 42, 62, 83, 97,181, 63, 64, 0, 0, 62, 52,111,202, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 56, 78,134, 62,128, 45,117, 63, 64, 0, 0, 62,135, 83,218,
- 63, 57, 72, 87, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 72, 87,
- 62,151,144,219, 63, 49,255,184, 62,146,201, 52, 63, 56, 78,134, 62,128, 45,117, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 20,188, 62,120, 77, 37, 63, 56, 78,134, 62,128, 45,117, 63, 49,255,184, 62,146,201, 52,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 49,255,184, 62,146,201, 52, 63, 57, 72, 87,
- 62,151,144,219, 63, 51,136, 58, 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 45, 5, 26, 62,166,190,117, 63, 38,102,107, 62,165,199,201, 63, 42,186,235, 62,144,102, 5, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 42,186,235, 62,144,102, 5, 63, 49,255,184, 62,146,201, 52, 63, 45, 5, 26,
- 62,166,190,117, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 51,136, 58, 62,169,150, 90,
- 63, 45, 5, 26, 62,166,190,117, 63, 49,255,184, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 49,255,184, 62,146,201, 52, 63, 42,186,235, 62,144,102, 5, 63, 48, 20,188, 62,120, 77, 37, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57,226,196, 62,174, 54,114, 63, 51,136, 58, 62,169,150, 90,
- 63, 57, 72, 87, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 57, 72, 87,
- 62,151,144,219, 63, 64, 0, 0, 62,157,231,162, 63, 57,226,196, 62,174, 54,114, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,180,111,211, 63, 57,226,196, 62,174, 54,114, 63, 64, 0, 0, 62,157,231,162,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62,157,231,162, 63, 57, 72, 87,
- 62,151,144,219, 63, 64, 0, 0, 62,135, 83,218, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,107, 62,115,162, 79, 63, 48, 20,188, 62,120, 77, 37, 63, 42,186,235, 62,144,102, 5, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 42,186,235, 62,144,102, 5, 63, 34, 17,234, 62,144,101,243, 63, 38,102,107,
- 62,115,162, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,184, 21, 62,120, 76,222,
- 63, 38,102,107, 62,115,162, 79, 63, 34, 17,234, 62,144,101,243, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 34, 17,234, 62,144,101,243, 63, 42,186,235, 62,144,102, 5, 63, 38,102,107, 62,165,199,201, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,107, 62,115,162, 79, 63, 28,184, 21, 62,120, 76,222,
- 63, 32,134,234, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 32,134,234,
- 62, 70,176,204, 63, 44, 69,233, 62, 70,176,245, 63, 38,102,107, 62,115,162, 79, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 20,188, 62,120, 77, 37, 63, 38,102,107, 62,115,162, 79, 63, 44, 69,233, 62, 70,176,245,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 44, 69,233, 62, 70,176,245, 63, 32,134,234,
- 62, 70,176,204, 63, 38,102,104, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 52, 68, 9, 62, 30,253,241, 63, 64, 0, 0, 62, 52,111,202, 63, 54,242, 42, 62, 83, 97,181, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 54,242, 42, 62, 83, 97,181, 63, 44, 69,233, 62, 70,176,245, 63, 52, 68, 9,
- 62, 30,253,241, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,104, 62, 23, 31,198,
- 63, 52, 68, 9, 62, 30,253,241, 63, 44, 69,233, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 44, 69,233, 62, 70,176,245, 63, 54,242, 42, 62, 83, 97,181, 63, 48, 20,188, 62,120, 77, 37, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 24,136,195, 62, 30,253,179, 63, 38,102,104, 62, 23, 31,198,
- 63, 32,134,234, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 32,134,234,
- 62, 70,176,204, 63, 21,218,162, 62, 83, 97, 84, 63, 24,136,195, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 52,111, 90, 63, 24,136,195, 62, 30,253,179, 63, 21,218,162, 62, 83, 97, 84,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 21,218,162, 62, 83, 97, 84, 63, 32,134,234,
- 62, 70,176,204, 63, 28,184, 21, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 38,102,104, 61,147, 41,111, 63, 12,204,191, 61,180,111, 83, 63, 12,204,189, 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,189, 61, 52, 64,225, 63, 64, 0, 0, 61, 52, 65,111, 63, 38,102,104,
- 61,147, 41,111, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 61,180,111,195,
- 63, 38,102,104, 61,147, 41,111, 63, 64, 0, 0, 61, 52, 65,111, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 64, 0, 0, 61, 52, 65,111, 63, 12,204,189, 61, 52, 64,225, 63,121,222,208,178,239, 9,102, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,104, 61,147, 41,111, 63, 64, 0, 0, 61,180,111,195,
- 63, 48, 0,122, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 0,122,
- 61,231, 46,120, 63, 28,204, 85, 61,231, 46, 48, 63, 38,102,104, 61,147, 41,111, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 61,180,111, 83, 63, 38,102,104, 61,147, 41,111, 63, 28,204, 85, 61,231, 46, 48,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,204, 85, 61,231, 46, 48, 63, 48, 0,122,
- 61,231, 46,120, 63, 38,102,104, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 24,136,195, 62, 30,253,179, 63, 12,204,191, 62, 52,111, 90, 63, 12,204,191, 62, 7, 70,199, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 7, 70,199, 63, 28,204, 85, 61,231, 46, 48, 63, 24,136,195,
- 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,104, 62, 23, 31,198,
- 63, 24,136,195, 62, 30,253,179, 63, 28,204, 85, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 28,204, 85, 61,231, 46, 48, 63, 12,204,191, 62, 7, 70,199, 63, 12,204,191, 61,180,111, 83, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 52, 68, 9, 62, 30,253,241, 63, 38,102,104, 62, 23, 31,198,
- 63, 48, 0,122, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 48, 0,122,
- 61,231, 46,120, 63, 64, 0, 0, 62, 7, 71, 24, 63, 52, 68, 9, 62, 30,253,241, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 52,111,202, 63, 52, 68, 9, 62, 30,253,241, 63, 64, 0, 0, 62, 7, 71, 24,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 64, 0, 0, 62, 7, 71, 24, 63, 48, 0,122,
- 61,231, 46,120, 63, 64, 0, 0, 61,180,111,195, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 20,126, 68, 62,128, 45, 64, 63, 12,204,191, 62,135, 83,149, 63, 12,204,191, 62, 97,151,248, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62, 97,151,248, 63, 21,218,162, 62, 83, 97, 84, 63, 20,126, 68,
- 62,128, 45, 64, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 28,184, 21, 62,120, 76,222,
- 63, 20,126, 68, 62,128, 45, 64, 63, 21,218,162, 62, 83, 97, 84, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 21,218,162, 62, 83, 97, 84, 63, 12,204,191, 62, 97,151,248, 63, 12,204,191, 62, 52,111, 90, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 20,126, 68, 62,128, 45, 64, 63, 28,184, 21, 62,120, 76,222,
- 63, 26,205, 25, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 26,205, 25,
- 62,146,201, 14, 63, 19,132,114, 62,151,144,169, 63, 20,126, 68, 62,128, 45, 64, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62,135, 83,149, 63, 20,126, 68, 62,128, 45, 64, 63, 19,132,114, 62,151,144,169,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 19,132,114, 62,151,144,169, 63, 26,205, 25,
- 62,146,201, 14, 63, 25, 68,150, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 63, 18,234, 7, 62,174, 54, 65, 63, 12,204,191, 62,180,111,160, 63, 12,204,191, 62,157,231, 90, 63,128, 0, 0, 63,128, 0, 0,
- 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 12,204,191, 62,157,231, 90, 63, 19,132,114, 62,151,144,169, 63, 18,234, 7,
- 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 25, 68,150, 62,169,150, 54,
- 63, 18,234, 7, 62,174, 54, 65, 63, 19,132,114, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 0, 0, 0, 0, 63, 19,132,114, 62,151,144,169, 63, 12,204,191, 62,157,231, 90, 63, 12,204,191, 62,135, 83,149, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 31,199,185, 62,166,190, 96, 63, 25, 68,150, 62,169,150, 54,
- 63, 26,205, 25, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 26,205, 25,
- 62,146,201, 14, 63, 34, 17,234, 62,144,101,243, 63, 31,199,185, 62,166,190, 96, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 63, 38,102,107, 62,165,199,201, 63, 31,199,185, 62,166,190, 96, 63, 34, 17,234, 62,144,101,243,
- 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 63, 34, 17,234, 62,144,101,243, 63, 26,205, 25,
- 62,146,201, 14, 63, 28,184, 21, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 80, 0, 8,109, 96, 32, 0, 0, 0, 57, 0, 0, 20, 0,255,255,255,255,255,255,255,255,255,255,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 1, 0, 0, 96,169,118, 1, 0, 0, 0, 0, 53, 0, 0, 0, 32, 0, 0, 0,
+ 2, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 18, 0, 0, 0,
+ 0, 0, 35, 0, 14, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0, 13, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,
+ 12, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0,
+ 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 35, 0, 5, 0, 0, 0, 8, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0, 4, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,
+ 7, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0,
+ 8, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 35, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0,
+ 12, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 16, 0, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0,
+ 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 17, 0, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 35, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0,
+ 22, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 21, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 22, 0, 0, 0, 0, 0, 35, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 32,171,118, 1, 0, 0, 0, 0, 5, 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,160,172,118, 1, 0, 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, 85, 86, 84,101,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,128,173,118, 1, 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, 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, 64,175,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,
+160,172,118, 1, 0, 0, 0, 0, 52, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 2, 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 7, 0, 0, 0, 6, 0, 0, 0,
+ 3, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 2, 10, 0, 0, 0, 9, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 2,
+ 15, 0, 0, 0, 16, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 2, 18, 0, 0, 0, 8, 0, 0, 0, 5, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0, 21, 0, 0, 0, 19, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 22, 0, 0, 0,
+ 2, 0, 0, 0, 13, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65,128, 1, 0, 0,128,173,118, 1, 0, 0, 0, 0,
+ 60, 0, 0, 0, 8, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63,
+ 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63,
+ 12,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63,
+ 12,192,137, 62,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 0,229,213, 62,162,226,125, 63,
+ 18,192,137, 62,162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0,154, 23, 55, 63,162,226,125, 63, 34, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,
+152, 23, 55, 63,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,
+252,228,213, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,152, 23, 55, 63,162,226,125, 63,
+ 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 30, 5, 17, 63,162,226,125, 63,
+252,228,213, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 61, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0, 64,175,118, 1, 0, 0, 0, 0, 57, 0, 0, 0, 32, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 77, 69, 0, 0,120, 1, 0, 0,144,178,118, 1, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0,144,194,118, 1, 0, 0, 0, 0,
+144,162,118, 1, 0, 0, 0, 0, 1, 94, 44, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46,
+ 48, 48, 51, 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,
+192,232,117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,194,118, 1, 0, 0, 0, 0,160,188,118, 1, 0, 0, 0, 0,128,189,118, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,208,181,118, 1, 0, 0, 0, 0, 96,185,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 64,191,118, 1, 0, 0, 0, 0, 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,180,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,224,183,118, 1, 0, 0, 0, 0,
+ 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 32,187,118, 1, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0,
+ 80, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 32, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 2,205, 76, 63,172,197, 39, 55,214,204, 76, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 5, 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, 8, 0, 0, 0, 64,194,118, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 80,180,118, 1, 0, 0, 0, 0,
+ 5, 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,
+208,181,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,204, 1, 0, 0,208,181,118, 1, 0, 0, 0, 0, 56, 0, 0, 0, 23, 0, 0, 0,
+ 47,205,204, 62, 0, 0,128,180,200,204,204,190, 0, 0, 1,128, 0, 0, 2, 0, 0,205, 76, 63, 0, 0, 0, 0,208,204,204,190,
+ 0, 0, 1,128, 0, 0, 2, 0, 47,205,204, 62, 0, 0,128,180, 0, 0,240, 52, 0, 0, 1,128, 0, 0, 2, 0, 0,205, 76, 63,
+ 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 2, 0, 47,205,204, 62, 0, 0,128,180,221,204,204, 62, 0, 0, 1,128,
+ 0, 0, 2, 0, 0,205, 76, 63, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 2, 0, 53,205,204, 62, 0, 0,128,180,
+214,204, 76, 63, 0, 0, 1,128, 0, 0, 2, 0, 47,205,204, 62, 0, 0,128,180,206,204, 76,191, 0, 0, 1,128, 0, 0, 2, 0,
+ 0,205, 76, 63, 0, 0, 0, 0,208,204, 76,191, 0, 0, 1,128, 0, 0, 2, 0, 0, 0, 70,182, 0, 0,128, 52,214,204, 76,191,
+ 0, 0, 1,128, 0, 0, 2, 0, 55,205,204,190, 0, 0, 0, 0,212,204, 76,191, 0, 0, 1,128, 0, 0, 2, 0, 0, 0, 62,182,
+ 0, 0,128, 52,206,204, 76, 63, 0, 0, 1,128, 0, 0, 2, 0, 47,205,204,190, 0, 0, 0, 0,206,204, 76, 63, 0, 0, 1,128,
+ 0, 0, 2, 0, 4,205, 76,191, 0, 0, 0, 0,210,204, 76, 63, 0, 0, 1,128, 0, 0, 2, 0, 0, 0, 70,182, 0, 0,128, 52,
+197,204,204, 62, 0, 0, 1,128, 0, 0, 2, 0, 55,205,204,190, 0, 0, 0, 0,205,204,204, 62, 0, 0, 1,128, 0, 0, 2, 0,
+ 4,205, 76,191, 0, 0, 0, 0,213,204,204, 62, 0, 0, 1,128, 0, 0, 2, 0, 0, 0, 70,182, 0, 0,128, 52, 0, 0,144,180,
+ 0, 0, 1,128, 0, 0, 2, 0, 55,205,204,190, 0, 0, 0, 0, 0, 0, 0,179, 0, 0, 1,128, 0, 0, 2, 0, 4,205, 76,191,
+ 0, 0, 0, 0, 0, 0, 96, 52, 0, 0, 1,128, 0, 0, 2, 0, 0, 0, 70,182, 0, 0,128, 52,224,204,204,190, 0, 0, 1,128,
+ 0, 0, 2, 0, 55,205,204,190, 0, 0, 0, 0,216,204,204,190, 0, 0, 1,128, 0, 0, 2, 0, 4,205, 76,191, 0, 0, 0, 0,
+208,204,204,190, 0, 0, 1,128, 0, 0, 2, 0, 68, 65, 84, 65, 64, 1, 0, 0,224,183,118, 1, 0, 0, 0, 0, 5, 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, 96,185,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,128, 1, 0, 0, 96,185,118, 1, 0, 0, 0, 0, 53, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0,
+ 8, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 34, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 34, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 34, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 5, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0,
+ 6, 0, 0, 0, 0, 0, 34, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 34, 0, 9, 0, 0, 0, 10, 0, 0, 0, 0, 0, 34, 0,
+ 12, 0, 0, 0, 13, 0, 0, 0, 0, 0, 34, 0, 13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 16, 0, 0, 0,
+ 0, 0, 34, 0, 12, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 15, 0, 0, 0, 0, 0, 34, 0, 11, 0, 0, 0,
+ 14, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 19, 0, 0, 0, 0, 0, 34, 0, 15, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0,
+ 17, 0, 0, 0, 18, 0, 0, 0, 0, 0, 34, 0, 14, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 19, 0, 0, 0, 22, 0, 0, 0,
+ 0, 0, 34, 0, 21, 0, 0, 0, 22, 0, 0, 0, 0, 0, 34, 0, 18, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0, 20, 0, 0, 0,
+ 21, 0, 0, 0, 0, 0, 34, 0, 17, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 10, 0, 0, 0, 21, 0, 0, 0, 0, 0, 34, 0,
+ 9, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 6, 0, 0, 0, 11, 0, 0, 0, 0, 0, 34, 0, 4, 0, 0, 0, 14, 0, 0, 0,
+ 0, 0, 34, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65,
+ 64, 1, 0, 0, 32,187,118, 1, 0, 0, 0, 0, 5, 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,160,188,118, 1, 0, 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, 85, 86, 84,101,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,128,189,118, 1, 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, 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, 64,191,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 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,160,188,118, 1,
+ 0, 0, 0, 0, 52, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 2, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 11, 0, 0, 0, 14, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0,
+ 13, 0, 0, 0, 16, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 15, 0, 0, 0, 18, 0, 0, 0, 17, 0, 0, 0,
+ 0, 0, 0, 0, 18, 0, 0, 0, 19, 0, 0, 0, 22, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 21, 0, 0, 0,
+ 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,128, 1, 0, 0,128,189,118, 1, 0, 0, 0, 0, 60, 0, 0, 0,
+ 8, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,
+162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,
+162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0,152, 23, 55, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63,152, 23, 55, 63,
+162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0, 34, 5, 17, 63,162,226,125, 63, 0,229,213, 62,
+162,226,125, 63,252,228,213, 62,162,226,125, 63, 30, 5, 17, 63,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0, 18,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0, 12,192,137, 62,162,226,125, 63,144,108,246, 61,162,226,125, 63,144,108,246, 61,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0, 0, 0, 0, 0,252,228,213, 62,162,226,125, 63, 12,192,137, 62,
+162,226,125, 63, 12,192,137, 62,162,226,125, 63,252,228,213, 62,162,226,125, 63, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 1, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65,128, 0, 0, 0, 64,191,118, 1, 0, 0, 0, 0, 57, 0, 0, 0, 32, 0, 0, 0,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 77, 69, 0, 0,
+120, 1, 0, 0,144,194,118, 1, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0,128,202,118, 1, 0, 0, 0, 0,144,178,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69, 80,108, 97,110,101, 46, 48, 48, 52, 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,224,237,196, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,202,118, 1, 0, 0, 0, 0,208,201,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0,208,197,118, 1, 0, 0, 0, 0,224,199,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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,196,118, 1,
+ 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 96,198,118, 1, 0, 0, 0, 0, 1, 0, 0, 0,
+ 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 80,200,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128,179,
+ 0, 0, 64, 52, 0, 0, 0, 0, 0, 0,128, 63, 2, 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, 30, 0, 4, 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, 8, 0, 0, 0, 48,202,118, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0,128,107,116, 1, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 80,196,118, 1, 0, 0, 0, 0, 5, 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,208,197,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,208,197,118, 1, 0, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0, 0, 0,128, 63,
+255,255,127, 63, 0, 0, 0, 0, 0, 0, 0, 0,255,127, 3,255, 0, 0,128, 63, 0, 0,128,191, 0, 0, 0, 0, 0, 0, 0, 0,
+255,127, 3,255, 1, 0,128,191,253,255,127,191, 0, 0, 0, 0, 0, 0, 0, 0,255,127, 3,255,250,255,127,191, 3, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0,255,127, 3,255, 68, 65, 84, 65, 64, 1, 0, 0, 96,198,118, 1, 0, 0, 0, 0, 5, 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,224,199,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,224,199,118, 1, 0, 0, 0, 0, 53, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0,
+ 3, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 64, 1, 0, 0, 80,200,118, 1, 0, 0, 0, 0, 5, 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,208,201,118, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,208,201,118, 1, 0, 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 77, 69, 0, 0,120, 1, 0, 0,128,202,118, 1, 0, 0, 0, 0,
+ 50, 0, 0, 0, 1, 0, 0, 0,192, 66,122, 1, 0, 0, 0, 0,144,194,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,119, 0, 0, 0, 0,112,104,101,114,101, 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,112, 66,122, 1, 0, 0, 0, 0,
+112, 93,119, 1, 0, 0, 0, 0,176,193,119, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,205,118, 1, 0, 0, 0, 0,
+176, 1,119, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,240,177,120, 1, 0, 0, 0, 0, 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,204,118, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0,
+ 20, 0, 0, 0, 0, 0, 0, 0, 48, 0,119, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,
+240, 91,119, 1, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0,130, 2, 0, 0,128, 7, 0, 0,
+ 0, 5, 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,117,224,186, 64,
+ 91, 13,187, 64,160,240,186, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 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, 8, 0, 0, 0,112, 66,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128,107,116, 1, 0, 0, 0, 0,
+ 68, 65, 84, 65, 64, 1, 0, 0, 64,204,118, 1, 0, 0, 0, 0, 5, 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,192,205,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 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, 50, 0, 0,
+192,205,118, 1, 0, 0, 0, 0, 56, 0, 0, 0,130, 2, 0, 0, 28,136,141,191, 12,243,244, 62,198, 86,183,192,212,231,117, 10,
+191,130, 3,255,240,102,131,192, 30,183,119, 64,109,169,199,191, 58,166,158, 84,230,221, 3,255,119,108,239, 63,213, 85,156, 64,
+188, 58, 40,192,228, 40,207,106,137,198, 3,255, 95,135,146, 64, 63, 54, 14,191,241,194,102,192, 27,100,219,243, 45,177, 3,255,
+239, 84,141, 62, 16,220,157,192, 14, 2, 73,192, 8, 6, 39,148, 86,187, 3,255,132,239,162,192,206,165, 12,192,150, 45,240,191,
+175,144,245,207,251,214, 3,255,239, 84,141,190, 16,220,157, 64, 14, 2, 73, 64,248,249,217,107,170, 68, 3,255,132,239,162, 64,
+206,165, 12, 64,150, 45,240, 63, 81,111, 11, 48, 5, 41, 3,255,240,102,131, 64, 30,183,119,192,109,169,199, 63,198, 89, 98,171,
+ 26, 34, 3,255,119,108,239,191,213, 85,156,192,188, 58, 40, 64, 28,215, 49,149,119, 57, 3,255, 95,135,146,192, 63, 54, 14, 63,
+241,194,102, 64,229,155, 37, 12,211, 78, 3,255, 28,136,141, 63, 12,243,244,190,198, 86,183, 64, 44, 24,139,245, 65,125, 3,255,
+114, 17, 68,192,226,153, 35, 64,154, 26,137,192, 6,189,226, 55, 85,162, 3,255,155, 40,230, 62,239,199, 73, 64,176, 52,157,192,
+211, 9,237, 68,153,148, 3,255,124, 55,168,191,224,177,164, 64, 58,144, 29,192, 69,227,132,112, 46,202, 3,255, 94, 35,105,192,
+230, 88,129,191,195, 14,143,192, 93,176,233,233, 68,158, 3,255, 37, 2,173,192,137,187,123, 63, 56, 68, 1,192,206,137,127, 21,
+216,211, 3,255,234,168, 2, 64,231,158, 57,189, 65,149,175,192,162, 44, 3,255, 11,136, 3,255, 19,159,114, 64,254,226, 34, 64,
+196,133,106,192,225, 82,164, 55,228,175, 3,255,105,176,249,190, 21,148, 39,192,217,214,166,192, 87,245,194,198, 5,142, 3,255,
+227,163, 54, 64, 86,121, 78,192, 22,202,125,192, 99, 62,120,185, 79,169, 3,255,241, 40, 53,192,200, 31,134,192,229,188, 60,192,
+ 30,194, 94,164,136,191, 3,255, 96,230,181,192, 33, 24,119,191,174, 26,130, 63,186,131,231,234, 56, 22, 3,255,103, 93,163,192,
+136,128, 38, 64, 83,235,153, 63,100,144,224, 56, 74, 26, 3,255,238,219, 36,192,132,151,165, 64,165,226,109, 63,176,199, 33,113,
+ 80, 20, 3,255, 24,237,111, 63,118,174,184, 64,212, 34,154, 62,125, 20, 44,126,148, 6, 3,255,163,244,130, 64,157, 58,133, 64,
+125, 95,226,190,119, 89, 5, 91, 86,246, 3,255, 96,230,181, 64, 33, 24,119, 63,174, 26,130,191, 70,124, 25, 21,200,233, 3,255,
+103, 93,163, 64,136,128, 38,192, 83,235,153,191,156,111, 32,199,182,229, 3,255,238,219, 36, 64,132,151,165,192,165,226,109,191,
+ 80, 56,223,142,176,235, 3,255, 24,237,111,191,118,174,184,192,212, 34,154,190,131,235,212,129,108,249, 3,255,163,244,130,192,
+157, 58,133,192,125, 95,226, 62,137,166,251,164,170, 9, 3,255,227,163, 54,192, 86,121, 78, 64, 22,202,125, 64,157,193,136, 70,
+177, 86, 3,255,241, 40, 53, 64,200, 31,134, 64,229,188, 60, 64,226, 61,162, 91,120, 64, 3,255, 37, 2,173, 64,137,187,123,191,
+ 56, 68, 1, 64, 50,118,129,234, 40, 44, 3,255,124, 55,168, 63,224,177,164,192, 58,144, 29, 64,187, 28,124,143,210, 53, 3,255,
+ 19,159,114,192,254,226, 34,192,196,133,106, 64, 31,173, 92,200, 28, 80, 3,255,234,168, 2,192,231,158, 57, 61, 65,149,175, 64,
+ 94,211,253, 0,245,119, 3,255,105,176,249, 62, 21,148, 39, 64,217,214,166, 64,169, 10, 62, 57,251,113, 3,255, 94, 35,105, 64,
+230, 88,129, 63,195, 14,143, 64,163, 79, 23, 22,188, 97, 3,255,114, 17, 68, 64,226,153, 35,192,154, 26,137, 64,250, 66, 30,200,
+171, 93, 3,255,155, 40,230,190,239,199, 73,192,176, 52,157, 64, 45,246, 19,187,103,107, 3,255, 37,178, 10,192,138,231,201, 63,
+149,143,166,192,129,209,140, 33,145,141, 3,255, 3,132,110,192,243,203, 85, 64,151,107, 66,192, 16,174,158, 73,209,190, 3,255,
+116,161,174,190, 81,152,241, 63,110, 2,177,192,217,247, 15, 40,182,134, 3,255,138, 91,154, 63,218,179,133, 64,209,222,122,192,
+ 0, 27, 30, 92, 86,171, 3,255, 7, 82, 52,192, 82,252,149, 64, 64,202, 5,192, 39,193,227,101,181,210, 3,255,179, 12,148, 62,
+251,221,166, 64,188, 87, 41,192,192, 7,224,113, 21,198, 3,255,216,246, 29,192, 17,156,141,190,209,167,169,192, 47,203,160,250,
+137,139, 3,255, 99, 72,145,192, 79,114,213,191,183, 35, 83,192, 26,156, 3,219, 12,185, 3,255,115, 58,158,192,129,120, 33, 64,
+198, 41,238,191,126,148,116, 56,137,215, 3,255,118,158,174,192,103,148, 33,191,140,156, 1,192,218,136,198,240,203,211, 3,255,
+ 55, 14,249, 62, 95,133,102, 62,210,143,186,192, 56, 9, 40, 5,113,128, 3,255,220, 61, 92, 64, 56,230,159,190, 6, 61,151,192,
+ 94, 76,242,248,135,153, 3,255, 7, 86, 60, 64, 60, 48,119, 64, 93, 88, 81,192,119, 63,124, 85,246,184, 3,255,252, 55,139, 64,
+ 62, 95,132, 63,225,216,113,192,118, 95, 54, 21,107,173, 3,255, 18, 6, 84,191,251, 96,142,191, 76, 4,182,192,158,237, 20,233,
+109,131, 3,255,109, 74,225,189, 51, 54,123,192, 34,246,138,192,241,253, 39,169, 1,162, 3,255,153, 66,119, 64,127,154,251,191,
+161,220,123,192, 59, 85, 59,214, 34,170, 3,255,201, 59,208, 63,241,182,135,192,212,101,108,192,103, 34,133,162,160,175, 3,255,
+161,246,169,191,235,196,151,192,170,149, 74,192, 95,228,253,151,184,186, 3,255, 33,198,131,192,218,137, 84,192, 37,134, 32,192,
+247,164, 77,184,167,201, 3,255,176, 61,179,192,138,110,210,191, 24,220,228,190,210,133,130,219,238,244, 3,255, 73,182,170,192,
+136, 16, 90,190, 90,194, 25, 64,224,139, 8,252,174, 53, 3,255, 75, 55,153,192, 4, 78, 87, 64, 12, 54, 62,190,200,151, 29, 74,
+179,250, 3,255,235, 19,161,192,207, 12,210, 63,210,242, 31, 64, 50,146,244, 34,182, 55, 3,255, 60, 75, 94,192,189,115,150, 64,
+186,211,167,190, 98,179, 49,102,183,247, 3,255,186,191,189,191, 63, 32,168, 64,213,100, 7, 64,161,224,191,114, 61, 47, 3,255,
+242,205,186, 63,141, 65,177, 64,127,219,154,191, 82, 32,177,120, 61,228, 3,255, 99,245,175, 62, 97, 12,178, 64,255,253,228, 63,
+247, 6, 65,121, 98, 40, 3,255,226, 92, 70, 64, 8,131,150, 64,182, 77,204,191,193, 66, 37,103, 32,220, 3,255,200,194,152, 64,
+180,155, 83, 64,154,217, 62, 63,207,104,101, 71, 87, 17, 3,255, 73,182,170, 64,136, 16, 90, 62, 90,194, 25,192, 32,116,248, 3,
+ 82,202, 3,255,176, 61,179, 64,138,110,210, 63, 24,220,228, 62, 46,122,126, 36, 18, 11, 3,255,235, 19,161, 64,207, 12,210,191,
+210,242, 31,192,206,109, 12,221, 74,200, 3,255, 75, 55,153, 64, 4, 78, 87,192, 12, 54, 62, 62, 56,104,227,181, 77, 5, 3,255,
+186,191,189, 63, 63, 32,168,192,213,100, 7,192, 95, 31, 65,141,195,208, 3,255, 60, 75, 94, 64,189,115,150,192,186,211,167, 62,
+158, 76,207,153, 73, 8, 3,255, 99,245,175,190, 97, 12,178,192,255,253,228,191, 9,249,191,134,158,215, 3,255,242,205,186,191,
+141, 65,177,192,127,219,154, 63,174,223, 79,135,195, 27, 3,255,200,194,152,192,180,155, 83,192,154,217, 62,191, 49,151,155,184,
+169,238, 3,255,226, 92, 70,192, 8,131,150,192,182, 77,204, 63, 63,189,219,152,224, 35, 3,255,201, 59,208,191,241,182,135, 64,
+212,101,108, 64,153,221,123, 93, 96, 80, 3,255,153, 66,119,192,127,154,251, 63,161,220,123, 64,197,170,197, 41,222, 85, 3,255,
+161,246,169, 63,235,196,151, 64,170,149, 74, 64,161, 27, 3,104, 72, 69, 3,255, 33,198,131, 64,218,137, 84, 64, 37,134, 32, 64,
+ 9, 91,179, 71, 89, 54, 3,255,118,158,174, 64,103,148, 33, 63,140,156, 1, 64, 38,119, 58, 15, 53, 44, 3,255,115, 58,158, 64,
+129,120, 33,192,198, 41,238, 63,130,107,140,199,119, 40, 3,255, 7, 82, 52, 64, 82,252,149,192, 64,202, 5, 64,217, 62, 29,154,
+ 75, 45, 3,255,179, 12,148,190,251,221,166,192,188, 87, 41, 64, 64,248, 32,142,235, 57, 3,255, 7, 86, 60,192, 60, 48,119,192,
+ 93, 88, 81, 64,137,192,132,170, 10, 71, 3,255,252, 55,139,192, 62, 95,132,191,225,216,113, 64,138,160,202,234,149, 82, 3,255,
+220, 61, 92,192, 56,230,159, 62, 6, 61,151, 64,162,179, 14, 7,121,102, 3,255, 55, 14,249,190, 95,133,102,190,210,143,186, 64,
+200,246,216,250,143,127, 3,255,109, 74,225, 61, 51, 54,123, 64, 34,246,138, 64, 15, 2,217, 86,255, 93, 3,255, 18, 6, 84, 63,
+251, 96,142, 63, 76, 4,182, 64, 98, 18,236, 22,147,124, 3,255, 99, 72,145, 64, 79,114,213, 63,183, 35, 83, 64,230, 99,253, 36,
+244, 70, 3,255,216,246, 29, 64, 17,156,141, 62,209,167,169, 64,209, 52, 96, 5,119,116, 3,255, 3,132,110, 64,243,203, 85,192,
+151,107, 66, 64,240, 81, 98,182, 47, 65, 3,255, 37,178, 10, 64,138,231,201,191,149,143,166, 64,127, 46,116,222,111,114, 3,255,
+138, 91,154,191,218,179,133,192,209,222,122, 64, 0,229,226,163,170, 84, 3,255,116,161,174, 62, 81,152,241,191,110, 2,177, 64,
+ 39, 8,241,215, 74,121, 3,255, 36, 76, 19,192, 25,151,129, 64,212,254, 98,192,231,206, 97, 88,131,177, 3,255, 93,232,175,191,
+177, 23, 64, 64, 69,186,154,192,227,225,235, 66, 34,151, 3,255,208,190,232,190, 93,160,139, 64,191, 33,120,192,183,244,205, 94,
+192,170, 3,255,210,126,142,192, 43, 49,238, 63,112, 30, 84,192,187,158, 95, 39,183,182, 3,255,138,165, 97,192, 92, 9, 80, 63,
+ 20, 74,147,192,183,177,233, 17, 86,156, 3,255, 98, 61,152,192, 87, 63,106,188, 6, 97, 90,192,127,152,251, 0,183,180, 3,255,
+200,173, 14, 64,155,183, 63, 64,192, 75,144,192,206, 48, 45, 64,152,156, 3,255, 95,162,167, 63,144, 29,209, 63, 25,245,174,192,
+250, 29, 75, 36,250,136, 3,255,211, 62, 68, 64, 51, 56,168, 63, 13,245,153,192,241, 65,192, 29,106,150, 3,255, 33,182, 36, 64,
+ 34, 38,220,191,150, 5,159,192,233, 54,211,217,223,146, 3,255, 16, 34, 81, 63,129, 64,179,191,162, 5,180,192,242, 18, 93,224,
+111,133, 3,255,212, 56,159, 63,172,166, 68,192,212,108,154,192,176, 27, 32,190,208,149, 3,255,204, 76,223,191,170, 32,101,192,
+ 65, 83,137,192,199,216,195,178,198,161, 3,255,249,249, 10,192, 62, 52,244,191, 25,236,162,192, 9,208, 0,213,102,145, 3,255,
+ 42,207, 89,192,251, 6, 47,192, 27,165,121,192,209,182, 18,196,198,169, 3,255,137,215,176,192, 25, 62,241, 63,179,254,219,190,
+179,134,232, 39, 78,247, 3,255, 28,150,186,192,150, 16, 28, 60,191, 9, 7,191,118,128,131, 1, 77,245, 3,255, 34,132,181,192,
+ 99, 60, 92, 63,217, 81,149, 63,181,131,238, 18,252, 23, 3,255,175,242, 74,190,164,173,183, 64,227,105,145,191,117,250,160,125,
+ 31,232, 3,255,219,227, 2,192, 96,164,173, 64,200, 71, 78,191,164,212, 52,119,226,238, 3,255,181,140, 92,191, 75, 38,184, 64,
+176,148, 37, 63,224,236,237,125,159, 12, 3,255, 75,104,159, 64,212, 56,236, 63,240,126, 29,192,211,108,166, 41, 9,203, 3,255,
+215,159,132, 64, 84,184, 97, 64, 30, 44, 10,192,176, 91, 19, 76, 56,209, 3,255, 95,122,164, 64,199,143, 44, 64, 53, 78, 68,191,
+ 17,112, 17, 59,185,237, 3,255,255,176, 54, 64,243, 84,141,192,237,176, 36,192,192, 63, 9,160, 63,200, 3,255, 93,229,133, 64,
+217, 21, 68,192,157,226, 45,192,249, 90,187,187, 78,197, 3,255,203, 56,129, 64, 21,211,130,192,187,115,143,191,252, 87,194,166,
+252,229, 3,255,189,239,104,192, 82,142,140,192,178,178,168,191,134,177,245,158,155,227, 3,255, 50,141,253,191, 52,155,167,192,
+170,181,218,191,125,211,166,141,155,219, 3,255,164, 58, 41,192,172, 34,167,192,206,232,151, 61,232,197,243,141, 26, 0, 3,255,
+ 93,229,133,192,217, 21, 68, 64,157,226, 45, 64, 7,165, 69, 68,178, 58, 3,255,203, 56,129,192, 21,211,130, 64,187,115,143, 63,
+ 4,168, 62, 89, 4, 26, 3,255,255,176, 54,192,243, 84,141, 64,237,176, 36, 64, 64,192,247, 95,193, 55, 3,255, 50,141,253, 63,
+ 52,155,167, 64,170,181,218, 63,131, 44, 90,114,101, 36, 3,255,164, 58, 41, 64,172, 34,167, 64,206,232,151,189, 24, 58, 13,114,
+230,255, 3,255,189,239,104, 64, 82,142,140, 64,178,178,168, 63,122, 78, 11, 97,101, 28, 3,255, 28,150,186, 64,150, 16, 28,188,
+191, 9, 7, 63,138,127,125,254,179, 10, 3,255, 34,132,181, 64, 99, 60, 92,191,217, 81,149,191, 75,124, 18,237, 4,232, 3,255,
+137,215,176, 64, 25, 62,241,191,179,254,219, 62, 77,121, 24,216,178, 8, 3,255,219,227, 2, 64, 96,164,173,192,200, 71, 78, 63,
+ 92, 43,204,136, 30, 17, 3,255,181,140, 92, 63, 75, 38,184,192,176,148, 37,191, 32, 19, 19,130, 97,243, 3,255,175,242, 74, 62,
+164,173,183,192,227,105,145, 63,139, 5, 96,130,225, 23, 3,255,215,159,132,192, 84,184, 97,192, 30, 44, 10, 64, 80,164,237,179,
+200, 46, 3,255, 95,122,164,192,199,143, 44,192, 53, 78, 68, 63,239,143,239,196, 71, 18, 3,255, 75,104,159,192,212, 56,236,191,
+240,126, 29, 64, 45,147, 90,214,247, 52, 3,255,212, 56,159,191,172,166, 68, 64,212,108,154, 64, 80,228,224, 65, 48,106, 3,255,
+ 33,182, 36,192, 34, 38,220, 63,150, 5,159, 64, 23,201, 45, 38, 33,109, 3,255, 16, 34, 81,191,129, 64,179, 63,162, 5,180, 64,
+ 14,237,163, 31,145,122, 3,255, 42,207, 89, 64,251, 6, 47, 64, 27,165,121, 64, 47, 73,238, 59, 58, 86, 3,255,208, 76,223, 63,
+170, 32,101, 64, 65, 83,137, 64, 57, 39, 61, 77, 58, 94, 3,255,249,249, 10, 64, 62, 52,244, 63, 25,236,162, 64,247, 47, 0, 43,
+154,110, 3,255,210,126,142, 64, 43, 49,238,191,112, 30, 84, 64, 69, 97,161,216, 73, 73, 3,255, 98, 61,152, 64, 87, 63,106, 60,
+ 6, 97, 90, 64,129,103, 5,255, 73, 75, 3,255,138,165, 97, 64, 92, 9, 80,191, 20, 74,147, 64, 73, 78, 23,238,170, 99, 3,255,
+208,190,232, 62, 93,160,139,192,191, 33,120, 64, 73, 11, 51,161, 64, 85, 3,255, 36, 76, 19, 64, 25,151,129,192,212,254, 98, 64,
+ 25, 49,159,167,125, 78, 3,255, 93,232,175, 63,177, 23, 64,192, 69,186,154, 64, 29, 30, 21,189,222,104, 3,255,211, 62, 68,192,
+ 51, 56,168,191, 13,245,153, 64, 15,190, 64,226,150,105, 3,255,200,173, 14,192,155,183, 63,192,192, 75,144, 64, 50,207,211,191,
+104, 99, 3,255, 95,162,167,191,144, 29,209,191, 25,245,174, 64, 6,226,181,219, 6,119, 3,255,158,156,211,191,185,228,132, 63,
+190,207,176,192,164,220,231, 21,244,134, 3,255, 0, 76, 41,192,190,199, 5, 64, 83,157,153,192,146,198, 75, 45,246,150, 3,255,
+204, 83,125,192,169, 55,105, 64,244,162, 20,192, 72,169,246, 79, 82,206, 3,255,178,215, 91,192,222,235, 62, 64,190,254,108,192,
+215,180, 87, 65,155,175, 3,255,242, 63, 59,191,210,237,152, 63,251, 21,182,192,125,239, 26, 25,149,131, 3,255, 86,230, 94, 61,
+198, 30, 35, 64,233, 15,169,192,238, 0, 52, 55,135,140, 3,255,220, 4,199, 63, 7,145,146, 64,104,186, 83,192,109, 34,137,100,
+168,184, 3,255, 9,120, 86, 63,149, 91,109, 64, 79,242,142,192,133, 18, 64, 81,218,158, 3,255,103,243, 95,192,221, 91,138, 64,
+186, 15,236,191,170,178,219, 93, 25,216, 3,255, 46,206, 5,192,121, 41,159, 64,154, 91, 19,192,230,209, 96,108,226,205, 3,255,
+169,200,139, 63,198, 78,163, 64,201,146, 42,192,247, 24, 59,111,206,197, 3,255,187,128, 4,191,206,181,167, 64, 74, 92, 37,192,
+ 57,245, 96,114,145,199, 3,255,151, 16,231,191,160,166,209, 61,167, 95,178,192,136,217,196, 2,245,133, 3,255,163,200, 69,192,
+178,143, 38,191,148, 48,158,192,243,188, 11,242,223,147, 3,255, 43,192,155,192,151, 6,250,191,170, 82, 39,192, 79,149,247,212,
+231,199, 3,255,233,118,132,192,217,111,173,191, 67,122,123,192,100,165, 58,226,165,170, 3,255,238, 85,146,192,178,205, 78, 64,
+ 70, 54,221,191,183,156,134, 71,120,218, 3,255, 76,137,167,192,111, 31,227, 63,158, 57,251,191,234,141, 54, 39, 59,213, 3,255,
+ 39,143,170,192,167, 15,183,191,251, 85,252,191,217,139,169,223, 13,213, 3,255, 8,214,175,192,177,124, 53, 62,206,241, 2,192,
+ 23,136, 89, 3, 92,211, 3,255, 77,160,160,190, 9, 20,182, 62,108,232,186,192, 8,248,241, 7,128,128, 3,255, 33,144,163, 63,
+151,144,186, 61, 50, 47,183,192, 97, 27, 19, 2,252,130, 3,255,222,179,129, 64,234,147,224,190, 38,180,134,192, 83, 89, 64,246,
+218,164, 3,255,114,138, 49, 64,246, 97, 57,190, 57, 76,165,192,250, 60,247,251,138,143, 3,255,249,158, 27, 64,197,118,141, 64,
+ 58,196, 62,192, 90, 52, 70, 97, 90,191, 3,255, 98,244, 89, 64, 8,120, 79, 64, 65,128, 96,192, 8, 74, 39, 71,151,179, 3,255,
+ 13,100,144, 64,200,214,118, 62, 64,205,110,192,182, 98, 37, 4,161,174, 3,255, 42,202,131, 64, 60,161,231, 63,142,245,112,192,
+ 10, 90,255, 38,209,173, 3,255,149, 51,122,191, 52,151,163,190, 15,157,184,192,118,234, 36,250,248,129, 3,255, 5,113, 42,191,
+ 31,112,241,191, 15,119,176,192, 93,241, 84,215,135,135, 3,255, 60, 55,172, 61, 22, 64,143,192,164,246,113,192, 27, 2,132,157,
+ 71,174, 3,255,167,173,154,190,111,224, 83,192,198,169,154,192,136,249, 89,183,211,150, 3,255,151,133,136, 64, 9,249,162,191,
+106,219,115,192,175, 93, 47,229, 3,173, 3,255,110,124, 89, 64,135, 6, 40,192,223,195,127,192,120, 74, 31,199,208,168, 3,255,
+244,248,117, 63,109, 90,148,192,123, 0, 93,192, 8, 20, 66,154,249,180, 3,255,162, 0, 17, 64, 63,196,113,192, 52,239,119,192,
+ 10, 49, 64,173,144,171, 3,255,162,217, 7,191, 21,117,156,192,222,238, 75,192,139,245, 20,149,108,186, 3,255,171,144, 6,192,
+112,158,144,192,198,241, 69,192,156,210, 55,157,115,188, 3,255,110,238,148,192,115,109, 50,192,187,197, 13,192,170,153,231,195,
+ 17,208, 3,255, 79,252, 96,192,140, 40,115,192,116,165, 48,192,226,178, 98,173,236,195, 3,255,100,228,172,192,217,128,248,191,
+ 8, 93,150,191, 91,138, 53,213, 86,229, 3,255, 82,171,182,192,216,250,168,191, 15, 15,147, 62,122,131,250,226,203, 5, 3,255,
+215, 73,160,192,124,165, 49, 62,232, 85, 66, 64, 33,147, 84, 4, 42, 67, 3,255,171, 89,178,192,192,115, 24,191, 78,116,221, 63,
+129,134, 64,243, 50, 38, 3,255, 51,206,143,192,133,250,105, 64,119,251, 97,191, 85,158, 53, 80,193,235, 3,255, 62, 32,160,192,
+163, 38, 65, 64,164,117, 3, 63,236,146, 24, 66,193, 10, 3,255,216,108,155,192, 59,255,141, 63,189,117, 69, 64, 61,150,119, 23,
+ 42, 68, 3,255, 85, 27,164,192,244, 78, 9, 64, 87,193,239, 63, 33,144,128, 46, 73, 41, 3,255,134, 35,117,192, 39,152,138, 64,
+ 73, 86,116,191,230,171, 2, 94, 73,234, 3,255, 35,220, 67,192, 6,218,159, 64,242,103,155, 62,240,188,215,108, 55, 6, 3,255,
+130, 79, 99,191,215,182,164, 64, 10, 4, 42, 64,118,237, 50,112,190, 58, 3,255,161, 86, 3,192, 14,205,168, 64, 60, 55,197, 63,
+148,211, 31,115,255, 33, 3,255,229,101,215, 63, 84,141,168, 64, 16, 90,248,191, 11, 37,148,114,159,212, 3,255, 99, 52,155, 63,
+198, 17,183, 64,232,199,235,190,159, 26,192,124,120,245, 3,255,105,179, 10, 61, 25,185,169, 64,120,119, 31, 64, 77, 0,101,115,
+ 96, 55, 3,255,143,198, 37, 63,123,120,183, 64,160,108,135, 63,240, 13, 8,125,144, 23, 3,255,180,174, 32, 64, 65, 13,155, 64,
+238,167, 8,192,247, 53,245,105,163,208, 3,255, 69,199,104, 64,177,135,143, 64, 41, 12,132,191, 10, 79, 10, 98, 31,233, 3,255,
+121,134,159, 64, 49,245, 49, 64,210,166,169, 63, 27,109,242, 59,190, 29, 3,255, 52,133,143, 64,119,200,113, 64,186,206, 29, 62,
+ 20, 98, 39, 82,190, 3, 3,255,215, 73,160, 64,124,165, 49,190,232, 85, 66,192,223,108,172,251,214,188, 3,255,171, 89,178, 64,
+192,115, 24, 63, 78,116,221,191,127,121,192, 12,206,217, 3,255,100,228,172, 64,217,128,248, 63, 8, 93,150, 63,165,117,203, 42,
+170, 26, 3,255, 82,171,182, 64,216,250,168, 63, 15, 15,147,190,134,124, 6, 29, 53,250, 3,255,216,108,155, 64, 59,255,141,191,
+189,117, 69,192,195,105,137,232,214,187, 3,255, 85, 27,164, 64,244, 78, 9,192, 87,193,239,191,223,111,128,209,183,214, 3,255,
+ 51,206,143, 64,133,250,105,192,119,251, 97, 63,171, 97,203,175, 63, 20, 3,255, 62, 32,160, 64,163, 38, 65,192,164,117, 3,191,
+ 20,109,232,189, 63,245, 3,255,130, 79, 99, 63,215,182,164,192, 10, 4, 42,192,138, 18,206,143, 66,197, 3,255,161, 86, 3, 64,
+ 14,205,168,192, 60, 55,197,191,108, 44,225,140, 1,222, 3,255,134, 35,117, 64, 39,152,138,192, 73, 86,116, 63, 26, 84,254,161,
+183, 21, 3,255, 35,220, 67, 64, 6,218,159,192,242,103,155,190, 16, 67, 41,147,201,249, 3,255,105,179, 10,189, 25,185,169,192,
+120,119, 31,192,179,255,155,140,160,200, 3,255,143,198, 37,191,123,120,183,192,160,108,135,191, 16,242,248,130,112,232, 3,255,
+229,101,215,191, 84,141,168,192, 16, 90,248, 63,245,218,108,141, 97, 43, 3,255, 99, 52,155,191,198, 17,183,192,232,199,235, 62,
+ 97,229, 64,131,136, 10, 3,255,121,134,159,192, 49,245, 49,192,210,166,169,191,229,146, 14,196, 66,226, 3,255, 52,133,143,192,
+119,200,113,192,186,206, 29,190,236,157,217,173, 66,252, 3,255,180,174, 32,192, 65, 13,155,192,238,167, 8, 64, 9,202, 11,150,
+ 93, 47, 3,255, 69,199,104,192,177,135,143,192, 41, 12,132, 63,246,176,246,157,225, 22, 3,255,244,248,117,191,109, 90,148, 64,
+123, 0, 93, 64,248,235,190,101, 7, 75, 3,255,162, 0, 17,192, 63,196,113, 64, 52,239,119, 64,246,206,192, 82,112, 84, 3,255,
+151,133,136,192, 9,249,162, 63,106,219,115, 64, 81,162,209, 26,253, 82, 3,255,110,124, 89,192,135, 6, 40, 64,223,195,127, 64,
+136,181,225, 56, 48, 87, 3,255,162,217, 7, 63, 21,117,156, 64,222,238, 75, 64,117, 10,236,106,148, 69, 3,255,171,144, 6, 64,
+112,158,144, 64,198,241, 69, 64,100, 45,201, 98,141, 67, 3,255,110,238,148, 64,115,109, 50, 64,187,197, 13, 64, 86,102, 25, 60,
+239, 47, 3,255, 79,252, 96, 64,140, 40,115, 64,116,165, 48, 64, 30, 77,158, 82, 20, 60, 3,255, 39,143,170, 64,167, 15,183, 63,
+251, 85,252, 63, 39,116, 87, 32,243, 42, 3,255, 8,214,175, 64,177,124, 53,190,206,241, 2, 64,233,119,167,252,164, 44, 3,255,
+238, 85,146, 64,178,205, 78,192, 70, 54,221, 63, 73, 99,122,184,136, 37, 3,255, 76,137,167, 64,111, 31,227,191,158, 57,251, 63,
+ 22,114,202,216,197, 42, 3,255,103,243, 95, 64,221, 91,138,192,186, 15,236, 63, 86, 77, 37,162,231, 39, 3,255, 46,206, 5, 64,
+121, 41,159,192,154, 91, 19, 64, 26, 46,160,147, 30, 50, 3,255,169,200,139,191,198, 78,163,192,201,146, 42, 64, 9,231,197,144,
+ 50, 58, 3,255,187,128, 4, 63,206,181,167,192, 74, 92, 37, 64,199, 10,160,141,111, 56, 3,255,249,158, 27,192,197,118,141,192,
+ 58,196, 62, 64,166,203,186,158,166, 64, 3,255, 98,244, 89,192, 8,120, 79,192, 65,128, 96, 64,248,181,217,184,105, 76, 3,255,
+ 13,100,144,192,200,214,118,190, 64,205,110, 64, 74,157,219,251, 95, 81, 3,255, 42,202,131,192, 60,161,231,191,142,245,112, 64,
+246,165, 1,217, 47, 82, 3,255,222,179,129,192,234,147,224, 62, 38,180,134, 64,173,166,192, 9, 38, 91, 3,255,114,138, 49,192,
+246, 97, 57, 62, 57, 76,165, 64, 6,195, 9, 4,118,112, 3,255, 77,160,160, 62, 9, 20,182,190,108,232,186, 64,248, 7, 15,248,
+128,127, 3,255, 33,144,163,191,151,144,186,189, 50, 47,183, 64,159,228,237,253, 4,125, 3,255, 60, 55,172,189, 22, 64,143, 64,
+164,246,113, 64,229,253,124, 98,185, 81, 3,255,167,173,154, 62,111,224, 83, 64,198,169,154, 64,120, 6,167, 72, 45,105, 3,255,
+149, 51,122, 63, 52,151,163, 62, 15,157,184, 64,138, 21,220, 5, 8,126, 3,255, 5,113, 42, 63, 31,112,241, 63, 15,119,176, 64,
+163, 14,172, 40,121,120, 3,255, 43,192,155, 64,151, 6,250, 63,170, 82, 39, 64,177,106, 9, 43, 25, 56, 3,255,233,118,132, 64,
+217,111,173, 63, 67,122,123, 64,156, 90,198, 29, 91, 85, 3,255,151, 16,231, 63,160,166,209,189,167, 95,178, 64,120, 38, 60,253,
+ 11,122, 3,255,163,200, 69, 64,178,143, 38, 63,148, 48,158, 64, 13, 67,245, 13, 33,108, 3,255,204, 83,125, 64,169, 55,105,192,
+244,162, 20, 64,184, 86, 10,176,174, 49, 3,255,178,215, 91, 64,222,235, 62,192,190,254,108, 64, 41, 75,169,190,101, 80, 3,255,
+158,156,211, 63,185,228,132,191,190,207,176, 64, 92, 35, 25,234, 12,121, 3,255, 0, 76, 41, 64,190,199, 5,192, 83,157,153, 64,
+110, 57,181,210, 10,105, 3,255,220, 4,199,191, 7,145,146,192,104,186, 83, 64,147,221,119,155, 88, 71, 3,255, 9,120, 86,191,
+149, 91,109,192, 79,242,142, 64,123,237,192,174, 38, 97, 3,255,242, 63, 59, 63,210,237,152,191,251, 21,182, 64,131, 16,230,230,
+107,124, 3,255, 86,230, 94,189,198, 30, 35,192,233, 15,169, 64, 18,255,204,200,121,115, 3,255,208, 27, 46,192,124,104, 86, 64,
+ 85, 52,126,192,137,197,226, 72,134,168, 3,255, 82,168,234,191, 87, 62,149, 64,118, 12, 67,192, 5,217,188,101,210,188, 3,255,
+186, 10, 16,192,249,106, 52, 64,210,253,147,192,182,206,131, 62,198,155, 3,255, 93, 33,240,190,191,199, 71, 64,142, 47,158,192,
+214,245, 40, 69,199,148, 3,255, 19, 46, 71,187,194,240,115, 64,175,166,142,192,240,254,161, 82, 66,158, 3,255,188,194,101,191,
+ 17, 84,154, 64,240,193, 77,192, 76,235,214,104,142,185, 3,255,246,246,115,192,183, 86, 15, 64, 51,168,118,192,249,172,229, 47,
+ 45,171, 3,255,101, 1,160,192, 47,146,184, 63,153, 38, 45,192,225,146, 96, 30,102,196, 3,255,215,229, 85,192,166,178,218, 63,
+183, 55,144,192, 38,182,133, 37,110,158, 3,255,151,178,104,192,245,107,205,189,175, 60,147,192,178,175,205,253, 91,156, 3,255,
+192, 81,136,192, 55,239, 4,191, 24,222,127,192,130,163,158,245, 35,168, 3,255, 70,241,164,192,102,218,251, 62,143, 82, 48,192,
+222,143,210, 11,110,195, 3,255,209,230,173, 63,231,135, 71, 64, 27,234,152,192,148, 29, 4, 67, 11,151, 3,255,158,103, 67, 64,
+ 82,206, 51, 64, 39,168,132,192,203, 66, 63, 60,242,164, 3,255,136,131,100, 63, 16, 95, 27, 64, 4,115,168,192,122, 20,138, 53,
+143,141, 3,255, 77,154,217, 63,185, 69, 78, 63,221,196,177,192, 53, 38,236, 17, 42,135, 3,255,107,195, 37, 64, 4,213, 36, 63,
+ 20, 33,167,192,151, 55,194, 14,168,141, 3,255,103,139, 94, 64,153,146,250, 63, 72,141,137,192, 19, 75,156, 43,245,161, 3,255,
+231,195, 21, 64,236, 58,101,191,218,178,169,192,247, 49, 31,236,218,139, 3,255,142, 32, 48, 64,155,140, 32,192,195, 1,145,192,
+ 3, 59,178,200,204,156, 3,255, 70,155,185, 63, 12,202, 59,191,163, 86,180,192,149, 32, 73,239, 91,133, 3,255, 29, 97, 43, 62,
+144,118, 2,192,125,231,175,192,106, 4,160,210,103,136, 3,255, 97,116,196, 62, 10,176, 56,192,120,239,162,192,164, 8, 20,194,
+ 81,144, 3,255,185, 2, 5, 64,217,105, 76,192,135,173,142,192,218, 45, 79,187, 56,158, 3,255,163,243,144,191,252, 41, 73,192,
+148, 66,154,192,134,230, 73,188,107,150, 3,255,147,133, 20,192,234, 55,124,192,176, 3,107,192,110,204,196,170,164,175, 3,255,
+ 42,186, 60,192,219,128,189,191, 23, 43,155,192, 41,191,189,222,199,150, 3,255, 52,164,172,191,106,240, 18,192,141, 58,167,192,
+ 76,226,213,204,128,142, 3,255, 12,171,100,192,249, 33,243,191,106,221,135,192,248,178,143,214,143,162, 3,255,195, 78, 74,192,
+241,206, 96,192, 98, 88, 94,192, 4,188, 34,179,129,179, 3,255, 41,110,177,192, 81, 30,186, 63,105,249,158,191,160,134,165, 30,
+ 86,229, 3,255, 45,138,172,192,114,149, 17, 64,127,203,200, 62,251,137,171, 48, 56, 9, 3,255, 10, 94,182,192, 48, 5, 1, 63,
+ 86, 81,165,191,156,131, 24, 12, 94,228, 3,255,117,224,186,192, 37,234,247,190,147, 56,126, 62,132,128,101,246, 46, 6, 3,255,
+204, 78,184,192, 19,193, 89,189,187,163,141, 63, 22,130,208,254,241, 22, 3,255,105,232,174,192,151,187,224, 63,156,183,153, 63,
+137,136,137, 38, 3, 25, 3,255, 42,118, 68,191,101,173,176, 64,114,132,233,191, 57,238,142,120,217,216, 3,255, 81,172,191, 62,
+ 67,208,186, 64,195,163,216,190, 75, 7,131,127,159,247, 3,255,113, 2,218,191,172,151,171, 64,114, 25,212,191,243,219,116,117,
+ 30,220, 3,255,251,244, 21,192, 28, 12,172, 64, 13,151,128, 61,229,205,196,117,226, 1, 3,255, 51, 39,223,191,248, 94,177, 64,
+104,122, 76, 63,155,217, 3,121, 65, 16, 3,255, 72,208, 28, 61, 91, 13,187, 64, 64,215,245, 62,187, 0,168,127, 66, 9, 3,255,
+ 45, 93,142, 64, 70,137, 14, 64,147,202, 70,192,241, 96,173, 49,202,188, 3,255,106, 23,173, 64,157,131,182, 63,175,176,225,191,
+ 7,118, 20, 32, 72,218, 3,255, 78,203,128, 64,124, 14, 69, 64, 55, 0, 61,192,168, 88, 80, 66,199,191, 3,255,133,175,133, 64,
+ 28,149,121, 64, 51,212,168,191, 4, 92, 86, 84,170,227, 3,255, 8,211,149, 64, 84,166, 94, 64, 68, 24, 29,191,221,101, 30, 76,
+113,241, 3,255, 31,169,175, 64,138,176,237, 63, 15,168,103,191,152,119,128, 40, 11,235, 3,255,122, 78, 57, 64,224, 12,120,192,
+ 7, 56, 84,192, 62, 64,247,171,239,183, 3,255, 0, 74, 48, 64,245,165,155,192,208, 87,227,191, 38, 61, 68,150,192,217, 3,255,
+ 85,108,100, 64,115, 47, 76,192,149,224, 88,192,102, 77, 90,185,131,182, 3,255,173,191,150, 64,227,233, 55,192,198,101,254,191,
+121,102, 79,192, 73,213, 3,255,119, 97,148, 64,200, 33, 89,192, 24,225,150,191, 7,101, 44,182, 20,229, 3,255, 75,171, 86, 64,
+ 36, 83,150,192, 22, 36,133,191,220, 72,131,153, 32,232, 3,255,116,251, 81,192,115, 80,139,192, 57,124, 10,192, 81,185, 53,160,
+254,208, 3,255, 70,239,122,192, 53,220,138,192,113, 86,227,190, 68,171,132,160,195,246, 3,255, 14, 50, 28,192,245, 4,153,192,
+141, 39, 23,192,187,201,215,151, 33,205, 3,255, 34,123,189,191,203,168,178,192,149,106,130,191,209,222, 63,134,158,234, 3,255,
+176,127,232,191,177,107,178,192, 47,189,236,189, 65,216,100,134, 66,252, 3,255, 53,168, 90,192,169, 83,152,192,227,201,133, 62,
+ 29,181, 77,152,136, 4, 3,255,173,191,150,192,227,233, 55, 64,198,101,254, 63,135,153,177, 63,183, 42, 3,255, 85,108,100,192,
+115, 47, 76, 64,149,224, 88, 64,154,178,166, 70,125, 73, 3,255,119, 97,148,192,200, 33, 89, 64, 24,225,150, 63,249,154,212, 73,
+236, 26, 3,255, 75,171, 86,192, 36, 83,150, 64, 22, 36,133, 63, 36,183,125,102,224, 23, 3,255, 0, 74, 48,192,245,165,155, 64,
+208, 87,227, 63,218,194,188,105, 64, 38, 3,255,122, 78, 57,192,224, 12,120, 64, 7, 56, 84, 64,194,191, 9, 84, 17, 72, 3,255,
+ 34,123,189, 63,203,168,178, 64,149,106,130, 63, 47, 33,193,121, 98, 21, 3,255, 14, 50, 28, 64,245, 4,153, 64,141, 39, 23, 64,
+ 69, 54, 41,104,223, 50, 3,255,176,127,232, 63,177,107,178, 64, 47,189,236, 61,191, 39,156,121,190, 3, 3,255, 53,168, 90, 64,
+169, 83,152, 64,227,201,133,190,227, 74,179,103,120,251, 3,255, 70,239,122, 64, 53,220,138, 64,113, 86,227, 62,188, 84,124, 95,
+ 61, 9, 3,255,116,251, 81, 64,115, 80,139, 64, 57,124, 10, 64,175, 70,203, 95, 2, 47, 3,255,117,224,186, 64, 37,234,247, 62,
+147, 56,126,190,124,127,155, 9,210,249, 3,255, 10, 94,182, 64, 48, 5, 1,191, 86, 81,165, 63,100,124,232,243,162, 27, 3,255,
+204, 78,184, 64, 19,193, 89, 61,187,163,141,191,234,125, 48, 1, 15,233, 3,255,105,232,174, 64,151,187,224,191,156,183,153,191,
+119,119,119,217,253,230, 3,255, 45,138,172, 64,114,149, 17,192,127,203,200,190, 5,118, 85,207,200,246, 3,255, 41,110,177, 64,
+ 81, 30,186,191,105,249,158, 63, 96,121, 91,225,170, 26, 3,255,251,244, 21, 64, 28, 12,172,192, 13,151,128,189, 27, 50, 60,138,
+ 30,254, 3,255,113, 2,218, 63,172,151,171,192,114, 25,212, 63, 13, 36,140,138,226, 35, 3,255, 51, 39,223, 63,248, 94,177,192,
+104,122, 76,191,101, 38,253,134,191,239, 3,255, 72,208, 28,189, 91, 13,187,192, 64,215,245,190, 69,255, 88,128,190,246, 3,255,
+ 81,172,191,190, 67,208,186,192,195,163,216, 62,181,248,125,128, 97, 8, 3,255, 42,118, 68, 63,101,173,176,192,114,132,233, 63,
+199, 17,114,135, 39, 39, 3,255,133,175,133,192, 28,149,121,192, 51,212,168, 63,252,163,170,171, 86, 28, 3,255, 78,203,128,192,
+124, 14, 69,192, 55, 0, 61, 64, 88,167,176,189, 57, 64, 3,255, 31,169,175,192,138,176,237,191, 15,168,103, 63,104,136,128,215,
+245, 20, 3,255, 8,211,149,192, 84,166, 94,192, 68, 24, 29, 63, 35,154,226,179,143, 14, 3,255,106, 23,173,192,157,131,182,191,
+175,176,225, 63,249,137,236,223,184, 37, 3,255, 45, 93,142,192, 70,137, 14,192,147,202, 70, 64, 15,159, 83,206, 54, 67, 3,255,
+185, 2, 5,192,217,105, 76, 64,135,173,142, 64, 38,210,177, 68,200, 97, 3,255, 97,116,196,190, 10,176, 56, 64,120,239,162, 64,
+ 92,247,236, 61,175,111, 3,255,142, 32, 48,192,155,140, 32, 64,195, 1,145, 64,253,196, 78, 55, 52, 99, 3,255,231,195, 21,192,
+236, 58,101, 63,218,178,169, 64, 9,206,225, 19, 38,116, 3,255, 70,155,185,191, 12,202, 59, 63,163, 86,180, 64,107,223,183, 16,
+165,122, 3,255, 29, 97, 43,190,144,118, 2, 64,125,231,175, 64,150,251, 96, 45,153,119, 3,255,195, 78, 74, 64,241,206, 96, 64,
+ 98, 88, 94, 64,252, 67,222, 76,127, 76, 3,255, 12,171,100, 64,249, 33,243, 63,106,221,135, 64, 8, 77,113, 41,113, 93, 3,255,
+147,133, 20, 64,234, 55,124, 64,176, 3,107, 64,146, 51, 60, 85, 92, 80, 3,255,164,243,144, 63,252, 41, 73, 64,148, 66,154, 64,
+122, 25,183, 67,149,105, 3,255, 52,164,172, 63,106,240, 18, 64,141, 58,167, 64,180, 29, 43, 51,128,113, 3,255, 42,186, 60, 64,
+219,128,189, 63, 23, 43,155, 64,215, 64, 67, 33, 57,105, 3,255,101, 1,160, 64, 47,146,184,191,153, 38, 45, 64, 31,109,160,225,
+154, 59, 3,255,246,246,115, 64,183, 86, 15,192, 51,168,118, 64, 7, 83, 27,208,211, 84, 3,255, 70,241,164, 64,102,218,251,190,
+143, 82, 48, 64, 34,112, 46,244,146, 60, 3,255,192, 81,136, 64, 55,239, 4, 63, 24,222,127, 64,126, 92, 98, 10,221, 87, 3,255,
+151,178,104, 64,245,107,205, 61,175, 60,147, 64, 78, 80, 51, 2,165, 99, 3,255,215,229, 85, 64,166,178,218,191,183, 55,144, 64,
+218, 73,123,218,146, 97, 3,255,188,194,101, 63, 17, 84,154,192,240,193, 77, 64,180, 20, 42,151,114, 70, 3,255, 19, 46, 71, 59,
+194,240,115,192,175,166,142, 64, 16, 1, 95,173,190, 97, 3,255, 82,168,234, 63, 87, 62,149,192,118, 12, 67, 64,251, 38, 68,154,
+ 46, 67, 3,255,208, 27, 46, 64,124,104, 86,192, 85, 52,126, 64,119, 58, 30,183,122, 87, 3,255,186, 10, 16, 64,249,106, 52,192,
+210,253,147, 64, 74, 49,125,193, 58,100, 3,255, 93, 33,240, 62,191,199, 71,192,142, 47,158, 64, 42, 10,216,186, 57,107, 3,255,
+103,139, 94,192,153,146,250,191, 72,141,137, 64,237,180,100,212, 11, 94, 3,255,107,195, 37,192, 4,213, 36,191, 20, 33,167, 64,
+105,200, 62,241, 88,114, 3,255,158,103, 67,192, 82,206, 51,192, 39,168,132, 64, 53,189,193,195, 14, 91, 3,255,209,230,173,191,
+231,135, 71,192, 27,234,152, 64,108,226,252,188,245,104, 3,255, 77,154,217,191,185, 69, 78,191,221,196,177, 64,203,217, 20,238,
+214,120, 3,255,136,131,100,191, 16, 95, 27,192, 4,115,168, 64,134,235,118,202,113,114, 3,255,139,220, 37,192,245,135,141, 64,
+114,173, 54,192, 45,199, 95, 96,211,193, 3,255,204,119, 84,192, 93, 73,130, 64,212,107, 38,192, 58,183,223, 88,137,199, 3,255,
+208, 76, 67,192, 62,120,111, 64, 14, 89, 85,192, 80,189,196, 81,140,183, 3,255, 68,147,238,191,166,230,100, 64,234, 9,136,192,
+216,215,130, 78, 59,163, 3,255, 30,149,109,191, 40, 18,111, 64,171,100,141,192, 37,235,201, 81,199,159, 3,255,144,237,178,191,
+ 25,136,136, 64,121, 1,113,192,117,225,189, 92, 62,173, 3,255,214, 82, 66, 63,128,115,152, 64,164, 25, 85,192,241, 16, 27,104,
+126,183, 3,255,119,155,171,189,138, 40,155, 64,113, 96, 83,192,128,254,196,105,238,183, 3,255, 67,138,194, 62,177, 97,138, 64,
+ 75,158,124,192,112, 8,134, 94, 29,170, 3,255,158,106, 94,191,167,106, 30, 64,254,240,167,192,229,236,187, 53,105,141, 3,255,
+ 22,114,229,191,193, 96, 20, 64,253,167,162,192, 22,217, 93, 50,244,144, 3,255, 45,210,162,191,233,211,224, 63,184, 67,174,192,
+ 69,228,245, 37,244,136, 3,255, 37, 61,152,192,230, 9, 14, 64,137,179, 39,192, 85,152,183, 48,226,198, 3,255,232,187,140,192,
+ 6, 96, 62, 64,107,247, 30,192, 7,160, 68, 65, 11,202, 3,255,116,134,132,192, 40,130, 40, 64,237,207, 77,192,139,165,149, 57,
+ 30,186, 3,255, 12,129,129,192,231,129,173, 63,159,125,128,192, 62,167, 15, 29,123,168, 3,255,254,112,134,192,126,146,207, 62,
+159, 19,130,192, 15,164,119, 9,117,167, 3,255,189,121,149,192,142,192,111, 63, 76, 95, 90,192, 95,154,107, 20,236,180, 3,255,
+ 12, 65,162,192, 11, 84,149,191,172,202, 44,192, 60,145, 47,230, 75,197, 3,255, 74,120,165,192, 95, 78,167,190,139, 51, 48,192,
+ 54,143,140,248,244,195, 3,255, 61,161,150,192,107,221, 89,191,118,113, 89,192, 40,153, 79,237, 35,182, 3,255, 52, 56, 66,192,
+206, 40,139, 62, 21,116,160,192, 13,190, 19, 6,121,146, 3,255,245,120, 56,192,118,213,154, 63, 81,227,158,192, 81,193, 47, 26,
+133,147, 3,255,220,104, 22,192,204,221, 40, 63,115,137,170,192, 16,205, 89, 14,117,139, 3,255,145,143, 39, 64,190, 49, 94, 64,
+165, 27,124,192,238, 56,252, 75, 43,170, 3,255,130,168, 6, 64,190,132,130, 64, 12, 96,105,192,226, 45, 91, 89,173,176, 3,255,
+ 76,169,222, 63,205,107,104, 64,150,142,136,192, 23, 38,105, 79, 33,163, 3,255,137,207,229, 63, 30, 63, 22, 64,207,235,161,192,
+198, 39,227, 50,127,145, 3,255,239, 11, 14, 64,175,114,191, 63,254,208,166,192,133, 48, 81, 33, 87,142, 3,255,239,222, 43, 64,
+212,226, 11, 64,227, 71,151,192, 33, 58,140, 47, 91,152, 3,255, 0,245,124, 64, 27, 32,187, 62, 57, 6,138,192,138, 86,176, 7,
+ 2,162, 3,255, 42, 75,112, 64,228, 42,152, 63, 25, 44,139,192, 0, 82,159, 25, 31,161, 3,255,178,218, 82, 64,178,247, 1, 63,
+211,129,154,192, 35, 72, 4, 11,217,150, 3,255,208,203,104, 63,146, 6,113, 63,108, 5,183,192,132, 19,150, 20, 49,131, 3,255,
+ 26, 68,251, 62,111, 38,228, 63,114, 48,178,192,139, 10,158, 38,109,134, 3,255,163, 78,149, 61, 65, 25,137, 63,234,102,184,192,
+ 54, 1, 52, 23, 34,130, 3,255, 98,140, 80, 64,169,205,238,191, 83, 69,144,192, 70, 71,145,215,173,157, 3,255,177, 39,109, 64,
+155,213,147,191,238,143,140,192, 57, 81,247,230, 77,160, 3,255,100,225, 66, 64,146,191,131,191,152, 18,157,192,178, 66,128,233,
+ 25,149, 3,255,190, 24,220, 63,163,163,202,191,160,244,171,192, 99, 37,199,220,196,138, 3,255,227,219,133, 63,172, 47, 17,192,
+ 93,160,169,192,126, 23,164,206, 68,140, 3,255, 46,202,247, 63, 23,140, 27,192,116,252,158,192,217, 41, 77,203, 32,147, 3,255,
+ 36,220, 68, 63, 24,143,132,192, 20,105,130,192,163, 16, 66,165, 72,167, 3,255, 60,255,185, 63,215,244,108,192,129, 7,138,192,
+113, 31, 11,175,251,161, 3,255,220, 18, 19, 63,168,186, 98,192, 66,136,148,192,155, 12,121,178,241,154, 3,255,131,119,172,187,
+182,209,162,191,170, 73,183,192,209,255,144,228,251,130, 3,255,165,230, 40, 63,246,111, 24,191, 50,150,185,192, 19, 14, 18,243,
+113,129, 3,255,123, 45, 50,190,213, 16,230,190,160,240,186,192,231,251,124,246,109,128, 3,255,221, 22,199,191, 71,211,134,192,
+ 37,161,113,192, 98,222,255,163,157,173, 3,255,171,131, 58,191, 57,178,140,192,214,174,115,192,105,240,201,159, 11,173, 3,255,
+228,119,112,191, 49, 46,115,192,186,222,139,192,152,235,221,172,217,160, 3,255,122, 75,254,191, 18, 36, 50,192, 84, 70,152,192,
+253,211, 46,195, 87,152, 3,255,190,239, 52,192,193,186, 22,192,166,240,145,192,167,194, 3,204,108,156, 3,255, 51, 23, 39,192,
+ 14,245, 76,192,105,248,132,192, 29,199,137,186,200,164, 3,255,202,137,140,192, 4,234, 33,192,152,117, 60,192,215,159,216,200,
+ 6,192, 3,255, 68,176,115,192, 85, 49, 68,192, 65,173, 79,192,178,172, 81,189, 81,185, 3,255,131,173,128,192, 50,170, 14,192,
+247, 71,105,192, 30,168, 64,207,189,176, 3,255,230, 80, 22,192, 50,155,141,191,108, 95,168,192, 3,205, 6,232, 19,141, 3,255,
+ 96,113,194,191,166,184,195,191, 31,160,174,192,205,222,245,222,227,136, 3,255,249,244,213,191, 10, 33, 52,191,248, 94,178,192,
+172,219, 3,241, 48,134, 3,255, 30, 26,167,192, 62, 11, 42, 64,199,163,159,190, 45,142, 26, 58,236,248, 3,255, 15,242,157,192,
+177, 35, 63, 64,242,230,132,191,115,148,134, 65, 39,233, 3,255, 58,163,169,192,184,207, 14, 64, 43, 92,148,191,122,140,250, 48,
+193,230, 3,255,241, 83,184,192, 33,241,117, 63,204, 69,248,190, 32,130,245, 20, 22,246, 3,255, 88,178,186,192,180, 33,226, 62,
+ 69,211,165, 62,153,128, 65, 10,196, 6, 3,255,100,194,181,192,227, 37,178, 63, 65, 51,191, 62,199,131,217, 29,201, 7, 3,255,
+140, 68,168,192,162,100, 57, 63, 90, 41, 31, 64, 91,141,195, 15,175, 54, 3,255,185,114,173,192,147, 11,162, 63,136,131,237, 63,
+204,137,106, 27,187, 40, 3,255, 90, 82,178,192,181, 0,168, 62,125, 64,231, 63,136,134, 78, 7,175, 39, 3,255,235, 52,185,192,
+191,185, 83,191, 39,176,252,190,201,129,211,237,241,244, 3,255, 95,222,182,192,178, 32,161,190, 48, 92,165,191, 90,131,208,248,
+211,227, 3,255, 52,119,179,192,223,204,147,191,116,141,160,191,169,133,113,230,103,228, 3,255,109, 88, 35, 63,129,186,182, 64,
+207, 8,152,191, 5, 14,127,124,202,229, 3,255,226, 54, 99, 63,172,134,174, 64, 96, 98,250,191,180, 19,244,118, 14,213, 3,255,
+150,195, 60, 61, 46,121,177, 64,174, 6,245,191, 84, 1,249,120, 55,214, 3,255,228,160,145,191,121, 59,181, 64,246,252,123,191,
+ 63,231,214,123, 42,235, 3,255, 29,166,188,191,167,120,181, 64, 4,224,165,189, 81,224,253,123,203,253, 3,255, 26,186, 9,191,
+104,142,186, 64,128, 74,126,190,158,243, 69,127, 88,250, 3,255,179,205, 19,191, 33,145,175, 64,102,151,253, 63,125,243,171,119,
+167, 43, 3,255,163,114,134,190, 81, 94,183, 64, 73,210,157, 63, 40,250,240,124, 49, 27, 3,255,253,217,151,191, 90, 89,178, 64,
+210,246,178, 63, 89,230,146,121,187, 30, 3,255,107,200, 50,192, 4, 21,164, 64,143,252, 18,191,229,194,189,111, 58,243, 3,255,
+219,140, 29,192,164,216,163, 64,163,160,187,191, 2,202,148,111, 27,224, 3,255, 8, 63, 76,192,149, 92,152, 64,201, 6,157,191,
+254,185,184,103, 25,229, 3,255,102, 31,167, 64, 18,113,133, 63,122,150, 29,192,214,113,149, 22, 5,202, 3,255,115, 48,157, 64,
+ 74,183, 33, 63, 21,172, 72,192, 50,107,106, 13, 91,187, 3,255,250, 48,151, 64,117,157,186, 63,236, 37, 74,192, 41,103,126, 31,
+ 23,187, 3,255,118, 31,148, 64,144, 99, 46, 64, 95,237, 21,192,101,101,141, 59,115,205, 3,255, 40,177,150, 64,101,250, 73, 64,
+104,252,189,191, 13,103,113, 68, 39,223, 3,255, 59, 67,164, 64,106,116, 19, 64, 96,145,209,191,204,111,223, 50,255,219, 3,255,
+ 9, 99,168, 64,184,173, 32, 64,129, 16, 27, 63,228,114,189, 54,164, 13, 3,255,225, 1,174, 64, 65,167, 12, 64,199, 1, 38,190,
+149,118, 17, 48,195,252, 3,255,172,156,160, 64, 23,121, 66, 64,220,253, 53,188,155,109, 25, 66, 0, 0, 3,255,230,184,106, 64,
+117, 83,133, 64, 76, 95,243,191,202, 79,251, 90, 77,214, 3,255,116,166,101, 64, 67,107,111, 64, 69,233, 47,192, 23, 78,219, 81,
+ 34,196, 3,255,109, 20, 68, 64,202, 9,139, 64,124,255, 29,192,138, 66, 22, 95, 6,202, 3,255, 46,138, 12, 64,195,168,156,192,
+ 99,240, 23,192,172, 47, 54,149,252,203, 3,255,110,189,201, 63, 48, 28,154,192,180,148, 60,192, 2, 34,195,150,147,191, 3,255,
+ 21, 55, 17, 64,125, 67,140,192,118, 8, 75,192, 61, 49, 50,160,221,186, 3,255, 85,126,100, 64,103,211,114,192,187,176, 43,192,
+ 60, 78,241,172, 2,198, 3,255, 29,112,133, 64,168, 45,104,192, 95, 44,249,191,154, 90, 96,176, 48,213, 3,255,192,193, 95, 64,
+221, 5,138,192, 42,219,239,191,181, 76, 61,162,177,214, 3,255, 28, 21,134, 64,185,231,130,192,175,210,133, 62,128, 91,182,166,
+ 33, 6, 3,255,128,101,115, 64,106,100,142,192,214,174,205,190, 32, 83, 12,159,127,247, 3,255,187,250,142, 64,178,123,113,192,
+ 90,120,242,190, 99, 97,142,173,244,245, 3,255,115, 83,149, 64, 25,118, 24,192, 96, 5, 41,192,195,101, 61,204, 36,198, 3,255,
+236, 97,130, 64,181,248, 34,192, 49,132, 87,192, 17, 89,184,200,144,182, 3,255,186,103,144, 64, 91, 9,234,191,150,226, 80,192,
+152, 98,121,216,152,184, 3,255,208, 74,136,192,231,117,121,192, 32,193,133,191,248,162, 42,171,249,232, 3,255, 31, 84,144,192,
+ 24, 19, 87,192, 53, 65,211,191, 74,157,248,182,224,219, 3,255, 7, 90,123,192,107,238,121,192,115,227,247,191, 22,170, 1,171,
+218,213, 3,255,161,112, 54,192, 94, 77,156,192,207,107,196,191,198,193, 23,149, 32,223, 3,255, 24, 41, 22,192, 1,197,169,192,
+191, 68, 84,191, 45,204,105,140,172,237, 3,255, 73,243, 75,192, 86, 16,156,192,180,150, 33,191,216,186, 63,149,194,241, 3,255,
+140,246, 19,192,148, 60,166,192, 11, 70,182, 63,164,205,159,142,127, 31, 3,255, 17, 21, 58,192,224,209,160,192,103,100, 88, 63,
+202,192, 72,146,171, 18, 3,255,151,252, 4,192, 71, 89,174,192,215, 93, 38, 63,148,210, 55,137,122, 14, 3,255, 53,176,150,191,
+238,252,174,192, 37,172,226,191,114,230,199,136, 20,217, 3,255,225,105,214,191,211,177,161,192,160,229, 29,192,197,219,175,145,
+ 38,202, 3,255, 62,213, 88,191,193, 70,167,192,212,217, 32,192,221,237,232,141,230,200, 3,255,236, 97,130,192,181,248, 34, 64,
+ 49,132, 87, 64,239,166, 72, 55,112, 73, 3,255,186,103,144,192, 91, 9,234, 63,150,226, 80, 64,104,157,135, 39,104, 71, 3,255,
+115, 83,149,192, 25,118, 24, 64, 96, 5, 41, 64, 61,154,195, 51,220, 57, 3,255, 29,112,133,192,168, 45,104, 64, 95, 44,249, 63,
+102,165,160, 79,208, 42, 3,255,192,193, 95,192,221, 5,138, 64, 42,219,239, 63, 75,179,195, 93, 79, 41, 3,255, 85,126,100,192,
+103,211,114, 64,187,176, 43, 64,196,177, 15, 83,254, 57, 3,255,110,189,201,191, 48, 28,154, 64,180,148, 60, 64,254,221, 61,105,
+109, 64, 3,255, 21, 55, 17,192,125, 67,140, 64,118, 8, 75, 64,195,206,206, 95, 35, 69, 3,255, 46,138, 12,192,195,168,156, 64,
+ 99,240, 23, 64, 84,208,202,106, 4, 52, 3,255,128,101,115,192,106,100,142, 64,214,174,205, 62,224,172,244, 96,129, 8, 3,255,
+187,250,142,192,178,123,113, 64, 90,120,242, 62,157,158,114, 82, 12, 10, 3,255, 28, 21,134,192,185,231,130, 64,175,210,133,190,
+128,164, 74, 89,223,249, 3,255,225,105,214, 63,211,177,161, 64,160,229, 29, 64, 59, 36, 81,110,218, 53, 3,255, 62,213, 88, 63,
+193, 70,167, 64,212,217, 32, 64, 35, 18, 24,114, 26, 55, 3,255, 53,176,150, 63,238,252,174, 64, 37,172,226, 63,142, 25, 57,119,
+236, 38, 3,255, 24, 41, 22, 64, 1,197,169, 64,191, 68, 84, 63,211, 51,151,115, 84, 18, 3,255, 73,243, 75, 64, 86, 16,156, 64,
+180,150, 33, 63, 40, 69,193,106, 62, 14, 3,255,161,112, 54, 64, 94, 77,156, 64,208,107,196, 63, 58, 62,233,106,224, 32, 3,255,
+ 31, 84,144, 64, 24, 19, 87, 64, 53, 65,211, 63,182, 98, 8, 73, 32, 36, 3,255, 7, 90,123, 64,107,238,121, 64,115,227,247, 63,
+234, 85,255, 84, 38, 42, 3,255,208, 74,136, 64,231,117,121, 64, 32,193,133, 63, 8, 93,214, 84, 7, 23, 3,255, 17, 21, 58, 64,
+224,209,160, 64,103,100, 88,191, 54, 63,184,109, 85,237, 3,255,151,252, 4, 64, 71, 89,174, 64,215, 93, 38,191,108, 45,201,118,
+134,241, 3,255,140,246, 19, 64,148, 60,166, 64, 11, 70,182,191, 92, 50, 97,113,129,224, 3,255, 95,222,182, 64,178, 32,161, 62,
+ 48, 92,165, 63,166,124, 48, 7, 45, 28, 3,255, 52,119,179, 64,223,204,147, 63,116,141,160, 63, 87,122,143, 25,153, 27, 3,255,
+235, 52,185, 64,191,185, 83, 63, 39,176,252, 62, 55,126, 45, 18, 15, 11, 3,255, 88,178,186, 64,180, 33,226,190, 69,211,165,190,
+103,127,191,245, 60,249, 3,255,100,194,181, 64,227, 37,178,191, 65, 51,191,190, 57,124, 39,226, 55,248, 3,255,241, 83,184, 64,
+ 33,241,117,191,204, 69,248, 62,224,125, 11,235,234, 9, 3,255, 15,242,157, 64,177, 35, 63,192,242,230,132, 63,141,107,122,190,
+217, 22, 3,255, 58,163,169, 64,184,207, 14,192, 43, 92,148, 63,134,115, 6,207, 63, 25, 3,255, 30, 26,167, 64, 62, 11, 42,192,
+199,163,159, 62,211,113,230,197, 20, 7, 3,255,185,114,173, 64,147, 11,162,191,136,131,237,191, 52,118,150,228, 69,215, 3,255,
+ 90, 82,178, 64,181, 0,168,190,125, 64,231,191,120,121,178,248, 81,216, 3,255,140, 68,168, 64,162,100, 57,191, 90, 41, 31,192,
+165,114, 61,240, 81,201, 3,255,219,140, 29, 64,164,216,163,192,163,160,187, 63,254, 53,108,144,229, 31, 3,255, 8, 63, 76, 64,
+149, 92,152,192,201, 6,157, 63, 2, 70, 72,152,231, 26, 3,255,107,200, 50, 64, 4, 21,164,192,143,252, 18, 63, 27, 61, 67,144,
+198, 12, 3,255, 29,166,188, 63,167,120,181,192, 4,224,165, 61,175, 31, 3,132, 53, 2, 3,255, 26,186, 9, 63,104,142,186,192,
+128, 74,126, 62, 98, 12,187,128,168, 5, 3,255,228,160,145, 63,121, 59,181,192,246,252,123, 63,193, 24, 42,132,214, 20, 3,255,
+226, 54, 99,191,172,134,174,192, 96, 98,250, 63, 76,236, 12,137,242, 42, 3,255,150,195, 60,189, 46,121,177,192,174, 6,245, 63,
+172,254, 7,135,201, 41, 3,255,109, 88, 35,191,129,186,182,192,207, 8,152, 63,251,241,129,131, 54, 26, 3,255,163,114,134, 62,
+ 81, 94,183,192, 73,210,157,191,216, 5, 16,131,207,228, 3,255,253,217,151, 63, 90, 89,178,192,210,246,178,191,167, 25,110,134,
+ 69,225, 3,255,179,205, 19, 63, 33,145,175,192,102,151,253,191,131, 12, 85,136, 89,212, 3,255,116,166,101,192, 67,107,111,192,
+ 69,233, 47, 64,233,177, 37,174,222, 59, 3,255,109, 20, 68,192,202, 9,139,192,124,255, 29, 64,118,189,234,160,250, 53, 3,255,
+230,184,106,192,117, 83,133,192, 76, 95,243, 63, 54,176, 5,165,179, 41, 3,255, 40,177,150,192,101,250, 73,192,104,252,189, 63,
+243,152,143,187,217, 32, 3,255, 59, 67,164,192,106,116, 19,192, 96,145,209, 63, 52,144, 33,205, 1, 36, 3,255,118, 31,148,192,
+144, 99, 46,192, 95,237, 21, 64,155,154,115,196,141, 50, 3,255,115, 48,157,192, 74,183, 33,191, 21,172, 72, 64,206,148,150,242,
+165, 68, 3,255,250, 48,151,192,117,157,186,191,236, 37, 74, 64,215,152,130,224,233, 68, 3,255,102, 31,167,192, 18,113,133,191,
+122,150, 29, 64, 42,142,107,233,251, 53, 3,255,225, 1,174,192, 65,167, 12,192,199, 1, 38, 62,107,137,239,207, 61, 3, 3,255,
+172,156,160,192, 23,121, 66,192,220,253, 53, 60,101,146,231,189, 0, 0, 3,255, 9, 99,168,192,184,173, 32,192,129, 16, 27,191,
+ 28,141, 67,201, 92,242, 3,255,220, 18, 19,191,168,186, 98, 64, 66,136,148, 64,101,243,135, 77, 15,101, 3,255, 36,220, 68,191,
+ 24,143,132, 64, 20,105,130, 64, 93,239,190, 90,184, 88, 3,255, 60,255,185,191,215,244,108, 64,129, 7,138, 64,143,224,245, 80,
+ 5, 94, 3,255, 46,202,247,191, 23,140, 27, 64,116,252,158, 64, 39,214,179, 52,224,108, 3,255,190, 24,220,191,163,163,202, 63,
+160,244,171, 64,157,218, 57, 35, 60,117, 3,255,227,219,133,191,172, 47, 17, 64, 93,160,169, 64,130,232, 92, 49,188,115, 3,255,
+123, 45, 50, 62,213, 16,230, 62,160,240,186, 64, 25, 4,132, 9,147,127, 3,255,131,119,172, 59,182,209,162, 63,170, 73,183, 64,
+ 47, 0,112, 27, 5,125, 3,255,165,230, 40,191,246,111, 24, 63, 50,150,185, 64,237,241,238, 12,143,126, 3,255,100,225, 66,192,
+146,191,131, 63,152, 18,157, 64, 78,189,128, 22,231,106, 3,255, 98,140, 80,192,169,205,238, 63, 83, 69,144, 64,186,184,111, 40,
+ 83, 98, 3,255,177, 39,109,192,154,213,147, 63,239,143,140, 64,199,174, 9, 25,179, 95, 3,255,131,173,128, 64, 50,170, 14, 64,
+247, 71,105, 64,226, 87,192, 48, 67, 79, 3,255,202,137,140, 64, 4,234, 33, 64,152,117, 60, 64, 41, 96, 40, 55,250, 63, 3,255,
+ 68,176,115, 64, 85, 49, 68, 64, 65,173, 79, 64, 78, 83,175, 66,175, 70, 3,255, 51, 23, 39, 64, 14,245, 76, 64,105,248,132, 64,
+227, 56,119, 69, 56, 91, 3,255,122, 75,254, 63, 17, 36, 50, 64, 83, 70,152, 64, 3, 44,210, 60,169,103, 3,255,190,239, 52, 64,
+193,186, 22, 64,166,240,145, 64, 89, 61,253, 51,148, 99, 3,255,249,244,213, 63, 10, 33, 52, 63,248, 94,178, 64, 84, 36,253, 14,
+208,121, 3,255,230, 80, 22, 64, 50,155,141, 63,108, 95,168, 64,253, 50,250, 23,237,114, 3,255, 96,113,194, 63,166,184,195, 63,
+ 31,160,174, 64, 51, 33, 11, 33, 29,119, 3,255,228,119,112, 63, 49, 46,115, 64,186,222,139, 64,104, 20, 35, 83, 40, 95, 3,255,
+221, 22,199, 63, 71,211,134, 64, 37,161,113, 64,158, 33, 1, 92, 99, 82, 3,255,170,131, 58, 63, 58,178,140, 64,213,174,115, 64,
+151, 15, 55, 96,245, 82, 3,255,116,134,132, 64, 40,130, 40,192,237,207, 77, 64,117, 90,107,198,226, 69, 3,255,232,187,140, 64,
+ 6, 96, 62,192,107,247, 30, 64,249, 95,188,190,245, 53, 3,255, 37, 61,152, 64,230, 9, 14,192,137,179, 39, 64,171,103, 73,207,
+ 30, 57, 3,255,189,121,149, 64,142,192,111,191, 76, 95, 90, 64,161,101,149,235, 20, 75, 3,255,254,112,134, 64,126,146,207,190,
+159, 19,130, 64,241, 91,137,246,139, 88, 3,255, 12,129,129, 64,231,129,173,191,159,125,128, 64,194, 88,241,226,133, 87, 3,255,
+220,104, 22, 64,204,221, 40,191,115,137,170, 64,240, 50,167,241,139,116, 3,255,245,120, 56, 64,118,213,154,191, 81,227,158, 64,
+175, 62,209,229,123,108, 3,255, 52, 56, 66, 64,206, 40,139,190, 21,116,160, 64,243, 65,237,249,135,109, 3,255, 61,161,150, 64,
+107,221, 89, 63,118,113, 89, 64,216,102,177, 18,221, 73, 3,255, 74,120,165, 64, 95, 78,167, 62,139, 51, 48, 64,202,112,116, 7,
+ 12, 60, 3,255, 12, 65,162, 64, 11, 84,149, 63,172,202, 44, 64,196,110,209, 25,181, 58, 3,255, 67,138,194,190,177, 97,138,192,
+ 75,158,124, 64,144,247,122,161,227, 85, 3,255,214, 82, 66,191,128,115,152,192,164, 25, 85, 64, 15,239,229,151,130, 72, 3,255,
+119,155,171, 61,138, 40,155,192,113, 96, 83, 64,128, 1, 60,150, 18, 72, 3,255,144,237,178, 63, 25,136,136,192,121, 1,113, 64,
+139, 30, 67,163,194, 82, 3,255, 68,147,238, 63,166,230,100,192,234, 9,136, 64, 40, 40,126,177,197, 92, 3,255, 30,149,109, 63,
+ 40, 18,111,192,171,100,141, 64,219, 20, 55,174, 57, 96, 3,255, 45,210,162, 63,233,211,224,191,184, 67,174, 64,187, 27, 11,218,
+ 12,119, 3,255,158,106, 94, 63,167,106, 30,192,254,240,167, 64, 27, 19, 69,202,151,114, 3,255, 22,114,229, 63,193, 96, 20,192,
+253,167,162, 64,234, 38,163,205, 12,111, 3,255,208, 76, 67, 64, 62,120,111,192, 14, 89, 85, 64,176, 66, 60,174,116, 72, 3,255,
+139,220, 37, 64,245,135,141,192,114,173, 54, 64,211, 56,161,159, 45, 62, 3,255,204,119, 84, 64, 93, 73,130,192,212,107, 38, 64,
+198, 72, 33,167,119, 56, 3,255,178,218, 82,192,178,247, 1,191,211,129,154, 64,221,183,252,244, 39,105, 3,255, 0,245,124,192,
+ 27, 32,187,190, 57, 6,138, 64,118,169, 80,248,254, 93, 3,255, 42, 75,112,192,228, 42,152,191, 25, 44,139, 64, 0,174, 97,230,
+225, 94, 3,255,239,222, 43,192,212,226, 11,192,227, 71,151, 64,223,197,116,208,165,103, 3,255,137,207,229,191, 30, 63, 22,192,
+207,235,161, 64, 58,216, 29,205,129,110, 3,255,239, 11, 14,192,175,114,191,191,254,208,166, 64,123,207,175,222,169,113, 3,255,
+163, 78,149,189, 65, 25,137,191,234,102,184, 64,202,254,204,232,222,125, 3,255,208,203,104,191,146, 6,113,191,108, 5,183, 64,
+124,236,106,235,207,124, 3,255, 26, 68,251,190,111, 38,228,191,114, 48,178, 64,117,245, 98,217,147,121, 3,255, 76,169,222,191,
+205,107,104,192,150,142,136, 64,233,217,151,176,223, 92, 3,255,145,143, 39,192,190, 49, 94,192,165, 27,124, 64, 18,199, 4,180,
+213, 85, 3,255,130,168, 6,192,190,132,130,192, 12, 96,105, 64, 30,210,165,166, 83, 79, 3,255, 68, 65, 84, 65, 64, 1, 0, 0,
+ 48, 0,119, 1, 0, 0, 0, 0, 5, 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,176, 1,119, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 90, 0, 0,176, 1,119, 1, 0, 0, 0, 0,
+ 53, 0, 0, 0,128, 7, 0, 0, 0, 0, 0, 0,162, 0, 0, 0, 0, 0, 35, 0, 42, 0, 0, 0,162, 0, 0, 0, 0, 0, 35, 0,
+ 12, 0, 0, 0,163, 0, 0, 0, 0, 0, 35, 0, 42, 0, 0, 0,163, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,164, 0, 0, 0,
+ 0, 0, 35, 0, 43, 0, 0, 0,164, 0, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0,165, 0, 0, 0, 0, 0, 35, 0, 43, 0, 0, 0,
+165, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 35, 0, 44, 0, 0, 0,166, 0, 0, 0, 0, 0, 35, 0,
+ 13, 0, 0, 0,167, 0, 0, 0, 0, 0, 35, 0, 44, 0, 0, 0,167, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,168, 0, 0, 0,
+ 0, 0, 35, 0, 45, 0, 0, 0,168, 0, 0, 0, 0, 0, 35, 0, 13, 0, 0, 0,169, 0, 0, 0, 0, 0, 35, 0, 45, 0, 0, 0,
+169, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,170, 0, 0, 0, 0, 0, 35, 0, 46, 0, 0, 0,170, 0, 0, 0, 0, 0, 35, 0,
+ 14, 0, 0, 0,171, 0, 0, 0, 0, 0, 35, 0, 46, 0, 0, 0,171, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,172, 0, 0, 0,
+ 0, 0, 35, 0, 47, 0, 0, 0,172, 0, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0,173, 0, 0, 0, 0, 0, 35, 0, 47, 0, 0, 0,
+173, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,174, 0, 0, 0, 0, 0, 35, 0, 48, 0, 0, 0,174, 0, 0, 0, 0, 0, 35, 0,
+ 15, 0, 0, 0,175, 0, 0, 0, 0, 0, 35, 0, 48, 0, 0, 0,175, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,176, 0, 0, 0,
+ 0, 0, 35, 0, 49, 0, 0, 0,176, 0, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0,177, 0, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,
+177, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,178, 0, 0, 0, 0, 0, 35, 0, 50, 0, 0, 0,178, 0, 0, 0, 0, 0, 35, 0,
+ 16, 0, 0, 0,179, 0, 0, 0, 0, 0, 35, 0, 50, 0, 0, 0,179, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,180, 0, 0, 0,
+ 0, 0, 35, 0, 51, 0, 0, 0,180, 0, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0,181, 0, 0, 0, 0, 0, 35, 0, 51, 0, 0, 0,
+181, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,182, 0, 0, 0, 0, 0, 35, 0, 52, 0, 0, 0,182, 0, 0, 0, 0, 0, 35, 0,
+ 17, 0, 0, 0,183, 0, 0, 0, 0, 0, 35, 0, 52, 0, 0, 0,183, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,184, 0, 0, 0,
+ 0, 0, 35, 0, 53, 0, 0, 0,184, 0, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0,185, 0, 0, 0, 0, 0, 35, 0, 53, 0, 0, 0,
+185, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,186, 0, 0, 0, 0, 0, 35, 0, 54, 0, 0, 0,186, 0, 0, 0, 0, 0, 35, 0,
+ 18, 0, 0, 0,187, 0, 0, 0, 0, 0, 35, 0, 54, 0, 0, 0,187, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,188, 0, 0, 0,
+ 0, 0, 35, 0, 55, 0, 0, 0,188, 0, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0,189, 0, 0, 0, 0, 0, 35, 0, 55, 0, 0, 0,
+189, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0,190, 0, 0, 0, 0, 0, 35, 0, 56, 0, 0, 0,190, 0, 0, 0, 0, 0, 35, 0,
+ 19, 0, 0, 0,191, 0, 0, 0, 0, 0, 35, 0, 56, 0, 0, 0,191, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,192, 0, 0, 0,
+ 0, 0, 35, 0, 57, 0, 0, 0,192, 0, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0,193, 0, 0, 0, 0, 0, 35, 0, 57, 0, 0, 0,
+193, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,194, 0, 0, 0, 0, 0, 35, 0, 58, 0, 0, 0,194, 0, 0, 0, 0, 0, 35, 0,
+ 20, 0, 0, 0,195, 0, 0, 0, 0, 0, 35, 0, 58, 0, 0, 0,195, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,196, 0, 0, 0,
+ 0, 0, 35, 0, 59, 0, 0, 0,196, 0, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0,197, 0, 0, 0, 0, 0, 35, 0, 59, 0, 0, 0,
+197, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,198, 0, 0, 0, 0, 0, 35, 0, 60, 0, 0, 0,198, 0, 0, 0, 0, 0, 35, 0,
+ 21, 0, 0, 0,199, 0, 0, 0, 0, 0, 35, 0, 60, 0, 0, 0,199, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,200, 0, 0, 0,
+ 0, 0, 35, 0, 61, 0, 0, 0,200, 0, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0,201, 0, 0, 0, 0, 0, 35, 0, 61, 0, 0, 0,
+201, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,202, 0, 0, 0, 0, 0, 35, 0, 62, 0, 0, 0,202, 0, 0, 0, 0, 0, 35, 0,
+ 22, 0, 0, 0,203, 0, 0, 0, 0, 0, 35, 0, 62, 0, 0, 0,203, 0, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0,204, 0, 0, 0,
+ 0, 0, 35, 0, 63, 0, 0, 0,204, 0, 0, 0, 0, 0, 35, 0, 22, 0, 0, 0,205, 0, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0,
+205, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,206, 0, 0, 0, 0, 0, 35, 0, 64, 0, 0, 0,206, 0, 0, 0, 0, 0, 35, 0,
+ 23, 0, 0, 0,207, 0, 0, 0, 0, 0, 35, 0, 64, 0, 0, 0,207, 0, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0,208, 0, 0, 0,
+ 0, 0, 35, 0, 65, 0, 0, 0,208, 0, 0, 0, 0, 0, 35, 0, 23, 0, 0, 0,209, 0, 0, 0, 0, 0, 35, 0, 65, 0, 0, 0,
+209, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0,210, 0, 0, 0, 0, 0, 35, 0, 66, 0, 0, 0,210, 0, 0, 0, 0, 0, 35, 0,
+ 24, 0, 0, 0,211, 0, 0, 0, 0, 0, 35, 0, 66, 0, 0, 0,211, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,212, 0, 0, 0,
+ 0, 0, 35, 0, 67, 0, 0, 0,212, 0, 0, 0, 0, 0, 35, 0, 24, 0, 0, 0,213, 0, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0,
+213, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,214, 0, 0, 0, 0, 0, 35, 0, 68, 0, 0, 0,214, 0, 0, 0, 0, 0, 35, 0,
+ 25, 0, 0, 0,215, 0, 0, 0, 0, 0, 35, 0, 68, 0, 0, 0,215, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,216, 0, 0, 0,
+ 0, 0, 35, 0, 69, 0, 0, 0,216, 0, 0, 0, 0, 0, 35, 0, 25, 0, 0, 0,217, 0, 0, 0, 0, 0, 35, 0, 69, 0, 0, 0,
+217, 0, 0, 0, 0, 0, 35, 0, 2, 0, 0, 0,218, 0, 0, 0, 0, 0, 35, 0, 70, 0, 0, 0,218, 0, 0, 0, 0, 0, 35, 0,
+ 26, 0, 0, 0,219, 0, 0, 0, 0, 0, 35, 0, 70, 0, 0, 0,219, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0,220, 0, 0, 0,
+ 0, 0, 35, 0, 71, 0, 0, 0,220, 0, 0, 0, 0, 0, 35, 0, 26, 0, 0, 0,221, 0, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0,
+221, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,222, 0, 0, 0, 0, 0, 35, 0, 72, 0, 0, 0,222, 0, 0, 0, 0, 0, 35, 0,
+ 27, 0, 0, 0,223, 0, 0, 0, 0, 0, 35, 0, 72, 0, 0, 0,223, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0,224, 0, 0, 0,
+ 0, 0, 35, 0, 73, 0, 0, 0,224, 0, 0, 0, 0, 0, 35, 0, 27, 0, 0, 0,225, 0, 0, 0, 0, 0, 35, 0, 73, 0, 0, 0,
+225, 0, 0, 0, 0, 0, 35, 0, 3, 0, 0, 0,226, 0, 0, 0, 0, 0, 35, 0, 74, 0, 0, 0,226, 0, 0, 0, 0, 0, 35, 0,
+ 28, 0, 0, 0,227, 0, 0, 0, 0, 0, 35, 0, 74, 0, 0, 0,227, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,228, 0, 0, 0,
+ 0, 0, 35, 0, 75, 0, 0, 0,228, 0, 0, 0, 0, 0, 35, 0, 28, 0, 0, 0,229, 0, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0,
+229, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,230, 0, 0, 0, 0, 0, 35, 0, 76, 0, 0, 0,230, 0, 0, 0, 0, 0, 35, 0,
+ 29, 0, 0, 0,231, 0, 0, 0, 0, 0, 35, 0, 76, 0, 0, 0,231, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,232, 0, 0, 0,
+ 0, 0, 35, 0, 77, 0, 0, 0,232, 0, 0, 0, 0, 0, 35, 0, 29, 0, 0, 0,233, 0, 0, 0, 0, 0, 35, 0, 77, 0, 0, 0,
+233, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0,234, 0, 0, 0, 0, 0, 35, 0, 78, 0, 0, 0,234, 0, 0, 0, 0, 0, 35, 0,
+ 30, 0, 0, 0,235, 0, 0, 0, 0, 0, 35, 0, 78, 0, 0, 0,235, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0,236, 0, 0, 0,
+ 0, 0, 35, 0, 79, 0, 0, 0,236, 0, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0,237, 0, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0,
+237, 0, 0, 0, 0, 0, 35, 0, 5, 0, 0, 0,238, 0, 0, 0, 0, 0, 35, 0, 80, 0, 0, 0,238, 0, 0, 0, 0, 0, 35, 0,
+ 31, 0, 0, 0,239, 0, 0, 0, 0, 0, 35, 0, 80, 0, 0, 0,239, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0,240, 0, 0, 0,
+ 0, 0, 35, 0, 81, 0, 0, 0,240, 0, 0, 0, 0, 0, 35, 0, 31, 0, 0, 0,241, 0, 0, 0, 0, 0, 35, 0, 81, 0, 0, 0,
+241, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,242, 0, 0, 0, 0, 0, 35, 0, 82, 0, 0, 0,242, 0, 0, 0, 0, 0, 35, 0,
+ 32, 0, 0, 0,243, 0, 0, 0, 0, 0, 35, 0, 82, 0, 0, 0,243, 0, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0,244, 0, 0, 0,
+ 0, 0, 35, 0, 83, 0, 0, 0,244, 0, 0, 0, 0, 0, 35, 0, 32, 0, 0, 0,245, 0, 0, 0, 0, 0, 35, 0, 83, 0, 0, 0,
+245, 0, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0,246, 0, 0, 0, 0, 0, 35, 0, 84, 0, 0, 0,246, 0, 0, 0, 0, 0, 35, 0,
+ 33, 0, 0, 0,247, 0, 0, 0, 0, 0, 35, 0, 84, 0, 0, 0,247, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0,248, 0, 0, 0,
+ 0, 0, 35, 0, 85, 0, 0, 0,248, 0, 0, 0, 0, 0, 35, 0, 33, 0, 0, 0,249, 0, 0, 0, 0, 0, 35, 0, 85, 0, 0, 0,
+249, 0, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0,250, 0, 0, 0, 0, 0, 35, 0, 86, 0, 0, 0,250, 0, 0, 0, 0, 0, 35, 0,
+ 34, 0, 0, 0,251, 0, 0, 0, 0, 0, 35, 0, 86, 0, 0, 0,251, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,252, 0, 0, 0,
+ 0, 0, 35, 0, 87, 0, 0, 0,252, 0, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0,253, 0, 0, 0, 0, 0, 35, 0, 87, 0, 0, 0,
+253, 0, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0,254, 0, 0, 0, 0, 0, 35, 0, 88, 0, 0, 0,254, 0, 0, 0, 0, 0, 35, 0,
+ 35, 0, 0, 0,255, 0, 0, 0, 0, 0, 35, 0, 88, 0, 0, 0,255, 0, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 0, 1, 0, 0,
+ 0, 0, 35, 0, 89, 0, 0, 0, 0, 1, 0, 0, 0, 0, 35, 0, 35, 0, 0, 0, 1, 1, 0, 0, 0, 0, 35, 0, 89, 0, 0, 0,
+ 1, 1, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 2, 1, 0, 0, 0, 0, 35, 0, 90, 0, 0, 0, 2, 1, 0, 0, 0, 0, 35, 0,
+ 36, 0, 0, 0, 3, 1, 0, 0, 0, 0, 35, 0, 90, 0, 0, 0, 3, 1, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0, 4, 1, 0, 0,
+ 0, 0, 35, 0, 91, 0, 0, 0, 4, 1, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0, 5, 1, 0, 0, 0, 0, 35, 0, 91, 0, 0, 0,
+ 5, 1, 0, 0, 0, 0, 35, 0, 10, 0, 0, 0, 6, 1, 0, 0, 0, 0, 35, 0, 92, 0, 0, 0, 6, 1, 0, 0, 0, 0, 35, 0,
+ 37, 0, 0, 0, 7, 1, 0, 0, 0, 0, 35, 0, 92, 0, 0, 0, 7, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 8, 1, 0, 0,
+ 0, 0, 35, 0, 93, 0, 0, 0, 8, 1, 0, 0, 0, 0, 35, 0, 37, 0, 0, 0, 9, 1, 0, 0, 0, 0, 35, 0, 93, 0, 0, 0,
+ 9, 1, 0, 0, 0, 0, 35, 0, 6, 0, 0, 0, 10, 1, 0, 0, 0, 0, 35, 0, 94, 0, 0, 0, 10, 1, 0, 0, 0, 0, 35, 0,
+ 38, 0, 0, 0, 11, 1, 0, 0, 0, 0, 35, 0, 94, 0, 0, 0, 11, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 12, 1, 0, 0,
+ 0, 0, 35, 0, 95, 0, 0, 0, 12, 1, 0, 0, 0, 0, 35, 0, 38, 0, 0, 0, 13, 1, 0, 0, 0, 0, 35, 0, 95, 0, 0, 0,
+ 13, 1, 0, 0, 0, 0, 35, 0, 7, 0, 0, 0, 14, 1, 0, 0, 0, 0, 35, 0, 96, 0, 0, 0, 14, 1, 0, 0, 0, 0, 35, 0,
+ 39, 0, 0, 0, 15, 1, 0, 0, 0, 0, 35, 0, 96, 0, 0, 0, 15, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 16, 1, 0, 0,
+ 0, 0, 35, 0, 97, 0, 0, 0, 16, 1, 0, 0, 0, 0, 35, 0, 39, 0, 0, 0, 17, 1, 0, 0, 0, 0, 35, 0, 97, 0, 0, 0,
+ 17, 1, 0, 0, 0, 0, 35, 0, 8, 0, 0, 0, 18, 1, 0, 0, 0, 0, 35, 0, 98, 0, 0, 0, 18, 1, 0, 0, 0, 0, 35, 0,
+ 40, 0, 0, 0, 19, 1, 0, 0, 0, 0, 35, 0, 98, 0, 0, 0, 19, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 20, 1, 0, 0,
+ 0, 0, 35, 0, 99, 0, 0, 0, 20, 1, 0, 0, 0, 0, 35, 0, 40, 0, 0, 0, 21, 1, 0, 0, 0, 0, 35, 0, 99, 0, 0, 0,
+ 21, 1, 0, 0, 0, 0, 35, 0, 9, 0, 0, 0, 22, 1, 0, 0, 0, 0, 35, 0,100, 0, 0, 0, 22, 1, 0, 0, 0, 0, 35, 0,
+ 41, 0, 0, 0, 23, 1, 0, 0, 0, 0, 35, 0,100, 0, 0, 0, 23, 1, 0, 0, 0, 0, 35, 0, 11, 0, 0, 0, 24, 1, 0, 0,
+ 0, 0, 35, 0,101, 0, 0, 0, 24, 1, 0, 0, 0, 0, 35, 0, 41, 0, 0, 0, 25, 1, 0, 0, 0, 0, 35, 0,101, 0, 0, 0,
+ 25, 1, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0, 26, 1, 0, 0, 0, 0, 35, 0,102, 0, 0, 0, 26, 1, 0, 0, 0, 0, 35, 0,
+ 14, 0, 0, 0, 27, 1, 0, 0, 0, 0, 35, 0,102, 0, 0, 0, 27, 1, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0, 28, 1, 0, 0,
+ 0, 0, 35, 0,103, 0, 0, 0, 28, 1, 0, 0, 0, 0, 35, 0, 13, 0, 0, 0, 29, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0,
+ 29, 1, 0, 0, 0, 0, 35, 0, 13, 0, 0, 0, 30, 1, 0, 0, 0, 0, 35, 0,104, 0, 0, 0, 30, 1, 0, 0, 0, 0, 35, 0,
+ 14, 0, 0, 0, 31, 1, 0, 0, 0, 0, 35, 0,104, 0, 0, 0, 31, 1, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0, 32, 1, 0, 0,
+ 0, 0, 35, 0,105, 0, 0, 0, 32, 1, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 0,105, 0, 0, 0,
+ 33, 1, 0, 0, 0, 0, 35, 0, 12, 0, 0, 0, 34, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0, 34, 1, 0, 0, 0, 0, 35, 0,
+ 15, 0, 0, 0, 35, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0, 35, 1, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 36, 1, 0, 0,
+ 0, 0, 35, 0,107, 0, 0, 0, 36, 1, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0, 37, 1, 0, 0, 0, 0, 35, 0,107, 0, 0, 0,
+ 37, 1, 0, 0, 0, 0, 35, 0, 13, 0, 0, 0, 38, 1, 0, 0, 0, 0, 35, 0,108, 0, 0, 0, 38, 1, 0, 0, 0, 0, 35, 0,
+ 18, 0, 0, 0, 39, 1, 0, 0, 0, 0, 35, 0,108, 0, 0, 0, 39, 1, 0, 0, 0, 0, 35, 0, 13, 0, 0, 0, 40, 1, 0, 0,
+ 0, 0, 35, 0,109, 0, 0, 0, 40, 1, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 41, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0,
+ 41, 1, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 42, 1, 0, 0, 0, 0, 35, 0,110, 0, 0, 0, 42, 1, 0, 0, 0, 0, 35, 0,
+ 18, 0, 0, 0, 43, 1, 0, 0, 0, 0, 35, 0,110, 0, 0, 0, 43, 1, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 44, 1, 0, 0,
+ 0, 0, 35, 0,111, 0, 0, 0, 44, 1, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 45, 1, 0, 0, 0, 0, 35, 0,111, 0, 0, 0,
+ 45, 1, 0, 0, 0, 0, 35, 0, 17, 0, 0, 0, 46, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0, 46, 1, 0, 0, 0, 0, 35, 0,
+ 19, 0, 0, 0, 47, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0, 47, 1, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 48, 1, 0, 0,
+ 0, 0, 35, 0,113, 0, 0, 0, 48, 1, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 49, 1, 0, 0, 0, 0, 35, 0,113, 0, 0, 0,
+ 49, 1, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 50, 1, 0, 0, 0, 0, 35, 0,114, 0, 0, 0, 50, 1, 0, 0, 0, 0, 35, 0,
+ 21, 0, 0, 0, 51, 1, 0, 0, 0, 0, 35, 0,114, 0, 0, 0, 51, 1, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 52, 1, 0, 0,
+ 0, 0, 35, 0,115, 0, 0, 0, 52, 1, 0, 0, 0, 0, 35, 0, 19, 0, 0, 0, 53, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0,
+ 53, 1, 0, 0, 0, 0, 35, 0, 15, 0, 0, 0, 54, 1, 0, 0, 0, 0, 35, 0,116, 0, 0, 0, 54, 1, 0, 0, 0, 0, 35, 0,
+ 21, 0, 0, 0, 55, 1, 0, 0, 0, 0, 35, 0,116, 0, 0, 0, 55, 1, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0, 56, 1, 0, 0,
+ 0, 0, 35, 0,117, 0, 0, 0, 56, 1, 0, 0, 0, 0, 35, 0, 23, 0, 0, 0, 57, 1, 0, 0, 0, 0, 35, 0,117, 0, 0, 0,
+ 57, 1, 0, 0, 0, 0, 35, 0, 16, 0, 0, 0, 58, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0, 58, 1, 0, 0, 0, 0, 35, 0,
+ 22, 0, 0, 0, 59, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0, 59, 1, 0, 0, 0, 0, 35, 0, 22, 0, 0, 0, 60, 1, 0, 0,
+ 0, 0, 35, 0,119, 0, 0, 0, 60, 1, 0, 0, 0, 0, 35, 0, 23, 0, 0, 0, 61, 1, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,
+ 61, 1, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 62, 1, 0, 0, 0, 0, 35, 0,120, 0, 0, 0, 62, 1, 0, 0, 0, 0, 35, 0,
+ 25, 0, 0, 0, 63, 1, 0, 0, 0, 0, 35, 0,120, 0, 0, 0, 63, 1, 0, 0, 0, 0, 35, 0, 14, 0, 0, 0, 64, 1, 0, 0,
+ 0, 0, 35, 0,121, 0, 0, 0, 64, 1, 0, 0, 0, 0, 35, 0, 24, 0, 0, 0, 65, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0,
+ 65, 1, 0, 0, 0, 0, 35, 0, 24, 0, 0, 0, 66, 1, 0, 0, 0, 0, 35, 0,122, 0, 0, 0, 66, 1, 0, 0, 0, 0, 35, 0,
+ 25, 0, 0, 0, 67, 1, 0, 0, 0, 0, 35, 0,122, 0, 0, 0, 67, 1, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 68, 1, 0, 0,
+ 0, 0, 35, 0,123, 0, 0, 0, 68, 1, 0, 0, 0, 0, 35, 0, 27, 0, 0, 0, 69, 1, 0, 0, 0, 0, 35, 0,123, 0, 0, 0,
+ 69, 1, 0, 0, 0, 0, 35, 0, 18, 0, 0, 0, 70, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0, 70, 1, 0, 0, 0, 0, 35, 0,
+ 26, 0, 0, 0, 71, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0, 71, 1, 0, 0, 0, 0, 35, 0, 26, 0, 0, 0, 72, 1, 0, 0,
+ 0, 0, 35, 0,125, 0, 0, 0, 72, 1, 0, 0, 0, 0, 35, 0, 27, 0, 0, 0, 73, 1, 0, 0, 0, 0, 35, 0,125, 0, 0, 0,
+ 73, 1, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 74, 1, 0, 0, 0, 0, 35, 0,126, 0, 0, 0, 74, 1, 0, 0, 0, 0, 35, 0,
+ 29, 0, 0, 0, 75, 1, 0, 0, 0, 0, 35, 0,126, 0, 0, 0, 75, 1, 0, 0, 0, 0, 35, 0, 20, 0, 0, 0, 76, 1, 0, 0,
+ 0, 0, 35, 0,127, 0, 0, 0, 76, 1, 0, 0, 0, 0, 35, 0, 28, 0, 0, 0, 77, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0,
+ 77, 1, 0, 0, 0, 0, 35, 0, 28, 0, 0, 0, 78, 1, 0, 0, 0, 0, 35, 0,128, 0, 0, 0, 78, 1, 0, 0, 0, 0, 35, 0,
+ 29, 0, 0, 0, 79, 1, 0, 0, 0, 0, 35, 0,128, 0, 0, 0, 79, 1, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 80, 1, 0, 0,
+ 0, 0, 35, 0,129, 0, 0, 0, 80, 1, 0, 0, 0, 0, 35, 0, 31, 0, 0, 0, 81, 1, 0, 0, 0, 0, 35, 0,129, 0, 0, 0,
+ 81, 1, 0, 0, 0, 0, 35, 0, 21, 0, 0, 0, 82, 1, 0, 0, 0, 0, 35, 0,130, 0, 0, 0, 82, 1, 0, 0, 0, 0, 35, 0,
+ 30, 0, 0, 0, 83, 1, 0, 0, 0, 0, 35, 0,130, 0, 0, 0, 83, 1, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0, 84, 1, 0, 0,
+ 0, 0, 35, 0,131, 0, 0, 0, 84, 1, 0, 0, 0, 0, 35, 0, 31, 0, 0, 0, 85, 1, 0, 0, 0, 0, 35, 0,131, 0, 0, 0,
+ 85, 1, 0, 0, 0, 0, 35, 0, 23, 0, 0, 0, 86, 1, 0, 0, 0, 0, 35, 0,132, 0, 0, 0, 86, 1, 0, 0, 0, 0, 35, 0,
+ 32, 0, 0, 0, 87, 1, 0, 0, 0, 0, 35, 0,132, 0, 0, 0, 87, 1, 0, 0, 0, 0, 35, 0, 23, 0, 0, 0, 88, 1, 0, 0,
+ 0, 0, 35, 0,133, 0, 0, 0, 88, 1, 0, 0, 0, 0, 35, 0, 24, 0, 0, 0, 89, 1, 0, 0, 0, 0, 35, 0,133, 0, 0, 0,
+ 89, 1, 0, 0, 0, 0, 35, 0, 24, 0, 0, 0, 90, 1, 0, 0, 0, 0, 35, 0,134, 0, 0, 0, 90, 1, 0, 0, 0, 0, 35, 0,
+ 32, 0, 0, 0, 91, 1, 0, 0, 0, 0, 35, 0,134, 0, 0, 0, 91, 1, 0, 0, 0, 0, 35, 0, 25, 0, 0, 0, 92, 1, 0, 0,
+ 0, 0, 35, 0,135, 0, 0, 0, 92, 1, 0, 0, 0, 0, 35, 0, 33, 0, 0, 0, 93, 1, 0, 0, 0, 0, 35, 0,135, 0, 0, 0,
+ 93, 1, 0, 0, 0, 0, 35, 0, 25, 0, 0, 0, 94, 1, 0, 0, 0, 0, 35, 0,136, 0, 0, 0, 94, 1, 0, 0, 0, 0, 35, 0,
+ 26, 0, 0, 0, 95, 1, 0, 0, 0, 0, 35, 0,136, 0, 0, 0, 95, 1, 0, 0, 0, 0, 35, 0, 26, 0, 0, 0, 96, 1, 0, 0,
+ 0, 0, 35, 0,137, 0, 0, 0, 96, 1, 0, 0, 0, 0, 35, 0, 33, 0, 0, 0, 97, 1, 0, 0, 0, 0, 35, 0,137, 0, 0, 0,
+ 97, 1, 0, 0, 0, 0, 35, 0, 27, 0, 0, 0, 98, 1, 0, 0, 0, 0, 35, 0,138, 0, 0, 0, 98, 1, 0, 0, 0, 0, 35, 0,
+ 34, 0, 0, 0, 99, 1, 0, 0, 0, 0, 35, 0,138, 0, 0, 0, 99, 1, 0, 0, 0, 0, 35, 0, 27, 0, 0, 0,100, 1, 0, 0,
+ 0, 0, 35, 0,139, 0, 0, 0,100, 1, 0, 0, 0, 0, 35, 0, 28, 0, 0, 0,101, 1, 0, 0, 0, 0, 35, 0,139, 0, 0, 0,
+101, 1, 0, 0, 0, 0, 35, 0, 28, 0, 0, 0,102, 1, 0, 0, 0, 0, 35, 0,140, 0, 0, 0,102, 1, 0, 0, 0, 0, 35, 0,
+ 34, 0, 0, 0,103, 1, 0, 0, 0, 0, 35, 0,140, 0, 0, 0,103, 1, 0, 0, 0, 0, 35, 0, 29, 0, 0, 0,104, 1, 0, 0,
+ 0, 0, 35, 0,141, 0, 0, 0,104, 1, 0, 0, 0, 0, 35, 0, 35, 0, 0, 0,105, 1, 0, 0, 0, 0, 35, 0,141, 0, 0, 0,
+105, 1, 0, 0, 0, 0, 35, 0, 29, 0, 0, 0,106, 1, 0, 0, 0, 0, 35, 0,142, 0, 0, 0,106, 1, 0, 0, 0, 0, 35, 0,
+ 30, 0, 0, 0,107, 1, 0, 0, 0, 0, 35, 0,142, 0, 0, 0,107, 1, 0, 0, 0, 0, 35, 0, 30, 0, 0, 0,108, 1, 0, 0,
+ 0, 0, 35, 0,143, 0, 0, 0,108, 1, 0, 0, 0, 0, 35, 0, 35, 0, 0, 0,109, 1, 0, 0, 0, 0, 35, 0,143, 0, 0, 0,
+109, 1, 0, 0, 0, 0, 35, 0, 31, 0, 0, 0,110, 1, 0, 0, 0, 0, 35, 0,144, 0, 0, 0,110, 1, 0, 0, 0, 0, 35, 0,
+ 36, 0, 0, 0,111, 1, 0, 0, 0, 0, 35, 0,144, 0, 0, 0,111, 1, 0, 0, 0, 0, 35, 0, 22, 0, 0, 0,112, 1, 0, 0,
+ 0, 0, 35, 0,145, 0, 0, 0,112, 1, 0, 0, 0, 0, 35, 0, 31, 0, 0, 0,113, 1, 0, 0, 0, 0, 35, 0,145, 0, 0, 0,
+113, 1, 0, 0, 0, 0, 35, 0, 22, 0, 0, 0,114, 1, 0, 0, 0, 0, 35, 0,146, 0, 0, 0,114, 1, 0, 0, 0, 0, 35, 0,
+ 36, 0, 0, 0,115, 1, 0, 0, 0, 0, 35, 0,146, 0, 0, 0,115, 1, 0, 0, 0, 0, 35, 0, 32, 0, 0, 0,116, 1, 0, 0,
+ 0, 0, 35, 0,147, 0, 0, 0,116, 1, 0, 0, 0, 0, 35, 0, 38, 0, 0, 0,117, 1, 0, 0, 0, 0, 35, 0,147, 0, 0, 0,
+117, 1, 0, 0, 0, 0, 35, 0, 32, 0, 0, 0,118, 1, 0, 0, 0, 0, 35, 0,148, 0, 0, 0,118, 1, 0, 0, 0, 0, 35, 0,
+ 37, 0, 0, 0,119, 1, 0, 0, 0, 0, 35, 0,148, 0, 0, 0,119, 1, 0, 0, 0, 0, 35, 0, 37, 0, 0, 0,120, 1, 0, 0,
+ 0, 0, 35, 0,149, 0, 0, 0,120, 1, 0, 0, 0, 0, 35, 0, 38, 0, 0, 0,121, 1, 0, 0, 0, 0, 35, 0,149, 0, 0, 0,
+121, 1, 0, 0, 0, 0, 35, 0, 33, 0, 0, 0,122, 1, 0, 0, 0, 0, 35, 0,150, 0, 0, 0,122, 1, 0, 0, 0, 0, 35, 0,
+ 39, 0, 0, 0,123, 1, 0, 0, 0, 0, 35, 0,150, 0, 0, 0,123, 1, 0, 0, 0, 0, 35, 0, 33, 0, 0, 0,124, 1, 0, 0,
+ 0, 0, 35, 0,151, 0, 0, 0,124, 1, 0, 0, 0, 0, 35, 0, 38, 0, 0, 0,125, 1, 0, 0, 0, 0, 35, 0,151, 0, 0, 0,
+125, 1, 0, 0, 0, 0, 35, 0, 38, 0, 0, 0,126, 1, 0, 0, 0, 0, 35, 0,152, 0, 0, 0,126, 1, 0, 0, 0, 0, 35, 0,
+ 39, 0, 0, 0,127, 1, 0, 0, 0, 0, 35, 0,152, 0, 0, 0,127, 1, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0,128, 1, 0, 0,
+ 0, 0, 35, 0,153, 0, 0, 0,128, 1, 0, 0, 0, 0, 35, 0, 40, 0, 0, 0,129, 1, 0, 0, 0, 0, 35, 0,153, 0, 0, 0,
+129, 1, 0, 0, 0, 0, 35, 0, 34, 0, 0, 0,130, 1, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,130, 1, 0, 0, 0, 0, 35, 0,
+ 39, 0, 0, 0,131, 1, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,131, 1, 0, 0, 0, 0, 35, 0, 39, 0, 0, 0,132, 1, 0, 0,
+ 0, 0, 35, 0,155, 0, 0, 0,132, 1, 0, 0, 0, 0, 35, 0, 40, 0, 0, 0,133, 1, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,
+133, 1, 0, 0, 0, 0, 35, 0, 35, 0, 0, 0,134, 1, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,134, 1, 0, 0, 0, 0, 35, 0,
+ 41, 0, 0, 0,135, 1, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,135, 1, 0, 0, 0, 0, 35, 0, 35, 0, 0, 0,136, 1, 0, 0,
+ 0, 0, 35, 0,157, 0, 0, 0,136, 1, 0, 0, 0, 0, 35, 0, 40, 0, 0, 0,137, 1, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,
+137, 1, 0, 0, 0, 0, 35, 0, 40, 0, 0, 0,138, 1, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,138, 1, 0, 0, 0, 0, 35, 0,
+ 41, 0, 0, 0,139, 1, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,139, 1, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0,140, 1, 0, 0,
+ 0, 0, 35, 0,159, 0, 0, 0,140, 1, 0, 0, 0, 0, 35, 0, 37, 0, 0, 0,141, 1, 0, 0, 0, 0, 35, 0,159, 0, 0, 0,
+141, 1, 0, 0, 0, 0, 35, 0, 36, 0, 0, 0,142, 1, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,142, 1, 0, 0, 0, 0, 35, 0,
+ 41, 0, 0, 0,143, 1, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,143, 1, 0, 0, 0, 0, 35, 0, 37, 0, 0, 0,144, 1, 0, 0,
+ 0, 0, 35, 0,161, 0, 0, 0,144, 1, 0, 0, 0, 0, 35, 0, 41, 0, 0, 0,145, 1, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,
+145, 1, 0, 0, 0, 0, 35, 0, 46, 0, 0, 0,146, 1, 0, 0, 0, 0, 35, 0,102, 0, 0, 0,146, 1, 0, 0, 0, 0, 35, 0,
+ 43, 0, 0, 0,147, 1, 0, 0, 0, 0, 33, 0, 46, 0, 0, 0,147, 1, 0, 0, 0, 0, 33, 0, 43, 0, 0, 0,148, 1, 0, 0,
+ 0, 0, 35, 0,102, 0, 0, 0,148, 1, 0, 0, 0, 0, 35, 0,102, 0, 0, 0,149, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0,
+149, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0,150, 1, 0, 0, 0, 0, 35, 0,104, 0, 0, 0,150, 1, 0, 0, 0, 0, 35, 0,
+102, 0, 0, 0,151, 1, 0, 0, 0, 0, 35, 0,104, 0, 0, 0,151, 1, 0, 0, 0, 0, 35, 0, 45, 0, 0, 0,152, 1, 0, 0,
+ 0, 0, 33, 0, 47, 0, 0, 0,152, 1, 0, 0, 0, 0, 33, 0, 47, 0, 0, 0,153, 1, 0, 0, 0, 0, 35, 0,104, 0, 0, 0,
+153, 1, 0, 0, 0, 0, 35, 0, 45, 0, 0, 0,154, 1, 0, 0, 0, 0, 35, 0,104, 0, 0, 0,154, 1, 0, 0, 0, 0, 35, 0,
+ 44, 0, 0, 0,155, 1, 0, 0, 0, 0, 35, 0,103, 0, 0, 0,155, 1, 0, 0, 0, 0, 35, 0, 42, 0, 0, 0,156, 1, 0, 0,
+ 0, 0, 35, 0,103, 0, 0, 0,156, 1, 0, 0, 0, 0, 35, 0, 42, 0, 0, 0,157, 1, 0, 0, 0, 0, 33, 0, 44, 0, 0, 0,
+157, 1, 0, 0, 0, 0, 33, 0, 50, 0, 0, 0,158, 1, 0, 0, 0, 0, 35, 0,105, 0, 0, 0,158, 1, 0, 0, 0, 0, 35, 0,
+ 43, 0, 0, 0,159, 1, 0, 0, 0, 0, 33, 0, 50, 0, 0, 0,159, 1, 0, 0, 0, 0, 33, 0, 43, 0, 0, 0,160, 1, 0, 0,
+ 0, 0, 35, 0,105, 0, 0, 0,160, 1, 0, 0, 0, 0, 35, 0,105, 0, 0, 0,161, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0,
+161, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0,162, 1, 0, 0, 0, 0, 35, 0,107, 0, 0, 0,162, 1, 0, 0, 0, 0, 35, 0,
+105, 0, 0, 0,163, 1, 0, 0, 0, 0, 35, 0,107, 0, 0, 0,163, 1, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,164, 1, 0, 0,
+ 0, 0, 33, 0, 51, 0, 0, 0,164, 1, 0, 0, 0, 0, 33, 0, 51, 0, 0, 0,165, 1, 0, 0, 0, 0, 35, 0,107, 0, 0, 0,
+165, 1, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,166, 1, 0, 0, 0, 0, 35, 0,107, 0, 0, 0,166, 1, 0, 0, 0, 0, 35, 0,
+ 48, 0, 0, 0,167, 1, 0, 0, 0, 0, 35, 0,106, 0, 0, 0,167, 1, 0, 0, 0, 0, 35, 0, 42, 0, 0, 0,168, 1, 0, 0,
+ 0, 0, 35, 0,106, 0, 0, 0,168, 1, 0, 0, 0, 0, 35, 0, 42, 0, 0, 0,169, 1, 0, 0, 0, 0, 33, 0, 48, 0, 0, 0,
+169, 1, 0, 0, 0, 0, 33, 0, 54, 0, 0, 0,170, 1, 0, 0, 0, 0, 35, 0,108, 0, 0, 0,170, 1, 0, 0, 0, 0, 35, 0,
+ 45, 0, 0, 0,171, 1, 0, 0, 0, 0, 33, 0, 54, 0, 0, 0,171, 1, 0, 0, 0, 0, 33, 0, 45, 0, 0, 0,172, 1, 0, 0,
+ 0, 0, 35, 0,108, 0, 0, 0,172, 1, 0, 0, 0, 0, 35, 0,108, 0, 0, 0,173, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0,
+173, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0,174, 1, 0, 0, 0, 0, 35, 0,110, 0, 0, 0,174, 1, 0, 0, 0, 0, 35, 0,
+108, 0, 0, 0,175, 1, 0, 0, 0, 0, 35, 0,110, 0, 0, 0,175, 1, 0, 0, 0, 0, 35, 0, 53, 0, 0, 0,176, 1, 0, 0,
+ 0, 0, 33, 0, 55, 0, 0, 0,176, 1, 0, 0, 0, 0, 33, 0, 55, 0, 0, 0,177, 1, 0, 0, 0, 0, 35, 0,110, 0, 0, 0,
+177, 1, 0, 0, 0, 0, 35, 0, 53, 0, 0, 0,178, 1, 0, 0, 0, 0, 35, 0,110, 0, 0, 0,178, 1, 0, 0, 0, 0, 35, 0,
+ 52, 0, 0, 0,179, 1, 0, 0, 0, 0, 35, 0,109, 0, 0, 0,179, 1, 0, 0, 0, 0, 35, 0, 44, 0, 0, 0,180, 1, 0, 0,
+ 0, 0, 35, 0,109, 0, 0, 0,180, 1, 0, 0, 0, 0, 35, 0, 44, 0, 0, 0,181, 1, 0, 0, 0, 0, 33, 0, 52, 0, 0, 0,
+181, 1, 0, 0, 0, 0, 33, 0, 58, 0, 0, 0,182, 1, 0, 0, 0, 0, 35, 0,111, 0, 0, 0,182, 1, 0, 0, 0, 0, 35, 0,
+ 53, 0, 0, 0,183, 1, 0, 0, 0, 0, 33, 0, 58, 0, 0, 0,183, 1, 0, 0, 0, 0, 33, 0, 53, 0, 0, 0,184, 1, 0, 0,
+ 0, 0, 35, 0,111, 0, 0, 0,184, 1, 0, 0, 0, 0, 35, 0,111, 0, 0, 0,185, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,
+185, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,186, 1, 0, 0, 0, 0, 35, 0,113, 0, 0, 0,186, 1, 0, 0, 0, 0, 35, 0,
+111, 0, 0, 0,187, 1, 0, 0, 0, 0, 35, 0,113, 0, 0, 0,187, 1, 0, 0, 0, 0, 35, 0, 57, 0, 0, 0,188, 1, 0, 0,
+ 0, 0, 33, 0, 59, 0, 0, 0,188, 1, 0, 0, 0, 0, 33, 0, 59, 0, 0, 0,189, 1, 0, 0, 0, 0, 35, 0,113, 0, 0, 0,
+189, 1, 0, 0, 0, 0, 35, 0, 57, 0, 0, 0,190, 1, 0, 0, 0, 0, 35, 0,113, 0, 0, 0,190, 1, 0, 0, 0, 0, 35, 0,
+ 56, 0, 0, 0,191, 1, 0, 0, 0, 0, 35, 0,112, 0, 0, 0,191, 1, 0, 0, 0, 0, 35, 0, 52, 0, 0, 0,192, 1, 0, 0,
+ 0, 0, 35, 0,112, 0, 0, 0,192, 1, 0, 0, 0, 0, 35, 0, 52, 0, 0, 0,193, 1, 0, 0, 0, 0, 33, 0, 56, 0, 0, 0,
+193, 1, 0, 0, 0, 0, 33, 0, 60, 0, 0, 0,194, 1, 0, 0, 0, 0, 35, 0,114, 0, 0, 0,194, 1, 0, 0, 0, 0, 35, 0,
+ 57, 0, 0, 0,195, 1, 0, 0, 0, 0, 33, 0, 60, 0, 0, 0,195, 1, 0, 0, 0, 0, 33, 0, 57, 0, 0, 0,196, 1, 0, 0,
+ 0, 0, 35, 0,114, 0, 0, 0,196, 1, 0, 0, 0, 0, 35, 0,114, 0, 0, 0,197, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0,
+197, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0,198, 1, 0, 0, 0, 0, 35, 0,116, 0, 0, 0,198, 1, 0, 0, 0, 0, 35, 0,
+114, 0, 0, 0,199, 1, 0, 0, 0, 0, 35, 0,116, 0, 0, 0,199, 1, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,200, 1, 0, 0,
+ 0, 0, 33, 0, 61, 0, 0, 0,200, 1, 0, 0, 0, 0, 33, 0, 61, 0, 0, 0,201, 1, 0, 0, 0, 0, 35, 0,116, 0, 0, 0,
+201, 1, 0, 0, 0, 0, 35, 0, 49, 0, 0, 0,202, 1, 0, 0, 0, 0, 35, 0,116, 0, 0, 0,202, 1, 0, 0, 0, 0, 35, 0,
+ 48, 0, 0, 0,203, 1, 0, 0, 0, 0, 35, 0,115, 0, 0, 0,203, 1, 0, 0, 0, 0, 35, 0, 56, 0, 0, 0,204, 1, 0, 0,
+ 0, 0, 35, 0,115, 0, 0, 0,204, 1, 0, 0, 0, 0, 35, 0, 48, 0, 0, 0,205, 1, 0, 0, 0, 0, 33, 0, 56, 0, 0, 0,
+205, 1, 0, 0, 0, 0, 33, 0, 64, 0, 0, 0,206, 1, 0, 0, 0, 0, 35, 0,117, 0, 0, 0,206, 1, 0, 0, 0, 0, 35, 0,
+ 50, 0, 0, 0,207, 1, 0, 0, 0, 0, 33, 0, 64, 0, 0, 0,207, 1, 0, 0, 0, 0, 33, 0, 50, 0, 0, 0,208, 1, 0, 0,
+ 0, 0, 35, 0,117, 0, 0, 0,208, 1, 0, 0, 0, 0, 35, 0,117, 0, 0, 0,209, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0,
+209, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0,210, 1, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,210, 1, 0, 0, 0, 0, 35, 0,
+117, 0, 0, 0,211, 1, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,211, 1, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0,212, 1, 0, 0,
+ 0, 0, 33, 0, 65, 0, 0, 0,212, 1, 0, 0, 0, 0, 33, 0, 65, 0, 0, 0,213, 1, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,
+213, 1, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0,214, 1, 0, 0, 0, 0, 35, 0,119, 0, 0, 0,214, 1, 0, 0, 0, 0, 35, 0,
+ 62, 0, 0, 0,215, 1, 0, 0, 0, 0, 35, 0,118, 0, 0, 0,215, 1, 0, 0, 0, 0, 35, 0, 51, 0, 0, 0,216, 1, 0, 0,
+ 0, 0, 35, 0,118, 0, 0, 0,216, 1, 0, 0, 0, 0, 35, 0, 51, 0, 0, 0,217, 1, 0, 0, 0, 0, 33, 0, 62, 0, 0, 0,
+217, 1, 0, 0, 0, 0, 33, 0, 68, 0, 0, 0,218, 1, 0, 0, 0, 0, 35, 0,120, 0, 0, 0,218, 1, 0, 0, 0, 0, 35, 0,
+ 47, 0, 0, 0,219, 1, 0, 0, 0, 0, 33, 0, 68, 0, 0, 0,219, 1, 0, 0, 0, 0, 33, 0, 47, 0, 0, 0,220, 1, 0, 0,
+ 0, 0, 35, 0,120, 0, 0, 0,220, 1, 0, 0, 0, 0, 35, 0,120, 0, 0, 0,221, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0,
+221, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0,222, 1, 0, 0, 0, 0, 35, 0,122, 0, 0, 0,222, 1, 0, 0, 0, 0, 35, 0,
+120, 0, 0, 0,223, 1, 0, 0, 0, 0, 35, 0,122, 0, 0, 0,223, 1, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0,224, 1, 0, 0,
+ 0, 0, 33, 0, 69, 0, 0, 0,224, 1, 0, 0, 0, 0, 33, 0, 69, 0, 0, 0,225, 1, 0, 0, 0, 0, 35, 0,122, 0, 0, 0,
+225, 1, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0,226, 1, 0, 0, 0, 0, 35, 0,122, 0, 0, 0,226, 1, 0, 0, 0, 0, 35, 0,
+ 66, 0, 0, 0,227, 1, 0, 0, 0, 0, 35, 0,121, 0, 0, 0,227, 1, 0, 0, 0, 0, 35, 0, 46, 0, 0, 0,228, 1, 0, 0,
+ 0, 0, 35, 0,121, 0, 0, 0,228, 1, 0, 0, 0, 0, 35, 0, 46, 0, 0, 0,229, 1, 0, 0, 0, 0, 33, 0, 66, 0, 0, 0,
+229, 1, 0, 0, 0, 0, 33, 0, 72, 0, 0, 0,230, 1, 0, 0, 0, 0, 35, 0,123, 0, 0, 0,230, 1, 0, 0, 0, 0, 35, 0,
+ 55, 0, 0, 0,231, 1, 0, 0, 0, 0, 33, 0, 72, 0, 0, 0,231, 1, 0, 0, 0, 0, 33, 0, 55, 0, 0, 0,232, 1, 0, 0,
+ 0, 0, 35, 0,123, 0, 0, 0,232, 1, 0, 0, 0, 0, 35, 0,123, 0, 0, 0,233, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0,
+233, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0,234, 1, 0, 0, 0, 0, 35, 0,125, 0, 0, 0,234, 1, 0, 0, 0, 0, 35, 0,
+123, 0, 0, 0,235, 1, 0, 0, 0, 0, 35, 0,125, 0, 0, 0,235, 1, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0,236, 1, 0, 0,
+ 0, 0, 33, 0, 73, 0, 0, 0,236, 1, 0, 0, 0, 0, 33, 0, 73, 0, 0, 0,237, 1, 0, 0, 0, 0, 35, 0,125, 0, 0, 0,
+237, 1, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0,238, 1, 0, 0, 0, 0, 35, 0,125, 0, 0, 0,238, 1, 0, 0, 0, 0, 35, 0,
+ 70, 0, 0, 0,239, 1, 0, 0, 0, 0, 35, 0,124, 0, 0, 0,239, 1, 0, 0, 0, 0, 35, 0, 54, 0, 0, 0,240, 1, 0, 0,
+ 0, 0, 35, 0,124, 0, 0, 0,240, 1, 0, 0, 0, 0, 35, 0, 54, 0, 0, 0,241, 1, 0, 0, 0, 0, 33, 0, 70, 0, 0, 0,
+241, 1, 0, 0, 0, 0, 33, 0, 76, 0, 0, 0,242, 1, 0, 0, 0, 0, 35, 0,126, 0, 0, 0,242, 1, 0, 0, 0, 0, 35, 0,
+ 59, 0, 0, 0,243, 1, 0, 0, 0, 0, 33, 0, 76, 0, 0, 0,243, 1, 0, 0, 0, 0, 33, 0, 59, 0, 0, 0,244, 1, 0, 0,
+ 0, 0, 35, 0,126, 0, 0, 0,244, 1, 0, 0, 0, 0, 35, 0,126, 0, 0, 0,245, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0,
+245, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0,246, 1, 0, 0, 0, 0, 35, 0,128, 0, 0, 0,246, 1, 0, 0, 0, 0, 35, 0,
+126, 0, 0, 0,247, 1, 0, 0, 0, 0, 35, 0,128, 0, 0, 0,247, 1, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0,248, 1, 0, 0,
+ 0, 0, 33, 0, 77, 0, 0, 0,248, 1, 0, 0, 0, 0, 33, 0, 77, 0, 0, 0,249, 1, 0, 0, 0, 0, 35, 0,128, 0, 0, 0,
+249, 1, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0,250, 1, 0, 0, 0, 0, 35, 0,128, 0, 0, 0,250, 1, 0, 0, 0, 0, 35, 0,
+ 74, 0, 0, 0,251, 1, 0, 0, 0, 0, 35, 0,127, 0, 0, 0,251, 1, 0, 0, 0, 0, 35, 0, 58, 0, 0, 0,252, 1, 0, 0,
+ 0, 0, 35, 0,127, 0, 0, 0,252, 1, 0, 0, 0, 0, 35, 0, 58, 0, 0, 0,253, 1, 0, 0, 0, 0, 33, 0, 74, 0, 0, 0,
+253, 1, 0, 0, 0, 0, 33, 0, 80, 0, 0, 0,254, 1, 0, 0, 0, 0, 35, 0,129, 0, 0, 0,254, 1, 0, 0, 0, 0, 35, 0,
+ 61, 0, 0, 0,255, 1, 0, 0, 0, 0, 33, 0, 80, 0, 0, 0,255, 1, 0, 0, 0, 0, 33, 0, 61, 0, 0, 0, 0, 2, 0, 0,
+ 0, 0, 35, 0,129, 0, 0, 0, 0, 2, 0, 0, 0, 0, 35, 0,129, 0, 0, 0, 1, 2, 0, 0, 0, 0, 35, 0,130, 0, 0, 0,
+ 1, 2, 0, 0, 0, 0, 35, 0,130, 0, 0, 0, 2, 2, 0, 0, 0, 0, 35, 0,131, 0, 0, 0, 2, 2, 0, 0, 0, 0, 35, 0,
+129, 0, 0, 0, 3, 2, 0, 0, 0, 0, 35, 0,131, 0, 0, 0, 3, 2, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0, 4, 2, 0, 0,
+ 0, 0, 33, 0, 81, 0, 0, 0, 4, 2, 0, 0, 0, 0, 33, 0, 81, 0, 0, 0, 5, 2, 0, 0, 0, 0, 35, 0,131, 0, 0, 0,
+ 5, 2, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0, 6, 2, 0, 0, 0, 0, 35, 0,131, 0, 0, 0, 6, 2, 0, 0, 0, 0, 35, 0,
+ 78, 0, 0, 0, 7, 2, 0, 0, 0, 0, 35, 0,130, 0, 0, 0, 7, 2, 0, 0, 0, 0, 35, 0, 60, 0, 0, 0, 8, 2, 0, 0,
+ 0, 0, 35, 0,130, 0, 0, 0, 8, 2, 0, 0, 0, 0, 35, 0, 60, 0, 0, 0, 9, 2, 0, 0, 0, 0, 33, 0, 78, 0, 0, 0,
+ 9, 2, 0, 0, 0, 0, 33, 0, 83, 0, 0, 0, 10, 2, 0, 0, 0, 0, 35, 0,132, 0, 0, 0, 10, 2, 0, 0, 0, 0, 35, 0,
+ 65, 0, 0, 0, 11, 2, 0, 0, 0, 0, 33, 0, 83, 0, 0, 0, 11, 2, 0, 0, 0, 0, 33, 0, 65, 0, 0, 0, 12, 2, 0, 0,
+ 0, 0, 35, 0,132, 0, 0, 0, 12, 2, 0, 0, 0, 0, 35, 0,132, 0, 0, 0, 13, 2, 0, 0, 0, 0, 35, 0,133, 0, 0, 0,
+ 13, 2, 0, 0, 0, 0, 35, 0,133, 0, 0, 0, 14, 2, 0, 0, 0, 0, 35, 0,134, 0, 0, 0, 14, 2, 0, 0, 0, 0, 35, 0,
+132, 0, 0, 0, 15, 2, 0, 0, 0, 0, 35, 0,134, 0, 0, 0, 15, 2, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0, 16, 2, 0, 0,
+ 0, 0, 33, 0, 82, 0, 0, 0, 16, 2, 0, 0, 0, 0, 33, 0, 82, 0, 0, 0, 17, 2, 0, 0, 0, 0, 35, 0,134, 0, 0, 0,
+ 17, 2, 0, 0, 0, 0, 35, 0, 67, 0, 0, 0, 18, 2, 0, 0, 0, 0, 35, 0,134, 0, 0, 0, 18, 2, 0, 0, 0, 0, 35, 0,
+ 66, 0, 0, 0, 19, 2, 0, 0, 0, 0, 35, 0,133, 0, 0, 0, 19, 2, 0, 0, 0, 0, 35, 0, 64, 0, 0, 0, 20, 2, 0, 0,
+ 0, 0, 35, 0,133, 0, 0, 0, 20, 2, 0, 0, 0, 0, 35, 0, 64, 0, 0, 0, 21, 2, 0, 0, 0, 0, 33, 0, 66, 0, 0, 0,
+ 21, 2, 0, 0, 0, 0, 33, 0, 84, 0, 0, 0, 22, 2, 0, 0, 0, 0, 35, 0,135, 0, 0, 0, 22, 2, 0, 0, 0, 0, 35, 0,
+ 69, 0, 0, 0, 23, 2, 0, 0, 0, 0, 33, 0, 84, 0, 0, 0, 23, 2, 0, 0, 0, 0, 33, 0, 69, 0, 0, 0, 24, 2, 0, 0,
+ 0, 0, 35, 0,135, 0, 0, 0, 24, 2, 0, 0, 0, 0, 35, 0,135, 0, 0, 0, 25, 2, 0, 0, 0, 0, 35, 0,136, 0, 0, 0,
+ 25, 2, 0, 0, 0, 0, 35, 0,136, 0, 0, 0, 26, 2, 0, 0, 0, 0, 35, 0,137, 0, 0, 0, 26, 2, 0, 0, 0, 0, 35, 0,
+135, 0, 0, 0, 27, 2, 0, 0, 0, 0, 35, 0,137, 0, 0, 0, 27, 2, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0, 28, 2, 0, 0,
+ 0, 0, 33, 0, 85, 0, 0, 0, 28, 2, 0, 0, 0, 0, 33, 0, 85, 0, 0, 0, 29, 2, 0, 0, 0, 0, 35, 0,137, 0, 0, 0,
+ 29, 2, 0, 0, 0, 0, 35, 0, 71, 0, 0, 0, 30, 2, 0, 0, 0, 0, 35, 0,137, 0, 0, 0, 30, 2, 0, 0, 0, 0, 35, 0,
+ 70, 0, 0, 0, 31, 2, 0, 0, 0, 0, 35, 0,136, 0, 0, 0, 31, 2, 0, 0, 0, 0, 35, 0, 68, 0, 0, 0, 32, 2, 0, 0,
+ 0, 0, 35, 0,136, 0, 0, 0, 32, 2, 0, 0, 0, 0, 35, 0, 68, 0, 0, 0, 33, 2, 0, 0, 0, 0, 33, 0, 70, 0, 0, 0,
+ 33, 2, 0, 0, 0, 0, 33, 0, 86, 0, 0, 0, 34, 2, 0, 0, 0, 0, 35, 0,138, 0, 0, 0, 34, 2, 0, 0, 0, 0, 35, 0,
+ 73, 0, 0, 0, 35, 2, 0, 0, 0, 0, 33, 0, 86, 0, 0, 0, 35, 2, 0, 0, 0, 0, 33, 0, 73, 0, 0, 0, 36, 2, 0, 0,
+ 0, 0, 35, 0,138, 0, 0, 0, 36, 2, 0, 0, 0, 0, 35, 0,138, 0, 0, 0, 37, 2, 0, 0, 0, 0, 35, 0,139, 0, 0, 0,
+ 37, 2, 0, 0, 0, 0, 35, 0,139, 0, 0, 0, 38, 2, 0, 0, 0, 0, 35, 0,140, 0, 0, 0, 38, 2, 0, 0, 0, 0, 35, 0,
+138, 0, 0, 0, 39, 2, 0, 0, 0, 0, 35, 0,140, 0, 0, 0, 39, 2, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0, 40, 2, 0, 0,
+ 0, 0, 33, 0, 87, 0, 0, 0, 40, 2, 0, 0, 0, 0, 33, 0, 87, 0, 0, 0, 41, 2, 0, 0, 0, 0, 35, 0,140, 0, 0, 0,
+ 41, 2, 0, 0, 0, 0, 35, 0, 75, 0, 0, 0, 42, 2, 0, 0, 0, 0, 35, 0,140, 0, 0, 0, 42, 2, 0, 0, 0, 0, 35, 0,
+ 74, 0, 0, 0, 43, 2, 0, 0, 0, 0, 35, 0,139, 0, 0, 0, 43, 2, 0, 0, 0, 0, 35, 0, 72, 0, 0, 0, 44, 2, 0, 0,
+ 0, 0, 35, 0,139, 0, 0, 0, 44, 2, 0, 0, 0, 0, 35, 0, 72, 0, 0, 0, 45, 2, 0, 0, 0, 0, 33, 0, 74, 0, 0, 0,
+ 45, 2, 0, 0, 0, 0, 33, 0, 88, 0, 0, 0, 46, 2, 0, 0, 0, 0, 35, 0,141, 0, 0, 0, 46, 2, 0, 0, 0, 0, 35, 0,
+ 77, 0, 0, 0, 47, 2, 0, 0, 0, 0, 33, 0, 88, 0, 0, 0, 47, 2, 0, 0, 0, 0, 33, 0, 77, 0, 0, 0, 48, 2, 0, 0,
+ 0, 0, 35, 0,141, 0, 0, 0, 48, 2, 0, 0, 0, 0, 35, 0,141, 0, 0, 0, 49, 2, 0, 0, 0, 0, 35, 0,142, 0, 0, 0,
+ 49, 2, 0, 0, 0, 0, 35, 0,142, 0, 0, 0, 50, 2, 0, 0, 0, 0, 35, 0,143, 0, 0, 0, 50, 2, 0, 0, 0, 0, 35, 0,
+141, 0, 0, 0, 51, 2, 0, 0, 0, 0, 35, 0,143, 0, 0, 0, 51, 2, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0, 52, 2, 0, 0,
+ 0, 0, 33, 0, 89, 0, 0, 0, 52, 2, 0, 0, 0, 0, 33, 0, 89, 0, 0, 0, 53, 2, 0, 0, 0, 0, 35, 0,143, 0, 0, 0,
+ 53, 2, 0, 0, 0, 0, 35, 0, 79, 0, 0, 0, 54, 2, 0, 0, 0, 0, 35, 0,143, 0, 0, 0, 54, 2, 0, 0, 0, 0, 35, 0,
+ 78, 0, 0, 0, 55, 2, 0, 0, 0, 0, 35, 0,142, 0, 0, 0, 55, 2, 0, 0, 0, 0, 35, 0, 76, 0, 0, 0, 56, 2, 0, 0,
+ 0, 0, 35, 0,142, 0, 0, 0, 56, 2, 0, 0, 0, 0, 35, 0, 76, 0, 0, 0, 57, 2, 0, 0, 0, 0, 33, 0, 78, 0, 0, 0,
+ 57, 2, 0, 0, 0, 0, 33, 0, 90, 0, 0, 0, 58, 2, 0, 0, 0, 0, 35, 0,144, 0, 0, 0, 58, 2, 0, 0, 0, 0, 35, 0,
+ 81, 0, 0, 0, 59, 2, 0, 0, 0, 0, 33, 0, 90, 0, 0, 0, 59, 2, 0, 0, 0, 0, 33, 0, 81, 0, 0, 0, 60, 2, 0, 0,
+ 0, 0, 35, 0,144, 0, 0, 0, 60, 2, 0, 0, 0, 0, 35, 0,144, 0, 0, 0, 61, 2, 0, 0, 0, 0, 35, 0,145, 0, 0, 0,
+ 61, 2, 0, 0, 0, 0, 35, 0,145, 0, 0, 0, 62, 2, 0, 0, 0, 0, 35, 0,146, 0, 0, 0, 62, 2, 0, 0, 0, 0, 35, 0,
+144, 0, 0, 0, 63, 2, 0, 0, 0, 0, 35, 0,146, 0, 0, 0, 63, 2, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0, 64, 2, 0, 0,
+ 0, 0, 33, 0, 91, 0, 0, 0, 64, 2, 0, 0, 0, 0, 33, 0, 91, 0, 0, 0, 65, 2, 0, 0, 0, 0, 35, 0,146, 0, 0, 0,
+ 65, 2, 0, 0, 0, 0, 35, 0, 63, 0, 0, 0, 66, 2, 0, 0, 0, 0, 35, 0,146, 0, 0, 0, 66, 2, 0, 0, 0, 0, 35, 0,
+ 62, 0, 0, 0, 67, 2, 0, 0, 0, 0, 35, 0,145, 0, 0, 0, 67, 2, 0, 0, 0, 0, 35, 0, 80, 0, 0, 0, 68, 2, 0, 0,
+ 0, 0, 35, 0,145, 0, 0, 0, 68, 2, 0, 0, 0, 0, 35, 0, 62, 0, 0, 0, 69, 2, 0, 0, 0, 0, 33, 0, 80, 0, 0, 0,
+ 69, 2, 0, 0, 0, 0, 33, 0, 94, 0, 0, 0, 70, 2, 0, 0, 0, 0, 35, 0,147, 0, 0, 0, 70, 2, 0, 0, 0, 0, 35, 0,
+ 82, 0, 0, 0, 71, 2, 0, 0, 0, 0, 33, 0, 94, 0, 0, 0, 71, 2, 0, 0, 0, 0, 33, 0, 82, 0, 0, 0, 72, 2, 0, 0,
+ 0, 0, 35, 0,147, 0, 0, 0, 72, 2, 0, 0, 0, 0, 35, 0,147, 0, 0, 0, 73, 2, 0, 0, 0, 0, 35, 0,148, 0, 0, 0,
+ 73, 2, 0, 0, 0, 0, 35, 0,148, 0, 0, 0, 74, 2, 0, 0, 0, 0, 35, 0,149, 0, 0, 0, 74, 2, 0, 0, 0, 0, 35, 0,
+147, 0, 0, 0, 75, 2, 0, 0, 0, 0, 35, 0,149, 0, 0, 0, 75, 2, 0, 0, 0, 0, 35, 0, 93, 0, 0, 0, 76, 2, 0, 0,
+ 0, 0, 33, 0, 95, 0, 0, 0, 76, 2, 0, 0, 0, 0, 33, 0, 95, 0, 0, 0, 77, 2, 0, 0, 0, 0, 35, 0,149, 0, 0, 0,
+ 77, 2, 0, 0, 0, 0, 35, 0, 93, 0, 0, 0, 78, 2, 0, 0, 0, 0, 35, 0,149, 0, 0, 0, 78, 2, 0, 0, 0, 0, 35, 0,
+ 92, 0, 0, 0, 79, 2, 0, 0, 0, 0, 35, 0,148, 0, 0, 0, 79, 2, 0, 0, 0, 0, 35, 0, 83, 0, 0, 0, 80, 2, 0, 0,
+ 0, 0, 35, 0,148, 0, 0, 0, 80, 2, 0, 0, 0, 0, 35, 0, 83, 0, 0, 0, 81, 2, 0, 0, 0, 0, 33, 0, 92, 0, 0, 0,
+ 81, 2, 0, 0, 0, 0, 33, 0, 96, 0, 0, 0, 82, 2, 0, 0, 0, 0, 35, 0,150, 0, 0, 0, 82, 2, 0, 0, 0, 0, 35, 0,
+ 85, 0, 0, 0, 83, 2, 0, 0, 0, 0, 33, 0, 96, 0, 0, 0, 83, 2, 0, 0, 0, 0, 33, 0, 85, 0, 0, 0, 84, 2, 0, 0,
+ 0, 0, 35, 0,150, 0, 0, 0, 84, 2, 0, 0, 0, 0, 35, 0,150, 0, 0, 0, 85, 2, 0, 0, 0, 0, 35, 0,151, 0, 0, 0,
+ 85, 2, 0, 0, 0, 0, 35, 0,151, 0, 0, 0, 86, 2, 0, 0, 0, 0, 35, 0,152, 0, 0, 0, 86, 2, 0, 0, 0, 0, 35, 0,
+150, 0, 0, 0, 87, 2, 0, 0, 0, 0, 35, 0,152, 0, 0, 0, 87, 2, 0, 0, 0, 0, 35, 0, 95, 0, 0, 0, 88, 2, 0, 0,
+ 0, 0, 33, 0, 97, 0, 0, 0, 88, 2, 0, 0, 0, 0, 33, 0, 97, 0, 0, 0, 89, 2, 0, 0, 0, 0, 35, 0,152, 0, 0, 0,
+ 89, 2, 0, 0, 0, 0, 35, 0, 95, 0, 0, 0, 90, 2, 0, 0, 0, 0, 35, 0,152, 0, 0, 0, 90, 2, 0, 0, 0, 0, 35, 0,
+ 94, 0, 0, 0, 91, 2, 0, 0, 0, 0, 35, 0,151, 0, 0, 0, 91, 2, 0, 0, 0, 0, 35, 0, 84, 0, 0, 0, 92, 2, 0, 0,
+ 0, 0, 35, 0,151, 0, 0, 0, 92, 2, 0, 0, 0, 0, 35, 0, 84, 0, 0, 0, 93, 2, 0, 0, 0, 0, 33, 0, 94, 0, 0, 0,
+ 93, 2, 0, 0, 0, 0, 33, 0, 98, 0, 0, 0, 94, 2, 0, 0, 0, 0, 35, 0,153, 0, 0, 0, 94, 2, 0, 0, 0, 0, 35, 0,
+ 87, 0, 0, 0, 95, 2, 0, 0, 0, 0, 33, 0, 98, 0, 0, 0, 95, 2, 0, 0, 0, 0, 33, 0, 87, 0, 0, 0, 96, 2, 0, 0,
+ 0, 0, 35, 0,153, 0, 0, 0, 96, 2, 0, 0, 0, 0, 35, 0,153, 0, 0, 0, 97, 2, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,
+ 97, 2, 0, 0, 0, 0, 35, 0,154, 0, 0, 0, 98, 2, 0, 0, 0, 0, 35, 0,155, 0, 0, 0, 98, 2, 0, 0, 0, 0, 35, 0,
+153, 0, 0, 0, 99, 2, 0, 0, 0, 0, 35, 0,155, 0, 0, 0, 99, 2, 0, 0, 0, 0, 35, 0, 97, 0, 0, 0,100, 2, 0, 0,
+ 0, 0, 33, 0, 99, 0, 0, 0,100, 2, 0, 0, 0, 0, 33, 0, 99, 0, 0, 0,101, 2, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,
+101, 2, 0, 0, 0, 0, 35, 0, 97, 0, 0, 0,102, 2, 0, 0, 0, 0, 35, 0,155, 0, 0, 0,102, 2, 0, 0, 0, 0, 35, 0,
+ 96, 0, 0, 0,103, 2, 0, 0, 0, 0, 35, 0,154, 0, 0, 0,103, 2, 0, 0, 0, 0, 35, 0, 86, 0, 0, 0,104, 2, 0, 0,
+ 0, 0, 35, 0,154, 0, 0, 0,104, 2, 0, 0, 0, 0, 35, 0, 86, 0, 0, 0,105, 2, 0, 0, 0, 0, 33, 0, 96, 0, 0, 0,
+105, 2, 0, 0, 0, 0, 33, 0,100, 0, 0, 0,106, 2, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,106, 2, 0, 0, 0, 0, 35, 0,
+ 89, 0, 0, 0,107, 2, 0, 0, 0, 0, 33, 0,100, 0, 0, 0,107, 2, 0, 0, 0, 0, 33, 0, 89, 0, 0, 0,108, 2, 0, 0,
+ 0, 0, 35, 0,156, 0, 0, 0,108, 2, 0, 0, 0, 0, 35, 0,156, 0, 0, 0,109, 2, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,
+109, 2, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,110, 2, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,110, 2, 0, 0, 0, 0, 35, 0,
+156, 0, 0, 0,111, 2, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,111, 2, 0, 0, 0, 0, 35, 0, 99, 0, 0, 0,112, 2, 0, 0,
+ 0, 0, 33, 0,101, 0, 0, 0,112, 2, 0, 0, 0, 0, 33, 0,101, 0, 0, 0,113, 2, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,
+113, 2, 0, 0, 0, 0, 35, 0, 99, 0, 0, 0,114, 2, 0, 0, 0, 0, 35, 0,158, 0, 0, 0,114, 2, 0, 0, 0, 0, 35, 0,
+ 98, 0, 0, 0,115, 2, 0, 0, 0, 0, 35, 0,157, 0, 0, 0,115, 2, 0, 0, 0, 0, 35, 0, 88, 0, 0, 0,116, 2, 0, 0,
+ 0, 0, 35, 0,157, 0, 0, 0,116, 2, 0, 0, 0, 0, 35, 0, 88, 0, 0, 0,117, 2, 0, 0, 0, 0, 33, 0, 98, 0, 0, 0,
+117, 2, 0, 0, 0, 0, 33, 0, 92, 0, 0, 0,118, 2, 0, 0, 0, 0, 35, 0,159, 0, 0, 0,118, 2, 0, 0, 0, 0, 35, 0,
+ 91, 0, 0, 0,119, 2, 0, 0, 0, 0, 33, 0, 92, 0, 0, 0,119, 2, 0, 0, 0, 0, 33, 0, 91, 0, 0, 0,120, 2, 0, 0,
+ 0, 0, 35, 0,159, 0, 0, 0,120, 2, 0, 0, 0, 0, 35, 0,159, 0, 0, 0,121, 2, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,
+121, 2, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,122, 2, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,122, 2, 0, 0, 0, 0, 35, 0,
+159, 0, 0, 0,123, 2, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,123, 2, 0, 0, 0, 0, 35, 0, 93, 0, 0, 0,124, 2, 0, 0,
+ 0, 0, 33, 0,101, 0, 0, 0,124, 2, 0, 0, 0, 0, 33, 0, 93, 0, 0, 0,125, 2, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,
+125, 2, 0, 0, 0, 0, 35, 0,101, 0, 0, 0,126, 2, 0, 0, 0, 0, 35, 0,161, 0, 0, 0,126, 2, 0, 0, 0, 0, 35, 0,
+100, 0, 0, 0,127, 2, 0, 0, 0, 0, 35, 0,160, 0, 0, 0,127, 2, 0, 0, 0, 0, 35, 0, 90, 0, 0, 0,128, 2, 0, 0,
+ 0, 0, 35, 0,160, 0, 0, 0,128, 2, 0, 0, 0, 0, 35, 0, 90, 0, 0, 0,129, 2, 0, 0, 0, 0, 33, 0,100, 0, 0, 0,
+129, 2, 0, 0, 0, 0, 33, 0, 27, 1, 0, 0,146, 1, 0, 0, 0, 0, 35, 0,171, 0, 0, 0,146, 1, 0, 0, 0, 0, 35, 0,
+171, 0, 0, 0, 27, 1, 0, 0, 0, 0, 35, 0,146, 1, 0, 0,147, 1, 0, 0, 0, 0, 35, 0,146, 1, 0, 0,148, 1, 0, 0,
+ 0, 0, 35, 0,147, 1, 0, 0,148, 1, 0, 0, 0, 0, 35, 0,165, 0, 0, 0, 26, 1, 0, 0, 0, 0, 35, 0,165, 0, 0, 0,
+148, 1, 0, 0, 0, 0, 35, 0, 26, 1, 0, 0,148, 1, 0, 0, 0, 0, 35, 0,164, 0, 0, 0,147, 1, 0, 0, 0, 0, 35, 0,
+164, 0, 0, 0,170, 0, 0, 0, 0, 0, 35, 0,170, 0, 0, 0,147, 1, 0, 0, 0, 0, 35, 0, 26, 1, 0, 0,149, 1, 0, 0,
+ 0, 0, 35, 0, 28, 1, 0, 0,149, 1, 0, 0, 0, 0, 35, 0, 26, 1, 0, 0, 28, 1, 0, 0, 0, 0, 35, 0,149, 1, 0, 0,
+150, 1, 0, 0, 0, 0, 35, 0,149, 1, 0, 0,151, 1, 0, 0, 0, 0, 35, 0,150, 1, 0, 0,151, 1, 0, 0, 0, 0, 35, 0,
+ 27, 1, 0, 0, 31, 1, 0, 0, 0, 0, 35, 0, 31, 1, 0, 0,151, 1, 0, 0, 0, 0, 35, 0, 27, 1, 0, 0,151, 1, 0, 0,
+ 0, 0, 35, 0, 30, 1, 0, 0,150, 1, 0, 0, 0, 0, 35, 0, 29, 1, 0, 0, 30, 1, 0, 0, 0, 0, 35, 0, 29, 1, 0, 0,
+150, 1, 0, 0, 0, 0, 35, 0,168, 0, 0, 0,152, 1, 0, 0, 0, 0, 35, 0,172, 0, 0, 0,152, 1, 0, 0, 0, 0, 35, 0,
+168, 0, 0, 0,172, 0, 0, 0, 0, 0, 35, 0,152, 1, 0, 0,153, 1, 0, 0, 0, 0, 35, 0,152, 1, 0, 0,154, 1, 0, 0,
+ 0, 0, 35, 0,153, 1, 0, 0,154, 1, 0, 0, 0, 0, 35, 0,169, 0, 0, 0, 30, 1, 0, 0, 0, 0, 35, 0, 30, 1, 0, 0,
+154, 1, 0, 0, 0, 0, 35, 0,169, 0, 0, 0,154, 1, 0, 0, 0, 0, 35, 0, 31, 1, 0, 0,153, 1, 0, 0, 0, 0, 35, 0,
+173, 0, 0, 0, 31, 1, 0, 0, 0, 0, 35, 0,173, 0, 0, 0,153, 1, 0, 0, 0, 0, 35, 0,167, 0, 0, 0,155, 1, 0, 0,
+ 0, 0, 35, 0, 29, 1, 0, 0,155, 1, 0, 0, 0, 0, 35, 0,167, 0, 0, 0, 29, 1, 0, 0, 0, 0, 35, 0,155, 1, 0, 0,
+156, 1, 0, 0, 0, 0, 35, 0,155, 1, 0, 0,157, 1, 0, 0, 0, 0, 35, 0,156, 1, 0, 0,157, 1, 0, 0, 0, 0, 35, 0,
+162, 0, 0, 0,166, 0, 0, 0, 0, 0, 35, 0,162, 0, 0, 0,157, 1, 0, 0, 0, 0, 35, 0,166, 0, 0, 0,157, 1, 0, 0,
+ 0, 0, 35, 0,163, 0, 0, 0,156, 1, 0, 0, 0, 0, 35, 0,163, 0, 0, 0, 28, 1, 0, 0, 0, 0, 35, 0, 28, 1, 0, 0,
+156, 1, 0, 0, 0, 0, 35, 0, 33, 1, 0, 0,158, 1, 0, 0, 0, 0, 35, 0,179, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 0,
+179, 0, 0, 0,158, 1, 0, 0, 0, 0, 35, 0,158, 1, 0, 0,159, 1, 0, 0, 0, 0, 35, 0,159, 1, 0, 0,160, 1, 0, 0,
+ 0, 0, 35, 0,158, 1, 0, 0,160, 1, 0, 0, 0, 0, 35, 0,165, 0, 0, 0, 32, 1, 0, 0, 0, 0, 35, 0, 32, 1, 0, 0,
+160, 1, 0, 0, 0, 0, 35, 0,165, 0, 0, 0,160, 1, 0, 0, 0, 0, 35, 0,164, 0, 0, 0,159, 1, 0, 0, 0, 0, 35, 0,
+178, 0, 0, 0,159, 1, 0, 0, 0, 0, 35, 0,164, 0, 0, 0,178, 0, 0, 0, 0, 0, 35, 0, 32, 1, 0, 0,161, 1, 0, 0,
+ 0, 0, 35, 0, 32, 1, 0, 0, 34, 1, 0, 0, 0, 0, 35, 0, 34, 1, 0, 0,161, 1, 0, 0, 0, 0, 35, 0,161, 1, 0, 0,
+162, 1, 0, 0, 0, 0, 35, 0,162, 1, 0, 0,163, 1, 0, 0, 0, 0, 35, 0,161, 1, 0, 0,163, 1, 0, 0, 0, 0, 35, 0,
+ 33, 1, 0, 0, 37, 1, 0, 0, 0, 0, 35, 0, 33, 1, 0, 0,163, 1, 0, 0, 0, 0, 35, 0, 37, 1, 0, 0,163, 1, 0, 0,
+ 0, 0, 35, 0, 36, 1, 0, 0,162, 1, 0, 0, 0, 0, 35, 0, 35, 1, 0, 0,162, 1, 0, 0, 0, 0, 35, 0, 35, 1, 0, 0,
+ 36, 1, 0, 0, 0, 0, 35, 0,176, 0, 0, 0,164, 1, 0, 0, 0, 0, 35, 0,176, 0, 0, 0,180, 0, 0, 0, 0, 0, 35, 0,
+180, 0, 0, 0,164, 1, 0, 0, 0, 0, 35, 0,164, 1, 0, 0,165, 1, 0, 0, 0, 0, 35, 0,165, 1, 0, 0,166, 1, 0, 0,
+ 0, 0, 35, 0,164, 1, 0, 0,166, 1, 0, 0, 0, 0, 35, 0,177, 0, 0, 0, 36, 1, 0, 0, 0, 0, 35, 0,177, 0, 0, 0,
+166, 1, 0, 0, 0, 0, 35, 0, 36, 1, 0, 0,166, 1, 0, 0, 0, 0, 35, 0, 37, 1, 0, 0,165, 1, 0, 0, 0, 0, 35, 0,
+181, 0, 0, 0,165, 1, 0, 0, 0, 0, 35, 0,181, 0, 0, 0, 37, 1, 0, 0, 0, 0, 35, 0,175, 0, 0, 0,167, 1, 0, 0,
+ 0, 0, 35, 0,175, 0, 0, 0, 35, 1, 0, 0, 0, 0, 35, 0, 35, 1, 0, 0,167, 1, 0, 0, 0, 0, 35, 0,167, 1, 0, 0,
+168, 1, 0, 0, 0, 0, 35, 0,168, 1, 0, 0,169, 1, 0, 0, 0, 0, 35, 0,167, 1, 0, 0,169, 1, 0, 0, 0, 0, 35, 0,
+162, 0, 0, 0,174, 0, 0, 0, 0, 0, 35, 0,174, 0, 0, 0,169, 1, 0, 0, 0, 0, 35, 0,162, 0, 0, 0,169, 1, 0, 0,
+ 0, 0, 35, 0,163, 0, 0, 0,168, 1, 0, 0, 0, 0, 35, 0, 34, 1, 0, 0,168, 1, 0, 0, 0, 0, 35, 0,163, 0, 0, 0,
+ 34, 1, 0, 0, 0, 0, 35, 0, 39, 1, 0, 0,170, 1, 0, 0, 0, 0, 35, 0,187, 0, 0, 0,170, 1, 0, 0, 0, 0, 35, 0,
+187, 0, 0, 0, 39, 1, 0, 0, 0, 0, 35, 0,170, 1, 0, 0,171, 1, 0, 0, 0, 0, 35, 0,170, 1, 0, 0,172, 1, 0, 0,
+ 0, 0, 35, 0,171, 1, 0, 0,172, 1, 0, 0, 0, 0, 35, 0,169, 0, 0, 0, 38, 1, 0, 0, 0, 0, 35, 0,169, 0, 0, 0,
+172, 1, 0, 0, 0, 0, 35, 0, 38, 1, 0, 0,172, 1, 0, 0, 0, 0, 35, 0,168, 0, 0, 0,171, 1, 0, 0, 0, 0, 35, 0,
+168, 0, 0, 0,186, 0, 0, 0, 0, 0, 35, 0,186, 0, 0, 0,171, 1, 0, 0, 0, 0, 35, 0, 38, 1, 0, 0,173, 1, 0, 0,
+ 0, 0, 35, 0, 40, 1, 0, 0,173, 1, 0, 0, 0, 0, 35, 0, 38, 1, 0, 0, 40, 1, 0, 0, 0, 0, 35, 0,173, 1, 0, 0,
+174, 1, 0, 0, 0, 0, 35, 0,173, 1, 0, 0,175, 1, 0, 0, 0, 0, 35, 0,174, 1, 0, 0,175, 1, 0, 0, 0, 0, 35, 0,
+ 39, 1, 0, 0, 43, 1, 0, 0, 0, 0, 35, 0, 43, 1, 0, 0,175, 1, 0, 0, 0, 0, 35, 0, 39, 1, 0, 0,175, 1, 0, 0,
+ 0, 0, 35, 0, 42, 1, 0, 0,174, 1, 0, 0, 0, 0, 35, 0, 41, 1, 0, 0, 42, 1, 0, 0, 0, 0, 35, 0, 41, 1, 0, 0,
+174, 1, 0, 0, 0, 0, 35, 0,184, 0, 0, 0,176, 1, 0, 0, 0, 0, 35, 0,188, 0, 0, 0,176, 1, 0, 0, 0, 0, 35, 0,
+184, 0, 0, 0,188, 0, 0, 0, 0, 0, 35, 0,176, 1, 0, 0,177, 1, 0, 0, 0, 0, 35, 0,176, 1, 0, 0,178, 1, 0, 0,
+ 0, 0, 35, 0,177, 1, 0, 0,178, 1, 0, 0, 0, 0, 35, 0,185, 0, 0, 0, 42, 1, 0, 0, 0, 0, 35, 0, 42, 1, 0, 0,
+178, 1, 0, 0, 0, 0, 35, 0,185, 0, 0, 0,178, 1, 0, 0, 0, 0, 35, 0, 43, 1, 0, 0,177, 1, 0, 0, 0, 0, 35, 0,
+189, 0, 0, 0, 43, 1, 0, 0, 0, 0, 35, 0,189, 0, 0, 0,177, 1, 0, 0, 0, 0, 35, 0,183, 0, 0, 0,179, 1, 0, 0,
+ 0, 0, 35, 0, 41, 1, 0, 0,179, 1, 0, 0, 0, 0, 35, 0,183, 0, 0, 0, 41, 1, 0, 0, 0, 0, 35, 0,179, 1, 0, 0,
+180, 1, 0, 0, 0, 0, 35, 0,179, 1, 0, 0,181, 1, 0, 0, 0, 0, 35, 0,180, 1, 0, 0,181, 1, 0, 0, 0, 0, 35, 0,
+166, 0, 0, 0,182, 0, 0, 0, 0, 0, 35, 0,166, 0, 0, 0,181, 1, 0, 0, 0, 0, 35, 0,182, 0, 0, 0,181, 1, 0, 0,
+ 0, 0, 35, 0,167, 0, 0, 0,180, 1, 0, 0, 0, 0, 35, 0,167, 0, 0, 0, 40, 1, 0, 0, 0, 0, 35, 0, 40, 1, 0, 0,
+180, 1, 0, 0, 0, 0, 35, 0, 45, 1, 0, 0,182, 1, 0, 0, 0, 0, 35, 0,195, 0, 0, 0,182, 1, 0, 0, 0, 0, 35, 0,
+195, 0, 0, 0, 45, 1, 0, 0, 0, 0, 35, 0,182, 1, 0, 0,183, 1, 0, 0, 0, 0, 35, 0,182, 1, 0, 0,184, 1, 0, 0,
+ 0, 0, 35, 0,183, 1, 0, 0,184, 1, 0, 0, 0, 0, 35, 0,185, 0, 0, 0, 44, 1, 0, 0, 0, 0, 35, 0,185, 0, 0, 0,
+184, 1, 0, 0, 0, 0, 35, 0, 44, 1, 0, 0,184, 1, 0, 0, 0, 0, 35, 0,184, 0, 0, 0,183, 1, 0, 0, 0, 0, 35, 0,
+184, 0, 0, 0,194, 0, 0, 0, 0, 0, 35, 0,194, 0, 0, 0,183, 1, 0, 0, 0, 0, 35, 0, 44, 1, 0, 0,185, 1, 0, 0,
+ 0, 0, 35, 0, 46, 1, 0, 0,185, 1, 0, 0, 0, 0, 35, 0, 44, 1, 0, 0, 46, 1, 0, 0, 0, 0, 35, 0,185, 1, 0, 0,
+186, 1, 0, 0, 0, 0, 35, 0,185, 1, 0, 0,187, 1, 0, 0, 0, 0, 35, 0,186, 1, 0, 0,187, 1, 0, 0, 0, 0, 35, 0,
+ 45, 1, 0, 0, 49, 1, 0, 0, 0, 0, 35, 0, 49, 1, 0, 0,187, 1, 0, 0, 0, 0, 35, 0, 45, 1, 0, 0,187, 1, 0, 0,
+ 0, 0, 35, 0, 48, 1, 0, 0,186, 1, 0, 0, 0, 0, 35, 0, 47, 1, 0, 0, 48, 1, 0, 0, 0, 0, 35, 0, 47, 1, 0, 0,
+186, 1, 0, 0, 0, 0, 35, 0,192, 0, 0, 0,188, 1, 0, 0, 0, 0, 35, 0,196, 0, 0, 0,188, 1, 0, 0, 0, 0, 35, 0,
+192, 0, 0, 0,196, 0, 0, 0, 0, 0, 35, 0,188, 1, 0, 0,189, 1, 0, 0, 0, 0, 35, 0,188, 1, 0, 0,190, 1, 0, 0,
+ 0, 0, 35, 0,189, 1, 0, 0,190, 1, 0, 0, 0, 0, 35, 0,193, 0, 0, 0, 48, 1, 0, 0, 0, 0, 35, 0, 48, 1, 0, 0,
+190, 1, 0, 0, 0, 0, 35, 0,193, 0, 0, 0,190, 1, 0, 0, 0, 0, 35, 0, 49, 1, 0, 0,189, 1, 0, 0, 0, 0, 35, 0,
+197, 0, 0, 0, 49, 1, 0, 0, 0, 0, 35, 0,197, 0, 0, 0,189, 1, 0, 0, 0, 0, 35, 0,191, 0, 0, 0,191, 1, 0, 0,
+ 0, 0, 35, 0, 47, 1, 0, 0,191, 1, 0, 0, 0, 0, 35, 0,191, 0, 0, 0, 47, 1, 0, 0, 0, 0, 35, 0,191, 1, 0, 0,
+192, 1, 0, 0, 0, 0, 35, 0,191, 1, 0, 0,193, 1, 0, 0, 0, 0, 35, 0,192, 1, 0, 0,193, 1, 0, 0, 0, 0, 35, 0,
+182, 0, 0, 0,190, 0, 0, 0, 0, 0, 35, 0,182, 0, 0, 0,193, 1, 0, 0, 0, 0, 35, 0,190, 0, 0, 0,193, 1, 0, 0,
+ 0, 0, 35, 0,183, 0, 0, 0,192, 1, 0, 0, 0, 0, 35, 0,183, 0, 0, 0, 46, 1, 0, 0, 0, 0, 35, 0, 46, 1, 0, 0,
+192, 1, 0, 0, 0, 0, 35, 0, 51, 1, 0, 0,194, 1, 0, 0, 0, 0, 35, 0,199, 0, 0, 0,194, 1, 0, 0, 0, 0, 35, 0,
+199, 0, 0, 0, 51, 1, 0, 0, 0, 0, 35, 0,194, 1, 0, 0,195, 1, 0, 0, 0, 0, 35, 0,194, 1, 0, 0,196, 1, 0, 0,
+ 0, 0, 35, 0,195, 1, 0, 0,196, 1, 0, 0, 0, 0, 35, 0,193, 0, 0, 0, 50, 1, 0, 0, 0, 0, 35, 0,193, 0, 0, 0,
+196, 1, 0, 0, 0, 0, 35, 0, 50, 1, 0, 0,196, 1, 0, 0, 0, 0, 35, 0,192, 0, 0, 0,195, 1, 0, 0, 0, 0, 35, 0,
+192, 0, 0, 0,198, 0, 0, 0, 0, 0, 35, 0,198, 0, 0, 0,195, 1, 0, 0, 0, 0, 35, 0, 50, 1, 0, 0,197, 1, 0, 0,
+ 0, 0, 35, 0, 53, 1, 0, 0,197, 1, 0, 0, 0, 0, 35, 0, 50, 1, 0, 0, 53, 1, 0, 0, 0, 0, 35, 0,197, 1, 0, 0,
+198, 1, 0, 0, 0, 0, 35, 0,197, 1, 0, 0,199, 1, 0, 0, 0, 0, 35, 0,198, 1, 0, 0,199, 1, 0, 0, 0, 0, 35, 0,
+ 51, 1, 0, 0, 55, 1, 0, 0, 0, 0, 35, 0, 55, 1, 0, 0,199, 1, 0, 0, 0, 0, 35, 0, 51, 1, 0, 0,199, 1, 0, 0,
+ 0, 0, 35, 0, 54, 1, 0, 0,198, 1, 0, 0, 0, 0, 35, 0, 52, 1, 0, 0, 54, 1, 0, 0, 0, 0, 35, 0, 52, 1, 0, 0,
+198, 1, 0, 0, 0, 0, 35, 0,176, 0, 0, 0,200, 1, 0, 0, 0, 0, 35, 0,200, 0, 0, 0,200, 1, 0, 0, 0, 0, 35, 0,
+176, 0, 0, 0,200, 0, 0, 0, 0, 0, 35, 0,200, 1, 0, 0,201, 1, 0, 0, 0, 0, 35, 0,200, 1, 0, 0,202, 1, 0, 0,
+ 0, 0, 35, 0,201, 1, 0, 0,202, 1, 0, 0, 0, 0, 35, 0,177, 0, 0, 0, 54, 1, 0, 0, 0, 0, 35, 0, 54, 1, 0, 0,
+202, 1, 0, 0, 0, 0, 35, 0,177, 0, 0, 0,202, 1, 0, 0, 0, 0, 35, 0, 55, 1, 0, 0,201, 1, 0, 0, 0, 0, 35, 0,
+201, 0, 0, 0, 55, 1, 0, 0, 0, 0, 35, 0,201, 0, 0, 0,201, 1, 0, 0, 0, 0, 35, 0,175, 0, 0, 0,203, 1, 0, 0,
+ 0, 0, 35, 0, 52, 1, 0, 0,203, 1, 0, 0, 0, 0, 35, 0,175, 0, 0, 0, 52, 1, 0, 0, 0, 0, 35, 0,203, 1, 0, 0,
+204, 1, 0, 0, 0, 0, 35, 0,203, 1, 0, 0,205, 1, 0, 0, 0, 0, 35, 0,204, 1, 0, 0,205, 1, 0, 0, 0, 0, 35, 0,
+174, 0, 0, 0,190, 0, 0, 0, 0, 0, 35, 0,190, 0, 0, 0,205, 1, 0, 0, 0, 0, 35, 0,174, 0, 0, 0,205, 1, 0, 0,
+ 0, 0, 35, 0,191, 0, 0, 0,204, 1, 0, 0, 0, 0, 35, 0,191, 0, 0, 0, 53, 1, 0, 0, 0, 0, 35, 0, 53, 1, 0, 0,
+204, 1, 0, 0, 0, 0, 35, 0, 57, 1, 0, 0,206, 1, 0, 0, 0, 0, 35, 0,207, 0, 0, 0, 57, 1, 0, 0, 0, 0, 35, 0,
+207, 0, 0, 0,206, 1, 0, 0, 0, 0, 35, 0,206, 1, 0, 0,207, 1, 0, 0, 0, 0, 35, 0,207, 1, 0, 0,208, 1, 0, 0,
+ 0, 0, 35, 0,206, 1, 0, 0,208, 1, 0, 0, 0, 0, 35, 0,179, 0, 0, 0, 56, 1, 0, 0, 0, 0, 35, 0, 56, 1, 0, 0,
+208, 1, 0, 0, 0, 0, 35, 0,179, 0, 0, 0,208, 1, 0, 0, 0, 0, 35, 0,178, 0, 0, 0,207, 1, 0, 0, 0, 0, 35, 0,
+206, 0, 0, 0,207, 1, 0, 0, 0, 0, 35, 0,178, 0, 0, 0,206, 0, 0, 0, 0, 0, 35, 0, 56, 1, 0, 0,209, 1, 0, 0,
+ 0, 0, 35, 0, 56, 1, 0, 0, 58, 1, 0, 0, 0, 0, 35, 0, 58, 1, 0, 0,209, 1, 0, 0, 0, 0, 35, 0,209, 1, 0, 0,
+210, 1, 0, 0, 0, 0, 35, 0,210, 1, 0, 0,211, 1, 0, 0, 0, 0, 35, 0,209, 1, 0, 0,211, 1, 0, 0, 0, 0, 35, 0,
+ 57, 1, 0, 0, 61, 1, 0, 0, 0, 0, 35, 0, 57, 1, 0, 0,211, 1, 0, 0, 0, 0, 35, 0, 61, 1, 0, 0,211, 1, 0, 0,
+ 0, 0, 35, 0, 60, 1, 0, 0,210, 1, 0, 0, 0, 0, 35, 0, 59, 1, 0, 0,210, 1, 0, 0, 0, 0, 35, 0, 59, 1, 0, 0,
+ 60, 1, 0, 0, 0, 0, 35, 0,204, 0, 0, 0,212, 1, 0, 0, 0, 0, 35, 0,204, 0, 0, 0,208, 0, 0, 0, 0, 0, 35, 0,
+208, 0, 0, 0,212, 1, 0, 0, 0, 0, 35, 0,212, 1, 0, 0,213, 1, 0, 0, 0, 0, 35, 0,213, 1, 0, 0,214, 1, 0, 0,
+ 0, 0, 35, 0,212, 1, 0, 0,214, 1, 0, 0, 0, 0, 35, 0,205, 0, 0, 0, 60, 1, 0, 0, 0, 0, 35, 0,205, 0, 0, 0,
+214, 1, 0, 0, 0, 0, 35, 0, 60, 1, 0, 0,214, 1, 0, 0, 0, 0, 35, 0, 61, 1, 0, 0,213, 1, 0, 0, 0, 0, 35, 0,
+209, 0, 0, 0,213, 1, 0, 0, 0, 0, 35, 0,209, 0, 0, 0, 61, 1, 0, 0, 0, 0, 35, 0,203, 0, 0, 0,215, 1, 0, 0,
+ 0, 0, 35, 0,203, 0, 0, 0, 59, 1, 0, 0, 0, 0, 35, 0, 59, 1, 0, 0,215, 1, 0, 0, 0, 0, 35, 0,215, 1, 0, 0,
+216, 1, 0, 0, 0, 0, 35, 0,216, 1, 0, 0,217, 1, 0, 0, 0, 0, 35, 0,215, 1, 0, 0,217, 1, 0, 0, 0, 0, 35, 0,
+180, 0, 0, 0,202, 0, 0, 0, 0, 0, 35, 0,202, 0, 0, 0,217, 1, 0, 0, 0, 0, 35, 0,180, 0, 0, 0,217, 1, 0, 0,
+ 0, 0, 35, 0,181, 0, 0, 0,216, 1, 0, 0, 0, 0, 35, 0, 58, 1, 0, 0,216, 1, 0, 0, 0, 0, 35, 0,181, 0, 0, 0,
+ 58, 1, 0, 0, 0, 0, 35, 0, 63, 1, 0, 0,218, 1, 0, 0, 0, 0, 35, 0,215, 0, 0, 0, 63, 1, 0, 0, 0, 0, 35, 0,
+215, 0, 0, 0,218, 1, 0, 0, 0, 0, 35, 0,218, 1, 0, 0,219, 1, 0, 0, 0, 0, 35, 0,219, 1, 0, 0,220, 1, 0, 0,
+ 0, 0, 35, 0,218, 1, 0, 0,220, 1, 0, 0, 0, 0, 35, 0,173, 0, 0, 0, 62, 1, 0, 0, 0, 0, 35, 0, 62, 1, 0, 0,
+220, 1, 0, 0, 0, 0, 35, 0,173, 0, 0, 0,220, 1, 0, 0, 0, 0, 35, 0,172, 0, 0, 0,219, 1, 0, 0, 0, 0, 35, 0,
+214, 0, 0, 0,219, 1, 0, 0, 0, 0, 35, 0,172, 0, 0, 0,214, 0, 0, 0, 0, 0, 35, 0, 62, 1, 0, 0,221, 1, 0, 0,
+ 0, 0, 35, 0, 62, 1, 0, 0, 64, 1, 0, 0, 0, 0, 35, 0, 64, 1, 0, 0,221, 1, 0, 0, 0, 0, 35, 0,221, 1, 0, 0,
+222, 1, 0, 0, 0, 0, 35, 0,222, 1, 0, 0,223, 1, 0, 0, 0, 0, 35, 0,221, 1, 0, 0,223, 1, 0, 0, 0, 0, 35, 0,
+ 63, 1, 0, 0, 67, 1, 0, 0, 0, 0, 35, 0, 63, 1, 0, 0,223, 1, 0, 0, 0, 0, 35, 0, 67, 1, 0, 0,223, 1, 0, 0,
+ 0, 0, 35, 0, 66, 1, 0, 0,222, 1, 0, 0, 0, 0, 35, 0, 65, 1, 0, 0,222, 1, 0, 0, 0, 0, 35, 0, 65, 1, 0, 0,
+ 66, 1, 0, 0, 0, 0, 35, 0,212, 0, 0, 0,224, 1, 0, 0, 0, 0, 35, 0,212, 0, 0, 0,216, 0, 0, 0, 0, 0, 35, 0,
+216, 0, 0, 0,224, 1, 0, 0, 0, 0, 35, 0,224, 1, 0, 0,225, 1, 0, 0, 0, 0, 35, 0,225, 1, 0, 0,226, 1, 0, 0,
+ 0, 0, 35, 0,224, 1, 0, 0,226, 1, 0, 0, 0, 0, 35, 0,213, 0, 0, 0, 66, 1, 0, 0, 0, 0, 35, 0,213, 0, 0, 0,
+226, 1, 0, 0, 0, 0, 35, 0, 66, 1, 0, 0,226, 1, 0, 0, 0, 0, 35, 0, 67, 1, 0, 0,225, 1, 0, 0, 0, 0, 35, 0,
+217, 0, 0, 0,225, 1, 0, 0, 0, 0, 35, 0,217, 0, 0, 0, 67, 1, 0, 0, 0, 0, 35, 0,211, 0, 0, 0,227, 1, 0, 0,
+ 0, 0, 35, 0,211, 0, 0, 0, 65, 1, 0, 0, 0, 0, 35, 0, 65, 1, 0, 0,227, 1, 0, 0, 0, 0, 35, 0,227, 1, 0, 0,
+228, 1, 0, 0, 0, 0, 35, 0,228, 1, 0, 0,229, 1, 0, 0, 0, 0, 35, 0,227, 1, 0, 0,229, 1, 0, 0, 0, 0, 35, 0,
+170, 0, 0, 0,210, 0, 0, 0, 0, 0, 35, 0,210, 0, 0, 0,229, 1, 0, 0, 0, 0, 35, 0,170, 0, 0, 0,229, 1, 0, 0,
+ 0, 0, 35, 0,171, 0, 0, 0,228, 1, 0, 0, 0, 0, 35, 0, 64, 1, 0, 0,228, 1, 0, 0, 0, 0, 35, 0,171, 0, 0, 0,
+ 64, 1, 0, 0, 0, 0, 35, 0, 69, 1, 0, 0,230, 1, 0, 0, 0, 0, 35, 0,223, 0, 0, 0, 69, 1, 0, 0, 0, 0, 35, 0,
+223, 0, 0, 0,230, 1, 0, 0, 0, 0, 35, 0,230, 1, 0, 0,231, 1, 0, 0, 0, 0, 35, 0,231, 1, 0, 0,232, 1, 0, 0,
+ 0, 0, 35, 0,230, 1, 0, 0,232, 1, 0, 0, 0, 0, 35, 0,189, 0, 0, 0, 68, 1, 0, 0, 0, 0, 35, 0, 68, 1, 0, 0,
+232, 1, 0, 0, 0, 0, 35, 0,189, 0, 0, 0,232, 1, 0, 0, 0, 0, 35, 0,188, 0, 0, 0,231, 1, 0, 0, 0, 0, 35, 0,
+222, 0, 0, 0,231, 1, 0, 0, 0, 0, 35, 0,188, 0, 0, 0,222, 0, 0, 0, 0, 0, 35, 0, 68, 1, 0, 0,233, 1, 0, 0,
+ 0, 0, 35, 0, 68, 1, 0, 0, 70, 1, 0, 0, 0, 0, 35, 0, 70, 1, 0, 0,233, 1, 0, 0, 0, 0, 35, 0,233, 1, 0, 0,
+234, 1, 0, 0, 0, 0, 35, 0,234, 1, 0, 0,235, 1, 0, 0, 0, 0, 35, 0,233, 1, 0, 0,235, 1, 0, 0, 0, 0, 35, 0,
+ 69, 1, 0, 0, 73, 1, 0, 0, 0, 0, 35, 0, 69, 1, 0, 0,235, 1, 0, 0, 0, 0, 35, 0, 73, 1, 0, 0,235, 1, 0, 0,
+ 0, 0, 35, 0, 72, 1, 0, 0,234, 1, 0, 0, 0, 0, 35, 0, 71, 1, 0, 0,234, 1, 0, 0, 0, 0, 35, 0, 71, 1, 0, 0,
+ 72, 1, 0, 0, 0, 0, 35, 0,220, 0, 0, 0,236, 1, 0, 0, 0, 0, 35, 0,220, 0, 0, 0,224, 0, 0, 0, 0, 0, 35, 0,
+224, 0, 0, 0,236, 1, 0, 0, 0, 0, 35, 0,236, 1, 0, 0,237, 1, 0, 0, 0, 0, 35, 0,237, 1, 0, 0,238, 1, 0, 0,
+ 0, 0, 35, 0,236, 1, 0, 0,238, 1, 0, 0, 0, 0, 35, 0,221, 0, 0, 0, 72, 1, 0, 0, 0, 0, 35, 0,221, 0, 0, 0,
+238, 1, 0, 0, 0, 0, 35, 0, 72, 1, 0, 0,238, 1, 0, 0, 0, 0, 35, 0, 73, 1, 0, 0,237, 1, 0, 0, 0, 0, 35, 0,
+225, 0, 0, 0,237, 1, 0, 0, 0, 0, 35, 0,225, 0, 0, 0, 73, 1, 0, 0, 0, 0, 35, 0,219, 0, 0, 0,239, 1, 0, 0,
+ 0, 0, 35, 0,219, 0, 0, 0, 71, 1, 0, 0, 0, 0, 35, 0, 71, 1, 0, 0,239, 1, 0, 0, 0, 0, 35, 0,239, 1, 0, 0,
+240, 1, 0, 0, 0, 0, 35, 0,240, 1, 0, 0,241, 1, 0, 0, 0, 0, 35, 0,239, 1, 0, 0,241, 1, 0, 0, 0, 0, 35, 0,
+186, 0, 0, 0,218, 0, 0, 0, 0, 0, 35, 0,218, 0, 0, 0,241, 1, 0, 0, 0, 0, 35, 0,186, 0, 0, 0,241, 1, 0, 0,
+ 0, 0, 35, 0,187, 0, 0, 0,240, 1, 0, 0, 0, 0, 35, 0, 70, 1, 0, 0,240, 1, 0, 0, 0, 0, 35, 0,187, 0, 0, 0,
+ 70, 1, 0, 0, 0, 0, 35, 0, 75, 1, 0, 0,242, 1, 0, 0, 0, 0, 35, 0,231, 0, 0, 0, 75, 1, 0, 0, 0, 0, 35, 0,
+231, 0, 0, 0,242, 1, 0, 0, 0, 0, 35, 0,242, 1, 0, 0,243, 1, 0, 0, 0, 0, 35, 0,243, 1, 0, 0,244, 1, 0, 0,
+ 0, 0, 35, 0,242, 1, 0, 0,244, 1, 0, 0, 0, 0, 35, 0,197, 0, 0, 0, 74, 1, 0, 0, 0, 0, 35, 0, 74, 1, 0, 0,
+244, 1, 0, 0, 0, 0, 35, 0,197, 0, 0, 0,244, 1, 0, 0, 0, 0, 35, 0,196, 0, 0, 0,243, 1, 0, 0, 0, 0, 35, 0,
+230, 0, 0, 0,243, 1, 0, 0, 0, 0, 35, 0,196, 0, 0, 0,230, 0, 0, 0, 0, 0, 35, 0, 74, 1, 0, 0,245, 1, 0, 0,
+ 0, 0, 35, 0, 74, 1, 0, 0, 76, 1, 0, 0, 0, 0, 35, 0, 76, 1, 0, 0,245, 1, 0, 0, 0, 0, 35, 0,245, 1, 0, 0,
+246, 1, 0, 0, 0, 0, 35, 0,246, 1, 0, 0,247, 1, 0, 0, 0, 0, 35, 0,245, 1, 0, 0,247, 1, 0, 0, 0, 0, 35, 0,
+ 75, 1, 0, 0, 79, 1, 0, 0, 0, 0, 35, 0, 75, 1, 0, 0,247, 1, 0, 0, 0, 0, 35, 0, 79, 1, 0, 0,247, 1, 0, 0,
+ 0, 0, 35, 0, 78, 1, 0, 0,246, 1, 0, 0, 0, 0, 35, 0, 77, 1, 0, 0,246, 1, 0, 0, 0, 0, 35, 0, 77, 1, 0, 0,
+ 78, 1, 0, 0, 0, 0, 35, 0,228, 0, 0, 0,248, 1, 0, 0, 0, 0, 35, 0,228, 0, 0, 0,232, 0, 0, 0, 0, 0, 35, 0,
+232, 0, 0, 0,248, 1, 0, 0, 0, 0, 35, 0,248, 1, 0, 0,249, 1, 0, 0, 0, 0, 35, 0,249, 1, 0, 0,250, 1, 0, 0,
+ 0, 0, 35, 0,248, 1, 0, 0,250, 1, 0, 0, 0, 0, 35, 0,229, 0, 0, 0, 78, 1, 0, 0, 0, 0, 35, 0,229, 0, 0, 0,
+250, 1, 0, 0, 0, 0, 35, 0, 78, 1, 0, 0,250, 1, 0, 0, 0, 0, 35, 0, 79, 1, 0, 0,249, 1, 0, 0, 0, 0, 35, 0,
+233, 0, 0, 0,249, 1, 0, 0, 0, 0, 35, 0,233, 0, 0, 0, 79, 1, 0, 0, 0, 0, 35, 0,227, 0, 0, 0,251, 1, 0, 0,
+ 0, 0, 35, 0,227, 0, 0, 0, 77, 1, 0, 0, 0, 0, 35, 0, 77, 1, 0, 0,251, 1, 0, 0, 0, 0, 35, 0,251, 1, 0, 0,
+252, 1, 0, 0, 0, 0, 35, 0,252, 1, 0, 0,253, 1, 0, 0, 0, 0, 35, 0,251, 1, 0, 0,253, 1, 0, 0, 0, 0, 35, 0,
+194, 0, 0, 0,226, 0, 0, 0, 0, 0, 35, 0,226, 0, 0, 0,253, 1, 0, 0, 0, 0, 35, 0,194, 0, 0, 0,253, 1, 0, 0,
+ 0, 0, 35, 0,195, 0, 0, 0,252, 1, 0, 0, 0, 0, 35, 0, 76, 1, 0, 0,252, 1, 0, 0, 0, 0, 35, 0,195, 0, 0, 0,
+ 76, 1, 0, 0, 0, 0, 35, 0, 81, 1, 0, 0,254, 1, 0, 0, 0, 0, 35, 0,239, 0, 0, 0, 81, 1, 0, 0, 0, 0, 35, 0,
+239, 0, 0, 0,254, 1, 0, 0, 0, 0, 35, 0,254, 1, 0, 0,255, 1, 0, 0, 0, 0, 35, 0,255, 1, 0, 0, 0, 2, 0, 0,
+ 0, 0, 35, 0,254, 1, 0, 0, 0, 2, 0, 0, 0, 0, 35, 0,201, 0, 0, 0, 80, 1, 0, 0, 0, 0, 35, 0, 80, 1, 0, 0,
+ 0, 2, 0, 0, 0, 0, 35, 0,201, 0, 0, 0, 0, 2, 0, 0, 0, 0, 35, 0,200, 0, 0, 0,255, 1, 0, 0, 0, 0, 35, 0,
+238, 0, 0, 0,255, 1, 0, 0, 0, 0, 35, 0,200, 0, 0, 0,238, 0, 0, 0, 0, 0, 35, 0, 80, 1, 0, 0, 1, 2, 0, 0,
+ 0, 0, 35, 0, 80, 1, 0, 0, 82, 1, 0, 0, 0, 0, 35, 0, 82, 1, 0, 0, 1, 2, 0, 0, 0, 0, 35, 0, 1, 2, 0, 0,
+ 2, 2, 0, 0, 0, 0, 35, 0, 2, 2, 0, 0, 3, 2, 0, 0, 0, 0, 35, 0, 1, 2, 0, 0, 3, 2, 0, 0, 0, 0, 35, 0,
+ 81, 1, 0, 0, 85, 1, 0, 0, 0, 0, 35, 0, 81, 1, 0, 0, 3, 2, 0, 0, 0, 0, 35, 0, 85, 1, 0, 0, 3, 2, 0, 0,
+ 0, 0, 35, 0, 84, 1, 0, 0, 2, 2, 0, 0, 0, 0, 35, 0, 83, 1, 0, 0, 2, 2, 0, 0, 0, 0, 35, 0, 83, 1, 0, 0,
+ 84, 1, 0, 0, 0, 0, 35, 0,236, 0, 0, 0, 4, 2, 0, 0, 0, 0, 35, 0,236, 0, 0, 0,240, 0, 0, 0, 0, 0, 35, 0,
+240, 0, 0, 0, 4, 2, 0, 0, 0, 0, 35, 0, 4, 2, 0, 0, 5, 2, 0, 0, 0, 0, 35, 0, 5, 2, 0, 0, 6, 2, 0, 0,
+ 0, 0, 35, 0, 4, 2, 0, 0, 6, 2, 0, 0, 0, 0, 35, 0,237, 0, 0, 0, 84, 1, 0, 0, 0, 0, 35, 0,237, 0, 0, 0,
+ 6, 2, 0, 0, 0, 0, 35, 0, 84, 1, 0, 0, 6, 2, 0, 0, 0, 0, 35, 0, 85, 1, 0, 0, 5, 2, 0, 0, 0, 0, 35, 0,
+241, 0, 0, 0, 5, 2, 0, 0, 0, 0, 35, 0,241, 0, 0, 0, 85, 1, 0, 0, 0, 0, 35, 0,235, 0, 0, 0, 7, 2, 0, 0,
+ 0, 0, 35, 0,235, 0, 0, 0, 83, 1, 0, 0, 0, 0, 35, 0, 83, 1, 0, 0, 7, 2, 0, 0, 0, 0, 35, 0, 7, 2, 0, 0,
+ 8, 2, 0, 0, 0, 0, 35, 0, 8, 2, 0, 0, 9, 2, 0, 0, 0, 0, 35, 0, 7, 2, 0, 0, 9, 2, 0, 0, 0, 0, 35, 0,
+198, 0, 0, 0,234, 0, 0, 0, 0, 0, 35, 0,234, 0, 0, 0, 9, 2, 0, 0, 0, 0, 35, 0,198, 0, 0, 0, 9, 2, 0, 0,
+ 0, 0, 35, 0,199, 0, 0, 0, 8, 2, 0, 0, 0, 0, 35, 0, 82, 1, 0, 0, 8, 2, 0, 0, 0, 0, 35, 0,199, 0, 0, 0,
+ 82, 1, 0, 0, 0, 0, 35, 0, 87, 1, 0, 0, 10, 2, 0, 0, 0, 0, 35, 0,245, 0, 0, 0, 10, 2, 0, 0, 0, 0, 35, 0,
+245, 0, 0, 0, 87, 1, 0, 0, 0, 0, 35, 0, 10, 2, 0, 0, 11, 2, 0, 0, 0, 0, 35, 0, 10, 2, 0, 0, 12, 2, 0, 0,
+ 0, 0, 35, 0, 11, 2, 0, 0, 12, 2, 0, 0, 0, 0, 35, 0,209, 0, 0, 0, 86, 1, 0, 0, 0, 0, 35, 0,209, 0, 0, 0,
+ 12, 2, 0, 0, 0, 0, 35, 0, 86, 1, 0, 0, 12, 2, 0, 0, 0, 0, 35, 0,208, 0, 0, 0, 11, 2, 0, 0, 0, 0, 35, 0,
+208, 0, 0, 0,244, 0, 0, 0, 0, 0, 35, 0,244, 0, 0, 0, 11, 2, 0, 0, 0, 0, 35, 0, 86, 1, 0, 0, 13, 2, 0, 0,
+ 0, 0, 35, 0, 88, 1, 0, 0, 13, 2, 0, 0, 0, 0, 35, 0, 86, 1, 0, 0, 88, 1, 0, 0, 0, 0, 35, 0, 13, 2, 0, 0,
+ 14, 2, 0, 0, 0, 0, 35, 0, 13, 2, 0, 0, 15, 2, 0, 0, 0, 0, 35, 0, 14, 2, 0, 0, 15, 2, 0, 0, 0, 0, 35, 0,
+ 87, 1, 0, 0, 91, 1, 0, 0, 0, 0, 35, 0, 91, 1, 0, 0, 15, 2, 0, 0, 0, 0, 35, 0, 87, 1, 0, 0, 15, 2, 0, 0,
+ 0, 0, 35, 0, 90, 1, 0, 0, 14, 2, 0, 0, 0, 0, 35, 0, 89, 1, 0, 0, 90, 1, 0, 0, 0, 0, 35, 0, 89, 1, 0, 0,
+ 14, 2, 0, 0, 0, 0, 35, 0,212, 0, 0, 0, 16, 2, 0, 0, 0, 0, 35, 0,242, 0, 0, 0, 16, 2, 0, 0, 0, 0, 35, 0,
+212, 0, 0, 0,242, 0, 0, 0, 0, 0, 35, 0, 16, 2, 0, 0, 17, 2, 0, 0, 0, 0, 35, 0, 16, 2, 0, 0, 18, 2, 0, 0,
+ 0, 0, 35, 0, 17, 2, 0, 0, 18, 2, 0, 0, 0, 0, 35, 0,213, 0, 0, 0, 90, 1, 0, 0, 0, 0, 35, 0, 90, 1, 0, 0,
+ 18, 2, 0, 0, 0, 0, 35, 0,213, 0, 0, 0, 18, 2, 0, 0, 0, 0, 35, 0, 91, 1, 0, 0, 17, 2, 0, 0, 0, 0, 35, 0,
+243, 0, 0, 0, 91, 1, 0, 0, 0, 0, 35, 0,243, 0, 0, 0, 17, 2, 0, 0, 0, 0, 35, 0,211, 0, 0, 0, 19, 2, 0, 0,
+ 0, 0, 35, 0, 89, 1, 0, 0, 19, 2, 0, 0, 0, 0, 35, 0,211, 0, 0, 0, 89, 1, 0, 0, 0, 0, 35, 0, 19, 2, 0, 0,
+ 20, 2, 0, 0, 0, 0, 35, 0, 19, 2, 0, 0, 21, 2, 0, 0, 0, 0, 35, 0, 20, 2, 0, 0, 21, 2, 0, 0, 0, 0, 35, 0,
+206, 0, 0, 0,210, 0, 0, 0, 0, 0, 35, 0,206, 0, 0, 0, 21, 2, 0, 0, 0, 0, 35, 0,210, 0, 0, 0, 21, 2, 0, 0,
+ 0, 0, 35, 0,207, 0, 0, 0, 20, 2, 0, 0, 0, 0, 35, 0,207, 0, 0, 0, 88, 1, 0, 0, 0, 0, 35, 0, 88, 1, 0, 0,
+ 20, 2, 0, 0, 0, 0, 35, 0, 93, 1, 0, 0, 22, 2, 0, 0, 0, 0, 35, 0,247, 0, 0, 0, 22, 2, 0, 0, 0, 0, 35, 0,
+247, 0, 0, 0, 93, 1, 0, 0, 0, 0, 35, 0, 22, 2, 0, 0, 23, 2, 0, 0, 0, 0, 35, 0, 22, 2, 0, 0, 24, 2, 0, 0,
+ 0, 0, 35, 0, 23, 2, 0, 0, 24, 2, 0, 0, 0, 0, 35, 0,217, 0, 0, 0, 92, 1, 0, 0, 0, 0, 35, 0,217, 0, 0, 0,
+ 24, 2, 0, 0, 0, 0, 35, 0, 92, 1, 0, 0, 24, 2, 0, 0, 0, 0, 35, 0,216, 0, 0, 0, 23, 2, 0, 0, 0, 0, 35, 0,
+216, 0, 0, 0,246, 0, 0, 0, 0, 0, 35, 0,246, 0, 0, 0, 23, 2, 0, 0, 0, 0, 35, 0, 92, 1, 0, 0, 25, 2, 0, 0,
+ 0, 0, 35, 0, 94, 1, 0, 0, 25, 2, 0, 0, 0, 0, 35, 0, 92, 1, 0, 0, 94, 1, 0, 0, 0, 0, 35, 0, 25, 2, 0, 0,
+ 26, 2, 0, 0, 0, 0, 35, 0, 25, 2, 0, 0, 27, 2, 0, 0, 0, 0, 35, 0, 26, 2, 0, 0, 27, 2, 0, 0, 0, 0, 35, 0,
+ 93, 1, 0, 0, 97, 1, 0, 0, 0, 0, 35, 0, 97, 1, 0, 0, 27, 2, 0, 0, 0, 0, 35, 0, 93, 1, 0, 0, 27, 2, 0, 0,
+ 0, 0, 35, 0, 96, 1, 0, 0, 26, 2, 0, 0, 0, 0, 35, 0, 95, 1, 0, 0, 96, 1, 0, 0, 0, 0, 35, 0, 95, 1, 0, 0,
+ 26, 2, 0, 0, 0, 0, 35, 0,220, 0, 0, 0, 28, 2, 0, 0, 0, 0, 35, 0,248, 0, 0, 0, 28, 2, 0, 0, 0, 0, 35, 0,
+220, 0, 0, 0,248, 0, 0, 0, 0, 0, 35, 0, 28, 2, 0, 0, 29, 2, 0, 0, 0, 0, 35, 0, 28, 2, 0, 0, 30, 2, 0, 0,
+ 0, 0, 35, 0, 29, 2, 0, 0, 30, 2, 0, 0, 0, 0, 35, 0,221, 0, 0, 0, 96, 1, 0, 0, 0, 0, 35, 0, 96, 1, 0, 0,
+ 30, 2, 0, 0, 0, 0, 35, 0,221, 0, 0, 0, 30, 2, 0, 0, 0, 0, 35, 0, 97, 1, 0, 0, 29, 2, 0, 0, 0, 0, 35, 0,
+249, 0, 0, 0, 97, 1, 0, 0, 0, 0, 35, 0,249, 0, 0, 0, 29, 2, 0, 0, 0, 0, 35, 0,219, 0, 0, 0, 31, 2, 0, 0,
+ 0, 0, 35, 0, 95, 1, 0, 0, 31, 2, 0, 0, 0, 0, 35, 0,219, 0, 0, 0, 95, 1, 0, 0, 0, 0, 35, 0, 31, 2, 0, 0,
+ 32, 2, 0, 0, 0, 0, 35, 0, 31, 2, 0, 0, 33, 2, 0, 0, 0, 0, 35, 0, 32, 2, 0, 0, 33, 2, 0, 0, 0, 0, 35, 0,
+214, 0, 0, 0,218, 0, 0, 0, 0, 0, 35, 0,214, 0, 0, 0, 33, 2, 0, 0, 0, 0, 35, 0,218, 0, 0, 0, 33, 2, 0, 0,
+ 0, 0, 35, 0,215, 0, 0, 0, 32, 2, 0, 0, 0, 0, 35, 0,215, 0, 0, 0, 94, 1, 0, 0, 0, 0, 35, 0, 94, 1, 0, 0,
+ 32, 2, 0, 0, 0, 0, 35, 0, 99, 1, 0, 0, 34, 2, 0, 0, 0, 0, 35, 0,251, 0, 0, 0, 34, 2, 0, 0, 0, 0, 35, 0,
+251, 0, 0, 0, 99, 1, 0, 0, 0, 0, 35, 0, 34, 2, 0, 0, 35, 2, 0, 0, 0, 0, 35, 0, 34, 2, 0, 0, 36, 2, 0, 0,
+ 0, 0, 35, 0, 35, 2, 0, 0, 36, 2, 0, 0, 0, 0, 35, 0,225, 0, 0, 0, 98, 1, 0, 0, 0, 0, 35, 0,225, 0, 0, 0,
+ 36, 2, 0, 0, 0, 0, 35, 0, 98, 1, 0, 0, 36, 2, 0, 0, 0, 0, 35, 0,224, 0, 0, 0, 35, 2, 0, 0, 0, 0, 35, 0,
+224, 0, 0, 0,250, 0, 0, 0, 0, 0, 35, 0,250, 0, 0, 0, 35, 2, 0, 0, 0, 0, 35, 0, 98, 1, 0, 0, 37, 2, 0, 0,
+ 0, 0, 35, 0,100, 1, 0, 0, 37, 2, 0, 0, 0, 0, 35, 0, 98, 1, 0, 0,100, 1, 0, 0, 0, 0, 35, 0, 37, 2, 0, 0,
+ 38, 2, 0, 0, 0, 0, 35, 0, 37, 2, 0, 0, 39, 2, 0, 0, 0, 0, 35, 0, 38, 2, 0, 0, 39, 2, 0, 0, 0, 0, 35, 0,
+ 99, 1, 0, 0,103, 1, 0, 0, 0, 0, 35, 0,103, 1, 0, 0, 39, 2, 0, 0, 0, 0, 35, 0, 99, 1, 0, 0, 39, 2, 0, 0,
+ 0, 0, 35, 0,102, 1, 0, 0, 38, 2, 0, 0, 0, 0, 35, 0,101, 1, 0, 0,102, 1, 0, 0, 0, 0, 35, 0,101, 1, 0, 0,
+ 38, 2, 0, 0, 0, 0, 35, 0,228, 0, 0, 0, 40, 2, 0, 0, 0, 0, 35, 0,252, 0, 0, 0, 40, 2, 0, 0, 0, 0, 35, 0,
+228, 0, 0, 0,252, 0, 0, 0, 0, 0, 35, 0, 40, 2, 0, 0, 41, 2, 0, 0, 0, 0, 35, 0, 40, 2, 0, 0, 42, 2, 0, 0,
+ 0, 0, 35, 0, 41, 2, 0, 0, 42, 2, 0, 0, 0, 0, 35, 0,229, 0, 0, 0,102, 1, 0, 0, 0, 0, 35, 0,102, 1, 0, 0,
+ 42, 2, 0, 0, 0, 0, 35, 0,229, 0, 0, 0, 42, 2, 0, 0, 0, 0, 35, 0,103, 1, 0, 0, 41, 2, 0, 0, 0, 0, 35, 0,
+253, 0, 0, 0,103, 1, 0, 0, 0, 0, 35, 0,253, 0, 0, 0, 41, 2, 0, 0, 0, 0, 35, 0,227, 0, 0, 0, 43, 2, 0, 0,
+ 0, 0, 35, 0,101, 1, 0, 0, 43, 2, 0, 0, 0, 0, 35, 0,227, 0, 0, 0,101, 1, 0, 0, 0, 0, 35, 0, 43, 2, 0, 0,
+ 44, 2, 0, 0, 0, 0, 35, 0, 43, 2, 0, 0, 45, 2, 0, 0, 0, 0, 35, 0, 44, 2, 0, 0, 45, 2, 0, 0, 0, 0, 35, 0,
+222, 0, 0, 0,226, 0, 0, 0, 0, 0, 35, 0,222, 0, 0, 0, 45, 2, 0, 0, 0, 0, 35, 0,226, 0, 0, 0, 45, 2, 0, 0,
+ 0, 0, 35, 0,223, 0, 0, 0, 44, 2, 0, 0, 0, 0, 35, 0,223, 0, 0, 0,100, 1, 0, 0, 0, 0, 35, 0,100, 1, 0, 0,
+ 44, 2, 0, 0, 0, 0, 35, 0,105, 1, 0, 0, 46, 2, 0, 0, 0, 0, 35, 0,255, 0, 0, 0, 46, 2, 0, 0, 0, 0, 35, 0,
+255, 0, 0, 0,105, 1, 0, 0, 0, 0, 35, 0, 46, 2, 0, 0, 47, 2, 0, 0, 0, 0, 35, 0, 46, 2, 0, 0, 48, 2, 0, 0,
+ 0, 0, 35, 0, 47, 2, 0, 0, 48, 2, 0, 0, 0, 0, 35, 0,233, 0, 0, 0,104, 1, 0, 0, 0, 0, 35, 0,233, 0, 0, 0,
+ 48, 2, 0, 0, 0, 0, 35, 0,104, 1, 0, 0, 48, 2, 0, 0, 0, 0, 35, 0,232, 0, 0, 0, 47, 2, 0, 0, 0, 0, 35, 0,
+232, 0, 0, 0,254, 0, 0, 0, 0, 0, 35, 0,254, 0, 0, 0, 47, 2, 0, 0, 0, 0, 35, 0,104, 1, 0, 0, 49, 2, 0, 0,
+ 0, 0, 35, 0,106, 1, 0, 0, 49, 2, 0, 0, 0, 0, 35, 0,104, 1, 0, 0,106, 1, 0, 0, 0, 0, 35, 0, 49, 2, 0, 0,
+ 50, 2, 0, 0, 0, 0, 35, 0, 49, 2, 0, 0, 51, 2, 0, 0, 0, 0, 35, 0, 50, 2, 0, 0, 51, 2, 0, 0, 0, 0, 35, 0,
+105, 1, 0, 0,109, 1, 0, 0, 0, 0, 35, 0,109, 1, 0, 0, 51, 2, 0, 0, 0, 0, 35, 0,105, 1, 0, 0, 51, 2, 0, 0,
+ 0, 0, 35, 0,108, 1, 0, 0, 50, 2, 0, 0, 0, 0, 35, 0,107, 1, 0, 0,108, 1, 0, 0, 0, 0, 35, 0,107, 1, 0, 0,
+ 50, 2, 0, 0, 0, 0, 35, 0,236, 0, 0, 0, 52, 2, 0, 0, 0, 0, 35, 0, 0, 1, 0, 0, 52, 2, 0, 0, 0, 0, 35, 0,
+236, 0, 0, 0, 0, 1, 0, 0, 0, 0, 35, 0, 52, 2, 0, 0, 53, 2, 0, 0, 0, 0, 35, 0, 52, 2, 0, 0, 54, 2, 0, 0,
+ 0, 0, 35, 0, 53, 2, 0, 0, 54, 2, 0, 0, 0, 0, 35, 0,237, 0, 0, 0,108, 1, 0, 0, 0, 0, 35, 0,108, 1, 0, 0,
+ 54, 2, 0, 0, 0, 0, 35, 0,237, 0, 0, 0, 54, 2, 0, 0, 0, 0, 35, 0,109, 1, 0, 0, 53, 2, 0, 0, 0, 0, 35, 0,
+ 1, 1, 0, 0,109, 1, 0, 0, 0, 0, 35, 0, 1, 1, 0, 0, 53, 2, 0, 0, 0, 0, 35, 0,235, 0, 0, 0, 55, 2, 0, 0,
+ 0, 0, 35, 0,107, 1, 0, 0, 55, 2, 0, 0, 0, 0, 35, 0,235, 0, 0, 0,107, 1, 0, 0, 0, 0, 35, 0, 55, 2, 0, 0,
+ 56, 2, 0, 0, 0, 0, 35, 0, 55, 2, 0, 0, 57, 2, 0, 0, 0, 0, 35, 0, 56, 2, 0, 0, 57, 2, 0, 0, 0, 0, 35, 0,
+230, 0, 0, 0,234, 0, 0, 0, 0, 0, 35, 0,230, 0, 0, 0, 57, 2, 0, 0, 0, 0, 35, 0,234, 0, 0, 0, 57, 2, 0, 0,
+ 0, 0, 35, 0,231, 0, 0, 0, 56, 2, 0, 0, 0, 0, 35, 0,231, 0, 0, 0,106, 1, 0, 0, 0, 0, 35, 0,106, 1, 0, 0,
+ 56, 2, 0, 0, 0, 0, 35, 0,111, 1, 0, 0, 58, 2, 0, 0, 0, 0, 35, 0, 3, 1, 0, 0, 58, 2, 0, 0, 0, 0, 35, 0,
+ 3, 1, 0, 0,111, 1, 0, 0, 0, 0, 35, 0, 58, 2, 0, 0, 59, 2, 0, 0, 0, 0, 35, 0, 58, 2, 0, 0, 60, 2, 0, 0,
+ 0, 0, 35, 0, 59, 2, 0, 0, 60, 2, 0, 0, 0, 0, 35, 0,241, 0, 0, 0,110, 1, 0, 0, 0, 0, 35, 0,241, 0, 0, 0,
+ 60, 2, 0, 0, 0, 0, 35, 0,110, 1, 0, 0, 60, 2, 0, 0, 0, 0, 35, 0,240, 0, 0, 0, 59, 2, 0, 0, 0, 0, 35, 0,
+240, 0, 0, 0, 2, 1, 0, 0, 0, 0, 35, 0, 2, 1, 0, 0, 59, 2, 0, 0, 0, 0, 35, 0,110, 1, 0, 0, 61, 2, 0, 0,
+ 0, 0, 35, 0,113, 1, 0, 0, 61, 2, 0, 0, 0, 0, 35, 0,110, 1, 0, 0,113, 1, 0, 0, 0, 0, 35, 0, 61, 2, 0, 0,
+ 62, 2, 0, 0, 0, 0, 35, 0, 61, 2, 0, 0, 63, 2, 0, 0, 0, 0, 35, 0, 62, 2, 0, 0, 63, 2, 0, 0, 0, 0, 35, 0,
+111, 1, 0, 0,115, 1, 0, 0, 0, 0, 35, 0,115, 1, 0, 0, 63, 2, 0, 0, 0, 0, 35, 0,111, 1, 0, 0, 63, 2, 0, 0,
+ 0, 0, 35, 0,114, 1, 0, 0, 62, 2, 0, 0, 0, 0, 35, 0,112, 1, 0, 0,114, 1, 0, 0, 0, 0, 35, 0,112, 1, 0, 0,
+ 62, 2, 0, 0, 0, 0, 35, 0,204, 0, 0, 0, 64, 2, 0, 0, 0, 0, 35, 0, 4, 1, 0, 0, 64, 2, 0, 0, 0, 0, 35, 0,
+204, 0, 0, 0, 4, 1, 0, 0, 0, 0, 35, 0, 64, 2, 0, 0, 65, 2, 0, 0, 0, 0, 35, 0, 64, 2, 0, 0, 66, 2, 0, 0,
+ 0, 0, 35, 0, 65, 2, 0, 0, 66, 2, 0, 0, 0, 0, 35, 0,205, 0, 0, 0,114, 1, 0, 0, 0, 0, 35, 0,114, 1, 0, 0,
+ 66, 2, 0, 0, 0, 0, 35, 0,205, 0, 0, 0, 66, 2, 0, 0, 0, 0, 35, 0,115, 1, 0, 0, 65, 2, 0, 0, 0, 0, 35, 0,
+ 5, 1, 0, 0,115, 1, 0, 0, 0, 0, 35, 0, 5, 1, 0, 0, 65, 2, 0, 0, 0, 0, 35, 0,203, 0, 0, 0, 67, 2, 0, 0,
+ 0, 0, 35, 0,112, 1, 0, 0, 67, 2, 0, 0, 0, 0, 35, 0,203, 0, 0, 0,112, 1, 0, 0, 0, 0, 35, 0, 67, 2, 0, 0,
+ 68, 2, 0, 0, 0, 0, 35, 0, 67, 2, 0, 0, 69, 2, 0, 0, 0, 0, 35, 0, 68, 2, 0, 0, 69, 2, 0, 0, 0, 0, 35, 0,
+202, 0, 0, 0,238, 0, 0, 0, 0, 0, 35, 0,238, 0, 0, 0, 69, 2, 0, 0, 0, 0, 35, 0,202, 0, 0, 0, 69, 2, 0, 0,
+ 0, 0, 35, 0,239, 0, 0, 0, 68, 2, 0, 0, 0, 0, 35, 0,239, 0, 0, 0,113, 1, 0, 0, 0, 0, 35, 0,113, 1, 0, 0,
+ 68, 2, 0, 0, 0, 0, 35, 0,117, 1, 0, 0, 70, 2, 0, 0, 0, 0, 35, 0, 11, 1, 0, 0,117, 1, 0, 0, 0, 0, 35, 0,
+ 11, 1, 0, 0, 70, 2, 0, 0, 0, 0, 35, 0, 70, 2, 0, 0, 71, 2, 0, 0, 0, 0, 35, 0, 71, 2, 0, 0, 72, 2, 0, 0,
+ 0, 0, 35, 0, 70, 2, 0, 0, 72, 2, 0, 0, 0, 0, 35, 0,243, 0, 0, 0,116, 1, 0, 0, 0, 0, 35, 0,116, 1, 0, 0,
+ 72, 2, 0, 0, 0, 0, 35, 0,243, 0, 0, 0, 72, 2, 0, 0, 0, 0, 35, 0,242, 0, 0, 0, 71, 2, 0, 0, 0, 0, 35, 0,
+ 10, 1, 0, 0, 71, 2, 0, 0, 0, 0, 35, 0,242, 0, 0, 0, 10, 1, 0, 0, 0, 0, 35, 0,116, 1, 0, 0, 73, 2, 0, 0,
+ 0, 0, 35, 0,116, 1, 0, 0,118, 1, 0, 0, 0, 0, 35, 0,118, 1, 0, 0, 73, 2, 0, 0, 0, 0, 35, 0, 73, 2, 0, 0,
+ 74, 2, 0, 0, 0, 0, 35, 0, 74, 2, 0, 0, 75, 2, 0, 0, 0, 0, 35, 0, 73, 2, 0, 0, 75, 2, 0, 0, 0, 0, 35, 0,
+117, 1, 0, 0,121, 1, 0, 0, 0, 0, 35, 0,117, 1, 0, 0, 75, 2, 0, 0, 0, 0, 35, 0,121, 1, 0, 0, 75, 2, 0, 0,
+ 0, 0, 35, 0,120, 1, 0, 0, 74, 2, 0, 0, 0, 0, 35, 0,119, 1, 0, 0, 74, 2, 0, 0, 0, 0, 35, 0,119, 1, 0, 0,
+120, 1, 0, 0, 0, 0, 35, 0, 8, 1, 0, 0, 76, 2, 0, 0, 0, 0, 35, 0, 8, 1, 0, 0, 12, 1, 0, 0, 0, 0, 35, 0,
+ 12, 1, 0, 0, 76, 2, 0, 0, 0, 0, 35, 0, 76, 2, 0, 0, 77, 2, 0, 0, 0, 0, 35, 0, 77, 2, 0, 0, 78, 2, 0, 0,
+ 0, 0, 35, 0, 76, 2, 0, 0, 78, 2, 0, 0, 0, 0, 35, 0, 9, 1, 0, 0,120, 1, 0, 0, 0, 0, 35, 0, 9, 1, 0, 0,
+ 78, 2, 0, 0, 0, 0, 35, 0,120, 1, 0, 0, 78, 2, 0, 0, 0, 0, 35, 0,121, 1, 0, 0, 77, 2, 0, 0, 0, 0, 35, 0,
+ 13, 1, 0, 0, 77, 2, 0, 0, 0, 0, 35, 0, 13, 1, 0, 0,121, 1, 0, 0, 0, 0, 35, 0, 7, 1, 0, 0, 79, 2, 0, 0,
+ 0, 0, 35, 0, 7, 1, 0, 0,119, 1, 0, 0, 0, 0, 35, 0,119, 1, 0, 0, 79, 2, 0, 0, 0, 0, 35, 0, 79, 2, 0, 0,
+ 80, 2, 0, 0, 0, 0, 35, 0, 80, 2, 0, 0, 81, 2, 0, 0, 0, 0, 35, 0, 79, 2, 0, 0, 81, 2, 0, 0, 0, 0, 35, 0,
+244, 0, 0, 0, 6, 1, 0, 0, 0, 0, 35, 0, 6, 1, 0, 0, 81, 2, 0, 0, 0, 0, 35, 0,244, 0, 0, 0, 81, 2, 0, 0,
+ 0, 0, 35, 0,245, 0, 0, 0, 80, 2, 0, 0, 0, 0, 35, 0,118, 1, 0, 0, 80, 2, 0, 0, 0, 0, 35, 0,245, 0, 0, 0,
+118, 1, 0, 0, 0, 0, 35, 0,123, 1, 0, 0, 82, 2, 0, 0, 0, 0, 35, 0, 15, 1, 0, 0,123, 1, 0, 0, 0, 0, 35, 0,
+ 15, 1, 0, 0, 82, 2, 0, 0, 0, 0, 35, 0, 82, 2, 0, 0, 83, 2, 0, 0, 0, 0, 35, 0, 83, 2, 0, 0, 84, 2, 0, 0,
+ 0, 0, 35, 0, 82, 2, 0, 0, 84, 2, 0, 0, 0, 0, 35, 0,249, 0, 0, 0,122, 1, 0, 0, 0, 0, 35, 0,122, 1, 0, 0,
+ 84, 2, 0, 0, 0, 0, 35, 0,249, 0, 0, 0, 84, 2, 0, 0, 0, 0, 35, 0,248, 0, 0, 0, 83, 2, 0, 0, 0, 0, 35, 0,
+ 14, 1, 0, 0, 83, 2, 0, 0, 0, 0, 35, 0,248, 0, 0, 0, 14, 1, 0, 0, 0, 0, 35, 0,122, 1, 0, 0, 85, 2, 0, 0,
+ 0, 0, 35, 0,122, 1, 0, 0,124, 1, 0, 0, 0, 0, 35, 0,124, 1, 0, 0, 85, 2, 0, 0, 0, 0, 35, 0, 85, 2, 0, 0,
+ 86, 2, 0, 0, 0, 0, 35, 0, 86, 2, 0, 0, 87, 2, 0, 0, 0, 0, 35, 0, 85, 2, 0, 0, 87, 2, 0, 0, 0, 0, 35, 0,
+123, 1, 0, 0,127, 1, 0, 0, 0, 0, 35, 0,123, 1, 0, 0, 87, 2, 0, 0, 0, 0, 35, 0,127, 1, 0, 0, 87, 2, 0, 0,
+ 0, 0, 35, 0,126, 1, 0, 0, 86, 2, 0, 0, 0, 0, 35, 0,125, 1, 0, 0, 86, 2, 0, 0, 0, 0, 35, 0,125, 1, 0, 0,
+126, 1, 0, 0, 0, 0, 35, 0, 12, 1, 0, 0, 88, 2, 0, 0, 0, 0, 35, 0, 12, 1, 0, 0, 16, 1, 0, 0, 0, 0, 35, 0,
+ 16, 1, 0, 0, 88, 2, 0, 0, 0, 0, 35, 0, 88, 2, 0, 0, 89, 2, 0, 0, 0, 0, 35, 0, 89, 2, 0, 0, 90, 2, 0, 0,
+ 0, 0, 35, 0, 88, 2, 0, 0, 90, 2, 0, 0, 0, 0, 35, 0, 13, 1, 0, 0,126, 1, 0, 0, 0, 0, 35, 0, 13, 1, 0, 0,
+ 90, 2, 0, 0, 0, 0, 35, 0,126, 1, 0, 0, 90, 2, 0, 0, 0, 0, 35, 0,127, 1, 0, 0, 89, 2, 0, 0, 0, 0, 35, 0,
+ 17, 1, 0, 0, 89, 2, 0, 0, 0, 0, 35, 0, 17, 1, 0, 0,127, 1, 0, 0, 0, 0, 35, 0, 11, 1, 0, 0, 91, 2, 0, 0,
+ 0, 0, 35, 0, 11, 1, 0, 0,125, 1, 0, 0, 0, 0, 35, 0,125, 1, 0, 0, 91, 2, 0, 0, 0, 0, 35, 0, 91, 2, 0, 0,
+ 92, 2, 0, 0, 0, 0, 35, 0, 92, 2, 0, 0, 93, 2, 0, 0, 0, 0, 35, 0, 91, 2, 0, 0, 93, 2, 0, 0, 0, 0, 35, 0,
+246, 0, 0, 0, 10, 1, 0, 0, 0, 0, 35, 0, 10, 1, 0, 0, 93, 2, 0, 0, 0, 0, 35, 0,246, 0, 0, 0, 93, 2, 0, 0,
+ 0, 0, 35, 0,247, 0, 0, 0, 92, 2, 0, 0, 0, 0, 35, 0,124, 1, 0, 0, 92, 2, 0, 0, 0, 0, 35, 0,247, 0, 0, 0,
+124, 1, 0, 0, 0, 0, 35, 0,129, 1, 0, 0, 94, 2, 0, 0, 0, 0, 35, 0, 19, 1, 0, 0,129, 1, 0, 0, 0, 0, 35, 0,
+ 19, 1, 0, 0, 94, 2, 0, 0, 0, 0, 35, 0, 94, 2, 0, 0, 95, 2, 0, 0, 0, 0, 35, 0, 95, 2, 0, 0, 96, 2, 0, 0,
+ 0, 0, 35, 0, 94, 2, 0, 0, 96, 2, 0, 0, 0, 0, 35, 0,253, 0, 0, 0,128, 1, 0, 0, 0, 0, 35, 0,128, 1, 0, 0,
+ 96, 2, 0, 0, 0, 0, 35, 0,253, 0, 0, 0, 96, 2, 0, 0, 0, 0, 35, 0,252, 0, 0, 0, 95, 2, 0, 0, 0, 0, 35, 0,
+ 18, 1, 0, 0, 95, 2, 0, 0, 0, 0, 35, 0,252, 0, 0, 0, 18, 1, 0, 0, 0, 0, 35, 0,128, 1, 0, 0, 97, 2, 0, 0,
+ 0, 0, 35, 0,128, 1, 0, 0,130, 1, 0, 0, 0, 0, 35, 0,130, 1, 0, 0, 97, 2, 0, 0, 0, 0, 35, 0, 97, 2, 0, 0,
+ 98, 2, 0, 0, 0, 0, 35, 0, 98, 2, 0, 0, 99, 2, 0, 0, 0, 0, 35, 0, 97, 2, 0, 0, 99, 2, 0, 0, 0, 0, 35, 0,
+129, 1, 0, 0,133, 1, 0, 0, 0, 0, 35, 0,129, 1, 0, 0, 99, 2, 0, 0, 0, 0, 35, 0,133, 1, 0, 0, 99, 2, 0, 0,
+ 0, 0, 35, 0,132, 1, 0, 0, 98, 2, 0, 0, 0, 0, 35, 0,131, 1, 0, 0, 98, 2, 0, 0, 0, 0, 35, 0,131, 1, 0, 0,
+132, 1, 0, 0, 0, 0, 35, 0, 16, 1, 0, 0,100, 2, 0, 0, 0, 0, 35, 0, 16, 1, 0, 0, 20, 1, 0, 0, 0, 0, 35, 0,
+ 20, 1, 0, 0,100, 2, 0, 0, 0, 0, 35, 0,100, 2, 0, 0,101, 2, 0, 0, 0, 0, 35, 0,101, 2, 0, 0,102, 2, 0, 0,
+ 0, 0, 35, 0,100, 2, 0, 0,102, 2, 0, 0, 0, 0, 35, 0, 17, 1, 0, 0,132, 1, 0, 0, 0, 0, 35, 0, 17, 1, 0, 0,
+102, 2, 0, 0, 0, 0, 35, 0,132, 1, 0, 0,102, 2, 0, 0, 0, 0, 35, 0,133, 1, 0, 0,101, 2, 0, 0, 0, 0, 35, 0,
+ 21, 1, 0, 0,101, 2, 0, 0, 0, 0, 35, 0, 21, 1, 0, 0,133, 1, 0, 0, 0, 0, 35, 0, 15, 1, 0, 0,103, 2, 0, 0,
+ 0, 0, 35, 0, 15, 1, 0, 0,131, 1, 0, 0, 0, 0, 35, 0,131, 1, 0, 0,103, 2, 0, 0, 0, 0, 35, 0,103, 2, 0, 0,
+104, 2, 0, 0, 0, 0, 35, 0,104, 2, 0, 0,105, 2, 0, 0, 0, 0, 35, 0,103, 2, 0, 0,105, 2, 0, 0, 0, 0, 35, 0,
+250, 0, 0, 0, 14, 1, 0, 0, 0, 0, 35, 0, 14, 1, 0, 0,105, 2, 0, 0, 0, 0, 35, 0,250, 0, 0, 0,105, 2, 0, 0,
+ 0, 0, 35, 0,251, 0, 0, 0,104, 2, 0, 0, 0, 0, 35, 0,130, 1, 0, 0,104, 2, 0, 0, 0, 0, 35, 0,251, 0, 0, 0,
+130, 1, 0, 0, 0, 0, 35, 0,135, 1, 0, 0,106, 2, 0, 0, 0, 0, 35, 0, 23, 1, 0, 0,135, 1, 0, 0, 0, 0, 35, 0,
+ 23, 1, 0, 0,106, 2, 0, 0, 0, 0, 35, 0,106, 2, 0, 0,107, 2, 0, 0, 0, 0, 35, 0,107, 2, 0, 0,108, 2, 0, 0,
+ 0, 0, 35, 0,106, 2, 0, 0,108, 2, 0, 0, 0, 0, 35, 0, 1, 1, 0, 0,134, 1, 0, 0, 0, 0, 35, 0,134, 1, 0, 0,
+108, 2, 0, 0, 0, 0, 35, 0, 1, 1, 0, 0,108, 2, 0, 0, 0, 0, 35, 0, 0, 1, 0, 0,107, 2, 0, 0, 0, 0, 35, 0,
+ 22, 1, 0, 0,107, 2, 0, 0, 0, 0, 35, 0, 0, 1, 0, 0, 22, 1, 0, 0, 0, 0, 35, 0,134, 1, 0, 0,109, 2, 0, 0,
+ 0, 0, 35, 0,134, 1, 0, 0,136, 1, 0, 0, 0, 0, 35, 0,136, 1, 0, 0,109, 2, 0, 0, 0, 0, 35, 0,109, 2, 0, 0,
+110, 2, 0, 0, 0, 0, 35, 0,110, 2, 0, 0,111, 2, 0, 0, 0, 0, 35, 0,109, 2, 0, 0,111, 2, 0, 0, 0, 0, 35, 0,
+135, 1, 0, 0,139, 1, 0, 0, 0, 0, 35, 0,135, 1, 0, 0,111, 2, 0, 0, 0, 0, 35, 0,139, 1, 0, 0,111, 2, 0, 0,
+ 0, 0, 35, 0,138, 1, 0, 0,110, 2, 0, 0, 0, 0, 35, 0,137, 1, 0, 0,110, 2, 0, 0, 0, 0, 35, 0,137, 1, 0, 0,
+138, 1, 0, 0, 0, 0, 35, 0, 20, 1, 0, 0,112, 2, 0, 0, 0, 0, 35, 0, 20, 1, 0, 0, 24, 1, 0, 0, 0, 0, 35, 0,
+ 24, 1, 0, 0,112, 2, 0, 0, 0, 0, 35, 0,112, 2, 0, 0,113, 2, 0, 0, 0, 0, 35, 0,113, 2, 0, 0,114, 2, 0, 0,
+ 0, 0, 35, 0,112, 2, 0, 0,114, 2, 0, 0, 0, 0, 35, 0, 21, 1, 0, 0,138, 1, 0, 0, 0, 0, 35, 0, 21, 1, 0, 0,
+114, 2, 0, 0, 0, 0, 35, 0,138, 1, 0, 0,114, 2, 0, 0, 0, 0, 35, 0,139, 1, 0, 0,113, 2, 0, 0, 0, 0, 35, 0,
+ 25, 1, 0, 0,113, 2, 0, 0, 0, 0, 35, 0, 25, 1, 0, 0,139, 1, 0, 0, 0, 0, 35, 0, 19, 1, 0, 0,115, 2, 0, 0,
+ 0, 0, 35, 0, 19, 1, 0, 0,137, 1, 0, 0, 0, 0, 35, 0,137, 1, 0, 0,115, 2, 0, 0, 0, 0, 35, 0,115, 2, 0, 0,
+116, 2, 0, 0, 0, 0, 35, 0,116, 2, 0, 0,117, 2, 0, 0, 0, 0, 35, 0,115, 2, 0, 0,117, 2, 0, 0, 0, 0, 35, 0,
+254, 0, 0, 0, 18, 1, 0, 0, 0, 0, 35, 0, 18, 1, 0, 0,117, 2, 0, 0, 0, 0, 35, 0,254, 0, 0, 0,117, 2, 0, 0,
+ 0, 0, 35, 0,255, 0, 0, 0,116, 2, 0, 0, 0, 0, 35, 0,136, 1, 0, 0,116, 2, 0, 0, 0, 0, 35, 0,255, 0, 0, 0,
+136, 1, 0, 0, 0, 0, 35, 0,141, 1, 0, 0,118, 2, 0, 0, 0, 0, 35, 0, 7, 1, 0, 0,141, 1, 0, 0, 0, 0, 35, 0,
+ 7, 1, 0, 0,118, 2, 0, 0, 0, 0, 35, 0,118, 2, 0, 0,119, 2, 0, 0, 0, 0, 35, 0,119, 2, 0, 0,120, 2, 0, 0,
+ 0, 0, 35, 0,118, 2, 0, 0,120, 2, 0, 0, 0, 0, 35, 0, 5, 1, 0, 0,140, 1, 0, 0, 0, 0, 35, 0,140, 1, 0, 0,
+120, 2, 0, 0, 0, 0, 35, 0, 5, 1, 0, 0,120, 2, 0, 0, 0, 0, 35, 0, 4, 1, 0, 0,119, 2, 0, 0, 0, 0, 35, 0,
+ 6, 1, 0, 0,119, 2, 0, 0, 0, 0, 35, 0, 4, 1, 0, 0, 6, 1, 0, 0, 0, 0, 35, 0,140, 1, 0, 0,121, 2, 0, 0,
+ 0, 0, 35, 0,140, 1, 0, 0,142, 1, 0, 0, 0, 0, 35, 0,142, 1, 0, 0,121, 2, 0, 0, 0, 0, 35, 0,121, 2, 0, 0,
+122, 2, 0, 0, 0, 0, 35, 0,122, 2, 0, 0,123, 2, 0, 0, 0, 0, 35, 0,121, 2, 0, 0,123, 2, 0, 0, 0, 0, 35, 0,
+141, 1, 0, 0,144, 1, 0, 0, 0, 0, 35, 0,141, 1, 0, 0,123, 2, 0, 0, 0, 0, 35, 0,144, 1, 0, 0,123, 2, 0, 0,
+ 0, 0, 35, 0,145, 1, 0, 0,122, 2, 0, 0, 0, 0, 35, 0,143, 1, 0, 0,122, 2, 0, 0, 0, 0, 35, 0,143, 1, 0, 0,
+145, 1, 0, 0, 0, 0, 35, 0, 24, 1, 0, 0,124, 2, 0, 0, 0, 0, 35, 0, 8, 1, 0, 0, 24, 1, 0, 0, 0, 0, 35, 0,
+ 8, 1, 0, 0,124, 2, 0, 0, 0, 0, 35, 0,124, 2, 0, 0,125, 2, 0, 0, 0, 0, 35, 0,125, 2, 0, 0,126, 2, 0, 0,
+ 0, 0, 35, 0,124, 2, 0, 0,126, 2, 0, 0, 0, 0, 35, 0, 25, 1, 0, 0,145, 1, 0, 0, 0, 0, 35, 0, 25, 1, 0, 0,
+126, 2, 0, 0, 0, 0, 35, 0,145, 1, 0, 0,126, 2, 0, 0, 0, 0, 35, 0,144, 1, 0, 0,125, 2, 0, 0, 0, 0, 35, 0,
+ 9, 1, 0, 0,125, 2, 0, 0, 0, 0, 35, 0, 9, 1, 0, 0,144, 1, 0, 0, 0, 0, 35, 0, 23, 1, 0, 0,127, 2, 0, 0,
+ 0, 0, 35, 0, 23, 1, 0, 0,143, 1, 0, 0, 0, 0, 35, 0,143, 1, 0, 0,127, 2, 0, 0, 0, 0, 35, 0,127, 2, 0, 0,
+128, 2, 0, 0, 0, 0, 35, 0,128, 2, 0, 0,129, 2, 0, 0, 0, 0, 35, 0,127, 2, 0, 0,129, 2, 0, 0, 0, 0, 35, 0,
+ 2, 1, 0, 0, 22, 1, 0, 0, 0, 0, 35, 0, 22, 1, 0, 0,129, 2, 0, 0, 0, 0, 35, 0, 2, 1, 0, 0,129, 2, 0, 0,
+ 0, 0, 35, 0, 3, 1, 0, 0,128, 2, 0, 0, 0, 0, 35, 0,142, 1, 0, 0,128, 2, 0, 0, 0, 0, 35, 0, 3, 1, 0, 0,
+142, 1, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 64, 1, 0, 0,240, 91,119, 1, 0, 0, 0, 0, 5, 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,112, 93,119, 1, 0, 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, 85, 86, 84,101,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,176,193,119, 1, 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, 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,240,177,120, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,100, 0, 0,112, 93,119, 1, 0, 0, 0, 0, 52, 0, 0, 0, 0, 5, 0, 0, 27, 1, 0, 0,102, 0, 0, 0,
+146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 1, 0, 0,171, 0, 0, 0, 27, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 14, 0, 0, 0, 27, 1, 0, 0,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,171, 0, 0, 0,146, 1, 0, 0, 46, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,147, 1, 0, 0, 46, 0, 0, 0,146, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 1, 0, 0,
+148, 1, 0, 0,147, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 0, 0, 0,147, 1, 0, 0,148, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,148, 1, 0, 0,146, 1, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 26, 1, 0, 0, 12, 0, 0, 0,
+165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,165, 0, 0, 0,148, 1, 0, 0, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+102, 0, 0, 0, 26, 1, 0, 0,148, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,148, 1, 0, 0,165, 0, 0, 0, 43, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,147, 1, 0, 0, 43, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,164, 0, 0, 0,
+170, 0, 0, 0,147, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 46, 0, 0, 0,147, 1, 0, 0,170, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,170, 0, 0, 0,164, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 26, 1, 0, 0,102, 0, 0, 0,
+149, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,149, 1, 0, 0, 28, 1, 0, 0, 26, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 12, 0, 0, 0, 26, 1, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 28, 1, 0, 0,149, 1, 0, 0,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,150, 1, 0, 0,103, 0, 0, 0,149, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,149, 1, 0, 0,
+151, 1, 0, 0,150, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 0, 0, 0,150, 1, 0, 0,151, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,151, 1, 0, 0,149, 1, 0, 0,102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 27, 1, 0, 0, 14, 0, 0, 0,
+ 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 1, 0, 0,151, 1, 0, 0, 27, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+102, 0, 0, 0, 27, 1, 0, 0,151, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,151, 1, 0, 0, 31, 1, 0, 0,104, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,150, 1, 0, 0,104, 0, 0, 0, 30, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 30, 1, 0, 0,
+ 29, 1, 0, 0,150, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,103, 0, 0, 0,150, 1, 0, 0, 29, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 29, 1, 0, 0, 30, 1, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,168, 0, 0, 0, 45, 0, 0, 0,
+152, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,152, 1, 0, 0,172, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 2, 0, 0, 0,168, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,172, 0, 0, 0,152, 1, 0, 0, 47, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,153, 1, 0, 0, 47, 0, 0, 0,152, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,152, 1, 0, 0,
+154, 1, 0, 0,153, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 0, 0, 0,153, 1, 0, 0,154, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,154, 1, 0, 0,152, 1, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,169, 0, 0, 0, 13, 0, 0, 0,
+ 30, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 30, 1, 0, 0,154, 1, 0, 0,169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 45, 0, 0, 0,169, 0, 0, 0,154, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,154, 1, 0, 0, 30, 1, 0, 0,104, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,153, 1, 0, 0,104, 0, 0, 0, 31, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 1, 0, 0,
+173, 0, 0, 0,153, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 0, 0, 0,153, 1, 0, 0,173, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,173, 0, 0, 0, 31, 1, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,167, 0, 0, 0, 44, 0, 0, 0,
+155, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,155, 1, 0, 0, 29, 1, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 13, 0, 0, 0,167, 0, 0, 0, 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 29, 1, 0, 0,155, 1, 0, 0,103, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,156, 1, 0, 0,103, 0, 0, 0,155, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,155, 1, 0, 0,
+157, 1, 0, 0,156, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 42, 0, 0, 0,156, 1, 0, 0,157, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,157, 1, 0, 0,155, 1, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,166, 0, 0, 0, 0, 0, 0, 0,
+162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,162, 0, 0, 0,157, 1, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 44, 0, 0, 0,166, 0, 0, 0,157, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,157, 1, 0, 0,162, 0, 0, 0, 42, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,156, 1, 0, 0, 42, 0, 0, 0,163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,163, 0, 0, 0,
+ 28, 1, 0, 0,156, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,103, 0, 0, 0,156, 1, 0, 0, 28, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 28, 1, 0, 0,163, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,158, 1, 0, 0,105, 0, 0, 0,
+ 33, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 33, 1, 0, 0,179, 0, 0, 0,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 50, 0, 0, 0,158, 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,179, 0, 0, 0, 33, 1, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,158, 1, 0, 0, 50, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,159, 1, 0, 0,
+160, 1, 0, 0,158, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 0, 0, 0,158, 1, 0, 0,160, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,160, 1, 0, 0,159, 1, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,165, 0, 0, 0, 12, 0, 0, 0,
+ 32, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 32, 1, 0, 0,160, 1, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 43, 0, 0, 0,165, 0, 0, 0,160, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,160, 1, 0, 0, 32, 1, 0, 0,105, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,164, 0, 0, 0, 43, 0, 0, 0,159, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,159, 1, 0, 0,
+178, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0,164, 0, 0, 0,178, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,178, 0, 0, 0,159, 1, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,161, 1, 0, 0,105, 0, 0, 0,
+ 32, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 32, 1, 0, 0, 34, 1, 0, 0,161, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+106, 0, 0, 0,161, 1, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 34, 1, 0, 0, 32, 1, 0, 0, 12, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,161, 1, 0, 0,106, 0, 0, 0,162, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,162, 1, 0, 0,
+163, 1, 0, 0,161, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 0, 0, 0,161, 1, 0, 0,163, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,163, 1, 0, 0,162, 1, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 1, 0, 0, 16, 0, 0, 0,
+ 33, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 33, 1, 0, 0,163, 1, 0, 0, 37, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+107, 0, 0, 0, 37, 1, 0, 0,163, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,163, 1, 0, 0, 33, 1, 0, 0,105, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 36, 1, 0, 0,107, 0, 0, 0,162, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,162, 1, 0, 0,
+ 35, 1, 0, 0, 36, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 0, 0, 0, 36, 1, 0, 0, 35, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 35, 1, 0, 0,162, 1, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,164, 1, 0, 0, 49, 0, 0, 0,
+176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,176, 0, 0, 0,180, 0, 0, 0,164, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 51, 0, 0, 0,164, 1, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,180, 0, 0, 0,176, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,164, 1, 0, 0, 51, 0, 0, 0,165, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,165, 1, 0, 0,
+166, 1, 0, 0,164, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 49, 0, 0, 0,164, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,166, 1, 0, 0,165, 1, 0, 0,107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 36, 1, 0, 0, 15, 0, 0, 0,
+177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,177, 0, 0, 0,166, 1, 0, 0, 36, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+107, 0, 0, 0, 36, 1, 0, 0,166, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,166, 1, 0, 0,177, 0, 0, 0, 49, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 37, 1, 0, 0,107, 0, 0, 0,165, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,165, 1, 0, 0,
+181, 0, 0, 0, 37, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 0, 0, 0, 37, 1, 0, 0,181, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,181, 0, 0, 0,165, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,167, 1, 0, 0, 48, 0, 0, 0,
+175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,175, 0, 0, 0, 35, 1, 0, 0,167, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+106, 0, 0, 0,167, 1, 0, 0, 35, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 35, 1, 0, 0,175, 0, 0, 0, 15, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,167, 1, 0, 0,106, 0, 0, 0,168, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,168, 1, 0, 0,
+169, 1, 0, 0,167, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 48, 0, 0, 0,167, 1, 0, 0,169, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,169, 1, 0, 0,168, 1, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,162, 0, 0, 0, 0, 0, 0, 0,
+174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,174, 0, 0, 0,169, 1, 0, 0,162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 42, 0, 0, 0,162, 0, 0, 0,169, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,169, 1, 0, 0,174, 0, 0, 0, 48, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,163, 0, 0, 0, 42, 0, 0, 0,168, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,168, 1, 0, 0,
+ 34, 1, 0, 0,163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 0, 0, 0,163, 0, 0, 0, 34, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 34, 1, 0, 0,168, 1, 0, 0,106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 1, 0, 0,108, 0, 0, 0,
+170, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,170, 1, 0, 0,187, 0, 0, 0, 39, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 18, 0, 0, 0, 39, 1, 0, 0,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,187, 0, 0, 0,170, 1, 0, 0, 54, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,171, 1, 0, 0, 54, 0, 0, 0,170, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,170, 1, 0, 0,
+172, 1, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 45, 0, 0, 0,171, 1, 0, 0,172, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,172, 1, 0, 0,170, 1, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 38, 1, 0, 0, 13, 0, 0, 0,
+169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,169, 0, 0, 0,172, 1, 0, 0, 38, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+108, 0, 0, 0, 38, 1, 0, 0,172, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,172, 1, 0, 0,169, 0, 0, 0, 45, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,171, 1, 0, 0, 45, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,168, 0, 0, 0,
+186, 0, 0, 0,171, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 54, 0, 0, 0,171, 1, 0, 0,186, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,186, 0, 0, 0,168, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 38, 1, 0, 0,108, 0, 0, 0,
+173, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,173, 1, 0, 0, 40, 1, 0, 0, 38, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 13, 0, 0, 0, 38, 1, 0, 0, 40, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 1, 0, 0,173, 1, 0, 0,109, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,174, 1, 0, 0,109, 0, 0, 0,173, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,173, 1, 0, 0,
+175, 1, 0, 0,174, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 0, 0, 0,174, 1, 0, 0,175, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,175, 1, 0, 0,173, 1, 0, 0,108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 1, 0, 0, 18, 0, 0, 0,
+ 43, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 1, 0, 0,175, 1, 0, 0, 39, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+108, 0, 0, 0, 39, 1, 0, 0,175, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,175, 1, 0, 0, 43, 1, 0, 0,110, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,174, 1, 0, 0,110, 0, 0, 0, 42, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 42, 1, 0, 0,
+ 41, 1, 0, 0,174, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,109, 0, 0, 0,174, 1, 0, 0, 41, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 41, 1, 0, 0, 42, 1, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,184, 0, 0, 0, 53, 0, 0, 0,
+176, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,176, 1, 0, 0,188, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 3, 0, 0, 0,184, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,188, 0, 0, 0,176, 1, 0, 0, 55, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,177, 1, 0, 0, 55, 0, 0, 0,176, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,176, 1, 0, 0,
+178, 1, 0, 0,177, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 0, 0, 0,177, 1, 0, 0,178, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,178, 1, 0, 0,176, 1, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,185, 0, 0, 0, 17, 0, 0, 0,
+ 42, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 42, 1, 0, 0,178, 1, 0, 0,185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 53, 0, 0, 0,185, 0, 0, 0,178, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,178, 1, 0, 0, 42, 1, 0, 0,110, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,177, 1, 0, 0,110, 0, 0, 0, 43, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 1, 0, 0,
+189, 0, 0, 0,177, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 0, 0, 0,177, 1, 0, 0,189, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,189, 0, 0, 0, 43, 1, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,183, 0, 0, 0, 52, 0, 0, 0,
+179, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,179, 1, 0, 0, 41, 1, 0, 0,183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 17, 0, 0, 0,183, 0, 0, 0, 41, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 41, 1, 0, 0,179, 1, 0, 0,109, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,180, 1, 0, 0,109, 0, 0, 0,179, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,179, 1, 0, 0,
+181, 1, 0, 0,180, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 44, 0, 0, 0,180, 1, 0, 0,181, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,181, 1, 0, 0,179, 1, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,182, 0, 0, 0, 0, 0, 0, 0,
+166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,166, 0, 0, 0,181, 1, 0, 0,182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 52, 0, 0, 0,182, 0, 0, 0,181, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,181, 1, 0, 0,166, 0, 0, 0, 44, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,180, 1, 0, 0, 44, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,167, 0, 0, 0,
+ 40, 1, 0, 0,180, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,109, 0, 0, 0,180, 1, 0, 0, 40, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 40, 1, 0, 0,167, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 45, 1, 0, 0,111, 0, 0, 0,
+182, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,182, 1, 0, 0,195, 0, 0, 0, 45, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 20, 0, 0, 0, 45, 1, 0, 0,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,195, 0, 0, 0,182, 1, 0, 0, 58, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,183, 1, 0, 0, 58, 0, 0, 0,182, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,182, 1, 0, 0,
+184, 1, 0, 0,183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 53, 0, 0, 0,183, 1, 0, 0,184, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,184, 1, 0, 0,182, 1, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 44, 1, 0, 0, 17, 0, 0, 0,
+185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,185, 0, 0, 0,184, 1, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+111, 0, 0, 0, 44, 1, 0, 0,184, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,184, 1, 0, 0,185, 0, 0, 0, 53, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,183, 1, 0, 0, 53, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,184, 0, 0, 0,
+194, 0, 0, 0,183, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 58, 0, 0, 0,183, 1, 0, 0,194, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,194, 0, 0, 0,184, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 44, 1, 0, 0,111, 0, 0, 0,
+185, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,185, 1, 0, 0, 46, 1, 0, 0, 44, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 17, 0, 0, 0, 44, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 46, 1, 0, 0,185, 1, 0, 0,112, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,186, 1, 0, 0,112, 0, 0, 0,185, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,185, 1, 0, 0,
+187, 1, 0, 0,186, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 0, 0, 0,186, 1, 0, 0,187, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,187, 1, 0, 0,185, 1, 0, 0,111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 45, 1, 0, 0, 20, 0, 0, 0,
+ 49, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 49, 1, 0, 0,187, 1, 0, 0, 45, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+111, 0, 0, 0, 45, 1, 0, 0,187, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,187, 1, 0, 0, 49, 1, 0, 0,113, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,186, 1, 0, 0,113, 0, 0, 0, 48, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 48, 1, 0, 0,
+ 47, 1, 0, 0,186, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,112, 0, 0, 0,186, 1, 0, 0, 47, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 47, 1, 0, 0, 48, 1, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,192, 0, 0, 0, 57, 0, 0, 0,
+188, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,188, 1, 0, 0,196, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 4, 0, 0, 0,192, 0, 0, 0,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,196, 0, 0, 0,188, 1, 0, 0, 59, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,189, 1, 0, 0, 59, 0, 0, 0,188, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,188, 1, 0, 0,
+190, 1, 0, 0,189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 0, 0, 0,189, 1, 0, 0,190, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,190, 1, 0, 0,188, 1, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,193, 0, 0, 0, 19, 0, 0, 0,
+ 48, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 48, 1, 0, 0,190, 1, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 57, 0, 0, 0,193, 0, 0, 0,190, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,190, 1, 0, 0, 48, 1, 0, 0,113, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,189, 1, 0, 0,113, 0, 0, 0, 49, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 49, 1, 0, 0,
+197, 0, 0, 0,189, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 59, 0, 0, 0,189, 1, 0, 0,197, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,197, 0, 0, 0, 49, 1, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,191, 0, 0, 0, 56, 0, 0, 0,
+191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,191, 1, 0, 0, 47, 1, 0, 0,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 19, 0, 0, 0,191, 0, 0, 0, 47, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 1, 0, 0,191, 1, 0, 0,112, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,192, 1, 0, 0,112, 0, 0, 0,191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,191, 1, 0, 0,
+193, 1, 0, 0,192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 52, 0, 0, 0,192, 1, 0, 0,193, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,193, 1, 0, 0,191, 1, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,190, 0, 0, 0, 0, 0, 0, 0,
+182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,182, 0, 0, 0,193, 1, 0, 0,190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 56, 0, 0, 0,190, 0, 0, 0,193, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,193, 1, 0, 0,182, 0, 0, 0, 52, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,192, 1, 0, 0, 52, 0, 0, 0,183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,183, 0, 0, 0,
+ 46, 1, 0, 0,192, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,112, 0, 0, 0,192, 1, 0, 0, 46, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 46, 1, 0, 0,183, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 51, 1, 0, 0,114, 0, 0, 0,
+194, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,194, 1, 0, 0,199, 0, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 21, 0, 0, 0, 51, 1, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,199, 0, 0, 0,194, 1, 0, 0, 60, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,195, 1, 0, 0, 60, 0, 0, 0,194, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,194, 1, 0, 0,
+196, 1, 0, 0,195, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 57, 0, 0, 0,195, 1, 0, 0,196, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,196, 1, 0, 0,194, 1, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 50, 1, 0, 0, 19, 0, 0, 0,
+193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,193, 0, 0, 0,196, 1, 0, 0, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+114, 0, 0, 0, 50, 1, 0, 0,196, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,196, 1, 0, 0,193, 0, 0, 0, 57, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,195, 1, 0, 0, 57, 0, 0, 0,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,192, 0, 0, 0,
+198, 0, 0, 0,195, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 60, 0, 0, 0,195, 1, 0, 0,198, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,198, 0, 0, 0,192, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 50, 1, 0, 0,114, 0, 0, 0,
+197, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,197, 1, 0, 0, 53, 1, 0, 0, 50, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 19, 0, 0, 0, 50, 1, 0, 0, 53, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 53, 1, 0, 0,197, 1, 0, 0,115, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,198, 1, 0, 0,115, 0, 0, 0,197, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,197, 1, 0, 0,
+199, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 0, 0, 0,198, 1, 0, 0,199, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,199, 1, 0, 0,197, 1, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 51, 1, 0, 0, 21, 0, 0, 0,
+ 55, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 1, 0, 0,199, 1, 0, 0, 51, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+114, 0, 0, 0, 51, 1, 0, 0,199, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,199, 1, 0, 0, 55, 1, 0, 0,116, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,198, 1, 0, 0,116, 0, 0, 0, 54, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 54, 1, 0, 0,
+ 52, 1, 0, 0,198, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,115, 0, 0, 0,198, 1, 0, 0, 52, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 52, 1, 0, 0, 54, 1, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,176, 0, 0, 0, 49, 0, 0, 0,
+200, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,200, 1, 0, 0,200, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 5, 0, 0, 0,176, 0, 0, 0,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,200, 0, 0, 0,200, 1, 0, 0, 61, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,201, 1, 0, 0, 61, 0, 0, 0,200, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,200, 1, 0, 0,
+202, 1, 0, 0,201, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 0, 0, 0,201, 1, 0, 0,202, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,202, 1, 0, 0,200, 1, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,177, 0, 0, 0, 15, 0, 0, 0,
+ 54, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 54, 1, 0, 0,202, 1, 0, 0,177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 49, 0, 0, 0,177, 0, 0, 0,202, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,202, 1, 0, 0, 54, 1, 0, 0,116, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,201, 1, 0, 0,116, 0, 0, 0, 55, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 1, 0, 0,
+201, 0, 0, 0,201, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 0, 0, 0,201, 1, 0, 0,201, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,201, 0, 0, 0, 55, 1, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,175, 0, 0, 0, 48, 0, 0, 0,
+203, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,203, 1, 0, 0, 52, 1, 0, 0,175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 15, 0, 0, 0,175, 0, 0, 0, 52, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 52, 1, 0, 0,203, 1, 0, 0,115, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,204, 1, 0, 0,115, 0, 0, 0,203, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,203, 1, 0, 0,
+205, 1, 0, 0,204, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 56, 0, 0, 0,204, 1, 0, 0,205, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,205, 1, 0, 0,203, 1, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,174, 0, 0, 0, 0, 0, 0, 0,
+190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,190, 0, 0, 0,205, 1, 0, 0,174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 48, 0, 0, 0,174, 0, 0, 0,205, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,205, 1, 0, 0,190, 0, 0, 0, 56, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,204, 1, 0, 0, 56, 0, 0, 0,191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,191, 0, 0, 0,
+ 53, 1, 0, 0,204, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,115, 0, 0, 0,204, 1, 0, 0, 53, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 53, 1, 0, 0,191, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,206, 1, 0, 0,117, 0, 0, 0,
+ 57, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 57, 1, 0, 0,207, 0, 0, 0,206, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 64, 0, 0, 0,206, 1, 0, 0,207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,207, 0, 0, 0, 57, 1, 0, 0, 23, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,206, 1, 0, 0, 64, 0, 0, 0,207, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,207, 1, 0, 0,
+208, 1, 0, 0,206, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,117, 0, 0, 0,206, 1, 0, 0,208, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,208, 1, 0, 0,207, 1, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,179, 0, 0, 0, 16, 0, 0, 0,
+ 56, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 56, 1, 0, 0,208, 1, 0, 0,179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 50, 0, 0, 0,179, 0, 0, 0,208, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,208, 1, 0, 0, 56, 1, 0, 0,117, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,178, 0, 0, 0, 50, 0, 0, 0,207, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,207, 1, 0, 0,
+206, 0, 0, 0,178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0,178, 0, 0, 0,206, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,206, 0, 0, 0,207, 1, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,209, 1, 0, 0,117, 0, 0, 0,
+ 56, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 56, 1, 0, 0, 58, 1, 0, 0,209, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+118, 0, 0, 0,209, 1, 0, 0, 58, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 58, 1, 0, 0, 56, 1, 0, 0, 16, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,209, 1, 0, 0,118, 0, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 1, 0, 0,
+211, 1, 0, 0,209, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,117, 0, 0, 0,209, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,211, 1, 0, 0,210, 1, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 1, 0, 0, 23, 0, 0, 0,
+ 57, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 57, 1, 0, 0,211, 1, 0, 0, 61, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+119, 0, 0, 0, 61, 1, 0, 0,211, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,211, 1, 0, 0, 57, 1, 0, 0,117, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 60, 1, 0, 0,119, 0, 0, 0,210, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 1, 0, 0,
+ 59, 1, 0, 0, 60, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 22, 0, 0, 0, 60, 1, 0, 0, 59, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 59, 1, 0, 0,210, 1, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,212, 1, 0, 0, 63, 0, 0, 0,
+204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,204, 0, 0, 0,208, 0, 0, 0,212, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 65, 0, 0, 0,212, 1, 0, 0,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,208, 0, 0, 0,204, 0, 0, 0, 10, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,212, 1, 0, 0, 65, 0, 0, 0,213, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,213, 1, 0, 0,
+214, 1, 0, 0,212, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 63, 0, 0, 0,212, 1, 0, 0,214, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,214, 1, 0, 0,213, 1, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 60, 1, 0, 0, 22, 0, 0, 0,
+205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,205, 0, 0, 0,214, 1, 0, 0, 60, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+119, 0, 0, 0, 60, 1, 0, 0,214, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,214, 1, 0, 0,205, 0, 0, 0, 63, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 61, 1, 0, 0,119, 0, 0, 0,213, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,213, 1, 0, 0,
+209, 0, 0, 0, 61, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 23, 0, 0, 0, 61, 1, 0, 0,209, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,209, 0, 0, 0,213, 1, 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,215, 1, 0, 0, 62, 0, 0, 0,
+203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,203, 0, 0, 0, 59, 1, 0, 0,215, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+118, 0, 0, 0,215, 1, 0, 0, 59, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 59, 1, 0, 0,203, 0, 0, 0, 22, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,215, 1, 0, 0,118, 0, 0, 0,216, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,216, 1, 0, 0,
+217, 1, 0, 0,215, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 62, 0, 0, 0,215, 1, 0, 0,217, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,217, 1, 0, 0,216, 1, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,180, 0, 0, 0, 5, 0, 0, 0,
+202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,202, 0, 0, 0,217, 1, 0, 0,180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 51, 0, 0, 0,180, 0, 0, 0,217, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,217, 1, 0, 0,202, 0, 0, 0, 62, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,181, 0, 0, 0, 51, 0, 0, 0,216, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,216, 1, 0, 0,
+ 58, 1, 0, 0,181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 0, 0, 0,181, 0, 0, 0, 58, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 58, 1, 0, 0,216, 1, 0, 0,118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,218, 1, 0, 0,120, 0, 0, 0,
+ 63, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 63, 1, 0, 0,215, 0, 0, 0,218, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 68, 0, 0, 0,218, 1, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,215, 0, 0, 0, 63, 1, 0, 0, 25, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,218, 1, 0, 0, 68, 0, 0, 0,219, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,219, 1, 0, 0,
+220, 1, 0, 0,218, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,120, 0, 0, 0,218, 1, 0, 0,220, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,220, 1, 0, 0,219, 1, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,173, 0, 0, 0, 14, 0, 0, 0,
+ 62, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 62, 1, 0, 0,220, 1, 0, 0,173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 47, 0, 0, 0,173, 0, 0, 0,220, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,220, 1, 0, 0, 62, 1, 0, 0,120, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,172, 0, 0, 0, 47, 0, 0, 0,219, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,219, 1, 0, 0,
+214, 0, 0, 0,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0,172, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,214, 0, 0, 0,219, 1, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,221, 1, 0, 0,120, 0, 0, 0,
+ 62, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 62, 1, 0, 0, 64, 1, 0, 0,221, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+121, 0, 0, 0,221, 1, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 64, 1, 0, 0, 62, 1, 0, 0, 14, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,221, 1, 0, 0,121, 0, 0, 0,222, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,222, 1, 0, 0,
+223, 1, 0, 0,221, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,120, 0, 0, 0,221, 1, 0, 0,223, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,223, 1, 0, 0,222, 1, 0, 0,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 67, 1, 0, 0, 25, 0, 0, 0,
+ 63, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 63, 1, 0, 0,223, 1, 0, 0, 67, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+122, 0, 0, 0, 67, 1, 0, 0,223, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,223, 1, 0, 0, 63, 1, 0, 0,120, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 66, 1, 0, 0,122, 0, 0, 0,222, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,222, 1, 0, 0,
+ 65, 1, 0, 0, 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 0, 0, 0, 66, 1, 0, 0, 65, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 65, 1, 0, 0,222, 1, 0, 0,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,224, 1, 0, 0, 67, 0, 0, 0,
+212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,212, 0, 0, 0,216, 0, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 69, 0, 0, 0,224, 1, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,216, 0, 0, 0,212, 0, 0, 0, 6, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,224, 1, 0, 0, 69, 0, 0, 0,225, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,225, 1, 0, 0,
+226, 1, 0, 0,224, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 67, 0, 0, 0,224, 1, 0, 0,226, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,226, 1, 0, 0,225, 1, 0, 0,122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 66, 1, 0, 0, 24, 0, 0, 0,
+213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,213, 0, 0, 0,226, 1, 0, 0, 66, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+122, 0, 0, 0, 66, 1, 0, 0,226, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,226, 1, 0, 0,213, 0, 0, 0, 67, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 67, 1, 0, 0,122, 0, 0, 0,225, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,225, 1, 0, 0,
+217, 0, 0, 0, 67, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 25, 0, 0, 0, 67, 1, 0, 0,217, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,217, 0, 0, 0,225, 1, 0, 0, 69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,227, 1, 0, 0, 66, 0, 0, 0,
+211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,211, 0, 0, 0, 65, 1, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+121, 0, 0, 0,227, 1, 0, 0, 65, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 65, 1, 0, 0,211, 0, 0, 0, 24, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,227, 1, 0, 0,121, 0, 0, 0,228, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,228, 1, 0, 0,
+229, 1, 0, 0,227, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 66, 0, 0, 0,227, 1, 0, 0,229, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,229, 1, 0, 0,228, 1, 0, 0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,170, 0, 0, 0, 1, 0, 0, 0,
+210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 0, 0, 0,229, 1, 0, 0,170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 46, 0, 0, 0,170, 0, 0, 0,229, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,229, 1, 0, 0,210, 0, 0, 0, 66, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,171, 0, 0, 0, 46, 0, 0, 0,228, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,228, 1, 0, 0,
+ 64, 1, 0, 0,171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 14, 0, 0, 0,171, 0, 0, 0, 64, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 64, 1, 0, 0,228, 1, 0, 0,121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,230, 1, 0, 0,123, 0, 0, 0,
+ 69, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 69, 1, 0, 0,223, 0, 0, 0,230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 72, 0, 0, 0,230, 1, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,223, 0, 0, 0, 69, 1, 0, 0, 27, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,230, 1, 0, 0, 72, 0, 0, 0,231, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231, 1, 0, 0,
+232, 1, 0, 0,230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,123, 0, 0, 0,230, 1, 0, 0,232, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,232, 1, 0, 0,231, 1, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,189, 0, 0, 0, 18, 0, 0, 0,
+ 68, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 68, 1, 0, 0,232, 1, 0, 0,189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 55, 0, 0, 0,189, 0, 0, 0,232, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,232, 1, 0, 0, 68, 1, 0, 0,123, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,188, 0, 0, 0, 55, 0, 0, 0,231, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231, 1, 0, 0,
+222, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0,188, 0, 0, 0,222, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,222, 0, 0, 0,231, 1, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,233, 1, 0, 0,123, 0, 0, 0,
+ 68, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 68, 1, 0, 0, 70, 1, 0, 0,233, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+124, 0, 0, 0,233, 1, 0, 0, 70, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 70, 1, 0, 0, 68, 1, 0, 0, 18, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,233, 1, 0, 0,124, 0, 0, 0,234, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,234, 1, 0, 0,
+235, 1, 0, 0,233, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,123, 0, 0, 0,233, 1, 0, 0,235, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,235, 1, 0, 0,234, 1, 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 73, 1, 0, 0, 27, 0, 0, 0,
+ 69, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 69, 1, 0, 0,235, 1, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+125, 0, 0, 0, 73, 1, 0, 0,235, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,235, 1, 0, 0, 69, 1, 0, 0,123, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 72, 1, 0, 0,125, 0, 0, 0,234, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,234, 1, 0, 0,
+ 71, 1, 0, 0, 72, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 26, 0, 0, 0, 72, 1, 0, 0, 71, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 71, 1, 0, 0,234, 1, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,236, 1, 0, 0, 71, 0, 0, 0,
+220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,220, 0, 0, 0,224, 0, 0, 0,236, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 73, 0, 0, 0,236, 1, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,224, 0, 0, 0,220, 0, 0, 0, 7, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,236, 1, 0, 0, 73, 0, 0, 0,237, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,237, 1, 0, 0,
+238, 1, 0, 0,236, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 0, 0, 0,236, 1, 0, 0,238, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,238, 1, 0, 0,237, 1, 0, 0,125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 72, 1, 0, 0, 26, 0, 0, 0,
+221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,221, 0, 0, 0,238, 1, 0, 0, 72, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+125, 0, 0, 0, 72, 1, 0, 0,238, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,238, 1, 0, 0,221, 0, 0, 0, 71, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 73, 1, 0, 0,125, 0, 0, 0,237, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,237, 1, 0, 0,
+225, 0, 0, 0, 73, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 27, 0, 0, 0, 73, 1, 0, 0,225, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,225, 0, 0, 0,237, 1, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,239, 1, 0, 0, 70, 0, 0, 0,
+219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,219, 0, 0, 0, 71, 1, 0, 0,239, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+124, 0, 0, 0,239, 1, 0, 0, 71, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 1, 0, 0,219, 0, 0, 0, 26, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,239, 1, 0, 0,124, 0, 0, 0,240, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 1, 0, 0,
+241, 1, 0, 0,239, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 70, 0, 0, 0,239, 1, 0, 0,241, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,241, 1, 0, 0,240, 1, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,186, 0, 0, 0, 2, 0, 0, 0,
+218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,218, 0, 0, 0,241, 1, 0, 0,186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 54, 0, 0, 0,186, 0, 0, 0,241, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,241, 1, 0, 0,218, 0, 0, 0, 70, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,187, 0, 0, 0, 54, 0, 0, 0,240, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 1, 0, 0,
+ 70, 1, 0, 0,187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 18, 0, 0, 0,187, 0, 0, 0, 70, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 70, 1, 0, 0,240, 1, 0, 0,124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,242, 1, 0, 0,126, 0, 0, 0,
+ 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 1, 0, 0,231, 0, 0, 0,242, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 76, 0, 0, 0,242, 1, 0, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231, 0, 0, 0, 75, 1, 0, 0, 29, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,242, 1, 0, 0, 76, 0, 0, 0,243, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,243, 1, 0, 0,
+244, 1, 0, 0,242, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,126, 0, 0, 0,242, 1, 0, 0,244, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,244, 1, 0, 0,243, 1, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,197, 0, 0, 0, 20, 0, 0, 0,
+ 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 74, 1, 0, 0,244, 1, 0, 0,197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 59, 0, 0, 0,197, 0, 0, 0,244, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,244, 1, 0, 0, 74, 1, 0, 0,126, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,196, 0, 0, 0, 59, 0, 0, 0,243, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,243, 1, 0, 0,
+230, 0, 0, 0,196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 0,196, 0, 0, 0,230, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,230, 0, 0, 0,243, 1, 0, 0, 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,245, 1, 0, 0,126, 0, 0, 0,
+ 74, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 74, 1, 0, 0, 76, 1, 0, 0,245, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+127, 0, 0, 0,245, 1, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 76, 1, 0, 0, 74, 1, 0, 0, 20, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,245, 1, 0, 0,127, 0, 0, 0,246, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,246, 1, 0, 0,
+247, 1, 0, 0,245, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,126, 0, 0, 0,245, 1, 0, 0,247, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,247, 1, 0, 0,246, 1, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 79, 1, 0, 0, 29, 0, 0, 0,
+ 75, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 1, 0, 0,247, 1, 0, 0, 79, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+128, 0, 0, 0, 79, 1, 0, 0,247, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,247, 1, 0, 0, 75, 1, 0, 0,126, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 78, 1, 0, 0,128, 0, 0, 0,246, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,246, 1, 0, 0,
+ 77, 1, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 28, 0, 0, 0, 78, 1, 0, 0, 77, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 77, 1, 0, 0,246, 1, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,248, 1, 0, 0, 75, 0, 0, 0,
+228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,228, 0, 0, 0,232, 0, 0, 0,248, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 77, 0, 0, 0,248, 1, 0, 0,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,232, 0, 0, 0,228, 0, 0, 0, 8, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,248, 1, 0, 0, 77, 0, 0, 0,249, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,249, 1, 0, 0,
+250, 1, 0, 0,248, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 0, 0, 0,248, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,250, 1, 0, 0,249, 1, 0, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 78, 1, 0, 0, 28, 0, 0, 0,
+229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,229, 0, 0, 0,250, 1, 0, 0, 78, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+128, 0, 0, 0, 78, 1, 0, 0,250, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,250, 1, 0, 0,229, 0, 0, 0, 75, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 79, 1, 0, 0,128, 0, 0, 0,249, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,249, 1, 0, 0,
+233, 0, 0, 0, 79, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 29, 0, 0, 0, 79, 1, 0, 0,233, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,233, 0, 0, 0,249, 1, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,251, 1, 0, 0, 74, 0, 0, 0,
+227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,227, 0, 0, 0, 77, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+127, 0, 0, 0,251, 1, 0, 0, 77, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 1, 0, 0,227, 0, 0, 0, 28, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,251, 1, 0, 0,127, 0, 0, 0,252, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,252, 1, 0, 0,
+253, 1, 0, 0,251, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 74, 0, 0, 0,251, 1, 0, 0,253, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,253, 1, 0, 0,252, 1, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,194, 0, 0, 0, 3, 0, 0, 0,
+226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,226, 0, 0, 0,253, 1, 0, 0,194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 58, 0, 0, 0,194, 0, 0, 0,253, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,253, 1, 0, 0,226, 0, 0, 0, 74, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,195, 0, 0, 0, 58, 0, 0, 0,252, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,252, 1, 0, 0,
+ 76, 1, 0, 0,195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 20, 0, 0, 0,195, 0, 0, 0, 76, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 76, 1, 0, 0,252, 1, 0, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,254, 1, 0, 0,129, 0, 0, 0,
+ 81, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 1, 0, 0,239, 0, 0, 0,254, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 80, 0, 0, 0,254, 1, 0, 0,239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,239, 0, 0, 0, 81, 1, 0, 0, 31, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,254, 1, 0, 0, 80, 0, 0, 0,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,255, 1, 0, 0,
+ 0, 2, 0, 0,254, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,129, 0, 0, 0,254, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 0, 2, 0, 0,255, 1, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,201, 0, 0, 0, 21, 0, 0, 0,
+ 80, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 1, 0, 0, 0, 2, 0, 0,201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 61, 0, 0, 0,201, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 0, 80, 1, 0, 0,129, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,200, 0, 0, 0, 61, 0, 0, 0,255, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,255, 1, 0, 0,
+238, 0, 0, 0,200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 0, 0, 0,200, 0, 0, 0,238, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,238, 0, 0, 0,255, 1, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0, 0,129, 0, 0, 0,
+ 80, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 1, 0, 0, 82, 1, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+130, 0, 0, 0, 1, 2, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 82, 1, 0, 0, 80, 1, 0, 0, 21, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 1, 2, 0, 0,130, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 0, 0,
+ 3, 2, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,129, 0, 0, 0, 1, 2, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 3, 2, 0, 0, 2, 2, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 85, 1, 0, 0, 31, 0, 0, 0,
+ 81, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 1, 0, 0, 3, 2, 0, 0, 85, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+131, 0, 0, 0, 85, 1, 0, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 2, 0, 0, 81, 1, 0, 0,129, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 84, 1, 0, 0,131, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 0, 0,
+ 83, 1, 0, 0, 84, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 30, 0, 0, 0, 84, 1, 0, 0, 83, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 83, 1, 0, 0, 2, 2, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 2, 0, 0, 79, 0, 0, 0,
+236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,236, 0, 0, 0,240, 0, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 81, 0, 0, 0, 4, 2, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 0, 0,236, 0, 0, 0, 9, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 4, 2, 0, 0, 81, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 2, 0, 0,
+ 6, 2, 0, 0, 4, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 79, 0, 0, 0, 4, 2, 0, 0, 6, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 6, 2, 0, 0, 5, 2, 0, 0,131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 84, 1, 0, 0, 30, 0, 0, 0,
+237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,237, 0, 0, 0, 6, 2, 0, 0, 84, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+131, 0, 0, 0, 84, 1, 0, 0, 6, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 2, 0, 0,237, 0, 0, 0, 79, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 85, 1, 0, 0,131, 0, 0, 0, 5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 2, 0, 0,
+241, 0, 0, 0, 85, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 0, 0, 0, 85, 1, 0, 0,241, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,241, 0, 0, 0, 5, 2, 0, 0, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 2, 0, 0, 78, 0, 0, 0,
+235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,235, 0, 0, 0, 83, 1, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+130, 0, 0, 0, 7, 2, 0, 0, 83, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 1, 0, 0,235, 0, 0, 0, 30, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 7, 2, 0, 0,130, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 2, 0, 0,
+ 9, 2, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 78, 0, 0, 0, 7, 2, 0, 0, 9, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 9, 2, 0, 0, 8, 2, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,198, 0, 0, 0, 4, 0, 0, 0,
+234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,234, 0, 0, 0, 9, 2, 0, 0,198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 60, 0, 0, 0,198, 0, 0, 0, 9, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 9, 2, 0, 0,234, 0, 0, 0, 78, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,199, 0, 0, 0, 60, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 2, 0, 0,
+ 82, 1, 0, 0,199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 21, 0, 0, 0,199, 0, 0, 0, 82, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 82, 1, 0, 0, 8, 2, 0, 0,130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 87, 1, 0, 0,132, 0, 0, 0,
+ 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 10, 2, 0, 0,245, 0, 0, 0, 87, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 32, 0, 0, 0, 87, 1, 0, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,245, 0, 0, 0, 10, 2, 0, 0, 83, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 11, 2, 0, 0, 83, 0, 0, 0, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 10, 2, 0, 0,
+ 12, 2, 0, 0, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 65, 0, 0, 0, 11, 2, 0, 0, 12, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 12, 2, 0, 0, 10, 2, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 1, 0, 0, 23, 0, 0, 0,
+209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,209, 0, 0, 0, 12, 2, 0, 0, 86, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+132, 0, 0, 0, 86, 1, 0, 0, 12, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 2, 0, 0,209, 0, 0, 0, 65, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 11, 2, 0, 0, 65, 0, 0, 0,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,208, 0, 0, 0,
+244, 0, 0, 0, 11, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 0, 0, 0, 11, 2, 0, 0,244, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,244, 0, 0, 0,208, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 1, 0, 0,132, 0, 0, 0,
+ 13, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 13, 2, 0, 0, 88, 1, 0, 0, 86, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 23, 0, 0, 0, 86, 1, 0, 0, 88, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 88, 1, 0, 0, 13, 2, 0, 0,133, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 14, 2, 0, 0,133, 0, 0, 0, 13, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 13, 2, 0, 0,
+ 15, 2, 0, 0, 14, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,134, 0, 0, 0, 14, 2, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 15, 2, 0, 0, 13, 2, 0, 0,132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 87, 1, 0, 0, 32, 0, 0, 0,
+ 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 91, 1, 0, 0, 15, 2, 0, 0, 87, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+132, 0, 0, 0, 87, 1, 0, 0, 15, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 2, 0, 0, 91, 1, 0, 0,134, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 14, 2, 0, 0,134, 0, 0, 0, 90, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 90, 1, 0, 0,
+ 89, 1, 0, 0, 14, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,133, 0, 0, 0, 14, 2, 0, 0, 89, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 89, 1, 0, 0, 90, 1, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,212, 0, 0, 0, 67, 0, 0, 0,
+ 16, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 2, 0, 0,242, 0, 0, 0,212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 6, 0, 0, 0,212, 0, 0, 0,242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,242, 0, 0, 0, 16, 2, 0, 0, 82, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 17, 2, 0, 0, 82, 0, 0, 0, 16, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 2, 0, 0,
+ 18, 2, 0, 0, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,134, 0, 0, 0, 17, 2, 0, 0, 18, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 18, 2, 0, 0, 16, 2, 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,213, 0, 0, 0, 24, 0, 0, 0,
+ 90, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 90, 1, 0, 0, 18, 2, 0, 0,213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 67, 0, 0, 0,213, 0, 0, 0, 18, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 18, 2, 0, 0, 90, 1, 0, 0,134, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 17, 2, 0, 0,134, 0, 0, 0, 91, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 91, 1, 0, 0,
+243, 0, 0, 0, 17, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 82, 0, 0, 0, 17, 2, 0, 0,243, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,243, 0, 0, 0, 91, 1, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,211, 0, 0, 0, 66, 0, 0, 0,
+ 19, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 2, 0, 0, 89, 1, 0, 0,211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 24, 0, 0, 0,211, 0, 0, 0, 89, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 1, 0, 0, 19, 2, 0, 0,133, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 20, 2, 0, 0,133, 0, 0, 0, 19, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 2, 0, 0,
+ 21, 2, 0, 0, 20, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 64, 0, 0, 0, 20, 2, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 21, 2, 0, 0, 19, 2, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,210, 0, 0, 0, 1, 0, 0, 0,
+206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,206, 0, 0, 0, 21, 2, 0, 0,210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 66, 0, 0, 0,210, 0, 0, 0, 21, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 21, 2, 0, 0,206, 0, 0, 0, 64, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 20, 2, 0, 0, 64, 0, 0, 0,207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,207, 0, 0, 0,
+ 88, 1, 0, 0, 20, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,133, 0, 0, 0, 20, 2, 0, 0, 88, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 88, 1, 0, 0,207, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 1, 0, 0,135, 0, 0, 0,
+ 22, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 22, 2, 0, 0,247, 0, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 33, 0, 0, 0, 93, 1, 0, 0,247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,247, 0, 0, 0, 22, 2, 0, 0, 84, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 23, 2, 0, 0, 84, 0, 0, 0, 22, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 22, 2, 0, 0,
+ 24, 2, 0, 0, 23, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 69, 0, 0, 0, 23, 2, 0, 0, 24, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 24, 2, 0, 0, 22, 2, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 1, 0, 0, 25, 0, 0, 0,
+217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,217, 0, 0, 0, 24, 2, 0, 0, 92, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+135, 0, 0, 0, 92, 1, 0, 0, 24, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 2, 0, 0,217, 0, 0, 0, 69, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 23, 2, 0, 0, 69, 0, 0, 0,216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,216, 0, 0, 0,
+246, 0, 0, 0, 23, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 84, 0, 0, 0, 23, 2, 0, 0,246, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,246, 0, 0, 0,216, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 1, 0, 0,135, 0, 0, 0,
+ 25, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 25, 2, 0, 0, 94, 1, 0, 0, 92, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 25, 0, 0, 0, 92, 1, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 94, 1, 0, 0, 25, 2, 0, 0,136, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 26, 2, 0, 0,136, 0, 0, 0, 25, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 25, 2, 0, 0,
+ 27, 2, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,137, 0, 0, 0, 26, 2, 0, 0, 27, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 27, 2, 0, 0, 25, 2, 0, 0,135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 1, 0, 0, 33, 0, 0, 0,
+ 97, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 97, 1, 0, 0, 27, 2, 0, 0, 93, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+135, 0, 0, 0, 93, 1, 0, 0, 27, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 27, 2, 0, 0, 97, 1, 0, 0,137, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 26, 2, 0, 0,137, 0, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 96, 1, 0, 0,
+ 95, 1, 0, 0, 26, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,136, 0, 0, 0, 26, 2, 0, 0, 95, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 95, 1, 0, 0, 96, 1, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,220, 0, 0, 0, 71, 0, 0, 0,
+ 28, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 28, 2, 0, 0,248, 0, 0, 0,220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 7, 0, 0, 0,220, 0, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,248, 0, 0, 0, 28, 2, 0, 0, 85, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 29, 2, 0, 0, 85, 0, 0, 0, 28, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 28, 2, 0, 0,
+ 30, 2, 0, 0, 29, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,137, 0, 0, 0, 29, 2, 0, 0, 30, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 30, 2, 0, 0, 28, 2, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,221, 0, 0, 0, 26, 0, 0, 0,
+ 96, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 96, 1, 0, 0, 30, 2, 0, 0,221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 71, 0, 0, 0,221, 0, 0, 0, 30, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 30, 2, 0, 0, 96, 1, 0, 0,137, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 29, 2, 0, 0,137, 0, 0, 0, 97, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 97, 1, 0, 0,
+249, 0, 0, 0, 29, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 85, 0, 0, 0, 29, 2, 0, 0,249, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,249, 0, 0, 0, 97, 1, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,219, 0, 0, 0, 70, 0, 0, 0,
+ 31, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 2, 0, 0, 95, 1, 0, 0,219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 26, 0, 0, 0,219, 0, 0, 0, 95, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 1, 0, 0, 31, 2, 0, 0,136, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 32, 2, 0, 0,136, 0, 0, 0, 31, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 31, 2, 0, 0,
+ 33, 2, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 68, 0, 0, 0, 32, 2, 0, 0, 33, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 33, 2, 0, 0, 31, 2, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,218, 0, 0, 0, 2, 0, 0, 0,
+214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,214, 0, 0, 0, 33, 2, 0, 0,218, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 70, 0, 0, 0,218, 0, 0, 0, 33, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 33, 2, 0, 0,214, 0, 0, 0, 68, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 32, 2, 0, 0, 68, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,215, 0, 0, 0,
+ 94, 1, 0, 0, 32, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,136, 0, 0, 0, 32, 2, 0, 0, 94, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 94, 1, 0, 0,215, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 99, 1, 0, 0,138, 0, 0, 0,
+ 34, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 34, 2, 0, 0,251, 0, 0, 0, 99, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 34, 0, 0, 0, 99, 1, 0, 0,251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,251, 0, 0, 0, 34, 2, 0, 0, 86, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 35, 2, 0, 0, 86, 0, 0, 0, 34, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 34, 2, 0, 0,
+ 36, 2, 0, 0, 35, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 73, 0, 0, 0, 35, 2, 0, 0, 36, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 36, 2, 0, 0, 34, 2, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 1, 0, 0, 27, 0, 0, 0,
+225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,225, 0, 0, 0, 36, 2, 0, 0, 98, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+138, 0, 0, 0, 98, 1, 0, 0, 36, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 36, 2, 0, 0,225, 0, 0, 0, 73, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 35, 2, 0, 0, 73, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,224, 0, 0, 0,
+250, 0, 0, 0, 35, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 0, 0, 0, 35, 2, 0, 0,250, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,250, 0, 0, 0,224, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 1, 0, 0,138, 0, 0, 0,
+ 37, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 2, 0, 0,100, 1, 0, 0, 98, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 27, 0, 0, 0, 98, 1, 0, 0,100, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,100, 1, 0, 0, 37, 2, 0, 0,139, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 38, 2, 0, 0,139, 0, 0, 0, 37, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 2, 0, 0,
+ 39, 2, 0, 0, 38, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,140, 0, 0, 0, 38, 2, 0, 0, 39, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 39, 2, 0, 0, 37, 2, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 99, 1, 0, 0, 34, 0, 0, 0,
+103, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,103, 1, 0, 0, 39, 2, 0, 0, 99, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+138, 0, 0, 0, 99, 1, 0, 0, 39, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 2, 0, 0,103, 1, 0, 0,140, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 38, 2, 0, 0,140, 0, 0, 0,102, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,102, 1, 0, 0,
+101, 1, 0, 0, 38, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,139, 0, 0, 0, 38, 2, 0, 0,101, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,101, 1, 0, 0,102, 1, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,228, 0, 0, 0, 75, 0, 0, 0,
+ 40, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 2, 0, 0,252, 0, 0, 0,228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 8, 0, 0, 0,228, 0, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,252, 0, 0, 0, 40, 2, 0, 0, 87, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 41, 2, 0, 0, 87, 0, 0, 0, 40, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 2, 0, 0,
+ 42, 2, 0, 0, 41, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,140, 0, 0, 0, 41, 2, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 42, 2, 0, 0, 40, 2, 0, 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,229, 0, 0, 0, 28, 0, 0, 0,
+102, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,102, 1, 0, 0, 42, 2, 0, 0,229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 75, 0, 0, 0,229, 0, 0, 0, 42, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 42, 2, 0, 0,102, 1, 0, 0,140, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 41, 2, 0, 0,140, 0, 0, 0,103, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,103, 1, 0, 0,
+253, 0, 0, 0, 41, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 87, 0, 0, 0, 41, 2, 0, 0,253, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,253, 0, 0, 0,103, 1, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,227, 0, 0, 0, 74, 0, 0, 0,
+ 43, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 2, 0, 0,101, 1, 0, 0,227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 28, 0, 0, 0,227, 0, 0, 0,101, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,101, 1, 0, 0, 43, 2, 0, 0,139, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 44, 2, 0, 0,139, 0, 0, 0, 43, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 43, 2, 0, 0,
+ 45, 2, 0, 0, 44, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 72, 0, 0, 0, 44, 2, 0, 0, 45, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 45, 2, 0, 0, 43, 2, 0, 0, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,226, 0, 0, 0, 3, 0, 0, 0,
+222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,222, 0, 0, 0, 45, 2, 0, 0,226, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 74, 0, 0, 0,226, 0, 0, 0, 45, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 45, 2, 0, 0,222, 0, 0, 0, 72, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 44, 2, 0, 0, 72, 0, 0, 0,223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,223, 0, 0, 0,
+100, 1, 0, 0, 44, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,139, 0, 0, 0, 44, 2, 0, 0,100, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,100, 1, 0, 0,223, 0, 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 1, 0, 0,141, 0, 0, 0,
+ 46, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 46, 2, 0, 0,255, 0, 0, 0,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 35, 0, 0, 0,105, 1, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,255, 0, 0, 0, 46, 2, 0, 0, 88, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 47, 2, 0, 0, 88, 0, 0, 0, 46, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 46, 2, 0, 0,
+ 48, 2, 0, 0, 47, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 0, 0, 0, 47, 2, 0, 0, 48, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 48, 2, 0, 0, 46, 2, 0, 0,141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 1, 0, 0, 29, 0, 0, 0,
+233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,233, 0, 0, 0, 48, 2, 0, 0,104, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+141, 0, 0, 0,104, 1, 0, 0, 48, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 48, 2, 0, 0,233, 0, 0, 0, 77, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 47, 2, 0, 0, 77, 0, 0, 0,232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,232, 0, 0, 0,
+254, 0, 0, 0, 47, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 88, 0, 0, 0, 47, 2, 0, 0,254, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,254, 0, 0, 0,232, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 1, 0, 0,141, 0, 0, 0,
+ 49, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 49, 2, 0, 0,106, 1, 0, 0,104, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 29, 0, 0, 0,104, 1, 0, 0,106, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,106, 1, 0, 0, 49, 2, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 50, 2, 0, 0,142, 0, 0, 0, 49, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 49, 2, 0, 0,
+ 51, 2, 0, 0, 50, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,143, 0, 0, 0, 50, 2, 0, 0, 51, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 51, 2, 0, 0, 49, 2, 0, 0,141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 1, 0, 0, 35, 0, 0, 0,
+109, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,109, 1, 0, 0, 51, 2, 0, 0,105, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+141, 0, 0, 0,105, 1, 0, 0, 51, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 51, 2, 0, 0,109, 1, 0, 0,143, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 50, 2, 0, 0,143, 0, 0, 0,108, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,108, 1, 0, 0,
+107, 1, 0, 0, 50, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,142, 0, 0, 0, 50, 2, 0, 0,107, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,107, 1, 0, 0,108, 1, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,236, 0, 0, 0, 79, 0, 0, 0,
+ 52, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 52, 2, 0, 0, 0, 1, 0, 0,236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 9, 0, 0, 0,236, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 52, 2, 0, 0, 89, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 53, 2, 0, 0, 89, 0, 0, 0, 52, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 52, 2, 0, 0,
+ 54, 2, 0, 0, 53, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,143, 0, 0, 0, 53, 2, 0, 0, 54, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 54, 2, 0, 0, 52, 2, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,237, 0, 0, 0, 30, 0, 0, 0,
+108, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,108, 1, 0, 0, 54, 2, 0, 0,237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 79, 0, 0, 0,237, 0, 0, 0, 54, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 54, 2, 0, 0,108, 1, 0, 0,143, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 53, 2, 0, 0,143, 0, 0, 0,109, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,109, 1, 0, 0,
+ 1, 1, 0, 0, 53, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 0, 0, 0, 53, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 1, 1, 0, 0,109, 1, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,235, 0, 0, 0, 78, 0, 0, 0,
+ 55, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 2, 0, 0,107, 1, 0, 0,235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 30, 0, 0, 0,235, 0, 0, 0,107, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,107, 1, 0, 0, 55, 2, 0, 0,142, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 56, 2, 0, 0,142, 0, 0, 0, 55, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 55, 2, 0, 0,
+ 57, 2, 0, 0, 56, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 76, 0, 0, 0, 56, 2, 0, 0, 57, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 57, 2, 0, 0, 55, 2, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,234, 0, 0, 0, 4, 0, 0, 0,
+230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,230, 0, 0, 0, 57, 2, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 78, 0, 0, 0,234, 0, 0, 0, 57, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 57, 2, 0, 0,230, 0, 0, 0, 76, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 56, 2, 0, 0, 76, 0, 0, 0,231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,231, 0, 0, 0,
+106, 1, 0, 0, 56, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,142, 0, 0, 0, 56, 2, 0, 0,106, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,106, 1, 0, 0,231, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,111, 1, 0, 0,144, 0, 0, 0,
+ 58, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 58, 2, 0, 0, 3, 1, 0, 0,111, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 36, 0, 0, 0,111, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 58, 2, 0, 0, 90, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 59, 2, 0, 0, 90, 0, 0, 0, 58, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 58, 2, 0, 0,
+ 60, 2, 0, 0, 59, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 0, 0, 0, 59, 2, 0, 0, 60, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 60, 2, 0, 0, 58, 2, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 1, 0, 0, 31, 0, 0, 0,
+241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,241, 0, 0, 0, 60, 2, 0, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+144, 0, 0, 0,110, 1, 0, 0, 60, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 60, 2, 0, 0,241, 0, 0, 0, 81, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 59, 2, 0, 0, 81, 0, 0, 0,240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,240, 0, 0, 0,
+ 2, 1, 0, 0, 59, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 90, 0, 0, 0, 59, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 2, 1, 0, 0,240, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 1, 0, 0,144, 0, 0, 0,
+ 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 2, 0, 0,113, 1, 0, 0,110, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 31, 0, 0, 0,110, 1, 0, 0,113, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 1, 0, 0, 61, 2, 0, 0,145, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 62, 2, 0, 0,145, 0, 0, 0, 61, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 61, 2, 0, 0,
+ 63, 2, 0, 0, 62, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 0, 0, 0, 62, 2, 0, 0, 63, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 63, 2, 0, 0, 61, 2, 0, 0,144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,111, 1, 0, 0, 36, 0, 0, 0,
+115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,115, 1, 0, 0, 63, 2, 0, 0,111, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+144, 0, 0, 0,111, 1, 0, 0, 63, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 63, 2, 0, 0,115, 1, 0, 0,146, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 62, 2, 0, 0,146, 0, 0, 0,114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,114, 1, 0, 0,
+112, 1, 0, 0, 62, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,145, 0, 0, 0, 62, 2, 0, 0,112, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,112, 1, 0, 0,114, 1, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,204, 0, 0, 0, 63, 0, 0, 0,
+ 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 64, 2, 0, 0, 4, 1, 0, 0,204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 10, 0, 0, 0,204, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 1, 0, 0, 64, 2, 0, 0, 91, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 65, 2, 0, 0, 91, 0, 0, 0, 64, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 64, 2, 0, 0,
+ 66, 2, 0, 0, 65, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,146, 0, 0, 0, 65, 2, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 66, 2, 0, 0, 64, 2, 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,205, 0, 0, 0, 22, 0, 0, 0,
+114, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,114, 1, 0, 0, 66, 2, 0, 0,205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 63, 0, 0, 0,205, 0, 0, 0, 66, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 66, 2, 0, 0,114, 1, 0, 0,146, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 65, 2, 0, 0,146, 0, 0, 0,115, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,115, 1, 0, 0,
+ 5, 1, 0, 0, 65, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 91, 0, 0, 0, 65, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 5, 1, 0, 0,115, 1, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,203, 0, 0, 0, 62, 0, 0, 0,
+ 67, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 67, 2, 0, 0,112, 1, 0, 0,203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 22, 0, 0, 0,203, 0, 0, 0,112, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,112, 1, 0, 0, 67, 2, 0, 0,145, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 68, 2, 0, 0,145, 0, 0, 0, 67, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 67, 2, 0, 0,
+ 69, 2, 0, 0, 68, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 0, 0, 0, 68, 2, 0, 0, 69, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 69, 2, 0, 0, 67, 2, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,202, 0, 0, 0, 5, 0, 0, 0,
+238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,238, 0, 0, 0, 69, 2, 0, 0,202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 62, 0, 0, 0,202, 0, 0, 0, 69, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 69, 2, 0, 0,238, 0, 0, 0, 80, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 68, 2, 0, 0, 80, 0, 0, 0,239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,239, 0, 0, 0,
+113, 1, 0, 0, 68, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,145, 0, 0, 0, 68, 2, 0, 0,113, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,113, 1, 0, 0,239, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 70, 2, 0, 0,147, 0, 0, 0,
+117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,117, 1, 0, 0, 11, 1, 0, 0, 70, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 94, 0, 0, 0, 70, 2, 0, 0, 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 11, 1, 0, 0,117, 1, 0, 0, 38, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 70, 2, 0, 0, 94, 0, 0, 0, 71, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 2, 0, 0,
+ 72, 2, 0, 0, 70, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,147, 0, 0, 0, 70, 2, 0, 0, 72, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 72, 2, 0, 0, 71, 2, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,243, 0, 0, 0, 32, 0, 0, 0,
+116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 1, 0, 0, 72, 2, 0, 0,243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 82, 0, 0, 0,243, 0, 0, 0, 72, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 72, 2, 0, 0,116, 1, 0, 0,147, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,242, 0, 0, 0, 82, 0, 0, 0, 71, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 71, 2, 0, 0,
+ 10, 1, 0, 0,242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 0, 0, 0,242, 0, 0, 0, 10, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 10, 1, 0, 0, 71, 2, 0, 0, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 73, 2, 0, 0,147, 0, 0, 0,
+116, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 1, 0, 0,118, 1, 0, 0, 73, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+148, 0, 0, 0, 73, 2, 0, 0,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,118, 1, 0, 0,116, 1, 0, 0, 32, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 73, 2, 0, 0,148, 0, 0, 0, 74, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 74, 2, 0, 0,
+ 75, 2, 0, 0, 73, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,147, 0, 0, 0, 73, 2, 0, 0, 75, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 75, 2, 0, 0, 74, 2, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,121, 1, 0, 0, 38, 0, 0, 0,
+117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,117, 1, 0, 0, 75, 2, 0, 0,121, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+149, 0, 0, 0,121, 1, 0, 0, 75, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 75, 2, 0, 0,117, 1, 0, 0,147, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,120, 1, 0, 0,149, 0, 0, 0, 74, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 74, 2, 0, 0,
+119, 1, 0, 0,120, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 0, 0, 0,120, 1, 0, 0,119, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,119, 1, 0, 0, 74, 2, 0, 0,148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 76, 2, 0, 0, 93, 0, 0, 0,
+ 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 1, 0, 0, 12, 1, 0, 0, 76, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 95, 0, 0, 0, 76, 2, 0, 0, 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 1, 0, 0, 8, 1, 0, 0, 11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 76, 2, 0, 0, 95, 0, 0, 0, 77, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 2, 0, 0,
+ 78, 2, 0, 0, 76, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 0, 0, 0, 76, 2, 0, 0, 78, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 78, 2, 0, 0, 77, 2, 0, 0,149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,120, 1, 0, 0, 37, 0, 0, 0,
+ 9, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 9, 1, 0, 0, 78, 2, 0, 0,120, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+149, 0, 0, 0,120, 1, 0, 0, 78, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 78, 2, 0, 0, 9, 1, 0, 0, 93, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,121, 1, 0, 0,149, 0, 0, 0, 77, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 77, 2, 0, 0,
+ 13, 1, 0, 0,121, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 38, 0, 0, 0,121, 1, 0, 0, 13, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 13, 1, 0, 0, 77, 2, 0, 0, 95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 79, 2, 0, 0, 92, 0, 0, 0,
+ 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 1, 0, 0,119, 1, 0, 0, 79, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+148, 0, 0, 0, 79, 2, 0, 0,119, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,119, 1, 0, 0, 7, 1, 0, 0, 37, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 79, 2, 0, 0,148, 0, 0, 0, 80, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 2, 0, 0,
+ 81, 2, 0, 0, 79, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 0, 0, 0, 79, 2, 0, 0, 81, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 81, 2, 0, 0, 80, 2, 0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,244, 0, 0, 0, 10, 0, 0, 0,
+ 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 1, 0, 0, 81, 2, 0, 0,244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 83, 0, 0, 0,244, 0, 0, 0, 81, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 81, 2, 0, 0, 6, 1, 0, 0, 92, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,245, 0, 0, 0, 83, 0, 0, 0, 80, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 80, 2, 0, 0,
+118, 1, 0, 0,245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 32, 0, 0, 0,245, 0, 0, 0,118, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,118, 1, 0, 0, 80, 2, 0, 0,148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 82, 2, 0, 0,150, 0, 0, 0,
+123, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,123, 1, 0, 0, 15, 1, 0, 0, 82, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 96, 0, 0, 0, 82, 2, 0, 0, 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 1, 0, 0,123, 1, 0, 0, 39, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 82, 2, 0, 0, 96, 0, 0, 0, 83, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 2, 0, 0,
+ 84, 2, 0, 0, 82, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,150, 0, 0, 0, 82, 2, 0, 0, 84, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 84, 2, 0, 0, 83, 2, 0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,249, 0, 0, 0, 33, 0, 0, 0,
+122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,122, 1, 0, 0, 84, 2, 0, 0,249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 85, 0, 0, 0,249, 0, 0, 0, 84, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 84, 2, 0, 0,122, 1, 0, 0,150, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,248, 0, 0, 0, 85, 0, 0, 0, 83, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 83, 2, 0, 0,
+ 14, 1, 0, 0,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 0, 0, 0,248, 0, 0, 0, 14, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 14, 1, 0, 0, 83, 2, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 85, 2, 0, 0,150, 0, 0, 0,
+122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,122, 1, 0, 0,124, 1, 0, 0, 85, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+151, 0, 0, 0, 85, 2, 0, 0,124, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,124, 1, 0, 0,122, 1, 0, 0, 33, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 85, 2, 0, 0,151, 0, 0, 0, 86, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 2, 0, 0,
+ 87, 2, 0, 0, 85, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,150, 0, 0, 0, 85, 2, 0, 0, 87, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 87, 2, 0, 0, 86, 2, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,127, 1, 0, 0, 39, 0, 0, 0,
+123, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,123, 1, 0, 0, 87, 2, 0, 0,127, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+152, 0, 0, 0,127, 1, 0, 0, 87, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 87, 2, 0, 0,123, 1, 0, 0,150, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,126, 1, 0, 0,152, 0, 0, 0, 86, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 86, 2, 0, 0,
+125, 1, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 38, 0, 0, 0,126, 1, 0, 0,125, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,125, 1, 0, 0, 86, 2, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 88, 2, 0, 0, 95, 0, 0, 0,
+ 12, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 12, 1, 0, 0, 16, 1, 0, 0, 88, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 97, 0, 0, 0, 88, 2, 0, 0, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 1, 0, 0, 12, 1, 0, 0, 11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 88, 2, 0, 0, 97, 0, 0, 0, 89, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 2, 0, 0,
+ 90, 2, 0, 0, 88, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 0, 0, 0, 88, 2, 0, 0, 90, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 90, 2, 0, 0, 89, 2, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,126, 1, 0, 0, 38, 0, 0, 0,
+ 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 13, 1, 0, 0, 90, 2, 0, 0,126, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+152, 0, 0, 0,126, 1, 0, 0, 90, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 90, 2, 0, 0, 13, 1, 0, 0, 95, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,127, 1, 0, 0,152, 0, 0, 0, 89, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 89, 2, 0, 0,
+ 17, 1, 0, 0,127, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 0, 0, 0,127, 1, 0, 0, 17, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 17, 1, 0, 0, 89, 2, 0, 0, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 91, 2, 0, 0, 94, 0, 0, 0,
+ 11, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 11, 1, 0, 0,125, 1, 0, 0, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+151, 0, 0, 0, 91, 2, 0, 0,125, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,125, 1, 0, 0, 11, 1, 0, 0, 38, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 91, 2, 0, 0,151, 0, 0, 0, 92, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 2, 0, 0,
+ 93, 2, 0, 0, 91, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 94, 0, 0, 0, 91, 2, 0, 0, 93, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 93, 2, 0, 0, 92, 2, 0, 0, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,246, 0, 0, 0, 6, 0, 0, 0,
+ 10, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 10, 1, 0, 0, 93, 2, 0, 0,246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 84, 0, 0, 0,246, 0, 0, 0, 93, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 93, 2, 0, 0, 10, 1, 0, 0, 94, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,247, 0, 0, 0, 84, 0, 0, 0, 92, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 92, 2, 0, 0,
+124, 1, 0, 0,247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 33, 0, 0, 0,247, 0, 0, 0,124, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,124, 1, 0, 0, 92, 2, 0, 0,151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 94, 2, 0, 0,153, 0, 0, 0,
+129, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,129, 1, 0, 0, 19, 1, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 98, 0, 0, 0, 94, 2, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 1, 0, 0,129, 1, 0, 0, 40, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 94, 2, 0, 0, 98, 0, 0, 0, 95, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 2, 0, 0,
+ 96, 2, 0, 0, 94, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,153, 0, 0, 0, 94, 2, 0, 0, 96, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 96, 2, 0, 0, 95, 2, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,253, 0, 0, 0, 34, 0, 0, 0,
+128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,128, 1, 0, 0, 96, 2, 0, 0,253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 87, 0, 0, 0,253, 0, 0, 0, 96, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 96, 2, 0, 0,128, 1, 0, 0,153, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,252, 0, 0, 0, 87, 0, 0, 0, 95, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 95, 2, 0, 0,
+ 18, 1, 0, 0,252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 0, 0, 0,252, 0, 0, 0, 18, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 18, 1, 0, 0, 95, 2, 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 97, 2, 0, 0,153, 0, 0, 0,
+128, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,128, 1, 0, 0,130, 1, 0, 0, 97, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+154, 0, 0, 0, 97, 2, 0, 0,130, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,130, 1, 0, 0,128, 1, 0, 0, 34, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 97, 2, 0, 0,154, 0, 0, 0, 98, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 2, 0, 0,
+ 99, 2, 0, 0, 97, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,153, 0, 0, 0, 97, 2, 0, 0, 99, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 99, 2, 0, 0, 98, 2, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,133, 1, 0, 0, 40, 0, 0, 0,
+129, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,129, 1, 0, 0, 99, 2, 0, 0,133, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+155, 0, 0, 0,133, 1, 0, 0, 99, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 99, 2, 0, 0,129, 1, 0, 0,153, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,132, 1, 0, 0,155, 0, 0, 0, 98, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 2, 0, 0,
+131, 1, 0, 0,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 39, 0, 0, 0,132, 1, 0, 0,131, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,131, 1, 0, 0, 98, 2, 0, 0,154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,100, 2, 0, 0, 97, 0, 0, 0,
+ 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 16, 1, 0, 0, 20, 1, 0, 0,100, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 99, 0, 0, 0,100, 2, 0, 0, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 20, 1, 0, 0, 16, 1, 0, 0, 11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,100, 2, 0, 0, 99, 0, 0, 0,101, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,101, 2, 0, 0,
+102, 2, 0, 0,100, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 97, 0, 0, 0,100, 2, 0, 0,102, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,102, 2, 0, 0,101, 2, 0, 0,155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,132, 1, 0, 0, 39, 0, 0, 0,
+ 17, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 17, 1, 0, 0,102, 2, 0, 0,132, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+155, 0, 0, 0,132, 1, 0, 0,102, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,102, 2, 0, 0, 17, 1, 0, 0, 97, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,133, 1, 0, 0,155, 0, 0, 0,101, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,101, 2, 0, 0,
+ 21, 1, 0, 0,133, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 0, 0, 0,133, 1, 0, 0, 21, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 21, 1, 0, 0,101, 2, 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,103, 2, 0, 0, 96, 0, 0, 0,
+ 15, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 15, 1, 0, 0,131, 1, 0, 0,103, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+154, 0, 0, 0,103, 2, 0, 0,131, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,131, 1, 0, 0, 15, 1, 0, 0, 39, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,103, 2, 0, 0,154, 0, 0, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 2, 0, 0,
+105, 2, 0, 0,103, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 96, 0, 0, 0,103, 2, 0, 0,105, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,105, 2, 0, 0,104, 2, 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,250, 0, 0, 0, 7, 0, 0, 0,
+ 14, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 14, 1, 0, 0,105, 2, 0, 0,250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 86, 0, 0, 0,250, 0, 0, 0,105, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,105, 2, 0, 0, 14, 1, 0, 0, 96, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,251, 0, 0, 0, 86, 0, 0, 0,104, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,104, 2, 0, 0,
+130, 1, 0, 0,251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 34, 0, 0, 0,251, 0, 0, 0,130, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,130, 1, 0, 0,104, 2, 0, 0,154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,106, 2, 0, 0,156, 0, 0, 0,
+135, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,135, 1, 0, 0, 23, 1, 0, 0,106, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+100, 0, 0, 0,106, 2, 0, 0, 23, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 23, 1, 0, 0,135, 1, 0, 0, 41, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,106, 2, 0, 0,100, 0, 0, 0,107, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,107, 2, 0, 0,
+108, 2, 0, 0,106, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,156, 0, 0, 0,106, 2, 0, 0,108, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,108, 2, 0, 0,107, 2, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 0, 0, 35, 0, 0, 0,
+134, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,134, 1, 0, 0,108, 2, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 89, 0, 0, 0, 1, 1, 0, 0,108, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,108, 2, 0, 0,134, 1, 0, 0,156, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 89, 0, 0, 0,107, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,107, 2, 0, 0,
+ 22, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 9, 0, 0, 0, 0, 1, 0, 0, 22, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 22, 1, 0, 0,107, 2, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,109, 2, 0, 0,156, 0, 0, 0,
+134, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,134, 1, 0, 0,136, 1, 0, 0,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+157, 0, 0, 0,109, 2, 0, 0,136, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,136, 1, 0, 0,134, 1, 0, 0, 35, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,109, 2, 0, 0,157, 0, 0, 0,110, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 2, 0, 0,
+111, 2, 0, 0,109, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,156, 0, 0, 0,109, 2, 0, 0,111, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,111, 2, 0, 0,110, 2, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,139, 1, 0, 0, 41, 0, 0, 0,
+135, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,135, 1, 0, 0,111, 2, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+158, 0, 0, 0,139, 1, 0, 0,111, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,111, 2, 0, 0,135, 1, 0, 0,156, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,138, 1, 0, 0,158, 0, 0, 0,110, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,110, 2, 0, 0,
+137, 1, 0, 0,138, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 40, 0, 0, 0,138, 1, 0, 0,137, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,137, 1, 0, 0,110, 2, 0, 0,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,112, 2, 0, 0, 99, 0, 0, 0,
+ 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 20, 1, 0, 0, 24, 1, 0, 0,112, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+101, 0, 0, 0,112, 2, 0, 0, 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 1, 0, 0, 20, 1, 0, 0, 11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,112, 2, 0, 0,101, 0, 0, 0,113, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 2, 0, 0,
+114, 2, 0, 0,112, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 99, 0, 0, 0,112, 2, 0, 0,114, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,114, 2, 0, 0,113, 2, 0, 0,158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,138, 1, 0, 0, 40, 0, 0, 0,
+ 21, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 21, 1, 0, 0,114, 2, 0, 0,138, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+158, 0, 0, 0,138, 1, 0, 0,114, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,114, 2, 0, 0, 21, 1, 0, 0, 99, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,139, 1, 0, 0,158, 0, 0, 0,113, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,113, 2, 0, 0,
+ 25, 1, 0, 0,139, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 41, 0, 0, 0,139, 1, 0, 0, 25, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 25, 1, 0, 0,113, 2, 0, 0,101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,115, 2, 0, 0, 98, 0, 0, 0,
+ 19, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19, 1, 0, 0,137, 1, 0, 0,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+157, 0, 0, 0,115, 2, 0, 0,137, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,137, 1, 0, 0, 19, 1, 0, 0, 40, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,115, 2, 0, 0,157, 0, 0, 0,116, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 2, 0, 0,
+117, 2, 0, 0,115, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 98, 0, 0, 0,115, 2, 0, 0,117, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,117, 2, 0, 0,116, 2, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,254, 0, 0, 0, 8, 0, 0, 0,
+ 18, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 18, 1, 0, 0,117, 2, 0, 0,254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 88, 0, 0, 0,254, 0, 0, 0,117, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,117, 2, 0, 0, 18, 1, 0, 0, 98, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,255, 0, 0, 0, 88, 0, 0, 0,116, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,116, 2, 0, 0,
+136, 1, 0, 0,255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 35, 0, 0, 0,255, 0, 0, 0,136, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,136, 1, 0, 0,116, 2, 0, 0,157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,118, 2, 0, 0,159, 0, 0, 0,
+141, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,141, 1, 0, 0, 7, 1, 0, 0,118, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 92, 0, 0, 0,118, 2, 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 1, 0, 0,141, 1, 0, 0, 37, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,118, 2, 0, 0, 92, 0, 0, 0,119, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,119, 2, 0, 0,
+120, 2, 0, 0,118, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,159, 0, 0, 0,118, 2, 0, 0,120, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,120, 2, 0, 0,119, 2, 0, 0, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 1, 0, 0, 36, 0, 0, 0,
+140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,140, 1, 0, 0,120, 2, 0, 0, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 91, 0, 0, 0, 5, 1, 0, 0,120, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,120, 2, 0, 0,140, 1, 0, 0,159, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 4, 1, 0, 0, 91, 0, 0, 0,119, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,119, 2, 0, 0,
+ 6, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 10, 0, 0, 0, 4, 1, 0, 0, 6, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 6, 1, 0, 0,119, 2, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,121, 2, 0, 0,159, 0, 0, 0,
+140, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,140, 1, 0, 0,142, 1, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+160, 0, 0, 0,121, 2, 0, 0,142, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,142, 1, 0, 0,140, 1, 0, 0, 36, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,121, 2, 0, 0,160, 0, 0, 0,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,122, 2, 0, 0,
+123, 2, 0, 0,121, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,159, 0, 0, 0,121, 2, 0, 0,123, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,123, 2, 0, 0,122, 2, 0, 0,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,144, 1, 0, 0, 37, 0, 0, 0,
+141, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,141, 1, 0, 0,123, 2, 0, 0,144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+161, 0, 0, 0,144, 1, 0, 0,123, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,123, 2, 0, 0,141, 1, 0, 0,159, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,145, 1, 0, 0,161, 0, 0, 0,122, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,122, 2, 0, 0,
+143, 1, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 41, 0, 0, 0,145, 1, 0, 0,143, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,143, 1, 0, 0,122, 2, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,124, 2, 0, 0,101, 0, 0, 0,
+ 24, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 24, 1, 0, 0, 8, 1, 0, 0,124, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 93, 0, 0, 0,124, 2, 0, 0, 8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 1, 0, 0, 24, 1, 0, 0, 11, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,124, 2, 0, 0, 93, 0, 0, 0,125, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,125, 2, 0, 0,
+126, 2, 0, 0,124, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,101, 0, 0, 0,124, 2, 0, 0,126, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,126, 2, 0, 0,125, 2, 0, 0,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,145, 1, 0, 0, 41, 0, 0, 0,
+ 25, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 25, 1, 0, 0,126, 2, 0, 0,145, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+161, 0, 0, 0,145, 1, 0, 0,126, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,126, 2, 0, 0, 25, 1, 0, 0,101, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,144, 1, 0, 0,161, 0, 0, 0,125, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,125, 2, 0, 0,
+ 9, 1, 0, 0,144, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 37, 0, 0, 0,144, 1, 0, 0, 9, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 9, 1, 0, 0,125, 2, 0, 0, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,127, 2, 0, 0,100, 0, 0, 0,
+ 23, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 23, 1, 0, 0,143, 1, 0, 0,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+160, 0, 0, 0,127, 2, 0, 0,143, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,143, 1, 0, 0, 23, 1, 0, 0, 41, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3,127, 2, 0, 0,160, 0, 0, 0,128, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,128, 2, 0, 0,
+129, 2, 0, 0,127, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,100, 0, 0, 0,127, 2, 0, 0,129, 2, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,129, 2, 0, 0,128, 2, 0, 0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 1, 0, 0, 9, 0, 0, 0,
+ 22, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 22, 1, 0, 0,129, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,
+ 90, 0, 0, 0, 2, 1, 0, 0,129, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,129, 2, 0, 0, 22, 1, 0, 0,100, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 90, 0, 0, 0,128, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3,128, 2, 0, 0,
+142, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 36, 0, 0, 0, 3, 1, 0, 0,142, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3,142, 1, 0, 0,128, 2, 0, 0,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 68, 65, 84, 65, 0,240, 0, 0,
+176,193,119, 1, 0, 0, 0, 0, 60, 0, 0, 0, 0, 5, 0, 0,166,222,110, 63, 9,205, 55, 63,212,132,105, 63,201,236, 65, 63,
+218,153,103, 63,119,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+218,153,103, 63,119,155, 54, 63,118,148,108, 63,211,160, 44, 63,166,222,110, 63, 9,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36, 51,115, 63, 36, 28, 45, 63,166,222,110, 63, 9,205, 55, 63,
+118,148,108, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,148,108, 63,211,160, 44, 63,218,153,103, 63,119,155, 54, 63, 87, 17,102, 63,229, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 56, 81, 96, 63,170, 55, 52, 63, 87, 17,102, 63,229, 52, 43, 63,
+218,153,103, 63,119,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+218,153,103, 63,119,155, 54, 63, 9, 75, 97, 63, 92,233, 63, 63, 56, 81, 96, 63,170, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 49, 86, 60, 63, 56, 81, 96, 63,170, 55, 52, 63,
+ 9, 75, 97, 63, 92,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 9, 75, 97, 63, 92,233, 63, 63,218,153,103, 63,119,155, 54, 63,212,132,105, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,103,167, 98, 63,168, 39, 75, 63,138,153, 89, 63, 39,228, 82, 63,
+139,153, 89, 63,255,153, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+139,153, 89, 63,255,153, 71, 63, 9, 75, 97, 63, 92,233, 63, 63,103,167, 98, 63,168, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,132,105, 63,201,236, 65, 63,103,167, 98, 63,168, 39, 75, 63,
+ 9, 75, 97, 63, 92,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 9, 75, 97, 63, 92,233, 63, 63,139,153, 89, 63,255,153, 71, 63,138,153, 89, 63, 49, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 56, 81, 96, 63,170, 55, 52, 63,138,153, 89, 63, 49, 86, 60, 63,
+139,153, 89, 63, 79, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+139,153, 89, 63, 79, 12, 49, 63,205,182, 95, 63,222,228, 40, 63, 56, 81, 96, 63,170, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87, 17,102, 63,229, 52, 43, 63, 56, 81, 96, 63,170, 55, 52, 63,
+205,182, 95, 63,222,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+205,182, 95, 63,222,228, 40, 63,139,153, 89, 63, 79, 12, 49, 63,139,153, 89, 63, 45,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,103,167, 98, 63,168, 39, 75, 63,212,132,105, 63,201,236, 65, 63,
+168, 83,109, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+168, 83,109, 63,207, 83, 78, 63,135, 85,101, 63,148, 64, 88, 63,103,167, 98, 63,168, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 39,228, 82, 63,103,167, 98, 63,168, 39, 75, 63,
+135, 85,101, 63,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+135, 85,101, 63,148, 64, 88, 63,168, 83,109, 63,207, 83, 78, 63, 36, 51,115, 63, 22, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162, 18,121, 63,207, 83, 78, 63, 36, 51,115, 63, 22, 56, 90, 63,
+168, 83,109, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+168, 83,109, 63,207, 83, 78, 63, 36, 51,115, 63,115, 23, 67, 63,162, 18,121, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,116,225,124, 63,202,236, 65, 63,162, 18,121, 63,207, 83, 78, 63,
+ 36, 51,115, 63,115, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 36, 51,115, 63,115, 23, 67, 63,168, 83,109, 63,207, 83, 78, 63,212,132,105, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,166,222,110, 63, 9,205, 55, 63, 36, 51,115, 63, 36, 28, 45, 63,
+163,135,119, 63, 11,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+163,135,119, 63, 11,205, 55, 63, 36, 51,115, 63,115, 23, 67, 63,166,222,110, 63, 9,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,132,105, 63,201,236, 65, 63,166,222,110, 63, 9,205, 55, 63,
+ 36, 51,115, 63,115, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 36, 51,115, 63,115, 23, 67, 63,163,135,119, 63, 11,205, 55, 63,116,225,124, 63,202,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162, 18,121, 63,207, 83, 78, 63,116,225,124, 63,202,236, 65, 63,
+113,223,129, 63,170, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+113,223,129, 63,170, 39, 75, 63, 98,136,128, 63,148, 64, 88, 63,162, 18,121, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36, 51,115, 63, 22, 56, 90, 63,162, 18,121, 63,207, 83, 78, 63,
+ 98,136,128, 63,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 95, 98,136, 59,148, 64, 88, 63,160,184,111, 60,170, 39, 75, 63,243,203, 76, 61, 41,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,243,203, 76, 61, 82, 12, 49, 63,246,203, 76, 61, 53, 86, 60, 63,
+ 31,162,194, 60,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 31,162,194, 60,172, 55, 52, 63,111,239,213, 60,223,228, 40, 63,243,203, 76, 61, 82, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,246,203, 76, 61, 48,200, 37, 63,243,203, 76, 61, 82, 12, 49, 63,
+111,239,213, 60,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+111,239,213, 60,223,228, 40, 63, 31,162,194, 60,172, 55, 52, 63,120,226,169, 58,230, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,111,204,126, 63,121,155, 54, 63,121, 42,128, 63,230, 52, 43, 63,
+136, 10,131, 63,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+136, 10,131, 63,172, 55, 52, 63,160,141,130, 63, 95,233, 63, 63,111,204,126, 63,121,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,116,225,124, 63,202,236, 65, 63,111,204,126, 63,121,155, 54, 63,
+160,141,130, 63, 95,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 11,104,163, 60, 95,233, 63, 63, 31,162,194, 60,172, 55, 52, 63,246,203, 76, 61, 53, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,244,203, 76, 61, 2,154, 71, 63,243,203, 76, 61, 41,228, 82, 63,
+160,184,111, 60,170, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+160,184,111, 60,170, 39, 75, 63, 11,104,163, 60, 95,233, 63, 63,244,203, 76, 61, 2,154, 71, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,246,203, 76, 61, 53, 86, 60, 63,244,203, 76, 61, 2,154, 71, 63,
+ 11,104,163, 60, 95,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+160,141,130, 63, 95,233, 63, 63,113,223,129, 63,170, 39, 75, 63,116,225,124, 63,202,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,111,204,126, 63,121,155, 54, 63,116,225,124, 63,202,236, 65, 63,
+163,135,119, 63, 11,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+163,135,119, 63, 11,205, 55, 63,210,209,121, 63,212,160, 44, 63,111,204,126, 63,121,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,121, 42,128, 63,230, 52, 43, 63,111,204,126, 63,121,155, 54, 63,
+210,209,121, 63,212,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+210,209,121, 63,212,160, 44, 63,163,135,119, 63, 11,205, 55, 63, 36, 51,115, 63, 36, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 95,102,134, 63, 79, 46, 94, 63, 95,102,134, 63, 22,114,105, 63,
+ 52,205,124, 63, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 52,205,124, 63, 58, 26, 99, 63, 98,136,128, 63,148, 64, 88, 63, 95,102,134, 63, 79, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,243,203, 76, 61, 41,228, 82, 63,234,203, 76, 61, 79, 46, 94, 63,
+ 95, 98,136, 59,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 98,136,128, 63,148, 64, 88, 63, 52,205,124, 63, 58, 26, 99, 63, 36, 51,115, 63, 22, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,153,105, 63, 58, 26, 99, 63, 36, 51,115, 63, 22, 56, 90, 63,
+ 52,205,124, 63, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 52,205,124, 63, 58, 26, 99, 63, 32, 51,115, 63,212,154,109, 63, 21,153,105, 63, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 19,114,105, 63, 21,153,105, 63, 58, 26, 99, 63,
+ 32, 51,115, 63,212,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 32, 51,115, 63,212,154,109, 63, 52,205,124, 63, 58, 26, 99, 63, 95,102,134, 63, 22,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 95,102,134, 63,242,187,116, 63, 3,153, 59, 63, 0, 0,128, 63,
+136,153, 89, 63,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+136,153, 89, 63,242,187,116, 63, 32, 51,115, 63,212,154,109, 63, 95,102,134, 63,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 95,102,134, 63, 22,114,105, 63, 95,102,134, 63,242,187,116, 63,
+ 32, 51,115, 63,212,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 32, 51,115, 63,212,154,109, 63,136,153, 89, 63,242,187,116, 63,138,153, 89, 63, 19,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,153,105, 63, 58, 26, 99, 63,138,153, 89, 63, 19,114,105, 63,
+138,153, 89, 63, 77, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+138,153, 89, 63, 77, 46, 94, 63,135, 85,101, 63,148, 64, 88, 63, 21,153,105, 63, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36, 51,115, 63, 22, 56, 90, 63, 21,153,105, 63, 58, 26, 99, 63,
+135, 85,101, 63,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+135, 85,101, 63,148, 64, 88, 63,138,153, 89, 63, 77, 46, 94, 63,138,153, 89, 63, 39,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 67,153, 75, 63,113,155, 54, 63, 74,174, 73, 63,193,236, 65, 63,
+124, 84, 68, 63,255,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+124, 84, 68, 63,255,204, 55, 63,169,158, 70, 63,200,160, 44, 63, 67,153, 75, 63,113,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,196, 33, 77, 63,221, 52, 43, 63, 67,153, 75, 63,113,155, 54, 63,
+169,158, 70, 63,200,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+169,158, 70, 63,200,160, 44, 63,124, 84, 68, 63,255,204, 55, 63, 0, 0, 64, 63, 24, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 67,153, 75, 63,113,155, 54, 63,196, 33, 77, 63,221, 52, 43, 63,
+225,225, 82, 63,165, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+225,225, 82, 63,165, 55, 52, 63, 16,232, 81, 63, 89,233, 63, 63, 67,153, 75, 63,113,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 74,174, 73, 63,193,236, 65, 63, 67,153, 75, 63,113,155, 54, 63,
+ 16,232, 81, 63, 89,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 16,232, 81, 63, 89,233, 63, 63,225,225, 82, 63,165, 55, 52, 63,138,153, 89, 63, 49, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,153, 89, 63,255,153, 71, 63,138,153, 89, 63, 39,228, 82, 63,
+179,139, 80, 63,164, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+179,139, 80, 63,164, 39, 75, 63, 16,232, 81, 63, 89,233, 63, 63,139,153, 89, 63,255,153, 71, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 49, 86, 60, 63,139,153, 89, 63,255,153, 71, 63,
+ 16,232, 81, 63, 89,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 16,232, 81, 63, 89,233, 63, 63,179,139, 80, 63,164, 39, 75, 63, 74,174, 73, 63,193,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,153, 89, 63, 79, 12, 49, 63,138,153, 89, 63, 49, 86, 60, 63,
+225,225, 82, 63,165, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+225,225, 82, 63,165, 55, 52, 63, 75,124, 83, 63,217,228, 40, 63,139,153, 89, 63, 79, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,153, 89, 63, 45,200, 37, 63,139,153, 89, 63, 79, 12, 49, 63,
+ 75,124, 83, 63,217,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 75,124, 83, 63,217,228, 40, 63,225,225, 82, 63,165, 55, 52, 63,196, 33, 77, 63,221, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,120,223, 69, 63,198, 83, 78, 63, 74,174, 73, 63,193,236, 65, 63,
+179,139, 80, 63,164, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+179,139, 80, 63,164, 39, 75, 63,148,221, 77, 63,140, 64, 88, 63,120,223, 69, 63,198, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 12, 56, 90, 63,120,223, 69, 63,198, 83, 78, 63,
+148,221, 77, 63,140, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+148,221, 77, 63,140, 64, 88, 63,179,139, 80, 63,164, 39, 75, 63,138,153, 89, 63, 39,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,120,223, 69, 63,198, 83, 78, 63, 0, 0, 64, 63, 12, 56, 90, 63,
+136, 32, 58, 63,198, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+136, 32, 58, 63,198, 83, 78, 63, 0, 0, 64, 63,106, 23, 67, 63,120,223, 69, 63,198, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 74,174, 73, 63,193,236, 65, 63,120,223, 69, 63,198, 83, 78, 63,
+ 0, 0, 64, 63,106, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,106, 23, 67, 63,136, 32, 58, 63,198, 83, 78, 63,182, 81, 54, 63,193,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,132,171, 59, 63,255,204, 55, 63, 0, 0, 64, 63, 24, 28, 45, 63,
+124, 84, 68, 63,255,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+124, 84, 68, 63,255,204, 55, 63, 0, 0, 64, 63,106, 23, 67, 63,132,171, 59, 63,255,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,182, 81, 54, 63,193,236, 65, 63,132,171, 59, 63,255,204, 55, 63,
+ 0, 0, 64, 63,106, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,106, 23, 67, 63,124, 84, 68, 63,255,204, 55, 63, 74,174, 73, 63,193,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 77,116, 47, 63,164, 39, 75, 63,182, 81, 54, 63,193,236, 65, 63,
+136, 32, 58, 63,198, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+136, 32, 58, 63,198, 83, 78, 63,108, 34, 50, 63,140, 64, 88, 63, 77,116, 47, 63,164, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,102, 38, 63, 38,228, 82, 63, 77,116, 47, 63,164, 39, 75, 63,
+108, 34, 50, 63,140, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+108, 34, 50, 63,140, 64, 88, 63,136, 32, 58, 63,198, 83, 78, 63, 0, 0, 64, 63, 12, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 30, 45, 63,165, 55, 52, 63,117,102, 38, 63, 50, 86, 60, 63,
+117,102, 38, 63, 78, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+117,102, 38, 63, 78, 12, 49, 63,181,131, 44, 63,216,228, 40, 63, 31, 30, 45, 63,165, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 60,222, 50, 63,221, 52, 43, 63, 31, 30, 45, 63,165, 55, 52, 63,
+181,131, 44, 63,216,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+181,131, 44, 63,216,228, 40, 63,117,102, 38, 63, 78, 12, 49, 63,117,102, 38, 63, 45,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 31, 30, 45, 63,165, 55, 52, 63, 60,222, 50, 63,221, 52, 43, 63,
+189,102, 52, 63,113,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+189,102, 52, 63,113,155, 54, 63,240, 23, 46, 63, 89,233, 63, 63, 31, 30, 45, 63,165, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63, 50, 86, 60, 63, 31, 30, 45, 63,165, 55, 52, 63,
+240, 23, 46, 63, 89,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+240, 23, 46, 63, 89,233, 63, 63,189,102, 52, 63,113,155, 54, 63,182, 81, 54, 63,193,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 77,116, 47, 63,164, 39, 75, 63,118,102, 38, 63, 38,228, 82, 63,
+117,102, 38, 63,255,153, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+117,102, 38, 63,255,153, 71, 63,240, 23, 46, 63, 89,233, 63, 63, 77,116, 47, 63,164, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,182, 81, 54, 63,193,236, 65, 63, 77,116, 47, 63,164, 39, 75, 63,
+240, 23, 46, 63, 89,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+240, 23, 46, 63, 89,233, 63, 63,117,102, 38, 63,255,153, 71, 63,117,102, 38, 63, 50, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,132,171, 59, 63,255,204, 55, 63,182, 81, 54, 63,193,236, 65, 63,
+189,102, 52, 63,113,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+189,102, 52, 63,113,155, 54, 63, 87, 97, 57, 63,200,160, 44, 63,132,171, 59, 63,255,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 24, 28, 45, 63,132,171, 59, 63,255,204, 55, 63,
+ 87, 97, 57, 63,200,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 87, 97, 57, 63,200,160, 44, 63,189,102, 52, 63,113,155, 54, 63, 60,222, 50, 63,221, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,250,101, 54, 63, 51, 26, 99, 63,118,102, 38, 63, 19,114,105, 63,
+118,102, 38, 63, 77, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,102, 38, 63, 77, 46, 94, 63,108, 34, 50, 63,140, 64, 88, 63,250,101, 54, 63, 51, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 12, 56, 90, 63,250,101, 54, 63, 51, 26, 99, 63,
+108, 34, 50, 63,140, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+108, 34, 50, 63,140, 64, 88, 63,118,102, 38, 63, 77, 46, 94, 63,118,102, 38, 63, 38,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,250,101, 54, 63, 51, 26, 99, 63, 0, 0, 64, 63, 12, 56, 90, 63,
+ 6,154, 73, 63, 51, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 6,154, 73, 63, 51, 26, 99, 63, 0, 0, 64, 63,206,154,109, 63,250,101, 54, 63, 51, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,102, 38, 63, 19,114,105, 63,250,101, 54, 63, 51, 26, 99, 63,
+ 0, 0, 64, 63,206,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,206,154,109, 63, 6,154, 73, 63, 51, 26, 99, 63,138,153, 89, 63, 19,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,136,153, 89, 63,242,187,116, 63, 3,153, 59, 63, 0, 0,128, 63,
+120,102, 38, 63,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+120,102, 38, 63,242,187,116, 63, 0, 0, 64, 63,206,154,109, 63,136,153, 89, 63,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 19,114,105, 63,136,153, 89, 63,242,187,116, 63,
+ 0, 0, 64, 63,206,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,206,154,109, 63,120,102, 38, 63,242,187,116, 63,118,102, 38, 63, 19,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 77, 46, 94, 63,138,153, 89, 63, 19,114,105, 63,
+ 6,154, 73, 63, 51, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 6,154, 73, 63, 51, 26, 99, 63,148,221, 77, 63,140, 64, 88, 63,138,153, 89, 63, 77, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,153, 89, 63, 39,228, 82, 63,138,153, 89, 63, 77, 46, 94, 63,
+148,221, 77, 63,140, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+148,221, 77, 63,140, 64, 88, 63, 6,154, 73, 63, 51, 26, 99, 63, 0, 0, 64, 63, 12, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,167, 71, 8, 62, 7,205, 55, 63,170,192,229, 61,200,236, 65, 63,
+203,104,214, 61,120,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+203,104,214, 61,120,155, 54, 63,201, 61,254, 61,207,160, 44, 63,167, 71, 8, 62, 7,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173,153, 25, 62, 27, 28, 45, 63,167, 71, 8, 62, 7,205, 55, 63,
+201, 61,254, 61,207,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+201, 61,254, 61,207,160, 44, 63,203,104,214, 61,120,155, 54, 63,175, 36,202, 61,228, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,145, 35,156, 61,172, 55, 52, 63,175, 36,202, 61,228, 52, 43, 63,
+203,104,214, 61,120,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+203,104,214, 61,120,155, 54, 63, 32,242,163, 61, 96,233, 63, 63,145, 35,156, 61,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,246,203, 76, 61, 53, 86, 60, 63,145, 35,156, 61,172, 55, 52, 63,
+ 32,242,163, 61, 96,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 32,242,163, 61, 96,233, 63, 63,203,104,214, 61,120,155, 54, 63,170,192,229, 61,200,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 17,213,174, 61,171, 39, 75, 63,243,203, 76, 61, 41,228, 82, 63,
+244,203, 76, 61, 2,154, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+244,203, 76, 61, 2,154, 71, 63, 32,242,163, 61, 96,233, 63, 63, 17,213,174, 61,171, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170,192,229, 61,200,236, 65, 63, 17,213,174, 61,171, 39, 75, 63,
+ 32,242,163, 61, 96,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 32,242,163, 61, 96,233, 63, 63,244,203, 76, 61, 2,154, 71, 63,246,203, 76, 61, 53, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,145, 35,156, 61,172, 55, 52, 63,246,203, 76, 61, 53, 86, 60, 63,
+243,203, 76, 61, 82, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+243,203, 76, 61, 82, 12, 49, 63, 53, 80,151, 61,223,228, 40, 63,145, 35,156, 61,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,175, 36,202, 61,228, 52, 43, 63,145, 35,156, 61,172, 55, 52, 63,
+ 53, 80,151, 61,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 53, 80,151, 61,223,228, 40, 63,243,203, 76, 61, 82, 12, 49, 63,246,203, 76, 61, 48,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 17,213,174, 61,171, 39, 75, 63,170,192,229, 61,200,236, 65, 63,
+169, 27, 2, 62,204, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+169, 27, 2, 62,204, 83, 78, 63, 23, 70,196, 61,147, 64, 88, 63, 17,213,174, 61,171, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,243,203, 76, 61, 41,228, 82, 63, 17,213,174, 61,171, 39, 75, 63,
+ 23, 70,196, 61,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 23, 70,196, 61,147, 64, 88, 63,169, 27, 2, 62,204, 83, 78, 63,160,153, 25, 62, 14, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162, 23, 49, 62,195, 83, 78, 63,160,153, 25, 62, 14, 56, 90, 63,
+169, 27, 2, 62,204, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+169, 27, 2, 62,204, 83, 78, 63,172,153, 25, 62,108, 23, 67, 63,162, 23, 49, 62,195, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,240, 82, 64, 62,183,236, 65, 63,162, 23, 49, 62,195, 83, 78, 63,
+172,153, 25, 62,108, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+172,153, 25, 62,108, 23, 67, 63,169, 27, 2, 62,204, 83, 78, 63,170,192,229, 61,200,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,167, 71, 8, 62, 7,205, 55, 63,173,153, 25, 62, 27, 28, 45, 63,
+173,235, 42, 62,254,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+173,235, 42, 62,254,204, 55, 63,172,153, 25, 62,108, 23, 67, 63,167, 71, 8, 62, 7,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170,192,229, 61,200,236, 65, 63,167, 71, 8, 62, 7,205, 55, 63,
+172,153, 25, 62,108, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+172,153, 25, 62,108, 23, 67, 63,173,235, 42, 62,254,204, 55, 63,240, 82, 64, 62,183,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,162, 23, 49, 62,195, 83, 78, 63,240, 82, 64, 62,183,236, 65, 63,
+166,200, 91, 62,147, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+166,200, 91, 62,147, 39, 75, 63, 34, 16, 81, 62,131, 64, 88, 63,162, 23, 49, 62,195, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,160,153, 25, 62, 14, 56, 90, 63,162, 23, 49, 62,195, 83, 78, 63,
+ 34, 16, 81, 62,131, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 34, 16, 81, 62,131, 64, 88, 63,166,200, 91, 62,147, 39, 75, 63, 0, 0,128, 62, 13,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 47, 12, 49, 63, 0, 0,128, 62, 19, 86, 60, 63,
+ 92, 33,101, 62,146, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 92, 33,101, 62,146, 55, 52, 63, 14,139,103, 62,199,228, 40, 63, 0, 0,128, 62, 47, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 23,200, 37, 63, 0, 0,128, 62, 47, 12, 49, 63,
+ 14,139,103, 62,199,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 14,139,103, 62,199,228, 40, 63, 92, 33,101, 62,146, 55, 52, 63,230, 32, 78, 62,211, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,223,254, 71, 62,102,155, 54, 63,230, 32, 78, 62,211, 52, 43, 63,
+ 92, 33,101, 62,146, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 92, 33,101, 62,146, 55, 52, 63, 23, 58, 97, 62, 69,233, 63, 63,223,254, 71, 62,102,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,240, 82, 64, 62,183,236, 65, 63,223,254, 71, 62,102,155, 54, 63,
+ 23, 58, 97, 62, 69,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 23, 58, 97, 62, 69,233, 63, 63, 92, 33,101, 62,146, 55, 52, 63, 0, 0,128, 62, 19, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,228,153, 71, 63, 0, 0,128, 62, 13,228, 82, 63,
+166,200, 91, 62,147, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+166,200, 91, 62,147, 39, 75, 63, 23, 58, 97, 62, 69,233, 63, 63, 0, 0,128, 62,228,153, 71, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 19, 86, 60, 63, 0, 0,128, 62,228,153, 71, 63,
+ 23, 58, 97, 62, 69,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 23, 58, 97, 62, 69,233, 63, 63,166,200, 91, 62,147, 39, 75, 63,240, 82, 64, 62,183,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,223,254, 71, 62,102,155, 54, 63,240, 82, 64, 62,183,236, 65, 63,
+173,235, 42, 62,254,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+173,235, 42, 62,254,204, 55, 63,105, 20, 52, 62,198,160, 44, 63,223,254, 71, 62,102,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,230, 32, 78, 62,211, 52, 43, 63,223,254, 71, 62,102,155, 54, 63,
+105, 20, 52, 62,198,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+105, 20, 52, 62,198,160, 44, 63,173,235, 42, 62,254,204, 55, 63,173,153, 25, 62, 27, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 58, 46, 94, 63, 0, 0,128, 62, 8,114,105, 63,
+230, 1, 64, 62, 49, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+230, 1, 64, 62, 49, 26, 99, 63, 34, 16, 81, 62,131, 64, 88, 63, 0, 0,128, 62, 58, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 13,228, 82, 63, 0, 0,128, 62, 58, 46, 94, 63,
+ 34, 16, 81, 62,131, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 34, 16, 81, 62,131, 64, 88, 63,230, 1, 64, 62, 49, 26, 99, 63,160,153, 25, 62, 14, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164, 98,230, 61, 58, 26, 99, 63,160,153, 25, 62, 14, 56, 90, 63,
+230, 1, 64, 62, 49, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+230, 1, 64, 62, 49, 26, 99, 63,159,153, 25, 62,210,154,109, 63,164, 98,230, 61, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237,203, 76, 61, 22,114,105, 63,164, 98,230, 61, 58, 26, 99, 63,
+159,153, 25, 62,210,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+159,153, 25, 62,210,154,109, 63,230, 1, 64, 62, 49, 26, 99, 63, 0, 0,128, 62, 8,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,232,187,116, 63, 3,153, 59, 63, 0, 0,128, 63,
+ 95,102,134, 63,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+210,203, 76, 61,242,187,116, 63,159,153, 25, 62,210,154,109, 63, 0, 0,128, 62,232,187,116, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 8,114,105, 63, 0, 0,128, 62,232,187,116, 63,
+159,153, 25, 62,210,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+159,153, 25, 62,210,154,109, 63,210,203, 76, 61,242,187,116, 63,237,203, 76, 61, 22,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164, 98,230, 61, 58, 26, 99, 63,237,203, 76, 61, 22,114,105, 63,
+234,203, 76, 61, 79, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+234,203, 76, 61, 79, 46, 94, 63, 23, 70,196, 61,147, 64, 88, 63,164, 98,230, 61, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,160,153, 25, 62, 14, 56, 90, 63,164, 98,230, 61, 58, 26, 99, 63,
+ 23, 70,196, 61,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 23, 70,196, 61,147, 64, 88, 63,234,203, 76, 61, 79, 46, 94, 63,243,203, 76, 61, 41,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42,138,170, 62,254,204, 55, 63,136,214,159, 62,183,236, 65, 63,
+145, 0,156, 62,102,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+145, 0,156, 62,102,155, 54, 63,204,245,165, 62,198,160, 44, 63, 42,138,170, 62,254,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42, 51,179, 62, 28, 28, 45, 63, 42,138,170, 62,254,204, 55, 63,
+204,245,165, 62,198,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+204,245,165, 62,198,160, 44, 63,145, 0,156, 62,102,155, 54, 63,141,239,152, 62,211, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 82,111,141, 62,146, 55, 52, 63,141,239,152, 62,211, 52, 43, 63,
+145, 0,156, 62,102,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+145, 0,156, 62,102,155, 54, 63,245, 98,143, 62, 68,233, 63, 63, 82,111,141, 62,146, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 19, 86, 60, 63, 82,111,141, 62,146, 55, 52, 63,
+245, 98,143, 62, 68,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+245, 98,143, 62, 68,233, 63, 63,145, 0,156, 62,102,155, 54, 63,136,214,159, 62,183,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173, 27,146, 62,147, 39, 75, 63, 0, 0,128, 62, 13,228, 82, 63,
+ 0, 0,128, 62,228,153, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62,228,153, 71, 63,245, 98,143, 62, 68,233, 63, 63,173, 27,146, 62,147, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,136,214,159, 62,183,236, 65, 63,173, 27,146, 62,147, 39, 75, 63,
+245, 98,143, 62, 68,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+245, 98,143, 62, 68,233, 63, 63, 0, 0,128, 62,228,153, 71, 63, 0, 0,128, 62, 19, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 82,111,141, 62,146, 55, 52, 63, 0, 0,128, 62, 19, 86, 60, 63,
+ 0, 0,128, 62, 47, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62, 47, 12, 49, 63,121, 58,140, 62,199,228, 40, 63, 82,111,141, 62,146, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,141,239,152, 62,211, 52, 43, 63, 82,111,141, 62,146, 55, 52, 63,
+121, 58,140, 62,199,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+121, 58,140, 62,199,228, 40, 63, 0, 0,128, 62, 47, 12, 49, 63, 0, 0,128, 62, 23,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173, 27,146, 62,147, 39, 75, 63,136,214,159, 62,183,236, 65, 63,
+ 47,116,167, 62,195, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 47,116,167, 62,195, 83, 78, 63,239,119,151, 62,131, 64, 88, 63,173, 27,146, 62,147, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 13,228, 82, 63,173, 27,146, 62,147, 39, 75, 63,
+239,119,151, 62,131, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+239,119,151, 62,131, 64, 88, 63, 47,116,167, 62,195, 83, 78, 63, 49, 51,179, 62, 14, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44,242,190, 62,205, 83, 78, 63, 49, 51,179, 62, 14, 56, 90, 63,
+ 47,116,167, 62,195, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 47,116,167, 62,195, 83, 78, 63, 42, 51,179, 62,108, 23, 67, 63, 44,242,190, 62,205, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,143,198, 62,200,236, 65, 63, 44,242,190, 62,205, 83, 78, 63,
+ 42, 51,179, 62,108, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 42, 51,179, 62,108, 23, 67, 63, 47,116,167, 62,195, 83, 78, 63,136,214,159, 62,183,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42,138,170, 62,254,204, 55, 63, 42, 51,179, 62, 28, 28, 45, 63,
+ 45,220,187, 62, 7,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 45,220,187, 62, 7,205, 55, 63, 42, 51,179, 62,108, 23, 67, 63, 42,138,170, 62,254,204, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,136,214,159, 62,183,236, 65, 63, 42,138,170, 62,254,204, 55, 63,
+ 42, 51,179, 62,108, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 42, 51,179, 62,108, 23, 67, 63, 45,220,187, 62, 7,205, 55, 63,214,143,198, 62,200,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44,242,190, 62,205, 83, 78, 63,214,143,198, 62,200,236, 65, 63,
+188, 74,212, 62,171, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+188, 74,212, 62,171, 39, 75, 63,122,238,206, 62,147, 64, 88, 63, 44,242,190, 62,205, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 49, 51,179, 62, 14, 56, 90, 63, 44,242,190, 62,205, 83, 78, 63,
+122,238,206, 62,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+122,238,206, 62,147, 64, 88, 63,188, 74,212, 62,171, 39, 75, 63,130,102,230, 62, 41,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,130,102,230, 62, 82, 12, 49, 63,129,102,230, 62, 53, 86, 60, 63,
+ 28,247,216, 62,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 28,247,216, 62,172, 55, 52, 63,243, 43,218, 62,223,228, 40, 63,130,102,230, 62, 82, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129,102,230, 62, 48,200, 37, 63,130,102,230, 62, 82, 12, 49, 63,
+243, 43,218, 62,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+243, 43,218, 62,223,228, 40, 63, 28,247,216, 62,172, 55, 52, 63,212,118,205, 62,228, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,206,101,202, 62,120,155, 54, 63,212,118,205, 62,228, 52, 43, 63,
+ 28,247,216, 62,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 28,247,216, 62,172, 55, 52, 63,120, 3,215, 62, 95,233, 63, 63,206,101,202, 62,120,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,143,198, 62,200,236, 65, 63,206,101,202, 62,120,155, 54, 63,
+120, 3,215, 62, 95,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+120, 3,215, 62, 95,233, 63, 63, 28,247,216, 62,172, 55, 52, 63,129,102,230, 62, 53, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,130,102,230, 62, 1,154, 71, 63,130,102,230, 62, 41,228, 82, 63,
+188, 74,212, 62,171, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+188, 74,212, 62,171, 39, 75, 63,120, 3,215, 62, 95,233, 63, 63,130,102,230, 62, 1,154, 71, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129,102,230, 62, 53, 86, 60, 63,130,102,230, 62, 1,154, 71, 63,
+120, 3,215, 62, 95,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+120, 3,215, 62, 95,233, 63, 63,188, 74,212, 62,171, 39, 75, 63,214,143,198, 62,200,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,206,101,202, 62,120,155, 54, 63,214,143,198, 62,200,236, 65, 63,
+ 45,220,187, 62, 7,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 45,220,187, 62, 7,205, 55, 63,142,112,192, 62,207,160, 44, 63,206,101,202, 62,120,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,118,205, 62,228, 52, 43, 63,206,101,202, 62,120,155, 54, 63,
+142,112,192, 62,207,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+142,112,192, 62,207,160, 44, 63, 45,220,187, 62, 7,205, 55, 63, 42, 51,179, 62, 28, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,131,102,230, 62, 79, 46, 94, 63,131,102,230, 62, 22,114,105, 63,
+ 87,103,198, 62, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 87,103,198, 62, 58, 26, 99, 63,122,238,206, 62,147, 64, 88, 63,131,102,230, 62, 79, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,130,102,230, 62, 41,228, 82, 63,131,102,230, 62, 79, 46, 94, 63,
+122,238,206, 62,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+122,238,206, 62,147, 64, 88, 63, 87,103,198, 62, 58, 26, 99, 63, 49, 51,179, 62, 14, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,255,159, 62, 49, 26, 99, 63, 49, 51,179, 62, 14, 56, 90, 63,
+ 87,103,198, 62, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 87,103,198, 62, 58, 26, 99, 63, 49, 51,179, 62,210,154,109, 63, 14,255,159, 62, 49, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 8,114,105, 63, 14,255,159, 62, 49, 26, 99, 63,
+ 49, 51,179, 62,210,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 49, 51,179, 62,210,154,109, 63, 87,103,198, 62, 58, 26, 99, 63,131,102,230, 62, 22,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,134,102,230, 62,242,187,116, 63, 3,153, 59, 63, 0, 0,128, 63,
+ 0, 0,128, 62,232,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62,232,187,116, 63, 49, 51,179, 62,210,154,109, 63,134,102,230, 62,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,131,102,230, 62, 22,114,105, 63,134,102,230, 62,242,187,116, 63,
+ 49, 51,179, 62,210,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 49, 51,179, 62,210,154,109, 63, 0, 0,128, 62,232,187,116, 63, 0, 0,128, 62, 8,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,255,159, 62, 49, 26, 99, 63, 0, 0,128, 62, 8,114,105, 63,
+ 0, 0,128, 62, 58, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62, 58, 46, 94, 63,239,119,151, 62,131, 64, 88, 63, 14,255,159, 62, 49, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 49, 51,179, 62, 14, 56, 90, 63, 14,255,159, 62, 49, 26, 99, 63,
+239,119,151, 62,131, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+239,119,151, 62,131, 64, 88, 63, 0, 0,128, 62, 58, 46, 94, 63, 0, 0,128, 62, 13,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 93,120, 8, 63, 11,205, 55, 63,140, 30, 3, 63,201,236, 65, 63,
+145, 51, 1, 63,121,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+145, 51, 1, 63,121,155, 54, 63, 46, 46, 6, 63,211,160, 44, 63, 93,120, 8, 63, 11,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,220,204, 12, 63, 35, 28, 45, 63, 93,120, 8, 63, 11,205, 55, 63,
+ 46, 46, 6, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 46, 46, 6, 63,211,160, 44, 63,145, 51, 1, 63,121,155, 54, 63, 30, 86,255, 62,230, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,213,243, 62,172, 55, 52, 63, 30, 86,255, 62,230, 52, 43, 63,
+145, 51, 1, 63,121,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+145, 51, 1, 63,121,155, 54, 63,128,201,245, 62, 94,233, 63, 63,222,213,243, 62,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129,102,230, 62, 53, 86, 60, 63,222,213,243, 62,172, 55, 52, 63,
+128,201,245, 62, 94,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+128,201,245, 62, 94,233, 63, 63,145, 51, 1, 63,121,155, 54, 63,140, 30, 3, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 59,130,248, 62,169, 39, 75, 63,130,102,230, 62, 41,228, 82, 63,
+130,102,230, 62, 1,154, 71, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+130,102,230, 62, 1,154, 71, 63,128,201,245, 62, 94,233, 63, 63, 59,130,248, 62,169, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,140, 30, 3, 63,201,236, 65, 63, 59,130,248, 62,169, 39, 75, 63,
+128,201,245, 62, 94,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+128,201,245, 62, 94,233, 63, 63,130,102,230, 62, 1,154, 71, 63,129,102,230, 62, 53, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,213,243, 62,172, 55, 52, 63,129,102,230, 62, 53, 86, 60, 63,
+130,102,230, 62, 82, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+130,102,230, 62, 82, 12, 49, 63, 9,161,242, 62,223,228, 40, 63,222,213,243, 62,172, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 30, 86,255, 62,230, 52, 43, 63,222,213,243, 62,172, 55, 52, 63,
+ 9,161,242, 62,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 9,161,242, 62,223,228, 40, 63,130,102,230, 62, 82, 12, 49, 63,129,102,230, 62, 48,200, 37, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 59,130,248, 62,169, 39, 75, 63,140, 30, 3, 63,201,236, 65, 63,
+ 94,237, 6, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 94,237, 6, 63,207, 83, 78, 63,118,222,253, 62,148, 64, 88, 63, 59,130,248, 62,169, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,130,102,230, 62, 41,228, 82, 63, 59,130,248, 62,169, 39, 75, 63,
+118,222,253, 62,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,222,253, 62,148, 64, 88, 63, 94,237, 6, 63,207, 83, 78, 63,220,204, 12, 63, 22, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 88,172, 18, 63,207, 83, 78, 63,220,204, 12, 63, 22, 56, 90, 63,
+ 94,237, 6, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 94,237, 6, 63,207, 83, 78, 63,220,204, 12, 63,115, 23, 67, 63, 88,172, 18, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44,123, 22, 63,201,236, 65, 63, 88,172, 18, 63,207, 83, 78, 63,
+220,204, 12, 63,115, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+220,204, 12, 63,115, 23, 67, 63, 94,237, 6, 63,207, 83, 78, 63,140, 30, 3, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 93,120, 8, 63, 11,205, 55, 63,220,204, 12, 63, 35, 28, 45, 63,
+ 91, 33, 17, 63, 9,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 91, 33, 17, 63, 9,205, 55, 63,220,204, 12, 63,115, 23, 67, 63, 93,120, 8, 63, 11,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,140, 30, 3, 63,201,236, 65, 63, 93,120, 8, 63, 11,205, 55, 63,
+220,204, 12, 63,115, 23, 67, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+220,204, 12, 63,115, 23, 67, 63, 91, 33, 17, 63, 9,205, 55, 63, 44,123, 22, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 88,172, 18, 63,207, 83, 78, 63, 44,123, 22, 63,201,236, 65, 63,
+153, 88, 29, 63,167, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+153, 88, 29, 63,167, 39, 75, 63,121,170, 26, 63,147, 64, 88, 63, 88,172, 18, 63,207, 83, 78, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,220,204, 12, 63, 22, 56, 90, 63, 88,172, 18, 63,207, 83, 78, 63,
+121,170, 26, 63,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+121,170, 26, 63,147, 64, 88, 63,153, 88, 29, 63,167, 39, 75, 63,118,102, 38, 63, 38,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63, 78, 12, 49, 63,117,102, 38, 63, 50, 86, 60, 63,
+200,174, 31, 63,169, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+200,174, 31, 63,169, 55, 52, 63, 51, 73, 32, 63,221,228, 40, 63,117,102, 38, 63, 78, 12, 49, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63, 45,200, 37, 63,117,102, 38, 63, 78, 12, 49, 63,
+ 51, 73, 32, 63,221,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 51, 73, 32, 63,221,228, 40, 63,200,174, 31, 63,169, 55, 52, 63,169,238, 25, 63,229, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 39,102, 24, 63,119,155, 54, 63,169,238, 25, 63,229, 52, 43, 63,
+200,174, 31, 63,169, 55, 52, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+200,174, 31, 63,169, 55, 52, 63,246,180, 30, 63, 92,233, 63, 63, 39,102, 24, 63,119,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44,123, 22, 63,201,236, 65, 63, 39,102, 24, 63,119,155, 54, 63,
+246,180, 30, 63, 92,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+246,180, 30, 63, 92,233, 63, 63,200,174, 31, 63,169, 55, 52, 63,117,102, 38, 63, 50, 86, 60, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63,255,153, 71, 63,118,102, 38, 63, 38,228, 82, 63,
+153, 88, 29, 63,167, 39, 75, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+153, 88, 29, 63,167, 39, 75, 63,246,180, 30, 63, 92,233, 63, 63,117,102, 38, 63,255,153, 71, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63, 50, 86, 60, 63,117,102, 38, 63,255,153, 71, 63,
+246,180, 30, 63, 92,233, 63, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+246,180, 30, 63, 92,233, 63, 63,153, 88, 29, 63,167, 39, 75, 63, 44,123, 22, 63,201,236, 65, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 39,102, 24, 63,119,155, 54, 63, 44,123, 22, 63,201,236, 65, 63,
+ 91, 33, 17, 63, 9,205, 55, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 91, 33, 17, 63, 9,205, 55, 63,138,107, 19, 63,211,160, 44, 63, 39,102, 24, 63,119,155, 54, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169,238, 25, 63,229, 52, 43, 63, 39,102, 24, 63,119,155, 54, 63,
+138,107, 19, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+138,107, 19, 63,211,160, 44, 63, 91, 33, 17, 63, 9,205, 55, 63,220,204, 12, 63, 35, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,102, 38, 63, 77, 46, 94, 63,118,102, 38, 63, 19,114,105, 63,
+235,102, 22, 63, 59, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+235,102, 22, 63, 59, 26, 99, 63,121,170, 26, 63,147, 64, 88, 63,118,102, 38, 63, 77, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,102, 38, 63, 38,228, 82, 63,118,102, 38, 63, 77, 46, 94, 63,
+121,170, 26, 63,147, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+121,170, 26, 63,147, 64, 88, 63,235,102, 22, 63, 59, 26, 99, 63,220,204, 12, 63, 22, 56, 90, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204, 50, 3, 63, 58, 26, 99, 63,220,204, 12, 63, 22, 56, 90, 63,
+235,102, 22, 63, 59, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+235,102, 22, 63, 59, 26, 99, 63,224,204, 12, 63,212,154,109, 63,204, 50, 3, 63, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,131,102,230, 62, 22,114,105, 63,204, 50, 3, 63, 58, 26, 99, 63,
+224,204, 12, 63,212,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+224,204, 12, 63,212,154,109, 63,235,102, 22, 63, 59, 26, 99, 63,118,102, 38, 63, 19,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,120,102, 38, 63,242,187,116, 63, 3,153, 59, 63, 0, 0,128, 63,
+134,102,230, 62,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+134,102,230, 62,242,187,116, 63,224,204, 12, 63,212,154,109, 63,120,102, 38, 63,242,187,116, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,102, 38, 63, 19,114,105, 63,120,102, 38, 63,242,187,116, 63,
+224,204, 12, 63,212,154,109, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+224,204, 12, 63,212,154,109, 63,134,102,230, 62,242,187,116, 63,131,102,230, 62, 22,114,105, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204, 50, 3, 63, 58, 26, 99, 63,131,102,230, 62, 22,114,105, 63,
+131,102,230, 62, 79, 46, 94, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+131,102,230, 62, 79, 46, 94, 63,118,222,253, 62,148, 64, 88, 63,204, 50, 3, 63, 58, 26, 99, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,220,204, 12, 63, 22, 56, 90, 63,204, 50, 3, 63, 58, 26, 99, 63,
+118,222,253, 62,148, 64, 88, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,222,253, 62,148, 64, 88, 63,131,102,230, 62, 79, 46, 94, 63,130,102,230, 62, 41,228, 82, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213,233, 76, 63, 35, 48, 21, 63,176,235, 70, 63,226,209, 22, 63,
+ 80,234, 73, 63,146,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 80,234, 73, 63,146,111, 11, 63, 1,200, 79, 63, 94,152, 9, 63,213,233, 76, 63, 35, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 19,215, 82, 63,252, 29, 19, 63,213,233, 76, 63, 35, 48, 21, 63,
+ 1,200, 79, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 1,200, 79, 63, 94,152, 9, 63, 80,234, 73, 63,146,111, 11, 63,193,204, 76, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213,233, 76, 63, 35, 48, 21, 63, 19,215, 82, 63,252, 29, 19, 63,
+220, 41, 80, 63,105, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+220, 41, 80, 63,105, 60, 31, 63,164,219, 73, 63,173, 23, 33, 63,213,233, 76, 63, 35, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176,235, 70, 63,226,209, 22, 63,213,233, 76, 63, 35, 48, 21, 63,
+164,219, 73, 63,173, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+164,219, 73, 63,173, 23, 33, 63,220, 41, 80, 63,105, 60, 31, 63,196, 33, 77, 63,221, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169,158, 70, 63,200,160, 44, 63, 0, 0, 64, 63, 24, 28, 45, 63,
+ 5,171, 67, 63,216, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 5,171, 67, 63,216, 17, 34, 63,164,219, 73, 63,173, 23, 33, 63,169,158, 70, 63,200,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,196, 33, 77, 63,221, 52, 43, 63,169,158, 70, 63,200,160, 44, 63,
+164,219, 73, 63,173, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+164,219, 73, 63,173, 23, 33, 63, 5,171, 67, 63,216, 17, 34, 63,176,235, 70, 63,226,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 75,124, 83, 63,217,228, 40, 63,196, 33, 77, 63,221, 52, 43, 63,
+220, 41, 80, 63,105, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+220, 41, 80, 63,105, 60, 31, 63,218, 20, 86, 63,143,140, 28, 63, 75,124, 83, 63,217,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,153, 89, 63, 45,200, 37, 63, 75,124, 83, 63,217,228, 40, 63,
+218, 20, 86, 63,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+218, 20, 86, 63,143,140, 28, 63,220, 41, 80, 63,105, 60, 31, 63, 19,215, 82, 63,252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,182, 32, 23, 63,176,235, 70, 63,226,209, 22, 63,
+ 5,171, 67, 63,216, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 5,171, 67, 63,216, 17, 34, 63,251, 84, 60, 63,216, 17, 34, 63, 0, 0, 64, 63,182, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 80, 20, 57, 63,226,209, 22, 63, 0, 0, 64, 63,182, 32, 23, 63,
+251, 84, 60, 63,216, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+251, 84, 60, 63,216, 17, 34, 63, 5,171, 67, 63,216, 17, 34, 63, 0, 0, 64, 63, 24, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,182, 32, 23, 63, 80, 20, 57, 63,226,209, 22, 63,
+169,156, 60, 63, 96,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+169,156, 60, 63, 96,116, 11, 63, 87, 99, 67, 63, 96,116, 11, 63, 0, 0, 64, 63,182, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,176,235, 70, 63,226,209, 22, 63, 0, 0, 64, 63,182, 32, 23, 63,
+ 87, 99, 67, 63, 96,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 87, 99, 67, 63, 96,116, 11, 63,169,156, 60, 63, 96,116, 11, 63, 0, 0, 64, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 96,102, 70, 63,244, 1, 0, 63,193,204, 76, 63, 0, 0, 0, 63,
+ 80,234, 73, 63,146,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 80,234, 73, 63,146,111, 11, 63, 87, 99, 67, 63, 96,116, 11, 63, 96,102, 70, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 0, 0, 0, 63, 96,102, 70, 63,244, 1, 0, 63,
+ 87, 99, 67, 63, 96,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 87, 99, 67, 63, 96,116, 11, 63, 80,234, 73, 63,146,111, 11, 63,176,235, 70, 63,226,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,160,153, 57, 63,244, 1, 0, 63, 0, 0, 64, 63, 0, 0, 0, 63,
+169,156, 60, 63, 96,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+169,156, 60, 63, 96,116, 11, 63,176, 21, 54, 63,146,111, 11, 63,160,153, 57, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63, 51, 51, 63, 0, 0, 0, 63,160,153, 57, 63,244, 1, 0, 63,
+176, 21, 54, 63,146,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+176, 21, 54, 63,146,111, 11, 63,169,156, 60, 63, 96,116, 11, 63, 80, 20, 57, 63,226,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 93, 58,217, 62,144, 61, 57, 63, 19,196,217, 62,
+ 85,123, 60, 63,253,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 85,123, 60, 63,253,230,198, 62,171,132, 67, 63,253,230,198, 62, 0, 0, 64, 63, 93, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,112,194, 70, 63, 19,196,217, 62, 0, 0, 64, 63, 93, 58,217, 62,
+171,132, 67, 63,253,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+171,132, 67, 63,253,230,198, 62, 85,123, 60, 63,253,230,198, 62, 0, 0, 64, 63,211,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 93, 58,217, 62,112,194, 70, 63, 19,196,217, 62,
+125, 84, 67, 63, 42,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+125, 84, 67, 63, 42,211,236, 62,131,171, 60, 63, 42,211,236, 62, 0, 0, 64, 63, 93, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,144, 61, 57, 63, 19,196,217, 62, 0, 0, 64, 63, 93, 58,217, 62,
+131,171, 60, 63, 42,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+131,171, 60, 63, 42,211,236, 62,125, 84, 67, 63, 42,211,236, 62, 0, 0, 64, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,160,153, 57, 63,244, 1, 0, 63, 63, 51, 51, 63, 0, 0, 0, 63,
+128, 46, 54, 63, 75,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+128, 46, 54, 63, 75,207,236, 62,131,171, 60, 63, 42,211,236, 62,160,153, 57, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 0, 0, 0, 63,160,153, 57, 63,244, 1, 0, 63,
+131,171, 60, 63, 42,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+131,171, 60, 63, 42,211,236, 62,128, 46, 54, 63, 75,207,236, 62,144, 61, 57, 63, 19,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 96,102, 70, 63,244, 1, 0, 63, 0, 0, 64, 63, 0, 0, 0, 63,
+125, 84, 67, 63, 42,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+125, 84, 67, 63, 42,211,236, 62,128,209, 73, 63, 75,207,236, 62, 96,102, 70, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,193,204, 76, 63, 0, 0, 0, 63, 96,102, 70, 63,244, 1, 0, 63,
+128,209, 73, 63, 75,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+128,209, 73, 63, 75,207,236, 62,125, 84, 67, 63, 42,211,236, 62,112,194, 70, 63, 19,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 43, 22, 51, 63, 35, 48, 21, 63,237, 40, 45, 63,252, 29, 19, 63,
+255, 55, 48, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+255, 55, 48, 63, 94,152, 9, 63,176, 21, 54, 63,146,111, 11, 63, 43, 22, 51, 63, 35, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 80, 20, 57, 63,226,209, 22, 63, 43, 22, 51, 63, 35, 48, 21, 63,
+176, 21, 54, 63,146,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+176, 21, 54, 63,146,111, 11, 63,255, 55, 48, 63, 94,152, 9, 63, 63, 51, 51, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 43, 22, 51, 63, 35, 48, 21, 63, 80, 20, 57, 63,226,209, 22, 63,
+ 91, 36, 54, 63,173, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 91, 36, 54, 63,173, 23, 33, 63, 36,214, 47, 63,105, 60, 31, 63, 43, 22, 51, 63, 35, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 40, 45, 63,252, 29, 19, 63, 43, 22, 51, 63, 35, 48, 21, 63,
+ 36,214, 47, 63,105, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 36,214, 47, 63,105, 60, 31, 63, 91, 36, 54, 63,173, 23, 33, 63, 60,222, 50, 63,221, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,181,131, 44, 63,216,228, 40, 63,117,102, 38, 63, 45,200, 37, 63,
+ 38,235, 41, 63,141,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 38,235, 41, 63,141,140, 28, 63, 36,214, 47, 63,105, 60, 31, 63,181,131, 44, 63,216,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 60,222, 50, 63,221, 52, 43, 63,181,131, 44, 63,216,228, 40, 63,
+ 36,214, 47, 63,105, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 36,214, 47, 63,105, 60, 31, 63, 38,235, 41, 63,141,140, 28, 63,237, 40, 45, 63,252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87, 97, 57, 63,200,160, 44, 63, 60,222, 50, 63,221, 52, 43, 63,
+ 91, 36, 54, 63,173, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 91, 36, 54, 63,173, 23, 33, 63,251, 84, 60, 63,216, 17, 34, 63, 87, 97, 57, 63,200,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63, 24, 28, 45, 63, 87, 97, 57, 63,200,160, 44, 63,
+251, 84, 60, 63,216, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+251, 84, 60, 63,216, 17, 34, 63, 91, 36, 54, 63,173, 23, 33, 63, 80, 20, 57, 63,226,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,134, 14,128, 63, 39, 48, 21, 63,227, 30,122, 63,233,209, 22, 63,
+138, 29,125, 63,150,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+138, 29,125, 63,150,111, 11, 63,159,125,129, 63, 94,152, 9, 63,134, 14,128, 63, 39, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,174, 73,193, 60,253, 29, 19, 63,209, 92,232, 57, 39, 48, 21, 63,
+114,207, 62, 60, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+159,125,129, 63, 94,152, 9, 63,138, 29,125, 63,150,111, 11, 63, 0, 0,128, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,209, 92,232, 57, 39, 48, 21, 63,174, 73,193, 60,253, 29, 19, 63,
+214, 67, 87, 60,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+136,174,129, 63,110, 60, 31, 63,213, 14,125, 63,180, 23, 33, 63,134, 14,128, 63, 39, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,227, 30,122, 63,233,209, 22, 63,134, 14,128, 63, 39, 48, 21, 63,
+213, 14,125, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+213, 14,125, 63,180, 23, 33, 63,136,174,129, 63,110, 60, 31, 63,121, 42,128, 63,230, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,210,209,121, 63,212,160, 44, 63, 36, 51,115, 63, 36, 28, 45, 63,
+ 49,222,118, 63,226, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 49,222,118, 63,226, 17, 34, 63,213, 14,125, 63,180, 23, 33, 63,210,209,121, 63,212,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,121, 42,128, 63,230, 52, 43, 63,210,209,121, 63,212,160, 44, 63,
+213, 14,125, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+213, 14,125, 63,180, 23, 33, 63, 49,222,118, 63,226, 17, 34, 63,227, 30,122, 63,233,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,111,239,213, 60,223,228, 40, 63,120,226,169, 58,230, 52, 43, 63,
+214, 67, 87, 60,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+214, 67, 87, 60,110, 60, 31, 63, 13,129, 20, 61,143,140, 28, 63,111,239,213, 60,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,246,203, 76, 61, 48,200, 37, 63,111,239,213, 60,223,228, 40, 63,
+ 13,129, 20, 61,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 13,129, 20, 61,143,140, 28, 63,214, 67, 87, 60,110, 60, 31, 63,174, 73,193, 60,253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44, 51,115, 63,188, 32, 23, 63,227, 30,122, 63,233,209, 22, 63,
+ 49,222,118, 63,226, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 49,222,118, 63,226, 17, 34, 63, 31,136,111, 63,225, 17, 34, 63, 44, 51,115, 63,188, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,116, 71,108, 63,232,209, 22, 63, 44, 51,115, 63,188, 32, 23, 63,
+ 31,136,111, 63,225, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 31,136,111, 63,225, 17, 34, 63, 49,222,118, 63,226, 17, 34, 63, 36, 51,115, 63, 36, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 44, 51,115, 63,188, 32, 23, 63,116, 71,108, 63,232,209, 22, 63,
+213,207,111, 63,100,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+213,207,111, 63,100,116, 11, 63,138,150,118, 63,101,116, 11, 63, 44, 51,115, 63,188, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,227, 30,122, 63,233,209, 22, 63, 44, 51,115, 63,188, 32, 23, 63,
+138,150,118, 63,101,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+138,150,118, 63,101,116, 11, 63,213,207,111, 63,100,116, 11, 63, 51, 51,115, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,153,121, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0, 0, 63,
+138, 29,125, 63,150,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+138, 29,125, 63,150,111, 11, 63,138,150,118, 63,101,116, 11, 63,154,153,121, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51, 51,115, 63, 0, 0, 0, 63,154,153,121, 63,244, 1, 0, 63,
+138,150,118, 63,101,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+138,150,118, 63,101,116, 11, 63,138, 29,125, 63,150,111, 11, 63,227, 30,122, 63,233,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,205,204,108, 63,244, 1, 0, 63, 51, 51,115, 63, 0, 0, 0, 63,
+213,207,111, 63,100,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+213,207,111, 63,100,116, 11, 63,213, 72,105, 63,149,111, 11, 63,205,204,108, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,102,102, 63, 0, 0, 0, 63,205,204,108, 63,244, 1, 0, 63,
+213, 72,105, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+213, 72,105, 63,149,111, 11, 63,213,207,111, 63,100,116, 11, 63,116, 71,108, 63,232,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 58, 51,115, 63, 73, 58,217, 62,192,112,108, 63, 4,196,217, 62,
+139,174,111, 63,223,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+139,174,111, 63,223,230,198, 62,239,183,118, 63,227,230,198, 62, 58, 51,115, 63, 73, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,245,121, 63, 6,196,217, 62, 58, 51,115, 63, 73, 58,217, 62,
+239,183,118, 63,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+239,183,118, 63,227,230,198, 62,139,174,111, 63,223,230,198, 62, 65, 51,115, 63,160,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 58, 51,115, 63, 73, 58,217, 62,179,245,121, 63, 6,196,217, 62,
+185,135,118, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+185,135,118, 63, 30,211,236, 62,180,222,111, 63, 30,211,236, 62, 58, 51,115, 63, 73, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192,112,108, 63, 4,196,217, 62, 58, 51,115, 63, 73, 58,217, 62,
+180,222,111, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+180,222,111, 63, 30,211,236, 62,185,135,118, 63, 30,211,236, 62, 51, 51,115, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,205,204,108, 63,244, 1, 0, 63,101,102,102, 63, 0, 0, 0, 63,
+170, 97,105, 63, 65,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+170, 97,105, 63, 65,207,236, 62,180,222,111, 63, 30,211,236, 62,205,204,108, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51, 51,115, 63, 0, 0, 0, 63,205,204,108, 63,244, 1, 0, 63,
+180,222,111, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+180,222,111, 63, 30,211,236, 62,170, 97,105, 63, 65,207,236, 62,192,112,108, 63, 4,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,153,121, 63,244, 1, 0, 63, 51, 51,115, 63, 0, 0, 0, 63,
+185,135,118, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+185,135,118, 63, 30,211,236, 62,194, 4,125, 63, 67,207,236, 62,154,153,121, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 63,154,153,121, 63,244, 1, 0, 63,
+194, 4,125, 63, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+194, 4,125, 63, 67,207,236, 62,185,135,118, 63, 30,211,236, 62,179,245,121, 63, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 76, 73,102, 63, 38, 48, 21, 63, 11, 92, 96, 63,253, 29, 19, 63,
+ 33,107, 99, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 33,107, 99, 63, 94,152, 9, 63,213, 72,105, 63,149,111, 11, 63, 76, 73,102, 63, 38, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,116, 71,108, 63,232,209, 22, 63, 76, 73,102, 63, 38, 48, 21, 63,
+213, 72,105, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+213, 72,105, 63,149,111, 11, 63, 33,107, 99, 63, 94,152, 9, 63,101,102,102, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 76, 73,102, 63, 38, 48, 21, 63,116, 71,108, 63,232,209, 22, 63,
+124, 87,105, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+124, 87,105, 63,180, 23, 33, 63, 65, 9, 99, 63,109, 60, 31, 63, 76, 73,102, 63, 38, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 11, 92, 96, 63,253, 29, 19, 63, 76, 73,102, 63, 38, 48, 21, 63,
+ 65, 9, 99, 63,109, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65, 9, 99, 63,109, 60, 31, 63,124, 87,105, 63,180, 23, 33, 63, 87, 17,102, 63,229, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,205,182, 95, 63,222,228, 40, 63,139,153, 89, 63, 45,200, 37, 63,
+ 63, 30, 93, 63,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 63, 30, 93, 63,143,140, 28, 63, 65, 9, 99, 63,109, 60, 31, 63,205,182, 95, 63,222,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87, 17,102, 63,229, 52, 43, 63,205,182, 95, 63,222,228, 40, 63,
+ 65, 9, 99, 63,109, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65, 9, 99, 63,109, 60, 31, 63, 63, 30, 93, 63,143,140, 28, 63, 11, 92, 96, 63,253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,118,148,108, 63,211,160, 44, 63, 87, 17,102, 63,229, 52, 43, 63,
+124, 87,105, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+124, 87,105, 63,180, 23, 33, 63, 31,136,111, 63,225, 17, 34, 63,118,148,108, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 36, 51,115, 63, 36, 28, 45, 63,118,148,108, 63,211,160, 44, 63,
+ 31,136,111, 63,225, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 31,136,111, 63,225, 17, 34, 63,124, 87,105, 63,180, 23, 33, 63,116, 71,108, 63,232,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 65, 77, 62, 32, 48, 21, 63,152, 72, 53, 62,229,209, 22, 63,
+ 47, 67, 65, 62,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 47, 67, 65, 62,147,111, 11, 63,255,185, 88, 62, 90,152, 9, 63, 65, 65, 77, 62, 32, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 64,246,100, 62,246, 29, 19, 63, 65, 65, 77, 62, 32, 48, 21, 63,
+255,185, 88, 62, 90,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+255,185, 88, 62, 90,152, 9, 63, 47, 67, 65, 62,147,111, 11, 63,254,204, 76, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 65, 77, 62, 32, 48, 21, 63, 64,246,100, 62,246, 29, 19, 63,
+ 89, 65, 90, 62, 94, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 89, 65, 90, 62, 94, 60, 31, 63,107, 8, 65, 62,170, 23, 33, 63, 65, 65, 77, 62, 32, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,152, 72, 53, 62,229,209, 22, 63, 65, 65, 77, 62, 32, 48, 21, 63,
+107, 8, 65, 62,170, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+107, 8, 65, 62,170, 23, 33, 63, 89, 65, 90, 62, 94, 60, 31, 63,230, 32, 78, 62,211, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,105, 20, 52, 62,198,160, 44, 63,173,153, 25, 62, 27, 28, 45, 63,
+216, 69, 40, 62,220, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+216, 69, 40, 62,220, 17, 34, 63,107, 8, 65, 62,170, 23, 33, 63,105, 20, 52, 62,198,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,230, 32, 78, 62,211, 52, 43, 63,105, 20, 52, 62,198,160, 44, 63,
+107, 8, 65, 62,170, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+107, 8, 65, 62,170, 23, 33, 63,216, 69, 40, 62,220, 17, 34, 63,152, 72, 53, 62,229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,139,103, 62,199,228, 40, 63,230, 32, 78, 62,211, 52, 43, 63,
+ 89, 65, 90, 62, 94, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 89, 65, 90, 62, 94, 60, 31, 63, 83,237,113, 62,130,140, 28, 63, 14,139,103, 62,199,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 23,200, 37, 63, 14,139,103, 62,199,228, 40, 63,
+ 83,237,113, 62,130,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 83,237,113, 62,130,140, 28, 63, 89, 65, 90, 62, 94, 60, 31, 63, 64,246,100, 62,246, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180,153, 25, 62,185, 32, 23, 63,152, 72, 53, 62,229,209, 22, 63,
+216, 69, 40, 62,220, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+216, 69, 40, 62,220, 17, 34, 63,133,237, 10, 62,219, 17, 34, 63,180,153, 25, 62,185, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147,213,251, 61,228,209, 22, 63,180,153, 25, 62,185, 32, 23, 63,
+133,237, 10, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+133,237, 10, 62,219, 17, 34, 63,216, 69, 40, 62,220, 17, 34, 63,173,153, 25, 62, 27, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180,153, 25, 62,185, 32, 23, 63,147,213,251, 61,228,209, 22, 63,
+ 67, 12, 12, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 67, 12, 12, 62, 98,116, 11, 63, 34, 39, 39, 62, 98,116, 11, 63,180,153, 25, 62,185, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,152, 72, 53, 62,229,209, 22, 63,180,153, 25, 62,185, 32, 23, 63,
+ 34, 39, 39, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 34, 39, 39, 62, 98,116, 11, 63, 67, 12, 12, 62, 98,116, 11, 63,181,153, 25, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 92, 51, 51, 62,244, 1, 0, 63,254,204, 76, 62, 0, 0, 0, 63,
+ 47, 67, 65, 62,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 47, 67, 65, 62,147,111, 11, 63, 34, 39, 39, 62, 98,116, 11, 63, 92, 51, 51, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,181,153, 25, 62, 0, 0, 0, 63, 92, 51, 51, 62,244, 1, 0, 63,
+ 34, 39, 39, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 34, 39, 39, 62, 98,116, 11, 63, 47, 67, 65, 62,147,111, 11, 63,152, 72, 53, 62,229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 62,244, 1, 0, 63,181,153, 25, 62, 0, 0, 0, 63,
+ 67, 12, 12, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 67, 12, 12, 62, 98,116, 11, 63,109,224,227, 61,147,111, 11, 63, 8, 0, 0, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,204,204, 61, 0, 0, 0, 63, 8, 0, 0, 62,244, 1, 0, 63,
+109,224,227, 61,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+109,224,227, 61,147,111, 11, 63, 67, 12, 12, 62, 98,116, 11, 63,147,213,251, 61,228,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,196,153, 25, 62, 73, 58,217, 62,171, 31,253, 61, 6,196,217, 62,
+ 1,135, 11, 62,228,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 1,135, 11, 62,228,230,198, 62,153,172, 39, 62,230,230,198, 62,196,153, 25, 62, 73, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,163, 52, 62, 7,196,217, 62,196,153, 25, 62, 73, 58,217, 62,
+153,172, 39, 62,230,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+153,172, 39, 62,230,230,198, 62, 1,135, 11, 62,228,230,198, 62,214,153, 25, 62,165,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,196,153, 25, 62, 73, 58,217, 62,179,163, 52, 62, 7,196,217, 62,
+202,235, 38, 62, 33,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+202,235, 38, 62, 33,211,236, 62,173, 71, 12, 62, 31,211,236, 62,196,153, 25, 62, 73, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,171, 31,253, 61, 6,196,217, 62,196,153, 25, 62, 73, 58,217, 62,
+173, 71, 12, 62, 31,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+173, 71, 12, 62, 31,211,236, 62,202,235, 38, 62, 33,211,236, 62,181,153, 25, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 8, 0, 0, 62,244, 1, 0, 63,215,204,204, 61, 0, 0, 0, 63,
+251,166,228, 61, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+251,166,228, 61, 67,207,236, 62,173, 71, 12, 62, 31,211,236, 62, 8, 0, 0, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,181,153, 25, 62, 0, 0, 0, 63, 8, 0, 0, 62,244, 1, 0, 63,
+173, 71, 12, 62, 31,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+173, 71, 12, 62, 31,211,236, 62,251,166,228, 61, 67,207,236, 62,171, 31,253, 61, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 92, 51, 51, 62,244, 1, 0, 63,181,153, 25, 62, 0, 0, 0, 63,
+202,235, 38, 62, 33,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+202,235, 38, 62, 33,211,236, 62,251,223, 64, 62, 67,207,236, 62, 92, 51, 51, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,254,204, 76, 62, 0, 0, 0, 63, 92, 51, 51, 62,244, 1, 0, 63,
+251,223, 64, 62, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+251,223, 64, 62, 67,207,236, 62,202,235, 38, 62, 33,211,236, 62,179,163, 52, 62, 7,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42,228,203, 61, 37, 48, 21, 63, 1,122,156, 61,254, 29, 19, 63,
+172,242,180, 61, 96,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+172,242,180, 61, 96,152, 9, 63,109,224,227, 61,147,111, 11, 63, 42,228,203, 61, 37, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147,213,251, 61,228,209, 22, 63, 42,228,203, 61, 37, 48, 21, 63,
+109,224,227, 61,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+109,224,227, 61,147,111, 11, 63,172,242,180, 61, 96,152, 9, 63,215,204,204, 61, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42,228,203, 61, 37, 48, 21, 63,147,213,251, 61,228,209, 22, 63,
+208, 85,228, 61,179, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+208, 85,228, 61,179, 23, 33, 63,212,227,177, 61,110, 60, 31, 63, 42,228,203, 61, 37, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,122,156, 61,254, 29, 19, 63, 42,228,203, 61, 37, 48, 21, 63,
+212,227,177, 61,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+212,227,177, 61,110, 60, 31, 63,208, 85,228, 61,179, 23, 33, 63,175, 36,202, 61,228, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 53, 80,151, 61,223,228, 40, 63,246,203, 76, 61, 48,200, 37, 63,
+166,139,130, 61,145,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+166,139,130, 61,145,140, 28, 63,212,227,177, 61,110, 60, 31, 63, 53, 80,151, 61,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,175, 36,202, 61,228, 52, 43, 63, 53, 80,151, 61,223,228, 40, 63,
+212,227,177, 61,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+212,227,177, 61,110, 60, 31, 63,166,139,130, 61,145,140, 28, 63, 1,122,156, 61,254, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,201, 61,254, 61,207,160, 44, 63,175, 36,202, 61,228, 52, 43, 63,
+208, 85,228, 61,179, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+208, 85,228, 61,179, 23, 33, 63,133,237, 10, 62,219, 17, 34, 63,201, 61,254, 61,207,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173,153, 25, 62, 27, 28, 45, 63,201, 61,254, 61,207,160, 44, 63,
+133,237, 10, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+133,237, 10, 62,219, 17, 34, 63,208, 85,228, 61,179, 23, 33, 63,147,213,251, 61,228,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,245, 6,205, 62, 37, 48, 21, 63,155, 10,193, 62,229,209, 22, 63,
+229, 7,199, 62,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+229, 7,199, 62,147,111, 11, 63, 85,195,210, 62, 96,152, 9, 63,245, 6,205, 62, 37, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,128,225,216, 62,254, 29, 19, 63,245, 6,205, 62, 37, 48, 21, 63,
+ 85,195,210, 62, 96,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 85,195,210, 62, 96,152, 9, 63,229, 7,199, 62,147,111, 11, 63,202,204,204, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,245, 6,205, 62, 37, 48, 21, 63,128,225,216, 62,254, 29, 19, 63,
+ 11,135,211, 62,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 11,135,211, 62,110, 60, 31, 63,140,234,198, 62,179, 23, 33, 63,245, 6,205, 62, 37, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,155, 10,193, 62,229,209, 22, 63,245, 6,205, 62, 37, 48, 21, 63,
+140,234,198, 62,179, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+140,234,198, 62,179, 23, 33, 63, 11,135,211, 62,110, 60, 31, 63,212,118,205, 62,228, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,142,112,192, 62,207,160, 44, 63, 42, 51,179, 62, 28, 28, 45, 63,
+ 61,137,186, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 61,137,186, 62,219, 17, 34, 63,140,234,198, 62,179, 23, 33, 63,142,112,192, 62,207,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,118,205, 62,228, 52, 43, 63,142,112,192, 62,207,160, 44, 63,
+140,234,198, 62,179, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+140,234,198, 62,179, 23, 33, 63, 61,137,186, 62,219, 17, 34, 63,155, 10,193, 62,229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,243, 43,218, 62,223,228, 40, 63,212,118,205, 62,228, 52, 43, 63,
+ 11,135,211, 62,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 11,135,211, 62,110, 60, 31, 63, 22, 93,223, 62,145,140, 28, 63,243, 43,218, 62,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129,102,230, 62, 48,200, 37, 63,243, 43,218, 62,223,228, 40, 63,
+ 22, 93,223, 62,145,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 22, 93,223, 62,145,140, 28, 63, 11,135,211, 62,110, 60, 31, 63,128,225,216, 62,254, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 51,179, 62,185, 32, 23, 63,155, 10,193, 62,229,209, 22, 63,
+ 61,137,186, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 61,137,186, 62,219, 17, 34, 63, 20,221,171, 62,219, 17, 34, 63, 38, 51,179, 62,185, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180, 91,165, 62,229,209, 22, 63, 38, 51,179, 62,185, 32, 23, 63,
+ 20,221,171, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 20,221,171, 62,219, 17, 34, 63, 61,137,186, 62,219, 17, 34, 63, 42, 51,179, 62, 28, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 51,179, 62,185, 32, 23, 63,180, 91,165, 62,229,209, 22, 63,
+111,108,172, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+111,108,172, 62, 98,116, 11, 63,222,249,185, 62, 98,116, 11, 63, 38, 51,179, 62,185, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,155, 10,193, 62,229,209, 22, 63, 38, 51,179, 62,185, 32, 23, 63,
+222,249,185, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+222,249,185, 62, 98,116, 11, 63,111,108,172, 62, 98,116, 11, 63, 38, 51,179, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,252,255,191, 62,244, 1, 0, 63,202,204,204, 62, 0, 0, 0, 63,
+229, 7,199, 62,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+229, 7,199, 62,147,111, 11, 63,222,249,185, 62, 98,116, 11, 63,252,255,191, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 51,179, 62, 0, 0, 0, 63,252,255,191, 62,244, 1, 0, 63,
+222,249,185, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+222,249,185, 62, 98,116, 11, 63,229, 7,199, 62,147,111, 11, 63,155, 10,193, 62,229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 82,102,166, 62,244, 1, 0, 63, 38, 51,179, 62, 0, 0, 0, 63,
+111,108,172, 62, 98,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+111,108,172, 62, 98,116, 11, 63,104, 94,159, 62,147,111, 11, 63, 82,102,166, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129,153,153, 62, 0, 0, 0, 63, 82,102,166, 62,244, 1, 0, 63,
+104, 94,159, 62,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+104, 94,159, 62,147,111, 11, 63,111,108,172, 62, 98,116, 11, 63,180, 91,165, 62,229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 30, 51,179, 62, 73, 58,217, 62, 39,174,165, 62, 7,196,217, 62,
+180, 41,172, 62,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+180, 41,172, 62,227,230,198, 62,127, 60,186, 62,225,230,198, 62, 30, 51,179, 62, 73, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,184,192, 62, 6,196,217, 62, 30, 51,179, 62, 73, 58,217, 62,
+127, 60,186, 62,225,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+127, 60,186, 62,225,230,198, 62,180, 41,172, 62,227,230,198, 62, 21, 51,179, 62,165,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 30, 51,179, 62, 73, 58,217, 62, 21,184,192, 62, 6,196,217, 62,
+ 42,220,185, 62, 31,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 42,220,185, 62, 31,211,236, 62, 27,138,172, 62, 33,211,236, 62, 30, 51,179, 62, 73, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 39,174,165, 62, 7,196,217, 62, 30, 51,179, 62, 73, 58,217, 62,
+ 27,138,172, 62, 33,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 27,138,172, 62, 33,211,236, 62, 42,220,185, 62, 31,211,236, 62, 38, 51,179, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 82,102,166, 62,244, 1, 0, 63,129,153,153, 62, 0, 0, 0, 63,
+ 3,144,159, 62, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 3,144,159, 62, 67,207,236, 62, 27,138,172, 62, 33,211,236, 62, 82,102,166, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 51,179, 62, 0, 0, 0, 63, 82,102,166, 62,244, 1, 0, 63,
+ 27,138,172, 62, 33,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 27,138,172, 62, 33,211,236, 62, 3,144,159, 62, 67,207,236, 62, 39,174,165, 62, 7,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,252,255,191, 62,244, 1, 0, 63, 38, 51,179, 62, 0, 0, 0, 63,
+ 42,220,185, 62, 31,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 42,220,185, 62, 31,211,236, 62, 65,214,198, 62, 67,207,236, 62,252,255,191, 62,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,202,204,204, 62, 0, 0, 0, 63,252,255,191, 62,244, 1, 0, 63,
+ 65,214,198, 62, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65,214,198, 62, 67,207,236, 62, 42,220,185, 62, 31,211,236, 62, 21,184,192, 62, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 95, 95,153, 62, 32, 48, 21, 63,224,132,141, 62,246, 29, 19, 63,
+ 1,163,147, 62, 91,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 1,163,147, 62, 91,152, 9, 63,104, 94,159, 62,147,111, 11, 63, 95, 95,153, 62, 32, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180, 91,165, 62,229,209, 22, 63, 95, 95,153, 62, 32, 48, 21, 63,
+104, 94,159, 62,147,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+104, 94,159, 62,147,111, 11, 63, 1,163,147, 62, 91,152, 9, 63,129,153,153, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 95, 95,153, 62, 32, 48, 21, 63,180, 91,165, 62,229,209, 22, 63,
+203,123,159, 62,170, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+203,123,159, 62,170, 23, 33, 63, 84,223,146, 62, 94, 60, 31, 63, 95, 95,153, 62, 32, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,224,132,141, 62,246, 29, 19, 63, 95, 95,153, 62, 32, 48, 21, 63,
+ 84,223,146, 62, 94, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 84,223,146, 62, 94, 60, 31, 63,203,123,159, 62,170, 23, 33, 63,141,239,152, 62,211, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,121, 58,140, 62,199,228, 40, 63, 0, 0,128, 62, 23,200, 37, 63,
+ 86, 9,135, 62,130,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 86, 9,135, 62,130,140, 28, 63, 84,223,146, 62, 94, 60, 31, 63,121, 58,140, 62,199,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,141,239,152, 62,211, 52, 43, 63,121, 58,140, 62,199,228, 40, 63,
+ 84,223,146, 62, 94, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 84,223,146, 62, 94, 60, 31, 63, 86, 9,135, 62,130,140, 28, 63,224,132,141, 62,246, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204,245,165, 62,198,160, 44, 63,141,239,152, 62,211, 52, 43, 63,
+203,123,159, 62,170, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+203,123,159, 62,170, 23, 33, 63, 20,221,171, 62,219, 17, 34, 63,204,245,165, 62,198,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 42, 51,179, 62, 28, 28, 45, 63,204,245,165, 62,198,160, 44, 63,
+ 20,221,171, 62,219, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 20,221,171, 62,219, 17, 34, 63,203,123,159, 62,170, 23, 33, 63,180, 91,165, 62,229,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180,182, 25, 63, 38, 48, 21, 63,140,184, 19, 63,232,209, 22, 63,
+ 43,183, 22, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 43,183, 22, 63,149,111, 11, 63,223,148, 28, 63, 94,152, 9, 63,180,182, 25, 63, 38, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,245,163, 31, 63,253, 29, 19, 63,180,182, 25, 63, 38, 48, 21, 63,
+223,148, 28, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+223,148, 28, 63, 94,152, 9, 63, 43,183, 22, 63,149,111, 11, 63,155,153, 25, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180,182, 25, 63, 38, 48, 21, 63,245,163, 31, 63,253, 29, 19, 63,
+191,246, 28, 63,109, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,246, 28, 63,109, 60, 31, 63,132,168, 22, 63,180, 23, 33, 63,180,182, 25, 63, 38, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,140,184, 19, 63,232,209, 22, 63,180,182, 25, 63, 38, 48, 21, 63,
+132,168, 22, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+132,168, 22, 63,180, 23, 33, 63,191,246, 28, 63,109, 60, 31, 63,169,238, 25, 63,229, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,107, 19, 63,211,160, 44, 63,220,204, 12, 63, 35, 28, 45, 63,
+225,119, 16, 63,225, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+225,119, 16, 63,225, 17, 34, 63,132,168, 22, 63,180, 23, 33, 63,138,107, 19, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169,238, 25, 63,229, 52, 43, 63,138,107, 19, 63,211,160, 44, 63,
+132,168, 22, 63,180, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+132,168, 22, 63,180, 23, 33, 63,225,119, 16, 63,225, 17, 34, 63,140,184, 19, 63,232,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51, 73, 32, 63,221,228, 40, 63,169,238, 25, 63,229, 52, 43, 63,
+191,246, 28, 63,109, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,246, 28, 63,109, 60, 31, 63,192,225, 34, 63,142,140, 28, 63, 51, 73, 32, 63,221,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,117,102, 38, 63, 45,200, 37, 63, 51, 73, 32, 63,221,228, 40, 63,
+192,225, 34, 63,142,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+192,225, 34, 63,142,140, 28, 63,191,246, 28, 63,109, 60, 31, 63,245,163, 31, 63,253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,204, 12, 63,188, 32, 23, 63,140,184, 19, 63,232,209, 22, 63,
+225,119, 16, 63,225, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+225,119, 16, 63,225, 17, 34, 63,207, 33, 9, 63,226, 17, 34, 63,212,204, 12, 63,188, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 29,225, 5, 63,233,209, 22, 63,212,204, 12, 63,188, 32, 23, 63,
+207, 33, 9, 63,226, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+207, 33, 9, 63,226, 17, 34, 63,225,119, 16, 63,225, 17, 34, 63,220,204, 12, 63, 35, 28, 45, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,212,204, 12, 63,188, 32, 23, 63, 29,225, 5, 63,233,209, 22, 63,
+118,105, 9, 63,101,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,105, 9, 63,101,116, 11, 63, 43, 48, 16, 63,100,116, 11, 63,212,204, 12, 63,188, 32, 23, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,140,184, 19, 63,232,209, 22, 63,212,204, 12, 63,188, 32, 23, 63,
+ 43, 48, 16, 63,100,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 43, 48, 16, 63,100,116, 11, 63,118,105, 9, 63,101,116, 11, 63,205,204, 12, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51, 51, 19, 63,244, 1, 0, 63,155,153, 25, 63, 0, 0, 0, 63,
+ 43,183, 22, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 43,183, 22, 63,149,111, 11, 63, 43, 48, 16, 63,100,116, 11, 63, 51, 51, 19, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,205,204, 12, 63, 0, 0, 0, 63, 51, 51, 19, 63,244, 1, 0, 63,
+ 43, 48, 16, 63,100,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 43, 48, 16, 63,100,116, 11, 63, 43,183, 22, 63,149,111, 11, 63,140,184, 19, 63,232,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,102,102, 6, 63,244, 1, 0, 63,205,204, 12, 63, 0, 0, 0, 63,
+118,105, 9, 63,101,116, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,105, 9, 63,101,116, 11, 63,118,226, 2, 63,149,111, 11, 63,102,102, 6, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,102,102, 6, 63,244, 1, 0, 63,
+118,226, 2, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,226, 2, 63,149,111, 11, 63,118,105, 9, 63,101,116, 11, 63, 29,225, 5, 63,233,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,198,204, 12, 63, 72, 58,217, 62, 77, 10, 6, 63, 6,196,217, 62,
+ 17, 72, 9, 63,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 17, 72, 9, 63,227,230,198, 62,117, 81, 16, 63,223,230,198, 62,198,204, 12, 63, 72, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 64,143, 19, 63, 4,196,217, 62,198,204, 12, 63, 72, 58,217, 62,
+117, 81, 16, 63,223,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+117, 81, 16, 63,223,230,198, 62, 17, 72, 9, 63,227,230,198, 62,191,204, 12, 63,160,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,198,204, 12, 63, 72, 58,217, 62, 64,143, 19, 63, 4,196,217, 62,
+ 76, 33, 16, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 76, 33, 16, 63, 30,211,236, 62, 71,120, 9, 63, 30,211,236, 62,198,204, 12, 63, 72, 58,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 77, 10, 6, 63, 6,196,217, 62,198,204, 12, 63, 72, 58,217, 62,
+ 71,120, 9, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 71,120, 9, 63, 30,211,236, 62, 76, 33, 16, 63, 30,211,236, 62,205,204, 12, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,102,102, 6, 63,244, 1, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
+ 62,251, 2, 63, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 62,251, 2, 63, 67,207,236, 62, 71,120, 9, 63, 30,211,236, 62,102,102, 6, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,205,204, 12, 63, 0, 0, 0, 63,102,102, 6, 63,244, 1, 0, 63,
+ 71,120, 9, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 71,120, 9, 63, 30,211,236, 62, 62,251, 2, 63, 67,207,236, 62, 77, 10, 6, 63, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 51, 51, 19, 63,244, 1, 0, 63,205,204, 12, 63, 0, 0, 0, 63,
+ 76, 33, 16, 63, 30,211,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 76, 33, 16, 63, 30,211,236, 62, 86,158, 22, 63, 65,207,236, 62, 51, 51, 19, 63,244, 1, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,155,153, 25, 63, 0, 0, 0, 63, 51, 51, 19, 63,244, 1, 0, 63,
+ 86,158, 22, 63, 65,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 86,158, 22, 63, 65,207,236, 62, 76, 33, 16, 63, 30,211,236, 62, 64,143, 19, 63, 4,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,233,197,255, 62, 39, 48, 21, 63,101,235,243, 62,252, 29, 19, 63,
+132, 9,250, 62, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+132, 9,250, 62, 94,152, 9, 63,118,226, 2, 63,149,111, 11, 63,233,197,255, 62, 39, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 29,225, 5, 63,233,209, 22, 63,233,197,255, 62, 39, 48, 21, 63,
+118,226, 2, 63,149,111, 11, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118,226, 2, 63,149,111, 11, 63,132, 9,250, 62, 94,152, 9, 63, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,233,197,255, 62, 39, 48, 21, 63, 29,225, 5, 63,233,209, 22, 63,
+ 43,241, 2, 63,181, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 43,241, 2, 63,181, 23, 33, 63,225, 69,249, 62,110, 60, 31, 63,233,197,255, 62, 39, 48, 21, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,235,243, 62,252, 29, 19, 63,233,197,255, 62, 39, 48, 21, 63,
+225, 69,249, 62,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+225, 69,249, 62,110, 60, 31, 63, 43,241, 2, 63,181, 23, 33, 63, 30, 86,255, 62,230, 52, 43, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9,161,242, 62,223,228, 40, 63,129,102,230, 62, 48,200, 37, 63,
+222,111,237, 62,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+222,111,237, 62,143,140, 28, 63,225, 69,249, 62,110, 60, 31, 63, 9,161,242, 62,223,228, 40, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 30, 86,255, 62,230, 52, 43, 63, 9,161,242, 62,223,228, 40, 63,
+225, 69,249, 62,110, 60, 31, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+225, 69,249, 62,110, 60, 31, 63,222,111,237, 62,143,140, 28, 63,101,235,243, 62,252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 46, 46, 6, 63,211,160, 44, 63, 30, 86,255, 62,230, 52, 43, 63,
+ 43,241, 2, 63,181, 23, 33, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 43,241, 2, 63,181, 23, 33, 63,207, 33, 9, 63,226, 17, 34, 63, 46, 46, 6, 63,211,160, 44, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,220,204, 12, 63, 35, 28, 45, 63, 46, 46, 6, 63,211,160, 44, 63,
+207, 33, 9, 63,226, 17, 34, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+207, 33, 9, 63,226, 17, 34, 63, 43,241, 2, 63,181, 23, 33, 63, 29,225, 5, 63,233,209, 22, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,238, 85, 63, 72,220,187, 62,218,173, 82, 63, 55, 92,210, 62,
+229,189, 79, 63,173,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+229,189, 79, 63,173,208,189, 62,230,250, 82, 63,117,190,166, 62,138,238, 85, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,149,153, 89, 63,201,199,165, 62,138,238, 85, 63, 72,220,187, 62,
+230,250, 82, 63,117,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+230,250, 82, 63,117,190,166, 62,229,189, 79, 63,173,208,189, 62,198,119, 76, 63, 90,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170,111, 73, 63, 68,135,193, 62,198,119, 76, 63, 90,150,169, 62,
+229,189, 79, 63,173,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+229,189, 79, 63,173,208,189, 62,176,175, 76, 63,192,159,213, 62,170,111, 73, 63, 68,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,112,194, 70, 63, 19,196,217, 62,170,111, 73, 63, 68,135,193, 62,
+176,175, 76, 63,192,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+176,175, 76, 63,192,159,213, 62,229,189, 79, 63,173,208,189, 62,218,173, 82, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 52,175, 79, 63,218, 32,233, 62,193,204, 76, 63, 0, 0, 0, 63,
+128,209, 73, 63, 75,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+128,209, 73, 63, 75,207,236, 62,176,175, 76, 63,192,159,213, 62, 52,175, 79, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,218,173, 82, 63, 55, 92,210, 62, 52,175, 79, 63,218, 32,233, 62,
+176,175, 76, 63,192,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+176,175, 76, 63,192,159,213, 62,128,209, 73, 63, 75,207,236, 62,112,194, 70, 63, 19,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170,111, 73, 63, 68,135,193, 62,112,194, 70, 63, 19,196,217, 62,
+171,132, 67, 63,253,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+171,132, 67, 63,253,230,198, 62, 61, 29, 70, 63,114, 54,174, 62,170,111, 73, 63, 68,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,198,119, 76, 63, 90,150,169, 62,170,111, 73, 63, 68,135,193, 62,
+ 61, 29, 70, 63,114, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 61, 29, 70, 63,114, 54,174, 62,171,132, 67, 63,253,230,198, 62, 0, 0, 64, 63,211,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 52,175, 79, 63,218, 32,233, 62,218,173, 82, 63, 55, 92,210, 62,
+ 56, 54, 86, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 56, 54, 86, 63, 58, 23,233, 62, 41, 51, 83, 63, 24,252,255, 62, 52,175, 79, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,193,204, 76, 63, 0, 0, 0, 63, 52,175, 79, 63,218, 32,233, 62,
+ 41, 51, 83, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 41, 51, 83, 63, 24,252,255, 62, 56, 54, 86, 63, 58, 23,233, 62,147,153, 89, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,252, 92, 63, 58, 23,233, 62,147,153, 89, 63, 0, 0, 0, 63,
+ 56, 54, 86, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 56, 54, 86, 63, 58, 23,233, 62,147,153, 89, 63,143,190,209, 62,239,252, 92, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 78,133, 96, 63, 55, 92,210, 62,239,252, 92, 63, 58, 23,233, 62,
+147,153, 89, 63,143,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+147,153, 89, 63,143,190,209, 62, 56, 54, 86, 63, 58, 23,233, 62,218,173, 82, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,138,238, 85, 63, 72,220,187, 62,149,153, 89, 63,201,199,165, 62,
+159, 68, 93, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+159, 68, 93, 63, 72,220,187, 62,147,153, 89, 63,143,190,209, 62,138,238, 85, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,218,173, 82, 63, 55, 92,210, 62,138,238, 85, 63, 72,220,187, 62,
+147,153, 89, 63,143,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+147,153, 89, 63,143,190,209, 62,159, 68, 93, 63, 72,220,187, 62, 78,133, 96, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,252, 92, 63, 58, 23,233, 62, 78,133, 96, 63, 55, 92,210, 62,
+242,131, 99, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+242,131, 99, 63,218, 32,233, 62,254,255, 95, 63, 24,252,255, 62,239,252, 92, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147,153, 89, 63, 0, 0, 0, 63,239,252, 92, 63, 58, 23,233, 62,
+254,255, 95, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+254,255, 95, 63, 24,252,255, 62,242,131, 99, 63,218, 32,233, 62,101,102,102, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,139,174,111, 63,223,230,198, 62,192,112,108, 63, 4,196,217, 62,
+133,195,105, 63, 37,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+133,195,105, 63, 37,135,193, 62,249, 21,109, 63, 65, 54,174, 62,139,174,111, 63,223,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63,160,111,180, 62,139,174,111, 63,223,230,198, 62,
+249, 21,109, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+249, 21,109, 63, 65, 54,174, 62,133,195,105, 63, 37,135,193, 62,106,187,102, 63, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70,117, 99, 63,155,208,189, 62,106,187,102, 63, 54,150,169, 62,
+133,195,105, 63, 37,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+133,195,105, 63, 37,135,193, 62,123,131,102, 63,181,159,213, 62, 70,117, 99, 63,155,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 78,133, 96, 63, 55, 92,210, 62, 70,117, 99, 63,155,208,189, 62,
+123,131,102, 63,181,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+123,131,102, 63,181,159,213, 62,133,195,105, 63, 37,135,193, 62,192,112,108, 63, 4,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170, 97,105, 63, 65,207,236, 62,101,102,102, 63, 0, 0, 0, 63,
+242,131, 99, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+242,131, 99, 63,218, 32,233, 62,123,131,102, 63,181,159,213, 62,170, 97,105, 63, 65,207,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192,112,108, 63, 4,196,217, 62,170, 97,105, 63, 65,207,236, 62,
+123,131,102, 63,181,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+123,131,102, 63,181,159,213, 62,242,131, 99, 63,218, 32,233, 62, 78,133, 96, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70,117, 99, 63,155,208,189, 62, 78,133, 96, 63, 55, 92,210, 62,
+159, 68, 93, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+159, 68, 93, 63, 72,220,187, 62, 71, 56, 96, 63, 99,190,166, 62, 70,117, 99, 63,155,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,106,187,102, 63, 54,150,169, 62, 70,117, 99, 63,155,208,189, 62,
+ 71, 56, 96, 63, 99,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 71, 56, 96, 63, 99,190,166, 62,159, 68, 93, 63, 72,220,187, 62,149,153, 89, 63,201,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 33,107, 99, 63, 94,152, 9, 63, 11, 92, 96, 63,253, 29, 19, 63,
+ 21,238, 92, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21,238, 92, 63,112,150, 9, 63,254,255, 95, 63, 24,252,255, 62, 33,107, 99, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,102,102, 63, 0, 0, 0, 63, 33,107, 99, 63, 94,152, 9, 63,
+254,255, 95, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+254,255, 95, 63, 24,252,255, 62, 21,238, 92, 63,112,150, 9, 63,147,153, 89, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14, 69, 86, 63,112,150, 9, 63,147,153, 89, 63, 0, 0, 0, 63,
+ 21,238, 92, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21,238, 92, 63,112,150, 9, 63,143,153, 89, 63,219, 98, 19, 63, 14, 69, 86, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 19,215, 82, 63,252, 29, 19, 63, 14, 69, 86, 63,112,150, 9, 63,
+143,153, 89, 63,219, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+143,153, 89, 63,219, 98, 19, 63, 21,238, 92, 63,112,150, 9, 63, 11, 92, 96, 63,253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63, 30, 93, 63,143,140, 28, 63,139,153, 89, 63, 45,200, 37, 63,
+218, 20, 86, 63,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+218, 20, 86, 63,143,140, 28, 63,143,153, 89, 63,219, 98, 19, 63, 63, 30, 93, 63,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 11, 92, 96, 63,253, 29, 19, 63, 63, 30, 93, 63,143,140, 28, 63,
+143,153, 89, 63,219, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+143,153, 89, 63,219, 98, 19, 63,218, 20, 86, 63,143,140, 28, 63, 19,215, 82, 63,252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14, 69, 86, 63,112,150, 9, 63, 19,215, 82, 63,252, 29, 19, 63,
+ 1,200, 79, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 1,200, 79, 63, 94,152, 9, 63, 41, 51, 83, 63, 24,252,255, 62, 14, 69, 86, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147,153, 89, 63, 0, 0, 0, 63, 14, 69, 86, 63,112,150, 9, 63,
+ 41, 51, 83, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 41, 51, 83, 63, 24,252,255, 62, 1,200, 79, 63, 94,152, 9, 63,193,204, 76, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 28, 18, 61, 60,220,187, 62,151, 35,188, 60, 46, 92,210, 62,
+218, 74, 60, 60,150,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+218, 74, 60, 60,150,208,189, 62,195,197,197, 60, 89,190,166, 62,237, 28, 18, 61, 60,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,194,205, 76, 61,186,199,165, 62,237, 28, 18, 61, 60,220,187, 62,
+195,197,197, 60, 89,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 23, 23,131, 63, 89,190,166, 62,150,120,129, 63,150,208,189, 62, 15,171,127, 63, 52,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,241,162,124, 63, 36,135,193, 62, 15,171,127, 63, 52,150,169, 62,
+150,120,129, 63,150,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+150,120,129, 63,150,208,189, 62,244,226,127, 63,179,159,213, 62,241,162,124, 63, 36,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,245,121, 63, 6,196,217, 62,241,162,124, 63, 36,135,193, 62,
+244,226,127, 63,179,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+244,226,127, 63,179,159,213, 62,150,120,129, 63,150,208,189, 62,142,240,130, 63, 46, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 59,113,129, 63,214, 32,233, 62, 0, 0,128, 63, 0, 0, 0, 63,
+194, 4,125, 63, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+194, 4,125, 63, 67,207,236, 62,244,226,127, 63,179,159,213, 62, 59,113,129, 63,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,142,240,130, 63, 46, 92,210, 62, 59,113,129, 63,214, 32,233, 62,
+244,226,127, 63,179,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+244,226,127, 63,179,159,213, 62,194, 4,125, 63, 67,207,236, 62,179,245,121, 63, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,241,162,124, 63, 36,135,193, 62,179,245,121, 63, 6,196,217, 62,
+239,183,118, 63,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+239,183,118, 63,227,230,198, 62,133, 80,121, 63, 65, 54,174, 62,241,162,124, 63, 36,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 15,171,127, 63, 52,150,169, 62,241,162,124, 63, 36,135,193, 62,
+133, 80,121, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+133, 80,121, 63, 65, 54,174, 62,239,183,118, 63,227,230,198, 62, 65, 51,115, 63,160,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,110,157, 56, 60,214, 32,233, 62,151, 35,188, 60, 46, 92,210, 62,
+ 95,151, 22, 61, 55, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 95,151, 22, 61, 55, 23,233, 62,176,204,204, 60, 24,252,255, 62,110,157, 56, 60,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,167, 79, 11, 38, 0, 0, 0, 63,110,157, 56, 60,214, 32,233, 62,
+176,204,204, 60, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+176,204,204, 60, 24,252,255, 62, 95,151, 22, 61, 55, 23,233, 62,215,204, 76, 61, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87,129,129, 61, 57, 23,233, 62,215,204, 76, 61, 0, 0, 0, 63,
+ 95,151, 22, 61, 55, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 95,151, 22, 61, 55, 23,233, 62, 68,205, 76, 61,135,190,209, 62, 87,129,129, 61, 57, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 92,196,157, 61, 49, 92,210, 62, 87,129,129, 61, 57, 23,233, 62,
+ 68,205, 76, 61,135,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 68,205, 76, 61,135,190,209, 62, 95,151, 22, 61, 55, 23,233, 62,151, 35,188, 60, 46, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 28, 18, 61, 60,220,187, 62,194,205, 76, 61,186,199,165, 62,
+ 7,191,131, 61, 62,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 7,191,131, 61, 62,220,187, 62, 68,205, 76, 61,135,190,209, 62,237, 28, 18, 61, 60,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,151, 35,188, 60, 46, 92,210, 62,237, 28, 18, 61, 60,220,187, 62,
+ 68,205, 76, 61,135,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 68,205, 76, 61,135,190,209, 62, 7,191,131, 61, 62,220,187, 62, 92,196,157, 61, 49, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 87,129,129, 61, 57, 23,233, 62, 92,196,157, 61, 49, 92,210, 62,
+ 89,185,181, 61,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 89,185,181, 61,214, 32,233, 62,154,153,153, 61, 25,252,255, 62, 87,129,129, 61, 57, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,204, 76, 61, 0, 0, 0, 63, 87,129,129, 61, 57, 23,233, 62,
+154,153,153, 61, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+154,153,153, 61, 25,252,255, 62, 89,185,181, 61,214, 32,233, 62,215,204,204, 61, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,135, 11, 62,228,230,198, 62,171, 31,253, 61, 6,196,217, 62,
+251,181,231, 61, 38,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+251,181,231, 61, 38,135,193, 62,204, 36, 1, 62, 70, 54,174, 62, 1,135, 11, 62,228,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,165,111,180, 62, 1,135, 11, 62,228,230,198, 62,
+204, 36, 1, 62, 70, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+204, 36, 1, 62, 70, 54,174, 62,251,181,231, 61, 38,135,193, 62, 70,117,207, 61, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 35, 68,181, 61,153,208,189, 62, 70,117,207, 61, 54,150,169, 62,
+251,181,231, 61, 38,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+251,181,231, 61, 38,135,193, 62,164,181,205, 61,180,159,213, 62, 35, 68,181, 61,153,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 92,196,157, 61, 49, 92,210, 62, 35, 68,181, 61,153,208,189, 62,
+164,181,205, 61,180,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+164,181,205, 61,180,159,213, 62,251,181,231, 61, 38,135,193, 62,171, 31,253, 61, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,251,166,228, 61, 67,207,236, 62,215,204,204, 61, 0, 0, 0, 63,
+ 89,185,181, 61,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 89,185,181, 61,214, 32,233, 62,164,181,205, 61,180,159,213, 62,251,166,228, 61, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,171, 31,253, 61, 6,196,217, 62,251,166,228, 61, 67,207,236, 62,
+164,181,205, 61,180,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+164,181,205, 61,180,159,213, 62, 89,185,181, 61,214, 32,233, 62, 92,196,157, 61, 49, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 35, 68,181, 61,153,208,189, 62, 92,196,157, 61, 49, 92,210, 62,
+ 7,191,131, 61, 62,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 7,191,131, 61, 62,220,187, 62, 79, 92,155, 61, 91,190,166, 62, 35, 68,181, 61,153,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70,117,207, 61, 54,150,169, 62, 35, 68,181, 61,153,208,189, 62,
+ 79, 92,155, 61, 91,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 79, 92,155, 61, 91,190,166, 62, 7,191,131, 61, 62,220,187, 62,194,205, 76, 61,186,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,172,242,180, 61, 96,152, 9, 63, 1,122,156, 61,254, 29, 19, 63,
+100, 10,129, 61,113,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+100, 10,129, 61,113,150, 9, 63,154,153,153, 61, 25,252,255, 62,172,242,180, 61, 96,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,204,204, 61, 0, 0, 0, 63,172,242,180, 61, 96,152, 9, 63,
+154,153,153, 61, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+154,153,153, 61, 25,252,255, 62,100, 10,129, 61,113,150, 9, 63,215,204, 76, 61, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,132, 23, 61,113,150, 9, 63,215,204, 76, 61, 0, 0, 0, 63,
+100, 10,129, 61,113,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+100, 10,129, 61,113,150, 9, 63, 91,204, 76, 61,220, 98, 19, 63,109,132, 23, 61,113,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,174, 73,193, 60,253, 29, 19, 63,109,132, 23, 61,113,150, 9, 63,
+ 91,204, 76, 61,220, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 91,204, 76, 61,220, 98, 19, 63,100, 10,129, 61,113,150, 9, 63, 1,122,156, 61,254, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,166,139,130, 61,145,140, 28, 63,246,203, 76, 61, 48,200, 37, 63,
+ 13,129, 20, 61,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 13,129, 20, 61,143,140, 28, 63, 91,204, 76, 61,220, 98, 19, 63,166,139,130, 61,145,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,122,156, 61,254, 29, 19, 63,166,139,130, 61,145,140, 28, 63,
+ 91,204, 76, 61,220, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 91,204, 76, 61,220, 98, 19, 63, 13,129, 20, 61,143,140, 28, 63,174, 73,193, 60,253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,132, 23, 61,113,150, 9, 63,174, 73,193, 60,253, 29, 19, 63,
+114,207, 62, 60, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+114,207, 62, 60, 94,152, 9, 63,176,204,204, 60, 24,252,255, 62,109,132, 23, 61,113,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,204, 76, 61, 0, 0, 0, 63,109,132, 23, 61,113,150, 9, 63,
+176,204,204, 60, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+176,204,204, 60, 24,252,255, 62,114,207, 62, 60, 94,152, 9, 63,167, 79, 11, 38, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 83,113, 62, 79,220,187, 62, 63, 81,100, 62, 60, 92,210, 62,
+110,145, 88, 62,167,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+110,145, 88, 62,167,208,189, 62, 91,133,101, 62,112,190,166, 62,237, 83,113, 62, 79,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,206,199,165, 62,237, 83,113, 62, 79,220,187, 62,
+ 91,133,101, 62,112,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 91,133,101, 62,112,190,166, 62,110,145, 88, 62,167,208,189, 62,239,120, 75, 62, 70,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,144, 88, 63, 62, 46,135,193, 62,239,120, 75, 62, 70,150,169, 62,
+110,145, 88, 62,167,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+110,145, 88, 62,167,208,189, 62,170, 88, 76, 62,187,159,213, 62,144, 88, 63, 62, 46,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,163, 52, 62, 7,196,217, 62,144, 88, 63, 62, 46,135,193, 62,
+170, 88, 76, 62,187,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+170, 88, 76, 62,187,159,213, 62,110,145, 88, 62,167,208,189, 62, 63, 81,100, 62, 60, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,190, 86, 88, 62,221, 32,233, 62,254,204, 76, 62, 0, 0, 0, 63,
+251,223, 64, 62, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+251,223, 64, 62, 67,207,236, 62,170, 88, 76, 62,187,159,213, 62,190, 86, 88, 62,221, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63, 81,100, 62, 60, 92,210, 62,190, 86, 88, 62,221, 32,233, 62,
+170, 88, 76, 62,187,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+170, 88, 76, 62,187,159,213, 62,251,223, 64, 62, 67,207,236, 62,179,163, 52, 62, 7,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,144, 88, 63, 62, 46,135,193, 62,179,163, 52, 62, 7,196,217, 62,
+153,172, 39, 62,230,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+153,172, 39, 62,230,230,198, 62,213, 14, 50, 62, 78, 54,174, 62,144, 88, 63, 62, 46,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,120, 75, 62, 70,150,169, 62,144, 88, 63, 62, 46,135,193, 62,
+213, 14, 50, 62, 78, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+213, 14, 50, 62, 78, 54,174, 62,153,172, 39, 62,230,230,198, 62,214,153, 25, 62,165,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,190, 86, 88, 62,221, 32,233, 62, 63, 81,100, 62, 60, 92,210, 62,
+166,114,114, 62, 63, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+166,114,114, 62, 63, 23,233, 62,126,102,102, 62, 25,252,255, 62,190, 86, 88, 62,221, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,254,204, 76, 62, 0, 0, 0, 63,190, 86, 88, 62,221, 32,233, 62,
+126,102,102, 62, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+126,102,102, 62, 25,252,255, 62,166,114,114, 62, 63, 23,233, 62, 0, 0,128, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173,198,134, 62, 63, 23,233, 62, 0, 0,128, 62, 0, 0, 0, 63,
+166,114,114, 62, 63, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+166,114,114, 62, 63, 23,233, 62, 0, 0,128, 62,149,190,209, 62,173,198,134, 62, 63, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 97,215,141, 62, 60, 92,210, 62,173,198,134, 62, 63, 23,233, 62,
+ 0, 0,128, 62,149,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62,149,190,209, 62,166,114,114, 62, 63, 23,233, 62, 63, 81,100, 62, 60, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 83,113, 62, 79,220,187, 62, 0, 0,128, 62,206,199,165, 62,
+ 9, 86,135, 62, 79,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 9, 86,135, 62, 79,220,187, 62, 0, 0,128, 62,149,190,209, 62,237, 83,113, 62, 79,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63, 81,100, 62, 60, 92,210, 62,237, 83,113, 62, 79,220,187, 62,
+ 0, 0,128, 62,149,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62,149,190,209, 62, 9, 86,135, 62, 79,220,187, 62, 97,215,141, 62, 60, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,173,198,134, 62, 63, 23,233, 62, 97,215,141, 62, 60, 92,210, 62,
+161,212,147, 62,221, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+161,212,147, 62,221, 32,233, 62,193,204,140, 62, 25,252,255, 62,173,198,134, 62, 63, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 63,173,198,134, 62, 63, 23,233, 62,
+193,204,140, 62, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+193,204,140, 62, 25,252,255, 62,161,212,147, 62,221, 32,233, 62,129,153,153, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,180, 41,172, 62,227,230,198, 62, 39,174,165, 62, 7,196,217, 62,
+184, 83,160, 62, 46,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+184, 83,160, 62, 46,135,193, 62,150,248,166, 62, 78, 54,174, 62,180, 41,172, 62,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,165,111,180, 62,180, 41,172, 62,227,230,198, 62,
+150,248,166, 62, 78, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+150,248,166, 62, 78, 54,174, 62,184, 83,160, 62, 46,135,193, 62,137, 67,154, 62, 70,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 73,183,147, 62,167,208,189, 62,137, 67,154, 62, 70,150,169, 62,
+184, 83,160, 62, 46,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+184, 83,160, 62, 46,135,193, 62,171,211,153, 62,187,159,213, 62, 73,183,147, 62,167,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 97,215,141, 62, 60, 92,210, 62, 73,183,147, 62,167,208,189, 62,
+171,211,153, 62,187,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+171,211,153, 62,187,159,213, 62,184, 83,160, 62, 46,135,193, 62, 39,174,165, 62, 7,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 3,144,159, 62, 67,207,236, 62,129,153,153, 62, 0, 0, 0, 63,
+161,212,147, 62,221, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+161,212,147, 62,221, 32,233, 62,171,211,153, 62,187,159,213, 62, 3,144,159, 62, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 39,174,165, 62, 7,196,217, 62, 3,144,159, 62, 67,207,236, 62,
+171,211,153, 62,187,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+171,211,153, 62,187,159,213, 62,161,212,147, 62,221, 32,233, 62, 97,215,141, 62, 60, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 73,183,147, 62,167,208,189, 62, 97,215,141, 62, 60, 92,210, 62,
+ 9, 86,135, 62, 79,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 9, 86,135, 62, 79,220,187, 62, 82, 61,141, 62,112,190,166, 62, 73,183,147, 62,167,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,137, 67,154, 62, 70,150,169, 62, 73,183,147, 62,167,208,189, 62,
+ 82, 61,141, 62,112,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 82, 61,141, 62,112,190,166, 62, 9, 86,135, 62, 79,220,187, 62, 0, 0,128, 62,206,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,163,147, 62, 91,152, 9, 63,224,132,141, 62,246, 29, 19, 63,
+251,168,134, 62,107,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+251,168,134, 62,107,150, 9, 63,193,204,140, 62, 25,252,255, 62, 1,163,147, 62, 91,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129,153,153, 62, 0, 0, 0, 63, 1,163,147, 62, 91,152, 9, 63,
+193,204,140, 62, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+193,204,140, 62, 25,252,255, 62,251,168,134, 62,107,150, 9, 63, 0, 0,128, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 11,174,114, 62,107,150, 9, 63, 0, 0,128, 62, 0, 0, 0, 63,
+251,168,134, 62,107,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+251,168,134, 62,107,150, 9, 63, 0, 0,128, 62,209, 98, 19, 63, 11,174,114, 62,107,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 64,246,100, 62,246, 29, 19, 63, 11,174,114, 62,107,150, 9, 63,
+ 0, 0,128, 62,209, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62,209, 98, 19, 63,251,168,134, 62,107,150, 9, 63,224,132,141, 62,246, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 86, 9,135, 62,130,140, 28, 63, 0, 0,128, 62, 23,200, 37, 63,
+ 83,237,113, 62,130,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 83,237,113, 62,130,140, 28, 63, 0, 0,128, 62,209, 98, 19, 63, 86, 9,135, 62,130,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,224,132,141, 62,246, 29, 19, 63, 86, 9,135, 62,130,140, 28, 63,
+ 0, 0,128, 62,209, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0,128, 62,209, 98, 19, 63, 83,237,113, 62,130,140, 28, 63, 64,246,100, 62,246, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 11,174,114, 62,107,150, 9, 63, 64,246,100, 62,246, 29, 19, 63,
+255,185, 88, 62, 90,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+255,185, 88, 62, 90,152, 9, 63,126,102,102, 62, 25,252,255, 62, 11,174,114, 62,107,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 0, 0, 0, 63, 11,174,114, 62,107,150, 9, 63,
+126,102,102, 62, 25,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+126,102,102, 62, 25,252,255, 62,255,185, 88, 62, 90,152, 9, 63,254,204, 76, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63, 16,223, 62, 62,220,187, 62,233,142,216, 62, 49, 92,210, 62,
+248,174,210, 62,153,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+248,174,210, 62,153,208,189, 62,237, 40,217, 62, 91,190,166, 62, 63, 16,223, 62, 62,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 72,102,230, 62,183,199,165, 62, 63, 16,223, 62, 62,220,187, 62,
+237, 40,217, 62, 91,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+237, 40,217, 62, 91,190,166, 62,248,174,210, 62,153,208,189, 62,175, 34,204, 62, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129, 18,198, 62, 37,135,193, 62,175, 34,204, 62, 54,150,169, 62,
+248,174,210, 62,153,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+248,174,210, 62,153,208,189, 62,151,146,204, 62,180,159,213, 62,129, 18,198, 62, 37,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,184,192, 62, 6,196,217, 62,129, 18,198, 62, 37,135,193, 62,
+151,146,204, 62,180,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+151,146,204, 62,180,159,213, 62,248,174,210, 62,153,208,189, 62,233,142,216, 62, 49, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170,145,210, 62,214, 32,233, 62,202,204,204, 62, 0, 0, 0, 63,
+ 65,214,198, 62, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65,214,198, 62, 67,207,236, 62,151,146,204, 62,180,159,213, 62,170,145,210, 62,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,233,142,216, 62, 49, 92,210, 62,170,145,210, 62,214, 32,233, 62,
+151,146,204, 62,180,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+151,146,204, 62,180,159,213, 62, 65,214,198, 62, 67,207,236, 62, 21,184,192, 62, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,129, 18,198, 62, 37,135,193, 62, 21,184,192, 62, 6,196,217, 62,
+127, 60,186, 62,225,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+127, 60,186, 62,225,230,198, 62,154,109,191, 62, 68, 54,174, 62,129, 18,198, 62, 37,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,175, 34,204, 62, 54,150,169, 62,129, 18,198, 62, 37,135,193, 62,
+154,109,191, 62, 68, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+154,109,191, 62, 68, 54,174, 62,127, 60,186, 62,225,230,198, 62, 21, 51,179, 62,165,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,170,145,210, 62,214, 32,233, 62,233,142,216, 62, 49, 92,210, 62,
+171,159,223, 62, 57, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+171,159,223, 62, 57, 23,233, 62,154,153,217, 62, 24,252,255, 62,170,145,210, 62,214, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,202,204,204, 62, 0, 0, 0, 63,170,145,210, 62,214, 32,233, 62,
+154,153,217, 62, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+154,153,217, 62, 24,252,255, 62,171,159,223, 62, 57, 23,233, 62,101,102,230, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 20, 45,237, 62, 55, 23,233, 62,101,102,230, 62, 0, 0, 0, 63,
+171,159,223, 62, 57, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+171,159,223, 62, 57, 23,233, 62, 88,102,230, 62,135,190,209, 62, 20, 45,237, 62, 55, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,199, 61,244, 62, 46, 92,210, 62, 20, 45,237, 62, 55, 23,233, 62,
+ 88,102,230, 62,135,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 88,102,230, 62,135,190,209, 62,171,159,223, 62, 57, 23,233, 62,233,142,216, 62, 49, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63, 16,223, 62, 62,220,187, 62, 72,102,230, 62,183,199,165, 62,
+ 99,188,237, 62, 60,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 99,188,237, 62, 60,220,187, 62, 88,102,230, 62,135,190,209, 62, 63, 16,223, 62, 62,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,233,142,216, 62, 49, 92,210, 62, 63, 16,223, 62, 62,220,187, 62,
+ 88,102,230, 62,135,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 88,102,230, 62,135,190,209, 62, 99,188,237, 62, 60,220,187, 62,199, 61,244, 62, 46, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 20, 45,237, 62, 55, 23,233, 62,199, 61,244, 62, 46, 92,210, 62,
+ 21, 59,250, 62,213, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21, 59,250, 62,213, 32,233, 62, 53, 51,243, 62, 24,252,255, 62, 20, 45,237, 62, 55, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,102,230, 62, 0, 0, 0, 63, 20, 45,237, 62, 55, 23,233, 62,
+ 53, 51,243, 62, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 53, 51,243, 62, 24,252,255, 62, 21, 59,250, 62,213, 32,233, 62, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 17, 72, 9, 63,227,230,198, 62, 77, 10, 6, 63, 6,196,217, 62,
+ 15, 93, 3, 63, 36,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 15, 93, 3, 63, 36,135,193, 62,123,175, 6, 63, 65, 54,174, 62, 17, 72, 9, 63,227,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,160,111,180, 62, 17, 72, 9, 63,227,230,198, 62,
+123,175, 6, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+123,175, 6, 63, 65, 54,174, 62, 15, 93, 3, 63, 36,135,193, 62,241, 84, 0, 63, 52,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169, 29,250, 62,150,208,189, 62,241, 84, 0, 63, 52,150,169, 62,
+ 15, 93, 3, 63, 36,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 15, 93, 3, 63, 36,135,193, 62, 12, 29, 0, 63,179,159,213, 62,169, 29,250, 62,150,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,199, 61,244, 62, 46, 92,210, 62,169, 29,250, 62,150,208,189, 62,
+ 12, 29, 0, 63,179,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 12, 29, 0, 63,179,159,213, 62, 15, 93, 3, 63, 36,135,193, 62, 77, 10, 6, 63, 6,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 62,251, 2, 63, 67,207,236, 62, 0, 0, 0, 63, 0, 0, 0, 63,
+ 21, 59,250, 62,213, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21, 59,250, 62,213, 32,233, 62, 12, 29, 0, 63,179,159,213, 62, 62,251, 2, 63, 67,207,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 77, 10, 6, 63, 6,196,217, 62, 62,251, 2, 63, 67,207,236, 62,
+ 12, 29, 0, 63,179,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 12, 29, 0, 63,179,159,213, 62, 21, 59,250, 62,213, 32,233, 62,199, 61,244, 62, 46, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,169, 29,250, 62,150,208,189, 62,199, 61,244, 62, 46, 92,210, 62,
+ 99,188,237, 62, 60,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 99,188,237, 62, 60,220,187, 62,164,163,243, 62, 89,190,166, 62,169, 29,250, 62,150,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,241, 84, 0, 63, 52,150,169, 62,169, 29,250, 62,150,208,189, 62,
+164,163,243, 62, 89,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+164,163,243, 62, 89,190,166, 62, 99,188,237, 62, 60,220,187, 62, 72,102,230, 62,183,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,132, 9,250, 62, 94,152, 9, 63,101,235,243, 62,252, 29, 19, 63,
+114, 15,237, 62,113,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+114, 15,237, 62,113,150, 9, 63, 53, 51,243, 62, 24,252,255, 62,132, 9,250, 62, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63,132, 9,250, 62, 94,152, 9, 63,
+ 53, 51,243, 62, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 53, 51,243, 62, 24,252,255, 62,114, 15,237, 62,113,150, 9, 63,101,102,230, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,103,189,223, 62,112,150, 9, 63,101,102,230, 62, 0, 0, 0, 63,
+114, 15,237, 62,113,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+114, 15,237, 62,113,150, 9, 63,117,102,230, 62,220, 98, 19, 63,103,189,223, 62,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,128,225,216, 62,254, 29, 19, 63,103,189,223, 62,112,150, 9, 63,
+117,102,230, 62,220, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+117,102,230, 62,220, 98, 19, 63,114, 15,237, 62,113,150, 9, 63,101,235,243, 62,252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,222,111,237, 62,143,140, 28, 63,129,102,230, 62, 48,200, 37, 63,
+ 22, 93,223, 62,145,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 22, 93,223, 62,145,140, 28, 63,117,102,230, 62,220, 98, 19, 63,222,111,237, 62,143,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,235,243, 62,252, 29, 19, 63,222,111,237, 62,143,140, 28, 63,
+117,102,230, 62,220, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+117,102,230, 62,220, 98, 19, 63, 22, 93,223, 62,145,140, 28, 63,128,225,216, 62,254, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,103,189,223, 62,112,150, 9, 63,128,225,216, 62,254, 29, 19, 63,
+ 85,195,210, 62, 96,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 85,195,210, 62, 96,152, 9, 63,154,153,217, 62, 24,252,255, 62,103,189,223, 62,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,101,102,230, 62, 0, 0, 0, 63,103,189,223, 62,112,150, 9, 63,
+154,153,217, 62, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+154,153,217, 62, 24,252,255, 62, 85,195,210, 62, 96,152, 9, 63,202,204,204, 62, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 97,187, 34, 63, 72,220,187, 62,178,122, 31, 63, 55, 92,210, 62,
+186,138, 28, 63,155,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+186,138, 28, 63,155,208,189, 62,185,199, 31, 63, 96,190,166, 62, 97,187, 34, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,107,102, 38, 63,201,199,165, 62, 97,187, 34, 63, 72,220,187, 62,
+185,199, 31, 63, 96,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+185,199, 31, 63, 96,190,166, 62,186,138, 28, 63,155,208,189, 62,150, 68, 25, 63, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,123, 60, 22, 63, 36,135,193, 62,150, 68, 25, 63, 54,150,169, 62,
+186,138, 28, 63,155,208,189, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+186,138, 28, 63,155,208,189, 62,133,124, 25, 63,181,159,213, 62,123, 60, 22, 63, 36,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 64,143, 19, 63, 4,196,217, 62,123, 60, 22, 63, 36,135,193, 62,
+133,124, 25, 63,181,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+133,124, 25, 63,181,159,213, 62,186,138, 28, 63,155,208,189, 62,178,122, 31, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,124, 28, 63,218, 32,233, 62,155,153, 25, 63, 0, 0, 0, 63,
+ 86,158, 22, 63, 65,207,236, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 86,158, 22, 63, 65,207,236, 62,133,124, 25, 63,181,159,213, 62, 14,124, 28, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,178,122, 31, 63, 55, 92,210, 62, 14,124, 28, 63,218, 32,233, 62,
+133,124, 25, 63,181,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+133,124, 25, 63,181,159,213, 62, 86,158, 22, 63, 65,207,236, 62, 64,143, 19, 63, 4,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,123, 60, 22, 63, 36,135,193, 62, 64,143, 19, 63, 4,196,217, 62,
+117, 81, 16, 63,223,230,198, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+117, 81, 16, 63,223,230,198, 62, 7,234, 18, 63, 65, 54,174, 62,123, 60, 22, 63, 36,135,193, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,150, 68, 25, 63, 54,150,169, 62,123, 60, 22, 63, 36,135,193, 62,
+ 7,234, 18, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 7,234, 18, 63, 65, 54,174, 62,117, 81, 16, 63,223,230,198, 62,191,204, 12, 63,160,111,180, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,124, 28, 63,218, 32,233, 62,178,122, 31, 63, 55, 92,210, 62,
+ 17, 3, 35, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 17, 3, 35, 63, 58, 23,233, 62, 2, 0, 32, 63, 24,252,255, 62, 14,124, 28, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,155,153, 25, 63, 0, 0, 0, 63, 14,124, 28, 63,218, 32,233, 62,
+ 2, 0, 32, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 2, 0, 32, 63, 24,252,255, 62, 17, 3, 35, 63, 58, 23,233, 62,109,102, 38, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,200,201, 41, 63, 58, 23,233, 62,109,102, 38, 63, 0, 0, 0, 63,
+ 17, 3, 35, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 17, 3, 35, 63, 58, 23,233, 62,109,102, 38, 63,143,190,209, 62,200,201, 41, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 82, 45, 63, 55, 92,210, 62,200,201, 41, 63, 58, 23,233, 62,
+109,102, 38, 63,143,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+109,102, 38, 63,143,190,209, 62, 17, 3, 35, 63, 58, 23,233, 62,178,122, 31, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 97,187, 34, 63, 72,220,187, 62,107,102, 38, 63,201,199,165, 62,
+118, 17, 42, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118, 17, 42, 63, 72,220,187, 62,109,102, 38, 63,143,190,209, 62, 97,187, 34, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,178,122, 31, 63, 55, 92,210, 62, 97,187, 34, 63, 72,220,187, 62,
+109,102, 38, 63,143,190,209, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+109,102, 38, 63,143,190,209, 62,118, 17, 42, 63, 72,220,187, 62, 38, 82, 45, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,200,201, 41, 63, 58, 23,233, 62, 38, 82, 45, 63, 55, 92,210, 62,
+204, 80, 48, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+204, 80, 48, 63,218, 32,233, 62,215,204, 44, 63, 23,252,255, 62,200,201, 41, 63, 58, 23,233, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,102, 38, 63, 0, 0, 0, 63,200,201, 41, 63, 58, 23,233, 62,
+215,204, 44, 63, 23,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+215,204, 44, 63, 23,252,255, 62,204, 80, 48, 63,218, 32,233, 62, 63, 51, 51, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 85,123, 60, 63,253,230,198, 62,144, 61, 57, 63, 19,196,217, 62,
+ 86,144, 54, 63, 68,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 86,144, 54, 63, 68,135,193, 62,196,226, 57, 63,114, 54,174, 62, 85,123, 60, 63,253,230,198, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,211,111,180, 62, 85,123, 60, 63,253,230,198, 62,
+196,226, 57, 63,114, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+196,226, 57, 63,114, 54,174, 62, 86,144, 54, 63, 68,135,193, 62, 58,136, 51, 63, 90,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 27, 66, 48, 63,173,208,189, 62, 58,136, 51, 63, 90,150,169, 62,
+ 86,144, 54, 63, 68,135,193, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 86,144, 54, 63, 68,135,193, 62, 80, 80, 51, 63,192,159,213, 62, 27, 66, 48, 63,173,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38, 82, 45, 63, 55, 92,210, 62, 27, 66, 48, 63,173,208,189, 62,
+ 80, 80, 51, 63,192,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 80, 80, 51, 63,192,159,213, 62, 86,144, 54, 63, 68,135,193, 62,144, 61, 57, 63, 19,196,217, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,128, 46, 54, 63, 75,207,236, 62, 63, 51, 51, 63, 0, 0, 0, 63,
+204, 80, 48, 63,218, 32,233, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+204, 80, 48, 63,218, 32,233, 62, 80, 80, 51, 63,192,159,213, 62,128, 46, 54, 63, 75,207,236, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,144, 61, 57, 63, 19,196,217, 62,128, 46, 54, 63, 75,207,236, 62,
+ 80, 80, 51, 63,192,159,213, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 80, 80, 51, 63,192,159,213, 62,204, 80, 48, 63,218, 32,233, 62, 38, 82, 45, 63, 55, 92,210, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 27, 66, 48, 63,173,208,189, 62, 38, 82, 45, 63, 55, 92,210, 62,
+118, 17, 42, 63, 72,220,187, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+118, 17, 42, 63, 72,220,187, 62, 26, 5, 45, 63,117,190,166, 62, 27, 66, 48, 63,173,208,189, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 58,136, 51, 63, 90,150,169, 62, 27, 66, 48, 63,173,208,189, 62,
+ 26, 5, 45, 63,117,190,166, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 26, 5, 45, 63,117,190,166, 62,118, 17, 42, 63, 72,220,187, 62,107,102, 38, 63,201,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,255, 55, 48, 63, 94,152, 9, 63,237, 40, 45, 63,252, 29, 19, 63,
+242,186, 41, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+242,186, 41, 63,112,150, 9, 63,215,204, 44, 63, 23,252,255, 62,255, 55, 48, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63, 51, 51, 63, 0, 0, 0, 63,255, 55, 48, 63, 94,152, 9, 63,
+215,204, 44, 63, 23,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+215,204, 44, 63, 23,252,255, 62,242,186, 41, 63,112,150, 9, 63,109,102, 38, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235, 17, 35, 63,112,150, 9, 63,109,102, 38, 63, 0, 0, 0, 63,
+242,186, 41, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+242,186, 41, 63,112,150, 9, 63,113,102, 38, 63,219, 98, 19, 63,235, 17, 35, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,245,163, 31, 63,253, 29, 19, 63,235, 17, 35, 63,112,150, 9, 63,
+113,102, 38, 63,219, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+113,102, 38, 63,219, 98, 19, 63,242,186, 41, 63,112,150, 9, 63,237, 40, 45, 63,252, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 38,235, 41, 63,141,140, 28, 63,117,102, 38, 63, 45,200, 37, 63,
+192,225, 34, 63,142,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+192,225, 34, 63,142,140, 28, 63,113,102, 38, 63,219, 98, 19, 63, 38,235, 41, 63,141,140, 28, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 40, 45, 63,252, 29, 19, 63, 38,235, 41, 63,141,140, 28, 63,
+113,102, 38, 63,219, 98, 19, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+113,102, 38, 63,219, 98, 19, 63,192,225, 34, 63,142,140, 28, 63,245,163, 31, 63,253, 29, 19, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235, 17, 35, 63,112,150, 9, 63,245,163, 31, 63,253, 29, 19, 63,
+223,148, 28, 63, 94,152, 9, 63, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+223,148, 28, 63, 94,152, 9, 63, 2, 0, 32, 63, 24,252,255, 62,235, 17, 35, 63,112,150, 9, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,109,102, 38, 63, 0, 0, 0, 63,235, 17, 35, 63,112,150, 9, 63,
+ 2, 0, 32, 63, 24,252,255, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 2, 0, 32, 63, 24,252,255, 62,223,148, 28, 63, 94,152, 9, 63,155,153, 25, 63, 0, 0, 0, 63, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188,129,107, 63, 66, 45,128, 62,235, 71, 99, 63,222, 76,120, 62,
+ 94, 37,106, 63, 84, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 94, 37,106, 63, 84, 97, 83, 62, 65, 51,115, 63,248,151, 97, 62,188,129,107, 63, 66, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63,151, 83,135, 62,188,129,107, 63, 66, 45,128, 62,
+ 65, 51,115, 63,248,151, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65, 51,115, 63,248,151, 97, 62, 94, 37,106, 63, 84, 97, 83, 62, 65, 51,115, 63, 90,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188,129,107, 63, 66, 45,128, 62, 65, 51,115, 63,151, 83,135, 62,
+142,123,108, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+142,123,108, 63,169,144,151, 62,231, 50,101, 63, 17,201,146, 62,188,129,107, 63, 66, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235, 71, 99, 63,222, 76,120, 62,188,129,107, 63, 66, 45,128, 62,
+231, 50,101, 63, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+231, 50,101, 63, 17,201,146, 62,142,123,108, 63,169,144,151, 62,106,187,102, 63, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 71, 56, 96, 63, 99,190,166, 62,149,153, 89, 63,201,199,165, 62,
+ 22,238, 93, 63,243,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 22,238, 93, 63,243,101,144, 62,231, 50,101, 63, 17,201,146, 62, 71, 56, 96, 63, 99,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,106,187,102, 63, 54,150,169, 62, 71, 56, 96, 63, 99,190,166, 62,
+231, 50,101, 63, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+231, 50,101, 63, 17,201,146, 62, 22,238, 93, 63,243,101,144, 62,235, 71, 99, 63,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,249, 21,109, 63, 65, 54,174, 62,106,187,102, 63, 54,150,169, 62,
+142,123,108, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+142,123,108, 63,169,144,151, 62, 65, 51,115, 63, 93,231,157, 62,249, 21,109, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63,160,111,180, 62,249, 21,109, 63, 65, 54,174, 62,
+ 65, 51,115, 63, 93,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65, 51,115, 63, 93,231,157, 62,142,123,108, 63,169,144,151, 62, 65, 51,115, 63,151, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,149,153, 89, 63, 79,162,115, 62,235, 71, 99, 63,222, 76,120, 62,
+ 22,238, 93, 63,243,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 22,238, 93, 63,243,101,144, 62, 21, 69, 85, 63, 3,102,144, 62,149,153, 89, 63, 79,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68,235, 79, 63, 37, 77,120, 62,149,153, 89, 63, 79,162,115, 62,
+ 21, 69, 85, 63, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21, 69, 85, 63, 3,102,144, 62, 22,238, 93, 63,243,101,144, 62,149,153, 89, 63,201,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,149,153, 89, 63, 79,162,115, 62, 68,235, 79, 63, 37, 77,120, 62,
+ 24,186, 83, 63,245,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 24,186, 83, 63,245,176, 70, 62, 22,121, 95, 63,204,176, 70, 62,149,153, 89, 63, 79,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,235, 71, 99, 63,222, 76,120, 62,149,153, 89, 63, 79,162,115, 62,
+ 22,121, 95, 63,204,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 22,121, 95, 63,204,176, 70, 62, 24,186, 83, 63,245,176, 70, 62,152,153, 89, 63,198, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 61,119,103, 63,179,253, 30, 62, 65, 51,115, 63, 90,111, 52, 62,
+ 94, 37,106, 63, 84, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 94, 37,106, 63, 84, 97, 83, 62, 22,121, 95, 63,204,176, 70, 62, 61,119,103, 63,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,152,153, 89, 63,198, 31, 23, 62, 61,119,103, 63,179,253, 30, 62,
+ 22,121, 95, 63,204,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 22,121, 95, 63,204,176, 70, 62, 94, 37,106, 63, 84, 97, 83, 62,235, 71, 99, 63,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,248,187, 75, 63,241,253, 30, 62,152,153, 89, 63,198, 31, 23, 62,
+ 24,186, 83, 63,245,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 24,186, 83, 63,245,176, 70, 62,214, 13, 73, 63,181, 97, 83, 62,248,187, 75, 63,241,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,202,111, 52, 62,248,187, 75, 63,241,253, 30, 62,
+214, 13, 73, 63,181, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+214, 13, 73, 63,181, 97, 83, 62, 24,186, 83, 63,245,176, 70, 62, 68,235, 79, 63, 37, 77,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,152,153, 89, 63,111, 41,147, 61, 0, 0, 64, 63,195,111,180, 61,
+ 0, 0, 64, 63,111, 65, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,111, 65, 52, 61, 38, 49,117, 63,225, 64, 52, 61,152,153, 89, 63,111, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63, 83,111,180, 61,152,153, 89, 63,111, 41,147, 61,
+ 38, 49,117, 63,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 38, 49,117, 63,225, 64, 52, 61, 0, 0, 64, 63,111, 65, 52, 61,208,222,121, 63,102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,152,153, 89, 63,111, 41,147, 61, 65, 51,115, 63, 83,111,180, 61,
+172, 51, 99, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+172, 51, 99, 63, 48, 46,231, 61,135,255, 79, 63,120, 46,231, 61,152,153, 89, 63,111, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,195,111,180, 61,152,153, 89, 63,111, 41,147, 61,
+135,255, 79, 63,120, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+135,255, 79, 63,120, 46,231, 61,172, 51, 99, 63, 48, 46,231, 61,152,153, 89, 63,198, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,248,187, 75, 63,241,253, 30, 62, 0, 0, 64, 63,202,111, 52, 62,
+ 0, 0, 64, 63, 24, 71, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63, 24, 71, 7, 62,135,255, 79, 63,120, 46,231, 61,248,187, 75, 63,241,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,152,153, 89, 63,198, 31, 23, 62,248,187, 75, 63,241,253, 30, 62,
+135,255, 79, 63,120, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+135,255, 79, 63,120, 46,231, 61, 0, 0, 64, 63, 24, 71, 7, 62, 0, 0, 64, 63,195,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 61,119,103, 63,179,253, 30, 62,152,153, 89, 63,198, 31, 23, 62,
+172, 51, 99, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+172, 51, 99, 63, 48, 46,231, 61, 66, 51,115, 63,199, 70, 7, 62, 61,119,103, 63,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63, 90,111, 52, 62, 61,119,103, 63,179,253, 30, 62,
+ 66, 51,115, 63,199, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 66, 51,115, 63,199, 70, 7, 62,172, 51, 99, 63, 48, 46,231, 61, 65, 51,115, 63, 83,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,122,177, 71, 63,120, 45,128, 62, 0, 0, 64, 63,218, 83,135, 62,
+ 0, 0, 64, 63,115,152, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,115,152, 97, 62,214, 13, 73, 63,181, 97, 83, 62,122,177, 71, 63,120, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68,235, 79, 63, 37, 77,120, 62,122,177, 71, 63,120, 45,128, 62,
+214, 13, 73, 63,181, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+214, 13, 73, 63,181, 97, 83, 62, 0, 0, 64, 63,115,152, 97, 62, 0, 0, 64, 63,202,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,122,177, 71, 63,120, 45,128, 62, 68,235, 79, 63, 37, 77,120, 62,
+ 72, 0, 78, 63, 52,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 72, 0, 78, 63, 52,201,146, 62,169,183, 70, 63,219,144,151, 62,122,177, 71, 63,120, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,218, 83,135, 62,122,177, 71, 63,120, 45,128, 62,
+169,183, 70, 63,219,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+169,183, 70, 63,219,144,151, 62, 72, 0, 78, 63, 52,201,146, 62,198,119, 76, 63, 90,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 61, 29, 70, 63,114, 54,174, 62, 0, 0, 64, 63,211,111,180, 62,
+ 0, 0, 64, 63,162,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,162,231,157, 62,169,183, 70, 63,219,144,151, 62, 61, 29, 70, 63,114, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,198,119, 76, 63, 90,150,169, 62, 61, 29, 70, 63,114, 54,174, 62,
+169,183, 70, 63,219,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+169,183, 70, 63,219,144,151, 62, 0, 0, 64, 63,162,231,157, 62, 0, 0, 64, 63,218, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,230,250, 82, 63,117,190,166, 62,198,119, 76, 63, 90,150,169, 62,
+ 72, 0, 78, 63, 52,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 72, 0, 78, 63, 52,201,146, 62, 21, 69, 85, 63, 3,102,144, 62,230,250, 82, 63,117,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,149,153, 89, 63,201,199,165, 62,230,250, 82, 63,117,190,166, 62,
+ 21, 69, 85, 63, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21, 69, 85, 63, 3,102,144, 62, 72, 0, 78, 63, 52,201,146, 62, 68,235, 79, 63, 37, 77,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,167,245, 61, 72, 45,128, 62, 94,217,179, 61,222, 76,120, 62,
+202,196,234, 61,100, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+202,196,234, 61,100, 97, 83, 62,212,153, 25, 62, 2,152, 97, 62,179,167,245, 61, 72, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,156, 83,135, 62,179,167,245, 61, 72, 45,128, 62,
+212,153, 25, 62, 2,152, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+212,153, 25, 62, 2,152, 97, 62,202,196,234, 61,100, 97, 83, 62,214,153, 25, 62,106,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,179,167,245, 61, 72, 45,128, 62,214,153, 25, 62,156, 83,135, 62,
+ 62,118,253, 61,174,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 62,118,253, 61,174,144,151, 62, 53, 49,195, 61, 17,201,146, 62,179,167,245, 61, 72, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 94,217,179, 61,222, 76,120, 62,179,167,245, 61, 72, 45,128, 62,
+ 53, 49,195, 61, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 53, 49,195, 61, 17,201,146, 62, 62,118,253, 61,174,144,151, 62, 70,117,207, 61, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 79, 92,155, 61, 91,190,166, 62,194,205, 76, 61,186,199,165, 62,
+212, 10,137, 61,238,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+212, 10,137, 61,238,101,144, 62, 53, 49,195, 61, 17,201,146, 62, 79, 92,155, 61, 91,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70,117,207, 61, 54,150,169, 62, 79, 92,155, 61, 91,190,166, 62,
+ 53, 49,195, 61, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 53, 49,195, 61, 17,201,146, 62,212, 10,137, 61,238,101,144, 62, 94,217,179, 61,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,204, 36, 1, 62, 70, 54,174, 62, 70,117,207, 61, 54,150,169, 62,
+ 62,118,253, 61,174,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 62,118,253, 61,174,144,151, 62,213,153, 25, 62,100,231,157, 62,204, 36, 1, 62, 70, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,165,111,180, 62,204, 36, 1, 62, 70, 54,174, 62,
+213,153, 25, 62,100,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+213,153, 25, 62,100,231,157, 62, 62,118,253, 61,174,144,151, 62,214,153, 25, 62,156, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188,205, 76, 61, 53,162,115, 62, 94,217,179, 61,222, 76,120, 62,
+212, 10,137, 61,238,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+212, 10,137, 61,238,101,144, 62,207,133, 7, 61,236,101,144, 62,188,205, 76, 61, 53,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,255,162, 71, 60,216, 76,120, 62,188,205, 76, 61, 53,162,115, 62,
+207,133, 7, 61,236,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+207,133, 7, 61,236,101,144, 62,212, 10,137, 61,238,101,144, 62,194,205, 76, 61,186,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188,205, 76, 61, 53,162,115, 62,255,162, 71, 60,216, 76,120, 62,
+190,171,221, 60,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+190,171,221, 60,194,176, 70, 62,194, 98,149, 61,194,176, 70, 62,188,205, 76, 61, 53,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 94,217,179, 61,222, 76,120, 62,188,205, 76, 61, 53,162,115, 62,
+194, 98,149, 61,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+194, 98,149, 61,194,176, 70, 62,190,171,221, 60,194,176, 70, 62,193,205, 76, 61,168, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,198, 83,213, 61,179,253, 30, 62,214,153, 25, 62,106,111, 52, 62,
+202,196,234, 61,100, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+202,196,234, 61,100, 97, 83, 62,194, 98,149, 61,194,176, 70, 62,198, 83,213, 61,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,193,205, 76, 61,168, 31, 23, 62,198, 83,213, 61,179,253, 30, 62,
+194, 98,149, 61,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+194, 98,149, 61,194,176, 70, 62,202,196,234, 61,100, 97, 83, 62, 94,217,179, 61,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 59,239,126, 63,174,253, 30, 62,154,105,131, 63,168, 31, 23, 62,
+175,118,131, 63,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+175,118,131, 63,194,176, 70, 62, 30, 65,124, 63, 90, 97, 83, 62, 59,239,126, 63,174,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63, 90,111, 52, 62, 59,239,126, 63,174,253, 30, 62,
+ 30, 65,124, 63, 90, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 30, 65,124, 63, 90, 97, 83, 62,175,118,131, 63,194,176, 70, 62, 70,143,129, 63,216, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,156,105,131, 63,101, 41,147, 61, 65, 51,115, 63, 83,111,180, 61,
+ 38, 49,117, 63,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 38, 49,117, 63,225, 64, 52, 61,232,148,135, 63,144,158,125, 60,156,105,131, 63,101, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,153, 25, 62,104,111,180, 61,122,245,128, 61,101, 41,147, 61,
+224,153, 25, 62,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+232,148,135, 63,144,158,125, 60, 38, 49,117, 63,225, 64, 52, 61,208,222,121, 63,102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,122,245,128, 61,101, 41,147, 61,215,153, 25, 62,104,111,180, 61,
+ 89, 55,179, 61, 38, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 89, 55,179, 61, 38, 46,231, 61, 96,147,208, 60, 48, 46,231, 61,122,245,128, 61,101, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63, 83,111,180, 61,156,105,131, 63,101, 41,147, 61,
+102,153,129, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 96,147,208, 60, 48, 46,231, 61, 89, 55,179, 61, 38, 46,231, 61,193,205, 76, 61,168, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 59,239,126, 63,174,253, 30, 62, 65, 51,115, 63, 90,111, 52, 62,
+ 66, 51,115, 63,199, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 66, 51,115, 63,199, 70, 7, 62,102,153,129, 63, 48, 46,231, 61, 59,239,126, 63,174,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,105,131, 63,168, 31, 23, 62, 59,239,126, 63,174,253, 30, 62,
+102,153,129, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+102,153,129, 63, 48, 46,231, 61, 66, 51,115, 63,199, 70, 7, 62, 65, 51,115, 63, 83,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,198, 83,213, 61,179,253, 30, 62,193,205, 76, 61,168, 31, 23, 62,
+ 89, 55,179, 61, 38, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 89, 55,179, 61, 38, 46,231, 61,217,153, 25, 62,204, 70, 7, 62,198, 83,213, 61,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,106,111, 52, 62,198, 83,213, 61,179,253, 30, 62,
+217,153, 25, 62,204, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+217,153, 25, 62,204, 70, 7, 62, 89, 55,179, 61, 38, 46,231, 61,215,153, 25, 62,104,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192,228,122, 63, 66, 45,128, 62, 65, 51,115, 63,151, 83,135, 62,
+ 65, 51,115, 63,248,151, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65, 51,115, 63,248,151, 97, 62, 30, 65,124, 63, 90, 97, 83, 62,192,228,122, 63, 66, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 70,143,129, 63,216, 76,120, 62,192,228,122, 63, 66, 45,128, 62,
+ 30, 65,124, 63, 90, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 30, 65,124, 63, 90, 97, 83, 62, 65, 51,115, 63,248,151, 97, 62, 65, 51,115, 63, 90,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192,228,122, 63, 66, 45,128, 62, 70,143,129, 63,216, 76,120, 62,
+201,153,128, 63, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+201,153,128, 63, 14,201,146, 62,239,234,121, 63,169,144,151, 62,192,228,122, 63, 66, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 65, 51,115, 63,151, 83,135, 62,192,228,122, 63, 66, 45,128, 62,
+239,234,121, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+239,234,121, 63,169,144,151, 62,201,153,128, 63, 14,201,146, 62, 15,171,127, 63, 52,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,133, 80,121, 63, 65, 54,174, 62, 65, 51,115, 63,160,111,180, 62,
+ 65, 51,115, 63, 93,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 65, 51,115, 63, 93,231,157, 62,239,234,121, 63,169,144,151, 62,133, 80,121, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 15,171,127, 63, 52,150,169, 62,133, 80,121, 63, 65, 54,174, 62,
+239,234,121, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+239,234,121, 63,169,144,151, 62, 65, 51,115, 63, 93,231,157, 62, 65, 51,115, 63,151, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 23, 23,131, 63, 89,190,166, 62, 15,171,127, 63, 52,150,169, 62,
+201,153,128, 63, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+136,200,153, 59, 14,201,146, 62,207,133, 7, 61,236,101,144, 62,195,197,197, 60, 89,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,194,205, 76, 61,186,199,165, 62,195,197,197, 60, 89,190,166, 62,
+207,133, 7, 61,236,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+207,133, 7, 61,236,101,144, 62,136,200,153, 59, 14,201,146, 62,255,162, 71, 60,216, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 32,208,163, 62, 79, 45,128, 62,147, 92,147, 62,252, 76,120, 62,
+102, 23,161, 62,115, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+102, 23,161, 62,115, 97, 83, 62, 22, 51,179, 62, 2,152, 97, 62, 32,208,163, 62, 79, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,156, 83,135, 62, 32,208,163, 62, 79, 45,128, 62,
+ 22, 51,179, 62, 2,152, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 22, 51,179, 62, 2,152, 97, 62,102, 23,161, 62,115, 97, 83, 62, 21, 51,179, 62,101,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 32,208,163, 62, 79, 45,128, 62, 21, 51,179, 62,156, 83,135, 62,
+194,195,165, 62,181,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+194,195,165, 62,181,144,151, 62,134, 50,151, 62, 29,201,146, 62, 32,208,163, 62, 79, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147, 92,147, 62,252, 76,120, 62, 32,208,163, 62, 79, 45,128, 62,
+134, 50,151, 62, 29,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+134, 50,151, 62, 29,201,146, 62,194,195,165, 62,181,144,151, 62,137, 67,154, 62, 70,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 82, 61,141, 62,112,190,166, 62, 0, 0,128, 62,206,199,165, 62,
+247,168,136, 62, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+247,168,136, 62, 3,102,144, 62,134, 50,151, 62, 29,201,146, 62, 82, 61,141, 62,112,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,137, 67,154, 62, 70,150,169, 62, 82, 61,141, 62,112,190,166, 62,
+134, 50,151, 62, 29,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+134, 50,151, 62, 29,201,146, 62,247,168,136, 62, 3,102,144, 62,147, 92,147, 62,252, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,150,248,166, 62, 78, 54,174, 62,137, 67,154, 62, 70,150,169, 62,
+194,195,165, 62,181,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+194,195,165, 62,181,144,151, 62, 21, 51,179, 62, 98,231,157, 62,150,248,166, 62, 78, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,165,111,180, 62,150,248,166, 62, 78, 54,174, 62,
+ 21, 51,179, 62, 98,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21, 51,179, 62, 98,231,157, 62,194,195,165, 62,181,144,151, 62, 21, 51,179, 62,156, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 89,162,115, 62,147, 92,147, 62,252, 76,120, 62,
+247,168,136, 62, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+247,168,136, 62, 3,102,144, 62, 18,174,110, 62, 3,102,144, 62, 0, 0,128, 62, 89,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,217, 70, 89, 62,252, 76,120, 62, 0, 0,128, 62, 89,162,115, 62,
+ 18,174,110, 62, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 18,174,110, 62, 3,102,144, 62,247,168,136, 62, 3,102,144, 62, 0, 0,128, 62,206,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62, 89,162,115, 62,217, 70, 89, 62,252, 76,120, 62,
+ 30,130,104, 62,230,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 30,130,104, 62,230,176, 70, 62,241,190,139, 62,230,176, 70, 62, 0, 0,128, 62, 89,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,147, 92,147, 62,252, 76,120, 62, 0, 0,128, 62, 89,162,115, 62,
+241,190,139, 62,230,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+241,190,139, 62,230,176, 70, 62, 30,130,104, 62,230,176, 70, 62, 0, 0,128, 62,208, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 41,187,155, 62,205,253, 30, 62, 21, 51,179, 62,101,111, 52, 62,
+102, 23,161, 62,115, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+102, 23,161, 62,115, 97, 83, 62,241,190,139, 62,230,176, 70, 62, 41,187,155, 62,205,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,208, 31, 23, 62, 41,187,155, 62,205,253, 30, 62,
+241,190,139, 62,230,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+241,190,139, 62,230,176, 70, 62,102, 23,161, 62,115, 97, 83, 62,147, 92,147, 62,252, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,174,137, 72, 62,205,253, 30, 62, 0, 0,128, 62,208, 31, 23, 62,
+ 30,130,104, 62,230,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 30,130,104, 62,230,176, 70, 62, 51,209, 61, 62,115, 97, 83, 62,174,137, 72, 62,205,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,106,111, 52, 62,174,137, 72, 62,205,253, 30, 62,
+ 51,209, 61, 62,115, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 51,209, 61, 62,115, 97, 83, 62, 30,130,104, 62,230,176, 70, 62,217, 70, 89, 62,252, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,255,255,127, 62,141, 41,147, 61,215,153, 25, 62,104,111,180, 61,
+224,153, 25, 62,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+224,153, 25, 62,225, 64, 52, 61, 15, 51,179, 62,225, 64, 52, 61,255,255,127, 62,141, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 20, 51,179, 62,104,111,180, 61,255,255,127, 62,141, 41,147, 61,
+ 15, 51,179, 62,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 15, 51,179, 62,225, 64, 52, 61,224,153, 25, 62,225, 64, 52, 61,144,175,161, 62,102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,255,255,127, 62,141, 41,147, 61, 20, 51,179, 62,104,111,180, 61,
+ 12, 52,147, 62,109, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 12, 52,147, 62,109, 46,231, 61,231,151, 89, 62,109, 46,231, 61,255,255,127, 62,141, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,215,153, 25, 62,104,111,180, 61,255,255,127, 62,141, 41,147, 61,
+231,151, 89, 62,109, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+231,151, 89, 62,109, 46,231, 61, 12, 52,147, 62,109, 46,231, 61, 0, 0,128, 62,208, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,174,137, 72, 62,205,253, 30, 62,214,153, 25, 62,106,111, 52, 62,
+217,153, 25, 62,204, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+217,153, 25, 62,204, 70, 7, 62,231,151, 89, 62,109, 46,231, 61,174,137, 72, 62,205,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,208, 31, 23, 62,174,137, 72, 62,205,253, 30, 62,
+231,151, 89, 62,109, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+231,151, 89, 62,109, 46,231, 61,217,153, 25, 62,204, 70, 7, 62,215,153, 25, 62,104,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 41,187,155, 62,205,253, 30, 62, 0, 0,128, 62,208, 31, 23, 62,
+ 12, 52,147, 62,109, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 12, 52,147, 62,109, 46,231, 61, 19, 51,179, 62,204, 70, 7, 62, 41,187,155, 62,205,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,101,111, 52, 62, 41,187,155, 62,205,253, 30, 62,
+ 19, 51,179, 62,204, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 19, 51,179, 62,204, 70, 7, 62, 12, 52,147, 62,109, 46,231, 61, 20, 51,179, 62,104,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192, 95, 56, 62, 79, 45,128, 62,214,153, 25, 62,156, 83,135, 62,
+212,153, 25, 62, 2,152, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+212,153, 25, 62, 2,152, 97, 62, 51,209, 61, 62,115, 97, 83, 62,192, 95, 56, 62, 79, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,217, 70, 89, 62,252, 76,120, 62,192, 95, 56, 62, 79, 45,128, 62,
+ 51,209, 61, 62,115, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 51,209, 61, 62,115, 97, 83, 62,212,153, 25, 62, 2,152, 97, 62,214,153, 25, 62,106,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,192, 95, 56, 62, 79, 45,128, 62,217, 70, 89, 62,252, 76,120, 62,
+245,154, 81, 62, 29,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+245,154, 81, 62, 29,201,146, 62,125,120, 52, 62,181,144,151, 62,192, 95, 56, 62, 79, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,214,153, 25, 62,156, 83,135, 62,192, 95, 56, 62, 79, 45,128, 62,
+125,120, 52, 62,181,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+125,120, 52, 62,181,144,151, 62,245,154, 81, 62, 29,201,146, 62,239,120, 75, 62, 70,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,213, 14, 50, 62, 78, 54,174, 62,214,153, 25, 62,165,111,180, 62,
+213,153, 25, 62,100,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+213,153, 25, 62,100,231,157, 62,125,120, 52, 62,181,144,151, 62,213, 14, 50, 62, 78, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,239,120, 75, 62, 70,150,169, 62,213, 14, 50, 62, 78, 54,174, 62,
+125,120, 52, 62,181,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+125,120, 52, 62,181,144,151, 62,213,153, 25, 62,100,231,157, 62,214,153, 25, 62,156, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 91,133,101, 62,112,190,166, 62,239,120, 75, 62, 70,150,169, 62,
+245,154, 81, 62, 29,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+245,154, 81, 62, 29,201,146, 62, 18,174,110, 62, 3,102,144, 62, 91,133,101, 62,112,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0,128, 62,206,199,165, 62, 91,133,101, 62,112,190,166, 62,
+ 18,174,110, 62, 3,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 18,174,110, 62, 3,102,144, 62,245,154, 81, 62, 29,201,146, 62,217, 70, 89, 62,252, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 64, 27, 5, 63, 66, 45,128, 62,232,194,249, 62,216, 76,120, 62,
+226,190, 3, 63, 90, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+226,190, 3, 63, 90, 97, 83, 62,191,204, 12, 63,248,151, 97, 62, 64, 27, 5, 63, 66, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,149, 83,135, 62, 64, 27, 5, 63, 66, 45,128, 62,
+191,204, 12, 63,248,151, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,204, 12, 63,248,151, 97, 62,226,190, 3, 63, 90, 97, 83, 62,191,204, 12, 63, 90,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 64, 27, 5, 63, 66, 45,128, 62,191,204, 12, 63,149, 83,135, 62,
+ 17, 21, 6, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 17, 21, 6, 63,169,144,151, 62,222,152,253, 62, 14,201,146, 62, 64, 27, 5, 63, 66, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,232,194,249, 62,216, 76,120, 62, 64, 27, 5, 63, 66, 45,128, 62,
+222,152,253, 62, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+222,152,253, 62, 14,201,146, 62, 17, 21, 6, 63,169,144,151, 62,241, 84, 0, 63, 52,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,164,163,243, 62, 89,190,166, 62, 72,102,230, 62,183,199,165, 62,
+ 70, 15,239, 62,233,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 70, 15,239, 62,233,101,144, 62,222,152,253, 62, 14,201,146, 62,164,163,243, 62, 89,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,241, 84, 0, 63, 52,150,169, 62,164,163,243, 62, 89,190,166, 62,
+222,152,253, 62, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+222,152,253, 62, 14,201,146, 62, 70, 15,239, 62,233,101,144, 62,232,194,249, 62,216, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,123,175, 6, 63, 65, 54,174, 62,241, 84, 0, 63, 52,150,169, 62,
+ 17, 21, 6, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 17, 21, 6, 63,169,144,151, 62,191,204, 12, 63, 90,231,157, 62,123,175, 6, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,160,111,180, 62,123,175, 6, 63, 65, 54,174, 62,
+191,204, 12, 63, 90,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,204, 12, 63, 90,231,157, 62, 17, 21, 6, 63,169,144,151, 62,191,204, 12, 63,149, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 72,102,230, 62, 53,162,115, 62,232,194,249, 62,216, 76,120, 62,
+ 70, 15,239, 62,233,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 70, 15,239, 62,233,101,144, 62, 75,189,221, 62,238,101,144, 62, 72,102,230, 62, 53,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,168, 9,211, 62,222, 76,120, 62, 72,102,230, 62, 53,162,115, 62,
+ 75,189,221, 62,238,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 75,189,221, 62,238,101,144, 62, 70, 15,239, 62,233,101,144, 62, 72,102,230, 62,183,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 72,102,230, 62, 53,162,115, 62,168, 9,211, 62,222, 76,120, 62,
+ 80,167,218, 62,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 80,167,218, 62,194,176, 70, 62, 68, 37,242, 62,194,176, 70, 62, 72,102,230, 62, 53,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,232,194,249, 62,216, 76,120, 62, 72,102,230, 62, 53,162,115, 62,
+ 68, 37,242, 62,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 68, 37,242, 62,194,176, 70, 62, 80,167,218, 62,194,176, 70, 62, 72,102,230, 62,168, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,197, 16, 1, 63,174,253, 30, 62,191,204, 12, 63, 90,111, 52, 62,
+226,190, 3, 63, 90, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+226,190, 3, 63, 90, 97, 83, 62, 68, 37,242, 62,194,176, 70, 62,197, 16, 1, 63,174,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 72,102,230, 62,168, 31, 23, 62,197, 16, 1, 63,174,253, 30, 62,
+ 68, 37,242, 62,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 68, 37,242, 62,194,176, 70, 62,226,190, 3, 63, 90, 97, 83, 62,232,194,249, 62,216, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,171,202, 62,179,253, 30, 62, 72,102,230, 62,168, 31, 23, 62,
+ 80,167,218, 62,194,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 80,167,218, 62,194,176, 70, 62,205, 78,197, 62, 95, 97, 83, 62, 14,171,202, 62,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,101,111, 52, 62, 14,171,202, 62,179,253, 30, 62,
+205, 78,197, 62, 95, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+205, 78,197, 62, 95, 97, 83, 62, 80,167,218, 62,194,176, 70, 62,168, 9,211, 62,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63,102,230, 62,101, 41,147, 61, 20, 51,179, 62,104,111,180, 61,
+ 15, 51,179, 62,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 15, 51,179, 62,225, 64, 52, 61,189,204, 12, 63,225, 64, 52, 61, 63,102,230, 62,101, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63, 83,111,180, 61, 63,102,230, 62,101, 41,147, 61,
+189,204, 12, 63,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+189,204, 12, 63,225, 64, 52, 61, 15, 51,179, 62,225, 64, 52, 61,144,175,161, 62,102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 63,102,230, 62,101, 41,147, 61,191,204, 12, 63, 83,111,180, 61,
+104,154,249, 62, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+104,154,249, 62, 48, 46,231, 61, 42, 50,211, 62, 48, 46,231, 61, 63,102,230, 62,101, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 20, 51,179, 62,104,111,180, 61, 63,102,230, 62,101, 41,147, 61,
+ 42, 50,211, 62, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 42, 50,211, 62, 48, 46,231, 61,104,154,249, 62, 48, 46,231, 61, 72,102,230, 62,168, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 14,171,202, 62,179,253, 30, 62, 21, 51,179, 62,101,111, 52, 62,
+ 19, 51,179, 62,204, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 19, 51,179, 62,204, 70, 7, 62, 42, 50,211, 62, 48, 46,231, 61, 14,171,202, 62,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 72,102,230, 62,168, 31, 23, 62, 14,171,202, 62,179,253, 30, 62,
+ 42, 50,211, 62, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 42, 50,211, 62, 48, 46,231, 61, 19, 51,179, 62,204, 70, 7, 62, 20, 51,179, 62,104,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,197, 16, 1, 63,174,253, 30, 62, 72,102,230, 62,168, 31, 23, 62,
+104,154,249, 62, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+104,154,249, 62, 48, 46,231, 61,191,204, 12, 63,199, 70, 7, 62,197, 16, 1, 63,174,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63, 90,111, 52, 62,197, 16, 1, 63,174,253, 30, 62,
+191,204, 12, 63,199, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,204, 12, 63,199, 70, 7, 62,104,154,249, 62, 48, 46,231, 61,191,204, 12, 63, 83,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 19,150,194, 62, 72, 45,128, 62, 21, 51,179, 62,156, 83,135, 62,
+ 22, 51,179, 62, 2,152, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 22, 51,179, 62, 2,152, 97, 62,205, 78,197, 62, 95, 97, 83, 62, 19,150,194, 62, 72, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,168, 9,211, 62,222, 76,120, 62, 19,150,194, 62, 72, 45,128, 62,
+205, 78,197, 62, 95, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+205, 78,197, 62, 95, 97, 83, 62, 22, 51,179, 62, 2,152, 97, 62, 21, 51,179, 62,101,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 19,150,194, 62, 72, 45,128, 62,168, 9,211, 62,222, 76,120, 62,
+179, 51,207, 62, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+179, 51,207, 62, 17,201,146, 62,113,162,192, 62,174,144,151, 62, 19,150,194, 62, 72, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21, 51,179, 62,156, 83,135, 62, 19,150,194, 62, 72, 45,128, 62,
+113,162,192, 62,174,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+113,162,192, 62,174,144,151, 62,179, 51,207, 62, 17,201,146, 62,175, 34,204, 62, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,154,109,191, 62, 68, 54,174, 62, 21, 51,179, 62,165,111,180, 62,
+ 21, 51,179, 62, 98,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 21, 51,179, 62, 98,231,157, 62,113,162,192, 62,174,144,151, 62,154,109,191, 62, 68, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,175, 34,204, 62, 54,150,169, 62,154,109,191, 62, 68, 54,174, 62,
+113,162,192, 62,174,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+113,162,192, 62,174,144,151, 62, 21, 51,179, 62, 98,231,157, 62, 21, 51,179, 62,156, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,237, 40,217, 62, 91,190,166, 62,175, 34,204, 62, 54,150,169, 62,
+179, 51,207, 62, 17,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+179, 51,207, 62, 17,201,146, 62, 75,189,221, 62,238,101,144, 62,237, 40,217, 62, 91,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 72,102,230, 62,183,199,165, 62,237, 40,217, 62, 91,190,166, 62,
+ 75,189,221, 62,238,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 75,189,221, 62,238,101,144, 62,179, 51,207, 62, 17,201,146, 62,168, 9,211, 62,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,134, 78, 56, 63,117, 45,128, 62,188, 20, 48, 63, 37, 77,120, 62,
+ 42,242, 54, 63,181, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 42,242, 54, 63,181, 97, 83, 62, 0, 0, 64, 63,115,152, 97, 62,134, 78, 56, 63,117, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,218, 83,135, 62,134, 78, 56, 63,117, 45,128, 62,
+ 0, 0, 64, 63,115,152, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,115,152, 97, 62, 42,242, 54, 63,181, 97, 83, 62, 0, 0, 64, 63,202,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,134, 78, 56, 63,117, 45,128, 62, 0, 0, 64, 63,218, 83,135, 62,
+ 87, 72, 57, 63,219,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 87, 72, 57, 63,219,144,151, 62,184,255, 49, 63, 52,201,146, 62,134, 78, 56, 63,117, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188, 20, 48, 63, 37, 77,120, 62,134, 78, 56, 63,117, 45,128, 62,
+184,255, 49, 63, 52,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+184,255, 49, 63, 52,201,146, 62, 87, 72, 57, 63,219,144,151, 62, 58,136, 51, 63, 90,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 26, 5, 45, 63,117,190,166, 62,107,102, 38, 63,201,199,165, 62,
+235,186, 42, 63, 5,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+235,186, 42, 63, 5,102,144, 62,184,255, 49, 63, 52,201,146, 62, 26, 5, 45, 63,117,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 58,136, 51, 63, 90,150,169, 62, 26, 5, 45, 63,117,190,166, 62,
+184,255, 49, 63, 52,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+184,255, 49, 63, 52,201,146, 62,235,186, 42, 63, 5,102,144, 62,188, 20, 48, 63, 37, 77,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,196,226, 57, 63,114, 54,174, 62, 58,136, 51, 63, 90,150,169, 62,
+ 87, 72, 57, 63,219,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 87, 72, 57, 63,219,144,151, 62, 0, 0, 64, 63,162,231,157, 62,196,226, 57, 63,114, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,211,111,180, 62,196,226, 57, 63,114, 54,174, 62,
+ 0, 0, 64, 63,162,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,162,231,157, 62, 87, 72, 57, 63,219,144,151, 62, 0, 0, 64, 63,218, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,107,102, 38, 63, 79,162,115, 62,188, 20, 48, 63, 37, 77,120, 62,
+235,186, 42, 63, 5,102,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+235,186, 42, 63, 5,102,144, 62,234, 17, 34, 63,243,101,144, 62,107,102, 38, 63, 79,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,184, 28, 63,222, 76,120, 62,107,102, 38, 63, 79,162,115, 62,
+234, 17, 34, 63,243,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+234, 17, 34, 63,243,101,144, 62,235,186, 42, 63, 5,102,144, 62,107,102, 38, 63,201,199,165, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,107,102, 38, 63, 79,162,115, 62, 21,184, 28, 63,222, 76,120, 62,
+234,134, 32, 63,204,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+234,134, 32, 63,204,176, 70, 62,233, 69, 44, 63,245,176, 70, 62,107,102, 38, 63, 79,162,115, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,188, 20, 48, 63, 37, 77,120, 62,107,102, 38, 63, 79,162,115, 62,
+233, 69, 44, 63,245,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+233, 69, 44, 63,245,176, 70, 62,234,134, 32, 63,204,176, 70, 62,104,102, 38, 63,198, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9, 68, 52, 63,241,253, 30, 62, 0, 0, 64, 63,202,111, 52, 62,
+ 42,242, 54, 63,181, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 42,242, 54, 63,181, 97, 83, 62,233, 69, 44, 63,245,176, 70, 62, 9, 68, 52, 63,241,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,104,102, 38, 63,198, 31, 23, 62, 9, 68, 52, 63,241,253, 30, 62,
+233, 69, 44, 63,245,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+233, 69, 44, 63,245,176, 70, 62, 42,242, 54, 63,181, 97, 83, 62,188, 20, 48, 63, 37, 77,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,195,136, 24, 63,179,253, 30, 62,104,102, 38, 63,198, 31, 23, 62,
+234,134, 32, 63,204,176, 70, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+234,134, 32, 63,204,176, 70, 62,162,218, 21, 63, 84, 97, 83, 62,195,136, 24, 63,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63, 90,111, 52, 62,195,136, 24, 63,179,253, 30, 62,
+162,218, 21, 63, 84, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+162,218, 21, 63, 84, 97, 83, 62,234,134, 32, 63,204,176, 70, 62, 21,184, 28, 63,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,104,102, 38, 63,111, 41,147, 61,191,204, 12, 63, 83,111,180, 61,
+189,204, 12, 63,225, 64, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+189,204, 12, 63,225, 64, 52, 61, 0, 0, 64, 63,111, 65, 52, 61,104,102, 38, 63,111, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,195,111,180, 61,104,102, 38, 63,111, 41,147, 61,
+ 0, 0, 64, 63,111, 65, 52, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63,111, 65, 52, 61,189,204, 12, 63,225, 64, 52, 61,208,222,121, 63,102, 9,239,178, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,104,102, 38, 63,111, 41,147, 61, 0, 0, 64, 63,195,111,180, 61,
+122, 0, 48, 63,120, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+122, 0, 48, 63,120, 46,231, 61, 85,204, 28, 63, 48, 46,231, 61,104,102, 38, 63,111, 41,147, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63, 83,111,180, 61,104,102, 38, 63,111, 41,147, 61,
+ 85,204, 28, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 85,204, 28, 63, 48, 46,231, 61,122, 0, 48, 63,120, 46,231, 61,104,102, 38, 63,198, 31, 23, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,195,136, 24, 63,179,253, 30, 62,191,204, 12, 63, 90,111, 52, 62,
+191,204, 12, 63,199, 70, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,204, 12, 63,199, 70, 7, 62, 85,204, 28, 63, 48, 46,231, 61,195,136, 24, 63,179,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,104,102, 38, 63,198, 31, 23, 62,195,136, 24, 63,179,253, 30, 62,
+ 85,204, 28, 63, 48, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 85,204, 28, 63, 48, 46,231, 61,191,204, 12, 63,199, 70, 7, 62,191,204, 12, 63, 83,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 9, 68, 52, 63,241,253, 30, 62,104,102, 38, 63,198, 31, 23, 62,
+122, 0, 48, 63,120, 46,231, 61, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+122, 0, 48, 63,120, 46,231, 61, 0, 0, 64, 63, 24, 71, 7, 62, 9, 68, 52, 63,241,253, 30, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64, 63,202,111, 52, 62, 9, 68, 52, 63,241,253, 30, 62,
+ 0, 0, 64, 63, 24, 71, 7, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 64, 63, 24, 71, 7, 62,122, 0, 48, 63,120, 46,231, 61, 0, 0, 64, 63,195,111,180, 61, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68,126, 20, 63, 64, 45,128, 62,191,204, 12, 63,149, 83,135, 62,
+191,204, 12, 63,248,151, 97, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,204, 12, 63,248,151, 97, 62,162,218, 21, 63, 84, 97, 83, 62, 68,126, 20, 63, 64, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 21,184, 28, 63,222, 76,120, 62, 68,126, 20, 63, 64, 45,128, 62,
+162,218, 21, 63, 84, 97, 83, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+162,218, 21, 63, 84, 97, 83, 62,191,204, 12, 63,248,151, 97, 62,191,204, 12, 63, 90,111, 52, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68,126, 20, 63, 64, 45,128, 62, 21,184, 28, 63,222, 76,120, 62,
+ 25,205, 26, 63, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 25,205, 26, 63, 14,201,146, 62,114,132, 19, 63,169,144,151, 62, 68,126, 20, 63, 64, 45,128, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,191,204, 12, 63,149, 83,135, 62, 68,126, 20, 63, 64, 45,128, 62,
+114,132, 19, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+114,132, 19, 63,169,144,151, 62, 25,205, 26, 63, 14,201,146, 62,150, 68, 25, 63, 54,150,169, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 7,234, 18, 63, 65, 54,174, 62,191,204, 12, 63,160,111,180, 62,
+191,204, 12, 63, 90,231,157, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+191,204, 12, 63, 90,231,157, 62,114,132, 19, 63,169,144,151, 62, 7,234, 18, 63, 65, 54,174, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,150, 68, 25, 63, 54,150,169, 62, 7,234, 18, 63, 65, 54,174, 62,
+114,132, 19, 63,169,144,151, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+114,132, 19, 63,169,144,151, 62,191,204, 12, 63, 90,231,157, 62,191,204, 12, 63,149, 83,135, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,185,199, 31, 63, 96,190,166, 62,150, 68, 25, 63, 54,150,169, 62,
+ 25,205, 26, 63, 14,201,146, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 25,205, 26, 63, 14,201,146, 62,234, 17, 34, 63,243,101,144, 62,185,199, 31, 63, 96,190,166, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,107,102, 38, 63,201,199,165, 62,185,199, 31, 63, 96,190,166, 62,
+234, 17, 34, 63,243,101,144, 62, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+234, 17, 34, 63,243,101,144, 62, 25,205, 26, 63, 14,201,146, 62, 21,184, 28, 63,222, 76,120, 62, 0, 0,128, 63, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 80, 0, 0,240,177,120, 1, 0, 0, 0, 0,
+ 57, 0, 0, 0, 0, 20, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
@@ -10719,3649 +12473,1429 @@ char datatoc_preview_blend[]= {
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 68, 65, 84, 65, 0, 1, 44, 0, 8,172, 96, 32,
- 0, 0, 0, 51, 0, 0, 5, 0, 0, 0, 0, 0, 63,110,222,166, 63, 55,205, 9, 63,105,132,212, 63, 65,236,201, 63,103,153,218,
- 63, 54,155,119, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,103,153,218, 63, 54,155,119, 63,108,148,118, 63, 44,160,211, 63,110,222,166, 63, 55,205, 9,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,115, 51, 36, 63, 45, 28, 36, 63,110,222,166, 63, 55,205, 9, 63,108,148,118, 63, 44,160,211, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,108,148,118, 63, 44,160,211, 63,103,153,218, 63, 54,155,119, 63,102, 17, 87, 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 96, 81, 56,
- 63, 52, 55,170, 63,102, 17, 87, 63, 43, 52,229, 63,103,153,218, 63, 54,155,119, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,103,153,218, 63, 54,155,119,
- 63, 97, 75, 9, 63, 63,233, 92, 63, 96, 81, 56, 63, 52, 55,170, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,138, 63, 60, 86, 49, 63, 96, 81, 56,
- 63, 52, 55,170, 63, 97, 75, 9, 63, 63,233, 92, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 97, 75, 9, 63, 63,233, 92, 63,103,153,218, 63, 54,155,119,
- 63,105,132,212, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 98,167,103, 63, 75, 39,168, 63, 89,153,138, 63, 82,228, 39, 63, 89,153,139,
- 63, 71,153,255, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,139, 63, 71,153,255, 63, 97, 75, 9, 63, 63,233, 92, 63, 98,167,103, 63, 75, 39,168,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,105,132,212, 63, 65,236,201, 63, 98,167,103, 63, 75, 39,168, 63, 97, 75, 9, 63, 63,233, 92, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 97, 75, 9, 63, 63,233, 92, 63, 89,153,139, 63, 71,153,255, 63, 89,153,138, 63, 60, 86, 49, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 96, 81, 56,
- 63, 52, 55,170, 63, 89,153,138, 63, 60, 86, 49, 63, 89,153,139, 63, 49, 12, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,139, 63, 49, 12, 79,
- 63, 95,182,205, 63, 40,228,222, 63, 96, 81, 56, 63, 52, 55,170, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,102, 17, 87, 63, 43, 52,229, 63, 96, 81, 56,
- 63, 52, 55,170, 63, 95,182,205, 63, 40,228,222, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 95,182,205, 63, 40,228,222, 63, 89,153,139, 63, 49, 12, 79,
- 63, 89,153,139, 63, 37,200, 45, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 98,167,103, 63, 75, 39,168, 63,105,132,212, 63, 65,236,201, 63,109, 83,168,
- 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,109, 83,168, 63, 78, 83,207, 63,101, 85,135, 63, 88, 64,148, 63, 98,167,103, 63, 75, 39,168,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 89,153,138, 63, 82,228, 39, 63, 98,167,103, 63, 75, 39,168, 63,101, 85,135, 63, 88, 64,148, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,101, 85,135, 63, 88, 64,148, 63,109, 83,168, 63, 78, 83,207, 63,115, 51, 36, 63, 90, 56, 22, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121, 18,162,
- 63, 78, 83,207, 63,115, 51, 36, 63, 90, 56, 22, 63,109, 83,168, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,109, 83,168, 63, 78, 83,207,
- 63,115, 51, 36, 63, 67, 23,115, 63,121, 18,162, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,124,225,116, 63, 65,236,202, 63,121, 18,162,
- 63, 78, 83,207, 63,115, 51, 36, 63, 67, 23,115, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 36, 63, 67, 23,115, 63,109, 83,168, 63, 78, 83,207,
- 63,105,132,212, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,110,222,166, 63, 55,205, 9, 63,115, 51, 36, 63, 45, 28, 36, 63,119,135,163,
- 63, 55,205, 11, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,119,135,163, 63, 55,205, 11, 63,115, 51, 36, 63, 67, 23,115, 63,110,222,166, 63, 55,205, 9,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,105,132,212, 63, 65,236,201, 63,110,222,166, 63, 55,205, 9, 63,115, 51, 36, 63, 67, 23,115, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,115, 51, 36, 63, 67, 23,115, 63,119,135,163, 63, 55,205, 11, 63,124,225,116, 63, 65,236,202, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121, 18,162,
- 63, 78, 83,207, 63,124,225,116, 63, 65,236,202, 63,129,223,113, 63, 75, 39,170, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,129,223,113, 63, 75, 39,170,
- 63,128,136, 98, 63, 88, 64,148, 63,121, 18,162, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 36, 63, 90, 56, 22, 63,121, 18,162,
- 63, 78, 83,207, 63,128,136, 98, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 59,136, 98, 95, 63, 88, 64,148, 60,111,184,160, 63, 75, 39,170,
- 61, 76,203,243, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,203,243, 63, 49, 12, 82, 61, 76,203,246, 63, 60, 86, 53, 60,194,162, 31,
- 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 60,194,162, 31, 63, 52, 55,172, 60,213,239,111, 63, 40,228,223, 61, 76,203,243, 63, 49, 12, 82,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61, 76,203,246, 63, 37,200, 48, 61, 76,203,243, 63, 49, 12, 82, 60,213,239,111, 63, 40,228,223, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 60,213,239,111, 63, 40,228,223, 60,194,162, 31, 63, 52, 55,172, 58,169,226,120, 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,126,204,111,
- 63, 54,155,121, 63,128, 42,121, 63, 43, 52,230, 63,131, 10,136, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,131, 10,136, 63, 52, 55,172,
- 63,130,141,160, 63, 63,233, 95, 63,126,204,111, 63, 54,155,121, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,124,225,116, 63, 65,236,202, 63,126,204,111,
- 63, 54,155,121, 63,130,141,160, 63, 63,233, 95, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60,163,104, 11, 63, 63,233, 95, 60,194,162, 31, 63, 52, 55,172,
- 61, 76,203,246, 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,203,244, 63, 71,154, 2, 61, 76,203,243, 63, 82,228, 41, 60,111,184,160,
- 63, 75, 39,170, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 60,111,184,160, 63, 75, 39,170, 60,163,104, 11, 63, 63,233, 95, 61, 76,203,244, 63, 71,154, 2,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61, 76,203,246, 63, 60, 86, 53, 61, 76,203,244, 63, 71,154, 2, 60,163,104, 11, 63, 63,233, 95, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,130,141,160, 63, 63,233, 95, 63,129,223,113, 63, 75, 39,170, 63,124,225,116, 63, 65,236,202, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,126,204,111,
- 63, 54,155,121, 63,124,225,116, 63, 65,236,202, 63,119,135,163, 63, 55,205, 11, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,119,135,163, 63, 55,205, 11,
- 63,121,209,210, 63, 44,160,212, 63,126,204,111, 63, 54,155,121, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 42,121, 63, 43, 52,230, 63,126,204,111,
- 63, 54,155,121, 63,121,209,210, 63, 44,160,212, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121,209,210, 63, 44,160,212, 63,119,135,163, 63, 55,205, 11,
- 63,115, 51, 36, 63, 45, 28, 36, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,134,102, 95, 63, 94, 46, 79, 63,134,102, 95, 63,105,114, 22, 63,124,205, 52,
- 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,124,205, 52, 63, 99, 26, 58, 63,128,136, 98, 63, 88, 64,148, 63,134,102, 95, 63, 94, 46, 79,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61, 76,203,243, 63, 82,228, 41, 61, 76,203,234, 63, 94, 46, 79, 59,136, 98, 95, 63, 88, 64,148, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,128,136, 98, 63, 88, 64,148, 63,124,205, 52, 63, 99, 26, 58, 63,115, 51, 36, 63, 90, 56, 22, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,105,153, 21,
- 63, 99, 26, 58, 63,115, 51, 36, 63, 90, 56, 22, 63,124,205, 52, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,124,205, 52, 63, 99, 26, 58,
- 63,115, 51, 32, 63,109,154,212, 63,105,153, 21, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,138, 63,105,114, 19, 63,105,153, 21,
- 63, 99, 26, 58, 63,115, 51, 32, 63,109,154,212, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 32, 63,109,154,212, 63,124,205, 52, 63, 99, 26, 58,
- 63,134,102, 95, 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,134,102, 95, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 63, 89,153,136,
- 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,136, 63,116,187,242, 63,115, 51, 32, 63,109,154,212, 63,134,102, 95, 63,116,187,242,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,134,102, 95, 63,105,114, 22, 63,134,102, 95, 63,116,187,242, 63,115, 51, 32, 63,109,154,212, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,115, 51, 32, 63,109,154,212, 63, 89,153,136, 63,116,187,242, 63, 89,153,138, 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,105,153, 21,
- 63, 99, 26, 58, 63, 89,153,138, 63,105,114, 19, 63, 89,153,138, 63, 94, 46, 77, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,138, 63, 94, 46, 77,
- 63,101, 85,135, 63, 88, 64,148, 63,105,153, 21, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 36, 63, 90, 56, 22, 63,105,153, 21,
- 63, 99, 26, 58, 63,101, 85,135, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,101, 85,135, 63, 88, 64,148, 63, 89,153,138, 63, 94, 46, 77,
- 63, 89,153,138, 63, 82,228, 39, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 75,153, 67, 63, 54,155,113, 63, 73,174, 74, 63, 65,236,193, 63, 68, 84,124,
- 63, 55,204,255, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 68, 84,124, 63, 55,204,255, 63, 70,158,169, 63, 44,160,200, 63, 75,153, 67, 63, 54,155,113,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 77, 33,196, 63, 43, 52,221, 63, 75,153, 67, 63, 54,155,113, 63, 70,158,169, 63, 44,160,200, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 70,158,169, 63, 44,160,200, 63, 68, 84,124, 63, 55,204,255, 63, 64, 0, 0, 63, 45, 28, 24, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 75,153, 67,
- 63, 54,155,113, 63, 77, 33,196, 63, 43, 52,221, 63, 82,225,225, 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 82,225,225, 63, 52, 55,165,
- 63, 81,232, 16, 63, 63,233, 89, 63, 75,153, 67, 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,174, 74, 63, 65,236,193, 63, 75,153, 67,
- 63, 54,155,113, 63, 81,232, 16, 63, 63,233, 89, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 81,232, 16, 63, 63,233, 89, 63, 82,225,225, 63, 52, 55,165,
- 63, 89,153,138, 63, 60, 86, 49, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,139, 63, 71,153,255, 63, 89,153,138, 63, 82,228, 39, 63, 80,139,179,
- 63, 75, 39,164, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 80,139,179, 63, 75, 39,164, 63, 81,232, 16, 63, 63,233, 89, 63, 89,153,139, 63, 71,153,255,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 89,153,138, 63, 60, 86, 49, 63, 89,153,139, 63, 71,153,255, 63, 81,232, 16, 63, 63,233, 89, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 81,232, 16, 63, 63,233, 89, 63, 80,139,179, 63, 75, 39,164, 63, 73,174, 74, 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,139,
- 63, 49, 12, 79, 63, 89,153,138, 63, 60, 86, 49, 63, 82,225,225, 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 82,225,225, 63, 52, 55,165,
- 63, 83,124, 75, 63, 40,228,217, 63, 89,153,139, 63, 49, 12, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,139, 63, 37,200, 45, 63, 89,153,139,
- 63, 49, 12, 79, 63, 83,124, 75, 63, 40,228,217, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 83,124, 75, 63, 40,228,217, 63, 82,225,225, 63, 52, 55,165,
- 63, 77, 33,196, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 69,223,120, 63, 78, 83,198, 63, 73,174, 74, 63, 65,236,193, 63, 80,139,179,
- 63, 75, 39,164, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 80,139,179, 63, 75, 39,164, 63, 77,221,148, 63, 88, 64,140, 63, 69,223,120, 63, 78, 83,198,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 64, 0, 0, 63, 90, 56, 12, 63, 69,223,120, 63, 78, 83,198, 63, 77,221,148, 63, 88, 64,140, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 77,221,148, 63, 88, 64,140, 63, 80,139,179, 63, 75, 39,164, 63, 89,153,138, 63, 82,228, 39, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 69,223,120,
- 63, 78, 83,198, 63, 64, 0, 0, 63, 90, 56, 12, 63, 58, 32,136, 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 58, 32,136, 63, 78, 83,198,
- 63, 64, 0, 0, 63, 67, 23,106, 63, 69,223,120, 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,174, 74, 63, 65,236,193, 63, 69,223,120,
- 63, 78, 83,198, 63, 64, 0, 0, 63, 67, 23,106, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 63, 67, 23,106, 63, 58, 32,136, 63, 78, 83,198,
- 63, 54, 81,182, 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 59,171,132, 63, 55,204,255, 63, 64, 0, 0, 63, 45, 28, 24, 63, 68, 84,124,
- 63, 55,204,255, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 68, 84,124, 63, 55,204,255, 63, 64, 0, 0, 63, 67, 23,106, 63, 59,171,132, 63, 55,204,255,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 54, 81,182, 63, 65,236,193, 63, 59,171,132, 63, 55,204,255, 63, 64, 0, 0, 63, 67, 23,106, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 64, 0, 0, 63, 67, 23,106, 63, 68, 84,124, 63, 55,204,255, 63, 73,174, 74, 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 47,116, 77,
- 63, 75, 39,164, 63, 54, 81,182, 63, 65,236,193, 63, 58, 32,136, 63, 78, 83,198, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 58, 32,136, 63, 78, 83,198,
- 63, 50, 34,108, 63, 88, 64,140, 63, 47,116, 77, 63, 75, 39,164, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,118, 63, 82,228, 38, 63, 47,116, 77,
- 63, 75, 39,164, 63, 50, 34,108, 63, 88, 64,140, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 50, 34,108, 63, 88, 64,140, 63, 58, 32,136, 63, 78, 83,198,
- 63, 64, 0, 0, 63, 90, 56, 12, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 45, 30, 31, 63, 52, 55,165, 63, 38,102,117, 63, 60, 86, 50, 63, 38,102,117,
- 63, 49, 12, 78, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,117, 63, 49, 12, 78, 63, 44,131,181, 63, 40,228,216, 63, 45, 30, 31, 63, 52, 55,165,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 50,222, 60, 63, 43, 52,221, 63, 45, 30, 31, 63, 52, 55,165, 63, 44,131,181, 63, 40,228,216, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 44,131,181, 63, 40,228,216, 63, 38,102,117, 63, 49, 12, 78, 63, 38,102,117, 63, 37,200, 45, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 45, 30, 31,
- 63, 52, 55,165, 63, 50,222, 60, 63, 43, 52,221, 63, 52,102,189, 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 52,102,189, 63, 54,155,113,
- 63, 46, 23,240, 63, 63,233, 89, 63, 45, 30, 31, 63, 52, 55,165, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,117, 63, 60, 86, 50, 63, 45, 30, 31,
- 63, 52, 55,165, 63, 46, 23,240, 63, 63,233, 89, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 46, 23,240, 63, 63,233, 89, 63, 52,102,189, 63, 54,155,113,
- 63, 54, 81,182, 63, 65,236,193, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 47,116, 77, 63, 75, 39,164, 63, 38,102,118, 63, 82,228, 38, 63, 38,102,117,
- 63, 71,153,255, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,117, 63, 71,153,255, 63, 46, 23,240, 63, 63,233, 89, 63, 47,116, 77, 63, 75, 39,164,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 54, 81,182, 63, 65,236,193, 63, 47,116, 77, 63, 75, 39,164, 63, 46, 23,240, 63, 63,233, 89, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 46, 23,240, 63, 63,233, 89, 63, 38,102,117, 63, 71,153,255, 63, 38,102,117, 63, 60, 86, 50, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 59,171,132,
- 63, 55,204,255, 63, 54, 81,182, 63, 65,236,193, 63, 52,102,189, 63, 54,155,113, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 52,102,189, 63, 54,155,113,
- 63, 57, 97, 87, 63, 44,160,200, 63, 59,171,132, 63, 55,204,255, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 63, 45, 28, 24, 63, 59,171,132,
- 63, 55,204,255, 63, 57, 97, 87, 63, 44,160,200, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 57, 97, 87, 63, 44,160,200, 63, 52,102,189, 63, 54,155,113,
- 63, 50,222, 60, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 54,101,250, 63, 99, 26, 51, 63, 38,102,118, 63,105,114, 19, 63, 38,102,118,
- 63, 94, 46, 77, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,118, 63, 94, 46, 77, 63, 50, 34,108, 63, 88, 64,140, 63, 54,101,250, 63, 99, 26, 51,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 64, 0, 0, 63, 90, 56, 12, 63, 54,101,250, 63, 99, 26, 51, 63, 50, 34,108, 63, 88, 64,140, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 50, 34,108, 63, 88, 64,140, 63, 38,102,118, 63, 94, 46, 77, 63, 38,102,118, 63, 82,228, 38, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 54,101,250,
- 63, 99, 26, 51, 63, 64, 0, 0, 63, 90, 56, 12, 63, 73,154, 6, 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,154, 6, 63, 99, 26, 51,
- 63, 64, 0, 0, 63,109,154,206, 63, 54,101,250, 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,118, 63,105,114, 19, 63, 54,101,250,
- 63, 99, 26, 51, 63, 64, 0, 0, 63,109,154,206, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 63,109,154,206, 63, 73,154, 6, 63, 99, 26, 51,
- 63, 89,153,138, 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,136, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 63, 38,102,120,
- 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,120, 63,116,187,242, 63, 64, 0, 0, 63,109,154,206, 63, 89,153,136, 63,116,187,242,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 89,153,138, 63,105,114, 19, 63, 89,153,136, 63,116,187,242, 63, 64, 0, 0, 63,109,154,206, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 64, 0, 0, 63,109,154,206, 63, 38,102,120, 63,116,187,242, 63, 38,102,118, 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,138,
- 63, 94, 46, 77, 63, 89,153,138, 63,105,114, 19, 63, 73,154, 6, 63, 99, 26, 51, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,154, 6, 63, 99, 26, 51,
- 63, 77,221,148, 63, 88, 64,140, 63, 89,153,138, 63, 94, 46, 77, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,138, 63, 82,228, 39, 63, 89,153,138,
- 63, 94, 46, 77, 63, 77,221,148, 63, 88, 64,140, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 77,221,148, 63, 88, 64,140, 63, 73,154, 6, 63, 99, 26, 51,
- 63, 64, 0, 0, 63, 90, 56, 12, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 8, 71,167, 63, 55,205, 7, 61,229,192,170, 63, 65,236,200, 61,214,104,203,
- 63, 54,155,120, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,214,104,203, 63, 54,155,120, 61,254, 61,201, 63, 44,160,207, 62, 8, 71,167, 63, 55,205, 7,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 25,153,173, 63, 45, 28, 27, 62, 8, 71,167, 63, 55,205, 7, 61,254, 61,201, 63, 44,160,207, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,254, 61,201, 63, 44,160,207, 61,214,104,203, 63, 54,155,120, 61,202, 36,175, 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,156, 35,145,
- 63, 52, 55,172, 61,202, 36,175, 63, 43, 52,228, 61,214,104,203, 63, 54,155,120, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,214,104,203, 63, 54,155,120,
- 61,163,242, 32, 63, 63,233, 96, 61,156, 35,145, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,203,246, 63, 60, 86, 53, 61,156, 35,145,
- 63, 52, 55,172, 61,163,242, 32, 63, 63,233, 96, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,163,242, 32, 63, 63,233, 96, 61,214,104,203, 63, 54,155,120,
- 61,229,192,170, 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,174,213, 17, 63, 75, 39,171, 61, 76,203,243, 63, 82,228, 41, 61, 76,203,244,
- 63, 71,154, 2, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,203,244, 63, 71,154, 2, 61,163,242, 32, 63, 63,233, 96, 61,174,213, 17, 63, 75, 39,171,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,229,192,170, 63, 65,236,200, 61,174,213, 17, 63, 75, 39,171, 61,163,242, 32, 63, 63,233, 96, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,163,242, 32, 63, 63,233, 96, 61, 76,203,244, 63, 71,154, 2, 61, 76,203,246, 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,156, 35,145,
- 63, 52, 55,172, 61, 76,203,246, 63, 60, 86, 53, 61, 76,203,243, 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,203,243, 63, 49, 12, 82,
- 61,151, 80, 53, 63, 40,228,223, 61,156, 35,145, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,202, 36,175, 63, 43, 52,228, 61,156, 35,145,
- 63, 52, 55,172, 61,151, 80, 53, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,151, 80, 53, 63, 40,228,223, 61, 76,203,243, 63, 49, 12, 82,
- 61, 76,203,246, 63, 37,200, 48, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,174,213, 17, 63, 75, 39,171, 61,229,192,170, 63, 65,236,200, 62, 2, 27,169,
- 63, 78, 83,204, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 27,169, 63, 78, 83,204, 61,196, 70, 23, 63, 88, 64,147, 61,174,213, 17, 63, 75, 39,171,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61, 76,203,243, 63, 82,228, 41, 61,174,213, 17, 63, 75, 39,171, 61,196, 70, 23, 63, 88, 64,147, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,196, 70, 23, 63, 88, 64,147, 62, 2, 27,169, 63, 78, 83,204, 62, 25,153,160, 63, 90, 56, 14, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 49, 23,162,
- 63, 78, 83,195, 62, 25,153,160, 63, 90, 56, 14, 62, 2, 27,169, 63, 78, 83,204, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 27,169, 63, 78, 83,204,
- 62, 25,153,172, 63, 67, 23,108, 62, 49, 23,162, 63, 78, 83,195, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 64, 82,240, 63, 65,236,183, 62, 49, 23,162,
- 63, 78, 83,195, 62, 25,153,172, 63, 67, 23,108, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,172, 63, 67, 23,108, 62, 2, 27,169, 63, 78, 83,204,
- 61,229,192,170, 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 8, 71,167, 63, 55,205, 7, 62, 25,153,173, 63, 45, 28, 27, 62, 42,235,173,
- 63, 55,204,254, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 42,235,173, 63, 55,204,254, 62, 25,153,172, 63, 67, 23,108, 62, 8, 71,167, 63, 55,205, 7,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,229,192,170, 63, 65,236,200, 62, 8, 71,167, 63, 55,205, 7, 62, 25,153,172, 63, 67, 23,108, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 25,153,172, 63, 67, 23,108, 62, 42,235,173, 63, 55,204,254, 62, 64, 82,240, 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 49, 23,162,
- 63, 78, 83,195, 62, 64, 82,240, 63, 65,236,183, 62, 91,200,166, 63, 75, 39,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 91,200,166, 63, 75, 39,147,
- 62, 81, 16, 34, 63, 88, 64,131, 62, 49, 23,162, 63, 78, 83,195, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,160, 63, 90, 56, 14, 62, 49, 23,162,
- 63, 78, 83,195, 62, 81, 16, 34, 63, 88, 64,131, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 81, 16, 34, 63, 88, 64,131, 62, 91,200,166, 63, 75, 39,147,
- 62,128, 0, 0, 63, 82,228, 13, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 49, 12, 47, 62,128, 0, 0, 63, 60, 86, 19, 62,101, 33, 92,
- 63, 52, 55,146, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,101, 33, 92, 63, 52, 55,146, 62,103,139, 14, 63, 40,228,199, 62,128, 0, 0, 63, 49, 12, 47,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,128, 0, 0, 63, 37,200, 23, 62,128, 0, 0, 63, 49, 12, 47, 62,103,139, 14, 63, 40,228,199, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,103,139, 14, 63, 40,228,199, 62,101, 33, 92, 63, 52, 55,146, 62, 78, 32,230, 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 71,254,223,
- 63, 54,155,102, 62, 78, 32,230, 63, 43, 52,211, 62,101, 33, 92, 63, 52, 55,146, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,101, 33, 92, 63, 52, 55,146,
- 62, 97, 58, 23, 63, 63,233, 69, 62, 71,254,223, 63, 54,155,102, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 64, 82,240, 63, 65,236,183, 62, 71,254,223,
- 63, 54,155,102, 62, 97, 58, 23, 63, 63,233, 69, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 97, 58, 23, 63, 63,233, 69, 62,101, 33, 92, 63, 52, 55,146,
- 62,128, 0, 0, 63, 60, 86, 19, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 71,153,228, 62,128, 0, 0, 63, 82,228, 13, 62, 91,200,166,
- 63, 75, 39,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 91,200,166, 63, 75, 39,147, 62, 97, 58, 23, 63, 63,233, 69, 62,128, 0, 0, 63, 71,153,228,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,128, 0, 0, 63, 60, 86, 19, 62,128, 0, 0, 63, 71,153,228, 62, 97, 58, 23, 63, 63,233, 69, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 97, 58, 23, 63, 63,233, 69, 62, 91,200,166, 63, 75, 39,147, 62, 64, 82,240, 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 71,254,223,
- 63, 54,155,102, 62, 64, 82,240, 63, 65,236,183, 62, 42,235,173, 63, 55,204,254, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 42,235,173, 63, 55,204,254,
- 62, 52, 20,105, 63, 44,160,198, 62, 71,254,223, 63, 54,155,102, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 78, 32,230, 63, 43, 52,211, 62, 71,254,223,
- 63, 54,155,102, 62, 52, 20,105, 63, 44,160,198, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 52, 20,105, 63, 44,160,198, 62, 42,235,173, 63, 55,204,254,
- 62, 25,153,173, 63, 45, 28, 27, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 94, 46, 58, 62,128, 0, 0, 63,105,114, 8, 62, 64, 1,230,
- 63, 99, 26, 49, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 64, 1,230, 63, 99, 26, 49, 62, 81, 16, 34, 63, 88, 64,131, 62,128, 0, 0, 63, 94, 46, 58,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,128, 0, 0, 63, 82,228, 13, 62,128, 0, 0, 63, 94, 46, 58, 62, 81, 16, 34, 63, 88, 64,131, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 81, 16, 34, 63, 88, 64,131, 62, 64, 1,230, 63, 99, 26, 49, 62, 25,153,160, 63, 90, 56, 14, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,230, 98,164,
- 63, 99, 26, 58, 62, 25,153,160, 63, 90, 56, 14, 62, 64, 1,230, 63, 99, 26, 49, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 64, 1,230, 63, 99, 26, 49,
- 62, 25,153,159, 63,109,154,210, 61,230, 98,164, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,203,237, 63,105,114, 22, 61,230, 98,164,
- 63, 99, 26, 58, 62, 25,153,159, 63,109,154,210, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,159, 63,109,154,210, 62, 64, 1,230, 63, 99, 26, 49,
- 62,128, 0, 0, 63,105,114, 8, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,116,187,232, 63, 59,153, 3, 63,128, 0, 0, 63,134,102, 95,
- 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,203,210, 63,116,187,242, 62, 25,153,159, 63,109,154,210, 62,128, 0, 0, 63,116,187,232,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,128, 0, 0, 63,105,114, 8, 62,128, 0, 0, 63,116,187,232, 62, 25,153,159, 63,109,154,210, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 25,153,159, 63,109,154,210, 61, 76,203,210, 63,116,187,242, 61, 76,203,237, 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,230, 98,164,
- 63, 99, 26, 58, 61, 76,203,237, 63,105,114, 22, 61, 76,203,234, 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,203,234, 63, 94, 46, 79,
- 61,196, 70, 23, 63, 88, 64,147, 61,230, 98,164, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,160, 63, 90, 56, 14, 61,230, 98,164,
- 63, 99, 26, 58, 61,196, 70, 23, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,196, 70, 23, 63, 88, 64,147, 61, 76,203,234, 63, 94, 46, 79,
- 61, 76,203,243, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,170,138, 42, 63, 55,204,254, 62,159,214,136, 63, 65,236,183, 62,156, 0,145,
- 63, 54,155,102, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,156, 0,145, 63, 54,155,102, 62,165,245,204, 63, 44,160,198, 62,170,138, 42, 63, 55,204,254,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,179, 51, 42, 63, 45, 28, 28, 62,170,138, 42, 63, 55,204,254, 62,165,245,204, 63, 44,160,198, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,165,245,204, 63, 44,160,198, 62,156, 0,145, 63, 54,155,102, 62,152,239,141, 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,141,111, 82,
- 63, 52, 55,146, 62,152,239,141, 63, 43, 52,211, 62,156, 0,145, 63, 54,155,102, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,156, 0,145, 63, 54,155,102,
- 62,143, 98,245, 63, 63,233, 68, 62,141,111, 82, 63, 52, 55,146, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 60, 86, 19, 62,141,111, 82,
- 63, 52, 55,146, 62,143, 98,245, 63, 63,233, 68, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,143, 98,245, 63, 63,233, 68, 62,156, 0,145, 63, 54,155,102,
- 62,159,214,136, 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,146, 27,173, 63, 75, 39,147, 62,128, 0, 0, 63, 82,228, 13, 62,128, 0, 0,
- 63, 71,153,228, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 71,153,228, 62,143, 98,245, 63, 63,233, 68, 62,146, 27,173, 63, 75, 39,147,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,159,214,136, 63, 65,236,183, 62,146, 27,173, 63, 75, 39,147, 62,143, 98,245, 63, 63,233, 68, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,143, 98,245, 63, 63,233, 68, 62,128, 0, 0, 63, 71,153,228, 62,128, 0, 0, 63, 60, 86, 19, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,141,111, 82,
- 63, 52, 55,146, 62,128, 0, 0, 63, 60, 86, 19, 62,128, 0, 0, 63, 49, 12, 47, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 49, 12, 47,
- 62,140, 58,121, 63, 40,228,199, 62,141,111, 82, 63, 52, 55,146, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,152,239,141, 63, 43, 52,211, 62,141,111, 82,
- 63, 52, 55,146, 62,140, 58,121, 63, 40,228,199, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,140, 58,121, 63, 40,228,199, 62,128, 0, 0, 63, 49, 12, 47,
- 62,128, 0, 0, 63, 37,200, 23, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,146, 27,173, 63, 75, 39,147, 62,159,214,136, 63, 65,236,183, 62,167,116, 47,
- 63, 78, 83,195, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,167,116, 47, 63, 78, 83,195, 62,151,119,239, 63, 88, 64,131, 62,146, 27,173, 63, 75, 39,147,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,128, 0, 0, 63, 82,228, 13, 62,146, 27,173, 63, 75, 39,147, 62,151,119,239, 63, 88, 64,131, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,151,119,239, 63, 88, 64,131, 62,167,116, 47, 63, 78, 83,195, 62,179, 51, 49, 63, 90, 56, 14, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,190,242, 44,
- 63, 78, 83,205, 62,179, 51, 49, 63, 90, 56, 14, 62,167,116, 47, 63, 78, 83,195, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,167,116, 47, 63, 78, 83,195,
- 62,179, 51, 42, 63, 67, 23,108, 62,190,242, 44, 63, 78, 83,205, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,198,143,214, 63, 65,236,200, 62,190,242, 44,
- 63, 78, 83,205, 62,179, 51, 42, 63, 67, 23,108, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 42, 63, 67, 23,108, 62,167,116, 47, 63, 78, 83,195,
- 62,159,214,136, 63, 65,236,183, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,170,138, 42, 63, 55,204,254, 62,179, 51, 42, 63, 45, 28, 28, 62,187,220, 45,
- 63, 55,205, 7, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,187,220, 45, 63, 55,205, 7, 62,179, 51, 42, 63, 67, 23,108, 62,170,138, 42, 63, 55,204,254,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,159,214,136, 63, 65,236,183, 62,170,138, 42, 63, 55,204,254, 62,179, 51, 42, 63, 67, 23,108, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,179, 51, 42, 63, 67, 23,108, 62,187,220, 45, 63, 55,205, 7, 62,198,143,214, 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,190,242, 44,
- 63, 78, 83,205, 62,198,143,214, 63, 65,236,200, 62,212, 74,188, 63, 75, 39,171, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,212, 74,188, 63, 75, 39,171,
- 62,206,238,122, 63, 88, 64,147, 62,190,242, 44, 63, 78, 83,205, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 49, 63, 90, 56, 14, 62,190,242, 44,
- 63, 78, 83,205, 62,206,238,122, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,206,238,122, 63, 88, 64,147, 62,212, 74,188, 63, 75, 39,171,
- 62,230,102,130, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,130, 63, 49, 12, 82, 62,230,102,129, 63, 60, 86, 53, 62,216,247, 28,
- 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,216,247, 28, 63, 52, 55,172, 62,218, 43,243, 63, 40,228,223, 62,230,102,130, 63, 49, 12, 82,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,230,102,129, 63, 37,200, 48, 62,230,102,130, 63, 49, 12, 82, 62,218, 43,243, 63, 40,228,223, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,218, 43,243, 63, 40,228,223, 62,216,247, 28, 63, 52, 55,172, 62,205,118,212, 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,202,101,206,
- 63, 54,155,120, 62,205,118,212, 63, 43, 52,228, 62,216,247, 28, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,216,247, 28, 63, 52, 55,172,
- 62,215, 3,120, 63, 63,233, 95, 62,202,101,206, 63, 54,155,120, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,198,143,214, 63, 65,236,200, 62,202,101,206,
- 63, 54,155,120, 62,215, 3,120, 63, 63,233, 95, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,215, 3,120, 63, 63,233, 95, 62,216,247, 28, 63, 52, 55,172,
- 62,230,102,129, 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,130, 63, 71,154, 1, 62,230,102,130, 63, 82,228, 41, 62,212, 74,188,
- 63, 75, 39,171, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,212, 74,188, 63, 75, 39,171, 62,215, 3,120, 63, 63,233, 95, 62,230,102,130, 63, 71,154, 1,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,230,102,129, 63, 60, 86, 53, 62,230,102,130, 63, 71,154, 1, 62,215, 3,120, 63, 63,233, 95, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,215, 3,120, 63, 63,233, 95, 62,212, 74,188, 63, 75, 39,171, 62,198,143,214, 63, 65,236,200, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,202,101,206,
- 63, 54,155,120, 62,198,143,214, 63, 65,236,200, 62,187,220, 45, 63, 55,205, 7, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,187,220, 45, 63, 55,205, 7,
- 62,192,112,142, 63, 44,160,207, 62,202,101,206, 63, 54,155,120, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,205,118,212, 63, 43, 52,228, 62,202,101,206,
- 63, 54,155,120, 62,192,112,142, 63, 44,160,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,192,112,142, 63, 44,160,207, 62,187,220, 45, 63, 55,205, 7,
- 62,179, 51, 42, 63, 45, 28, 28, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,131, 63, 94, 46, 79, 62,230,102,131, 63,105,114, 22, 62,198,103, 87,
- 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,198,103, 87, 63, 99, 26, 58, 62,206,238,122, 63, 88, 64,147, 62,230,102,131, 63, 94, 46, 79,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,230,102,130, 63, 82,228, 41, 62,230,102,131, 63, 94, 46, 79, 62,206,238,122, 63, 88, 64,147, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,206,238,122, 63, 88, 64,147, 62,198,103, 87, 63, 99, 26, 58, 62,179, 51, 49, 63, 90, 56, 14, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,159,255, 14,
- 63, 99, 26, 49, 62,179, 51, 49, 63, 90, 56, 14, 62,198,103, 87, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,198,103, 87, 63, 99, 26, 58,
- 62,179, 51, 49, 63,109,154,210, 62,159,255, 14, 63, 99, 26, 49, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,105,114, 8, 62,159,255, 14,
- 63, 99, 26, 49, 62,179, 51, 49, 63,109,154,210, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 49, 63,109,154,210, 62,198,103, 87, 63, 99, 26, 58,
- 62,230,102,131, 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,134, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 62,128, 0, 0,
- 63,116,187,232, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63,116,187,232, 62,179, 51, 49, 63,109,154,210, 62,230,102,134, 63,116,187,242,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,230,102,131, 63,105,114, 22, 62,230,102,134, 63,116,187,242, 62,179, 51, 49, 63,109,154,210, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,179, 51, 49, 63,109,154,210, 62,128, 0, 0, 63,116,187,232, 62,128, 0, 0, 63,105,114, 8, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,159,255, 14,
- 63, 99, 26, 49, 62,128, 0, 0, 63,105,114, 8, 62,128, 0, 0, 63, 94, 46, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 94, 46, 58,
- 62,151,119,239, 63, 88, 64,131, 62,159,255, 14, 63, 99, 26, 49, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 49, 63, 90, 56, 14, 62,159,255, 14,
- 63, 99, 26, 49, 62,151,119,239, 63, 88, 64,131, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,151,119,239, 63, 88, 64,131, 62,128, 0, 0, 63, 94, 46, 58,
- 62,128, 0, 0, 63, 82,228, 13, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 8,120, 93, 63, 55,205, 11, 63, 3, 30,140, 63, 65,236,201, 63, 1, 51,145,
- 63, 54,155,121, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 51,145, 63, 54,155,121, 63, 6, 46, 46, 63, 44,160,211, 63, 8,120, 93, 63, 55,205, 11,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 12,204,220, 63, 45, 28, 35, 63, 8,120, 93, 63, 55,205, 11, 63, 6, 46, 46, 63, 44,160,211, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 6, 46, 46, 63, 44,160,211, 63, 1, 51,145, 63, 54,155,121, 62,255, 86, 30, 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,243,213,222,
- 63, 52, 55,172, 62,255, 86, 30, 63, 43, 52,230, 63, 1, 51,145, 63, 54,155,121, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 51,145, 63, 54,155,121,
- 62,245,201,128, 63, 63,233, 94, 62,243,213,222, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,129, 63, 60, 86, 53, 62,243,213,222,
- 63, 52, 55,172, 62,245,201,128, 63, 63,233, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,245,201,128, 63, 63,233, 94, 63, 1, 51,145, 63, 54,155,121,
- 63, 3, 30,140, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,248,130, 59, 63, 75, 39,169, 62,230,102,130, 63, 82,228, 41, 62,230,102,130,
- 63, 71,154, 1, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,130, 63, 71,154, 1, 62,245,201,128, 63, 63,233, 94, 62,248,130, 59, 63, 75, 39,169,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 3, 30,140, 63, 65,236,201, 62,248,130, 59, 63, 75, 39,169, 62,245,201,128, 63, 63,233, 94, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,245,201,128, 63, 63,233, 94, 62,230,102,130, 63, 71,154, 1, 62,230,102,129, 63, 60, 86, 53, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,243,213,222,
- 63, 52, 55,172, 62,230,102,129, 63, 60, 86, 53, 62,230,102,130, 63, 49, 12, 82, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,130, 63, 49, 12, 82,
- 62,242,161, 9, 63, 40,228,223, 62,243,213,222, 63, 52, 55,172, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,255, 86, 30, 63, 43, 52,230, 62,243,213,222,
- 63, 52, 55,172, 62,242,161, 9, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,242,161, 9, 63, 40,228,223, 62,230,102,130, 63, 49, 12, 82,
- 62,230,102,129, 63, 37,200, 48, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,248,130, 59, 63, 75, 39,169, 63, 3, 30,140, 63, 65,236,201, 63, 6,237, 94,
- 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 6,237, 94, 63, 78, 83,207, 62,253,222,118, 63, 88, 64,148, 62,248,130, 59, 63, 75, 39,169,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,230,102,130, 63, 82,228, 41, 62,248,130, 59, 63, 75, 39,169, 62,253,222,118, 63, 88, 64,148, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,253,222,118, 63, 88, 64,148, 63, 6,237, 94, 63, 78, 83,207, 63, 12,204,220, 63, 90, 56, 22, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 18,172, 88,
- 63, 78, 83,207, 63, 12,204,220, 63, 90, 56, 22, 63, 6,237, 94, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6,237, 94, 63, 78, 83,207,
- 63, 12,204,220, 63, 67, 23,115, 63, 18,172, 88, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 22,123, 44, 63, 65,236,201, 63, 18,172, 88,
- 63, 78, 83,207, 63, 12,204,220, 63, 67, 23,115, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,220, 63, 67, 23,115, 63, 6,237, 94, 63, 78, 83,207,
- 63, 3, 30,140, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 8,120, 93, 63, 55,205, 11, 63, 12,204,220, 63, 45, 28, 35, 63, 17, 33, 91,
- 63, 55,205, 9, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 17, 33, 91, 63, 55,205, 9, 63, 12,204,220, 63, 67, 23,115, 63, 8,120, 93, 63, 55,205, 11,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 3, 30,140, 63, 65,236,201, 63, 8,120, 93, 63, 55,205, 11, 63, 12,204,220, 63, 67, 23,115, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 12,204,220, 63, 67, 23,115, 63, 17, 33, 91, 63, 55,205, 9, 63, 22,123, 44, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 18,172, 88,
- 63, 78, 83,207, 63, 22,123, 44, 63, 65,236,201, 63, 29, 88,153, 63, 75, 39,167, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 29, 88,153, 63, 75, 39,167,
- 63, 26,170,121, 63, 88, 64,147, 63, 18,172, 88, 63, 78, 83,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,220, 63, 90, 56, 22, 63, 18,172, 88,
- 63, 78, 83,207, 63, 26,170,121, 63, 88, 64,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 26,170,121, 63, 88, 64,147, 63, 29, 88,153, 63, 75, 39,167,
- 63, 38,102,118, 63, 82,228, 38, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,117, 63, 49, 12, 78, 63, 38,102,117, 63, 60, 86, 50, 63, 31,174,200,
- 63, 52, 55,169, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 31,174,200, 63, 52, 55,169, 63, 32, 73, 51, 63, 40,228,221, 63, 38,102,117, 63, 49, 12, 78,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,102,117, 63, 37,200, 45, 63, 38,102,117, 63, 49, 12, 78, 63, 32, 73, 51, 63, 40,228,221, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 32, 73, 51, 63, 40,228,221, 63, 31,174,200, 63, 52, 55,169, 63, 25,238,169, 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 24,102, 39,
- 63, 54,155,119, 63, 25,238,169, 63, 43, 52,229, 63, 31,174,200, 63, 52, 55,169, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 31,174,200, 63, 52, 55,169,
- 63, 30,180,246, 63, 63,233, 92, 63, 24,102, 39, 63, 54,155,119, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 22,123, 44, 63, 65,236,201, 63, 24,102, 39,
- 63, 54,155,119, 63, 30,180,246, 63, 63,233, 92, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 30,180,246, 63, 63,233, 92, 63, 31,174,200, 63, 52, 55,169,
- 63, 38,102,117, 63, 60, 86, 50, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,117, 63, 71,153,255, 63, 38,102,118, 63, 82,228, 38, 63, 29, 88,153,
- 63, 75, 39,167, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 29, 88,153, 63, 75, 39,167, 63, 30,180,246, 63, 63,233, 92, 63, 38,102,117, 63, 71,153,255,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,102,117, 63, 60, 86, 50, 63, 38,102,117, 63, 71,153,255, 63, 30,180,246, 63, 63,233, 92, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 30,180,246, 63, 63,233, 92, 63, 29, 88,153, 63, 75, 39,167, 63, 22,123, 44, 63, 65,236,201, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 24,102, 39,
- 63, 54,155,119, 63, 22,123, 44, 63, 65,236,201, 63, 17, 33, 91, 63, 55,205, 9, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 17, 33, 91, 63, 55,205, 9,
- 63, 19,107,138, 63, 44,160,211, 63, 24,102, 39, 63, 54,155,119, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 25,238,169, 63, 43, 52,229, 63, 24,102, 39,
- 63, 54,155,119, 63, 19,107,138, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 19,107,138, 63, 44,160,211, 63, 17, 33, 91, 63, 55,205, 9,
- 63, 12,204,220, 63, 45, 28, 35, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,118, 63, 94, 46, 77, 63, 38,102,118, 63,105,114, 19, 63, 22,102,235,
- 63, 99, 26, 59, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 22,102,235, 63, 99, 26, 59, 63, 26,170,121, 63, 88, 64,147, 63, 38,102,118, 63, 94, 46, 77,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,102,118, 63, 82,228, 38, 63, 38,102,118, 63, 94, 46, 77, 63, 26,170,121, 63, 88, 64,147, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 26,170,121, 63, 88, 64,147, 63, 22,102,235, 63, 99, 26, 59, 63, 12,204,220, 63, 90, 56, 22, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 3, 50,204,
- 63, 99, 26, 58, 63, 12,204,220, 63, 90, 56, 22, 63, 22,102,235, 63, 99, 26, 59, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 22,102,235, 63, 99, 26, 59,
- 63, 12,204,224, 63,109,154,212, 63, 3, 50,204, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,131, 63,105,114, 22, 63, 3, 50,204,
- 63, 99, 26, 58, 63, 12,204,224, 63,109,154,212, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,224, 63,109,154,212, 63, 22,102,235, 63, 99, 26, 59,
- 63, 38,102,118, 63,105,114, 19, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,120, 63,116,187,242, 63, 59,153, 3, 63,128, 0, 0, 62,230,102,134,
- 63,116,187,242, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,134, 63,116,187,242, 63, 12,204,224, 63,109,154,212, 63, 38,102,120, 63,116,187,242,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,102,118, 63,105,114, 19, 63, 38,102,120, 63,116,187,242, 63, 12,204,224, 63,109,154,212, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 12,204,224, 63,109,154,212, 62,230,102,134, 63,116,187,242, 62,230,102,131, 63,105,114, 22, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 3, 50,204,
- 63, 99, 26, 58, 62,230,102,131, 63,105,114, 22, 62,230,102,131, 63, 94, 46, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,131, 63, 94, 46, 79,
- 62,253,222,118, 63, 88, 64,148, 63, 3, 50,204, 63, 99, 26, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,220, 63, 90, 56, 22, 63, 3, 50,204,
- 63, 99, 26, 58, 62,253,222,118, 63, 88, 64,148, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,253,222,118, 63, 88, 64,148, 62,230,102,131, 63, 94, 46, 79,
- 62,230,102,130, 63, 82,228, 41, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,233,213, 63, 21, 48, 35, 63, 70,235,176, 63, 22,209,226, 63, 73,234, 80,
- 63, 11,111,146, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,234, 80, 63, 11,111,146, 63, 79,200, 1, 63, 9,152, 94, 63, 76,233,213, 63, 21, 48, 35,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 82,215, 19, 63, 19, 29,252, 63, 76,233,213, 63, 21, 48, 35, 63, 79,200, 1, 63, 9,152, 94, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 79,200, 1, 63, 9,152, 94, 63, 73,234, 80, 63, 11,111,146, 63, 76,204,193, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,233,213,
- 63, 21, 48, 35, 63, 82,215, 19, 63, 19, 29,252, 63, 80, 41,220, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 80, 41,220, 63, 31, 60,105,
- 63, 73,219,164, 63, 33, 23,173, 63, 76,233,213, 63, 21, 48, 35, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70,235,176, 63, 22,209,226, 63, 76,233,213,
- 63, 21, 48, 35, 63, 73,219,164, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,219,164, 63, 33, 23,173, 63, 80, 41,220, 63, 31, 60,105,
- 63, 77, 33,196, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70,158,169, 63, 44,160,200, 63, 64, 0, 0, 63, 45, 28, 24, 63, 67,171, 5,
- 63, 34, 17,216, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 67,171, 5, 63, 34, 17,216, 63, 73,219,164, 63, 33, 23,173, 63, 70,158,169, 63, 44,160,200,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 77, 33,196, 63, 43, 52,221, 63, 70,158,169, 63, 44,160,200, 63, 73,219,164, 63, 33, 23,173, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 73,219,164, 63, 33, 23,173, 63, 67,171, 5, 63, 34, 17,216, 63, 70,235,176, 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 83,124, 75,
- 63, 40,228,217, 63, 77, 33,196, 63, 43, 52,221, 63, 80, 41,220, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 80, 41,220, 63, 31, 60,105,
- 63, 86, 20,218, 63, 28,140,143, 63, 83,124, 75, 63, 40,228,217, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,139, 63, 37,200, 45, 63, 83,124, 75,
- 63, 40,228,217, 63, 86, 20,218, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 86, 20,218, 63, 28,140,143, 63, 80, 41,220, 63, 31, 60,105,
- 63, 82,215, 19, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 63, 23, 32,182, 63, 70,235,176, 63, 22,209,226, 63, 67,171, 5,
- 63, 34, 17,216, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 67,171, 5, 63, 34, 17,216, 63, 60, 84,251, 63, 34, 17,216, 63, 64, 0, 0, 63, 23, 32,182,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 57, 20, 80, 63, 22,209,226, 63, 64, 0, 0, 63, 23, 32,182, 63, 60, 84,251, 63, 34, 17,216, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 60, 84,251, 63, 34, 17,216, 63, 67,171, 5, 63, 34, 17,216, 63, 64, 0, 0, 63, 45, 28, 24, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0,
- 63, 23, 32,182, 63, 57, 20, 80, 63, 22,209,226, 63, 60,156,169, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 60,156,169, 63, 11,116, 96,
- 63, 67, 99, 87, 63, 11,116, 96, 63, 64, 0, 0, 63, 23, 32,182, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70,235,176, 63, 22,209,226, 63, 64, 0, 0,
- 63, 23, 32,182, 63, 67, 99, 87, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 67, 99, 87, 63, 11,116, 96, 63, 60,156,169, 63, 11,116, 96,
- 63, 64, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70,102, 96, 63, 0, 1,244, 63, 76,204,193, 63, 0, 0, 0, 63, 73,234, 80,
- 63, 11,111,146, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,234, 80, 63, 11,111,146, 63, 67, 99, 87, 63, 11,116, 96, 63, 70,102, 96, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 64, 0, 0, 63, 0, 0, 0, 63, 70,102, 96, 63, 0, 1,244, 63, 67, 99, 87, 63, 11,116, 96, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 67, 99, 87, 63, 11,116, 96, 63, 73,234, 80, 63, 11,111,146, 63, 70,235,176, 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 57,153,160,
- 63, 0, 1,244, 63, 64, 0, 0, 63, 0, 0, 0, 63, 60,156,169, 63, 11,116, 96, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 60,156,169, 63, 11,116, 96,
- 63, 54, 21,176, 63, 11,111,146, 63, 57,153,160, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 51, 51, 63, 63, 0, 0, 0, 63, 57,153,160,
- 63, 0, 1,244, 63, 54, 21,176, 63, 11,111,146, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 54, 21,176, 63, 11,111,146, 63, 60,156,169, 63, 11,116, 96,
- 63, 57, 20, 80, 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62,217, 58, 93, 63, 57, 61,144, 62,217,196, 19, 63, 60,123, 85,
- 62,198,230,253, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 60,123, 85, 62,198,230,253, 63, 67,132,171, 62,198,230,253, 63, 64, 0, 0, 62,217, 58, 93,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 70,194,112, 62,217,196, 19, 63, 64, 0, 0, 62,217, 58, 93, 63, 67,132,171, 62,198,230,253, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 67,132,171, 62,198,230,253, 63, 60,123, 85, 62,198,230,253, 63, 64, 0, 0, 62,180,111,211, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0,
- 62,217, 58, 93, 63, 70,194,112, 62,217,196, 19, 63, 67, 84,125, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 67, 84,125, 62,236,211, 42,
- 63, 60,171,131, 62,236,211, 42, 63, 64, 0, 0, 62,217, 58, 93, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 57, 61,144, 62,217,196, 19, 63, 64, 0, 0,
- 62,217, 58, 93, 63, 60,171,131, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 60,171,131, 62,236,211, 42, 63, 67, 84,125, 62,236,211, 42,
- 63, 64, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 57,153,160, 63, 0, 1,244, 63, 51, 51, 63, 63, 0, 0, 0, 63, 54, 46,128,
- 62,236,207, 75, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 54, 46,128, 62,236,207, 75, 63, 60,171,131, 62,236,211, 42, 63, 57,153,160, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 64, 0, 0, 63, 0, 0, 0, 63, 57,153,160, 63, 0, 1,244, 63, 60,171,131, 62,236,211, 42, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 60,171,131, 62,236,211, 42, 63, 54, 46,128, 62,236,207, 75, 63, 57, 61,144, 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70,102, 96,
- 63, 0, 1,244, 63, 64, 0, 0, 63, 0, 0, 0, 63, 67, 84,125, 62,236,211, 42, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 67, 84,125, 62,236,211, 42,
- 63, 73,209,128, 62,236,207, 75, 63, 70,102, 96, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,204,193, 63, 0, 0, 0, 63, 70,102, 96,
- 63, 0, 1,244, 63, 73,209,128, 62,236,207, 75, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,209,128, 62,236,207, 75, 63, 67, 84,125, 62,236,211, 42,
- 63, 70,194,112, 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 51, 22, 43, 63, 21, 48, 35, 63, 45, 40,237, 63, 19, 29,252, 63, 48, 55,255,
- 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 55,255, 63, 9,152, 94, 63, 54, 21,176, 63, 11,111,146, 63, 51, 22, 43, 63, 21, 48, 35,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 57, 20, 80, 63, 22,209,226, 63, 51, 22, 43, 63, 21, 48, 35, 63, 54, 21,176, 63, 11,111,146, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 54, 21,176, 63, 11,111,146, 63, 48, 55,255, 63, 9,152, 94, 63, 51, 51, 63, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 51, 22, 43,
- 63, 21, 48, 35, 63, 57, 20, 80, 63, 22,209,226, 63, 54, 36, 91, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 54, 36, 91, 63, 33, 23,173,
- 63, 47,214, 36, 63, 31, 60,105, 63, 51, 22, 43, 63, 21, 48, 35, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 45, 40,237, 63, 19, 29,252, 63, 51, 22, 43,
- 63, 21, 48, 35, 63, 47,214, 36, 63, 31, 60,105, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 47,214, 36, 63, 31, 60,105, 63, 54, 36, 91, 63, 33, 23,173,
- 63, 50,222, 60, 63, 43, 52,221, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 44,131,181, 63, 40,228,216, 63, 38,102,117, 63, 37,200, 45, 63, 41,235, 38,
- 63, 28,140,141, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 41,235, 38, 63, 28,140,141, 63, 47,214, 36, 63, 31, 60,105, 63, 44,131,181, 63, 40,228,216,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 50,222, 60, 63, 43, 52,221, 63, 44,131,181, 63, 40,228,216, 63, 47,214, 36, 63, 31, 60,105, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 47,214, 36, 63, 31, 60,105, 63, 41,235, 38, 63, 28,140,141, 63, 45, 40,237, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 57, 97, 87,
- 63, 44,160,200, 63, 50,222, 60, 63, 43, 52,221, 63, 54, 36, 91, 63, 33, 23,173, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 54, 36, 91, 63, 33, 23,173,
- 63, 60, 84,251, 63, 34, 17,216, 63, 57, 97, 87, 63, 44,160,200, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 63, 45, 28, 24, 63, 57, 97, 87,
- 63, 44,160,200, 63, 60, 84,251, 63, 34, 17,216, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 60, 84,251, 63, 34, 17,216, 63, 54, 36, 91, 63, 33, 23,173,
- 63, 57, 20, 80, 63, 22,209,226, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 14,134, 63, 21, 48, 39, 63,122, 30,227, 63, 22,209,233, 63,125, 29,138,
- 63, 11,111,150, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,125, 29,138, 63, 11,111,150, 63,129,125,159, 63, 9,152, 94, 63,128, 14,134, 63, 21, 48, 39,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 60,193, 73,174, 63, 19, 29,253, 57,232, 92,209, 63, 21, 48, 39, 60, 62,207,114, 63, 9,152, 94, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,129,125,159, 63, 9,152, 94, 63,125, 29,138, 63, 11,111,150, 63,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 57,232, 92,209,
- 63, 21, 48, 39, 60,193, 73,174, 63, 19, 29,253, 60, 87, 67,214, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,129,174,136, 63, 31, 60,110,
- 63,125, 14,213, 63, 33, 23,180, 63,128, 14,134, 63, 21, 48, 39, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,122, 30,227, 63, 22,209,233, 63,128, 14,134,
- 63, 21, 48, 39, 63,125, 14,213, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,125, 14,213, 63, 33, 23,180, 63,129,174,136, 63, 31, 60,110,
- 63,128, 42,121, 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121,209,210, 63, 44,160,212, 63,115, 51, 36, 63, 45, 28, 36, 63,118,222, 49,
- 63, 34, 17,226, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,118,222, 49, 63, 34, 17,226, 63,125, 14,213, 63, 33, 23,180, 63,121,209,210, 63, 44,160,212,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,128, 42,121, 63, 43, 52,230, 63,121,209,210, 63, 44,160,212, 63,125, 14,213, 63, 33, 23,180, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,125, 14,213, 63, 33, 23,180, 63,118,222, 49, 63, 34, 17,226, 63,122, 30,227, 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60,213,239,111,
- 63, 40,228,223, 58,169,226,120, 63, 43, 52,230, 60, 87, 67,214, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60, 87, 67,214, 63, 31, 60,110,
- 61, 20,129, 13, 63, 28,140,143, 60,213,239,111, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,203,246, 63, 37,200, 48, 60,213,239,111,
- 63, 40,228,223, 61, 20,129, 13, 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 20,129, 13, 63, 28,140,143, 60, 87, 67,214, 63, 31, 60,110,
- 60,193, 73,174, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 44, 63, 23, 32,188, 63,122, 30,227, 63, 22,209,233, 63,118,222, 49,
- 63, 34, 17,226, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,118,222, 49, 63, 34, 17,226, 63,111,136, 31, 63, 34, 17,225, 63,115, 51, 44, 63, 23, 32,188,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,108, 71,116, 63, 22,209,232, 63,115, 51, 44, 63, 23, 32,188, 63,111,136, 31, 63, 34, 17,225, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,111,136, 31, 63, 34, 17,225, 63,118,222, 49, 63, 34, 17,226, 63,115, 51, 36, 63, 45, 28, 36, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 44,
- 63, 23, 32,188, 63,108, 71,116, 63, 22,209,232, 63,111,207,213, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,111,207,213, 63, 11,116,100,
- 63,118,150,138, 63, 11,116,101, 63,115, 51, 44, 63, 23, 32,188, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,122, 30,227, 63, 22,209,233, 63,115, 51, 44,
- 63, 23, 32,188, 63,118,150,138, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,118,150,138, 63, 11,116,101, 63,111,207,213, 63, 11,116,100,
- 63,115, 51, 51, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121,153,154, 63, 0, 1,244, 63,128, 0, 0, 63, 0, 0, 0, 63,125, 29,138,
- 63, 11,111,150, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,125, 29,138, 63, 11,111,150, 63,118,150,138, 63, 11,116,101, 63,121,153,154, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,115, 51, 51, 63, 0, 0, 0, 63,121,153,154, 63, 0, 1,244, 63,118,150,138, 63, 11,116,101, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,118,150,138, 63, 11,116,101, 63,125, 29,138, 63, 11,111,150, 63,122, 30,227, 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,108,204,205,
- 63, 0, 1,244, 63,115, 51, 51, 63, 0, 0, 0, 63,111,207,213, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,111,207,213, 63, 11,116,100,
- 63,105, 72,213, 63, 11,111,149, 63,108,204,205, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,102,102,101, 63, 0, 0, 0, 63,108,204,205,
- 63, 0, 1,244, 63,105, 72,213, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,105, 72,213, 63, 11,111,149, 63,111,207,213, 63, 11,116,100,
- 63,108, 71,116, 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 58, 62,217, 58, 73, 63,108,112,192, 62,217,196, 4, 63,111,174,139,
- 62,198,230,223, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,111,174,139, 62,198,230,223, 63,118,183,239, 62,198,230,227, 63,115, 51, 58, 62,217, 58, 73,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,121,245,179, 62,217,196, 6, 63,115, 51, 58, 62,217, 58, 73, 63,118,183,239, 62,198,230,227, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,118,183,239, 62,198,230,227, 63,111,174,139, 62,198,230,223, 63,115, 51, 65, 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 58,
- 62,217, 58, 73, 63,121,245,179, 62,217,196, 6, 63,118,135,185, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,118,135,185, 62,236,211, 30,
- 63,111,222,180, 62,236,211, 30, 63,115, 51, 58, 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,108,112,192, 62,217,196, 4, 63,115, 51, 58,
- 62,217, 58, 73, 63,111,222,180, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,111,222,180, 62,236,211, 30, 63,118,135,185, 62,236,211, 30,
- 63,115, 51, 51, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,108,204,205, 63, 0, 1,244, 63,102,102,101, 63, 0, 0, 0, 63,105, 97,170,
- 62,236,207, 65, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,105, 97,170, 62,236,207, 65, 63,111,222,180, 62,236,211, 30, 63,108,204,205, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,115, 51, 51, 63, 0, 0, 0, 63,108,204,205, 63, 0, 1,244, 63,111,222,180, 62,236,211, 30, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,111,222,180, 62,236,211, 30, 63,105, 97,170, 62,236,207, 65, 63,108,112,192, 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121,153,154,
- 63, 0, 1,244, 63,115, 51, 51, 63, 0, 0, 0, 63,118,135,185, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,118,135,185, 62,236,211, 30,
- 63,125, 4,194, 62,236,207, 67, 63,121,153,154, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128, 0, 0, 63, 0, 0, 0, 63,121,153,154,
- 63, 0, 1,244, 63,125, 4,194, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,125, 4,194, 62,236,207, 67, 63,118,135,185, 62,236,211, 30,
- 63,121,245,179, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,102, 73, 76, 63, 21, 48, 38, 63, 96, 92, 11, 63, 19, 29,253, 63, 99,107, 33,
- 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 99,107, 33, 63, 9,152, 94, 63,105, 72,213, 63, 11,111,149, 63,102, 73, 76, 63, 21, 48, 38,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,108, 71,116, 63, 22,209,232, 63,102, 73, 76, 63, 21, 48, 38, 63,105, 72,213, 63, 11,111,149, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,105, 72,213, 63, 11,111,149, 63, 99,107, 33, 63, 9,152, 94, 63,102,102,101, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,102, 73, 76,
- 63, 21, 48, 38, 63,108, 71,116, 63, 22,209,232, 63,105, 87,124, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,105, 87,124, 63, 33, 23,180,
- 63, 99, 9, 65, 63, 31, 60,109, 63,102, 73, 76, 63, 21, 48, 38, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 96, 92, 11, 63, 19, 29,253, 63,102, 73, 76,
- 63, 21, 48, 38, 63, 99, 9, 65, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 99, 9, 65, 63, 31, 60,109, 63,105, 87,124, 63, 33, 23,180,
- 63,102, 17, 87, 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 95,182,205, 63, 40,228,222, 63, 89,153,139, 63, 37,200, 45, 63, 93, 30, 63,
- 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 93, 30, 63, 63, 28,140,143, 63, 99, 9, 65, 63, 31, 60,109, 63, 95,182,205, 63, 40,228,222,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,102, 17, 87, 63, 43, 52,229, 63, 95,182,205, 63, 40,228,222, 63, 99, 9, 65, 63, 31, 60,109, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 99, 9, 65, 63, 31, 60,109, 63, 93, 30, 63, 63, 28,140,143, 63, 96, 92, 11, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,108,148,118,
- 63, 44,160,211, 63,102, 17, 87, 63, 43, 52,229, 63,105, 87,124, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,105, 87,124, 63, 33, 23,180,
- 63,111,136, 31, 63, 34, 17,225, 63,108,148,118, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 36, 63, 45, 28, 36, 63,108,148,118,
- 63, 44,160,211, 63,111,136, 31, 63, 34, 17,225, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,111,136, 31, 63, 34, 17,225, 63,105, 87,124, 63, 33, 23,180,
- 63,108, 71,116, 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 77, 65, 65, 63, 21, 48, 32, 62, 53, 72,152, 63, 22,209,229, 62, 65, 67, 47,
- 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 65, 67, 47, 63, 11,111,147, 62, 88,185,255, 63, 9,152, 90, 62, 77, 65, 65, 63, 21, 48, 32,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,100,246, 64, 63, 19, 29,246, 62, 77, 65, 65, 63, 21, 48, 32, 62, 88,185,255, 63, 9,152, 90, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 88,185,255, 63, 9,152, 90, 62, 65, 67, 47, 63, 11,111,147, 62, 76,204,254, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 77, 65, 65,
- 63, 21, 48, 32, 62,100,246, 64, 63, 19, 29,246, 62, 90, 65, 89, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 90, 65, 89, 63, 31, 60, 94,
- 62, 65, 8,107, 63, 33, 23,170, 62, 77, 65, 65, 63, 21, 48, 32, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 53, 72,152, 63, 22,209,229, 62, 77, 65, 65,
- 63, 21, 48, 32, 62, 65, 8,107, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 65, 8,107, 63, 33, 23,170, 62, 90, 65, 89, 63, 31, 60, 94,
- 62, 78, 32,230, 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 52, 20,105, 63, 44,160,198, 62, 25,153,173, 63, 45, 28, 27, 62, 40, 69,216,
- 63, 34, 17,220, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 40, 69,216, 63, 34, 17,220, 62, 65, 8,107, 63, 33, 23,170, 62, 52, 20,105, 63, 44,160,198,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 78, 32,230, 63, 43, 52,211, 62, 52, 20,105, 63, 44,160,198, 62, 65, 8,107, 63, 33, 23,170, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 65, 8,107, 63, 33, 23,170, 62, 40, 69,216, 63, 34, 17,220, 62, 53, 72,152, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,103,139, 14,
- 63, 40,228,199, 62, 78, 32,230, 63, 43, 52,211, 62, 90, 65, 89, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 90, 65, 89, 63, 31, 60, 94,
- 62,113,237, 83, 63, 28,140,130, 62,103,139, 14, 63, 40,228,199, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 37,200, 23, 62,103,139, 14,
- 63, 40,228,199, 62,113,237, 83, 63, 28,140,130, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,113,237, 83, 63, 28,140,130, 62, 90, 65, 89, 63, 31, 60, 94,
- 62,100,246, 64, 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,180, 63, 23, 32,185, 62, 53, 72,152, 63, 22,209,229, 62, 40, 69,216,
- 63, 34, 17,220, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 40, 69,216, 63, 34, 17,220, 62, 10,237,133, 63, 34, 17,219, 62, 25,153,180, 63, 23, 32,185,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,251,213,147, 63, 22,209,228, 62, 25,153,180, 63, 23, 32,185, 62, 10,237,133, 63, 34, 17,219, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 10,237,133, 63, 34, 17,219, 62, 40, 69,216, 63, 34, 17,220, 62, 25,153,173, 63, 45, 28, 27, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,180,
- 63, 23, 32,185, 61,251,213,147, 63, 22,209,228, 62, 12, 12, 67, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 12, 12, 67, 63, 11,116, 98,
- 62, 39, 39, 34, 63, 11,116, 98, 62, 25,153,180, 63, 23, 32,185, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 53, 72,152, 63, 22,209,229, 62, 25,153,180,
- 63, 23, 32,185, 62, 39, 39, 34, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 39, 39, 34, 63, 11,116, 98, 62, 12, 12, 67, 63, 11,116, 98,
- 62, 25,153,181, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 51, 51, 92, 63, 0, 1,244, 62, 76,204,254, 63, 0, 0, 0, 62, 65, 67, 47,
- 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 65, 67, 47, 63, 11,111,147, 62, 39, 39, 34, 63, 11,116, 98, 62, 51, 51, 92, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 25,153,181, 63, 0, 0, 0, 62, 51, 51, 92, 63, 0, 1,244, 62, 39, 39, 34, 63, 11,116, 98, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 39, 39, 34, 63, 11,116, 98, 62, 65, 67, 47, 63, 11,111,147, 62, 53, 72,152, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 8,
- 63, 0, 1,244, 62, 25,153,181, 63, 0, 0, 0, 62, 12, 12, 67, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 12, 12, 67, 63, 11,116, 98,
- 61,227,224,109, 63, 11,111,147, 62, 0, 0, 8, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,204,204,215, 63, 0, 0, 0, 62, 0, 0, 8,
- 63, 0, 1,244, 61,227,224,109, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,227,224,109, 63, 11,111,147, 62, 12, 12, 67, 63, 11,116, 98,
- 61,251,213,147, 63, 22,209,228, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,196, 62,217, 58, 73, 61,253, 31,171, 62,217,196, 6, 62, 11,135, 1,
- 62,198,230,228, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 11,135, 1, 62,198,230,228, 62, 39,172,153, 62,198,230,230, 62, 25,153,196, 62,217, 58, 73,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 52,163,179, 62,217,196, 7, 62, 25,153,196, 62,217, 58, 73, 62, 39,172,153, 62,198,230,230, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 39,172,153, 62,198,230,230, 62, 11,135, 1, 62,198,230,228, 62, 25,153,214, 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,196,
- 62,217, 58, 73, 62, 52,163,179, 62,217,196, 7, 62, 38,235,202, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 38,235,202, 62,236,211, 33,
- 62, 12, 71,173, 62,236,211, 31, 62, 25,153,196, 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,253, 31,171, 62,217,196, 6, 62, 25,153,196,
- 62,217, 58, 73, 62, 12, 71,173, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 12, 71,173, 62,236,211, 31, 62, 38,235,202, 62,236,211, 33,
- 62, 25,153,181, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 8, 63, 0, 1,244, 61,204,204,215, 63, 0, 0, 0, 61,228,166,251,
- 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,228,166,251, 62,236,207, 67, 62, 12, 71,173, 62,236,211, 31, 62, 0, 0, 8, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 25,153,181, 63, 0, 0, 0, 62, 0, 0, 8, 63, 0, 1,244, 62, 12, 71,173, 62,236,211, 31, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 12, 71,173, 62,236,211, 31, 61,228,166,251, 62,236,207, 67, 61,253, 31,171, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 51, 51, 92,
- 63, 0, 1,244, 62, 25,153,181, 63, 0, 0, 0, 62, 38,235,202, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 38,235,202, 62,236,211, 33,
- 62, 64,223,251, 62,236,207, 67, 62, 51, 51, 92, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 76,204,254, 63, 0, 0, 0, 62, 51, 51, 92,
- 63, 0, 1,244, 62, 64,223,251, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 64,223,251, 62,236,207, 67, 62, 38,235,202, 62,236,211, 33,
- 62, 52,163,179, 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,203,228, 42, 63, 21, 48, 37, 61,156,122, 1, 63, 19, 29,254, 61,180,242,172,
- 63, 9,152, 96, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,180,242,172, 63, 9,152, 96, 61,227,224,109, 63, 11,111,147, 61,203,228, 42, 63, 21, 48, 37,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,251,213,147, 63, 22,209,228, 61,203,228, 42, 63, 21, 48, 37, 61,227,224,109, 63, 11,111,147, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,227,224,109, 63, 11,111,147, 61,180,242,172, 63, 9,152, 96, 61,204,204,215, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,203,228, 42,
- 63, 21, 48, 37, 61,251,213,147, 63, 22,209,228, 61,228, 85,208, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,228, 85,208, 63, 33, 23,179,
- 61,177,227,212, 63, 31, 60,110, 61,203,228, 42, 63, 21, 48, 37, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,156,122, 1, 63, 19, 29,254, 61,203,228, 42,
- 63, 21, 48, 37, 61,177,227,212, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,177,227,212, 63, 31, 60,110, 61,228, 85,208, 63, 33, 23,179,
- 61,202, 36,175, 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,151, 80, 53, 63, 40,228,223, 61, 76,203,246, 63, 37,200, 48, 61,130,139,166,
- 63, 28,140,145, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,130,139,166, 63, 28,140,145, 61,177,227,212, 63, 31, 60,110, 61,151, 80, 53, 63, 40,228,223,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,202, 36,175, 63, 43, 52,228, 61,151, 80, 53, 63, 40,228,223, 61,177,227,212, 63, 31, 60,110, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,177,227,212, 63, 31, 60,110, 61,130,139,166, 63, 28,140,145, 61,156,122, 1, 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,254, 61,201,
- 63, 44,160,207, 61,202, 36,175, 63, 43, 52,228, 61,228, 85,208, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,228, 85,208, 63, 33, 23,179,
- 62, 10,237,133, 63, 34, 17,219, 61,254, 61,201, 63, 44,160,207, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,173, 63, 45, 28, 27, 61,254, 61,201,
- 63, 44,160,207, 62, 10,237,133, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 10,237,133, 63, 34, 17,219, 61,228, 85,208, 63, 33, 23,179,
- 61,251,213,147, 63, 22,209,228, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,205, 6,245, 63, 21, 48, 37, 62,193, 10,155, 63, 22,209,229, 62,199, 7,229,
- 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,199, 7,229, 63, 11,111,147, 62,210,195, 85, 63, 9,152, 96, 62,205, 6,245, 63, 21, 48, 37,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,216,225,128, 63, 19, 29,254, 62,205, 6,245, 63, 21, 48, 37, 62,210,195, 85, 63, 9,152, 96, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,210,195, 85, 63, 9,152, 96, 62,199, 7,229, 63, 11,111,147, 62,204,204,202, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,205, 6,245,
- 63, 21, 48, 37, 62,216,225,128, 63, 19, 29,254, 62,211,135, 11, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,211,135, 11, 63, 31, 60,110,
- 62,198,234,140, 63, 33, 23,179, 62,205, 6,245, 63, 21, 48, 37, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,193, 10,155, 63, 22,209,229, 62,205, 6,245,
- 63, 21, 48, 37, 62,198,234,140, 63, 33, 23,179, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,198,234,140, 63, 33, 23,179, 62,211,135, 11, 63, 31, 60,110,
- 62,205,118,212, 63, 43, 52,228, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,192,112,142, 63, 44,160,207, 62,179, 51, 42, 63, 45, 28, 28, 62,186,137, 61,
- 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,186,137, 61, 63, 34, 17,219, 62,198,234,140, 63, 33, 23,179, 62,192,112,142, 63, 44,160,207,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,205,118,212, 63, 43, 52,228, 62,192,112,142, 63, 44,160,207, 62,198,234,140, 63, 33, 23,179, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,198,234,140, 63, 33, 23,179, 62,186,137, 61, 63, 34, 17,219, 62,193, 10,155, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,218, 43,243,
- 63, 40,228,223, 62,205,118,212, 63, 43, 52,228, 62,211,135, 11, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,211,135, 11, 63, 31, 60,110,
- 62,223, 93, 22, 63, 28,140,145, 62,218, 43,243, 63, 40,228,223, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,129, 63, 37,200, 48, 62,218, 43,243,
- 63, 40,228,223, 62,223, 93, 22, 63, 28,140,145, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,223, 93, 22, 63, 28,140,145, 62,211,135, 11, 63, 31, 60,110,
- 62,216,225,128, 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 38, 63, 23, 32,185, 62,193, 10,155, 63, 22,209,229, 62,186,137, 61,
- 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,186,137, 61, 63, 34, 17,219, 62,171,221, 20, 63, 34, 17,219, 62,179, 51, 38, 63, 23, 32,185,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,165, 91,180, 63, 22,209,229, 62,179, 51, 38, 63, 23, 32,185, 62,171,221, 20, 63, 34, 17,219, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,171,221, 20, 63, 34, 17,219, 62,186,137, 61, 63, 34, 17,219, 62,179, 51, 42, 63, 45, 28, 28, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 38,
- 63, 23, 32,185, 62,165, 91,180, 63, 22,209,229, 62,172,108,111, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,172,108,111, 63, 11,116, 98,
- 62,185,249,222, 63, 11,116, 98, 62,179, 51, 38, 63, 23, 32,185, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,193, 10,155, 63, 22,209,229, 62,179, 51, 38,
- 63, 23, 32,185, 62,185,249,222, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,185,249,222, 63, 11,116, 98, 62,172,108,111, 63, 11,116, 98,
- 62,179, 51, 38, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,191,255,252, 63, 0, 1,244, 62,204,204,202, 63, 0, 0, 0, 62,199, 7,229,
- 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,199, 7,229, 63, 11,111,147, 62,185,249,222, 63, 11,116, 98, 62,191,255,252, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,179, 51, 38, 63, 0, 0, 0, 62,191,255,252, 63, 0, 1,244, 62,185,249,222, 63, 11,116, 98, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,185,249,222, 63, 11,116, 98, 62,199, 7,229, 63, 11,111,147, 62,193, 10,155, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,166,102, 82,
- 63, 0, 1,244, 62,179, 51, 38, 63, 0, 0, 0, 62,172,108,111, 63, 11,116, 98, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,172,108,111, 63, 11,116, 98,
- 62,159, 94,104, 63, 11,111,147, 62,166,102, 82, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,153,153,129, 63, 0, 0, 0, 62,166,102, 82,
- 63, 0, 1,244, 62,159, 94,104, 63, 11,111,147, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,159, 94,104, 63, 11,111,147, 62,172,108,111, 63, 11,116, 98,
- 62,165, 91,180, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 30, 62,217, 58, 73, 62,165,174, 39, 62,217,196, 7, 62,172, 41,180,
- 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,172, 41,180, 62,198,230,227, 62,186, 60,127, 62,198,230,225, 62,179, 51, 30, 62,217, 58, 73,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,192,184, 21, 62,217,196, 6, 62,179, 51, 30, 62,217, 58, 73, 62,186, 60,127, 62,198,230,225, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,186, 60,127, 62,198,230,225, 62,172, 41,180, 62,198,230,227, 62,179, 51, 21, 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 30,
- 62,217, 58, 73, 62,192,184, 21, 62,217,196, 6, 62,185,220, 42, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,185,220, 42, 62,236,211, 31,
- 62,172,138, 27, 62,236,211, 33, 62,179, 51, 30, 62,217, 58, 73, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,165,174, 39, 62,217,196, 7, 62,179, 51, 30,
- 62,217, 58, 73, 62,172,138, 27, 62,236,211, 33, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,172,138, 27, 62,236,211, 33, 62,185,220, 42, 62,236,211, 31,
- 62,179, 51, 38, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,166,102, 82, 63, 0, 1,244, 62,153,153,129, 63, 0, 0, 0, 62,159,144, 3,
- 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,159,144, 3, 62,236,207, 67, 62,172,138, 27, 62,236,211, 33, 62,166,102, 82, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,179, 51, 38, 63, 0, 0, 0, 62,166,102, 82, 63, 0, 1,244, 62,172,138, 27, 62,236,211, 33, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,172,138, 27, 62,236,211, 33, 62,159,144, 3, 62,236,207, 67, 62,165,174, 39, 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,191,255,252,
- 63, 0, 1,244, 62,179, 51, 38, 63, 0, 0, 0, 62,185,220, 42, 62,236,211, 31, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,185,220, 42, 62,236,211, 31,
- 62,198,214, 65, 62,236,207, 67, 62,191,255,252, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,204,204,202, 63, 0, 0, 0, 62,191,255,252,
- 63, 0, 1,244, 62,198,214, 65, 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,198,214, 65, 62,236,207, 67, 62,185,220, 42, 62,236,211, 31,
- 62,192,184, 21, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,153, 95, 95, 63, 21, 48, 32, 62,141,132,224, 63, 19, 29,246, 62,147,163, 1,
- 63, 9,152, 91, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,147,163, 1, 63, 9,152, 91, 62,159, 94,104, 63, 11,111,147, 62,153, 95, 95, 63, 21, 48, 32,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,165, 91,180, 63, 22,209,229, 62,153, 95, 95, 63, 21, 48, 32, 62,159, 94,104, 63, 11,111,147, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,159, 94,104, 63, 11,111,147, 62,147,163, 1, 63, 9,152, 91, 62,153,153,129, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,153, 95, 95,
- 63, 21, 48, 32, 62,165, 91,180, 63, 22,209,229, 62,159,123,203, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,159,123,203, 63, 33, 23,170,
- 62,146,223, 84, 63, 31, 60, 94, 62,153, 95, 95, 63, 21, 48, 32, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,141,132,224, 63, 19, 29,246, 62,153, 95, 95,
- 63, 21, 48, 32, 62,146,223, 84, 63, 31, 60, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,146,223, 84, 63, 31, 60, 94, 62,159,123,203, 63, 33, 23,170,
- 62,152,239,141, 63, 43, 52,211, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,140, 58,121, 63, 40,228,199, 62,128, 0, 0, 63, 37,200, 23, 62,135, 9, 86,
- 63, 28,140,130, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,135, 9, 86, 63, 28,140,130, 62,146,223, 84, 63, 31, 60, 94, 62,140, 58,121, 63, 40,228,199,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,152,239,141, 63, 43, 52,211, 62,140, 58,121, 63, 40,228,199, 62,146,223, 84, 63, 31, 60, 94, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,146,223, 84, 63, 31, 60, 94, 62,135, 9, 86, 63, 28,140,130, 62,141,132,224, 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,165,245,204,
- 63, 44,160,198, 62,152,239,141, 63, 43, 52,211, 62,159,123,203, 63, 33, 23,170, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,159,123,203, 63, 33, 23,170,
- 62,171,221, 20, 63, 34, 17,219, 62,165,245,204, 63, 44,160,198, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 42, 63, 45, 28, 28, 62,165,245,204,
- 63, 44,160,198, 62,171,221, 20, 63, 34, 17,219, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,171,221, 20, 63, 34, 17,219, 62,159,123,203, 63, 33, 23,170,
- 62,165, 91,180, 63, 22,209,229, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 25,182,180, 63, 21, 48, 38, 63, 19,184,140, 63, 22,209,232, 63, 22,183, 43,
- 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 22,183, 43, 63, 11,111,149, 63, 28,148,223, 63, 9,152, 94, 63, 25,182,180, 63, 21, 48, 38,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 31,163,245, 63, 19, 29,253, 63, 25,182,180, 63, 21, 48, 38, 63, 28,148,223, 63, 9,152, 94, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 28,148,223, 63, 9,152, 94, 63, 22,183, 43, 63, 11,111,149, 63, 25,153,155, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 25,182,180,
- 63, 21, 48, 38, 63, 31,163,245, 63, 19, 29,253, 63, 28,246,191, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 28,246,191, 63, 31, 60,109,
- 63, 22,168,132, 63, 33, 23,180, 63, 25,182,180, 63, 21, 48, 38, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 19,184,140, 63, 22,209,232, 63, 25,182,180,
- 63, 21, 48, 38, 63, 22,168,132, 63, 33, 23,180, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 22,168,132, 63, 33, 23,180, 63, 28,246,191, 63, 31, 60,109,
- 63, 25,238,169, 63, 43, 52,229, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 19,107,138, 63, 44,160,211, 63, 12,204,220, 63, 45, 28, 35, 63, 16,119,225,
- 63, 34, 17,225, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 16,119,225, 63, 34, 17,225, 63, 22,168,132, 63, 33, 23,180, 63, 19,107,138, 63, 44,160,211,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 25,238,169, 63, 43, 52,229, 63, 19,107,138, 63, 44,160,211, 63, 22,168,132, 63, 33, 23,180, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 22,168,132, 63, 33, 23,180, 63, 16,119,225, 63, 34, 17,225, 63, 19,184,140, 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 32, 73, 51,
- 63, 40,228,221, 63, 25,238,169, 63, 43, 52,229, 63, 28,246,191, 63, 31, 60,109, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 28,246,191, 63, 31, 60,109,
- 63, 34,225,192, 63, 28,140,142, 63, 32, 73, 51, 63, 40,228,221, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,117, 63, 37,200, 45, 63, 32, 73, 51,
- 63, 40,228,221, 63, 34,225,192, 63, 28,140,142, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 34,225,192, 63, 28,140,142, 63, 28,246,191, 63, 31, 60,109,
- 63, 31,163,245, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,212, 63, 23, 32,188, 63, 19,184,140, 63, 22,209,232, 63, 16,119,225,
- 63, 34, 17,225, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 16,119,225, 63, 34, 17,225, 63, 9, 33,207, 63, 34, 17,226, 63, 12,204,212, 63, 23, 32,188,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 5,225, 29, 63, 22,209,233, 63, 12,204,212, 63, 23, 32,188, 63, 9, 33,207, 63, 34, 17,226, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 9, 33,207, 63, 34, 17,226, 63, 16,119,225, 63, 34, 17,225, 63, 12,204,220, 63, 45, 28, 35, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,212,
- 63, 23, 32,188, 63, 5,225, 29, 63, 22,209,233, 63, 9,105,118, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 9,105,118, 63, 11,116,101,
- 63, 16, 48, 43, 63, 11,116,100, 63, 12,204,212, 63, 23, 32,188, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 19,184,140, 63, 22,209,232, 63, 12,204,212,
- 63, 23, 32,188, 63, 16, 48, 43, 63, 11,116,100, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 16, 48, 43, 63, 11,116,100, 63, 9,105,118, 63, 11,116,101,
- 63, 12,204,205, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 19, 51, 51, 63, 0, 1,244, 63, 25,153,155, 63, 0, 0, 0, 63, 22,183, 43,
- 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 22,183, 43, 63, 11,111,149, 63, 16, 48, 43, 63, 11,116,100, 63, 19, 51, 51, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 12,204,205, 63, 0, 0, 0, 63, 19, 51, 51, 63, 0, 1,244, 63, 16, 48, 43, 63, 11,116,100, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 16, 48, 43, 63, 11,116,100, 63, 22,183, 43, 63, 11,111,149, 63, 19,184,140, 63, 22,209,232, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6,102,102,
- 63, 0, 1,244, 63, 12,204,205, 63, 0, 0, 0, 63, 9,105,118, 63, 11,116,101, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 9,105,118, 63, 11,116,101,
- 63, 2,226,118, 63, 11,111,149, 63, 6,102,102, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63, 6,102,102,
- 63, 0, 1,244, 63, 2,226,118, 63, 11,111,149, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 2,226,118, 63, 11,111,149, 63, 9,105,118, 63, 11,116,101,
- 63, 5,225, 29, 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,198, 62,217, 58, 72, 63, 6, 10, 77, 62,217,196, 6, 63, 9, 72, 17,
- 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 9, 72, 17, 62,198,230,227, 63, 16, 81,117, 62,198,230,223, 63, 12,204,198, 62,217, 58, 72,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 19,143, 64, 62,217,196, 4, 63, 12,204,198, 62,217, 58, 72, 63, 16, 81,117, 62,198,230,223, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 16, 81,117, 62,198,230,223, 63, 9, 72, 17, 62,198,230,227, 63, 12,204,191, 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,198,
- 62,217, 58, 72, 63, 19,143, 64, 62,217,196, 4, 63, 16, 33, 76, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 16, 33, 76, 62,236,211, 30,
- 63, 9,120, 71, 62,236,211, 30, 63, 12,204,198, 62,217, 58, 72, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6, 10, 77, 62,217,196, 6, 63, 12,204,198,
- 62,217, 58, 72, 63, 9,120, 71, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 9,120, 71, 62,236,211, 30, 63, 16, 33, 76, 62,236,211, 30,
- 63, 12,204,205, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6,102,102, 63, 0, 1,244, 63, 0, 0, 0, 63, 0, 0, 0, 63, 2,251, 62,
- 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 2,251, 62, 62,236,207, 67, 63, 9,120, 71, 62,236,211, 30, 63, 6,102,102, 63, 0, 1,244,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 12,204,205, 63, 0, 0, 0, 63, 6,102,102, 63, 0, 1,244, 63, 9,120, 71, 62,236,211, 30, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 9,120, 71, 62,236,211, 30, 63, 2,251, 62, 62,236,207, 67, 63, 6, 10, 77, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 19, 51, 51,
- 63, 0, 1,244, 63, 12,204,205, 63, 0, 0, 0, 63, 16, 33, 76, 62,236,211, 30, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 16, 33, 76, 62,236,211, 30,
- 63, 22,158, 86, 62,236,207, 65, 63, 19, 51, 51, 63, 0, 1,244, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 25,153,155, 63, 0, 0, 0, 63, 19, 51, 51,
- 63, 0, 1,244, 63, 22,158, 86, 62,236,207, 65, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 22,158, 86, 62,236,207, 65, 63, 16, 33, 76, 62,236,211, 30,
- 63, 19,143, 64, 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,255,197,233, 63, 21, 48, 39, 62,243,235,101, 63, 19, 29,252, 62,250, 9,132,
- 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,250, 9,132, 63, 9,152, 94, 63, 2,226,118, 63, 11,111,149, 62,255,197,233, 63, 21, 48, 39,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 5,225, 29, 63, 22,209,233, 62,255,197,233, 63, 21, 48, 39, 63, 2,226,118, 63, 11,111,149, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 2,226,118, 63, 11,111,149, 62,250, 9,132, 63, 9,152, 94, 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,255,197,233,
- 63, 21, 48, 39, 63, 5,225, 29, 63, 22,209,233, 63, 2,241, 43, 63, 33, 23,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 2,241, 43, 63, 33, 23,181,
- 62,249, 69,225, 63, 31, 60,110, 62,255,197,233, 63, 21, 48, 39, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,243,235,101, 63, 19, 29,252, 62,255,197,233,
- 63, 21, 48, 39, 62,249, 69,225, 63, 31, 60,110, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,249, 69,225, 63, 31, 60,110, 63, 2,241, 43, 63, 33, 23,181,
- 62,255, 86, 30, 63, 43, 52,230, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,242,161, 9, 63, 40,228,223, 62,230,102,129, 63, 37,200, 48, 62,237,111,222,
- 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,237,111,222, 63, 28,140,143, 62,249, 69,225, 63, 31, 60,110, 62,242,161, 9, 63, 40,228,223,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,255, 86, 30, 63, 43, 52,230, 62,242,161, 9, 63, 40,228,223, 62,249, 69,225, 63, 31, 60,110, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,249, 69,225, 63, 31, 60,110, 62,237,111,222, 63, 28,140,143, 62,243,235,101, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6, 46, 46,
- 63, 44,160,211, 62,255, 86, 30, 63, 43, 52,230, 63, 2,241, 43, 63, 33, 23,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 2,241, 43, 63, 33, 23,181,
- 63, 9, 33,207, 63, 34, 17,226, 63, 6, 46, 46, 63, 44,160,211, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,220, 63, 45, 28, 35, 63, 6, 46, 46,
- 63, 44,160,211, 63, 9, 33,207, 63, 34, 17,226, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 9, 33,207, 63, 34, 17,226, 63, 2,241, 43, 63, 33, 23,181,
- 63, 5,225, 29, 63, 22,209,233, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 85,238,138, 62,187,220, 72, 63, 82,173,218, 62,210, 92, 55, 63, 79,189,229,
- 62,189,208,173, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 79,189,229, 62,189,208,173, 63, 82,250,230, 62,166,190,117, 63, 85,238,138, 62,187,220, 72,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 89,153,149, 62,165,199,201, 63, 85,238,138, 62,187,220, 72, 63, 82,250,230, 62,166,190,117, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 82,250,230, 62,166,190,117, 63, 79,189,229, 62,189,208,173, 63, 76,119,198, 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,111,170,
- 62,193,135, 68, 63, 76,119,198, 62,169,150, 90, 63, 79,189,229, 62,189,208,173, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 79,189,229, 62,189,208,173,
- 63, 76,175,176, 62,213,159,192, 63, 73,111,170, 62,193,135, 68, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70,194,112, 62,217,196, 19, 63, 73,111,170,
- 62,193,135, 68, 63, 76,175,176, 62,213,159,192, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,175,176, 62,213,159,192, 63, 79,189,229, 62,189,208,173,
- 63, 82,173,218, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 79,175, 52, 62,233, 32,218, 63, 76,204,193, 63, 0, 0, 0, 63, 73,209,128,
- 62,236,207, 75, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,209,128, 62,236,207, 75, 63, 76,175,176, 62,213,159,192, 63, 79,175, 52, 62,233, 32,218,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 82,173,218, 62,210, 92, 55, 63, 79,175, 52, 62,233, 32,218, 63, 76,175,176, 62,213,159,192, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 76,175,176, 62,213,159,192, 63, 73,209,128, 62,236,207, 75, 63, 70,194,112, 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 73,111,170,
- 62,193,135, 68, 63, 70,194,112, 62,217,196, 19, 63, 67,132,171, 62,198,230,253, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 67,132,171, 62,198,230,253,
- 63, 70, 29, 61, 62,174, 54,114, 63, 73,111,170, 62,193,135, 68, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 76,119,198, 62,169,150, 90, 63, 73,111,170,
- 62,193,135, 68, 63, 70, 29, 61, 62,174, 54,114, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70, 29, 61, 62,174, 54,114, 63, 67,132,171, 62,198,230,253,
- 63, 64, 0, 0, 62,180,111,211, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 79,175, 52, 62,233, 32,218, 63, 82,173,218, 62,210, 92, 55, 63, 86, 54, 56,
- 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 86, 54, 56, 62,233, 23, 58, 63, 83, 51, 41, 62,255,252, 24, 63, 79,175, 52, 62,233, 32,218,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 76,204,193, 63, 0, 0, 0, 63, 79,175, 52, 62,233, 32,218, 63, 83, 51, 41, 62,255,252, 24, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 83, 51, 41, 62,255,252, 24, 63, 86, 54, 56, 62,233, 23, 58, 63, 89,153,147, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 92,252,239,
- 62,233, 23, 58, 63, 89,153,147, 63, 0, 0, 0, 63, 86, 54, 56, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 86, 54, 56, 62,233, 23, 58,
- 63, 89,153,147, 62,209,190,143, 63, 92,252,239, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 96,133, 78, 62,210, 92, 55, 63, 92,252,239,
- 62,233, 23, 58, 63, 89,153,147, 62,209,190,143, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,147, 62,209,190,143, 63, 86, 54, 56, 62,233, 23, 58,
- 63, 82,173,218, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 85,238,138, 62,187,220, 72, 63, 89,153,149, 62,165,199,201, 63, 93, 68,159,
- 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 93, 68,159, 62,187,220, 72, 63, 89,153,147, 62,209,190,143, 63, 85,238,138, 62,187,220, 72,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 82,173,218, 62,210, 92, 55, 63, 85,238,138, 62,187,220, 72, 63, 89,153,147, 62,209,190,143, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 89,153,147, 62,209,190,143, 63, 93, 68,159, 62,187,220, 72, 63, 96,133, 78, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 92,252,239,
- 62,233, 23, 58, 63, 96,133, 78, 62,210, 92, 55, 63, 99,131,242, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 99,131,242, 62,233, 32,218,
- 63, 95,255,254, 62,255,252, 24, 63, 92,252,239, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,147, 63, 0, 0, 0, 63, 92,252,239,
- 62,233, 23, 58, 63, 95,255,254, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 95,255,254, 62,255,252, 24, 63, 99,131,242, 62,233, 32,218,
- 63,102,102,101, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,111,174,139, 62,198,230,223, 63,108,112,192, 62,217,196, 4, 63,105,195,133,
- 62,193,135, 37, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,105,195,133, 62,193,135, 37, 63,109, 21,249, 62,174, 54, 65, 63,111,174,139, 62,198,230,223,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,115, 51, 65, 62,180,111,160, 63,111,174,139, 62,198,230,223, 63,109, 21,249, 62,174, 54, 65, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,109, 21,249, 62,174, 54, 65, 63,105,195,133, 62,193,135, 37, 63,102,187,106, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 99,117, 70,
- 62,189,208,155, 63,102,187,106, 62,169,150, 54, 63,105,195,133, 62,193,135, 37, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,105,195,133, 62,193,135, 37,
- 63,102,131,123, 62,213,159,181, 63, 99,117, 70, 62,189,208,155, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 96,133, 78, 62,210, 92, 55, 63, 99,117, 70,
- 62,189,208,155, 63,102,131,123, 62,213,159,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,102,131,123, 62,213,159,181, 63,105,195,133, 62,193,135, 37,
- 63,108,112,192, 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,105, 97,170, 62,236,207, 65, 63,102,102,101, 63, 0, 0, 0, 63, 99,131,242,
- 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 99,131,242, 62,233, 32,218, 63,102,131,123, 62,213,159,181, 63,105, 97,170, 62,236,207, 65,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,108,112,192, 62,217,196, 4, 63,105, 97,170, 62,236,207, 65, 63,102,131,123, 62,213,159,181, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,102,131,123, 62,213,159,181, 63, 99,131,242, 62,233, 32,218, 63, 96,133, 78, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 99,117, 70,
- 62,189,208,155, 63, 96,133, 78, 62,210, 92, 55, 63, 93, 68,159, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 93, 68,159, 62,187,220, 72,
- 63, 96, 56, 71, 62,166,190, 99, 63, 99,117, 70, 62,189,208,155, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,102,187,106, 62,169,150, 54, 63, 99,117, 70,
- 62,189,208,155, 63, 96, 56, 71, 62,166,190, 99, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 96, 56, 71, 62,166,190, 99, 63, 93, 68,159, 62,187,220, 72,
- 63, 89,153,149, 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 99,107, 33, 63, 9,152, 94, 63, 96, 92, 11, 63, 19, 29,253, 63, 92,238, 21,
- 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 92,238, 21, 63, 9,150,112, 63, 95,255,254, 62,255,252, 24, 63, 99,107, 33, 63, 9,152, 94,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,102,102,101, 63, 0, 0, 0, 63, 99,107, 33, 63, 9,152, 94, 63, 95,255,254, 62,255,252, 24, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 95,255,254, 62,255,252, 24, 63, 92,238, 21, 63, 9,150,112, 63, 89,153,147, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 86, 69, 14,
- 63, 9,150,112, 63, 89,153,147, 63, 0, 0, 0, 63, 92,238, 21, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 92,238, 21, 63, 9,150,112,
- 63, 89,153,143, 63, 19, 98,219, 63, 86, 69, 14, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 82,215, 19, 63, 19, 29,252, 63, 86, 69, 14,
- 63, 9,150,112, 63, 89,153,143, 63, 19, 98,219, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,143, 63, 19, 98,219, 63, 92,238, 21, 63, 9,150,112,
- 63, 96, 92, 11, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 93, 30, 63, 63, 28,140,143, 63, 89,153,139, 63, 37,200, 45, 63, 86, 20,218,
- 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 86, 20,218, 63, 28,140,143, 63, 89,153,143, 63, 19, 98,219, 63, 93, 30, 63, 63, 28,140,143,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 96, 92, 11, 63, 19, 29,253, 63, 93, 30, 63, 63, 28,140,143, 63, 89,153,143, 63, 19, 98,219, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 89,153,143, 63, 19, 98,219, 63, 86, 20,218, 63, 28,140,143, 63, 82,215, 19, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 86, 69, 14,
- 63, 9,150,112, 63, 82,215, 19, 63, 19, 29,252, 63, 79,200, 1, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 79,200, 1, 63, 9,152, 94,
- 63, 83, 51, 41, 62,255,252, 24, 63, 86, 69, 14, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,147, 63, 0, 0, 0, 63, 86, 69, 14,
- 63, 9,150,112, 63, 83, 51, 41, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 83, 51, 41, 62,255,252, 24, 63, 79,200, 1, 63, 9,152, 94,
- 63, 76,204,193, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 18, 28,237, 62,187,220, 60, 60,188, 35,151, 62,210, 92, 46, 60, 60, 74,218,
- 62,189,208,150, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 60, 60, 74,218, 62,189,208,150, 60,197,197,195, 62,166,190, 89, 61, 18, 28,237, 62,187,220, 60,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61, 76,205,194, 62,165,199,186, 61, 18, 28,237, 62,187,220, 60, 60,197,197,195, 62,166,190, 89, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,131, 23, 23, 62,166,190, 89, 63,129,120,150, 62,189,208,150, 63,127,171, 15, 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,124,162,241,
- 62,193,135, 36, 63,127,171, 15, 62,169,150, 52, 63,129,120,150, 62,189,208,150, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,129,120,150, 62,189,208,150,
- 63,127,226,244, 62,213,159,179, 63,124,162,241, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121,245,179, 62,217,196, 6, 63,124,162,241,
- 62,193,135, 36, 63,127,226,244, 62,213,159,179, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,127,226,244, 62,213,159,179, 63,129,120,150, 62,189,208,150,
- 63,130,240,142, 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,129,113, 59, 62,233, 32,214, 63,128, 0, 0, 63, 0, 0, 0, 63,125, 4,194,
- 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,125, 4,194, 62,236,207, 67, 63,127,226,244, 62,213,159,179, 63,129,113, 59, 62,233, 32,214,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,130,240,142, 62,210, 92, 46, 63,129,113, 59, 62,233, 32,214, 63,127,226,244, 62,213,159,179, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,127,226,244, 62,213,159,179, 63,125, 4,194, 62,236,207, 67, 63,121,245,179, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,124,162,241,
- 62,193,135, 36, 63,121,245,179, 62,217,196, 6, 63,118,183,239, 62,198,230,227, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,118,183,239, 62,198,230,227,
- 63,121, 80,133, 62,174, 54, 65, 63,124,162,241, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,127,171, 15, 62,169,150, 52, 63,124,162,241,
- 62,193,135, 36, 63,121, 80,133, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121, 80,133, 62,174, 54, 65, 63,118,183,239, 62,198,230,227,
- 63,115, 51, 65, 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60, 56,157,110, 62,233, 32,214, 60,188, 35,151, 62,210, 92, 46, 61, 22,151, 95,
- 62,233, 23, 55, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61, 22,151, 95, 62,233, 23, 55, 60,204,204,176, 62,255,252, 24, 60, 56,157,110, 62,233, 32,214,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 38, 11, 79,167, 63, 0, 0, 0, 60, 56,157,110, 62,233, 32,214, 60,204,204,176, 62,255,252, 24, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 60,204,204,176, 62,255,252, 24, 61, 22,151, 95, 62,233, 23, 55, 61, 76,204,215, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,129,129, 87,
- 62,233, 23, 57, 61, 76,204,215, 63, 0, 0, 0, 61, 22,151, 95, 62,233, 23, 55, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 22,151, 95, 62,233, 23, 55,
- 61, 76,205, 68, 62,209,190,135, 61,129,129, 87, 62,233, 23, 57, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,157,196, 92, 62,210, 92, 49, 61,129,129, 87,
- 62,233, 23, 57, 61, 76,205, 68, 62,209,190,135, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,205, 68, 62,209,190,135, 61, 22,151, 95, 62,233, 23, 55,
- 60,188, 35,151, 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 18, 28,237, 62,187,220, 60, 61, 76,205,194, 62,165,199,186, 61,131,191, 7,
- 62,187,220, 62, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,131,191, 7, 62,187,220, 62, 61, 76,205, 68, 62,209,190,135, 61, 18, 28,237, 62,187,220, 60,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 60,188, 35,151, 62,210, 92, 46, 61, 18, 28,237, 62,187,220, 60, 61, 76,205, 68, 62,209,190,135, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61, 76,205, 68, 62,209,190,135, 61,131,191, 7, 62,187,220, 62, 61,157,196, 92, 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,129,129, 87,
- 62,233, 23, 57, 61,157,196, 92, 62,210, 92, 49, 61,181,185, 89, 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,181,185, 89, 62,233, 32,214,
- 61,153,153,154, 62,255,252, 25, 61,129,129, 87, 62,233, 23, 57, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,204,215, 63, 0, 0, 0, 61,129,129, 87,
- 62,233, 23, 57, 61,153,153,154, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,153,153,154, 62,255,252, 25, 61,181,185, 89, 62,233, 32,214,
- 61,204,204,215, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 11,135, 1, 62,198,230,228, 61,253, 31,171, 62,217,196, 6, 61,231,181,251,
- 62,193,135, 38, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,231,181,251, 62,193,135, 38, 62, 1, 36,204, 62,174, 54, 70, 62, 11,135, 1, 62,198,230,228,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 25,153,214, 62,180,111,165, 62, 11,135, 1, 62,198,230,228, 62, 1, 36,204, 62,174, 54, 70, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 1, 36,204, 62,174, 54, 70, 61,231,181,251, 62,193,135, 38, 61,207,117, 70, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,181, 68, 35,
- 62,189,208,153, 61,207,117, 70, 62,169,150, 54, 61,231,181,251, 62,193,135, 38, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,231,181,251, 62,193,135, 38,
- 61,205,181,164, 62,213,159,180, 61,181, 68, 35, 62,189,208,153, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,157,196, 92, 62,210, 92, 49, 61,181, 68, 35,
- 62,189,208,153, 61,205,181,164, 62,213,159,180, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,205,181,164, 62,213,159,180, 61,231,181,251, 62,193,135, 38,
- 61,253, 31,171, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,228,166,251, 62,236,207, 67, 61,204,204,215, 63, 0, 0, 0, 61,181,185, 89,
- 62,233, 32,214, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,181,185, 89, 62,233, 32,214, 61,205,181,164, 62,213,159,180, 61,228,166,251, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,253, 31,171, 62,217,196, 6, 61,228,166,251, 62,236,207, 67, 61,205,181,164, 62,213,159,180, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,205,181,164, 62,213,159,180, 61,181,185, 89, 62,233, 32,214, 61,157,196, 92, 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,181, 68, 35,
- 62,189,208,153, 61,157,196, 92, 62,210, 92, 49, 61,131,191, 7, 62,187,220, 62, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,131,191, 7, 62,187,220, 62,
- 61,155, 92, 79, 62,166,190, 91, 61,181, 68, 35, 62,189,208,153, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,207,117, 70, 62,169,150, 54, 61,181, 68, 35,
- 62,189,208,153, 61,155, 92, 79, 62,166,190, 91, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,155, 92, 79, 62,166,190, 91, 61,131,191, 7, 62,187,220, 62,
- 61, 76,205,194, 62,165,199,186, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,180,242,172, 63, 9,152, 96, 61,156,122, 1, 63, 19, 29,254, 61,129, 10,100,
- 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,129, 10,100, 63, 9,150,113, 61,153,153,154, 62,255,252, 25, 61,180,242,172, 63, 9,152, 96,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,204,204,215, 63, 0, 0, 0, 61,180,242,172, 63, 9,152, 96, 61,153,153,154, 62,255,252, 25, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,153,153,154, 62,255,252, 25, 61,129, 10,100, 63, 9,150,113, 61, 76,204,215, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 23,132,109,
- 63, 9,150,113, 61, 76,204,215, 63, 0, 0, 0, 61,129, 10,100, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,129, 10,100, 63, 9,150,113,
- 61, 76,204, 91, 63, 19, 98,220, 61, 23,132,109, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60,193, 73,174, 63, 19, 29,253, 61, 23,132,109,
- 63, 9,150,113, 61, 76,204, 91, 63, 19, 98,220, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,204, 91, 63, 19, 98,220, 61,129, 10,100, 63, 9,150,113,
- 61,156,122, 1, 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,130,139,166, 63, 28,140,145, 61, 76,203,246, 63, 37,200, 48, 61, 20,129, 13,
- 63, 28,140,143, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61, 20,129, 13, 63, 28,140,143, 61, 76,204, 91, 63, 19, 98,220, 61,130,139,166, 63, 28,140,145,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,156,122, 1, 63, 19, 29,254, 61,130,139,166, 63, 28,140,145, 61, 76,204, 91, 63, 19, 98,220, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61, 76,204, 91, 63, 19, 98,220, 61, 20,129, 13, 63, 28,140,143, 60,193, 73,174, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 23,132,109,
- 63, 9,150,113, 60,193, 73,174, 63, 19, 29,253, 60, 62,207,114, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60, 62,207,114, 63, 9,152, 94,
- 60,204,204,176, 62,255,252, 24, 61, 23,132,109, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,204,215, 63, 0, 0, 0, 61, 23,132,109,
- 63, 9,150,113, 60,204,204,176, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60,204,204,176, 62,255,252, 24, 60, 62,207,114, 63, 9,152, 94,
- 38, 11, 79,167, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,113, 83,237, 62,187,220, 79, 62,100, 81, 63, 62,210, 92, 60, 62, 88,145,110,
- 62,189,208,167, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 88,145,110, 62,189,208,167, 62,101,133, 91, 62,166,190,112, 62,113, 83,237, 62,187,220, 79,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,128, 0, 0, 62,165,199,206, 62,113, 83,237, 62,187,220, 79, 62,101,133, 91, 62,166,190,112, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,101,133, 91, 62,166,190,112, 62, 88,145,110, 62,189,208,167, 62, 75,120,239, 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 88,144,
- 62,193,135, 46, 62, 75,120,239, 62,169,150, 70, 62, 88,145,110, 62,189,208,167, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 88,145,110, 62,189,208,167,
- 62, 76, 88,170, 62,213,159,187, 62, 63, 88,144, 62,193,135, 46, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 52,163,179, 62,217,196, 7, 62, 63, 88,144,
- 62,193,135, 46, 62, 76, 88,170, 62,213,159,187, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 76, 88,170, 62,213,159,187, 62, 88,145,110, 62,189,208,167,
- 62,100, 81, 63, 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 88, 86,190, 62,233, 32,221, 62, 76,204,254, 63, 0, 0, 0, 62, 64,223,251,
- 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 64,223,251, 62,236,207, 67, 62, 76, 88,170, 62,213,159,187, 62, 88, 86,190, 62,233, 32,221,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,100, 81, 63, 62,210, 92, 60, 62, 88, 86,190, 62,233, 32,221, 62, 76, 88,170, 62,213,159,187, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 76, 88,170, 62,213,159,187, 62, 64,223,251, 62,236,207, 67, 62, 52,163,179, 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 63, 88,144,
- 62,193,135, 46, 62, 52,163,179, 62,217,196, 7, 62, 39,172,153, 62,198,230,230, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 39,172,153, 62,198,230,230,
- 62, 50, 14,213, 62,174, 54, 78, 62, 63, 88,144, 62,193,135, 46, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 75,120,239, 62,169,150, 70, 62, 63, 88,144,
- 62,193,135, 46, 62, 50, 14,213, 62,174, 54, 78, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 50, 14,213, 62,174, 54, 78, 62, 39,172,153, 62,198,230,230,
- 62, 25,153,214, 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 88, 86,190, 62,233, 32,221, 62,100, 81, 63, 62,210, 92, 60, 62,114,114,166,
- 62,233, 23, 63, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,114,114,166, 62,233, 23, 63, 62,102,102,126, 62,255,252, 25, 62, 88, 86,190, 62,233, 32,221,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 76,204,254, 63, 0, 0, 0, 62, 88, 86,190, 62,233, 32,221, 62,102,102,126, 62,255,252, 25, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,102,102,126, 62,255,252, 25, 62,114,114,166, 62,233, 23, 63, 62,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,134,198,173,
- 62,233, 23, 63, 62,128, 0, 0, 63, 0, 0, 0, 62,114,114,166, 62,233, 23, 63, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,114,114,166, 62,233, 23, 63,
- 62,128, 0, 0, 62,209,190,149, 62,134,198,173, 62,233, 23, 63, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,141,215, 97, 62,210, 92, 60, 62,134,198,173,
- 62,233, 23, 63, 62,128, 0, 0, 62,209,190,149, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 62,209,190,149, 62,114,114,166, 62,233, 23, 63,
- 62,100, 81, 63, 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,113, 83,237, 62,187,220, 79, 62,128, 0, 0, 62,165,199,206, 62,135, 86, 9,
- 62,187,220, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,135, 86, 9, 62,187,220, 79, 62,128, 0, 0, 62,209,190,149, 62,113, 83,237, 62,187,220, 79,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,100, 81, 63, 62,210, 92, 60, 62,113, 83,237, 62,187,220, 79, 62,128, 0, 0, 62,209,190,149, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,128, 0, 0, 62,209,190,149, 62,135, 86, 9, 62,187,220, 79, 62,141,215, 97, 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,134,198,173,
- 62,233, 23, 63, 62,141,215, 97, 62,210, 92, 60, 62,147,212,161, 62,233, 32,221, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,147,212,161, 62,233, 32,221,
- 62,140,204,193, 62,255,252, 25, 62,134,198,173, 62,233, 23, 63, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 0, 0, 0, 62,134,198,173,
- 62,233, 23, 63, 62,140,204,193, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,140,204,193, 62,255,252, 25, 62,147,212,161, 62,233, 32,221,
- 62,153,153,129, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,172, 41,180, 62,198,230,227, 62,165,174, 39, 62,217,196, 7, 62,160, 83,184,
- 62,193,135, 46, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,160, 83,184, 62,193,135, 46, 62,166,248,150, 62,174, 54, 78, 62,172, 41,180, 62,198,230,227,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,179, 51, 21, 62,180,111,165, 62,172, 41,180, 62,198,230,227, 62,166,248,150, 62,174, 54, 78, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,166,248,150, 62,174, 54, 78, 62,160, 83,184, 62,193,135, 46, 62,154, 67,137, 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,147,183, 73,
- 62,189,208,167, 62,154, 67,137, 62,169,150, 70, 62,160, 83,184, 62,193,135, 46, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,160, 83,184, 62,193,135, 46,
- 62,153,211,171, 62,213,159,187, 62,147,183, 73, 62,189,208,167, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,141,215, 97, 62,210, 92, 60, 62,147,183, 73,
- 62,189,208,167, 62,153,211,171, 62,213,159,187, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,153,211,171, 62,213,159,187, 62,160, 83,184, 62,193,135, 46,
- 62,165,174, 39, 62,217,196, 7, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,159,144, 3, 62,236,207, 67, 62,153,153,129, 63, 0, 0, 0, 62,147,212,161,
- 62,233, 32,221, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,147,212,161, 62,233, 32,221, 62,153,211,171, 62,213,159,187, 62,159,144, 3, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,165,174, 39, 62,217,196, 7, 62,159,144, 3, 62,236,207, 67, 62,153,211,171, 62,213,159,187, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,153,211,171, 62,213,159,187, 62,147,212,161, 62,233, 32,221, 62,141,215, 97, 62,210, 92, 60, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,147,183, 73,
- 62,189,208,167, 62,141,215, 97, 62,210, 92, 60, 62,135, 86, 9, 62,187,220, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,135, 86, 9, 62,187,220, 79,
- 62,141, 61, 82, 62,166,190,112, 62,147,183, 73, 62,189,208,167, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,154, 67,137, 62,169,150, 70, 62,147,183, 73,
- 62,189,208,167, 62,141, 61, 82, 62,166,190,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,141, 61, 82, 62,166,190,112, 62,135, 86, 9, 62,187,220, 79,
- 62,128, 0, 0, 62,165,199,206, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,147,163, 1, 63, 9,152, 91, 62,141,132,224, 63, 19, 29,246, 62,134,168,251,
- 63, 9,150,107, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,134,168,251, 63, 9,150,107, 62,140,204,193, 62,255,252, 25, 62,147,163, 1, 63, 9,152, 91,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,153,153,129, 63, 0, 0, 0, 62,147,163, 1, 63, 9,152, 91, 62,140,204,193, 62,255,252, 25, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,140,204,193, 62,255,252, 25, 62,134,168,251, 63, 9,150,107, 62,128, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,114,174, 11,
- 63, 9,150,107, 62,128, 0, 0, 63, 0, 0, 0, 62,134,168,251, 63, 9,150,107, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,134,168,251, 63, 9,150,107,
- 62,128, 0, 0, 63, 19, 98,209, 62,114,174, 11, 63, 9,150,107, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,100,246, 64, 63, 19, 29,246, 62,114,174, 11,
- 63, 9,150,107, 62,128, 0, 0, 63, 19, 98,209, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 19, 98,209, 62,134,168,251, 63, 9,150,107,
- 62,141,132,224, 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,135, 9, 86, 63, 28,140,130, 62,128, 0, 0, 63, 37,200, 23, 62,113,237, 83,
- 63, 28,140,130, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,113,237, 83, 63, 28,140,130, 62,128, 0, 0, 63, 19, 98,209, 62,135, 9, 86, 63, 28,140,130,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,141,132,224, 63, 19, 29,246, 62,135, 9, 86, 63, 28,140,130, 62,128, 0, 0, 63, 19, 98,209, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,128, 0, 0, 63, 19, 98,209, 62,113,237, 83, 63, 28,140,130, 62,100,246, 64, 63, 19, 29,246, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,114,174, 11,
- 63, 9,150,107, 62,100,246, 64, 63, 19, 29,246, 62, 88,185,255, 63, 9,152, 90, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 88,185,255, 63, 9,152, 90,
- 62,102,102,126, 62,255,252, 25, 62,114,174, 11, 63, 9,150,107, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 63, 0, 0, 0, 62,114,174, 11,
- 63, 9,150,107, 62,102,102,126, 62,255,252, 25, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,102,102,126, 62,255,252, 25, 62, 88,185,255, 63, 9,152, 90,
- 62, 76,204,254, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,223, 16, 63, 62,187,220, 62, 62,216,142,233, 62,210, 92, 49, 62,210,174,248,
- 62,189,208,153, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,210,174,248, 62,189,208,153, 62,217, 40,237, 62,166,190, 91, 62,223, 16, 63, 62,187,220, 62,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,230,102, 72, 62,165,199,183, 62,223, 16, 63, 62,187,220, 62, 62,217, 40,237, 62,166,190, 91, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,217, 40,237, 62,166,190, 91, 62,210,174,248, 62,189,208,153, 62,204, 34,175, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,198, 18,129,
- 62,193,135, 37, 62,204, 34,175, 62,169,150, 54, 62,210,174,248, 62,189,208,153, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,210,174,248, 62,189,208,153,
- 62,204,146,151, 62,213,159,180, 62,198, 18,129, 62,193,135, 37, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,192,184, 21, 62,217,196, 6, 62,198, 18,129,
- 62,193,135, 37, 62,204,146,151, 62,213,159,180, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,204,146,151, 62,213,159,180, 62,210,174,248, 62,189,208,153,
- 62,216,142,233, 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,210,145,170, 62,233, 32,214, 62,204,204,202, 63, 0, 0, 0, 62,198,214, 65,
- 62,236,207, 67, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,198,214, 65, 62,236,207, 67, 62,204,146,151, 62,213,159,180, 62,210,145,170, 62,233, 32,214,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,216,142,233, 62,210, 92, 49, 62,210,145,170, 62,233, 32,214, 62,204,146,151, 62,213,159,180, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,204,146,151, 62,213,159,180, 62,198,214, 65, 62,236,207, 67, 62,192,184, 21, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,198, 18,129,
- 62,193,135, 37, 62,192,184, 21, 62,217,196, 6, 62,186, 60,127, 62,198,230,225, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,186, 60,127, 62,198,230,225,
- 62,191,109,154, 62,174, 54, 68, 62,198, 18,129, 62,193,135, 37, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,204, 34,175, 62,169,150, 54, 62,198, 18,129,
- 62,193,135, 37, 62,191,109,154, 62,174, 54, 68, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,191,109,154, 62,174, 54, 68, 62,186, 60,127, 62,198,230,225,
- 62,179, 51, 21, 62,180,111,165, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,210,145,170, 62,233, 32,214, 62,216,142,233, 62,210, 92, 49, 62,223,159,171,
- 62,233, 23, 57, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,223,159,171, 62,233, 23, 57, 62,217,153,154, 62,255,252, 24, 62,210,145,170, 62,233, 32,214,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,204,204,202, 63, 0, 0, 0, 62,210,145,170, 62,233, 32,214, 62,217,153,154, 62,255,252, 24, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,217,153,154, 62,255,252, 24, 62,223,159,171, 62,233, 23, 57, 62,230,102,101, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,237, 45, 20,
- 62,233, 23, 55, 62,230,102,101, 63, 0, 0, 0, 62,223,159,171, 62,233, 23, 57, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,223,159,171, 62,233, 23, 57,
- 62,230,102, 88, 62,209,190,135, 62,237, 45, 20, 62,233, 23, 55, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,244, 61,199, 62,210, 92, 46, 62,237, 45, 20,
- 62,233, 23, 55, 62,230,102, 88, 62,209,190,135, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102, 88, 62,209,190,135, 62,223,159,171, 62,233, 23, 57,
- 62,216,142,233, 62,210, 92, 49, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,223, 16, 63, 62,187,220, 62, 62,230,102, 72, 62,165,199,183, 62,237,188, 99,
- 62,187,220, 60, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,237,188, 99, 62,187,220, 60, 62,230,102, 88, 62,209,190,135, 62,223, 16, 63, 62,187,220, 62,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,216,142,233, 62,210, 92, 49, 62,223, 16, 63, 62,187,220, 62, 62,230,102, 88, 62,209,190,135, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,230,102, 88, 62,209,190,135, 62,237,188, 99, 62,187,220, 60, 62,244, 61,199, 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,237, 45, 20,
- 62,233, 23, 55, 62,244, 61,199, 62,210, 92, 46, 62,250, 59, 21, 62,233, 32,213, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,250, 59, 21, 62,233, 32,213,
- 62,243, 51, 53, 62,255,252, 24, 62,237, 45, 20, 62,233, 23, 55, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,101, 63, 0, 0, 0, 62,237, 45, 20,
- 62,233, 23, 55, 62,243, 51, 53, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,243, 51, 53, 62,255,252, 24, 62,250, 59, 21, 62,233, 32,213,
- 63, 0, 0, 0, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 9, 72, 17, 62,198,230,227, 63, 6, 10, 77, 62,217,196, 6, 63, 3, 93, 15,
- 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 3, 93, 15, 62,193,135, 36, 63, 6,175,123, 62,174, 54, 65, 63, 9, 72, 17, 62,198,230,227,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 12,204,191, 62,180,111,160, 63, 9, 72, 17, 62,198,230,227, 63, 6,175,123, 62,174, 54, 65, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 6,175,123, 62,174, 54, 65, 63, 3, 93, 15, 62,193,135, 36, 63, 0, 84,241, 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,250, 29,169,
- 62,189,208,150, 63, 0, 84,241, 62,169,150, 52, 63, 3, 93, 15, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 3, 93, 15, 62,193,135, 36,
- 63, 0, 29, 12, 62,213,159,179, 62,250, 29,169, 62,189,208,150, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,244, 61,199, 62,210, 92, 46, 62,250, 29,169,
- 62,189,208,150, 63, 0, 29, 12, 62,213,159,179, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 29, 12, 62,213,159,179, 63, 3, 93, 15, 62,193,135, 36,
- 63, 6, 10, 77, 62,217,196, 6, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 2,251, 62, 62,236,207, 67, 63, 0, 0, 0, 63, 0, 0, 0, 62,250, 59, 21,
- 62,233, 32,213, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,250, 59, 21, 62,233, 32,213, 63, 0, 29, 12, 62,213,159,179, 63, 2,251, 62, 62,236,207, 67,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 6, 10, 77, 62,217,196, 6, 63, 2,251, 62, 62,236,207, 67, 63, 0, 29, 12, 62,213,159,179, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 0, 29, 12, 62,213,159,179, 62,250, 59, 21, 62,233, 32,213, 62,244, 61,199, 62,210, 92, 46, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,250, 29,169,
- 62,189,208,150, 62,244, 61,199, 62,210, 92, 46, 62,237,188, 99, 62,187,220, 60, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,237,188, 99, 62,187,220, 60,
- 62,243,163,164, 62,166,190, 89, 62,250, 29,169, 62,189,208,150, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 84,241, 62,169,150, 52, 62,250, 29,169,
- 62,189,208,150, 62,243,163,164, 62,166,190, 89, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,243,163,164, 62,166,190, 89, 62,237,188, 99, 62,187,220, 60,
- 62,230,102, 72, 62,165,199,183, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,250, 9,132, 63, 9,152, 94, 62,243,235,101, 63, 19, 29,252, 62,237, 15,114,
- 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,237, 15,114, 63, 9,150,113, 62,243, 51, 53, 62,255,252, 24, 62,250, 9,132, 63, 9,152, 94,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 0, 0, 63, 0, 0, 0, 62,250, 9,132, 63, 9,152, 94, 62,243, 51, 53, 62,255,252, 24, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,243, 51, 53, 62,255,252, 24, 62,237, 15,114, 63, 9,150,113, 62,230,102,101, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,223,189,103,
- 63, 9,150,112, 62,230,102,101, 63, 0, 0, 0, 62,237, 15,114, 63, 9,150,113, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,237, 15,114, 63, 9,150,113,
- 62,230,102,117, 63, 19, 98,220, 62,223,189,103, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,216,225,128, 63, 19, 29,254, 62,223,189,103,
- 63, 9,150,112, 62,230,102,117, 63, 19, 98,220, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,117, 63, 19, 98,220, 62,237, 15,114, 63, 9,150,113,
- 62,243,235,101, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,237,111,222, 63, 28,140,143, 62,230,102,129, 63, 37,200, 48, 62,223, 93, 22,
- 63, 28,140,145, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,223, 93, 22, 63, 28,140,145, 62,230,102,117, 63, 19, 98,220, 62,237,111,222, 63, 28,140,143,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,243,235,101, 63, 19, 29,252, 62,237,111,222, 63, 28,140,143, 62,230,102,117, 63, 19, 98,220, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,230,102,117, 63, 19, 98,220, 62,223, 93, 22, 63, 28,140,145, 62,216,225,128, 63, 19, 29,254, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,223,189,103,
- 63, 9,150,112, 62,216,225,128, 63, 19, 29,254, 62,210,195, 85, 63, 9,152, 96, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,210,195, 85, 63, 9,152, 96,
- 62,217,153,154, 62,255,252, 24, 62,223,189,103, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102,101, 63, 0, 0, 0, 62,223,189,103,
- 63, 9,150,112, 62,217,153,154, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,217,153,154, 62,255,252, 24, 62,210,195, 85, 63, 9,152, 96,
- 62,204,204,202, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 34,187, 97, 62,187,220, 72, 63, 31,122,178, 62,210, 92, 55, 63, 28,138,186,
- 62,189,208,155, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 28,138,186, 62,189,208,155, 63, 31,199,185, 62,166,190, 96, 63, 34,187, 97, 62,187,220, 72,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,102,107, 62,165,199,201, 63, 34,187, 97, 62,187,220, 72, 63, 31,199,185, 62,166,190, 96, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 31,199,185, 62,166,190, 96, 63, 28,138,186, 62,189,208,155, 63, 25, 68,150, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 22, 60,123,
- 62,193,135, 36, 63, 25, 68,150, 62,169,150, 54, 63, 28,138,186, 62,189,208,155, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 28,138,186, 62,189,208,155,
- 63, 25,124,133, 62,213,159,181, 63, 22, 60,123, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 19,143, 64, 62,217,196, 4, 63, 22, 60,123,
- 62,193,135, 36, 63, 25,124,133, 62,213,159,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 25,124,133, 62,213,159,181, 63, 28,138,186, 62,189,208,155,
- 63, 31,122,178, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 28,124, 14, 62,233, 32,218, 63, 25,153,155, 63, 0, 0, 0, 63, 22,158, 86,
- 62,236,207, 65, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 22,158, 86, 62,236,207, 65, 63, 25,124,133, 62,213,159,181, 63, 28,124, 14, 62,233, 32,218,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 31,122,178, 62,210, 92, 55, 63, 28,124, 14, 62,233, 32,218, 63, 25,124,133, 62,213,159,181, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 25,124,133, 62,213,159,181, 63, 22,158, 86, 62,236,207, 65, 63, 19,143, 64, 62,217,196, 4, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 22, 60,123,
- 62,193,135, 36, 63, 19,143, 64, 62,217,196, 4, 63, 16, 81,117, 62,198,230,223, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 16, 81,117, 62,198,230,223,
- 63, 18,234, 7, 62,174, 54, 65, 63, 22, 60,123, 62,193,135, 36, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 25, 68,150, 62,169,150, 54, 63, 22, 60,123,
- 62,193,135, 36, 63, 18,234, 7, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 18,234, 7, 62,174, 54, 65, 63, 16, 81,117, 62,198,230,223,
- 63, 12,204,191, 62,180,111,160, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 28,124, 14, 62,233, 32,218, 63, 31,122,178, 62,210, 92, 55, 63, 35, 3, 17,
- 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 35, 3, 17, 62,233, 23, 58, 63, 32, 0, 2, 62,255,252, 24, 63, 28,124, 14, 62,233, 32,218,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 25,153,155, 63, 0, 0, 0, 63, 28,124, 14, 62,233, 32,218, 63, 32, 0, 2, 62,255,252, 24, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 32, 0, 2, 62,255,252, 24, 63, 35, 3, 17, 62,233, 23, 58, 63, 38,102,109, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 41,201,200,
- 62,233, 23, 58, 63, 38,102,109, 63, 0, 0, 0, 63, 35, 3, 17, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 35, 3, 17, 62,233, 23, 58,
- 63, 38,102,109, 62,209,190,143, 63, 41,201,200, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 45, 82, 38, 62,210, 92, 55, 63, 41,201,200,
- 62,233, 23, 58, 63, 38,102,109, 62,209,190,143, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,109, 62,209,190,143, 63, 35, 3, 17, 62,233, 23, 58,
- 63, 31,122,178, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 34,187, 97, 62,187,220, 72, 63, 38,102,107, 62,165,199,201, 63, 42, 17,118,
- 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 42, 17,118, 62,187,220, 72, 63, 38,102,109, 62,209,190,143, 63, 34,187, 97, 62,187,220, 72,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 31,122,178, 62,210, 92, 55, 63, 34,187, 97, 62,187,220, 72, 63, 38,102,109, 62,209,190,143, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 38,102,109, 62,209,190,143, 63, 42, 17,118, 62,187,220, 72, 63, 45, 82, 38, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 41,201,200,
- 62,233, 23, 58, 63, 45, 82, 38, 62,210, 92, 55, 63, 48, 80,204, 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 80,204, 62,233, 32,218,
- 63, 44,204,215, 62,255,252, 23, 63, 41,201,200, 62,233, 23, 58, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,109, 63, 0, 0, 0, 63, 41,201,200,
- 62,233, 23, 58, 63, 44,204,215, 62,255,252, 23, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 44,204,215, 62,255,252, 23, 63, 48, 80,204, 62,233, 32,218,
- 63, 51, 51, 63, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 60,123, 85, 62,198,230,253, 63, 57, 61,144, 62,217,196, 19, 63, 54,144, 86,
- 62,193,135, 68, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 54,144, 86, 62,193,135, 68, 63, 57,226,196, 62,174, 54,114, 63, 60,123, 85, 62,198,230,253,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 64, 0, 0, 62,180,111,211, 63, 60,123, 85, 62,198,230,253, 63, 57,226,196, 62,174, 54,114, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 57,226,196, 62,174, 54,114, 63, 54,144, 86, 62,193,135, 68, 63, 51,136, 58, 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 66, 27,
- 62,189,208,173, 63, 51,136, 58, 62,169,150, 90, 63, 54,144, 86, 62,193,135, 68, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 54,144, 86, 62,193,135, 68,
- 63, 51, 80, 80, 62,213,159,192, 63, 48, 66, 27, 62,189,208,173, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 45, 82, 38, 62,210, 92, 55, 63, 48, 66, 27,
- 62,189,208,173, 63, 51, 80, 80, 62,213,159,192, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 51, 80, 80, 62,213,159,192, 63, 54,144, 86, 62,193,135, 68,
- 63, 57, 61,144, 62,217,196, 19, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 54, 46,128, 62,236,207, 75, 63, 51, 51, 63, 63, 0, 0, 0, 63, 48, 80,204,
- 62,233, 32,218, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 80,204, 62,233, 32,218, 63, 51, 80, 80, 62,213,159,192, 63, 54, 46,128, 62,236,207, 75,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 57, 61,144, 62,217,196, 19, 63, 54, 46,128, 62,236,207, 75, 63, 51, 80, 80, 62,213,159,192, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 51, 80, 80, 62,213,159,192, 63, 48, 80,204, 62,233, 32,218, 63, 45, 82, 38, 62,210, 92, 55, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 66, 27,
- 62,189,208,173, 63, 45, 82, 38, 62,210, 92, 55, 63, 42, 17,118, 62,187,220, 72, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 42, 17,118, 62,187,220, 72,
- 63, 45, 5, 26, 62,166,190,117, 63, 48, 66, 27, 62,189,208,173, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 51,136, 58, 62,169,150, 90, 63, 48, 66, 27,
- 62,189,208,173, 63, 45, 5, 26, 62,166,190,117, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 45, 5, 26, 62,166,190,117, 63, 42, 17,118, 62,187,220, 72,
- 63, 38,102,107, 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 55,255, 63, 9,152, 94, 63, 45, 40,237, 63, 19, 29,252, 63, 41,186,242,
- 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 41,186,242, 63, 9,150,112, 63, 44,204,215, 62,255,252, 23, 63, 48, 55,255, 63, 9,152, 94,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 51, 51, 63, 63, 0, 0, 0, 63, 48, 55,255, 63, 9,152, 94, 63, 44,204,215, 62,255,252, 23, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 44,204,215, 62,255,252, 23, 63, 41,186,242, 63, 9,150,112, 63, 38,102,109, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 35, 17,235,
- 63, 9,150,112, 63, 38,102,109, 63, 0, 0, 0, 63, 41,186,242, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 41,186,242, 63, 9,150,112,
- 63, 38,102,113, 63, 19, 98,219, 63, 35, 17,235, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 31,163,245, 63, 19, 29,253, 63, 35, 17,235,
- 63, 9,150,112, 63, 38,102,113, 63, 19, 98,219, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,113, 63, 19, 98,219, 63, 41,186,242, 63, 9,150,112,
- 63, 45, 40,237, 63, 19, 29,252, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 41,235, 38, 63, 28,140,141, 63, 38,102,117, 63, 37,200, 45, 63, 34,225,192,
- 63, 28,140,142, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 34,225,192, 63, 28,140,142, 63, 38,102,113, 63, 19, 98,219, 63, 41,235, 38, 63, 28,140,141,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 45, 40,237, 63, 19, 29,252, 63, 41,235, 38, 63, 28,140,141, 63, 38,102,113, 63, 19, 98,219, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 38,102,113, 63, 19, 98,219, 63, 34,225,192, 63, 28,140,142, 63, 31,163,245, 63, 19, 29,253, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 35, 17,235,
- 63, 9,150,112, 63, 31,163,245, 63, 19, 29,253, 63, 28,148,223, 63, 9,152, 94, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 28,148,223, 63, 9,152, 94,
- 63, 32, 0, 2, 62,255,252, 24, 63, 35, 17,235, 63, 9,150,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,109, 63, 0, 0, 0, 63, 35, 17,235,
- 63, 9,150,112, 63, 32, 0, 2, 62,255,252, 24, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 32, 0, 2, 62,255,252, 24, 63, 28,148,223, 63, 9,152, 94,
- 63, 25,153,155, 63, 0, 0, 0, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,107,129,188, 62,128, 45, 66, 63, 99, 71,235, 62,120, 76,222, 63,106, 37, 94,
- 62, 83, 97, 84, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,106, 37, 94, 62, 83, 97, 84, 63,115, 51, 65, 62, 97,151,248, 63,107,129,188, 62,128, 45, 66,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,115, 51, 65, 62,135, 83,151, 63,107,129,188, 62,128, 45, 66, 63,115, 51, 65, 62, 97,151,248, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,115, 51, 65, 62, 97,151,248, 63,106, 37, 94, 62, 83, 97, 84, 63,115, 51, 65, 62, 52,111, 90, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,107,129,188,
- 62,128, 45, 66, 63,115, 51, 65, 62,135, 83,151, 63,108,123,142, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,108,123,142, 62,151,144,169,
- 63,101, 50,231, 62,146,201, 17, 63,107,129,188, 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 99, 71,235, 62,120, 76,222, 63,107,129,188,
- 62,128, 45, 66, 63,101, 50,231, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,101, 50,231, 62,146,201, 17, 63,108,123,142, 62,151,144,169,
- 63,102,187,106, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 96, 56, 71, 62,166,190, 99, 63, 89,153,149, 62,165,199,201, 63, 93,238, 22,
- 62,144,101,243, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 93,238, 22, 62,144,101,243, 63,101, 50,231, 62,146,201, 17, 63, 96, 56, 71, 62,166,190, 99,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,102,187,106, 62,169,150, 54, 63, 96, 56, 71, 62,166,190, 99, 63,101, 50,231, 62,146,201, 17, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,101, 50,231, 62,146,201, 17, 63, 93,238, 22, 62,144,101,243, 63, 99, 71,235, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,109, 21,249,
- 62,174, 54, 65, 63,102,187,106, 62,169,150, 54, 63,108,123,142, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,108,123,142, 62,151,144,169,
- 63,115, 51, 65, 62,157,231, 93, 63,109, 21,249, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 65, 62,180,111,160, 63,109, 21,249,
- 62,174, 54, 65, 63,115, 51, 65, 62,157,231, 93, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 65, 62,157,231, 93, 63,108,123,142, 62,151,144,169,
- 63,115, 51, 65, 62,135, 83,151, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,149, 62,115,162, 79, 63, 99, 71,235, 62,120, 76,222, 63, 93,238, 22,
- 62,144,101,243, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 93,238, 22, 62,144,101,243, 63, 85, 69, 21, 62,144,102, 3, 63, 89,153,149, 62,115,162, 79,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 79,235, 68, 62,120, 77, 37, 63, 89,153,149, 62,115,162, 79, 63, 85, 69, 21, 62,144,102, 3, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 85, 69, 21, 62,144,102, 3, 63, 93,238, 22, 62,144,101,243, 63, 89,153,149, 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,149,
- 62,115,162, 79, 63, 79,235, 68, 62,120, 77, 37, 63, 83,186, 24, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 83,186, 24, 62, 70,176,245,
- 63, 95,121, 22, 62, 70,176,204, 63, 89,153,149, 62,115,162, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 99, 71,235, 62,120, 76,222, 63, 89,153,149,
- 62,115,162, 79, 63, 95,121, 22, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 95,121, 22, 62, 70,176,204, 63, 83,186, 24, 62, 70,176,245,
- 63, 89,153,152, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,103,119, 61, 62, 30,253,179, 63,115, 51, 65, 62, 52,111, 90, 63,106, 37, 94,
- 62, 83, 97, 84, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,106, 37, 94, 62, 83, 97, 84, 63, 95,121, 22, 62, 70,176,204, 63,103,119, 61, 62, 30,253,179,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 89,153,152, 62, 23, 31,198, 63,103,119, 61, 62, 30,253,179, 63, 95,121, 22, 62, 70,176,204, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 95,121, 22, 62, 70,176,204, 63,106, 37, 94, 62, 83, 97, 84, 63, 99, 71,235, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 75,187,248,
- 62, 30,253,241, 63, 89,153,152, 62, 23, 31,198, 63, 83,186, 24, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 83,186, 24, 62, 70,176,245,
- 63, 73, 13,214, 62, 83, 97,181, 63, 75,187,248, 62, 30,253,241, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62, 52,111,202, 63, 75,187,248,
- 62, 30,253,241, 63, 73, 13,214, 62, 83, 97,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 73, 13,214, 62, 83, 97,181, 63, 83,186, 24, 62, 70,176,245,
- 63, 79,235, 68, 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,152, 61,147, 41,111, 63, 64, 0, 0, 61,180,111,195, 63, 64, 0, 0,
- 61, 52, 65,111, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 61, 52, 65,111, 63,117, 49, 38, 61, 52, 64,225, 63, 89,153,152, 61,147, 41,111,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,115, 51, 65, 61,180,111, 83, 63, 89,153,152, 61,147, 41,111, 63,117, 49, 38, 61, 52, 64,225, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,117, 49, 38, 61, 52, 64,225, 63, 64, 0, 0, 61, 52, 65,111, 63,121,222,208,178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,152,
- 61,147, 41,111, 63,115, 51, 65, 61,180,111, 83, 63, 99, 51,172, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 99, 51,172, 61,231, 46, 48,
- 63, 79,255,135, 61,231, 46,120, 63, 89,153,152, 61,147, 41,111, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 61,180,111,195, 63, 89,153,152,
- 61,147, 41,111, 63, 79,255,135, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 79,255,135, 61,231, 46,120, 63, 99, 51,172, 61,231, 46, 48,
- 63, 89,153,152, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 75,187,248, 62, 30,253,241, 63, 64, 0, 0, 62, 52,111,202, 63, 64, 0, 0,
- 62, 7, 71, 24, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62, 7, 71, 24, 63, 79,255,135, 61,231, 46,120, 63, 75,187,248, 62, 30,253,241,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 89,153,152, 62, 23, 31,198, 63, 75,187,248, 62, 30,253,241, 63, 79,255,135, 61,231, 46,120, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 79,255,135, 61,231, 46,120, 63, 64, 0, 0, 62, 7, 71, 24, 63, 64, 0, 0, 61,180,111,195, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,103,119, 61,
- 62, 30,253,179, 63, 89,153,152, 62, 23, 31,198, 63, 99, 51,172, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 99, 51,172, 61,231, 46, 48,
- 63,115, 51, 66, 62, 7, 70,199, 63,103,119, 61, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 65, 62, 52,111, 90, 63,103,119, 61,
- 62, 30,253,179, 63,115, 51, 66, 62, 7, 70,199, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 66, 62, 7, 70,199, 63, 99, 51,172, 61,231, 46, 48,
- 63,115, 51, 65, 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 71,177,122, 62,128, 45,120, 63, 64, 0, 0, 62,135, 83,218, 63, 64, 0, 0,
- 62, 97,152,115, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62, 97,152,115, 63, 73, 13,214, 62, 83, 97,181, 63, 71,177,122, 62,128, 45,120,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 79,235, 68, 62,120, 77, 37, 63, 71,177,122, 62,128, 45,120, 63, 73, 13,214, 62, 83, 97,181, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 73, 13,214, 62, 83, 97,181, 63, 64, 0, 0, 62, 97,152,115, 63, 64, 0, 0, 62, 52,111,202, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 71,177,122,
- 62,128, 45,120, 63, 79,235, 68, 62,120, 77, 37, 63, 78, 0, 72, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 78, 0, 72, 62,146,201, 52,
- 63, 70,183,169, 62,151,144,219, 63, 71,177,122, 62,128, 45,120, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62,135, 83,218, 63, 71,177,122,
- 62,128, 45,120, 63, 70,183,169, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70,183,169, 62,151,144,219, 63, 78, 0, 72, 62,146,201, 52,
- 63, 76,119,198, 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 70, 29, 61, 62,174, 54,114, 63, 64, 0, 0, 62,180,111,211, 63, 64, 0, 0,
- 62,157,231,162, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62,157,231,162, 63, 70,183,169, 62,151,144,219, 63, 70, 29, 61, 62,174, 54,114,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 76,119,198, 62,169,150, 90, 63, 70, 29, 61, 62,174, 54,114, 63, 70,183,169, 62,151,144,219, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 70,183,169, 62,151,144,219, 63, 64, 0, 0, 62,157,231,162, 63, 64, 0, 0, 62,135, 83,218, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 82,250,230,
- 62,166,190,117, 63, 76,119,198, 62,169,150, 90, 63, 78, 0, 72, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 78, 0, 72, 62,146,201, 52,
- 63, 85, 69, 21, 62,144,102, 3, 63, 82,250,230, 62,166,190,117, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 89,153,149, 62,165,199,201, 63, 82,250,230,
- 62,166,190,117, 63, 85, 69, 21, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 85, 69, 21, 62,144,102, 3, 63, 78, 0, 72, 62,146,201, 52,
- 63, 79,235, 68, 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,245,167,179, 62,128, 45, 72, 61,179,217, 94, 62,120, 76,222, 61,234,196,202,
- 62, 83, 97,100, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,234,196,202, 62, 83, 97,100, 62, 25,153,212, 62, 97,152, 2, 61,245,167,179, 62,128, 45, 72,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 25,153,214, 62,135, 83,156, 61,245,167,179, 62,128, 45, 72, 62, 25,153,212, 62, 97,152, 2, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 25,153,212, 62, 97,152, 2, 61,234,196,202, 62, 83, 97,100, 62, 25,153,214, 62, 52,111,106, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,245,167,179,
- 62,128, 45, 72, 62, 25,153,214, 62,135, 83,156, 61,253,118, 62, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,253,118, 62, 62,151,144,174,
- 61,195, 49, 53, 62,146,201, 17, 61,245,167,179, 62,128, 45, 72, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,179,217, 94, 62,120, 76,222, 61,245,167,179,
- 62,128, 45, 72, 61,195, 49, 53, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,195, 49, 53, 62,146,201, 17, 61,253,118, 62, 62,151,144,174,
- 61,207,117, 70, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,155, 92, 79, 62,166,190, 91, 61, 76,205,194, 62,165,199,186, 61,137, 10,212,
- 62,144,101,238, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,137, 10,212, 62,144,101,238, 61,195, 49, 53, 62,146,201, 17, 61,155, 92, 79, 62,166,190, 91,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61,207,117, 70, 62,169,150, 54, 61,155, 92, 79, 62,166,190, 91, 61,195, 49, 53, 62,146,201, 17, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,195, 49, 53, 62,146,201, 17, 61,137, 10,212, 62,144,101,238, 61,179,217, 94, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 1, 36,204,
- 62,174, 54, 70, 61,207,117, 70, 62,169,150, 54, 61,253,118, 62, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,253,118, 62, 62,151,144,174,
- 62, 25,153,213, 62,157,231,100, 62, 1, 36,204, 62,174, 54, 70, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,214, 62,180,111,165, 62, 1, 36,204,
- 62,174, 54, 70, 62, 25,153,213, 62,157,231,100, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,213, 62,157,231,100, 61,253,118, 62, 62,151,144,174,
- 62, 25,153,214, 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,205,188, 62,115,162, 53, 61,179,217, 94, 62,120, 76,222, 61,137, 10,212,
- 62,144,101,238, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,137, 10,212, 62,144,101,238, 61, 7,133,207, 62,144,101,236, 61, 76,205,188, 62,115,162, 53,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 60, 71,162,255, 62,120, 76,216, 61, 76,205,188, 62,115,162, 53, 61, 7,133,207, 62,144,101,236, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61, 7,133,207, 62,144,101,236, 61,137, 10,212, 62,144,101,238, 61, 76,205,194, 62,165,199,186, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,205,188,
- 62,115,162, 53, 60, 71,162,255, 62,120, 76,216, 60,221,171,190, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60,221,171,190, 62, 70,176,194,
- 61,149, 98,194, 62, 70,176,194, 61, 76,205,188, 62,115,162, 53, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,179,217, 94, 62,120, 76,222, 61, 76,205,188,
- 62,115,162, 53, 61,149, 98,194, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,149, 98,194, 62, 70,176,194, 60,221,171,190, 62, 70,176,194,
- 61, 76,205,193, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,213, 83,198, 62, 30,253,179, 62, 25,153,214, 62, 52,111,106, 61,234,196,202,
- 62, 83, 97,100, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 61,234,196,202, 62, 83, 97,100, 61,149, 98,194, 62, 70,176,194, 61,213, 83,198, 62, 30,253,179,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 61, 76,205,193, 62, 23, 31,168, 61,213, 83,198, 62, 30,253,179, 61,149, 98,194, 62, 70,176,194, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 61,149, 98,194, 62, 70,176,194, 61,234,196,202, 62, 83, 97,100, 61,179,217, 94, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,126,239, 59,
- 62, 30,253,174, 63,131,105,154, 62, 23, 31,168, 63,131,118,175, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,131,118,175, 62, 70,176,194,
- 63,124, 65, 30, 62, 83, 97, 90, 63,126,239, 59, 62, 30,253,174, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 65, 62, 52,111, 90, 63,126,239, 59,
- 62, 30,253,174, 63,124, 65, 30, 62, 83, 97, 90, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,124, 65, 30, 62, 83, 97, 90, 63,131,118,175, 62, 70,176,194,
- 63,129,143, 70, 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,131,105,156, 61,147, 41,101, 63,115, 51, 65, 61,180,111, 83, 63,117, 49, 38,
- 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,117, 49, 38, 61, 52, 64,225, 63,135,148,232, 60,125,158,144, 63,131,105,156, 61,147, 41,101,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 25,153,215, 61,180,111,104, 61,128,245,122, 61,147, 41,101, 62, 25,153,224, 61, 52, 64,225, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,135,148,232, 60,125,158,144, 63,117, 49, 38, 61, 52, 64,225, 63,121,222,208,178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,128,245,122,
- 61,147, 41,101, 62, 25,153,215, 61,180,111,104, 61,179, 55, 89, 61,231, 46, 38, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,179, 55, 89, 61,231, 46, 38,
- 60,208,147, 96, 61,231, 46, 48, 61,128,245,122, 61,147, 41,101, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 65, 61,180,111, 83, 63,131,105,156,
- 61,147, 41,101, 63,129,153,102, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 60,208,147, 96, 61,231, 46, 48, 61,179, 55, 89, 61,231, 46, 38,
- 61, 76,205,193, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,126,239, 59, 62, 30,253,174, 63,115, 51, 65, 62, 52,111, 90, 63,115, 51, 66,
- 62, 7, 70,199, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 66, 62, 7, 70,199, 63,129,153,102, 61,231, 46, 48, 63,126,239, 59, 62, 30,253,174,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,131,105,154, 62, 23, 31,168, 63,126,239, 59, 62, 30,253,174, 63,129,153,102, 61,231, 46, 48, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,129,153,102, 61,231, 46, 48, 63,115, 51, 66, 62, 7, 70,199, 63,115, 51, 65, 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,213, 83,198,
- 62, 30,253,179, 61, 76,205,193, 62, 23, 31,168, 61,179, 55, 89, 61,231, 46, 38, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61,179, 55, 89, 61,231, 46, 38,
- 62, 25,153,217, 62, 7, 70,204, 61,213, 83,198, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,214, 62, 52,111,106, 61,213, 83,198,
- 62, 30,253,179, 62, 25,153,217, 62, 7, 70,204, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,217, 62, 7, 70,204, 61,179, 55, 89, 61,231, 46, 38,
- 62, 25,153,215, 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,122,228,192, 62,128, 45, 66, 63,115, 51, 65, 62,135, 83,151, 63,115, 51, 65,
- 62, 97,151,248, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 65, 62, 97,151,248, 63,124, 65, 30, 62, 83, 97, 90, 63,122,228,192, 62,128, 45, 66,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,129,143, 70, 62,120, 76,216, 63,122,228,192, 62,128, 45, 66, 63,124, 65, 30, 62, 83, 97, 90, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,124, 65, 30, 62, 83, 97, 90, 63,115, 51, 65, 62, 97,151,248, 63,115, 51, 65, 62, 52,111, 90, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,122,228,192,
- 62,128, 45, 66, 63,129,143, 70, 62,120, 76,216, 63,128,153,201, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,128,153,201, 62,146,201, 14,
- 63,121,234,239, 62,151,144,169, 63,122,228,192, 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 65, 62,135, 83,151, 63,122,228,192,
- 62,128, 45, 66, 63,121,234,239, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121,234,239, 62,151,144,169, 63,128,153,201, 62,146,201, 14,
- 63,127,171, 15, 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,121, 80,133, 62,174, 54, 65, 63,115, 51, 65, 62,180,111,160, 63,115, 51, 65,
- 62,157,231, 93, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63,115, 51, 65, 62,157,231, 93, 63,121,234,239, 62,151,144,169, 63,121, 80,133, 62,174, 54, 65,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63,127,171, 15, 62,169,150, 52, 63,121, 80,133, 62,174, 54, 65, 63,121,234,239, 62,151,144,169, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63,121,234,239, 62,151,144,169, 63,115, 51, 65, 62,157,231, 93, 63,115, 51, 65, 62,135, 83,151, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63,131, 23, 23,
- 62,166,190, 89, 63,127,171, 15, 62,169,150, 52, 63,128,153,201, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 59,153,200,136, 62,146,201, 14,
- 61, 7,133,207, 62,144,101,236, 60,197,197,195, 62,166,190, 89, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 76,205,194, 62,165,199,186, 60,197,197,195,
- 62,166,190, 89, 61, 7,133,207, 62,144,101,236, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 61, 7,133,207, 62,144,101,236, 59,153,200,136, 62,146,201, 14,
- 60, 71,162,255, 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,163,208, 32, 62,128, 45, 79, 62,147, 92,147, 62,120, 76,252, 62,161, 23,102,
- 62, 83, 97,115, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,161, 23,102, 62, 83, 97,115, 62,179, 51, 22, 62, 97,152, 2, 62,163,208, 32, 62,128, 45, 79,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,179, 51, 21, 62,135, 83,156, 62,163,208, 32, 62,128, 45, 79, 62,179, 51, 22, 62, 97,152, 2, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,179, 51, 22, 62, 97,152, 2, 62,161, 23,102, 62, 83, 97,115, 62,179, 51, 21, 62, 52,111,101, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,163,208, 32,
- 62,128, 45, 79, 62,179, 51, 21, 62,135, 83,156, 62,165,195,194, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,165,195,194, 62,151,144,181,
- 62,151, 50,134, 62,146,201, 29, 62,163,208, 32, 62,128, 45, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,147, 92,147, 62,120, 76,252, 62,163,208, 32,
- 62,128, 45, 79, 62,151, 50,134, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,151, 50,134, 62,146,201, 29, 62,165,195,194, 62,151,144,181,
- 62,154, 67,137, 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,141, 61, 82, 62,166,190,112, 62,128, 0, 0, 62,165,199,206, 62,136,168,247,
- 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,136,168,247, 62,144,102, 3, 62,151, 50,134, 62,146,201, 29, 62,141, 61, 82, 62,166,190,112,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,154, 67,137, 62,169,150, 70, 62,141, 61, 82, 62,166,190,112, 62,151, 50,134, 62,146,201, 29, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,151, 50,134, 62,146,201, 29, 62,136,168,247, 62,144,102, 3, 62,147, 92,147, 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,166,248,150,
- 62,174, 54, 78, 62,154, 67,137, 62,169,150, 70, 62,165,195,194, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,165,195,194, 62,151,144,181,
- 62,179, 51, 21, 62,157,231, 98, 62,166,248,150, 62,174, 54, 78, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 21, 62,180,111,165, 62,166,248,150,
- 62,174, 54, 78, 62,179, 51, 21, 62,157,231, 98, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 21, 62,157,231, 98, 62,165,195,194, 62,151,144,181,
- 62,179, 51, 21, 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 62,115,162, 89, 62,147, 92,147, 62,120, 76,252, 62,136,168,247,
- 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,136,168,247, 62,144,102, 3, 62,110,174, 18, 62,144,102, 3, 62,128, 0, 0, 62,115,162, 89,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 89, 70,217, 62,120, 76,252, 62,128, 0, 0, 62,115,162, 89, 62,110,174, 18, 62,144,102, 3, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,110,174, 18, 62,144,102, 3, 62,136,168,247, 62,144,102, 3, 62,128, 0, 0, 62,165,199,206, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0,
- 62,115,162, 89, 62, 89, 70,217, 62,120, 76,252, 62,104,130, 30, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,104,130, 30, 62, 70,176,230,
- 62,139,190,241, 62, 70,176,230, 62,128, 0, 0, 62,115,162, 89, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,147, 92,147, 62,120, 76,252, 62,128, 0, 0,
- 62,115,162, 89, 62,139,190,241, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,139,190,241, 62, 70,176,230, 62,104,130, 30, 62, 70,176,230,
- 62,128, 0, 0, 62, 23, 31,208, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,155,187, 41, 62, 30,253,205, 62,179, 51, 21, 62, 52,111,101, 62,161, 23,102,
- 62, 83, 97,115, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,161, 23,102, 62, 83, 97,115, 62,139,190,241, 62, 70,176,230, 62,155,187, 41, 62, 30,253,205,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,128, 0, 0, 62, 23, 31,208, 62,155,187, 41, 62, 30,253,205, 62,139,190,241, 62, 70,176,230, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,139,190,241, 62, 70,176,230, 62,161, 23,102, 62, 83, 97,115, 62,147, 92,147, 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 72,137,174,
- 62, 30,253,205, 62,128, 0, 0, 62, 23, 31,208, 62,104,130, 30, 62, 70,176,230, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,104,130, 30, 62, 70,176,230,
- 62, 61,209, 51, 62, 83, 97,115, 62, 72,137,174, 62, 30,253,205, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,214, 62, 52,111,106, 62, 72,137,174,
- 62, 30,253,205, 62, 61,209, 51, 62, 83, 97,115, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 61,209, 51, 62, 83, 97,115, 62,104,130, 30, 62, 70,176,230,
- 62, 89, 70,217, 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,127,255,255, 61,147, 41,141, 62, 25,153,215, 61,180,111,104, 62, 25,153,224,
- 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,224, 61, 52, 64,225, 62,179, 51, 15, 61, 52, 64,225, 62,127,255,255, 61,147, 41,141,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,179, 51, 20, 61,180,111,104, 62,127,255,255, 61,147, 41,141, 62,179, 51, 15, 61, 52, 64,225, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,179, 51, 15, 61, 52, 64,225, 62, 25,153,224, 61, 52, 64,225, 62,161,175,144,178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,127,255,255,
- 61,147, 41,141, 62,179, 51, 20, 61,180,111,104, 62,147, 52, 12, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,147, 52, 12, 61,231, 46,109,
- 62, 89,151,231, 61,231, 46,109, 62,127,255,255, 61,147, 41,141, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,215, 61,180,111,104, 62,127,255,255,
- 61,147, 41,141, 62, 89,151,231, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 89,151,231, 61,231, 46,109, 62,147, 52, 12, 61,231, 46,109,
- 62,128, 0, 0, 62, 23, 31,208, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 72,137,174, 62, 30,253,205, 62, 25,153,214, 62, 52,111,106, 62, 25,153,217,
- 62, 7, 70,204, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,217, 62, 7, 70,204, 62, 89,151,231, 61,231, 46,109, 62, 72,137,174, 62, 30,253,205,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,128, 0, 0, 62, 23, 31,208, 62, 72,137,174, 62, 30,253,205, 62, 89,151,231, 61,231, 46,109, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 89,151,231, 61,231, 46,109, 62, 25,153,217, 62, 7, 70,204, 62, 25,153,215, 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,155,187, 41,
- 62, 30,253,205, 62,128, 0, 0, 62, 23, 31,208, 62,147, 52, 12, 61,231, 46,109, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,147, 52, 12, 61,231, 46,109,
- 62,179, 51, 19, 62, 7, 70,204, 62,155,187, 41, 62, 30,253,205, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 21, 62, 52,111,101, 62,155,187, 41,
- 62, 30,253,205, 62,179, 51, 19, 62, 7, 70,204, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 19, 62, 7, 70,204, 62,147, 52, 12, 61,231, 46,109,
- 62,179, 51, 20, 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 56, 95,192, 62,128, 45, 79, 62, 25,153,214, 62,135, 83,156, 62, 25,153,212,
- 62, 97,152, 2, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,212, 62, 97,152, 2, 62, 61,209, 51, 62, 83, 97,115, 62, 56, 95,192, 62,128, 45, 79,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 89, 70,217, 62,120, 76,252, 62, 56, 95,192, 62,128, 45, 79, 62, 61,209, 51, 62, 83, 97,115, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 61,209, 51, 62, 83, 97,115, 62, 25,153,212, 62, 97,152, 2, 62, 25,153,214, 62, 52,111,106, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 56, 95,192,
- 62,128, 45, 79, 62, 89, 70,217, 62,120, 76,252, 62, 81,154,245, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 81,154,245, 62,146,201, 29,
- 62, 52,120,125, 62,151,144,181, 62, 56, 95,192, 62,128, 45, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,214, 62,135, 83,156, 62, 56, 95,192,
- 62,128, 45, 79, 62, 52,120,125, 62,151,144,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 52,120,125, 62,151,144,181, 62, 81,154,245, 62,146,201, 29,
- 62, 75,120,239, 62,169,150, 70, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 50, 14,213, 62,174, 54, 78, 62, 25,153,214, 62,180,111,165, 62, 25,153,213,
- 62,157,231,100, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62, 25,153,213, 62,157,231,100, 62, 52,120,125, 62,151,144,181, 62, 50, 14,213, 62,174, 54, 78,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62, 75,120,239, 62,169,150, 70, 62, 50, 14,213, 62,174, 54, 78, 62, 52,120,125, 62,151,144,181, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62, 52,120,125, 62,151,144,181, 62, 25,153,213, 62,157,231,100, 62, 25,153,214, 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,101,133, 91,
- 62,166,190,112, 62, 75,120,239, 62,169,150, 70, 62, 81,154,245, 62,146,201, 29, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62, 81,154,245, 62,146,201, 29,
- 62,110,174, 18, 62,144,102, 3, 62,101,133, 91, 62,166,190,112, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,128, 0, 0, 62,165,199,206, 62,101,133, 91,
- 62,166,190,112, 62,110,174, 18, 62,144,102, 3, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,110,174, 18, 62,144,102, 3, 62, 81,154,245, 62,146,201, 29,
- 62, 89, 70,217, 62,120, 76,252, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 5, 27, 64, 62,128, 45, 66, 62,249,194,232, 62,120, 76,216, 63, 3,190,226,
- 62, 83, 97, 90, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 3,190,226, 62, 83, 97, 90, 63, 12,204,191, 62, 97,151,248, 63, 5, 27, 64, 62,128, 45, 66,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 12,204,191, 62,135, 83,149, 63, 5, 27, 64, 62,128, 45, 66, 63, 12,204,191, 62, 97,151,248, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 12,204,191, 62, 97,151,248, 63, 3,190,226, 62, 83, 97, 90, 63, 12,204,191, 62, 52,111, 90, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 5, 27, 64,
- 62,128, 45, 66, 63, 12,204,191, 62,135, 83,149, 63, 6, 21, 17, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6, 21, 17, 62,151,144,169,
- 62,253,152,222, 62,146,201, 14, 63, 5, 27, 64, 62,128, 45, 66, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,249,194,232, 62,120, 76,216, 63, 5, 27, 64,
- 62,128, 45, 66, 62,253,152,222, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,253,152,222, 62,146,201, 14, 63, 6, 21, 17, 62,151,144,169,
- 63, 0, 84,241, 62,169,150, 52, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,243,163,164, 62,166,190, 89, 62,230,102, 72, 62,165,199,183, 62,239, 15, 70,
- 62,144,101,233, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,239, 15, 70, 62,144,101,233, 62,253,152,222, 62,146,201, 14, 62,243,163,164, 62,166,190, 89,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 0, 84,241, 62,169,150, 52, 62,243,163,164, 62,166,190, 89, 62,253,152,222, 62,146,201, 14, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,253,152,222, 62,146,201, 14, 62,239, 15, 70, 62,144,101,233, 62,249,194,232, 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6,175,123,
- 62,174, 54, 65, 63, 0, 84,241, 62,169,150, 52, 63, 6, 21, 17, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 6, 21, 17, 62,151,144,169,
- 63, 12,204,191, 62,157,231, 90, 63, 6,175,123, 62,174, 54, 65, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 62,180,111,160, 63, 6,175,123,
- 62,174, 54, 65, 63, 12,204,191, 62,157,231, 90, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 62,157,231, 90, 63, 6, 21, 17, 62,151,144,169,
- 63, 12,204,191, 62,135, 83,149, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102, 72, 62,115,162, 53, 62,249,194,232, 62,120, 76,216, 62,239, 15, 70,
- 62,144,101,233, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,239, 15, 70, 62,144,101,233, 62,221,189, 75, 62,144,101,238, 62,230,102, 72, 62,115,162, 53,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,211, 9,168, 62,120, 76,222, 62,230,102, 72, 62,115,162, 53, 62,221,189, 75, 62,144,101,238, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,221,189, 75, 62,144,101,238, 62,239, 15, 70, 62,144,101,233, 62,230,102, 72, 62,165,199,183, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102, 72,
- 62,115,162, 53, 62,211, 9,168, 62,120, 76,222, 62,218,167, 80, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,218,167, 80, 62, 70,176,194,
- 62,242, 37, 68, 62, 70,176,194, 62,230,102, 72, 62,115,162, 53, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,249,194,232, 62,120, 76,216, 62,230,102, 72,
- 62,115,162, 53, 62,242, 37, 68, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,242, 37, 68, 62, 70,176,194, 62,218,167, 80, 62, 70,176,194,
- 62,230,102, 72, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 16,197, 62, 30,253,174, 63, 12,204,191, 62, 52,111, 90, 63, 3,190,226,
- 62, 83, 97, 90, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 3,190,226, 62, 83, 97, 90, 62,242, 37, 68, 62, 70,176,194, 63, 1, 16,197, 62, 30,253,174,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,230,102, 72, 62, 23, 31,168, 63, 1, 16,197, 62, 30,253,174, 62,242, 37, 68, 62, 70,176,194, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,242, 37, 68, 62, 70,176,194, 63, 3,190,226, 62, 83, 97, 90, 62,249,194,232, 62,120, 76,216, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,202,171, 14,
- 62, 30,253,179, 62,230,102, 72, 62, 23, 31,168, 62,218,167, 80, 62, 70,176,194, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,218,167, 80, 62, 70,176,194,
- 62,197, 78,205, 62, 83, 97, 95, 62,202,171, 14, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 21, 62, 52,111,101, 62,202,171, 14,
- 62, 30,253,179, 62,197, 78,205, 62, 83, 97, 95, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,197, 78,205, 62, 83, 97, 95, 62,218,167, 80, 62, 70,176,194,
- 62,211, 9,168, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102, 63, 61,147, 41,101, 62,179, 51, 20, 61,180,111,104, 62,179, 51, 15,
- 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 15, 61, 52, 64,225, 63, 12,204,189, 61, 52, 64,225, 62,230,102, 63, 61,147, 41,101,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 12,204,191, 61,180,111, 83, 62,230,102, 63, 61,147, 41,101, 63, 12,204,189, 61, 52, 64,225, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 12,204,189, 61, 52, 64,225, 62,179, 51, 15, 61, 52, 64,225, 62,161,175,144,178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102, 63,
- 61,147, 41,101, 63, 12,204,191, 61,180,111, 83, 62,249,154,104, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,249,154,104, 61,231, 46, 48,
- 62,211, 50, 42, 61,231, 46, 48, 62,230,102, 63, 61,147, 41,101, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 20, 61,180,111,104, 62,230,102, 63,
- 61,147, 41,101, 62,211, 50, 42, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,211, 50, 42, 61,231, 46, 48, 62,249,154,104, 61,231, 46, 48,
- 62,230,102, 72, 62, 23, 31,168, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,202,171, 14, 62, 30,253,179, 62,179, 51, 21, 62, 52,111,101, 62,179, 51, 19,
- 62, 7, 70,204, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 19, 62, 7, 70,204, 62,211, 50, 42, 61,231, 46, 48, 62,202,171, 14, 62, 30,253,179,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,230,102, 72, 62, 23, 31,168, 62,202,171, 14, 62, 30,253,179, 62,211, 50, 42, 61,231, 46, 48, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,211, 50, 42, 61,231, 46, 48, 62,179, 51, 19, 62, 7, 70,204, 62,179, 51, 20, 61,180,111,104, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 1, 16,197,
- 62, 30,253,174, 62,230,102, 72, 62, 23, 31,168, 62,249,154,104, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,249,154,104, 61,231, 46, 48,
- 63, 12,204,191, 62, 7, 70,199, 63, 1, 16,197, 62, 30,253,174, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 62, 52,111, 90, 63, 1, 16,197,
- 62, 30,253,174, 63, 12,204,191, 62, 7, 70,199, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 62, 7, 70,199, 62,249,154,104, 61,231, 46, 48,
- 63, 12,204,191, 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,194,150, 19, 62,128, 45, 72, 62,179, 51, 21, 62,135, 83,156, 62,179, 51, 22,
- 62, 97,152, 2, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 22, 62, 97,152, 2, 62,197, 78,205, 62, 83, 97, 95, 62,194,150, 19, 62,128, 45, 72,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,211, 9,168, 62,120, 76,222, 62,194,150, 19, 62,128, 45, 72, 62,197, 78,205, 62, 83, 97, 95, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,197, 78,205, 62, 83, 97, 95, 62,179, 51, 22, 62, 97,152, 2, 62,179, 51, 21, 62, 52,111,101, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,194,150, 19,
- 62,128, 45, 72, 62,211, 9,168, 62,120, 76,222, 62,207, 51,179, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,207, 51,179, 62,146,201, 17,
- 62,192,162,113, 62,151,144,174, 62,194,150, 19, 62,128, 45, 72, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 21, 62,135, 83,156, 62,194,150, 19,
- 62,128, 45, 72, 62,192,162,113, 62,151,144,174, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,192,162,113, 62,151,144,174, 62,207, 51,179, 62,146,201, 17,
- 62,204, 34,175, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,191,109,154, 62,174, 54, 68, 62,179, 51, 21, 62,180,111,165, 62,179, 51, 21,
- 62,157,231, 98, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 62,179, 51, 21, 62,157,231, 98, 62,192,162,113, 62,151,144,174, 62,191,109,154, 62,174, 54, 68,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 62,204, 34,175, 62,169,150, 54, 62,191,109,154, 62,174, 54, 68, 62,192,162,113, 62,151,144,174, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 62,192,162,113, 62,151,144,174, 62,179, 51, 21, 62,157,231, 98, 62,179, 51, 21, 62,135, 83,156, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,217, 40,237,
- 62,166,190, 91, 62,204, 34,175, 62,169,150, 54, 62,207, 51,179, 62,146,201, 17, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,207, 51,179, 62,146,201, 17,
- 62,221,189, 75, 62,144,101,238, 62,217, 40,237, 62,166,190, 91, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,230,102, 72, 62,165,199,183, 62,217, 40,237,
- 62,166,190, 91, 62,221,189, 75, 62,144,101,238, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 62,221,189, 75, 62,144,101,238, 62,207, 51,179, 62,146,201, 17,
- 62,211, 9,168, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 56, 78,134, 62,128, 45,117, 63, 48, 20,188, 62,120, 77, 37, 63, 54,242, 42,
- 62, 83, 97,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 54,242, 42, 62, 83, 97,181, 63, 64, 0, 0, 62, 97,152,115, 63, 56, 78,134, 62,128, 45,117,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 64, 0, 0, 62,135, 83,218, 63, 56, 78,134, 62,128, 45,117, 63, 64, 0, 0, 62, 97,152,115, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 64, 0, 0, 62, 97,152,115, 63, 54,242, 42, 62, 83, 97,181, 63, 64, 0, 0, 62, 52,111,202, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 56, 78,134,
- 62,128, 45,117, 63, 64, 0, 0, 62,135, 83,218, 63, 57, 72, 87, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 57, 72, 87, 62,151,144,219,
- 63, 49,255,184, 62,146,201, 52, 63, 56, 78,134, 62,128, 45,117, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 20,188, 62,120, 77, 37, 63, 56, 78,134,
- 62,128, 45,117, 63, 49,255,184, 62,146,201, 52, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 49,255,184, 62,146,201, 52, 63, 57, 72, 87, 62,151,144,219,
- 63, 51,136, 58, 62,169,150, 90, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 45, 5, 26, 62,166,190,117, 63, 38,102,107, 62,165,199,201, 63, 42,186,235,
- 62,144,102, 5, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 42,186,235, 62,144,102, 5, 63, 49,255,184, 62,146,201, 52, 63, 45, 5, 26, 62,166,190,117,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 51,136, 58, 62,169,150, 90, 63, 45, 5, 26, 62,166,190,117, 63, 49,255,184, 62,146,201, 52, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 49,255,184, 62,146,201, 52, 63, 42,186,235, 62,144,102, 5, 63, 48, 20,188, 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 57,226,196,
- 62,174, 54,114, 63, 51,136, 58, 62,169,150, 90, 63, 57, 72, 87, 62,151,144,219, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 57, 72, 87, 62,151,144,219,
- 63, 64, 0, 0, 62,157,231,162, 63, 57,226,196, 62,174, 54,114, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62,180,111,211, 63, 57,226,196,
- 62,174, 54,114, 63, 64, 0, 0, 62,157,231,162, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62,157,231,162, 63, 57, 72, 87, 62,151,144,219,
- 63, 64, 0, 0, 62,135, 83,218, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,107, 62,115,162, 79, 63, 48, 20,188, 62,120, 77, 37, 63, 42,186,235,
- 62,144,102, 5, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 42,186,235, 62,144,102, 5, 63, 34, 17,234, 62,144,101,243, 63, 38,102,107, 62,115,162, 79,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 28,184, 21, 62,120, 76,222, 63, 38,102,107, 62,115,162, 79, 63, 34, 17,234, 62,144,101,243, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 34, 17,234, 62,144,101,243, 63, 42,186,235, 62,144,102, 5, 63, 38,102,107, 62,165,199,201, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,107,
- 62,115,162, 79, 63, 28,184, 21, 62,120, 76,222, 63, 32,134,234, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 32,134,234, 62, 70,176,204,
- 63, 44, 69,233, 62, 70,176,245, 63, 38,102,107, 62,115,162, 79, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 20,188, 62,120, 77, 37, 63, 38,102,107,
- 62,115,162, 79, 63, 44, 69,233, 62, 70,176,245, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 44, 69,233, 62, 70,176,245, 63, 32,134,234, 62, 70,176,204,
- 63, 38,102,104, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 52, 68, 9, 62, 30,253,241, 63, 64, 0, 0, 62, 52,111,202, 63, 54,242, 42,
- 62, 83, 97,181, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 54,242, 42, 62, 83, 97,181, 63, 44, 69,233, 62, 70,176,245, 63, 52, 68, 9, 62, 30,253,241,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,102,104, 62, 23, 31,198, 63, 52, 68, 9, 62, 30,253,241, 63, 44, 69,233, 62, 70,176,245, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 44, 69,233, 62, 70,176,245, 63, 54,242, 42, 62, 83, 97,181, 63, 48, 20,188, 62,120, 77, 37, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 24,136,195,
- 62, 30,253,179, 63, 38,102,104, 62, 23, 31,198, 63, 32,134,234, 62, 70,176,204, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 32,134,234, 62, 70,176,204,
- 63, 21,218,162, 62, 83, 97, 84, 63, 24,136,195, 62, 30,253,179, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 62, 52,111, 90, 63, 24,136,195,
- 62, 30,253,179, 63, 21,218,162, 62, 83, 97, 84, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 21,218,162, 62, 83, 97, 84, 63, 32,134,234, 62, 70,176,204,
- 63, 28,184, 21, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,104, 61,147, 41,111, 63, 12,204,191, 61,180,111, 83, 63, 12,204,189,
- 61, 52, 64,225, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,189, 61, 52, 64,225, 63, 64, 0, 0, 61, 52, 65,111, 63, 38,102,104, 61,147, 41,111,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 64, 0, 0, 61,180,111,195, 63, 38,102,104, 61,147, 41,111, 63, 64, 0, 0, 61, 52, 65,111, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 64, 0, 0, 61, 52, 65,111, 63, 12,204,189, 61, 52, 64,225, 63,121,222,208,178,239, 9,102, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,104,
- 61,147, 41,111, 63, 64, 0, 0, 61,180,111,195, 63, 48, 0,122, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 0,122, 61,231, 46,120,
- 63, 28,204, 85, 61,231, 46, 48, 63, 38,102,104, 61,147, 41,111, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 61,180,111, 83, 63, 38,102,104,
- 61,147, 41,111, 63, 28,204, 85, 61,231, 46, 48, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 28,204, 85, 61,231, 46, 48, 63, 48, 0,122, 61,231, 46,120,
- 63, 38,102,104, 62, 23, 31,198, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 24,136,195, 62, 30,253,179, 63, 12,204,191, 62, 52,111, 90, 63, 12,204,191,
- 62, 7, 70,199, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 62, 7, 70,199, 63, 28,204, 85, 61,231, 46, 48, 63, 24,136,195, 62, 30,253,179,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 38,102,104, 62, 23, 31,198, 63, 24,136,195, 62, 30,253,179, 63, 28,204, 85, 61,231, 46, 48, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 28,204, 85, 61,231, 46, 48, 63, 12,204,191, 62, 7, 70,199, 63, 12,204,191, 61,180,111, 83, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 52, 68, 9,
- 62, 30,253,241, 63, 38,102,104, 62, 23, 31,198, 63, 48, 0,122, 61,231, 46,120, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 48, 0,122, 61,231, 46,120,
- 63, 64, 0, 0, 62, 7, 71, 24, 63, 52, 68, 9, 62, 30,253,241, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62, 52,111,202, 63, 52, 68, 9,
- 62, 30,253,241, 63, 64, 0, 0, 62, 7, 71, 24, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 62, 7, 71, 24, 63, 48, 0,122, 61,231, 46,120,
- 63, 64, 0, 0, 61,180,111,195, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 20,126, 68, 62,128, 45, 64, 63, 12,204,191, 62,135, 83,149, 63, 12,204,191,
- 62, 97,151,248, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 62, 97,151,248, 63, 21,218,162, 62, 83, 97, 84, 63, 20,126, 68, 62,128, 45, 64,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 28,184, 21, 62,120, 76,222, 63, 20,126, 68, 62,128, 45, 64, 63, 21,218,162, 62, 83, 97, 84, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 21,218,162, 62, 83, 97, 84, 63, 12,204,191, 62, 97,151,248, 63, 12,204,191, 62, 52,111, 90, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 20,126, 68,
- 62,128, 45, 64, 63, 28,184, 21, 62,120, 76,222, 63, 26,205, 25, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 26,205, 25, 62,146,201, 14,
- 63, 19,132,114, 62,151,144,169, 63, 20,126, 68, 62,128, 45, 64, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 62,135, 83,149, 63, 20,126, 68,
- 62,128, 45, 64, 63, 19,132,114, 62,151,144,169, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 19,132,114, 62,151,144,169, 63, 26,205, 25, 62,146,201, 14,
- 63, 25, 68,150, 62,169,150, 54, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 18,234, 7, 62,174, 54, 65, 63, 12,204,191, 62,180,111,160, 63, 12,204,191,
- 62,157,231, 90, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 63, 12,204,191, 62,157,231, 90, 63, 19,132,114, 62,151,144,169, 63, 18,234, 7, 62,174, 54, 65,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 63, 25, 68,150, 62,169,150, 54, 63, 18,234, 7, 62,174, 54, 65, 63, 19,132,114, 62,151,144,169, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
- 63, 19,132,114, 62,151,144,169, 63, 12,204,191, 62,157,231, 90, 63, 12,204,191, 62,135, 83,149, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 31,199,185,
- 62,166,190, 96, 63, 25, 68,150, 62,169,150, 54, 63, 26,205, 25, 62,146,201, 14, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 26,205, 25, 62,146,201, 14,
- 63, 34, 17,234, 62,144,101,243, 63, 31,199,185, 62,166,190, 96, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 38,102,107, 62,165,199,201, 63, 31,199,185,
- 62,166,190, 96, 63, 34, 17,234, 62,144,101,243, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 63, 34, 17,234, 62,144,101,243, 63, 26,205, 25, 62,146,201, 14,
- 63, 28,184, 21, 62,120, 76,222, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 1, 20, 2,236,248,224, 0, 0, 0, 50, 0, 0, 0, 1, 2,237, 0, 32,
- 2,236,243,224, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,119, 46, 48, 48, 50, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,231, 1, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2,236,250, 32, 2,236,254,208, 2,236,255, 16, 2,234,114, 96, 2,236,251,128, 2,236,253, 64, 0, 0, 0, 0,
- 2,236,255,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,236,250, 80, 0, 0, 0, 1,
- 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 2,236,252, 16, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 2,236,253,160, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 1,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,179,128, 0, 0, 52, 64, 0, 0,188,142, 92,235, 63,128, 0, 0, 63,128, 0, 2,
- 60,142, 92,235, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,236,250, 32, 0, 0, 0, 0,
- 0, 0, 0, 1, 2,236,194, 96, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,250, 80, 0, 0, 0,242, 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, 2,236,251,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,
- 68, 65, 84, 65, 0, 0, 0,100, 2,236,251,128, 0, 0, 0, 56, 0, 0, 0, 5, 63,128, 0, 0, 63,127,255,255, 39,251,255,255,
- 0, 0, 0, 0,127,255, 2,255, 63,128, 0, 0,191,128, 0, 0,168, 2, 0, 0, 0, 0, 0, 0,127,255, 2,255,191,128, 0, 1,
-191,127,255,253,167,251,255,253, 0, 0, 0, 0,127,255, 2,255,191,127,255,250, 63,128, 0, 3, 40, 2, 0, 3, 0, 0, 0, 0,
-127,255, 2,255, 59,110,239, 0, 60, 26,164,131,189, 14, 92,235, 12,228, 33, 95,133, 28, 3,255, 68, 65, 84, 65, 0, 0, 1, 4,
- 2,236,252, 16, 0, 0, 0,242, 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, 2,236,253, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 2,236,253, 64, 0, 0, 0, 53,
- 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 34, 0, 0, 0, 0,
- 0, 0, 0, 3, 0, 0, 0, 34, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 34, 68, 65, 84, 65, 0, 0, 1, 4, 2,236,253,160,
- 0, 0, 0,242, 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, 2,236,254,208, 0, 0, 0, 5,
- 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 84,101,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, 2,236,255, 16, 0, 0, 0, 6, 0, 0, 0, 64, 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,
- 2,236,255,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,
+255,255,255,255,255,255,255,255, 77, 69, 0, 0,120, 1, 0, 0,192, 66,122, 1, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0,
+ 16, 76,122, 1, 0, 0, 0, 0,128,202,118, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 77, 69,112,114,101,118,105,101,119, 46, 48, 48, 50, 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,112,248,117, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 75,122, 1, 0, 0, 0, 0, 32, 74,122, 1, 0, 0, 0, 0,
+128, 74,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70,122, 1, 0, 0, 0, 0, 48, 72,122, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,240, 74,122, 1, 0, 0, 0, 0, 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, 68,122, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,
+176, 70,122, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,160, 72,122, 1, 0, 0, 0, 0,
+ 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,128,179, 0, 0, 64, 52,235, 92,142,188, 0, 0,128, 63, 2, 0,128, 63,235, 92,142, 60,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 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, 8, 0, 0, 0,
+192, 75,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128,107,116, 1, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
+128, 68,122, 1, 0, 0, 0, 0, 5, 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, 70,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2,236,254,208, 0, 0, 0, 52, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 44, 2,236,255, 16,
- 0, 0, 0, 60, 0, 0, 0, 1, 63,128, 0, 0, 63,128, 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, 1, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 16, 2,236,255,112,
- 0, 0, 0, 57, 0, 0, 0, 4,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 68, 65, 84, 65, 0, 0, 0, 60,
- 2,234,114, 96, 0, 0, 0, 51, 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 0, 0, 63,128, 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,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 1, 20, 2,237, 0, 32, 0, 0, 0, 50, 0, 0, 0, 1, 2,237, 7, 80,
- 2,236,248,224, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,119, 46, 48, 48, 51, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,235,154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2,237, 1, 96, 2,237, 6, 0, 2,237, 6, 64, 2,234,114, 96, 2,237, 2,192, 2,237, 4,112, 0, 0, 0, 0,
- 2,237, 6,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,237, 1,144, 0, 0, 0, 1,
- 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 2,237, 3, 64, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0,
- 2,237, 4,208, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,179,128, 0, 0, 52, 64, 0, 0, 28,192, 0, 0, 63,128, 0, 0, 63,128, 0, 2,
- 55, 39,197,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0,
- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,237, 1, 96, 0, 0, 0, 0,
- 0, 0, 0, 1, 2,236,196,224, 68, 65, 84, 65, 0, 0, 1, 4, 2,237, 1,144, 0, 0, 0,242, 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, 2,237, 2,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,100, 0, 0, 0, 0, 70,122, 1, 0, 0, 0, 0,
+ 56, 0, 0, 0, 5, 0, 0, 0, 0, 0,128, 63,255,255,127, 63,255,255,251, 39, 0, 0, 0, 0,255,127, 2,255, 0, 0,128, 63,
+ 0, 0,128,191, 0, 0, 2,168, 0, 0, 0, 0,255,127, 2,255, 1, 0,128,191,253,255,127,191,253,255,251,167, 0, 0, 0, 0,
+255,127, 2,255,250,255,127,191, 3, 0,128, 63, 3, 0, 2, 40, 0, 0, 0, 0,255,127, 2,255, 0,239,110, 59,131,164, 26, 60,
+235, 92, 14,189,228, 12, 95, 33, 28,133, 3,255, 68, 65, 84, 65, 64, 1, 0, 0,176, 70,122, 1, 0, 0, 0, 0, 5, 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, 48, 72,122, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 2,237, 2,192, 0, 0, 0, 56, 0, 0, 0, 4, 63,128, 0, 0, 63,127,255,255, 39,251,255,255,
- 0, 0, 0, 0,127,255, 3,255, 63,128, 0, 0,191,128, 0, 0,168, 2, 0, 0, 0, 0, 0, 0,127,255, 3,255,191,128, 0, 1,
-191,127,255,253,167,251,255,253, 0, 0, 0, 0,127,255, 3,255,191,127,255,250, 63,128, 0, 3, 40, 2, 0, 3, 0, 0, 0, 0,
-127,255, 3,255, 68, 65, 84, 65, 0, 0, 1, 4, 2,237, 3, 64, 0, 0, 0,242, 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, 2,237, 4,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 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, 48, 2,237, 4,112, 0, 0, 0, 53, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 35, 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, 2, 0, 0, 0, 3, 0, 0, 0, 35,
- 68, 65, 84, 65, 0, 0, 1, 4, 2,237, 4,208, 0, 0, 0,242, 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, 2,237, 6, 0, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 85, 86, 84,101,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, 2,237, 6, 64, 0, 0, 0, 6,
- 0, 0, 0, 64, 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, 2,237, 6,160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0, 48, 72,122, 1, 0, 0, 0, 0, 53, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0,
+ 2, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 34, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0,
+ 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 34, 0, 68, 65, 84, 65, 64, 1, 0, 0,160, 72,122, 1, 0, 0, 0, 0, 5, 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, 32, 74,122, 1,
+ 0, 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, 85, 86, 84,101,
+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,128, 74,122, 1,
+ 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, 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,240, 74,122, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,
- 2,237, 6, 0, 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2,
- 68, 65, 84, 65, 0, 0, 0, 44, 2,237, 6, 64, 0, 0, 0, 60, 0, 0, 0, 1, 0, 0, 0, 0, 63,128, 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, 1, 0, 0, 1, 0, 0, 0, 0,
- 68, 65, 84, 65, 0, 0, 0, 16, 2,237, 6,160, 0, 0, 0, 57, 0, 0, 0, 4,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 68, 65, 84, 65, 0, 0, 0, 60, 2,234,114, 96, 0, 0, 0, 51, 0, 0, 0, 1, 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, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 77, 69, 0, 0, 1, 20, 2,237, 7, 80,
- 0, 0, 0, 50, 0, 0, 0, 1, 2,237, 14,128, 2,237, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,
-119, 46, 48, 48, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,235,206,144,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,237, 8,144, 2,237, 13, 48, 2,237, 13,112, 2,234,114, 96,
- 2,237, 9,240, 2,237, 11,160, 0, 0, 0, 0, 2,237, 13,208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2,237, 8,192, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 2,237, 10,112, 0, 0, 0, 1,
- 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 2,237, 12, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 80, 0, 0, 0, 0,
- 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,179,128, 0, 0, 52, 64, 0, 0,
- 28,192, 0, 0, 63,128, 0, 0, 63,128, 0, 2, 55, 39,197,172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65,
- 0, 0, 0, 4, 2,237, 8,144, 0, 0, 0, 0, 0, 0, 0, 1, 2,236,199, 96, 68, 65, 84, 65, 0, 0, 1, 4, 2,237, 8,192,
- 0, 0, 0,242, 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, 2,237, 9,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, 68, 65, 84, 65, 20, 0, 0, 0, 32, 74,122, 1, 0, 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,128, 74,122, 1, 0, 0, 0, 0,
+ 60, 0, 0, 0, 1, 0, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 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, 1, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 16, 0, 0, 0,
+240, 74,122, 1, 0, 0, 0, 0, 57, 0, 0, 0, 4, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 77, 69, 0, 0,120, 1, 0, 0, 16, 76,122, 1, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0, 64, 85,122, 1, 0, 0, 0, 0,
+192, 66,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,101,118,105,101,
+119, 46, 48, 48, 51, 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,240, 84,122, 1, 0, 0, 0, 0, 80, 83,122, 1, 0, 0, 0, 0,176, 83,122, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 80, 79,122, 1, 0, 0, 0, 0, 96, 81,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 32, 84,122, 1, 0, 0, 0, 0, 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, 77,122, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,224, 79,122, 1, 0, 0, 0, 0,
+ 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,208, 81,122, 1, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0,
+ 80, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0,128,179, 0, 0, 64, 52, 0, 0,192, 28, 0, 0,128, 63, 2, 0,128, 63,172,197, 39, 55, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 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, 8, 0, 0, 0,240, 84,122, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,112,114,116, 1, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,208, 77,122, 1, 0, 0, 0, 0,
+ 5, 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,
+ 80, 79,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 80, 2,237, 9,240, 0, 0, 0, 56, 0, 0, 0, 4,
- 63,128, 0, 0, 63,127,255,255, 39,251,255,255, 0, 0, 0, 0,127,255, 3,255, 63,128, 0, 0,191,128, 0, 0,168, 2, 0, 0,
- 0, 0, 0, 0,127,255, 3,255,191,128, 0, 1,191,127,255,253,167,251,255,253, 0, 0, 0, 0,127,255, 3,255,191,127,255,250,
- 63,128, 0, 3, 40, 2, 0, 3, 0, 0, 0, 0,127,255, 3,255, 68, 65, 84, 65, 0, 0, 1, 4, 2,237, 10,112, 0, 0, 0,242,
- 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, 2,237, 11,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, 68, 65, 84, 65, 80, 0, 0, 0, 80, 79,122, 1, 0, 0, 0, 0, 56, 0, 0, 0, 4, 0, 0, 0,
+ 0, 0,128, 63,255,255,127, 63,255,255,251, 39, 0, 0, 0, 0,255,127, 3,255, 0, 0,128, 63, 0, 0,128,191, 0, 0, 2,168,
+ 0, 0, 0, 0,255,127, 3,255, 1, 0,128,191,253,255,127,191,253,255,251,167, 0, 0, 0, 0,255,127, 3,255,250,255,127,191,
+ 3, 0,128, 63, 3, 0, 2, 40, 0, 0, 0, 0,255,127, 3,255, 68, 65, 84, 65, 64, 1, 0, 0,224, 79,122, 1, 0, 0, 0, 0,
+ 5, 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, 68, 65, 84, 65, 0, 0, 0, 48, 2,237, 11,160, 0, 0, 0, 53, 0, 0, 0, 4, 0, 0, 0, 1,
- 0, 0, 0, 2, 0, 0, 0, 35, 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, 2, 0, 0, 0, 3, 0, 0, 0, 35, 68, 65, 84, 65, 0, 0, 1, 4, 2,237, 12, 0, 0, 0, 0,242, 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, 2,237, 13, 48, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0,
- 0, 0, 0, 0, 85, 86, 84,101,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, 2,237, 13,112, 0, 0, 0, 6, 0, 0, 0, 64, 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, 2,237, 13,208, 0, 0, 0, 0,
+ 96, 81,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2,237, 13, 48, 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3,
- 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 68, 65, 84, 65, 0, 0, 0, 44, 2,237, 13,112, 0, 0, 0, 60, 0, 0, 0, 1,
- 0, 0, 0, 0, 63,128, 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, 1, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 16, 2,237, 13,208, 0, 0, 0, 57, 0, 0, 0, 4,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 68, 65, 84, 65, 0, 0, 0, 60, 2,234,114, 96, 0, 0, 0, 51,
- 0, 0, 0, 1, 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,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 77, 69, 0, 0, 1, 20, 2,237, 14,128, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0, 0, 2,237, 7, 80, 0, 0, 0, 0,
- 0, 0, 0, 0, 77, 69, 67,117, 98,101, 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, 2,230, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,237, 15,192,
- 2,237, 21, 16, 2,237, 21,176, 2,234,116,128, 2,237, 17, 32, 2,237, 19, 32, 0, 0, 0, 0, 2,237, 22,224, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2,237, 15,240, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20,
- 0, 0, 0, 0, 2,237, 17,240, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 2,237, 19,224, 0, 0, 0, 3,
- 0, 0, 0, 5, 0, 0, 0, 80, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 4, 2,237, 15,192, 0, 0, 0, 0, 0, 0, 0, 1, 2,236,194, 96,
- 68, 65, 84, 65, 0, 0, 1, 4, 2,237, 15,240, 0, 0, 0,242, 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, 2,237, 17, 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, 68, 65, 84, 65, 48, 0, 0, 0, 96, 81,122, 1, 0, 0, 0, 0, 53, 0, 0, 0, 4, 0, 0, 0,
+ 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 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, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 64, 1, 0, 0,208, 81,122, 1, 0, 0, 0, 0,
+ 5, 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,
+ 80, 83,122, 1, 0, 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,
+ 85, 86, 84,101,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,
+176, 83,122, 1, 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,
+ 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,
+ 32, 84,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 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,
- 2,237, 17, 32, 0, 0, 0, 56, 0, 0, 0, 8, 63,128, 0, 0, 63,127,255,255,191,128, 0, 0, 73,230, 73,230,182, 26, 3,255,
- 63,128, 0, 0,191,128, 0, 0,191,128, 0, 0, 73,230,182, 26,182, 26, 3,255,191,128, 0, 1,191,127,255,253,191,128, 0, 0,
-182, 26,182, 26,182, 26, 3,255,191,127,255,250, 63,128, 0, 3,191,128, 0, 0,182, 26, 73,230,182, 26, 3,255, 63,128, 0, 4,
- 63,127,255,247, 63,128, 0, 0, 73,230, 73,230, 73,230, 3,255, 63,127,255,245,191,128, 0, 5, 63,128, 0, 0, 73,230,182, 26,
- 73,230, 3,255,191,128, 0, 3,191,127,255,250, 63,128, 0, 0,182, 26,182, 26, 73,230, 3,255,191,127,255,255, 63,128, 0, 0,
- 63,128, 0, 0,182, 26, 73,230, 73,230, 3,255, 68, 65, 84, 65, 0, 0, 1, 4, 2,237, 17,240, 0, 0, 0,242, 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, 2,237, 19, 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, 68, 65, 84, 65, 20, 0, 0, 0, 80, 83,122, 1, 0, 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 48, 0, 0, 0,176, 83,122, 1,
+ 0, 0, 0, 0, 60, 0, 0, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65,
+ 16, 0, 0, 0, 32, 84,122, 1, 0, 0, 0, 0, 57, 0, 0, 0, 4, 0, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255, 77, 69, 0, 0,120, 1, 0, 0, 64, 85,122, 1, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0,112, 94,122, 1,
+ 0, 0, 0, 0, 16, 76,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77, 69,112,114,
+101,118,105,101,119, 46, 48, 48, 52, 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, 32, 94,122, 1, 0, 0, 0, 0,128, 92,122, 1, 0, 0, 0, 0,224, 92,122, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 88,122, 1, 0, 0, 0, 0,144, 90,122, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 80, 93,122, 1, 0, 0, 0, 0, 0, 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,122, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 16, 89,122, 1,
+ 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 91,122, 1, 0, 0, 0, 0, 3, 0, 0, 0,
+ 5, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0,128,179, 0, 0, 64, 52, 0, 0,192, 28, 0, 0,128, 63, 2, 0,128, 63,172,197, 39, 55, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 4, 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, 8, 0, 0, 0, 32, 94,122, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 96,121,116, 1, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0, 87,122, 1,
+ 0, 0, 0, 0, 5, 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,128, 88,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 2,237, 19, 32, 0, 0, 0, 53, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 2,
- 0, 0, 0, 35, 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, 2,
- 0, 0, 0, 3, 0, 0, 0, 35, 0, 0, 0, 4, 0, 0, 0, 5, 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, 0, 0, 0, 4, 0, 0, 0, 7, 0, 0, 0, 35, 0, 0, 0, 1, 0, 0, 0, 5,
- 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 4, 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, 68, 65, 84, 65, 0, 0, 1, 4, 2,237, 19,224, 0, 0, 0,242, 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, 2,237, 21, 16, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0,
- 85, 86, 84,101,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,
- 2,237, 21,176, 0, 0, 0, 6, 0, 0, 0, 64, 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, 2,237, 22,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,
- 68, 65, 84, 65, 0, 0, 0,120, 2,237, 21, 16, 0, 0, 0, 52, 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, 68, 65, 84, 65, 0, 0, 1, 8, 2,237, 21,176, 0, 0, 0, 60, 0, 0, 0, 6,
- 0, 0, 0, 0, 63,128, 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, 1, 0, 0, 1, 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, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 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, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
- 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, 63,128, 0, 0,
- 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 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, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 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, 63,128, 0, 0, 63,128, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 68, 65, 84, 65, 0, 0, 0, 96, 2,237, 22,224, 0, 0, 0, 57, 0, 0, 0, 24,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 68, 65, 84, 65,
- 0, 0, 1,104, 2,234,116,128, 0, 0, 0, 51, 0, 0, 0, 6, 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, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,
-255,255,255,255, 1, 0, 0, 1, 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, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
- 1, 0, 0, 1, 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, 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1,
- 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,
- 63,128, 0, 0, 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 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, 63,128, 0, 0,
- 63,128, 0, 0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 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, 63,128, 0, 0, 63,128, 0, 0,
-255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 1, 0, 0, 1, 0, 0, 0, 0, 68, 78, 65, 49, 0, 0,127,128,
- 7, 91, 64, 32, 0, 0, 0, 0, 0, 0, 0, 1, 83, 68, 78, 65, 78, 65, 77, 69, 0, 0, 7, 39, 42,110,101,120,116, 0, 42,112,
-114,101,118, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121, 0,122, 0,119, 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,
-112, 97,100, 0,110, 97,109,101, 91, 51, 50, 93, 0,116,121,112,101, 0,115,117, 98,116,121,112,101, 0,102,108, 97,103, 0,100,
- 97,116, 97, 0,108,101,110, 0,116,111,116, 97,108,108,101,110, 0,115, 97,118,101,100, 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,110, 97,109,101, 91, 50, 52, 48, 93, 0,116,111,116, 0, 42,112, 97,114,101,110,116, 0, 99,117,114,
-118,101, 0, 99,117,114, 0, 98,108,111, 99,107,116,121,112,101, 0,115,104,111,119,107,101,121, 0,112,111,115, 0, 99,117,114,
-118, 97,108, 0, 97,100,114, 99,111,100,101, 0,116,111,116,101,108,101,109, 0, 42,100, 97,116, 97, 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,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, 42,
-115, 99,114,105,112,116,115, 0, 42,102,108, 97,103, 0, 97, 99,116,115, 99,114,105,112,116, 0,116,111,116,115, 99,114,105,112,
-116, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0, 42,110, 97,109,101, 0,102,108, 97,103,115,
- 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, 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,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,112, 97,100, 49, 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, 89, 70, 95, 97,112,101,114,116,117,114,101, 0, 89, 70, 95, 98,107,104,116,121,112,
-101, 0, 89, 70, 95, 98,107,104, 98,105, 97,115, 0, 89, 70, 95, 98,107,104,114,111,116, 0,115, 99,114,105,112,116,108,105,110,
-107, 0,104, 0, 42,114,101, 99,116, 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,109,101,110,117,110,114, 0,105, 98,117,102,115, 0, 42, 97,110,105,109, 0, 42,
-114,114, 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, 42,118,110,111,100,101, 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,116,101,120,
-102,108, 97,103, 0, 99,111,108,111,114,109,111,100,101,108, 0,114, 0,103, 0, 98, 0,107, 0,100,101,102, 95,118, 97,114, 0,
- 99,111,108,102, 97, 99, 0,110,111,114,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,100,105,115,112,102, 97, 99, 0,119, 97,114,
-112,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,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,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,120,114,101,112,101, 97,116,
- 0,121,114,101,112,101, 97,116, 0,101,120,116,101,110,100, 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,112,108,117,103,105,110, 0, 42, 99,111, 98, 97, 0, 42,101,110,118, 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, 42,111, 98, 0,109,111,100,101, 0,116,111,116,101,120, 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,115,
-104, 97,100,115,112,111,116,115,105,122,101, 0, 98,105, 97,115, 0,115,111,102,116, 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,116,101,120, 97,
- 99,116, 0,115,104, 97,100,104, 97,108,111,115,116,101,112, 0, 89, 70, 95,110,117,109,112,104,111,116,111,110,115, 0, 89, 70,
- 95,110,117,109,115,101, 97,114, 99,104, 0, 89, 70, 95,112,104,100,101,112,116,104, 0, 89, 70, 95,117,115,101,113,109, 99, 0,
- 89, 70, 95, 98,117,102,115,105,122,101, 0, 89, 70, 95,112, 97,100, 0, 89, 70, 95, 99, 97,117,115,116,105, 99, 98,108,117,114,
- 0, 89, 70, 95,108,116,114, 97,100,105,117,115, 0, 89, 70, 95,103,108,111,119,105,110,116, 0, 89, 70, 95,103,108,111,119,111,
-102,115, 0, 89, 70, 95,103,108,111,119,116,121,112,101, 0, 89, 70, 95,112, 97,100, 50, 0, 42,109,116,101,120, 91, 49, 48, 93,
- 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,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,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, 98,105, 97,115, 0,115,104, 97,100, 95, 97,
-108,112,104, 97, 0,112, 97,100,102, 0,114,103, 98,115,101,108, 0,112,114, 95,116,121,112,101, 0,117,115,101, 95,110,111,100,
-101,115, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112, 0,115,101,112,116,101,120, 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,110,111,100,101,116,114,101,101, 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,112, 97,100, 50, 0, 89, 70, 95, 97,114, 0, 89, 70, 95, 97,103, 0,
- 89, 70, 95, 97, 98, 0, 89, 70, 95,100,115, 99, 97,108,101, 0, 89, 70, 95,100,112,119,114, 0, 89, 70, 95,100,115,109,112, 0,
- 89, 70, 95,112,114,101,115,101,116, 0, 89, 70, 95,100,106,105,116, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99, 97,108,
-101, 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,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, 42,109, 97,116, 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,118,101, 99, 91, 51, 93, 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,114, 97,
-100,105,117,115, 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, 42, 98,112, 0, 42, 98,101,122,116, 0, 99,104, 97,114,105,100,120, 0,107,101,114,
-110, 0,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,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,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,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,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,110, 97,109,101, 91, 49, 50, 56, 93, 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, 42,100,114,105,118,101,114, 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,111, 99, 0, 42,115,117,109,111,104, 97,110,100,108,101, 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,
- 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,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, 99,
-111, 91, 50, 93, 0,105,110,100,101,120, 0,118, 91, 52, 93, 0,109,105,100, 0, 99,104,105,108,100,114,101,110,115,116, 97,114,
-116, 0,112, 97,100, 91, 50, 93, 0,118, 91, 50, 93, 0, 42,118,101,114,116,115, 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, 95,101,100,103,101, 95,109, 97,112, 0, 42,118,101,114,
-116, 95,102, 97, 99,101, 95,109, 97,112, 0, 42,109, 97,112, 95,109,101,109, 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,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, 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,115,116, 97,114,116, 0,108,101,110,103,116,
-104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 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,115,112,108,105,116, 95, 97,110,103,108,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,100,101,102,103,114,112, 95,110, 97,109,
-101, 91, 51, 50, 93, 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, 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,112,101,114, 99,
-101,110,116, 0,102, 97, 99,101, 67,111,117,110,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,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,
-112, 97,114,101,110,116,105,110,118, 91, 52, 93, 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0,102, 97,108,108,111,102,102, 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,111,112,101,114, 97,116,105,111,
-110, 0,112, 97,115,115,101,115, 0,102, 97, 99,116,111,114, 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,118,101, 99, 91, 56, 93, 91, 51, 93, 0,100,118,
-101, 99, 91, 51, 93, 0,109, 97,120, 0, 42, 42,111, 98, 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,112, 97,114,100, 97,116, 97, 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, 0, 99,111,110,115,116,114, 97,105,110,116, 67,104, 97,110,
-110,101,108,115, 0,110,101,116,119,111,114,107, 0,100,101,102, 98, 97,115,101, 0,109,111,100,105,102,105,101,114,115, 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,111, 98,109, 97,116, 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,105,112,111,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,112,114,111,116,101, 99,116,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, 99,116,105,109,101, 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,
-115,111,102,116,116,105,109,101, 0,114,100, 97,109,112,105,110,103, 0,115,105,122,101,102, 97, 99, 0,100,116, 0,100,116,120,
- 0, 97, 99,116, 99,111,108, 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,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,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, 42,112,100, 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,110,114, 0,115,104, 97,112,101,102,108, 97,103, 0,112, 97,100, 52, 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, 99,117,114,105,110,100,101,120, 0, 97, 99,116,105,
-118,101, 0,100,101,102,108,101, 99,116, 0,102,111,114, 99,101,102,105,101,108,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,102, 95,115,116,114,101,110,103,116,104, 0,
-102, 95,112,111,119,101,114, 0,109, 97,120,100,105,115,116, 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,116,111,116,112,111,105,110,116, 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,110,111,100,101,109, 97,115,115, 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,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,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,112, 97,100, 53,
- 0, 42,115, 99,114, 97,116, 99,104, 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,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,117,110,117,
-115,101,100, 68, 78, 65, 68,117,109,109,121, 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,109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,114,103, 0,104,111,114,
- 98, 0,104,111,114,107, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,110, 98, 0,122,101,110,107, 0, 97,109, 98,107, 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,112,104,121,115,105, 99,115, 69,110,103,105,110,101, 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, 42, 97,111,115,112,104,101,114,101, 0, 42, 97,111,116,
- 97, 98,108,101,115, 0,104,101,109,105,114,101,115, 0,109, 97,120,105,116,101,114, 0,100,114, 97,119,116,121,112,101, 0,115,
-117, 98,115,104,111,111,116,112, 0,115,117, 98,115,104,111,111,116,101, 0,110,111,100,101,108,105,109, 0,109, 97,120,115,117,
- 98,108, 97,109,112, 0,112, 97,109, 97, 0,112, 97,109,105, 0,101,108,109, 97, 0,101,108,109,105, 0,109, 97,120,110,111,100,
-101, 0, 99,111,110,118,101,114,103,101,110, 99,101, 0,114, 97,100,102, 97, 99, 0,103, 97,109,109, 97, 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, 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,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,
-112, 97,100, 91, 51, 93, 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,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,102,102, 99,111,100,101,
- 99,100, 97,116, 97, 0, 99,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,114,116, 49, 0,114,116, 50, 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, 97,115,112, 0,121, 97,115,112, 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,115, 99,101,109,111,100,101, 0,114,101,110,100,101,114,101,114, 0,111, 99,114,101,115, 0,114,112, 97,100, 91,
- 50, 93, 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,103, 97,117,115,115, 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, 71, 73,113,117, 97,108,105,116,121, 0, 71, 73, 99, 97, 99,104,101, 0, 71, 73,109,101,116,104,111,100,
- 0, 71, 73,112,104,111,116,111,110,115, 0, 71, 73,100,105,114,101, 99,116, 0, 89, 70, 95, 65, 65, 0, 89, 70,101,120,112,111,
-114,116,120,109,108, 0, 89, 70, 95,110,111, 98,117,109,112, 0, 89, 70, 95, 99,108, 97,109,112,114,103, 98, 0,121,102,112, 97,
-100, 49, 0, 71, 73,100,101,112,116,104, 0, 71, 73, 99, 97,117,115,100,101,112,116,104, 0, 71, 73,112,105,120,101,108,115,112,
-101,114,115, 97,109,112,108,101, 0, 71, 73,112,104,111,116,111,110, 99,111,117,110,116, 0, 71, 73,109,105,120,112,104,111,116,
-111,110,115, 0, 71, 73,112,104,111,116,111,110,114, 97,100,105,117,115, 0, 89, 70, 95,110,117,109,112,114,111, 99,115, 0, 89,
- 70, 95,114, 97,121,100,101,112,116,104, 0, 89, 70, 95, 65, 65,112, 97,115,115,101,115, 0, 89, 70, 95, 65, 65,115, 97,109,112,
-108,101,115, 0, 71, 73,115,104, 97,100,111,119,113,117, 97,108,105,116,121, 0, 71, 73,114,101,102,105,110,101,109,101,110,116,
- 0, 71, 73,112,111,119,101,114, 0, 71, 73,105,110,100,105,114,112,111,119,101,114, 0, 89, 70, 95,103, 97,109,109, 97, 0, 89,
- 70, 95,101,120,112,111,115,117,114,101, 0, 89, 70, 95,114, 97,121, 98,105, 97,115, 0, 89, 70, 95, 65, 65,112,105,120,101,108,
-115,105,122,101, 0, 89, 70, 95, 65, 65,116,104,114,101,115,104,111,108,100, 0, 98, 97, 99,107, 98,117,102, 91, 49, 54, 48, 93,
- 0,112,105, 99, 91, 49, 54, 48, 93, 0,102,116,121,112,101, 91, 49, 54, 48, 93, 0, 99,111,108, 91, 51, 93, 0,102,114, 97,109,
-101, 0,110, 97,109,101, 91, 54, 52, 93, 0, 42, 98,114,117,115,104, 0,116,111,111,108, 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,
-115,116,101,112, 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,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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,128, 88,122, 1, 0, 0, 0, 0, 56, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0,128, 63,255,255,127, 63,255,255,251, 39, 0, 0, 0, 0,255,127, 3,255, 0, 0,128, 63, 0, 0,128,191,
+ 0, 0, 2,168, 0, 0, 0, 0,255,127, 3,255, 1, 0,128,191,253,255,127,191,253,255,251,167, 0, 0, 0, 0,255,127, 3,255,
+250,255,127,191, 3, 0,128, 63, 3, 0, 2, 40, 0, 0, 0, 0,255,127, 3,255, 68, 65, 84, 65, 64, 1, 0, 0, 16, 89,122, 1,
+ 0, 0, 0, 0, 5, 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,144, 90,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 48, 0, 0, 0,144, 90,122, 1, 0, 0, 0, 0, 53, 0, 0, 0,
+ 4, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 35, 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, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 35, 0, 68, 65, 84, 65, 64, 1, 0, 0, 0, 91,122, 1,
+ 0, 0, 0, 0, 5, 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,128, 92,122, 1, 0, 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, 85, 86, 84,101,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,224, 92,122, 1, 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, 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, 80, 93,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 65, 84, 65, 20, 0, 0, 0,128, 92,122, 1, 0, 0, 0, 0, 52, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 68, 65, 84, 65, 48, 0, 0, 0,
+224, 92,122, 1, 0, 0, 0, 0, 60, 0, 0, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
+ 68, 65, 84, 65, 16, 0, 0, 0, 80, 93,122, 1, 0, 0, 0, 0, 57, 0, 0, 0, 4, 0, 0, 0,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255, 77, 69, 0, 0,120, 1, 0, 0,112, 94,122, 1, 0, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 64, 85,122, 1, 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, 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,224,106,122, 1, 0, 0, 0, 0, 96,102,122, 1, 0, 0, 0, 0,
+ 32,103,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,176, 97,122, 1, 0, 0, 0, 0, 16,100,122, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,128,104,122, 1, 0, 0, 0, 0, 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, 96,122, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0,
+144, 98,122, 1, 0, 0, 0, 0, 1, 0, 0, 0, 5, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0,224,100,122, 1, 0, 0, 0, 0,
+ 3, 0, 0, 0, 5, 0, 0, 0, 80, 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, 0, 0, 0, 0, 30, 0, 4, 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, 8, 0, 0, 0,
+224,106,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,128,107,116, 1, 0, 0, 0, 0, 68, 65, 84, 65, 64, 1, 0, 0,
+ 48, 96,122, 1, 0, 0, 0, 0, 5, 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,176, 97,122, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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,176, 97,122, 1, 0, 0, 0, 0,
+ 56, 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, 3,255, 0, 0,128, 63,
+ 0, 0,128,191, 0, 0,128,191,230, 73, 26,182, 26,182, 3,255, 1, 0,128,191,253,255,127,191, 0, 0,128,191, 26,182, 26,182,
+ 26,182, 3,255,250,255,127,191, 3, 0,128, 63, 0, 0,128,191, 26,182,230, 73, 26,182, 3,255, 4, 0,128, 63,247,255,127, 63,
+ 0, 0,128, 63,230, 73,230, 73,230, 73, 3,255,245,255,127, 63, 5, 0,128,191, 0, 0,128, 63,230, 73, 26,182,230, 73, 3,255,
+ 3, 0,128,191,250,255,127,191, 0, 0,128, 63, 26,182, 26,182,230, 73, 3,255,255,255,127,191, 0, 0,128, 63, 0, 0,128, 63,
+ 26,182,230, 73,230, 73, 3,255, 68, 65, 84, 65, 64, 1, 0, 0,144, 98,122, 1, 0, 0, 0, 0, 5, 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, 16,100,122, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 16,100,122, 1, 0, 0, 0, 0, 53, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 35, 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, 2, 0, 0, 0,
+ 3, 0, 0, 0, 0, 0, 35, 0, 4, 0, 0, 0, 5, 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, 4, 0, 0, 0, 7, 0, 0, 0, 0, 0, 35, 0, 1, 0, 0, 0, 5, 0, 0, 0,
+ 0, 0, 35, 0, 0, 0, 0, 0, 4, 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, 68, 65, 84, 65, 64, 1, 0, 0,224,100,122, 1, 0, 0, 0, 0, 5, 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, 96,102,122, 1, 0, 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, 85, 86, 84,101,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, 32,103,122, 1, 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, 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,128,104,122, 1, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 96,102,122, 1, 0, 0, 0, 0, 52, 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, 68, 65, 84, 65, 32, 1, 0, 0, 32,103,122, 1, 0, 0, 0, 0,
+ 60, 0, 0, 0, 6, 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, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 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, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 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, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 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, 0, 0, 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 1, 0, 0, 0, 0, 0, 68, 65, 84, 65, 96, 0, 0, 0,128,104,122, 1, 0, 0, 0, 0, 57, 0, 0, 0, 24, 0, 0, 0,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
+ 80, 65, 0, 0,232, 1, 0, 0,176,221,117, 1, 0, 0, 0, 0, 11, 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, 80, 65, 80, 83,121,115, 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,
+ 18, 0, 0, 0, 2, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 4, 0, 6, 0, 8, 0,
+ 5, 0, 5, 0, 3, 0,100, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 4, 0, 5, 0, 3, 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,128, 63, 0, 0,200, 66, 0, 0, 72, 66, 0, 0, 0, 0,
+ 0, 0,128, 63, 0, 0,128, 63, 0, 0, 0, 63,150, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0,128, 41,182, 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,128, 63, 0, 0,128, 63, 0, 0, 0, 0, 0, 0,128, 63,240,214, 35,189, 0, 0, 0, 0,184,155,196,189, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 63,
+ 0, 0, 0, 0,205,204, 76, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,205,204, 76, 62, 0, 0, 0, 64,
+ 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, 0, 0,128, 63,
+ 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 0, 0, 0, 32, 65, 0, 0,128, 63,205,204, 76, 62,154,153,153, 62, 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, 0, 63, 0, 0, 0, 63, 0, 0, 0, 63,
+ 0, 0, 0, 63, 0, 0, 0, 63, 0, 1, 2, 3, 4, 5, 6, 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,
+ 68, 78, 65, 49, 80,145, 0, 0,192, 43,191, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 83, 68, 78, 65, 78, 65, 77, 69,
+ 19, 8, 0, 0, 42,110,101,120,116, 0, 42,112,114,101,118, 0, 42,102,105,114,115,116, 0, 42,108, 97,115,116, 0,120, 0,121,
+ 0,122, 0,119, 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,112, 97,100, 0,110, 97,109,101, 91, 51, 50, 93, 0,116,121,112,101, 0,115,117,
+ 98,116,121,112,101, 0,102,108, 97,103, 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,110, 97,109,101, 91, 50, 52, 48, 93, 0,116,111,116,
+ 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,112, 97,
+100, 48, 0,112, 97,100, 49, 0, 42,114,101, 99,116, 91, 50, 93, 0, 99,117,114,118,101, 0, 99,117,114, 0, 98,108,111, 99,107,
+116,121,112,101, 0,115,104,111,119,107,101,121, 0,109,117,116,101,105,112,111, 0,112,111,115, 0, 99,117,114,118, 97,108, 0,
+ 97,100,114, 99,111,100,101, 0,114,101,108, 97,116,105,118,101, 0,116,111,116,101,108,101,109, 0,112, 97,100, 50, 0, 42,100,
+ 97,116, 97, 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,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, 42,115, 99,114,105,112,116,115, 0, 42,102,108, 97,103, 0, 97, 99,116,115, 99,114,105,112,
+116, 0,116,111,116,115, 99,114,105,112,116, 0, 42,108,105,110,101, 0, 42,102,111,114,109, 97,116, 0, 98,108,101,110, 0, 42,
+110, 97,109,101, 0,102,108, 97,103,115, 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, 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,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, 97,110,103,108,101, 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, 89, 70, 95, 97,112,101,114,116,117,114,
+101, 0, 89, 70, 95, 98,107,104,116,121,112,101, 0, 89, 70, 95, 98,107,104, 98,105, 97,115, 0, 89, 70, 95, 98,107,104,114,111,
+116, 0,115, 99,114,105,112,116,108,105,110,107, 0, 42,100,111,102, 95,111, 98, 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,109,101,110,117,110,114, 0,105, 98,
+117,102,115, 0, 42, 97,110,105,109, 0, 42,114,114, 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, 42,118,110,111,100,101, 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,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,114, 0,103, 0, 98, 0,107, 0,100,101,
+102, 95,118, 97,114, 0,114,116, 0, 99,111,108,102, 97, 99, 0,110,111,114,102, 97, 99, 0,118, 97,114,102, 97, 99, 0,100,105,
+115,112,102, 97, 99, 0,119, 97,114,112,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,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,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,120,114,101,112,101, 97,116, 0,121,114,101,112,101, 97,116, 0,101,120,116,101,110,100, 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,112,108,117,103,105,110, 0, 42, 99,111, 98, 97, 0, 42,
+101,110,118, 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, 42,111, 98, 0,109,111,100,101, 0,116,111,116,101,120, 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,102, 97,108,108,111,102,102, 95,116,121,112,101,
+ 0,112, 97,100, 51, 0,115,104, 97,100,115,112,111,116,115,105,122,101, 0, 98,105, 97,115, 0,115,111,102,116, 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, 89, 70, 95,110,117,109,112,104,111,116,111,110,
+115, 0, 89, 70, 95,110,117,109,115,101, 97,114, 99,104, 0, 89, 70, 95,112,104,100,101,112,116,104, 0, 89, 70, 95,117,115,101,
+113,109, 99, 0, 89, 70, 95, 98,117,102,115,105,122,101, 0, 89, 70, 95,112, 97,100, 0, 89, 70, 95, 99, 97,117,115,116,105, 99,
+ 98,108,117,114, 0, 89, 70, 95,108,116,114, 97,100,105,117,115, 0, 89, 70, 95,103,108,111,119,105,110,116, 0, 89, 70, 95,103,
+108,111,119,111,102,115, 0, 89, 70, 95,103,108,111,119,116,121,112,101, 0, 89, 70, 95,112, 97,100, 50, 0, 42,109,116,101,120,
+ 91, 49, 48, 93, 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,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,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,117,118,110, 97,109,101, 91, 51, 50,
+ 93, 0,115, 98,105, 97,115, 0,115,104, 97,100, 95, 97,108,112,104, 97, 0,112, 97,100,102, 0,114,103, 98,115,101,108, 0,112,
+114, 95,116,121,112,101, 0,117,115,101, 95,110,111,100,101,115, 0,112,114, 95, 98, 97, 99,107, 0,112,114, 95,108, 97,109,112,
+ 0,115,101,112,116,101,120, 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,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,110,111,100,101,
+116,114,101,101, 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, 89, 70, 95, 97,114, 0, 89, 70, 95, 97,103, 0, 89, 70, 95, 97, 98, 0, 89, 70, 95,100,
+115, 99, 97,108,101, 0, 89, 70, 95,100,112,119,114, 0, 89, 70, 95,100,115,109,112, 0, 89, 70, 95,112,114,101,115,101,116, 0,
+ 89, 70, 95,100,106,105,116, 0,110, 97,109,101, 91, 50, 53, 54, 93, 0,115, 99, 97,108,101, 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,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, 42,109, 97,116, 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,118,101,
+ 99, 91, 51, 93, 91, 51, 93, 0, 97,108,102, 97, 0,119,101,105,103,104,116, 0,114, 97,100,105,117,115, 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, 42, 98,112, 0, 42, 98,101,122,116, 0,116,105,108,116, 95,105,110,116,101,114,112, 0, 99,104, 97,114,105,100,120, 0,107,
+101,114,110, 0,104, 0,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,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,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,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,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,110, 97,109,101, 91, 49, 50, 56, 93, 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,
+ 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, 42,100,114,105,
+118,101,114, 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,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, 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,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, 99,111, 91, 50, 93, 0,105,110,100,101,120, 0,102, 0,105, 0,115, 91, 50,
+ 53, 54, 93, 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,101,100,103,101, 95, 98,111,117,110,100, 97,114,121, 95,
+115,116, 97,116,101,115, 0, 42,118,101,114,116, 95,101,100,103,101, 95,109, 97,112, 0, 42,118,101,114,116, 95,102, 97, 99,101,
+ 95,109, 97,112, 0, 42,109, 97,112, 95,109,101,109, 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, 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,115,116, 97,114,116, 0,108,101,110,103,116,104, 0,114, 97,110,100,111,109,105,122,101, 0,115,101,101,100, 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, 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,100,101,102,103,114,112, 95,110, 97,109,101, 91, 51, 50, 93, 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,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,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,112, 97,114,101,110,116,105,110,118, 91, 52, 93, 91, 52, 93, 0, 99,101,110,116, 91, 51, 93, 0,102, 97,108,
+108,111,102,102, 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,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,110,101,101,100, 98,105,110,100, 0, 42, 98,105,110,100,119,101,105,103,104,116,115, 0, 42, 98,105,110,100, 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,112,115,121,115, 0, 42,100,109, 0,114,116, 91, 51, 93, 0,112,115,121,115,
+ 0,114,116, 91, 50, 93, 0, 42,102, 97, 99,101,112, 97, 0,118,103,114,111,117,112, 0,112,114,111,116,101, 99,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,118,101, 99, 91, 56, 93, 91, 51, 93, 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, 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,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,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,105,112,111,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,112,114,111,116,101, 99,116,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, 99,116,105,109,101, 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,115,105,122,101,102, 97, 99, 0,100,116, 0,100,116,120, 0, 97, 99,116, 99,111,108, 0,101,109,112,116,121, 95,
+100,114, 97,119,116,121,112,101, 0,112, 97,100, 49, 91, 55, 93, 0,101,109,112,116,121, 95,100,114, 97,119,115,105,122,101, 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, 42,115,117,109,111,104, 97,110,100,108,101, 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,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,112,
+100, 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,110,114, 0,115,104, 97,112,101,102,108, 97,103, 0,114,
+101, 99, 97,108, 99,111, 0,112, 97,100, 52, 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, 99,117,114,105,110,100,101,120, 0, 97, 99,116,105,118,101, 0,100,101,102,108,101, 99,116, 0,
+102,111,114, 99,101,102,105,101,108,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,102, 95,115,116,114,101,110,103,116,104, 0,102, 95,112,111,119,101,114, 0,102, 95,100,105,115,116, 0,102, 95,100, 97,109,
+112, 0,109, 97,120,100,105,115,116, 0,109,105,110,100,105,115,116, 0,109, 97,120,114, 97,100, 0,109,105,110,114, 97,100, 0,
+102, 95,112,111,119,101,114, 95,114, 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,116,101,120, 95,109,111,100,101, 0,107,105,110,107, 0,107,
+105,110,107, 95, 97,120,105,115, 0,114,116, 50, 0, 42,112, 97,114,116,105, 99,108,101,115, 0,116,111,116,112,111,105,110,116,
+ 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,110,111,100,101,
+109, 97,115,115, 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,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,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,112, 97,100, 53, 0, 42,115, 99,114, 97,116, 99,104, 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,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,117,110,117,115,101,100, 68, 78, 65, 68,117,109,109,121, 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,109,105,115,116,121,112,101, 0,104,111,114,114, 0,104,111,
+114,103, 0,104,111,114, 98, 0,104,111,114,107, 0,122,101,110,114, 0,122,101,110,103, 0,122,101,110, 98, 0,122,101,110,107,
+ 0, 97,109, 98,107, 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,112,104,121,115,105, 99,115, 69,110,103,105,110,101, 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,112, 97,100, 50, 91,
+ 50, 93, 0, 97,111, 95,115, 97,109,112, 95,109,101,116,104,111,100, 0,112, 97,100, 49, 91, 51, 93, 0, 42, 97,111,115,112,104,
+101,114,101, 0, 42, 97,111,116, 97, 98,108,101,115, 0,104,101,109,105,114,101,115, 0,109, 97,120,105,116,101,114, 0,100,114,
+ 97,119,116,121,112,101, 0,115,117, 98,115,104,111,111,116,112, 0,115,117, 98,115,104,111,111,116,101, 0,110,111,100,101,108,
+105,109, 0,109, 97,120,115,117, 98,108, 97,109,112, 0,112, 97,109, 97, 0,112, 97,109,105, 0,101,108,109, 97, 0,101,108,109,
+105, 0,109, 97,120,110,111,100,101, 0, 99,111,110,118,101,114,103,101,110, 99,101, 0,114, 97,100,102, 97, 99, 0,103, 97,109,
+109, 97, 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, 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,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,112, 97,100, 91, 51, 93, 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,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,102,102, 99,111,100,101, 99,100, 97,116, 97, 0, 99,102,114, 97, 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,114,116, 49, 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, 97,115,112, 0,121, 97,115,112, 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,115, 99,101,109,111,100,101, 0,114,101,110,100,
+101,114,101,114, 0,111, 99,114,101,115, 0,114,112, 97,100, 91, 50, 93, 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,102,114,115, 95,115,101, 99, 95, 98, 97,
+115,101, 0,103, 97,117,115,115, 0,112,111,115,116,109,117,108, 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, 71, 73,113,117, 97,108,105,116,121, 0, 71, 73, 99, 97, 99,104,101, 0, 71, 73,109,101,116,104,111,100, 0,
+ 71, 73,112,104,111,116,111,110,115, 0, 71, 73,100,105,114,101, 99,116, 0, 89, 70, 95, 65, 65, 0, 89, 70,101,120,112,111,114,
+116,120,109,108, 0, 89, 70, 95,110,111, 98,117,109,112, 0, 89, 70, 95, 99,108, 97,109,112,114,103, 98, 0,121,102,112, 97,100,
+ 49, 0, 71, 73,100,101,112,116,104, 0, 71, 73, 99, 97,117,115,100,101,112,116,104, 0, 71, 73,112,105,120,101,108,115,112,101,
+114,115, 97,109,112,108,101, 0, 71, 73,112,104,111,116,111,110, 99,111,117,110,116, 0, 71, 73,109,105,120,112,104,111,116,111,
+110,115, 0, 71, 73,112,104,111,116,111,110,114, 97,100,105,117,115, 0, 89, 70, 95,110,117,109,112,114,111, 99,115, 0, 89, 70,
+ 95,114, 97,121,100,101,112,116,104, 0, 89, 70, 95, 65, 65,112, 97,115,115,101,115, 0, 89, 70, 95, 65, 65,115, 97,109,112,108,
+101,115, 0, 71, 73,115,104, 97,100,111,119,113,117, 97,108,105,116,121, 0, 71, 73,114,101,102,105,110,101,109,101,110,116, 0,
+ 71, 73,112,111,119,101,114, 0, 71, 73,105,110,100,105,114,112,111,119,101,114, 0, 89, 70, 95,103, 97,109,109, 97, 0, 89, 70,
+ 95,101,120,112,111,115,117,114,101, 0, 89, 70, 95,114, 97,121, 98,105, 97,115, 0, 89, 70, 95, 65, 65,112,105,120,101,108,115,
+105,122,101, 0, 89, 70, 95, 65, 65,116,104,114,101,115,104,111,108,100, 0, 98, 97, 99,107, 98,117,102, 91, 49, 54, 48, 93, 0,
+112,105, 99, 91, 49, 54, 48, 93, 0,102,116,121,112,101, 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, 99,111,108, 91, 51, 93, 0,102,114, 97,109,101, 0,110, 97,
+109,101, 91, 54, 52, 93, 0, 42, 98,114,117,115,104, 0,116,111,111,108, 0,115,116,101,112, 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,100,114, 97,119, 95,116,105,109,101,100, 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,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,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,115,101,108,101, 99,116, 95,116,104,114,101,115,104, 0,105,109, 97,112, 97,105,110,116, 0, 99,
-108,101, 97,110, 95,116,104,114,101,115,104, 0,114,101,116,111,112,111, 95,109,111,100,101, 0,108,105,110,101, 95,100,105,118,
- 0,101,108,108,105,112,115,101, 95,100,105,118, 0,100,105,114, 0, 97,105,114, 98,114,117,115,104, 0,118,105,101,119, 0, 42,
-115,101,115,115,105,111,110, 0,100,114, 97,119, 98,114,117,115,104, 0,115,109,111,111,116,104, 98,114,117,115,104, 0,112,105,
-110, 99,104, 98,114,117,115,104, 0,105,110,102,108, 97,116,101, 98,114,117,115,104, 0,103,114, 97, 98, 98,114,117,115,104, 0,
-108, 97,121,101,114, 98,114,117,115,104, 0, 98,114,117,115,104, 95,116,121,112,101, 0,116,101,120,110,114, 0,116,101,120,114,
-101,112,116, 0,116,101,120,102, 97,100,101, 0,116,101,120,115,101,112, 0, 97,118,101,114, 97,103,105,110,103, 0,100,114, 97,
-119, 95,102,108, 97,103, 0,116, 97, 98,108,101,116, 95,115,105,122,101, 0,116, 97, 98,108,101,116, 95,115,116,114,101,110,103,
-116,104, 0,115,121,109,109, 0, 42, 99, 97,109,101,114, 97, 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, 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,101,100,105,116, 98,117,116,115,105,122,101, 0,115,101,108,101, 99,
-116,109,111,100,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 0,112,114,111,112, 95,109,111,100,101, 0, 42,101,100,
- 0, 42,114, 97,100,105,111, 0,102,114, 97,109,105,110,103, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 97,117,
-100,105,111, 0,109, 97,114,107,101,114,115, 0,106,117,109,112,102,114, 97,109,101, 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,115, 99,117,108,112,116,100, 97,116, 97, 0,122,111,111,
-109, 0, 98,108,101,110,100, 0,120,105,109, 0,121,105,109, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115,
- 99, 97,108,101, 0, 42, 97,114,101, 97, 0, 98,108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 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,119,105,110,109, 97,116, 49, 91, 52, 93, 91, 52, 93,
- 0,118,105,101,119,109, 97,116, 49, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99,
- 0,112, 97,100, 48, 0,112,101,114,115,112, 0, 42,111, 98, 95, 99,101,110,116,114,101, 0, 42, 98,103,112,105, 99, 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,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,110,101, 91, 51, 50, 93, 0,108,111, 99, 97,108,118,105,101,
-119, 0,108, 97,121, 97, 99,116, 0,115, 99,101,110,101,108,111, 99,107, 0, 97,114,111,117,110,100, 0, 99, 97,109,122,111,111,
-109, 0,112,105,118,111,116, 95,108, 97,115,116, 0,103,114,105,100, 0,103,114,105,100,118,105,101,119, 0,112,105,120,115,105,
-122,101, 0,110,101, 97,114, 0,102, 97,114, 0, 99, 97,109,100,120, 0, 99, 97,109,100,121, 0,103,114,105,100,108,105,110,101,
-115, 0,118,105,101,119, 98,117,116, 0,103,114,105,100,102,108, 97,103, 0,109,111,100,101,115,101,108,101, 99,116, 0,116,119,
-116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102,108, 97,103, 0,116,119,100,114, 97,119,102,108, 97,103, 0,116,119,
-109, 97,116, 91, 52, 93, 91, 52, 93, 0, 99,108,105,112, 91, 52, 93, 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 97,102,116,
-101,114,100,114, 97,119, 0,122, 98,117,102, 0,120,114, 97,121, 0,102,108, 97,103, 50, 0,103,114,105,100,115,117, 98,100,105,
-118, 0,115,110, 97,112, 95,116, 97,114,103,101,116, 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,107,101,101,112,116,111,116, 0,107,101,101,
-112, 97,115,112,101, 99,116, 0,107,101,101,112,122,111,111,109, 0,111,108,100,119,105,110,120, 0,111,108,100,119,105,110,121,
- 0,114,111,119, 98,117,116, 0,118, 50,100, 0, 42,101,100,105,116,105,112,111, 0,105,112,111,107,101,121, 0, 97, 99,116,110,
- 97,109,101, 91, 51, 50, 93, 0, 99,111,110,115,116,110, 97,109,101, 91, 51, 50, 93, 0,116,111,116,105,112,111, 0,112,105,110,
- 0, 98,117,116,111,102,115, 0, 99,104, 97,110,110,101,108, 0,108,111, 99,107, 0,109,101,100,105, 97,110, 91, 51, 93, 0, 99,
-117,114,115,101,110,115, 0, 99,117,114, 97, 99,116, 0, 97,108,105,103,110, 0,116, 97, 98,111, 0,109, 97,105,110, 98, 0,109,
- 97,105,110, 98,111, 0, 42,108,111, 99,107,112,111,105,110, 0,116,101,120,102,114,111,109, 0,115,104,111,119,103,114,111,117,
-112, 0,109,111,100,101,108,116,121,112,101, 0,115, 99,114,105,112,116, 98,108,111, 99,107, 0,114,101, 95, 97,108,105,103,110,
- 0,111,108,100,107,101,121,112,114,101,115,115, 0,116, 97, 98, 91, 55, 93, 0, 99,104, 97,110,115,104,111,119,110, 0, 42,102,
-105,108,101,108,105,115,116, 0,116,111,116,102,105,108,101, 0,116,105,116,108,101, 91, 50, 52, 93, 0,100,105,114, 91, 49, 54,
- 48, 93, 0,102,105,108,101, 91, 56, 48, 93, 0,111,102,115, 0,115,111,114,116, 0,109, 97,120,110, 97,109,101,108,101,110, 0,
- 99,111,108,108,117,109,115, 0, 42,108,105, 98,102,105,108,101,100, 97,116, 97, 0,114,101,116,118, 97,108, 0,109,101,110,117,
- 0, 97, 99,116, 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,111,111,112,115,
- 0,118,105,115,105,102,108, 97,103, 0,116,114,101,101, 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99,104,
- 95,115,116,114,105,110,103, 91, 51, 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, 0,115,101, 97,114, 99,104, 95,102,108,
- 97,103,115, 0,100,111, 95, 0,111,117,116,108,105,110,101,118,105,115, 0,115,116,111,114,101,102,108, 97,103, 0,100,101,112,
-115, 95,102,108, 97,103,115, 0, 42, 99,117,109, 97,112, 0,105,109, 97,110,114, 0, 99,117,114,116,105,108,101, 0,105,109,116,
-121,112,101,110,114, 0,115,104,111,119,115,112, 97,114,101, 0, 99,101,110,116,120, 0, 99,101,110,116,121, 0, 42,105,110,102,
-111, 95,115,116,114, 0, 42,105,110,102,111, 95,115,112, 97,114,101, 0, 42,115,112, 97,114,101, 0, 42,116,101,120,116, 0,116,
-111,112, 0,118,105,101,119,108,105,110,101,115, 0,102,111,110,116, 95,105,100, 0,108,104,101,105,103,104,116, 0,108,101,102,
-116, 0,115,104,111,119,108,105,110,101,110,114,115, 0,116, 97, 98,110,117,109, 98,101,114, 0, 99,117,114,114,116, 97, 98, 95,
-115,101,116, 0,115,104,111,119,115,121,110,116, 97,120, 0,117,110,117,115,101,100, 95,112, 97,100,100, 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, 42,115, 99,114,105,112,116,
- 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, 42,101,100,
-105,116,116,114,101,101, 0,116,114,101,101,116,121,112,101, 0,116,105,116,108,101, 91, 50, 56, 93, 0,102, 97,115,101, 0,115,
-117, 98,102, 97,115,101, 0,109,111,117,115,101, 95,109,111,118,101, 95,114,101,100,114, 97,119, 0,105,109, 97,102, 97,115,101,
- 0,109,120, 0,109,121, 0,100,105,114,115,108,105, 0,100,105,114,115,108,105, 95,108,105,110,101,115, 0,100,105,114,115,108,
-105, 95,115,120, 0,100,105,114,115,108,105, 95,101,121, 0,100,105,114,115,108,105, 95,101,120, 0,100,105,114,115,108,105, 95,
-104, 0,105,109, 97,115,108,105, 0,102,105,108,101,115,101,108,109,101,110,117,105,116,101,109, 0,105,109, 97,115,108,105, 95,
-115,120, 0,105,109, 97,115,108,105, 95,101,121, 0,105,109, 97,115,108,105, 95,101,120, 0,105,109, 97,115,108,105, 95,104, 0,
-100,115,115,120, 0,100,115,115,121, 0,100,115,101,120, 0,100,115,101,121, 0,100,101,115,120, 0,100,101,115,121, 0,100,101,
-101,120, 0,100,101,101,121, 0,102,115,115,120, 0,102,115,115,121, 0,102,115,101,120, 0,102,115,101,121, 0,100,115,100,104,
- 0,102,115,100,104, 0,102,101,115,120, 0,102,101,115,121, 0,102,101,101,120, 0,102,101,101,121, 0,105,110,102,115,120, 0,
-105,110,102,115,121, 0,105,110,102,101,120, 0,105,110,102,101,121, 0,100,110,115,120, 0,100,110,115,121, 0,100,110,119, 0,
-100,110,104, 0,102,110,115,120, 0,102,110,115,121, 0,102,110,119, 0,102,110,104, 0,102,111,108,101, 91, 49, 50, 56, 93, 0,
-100,111,114, 91, 49, 50, 56, 93, 0,102,105,108,101, 91, 49, 50, 56, 93, 0,100,105,114, 91, 49, 50, 56, 93, 0, 42,102,105,114,
-115,116,100,105,114, 0, 42,102,105,114,115,116,102,105,108,101, 0,116,111,112,100,105,114, 0,116,111,116, 97,108,100,105,114,
-115, 0,104,105,108,105,116,101, 0,116,111,112,102,105,108,101, 0,116,111,116, 97,108,102,105,108,101,115, 0,105,109, 97,103,
-101, 95,115,108,105,100,101,114, 0,115,108,105,100,101,114, 95,104,101,105,103,104,116, 0,115,108,105,100,101,114, 95,115,112,
- 97, 99,101, 0,116,111,112,105,109, 97, 0,116,111,116, 97,108,105,109, 97, 0, 99,117,114,105,109, 97,120, 0, 99,117,114,105,
-109, 97,121, 0, 42,102,105,114,115,116, 95,115,101,108, 95,105,109, 97, 0, 42,104,105,108,105,116,101, 95,105,109, 97, 0,116,
-111,116, 97,108, 95,115,101,108,101, 99,116,101,100, 0,105,109, 97, 95,114,101,100,114, 97,119, 0, 42, 99,109, 97,112, 0,111,
-117,116,108,105,110,101, 91, 52, 93, 0,110,101,117,116,114, 97,108, 91, 52, 93, 0, 97, 99,116,105,111,110, 91, 52, 93, 0,115,
-101,116,116,105,110,103, 91, 52, 93, 0,115,101,116,116,105,110,103, 49, 91, 52, 93, 0,115,101,116,116,105,110,103, 50, 91, 52,
- 93, 0,110,117,109, 91, 52, 93, 0,116,101,120,116,102,105,101,108,100, 91, 52, 93, 0,116,101,120,116,102,105,101,108,100, 95,
-104,105, 91, 52, 93, 0,112,111,112,117,112, 91, 52, 93, 0,116,101,120,116, 91, 52, 93, 0,116,101,120,116, 95,104,105, 91, 52,
- 93, 0,109,101,110,117, 95, 98, 97, 99,107, 91, 52, 93, 0,109,101,110,117, 95,105,116,101,109, 91, 52, 93, 0,109,101,110,117,
- 95,104,105,108,105,116,101, 91, 52, 93, 0,109,101,110,117, 95,116,101,120,116, 91, 52, 93, 0,109,101,110,117, 95,116,101,120,
-116, 95,104,105, 91, 52, 93, 0, 98,117,116, 95,100,114, 97,119,116,121,112,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48,
- 93, 0, 98, 97, 99,107, 91, 52, 93, 0,104,101, 97,100,101,114, 91, 52, 93, 0,112, 97,110,101,108, 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,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,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,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, 98,112, 97,100, 49, 91, 52, 93, 0,116,117,105, 0,116, 98,
+108, 99, 95,102,108, 97,103, 0,105,109, 97,112, 97,105,110,116, 0,112, 97,114,116,105, 99,108,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,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,112, 97,100, 52, 91, 50, 93, 0,100,105,114, 0, 97,105,114, 98,114,117,115,104,
+ 0,118,105,101,119, 0, 42,115,101,115,115,105,111,110, 0,100,114, 97,119, 98,114,117,115,104, 0,115,109,111,111,116,104, 98,
+114,117,115,104, 0,112,105,110, 99,104, 98,114,117,115,104, 0,105,110,102,108, 97,116,101, 98,114,117,115,104, 0,103,114, 97,
+ 98, 98,114,117,115,104, 0,108, 97,121,101,114, 98,114,117,115,104, 0,102,108, 97,116,116,101,110, 98,114,117,115,104, 0, 98,
+114,117,115,104, 95,116,121,112,101, 0,116,101,120,110,114, 0,116,101,120,114,101,112,116, 0,116,101,120,102, 97,100,101, 0,
+116,101,120,115,101,112, 0, 97,118,101,114, 97,103,105,110,103, 0,116, 97, 98,108,101,116, 95,115,105,122,101, 0,116, 97, 98,
+108,101,116, 95,115,116,114,101,110,103,116,104, 0,115,121,109,109, 0, 42, 99, 97,109,101,114, 97, 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, 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,101,100,105,116, 98,117,116,
+115,105,122,101, 0,115,101,108,101, 99,116,109,111,100,101, 0,112,114,111,112,111,114,116,105,111,110, 97,108, 0,112,114,111,
+112, 95,109,111,100,101, 0, 97,117,116,111,109,101,114,103,101, 0,112, 97,100, 54, 0,112, 97,100, 55, 0, 42,101,100, 0, 42,
+114, 97,100,105,111, 0,102,114, 97,109,105,110,103, 0, 42,116,111,111,108,115,101,116,116,105,110,103,115, 0, 97,117,100,105,
+111, 0,109, 97,114,107,101,114,115, 0,106,117,109,112,102,114, 97,109,101, 0,115,110, 97,112, 95,102,108, 97,103, 0,115,110,
+ 97,112, 95,116, 97,114,103,101,116, 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,115, 99,117,108,112,116,100, 97,116, 97, 0,122,111,111,109, 0, 98,108,101,110,100, 0,120,105,109, 0,
+121,105,109, 0,115,112, 97, 99,101,116,121,112,101, 0, 98,108,111, 99,107,115, 99, 97,108,101, 0, 42, 97,114,101, 97, 0, 98,
+108,111, 99,107,104, 97,110,100,108,101,114, 91, 56, 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,119,105,110,109, 97,116, 49, 91, 52, 93, 91, 52, 93, 0,118,105,101,119,109, 97,116, 49, 91, 52, 93,
+ 91, 52, 93, 0,118,105,101,119,113,117, 97,116, 91, 52, 93, 0,122,102, 97, 99, 0,112,101,114,115,112, 0, 42,111, 98, 95, 99,
+101,110,116,114,101, 0, 42, 98,103,112,105, 99, 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,111, 98, 95, 99,101,110,116,114,101, 95, 98,111,
+110,101, 91, 51, 50, 93, 0,108,111, 99, 97,108,118,105,101,119, 0,108, 97,121, 97, 99,116, 0,115, 99,101,110,101,108,111, 99,
+107, 0, 97,114,111,117,110,100, 0, 99, 97,109,122,111,111,109, 0,112,105,118,111,116, 95,108, 97,115,116, 0,103,114,105,100,
+ 0,103,114,105,100,118,105,101,119, 0,112,105,120,115,105,122,101, 0,110,101, 97,114, 0,102, 97,114, 0, 99, 97,109,100,120,
+ 0, 99, 97,109,100,121, 0,103,114,105,100,108,105,110,101,115, 0,118,105,101,119, 98,117,116, 0,103,114,105,100,102,108, 97,
+103, 0,109,111,100,101,115,101,108,101, 99,116, 0,116,119,116,121,112,101, 0,116,119,109,111,100,101, 0,116,119,102,108, 97,
+103, 0,116,119,100,114, 97,119,102,108, 97,103, 0,116,119,109, 97,116, 91, 52, 93, 91, 52, 93, 0, 99,108,105,112, 91, 52, 93,
+ 91, 52, 93, 0, 42, 99,108,105,112, 98, 98, 0, 97,102,116,101,114,100,114, 97,119, 0,122, 98,117,102, 0,120,114, 97,121, 0,
+102,108, 97,103, 50, 0,103,114,105,100,115,117, 98,100,105,118, 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,107,101,101,112,116,111,116, 0,
+107,101,101,112, 97,115,112,101, 99,116, 0,107,101,101,112,122,111,111,109, 0,111,108,100,119,105,110,120, 0,111,108,100,119,
+105,110,121, 0, 99,117,114,115,111,114, 91, 50, 93, 0,114,111,119, 98,117,116, 0,118, 50,100, 0, 42,101,100,105,116,105,112,
+111, 0,105,112,111,107,101,121, 0, 97, 99,116,110, 97,109,101, 91, 51, 50, 93, 0, 99,111,110,115,116,110, 97,109,101, 91, 51,
+ 50, 93, 0,116,111,116,105,112,111, 0,112,105,110, 0, 98,117,116,111,102,115, 0, 99,104, 97,110,110,101,108, 0,108,111, 99,
+107, 0,109,101,100,105, 97,110, 91, 51, 93, 0, 99,117,114,115,101,110,115, 0, 99,117,114, 97, 99,116, 0, 97,108,105,103,110,
+ 0,116, 97, 98,111, 0,109, 97,105,110, 98, 0,109, 97,105,110, 98,111, 0, 42,108,111, 99,107,112,111,105,110, 0,116,101,120,
+102,114,111,109, 0,115,104,111,119,103,114,111,117,112, 0,109,111,100,101,108,116,121,112,101, 0,115, 99,114,105,112,116, 98,
+108,111, 99,107, 0,114,101, 95, 97,108,105,103,110, 0,111,108,100,107,101,121,112,114,101,115,115, 0,116, 97, 98, 91, 55, 93,
+ 0, 99,104, 97,110,115,104,111,119,110, 0, 42,102,105,108,101,108,105,115,116, 0,116,111,116,102,105,108,101, 0,116,105,116,
+108,101, 91, 50, 52, 93, 0,100,105,114, 91, 49, 54, 48, 93, 0,102,105,108,101, 91, 56, 48, 93, 0,111,102,115, 0,115,111,114,
+116, 0,109, 97,120,110, 97,109,101,108,101,110, 0, 99,111,108,108,117,109,115, 0,102, 95,102,112, 0,102,112, 95,115,116,114,
+ 91, 56, 93, 0, 42,108,105, 98,102,105,108,101,100, 97,116, 97, 0,114,101,116,118, 97,108, 0,109,101,110,117, 0, 97, 99,116,
+ 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,111,111,112,115, 0,118,105,115,
+105,102,108, 97,103, 0,116,114,101,101, 0, 42,116,114,101,101,115,116,111,114,101, 0,115,101, 97,114, 99,104, 95,115,116,114,
+105,110,103, 91, 51, 50, 93, 0,115,101, 97,114, 99,104, 95,116,115,101, 0,115,101, 97,114, 99,104, 95,102,108, 97,103,115, 0,
+100,111, 95, 0,111,117,116,108,105,110,101,118,105,115, 0,115,116,111,114,101,102,108, 97,103, 0,100,101,112,115, 95,102,108,
+ 97,103,115, 0, 42, 99,117,109, 97,112, 0,105,109, 97,110,114, 0, 99,117,114,116,105,108,101, 0,105,109,116,121,112,101,110,
+114, 0,115,104,111,119,115,112, 97,114,101, 0,100,116, 95,117,118, 0,115,116,105, 99,107,121, 0, 99,101,110,116,120, 0, 99,
+101,110,116,121, 0, 42,105,110,102,111, 95,115,116,114, 0, 42,105,110,102,111, 95,115,112, 97,114,101, 0, 42,115,112, 97,114,
+101, 0, 97,117,116,111,115,110, 97,112, 0, 42,116,101,120,116, 0,116,111,112, 0,118,105,101,119,108,105,110,101,115, 0,102,
+111,110,116, 95,105,100, 0,108,104,101,105,103,104,116, 0,108,101,102,116, 0,115,104,111,119,108,105,110,101,110,114,115, 0,
+116, 97, 98,110,117,109, 98,101,114, 0, 99,117,114,114,116, 97, 98, 95,115,101,116, 0,115,104,111,119,115,121,110,116, 97,120,
+ 0,117,110,117,115,101,100, 95,112, 97,100,100, 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, 42,115, 99,114,105,112,116, 0, 42, 98,117,116, 95,114,101,102,115, 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, 42,101,100,105,116,116,114,
+101,101, 0,116,114,101,101,116,121,112,101, 0, 42,102,105,108,101,115, 0, 97, 99,116,105,118,101, 95,102,105,108,101, 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, 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, 42,105,109,103, 0,111,117,116,108,105,110,101, 91, 52, 93, 0,
+110,101,117,116,114, 97,108, 91, 52, 93, 0, 97, 99,116,105,111,110, 91, 52, 93, 0,115,101,116,116,105,110,103, 91, 52, 93, 0,
+115,101,116,116,105,110,103, 49, 91, 52, 93, 0,115,101,116,116,105,110,103, 50, 91, 52, 93, 0,110,117,109, 91, 52, 93, 0,116,
+101,120,116,102,105,101,108,100, 91, 52, 93, 0,116,101,120,116,102,105,101,108,100, 95,104,105, 91, 52, 93, 0,112,111,112,117,
+112, 91, 52, 93, 0,116,101,120,116, 91, 52, 93, 0,116,101,120,116, 95,104,105, 91, 52, 93, 0,109,101,110,117, 95, 98, 97, 99,
+107, 91, 52, 93, 0,109,101,110,117, 95,105,116,101,109, 91, 52, 93, 0,109,101,110,117, 95,104,105,108,105,116,101, 91, 52, 93,
+ 0,109,101,110,117, 95,116,101,120,116, 91, 52, 93, 0,109,101,110,117, 95,116,101,120,116, 95,104,105, 91, 52, 93, 0, 98,117,
+116, 95,100,114, 97,119,116,121,112,101, 0,105, 99,111,110,102,105,108,101, 91, 56, 48, 93, 0, 98, 97, 99,107, 91, 52, 93, 0,
+104,101, 97,100,101,114, 91, 52, 93, 0,112, 97,110,101,108, 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,
+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,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,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,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, 98,112, 97,100, 91, 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,121,102,101,120,112,111,114,116,100,105,114, 91, 49, 54, 48, 93, 0,118,101,114,115,105,111,110,115,
- 0,118,114,109,108,102,108, 97,103, 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, 99,111,110,115,111,108,101, 95, 98,117,102,102,101,114, 0, 99,111,110,115,111,108,101, 95,111,117,116,
- 0,109,105,120, 98,117,102,115,105,122,101, 0,102,111,110,116,115,105,122,101, 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,102,111,110,116,110, 97,109,101, 91, 50, 53, 54, 93, 0,116,104,101,109,101,115, 0,117,110,100,111,115,
-116,101,112,115, 0, 99,117,114,115,115,105,122,101, 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,109,101,109, 99, 97, 99,104,101,108,105,109,
-105,116, 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,
-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,
-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,115, 99,101,110,
-101, 0,101,110,100,120, 0,101,110,100,121, 0,115,105,122,101,120, 0,115,105,122,101,121, 0,115, 99,101,110,101,110,114, 0,
-115, 99,114,101,101,110,110,114, 0,102,117,108,108, 0,109, 97,105,110,119,105,110, 0,119,105,110, 97,107,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,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, 99,111,110,116,114,111,108, 0,115,110, 97,112, 0,111,108,100, 95,111,102,115,120,
- 0,111,108,100, 95,111,102,115,121, 0,115,111,114,116, 99,111,117,110,116,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0,
- 42,118, 51, 0, 42,118, 52, 0, 42,102,117,108,108, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,104,101, 97,100,114,
- 99,116, 0,119,105,110,114, 99,116, 0,104,101, 97,100,119,105,110, 0,119,105,110, 0,104,101, 97,100,101,114,116,121,112,101,
- 0, 98,117,116,115,112, 97, 99,101,116,121,112,101, 0,119,105,110,120, 0,119,105,110,121, 0,104,101, 97,100, 95,115,119, 97,
-112, 0,104,101, 97,100, 95,101,113,117, 97,108, 0,119,105,110, 95,115,119, 97,112, 0,119,105,110, 95,101,113,117, 97,108, 0,
-104,101, 97,100, 98,117,116,108,101,110, 0,104,101, 97,100, 98,117,116,111,102,115, 0, 99,117,114,115,111,114, 0,115,112, 97,
- 99,101,100, 97,116, 97, 0,117,105, 98,108,111, 99,107,115, 0,112, 97,110,101,108,115, 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,100,105,115,112,108, 97,121,109,111,100,101, 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,110, 97,
-109,101, 91, 56, 48, 93, 0, 42,105, 98,117,102, 0, 42,115,101, 49, 0, 42,115,101, 50, 0, 42,115,101, 51, 0,110,114, 0,100,
-111,110,101, 0, 42,115,116,114,105,112,100, 97,116, 97, 0,111,114,120, 0,111,114,121, 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,110,101,119,115,101,113, 0,115,116, 97,114,116,111,102,115, 0,101,110,100,111,102,115, 0,115,116, 97,
-114,116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 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,109,117,108, 0,104, 97,110,100,115,105,122,101, 0, 42,115,116,114,105,112, 0, 42,
- 99,117,114,101,108,101,109, 0,102, 97, 99,102, 48, 0,102, 97, 99,102, 49, 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,111,117,110,100, 0, 42,104,100, 97,117,100,105,111, 0,108,101,
-118,101,108, 0,112, 97,110, 0, 99,117,114,112,111,115, 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,112,114,101,115,101,101,107, 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,101,100,103,101, 87,105,100,116,104, 0, 97,
-110,103,108,101, 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, 42,102,114, 97,109,101, 77, 97,112, 0,103,108,111, 98, 97,108, 83,112,101,101,100,
- 0, 98,117,116,116,121,112,101, 0,117,115,101,114,106,105,116, 0,115,116, 97, 0,101,110,100, 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,117,115,101,100,
- 0,117,115,101,100,101,108,101,109, 0,100,120, 0,100,121, 0,108,105,110,107, 0,111,116,121,112,101, 0,111,108,100, 0, 42,
-112,111,105,110, 0, 42,111,108,100,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,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,100,101,108, 97,121, 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, 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,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,105,110,118,101,114,116, 0,102,114,101,113, 50, 0, 97,120,105,115,102, 0, 98,117,116,116,111,
-110, 0, 98,117,116,116,111,110,102, 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,116,105,109,101, 0, 42, 97, 99,116, 0, 98,108,101,110,100,105,110, 0,112,114,
-105,111,114,105,116,121, 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,115,
-110,100,110,114, 0,112, 97,100, 49, 91, 50, 93, 0,109, 97,107,101, 99,111,112,121, 0, 99,111,112,121,109, 97,100,101, 0,112,
- 97,100, 50, 91, 49, 93, 0,116,114, 97, 99,107, 0,118,111,108,117,109,101, 0, 42,109,101, 0,108,105,110, 86,101,108,111, 99,
-105,116,121, 91, 51, 93, 0,108,111, 99, 97,108,102,108, 97,103, 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, 98,117,116,115,116, 97, 0, 98,117,116,101,110,100, 0,109,105,110, 0,
-102, 97, 99, 0,118,105,115,105,102, 97, 99, 0,115,108,111,119, 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,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,103,111, 0, 97, 99, 99,101,108,108,101,114, 97,116,105,111,
-110, 0,109, 97,120,115,112,101,101,100, 0,109, 97,120,114,111,116,115,112,101,101,100, 0,109, 97,120,116,105,108,116,115,112,
-101,101,100, 0,114,111,116,100, 97,109,112, 0,116,105,108,116,100, 97,109,112, 0,115,112,101,101,100,100, 97,109,112, 0, 42,
-115, 97,109,112,108,101, 0, 42,115,116,114,101, 97,109, 0, 42,110,101,119,112, 97, 99,107,101,100,102,105,108,101, 0, 42,115,
-110,100, 95,115,111,117,110,100, 0,112, 97,110,110,105,110,103, 0, 97,116,116,101,110,117, 97,116,105,111,110, 0,112,105,116,
- 99,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,100,105,115,116, 97,110, 99,101, 0,115,116,
-114,101, 97,109,108,101,110, 0, 99,104, 97,110,110,101,108,115, 0,104,105,103,104,112,114,105,111, 0,112, 97,100, 91, 49, 48,
- 93, 0,103, 97,105,110, 0,100,111,112,112,108,101,114,102, 97, 99,116,111,114, 0,100,111,112,112,108,101,114,118,101,108,111,
- 99,105,116,121, 0,110,117,109,115,111,117,110,100,115, 98,108,101,110,100,101,114, 0,110,117,109,115,111,117,110,100,115,103,
- 97,109,101,101,110,103,105,110,101, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101, 99,116, 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,112, 97,116,104,102,108, 97,103, 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, 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, 42, 98,111,110,101, 0, 42, 99,104,105,108,100, 0,105,107,116,114,101,101, 0, 42, 98, 95, 98,111,110,
-101, 95,109, 97,116,115, 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, 42, 99,117,115,116,111,109, 0, 99,104, 97,110, 98, 97,115,101, 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,114,101,115,101,114,118,101,100, 49, 0, 97,117,116,111,115,110, 97,112, 0,
- 97, 99,116,110,114, 0, 97, 99,116,119,105,100,116,104, 0,116,105,109,101,115,108,105,100,101, 0,110, 97,109,101, 91, 51, 48,
- 93, 0,101,110,102,111,114, 99,101, 0, 42,116, 97,114, 0,105,116,101,114, 97,116,105,111,110,115, 0,114,111,111,116, 98,111,
-110,101, 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93, 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,114,101,115,101,114,118,101,100, 50, 0,109,105,110,109, 97,120,102,108, 97,103,
- 0,115,116,105, 99,107,121, 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,122,109,105,110, 0,122,109, 97,120, 0,118,111,108,109,111,100,101, 0,112,108, 97,
+116,111,111,112,115, 0,116,116,105,109,101, 0,116,110,111,100,101, 0, 98,112, 97,100, 91, 52, 93, 0, 98,112, 97,100, 49, 91,
+ 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,121,102,101,120,112,111,114,116,100,105,114, 91, 49, 54, 48, 93,
+ 0,118,101,114,115,105,111,110,115, 0,118,114,109,108,102,108, 97,103, 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, 99,111,110,115,111,108,101, 95, 98,117,102,102,101,114, 0, 99,111,
+110,115,111,108,101, 95,111,117,116, 0,109,105,120, 98,117,102,115,105,122,101, 0,102,111,110,116,115,105,122,101, 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,102,111,110,116,110, 97,109,101, 91, 50, 53, 54, 93, 0,116,104,101,
+109,101,115, 0,117,110,100,111,115,116,101,112,115, 0, 99,117,114,115,115,105,122,101, 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,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,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, 99,111, 98, 97, 95,119,101,105,103,104,116, 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,115, 99,101,110,101, 0,101,110,100,120, 0,101,110,100,
+121, 0,115,105,122,101,120, 0,115,105,122,101,121, 0,115, 99,101,110,101,110,114, 0,115, 99,114,101,101,110,110,114, 0,102,
+117,108,108, 0,109, 97,105,110,119,105,110, 0,119,105,110, 97,107,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,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, 99,111,110,116,114,111,108, 0,115,110, 97,112, 0,111,108,100, 95,111,102,115,120, 0,111,108,100, 95,111,102,115,121, 0,
+115,111,114,116, 99,111,117,110,116,101,114, 0, 42,112, 97,110,101,108,116, 97, 98, 0, 42,118, 51, 0, 42,118, 52, 0, 42,102,
+117,108,108, 0,119,105,110,109, 97,116, 91, 52, 93, 91, 52, 93, 0,104,101, 97,100,114, 99,116, 0,119,105,110,114, 99,116, 0,
+104,101, 97,100,119,105,110, 0,119,105,110, 0,104,101, 97,100,101,114,116,121,112,101, 0, 98,117,116,115,112, 97, 99,101,116,
+121,112,101, 0,119,105,110,120, 0,119,105,110,121, 0,104,101, 97,100, 95,115,119, 97,112, 0,104,101, 97,100, 95,101,113,117,
+ 97,108, 0,119,105,110, 95,115,119, 97,112, 0,119,105,110, 95,101,113,117, 97,108, 0,104,101, 97,100, 98,117,116,108,101,110,
+ 0,104,101, 97,100, 98,117,116,111,102,115, 0, 99,117,114,115,111,114, 0,115,112, 97, 99,101,100, 97,116, 97, 0,117,105, 98,
+108,111, 99,107,115, 0,112, 97,110,101,108,115, 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,100,105,115,112,108, 97,121,109,111,100,101, 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,110, 97,109,101, 91, 56, 48, 93, 0, 42,105, 98,
+117,102, 0, 42,115,101, 49, 0, 42,115,101, 50, 0, 42,115,101, 51, 0,110,114, 0,100,111,110,101, 0, 42,115,116,114,105,112,
+100, 97,116, 97, 0,111,114,120, 0,111,114,121, 0, 42,116,115,116,114,105,112,100, 97,116, 97, 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,115,116, 97,114,
+116,115,116,105,108,108, 0,101,110,100,115,116,105,108,108, 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,109,117,108, 0,104, 97,110,100,115,105,122,101, 0, 42,115,116,114,105,112, 0,102, 97,
+ 99,102, 48, 0,102, 97, 99,102, 49, 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,111,117,110,100, 0, 42,104,100, 97,117,100,105,111, 0,108,101,118,101,108, 0,112, 97,110, 0, 99,117,
+114,112,111,115, 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,112,114,101,
+115,101,101,107, 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,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, 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,101,110,100, 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,117,115,101,100, 0,117,115,101,100,101,108,101,109, 0,100,120, 0,100,121, 0,108,105,110,
+107, 0,111,116,121,112,101, 0,111,108,100, 0, 42,112,111,105,110, 0, 42,111,108,100,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,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,100,101,108, 97,121, 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, 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,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,102,114,101,113, 50, 0, 97,120,105,115,102,
+ 0, 98,117,116,116,111,110, 0, 98,117,116,116,111,110,102, 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,116,105,109,101, 0, 42, 97, 99,116, 0, 98,108,101,110,
+100,105,110, 0,112,114,105,111,114,105,116,121, 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,115,110,100,110,114, 0,112, 97,100, 49, 91, 50, 93, 0,109, 97,107,101, 99,111,112,121, 0, 99,111,112,121,
+109, 97,100,101, 0,112, 97,100, 50, 91, 49, 93, 0,116,114, 97, 99,107, 0,118,111,108,117,109,101, 0, 42,109,101, 0,108,105,
+110, 86,101,108,111, 99,105,116,121, 91, 51, 93, 0,108,111, 99, 97,108,102,108, 97,103, 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, 98,117,116,115,116, 97, 0, 98,117,116,101,110,
+100, 0,109,105,110, 0,109, 97,120, 0,118,105,115,105,102, 97, 99, 0,115,108,111,119, 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,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,103,111, 0, 97, 99, 99,101,108,108,
+101,114, 97,116,105,111,110, 0,109, 97,120,115,112,101,101,100, 0,109, 97,120,114,111,116,115,112,101,101,100, 0,109, 97,120,
+116,105,108,116,115,112,101,101,100, 0,114,111,116,100, 97,109,112, 0,116,105,108,116,100, 97,109,112, 0,115,112,101,101,100,
+100, 97,109,112, 0, 42,115, 97,109,112,108,101, 0, 42,115,116,114,101, 97,109, 0, 42,110,101,119,112, 97, 99,107,101,100,102,
+105,108,101, 0, 42,115,110,100, 95,115,111,117,110,100, 0,112, 97,110,110,105,110,103, 0, 97,116,116,101,110,117, 97,116,105,
+111,110, 0,112,105,116, 99,104, 0,109,105,110, 95,103, 97,105,110, 0,109, 97,120, 95,103, 97,105,110, 0,100,105,115,116, 97,
+110, 99,101, 0,115,116,114,101, 97,109,108,101,110, 0, 99,104, 97,110,110,101,108,115, 0,104,105,103,104,112,114,105,111, 0,
+112, 97,100, 91, 49, 48, 93, 0,103, 97,105,110, 0,100,111,112,112,108,101,114,102, 97, 99,116,111,114, 0,100,111,112,112,108,
+101,114,118,101,108,111, 99,105,116,121, 0,110,117,109,115,111,117,110,100,115, 98,108,101,110,100,101,114, 0,110,117,109,115,
+111,117,110,100,115,103, 97,109,101,101,110,103,105,110,101, 0, 42,108, 97,109,112,114,101,110, 0,103,111, 98,106,101, 99,116,
+ 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,112, 97,116,104,102,108, 97,103, 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, 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, 42, 98,111,110,101, 0,
+ 42, 99,104,105,108,100, 0,105,107,116,114,101,101, 0, 42, 98, 95, 98,111,110,101, 95,109, 97,116,115, 0, 42,100,117, 97,108,
+ 95,113,117, 97,116, 0, 42, 98, 95, 98,111,110,101, 95,100,117, 97,108, 95,113,117, 97,116,115, 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,
+ 42, 99,117,115,116,111,109, 0, 99,104, 97,110, 98, 97,115,101, 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,114,
+101,115,101,114,118,101,100, 49, 0, 97, 99,116,110,114, 0, 97, 99,116,119,105,100,116,104, 0,116,105,109,101,115,108,105,100,
+101, 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, 42,116, 97,114, 0,115,117, 98,116, 97,114,103,101,116, 91, 51, 50, 93,
+ 0,109, 97,116,114,105,120, 91, 52, 93, 91, 52, 93, 0,115,112, 97, 99,101, 0, 42,112,114,111,112, 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, 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,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, 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,114,101,112,101, 97,
-116, 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,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,110,101,101,100, 95,101,120,101, 99, 0,101,120,101, 99, 0,116,111,116,114, 0, 98,117,116,114, 0,112,114,118,
-114, 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, 42,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, 42, 42, 97,108,108,116,121,112,101,115, 0,
- 42,111,119,110,116,121,112,101, 0, 40, 42,116,105,109,101, 99,117,114,115,111,114, 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, 99,121, 99,108,105, 99, 0,
-109,111,118,105,101, 0,115, 97,109,112,108,101,115, 0,109,105,110,115,112,101,101,100, 0, 98,111,107,101,104, 0,104,117,101,
- 0,115, 97,116, 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, 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,112,114,101,118,105,101,119, 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,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, 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,111,102,102,115,101,116, 91, 50, 93, 0,105,110,110,101,114,114, 97,100,105,117,115, 0,114, 97,116,101, 0,114,103,
- 98, 91, 51, 93, 0, 99,108,111,110,101, 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, 0, 0, 0, 84, 89, 80, 69, 0, 0, 1, 24, 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,115,116, 66, 97,115,101, 0,118,
-101, 99, 50,115, 0,118,101, 99, 50,105, 0,118,101, 99, 50,102, 0,118,101, 99, 50,100, 0,118,101, 99, 51,105, 0,118,101, 99,
- 51,102, 0,118,101, 99, 51,100, 0,118,101, 99, 52,105, 0,118,101, 99, 52,102, 0,118,101, 99, 52,100, 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, 73,112,111, 0, 75,101,121, 66,108,111, 99,107, 0,
- 75,101,121, 0, 83, 99,114,105,112,116, 76,105,110,107, 0, 84,101,120,116, 76,105,110,101, 0, 84,101,120,116, 0, 80, 97, 99,
-107,101,100, 70,105,108,101, 0, 67, 97,109,101,114, 97, 0, 80,114,101,118,105,101,119, 73,109, 97,103,101, 0, 73,109, 97,103,
-101, 85,115,101,114, 0, 73,109, 97,103,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, 79, 98,106,101, 99,116, 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, 84,101,120, 77, 97,112,112,105,110,103,
- 0, 76, 97,109,112, 0, 87, 97,118,101, 0, 77, 97,116,101,114,105, 97,108, 0, 98, 78,111,100,101, 84,114,101,101, 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, 66,101,122, 84,114,105,112,108,101, 0, 66, 80,111,105,110,116, 0,
- 78,117,114, 98, 0, 67,104, 97,114, 73,110,102,111, 0, 84,101,120,116, 66,111,120, 0, 67,117,114,118,101, 0, 80, 97,116,104,
- 0, 73,112,111, 68,114,105,118,101,114, 0, 73,112,111, 67,117,114,118,101, 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, 79, 99, 73,110,102,111, 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,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,117,108,116,105,114,101,115,
- 77, 97,112, 78,111,100,101, 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, 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, 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, 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, 66,111,111,108,101, 97,110, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 68,105,115,107,
- 65, 79, 77,111,100,105,102,105,101,114, 68, 97,116, 97, 0, 76, 97,116,116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114,
-111,117,112, 0, 76, 66,117,102, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 0, 80, 97,114,116, 68,101,102,108,101,
- 99,116, 0, 83,111,102,116, 66,111,100,121, 0, 70,108,117,105,100,115,105,109, 83,101,116,116,105,110,103,115, 0, 68,101,114,
-105,118,101,100, 77,101,115,104, 0, 79, 98, 72,111,111,107, 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, 82, 97,
-100,105,111, 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, 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, 71,
- 97,109,101, 70,114, 97,109,105,110,103, 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 73,109, 97,103,101, 80, 97,105,110,116,
- 83,101,116,116,105,110,103,115, 0, 66,114,117,115,104, 0, 84,111,111,108, 83,101,116,116,105,110,103,115, 0, 66,114,117,115,
-104, 68, 97,116, 97, 0, 83, 99,117,108,112,116, 68, 97,116, 97, 0, 83, 99,117,108,112,116, 83,101,115,115,105,111,110, 0, 83,
- 99,101,110,101, 0, 68, 97,103, 70,111,114,101,115,116, 0, 66, 71,112,105, 99, 0, 86,105,101,119, 51, 68, 0, 83,112, 97, 99,
-101, 76,105,110,107, 0, 83, 99,114, 65,114,101, 97, 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, 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, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101, 83,101,113, 0,
- 83,112, 97, 99,101, 70,105,108,101, 0,100,105,114,101,110,116,114,121, 0, 66,108,101,110,100, 72, 97,110,100,108,101, 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, 67,117,114,118,101, 77, 97,112,112,105,110,103, 0, 83,112, 97, 99,101, 78,108,
- 97, 0, 83,112, 97, 99,101, 84,101,120,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83, 99,114,105,112,116, 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, 73,109, 97, 83,101,108, 0, 73,
-109, 97, 68,105,114, 0, 79,110,101, 83,101,108,101, 99,116, 97, 98,108,101, 73,109, 97, 0, 84,104,101,109,101, 85, 73, 0, 84,
-104,101,109,101, 83,112, 97, 99,101, 0, 98, 84,104,101,109,101, 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, 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, 0, 80,108,117,
-103,105,110, 83,101,113, 0, 83,101,113,117,101,110, 99,101, 0, 98, 83,111,117,110,100, 0,104,100, 97,117,100,105,111, 0, 77,
-101,116, 97, 83,116, 97, 99,107, 0, 69,100,105,116,105,110,103, 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, 79,111,112,115, 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, 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, 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, 98, 83,111,117,110,100, 65, 99,116,117, 97,116,111,114, 0, 98, 67, 68, 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, 70,114,101,101, 67, 97,109,101,114, 97, 0, 98, 83, 97,109,112,108,101, 0, 98, 83,111,117,110,100, 76,105,
-115,116,101,110,101,114, 0, 83,112, 97, 99,101, 83,111,117,110,100, 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, 80,111,115,101, 67,104, 97,110,110,101,108, 0, 98, 65, 99,116,105,111,
-110, 67,104, 97,110,110,101,108, 0, 83,112, 97, 99,101, 65, 99,116,105,111,110, 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, 75,105,110,101,109, 97,116,105, 99, 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, 77,105,110, 77, 97,120, 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, 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, 70,111,108,108,111,119, 80, 97,116,104,
- 67,111,110,115,116,114, 97,105,110,116, 0, 98, 68,105,115,116, 97,110, 99,101, 76,105,109,105,116, 67,111,110,115,116,114, 97,
-105,110,116, 0, 98, 82,111,116, 97,116,105,111,110, 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, 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, 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, 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, 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, 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, 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, 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, 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, 8, 0, 4, 0, 8, 0, 8, 0, 16, 0, 12, 0, 12,
- 0, 24, 0, 16, 0, 16, 0, 32, 0, 16, 0, 16, 0, 20, 0, 76, 0, 52, 2, 40, 0, 0, 0, 84, 0,104, 0,120, 0, 16, 0, 24,
- 0,104, 0, 20, 0,128, 0, 12, 0, 32, 1,116, 0, 0, 0, 0, 0,120, 3, 16, 1, 0, 1, 84, 0, 24, 3, 8, 0,168, 0, 0,
- 0,132, 1, 0, 0, 56, 1,184, 0,108, 0, 68, 1, 68, 0, 0, 0,108, 0,104, 0,136, 0, 56, 0, 36, 0, 56, 0, 8, 0, 16,
- 1, 56, 0, 0, 0,140, 0, 84, 1, 20, 0, 20, 0, 44, 0, 60, 0, 20, 0, 12, 0, 12, 0, 4, 0, 8, 0, 8, 0, 24, 0, 20,
- 0, 60, 0, 32, 0, 8, 0, 16, 0, 64, 0, 28, 0, 12, 0, 52, 0, 0, 0, 52, 0, 68, 0, 88, 0, 96, 0, 68, 0,108, 0, 60,
- 0, 60, 0,108, 0,112, 0, 60, 0, 96, 0, 96, 0,180, 0, 52, 0, 64, 0, 60, 0,116, 0, 40, 0, 12, 0, 60, 0, 40, 0, 44,
- 0,136, 1,132, 0, 0, 0,208, 0, 16, 0, 0, 0, 0, 0, 0, 1, 40, 0, 40, 0, 28, 0,176, 0,144, 0, 48, 0, 16, 0, 64,
- 3, 64, 0, 16, 0, 80, 0, 12, 0,152, 0, 76, 0, 8, 0,108, 0, 0, 4,156, 0, 0, 0, 60, 3, 0, 0, 36, 0,204, 0, 0,
- 0, 0, 0, 0, 0,120, 0, 36, 1, 40, 0,204, 0,180, 1,104, 0, 0, 0, 0, 0,248, 0, 12, 0, 12, 0,248, 1, 0, 0,164,
- 0,120, 0, 32, 0, 0, 0,148, 0,184, 2,224, 0, 0, 0, 0, 0,152, 0,184, 11,144, 0, 56, 8,240, 0,120, 0, 20, 0, 24,
- 0,228, 0, 32, 0,104, 0,196, 1,168, 0,184, 1, 28, 0, 0, 0, 16, 0, 28, 0, 12, 0, 24, 0, 40, 0, 16, 0, 20, 0, 16,
- 0, 24, 1, 56, 0, 0, 0, 56, 0, 44, 0, 64, 0, 48, 0, 8, 0, 44, 0, 72, 0,104, 0, 72, 0, 44, 0, 40, 0,108, 0, 68,
- 0, 76, 0, 80, 0, 64, 0,128, 0, 4, 0, 60, 0, 12, 0, 60, 0, 28, 0, 20, 0, 64, 0, 16, 0, 76, 0,104, 0, 52, 0, 28,
- 0, 56, 0, 60, 0, 56, 0,108, 0,140, 0, 4, 0, 40, 0, 0, 0, 68, 0,160, 0, 24, 1, 4, 0,108, 1, 80, 0, 60, 0,176,
- 0, 44, 0, 52, 0, 68, 0, 52, 0, 44, 0, 44, 0, 68, 0, 44, 0, 64, 0, 44, 0, 20, 0, 60, 0, 24, 0, 52, 0, 28, 0, 28,
- 0, 28, 0, 96, 0, 52, 0,140, 0, 36, 0,116, 0, 24, 0,164, 0, 0, 0, 0, 0, 16, 0, 24, 0, 12, 1, 16, 0, 40, 0, 64,
- 0, 32, 0, 24, 0, 12, 0, 44, 0, 20, 0, 52, 83, 84, 82, 67, 0, 0, 0,244, 0, 10, 0, 2, 0, 10, 0, 0, 0, 10, 0, 1,
- 0, 11, 0, 2, 0, 9, 0, 2, 0, 9, 0, 3, 0, 12, 0, 2, 0, 2, 0, 4, 0, 2, 0, 5, 0, 13, 0, 2, 0, 4, 0, 4,
- 0, 4, 0, 5, 0, 14, 0, 2, 0, 7, 0, 4, 0, 7, 0, 5, 0, 15, 0, 2, 0, 8, 0, 4, 0, 8, 0, 5, 0, 16, 0, 3,
- 0, 4, 0, 4, 0, 4, 0, 5, 0, 4, 0, 6, 0, 17, 0, 3, 0, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 18, 0, 3,
- 0, 8, 0, 4, 0, 8, 0, 5, 0, 8, 0, 6, 0, 19, 0, 4, 0, 4, 0, 4, 0, 4, 0, 5, 0, 4, 0, 6, 0, 4, 0, 7,
- 0, 20, 0, 4, 0, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 21, 0, 4, 0, 8, 0, 4, 0, 8, 0, 5,
- 0, 8, 0, 6, 0, 8, 0, 7, 0, 22, 0, 4, 0, 4, 0, 8, 0, 4, 0, 9, 0, 4, 0, 10, 0, 4, 0, 11, 0, 23, 0, 4,
- 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 24, 0, 4, 0, 9, 0, 12, 0, 11, 0, 13, 0, 4, 0, 14,
- 0, 4, 0, 15, 0, 25, 0, 10, 0, 25, 0, 0, 0, 25, 0, 1, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 18, 0, 2, 0, 19,
- 0, 24, 0, 20, 0, 4, 0, 21, 0, 4, 0, 22, 0, 4, 0, 23, 0, 26, 0, 9, 0, 9, 0, 0, 0, 9, 0, 1, 0, 26, 0, 24,
- 0, 27, 0, 25, 0, 0, 0, 26, 0, 2, 0, 27, 0, 2, 0, 19, 0, 4, 0, 28, 0, 25, 0, 29, 0, 27, 0, 8, 0, 26, 0, 30,
- 0, 26, 0, 31, 0, 28, 0, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, 4, 0, 35, 0, 4, 0, 15, 0, 27, 0, 36, 0, 29, 0, 6,
- 0, 26, 0, 30, 0, 11, 0, 37, 0, 23, 0, 38, 0, 2, 0, 39, 0, 2, 0, 40, 0, 4, 0, 15, 0, 30, 0, 13, 0, 30, 0, 0,
- 0, 30, 0, 1, 0, 7, 0, 41, 0, 7, 0, 42, 0, 2, 0, 17, 0, 2, 0, 43, 0, 4, 0, 44, 0, 9, 0, 45, 0, 7, 0, 46,
- 0, 0, 0, 16, 0, 0, 0, 47, 0, 7, 0, 48, 0, 7, 0, 49, 0, 31, 0, 12, 0, 26, 0, 30, 0, 30, 0, 50, 0, 0, 0, 51,
- 0, 4, 0, 52, 0, 7, 0, 42, 0, 11, 0, 53, 0, 29, 0, 54, 0, 26, 0, 55, 0, 2, 0, 17, 0, 2, 0, 56, 0, 2, 0, 57,
- 0, 2, 0, 19, 0, 32, 0, 5, 0, 26, 0, 58, 0, 2, 0, 59, 0, 2, 0, 60, 0, 2, 0, 61, 0, 4, 0, 15, 0, 33, 0, 6,
- 0, 33, 0, 0, 0, 33, 0, 1, 0, 0, 0, 62, 0, 0, 0, 63, 0, 4, 0, 21, 0, 4, 0, 64, 0, 34, 0, 13, 0, 26, 0, 30,
- 0, 0, 0, 65, 0, 4, 0, 66, 0, 4, 0, 67, 0, 11, 0, 68, 0, 33, 0, 69, 0, 33, 0, 70, 0, 4, 0, 71, 0, 4, 0, 72,
- 0, 0, 0, 73, 0, 4, 0, 74, 0, 4, 0, 75, 0, 9, 0, 76, 0, 35, 0, 5, 0, 4, 0, 77, 0, 4, 0, 78, 0, 4, 0, 66,
- 0, 4, 0, 15, 0, 9, 0, 45, 0, 36, 0, 19, 0, 26, 0, 30, 0, 2, 0, 17, 0, 2, 0, 19, 0, 7, 0, 79, 0, 7, 0, 80,
- 0, 7, 0, 81, 0, 7, 0, 82, 0, 7, 0, 83, 0, 7, 0, 84, 0, 7, 0, 85, 0, 7, 0, 86, 0, 7, 0, 87, 0, 7, 0, 88,
- 0, 7, 0, 89, 0, 2, 0, 90, 0, 2, 0, 91, 0, 7, 0, 92, 0, 29, 0, 54, 0, 32, 0, 93, 0, 37, 0, 3, 0, 4, 0, 7,
- 0, 4, 0, 94, 0, 4, 0, 95, 0, 38, 0, 12, 0, 4, 0, 96, 0, 4, 0, 97, 0, 4, 0, 98, 0, 4, 0, 99, 0, 2, 0,100,
- 0, 2, 0,101, 0, 2, 0, 19, 0, 2, 0,102, 0, 2, 0,103, 0, 2, 0,104, 0, 2, 0,105, 0, 2, 0,106, 0, 39, 0, 29,
- 0, 26, 0, 30, 0, 0, 0, 33, 0, 11, 0,107, 0, 40, 0,108, 0, 41, 0,109, 0, 2, 0,102, 0, 2, 0, 19, 0, 2, 0,110,
- 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 80, 0, 4, 0,111, 0, 2, 0,112, 0, 2, 0,113, 0, 2, 0,114, 0, 2, 0,115,
- 0, 2, 0,116, 0, 2, 0,117, 0, 4, 0,118, 0, 4, 0,119, 0, 35, 0,120, 0, 37, 0,121, 0, 7, 0,122, 0, 4, 0,123,
- 0, 2, 0,124, 0, 2, 0,125, 0, 2, 0,126, 0, 2, 0,127, 0, 9, 0,128, 0, 42, 0, 25, 0, 2, 0,129, 0, 2, 0,130,
- 0, 2, 0,131, 0, 2, 0,132, 0, 43, 0,133, 0, 44, 0,134, 0, 0, 0,135, 0, 0, 0,136, 0, 0, 0,137, 0, 0, 0,138,
- 0, 0, 0,139, 0, 7, 0,140, 0, 7, 0,141, 0, 2, 0,142, 0, 2, 0,143, 0, 7, 0,144, 0, 7, 0,145, 0, 7, 0,146,
- 0, 7, 0,147, 0, 7, 0,148, 0, 7, 0,149, 0, 7, 0,150, 0, 7, 0,151, 0, 7, 0,152, 0, 7, 0,153, 0, 45, 0, 15,
- 0, 0, 0,154, 0, 9, 0,155, 0, 0, 0,156, 0, 0, 0,157, 0, 4, 0,158, 0, 4, 0,159, 0, 9, 0,160, 0, 7, 0,161,
- 0, 7, 0,162, 0, 7, 0,163, 0, 4, 0,164, 0, 9, 0,165, 0, 9, 0,166, 0, 4, 0,167, 0, 4, 0, 15, 0, 46, 0, 6,
- 0, 7, 0,144, 0, 7, 0,145, 0, 7, 0,146, 0, 7, 0,168, 0, 7, 0, 41, 0, 4, 0, 38, 0, 47, 0, 5, 0, 2, 0, 19,
- 0, 2, 0, 35, 0, 2, 0, 38, 0, 2, 0,169, 0, 46, 0,163, 0, 48, 0, 17, 0, 43, 0,133, 0, 39, 0,170, 0, 49, 0,171,
- 0, 7, 0,172, 0, 7, 0,173, 0, 2, 0, 17, 0, 2, 0,174, 0, 7, 0, 81, 0, 7, 0, 82, 0, 7, 0,175, 0, 4, 0,176,
- 0, 2, 0,177, 0, 2, 0,178, 0, 4, 0,102, 0, 4, 0,111, 0, 2, 0,179, 0, 2, 0,180, 0, 44, 0, 52, 0, 26, 0, 30,
- 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, 2, 0,201, 0, 2, 0,202, 0, 2, 0,203, 0, 2, 0,204,
- 0, 2, 0,205, 0, 2, 0,206, 0, 2, 0,207, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,174, 0, 7, 0,208, 0, 7, 0,209,
- 0, 7, 0,210, 0, 7, 0,211, 0, 2, 0,212, 0, 2, 0,213, 0, 2, 0,214, 0, 2, 0,100, 0, 4, 0, 21, 0, 4, 0, 97,
- 0, 4, 0, 98, 0, 4, 0, 99, 0, 7, 0,215, 0, 7, 0,216, 0, 7, 0,150, 0, 38, 0,217, 0, 29, 0, 54, 0, 39, 0,170,
- 0, 45, 0,218, 0, 47, 0,219, 0, 48, 0,220, 0, 50, 0, 8, 0, 7, 0,221, 0, 7, 0,222, 0, 7, 0,141, 0, 4, 0, 19,
- 0, 7, 0,223, 0, 7, 0,224, 0, 7, 0,225, 0, 43, 0,226, 0, 51, 0, 52, 0, 26, 0, 30, 0, 2, 0, 17, 0, 2, 0,227,
- 0, 2, 0,143, 0, 2, 0,228, 0, 7, 0,144, 0, 7, 0,145, 0, 7, 0,146, 0, 7, 0,147, 0, 7, 0,229, 0, 7, 0,230,
- 0, 7, 0,231, 0, 7, 0,232, 0, 7, 0,233, 0, 7, 0,234, 0, 7, 0,235, 0, 7, 0, 81, 0, 7, 0, 82, 0, 7, 0,236,
- 0, 7, 0,237, 0, 7, 0,238, 0, 2, 0,239, 0, 2, 0,240, 0, 2, 0,241, 0, 2, 0,242, 0, 0, 0,243, 0, 0, 0,244,
- 0, 2, 0,245, 0, 2, 0,246, 0, 2, 0,247, 0, 2, 0,248, 0, 2, 0,249, 0, 7, 0,250, 0, 7, 0,251, 0, 7, 0,252,
- 0, 2, 0,253, 0, 2, 0,254, 0, 4, 0,255, 0, 4, 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, 7, 1, 7, 0, 7, 1, 8, 0, 2, 1, 9, 0, 2, 1, 10, 0, 42, 1, 11, 0, 29, 0, 54,
- 0, 32, 0, 93, 0, 52, 0, 2, 0, 26, 0, 30, 0, 29, 0, 54, 0, 53, 0,101, 0, 26, 0, 30, 0, 2, 0,143, 0, 2, 0, 19,
- 0, 7, 0,144, 0, 7, 0,145, 0, 7, 0,146, 0, 7, 1, 12, 0, 7, 1, 13, 0, 7, 1, 14, 0, 7, 1, 15, 0, 7, 1, 16,
- 0, 7, 1, 17, 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, 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, 0, 1, 42, 0, 0, 1, 43, 0, 4, 0,227, 0, 4, 1, 44, 0, 2, 1, 45, 0, 2, 1, 46, 0, 2, 1, 47,
- 0, 2, 1, 48, 0, 7, 1, 49, 0, 7, 1, 50, 0, 7, 1, 51, 0, 7, 1, 52, 0, 7, 1, 53, 0, 7, 1, 54, 0, 7, 1, 55,
- 0, 7, 1, 56, 0, 7, 1, 57, 0, 7, 1, 58, 0, 0, 1, 59, 0, 0, 0,253, 0, 0, 1, 60, 0, 0, 1, 61, 0, 2, 1, 62,
- 0, 2, 1, 63, 0, 2, 1, 64, 0, 2, 1, 65, 0, 2, 1, 66, 0, 2, 1, 67, 0, 7, 1, 68, 0, 7, 1, 69, 0, 7, 1, 70,
- 0, 7, 1, 71, 0, 7, 1, 72, 0, 2, 0,129, 0, 2, 0,130, 0, 47, 1, 73, 0, 47, 1, 74, 0, 0, 1, 75, 0, 0, 1, 76,
- 0, 0, 1, 77, 0, 0, 1, 78, 0, 2, 1, 79, 0, 2, 1, 80, 0, 7, 1, 81, 0, 7, 1, 82, 0, 42, 1, 11, 0, 54, 1, 83,
- 0, 29, 0, 54, 0, 55, 1, 84, 0, 7, 1, 85, 0, 7, 1, 86, 0, 7, 1, 87, 0, 7, 1, 88, 0, 7, 1, 89, 0, 2, 1, 90,
- 0, 2, 1, 91, 0, 7, 1, 92, 0, 7, 1, 93, 0, 7, 1, 94, 0, 7, 1, 95, 0, 7, 1, 96, 0, 4, 1, 97, 0, 4, 1, 98,
- 0, 4, 1, 99, 0, 32, 0, 93, 0, 56, 0, 6, 0, 26, 0, 30, 0, 0, 1,100, 0, 7, 1,101, 0, 7, 0, 15, 0, 57, 0, 45,
- 0, 35, 0,120, 0, 58, 0, 26, 0, 58, 0, 0, 0, 58, 0, 1, 0, 59, 1,102, 0, 4, 1,103, 0, 4, 1,104, 0, 4, 1,105,
- 0, 4, 1,106, 0, 4, 1,107, 0, 4, 1,108, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 1,109, 0, 2, 1,110, 0, 7, 0, 4,
- 0, 7, 0, 5, 0, 7, 0, 6, 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, 0, 21, 0, 7, 1,118, 0, 7, 1,119, 0, 60, 0, 15, 0, 26, 0, 30, 0, 59, 1,102, 0, 11, 1,120,
- 0, 11, 1,121, 0, 29, 0, 54, 0, 53, 1,122, 0, 2, 0, 19, 0, 2, 1,123, 0, 4, 0,142, 0, 7, 0,221, 0, 7, 0,141,
- 0, 7, 0,222, 0, 7, 1,124, 0, 7, 1,125, 0, 7, 1,126, 0, 61, 0, 10, 0, 7, 1,127, 0, 7, 1,128, 0, 7, 1,129,
- 0, 7, 1,130, 0, 2, 1,131, 0, 2, 1,132, 0, 0, 1,133, 0, 0, 1,134, 0, 0, 1,135, 0, 0, 1,136, 0, 62, 0, 7,
- 0, 7, 1,137, 0, 7, 1,128, 0, 7, 1,129, 0, 2, 1,133, 0, 2, 1,136, 0, 7, 1,130, 0, 7, 0, 15, 0, 63, 0, 20,
- 0, 63, 0, 0, 0, 63, 0, 1, 0, 2, 0, 17, 0, 2, 1,138, 0, 2, 1,136, 0, 2, 0, 19, 0, 2, 1,139, 0, 2, 1,140,
- 0, 2, 1,141, 0, 2, 1,142, 0, 2, 1,143, 0, 2, 1,144, 0, 2, 1,145, 0, 2, 1,146, 0, 7, 1,147, 0, 7, 1,148,
- 0, 62, 1,149, 0, 61, 1,150, 0, 4, 1,151, 0, 4, 0, 15, 0, 64, 0, 5, 0, 2, 1,152, 0, 2, 1,138, 0, 0, 0, 19,
- 0, 0, 0, 15, 0, 2, 1, 91, 0, 65, 0, 4, 0, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 7, 0, 7, 0, 94, 0, 66, 0, 57,
- 0, 26, 0, 30, 0, 59, 1,102, 0, 11, 1,153, 0, 11, 1,121, 0, 43, 1,154, 0, 43, 1,155, 0, 43, 1,156, 0, 29, 0, 54,
- 0, 67, 1,157, 0, 31, 1,158, 0, 53, 1,122, 0, 11, 1,159, 0, 7, 0,221, 0, 7, 0,141, 0, 7, 0,222, 0, 4, 0,142,
- 0, 2, 1,160, 0, 2, 1,123, 0, 2, 0, 19, 0, 2, 1,161, 0, 7, 1,162, 0, 7, 1,163, 0, 7, 1,164, 0, 2, 1,141,
- 0, 2, 1,142, 0, 2, 1,165, 0, 2, 1,166, 0, 4, 1, 91, 0, 2, 0, 21, 0, 2, 0, 68, 0, 2, 0, 41, 0, 2, 1,167,
- 0, 7, 1,168, 0, 7, 1,169, 0, 7, 1,170, 0, 7, 1,171, 0, 7, 1,172, 0, 7, 1,173, 0, 7, 1,174, 0, 7, 1,175,
- 0, 7, 1,176, 0, 7, 1,177, 0, 0, 1,178, 0, 0, 1,179, 0, 56, 1,180, 0, 56, 1,181, 0, 56, 1,182, 0, 56, 1,183,
- 0, 4, 1,184, 0, 4, 1,185, 0, 4, 1,186, 0, 4, 0, 15, 0, 65, 1,187, 0, 4, 1,188, 0, 4, 1,189, 0, 64, 1,190,
- 0, 64, 1,191, 0, 68, 0, 6, 0, 43, 0,226, 0, 2, 0, 39, 0, 2, 0, 43, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 1,192,
- 0, 69, 0, 19, 0, 69, 0, 0, 0, 69, 0, 1, 0, 62, 1,149, 0, 61, 1,150, 0, 23, 1,193, 0, 23, 1,194, 0, 2, 0, 39,
- 0, 2, 0, 43, 0, 2, 1,195, 0, 2, 1,196, 0, 2, 1,197, 0, 2, 1,198, 0, 2, 0, 19, 0, 2, 1,199, 0, 7, 0, 10,
- 0, 7, 0, 11, 0, 4, 1,200, 0, 7, 0, 42, 0, 68, 1,201, 0, 70, 0, 41, 0, 26, 0, 30, 0, 59, 1,102, 0, 11, 1,202,
- 0, 29, 0, 54, 0, 31, 1,158, 0, 53, 1,122, 0, 71, 1,203, 0, 72, 1,204, 0, 73, 1,205, 0, 74, 1,206, 0, 75, 1,207,
- 0, 76, 1,208, 0, 77, 1,209, 0, 78, 1,210, 0, 70, 1,211, 0, 79, 1,212, 0, 80, 1,213, 0, 9, 1,214, 0, 81, 1,215,
- 0, 81, 1,216, 0, 81, 1,217, 0, 4, 1,196, 0, 4, 1,218, 0, 4, 1,219, 0, 4, 1,220, 0, 4, 1, 91, 0, 4, 0,142,
- 0, 7, 0,221, 0, 7, 0,141, 0, 7, 0,222, 0, 7, 1,221, 0, 7, 0, 15, 0, 2, 1,222, 0, 2, 0, 19, 0, 2, 1,223,
- 0, 2, 1,224, 0, 2, 1,123, 0, 2, 1,225, 0, 82, 1,226, 0, 83, 1,227, 0, 9, 0,128, 0, 73, 0, 8, 0, 9, 1,228,
- 0, 7, 1,229, 0, 4, 1,230, 0, 0, 0, 19, 0, 0, 1,231, 0, 2, 0,227, 0, 2, 1,232, 0, 2, 1,233, 0, 71, 0, 8,
- 0, 4, 1,234, 0, 4, 1,235, 0, 4, 1,236, 0, 4, 1,237, 0, 0, 0, 15, 0, 0, 1,138, 0, 0, 1,238, 0, 0, 0, 19,
- 0, 75, 0, 5, 0, 4, 1,234, 0, 4, 1,235, 0, 0, 1,239, 0, 0, 0, 15, 0, 2, 0, 19, 0, 84, 0, 2, 0, 4, 1,240,
- 0, 7, 1,129, 0, 76, 0, 3, 0, 84, 1,241, 0, 4, 1,242, 0, 4, 0, 19, 0, 74, 0, 4, 0, 7, 1,243, 0, 2, 1,244,
- 0, 0, 0, 19, 0, 0, 1,138, 0, 77, 0, 4, 0, 0, 0,168, 0, 0, 0,144, 0, 0, 0,145, 0, 0, 0,146, 0, 78, 0, 1,
- 0, 7, 1,245, 0, 79, 0, 2, 0, 4, 1,246, 0, 4, 0, 17, 0, 72, 0, 7, 0, 7, 1,229, 0, 39, 1,228, 0, 0, 0, 19,
- 0, 0, 1,231, 0, 2, 0,227, 0, 2, 1,232, 0, 2, 1,233, 0, 85, 0, 4, 0, 7, 0,168, 0, 7, 0,144, 0, 7, 0,145,
- 0, 7, 0,146, 0, 86, 0, 1, 0, 85, 1,230, 0, 87, 0, 6, 0, 4, 1,247, 0, 4, 1,248, 0, 4, 1,249, 0, 0, 0, 19,
- 0, 0, 1,138, 0, 0, 1,250, 0, 88, 0, 2, 0, 4, 1,251, 0, 4, 1,248, 0, 89, 0, 13, 0, 89, 0, 0, 0, 89, 0, 1,
- 0, 74, 1,252, 0, 87, 1,253, 0, 86, 1,254, 0, 88, 1,255, 0, 11, 2, 0, 0, 11, 2, 1, 0, 90, 2, 2, 0, 4, 1,196,
- 0, 4, 1,219, 0, 4, 1,218, 0, 4, 0, 15, 0, 82, 0, 12, 0, 11, 2, 3, 0, 0, 2, 4, 0, 0, 2, 5, 0, 0, 2, 6,
- 0, 0, 2, 7, 0, 0, 2, 8, 0, 0, 2, 9, 0, 0, 2, 10, 0, 0, 0, 15, 0, 81, 1,215, 0, 81, 1,217, 0, 2, 2, 11,
- 0, 83, 0, 8, 0, 4, 2, 12, 0, 4, 2, 13, 0, 71, 2, 14, 0, 75, 2, 15, 0, 4, 1,219, 0, 4, 1,218, 0, 4, 1,196,
- 0, 4, 0, 15, 0, 91, 0, 6, 0, 91, 0, 0, 0, 91, 0, 1, 0, 4, 0, 17, 0, 4, 0,227, 0, 0, 0, 16, 0, 0, 2, 16,
- 0, 92, 0, 7, 0, 91, 2, 17, 0, 2, 2, 18, 0, 2, 2, 3, 0, 2, 2, 19, 0, 2, 0, 66, 0, 9, 2, 20, 0, 9, 2, 21,
- 0, 93, 0, 3, 0, 91, 2, 17, 0, 43, 0,133, 0, 0, 0, 16, 0, 94, 0, 5, 0, 91, 2, 17, 0, 43, 0,133, 0, 0, 0, 16,
- 0, 2, 2, 22, 0, 0, 2, 23, 0, 95, 0, 5, 0, 91, 2, 17, 0, 7, 2, 24, 0, 7, 2, 25, 0, 4, 2, 26, 0, 4, 2, 27,
- 0, 96, 0, 11, 0, 91, 2, 17, 0, 43, 2, 28, 0, 43, 2, 29, 0, 7, 2, 30, 0, 7, 2, 31, 0, 7, 2, 25, 0, 7, 2, 32,
- 0, 4, 2, 33, 0, 4, 2, 34, 0, 4, 0, 66, 0, 4, 2, 35, 0, 97, 0, 4, 0, 91, 2, 17, 0, 2, 2, 36, 0, 2, 0, 19,
- 0, 7, 2, 37, 0, 98, 0, 3, 0, 91, 2, 17, 0, 7, 2, 38, 0, 4, 0, 66, 0, 99, 0, 8, 0, 91, 2, 17, 0, 44, 2, 39,
- 0, 7, 2, 40, 0, 4, 2, 41, 0, 0, 2, 42, 0, 7, 2, 43, 0, 4, 2, 44, 0, 43, 2, 45, 0,100, 0, 7, 0, 91, 2, 17,
- 0, 43, 2, 46, 0, 39, 2, 47, 0, 4, 0, 66, 0, 4, 2, 48, 0, 7, 2, 49, 0, 7, 2, 50, 0,101, 0, 3, 0, 91, 2, 17,
- 0, 7, 2, 51, 0, 4, 2, 52, 0,102, 0, 13, 0, 91, 2, 17, 0, 43, 2, 53, 0, 2, 0, 19, 0, 2, 0, 15, 0, 7, 2, 54,
- 0, 7, 2, 55, 0, 7, 2, 56, 0, 7, 1,162, 0, 7, 2, 57, 0, 7, 2, 58, 0, 7, 2, 59, 0, 7, 2, 60, 0, 7, 2, 61,
- 0,103, 0, 6, 0, 91, 2, 17, 0, 2, 2, 62, 0, 2, 0, 80, 0, 4, 1, 91, 0, 43, 0,133, 0, 0, 2, 42, 0,104, 0, 9,
- 0, 91, 2, 17, 0, 43, 0,133, 0, 7, 2, 63, 0, 7, 2, 64, 0, 7, 2, 65, 0, 4, 2, 66, 0, 4, 2, 67, 0, 7, 2, 68,
- 0, 0, 0, 16, 0,105, 0, 1, 0, 91, 2, 17, 0,106, 0, 4, 0, 91, 2, 17, 0, 43, 0,133, 0, 4, 2, 69, 0, 4, 0, 15,
- 0,107, 0, 3, 0, 91, 2, 17, 0, 4, 2, 70, 0, 7, 2, 71, 0,108, 0, 24, 0, 26, 0, 30, 0, 2, 1,139, 0, 2, 1,140,
- 0, 2, 2, 72, 0, 2, 0, 19, 0, 2, 2, 73, 0, 2, 2, 74, 0, 2, 2, 75, 0, 2, 1, 91, 0, 0, 2, 76, 0, 0, 2, 77,
- 0, 0, 2, 78, 0, 0, 0, 17, 0, 4, 0, 15, 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, 62, 2, 85, 0, 29, 0, 54, 0, 31, 1,158, 0, 76, 1,208, 0,109, 0, 3, 0,109, 0, 0, 0,109, 0, 1,
- 0, 0, 0, 16, 0, 59, 0, 3, 0, 7, 2, 86, 0, 4, 0, 19, 0, 4, 0, 15, 0, 80, 0, 2, 0, 7, 2, 87, 0, 7, 0,141,
- 0,110, 0, 4, 0, 2, 0, 35, 0, 2, 2, 88, 0, 4, 0, 15, 0, 43, 2, 89, 0, 43, 0,104, 0, 26, 0, 30, 0, 2, 0, 17,
- 0, 2, 2, 90, 0, 4, 2, 91, 0, 4, 2, 92, 0, 4, 2, 93, 0, 0, 2, 94, 0, 9, 2, 95, 0, 43, 0, 36, 0, 43, 2, 96,
- 0, 43, 2, 97, 0, 43, 2, 98, 0, 43, 2, 99, 0, 29, 0, 54, 0, 67, 1,157, 0, 59, 1,102, 0,111, 2,100, 0,112, 2,101,
- 0, 9, 0, 45, 0, 11, 2,102, 0, 11, 1,202, 0, 11, 2,103, 0, 11, 1,121, 0, 11, 2,104, 0, 11, 2,105, 0, 53, 1,122,
- 0, 7, 0,221, 0, 7, 2,106, 0, 7, 2,107, 0, 7, 0,141, 0, 7, 2,108, 0, 7, 0,222, 0, 7, 2,109, 0, 7, 1,111,
- 0, 7, 2,110, 0, 7, 2,111, 0, 7, 2, 63, 0, 7, 0,172, 0, 4, 2,112, 0, 2, 0, 19, 0, 2, 2,113, 0, 2, 2,114,
- 0, 2, 2,115, 0, 2, 2,116, 0, 2, 2,117, 0, 2, 2,118, 0, 2, 2,119, 0, 2, 2,120, 0, 2, 2,121, 0, 2, 2,122,
- 0, 2, 2,123, 0, 4, 2,124, 0, 4, 2,125, 0, 4, 2,126, 0, 4, 2,127, 0, 7, 2,128, 0, 7, 2,129, 0, 7, 2,130,
- 0, 7, 2,131, 0, 7, 2,132, 0, 7, 2,133, 0, 7, 2,134, 0, 7, 2,135, 0, 7, 2,136, 0, 0, 2,137, 0, 0, 2,138,
- 0, 0, 1,123, 0, 0, 2,139, 0, 0, 2,140, 0, 0, 2,141, 0, 7, 2,142, 0, 32, 0, 93, 0, 11, 2,143, 0, 11, 2,144,
- 0, 11, 2,145, 0, 11, 2,146, 0, 9, 1,214, 0, 7, 2,147, 0, 2, 1,246, 0, 2, 2,148, 0, 7, 1,230, 0, 4, 2,149,
- 0, 4, 2,150, 0, 2, 2,151, 0, 2, 0,179, 0, 7, 2,152, 0, 11, 2,153, 0, 11, 2,154, 0, 11, 2,155, 0,113, 2,156,
- 0,114, 2,157, 0, 55, 2,158, 0, 2, 2,159, 0, 2, 2,160, 0, 2, 2,161, 0, 2, 2,162, 0, 7, 1,222, 0, 4, 2,163,
- 0,115, 2,164, 0,116, 2,165, 0,116, 2,166, 0, 4, 2,167, 0, 4, 0, 15, 0, 9, 0,128, 0,117, 0, 14, 0,117, 0, 0,
- 0,117, 0, 1, 0, 43, 0, 36, 0, 7, 2, 63, 0, 7, 0,223, 0, 7, 2, 64, 0, 7, 2, 65, 0, 0, 0, 16, 0, 4, 2, 66,
- 0, 4, 2, 67, 0, 4, 2,168, 0, 2, 0, 17, 0, 2, 2,169, 0, 7, 2, 68, 0,113, 0, 13, 0, 2, 2,170, 0, 2, 2,171,
- 0, 2, 0, 19, 0, 2, 0, 15, 0, 7, 2,172, 0, 7, 2,173, 0, 7, 2,174, 0, 7, 2,175, 0, 7, 2,176, 0, 7, 2,177,
- 0, 7, 2,178, 0, 7, 2,179, 0, 7, 2,180, 0,118, 0, 1, 0, 7, 1,137, 0,114, 0, 40, 0, 4, 2,181, 0, 4, 2,182,
- 0,119, 2,183, 0,120, 2,184, 0, 7, 2,129, 0, 7, 2,185, 0, 7, 2,186, 0, 7, 2,187, 0, 7, 2,188, 0, 7, 2,189,
- 0, 7, 2,190, 0, 7, 2,191, 0, 7, 2,192, 0, 7, 2,193, 0, 7, 2,194, 0, 2, 2,195, 0, 2, 2,196, 0, 7, 2,197,
- 0, 7, 2,198, 0, 4, 0, 99, 0, 4, 2,199, 0, 4, 2,200, 0, 2, 2,201, 0, 2, 2,202, 0,118, 2,203, 0, 4, 2,204,
- 0, 4, 0, 56, 0, 7, 2,205, 0, 7, 2,206, 0, 7, 2,207, 0, 7, 2,208, 0, 2, 2,209, 0, 2, 2,210, 0, 2, 2,211,
- 0, 2, 2,212, 0, 2, 2,213, 0, 2, 1, 80, 0, 2, 2,163, 0, 2, 2,214, 0,121, 2,215, 0,115, 0, 40, 0, 2, 0, 17,
- 0, 2, 2,216, 0, 2, 2,217, 0, 2, 2,218, 0, 7, 2,219, 0, 2, 2,220, 0, 2, 2,221, 0, 7, 2,222, 0, 2, 2,223,
- 0, 2, 2,224, 0, 7, 2,225, 0, 7, 2,226, 0, 7, 2,227, 0, 7, 2,228, 0, 7, 2,229, 0, 7, 2,230, 0, 4, 2,231,
- 0, 7, 2,232, 0, 7, 2,233, 0, 7, 2,234, 0, 70, 2,235, 0, 70, 2,236, 0, 70, 2,237, 0, 0, 2,238, 0, 7, 2,239,
- 0, 7, 2,240, 0, 29, 0, 54, 0, 2, 2,241, 0, 0, 2,242, 0, 0, 2,243, 0, 7, 2,244, 0, 4, 2,245, 0, 7, 2,246,
- 0, 7, 2,247, 0, 4, 2,248, 0, 4, 2,249, 0, 7, 2,250, 0, 7, 2,251, 0, 7, 2,252, 0, 74, 2,253, 0,122, 0, 57,
- 0, 26, 0, 30, 0, 2, 0,143, 0, 2, 0,228, 0, 2, 0,253, 0, 2, 2,254, 0, 7, 2,255, 0, 7, 3, 0, 0, 7, 3, 1,
- 0, 7, 3, 2, 0, 7, 3, 3, 0, 7, 3, 4, 0, 7, 3, 5, 0, 7, 3, 6, 0, 7, 1, 18, 0, 7, 1, 20, 0, 7, 1, 19,
- 0, 7, 3, 7, 0, 4, 3, 8, 0, 7, 3, 9, 0, 7, 3, 10, 0, 7, 3, 11, 0, 7, 3, 12, 0, 7, 3, 13, 0, 7, 3, 14,
- 0, 7, 3, 15, 0, 2, 3, 16, 0, 2, 0,227, 0, 4, 3, 17, 0, 7, 3, 18, 0, 7, 3, 19, 0, 7, 3, 20, 0, 7, 3, 21,
- 0, 7, 3, 22, 0, 7, 3, 23, 0, 7, 3, 24, 0, 7, 3, 25, 0, 7, 3, 26, 0, 7, 3, 27, 0, 7, 3, 28, 0, 7, 3, 29,
- 0, 2, 3, 30, 0, 2, 3, 31, 0, 2, 3, 32, 0, 2, 3, 33, 0, 7, 3, 34, 0, 7, 3, 35, 0, 7, 3, 36, 0, 7, 3, 37,
- 0, 2, 3, 38, 0, 2, 3, 39, 0, 2, 3, 40, 0, 2, 3, 41, 0, 7, 3, 42, 0, 7, 3, 43, 0, 29, 0, 54, 0, 42, 1, 11,
- 0, 32, 0, 93, 0,123, 0, 16, 0, 2, 3, 44, 0, 2, 3, 45, 0, 2, 3, 46, 0, 2, 0, 19, 0, 2, 3, 47, 0, 2, 3, 48,
- 0, 2, 3, 49, 0, 2, 3, 50, 0, 2, 3, 51, 0, 2, 3, 52, 0, 2, 3, 53, 0, 2, 3, 54, 0, 4, 3, 55, 0, 7, 3, 56,
- 0, 7, 3, 57, 0, 7, 3, 58, 0,124, 0, 8, 0,124, 0, 0, 0,124, 0, 1, 0, 4, 2,112, 0, 4, 3, 59, 0, 4, 0, 19,
- 0, 2, 3, 60, 0, 2, 3, 61, 0, 43, 0,133, 0,125, 0, 13, 0, 9, 3, 62, 0, 9, 3, 63, 0, 4, 3, 64, 0, 4, 3, 65,
- 0, 4, 3, 66, 0, 4, 3, 67, 0, 4, 3, 68, 0, 4, 3, 69, 0, 4, 3, 70, 0, 4, 3, 71, 0, 4, 3, 72, 0, 4, 0, 15,
- 0, 0, 3, 73, 0,126, 0, 5, 0, 9, 3, 74, 0, 9, 3, 75, 0, 4, 3, 76, 0, 4, 1, 91, 0, 0, 3, 77, 0,127, 0, 12,
- 0, 4, 0, 17, 0, 4, 3, 78, 0, 4, 3, 79, 0, 4, 3, 80, 0, 4, 3, 81, 0, 4, 3, 82, 0, 4, 0, 66, 0, 4, 3, 83,
- 0, 4, 3, 84, 0, 4, 3, 85, 0, 4, 3, 86, 0, 4, 3, 87, 0,128, 0, 4, 0, 4, 3, 88, 0, 7, 3, 89, 0, 2, 0, 19,
- 0, 2, 3, 90, 0,129, 0, 9, 0,129, 0, 0, 0,129, 0, 1, 0, 0, 0, 16, 0, 53, 3, 91, 0, 55, 3, 92, 0, 4, 2,112,
- 0, 4, 3, 93, 0, 4, 3, 94, 0, 4, 3, 95, 0,130, 0, 95, 0,125, 3, 96, 0,126, 3, 97, 0,127, 3, 98, 0, 4, 3, 99,
- 0, 4, 0, 99, 0, 4, 2,199, 0, 4, 3,100, 0, 4, 3,101, 0, 2, 0, 19, 0, 2, 3,102, 0, 7, 2,129, 0, 7, 3,103,
- 0, 7, 3,104, 0, 7, 3,105, 0, 7, 3,106, 0, 7, 3,107, 0, 2, 3,108, 0, 2, 3,109, 0, 2, 3,110, 0, 2, 3,111,
- 0, 2, 0,178, 0, 2, 3,112, 0, 2, 3,113, 0, 2, 3,114, 0, 2, 3,115, 0, 2, 3,116, 0, 2, 0,242, 0, 2, 0, 77,
- 0, 2, 3,117, 0, 2, 3,118, 0, 2, 3,119, 0, 2, 3,120, 0, 2, 3,121, 0, 2, 3,122, 0, 2, 3,123, 0, 2, 3,124,
- 0, 2, 3,125, 0, 2, 3,126, 0, 2, 3,127, 0, 2, 0,243, 0, 2, 3,128, 0, 2, 3,129, 0, 4, 0,227, 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, 23, 3,137, 0, 23, 3,138,
- 0, 22, 3,139, 0, 11, 3,140, 0, 2, 3,141, 0, 2, 0, 15, 0, 4, 1, 91, 0, 7, 3,142, 0, 7, 3,143, 0, 2, 3,144,
- 0, 2, 3,145, 0, 2, 3,146, 0, 2, 3,147, 0, 2, 3,148, 0, 2, 3,149, 0, 2, 3,150, 0, 2, 3,151, 0, 2, 3,152,
- 0, 2, 3,153, 0, 2, 3,154, 0, 2, 3,155, 0, 2, 3,156, 0, 2, 3,157, 0, 4, 3,158, 0, 4, 3,159, 0, 4, 3,160,
- 0, 4, 3,161, 0, 4, 3,162, 0, 7, 3,163, 0, 4, 3,164, 0, 4, 3,165, 0, 4, 3,166, 0, 4, 3,167, 0, 7, 3,168,
- 0, 7, 3,169, 0, 7, 3,170, 0, 7, 3,171, 0, 7, 3,172, 0, 7, 3,173, 0, 7, 3,174, 0, 7, 3,175, 0, 7, 3,176,
- 0, 0, 3,177, 0, 0, 3,178, 0, 0, 3,179, 0,131, 0, 5, 0, 7, 3,180, 0, 0, 0, 17, 0, 0, 0, 80, 0, 0, 1, 91,
- 0, 0, 1, 80, 0,132, 0, 5, 0,132, 0, 0, 0,132, 0, 1, 0, 4, 3,181, 0, 0, 3,182, 0, 4, 0, 19, 0,133, 0, 4,
- 0,134, 3,183, 0, 2, 0, 19, 0, 2, 3,184, 0, 4, 1, 80, 0,135, 0, 26, 0, 2, 3,185, 0, 2, 3,186, 0, 7, 3,187,
- 0, 7, 3,188, 0, 2, 3,189, 0, 2, 3,190, 0, 7, 3,191, 0, 7, 3,192, 0, 2, 3,193, 0, 2, 3,194, 0, 2, 3,195,
- 0, 2, 3,196, 0, 7, 3,197, 0, 7, 3,198, 0, 2, 3,199, 0, 2, 3,200, 0, 2, 3,201, 0, 2, 1, 91, 0, 7, 3,202,
- 0,133, 3,203, 0, 7, 3,204, 0, 0, 3,205, 0, 0, 3,206, 0, 0, 3,207, 0, 0, 1, 80, 0, 4, 2,163, 0,136, 0, 6,
- 0, 2, 0, 77, 0, 0, 2, 40, 0, 0, 3,208, 0, 0, 3,209, 0, 0, 3,210, 0, 0, 1,250, 0,137, 0, 20, 0,138, 3,211,
- 0, 42, 1, 11, 0,136, 3,212, 0,136, 3,213, 0,136, 3,214, 0,136, 3,215, 0,136, 3,216, 0,136, 3,217, 0, 2, 3,218,
- 0, 2, 0,253, 0, 2, 3,219, 0, 2, 1,168, 0, 0, 3,220, 0, 0, 3,221, 0, 0, 3,222, 0, 0, 3,223, 0, 0, 3,224,
- 0, 0, 3,225, 0, 0, 3,226, 0, 0, 3,227, 0,139, 0, 37, 0, 26, 0, 30, 0, 43, 3,228, 0,122, 3,229, 0,139, 3,230,
- 0, 39, 0,170, 0, 11, 3,231, 0,124, 3,232, 0, 7, 3,233, 0, 7, 3,234, 0, 7, 3,235, 0, 7, 3,236, 0, 4, 2,112,
- 0, 7, 3,237, 0, 2, 3,238, 0, 2, 3,239, 0, 2, 3,240, 0, 2, 1, 61, 0, 54, 1, 83, 0, 9, 3,241, 0,123, 3,242,
- 0, 9, 1,214, 0,131, 3,243, 0,135, 3,244, 0,130, 0,144, 0,128, 3,245, 0, 32, 0, 93, 0, 11, 3,246, 0, 2, 3,247,
- 0, 2, 0, 80, 0, 2, 1, 91, 0, 2, 1, 80, 0,140, 3,248, 0, 2, 3,249, 0, 2, 3,250, 0, 2, 2,163, 0, 2, 0,179,
- 0,137, 3,251, 0,141, 0, 9, 0, 39, 0,170, 0, 38, 0,217, 0, 7, 1,175, 0, 7, 1,176, 0, 7, 0, 77, 0, 7, 3,252,
- 0, 7, 3,253, 0, 2, 3,254, 0, 2, 3,255, 0,142, 0, 68, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1,
- 0,144, 4, 2, 0, 2, 4, 3, 0, 7, 4, 4, 0, 7, 4, 5, 0, 7, 4, 6, 0, 7, 4, 7, 0, 7, 4, 8, 0, 7, 4, 9,
- 0, 7, 4, 10, 0, 7, 0,230, 0, 7, 4, 11, 0, 7, 4, 12, 0, 2, 4, 13, 0, 2, 3,210, 0, 43, 3,228, 0, 43, 4, 14,
- 0,141, 4, 15, 0,142, 4, 16, 0,145, 4, 17, 0,146, 4, 18, 0,147, 4, 19, 0, 0, 4, 20, 0, 2, 3, 46, 0, 2, 4, 21,
- 0, 4, 2,112, 0, 4, 4, 22, 0, 2, 4, 23, 0, 2, 4, 24, 0, 2, 4, 25, 0, 0, 4, 26, 0, 0, 0, 80, 0, 7, 0, 83,
- 0, 7, 4, 27, 0, 7, 4, 28, 0, 7, 4, 29, 0, 7, 4, 30, 0, 7, 4, 31, 0, 7, 4, 32, 0, 7, 4, 33, 0, 7, 0,140,
- 0, 7, 3,233, 0, 2, 4, 34, 0, 2, 4, 35, 0, 2, 4, 36, 0, 2, 4, 37, 0, 2, 0,106, 0, 2, 3,219, 0, 2, 4, 38,
- 0, 2, 4, 39, 0, 2, 4, 40, 0, 2, 4, 41, 0, 7, 4, 42, 0, 7, 4, 43, 0, 59, 4, 44, 0, 11, 4, 45, 0, 2, 4, 46,
- 0, 2, 1,231, 0, 2, 4, 47, 0, 2, 0, 19, 0, 2, 4, 48, 0, 2, 4, 49, 0, 2, 4, 50, 0, 2, 1, 91, 0, 9, 4, 51,
- 0,148, 0, 16, 0, 23, 0, 35, 0, 23, 0, 38, 0, 22, 4, 52, 0, 22, 4, 53, 0, 22, 4, 54, 0, 7, 4, 55, 0, 7, 4, 56,
- 0, 7, 4, 57, 0, 7, 4, 58, 0, 2, 4, 59, 0, 2, 4, 60, 0, 2, 4, 61, 0, 2, 4, 62, 0, 2, 4, 63, 0, 2, 4, 64,
- 0, 4, 0, 19, 0,143, 0, 6, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0, 2, 4, 3,
- 0,149, 0, 6, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0, 2, 4, 3, 0,150, 0, 26,
- 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0, 2, 4, 3, 0, 4, 4, 65, 0, 4, 1, 91,
- 0,148, 4, 66, 0, 9, 4, 67, 0, 11, 4, 68, 0, 29, 0, 54, 0, 26, 0, 55, 0, 0, 4, 69, 0, 0, 4, 70, 0, 2, 4, 71,
- 0, 2, 4, 72, 0, 2, 4, 73, 0, 2, 4, 74, 0, 2, 0, 40, 0, 2, 0, 39, 0, 2, 0,106, 0, 2, 4, 75, 0, 4, 0, 19,
- 0, 7, 4, 76, 0, 23, 0, 35, 0,151, 0, 29, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2,
- 0,145, 4, 17, 0, 2, 4, 3, 0, 2, 4, 77, 0, 2, 4, 78, 0, 2, 4, 79, 0, 2, 4, 80, 0,148, 4, 66, 0, 2, 4, 81,
- 0, 2, 0,106, 0, 2, 4, 72, 0, 2, 4, 82, 0, 9, 4, 83, 0, 2, 3,219, 0, 0, 4, 84, 0, 0, 4, 85, 0, 2, 4, 86,
- 0, 2, 4, 87, 0, 2, 2,121, 0, 2, 4, 88, 0, 2, 4, 89, 0, 0, 0, 15, 0, 0, 0, 19, 0, 0, 0,253, 0, 0, 4, 90,
- 0,152, 0, 15, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0, 2, 4, 3, 0,148, 4, 66,
- 0, 7, 1,175, 0, 7, 1,176, 0, 2, 4, 81, 0, 2, 3,252, 0, 2, 4, 91, 0, 2, 1, 91, 0, 4, 0, 19, 0, 4, 0, 15,
- 0,153, 0, 29, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0, 2, 4, 3, 0,154, 4, 92,
- 0, 4, 4, 93, 0, 0, 4, 94, 0, 0, 4, 95, 0, 0, 4, 96, 0, 2, 0, 17, 0, 2, 4, 97, 0, 2, 0, 19, 0, 2, 4, 98,
- 0, 2, 4, 99, 0, 2, 4,100, 0,155, 4,101, 0, 2, 4,102, 0, 2, 4,103, 0, 2, 4,104, 0, 2, 0,169, 0, 9, 4,105,
- 0, 9, 4,106, 0, 9, 4,107, 0, 9, 4,108, 0, 9, 4,109, 0, 2, 4,110, 0, 0, 4,111, 0,156, 0, 23, 0,143, 0, 0,
- 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0, 2, 4, 3, 0,148, 4, 66, 0, 11, 4,112, 0, 2, 4, 72,
- 0, 2, 4,113, 0, 2, 0, 19, 0, 2, 1,199, 0, 9, 4, 83, 0, 11, 4,114, 0,157, 4,115, 0, 0, 4,116, 0,158, 4,117,
- 0, 4, 4,118, 0, 4, 4,119, 0, 2, 0, 17, 0, 2, 4,120, 0, 2, 4,121, 0, 2, 4,122, 0,159, 0, 27, 0,143, 0, 0,
- 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0, 2, 4, 3, 0,148, 4, 66, 0, 39, 2, 47, 0, 38, 0,217,
- 0,160, 4,123, 0, 2, 0,227, 0, 2, 0,106, 0, 2, 4,124, 0, 2, 4,125, 0, 4, 0, 19, 0, 2, 4,126, 0, 2, 4, 75,
- 0, 2, 4,127, 0, 2, 1, 91, 0, 7, 3,252, 0, 7, 1,175, 0, 7, 1,176, 0, 7, 4,128, 0, 7, 4,129, 0, 0, 4,130,
- 0, 0, 4,131, 0, 49, 4,132, 0,161, 0, 10, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2,
- 0, 2, 4, 3, 0, 2, 0,106, 0, 2, 4, 75, 0, 4, 0, 15, 0,148, 4, 66, 0,162, 0, 22, 0,143, 0, 0, 0,143, 0, 1,
- 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0, 2, 4, 3, 0, 34, 4,133, 0, 4, 4,134, 0, 4, 4,135, 0, 2, 0, 66,
- 0, 2, 0,106, 0, 4, 4,136, 0, 4, 4,137, 0, 4, 4,138, 0, 4, 4,139, 0, 4, 4,140, 0, 4, 4,141, 0, 4, 4,142,
- 0, 4, 4,143, 0, 7, 4,144, 0, 22, 4,145, 0, 22, 4,146, 0,163, 0, 9, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0,
- 0, 7, 4, 1, 0,144, 4, 2, 0,164, 4,147, 0, 4, 1, 91, 0, 2, 0, 66, 0, 2, 0,106, 0,165, 0, 8, 0,143, 0, 0,
- 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0,148, 4, 66, 0, 4, 0, 19, 0, 4, 4,148, 0,166, 0, 18,
- 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2, 0,148, 4, 66, 0, 26, 4,149, 0, 26, 0, 55,
- 0, 2, 0, 19, 0, 2, 0,106, 0, 7, 4,150, 0, 9, 4,151, 0, 7, 1,175, 0, 7, 1,176, 0, 54, 1, 83, 0, 54, 4,152,
- 0, 4, 4,153, 0, 4, 0, 15, 0,167, 0, 81, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2,
- 0, 0, 4,154, 0, 4, 4,155, 0, 2, 0,227, 0, 2, 4,156, 0, 2, 4,157, 0, 2, 4,158, 0, 2, 4,159, 0, 2, 4,160,
- 0, 2, 4,161, 0, 2, 4,162, 0, 2, 4,163, 0, 2, 4,164, 0, 2, 4,165, 0, 2, 4,166, 0, 2, 4,167, 0, 2, 4,168,
- 0, 2, 4,169, 0, 2, 4,170, 0, 2, 4,171, 0, 2, 4,172, 0, 2, 4,173, 0, 2, 4,174, 0, 2, 4,175, 0, 2, 4,176,
- 0, 2, 4,177, 0, 2, 4,178, 0, 2, 4,179, 0, 2, 4,180, 0, 2, 4,181, 0, 2, 4,182, 0, 2, 4,183, 0, 2, 4,184,
- 0, 2, 4,185, 0, 2, 4,186, 0, 2, 4,187, 0, 2, 4,188, 0, 2, 4,189, 0, 2, 4,190, 0, 2, 4,191, 0, 2, 4,192,
- 0, 2, 4,193, 0, 2, 4,194, 0, 2, 4,195, 0, 2, 4,196, 0, 2, 4,197, 0, 2, 4,198, 0, 2, 4,199, 0, 2, 4,200,
- 0, 2, 4,201, 0, 2, 4,202, 0, 0, 4,203, 0, 0, 4,204, 0, 0, 4,205, 0, 0, 4,206, 0,168, 4,207, 0,168, 4,208,
- 0, 4, 4,209, 0, 4, 4,210, 0, 4, 4,211, 0, 4, 4,212, 0, 4, 4,213, 0, 7, 4,214, 0, 7, 4,215, 0, 7, 4,216,
- 0, 2, 4,217, 0, 2, 4,218, 0, 2, 4,219, 0, 2, 4,220, 0,169, 4,221, 0,169, 4,222, 0, 2, 4,223, 0, 2, 4,224,
- 0, 4, 1, 91, 0, 49, 4,225, 0, 9, 4,105, 0, 9, 4,108, 0,170, 0, 20, 0, 0, 4,226, 0, 0, 4,227, 0, 0, 4,228,
- 0, 0, 4,229, 0, 0, 4,230, 0, 0, 4,231, 0, 0, 4,232, 0, 0, 4,233, 0, 0, 4,234, 0, 0, 4,235, 0, 0, 4,236,
- 0, 0, 4,237, 0, 0, 4,238, 0, 0, 4,239, 0, 0, 4,240, 0, 0, 4,241, 0, 0, 4,242, 0, 0, 4,243, 0, 0, 3, 90,
- 0, 0, 4,244, 0,171, 0, 48, 0, 0, 4,245, 0, 0, 4,236, 0, 0, 4,237, 0, 0, 4,246, 0, 0, 4,247, 0, 0, 4,248,
- 0, 0, 4,249, 0, 0, 4,250, 0, 0, 4,251, 0, 0, 4,252, 0, 0, 4,253, 0, 0, 4,254, 0, 0, 4,255, 0, 0, 5, 0,
- 0, 0, 5, 1, 0, 0, 5, 2, 0, 0, 5, 3, 0, 0, 5, 4, 0, 0, 5, 5, 0, 0, 5, 6, 0, 0, 5, 7, 0, 0, 5, 8,
- 0, 0, 5, 9, 0, 0, 5, 10, 0, 0, 5, 11, 0, 0, 5, 12, 0, 0, 5, 13, 0, 0, 5, 14, 0, 0, 5, 15, 0, 0, 5, 16,
- 0, 0, 5, 17, 0, 0, 5, 18, 0, 0, 5, 19, 0, 0, 5, 20, 0, 0, 5, 21, 0, 0, 5, 22, 0, 0, 5, 23, 0, 0, 5, 24,
- 0, 0, 5, 25, 0, 0, 5, 26, 0, 0, 5, 27, 0, 0, 5, 28, 0, 0, 5, 29, 0, 0, 5, 30, 0, 0, 5, 31, 0, 0, 5, 32,
- 0, 0, 5, 33, 0, 0, 5, 34, 0,172, 0, 21, 0,172, 0, 0, 0,172, 0, 1, 0, 0, 0, 16, 0,170, 5, 35, 0,171, 5, 36,
- 0,171, 5, 37, 0,171, 5, 38, 0,171, 5, 39, 0,171, 5, 40, 0,171, 5, 41, 0,171, 5, 42, 0,171, 5, 43, 0,171, 5, 44,
- 0,171, 5, 45, 0,171, 5, 46, 0,171, 5, 47, 0,171, 5, 48, 0,171, 5, 49, 0,171, 5, 50, 0, 0, 5, 51, 0, 0, 5, 34,
- 0,173, 0, 5, 0, 4, 0, 19, 0, 4, 0, 15, 0, 7, 1,230, 0, 7, 5, 52, 0, 7, 1,137, 0,174, 0, 50, 0, 4, 0, 19,
- 0, 4, 5, 53, 0, 4, 5, 54, 0, 0, 5, 55, 0, 0, 5, 56, 0, 0, 5, 57, 0, 0, 5, 58, 0, 0, 5, 59, 0, 0, 5, 60,
- 0, 0, 5, 61, 0, 0, 5, 62, 0, 0, 5, 63, 0, 2, 5, 64, 0, 2, 5, 65, 0, 4, 5, 66, 0, 4, 5, 67, 0, 4, 5, 68,
- 0, 4, 5, 69, 0, 2, 5, 70, 0, 2, 5, 71, 0, 2, 5, 72, 0, 2, 5, 73, 0, 4, 5, 74, 0, 4, 5, 75, 0, 2, 5, 76,
- 0, 2, 5, 77, 0, 2, 5, 78, 0, 2, 5, 79, 0, 0, 5, 80, 0, 11, 5, 81, 0, 2, 5, 82, 0, 2, 5, 83, 0, 2, 5, 84,
- 0, 2, 5, 85, 0,173, 5, 86, 0, 2, 5, 87, 0, 2, 5, 88, 0, 2, 5, 89, 0, 2, 5, 90, 0, 4, 5, 91, 0, 4, 5, 92,
- 0, 4, 5, 93, 0, 2, 5, 94, 0, 2, 5, 95, 0, 2, 5, 96, 0, 2, 5, 97, 0, 2, 5, 98, 0, 0, 5, 99, 0, 0, 5,100,
- 0, 2, 0, 15, 0,175, 0, 18, 0, 26, 0, 30, 0, 11, 5,101, 0, 11, 5,102, 0, 11, 5,103, 0,139, 5,104, 0, 2, 2, 54,
- 0, 2, 5,105, 0, 2, 2, 55, 0, 2, 5,106, 0, 2, 5,107, 0, 2, 5,108, 0, 2, 5,109, 0, 2, 5,110, 0, 2, 5,111,
- 0, 2, 0, 15, 0, 2, 5,112, 0, 2, 5,113, 0, 2, 5,114, 0,176, 0, 5, 0,176, 0, 0, 0,176, 0, 1, 0,176, 5,115,
- 0, 12, 5,116, 0, 4, 0, 19, 0,177, 0, 7, 0,177, 0, 0, 0,177, 0, 1, 0,176, 5,117, 0,176, 5,118, 0, 2, 3,138,
- 0, 2, 0, 19, 0, 4, 0, 15, 0,178, 0, 17, 0,178, 0, 0, 0,178, 0, 1, 0, 0, 5,119, 0, 0, 5,120, 0, 0, 5,121,
- 0, 2, 5,122, 0, 2, 5,123, 0, 2, 5,107, 0, 2, 5,108, 0, 2, 0, 19, 0, 2, 2,169, 0, 2, 5,124, 0, 2, 5,125,
- 0, 2, 5,126, 0, 2, 5,127, 0, 4, 5,128, 0,178, 5,129, 0,144, 0, 30, 0,144, 0, 0, 0,144, 0, 1, 0,176, 5,117,
- 0,176, 5,118, 0,176, 5,130, 0,176, 5,131, 0,175, 5,132, 0, 7, 5,133, 0, 22, 1,194, 0, 22, 5,134, 0, 22, 5,135,
- 0, 2, 5,136, 0, 2, 5,137, 0, 2, 5,138, 0, 0, 4, 0, 0, 0, 5,139, 0, 2, 5,140, 0, 2, 5,141, 0, 0, 5,142,
- 0, 0, 5,143, 0, 0, 5,144, 0, 0, 5,145, 0, 2, 5,146, 0, 2, 5,147, 0, 2, 5,148, 0, 2, 0, 19, 0, 32, 0, 93,
- 0, 11, 5,149, 0, 11, 5,150, 0, 11, 5,151, 0,179, 0, 11, 0, 0, 5,152, 0, 2, 5,153, 0, 2, 5,154, 0, 2, 5,155,
- 0, 2, 5,156, 0, 2, 5,157, 0, 2, 3,124, 0, 9, 5,158, 0, 9, 5,159, 0, 4, 5,160, 0, 4, 5,161, 0,180, 0, 8,
- 0, 0, 5,162, 0, 49, 5,163, 0,180, 5,164, 0,180, 5,165, 0,180, 5,166, 0, 2, 0,102, 0, 2, 0, 15, 0, 4, 5,167,
- 0,181, 0, 10, 0,181, 0, 0, 0,181, 0, 1, 0, 4, 1,199, 0, 4, 0, 21, 0, 4, 0, 27, 0, 4, 5,168, 0,180, 5,169,
- 0, 0, 4, 95, 0, 4, 5,170, 0, 4, 5,171, 0,182, 0, 12, 0, 0, 1,100, 0, 9, 0,155, 0, 0, 0,156, 0, 4, 0,159,
- 0, 4, 0,167, 0, 9, 0,160, 0, 7, 0,162, 0, 7, 0,163, 0, 9, 5,172, 0, 9, 5,173, 0, 9, 0,164, 0, 9, 0,166,
- 0,183, 0, 41, 0,183, 0, 0, 0,183, 0, 1, 0,183, 5,174, 0, 9, 0, 25, 0, 0, 0, 26, 0, 2, 0, 19, 0, 2, 0, 17,
- 0, 4, 0, 21, 0, 4, 2, 24, 0, 4, 5,175, 0, 4, 5,176, 0, 4, 5,177, 0, 4, 5,178, 0, 4, 5,179, 0, 4, 0,178,
- 0, 4, 5,180, 0, 4, 5,181, 0, 7, 5,182, 0, 7, 5,183, 0, 4, 0, 99, 0,181, 5,184, 0,180, 5,185, 0, 29, 0, 54,
- 0,139, 5,104, 0, 40, 0,108, 0, 7, 5,186, 0, 7, 5,187, 0,182, 0,218, 0,183, 5,188, 0,183, 5,189, 0,183, 5,190,
- 0, 11, 5,191, 0,184, 5,192, 0,185, 5,193, 0, 7, 5,194, 0, 7, 5,195, 0, 4, 5,196, 0, 7, 5,197, 0, 9, 5,198,
- 0, 4, 5,199, 0, 4, 0, 15, 0,186, 0, 4, 0,186, 0, 0, 0,186, 0, 1, 0, 11, 5,200, 0,183, 5,201, 0,187, 0, 6,
- 0, 11, 5,202, 0, 11, 5,191, 0, 11, 5,203, 0, 2, 0, 19, 0, 2, 0, 15, 0, 4, 1,199, 0,188, 0, 4, 0, 7, 5,204,
- 0, 7, 5,205, 0, 2, 5,206, 0, 2, 5,207, 0,189, 0, 6, 0, 7, 5,208, 0, 7, 5,209, 0, 7, 5,210, 0, 7, 5,211,
- 0, 4, 5,212, 0, 4, 5,213, 0,190, 0, 10, 0, 7, 5,214, 0, 7, 5,215, 0, 7, 5,216, 0, 7, 5,217, 0, 7, 5,218,
- 0, 7, 5,219, 0, 7, 5,220, 0, 7, 5,221, 0, 7, 5,222, 0, 7, 5,223, 0,191, 0, 2, 0, 7, 3,180, 0, 7, 0, 15,
- 0,192, 0, 5, 0, 7, 5,224, 0, 7, 5,225, 0, 4, 0, 66, 0, 4, 2, 25, 0, 4, 0, 15, 0,193, 0, 6, 0,193, 0, 0,
- 0,193, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 5,226, 0, 2, 1,199, 0,194, 0, 8, 0,194, 0, 0, 0,194, 0, 1,
- 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 5,226, 0, 2, 1,199, 0, 7, 0, 21, 0, 7, 0, 99, 0,195, 0, 45, 0,195, 0, 0,
- 0,195, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 5,226, 0, 2, 0,174, 0, 2, 2,195, 0, 2, 5,227, 0, 7, 5,228,
- 0, 7, 5,229, 0, 7, 2, 61, 0, 4, 5,230, 0, 4, 0, 56, 0, 4, 2, 27, 0, 7, 5,231, 0, 7, 5,232, 0, 7, 5,233,
- 0, 7, 5,234, 0, 7, 5,235, 0, 7, 5,236, 0, 7, 2, 59, 0, 7, 0,216, 0, 7, 5,237, 0, 7, 5,238, 0, 7, 0, 15,
- 0, 7, 5,239, 0, 7, 5,240, 0, 7, 5,241, 0, 2, 5,242, 0, 2, 5,243, 0, 2, 5,244, 0, 2, 5,245, 0, 2, 5,246,
- 0, 2, 5,247, 0, 2, 5,248, 0, 2, 5,249, 0, 2, 4, 48, 0, 2, 5,250, 0, 2, 1,121, 0, 2, 5,251, 0, 0, 5,252,
- 0, 0, 5,253, 0, 7, 0,172, 0,196, 5,254, 0, 55, 1, 84, 0,197, 0, 16, 0,197, 0, 0, 0,197, 0, 1, 0, 2, 0, 17,
- 0, 2, 0, 19, 0, 2, 5,226, 0, 2, 0,174, 0, 7, 2, 54, 0, 7, 2, 55, 0, 7, 2, 56, 0, 7, 1,162, 0, 7, 2, 57,
- 0, 7, 2, 58, 0, 7, 5,255, 0, 7, 2, 59, 0, 7, 2, 60, 0, 7, 2, 61, 0,158, 0, 5, 0, 2, 0, 17, 0, 2, 5,167,
- 0, 2, 0, 19, 0, 2, 6, 0, 0, 26, 4,149, 0,157, 0, 3, 0, 4, 0, 44, 0, 4, 6, 1, 0,158, 0, 45, 0,198, 0, 12,
- 0,198, 0, 0, 0,198, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 2,137, 0, 2, 1,136, 0, 7, 0, 4, 0, 7, 0, 5,
- 0, 7, 6, 2, 0, 7, 6, 3, 0, 26, 4,149, 0, 11, 6, 4, 0,199, 0, 11, 0,199, 0, 0, 0,199, 0, 1, 0, 0, 0, 16,
- 0, 2, 0, 17, 0, 2, 6, 5, 0, 4, 0, 20, 0, 4, 6, 6, 0, 2, 0, 19, 0, 2, 0, 15, 0, 9, 6, 7, 0, 9, 6, 8,
- 0,200, 0, 5, 0, 0, 0, 16, 0, 7, 0,230, 0, 7, 6, 9, 0, 4, 6, 10, 0, 4, 0, 15, 0,201, 0, 4, 0, 2, 0, 17,
- 0, 2, 0, 19, 0, 2, 0, 80, 0, 2, 1, 91, 0,202, 0, 4, 0, 0, 0, 16, 0, 53, 6, 11, 0, 7, 0,230, 0, 7, 0, 15,
- 0,203, 0, 6, 0, 2, 6, 12, 0, 2, 6, 13, 0, 2, 0, 17, 0, 2, 6, 14, 0, 0, 6, 15, 0, 0, 6, 16, 0,204, 0, 5,
- 0, 4, 0, 17, 0, 4, 0, 15, 0, 0, 0, 16, 0, 0, 6, 17, 0, 0, 6, 18, 0,205, 0, 6, 0, 0, 0, 16, 0, 0, 6, 19,
- 0, 2, 6, 20, 0, 2, 2, 59, 0, 2, 0,227, 0, 2, 1, 91, 0,206, 0, 5, 0, 0, 0, 16, 0, 7, 5,205, 0, 7, 3, 11,
- 0, 2, 0, 19, 0, 2, 2, 36, 0,207, 0, 3, 0, 0, 0, 16, 0, 4, 2, 27, 0, 4, 6, 21, 0,208, 0, 7, 0, 0, 0, 16,
- 0, 7, 3, 11, 0, 0, 6, 22, 0, 0, 6, 23, 0, 2, 0,227, 0, 2, 0, 80, 0, 4, 6, 24, 0,209, 0, 3, 0, 43, 6, 25,
- 0, 0, 6, 26, 0, 0, 6, 27, 0,210, 0, 17, 0,210, 0, 0, 0,210, 0, 1, 0, 2, 0, 17, 0, 2, 6, 5, 0, 2, 0, 19,
- 0, 2, 6, 28, 0, 2, 6, 29, 0, 2, 6, 30, 0, 2, 0, 80, 0, 2, 1, 91, 0, 0, 0, 16, 0, 9, 0, 45, 0,211, 6, 31,
- 0, 43, 0,226, 0, 2, 6, 32, 0, 2, 6, 33, 0, 4, 0, 15, 0,212, 0, 10, 0, 0, 0, 16, 0, 2, 0, 17, 0, 2, 0, 15,
- 0, 4, 2, 36, 0, 4, 6, 34, 0, 4, 6, 35, 0, 4, 6, 36, 0, 4, 6, 37, 0, 4, 6, 38, 0, 4, 6, 39, 0,213, 0, 1,
- 0, 0, 6, 40, 0,214, 0, 1, 0, 34, 4,133, 0,211, 0, 18, 0,211, 0, 0, 0,211, 0, 1, 0,211, 6, 41, 0, 2, 0, 17,
- 0, 2, 0, 19, 0, 2, 6, 42, 0, 2, 6, 30, 0, 2, 6, 5, 0, 2, 6, 43, 0, 2, 1, 91, 0, 2, 1, 80, 0, 0, 0, 16,
- 0, 9, 0, 45, 0,215, 6, 31, 0,210, 6, 44, 0, 2, 0, 14, 0, 2, 6, 45, 0, 4, 2,214, 0,216, 0, 3, 0, 4, 6, 46,
- 0, 4, 0, 15, 0, 43, 0,226, 0,217, 0, 10, 0,111, 6, 47, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 5,228, 0, 4, 5,229,
- 0, 0, 0, 16, 0, 4, 6, 48, 0, 2, 6, 49, 0, 2, 6, 50, 0, 7, 6, 51, 0,218, 0, 10, 0, 2, 0, 19, 0, 2, 6, 52,
- 0, 4, 5,228, 0, 4, 5,229, 0, 2, 6, 53, 0,184, 5,192, 0, 2, 0, 17, 0, 2, 6, 54, 0, 2, 6, 55, 0, 2, 6, 56,
- 0,219, 0, 7, 0, 2, 0, 19, 0, 2, 6, 52, 0, 4, 5,228, 0, 4, 5,229, 0, 2, 0, 17, 0, 2, 6, 57, 0, 7, 6, 58,
- 0,220, 0, 9, 0, 4, 6, 46, 0, 2, 0, 17, 0, 2, 0, 19, 0, 43, 0,226, 0, 70, 6, 59, 0, 0, 0, 16, 0, 7, 6, 60,
- 0, 2, 6, 61, 0, 2, 0, 15, 0,221, 0, 5, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 15, 0,139, 5,104, 0, 43, 3,228,
- 0,222, 0, 5, 0, 4, 0, 19, 0, 4, 0, 17, 0, 0, 0, 16, 0, 0, 6, 17, 0, 43, 0,226, 0,223, 0, 10, 0, 4, 0, 19,
- 0, 4, 0, 17, 0, 7, 6, 62, 0, 7, 6, 63, 0, 7, 0,221, 0, 7, 0,222, 0, 7, 2,106, 0, 7, 2,109, 0, 7, 6, 64,
- 0, 7, 6, 65, 0,224, 0, 9, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 5,228, 0, 4, 5,229, 0, 0, 0, 16, 0, 2, 0, 80,
- 0, 2, 0, 38, 0, 2, 6, 66, 0, 2, 6, 67, 0,225, 0, 8, 0, 43, 0,226, 0, 7, 2, 56, 0, 7, 6, 68, 0, 7, 2, 88,
- 0, 7, 6, 69, 0, 2, 0, 19, 0, 2, 2, 36, 0, 7, 6, 70, 0,226, 0, 7, 0, 2, 0, 19, 0, 2, 2, 59, 0, 7, 6, 71,
- 0, 7, 6, 72, 0, 7, 6, 73, 0, 7, 6, 74, 0, 7, 6, 75, 0,227, 0, 10, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 5,228,
- 0, 4, 5,229, 0, 0, 0, 16, 0, 2, 3, 90, 0, 2, 0, 38, 0, 2, 6, 66, 0, 2, 6, 67, 0, 55, 1, 84, 0,228, 0, 7,
- 0, 4, 2, 27, 0, 4, 6, 76, 0, 4, 6, 77, 0, 4, 6, 78, 0, 7, 6, 79, 0, 7, 6, 80, 0, 0, 6, 22, 0,229, 0, 7,
- 0, 0, 6, 81, 0, 43, 6, 82, 0, 0, 6, 26, 0, 2, 6, 83, 0, 2, 0, 80, 0, 4, 1, 91, 0, 0, 6, 27, 0,230, 0, 6,
- 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 5,228, 0, 4, 5,229, 0, 0, 6, 84, 0, 0, 6, 85, 0,231, 0, 1, 0, 4, 0, 19,
- 0,215, 0, 10, 0,215, 0, 0, 0,215, 0, 1, 0,215, 6, 41, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 6, 5, 0, 2, 6, 86,
- 0, 0, 0, 16, 0, 9, 0, 45, 0, 43, 0,226, 0,232, 0, 10, 0, 7, 2,130, 0, 7, 6, 87, 0, 7, 6, 88, 0, 7, 6, 89,
- 0, 7, 6, 90, 0, 4, 0, 19, 0, 7, 6, 91, 0, 7, 6, 92, 0, 7, 6, 93, 0, 7, 0, 15, 0,184, 0, 20, 0, 26, 0, 30,
- 0, 0, 0,154, 0,233, 6, 94, 0, 9, 6, 95, 0, 35, 0,120, 0, 35, 6, 96, 0, 9, 6, 97, 0, 29, 0, 54, 0, 7, 6, 58,
- 0, 7, 6, 98, 0, 7, 6, 99, 0, 7, 6,100, 0, 7, 6,101, 0, 7, 6,102, 0, 7, 6,103, 0, 4, 0, 66, 0, 4, 6,104,
- 0, 0, 6,105, 0, 0, 6,106, 0, 0, 6,107, 0,234, 0, 6, 0, 26, 0, 30, 0, 7, 6,108, 0, 7, 6,109, 0, 7, 6,110,
- 0, 2, 6,111, 0, 2, 6,112, 0,235, 0, 14, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1, 0,144, 4, 2,
- 0,148, 4, 66, 0,184, 5,192, 0, 2, 0,227, 0, 2, 6, 52, 0, 2, 1,175, 0, 2, 1,176, 0, 2, 0, 19, 0, 2, 4, 75,
- 0, 4, 1, 91, 0,236, 0, 6, 0,236, 0, 0, 0,236, 0, 1, 0, 43, 0,226, 0, 9, 6,113, 0, 4, 0,179, 0, 4, 0, 15,
- 0, 55, 0, 4, 0, 26, 0, 30, 0, 11, 6,114, 0, 4, 0,104, 0, 4, 0, 15, 0,237, 0, 25, 0,237, 0, 0, 0,237, 0, 1,
- 0,237, 0, 36, 0, 11, 6,115, 0, 0, 0, 16, 0, 7, 6,116, 0, 7, 6,117, 0, 7, 6,118, 0, 7, 6,119, 0, 4, 0, 19,
- 0, 7, 6,120, 0, 7, 6,121, 0, 7, 6,122, 0, 7, 0,230, 0, 7, 1,129, 0, 7, 6,123, 0, 7, 2, 25, 0, 7, 6,124,
- 0, 7, 6,125, 0, 7, 6,126, 0, 7, 6,127, 0, 7, 6,128, 0, 7, 0,141, 0, 2, 0,104, 0, 2, 3,193, 0,238, 0, 17,
- 0, 26, 0, 30, 0, 11, 6,129, 0, 11, 6,130, 0, 4, 0, 19, 0, 4, 3, 46, 0, 2, 2, 62, 0, 2, 6,131, 0, 2, 0,104,
- 0, 2, 6,132, 0, 2, 6,133, 0, 2, 6,134, 0, 2, 6,135, 0, 2, 6,136, 0, 4, 6,137, 0, 4, 6,138, 0, 4, 6,139,
- 0, 4, 6,140, 0,239, 0, 31, 0,239, 0, 0, 0,239, 0, 1, 0, 11, 2,153, 0, 0, 0, 16, 0, 2, 0, 19, 0, 2, 6,141,
- 0, 2, 6,142, 0, 2, 6,143, 0, 2, 2,119, 0, 2, 1, 91, 0, 4, 1,160, 0, 4, 6,139, 0, 4, 6,140, 0,237, 6,144,
- 0,239, 0, 36, 0,239, 6,145, 0, 11, 6,146, 0, 9, 6,147, 0, 7, 0,221, 0, 7, 0,141, 0, 7, 1,111, 0, 7, 6,148,
- 0, 7, 6,149, 0, 7, 6,150, 0, 7, 6,151, 0, 7, 6,152, 0, 7, 6,153, 0, 7, 6,154, 0, 7, 6,155, 0, 7, 1,157,
- 0, 43, 6,156, 0,112, 0, 6, 0, 11, 6,157, 0, 2, 0, 19, 0, 2, 6,158, 0, 7, 2,129, 0, 7, 6,159, 0, 7, 6,160,
- 0,240, 0, 7, 0,240, 0, 0, 0,240, 0, 1, 0, 29, 0, 54, 0, 11, 2,102, 0, 4, 0, 19, 0, 0, 0, 16, 0, 4, 6,161,
- 0,111, 0, 2, 0, 26, 0, 30, 0, 11, 6,157, 0,241, 0, 15, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 4, 0, 0, 7, 4, 1,
- 0,144, 4, 2, 0, 2, 4, 3, 0,148, 4, 66, 0,111, 2,100, 0, 2, 0, 19, 0, 2, 6,162, 0, 2, 4, 72, 0, 2, 6,163,
- 0, 2, 4, 75, 0, 2, 6,164, 0, 7, 6,165, 0,242, 0, 5, 0,242, 0, 0, 0,242, 0, 1, 0, 29, 0, 54, 0, 2, 0, 19,
- 0, 0, 6,166, 0,243, 0, 8, 0,243, 0, 0, 0,243, 0, 1, 0, 9, 0, 45, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 6,161,
- 0, 0, 6,166, 0, 7, 6,167, 0,244, 0, 9, 0, 43, 6,168, 0, 2, 6,169, 0, 2, 0, 19, 0, 4, 6,170, 0, 0, 6,171,
- 0, 7, 1,129, 0, 7, 6,172, 0, 7, 6,173, 0, 4, 0, 15, 0,245, 0, 6, 0, 43, 6,168, 0, 4, 6,161, 0, 4, 6,174,
- 0, 4, 0, 66, 0, 4, 0, 15, 0, 0, 6,171, 0,246, 0, 4, 0, 43, 6,168, 0, 4, 0, 19, 0, 4, 6,161, 0, 0, 6,171,
- 0,247, 0, 4, 0, 43, 6,168, 0, 4, 0, 19, 0, 4, 6,161, 0, 0, 6,171, 0,248, 0, 10, 0, 43, 6,168, 0, 4, 6,175,
- 0, 7, 0, 98, 0, 4, 0, 19, 0, 2, 6,176, 0, 2, 6,177, 0, 2, 0, 80, 0, 2, 1, 91, 0, 7, 6,178, 0, 0, 6,171,
- 0,249, 0, 4, 0, 43, 6,168, 0, 4, 0, 19, 0, 4, 6,161, 0, 0, 6,171, 0,250, 0, 10, 0, 43, 6,168, 0, 2, 0, 17,
- 0, 2, 2,201, 0, 4, 2, 24, 0, 4, 5,229, 0, 7, 6, 68, 0, 7, 2, 88, 0, 4, 0, 15, 0,111, 6, 47, 0, 0, 6,171,
- 0,251, 0, 4, 0, 43, 6,168, 0, 4, 2,116, 0, 4, 6,179, 0, 0, 6,171, 0,252, 0, 5, 0, 43, 6,168, 0, 7, 0, 98,
- 0, 4, 6,180, 0, 4, 2,116, 0, 4, 2,117, 0,253, 0, 6, 0, 43, 6,168, 0, 0, 6,171, 0, 7, 0, 80, 0, 7, 1, 91,
- 0, 7, 6,103, 0, 7, 2, 30, 0,254, 0, 6, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 6,181,
- 0, 7, 6,182, 0,255, 0, 6, 0, 43, 6,168, 0, 4, 6,183, 0, 4, 6,184, 0, 7, 6,185, 0, 7, 6,186, 0, 0, 6,171,
- 1, 0, 0, 8, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 6,181, 0, 7, 6,182, 0, 2, 0, 19,
- 0, 2, 4, 48, 1, 1, 0, 8, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 6,181, 0, 7, 6,182,
- 0, 2, 0, 19, 0, 2, 0, 80, 1, 2, 0, 8, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 6,181,
- 0, 7, 6,182, 0, 2, 0, 19, 0, 2, 0, 80, 1, 3, 0, 16, 0, 43, 6,168, 0, 43, 6,145, 0, 4, 0, 17, 0, 7, 6,187,
- 0, 7, 6,188, 0, 7, 6,189, 0, 7, 6,190, 0, 7, 6,191, 0, 7, 6,192, 0, 7, 6,193, 0, 7, 6,194, 0, 7, 6,195,
- 0, 2, 0, 19, 0, 2, 0, 15, 0, 2, 0, 80, 0, 2, 1, 91, 1, 4, 0, 8, 1, 4, 0, 0, 1, 4, 0, 1, 0, 2, 0, 17,
- 0, 2, 0, 19, 0, 0, 6,196, 0, 2, 0, 15, 0, 2, 6,197, 0, 43, 0,226, 1, 5, 0, 22, 1, 5, 0, 0, 1, 5, 0, 1,
- 0, 2, 0, 19, 0, 2, 0,227, 0, 2, 6,198, 0, 2, 6,199, 0, 29, 0, 54, 0,111, 6, 47, 0, 43, 0,133, 0, 7, 2, 24,
- 0, 7, 5,229, 0, 7, 6,200, 0, 7, 6,201, 0, 7, 6,202, 0, 7, 1, 58, 0, 7, 6,203, 0, 7, 6,204, 0, 7, 6, 48,
- 0, 7, 6,205, 0, 0, 6,206, 0, 0, 6,207, 0, 11, 2,105, 1, 6, 0, 8, 0, 7, 1,137, 0, 7, 6, 68, 0, 7, 2, 88,
- 0, 9, 0, 45, 0, 2, 6,208, 0, 2, 6,209, 0, 2, 6,210, 0, 2, 6,211, 1, 7, 0, 17, 1, 7, 0, 0, 1, 7, 0, 1,
- 0, 0, 0, 16, 1, 6, 6,212, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 6,213, 0, 2, 6,214, 0, 2, 6,215, 0, 2, 6,216,
- 0, 4, 0, 80, 0, 7, 6,217, 0, 7, 6,218, 0, 4, 6,219, 0, 4, 6,220, 1, 7, 6,221, 1, 8, 6,222, 1, 9, 0, 29,
- 1, 9, 0, 0, 1, 9, 0, 1, 1, 9, 6,223, 0, 0, 0, 16, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 5,168, 0, 2, 5,194,
- 0, 2, 6,224, 0, 2, 0,106, 0, 2, 6,214, 0, 2, 5,167, 0, 11, 6, 42, 0, 11, 6,225, 0, 26, 4,149, 0, 9, 6,226,
- 0, 7, 6,217, 0, 7, 6,218, 0, 7, 1,162, 0, 7, 6,227, 0, 2, 6,228, 0, 2, 6,229, 0, 2, 6,230, 0, 2, 6,231,
- 0, 23, 6,232, 0, 23, 6,233, 0, 23, 6,234, 1, 10, 0,121, 1, 11, 6,235, 1, 8, 0, 6, 1, 8, 0, 0, 1, 8, 0, 1,
- 1, 9, 6,236, 1, 9, 6,237, 1, 7, 6,238, 1, 7, 6,221, 0, 54, 0, 13, 0, 26, 0, 30, 0, 11, 6,239, 0, 11, 6,240,
- 1, 6, 6,241, 0, 4, 0, 17, 0, 4, 6,242, 0, 4, 6,243, 0, 4, 6,244, 1, 11, 6,245, 1, 11, 6,246, 0, 9, 6,247,
- 0, 9, 6,248, 0, 4, 6,249, 1, 12, 0, 6, 0, 4, 0, 97, 0, 4, 0, 99, 0, 4, 5,167, 0, 0, 6,250, 0, 0, 6,251,
- 0, 2, 0, 15, 1, 13, 0, 11, 0, 2, 5,107, 0, 2, 5,108, 0, 2, 6,252, 0, 2, 6, 88, 0, 2, 6,253, 0, 2, 0, 80,
- 0, 7, 6, 69, 0, 2, 0,242, 0, 0, 6,254, 0, 0, 3, 58, 0, 4, 1, 91, 1, 14, 0, 3, 0, 7, 6,255, 0, 7, 7, 0,
- 0, 7, 0, 14, 1, 15, 0, 7, 0, 0, 1,100, 0, 2, 3,126, 0, 2, 3,127, 0, 2, 3,128, 0, 2, 3, 78, 0, 4, 0, 99,
- 0, 4, 2,199, 1, 16, 0, 7, 0, 7, 7, 1, 0, 7, 7, 2, 0, 7, 7, 3, 0, 7, 1,171, 0, 7, 7, 4, 0, 7, 7, 5,
- 0, 7, 7, 6, 1, 17, 0, 2, 0, 0, 0,135, 0, 0, 7, 7, 1, 18, 0, 1, 0, 0, 0, 16, 1, 19, 0, 10, 0, 0, 7, 8,
- 0, 0, 7, 9, 0, 0, 7, 10, 0, 0, 7, 11, 0, 2, 6,252, 0, 2, 7, 12, 0, 7, 7, 13, 0, 7, 7, 14, 0, 7, 7, 15,
- 0, 7, 1,101, 1, 20, 0, 4, 0, 7, 0, 4, 0, 7, 0, 5, 0, 2, 0, 19, 0, 2, 7, 16, 1, 21, 0, 10, 0, 2, 2,181,
- 0, 2, 0, 19, 0, 7, 3, 11, 0, 7, 7, 17, 0, 7, 7, 18, 0, 7, 7, 19, 0, 7, 7, 20, 1, 20, 7, 21, 1, 20, 7, 22,
- 1, 20, 7, 23, 0,160, 0, 9, 0, 4, 0, 19, 0, 4, 0, 38, 0, 23, 7, 24, 0, 23, 7, 25, 1, 21, 7, 26, 0, 7, 7, 27,
- 0, 7, 7, 28, 0, 7, 7, 29, 0, 7, 1, 58, 1, 22, 0, 4, 0, 39, 2, 47, 0, 7, 7, 30, 0, 7, 1, 26, 0, 7, 0, 15,
- 0,134, 0, 13, 0, 26, 0, 30, 0, 2, 0, 19, 0, 2, 3,253, 0, 4, 0, 77, 0, 7, 7, 31, 0, 7, 1,168, 0, 7, 7, 32,
- 0, 7, 7, 33, 0, 7, 1, 26, 0, 2, 0,253, 0, 2, 0, 15, 0, 42, 1, 11, 1, 22, 7, 34, 1, 23, 0, 6, 0, 4, 0, 17,
- 0, 4, 0, 98, 0, 4, 0, 19, 0, 4, 2,169, 0, 0, 0, 16, 0, 9, 0, 45, 0, 81, 0, 5, 1, 23, 7, 35, 0, 4, 7, 36,
- 0, 4, 7, 37, 0, 4, 7, 38, 0, 4, 0, 15, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+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,122,109,105,110, 0,
+122,109, 97,120, 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, 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,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,110,101,101,100, 95,101,120,101, 99, 0,101,120,
+101, 99, 0,116,111,116,114, 0, 98,117,116,114, 0,112,114,118,114, 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, 42,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, 40, 42,116,105,109,101, 99,117,114,
+115,111,114, 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, 99,121, 99,108,105, 99, 0,109,111,118,105,101, 0,115, 97,109,112,108,101,115, 0,109,105,110,115,
+112,101,101,100, 0, 98,111,107,101,104, 0,104,117,101, 0,115, 97,116, 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,120, 49, 0,120, 50, 0,121, 49, 0,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,112,114,101,118,
+105,101,119, 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,105,116,101,114, 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,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, 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,111,102,102,115,101,116, 91, 50, 93,
+ 0,105,110,110,101,114,114, 97,100,105,117,115, 0,114, 97,116,101, 0,114,103, 98, 91, 51, 93, 0, 99,108,111,110,101, 0, 97,
+ 99,116,105,118,101, 95,114,110,100, 0,112, 97,100, 91, 52, 93, 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,101,100,105,116,102,108, 97,103, 0,118,101,108, 91,
+ 51, 93, 0,114,111,116, 91, 52, 93, 0, 97,118,101, 91, 51, 93, 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, 97,110,100, 91, 51, 93, 0, 42,115,
+116,105, 99,107, 95,111, 98, 0,115,116, 97,116,101, 0, 42,104, 97,105,114, 0,105, 95,114,111,116, 91, 52, 93, 0,114, 95,114,
+111,116, 91, 52, 93, 0,114, 95, 97,118,101, 91, 51, 93, 0,114, 95,118,101, 91, 51, 93, 0,100,105,101,116,105,109,101, 0, 98,
+ 97,110,107, 0,115,105,122,101,109,117,108, 0,110,117,109, 95,100,109, 99, 97, 99,104,101, 0, 98,112,105, 0, 97,108,105,118,
+101, 0,108,111,111,112, 0,100,105,115,116,114, 0,112,104,121,115,116,121,112,101, 0,114,111,116,109,111,100,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,100,114, 97,119, 95,115,116,101,112, 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,110, 98,101,116,119,101,101,110, 0, 98,111,105,100,110,101,105,103,104, 98,111,117,114,115, 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,116,105,109,101,116,119,101, 97,107, 0,106,105,116,102, 97, 99, 0,107,101,121,101,100, 95,
+116,105,109,101, 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,114,111,116,102, 97, 99, 0, 97,118,101,102, 97, 99, 0,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, 97, 98,115,108,101,110,
+103,116,104, 0,114, 97,110,100,108,101,110,103,116,104, 0, 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,104,105,108,100,115,112,114,101, 97,100, 0, 99,108,117,109,112,102, 97, 99,
+ 0, 99,108,117,109,112,112,111,119, 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, 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,109, 97,120, 95,118,101,108, 0,109, 97,120, 95,108, 97,116,
+ 95, 97, 99, 99, 0,109, 97,120, 95,116, 97,110, 95, 97, 99, 99, 0, 97,118,101,114, 97,103,101, 95,118,101,108, 0, 98, 97,110,
+107,105,110,103, 0,109, 97,120, 95, 98, 97,110,107, 0,103,114,111,117,110,100,122, 0, 98,111,105,100,102, 97, 99, 91, 56, 93,
+ 0, 98,111,105,100,114,117,108,101, 91, 56, 93, 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, 97,114,116, 0, 42,101,100,105,116, 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, 42,116, 97,114,103,101,116, 95,111, 98, 0, 42,107,101,121,101,100, 95,111, 98,
+ 0, 42,108, 97,116,116,105, 99,101, 0,101,102,102,101, 99,116,111,114,115, 0,114,101, 97, 99,116,101,118,101,110,116,115, 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,107,101,121,101,100, 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, 49, 93, 0,118,103, 95,110,101,103, 0,114,116, 51, 91, 50, 93, 0, 0, 0, 0, 84, 89, 80, 69, 50, 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,
+115,116, 66, 97,115,101, 0,118,101, 99, 50,115, 0,118,101, 99, 50,105, 0,118,101, 99, 50,102, 0,118,101, 99, 50,100, 0,118,
+101, 99, 51,105, 0,118,101, 99, 51,102, 0,118,101, 99, 51,100, 0,118,101, 99, 52,105, 0,118,101, 99, 52,102, 0,118,101, 99,
+ 52,100, 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, 0, 75,101,121, 66,108,111, 99,107, 0, 75,101,121, 0, 83, 99,114,105,112,116, 76,
+105,110,107, 0, 84,101,120,116, 76,105,110,101, 0, 84,101,120,116, 0, 80, 97, 99,107,101,100, 70,105,108,101, 0, 67, 97,109,
+101,114, 97, 0, 79, 98,106,101, 99,116, 0, 73,109, 97,103,101, 85,115,101,114, 0, 73,109, 97,103,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, 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, 87, 97,118,101, 0,
+ 77, 97,116,101,114,105, 97,108, 0, 98, 78,111,100,101, 84,114,101,101, 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, 66,101,122, 84,114,105,112,108,101, 0, 66, 80,111,105,110,116, 0, 78,117,114, 98, 0, 67,104, 97,114, 73,110,
+102,111, 0, 84,101,120,116, 66,111,120, 0, 67,117,114,118,101, 0, 80, 97,116,104, 0, 73,112,111, 68,114,105,118,101,114, 0,
+ 73,112,111, 67,117,114,118,101, 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, 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, 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,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,117,108,116,105,114,101,115, 77, 97,112, 78,111,100,101, 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, 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, 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, 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,
+ 68,101,114,105,118,101,100, 77,101,115,104, 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, 76, 97,116,
+116,105, 99,101, 0, 98, 68,101,102,111,114,109, 71,114,111,117,112, 0, 98, 65, 99,116,105,111,110, 0, 98, 80,111,115,101, 0,
+ 80, 97,114,116, 68,101,102,108,101, 99,116, 0, 83,111,102,116, 66,111,100,121, 0, 70,108,117,105,100,115,105,109, 83,101,116,
+116,105,110,103,115, 0, 79, 98, 72,111,111,107, 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, 82, 97,100,105,111,
+ 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, 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, 71, 97,109,101,
+ 70,114, 97,109,105,110,103, 0, 84,105,109,101, 77, 97,114,107,101,114, 0, 73,109, 97,103,101, 80, 97,105,110,116, 83,101,116,
+116,105,110,103,115, 0, 66,114,117,115,104, 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,111,111,108, 83,101,116,116,105,110,103,115, 0,
+ 66,114,117,115,104, 68, 97,116, 97, 0, 83, 99,117,108,112,116, 68, 97,116, 97, 0, 83, 99,117,108,112,116, 83,101,115,115,105,
+111,110, 0, 83, 99,101,110,101, 0, 68, 97,103, 70,111,114,101,115,116, 0, 66, 71,112,105, 99, 0, 86,105,101,119, 51, 68, 0,
+ 83,112, 97, 99,101, 76,105,110,107, 0, 83, 99,114, 65,114,101, 97, 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, 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, 83,112, 97, 99,101, 66,117,116,115, 0, 83,112, 97, 99,101,
+ 83,101,113, 0, 83,112, 97, 99,101, 70,105,108,101, 0,100,105,114,101,110,116,114,121, 0, 66,108,101,110,100, 72, 97,110,100,
+108,101, 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,112, 97, 99,101, 78,108, 97, 0, 83,112, 97, 99,101, 84,101,
+120,116, 0, 83,112, 97, 99,101, 83, 99,114,105,112,116, 0, 83, 99,114,105,112,116, 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, 73,109, 97, 83,101,108, 0, 70,105,108,101, 76,105,115,116, 0, 84,
+104,101,109,101, 85, 73, 0, 84,104,101,109,101, 83,112, 97, 99,101, 0, 98, 84,104,101,109,101, 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, 70,105,108,101, 71,108,111, 98, 97,108, 0, 83,116,114,105,112, 69,108,101,109, 0, 84,
+ 83,116,114,105,112, 69,108,101,109, 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, 98, 83,111,117,110,100, 0,104,100, 97,117,100,105,111, 0, 77,101,116, 97, 83,116, 97, 99,107, 0, 69,100,105,116,
+105,110,103, 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, 79,111,112,115, 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, 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, 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, 98, 83,111,117,110,100, 65, 99,116,117, 97,
+116,111,114, 0, 98, 67, 68, 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, 70,114,101,101, 67, 97,109,101,
+114, 97, 0, 98, 83, 97,109,112,108,101, 0, 98, 83,111,117,110,100, 76,105,115,116,101,110,101,114, 0, 83,112, 97, 99,101, 83,
+111,117,110,100, 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, 80,111,115,101, 67,104, 97,110,110,101,108, 0, 98, 65, 99,116,105,111,110, 67,104, 97,110,110,101,108, 0, 83,112, 97, 99,
+101, 65, 99,116,105,111,110, 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, 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,
+ 77,105,110, 77, 97,120, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 72, 97,105,114, 75,101,121, 0, 80, 97,114,116,105, 99,108,101, 75,101,121, 0, 67,104,
+105,108,100, 80, 97,114,116,105, 99,108,101, 0, 80, 97,114,116,105, 99,108,101, 68, 97,116, 97, 0, 80, 97,114,116,105, 99,108,
+101, 83,101,116,116,105,110,103,115, 0, 80, 97,114,116,105, 99,108,101, 69,100,105,116, 0, 80, 97,114,116,105, 99,108,101, 67,
+ 97, 99,104,101, 75,101,121, 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, 16, 0, 4, 0, 8, 0, 8, 0, 16, 0, 12, 0, 12, 0, 24, 0, 16, 0, 16, 0, 32, 0, 16, 0, 16, 0, 32, 0, 96, 0,
+ 72, 0, 72, 2, 0, 0, 40, 0,112, 0,128, 0,160, 0, 24, 0, 40, 0,152, 0, 24, 0,168, 0, 32, 4, 32, 0,176, 1, 0, 0,
+ 0, 0,136, 0, 48, 1,120, 1, 24, 0, 8, 3,200, 0, 0, 0,136, 0,104, 1, 48, 1, 80, 0,144, 2,176, 0, 96, 0, 96, 1,
+ 0, 0,128, 0,104, 0,184, 0, 56, 0, 36, 0, 80, 0, 8, 0, 16, 0,160, 1, 0, 0,144, 0,112, 0,120, 1, 20, 0, 48, 0,
+ 64, 0, 20, 0, 12, 0, 16, 0, 4, 0, 8, 0, 8, 0, 24, 0, 96, 0, 48, 0, 8, 0, 4, 0, 4, 0, 0, 1, 32, 0, 16, 0,
+ 64, 0, 24, 0, 12, 0, 96, 0, 0, 0, 64, 0, 88, 0,104, 0,112, 0, 80, 0,144, 0, 80, 0, 72, 0,168, 0,208, 0, 72, 0,
+104, 0,120, 0,200, 0,120, 0,200, 0, 64, 0, 80, 0, 8, 0, 8, 0, 0, 1, 88, 0,104, 1, 0, 0, 80, 0, 80, 0,152, 0,
+ 48, 0, 88, 0, 48, 0,120, 0,160, 0,152, 1,224, 0, 16, 0, 0, 0, 0, 0, 0, 0,152, 1, 40, 0, 40, 0,184, 0,152, 0,
+ 48, 0, 16, 0, 80, 0, 48, 4, 16, 0, 88, 0, 16, 0,216, 0, 8, 0, 72, 0,152, 0, 8, 0,160, 0, 0, 0, 24, 6, 0, 0,
+ 64, 0, 56, 3, 48, 0, 8, 1, 0, 0, 0, 0, 0, 0,136, 0, 48, 0, 88, 1,240, 0,208, 0,168, 1, 0, 0, 0, 0, 48, 1,
+ 16, 0, 16, 0, 48, 1,192, 0,136, 0, 56, 0, 0, 0,176, 0,232, 0,104, 2, 0, 0,152, 0,184, 0,152, 11, 56, 0, 16, 12,
+168, 0, 32, 0, 40, 0,240, 0, 40, 0, 80, 0, 40, 0,216, 0,200, 1,248, 0, 72, 1, 0, 0, 32, 0, 48, 0, 12, 0, 24, 0,
+ 48, 0, 16, 0, 24, 0, 24, 0, 32, 0, 72, 1, 0, 0, 64, 0, 64, 0, 80, 0, 48, 0, 8, 0, 48, 0, 72, 0,104, 0, 72, 0,
+ 44, 0, 40, 0,108, 0, 72, 0, 96, 0,104, 0, 64, 0,128, 0, 8, 0, 80, 0, 16, 0, 64, 0, 32, 0, 20, 0, 72, 0, 24, 0,
+ 80, 0,104, 0, 52, 0, 32, 0, 56, 0, 64, 0, 56, 0,112, 0,140, 0, 4, 0, 40, 0, 0, 0, 88, 0,192, 0, 40, 0, 24, 1,
+152, 0,208, 1, 80, 0,208, 0, 56, 0, 72, 0,128, 0, 80, 0,112, 0, 56, 0, 48, 0, 48, 0, 72, 0, 48, 0, 72, 0, 48, 0,
+ 24, 0, 56, 0,104, 0, 16, 0,112, 0, 96, 0, 28, 0, 28, 0, 28, 0, 72, 0,168, 0, 40, 0,136, 0, 48, 0,208, 0, 0, 0,
+ 0, 0, 16, 0, 24, 0, 12, 0, 16, 1, 40, 0, 8, 0, 64, 0, 32, 0, 24, 0, 24, 0, 32, 0, 8, 0, 12, 0, 56, 0, 24, 0,
+ 64, 0, 24, 0, 56, 0, 72, 0,208, 0,232, 1, 0, 0, 0, 0, 83, 84, 82, 67, 13, 1, 0, 0, 10, 0, 2, 0, 10, 0, 0, 0,
+ 10, 0, 1, 0, 11, 0, 2, 0, 9, 0, 2, 0, 9, 0, 3, 0, 12, 0, 2, 0, 2, 0, 4, 0, 2, 0, 5, 0, 13, 0, 2, 0,
+ 4, 0, 4, 0, 4, 0, 5, 0, 14, 0, 2, 0, 7, 0, 4, 0, 7, 0, 5, 0, 15, 0, 2, 0, 8, 0, 4, 0, 8, 0, 5, 0,
+ 16, 0, 3, 0, 4, 0, 4, 0, 4, 0, 5, 0, 4, 0, 6, 0, 17, 0, 3, 0, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0,
+ 18, 0, 3, 0, 8, 0, 4, 0, 8, 0, 5, 0, 8, 0, 6, 0, 19, 0, 4, 0, 4, 0, 4, 0, 4, 0, 5, 0, 4, 0, 6, 0,
+ 4, 0, 7, 0, 20, 0, 4, 0, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0, 7, 0, 7, 0, 21, 0, 4, 0, 8, 0, 4, 0,
+ 8, 0, 5, 0, 8, 0, 6, 0, 8, 0, 7, 0, 22, 0, 4, 0, 4, 0, 8, 0, 4, 0, 9, 0, 4, 0, 10, 0, 4, 0, 11, 0,
+ 23, 0, 4, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 24, 0, 4, 0, 9, 0, 12, 0, 11, 0, 13, 0,
+ 4, 0, 14, 0, 4, 0, 15, 0, 25, 0, 10, 0, 25, 0, 0, 0, 25, 0, 1, 0, 0, 0, 16, 0, 0, 0, 17, 0, 0, 0, 18, 0,
+ 2, 0, 19, 0, 4, 0, 20, 0, 24, 0, 21, 0, 4, 0, 22, 0, 4, 0, 23, 0, 26, 0, 9, 0, 9, 0, 0, 0, 9, 0, 1, 0,
+ 26, 0, 24, 0, 27, 0, 25, 0, 0, 0, 26, 0, 2, 0, 27, 0, 2, 0, 19, 0, 4, 0, 28, 0, 25, 0, 29, 0, 27, 0, 8, 0,
+ 26, 0, 30, 0, 26, 0, 31, 0, 28, 0, 32, 0, 0, 0, 33, 0, 0, 0, 34, 0, 4, 0, 35, 0, 4, 0, 15, 0, 27, 0, 36, 0,
+ 29, 0, 6, 0, 4, 0, 37, 0, 4, 0, 38, 0, 2, 0, 39, 0, 2, 0, 40, 0, 2, 0, 41, 0, 4, 0, 42, 0, 30, 0, 7, 0,
+ 26, 0, 30, 0, 11, 0, 43, 0, 23, 0, 44, 0, 2, 0, 45, 0, 2, 0, 46, 0, 2, 0, 47, 0, 2, 0, 15, 0, 31, 0, 16, 0,
+ 31, 0, 0, 0, 31, 0, 1, 0, 7, 0, 48, 0, 7, 0, 49, 0, 2, 0, 17, 0, 2, 0, 50, 0, 2, 0, 51, 0, 2, 0, 41, 0,
+ 4, 0, 52, 0, 4, 0, 53, 0, 9, 0, 54, 0, 7, 0, 55, 0, 0, 0, 16, 0, 0, 0, 56, 0, 7, 0, 57, 0, 7, 0, 58, 0,
+ 32, 0, 12, 0, 26, 0, 30, 0, 31, 0, 59, 0, 0, 0, 60, 0, 4, 0, 61, 0, 7, 0, 49, 0, 11, 0, 62, 0, 30, 0, 63, 0,
+ 26, 0, 64, 0, 2, 0, 17, 0, 2, 0, 65, 0, 2, 0, 66, 0, 2, 0, 19, 0, 33, 0, 5, 0, 26, 0, 67, 0, 2, 0, 68, 0,
+ 2, 0, 69, 0, 2, 0, 70, 0, 4, 0, 15, 0, 34, 0, 6, 0, 34, 0, 0, 0, 34, 0, 1, 0, 0, 0, 71, 0, 0, 0, 72, 0,
+ 4, 0, 22, 0, 4, 0, 73, 0, 35, 0, 13, 0, 26, 0, 30, 0, 0, 0, 74, 0, 4, 0, 75, 0, 4, 0, 76, 0, 11, 0, 77, 0,
+ 34, 0, 78, 0, 34, 0, 79, 0, 4, 0, 80, 0, 4, 0, 81, 0, 0, 0, 82, 0, 4, 0, 83, 0, 4, 0, 84, 0, 9, 0, 85, 0,
+ 36, 0, 5, 0, 4, 0, 86, 0, 4, 0, 87, 0, 4, 0, 75, 0, 4, 0, 15, 0, 9, 0, 54, 0, 37, 0, 20, 0, 26, 0, 30, 0,
+ 2, 0, 17, 0, 2, 0, 19, 0, 7, 0, 88, 0, 7, 0, 89, 0, 7, 0, 90, 0, 7, 0, 91, 0, 7, 0, 92, 0, 7, 0, 93, 0,
+ 7, 0, 94, 0, 7, 0, 95, 0, 7, 0, 96, 0, 7, 0, 97, 0, 7, 0, 98, 0, 2, 0, 99, 0, 2, 0,100, 0, 7, 0,101, 0,
+ 30, 0, 63, 0, 33, 0,102, 0, 38, 0,103, 0, 39, 0, 12, 0, 4, 0,104, 0, 4, 0,105, 0, 4, 0,106, 0, 4, 0,107, 0,
+ 2, 0,108, 0, 2, 0,109, 0, 2, 0, 19, 0, 2, 0,110, 0, 2, 0,111, 0, 2, 0,112, 0, 2, 0,113, 0, 2, 0,114, 0,
+ 40, 0, 31, 0, 26, 0, 30, 0, 0, 0, 33, 0, 11, 0,115, 0, 41, 0,116, 0, 42, 0,117, 0, 2, 0,110, 0, 2, 0, 19, 0,
+ 2, 0,118, 0, 2, 0, 17, 0, 2, 0, 15, 0, 2, 0, 41, 0, 4, 0,119, 0, 2, 0,120, 0, 2, 0,121, 0, 2, 0,122, 0,
+ 2, 0,123, 0, 2, 0,124, 0, 2, 0,125, 0, 4, 0,126, 0, 4, 0,127, 0, 36, 0,128, 0, 29, 0,129, 0, 7, 0,130, 0,
+ 4, 0,131, 0, 2, 0,132, 0, 2, 0,133, 0, 2, 0,134, 0, 2, 0,135, 0, 7, 0,136, 0, 7, 0,137, 0, 9, 0,138, 0,
+ 43, 0, 28, 0, 2, 0,139, 0, 2, 0,140, 0, 2, 0,141, 0, 2, 0,142, 0, 38, 0,143, 0, 44, 0,144, 0, 0, 0,145, 0,
+ 0, 0,146, 0, 0, 0,147, 0, 0, 0,148, 0, 0, 0,149, 0, 7, 0,150, 0, 7, 0,151, 0, 2, 0,152, 0, 2, 0,153, 0,
+ 2, 0,154, 0, 2, 0,155, 0, 7, 0,156, 0, 7, 0,157, 0, 7, 0,158, 0, 7, 0,159, 0, 7, 0,160, 0, 7, 0,161, 0,
+ 7, 0,162, 0, 7, 0,163, 0, 7, 0,164, 0, 7, 0,165, 0, 7, 0,166, 0, 45, 0, 15, 0, 0, 0,167, 0, 9, 0,168, 0,
+ 0, 0,169, 0, 0, 0,170, 0, 4, 0,171, 0, 4, 0,172, 0, 9, 0,173, 0, 7, 0,174, 0, 7, 0,175, 0, 7, 0,176, 0,
+ 4, 0,177, 0, 9, 0,178, 0, 9, 0,179, 0, 4, 0,180, 0, 4, 0, 15, 0, 46, 0, 6, 0, 7, 0,156, 0, 7, 0,157, 0,
+ 7, 0,158, 0, 7, 0,181, 0, 7, 0, 48, 0, 4, 0, 44, 0, 47, 0, 5, 0, 2, 0, 19, 0, 2, 0, 35, 0, 2, 0, 44, 0,
+ 2, 0,182, 0, 46, 0,176, 0, 48, 0, 17, 0, 38, 0,143, 0, 40, 0,183, 0, 49, 0,184, 0, 7, 0,185, 0, 7, 0,186, 0,
+ 2, 0, 17, 0, 2, 0,187, 0, 7, 0, 90, 0, 7, 0, 91, 0, 7, 0,188, 0, 4, 0,189, 0, 2, 0,190, 0, 2, 0,191, 0,
+ 4, 0,110, 0, 4, 0,119, 0, 2, 0,192, 0, 2, 0,193, 0, 44, 0, 53, 0, 26, 0, 30, 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, 2, 0,214, 0, 2, 0,215, 0, 2, 0,216, 0, 2, 0,217, 0, 2, 0,218, 0, 2, 0,219, 0,
+ 2, 0,220, 0, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0,187, 0, 7, 0,221, 0, 7, 0,222, 0, 7, 0,223, 0, 7, 0,224, 0,
+ 2, 0,225, 0, 2, 0,226, 0, 2, 0,227, 0, 2, 0,108, 0, 4, 0, 22, 0, 4, 0,105, 0, 4, 0,106, 0, 4, 0,107, 0,
+ 7, 0,228, 0, 7, 0,229, 0, 7, 0,163, 0, 39, 0,230, 0, 30, 0, 63, 0, 40, 0,183, 0, 45, 0,231, 0, 47, 0,232, 0,
+ 48, 0,233, 0, 29, 0,129, 0, 50, 0, 8, 0, 7, 0,234, 0, 7, 0,235, 0, 7, 0,151, 0, 4, 0, 19, 0, 7, 0,236, 0,
+ 7, 0,237, 0, 7, 0,238, 0, 38, 0,239, 0, 51, 0, 60, 0, 26, 0, 30, 0, 2, 0, 17, 0, 2, 0,240, 0, 2, 0,153, 0,
+ 2, 0,241, 0, 7, 0,156, 0, 7, 0,157, 0, 7, 0,158, 0, 7, 0,159, 0, 7, 0,242, 0, 7, 0,243, 0, 7, 0,244, 0,
+ 7, 0,245, 0, 7, 0,246, 0, 7, 0,247, 0, 7, 0,248, 0, 4, 0, 53, 0, 52, 0,249, 0, 2, 0,250, 0, 2, 0,251, 0,
+ 7, 0, 90, 0, 7, 0, 91, 0, 7, 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, 0, 0, 3, 1, 0, 0, 4, 1, 2, 0, 5, 1, 2, 0, 6, 1, 2, 0, 7, 1, 2, 0, 8, 1, 2, 0, 9, 1,
+ 7, 0, 10, 1, 7, 0, 11, 1, 7, 0, 12, 1, 7, 0, 13, 1, 2, 0, 14, 1, 2, 0, 41, 0, 2, 0, 15, 1, 2, 0, 16, 1,
+ 4, 0, 17, 1, 4, 0, 18, 1, 2, 0, 19, 1, 2, 0, 20, 1, 2, 0, 21, 1, 2, 0, 22, 1, 7, 0, 23, 1, 7, 0, 24, 1,
+ 7, 0, 25, 1, 7, 0, 26, 1, 2, 0, 27, 1, 2, 0, 28, 1, 43, 0, 29, 1, 30, 0, 63, 0, 29, 0,129, 0, 33, 0,102, 0,
+ 53, 0, 2, 0, 26, 0, 30, 0, 30, 0, 63, 0, 54, 0,124, 0, 26, 0, 30, 0, 2, 0,153, 0, 2, 0, 19, 0, 7, 0,156, 0,
+ 7, 0,157, 0, 7, 0,158, 0, 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, 7, 0, 37, 1, 7, 0, 38, 1, 7, 0, 39, 1, 7, 0, 40, 1, 7, 0, 41, 1, 7, 0, 42, 1, 7, 0, 43, 1,
+ 7, 0, 44, 1, 7, 0, 45, 1, 7, 0, 46, 1, 7, 0, 47, 1, 7, 0, 48, 1, 7, 0, 49, 1, 7, 0, 50, 1, 7, 0, 51, 1,
+ 7, 0, 52, 1, 7, 0, 53, 1, 7, 0, 54, 1, 7, 0, 55, 1, 7, 0, 56, 1, 2, 0, 57, 1, 2, 0, 58, 1, 2, 0, 59, 1,
+ 0, 0, 60, 1, 0, 0, 61, 1, 7, 0, 62, 1, 7, 0, 63, 1, 2, 0, 64, 1, 2, 0, 65, 1, 7, 0, 66, 1, 7, 0, 67, 1,
+ 7, 0, 68, 1, 7, 0, 69, 1, 2, 0, 70, 1, 2, 0, 41, 0, 4, 0,240, 0, 4, 0, 71, 1, 2, 0, 72, 1, 2, 0, 73, 1,
+ 2, 0, 74, 1, 2, 0, 75, 1, 7, 0, 76, 1, 7, 0, 77, 1, 7, 0, 78, 1, 7, 0, 79, 1, 7, 0, 80, 1, 7, 0, 81, 1,
+ 7, 0, 82, 1, 0, 0, 83, 1, 7, 0, 84, 1, 7, 0, 85, 1, 7, 0, 86, 1, 0, 0, 87, 1, 0, 0, 15, 1, 0, 0, 88, 1,
+ 0, 0, 89, 1, 2, 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, 7, 0,100, 1, 2, 0,139, 0, 2, 0,140, 0, 47, 0,101, 1, 47, 0,102, 1,
+ 0, 0,103, 1, 0, 0,104, 1, 0, 0,105, 1, 0, 0,106, 1, 2, 0,107, 1, 2, 0,251, 0, 7, 0,108, 1, 7, 0,109, 1,
+ 43, 0, 29, 1, 55, 0,110, 1, 30, 0, 63, 0, 56, 0,111, 1, 29, 0,129, 0, 7, 0,112, 1, 7, 0,113, 1, 7, 0,114, 1,
+ 7, 0,115, 1, 7, 0,116, 1, 2, 0,117, 1, 2, 0, 53, 0, 7, 0,118, 1, 7, 0,119, 1, 7, 0,120, 1, 7, 0,121, 1,
+ 7, 0,122, 1, 7, 0,123, 1, 7, 0,124, 1, 7, 0,125, 1, 7, 0,126, 1, 2, 0,127, 1, 2, 0,128, 1, 7, 0,129, 1,
+ 7, 0,130, 1, 7, 0,131, 1, 7, 0,132, 1, 7, 0,133, 1, 4, 0,134, 1, 4, 0,135, 1, 4, 0,136, 1, 33, 0,102, 0,
+ 57, 0, 6, 0, 26, 0, 30, 0, 0, 0,137, 1, 7, 0,138, 1, 7, 0, 15, 0, 58, 0, 54, 0, 36, 0,128, 0, 59, 0, 26, 0,
+ 59, 0, 0, 0, 59, 0, 1, 0, 60, 0,139, 1, 4, 0,140, 1, 4, 0,141, 1, 4, 0,142, 1, 4, 0,143, 1, 4, 0,144, 1,
+ 4, 0,145, 1, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,146, 1, 2, 0,147, 1, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 6, 0,
+ 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, 22, 0,
+ 7, 0,155, 1, 7, 0,156, 1, 61, 0, 15, 0, 26, 0, 30, 0, 60, 0,139, 1, 11, 0,157, 1, 11, 0,158, 1, 30, 0, 63, 0,
+ 54, 0,159, 1, 2, 0, 19, 0, 2, 0,160, 1, 4, 0,152, 0, 7, 0,234, 0, 7, 0,151, 0, 7, 0,235, 0, 7, 0,161, 1,
+ 7, 0,162, 1, 7, 0,163, 1, 62, 0, 10, 0, 7, 0,164, 1, 7, 0,165, 1, 7, 0,166, 1, 7, 0,167, 1, 2, 0,168, 1,
+ 2, 0,169, 1, 0, 0,170, 1, 0, 0,171, 1, 0, 0,172, 1, 0, 0,173, 1, 63, 0, 7, 0, 7, 0,174, 1, 7, 0,165, 1,
+ 7, 0,166, 1, 2, 0,170, 1, 2, 0,173, 1, 7, 0,167, 1, 7, 0, 15, 0, 64, 0, 21, 0, 64, 0, 0, 0, 64, 0, 1, 0,
+ 2, 0, 17, 0, 2, 0,175, 1, 2, 0,173, 1, 2, 0, 19, 0, 2, 0,176, 1, 2, 0,177, 1, 2, 0,178, 1, 2, 0,179, 1,
+ 2, 0,180, 1, 2, 0,181, 1, 2, 0,182, 1, 2, 0,183, 1, 7, 0,184, 1, 7, 0,185, 1, 63, 0,186, 1, 62, 0,187, 1,
+ 2, 0,188, 1, 2, 0, 15, 0, 4, 0,189, 1, 65, 0, 5, 0, 2, 0,190, 1, 2, 0,175, 1, 0, 0, 19, 0, 0, 0, 15, 0,
+ 2, 0, 53, 0, 66, 0, 4, 0, 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 7, 0, 7, 0,191, 1, 67, 0, 57, 0, 26, 0, 30, 0,
+ 60, 0,139, 1, 11, 0,192, 1, 11, 0,158, 1, 38, 0,193, 1, 38, 0,194, 1, 38, 0,195, 1, 30, 0, 63, 0, 68, 0,196, 1,
+ 32, 0,197, 1, 54, 0,159, 1, 11, 0,198, 1, 7, 0,234, 0, 7, 0,151, 0, 7, 0,235, 0, 4, 0,152, 0, 2, 0,199, 1,
+ 2, 0,160, 1, 2, 0, 19, 0, 2, 0,200, 1, 7, 0,201, 1, 7, 0,202, 1, 7, 0,203, 1, 2, 0,178, 1, 2, 0,179, 1,
+ 2, 0,204, 1, 2, 0,205, 1, 4, 0, 53, 0, 2, 0, 22, 0, 2, 0, 77, 0, 2, 0, 48, 0, 2, 0,206, 1, 7, 0,207, 1,
+ 7, 0,208, 1, 7, 0,209, 1, 7, 0,210, 1, 7, 0,211, 1, 7, 0,212, 1, 7, 0,213, 1, 7, 0,214, 1, 7, 0,215, 1,
+ 7, 0,216, 1, 0, 0,217, 1, 0, 0,218, 1, 57, 0,219, 1, 57, 0,220, 1, 57, 0,221, 1, 57, 0,222, 1, 4, 0,223, 1,
+ 4, 0,224, 1, 4, 0,225, 1, 4, 0, 15, 0, 66, 0,226, 1, 4, 0,227, 1, 4, 0,228, 1, 65, 0,229, 1, 65, 0,230, 1,
+ 69, 0, 6, 0, 38, 0,239, 0, 2, 0, 45, 0, 2, 0, 50, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,231, 1, 70, 0, 21, 0,
+ 70, 0, 0, 0, 70, 0, 1, 0, 63, 0,186, 1, 62, 0,187, 1, 23, 0,232, 1, 23, 0,233, 1, 2, 0, 45, 0, 2, 0, 50, 0,
+ 2, 0,234, 1, 2, 0,235, 1, 2, 0,236, 1, 2, 0,237, 1, 2, 0, 19, 0, 2, 0,161, 0, 7, 0, 10, 0, 7, 0, 11, 0,
+ 4, 0,238, 1, 7, 0,239, 1, 7, 0,240, 1, 7, 0, 49, 0, 69, 0,241, 1, 71, 0, 39, 0, 26, 0, 30, 0, 60, 0,139, 1,
+ 11, 0,242, 1, 30, 0, 63, 0, 32, 0,197, 1, 54, 0,159, 1, 72, 0,243, 1, 73, 0,244, 1, 74, 0,245, 1, 75, 0,246, 1,
+ 76, 0,247, 1, 77, 0,248, 1, 78, 0,249, 1, 79, 0,250, 1, 71, 0,251, 1, 80, 0,252, 1, 81, 0,253, 1, 81, 0,254, 1,
+ 81, 0,255, 1, 4, 0,235, 1, 4, 0, 0, 2, 4, 0, 1, 2, 4, 0, 2, 2, 4, 0, 3, 2, 4, 0,152, 0, 7, 0,234, 0,
+ 7, 0,151, 0, 7, 0,235, 0, 7, 0, 4, 2, 7, 0, 15, 0, 2, 0, 5, 2, 2, 0, 19, 0, 2, 0, 6, 2, 2, 0, 7, 2,
+ 2, 0,160, 1, 2, 0, 8, 2, 82, 0, 9, 2, 83, 0, 10, 2, 9, 0,138, 0, 74, 0, 8, 0, 9, 0, 11, 2, 7, 0, 12, 2,
+ 4, 0, 13, 2, 0, 0, 19, 0, 0, 0, 14, 2, 2, 0,240, 0, 2, 0, 15, 2, 2, 0, 16, 2, 72, 0, 8, 0, 4, 0, 17, 2,
+ 4, 0, 18, 2, 4, 0, 19, 2, 4, 0, 20, 2, 0, 0, 15, 0, 0, 0,175, 1, 0, 0, 21, 2, 0, 0, 19, 0, 76, 0, 5, 0,
+ 4, 0, 17, 2, 4, 0, 18, 2, 0, 0, 22, 2, 0, 0, 15, 0, 2, 0, 19, 0, 84, 0, 2, 0, 4, 0, 23, 2, 7, 0,166, 1,
+ 77, 0, 3, 0, 84, 0, 24, 2, 4, 0, 25, 2, 4, 0, 19, 0, 75, 0, 4, 0, 7, 0, 26, 2, 2, 0, 27, 2, 0, 0, 19, 0,
+ 0, 0,175, 1, 78, 0, 4, 0, 0, 0,181, 0, 0, 0,156, 0, 0, 0,157, 0, 0, 0,158, 0, 79, 0, 1, 0, 7, 0, 28, 2,
+ 80, 0, 2, 0, 4, 0, 29, 2, 4, 0, 17, 0, 73, 0, 7, 0, 7, 0, 12, 2, 40, 0, 11, 2, 0, 0, 19, 0, 0, 0, 14, 2,
+ 2, 0,240, 0, 2, 0, 15, 2, 2, 0, 16, 2, 85, 0, 1, 0, 7, 0, 30, 2, 86, 0, 1, 0, 4, 0, 31, 2, 87, 0, 1, 0,
+ 0, 0, 32, 2, 88, 0, 1, 0, 7, 0, 12, 2, 89, 0, 4, 0, 7, 0,181, 0, 7, 0,156, 0, 7, 0,157, 0, 7, 0,158, 0,
+ 90, 0, 1, 0, 89, 0, 13, 2, 91, 0, 5, 0, 4, 0, 33, 2, 4, 0, 34, 2, 0, 0, 19, 0, 0, 0,175, 1, 0, 0, 35, 2,
+ 92, 0, 2, 0, 4, 0, 36, 2, 4, 0, 34, 2, 93, 0, 14, 0, 93, 0, 0, 0, 93, 0, 1, 0, 91, 0, 37, 2, 90, 0, 38, 2,
+ 92, 0, 39, 2, 0, 0, 40, 2, 11, 0, 41, 2, 11, 0, 42, 2, 94, 0, 43, 2, 4, 0,235, 1, 4, 0, 1, 2, 4, 0, 0, 2,
+ 4, 0, 15, 0, 75, 0, 44, 2, 82, 0, 14, 0, 11, 0, 45, 2, 75, 0, 44, 2, 0, 0, 46, 2, 0, 0, 47, 2, 0, 0, 48, 2,
+ 0, 0, 49, 2, 0, 0, 50, 2, 0, 0, 51, 2, 0, 0, 52, 2, 0, 0, 15, 0, 81, 0,253, 1, 81, 0,255, 1, 2, 0, 53, 2,
+ 0, 0, 54, 2, 83, 0, 8, 0, 4, 0, 55, 2, 4, 0, 56, 2, 72, 0, 57, 2, 76, 0, 58, 2, 4, 0, 1, 2, 4, 0, 0, 2,
+ 4, 0,235, 1, 4, 0, 15, 0, 95, 0, 6, 0, 95, 0, 0, 0, 95, 0, 1, 0, 4, 0, 17, 0, 4, 0,240, 0, 0, 0, 16, 0,
+ 0, 0, 59, 2, 96, 0, 7, 0, 95, 0, 60, 2, 2, 0, 61, 2, 2, 0, 45, 2, 2, 0, 62, 2, 2, 0, 75, 0, 9, 0, 63, 2,
+ 9, 0, 64, 2, 97, 0, 3, 0, 95, 0, 60, 2, 38, 0,143, 0, 0, 0, 16, 0, 98, 0, 5, 0, 95, 0, 60, 2, 38, 0,143, 0,
+ 0, 0, 16, 0, 2, 0, 65, 2, 0, 0, 66, 2, 99, 0, 5, 0, 95, 0, 60, 2, 7, 0, 67, 2, 7, 0, 68, 2, 4, 0, 69, 2,
+ 4, 0, 70, 2,100, 0, 13, 0, 95, 0, 60, 2, 38, 0, 71, 2, 38, 0, 72, 2, 38, 0, 73, 2, 38, 0, 74, 2, 7, 0, 75, 2,
+ 7, 0, 76, 2, 7, 0, 68, 2, 7, 0, 77, 2, 4, 0, 78, 2, 4, 0, 79, 2, 4, 0, 75, 0, 4, 0, 80, 2,101, 0, 5, 0,
+ 95, 0, 60, 2, 2, 0, 81, 2, 2, 0, 19, 0, 7, 0, 82, 2, 38, 0, 83, 2,102, 0, 3, 0, 95, 0, 60, 2, 7, 0, 84, 2,
+ 4, 0, 75, 0,103, 0, 11, 0, 95, 0, 60, 2, 44, 0, 85, 2, 7, 0, 86, 2, 4, 0, 87, 2, 0, 0, 88, 2, 7, 0, 89, 2,
+ 4, 0, 90, 2, 38, 0, 91, 2, 0, 0, 92, 2, 4, 0, 93, 2, 4, 0, 15, 0,104, 0, 10, 0, 95, 0, 60, 2, 38, 0, 94, 2,
+ 40, 0, 95, 2, 4, 0, 75, 0, 4, 0, 96, 2, 7, 0, 97, 2, 7, 0, 98, 2, 0, 0, 92, 2, 4, 0, 93, 2, 4, 0, 15, 0,
+105, 0, 3, 0, 95, 0, 60, 2, 7, 0, 99, 2, 4, 0,100, 2,106, 0, 5, 0, 95, 0, 60, 2, 7, 0,101, 2, 0, 0, 88, 2,
+ 2, 0, 19, 0, 2, 0,102, 2,107, 0, 8, 0, 95, 0, 60, 2, 38, 0,143, 0, 7, 0,101, 2, 7, 0,167, 1, 7, 0, 86, 0,
+ 0, 0, 88, 2, 2, 0, 19, 0, 2, 0, 17, 0,108, 0, 19, 0, 95, 0, 60, 2, 38, 0,103, 2, 0, 0, 88, 2, 44, 0, 85, 2,
+ 38, 0, 91, 2, 2, 0, 19, 0, 2, 0, 15, 0, 7, 0,104, 2, 7, 0,105, 2, 7, 0,106, 2, 7, 0,201, 1, 7, 0,107, 2,
+ 7, 0,108, 2, 7, 0,109, 2, 4, 0, 90, 2, 4, 0, 93, 2, 0, 0, 92, 2, 7, 0,110, 2, 7, 0,111, 2,109, 0, 7, 0,
+ 95, 0, 60, 2, 2, 0,112, 2, 2, 0,113, 2, 4, 0, 53, 0, 38, 0,143, 0, 7, 0,114, 2, 0, 0, 88, 2,110, 0, 9, 0,
+ 95, 0, 60, 2, 38, 0,143, 0, 7, 0,115, 2, 7, 0,116, 2, 7, 0,117, 2, 4, 0,118, 2, 4, 0,119, 2, 7, 0,120, 2,
+ 0, 0, 16, 0,111, 0, 1, 0, 95, 0, 60, 2,112, 0, 4, 0, 95, 0, 60, 2, 38, 0,143, 0, 4, 0,121, 2, 4, 0, 15, 0,
+113, 0, 2, 0, 4, 0,122, 2, 7, 0,166, 1,114, 0, 2, 0, 4, 0,106, 0, 4, 0,123, 2,115, 0, 20, 0, 95, 0, 60, 2,
+ 38, 0,143, 0, 0, 0, 88, 2, 2, 0,124, 2, 2, 0,125, 2, 2, 0, 19, 0, 2, 0, 15, 0, 7, 0,126, 2, 7, 0,127, 2,
+ 4, 0,235, 1, 4, 0,128, 2,114, 0,129, 2,113, 0,130, 2, 4, 0,131, 2, 4, 0,132, 2, 4, 0,133, 2, 4, 0,123, 2,
+ 7, 0,134, 2, 7, 0,135, 2, 7, 0,136, 2,116, 0, 5, 0, 95, 0, 60, 2,117, 0,137, 2,118, 0,138, 2, 2, 0, 19, 0,
+ 2, 0,139, 2,119, 0, 5, 0, 95, 0, 60, 2, 38, 0,239, 0, 2, 0,140, 2, 2, 0, 19, 0, 2, 0,141, 2,120, 0, 5, 0,
+ 95, 0, 60, 2, 4, 0,142, 2, 2, 0, 19, 0, 2, 0,143, 2, 7, 0,144, 2,121, 0, 24, 0, 26, 0, 30, 0, 2, 0,176, 1,
+ 2, 0,177, 1, 2, 0,145, 2, 2, 0, 19, 0, 2, 0,146, 2, 2, 0,147, 2, 2, 0,148, 2, 2, 0, 53, 0, 0, 0,149, 2,
+ 0, 0,150, 2, 0, 0,151, 2, 0, 0, 17, 0, 4, 0, 15, 0, 7, 0,152, 2, 7, 0,153, 2, 7, 0,154, 2, 7, 0,155, 2,
+ 7, 0,156, 2, 7, 0,157, 2, 63, 0,158, 2, 30, 0, 63, 0, 32, 0,197, 1, 77, 0,248, 1,122, 0, 3, 0,122, 0, 0, 0,
+122, 0, 1, 0, 0, 0, 16, 0, 60, 0, 3, 0, 7, 0,159, 2, 4, 0, 19, 0, 4, 0, 15, 0, 38, 0,104, 0, 26, 0, 30, 0,
+ 2, 0, 17, 0, 2, 0,160, 2, 4, 0,161, 2, 4, 0,162, 2, 4, 0,163, 2, 0, 0,164, 2, 38, 0, 36, 0, 38, 0,165, 2,
+ 38, 0,166, 2, 38, 0,167, 2, 38, 0,168, 2, 30, 0, 63, 0, 68, 0,196, 1, 60, 0,139, 1,123, 0,169, 2,124, 0,170, 2,
+ 9, 0, 54, 0, 11, 0,171, 2, 11, 0,242, 1, 11, 0,158, 1, 11, 0,172, 2, 11, 0,173, 2, 54, 0,159, 1, 7, 0,234, 0,
+ 7, 0,174, 2, 7, 0,175, 2, 7, 0,151, 0, 7, 0,176, 2, 7, 0,235, 0, 7, 0,177, 2, 7, 0,148, 1, 7, 0,178, 2,
+ 7, 0,179, 2, 7, 0,115, 2, 7, 0,180, 2, 7, 0,185, 0, 4, 0,181, 2, 2, 0, 19, 0, 2, 0,182, 2, 2, 0,183, 2,
+ 2, 0,184, 2, 2, 0,185, 2, 2, 0,186, 2, 2, 0,187, 2, 2, 0,188, 2, 2, 0,189, 2, 2, 0,190, 2, 2, 0,191, 2,
+ 2, 0,192, 2, 4, 0,193, 2, 4, 0,194, 2, 4, 0,195, 2, 4, 0,196, 2, 7, 0,197, 2, 7, 0,198, 2, 7, 0,199, 2,
+ 7, 0,200, 2, 7, 0,201, 2, 7, 0,202, 2, 7, 0,203, 2, 7, 0,204, 2, 0, 0,205, 2, 0, 0,206, 2, 0, 0,160, 1,
+ 0, 0,207, 2, 0, 0,208, 2, 0, 0,209, 2, 7, 0,210, 2, 33, 0,102, 0, 11, 0,211, 2, 11, 0,212, 2, 11, 0,213, 2,
+ 11, 0,214, 2, 9, 0,215, 2, 7, 0,216, 2, 2, 0, 29, 2, 2, 0,217, 2, 7, 0, 13, 2, 4, 0,218, 2, 4, 0,219, 2,
+ 2, 0,220, 2, 2, 0,192, 0, 7, 0,221, 2, 11, 0,222, 2, 11, 0,223, 2, 11, 0,224, 2, 11, 0,225, 2,125, 0,226, 2,
+126, 0,227, 2, 56, 0,228, 2, 2, 0,229, 2, 2, 0,230, 2, 2, 0,231, 2, 2, 0,232, 2, 7, 0, 5, 2, 2, 0,233, 2,
+ 2, 0,234, 2,127, 0,235, 2,118, 0,236, 2,118, 0,237, 2, 4, 0,238, 2, 4, 0, 15, 0, 9, 0,138, 0,128, 0, 14, 0,
+128, 0, 0, 0,128, 0, 1, 0, 38, 0, 36, 0, 7, 0,115, 2, 7, 0,236, 0, 7, 0,116, 2, 7, 0,117, 2, 0, 0, 16, 0,
+ 4, 0,118, 2, 4, 0,119, 2, 4, 0,239, 2, 2, 0, 17, 0, 2, 0,240, 2, 7, 0,120, 2,125, 0, 33, 0, 2, 0,241, 2,
+ 2, 0,242, 2, 2, 0, 19, 0, 2, 0,117, 2, 7, 0,243, 2, 7, 0,244, 2, 7, 0,245, 2, 7, 0,246, 2, 7, 0,247, 2,
+ 7, 0,248, 2, 7, 0,249, 2, 7, 0,250, 2, 7, 0,251, 2, 7, 0,252, 2, 7, 0,253, 2, 7, 0,254, 2, 7, 0,255, 2,
+ 7, 0, 0, 3, 7, 0, 1, 3, 7, 0, 2, 3, 7, 0, 3, 3, 7, 0, 4, 3, 7, 0, 5, 3, 7, 0, 6, 3, 7, 0, 7, 3,
+ 7, 0, 8, 3, 7, 0, 9, 3, 7, 0, 10, 3, 2, 0, 11, 3, 2, 0, 12, 3, 2, 0, 13, 3, 2, 0, 14, 3, 44, 0,144, 0,
+129, 0, 1, 0, 7, 0,174, 1,126, 0, 41, 0,117, 0, 15, 3, 4, 0, 16, 3, 4, 0, 17, 3,130, 0, 18, 3,131, 0, 19, 3,
+ 7, 0,198, 2, 7, 0, 20, 3, 7, 0, 21, 3, 7, 0, 22, 3, 7, 0, 23, 3, 7, 0, 24, 3, 7, 0, 25, 3, 7, 0, 26, 3,
+ 7, 0, 27, 3, 7, 0, 28, 3, 7, 0, 29, 3, 2, 0, 30, 3, 2, 0, 31, 3, 7, 0, 32, 3, 7, 0, 33, 3, 4, 0,107, 0,
+ 4, 0, 34, 3, 4, 0, 35, 3, 2, 0, 36, 3, 2, 0, 37, 3,129, 0, 38, 3, 4, 0, 39, 3, 4, 0, 65, 0, 7, 0, 40, 3,
+ 7, 0, 41, 3, 7, 0, 42, 3, 7, 0, 43, 3, 2, 0, 44, 3, 2, 0, 45, 3, 2, 0, 46, 3, 2, 0, 47, 3, 2, 0, 48, 3,
+ 2, 0,251, 0, 2, 0,234, 2, 2, 0, 49, 3,132, 0, 50, 3,127, 0, 40, 0, 2, 0, 17, 0, 2, 0, 51, 3, 2, 0, 52, 3,
+ 2, 0, 53, 3, 7, 0, 54, 3, 2, 0, 55, 3, 2, 0, 56, 3, 7, 0, 57, 3, 2, 0, 58, 3, 2, 0, 59, 3, 7, 0, 60, 3,
+ 7, 0, 61, 3, 7, 0, 62, 3, 7, 0, 63, 3, 7, 0, 64, 3, 7, 0, 65, 3, 4, 0, 66, 3, 7, 0, 67, 3, 7, 0, 68, 3,
+ 7, 0, 69, 3, 71, 0, 70, 3, 71, 0, 71, 3, 71, 0, 72, 3, 0, 0, 73, 3, 7, 0, 74, 3, 7, 0, 75, 3, 30, 0, 63, 0,
+ 2, 0, 76, 3, 0, 0, 77, 3, 0, 0, 78, 3, 7, 0, 79, 3, 4, 0, 80, 3, 7, 0, 81, 3, 7, 0, 82, 3, 4, 0, 83, 3,
+ 4, 0, 84, 3, 7, 0, 85, 3, 7, 0, 86, 3, 7, 0, 87, 3, 75, 0, 88, 3,133, 0, 63, 0, 26, 0, 30, 0, 2, 0,153, 0,
+ 2, 0,241, 0, 2, 0, 15, 1, 2, 0, 89, 3, 7, 0, 90, 3, 7, 0, 91, 3, 7, 0, 92, 3, 7, 0, 93, 3, 7, 0, 94, 3,
+ 7, 0, 95, 3, 7, 0, 96, 3, 7, 0, 97, 3, 7, 0, 36, 1, 7, 0, 38, 1, 7, 0, 37, 1, 7, 0, 98, 3, 4, 0, 99, 3,
+ 7, 0,100, 3, 7, 0,101, 3, 7, 0,102, 3, 7, 0,103, 3, 7, 0,104, 3, 7, 0,105, 3, 7, 0,106, 3, 2, 0,107, 3,
+ 2, 0,240, 0, 4, 0,108, 3, 7, 0,109, 3, 7, 0,110, 3, 7, 0,111, 3, 7, 0,112, 3, 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,119, 3, 7, 0,120, 3, 2, 0,121, 3, 2, 0,122, 3,
+ 2, 0,123, 3, 2, 0,124, 3, 7, 0,125, 3, 7, 0,126, 3, 7, 0,127, 3, 7, 0,128, 3, 2, 0,129, 3, 2, 0,130, 3,
+ 2, 0,131, 3, 2, 0,132, 3, 7, 0,133, 3, 7, 0,134, 3, 7, 0,135, 3, 2, 0,136, 3, 2, 0,137, 3, 7, 0,138, 3,
+ 7, 0,139, 3, 30, 0, 63, 0, 43, 0, 29, 1, 29, 0,129, 0, 33, 0,102, 0,134, 0, 16, 0, 2, 0,140, 3, 2, 0,141, 3,
+ 2, 0,142, 3, 2, 0, 19, 0, 2, 0,143, 3, 2, 0,144, 3, 2, 0,145, 3, 2, 0,146, 3, 2, 0,147, 3, 2, 0,148, 3,
+ 2, 0,149, 3, 2, 0,150, 3, 4, 0,151, 3, 7, 0,152, 3, 7, 0,153, 3, 7, 0,154, 3,135, 0, 8, 0,135, 0, 0, 0,
+135, 0, 1, 0, 4, 0,181, 2, 4, 0,155, 3, 4, 0, 19, 0, 2, 0,156, 3, 2, 0,157, 3, 38, 0,143, 0,136, 0, 13, 0,
+ 9, 0,158, 3, 9, 0,159, 3, 4, 0,160, 3, 4, 0,161, 3, 4, 0,162, 3, 4, 0,163, 3, 4, 0,164, 3, 4, 0,165, 3,
+ 4, 0,166, 3, 4, 0,167, 3, 4, 0,168, 3, 4, 0, 15, 0, 0, 0,169, 3,137, 0, 5, 0, 9, 0,170, 3, 9, 0,171, 3,
+ 4, 0,172, 3, 4, 0, 53, 0, 0, 0,173, 3,138, 0, 12, 0, 4, 0, 17, 0, 4, 0,174, 3, 4, 0,175, 3, 4, 0,176, 3,
+ 4, 0,177, 3, 4, 0,178, 3, 4, 0, 75, 0, 4, 0,179, 3, 4, 0,180, 3, 4, 0,181, 3, 4, 0,182, 3, 4, 0,183, 3,
+139, 0, 4, 0, 4, 0,184, 3, 7, 0,185, 3, 2, 0, 19, 0, 2, 0,186, 3,140, 0, 9, 0,140, 0, 0, 0,140, 0, 1, 0,
+ 0, 0, 16, 0, 54, 0,187, 3, 56, 0,188, 3, 4, 0,181, 2, 4, 0,189, 3, 4, 0,190, 3, 4, 0,191, 3,141, 0,107, 0,
+136, 0,192, 3,137, 0,193, 3,138, 0,194, 3, 4, 0,195, 3, 4, 0,107, 0, 4, 0, 34, 3, 4, 0,196, 3, 4, 0,197, 3,
+ 4, 0,198, 3, 4, 0,199, 3, 2, 0, 19, 0, 2, 0,200, 3, 7, 0,198, 2, 7, 0,201, 3, 7, 0,202, 3, 7, 0,203, 3,
+ 7, 0,204, 3, 7, 0,205, 3, 2, 0,206, 3, 2, 0,207, 3, 2, 0,208, 3, 2, 0,209, 3, 2, 0,191, 0, 2, 0,210, 3,
+ 2, 0,211, 3, 2, 0, 14, 3, 2, 0,212, 3, 2, 0,213, 3, 2, 0, 2, 1, 2, 0, 86, 0, 2, 0,214, 3, 2, 0,215, 3,
+ 2, 0,216, 3, 2, 0,217, 3, 2, 0,218, 3, 2, 0,219, 3, 2, 0,220, 3, 2, 0,221, 3, 2, 0,222, 3, 2, 0,223, 3,
+ 2, 0,224, 3, 2, 0, 3, 1, 2, 0,225, 3, 2, 0,226, 3, 4, 0,240, 0, 2, 0,227, 3, 2, 0,228, 3, 2, 0,229, 3,
+ 2, 0,230, 3, 2, 0,231, 3, 2, 0,232, 3, 2, 0,233, 3, 23, 0,234, 3, 23, 0,235, 3, 22, 0,236, 3, 11, 0,237, 3,
+ 2, 0,238, 3, 2, 0, 15, 0, 7, 0,239, 3, 7, 0,240, 3, 7, 0,241, 3, 7, 0,242, 3, 7, 0,243, 3, 7, 0,244, 3,
+ 7, 0,245, 3, 2, 0,246, 3, 2, 0,247, 3, 2, 0,248, 3, 2, 0,249, 3, 2, 0,250, 3, 2, 0,251, 3, 2, 0,252, 3,
+ 2, 0,253, 3, 2, 0,254, 3, 2, 0,255, 3, 2, 0, 0, 4, 2, 0, 1, 4, 2, 0, 2, 4, 2, 0, 3, 4, 4, 0, 4, 4,
+ 4, 0, 5, 4, 4, 0, 6, 4, 4, 0, 7, 4, 4, 0, 8, 4, 7, 0, 9, 4, 4, 0, 10, 4, 4, 0, 11, 4, 4, 0, 12, 4,
+ 4, 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,
+ 7, 0, 21, 4, 7, 0, 22, 4, 0, 0, 23, 4, 0, 0, 24, 4, 0, 0, 25, 4, 4, 0, 26, 4, 2, 0, 27, 4, 2, 0,251, 0,
+ 0, 0, 28, 4, 7, 0, 29, 4, 7, 0, 30, 4,142, 0, 5, 0, 7, 0, 31, 4, 0, 0, 17, 0, 0, 0, 41, 0, 0, 0, 53, 0,
+ 0, 0,251, 0,143, 0, 5, 0,143, 0, 0, 0,143, 0, 1, 0, 4, 0, 32, 4, 0, 0, 33, 4, 4, 0, 19, 0,144, 0, 4, 0,
+145, 0, 34, 4, 2, 0, 19, 0, 2, 0, 35, 4, 4, 0,251, 0,146, 0, 4, 0, 2, 0, 86, 0, 2, 0, 86, 2, 2, 0, 36, 4,
+ 2, 0, 37, 4,147, 0, 7, 0, 2, 0, 19, 0, 2, 0, 38, 4, 2, 0, 39, 4, 2, 0, 40, 4,146, 0, 41, 4, 7, 0, 42, 4,
+ 4, 0, 43, 4,148, 0, 29, 0, 2, 0, 44, 4, 2, 0, 45, 4, 7, 0, 46, 4, 7, 0, 47, 4, 2, 0, 36, 4, 2, 0, 48, 4,
+ 7, 0, 49, 4, 7, 0, 50, 4, 2, 0, 51, 4, 2, 0, 52, 4, 2, 0, 53, 4, 2, 0, 54, 4, 7, 0, 55, 4, 7, 0, 56, 4,
+ 2, 0, 57, 4, 2, 0, 58, 4, 2, 0, 59, 4, 2, 0, 53, 0,144, 0, 60, 4,147, 0, 61, 4, 7, 0, 62, 4, 7, 0, 63, 4,
+ 0, 0, 64, 4, 0, 0, 65, 4, 0, 0, 66, 4, 0, 0, 67, 4, 0, 0, 68, 4, 0, 0, 69, 4, 0, 0, 70, 4,149, 0, 6, 0,
+ 2, 0, 86, 0, 0, 0, 86, 2, 0, 0, 71, 4, 0, 0, 72, 4, 0, 0, 73, 4, 0, 0, 35, 2,150, 0, 21, 0,151, 0, 74, 4,
+ 43, 0, 29, 1,149, 0, 75, 4,149, 0, 76, 4,149, 0, 77, 4,149, 0, 78, 4,149, 0, 79, 4,149, 0, 80, 4,149, 0, 81, 4,
+ 2, 0, 82, 4, 2, 0, 15, 1, 2, 0, 83, 4, 2, 0,207, 1, 0, 0, 84, 4, 0, 0, 85, 4, 0, 0, 86, 4, 0, 0, 87, 4,
+ 0, 0, 75, 0, 0, 0, 88, 4, 0, 0, 89, 4, 0, 0, 90, 4,152, 0, 40, 0, 26, 0, 30, 0, 38, 0, 91, 4,133, 0, 92, 4,
+152, 0, 93, 4, 40, 0,183, 0, 11, 0, 94, 4,135, 0, 95, 4, 7, 0, 96, 4, 7, 0, 97, 4, 7, 0, 98, 4, 7, 0, 99, 4,
+ 4, 0,181, 2, 7, 0,100, 4, 2, 0,101, 4, 2, 0,102, 4, 2, 0,103, 4, 2, 0,104, 4, 2, 0, 49, 3, 2, 0,105, 4,
+ 2, 0,106, 4, 2, 0, 89, 1, 55, 0,110, 1, 9, 0,107, 4,134, 0,108, 4,142, 0,109, 4,148, 0,110, 4,141, 0,156, 0,
+139, 0,111, 4, 33, 0,102, 0, 11, 0,112, 4, 2, 0,113, 4, 2, 0, 41, 0, 2, 0,114, 4, 2, 0,115, 4,153, 0,116, 4,
+ 2, 0,117, 4, 2, 0,118, 4, 2, 0,234, 2, 2, 0,192, 0,150, 0,119, 4,154, 0, 9, 0, 40, 0,183, 0, 39, 0,230, 0,
+ 7, 0,214, 1, 7, 0,215, 1, 7, 0, 86, 0, 7, 0,120, 4, 7, 0,121, 4, 2, 0,122, 4, 2, 0,123, 4,155, 0, 68, 0,
+156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4, 7, 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,243, 0, 7, 0,135, 4, 7, 0, 40, 0,
+ 2, 0,136, 4, 2, 0, 73, 4, 38, 0, 91, 4, 38, 0,137, 4,154, 0,138, 4,155, 0,139, 4,158, 0,140, 4,159, 0,141, 4,
+160, 0,142, 4, 0, 0,143, 4, 2, 0,142, 3, 2, 0,144, 4, 4, 0,181, 2, 4, 0,145, 4, 2, 0,146, 4, 2, 0,147, 4,
+ 2, 0,148, 4, 0, 0,149, 4, 0, 0, 41, 0, 7, 0, 92, 0, 7, 0,150, 4, 7, 0,151, 4, 7, 0,152, 4, 7, 0,153, 4,
+ 7, 0,154, 4, 7, 0,155, 4, 7, 0,156, 4, 7, 0,150, 0, 7, 0, 96, 4, 2, 0,157, 4, 2, 0,158, 4, 2, 0,159, 4,
+ 2, 0,160, 4, 2, 0,114, 0, 2, 0, 83, 4, 2, 0,161, 4, 2, 0,162, 4, 2, 0,163, 4, 2, 0,164, 4, 7, 0,165, 4,
+ 7, 0,166, 4, 60, 0,167, 4, 11, 0,168, 4, 2, 0,169, 4, 2, 0, 14, 2, 2, 0,170, 4, 2, 0, 19, 0, 2, 0,171, 4,
+ 2, 0,172, 4, 2, 0,251, 0, 2, 0, 53, 0, 9, 0,173, 4,161, 0, 19, 0, 23, 0, 35, 0, 23, 0, 44, 0, 22, 0,174, 4,
+ 22, 0,175, 4, 22, 0,176, 4, 7, 0,177, 4, 7, 0,178, 4, 7, 0,179, 4, 7, 0,180, 4, 2, 0,181, 4, 2, 0,182, 4,
+ 2, 0,183, 4, 2, 0,184, 4, 2, 0,185, 4, 2, 0,186, 4, 4, 0, 19, 0, 7, 0,187, 4, 2, 0,147, 4, 0, 0, 66, 2,
+156, 0, 6, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4,162, 0, 6, 0,
+156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4,163, 0, 26, 0,156, 0, 0, 0,
+156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4, 4, 0,188, 4, 4, 0, 53, 0,161, 0,189, 4,
+ 9, 0,190, 4, 11, 0,191, 4, 30, 0, 63, 0, 26, 0, 64, 0, 0, 0,192, 4, 0, 0,193, 4, 2, 0,194, 4, 2, 0,195, 4,
+ 2, 0,196, 4, 2, 0,197, 4, 2, 0, 46, 0, 2, 0, 45, 0, 2, 0,114, 0, 2, 0,198, 4, 4, 0, 19, 0, 7, 0,199, 4,
+ 23, 0, 35, 0,164, 0, 29, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4,158, 0,140, 4,
+ 2, 0,127, 4, 2, 0,200, 4, 2, 0,201, 4, 2, 0,202, 4, 2, 0,203, 4,161, 0,189, 4, 2, 0,204, 4, 2, 0,114, 0,
+ 2, 0,195, 4, 2, 0,205, 4, 9, 0,206, 4, 2, 0, 83, 4, 0, 0,207, 4, 0, 0,208, 4, 2, 0,209, 4, 2, 0,210, 4,
+ 2, 0,190, 2, 2, 0,211, 4, 2, 0,212, 4, 0, 0, 15, 0, 0, 0, 19, 0, 0, 0, 15, 1, 0, 0,213, 4,165, 0, 15, 0,
+156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4,161, 0,189, 4, 7, 0,214, 1,
+ 7, 0,215, 1, 2, 0,204, 4, 2, 0,120, 4, 2, 0,214, 4, 2, 0, 53, 0, 4, 0, 19, 0, 4, 0, 15, 0,166, 0, 33, 0,
+156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4,167, 0,215, 4, 4, 0,216, 4,
+ 0, 0,217, 4, 0, 0,218, 4, 0, 0,219, 4, 2, 0, 17, 0, 2, 0,220, 4, 2, 0, 19, 0, 2, 0,221, 4, 2, 0,222, 4,
+ 2, 0,223, 4, 2, 0,224, 4, 2, 0, 41, 0, 4, 0, 53, 0, 0, 0,225, 4,168, 0,226, 4, 2, 0,227, 4, 2, 0,228, 4,
+ 2, 0,229, 4, 2, 0,182, 0, 9, 0,230, 4, 9, 0,231, 4, 9, 0,232, 4, 9, 0,233, 4, 9, 0,234, 4, 2, 0,235, 4,
+ 0, 0,236, 4,169, 0, 23, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4,
+161, 0,189, 4, 11, 0,237, 4, 2, 0,195, 4, 2, 0,238, 4, 2, 0, 19, 0, 2, 0,161, 0, 9, 0,206, 4, 11, 0,239, 4,
+170, 0,240, 4, 0, 0,241, 4,171, 0,242, 4, 4, 0,243, 4, 4, 0,244, 4, 2, 0, 17, 0, 2, 0,245, 4, 2, 0,246, 4,
+ 2, 0,247, 4,172, 0, 30, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4,
+161, 0,189, 4, 40, 0, 95, 2, 39, 0,230, 0, 52, 0,248, 4, 2, 0,240, 0, 2, 0,114, 0, 2, 0,249, 4, 2, 0,250, 4,
+ 4, 0, 19, 0, 2, 0,251, 4, 2, 0,198, 4, 2, 0,252, 4, 2, 0,195, 4, 7, 0,120, 4, 0, 0,253, 4, 0, 0,254, 4,
+ 0, 0, 66, 2, 7, 0,214, 1, 7, 0,215, 1, 7, 0,255, 4, 7, 0, 0, 5, 0, 0, 1, 5, 0, 0, 2, 5, 49, 0, 3, 5,
+173, 0, 11, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4, 2, 0,114, 0,
+ 2, 0,198, 4, 2, 0, 4, 5, 2, 0, 19, 0,161, 0,189, 4,174, 0, 22, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4,
+ 7, 0,125, 4,157, 0,126, 4, 2, 0,127, 4, 35, 0, 5, 5, 4, 0, 6, 5, 4, 0, 7, 5, 2, 0, 75, 0, 2, 0,114, 0,
+ 4, 0, 8, 5, 4, 0, 9, 5, 4, 0, 10, 5, 4, 0, 11, 5, 4, 0, 12, 5, 4, 0, 13, 5, 4, 0, 14, 5, 4, 0, 15, 5,
+ 7, 0, 16, 5, 22, 0, 17, 5, 22, 0, 18, 5,175, 0, 10, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,
+157, 0,126, 4,176, 0, 19, 5, 2, 0, 75, 0, 2, 0,114, 0, 4, 0, 41, 0, 9, 0, 20, 5,177, 0, 8, 0,156, 0, 0, 0,
+156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4,161, 0,189, 4, 4, 0, 19, 0, 4, 0, 21, 5,178, 0, 18, 0,
+156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4,161, 0,189, 4, 26, 0, 22, 5, 26, 0, 64, 0,
+ 2, 0, 19, 0, 2, 0,114, 0, 7, 0, 23, 5, 9, 0, 24, 5, 7, 0,214, 1, 7, 0,215, 1, 55, 0,110, 1, 55, 0, 25, 5,
+ 4, 0, 26, 5, 4, 0, 15, 0,179, 0, 42, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4,
+ 2, 0,127, 4,161, 0,189, 4,180, 0, 27, 5, 0, 0,217, 4, 0, 0,218, 4, 0, 0,219, 4, 2, 0, 17, 0, 2, 0,228, 4,
+ 2, 0, 19, 0, 2, 0,221, 4, 9, 0, 24, 5, 4, 0, 28, 5, 4, 0, 29, 5, 4, 0, 30, 5, 4, 0, 31, 5, 22, 0, 32, 5,
+ 22, 0, 33, 5, 7, 0, 34, 5, 7, 0, 35, 5, 7, 0, 36, 5, 7, 0, 23, 5, 2, 0,227, 4, 2, 0,182, 0, 2, 0, 54, 1,
+ 2, 0, 37, 5, 2, 0, 15, 0, 2, 0, 41, 0, 2, 0, 38, 5, 2, 0, 39, 5, 9, 0,230, 4, 9, 0,231, 4, 9, 0,232, 4,
+ 9, 0,233, 4, 9, 0,234, 4, 2, 0,235, 4, 0, 0,236, 4, 49, 0, 40, 5,181, 0, 20, 0, 0, 0, 41, 5, 0, 0, 42, 5,
+ 0, 0, 43, 5, 0, 0, 44, 5, 0, 0, 45, 5, 0, 0, 46, 5, 0, 0, 47, 5, 0, 0, 48, 5, 0, 0, 49, 5, 0, 0, 50, 5,
+ 0, 0, 51, 5, 0, 0, 52, 5, 0, 0, 53, 5, 0, 0, 54, 5, 0, 0, 55, 5, 0, 0, 56, 5, 0, 0, 57, 5, 0, 0, 58, 5,
+ 0, 0,186, 3, 0, 0, 59, 5,182, 0, 48, 0, 0, 0, 60, 5, 0, 0, 51, 5, 0, 0, 52, 5, 0, 0, 61, 5, 0, 0, 62, 5,
+ 0, 0, 63, 5, 0, 0, 64, 5, 0, 0, 65, 5, 0, 0, 66, 5, 0, 0, 67, 5, 0, 0, 68, 5, 0, 0, 69, 5, 0, 0, 70, 5,
+ 0, 0, 71, 5, 0, 0, 72, 5, 0, 0, 73, 5, 0, 0, 74, 5, 0, 0, 75, 5, 0, 0, 76, 5, 0, 0, 77, 5, 0, 0, 78, 5,
+ 0, 0, 79, 5, 0, 0, 80, 5, 0, 0, 81, 5, 0, 0, 82, 5, 0, 0, 83, 5, 0, 0, 84, 5, 0, 0, 85, 5, 0, 0, 86, 5,
+ 0, 0, 87, 5, 0, 0, 88, 5, 0, 0, 89, 5, 0, 0, 90, 5, 0, 0, 91, 5, 0, 0, 92, 5, 0, 0, 93, 5, 0, 0, 94, 5,
+ 0, 0, 95, 5, 0, 0, 96, 5, 0, 0, 97, 5, 0, 0, 98, 5, 0, 0, 99, 5, 0, 0,100, 5, 0, 0,101, 5, 0, 0,102, 5,
+ 0, 0,103, 5, 0, 0,104, 5, 0, 0,105, 5,183, 0, 21, 0,183, 0, 0, 0,183, 0, 1, 0, 0, 0, 16, 0,181, 0,106, 5,
+182, 0,107, 5,182, 0,108, 5,182, 0,109, 5,182, 0,110, 5,182, 0,111, 5,182, 0,112, 5,182, 0,113, 5,182, 0,114, 5,
+182, 0,115, 5,182, 0,116, 5,182, 0,117, 5,182, 0,118, 5,182, 0,119, 5,182, 0,120, 5,182, 0,121, 5, 0, 0,122, 5,
+ 0, 0,123, 5,184, 0, 5, 0, 4, 0, 19, 0, 4, 0, 15, 0, 7, 0, 13, 2, 7, 0,124, 5, 7, 0,174, 1,185, 0, 56, 0,
+ 4, 0, 19, 0, 4, 0,125, 5, 4, 0,126, 5, 0, 0,127, 5, 0, 0,128, 5, 0, 0,129, 5, 0, 0,130, 5, 0, 0,131, 5,
+ 0, 0,132, 5, 0, 0,133, 5, 0, 0,134, 5, 0, 0,135, 5, 2, 0,136, 5, 2, 0,137, 5, 4, 0,138, 5, 4, 0,139, 5,
+ 4, 0,140, 5, 4, 0,141, 5, 2, 0,142, 5, 2, 0,143, 5, 2, 0,144, 5, 2, 0,145, 5, 4, 0,146, 5, 4, 0,147, 5,
+ 2, 0,148, 5, 2, 0,149, 5, 2, 0,150, 5, 2, 0,151, 5, 0, 0,152, 5, 11, 0,153, 5, 2, 0,154, 5, 2, 0,155, 5,
+ 2, 0,156, 5, 2, 0,157, 5,184, 0,158, 5, 2, 0,159, 5, 2, 0,160, 5, 2, 0,161, 5, 2, 0,162, 5, 4, 0,163, 5,
+ 4, 0,164, 5, 4, 0,165, 5, 4, 0,166, 5, 2, 0,167, 5, 2, 0,168, 5, 2, 0,169, 5, 2, 0,170, 5, 2, 0,171, 5,
+ 2, 0,172, 5, 2, 0,173, 5, 2, 0,174, 5, 0, 0,175, 5, 0, 0,176, 5, 7, 0,177, 5, 7, 0, 15, 0, 47, 0,178, 5,
+186, 0, 18, 0, 26, 0, 30, 0, 11, 0,179, 5, 11, 0,180, 5, 11, 0,181, 5,152, 0,182, 5, 2, 0,104, 2, 2, 0,183, 5,
+ 2, 0,105, 2, 2, 0,184, 5, 2, 0,185, 5, 2, 0,186, 5, 2, 0,187, 5, 2, 0,188, 5, 2, 0,189, 5, 2, 0, 15, 0,
+ 2, 0,190, 5, 2, 0,191, 5, 2, 0,192, 5,187, 0, 5, 0,187, 0, 0, 0,187, 0, 1, 0,187, 0,193, 5, 12, 0,194, 5,
+ 4, 0, 19, 0,188, 0, 7, 0,188, 0, 0, 0,188, 0, 1, 0,187, 0,195, 5,187, 0,196, 5, 2, 0,235, 3, 2, 0, 19, 0,
+ 4, 0, 15, 0,189, 0, 17, 0,189, 0, 0, 0,189, 0, 1, 0, 0, 0,197, 5, 0, 0,198, 5, 0, 0,199, 5, 2, 0,200, 5,
+ 2, 0,201, 5, 2, 0,185, 5, 2, 0,186, 5, 2, 0, 19, 0, 2, 0,240, 2, 2, 0,202, 5, 2, 0,203, 5, 2, 0,204, 5,
+ 2, 0,205, 5, 4, 0,206, 5,189, 0,207, 5,157, 0, 30, 0,157, 0, 0, 0,157, 0, 1, 0,187, 0,195, 5,187, 0,196, 5,
+187, 0,208, 5,187, 0,209, 5,186, 0,210, 5, 7, 0,211, 5, 22, 0,233, 1, 22, 0,212, 5, 22, 0,213, 5, 2, 0,214, 5,
+ 2, 0,215, 5, 2, 0,216, 5, 0, 0,124, 4, 0, 0,217, 5, 2, 0,218, 5, 2, 0,219, 5, 0, 0,220, 5, 0, 0,221, 5,
+ 0, 0,222, 5, 0, 0,223, 5, 2, 0,224, 5, 2, 0,225, 5, 2, 0,226, 5, 2, 0, 19, 0, 33, 0,102, 0, 11, 0,227, 5,
+ 11, 0,228, 5, 11, 0,229, 5,190, 0, 11, 0, 0, 0,230, 5, 2, 0,231, 5, 2, 0,232, 5, 2, 0,233, 5, 2, 0,234, 5,
+ 2, 0,235, 5, 2, 0,221, 3, 9, 0,236, 5, 9, 0,237, 5, 4, 0,238, 5, 4, 0,239, 5,191, 0, 1, 0, 0, 0,240, 5,
+192, 0, 7, 0, 49, 0,241, 5,192, 0,242, 5,192, 0,243, 5,192, 0,244, 5, 2, 0,110, 0, 2, 0, 15, 0, 4, 0,245, 5,
+193, 0, 11, 0,193, 0, 0, 0,193, 0, 1, 0, 4, 0,161, 0, 4, 0, 22, 0, 4, 0, 27, 0, 4, 0,246, 5,191, 0,247, 5,
+ 0, 0,218, 4, 4, 0,248, 5, 4, 0,249, 5,192, 0,250, 5,194, 0, 12, 0, 0, 0,137, 1, 9, 0,168, 0, 0, 0,169, 0,
+ 4, 0,172, 0, 4, 0,180, 0, 9, 0,173, 0, 7, 0,175, 0, 7, 0,176, 0, 9, 0,251, 5, 9, 0,252, 5, 9, 0,177, 0,
+ 9, 0,179, 0,195, 0, 40, 0,195, 0, 0, 0,195, 0, 1, 0, 9, 0,253, 5, 9, 0, 25, 0, 0, 0, 26, 0, 2, 0, 19, 0,
+ 2, 0, 17, 0, 4, 0, 22, 0, 4, 0, 67, 2, 4, 0,254, 5, 4, 0,255, 5, 4, 0, 0, 6, 4, 0, 1, 6, 4, 0, 2, 6,
+ 4, 0,191, 0, 4, 0, 3, 6, 4, 0, 4, 6, 7, 0, 5, 6, 7, 0, 6, 6, 4, 0,107, 0,193, 0, 7, 6, 30, 0, 63, 0,
+152, 0,182, 5, 41, 0,116, 0, 7, 0, 8, 6, 7, 0, 9, 6,194, 0,231, 0,195, 0, 10, 6,195, 0, 11, 6,195, 0, 12, 6,
+ 11, 0, 13, 6,196, 0, 14, 6,197, 0, 15, 6, 7, 0, 16, 6, 7, 0, 17, 6, 4, 0, 18, 6, 7, 0, 19, 6, 9, 0, 20, 6,
+ 4, 0, 21, 6, 4, 0, 15, 0,198, 0, 4, 0,198, 0, 0, 0,198, 0, 1, 0, 11, 0, 22, 6,195, 0, 23, 6,199, 0, 6, 0,
+ 11, 0, 24, 6, 11, 0, 13, 6, 11, 0, 25, 6, 2, 0, 19, 0, 2, 0, 15, 0, 4, 0,161, 0,200, 0, 4, 0, 7, 0, 26, 6,
+ 7, 0, 89, 0, 2, 0, 27, 6, 2, 0, 28, 6,201, 0, 6, 0, 7, 0, 29, 6, 7, 0, 30, 6, 7, 0, 31, 6, 7, 0, 32, 6,
+ 4, 0, 33, 6, 4, 0, 34, 6,202, 0, 12, 0, 7, 0, 35, 6, 7, 0, 36, 6, 7, 0, 37, 6, 7, 0, 38, 6, 7, 0, 39, 6,
+ 7, 0, 40, 6, 7, 0, 41, 6, 7, 0, 42, 6, 7, 0, 43, 6, 7, 0, 44, 6, 4, 0, 99, 2, 4, 0, 45, 6,203, 0, 2, 0,
+ 7, 0, 31, 4, 7, 0, 15, 0,204, 0, 5, 0, 7, 0, 46, 6, 7, 0, 47, 6, 4, 0, 75, 0, 4, 0, 68, 2, 4, 0, 48, 6,
+205, 0, 6, 0,205, 0, 0, 0,205, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 49, 6, 2, 0,161, 0,206, 0, 8, 0,
+206, 0, 0, 0,206, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 49, 6, 2, 0,161, 0, 7, 0, 22, 0, 7, 0,107, 0,
+207, 0, 45, 0,207, 0, 0, 0,207, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 49, 6, 2, 0,187, 0, 2, 0, 30, 3,
+ 2, 0, 50, 6, 7, 0, 51, 6, 7, 0, 52, 6, 7, 0,111, 2, 4, 0, 53, 6, 4, 0, 65, 0, 4, 0, 70, 2, 7, 0, 54, 6,
+ 7, 0, 55, 6, 7, 0, 56, 6, 7, 0, 57, 6, 7, 0, 58, 6, 7, 0, 59, 6, 7, 0,109, 2, 7, 0,229, 0, 7, 0, 60, 6,
+ 7, 0, 61, 6, 7, 0, 15, 0, 7, 0, 62, 6, 7, 0, 63, 6, 7, 0, 64, 6, 2, 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, 71, 6, 2, 0, 72, 6, 2, 0,171, 4, 2, 0, 73, 6, 2, 0,158, 1,
+ 2, 0, 74, 6, 0, 0, 75, 6, 0, 0, 76, 6, 7, 0,185, 0,208, 0, 77, 6, 56, 0,111, 1,209, 0, 16, 0,209, 0, 0, 0,
+209, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 49, 6, 2, 0,187, 0, 7, 0,104, 2, 7, 0,105, 2, 7, 0,106, 2,
+ 7, 0,201, 1, 7, 0,107, 2, 7, 0,108, 2, 7, 0, 78, 6, 7, 0,109, 2, 7, 0,110, 2, 7, 0,111, 2,171, 0, 5, 0,
+ 2, 0, 17, 0, 2, 0,245, 5, 2, 0, 19, 0, 2, 0, 79, 6, 26, 0, 22, 5,170, 0, 3, 0, 4, 0, 52, 0, 4, 0, 80, 6,
+171, 0, 54, 0,210, 0, 12, 0,210, 0, 0, 0,210, 0, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,205, 2, 2, 0,173, 1,
+ 7, 0, 4, 0, 7, 0, 5, 0, 7, 0, 81, 6, 7, 0, 82, 6, 26, 0, 22, 5, 11, 0, 83, 6,211, 0, 11, 0,211, 0, 0, 0,
+211, 0, 1, 0, 0, 0, 16, 0, 2, 0, 17, 0, 2, 0, 84, 6, 4, 0, 21, 0, 4, 0, 85, 6, 2, 0, 19, 0, 2, 0, 15, 0,
+ 9, 0, 86, 6, 9, 0, 87, 6,212, 0, 5, 0, 0, 0, 16, 0, 7, 0,243, 0, 7, 0, 88, 6, 4, 0, 89, 6, 4, 0, 15, 0,
+213, 0, 4, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 41, 0, 2, 0, 53, 0,214, 0, 4, 0, 0, 0, 16, 0, 54, 0, 90, 6,
+ 7, 0,243, 0, 7, 0, 15, 0,215, 0, 6, 0, 2, 0, 91, 6, 2, 0, 92, 6, 2, 0, 17, 0, 2, 0, 93, 6, 0, 0, 94, 6,
+ 0, 0, 95, 6,216, 0, 5, 0, 4, 0, 17, 0, 4, 0, 15, 0, 0, 0, 16, 0, 0, 0, 96, 6, 0, 0, 97, 6,217, 0, 6, 0,
+ 0, 0, 16, 0, 0, 0, 98, 6, 2, 0, 99, 6, 2, 0,109, 2, 2, 0,240, 0, 2, 0, 53, 0,218, 0, 5, 0, 0, 0, 16, 0,
+ 7, 0, 89, 0, 7, 0,102, 3, 2, 0, 19, 0, 2, 0, 81, 2,219, 0, 3, 0, 0, 0, 16, 0, 4, 0, 70, 2, 4, 0,100, 6,
+220, 0, 7, 0, 0, 0, 16, 0, 7, 0,102, 3, 0, 0,101, 6, 0, 0,102, 6, 2, 0,240, 0, 2, 0, 41, 0, 4, 0,103, 6,
+221, 0, 3, 0, 38, 0,104, 6, 0, 0,105, 6, 0, 0,106, 6,222, 0, 17, 0,222, 0, 0, 0,222, 0, 1, 0, 2, 0, 17, 0,
+ 2, 0, 84, 6, 2, 0, 19, 0, 2, 0,107, 6, 2, 0,108, 6, 2, 0,109, 6, 2, 0, 41, 0, 2, 0, 53, 0, 0, 0, 16, 0,
+ 9, 0, 54, 0,223, 0,110, 6, 38, 0,239, 0, 2, 0, 37, 4, 2, 0,111, 6, 4, 0, 15, 0,224, 0, 10, 0, 0, 0, 16, 0,
+ 2, 0, 17, 0, 2, 0, 15, 0, 4, 0, 81, 2, 4, 0,112, 6, 4, 0,113, 6, 4, 0,114, 6, 4, 0,115, 6, 4, 0,116, 6,
+ 4, 0,117, 6,225, 0, 1, 0, 0, 0,118, 6,226, 0, 1, 0, 35, 0, 5, 5,223, 0, 18, 0,223, 0, 0, 0,223, 0, 1, 0,
+223, 0,119, 6, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,120, 6, 2, 0,109, 6, 2, 0, 84, 6, 2, 0,121, 6, 2, 0, 53, 0,
+ 2, 0,251, 0, 0, 0, 16, 0, 9, 0, 54, 0,227, 0,110, 6,222, 0,122, 6, 2, 0, 14, 0, 2, 0,123, 6, 4, 0, 49, 3,
+228, 0, 3, 0, 4, 0,124, 6, 4, 0, 15, 0, 38, 0,239, 0,229, 0, 10, 0,123, 0,125, 6, 2, 0, 17, 0, 2, 0, 19, 0,
+ 4, 0, 51, 6, 4, 0, 52, 6, 0, 0, 16, 0, 4, 0,126, 6, 2, 0,127, 6, 2, 0,128, 6, 7, 0,129, 6,230, 0, 10, 0,
+ 2, 0, 19, 0, 2, 0,130, 6, 4, 0, 51, 6, 4, 0, 52, 6, 2, 0,131, 6,196, 0, 14, 6, 2, 0, 17, 0, 2, 0,132, 6,
+ 2, 0,133, 6, 2, 0,134, 6,231, 0, 7, 0, 2, 0, 19, 0, 2, 0,130, 6, 4, 0, 51, 6, 4, 0, 52, 6, 2, 0, 17, 0,
+ 2, 0,135, 6, 7, 0,136, 6,232, 0, 9, 0, 4, 0,124, 6, 2, 0, 17, 0, 2, 0, 19, 0, 38, 0,239, 0, 71, 0,137, 6,
+ 0, 0, 16, 0, 7, 0,138, 6, 2, 0,139, 6, 2, 0, 15, 0,233, 0, 5, 0, 2, 0, 17, 0, 2, 0, 19, 0, 4, 0, 15, 0,
+152, 0,182, 5, 38, 0, 91, 4,234, 0, 5, 0, 4, 0, 19, 0, 4, 0, 17, 0, 0, 0, 16, 0, 0, 0, 96, 6, 38, 0,239, 0,
+235, 0, 10, 0, 4, 0, 19, 0, 4, 0, 17, 0, 7, 0,140, 6, 7, 0,141, 6, 7, 0,234, 0, 7, 0,235, 0, 7, 0,174, 2,
+ 7, 0,177, 2, 7, 0,142, 6, 7, 0,143, 6,236, 0, 9, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0, 51, 6, 4, 0, 52, 6,
+ 0, 0, 16, 0, 2, 0, 41, 0, 2, 0, 44, 0, 2, 0,144, 6, 2, 0,145, 6,237, 0, 8, 0, 38, 0,239, 0, 7, 0,106, 2,
+ 7, 0,146, 6, 7, 0,147, 6, 7, 0,101, 2, 2, 0, 19, 0, 2, 0, 81, 2, 7, 0,148, 6,238, 0, 7, 0, 2, 0, 19, 0,
+ 2, 0,109, 2, 7, 0,149, 6, 7, 0,150, 6, 7, 0,151, 6, 7, 0,152, 6, 7, 0,153, 6,239, 0, 10, 0, 2, 0, 19, 0,
+ 2, 0, 17, 0, 4, 0, 51, 6, 4, 0, 52, 6, 0, 0, 16, 0, 2, 0,186, 3, 2, 0, 44, 0, 2, 0,144, 6, 2, 0,145, 6,
+ 56, 0,111, 1,240, 0, 7, 0, 4, 0, 70, 2, 4, 0,154, 6, 4, 0,155, 6, 4, 0,156, 6, 7, 0,157, 6, 7, 0,158, 6,
+ 0, 0,101, 6,241, 0, 7, 0, 0, 0,159, 6, 38, 0,160, 6, 0, 0,105, 6, 2, 0,161, 6, 2, 0, 41, 0, 4, 0, 53, 0,
+ 0, 0,106, 6,242, 0, 6, 0, 2, 0, 19, 0, 2, 0, 17, 0, 4, 0, 51, 6, 4, 0, 52, 6, 0, 0,162, 6, 0, 0,163, 6,
+243, 0, 1, 0, 4, 0, 19, 0,227, 0, 10, 0,227, 0, 0, 0,227, 0, 1, 0,227, 0,119, 6, 2, 0, 17, 0, 2, 0, 19, 0,
+ 2, 0, 84, 6, 2, 0,164, 6, 0, 0, 16, 0, 9, 0, 54, 0, 38, 0,239, 0,244, 0, 10, 0, 7, 0,199, 2, 7, 0,165, 6,
+ 7, 0,166, 6, 7, 0,167, 6, 7, 0,168, 6, 4, 0, 19, 0, 7, 0,169, 6, 7, 0,170, 6, 7, 0,171, 6, 7, 0, 15, 0,
+196, 0, 20, 0, 26, 0, 30, 0, 0, 0,167, 0,245, 0,172, 6, 9, 0,173, 6, 36, 0,128, 0, 36, 0,174, 6, 9, 0,175, 6,
+ 30, 0, 63, 0, 7, 0,136, 6, 7, 0,176, 6, 7, 0,177, 6, 7, 0,178, 6, 7, 0,179, 6, 7, 0,180, 6, 7, 0,181, 6,
+ 4, 0, 75, 0, 4, 0,182, 6, 0, 0,183, 6, 0, 0,184, 6, 0, 0,185, 6,246, 0, 6, 0, 26, 0, 30, 0, 7, 0,186, 6,
+ 7, 0,187, 6, 7, 0,188, 6, 2, 0,189, 6, 2, 0,190, 6,247, 0, 14, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4,
+ 7, 0,125, 4,157, 0,126, 4,161, 0,189, 4,196, 0, 14, 6, 2, 0,240, 0, 2, 0,130, 6, 2, 0,214, 1, 2, 0,215, 1,
+ 2, 0, 19, 0, 2, 0,198, 4, 4, 0, 53, 0,248, 0, 6, 0,248, 0, 0, 0,248, 0, 1, 0, 38, 0,239, 0, 9, 0,191, 6,
+ 4, 0,192, 0, 4, 0, 15, 0, 56, 0, 4, 0, 26, 0, 30, 0, 11, 0,192, 6, 4, 0,112, 0, 4, 0, 15, 0,249, 0, 25, 0,
+249, 0, 0, 0,249, 0, 1, 0,249, 0, 36, 0, 11, 0,193, 6, 0, 0, 16, 0, 7, 0,194, 6, 7, 0,195, 6, 7, 0,196, 6,
+ 7, 0,197, 6, 4, 0, 19, 0, 7, 0,198, 6, 7, 0,199, 6, 7, 0,200, 6, 7, 0,243, 0, 7, 0,166, 1, 7, 0,201, 6,
+ 7, 0, 68, 2, 7, 0,202, 6, 7, 0,203, 6, 7, 0,204, 6, 7, 0,205, 6, 7, 0,206, 6, 7, 0,151, 0, 2, 0,112, 0,
+ 2, 0, 51, 4,250, 0, 19, 0, 26, 0, 30, 0, 11, 0,207, 6, 11, 0,208, 6, 4, 0, 19, 0, 4, 0,142, 3, 2, 0,112, 2,
+ 2, 0,209, 6, 2, 0,112, 0, 2, 0,210, 6, 2, 0,211, 6, 2, 0,212, 6, 2, 0,213, 6, 2, 0,214, 6, 4, 0,215, 6,
+ 4, 0,216, 6, 4, 0,217, 6, 4, 0,218, 6, 4, 0,219, 6, 4, 0,220, 6,251, 0, 34, 0,251, 0, 0, 0,251, 0, 1, 0,
+ 11, 0,222, 2, 0, 0, 16, 0, 2, 0, 19, 0, 2, 0,221, 6, 2, 0,222, 6, 2, 0,223, 6, 2, 0,188, 2, 2, 0, 53, 0,
+ 4, 0,199, 1, 4, 0,217, 6, 4, 0,218, 6,249, 0,224, 6,251, 0, 36, 0,251, 0,225, 6, 11, 0,226, 6, 9, 0,227, 6,
+ 9, 0,228, 6, 9, 0,229, 6, 7, 0,234, 0, 7, 0,151, 0, 7, 0,148, 1, 7, 0,230, 6, 7, 0,231, 6, 7, 0,180, 2,
+ 7, 0,232, 6, 7, 0,233, 6, 7, 0,234, 6, 7, 0,235, 6, 7, 0,236, 6, 7, 0,237, 6, 7, 0,196, 1, 38, 0,238, 6,
+124, 0, 6, 0, 11, 0,239, 6, 2, 0, 19, 0, 2, 0,240, 6, 7, 0,198, 2, 7, 0,241, 6, 7, 0,242, 6,252, 0, 7, 0,
+252, 0, 0, 0,252, 0, 1, 0, 30, 0, 63, 0, 11, 0,171, 2, 4, 0, 19, 0, 0, 0, 16, 0, 4, 0,243, 6,123, 0, 2, 0,
+ 26, 0, 30, 0, 11, 0,239, 6,253, 0, 15, 0,156, 0, 0, 0,156, 0, 1, 0, 4, 0,124, 4, 7, 0,125, 4,157, 0,126, 4,
+ 2, 0,127, 4,161, 0,189, 4,123, 0,169, 2, 2, 0, 19, 0, 2, 0, 4, 5, 2, 0,195, 4, 2, 0,244, 6, 2, 0,198, 4,
+ 2, 0,245, 6, 7, 0,246, 6,254, 0, 5, 0,254, 0, 0, 0,254, 0, 1, 0, 30, 0, 63, 0, 2, 0, 19, 0, 0, 0,247, 6,
+255, 0, 11, 0,255, 0, 0, 0,255, 0, 1, 0, 9, 0, 54, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0,248, 6, 0, 0,249, 6,
+ 0, 0,247, 6, 7, 0,250, 6, 7, 0,251, 6, 4, 0, 15, 0, 0, 1, 9, 0, 0, 1, 0, 0, 0, 1, 1, 0, 38, 0,252, 6,
+ 0, 0,253, 6, 7, 0,254, 6, 2, 0,255, 6, 2, 0, 19, 0, 2, 0, 17, 0, 2, 0, 15, 0, 1, 1, 7, 0, 35, 0, 5, 5,
+ 25, 0, 0, 7, 4, 0, 19, 0, 4, 0, 1, 7, 11, 0, 2, 7, 38, 0,252, 6, 0, 0,253, 6, 2, 1, 11, 0, 38, 0,252, 6,
+ 2, 0, 3, 7, 2, 0, 19, 0, 4, 0, 4, 7, 0, 0,253, 6, 38, 0, 5, 7, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0,166, 1,
+ 7, 0, 8, 7, 7, 0, 9, 7, 3, 1, 6, 0, 38, 0,252, 6, 4, 0,243, 6, 4, 0, 10, 7, 4, 0, 75, 0, 4, 0, 15, 0,
+ 0, 0,253, 6, 4, 1, 4, 0, 38, 0,252, 6, 4, 0, 19, 0, 4, 0,243, 6, 0, 0,253, 6, 5, 1, 4, 0, 38, 0,252, 6,
+ 4, 0, 19, 0, 4, 0,243, 6, 0, 0,253, 6, 6, 1, 10, 0, 38, 0,252, 6, 4, 0, 11, 7, 7, 0,106, 0, 4, 0, 19, 0,
+ 2, 0,254, 4, 2, 0, 12, 7, 2, 0, 41, 0, 2, 0, 53, 0, 7, 0, 13, 7, 0, 0,253, 6, 7, 1, 4, 0, 38, 0,252, 6,
+ 4, 0, 19, 0, 4, 0,243, 6, 0, 0,253, 6, 8, 1, 10, 0, 38, 0,252, 6, 2, 0, 17, 0, 2, 0, 36, 3, 4, 0, 67, 2,
+ 4, 0, 52, 6, 7, 0,146, 6, 7, 0,147, 6, 4, 0, 15, 0,123, 0,125, 6, 0, 0,253, 6, 9, 1, 4, 0, 38, 0,252, 6,
+ 4, 0,185, 2, 4, 0, 14, 7, 0, 0,253, 6, 10, 1, 5, 0, 38, 0,252, 6, 7, 0,106, 0, 4, 0, 15, 7, 4, 0,185, 2,
+ 4, 0,186, 2, 11, 1, 6, 0, 38, 0,252, 6, 4, 0, 16, 7, 4, 0, 17, 7, 7, 0, 18, 7, 7, 0, 19, 7, 0, 0,253, 6,
+ 12, 1, 16, 0, 38, 0,252, 6, 38, 0,225, 6, 4, 0, 17, 0, 7, 0, 20, 7, 7, 0, 21, 7, 7, 0, 22, 7, 7, 0, 23, 7,
+ 7, 0, 24, 7, 7, 0, 25, 7, 7, 0, 26, 7, 7, 0, 27, 7, 7, 0, 28, 7, 2, 0, 19, 0, 2, 0, 15, 0, 2, 0, 41, 0,
+ 2, 0, 53, 0, 13, 1, 3, 0, 38, 0,252, 6, 4, 0, 19, 0, 4, 0,171, 4, 14, 1, 5, 0, 38, 0,252, 6, 4, 0, 19, 0,
+ 4, 0, 15, 0, 7, 0, 29, 7, 0, 0,253, 6, 15, 1, 10, 0, 38, 0,252, 6, 0, 0,253, 6, 2, 0, 30, 7, 2, 0, 31, 7,
+ 0, 0, 32, 7, 0, 0, 33, 7, 7, 0, 34, 7, 7, 0, 35, 7, 7, 0, 36, 7, 7, 0, 37, 7, 16, 1, 8, 0, 7, 0, 8, 0,
+ 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 38, 7, 7, 0, 39, 7, 2, 0, 19, 0, 2, 0,171, 4, 17, 1, 8, 0,
+ 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 38, 7, 7, 0, 39, 7, 2, 0, 19, 0, 2, 0, 41, 0,
+ 18, 1, 8, 0, 7, 0, 8, 0, 7, 0, 9, 0, 7, 0, 10, 0, 7, 0, 11, 0, 7, 0, 38, 7, 7, 0, 39, 7, 2, 0, 19, 0,
+ 2, 0, 41, 0, 19, 1, 10, 0, 19, 1, 0, 0, 19, 1, 1, 0, 2, 0, 17, 0, 2, 0, 19, 0, 0, 0, 40, 7, 7, 0,194, 0,
+ 7, 0,195, 0, 2, 0,183, 6, 2, 0, 41, 7, 38, 0,239, 0, 20, 1, 22, 0, 20, 1, 0, 0, 20, 1, 1, 0, 2, 0, 19, 0,
+ 2, 0,240, 0, 2, 0, 42, 7, 2, 0, 43, 7, 30, 0, 63, 0,123, 0,125, 6, 38, 0,143, 0, 7, 0, 67, 2, 7, 0, 52, 6,
+ 7, 0, 44, 7, 7, 0, 45, 7, 7, 0, 46, 7, 7, 0, 86, 1, 7, 0, 47, 7, 7, 0,102, 2, 7, 0,126, 6, 7, 0, 48, 7,
+ 0, 0, 49, 7, 0, 0, 50, 7, 11, 0,173, 2, 21, 1, 8, 0, 7, 0,174, 1, 7, 0,146, 6, 7, 0,147, 6, 9, 0, 54, 0,
+ 2, 0, 51, 7, 2, 0, 52, 7, 2, 0, 53, 7, 2, 0, 54, 7, 22, 1, 17, 0, 22, 1, 0, 0, 22, 1, 1, 0, 0, 0, 16, 0,
+ 21, 1, 55, 7, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0, 56, 7, 2, 0, 57, 7, 2, 0, 58, 7, 2, 0, 59, 7, 4, 0, 41, 0,
+ 7, 0, 60, 7, 7, 0, 61, 7, 4, 0, 62, 7, 4, 0, 63, 7, 22, 1, 64, 7, 23, 1, 65, 7, 24, 1, 29, 0, 24, 1, 0, 0,
+ 24, 1, 1, 0, 24, 1, 66, 7, 0, 0, 16, 0, 2, 0, 17, 0, 2, 0, 19, 0, 2, 0,246, 5, 2, 0, 16, 6, 2, 0, 67, 7,
+ 2, 0,114, 0, 2, 0, 57, 7, 2, 0,245, 5, 11, 0,120, 6, 11, 0, 68, 7, 26, 0, 22, 5, 9, 0, 69, 7, 7, 0, 60, 7,
+ 7, 0, 61, 7, 7, 0,201, 1, 7, 0, 70, 7, 2, 0, 71, 7, 2, 0, 72, 7, 2, 0, 73, 7, 2, 0, 74, 7, 23, 0, 75, 7,
+ 23, 0, 76, 7, 23, 0, 77, 7, 25, 1,129, 0, 26, 1, 78, 7, 23, 1, 6, 0, 23, 1, 0, 0, 23, 1, 1, 0, 24, 1, 79, 7,
+ 24, 1, 80, 7, 22, 1, 81, 7, 22, 1, 64, 7, 55, 0, 13, 0, 26, 0, 30, 0, 11, 0, 82, 7, 11, 0, 83, 7, 21, 1, 84, 7,
+ 4, 0, 17, 0, 4, 0, 85, 7, 4, 0, 86, 7, 4, 0, 87, 7, 11, 0, 88, 7, 26, 1, 89, 7, 9, 0, 90, 7, 9, 0, 91, 7,
+ 4, 0, 92, 7, 27, 1, 6, 0, 4, 0,105, 0, 4, 0,107, 0, 4, 0,245, 5, 0, 0, 93, 7, 0, 0, 94, 7, 2, 0, 15, 0,
+ 28, 1, 11, 0, 2, 0,185, 5, 2, 0,186, 5, 2, 0, 95, 7, 2, 0,166, 6, 2, 0, 96, 7, 2, 0, 41, 0, 7, 0,101, 2,
+ 2, 0, 2, 1, 0, 0, 97, 7, 0, 0,154, 3, 4, 0, 53, 0, 29, 1, 3, 0, 7, 0, 98, 7, 7, 0, 99, 7, 7, 0, 14, 0,
+ 30, 1, 7, 0, 0, 0,137, 1, 2, 0,223, 3, 2, 0,224, 3, 2, 0,225, 3, 2, 0,174, 3, 4, 0,107, 0, 4, 0, 34, 3,
+ 31, 1, 7, 0, 7, 0,100, 7, 7, 0,101, 7, 7, 0,102, 7, 7, 0,210, 1, 7, 0,103, 7, 7, 0,104, 7, 7, 0,105, 7,
+ 32, 1, 4, 0, 2, 0,106, 7, 2, 0,107, 7, 2, 0,108, 7, 2, 0,109, 7, 33, 1, 2, 0, 0, 0,145, 0, 0, 0,110, 7,
+ 34, 1, 1, 0, 0, 0, 16, 0, 35, 1, 10, 0, 0, 0,111, 7, 0, 0,112, 7, 0, 0,113, 7, 0, 0,114, 7, 2, 0, 95, 7,
+ 2, 0,115, 7, 7, 0,116, 7, 7, 0,117, 7, 7, 0,118, 7, 7, 0,138, 1, 36, 1, 11, 0, 0, 0,225, 3, 0, 0, 17, 0,
+ 0, 0,119, 7, 0, 0, 89, 0, 0, 0,120, 7, 0, 0, 86, 0, 0, 0, 35, 2, 7, 0,121, 7, 7, 0,122, 7, 7, 0,123, 7,
+ 7, 0,124, 7, 37, 1, 8, 0, 7, 0, 91, 6, 7, 0,106, 0, 7, 0,154, 3, 7, 0, 30, 2, 7, 0,125, 7, 7, 0,181, 0,
+ 7, 0,126, 7, 4, 0, 17, 0, 38, 1, 4, 0, 2, 0,127, 7, 2, 0,128, 7, 2, 0,129, 7, 2, 0, 15, 0, 39, 1, 4, 0,
+ 7, 0, 4, 0, 7, 0, 5, 0, 2, 0, 19, 0, 2, 0,130, 7, 40, 1, 10, 0, 2, 0, 16, 3, 2, 0, 19, 0, 7, 0,102, 3,
+ 7, 0,131, 7, 7, 0,132, 7, 7, 0,133, 7, 7, 0,134, 7, 39, 1,135, 7, 39, 1,136, 7, 39, 1,137, 7, 52, 0, 9, 0,
+ 4, 0, 19, 0, 4, 0, 44, 0, 23, 0,138, 7, 23, 0,139, 7, 40, 1,140, 7, 7, 0,141, 7, 7, 0,142, 7, 7, 0,143, 7,
+ 7, 0, 86, 1, 41, 1, 4, 0, 40, 0, 95, 2, 7, 0,144, 7, 7, 0, 44, 1, 7, 0, 15, 0,145, 0, 13, 0, 26, 0, 30, 0,
+ 2, 0, 19, 0, 2, 0,121, 4, 4, 0, 86, 0, 7, 0,145, 7, 7, 0,207, 1, 7, 0,146, 7, 7, 0,147, 7, 7, 0, 44, 1,
+ 2, 0, 15, 1, 2, 0, 15, 0, 43, 0, 29, 1, 41, 1,148, 7, 42, 1, 8, 0, 4, 0, 17, 0, 4, 0,106, 0, 4, 0, 19, 0,
+ 4, 0,240, 2, 4, 0,149, 7, 0, 0,150, 7, 0, 0, 16, 0, 9, 0, 54, 0, 81, 0, 5, 0, 42, 1,151, 7, 4, 0,152, 7,
+ 4, 0,153, 7, 4, 0,154, 7, 4, 0, 15, 0, 43, 1, 5, 0, 7, 0, 26, 2, 7, 0,124, 6, 7, 0,166, 1, 2, 0,155, 7,
+ 2, 0, 15, 0, 44, 1, 5, 0, 7, 0, 26, 2, 7, 0,156, 7, 7, 0,157, 7, 7, 0,158, 7, 7, 0,124, 6, 45, 1, 7, 0,
+ 4, 0,159, 7, 4, 0,160, 7, 4, 0,161, 7, 7, 0,162, 7, 7, 0,163, 7, 7, 0,164, 7, 7, 0,165, 7, 46, 1, 25, 0,
+ 38, 0,166, 7, 44, 1,167, 7, 43, 1,168, 7, 44, 1, 77, 6, 7, 0,169, 7, 7, 0,170, 7, 7, 0,171, 7, 7, 0,172, 7,
+ 7, 0,163, 7, 7, 0,164, 7, 7, 0,124, 6, 7, 0,111, 2, 7, 0,173, 7, 7, 0,174, 7, 7, 0, 86, 0, 7, 0,175, 7,
+ 4, 0,159, 7, 4, 0,176, 7, 4, 0, 15, 0, 4, 0, 65, 0, 4, 0,177, 7, 2, 0, 19, 0, 2, 0,178, 7, 2, 0,179, 7,
+ 2, 0, 14, 3, 47, 1,102, 0, 26, 0, 30, 0, 4, 0, 19, 0, 2, 0, 17, 0, 2, 0, 30, 7, 2, 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, 2, 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,158, 1, 2, 0, 70, 6, 2, 0, 45, 6,
+ 2, 0,195, 7, 2, 0,196, 7, 2, 0, 12, 3, 2, 0, 13, 3, 2, 0,197, 7, 2, 0,198, 7, 2, 0,199, 7, 2, 0,200, 7,
+ 2, 0,201, 7, 2, 0,202, 7, 7, 0,203, 7, 7, 0,204, 7, 7, 0,205, 7, 7, 0, 51, 6, 7, 0, 52, 6, 7, 0,111, 2,
+ 7, 0, 58, 6, 7, 0,206, 7, 7, 0,207, 7, 7, 0,208, 7, 4, 0, 53, 6, 4, 0, 50, 6, 4, 0,209, 7, 7, 0, 54, 6,
+ 7, 0, 55, 6, 7, 0, 56, 6, 7, 0,210, 7, 7, 0,211, 7, 7, 0,212, 7, 7, 0,213, 7, 7, 0,214, 7, 7, 0,215, 7,
+ 7, 0,216, 7, 7, 0,199, 2, 7, 0, 86, 0, 7, 0,217, 7, 7, 0,218, 7, 7, 0,219, 7, 7, 0,220, 7, 7, 0,221, 7,
+ 7, 0,222, 7, 7, 0, 68, 2, 7, 0,223, 7, 7, 0,224, 7, 4, 0,225, 7, 7, 0,226, 7, 7, 0,227, 7, 7, 0,228, 7,
+ 7, 0,229, 7, 7, 0,230, 7, 7, 0,231, 7, 7, 0,232, 7, 7, 0,233, 7, 7, 0, 8, 3, 7, 0, 6, 3, 7, 0, 7, 3,
+ 7, 0,234, 7, 7, 0,235, 7, 7, 0,236, 7, 7, 0,237, 7, 7, 0,238, 7, 7, 0,239, 7, 7, 0,240, 7, 7, 0,241, 7,
+ 7, 0,242, 7, 7, 0,243, 7, 7, 0,244, 7, 7, 0,245, 7, 7, 0,246, 7, 7, 0,247, 7, 7, 0,248, 7, 7, 0,249, 7,
+ 7, 0,250, 7, 0, 0,251, 7, 56, 0,228, 2, 56, 0,252, 7, 38, 0,253, 7, 38, 0,254, 7, 30, 0, 63, 0,125, 0,226, 2,
+117, 0, 33, 0,117, 0, 0, 0,117, 0, 1, 0, 47, 1,255, 7, 46, 1, 15, 3, 45, 1,225, 6, 48, 1, 0, 8, 49, 1, 1, 8,
+ 49, 1, 2, 8,126, 0,227, 2, 38, 0, 3, 8, 38, 0, 4, 8, 38, 0, 5, 8, 11, 0, 6, 8, 11, 0, 7, 8, 7, 0,185, 0,
+ 7, 0,195, 3, 4, 0, 70, 2, 4, 0, 19, 0, 4, 0, 53, 6, 4, 0, 8, 8, 4, 0, 9, 8, 4, 0, 10, 8, 4, 0,161, 0,
+ 2, 0,192, 0, 2, 0, 11, 8, 2, 0, 12, 8, 2, 0, 13, 8, 2, 0,220, 2, 2, 0, 14, 8, 0, 0, 15, 8, 2, 0, 16, 8,
+ 2, 0, 17, 8, 2, 0, 18, 8, 69, 78, 68, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
diff --git a/source/blender/src/prvicons.c b/source/blender/src/prvicons.c
new file mode 100644
index 00000000000..6222090705a
--- /dev/null
+++ b/source/blender/src/prvicons.c
@@ -0,0 +1,436 @@
+/* DataToC output of file <prvicons> */
+
+int datatoc_prvicons_size= 13732;
+char datatoc_prvicons[]= {
+137, 80, 78, 71,
+ 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0, 0, 0,192, 0, 0, 0,192, 8, 6, 0, 0, 0, 82,220,108, 7, 0, 0, 0,
+ 6, 98, 75, 71, 68, 0, 0, 0, 0, 0, 0,249, 67,187,127, 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,215, 8, 27, 17, 57, 33, 43,142, 73,203, 0, 0, 0, 29,116, 69, 88,116, 67,
+111,109,109,101,110,116, 0, 67,114,101, 97,116,101,100, 32,119,105,116,104, 32, 84,104,101, 32, 71, 73, 77, 80,239,100, 37,110,
+ 0, 0, 32, 0, 73, 68, 65, 84,120,218,237,125,121,124, 84,213,249,254,115,238,189, 51,147,201,158, 12, 73, 72,216, 3,200, 98,
+ 88, 69, 66, 38, 65, 16, 20,165, 40,213,162, 32, 45,138,203, 79,176,223, 42,180,110, 72,235,190, 97, 91, 91, 21,181,149,182, 90,
+ 20, 42, 10, 66, 80,164, 34, 59,146, 5,194, 30, 18, 8, 75, 2,201,144,144,201, 62, 73,102,189,247,158,243,251, 35,235, 36, 51,
+217,200,100, 38,229, 62,159,207,124,146,123,239,153, 59,207, 61,247,125,207,121,223,247,156,243, 30, 64,129, 2, 5, 10, 20, 40,
+ 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2,
+ 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,
+160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5,
+ 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160,
+ 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,160, 64,129, 2, 5, 10, 20, 40, 80,208, 18, 36, 41, 41,105,
+180, 32, 8,143, 16, 66, 72,119,223,156, 49, 22, 46,203,242,112,198,216,203, 41, 41, 41,251, 60,241, 0,189,157,191, 2,239, 43,
+192, 61, 49, 49, 49, 27,230,204,153,227,215,157, 55,206,206,206,198,169, 83,167, 16, 25, 25, 9,131,193, 64, 37, 73,154,150,146,
+146,146,226, 1, 5,232,213,252, 21,120, 23, 2, 0, 68, 71, 71,219, 23, 46, 92,216,109, 2,180,105,211, 38, 24, 12, 6, 60,250,
+232,163,224, 56, 14, 7, 15, 30,228, 50, 51, 51, 15, 36, 38, 38, 38,164,166,166,102,116,247, 67,244,118,254, 10,188, 7,174,187,
+111, 40, 73, 18,214,175, 95,143, 5, 11, 22,160,111,223,190,240,247,247, 71, 98, 98, 34,226,226,226, 56,149, 74,149,174,215,235,
+ 39,250,114,133,244,118,254, 10,188,172, 0, 6,131, 1,193,193,193,136,136,136,128, 32, 8,208,106,181,208,106,181,208,235,245,
+ 24, 57,114, 36,167, 86,171, 51,244,122,125,156,175, 86, 72,111,231,175,192,203, 10, 80, 88, 88, 8,157, 78,215,120,172,209,104,
+ 26,133, 40, 49, 49, 17,195,135, 15,231,213,106,245,137,132,132,132, 27,124,177, 66,122, 59,127, 5, 94, 86,128,192,192, 64, 88,
+173, 86,167,115,254,254,254,141,159,164,164, 36,196,198,198, 10,126,126,126, 89,122,189, 62,214,215, 42,164,183,243, 87,224,101,
+ 5,208,233,116, 48,153, 76,173,206, 55,180,162, 90,173, 22, 73, 73, 73, 24, 56,112,160, 74,163,209,156,213,235,245, 3,124,169,
+ 66,122, 59,127, 5,157,131,208,221, 55,140,138,138, 66, 77, 77, 13,172, 86, 43,180, 90, 45, 0,160,170,170, 10,165,165,165, 40,
+ 47, 47, 71,105,105, 41, 44, 22, 11, 6, 15, 30, 12, 81, 20,213, 87,175, 94, 61,175,215,235,135,164,165,165, 21,251, 66,133,244,
+118,254, 10,188,172, 0,106,181, 26,227,199,143, 71, 78, 78, 14,116, 58, 29, 14, 28, 56,128,130,130, 2,196,198,198, 34, 42, 42,
+ 10, 67,135, 14, 5,207,243, 72, 77, 77,133,209,104,132, 40,138,126, 26,141, 38, 79,175,215, 15, 74, 75, 75, 43,245,118,133,244,
+118,254, 10,188,172, 0, 0, 48,109,218, 52,124,250,233,167, 16, 69, 17,143, 63,254, 56,102,206,156, 9,181, 90,237, 84,102,209,
+162, 69, 48,153, 76, 88,183,110, 29,182,108,217,162,165,148,190, 9,224, 9, 0,204,219,149,210,219,249, 43,240,162, 15, 0, 0,
+ 9, 9, 9, 8, 12, 12,196, 71, 31,125,132,217,179,103,183, 18,158, 6,132,132,132,224,201, 39,159,132, 70,163, 97, 86,171,117,
+108,104,104,104,127, 0,196,219,149,210,219,249, 43,240,178, 2, 4, 5, 5, 97,205,154, 53,136,137,137,233, 80,249, 33, 67,134,
+ 72, 86,171,213,204,243,252,253,190, 32, 64,189,157,191, 2, 47, 43, 0, 0, 8, 66,199,173, 43, 63, 63, 63, 70, 41,149, 24, 99,
+ 26, 95, 17,160,222,206, 95,129,151, 21,160,139,144,123,121,125,202,138, 72, 41, 10,208, 37, 16, 66,100, 66, 72,175, 21,160,222,
+206,255,122,133,208, 19, 63, 98,178,216,193, 24,131, 74,224, 17,160, 81,185,109, 61, 25, 99, 50,122,111, 20,165,183,243, 87, 20,
+192, 19,200, 45,174,194,152,103, 62, 5, 0, 68,135, 5,226,252,234, 37,224,185,122, 51,153, 81, 56,142,252, 11,183, 71, 92,225,
+ 39,223, 22, 56, 50, 88,173,213,234, 99,111,136,134, 64,254, 25,249,155,244,139,158,230,166, 82,185, 85, 70,136,162,216,217, 30,
+128, 2,160,138, 15,160, 40,128, 19, 62, 63,112,186,241,255,171,149,181,248,241,100, 30,126, 54,113, 40, 0,128,154,174,192,126,
+124, 61,146,194,192, 35, 76, 51, 28,192,112, 0,183, 17,137,255,216,155,194,223,145,235, 45,148,132, 1,104, 48,129,148, 30, 64,
+241, 1,234,109, 2,202,240,159,159,178,157,206,125,113, 32,171,241,127, 90,118,190,213,119, 24, 80, 30,190, 60,165,192,155,194,
+223,197,251, 80,197, 9, 86, 20,192, 9, 59, 79, 93,194,213, 42, 51,180,234,166,142,230,135, 19,121, 40,173,182,212, 41, 72,217,
+ 5,184,208,128, 19,189,169, 2,155, 41, 1,173,247, 1, 20, 40, 10,224,220,218,191,255,240, 76, 52, 44, 89, 23,101,138, 13, 41,
+103,234, 36,166,212,101, 15,112,220,215, 43, 77, 20, 69,167, 15, 0, 13,165, 20, 0,244, 0,120, 69,172, 20, 5, 64,105,181, 5,
+255, 61,158,139, 65, 17, 33, 88,116, 75, 28,102,196, 13,106,230, 23,100,213,247, 0, 46, 20,128,178,227,189,173, 18, 25, 99, 0,
+ 16, 7,160, 76,241, 1, 20, 39, 24, 0,176, 33,229, 12, 68,153,226,161,105, 55,130, 16,224,161,105, 99,176,231,116, 62, 0,224,
+236,149,114,100,100,102, 97,148,189,166,213,247,204,140,157, 0,128,146,143,167, 7,242,212, 54, 7,192, 72, 70,137,131,227,113,
+ 90,148,232,145,168,223, 30, 54,250,168, 2,252, 4,160, 90, 17, 41,165, 7,104,108,229, 57, 66,240,224,180,186,229,179,115, 39,
+ 13, 67, 88, 64, 83,226,134,181,123, 91,155,250,162,204, 44,187,114,228, 75,229,171,227,159,225,101, 91, 49, 24,190, 2,195,171,
+132,176,183, 25,101,219, 4,142,228, 85,172, 78, 88,234,139, 21,233,112, 56,202, 25, 99,134,122,103, 88,193,245,172, 0, 71,115,
+139,113,246, 74, 57,102,142, 25,132,254,225, 65, 0, 0,141,138,199,130,196, 81,141,101, 54,159, 42,133, 85,118, 54,151,171,172,
+180,224, 23,113,170,117, 0,121, 23, 64,128,139, 91,251, 51,176, 79,202, 62, 72, 88,229,131,117, 25, 98,179,217,250,195,247,166,
+151, 40,232,105, 5, 88,187,191, 46,246,191,120,250, 24,167,243, 15, 79,111, 74,166, 80,227, 96,216, 86,230, 60,219, 82, 23,192,
+ 15, 35,192,130,246,238, 79, 8,123,166,236,189, 41,163,188, 85,105, 42,149,170, 85, 40,149, 16, 2, 74,169, 77, 81,128,235, 92,
+ 1, 44,118, 17,223,164,159,131, 46, 72,139,187,110, 26,234,116,109,236,160, 72,140, 27, 28,217,228, 39, 24, 7, 57,147, 33, 16,
+ 24, 96, 7,240, 79, 2,242, 75, 2,242, 75, 6, 28,112, 37,131,132,195,115,222,170,180,102,209,159, 70,225,231, 56, 14, 42,149,
+234, 40,234,162, 64,202,104,240,245,170, 0, 91,143, 92, 64,181,213,142, 7, 18, 71, 65, 45,180,142, 8, 62,220,172, 87, 72,175,
+ 14,199,101, 91,147,165, 67, 41,236,162,204,238,214, 45, 59,180, 36,124, 89,250,134,240,101,233, 27,116, 21,126,183, 1,200,105,
+221, 13,224,198,107, 17, 96, 15, 33,166,222, 7, 96, 0, 84,138,120, 93,135, 10,208, 16,251, 95, 60,205,117,238,168,249,250,145,
+240, 19,184,250,232, 9,193,134,226,129,141,215, 14, 92, 52,255, 43,250,119,135,247, 56,201,249,171,251, 37, 66, 88,178,139,216,
+139, 79,229,229,169,207,205, 43,212,127, 72,125,221,106, 20, 17,187,142, 20,224, 82,137, 9, 7,207, 26, 48, 49, 54, 10,113, 3,
+ 35, 92,150, 9, 11,240,195, 93,195,154,150, 24,126,109, 28, 8,153, 17, 88, 37, 88, 95,218,102,220,233, 70,188,170, 92,156,243,
+243,149, 74,164,148,130, 82, 10, 73,146, 56, 0, 13,221,139, 31,234,204, 57, 5, 62,140,110, 29, 7,248,226, 64, 22, 24, 3,146,
+ 70, 14, 64,102,126,137,219,114, 19,131, 42,241, 13,234, 82,142, 92,117,248, 97,127,101, 36, 2,107, 11, 47, 24,107, 36,171,171,
+242,140,161,159,139,211, 62,149,129,161,190, 7, 16,209, 52, 16,102, 82,196,235, 58, 82, 0,202, 24,214,255, 84,103,254,172,254,
+239, 81,172,254,239,209, 54, 74,107,157,142, 54, 24, 7,226, 94,114,165,202,221,130, 18, 2, 50,136,181, 30, 96,205,242, 86,165,
+ 53, 68,128,154,251, 18,140, 49,112, 28, 39,214,215,169,168,136,214,117,166, 0,187, 78, 93, 70, 97, 69, 45,166,142, 26,128,219,
+199, 14,118, 95, 80,118,192,126,116, 45, 14,155,194,177,187, 50, 10, 0,240, 99,121, 95,220,168,209, 88, 40,165,173,166, 19,151,
+175,142, 15,102, 96,183,182,234, 21, 0,175,231,234, 87,169, 84, 78, 74,192,113,156, 67, 49,123,174, 83, 5,104,112,126, 95,186,
+ 79,143,164,145,253,221,150,147,138, 78,192,106, 60,143,139,186, 64,236, 62, 86,167, 0, 14,198,225, 44, 63,108, 24, 33, 57,178,
+ 11,211,226, 9,198, 16,220,178,195,225,101,124,233, 11, 21,216,208, 27,168, 84, 42,155, 90,173,110,112,128, 21, 92, 79, 78,112,
+121,141, 21,219,143,231, 98, 72,100, 8, 18, 71,244,111,219, 84,170,159, 1, 58,204,191, 22, 55, 7, 87, 52,158, 63, 45,247, 31,
+ 76,235,167, 84, 54,160,236,195,201, 51, 24,195, 75, 46,140,162, 45, 97,191, 59,116,217,135,236,255, 82, 65, 16,120, 40, 19,225,
+174,207, 30,224,171,212,179,112, 72, 50, 22,221,114, 35,218,219,169,171,249, 26,128, 95, 70,229,227, 72,117, 56, 0, 32,207, 22,
+ 36,124,241,127,250, 79,110,139,170,120,141,112, 40,231, 25,110,167, 12,207,160,117, 40,209,194,113,228, 89, 95,170, 68,158,231,
+ 3,120,158,175, 97,140, 29,135, 50, 23,232,250,235, 1,214,238, 63, 13,142, 16, 44,186,165,253,125, 35,154,175, 2,251,121, 68,
+ 33,252, 57,169,241,120,111,109,255, 49, 60,193, 55, 28,195, 62, 6,252,158,180, 22,126, 10, 66, 30, 14,123, 50, 45,223,199,234,
+145, 17, 66,168, 39, 54,234, 83,224,163, 61, 64, 65, 89, 53,118,158,186,132,242, 26, 43,178, 13,101,232, 23, 30,136, 31, 79,230,
+ 1, 0,126, 54,113, 40, 98,194, 2, 91, 75,137,100, 3,173, 42, 64,165,164,198,119,165,117,243,128, 6,105, 45, 56,107,174, 51,
+241,183,148,246,199,232,128,186, 25,197,183,134,149, 96,160,159,197,201,125, 32,192,178,240,167,210, 55,249, 82, 5,138,162,216,
+ 16, 2,149, 91,154,112, 10,254,135, 21, 32,203, 80,134,101,159,237,110, 60, 46,172,168,109, 60, 30,214, 55,204,165, 2,208,242,
+ 92,128, 81, 20,219,253,240,252,197,113,173,174, 87, 75,170,198,243,159,141,202,104,174, 0, 57,132,224,255,133, 63,117, 40,181,
+ 59, 5,247, 90,215, 6, 55, 68,128, 24, 99,168,239, 1, 20, 5,184, 94, 20, 32,126, 88, 52,118,252, 97,190,203,107, 99, 7,185,
+ 30, 5,230,130,251, 65, 59,247, 3,140,112,200,216, 62,185,166,222,129,228,177,230,235, 31,109,135,207,228,173, 11, 12,208,156,
+126,112, 28, 25, 30,161,178, 15, 25, 27,100,178, 1,200, 97,132,238,235,243, 84,198, 94, 79,181,222,157, 77,141, 34, 73, 82,171,
+180,137,132, 16, 48,198,168, 44,203, 65,138, 72, 93, 39, 10,160, 11,210,226,150,209,157,219, 28,133,104, 67, 33,104, 39, 32, 4,
+192,173,131,155,206,127,191,245, 59, 57,220,116,225, 66,126,102,254,174, 63,236, 48,125,212,147,209,148,206, 78,140,115,151, 51,
+ 84,201, 12,119, 29, 59,193,221,132,222, 46, 64,138, 2,244,214, 30,192,100, 50, 9, 25, 25,222,219,255,217,100, 50,241,132, 16,
+ 42,203,178,220,197,239,247,106,254, 10,188,171, 0,198,226,226,226, 83,171, 86,173,226,237,118,123, 52, 99, 76,141,186,176, 30,
+234, 77, 17,214,204, 36, 97,132,144,198,255, 91, 94,115,119,189,197,189, 90,150,101,178, 44,203,146, 36,149,212, 59,145,157, 53,
+127,122, 59,127, 5, 94, 68,243,184, 53,167,211,233,150, 3,232,139,166, 44,103, 50, 99, 76, 34,132,200,140, 49,153, 16, 34, 53,
+ 59, 71,155, 93,107, 56, 47, 19, 66,164,250, 4, 81,114,195, 53, 66,136, 76, 41,149, 90, 28,203, 13,118, 51,165, 84,146,101, 89,
+ 98,140, 89,204,102,243,149,174,154,115,189,156,191, 2, 47, 43, 0, 9, 12, 12,140,230, 56, 78, 77, 8, 97,245, 19,189, 26, 91,
+185,134, 86,176,249,113,125,232,143, 1,128,195,225,112,106, 65, 9, 33,172,217,167,161, 44, 44, 22,139,211, 61, 56,142, 99,132,
+ 16, 86, 89, 89,201,234,133,182,171, 51, 41,123, 59,127, 5, 94, 86, 0, 87,199, 29, 5,243,209,231,233,109,252, 21,244,180,192,
+ 36, 37, 37,141, 22, 4,225, 17, 79, 12,227, 51,198,194,101, 89, 30,206, 24,123, 57, 37, 37,101,159, 39, 30, 64,225,175,240,191,
+ 86, 5,184, 39, 38, 38,102,195,156, 57,115,186,117,137, 97,118,118, 54, 78,157, 58,133,200,200, 72, 24, 12, 6, 42, 73,210,180,
+148,148,148, 20, 15,188, 0,133,191,194,255,154,162, 64,136,142,142,182, 47, 92,184,176,219, 30, 96,211,166, 77, 48, 24, 12,120,
+244,209, 71,193,113, 28, 14, 30, 60,200,101,102,102, 30, 72, 76, 76, 76, 72, 77, 77,237,246,120,165,194, 95,225,223, 85,116,251,
+ 64,152, 36, 73, 88,191,126, 61, 22, 44, 88,128,190,125,251,194,223,223, 31,137,137,137,136,139,139,227, 84, 42, 85,186, 94,175,
+159,232,203, 54,161,194,255,250,226,223,237, 10, 96, 48, 24, 16, 28, 28,140,136,136, 8, 8,130, 0,173, 86, 11,173, 86, 11,189,
+ 94,143,145, 35, 71,114,106,181, 58, 67,175,215,199,249,234, 11, 80,248, 95, 95,252,187, 93, 1, 10, 11, 11,161,211,233, 26,143,
+ 53, 26, 77,227, 67, 36, 38, 38, 98,248,240,225,188, 90,173, 62,145,144,144,112,131, 47,190, 0,133,255,245,197,191,219, 21, 32,
+ 48, 48, 16, 86,171,115,118, 19,127,127,255,198, 79, 82, 82, 18, 98, 99, 99, 5, 63, 63,191, 44,189, 94, 31,235,107, 47, 64,225,
+127,125,241,239,118, 5,208,233,116, 48,153, 90,167,196,105,208, 98,173, 86,139,164,164, 36, 12, 28, 56, 80,165,209,104,206,234,
+245,250, 1,190,244, 2, 20,254,215, 23,255,110,223, 32, 35, 42, 42, 10, 53, 53, 53,176, 90,173,208,106,235,242,255, 84, 85, 85,
+161,180,180, 20,229,229,229, 40, 45, 45,133,197, 98,193,224,193,131, 33,138,162,250,234,213,171,231,245,122,253,144,180,180,180,
+ 98, 95,120, 1, 10,255,235,139,127,183, 43,128, 90,173,198,248,241,227,145,147,147, 3,157, 78,135, 3, 7, 14,160,160,160, 0,
+177,177,177,136,138,138,194,208,161, 67,193,243, 60, 82, 83, 83, 97, 52, 26, 33,138,162,159, 70,163,201,211,235,245,131,210,210,
+210,188,158,237, 77,225,127,125,241,247,200, 22, 73,211,166, 77,195,167,159,126, 10, 81, 20,241,248,227,143, 99,230,204,153, 80,
+171,213, 78,101, 22, 45, 90, 4,147,201,132,117,235,214, 97,203,150, 45, 90, 74,233,155, 0,158,128, 15, 76, 75, 80,248, 95, 63,
+252, 61,178, 32, 38, 33, 33, 1,129,129,129,248,232,163,143, 48,123,246,108,183,171,168, 66, 66, 66,240,228,147, 79, 66,163,209,
+ 48,171,213, 58, 54, 52, 52,180, 63,124, 32,177, 84, 75,254, 45, 43, 95,225,255,191,195,223, 35, 10, 16, 20, 20,132, 53,107,214,
+ 32, 38, 38, 6,207, 62,251, 44,102,204,152, 1,135,195,225,182,252,144, 33, 67, 36,171,213,106,230,121,254,126, 95,120, 1,205,
+249,119, 4,189,141,191,217, 46,225, 82,105, 45,142, 95,174,192,190, 51,197,136,136,155, 70, 73,212, 40,191,136,184,169,207,196,
+175,248, 79,191,235,169,254, 61,182, 75,164, 32, 8,248,252,243,207,177,122,245,106, 0, 64,114,114, 50, 22, 44,112,189,251,145,
+159,159, 31,163,148, 74,140, 49, 13,124, 36,181,160,187, 94,171, 55,243, 63,122,169, 2,155, 50, 12,200, 41, 50,129,202, 82, 99,
+ 90,119, 22, 54,158, 15,157, 50,118,124, 8,165,227, 41,149,151, 37,190,240,245, 22,202,196,215,210,255,184,232,244,255,122,253,
+ 11,158,124,136, 63,252,225, 15, 0,128,216,216, 88,124,241,197, 23,110, 21,160, 25,122,251,146, 66,159,229,127,185,204,140, 55,
+191,205,134,192, 1, 49, 33, 26, 20,148,137, 96,148,130,177, 86, 31, 2, 70,231,129,146, 95, 76,126,118,253,188,140,119, 23, 37,
+119,250,189,111,248, 9, 89, 5,158,245,167,191,121,246, 94,168,120,238,154,235,223, 99, 10, 80, 84, 84,132,146,146, 18,188,249,
+230,155,120,238,185,231,176,120,241,226, 54,203,247,246,172, 10,190,206,255, 68,126, 37, 24,163,120,235,254, 9, 24, 17, 29,140,
+ 63,109, 59,141,189, 89, 69, 96, 13,189, 64,227, 95,214,112, 76, 64,233, 59, 0, 58,173, 0,207,220, 61, 25, 14,201,179, 85,209,
+ 82,248,187, 90,255, 30, 83,128,236,236,108, 68, 68, 68,224,217,103,159, 5, 33, 4,185,185,185, 46,115,234, 52,215,222,250,165,
+136,189,117,113,138, 79,243, 63, 83,104, 2,165, 20, 2, 87,103, 33,168, 56, 82,215, 3,180,248,180, 80,130, 27,110, 90,178,198,
+255,216, 63,150, 90, 58,243, 91, 57,133,229, 40,175,181, 94, 51,103,209, 97,119,235, 59,206, 26, 59, 24, 92,253, 18, 4,187,221,
+ 14, 89,150, 57, 89,150,213, 0, 66,208,118,126,214,234,230,215, 59,164, 0,159,237,205,196,165,146,206,109,120,146,157,150,138,
+232, 81,147,240,202,198, 84, 72, 14, 59,206,156,191,136, 87,190, 78, 1,199,183,222, 56,239, 80, 77, 8, 95, 54,112,234, 72,235,
+ 0,149, 86, 8, 31, 20, 13,144,118,133, 72, 82,227,143,248,114,101,165, 15,245, 0,180,190, 98,125, 50, 63,168, 67,148,193, 40,
+195,138, 47,143,162, 95,152, 22, 57,133,149,117, 2,207, 24, 24,163,160,204,165, 57, 4,217, 95,173, 6,208, 41, 5,200, 51, 86,
+ 33,191,172,250,154, 57,239, 92,247, 49,210,183,111,236, 72, 81, 53,128, 59,235, 63,111,183, 83,246, 70, 0,103, 58,165, 0,250,
+ 17,253,220,238,249,229, 14, 17, 86, 3,138,250,248,225,238, 73,195,240,233, 71,239, 33,208,223, 31, 63,143, 31,225,186,194, 82,
+183,211, 98, 83,126,161,228, 96,167,164,240,129,223, 18,158,111, 63,197, 96,165,214,210, 93,194, 65,171, 12,224, 66, 59, 54,162,
+110, 50,153, 96,179,217, 16, 21, 21,213,252, 52, 67, 83, 94, 32, 31,237,193,234, 4,221,108,151,113,174,200,214, 36,244,148,130,
+ 82,230,214, 20, 2,215,249, 64,225,162, 91,110,236, 22,198,166, 67,201, 72,175,139,242, 32, 34,194,181,252,157, 57,115, 6,181,
+181,181, 13,141, 80, 25, 99, 44,215,205,237, 70, 1,173,246,153,232,152, 2,140,236,167,235,188, 61, 80, 58, 4, 63, 92,202, 65,
+148,202,129, 13,159,125,130, 25, 51,102, 96,242,176,104,151,101,163, 84, 14,234, 95,109, 40,179,150,151, 95,172,201,220,123, 8,
+ 61,156, 98,220,113, 98, 61,184,136, 17, 80,199,253,162,221,178, 85, 85, 85,152, 59,119, 46,118,239,222,221,242,165, 80, 95,115,
+130, 25, 99, 16,229, 58,125, 92,126,199, 72,136,242, 8,103,253,100,117,255, 63,248,167,173,204, 14,129,184, 50,133, 0,128, 93,
+125,186, 97,177,139, 68,162,255, 42,181,247,187,203,255,189, 27, 39, 47,151, 92,187,227,158, 86,183, 59, 46, 55,106, 6,248,113,
+ 83,157,174,237,122,105, 1,212, 2,143,105,211,166, 33, 61, 61, 29, 0,160,209,104,126,176,217,108, 15,187,145,159, 61, 0,102,
+244,152, 15, 48, 96,192, 0, 28, 59,118, 12,219,183,111,135,205,102,195,252,249,243,219,109,136,235,109,104,175,180,142,246,148,
+ 15, 64, 56, 30,170,209, 63,111,183,244,217,179,103,113,199, 29,119, 96,231,206,157,232,211,167,143, 15,240,119,150,233,140,188,
+ 10,164,158, 47, 65, 70, 94, 57,204, 86, 7, 40,149, 91,181,240, 78,231,160, 34, 13, 38, 80, 75, 83,232,181,159, 93,137, 4,112,
+174,241, 25,175,254,238, 44,152,188,140,196,172,118,155,175,245,131, 71,110,235,150,103,121,222,122, 18,239,103,236,192,138,123,
+226,241,240,195,191,236,136,194,119,186,225,236,144, 2, 56, 36, 25,148,117,174,103, 55,219,108,216,187,119, 47,100, 89, 70,100,
+100, 36,102,205,254, 25,108,162,228, 38,118, 72, 64,121, 1,208,104, 57,220,189,212, 15,186,232,246, 31,100,237, 43,246,142,248,
+ 10,157, 81, 2,219, 79,127, 5, 8, 15,213,168,187,218, 45,157,149,149,133, 59,239,188, 19, 59,119, 54,238,236,234, 19, 81,160,
+ 79,246,229,226,199,204,162, 38, 97,111, 33,216, 77, 2,206,156,237,125, 23,166, 80,235, 42,162, 28,152,116, 35,152,252, 29, 51,
+ 44, 25, 72, 6,252,163,194, 21,135,175,211,114, 96,232, 6, 31,224,104,110,221,252,182, 31, 79, 94, 66,217,119,206, 43, 33,127,
+119,215,205,224,185, 86,238,150,103, 20,224,181, 77,169,157,138,235, 58,204,213, 72, 91,243, 18, 26, 50, 5, 14,152,181, 24,143,
+253, 99,143,251, 22,181, 50, 92, 85, 26, 59,123,170, 72, 84,163, 4, 77,240, 47, 96,110,223,142,150, 22,190,189, 24, 27, 96,236,
+238,158,192,118,224,207, 0,199, 67, 53, 98,118,187,165, 51, 51, 51, 49,123,246,108, 76,154, 52, 9,245,137,182,188,170, 0, 57,
+ 87,107,240,227,233,171,237, 10,182,187,191,172,222,236,113, 45,252, 18,192,228,186, 15,149, 2,192,228,223, 0,120,195,165, 73,
+ 27,226,223, 24,161,185, 22,204,152, 53, 27, 67, 6, 13, 68,220,164,201,232, 31, 17,210, 34,232,224,218,138,104,227,118, 31, 3,
+216, 6,160,184,211, 10,240,214,194, 91, 58, 69,124,225,194,133,176, 86,214,217,128, 43, 86,172,192, 27,111,188,209,102,249,167,
+159,126,218,177,235,232,174, 93,165,165,165,187, 42, 42, 42,190,132, 87,183, 25, 98,176,237,255, 35, 8,199, 67, 24, 62,171,221,
+210, 39, 78,156, 64, 97, 97,161, 42, 40, 40,136,247,182, 15,176,247,140,177, 93,193,102, 45,206, 57,149,173,239, 33,154,161,118,
+214,232,138, 64, 48, 9,160,178,179, 18, 48,233,255,220, 41,192,164,161,125, 33,201,215,254, 10,111, 31, 59, 8,192,189, 46,175,
+185, 81,176,182, 26,206, 45, 93,238, 1, 58,131, 77,155, 54, 97,243,230,205, 0,128,233,211,167, 99,220,184,113, 29, 14, 35,250,
+130, 13, 93,223,213,195,186,247,109,104, 9, 15, 97,216,204,118,139,151,148,148,112, 85, 85, 85, 51,181, 90,237, 78,111,210, 46,
+ 40, 51,183, 22,108, 39,211,135,181,109, 10, 81,218,232, 24,215,139,211, 14, 63, 34,198,131,214, 11,190,179, 18,244,101,185,247,
+ 69, 76, 93, 92,236,210, 98,200,204,247,236, 72,240,182, 23,230, 65, 45,240, 61,227, 3,116, 20, 70,163, 17,203,150, 45, 3, 0,
+ 60,245,212, 83, 88,190,124, 57,222,127,255,125,220,119,223,125,237, 9,191,207,216,208, 78, 74,176,231, 13,104, 57, 30, 66,236,
+244,246,205, 62,135, 35, 66,146,164, 21, 0, 54,163,110,176,165,199, 81,108,178,180, 22,236, 86,145,157, 54, 76, 32,103, 63,239,
+220,188,201,149,175,129,138, 59,235, 91,252,230, 38, 80,195,255,195, 93,241,248,243,131,183,122,235,173,121, 70, 1, 58, 58, 16,
+182,229,253,151, 80, 94, 94,142,126,195,227,224, 55,241,110,124,188,247, 44, 54,126,247, 3, 28, 3, 39, 35,172,175,251, 73,134,
+233, 53,193, 66,241,128, 91, 38, 89, 7,106,116, 66,112,244, 77, 62, 51, 16,198, 40,172,187, 95,131,246,118, 30,194,144,169,237,
+215, 62,165, 35,234,237,204,159, 1, 48,247,228,155,183,139, 50,202,170,173,109, 10, 56, 24,197,168,126, 97, 24, 30, 19, 10,127,
+ 53, 95,175, 36, 12,187,247,236,145, 10,140,101,217, 18,175,189,164, 14, 31,144, 77,128,172,111,127,115,246,252,128, 80,219, 23,
+ 96, 82,180,139,214, 31,245,102,209, 48, 87,202,254,238,119, 25, 56, 95, 84,225,209,231,253,248,241, 89,174,230, 2,121, 70, 1,
+166,223, 56, 16,147,134, 58,218,142,138,156, 58,129, 11,199,211,160,235, 19,129,127,253,123, 45, 34,162,250,226,245,149,207,162,
+164, 32, 23,255,120,254, 33, 68,247,235,143, 71,150, 62,137, 95, 44, 92,212,186,235, 78,219, 78, 75,170, 46, 94,144,236, 72,167,
+129,186,253,224, 85,237, 63,136, 40,246,140,128, 81, 25,214, 93,175, 64,123,199, 27, 16, 6, 37,118,228, 27,183,212, 43,193, 28,
+ 0,214,158, 82, 0,158, 35, 0, 99,110,109,252,176, 64, 53,126, 63,111, 18,110, 30, 80, 14, 34, 93, 6, 88,211,134,246, 55,251,
+149, 18,201, 94,174,234, 19, 74,252, 71, 13,171,138, 38,160,119,130, 74,227, 65,101,190,141,214, 31, 96, 82,128, 43, 5, 88,144,
+ 56, 10, 86,187,103,115, 4, 11,174, 7,232,152, 71, 20, 32, 54, 42,180,221, 50, 23,143,213,201,227,250,117, 95, 96,230,228,177,
+ 88,191,126, 61,190,251,230,171,198,235, 87, 11,175,224,237,151, 95,192,200,193, 49,120,224,129, 7,156,190,219, 71, 37,202, 1,
+181, 87, 75,106,141,198,139,181,153,123, 79,194,215,246,218,165, 18,172, 59, 95,134,118,214,155, 0, 58, 52, 71,253, 86, 0,223,
+ 1,184, 27,128,173, 39, 40, 10, 60,135,240, 0, 21, 74, 76, 98, 43, 27,159,128,225,181, 7,166, 96, 92,216, 15,224,106,178, 90,
+125, 87, 63, 30, 60, 88,232,104, 80,121,180,139, 86, 30,173,148,160, 73, 17,114, 80, 55,247,198, 9,102,155, 3,213, 86,199,255,
+142, 9,212, 17,148,151,151, 35, 52, 52, 20, 51,103,214, 57,141,111,189,245, 22,198,141, 27,135,249,243,231, 35, 47, 47, 15, 35,
+ 71,142,196, 59,239,188,131, 23, 95,124,177,149, 2, 52,115, 96,124,119, 54,168, 44,194,150,242, 30,144,240,118, 71,191,113, 27,
+128,135, 0,252,163,167, 40,246, 13,209,194, 88, 89,219,202,244,153,114, 67, 20,198, 70, 21,128,171,205,114,209,102,182, 16,112,
+ 87,166,142,203,243, 50, 64,165,179, 0,166,180,188,229,206, 83,151,112,161,216,179,214,233,196, 33, 81, 16,122,202, 4,170,181,
+ 57,218, 13,107,197, 12, 28,140, 81,163,111, 68,149,217,134,146, 18, 35,114,115,115,241,205,214,239, 16, 63, 37, 1,143, 62,180,
+ 8,171,222,125, 15, 34, 5,126,191,226, 57,100,229, 92, 64,255, 1, 77,115,111,236,148, 16, 89,229,175,146, 2,250,248,225,230,
+135, 67,161, 13,110,255, 65,198,163, 26,175,190,218, 99, 61, 5,231,175,131,118,206,187, 40, 55,117,184,151,125,191, 39,133, 31,
+ 0,134, 68, 4,226,100, 94, 73,171,112,231,232, 1,225, 32,226,233,214,214, 66, 91,173, 60,117,161, 4,206,231,175,144,184,148,
+226,164,164,164, 86, 60,150,253,108,146,119,226, 22,158,138, 2,253,101,219, 17,100, 27,218, 14,107,201, 14, 59, 78, 95,184,132,
+ 37,107,118,128,202, 18,180, 33, 58,124,145, 85,131,245, 57,251,144,117,165, 2, 75,214,236,128,100,139, 0, 39,168,240,252,231,
+ 59, 17, 24,209,228, 20,103, 85,135,169,138, 7,207,184,205, 65,212, 99, 4, 77,224, 67, 29,114,130, 79, 9, 75, 0,148,244,152,
+240,207,253, 0, 92,232, 64,192,148,223, 81,225,255, 93, 79, 11,192,188,248,193,248,238, 72, 30,100,217, 57,220, 25,232,167, 2,
+161,181, 78,206,125,199, 90,249,230,202,209,226, 26,240, 23,119, 60,126,253,207,157, 56,158,231,217, 44, 43, 7,223,248, 85,171,
+ 48,168,199,122,128, 87,238,239,144,243,135,249,199, 55,227, 47,247,223,132, 1, 3, 6,224, 29,249, 34,180,154, 34, 44, 95,190,
+ 28,203,243,247,225,165,135,146,224,231,231,135, 81,127, 95,129,109,111, 62, 1,190,217,180,232,103,158, 57,232,216,115,108, 79,
+178,209,104,252,161,188,188,124,191, 47,249, 0, 78,194,223, 49,124,224, 13,225, 7,128,200, 16, 45,102,143, 31,128,173,135,115,
+157, 28, 96,231, 9,112,157,106,229, 91, 40,135,220,240,106, 74,219,234,221,254,254,248, 44,175,188,171,102,251,187,245,188, 15,
+ 0, 0,127,255,251,223,241,252,243,207,227,239,127,255, 59, 94,120,225, 5, 36, 39, 39, 67,146, 36,140, 27, 55, 14,199,143, 31,
+ 71,126,126, 62,238,184,227, 14, 39,225,111,230,189,203,148, 82,159,154, 78,220, 89,225,231,121,254, 27, 89,150,127,231, 77,206,
+191,190, 35, 14,126, 42, 14, 7, 78, 27, 80, 92, 89, 11, 6, 82, 63,106, 74, 1, 38,186,108,229,101, 81, 6,152, 36, 19, 34, 83,
+ 14, 50,117,171, 4,117, 14,253, 81, 0,207,146,184, 84,183,211,209,119,158,186,132, 18,147,197,163,207,185, 48,105,116,171,185,
+ 64,245, 38, 16,243,154, 2,232,116, 58,188,248,226,139, 88,185,114, 37,238,186,235, 46,220,123,111,221, 48,246,152, 49, 99,240,
+250,235,175,227,198, 27,111,196,154, 53,107,220,105, 47,245,165,129,176,206, 10,127, 80, 80,208, 17,149, 74,245, 65, 69, 69,133,
+ 87,121,171, 4, 14, 75,102,197, 97,201,172, 22, 9,148, 77,123, 1, 42,186, 52,117,254,181, 45,216,158,113,228,196,231,209, 97,
+214,159, 94,249, 77,255,227, 42,158,177,102,189,193,121, 18,119,176, 83, 61,178, 40, 83,183, 19, 31,123,101, 20,232,147,157, 39,
+144,107,172,234, 56,139,209,183,227,131,173, 7,241,202,223,214,163,232, 66, 54,170,203,141,144, 28,118,140,184,255,183,120,225,
+203,159, 90,219,115,213, 33,234, 43, 3,111,157,105, 25,172, 29, 42,248,135,221,215,145, 69, 85, 18, 52,175, 99,211,211, 21,190,
+ 32,252,227,198,141,147, 36, 73,218, 89, 88, 88,232, 91,225,219, 22,161,220,186, 86,189,181,169,179,244,238, 18,205,210,187,162,
+150,128,201, 75, 90,181,254, 96, 97, 0,170, 58,243, 83,115, 38, 14,245,150, 19,236, 25, 19,104,214,184, 33,168,181,117, 50,174,
+123,155,243, 62, 6, 75, 23,221,143,135,166,141,113, 89,180,228,200,143, 82, 85,213,197,147,146,168, 74,113, 12,158,156, 5,194,
+117,224, 65,170,107,125, 65,248,151, 45, 91, 6,198,152, 99,223,190,125, 62,190,168, 95,114,107, 2, 57, 69,129, 84,209,102, 16,
+129,192,122,222,191,203,102, 88, 39,157,224,221, 47, 63,128, 32,173,218,119,123,128,142, 12,132,181,135, 49,163, 70, 96,236,160,
+ 72,151,215,250,168, 68, 57,168,182,176,168,186,176,240,172,249,232,182,147,222,242, 3,186, 34,252,239,190,251, 46,158,121,230,
+ 25,230,107, 38, 92,235,214,145, 7,105, 48,129,220,216,248,148,105,109, 92,236,218, 0, 16, 14,184,176,160, 22,142, 66,127, 0,
+246, 78,251,130, 94,114,130,225,205,129,176,230, 56,113,226, 4,190,252,242, 75, 76,157, 58, 21,115,231,206, 5, 0, 12, 29, 58,
+ 20,178, 44,187,114,128, 27, 39,195,213, 59,193,232, 77,194,239, 43,252,219, 85, 0,213, 96,192,156,222,102,180,135, 48,137,135,
+ 92, 13,112, 26, 64,174, 38, 0, 78,146,184, 84,171,175, 61,203,246,237,219, 81, 88, 88, 8, 0, 40, 46,110,234,105, 40,165, 19,
+209,148, 31,116, 63,128,156, 30, 87, 0, 74, 41,230,205,155,135, 43, 87,174,224,227,143, 63,198,241,227,199, 49,114,228, 72,132,
+132,132,192,106,181, 34, 48, 48,208,149,237,230, 85, 39,152,248,247,233,178,240,251, 2,255, 14,189,151,192, 89,224, 44,135, 64,
+172,103, 93,155, 64,160, 32,128, 10,231,127,110, 7, 56, 6, 38,137, 0,150,250,226,179,172, 94,189, 26,251,246,237,115, 37,123,
+115, 80, 55, 7, 11, 0, 30,243,138, 2,212,214,214,226,202,149, 43,141,202,208,208,226, 23, 23, 23, 67, 20, 69,119, 17, 32, 48,
+198,168,220,176,132,172,135,161,185,249, 49,128,227, 59, 84,182, 95,191,126, 78,194,239, 11,252, 59,166,229, 42, 72, 81,175,131,
+ 51,167,129,171, 88, 7, 98,191,220,220,209,109,214, 26,201,118, 64,126, 15,192,123, 36, 46,213,228,139,143,242,231, 63,255, 25,
+149,149, 77, 83, 45,254,246,183,191,217, 14, 31, 62,188,174,180,180, 52, 77, 20,197,252,250, 7,202,233,200,189,186, 93, 1,130,
+131,131,113,251,237,183, 35, 59, 59, 27,159,127,254, 57,134, 15, 31,142,140,140, 12, 24,141, 70,132,133,133,185,127, 63,222,204,
+172,214, 65,225, 7,220,231,172,236, 29,153,237, 8,104, 64, 34,104, 64, 34, 32, 87,129, 56, 10, 64, 28, 6,108,217,188,209,158,
+151,119,225,115,115,109,229, 87, 99,134, 9, 63,205,127,250,156, 79, 63,199,216,177, 99,157,142,183,109,219, 38,231,230,230, 94,
+ 48,155,205,135, 76, 38,211,185,206,248,144, 30,241, 1, 54,110,220,136,215, 94,123, 13,159,125,246, 25,190,255,254,123,232,116,
+ 58,124,240,193, 7,237,125,173, 87,167, 70,236,117,252,249, 80, 48,109, 40,152,118, 44, 82,206,236,147,246,239,207, 62, 87, 80,
+ 80,126,165,170,170,138, 94, 79,245, 47, 0,128,201,100, 18, 50, 50,186,119,255,228,150,171,192, 78,158, 60,233,182,172,201,100,
+226, 9, 33, 93, 54, 33, 60,193,191,147,191,175,240,239,165,252, 5, 0,198,226,226,226, 83,171, 86,173,226,237,118,123, 52, 99,
+ 76, 13,128,213, 71, 54, 88,179, 15,234,207, 55,254,223,242,154,187,235, 45,238,213,178, 44,147,101, 89,150, 36,169,164, 62,189,
+ 96,103, 67,160, 10,127,133,127,151,249, 55, 31,114,229,116, 58,221,114, 0,125,209,148,229, 76,102,140, 73,132, 16,153, 49, 38,
+ 19, 66,164,102,231,104,179,107, 13,231,101, 66,136, 84,191,184, 93,110,184, 70, 8,145, 41,165, 82,139, 99,185,193,110,166,148,
+ 74,178, 44, 75,140, 49,139,217,108,190,210, 85, 75, 94,225,175,240,239, 44,255,230, 10, 64, 2, 3, 3,163, 57,142, 83, 19, 66,
+152, 74,165,130, 40,138,141, 90,214,160,133,205,143,235, 67,127, 12, 0, 28, 14,135,147, 6, 19, 66, 88,179, 79, 67, 89, 88, 44,
+ 22,167,123,112, 28,199, 8, 33,172,178,178,146,213, 87, 90, 87,215,210, 41,252, 21,254,157,230, 79,218, 57,238, 40,124,101, 6,
+167,194, 95,225,223, 35,132,187, 5, 73, 73, 73, 2,128,217, 28,199,221,247,211, 79, 63, 45,238,109, 97, 7,133, 63,144,148,148,
+ 52, 90, 16,132, 71, 8, 33,221, 46, 75,140,177,112, 89,150,135, 51,198, 94, 78, 73, 73,217,231,137, 58, 16,186,169, 34,251, 1,
+ 40, 79, 73, 73,177,117,176,252,120,181, 90,189,132, 49,246, 43,157, 78,199,149,149,149, 9, 0, 22,123, 81, 16, 20,254, 93,231,
+127, 67,100,100,228,147,115,230,204,241,235,206,103,202,206,206,198,169, 83,167, 16, 25, 25, 9,131,193,176, 59, 41, 41,105, 90,
+ 74, 74, 74,138,207, 40, 64, 82, 82, 82, 8,128,121, 90,173,246,215, 14,135, 99,188, 32, 8, 59,146,146,146,230,166,164,164, 48,
+ 55,229, 35, 57,142,123, 80,173, 86,255,159, 32, 8, 81,241,241,241,154, 73,147, 38, 9, 90,173, 22,111,190,249,166,205, 11, 66,
+163,240,239, 38,254,209,209,209,246,133, 11, 23,118,155, 2,108,218,180, 9, 6,131, 1,143, 62,250, 40, 56,142,195,193,131, 7,
+185,204,204,204, 3,137,137,137, 9,169,169,169, 25, 94, 83,128,164,164, 36, 53,128,217,126,126,126, 75,101, 89,158, 62,108,216,
+ 48, 41, 62, 62, 62,104,232,208,161, 88,179,102,205,173, 37, 37, 37,239, 2,120,166, 69,249,185, 90,173,246, 73, 73,146,226,227,
+226,226,104,124,124,188,255,224,193,131, 27, 38,144,193,106,181,246,164,208, 40,252,189,200,191, 35,144, 36, 9,235,215,175,199,
+210,165, 75, 17, 22, 22,134,218,218, 90, 36, 38, 38,130, 82,202,101,101,101,165,235,245,250,155,211,210,210,142,247,152, 2, 36,
+ 37, 37, 17, 0, 73, 26,141,230, 49, 74,233,188,190,125,251,202, 83,166, 76, 9,137,139,139,131,159, 95,147,210, 63,246,216, 99,
+ 1,239,189,247,222, 19,183,220,114, 75, 14,165,244,148, 70,163, 89, 74, 41,157, 31, 19, 19, 67, 19, 18, 18,130,227,226,226,160,
+ 82,169,188, 97, 30, 40,252,189,200,191,179, 48, 24, 12, 8, 14, 14,110,220,124, 68,171,213, 66,150,101,232,245,122, 72,146,196,
+229,228,228,100,232,245,250,241,105,105,105, 89, 30, 85,128,122,231,102, 49,199,113,143, 6, 6, 6,170,227,227,227, 3, 38, 76,
+152,192,135,132,132,184, 44,239,239,239,143, 37, 75,150,248,175, 94,189,250, 35,173, 86,235,152, 50,101,138,118,226,196,137,124,
+104,104,104,183, 85,206,244,233,211,251,216,237,118,154,158,158, 94,209, 1,193, 81,248,123,145,127, 87, 81, 88, 88, 8,157,174,
+105, 71, 34,141, 70, 3, 89,150, 33,203, 50, 18, 19, 19, 33,203, 50,127,225,194,133, 19, 9, 9, 9, 55,166,167,167,159,239, 86,
+ 5, 72, 74, 74,138,225, 56,238, 87,106,181,122, 9,199,113, 49,147, 38, 77, 18,110,186,233, 38,117,223,190,125, 59,116,179,136,
+136, 8,172, 92,185, 82,237,239,239,175,238,206, 74, 73, 76, 76, 28, 17, 16, 16,176,210,110,183,223, 86, 93, 93, 29,219,134,208,
+ 40,252,189,200,191, 59, 16, 24, 24,216,202, 44,243,247,247,111,220,212, 59, 41, 41, 9,178, 44, 11,151, 46, 93,202,210,235,245,
+ 35,211,210,210,242,186, 69, 1,146,146,146, 18, 4, 65,216, 59,102,204, 24,122,243,205, 55,251,199,198,198,162, 43,145, 45,127,
+127,255,110,171,140,169, 83,167, 78, 11, 8, 8,120,153, 82,154, 16, 16, 16,160,150,101,249,163,236,236,108,135, 27,225, 81,248,
+123,145,127,119, 65,167,211,193,100,106, 61, 11,187,193, 20,146,101,185, 65, 9, 84, 5, 5, 5,103,245,122,253,176,180,180, 52,
+195, 53, 43,128,159,159,223,107,208,238,250,153, 0, 0, 20,252, 73, 68, 65, 84,119,222,121,167, 58, 33, 33,129,131, 23, 49,125,
+250,116, 65,150,229,251,252,253,253, 95,241,247,247,239,255,224,131, 15, 6, 76,159, 62,157, 44, 88,176,192,102,177, 88, 62,114,
+247, 61,133,191,119,249,119, 23,162,162,162, 80, 83, 83, 3,171,213, 10,173, 86, 11,160,110, 99,194,210,210, 82,148,151,151,163,
+180,180, 20, 22,139, 5,131, 7, 15,134, 40,138,234,171, 87,175,158,215,235,245, 67,210,210,210,138,187,172, 0, 73, 73, 73, 35,
+ 1, 36, 77,154, 52,201,107,149, 31, 31, 31, 31,172,209,104,150, 8,130,176, 98,232,208,161,154,135, 30,122, 40,104,202,148, 41,
+ 32,132, 96,247,238,221, 16, 4,225, 84,122,122,250, 69, 55,173,167,194,223,139,252,187, 19,106,181, 26,227,199,143, 71, 78, 78,
+ 14,116, 58, 29, 14, 28, 56,128,130,130, 2,196,198,198, 34, 42, 42, 10, 67,135, 14, 5,207,243, 72, 77, 77,133,209,104,132, 40,
+138,126, 26,141, 38, 79,175,215, 15, 74, 75, 75, 43,237,146, 2,104, 52,154,151,166, 78,157,170,242, 70,148,160,186,186, 26, 28,
+199,169, 2, 3, 3,139, 38, 79,158,140, 95,253,234, 87, 1, 55,220,112,131, 83,153,111,190,249,166,166,182,182,246,207,238,238,
+161,240,119,195,205, 38,225,167,139,165, 40,169,113, 64, 45,112, 80,243, 4,106,158,131, 70,224, 48, 97, 64, 40,250, 6,251,117,
+ 11,255,238,198,180,105,211,240,233,167,159, 66, 20, 69, 60,254,248,227,152, 57,115, 38,212,106,103,183,102,209,162, 69, 48,153,
+ 76, 88,183,110, 29,182,108,217,162,165,148,190,137,166,245,192, 29, 87,128,164,164,164,104, 74,233,189,122,189, 94,232, 73,193,
+ 41, 44, 44, 68, 74, 74, 10,206,157, 59,135, 57,115,230,240, 11, 22, 44, 8,136,140,108,157, 53, 34, 63, 63, 31, 5, 5, 5,148,
+231,249,111,221,180,158, 94,231, 63,243,206,159,241,139,127,249,128, 79,240,183, 75, 20,169,121,229,216,157, 83,130,140,252, 74,
+136,110,146, 26, 19, 0, 3, 53,118,220,104,207,198, 67,119, 37,240,183,205,127, 34, 32, 50, 50,170,211,252, 61,129,132,132, 4,
+124,253,245,215,120,227,141, 55, 16, 19,227, 62, 29,125, 72, 72, 8,158,124,242, 73,108,223,190,157,213,212,212,140, 13, 13, 13,
+237, 95, 85, 85,117,165, 51, 74, 32,168,213,234,231,110,186,233, 38,174, 59,157, 39,119, 96,140, 33, 39, 39, 7,169,169,169,168,
+172,172,196,125,247,221,135,215, 95,127,189, 77,199, 45, 57, 57,217,193, 24, 91,179,127,255,126,201, 77,151,233, 85,254,137,243,
+ 30,197,211,235,126,194, 61,178, 10,145, 94,228,207, 24,240,245,113, 3,214, 30, 42,128, 85,108,127, 93, 8, 3,144,111,215,224,
+151,131,181,184, 91,216, 3,203,119,199, 96, 31, 57, 3,252,144,169, 16,162,199, 55, 46, 19,109,143,191, 39, 16, 20, 20,132, 53,
+107,214,184, 93,126,218, 18, 67,134, 12,145, 12, 6,131,153,231,249,251, 81,151,152,184,227, 10,192,243,252,207, 39, 77,154,164,
+241,228, 3, 73,146,132, 99,199,142, 33, 45, 45, 13, 1, 1, 1, 88,184,112, 33,166, 77,155,230, 50, 69,138, 83,107,102,183, 99,
+231,206,157,212,106,181,254,205, 93, 25,111,242,207,200, 45,198, 93,171,190,129,213, 33,225,238,119,190,193,190, 87, 23, 34, 58,
+ 44,176,199,249,151,155, 29,120,251,199,115, 56, 90,208,249,156,252, 19, 2,235,190,227, 47, 85,193,145,181, 5,200,218, 2,226,
+ 23, 12, 97,144, 30,108,128, 30,251,246,180,205,223, 83,232,168,240,215, 7, 16, 24,165, 84, 98,140,105,208,201, 9,158, 2, 0,
+194,113,158,241,189,204,102, 51,210,211,211,113,248,240, 97,140, 26, 53, 10, 43, 86,172,232,240,174,145, 0,176,111,223, 62, 8,
+130,112, 36, 45, 45,173,173,156,228, 94,225,159,109, 40,195,188,119,183,194,234,168,107, 24, 11,202,170,113,239,159,147,177,243,
+165,249, 8,214,106,122,140,191,201, 38,225,183,155, 51, 81, 80,209,249,100,180, 4,192,248,160,214, 89, 15,153,173, 26,226,185,
+ 29,192,185, 29,248,247,108,162, 82, 17,246, 23,242,192,148,100,104,196,239,195,151, 30,243,201, 76, 17,245,232,218,154,224,238,
+ 70,105,105, 41, 82, 83, 83,145,153,153,137,105,211,166,225,195, 15, 63,196,128,102, 27, 98,116, 20, 61,237,124,117,148,127, 65,
+ 89, 53,230,190,243, 13,170,204,206,115,200, 50,243, 75,176,240,253,109, 72,126,238, 94,168, 5,222,227,252,173,162,140,231,147,
+ 79,119, 73,248, 1, 32, 86, 91,139, 16,161,237,245, 35, 42,142,241, 0,230, 49, 96, 58,236,170,229,229, 31, 76,249, 74,144,201,
+218,144,167,211,189,155, 5,152, 81,128, 52, 53, 28, 93,205,202,209,173, 10,144,151,151,135,148,148, 20, 20, 22, 22, 98,238,220,
+185,120,238,185,231,208,213,161,248,220,220, 92, 92,189,122, 85,140,142,142,254,111, 79,213,105, 71,248,151,152, 44,152,179,106,
+ 19,174, 86,185,222,163,111, 95, 86, 62,150,124,178, 3, 47,222, 57,210,227,252,255,153,122, 25, 57,198,154,182, 91,121, 2,232,
+ 71,244, 71, 76, 88, 0,204, 54, 17,149,102, 59, 14, 95, 40, 2,101, 12, 19,130, 42,219,234,151,144,122,133,179,199,199,208, 39,
+ 52, 4, 7, 67,151,165,229,250, 66, 19, 79, 45,229,176,253,176, 18,204, 82, 6,245,228, 37, 80,141,184,163,177,245,175, 95, 74,
+217,233,244,232,215,180, 26,135, 82,138,204,204, 76,164,166,166, 66,150,101, 60,240,192, 3,184,253,246,219, 91,133,173, 58,139,
+173, 91,183,218, 41,165, 31,111,218,180,169, 61,173,238, 49,254, 53, 86, 7,238,249,211, 22,228, 22,183,157, 44,121, 99,122, 14,
+ 12,185, 57,178,218,131,252, 47,150,214, 34,249, 84,161,219,235,129,126,106,172,184, 39, 30, 11, 18, 71,161,127,120,144,211,181,
+203, 37, 38,124,180,227, 56, 6, 95,106, 61,159,204, 6, 13,252, 96, 7, 24,197,153, 50, 97,227,220, 63,166,172,245, 37, 27,135,
+ 85, 23, 65,174,200,173,219,179,109,223,219, 16,179,147, 17,227, 7, 82,191, 32,158,118,197, 7,232, 18, 28, 14, 7, 14, 29, 58,
+132,244,244,116,244,239,223, 31, 79, 60,241, 4,226,227,227,209, 29, 11,131,108, 54, 27,246,236,217,195,108, 54,219, 39,158,170,
+200,206,242,183,139, 50, 22,188,247, 45, 78, 94, 54,118,232,254,233, 37,224, 53, 33,137, 20,216,227, 17,254,255, 72,201, 3,117,
+163, 58,209, 97,129,216,242,236,189, 24, 55,216,117, 50,226,193,145, 33,120,247,161, 91, 81,242,229, 23, 78,155,156,214,112, 65,
+ 8,162, 77, 61,202,226, 56,199,224, 23,124,204,200,231,251,142,129,118,214, 27,176,238,124, 9,144, 69,200, 37,103,241,255, 6,
+ 16,149,223, 20,255,193,111,109, 39, 93,234, 1,186,132,109,219,182,129, 82,138, 85,171, 86, 97,248,240,225,221,250,144,123,246,
+236,129, 32, 8,169,169,169,169, 69,158,170,200,206,240,167,140,225,145,143,183, 99,127,118, 65,167,126,195,206,107, 95,230,231,
+175, 58, 39,111, 92,185,161, 59,185,151,155, 29,200,200,175,116,217,216, 13,208, 5, 97,247, 43, 11, 49, 64, 23,212,142,187, 40,
+ 66,107,174,123, 30, 17, 2,100,162,114, 18,126, 0, 80,243,152, 90,249,158,126,124,216,239,210, 78,250,146, 18, 8,131,244,208,
+206,122, 3,182,157, 47,131,201, 14,240,132, 97,241, 36,191,113, 83, 6, 14,122, 88, 16,134,173,155,252,234,225,234,142,222,139,
+ 67, 23,246, 21, 48,155,205,200,204,204,196,202,149, 43,187, 93,248, 27,156, 95,179,217,220, 81,231,209,227,252,151,125,182, 27,
+ 91,143, 92,232,202,163, 16,194,176, 86,184,127,213,140,238,228,191, 35,171, 16,204, 77, 79,255,135,121,250,246,133, 31,128, 92,
+ 94,103, 70,128, 87, 33, 48,225, 9,248, 49,215, 11, 99, 40, 47,223,235,139,225, 30, 97,144, 30,126,179,255, 8,162,210, 54,158,
+ 27, 17,169,158, 52, 52,156, 28, 42,251, 48, 97,164, 71,123,128,163, 71,143, 34, 33, 33,161,205, 92,159, 93,197,185,115,231, 80,
+ 82, 82, 98, 59,120,240,224, 78, 79, 85, 94,103,248,191,254, 77, 42, 62,219,155,121, 45, 63,167, 6,144,172, 90,240,206, 45,226,
+215, 47,156,234, 14,254,169,103, 93, 79,126, 28,216, 39, 24, 11,147, 70,119, 44, 94, 88,114, 6, 32, 28,180,183,191, 6, 97,112,
+ 18,196,236,100,208,106, 23, 62, 5, 35, 9, 61,102,223,215,150, 64, 42, 60, 6, 72,118, 48, 89, 4,100, 7, 24, 21, 65,168, 4,
+230,176,130, 57,106,193, 28,181,128,104, 1,179,155,235,254,111,189, 51,234, 40,194,216,225,242, 15, 19,230,235,158, 74,255,177,
+219, 21,128, 82,138,140,140, 12,188,252,242,203, 30,169,132,173, 91,183,218, 68, 81,252, 0, 30, 74,149,209, 25,254,127,251,241,
+ 56,222, 73, 62,212,120, 28,164, 85, 99, 70,220, 32,216, 68, 9, 63,158,188,228,186, 66, 9, 16,224,168, 56,100, 82,133,107, 0,
+ 76,168, 63, 29,204, 40,251,193,239,129, 85,122,219, 87, 43, 47, 95, 43,255,203,149, 86,128,104, 91, 93, 91,116,203,141, 80,241,
+ 29, 27, 83,160, 37,103,161,137, 95, 10, 97,112,221, 62,191,170,225, 51, 97, 63,246,133,139, 62, 12, 61,178,233,175,116, 97, 39,
+172,123,223,118, 37,208, 93, 65, 48, 24,219, 94,241, 97,252,178,240,167, 14,255,173, 61, 19,168, 83, 56,127,254, 60,130,130,130,
+ 16, 23, 23,215,237,149, 96,177, 88,176,127,255,126, 56, 28,142,127,122,170,162, 59,202,255,235,180, 28, 60,183,110, 31,162,195,
+ 2,241,248,109,227,240,237,138,121, 48,124,242,127,216,240,219,185,109,239,129, 69, 37,140, 40, 73,253,185,180,105,229, 68, 9,
+100, 16, 1,158, 2,176, 27, 64,164, 36, 99, 7,238,125, 91,119,173,252, 45,196,245,250,243,168,144,128,142,219,102,234, 0,168,
+199, 63,208, 36, 8, 49, 19,221, 21, 13,233, 9, 5, 16,207,239,236, 46,225,111,244,151, 25, 35, 31,151,127,144,240, 62,123,213,
+189,156, 11,157,221, 91,245,240,225,195,248,197, 47,126,225,145, 74,216,181,107, 23, 83,171,213,123,247,236,217,211,225, 13,176,
+ 61,193,127, 87,230,101,252,117, 91, 6,214, 44,189, 19, 11,244,163, 58,220,170, 2, 0, 3,145,210,210,210,234,248,111,122,161,
+ 64, 4, 62, 2,240,145,102,193,159,134, 74,178,252,172, 32,112,155,164,251,255, 58, 7,155,158,182,118,149,191,138,143,133, 67,
+110,253,181,176, 64,103,197, 56,124,161, 8,195,163,195, 17,222,226, 60, 24,133,122,226,131,206, 78,180,228, 54, 49, 4,199, 54,
+222,207,147,249,155, 60,154,249,218,111,198,139,144, 75,178, 1,209, 10, 38, 90,193, 28, 22,192, 81, 3,106, 53,129,150,157,131,
+ 92,226, 58,221, 63, 31, 58, 16,124,248, 96, 64,208,128, 89, 42, 32, 22,157,172,223,240,163, 65, 64,216,242,242,176, 41, 67, 75,
+ 62,246, 91, 24,249,155,253,181, 93, 54,129, 24, 99, 40, 47, 47, 71, 65, 65, 1,110,187,237, 54,143, 84,194,166, 77,155,204,213,
+213,213,239,122,196,190,236, 32,127,179, 93,132,192, 17, 28,122,251, 33,116, 37,162, 75, 9,231,114, 79, 45,251,215,207,231, 2,
+248, 53, 22,190, 21, 37,136,142, 9, 18,144,214, 85,254, 1,125, 71,194, 97,110,253, 51,205,103,126,214,218, 28,120,107, 75, 58,
+190, 91, 49,207, 69,171,193,129,248, 59,119, 68,204,230, 54,112, 34,226,204, 38,143,103,110, 35,218, 80, 8,131, 90,111,200, 46,
+ 95,205,132, 53,111,127,171,243,170,126, 19,161,141,127, 28, 66,191,241,173,158,195,126,126, 39, 44, 41,171,235,156,124, 0,132,
+224, 46, 94,182,165,148,175,142,191, 75,183,236,240,149, 78, 41, 0, 99,245, 59,142, 51,134,195,135, 15, 99,214,172, 89,208,104,
+186,127,238,217,153, 51,103, 80, 85, 85, 85,147,154,154,186,175,187, 5,191, 51,252, 3, 52, 42,220, 26, 55,168,235,191, 7,210,
+246,172,201, 13,127, 48, 74,128,241, 90,248, 27, 11,131, 81,105,110,189,246, 99,219,145, 11, 88,152, 56, 10,140, 1,203, 63,219,
+141, 62, 65,218, 14,243, 46,185,120, 28,193,174, 47, 93, 32,175,194, 43,123, 6, 72, 23,247,192,186,239,237, 70, 65,110,236, 45,
+110,122, 8,254, 9, 75, 27,167, 66,156, 59,127, 6,102,179, 25,186,112, 29, 6, 13,138,133,223,216,251, 32, 68,220,128,154,237,
+ 43,192,172,141,131,150,227, 0,238, 61, 0,247,119,216, 7,160,148, 54,174,195,180,217,108, 56,126,252, 56,238,185,231, 30,143,
+ 60,236,150, 45, 91,172,162, 40,190,215,221, 14,111, 79,241,247,148,195,238,138,255,228,225,209, 46,203,239,204,188, 12,139, 93,
+196,239, 55, 28,192,134,212,179,152, 60, 44,186, 99, 74,230,176, 64,147,191,219, 77, 43, 79,206,244,248,131, 51, 10,251,225, 53,
+176,238,126,189,149,240,171,135,205,128,191,254,215, 0,225,112, 56, 35, 29,241, 79,188,138,184, 23,191, 67,252,170, 61, 24,246,
+220, 70,252,252,153, 55,112,241, 98, 14,132,232,177, 8,185,255, 95, 32,126,205,167,178,176,123,171, 62,156, 60,164,165, 2,180,
+138, 67, 55,175,248,134, 79,102,102, 38,134, 13, 27,134,254,253,251,119,251,243,214,212,212, 32, 53, 53,149,216,108,182, 79,187,
+214,200,123,151,255,181,119, 82,157,227, 63,101,120, 63,215, 65, 4,187,136,121,127,217,138, 15,182, 31, 5, 0, 76, 30, 22,211,
+ 33, 2,181,199,191,130,134,147,220, 24,124,108,103,143, 42,189,185, 12,150,109,203,225, 56,241,159,214,129, 64, 65, 3,255,233,
+207, 2, 0,242,242,206,227,231,171,119,227,120,133,179,127,243, 95,131, 10,243,255,244, 21, 36, 81, 4, 23,210, 15,234, 33,122,
+ 39,151, 65,166,252,114,183, 61, 0, 99,172,177,194, 37, 73,130, 36, 73,141,199,199,143, 31,199,188,121,243, 60,242,208, 59,119,
+238,132, 90,173,222,113,173,249,102,188,197,191, 59,205,181,142,240,159, 59,105, 24, 66,252, 93,155,113, 7,234, 71,171,181,106,
+ 1, 99, 6, 69,180,111,102,228,167, 65, 62,245, 31,119,151,109, 68, 35,110,236, 49,147,231,202, 49, 88,191,121, 12,114,145,235,
+225, 18, 85,244, 88,112,218,186,177,155, 15,191,254, 14,229, 14,215, 75, 72, 79, 87,249,225,207,255,168, 11, 36,170, 6, 76,110,
+209,161,177, 71, 13,127, 77,208, 58, 41, 64,131,157,217,178,213,105,120, 17, 6,131, 1, 22,139, 5, 9, 9,221, 59, 38, 66, 41,
+197,158, 61,123,176,118,237, 90,212,214,214,190,123, 45,130,227, 13,254,221,237,167,116,148,127,144, 86,141, 71,110, 29,219,230,
+ 61,199,235, 36,168,218,153, 30,239,200,254, 22,150, 31, 86,130,103,110,167, 68,127,213, 35,243,255, 25,133,253,216, 90, 88,183,
+ 63, 3,106,117, 63, 67, 85,136,106, 26,228, 59,125,213,220,230, 45,243, 74,235,156,122, 97,192,205, 45, 47, 5,169,180, 36,168,
+185, 19,204, 26, 42,186,193,217,106, 72, 66,212,240, 57,113,226, 4,238,185,231, 30,116,215,194, 19, 89,150,177,107,215, 46,124,
+246,217,103,176, 88, 44,142,226,226,226, 45, 6,131, 33, 60, 56, 56,248,230,234,234,234, 35,157,173,190,158,230, 79,105,183,250,
+132, 93,226,255,200,140, 49, 88,179,235, 68,227,130,156,150,152,192, 95,132,121,227, 98, 8, 35,102, 67,125,195, 29, 32,129,117,
+ 19,227,152,104,133,227,226, 62,148, 30,222,128, 16, 91,126, 91, 83, 39, 77, 50, 47,175,244,184,236,139, 86,216,118,189, 2,169,
+224,144,115, 67,205,171,193,192,156,124, 0, 90,219, 20, 29, 31, 18,174,193,129, 54, 18,161,140,111,152, 8,232, 98,108,193,223,
+108,111, 60, 41, 52,111,125, 26, 42,188,249, 75,176, 88, 44, 56,127,254, 60, 94,121,229,149,107,239,226, 36, 9, 63,252,240, 3,
+214,174, 93, 11,155,205,102,191,122,245,234,214,162,162,162,100, 74,105, 49,207,243, 70, 89,150, 75,174,165,245,236, 41,254,255,
+ 90,191, 3, 16, 98,187,189,245,119,197,223, 84,107,198,169,220, 43,184,243, 87, 75,177,249,240,121, 28,207, 43, 70,218,185, 66,
+156,184,100,132, 67,114,223,194,223, 20, 84, 9,106, 42,130, 35,227,159,112,100,252,179, 46, 98, 66, 56, 48, 42,131,128,181, 59,
+186, 69, 8, 94,136,252,205,145, 98,143, 10,191,189, 22,214,255, 62, 7,217,152,237,252,219,193, 49,240,159,245, 38,236, 71,254,
+ 5, 41,191, 41, 90, 44,149,158,107,252,255,233, 7,238,194,127, 94,217, 6,145,181, 86,225, 80,149,132,217,183,212,141,112,203,
+165,173,179, 39, 50, 78, 77,157,194,160, 45, 95, 64,243, 23,113,234,212, 41, 36, 36, 36,224, 90,114, 76, 58, 28, 14,124,255,253,
+247, 88,183,110, 29, 28, 14,135,173,168,168, 40,185,168,168,232,123,142,227,140,140, 49,163, 36, 73,198,170,170,170,210,107,105,
+145,123,146,255, 85, 41,226, 52,250,224,230,238,142,246,184,226,159,125,250, 52,134,198, 77,192, 15, 89,133,216,118,244, 34,174,
+ 86,214,118,232,158, 55, 5, 87,180, 50, 51,192,104,135, 38,203, 51,134,191,233,150, 29,250,196,147,194, 79,173,149,117, 38, 79,
+153,115,170, 33, 97,144, 30,126, 51, 94, 4,209, 4, 66, 24,156,232,164, 0,114,121, 30,236,103,191,135,102,212, 93, 24, 53, 50,
+ 14,219,127, 99,196, 67,255, 76, 69,177,189,105,237,198,208, 0, 59, 62, 91, 58, 3,177,177,117,169, 93,172, 39,190,108,249,211,
+162, 57,192, 97,115, 82,128, 6,123,179,229, 11,144,101, 25, 89, 89, 89,120,253,245,215,187,244,144,118,187, 29,223,126,251, 45,
+214,175, 95, 15, 89,150,109,133,133,133,155,141, 70,227, 14,198,152, 17,128,145,231,121, 99,121,121,185,241, 90, 43,179,167,249,
+ 91,198,207,187, 25,232, 62, 5,104,139,127,118,214,105,188,254,250,235, 24, 61,122, 52,254,186,120, 6, 14,157, 47, 66,114,198,
+121,108,205, 56,143,194, 10,215,202, 16,163,177, 34, 90,109,235, 98,143,132, 47,117,149,135,158,242,104,203,111,173,130,245,219,
+ 39, 65,171,154, 77,234,227, 4,104,110,126, 12,234, 9,191, 68,195, 8, 53, 63, 48,161,254,255,166,104,144, 53,245, 35,168, 98,
+ 38,128, 11,233,135, 91,111,153,137,203,137,211,177,231,192, 30, 20,149,150, 33, 38,162, 15,110,155, 62, 19, 28,199, 3,140,194,
+146,178, 26,210,149, 99, 45,186, 54,124, 25,179,244,152,197,165, 15,208,210,254,204,203,203, 67,104,104, 40, 70,143, 30,221,169,
+ 7,180, 88, 44, 72, 78, 78,198,134, 13, 27, 64, 41,181, 22, 20, 20,108, 46, 47, 47,223,205, 24, 51, 82, 74,141,130, 32, 24,203,
+202,202,140,232,194, 34,230,182,108,232,158,226, 79,253,195,251,121,194, 7,104,143, 63, 71, 8,244, 35,250, 65, 63,162, 31,254,
+180,232, 86, 28,201,189,138,228,140,243, 72, 62,124, 30, 5,101,213, 78,230, 79, 23, 32,130,177,223,235,150, 29,254, 11, 33,158,
+221,179, 75, 46, 60,234, 36,252, 92,200, 0,248,221,246, 50,248,136, 17, 78,229,184,128, 62,224,251,222, 8,185, 56,171, 89,207,
+ 97,130,233,171,135, 17,112,219, 31,160, 30, 58, 29, 60,207, 99,214,140, 89,173, 76,171,218, 29, 47, 66, 44, 56,220,170,174,193,
+216,159,156,122,156,230,161,183,150, 54,232,153, 51,103, 58, 21, 58,172,173,173,197,230,205,155,177,113,227, 70, 80, 74, 45, 6,
+131,225,155,178,178,178,253,140, 49, 35,207,243, 70,198,152,177,170,170,202,136,174,239, 68,216,102,232,176,167,248,171,180, 33,
+241,221, 37, 34, 93,229, 79, 8, 48,121, 88, 52, 38, 15,139,198,170, 95, 78,195,241, 60, 35, 54,238,203, 64,114,250,105,140, 15,
+236,148, 2, 72,140, 97, 7,227,232,107, 17,203, 50,142, 98,185,231,163, 94,252,160, 68,240,125,199, 64, 46, 57, 11,213,136,217,
+208,232,159,116,154,215,223, 28,154,164,223,194,178,229, 9,128, 54, 57,251,204, 81,139,218,255,174,132,122,232,116, 8, 81,163,
+193,135, 15, 1, 9,208, 65,174,184, 12,185,236, 2, 28,185, 7, 64,171, 91,175,165, 98,192,247,125,150, 29,118, 26,216,115,235,
+ 3,152, 76, 38, 20, 23, 23, 99,198,140, 25,237, 62, 80,117,117, 53,190,254,250,107, 36, 39, 39,131, 82,106,190,114,229,202,230,
+178,178,178,131,140, 49, 99,189,157, 95, 28, 26, 26,106,188,120,241,162,221, 35,246,164,194, 31,199,246,124,135,204,228,100, 12,
+161,212,188, 35,219,184,189,223, 56,106,191,101,120,224, 68,157, 63, 63, 26,196,133,233, 79,112,152, 49,178, 94,237,112,124, 21,
+252,236,177,178,158, 12,251, 18,149, 22,254,247,124,220,184, 32,167, 77,101,233,115, 3,212,147, 30,169,115,228, 91,250,102,185,
+251,225,200,221,223,193, 31, 37,121, 2,228, 86,234,237,214, 7,200,206,206,198,157,119,222,217,230,188,153,170,170, 42,124,249,
+229,151, 13,203, 11,107, 13, 6,195,230,170,170,170,180, 6, 27,159, 82,106,212,106,181,198,162,162, 34, 75,101,101,165,199, 42,
+ 84,225,223,154,255,243,151,152, 81,150,139,140,235, 31, 25, 64, 18, 6, 5,106,136, 74,230,136,172, 34, 96, 50, 7,162,170, 10,
+ 95,150, 82, 0,111,131,239, 88, 46, 84,205,132, 95, 1,142, 90, 56, 78,118,121,101,233, 41,153,147,238,212,185,136,106, 53, 42,
+ 64,115, 27, 84, 20, 69,156, 63,127, 30,207, 60,243,140,203,187,149,151,151, 99,253,250,245,216,177, 99, 7,100, 89,174,169,175,
+248,140, 6,161, 81,169, 84,197,140, 49, 99, 69, 69, 69,173,171, 92,239,158, 16, 32,133,191,107,254,119,191,239,203,121,172, 58,
+218,101,112,208, 76,249, 53,248, 62, 55,192,182,255,143, 96, 82,167, 28,252, 20,162, 17,239,138,116, 51,160,215,202, 4, 98,140,
+225,226,197,139, 24, 49, 98, 4,250,245,115,246,245, 74, 74, 74,240,197, 23, 95, 96,247,238,221,144, 36,169,218, 96, 48,108,169,
+174,174, 62,202, 24, 51, 54,216,201, 0,140, 37, 37, 37, 61, 90,235, 10,127,239,242,239, 41, 8,195,102,194,191,223, 68,136,103,
+190,131,120,230, 91, 48,179, 91,203,205, 0, 32,153, 3,217, 18,218,183,127, 74, 91,107, 25, 4,198, 24,107,217, 5, 95,184,112,
+ 1, 79, 61,213, 20, 9, 43, 42, 42,194,231,159,127,142, 3, 7, 14, 64,146, 36, 83,126,126,254,150,218,218,218,147, 13, 81, 17,
+158,231,141,146, 36, 25, 43, 43, 43,123, 60, 91,152, 87,248,203,220, 81,240,244, 53,215,132,136,205,231,249,247, 98,112,218, 48,
+104,110, 90, 12,205,132, 69,117,249,129, 28, 22,124,182,230, 67, 27, 45, 57,179,121, 76, 31,122,118,100,140,176,179,239,242, 35,
+ 29,158, 77, 32, 16, 66,242,171,171,171, 71,134,133,133,129, 82,138,210,210, 82,136,162,136, 41, 83,166,192, 96, 48,224,223,255,
+254, 55,210,210,210, 32,138, 98,229,229,203,151,183,154,205,230,204, 6,231, 16,128, 81,150,101, 99, 85, 85, 85,153,183, 42,196,
+ 27,252,197,205, 43,142, 2, 56,218, 91,249,255,111,104, 2, 15,190, 79,221, 96,215, 57,115,152,188,255,136,120,188,160,160, 96,
+ 91, 85, 85, 85,167, 54,241, 16,236,118,123,106, 73, 73,201,204,254,253,251, 11,148, 82, 92,188,120, 17, 19, 38, 76,192,203, 47,
+191,140, 35, 71,142,192,110,183, 87, 24, 12,134,111,107,107,107,179, 8, 33, 37,168, 91,204, 97,228,121,222, 88, 82, 82, 98,244,
+118, 61, 40,252,189, 15,147,201, 36,100,100,100,120,243,247,121, 66, 8,149,101,185,243,185, 65, 25, 99, 25,121,121,121,246, 33,
+ 67,134, 8,118,187, 29,121,121,121,200,207,207,135,205,102,107,168,248,179,205, 91,155,102,131, 88,212, 23, 42, 95,225,239,117,
+ 24,139,139,139, 79,173, 90,181,138,183,219,237,209,140, 49, 53, 0, 86,159, 97,143, 53,251,160,254, 60,107, 10,203, 59, 95,115,
+119,189,197,189, 90,150,101,178, 44,203,146, 36,149,212,167, 71,236,212, 8, 13, 1,128,105,211,166, 61, 79, 41,125, 11,128,236,
+112, 56,106,138,138,138,182,213,214,214,158,227, 56,174,193,198, 44, 97,140, 21,215, 79, 91,144,224, 99, 80,248,251,134, 81,162,
+211,233,150, 3,232, 91,175,156, 50,234, 18,214, 74,132, 16,153, 49, 38, 19, 66,164,102,231,104,179,107, 13,231,101, 66,136, 84,
+159,228, 86,110,184, 70, 8,145, 41,165, 82,139, 99,185, 33, 35, 52,165, 84,146,101, 89, 98,140, 89,204,102,243,149, 78, 43, 64,
+ 61, 84,225,225,225, 81,140,177, 48,142,227,180, 0,136, 44,203,118,142,227,202,195,195,195, 75, 60, 53, 8,212,141, 80,248,123,
+ 57, 88, 25, 24, 24, 24,205,113,156,154, 16,194, 84, 42, 21, 68, 81,108,108,165, 27, 90,241,230,199,132, 16,218,208,226, 59, 28,
+ 14,167, 30,128, 16,194,154,125, 26,202,194, 98,177, 56,221,131,227, 56, 70, 8, 97,149,149,149,172, 94,233,196,174, 42,128, 2,
+ 5,215,172, 4, 93,181, 4,189, 69,248,255, 3,212, 21,184,121, 66,226, 69,162, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+};
+
diff --git a/source/blender/src/renderwin.c b/source/blender/src/renderwin.c
index 41a600d0eb4..2d56b78b026 100644
--- a/source/blender/src/renderwin.c
+++ b/source/blender/src/renderwin.c
@@ -1081,11 +1081,14 @@ static void do_render(int anim)
/* allow localview render for objects with lights in normal layers */
if(curarea->spacetype==SPACE_VIEW3D) {
- if(G.vd->lay & 0xFF000000) {
- G.scene->lay |= G.vd->lay;
- G.scene->r.scemode |= R_SINGLE_LAYER;
+ /* if view is defined (might not be if called from script), check and set layers. */
+ if(G.vd) {
+ if(G.vd->lay & 0xFF000000) {
+ G.scene->lay |= G.vd->lay;
+ G.scene->r.scemode |= R_SINGLE_LAYER;
+ }
+ else G.scene->lay= G.vd->lay;
}
- else G.scene->lay= G.vd->lay;
}
if(anim)
diff --git a/source/blender/src/resources.c b/source/blender/src/resources.c
index 65f44027aee..125c80093a8 100644
--- a/source/blender/src/resources.c
+++ b/source/blender/src/resources.c
@@ -252,6 +252,8 @@ char *BIF_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colorid)
cp= ts->edge_seam; break;
case TH_EDGE_SHARP:
cp= ts->edge_sharp; break;
+ case TH_EDITMESH_ACTIVE:
+ cp= ts->editmesh_active; break;
case TH_EDGE_FACESEL:
cp= ts->edge_facesel; break;
case TH_FACE:
@@ -486,8 +488,16 @@ void BIF_InitTheme(void)
/* space imageselect */
btheme->timasel= btheme->tv3d;
+ SETCOL(btheme->timasel.active, 195, 195, 195, 255); /* active tile */
+ SETCOL(btheme->timasel.grid, 94, 94, 94, 255); /* active file text */
SETCOL(btheme->timasel.back, 110, 110, 110, 255);
- SETCOL(btheme->timasel.shade1, 0xaa, 0xaa, 0xba, 255);
+ SETCOL(btheme->timasel.header, 195, 195, 195, 255);
+ SETCOL(btheme->timasel.shade1, 94, 94, 94, 255); /* bar */
+ SETCOL(btheme->timasel.shade2, 172, 172, 172, 255); /* sliders */
+ SETCOL(btheme->timasel.hilite, 17, 27, 60, 100); /* selected tile */
+ SETCOL(btheme->timasel.text, 0, 0, 0, 255);
+ SETCOL(btheme->timasel.text_hi, 255, 255, 255, 255);
+ SETCOL(btheme->timasel.panel, 132, 132, 132, 255);
/* space text */
btheme->text= btheme->tv3d;
@@ -591,6 +601,7 @@ char *BIF_ThemeColorsPup(int spacetype)
str += sprintf(str, "Face Selected (transp) %%x%d|", TH_FACE_SELECT);
str += sprintf(str, "Face Dot Selected %%x%d|", TH_FACE_DOT);
str += sprintf(str, "Face Dot Size %%x%d|", TH_FACEDOT_SIZE);
+ str += sprintf(str, "Active Vert/Edge/Face %%x%d|", TH_EDITMESH_ACTIVE);
str += sprintf(str, "Normal %%x%d|", TH_NORMAL);
str += sprintf(str, "Bone Solid %%x%d|", TH_BONE_SOLID);
str += sprintf(str, "Bone Pose %%x%d", TH_BONE_POSE);
@@ -658,7 +669,12 @@ char *BIF_ThemeColorsPup(int spacetype)
str += sprintf(str, "Panel %%x%d|", TH_PANEL);
break;
case SPACE_IMASEL:
- str += sprintf(str, "Main Shade %%x%d|", TH_SHADE1);
+ str += sprintf(str, "Tiles %%x%d|", TH_PANEL);
+ str += sprintf(str, "Scrollbar %%x%d|", TH_SHADE1);
+ str += sprintf(str, "Scroll Handle %%x%d|", TH_SHADE2);
+ str += sprintf(str, "Selected File %%x%d|", TH_HILITE);
+ str += sprintf(str, "Active File %%x%d|", TH_ACTIVE);
+ str += sprintf(str, "Active File Text%%x%d|", TH_GRID);
break;
case SPACE_TEXT:
str += sprintf(str, "Scroll Bar %%x%d|", TH_SHADE1);
diff --git a/source/blender/src/retopo.c b/source/blender/src/retopo.c
index 3f93edee9cd..4ef07b73061 100644
--- a/source/blender/src/retopo.c
+++ b/source/blender/src/retopo.c
@@ -85,7 +85,7 @@ typedef struct RetopoPaintHit {
float where;
} RetopoPaintHit;
-void retopo_do_2d(View3D *v3d, short proj[2], float *v, char adj);
+void retopo_do_2d(View3D *v3d, double proj[2], float *v, char adj);
void retopo_paint_debug_print(RetopoPaintData *rpd);
/* Painting */
@@ -295,7 +295,8 @@ void retopo_paint_apply()
for(i=0; i<hitcount; ++i) {
RetopoPaintPoint *intersection= BLI_findlink(&rpd->intersections,i);
- retopo_do_2d(rpd->paint_v3d,&intersection->loc.x, hitco, 1);
+ double proj[2] = {intersection->loc.x, intersection->loc.y};
+ retopo_do_2d(rpd->paint_v3d, proj, hitco, 1);
intersection->eve= addvertlist(hitco, NULL);
intersection->eve->f= SELECT;
}
@@ -320,12 +321,16 @@ void retopo_paint_apply()
void add_rppoint(RetopoPaintLine *l, short x, short y)
{
RetopoPaintPoint *p= MEM_callocN(sizeof(RetopoPaintPoint),"RetopoPaintPoint");
+ double proj[2];
p->loc.x= x;
p->loc.y= y;
BLI_addtail(&l->points,p);
p->index= p->prev?p->prev->index+1:0;
- retopo_do_2d(G.editMesh->retopo_paint_data->paint_v3d, &p->loc.x, p->co, 1);
+ proj[0] = p->loc.x;
+ proj[1] = p->loc.y;
+
+ retopo_do_2d(G.editMesh->retopo_paint_data->paint_v3d, proj, p->co, 1);
}
RetopoPaintLine *add_rpline(RetopoPaintData *rpd)
{
@@ -749,13 +754,13 @@ void retopo_toggle(void *j1,void *j2)
allqueue(REDRAWVIEW3D, 0);
}
-void retopo_do_2d(View3D *v3d, short proj[2], float *v, char adj)
+void retopo_do_2d(View3D *v3d, double proj[2], float *v, char adj)
{
/* Check to make sure vert is visible in window */
if(proj[0]>0 && proj[1]>0 && proj[0] < v3d->depths->w && proj[1] < v3d->depths->h) {
- float depth= v3d->depths->depths[(int)(proj[1]*v3d->depths->w+proj[0])];
+ float depth= v3d->depths->depths[((int)proj[1])*v3d->depths->w+((int)proj[0])];
double px, py, pz;
-
+
/* Don't modify the point if it'll be mapped to the background */
if(depth==v3d->depths->depth_range[1]) {
if(adj) {
@@ -781,14 +786,11 @@ void retopo_do_2d(View3D *v3d, short proj[2], float *v, char adj)
void retopo_do_vert(View3D *v3d, float *v)
{
- short proj[2];
- double px, py, pz;
+ double proj[3];
/* Find 2D location (project) */
gluProject(v[0],v[1],v[2],v3d->retopo_view_data->mats.modelview,v3d->retopo_view_data->mats.projection,
- (GLint *)v3d->retopo_view_data->mats.viewport,&px,&py,&pz);
- proj[0]= px;
- proj[1]= py;
+ (GLint *)v3d->retopo_view_data->mats.viewport,&proj[0],&proj[1],&proj[2]);
retopo_do_2d(v3d,proj,v,0);
}
diff --git a/source/blender/src/sculptmode-stroke.c b/source/blender/src/sculptmode-stroke.c
new file mode 100644
index 00000000000..2f8dac2818c
--- /dev/null
+++ b/source/blender/src/sculptmode-stroke.c
@@ -0,0 +1,279 @@
+/*
+ * $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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) 2007 by Nicholas Bishop
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ *
+ * Storage and manipulation of sculptmode brush strokes.
+ *
+ */
+
+#include "MEM_guardedalloc.h"
+#include "DNA_listBase.h"
+#include "DNA_scene_types.h"
+#include "BLI_blenlib.h"
+#include "BIF_gl.h"
+#include "BDR_sculptmode.h"
+#include <math.h>
+
+/* Temporary storage of input stroke control points */
+typedef struct StrokePoint {
+ struct StrokePoint *next, *prev;
+ short x, y;
+} StrokePoint;
+typedef struct SculptStroke {
+ short (*loc)[2];
+ int max;
+ int index;
+ float length;
+ ListBase final;
+ StrokePoint *final_mem;
+ float offset;
+} SculptStroke;
+
+void sculpt_stroke_new(const int max)
+{
+ SculptSession *ss = sculpt_session();
+
+ ss->stroke = MEM_callocN(sizeof(SculptStroke), "SculptStroke");
+ ss->stroke->loc = MEM_callocN(sizeof(short) * 2 * max, "SculptStroke.loc");
+ ss->stroke->max = max;
+ ss->stroke->index = -1;
+}
+
+void sculpt_stroke_free()
+{
+ SculptSession *ss = sculpt_session();
+ if(ss && ss->stroke) {
+ if(ss->stroke->loc) MEM_freeN(ss->stroke->loc);
+ if(ss->stroke->final_mem) MEM_freeN(ss->stroke->final_mem);
+
+ MEM_freeN(ss->stroke);
+ ss->stroke = NULL;
+ }
+}
+
+void sculpt_stroke_add_point(const short x, const short y)
+{
+ SculptStroke *stroke = sculpt_session()->stroke;
+ const int next = stroke->index + 1;
+
+ if(stroke->index == -1) {
+ stroke->loc[0][0] = x;
+ stroke->loc[0][1] = y;
+ stroke->index = 0;
+ }
+ else if(next < stroke->max) {
+ const int dx = x - stroke->loc[stroke->index][0];
+ const int dy = y - stroke->loc[stroke->index][1];
+ stroke->loc[next][0] = x;
+ stroke->loc[next][1] = y;
+ stroke->length += sqrt(dx*dx + dy*dy);
+ stroke->index = next;
+ }
+}
+
+void sculpt_stroke_smooth(SculptStroke *stroke)
+{
+ /* Apply smoothing (exclude the first and last points)*/
+ StrokePoint *p = stroke->final.first;
+ if(p && p->next && p->next->next) {
+ for(p = p->next->next; p && p->next && p->next->next; p = p->next) {
+ p->x = p->prev->prev->x*0.1 + p->prev->x*0.2 + p->x*0.4 + p->next->x*0.2 + p->next->next->x*0.1;
+ p->y = p->prev->prev->y*0.1 + p->prev->y*0.2 + p->y*0.4 + p->next->y*0.2 + p->next->next->y*0.1;
+ }
+ }
+}
+
+static void sculpt_stroke_create_final()
+{
+ SculptStroke *stroke = sculpt_session()->stroke;
+
+ if(stroke) {
+ StrokePoint *p, *pnext;
+ int i;
+
+ /* Copy loc into final */
+ if(stroke->final_mem)
+ MEM_freeN(stroke->final_mem);
+ stroke->final_mem = MEM_callocN(sizeof(StrokePoint) * (stroke->index + 1) * 2, "SculptStroke.final");
+ stroke->final.first = stroke->final.last = NULL;
+ for(i = 0; i <= stroke->index; ++i) {
+ p = &stroke->final_mem[i];
+ p->x = stroke->loc[i][0];
+ p->y = stroke->loc[i][1];
+ BLI_addtail(&stroke->final, p);
+ }
+
+ /* Remove shortest edges */
+ if(stroke->final.first) {
+ for(p = ((StrokePoint*)stroke->final.first)->next; p && p->next; p = pnext) {
+ const int dx = p->x - p->prev->x;
+ const int dy = p->y - p->prev->y;
+ const float len = sqrt(dx*dx + dy*dy);
+ pnext = p->next;
+ if(len < 10) {
+ BLI_remlink(&stroke->final, p);
+ }
+ }
+ }
+
+ sculpt_stroke_smooth(stroke);
+
+ /* Subdivide edges */
+ for(p = stroke->final.first; p && p->next; p = pnext) {
+ StrokePoint *np = &stroke->final_mem[i++];
+
+ pnext = p->next;
+ np->x = (p->x + p->next->x) / 2;
+ np->y = (p->y + p->next->y) / 2;
+ BLI_insertlink(&stroke->final, p, np);
+ }
+
+ sculpt_stroke_smooth(stroke);
+ }
+}
+
+float sculpt_stroke_seglen(StrokePoint *p1, StrokePoint *p2)
+{
+ int dx = p2->x - p1->x;
+ int dy = p2->y - p1->y;
+ return sqrt(dx*dx + dy*dy);
+}
+
+float sculpt_stroke_final_length(SculptStroke *stroke)
+{
+ StrokePoint *p;
+ float len = 0;
+ for(p = stroke->final.first; p && p->next; ++p)
+ len += sculpt_stroke_seglen(p, p->next);
+ return len;
+}
+
+/* If partial is nonzero, cuts off apply after that length has been processed */
+static StrokePoint *sculpt_stroke_apply_generic(SculptStroke *stroke, struct EditData *e, const int partial)
+{
+ const int sdspace = sculpt_data()->spacing;
+ const short spacing = sdspace > 0 ? sdspace : 2;
+ const int dots = sculpt_stroke_final_length(stroke) / spacing;
+ int i;
+ StrokePoint *p = stroke->final.first;
+ float startloc = stroke->offset;
+
+ for(i = 0; i < dots && p && p->next; ++i) {
+ const float dotloc = spacing * i;
+ short co[2];
+ float len = sculpt_stroke_seglen(p, p->next);
+ float u, v;
+
+ /* Find edge containing dot */
+ while(dotloc > startloc + len && p && p->next && p->next->next) {
+ p = p->next;
+ startloc += len;
+ len = sculpt_stroke_seglen(p, p->next);
+ }
+
+ if(!p || !p->next || dotloc > startloc + len)
+ break;
+
+ if(partial && startloc > partial) {
+ /* Calculate offset for next stroke segment */
+ stroke->offset = startloc + len - dotloc;
+ break;
+ }
+
+ u = (dotloc - startloc) / len;
+ v = 1 - u;
+
+ co[0] = p->x*v + p->next->x*u;
+ co[1] = p->y*v + p->next->y*u;
+
+ do_symmetrical_brush_actions(e, co, NULL);
+ }
+
+ return p ? p->next : NULL;
+}
+
+void sculpt_stroke_apply(struct EditData *e)
+{
+ SculptStroke *stroke = sculpt_session()->stroke;
+ /* TODO: make these values user-modifiable? */
+ const int partial_len = 100;
+ const int min_len = 200;
+
+ if(stroke) {
+ sculpt_stroke_create_final();
+
+ if(sculpt_stroke_final_length(stroke) > min_len) {
+ StrokePoint *p = sculpt_stroke_apply_generic(stroke, e, partial_len);
+
+ /* Replace remaining values in stroke->loc with remaining stroke->final values */
+ stroke->index = -1;
+ stroke->length = 0;
+ for(; p; p = p->next) {
+ ++stroke->index;
+ stroke->loc[stroke->index][0] = p->x;
+ stroke->loc[stroke->index][1] = p->y;
+ if(p->next) {
+ stroke->length += sculpt_stroke_seglen(p, p->next);
+ }
+ }
+ }
+ }
+}
+
+void sculpt_stroke_apply_all(struct EditData *e)
+{
+ SculptStroke *stroke = sculpt_session()->stroke;
+
+ sculpt_stroke_create_final();
+
+ if(stroke) {
+ sculpt_stroke_apply_generic(stroke, e, 0);
+ }
+}
+
+void sculpt_stroke_draw()
+{
+ SculptStroke *stroke = sculpt_session()->stroke;
+
+ if(stroke) {
+ StrokePoint *p;
+
+ /* Draws the original stroke */
+ /*glColor3f(1, 0, 0);
+ glBegin(GL_LINE_STRIP);
+ for(i = 0; i <= stroke->index; ++i)
+ glVertex2s(stroke->loc[i][0], stroke->loc[i][1]);
+ glEnd();*/
+
+ /* Draws the smoothed stroke */
+ glColor3f(0, 1, 0);
+ glBegin(GL_LINE_STRIP);
+ for(p = stroke->final.first; p; p = p->next)
+ glVertex2s(p->x, p->y);
+ glEnd();
+ }
+}
diff --git a/source/blender/src/sculptmode.c b/source/blender/src/sculptmode.c
index c6c27c5ba59..43b33a5c9a8 100644
--- a/source/blender/src/sculptmode.c
+++ b/source/blender/src/sculptmode.c
@@ -175,6 +175,7 @@ SculptData *sculpt_data(void)
}
void sculpt_init_session(void);
+void init_editdata(EditData *e, short *, short *);
SculptSession *sculpt_session(void)
{
@@ -221,7 +222,7 @@ void sculptmode_init(Scene *sce)
sd->averaging= 1;
sd->texsep= 0;
sd->texrept= SCULPTREPT_DRAG;
- sd->draw_flag= SCULPTDRAW_BRUSH;
+ sd->flags= SCULPT_DRAW_BRUSH;
sd->tablet_size=3;
sd->tablet_strength=10;
}
@@ -881,7 +882,7 @@ float tex_strength(EditData *e, float *point, const float len,const unsigned vin
/* Mark area around the brush as damaged. projverts are marked if they are
inside the area and the damaged rectangle in 2D screen coordinates is
added to damaged_rects. */
-void sculptmode_add_damaged_rect(EditData *e, ListBase *damaged_rects)
+void sculptmode_add_damaged_rect(EditData *e)
{
short p[2];
const float radius= brush_size();
@@ -896,7 +897,7 @@ void sculptmode_add_damaged_rect(EditData *e, ListBase *damaged_rects)
rn->r.xmax= p[0]+radius;
rn->r.ymax= p[1]+radius;
- BLI_addtail(damaged_rects,rn);
+ BLI_addtail(&sculpt_session()->damaged_rects, rn);
/* Update insides */
for(i=0; i<me->totvert; ++i) {
@@ -909,8 +910,7 @@ void sculptmode_add_damaged_rect(EditData *e, ListBase *damaged_rects)
}
}
-void do_brush_action(float *vertexcosnos, EditData e,
- ListBase *damaged_verts, ListBase *damaged_rects)
+void do_brush_action(EditData e)
{
int i;
float av_dist;
@@ -920,8 +920,9 @@ void do_brush_action(float *vertexcosnos, EditData e,
Mesh *me= get_mesh(OBACT);
const float bstrength= brush_strength(&e);
KeyBlock *keyblock= ob_get_keyblock(OBACT);
+ SculptSession *ss = sculpt_session();
- sculptmode_add_damaged_rect(&e,damaged_rects);
+ sculptmode_add_damaged_rect(&e);
/* Build a list of all vertices that are potentially within the brush's
area of influence. Only do this once for the grab brush. */
@@ -929,7 +930,7 @@ void do_brush_action(float *vertexcosnos, EditData e,
for(i=0; i<me->totvert; ++i) {
/* Projverts.inside provides a rough bounding box */
if(projverts[i].inside) {
- vert= vertexcosnos ? &vertexcosnos[i*6] : me->mvert[i].co;
+ vert= ss->vertexcosnos ? &ss->vertexcosnos[i*6] : me->mvert[i].co;
av_dist= VecLenf(&e.center.x,vert);
if(av_dist < e.size) {
adata= (ActiveData*)MEM_mallocN(sizeof(ActiveData), "ActiveData");
@@ -985,11 +986,11 @@ void do_brush_action(float *vertexcosnos, EditData e,
}
}
- if(vertexcosnos)
+ if(ss->vertexcosnos)
BLI_freelistN(&active_verts);
else {
if(!e.grabdata)
- addlisttolist(damaged_verts, &active_verts);
+ addlisttolist(&ss->damaged_verts, &active_verts);
}
}
}
@@ -1019,27 +1020,28 @@ EditData flip_editdata(EditData *e, const char symm)
return fe;
}
-void do_symmetrical_brush_actions(float *vertexcosnos, EditData *e,
- ListBase *damaged_verts, ListBase *damaged_rects)
+void do_symmetrical_brush_actions(EditData * e, short co[2], short pr_co[2])
{
const char symm= sculpt_data()->symm;
+
+ init_editdata(e, co, pr_co);
- do_brush_action(vertexcosnos, flip_editdata(e, 0), damaged_verts, damaged_rects);
+ do_brush_action(flip_editdata(e, 0));
if(symm & SYMM_X)
- do_brush_action(vertexcosnos, flip_editdata(e, SYMM_X), damaged_verts, damaged_rects);
+ do_brush_action(flip_editdata(e, SYMM_X));
if(symm & SYMM_Y)
- do_brush_action(vertexcosnos, flip_editdata(e, SYMM_Y), damaged_verts, damaged_rects);
+ do_brush_action(flip_editdata(e, SYMM_Y));
if(symm & SYMM_Z)
- do_brush_action(vertexcosnos, flip_editdata(e, SYMM_Z), damaged_verts, damaged_rects);
+ do_brush_action(flip_editdata(e, SYMM_Z));
if(symm & SYMM_X && symm & SYMM_Y)
- do_brush_action(vertexcosnos, flip_editdata(e, SYMM_X | SYMM_Y), damaged_verts, damaged_rects);
+ do_brush_action(flip_editdata(e, SYMM_X | SYMM_Y));
if(symm & SYMM_X && symm & SYMM_Z)
- do_brush_action(vertexcosnos, flip_editdata(e, SYMM_X | SYMM_Z), damaged_verts, damaged_rects);
+ do_brush_action(flip_editdata(e, SYMM_X | SYMM_Z));
if(symm & SYMM_Y && symm & SYMM_Z)
- do_brush_action(vertexcosnos, flip_editdata(e, SYMM_Y | SYMM_Z), damaged_verts, damaged_rects);
+ do_brush_action(flip_editdata(e, SYMM_Y | SYMM_Z));
if(symm & SYMM_X && symm & SYMM_Y && symm & SYMM_Z)
- do_brush_action(vertexcosnos, flip_editdata(e, SYMM_X | SYMM_Y | SYMM_Z), damaged_verts, damaged_rects);
+ do_brush_action(flip_editdata(e, SYMM_X | SYMM_Y | SYMM_Z));
}
void add_face_normal(vec3f *norm, const MFace* face)
@@ -1090,6 +1092,17 @@ void calc_damaged_verts(ListBase *damaged_verts, GrabData *grabdata)
} else {
update_damaged_vert(me,damaged_verts);
BLI_freelistN(damaged_verts);
+ damaged_verts->first = damaged_verts->last = NULL;
+ }
+}
+
+void projverts_clear_inside()
+{
+ Mesh *me = get_mesh(OBACT);
+ if(me) {
+ int i;
+ for(i = 0; i < me->totvert; ++i)
+ projverts[i].inside = 0;
}
}
@@ -1165,12 +1178,15 @@ void sculptmode_update_tex()
}
}
-void init_editdata(SculptData *sd, EditData *e, short *mouse, short *pr_mouse, const char flip)
+/* pr_mouse is only used for the grab brush, can be NULL otherwise */
+void init_editdata(EditData *e, short *mouse, short *pr_mouse)
{
+ SculptData *sd = sculpt_data();
const float mouse_depth= get_depth(mouse[0],mouse[1]);
vec3f brush_edge_loc, zero_loc, oldloc;
ModifierData *md;
int i;
+ const char flip = (get_qual() == LR_SHIFTKEY);
e->flip= flip;
@@ -1182,6 +1198,10 @@ void init_editdata(SculptData *sd, EditData *e, short *mouse, short *pr_mouse, c
mouse_depth);
e->size= VecLenf(&e->center.x,&brush_edge_loc.x);
+ /* Set the pivot to allow the model to rotate around the center of the brush */
+ if(get_depth(mouse[0],mouse[1]) < 1.0)
+ sculpt_session()->pivot= e->center;
+
/* Now project the Up, Right, and Out normals from view to model coords */
zero_loc= unproject(0, 0, 0);
e->up= unproject(0, -1, 0);
@@ -1239,7 +1259,6 @@ void init_editdata(SculptData *sd, EditData *e, short *mouse, short *pr_mouse, c
}
}
}
-
void sculptmode_set_strength(const int delta)
{
int val = sculptmode_brush()->strength + delta;
@@ -1387,7 +1406,7 @@ void sculptmode_propset_init(PropsetMode mode)
void sculpt_paint_brush(char clear)
{
- if(sculpt_data()->draw_flag & SCULPTDRAW_BRUSH) {
+ if(sculpt_data()->flags & SCULPT_DRAW_BRUSH) {
static short mvalo[2];
short mval[2];
const short rad= sculptmode_brush()->size;
@@ -1550,6 +1569,7 @@ void sculptmode_draw_mesh(int only_damaged)
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
init_gl_materials(OBACT, 0);
+ glEnable(GL_CULL_FACE);
glShadeModel(GL_SMOOTH);
@@ -1560,7 +1580,6 @@ void sculptmode_draw_mesh(int only_damaged)
if(dt==OB_WIRE)
glColorMask(0,0,0,0);
-
for(i=0; i<me->totface; ++i) {
MFace *f= &me->mface[i];
char inside= 0;
@@ -1586,6 +1605,7 @@ void sculptmode_draw_mesh(int only_damaged)
glDrawElements(f->v4?GL_QUADS:GL_TRIANGLES, f->v4?4:3, GL_UNSIGNED_INT, &f->v1);
}
+ glDisable(GL_CULL_FACE);
glDisable(GL_LIGHTING);
glColorMask(1,1,1,1);
@@ -1625,13 +1645,11 @@ void sculpt(void)
SculptSession *ss= sculpt_session();
Object *ob= OBACT;
short mouse[2], mvalo[2], firsttime=1, mousebut;
- ListBase damaged_verts= {0,0};
- ListBase damaged_rects= {0,0};
- float *vertexcosnos= 0;
short modifier_calculations= 0;
EditData e;
RectNode *rn= NULL;
short spacing= 32000;
+ int scissor_box[4];
if(!(G.f & G_SCULPTMODE) || G.obedit || !ob || ob->id.lib || !get_mesh(ob) || (get_mesh(ob)->totface == 0))
return;
@@ -1649,6 +1667,13 @@ void sculpt(void)
ss= sd->session;
}
+ if(sd->flags & SCULPT_INPUT_SMOOTH)
+ sculpt_stroke_new(256);
+
+ ss->damaged_rects.first = ss->damaged_rects.last = NULL;
+ ss->damaged_verts.first = ss->damaged_verts.last = NULL;
+ ss->vertexcosnos = NULL;
+
/* Check that vertex users are up-to-date */
if(ob != active_ob || ss->vertex_users_size != get_mesh(ob)->totvert) {
sculptmode_free_vertexusers(ss);
@@ -1675,8 +1700,7 @@ void sculpt(void)
mvalo[0]= mouse[0];
mvalo[1]= mouse[1];
- if (U.flag & USER_LMOUSESELECT) mousebut = R_MOUSE;
- else mousebut = L_MOUSE;
+ mousebut = L_MOUSE;
/* If modifier_calculations is true, then extra time must be spent
updating the mesh. This takes a *lot* longer, so it's worth
@@ -1686,8 +1710,8 @@ void sculpt(void)
init_sculptmatrices();
if(modifier_calculations)
- vertexcosnos= mesh_get_mapped_verts_nors(ob);
- sculptmode_update_all_projverts(vertexcosnos);
+ ss->vertexcosnos= mesh_get_mapped_verts_nors(ob);
+ sculptmode_update_all_projverts(ss->vertexcosnos);
e.grabdata= NULL;
e.layer_disps= NULL;
@@ -1699,66 +1723,55 @@ void sculpt(void)
e.scale[2]= 1.0f / ob->size[2];
/* Capture original copy */
- if(sd->draw_flag & SCULPTDRAW_FAST)
+ if(sd->flags & SCULPT_DRAW_FAST)
glAccum(GL_LOAD, 1);
+ /* Get original scissor box */
+ glGetIntegerv(GL_SCISSOR_BOX, scissor_box);
+
while (get_mbut() & mousebut) {
getmouseco_areawin(mouse);
if(firsttime || mouse[0]!=mvalo[0] || mouse[1]!=mvalo[1] || sculptmode_brush()->airbrush) {
firsttime= 0;
+ if(sd->flags & SCULPT_INPUT_SMOOTH)
+ sculpt_stroke_add_point(mouse[0], mouse[1]);
+
spacing+= sqrt(pow(mvalo[0]-mouse[0],2)+pow(mvalo[1]-mouse[1],2));
- if(modifier_calculations && !vertexcosnos)
- vertexcosnos= mesh_get_mapped_verts_nors(ob);
-
- if(G.scene->sculptdata.brush_type != GRAB_BRUSH && (sd->spacing==0 || spacing>sd->spacing)) {
- char i;
- float t= G.scene->sculptdata.averaging-1;
- const float sub= 1/(t+1);
- t/= (t+1);
- for(i=0; i<G.scene->sculptdata.averaging; ++i) {
- short avgco[2]= {mvalo[0]*t+mouse[0]*(1-t),
- mvalo[1]*t+mouse[1]*(1-t)};
-
- init_editdata(&G.scene->sculptdata,&e,avgco,mvalo,get_qual()==LR_SHIFTKEY);
-
- if(get_depth(mouse[0],mouse[1]) < 1.0)
- ss->pivot= e.center;
-
- /* The brush always has at least one area it affects,
- right beneath the mouse. It can have up to seven
- other areas that must also be modified, if all three
- axes of symmetry are on. */
- do_symmetrical_brush_actions(vertexcosnos,&e,&damaged_verts,&damaged_rects);
+ if(modifier_calculations && !ss->vertexcosnos)
+ ss->vertexcosnos= mesh_get_mapped_verts_nors(ob);
- t-= sub;
+ if(G.scene->sculptdata.brush_type != GRAB_BRUSH) {
+ if(sd->flags & SCULPT_INPUT_SMOOTH) {
+ sculpt_stroke_apply(&e);
+ }
+ else if(sd->spacing==0 || spacing>sd->spacing) {
+ do_symmetrical_brush_actions(&e, mouse, NULL);
+ spacing= 0;
}
- spacing= 0;
}
- else if(sd->brush_type==GRAB_BRUSH) {
- init_editdata(&G.scene->sculptdata,&e,mouse,mvalo,0);
+ else {
+ do_symmetrical_brush_actions(&e, mouse, mvalo);
ss->pivot= unproject(mouse[0],mouse[1],e.grabdata->depth);
- do_symmetrical_brush_actions(vertexcosnos,&e,&damaged_verts,&damaged_rects);
}
-
+
if(modifier_calculations || ob_get_keyblock(ob))
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- if(modifier_calculations || sd->brush_type == GRAB_BRUSH || !(sd->draw_flag & SCULPTDRAW_FAST)) {
- calc_damaged_verts(&damaged_verts,e.grabdata);
+ if(modifier_calculations || sd->brush_type == GRAB_BRUSH || !(sd->flags & SCULPT_DRAW_FAST)) {
+ calc_damaged_verts(&ss->damaged_verts,e.grabdata);
scrarea_do_windraw(curarea);
screen_swapbuffers();
} else { /* Optimized drawing */
- calc_damaged_verts(&damaged_verts,e.grabdata);
+ calc_damaged_verts(&ss->damaged_verts,e.grabdata);
/* Draw the stored image to the screen */
glAccum(GL_RETURN, 1);
/* Clear each of the area(s) modified by the brush */
- for(rn=damaged_rects.first; rn; rn= rn->next) {
- float col[3];
+ for(rn=ss->damaged_rects.first; rn; rn= rn->next) {
rcti clp= rn->r;
rcti *win= &curarea->winrct;
@@ -1777,41 +1790,49 @@ void sculpt(void)
clp.xmax-clp.xmin-2,clp.ymax-clp.ymin-2);
}
- BIF_GetThemeColor3fv(TH_BACK, col);
- glClearColor(col[0], col[1], col[2], 0.0);
- glClear(GL_DEPTH_BUFFER_BIT|GL_COLOR_BUFFER_BIT);
+ glClear(GL_DEPTH_BUFFER_BIT);
}
/* Draw all the polygons that are inside the modified area(s) */
- glDisable(GL_SCISSOR_TEST);
+ glScissor(scissor_box[0], scissor_box[1], scissor_box[2], scissor_box[3]);
sculptmode_draw_mesh(1);
glAccum(GL_LOAD, 1);
- glEnable(GL_SCISSOR_TEST);
+
+ projverts_clear_inside();
+
+ persp(PERSP_WIN);
+ glDisable(GL_DEPTH_TEST);
/* Draw cursor */
- if(sculpt_data()->draw_flag & SCULPTDRAW_BRUSH) {
- persp(PERSP_WIN);
- glDisable(GL_DEPTH_TEST);
+ if(sculpt_data()->flags & SCULPT_DRAW_BRUSH)
fdrawXORcirc((float)mouse[0],(float)mouse[1],sculptmode_brush()->size);
- }
+ if(sculpt_data()->flags & SCULPT_INPUT_SMOOTH)
+ sculpt_stroke_draw();
myswapbuffers();
}
- BLI_freelistN(&damaged_rects);
+ BLI_freelistN(&ss->damaged_rects);
+ ss->damaged_rects.first = ss->damaged_rects.last = NULL;
mvalo[0]= mouse[0];
mvalo[1]= mouse[1];
- if(vertexcosnos) {
- MEM_freeN(vertexcosnos);
- vertexcosnos= NULL;
+ if(ss->vertexcosnos) {
+ MEM_freeN(ss->vertexcosnos);
+ ss->vertexcosnos= NULL;
}
}
else BIF_wait_for_statechange();
}
+ if(sd->flags & SCULPT_INPUT_SMOOTH) {
+ sculpt_stroke_apply_all(&e);
+ calc_damaged_verts(&ss->damaged_verts,e.grabdata);
+ BLI_freelistN(&ss->damaged_rects);
+ }
+
if(projverts) MEM_freeN(projverts);
projverts= NULL;
if(e.layer_disps) MEM_freeN(e.layer_disps);
@@ -1823,6 +1844,7 @@ void sculpt(void)
BLI_freelistN(&e.grabdata->active_verts[i]);
MEM_freeN(e.grabdata);
}
+ sculpt_stroke_free();
switch(G.scene->sculptdata.brush_type) {
case DRAW_BRUSH:
diff --git a/source/blender/src/seqaudio.c b/source/blender/src/seqaudio.c
index 4bac7fdb250..de8cc488a85 100644
--- a/source/blender/src/seqaudio.c
+++ b/source/blender/src/seqaudio.c
@@ -95,6 +95,7 @@ static int audio_pos;
static int audio_scrub=0;
static int audio_playing=0;
static int audio_initialised=0;
+static int audio_startframe=0;
/////
//
/* local protos ------------------- */
@@ -139,7 +140,7 @@ void audio_mixdown()
strcpy(buf, "RIFFlengWAVEfmt fmln01ccRATEbsecBP16dataDLEN");
totframe = (EFRA - SFRA + 1);
- totlen = (int) ( ((float)totframe / (float)G.scene->r.frs_sec) * (float)G.scene->audio.mixrate * 4.0);
+ totlen = (int) ( FRA2TIME(totframe) * (float)G.scene->audio.mixrate * 4.0);
printf(" totlen %d\n", totlen+36+8);
totlen+= 36; /* len is filesize-8 in WAV spec, total header is 44 bytes */
@@ -182,7 +183,7 @@ void audio_mixdown()
memset(buf+i, 0, 64);
- CFRA=(int) ( ((float)(audio_pos-64)/( G.scene->audio.mixrate*4 ))*(float)G.scene->r.frs_sec );
+ CFRA=(int) ( ((float)(audio_pos-64)/( G.scene->audio.mixrate*4 ))*FPS );
audio_fill(buf+i, NULL, 64);
if (G.order == B_ENDIAN) {
@@ -216,7 +217,7 @@ void audiostream_fill(Uint8 *mixdown, int len)
for (i = 0; i < len; i += 64) {
CFRA = (int) ( ((float)(audio_pos-64)
/( G.scene->audio.mixrate*4 ))
- *(float)G.scene->r.frs_sec );
+ * FPS );
audio_fill(mixdown + i, NULL,
(len - i) > 64 ? 64 : (len - i));
@@ -452,9 +453,8 @@ static int audiostream_play_seq(Sequence * seq, Uint32 startframe)
}
if ((seq->type == SEQ_RAM_SOUND) && (seq->sound)) {
have_sound = 1;
- seq->curpos = (int)( (((float)((float)startframe
- -(float)seq->start)
- / (float)G.scene->r.frs_sec)
+ seq->curpos = (int)( (FRA2TIME((double) startframe -
+ (double) seq->start)
* ((float)G.scene->audio.mixrate)
* 4 ));
}
@@ -467,9 +467,8 @@ static int audiostream_play_seq(Sequence * seq, Uint32 startframe)
seq->hdaudio = sound_open_hdaudio(name);
}
- seq->curpos = (int)( (((float)((float)startframe
- - (float)seq->start)
- / (float)G.scene->r.frs_sec)
+ seq->curpos = (int)( (FRA2TIME((double) startframe -
+ (double) seq->start)
* ((float)G.scene->audio.mixrate)
* 4 ));
}
@@ -506,8 +505,8 @@ void audiostream_play(Uint32 startframe, Uint32 duration, int mixdown)
}
}
- audio_pos = ( ((int)( (((float)startframe)
- /(float)G.scene->r.frs_sec)
+ audio_startframe = startframe;
+ audio_pos = ( ((int)( FRA2TIME(startframe)
*(G.scene->audio.mixrate)*4 )) & (~3) );
audio_scrub = duration;
@@ -537,8 +536,11 @@ int audiostream_pos(void)
{
int pos;
- pos = (int) ( ((float)(audio_pos-U.mixbufsize)/( G.scene->audio.mixrate*4 ))*(float)G.scene->r.frs_sec );
- if (pos<1) pos=1;
+ pos = (int) (((double)(audio_pos-U.mixbufsize)
+ / ( G.scene->audio.mixrate*4 ))
+ * FPS );
+
+ if (pos < audio_startframe) pos = audio_startframe;
return ( pos );
}
diff --git a/source/blender/src/seqeffects.c b/source/blender/src/seqeffects.c
index 63069eb425d..5b89bd3ee44 100644
--- a/source/blender/src/seqeffects.c
+++ b/source/blender/src/seqeffects.c
@@ -1926,6 +1926,8 @@ static void init_transform_effect(Sequence *seq)
scale->rotIni=0;
scale->rotFin=0;
+ scale->interpolation=1;
+ scale->percent=1;
}
static int num_inputs_transform()
@@ -1944,49 +1946,8 @@ static void copy_transform_effect(Sequence *dst, Sequence *src)
dst->effectdata = MEM_dupallocN(src->effectdata);
}
-/* function assumes out to be zero'ed, only does RGBA */
-static void bilinear_interpolation_transform_float(ImBuf *in, float *out, float u, float v)
-{
- float *row1, *row2, *row3, *row4, a, b;
- float a_b, ma_b, a_mb, ma_mb;
- float empty[4]= {0.0f, 0.0f, 0.0f, 0.0f};
- int y1, y2, x1, x2;
-
- x1= (int)floor(u);
- x2= (int)ceil(u);
- y1= (int)floor(v);
- y2= (int)ceil(v);
-
- /* sample area entirely outside image? */
- if(x2<0 || x1>in->x-1 || y2<0 || y1>in->y-1)
- return;
-
- /* sample including outside of edges of image */
- if(x1<0 || y1<0) row1= empty;
- else row1= in->rect_float + in->x * y1 * 4 + 4*x1;
-
- if(x1<0 || y2>in->y-1) row2= empty;
- else row2= in->rect_float + in->x * y2 * 4 + 4*x1;
-
- if(x2>in->x-1 || y1<0) row3= empty;
- else row3= in->rect_float + in->x * y1 * 4 + 4*x2;
-
- if(x2>in->x-1 || y2>in->y-1) row4= empty;
- else row4= in->rect_float + in->x * y2 * 4 + 4*x2;
-
- a= u-floor(u);
- b= v-floor(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);
-
- out[0]= ma_mb*row1[0] + a_mb*row3[0] + ma_b*row2[0]+ a_b*row4[0];
- out[1]= ma_mb*row1[1] + a_mb*row3[1] + ma_b*row2[1]+ a_b*row4[1];
- out[2]= ma_mb*row1[2] + a_mb*row3[2] + ma_b*row2[2]+ a_b*row4[2];
- out[3]= ma_mb*row1[3] + a_mb*row3[3] + ma_b*row2[3]+ a_b*row4[3];
-}
-
-
-static void do_transform_effect_float(Sequence * seq,float facf0, int x, int y,
- struct ImBuf *ibuf1,float *out)
+static void do_transform(Sequence * seq,float facf0, int x, int y,
+ struct ImBuf *ibuf1,struct ImBuf *out)
{
int xo, yo, xi, yi;
float xs,ys,factxScale,factyScale,tx,ty,rad,s,c,xaux,yaux,factRot,px,py;
@@ -1996,151 +1957,20 @@ static void do_transform_effect_float(Sequence * seq,float facf0, int x, int y,
xo = x;
yo = y;
- /*factor scale*/
+ //factor scale
factxScale = scale->ScalexIni + (scale->ScalexFin - scale->ScalexIni) * facf0;
factyScale = scale->ScaleyIni + (scale->ScaleyFin - scale->ScaleyIni) * facf0;
- /*Factor translate*/
- tx = scale->xIni+(xo / 2.0f) + (scale->xFin-(xo / 2.0f) - scale->xIni+(xo / 2.0f)) * facf0;
- ty = scale->yIni+(yo / 2.0f) + (scale->yFin-(yo / 2.0f) - scale->yIni+(yo / 2.0f)) * facf0;
-
- /*factor Rotate*/
- factRot = scale->rotIni + (scale->rotFin - scale->rotIni) * facf0;
- rad = (M_PI * factRot) / 180.0f;
- s= sin(rad);
- c= cos(rad);
-
- for (yi = 0; yi < yo; yi++) {
- for (xi = 0; xi < xo; xi++) {
- /*tranlate point*/
- px = xi-tx;
- py = yi-ty;
-
- /*rotate point with center ref*/
- xaux = c*px + py*s ;
- yaux = -s*px + c*py;
-
- /*scale point with center ref*/
- xs = xaux / factxScale;
- ys = yaux / factyScale;
-
- /*undo reference center point */
- xs += (xo / 2.0f);
- ys += (yo / 2.0f);
-
- /*interpolate*/
- bilinear_interpolation_transform_float(ibuf1,out, xs,ys);
-
- out+=4;
- }
- }
-
-}
-
-/* function assumes out to be zero'ed, only does RGBA */
-static void bilinear_interpolation_transform_byte(unsigned char *in, unsigned char *out, float u, float v,int x,int y)
-{
- float a, b;
- float a_b, ma_b, a_mb, ma_mb;
- int y1, y2, x1, x2;
-
- int row1R,row1G,row1B,row1A;
- int row2R,row2G,row2B,row2A;
- int row3R,row3G,row3B,row3A;
- int row4R,row4G,row4B,row4A;
-
- x1= (int)floor(u);
- x2= (int)ceil(u);
- y1= (int)floor(v);
- y2= (int)ceil(v);
-
- /* sample area entirely outside image? */
- if(x2<0 || x1>x-1 || y2<0 || y1>y-1)
- return;
-
- /* sample including outside of edges of image */
- if(x1<0 || y1<0){
- row1R = 0;
- row1G = 0;
- row1B = 0;
- row1A = 0;
- }
- else{
- row1R= in[x * y1 * 4 + 4 * x1];
- row1G= in[x * y1 * 4 + 4 * x1 + 1];
- row1B= in[x * y1 * 4 + 4 * x1 + 2];
- row1A= in[x * y1 * 4 + 4 * x1 + 3];
- }
-
- if(x1<0 || y2>y-1){
- row2R = 0;
- row2G = 0;
- row2B = 0;
- row2A = 0;
- }
- else{
- row2R= in[x * y2 * 4 + 4 * x1];
- row2G= in[x * y2 * 4 + 4 * x1 + 1];
- row2B= in[x * y2 * 4 + 4 * x1 + 2];
- row2A= in[x * y2 * 4 + 4 * x1 + 3];
+ //Factor translate
+ if(!scale->percent){
+ tx = scale->xIni+(xo / 2.0f) + (scale->xFin-(xo / 2.0f) - scale->xIni+(xo / 2.0f)) * facf0;
+ ty = scale->yIni+(yo / 2.0f) + (scale->yFin-(yo / 2.0f) - scale->yIni+(yo / 2.0f)) * facf0;
+ }else{
+ tx = xo*(scale->xIni/100.0)+(xo / 2.0f) + (xo*(scale->xFin/100.0)-(xo / 2.0f) - xo*(scale->xIni/100.0)+(xo / 2.0f)) * facf0;
+ ty = yo*(scale->yIni/100.0)+(yo / 2.0f) + (yo*(scale->yFin/100.0)-(yo / 2.0f) - yo*(scale->yIni/100.0)+(yo / 2.0f)) * facf0;
}
-
- if(x2>x-1 || y1<0){
- row3R = 0;
- row3G = 0;
- row3B = 0;
- row3A = 0;
- }
- else{
- row3R= in[x * y1 * 4 + 4 * x2];
- row3G= in[x * y1 * 4 + 4 * x2 + 1];
- row3B= in[x * y1 * 4 + 4 * x2 + 2];
- row3A= in[x * y1 * 4 + 4 * x2 + 3];
- }
-
- if(x2>x-1 || y2>y-1){
- row4R = 0;
- row4G = 0;
- row4B = 0;
- row4A = 0;
- }
- else{
- row4R= in[x * y2 * 4 + 4 * x2];
- row4G= in[x * y2 * 4 + 4 * x2 + 1];
- row4B= in[x * y2 * 4 + 4 * x2 + 2];
- row4A= in[x * y2 * 4 + 4 * x2 + 3];
- }
-
- a= u-floor(u);
- b= v-floor(v);
- a_b= a*b; ma_b= (1-a)*b; a_mb= a*(1-b); ma_mb= (1-a)*(1-b);
-
- out[0]= (int)(ma_mb*row1R + a_mb*row3R + ma_b*row2R + a_b*row4R);
- out[1]= (int)(ma_mb*row1G + a_mb*row3G + ma_b*row2G + a_b*row4G);
- out[2]= (int)(ma_mb*row1B + a_mb*row3B + ma_b*row2B + a_b*row4B);
- out[3]= (int)(ma_mb*row1A + a_mb*row3A + ma_b*row2A + a_b*row4A);
-}
-static void do_transform_effect_byte(Sequence * seq,float facf0, int x, int y,
- unsigned char *ibuf1,unsigned char *out)
-{
- int xo, yo, xi, yi;
- float xs,ys,factxScale,factyScale,tx,ty,rad,s,c,xaux,yaux,factRot,px,py;
- TransformVars *scale;
-
- scale = (TransformVars *)seq->effectdata;
- xo = x;
- yo = y;
-
- /*factor scale*/
- factxScale = scale->ScalexIni + (scale->ScalexFin - scale->ScalexIni) * facf0;
- factyScale = scale->ScaleyIni + (scale->ScaleyFin - scale->ScaleyIni) * facf0;
-
- /*Factor translate*/
- tx = scale->xIni+(xo / 2.0f) + (scale->xFin-(xo / 2.0f) - scale->xIni+(xo / 2.0f)) * facf0;
- ty = scale->yIni+(yo / 2.0f) + (scale->yFin-(yo / 2.0f) - scale->yIni+(yo / 2.0f)) * facf0;
-
- /*factor Rotate*/
+ //factor Rotate
factRot = scale->rotIni + (scale->rotFin - scale->rotIni) * facf0;
rad = (M_PI * factRot) / 180.0f;
s= sin(rad);
@@ -2148,26 +1978,29 @@ static void do_transform_effect_byte(Sequence * seq,float facf0, int x, int y,
for (yi = 0; yi < yo; yi++) {
for (xi = 0; xi < xo; xi++) {
- /*tranlate point*/
+ //tranlate point
px = xi-tx;
py = yi-ty;
- /*rotate point with center ref*/
+ //rotate point with center ref
xaux = c*px + py*s ;
yaux = -s*px + c*py;
- /*scale point with center ref*/
+ //scale point with center ref
xs = xaux / factxScale;
ys = yaux / factyScale;
- /*undo reference center point */
+ //undo reference center point
xs += (xo / 2.0f);
ys += (yo / 2.0f);
- /*interpolate*/
- bilinear_interpolation_transform_byte(ibuf1,out, xs,ys,x,y);
-
- out+=4;
+ //interpolate
+ if(scale->interpolation==0)
+ neareast_interpolation(ibuf1,out, xs,ys,xi,yi);
+ if(scale->interpolation==1)
+ bilinear_interpolation(ibuf1,out, xs,ys,xi,yi);
+ if(scale->interpolation==2)
+ bicubic_interpolation(ibuf1,out, xs,ys,xi,yi);
}
}
@@ -2177,17 +2010,7 @@ static void do_transform_effect(Sequence * seq,int cfra,
struct ImBuf *ibuf1, struct ImBuf *ibuf2,
struct ImBuf *ibuf3, struct ImBuf *out)
{
- if (out->rect_float) {
- do_transform_effect_float(seq,
- facf0,x, y,
- ibuf1,
- out->rect_float);
- } else {
- do_transform_effect_byte(seq,
- facf0,x, y,
- (unsigned char*) ibuf1->rect,
- (unsigned char*) out->rect);
- }
+ do_transform(seq, facf0, x, y, ibuf1, out);
}
@@ -2907,6 +2730,7 @@ void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force)
float cursor = 0;
v->frameMap[0] = 0;
+ v->lastValidFrame = 0;
for (cfra = 1; cfra < v->length; cfra++) {
if(seq->ipo) {
@@ -2933,9 +2757,11 @@ void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force)
v->frameMap[cfra] = v->length - 1;
} else {
v->frameMap[cfra] = cursor;
+ v->lastValidFrame = cfra;
}
}
} else {
+ v->lastValidFrame = 0;
for (cfra = 0; cfra < v->length; cfra++) {
if(seq->ipo) {
if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) {
@@ -2961,6 +2787,8 @@ void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force)
seq->facf0 *= v->globalSpeed;
if (seq->facf0 >= v->length) {
seq->facf0 = v->length - 1;
+ } else {
+ v->lastValidFrame = cfra;
}
v->frameMap[cfra] = seq->facf0;
}
diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c
index db901930893..73eb0a96764 100644
--- a/source/blender/src/sequence.c
+++ b/source/blender/src/sequence.c
@@ -71,17 +71,23 @@
#include "blendef.h"
+#include "BLI_threads.h"
+#include <pthread.h>
+
int seqrectx, seqrecty;
-void free_stripdata(int len, StripElem *se)
+void free_tstripdata(int len, TStripElem *se)
{
- StripElem *seo;
+ TStripElem *seo;
int a;
seo= se;
+ if (!se) {
+ return;
+ }
for(a=0; a<len; a++, se++) {
- if(se->ibuf && se->ok!=2) {
+ if(se->ibuf && se->ok != STRIPELEM_META) {
IMB_freeImBuf(se->ibuf);
se->ibuf = 0;
}
@@ -101,18 +107,20 @@ void free_strip(Strip *strip)
}
if(strip->stripdata) {
- free_stripdata(strip->len, strip->stripdata);
+ MEM_freeN(strip->stripdata);
}
+
+ free_tstripdata(strip->len, strip->tstripdata);
+
MEM_freeN(strip);
}
-void new_stripdata(Sequence *seq)
+void new_tstripdata(Sequence *seq)
{
if(seq->strip) {
- if(seq->strip->stripdata) free_stripdata(seq->strip->len, seq->strip->stripdata);
- seq->strip->stripdata= 0;
+ free_tstripdata(seq->strip->len, seq->strip->tstripdata);
+ seq->strip->tstripdata= 0;
seq->strip->len= seq->len;
- if(seq->len>0) seq->strip->stripdata= MEM_callocN(seq->len*sizeof(StripElem), "stripelems");
}
}
@@ -211,6 +219,23 @@ void free_editing(Editing *ed)
}
+void calc_sequence_disp(Sequence *seq)
+{
+ if(seq->startofs && seq->startstill) seq->startstill= 0;
+ if(seq->endofs && seq->endstill) seq->endstill= 0;
+
+ seq->startdisp= seq->start + seq->startofs - seq->startstill;
+ seq->enddisp= seq->start+seq->len - seq->endofs + seq->endstill;
+
+ seq->handsize= 10.0; /* 10 frames */
+ if( seq->enddisp-seq->startdisp < 10 ) {
+ seq->handsize= (float)(0.5*(seq->enddisp-seq->startdisp));
+ }
+ else if(seq->enddisp-seq->startdisp > 250) {
+ seq->handsize= (float)((seq->enddisp-seq->startdisp)/25);
+ }
+}
+
void calc_sequence(Sequence *seq)
{
Sequence *seqm;
@@ -242,23 +267,11 @@ void calc_sequence(Sequence *seq)
seq->enddisp= MIN3(seq->seq1->enddisp, seq->seq2->enddisp, seq->seq3->enddisp);
seq->len= seq->enddisp - seq->startdisp;
} else {
- if(seq->startofs && seq->startstill) seq->startstill= 0;
- if(seq->endofs && seq->endstill) seq->endstill= 0;
-
- seq->startdisp= seq->start + seq->startofs - seq->startstill;
- seq->enddisp= seq->start+seq->len - seq->endofs + seq->endstill;
-
- seq->handsize= 10.0; /* 10 frames */
- if( seq->enddisp-seq->startdisp < 20 ) {
- seq->handsize= (float)(0.5*(seq->enddisp-seq->startdisp));
- }
- else if(seq->enddisp-seq->startdisp > 250) {
- seq->handsize= (float)((seq->enddisp-seq->startdisp)/25);
- }
+ calc_sequence_disp(seq);
}
if(seq->strip && seq->len!=seq->strip->len) {
- new_stripdata(seq);
+ new_tstripdata(seq);
}
}
@@ -277,25 +290,11 @@ void calc_sequence(Sequence *seq)
seq->len= max-min;
if(seq->strip && seq->len!=seq->strip->len) {
- new_stripdata(seq);
+ new_tstripdata(seq);
}
}
}
-
-
- if(seq->startofs && seq->startstill) seq->startstill= 0;
- if(seq->endofs && seq->endstill) seq->endstill= 0;
-
- seq->startdisp= seq->start + seq->startofs - seq->startstill;
- seq->enddisp= seq->start+seq->len - seq->endofs + seq->endstill;
-
- seq->handsize= 10.0; /* 10 frames */
- if( seq->enddisp-seq->startdisp < 20 ) {
- seq->handsize= (float)(0.5*(seq->enddisp-seq->startdisp));
- }
- else if(seq->enddisp-seq->startdisp > 250) {
- seq->handsize= (float)((seq->enddisp-seq->startdisp)/25);
- }
+ calc_sequence_disp(seq);
}
}
@@ -433,9 +432,9 @@ static void multibuf(ImBuf *ibuf, float fmul)
}
}
-static void do_effect(int cfra, Sequence *seq, StripElem *se)
+static void do_effect(int cfra, Sequence *seq, TStripElem *se)
{
- StripElem *se1, *se2, *se3;
+ TStripElem *se1, *se2, *se3;
float fac, facf;
int x, y;
int early_out;
@@ -471,14 +470,13 @@ static void do_effect(int cfra, Sequence *seq, StripElem *se)
return;
}
- /* if metastrip: other se's */
- if(se->se1->ok==2) se1= se->se1->se1;
+ if(se->se1->ok == STRIPELEM_META) se1= se->se1->se1;
else se1= se->se1;
- if(se->se2->ok==2) se2= se->se2->se1;
+ if(se->se2->ok == STRIPELEM_META) se2= se->se2->se1;
else se2= se->se2;
- if(se->se3->ok==2) se3= se->se3->se1;
+ if(se->se3->ok == STRIPELEM_META) se3= se->se3->se1;
else se3= se->se3;
if ( (se1==0 || se2==0 || se3==0)
@@ -494,8 +492,7 @@ static void do_effect(int cfra, Sequence *seq, StripElem *se)
return;
}
- /* if metastrip: other se's */
- if(se->se1->ok==2) se1= se->se1->se1;
+ if(se->se1->ok == STRIPELEM_META) se1= se->se1->se1;
else se1= se->se1;
if (se1 == 0 || se1->ibuf == 0) {
@@ -515,8 +512,7 @@ static void do_effect(int cfra, Sequence *seq, StripElem *se)
return;
}
- /* if metastrip: other se's */
- if(se->se2->ok==2) se2= se->se2->se1;
+ if(se->se2->ok == STRIPELEM_META) se2= se->se2->se1;
else se2= se->se2;
if (se2 == 0 || se2->ibuf == 0) {
@@ -555,17 +551,11 @@ static void do_effect(int cfra, Sequence *seq, StripElem *se)
se->ibuf);
}
-StripElem *give_stripelem(Sequence *seq, int cfra)
+static int give_stripelem_index(Sequence *seq, int cfra)
{
- Strip *strip;
- StripElem *se;
int nr;
- strip= seq->strip;
- se= strip->stripdata;
-
- if(se==0) return 0;
- if(seq->startdisp >cfra || seq->enddisp <= cfra) return 0;
+ if(seq->startdisp >cfra || seq->enddisp <= cfra) return -1;
if(seq->flag&SEQ_REVERSE_FRAMES) {
/*reverse frame in this sequence */
@@ -581,13 +571,51 @@ StripElem *give_stripelem(Sequence *seq, int cfra)
if (seq->strobe > 1.0) {
nr -= (int)fmod((double)nr, (double)seq->strobe);
}
+
+ return nr;
+}
+
+TStripElem *give_tstripelem(Sequence *seq, int cfra)
+{
+ TStripElem *se;
+ int nr;
+
+ se = seq->strip->tstripdata;
+ if (se == 0 && seq->len > 0) {
+ int i;
+ se = seq->strip->tstripdata = MEM_callocN(
+ seq->len*sizeof(TStripElem), "tstripelems");
+ for (i = 0; i < seq->len; i++) {
+ se[i].ok = STRIPELEM_OK;
+ }
+ }
+ nr = give_stripelem_index(seq, cfra);
+
+ if (nr == -1) return 0;
+ if (se == 0) return 0;
- se+= nr; /* don't get confused by the increment, this is the same as strip->stripdata[nr], which works on some compilers...*/
+ se+= nr;
se->nr= nr;
return se;
}
+StripElem *give_stripelem(Sequence *seq, int cfra)
+{
+ StripElem *se;
+ int nr;
+
+ se = seq->strip->stripdata;
+ nr = give_stripelem_index(seq, cfra);
+
+ if (nr == -1) return 0;
+ if (se == 0) return 0;
+
+ se += nr;
+
+ return se;
+}
+
static int evaluate_seq_frame_gen(
Sequence ** seq_arr, ListBase *seqbase, int cfra)
{
@@ -671,36 +699,57 @@ static Sequence * get_shown_seq_from_metastrip(Sequence * seqm, int cfra)
void set_meta_stripdata(Sequence *seqm)
{
Sequence *seq;
- StripElem *se;
+ TStripElem *se;
int a, cfra;
+ se= seqm->strip->tstripdata;
+
+ if (se == 0 && seqm->len > 0) {
+ int i;
+ se = seqm->strip->tstripdata = MEM_callocN(
+ seqm->len*sizeof(TStripElem), "tstripelems");
+ for (i = 0; i < seqm->len; i++) {
+ se[i].ok = STRIPELEM_META;
+ }
+ }
+
/* sets all ->se1 pointers in stripdata, to read the ibuf from it */
- se= seqm->strip->stripdata;
for(a=0; a<seqm->len; a++, se++) {
cfra= a+seqm->start;
seq = get_shown_seq_from_metastrip(seqm, cfra);
if (seq) {
- se->se1= give_stripelem(seq, cfra);
+ se->se1= give_tstripelem(seq, cfra);
} else {
se->se1= 0;
}
}
}
-static void do_build_seq_ibuf(Sequence * seq, int cfra)
+static TStripElem* do_build_seq_recursively(Sequence * seq, int cfra);
+
+static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra)
{
- StripElem *se = seq->curelem;
char name[FILE_MAXDIR+FILE_MAXFILE];
if(seq->type == SEQ_META) {
- se->ok= 2;
- if(se->se1==0) set_meta_stripdata(seq);
+ if(seq->seqbase.first) {
+ Sequence * seqmshown=
+ get_shown_seq_from_metastrip(seq, cfra);
+ if (seqmshown) {
+ if(cfra< seq->start)
+ do_build_seq_recursively(seqmshown, seq->start);
+ else if(cfra> seq->start+seq->len-1)
+ do_build_seq_recursively(seqmshown, seq->start + seq->len-1);
+ else do_build_seq_recursively(seqmshown, cfra);
+ }
+ }
+
+ se->ok = STRIPELEM_META;
+ if(se->se1 == 0) set_meta_stripdata(seq);
if(se->se1) {
se->ibuf= se->se1->ibuf;
}
- } else if(seq->type == SEQ_RAM_SOUND || seq->type == SEQ_HD_SOUND) {
- se->ok= 2;
} else if(seq->type & SEQ_EFFECT) {
/* test if image is too small or discarded from cache: reload */
@@ -713,22 +762,13 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
/* should the effect be recalculated? */
- if(se->ibuf==0
- || (seq->seq1 && se->se1 != seq->seq1->curelem)
- || (seq->seq2 && se->se2 != seq->seq2->curelem)
- || (seq->seq3 && se->se3 != seq->seq3->curelem)) {
- if (seq->seq1) se->se1= seq->seq1->curelem;
- if (seq->seq2) se->se2= seq->seq2->curelem;
- if (seq->seq3) se->se3= seq->seq3->curelem;
-
- if(se->ibuf==NULL) {
- /* if one of two first inputs are rectfloat, output is float too */
- if((se->se1 && se->se1->ibuf && se->se1->ibuf->rect_float) ||
- (se->se2 && se->se2->ibuf && se->se2->ibuf->rect_float))
- se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
- else
- se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
- }
+ if(se->ibuf == 0) {
+ /* if one of two first inputs are rectfloat, output is float too */
+ if((se->se1 && se->se1->ibuf && se->se1->ibuf->rect_float) ||
+ (se->se2 && se->se2->ibuf && se->se2->ibuf->rect_float))
+ se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
+ else
+ se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rect, 0);
do_effect(cfra, seq, se);
}
@@ -750,40 +790,45 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
if(se->ibuf->x < seqrectx || se->ibuf->y < seqrecty || !(se->ibuf->rect || se->ibuf->rect_float)) {
IMB_freeImBuf(se->ibuf);
se->ibuf= 0;
- se->ok= 1;
+ se->ok= STRIPELEM_OK;
}
}
if(seq->type==SEQ_IMAGE) {
- if(se->ok && se->ibuf==0) {
+ if(se->ok == STRIPELEM_OK && se->ibuf==0) {
+ StripElem * s_elem = give_stripelem(seq, cfra);
+
/* if playanim or render:
no waitcursor */
if((G.f & G_PLAYANIM)==0)
waitcursor(1);
strncpy(name, seq->strip->dir, FILE_MAXDIR-1);
- strncat(name, se->name, FILE_MAXFILE);
+ strncat(name, s_elem->name, FILE_MAXFILE);
BLI_convertstringcode(name, G.sce, G.scene->r.cfra);
se->ibuf= IMB_loadiffname(name, IB_rect);
if((G.f & G_PLAYANIM)==0)
waitcursor(0);
- if(se->ibuf==0) se->ok= 0;
- else {
+ if(se->ibuf == 0) {
+ se->ok = STRIPELEM_FAILED;
+ } else {
if(seq->flag & SEQ_MAKE_PREMUL) {
if(se->ibuf->depth==32 && se->ibuf->zbuf==0) converttopremul(se->ibuf);
}
seq->strip->orx= se->ibuf->x;
seq->strip->ory= se->ibuf->y;
if(seq->flag & SEQ_FILTERY) IMB_filtery(se->ibuf);
+ if(seq->flag & SEQ_FLIPX) IMB_flipx(se->ibuf);
+ if(seq->flag & SEQ_FLIPY) IMB_flipy(se->ibuf);
if(seq->mul==0.0) seq->mul= 1.0;
if(seq->mul != 1.0) multibuf(se->ibuf, seq->mul);
}
}
}
else if(seq->type==SEQ_MOVIE) {
- if(se->ok && se->ibuf==0) {
+ if(se->ok == STRIPELEM_OK && se->ibuf==0) {
if(seq->anim==0) {
strncpy(name, seq->strip->dir, FILE_MAXDIR-1);
strncat(name, seq->strip->stripdata->name, FILE_MAXFILE-1);
@@ -796,8 +841,9 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
se->ibuf = IMB_anim_absolute(seq->anim, se->nr);
}
- if(se->ibuf==0) se->ok= 0;
- else {
+ if(se->ibuf == 0) {
+ se->ok = STRIPELEM_FAILED;
+ } else {
if(seq->flag & SEQ_MAKE_PREMUL) {
if(se->ibuf->depth==32) converttopremul(se->ibuf);
}
@@ -832,8 +878,8 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
re= RE_NewRender(sce->id.name);
/* prevent eternal loop */
- doseq= sce->r.scemode & R_DOSEQ;
- sce->r.scemode &= ~R_DOSEQ;
+ doseq= G.scene->r.scemode & R_DOSEQ;
+ G.scene->r.scemode &= ~R_DOSEQ;
BIF_init_render_callbacks(re, 0); /* 0= no display callbacks */
@@ -856,12 +902,15 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
addzbuffloatImBuf(se->ibuf);
memcpy(se->ibuf->zbuf_float, rres.rectz, sizeof(float)*rres.rectx*rres.recty);
}
+ } else if (rres.rect32) {
+ se->ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, IB_rect, 0);
+ memcpy(se->ibuf->rect, rres.rect32, 4*rres.rectx*rres.recty);
}
BIF_end_render_callbacks();
/* restore */
- sce->r.scemode |= doseq;
+ G.scene->r.scemode |= doseq;
if((G.f & G_PLAYANIM)==0) /* bad, is set on do_render_seq */
waitcursor(0);
@@ -895,21 +944,23 @@ static void do_build_seq_ibuf(Sequence * seq, int cfra)
}
}
- if (se->ibuf) {
+ if (se->ibuf && seq->type != SEQ_META) {
IMB_cache_limiter_insert(se->ibuf);
IMB_cache_limiter_ref(se->ibuf);
IMB_cache_limiter_touch(se->ibuf);
}
}
-static void do_build_seq_recursively(Sequence * seq, int cfra);
-
-static void do_effect_seq_recursively(int cfra, Sequence * seq, StripElem *se)
+static void do_effect_seq_recursively(Sequence * seq, TStripElem *se, int cfra)
{
float fac, facf;
struct SeqEffectHandle sh = get_sequence_effect(seq);
int early_out;
+ se->se1 = 0;
+ se->se2 = 0;
+ se->se3 = 0;
+
if(seq->ipo && seq->ipo->curve.first) {
do_seq_ipo(seq);
fac= seq->facf0;
@@ -926,79 +977,50 @@ static void do_effect_seq_recursively(int cfra, Sequence * seq, StripElem *se)
/* no input needed */
break;
case 0:
- do_build_seq_recursively(seq->seq1, cfra);
- do_build_seq_recursively(seq->seq2, cfra);
+ se->se1 = do_build_seq_recursively(seq->seq1, cfra);
+ se->se2 = do_build_seq_recursively(seq->seq2, cfra);
if (seq->seq3) {
- do_build_seq_recursively(seq->seq3, cfra);
+ se->se3 = do_build_seq_recursively(seq->seq3, cfra);
}
break;
case 1:
- do_build_seq_recursively(seq->seq1, cfra);
+ se->se1 = do_build_seq_recursively(seq->seq1, cfra);
break;
case 2:
- do_build_seq_recursively(seq->seq2, cfra);
+ se->se2 = do_build_seq_recursively(seq->seq2, cfra);
break;
}
- do_build_seq_ibuf(seq, cfra);
+ do_build_seq_ibuf(seq, se, cfra);
/* children are not needed anymore ... */
- switch (early_out) {
- case 0:
- if (seq->seq1->curelem && seq->seq1->curelem->ibuf)
- IMB_cache_limiter_unref(seq->seq1->curelem->ibuf);
- if (seq->seq2->curelem && seq->seq2->curelem->ibuf)
- IMB_cache_limiter_unref(seq->seq2->curelem->ibuf);
- if (seq->seq3) {
- if (seq->seq3->curelem && seq->seq3->curelem->ibuf)
- IMB_cache_limiter_unref(
- seq->seq3->curelem->ibuf);
- }
- break;
- case 1:
- if (seq->seq1->curelem && seq->seq1->curelem->ibuf)
- IMB_cache_limiter_unref(seq->seq1->curelem->ibuf);
- break;
- case 2:
- if (seq->seq2->curelem && seq->seq2->curelem->ibuf)
- IMB_cache_limiter_unref(seq->seq2->curelem->ibuf);
- break;
+ if (se->se1 && se->se1->ibuf) {
+ IMB_cache_limiter_unref(se->se1->ibuf);
+ }
+ if (se->se2 && se->se2->ibuf) {
+ IMB_cache_limiter_unref(se->se2->ibuf);
+ }
+ if (se->se3 && se->se3->ibuf) {
+ IMB_cache_limiter_unref(se->se3->ibuf);
}
}
-static void do_build_seq_recursively_impl(Sequence * seq, int cfra)
+static TStripElem* do_build_seq_recursively_impl(Sequence * seq, int cfra)
{
- StripElem *se;
+ TStripElem *se;
- se = seq->curelem = give_stripelem(seq, cfra);
+ se = give_tstripelem(seq, cfra);
if(se) {
- int unref_meta = FALSE;
- if(seq->seqbase.first) {
- Sequence * seqmshown= get_shown_seq_from_metastrip(seq, cfra);
- if (seqmshown) {
- if(cfra< seq->start)
- do_build_seq_recursively(seqmshown, seq->start);
- else if(cfra> seq->start+seq->len-1)
- do_build_seq_recursively(seqmshown, seq->start + seq->len-1);
- else do_build_seq_recursively(seqmshown, cfra);
-
- unref_meta = TRUE;
- }
- }
-
if (seq->type & SEQ_EFFECT) {
- do_effect_seq_recursively(cfra, seq, se);
+ do_effect_seq_recursively(seq, se, cfra);
} else {
- do_build_seq_ibuf(seq, cfra);
- }
-
- if(unref_meta && seq->curelem->ibuf) {
- IMB_cache_limiter_unref(seq->curelem->ibuf);
+ do_build_seq_ibuf(seq, se, cfra);
}
}
+ return se;
}
/* FIXME:
@@ -1009,16 +1031,16 @@ instead of faking using the blend code below...
*/
-static void do_handle_speed_effect(Sequence * seq, int cfra)
+static TStripElem* do_handle_speed_effect(Sequence * seq, int cfra)
{
SpeedControlVars * s = (SpeedControlVars *)seq->effectdata;
int nr = cfra - seq->start;
float f_cfra;
int cfra_left;
int cfra_right;
- StripElem * se = 0;
- StripElem * se1 = 0;
- StripElem * se2 = 0;
+ TStripElem * se = 0;
+ TStripElem * se1 = 0;
+ TStripElem * se2 = 0;
sequence_effect_speed_rebuild_map(seq, 0);
@@ -1027,7 +1049,7 @@ static void do_handle_speed_effect(Sequence * seq, int cfra)
cfra_left = (int) floor(f_cfra);
cfra_right = (int) ceil(f_cfra);
- se = seq->curelem = give_stripelem(seq, cfra);
+ se = give_tstripelem(seq, cfra);
if (cfra_left == cfra_right ||
(s->flags & SEQ_SPEED_BLEND) == 0) {
@@ -1040,9 +1062,8 @@ static void do_handle_speed_effect(Sequence * seq, int cfra)
}
if (se->ibuf == NULL) {
- do_build_seq_recursively_impl(seq->seq1, cfra_left);
-
- se1 = seq->seq1->curelem;
+ se1 = do_build_seq_recursively_impl(
+ seq->seq1, cfra_left);
if((se1 && se1->ibuf && se1->ibuf->rect_float))
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
@@ -1074,11 +1095,10 @@ static void do_handle_speed_effect(Sequence * seq, int cfra)
}
if (se->ibuf == NULL) {
- do_build_seq_recursively_impl(seq->seq1, cfra_left);
- se1 = seq->seq1->curelem;
- do_build_seq_recursively_impl(seq->seq1, cfra_right);
- se2 = seq->seq1->curelem;
-
+ se1 = do_build_seq_recursively_impl(
+ seq->seq1, cfra_left);
+ se2 = do_build_seq_recursively_impl(
+ seq->seq1, cfra_right);
if((se1 && se1->ibuf && se1->ibuf->rect_float))
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
@@ -1112,35 +1132,43 @@ static void do_handle_speed_effect(Sequence * seq, int cfra)
IMB_cache_limiter_unref(se1->ibuf);
if (se2 && se2->ibuf)
IMB_cache_limiter_unref(se2->ibuf);
+
+ return se;
}
/*
* build all ibufs recursively
*
- * if successfull, seq->curelem->ibuf contains the (referenced!) imbuf
+ * if successfull, the returned TStripElem contains the (referenced!) imbuf
* that means: you _must_ call
*
- * IMB_cache_limiter_unref(seq->curelem->ibuf);
+ * IMB_cache_limiter_unref(rval);
*
- * if seq->curelem exists!
+ * if rval != 0
*
*/
-static void do_build_seq_recursively(Sequence * seq, int cfra)
+static TStripElem* do_build_seq_recursively(Sequence * seq, int cfra)
{
if (seq->type == SEQ_SPEED) {
- do_handle_speed_effect(seq, cfra);
+ return do_handle_speed_effect(seq, cfra);
} else {
- do_build_seq_recursively_impl(seq, cfra);
+ return do_build_seq_recursively_impl(seq, cfra);
}
}
-ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
+/*
+ * returned ImBuf is refed!
+ * you have to unref after usage!
+ */
+
+static ImBuf *give_ibuf_seq_impl(int rectx, int recty, int cfra, int chanshown)
{
Sequence *seqfirst=0;
Editing *ed;
int count;
ListBase *seqbasep;
+ TStripElem *se;
ed= G.scene->ed;
if(ed==0) return 0;
@@ -1162,29 +1190,373 @@ ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
return 0;
}
- do_build_seq_recursively(seqfirst, cfra);
+ se = do_build_seq_recursively(seqfirst, cfra);
+
+ if(!se) {
+ return 0;
+ }
+
+ return se->ibuf;
+}
+
+ImBuf *give_ibuf_seq_direct(int rectx, int recty, int cfra,
+ Sequence * seq)
+{
+ TStripElem* se;
+
+ seqrectx= rectx; /* bad bad global! */
+ seqrecty= recty;
+
+ se = do_build_seq_recursively(seq, cfra);
- if(!seqfirst->curelem) {
+ if(!se) {
return 0;
}
- if (seqfirst->curelem->ibuf) {
- IMB_cache_limiter_unref(seqfirst->curelem->ibuf);
+ if (se->ibuf) {
+ IMB_cache_limiter_unref(se->ibuf);
+ }
+
+ return se->ibuf;
+}
+
+ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chanshown)
+{
+ ImBuf* i = give_ibuf_seq_impl(rectx, recty, cfra, chanshown);
+
+ if (i) {
+ IMB_cache_limiter_unref(i);
+ }
+ return i;
+}
+
+/* threading api */
+
+static ListBase running_threads;
+static ListBase prefetch_wait;
+static ListBase prefetch_done;
+
+static pthread_mutex_t queue_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_mutex_t wakeup_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t wakeup_cond = PTHREAD_COND_INITIALIZER;
+
+static pthread_mutex_t prefetch_ready_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t prefetch_ready_cond = PTHREAD_COND_INITIALIZER;
+
+static pthread_mutex_t frame_done_lock = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t frame_done_cond = PTHREAD_COND_INITIALIZER;
+
+static volatile int seq_thread_shutdown = FALSE;
+static volatile int seq_last_given_monoton_cfra = 0;
+static int monoton_cfra = 0;
+
+typedef struct PrefetchThread {
+ struct PrefetchThread *next, *prev;
+ struct PrefetchQueueElem *current;
+ pthread_t pthread;
+ int running;
+} PrefetchThread;
+
+typedef struct PrefetchQueueElem {
+ struct PrefetchQueueElem *next, *prev;
+
+ int rectx;
+ int recty;
+ int cfra;
+ int chanshown;
+
+ int monoton_cfra;
+
+ struct ImBuf * ibuf;
+} PrefetchQueueElem;
+
+static void * seq_prefetch_thread(void * This_)
+{
+ PrefetchThread * This = This_;
+
+ while (!seq_thread_shutdown) {
+ PrefetchQueueElem * e;
+ int s_last;
+
+ pthread_mutex_lock(&queue_lock);
+ e = prefetch_wait.first;
+ if (e) {
+ BLI_remlink(&prefetch_wait, e);
+ }
+ s_last = seq_last_given_monoton_cfra;
+
+ This->current = e;
+
+ pthread_mutex_unlock(&queue_lock);
+
+ if (!e) {
+ pthread_mutex_lock(&prefetch_ready_lock);
+
+ This->running = FALSE;
+
+ pthread_cond_signal(&prefetch_ready_cond);
+ pthread_mutex_unlock(&prefetch_ready_lock);
+
+ pthread_mutex_lock(&wakeup_lock);
+ if (!seq_thread_shutdown) {
+ pthread_cond_wait(&wakeup_cond, &wakeup_lock);
+ }
+ pthread_mutex_unlock(&wakeup_lock);
+ continue;
+ }
+
+ This->running = TRUE;
+
+ if (e->cfra >= s_last) {
+ e->ibuf = give_ibuf_seq_impl(
+ e->rectx, e->recty, e->cfra, e->chanshown);
+ }
+
+ pthread_mutex_lock(&queue_lock);
+
+ BLI_addtail(&prefetch_done, e);
+
+ for (e = prefetch_wait.first; e; e = e->next) {
+ if (s_last > e->monoton_cfra) {
+ BLI_remlink(&prefetch_wait, e);
+ MEM_freeN(e);
+ }
+ }
+
+ for (e = prefetch_done.first; e; e = e->next) {
+ if (s_last > e->monoton_cfra) {
+ if (e->ibuf) {
+ IMB_cache_limiter_unref(e->ibuf);
+ }
+ BLI_remlink(&prefetch_done, e);
+ MEM_freeN(e);
+ }
+ }
+
+ pthread_mutex_unlock(&queue_lock);
+
+ pthread_mutex_lock(&frame_done_lock);
+ pthread_cond_signal(&frame_done_cond);
+ pthread_mutex_unlock(&frame_done_lock);
}
+ return 0;
+}
+
+void seq_start_threads()
+{
+ int i;
- return seqfirst->curelem->ibuf;
+ running_threads.first = running_threads.last = NULL;
+ prefetch_wait.first = prefetch_wait.last = NULL;
+ prefetch_done.first = prefetch_done.last = NULL;
+ seq_thread_shutdown = FALSE;
+ seq_last_given_monoton_cfra = monoton_cfra = 0;
+
+ /* since global structures are modified during the processing
+ of one frame, only one render thread is currently possible...
+
+ (but we code, in the hope, that we can remove this restriction
+ soon...)
+ */
+
+ fprintf(stderr, "SEQ-THREAD: seq_start_threads\n");
+
+ for (i = 0; i < 1; i++) {
+ PrefetchThread *t = MEM_callocN(sizeof(PrefetchThread),
+ "prefetch_thread");
+ t->running = TRUE;
+ BLI_addtail(&running_threads, t);
+
+ pthread_create(&t->pthread, NULL, seq_prefetch_thread, t);
+ }
+
+ /* init malloc mutex */
+ BLI_init_threads(0, 0, 0);
+}
+
+void seq_stop_threads()
+{
+ PrefetchThread *tslot;
+ PrefetchQueueElem * e;
+
+ fprintf(stderr, "SEQ-THREAD: seq_stop_threads()\n");
+
+ if (seq_thread_shutdown) {
+ fprintf(stderr, "SEQ-THREAD: ... already stopped\n");
+ return;
+ }
+
+ pthread_mutex_lock(&wakeup_lock);
+
+ seq_thread_shutdown = TRUE;
+
+ pthread_cond_broadcast(&wakeup_cond);
+ pthread_mutex_unlock(&wakeup_lock);
+
+ for(tslot = running_threads.first; tslot; tslot= tslot->next) {
+ pthread_join(tslot->pthread, NULL);
+ }
+
+
+ for (e = prefetch_wait.first; e; e = e->next) {
+ BLI_remlink(&prefetch_wait, e);
+ MEM_freeN(e);
+ }
+
+ for (e = prefetch_done.first; e; e = e->next) {
+ if (e->ibuf) {
+ IMB_cache_limiter_unref(e->ibuf);
+ }
+ BLI_remlink(&prefetch_done, e);
+ MEM_freeN(e);
+ }
+
+ BLI_freelistN(&running_threads);
+
+ /* deinit malloc mutex */
+ BLI_end_threads(0);
+}
+
+void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown)
+{
+ PrefetchQueueElem * e;
+ if (seq_thread_shutdown) {
+ return;
+ }
+
+ e = MEM_callocN(sizeof(PrefetchQueueElem), "prefetch_queue_elem");
+ e->rectx = rectx;
+ e->recty = recty;
+ e->cfra = cfra;
+ e->chanshown = chanshown;
+ e->monoton_cfra = monoton_cfra++;
+
+ pthread_mutex_lock(&queue_lock);
+ BLI_addtail(&prefetch_wait, e);
+ pthread_mutex_unlock(&queue_lock);
+
+ pthread_mutex_lock(&wakeup_lock);
+ pthread_cond_signal(&wakeup_cond);
+ pthread_mutex_unlock(&wakeup_lock);
+}
+
+void seq_wait_for_prefetch_ready()
+{
+ PrefetchThread *tslot;
+
+ if (seq_thread_shutdown) {
+ return;
+ }
+
+ fprintf(stderr, "SEQ-THREAD: rendering prefetch frames...\n");
+
+ pthread_mutex_lock(&prefetch_ready_lock);
+
+ for(;;) {
+ for(tslot = running_threads.first; tslot; tslot= tslot->next) {
+ if (tslot->running) {
+ break;
+ }
+ }
+ if (!tslot) {
+ break;
+ }
+ pthread_cond_wait(&prefetch_ready_cond, &prefetch_ready_lock);
+ }
+
+ pthread_mutex_unlock(&prefetch_ready_lock);
+
+ fprintf(stderr, "SEQ-THREAD: prefetch done\n");
+}
+
+ImBuf * give_ibuf_seq_threaded(int rectx, int recty, int cfra, int chanshown)
+{
+ PrefetchQueueElem * e = 0;
+ int found_something = FALSE;
+
+ if (seq_thread_shutdown) {
+ return give_ibuf_seq(rectx, recty, cfra, chanshown);
+ }
+
+ while (!e) {
+ int success = FALSE;
+ pthread_mutex_lock(&queue_lock);
+
+ for (e = prefetch_done.first; e; e = e->next) {
+ if (cfra == e->cfra &&
+ chanshown == e->chanshown &&
+ rectx == e->rectx &&
+ recty == e->recty) {
+ success = TRUE;
+ found_something = TRUE;
+ break;
+ }
+ }
+
+ if (!e) {
+ for (e = prefetch_wait.first; e; e = e->next) {
+ if (cfra == e->cfra &&
+ chanshown == e->chanshown &&
+ rectx == e->rectx &&
+ recty == e->recty) {
+ found_something = TRUE;
+ break;
+ }
+ }
+ }
+
+ if (!e) {
+ PrefetchThread *tslot;
+
+ for(tslot = running_threads.first;
+ tslot; tslot= tslot->next) {
+ if (tslot->current &&
+ cfra == tslot->current->cfra &&
+ chanshown == tslot->current->chanshown &&
+ rectx == tslot->current->rectx &&
+ recty == tslot->current->recty) {
+ found_something = TRUE;
+ break;
+ }
+ }
+ }
+
+ /* e->ibuf is unrefed by render thread on next round. */
+
+ if (e) {
+ seq_last_given_monoton_cfra = e->monoton_cfra;
+ }
+
+ pthread_mutex_unlock(&queue_lock);
+
+ if (!success) {
+ e = NULL;
+
+ if (!found_something) {
+ fprintf(stderr,
+ "SEQ-THREAD: Requested frame "
+ "not in queue ???\n");
+ break;
+ }
+ pthread_mutex_lock(&frame_done_lock);
+ pthread_cond_wait(&frame_done_cond, &frame_done_lock);
+ pthread_mutex_unlock(&frame_done_lock);
+ }
+ }
+
+ return e ? e->ibuf : 0;
}
/* Functions to free imbuf and anim data on changes */
-static void free_imbuf_strip_elem(StripElem *se)
+static void free_imbuf_strip_elem(TStripElem *se)
{
if (se->ibuf) {
- if (se->ok != 2)
+ if (se->ok != STRIPELEM_META && se->ibuf != 0)
IMB_freeImBuf(se->ibuf);
se->ibuf= 0;
- se->ok= 1;
+ se->ok= STRIPELEM_OK;
se->se1= se->se2= se->se3= 0;
}
}
@@ -1201,15 +1573,17 @@ void free_imbuf_seq_except(int cfra)
{
Editing *ed= G.scene->ed;
Sequence *seq;
- StripElem *se;
+ TStripElem *se;
int a;
if(ed==0) return;
WHILE_SEQ(&ed->seqbase) {
if(seq->strip) {
- for(a=0, se= seq->strip->stripdata; a<seq->len; a++, se++)
- if(se!=seq->curelem)
+ TStripElem * curelem = give_tstripelem(seq, cfra);
+
+ for(a=0, se= seq->strip->tstripdata; a<seq->len; a++, se++)
+ if(se != curelem)
free_imbuf_strip_elem(se);
if(seq->type==SEQ_MOVIE)
@@ -1224,15 +1598,17 @@ void free_imbuf_seq()
{
Editing *ed= G.scene->ed;
Sequence *seq;
- StripElem *se;
+ TStripElem *se;
int a;
if(ed==0) return;
WHILE_SEQ(&ed->seqbase) {
if(seq->strip) {
- for(a=0, se= seq->strip->stripdata; a<seq->len; a++, se++)
- free_imbuf_strip_elem(se);
+ if (seq->strip->tstripdata) {
+ for(a=0, se= seq->strip->tstripdata; a<seq->len; a++, se++)
+ free_imbuf_strip_elem(se);
+ }
if(seq->type==SEQ_MOVIE)
free_anim_seq(seq);
@@ -1267,7 +1643,7 @@ static int update_changed_seq_recurs(Sequence *seq, Sequence *changed_seq, int l
{
Sequence *subseq;
int a, free_imbuf = 0;
- StripElem *se;
+ TStripElem *se;
/* recurs downwards to see if this seq depends on the changed seq */
@@ -1279,24 +1655,27 @@ static int update_changed_seq_recurs(Sequence *seq, Sequence *changed_seq, int l
for(subseq=seq->seqbase.first; subseq; subseq=subseq->next)
if(update_changed_seq_recurs(subseq, changed_seq, len_change, ibuf_change))
- free_imbuf = 1;
+ free_imbuf = TRUE;
if(seq->seq1)
if(update_changed_seq_recurs(seq->seq1, changed_seq, len_change, ibuf_change))
- free_imbuf = 1;
+ free_imbuf = TRUE;
if(seq->seq2 && (seq->seq2 != seq->seq1))
if(update_changed_seq_recurs(seq->seq2, changed_seq, len_change, ibuf_change))
- free_imbuf = 1;
+ free_imbuf = TRUE;
if(seq->seq3 && (seq->seq3 != seq->seq1) && (seq->seq3 != seq->seq2))
if(update_changed_seq_recurs(seq->seq3, changed_seq, len_change, ibuf_change))
- free_imbuf = 1;
+ free_imbuf = TRUE;
if(free_imbuf) {
if(ibuf_change) {
- for(a=0, se= seq->strip->stripdata; a<seq->len; a++, se++)
- free_imbuf_strip_elem(se);
+ se= seq->strip->tstripdata;
+ if (se) {
+ for(a=0; a<seq->len; a++, se++)
+ free_imbuf_strip_elem(se);
+ }
- if(seq->type==SEQ_MOVIE)
+ if(seq->type == SEQ_MOVIE)
free_anim_seq(seq);
if(seq->type == SEQ_SPEED) {
sequence_effect_speed_rebuild_map(seq, 1);
@@ -1331,7 +1710,6 @@ void do_render_seq(RenderResult *rr, int cfra)
ibuf= give_ibuf_seq(rr->rectx, rr->recty, cfra, 0);
if(ibuf) {
-
if(ibuf->rect_float) {
if (!rr->rectf)
rr->rectf= MEM_mallocN(4*sizeof(float)*rr->rectx*rr->recty, "render_seq rectf");
@@ -1368,11 +1746,12 @@ void do_render_seq(RenderResult *rr, int cfra)
*/
{
extern int mem_in_use;
+ extern int mmap_in_use;
int max = MEM_CacheLimiter_get_maximum();
- if (max != 0 && mem_in_use > max) {
+ if (max != 0 && mem_in_use + mmap_in_use > max) {
fprintf(stderr, "mem_in_use = %d, max = %d\n",
- mem_in_use, max);
+ mem_in_use + mmap_in_use, max);
fprintf(stderr, "Cleaning up, please wait...\n"
"If this happens very often,\n"
"consider "
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
index e3085468442..f160c2b06ee 100644
--- a/source/blender/src/space.c
+++ b/source/blender/src/space.c
@@ -65,6 +65,7 @@
#include "DNA_meshdata_types.h"
#include "DNA_modifier_types.h" /* used for select grouped hooks */
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_sequence_types.h"
@@ -78,6 +79,7 @@
#include "BKE_colortools.h"
#include "BKE_curve.h"
#include "BKE_depsgraph.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_displist.h"
#include "BKE_global.h"
#include "BKE_group.h"
@@ -86,7 +88,10 @@
#include "BKE_mesh.h"
#include "BKE_node.h"
#include "BKE_scene.h"
+#include "BKE_texture.h"
#include "BKE_utildefines.h"
+#include "BKE_image.h" /* for IMA_TYPE_COMPOSITE and IMA_TYPE_R_RESULT */
+#include "BKE_particle.h"
#include "BIF_spacetypes.h" /* first, nasty dependency with typedef */
@@ -96,6 +101,7 @@
#include "BIF_drawtext.h"
#include "BIF_drawscript.h"
#include "BIF_editarmature.h"
+#include "BIF_editparticle.h"
#include "BIF_editconstraint.h"
#include "BIF_editdeform.h"
#include "BIF_editfont.h"
@@ -110,6 +116,7 @@
#include "BIF_editsima.h"
#include "BIF_editsound.h"
#include "BIF_editview.h"
+#include "BIF_filelist.h"
#include "BIF_gl.h"
#include "BIF_imasel.h"
#include "BIF_interface.h"
@@ -138,6 +145,7 @@
#include "BSE_headerbuttons.h"
#include "BSE_editnla_types.h"
#include "BSE_time.h"
+#include "BSE_trans_types.h"
#include "BDR_vpaint.h"
#include "BDR_editmball.h"
@@ -647,15 +655,12 @@ static void align_view_to_selected(View3D *v3d)
if ((G.obedit) && (G.obedit->type == OB_MESH)) {
editmesh_align_view_to_selected(v3d, axis);
addqueue(v3d->area->win, REDRAW, 1);
- } else if (G.f & G_FACESELECT) {
+ } else if (FACESEL_PAINT_TEST) {
Object *obact= OBACT;
if (obact && obact->type==OB_MESH) {
Mesh *me= obact->data;
-
- if (me->mtface) {
- faceselect_align_view_to_selected(v3d, me, axis);
- addqueue(v3d->area->win, REDRAW, 1);
- }
+ faceselect_align_view_to_selected(v3d, me, axis);
+ addqueue(v3d->area->win, REDRAW, 1);
}
}
}
@@ -855,6 +860,25 @@ static short select_same_layer(Object *ob)
return changed;
}
+static short select_same_index_object(Object *ob)
+{
+ char changed = 0;
+ Base *base = FIRSTBASE;
+
+ if (!ob)
+ return 0;
+
+ while(base) {
+ if (BASE_SELECTABLE(base) && (base->object->index == ob->index) && !(base->flag & SELECT)) {
+ base->flag |= SELECT;
+ base->object->flag |= SELECT;
+ changed = 1;
+ }
+ base= base->next;
+ }
+ return changed;
+}
+
void select_object_grouped(short nr)
{
short changed = 0;
@@ -866,6 +890,7 @@ void select_object_grouped(short nr)
else if(nr==6) changed = select_same_layer(OBACT);
else if(nr==7) changed = select_same_group(OBACT);
else if(nr==8) changed = select_object_hooks(OBACT);
+ else if(nr==9) changed = select_same_index_object(OBACT);
if (changed) {
countall();
@@ -891,7 +916,7 @@ static void select_object_grouped_menu(void)
"Objects of Same Type%x5|"
"Objects on Shared Layers%x6|"
"Objects in Same Group%x7|"
- "Object Hooks%x8|");
+ "Object Hooks%x8|Object PassIndex%x9");
/* here we go */
@@ -904,21 +929,30 @@ static void select_object_grouped_menu(void)
void join_menu(void)
{
Object *ob= OBACT;
- if (ob && !G.obedit) {
- if(ob->type == OB_MESH) {
- if(okee("Join selected meshes")==0) return;
- join_mesh();
- } else if(ob->type == OB_CURVE) {
- if(okee("Join selected curves")==0) return;
- join_curve(OB_CURVE);
- } else if(ob->type == OB_SURF) {
- if(okee("Join selected NURBS")==0) return;
- join_curve(OB_SURF);
- } else if(ob->type == OB_ARMATURE) {
- /* Make sure the user wants to continue*/
- if(okee("Join selected armatures")==0) return;
- join_armature ();
- }
+ if (G.obedit) {
+ error("This data does not support joining in editmode");
+ return;
+ }
+ if (!ob) {
+ error("Can't join unless there is an active object");
+ return;
+ }
+
+ if(ob->type == OB_MESH) {
+ if(okee("Join selected meshes")==0) return;
+ join_mesh();
+ } else if(ob->type == OB_CURVE) {
+ if(okee("Join selected curves")==0) return;
+ join_curve(OB_CURVE);
+ } else if(ob->type == OB_SURF) {
+ if(okee("Join selected NURBS")==0) return;
+ join_curve(OB_SURF);
+ } else if(ob->type == OB_ARMATURE) {
+ /* Make sure the user wants to continue*/
+ if(okee("Join selected armatures")==0) return;
+ join_armature ();
+ } else {
+ error("This object type doesn't support joining");
}
}
@@ -957,6 +991,9 @@ void BIF_undo_push(char *str)
else if (G.obedit->type==OB_ARMATURE)
undo_push_armature(str);
}
+ else if(G.f & G_PARTICLEEDIT) {
+ PE_undo_push(str);
+ }
else {
if(U.uiflag & USER_GLOBALUNDO)
BKE_write_undo(str);
@@ -974,6 +1011,8 @@ void BIF_undo(void)
imagepaint_undo();
else if(curarea->spacetype==SPACE_IMAGE && (G.sima->flag & SI_DRAWTOOL))
imagepaint_undo();
+ else if(G.f & G_PARTICLEEDIT)
+ PE_undo();
else {
/* now also in faceselect mode */
if(U.uiflag & USER_GLOBALUNDO) {
@@ -995,6 +1034,8 @@ void BIF_redo(void)
imagepaint_undo();
else if(curarea->spacetype==SPACE_IMAGE && (G.sima->flag & SI_DRAWTOOL))
imagepaint_undo();
+ else if(G.f & G_PARTICLEEDIT)
+ PE_redo();
else {
/* includes faceselect now */
if(U.uiflag & USER_GLOBALUNDO) {
@@ -1013,7 +1054,9 @@ void BIF_undo_menu(void)
allqueue(REDRAWALL, 0);
}
else {
- if(U.uiflag & USER_GLOBALUNDO) {
+ if(G.f & G_PARTICLEEDIT)
+ PE_undo_menu();
+ else if(U.uiflag & USER_GLOBALUNDO) {
char *menu= BKE_undo_menu_string();
if(menu) {
short event= pupmenu_col(menu, 20);
@@ -1122,7 +1165,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
Object *ob= OBACT; /* do not change! */
float *curs;
int doredraw= 0, pupval;
- unsigned short event= evt->event, origevent= evt->event;
+ unsigned short event= evt->event;
short val= evt->val;
char ascii= evt->ascii;
@@ -1139,8 +1182,15 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
/* swap mouse buttons based on user preference */
if (U.flag & USER_LMOUSESELECT) {
- if (event==LEFTMOUSE) event = RIGHTMOUSE;
- else if (event==RIGHTMOUSE) event = LEFTMOUSE;
+ /* only swap mouse button for selection, in modes where it is relevant.
+ * painting/sculpting stays on LEFTMOUSE */
+ if ( !((G.f & G_SCULPTMODE) || (G.f & G_WEIGHTPAINT) ||
+ (G.f & G_VERTEXPAINT) || (G.f & G_TEXTUREPAINT)) ||
+ (G.obedit) )
+ {
+ if (event==LEFTMOUSE) event = RIGHTMOUSE;
+ else if (event==RIGHTMOUSE) event = LEFTMOUSE;
+ }
}
if(!mouse_in_header(sa)) {
@@ -1155,6 +1205,17 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
allqueue(REDRAWVIEW3D, 0);
}
}
+ else if(!G.obedit && OBACT && G.f&G_PARTICLEEDIT){
+ ParticleSystem *psys=PE_get_current(OBACT);
+ ParticleEditSettings *pset=PE_settings();
+ if(psys && psys->edit){
+ if(pset->brushtype>=0 &&
+ event!=LEFTMOUSE && event!=RIGHTMOUSE && event!=MIDDLEMOUSE &&
+ (event==MOUSEY || event==MOUSEX) && bwin_qtest(sa->win)==0) {
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ }
+ }
/* Handle retopo painting */
if(retopo_mesh_paint_check()) {
@@ -1409,6 +1470,9 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case LKEY:
sd->brush_type= LAYER_BRUSH;
update_prop= 1; break;
+ case TKEY:
+ sd->brush_type= FLATTEN_BRUSH;
+ update_prop= 1; break;
/* Symmetry */
case XKEY:
sd->symm^= SYMM_X;
@@ -1506,7 +1570,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
/* Snap toggle (only edit mesh right now) */
if (G.obedit && G.obedit->type==OB_MESH)
{
- G.vd->flag2 ^= V3D_TRANSFORM_SNAP;
+ G.scene->snap_flag ^= SCE_SNAP;
allqueue(REDRAWHEADERS, 0);
}
}
@@ -1516,7 +1580,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
* based on user preference USER_LMOUSESELECT
*/
case LEFTMOUSE:
- if ((G.obedit) || !(G.f&(G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT))) {
+ if ((G.obedit) || !(G.f&(G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT|G_PARTICLEEDIT))) {
mouse_cursor();
}
else if (G.f & G_WEIGHTPAINT) {
@@ -1526,7 +1590,13 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
vertex_paint();
}
else if (G.f & G_TEXTUREPAINT) {
- imagepaint_paint(origevent==LEFTMOUSE? L_MOUSE: R_MOUSE, 1);
+ imagepaint_paint(L_MOUSE, 1);
+ }
+ else if (G.f & G_PARTICLEEDIT) {
+ if(G.qual & LR_CTRLKEY)
+ mouse_cursor();
+ else if(!PE_brush_particles())
+ mouse_cursor();
}
break;
case MIDDLEMOUSE:
@@ -1551,10 +1621,12 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
mouse_mesh(); /* loop select for 1 mousebutton dudes */
else if(G.qual==LR_CTRLKEY)
mouse_select(); /* also allow in editmode, for vertex parenting */
- else if(G.f & G_FACESELECT)
+ else if(FACESEL_PAINT_TEST)
face_select();
else if( G.f & (G_VERTEXPAINT|G_TEXTUREPAINT))
sample_vpaint();
+ else if( G.f & G_PARTICLEEDIT)
+ PE_mouse_particles();
else
mouse_select(); /* does poses too */
break;
@@ -1672,7 +1744,8 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
deselectall_posearmature(ob, 1, 1);
}
else {
- if(G.f & G_FACESELECT) deselectall_tface();
+ if(FACESEL_PAINT_TEST) deselectall_tface();
+ else if(G.f & G_PARTICLEEDIT) PE_deselectall();
else {
/* by design, the center of the active object
* (which need not necessarily by selected) will
@@ -1787,7 +1860,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if (G.qual==LR_CTRLKEY) {
if(G.obedit && G.obedit->type==OB_MESH)
Edge_Menu();
- else if (G.f & G_FACESELECT)
+ else if (FACESEL_PAINT_TEST)
seam_mark_clear_tface(0);
}
else if (G.qual==LR_SHIFTKEY) {
@@ -1804,11 +1877,13 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case FKEY:
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
- if((G.qual==LR_SHIFTKEY))
+ if(G.qual == LR_CTRLKEY)
+ Face_Menu();
+ else if((G.qual==LR_SHIFTKEY))
fill_mesh();
else if(G.qual==LR_ALTKEY)
beauty_fill();
- else if(G.qual==LR_CTRLKEY)
+ else if(G.qual==(LR_CTRLKEY|LR_SHIFTKEY))
edge_flip();
else if (G.qual==0)
addedgeface_mesh();
@@ -1831,7 +1906,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
fly();
}
else {
- set_faceselect();
+ if (G.f & (G_VERTEXPAINT|G_WEIGHTPAINT|G_TEXTUREPAINT)){
+ G.f ^= G_FACESELECT;
+ allqueue(REDRAWVIEW3D, 1);
+ }
}
break;
@@ -1936,8 +2014,16 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
show_all_armature_bones();
}
}
- else if(G.f & G_FACESELECT)
+ else if(FACESEL_PAINT_TEST)
hide_tface();
+ else if(G.f & G_PARTICLEEDIT) {
+ if(G.qual == LR_ALTKEY)
+ PE_hide(0);
+ else if(G.qual == LR_SHIFTKEY)
+ PE_hide(1);
+ else if(G.qual == 0)
+ PE_hide(2);
+ }
else if(ob && (ob->flag & OB_POSEMODE)) {
if (G.qual==0)
hide_selected_pose_bones();
@@ -1955,8 +2041,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
case IKEY:
- if(G.obedit);
- else if(G.qual==LR_CTRLKEY) {
+ if(G.obedit) {
+ if(G.qual==LR_CTRLKEY)
+ selectswap_mesh();
+ } else if(G.qual==LR_CTRLKEY) {
if(ob && ob->type==OB_ARMATURE)
if(ob->flag & OB_POSEMODE)
pose_add_IK();
@@ -1973,8 +2061,12 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if( ob ) {
join_menu();
}
- else if ((G.obedit) && ELEM(G.obedit->type, OB_CURVE, OB_SURF))
+ else if ((G.obedit) && ELEM(G.obedit->type, OB_CURVE, OB_SURF)) {
addsegment_nurb();
+ } else {
+ error("Can't join unless there is an active object");
+ }
+
}
else if(G.obedit) {
if(G.obedit->type==OB_MESH) {
@@ -1996,7 +2088,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
else {
if((G.qual==LR_SHIFTKEY)) {
- if(G.f & G_FACESELECT)
+ if(FACESEL_PAINT_TEST)
if (G.f & G_WEIGHTPAINT)
clear_wpaint_selectedfaces();
else
@@ -2013,8 +2105,21 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case LKEY:
if(G.obedit) {
- if(G.obedit->type==OB_MESH)
- selectconnected_mesh(G.qual);
+ if(G.obedit->type==OB_MESH) {
+ if (G.qual & LR_CTRLKEY) {
+ if ((G.scene->selectmode & SCE_SELECT_FACE) == 0) {
+ selectconnected_mesh_all(); /* normal select linked */
+ } else {
+ selectconnected_delimit_mesh_all(); /* select linked with edge crease delimiting */
+ }
+ } else {
+ if ((G.scene->selectmode & SCE_SELECT_FACE) == 0) {
+ selectconnected_mesh();
+ } else {
+ selectconnected_delimit_mesh();
+ }
+ }
+ }
if(G.obedit->type==OB_ARMATURE)
selectconnected_armature();
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
@@ -2024,7 +2129,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
selectconnected_posearmature();
}
else {
- if(G.f & G_FACESELECT) {
+ if(FACESEL_PAINT_TEST) {
if((G.qual==0))
select_linked_tfaces(0);
else if((G.qual==LR_SHIFTKEY))
@@ -2032,6 +2137,9 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if(G.qual==LR_CTRLKEY)
select_linked_tfaces(2);
}
+ else if(G.f & G_PARTICLEEDIT) {
+ PE_select_linked();
+ }
else {
if((G.qual==0))
make_local_menu();
@@ -2043,19 +2151,20 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
case MKEY:
- if((G.obedit==0) && (G.f & G_FACESELECT) && (G.qual==0))
- mirror_uv_tface();
- else if(G.obedit){
- if(G.qual==LR_ALTKEY) {
+ if(G.obedit){
+ if (ELEM(G.qual, 0, LR_SHIFTKEY) && (G.obedit->type==OB_ARMATURE)) {
+ pose_movetolayer();
+ }
+ else if (G.qual==LR_ALTKEY) {
if(G.obedit->type==OB_MESH) {
mergemenu();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
}
}
- else if((G.qual==0) || (G.qual==LR_CTRLKEY)) {
+ else if ((G.qual==0) || (G.qual==LR_CTRLKEY)) {
mirrormenu();
}
- if ( G.qual == (LR_SHIFTKEY | LR_ALTKEY | LR_CTRLKEY) ) {
+ else if ( G.qual == (LR_SHIFTKEY | LR_ALTKEY | LR_CTRLKEY) ) {
if(G.obedit->type==OB_MESH) select_non_manifold();
}
}
@@ -2077,9 +2186,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if(G.obedit) {
switch (G.obedit->type){
case OB_ARMATURE:
- if(G.qual==LR_CTRLKEY){
- if (okee("Recalculate bone roll angles")) {
- auto_align_armature();
+ if(G.qual==LR_CTRLKEY) {
+ pupval= pupmenu("Recalculate Bone Roll Angles%t|Clear Roll (Z-Axis Up) %x1|Align Z-Axis to 3D-Cursor %x2");
+ if (pupval > 0) {
+ auto_align_armature(pupval - 1);
allqueue(REDRAWVIEW3D, 0);
}
}
@@ -2105,7 +2215,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case OKEY:
- if (G.obedit) {
+ if (G.obedit || G.f&G_PARTICLEEDIT) {
if (G.qual==LR_SHIFTKEY) {
G.scene->prop_mode = (G.scene->prop_mode+1)%7;
allqueue(REDRAWHEADERS, 0);
@@ -2176,9 +2286,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
case RKEY:
- if((G.obedit==0) && (G.f & G_FACESELECT) && (G.qual==0) && !(G.f & G_WEIGHTPAINT))
- rotate_uv_tface();
- else if((G.obedit==0) && G.qual==LR_ALTKEY) {
+ if((G.obedit==0) && G.qual==LR_ALTKEY) {
if(okee("Clear rotation")) {
clear_object('r');
}
@@ -2289,10 +2397,16 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
case TKEY:
- if(G.obedit){
+ if(G.qual == LR_SHIFTKEY) { /* toggle texture in solid draw mode */
+ G.vd->flag2 ^= V3D_SOLID_TEX;
+ allqueue(REDRAWVIEW3D, 0);
+ } else if(G.obedit){
if((G.qual & LR_CTRLKEY) && G.obedit->type==OB_MESH) {
convert_to_triface(G.qual & LR_SHIFTKEY);
allqueue(REDRAWVIEW3D, 0);
+ if (EM_texFaceCheck())
+ allqueue(REDRAWIMAGE, 0);
+
countall();
DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA);
}
@@ -2306,6 +2420,10 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
}
}
+ else if(G.f & G_PARTICLEEDIT) {
+ initTransform(TFM_BAKE_TIME, CTX_NONE);
+ Transform();
+ }
else if(G.qual==LR_CTRLKEY) {
if(ob && (ob->flag & OB_POSEMODE));
else make_track();
@@ -2320,6 +2438,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case UKEY:
+ /*// Use Ctrl Z like everybody else
if(G.obedit) {
if(G.obedit->type==OB_MESH) {
if(G.qual==0) BIF_undo(); else BIF_redo();
@@ -2327,6 +2446,14 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if ELEM5(G.obedit->type, OB_CURVE, OB_SURF, OB_MBALL, OB_LATTICE, OB_ARMATURE) {
if(G.qual==0) BIF_undo(); else BIF_redo();
}
+ }*/
+ if(G.obedit) {
+ if(G.obedit->type==OB_MESH && G.qual==0) {
+ uv_autocalc_tface();
+ }
+ }
+ else if (G.f & G_PARTICLEEDIT){
+ if(G.qual==0) BIF_undo(); else BIF_redo();
}
else if((G.qual==0)) {
if(G.f & G_WEIGHTPAINT)
@@ -2335,8 +2462,6 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
BIF_undo();
else if(G.f & G_TEXTUREPAINT)
imagepaint_undo();
- else if (G.f & G_FACESELECT)
- uv_autocalc_tface();
else {
single_user();
}
@@ -2344,11 +2469,15 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case VKEY:
- if((G.qual==LR_SHIFTKEY)) {
+ if ((G.qual==LR_CTRLKEY)) {
+ if ((G.obedit) && G.obedit->type==OB_MESH) {
+ Vertex_Menu();
+ }
+ } else if((G.qual==LR_SHIFTKEY)) {
if ((G.obedit) && G.obedit->type==OB_MESH) {
align_view_to_selected(v3d);
}
- else if (G.f & G_FACESELECT) {
+ else if (FACESEL_PAINT_TEST) {
align_view_to_selected(v3d);
}
}
@@ -2375,9 +2504,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
initTransform(TFM_WARP, CTX_NONE);
Transform();
}
- else if(G.qual==LR_ALTKEY) {
- /* if(G.obedit && G.obedit->type==OB_MESH) write_videoscape(); */
- }
+ /*else if(G.qual==LR_ALTKEY) {}*/
else if(G.qual==LR_CTRLKEY) {
if(G.obedit) {
if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
@@ -2427,7 +2554,9 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case PERIODKEY:
if(G.qual==LR_CTRLKEY) {
G.vd->around= V3D_LOCAL;
- } else if(G.qual==0) {
+ } else if(G.qual==LR_ALTKEY) {
+ G.vd->around= V3D_ACTIVE;
+ } else if(G.qual==0) {
G.vd->around= V3D_CURSOR;
}
handle_view3d_around();
@@ -2455,7 +2584,7 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if ((G.obedit) && (G.obedit->type == OB_MESH)) {
editmesh_align_view_to_selected(G.vd, 3);
}
- else if (G.f & G_FACESELECT) {
+ else if (FACESEL_PAINT_TEST) {
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
faceselect_align_view_to_selected(G.vd, me, 3);
@@ -2504,6 +2633,9 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if ( (G.qual==LR_CTRLKEY)
&& (G.obedit) && (G.obedit->type==OB_SURF) )
select_less_nurb();
+ else if ( (G.qual==LR_CTRLKEY)
+ && (G.f & G_PARTICLEEDIT) )
+ PE_select_less();
else {
persptoetsen(event);
doredraw= 1;
@@ -2520,6 +2652,9 @@ static void winqreadview3dspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if ( (G.qual==LR_CTRLKEY)
&& (G.obedit) && (G.obedit->type==OB_SURF) )
select_more_nurb();
+ else if ( (G.qual==LR_CTRLKEY)
+ && (G.f & G_PARTICLEEDIT) )
+ PE_select_more();
else {
persptoetsen(event);
doredraw= 1;
@@ -2564,6 +2699,8 @@ static void initview3d(ScrArea *sa)
vd->far= 500.0f;
vd->grid= 1.0f;
vd->gridlines= 16;
+ vd->gridsubdiv = 10;
+
vd->lay= vd->layact= 1;
if(G.scene) {
vd->lay= vd->layact= G.scene->lay;
@@ -2671,11 +2808,7 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case RIGHTMOUSE:
mouse_select_ipo();
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
break;
case MIDDLEMOUSE:
if(in_ipo_buttons()) {
@@ -2715,15 +2848,15 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
if((G.qual==0))
do_ipo_buttons(B_IPOHOME);
break;
+ case PADPERIOD:
+ if((G.qual==0))
+ do_ipo_buttons(B_IPOVIEWCENTER);
+ break;
case AKEY:
if (G.qual & LR_CTRLKEY) {
deselect_markers(1, 0);
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ allqueue(REDRAWMARKER, 0);
}
else if (G.qual==0) {
if(in_ipo_buttons()) {
@@ -2752,15 +2885,18 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
move_to_frame();
break;
case DKEY:
- if (G.qual==LR_SHIFTKEY)
+ if (G.qual==LR_SHIFTKEY) {
add_duplicate_editipo();
- else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
+ } else if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY)) {
duplicate_marker();
+ allqueue(REDRAWMARKER, 0);
+ }
break;
case GKEY:
- if (G.qual & LR_CTRLKEY)
+ if (G.qual & LR_CTRLKEY) {
transform_markers('g', 0);
- else if (G.qual==0)
+ allqueue(REDRAWMARKER, 0);
+ } else if (G.qual==0)
transform_ipo('g');
break;
case HKEY:
@@ -2784,21 +2920,17 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
case MKEY:
- if (G.qual==LR_SHIFTKEY) {
+ if (G.qual==0) {
+ add_marker(CFRA);
+ } else if (G.qual==LR_SHIFTKEY) {
ipo_mirror_menu();
break;
- }
- if (G.qual == 0)
- add_marker(CFRA);
- else if (G.qual == LR_CTRLKEY)
+ } else if (G.qual == LR_CTRLKEY) {
rename_marker();
- else
+ } else {
break;
- allqueue(REDRAWTIME, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWSOUND, 0);
+ }
+ allqueue(REDRAWMARKER, 0);
break;
case NKEY:
toggle_blockhandler(sa, IPO_HANDLER_PROPERTIES, UI_PNL_TO_MOUSE);
@@ -2822,8 +2954,10 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
allqueue(REDRAWIPO, 0);
break;
case RKEY:
- if (G.qual==0)
+ if (G.qual==LR_CTRLKEY)
ipo_record();
+ else
+ transform_ipo('r');
break;
case SKEY:
if (G.qual==LR_SHIFTKEY) {
@@ -2853,6 +2987,13 @@ static void winqreadipospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
allqueue(REDRAWSOUND, 0);
}
break;
+ case ACCENTGRAVEKEY:
+ if((G.qual==0)) {
+ do_ipo_buttons(B_IPOVIEWALL);
+ allqueue(REDRAWIPO, 0);
+ }
+ break;
+
}
}
@@ -3070,7 +3211,7 @@ static void info_user_themebuts(uiBlock *block, short y1, short y2, short y3)
}
else {
uiBlockBeginAlign(block);
- if ELEM8(th_curcol, TH_PANEL, TH_LAMP, TH_FACE, TH_FACE_SELECT, TH_MENU_BACK, TH_MENU_HILITE, TH_MENU_ITEM, TH_NODE) {
+ if ELEM9(th_curcol, TH_PANEL, TH_LAMP, TH_FACE, TH_FACE_SELECT, TH_EDITMESH_ACTIVE, TH_MENU_BACK, TH_MENU_HILITE, TH_MENU_ITEM, TH_NODE) {
uiDefButC(block, NUMSLI, B_UPDATE_THEME,"A ", 465,y3+25,200,20, col+3, 0.0, 255.0, B_THEMECOL, 0, "");
}
uiDefButC(block, NUMSLI, B_UPDATE_THEME,"R ", 465,y3,200,20, col, 0.0, 255.0, B_THEMECOL, 0, "");
@@ -3097,8 +3238,8 @@ void drawinfospace(ScrArea *sa, void *spacedata)
uiBlock *block;
static short cur_light=0;
float fac, col[3];
- short xpos, ypos, ypostab, buth, rspace, dx, y1, y2, y3, y4, y5, y6;
- short y2label, y3label, y4label, y5label, y6label;
+ short xpos, ypos, ypostab, buth, rspace, dx, y1, y2, y3, y4, y5, y6, y7;
+ short y2label, y3label, y4label, y5label, y6label, y7label;
short spref, mpref, lpref, smfileselbut;
short edgsp, midsp;
char naam[32];
@@ -3149,6 +3290,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
y4 = ypos+3*(buth+rspace);
y5 = ypos+4*(buth+rspace);
y6 = ypos+5*(buth+rspace);
+ y7 = ypos+6*(buth+rspace);
y2label = y2-2; /* adjustments to offset the labels down to align better */
@@ -3156,6 +3298,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
y4label = y4-2;
y5label = y5-2;
y6label = y6-2;
+ y7label = y7-2;
/* set the color to blue and draw the main 'tab' controls */
@@ -3317,56 +3460,35 @@ void drawinfospace(ScrArea *sa, void *spacedata)
uiBlockSetCol(block, TH_AUTO); /* end color */
uiBlockEndAlign(block);
+ uiDefButBitI(block, TOG, USER_ZOOM_TO_MOUSEPOS, B_DRAWINFO, "Zoom to Mouse Position",
+ (xpos+edgsp+mpref+(2*spref)+(3*midsp)),y4,mpref,buth,
+ &(U.uiflag), 0, 0, 0, 0,
+ "Zoom in towards the mouse pointer's position in the 3D view, rather than the 2D window center");
+
uiDefBut(block, LABEL,0,"View rotation:",
- (xpos+(2*edgsp)+mpref+(2*spref)+(2*midsp)),y4label,mpref,buth,
+ (xpos+(2*edgsp)+mpref+(2*spref)+(2*midsp)),y3label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiBlockSetCol(block, TH_BUT_SETTING1); /* mutually exclusive toggles, start color */
uiDefButBitI(block, TOG, USER_TRACKBALL, B_DRAWINFO, "Trackball",
- (xpos+edgsp+mpref+(2*spref)+(3*midsp)),y3,(mpref/2),buth,
+ (xpos+edgsp+mpref+(2*spref)+(3*midsp)),y2,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0,
"Allow the view to tumble freely when orbiting with the Middle Mouse Button");
uiDefButBitI(block, TOGN, USER_TRACKBALL, B_DRAWINFO, "Turntable",
- (xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/2)),y3,(mpref/2),buth,
+ (xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/2)),y2,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0,
"Use fixed up axis for orbiting with Middle Mouse Button");
uiBlockSetCol(block, TH_AUTO); /* end color */
uiDefButBitI(block, TOG, USER_AUTOPERSP, B_DRAWINFO, "Auto Perspective",
- (xpos+edgsp+mpref+(2*spref)+(3*midsp)),y2,(mpref/2),buth,
+ (xpos+edgsp+mpref+(2*spref)+(3*midsp)),y1,(mpref/2),buth,
&(U.uiflag), 0, 0, 0, 0,
"Automatically switch between orthographic and perspective when changing from top/front/side views");
uiDefButBitI(block, TOG, USER_ORBIT_SELECTION, B_DRAWINFO, "Around Selection",
- (xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/2)),y2,(mpref/2),buth,
+ (xpos+edgsp+mpref+(2*spref)+(3*midsp)+(mpref/2)),y1,(mpref/2),buth,
&(U.uiflag), 0, 0, 0, 0,
"Use selection as the orbiting center");
uiBlockEndAlign(block);
-
- uiBlockBeginAlign(block);
- uiDefButBitI(block, TOG, USER_SHOW_ROTVIEWICON, B_DRAWINFO, "Mini Axis",
- (xpos+edgsp+(2*mpref)+(2*midsp)),y1,(mpref/3),buth,
- &(U.uiflag), 0, 0, 0, 0,
- "Show a small rotating 3D axis in the bottom left corner of the 3D View");
- uiDefButS(block, NUM, B_DRAWINFO, "Size:",
- (xpos+edgsp+(2*mpref)+(2*midsp)+(mpref/3)),y1,(mpref/3),buth,
- &U.rvisize, 10, 64, 0, 0,
- "The axis icon's size");
- uiDefButS(block, NUM, B_DRAWINFO, "Bright:",
- (xpos+edgsp+(2*mpref)+(2*midsp)+2*(mpref/3)),y1,(mpref/3),buth,
- &U.rvibright, 0, 10, 0, 0,
- "The brightness of the icon");
- uiBlockEndAlign(block);
-
- uiDefButS(block, NUM, B_DRAWINFO, "Rotation Angle:",
- (xpos+edgsp+(3*mpref)+(4*midsp)),y1,(mpref),buth,
- &U.pad_rot_angle, 0, 90, 0, 0,
- "The rotation step for numerical pad keys (2 4 6 8)");
-
- uiDefButS(block, NUM, B_DRAWINFO, "Smooth View:",
- (xpos+edgsp+(4*mpref)+(5*midsp)),y1,(mpref),buth,
- &U.smooth_viewtx, 0, 1000, 0, 0,
- "The time to animate the view in miliseconds, zero to disable");
-
uiDefBut(block, LABEL,0,"Select with:",
(xpos+(2*edgsp)+(3*mpref)+(3*midsp)),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
@@ -3401,7 +3523,21 @@ void drawinfospace(ScrArea *sa, void *spacedata)
&(U.flag), 0, 0, 0, 0,
"Emulates Middle Mouse with Alt+LeftMouse (doesnt work with Left Mouse Select option)");
-
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, USER_SHOW_ROTVIEWICON, B_DRAWINFO, "Mini Axis",
+ (xpos+edgsp+(3*mpref)+(4*midsp)),y1,(mpref/3),buth,
+ &(U.uiflag), 0, 0, 0, 0,
+ "Show a small rotating 3D axis in the bottom left corner of the 3D View");
+ uiDefButS(block, NUM, B_DRAWINFO, "Size:",
+ (xpos+edgsp+(3*mpref)+(4*midsp)+(mpref/3)),y1,(mpref/3),buth,
+ &U.rvisize, 10, 64, 0, 0,
+ "The axis icon's size");
+ uiDefButS(block, NUM, B_DRAWINFO, "Bright:",
+ (xpos+edgsp+(3*mpref)+(4*midsp)+2*(mpref/3)),y1,(mpref/3),buth,
+ &U.rvibright, 0, 10, 0, 0,
+ "The brightness of the icon");
+ uiBlockEndAlign(block);
+
uiDefBut(block, LABEL,0,"Middle Mouse Button:",
(xpos+(2*edgsp)+(4*mpref)+(4*midsp)),y6label,mpref,buth,
0, 0, 0, 0, 0, "");
@@ -3415,6 +3551,7 @@ void drawinfospace(ScrArea *sa, void *spacedata)
&(U.flag), 0, 0, 0, 0, "Default action for the Middle Mouse Button");
uiBlockSetCol(block, TH_AUTO); /* end color */
uiBlockEndAlign(block);
+
uiDefBut(block, LABEL,0,"Mouse Wheel:",
(xpos+(2*edgsp)+(4*mpref)+(4*midsp)),y4label,mpref,buth,
@@ -3429,6 +3566,17 @@ void drawinfospace(ScrArea *sa, void *spacedata)
&U.wheellinescroll, 0.0, 32.0, 0, 0,
"The number of lines scrolled at a time with the mouse wheel");
uiBlockEndAlign(block);
+
+ uiBlockBeginAlign(block);
+ uiDefButS(block, NUM, B_DRAWINFO, "Smooth View:",
+ (xpos+edgsp+(4*mpref)+(5*midsp)),y2,(mpref),buth,
+ &U.smooth_viewtx, 0, 1000, 0, 0,
+ "The time to animate the view in miliseconds, zero to disable");
+ uiDefButS(block, NUM, B_DRAWINFO, "Rotation Angle:",
+ (xpos+edgsp+(4*mpref)+(5*midsp)),y1,(mpref),buth,
+ &U.pad_rot_angle, 0, 90, 0, 0,
+ "The rotation step for numerical pad keys (2 4 6 8)");
+ uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"3D Transform Widget:",
@@ -3456,16 +3604,28 @@ void drawinfospace(ScrArea *sa, void *spacedata)
uiDefBut(block, LABEL,0,"Material linked to:",
- xpos,y3label,mpref,buth,
+ xpos,y5label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButBitI(block, TOGN, USER_MAT_ON_OB, B_DRAWINFO, "ObData",
- (xpos+edgsp),y2,(mpref/2),buth,
+ (xpos+edgsp),y4,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0, "Link new objects' material to the obData block");
uiDefButBitI(block, TOG, USER_MAT_ON_OB, B_DRAWINFO, "Object",
- (xpos+edgsp+(mpref/2)),y2,(mpref/2),buth,
+ (xpos+edgsp+(mpref/2)),y4,(mpref/2),buth,
&(U.flag), 0, 0, 0, 0, "Link new objects' material to the object block");
uiBlockEndAlign(block);
+
+ uiDefBut(block, LABEL,0,"Add new objects:",
+ xpos,y3label,mpref,buth,
+ 0, 0, 0, 0, 0, "");
+ uiBlockBeginAlign(block);
+ uiDefButBitI(block, TOG, USER_ADD_EDITMODE, B_DRAWINFO, "Switch to Edit Mode",
+ (xpos+edgsp),y2,mpref,buth,
+ &(U.flag), 0, 0, 0, 0, "Enter Edit Mode automatically after adding a new object");
+ uiDefButBitI(block, TOG, USER_ADD_VIEWALIGNED, B_DRAWINFO, "Aligned to View",
+ (xpos+edgsp),y1,mpref,buth,
+ &(U.flag), 0, 0, 0, 0, "Align newly added objects facing the 3D View direction");
+ uiBlockEndAlign(block);
uiDefBut(block, LABEL,0,"Undo:",
@@ -3483,21 +3643,25 @@ void drawinfospace(ScrArea *sa, void *spacedata)
uiDefBut(block, LABEL,0,"Auto keyframe",
- (xpos+(2*edgsp)+(2*mpref)+midsp),y4label,mpref,buth,
+ (xpos+(2*edgsp)+(2*mpref)+midsp),y5label,mpref,buth,
0, 0, 0, 0, 0, "");
uiDefButBitI(block, TOG, G_RECORDKEYS, REDRAWTIME, "Action and Object",
- (xpos+edgsp+(2*mpref)+(2*midsp)),y3,mpref, buth,
+ (xpos+edgsp+(2*mpref)+(2*midsp)),y4,mpref, buth,
&(G.flags), 0, 0, 0, 0, "Automatic keyframe insertion in Object and Action Ipo curves");
-
+
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, USER_KEYINSERTAVAI, REDRAWTIME, "Available",
- (xpos+edgsp+(2*mpref)+(2*midsp)),y2,mpref, buth,
+ (xpos+edgsp+(2*mpref)+(2*midsp)),y3,mpref, buth,
&(U.uiflag), 0, 0, 0, 0, "Automatic keyframe insertion in available curves");
uiDefButBitI(block, TOG, USER_KEYINSERTNEED, REDRAWTIME, "Needed",
- (xpos+edgsp+(2*mpref)+(2*midsp)),y1,mpref, buth,
+ (xpos+edgsp+(2*mpref)+(2*midsp)),y2,mpref, buth,
&(U.uiflag), 0, 0, 0, 0, "Automatic keyframe insertion only when keyframe needed");
+
+ uiDefButBitI(block, TOG, G_AUTOMATKEYS, REDRAWTIME, "Use Visual Keying",
+ (xpos+edgsp+(2*mpref)+(2*midsp)),y1,mpref, buth,
+ &(G.flags), 0, 0, 0, 0, "Use Visual keying automatically for constrained objects");
uiBlockEndAlign(block);
/* uiDefButBitS(block, TOG, USER_KEYINSERTACT, 0, "Action",
@@ -3641,9 +3805,17 @@ void drawinfospace(ScrArea *sa, void *spacedata)
(xpos+edgsp+(2*mpref)+(3*midsp)),y3,(mpref),buth,
&U.recent_files, 0, 30, 0, 0,
"Maximum number of recently opened files to remember");
+
+ uiDefButBitI(block, TOG, USER_SAVE_PREVIEWS, 0, "Save Preview Images",
+ (xpos+edgsp+(3*mpref)+(4*midsp)),y3,mpref,buth,
+ &(U.flag), 0, 0, 0, 0,
+ "Enables automatic saving of preview images in the .blend file");
} else if (U.userpref == 4) { /* system & opengl */
-
+ int memcachemax;
+ if (sizeof(void *) ==8) memcachemax = 1024*16; /* 64bit system, 16 gig of ram would be nice */
+ else memcachemax = 1024; /* 32 bit system, cant address over 2gig anyway */
+
uiDefBut(block, LABEL,0,"Solid OpenGL lights:",
xpos+edgsp, y6label, mpref, buth,
0, 0, 0, 0, 0, "");
@@ -3680,12 +3852,16 @@ void drawinfospace(ScrArea *sa, void *spacedata)
#ifdef WITH_VERSE
- uiDefBut(block, TEX, 0, "Verse Master: ",
- (xpos+edgsp)+mpref*2+2*midsp,y5,mpref*2+midsp,buth,
+ uiDefBut(block, LABEL,0,"Verse:",
+ (xpos+edgsp+(3*midsp)+(3*mpref)),y6label,mpref,buth,
+ 0, 0, 0, 0, 0, "");
+
+ uiDefBut(block, TEX, 0, "Master: ",
+ (xpos+edgsp+(3*midsp)+(3*mpref)),y5,mpref,buth,
U.versemaster, 1.0, 63.0, 0, 0,
"The Verse Master-server IP");
- uiDefBut(block, TEX, 0, "Verse Username: ",
- (xpos+edgsp)+mpref*2+2*midsp,y4,mpref*2+midsp,buth,
+ uiDefBut(block, TEX, 0, "Username: ",
+ (xpos+edgsp+(3*midsp)+(3*mpref)),y4,mpref,buth,
U.verseuser, 1.0, 63.0, 0, 0,
"The Verse user name");
#endif
@@ -3713,7 +3889,15 @@ void drawinfospace(ScrArea *sa, void *spacedata)
(xpos+edgsp+(1*mpref)+(1*midsp)),y2,mpref,buth,
&(U.uiflag), 0, 0, 0, 0, "Allows all codecs for rendering (not guaranteed)");
#endif
+
+ uiDefBut(block, LABEL,0,"Auto Run Python Scripts",
+ (xpos+edgsp+(1*midsp)+(1*mpref)),y6label,mpref,buth,
+ 0, 0, 0, 0, 0, "");
+ uiDefButBitI(block, TOG, G_DOSCRIPTLINKS, REDRAWBUTSSCRIPT, "Enabled by Default",
+ (xpos+edgsp+(1*mpref)+(1*midsp)),y5,mpref,buth,
+ &(G.f), 0, 0, 0, 0, "Allow any .blend file to run scripts automatically (unsafe with blend files from an untrusted source)");
+
uiDefBut(block, LABEL,0,"Keyboard:",
(xpos+edgsp+(3*midsp)+(3*mpref)),y3label,mpref,buth,
0, 0, 0, 0, 0, "");
@@ -3730,12 +3914,18 @@ void drawinfospace(ScrArea *sa, void *spacedata)
uiDefBut(block, LABEL,0,"System:",
- (xpos+edgsp+(4*midsp)+(4*mpref)),y6label,mpref,buth,
+ (xpos+edgsp+(4*midsp)+(4*mpref)),y7label,mpref,buth,
0, 0, 0, 0, 0, "");
+ uiDefButI(block, NUM, B_REDR, "Prefetch frames ",
+ (xpos+edgsp+(4*mpref)+(4*midsp)), y6, mpref, buth,
+ &U.prefetchframes, 0.0, 500.0, 20, 2,
+ "Number of frames to render ahead during playback.");
+
uiDefButI(block, NUM, B_MEMCACHELIMIT, "MEM Cache Limit ",
(xpos+edgsp+(4*mpref)+(4*midsp)), y5, mpref, buth,
- &U.memcachelimit, 0.0, 1024.0, 30, 2,
- "Memory cache limit in sequencer");
+ &U.memcachelimit, 0.0, (float)memcachemax, 30, 2,
+ "Memory cache limit in sequencer (megabytes)");
+
uiDefButS(block, NUM, B_REDR, "Frameserver Port ",
(xpos+edgsp+(4*mpref)+(4*midsp)), y4, mpref, buth,
&U.frameserverport, 0.0, 32727.0, 30, 2,
@@ -3754,8 +3944,13 @@ void drawinfospace(ScrArea *sa, void *spacedata)
&(U.uiflag), 0, 0, 0, 0, "Hide files/datablocks that start with a dot(.*)");
uiDefBut(block, LABEL,0,"OpenGL:",
- (xpos+edgsp+(5*midsp)+(5*mpref)),y6label,mpref,buth,
+ (xpos+edgsp+(5*midsp)+(5*mpref)),y7label,mpref,buth,
0, 0, 0, 0, 0, "");
+
+ uiDefButF(block, NUMSLI, B_DRAWINFO, "Clip Alpha: ",
+ (xpos+edgsp+(5*mpref)+(5*midsp)),y6,mpref,buth,
+ &(U.glalphaclip), 0.0, 1.0, 0, 0, "Clip alpha below this threshold in the 3d textured view");
+
uiDefButBitI(block, TOGN, USER_DISABLE_MIPMAP, B_MIPMAPCHANGED, "Mipmaps",
(xpos+edgsp+(5*mpref)+(5*midsp)),y5,mpref,buth,
&(U.gameflags), 0, 0, 0, 0, "Toggles between mipmap textures on (beautiful) and off (fast)");
@@ -3775,22 +3970,46 @@ void drawinfospace(ScrArea *sa, void *spacedata)
(xpos+edgsp+(5*mpref)+(5*midsp)), y1, mpref, buth,
&U.texcollectrate, 1.0, 3600.0, 30, 2, "Number of seconds between each run of the GL texture garbage collector.");
-
+ /* *** */
+ uiDefBut(block, LABEL,0,"Color range for weight paint",
+ (xpos+edgsp+(2*midsp)+(2*mpref)),y6label,mpref,buth,
+ 0, 0, 0, 0, 0, "");
+
+ uiDefButBitI(block, TOG, USER_CUSTOM_RANGE, B_WPAINT_RANGE, "ColorBand",
+ (xpos+edgsp+(2*midsp)+(2*mpref)),y5,mpref,buth,
+ &(U.flag), 0, 0, 0, 0,
+ "");
+
+ if((U.flag & USER_CUSTOM_RANGE)==0) {
+ vDM_ColorBand_store(NULL);
+ }
+ else {
+ rctf butrect;
+
+ vDM_ColorBand_store(&U.coba_weight); /* also signal for derivedmesh to use colorband */
+
+ BLI_init_rctf(&butrect, (xpos+edgsp+(2*midsp)+(2*mpref)),
+ (xpos+edgsp+(2*midsp)+(2*mpref)) + mpref,
+ y3, y3+30);
+
+ draw_colorband_buts_small(block, &U.coba_weight, &butrect, B_WPAINT_RANGE);
+ }
+
uiDefBut(block, LABEL,0,"Audio mixing buffer:",
- (xpos+edgsp+(2*midsp)+(2*mpref)),y3label,mpref,buth,
+ (xpos+edgsp+(2*midsp)+(2*mpref)),y2label,mpref,buth,
0, 0, 0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButI(block, ROW, 0, "256",
- (xpos+edgsp+(2*midsp)+(2*mpref)),y2,(mpref/4),buth,
+ (xpos+edgsp+(2*midsp)+(2*mpref)),y1,(mpref/4),buth,
&U.mixbufsize, 2.0, 256.0, 0, 0, "Set audio mixing buffer size to 256 samples");
uiDefButI(block, ROW, 0, "512",
- (xpos+edgsp+(2*midsp)+(2*mpref)+(mpref/4)),y2,(mpref/4),buth,
+ (xpos+edgsp+(2*midsp)+(2*mpref)+(mpref/4)),y1,(mpref/4),buth,
&U.mixbufsize, 2.0, 512.0, 0, 0, "Set audio mixing buffer size to 512 samples");
uiDefButI(block, ROW, 0, "1024",
- (xpos+edgsp+(2*midsp)+(2*mpref)+(2*mpref/4)),y2,(mpref/4),buth,
+ (xpos+edgsp+(2*midsp)+(2*mpref)+(2*mpref/4)),y1,(mpref/4),buth,
&U.mixbufsize, 2.0, 1024.0, 0, 0, "Set audio mixing buffer size to 1024 samples");
uiDefButI(block, ROW, 0, "2048",
- (xpos+edgsp+(2*midsp)+(2*mpref)+(3*mpref/4)),y2,(mpref/4),buth,
+ (xpos+edgsp+(2*midsp)+(2*mpref)+(3*mpref/4)),y1,(mpref/4),buth,
&U.mixbufsize, 2.0, 2048.0, 0, 0, "Set audio mixing buffer size to 2048 samples");
uiBlockEndAlign(block);
@@ -3985,6 +4204,13 @@ static void winqreadinfospace(ScrArea *sa, void *spacedata, BWinEvent *evt)
MEM_CacheLimiter_set_maximum(
U.memcachelimit * 1024 * 1024);
}
+ else if (val==B_WPAINT_RANGE) {
+ addqueue(sa->win, REDRAW, 1);
+ if(OBACT && (G.f & G_WEIGHTPAINT)) {
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ }
+ }
else do_global_buttons(val);
break;
@@ -4226,6 +4452,8 @@ void extern_set_butspace(int fkey, int do_cycle)
if (sbuts->tab[CONTEXT_OBJECT]==TAB_OBJECT_OBJECT)
sbuts->tab[CONTEXT_OBJECT]=TAB_OBJECT_PHYSICS;
else if (sbuts->tab[CONTEXT_OBJECT]==TAB_OBJECT_PHYSICS)
+ sbuts->tab[CONTEXT_OBJECT]=TAB_OBJECT_PARTICLE;
+ else if (sbuts->tab[CONTEXT_OBJECT]==TAB_OBJECT_PARTICLE)
sbuts->tab[CONTEXT_OBJECT]=TAB_OBJECT_OBJECT;
}
else sbuts->mainb= CONTEXT_OBJECT;
@@ -4334,6 +4562,10 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
mouse_select_seq();
break;
case PADPLUSKEY:
+ if (G.qual==LR_CTRLKEY) {
+ select_more_seq();
+ break;
+ }
case WHEELUPMOUSE:
if(sseq->mainb) {
sseq->zoom++;
@@ -4362,6 +4594,10 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
doredraw= 1;
break;
case PADMINUS:
+ if (G.qual==LR_CTRLKEY) {
+ select_less_seq();
+ break;
+ }
case WHEELDOWNMOUSE:
if(sseq->mainb) {
sseq->zoom--;
@@ -4395,12 +4631,17 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
break;
case AKEY:
- if(sseq->mainb) break;
- if((G.qual==LR_SHIFTKEY)) {
- add_sequence(-1);
+ if (G.qual == LR_CTRLKEY) {
+ deselect_markers(1, 0);
+ allqueue(REDRAWMARKER, 0);
+ } else {
+ if(sseq->mainb) break;
+ if((G.qual==LR_SHIFTKEY)) {
+ add_sequence(-1);
+ } else if((G.qual==0)) {
+ swap_select_seq();
+ }
}
- else if((G.qual==0))
- swap_select_seq();
break;
case SPACEKEY:
if (G.qual==0) {
@@ -4432,39 +4673,70 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
case DKEY:
- if(sseq->mainb) break;
- if((G.qual==LR_SHIFTKEY)) add_duplicate_seq();
+ if (G.qual == (LR_CTRLKEY|LR_SHIFTKEY))
+ duplicate_marker();
+ else if ((G.qual==LR_SHIFTKEY)) {
+ if(sseq->mainb) break;
+ add_duplicate_seq();
+ }
break;
case EKEY:
+ if(sseq->mainb) break;
+ if((G.qual==0))
+ transform_seq('e', 0);
break;
case FKEY:
if((G.qual==0))
set_filter_seq();
break;
case GKEY:
- if(sseq->mainb) break;
- if((G.qual==0))
+ if (G.qual & LR_CTRLKEY)
+ transform_markers('g', 0);
+ else if (G.qual==0) {
+ if(sseq->mainb) break;
transform_seq('g', 0);
+ }
break;
case KKEY:
if((G.qual==0)) { /* Cut at current frame */
if(okee("Cut strips")) seq_cut(CFRA);
}
break;
+ case LKEY:
+ if((G.qual==0)) { /* Cut at current frame */
+ select_linked_seq( 0 );
+ } else if((G.qual==LR_CTRLKEY)) { /* Cut at current frame */
+ select_linked_seq( 2 );
+ }
+ break;
+ case YKEY:
+ if((G.qual==0)) { /* Cut at current frame */
+ seq_separate_images();
+ }
+ break;
case MKEY:
- if(G.qual==LR_ALTKEY)
- un_meta();
- else if((G.qual==0)){
+ if(G.qual==LR_ALTKEY) {
+ un_meta();
+ break; /*dont redraw timeline etc */
+ } else if((G.qual==0)){
if ((last_seq) &&
(last_seq->type == SEQ_RAM_SOUND
|| last_seq->type == SEQ_HD_SOUND))
{
last_seq->flag ^= SEQ_MUTE;
doredraw = 1;
- }
- else
+ } else {
make_meta();
+ }
+ break; /*dont redraw timeline etc */
+ } else if ((G.qual==(LR_CTRLKEY|LR_ALTKEY) )) {
+ add_marker(CFRA);
+ } else if ((G.qual==LR_CTRLKEY)) {
+ rename_marker();
+ } else {
+ break; /* do nothing */
}
+ allqueue(REDRAWMARKER, 0);
break;
case NKEY:
if(G.qual==0) {
@@ -4473,7 +4745,12 @@ static void winqreadseqspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
case RKEY:
- reassign_inputs_seq_effect();
+ if(G.qual==LR_SHIFTKEY)
+ seq_remap_paths();
+ if(G.qual==LR_ALTKEY)
+ reload_sequence();
+ else if (G.qual==0)
+ reassign_inputs_seq_effect();
break;
case SKEY:
if((G.qual==LR_SHIFTKEY))
@@ -4569,14 +4846,14 @@ static void init_actionspace(ScrArea *sa)
saction->blockscale= 0.7;
saction->v2d.tot.xmin= 1.0;
- saction->v2d.tot.ymin= 0.0;
+ saction->v2d.tot.ymin= -1000.0;
saction->v2d.tot.xmax= 1000.0;
- saction->v2d.tot.ymax= 1000.0;
+ saction->v2d.tot.ymax= 0.0;
saction->v2d.cur.xmin= -5.0;
- saction->v2d.cur.ymin= 0.0;
+ saction->v2d.cur.ymin= -75.0;
saction->v2d.cur.xmax= 65.0;
- saction->v2d.cur.ymax= 1000.0;
+ saction->v2d.cur.ymax= 5.0;
saction->v2d.min[0]= 0.0;
saction->v2d.min[1]= 0.0;
@@ -4622,39 +4899,6 @@ static void init_filespace(ScrArea *sa)
sfile->spacetype= SPACE_FILE;
}
-static void init_imaselspace(ScrArea *sa)
-{
- SpaceImaSel *simasel;
-
- simasel= MEM_callocN(sizeof(SpaceImaSel), "initimaselspace");
- BLI_addhead(&sa->spacedata, simasel);
-
- simasel->spacetype= SPACE_IMASEL;
- simasel->blockscale= 0.7;
- simasel->mode = 7;
- strcpy (simasel->dir, U.textudir); /* TON */
- strcpy (simasel->file, "");
- strcpy(simasel->fole, simasel->file);
- strcpy(simasel->dor, simasel->dir);
-
- simasel->first_sel_ima = 0;
- simasel->hilite_ima = 0;
- simasel->firstdir = 0;
- simasel->firstfile = 0;
- simasel->cmap = 0;
- simasel->returnfunc = NULL;
-
- simasel->title[0] = 0;
-
- clear_ima_dir(simasel);
-
- /* simasel->cmap= IMB_loadiffmem((int*)datatoc_cmap_tga, IB_rect|IB_cmap); */
- simasel->cmap= IMB_ibImageFromMemory((int *)datatoc_cmap_tga, datatoc_cmap_tga_size, IB_rect|IB_cmap);
- if (!simasel->cmap) {
- error("in console");
- printf("Image select cmap file not found \n");
- }
-}
/* ******************** SPACE: SOUND ********************** */
@@ -4715,7 +4959,7 @@ static void changeimagepace(ScrArea *sa, void *spacedata)
static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
{
SpaceImage *sima= spacedata;
- unsigned short event= evt->event, origevent= evt->event;
+ unsigned short event= evt->event;
short val= evt->val;
if(val==0) return;
@@ -4729,7 +4973,7 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
event = LEFTMOUSE;
}
}
-
+
if (sima->image && (sima->flag & SI_DRAWTOOL)) {
switch(event) {
case CKEY:
@@ -4737,33 +4981,28 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
scrarea_queue_winredraw(sa);
break;
case LEFTMOUSE:
- imagepaint_paint(origevent==LEFTMOUSE? L_MOUSE: R_MOUSE, 0);
+ imagepaint_paint(L_MOUSE, 0);
break;
case RIGHTMOUSE:
- imagepaint_pick(origevent==LEFTMOUSE? L_MOUSE: R_MOUSE);
+ imagepaint_pick(R_MOUSE);
break;
}
}
- else {
- /* Draw tool is inactive */
- switch(event) {
+ else if (G.obedit) {
+ /* Draw tool is inactive, editmode is enabled and the image is not a render or composite */
+ if (EM_texFaceCheck() && (G.sima->image==0 || (G.sima->image->type != IMA_TYPE_R_RESULT && G.sima->image->type != IMA_TYPE_COMPOSITE))) {
+ switch(event) {
case LEFTMOUSE:
- if(G.qual & LR_SHIFTKEY) {
- if(G.sima->image && G.sima->image->tpageflag & IMA_TILES)
+ if(G.qual == LR_SHIFTKEY) {
+ if(G.sima->image && G.sima->image->tpageflag & IMA_TILES) {
mouseco_to_curtile();
- else
- sima_sample_color();
+ }
+ } else if (!gesture()) {
+ mouseco_to_cursor_sima();
}
- else if(G.f & G_FACESELECT)
- gesture();
- else
- sima_sample_color();
break;
case RIGHTMOUSE:
- if(G.f & G_FACESELECT)
- mouse_select_sima();
- else if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT))
- sample_vpaint();
+ mouse_select_sima();
break;
case AKEY:
select_swap_tface_uv();
@@ -4775,32 +5014,44 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
borderselect_sima(UV_SELECT_ALL);
break;
case CKEY:
- if(G.qual==LR_CTRLKEY)
- toggle_uv_select('s');
- else if(G.qual==LR_SHIFTKEY)
- toggle_uv_select('l');
- else if(G.qual==LR_ALTKEY)
- toggle_uv_select('o');
- else
- toggle_uv_select('f');
+ if (G.sima->flag & SI_SYNC_UVSEL) {
+ /* operate on the editmesh */
+ if (G.qual==0) {
+ if (G.scene->selectmode != SCE_SELECT_FACE) {
+ G.sima->flag ^= SI_SELACTFACE;
+ scrarea_queue_winredraw(curarea);
+ }
+ } else {
+ error("Sync selection to Edit Mesh disables UV select options");
+ }
+ } else {
+ /* normal operaton */
+ if(G.qual==LR_CTRLKEY) {
+ G.sima->sticky = SI_STICKY_VERTEX;
+ scrarea_do_headdraw(curarea);
+ } else if(G.qual==LR_SHIFTKEY) {
+ G.sima->sticky = SI_STICKY_DISABLE;
+ scrarea_do_headdraw(curarea);
+ } else if(G.qual==LR_ALTKEY) {
+ G.sima->sticky = SI_STICKY_LOC;
+ scrarea_do_headdraw(curarea);
+ } else {
+ G.sima->flag ^= SI_SELACTFACE;
+ scrarea_queue_winredraw(curarea);
+ }
+ }
break;
case EKEY :
if(okee("Unwrap"))
unwrap_lscm(0);
break;
- case GKEY:
- if((G.qual==0) && is_uv_tface_editing_allowed()) {
- initTransform(TFM_TRANSLATION, CTX_NONE);
- Transform();
- }
- break;
case HKEY:
if(G.qual==LR_ALTKEY)
reveal_tface_uv();
else if((G.qual==LR_SHIFTKEY))
hide_tface_uv(1);
else if((G.qual==0))
- hide_tface_uv(0);
+ hide_tface_uv(0);
break;
case LKEY:
if(G.qual==0)
@@ -4812,39 +5063,20 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
else if(G.qual==LR_ALTKEY)
unlink_selection();
break;
- case MKEY:
- if((G.qual==0))
- mirrormenu_tface_uv();
- break;
- case NKEY:
+ case PKEY:
if(G.qual==LR_CTRLKEY)
- replace_names_but();
- break;
- case OKEY:
- if (G.qual==LR_SHIFTKEY) {
- G.scene->prop_mode = (G.scene->prop_mode+1)%7;
- allqueue(REDRAWHEADERS, 0);
- }
- else if((G.qual==0)) {
- G.scene->proportional= !G.scene->proportional;
- }
+ pack_charts_tface_uv();
+ else if(G.qual==LR_SHIFTKEY)
+ select_pinned_tface_uv();
+ else if(G.qual==LR_ALTKEY)
+ pin_tface_uv(0);
+ else
+ pin_tface_uv(1);
break;
- case PKEY:
- if(G.f & G_FACESELECT) {
- if(G.qual==LR_CTRLKEY)
- pack_charts_tface_uv();
- else if(G.qual==LR_SHIFTKEY)
- select_pinned_tface_uv();
- else if(G.qual==LR_ALTKEY)
- pin_tface_uv(0);
- else
- pin_tface_uv(1);
- }
- else {
- if(G.qual==LR_SHIFTKEY) {
- toggle_blockhandler(sa, IMAGE_HANDLER_PREVIEW, 0);
- scrarea_queue_winredraw(sa);
- }
+ case GKEY:
+ if((G.qual==0) && is_uv_tface_editing_allowed()) {
+ initTransform(TFM_TRANSLATION, CTX_NONE);
+ Transform();
}
break;
case RKEY:
@@ -4854,28 +5086,98 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
}
break;
case SKEY:
- if((G.qual==0) && is_uv_tface_editing_allowed()) {
- initTransform(TFM_RESIZE, CTX_NONE);
- Transform();
+ if (is_uv_tface_editing_allowed()) {
+ if ( G.qual==LR_SHIFTKEY) {
+ /* Snap */
+ snap_menu_sima();
+ } else if (G.qual==0) {
+ initTransform(TFM_RESIZE, CTX_NONE);
+ Transform();
+ }
}
break;
case VKEY:
- if((G.qual==0))
- stitch_uv_tface(0);
+ if(G.qual == 0)
+ stitch_vert_uv_tface();
else if(G.qual==LR_SHIFTKEY)
- stitch_uv_tface(1);
+ stitch_limit_uv_tface();
else if(G.qual==LR_CTRLKEY)
minimize_stretch_tface_uv();
break;
case WKEY:
weld_align_menu_tface_uv();
break;
+ case MKEY:
+ if((G.qual==0))
+ mirrormenu_tface_uv();
+ break;
+ case COMMAKEY:
+ if(G.qual==LR_SHIFTKEY) {
+ G.v2d->around= V3D_CENTROID;
+ } else if(G.qual==0) {
+ G.v2d->around= V3D_CENTER;
+ }
+
+ scrarea_queue_headredraw(curarea);
+ scrarea_queue_winredraw(curarea);
+ break;
+ case PERIODKEY:
+ if(G.qual==LR_CTRLKEY) {
+ G.v2d->around= V3D_LOCAL;
+ } else if(G.qual==0) {
+ G.v2d->around= V3D_CURSOR;
+ }
+ scrarea_queue_headredraw(curarea);
+ scrarea_queue_winredraw(curarea);
+ break;
case PADPERIOD:
if(G.qual==0)
image_viewcenter();
break;
+ case OKEY:
+ if(G.qual==0) {
+ G.scene->proportional= !G.scene->proportional;
+ allqueue(REDRAWHEADERS, 0);
+ } else if (G.qual==LR_SHIFTKEY) {
+ G.scene->prop_mode = (G.scene->prop_mode+1)%7;
+ allqueue(REDRAWHEADERS, 0);
+ }
+ break;
+ case PADSLASHKEY:
+ if(G.qual==0)
+ G.sima->flag ^= SI_LOCAL_UV;
+ scrarea_queue_winredraw(curarea);
+ break;
+ case TABKEY:
+ if (G.qual == LR_SHIFTKEY) {
+ G.scene->snap_flag ^= SCE_SNAP;
+ allqueue(REDRAWHEADERS, 0);
+ }
+ break;
+ }
}
- }
+ } else {
+ /* Draw and editmode are inactive */
+ switch(event) {
+ case LEFTMOUSE:
+ sima_sample_color();
+ break;
+ case RIGHTMOUSE:
+ if(G.f & (G_VERTEXPAINT|G_TEXTUREPAINT))
+ sample_vpaint();
+ break;
+ case NKEY:
+ if(G.qual==LR_CTRLKEY)
+ replace_names_but();
+ break;
+ case PKEY:
+ if(G.qual==LR_SHIFTKEY) {
+ toggle_blockhandler(sa, IMAGE_HANDLER_PREVIEW, 0);
+ scrarea_queue_winredraw(sa);
+ }
+ break;
+ }
+ }
/* least intrusive nonumpad hack, only for plus/minus */
@@ -4907,8 +5209,12 @@ static void winqreadimagespace(ScrArea *sa, void *spacedata, BWinEvent *evt)
case NKEY:
if(G.qual==LR_ALTKEY) {
new_image_sima();
- }
- else if(G.qual==0) {
+ } else if(G.qual==0) {
+ /*if (EM_texFaceCheck()) {
+ toggle_blockhandler(sa, IMAGE_HANDLER_TRANSFORM_PROPERTIES, UI_PNL_TO_MOUSE);
+ } else {
+ toggle_blockhandler(sa, IMAGE_HANDLER_PROPERTIES, UI_PNL_TO_MOUSE);
+ }*/
toggle_blockhandler(sa, IMAGE_HANDLER_PROPERTIES, UI_PNL_TO_MOUSE);
scrarea_queue_winredraw(sa);
}
@@ -4961,7 +5267,6 @@ static void init_imagespace(ScrArea *sa)
sima->spacetype= SPACE_IMAGE;
sima->zoom= 1;
sima->blockscale= 0.7;
- sima->flag = SI_LOCALSTICKY;
sima->iuser.ok= 1;
sima->iuser.fie_ima= 2;
@@ -4974,9 +5279,61 @@ static void init_imagespace(ScrArea *sa)
extern void drawimaselspace(ScrArea *sa, void *spacedata);
extern void winqreadimaselspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *evt);
+static void changeimaselspace(ScrArea *sa, void *spacedata)
+{
+ if(G.v2d==0) return;
-/* everything to imasel.c */
+ test_view2d(G.v2d, curarea->winx, curarea->winy);
+ myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
+}
+
+static void init_imaselspace(ScrArea *sa)
+{
+ SpaceImaSel *simasel;
+
+ simasel= MEM_callocN(sizeof(SpaceImaSel), "init imaselspace");
+ BLI_addhead(&sa->spacedata, simasel);
+ simasel->spacetype= SPACE_IMASEL;
+ simasel->blockscale= 0.7;
+
+ /* view 2D */
+ simasel->v2d.tot.xmin= -10.0;
+ simasel->v2d.tot.ymin= -10.0;
+ simasel->v2d.tot.xmax= (float)sa->winx + 10.0f;
+ simasel->v2d.tot.ymax= (float)sa->winy + 10.0f;
+
+ simasel->v2d.cur.xmin= 0.0;
+ simasel->v2d.cur.ymin= 0.0;
+ simasel->v2d.cur.xmax= (float)sa->winx;
+ simasel->v2d.cur.ymax= (float)sa->winy;
+
+ simasel->v2d.min[0]= 1.0;
+ simasel->v2d.min[1]= 1.0;
+
+ simasel->v2d.max[0]= 32000.0f;
+ simasel->v2d.max[1]= 32000.0f;
+
+ simasel->v2d.minzoom= 0.5f;
+ simasel->v2d.maxzoom= 1.21f;
+
+ simasel->v2d.scroll= 0;
+ simasel->v2d.keepaspect= 1;
+ simasel->v2d.keepzoom= 1;
+ simasel->v2d.keeptot= 0;
+
+ simasel->prv_h = 96;
+ simasel->prv_w = 96;
+
+ simasel->flag = 7; /* ??? elubie */
+ strcpy (simasel->dir, U.textudir); /* TON */
+ strcpy (simasel->file, "");
+
+ simasel->returnfunc = 0;
+ simasel->title[0] = 0;
+ simasel->type = FILE_UNIX;
+ simasel->files = BIF_filelist_new();
+}
/* ******************** SPACE: OOPS ********************** */
@@ -5199,10 +5556,10 @@ void init_v2d_oops(ScrArea *sa, SpaceOops *soops)
/* outliner space is window size */
calc_scrollrcts(sa, v2d, sa->winx, sa->winy);
- v2d->tot.xmax= 0.0;
- v2d->tot.ymax= 0.0;
- v2d->tot.xmin= -(v2d->mask.xmax-v2d->mask.xmin);
- v2d->tot.ymin= -(v2d->mask.ymax-v2d->mask.ymin);
+ v2d->tot.xmax= (v2d->mask.xmax-v2d->mask.xmin);
+ v2d->tot.ymax= (v2d->mask.ymax-v2d->mask.ymin);
+ v2d->tot.xmin= 0.0;
+ v2d->tot.ymin= 0.0;
v2d->cur= v2d->tot;
@@ -5215,10 +5572,18 @@ void init_v2d_oops(ScrArea *sa, SpaceOops *soops)
v2d->minzoom= 1.0;
v2d->maxzoom= 1.0;
- v2d->scroll= L_SCROLL;
+ /* B_SCROLLO used here instead of B_SCROLL, to stop old blender's hanging on
+ * loading a file from a version with horizontal scrolling due to an old bug
+ */
+ v2d->scroll= L_SCROLL+B_SCROLLO;
v2d->keepaspect= 1;
v2d->keepzoom= 1;
- v2d->keeptot= 1;
+
+ /* NOTE: keeptot is 2, as keeptot!=0 makes sure it does get
+ * too freely scrolled on x-axis, but keeptot=1 will result
+ * in a snap-back when clicking on elements
+ */
+ v2d->keeptot= 2;
}
else {
v2d->tot.xmin= -28.0;
@@ -5453,11 +5818,7 @@ void newspace(ScrArea *sa, int type)
scrarea_queue_headredraw(sa);
addqueue(sa->win, CHANGED, 1);
- scrarea_queue_winredraw(sa);
-
- areawinset(sa->win);
-
- bwin_clear_viewmat(sa->win);
+ scrarea_queue_winredraw(sa);
for (sl= sa->spacedata.first; sl; sl= sl->next)
if(sl->spacetype==type)
@@ -5503,6 +5864,9 @@ void newspace(ScrArea *sa, int type)
sl= sa->spacedata.first;
sl->area= sa;
}
+
+ areawinset(sa->win);
+ bwin_clear_viewmat(sa->win);
}
}
@@ -5524,6 +5888,17 @@ void newspace(ScrArea *sa, int type)
/* exception: imasel space */
else if(sa->spacetype==SPACE_IMASEL) {
SpaceImaSel *simasel= sa->spacedata.first;
+ if(simasel->type==FILE_MAIN) {
+ if (simasel->files) {
+ BIF_filelist_free(simasel->files);
+ BIF_filelist_settype(simasel->files, FILE_MAIN);
+ }
+ } else {
+ if (simasel->files) {
+ simasel->type= FILE_UNIX;
+ BIF_filelist_settype(simasel->files, simasel->type);
+ }
+ }
simasel->returnfunc= NULL;
simasel->title[0]= 0;
}
@@ -5591,7 +5966,8 @@ void freespacelist(ScrArea *sa)
free_oopspace(so);
}
else if(sl->spacetype==SPACE_IMASEL) {
- free_imasel((SpaceImaSel *)sl);
+ SpaceImaSel *simasel= (SpaceImaSel*) sl;
+ free_imasel(simasel);
}
else if(sl->spacetype==SPACE_ACTION) {
free_actionspace((SpaceAction*)sl);
@@ -5658,11 +6034,13 @@ void duplicatespacelist(ScrArea *newarea, ListBase *lb1, ListBase *lb2)
so->treestore= NULL;
}
else if(sl->spacetype==SPACE_IMASEL) {
- check_imasel_copy((SpaceImaSel *) sl);
- }
- else if(sl->spacetype==SPACE_IMAGE) {
- SpaceImage *sima= (SpaceImage *)sl;
- sima->spare= NULL;
+ SpaceImaSel *simasel= (SpaceImaSel*) sl;
+ simasel->pupmenu= NULL;
+ simasel->menup= NULL;
+ simasel->files = BIF_filelist_new();
+ BIF_filelist_setdir(simasel->files, simasel->dir);
+ BIF_filelist_settype(simasel->files, simasel->type);
+ /* see SPACE_FILE - elubie */
}
else if(sl->spacetype==SPACE_NODE) {
SpaceNode *snode= (SpaceNode *)sl;
@@ -5766,6 +6144,12 @@ void allqueue(unsigned short event, short val)
}
}
break;
+ case REDRAWVIEW3D_IMAGE:
+ if(sa->spacetype==SPACE_VIEW3D || sa->spacetype==SPACE_IMAGE) {
+ scrarea_queue_winredraw(sa);
+ if(val) scrarea_queue_headredraw(sa);
+ }
+ break;
case REDRAWVIEWCAM:
if(sa->spacetype==SPACE_VIEW3D) {
v3d= sa->spacedata.first;
@@ -5947,6 +6331,11 @@ void allqueue(unsigned short event, short val)
scrarea_queue_winredraw(sa);
if(val) scrarea_queue_headredraw(sa);
}
+ case REDRAWMARKER: /* markers may not always match animation */
+ if ELEM6(sa->spacetype, SPACE_TIME, SPACE_IPO, SPACE_ACTION, SPACE_NLA, SPACE_SOUND, SPACE_SEQ) {
+ scrarea_queue_winredraw(sa);
+ if(val) scrarea_queue_headredraw(sa);
+ }
}
}
sa= sa->next;
@@ -6090,7 +6479,7 @@ SpaceType *spaceaction_get_type(void)
if (!st) {
st= spacetype_new("Action");
- spacetype_set_winfuncs(st, drawactionspace, changeactionspace, winqreadactionspace);
+ spacetype_set_winfuncs(st, NULL, drawactionspace, changeactionspace, winqreadactionspace);
}
return st;
@@ -6101,7 +6490,7 @@ SpaceType *spacebuts_get_type(void)
if (!st) {
st= spacetype_new("Buts");
- spacetype_set_winfuncs(st, drawbutspace, changebutspace, winqreadbutspace);
+ spacetype_set_winfuncs(st, NULL, drawbutspace, changebutspace, winqreadbutspace);
}
return st;
@@ -6112,7 +6501,7 @@ SpaceType *spacefile_get_type(void)
if (!st) {
st= spacetype_new("File");
- spacetype_set_winfuncs(st, drawfilespace, NULL, winqreadfilespace);
+ spacetype_set_winfuncs(st, NULL, drawfilespace, NULL, winqreadfilespace);
}
return st;
@@ -6123,7 +6512,7 @@ SpaceType *spaceimage_get_type(void)
if (!st) {
st= spacetype_new("Image");
- spacetype_set_winfuncs(st, drawimagespace, changeimagepace, winqreadimagespace);
+ spacetype_set_winfuncs(st, NULL, drawimagespace, changeimagepace, winqreadimagespace);
}
return st;
@@ -6134,7 +6523,7 @@ SpaceType *spaceimasel_get_type(void)
if (!st) {
st= spacetype_new("Imasel");
- spacetype_set_winfuncs(st, drawimaselspace, NULL, winqreadimaselspace);
+ spacetype_set_winfuncs(st, NULL, drawimaselspace, changeimaselspace, winqreadimaselspace);
}
return st;
@@ -6145,7 +6534,7 @@ SpaceType *spaceinfo_get_type(void)
if (!st) {
st= spacetype_new("Info");
- spacetype_set_winfuncs(st, drawinfospace, NULL, winqreadinfospace);
+ spacetype_set_winfuncs(st, NULL, drawinfospace, NULL, winqreadinfospace);
}
return st;
@@ -6156,7 +6545,7 @@ SpaceType *spaceipo_get_type(void)
if (!st) {
st= spacetype_new("Ipo");
- spacetype_set_winfuncs(st, drawipospace, changeview2dspace, winqreadipospace);
+ spacetype_set_winfuncs(st, NULL, drawipospace, changeview2dspace, winqreadipospace);
}
return st;
@@ -6167,7 +6556,7 @@ SpaceType *spacenla_get_type(void)
if (!st) {
st= spacetype_new("Nla");
- spacetype_set_winfuncs(st, drawnlaspace, changeview2dspace, winqreadnlaspace);
+ spacetype_set_winfuncs(st, NULL, drawnlaspace, changeview2dspace, winqreadnlaspace);
}
return st;
@@ -6178,7 +6567,7 @@ SpaceType *spaceoops_get_type(void)
if (!st) {
st= spacetype_new("Oops");
- spacetype_set_winfuncs(st, drawoopsspace, changeview2dspace, winqreadoopsspace);
+ spacetype_set_winfuncs(st, NULL, drawoopsspace, changeview2dspace, winqreadoopsspace);
}
return st;
@@ -6189,7 +6578,7 @@ SpaceType *spaceseq_get_type(void)
if (!st) {
st= spacetype_new("Sequence");
- spacetype_set_winfuncs(st, drawseqspace, changeview2dspace, winqreadseqspace);
+ spacetype_set_winfuncs(st, drawprefetchseqspace, drawseqspace, changeview2dspace, winqreadseqspace);
}
return st;
@@ -6200,7 +6589,7 @@ SpaceType *spacesound_get_type(void)
if (!st) {
st= spacetype_new("Sound");
- spacetype_set_winfuncs(st, drawsoundspace, changeview2dspace, winqreadsoundspace);
+ spacetype_set_winfuncs(st, NULL, drawsoundspace, changeview2dspace, winqreadsoundspace);
}
return st;
@@ -6211,18 +6600,31 @@ SpaceType *spacetext_get_type(void)
if (!st) {
st= spacetype_new("Text");
- spacetype_set_winfuncs(st, drawtextspace, NULL, winqreadtextspace);
+ spacetype_set_winfuncs(st, NULL, drawtextspace, NULL, winqreadtextspace);
}
return st;
}
+
+static void spacescript_change(ScrArea *sa, void *spacedata)
+{
+ SpaceScript *sc = (SpaceScript*) spacedata;
+
+ /*clear all temp button references*/
+ if (sc->but_refs) {
+ BPy_Set_DrawButtonsList(sc->but_refs);
+ BPy_Free_DrawButtonsList();
+ sc->but_refs = NULL;
+ }
+}
+
SpaceType *spacescript_get_type(void)
{
static SpaceType *st = NULL;
if (!st) {
st = spacetype_new("Script");
- spacetype_set_winfuncs(st, drawscriptspace, NULL, winqreadscriptspace);
+ spacetype_set_winfuncs(st, NULL, drawscriptspace, spacescript_change, winqreadscriptspace);
}
return st;
@@ -6233,7 +6635,7 @@ SpaceType *spaceview3d_get_type(void)
if (!st) {
st= spacetype_new("View3D");
- spacetype_set_winfuncs(st, drawview3dspace, changeview3dspace, winqreadview3dspace);
+ spacetype_set_winfuncs(st, NULL, drawview3dspace, changeview3dspace, winqreadview3dspace);
}
return st;
@@ -6244,7 +6646,7 @@ SpaceType *spacetime_get_type(void)
if (!st) {
st= spacetype_new("Time");
- spacetype_set_winfuncs(st, drawtimespace, NULL, winqreadtimespace);
+ spacetype_set_winfuncs(st, NULL, drawtimespace, NULL, winqreadtimespace);
}
return st;
@@ -6256,7 +6658,7 @@ SpaceType *spacenode_get_type(void)
if (!st) {
st= spacetype_new("Node");
- spacetype_set_winfuncs(st, drawnodespace, changeview2dspace, winqreadnodespace);
+ spacetype_set_winfuncs(st, NULL, drawnodespace, changeview2dspace, winqreadnodespace);
}
return st;
diff --git a/source/blender/src/spacetypes.c b/source/blender/src/spacetypes.c
index ea0d680e852..4a0375f2366 100644
--- a/source/blender/src/spacetypes.c
+++ b/source/blender/src/spacetypes.c
@@ -52,6 +52,7 @@
struct _SpaceType {
char name[32];
+ SpacePrefetchDrawFP winprefetchdraw;
SpaceDrawFP windraw;
SpaceChangeFP winchange;
SpaceHandleFP winhandle;
@@ -70,8 +71,9 @@ SpaceType *spacetype_new(char *name)
return st;
}
-void spacetype_set_winfuncs(SpaceType *st, SpaceDrawFP draw, SpaceChangeFP change, SpaceHandleFP handle)
+void spacetype_set_winfuncs(SpaceType *st, SpacePrefetchDrawFP prefetchdraw, SpaceDrawFP draw, SpaceChangeFP change, SpaceHandleFP handle)
{
+ st->winprefetchdraw = prefetchdraw;
st->windraw= draw;
st->winchange= change;
st->winhandle= handle;
@@ -105,6 +107,17 @@ static SpaceType *spacetype_from_area(ScrArea *area)
}
}
+void scrarea_do_winprefetchdraw(ScrArea *area)
+{
+ SpaceType *st= spacetype_from_area(area);
+
+ areawinset(area->win);
+
+ if(area->win && st->winprefetchdraw) {
+ st->winprefetchdraw(area, area->spacedata.first);
+ }
+}
+
void scrarea_do_windraw(ScrArea *area)
{
SpaceType *st= spacetype_from_area(area);
diff --git a/source/blender/src/splash.jpg.c b/source/blender/src/splash.jpg.c
index 8a40948de58..c1ca8b575e6 100644
--- a/source/blender/src/splash.jpg.c
+++ b/source/blender/src/splash.jpg.c
@@ -1,7227 +1,2483 @@
/* DataToC output of file <splash_jpg> */
-int datatoc_splash_jpg_size= 231089;
+int datatoc_splash_jpg_size= 79258;
char datatoc_splash_jpg[]= {
-137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, 0,
- 0, 1,245, 0, 0, 1, 15, 8, 2, 0, 0, 0,212, 35,202, 57, 0, 0, 0, 4,103, 65, 77, 65, 0, 0,214,216,212, 79, 88, 50,
- 0, 0, 0, 25,116, 69, 88,116, 83,111,102,116,119, 97,114,101, 0, 65,100,111, 98,101, 32, 73,109, 97,103,101, 82,101, 97,100,
-121,113,201,101, 60, 0, 3,134, 67, 73, 68, 65, 84,120,218, 98,252,255,255, 63,195, 40, 24, 5,163, 96, 20,140,130, 97, 7, 0,
- 2,136,105, 52, 8, 70,193, 40, 24, 5,163, 96, 88, 2,128, 0, 26, 45,223, 71,193, 40, 24, 5,163, 96,120, 2,128, 0, 26, 45,
-223, 71,193, 40, 24, 5,163, 96,120, 2,128, 0, 26, 45,223, 71,193, 40, 24, 5,163, 96,120, 2,128, 0, 26, 45,223, 71,193, 40,
- 24, 5,163, 96,120, 2,128, 0, 98, 25, 64,187,255,255,255,247,255,249,181,223,167,150,252,123,122,153,145, 95,146,197, 56,156,
- 89,213,158,145,133,109, 52, 86, 70,193, 40, 24, 5,163,128,114, 0, 16, 64,140, 3,184, 62,242,239,163,115,191,247,246,253,127,
-251,144,225,255, 95, 16,159, 83,128,197, 60,150,197, 36,130,145,145,113, 52, 98, 70,193, 40, 24, 5,163,128, 66, 0, 16, 64, 3,
- 54, 62,243,255,199,167,191, 23, 55,254,127,115, 15, 90,184, 3,193,247, 15,127, 14, 77,255,189,163,253,255,215,119,163, 17, 51,
- 10, 70,193, 40, 24, 5, 20, 2,128, 0, 26,184,241,119, 96,191,225,223, 31,116,193,127,127,254, 94,217,242,115,125,217,191,103,
- 87,254,255,255, 55, 26, 61,163, 96, 20,140,130, 81, 64, 54, 0, 8,160, 1, 43,223, 25, 57,249,153,117,189, 25,121,197, 81, 11,
-125, 48,241,252,218,207,245,229,127,175,238,252,255,251,199,104, 12,141,130, 81, 48, 10, 70, 1,121, 0, 32,128, 24, 7,246,124,
-130,191, 79, 47,253,222, 63,249,255,243,171,136,242, 29, 49,246,206,200,108, 16,200, 98, 18,206, 36, 40, 59, 26, 79,195, 3,220,
-126,241,225,196,173,231,215,159,190,125,245,233,251,215,159,191,217, 89,153, 5,184,216,133,121, 56,116,228, 68, 76,148,196,101,
-133,121, 7,208,109,191,255,252,125,251,229, 7, 11, 51,147, 8, 47,231,208,181, 98, 20,140, 2,100, 0, 16, 64,140, 3,126,254,
-204,191, 79, 47,128, 69,252,191, 91,251,177,187, 79, 68,137,213, 38,141, 89,213,110, 52,170,134, 46,248,245,231,239,162, 67,215,
-167,238,186,112,237, 9,190,153, 21, 85, 9,129, 36, 71,237, 56, 59, 45,250, 23,127,192, 92, 16, 54, 97,235,166,179,247,212, 36,
- 5, 46,119,199, 13, 81, 43, 70,193, 40, 64, 3, 0, 1,196, 56, 24,206, 23,251,255,235,251,159,227,243,254,156, 91,205,240,231,
- 23,134, 28, 3, 3, 59, 23,139,101, 34,139, 65, 0, 35, 27,247,104,132, 13, 57,112,230,238,203,196, 25, 59,111, 61,255, 64,164,
-122,126, 46,182,174, 40,219, 4, 7,109,122, 58,178,126,245,241,142,141,167,129, 12,218, 21,190,116,176, 98, 20, 12, 90,240,250,
-245,235,119,239,222,189,124,249,242,223,191,127,236,236,236,223,190,125,227,228,228,148,150,150,150,145,145,249,254,253,251,251,
-247,239,255,130,193,151, 47, 95, 62,127,254, 12,100,252, 7, 3, 89, 89, 89, 69, 69, 69,102,102,102,178,237, 5, 8, 32,198,193,
-115,126,228,159,139, 27,127, 31,157,205,128, 99,241, 12,179,150, 59,139, 85, 50,147,160,204,104, 90, 25, 66, 96,235,249,251, 17,
- 19,183, 1,219,239,164,106, 12,181, 80, 93,152,229,206,204, 68,143,249,161, 53, 39,110, 69, 79,217, 1, 97,211,168,240,165,131,
- 21,163, 96, 16,130,175, 95,191,222,185,115, 7, 88,130, 3,139,108,121,121,121, 97, 97, 97, 96,177, 14,151, 58,120,240, 32,176,
-184,231,231,231,231,225,225, 17, 19, 19,227,224,224, 96,101,101,101, 99, 99, 3,146,192, 50,253,231,207,159, 64,189,111,222,188,
- 1,150,242, 74, 74, 74,228, 57, 0, 32,128, 88, 6, 79, 88,176,232,251, 51,137,169,254, 62, 52,253,223,163,179,152,178,127,175,
-237,252,247,238, 17,171,109, 6,179,130,233,104,186, 25, 18,224,234,227,183,145,147,200, 41,220,129, 96,245,137,219,236,172,204,
-115,211,221,104,237,200,243,247, 95,165,204,218, 51,212,173, 24, 5,131, 16, 92,185,114, 5,216,102,151,146,146,210,212,212, 4,
-150,218,104,178, 47, 94,188, 96,100,100, 4, 22,250,186,186,186, 88,181, 3,155,249,218,218,218,192,138,225,226,197,139,135, 14,
- 29, 50, 54, 54,230,230, 38,121, 0, 3, 32,128,168, 86,190,255,255,253,243,255,187,135, 12,127,127, 33,207,144,146,216,151, 96,
-100, 96,231,102,214,245,249,255,233,197,255, 15, 79, 17,227, 51, 48,243,254,191,184,254,107,123, 11,171,121, 44,139, 81,200,104,
-234, 25,252, 32,123,222,190,159,191,209, 11,119, 54, 22,102, 15,125,121, 27, 13,105, 25, 33, 30, 32,247,221,151, 31,151, 30,189,
-217,114,238,222,179,247, 95,209, 84, 46, 57,124,195,215, 72, 57,192, 84,153,118, 46,124,249,241, 91, 72,255,150,239,191,254, 12,
-105, 43, 70,193, 32,108,182,159, 58,117, 74, 92, 92,220,206, 14,125,226,240,199,207,223, 79, 95,124, 60,118,252,236,221,219,151,
- 45, 45, 76,180,180, 80,198, 33,255,255,255,255,231,207,191, 95,191,255,124,255,249,231,215,175, 63, 76, 76, 76,162,194,220, 70,
- 70, 70,111,223,190, 59,118,236,152,185,185, 57, 31, 31, 31, 73, 46, 1, 8, 32, 42,148,239, 64, 55,253, 61,191,246,207,213,237,
- 12,223,222,255,255,247,151, 18,163, 24, 25,153, 24,152, 89,254,127,125,139, 36,132,170,226,203,235,223, 7,167,254,123,125,151,
-213, 54,157,145, 75, 96, 52, 37, 13, 90,240,244,221,151,211,247, 94,162, 9,166, 57,235,214, 6,153,139,241,115,161,137, 79,136,
-183,159,182,235, 82,197,242, 35,127,254,162,108,122, 40, 95,118,216,215, 88,145, 70,163, 52, 63,127,255, 9,237,223,242,228,221,
- 23,218, 5, 2, 29,172, 24, 5,131, 46,229, 63,125,122,243,230, 77, 96,171, 92, 84, 84, 20, 46,248,237,251,175,251,143,223, 92,
-190,246,248,233,171,207,119,111,223,120,255,246,185,128,160,216,153,155,191,110, 62, 62, 24,224,174,207,194,204, 4,148,125,245,
-246,243,151,175, 63,129, 21,192,207, 95,127,126,195, 26, 70,162,194,188,166,134,202,170,242,194,228, 13,209, 0, 4, 16, 21,202,
-247, 63,135,166,131,167, 70,127, 82,161,170, 32,202,190,159,127, 47,109,250,255,246, 30,171, 83, 33,147,132,198,104,122, 26,156,
- 64, 90,136,103, 71,101, 96,196,196,109,111, 62,127, 7,114,185,216, 89,150,229,122,121, 26, 40, 96, 85, 12, 44,193,115, 61, 12,
-184,217, 89, 50,231,238, 67, 22,127,240,250,211,137,219, 47,172,213,165,104,211,189,216,127,242,206, 11, 26,247, 96,104,110,197,
- 40, 24, 84,224,214,173, 91,175, 95,191,182,177,177,129, 15,200,188,124,253,233,244,197,251, 55,110,191,252,242,237,231,159,191,
-127,223,188,122,248,249,195, 27, 46, 46, 62, 81, 9,133, 31,223,190,234,168, 42,126,252,252,125,255,177,155,127,255, 98,223,206,
-249,250,237,231,237,123, 47,158, 23,229,231, 97,121,175,172, 76,114, 95, 22, 32,128, 40,109, 25,253,125,114,241,239,245,221, 84,
- 41,220, 73,170, 8,254, 61,189,252,107, 67, 5,176,211, 48,186,205,117,208, 2, 91, 13,233, 99,205,225,186,114, 34, 64,246,210,
- 28, 79, 92,133, 59, 28, 36, 58,104,107,203, 8,163, 9,110, 59,127,159, 22,110,155,176,237,220,226,195,215,105,234,125, 58, 88,
- 49, 10, 6, 15,120,249,242,229,131, 7, 15,238,222,189,107,105,105, 9, 47,220,143,157,185, 59,123,233,225, 35,167,110, 60,120,
-112,239,254,157,139, 47,158, 92,103,101,101, 7,182, 98,133,196,164,153, 88, 89, 76, 13, 20,245, 52,101, 14,158,184,133,171,112,
-135,141,106, 48,222,190,115,255,200,153, 7,199,207, 63,250, 69,226, 64, 31, 64, 0, 81,218,126,255,255,229,205,255,159,159, 7,
- 36, 64,255,127,126,245,123,103,199,255,215,119, 89, 44,226, 24, 57,248, 70, 83,216, 32, 4,242, 34,124, 7,235, 66, 87,159,184,
-229,101,168, 72, 80, 49, 48, 29,251, 25, 43, 93,125,242, 22,165, 65,244,252, 61,213, 93,181,235,210,195,202,229, 71,105,234,113,
- 58, 88, 49, 10, 6, 9,120,247,238,221,245,235,215,153,153,153, 63,126,252,168,168,168,248,236,217, 51, 25, 25,153,143,159,191,
-109,216,126,250,208,209, 83,191,127,124, 97, 97,102,248,253,253,147,168,184, 36, 39, 55, 31, 43, 43, 27, 47,191,238,163,123,215,
- 61,220, 28, 76,245, 21, 55,237,190,248,251, 55,129, 49,109, 38, 38,230, 47, 95, 62,240,241, 11,159, 58,119, 71, 94,138, 79, 74,
-156,132,113,105,128, 0,162,180,124,103, 18, 87,103, 18, 85, 6,182,166,169, 93,120, 19, 55, 77,251,247,247,159,211,203,254,189,
-185,207,234,152,203, 36,140,179,121,248,234,227,183,223,127,255,241,115,177,241,112,140,208,195,135,255,252,253,247,241,219,207,
-175, 63,127,139,240,114,114,177,179,210,211,106,110, 14, 86,226, 23,179, 43, 99,164,221,151, 31,191, 81,215, 61, 55,159,189,143,
-153,178,253, 31, 45,151, 5,211,193,138, 81, 48, 24,192,239,223,191, 47, 95,190,252,237,219, 55, 53, 53, 53, 49, 49,177, 91,183,
-110,241,241,241, 61,125,250,244,204,153,243,123, 15, 93,252,245,251, 47,243,223,159,146, 82, 50, 44,156,252, 12,140,172, 76,172,
- 28,127,254, 49,126,126,247,132,155,243,143,135,155,163,172, 56,235,218,109,199,254, 51,112,225,111,241, 48, 51,179,252,254,253,
-243,211,199,119,146,210, 74,172, 44, 76, 2,124, 92, 36,185, 16, 32,128, 40, 46,223, 5,101, 88,157,139,255,156, 95,251,255,221,
-131,255,127,255, 64, 29,197,132, 97, 44, 80,132,133,245,255,219,135,255, 63, 97, 25,142,100, 68, 30,121,103,231, 97,228,224,101,
-100,231, 97, 96,229,100, 96,100, 98,248,243,243,255,207,175,160, 46,194,183, 15,184,198,231,255,221, 63,254,235,243, 43, 54,207,
- 42, 38, 9, 77,172, 10, 38,110, 63,191,238,212,109,107,117, 41, 43, 53, 41, 61, 57, 17, 96, 33, 34,200,195, 65,188, 31,127,253,
-249,251,254,203, 15, 96, 13,193,196,200, 8,116, 1, 43,120,127, 57, 19,211, 16, 56,196, 24, 88,172, 63,126,251, 25,216, 4, 62,
-123,239,229,129,107, 79,222,126,254, 49, 61,197,217, 76, 69, 98,208, 58,152,139, 29, 61,229, 0, 3,158,138,230, 3, 43,185,144,
-254,205, 31,191,253,162,157, 23,232, 96,197, 40, 24, 12,224,203,151, 47, 39, 79,158, 4, 54,216,141,140,140, 32, 34,146,146,146,
-215,174, 93,251,247,239,255,193, 99, 55, 4,132, 37, 56,184,133,254,252,103,254,247,143,233,239,191,127, 12,255,255,255,249,249,
-151,145,145, 65, 65, 89, 67,140,255,191,134,138,216,249, 27,111,174, 93,185, 34, 35,175,194,195, 35,248,247,239, 31, 88,129,206,
- 4, 4,192, 18,244,223,191,191,127,254, 0,171,143, 95, 63,126,124,125,255,230,165,168,152, 12,176, 21, 47, 43, 37,200,197, 73,
- 90, 11, 21, 32,128,168, 48,191,202, 36,174,198,230, 81, 9, 26, 7,135, 28, 7,198,196,194,200,194,134,188,109, 10,114,158,251,
-223, 7,167,127, 31,156,194,240, 9,231,116, 19,163,144, 60,147,140, 1,179,172, 62,179,168, 50, 3,175, 56,176,160, 7,149,239,
-191,191, 51,124,125,203,240,254,225,191,103,215,126, 63, 60,251,239,213,109,144, 8,102,115,255,205,221, 95,219, 91,217,188, 27,
-152,196, 84, 48,101,127,254,254,115,227,217,123, 32,154,187,255, 42, 47, 7,107, 99,168,101,161,183, 49,241, 30,188,241,244, 93,
-251,134, 83, 79,222, 1,251, 89, 76, 64,127, 9,243,114, 46,200,116,231,229, 28, 2, 93, 1, 96,199, 37,124,194, 86,248, 58, 22,
- 73,129,193,190, 1,248,221, 23,244, 19,229, 4,185,217,169,101, 56, 48,155,197, 76,217,129,182,147, 86,128,139,253,195,183,159,
- 67,200,138, 81, 48, 24, 0,176,205,126,226,196, 9, 67, 67, 67, 97, 97,196,140,209,246,237, 59,254,254,249,237, 31, 16,124,233,
-238,175, 39, 47, 62,126,255,245,151,145,225, 31,176,253,201,203,195,161, 40, 43,162, 32, 39, 34, 45, 33, 40, 46,202,199,204,196,
-244,245,235,215,147,103,174, 42,171, 25,220,185,121, 78, 78, 65,131,143, 95, 8, 88,154,255, 1,226, 95,223,190,126,249,244,227,
-251,151,223,127,126,177,178,176,253,250,253,227,235,231, 79, 76,204,204,178, 10,234,192,146, 71, 69, 65,140, 84,119, 2, 4, 16,
-213,214,191,131,150, 54,178,113,161,149,233,208,194,247,207,175,191, 23,215,255, 62,185, 24,215,222,212,255, 60, 34, 44, 58, 62,
-204,154, 46, 76, 34, 24,107,128,128,173,120, 1, 25, 32, 98, 82,180,102, 55, 9,255,123,251,240,159,139, 27,255, 61,187,130,173,
-136,191,247,107, 87, 39,123, 64, 59, 35,143, 8,154, 20, 27, 11, 98,131,239,231, 31,191, 31,190, 33,109,194,224,237,151, 31,123,
-175, 60,126,253, 25, 90,175,240,176,179,254,254, 59, 52, 38,117,191,255,250,131, 60,156, 13,236,121, 12,242, 94,199,141,103,232,
- 41, 68, 77, 82,144, 90,134, 87, 44, 59,178,235,210, 67,100,145, 82, 95,227, 11, 15, 94,239,190,252,104, 8, 89, 65,219, 4,243,
-227,247,243, 23,136,202, 73, 82, 66,128,147,131,245,236,133,135,215,110, 62,215, 82,151, 52, 54,144, 39,201, 52, 34, 53,162, 89,
- 42, 40,192, 45, 40,192, 69,158,251,159,189,248,176,247,224,141,216,112, 11,252,118, 41, 41,136, 82, 56, 44, 3, 44,220, 13, 12,
- 12,224,133,251,159, 63,255, 14, 31, 57,246,246,245,219,240,168, 88, 22, 86, 22, 43, 99,165,149,155, 79,137, 9,243,169, 43, 75,
- 40,200,138,200, 74, 9,161,181,187,185,185,185, 35, 67, 92,183,239, 57,249,255,191,193,195,123, 87,223,190,121, 6,172, 24,152,
-153, 89,127,254,252, 6,108,183, 3,155,243,204, 44, 44,108,108, 28, 92, 92,124,220,220, 2,204,204, 44,247,110, 95, 52, 48,178,
- 84,144, 19, 33,213,169, 0, 1, 68,243,253,171,255, 94,221,249,115,122,233,223,107, 59,113, 86, 12,226,234,172,118, 89, 68,237,
- 74,101,231, 99,214,241,102,146, 53,250,125, 98,209,223, 75, 27,177, 20,241,207,175,254, 62, 54,151,205,173, 28, 93, 28,117, 44,
-136,155,196, 1,104, 14, 86,102, 62, 46, 54,120,249, 46,194,199,201, 52, 68, 46,152, 98,102, 98,228,227,100,251, 54,116, 54,215,
- 28,185,249, 12, 77,196, 66, 85,146, 42, 38, 47, 58,116,109,210,142, 11,200, 34, 62, 70,138, 77,161, 86,126,221, 27,169,229,120,
- 58, 88, 65,107, 0, 44,251,150,172, 60,129, 72,249, 28,172, 33,254,198, 63,126,254,190,255,224,181,146, 2,201,133, 11,145, 26,
- 33,150, 42,194,202, 92, 50, 42, 18,132,141, 63, 64, 54, 98,138, 31, 61,121,231,222,131, 55,192,114, 31, 98, 87, 93,185, 47, 37,
-161,116,234,212, 41,117,117,117, 17, 17,144,191,254,255,103,248,246,253,247,225, 67, 71,206,158, 57, 30, 19,155,244,239, 31,227,
-175,159,191,117, 52,164, 69,133,157, 69,132,121,129, 61,126, 92,134,240,242,241,185, 59,153, 92,190,241,228,247,239,111, 79, 31,
-221, 5, 13,224, 48,253,230,229, 19, 98,231,228, 98, 98, 98, 98,103,231,102, 99, 99,103, 98, 98, 6,181,148, 25, 25, 57,185,121,
-190,190,191,203,201, 78,242, 49,139, 0, 1, 68,219,242, 29,216,208,254,181,167,247,255,203,155,120,198,100,128,197, 49,218, 50,
-118, 96,171,243,210,195,215,207, 63,124,253,245,231, 47, 59, 11,179,172, 8,175,129,188, 24,188,229,201,200, 47,201,234,148,207,
-240,247,231,223,171, 59,176,116,144, 47,111,249,167,235,203, 36,169,133,199, 85,164, 30,185, 3, 84,142,172, 3,143,246,207,223,
-127,189,249,252,253,219,207,223,255,254,131,106, 5, 81, 62, 78, 1,110, 14,114,194,237,223,255,207, 63,126,177, 48, 49,113,115,
- 80, 52, 23,250,159,200, 45, 5,224,163,107,159,188,251,242, 21,232,242,127,255,129,221, 29, 97, 94, 14, 81, 62,146,219, 80,207,
-222,125, 1,246,117,116, 73,111,101, 64,192,163, 55,159, 47,160,102, 78, 96, 39,208, 85, 79,142,242,116,120,226,246,243, 44,212,
-149,245,218, 50,194, 11,179,220,169,216,157,161,131, 21,244, 4, 49,225, 22, 91,118, 94,250,240,225,219,243,151, 31, 49,155,228,
-160,166,189, 56,191,181,133,202,181, 27,207,128,133, 56,184,140,254, 8,108, 26, 27,235,203,105,105, 72, 1, 27,209,199, 78,222,
- 5,114,127, 32,205,157, 96,213, 8,100,195,205, 71,110,116, 67, 20, 3,187, 14, 70,250,114,192,230,252,181,155,207,172,205, 85,
- 32,226,192,166, 61, 68, 4,200, 5, 22,217,130,252, 92, 62, 30,122, 64,187,206, 93,124, 8,228,194, 77,216,115,224, 58,196,100,
- 96,237, 2,212, 11,148,122,255,225, 43,176,148,231, 96,103,117,118,208, 4,235,125,125,238,226, 35,160, 70, 72,117, 2, 52, 25,
-232, 30,136, 47,172,205,149,241, 52,240, 47, 93,186, 4, 44,217,165,165,165, 33, 69,193,151, 47,191, 47, 95,185,114,242,248,225,
-144,176, 72, 94, 62,129,159,191,126,114,115,113, 1, 75,100, 9, 49,126, 34,122, 75, 63,228,164,248,101,132,255,177,179,235,254,
-249,243, 7,216, 96, 7, 22,232,144,226,229,223,191,191, 28,236, 44,194,130, 60,194,130,220, 66,252,220, 34,194,250,191,127,126,
-186,122,245,170,182, 54,105,231,238, 1, 4, 16, 13,203,247, 63,151,183,254, 57, 62,239,255,199,231, 56, 11,119, 94, 49, 86,103,
-148, 61, 74,159,190,253,156,119,224,234,166, 51,119, 31,190,249,252,233,251,207,191,255,254, 3,203, 56, 1,110,118, 21, 9,129,
- 16,115,213, 68, 7,109,200,176, 15, 35, 43, 7,171,125,206,255,111, 31,255,221, 63,142, 81, 52,254,253,125,116, 46, 91,112, 15,
-158, 75, 92, 33,149, 42,176, 48, 2,118,165,175, 62,121, 11, 44,145,129, 65,202,197,206,162, 36,198,175, 47, 47,106,171, 33,205,
-193, 70, 90,176,124,248,250, 99,253,233,187, 7,175, 61,185,253, 2, 52, 17,251, 27,232,238,255, 32,151,243,112,176, 42,139, 11,
-216,106, 74, 7,154,170, 96,110,218,196, 90,241,108, 61,119,127,231,165, 7,183,159,127, 0,150,239,204, 76, 76, 34,188, 28, 64,
- 39,249,155, 40, 27,224, 30,122, 59,123,239,229,233,187, 47, 30,188,254, 4,244,200,159,191,255, 57,217, 88,228, 69,120,205, 84,
- 36,156,116,228,120, 9,173, 23, 2, 86,165,219,206,223, 63,118,235,217,249,251,175,128, 69, 51,176, 66, 5, 6, 5,176,213, 15,
-116,185,156, 8,159,165,170,100,128,169,178, 18, 17,235,177,142,221,124, 54,107,239,229,203,143,222,124,251,245,251,122, 95, 2,
-121, 9,102,217,209, 27,104, 34,214,106, 82, 82,130, 60, 20,166,195, 39,111, 63,135,246,111, 65, 30, 82, 19,225,229, 92, 95,226,
- 75,197,197, 84,116,176,130,222, 13,249,151, 31, 33,165, 51,114, 17, 12, 44, 52,143,157,188, 35, 0, 30, 60, 1, 54,147, 63,124,
-252,246, 29,181,189, 12,100,231, 74, 8, 0, 27,200, 64,189,146, 18, 2,223,127,252, 34, 70,163,161,190, 28,164,192,133,112,223,
-127,248,182,247,224,117,103,123, 77, 96,129, 11, 52,202,223,219,112,239,129,235,144,242, 29, 88,232, 67,122, 3, 64, 17, 43,115,
- 21, 96,117, 2,172,132, 36, 37,248,129,229, 50,208,145,192,114,249,217,139,143, 16, 99,127,128, 43, 27, 32, 3,168,128, 3,169,
-191, 14,172, 30,128,102,106,169, 75, 1, 73, 96, 65, 15,148, 2,218, 5, 49, 25, 88, 1,184,216,107, 2,107, 2,160,150,188,116,
-103,172,193,242,254,253,251,207,159, 63,235,233,233, 65,154,125,159,191,254,122,250,236,197,129,189, 59,157, 92,221,164,101,228,
-191,255,248,206,195,205,206,201, 73, 84,155,236,227,135, 15, 95,191, 0,225,215,216,168,224, 27,119, 95,237, 60,112, 25, 88, 46,
-137,137,240,136, 8,241,138, 8, 1, 73, 30, 78,118,214, 95,191,255,126,251,254,243,227,231, 31,183,238,189,224,229,102,229,100,
-101,124,243,230, 13,164,223, 64, 36, 0, 8, 32,154,148,239,255,127,125,255,125,100,230,223,203, 91, 25,126,125,197,109, 51, 27,
-179,113, 24,179,130, 25, 92,224,202,227, 55, 69,139, 14, 30,185,241,244, 59,234,130,208,215,159,191,223,126,241,225,232,205,103,
-192,226,120, 66,188,131, 4,120,146,144,145, 91,136,213, 38,229,215,135, 39,255,223, 63, 70, 47,225, 31,159,251,119,255, 36,179,
- 18,246, 49, 56, 96,177,255,231,239,191, 5, 7,174,118,109, 62,243,244,221,151, 79,223, 17,235, 28,128,125, 5, 65,110,118, 53,
- 73,193, 64, 51,149, 36, 7,109, 62, 46,162,102,246, 86, 28,187,209,187,229,220,173,231,239,145,141, 66, 52,235,238,188,216,120,
-230,238,140,221,151, 10,188, 12,227,237,161,117,239,223,127,255, 14, 92,125, 2, 44,193,153, 24, 25,255,128, 22,110,178,219,104,
- 72, 29,187,245,188,125,195,169,139, 15, 95,191,250,132, 50,129,188,233,204,189, 5, 7,175,165, 58,233, 20,251, 24,179,179,162,
-196,215,209,155, 79, 39,110, 63,127,234,206, 11, 96,201,254,245,231, 31,228,113,118, 96,249, 98,175, 41, 29, 99,171,201,137,187,
-174,218,126,254,126,231,166,211, 87, 30,191,125,251, 5,203, 61, 89,167,238,190,220,114,238,222,236,125,151, 83,157,116, 11,188,
-140, 32,237, 80, 96, 13,116,250,238,203,199,111, 63,179,194, 58,158,234, 82,130, 39,239,188,168, 94,113,148,194, 93,248,192,112,
-152,189, 23,125,149,109,138,147, 14,165, 3,202,191,254, 4,247,111, 65, 14, 82,160,203, 87, 21,120,203,139, 80,109,195, 4, 29,
-172,160, 63, 0, 22,160,240,130, 30, 46, 8,108, 35,131,199, 79, 64,219,137,129,229, 53,176, 13, 14, 25, 84,241,118,215, 3, 54,
-219,103, 47, 60, 4,108,239, 3, 91,214,192,178, 21,200, 13,241, 55, 6,182,151, 33,230,224,210, 8, 44, 97,129,245,199,231, 47,
- 63,207, 95,124,116,244,228, 93,184, 69, 70,250,242,144, 33,154,107, 55,158, 63, 66,221, 15, 1, 7, 46,224,102,248,217,139,143,
-128,213, 0,208, 82, 96,125, 0,180,148,131,131, 21,104, 62,200, 46, 13, 73, 96, 73, 13,113, 60, 80, 1,176, 86,184,247,128, 1,
-220,144,127, 13, 46,205,159, 1,171, 31, 72,157,241, 30,228,102, 80, 27, 20,104, 35,196, 4,136,107,177,130, 27, 55,110,192, 55,
-145,126,253,250,235,211,199, 47, 59,182,109,210,211, 55,208,213, 53,250,241,227, 59, 23, 39, 27, 47,113, 11,243,128,173,245,183,
-239,222, 1, 11, 35, 94, 94,208,157, 54, 26,202, 98, 98, 66, 22,144, 21,225, 31, 63,125,127,255,241,219, 13, 96, 83,241,227,183,
-111, 63,126,253,255, 7, 29, 48, 96,231,226,148, 21,101,253,245,232, 17, 63, 63, 63, 43, 43,177,221,122,128, 0,162,126,249,254,
-239,205,253,223,251, 39,253,123,120,154, 1,239,206, 82, 38, 25, 3, 22,195, 96, 56,247,230,179,119, 49,147,183, 95,124,244, 6,
-151,122, 96,233,185,242,248,173,183,159,127,172,200,247, 18, 6,223,255,192, 40,174,193,162,239,255,251,192, 20,140,192,251,249,
-231,242, 38, 92,229,251,191,255, 12, 11, 15, 93,251,244,237,215,151,159,232, 11,239,126,254,249,251,226,227, 55, 32, 2, 54,135,
-129,173,218,169, 73, 78,170,120, 39,247,126,255,249,219,191,237, 92,235,250, 83, 88, 75,118, 56, 0, 90,116,225,225,235,220,249,
-251,129,213, 73,137,175, 9, 27, 11, 51,176, 68,200,158,183, 15,178,178, 27, 24,121,226, 2, 92, 6,242, 98,231,238,191,188,131,
-218, 23,134, 86, 6,255,255, 3,219,230, 77,107, 79, 2, 93, 94, 21, 96, 6,239,239, 79,217,113,161,105,237, 9,248,172, 0,138,
-195,254,254,123,254,225,235,138,227,183,246, 92,121,244,227, 23,246,221, 19,115,247, 93,169, 88,126,248,205,103,124, 55, 32,254,
-248,253,247,198,179,247,213, 43,143,222,121,249, 1, 88,179, 2, 93, 14,236,153, 0,171,132,189,151, 31, 65, 59, 82,140, 12,192,
-246, 53,208, 95,148,175, 15, 89,114,248, 58, 90, 13, 33, 41,192, 29,108,174, 74,161,177,201, 51,119,163,141,249, 76, 73,116,164,
-238,129, 7,116,176,130,254,160,174,220,247,236,133,135, 91,119, 94, 2, 22,208,144, 1, 13, 72,163, 24, 94,226, 43, 34,141, 96,
- 0, 27,197,156, 28,172,130, 2,220,192,242, 29, 26,119, 18,252,104,195,226, 88, 53, 2, 11,119, 37, 5, 81, 72,153, 11, 31,159,
- 89,188,242, 4,188, 9,204, 65,220,248, 36,208,124,228, 41, 89, 96,253,177,102,227, 89, 96, 3, 31,216,162,223,123,240, 6, 86,
- 45,112,147,137,108,110,131,199, 76,254, 1, 11, 86, 9, 9, 9,112, 1,205,240,246,221,135, 61,123,118, 8,240,241, 90, 90,219,
-255,252,249,147,141,141,133,143,151,168,194, 29,152,229, 31, 63,122,196,198,198,246,242,229, 75, 99, 99,208, 66,190,175,223,126,
- 93,188,246,228,227,151,239, 95,191,252,252, 7,218,250,243, 31,122, 83,233,127,208, 18, 66,200, 72,196,207,111,223,159,191,103,
- 17,230,252,253,244,233, 83, 5, 5, 5, 34,221, 12, 16, 64,212, 44,223,129,238,254,119,231, 48,176,192,253,255,225, 9, 1,165,
-172, 92,204,234,206,140, 44,236,112,141, 85, 43,142,226, 41,220, 17,205,138, 43,143, 90,214,157,236,143,119, 96,128,172,179, 87,
-180, 96,188,186,253,255,235,187, 24,227,254, 87, 25, 62, 62,101,224,151,198, 62, 76,140,116, 84, 33,164,180,252,255, 31,101,156,
- 26,216,129,216,125,249, 17, 48,223,174,204,247,146,196, 54, 62, 0, 41,221, 86,157,184, 85,187,242,216, 47,164, 94,185, 16, 55,
-187,147,142,156,137,146, 56, 23, 59,203,163, 55,159,183,158,191,127,253, 41,116, 65,200,231, 31,191, 27,215,156, 80, 18,231,143,
-176,210, 96,100, 96,252,241,251, 15,188, 76,252,248,253,215,237,231, 31, 32, 14, 96, 4, 57, 9,220, 82, 6, 86,143,255, 81,234,
-158,153,123, 46,185,235,203,155, 42,131,146,215,156,125,151,203,151, 29,198,156, 56, 69,243, 14,174,226, 27,216,114, 71, 43,220,
-217,152,153, 28,180,101, 93,116,228, 4,184,217,159,189,255,178,245,220,253,115,247, 95,253, 5, 55, 28,128,165,252,172, 61,151,
-165, 5,121,170,131,204,129,110, 3, 86, 78, 31,145,234,179,247, 95,127,162,217, 78, 6,248,249,251, 79,219,134, 83,104,130,133,
-222, 70,200, 11,159,200, 0, 64, 51,215,158,188,141, 44,146,239,105, 72,221,155, 67,232, 96,197,128, 0, 96,153,251,252,197, 71,
-180, 18, 22,216,230,125,254,226, 3,100, 88, 28,216,236,189,255,240,205,119,140,221, 9,144,193, 16, 96,221, 0, 44,187,225, 3,
-226,196,104, 68,212, 22,252, 92, 64,141,192,198, 53,100,173,139,152, 8, 47,120,168,250, 55,188,158,192, 4, 2, 2, 92,192,202,
- 3, 88, 85, 64, 20, 0, 91,190, 64, 27,129, 13,124,100, 91,144,245, 2, 29, 9, 52, 25, 40, 11,116, 18,100, 16,255, 61, 17,219,
-232, 62,125,250,196,194,194,242,241,227,199,187,119,239,253,249,195,248,242,229,171,223, 63,190,187,123,249,253,251,247, 31,216,
-155, 21,224,231,196, 51, 38,140, 50, 32,241,234, 21, 43, 27,219,139, 23, 47,180,180,180, 32,165,223,177, 51,119, 95,188,254,136,
- 40,211,225, 37, 59,180, 56, 99,100, 96, 2,231,196,175,223, 94,254, 96,254,247,247, 33,241,229, 59, 64, 0, 81,241,124,224, 31,
-127,206, 44,255,115, 98, 33,150, 59,152, 48,203, 71, 30, 17, 38,121, 19, 56, 23,216, 88, 62,116,253, 9, 81,182, 0,171,247,195,
-215,211, 93,244, 52,164,133, 64,230, 8, 43, 48, 73,106,255,197, 40,223, 25,126,124,250,115,239, 4,114,255, 0, 19,136,243,115,
-249, 25, 43,153,169, 72,112,178,177, 0, 91,160,219, 47, 60, 56,126,235,249, 79,164,195,202, 15,223,120, 10,172, 75,166, 36, 57,
- 97, 78,145,177, 48, 49, 61,123,247, 5, 40,139, 92,184, 27, 41,136, 77, 77,118, 50, 87,145,128, 71,115,145,183, 81,209,162,131,
-192,106, 0, 82, 82, 3, 21,119,110, 60, 99,167, 33, 35,204,203,129, 54,177,254, 31, 92,194, 26, 42,138, 5,152, 40,235,202,137,
- 0,139,209, 43,143,223,206, 63,120, 21, 94, 61,128, 6,121,223,125, 57,123,239, 37,176,124, 7,246,117,234, 86, 29, 71, 46,220,
-129,246,201, 8,243,120,232, 43, 0,101, 57, 88,153,129, 42,119, 92,120,112,242,206,139,159, 24,103,175, 51, 51, 49,253,249,251,
-175,121,221, 73,228,194, 93,144,155,189, 37,220, 58,195, 69, 15,238,211, 50, 63,211,234, 21, 71, 39,239, 56,255, 7,236,116, 96,
- 65,191,232,240, 53,111, 35, 69, 3, 5, 49,102,108,165, 56,176, 98,115,214,149, 51, 83,150, 96,101, 38,231, 68,163, 73, 59, 46,
-160, 45, 90,149, 22,226, 73,119,214,165, 36, 65,110, 60,115, 23, 88,161, 34,139,184,235,201,119, 68,218, 80,177, 16,164,131, 21,
- 3, 5,224,171,104, 32,227,224, 16,182,183,187, 46,176, 93, 12,108, 29, 3, 17,164,232, 7, 22,163,104, 26, 57,193,130,104,235,
-112,136,209,136,152,116,177, 80, 89,188,242,248,164,153,123, 33,131,248,118,214,106, 23,175, 60,158,189,240, 16,158,242, 29, 88,
- 25, 0,187, 26,160, 1, 25,240, 58, 75, 69,121,145,163, 39,238,204, 94,120,248,253,135,175,240,142, 2,176, 35, 2,236, 25, 64,
-134,239,141, 13,228,175,221,124, 62,121,230, 94, 72,237,229,227,174,183,101,231, 37, 98,218,175,247,238,221,123,245,234,213,131,
- 7,143,213,212,181,128,173, 89,126, 65,161, 63,192,150, 60,195,127,126,126,208,162, 23,162, 70,243,190,127,251,254,253,251,159,
-191,127,197,196,196,184,184, 64,125,142,155,119, 95,190,120,245, 17,102, 5, 18,249, 15,218,114, 7, 54,231, 65,108, 38, 6, 38,
-102,230,219,183,175,112,106,171, 17, 31,143, 0, 1, 68,157,242,253,223,135,103,127, 14, 77,251,123,115, 31,145,234, 25,249, 37,
-153,248, 17,235,222,246, 95,125,140,127,160, 0,101,184,227,199,239,221,151, 30, 67,203,119, 70, 38, 38, 81, 21, 44, 3, 16,127,
-126,254,187,125,136,193, 32, 16, 20, 42,216,128,177,162,216,220, 12, 55,125,121, 68, 87, 17, 88,162,245,111, 61, 91,191,250,248,
-103,164, 52,180,227,226,195, 91,207,223, 99, 14, 97, 3,203,184,125, 87, 31,223,120,246, 30,121,200,181, 45,210,218, 66, 85, 18,
-114,177, 22, 52, 85, 9,242,212,135, 88,158,127,240,250, 38,236, 16,149, 11, 15, 95, 3,139, 93, 95, 99, 37,180, 50, 18, 88, 40,
-215, 5, 91,148,251,153,194, 75, 88, 79, 67, 69, 23, 93, 57,183,182,181,200, 33,115,255,213, 39, 32, 57,107,239,229, 87, 72,205,
- 13,102, 70, 70, 96,201,219, 21,109,171, 46, 37, 4, 23, 44,241, 49,158,184,253,124,205,202, 99,104, 69, 60,208, 47,251, 65, 46,
-127,135, 92, 55, 4,154,170,100,185,233, 35,187, 28,168,172, 39,198, 14, 88,233,158,189,255, 10, 34,114,235,249,135,157, 23, 31,
-130,203,119,244, 32, 85, 20,229,155,153,234,226,170, 71,230,154, 54, 96, 71, 7,179,241,222, 24, 98, 73,234, 44, 55, 50,184,242,
-248, 77,226,244, 93,200, 34,154,210, 66, 75,114, 60,168,184,154,133, 14, 86,208, 31, 0,203,211, 24,164,117, 44,144,245,239,192,
- 22, 55,176,124,132, 44, 75,207, 75,119,126,246,226, 3,164,156, 5,182,151, 65,108,115,101, 72, 97,237,108,175, 1, 97,107,105,
- 72, 65,134, 92,128, 90,128, 37, 44, 65,141,104,150, 66, 20, 3, 77, 0, 22,190, 82, 96, 5,185,233,206,192,130, 27,104,206,247,
- 31,191, 56, 57,216,128,226,112,245, 64, 75,129, 34, 64, 45,146, 18,252,144,250, 0,168, 18,168, 43, 53,222, 14, 98, 53, 68, 11,
- 80, 1,208, 16,160, 8, 80, 1,208, 47,144,225, 32,136,123, 32, 75,101, 32,230, 96, 58, 6, 25, 60,126,252, 88, 89, 89,153,141,
-149, 77, 82, 74, 81, 88, 88,244,233,147,199,119,238,222,252,250,245,147,156,156, 20, 43, 43, 81, 29,205,127,255,254, 61,125,242,
-148,135,151,247,253,139, 23, 6, 6, 6, 64,145, 15,159,190,159,189,244, 8, 94,184,131, 10,116, 70,196,192,246,127,216, 2, 56,
-160, 56,176, 13,255,237,219,231,239, 95, 63,127,254,193,114,255,209, 27, 69,226, 86,169, 1, 4, 16,197,231,139, 1,171,150,135,
-103,126, 31,152,252,255,245, 29,226,117, 49,242,162, 44, 63, 34,105,195, 17,176,249,121,255, 21, 98,156,154,145, 91, 8,180, 7,
- 10, 99, 83,235,255,207,175, 24,190,189, 99,224,198, 18, 10,192,230,234,228, 68, 71,228,194, 29, 54, 32, 96,124,237,201,187,121,
- 7,174,192, 7, 70, 30,189,249,116,232,250, 83, 7, 45, 25,228,142, 23,176,121,254,235,207,223, 3,215, 30,163,153,121,236,214,
- 51, 96, 63,224, 7, 98,114,248, 63,176,208,255,252,253, 55,218,114,251,125, 87, 31,185,235,203,163,117,229, 66,204, 85,129,141,
-125,180,162, 1, 88,135,249, 25, 43,207, 59,112, 21, 46, 2,180,247,231,239, 63, 7,175, 61,249,139,180, 70,211, 72, 81,108, 70,
-138, 51,218, 56, 18, 43, 11,115,137,175, 9,176,114,154,189,239, 10,114,181,196,206,202,124,244,230,179, 79, 72,187,231,129, 61,
- 9,160,163,151, 28,190,254, 9, 50, 94, 4,115, 24, 11, 19, 35, 7,234,116,238,217,251, 47,129,129,207,129,154,148,185,217, 89,
-218, 35,109,200, 46,220,129, 32,111,193,254,111, 63, 81, 6,154,128,125,160, 24, 91,242, 79,126,126,243,249,123,112,223,150,175,
- 72,243, 43,192,216, 89, 91,228, 67,228,132,249, 32,177, 98, 64, 0,176, 52,199, 92, 26, 8, 94,146,136, 24,221,150, 66,106,122,
-227, 98,195, 13, 33, 70, 35, 86, 75,145, 69,224, 10, 4, 97,167,181,192,101,225,230,192, 25, 80,149, 48, 55,195,181,192, 69, 48,
-245, 34,179,177, 58,134, 1,124,221,210,183,111,223, 44, 44, 44,126,254,252,243,227,231,255,159, 63,127,200,200,202,188,122,245,
-252,199,247, 47,236,108,196,142, 34, 62,126,244,144,143,159, 31,216, 9, 48, 49, 1,141, 94,252,253,251,239,232,169, 59,192, 66,
- 31,114, 68, 11, 52,231,193, 74,121,232, 25, 92,255,161,195,173, 44, 44, 44, 79,110,223,145,148, 81, 0,138, 93,189,249,140,200,
-242, 29, 32,128, 40, 42,223,255,255,250,246,247,242, 86,208,165,169, 63, 73, 92, 59,193,202, 65, 81, 50,100, 68,154,185,101,102,
- 99, 96,194,230,139, 63, 63, 17,229,251,127,148,114,211, 82, 85,210, 82, 13,251,244, 87,172,157,230,170, 19,183,224,243,165,127,
-254,253,191,251,242,131,147,182, 44,242,160, 4,144, 5,204,216,119, 81,231, 66, 95,125,250,222,180,246, 36, 49,110,191,253,252,
-195,247, 95,127,144,139,119, 54,102, 38, 55, 61,121,180,181, 49,144, 62,129, 42,106, 55, 22, 88, 58,223,124,246,254, 13,210,156,
- 42,176,241, 14,172, 45, 36,113, 44, 34, 76,113,210,157,127,224,234, 31, 88,125, 5,169, 84,238,189,250,136, 92, 61,252,254,251,
- 15,232,101, 32, 34,232,242,231,239,191, 2,251, 13,104, 35, 48,234,146, 66,161, 22,106,100,199,228,178, 35, 55,182, 95,120,128,
- 58,133,192, 8,172,125,137, 28,202,196, 4,191,255,252,141,152,184,237,193,235, 79,200,181,218,138,124, 47,101,113,170,221, 6,
- 67, 7, 43, 70,193, 96, 3,183,111,223,134, 20,202, 76,204,204,255,254,125,227,229, 97,103,102,225,146,144, 16, 99, 97,102,252,
-251,247, 47, 49, 87, 96,191,125,243,134,149, 21, 52,236,174,164,164, 4, 44,172,129, 34, 23,175, 61,121,251,225, 43,168, 64,103,
-250, 15, 29,165,133, 23, 49, 72, 36, 35,248, 8,201,143, 31,222,252,251,255, 79, 72, 72,252,207,159, 63,178,210,196, 30, 33, 5,
- 16, 64,228,159,255,254,239,227,243,223,251, 39,255,222,215,143,179,112,103, 98,102,224, 22,198, 46,133,170, 69, 70,136,135,248,
-220, 12,204,248, 74, 98, 72, 25,233,247, 55,134, 63, 63,176,117, 44,254, 97, 61,169, 6, 8,180,100,132,113, 25,174, 36,198,143,
- 54, 26,243,225, 43,232,216, 69,228, 65, 9, 96,209, 3, 44, 19, 63,145,123,128, 20,176,120, 5, 26,200,136,116, 60,166, 16, 15,
- 7,214,213,241, 64,159,162,141, 81, 0,203,214,143,223, 64,219, 2,224, 34, 60, 28,172,120,118,240, 75, 11,241, 8, 33, 45,216,
- 2, 26, 8,236,111,125,251, 73,230,137, 93, 47, 62,124,253,240,237, 39,242,204, 1, 35,184,247, 64,246,136, 4,176,182, 40, 94,
-114, 8,189, 57,239, 97,128,217,181, 34, 30, 20, 44, 58,120,248,198, 83,100,145,137,241, 14, 14, 90,178, 84,204,234,116,176, 98,
- 4,130,239, 63,126,223, 67, 93,134, 4,228,126, 39,229,116, 57, 82,213, 19, 15, 94,191,126,205,203,203, 11,185, 26,251,215, 47,
-208,254,150,151,175, 63,223,121,240,246,237,199,191,191,126,255,127,245,242, 37,158,225, 13, 96,113, 12,108,248, 3, 11,247,159,
- 63, 65,247,123, 0, 13, 17, 19, 3,237,101,121,246,242, 35,176, 25, 14, 26,120, 1, 15,200,128,215, 65, 34, 70,222, 65, 67, 52,
-255, 97, 3, 53,160,230, 60,227,147, 71,247,164,164, 21,255,253,255,207,201,201,170, 73,244, 17,129, 0, 1, 68,102,251,253,239,
-227,243,127, 14,207,250,247,244, 34,238, 22, 58, 39,171,109,250,191, 15, 79,254,158, 91,131,197,219, 31, 95, 0,203, 95, 70,216,
-224,184,135,129,194,188, 3, 87,241,175, 50,132, 3, 94, 78, 54,119,125, 5,100,163, 24,254,226,136, 84,108,131,239,140,224, 22,
- 43,206, 74, 11,105, 12, 26,222, 52, 3, 34, 12, 65, 38, 14,212, 78, 25, 47, 7, 43,176, 48,101, 97, 98, 66, 59, 21, 22,178,140,
- 16,174, 29, 72, 41,136,242, 49,194, 23, 64, 33, 53,171,113, 12,216,161,152,246, 31, 67, 49,208,186,191,255,254,227,209,142,233,
- 89,180, 69, 41, 44, 76,140,178,194,192,196,203,134,118, 55, 30,196, 34,184,203,255,252,251,167, 33, 37, 4,244, 32,178,117,192,
-182,182, 16, 15,249, 93,177,130,133, 7,208, 14, 20,147, 23,225,173, 15,177, 32,219,192,233,187, 47,206,217,135,114, 54, 81,166,
-171, 94, 42,101,243,180,244,183, 98,100, 2,204,147, 3,128,220,152,112, 11,226,207,138, 33, 85, 61,241,224,250,245,235,144, 61,
- 77, 95,191,253,190,113, 27,116, 47, 54,100,117,176,144,144,240,135,119, 79, 69,127,254, 2, 54,225,153,152,152, 32, 51, 88,127,
-254,252,254,254,253,199,183,175, 95,129,121, 19,168,236,227,199,143,159, 62,127,102,101,101,213,213,213,189,116,233,146,184,184,
- 56, 3,104, 73,254,159,227,103,238, 66,178,244,127,164,178,234, 63,116,168, 6,156,251,192,133, 4, 80,132,133,149,245,249,179,
- 7,156, 92,220,160, 99,200,126,255,210, 82,149,102, 35,122,106, 10, 32,128,200, 41,223,255, 92, 88,255,231,228,226,255,184, 79,
-130,100,224, 17, 97,181,207, 97,209,114,251,125, 96, 42,246,106,237,211,139,255,111, 31, 50,138, 64,239,124,112,208,146,113,209,
-149, 91,119,138,168, 17,252,120, 59, 45, 85, 73, 1,216, 0,209,119,208,137,146,216,203,118, 22, 6, 54,110,148,254, 14,172,136,
- 60,123, 15,103,125,123,245,241, 91,180,177, 96, 81, 62, 46, 96,139, 30,185,236, 3, 70, 27, 23, 27, 11,218,190, 74, 77,105,161,
-214, 8,107, 49, 62, 46,180,242, 29, 88,152, 2,181, 3, 27,236, 16, 19, 32, 27,101,121, 57, 89,145, 11,110,140, 58, 5, 39,248,
-245,231,175,148, 32, 55,242, 8, 9,208,181,151, 31,227, 92, 87,122,231,229,135, 15, 72,235, 23,129,150, 2, 75,100, 73, 65,148,
- 83, 36,121, 56,216, 10,189,141, 28,181,101,209,202,119, 96, 29, 6,172,180,190,192, 92, 14, 44,214,249, 56,217,128,117,216,103,
-212,106,152,220,113, 20,134, 13,167,239,174,197,136,241, 73,137,142,100, 31, 79,127,224,218,227,226,197, 40,189, 1, 39,109,217,
-158, 24, 59, 42,230,115, 58, 88, 49,228,192,251, 15,223,190,255,248, 37, 37, 33,240, 30,188,248, 93, 80,128,235, 25,104, 41, 36,
- 27,166, 32, 3,120, 1, 12,176,252, 5,182,178,223,127,248, 10,145,133, 40, 67,110,131, 63,127,249,145,131,157, 21,249, 8, 26,
-200,225, 1,130,252, 92,144,153, 91, 14, 14,214,251, 15, 65,105,222, 72, 95, 30,188,192,241, 53,242, 38, 44,200, 89, 5, 12,224,
- 85, 52, 64,147,129,178,144, 73, 87,200, 52, 47, 92, 22,190,244, 30, 46, 11,116, 18,196, 28,160, 20,100, 98, 25,145,139,217,216,
- 4, 4, 4,128,185,244,233,243,247,144,229,203,224, 34,229, 63,176,204,189,127,255, 43, 11, 43,203,149, 43,151, 57, 57,185, 88,
-152, 65,167, 11,252,252,245,235, 59, 24, 48,130, 79,251, 5,234,149,150,150, 6,182,226, 79,157, 58,101, 99, 99,179,119,239, 94,
- 17, 17,209, 75, 55,223,124,253,246, 11, 50,206,206,248, 31,126, 66, 58, 80, 3,116,169, 12,164,224, 7, 47,145,100,250,254,253,
-203,171, 23,143,117,245,172,254,252,254,205,205,205,174,166, 44, 78,124,236, 0, 4, 16,105,229,251,255, 31,159,126, 31,157,251,
-247,242,102,232, 81,192, 88, 11, 86, 49, 53, 86,231, 66,102, 25,125, 6,148, 33, 37, 84,115,190,188,254,123,231, 48, 19,172,124,
-103,103,101,233,140,178,189,255,234,227,121,108,103, 3, 33, 3, 23, 29,185,234, 64,115, 68,129,245,250,206,223, 71,103,113,248,
-140,141,129, 71, 20,169, 84, 71,128,243, 15, 94,173, 63,117, 39,208, 12,203, 73,194,179,246, 94,254,246, 11,209, 27, 0,150,227,
-192,130,251,207, 95,148,165,232,192, 40,228, 96, 99, 49, 87,145, 88,131,180,240,249,222,171,143,146, 2,220,218,178,232,147, 30,
-223,126,254, 62,116,253,169, 7,234,213,116, 95,127,252, 38,239,234,135,239,191,254,200,137,240,201, 8,243,222,135, 13,254,254,
-253,255,127,219,249,251,233,206,122,106, 82,130,152,141,247,254,173,231,144, 45,250, 11,110,206, 27, 43,138, 3,253, 5, 95, 94,
- 9,116, 33,176, 14,208,145,197, 50, 93, 3, 52, 25,237,222, 37,204, 14, 1,121,151, 88,188,255,250, 35,111,193,126, 52,193, 80,
- 11, 85, 15,125, 5,178, 71,189, 34, 39,109, 71,238, 91,240,115,177, 21,251, 24, 95,124, 72, 32, 69,161,245, 26,127,252,250,139,
- 92,253,107,203, 8,195,135,200,232, 96,197, 80, 4,192, 34,114,239,193,235,101,249, 30,144,141,254, 33,254,198,160,173,255,246,
-154, 88, 5,183,238,188,148, 18,111, 11, 44,157,143,158,184, 3,145, 5, 22,229, 82, 30,136,242,253,232,201,187,144,181,140,112,
-145,197,224,211, 14,192, 75, 30, 47, 1, 75,103,160, 9,192,242,221,218, 66, 5,104,194,251,247,223,180, 52, 36,129, 38, 3, 11,
-122,104,216,254,248, 61,121,230, 94, 96,193, 13, 58,120,224,192,225,220,116,103,160, 44,100, 57, 38,228,156, 25,200,170, 77,160,
-105, 64, 6,208, 85,107, 54,158,133,200,138,137,240,158, 60,115, 15, 98, 14,208,118,180,126, 0,100, 79,211,215,239,127,190, 2,
- 91, 75,140,136,115,157,254,255,251, 39, 36, 36,118,252,196, 73, 85, 21,229,247,239,223, 51, 51, 51,115,112,112, 8,130, 1,232,
- 80, 48, 78, 78, 30, 30, 30,248,208, 60,176,136, 7,182,223,109,109,109, 23, 46, 89,205, 45,164,193, 4, 27, 21,128, 44,155,129,
- 48, 33,147,171,240,245, 51,204, 76, 64,200,252,224,218,117,121, 69, 13, 70,102,166,127,127,254,152,234, 43,176,146,178, 41, 4,
- 32,128, 72, 72, 88,255,222, 63,249,189,187,235,223,195, 51,248,134,243, 85,108, 89, 29,243,152, 4,160, 27,139, 24, 65, 12, 70,
- 44,165,252,191,191,127,111,237,103,214,112, 97, 18,128,206,115,170, 72, 8, 44,201,241, 44, 94,124,112, 7,238,205,193, 49, 54,
- 26,109, 17, 54, 34,124,156,208,146,229,207,207,191, 55,118, 51,124,255,128,189,154, 17, 85,101, 96,231,197, 42,245,245,231,159,
-194, 69, 7,128,109,225,112, 43,117,228,177,224,134, 53,199,183,158,191,143, 92,148, 43,139,243,123, 26, 40,220,126,241, 1,115,
- 88, 13, 40,222,184,230, 4,124, 19,236,155,207, 63,170, 86, 28,157,149,234, 34,142,116,198, 58,176, 56, 6, 54,247, 86,159,184,
-101,165, 38, 85, 25, 96, 10,159,212,253,207, 64,230,205, 62,191,255,252, 99, 97,102, 10, 50, 83, 57,126,235, 25,124,214,244,230,
-179,247,209, 83,182,215, 6,153,251,153, 32,174,223,125,242,246,115,235,250, 83,152,151,151, 2,139,117, 95, 99, 37, 96, 19, 30,
- 62, 63,252,235,239,191,217,251, 46, 91,168, 74,162,173,129,169, 89,121,116,250,174,139, 6, 10, 98, 69,222, 70,222, 70, 74,112,
-151, 51, 82, 99,249, 95,201,146, 67,104, 23, 51, 9,112,177,247,198,218,147,103, 26,176, 75, 17,212,187, 25,109,168,231,227,183,
- 95,222,157, 27, 72, 53,234,209,219,207, 86,117, 43,225,220,115,237,209,218,178,194,244,177, 98,136, 2, 96, 57, 8, 44,115,129,
- 45,113, 96, 65, 15, 44, 94,223,219,107, 66, 26,233, 88, 5, 65, 27,145, 94,124, 4, 34, 32,247,218,141,103, 64, 5, 70,250, 40,
-231,199, 65,118,177,130,100,193,103, 6, 0, 27,212,247, 31,188,246,118,215, 3, 54,189, 63,124,132, 30, 36, 0, 44,151, 33,133,
-239,189, 7,111,206, 93,124, 4, 44,148,125, 60, 64,131, 39,192,134, 57,100,155, 18,196,204,123, 15, 95, 67,142, 33,243, 1, 31,
-159,192, 0, 62, 61, 24,216, 84, 7, 22,250, 64,211,224, 86, 64,100,129, 5, 61,178, 57,232,197, 26,120,250,237,221,187,111,200,
-203, 90, 64,243,112,191,127, 63,184,119,251, 63,195,111, 77, 77, 45,102,102, 38,200,172, 41, 46,160,170,170,122,243,230,173, 15,
- 31, 62,137, 74,105,158, 63,127, 86, 93,211,232,239,223,223,144, 70, 58, 3,172,136,135,140,210, 48, 1,219,253,204,204,127,255,
-252,121,247,238,229,235, 87,207,248, 4,132, 4, 4, 69,129,141,119, 57, 25, 33, 89, 41,210,142,203, 6, 8, 32, 98,203,247,255,
- 95,223,253,222,213,245,239, 17,190,194,157,217, 56,140,213, 50,137,145, 19,113,236, 6,163,160, 12,104,138,245, 43,150, 1,132,
-255,175,110,255, 57,187,138,205,185, 0, 46,162, 37, 35, 12, 44,226,215,157,186,179,226,216,205, 83,119, 94,192,139, 78,126, 78,
- 54, 27, 13,233,120,123, 45, 55, 61,121,126,164,245,103,255,238,157,248,123,105, 19,118,167,176,113, 51,171, 59,226,113,234,195,
- 55,159,211,103,239,153,190,251,162,145,162, 56, 47, 39,235,195,215,159, 79,220,126,126,231,197, 7,228,133, 37, 28,172,204, 9,
-246,160, 83,104,126, 98, 92,144,248,231,239, 63, 53, 73,193,108,119,253,206, 77,136, 0,217,114,238,158,111,215, 70,127, 19,101,
- 19,101,113,118, 22,230,155,207,223, 3,253,178,255,234, 99, 96,131,119,243,185,123, 39,239, 60, 15, 50, 83,173, 15,177,144,160,
-236,146,141, 31,191,254,164, 58,233, 46, 57,124, 29,190, 50, 29,232,226, 51,247, 94, 38, 76,223,169, 39, 39, 2,244, 14, 15,176,
-247,250,234,227,241,219,207, 31,188,250,244, 23,163,117,253,251,207, 95, 94, 78,182, 76, 87,253,170,229, 71,224,155,179, 30,191,
-253,146, 56,125, 39,176,182,115,210,150,229,102,103, 5, 22, 64,107, 79,222,222,117,233,225,143,223,127,247, 93,125,124,225,193,
- 43, 96, 43,190, 54,200, 66, 77,138, 58, 71,177, 3, 77, 94,114, 24,125,215,120,123,164,181, 56, 63,153,167,126,159,186,251, 2,
-121, 35, 24, 45, 0, 29,172, 24,162, 0, 88, 86, 2, 75,237,179, 23, 30, 66,202, 92, 96,179, 90, 0,188, 18, 17,171,160,146,188,
- 40,164,208,119,118,208,132,108, 71, 82,242,199,114,211,142,160, 32,116, 67, 41,100,173, 58,164, 32,134,112,209,142,255,253, 14,
- 90,243,142,126, 82, 35,228, 40, 27, 65, 1,110,200,102, 90,248, 22, 92,200,234,123,232,186, 73, 65, 46,200,246, 90,136, 44, 86,
-115,144, 6, 33,153, 62,127,249,246,249,203,119,232,200, 12, 56, 87,177,178,177, 93,189,122,225,221,187, 55, 38,102,150,255, 25,
-152, 89,176, 53,171,255,254,253, 7, 62, 35,236,215, 23, 96,163,242, 31,211, 63, 70,206, 87,175, 94,200,136,177, 63, 21,147,122,
-112,239,186,162,178,214,239, 95,191, 96,171, 33,129, 13,116, 38, 38, 22,230, 63,191,129,138, 63, 0,139,245,223,191,127,177,179,
-113, 72, 74, 41,240,241, 11,253,253,243,155,131,157,197,132,244, 85,200, 0, 1, 68,108,249, 14, 44,139,255, 61, 57,143, 83,154,
-149,139,213, 54,157, 89,223, 15,126,228, 0,180,222, 19, 85,101, 18,146,253,135,173,124, 7,118, 66,254, 94, 92,255, 71, 80,134,
-217, 48, 24, 62,103, 40,204,203,153,236,168, 19,105,173,254,242,195, 55, 96, 41,243,245,199,111, 62, 46, 54,121, 17, 62, 17, 94,
- 78,180,147,114,255, 61,187,242,123,255, 68, 92,123,101,209,246,199, 98, 5, 31,191,255, 58,120,253,233,145, 27,160, 41,236,191,
- 24,119,101, 50, 51, 50,198,217,105,229,120, 24, 96,239,202,252,255, 15,236, 37, 21,122, 25,221,122,254,126,253,233,187, 48, 65,
-134,211,247, 94, 94,120,248,154,141,133,137,145,129,241,207,191,127, 72,107,225, 25, 94,125,250, 6, 44,118,255,253,163,244, 78,
- 78,160,213,192,160,152,154,228, 20,210,191, 5,249,192,150,247, 95,127,194,189,243,135,144, 45,121, 30, 6, 55,158,162,172,244,
-127,250,254,235,196,109,231,103,238,185, 4,116,249,223,127,255,144,143,120,123,247,245,231,149,199,111,169,181,109, 7,216, 16,
-206,154,187, 23, 77,208, 70, 93, 42,113,232,239,233, 31,177, 0, 88,106, 31, 59,121, 7,216,202, 6, 13,110, 28,188, 14, 57, 71,
- 12,171, 32,176, 12, 5,182,235,129, 45,101, 32,119,246,194, 67,144, 66, 31, 50, 94,143, 58,230, 3, 58, 51,224, 62,120,112,159,
- 1,180, 61, 21,122, 96, 47,100,251, 43, 74, 77,128,116,152, 1, 3,236,116, 4, 96, 3,159,147,131, 21,249,218, 16,200, 64,191,
- 32,184,105,117, 15,116, 36,189, 40,220, 10, 8,128, 28, 84, 0, 55, 7, 13,124,249,242,249, 31, 3,235,127,164,227,182,129,197,
-249,235, 87, 47, 31, 61,184, 39, 45, 45, 39, 42, 42,249,234,245, 71, 25, 41, 65,208,145,200, 63,255,124, 7,150,230,223,127,126,
-251,246,243,251, 79, 96,233,253,247, 23,176, 96,135,101, 51, 46, 30, 30, 41, 17, 62, 14,142, 95, 6, 58, 10, 7,142,188,123,250,
-228,158,140,172,202, 63,240,229,124,191,126,255,252,252,237,203,219,215, 47,190,126,254, 8,108,176,243, 11, 8, 3, 17, 27, 43,
-251, 95, 32, 0,109,145,101, 48,212,145,227, 33,253, 46, 51,128, 0, 34,186,124,191,186,157,225, 31,246,147,170, 24,249,164, 88,
- 93, 10,153,148,172, 48,215,129, 48,114, 9, 48,201, 25,255,123,140, 90, 49,192,239,206,254,251,251,247,193,169, 12,255,255, 50,
-235, 7, 50,178,176,193,186, 66,140, 60, 28,108, 60, 18,108,202, 56,118, 48, 3,235,133,127, 79, 46,254,222,217,129,123,130, 23,
-124, 46, 13, 59, 15,114,163, 21, 89, 90, 71, 70,248,195,183,159,144,194,241,239,127,244,193, 18, 96, 57,198,203,193,150,238,162,
-215, 24,106, 9, 89,106, 2, 44,239,144,231, 30,225,205,121,113, 1,238,153,169, 46,162,124, 92, 75,143, 92,135, 31,223, 8,108,
-173, 99, 46, 89,225,102,103,137,178,214,104, 10,179,130, 55, 81,127,129,156, 4, 13, 8, 96,252,227,186,139, 25,109,109,204, 95,
-152, 66,115, 85,201, 85, 5,222,133,139, 14,158,191,255, 10,249,140, 4,100,239, 0,251, 16,106,146, 2,247, 95,125,130,247,132,
-126,255,133,166, 52, 96,229, 52, 37,201, 81, 92,128,107,234,206,139,159,190,255,132, 8, 2,245,126,253,137,126,160, 13, 23, 27,
-139,183,145, 98,123,132,141, 18,184, 37, 5, 52,254,247, 31, 20,235, 72,189,202,170,106,197, 81, 96,119, 1,165,109,192,204, 52,
- 53,217,137,145,145,113,180,160, 28,162, 0,212,242,189,200, 0, 25, 3,217, 10, 62,176, 23,151, 32,164,152, 86, 82, 16,129, 28,
-227, 14,105,158,239, 61,120, 3, 40, 2, 97, 79,154,185, 23,210,208,246,113,215, 59,119, 17,116,218, 59,176,165, 15,185,253, 3,
-235,189, 75, 70, 6,114, 64,217,217, 11, 15, 67,206, 34, 6,111,100, 21,152, 60,115, 47,144,188, 15,238, 37, 64,148, 93,187,249,
- 12,114,191, 7,176,106, 89,179,241, 44,100, 54,213,217, 94, 3, 62, 20, 99,164, 47, 7, 20,135,155,131, 62,239,245,253, 59, 35,
-243, 15, 70, 38, 78,104,251, 29, 60,242,126,235,230, 85, 96, 19, 94, 85, 77, 19,200,225,227,229, 56,115,225,193,187, 15,223, 64,
- 43,102,208, 50, 4,210, 34,190,111, 95,190,188,231, 16,148, 16, 98, 22,228,253,101,110,106,120,228,200,241, 39,255,111,179,176,
-176,126,250,248,238,251,247,111, 2, 66, 34,252, 2, 66,114, 10,170,172,172,236, 64,243,129,224,207, 31,104,206, 85,148, 19, 86,
- 85, 18, 35, 35,106, 0, 2,136,232,241,247,255,216, 11,119, 38, 25, 3, 86,231, 34,172,183,158, 66, 43, 58, 29,175,191,247,142,
-255,127,126, 21,169,248, 69,174, 55,126,254,222, 55,241,223,235,123, 44,230, 49,140,124,146,140,204, 4,220,243,255,219,251,191,
-215,118,254, 62, 62,159,225, 7,238, 45,175,156,124, 44,122, 40,247,179,200,139,242,105, 74, 11,129,111,167, 3, 21, 35,153,174,
-250,198, 74, 98,205,107, 79,158,188,243,226,219,207,223,127,192,133, 38, 51, 19, 35,176, 52, 23,229,227,116,213,149,143,176, 82,
-183, 66, 58,255,143,151,147, 77, 87, 78,132,139,157,133,131,149,229,255,255,255,210, 66, 60,240,229,240,192,194, 29, 88,196,135,
- 89,168,205,217,119,249,196,157, 23,192,198, 41,176,224,134,148,193, 64,187,128, 6, 2,245, 90,168, 72,164, 58,235, 58,233,200,
- 33, 85, 33,140, 6,242, 98, 66,220, 28,144,173,176, 82,130, 60, 2, 56,246, 61, 74, 10,114, 43,137,241,243,129, 47,247,250,244,
-253,151,130, 40, 63,188, 29,109,169, 38,181,163, 50,112,246,222, 43,235, 78,221,190,255,250,211,143, 95,127, 32, 30, 1, 26,206,
-206,202, 44, 41,192, 29, 99,171, 25,104,170, 82,176,232,192,227, 55,159, 89,152,153,126,254,249,171, 32,202,199, 3,235, 6,177,
-179,178,180,132, 91,251,155, 40, 47, 62,116,253,232,205,103, 79,222,125, 6,214, 91,112, 19,128, 93, 16,160,203,141,149,196,163,
-173, 53, 2,205, 84,224,133, 47,144, 86,151, 18,188,255,250, 35, 23, 27, 43,196, 35,242, 34,188,196,167,182,195, 55,158,206,194,
- 56, 4,184,220,207, 68, 3,233,100, 5, 50,128,158,156, 8,176,182, 35, 79,111,235,250, 83,200, 19,164, 82,130,220, 19,192,167,
-215, 65,128, 28,204,119,116,176, 98,232, 2, 96, 33, 14, 57, 66,146, 1,124, 49, 8,228,212, 1,172,130, 64, 17, 56,219,219, 93,
- 23,210,108,135,156, 13, 0, 57,117, 0, 72, 66,142, 25,224, 4,115,129, 12, 96,153, 14,108,236, 3,139, 99,200,113, 5,247,244,
-229,160,230,171, 75, 65, 86,200, 64,142, 34,128, 44,131, 1,146,240,131, 7,124,192,163,246,144,197, 48,192, 2, 29,168, 24, 52,
-218,238,161, 7,172, 18,208,172,128, 84, 60, 16,115, 24,192,235, 44,209,206,173,228,231,231,127,242,244,185,140,188, 22,184,204,
-253,195,198,202,122,247,222,173, 55,111, 94, 25, 24,154,113,113,241, 8, 11,115,188,255,248,237,237,251,111,144, 12,242, 31,185,
-100,255,135, 94,220,191,123,251,129,141, 85, 72, 82, 88,228,247,239,151,134,198,198,151, 47, 93,230,225,227,151,148, 86,224,224,
-224, 6,246, 9,160,197,250,239,223,140, 76,160,182, 20,176,193, 14,244,160,146,156,136, 24,185,137, 4, 32,128, 24,137, 92,154,
-247,251,208,244, 63,167,150,161,148,242,204,108,204,234,142,172,142,121,140, 92, 4,134,101,255,222, 58,240,107,123, 43,190,179,
-224, 65,157, 0, 9,102, 93, 31,102,101, 27,208,237,169, 28,188,140,204,136,240, 5,173, 24,250,249,245,255,183, 15,255,158, 94,
-248,123,121,235,191,167, 4, 78, 2, 98, 49,137,100,117,204, 37,198, 83,183,159,191, 7,102,188,247, 95,127, 2,219,181,156,108,
- 44,114, 34,124,134, 10,162,228,221,184,196, 0,158,161,189,250,228,237,179,247, 95, 32,203, 99, 56, 88,153,101,132,120,245,228,
- 69,200,184, 8,137,180, 17,155,127,255, 47, 61,122,125,239,229,199,183, 95,126, 0, 61, 2,172,132,128,245,153,177,162, 24,241,
-123,229,129,117,204,229, 71,111,238,189,250,248, 1, 28, 20, 64, 19,128,101,144,150,140,176,140, 48, 53,139,158,239,191,254,152,
- 84, 46, 69, 59, 3, 89, 93, 82,240, 76,123, 20,133,231, 68, 82, 2,124, 58, 55, 32, 95,142, 10,236,241, 92,238,142, 27,114, 86,
-140, 2, 10,193,189, 7,175,183,236,188, 4,172, 6,128,149, 4,176,230,128, 76,180, 34, 90,161,127,254,236,218,189,247,253,199,
-223,252, 2,130, 98,162, 18,224,251, 87, 15,137,136,136, 26, 25, 91,178,179, 51,137, 10,243,156, 60,115, 31,190,140, 29,186,250,
-133, 9, 86,178, 51,129, 23,178, 35,181,235, 57,185,185,255,252,120,163, 32, 35, 32, 36, 44,118,252,194,139, 15, 31, 62,129,198,
- 36,192,157,104,200,252, 42, 23, 7,155,180,164,160,180, 4,191,184, 40, 31, 27, 43, 69,107,171, 0, 2,136,232,117,242, 22,241,
-160,211, 8,174,108,131,108, 10,101,228,151,100,214, 15,100, 49,141, 96,100, 34,108, 2,179,154, 3,211,245,221,255,110,237,199,
-215, 48,255,244,226,207,209, 57,127,206,174,100,146,210,101, 18, 81, 2,154,207,192,193, 7,108, 54, 2, 45,253,255,249,213,255,
-119, 15,255, 61,191,246,255,195, 83,194,245, 21,159, 4,139,105, 20,145,158, 82,149, 20, 84,165,222,245,205, 98,252, 92, 98,252,
- 92,244, 79,154,192, 22,189,129,130,152,129,130, 24,217, 38, 0,139, 87, 96, 83, 29,136,104,234,206,198, 53, 39, 48, 15,184,159,
-154,236, 52,128,133,251, 40, 24, 5,208, 41, 4, 5, 81, 31,240, 84, 1,252, 80, 51,148,210,143,133,197,201,201,233,212,217, 91,
- 47,158, 61,121,248,237,238,143,239,223, 89, 89, 89, 85, 84, 53,129,109, 79, 49, 17,158,235,183, 94,252, 71,140, 30,195,155, 93,
- 8,198,127,164,118, 61, 51, 51,243,199, 15,111,175, 95,185, 32, 37,225, 38, 36,200,103,172,253,127,207,225,247,160, 19,134,153,
- 25,129,253,116,160,213, 98,194,188, 64,196, 70,165, 37,179, 0, 1, 68,172, 41,140,108, 92,172, 78,249, 76, 18,154,160,251,146,
- 88, 57,153,100, 13,153,165, 73,216,179,199,106, 17,247,243,217,101,134, 47,132, 78,120,255,241,249,223,189, 99, 64, 68,190,127,
- 44, 19, 24,121,132, 71,211,235, 96, 3,167,239,190,152,184, 29,125,126, 62,209, 65,219, 86, 67,154, 12,211, 64,151, 17,126,250,
-174, 32, 6,154,120, 31, 13,219, 81, 64,173, 34, 30, 95, 27,136,149, 69, 84, 68, 88, 72, 72,228,223,191,127, 76, 76, 76,151, 47,
-159,251,246,237,171,178,162,244,167,207, 63, 62,124,252, 14, 29,153,193, 53, 20,194, 4, 45,220,153, 88,152,126,255,254,117,245,
-242, 57,117,117,221, 23,111,126,241, 62,123, 47, 43, 37,232,104,173,254,243,215, 31, 97, 65,110, 62, 30, 14,170,207, 66, 1, 4,
- 16, 9,181, 4,176,169,206,162,227, 69,102, 27, 83, 92,157,213, 38,245,247,174,110,134,127,127, 16,243,171,212, 6,204,250, 1,
-204,228,186,112, 20,208, 14,252,250,243, 55,117,214, 30,180, 57,100, 49, 62,206,246, 72,107, 82,141,186,252,232, 77,218,236, 61,
-231,192,107, 67,129,121, 33,216, 76,117,106,146,147, 0, 55,251,104, 32,143, 2, 90,247,146, 37,197,249, 94,188,252,244, 29, 52,
- 97,199,168,166,166,125,234,228, 33, 93, 45,197,187, 15,160,215, 7,226, 27,231,254, 7, 45,220,255,254,249,115,233,252, 73, 37,
-101, 13,126, 1,161,159, 63,127,222,189,255, 90, 82,140, 79, 90,130,134,199,210, 1, 4, 16, 19,221, 2,136, 69,215,151,197, 54,
- 29,122, 30, 26,190,145, 26,114, 11,119, 13, 87, 86,187, 76, 98,198,139, 70, 1, 73,224,236,189,151,171,137, 56, 93, 18, 15,232,
-216,120, 26,115,241,120,111,172,189, 32,137, 83, 29,183,158,191,119,106, 94,115, 14,190,240,255, 63,195,154,147,183, 61, 59,214,
-255,252,253,103, 52,154, 70, 1,173,129, 0, 63,151,186,170,184,138,162,168,132, 40,159,136, 48,159,179,163,237,186,245, 91,129,
-133, 61, 19, 51, 35, 90,129,138, 56,248, 10,118,187, 30,164,112,191,124,254, 20,176,112, 23, 17, 17,255,253,251, 55, 51, 51,147,
-158,182, 52, 11,141, 7, 39, 1, 2,136,174,165, 33,139, 73, 4, 35, 51,235,239,131,211, 24,254,254,162,174,201,204,186, 62,172,
-246,217,140, 28,188,163,169,144,234,224,222,171,143,247,176, 93, 12, 75,124,139, 27,121, 23, 24, 4, 40,139,243,243,115,177,237,
-188,248,128,120,115,180,101,132,107, 87, 30,195, 60,132, 14, 88,220,207, 59,112, 53,211, 85,127, 52,166, 70, 1,173, 1, 35, 35,
- 35, 47, 15, 7,228, 18,237,127,255,248,175,220, 80,188,120,246,132,158,129, 57, 19,211,127,240, 49,238,208,166, 58,228, 12, 25,
-232, 56, 5, 35,104,177,252,239,159,191, 46, 95, 60, 41, 43,175, 34, 12, 46,220,129,194,122, 90,210, 66,148,109,117, 36, 6, 0,
- 4, 16, 93,203,119, 70, 38,102,102,163, 16, 70, 30,209,223, 7,167,254,255,248, 12,135, 34, 82,125,192,198, 98,153,196, 98, 24,
-204,200,206, 61,154,254,112,129, 61,151, 31,206,218,123,121, 85,129, 15,144, 29, 54, 97, 75,154,179,174,139,174,124,231,198,211,
-123, 46, 63, 82, 18,231, 47,247, 51,121,255,245,103,197,178, 35,198, 74, 98,103,239,189,154,149,230, 2,108,113, 3,203,116, 23,
- 93,185,114,127,211, 89,123, 46, 27,195,214,222,194,181,116, 68,218, 8,242,112, 0,141, 2,182,193,129, 42, 67, 45, 84,211, 92,
-244, 48,237,253,251,239, 95,218,236, 61,127, 48,214,200,223,125,249,209,175,123, 19, 73, 94,152,158,236,132,188, 10, 5,213,119,
-143,104, 90,190, 3,125,193,204,196, 52,154,138, 70, 1,218,136,141,173,149,193,199, 79, 95, 46,156, 59,174,165,107,196,198,206,
-193, 0, 30,130, 4,239, 69,133, 78,169,254, 3,109, 79,250,251,237,195,135,187,119,174, 43, 40,169,137,138, 73,254,254, 5,106,
-160,232,104, 72, 74,136,241,209,193,145, 0, 1, 68,239, 84,203, 8, 44,227,213, 29,217,130,123,152,181, 61, 8,151,229,132,198,
-106,152,100, 12,216,130,251, 88, 76,163, 70, 11,119,252, 0, 88,154,131, 10,238, 61,151,128, 8,200,128, 20,238,171, 79,220, 42,
-247, 7,237,242, 77,159,189,247,253,215, 31,123,174, 60, 2, 22,214,105, 46,186,171,142,223, 58,123,239, 37, 80, 10, 88,190, 3,
-101,129,165, 57, 80, 11,164,112, 7, 86, 18, 16, 45, 97, 19,182, 2,201,213, 39,110, 11,114,179, 3, 11,247,244, 57,123,177,158,
-202,217,183,245, 28,124, 56,133,114,240, 3,199, 56,204,247, 95,180, 29,159,249,255,127, 52, 5,141, 2, 44, 64, 84,152,199,214,
-218, 68, 74, 90,254,198,213, 11, 15,238,221,184,127,255,230,195, 7,183, 30, 60,184,253,224, 30, 16,221,120,112,239,230,221,219,
-215,110, 94,191,244,232,225, 29,117, 13, 93, 17, 81, 9, 72,225,174,161, 42, 33, 43, 45, 68, 31, 23, 2, 4,208,192,140, 86, 51,
- 9, 43,176,186,150, 51,107,186,255, 57,179, 2,116,166, 13,142,157,177,136,211,124, 48, 58, 2,140, 34, 74, 44, 70, 33,204,234,
- 78,200,251, 84, 71, 1, 30, 0,108,179, 3,139, 99, 8, 3,210,230, 5,182,217, 59, 55,158, 1,150,236,103,239,191,130,148,218,
-192,214, 58,144,124,255,229, 7, 80, 22,216,156, 7,114,141,149,196,149,196,248, 33,227, 51, 64, 65, 72,195, 31,200,118,109, 93,
- 7,171, 57,228,128, 34,192,242, 29,104, 14,154,141,183,158,191,111, 94,119,146,138, 94,208,147, 19, 61,255,224, 21, 86,113, 26,
-183, 74, 70,147,207, 40,192, 14,148,229,133,191,126, 85, 7,149,221,127,126, 49,194, 38, 23,225,133, 22, 19, 35, 51, 4,128, 78,
- 25, 0, 15,203,104,168,138, 43,202,209,111,129, 31, 64, 0, 13,216,108, 36, 35, 43, 59,179,162, 57,147,156,209,191,231, 87,255,
-222,216,251,239,193,169,255, 95, 94, 51,252,253, 3, 46,235,255,163,229, 44,240,210,127,102, 6,102, 22, 6, 14, 62,102, 25,125,
-208,130,122, 5, 51, 6, 54,238,209, 77,237, 36,149,239,157,155, 78, 3, 25,144,125,152,192, 86,185, 32, 15,251,204, 20, 23, 96,
-185, 12,108,182,159,189,143,210,250, 6,170, 1,182,238,129,141,244,255, 43, 16,119,239,129, 26,242, 96,101,192,230, 60,176,208,
- 39,104, 99,198,156,189,152, 71,179, 81, 2, 74,125,141,163, 38,111, 71, 19,228,102,103,205,116,211,163,109, 38, 25, 29,156, 25,
- 5, 56, 7, 36, 24,117, 52, 36,255,255,255,247,226,245, 39, 80, 49,245, 15,210,254, 68,148,242,255, 24,254,253,251, 13, 29,159,
-212,214,144,148,163, 87,203, 29, 2, 0, 2,104,128, 87,155, 48, 50,179, 50,203, 24, 48, 73,106,255,255,250,246,223,179,171,255,
- 95,222,248,247,238, 17,248,106,236, 15,255,255,129, 58,221,255,129,225,199,206,195,196, 35,202, 40, 40,195, 36,166,198, 36,173,
- 11, 58,115,152,153,149,145,113, 52,203,145, 6, 4,121, 56,202,253, 76, 33, 12, 32,217, 17,105, 3, 44,190,133, 82,166, 11,114,
-179,163,237,188,223,115,229, 17,100,248,165,220, 15,229,140, 54,136, 22,198,136,126, 96,225, 78,204,102,253,227,183,158, 83,215,
- 11,193,230,170,141, 47, 62, 52,172, 57, 14, 31, 48,225,227,100, 91,145,239, 37, 47,194, 55, 26,191,163, 96,160, 0, 51, 51,147,
-190,182, 12,203,205,231,192, 34, 30,229, 52, 2, 88, 17,197,193,206, 2,222,146, 42, 32, 46, 74,239,132, 10, 16, 64,196,158, 79,
- 48, 10, 70,193, 32, 1,215,158,188, 93,127,250,238,155,207,223,149,197,249, 35,172,212, 71,183, 56,141,130, 81,128, 11, 0, 4,
-208,104,249, 62, 10, 70,193, 40, 24, 5,195, 19, 0, 4,208,232, 40,199, 40, 24, 5,163, 96, 20, 12, 79, 0, 16, 64,163,229,251,
- 40, 24, 5,163, 96, 20, 12, 79, 0, 16, 64,163,229,251, 40, 24, 5,163, 96, 20, 12, 79, 0, 16, 64,163,229,251, 40, 24, 5,163,
- 96, 20, 12, 79, 0, 16, 64,163,229,251, 40, 24, 5,163, 96, 20, 12, 79, 0, 16, 64,163,229,251, 40, 24, 5,163, 96, 20, 12, 79,
- 0, 16, 64,163,229,251, 40, 24, 5,163, 96, 20, 12, 79, 0, 16, 64,163,229,251, 40, 24, 5,163, 96, 20, 12, 79, 0, 16, 64,163,
-229,251, 40, 24, 5,163, 96, 20, 12, 79, 0, 16, 64,163,229,251, 40, 24, 5,163, 96, 20, 12, 79, 0, 16, 64,163,229,251, 40, 24,
- 5,163, 96, 20, 12, 79, 0, 16,128,163,171,201,149,219,134,193, 36, 69, 89,178, 61,126,239, 37, 47, 64,186, 73,175,146, 3,244,
-208, 69,239, 80,116,155, 85, 80,164, 73,147,204,140,109,253, 81, 98, 57, 93,216,128, 1,139,164,190,191,165,196,127,254,243,151,
- 64, 11, 74,212, 99,227,211, 1,148, 6,200,131,129, 27, 52,132,192, 0, 67,123,179,183,116,240, 48,187, 40,189, 21,208, 9, 60,
- 65,174,206,197,142, 86, 65,216,121,193,174,234,200,211,128, 12,153,193,129, 98, 7,117, 86,169, 79, 8,141, 0, 27,248,168,123,
- 7,206,224, 20,152,201,138, 42, 89,203, 64,214,179,217, 2,194,216,160, 78,224, 58,103,149, 9, 24,240, 6, 16,109,140, 60,192,
- 90, 5,149, 4,113, 18, 24,158, 50, 1, 23,116, 46,123, 88, 19,237,208, 9,212,187, 86, 15,151, 24, 38,148,102,229, 28,234,209,
- 70,172,128,158,110,227,212,210, 82, 41,123, 39, 27,207,211,143,187,168, 94, 83, 27,131, 70,106,123,189, 31, 78, 32,105, 59,210,
-217,155,115,237,222, 83, 47, 19,164,218,153,114, 77,137,159, 22, 91,169, 89,210,235,196,122,185,196, 82, 15,207, 47,235,115,113,
-249,201, 5, 89,218,246,204,175,231,186,196, 39,125,118, 11, 35,172,192,184, 70,223, 46,129,197,198, 70, 15, 58, 48, 18, 73, 22,
- 4,207, 54,112,239,162, 52, 78, 26, 65,244, 27,118, 95, 42, 18,220,187,150, 34, 25,200,160, 85,251,220,255, 85, 30,116, 44, 71,
-238,152,175,103,184, 8,202,156, 56,209, 23, 54,212,207,173, 94,246, 80, 84,178,193, 81, 71,237, 14,178,198, 44, 57,107,139, 15,
-136,215, 25,142,251,212,103,117, 83,238,217, 96, 14, 19,143,136,174, 18,205,136, 21,189, 31, 99,141,253,160,190, 62,104,156,150,
- 57, 14,175,163, 51,142,254,102,123, 86,157,242, 86,102,152, 87, 31, 26, 44,182,214,173,203, 42, 1,209,107,152,141, 0, 10, 27,
-170,225, 29,252,228,177, 15, 50,116,213,144,220,216,147, 96, 53,250, 89, 23, 28,195,197, 88,181, 24, 34, 75, 97,161,101,244,148,
-168,247,110,194, 32, 19,210,232,153, 53, 14,109,181,117,225, 85,181,240, 16, 1, 88,252,153,155,118,114, 93,157,246, 31, 11,189,
-212, 14,131,243,168,217, 32, 12,208,234,164, 98,143,142, 57, 52,219,108, 26,178,182, 15, 31, 63,252,190,206,127,228,243,155, 86,
- 55,206,234,140, 70, 99, 93,206, 81,169,222,155, 9,245,180, 62, 95, 32,221,235,121,237,225, 43,220,160,107, 7, 67, 72,188, 58,
-196,240, 36,215, 27,187, 25,124,134, 97, 99, 44,166, 63,230,250,240,128, 56,157, 62, 79,240,222,168,144,199,189,154, 13,253, 66,
- 38, 11, 38,245, 51,201,108,244,226,120, 47,219,203, 91,250,245,227,167,237,183,191,251, 86,242,231,149,115,193,197, 80,133,116,
-109,240,110, 91,118,130, 85,118,145,137,195,104, 55,243,156, 67, 82,212, 66,123,148, 87,106,223,209,133,182,113, 63,252,194,210,
- 11,247,201,154,117, 56,186,140, 14, 81, 88, 92, 34, 12,232,164,123,243,166,195, 90,156,135,159, 16,159,147,152, 55,109,127,224,
-112, 36, 99, 26,205, 59,122, 7, 63,185,135,189,166,202, 57,148, 89, 76,133, 53, 27, 73, 99,150,174, 35,224,220, 32, 27,115,108,
-186,159,109, 12,234, 5,160,113, 88, 10,144,153, 91,170,135, 75,142,137,146,101,133,243, 30,234,136,156,210, 75, 76, 87,152,160,
- 12,103,234, 4,222,167,182, 65,150,243, 89, 93, 50,227, 54, 36,239, 69, 14,198, 83,209,143,179, 29, 24, 47, 21,186, 91,116,173,
-176,255,127,109,202, 28, 80,171, 21,141,238,164,186,212,169,145,174,144, 59, 64,135,230,249, 93, 59,143,230, 56, 16, 8, 28, 48,
-143, 81, 77, 93,143,127, 82, 57, 46,126, 22, 17, 84,241,129, 17, 91,131,104, 5, 55,208,156,179,115,254,142,198,216,156, 31, 71,
-208, 38,158,156,133,134,194,248,129,250,106,142, 27, 47,251,245,230, 99,104, 3,117, 26,166,199,160,247,106,177, 5,152, 31,219,
-128, 96,225,129, 41,175,222,137, 12,101,243,193, 93,101,133, 11,138, 9,180, 24, 13,141,106, 13, 33,192, 40, 10,177,229,147, 35,
-192, 57,159,190,112,208,182, 83,123, 68, 94,119,213,167,246,198,175, 95,167, 92,239, 22, 54,145,220,205,188, 14,236,210,218,194,
- 33, 92,131, 9,238,225,181,108,254, 79, 73,192, 44,130, 63,159,112,189,155,136, 87, 83,131, 37, 85,107, 24, 86, 54, 12,205,142,
-167, 40,254,194, 53,237,169, 6,159,204, 68,206,130,225,187, 46,219,184, 37,247, 83,199,219,253, 32,162, 19, 30,135, 17,159, 38,
-201,126,158,223,245, 63, 1, 56, 58,155,228,200,137, 32, 10, 87,214,191,186, 91,109,207, 98, 32, 96,207,138,171,112, 4, 78, 0,
-107, 78,197,133, 56, 0, 17, 44, 48, 51,110,183,164,250,205, 76,158,102,227, 8, 75,110,169, 50,243,189,239,229,202,237,126,251,
-227,119, 3,109,161,131,194,211, 89,112,204,219, 72, 46,144,141, 6,160, 48,129,160, 21,232,199,184, 75,160,131, 64, 34,220,176,
-209,169, 24,200,224,156, 17,126,224,145, 11, 90,101, 32, 6, 0, 11,175,197, 29,249,246, 47,124, 3, 92,253,237, 87,200, 68,112,
- 7,127, 62,193,100,190,128,236, 86,122, 18,220,142,132, 92,192,211,124,154,236, 80,171, 9,130,185,129,118, 74, 66,134,154,139,
- 36,150, 73,148,156,197, 9,213,162, 52, 19,156,167,114, 74, 11, 15,132,186, 20, 31,241, 32, 2,114, 1, 73,101, 64, 77,165,140,
- 41,233, 28, 52, 96, 79,156, 7,196,252, 24,243,224,121,102, 5,234, 43,210,250,147,223, 4,232,152,195,180,143, 94, 39,132,204,
-253,236,238,147,229,240, 95,154,167, 7, 23,128,180,215, 99, 11, 77,150,104, 77, 22,169,188,166,112, 56,188,128, 26,153, 91, 14,
-246,158,238,235,125, 9,241,254, 34,175,183,112,203,159,210,197,234,154,174,118,201, 9,246,140,201,127,146,176,147,247,240,134,
- 37,135, 11,220,208, 65,117,231, 97,135, 19,163, 39, 38, 48,225,189, 59, 0,200, 73,129, 43,186,110,181, 52,170,181,181,114, 72,
-156,187, 1, 11,171,176,196,221,140,167,239, 71, 28, 92,246,243,171,239, 52,155,188,111,147,209,208,119,233, 5,109,175, 56,217,
- 59,108, 99,235,118, 77,105,176,244,209,166, 50, 42,110,102,189,156, 3,182,170, 48,246,192,115, 31, 72,193,157,146,253,122, 96,
- 68, 20, 93,104,181,199, 29,229,214, 40,208,252, 96, 2, 11,247,133, 65,141,155,235,117,177,161,135,102, 71,100,115, 76,231,157,
- 75,152,177, 27,209,226, 18, 69, 77,205,185,101, 16,181, 4,121, 76,235,192,122, 68,190,143,231, 32,186,215,111, 83, 36, 76,135,
-171,229, 21,158, 7, 21, 1,167, 80,172,230,160, 64, 39, 71, 87,221, 41, 6, 11,252,102,123, 76, 8, 72, 82, 97,112,156,155,120,
- 7, 35, 83, 6,222,113,249,240, 8, 27,241, 56, 58,133,225,184, 5,100, 35,146,218,153,241,227,207, 47,255,126,127,255,147,251,
- 7,104, 14, 98,158,139, 6,224, 61, 89, 48,105,245,112, 13,142, 49,222,218,249,153, 50,250, 3, 26, 80, 7,184, 7, 74, 6,187,
-133,230,213, 67, 74, 87, 1, 40,144, 92,118,169,209,188,216, 21, 3,140,226, 44,221,110,179, 0,225,100, 43,159,132,207, 68,234,
- 9,206,117,159,213, 46, 40,183,152,151,184,254,240, 89,127,250,245,175,251, 47,127,227, 72,230, 31, 68, 48,219,140,128,242, 22,
- 57, 24,215,112,221,230,241,132, 69,114, 56, 45,100,235, 19,201,192,201,134, 19, 45, 89,176, 15,156,113, 38,218, 21,108,156,254,
- 49, 46,134,103,156,180,157, 78, 1,113, 76,207,229,186,249,197,150,140,218,201, 23, 55,129,211, 8,179, 4,219, 21,188,169,187,
-191, 78,215, 22,180, 20,149, 18, 28, 51, 59, 61, 27, 76,174, 30, 44, 43,198,110,118, 6, 54, 13,169,136, 14,177,243,229, 29,130,
- 94, 70, 67,216, 28, 54,222, 71, 6, 70, 49, 63,215, 20,100,138, 89, 99, 26, 8,132,103, 62,220,137, 55, 45, 67, 67,168,154,234,
- 22, 29, 77, 74,113,192,222, 5,164,192, 10, 71, 50,159, 60, 48, 73, 78,211,237,212,230,125, 79,217,134,197, 35,117, 94,153,227,
-114,126,219, 33,115,254,110, 86,173,238,191,226,117,241,247, 92, 14, 84, 49,145,130, 88,207,220, 11,193,227,112, 46,182, 66, 47,
- 49,238, 25,180,220,215, 42,146,209,174, 32, 87, 74,216, 21,130,236,152,191,245,225, 29, 65, 15,132, 86,211, 60,146, 32, 17,106,
- 78,196,206,153,100,176,107, 50,228,217,167, 65,144, 8,205,167, 34, 97,224,154, 28,209,118,236,131,196, 64,177,234, 0,127, 5,
-171,141,200, 61, 8,112, 8,133,153, 85,124,131,248,174, 82,180,157, 48,171, 14,187,163, 50,170, 14,164, 65,235,246, 8,140,141,
-205, 88,196, 7,202,113,134, 51,238,108, 98, 87,200, 6, 49, 54,175,252,117, 98, 85,240,182, 97,167,193, 54,100, 75,172,254,249,
-106,209,149, 33, 76, 23, 29, 64,214,153,110,124,185,181, 3,109,212,212, 1, 45, 30,240,191,196,135,202,254,224,204,246,136, 54,
-108, 94, 17, 50,251,219,138,237,212, 10,242, 64, 15, 72,183, 84, 23,143,227,104,199,112,218,125,217,143,124,223, 13,143, 47,207,
-165, 49,222,221,109,253, 95, 0,154,206, 37, 71,114, 34,138,162,241,119,216,206,172,170, 70,205,136, 9, 3,198,189, 20,150,193,
- 30, 89, 11, 44, 0,144,170,213, 89,233, 95,124, 94, 4, 39, 26, 33,213, 40,165,114,218,241,222,189,247,220, 73, 26,127,255,205,
-219,128,152, 46, 84,168,193,181,239,219, 83, 78, 22,201, 14, 83, 29, 39, 16, 80,184,198,111,217, 55, 80, 32, 49, 63, 62,104,160,
-249,120,199,224, 48,211, 62, 2, 34,214,130, 53,253,247,206, 37, 76, 26,151, 65, 87, 18, 12,201,185,240,225, 8,208,255,223,220,
-209,141,198, 15, 24, 84, 7, 30,115,104,102,100,189,147,182,170, 99, 92,173, 10, 17,194, 48,152,214,196, 56,219, 48,122,134, 77,
-144, 76, 84,135,136, 85, 91, 7,171, 50, 57,193, 46, 11,169, 37,172, 66, 25,147, 30, 63,173,143,124,213,140, 98,205,248,105,253,
-110,253,141, 75, 73,206, 24, 50,189, 3,160,224,139,213, 85, 62, 62,144,119, 47, 75,151, 71, 83,121, 63,242, 9,191,244, 4,164,
- 39,243,174,243,135,121, 55,203,214,100,202,194,191,219,203,132,217,100,144,166,220,215, 73, 77, 55,147,231,151,165,199,184,180,
- 31,226, 43, 86,246,114,183,125, 13,106,154,239,110, 65,180,125,178,132,113,112,174, 77,179, 67,123,218,138,239,136, 13,128,196,
- 19,216,127,241, 8,185, 48,169,214, 47,142,139,214,209, 74, 34, 74, 46, 25, 13, 70,213, 61,243,216, 21,255,212, 73, 85,131,210,
- 75,191, 52, 67,234, 72,252,178,167, 90, 40, 28,151, 57,175, 76,162,237,229,104,230, 40,168, 23, 45,116, 96, 57,239,148, 48,203,
-221,154,212,223, 83,157,112,123,166,143,157,127,117,123,150,231,214, 10,127,143,124, 40,205,211,114,226,184,116,253, 75, 93,161,
- 3,170,153, 88,165, 98,216,140, 93,116,124,120, 4, 10, 7,236,224, 64,240, 46, 49, 15,146,223,190,204,106, 21,136,144, 17, 55,
-111, 39,238, 6, 4,171,140, 72, 88,119,172, 64, 40, 60,203,164, 50, 88,109, 53,212, 25,113,241,230, 23,206, 69,155, 49,248,225,
-136,136, 79,183,195,178,122, 44, 17,138,105,131, 95, 51,134, 19,100, 32, 1,155, 67,254,113, 7, 22,111, 33, 27,166,122, 21,104,
- 77,163, 97, 90, 9,214,195,214,104, 79, 40, 7,242,128,190,167, 34,198, 73,133, 72,235,103,123,255,242,211,239,186,255,201,224,
-116,238,166,130,170,136,218, 41,138, 17,194,193,136,114,170, 7,192, 91,175,220,219, 55, 73, 84, 72,160,219, 90,185,135,246,105,
-138,175, 22, 55, 98,220,225,147,118, 43, 68, 65, 73, 24,175,108, 0,208,101, 29,150,192,194, 81, 58, 28,101,130, 68, 30, 4,164,
- 73, 55, 86, 45, 14,212,107,211,155,185,255,252,203,246,227,175,127,172, 95,254,217,255,190,213,175, 90,214, 48,179, 91,193, 25,
-240,229, 0, 89,176,224,179,212,207,157, 3,236, 39,228,216, 40, 9,199,205, 19,180,152,136,121,186,194, 85, 1,115,136,162,186,
-217,186,196,189,237,236,183, 35,111,157,215,124, 33,211,151,236,226,176, 40, 64, 16, 55,209, 84, 88,103, 98, 32, 53, 29,152,171,
- 90, 96, 10,150,208,185,120, 84, 64,158, 56, 47,135,155,187,241, 52,188, 46,176,174,202,121, 54,119,145,231, 34,125,159,110,171,
-106,155,205,199,212, 64, 82,177, 41,122,180,117, 5,150,213,140, 61,249,120,214, 32, 55, 91,128,168,233, 77,179,225, 8, 50, 50,
- 4,112,119, 57,189,199,237, 9,144,102,153,130, 55, 55, 79,193, 88,161, 50, 18, 74,122, 77,206, 15,145, 62,245,182, 97,178,115,
- 91,226,183, 44,190, 94, 15,206,111, 20, 15, 74,173,184, 3, 5, 67,207,202,175,162,195, 4,216,134,187,189,104,184, 40, 47,246,
-228, 49,249,202, 67,221,116, 36,211, 99,206,197, 97, 59,149, 8, 58,146, 91,134,183, 94, 14, 96,161,241,115, 23, 60, 41,153, 62,
-108, 93, 74, 84,103,205, 28,229, 77,232, 35,245, 45,232,115, 1, 34, 21,213,126,169,175, 54,103, 49, 69,239,234,121,158, 16, 24,
-230,112,210,151,141,215, 46,125, 39,116,183,247,193,165,234, 12, 52,137,232,138, 77,245,148, 64,251,139,165,132, 53, 17,154, 4,
-238,130, 75, 61, 88,207,212, 39,167,218,131, 10, 50,109,116,149,139,162, 39,163, 63, 29, 39,165, 34, 44, 27, 61,246,124,152,189,
- 71,139, 83,109,133, 86,230, 98,170,137, 77,230,150, 53, 29,124,111,219,161,175, 25, 6, 19, 61, 80, 44,231,184,233, 60,219, 90,
- 64,151, 15, 86, 65,146,126, 66, 75, 49,184, 75,246,173,192,185, 8,186,147, 64,156,187, 38, 97,207,253, 76, 80,161,105,105, 96,
-140, 30,105, 91,178,252, 43, 0, 71,103,146, 35, 73, 17, 68, 81,159, 99,200,168,204,106, 4, 8, 88,176,227, 8,172,184, 15, 11,
-122,205,173,184, 12, 43, 14,208, 75, 80,119,103,102, 12, 62, 7,207, 82, 42,229, 80, 42, 41, 34,220,204,254,127,223,107,225,246,
-247, 63,255,152, 24, 82,145, 79,138, 5,192,170, 96,179,228, 18,148,154,116,197, 28, 33,220,167,152,169,242, 25,205,150, 80,224,
- 41,190, 28, 92,162,249,102, 29,138,233,133,172, 81, 38,190, 23, 32,226,117,104, 8, 29,192, 96,163,168, 84,213, 81,131,215, 73,
- 75,182, 89, 60,139, 74, 82, 92, 38,255,104,170,153,129, 79, 53,183,194,184,159, 94,244,156, 87,112,142,119,188, 81,118,124,154,
-133, 76,121,225, 34,141,229,197, 19,112, 88, 64, 1,150,182,100, 98, 80, 78,170, 31, 24, 53,224, 59,197, 39, 87,150,189,154, 26,
-145, 3, 18, 65,207,189, 29, 45,110, 88,176,169, 91, 75,251,221,166, 20, 99, 62,120,180,199, 54,125,189,127,178, 74,206, 59,143,
- 58, 30, 81, 68,116,231,111, 10, 48,232,145, 12,234, 84, 74, 27, 48, 42,109,175,158, 88,137,179,220,178, 75,211,119, 75, 24,167,
- 48,100,111,223,166, 49,108,110,224,205, 47, 96,136,179,193,206,179,242,195, 60,145,156,167,176, 4,198, 30, 81,211,114,232,110,
- 86,110, 6,224,209,110, 83, 4,224,221, 49,157, 9,133,239,106,213,199,208,115,154,241,250, 61,102,136, 62,175, 77, 29,185,236,
-133,148,166, 9,164,160,109,142, 40,223, 89,106,102,104,253,170,246,141, 44, 12, 89,184,180,126,174,110, 69,108, 0,125, 83, 31,
-231,120,246, 71,136, 79, 44,117, 63,220,110,211, 21, 25, 75, 73,214,171, 78,183, 18,146, 38, 27,123,241, 76,147, 83,185,228,158,
-111, 70, 82,152,174,253,110, 89,218,113,100, 56, 96,231,249, 49, 53,149, 13,100, 67,201, 24, 6, 34, 83, 27,198,144,115, 39, 46,
-161,188, 57,184, 5,128, 34, 14, 29,178, 15,215,225, 60,230,113,126,137,126,234,126,184, 16,140, 44, 41,234, 73,187, 0,237,208,
-176, 16, 83, 45,167, 9, 94,230,177, 27, 75,219, 94, 3, 11, 2, 51,157, 10, 86,100, 93,250,121,133,221, 27, 19,169,133, 19,170,
-178,132,245,130,202, 10,180,107,122,114, 49, 7,104,139, 11,206, 58, 51,215, 62, 95,122, 36, 99,174,213,247,103,157,124,249,230,
-215, 31,254,158,223,254,202,209,211, 17,154,165, 60,172, 36,105,208, 3, 0,241,228,212,158,119, 93, 34,204,156,118,110,243, 80,
-231,226,213,109,188,188, 79,215,139,153,191,181,211,205,205, 85,235,197,208, 92,129,108,192,165, 22,154,225,180, 3, 0, 65, 82,
-212,243,197,250, 73, 88, 5,188,196,111,204,210, 95,191, 5,198, 85,255,222,253,248,203, 79,251,207, 31,255,153,127,251,175,252,
- 43,140, 56,156,181,147, 32, 10, 6,132,143,245, 66, 91,185, 24,248, 42,177,212,215,103, 15,229, 74,127,156,111, 6, 64,241, 42,
-167, 52, 85,195,154, 96,128,123,247,211,108,155,196, 13,149, 76,146, 17, 2, 66,211,232,156,223,179,185,152, 2, 32, 61,149, 26,
-138,236,226, 69, 96, 93,121,113,107, 85, 23,132,212,216, 47,217,163, 1,218,221, 36, 39,114, 97,178, 3, 72, 61,230, 22,113, 83,
-135,219,124, 6,224, 89, 90, 21, 26,168, 66, 31,157,101, 50,227, 82, 0,116,100, 99,144, 5,167,126, 94,254, 75, 55, 78,145, 71,
- 64, 84,156,213,177,212, 98,177,138,248,186,199,102,205, 2, 38, 17, 88, 93,107,140, 7, 55, 33,194, 35, 59,119,125, 37, 9, 41,
-123,104,139,147, 88, 50,165,240,215, 0, 44,239,237, 13,164,201, 40,169,137,198,140,232, 11,253, 49, 74,243, 44, 22,145, 19, 23,
-231, 86,203, 87,134,160,195, 70,230, 89,222, 83, 85,230,141,184, 95,123, 76, 79,226, 3, 37,117, 67,151, 3,146, 90, 39,238, 47,
-245, 22,179,194,131, 84, 31, 66,205,221,132, 40,199,110,225,252, 59, 10, 85,113,181,199,185,246,122,115, 4, 61,250,130, 33, 62,
-212, 3, 90, 39, 44,109,152, 11,211,106, 7,152, 98, 40, 37,218,173, 80, 53, 5,215, 88,127,151,173, 0, 83, 62, 96,122, 49,184,
-145,106,187,109, 28, 6,216, 32,104, 0,178,240, 60, 1,223,193,162,163, 10,231, 37,198,163,123, 3,113,233,154,176, 48, 83,150,
- 92, 34, 69,134,207,234,238, 54, 95,223, 17,180, 66,207, 25,217,202,216,125,201, 76,187,230,126,143,122, 12,104, 92,185,180, 2,
-193, 85, 16,203,217,100, 43,218,141,235,241,211, 94, 41,221,135, 22,215, 53, 48,234, 37,123,136,214,228, 38,187, 81,250,168, 95,
-236,126,180, 19,231,121,108,248,126, 43, 10,236,217, 70,229,238,231,255, 2,112,116, 38, 59,178, 19, 65, 20,205,193, 57,185,170,
- 69, 9, 61,189, 37,172, 16, 66,226, 99,248, 14, 22,236,248, 73, 54,252, 6,188, 5, 93, 93,101,151,211, 57,114,162,165,222,244,
- 80,146, 51,242,198,141,115,195,139,182,127,252,249,123,197, 50,100,144, 42,111, 10,158, 77,226,245,250,154,232,166,137, 81,195,
- 43, 74, 80,189, 55, 2, 40,213, 70,228, 74,157, 47, 98, 16,102, 45, 75,151,114, 26,230, 97,170,163, 9, 34, 25,133, 34,100,103,
- 44,110,142,180,197,216,104,235, 68, 48,148,149,205, 28,178,177,164, 92, 16, 58, 63,225, 51, 22,190, 3,241,187,236,124,226, 9,
-203, 9,156,144,192,145,137,130, 70,155, 67,161, 58,160,151,249,137,138, 70,210, 61,146,171,234,136,106,139,195,224, 22, 28,103,
-136,239, 70,226, 33,232, 25, 22,134,148, 70,140,156,127, 29,163, 87,247,106, 20,254, 60,231, 73,193,182,234, 66, 93,242,222,112,
- 75, 93,195,161, 93,124,189,143,246,232,109, 30,199,184,219, 26,193,227,169, 14,167,249,137, 51,115, 69,188, 4,156, 55, 84, 20,
-206,180, 93,194, 26,122, 79,150,144,147, 86, 63,210,109, 29,183,239, 46,142,169,234, 47, 94, 59, 16,157, 81,143,123,225, 96, 41,
-145, 14, 61, 52,132, 83, 25,149,116,144, 61,161, 73, 60, 33, 7,108,246,201,159,239, 25,206,168,101, 82, 77,158,249,189,245,247,
-178,192,214, 79,154,170,183,109,144, 63, 16,184,186,212, 99,247,239,103,175,250,163,118,110,252,227, 57,182,187,186,140, 23,216,
-202, 52,107, 78, 34,103,142,173, 16,111,178,190,243, 13,134,247,240,233,225,170,111,230, 12,143,220, 83,230,183,203, 35,143, 51,
-219, 75, 54,216, 42,168, 2,230, 80,202,165,248,251,199,200,135, 24,239,213,192, 15, 21, 52, 61, 31,184, 65,191,235,233,101, 7,
- 67, 49,207, 71, 92,188,189,134, 82,119,241,101,117, 97, 64, 3,131,241, 51,170,113, 99,150,240, 34,156,203,208, 18, 16, 80,193,
- 47, 8,150,219,231,234, 24,195,194, 4,110, 48, 20, 24,204,250,243,223,150,113,231,135, 27, 17, 48,215, 77,232,184,127, 26,254,
-182,192, 15, 7,186,192, 59, 94,131, 68, 85,172,238, 39,125,218,251,161, 9,203,215,194, 7,113, 69,236,128,156,223,137,123, 51,
-129, 84,116,144,222,184,249,153,191,252,124,251,231,199,175,127,245,227, 27, 83,200, 54, 89,170,171,147,224, 49,197,137,137,236,
-207,129,213, 35,247, 14,119, 60, 24,176,205, 6, 11,188,189,165,182, 94,201,148, 90, 34,201, 98,109, 89,220, 77, 67,206, 38, 88,
-235,189, 3,207,121, 34, 38,180,165, 57,152, 62, 35,239, 76,107,157, 9,211,150, 8,102,252,234, 93,232, 75,180,223,255,250,203,
-235,135,223,254,214, 63,221,221,183,107,253,151,240,119, 18, 50,204, 74,195, 98, 26, 67,214,185,222, 73,132,177,210,112, 26, 96,
- 90,158,253,173, 26,206, 38,239, 20,188, 13,156,121, 53,102,167, 90,211,150,241, 88, 39,169,161,160,122, 28,112, 81, 21, 63,193,
- 71, 87,119, 34,237,107,191,129,122, 67,246,161,124, 80,251,113, 9,203,142,151, 78, 43,235,128,132,204,237, 30,117,169,116, 28,
-100,134,198,180, 33, 95,211, 70, 9,231, 11, 91,198, 67,140,186,145, 28,221, 38,236,219,100,117,213,250, 5,230,230, 75, 86,247,
- 35,100, 81, 58,252,228,219,136,148, 16,174,196, 87,140,172, 78,118, 3, 33, 52, 3, 67, 37, 71,105, 55,187, 7,225, 11,188,129,
-168, 60,100, 63, 66,164,144, 85,228, 80,247,190,189,141,254,172,156, 43,246,218,178, 42, 55, 37,155,186, 78, 70, 98,214, 14,153,
-187, 12,221, 69, 7, 70, 93,200,231,105,135,215, 92,129,190, 86,111,253, 92, 70, 55,111,135,198,180, 58,113, 78,203,155,188,144,
- 86, 46,115,200,237, 93,236,181,204,100,100,189, 60,199, 18,169,148, 68, 42, 32,216, 45, 53,166, 8, 12,146,247,224, 34, 75, 20,
-105, 57, 6,147,131, 25,162,117, 63, 22,213, 10, 77,158,220, 42,111, 49,106,249, 15,187,227,178,166, 23, 5,208,162, 22,110,203,
-205,153, 50, 70, 58,223,115,119, 52,246,147, 56,121,202,194,114,155,169, 48,155, 64,125, 89,138,201,220, 46, 42, 19, 94, 48,103,
- 78, 84,193, 53,128,244,136, 87,242,132,122,113,186,140,142,169,219,190,219,122,156, 61,143, 84,151, 45,182,118,255,176,135,197,
-231,121,250,202, 1,229, 29, 39,254,108,159, 7, 9,224, 64,235,157, 92, 0,158,234, 41,250, 24, 51,182,237,163, 71,130,198,166,
- 84,206, 79,107, 69, 53, 85, 86, 49,160,129,188,117,200,163, 16,118,200,116, 71,153, 50,220,242,255, 2,112,116,110,187,173, 20,
- 65, 20,157,190,183,103,108, 39, 16, 9, 9,126, 1,129,248, 34,158,249, 80,222,121,227, 19,144, 0,145,227, 73,220,115,233, 43,
-171,206, 67, 18,201,146,157,233,238,170,189,215,174,142, 20,243, 27,250, 62,177, 30,170,215, 65,135, 10,173, 70, 72,217,113, 77,
-178, 65,151,156, 92,147,218, 42,110,104, 11,237, 15,135, 30, 66, 42,130, 24, 44,198, 15, 36, 87, 99,157, 10,141,162,134, 36,189,
- 10,114,187, 73,198, 55, 77,239,240, 79,230,205,173,104, 74, 80,230,204,248,135,117,157,122,229,184,248, 48, 76, 64, 30, 18,203,
- 10, 95,255,111, 97,147,136, 48,124,149,144,197,239,142, 83, 64, 22, 16, 87,105,133,222, 19, 4, 60, 36,105,239,227,138,152,179,
- 44, 25,117, 64, 1, 53,118, 84,165, 9,223, 82,169, 90,132,189,247, 66,158, 92,145, 80, 36, 48, 67,228,213, 36,178, 85, 62,243,
-150,182,189,111,109,221, 31,143, 99, 99, 97,251,138,204,136,161,148,134, 29,234,146,159,201, 80,190, 43, 82, 75, 99,117, 97,249,
- 11, 57,236, 98, 95, 37,225, 46, 86,207, 47,179,191, 45,232,106,255,214,191, 92,199,213,195,238, 96,250,157,174,156,151,112, 13,
- 87, 90, 74,123, 2,117, 67, 25,180,238,180, 52,122,136,184,118, 98, 18,173,198,238,150,196,203,116, 4,112,177,103,200,149,200,
- 84, 71,191, 17, 9,199, 39, 29, 51,202,177,229,238,255,123, 95,167, 32,246,244, 65, 95, 86,179,149,225, 19,109,152,107, 36,202,
-184,119, 60,126,250,234,206,235,152, 82, 57,215,125, 29, 99,253, 2,154,210, 3, 99,219,114,134, 9,122, 73,169,199, 76,205, 73,
-233,159,169,237,212,117,206,238,106,218,163, 76, 73, 34,252,228,162, 90, 74, 64,166, 61,121,177, 35,170, 0, 66, 13,167, 59,213,
- 21, 77, 46,138, 13, 88,232, 84,153, 38,117,239, 47,250,162,154, 12,213, 76,111, 34, 91, 84,142,237, 21, 72, 47,230, 13, 55,131,
- 22,101, 36, 37,115,247,160,180,135, 60,176,100, 57, 96, 66, 24, 26,103, 3, 7,236,181,135, 4,121, 99,149,169,179, 4, 27,157,
- 11,185, 30,170,116,123,183,178,101,163,141,235,162,221,217, 1,187, 51, 86,155,181,125,245,196, 63, 16,191,102,127,134,166, 32,
-111,202,211, 29,205,162,115,158,152,117,255, 78,197, 95,190,255,221,154, 63,206, 29,146, 96,103,225, 2,194,225,209, 80,231,211,
-105,179,181, 79,218,188,149, 54,206,199,150,137,198, 87, 63,135, 48,223,237,245,102,236,140, 16, 43,153,249, 80,153, 44,117,158,
- 4,133,168,166, 93,228, 46,194, 20,209,201, 37,130,220,128,130,170,168,203, 56, 86,194,174, 92,187,202,157,217, 15,238,155,159,
-126,252,235,237,215, 63,205,207, 95,198, 63,112,226,101, 10, 52, 22,242, 8, 62,138,126,226, 28,184,188, 42,148,158,173, 57,214,
-190, 59,159,131,161,116, 53, 53, 62,121,153,125,232,114,116, 47, 3, 72, 11,161,201,140, 6, 67, 76,117, 49,160,148,242, 51,251,
- 52,133,211,200,196, 83, 53, 28,157,156,183,177, 1,211, 9,206,150, 83,110, 56,249, 17,125,169, 18,242,137,124,196, 12,246,217,
- 98,255, 81,147,174,236, 99,144,206,203,194, 3,157,180, 86,211, 78,254,112, 98, 97,243,134,124,103,225,184,199,209,237,177, 4,
-239, 12, 15,178,236, 74,221,252,214, 54, 30,102,207,246,249,214,239,218,246, 4, 65,138, 40,115,202, 49,205,231,236,215, 79,117,
-211,167, 53,114,177, 44,205,175,101,205,177,197,233, 6,156, 34,163, 70,191, 74,246,127, 46,150, 52,190, 0,183,179,189,253, 45,
-247, 22,102, 26, 91,114,124,120,151,112, 67,135,213,174,101,188, 39, 19, 44,104, 18,101, 37,208, 89,188,172,121, 40,143,162,193,
-200, 62,226,199, 48,125,209,122,111,150,164,145, 99,166,105,231, 71,154,196, 30,218,152, 97,255,155,207,232, 80,141,249,114,140,
-127,189,159,177,101, 59, 3, 4,107,111,253, 5,121,140,118, 85,186,186,195,148, 75,131,197, 64,171,163,133, 3, 88,164,205, 35,
-173, 74, 66,145,139, 21,185, 74, 48,128,172, 18, 85,113,234, 94,189,177,121, 16,136,123, 49,248,108,190,214,158,201, 34, 54,100,
-152, 11, 41,212,129, 47, 82, 42, 46,217,179, 90,210, 68, 75, 84, 13, 5, 60,163,193,104,142,240,116, 69,201,228,237,236, 66,209,
- 48, 19, 41, 82,181,104, 19,230, 32,199,241,105,158,182, 52,159,204,115, 38,204,179,124, 75, 33, 64,162,105, 13,219,177,201, 70,
- 36,137, 65,116, 88, 33, 46, 76,114, 27, 83, 5,237,198, 65,185,163,200,239, 39, 56,143,213,224,153, 91,143,168, 47, 13,240,191,
- 0, 36,154, 91,142,164, 70, 16, 69,129,124, 66,117,141,218,150, 90,242,247, 72,179,129,145,188, 24,111,192,146, 23,224,237,121,
- 21,150,151, 48,127, 86,119, 67, 65,146,228, 35,124,162,188,128,162,128,140,184,247,220, 8,204, 31,127,254,142,141, 35, 62,134,
- 66,152, 42,152, 60,232,150,154,130,211, 77,224,160,113, 22,225, 1, 28,104, 67,196, 85,167, 44, 93,169,229,153, 76, 71,109, 69,
- 74,176,105, 12,182, 8,151,121,174, 44,164,153,255,179, 53,188,170, 51, 23,171,179,156,115,192,229, 97, 77,130, 54,190, 75, 24,
- 82,138,209,189,214,216,245,155, 27,252,109,224,127,177, 82,145,174, 51,106, 26, 9, 51,217,106,134, 1,162, 94,179,226,133,180,
-191,237,174, 88,253, 14,135,234, 84, 34, 41,146,161, 13, 42, 99,212, 15, 49, 48,113,222, 28, 1, 8, 90, 79, 72, 41,135, 79,125,
- 36, 3,113, 88,123,228,117, 71, 49,178, 93, 9,187,216, 66,179, 7, 32, 7,236, 63,146,212,253,209,240,240,147,215, 55,198, 77,
-166, 51, 13, 47,201,133,112,171, 58, 92,116,206, 6, 21, 31,179,144,227, 22, 76,205,191,120, 66,170,127, 51, 49, 12,179,213,126,
-184, 17, 69,227, 92,245,155,160,217,160, 0,179,126,104, 16,251,232, 58,225, 79,103,216, 58,159,118, 18,136,248, 77, 31,135,172,
-179,209,237, 19, 82,143,110,187,109,204, 87, 79,184,207,191,156,103, 53,239,117, 39,191,212,146, 53,208, 12,199,244,128,119,246,
-246,126,156, 77,237,176,158,132,108, 72,143,224, 95, 11, 86,157,182,241,115, 54, 84,188, 9,121,136, 34, 43, 66,222, 40,203, 60,
-202,234,250,195, 36, 76,102,223, 27,214,214,160, 49,142,115,215, 44,221,117,245,196,249, 24, 2, 33,253, 67,193,109, 43,209,202,
-157,232, 16,174, 72, 94,104, 38,251,166,217, 40, 56, 33,160,221, 41,148, 41,140,208,150, 12, 60, 21, 2, 65,190,185,221, 39, 67,
-204,178, 46,134, 22,168,158,130, 39,234,170, 8, 43,231,108,135,135,178,152, 14, 57, 92,215,237, 23, 92,183, 56, 33,112, 98,228,
-163,146,219,180,104, 63,192, 74, 86, 37, 73, 80, 34,110,111, 82,236,118, 67, 61,136, 19, 28,250,120, 37,124,156, 80, 99, 46,192,
- 67,211, 69, 64,250,117, 81,160, 83, 65,119,102,141,119, 82,242,219,175,111,127,191,222,255, 34,238,224, 73,147,206, 16, 97, 43,
-180,156,148,136, 46, 97,159,173,104, 89, 8,212,169,195,217, 5,250, 91, 22, 10, 23, 27, 9, 84,142, 46,238,177,226,102, 73, 32,
-212,175,211,172, 1,233,194, 49, 95, 32,143, 81, 55,116, 92, 49, 72, 17, 83, 63,218,218, 48,214, 30,188,204,111,253,245, 23, 31,
-191,125,127,255,246,219,143,241,107, 41,255, 88,113,183,186,211, 28, 41,116,235,158,129,179,239,114,121,240, 80,247, 85, 24, 40,
-191,233, 2, 76,147, 12,157,200, 37,237,201,243, 62,250,143,234,221,233, 67,233, 77, 13,108,186,145,176,112,233, 24, 87,205, 64,
- 58,220,196,168,148, 13, 81, 21,131,185, 98,143, 82, 52, 23, 63, 39, 92,116,236,195,233, 23, 97,126, 90,244,145,136, 98,196, 41,
-209, 73,151, 30,145,231, 32, 34,178, 81,226,118,141, 20, 23,106,132, 24,235, 45,145,153,195,144,184, 59, 59, 42,105,108,138, 88,
-252,115,191, 29,188,169, 41,249,134,131, 33, 36,144, 30,231,214,148,168, 98,115,171,147, 12,166,161,215,224, 92, 23,234, 21, 16,
-226, 26,180, 34,138,217, 23,209,176, 89, 3, 77,105, 55,170,193, 46,152,246,117, 4, 99,207,201,132,235,250, 0,171,131, 56,239,
-240, 12,199, 65,231,177, 99,169,149, 12,166, 40,163,243, 92,253, 46,200,206,205,181,251, 0, 58,191,242,199, 91,134,174,242,130,
-184,242,144, 39, 33, 96, 8,213,223,230,159,150, 72,151, 46,135,225,125,235, 82, 22,101,201,203,139,191,218, 74,160,233, 63,167,
-225, 16,133, 17,244,251,101,166, 45,100,139, 24,217,148,141, 81,255, 52, 68,185,214,142, 47, 75, 51, 81,215,132,240,118,111,169,
- 88,185,175,207, 85,127,209, 27,193, 46, 74,174,137, 26,154, 66,130,241,118, 65,117, 96, 74,114, 94,186,146,217,159,227, 98,232,
- 52,195,221,118, 63, 50, 30,101,115,245, 83,109, 7,180,109, 72, 5,233,188,100, 3,193,179, 70,144,234,137, 41, 45,229, 43,204,
- 28, 68,187,128, 73,210,173,125,124, 78,159,243, 3, 85, 72,171, 18,251,123,171, 87, 38, 76,185,112, 26, 67,148, 29, 96, 82, 46,
-123,158,215,136,199, 72, 63, 65, 26,218,148, 35, 34,156,131,209,199,249, 40,146, 34, 45,211, 36, 37,201,133,202,249, 79, 0,142,
-206,100, 55,146, 34, 8,195,185, 84,102,109,205, 52, 2, 36, 36, 4, 60, 0,103,158,135, 59,226,202,131,241, 64, 92, 17, 8, 70,
-227,113, 47, 85,149, 89,185,240,253,125,179,229,182,115,139,248,151,136,144,236,127,253,253, 55, 28, 30, 98,137, 52, 70,186, 14,
-189,169,110, 14,114,152,202,113,137,157, 38,148,247, 18,248, 74,186,215, 76, 37,215, 16, 1,118,139,203, 49,145,180,144, 87, 69,
-177, 73,173,128,249, 68,157, 85, 54, 99, 26,121,118, 66,108, 80,195, 85, 46, 0,241, 30, 95, 85,212,220,250,204, 79,184, 76,128,
-212, 8,104,129,175,246, 50,191,141, 32,198, 68, 98,131, 84, 37, 67,135, 56,172,199, 1,212,215, 49,147,210,156, 59,227,183, 85,
-213, 44,196,154, 52,135,198,145, 78, 99, 8, 89, 53,177,207,132, 83,200, 37,173,123, 83,113, 49,201,117,102,164,211,189,110,233,
-184,149, 55,251, 49,162,148,242,176,253,131, 33,186,153,240,159,223,146,147,124, 47, 48, 35, 52, 6, 63,160,241,107,193,221,142,
-176,254, 23, 61,156,238, 10,144,141, 43, 40,112,241, 97,253,128, 79, 43,118,253,114, 30,243, 55, 95,205, 35, 8, 17,167,203,162,
-233,206,101, 66, 13,218, 58,135,190, 6,245,112, 67,111, 75, 24, 68, 66, 96, 67, 7, 76,250,214, 96,221, 97,211, 68, 36,202,169,
-214,116,242, 61,142,238,173, 26,220,175, 61,242, 3, 27, 46, 23,143,116,120,122,116,211, 32,109,113,188,111,201, 16, 42,174,196,
-243, 51,153,242,128,133, 15, 3, 72,150,221,165,130, 36, 79,151,150,119, 93,167,177,183, 19,200, 44,196, 39,230,213, 89, 62,142,
-233,241, 55,190, 26,226,179, 62, 9,192, 41,204, 44,188,168,172,166,249,137,238,223, 1,228, 29, 73,170,170,214,236,136, 68, 13,
-113, 45, 65,173, 82,205, 79,196, 53,206,164,104,115,147,196,223,152,120, 72, 32,107,170,215,195,229, 11, 32, 95,216, 48, 49,130,
- 74,106, 94,245,141, 46,140, 32,146,136,152,151,157, 67,202, 44, 74, 18,251,170, 81,225,103,212,116,177, 42, 92,113, 36,171, 50,
- 62,126,137, 52,169, 42,103,251,196,239,153,164,113,167, 17,150, 76,143, 66,110,237, 86,163,150,238,229, 8,211,155,141, 88,135,
-229,221,122, 20,220,217, 6,130,196,235, 18, 76, 29,191,139,225,167,111,255,232,229,227, 81, 18,120, 10,109,106, 99,231,110, 84,
- 53,224, 6, 74, 57, 97,188,185,195,124,196, 48, 20,205,131, 14, 24,128, 76, 96,178, 61,191,240,231, 29,144,133,139,243, 65,249,
-160,127,238, 62, 34, 49,109,159, 39,192, 21,194,176,178,114, 57, 39,159, 63, 85,204,216,236,251,184,244,245,107, 59,255,248,243,
-223, 63,252,242,231,249,253,125,251,139,128, 92,226,136, 92,185,249, 29,154,209, 40,151,134,202,240,152, 62,132, 67, 69, 35,195,
- 98, 41, 46,119, 50, 2,149, 4, 66, 71,199, 38, 78,178,124,187,183, 32,242, 71,101,159,115, 75, 88,124,132, 47, 31, 86, 99,181,
-197,212, 95, 99, 80,232, 27, 68,134,140, 22,156, 84,239,172, 50,182,185, 79, 56, 93,221,122, 61,174, 53,110, 48,167,205, 80, 79,
- 55, 75,127, 89,228,154,198,179, 32, 52,203,107,100,203, 2, 92,131,247, 31,252, 51,169,193,230, 80,141,175, 42,226, 84,230,181,
-217, 1,131,118, 61, 80,152,206,113, 88,145, 93,101, 73,235,241, 42,207,151,206,219,130, 74, 42, 43,226,160,198,152, 88,209,134,
- 51,238,136, 63,248, 78,131, 29,102,210, 34,184,159,201,224,128,102,205, 92,186,203, 49, 58,135,142, 57,172,231, 25, 44,198, 41,
-123, 92,151,159,250, 78, 38, 19, 43, 81, 46, 63,171,179, 41, 61,199,166, 61,148,230,251,189, 77, 24, 53,155, 80,242,225,225,195,
-115, 45,146,232, 13,193,229,198,141,120, 49,224,219,150,215,118,150,112,242,235,198,165,243, 24,215,125, 52,249,223,122,246, 48,
- 93, 53, 70,120, 68, 77,216, 69, 36,229,174, 97, 57,128,220,237, 77, 93, 65,240, 58,169,134, 31,253,179, 45,138, 69,135,189, 29,
-214, 30, 53,190, 77, 14,204,163,112,125,157,192,166,216,208,165,145, 35,175,231,227, 2,225, 89,213, 67, 23, 3,197, 53, 51,215,
- 62,146,117,113, 70, 60, 69,158,214,218, 59,155, 14, 3,105,223, 55,207, 6, 70,206,113,136,246,228, 12,135,212, 31,248,239,237,
-200,159,108, 94,202,126, 35,174, 30,159, 15,119,110, 60, 15,218,227,238, 34, 33, 26,109,219, 52,113,161, 14,111,219,222,160,198,
- 18,222, 85,248,216,247,226,239,195,208,216, 40,138, 16,178,144,218,194,179,117,248, 23, 49,113,168,216,135,161, 83,239,216,181,
-255, 5,224,216, 90,118, 28,183,129, 32,159,162, 94,158,201,108,176,216, 91, 14, 65,144,123,254, 38,191, 30, 36,167,205, 49, 88,
-216, 99,137,226,155, 76,149, 1, 99, 96, 96, 32,153, 34,187,187,170,186, 75,134,211, 43,230, 27,199, 69,165, 89,222, 78,214, 69,
-208,212, 78, 51, 59,194, 17,127, 59,244,115, 43,244, 26, 71, 54, 91,145, 45, 9, 55, 67, 42, 59, 20, 86, 71, 95, 12,232, 16,173,
-193, 50,178,100, 91,122, 22, 69,169,200, 59,112, 10, 3, 57,233, 68,245,130,205,187, 78, 59, 81,117, 16,221, 10,124, 19,135,138,
-187,101,192, 7,170,161,224, 36, 51, 67, 87, 3,172, 81,228, 94,150, 39, 51,163, 56,231, 88, 56,205,120,185,220,104, 91,200,124,
-158,193, 78, 6,103,104, 60,186,178,148,220,251,249,148, 43,152,125, 99,169, 76,200, 90, 25, 50,246, 84,159, 96,115,234,137, 26,
- 27, 93,155, 64,221,177, 46, 31,126,164, 21,172,165, 12,175, 67, 66, 6,223,243,171, 63, 59, 92, 2,241,255,212,107,175,155,154,
-252,173,230,176,232,213, 89, 75,254,104,228, 6,125,216, 80,205,219,132,154,184,153, 91, 18,203,188, 35,162,242, 48, 43,176,218,
-128,224,131,215,154, 89, 35,120, 38,249,234,215, 98,167,128,253, 14, 2,139,147, 67, 96, 48, 29, 46, 99,120, 4,140,138,180,197,
- 22,234, 35,232,176,137,174, 14,148,219,156,145,213, 9, 9,229, 62,197,163, 63,199,222, 67,232, 33,215, 83,158,165,190,169,214,
- 61,104,146, 7,179, 5,124,153,170, 33,252, 51,234,115,135, 10, 74, 9,143,112,186,244, 14, 84,152, 99, 34, 23,105, 23,161, 15,
-164, 85,238, 5,154,154,155, 82,154, 7,145,225,239, 41,141, 32, 54,133, 46,119,192,255, 17,218, 98,228,101, 34, 22,114,211, 63,
- 50, 68,217,180,173, 87, 99,127,172, 44, 30,203,134,242, 9,179,179, 16, 8, 58, 66, 69, 38, 28,204,210,178,189,114,218, 62,110,
-225, 2, 50, 11,136, 88, 44, 68,130,147, 82,100, 85,113, 67,196, 88,146, 2, 74,110,100, 68,164, 21,215,208, 74,133,157,120,245,
-234, 38, 17,147,149,182, 65, 55, 21,144, 12,195,156,192,103,146, 37, 67,140,173, 16,133, 50,127, 22, 3,101,172,198,112,212,187,
-108, 38,199,233,144, 19, 46, 69,226,152,151, 51, 45,244,254,237,183,219, 95,194,252, 29,193,174,163, 86,129,243, 99, 77,127, 11,
-155, 36,230, 76,180,124, 37, 54,243, 57,227,245, 0, 27, 78,235,217,111,234, 2, 28, 8, 74, 99,236, 2,185,141,239, 29, 18, 2,
- 75,179,156, 84, 66, 39,114, 48,174,114, 37,153, 4, 55, 29,130, 23,137,135,198, 82,178,217,155,248, 98,110,191,254,241,239,239,
-127,126, 31,191,216,243, 31, 57, 0,190,116,116, 84, 26,134, 39, 40, 14,136,101,121,170,249, 70,227, 84, 65, 89,168,150, 93,151,
- 58,158,125,219,198, 12,204, 25, 90,191, 35, 83,133, 94,160, 80,103,212,114,145,113,144,110,243, 16, 42,237,180,216, 62,232, 95,
- 60, 46,196, 10,200, 12,106,181,237, 81,156,200,162,156,145, 38,118, 21,111,124,207, 99,185,124, 76, 74, 46,205,108,185,230,151,
-182,145, 19,167,137,226,200,222,246,176,238, 31, 17, 21,176, 34,149,153,208, 5,255,149, 95, 56, 42,145, 26, 81, 4, 40, 71, 29,
- 39, 22, 29, 15,200,120, 8, 58, 47,131, 17,200,110, 37,140,227,228,117,224,199,216, 87,236,220,154, 29,101,200,169,107,146, 62,
-202,143, 90, 65,102, 16,245,118,107,230, 94, 30,217,230,183,225,128,199, 28,215,181,114, 66,229,130,190,170,238,231, 99, 6,136,
-148, 29,188,100,216,163,145, 29, 46,144, 39, 39,162, 79,185,159,204,129, 43,124, 89,118,156, 31, 71,108,215,238,141, 23,111,205,
-168,154,230, 12,237, 35,199,170,214, 94, 68,162, 57, 49, 6,249, 88,235,251, 4, 77,211, 29, 16,188,141, 92,117,252, 24, 14, 58,
- 37, 65,227,121, 30,250,206, 23, 5,192, 17, 31, 93, 49,112, 38,113,225,145, 84, 93, 95, 47,246, 92,157,175, 54,244, 34, 7, 96,
-211,188,159,103,100,100,171,202, 25, 14, 27, 22, 19, 16,126,236,180,129, 21, 51, 95, 7,242,213,163,116,182, 49, 43,148,156,237,
-222,203,116,197,227,171,161, 46,191, 12, 0,163,147, 86,222, 65,167,144,138,122,145, 87, 11, 96,173,255, 57,229,112,150, 9, 68,
- 12, 25, 47, 21, 59,218,150,173,199,126, 28, 40, 4,102,251,121, 70, 2,222,219,169,114,112, 78,233, 85,135,252, 4,245,177, 65,
-132,207,136,212, 30, 65, 11, 96, 36, 98, 15,140,243,237, 94,229,156,227,158,168,101,137, 64,169, 35, 72, 75,193,161,162, 26,179,
-211,130, 67,213,253, 64, 48, 0, 69,230,242,140, 56,149,255, 5,224,216,108,118,228,182,129, 32, 76, 82,164,168,145,102,215,118,
-246,224, 83,128, 0, 57, 6,200, 59, 5, 8,242, 4,121,190, 60,136, 15,185,229,148,216,240,236,140, 36,254,136, 84,190,154,219,
- 66, 43, 72, 28,177,187,186,170, 89, 61,252,254,231, 31,234,185,107, 14,226, 80, 47, 85, 70, 17, 34, 56, 16, 93,161,102,100, 98,
-228,175, 65,173, 98, 96,193, 10,161,227, 73, 56, 42, 26,224, 25, 93, 88, 11, 59, 71, 81, 31,242,136, 9,196,116,232, 74, 94,130,
-206, 20, 76, 88, 57,207,133,205,147,208,225,229,204,171,153, 43,178,151, 44,210, 65,156,236,146, 33, 92,224, 74,150,141,242, 73,
- 87,136,184, 97, 92, 79, 84,121,149,219, 92,183, 80,161,100, 1,243, 80, 57, 55,159, 50, 79,116,114, 27, 5, 33,147,156,107,195,
-211,206, 7,219, 32,144,106,133, 68,128,148,169,203,219,167, 94,179,221, 70,191,223,116, 82,200,206,219,228, 83,126,122, 43, 91,
-126,108,197,164, 94, 41,192,117,108,208, 76,120, 69,155, 98,169, 62,250,190,168,181,114, 89,134,139, 31,151, 72, 94,248,235,240,
-209,126,242,195, 56,206,121, 14,238,141,138,254,250,182,204,102,158,194,203, 52,198, 24, 22, 63, 93,162,116, 77,104,195, 53,156,
-107, 5,169, 34, 24,159,115, 76,172, 87, 61, 8,231,206,164,177,146,131, 8,120, 61,202,148,250,119, 82,238,212,188,202, 9, 11,
-127, 79,239, 48,144,123,189,175,164,188, 49,117,189,183,164,177,178,156, 13, 57, 96,178, 60, 47, 45, 79,233,193,229,116, 25,201,
- 56, 9,227,237, 94,182,222,183, 3, 60, 60, 61,124,150, 12,133,189,126, 59,100, 43,207, 58, 38,179,175,188,248,200, 5,254, 10,
- 41, 56,151,135,204,101, 54,141,131,111,117, 39,247,114,146,119, 19,158,228,220,149,132, 46, 32,249, 84,228,147,221,175,115,144,
- 11,162,246,237, 34,190, 59,187,130,186, 63,229,212,154,206, 81,167,173, 39,229, 2, 41, 28,134, 69,123, 8,215, 29,192,139, 65,
- 99, 99,126, 0,115,249,215,253,121, 96, 3, 67,148,155, 64,118,120,109,150,230,166,244, 25,100,234,234, 58, 68, 31,212,126,214,
-201,214,115, 67,109,163, 42,195,112, 19, 37, 49, 81,174,145,186,174,106,131,229,101, 2,100, 93,214, 72,133,155, 15, 21,130, 46,
-109,186,109,206,191,152, 31,127,253,252,151, 61,255,238,239,131,217,212,188,135, 3, 0,253,134, 95,171,147,152,118, 34, 72, 51,
-136,158,161, 6, 72, 19,175,189,113,214, 5, 10,210,161,197,219,246,175,188,229,176, 65,162,159, 85,195,122,220,141,103,216, 99,
-126, 94, 33,101,172,228, 60, 11,128,199,167, 92,237,212, 62, 82, 1,127,250,229,251,207,191,125,177,111,235,241, 15,156, 82,212,
-147, 90, 68,133,133,235, 65,150,228,134, 5, 99, 1,137,230, 10, 20,240,148,183, 66,243, 32,147, 55, 79,147,223,243, 61,208,167,
-234, 11,119,151,174,195, 25,141, 16,184,125,224, 57,199,157,220,171,231, 28, 91, 86, 51, 39,152,100, 53,201,164,132,237,125, 12,
-243, 62,173, 84,185,113, 40,150, 15,253, 64,128, 79,208, 84,177,125, 77,211,216,160, 14, 92, 6, 46, 66, 95,124,220,130, 21,222,
- 3,198, 74,111,191,142,182, 37,249,154,209,201,201, 18,227, 8, 87,147, 22,103,102,175, 99, 84, 34, 86,110,112,162,175, 16,159,
- 53, 54, 98, 65, 71,184, 0, 60,193,185,201, 56,211,143,136, 30,177,177, 63, 92, 37, 72,151, 83,236, 32,253,240,225,115, 55,141,
- 69, 6,153,238,122,180,139, 92,183,199, 62,249,215,186, 1, 92, 71, 11, 48,251, 30,199,165,213, 30, 47,210,221,131,163,222,157,
-171,149,163,242, 9,110, 7,130,179, 9,129,154, 40,163,198, 39,144, 84,130, 37, 82,168,174,198,197,152, 98,149, 51, 1,106, 55,
-189,126,200,112,196,187,173, 19,116,174,151, 33,140,250, 56,230, 18,168,210,178,109, 17, 99,218,131,150,209,134, 18, 82,162,150,
-234,208,157,212,191,174, 78,204, 49,184, 21,220, 25,161, 45,119, 62,138,153,184, 82, 88, 28, 68, 11,196,175, 51, 97,183,161,123,
-133,119,231, 99,156,160,208, 97, 51,187,136,156,109,238,209,101,182,251,100,111,224,187,131,143,182,134, 32,104,188,206, 93,161,
- 51, 59, 91,104, 65,108, 64, 56, 58, 13, 63,152,118, 67, 44, 1,214, 71,222,191,182,186,173,229,110, 30,255,141, 33,249, 29,156,
-166,156,150,186,170,103, 61, 20, 40,159, 41,221,239,201,230,170, 38, 93,215, 67, 65,145, 68,253,229,222,155,204,202, 96, 34,100,
-190, 68,117,184,213, 31, 58,224, 15,146,218,166,140,247, 6, 56,192,233,254, 23,128, 99,115,201,141,220, 8,130,104,253, 88, 36,
- 91,211,250, 24, 3, 24,190,132, 1,195, 55,242,194, 43,239,124, 54, 31,199, 24, 47,199, 27, 89, 51, 77, 54,171,138,245,241,139,
-222,104, 33,168, 91,100, 85,102,100, 68,102,164,255,227,207,223,235,131,194,119,173, 35, 89, 13, 14,116, 8, 34,159,149,152,156,
-194,229, 97,195,170, 66,166, 54, 17,230, 67,206, 69,145,138,166,201,165, 76,115,156, 38, 89,237,229, 22,205, 86,158,119,178,156,
- 71, 41,100,248, 67,229, 43,100, 1,250,190,132,118, 63,228,192, 85,223,126, 1,241,229, 31,224,167, 24,172,236, 52,112, 90,254,
- 24,134, 62,212,234,135, 76, 19,247,131, 55,214, 22, 42,232, 30, 79,130, 3, 72,168,219,104,168,200, 62,185, 45,152,116,158, 10,
- 50,159,213, 15,235,103, 26,185, 82,147,203, 93, 86, 0,117,231,107,127, 55, 71, 62,111,100,196, 56,111,135,221,210,251,121,102,
- 5, 62,135,114, 70,184, 14,140, 75,166, 99, 53,104,154,100, 59, 49,225,225, 31,100,118,180, 87,174,184, 3, 95,238,205,174,148,
-229,137,231,250, 49,122, 75, 94, 63,191,182,249,149, 8, 89,151,100,158,120,225,117,214, 0, 90,227, 57, 78, 24,129,103,237, 83,
-205,190,222,251, 42,115,101, 44, 79,222,100,176,154,114, 92,247,189,185,131, 27, 30, 45, 33,153, 67,213,190,133, 31,231,247,239,
-220, 99, 67,126,219, 91, 58,142,179,212, 1, 62,143,180,223,182,140,222,105,217,182,195,165, 84,118, 34, 50,163,248,194,199, 73,
- 21,179, 93, 91,114,112,247, 50, 19, 45,155,213,120,133,247,183,147,159,206,205,212, 35, 21,123, 67,231,184,161, 25, 57,149, 5,
-178, 90,239, 16,216,195,100,109, 81,216, 38, 91,150,183, 51,159,110, 78, 57,230,246,213, 63, 35,127, 22, 19, 38,144, 76,189, 51,
-194,103, 94,250,117, 2,112,194,231, 18,204, 26, 22,128,234, 73,102, 89,119,129,215,143,167, 58, 1, 17,106, 57, 78,109, 50,207,
- 50,138,132,213,107,252,130,170,255, 68,153, 55,144, 33, 15, 78, 93, 73, 17, 15,141, 33,177,144,150, 67,158, 67, 98, 67, 54,161,
- 7, 87, 32, 97,155,150, 46,157,186, 88, 80,231, 35,202, 86, 99,160,206, 48,150,137, 58,210, 0, 50,141,103,144,114, 96,241, 4,
- 50, 94, 60, 9, 69,112,190,253,250,250,229,237,135,191, 40,138,218,155,206, 68,116,145,177, 7,242, 78,101,219,218, 32,195, 26,
- 53,148,215, 14, 34,160,106, 12,145,250, 94, 43, 95, 0,232, 22, 75,121,248, 23,128,154,103,130,121,161, 16,162, 11,123, 22,167,
-208,192,108, 52,191,107, 61, 70,158,139, 0,136, 33,178,138,123, 49,159,127,122,125,255,229,183,191, 95,126, 30,219, 63,243,104,
- 17, 82,229, 83,154,182,139,204, 12,225, 44,238,138,202, 11, 43,228, 37,183,165,187, 40,199,128, 7,179,229, 20,104, 26, 15,120,
- 24,103,207, 83,115,105, 46,154,200,119, 52,214, 60, 54, 46, 51,184, 21,209, 64,188,119,136,187,124, 30,185,106, 60, 93,151,230,
-189, 90, 0, 74, 46,241,164, 52, 27, 45,219,106,216,109,122,152, 6, 0,195,229,203, 15,188,236,167,239,203,241,204,183, 14,117,
-238, 53, 2,209, 12, 5, 49,115, 33,123,198,133,168,154,109, 80,243,231,101,226,193,156,182, 24, 31,235, 11,212, 75,148, 75,181,
- 97, 17,201,229, 31,217,126,117, 68,205,157,236, 60,220, 65,158,191,187,176,159,102,249,190, 34,135,239,211,114, 11,215,175,219,
- 37,151,182, 91, 53, 48,110,251,209,219, 99,117,169, 66, 2,150, 9,242,249, 24,195,153,158,150,211,109, 36, 74, 54, 0, 67, 56,
-218,136,107,179, 16, 78, 53, 80,157, 92,183,220,102,255,148,204,203, 20,111,192, 25,239,170, 75,206, 23, 83, 94, 71,168,183, 94,
-214, 84,229,204, 41, 90, 39, 40, 26,253, 57,173, 2,213,242,136, 42,116,135, 67, 31,197,181,219, 15, 3, 7,247,209,132, 29, 32,
- 59, 13,135, 4,145, 51, 47, 96,138,188,151,177, 4,158, 39,221,172,147,155, 15, 58,153,167,250,105,172, 35,109,163, 80,229, 34,
- 71,108,181, 64,144, 35,101,118, 68, 7,123, 9,132, 79,136,109, 49, 71,116,233,235,197,180, 18,174, 84, 1, 32, 48,205,115,140,
-189, 38, 17, 3,219,206,111,223, 56,209,216, 62,212,146,253, 15, 21, 13,146,134, 93,163,144,108, 63, 32, 55,135, 94,246,223, 48,
-108,142,246,136,119,190, 33,163, 97,169,175, 96,177, 61,144,120, 21,232,175, 31, 99, 62,108, 2,198, 75,165,254, 6, 10,168,150,
- 52,243,204, 47, 96, 9,169, 80, 8, 70, 18,229,158,246,201,203,161,121, 86, 27, 75, 47,238,168, 65, 94,225,122,144, 51,200,183,
- 41,252, 47, 0, 11,103,146, 28, 73, 13,133, 97,205, 82, 78, 85,110,232,232,222,176, 37, 2,174,196,165,185, 0, 23,160,193,118,
- 86, 85,106, 76, 13,252, 47,131,133,195, 14,135,189, 40,233, 13,255,247, 6,193, 44,116,255,191,178,206,105,112, 61, 19, 92, 90,
-131, 0,133,116,162, 20, 47, 96,249,116,173, 4,129,215, 58,156, 0,120, 73,181,238,138,195, 63, 97,159, 16, 69,149,170, 38,162,
-205,133,149,133,176, 86, 21,137,252, 14,243,131,132, 65,142,133,194, 80, 86,150,164, 1,243,206, 33, 90, 39,100,207,213,152, 66,
-214,117,226,147, 17, 21,179,107,204, 4,242,159,166, 83, 79,196,218,135, 18,111, 8,106, 10,226,216, 12,207, 2, 77,230, 23, 50,
- 71,193, 44,174, 12, 26,253,160, 55, 19,172, 61,107,148,231,142, 4,151,103, 46, 64, 67, 56,178,125, 26,145, 70,101, 52, 15,143,
-200,171, 90, 62,166, 79,151,210, 43,225, 42, 1,225, 79, 21,218,113,109,187,158, 1, 62, 52, 61,231,120,143,234, 56,199,141, 22,
- 50,144,184,196, 58,143, 64,224,106, 52,159,251, 28, 55,234,139,227,162,140,145, 68,220, 67, 63,123,186, 77,218,207, 28,104,251,
-134, 79, 15,147, 83,250,218,101,102, 6,103, 1, 32,132,122, 86,141, 26,138,144,102,192, 27,183,227,148,160, 30,122, 8, 69,208,
- 16, 8,135,236,150, 10, 62,195,124, 61,184, 29, 98,215, 87, 55,152,102, 81, 69, 18,175,179,129,176, 70,122,197, 92,162,176,189,
-208,155, 17, 34, 31, 61, 63, 78, 4,140, 86, 98, 65,116, 6,206,157,196,239,248, 71,121,228, 81,168,179,132,188, 90, 17, 61,227,
- 83, 88, 48,125, 23, 17, 40,121, 37, 91, 4, 78,122, 39, 66,224, 42, 42, 98,224,194,105, 90,199, 31, 18,118,209, 99,184, 87,168,
-103,104, 19,240,179, 98, 18, 6, 34, 45, 50,140,155, 62, 38,254, 69, 35,152,152,244,111, 54, 63,143, 7,136, 0, 48,205,134,243,
-208, 71,115,117,122, 70,132, 2,129, 42,225,122,187,102, 27,119, 42,115,150,159, 26, 55,147,230, 52, 8,141,224,210,169, 28,200,
- 69,160, 90, 72,143, 8,214,192, 50, 59,174, 82,232,245, 74, 5, 2, 39,238,151,215,130, 68, 1,233,155, 0,232,229, 92, 38,196,
- 1,173, 96,211,154,182,155, 25, 13, 53,195, 81, 19, 39, 25,127,117,224,134, 60,146,142, 58, 58,241,229,151,245, 79,216, 72,127,
-128, 66,193, 98, 84,113,101, 50, 8, 80, 30, 80, 1,231,141,112,226,105, 99,175,249, 1, 69, 98,225, 71,158,230,222,252, 86,213,
- 59, 12,188,197,202,164,207,252, 38,210, 78,205, 57,228,240, 1,116,238,176, 67, 32, 31,190,136, 71,224, 78, 72,120,166,181,251,
- 77,248, 34,183,111,155,248,253,143,191,221,111,249,248,107,161, 66, 7,201,117, 5, 5, 22, 87,218,108, 21,211, 17, 5, 95, 82,
-143,248,125, 51, 44,130,108, 26,181,201,170,163,173,253, 68, 51,254, 39, 93, 49, 50,156, 27,142,182, 52,149, 42,140,125,165, 92,
-157, 94,202, 65,246, 95,213, 39,233,184,238, 85,101, 27, 23, 42, 86, 75,176,100, 85, 30, 31, 10,128, 91,135,202,248, 65, 73, 18,
-179, 90, 82,153,213, 49, 83,171,144,109,169,107,164,161, 98,125, 87,233, 61,241, 80,237,198, 79, 24, 1, 40,213, 48,103,160, 61,
- 12,210,229, 42,161, 34, 84,164,214, 4,143,107, 91, 11,115, 78,195,194, 51,124,127,130, 98, 82, 94,143,130,235,255, 4, 59,151,
-155, 97, 27, 84,194, 55,195,126, 53, 98,185, 63,220, 36,103, 56,174, 70, 76,124,193,137, 39,195,247,177,125,250,239, 63,248,199,
- 63,197,254,104,249, 93,215,169,151, 37,125, 42,187,242, 24, 42, 29,128,217,100, 24,118,133, 3,227,112,202, 20,197,225,224,194,
-204,186, 42, 19, 14,112, 73, 75,134, 44, 24, 76,227,155,209,183,172, 62, 22, 29, 35, 12, 19,137,203,131,195,239, 27,254,142, 6,
- 64,173,170,167, 64, 86,109,101,238, 27, 2, 33,159,153,211, 33, 67,217, 35,121, 78, 13, 2, 84,244, 57,143,125,129,191,197,109,
-208, 19, 18,196, 17,118,162,229, 31,106,217, 57, 4,110, 64,220, 42,207, 23,205, 45,193,162,222, 86,232, 58,146,228, 84, 33,176,
-137, 61, 45,116,177, 15,184, 9, 68,101, 32,107,185, 30,129, 16,231, 6, 7,121,121,128, 4,244,201, 75, 6,155, 79,232,234,122,
- 24, 90,175, 23,119, 27, 41,231, 57,223,116, 98,112,184, 57,230,234, 96, 79,214,231, 8, 85,206, 3, 77,144,178,119,225, 97, 2,
- 55, 78, 13,184,243, 12,253,106,213,236, 25, 97,212,218, 21,194,238,176,135, 24,217,192, 47,184,130,152,200, 4, 56, 34, 56,173,
-175, 46, 3,233, 52,132, 26,196,227, 12, 77,194,232,229,138,226,159, 50, 68,179,193, 0, 4,149, 30, 21, 73, 46, 61,254, 19,128,
-132,115,219,145,157, 6,162,168, 29, 95,211, 73,122, 70,208, 28, 29,129,132,196, 3, 31,195,127,243,202, 63,112,121, 0, 13,231,
-244, 45,137, 47,177, 19,179,119,243, 60,154, 78, 98,151,171,214, 46, 87,149,134, 11,194,111, 26, 73, 45,214, 33,230,116,240,205,
-176,170,237,117,163,165,193,195,196, 45, 24, 1,171,249, 68, 4,250,117,114, 84,160, 26,128,130, 6, 1,110,204,166,104,112, 4,
-197, 24,167,165, 84,118,170, 34,160,194,221,115,136, 0, 60, 54, 92,133, 95,212,140,119,128, 10,204,218,193,153,157, 64, 75,172,
- 57,197, 63,101,142, 42,193, 27,242,154, 20,134,105, 21,251,225,225,224,199,193, 15,181, 3,158,199,198,212, 45, 94, 43,176, 56,
- 57, 99, 61,124, 22,136,221,208, 48,106,107,199, 10,147,199, 7,111, 32,209,184,234, 0, 32,134, 2,192,201,225, 56,153, 52,251,
- 34,238, 54, 93,135,231, 77, 13,218, 36, 23,245,204, 58, 17, 37, 99, 10, 50, 65,117, 54, 38,159,114,218,142,209,232, 80, 6,236,
-252, 69,251,142, 93, 39, 64,154, 11,128,222, 13,131, 59,175, 93,242,210, 58,123, 18,211,132,111, 56,181,161, 76,123,223, 12,112,
-164,140,160, 39,118,245, 12, 96, 13,176, 4,214,227, 48, 59,133,188, 60,107,153,161, 69,246, 98, 73,164,144,142,155,141, 71, 48,
- 93,130,214,218,213, 94, 35, 48, 16, 11, 91, 73,164,136,156,199, 81, 34,188, 52, 47,102,152, 13,232,216, 68,204,190,139,150,194,
-174,230,175,188,207,201, 32,178,131,164,246,132,108,126, 40,216,231,158, 68, 91,128, 28,109,129,126,247, 77, 69,136, 33,108, 13,
-246,161,177,180,188, 23,219,195,240,105,120, 6,226, 13, 83,238, 5,212, 50,237, 38,179,112,233, 24,122,121, 30,234,253, 41, 62,
- 76,241,216, 32, 44,107,229,223, 42, 32,200,151, 51, 52,118,110,192, 91,245,201, 12,174,218,183, 61, 47,236,176,243,178,189,218,
- 31, 2,194, 58, 80,175,230,206,184, 74, 8,211,163,245,130,117,239,208,180, 93, 7,160,149, 71, 96, 89,129, 24,203,255,245, 86,
-120, 45, 78,224, 81,164,114,196,215,215, 24, 9,200, 80,216,179,209,128, 80, 72, 52,166,136, 61,120,155,114, 78, 60,245, 49,180,
- 22, 14, 68, 49, 44,140,101,114, 16, 86,214,247,208, 30,189,120, 10,109, 33, 7,237,250,118,241,155,114,191,229,249,177, 87, 38,
-234, 21,111,225, 25, 17,240,157,117,197,111, 65,217,137,227,174, 43,171, 10, 27,104, 39, 72, 94,206,167,185,197,208,236,178, 67,
- 55,109,155,242,208, 31, 21, 14, 77, 36,240,238, 0,226, 1, 93, 51,128, 99, 93,165,175,173, 23,181,178, 56, 13,167, 0,135, 87,
-201, 44,237,251, 63,223,255,114,255,248,189,151, 87,101,166,199, 6,103, 80,224, 58, 13, 95, 83, 26, 35, 62,191, 57, 41, 87, 54,
-200, 1,113, 44,192,113,110,222,177, 92, 29, 10, 77,246,223, 58, 29,146, 62,183, 46,104, 68, 36, 96, 42,152, 97,110,250, 51,172,
-229,200,237,240,221, 26,225, 87, 14,139, 71, 23, 96,240, 94, 54, 93, 88,191,192, 74, 58,232, 79, 15,123, 19,155, 74, 1,178, 18,
-210,148,245,108,229, 75, 57,220,121, 4, 53, 45,128, 22,165, 17, 56, 44,124,203,119,236,212,235, 70,147,129, 5, 43,115,219,253,
-224, 31,214,111, 9,220,179,251,168, 24, 21, 52, 96, 88,245,216,178,226, 43,115, 56, 41,119, 94, 99, 31,238,155,206,217,247,221,
-219,197,185, 31,166,229,231,111, 30,159,222, 63, 84,255,231,171,198,252,198, 46,194,180,242,208,239, 69, 76,240, 55, 19, 83,248,
-199, 69, 40, 4,146, 31,159,215,159,126,253,250,254,199,253,252, 87,180, 70,167, 49, 50,149, 27,212,223,112,112,202,184,147,132,
- 19,194,137, 75,173, 65,201,219,186, 55,159, 35,171,176,112, 76,244,122, 21,163,115,201,123, 8, 77,101, 50,171, 61, 22, 56,157,
-221,192, 13, 62,183, 96,153, 98, 58, 85, 21,234,158, 84,235, 17,253,103,169, 82,217, 57,250,192,164, 45,193,167, 97,113,110,216,
-132, 9, 20, 23,128, 75, 39,232,223,230, 17,248,174,157, 92,235,129, 80, 91,157, 83,169,221,194, 58, 34, 50, 6, 14,137, 56, 66,
-147, 56,104,188, 69,131,145, 79,207, 8, 33,217, 77, 35, 16,148,195,160, 44,123,187,100,100,103,217,220, 78, 61, 92,142,223,130,
-236,101, 58, 75,102,255,216,160, 80,241,116,104,145, 46,180,246,101, 44,110,134,234,215, 65,201, 50, 3, 59,110,157, 36,170,242,
-142, 63,234,210, 71,102,233, 74, 93,254,165,172, 57,179,108,178, 24, 39,151, 33,139,171, 0, 65, 0, 58,181,199, 98,113, 20,213,
- 1,105, 17, 27, 7,232,188,244, 1, 28, 96,219, 88,131, 8, 61, 86, 34,155,147, 84, 16,208,160, 15,225,247,147, 56, 7,216,112,
-186, 75, 54,230, 25, 15,158,214,255, 9, 64,194,149,235, 56,110, 68,193,190,201, 38,117,140, 48,192, 2, 78, 12, 7, 14, 28,250,
- 59,252,231, 78, 12,195,233, 38, 62, 0, 47,176,216, 25,105, 72,241,232,219, 85,116, 46, 17,100,247,123,175,170,222, 5, 85, 0,
-210,145,184,172, 5,212,168,178,253, 10,198,197, 84, 5, 68,245, 49, 68, 74,162,196,162, 88,132,121, 59, 9,174, 40, 86,104,136,
-182,141,242,144, 61, 44, 37, 53,156,207,198, 68, 34, 12,114,171, 71,165, 20,110,229, 69, 0,203,232, 82,195, 21, 61,107, 63, 2,
-170,116, 97,102,214,112,167, 12,162, 85,159,171, 6,125,207, 61,164, 15,215,205,128,224, 28,112, 4, 76,208, 77,191,215,185,152,
-221, 52,235, 50,107,142,172, 96,228,147,226, 44, 21,235, 21,112,161,196,174, 56,232,110,238, 45,171, 29,162, 77, 73, 9,170,144,
- 57,217, 6,245, 40,210, 22,175,109,218,192,227, 91, 60,113, 10,175, 2, 10,238, 28, 36, 74,160,175,177, 76,109,143, 98,142, 99,
-185,125,189, 44,103,132,221,102,220,224,158, 32,184,243,243,197, 14,254, 50, 36,216,221,171, 88,246,100,125,239,112, 88, 64, 38,
- 29,111,184, 66,109,237, 58,216,161,137, 91, 62, 35,220, 62, 21,132,150,235,160,185, 28, 51,191,153, 61,219,172,102, 67, 52, 71,
-105,149, 94,218, 81, 86,174,112, 26, 49, 65,128,180, 96, 67, 0, 72,215, 44,174, 73, 78,187,154,196, 14, 6, 33,192, 34,149, 80,
- 99, 74, 15, 78,207, 33,232, 73,169,186,123, 94, 87, 4,150,174,249,206,238,247, 77,108, 13,193,202, 50,103, 81, 63, 88, 98,104,
- 3,171,107,237, 27, 91, 85,211,148, 19,200,167,142, 92,237, 6,223, 86,129,125, 97,108, 77,136, 34, 4,169, 60,190,136,157,203,
-192,159,213, 2,199,202, 60,181, 52, 48, 73, 14,242,103,231,106, 47,154,139, 88,106,112,221,214,195,106, 54, 5,218, 51, 56,246,
- 22,121, 48,199,237,192,157,123,202, 87,223,148,217, 94,161,158,114,201, 3,247, 60, 41, 48, 21, 28,239,112,206,220, 35, 35,205,
-135,209,190, 10,220,202,145,234,227,158, 8,246,110,227, 60, 88, 15,206, 14,154,131,163,177, 10, 63,101,211, 25, 62,182,228,181,
-178,153, 42,197,214, 76, 26, 3, 51,222, 11,161, 31, 44,182,224,223,125,107,110,209, 51, 94, 21,134, 8,139,194, 37,202,189, 89,
- 59, 75,113,251,225,250,151,200,255,212, 71,211,199,182, 25, 1, 42, 96, 99,218,135, 58, 87, 18, 35, 21,202,163, 19, 44,232,165,
-188, 36,224, 94,102,131, 89,254,248, 90,234, 19,210, 88,153,202, 94,159,218,113, 40,247,114,213, 43, 68,212, 92,240,112,215, 7,
-192, 73,238,217, 77,238,246, 67,100,114, 8, 80, 20, 31, 95, 62,229, 52,135, 55,112, 96,163,157, 58, 23,166, 46,223, 64,111, 1,
- 62,146, 88,158, 4, 24, 23,123,222, 91,231,225,226,124, 50,156,172, 6,173, 96,207, 74, 1,220,194, 46,225,164, 15, 13,237,134,
-104, 57,121,208, 81, 85,125, 89,152,189, 53,230,166,245, 4,122, 4, 2,148,212, 90, 2,236,198, 90, 78,239, 69, 3, 4, 19, 26,
-177,154,115, 63, 77,244,156, 88, 41,236, 34,213,126, 24, 57,121,191,128,197, 12, 78,246, 77,108, 47,220, 25,200,225,231, 23,119,
-158,243,253, 33,149, 59,246, 1,165,232,168,197, 3, 23,134,116, 94,204,169, 67, 20,236,155,119,220,132, 17, 67,131,239,138, 37,
-140,167,120,250, 52,156,126,188,108,223, 95, 63,191, 94,222, 69,247,135,200, 59, 56,243,246,248,128, 24,130, 15,231,216,183,128,
-232, 17,219,236, 98,216,248, 96, 14,218,126,129, 13,117,227,159,151,241,215, 95, 94,207,226,246,211,111,203,207,191,127,251,238,
-139,152,166,116,191,169, 43, 71, 95,107,177,160,132, 80,154,161,203,134, 9,241, 34,238, 77, 0, 98,253, 12,133,177, 93,189,129,
- 94, 50,243, 54,154,244, 60,139, 75,146, 31, 96, 13,224, 69,189, 85,130,211,242,222, 2, 11, 61, 46,122,177, 9,250,121, 1,135,
-242,160, 45,176, 11,233,193,101,124,134,238, 59,129, 43,252,139,187,181, 89,154,122,122, 62, 76, 25,158,162,107, 91, 27, 35,226,
-180,130,104, 6,200,251,186,227,117,206,220,204,100,225,192,176, 28, 3, 5, 92,182,184,166,197, 27,179,207,107,252,191,230, 94,
-161,149, 74,241, 62,190,131,119, 69, 55,176, 85,223,132, 29,130,254,173,139,118,223,109,160,239,193, 23, 74,212,121,245,127, 43,
-183, 10, 49, 36,141,191, 33, 20, 84,118, 12, 42,203,158,102,142,173, 6, 73, 45, 72,122, 86,133,156, 87,178, 92,186, 39,235,248,
- 48,131,202,245,106,118,226, 26, 69,105, 19,236,121, 99,131, 95,168,201,176, 8,217, 16,103,131,118,157,143, 0, 20, 41,192, 24,
- 66,234,206,166,159,119, 13, 98, 6, 84,200,195,192, 84, 8,222,108,133, 36,249, 79, 0, 18,174,101, 71,110, 27, 8,138, 47, 81,
-210, 60, 22,222, 0, 78, 28, 4,190, 4, 57, 4,240, 23,248,143,114,200, 37, 31,152, 63,136,237,115,128, 92,227, 56,139,221, 85,
- 86, 18, 69,178, 69, 50, 85,227,219, 96, 46, 51, 32,217,213, 85,221, 93,109,126,253,237, 23,142,199,224,208,216, 16, 3,185, 18,
- 13,156,131,118,131, 56, 3,161,166,203,148,171,232, 60,125, 79, 14,202,197,176, 18,213,235,178, 66, 84, 11,185,152,110,220, 45,
-101, 32, 57, 71, 58, 19, 53,235,151,160, 62,202, 15,236, 51, 52,150,177, 89,123,133, 60,231, 16, 20,112, 0,193,138, 20,130,144,
-192,119, 44,225,179,142,200,169, 6,203,121, 52,205, 81,202,106,232,123, 68,176, 70,228, 39, 2, 63, 37,185,198,147,101, 91,131,
-209, 83, 51,110, 45, 32, 92,196,129,192,127, 70, 8, 71, 92, 10,125, 39,102, 9,235,150, 18, 5,103,139,245,153,171,202,186,212,
-214,150,234, 54, 63,108, 32,173, 46,184, 16,194,146,148,131, 66,211,224,131,234,220, 39,117,214,130,232,240,223, 76,144,112, 3,
-100,135,190,191, 55, 0, 61,127, 54,208,183, 89,159,169, 58,140,102, 1, 30,196, 98,220,223, 92,174, 83,187, 72, 91,197,203,212,
-227,180, 7, 36,168,219, 40,241,192,185,162,178,226, 36,187,219,206,146,194,137, 11, 80,174,160,106, 22, 93,165,239, 23, 25,175,
- 6,103,135,252,189, 65,128, 68,228,234, 89,197,176,113, 5,154, 74, 32,100, 72,220, 81,184,102,239, 56,242, 19, 13,200,219, 24,
-186, 97,235,238, 66,121,194, 89, 59, 78, 85, 54, 54,131,241,192,108,205,105, 89,192,226, 41, 58,251, 10,180, 49,252,225, 72, 32,
-150,171,118,185,173, 79,156,247, 99,203, 27,200, 91,148, 21,156, 33, 46,141,229, 68,203,198, 33,253, 10, 28,162,192, 91,179,246,
-228, 0, 43, 5,234,249, 34,163,128,240,143,128, 22, 96, 68,179, 72,192,119,122,183,126, 12,229,112,102,154, 32, 94,188,188, 64,
-252,156,160,222, 6,170,183, 9, 68, 23, 55,237,185,196,233,164,250,158,143, 70, 95,181,241, 68,243,148,189,127,118,236, 80,246,
-192,234,131,109,116, 11,194,207,241,215,228,144,158,133,166, 71, 68,162, 7,101, 53,133,237, 49, 65, 0,118,128, 47,182,181,144,
-212, 21, 13, 13,197, 67,199,181,209,152,229,220,162,165,163,205, 81,114,150, 31,127,126,253, 97,200, 31,142,253,204,225,169, 0,
-240,166, 23, 19,202,168,205,165,188,184, 3,124, 99,230, 24,119,123,206, 8,202, 48,187,135,199,146,215, 67, 54,235,132,158, 6,
-114, 93,110, 62, 3,179,231, 56, 43,148,198, 5, 33,225,187,152, 42, 23, 84,114, 57, 16,152,115,211,158, 67, 8,221, 72,143,182,
-235, 43,238,175,255,225,221,103,121,229,234,170,218, 64,115, 17,100, 36, 91,148, 18, 57,189, 57,237,116,167, 24, 22,137,193,207,
- 65, 65,153, 58,149, 25, 64, 77,146, 72,132, 64,225, 92, 81, 15,193,163,226,193, 5,136, 69, 29, 19, 5,116,202,116,126,137,205,
-245, 82,185,197, 17,112,213, 44,254, 34,219, 6,201,120,208,144, 9, 58,196,109, 44,191, 59, 16, 84,163,149,189,217,183,240,214,
- 41, 90,242, 52,248,175, 38,113, 11,218,115,108,236,174,101, 40, 26, 7, 26, 86,112,240, 11,135, 98,110,146,166,245,137,231,156,
-238, 78,200,187,230, 86,155,144, 11, 80,180,147,239,190, 29,239,223,191,254,247,253,219,223,223,188,250, 56, 13,127,148,252, 87,
- 0,185,216,179,108, 36,109, 26,175, 84,216,214, 53,160,147,136,237,102, 17,113, 93,192, 51, 47, 32, 99,235, 90,231,199, 48,127,
- 89,255,249,243,177,125,249,251, 39,253,233,221,245,191,187,251,239,103,121,251, 98,215, 20,247,150,183,131,195,155,213,184, 61,
-225, 77, 0, 92,141,137,131, 54,137, 35, 42,149, 43,226, 58,226, 2, 50,226,144, 12, 95,167,121, 80,147,178,160,247,243, 84, 77,
-204, 16,151,169,136,207,177, 64,183,191, 0,108, 21,125, 70,146, 73, 53,192, 72, 65,232,148, 25, 23,181,112, 65, 21,239,205, 65,
-184, 32,141,145,128,226,227,117,105,135,155,138, 28, 0,106, 72,137,253, 18, 70,124, 17,151,156,194,120,148,141, 70, 30, 93, 31,
-247,245,196, 29,179,129,235, 78, 33, 81,199, 24,186, 62,100, 71,234, 78,151, 25,119, 33,129,146, 17,104,172,208, 32,205,201,110,
-123,236,161,236, 59,237, 75, 89,135,103,208,134, 32, 92,220, 40,156,157,234, 86,240, 73, 8, 40,201, 37, 32, 32,211,154,185,104,
- 79,235, 13,175, 52,113, 7,146, 93,219,145,217,130, 4,220, 87, 8, 27,208,178,200,189, 1, 0,203,206,210, 81,132,155, 30, 82,
-223,196,224,222, 21, 30,254,224,236,248,117,201,207,152,123,174,236,104,189,159, 38,165,161, 73, 32, 40,110, 30,149,255, 5,224,
-224,202,149, 36,169,161,160, 84, 58,171,186,122,102,182,153,128,192, 33,192,193,192,192,230,167,246,247,248,138, 53,193, 97,141,
- 37, 2,139, 24,118,102,250, 40, 73,165,147,204,246,251,168, 80, 73,121,232,189,151,154,111,135,184,196,188, 6,246, 25, 9,206,
- 67,220,205, 0,167,190, 57, 53, 7, 56,214, 61, 66,111,179, 8,203,158, 35, 22,189,196, 12, 27,167, 56,162,146,170,169,204,236,
- 99,228, 47, 43, 81, 0,104,206, 42,137,192,212, 87, 16, 31,207,200,226, 89, 16,158, 26, 7,249,140,185,103, 61, 42, 70,168,101,
-182,168, 9,124,192,245,102, 51,251,221,184, 91, 92,197, 18, 38, 80, 28, 8,217,114, 70, 44,177,163, 80,249, 5, 52, 16,160,229,
-147, 52, 13,190,247,206, 61,113,248,240,220, 25, 20, 10, 27, 92, 74,175, 64, 8,223,177,201, 98,217,251, 5,134, 29,107,179,215,
-226,183, 28, 28, 47, 50, 22,240, 40, 92,135,197,231,165,191,226,231,100,116,251, 17,104, 12, 92,124, 26,249,128, 63, 89,117,217,
-253, 42,118, 96, 49,118,214,123, 20,199, 7,168,121, 8, 47,241, 8,112,157, 52,132,124,236,140, 57, 92,237,179,112, 46,183, 91,
-151,218, 41,192, 38,156, 75,198,174,100,131,212,240,236,114, 99,150,198, 21,144,181, 73,194, 1, 11,254, 32,219, 4,251,153,106,
-194, 27,236,134,149,192,200, 30,104, 54,145,130,123,177,206, 50, 89, 17,240,241, 51, 54, 5,100,177,155,226, 2, 62,251,111,234,
-254,156,167, 69, 38,200,226,170,176,130, 57, 97,117, 39,187, 84, 13,248,129, 44,102,214,107,139,195, 94, 59,243,224,232, 87, 2,
- 51, 35,236,163,101, 55,169,132,143, 96,114,104,239,173,130,111, 97,135,101, 82, 76, 0,161,215, 59, 75,185, 64, 14,172, 34,156,
-247,182,216, 61,141,155,232,246, 4,157,106, 22,160,174,165, 4, 31,118, 94, 68, 62,158,128, 53, 94,115,189,170, 59,136, 89,225,
-171,254,182, 28, 30,176,151,124,210,237,177,138,172,198,219, 40,199, 44, 23,238,214, 41, 10,243,237, 0,189,202, 83, 99,196, 10,
- 71, 33, 20, 11,176,101, 84, 40,215,220, 52, 25,208, 36, 59, 25,154, 23,149,216, 76, 7,251, 1,133,127,191, 59,231,220, 98, 24,
-110,146,108, 92,150, 5,194, 19, 26, 31,228,166,247, 81,102, 6, 37,201, 31,150,243,163,254,212, 94,119, 29, 12,220, 11,246, 11,
-116, 7, 47, 96,207,140, 34,102,137,234,181,139, 51,187,248, 46,213,169,125,202, 45,143,247,110,134,118,154,215,175,121,215, 49,
-229,114,192,162, 48,165,229,245, 61, 47,139,165,223,151,227,248,192, 50,110,194,202, 24, 22,240,103,210,151,104,145, 3,103,102,
-181,209,231,211,191,191,159,158, 62,190,245,203,218,170,101, 41, 48,170,234, 55,118,176, 11,175,174, 25,128,196,113, 7,222, 74,
- 21, 83, 90, 1,174,235, 91, 81,244,180,162, 63,201,123,163, 96, 22,213,108, 32, 24,133, 71, 19, 75, 96,188,163, 62, 10, 50,207,
- 89, 28,111, 44, 6,170,185,126,191,139, 43,220,221, 81, 51,199, 37,177, 7,104, 24, 93,119,112,132,244, 0,129,121,158, 25, 4,
- 45,146,199,147,225, 37, 65,158,239, 9,206, 56, 40, 14,252, 67,179,231, 56,169,177,194, 25, 2,209,241, 32,115,103,164,149,131,
-130, 99,178, 21,176, 48, 38, 1,143, 17, 55,209,143, 98,254,197,171,111,158,255,249,233,233,207,105,250,187,165, 75,220,223,240,
-111,114, 58, 40, 28,210,216, 45,118,181,101,181,122,223, 56, 36, 2, 78, 10,176,211, 47,188, 1,212,173,151,160,247,110,219, 86,
-148, 51, 49,195, 66,165,203, 75,254,235,115, 63, 62,124,253,241,215, 47,223,185,223, 62,185,159,255,216,158,206,254,245, 67,142,
- 48, 33, 26,186, 32,195, 54,232,192,206,142, 81,242,116,192, 98,105, 28, 95,231,237, 86,189,218,226,135,171, 54,143, 38,156, 82,
-132,152,216,234,161,173,131,153,101,137,158,208,232,103, 37, 2,232,222,149,114, 91, 94, 6,195,202,154, 19,135, 50,105, 43,134,
- 79, 30, 72, 84, 46,125,241,151, 12,196,114, 48,215, 55,156,132,114, 91,117, 51,217, 64,108,205,212,230,229, 22, 47,195,123,219,
-190, 70, 23, 53, 77,140,173, 89, 28,120,203,231, 69, 14, 28,165, 5, 2,226,192, 58,172,228, 10, 80, 74,253, 82,216, 4, 48,221,
-219,144,163,174, 86,199,138,135, 18,160, 75, 29, 56, 23,212, 64, 60, 21, 78,173, 0, 19, 57, 72, 0,203,218,235,189,111, 44,205,
- 5, 38, 45,156,149,243, 56,181, 59, 78,193, 56,224, 8, 20, 25, 57,105, 84, 59,183,134,103,119,129,103, 32,164,181, 90,115, 66,
-172, 57,142, 33,136,174, 21,203, 4,196, 93, 24, 70,124, 13,158,187,118,239,156,108,247, 89, 84,168,249, 20, 64, 11, 97,181,164,
- 22, 61,175,237,127, 1, 56,186,118,229, 72,138, 32,216,211,207,121,237, 74,183, 18, 58,131,224, 17, 65,240, 9,231,225,225,240,
-197,124, 6, 96, 0, 14, 17,156,197,157,115,122,236,238,244,246,244,244,139,204,137,144, 41,173, 54,166,171,171, 50,171,178,114,
-240,247,200, 70,203, 34, 7,154,212, 42,142, 74,213,174,103,167,108, 14,177,134,159,156, 2, 7,175,109,208,184, 90,120,146,212,
-165, 89, 48, 57, 83,184,192, 18, 64,199, 53, 59,113, 72,247, 5,100, 77, 45, 74, 70,106,108, 80, 95, 40, 24, 4,138, 10,149,179,
- 34,154,157,181, 91,166,140, 61, 51, 86,168,151, 56,236,109,247,213, 81, 80,101, 29, 32, 97,185,222, 53,187,111,241, 91, 46,225,
- 83, 66, 98, 65,252,240,196, 91,244,190,210,196, 18,119, 62, 74, 7,224,139,218, 41,163, 88, 13,254,149, 91, 0, 38,145, 69,131,
-225, 30, 68, 90,229, 91,162,157, 91, 77, 30, 25,145, 6,130,207, 0, 44,202, 2, 37,198,112, 67,113,174,174, 71,226,201,106,235,
-135, 67, 64, 28, 28,132, 89, 64, 7,231,142, 3, 67,211,163,224,167, 25,223,158,224, 84,186,238,221,177, 39, 7,198,117,153,186,
-131,197,117, 61, 74,214, 39,238,250, 37,210,115,197,225,176,116, 8, 41,214, 24, 35, 99, 50, 56, 15,164,136,194, 76, 4,164,187,
-129, 52, 80,128, 77,187,173, 5, 71, 86,162, 5, 36,117, 33,236,150,227,242,170, 17, 37,246,218,186, 62, 92,134, 80, 47, 52,108,
-231, 68,167, 69, 36,254, 85, 77, 77,189,218,193,151,235,185, 0,149,153, 4,220, 50,214, 94,178,119,217,217,122,211,231, 75, 2,
-183, 73,186,243, 5,245,103, 59, 40,185, 2,251,187, 28, 19, 87, 47,218, 88,234,133,151,135, 68, 2, 21, 86, 57,167,169, 97,109,
-165, 91,199, 90,111, 82, 37,101, 1, 60, 52, 23, 36, 59,109,103, 43,248,233, 39,164, 13, 81, 54, 18,133, 97, 5,165, 78,247,128,
- 37, 45,159,181,187,223,250,195, 6,202,146,183, 19, 23,134, 71,196,133, 8,131,246, 87, 63,222, 83,214,145,181, 58,212,110,208,
-141,115, 50,105,150,170, 44, 5,180,245, 57,117, 94,131,158,231,158, 14,251, 40,137, 92, 54,176, 77,115,109,146,111, 24,168,117,
- 81, 55,145, 6, 43,174,224,217, 20, 10, 54,252, 14, 18,113,222, 10, 93,111,145,128, 3,199,156, 59,207, 83,236,152,198, 24, 94,
-183,199,111,223,225, 74,188,198,165,239,184,241, 19, 43, 8,230, 91, 3,216, 18, 87,182,128,114, 6,152,239,169,122,124,238,168,
-201,252,178,238, 43,193, 14,181,111,234, 37, 10,224,220, 47,184,121, 38,236,182,166,220,233,165,181, 67,192,173, 70,142,194,183,
- 3, 76,123, 24,204, 64, 33,125,202, 52, 12, 4,173, 86,115, 39,173,157,167,160,204, 31, 63,116,127,253,174,190, 55,234, 99, 43,
- 51, 77,195,204, 90, 37, 91, 50, 97,175, 77, 75, 70,233, 56,132, 58,142,193,221,187,225, 65, 77,119,197, 79, 86,124,217,112, 97,
-132,143,175,183,219, 18,134,122,140, 96,162,169, 71,206,205,110,139,115,234,103,160,189, 97, 95, 24,212,109,140, 49, 14,174,243,
- 29, 5,195, 73, 0,141, 82, 11,207,118,174, 41,149,142,244,158,184, 12,209, 93,204,157, 64,220,121, 90,238,153, 13, 64, 97,171,
- 15, 58, 28, 79, 15,233, 52,109,223, 77,231,227,244, 89,207,111, 66,188,113, 3,157,157, 38,207,221, 21,241, 30, 33,243,233,249,
-225,223,243,211,146,202,135,247,127, 63, 29,126, 19,229,115,105,103,174,209, 33,178,237,204,122,155,169,144,239, 94, 76, 88, 74,
- 22, 75,190, 0,226, 68, 54,161,100,232,150, 81,127,218,252, 84, 26,120,224,117,141,100, 32,101,187,200,149, 18,165,137,227,237,
-109,243, 47,203,242,241,207,199,211, 63, 63,253,252,225,199,111,126,249,117,249,250,229,229,191,221, 79, 36, 82, 92, 7,246, 57,
-107,115, 3, 51, 59, 91,149, 28,197,115,114,247, 18,231, 91, 40, 4,227, 1,113,103,110,124,251,131,119,237, 14, 56, 98,106,120,
-178, 34,104, 80, 88,148,209,112, 81,122,110, 95, 33,122,154, 19, 41,102,229, 1,241,243,104, 59,100,221, 52,187, 23, 14,242,173,
- 88,113,162, 25,168,255, 82,197, 35, 40,123, 76,244, 63,179,186, 82,249,125,219,128,112,143,118, 98,107, 57,111,217,134,115, 28,
-213,243,234,165,241, 18, 37,160, 0,224, 22, 85,222, 50, 74,150, 93, 0, 69, 27, 78,205, 93,162,117,213, 7,190, 77,160,187, 33,
- 80,104, 76,190,208, 29,101, 53,116,152, 42,155,191,176,235,199, 21, 29, 16,208,208,174,136, 12, 17,146,177,122,202,178, 6,191,
- 77, 72,110, 67,236,134,222, 46,130,102, 19,102, 95,139,204,244,111,210, 56,223,161, 71, 42, 45, 22,151,165,167, 61, 79, 3, 89,
-229, 58,180,234, 53, 0, 0, 17,161, 5,223, 84,108, 97, 38,100, 41, 17,181, 65, 20,128, 59,107, 97,184, 10,252, 4,174,225,255,
- 23,128,163,107,103,142,164, 6,131,122,206,115,215,187, 94, 67,113,118,149, 19, 32, 39,185,140, 4, 18,254, 57, 20, 69, 74, 0,
-129,169,186,224,224,224,238,252,218, 29,205, 72,163, 23,221,147,187,236,181,164,239,235,110,233,235, 94, 32, 25,250,156,229,116,
- 0,243, 98,122,166,173,160, 72,240, 9,150,100, 32, 10,196,226,105,105,173, 59,190, 72,145, 44, 4, 38,112, 98,213,123, 27,101,
- 64, 65, 25,174,122,161, 61,149, 15,104, 51,127,119, 50, 25, 13,187,213,188,145,129, 40, 50,164,167,154,247,175, 58, 38,240, 61,
- 72, 4,205, 41, 59,252,216,108,192, 65,177,205, 80,245,226, 21,173, 94, 87,123, 1, 66,136,120,197, 20,215,224, 10, 40, 21,115,
-229, 37, 35,170,183, 43, 30, 61,173, 43,143, 93, 66,243, 4,100,214,137, 89,187,104,213, 52,176,154, 69,120,175, 28,223,163,167,
-146,191,148,221, 83,153,132, 3, 78,151,197, 7, 32, 12,157, 67,189, 50,188, 10,224, 0, 52,122,145,117, 86, 12,245,128,138,193,
- 62, 28,142,236, 39, 13,167,178,134,178, 31, 71, 14,127, 55, 3, 22, 45,107,203,120,146,214,208,165, 11,229, 35,115, 71,235, 74,
-107, 56,106,211,218,186, 77, 22,209,161, 12,144,173, 13,227,229, 25,118,163, 54, 87,140, 77,129,198,242, 8,146,197,176, 54,231,
-104,115, 19,213, 1,177, 34,168, 46,192,242,153,195,106,232, 52, 42,227,204,241, 26, 69, 44,124, 33, 67,237,166,147,241, 79,103,
-239, 34,159,140, 79,153,193,158,193, 66,119,172, 61,189, 67,232,144,178, 17, 17,156,116, 4, 92,144,150,171,152, 73, 34, 26,170,
- 40, 80,246,190, 84,126,148,149,118, 14, 58,127,193,223,131, 2,116,114,212,136,115,127,212,127, 45,173,237, 32, 13,161,229, 70,
-166,149,121, 18,128, 98, 14, 91, 97,129, 33, 3, 57, 64,198,231, 25,125, 1, 59,232,186,193,116,217,134,207,141, 29,228,126, 7,
-134,210,153, 4,120, 91,116,208, 16,245,227, 22, 24, 15,168, 97, 35,106, 56, 25, 15,218,111,105, 68, 51,182,102,232,192,196,123,
- 33, 2, 13,239, 56,163,152,149, 97,224, 55, 45,226, 6, 4, 51, 52,153,194, 19, 71,113,173,166, 79, 88, 26, 94,178, 41,236, 88,
-192,191,212,120,178,103,170, 98, 47,230, 86,170,125, 69,203, 31,119,233,205,215,230, 55, 17,223,235,104,233, 40,197, 31,112,155,
- 27, 67,160,240,103, 6,233,188,236, 64,146, 80,204,169, 22,236, 59,141,174,133,217,247, 10,148,227, 92, 21, 54,124,188,173,111,
-127,210,237,177,116,246, 42,253,215,125,250,187,254,243,224, 63, 60, 22,224,167,206,109,111,105,227,168,156, 94, 64,145,115,246,
-187, 27, 64,143,193, 52,116, 60, 84, 39,190, 26,126,185,214,223, 94,242,161, 15,207,121,180,140,157,128,152, 15,209,173,216,237,
-225,102,119,125, 47,119,119, 55,225,182, 61,203, 30,202,255,211, 22, 40,220, 9,124, 14, 51, 66, 14,205,243,205, 59,151, 31, 62,
-196,143,114,126, 49,151,110,160,212, 1,185, 18,116, 29,149,201,172,199,194,231,136,220,238, 7,180, 75,200, 42,101, 23,244, 81,
- 99,139,212,107, 35, 15, 80, 55,121, 56,132,180,226, 52, 27,112,235,228,113, 90, 5, 32,189,189,107,186,251, 47, 46, 71,243,235,
-245,233, 47,234,252,248, 36,128, 57,103, 90, 2,128, 37,128,115, 78, 46, 3, 72,245,239,224, 3,247,199,246,254,205, 73,184, 94,
-200, 7,143, 22,206,244,230, 1, 4, 75, 54, 81, 78,188,171, 14, 30, 34, 24,148,219, 59,183,134, 87, 21, 23,235,171,111, 62, 43,
-177,172,175, 6,237,161,228, 0,124,230,132, 95,217,209,231, 32, 39,108,114,228, 46, 87,166,209,131, 7, 4,112,183,199,229,221,
-199,159,239,190,249,247,135,239,127,252,243,246,187, 63, 94,223,199,226,110, 4,135,168, 15, 26,173,249, 64,195,125,104,232,134,
- 84, 51,103,246,122, 58,109,250, 10, 57,201,144,109, 11, 78,203,116, 35,112, 42, 72,147,122,174,125, 75,123, 96, 47, 55,227, 85,
-213,147, 18,211,122, 25,248,152,199,119,222, 92, 60,141,163,168, 95, 64,181, 62,174,230, 57,162,241,140,173, 1, 39,210,103,232,
-181,170, 79, 14, 12, 16,125,177,131,200, 41, 97, 12, 37,230,146,161,121, 57,134, 84,212, 74,249,128,218,187,116, 94, 61,214,125,
-167,236,197,190, 76,204,247, 72, 64, 14, 55,131,220,178,206,153, 0, 83, 84,119,129, 72,194,222, 89,176, 21, 15,168,197, 33,203,
-214,162, 97,154,144, 66,142,218, 97,165,215,170, 81,159,245,121,193, 33,143, 27,181,139, 96, 87,104,184,145,221, 73, 66,107, 27,
-154,102, 65,117, 59,244,129,170,132,137,201,182, 56, 44, 45,239,122, 69,211,111,223,102, 4,221, 8, 46,143,234, 45, 99,176,124,
-188, 24,152, 0,177,227,141,161, 45,156, 69,149,185,153, 81,186,168,254, 33, 94,253, 47, 0, 73, 87,211, 27, 73, 13, 5,237,118,
-219,238,158,238,124, 77, 72,196, 18,113,129,219,238, 74, 92, 56,113,225, 39,240, 83,248,149, 92,225,194, 74,128, 86,145, 86,139,
- 34,136,178, 76,122,166,187,237,246, 39, 85,217,235, 28,162,142,237,247,170,202,126,175, 30, 2,139,247,179,136, 41,218,217,209,
-126,161,101,225, 40,254, 71,253,185,113, 85, 11, 77, 3, 43,207,214, 76,118, 99, 40, 22,179,176,238, 71,130,141,170,214,225,175,
-145, 82,155,165, 7, 13, 7,206,240, 83,211,139, 13,184, 83,129,118, 44,194, 35, 39,214,104,102,157, 88,161,129, 31,106,136,145,
-158,249, 53, 24,109, 44,253,236, 99,238,128, 83,128, 39,172, 16, 53, 86,182, 47,173,234, 97, 99,100, 87,190,236,207, 2, 42,232,
- 20,171,137, 14,104,128,173,219,138,215,209,151,210, 28,217,120, 6,245, 59,184, 4,157,217,205, 93,119, 35,100,239,158, 2, 56,
- 33, 40,135, 6,231, 90, 44,139,111,118,171,240,237, 17, 11,229,187,118, 71, 36,234,183, 33, 52,121,207,226,182,103, 83,247,237,
- 14,121,181,140,141,201, 67,233,250,178, 47,237,132, 77, 56,147,109, 39,183,109,148,139, 81, 23, 28, 22,131,181,105,105, 85, 46,
-232,152,109,232, 2,168,232, 86, 7, 66, 19, 1,147, 44,230,198, 74, 33,253,130, 81, 43,240,223, 78,149,152, 60,219, 84,192,214,
-141, 83, 69,197, 89, 34,101,205, 0,204, 22, 20,125, 69,228, 30,104, 64,199, 38,237,140, 0,137, 44, 5,170,221,196,219,195, 5,
- 48,177, 57,155,167,130, 36, 30, 75,230,151,208, 83,178,150, 5, 34,164,237,158,163, 41, 97,221, 25,128,113,223, 53,102,200,171,
- 81,144, 72,208,168, 64, 15,224,220, 17,240, 37,248,120, 66,215,141, 8,229, 75,167, 54, 30,109, 14, 65, 16,155,164,127, 63, 72,
- 7, 39,118, 65,132,105, 62,158,128, 66,240,201,161,171, 35,240, 28,232,187,195,111, 86,107,158, 91, 94,133, 67, 59, 38,105, 41,
- 73, 85, 13,157,182, 17, 68, 87, 38, 36, 31,103, 57, 39,161,183, 56, 44,210,211, 91, 82, 26,208, 56,118, 72, 51,159,179,108,158,
-222,145,205,203, 91,235,203,213,111, 4,240, 35, 48,113,154,229,226,252,213,231,122,102,161, 32, 48,123,255,226,202,200,142,149,
-166, 12,235,212, 42,246,231,158,114,185, 22,177,168, 30,146,200,211, 28,139,227, 79,118,182,191, 61,255, 80,158,192,217, 57,171,
-160,204, 50, 64,247, 32, 59, 29, 66, 94, 26,124, 74,158, 57, 36,106,153,232, 72, 26,109,205,147, 40,189, 98,135, 23,123,157,210,
-218,122,245,246,199,233,167,159,167,167, 19, 8, 17, 22, 70,123,115, 41,159,206, 63,190,191,186,255,165, 62,255,126,120,120,176,
-127,159,242, 94, 95,170, 29,203,211, 69,171,249,248,159,100,223,115, 6, 78, 94,117,120,247,245,249,251,119,238, 59,143,196, 75,
-118,224, 93,179,206,254,238,155,225,250,205,205,112,119, 51, 11,255,151, 40,143, 33, 31,183, 67, 42,114,192, 98, 86,117,198, 16,
- 66,192, 90,213,217,235,215,103,246,245,237,254,233, 48,254,246, 80, 63, 28,166, 50, 66,208,108,141,228,210,118,233, 11,168,189,
- 21, 65, 65, 95,235, 62,107, 62,171, 82, 45, 74,208, 8,105,105, 29, 11,140,133,190, 50,179,146, 67, 58, 41,208,182,252,234, 85,
- 55,124, 59,222,223,238,239,133,249, 83,196,169,124, 74,201, 45,236,240,229,229, 24, 18,188,165, 88,194,102, 34,236,215,234,238,
- 46,202,149,173,235,161,206, 71, 9,166,135, 37,146,216,118, 67, 63,207,152,155, 71,229,182, 60, 47, 97,114, 91,122,156,253,218,
-204, 62,173,160,171,254,136, 99, 26, 82,187,146,189, 36,104,105,157, 89, 85,137,237,206, 15, 41, 85,124,115, 61, 31,114, 31, 21,
- 66,146,130,168,161,157,248, 49,112,198,129,251,231,143,187, 79,255,126,255,195, 38,191,122,243,235,199,157,183,203,232, 7,164,
- 17,236, 62,116, 99, 9,139,147,114, 32,145,140,213, 93,180,115,246,231, 35, 93, 87,242, 81,169,217,170,226,230,206,219,177, 77,
-238,138,229, 69,206,225,212, 1, 26,178, 85,254, 75, 45, 22, 63, 46,185,183,179,242, 35,112,130, 48, 5,166,177, 93,148,150,198,
-112,214,158,162, 62,213,216,209,118, 42, 9, 21,194, 10,182, 98,103, 58, 33,123,182,180,201, 18,103, 35,156, 45, 56,128,141,159,
-129, 12, 49,224, 92,107,213, 56, 26,246,224,192,186,229,121,208,189, 49,197,201, 85,225, 59,183,197,247,149,157,240, 52,180, 16,
-237,127,126, 81, 77,129,134,202, 18, 9,201, 4, 85,124,179,230,169,229,133,174, 49, 77,207, 17,118, 37, 85,151,212,232,145, 50,
-212,214,165,146, 10,171,229,216,102, 32,233,245,101,122,209, 2, 18,115,136, 69, 54,182,211,129,183, 68, 64, 10, 22,165, 72, 44,
-246,142,237,162, 74,216,108,100,143, 16,242,244,154,208,245,146,131,197, 54,172,155,100,233,156, 30,135,222, 85,103,146, 54,103,
-255, 11, 64,210,213,244,184,109, 67, 65,138, 31, 34, 37,217, 94,187,222, 36, 88, 20, 5,114, 74,110, 45,114,236, 15,232,189,255,
-179,167, 94,122, 40,208, 99,127, 64,123, 89, 20, 13,114,105,155, 0,206,122,119,109,125, 81,164, 72,117, 70,217,227, 46,204,149,
-104,233,189, 25,190, 55,243, 52,130,145, 23,133,139,102,210,248, 97,195,246, 42,205,158,105,255, 78,249,159, 53,220,233,213,216,
- 85,130, 66,208,165, 6,184,121,159, 28,242, 54,125, 45,176,135,122, 53, 37,225, 41, 61,255, 27,225,170,164,204, 6,200, 34,173,
-121,138, 61, 48,105,166,180, 74,214, 60,238, 51,129, 94,200, 18, 0,119,149,186, 22,195,151,142, 25, 86, 69, 34,112, 45,214, 12,
-215,192,165, 26, 78, 24, 73, 29,155,241, 68,142, 58,136,129,245,192,105,156,154, 46,142, 85,152,216,128, 18, 1,243,253,210, 83,
- 6, 62, 6,172, 92,251, 75, 0, 61,159,231, 11,123,164, 7,100,201,162, 87,113,218,133, 76, 45,145,219,130,198,239,162, 0, 23,
- 6,113,219,235,157,159, 42,127, 91,228,198,168,109,232,100,165, 93,222, 74, 81,179,178,219, 33,139,106,133, 95,217,228, 98, 37,
-155,138,168, 0,108,136, 24,150, 21,193,146,185,190, 32, 86, 52,149, 11, 94,116,253, 2, 42,139,208,162, 38,177, 1,231,163, 80,
-204,116,158,173, 77,134,202,161,133,244,127,167,220,232,187,110, 20, 44,245,235,205,216,118, 77, 49, 61,164, 41,186,121,108,115,
- 9, 20,171,108, 49,165,254,122, 93,202, 98,243,168, 60,194, 53,246,224,128,119, 76,165,196, 1,136,121, 0,124,203, 20,226, 1,
-134, 5, 14,144,162, 65, 27,174,195,167,150,245, 58, 77,119, 69,164, 2,197,146,169,244, 90,214, 76,233, 52,188, 93,157, 54,233,
- 11, 10,188, 44, 18,242, 57,119,183, 44, 23,122, 42,224,210,189, 18,166, 89,138, 39, 48, 41,151,182, 65,186,202,174,190,151, 28,
-231, 81,170,156, 27, 85, 25, 4,105,199,193,105, 52,159, 98, 79, 8,190, 43, 42,154,165, 87,225,192,213,144, 63, 64,132, 57,232,
- 76, 1,175,175,122,108, 68, 91,100,185, 50,170, 11, 29, 93,210,126, 29,252,194,201, 81, 60,183,227,217, 78,193, 91, 89, 15,230,
- 57,199,101, 38, 22,107,228, 23, 45, 0, 88, 51, 30, 19, 99, 23,190,171, 34,210,241,151,226, 4, 60, 50,216,134, 5,180,161, 57,
-178,234,244, 1, 57, 49, 75,181,182, 72,231, 52,112,180, 67,104, 37, 40, 91,162,159, 90,148,129, 13,108, 28, 7,211,137,169, 45,
-118, 79, 34, 29,138, 28,230, 0,116,192, 49, 61,203,229,225, 49,254,251,135,211, 33, 11,164, 74,117, 62, 84, 15,119,223, 54,111,
-222, 29, 79, 15,187, 15,191,234,191,127,235,251,143, 3,136,235, 99, 85, 28,141,108,242, 52, 27, 55, 42, 30, 21,215, 27,237,198,
-183,251, 95,124,126,249, 87,255,170,253,124,178,229,225,245,177,126,251,170,252,230,166, 23,226,207,249,114, 63, 60,127,158,103,
-128,162, 13, 96,187,164, 68,189,203,236,167, 42, 69,210,189,172,135,233, 84, 14,215,210,220,220,238, 54, 63,212,155,247, 31,191,
-254,253,186,180,203,105,103,166, 96, 76, 40, 79,147, 47,230, 97, 11,248, 90, 22, 60,238,163, 28,144, 71, 22,216, 88,205,254, 0,
-219,222, 82,191, 51,217, 96,195,252,194,233,205,155, 99,252,238,238, 39,145,254,201,195,101,250,196,122,124,225,165, 12,129, 14,
-212, 36, 34, 21, 94,167, 53, 49,229, 18,108,227,104,197, 86,209, 46, 72,147, 69, 45, 20,104, 16, 10, 33,245,207,237,116, 57,167,
-249, 83,127, 9,185,111,251, 33,196,212,227,239,136, 12,242, 70,153,205,161, 86,149,174, 77,118, 47,108,237,217,106, 87, 52,120,
-104,231, 50, 46,231,247,233,250,180,252,119,206,200, 10,215, 46, 63, 15, 88, 56,188, 44,227,101, 18, 21,208,205,182,188,148,161,
-189, 63,191,126,248,249,221,143,222,221,125,127,223,165,179,184, 2,112,126,213,226,198, 26,173,157, 70, 56,235,244, 84, 57,142,
- 36,113,120, 92,172, 69,112, 88,167,249,117, 86,227,203,221,235,103, 58, 14,173,206,111, 64, 32, 99, 14,214,230, 81,145,179,169,
- 81, 1, 63,223,240,148, 76,236,202,113, 50,118,108, 35, 94,130,101,192, 99,238,167, 60, 98,209, 76, 3,138, 94,210, 53,191, 6,
- 30, 13, 18,159, 66, 76, 67, 72, 29, 27,215, 70,170,189, 13, 69,135,121,226,253,250, 18,136,167, 27, 88,132,241,117,191, 83, 67,
-138,115,239,131, 29,105,214,192, 65, 52, 70,246, 49, 80, 28,151,230,228,109,105,103, 32,138,108, 43,199, 18, 5, 69, 10,129, 3,
- 33,230, 6, 0, 21,208,131,133,124,177, 41,217,182,149,117,140, 54,178,196, 3,198,134, 0,143, 75, 83, 60,184,175,233,108, 34,
-164, 84,180,158, 13,118,102,103, 27, 2,235,226,109,146, 78,238, 67,115,177,156,242,162, 76,206,128,207,244,197, 1, 0,149, 8,
- 40,181, 41, 42, 69,223,252,217, 25,132,118,234,247, 54,249,127, 1, 72,186,150, 29, 57,138, 32, 88,213, 85,213, 93,221,189, 51,
-179, 47, 63,214, 66, 66,200, 22, 55,132, 64,220,184, 34,113,230, 79,145,184,112,242, 13,113,242, 15, 96, 94,182, 64,214,218,218,
-157,109, 79,207, 84,215,155,136,230,180,135, 85,107,182,103,179, 50, 35, 42, 35, 35, 53,155, 88,116, 16,101,215,150,203, 67, 40,
- 69,151, 99, 93,109, 35,144, 84,129, 56, 69,211, 23,112,168,153,190, 27,201,244,171,233,226,194,121,213, 12, 8, 9, 56, 39,112,
-152,165,230,138, 42, 89, 76,110, 13,106,148, 90, 18,194,142, 83,201,116, 45,197,199, 71,228,134, 8,112, 83, 91,228,168,212,224,
-172,117,121, 72,154, 86,246, 8, 43,186,148, 1,209, 85, 67,213, 20,117, 38, 32,120, 65,233, 30,199, 83, 35,160, 61,254,155, 64,
-183, 51,111,202, 22, 94, 61, 44,139,143,170, 45,156, 83, 11, 11,253,245,128, 43,102,239,228,132,242, 13,102,148,142, 67, 14,149,
- 11, 92,101,227,103, 28,122, 80, 76, 53, 4,163,235, 86,123,115,234,221, 96,184, 53, 2,167,217, 92, 12, 77,181,227, 88, 81, 34,
- 34,176, 43, 78, 13,133,170,205, 5,111, 63,117,143, 98, 42,184, 91,165,177,244, 65,161,237,109,110, 7, 58, 33, 72,164, 98,246,
- 52, 70,122, 69,115,200, 16,191, 61,239, 1,144, 26, 74,250, 35,144, 57,213,112,212, 32,129, 74,208, 40, 38,135,101,109, 91,211,
- 57, 10, 4,134, 29, 23,224,145, 77,160, 20, 23,160,180, 83,222, 52, 9,181,255, 8,218,164, 1, 75, 45,138,101,156, 40,136,208,
- 97, 50,178, 61,165,179, 58,198,146, 40, 5, 79,177, 69, 5,111, 13,160, 62, 72, 93,199,220, 75,149,125,195,187,199,192,197,162,
- 8, 76,164, 97,189, 78, 53,212,213, 70, 66, 20, 58,223, 14, 58, 21,171,203,156,197,128,231,253,202,179,118, 18, 37, 31,152, 1,
-207, 20,141,138,212,116, 99, 26, 71, 49,214,124, 26, 85, 23,184, 87, 67,155,176,187,106,192, 84, 93, 12,250,195,217,105, 40,171,
-152, 8,172, 54,113, 45,163,194,143,218, 39, 69,183,184,134,126,119, 27,212,209,254, 84, 20, 96, 78, 15, 4,145,155, 54,178, 29,
-101, 25, 50, 98,221, 52,160,240, 5,116,180,189,162,242, 12,169,157,170,112,214,156,186, 46,208,149,236, 24, 59,215,168,174,161,
-209, 9, 7,196,242, 89, 45, 59, 66,218, 37, 26, 43,140,195, 59,141,224,130,126,188, 64,114,120,248, 83, 76,139,168, 35,157, 19,
- 0, 50,166, 6,241, 67, 9,197, 33,164, 9,233, 17, 25, 85, 2,168,130, 33,151, 13,219,143,226, 46, 45, 45, 25, 22, 13,140,181,
-208,250,237,208,211, 12, 7,188,203,155, 54, 82, 35,151,179,251,205,185,205,219,230, 98,251,213, 15,143, 63,251,174,187,253,165,
-253,227,231,121,190,219,138, 19,195,216,158,197, 62,175,122,241,254,132, 63,162,188,251,230,217,171, 79,150, 47,247,238,201,147,
-126,124,180, 59,136,244,107, 60,190,241,199,201, 31,253,234, 89, 62, 10, 1,132,186,218, 97,103, 75,143,125, 73,229,130, 14,120,
-145, 83,214,203,199,224,140,223,218,110,255,226,185, 31,223, 95,188,252,231,209, 49,236, 1, 34, 8, 41, 16,102,125,106,217,122,
-238,141,170, 51, 80,127, 44,198, 18,171, 92, 26, 91, 91,154,253, 22,154, 63,116, 87,245,233,215, 79, 95,158,111, 94,139,195,235,
- 5,184,230, 62,166,104,165,192,225, 88,188,160, 44, 28,196, 17,164, 58,125, 8,224,255,221,205,101,125,126, 37,175, 81,100,241,
- 70, 40, 57, 22,177, 10, 16,160, 92, 61,221,199,121,127,220, 31,210,237, 62,148,240,144, 78,173, 53,106,215,159,237, 30,155,243,
-103,109,143,247, 29, 56, 90, 35,186,144,247, 0,184,254,253,123,255,128,227,250, 70,206,255, 74,191, 11,215, 55, 98,211,203,207,
-111, 80,110,173,123,151,254,254, 43,223,223,149,135, 25,100, 75,110,165,116, 40,192, 82,185, 99,250,253,225,118,249,241,167, 79,
-191,157,203, 23,223,191,242,105, 72,123,211,234,147, 65,144, 81,246, 67,135, 61, 96, 22, 23,234,106,145, 43,141,237,184,153, 81,
- 53,179,175, 6,136, 91,178,131, 51,138,169, 21,215,179,177,224, 14, 77, 57,136,128,195,113, 78, 25,246, 71,233, 40,248,226, 6,
- 74,219,107,207,113, 19,139,179, 43,184, 41, 69, 35,105, 42,238, 25, 77,180, 6, 9,248,122, 70, 29,185,252,234,178,173,135,195,
- 18,123, 68,225,224,102, 20,161,133, 83,158,177,104, 39, 38, 46,252,208,253, 17,184,239, 24, 66,156,144,164, 14, 96,248, 74, 37,
- 84, 97, 58,242,226,136, 20, 63, 0,149, 42,195, 21,191,174,216,185,202,232,148,109,140,231, 16, 37,253, 89,245,255,251,228,240,
-177, 84,189,178,235, 78,201, 29, 50,106, 43,121,167,199,145, 72,193,185,217, 80,141,205,180,105,215,141,105,121,255, 32, 3, 96,
-118, 63,233, 92,104,127,145,103,153,118,203,102,219, 48, 83, 2,103, 4, 11, 14,146,139,150, 3, 30,200, 74,108, 83, 89,216, 72,
-147,197, 42,225, 76,247,159, 0, 28,157, 75,111,228, 68, 20,133,237,170,242,163,218,118, 55,157,100, 24,134,128,208,108, 96,139,
- 70,179, 71,252,133,249,189, 32,177,152, 45,251, 1,129, 6, 68, 72, 72, 72, 58,253,112,187,202,245,156,115, 44,101,145, 40,105,
-199,143,186, 47,215,189,223, 65, 62,100, 86, 22,254,171,102,127, 56, 7,232, 61,181,138,232,238, 53,165,248,104, 8,156, 38,164,
- 16, 7,150, 36, 10,134,232,169,116, 72, 46, 86,108, 8,196,159, 96,143, 57,193, 59,133, 69,161,201, 90,242,163,144,236,203,158,
-131,139, 13,225, 42, 13,108,159,107,148,111, 86,114,139,200,135,219,220,114,130,156,168, 5, 84, 43, 53,245, 76,216, 14, 77,153,
- 42,132,196, 88, 91,215,162,210,247,243, 60, 35,246, 44, 28, 17, 10,110, 18, 76,139, 7, 78,142,119,152,119, 14,143,117,124,242,
-130,140, 44, 43, 16,136,176,112, 79,112,201,229,180,177, 97, 79,200, 69, 90,180, 6, 8, 79,146,170, 35,246,236, 84,195,198,101,
-223,195,115,155,179,149, 20,136,222, 18,130,135, 28,179,107,135, 82, 13, 5, 82,121,242,207,116,219, 48,104, 33,128,175, 20,231,
- 74,164, 36, 18,144,197,133, 71,176, 11,195, 34,159,130,152, 86, 81,121, 88, 36, 14,178,225,140,107,198, 83,146,126,144, 35, 12,
- 65, 82,110,143,141, 64,248,146,162,205,163,151,248,184,167, 2,195, 90,185, 56, 88,248, 7,202,186,133,129,195,101,197, 68, 57,
- 39,127, 60,100,113,144, 65,171, 9,223,248, 89,203,153,131, 21, 51,155,141,178,137, 35, 82,108, 54,157,219,166, 88, 84,137, 42,
-130, 89, 81, 47, 75,175, 84,199,217, 20,184,241, 90,231,209,145, 79, 78, 61,174,134, 77, 72,170,162, 42, 97,174, 37,233, 7,106,
- 1,110, 33, 72, 82, 43,114,133, 44,192,181, 76, 11, 53,146,124,146, 0,243, 32,113, 53,228,253,203,153,188,254, 78,113,247, 38,
-156,116,143,117,177, 45, 55, 88, 67, 23, 74, 19, 57, 17, 80,128, 52,165, 33,255,146, 23,190, 36, 4,202,207,161, 53, 25, 63,227,
- 48,207, 57,223,143, 5,103,187,224,211,120,166,201, 73,206,166,193,144, 83, 73,181,197, 58,198,133,150, 93,224,186,132, 22,148,
-233, 98,165, 38,137,221, 35,145, 40,224,137,225,247,184, 45,146,213,175, 79,134,195,209, 6,185,220, 42, 52,161, 45, 39,165, 55,
-219,167, 2, 15,193, 55,133, 69,186,196, 90,212,135, 60, 27, 85,156, 83,141, 88,163, 84,248, 63,134,125,134, 53, 52,167, 68,102,
- 49, 74,121,110, 74,240,127, 19,144,135, 67,253, 91,172,204,102,215, 14, 69, 30,181, 88,104, 4, 30,177,169,218,196,113, 10, 39,
-119,236,238,154, 87,234,219,119,253, 23,111, 47,238,127, 17, 31,223,207,127,239,234,111,118,162, 97,223,167, 96,103,209, 48,193,
- 54,207,255, 92,175,135,235,205, 75, 44,255,112,186,117,241, 54,154, 49,154, 71, 68, 73,106,240, 81, 49,131, 61,191, 56, 1, 60,
-212, 42, 14,130,232,225, 57,230, 73,150,159,197,208, 43,113,192, 61,176,176, 50,115,247,106,123,245,163,121,243,243,211,198,138,
-123, 89,244,178, 90,113,138, 33,156, 97,227, 5, 7, 44, 34, 82,220,108, 9,130,240, 11,128,143,104,238,249,226,165,232,190,255,
-250,125,223,253, 26,158,111,194, 3,236,164, 46,142, 51, 69, 38,224,208, 37,162,180, 75,187, 40,136,245, 93,215, 87,178,126,125,
-161,190,108, 18,119,252, 98,177, 16, 95,101,144,201, 20, 22,241,104,231,239, 30,199,121, 60, 89,195, 61,250,107, 92, 85,191, 30,
-182,169, 26, 74,190, 73, 85,217,236,155,191, 14,241,238,118,119,243, 97,122,252,184,237,143,250, 18, 5, 86,183, 9,102,192,253,
- 60, 39, 78,107, 60,156,221, 9, 46, 68,159, 26, 29,180,144, 95,125,142,213,167,238,111,220, 17,203,156, 1, 90,182, 94,156, 77,
-250,227, 55,252,241, 79,223, 93, 94,157, 95,252,240,251,195,159,168,153, 97,200,217,242,220,249,214, 37, 29,136, 17,231,162,117,
-147,115, 72, 72,197, 66, 64,235,240, 81,196,114,169, 57,140, 57, 20,207,135,232,109,173, 73,253,145,106, 31,124, 23, 60,101, 70,
- 69, 22,156, 64,200,198,192, 73, 33, 1, 98,195,161, 37,244,254, 80,180, 27, 44,140, 62,122, 74,156,246, 13,236,207, 88, 39,103,
-119,214,229,200, 22,191, 80,152, 73, 84,229, 49, 16,177, 99,217,167,171, 3, 18,232,213,254, 63, 10, 79, 52, 57,202,182,173, 17,
- 91, 12, 49,201,217,153, 4,163,170, 86, 14,249, 89,106, 67, 52,124,155, 9,227,182,121, 66, 16,159,185,185,197,182, 53, 44,170,
-202,147,174,158, 8,220, 99,187, 97,133,115,236,197,164, 50, 12,248,146,253, 73, 6, 38,128, 36,166,234,230, 88,161, 20,214,201,
-240, 85,156,171,154,212, 69,228,163,109, 82, 13, 39, 50,224,101,175,202,118,217, 80,163, 0, 7,142, 81,173, 75, 60,104, 49, 23,
- 45,204,188, 83,198, 33,233,111,153,201,193,107, 42,253, 73, 0,142,174,100, 71,142, 34, 10,230,158,181,244, 58, 54,140, 64, 26,
- 11,236,155,143, 8,254,128, 95,224, 67,145, 16,146,127,192,242,141, 43, 2,230,224, 1,203,120, 60, 76, 79, 47,181,228, 82,149,
- 68,212, 92,123,186,213, 85,157,245, 94,196, 91, 34, 12,240,215,104,150, 42, 11,219,188,160, 48,101,109,104,122, 77, 29, 63,196,
- 53, 65,107, 1,234, 37, 38,179, 24,120,224, 34,129,124,180,162, 60, 65, 37, 40,220, 90, 85, 89, 86, 0,100,236,200,179,186,163,
-104, 28,194, 26, 52,233, 56, 27,251, 35, 53, 74,104,224, 6, 2, 2,158,132,187,123,105,184, 44,178, 56,207,112,144, 66, 70,238,
-222, 4,154, 22,204, 77, 8,189,193,157,150,148,193, 75, 52,127,205,210, 76, 79,221,184,210, 6,224, 61, 34, 57,119,115, 73,177,
-228,149, 48,167,137,195,196, 46, 82, 5,138,171,191, 25,188, 63,159, 75,103, 28,175, 64,246, 5,132, 9,255,151,105,136, 14,100,
-168, 26, 41,107,154,229, 29,204, 52,173,237,158,218,254, 53,226, 54, 16, 99,187, 81,128,247,222,183,109,118, 51,249,171,195,161,
- 55,158,195,247,146,117, 12,142,115, 59, 53,137,214,179, 48, 73,181,100,250, 69,202,138, 53, 51,192, 7,193, 1,194, 66,146, 1,
-192,173, 29, 2,124, 77,239,165, 41,122,202, 28, 2,180,225, 43,206,221, 34,210,141, 8, 79, 95,182,249,193, 36,132, 28, 46,104,
-169, 30, 44, 46,156, 12,189, 56, 36,151,199, 65,113,230,136,184, 96,192,140, 41,128, 43, 73, 12,132,136, 53,167,151,128, 94,158,
-168,197, 11,254, 77,213,231,231,184, 66, 15,160,134,244,202,121,157,129, 27,248,194, 2, 22, 55,198,119,166,143, 75, 41,116, 39,
- 22,209,102,186,218,226, 75,177,129, 66, 62, 78,199, 91, 27,129, 18, 42,163,213,185,148, 43,179, 88,152, 82,175, 2,172,193,215,
- 8,195,123, 75,241,247, 93,196,159,171,157,221,212,125,164, 5,163,144, 59,164,198,177, 4, 46,198,203, 61,139, 38,160,122,192,
-255,180,222, 67, 60,126,100,185, 68,176,130,236,116,139,168,162, 57, 51,182,252,218, 90, 47,146, 78,188,202,196,157, 76,220, 43,
-150, 11, 90, 32, 54, 49, 4,189,201, 6, 68,107,136, 25, 1,129,194,165, 69, 12,200,166, 56,140,103, 74,240, 79, 70,209,172, 3,
- 7, 19,204,204,134, 78, 76, 55,219,250,119,241,185, 3,245,154,168, 37, 24,211, 56, 3,176, 43,110, 71,167,203, 73,231, 65,186,
- 3,213, 1, 44,158,203, 77, 25,113, 70, 79,131,222, 42,223, 43, 28,238, 1,169, 36,138, 16, 1,146,142, 72, 85,150,202,176, 46,
-227,121, 38, 26,115, 97,177, 18,240, 25,169,242,253, 16,234,163,223,244,223,252,212,238,190,127,246,247,155,185,123, 7,206, 22,
-182,218,111,147, 52,219, 73, 94, 3,141, 15,225, 33,135,163, 4,228, 44,157, 70, 72, 61, 29,115, 90,102,208, 2,142,207,176, 20,
- 54, 86, 5, 7, 68,140,217, 1,205, 29,204,188, 17, 2, 33,158, 58, 76, 20,170,224, 19,194,243, 59,246,119, 95,127,185,125,217,
-189,252, 45,180, 91,221,109, 70,125,113, 8, 48,133,163, 25,233, 42,176,213, 8, 62, 87, 26, 68, 34,217,215,202,143,243,126, 63,
- 84, 63,188,250,213, 87,111,211, 93, 26, 47, 67,121, 4,158, 57, 80,176,134, 77,110, 73,175, 55,228,210,107, 47,235, 21,203,141,
- 47, 92, 89,141,121,137, 64,194, 52,101,178, 62,196,112,137,231,247,151,167,227,233,112,151,251,220, 95,173,215, 55, 55,102,245,
- 69, 91,175,217,236,228,150,126, 50,255,222,234,191,110,239,239, 62, 76,250, 79,124,210,139,215,141, 74,175,118,131,111,106, 59,
-244, 58,228,209, 12, 90, 62, 63,219,242,233,177,233,242, 78,173,254,251,231,243,225,246,114,223,228, 79,165, 7, 25,117,244, 71,
-119,221, 5,112,108,118,107,181,175,244,211, 56,125,252,112,174,126,249,249,219, 31,215,221, 87,223,125,188,255, 3,103,235,188,
- 37,247, 99,135, 33,173, 9, 58,167,108,107,206,101, 0,193,129,104, 15,245,152, 20,222, 41,148, 3, 94,119,187, 7,159, 85,174,
-200, 7,133, 77,153,214, 4, 8,139,220,161,101,171,179,167,186, 98,126, 44, 30, 72, 0, 96,183,149, 53,192, 97,255, 48,239,251,
- 94,172,148, 63, 79,126, 58, 30,193,166, 0,184, 68,142,151,222,208, 33,141,114,128, 1, 73,196,165,129, 43,166,154, 42,142, 86,
-165, 38, 41,228,172,228, 58, 73,171,122,144,229,227,124,218,170, 6, 49, 44,128,255,204,209,200,225,130, 72, 9, 6, 57,152, 82,
- 89,101, 51,189, 96, 73, 72,103, 42,253, 57,239, 88, 28, 11, 98,157,103, 60, 27,160, 43,122,172,107,101,175,144,172,164,197, 89,
- 11,178, 25, 91,101,163,243,146,205, 90, 74,210,249, 40,204,102,199, 53,151,153,206,223,165,153, 45,199,100,174, 59,125,170,207,
- 10,239, 30,141, 92, 94, 48,206,154,128,208, 96,180, 29,136,155,205,154, 78,246, 6,193,105, 21,231,255, 5, 32,233, 90,118,228,
-182,129, 32, 31, 18, 73, 73,163,221, 89,199,118, 30, 8,146,131, 3, 7, 8,226,139,191,196, 95,154,107,190, 32,200, 37,135,156,
-114, 72, 16,172,179,142,225, 93, 27,235,157,241,140, 68,138,164,168, 84, 49,151,185, 12,230, 33,169,217, 93, 69,118, 87,209, 75,
-190,165,206,244,150, 55,207,193,135,210, 36,106,229,170, 42,172, 94, 71, 35, 0, 59, 81, 96, 36, 91, 97,108, 44, 52, 6, 80, 20,
-148,212,220,166,159,170,244, 83, 85,116,174,251,170,180, 95,225, 68, 8,146, 94,181, 65,216,216, 44,130,107,164,228,166, 70, 73,
-241, 28, 17,241,189,104,216, 61,101, 5, 74,163,175,174,220, 20,156,171, 99, 94,180,130,216,106,194,167,233, 52, 16, 78, 96,242,
-118, 50,101,239,233, 52, 46,150,146,147, 92, 63,150,185, 68,113, 66,138, 89,187, 89, 78, 13, 69,145,123, 51, 83, 40, 26,183, 35,
- 5,124,170,215,131,156, 58, 74,156,140, 10, 88,211,210, 21,185, 5, 32,223,201,253, 69,206,157, 11,105, 79, 61,160, 46, 56,233,
-198,222, 0,120, 39,144, 37,112,133,206,237, 28, 98, 1,240,180,201,200,148,213, 84, 36, 81,165, 41,106,173,104,161, 76,144,201,
-216,169,214,202, 89, 87, 37,222, 22, 44, 66,112,190, 76,203, 20,168,114, 91,221,214,154, 68,207, 76, 74, 48,179,228, 96,165, 39,
- 30,176,171, 68,123, 44,112,194,122, 49, 32, 51,139, 4,169,153,113, 55,149, 53, 43, 96,126,135,180,172,202, 2, 92,152, 11,176,
-175,244, 38, 96,237,135, 73,115,119,152,140, 8,124, 27, 48,129,170,224, 11, 73,150,107,218,149,222,119,192, 76, 19, 8, 22, 53,
-198,221, 57,207, 94,151, 78,185, 49,157, 87, 86, 35,188, 61, 42, 29, 0, 21,214,186,103,207, 93,112,252, 60, 19, 45,103,246, 27,
-228,138, 13,113, 58,124, 86,108,212,160,169,200,221, 8, 12,148, 47,105,146, 19,102, 4,225,189, 15,113, 64,122, 89, 36,141, 74,
- 16, 67,101,202,221,232, 19,248, 24,208,105,169, 30,187,210, 2,166,215, 25,125, 41, 22, 51, 72,224,229, 8,148,106,104,219, 75,
-209,126, 20,239,129,211,123, 72,132, 0,151,180, 3, 0,151,192,114, 68, 1,112, 20,219,192,147,231,246, 86,147, 53,119,228, 57,
-181,200,177, 12, 15, 54,166, 85,191, 46, 43, 91,255, 57,168, 27, 60,133,237,189, 77,215,194, 31, 68,232,105, 95,150, 35,109,208,
-238,228, 34,226, 66,153, 43,224, 0, 79, 89, 4,148,180,194, 84, 14,224,190,213, 14,180,180, 70,137,176,109,244,140,191, 50,223,
-172,179,167, 83,201,255,170,181,197,146, 4, 1,141,137,145,155,221,202,144, 51,160,160,157,238, 23,123,117, 59,190, 12,207,191,
-191,122,247,195,211, 79, 63,139,229, 38,213, 54,217, 13,184, 65, 12, 96,169,138, 34,156,200,239,199,116,250, 80,210, 25, 43,168,
-148, 58,224,182, 88,161, 66,217, 60,190,151, 37, 30, 44, 57,122,186,221, 82, 81,239, 41, 59, 44, 2,199,155, 87,229, 26,117, 17,
-242,123,211,188,126,241,232,209,245,221, 19,173,111,168, 1,170,201, 68,117,116, 59, 59,127, 98,119, 56,141,222,148,150, 29,207,
- 45, 27,157,198,231, 95,252,102,155, 95,226,223,101, 57,225, 59, 61, 74, 18, 7,210, 68,135,170,128, 68,214,237,157,108, 47,133,
-113,210, 98, 5,126, 92,251, 68, 81,118,118,243,161,154,165,114, 88, 78,199,248, 30, 84,229,230,120,142,121,167,251,103, 47,250,
-253,231,157,197, 34, 54,173, 1,236, 93,203,239,127, 45,255, 92,223,222,189, 93,187,135,139,111,220,183, 95,238,212,237, 51,243,
- 38,157, 98, 58,254,249,239, 59,167, 13, 30,203,122,228,201,201,208,182,183, 15,243, 78, 70,228, 44,196,223,215, 50, 63,158, 85,
-186,215,250,241,147,215,205,220,135, 3, 30, 1,105,254, 68, 92,107,122, 10,232,188,121,123,247,213,175, 63,253,248,234,210, 15,
-223, 29, 30,254,184,112, 91,216,168,129,209,138, 80, 76,230,169, 39, 69,248, 16, 70,128,191,179, 67,209, 66, 56, 50, 40,250, 34,
- 78,121, 75, 29,133, 15,251,147, 69,125, 79,218,184, 35,222, 58, 47, 35, 50,115,213, 84, 51,177,185,140,222, 12,219, 7,129, 28,
- 51,183,147, 26, 55, 77,173,165,130,152,222, 63,248,131,108,252, 46,154, 24, 38,142,144,169,210,226,127, 83,133,253,108,230,128,
- 87,144,209,142, 29, 28, 51, 7, 32,146, 93,185, 19,186,202, 41, 10, 82, 84,238,173,102,208, 3,205, 46,101,181,144,186, 18, 2,
-182,244,213,161,200, 79,167, 61,226, 99,233, 36,253, 38, 83,155,113, 49, 26, 60,155,243, 15, 84, 86,225,144, 97,194,245, 35,192,
-206,123,100,186,124, 65,185, 42,172,109,101,219,220, 47, 64, 93, 61, 30,250,208,208, 23, 59,118, 0, 26,185,221,236,220, 56,189,
- 91, 47,133, 69, 6,117, 74,156,168, 19,138,120, 8,123,171,120, 64, 68, 51, 71, 30,100, 3,233, 94,137, 13,105,235,188,254, 39,
- 0, 73, 87,207,228, 56, 17, 5, 71,243, 45, 75,107,123, 97,119, 57,142,187, 98,171,160, 8,184, 58,130, 11, 72,200,137,136,249,
- 21,144,241,191, 72,136, 9, 73,137,142, 4,170,128,218, 58,239,221,222,122,215,178,173,145, 70,163,145,232, 54,145, 3,127,148,
- 60,154,247, 94,183,230,189,110,245,227, 79, 63, 20, 60, 71, 96,118,160, 18,197,255,198,199,243,156, 72,114,166,147, 53,166,164,
- 74,204, 73,158, 19, 73,125, 40, 34, 42,210, 40,212,201,178, 36,142,185, 4, 52,212,108,164, 5, 22,139,212,145,146,122, 38,239,
-150,150, 58,126,224, 35, 58, 0,113,240, 48, 91, 2, 92, 3,125,249,201,178, 7,134,130,125, 5,159,182,247, 20, 27,177,189,232,
-177, 78, 41, 2, 16,183,132,181,226, 56, 83,137, 44, 36, 48,238, 35,126,245,241,168, 38,221,117,209, 3,232, 81,195,173,163, 45,
-219, 16,230,208, 37, 95, 30, 99, 74, 3, 7,134,122,133, 87,142,192, 30, 1,226,228,227, 58, 35,203,187,220,163, 84, 78,214, 78,
-162, 50,165, 90,148, 40, 5,218,185,178, 30, 47,157, 54,206, 46,206, 70,178, 61, 93,210, 30,187,212, 14,247, 89, 57,194,112,131,
- 55,157,115, 64, 79,158,254, 77, 84, 23, 65,185, 52, 89, 82, 47,155,141,208,184,233,168, 39,192,227, 54, 17, 53, 50,125, 35, 29,
- 68, 70, 35,242,209,188,152, 69, 59,114,208, 13,128,100,232,203,130,179,100, 7,137, 48,207,166,231,146,230, 41,142, 3, 69,225,
-168, 8, 11, 74,154,240,217,110,211,142,158,229,112,104, 80,162, 56,191,165,192, 95,250, 94, 30, 70,242,124, 32, 27,155,170, 65,
-245,224,142,184,156, 64, 7, 5,235,180,167, 71,215,196,138, 47,100,155,163,199,150,112,212, 92,117,116, 97,161, 35,185, 17, 60,
-207, 69,121, 8,212,183, 18,212,151, 44,179, 62,195, 94, 2,180,152,145, 7, 62, 88,235,101,101,193,226, 42,246, 58, 24,127,201,
- 51,103, 91, 9, 47, 7, 11, 44,237, 28,104, 93,240,139, 51,137, 36,132,226,141, 43,116,102,169,232,126, 39,233,143, 97,214,252,
- 21, 42, 54, 98,225, 40,228,153,147, 54, 99,213,185,150,122,206,100, 20,212, 12, 65,210, 5,163, 59,207,172, 5,231, 40,156,160,
- 66, 84, 9,230,195, 64, 80, 0,206,144,162, 16,141, 74,157,122,146, 44, 27,144,240, 73, 93, 83, 12, 73,243, 96, 63, 43,237,105,
- 47,142, 90,134,172, 82,212,113,253,101,241,155, 8,127,118, 13,205,215, 18,245,169, 74,224,171,216,229,244,174, 8,143,128,222,
-132,159, 40, 59, 50,233, 83, 60,161,106,233,142,146,213, 60,193,162,198,187,155,202, 85,219,188,252,158, 81,215, 55,244,231,138,
- 21, 80, 30,101,186,133, 91, 59, 14,226,137,169,203,244, 7,170, 84,113, 48,114,151,125,185, 59,127, 37,214,215,203,208,213, 40,
-203,149, 50,238, 74, 33, 37,113, 50, 59, 0,173, 21, 97, 23,247,251,147,254, 49, 69, 48,193,148, 38,231,169, 50, 20, 82,129,139,
-198, 58,224, 63,246, 90, 42, 34,168,130, 61, 90,180,156, 20,248,183,115,195,205,193, 94,129,166,174,135, 38, 60,123,147,167,154,
-167, 72, 52, 38, 40, 68,205,190, 9,189,176,150,126, 58,154,122,202,227, 52, 63,127,177,120,253,108,245, 75,186,221,198, 54, 13,
-219,125,222,179,121, 64, 45,150,229, 85, 93, 62, 89,233,143, 62,150, 23, 87,197,229, 69, 94,129,143, 62,208,205, 98,118, 2,232,
-127, 54,170, 45, 16,142,111,239,226,221,230,248,112,127,204,199,252,116,245,225,231, 79, 62,173,174, 29,107,129,161,134,238, 31,
-191,111,126,253,249,118,119,115,253, 73,124,254,217,110, 92,197,139,104,250,215,115,252,231, 62,110, 55,105,218,168,127,111,154,
-251,219,199,102,115,184,123, 56,130, 44, 30, 14, 41, 28,198,253, 62,164, 55,233, 78,138, 91, 7,144, 46,254,158,135,171, 47,190,
-250,230,219,239,138, 80, 60,188,125,223, 35, 35, 31,103, 26,249, 8, 14, 13,139, 70,108,239,119, 79,205, 77,249,234,235,191,132,
- 87, 67, 3,202, 91,198, 97,246,115,237, 43, 59,152,109,166,154,216,194,172, 14,105,139, 85,227, 14,151, 91,153,169,152, 15, 4,
- 66, 80,193,147, 83,189,143,210,142, 29, 53, 54, 39,186, 78, 58,245, 72,109,107, 85,243, 57, 13,110, 61,248,167, 76,237,224,241,
-189,128,168,106,179,177,195,216, 1,115,209,107, 7,209, 70,211,147, 80,244,239,237,209,181,216,209, 34, 80, 67,122,110,134, 8,
-184,217,139, 54,169,128,136,110,129, 53,129,191,243,208, 1, 51,207,225, 64,133,218,204, 49,203,105, 24,230,216, 83,142,163,160,
-110, 52,226, 13, 68,201,156,244,210,133, 44,189,246, 39, 11, 36,246, 35,131,136,149, 85, 53, 1,180,231,179,218, 39, 87, 86,189,
- 34,120,118,186,226,115, 1,187, 64,100, 90,234, 24, 47, 43,211, 23,224,226,149,169,120,116, 80, 76,190, 90, 24, 57,100,231, 15,
- 89, 45,145,104, 11, 39,177,149, 1, 28,215, 64,152, 0,134, 6,149, 70, 91,112,133,201,138, 51,103, 57,187,110, 84,253,159, 0,
- 36, 93,187,142, 28, 69, 20,173, 87, 87,245, 99,102,189, 54,139,192,182,134, 0, 65,128, 16,146, 29, 16, 65, 68, 8, 9,226, 43,
- 54, 33,227,199, 16,255, 0, 63, 96,129,100,140,156, 32,132,237,221,121,236,108,119, 87, 85,215,131,115,154,108,130,213,108, 77,
-247,173,123,207,169,186,247, 28,125,253,211,117,162, 63, 53,128, 37,175,217,149,226,153, 59, 9,142,164,215,124,166,255, 6,111,
-105,144,216,217,195, 32, 41,136,209,114, 35, 71, 54,159,169,129,130, 69, 98, 21,164,166,157,142,163,155, 41, 47, 21,165,167, 3,
- 72,244,105, 48,116,240,201,156,206, 47,108, 81,151, 20,213,192,126,157, 80, 21,154,122,111,232,250,133,127,133,210, 24, 0, 2,
-193,216,185,127, 99, 30, 0,139,153,235,195, 12,112, 30,234,136, 87,124,242,160,129,121, 2, 65, 64, 73, 8,229, 20,105,181, 64,
- 89, 87,118,208,228, 35,136, 42,128, 52, 91, 43,106,206,182,191,116, 17,156,165, 45,195,220, 98, 89,194,246, 78,113,206, 6,121,
-187,147, 3,152,139,204,214,117,214,182, 75,211, 90,221, 25,212, 85,213,111, 91,219, 0, 66,169,190,215,110,117,242, 22, 60,127,
- 79,179, 69, 61,166,249, 35,160, 59,160,173, 73,132,194,154,234,152,116,166,194,247,162,158, 1,188, 24,252,132,180, 26,150,208,
-140, 57, 9,223,132, 4,194,148,183, 69,159,201,210, 2, 30,221, 56, 54, 51, 50,214, 56,115, 76, 63, 82, 79, 49,230,133,231,171,
-168,112, 88,248, 13,162,251,237,104,128,245, 29,169,222, 98, 0,171,138, 15,116, 12, 58, 45, 72,219,168,214, 78,209, 65,158,166,
- 24,192,230,116,249, 6, 66, 68, 28,123, 89,251, 6, 17, 21,117, 66, 68,118,162,207, 3,157, 95,104, 43,133,104,219, 50,191, 3,
- 1,134, 78, 40,222, 52, 73, 71, 19, 84,197, 79, 81,130,233,217,171, 22,113,202, 27,102,100,227, 70,243, 14, 12, 36, 90,139, 71,
-141,115,134,201,150,182, 69,102,233,192, 26,179, 96, 0, 47, 72,242,164,195, 54,234,117, 8, 39,226,105, 4,143,103,166, 52, 74,
- 44,223, 11,176,217, 70,240,204, 97, 66, 4, 74, 14,121, 81,109, 84,215, 13, 21,231,204, 88, 87, 49,151,132,149, 80,152, 57,160,
-130,100,208,128,213,254, 68, 8,212,122, 16,212, 74,229, 56, 21, 56, 29, 2, 70, 71, 17, 87, 54,237, 10, 14,220, 54,133,157,167,
-209,201,221, 71,230, 87,113,120, 53,157, 29,246,106, 6, 12,152,129, 16,210,249, 77,245,231,108, 64, 91,238,120, 45,174, 70, 77,
-199, 81,154,171,176, 55, 90, 83,140,152,173,158,165,173,193, 18,208,187,175,191,247,118,104,166, 59, 84,104,101, 1,138,167, 2,
-224,165, 82, 87,239,131,192,143,214,244,149, 32,104,206,248,115, 43,247,203,226,143,110, 87,212, 39, 87,229,221,112,121, 78, 60,
-184, 43,236, 9,138,137,158,216,243, 33,205, 19,105, 2, 13,150,200,224,232, 34, 92, 86, 73, 98,213,177,217,137,182, 57, 88, 3,
-155,103,121,136,158,177,221, 52, 39,220, 21,246, 69, 80,245,189, 12,160,218,129,200,124,252,106,150, 23,203,105, 1,234,176,190,
-177,188,161,167,216, 8, 77, 18, 43,141, 47,176,104,181,253,172,251, 89,157, 94,248,125,204, 99,168,126,145,219,139,238,233,251,
-253,147,157,120,114, 85,183,143,107,143, 72,235,106, 72,210,223,214,124,164, 17, 1, 54, 47,246,249, 57,199,127,227,205,221,178,
-191, 25,151, 51,229,146,118,159, 14, 31,124, 62,228,135,128,166,148,223,255,235,143,195,111,191,188,254,251,229,213,179, 47,174,
-191,249,238,199,241,112,251,251,203, 63, 95, 59,115, 20,242,230,190,220,158,195,219,131,255, 39,236,239,154, 80,102, 6,225,205,
-180,128,248,164, 16, 78, 7,106, 62,109,204,170,250,239,211, 67, 45,142, 98,122,177,247, 79,191,250,242,249, 15,223, 74,189, 57,
-133,116, 58, 28,242,129,221, 18,216, 96, 23, 88,209, 70,140,199,248,225,229, 3,253,120,247,110, 79,139,112, 5,156, 70, 92,128,
-215, 48, 81, 56,163, 87, 73,205,247, 96,182,173,161, 82,238, 60, 12,117, 40,205,130,200,153,114,157, 27,133,148, 88,226,158,174,
-227,165, 73, 26,220,215, 0,190,156,115, 23,138, 55, 11,192,114, 30, 23,149,179,167,149, 45,219,148,221,204,153,201,189, 54,216,
- 72,140,138, 49, 46, 32,109,188,180,194,250,251,201,142,235, 80, 86, 70,189, 10, 35,144,102,164,162,213, 38,205,245, 24,153,218,
- 57,199,193, 51, 87, 68,154,164, 63, 89,101, 14, 84,171, 36, 84, 70,238, 51, 20, 86,167,182, 91, 90,149,215, 44, 7,191, 42,216,
-156, 51,185,105, 9,196, 6,121,201,195, 98,217, 25,195,243, 91,163,186, 65, 91,171, 55,194, 36, 3,184,165,122,222,152,129,139,
- 56,101, 75,239, 93,179,165, 12,140,165,172,147,105,255,119,167,213,106,200,242, 65, 92,203,163, 5, 12, 1,155, 87, 36,146,174,
-145,128,136,165, 5,130,167, 74,145, 55,143, 46,254, 19,128,163,107,217,145,155,136,162, 85,229, 71,185,220,246,116,102,144,134,
- 33,137, 80, 2, 1, 33,194, 2,101,195, 50, 31,193,142, 95, 64,145,248, 9,254,129, 15,128,111, 96,133,196,130, 21, 43,118, 72,
- 44, 2, 8, 36, 80,166,103,104,119,251, 81,174, 39,231,120, 61,173,110,143,125,239,173,115,124,239, 61,167,120,245,213,151,220,
-160,166, 29,185, 47,184, 12,133,208,107, 81,196,192, 28,132,216, 52, 15, 56, 36,141,216,110, 40,244,152,185,112, 4, 48,196, 97,
-213,228, 16,106,117, 97, 45,202, 62,165, 0, 45,176, 38, 23, 61,179, 75, 20, 12, 9,124, 3,132, 96,106,184,165,185, 2,215,197,
-172, 17,238,202,109, 78,133, 19, 95,238, 56,110,252,161, 94, 59,250, 79,200,105,108,164,154,173, 13, 3, 29,187, 98, 70,169,204,
- 51,210, 44, 31, 66, 4, 27, 90, 23,207,158,148,141,238,108,113,107,231,120,118, 11,202,163,176,126,105, 86,195, 75, 87,172,173,
-192,129,156,211, 71, 33,178,177,246,253,174,171,226,133,238,246, 50,106,217,148,251, 30,229, 27,192,102,155,249,219,237, 80, 17,
-141, 74,109, 91,181,101,131,219, 84,211, 36,219,111,222, 21,194,225, 95,107, 13, 62, 13,170,153, 52,128,116, 40,183,141, 65,220,
-171, 92, 14, 59,101,182,185,163, 53,209, 6, 62,178, 43,199,189,128,200, 46,131,163,111,170,164,121,205, 82, 44,173,147, 35,202,
- 49,151,246,195, 50,117,224,113, 96, 33,163, 72, 67,133, 66,100,157, 27,212,148, 38, 31,231,132,144,158, 36, 74, 24,101,214,193,
- 93,132,175,142, 8, 49,252,140,116, 5,135,117, 52,241,171, 0, 19,198, 9, 23,216, 33,197, 83, 76,213, 74,217,126,202,145,128,
- 41,136,154,155,101,180,220, 40,248,166,110,229, 36,106,141, 36, 3,162,168,148,102,215,122,115, 41, 90,185,226,225, 13,181,103,
- 90,132,103,169, 40,126,149, 84, 11,148, 80,104,196, 72,119, 69, 17, 73,124,103,195,182,115,204,198, 52,133,236,155,194, 84, 37,
-149, 55,118,117, 85,248,142, 94, 6,220, 68,102,119, 28,136,169,106, 1,188,113,129,154,246, 21,218,139,178, 54, 96,192,179,177,
- 93, 84, 43,190,219,200, 35, 39,124, 50,209, 0, 30, 40,237,126, 35,187,169,113,147,219, 44,195, 54,206, 68,195, 1,240, 9,196,
-150, 24, 29, 80,145,108, 53, 40,164,163, 61,131, 11, 37,167,212,220, 38,132, 14,170,212,251, 18,232,127,127,169,234,119,203,239,
-237,249,159,101,208, 8, 15, 0,172, 25,129, 49, 81,112,146, 32, 99, 84,209, 82,201, 38,132,144, 8,194, 10,101,203,190,200,149,
-147,148,122,225, 19, 83,170,119, 56,198,218, 79, 95,156,202, 27, 36,114, 41,150,182, 1, 1,147, 76,187, 2,101,174,161,146,175,
-146,192, 90,174,226,190,242,182,150, 72,253,241, 28,110,239,202,107,145, 63,185, 49,101,106,150, 52,115, 36, 34, 41, 96,196, 99,
- 24, 15, 28,202, 5, 58,218, 84, 9, 19,119,173, 90,148, 58, 18,227,205,236,132, 94,153, 84,101, 88,212,230,101, 76, 23, 99, 69,
-139, 6, 89,109, 43, 38, 8,167,120,108,196,237,226,222,127,157, 30,246,213,152, 4,200,145,103, 79, 48,119,148,213,151, 11,135,
-161,104,179,240,248,163,254,215, 7,254, 71,123,154,232,214,219,154,230,233,147,250,189, 71,242,250, 50, 24,147,144,146, 43, 82,
- 19, 64,244, 32,214, 99, 84, 7,246,116,113, 92, 77,148, 78,115,247,241,246,110, 25,254, 29,242, 93,234,250,246,209,243,203,254,
-130,250, 78,160,166,211, 97,248,233,135,223,255,251,229,234,249,103,175, 94,126,241,205,219, 47, 63, 95,220,155,239,190,253,250,
-207,187,243, 95,193, 15,179, 58,158, 7,142, 25, 69, 55,156,252, 69, 89,237,189,208, 6, 97,150,140,174, 31,104,249,198, 89,135,
-180,106,138,123, 27,246, 82, 94, 93,152, 15,122, 45,198,211,207,191,189,126,250,226,195,221,199,207,246, 15,223, 49,166, 27, 78,
- 71,115, 63,113, 19,175, 46, 8, 9, 1,173,215, 63,174,158, 60,254,123,247,172, 60,222,198, 14, 73, 72, 85,185, 28, 98, 33,141,
-211, 81, 89, 32,217, 90, 39,201,166,194, 5, 85,108, 61, 93, 52, 19,162, 93, 35,255,150,102,223, 54, 56,104,156,223,228,111,179,
-179, 56,234,112, 0, 44, 18,151, 18, 0,232, 23,156, 67, 32,111,249,132,162, 25,194,110,244,171, 94,236,168,215,181,228,194,196,
-166, 76, 55, 38,234, 71, 39, 64,212, 33, 78, 20,144, 89, 44,254, 12,120,142, 83, 32,211, 55,100,162, 15, 12,109,253,124,246,241,
- 94, 82,137,139,102,100,142, 94, 54, 20, 71,149, 32, 88, 72,124, 7, 98, 12, 78,141,232,173, 42,182, 60,184,179, 64,119,206, 26,
-183,133, 38,245, 34,130,248,218,230,186,245,243, 91,217, 36,154, 97,128, 12, 87,155,119,101,121,115, 89, 32,135,104,122, 36, 22,
-141,223,171,245, 78, 54, 32,204, 56,124, 64,191, 53,145, 63,178,180, 6, 52, 21, 42, 21, 29,194,128,136, 47,225,234,144, 58, 57,
-236, 98,155, 77,220, 38, 62,234, 57, 90, 37,254, 23,128,164,107,217,145,156, 8,130,229, 42, 87,185,108,183,167,187, 25,134, 5,
- 1, 43, 33,208, 74, 92,144, 0,241, 3,112, 65, 92,248, 3,238,156,249, 6,126,130, 31,225,192, 1, 9,137, 3, 72, 35, 36,184,
-176, 11, 2,193,176, 8,137,153,157,238,182,219,174,151,203, 68,152,235, 28,102,198,229,116,102, 68, 86,102, 68, 25, 43, 2,189,
- 85, 51, 67,243,203, 91, 71,183, 4,149, 6,144,176, 42,191,204,150,243,126,212,130,159, 57,166,142,239, 74,209,151,151,147, 47,
-194,173,134,116, 11,128, 16,105, 82,157,153,198, 2,101,101,104,194,100, 50,125,116,204,232, 36, 48, 13,231,227, 51,173,164, 10,
-205,171,146,188,238,117,210,188,215,142, 29,165, 30, 29, 75,225,156,109,112,139,175,150,244,204,157,103,223,233, 57,158, 18,251,
-179, 81,251,233,112, 22,118, 63, 0,137, 4,240,167,150, 38,226,212,139, 83, 78, 4, 59, 14, 69, 97,199, 98, 76, 1, 53,200, 38,
-121, 39,240,199,151,171, 75,117,235,172, 71,121,167,134,108, 93,169,100, 81, 63,216, 86, 47,184,229, 99, 27,105, 74,246,188,204,
-210,225, 95,104, 27,112,102,160,155,162, 65,192, 80,111, 66,208,228,158,171,100, 72, 15,186,217, 0,187,159,145, 41,123,112,122,
-131, 66,145,153, 67,227, 50,227,220, 74,130, 41,218,210,100,226,183,180,148,255, 47,238, 18,158,208,247, 71,244,153,238,131,129,
- 38,190, 17,164,105,108, 68,133,135, 88, 38, 71, 11, 43, 80,170, 98,147,242, 57,205, 49, 75, 78,128, 57, 20, 83, 26, 73,184,245,
- 38, 35,241,248,169,185,227, 22, 70, 70,149, 12,160,215, 58,255,156,232, 88, 8, 60, 76,249,228,222,212, 23,105,159,232,240,212,
-164,213, 18,131, 25,172, 86, 72,221, 26,193,166, 27,159,120,131,209,181,212,171,162,231,121,106,132, 68,152, 32,180, 0,232,207,
- 22, 37,101,245,187,208,212, 90,181,136,191, 25,169,166,176,178,118,148, 60, 68, 78, 2, 36, 0,247,212, 58,230, 46,166,165, 10,
-231,118,109,118,162,222, 36,237, 81,234,253,152,230,154,243,168,106, 48, 26,184, 37,143,231, 61,162,146,130,166,198, 18, 8, 80,
- 78,142,125, 38,145, 15,138,125,134,133, 93,186,130,189,192,137,110, 29, 28,190,146,156,144,210, 19,133, 20,212, 11, 52,231,148,
- 17,217, 41, 88, 80, 62,103, 15, 82, 59,206,106, 21,173,201, 32, 64,249,130,162,194,205,102,233, 69,241, 52,158,193, 57, 39,142,
-115, 5, 66,207,105, 0,122,206,113, 42, 42, 4,156, 76, 43,157, 18, 73, 68,164, 94,208,215,101,212, 14, 28,103, 55,107,182,196,
-103, 5,236,209, 2, 27,221,163,232, 13,179,218,230, 85, 75,202,112,141, 22,224,218,251, 75, 61,247,154,155, 33,120, 92, 3,186,
- 84, 58,174,240, 48,238,192, 47,211,241, 31,249,198,239,211,123,175,109, 79,179,249, 69,132,151, 40,102,146,142, 75, 24, 64,146,
- 41,101, 69, 15,220, 44,117,203, 33,244, 2,181, 24,191,121,108,230, 43,179,146, 21, 60,166,226,246,175, 71, 49,160,111, 76,156,
-115,239, 77, 93, 19, 47, 20,157, 16,207,172, 24, 42, 86,193,181,125,166, 3,168, 89,173, 71,228,129,140,144, 32,222, 71,249,168,
-175,138,239, 69,255,107,118,109,181,123, 32, 94,233,196,126, 11, 6, 76,245,203,116, 82,248,170, 51, 47,173,241,156, 56,105,222,
-167,121, 11, 86, 18,220,236,255,141,253,237,208, 39,198,232,243,175,214,219,231, 76,107,241,142, 74,163,252,147,199, 39,247, 91,
-249,250,203,159, 63,250,228, 51,177,171, 86,187,101,113,255,243,183, 79,110,254,126,247,163, 79,135,175,190,120,113,187,125,236,
-203,211, 48, 87,109, 52, 21, 14, 65,253,116, 63,221,114, 61,197,227,160,246,170,196, 91,124,103, 79, 21,196,155,232,235,174, 6,
-196,219, 86,197,195,174,188,190,249,243,250,203,239, 62,248,248,253, 63, 46,132,122,235,205, 43, 85, 78,223,124,189,220, 29, 39,
-132,205, 6, 20, 43, 63,253,235,240,240,250,199,183, 63,124,244,195,240, 32,164,163, 46,229,221, 81, 90,189,193, 75, 83,147, 55,
- 92,249,180, 39, 57, 10, 35,245, 68,169,219, 75,165, 78, 85, 14,148, 70, 87,147, 28,109, 84,129, 58, 59,188,192, 51,217,244,131,
- 97,198, 77,121, 60,220,210,244, 0, 36, 48, 24,176,105, 55, 58,112, 35,100,242, 20,216, 89,200,224,193, 25, 68, 60,202, 73, 90,
-135, 40, 14,139,227, 72,225, 28,152,230,210,168,165,149, 14, 85, 4,217,144,151, 51, 62,244, 6, 4, 10, 63,163,235,176, 1,153,
-165,112, 88, 66, 58,198,103,203,188,140, 51,148,209, 22,158, 46,101, 69,236,193,160, 81,252,180,216,108, 27,164,199,179, 15,157,
-173, 0, 15,180, 6,252,158,230, 49, 82,249,160, 22,193,109,154, 72,130, 60, 81, 98, 16, 52,212,130, 17, 70,111,229,218,243,166,
-122,175,218,118, 85,179,171,166, 35,240, 46,237, 18,145,119, 19, 34,190, 92, 23, 23,202,112,206, 23,188,221, 42,115, 46, 26, 4,
-135,140,106,220, 32,131,238,112,102,255, 9, 64,211,181,236,202, 81, 67,193,182,221,118,187, 31,119,238,220, 7, 34,143,139,128,
- 8,129,196,134,108,216,160, 32, 16, 95, 1,251,252, 1,226,111,248, 8,150,252, 3, 18, 43, 22,144, 13, 27, 18,146, 12, 34, 51,
-211, 79,187,253,160,170, 35,102,123, 71,234, 59,110,251,156, 42,159,115,170,212,211,239,159,114,138, 60,109,166,216,108, 76, 11,
- 70,112, 56, 39, 83, 68, 13,129,217,131,118, 96,223, 9,254,125,155,251,165,197, 18, 65, 73,193,126, 23, 33, 56, 45,136,112,181,
-224,188,128,159, 47, 66,211,177, 4,132,212, 1,215, 57,128, 10,145,231,134,150,143, 84, 74, 91, 37,160, 42, 98,226,234, 69,177,
-132, 81,110,141,152,192, 19, 14, 24, 41, 96, 61,166, 19,150,188,247,116, 88, 73, 72,161, 38, 13,209,245,193,106, 55, 45,105, 2,
- 59, 91,227,208, 59,234,232,249,145,221, 1,163, 90, 84, 95, 80,164,202,129, 8, 8,111,117,105, 68,147, 76,141, 61, 97, 27, 48,
-135, 86, 85, 70, 95, 52, 1,176,175,193, 18, 91,144,124,181,179,134,205,138,183,123, 28,174,198, 0,127,104, 94, 92,217, 76,115,
-185,170, 51, 34,212, 66,128, 35,237,105, 8,195, 25,123, 33, 89, 14, 4,185, 97, 45, 28,121, 49, 16,125, 33,139, 50,232,225, 84,
-226,235,177,164,226, 23,150, 21,180, 44,225, 9,179, 4,216, 34, 66, 68,120, 77, 37,248,136,228, 3,138, 48,155,209, 47,200, 57,
- 65, 12, 0,111, 57,142,242,168, 54,180,207,238, 55,154,162, 58, 17,230, 55,160, 12,103,130, 84,207, 57, 84,132, 70,191, 56, 63,
-143,136, 13,101, 61, 1, 6, 47,148,126, 3,120,174,233,198, 69,199,114, 75, 10, 65,109, 39,154,234, 5,176, 61,250,179,151,121,
-160,209, 26,171,104, 88, 24,139,192,203,106,113, 81,123, 45,111, 20, 30,168,129,209, 17, 84,178,234, 16,100,140,236, 52,104,178,
-108,141,183, 23,165,139, 84, 36, 51, 72,208,187,210, 82, 75,146,213, 7, 11,160,109, 40,233,135, 52,145, 86,124,167,234,150,197,
-242, 6,156,109,198,117, 64,190, 44, 41, 42,152, 65, 70,107, 49, 87,244,225, 35,192,160, 57, 14,184, 44, 87,133,126,242,108, 22,
- 51,234, 66,187, 5,236,204, 21,111,141,157, 64, 42, 88,243, 5,147,165, 91, 84,136,188,250,163, 55,120,142, 28, 89,166,123, 59,
- 64,109, 27, 82,179,233, 35,129, 6,120, 86,125,134,243,152,174,179,186,183,254,188, 0, 40, 2,201,141, 96,231,153,158,227, 47,
- 83,152, 83,209,227,151,135,173,237,159, 29,190,180,105,243,155, 26, 9, 86, 77, 81,130,207,110,149,165,216, 17,129,117,143, 62,
-113,183,159,169,241,181, 98, 23, 87,146, 96,192,145, 29, 55, 6,167, 20,107,104, 40,172, 87, 58, 16,136, 64,211, 39, 14,182, 35,
- 40, 32,142, 44,170, 58,156, 78, 87,119, 53, 98,249, 75,159, 86,150,182,252,236,166,153,119, 98, 64, 9,111,109,169, 86, 44,237,
-186,153,231,208,120, 21,201,129, 74, 37,172, 69, 8, 74,165,241,174, 9,233,216,177, 28, 64,115, 56,170, 76, 9,150, 65,142,201,
- 63,254, 35,190,191, 51, 7, 34, 78, 78,132,208,193, 10,240,169, 86,141, 40, 16,225,242, 67, 49,222,243, 63, 5,188,222, 15, 30,
- 21, 15,154, 92, 97, 85, 70,129, 51, 52,142,217, 71,217, 15,156, 28, 47,105,238, 64, 72,224, 57, 17,158,250, 98, 58, 47,224,191,
-231,193,219, 32,174,118,237,245,245,165,190,228,252, 4, 8,216,179, 95,142,243,139, 79, 63,250,230,199,135, 95,125,199, 98,244,
-255,159,139,155,251, 95,124,252,249,151,223,254,112,122,246, 91,173,219, 55,203,244,207,120,188,191,171,251, 34,252,250,124,248,
-115, 8, 67,140,115, 84, 71, 39,254,157,200, 88,170, 74, 29,114, 4,167,123, 96,101,107,243,135, 87,205,221,190,251,235,197,241,
-247,195,240,228,235, 39, 8,253,175,252,144,223,121,247,246,230,118,122,254,170,236, 39,240, 17,225,176, 87, 11,219, 31,222,187,
-203,127,223, 61, 62,245, 71,157,231,213,156,218, 61,128, 17,248, 36, 80, 91, 69,160, 27, 52, 64, 32,248,216,233,114,117, 78, 79,
- 56,139,116, 92, 66,176,117,217, 81,196,215, 11,142, 17,175, 42,204,196,117,156,110, 11,253, 72, 51, 0,236,207, 49,206,120,204,
-121,196,127,120,164,220,172, 73, 98,112,243,196, 38, 38, 78, 91, 15,175, 7,214,195,168, 11, 22,129,207,241, 54, 67, 73,237,115,
- 80,167, 72, 75,189,232, 1,233,144, 36, 41,216, 68,159,114, 65, 7, 3, 31,100,169, 13, 2,133, 80,178, 9,244, 67,136,236, 58,
- 4, 62,145, 32,115, 85, 99,128,178, 52,246,199,202,193,121,108, 63,228,232,102,218,215,120,137, 66,239, 28,222,206,117, 83,167,
-182, 40,106,131, 80, 46,140,170,120,169, 41,101,103,227, 90, 86,109, 77, 69,214, 18,167,100, 62,171,203,149, 93,236,179, 7,179,
- 86, 43,229, 95, 65,202,187,196,238,198,128,231, 47,109,157,116,147,149,245,125,170,129, 1, 74,206, 75, 80,214,252, 63, 1,184,
-186,118,221, 72,138, 40, 90,213, 93, 93, 85,221, 61, 61,158, 25,219,194,130,149,144, 16,114,178, 34, 0,137, 96,191,102, 3,126,
-131,156,239, 32,216, 95, 64, 36,155, 35, 33, 2, 2,136,144, 44, 12,171, 69,182,199,179,211,211,207,122, 53,231, 12, 25, 14, 28,
- 89,154,113, 61,238, 61,231,214,189,231, 96, 23, 85,118,150, 55,160,214,187,162, 86, 36, 88,154, 91,102, 5, 40,164, 20,254, 18,
-159,192, 9,153,179,131, 43, 45,229,169, 66,131,223, 6, 73,194,251,145, 30, 76, 41, 15, 97,240,136, 32,225,236,211, 71,224,122,
- 92,248, 36,160,193, 77,198,188,152, 8,225,112,113,129,195,123, 42,251,101,245, 89, 35, 88,142,211, 17,161, 92,209,133,111,118,
- 8,139, 76,148,241,191, 6,242, 49, 0,102, 12, 52,141,201, 91, 22,177, 63, 0,248,251, 57,105, 0, 16,208,128, 89,207,212,133,
-193, 38, 1, 55,151, 71, 22,124,231,221,180, 43,118, 1,244,202,136,181, 47, 79, 73,110,189, 51, 27,217,217,143, 46,217, 65,110,
- 74,112,154, 32, 83,101, 64,152,202, 80,216, 88, 0, 9,204,165,210, 61, 18,106,152,155, 85, 53, 98, 15,177,238, 3,165, 56, 65,
-196, 44,171,199,188,107, 8,155, 99, 9, 6,202,247, 48, 45,140,244,200,119, 52,206,241,121, 2, 34,156, 40,132,165, 82,228, 12,
- 15,152, 16,104,224,228, 43,201,162,211,172,168, 97, 4,252, 8,132,178, 60,118, 14,144,174, 74,241,106, 73,173,197,193,235,193,
- 52, 69, 31,145,194,146, 26,249,172,246,152,229,187,195,232, 87, 89, 40, 77,209, 77,157,138, 93, 39, 53,176,246,108,105,178, 45,
-129, 55, 22, 78,165,138,128,240, 7, 60,167, 34, 8, 0,190, 57,168, 81,198, 87,141,200,234, 69, 81, 82, 16, 97,227,243,231, 64,
- 27, 30,172,101, 42,113, 35,104,166,101,207, 94,137,180, 97,233,249,120, 86,169,120,188, 48,174, 94, 26,234, 6, 21,193,196, 83,
-216, 94,251, 44, 47,105,252, 94, 88,211,118, 69, 46,253,182,241, 54,242, 85, 55, 17,248,203, 54, 83, 26,233,170, 74,170, 75,251,
- 41, 27, 70, 63,150, 26, 96,191,201,188,148,211, 52, 79, 6,119,160,186, 86, 0,210,233,220,175, 32,106,225,132, 70,178,197, 1,
- 15,235,180, 84,160,195,145,131, 31, 77, 29,143,132, 10,162,202,217,107, 67, 49, 67,195, 38,206,224,179, 52, 45, 77, 57, 35, 55,
-120,250, 17,159, 39, 54, 17, 57, 65,248, 22,246, 92,181,156, 93, 23, 85, 93, 54, 8,190, 8, 97,164,131, 29,142,103, 74, 99,232,
- 15, 68,241, 88,160, 83, 34,132,230,201,158,151,213, 9,204, 71,184,140, 53,245,149,197,102, 81,161,243, 84,120,157,115,250,111,
- 25,196,216,142,115,115, 17, 70, 62,208, 40, 44, 44, 32,146,114,132,201, 72,154,124,175,161, 78,159, 52,236,220, 25,128,235,196,
-108, 84, 61, 7,100,158, 98, 16,237, 40,251,251,225,234,179,230, 34, 95,246,180, 21,230,123,113, 92,172, 97,251,190, 64, 60,178,
-140,242, 57,237, 37,176,159, 1,217, 77,239, 57,131,193, 70,106,169, 78,153,199,237,165,150,169,137, 89,206,139, 70,217,183, 10,
- 11,144,225,184, 80, 84, 63,114,116,103, 41, 44,245,249,129, 34, 16, 5,144,122,176,133,117,116, 47, 46, 55,191,136,221, 83,136,
-159,178,121,225,216,139,113,144, 19, 66,198,128, 27,157,107, 35, 44,168, 59,197, 69, 50,154, 34,231, 4, 15,147,155, 78,209,117,
- 62,246,131,240,198, 94,235,237, 77,129,204,149,234,126, 60,140,119,191,118,141,249,230,139,215,223,138,245, 70,252,239,231,249,
-233,135, 31,223,252,241,253,119,211,244, 92,246,203,253,126,196,183,197, 10,220, 63,248,127, 90, 87, 84,154, 93,206,248,183, 61,
-251,132, 91,183,252,182, 31,191,220,230, 55, 86,183, 62,126,158,153,175,175, 54,229,174,249,253, 93,247,230,253,187, 63,239, 30,
-110, 63,249,234,222,189, 61,100,195,205,203,219,250,239,191, 30,222, 62,173,135,100,183, 52,228,122,192,253,253,233,231,219, 23,
-175, 14,155,143,211,254,174,193,177,154, 0,216,240, 97,195,123, 33, 54, 28,125, 43,115,211,105, 62,165,217,149,142, 71,196,111,
-151, 77, 44, 90, 39,199,206,168,146,130, 78,189,100,174, 72, 33,206,126, 40,214,149,217, 14, 51, 0,123, 0,226,226, 27, 39,229,
-183,117,225, 30, 89, 38,148,165,183,115,234,112,172, 99, 88,251,202,184, 98,204,219,180, 18, 44,250,103,200, 34,174, 75,100,202,
- 22, 24, 74, 3,211, 79,103, 39,162,108,194,153,167,134, 46, 96, 19,224,178,230, 84, 29, 13,179,138, 33,168,197,168, 75,197,161,
-112,195, 82, 8,141, 74,147,236,139, 34, 67, 80,187,148,186,168,245, 0,194,186, 1, 61,247,214, 54,185, 14,186, 27, 18, 71, 73,
- 27, 87,167, 18,121, 37, 74,186,208,158,107,174,235, 24, 74,210, 90, 86,121, 38, 36, 15, 47,125, 72,101,189,194,127,178,232,106,
-150,147, 40,129,249,102,251,193,138,161,114,102, 94, 10,132, 81,160, 62,179,106,129, 31,133,187,112, 54,101,203,250, 95, 1,152,
-186,146, 29, 73,106, 40,232, 37,157,118, 46,213,217,203, 76,183, 70,204, 5, 46,160, 65,220,184,207,127,112,227, 87,248, 48, 14,
-240, 1,128,132,232, 3, 18,210,128,104, 24, 70, 51,189, 84, 58, 51,189,164, 77, 68,113,225,214,151,234,172, 74,251,189,136,176,
-223,123, 1, 78, 31,217,130, 78, 50, 69, 59, 15, 14,149, 62, 53, 90, 58, 33,103,236, 75, 54,139, 88,252, 79,231,198, 53,213, 22,
-120,216,176,115, 55, 41,223,212,182, 21, 60,133,165, 11, 20, 72,142, 90,211, 78,111,172,204,241, 31,144,165, 34, 37, 58, 89,128,
-147, 58,246,145, 88, 69, 91,119, 96,193,182,157,156, 56, 0,144, 96,199, 42, 70,218, 38, 55,146,253,230, 76,144,241, 41,131,205,
-248,251,153,248,205, 19, 76,229,232, 34, 93, 3, 21, 70,142, 58,204, 18, 1,247, 94, 38,224,129,195,147, 57,169,214,134,118, 40,
- 13, 8, 92, 49, 45,226, 1, 26,215,109,231,187,243, 3, 18,195, 24,215,234,117, 29,167, 44,250, 11, 54, 49,103, 61,129,132, 34,
-217,153,243,103,141, 69,144, 79,244,252,163,132, 25,104, 63,206,102, 39, 4,219,220,234, 78, 3,223,193,210,120, 27,110, 78,190,
- 35,228, 86, 14, 50,177, 0,255,218,198,200,141,243, 20,138, 57, 93,218,241, 44,144,238,199, 45,136,134, 8,216,132, 15, 0,202,
- 64, 35,156,140, 53,227,153,158, 76,118, 93,115,186, 55, 53, 1, 39,188,125,194, 46,170,200,226,206,107, 40,164, 61, 8,154,104,
- 92,141,235, 49,149,101,231,105, 54,176, 30,204, 87,174, 60,189,169,197,235, 61,110,147, 43,155,110,116,162, 62, 79, 16, 69,131,
-198, 51,247, 3,178,210, 62,176,216, 23, 52,109, 77,174,121,192, 87,113,249, 52,252, 79,106,236, 58,133,149,195, 39,164,161,230,
-108,227, 51,218, 58, 47,166,155, 56, 42,155,188, 72, 15,197, 92,226, 51, 17, 0,114,178,117,170,107, 97,113,166, 11, 54, 7,187,
-141,216, 60,245,160,155, 68,239, 25,131, 84, 69, 19, 73, 36,122, 44, 84,191,216,253, 12,121,147,151,160,106, 66,148,213, 0, 24,
-245, 62,229, 30,200,232,138,228,125, 3,248, 66, 89,149,237, 36, 22,144,189, 67, 60,186,138,161,148,145,242, 23,152,104, 99, 5,
-114,131,156,130,102,236,189,221,161,164,130, 48, 81, 82,152, 24, 22, 31,225,165,106, 94,114,183,156,213,138,156,221, 89, 32, 35,
-199,249, 66,122, 63, 36, 90,242,106,150, 3, 20,209,121,181, 96, 33,158,196,164,120,224,229,144,232, 19, 53, 50,163, 45,139,220,
-139, 99, 16, 91, 66,140,178,200,119, 85,217,181,136,221,181,252,241,198,121,105, 60, 77,100,164,177,120,163, 29, 4,188, 42,167,
- 42, 68,232,161,238, 36,226, 72,236, 14, 13, 88,249, 0, 98,225,140, 60,221,137, 94, 52, 78,190,139,207, 63,209,215, 85,255,201,
-176,201, 52,181,227,245,176, 61,130,168, 10,122, 41,178, 55,171, 58,104,113,192, 87, 91,163,201,141,231,124,122,144, 18,108, 49,
-188,189,116, 86,186, 72,138,159,163,224,176,122,169, 13, 84,132, 1,225, 75,136, 25, 14,195,247, 28,156, 32,198, 14,192,215,232,
-101, 7,207, 31,175,229,227,185,187,141,219,117,156, 55,164,117,205, 26, 19,252, 48, 48,127,228, 9,222, 97,112, 82,156,230,109,
-120,222,240,219,119,245,180,198,108, 83,242,235, 81,132,251, 52,156,155,209, 86,200, 0,217,135,251,187,237,237,175,195,139,143,
-191,121,249,250,235,255, 37,117,174,198,127,127,173,127,255,243,221,143,223, 47,199,245,213, 52, 33,190,156, 6,243,147,155,140,
-126, 91,131,148, 7,164, 43, 58, 50,107,122, 26,211,121, 75,190,155,203, 93, 91,134, 75,245,226,178,127,253,252,101,119,211,139,
-248,120,115,165,247,219,250,243,221, 79,159,126,246, 10,244,102,121, 88,222,222, 36,245,229,231,239,127,248,197,205, 15,217,209,
- 13,218,118,249,254,205,219,143,110,191,189,250,226,171,223,126,151,237, 25,244,189, 1,151, 50, 37,158, 33,127, 29,172, 93,216,
-223,128, 5, 87, 62,254, 21,131, 82, 78,181,121,207,250,105, 93, 56, 35,140,198, 18,144,137,169, 84,239, 74, 40,122, 12, 49,244,
- 96, 16,205,188,207,188,202,139, 64,183,144,123, 36,111, 53,206,237,190,127,224,100, 2,250,143,218, 92, 23, 39,183,194,106, 80,
-253,184, 44,245,216, 66,164, 7,139, 39,171,147,223,134,140,153,163,216,157,112,162,151,155,209, 22, 66, 14,248, 31,229, 10,157,
- 66, 7,115,137,180,126,232, 55,185, 64,210, 98, 99,133,193,184,182,233,117, 64,194,181,213, 22, 35,244, 33,157, 33,163,151,126,
-234,179,153, 89,206,203, 49,253, 88, 39, 55,169,163, 10,108,147, 76,170,101, 23, 58, 68, 90, 87, 56,218, 89, 34,174,134,130, 87,
-108,141,205, 45,107,124, 23, 95,186, 14,105,101,230,209,126,144, 37,142,229, 16,140,241,132, 87,214,102,123,127, 49, 76,143,226,
- 74, 67,160,114,248,112,253,240,175, 0, 84, 93,193,174,227, 52, 20,181, 29, 59,118,146,166,125,237,155,167,209,240, 22, 8, 36,
- 70, 72,136,145,216,204,158, 15,152, 21, 31,197, 87,241, 3,179, 64, 26, 88, 33,216,176,123,204, 43,180, 77,211,196,142, 29,103,
-206, 9, 11, 68,183, 85,165, 52,182,239, 61,231,250,222,115, 88,153, 43,214, 6, 53,236, 77, 79,183,135, 98,157,236, 67, 28,161,
- 53, 76,163,156, 31,241, 20, 44, 90,210, 43,147,125,141,201,101,124, 79,107,100,250,226, 1, 30, 16,114,241,138, 14, 71,193, 38,
- 32,231,114, 18,173,158, 78,192,192,195, 58,139,142,181,239, 51, 96, 67,110,129, 34,188, 28, 3,171, 94,134,147, 2,156, 66, 88,
- 60,169,179,164, 28,200,114,185,122,203, 30, 29,112,209,148,220,177, 79,136, 60, 28,144, 12,121,210,212, 44, 9, 71, 29,104,177,
- 78, 85,148,222,184, 6,236,153, 55,235,203, 48, 24,182,230,148,153,243, 0, 69, 52,117,139, 45, 87, 23, 21,112,102, 94,246, 15,
-205, 60,123, 68, 31,171,220, 0,228,142, 4, 96, 65, 75,118, 75,140, 14, 9,100,107,212,137,109, 77,115, 99, 13, 98,195,200,129,
-114, 32, 95, 10,176,121,149,124, 1,190, 66, 93, 6, 96, 73, 2, 39,228,165,196,217, 74, 94,157,165, 98,189,167, 11,244,188,205,
-172, 1,100,250,156, 2, 70,106, 68,142,165,231, 99,139,182,139, 89,132, 75, 12, 91,121,235,217, 3,203, 54,232,110, 24,186, 92,
-174,206,214,179,159,136, 32,122, 93,224, 23, 8,226, 33,116, 88, 97, 86,187, 65,117,227,237,124,147,247, 8, 18,115,238,168,105,
-165,206, 74,218,152, 74,108, 58,236,130, 2,104, 22,217, 33, 81, 77,238, 44, 4, 53,100, 40,186,232, 1,198, 21,232, 27, 61,239,
-129, 54,247, 90,177, 3,106,164,160,231,192,122,137, 68, 28,188, 11, 57, 57,181, 99, 29, 92,109,168,164,155,213,181,110,108,102,
- 31, 40,225, 43, 57, 73,105,103,206, 92,139,196,123,231, 78,131, 90, 5,154,172,100,213, 6,155,177,120,236, 59, 22,126, 79,130,
-140,127,127, 46,134,151,153,122,187,235,212,113, 81, 2,115,108, 0, 56, 29,111, 85, 18,219, 54,120,213, 0,212,195, 10, 68, 98,
-205, 0, 7,134,154,147,200, 65,216, 11,116,210, 69,178, 7,100,210,171,232,243, 60,130,111, 36, 4,199,130, 46,218,185, 74,108,
-167,197, 14, 6,234, 64,156,213,125, 29,131,149, 60, 16, 2,225, 50, 32, 25,233,233, 25,239, 72, 76,120, 59,207, 11,205,209,123,
- 54,176,248, 73,172,131,175,162, 48, 20,165, 44,214, 37,228, 28,168,252,183,103,128,146,144, 44, 44,138, 63,171,178, 27, 89,102,
- 41, 93, 89,233, 89,241,162,211, 72, 36,117, 35,145,208, 0, 87,232,162,225, 45,254,231,137,238, 6,120, 44,181, 20,126, 94,213,
-107,111,207,105, 23,110,174, 44,163, 7,103,222, 80, 92, 3, 16, 47, 71,189,196,118,150,141,146, 71,234, 4,226,213, 99, 67, 41,
- 36, 93,164,185, 65, 59, 77,215, 49, 49, 42,241,145,161, 30, 97, 81,237, 65,157, 40,219,207, 58, 15,144, 80,229,109,107,189,183,
-180,253, 41,144, 77, 17, 63, 71, 57,140,230,149, 27,246, 95,237,126,125,180, 63, 45,254,151,120, 14,198, 1,117,152,121,179,112,
- 2, 31, 4,156,167, 87,136,181,238, 7,196, 0, 22, 85,134,138,227,194, 8, 14,199, 57,103, 0, 7,171, 54,245,225,177, 54, 22,
-239,198, 95,158,135,252,199,225,245,155, 31,219,183, 63,252, 63,184,255,247, 49, 15, 47, 79,253,116,124, 74, 47,172,121,216,149,
- 78,140, 41, 40,221, 26, 18, 36, 86,130,128, 70,120, 52, 10,189,246, 65,155,185,191,229,223,131,120,247,217,183,239, 94,223, 63,
-190,249, 92,124,179, 23,239,127,171, 62,142,213,245,169,255, 59,174, 78, 4,210,165,205,124,189,216,195,225,197,151, 95,168, 15,
- 31, 52,210, 61,200,198, 19,239,250,242,207,239,191,254,238,251,127,118,119,141,250, 43, 46,154,166,211,246,149,138, 39,118,214,
- 37,234,215,106,170,168, 6,179, 25,117, 87, 13,216,220,163,207, 99,121, 51, 54, 78,161, 77,190, 36,240,169,169,145, 25, 3,224,
- 80, 47,107, 77, 19, 98,138,180,154,235, 20,175,226,236,134,106, 90,139,215,195, 73,223,149,226,156, 61,229,196,169, 17, 21, 20,
-120, 31,176,167,174,135, 92,213,244,152, 28, 83, 49, 46,193,209, 39, 60, 53, 8, 65,188,238,175, 29, 14, 77, 57, 68,239, 0,231,
- 23,139, 35,226,240,173, 73, 84,167, 13, 81,130,187,170, 45, 13,188, 23, 67, 51,105, 73,114,161, 57, 67,142, 47, 91, 32,126,100,
-122,208,146,188, 56,121,136,142,172, 7,111,116,177,219, 24,176, 61,250, 77,181,197, 6,239,140,106, 13,117,153,238, 65, 26,231,
- 41,226, 71,177, 47, 56,204, 48, 72,179,113, 92,198, 82,205,137, 98,182,148,128,197, 66, 24,160,202,246, 54,211, 67, 42, 41, 47,
-116,184, 52,154,212,227,147, 0,108, 93,205,110,220, 54, 24,228,191,168,149,100,111, 29,231, 84,196,135,246,226,244, 5,122, 8,
- 2,244,101,242, 32,121,174,158,138, 30, 11,228, 9,130, 30, 10, 4, 49,146,198, 91, 75,150, 68,137,127,157, 81,175, 61, 44,124,
- 89,239, 10, 92,242,155,249,200,225,140,249,239, 90,138, 85,148,229,123,154, 61, 81, 76, 83,143,251,118, 26,108,144, 27,191,174,
-197, 28, 75,185,147, 65,101, 10,104,177,128,170,113,145,123, 44, 12, 60,198,194,225,228, 98, 30, 13,218,211,134,174,160,117,204,
- 18,204,221,226,211, 99, 2, 7,218, 35,102,196,110, 39,110,170, 22,202,104,208,108,131,129, 50,156,134,228, 2,140,252,113,141,
- 42,239,237,126, 1,179, 6, 35,177, 46, 8,135,241,214, 1,139,127,162,104, 37,129,122, 52, 21, 96,105,230, 83,118,113, 65,153,
- 0,153, 3,245, 91,245, 34,167,155,173, 67,109,197,168,105, 96,254,126,250,251, 60,169,116,125, 18,226,165,174,141,156, 82,236,
- 79, 54,159,146, 48, 47,122, 44, 45,158,157, 89, 3, 68,104,240,203,215, 53,169,238,140,161, 5, 68, 87, 20,102,172,126,230, 79,
- 37,234,113,216, 6, 98,116,240,152, 38, 25, 77,235, 10, 26, 73,160,173,115,102,102, 86, 53,150, 16,175, 77,198, 80,120, 10, 48,
-231, 65, 81,106,111, 10,240, 42,142,135,151,138, 88,215,153,158,205, 17,212,169, 76, 33,199,186, 53, 99, 0, 0,248,138,217,184,
-240, 98, 89, 73, 77, 42,254,130, 89,149, 27,223,142,170,117, 95,192,142, 81, 92,166, 67,202,134,206, 37, 69,218, 43,187, 29,232,
- 16,153, 58,176,211,192,147, 23,167, 34,117, 54, 32, 80,117, 57, 83, 0,233,176,120, 55,112,210, 10,234,108, 51, 51,184, 74,197,
- 56, 3,131,237,236,100, 35,163,107,236,181,148,155,103,210,180, 0, 11,146, 98,214,244,173,151,215,104, 85, 50,129, 32,150,167,
-125, 59,183,109,140,150, 39,185,232,122,173,137,154,150,126, 33, 49,199,142, 74,157,231, 74, 47, 37, 69, 15,194, 33,172,225,172,
- 55,189,208,116,254, 89,117,182, 45, 59,243,106,232, 30,102, 0, 86,188,180,164,169,123,156,155,116,189,219, 14,203,202, 85, 0,
-205,106, 69, 31,209, 72, 23,116, 50,231, 68,205,131,234,229, 17,166,137,122, 89,120,158,232,152, 52,249, 79,155,141,103, 48, 91,
- 15, 78,195, 32, 2,121,208, 91,128,118,178,202,153,222,124, 19,118,161, 26,103, 71, 87, 91, 3,133,162,105, 88,234,225, 4,169,
-192,230, 0,206, 40,192,237, 42, 48, 77,241, 62,113,248,228, 81, 63, 80, 49, 1,164,106,179,126,194, 63,138,238, 8,121,220,229,
-160,247, 75,106,104,151,109,128,147, 27,131, 16, 40,159,148, 54, 8,106,105,220,113,135, 88, 73, 18, 39, 48,189,198, 58,135,239,
- 49,101,221,194,180,126,127,219,190,210,241,161,238, 3,143, 15,234,152, 80, 2,152, 76,176, 41,102,205,250, 90,243,161, 46, 38,
- 27,230,166,252, 30,248, 35, 85, 62,159,214, 67,217, 42, 49,178,114,126,241,193,153,153,246,114, 78, 63, 74, 49,114, 91, 62,211,
-111, 23,176,251, 92,110,175,151,254,222,255,126, 99,126,205,203, 95,129,200,222, 74,172,102, 52, 2,188, 69,151, 50,123,120, 96,
-150, 39, 32, 29,226, 60,204,164,180,160,165,144, 27, 79, 83, 35,221,202, 68,186, 26,154, 19, 58,102, 35, 46,211,227,248,249,238,
-238,205,251,254,245,255, 22,119,138,123,240,199,220,189,254,249,205, 47, 31,254,248,237, 81,133,243,162,116,175,213,165, 80, 39,
-125,165,197, 87, 94,117, 63,248,192,225,120, 75,125, 73,245, 37,117,231,239,222,189,253,161,191,191, 21,251, 87,241,225, 79,241,
-121, 92, 46, 43,158,242,170,101,121, 13, 98, 53,189,122, 6,196, 55,189,252,233,213,244,233,147, 28,191,160,248,204, 70,202,185,
- 62,125, 92,253,199,135,252,226,254,225,219, 19,186,182,197,134,161, 76,160,136,253, 54,208,222, 88, 37,116,122, 91, 26, 80,137,
-116, 97,216, 46,232,113, 12, 65,168,234,213,211, 62,162,170,161,214, 46,129,154,229,110, 75,182,210, 82,177, 69,177, 96,251,111,
- 69,171, 83, 93, 3,125, 77, 81,254, 23, 63, 23,231,243,152,133,221,244,200,147,153,157, 33, 93,158,141, 0, 56,163, 11,135, 42,
-140, 10, 96, 65, 90, 64,246,235,245, 22, 15,102,138,174, 34,121, 48, 49,115, 82,121, 2,184,129, 14,161,214, 74,127,211,169, 1,
- 80,135,246,183,148, 78,213,209, 83,242,107,234,134,218, 76,205, 32,138, 62, 38, 77,215,225, 67,193,140,193,194,140,157,155,221,
- 53, 74,108,206, 24,199, 16,122,173, 90,138, 28, 54, 48, 77,116,198,194,226,219,152, 42,212, 74, 74,182,157,101, 54, 11, 79, 43,
- 13, 91, 95,116,220, 64, 58,225,185,195,159, 35,167, 20, 94,152,165, 65, 7, 83, 49,154,230, 95, 1,152,186,150, 29,201,105, 40,
-106,199,142,227, 84, 82, 53,221,244, 12,106,122,102,209,243, 64, 8, 70, 35,177,230, 35,144, 88,176,230, 59,248, 30, 62,132, 5,
- 98,219, 18, 72,136,215, 6, 9, 52, 61,211, 48,213, 85, 73, 42, 78,236,216,230,156, 44, 16, 82,109,186, 84,106,165, 92,246,189,
-231, 92,223,123,142,230,128,148,208,134,163,140,243,106,171, 68, 80,138,103, 13, 28,110,194,226,201,154, 18,107, 52, 25, 11,185,
-172, 84,131,156,127, 2,152,227, 18, 4,207, 1, 26,124, 48, 79, 28, 22, 99, 21,157, 35, 74, 44,232,175, 83,172, 20,162, 36,188,
-140,217,207,122,105,125,246, 42, 33,103, 6, 90,104,150, 75,116,174, 31,145, 12, 70, 33,218,165, 21, 73,238,229, 36,198,218, 45,
- 20,248,150,161, 22,123,240, 2,236, 80,167,168,150,180, 28, 91, 59,229,230, 76,117,248,103,181, 58,133,185,153, 16, 16,166,211,
- 39,207,174, 30, 63,125,249,233,147,231, 79, 95, 52, 82, 93, 8, 21, 78,239,186,223,239,142, 63,223,186,183,247,126,196,193, 80,
- 83,115, 14,182,132, 31, 4,116,110,161, 11, 88,162, 90, 74,170, 84,165,207,170,184, 90, 63, 37,163, 21,123,190,108,169, 6, 94,
-246,101,203,226, 93,143,253,128,104,207,115, 73,155, 8,214,148, 56,149, 66,170,142, 8, 64,211,137,101,204, 37,190, 15,178,195,
- 20, 10, 77, 67, 55, 55,135, 35, 78,235,146,163,103,188,236,140, 80,206, 43,125,184, 55, 86,143,123,240,237,189, 49,125,157,244,
- 62,154, 78,141, 54,251, 33,252, 9,130,208,202,116,148,233,240,183,120, 0,200,194,133, 98, 47, 55, 53, 75, 64,179,212,100, 40,
-201,208, 36,207,118,109,188,169,197,105, 0,155, 42,183, 86, 13, 72, 55, 71, 60,213, 92, 83,195,162, 58, 0, 29, 97, 79, 26, 89,
- 7, 14, 57,158,203,218, 33, 11,110,203, 70, 69,219,153,170,210, 11, 16,105, 91,188, 63,121, 64, 94,185,101,177, 95, 45,148, 73,
-110, 21,157,172,187, 58,181,202,238,154, 18, 52, 22,144,207,153,124,129,109,128,197,201,113, 30,228,110,151, 83, 71, 95,150,185,
- 69,246,160,115,100,244,179, 31, 77,250,167, 14, 87, 74, 25,233,250,184, 13,209, 1,179,250,176,195,193,199,215, 59, 31, 92,189,
-148, 70, 89,117, 64,104,221, 80, 53, 4,177, 45, 81, 83, 63,209, 99,187, 2, 85,210,142,106,173,114,195,218, 75,148, 84,177, 64,
- 96,177,241,108, 57, 47, 69, 53,216,129,202, 76,197, 90,177, 74,180,236,162,136, 27,120, 51,255, 44,168,105, 62,115,220,138, 83,
-220, 50,140, 75, 49, 68, 74,222,225, 92, 40, 47, 36, 91, 53,133,181,236,118, 5,128,178,253, 58,220, 3,150, 85,115,166,131, 23,
-219, 38,147, 58,116,171,241,118,197,144,104, 83,175,210,123,165, 0,209,171, 27,222,193,128,208,136,130, 90, 39, 81,113, 86, 13,
- 49,111,208,178,162, 69,153, 18,114,117, 44, 43,170,254,245,114,125,177,124, 47,144, 46,204,150,133,143,121, 43, 72,206,135,181,
-205,151,125,209, 68, 62,120, 2,173, 64, 36,215, 86,208,137, 14,153, 17, 36,228,161, 52, 65,167,144, 11,135, 51, 71,161, 88, 29,
-171,233, 48,233,199,127,141,190,210,142, 89,188,110,168, 91, 63, 93, 95,154,238,197,195,111,182,242, 91,223,243,190, 79, 74,206,
- 50, 68, 26,194,230,196,184, 29,145,109, 40, 41,194, 94, 0,170, 6,229, 25,224, 33, 0,254,133,169, 92,166,200,214, 93,170, 10,
-103, 11,164,134,237,125, 90,198,159,182, 31,188,250,186,253,248,203,255, 21,100,254, 11,238,114,125,173, 98,232,102,243,249,103,
- 95,221,222,252,241,195,241, 77,184,136, 87,117, 58,155,237, 3, 85,124,244,200,252,242,155,192, 46,216, 81, 81, 72, 23,188,167,
- 3, 79, 95, 16,146, 62,188,120,212,118,111,197,119,183, 66,140,226, 92, 33, 72,254,218,205,239,240, 19,232,170,112,202,141,106,
-239,167,186, 12,187, 97,169,158, 92, 23,151,175,187,195,221,101, 70,136, 53, 61, 13,165,230,235,155, 31,159,127,241,236,230, 14,
-216,227, 30,103,128, 38, 33,147,161, 98, 40,145,171, 5, 65,157,115, 15,154, 96,203, 58, 59,172,108,230, 52,225, 1, 16,181,196,
- 7, 74, 53,229,213,145, 34,248, 67,200,161, 54,197,189, 7,118, 25, 25, 33, 39,164,248, 92,158,192,132,156,149,210,152, 98,166,
- 87,226, 76,203,115, 42,146, 0, 51, 4,202,181, 38,233, 41, 1,135,147,160, 89, 15,178,244,220, 78,125, 11, 52,190,145, 81,110,
-163,181,224,198,186,216,173, 2,184, 21, 8, 32,206,118,214,103,160,170,180,126,181,116,163,147,148,145, 91, 16,224, 71,240,127,
-159,139,166,182,128,253, 75,156,198, 82,217,184,241,243, 9,155, 16,184,112, 83, 35,250, 33,142,130,158,233,181,106,226, 22,217,
- 6,237, 60,203, 72, 57,204, 9,168, 12,240,103,226,141,191,161,225,238,236,176,206, 29,240,159, 92,213,229,171,120, 40,172,213,
- 56, 87, 96, 11,115,233, 60, 29, 86, 9,139, 38,229,109,217, 31,254, 21,128,167,107,217,113,156,136,162,245,112,185,108, 39,157,
-244, 99, 90,244, 44, 6, 16,163, 65, 61,188,212, 72,128,144, 0,137, 5,191,193,130, 63,224,195,248, 10,196, 10,177, 65,195,138,
- 89,208,139, 17,104,186,153,166,147,248, 81,229,122,113,142, 7,177,136,148, 44,156,196,118,249,222,115,110,221,123, 78,197,253,
- 81, 68, 56,177,112, 77, 42,241, 46, 62,143, 52, 61,164,254, 0,184,116,160, 92,119,205, 77,233,144,125, 60, 20,254, 74,160, 42,
- 75,230, 46, 45, 86, 94,149,230,211, 57, 57,209, 0, 34,181, 35, 34,126,154,133, 67, 54, 57, 24,235,146,141,243,136,168, 8, 40,
- 55,201,253,228, 99, 53,214,193,136,228, 28, 48,185, 1, 21,194,243,115,239, 69,255,114, 60,226, 28, 79,221,213,115,239, 83,244,
-131,166,153,195,164,179,239, 7,170,126, 77,182, 61,204, 90,205,120, 15,176,246, 42,168,214, 78, 31,189,115,254,245,103, 95,124,
-112,245, 33, 43,172, 98, 39,196, 13,109,164,133, 92,157,233,171,179,213,213,211,211,195, 93,251,236,249,221,139,184,167, 6,159,
- 31,138,237,218,234,184, 0, 37, 81,180,141, 13,217,128, 87,141, 5,165, 64,186, 12,179, 32, 84, 5, 25, 18,108,111,110,164,225,
- 80,110,166,219,243,162, 64,131,101, 10, 8,173, 41, 1, 94,202,235, 81, 47, 74,172,105,144,242, 52, 21,122, 80,181,197, 70,119,
-200,177,143,186, 14,179, 73, 78, 78,177, 47, 10,232,201,151, 94, 45, 45,253,163,167,220, 79, 12,102,247, 79,240, 97, 24, 8, 45,
-142,239,124,106,205, 48,121, 13,108,159, 83,220,167, 9,139, 51,177, 31, 71,103,219,215,206,142, 98,237,185,207,228,217, 38, 64,
-113, 68,252,229,206, 82,122, 43,148,228,122,193,161,135, 74, 14,160,241, 8,135, 10, 75,158, 19,255,137, 74,255,138, 19,173, 6,
-217,133,213,180,166, 65,232,150, 57, 33,154, 91,167, 57, 70,125, 58,201, 82,221,183, 38,198,216,205,212, 22, 23, 78,199, 78,233,
-126, 96,103, 31,153, 28, 71,125, 92,234, 17,154, 36,224, 5,184,134,103,199,147,204,222,227,137,218, 73,115, 0,136,166,243,166,
-178,247, 74, 86,115, 65, 30,234,178,104, 76, 51,175, 56, 5,223,201,215, 98,112,136, 65, 59,106, 59,228, 77,166,137, 29,150, 19,
-219, 88,169,143,160, 90,206,150,106,112, 91, 14,193, 10, 22, 68,176,202,169, 18,154, 22,177, 30, 61,128, 25, 19,187,167,118, 52,
-243, 58,134,126, 41,202, 90,127, 27, 37, 53,105, 56, 17,161, 76, 30,172,220,113,251, 25,103, 34, 88,147, 0,116, 95,106,142, 72,
-176, 65,220, 7,170, 86, 34,208, 59, 90, 75,210, 29, 24, 23,206,201, 5,158, 34,145,207,130,157, 26,254,207,149, 94,121,181, 70,
-220, 84,128, 94,114,195,182, 22,154,189,148,137,137,133,218, 75, 70, 50,178,224, 81,227, 28, 30, 94,160,239,129, 10, 5, 27,145,
-110, 41,103,252,168,214, 47, 38, 90, 26,211,222, 20,199,137,210, 9,171,151, 53, 57,231, 6,236, 10, 36,120,166,129,137, 90,246,
-185, 13, 85, 30,168,217,170,167, 42,159, 84, 72,194,146,190,184,202,173, 76,126,124,168,190,113, 66,183,180, 33,229, 16,100,204,
- 23,143,170,252,184,249,161,217,255, 56, 2, 79,212,173,100,125,115,193, 81,153,190, 49, 11, 43, 1,161,166, 59,113,225,222,193,
-242, 27,110,162,231,155,104, 16, 86,192, 21, 67,162,107,129, 97,193, 7,233,112,186,185,174, 31, 60,249,238,228,171,111, 23,164,
-158,254, 43, 90, 9,249, 63,108, 23,139, 64, 9,174, 14, 40,252,187,239,191,119,254,214,153,252,245, 90,237,170,104,117,172,135,
- 18,205,195,243,213,199,159, 62,248,249,151,219,251,105, 86,148, 74, 40, 1, 72,122, 93, 62,191,124,251,251, 47, 47, 75,126,149,
-135,221,244,178, 95,159,172,159,165,252,199,205,237,234,141,230,205,167,151,227,120,168,114, 62,109, 87,120, 6,227,180, 47, 23,
-155,139, 79,158, 28,126,255,109,239, 92,234, 26,224,219,202,133,254,250,167,147,191,175,172,221, 70, 87,142,135,173, 43,209,202,
- 14,240,106,221, 34,132,108,102,207, 50,206, 38,112,226, 77, 5, 63, 0, 54,131, 75,133, 30, 39,108, 76,153,199, 70,130, 87,171,
-157,154, 27, 4,254, 52,106, 57, 40,110, 76,135, 62,164, 56, 68,182, 71,249,186, 1,132,242,127,225, 18, 26, 43,147,165,207, 0,
-110, 78,104, 16,115, 44,145, 31,189,195, 0,216, 58, 49,140,178, 9,171,186, 75,254,225,104,125, 87, 15, 70,109, 43, 42, 73, 8,
-124, 76,169, 3,238, 53,102,149,218,173,207,195,209,100,116,155,216,254,186, 7,126, 4,160,174, 58,115,196,185,249,122, 23,139,
-186, 27,228, 86,106, 26,120,100,234,196, 85, 38,128, 59, 31,149, 14,247,249, 56, 7, 29, 53, 56, 71,131,168, 7, 36,150, 82, 5,
- 38,107, 89, 82,160,112,187, 54,161,102,102,169,212, 52, 56,154,230,216, 70, 82,253,130, 5,130, 80,173,217,200,115, 71,237,224,
- 40,251,237, 10,199,165,232,244, 1, 95, 95,219,170,251, 87, 0,150,174,109,181,174, 42,138,238,117,219,247,189, 99, 26, 72, 82,
-233,177, 1,241,242, 34,226,147, 80,144,226,165,126,134, 79,254,146,191, 35, 40,254,128,208, 7, 73, 44,165,150,162,210, 36,231,
-178,239,123,221, 28,227,212,188, 37,112,206, 33,123,205, 57,215, 24,243,204, 57,134,166,190, 98,178,204, 73,173, 29,184,231,222,
- 74, 33,216,173,195,141, 41,143,134,209, 22, 12, 8,208,253,157, 1,147,227,100,175,112,150,251,212,100, 59,168, 36,200,148,152,
-163,232, 44,236,190,174,161,224,244,246,108,217,148, 27, 92,167, 71,174,164, 71,145,143, 20, 91, 90,210,158,254,181, 35, 1, 58,
-115,109,238, 71,219,148, 96,206, 93,226,232, 94,187, 19,139,161,217, 14, 8,131,144,247, 2,239,143, 91,120,242,125,135,187,172,
- 44,171,174, 18, 89,183,106,147,255,117,121,113,241,195,179,111, 62,254,244, 17,217,174,123, 62, 13,247,193,243, 71,104,192,237,
-137, 93,101,182,204, 76,243,224,236,201,151,151,221,109,123,253, 50,238,185,221,137, 26, 52, 1,180, 7, 89,215,132,237,120, 68,
-194,199, 81,187, 9, 55,191, 50,134, 60, 74,129,187, 0,140,240, 43, 49, 14,112,208, 8,219,129,142, 59, 45,205,146,250, 76,245,
-203, 92, 29,237,190, 35, 77,124, 88, 3,199,216,174,122, 77,167, 53, 76, 36,140, 64, 97, 56, 64, 1, 52,134, 98, 15, 68, 28,250,
- 74,232,195, 74, 84,134,164, 87,241,142,250,237, 62,116, 33,153,242, 48,135,216,231,168,205,189, 7,170,176,171,199, 93, 61, 28,
- 87,168,230,176,181,161, 9,163, 7,251, 96,218,210,128,121, 77,240, 57, 58, 85, 28, 59,117, 82,157,122,208,137,192,254, 88, 67,
-187,221,101,160,161, 11,136, 1, 77,253,146, 64,183,168,106,178, 50,132, 80,115, 13, 74,164,230,140,243,250, 69, 41,194,154,228,
-141,204,184,205, 70,149, 73, 90, 6,227,200,241,175, 39,190, 70,165,151,122, 52,193,246,234, 61,109, 50, 71,135, 6, 60, 39,250,
-219,138,101,183, 3,243, 10, 58, 69,196,165, 56, 93,103,216,210,174, 71,151,148,247, 25, 62,201,215, 0,230,133, 46, 22, 63,164,
- 5,130, 70,150, 46,100, 69,234, 84, 69, 27, 31, 74,144,113, 42,152, 43,216,162, 88,147, 41,243,185,146, 20,175,227, 48,155, 44,
-168, 13, 28,228,128, 48,181, 61, 8,138,161,205, 22, 40, 1, 93,225,242,156,235,140, 26,188, 89,245, 25,128, 68,156, 37,238,133,
-172,141, 83,158,128,164,203, 20, 60,143,174, 8, 30,103, 18,227, 0,254,148, 0,101,172,130,216, 17,245, 10, 33, 27,215, 36,181,
-137,108,142, 38,101,156,242,229,180, 40,238,104,148, 53,103,147,190, 83,245,118, 72, 55,181, 29,238,241, 46, 0,128, 66,131,140,
-228,156,230, 52, 64,119, 52, 25,227, 73,211,185, 6,196,227, 68,250, 3,226,140,252, 33, 32,148,251, 82,218,189,172,255, 30,174,
- 30,159,190, 78,245,221,154, 29,188, 3, 83, 90,124, 74,184, 38,121,172,120,184, 52, 72, 5, 96, 48, 49, 61,202, 75,149, 9,208,
- 57, 21, 79,246,252,130,110,241,193, 76,146, 35,103, 92,106,215,245,197,181, 63,245,113,175,120,203,138, 49, 60,218,100,175, 62,
-154,127,205,252,207,243, 34, 67, 81, 83,215, 21,207,206,176, 33,202, 85, 49, 84,121,160,117,252,126, 20, 59,194,249,138,153,147,
-206,126, 4, 51,149,220,174,176, 93, 12, 25, 5,183, 12,120,180, 72, 10,121,253,251,248, 80,125,181,121,242, 35, 43, 56, 21, 3,
-147,119, 50,210,199,229,138,112,156,150,251,127,102, 14, 9, 72,242,113,182,249,246,235,239,255,120,115,115,251,207,161,221,182,
-155,182, 56, 17,217,135,190,250,252,147,179,135, 39,197,139,219,254,207,235,221, 52,135,147,211,252,187,207, 46,127,122,250,244,
-242,217, 38,249,237,149, 58,188,172, 27,196, 97,254,203,205,155,231,255,250,247,175,174, 46,155,243, 23, 55, 47,111,125, 95, 54,
-101, 49, 84, 58,186,225,109,180, 89, 51,204,153, 50,115,195, 98, 1,158, 44,238,222,218, 15, 94,239,170,199, 95,116,221,221,130,
- 2,145, 58,224,132, 57,113, 69,111, 75, 49,169,214, 83,187,101, 85, 28, 95, 92,193,241,151, 28,121, 55,185, 81,171,106, 26,132,
-155,183, 90,218,123,100, 23,157, 20,197, 1, 33, 45,108,238, 14, 59,118, 36,173,245,179, 1, 84, 48,185, 12,121,216,143, 84, 37,
-215, 40, 29,211,158, 74,191, 84, 89,194,125, 41, 16,154, 43,125,203, 23,147,149, 66, 21,168,113,129,222,149,237, 81, 18,139,134,
-212,222,103,200, 68,147,158,175, 17, 36, 21, 55,205,140,196, 23, 53,254,116,160,202, 76,117,206, 56,142,113,187, 30, 18,118,202,
-219,202,183,231,209,205,167,139, 5, 6, 70,193,230,170, 43,202, 12,237, 76, 80,113,243, 40, 38,205,217,144,166,166, 45,205, 12,
-136, 38, 21, 64,118,216, 26,211,152, 88, 13,139, 51,203, 34, 99,246, 32,117, 40,186,131,227, 36,149,206, 80, 40, 17,145,120,157,
- 69,170, 46, 84, 95, 69, 18,180, 74,141,217,188, 68, 14, 38, 59,209,252, 39, 0, 73,215,206, 35, 71, 17, 6,187,123,186,167,123,
-246,117,190, 59,131,208,233, 76,112, 1, 72, 32,217,150, 45,145, 0, 33, 1, 41,130, 0,126, 4,191, 11,137,152,132,136,148, 12,
- 11,217,145, 37,132, 49, 18,247,220,189,221,121,246,147,170,113,114,193,105,116,115, 51,219, 93, 95, 85,239,247, 85, 49, 82,135,
-140, 80,162,246,128, 44, 49,189, 27,247, 97,116,211,156, 8, 16,231, 57, 12,186, 18, 39, 14,180, 42,154,211, 84,156,214,140, 12,
-179, 37,160,203, 52,166, 62, 7, 71,159,226,236, 3,115,216,193,205,129, 94, 38, 51,161, 49,166,210,185,112,143,234,120, 48,216,
-150,122, 0, 3,204,131, 30,177,160,129, 19,139, 92,143,209, 12, 3, 88,235,132,194, 49,141, 92,232, 75,134,224,225, 78, 58,153,
- 67,183,176, 98, 5,218,198,141,244, 96,242,237,118, 18, 79, 62,122,250,195,183, 95, 62,122, 40, 69,247,199,176,223,210, 82, 67,
-150, 57,100,125, 30,251,129, 2,199,166,199,251, 40,247, 98,188,213,250,237,250,228,209, 83,251,225,171,235,227,255,186, 36,204,
-248, 32, 23,122,132,101,166, 25,208,167, 46, 49,176,144, 22,199,244,233,161,233,126,165, 19, 27,250,135,204,246, 31,233,152,165,
- 39, 50, 83, 19,129, 67,130, 19, 67,120,106, 54,136,122, 67,199, 72,182, 97, 1, 38,135, 61,232, 67, 36, 61,110,251,126,118,202,
-117,179, 67, 81,215, 58,168,167,110, 4, 57,185, 47,110,174,150,187,155,228,250,116, 16, 1,160, 37,251, 81, 76,209,111,163, 56,
- 77,122,137, 10,168,239,216,232, 61,129,105,208,203, 45,214, 32,224, 60,205, 54,121, 98,239, 5, 45, 36,241, 95,191,243,251,223,
-161,176, 66,235,213, 70,170, 54,160,164, 87, 80, 41, 57,246, 74, 97,127,172,211,228,173,157, 99,206,107,240, 1,155,104, 80,218,
-100,160,141, 4,214, 40,142, 6,102, 43,167, 69, 57,202,116, 55,129,196,199,143, 3, 93,211,177,250,160,228, 38,232,163,100,226,
-157,239,171, 3, 13,134,188,164,139,191, 93, 1,123,161, 75,124,156,106, 85,201, 67, 4,191,157, 14, 70,116,185,234, 87,181,194,
-158,137,227,142,223,159,173,205,101,128, 78,174, 79,252,228,119,218,126,160,244, 68, 95, 1,161,218,113,101,197,104, 37,253, 30,
-104,164,106, 80, 35,174,133, 56,194, 98, 13, 2,207,163,215,248, 20,114, 5,145, 89, 17,222, 73, 41, 64, 20, 32,155, 10, 40,122,
- 81, 35,179,136, 65,244,109,202,245,102,116,138,238,106, 37, 28, 56,118,128, 87,230,247, 18,239, 20,191, 93,115, 74,141,137,212,
- 85, 38,194,115,182,144, 80,200, 22, 26, 60, 96,166, 66, 19,179, 11, 63,137, 57,144,220,138,219,178,251, 87,158,159, 59,160,154,
- 94,133,160, 99, 29,156, 53,146, 54,165,227,210,205,199,111, 88,178,222,177,247, 93,246,218,121, 92, 51, 74,222,204,134,181, 43,
- 98, 83,165,183,225,253,117,255,249,137,252, 61, 87,145,167, 87, 5,104,130,119, 45, 24,241, 88,142, 68,185, 43, 11,155,197,106,
- 62,241,196,159, 1, 57,216, 27, 72, 34,108,207,160, 20, 21, 97,170,104,159,205,161,141, 93,185,248,103,103,151,234, 10,100, 35,
-136,247,206,155,171, 79,234,159, 77,251,114,108, 25,168, 45,125,230,201,190,154,133,193, 52,143, 79, 27,150, 6,172, 86,230,101,
- 85, 52,212, 79, 29,181, 32,180,168, 28, 66, 96,224,250, 50,209, 72,197, 51,205, 79,149,203, 55,219,114,125,126,246,221,143, 98,
-121, 65, 12, 39,247, 87,239,228,204, 12,235, 97,174, 18,133,184, 79,115, 52, 79, 7,126,163,158, 61,255,230,139,151,175,127,250,
-245,151,215,224,207, 61,164,233,212,171,116, 84,252, 87, 15, 55,223,159, 29,255,245,241, 57, 94,180,141,250,235,139,179,117, 8,
- 55,191,189,248,243,239, 75,179,111,107,151,182,254,240,226,106, 27,165,120,242,236,113,218,244,119,221,141, 13,126,177, 95,228,
- 70,117, 32,136, 14, 26,182,132,211, 85,219,222, 31, 75,185,140,148,118, 35, 20,207,155, 87,167,159,126,118,221, 66,141, 2, 64,
-123,144,143,101,209,189,230,202,190,191, 2,225, 48, 43,195,132,249, 8,113,199, 20,180, 2,152,156, 80,213,120, 49, 61,239,161,
-253,232, 8, 53,141, 93,204,190,183,194,203, 5,191, 4, 52,186,214, 30, 4,249,118,232, 26, 90, 12,225, 50, 30,250, 0,210,107,
-213,128,202, 55,173, 82, 96,226,181,183, 11,118,113,196, 77, 93, 77,248,124,199,172, 57, 37, 3, 70,157,177,190,180,115, 70, 89,
- 90, 16,139, 1, 2,182, 84, 57,186,178,234,155,161, 81,186,107,150,213,162, 3,100, 67, 48,169, 77, 4,228,171,117,210, 68, 22,
-179,199,219,172,160, 1, 56,234, 6, 34,111,154,169,143,149, 11,196, 88,118,228,202,154, 93, 58, 54,186,121,194, 6,123, 84,229,
-110,209, 66, 29,172,251,186,137,156,226,149, 43, 5,194,168, 7, 23, 28,155, 36, 24,184,148, 5,208, 93,130,213, 15,155, 6,140,
-185,233, 7, 48,192,105,108,244,104,193,227,193, 30,254, 23,128,164,107,217,145,155,136,162,174,151,203,118,187,231, 65, 50, 25,
-105,132, 8, 40, 72, 9, 26, 64,236,224, 7,216,178, 97,199,130, 47,224,219, 88,176, 96,141,216,195, 6, 41,160, 72, 72,195,240,
- 8,104,186,103,250, 97,187,236,122,184, 56,199,249,128,238,118,219,183,206,163,124,235, 92, 61,194,197,234,202,164, 99, 7,129,
-194, 73,127, 51,180,161, 15,110,249,209, 82,210,114, 21,203, 52, 99, 11,197, 14, 41,201,157,219, 10,143,133,179,140, 61,183,187,
- 86, 53, 53,147, 99,231, 93, 84,113,230,145,156, 88,122,176, 1, 72, 15, 96,122, 15,215,128,159, 24,199,185, 19,157,219, 85, 2,
- 88, 52,254, 53, 13,166, 63, 7,170,108,119,255,153,113, 5, 92,134, 71,112, 62,115, 2, 79,225,226,232, 85, 30,123,157, 55,197,
-124,138, 47, 83,181,225,224, 42,177, 81,241,211,103, 47,190,249,234,185,106,254, 72,155, 27,151,118,240,132, 60,104, 79,215, 96,
- 81,203, 34,247, 5,231,202, 49,141,129, 41,236,186, 10,113, 12,199,151,181,217,127,116,245,236,234,254,233,159,187,199,177,241,
- 57,147, 27,217,217, 31,103, 30,252, 32,114, 6, 17,135, 90, 30, 19, 71, 9, 2, 28,192,127,154,121, 65,220,216, 52, 89,244,240,
-119, 16, 96,248,199,236, 82, 13,102,217, 19,244, 94, 78,154,151,108,178,115, 64, 39, 25, 54, 14,152, 42,130,157, 30,194,222, 64,
-185,169,110, 72,102,216,222,245,226,168,176,222,166,164,106, 55, 8,153,247,188,147,131,234,224, 3,244,228, 96,118, 68,122, 29,
- 15,217,112,158, 56,179,132,231, 37, 9, 93,245, 96, 18,193,236, 11,158, 98, 0,227, 30, 53,187, 72, 56,129, 0,252, 15, 78,134,
-240, 71,217, 0,100,173,195,101, 90,104,108,141,213,114, 81,114, 54,250,225,111,179,122,187, 47,170,170,196, 98, 31, 12,124, 91,
- 26,240, 49,184, 19, 89, 92,204,120, 86, 77, 40,246,146, 67,208, 75, 16, 86, 93,107,216,143, 0,124,241,233,204,163,240,227,110,
- 26, 43,213, 40,127,108, 8,140,178, 43, 96, 61,250,148, 59,220,144,145,131,202,195, 12, 38,192, 69,212,225,116,178,187,100,173,
-244, 27, 96,209, 12,203,221,130, 24, 81,244,205,201, 92, 65,212,244,167,252,175,103,241,145, 3,233,113,154, 11, 95, 16, 12, 90,
-107, 78, 4,132, 41,210,231, 0,119,138, 9,120, 30,175, 42, 0, 85,197, 62, 62,160, 78,195, 22,114, 64,123,244, 40,114,240,131,
-129, 70,157,177,222,160,209, 99,116,178, 61,135, 24,227,220,139, 6, 34,144,217,242, 40,117,190,252, 42, 89, 8, 61,196,203,146,
-232, 80, 97,245, 44,209, 21, 67,230,158, 59, 55,113,236,155,214,116,190,247, 42, 45, 15,237, 69,250,138, 13,132, 13,190, 63,131,
- 58, 4, 83,167, 74, 72, 19, 72, 70,173,199,217,232,177, 41,219, 41,176, 5, 61, 1,194, 6,109, 18,243, 8,109, 9, 23, 80, 12,
-157,134, 92,132, 85,242,191,251,167, 48, 71,231,118,200,234, 30,144, 26, 15,160,223, 90,242,181, 35,252, 95, 91,140,133,128, 15,
- 43, 39,166, 82, 49,148,160,197, 77, 20,236,242,180, 51,200, 25, 79, 34,219,114, 5,194,185,250,229,248,193, 91,225, 97, 2, 47,
-248,247, 78,234,187, 23,229,247,166,251,137,225,115,242, 36,151,134,241,109, 18, 70, 26, 90,166,228,171, 95,177,180,247,244, 94,
-174,150, 60,179, 97,137, 68,128, 12, 1,247,113,232,115,132,191, 98, 82,224, 68, 61, 83, 22,205,190, 15,191,253, 28, 63,251,248,
-243,242,253,107,194,121, 70, 65,146, 26,216,157, 9, 26, 4,214,195, 22,226,222,161, 0,223, 76,127,240, 28,163, 29,252,168, 78,
- 46,191,248,242,235, 99, 44,190,251,241,219,151, 55,189, 85,242,172, 14,143,159,216,119, 67, 99,235,117,107, 56, 54,114,251,224,
-126, 64,193, 31,252, 69, 28,111,239,142,208, 13,219, 67,250,231,182,255, 55,232, 79,174,175,223,249,240,249,171,155,135,237, 52,
-230,106,198,125,149,171,179,121, 39,155,185,203,167,151,114,109,220, 93,129,178,168, 80, 72,135,165,177,243,246,215,203,105,247,
- 42,138,186,232, 28, 42,200,122,235,106,138, 67, 21,217,251,113, 96,152, 52,172, 54,163,169,147, 95,222,205,224,217, 14, 3,150,
-140, 79,118, 59,206,219,121, 84,246, 97, 35,196, 35,248,187, 46, 76,130, 99,230,216,183,127,240, 13,251,176,196, 20, 2, 4, 56,
- 30, 47,240,130, 73,172, 5,207, 56,148, 96, 11, 40,117,153, 90, 69, 33, 53,176,203, 60, 48,144, 79, 25, 16,233,180,150, 80,232,
- 50, 12,103,105, 77,103,201,156, 62, 89,113,195, 69,139,116,120, 82,232,215,149, 92,177,151, 67,178,109, 27,191,103, 76,171,193,
-199, 18, 30,176,205,181,110, 2, 37, 23,243,185,157, 82, 53, 7,234,102,185,110, 78,214,187, 1, 5,215, 55, 73,185,128,149, 15,
-118, 21, 16, 77,121,111,219,115,160, 54,199,180,249, 54, 87,147,174,247,227, 14, 32,148, 26, 43,216,255, 24,143, 86, 24,103,219,
-162,210,226, 62, 28,123,187,174,134,169,128, 50, 21,203,129,138, 38,185, 16,139,255, 5, 32,233,234,121, 36, 39,162, 96,187,187,
-221,109,123,188, 3,171,189,147, 86, 43,241, 33,116, 58,193, 6,128, 8, 8, 16, 49, 57, 18,225, 37,252, 58,126, 5, 25, 4, 68,
- 39, 33,129,116, 4,136, 59,216, 99,111,246,227,118,198,110,219,253,105,170,134,116, 2,203,242,188,126,175,234,245,123, 85, 0,
- 78,128, 52,139,214,108,249,234, 37,249,202,254, 47, 38,105,217,123, 17, 92,152,160,249, 70, 38,115, 2,182, 13,188,225,101,118,
-162, 43, 15, 40,206, 1,217, 49,205, 40, 72,180, 94,160,155, 90,153,100,202, 32, 74, 11, 96,169,204,116, 91, 24,139,158,111, 17,
- 49,178, 49,247, 98,159, 7,229,130, 89,247,179,178,142,211, 33,110, 80, 8,249, 96,129,153,115, 41,227,188,218,105,169,123,218,
- 83, 22, 32,217,211,109, 55, 37, 93, 23, 20,149,217,185,207, 63,126,242,236,155, 79, 84,247,202,253,253, 2, 73,182,182, 22,132,
-147,189, 20, 53, 9, 70,124, 2, 62,211,218,201,136, 48, 29,240, 58, 21, 88,204, 58,138, 52,205,217, 25,243,239,217,227,215, 34,
- 95,190,242,103,130,178,115, 52,230,166, 3, 52, 5,238, 57,240, 8,142,155,245,148,170,173,140, 92,155, 42,166, 87,203,172,205,
-158,110,168, 37,209,137,153,166,104,236,149, 20,245,128,255,105, 26, 64, 49,240,159, 75, 29,228,216, 33,100, 64,180,214,116,176,
-105, 12,119,189,211,209,238, 85,220, 38,127, 18,226, 77,145, 43,149,165, 15, 66,234,135,153, 2, 81,168,101, 56, 72,160, 89,244,
- 6,159, 87, 16,249,182, 66, 94,229,244, 28,152, 40, 94,252,168, 72, 87,215, 35, 34,144, 19, 89, 11,152,143,193,183, 63,138, 13,
-175, 66, 79,210, 3, 18,183, 56,123, 14, 80,160, 17,198,164,108,155,163,178, 56,142,101,173,184,146,115,129,180,162,202, 97,245,
-231, 53,147,169,197,209,200,192,154,108,237, 79,168,105,161, 81,162,163, 76, 24,173,182,167,217,159,104,211,110,132,119, 40, 89,
- 11,151,104,253,186, 88,217, 17,193, 1,225,214,145, 35,250,201, 13, 43,160, 15, 42,167,239,113, 48, 1, 68,116,105,173,156,171,
- 94, 1, 8,205,190, 69,190,109,215, 80, 59, 23,244,227, 58,239,157, 58,152,173,173,139,221, 37,115, 14, 14, 28,193, 14,101,240,
- 6,240,184,173,196, 73, 5,168,136, 35,134,218,156,128,134, 27,109,201,144,218,116, 23,104, 11,143,132, 46, 22,234,133,196, 22,
-233, 39,225, 61, 64, 68, 80,158, 86,246,220, 69,234, 45,160, 75,160,156, 51,178,115,192, 9, 88,219,142, 22,224, 62, 71, 16,152,
- 2,106, 16,185,227,194,110, 60, 59,137,132,166,137, 64,137,147, 16,160,205,198, 84, 58,162,172, 8,124,251,102, 84,230, 31, 97,
-118,119,177,106,185,228,144,114,101,105,144, 69,137,108,118, 44,234,138, 70, 92,163,143,129,154,139,170,160,216, 55,101,102,223,
-190,208, 98, 8,100,208,128,252,229, 3,126,242,107,249,189, 60,121, 42,234,179,234, 55, 17,111, 4,197, 36,232,196, 41,114, 45,
-245, 9,178,199,177,141,114,124, 46,112,204, 74, 29, 98, 26,151,225,105,165, 7, 60,237, 58, 89, 55, 31,190, 92,222,219,137, 97,
- 35,111, 92,188,252,192, 44, 79,229, 15,221,242,124, 60, 68,174,130,227,227,103,146,149,170,208,230, 86, 39,202, 15, 31,135,245,
- 65,114,116,122,176,148,223, 70,232,128, 21, 76, 96,244,137,194, 87,244, 84,168,214,145, 10, 60, 93,163, 1,161,126,121,254,230,
- 34,127,116,254,213,183, 43, 8,126,228, 76, 1, 39, 50,193, 71, 39, 98, 27,146, 26, 46, 58, 38,226,122,150,136,148, 82,142, 97,
- 14,213, 84,238, 31, 90,117,246,236,187,239,207, 31,233,159,127,252,233,215,235,171, 63,175, 7,233,162,120, 20,223, 52,131,220,
- 3, 18,217,155, 97,252,227,133,208,189,189, 56,183,147, 95,223, 94,141,127,221,135, 91,109, 46,191,248,244,203,175, 63,243,126,
-220,189,220,149,184, 72, 35,185,141, 21,222, 2,101,113,139, 55,202,251, 59,121,209,139,235,219,240,254, 41,111,195,199, 73,188,
-123, 37,182, 15,210,216,119,220,225, 94,174,141, 14, 3, 74, 96,199,137,106, 28,138, 45, 80,214,152, 35,253, 71,231, 10,172,101,
- 10, 73,107,159, 50,101,198,169,189, 24,204,132,122,188,196,211, 46, 7,122,102,103,138, 5, 28,150,174, 52,172, 23, 0,240,198,
-233, 84,211,169,144,203,125,156,157, 66,200, 81,175,144,192, 26,135,165,177,199,113,180,128, 44,199, 62, 78, 69,177,238,100,217,
- 46,236,232,205,161,115,163, 84, 44,178,102, 34, 39, 38,166,255,165,245,139, 4,172,161,161,207, 54,211,227,185, 37, 7, 5,166,
-217,170,176,114, 29,133, 55, 47,186,218,210,158, 27, 81, 51, 73, 78,185,207,113,193, 99,182, 62,212,155, 12,248,177, 40,199, 37,
-232,225,196,169,152,245,130, 4, 35,166,141, 11,160,105,107, 16,189,153,121, 85, 24, 90, 15, 82, 53,205, 92,107, 52, 64, 22, 11,
- 32,170,234,107, 79,203, 3,189, 65,129, 74,245,114,168, 42,160,175, 22,172,231, 63, 1, 56,186,122,222,184,141, 32,186,203,229,
-146, 75,234,120, 39, 75, 23, 65,137,140,216, 1, 12,216, 93,128,164, 74,145, 38, 69, 2,184, 72, 23,184,201,223, 12, 82, 36,191,
- 32, 48, 16,192,169,156,202,130, 96,201,150, 46,150,142,199,143,253, 36,243, 30, 91, 22,252,218,217,153,247,118,102,222,112,170,
-178,162, 38,142,153, 18,110,233,121,140,199, 99, 98,192, 85,206, 97,138, 28,180, 25,184, 21,167, 18,159, 27, 17, 7, 19,199,143,
-192,104,198,121,208,136, 81, 86,186,121,239,132, 54,135, 49,141, 49,230, 61, 92,142,112, 58,236, 29,126, 84,171,199, 69,126, 51,
- 18,170, 62,140,101,208,243,190, 79,143,128,202,210, 1, 94, 87, 86,243,116,158,151,125,187,239, 11, 64,162, 65,172,225, 84,225,
- 93, 57,176, 1,190, 64,110,130, 3,132, 94,193, 25,219,108,253,248,244,215,239,191, 57, 61,191,118, 87,127,165,224,242,108, 37,
-169, 41,207,108,156,156,225, 46, 21,249, 34, 66, 1,194, 49,168, 6,143, 17, 65, 50,175,193,230,177, 1, 36,179, 5,183,112,109,
-167, 91, 13,204,123,179, 59, 22,117,174, 64, 60,105,104, 62,114,172, 51,214, 15,102, 96,152,107,158,173,131,125, 15, 31,179, 80,
-140, 44, 57,211, 96,255,188, 6,211, 17, 30,222, 39,243, 41, 80,236, 83, 89,117, 7,198, 77,104,232, 82,188,223, 91,131,221,222,
-177,192,109,175, 17,200, 98,116, 45,118,213, 78, 61, 12,221,177,110,236,164, 0,132, 58, 68,148,190, 83,123,150,137,240, 68, 47,
- 89, 32,222, 97,238,119,156, 65,173, 77, 57,144,255, 68,189, 20, 14,177,236, 13, 36, 65,214, 25,194,125,126,160, 54, 37, 40,133,
-142, 49, 91,186,213,242,168,212, 90,206, 70,230, 93,188,205, 68, 67, 5,231, 8,146, 6,158,148, 10,220, 42, 30,105, 22, 23, 48,
- 81,171, 67,185, 12, 2, 68,144, 30,130, 88, 73,157,173, 0,234, 38,234,182, 35,124,215,121,182, 83,109,195,132, 39,176, 46, 66,
-118,168,115, 83,204,133, 11, 35,144, 32, 37, 29,139,246,128,135,250, 88,167, 42,128, 59, 74, 96, 47,188,197,228,128,134,124, 39,
-179,193, 20,195, 7,217,157,134,167,177,242,107,219,249,124, 35, 42, 54,227, 85,169, 63, 54, 48,152,138, 67,117,141, 6,104,128,
- 67,178,172,242, 0, 36, 49,186,160, 48,157, 90,244,208, 41,137, 15,118,235,150,180,117, 57,202,170, 72,251,130,106,217, 58,230,
-124, 81, 29,254, 99,239, 34, 43,193,167,229, 36, 1,200,183, 79,178, 0, 11, 82,172,147,203,237, 28,237, 97, 81,159,244, 20,220,
- 77, 84,248, 99,126,117, 92,154, 59,168,113,183, 90,202,160, 56,170,142,137, 99, 54,198, 33, 48, 38, 42,189,187, 70, 52, 21, 15,
-224,132,125,200, 89, 96, 27, 0,214, 34, 94,172,112, 84,233, 18,204, 90, 83, 7,143,210, 95,112,240, 85,192, 23,131,219, 25,203,
-188, 45, 92,202,116, 16,102,174, 93, 38,229,208, 87,239, 46,211,182,213, 63, 93,204,255,174,204,165,117,109,210, 33, 22, 75,167,
- 32,211,181, 13, 7, 82, 17, 14,193, 11, 31,205,222,202,180,149,115,163,176, 88, 53,192, 74,243,230,246,249,219,222,203,162, 75,
-249,139, 39,245,225, 69,253,123,117,251, 71,123, 88, 7,217,104,146,224, 41, 80, 65, 15, 33, 55,144,169, 26,202,248, 8, 92, 42,
-131, 4,214,255,196,108, 67, 65, 44, 17, 61,155,141, 23,195,130, 59, 12,248, 53, 49, 36,101,106,121,117,213,237,254, 17, 47,127,
-249, 81, 60,125,158,210,184, 28,204,204, 25,119,219, 40,188, 37,205,161, 36, 42,179,241,108,192, 73, 25,181,217, 56, 90,193,179,
-116,115,220,249, 54,153,147,250,187, 31, 94,125,113,246,108,251,250,183,191, 95,191,217,221,218,155,247, 61, 34,213, 42,101,155,
-179,121,216, 40,187,195,255,119,239,238, 91,113, 63,129, 58,232,175, 46,126,126,249,245,118,253,108, 60, 78, 55,239,175,123, 23,
-116, 62,171, 33,236, 66,246, 89,101,243,207,203,253,125, 2, 35, 61,217, 60,122,245,173,248,243,210,124,124,235,190,188, 80,110,
- 20,159,128, 20,239, 46, 87,143,159,244,237,165, 50, 83,116, 71, 35,153, 74, 12, 99,220,136, 59,158,184, 71, 3, 3, 96, 83,124,
- 25,213, 64,225,177,108, 96,175, 5, 66,250, 7,191, 12,237,216,251,222, 20,210, 2,228,152,154,157, 27,136,196,222,122,206,252,
- 59, 72,185,138, 50,114,140, 60, 96,234,193,215,155,178, 45,132,177,122,148,154, 5,136, 92,102,152, 27,220,103,113,148,205,174,
-156, 84,173,215, 28,221, 25,216,150, 74, 16, 95,176,241, 31,251,168,132,191, 57,211,169, 29,244,185,178,201, 0,206,104, 81,212,
-120, 14, 25, 81, 77,136,161, 98,126,178,148,218, 88, 69, 33, 4,172,131,139,118,246, 69,145, 87,107,217, 99, 31,229,115, 9, 67,
-116,211, 88, 86, 0,110,136, 28,121,211,149,105,147,108, 2,126,233,235, 56,229,186,129, 83,108,110,178,185, 6,166, 34,214, 73,
-212, 83,132, 95, 43,241,206, 67, 22, 16, 91,156, 63, 26, 70, 60, 62, 18, 28,197, 58, 98, 25,129, 32,108,252, 95, 0,142,174,109,
- 71,110, 34, 10,186,111,182,219,115,217, 75,130,180,160,136,101,137, 16, 44, 18, 66,130, 55,248, 5, 30,249, 70, 62,134, 7,196,
- 62, 32,144,162, 40, 16, 68, 38,144,157,204,238,216,227,118,223,220, 84,249,213,154,209,140,251,114, 78, 85,247, 57, 85, 58,230,
-137, 12, 17,180,149,230, 7,136, 85,192, 2,128,169,224,234,120,192,170, 82, 87, 86, 34, 58, 12, 77,102,179,132, 18,158,125,241,
-115, 22,224,201, 1, 8, 75,122, 65,129, 15,131,247,116,128, 22,145,215,179, 88, 80,250,204,231,163, 72,113,242,190, 31,104, 23,
-148, 38,188,122,234,246, 27,201,235,201,236,136,171,226, 33, 35,201,227, 71,221,236, 1, 38,220,164, 87,128,137,103,101, 83, 26,
- 57, 91,140,209,196, 75, 53,144, 72, 43,155, 31,190,251,252,233,205,139,240,250, 46,185, 94,183, 45,255, 23,213, 42,217, 84,186,
- 40, 43,179,191,157,124, 73,108,171, 60,242,222,181,234, 88, 58,166, 18, 65, 12, 65,138, 73, 96,162,221,171,203,206,198,246,118,
- 7,114,221, 58,193,155,203,137, 62, 61,129,247, 22, 96,122,128, 73,218, 71, 77, 87,155, 68,158, 67,103,228, 83,146,247,141, 81,
- 97,110,166, 48, 1,126,150, 80, 26, 26,138, 82,123, 75, 1, 18,157,144,239, 78,199,134, 26, 45, 72,119,135,140,117, 6,180, 25,
- 26, 60,140, 84, 26, 83, 46,236,135,183,195, 24,241,145,246,216, 98, 34,138, 21,131, 31,144,149, 16,212,179, 87, 85,168,173,119,
-106,150, 1,228,122, 76, 0, 25, 60,143,157,176, 50, 19,242,133,188, 64,140, 97,175, 58,237,228, 34,165, 42, 67,173,153,234,139,
-158,162,192, 22,218, 34,147,145,113, 0,212, 97,170,169, 59,142,192, 37, 92, 26,145,139, 90,107,220,220,155,121, 44,181,109,211,
-194, 81,144,182,226,170,144, 53, 58, 3,236,167, 52,235,207,165,171, 18, 85, 12,100, 12,139,113, 44, 64, 21, 86,115,239, 49,252,
-211, 97, 66, 48, 77, 94,171,122,148, 3, 16,134,158,207,177, 74,103, 29,212,220, 70,185,146,194, 87,248,154,144, 15, 98,172,189,
- 91,153,245,228, 23,248,191, 69,232,177, 60, 47,104, 87, 2, 73, 20,161,130,166, 41,108, 15, 22, 35,181, 95,212, 42,179,245, 27,
- 41,244, 12, 4,170,163, 89, 34, 27, 94, 89,184,197, 37, 85,139,165,140, 94,205,128,145,157,183, 13,197,179,121,160, 64,140, 45,
-227, 32,104, 25, 6, 24,158,169, 35, 75, 75,211, 82, 58, 62,230, 33, 69, 87,241,230,103, 0,208,170, 12, 79, 40,129,166, 22, 49,
-218,229,200, 1,137,213, 83, 36,169,178,216,171,145,218,142, 34, 86,213, 63,152,189, 16,107,143,244,152,243,182,168, 72, 26,144,
- 41, 88, 56, 81, 49,117, 53,171,161, 20, 58,147,128,163, 33,135, 80,185,160, 96, 92, 22, 13, 40,100, 10,118, 33,179,109,199,166,
- 7,132,183, 55, 85,119, 63,125,121,181,125,254, 68,255,189,214,251,185,217,229,132,160,158, 64,142,146, 2,147,105,117,107, 37,
-210,214, 60, 90, 16, 28,133, 9, 4, 61,221,252,233,182,127,132,106,101,246, 82,126,116,213, 30,111,213, 79,230,223,223,122, 30,
- 81, 47, 62,142,129,208, 10, 60,146,186, 88,143,248,170, 20, 8,103, 38, 83,243, 92, 4,101, 75,245, 88,137, 53,141,102,210,105,
-169,162, 1,120,224, 5, 26, 59, 78,166, 88, 0,146,173,110,119,255, 29,214,219,139, 15, 16,220,251, 35,251, 0,245, 57, 91, 32,
- 3,237,226, 37,226,123,228, 41, 28,134, 21,127,114, 17, 20,193,156, 1, 48,199,162, 78, 46,204,177,212,121,238,223,255,181,159,
-218,205,179,103,223,254,248,225,243,239,191,186,251,229,247,159,127,189,123,249,118,247,248,206, 31,119,111,232,202,215, 98,237,
-175, 53,239,233,175, 46, 63,254,250,211,111, 62,251,226,250,230,226,245,110,220,191,122,183,239, 29,182, 8, 38,240, 2,139, 59,
-158,211, 94, 49, 1,157,244,195,211, 49,182,241,137,145,215,183,230,240,114, 2, 89, 63,195,198,191, 79,101,255, 66,220, 92, 39,
-195,247,174,128,250, 43,182, 79,204,117,245, 8,226,125, 84,105,120,200,101,147,139,243, 8, 73, 9,112,109, 96, 29,111,156,253,
-227, 82, 21,210, 4,160, 78,188, 77, 83, 88,164,154,168,221,197,221, 81,162,170, 61,137, 77,172,151, 26, 50, 96,169, 99,103, 62,
- 17,141,201,254,210, 96,157,121, 58,211, 81, 20,201,173, 83, 55,218,216,104, 59,167, 77,215,101,140,167, 0, 37,232,128,105,105,
-221, 7, 56,176, 54, 98,219, 84,253,144, 18,213, 66,145,130,130,110,241, 98,118,122,207, 62, 14, 43, 12,130, 26, 85,129, 77, 61,
- 63, 36,138,156,153, 88, 76,202, 23,202, 78, 72, 35, 52,105,203,114, 80,170,211,101, 85, 64, 0,188,231,221, 54,165,185,183, 39,
-155, 78,162,119,198,117,137,149,150,179,232,168, 68, 94, 81,123, 75, 81, 16,164,139, 54,102,170,250,177,168, 27,116, 67,234, 88,
- 19, 72, 69, 36, 57, 63, 96,128, 53, 64, 95,193,242,149,255, 11, 64,210,181,244, 70, 82,131, 65,219,237,118, 63,103, 54, 67, 66,
- 86,236, 30, 65, 92,216,189, 33, 78, 72,252,110,254, 1, 18, 55, 36,132, 64,218,195, 34, 8, 9,217,204,163,159,110, 63,169, 26,
-110,163, 25, 37, 99,181,198,245, 85,217,223, 87, 5,198,139, 55, 83,117,205,227,243, 91,187, 50,172,158, 97,215, 21,141,169,153,
-121,134,253,239, 12,155, 89, 54, 70,165,104,246,200, 41, 72,254, 92, 3,161,193, 80,105, 70,192,158,120,207,227,229,188,216, 69,
-206,107,192, 6,234,221,112,206,178,170, 2, 54, 61,243,177,193, 3,151, 44, 47, 18,132,139, 57,100,248,239, 16, 86, 22,251,204,
- 62,138, 65,230,131,204, 77,163, 27,154,168,107,218,118,208,236, 79,185,207,251,198, 45, 15,210,125,245,217,155, 31,222, 43, 49,
-252,226,220,200,169, 33,193, 57, 25, 81,156,175,142, 56, 90,200,149,151, 48, 32, 89, 49,210,206,166,204,108,247, 98, 76, 47, 56,
-219,202,154, 85,120,194, 2,147,185,193,167,126,127,253,218,248,151,111, 78, 19, 4,215, 5,196,134,190, 31,190, 10,160,169,180,
-118, 1,140,187, 20,156,247,141,240, 43, 27, 13, 23,179,228,189, 42,226,148, 92,118,155,114, 96, 72, 98, 70,217, 8, 3, 8,172,
- 43,216,100,139,114,200,148,190,109, 98,136,113,156,128,157, 43,227,171,150,225,165,146,219, 53,232,173,146, 26, 27,104, 89, 41,
-118, 47,249,128,109, 8, 44, 90,155, 81,131, 91, 11, 72, 75, 79,173, 15,100, 0, 75,195, 82, 64, 4,165,100,152, 3, 49,171, 99,
-142,234,186,226,209, 56,212, 5, 0,153, 88, 38, 84,180, 30, 63, 16,195, 11, 31, 14, 66, 54, 0, 67, 8,242, 90, 49,108, 59, 74,
- 91,209,120, 40, 31,107, 93,225, 49, 67, 6, 64,111, 6, 0, 97,240,105,199, 62,153, 64, 59,217,125,199, 28, 14, 14, 99,162,204,
- 0,217,232,110,153, 44,106,137,235,186,249, 57, 88,115,233,241, 65, 40, 42,181, 48,149, 24, 85,108,252,228,119,183,182,208,144,
-222,145,110, 58, 33,153,125, 53,102,191,110,246, 85, 86,173,173, 38,200,142,181,164,222,193,131,155, 33,187, 51,104, 15,115,182,
-153,164, 19, 64,161,116,180,170,174,233, 65,154,247, 70,245,130,254, 26, 32,182, 91,193, 23,103, 87,188, 2, 1, 43,233,220, 89,
- 50,126, 38, 95, 7,223,141, 49,110, 99, 72, 22,160, 90,172, 46, 39,218,239,179,143,128, 41, 42, 32,196, 91,125,157,191,135,248,
-228, 69,119,206, 27, 39,126, 56,166,169, 65, 56,128,188,215,201, 31, 30,177,114, 96,143, 23,147,248,107,182,130, 9, 57, 95,135,
-248,119,244,229, 80,195, 99,130,240, 49, 45,190,161, 14,163,143, 21, 37, 69,169, 64,139, 12, 83,215, 45,196,186, 47, 86,158,227,
-153, 80,196, 22, 11, 64,101,192,154,186, 8,238,147,153,190,147, 70,246, 50, 21, 80, 78,155,142, 31, 93, 89, 62,184,251,103,113,
-127,147,223,220,164,175, 81,187,218,254, 92, 84,199,235,133,192,255,173, 41,120,113, 39,194, 1,218,244,195,116,243,167,197, 86,
- 63,183, 97, 86,197,219, 54,181, 95,202, 31,229,252,219,249, 52,230, 98,199,211, 82, 23,120, 22,164,212,246, 41, 89, 80,170,193,
-210,190,110, 39,244,139,168, 24,159,155,237,172,128,172, 37,120, 59,239,106, 20,170, 54, 39,154,178,215,109,206, 35, 13,144, 68,
-128,246,139,207,131, 59,128,249,237,202, 56,175,215, 40,129,149,199,123,122, 75,195,150, 54,250, 6,130, 85, 1,208, 83,213, 39,
-239, 34,141,119, 20, 3,198, 54,185,218, 35,125, 26,227,108, 87,183,232,203,135,191,157, 44,210,225,237,251,239,111,223,125,247,
-237,113, 60, 63,157,198,143,207,159,214,241, 52,228,164,110,191,184,171,119, 96,154,123, 54,207,249,225,215,159,255,152, 98,158,
-138,135, 46,246, 76,144, 4,105,238,101, 33, 39,227,132, 59,165,214,136,233, 37,222, 87,254,167, 39,245,143,200,173,209, 79, 83,
- 58,152, 34,156,130, 56, 98,181,250, 95,157, 74, 11, 56,116,192,249,115,176,113, 62,166,155,251, 92,230,139,113,251,229,217,250,
- 46, 50, 23, 3,144, 34,252, 2,242, 99,183,150,222,117, 18,171, 45, 93,153, 56,196, 95, 89, 48, 22, 77,155, 1, 80,240,158, 39,
- 34,156, 46,138,177,108, 65,153, 58,126, 23,211, 1, 26, 14,218,119,138, 97,125,181,169,116,209,207,114,151, 42, 0, 90,212, 37,
- 42,121,220, 70,189, 55, 7, 0,190, 42,111,188,190, 20,120, 60,194,252, 53,165, 22, 98,175,234,238,130,154,202, 30,187, 82,174,
-171, 19, 27,180,168,174,187,176,177, 35,222, 0,240, 32, 55,186, 86,199,156, 70,191, 78,170,223,117,126,184, 88, 35,119, 2,197,
- 99,140,156, 33,215, 13,216, 55, 8,119, 90, 68,120,220,249,186, 48, 77,233, 87,104,186, 36,167,230,226, 7,206, 33, 54,154,209,
- 0,216,232, 75,140,248,205,135,220,162, 70,129,136,174,103, 81,148,214,211,123,104, 95, 65,228, 98,179, 91, 20,122, 19,107,241,
-159, 0, 28, 93,203,114, 27, 55, 16,196, 99,176, 79,146,178, 20, 39,246, 37,135, 84,202,151, 28, 82,190,228,183,115,200,111,228,
-150, 31,200,193, 86,149, 28, 75,162, 72,238, 46, 22,192, 2, 72,247, 94, 84, 69,145,172, 2,177,192, 76,207,171, 91,172, 25, 83,
-217, 43, 76, 66, 12, 76,178, 47,214,244, 52,156, 81,194,194, 74,161, 48, 52,150,146,114,195,121,174,241, 2, 67, 8,180,157,215,
-179,103, 27,123, 18,231,218, 9, 59,231, 23,210, 65,132, 85,227,194,190,136, 99,131,226,249, 81,159,190, 44,106,128,101,243,209,
- 78,193, 58, 55,219,101, 72,115,241,247,155, 5,168,224,236,160,237,154,244, 83, 41, 10,174,239, 46, 14,164,169,159, 41,179,163,
- 6, 11,219,212,144,200,222, 73,255,199,231,223,212,240,247,250,245,121, 39,220, 36, 33, 24,126, 66,166, 46, 48,236, 98, 75,102,
- 54,246,199, 45,120,168,137, 57,108,216, 43,248,135, 75,214,158,117, 52,252,221, 12, 11, 98,228, 61,150, 98,159,224,143, 63,220,
-255, 58,135,195,102, 39,201, 41, 25,132, 91,158, 35,229,134,196, 11,235, 10, 39, 88, 42,112,244,118, 99,246, 32,213,212,152, 57,
- 45, 56, 22,136,216, 16,198,198,236, 3,155,108, 18, 73,103, 36, 51,175,117, 41,184, 51, 76, 1,248, 55,246, 44,133, 93, 80, 57,
-171, 17, 1, 60, 28, 88, 9,214,195,218,179, 21,177, 32, 6,190,172, 4,159, 90,183, 62,168,113,203, 17,160,151,233,255,107,140,
-192,255,184,245, 3,240,218, 72, 21,244, 32, 98,111,148,196,214,216,101,236, 76, 78, 0,176,147, 40, 67,138, 22,166,162,185,109,
-153,204, 19,236,211, 0, 16,206,205,181,179, 29, 14,192,140,120,170,148, 3,147, 77, 64, 18,116,193, 42, 33, 62,192,243, 12,213,
-205,249,244, 94, 66, 99,205, 93, 40,177,151,195,129, 41,254, 25,192, 3, 40, 46,199,182,152,196,161,215,150,165,245,154, 0,163,
-231,209,133, 37,187, 53, 68, 26, 74,224, 3,234,157, 31,222, 33,220,170,111, 79,105,124, 96,241,129, 5,201, 31, 56, 54,160,137,
- 7,136,142,143,138,100, 91, 51, 62, 73,158, 30,132, 70,210,155, 12,200,239,243,127, 29,140,190, 57,236,134,100, 21, 59, 14, 84,
-111,215, 8,163, 90, 38, 8,152, 87, 35, 49, 88,180,123, 3,123, 98,181, 92, 79,108,245,101,177,153,100, 3, 66, 97,176,147,162,
- 20,193,209,108, 15, 77,216,135, 22,178,164,232, 53,135, 40, 97, 97,216, 56,100,202,222,191,141,175,236,165, 84,224, 23, 47,204,
-222, 32, 30,118,100, 25, 99,107, 57,208,205,178, 40,248, 14,137,223,107,189, 58,118,254, 86, 68, 7,134, 21, 29,220, 91,129, 11,
- 77, 8,162,157, 83, 84, 36,188,193, 39, 73,236,175, 52, 16, 30,168,176, 82, 24, 39,113,226,181, 52,136,152, 55,149, 78,236, 34,
- 3,120,161,222,163,228, 91,172,245, 91, 73,207,101,216,139,201,119, 77,252,185,121,203,164,214, 46, 20, 34, 90, 77,190,250, 19,
- 86, 48,245,183,193,172,157,195, 89,236, 7,215,254, 62,252,121, 58,255,117,254, 14,152,170,242, 5, 48, 37,225, 92, 82,159,252,
- 5, 91,105,124,205,225,155,226,131, 95, 85, 63,215,249,163, 30,135,156, 88, 93, 84,249, 70,201, 32, 98,246,180, 1,155,168,169,
-232,214,152,168,107,103,131,231,131, 35,145,219, 74, 30, 15,213,146,108, 81,193,192, 52,212, 14, 6,198,201,189, 10,243, 84,146,
-179, 43, 96, 45,222,155, 72, 67, 5,128, 27, 18,192, 61, 86,198,230, 43,102, 67, 16,247,157, 61,254,161,174,241,245, 75,246,109,
- 26, 92,119,255,254,151,187,143, 63,126, 74, 90,228,237,117, 13,151,171,170,203, 37,191,132,199,233,201,222,166,249, 70, 54, 39,
-224,229,160,165, 69,232,174,118, 38,255, 9,119, 7, 22,255,249,221, 67,124,124,250,148,190,254,243,239,230, 67,184,151,122,196,
-130, 99, 89, 97,219,158,167, 1,160,246, 10,120,118,189, 53,186,103,227, 47,238,235,169,191,226, 54,158,133,178, 47,146, 0, 14,
-194, 25,168, 2, 32, 42, 47, 91,237, 68, 0,107,241, 45, 83,230,104,173, 5, 80,223,194,166, 71, 1,200,216, 56,138, 90, 29, 85,
-109, 72, 0, 36,100,245,201, 83, 60,178, 63, 76,218,200, 12, 56, 41,156,100, 68, 8, 67, 64,104,212, 65,177, 67, 77,198,198,104,
- 0, 65,215,142, 36,110, 50,212,254,164,218, 48,169, 63, 77,122, 72,125,118, 8, 12,230,238, 3,185,156, 56, 57,221,247,205,210,
- 32,120, 85,100,149, 98,182, 59,194, 27, 52, 50,159, 97,193, 23,193, 75,111,201, 86,171, 11, 66, 0, 59,183,236,130,133, 5,210,
-177,175,162,187, 62,110,210,135, 48,177,113,181,117, 71,173,131, 80, 33,110,216, 26, 99,231, 87,135,159, 77, 69, 83,158,239,122,
-152, 87,229,186, 0, 43,120, 8,173, 87,106, 29, 97, 73, 28,245, 57,214, 90,143, 19,236, 78,252, 95, 0,142,174,100, 55,114, 27,
- 10,114, 17,181,219,221,157,113, 14,185,206, 57, 64, 78,249,253,252, 67,144, 91,144, 5, 51, 8,130,140,103,236, 94, 36, 74,220,
-153, 42,157,220,134,221,232, 22,249,248, 88, 69,190, 87,213, 80, 59, 7,171, 38,174, 5, 4, 92,233,206, 43, 13, 14, 5,196, 24,
- 65, 10, 52,205,152,203,109, 46,237, 2,226, 44,124, 94,144,254, 90, 49,198,107,168, 14, 8,117,140,222,215,253, 10,230,232,241,
- 0,114,127,187,109,143, 57, 54,207,226,191,111, 36, 54,193,167,137,141,230,200,209, 30,223,194,224, 71,158,237,195, 97,104, 59,
-124,147, 57,250,149,198,160,145,226,131, 18,127, 13, 98, 27,205, 56,237, 31,202,178,116,151, 11,128,162,147,189,158,238, 47, 63,
-125,188,137,253, 47,208, 11,149,222,138,105,168, 64,154, 78,138,183, 3, 36, 17, 72,241, 20,255,162,152, 57,149, 78,216, 22,201,
-170,234,227,138, 77, 62,240, 60, 57,129,139, 71,138,195, 24,226,197, 16,254,232, 47,151,203,240,227,167, 55, 57, 15,200,253,155,
- 8, 81,165,167, 82,239, 89, 97,207, 26, 85,107, 11,151, 41,189,237,188, 2,122,163,141, 47,192,123, 42, 90,198, 83,109,240, 27,
-128,174,207,182,219,250,140, 96,234, 71,225,202,251,251, 87, 68, 78, 4, 59, 6,254,175, 98, 79, 87,225,238,143,210,182, 49, 57,
-207,195,125,154, 55,246, 72,210,157,122,240, 90, 54,230, 71,195,162, 65,250,212,230,185,105,157,165, 99, 64,117,204,108,171,170,
-131, 3,189,148,116,228, 96,131, 11, 91, 28,183,210,130,206, 60, 89,189, 99,207,126, 46,142,218,243, 77,192,174,158, 0,226, 88,
- 7,210, 4,177,219,195,230,124,170,136, 68,115,146,188,245, 91,203,214, 96,198,117,237,187,231, 41,143, 69,154,234, 64,231, 89,
- 35, 5,254,125,103,163,121, 90,133, 26,171,180,149, 94,189, 49,221,190, 22, 53,202,100,252, 82,244,249,154, 73, 43,121,102,165,
-122,161,242, 85, 15,137, 71, 32, 93, 2,118, 85,214,176, 19,114,152, 8,173, 61, 27,133,148,106, 87, 60,204,104,155, 77,214, 14,
-244,180,232,188, 19,117,128, 43,134, 68, 26,216, 15,131,142,131, 4, 58, 42,251,145,102,123,246,214, 49,206, 90, 45,193,240, 14,
-237, 78, 76,171,178, 66,173, 53,207, 42,130,110, 96,195,156, 68,155, 59,204,164, 70, 32,181, 2,235,203,217, 60,204,233,232,208,
-164,154,251, 20,211, 81, 21,227, 59, 49,178,248, 91, 99,196,103,122, 23, 48,209, 7,126, 16,251, 65,122,124, 20, 59,195, 40, 84,
-102,232, 5, 42, 91, 67,211,202,249,117, 69, 92, 86, 22, 49,131, 49,240,214,183,178,102, 22,111,190, 53, 89, 73,123, 40,248, 41,
-229,212,107,163, 46, 2,208, 10, 3,151, 7,234,112,139,118,207, 71,161, 28, 32, 38,248, 49, 18, 39,208,132,169, 10,203, 13,147,
- 67, 99,214,202, 18, 70,132,126,162,217, 13, 85,156,217,141,137, 45, 10, 25,196, 85,241,250,116, 49, 72, 77,141, 83, 20, 30, 79,
- 47, 31,187,223,166,237,151, 47, 64, 79, 60,166,194,192,111, 52,139,205, 71, 31, 23, 64, 81,113, 65,148, 71, 46,126, 9,197, 74,
- 80,222,243, 72,159, 18, 22, 11, 88, 13,106,230,217,122, 2, 24, 76, 12,171,230, 14,255,141, 1, 60,212,232,132,191,138, 31,206,
-227,195,110,238,207,191,219,243,207, 30,176, 92, 99,132,105,150, 24, 8, 22, 34, 91, 72,188, 96,157, 87,241, 32, 41,160,170,120,
-133,133,229,253,225, 58,160, 49,226, 75, 80, 82,223,204,225,115, 33,246,165,245,106,245,136,116,139,216,247, 59,189, 35,245, 53,
- 44, 9,112, 93,174, 95,154,165,185,150,171,204,223, 81,201,146,167, 81,255,150,199,188,181,152,189, 15, 34,149,224,254,137,214,
-127,127,118,191,219,151,207,191, 46,183,245,126,103,151,232,173,169, 19,183, 40,236, 39, 34,174, 14,216,188, 2,249, 33, 39,131,
- 63, 45, 91, 87,245,202,227, 10, 23, 1, 32,108,197, 2,237,218,224,124,115, 15,216,210,132,193,211,239, 18,212, 26,236, 40,237,
- 9,107,205, 28,118, 32,135,192,115,234, 39,154,140, 33, 75, 3,239, 40,221,142,181,169,131, 66,226,180,134, 66,133,173, 1,247,
-108,193,104,135, 25,217,163,222,198, 48,200, 49,116, 13, 2,184,243, 81, 13,192,223, 39,140,141, 33,110,161,113,119,159,106, 55,
- 40,149,207, 3,207, 32,232,155, 46,117,223,108,119,197,195,164,201,104,202,192,124, 19, 79, 10,100, 14,252, 91,123,111,222,105,
-144, 80, 1,212,134,177, 75, 22,137, 95, 90,227,187, 14, 9, 98,239,195,201, 2, 78,130,209, 83, 6,164,244, 64,138,157, 88,246,
- 94,110, 64,147,195, 94,119,141,172, 31,125, 0,119, 6,121,152,183,149,198,246, 82, 15,110, 45,236, 27,206,170,189, 54,192,100,
-200,218, 3,165,156, 82, 10,173, 42,230, 68,128,244,191, 0, 28, 93,203,174,219, 54, 20, 20, 41,190, 36,217,206,189,185,105,208,
-166, 64,139,162,139,254, 64, 63,190,171,126, 64, 86,249,129, 22, 13, 16,116,147,220,218,214,139,164,248,234,140,183,182, 97, 75,
-242,225, 57, 51,228, 57, 51, 10, 48,255,212, 79,115, 57,216, 32,194,241,143,195, 87,106,118, 55, 73, 5,249,157,147,113, 59,178,
-229,150,192, 49,140,233,102,101,199, 12,164,236,173,174,135,162,178,111, 73,184,195,227,118,127, 40, 52,136, 65,223,193,253, 81,
-216,234,181,230,237,240,103,106,162,208, 77,187,173,161,142, 95, 99, 30,121, 21, 46,149,225,222,217,231,114, 63, 78,148,252, 60,
-117,147, 29, 53,202,237, 64,185,136, 55,193, 88,186, 28, 95,116,255, 60,216,237,237,143, 47, 79,147,239, 94, 55,110, 65, 14,156,
-196, 0,170,163,113, 55,213,113, 18,129,153,160,175, 39,233, 63,231, 11,143, 14,165,191,115,212,237,102,119,140,104,156,126, 71,
-222,191, 80, 24, 74,239,108, 87, 91,182,172, 62,189,127,249,112,155,127,222,226,235,148,143, 80, 76,213,171, 0, 71, 21,139,180,
-247,178,245,148,208,169,166,248, 21,196,133,115, 17, 8, 41,143,175,227, 17,214,173, 33, 72,193, 19,187, 45, 3,202, 47, 35, 74,
-159, 57, 47,102, 93, 55,144, 16,237, 54,124,116, 69,237, 10, 0,174, 57, 57, 30,114,112,252, 23, 40,226,219,125,165, 79, 33,187,
- 72,211,212,197,123,118, 23, 95, 77, 85, 30, 65,132,240,111,180, 52, 74, 22,233, 38,215, 77,250,222,212,173, 68, 42,183, 9,199,
-252,140,234,212, 45,246, 33, 56, 27,133, 91,132,140,242,100,250,237, 5, 40,171,239,246,138,136,215, 99,122,166,200, 20,133,246,
- 3,202,248,214, 80,112,202,185, 71, 54,186,116,122, 30,114, 6, 29, 63,248,144, 64,225,182,210,118,148,243,198,182, 61,182, 80,
-209,205,128, 6, 95,101, 60, 68,224, 30, 99,100,223, 28, 66, 10, 81, 98, 81,118,197,150, 26, 80, 44,174, 39,112,202,121, 71, 18,
-227,161,128,182, 53,103,119,148, 59, 45, 80,216,169,170,242,102,180,162,188, 15, 10,151, 57,178, 53,103, 30, 81,171, 42,107, 14,
-198,136, 71, 35, 36,222,158, 75, 25, 59,245,116,136,152, 29, 64,147, 65,214, 69, 32,129,143,177,145, 65, 70,164, 4, 90, 30,119,
-108,103,224,212, 25, 86, 38, 72,186, 12,185, 23,113, 15,146,210,122,184,137, 81,156, 63, 40,241,185, 0,189,179, 98, 2, 89, 81,
-115,157,122, 75,125,246,168,124, 15,241,200, 70, 41,111, 46, 77, 36,119,253,152,211, 44,141,173,241, 8, 28,206, 40,123,206,139,
-133, 18,228,230,187,227, 63, 64, 89,234,123, 10,188,241, 24,143,145,160,104,135, 86,244,235,176,249, 97, 20,200,189, 60, 89, 40,
-218, 60,208, 94, 21, 4,141,253,142,148,103,174,197,148, 30, 1,122,165, 11, 26,234,164, 82, 88,229, 72, 29, 29,173,174, 2,101,
-231,237, 78, 1, 42,192,103,167, 72, 26,232,121, 60, 37, 4,159,202,120,140, 91,113, 79, 78,124,223,255,185,126,185,202,221,114,
- 60,203,235,176,114,107, 19,176, 60,236,113,161, 44,121,211, 73,244, 94, 92,231,250,250,185,157, 92, 60,153,119,114,144, 53, 30,
-137, 7,246,141,154, 52,138, 66,229,212,151,111,146,237,156,162, 46,175, 10,124, 54,250,116,249,193,134,254,254,207, 95,127,252,
-246,242,187,253,229,167, 24, 61,208,160, 84, 99, 79, 57,150,142,219, 87,192,245, 1,127, 39,126, 18,220,253, 6, 96,212,184, 1,
-207,237,196, 76, 23, 24,173, 53,149,142, 81, 51, 35,125, 51,147, 99, 11,143, 68, 53,156, 61, 45,147,114, 89,247,229,240,113,141,
-173,198,217,190,235,210, 56, 81,198,182,177,117,220,128, 74, 32,207,231,136,252,180,179,249,228,242,235, 80,235,251,111, 31,183,
-127,255,254, 50, 11, 96,155, 41, 68,175, 57,148, 96, 30,179, 86, 97,233,147, 18,212,223, 21,233,109, 1,107, 40,189, 86,203,150,
-212,186,234,129, 13,175, 43,136,116, 70,102,209,209,161,218,246, 62, 56,121,219, 85,241, 61, 18, 42, 24,172, 73, 60,140, 2, 52,
- 81,108, 84, 3,140,146, 60, 87, 65,150, 96, 36,209, 77,199, 21,117, 29,229,100,237,119, 88,223, 13, 68,199,225, 63, 62,143,221,
-130, 84,175,198, 52,161, 84,208,180, 79,115,243,118,170,101,125,156,113, 79,102, 77,245,121, 6,178,175,184, 37, 1,178,145,109,
- 59,245, 2,164, 89,157,101, 59,144,156,146,113, 3, 37, 51, 0, 54,164,166,156,128,170,170,153,113,113,157, 93, 78, 58,134, 10,
-236,164,213,137,248, 2,117, 84, 61, 25, 92,211, 28,103, 35,135,118, 18, 10, 15, 8, 16,222,169,103,105,108, 78,200,101, 87, 82,
-184, 55,173,124, 53, 72, 73, 58,245,120,156, 96,111, 15,155,103, 80,106,141, 34,133,117,131, 87,247,155,202,163, 77, 19,126,218,
-143,157,199,119,239,234,127, 1, 56,186,146,221, 56,110, 40,200,230,214,235, 44,138, 44, 71, 8,178,220, 2,127, 82,254, 49, 63,
-146,107, 16, 32,200,201,128,141,216, 66,100,123,102,122,103,147, 77, 50, 85,115,211, 65,208,140,154,236,247,170,222, 82,165,165,
-220, 6, 65,163, 99,147,145,119, 41,194, 40, 51,155,154,160, 72, 35,135, 29, 16,116,186,135, 2,169,203,185, 85, 47, 98, 38,121,
-247,114, 92, 47,151,162,168, 29, 37,232,144,106,163,112,118,230, 94,148, 12,248,149,117,162, 25,225,142,104, 22,228, 12,216, 42,
-253,200, 78, 20, 64,122,211, 26,110, 11,172, 51,112,211, 91, 43,108,117,174,233, 37,242, 6,231,175,252, 85, 71,202, 78, 5,113,
-214,128,132,171, 81, 22, 84,193,109,233,233,220,138,118, 88, 23, 78,186,222, 25, 60, 94,170,219,142, 8, 73,213,159,142,251, 89,
- 8,217,120, 67,129,143,239,179, 46,220,244, 48,180, 44,224,198,224,134,159,117, 98,199,144,105,157,230, 23, 96,209,136,239,241,
-253,233,244,247,177,252,229,245, 22, 56, 64, 70, 45,218,151, 98, 71,220, 70,242,236, 65,187, 29, 30,195,202,154,158,201,115, 68,
- 52,103, 93,123,247, 8,105,235, 85, 82,133, 72,222,162,239, 82,139,244, 50, 43,159,194,164,229, 25, 7, 63, 58, 94,220, 13, 33,
-226,150,235,117,191, 93,229,148,166,151,121, 20,235, 68,209,135,218,252,248,253, 35, 30, 73,109, 90,183,111,249,210,191,188,190,
- 2, 10,231,206,109, 86,151,153, 54,124, 60,128, 44, 78,108,127, 23, 75, 45, 56,115,189,199, 53,113,220, 70,225, 36,167,146,245,
-117,134, 23, 28,229,230,167,148,125,230,170, 60,110,145, 85, 64,133,116, 18,171,112, 40,214,238, 21,103,252, 4,167,191, 1, 28,
-123,252, 61,135,212, 34,171, 50,207,134,187,127,143,201, 52, 21,176,191, 95,191, 1,254,202,253, 62,236, 7, 84,156, 7, 78,128,
-126, 3,200,180,212,196,144,222, 37, 10, 84,236,116,226,200,236,194,115,182,143,221, 19,186,187, 80, 8,173, 51,224, 42,200, 12,
-236,245, 68,215,207, 15,246, 64,253, 35,118,194,140,138, 96,146,189,162, 58,174, 2,203, 12,118,140,125,187,181, 25,236,155,255,
- 88,205, 45,188,134,147,150,117, 77,147, 87,110,205,149,193,229,184, 37, 41, 27,246,204,243, 5, 48,214, 82,198,169,207,177,165,
-139,227, 93,139, 11,175,227,232, 89,141,148,166,101,205, 37,164, 16, 10,188,174,106,224,228, 67, 72,247,137,200,187, 91, 44, 40,
-121,212,108,171,110,154, 15,150,133,247, 21,193,152,138, 35,156, 3, 46, 5, 88,180, 42,185, 7, 80, 70, 23,116,181,147, 59, 55,
-244, 88, 1,106,162, 86, 65,187, 35,120,131,150,129,227,176,113,221,112,233, 77,123,100,109, 64,117,196,123, 31, 92,101,247,141,
- 27,127,182,160,119,129,166,249, 6, 62, 18,232,123,111,234,240,149,142,123, 5, 64,205,102, 20,222, 59,124,161,218, 16, 49,177,
- 70, 98,193, 17, 42,155,211,146,119, 59,112,157,241,135,159,139, 63,212,235,159,251,144,149,213,211, 18, 47,189, 87,139,159, 56,
- 10, 73,195,123, 67,165, 85,164, 97,186,233, 62,157, 64, 54,253,167,247,225,185, 25, 79,143, 71,127, 87, 24,208, 5,115, 50,190,
-180, 90,164, 63,112,242,231,176,164,237, 44,154,149,138,128,206, 81,137,234,167, 99,101,191,251,248,249,243,239, 79,221,111,234,
-249, 87,143, 84, 42,157, 80,120,193, 43, 26,213,196,188,226,144, 34,117,165,129, 29, 21,181, 74,150, 82,182,130,123,237,177,203,
- 71,167, 38,155,254, 83, 13,189,228, 29,168, 96,214, 95,110,171, 54, 49,237,126,190,174, 87, 59,131,114,233,194, 53,117,213, 54,
-199, 61, 12,128, 4,130, 57,199, 87,243,162, 6, 85,212,169,242, 75, 6,126, 56,191,233,230,217,254,243, 87,248,247,131,248,202,
-205,120,202, 54,236,162,162, 44,180, 24, 11,220, 88,209, 93, 62,188, 91, 63,125, 76,122,158,122, 26, 52, 26,218, 44,214, 27, 29,
-135, 39, 90,193,109,146,149, 89, 42, 58,219, 27,237, 37,112, 53, 16,191,131,182,145,152, 47, 41, 42,251,130,196, 55, 13,167, 74,
-138,189, 43, 21,200, 13, 39, 90,235,128, 92,165, 21,194,181, 56,120,164, 1, 22,181, 41,212, 89,166,170,156, 99, 99,236,246, 28,
- 15, 44,245, 85,186, 68, 78,193,197, 86,173,170,113,159,113,251,140,139,111,181,178,143, 53,213, 83,167, 32,170,178, 80, 72,223,
-184, 31,235,152,142, 32,183,166,110,251, 42,149,243, 22,189,211,174,209,231,213,129, 98, 1,231,112,238, 36,157, 92,140, 97, 91,
- 31,170,135,173,248, 66,220, 50, 25, 87, 15, 21,216,156, 9,137,132,179, 96,113,212,166,212,204, 35,179, 57,167, 10,105, 62,225,
-150,250, 80, 13,171,242,200,181, 68, 51,138, 50, 27,177,169, 64, 72,142,210,244, 0,214,118, 47,186, 62,176, 30,210, 60,137, 98,
- 48,251,204, 18,208,255, 2,144,116, 53, 45,146, 20, 81, 48, 63, 42, 51,235,107,186,123,220,113, 6,196, 69,193,133, 5, 5,193,
-131, 39,143, 94, 61, 9,254, 71,127,132,226, 94,244,224, 65,240, 34, 8, 10, 11, 30,220,117,183,157,174,234,250,202,172,204, 74,
- 35,202, 62,244,165,153,238,170,156,151,239, 69, 84,190, 23, 65,191, 31,181,103,184,235,186,251,193, 26,143,149, 19, 84, 43,116,
-224,144,160,252,107,154, 47,210, 95, 17,165,131,178, 69, 19,240,121,148,235,232, 84,139, 60, 55,129,145,129,189,115,228,106,200,
- 19,211,189, 6,162,176, 51,155, 63, 66, 25,170,140,108,102, 23,160, 60,175,106,118,249,133, 56, 57,141, 77,185,210,175,224, 50,
- 99,117,148, 57,196, 33,214,215,233, 8,160,117,123,191,205, 7, 93, 10,195,230, 24, 16, 51, 93,173,167,224,176,123,150, 40,204,
- 69,216, 34,147,138,154, 40,238,104, 51,203,195, 85,108, 89,154,157,201,236,212, 46,174,202, 35,214,141,219, 1,133,155,170,200,
-192,229, 9, 53,161,204,236, 98, 29, 84, 92, 16,182, 20,232, 3,147,158,254, 58, 61,232,252, 26,140,104,177,241,228,173, 34,102,
-167, 43,166, 10, 73, 81,219, 17, 49, 27, 84, 95,232,185, 47,106, 11,170, 60, 79, 85, 64, 65, 13,201,214, 23,139, 36, 18, 85, 23,
- 55,191, 48,244,215,116,209, 4,193, 20,176,201, 22,148,166,155,175, 69,124,236,253, 77,121,253,226,163,167,159,124,250,217,215,
-223,124, 41, 45,192,119,191, 79,205,239,122,127,120,157,139, 63,127, 27,190,253,238,231,239, 95,252,244,234, 77,135,244,114, 83,
-131,240,129,195,122,189,242,160,135, 77, 61, 27,251,127,176,213, 34,111, 22,252, 47, 81, 26, 39, 2, 11, 1,246, 43,199,142,106,
-154, 9,105, 85,176,239,249,180,106,167,171,113, 43,117,232,163, 82,180,220, 4,207,177,165, 67, 52, 83, 36,113,166,104,161,197,
- 34,201, 18, 76, 48,251, 74,250, 78,186, 41, 45, 39,109,218, 4, 44, 61, 93, 65, 60,215,124, 37, 37,197, 15,252, 11,252, 38,166,
-144,139, 85,146, 14, 57,206,121,225, 54,105, 98, 8,146,128,234,242,142, 48,156,134, 54,121,238, 85, 5,154, 48, 97,193,129,167,
-253,130,255,114, 28, 70,165,195,120,169, 98,241, 79, 58,221, 33,199,220,180,135,218,190,127,231,222,189,111,155, 18,185, 18,232,
-228,229, 62, 51,105,247,101, 65,126,124,178,191, 87, 66, 92, 70,132,215,220,142,221,129,112,103, 14, 27, 72,141,200,224, 41,212,
-171, 9,162, 1,139,104,220, 82, 60,112, 54,199, 80,149, 94,243, 49, 22, 69, 83,157, 17, 11,213,186,145,246,197,133,110, 37, 76,
-244,102,151,204,162, 74,130,227,175, 85, 8, 40,199, 63,117, 61, 88, 23,128, 43,246,233,214,111, 12, 47,161,231,204, 14,243, 38,
-207,107,168,174, 18, 36, 39, 30,249, 0,204, 78, 88,254,126, 99,239, 11, 46,114,153,129, 34, 61,231, 84, 54, 85,152,122,139,151,
-180,130,151,128, 41, 54,108,124,206, 51,173,163,100, 73, 59, 72,144,241,178,228,116, 3,174,223, 20, 30,188,129,166,104,255,123,
- 87, 45,108,244,163, 67,135,122, 80,197,195,252,195,235,199,110, 28, 14,105,138,253,228, 39, 84,135,172, 71, 87,106,159, 29,105,
- 33,118,190,112,245,134,154,123, 43,245,179, 15, 14,221, 37,156, 31,215, 15, 39, 32,165,194, 47, 72, 2,244,219,226,248, 33,200,
- 77,160, 54,158, 94,196,222,188, 92,168, 49, 79, 65, 15,244,154,180,178, 93,189,120,113,254,117, 56,158,191, 50,207, 62,215,247,
- 21,109,140,116,162,214,118, 20, 21, 27,138,146, 79,165,116,200,108,201,176, 65, 28, 5, 45,175, 14, 55, 38,116,168,210,225, 33,
-210,133,100, 12,110, 26,231, 4,164,186, 0, 36, 38,153,108,213,106, 99,154, 99,246, 32, 90,114,165,196, 56, 11,247, 35,190, 1,
-132, 25, 40,220, 45,178, 46,186,227,173, 59,187,167,111,223,164,191,127, 63,255,241, 8,174,139, 10, 94,137,192, 7,145, 20,205,
-225,112,213,198,124,149,253,216,127, 44, 94,189,124,254,222, 47, 63,118,111,207,211,214, 6, 87,168, 1, 97,254,164, 80,221,184,
-197,125,194,212,111,243,200,221, 78,103, 21,195,163, 50,148,101,203,145, 51,100, 2,179, 25, 95,131,218,103,117, 37, 7,136,166,
- 68, 33, 82,142,194,201,163,164, 39,157, 93, 27,117,116,173, 42,181, 11,129,126,194,173,173,121,106, 97,151, 2,128,119,219, 13,
- 49,240,149, 17,217,235,168,214,123,160, 59,196,158,145,189,247,212,179,166,105, 39, 54, 24,138,110,114,135, 91,149,104,170, 44,
-105, 41,137,139,108,242, 77, 31, 27, 97, 93, 45,125, 24, 19,202,101, 42,154, 1,245,109,141,174,228, 84, 98,136,193, 46,244, 11,
-213,217, 89, 31,231, 93,154, 21,247, 66,233,147, 59, 19,230,169,188, 46, 45,123, 13,215, 84,138,114,150,203,113, 65,173,138,168,
-234, 64, 34,226,166, 37,148, 64,176,219,229,210,182,247, 29, 62,199, 14, 63,136, 24, 65,148,244, 52, 7, 83, 3,126,148,165,252,
- 79, 0,146,206,101,213,142, 34, 10,195,117,235,234,234,203,190, 28, 56, 39, 42,209, 16, 81,113,172,224,204,144,129,224, 68,112,
-232, 92,240, 45,124, 29, 95, 64,167,190, 65, 32, 19, 17,145,204,162, 30,200,201,185,236, 75,223,171,187,170,252,255,206,100,179,
-103,187,119,119,245, 90,255, 87,181,214,250,217, 21,144, 82, 25,148, 7,240,134, 76, 65, 75, 64,251,183,205, 60, 91,168,233, 81,
-172, 30,113, 71,200, 48, 87,154,216, 29, 58, 80, 83, 15, 18,232,101,174, 79,190, 29,109,143,215, 26, 87, 51,198, 46, 28, 52,123,
-127,151,229, 52,142,167, 67, 7,185, 89,166,121,114,147,155,161, 91,144, 20, 32, 51, 11,224, 4, 66, 82, 49, 67,235,203, 76,109,
- 83, 85, 37,122,143, 24, 45,171,189, 7,121,187, 26,249,161, 42,113,199, 69,218,217,165,129,106, 78, 5,148,154, 56,231, 57,200,
-159,165,151, 80, 70,187,196,160,221,179,143,105,129,138, 58,199,172,202, 0,199,145,231,196, 66,237, 22,129, 71,236,161, 87, 85,
-178, 70, 22,239, 54, 39,147, 56, 40, 86,237,217,249, 16, 89, 91, 25,133,159,122,136, 89,240,134,222,220, 14,227, 17, 18,127, 29,
- 61, 46, 29,112,148,245, 98,237, 48, 94,248,185,145,193, 91,118,194,220,139, 97,178,253, 5, 89,192,142, 67, 0, 94,204, 7,224,
- 14,116,236,236,131, 96, 53, 25, 11, 11, 89,237,200, 73,231,205, 18,186,101,122,124,169,126,248,233,219,175,191,250, 78,136, 55,
- 98,105,167,187,191, 99,255, 58,210,237, 9,235, 4,228, 22,204,238,233, 39,207, 62,253,249,217, 55, 63,254,247,217,175,191,252,
-245,219,239,127, 30,110, 30,118, 91,203,157,110,195, 38,100,169, 69,234,184,159, 64,108, 5, 42, 98, 49,112, 16, 71,204,117,218,
- 91,193,227,111,100,229,109,224,152,228,129,219,202,213,224,146,135, 88,136, 29,148, 4, 84, 10, 61, 6, 82, 26,124,226,140, 34,
- 81, 85,108,103,167, 43,139,158,134, 24,204,228, 66, 49,217, 77, 28,134,172,185, 23, 85, 24, 89, 45, 35, 83, 55,120, 21,192,118,
-118, 26, 56,140,191,152,146,163,175, 23, 34, 22,251,139, 9,242,139, 44, 11, 62,182, 65,110,135,161, 87,133,246,140, 60, 96, 38,
-103,234, 49,244,248, 84, 16,216,119, 13,212,241,133,123,239,201,199,159,235,247, 63,120,244,248, 98,112,117, 45,168,214,142,171,
- 37,106,192, 61, 89, 34,176,214,225, 57,114,198, 29, 61,135,254, 69, 12,148,102,171, 84, 87,234,170,218, 21, 87,187,125,136,197,
-177,171,250,238,195, 99,115, 51, 55, 71,135,236,143,212,146,230,128,108,101,146,169,226,212,174, 19,192, 28,119, 99,228, 27, 30,
-171,154, 85,188,227,230,128,132,188,161, 60, 88, 39, 81,175, 3, 90, 56, 74,153,191,207, 66, 64, 37,206, 28, 81, 32, 84, 59,109,
- 14,255,120, 91,219,165, 85,220, 39,211,156, 54,156,209,115, 38, 51,189,202, 0, 60, 59,201, 41, 68, 49,103,229, 75,146,153,175,
- 69,153,112, 19, 89,174,144,188, 31,241,126,114, 79,145, 19, 1, 54,198,181,156, 89,128,124,143,200,176, 26, 60, 2, 58, 87,171,
- 10,223,211, 31,166,112,113, 94,197,153, 95,219,213,202, 76,179,136, 25, 65,121,188,123,117,188,158,186,209, 79, 71,201,109,113,
- 58,179,207,208,104, 75,147, 26, 96, 89,167, 12, 91,122,248, 55, 31,160, 59, 31,201, 47,158,239,175,100,220,149,233, 6,171, 45,
-163,155,206,216,211, 43, 18,228,148, 73,214, 28,133, 75,109, 16,227,230, 24,107, 37,161,187,206,190, 70, 74, 65,198, 40,150,225,
-234, 69, 60, 94,187,151, 47,237,254,123,121,245,212, 84, 84,170, 94,116, 6, 16,204, 98,125, 3, 5,175,217,221,230,104, 13,136,
-165,228, 38, 19,114,215,171, 33,207,187,211, 57,208,220, 44, 3,114, 47,177,111,233,209,114,185,173,216, 46,128, 68, 61,135, 26,
- 36, 43,114,133,117,228,188,182,109,187,128, 63,171, 98, 10, 89,115,242,238,230,248,164,125,107,253,235,219,107,209, 53, 28, 41,
-138, 52,164, 34, 51,124,135, 80, 63,175, 79, 7,175, 61,244,200,125,154, 94,253,241,229,243,143, 94, 20, 69,144,103, 17,205,112,
- 56,155,198, 38,155,173, 17,125,234, 86, 59, 6, 29,103,229,170, 48, 4,167, 7,213,144, 52, 56,244,128, 34,168,136, 27, 27, 88,
- 23, 68,151, 42,188, 10, 11,168,220,210,104,197, 56,165, 13, 36,185,172, 32,190,125,124, 64, 8, 71,180,102, 99, 73,230, 54, 2,
-144, 49,114, 11,179, 68, 48,115, 91, 44, 2,228,130,102,242, 60,134,130, 44,157,192, 17, 90,235,204,156, 16,254,162,205, 55,239,
- 26,206,163,173,242, 76, 22, 60, 69,212,195,152,201, 26, 57, 28, 8, 54,118,222, 64,132, 65, 65,208, 98, 56, 0, 40, 64,146,114,
-223, 99,101, 20, 69, 18,243, 62,225, 91, 58,229,129,120, 25,217,185, 7,156,104, 39, 78,105,204,205,185,215, 69,193, 17, 91,184,
-126,113,155, 92, 91, 46,245,130,160,102, 19,144,222,203, 92,212, 66,234,253, 91,145,155,242,184,231,105,184,245, 64, 41, 90, 30,
-108,163,239, 77,214,143,226,127, 1, 72, 58,151,222, 56,170, 32, 10,247,125,118,207,195, 99,123,156, 68,114, 44, 34, 36, 96,195,
- 35, 44, 34,111,144,216,177,205, 79, 96,201, 54,252, 39,126, 18, 18, 82, 8, 16,136,229,196,198,142,221,238,153,126,220,190,175,
-230,156,102,227,101,123,124, 93,115,234,171,190, 85,117,212,143,175,126,226,187,152,200,198,205,121, 59,102, 90,130, 82, 50,141,
-234, 1,185,126, 2,173,231,128, 96,106, 38,213,239, 80, 63, 87,114,116, 41,119,185, 11, 69,157,156,195,239,225,120, 22, 34, 50,
- 58, 25, 92,168, 22,174, 46,215,186, 43,217,154,109, 23,134, 98, 54, 33,109,163, 90,197,193, 33, 72,104, 4, 90,109,139,147,117,
-206,160, 10, 40,146, 60,128,226,173,183,102,131,186,183,223, 44,149, 93,226, 48,196,129,226, 77,156,121,196, 97,191, 92,126,190,
- 29,170,147,119,190,223,240, 41,211, 60,108,150,145,162,227,196, 61,186, 86,211,131, 14,228, 61,137,217,224,146,221,178, 92,160,
- 96,216,254,225, 0,169,144, 96, 7,156, 55,213, 42,198,155,156,118, 10, 96, 42, 70, 91,110,213,234,197,235,183,111, 43,231,166,
-241,128, 77, 40,136,238,166,245,197,190,237, 35, 23,207, 58, 63,148,141,190,143,163,208, 36,245, 74, 57, 49,221, 41,239,111, 11,
-203,117,147,177,235, 19, 49,173,147, 67, 59,172,130,220, 59, 94,202,134,113,106,189,191,111,174,190, 62, 59,125,245,243, 15, 95,
-125,249, 89,106, 94, 55,183,191, 13,205, 85, 24, 92,138, 28,103, 28, 60, 59, 47,123, 31,218,186, 27,154, 27,189,187, 56,254, 68,
-157,127,255,237,249, 55, 95, 92,252, 83,255,113,117, 13, 46, 94,150,128,229, 48,183,104,112,170,130, 89, 23,233, 4,176, 56,139,
-212,144, 41, 50,146,205,157, 28, 79,101,227,222,146,151, 13,210, 67, 38,216, 39, 59, 32,158,193, 35, 3, 7,197,166, 74,145,139,
-240, 40, 14,241, 91, 54, 98,162,226, 20, 69,195,122, 75,164,158,235, 79,228, 19,122,205, 2,227, 34,223, 94,242,218,215,144, 36,
- 18,178,127,203,170,129,174, 93,116, 32,204, 44,163,229,188, 31, 8, 73,173, 20,162,231,253,118, 40, 43, 72,138,146,248,172, 54,
- 15,174,235, 82,214,246,244,236,236,217,249,243,163,151, 47, 15,158,157,169,237, 97,171,205,135, 52,254,155,246, 55, 49,214,201,
-215, 57, 54, 25,129, 7, 17,229,125,120,131,146,144,109, 55, 9,210,143, 60, 93,103,215, 38,212, 80,253, 71,145,111,100,186, 91,
- 86,151,135,155,253,122, 3,109, 94,238, 30,154,201,177, 77,222,143,203,181,250,171,248,251,119, 95,243,194,160,223,103,144,210,
-130,203, 93,121, 68,105, 30,182,135,240, 3, 60,217, 5,111,230,213,183,115, 59,141,164,135, 36,151, 21,160,190, 81, 92, 54,134,
- 48,220,108,158,127,218,168,199,161,175, 57, 28,199,165, 5,168,253,166,249,207, 54,243,180,153,155,232, 41, 12,230,167, 45, 60,
-206,170, 74, 75, 80,141,204,150,251, 69, 65, 66, 69, 69,128,212, 3,141, 28,167,143, 73, 65,103, 34,157, 85,144,253,144, 47, 82,
-164,207, 89, 65, 10, 86,137,134,171,163,174,102,215,157, 50, 77, 40,146,239,156,124,178,177,195,248,235, 47,205, 59, 1, 73,119,
-119,163,107, 93,255, 48, 34,170,231,237,244,133,239, 11,182,206,240,189,106,154, 55,216,139, 33,115,141, 43,157, 16,232,222, 65,
- 0, 78,128,149, 82,226, 31,174, 53,163, 62,245, 96, 87,128,130,144,188,133, 67,241, 44, 93,226,155, 51,181,210, 90,208,255,214,
-217, 78,174,255,140,183,111,228,245,101, 81,183,105,216,170,124, 10, 2,181, 69,180, 75,232, 11, 0,124, 93,130, 2, 70,183,194,
- 7,143,244,210,234,162, 31,198, 93,116, 1, 82,117,213,137,251, 93,200,229,195, 38, 75,245,224, 18,187,208,237,132, 26, 81,181,
- 40,143,244,118, 88,159, 24, 41, 77,199,246,219,195,230,125,187,184,172,159,214,151,103,205, 69, 83,223,238,155,130,222,139,101,
-249,255, 16,130,159,242,113, 1, 70,100, 86,235, 10, 6,191,212, 21,168, 77,173,194,119, 47,158,126, 80,199,215,111, 46,109, 66,
- 65,194, 43, 81,176, 25,191,102,248, 49, 64, 45, 33,199, 85, 4,168,103, 36,253, 20,233,175, 77,219,228,176,209, 40,200,133,242,
-198, 20, 20,242,138, 60,101, 22, 26,130,239, 55,168,240,160,208, 58,175, 13,242, 32,200,208,136,229,241, 97,128,166,136,199,130,
-102, 81,118, 37,202,213, 35,156,224, 98,144, 7, 38,143, 0,110,161,215,171, 60, 65,234, 38,109,142, 22,126, 52,194, 23,214,139,
-112, 66, 52, 7,113,133,172,253, 65,228,238, 14,110,155,201,220,145, 59, 9,123,100, 74, 61,111, 5, 98,155,155,178,164, 11, 94,
-117, 20,196, 54, 68,137, 78,170,230,110, 8,132,207,130,201, 63,132,108,172,158, 70, 60, 2,161, 20,189, 41, 83,216, 10,187,167,
-225,145,171, 34,136, 79, 2,140, 1,109,121, 63,114, 98,100,237,233,230,139,128,119, 82, 4, 99, 1,234,220,192,142,100, 94, 6,
-104,154,229, 30,205,255, 4, 32,233,218,117, 35, 41,162,104, 87,117, 61,186,231, 97,108,150, 53,216,160,101, 3,200, 86, 4, 4,
- 43, 36, 18, 66,126,128, 4, 66, 68,136, 68,196,231, 17,146, 33, 17,172,240,106,133, 0,239, 2,246, 24,108,207, 78,119, 77, 87,
-215,147,115,134,112, 94, 82, 79, 87,213,185,231,220,190,247,220,246,155,111,191, 86, 57,227, 2, 1,231,224,159,244,111,104, 19,
- 0, 14,251,122,127,112, 60,215, 80,169, 49,142,144,119, 64,245,148,162,195, 9, 0,192,203,153,134,213,114, 0,235, 15, 9,210,
-118,104, 87, 59,136, 23,191,101,154,166,199, 55, 84, 11,178, 49, 1,194,103,198, 36,157,186,169,118,253, 82, 91,171, 1, 55, 61,
-111,235,178, 91,165, 28, 31,234,220,117,253,194, 86, 41, 27,162,187,210, 93, 55,151,149,137, 70, 31,201,218,119,158,179, 39,155,
- 15,207, 79,254, 77,229,134,105, 13, 49,183,180, 39, 97,113, 32, 15,110,249,223,255,249, 80,135,223,198,228,129,138,108,114, 97,
- 41, 36,203,105,150,135,134,171,189,238,233, 52, 95,238,183, 34,208,197,165,146, 89,158, 74,251,241,197,139, 11,177, 76, 14,114,
- 59,108,163,223,197,102,168,102, 7,182, 54, 65,116, 14,128,159, 60,186,125, 52,233,170,193, 7, 37,236, 92,145,206,203,192,126,
-213,185,161,229, 20,153, 78,200,182,138, 10, 46, 90, 23, 9,122,102,127, 55,140,231,239,157,125,255,221,151, 15,206,132,251,235,
-143,241,126,219, 36, 39,133, 5,164, 75,185,197,249, 1,235,145,197, 55,244,244,221, 85, 63, 78,187, 27,183,217, 88,247,251,233,
-147,245,231,159,125,180, 27,142,126,121,118, 73,158,204,113,217, 26, 82, 2, 60,126, 46,208,139,124, 16, 42,176,250,212,245,216,
- 35, 42, 97, 79,247,122,137,123, 0, 82,103,170,206,116,159, 82, 56, 21, 29,199, 20,172,101, 0,139,145, 10,171,130, 93, 81,140,
-225,115, 60,224, 2,200, 73,154,163,181, 21,210, 13,188, 6,242,178, 69, 44,129, 2,185,231,163,107,129,159, 4,206, 96, 71, 8,
- 10, 51,211,176,108,132, 3, 9,162,243,173, 70,104,231,140, 10,197,196, 23,174, 37,245,193,180,250,208,222, 89, 52,203, 96,167,
-228, 58,211,189,253,244,211, 39, 95,125,241,232,233, 39,171,119,223,191, 6, 97, 47,251,235,121,250, 51,115, 38, 31, 51,227, 2,
-234,189, 66,248,120,102, 98,216,136, 57,240,140, 51, 73,126, 48, 44,228,119, 2,179,214, 80, 5, 16, 69, 45, 68,131,203, 17, 49,
-120,211,201,235,227, 19, 27,203,177,219, 66,255,184,217,168, 7,233, 74, 60,127, 14,196,117, 74,184, 77, 22,219,178,104,185,248,
-180, 62,103, 90,129,174, 42, 80, 22,138,198,241,108, 20, 64, 8,239, 88, 96,197,164, 61,199,214, 42,126, 42,120, 88,194,241,227,
- 55,239, 78,207,117,252,135,111, 5, 14,231,102,125,150,132, 70,192, 13,129,200,192, 49, 92,149, 22,196, 10,103, 27, 11, 7,156,
-102,197,100,150, 44, 27,164, 72, 32,202, 67, 79, 81,139,179,227,169,118, 2,122,168, 38, 9, 20,198,249,225,172, 88, 90,192,200,
- 4,216, 81, 89,105,240, 79,203,230, 44,214, 80, 85,191, 16,234,244, 52, 94,164,159,126,184,187, 45,123,214, 11, 36, 78,123, 76,
- 96, 92,101,239,105, 51,222,206,136,167, 12, 35,144,148,180,107, 27, 56, 81,182,208, 91, 68,204,145,205,134,146, 30,221,197,234,
-130, 80, 23, 3, 51,208,100, 70,224, 74, 80,199,224,104, 22, 47,164,181, 38,132, 24,118,121, 49, 2, 62,234,125,144, 96,116,173,
-218,136,179, 95,227,250, 89,251,242,231,242,250, 50, 93,223,136,171, 44,124, 87,253, 10,108, 84, 56,219,140,208, 74, 18, 88,234,
-189,171, 97,114, 65,142,160,168,105, 78,187,223, 58,113, 43,110,249,232, 35, 45,109,219,211,170,252, 92,245,118,217,155,229,156,
-215, 43,209,159,236,119,177,190,184, 61,121,185, 89,255,253,234,145,190,220,206,183,119, 67, 30,217, 54,204,217,107, 51,254,168,
-140, 11, 41, 33,102,200, 68, 14, 51,103, 16,156,223, 50,216,181, 8,191,201,173,211, 7, 15,251,245,227,119,126,124, 21, 92, 51,
- 73, 64,208, 80,233,247, 66, 3,237, 12, 29,175, 59,200, 56,223,184, 73, 1, 97,173, 42,138, 30, 14, 88, 27,213,183,156,190,162,
-109,171,251, 16,203, 27,107, 86,173, 2, 61,177, 86,253,186,231, 84, 21,220,139,195, 48,115, 68,128,110, 37,187, 85, 38,197, 21,
-203, 21,159, 48,202, 30,193, 24, 8,104,193, 80,141,102, 61,148,112, 71,133,163,215,253, 94,129, 99, 65,209, 47, 16,108, 68, 56,
- 56, 89, 73, 26, 11,134,156,122, 14,233, 13, 80, 78,224, 24, 59, 85,141, 7,171,141, 91, 67,101, 34,177,192, 44, 49,171,208, 30,
- 29,235, 94,129, 5,211,136,191,168,219, 9, 26, 58,122,165, 16,192,171, 89,146,221, 43,173,141,241,121,108, 23,205, 17,139,209,
- 83, 64, 88,135,132,199,134,245,179, 53,109,201, 33,100, 92,217,248,122,223,122, 48,230, 69,200, 67, 57, 50,243, 34,168,145,186,
-180, 52,128, 84,132,124, 51, 37,255,159, 0, 28, 93,201,142, 36, 53, 20, 76,111,105,231, 82,213,221,211, 52,219,104, 70, 8, 14,
-112, 1, 33, 46,220,224,134,184, 32,110,124, 10,226,135, 16,255,192,157, 19, 18,220,184, 32, 4,195, 52, 67,111, 84, 85, 87,110,
-118,218,153, 38,162,164, 58,165, 84,155,159, 29, 47,194,126, 47,172,227, 50,225,145, 15, 9,164,223, 67,160, 68,164,224,128,113,
-198,218,200,200,146,138,142, 62,179, 62,206,108,189, 18,144, 45,143,221,146,106,144, 0,147,124,182,211, 36,204,200, 51,171, 48,
- 47,125,215,184,176, 64, 14, 97, 90,238, 26,169,150,163,149,219,106, 83,170, 48, 5,179, 90, 5,130, 56, 89,137,180, 80, 42,235,
-195, 33,173,162, 51,221,186,230,174,124, 77,108, 32,192, 0, 76,213, 70,173, 96, 52, 72,181,103,190,209, 53,195, 81,216,237,166,
- 44, 94,197,249,253,221,243,118,123,215,205, 93, 81,108, 23, 5,121,142, 87, 77, 33,158, 71,188, 85,178,143, 48,230,145, 53, 3,
- 4, 11, 90,218, 27, 21,183, 5, 11,213,143, 90, 47, 72, 6,243,116,175,128,170,153,189, 70,146, 61,147, 14,127, 47, 44, 15,234,
-209,121, 58,167, 33,247,173, 1, 92,237, 31,228, 30, 17, 91, 68, 50,148,126, 26,114,163, 31, 2, 52,224,133,193, 58,140,121,199,
- 59, 10, 45,190, 87, 97,101, 79, 75, 80, 32, 57, 16, 67,251,191, 33, 21,206,120, 16,223,170,226,152,190,249,234,211,246,242,250,
-240,199,203,121,166, 79,173, 92, 39,161, 1,100, 71,238,232,209,129,222, 33,249,112, 51, 36,159,210, 53,184,176, 81, 93,223,187,
-223,127,169,223,251,232,219,239, 62, 7, 84,124,255,195,143,117,179, 56, 64, 52,203,145,148,211,134,190, 88,192,212, 86,176,233,
- 64, 72, 16, 53, 60, 31,199, 16,218, 44,181,168, 39,195,122,151,198, 97,169,148,126,158, 93,205,126, 14,176, 86,139,233,144, 86,
-222, 50,165, 33,239, 7,182, 59,217,197, 33, 96,188, 28, 24,242, 3, 90, 96,158,145, 33, 87, 44, 82,103, 79, 13,172,224,166,160,
- 98, 60, 54, 90,199,132,201, 6,126, 14, 56, 60,213, 35, 77,192,122,214,141,226, 87,159,105,177,178,191, 20,160, 51, 1, 90,110,
-124,213,234,119,190,254,236,221, 47,190, 92,171, 43,128,245,159,224,187,179,191,205,116,105,247,220,106,207, 45,242, 28, 75,158,
- 22, 87,240,157, 61, 97,184, 56,221, 68,154,154,147,125, 33, 45,184,132, 64,140,232,248,150,105,210,152,217, 99,195, 94, 63,132,
-213, 71,105, 76, 28,159, 63,125, 22,211, 7,251,155, 42, 97,198,130,131, 53, 54,221, 38,189, 43, 26, 93,120, 83, 12,129, 26,159,
-255,157,214, 73, 60, 86, 5,133, 87, 19, 49,157, 71,251,150, 91,240, 52, 75, 4, 51,167, 57, 75, 81, 74,145,207,242, 88,231,241,
- 56,171, 1,138,167,147,220,246,131, 10,180,139,105, 38, 3,132,136, 82, 91,122,155,200,131,197,248,137,149,215,135,173,169, 84,
-183, 82,150, 52,229, 43, 28,233,214, 2,218, 43,161,177,140,230, 21,143,188,134, 55, 66,153, 15, 57,103, 23,109, 46, 49,245, 87,
-222, 37, 2, 81, 12, 58,143,197,164,217, 74, 23,185,141,218,103,150,172,102,113,184,129, 30,246, 94,113,127,145,183,240, 20, 97,
- 15,142,170,232,237,110,242, 36,243, 52,233,102, 98, 95, 33,210,193,144,101, 57,167, 26, 26,150,242,248, 84, 38, 35, 32,174,139,
-110, 22,109, 8,169, 81, 13,123, 53, 12, 79, 79, 64, 39,226,201,165, 1,124,214, 45,238, 74,239, 94,196, 27,191, 88, 58,162,231,
-235, 59,100,138,178,218, 45,246,237,251,237,246,174,126,242, 91, 28, 46, 98,168,203,125,171,210,235,126,189, 28,194,211,168,240,
-145, 27,175,139,209,111,150,148, 38, 33,250,112,113, 24,236,190,127,235, 28,129, 86, 87,236,234, 31,166,121, 62, 31, 65, 30,221,
-120,184,135,244, 82, 98, 0, 7,188,126,115,254,119,189,187,235,237,225, 62, 47,175,246, 43, 45,108,131,180, 9, 19, 57,181, 88,
- 43,208, 36,116,129,194,184,216, 81, 71,250, 96,178,200,179,248,207, 84, 78,206,243,163,212,127,165, 23, 63, 93,127,252,225,179,
- 79,158, 61,249,249, 87, 47, 43,150, 31, 0, 18,145,237, 7,214,173,104, 12, 50, 35, 83,210,157, 60,170, 76, 71,218, 84, 67,226,
-152, 30, 51,223, 74,231, 75,160, 66, 37,163,171, 20,168,183, 98, 33,157, 11,114,216, 0, 32, 17, 93, 37,149,101,255,221, 26,211,
-114, 89, 66,134,212, 69, 57,130, 86,138,237, 70, 61, 32,196,189, 46, 54, 86,176, 79, 73, 48, 21,212, 38,215,111, 96, 4,250, 46,
-150, 12,247,250,104,212, 89,157,163, 23,157, 84, 85,227,153,114, 11,200, 94, 64, 60,171,185,242,140, 76,157,233, 28, 23, 65,119,
- 69,199, 93, 65,163,124,194,108,146,210,110,244, 57,126, 38,150,162,151,123,103,202,214, 86, 29,248, 23, 84,223, 73,142, 95, 4,
-127, 89,186,225, 65, 15, 13,100, 9, 4,164, 48,107, 60,117,233,108,163,137, 13,141,232, 16, 80,172,190,232,202,149,213,175, 62,
-173,147, 70, 38,209, 14, 60,198,120,233,138,195, 40,106,251,191, 0, 28, 93,201,110,229, 68, 20,173,201,179,223,144,134, 4,130,
-154, 64,139, 5, 2, 53, 18,136, 47, 64, 98,199,143,176,227, 35,179, 67, 98,193,176, 1,169, 37,212, 10, 77,120,157,126,163, 93,
-101,215, 96,115,142,179,203, 32,231,185,124,235,220,115,174,235,158,107,132,139, 29,216, 20, 2, 42,140,158,149,117,118,233,123,
-217,135, 0,124,159,113, 93,228,107, 72,130,112, 22, 86, 92, 74, 54,233, 35, 11, 69,113,216, 7,168,158,208, 99,211,197, 60, 7,
-139,243, 32,138, 32, 75, 78,180,194, 28,217,123,233, 54, 66,174,154,232, 99,206,169,230, 90,157,114,133, 11, 5, 89, 95, 55, 53,
-242,201,203, 15,159,111,174,205,233, 12,160, 40,206, 49,238,221,219,106, 21,166,182,169, 57, 49,174, 98, 37, 83, 68,201,190, 79,
-164, 87, 97, 83,248,251,244,241,203,226, 47, 99, 78,193,205,204,146, 90, 47, 38,189, 3, 11,249, 26,248, 85,205, 68, 8,167, 77,
-193,179,157,130,227, 15,133,177, 52, 95,132,214, 67,190,188,188, 83,151, 97,134, 36,204, 57, 79, 30, 57, 40, 43,111,254,221,157,
-196,249,105,148,107, 48, 54, 64,130, 67,108,100,200,165,150,138, 96,144, 26, 34,200,247,200,100, 3, 13, 11,167, 71,144, 12,108,
-122,163,186,114, 94,143,110, 62,121, 5,238,128,125,239,139, 43, 21,159,158,169,173, 60,131,191, 62, 60,216,103,237,245,183, 95,
-223,134, 55,247, 41,112, 72, 40,105,202,164,192, 3,104,218, 31,122,128, 38,189,159,130,199, 13, 78,122,169, 20, 20,144,249,244,
- 35,183,151, 60,253,254,199,234, 75,247,211,143, 95, 60,188,250,239,254,231, 95,161, 46, 83, 93, 19,167, 34, 30, 27,100, 30,243,
- 67,160,227,194, 8, 32, 0,113, 6, 47,161, 83,181, 38,201, 71,128,219, 12,219, 99,170, 50, 93, 52, 0,185,185,164,147,162, 84,
- 45,187, 97, 64,119,124, 16, 69,114,245,202,211, 79, 26, 64, 7, 77, 85,128, 89,226, 86,217,113,170, 38,245,120, 82, 88,255, 70,
-177, 3, 35, 2,124,248,182, 35,112, 58, 60,109,122, 35, 64,250,170,138,138,141,165,120, 4,236, 10, 0,206, 7,215, 31,157,186,
-253,232,243,239,190,186,251,254,135,242,230, 14, 32,246, 52, 15, 7,111, 89,155,150, 28,105,169, 23, 61, 5, 0,179,132, 24, 3,
-229, 25, 17,154, 75,201, 8,183,179,184, 71,168, 78,152,101,236, 4,128, 25, 11,211, 69,190, 81, 6, 27,118, 41,117,244,247, 84,
- 23,195,227, 80, 55,117,106, 95,235, 23,187, 23,119,101,247,207, 29, 46,147,175, 75,154,114,148,135,180,166, 18,200, 21,201,210,
- 25, 32, 80,177,240, 98,217,248,203,142, 81,186,203, 7,129, 76, 27, 37, 29,105,202,121,177,147,147,203, 36,139,192, 51, 54,117,
- 79, 97,132,187,218,251,172,194, 94, 5,212,132, 49,141,174, 24, 42, 72, 28, 91,204,224, 89,114,214,163, 98,181, 88,120,154,239,
- 21,147,199, 99, 19,156, 55, 77,203, 65,203, 14, 59,205,195,238,115,206,178,218,184, 83,154,181,104, 34, 52, 39, 42,177,111,138,
- 39,213, 69, 70,219,168, 52,241, 43, 94, 2,143,228,209,143,151, 71,232,179, 45, 66,202,100,200,150,128, 75,132,142,222,220,136,
-139, 53, 30,210,242, 24,187, 12,105,155,246,221,166, 86,197,176, 12,156, 2, 83,135,192,206,216,224, 55,141,210,142,198, 64,237,
-148,148,253, 62,105, 48, 3, 64,197,212,209, 17,194, 23,162,230,156, 98,227,114,179,205, 82,124,223, 68, 7, 2,137,128,146,243,
-216,237,210,122, 13,204, 9,250,152,241,136,146, 8, 59,197,147, 61,136,173,223,212,140, 45,196,195,124, 69,182, 89,198, 9,222,
-206,102,200,223,181,235,195,246, 19,125,126,194,223, 62,226,225,110,192,168, 50,177, 63,122, 53,218, 57,151,111, 65,237,134,139,
- 7,167,182, 7,247, 70, 77,172, 2,247, 88,181,106,113,107, 23,101,169,241, 89,102,153, 14,216,200,146,212, 36,227, 57, 85,142,
-188, 93,198, 39, 74, 44,246, 32, 65,139,161,128,234, 52,216, 87, 15,251,207,254,124,253,233,243,111,238,127, 1,193,228,177, 45,
-132, 5, 57, 53,254, 51,196, 47,242,156, 97,191, 14,178, 4,126,216,140, 68,212,177, 81,149,176,114, 27,251,139, 73, 53,136, 34,
- 93, 91, 40,247,171, 78,235,102, 66,130, 73,141, 76,178, 41, 60,126, 71, 35, 14,144,148,153, 77,100,208,170,231,171, 82,246, 16,
- 75, 88,110,168, 53,250,135, 8,107, 43,160,171, 94,101,209,169, 26,220, 25, 97,154,185,182,221,248,211, 74,100, 77, 24, 60,240,
-191,140,200, 85,189, 2,241,210, 61, 2, 65, 34, 19, 37,250, 52,169, 50, 49, 14,124, 94,138,118, 94,222, 1, 73, 14, 95, 73,197,
-180,136, 73,214, 69, 20,205,224,161,169, 13,187, 54, 39,214,250, 90,208, 17, 9, 86, 0, 24, 61, 25,201, 23, 32, 88, 51, 8,181,
-144, 23,149,178,248,222,225,137, 14,231,106,197, 17,193, 86, 0,188, 63, 40, 16, 98, 49, 28, 75,100,168, 36, 93,124, 47,167, 3,
-118, 55,164,255, 5,224,232, 90,118,221,182,161, 32, 69,138, 18,101, 73,118,156, 71,131,220, 32,187, 0,217,220, 2, 45,208, 7,
-208, 69,247,237, 31,116,217, 85, 63,160, 64, 87,253,193,126, 65,209,162, 64, 17,220, 38, 23,185, 47,251, 90, 15,138,226,171, 51,
-222, 25, 94,216,146, 72,157, 51, 67, 14,103, 24, 85,233,241,133, 46, 30,103,209,136,120,222, 43,149, 77, 41,193,134,130,141, 97,
- 94,175,198,216,200,206,131, 18, 75, 0,131, 97, 18,209, 77,138, 39,217,208,106,134, 85,117,197,116, 59, 21, 26,104,238,144,226,
-110, 54, 92, 36,110,184, 87, 68, 73,145,166, 26, 89,197,125,155,230, 81,120,251,178,238,190,249,226,242,219, 47, 47,182,207,140,
- 16,237, 89, 53, 49,158,195, 98,138,235,235,227,251,219,229,207,143,135,213, 58, 32, 84,219,182, 59,134, 72,111, 86,198, 24,216,
-207, 84,186, 87,251,171,195, 87,111, 94, 29, 99, 30, 75,187,160, 79,113,135,156,222,201, 26,240, 70, 49,122,181, 90, 13, 21,192,
- 92, 60,117, 84,224,227, 31,153,132, 12,146, 59, 62,210,125,170,208, 21, 13, 19, 83,161,193,227,246,162,189,248,231,239,255,150,
-136,203, 12,190,153,152,217,128,145, 31,238,178,209, 15,105,213, 0, 32,131,156,113,133,213,236, 65, 37,215,130,238,179, 7, 85,
-212,139,158, 64,215,132, 51, 57, 0, 56, 88,208,123,180, 31, 93,182, 9,236, 97, 9,202, 47,242,187,239, 47, 69, 61,141,247, 87,
- 50,188,200,210,170, 30,252, 14,124,121,140, 74, 19,184, 85, 35,240, 79, 84, 67,230,169,143,174,164,179,126, 77, 69, 93, 49,209,
-118, 19,244,255,253,149,121,251,252,247,223,126,252,233,231,143, 1,156,131,197, 16,119,187, 40, 38, 4,102,176,175,202,165,166,
-207,161, 1, 51,165,215,247,217, 54, 4, 60,140,226, 33, 80,173, 54, 11,186,213,143,140, 60,119, 52,145, 40, 58,220,241,172, 14,
- 91, 70,175,246,161,102,175,103, 54,123,234,211, 98,164, 87,186,116, 39,197, 67, 76,139,216, 74, 58,156, 88,229,125,207,120,139,
- 74,212, 11,192,121,189,172, 81, 60,221,128,136,229, 21,220,213,128,198,134, 14, 23,226,189,171, 49, 75,187,119,111, 63,255,229,
-215,119, 23,175,102, 33,174,132, 69,147, 59, 80,219,132, 57, 73, 91, 58,195,228, 8,148,239, 88, 49, 88, 3, 52, 41, 80, 38, 32,
- 80,117, 24, 37,187,208,177, 88,209, 38,165, 12,228, 14, 0,228,106,194,124,119,121,100,148,149,119, 9,109, 41,160,195, 14,220,
-108,136,115,210, 79,100,109,135,205,215,255,238,222,188,190,249,107, 73,251,125,221, 3, 45,129, 56,243, 87, 45, 26, 33,195,224,
- 8,216,209,141, 76, 66, 63,163,189, 76,212,212,137,154,115,138, 83,125,110,150,204,161, 42,169, 72, 21,142, 22, 52, 92,234,211,
-199, 77,127,115,115,239, 93,112,231,232,168,145,254,111,197,100, 50,181, 41, 30, 32, 15,195,144, 14, 52, 8,108,155,202, 99, 60,
-128,178, 53, 64,180,143,160,236, 69,179,161,109, 9,143,103, 37, 30, 29,165, 88, 20, 20, 30,183, 12, 62,170, 50,133,233, 5,109,
-251,184,194, 89,214,140, 93,198, 7,198, 67,233, 82, 56, 27,146, 41, 70,177,221, 71,112, 60,116,181,192,124,208, 21,244,132,105,
- 30, 85,108,101,175,114,151,130, 43,162, 63, 90,160, 13,123, 86, 50, 97,252,167,129,158,225, 70, 38, 58, 1, 2,185,212,229,170,
-121, 20,140, 58,181, 83, 17,159,199, 39,231,200, 26, 38,116, 7,158,135, 44,241,164, 6, 46, 86, 8, 83, 29, 65,172,116,122,221,
- 84,215,159,194,112, 19,230,105,211,239,154, 71,103,227,138,114,187, 50, 6,238,129,135,204, 64, 24, 76, 28, 44, 48,243,234, 85,
-184,142,193,102,148, 63, 31, 91, 0, 68, 16,184,199, 28, 80, 0,143,116,171,115,152,135, 94, 45,182, 72,186,136, 75, 89,237, 36,
-133, 15,204, 25,170,118,220, 83,137,214,161,184, 71, 63,157,147,102,185,245,129, 55, 31,243, 97,181, 58,110, 75,154,167,112,241,
- 78,119,117, 29, 27,239,178, 64, 81, 76,250, 33,158,238,253,135, 63,238, 46,127,136, 23, 79,219,187,187, 7,197,121,131,159,245,
-229, 9, 36,156,240, 87,219,218, 30, 67,177, 99, 36, 67,105,227,252, 44,147,203, 75, 99,154, 54, 47,204,136,161,214, 5,232,215,
- 55,141,222,131,189,249,186,218, 43,121,144,211, 82,117, 52, 24, 70,241,211, 96, 59,210, 72,101,137,212,233, 73,166,103,225, 27,
-224,164,118,155,231,177,111, 83,104,129, 78,153,248, 38,229, 70,246,155,151,168, 50, 46, 13,147, 54, 47, 30,114,209,152, 83,149,
- 26,167, 10,131,158,179,184,102,206, 77, 89,172,189, 7,100,109,171,122,106, 0,162,234, 91,189,203,226, 67,165,208,236, 81,131,
-130, 25,204,140, 26,222, 13, 38,108,104, 52,204, 8, 69, 58,162,108, 83,255,201,214, 53,158,163,154,171,104,103, 52, 11, 84,207,
-154, 1,102,120,133,208,251,105,243,113,114,162,174, 22, 93, 41,215,100,180, 28, 63, 48,132,144, 2, 43,154, 92,138,174,161, 55,
- 64,144, 12,217,245,167,255, 5, 32,233, 90,118, 36,167,161,168,227,216,142, 19,215,107,170, 97, 52, 5,172,160, 17,210, 72, 32,
- 88, 12,136, 13,136,245, 72,172, 89,177,225,135,248, 1,126,128, 21, 63,192, 31,208, 27, 16, 59,164, 97, 52, 18, 51, 76,215,116,
-119, 85, 37,149, 56,126,113, 78,179,232, 77,171,165,142,147,235,123,207,177,239, 61, 7,121,161, 47, 41, 60,224,129,144,146, 43,
- 31,120,117,165,243,208, 29,226, 64,107,152,132, 69, 49,107, 85,213,221,121,180,131, 36, 76,162,216,117, 1,235, 59,238,115,191,
- 18,109,181,230, 61, 30,160, 72, 29,146,109, 13,157, 10,216, 87,228, 84, 90,205,168,162,141,188,243,242, 34,111,191,249, 98,247,
-228,179,247,183,111,225,155,254,155,250,235,137,178,216,164,222,186, 90, 40,179,218,237, 54,187,221,197, 39, 31,110,255,124,118,
-251,242,239, 51,199,231,151, 10, 92,151,254,109,248,234,216, 74, 74,188, 24, 63, 94,222, 92, 47,220,213,208, 1, 67,177, 42, 35,
- 53, 83,253,151,216, 16,208,198, 87,158,122, 37,153,195, 17,216,241,129,134,180,115,153,167,125, 57,141,153,134, 14, 85,218, 84,
-168,211, 18,207,250, 54,118,200,163,195,171, 43,127, 58,216,169,213, 39, 21, 8,142,198,113,146,117,177, 32, 95,211, 60, 35,141,
- 81, 74, 48,148,118,166, 41,195,132,236,109, 56, 2,118,174,242, 93, 27,212,208,214, 85, 40, 35, 94, 87,190,177, 34,239,117,155,
-146, 6, 80, 92,199,199,159,183, 66,252,142, 56,212, 72,171,156,195, 0, 10, 0,238, 17,165,201,168,164,148,151,150, 38,229,142,
-128, 69,229,128, 28, 48,130,129,117, 84,200,193,146,172, 60,159,222, 84, 47,127,123,248,209,183,223,127,247,245,143, 63,253,108,
-115,108,145,130,231,218,228, 88,107,221,139,188,168,193,127,105,158, 76,137,220,133,232, 50,150,155,238,155,167, 56,173,195, 86,
-121,106,151, 86, 86, 0,164, 83,115, 9,233,130,115,231, 41, 26,144, 67,167,122,228, 35, 45,218,137,118,247, 41,242,150,130,238,
-174,116, 7, 51, 29,144,189,114,116,235, 74, 50,140,116,117,201,182,180,185, 70,110, 5, 22, 6, 38, 65,181, 4,131,201, 58,147,
-237,188, 74, 15, 47, 63,120,250,195,229, 87, 79, 68,109,175,144,166,230,193,211,232, 8,101,145, 46, 43,236, 43,161,172, 23, 85,
-211,217, 85,196, 75, 65, 32,122,150, 92,117,175, 33,100,216,218, 58,123, 37, 57,221,149,135, 1,117, 18,197, 88,220,196, 8,174,
-207,155, 13, 17, 7,154, 22, 82,134,134,208, 45,137,195,113, 28,164, 61, 52,221,123,255,172, 55,215,217,164,107,191,123,199, 3,
-150, 36,236, 17,102,112,201,203, 65, 42,236, 69,158,162, 11,150, 97,113, 47, 69,196, 95, 58,207, 3, 46,142, 7, 6,182,211,180,
-168,125, 70,248,255, 13,139,240,200,195,178,228, 5,138, 4, 13, 38, 53,229, 96, 93, 25, 19,152, 77, 4,135, 7, 97, 4, 58,198,
-218,218,236, 18, 43, 27, 86, 57, 1,190,227,175, 29,160,133,172,206, 28, 66, 10, 36,128,236, 51,165,247,153, 47,236,165, 50,130,
-237,202, 17, 5, 56, 38, 53,226,189, 2, 19, 6,228,238, 41,211,202,105,131,168,224,241,145,160,157,242,201,109,226,131,174, 12,
- 71, 69,189,106,133,148, 60, 3,244,166, 12, 48, 73,241,168,166,241,174,152,186,142,163, 63,207,193,204,188,157,168,182,197,155,
-162,143, 53, 37,161, 17, 31, 99, 89, 78,226, 14, 43, 69,236, 53,165, 12,114,194,171,179,197, 32,160, 27,228,255, 58,147,188, 98,
-103, 36, 74,141,174,117,216,207,211, 90,188,123, 41,230,155,249,143,191,228,235,219,188,186,144,174,169,155,108, 42, 71, 19,168,
-249,156, 60, 50,226,113,123,110, 42,124, 92, 4, 82, 76,155, 48,132, 25, 81, 51, 85,189,198, 67,170,142, 35,107,170, 94,130,111,
-100,144,103,119,160,184, 53,126,202,189,209,163, 5, 43,173, 35,222,161,164,169, 66,110, 85,237,109, 86, 3,235,160, 83,121, 68,
-102, 41,146,125,163,188,122,177, 88, 4, 18, 77, 67,187, 90,122, 79,162,132, 1,254, 13,251,240,236,197,155,167,234,249,151,159,
-174,127,249, 53,106,128, 93,224,164,148, 22, 9,255, 69,205,167,174,169, 43,208,249,133, 14,125, 67,113, 37,158,246,112, 70,102,
- 35,111,138,118,149,193, 54,169,180,117,165, 5,223,108,228,212, 28,214, 98,149,152, 66, 1,201, 86,216, 28,113, 83,115, 4, 38,
-225,221,218, 71,141,161,144,108,227, 98,177, 29,123, 43,145, 53, 22,154, 51,111,217, 90,225,207,218,130,140, 35,196, 14,180,228,
-186, 21,173,229,237,153,214,101, 75,175,123,123,162, 47, 23, 59,100,129, 44,100, 76, 0,117, 46, 45,122, 49, 98, 83, 79,214,246,
- 42,230,216, 35, 25,244,153,167,171, 40,150, 33,208,125,171,112, 10,194, 73,154, 13, 8,198,109,103, 38, 3,192, 35,173, 0,125,
-241, 83,139,192,221, 30,197, 57,182, 17, 79,107,163, 68,173, 13, 0, 3,161,163,118, 25,232,160, 22,203, 70,101, 36,223,218, 53,
-203, 64,141,119,196,211, 9, 28,209,159, 16,245,255, 9,192,209,181,236,202, 81, 67, 65,219,109,247,115,110,195, 37,132, 92, 37,
- 74, 34,193, 6, 69, 32,144, 34,238,130, 13, 18, 44, 97, 31, 33,126,128,111,100,197, 50, 72,217, 32,193,130, 13,130, 16,114, 65,
- 40,119, 30,221,110,183,159, 77,213,108, 71,163,153,110, 63,206,169,178,207,169,170,158,125,255,205,116,192,140,187,201,211,150,
-212,159,108,198,234, 91,188,197,191,219, 76,119, 33,112, 92,240,135, 61, 8,179, 99,129,197,186,108,121,102,237,153,207, 41,128,
- 33, 70,236,117,185,199, 48,118,186,117,107,187, 25,213, 52, 3, 94, 96, 75,109, 93, 53, 83, 22,250,113,255,240,187,175,222,191,
-126,138,140,248,231,233,246,215,249,248,210,187,215,180,141,144, 71, 65,137,139,218,165,255, 82, 58,138,112,232,218,195,131,247,
-234, 59,227,149, 5,121, 72,125,200,174, 3,127, 69,114,146, 29,253,218,218,232,227,227,206, 79, 23,122, 47,140, 77,133, 46, 53,
- 27, 21,241, 49, 61, 6, 24, 8, 89, 78, 10,163,148, 7, 59, 85, 90,165,105, 14,199,169,100, 48,235,134,135,152,137, 7,109, 98,
-112,132,113,151,247,219,221,199, 47,158, 63,199,120, 91,153, 98,216,162, 10, 1,201, 98,138,171,141, 44, 36,198,216, 55,121, 93,
-253, 52, 99,109,102,106, 6, 6,215, 32,240, 88, 0,141,228, 45,160, 37, 40,150,162,197,173,143, 35,213,114, 91, 57,248, 98,195,
-116, 27,191,254,242,211,203,139, 95,150,191,193,204, 2,118, 49, 5, 6, 36,143,189,184,165,169, 19,178,178,147,142,106, 10,137,
- 34,245, 96,201,241,108,249,200, 67, 23, 70, 4,134,237,124,106,238,214, 31,125,248,197,143, 63,252,188,236, 39, 76, 36, 24, 19,
-171, 99, 42, 61, 45,101, 48,216,244,231, 19,120, 89,176,225,103, 4, 4, 19, 90, 83, 70,201,227, 30, 26,191, 32,116, 35, 77,117,
- 32,243,162, 86,224,215,122,217,182,139,254,108, 93,125, 96,229, 12, 85, 53,125, 8,148, 89, 65,230, 64, 80,166, 70, 47,133, 31,
-144, 40,250,205, 31,120,233,130,248,154, 53,143,215,253,200,135,166,166, 28, 64, 46, 98,182,243,206, 3, 80, 92,125,242,249,245,
-179,111,239,126,118,221, 40,125,147, 14,183, 33,120,218,254, 84,120, 71,236,101, 16,135,115, 67, 25, 63, 18,108,246,161,221,125,
- 60, 75,247,158, 13,225,214,152,169,220, 25, 41, 62,157,248, 28,219,190, 84, 72,195, 54,249, 57, 22, 91,194,105,203,248,206,191,
- 5, 28, 37,184, 42, 88,182,122,148,147, 68, 72, 64, 82,234,251,109,248,224,225,155, 87,192, 47,205, 59,246,197,180, 63,170,181,
-158, 67, 89,121, 84, 41, 35,245, 19,197,102,120,211,196,107,207,116,110,105, 21,103,163, 62,106, 13, 51,226, 99, 57,140,130,151,
-184, 82,139, 1, 60,185, 23,227,213, 61,241,228,222,205,235,191,128, 37,120,197,146,149,157,193, 36,204,214, 44, 33,199,214, 35,
-191, 78, 41, 90, 32,101,132, 73,140,116,201,180, 61, 9,221, 76,205,222,116,150, 45, 43,141, 48, 9,104,168, 42,129,103, 36,180,
-108,103,170,100, 61,215,170, 24, 95, 17,245,216,234,175,130, 89, 57,180, 96, 93,180, 4,167,172, 63,126,100,219, 61,232,167, 87,
-225,247,223, 92,164, 59,156,158,241,232,141, 97,110,195, 51, 35,176,226, 1,170,122,192, 14,199,204,107,204,157, 7, 14,100,227,
-245,166, 71,133, 55, 70, 54, 62,139, 45,179,196, 4,128,130,202,217,172,244, 71, 14, 66, 16, 6, 1, 21,213, 76,207,228, 66,253,
-251,178, 38,122, 12,212, 96, 92, 70, 73,167,135, 62, 63,186,100,139,210,205, 27,241,143, 83, 11,200, 83,150, 39, 71,127, 19,103,
- 17, 3,168,188,159, 68, 83,188,105,119,157,161,124,116, 51, 40,181, 27, 85,175,181,111,163,120, 11,204,201, 24,203, 51, 7, 80,
-152, 36, 13, 29,216,138, 88, 11, 11,136,204, 69, 26,216, 38,171,144, 30, 42,222,174,232,218, 43,222, 87, 11,217, 84, 38, 6, 96,
- 78,112, 0,196, 34, 42,227,175, 77,212,172,130, 7, 94, 43,189,174,221,230,219, 9, 32, 49,220,127, 36,212,147,167, 63,253,225,
-177,251,216,110, 43, 10,120,151,239, 75, 87,148,109,157,108,117,197,172,108, 88,252, 74,113,176,186,239,180,121,215,167,183, 29,
- 86, 39, 82,126,224,145,147,236,105, 85,220, 20,172,168, 49, 85, 32, 31, 1, 44,213,230,150, 23,136,148, 9,224, 21, 69,146, 14,
-179,142,209, 90, 8, 59,122,106,174,175,185,168,150, 22,120, 18,251,212,244, 78, 98,171,116,153,240,147,197,132,128, 27,227, 80,
-111,170,190,227, 98,219, 75, 95,151,224,134,208,181, 30, 63, 32,143,106,192,232,247, 5,195,105, 53,192, 65, 6, 94, 26, 91, 18,
-177,205, 32,226, 94, 20, 29, 53, 18,165,212, 43, 18, 38,255,111,246,107, 3,146,207,186, 3,121, 68,104,220, 1,114,119,193, 75,
-103,186,195,224,204,138,215,112, 90,154,220, 83,193, 8,176,165, 98,223,126, 1,164, 94, 22,141, 85, 86,213,129,101,218,128, 80,
-120, 61, 48,102,163,255, 23,128,163,107,217,145,163,134,162,126,148,221,174,170,174,153, 78, 38, 19,134, 32, 36, 64, 40, 74, 36,
-248,134,176,101,135,178,138,216,176,226, 75, 89, 32, 30,155,132, 77,178, 0,196, 34, 17, 35,146,153,233,174,151, 93,182,203,156,
- 83,203,110,117,119,117,185,238,227, 92,251,222,115,244,243,239, 95, 32,106,174,118, 54,147,241,203, 52,121, 78, 5,247,195,201,
-151,211,122, 51,203, 52,247,121,138,126, 48, 19,249, 91,166,187,113,224,248,193, 90, 33, 41,113,167, 35,193, 78,185, 44, 7, 41,
- 47,180, 44, 93,187,183,173, 61,116, 28, 45,175,242,131, 54,247,238, 99,245,248,197, 51,241,249,211,215,199,127,127,237,223,191,
-207, 84,238, 0, 22, 58,103, 59, 30,150,145,238,102,229, 58, 2, 87,179, 33, 49,144,153,232,236,188,121,212, 68,159,246,183, 11,
-162,210,202,199, 53, 75,206,249,170, 62,187, 67,191,126,102,199,235, 70,189,150, 5,209,105, 71, 46,170,109, 64, 69,201,209, 24,
- 47, 45, 34,233,170, 80, 43,250, 33,133,155,237, 16,194,166, 30, 43,122,228, 16,142, 95,216, 71,136, 96, 88, 95,228,238,171,159,
-126,121,213,245, 28,114,203, 33, 76,112,150,137,210,196, 64,174,114,152,189, 84,243, 76, 69, 33, 4,115,175,241,116,162,156, 85,
-226, 73,150,100,183, 96, 14,168,192,202,237, 20, 13, 82, 65, 43,169, 90,110,125,206,140, 8,171,251,246,155, 47,186,123,111, 98,
- 15,139,106,201,104, 27, 5, 45, 87, 81,197, 71,199, 93,148, 60,167,103, 79,251, 66, 70, 55, 56, 88,113,248, 76,222, 38, 16, 87,
-193, 62,162, 21, 0, 83,249,201, 94,125,253,199,203,255,126,251,253,175,189,106, 81, 58,144, 28,176, 48,126,242, 52,121,163,228,
-111, 40, 4,164,241,155, 45,162,135,212, 88, 9,103, 21, 27,182, 91, 89,175,212,143, 44, 35, 55,186,125, 91,167,106,235,176,201,
- 21,114, 11, 16, 2,208, 64,217, 75, 18, 99,228,228, 34, 37, 74, 72,170, 67,225, 62,164,202, 53, 44, 64,124,154,188, 36, 13,195,
-226,140,188,178, 56,128,186,115,145,251, 49,204,209,124,116,248,242,187,231, 79,126,248,241,226,242,234,173,240, 31,194, 56,111,
-243,160,192, 93,236,206,227, 25, 55,238, 75,147, 91,153,189,135, 98,200,146,220,182,140,236, 65,100, 15,247,226, 20,154, 72, 9,
-215,164, 98, 94, 28,100,207, 57,232, 52,194,194,144, 63,216, 47, 67, 89,134, 89,228,163, 94,132, 71, 42,130,147,201,152, 71, 14,
-202, 98,137,164, 42,165,126,242,240,237,155, 71,161,216,203,211,159,211,187,235, 20,119, 84,221, 64,173, 51,144, 26, 5,215,218,
-109, 12, 4,101,227,137,134,135, 35,128, 76,219,129, 42, 30,201,100,128, 21, 89, 81,244,139,196, 31,177, 90,164, 22,117,237,149,
-248,244,193,223,215,167, 51, 75,101, 27,220, 16, 42,238,138,153,116, 69, 70, 99,231, 11,103,163, 20,105,247, 97, 23,196,181,180,
-101,197,169,109,118,191,121,216,169,151, 5, 88, 37,144, 80,152, 41,145, 83, 26,164,241, 48,100,127, 71, 61,178, 82, 42,196,158,
-148,116, 94,112,169, 3,231,157, 96,169,100,155, 70,157,160,173,179,241, 24, 95,254, 60, 31, 11, 9, 32,129, 25,182, 94, 48,238,
-202, 33,126, 1, 26,192,115, 27,138, 94, 41,131, 10, 92, 58,206, 49, 49, 52,122,184, 27, 37,104,216,106, 47, 1,221,129,241,107,
- 65, 93, 4, 96,227,128,119,148, 36,207,178,138,150,172,116,100,125, 71,100,242,220,232, 43, 43, 69, 70, 82, 85,166, 92,185,118,
-119,177,215, 15, 93,238, 68, 50, 67,242, 55,128,213,210,225, 42,136, 26, 93,136, 39, 20,114,133,186,211,109, 66,140, 17,202,101,
-210, 33,111,252, 59,197,224,133,108,115,205,145,228,149,165,233,132,170, 95,117, 53, 7, 13,120,246, 16,245, 93, 40, 84,189,181,
- 76,179,236, 16,166,124,198, 86,181,168,226, 67, 52,148,254, 20, 12, 43, 78,222, 23,210, 20, 60,116, 10,104, 58,105,125, 89, 26,
- 15, 32, 91, 96,215,143,159,126,242,234,118, 61,253,243,193, 33, 78, 87,122, 34,107,100,177,168, 82, 26,202,184,145, 67, 34, 59,
- 57, 85, 28, 20, 53, 60,126, 41,109, 86,147, 59,148, 75, 10,202, 84,123,199, 29, 57,228,218,106, 80,243,238,208,193,132, 74,224,
-166,253,121, 70,209, 93,237, 92,116, 40,211,186,182, 74, 75,194, 15, 87, 13,183, 39, 77, 89,108,166, 88, 66,101,238, 80, 78,140,
-189,225, 32,170, 72,117,182,138, 93,232, 26,182,137, 63, 66, 45, 77,248, 22,172,213, 45,197,159,161,192, 39,254, 34,147,151,156,
- 27,177,224,150,162, 54,220, 59,246,114, 81, 59,132,102,178,157,194, 51, 26,132, 4, 97, 52, 80, 65,136,205,185,106, 11,223, 0,
- 44,195, 50,234,218,160, 56,176,130,146, 7,248,150,139,165, 78,192,214,251, 98,179, 35,105, 87,210, 60, 45, 4, 18,172,100,169,
-225,184, 77,233,225,254, 68, 53,225, 94,202, 28,102, 90, 57, 66,183,252, 47, 0, 73, 87,178, 35, 73, 13, 5,211, 78, 59,157,206,
-165, 26,141,154,110, 54,181, 52,160, 17, 32, 36,184,114,226, 6, 18,226, 15,144,248, 14, 36, 62,141, 27, 92, 71, 32, 78, 92, 17,
-195, 50,163,161,153,234,172,170,204,180,211, 27, 17,201,177, 14, 85,101,121,121, 47,194,126, 47,162,254,234,155, 47,145,178, 46,
-155,247,177,156,211, 63,130, 87, 6,142, 91, 47,150,101, 42, 11, 38, 54, 68,106, 31, 2,130,130,216,198, 93,197,169,148, 77,179,
-189,147,154,219,173,236, 17,162,114,233,175, 54, 36, 2,187,120, 55, 88, 36, 22,201,246,134,112,152,238,190,254,226,112,119,247,
-253,241,143, 95,214,135, 72,139,107,218,172, 59,165,233,115,200,119,208,226,169, 91,149,207,170, 32,176,237,221,246, 72, 35,225,
- 69,103,151,155,225, 16,183,241,184,246,154, 66,215,171, 76,124,214,235,243,253,170,174, 93,245,164, 60, 72,227,127,163,218,210,
- 54,213,213,196,214,142, 66,203, 40,225,182,109,153,195,234,242,197, 7,176,208,165, 81,206,131,112,208,216,168,232,124,138,124,
-128, 8,160,115,189,181,183, 63, 63,253,117, 78, 15,169,166, 93, 80, 4, 49, 59, 50, 53, 47,145,250, 59,103, 42, 63,108,108, 30,
- 5, 71,247, 70,159,130, 94, 21,217,102, 17,115, 5,118,108, 10, 34,113,205,250,140,165,137,169, 90, 45,213,125, 0,250,243,209,
-167,207, 63,123,255,181,155,103,151, 87,224,226, 20,167,103,131,139,234, 56,165,108,207,194, 71,140, 89,239,245,216,108,129, 78,
- 32, 77,152,112, 46,210,202, 58,217,186, 5, 8,227,109,170,244,205,245,155,107,120,251,135, 31,159, 54,216, 12, 13, 40,105,165,
-221,174,238,139, 67,163,228, 5, 32, 60, 84, 72, 25, 88, 75,105, 17,211, 76,209,154,114,215, 94, 2,137, 85,165,190, 40, 82,230,
-110,148, 83, 5,130, 78,108, 69,243,192,134,226, 50, 64,132, 44, 93,144,180,214, 45,187, 82,243, 10,242,195, 87,186, 64, 41, 31,
-214,243,128, 49,177,149, 16, 84,177,139, 52,126,244,205,186,164,173,168,241,163,199, 31,124,251,221,237, 39,159, 34, 90,255,238,
-143,156, 39,102, 68, 10,186,128, 29,132, 93,161, 17, 19, 62,236, 53, 48,248,237, 85,128, 51,173,244,227,101,101,193,100, 68,164,
-156,128,230,127,102, 94,160,145,195,128, 20, 36,208,136,248,111, 70,124, 47, 41, 4, 66,120,108, 98,197,107,154, 25, 4, 17, 9,
- 70,165, 37,103,234,249,239,250,239, 67, 51,126,252,198, 95, 47,158, 36,119,190,214,203,124,255, 39, 25,214, 43,154,209,233,192,
-250,247,204, 78,123,178, 93, 68, 17, 36, 75, 6,113,190, 91,176,162, 38, 52,180,248, 64,120,165, 46, 17,245,197,170,210, 81,165,
-160,125,167,139,143,223,122,182, 76, 86,215, 27,130, 94, 0, 62,174, 93,143, 25,161, 69,161, 46,244,137, 89,165,201, 9,145,100,
- 70, 76, 47, 14, 59,131,234,163, 72, 69, 52, 98,194, 57, 23, 15,216,133,136,119,146,142, 49,102, 23,245, 93, 68, 60,137,160,103,
- 67,152,229,162,245, 94, 82,135, 60,227, 72, 99, 14, 16,244,194,255,251, 3, 67,244, 82,149,171,215,235,231, 63, 5, 55,197,153,
-154,239, 94,208,107,199, 0,108,155,250, 20, 48,109,148, 97,136, 73,198,189,164,190,207,166,237,153,151, 65, 56, 34,209,143,162,
-162,131,195, 1, 46,141,166,125,156,174, 89, 98, 10,210, 16, 89, 72,201,175, 83,119,175, 35,175,137, 99,230,187, 8,171,119,216,
-177, 87, 93, 16,213, 40,163, 47, 15, 0,165,188,151,247, 62,165, 41,110,107, 9, 84,221,103, 97,139, 26,178,174, 20,137,173, 9,
- 93, 33, 70,201, 88,165, 64, 87, 73, 65,102, 90,177, 23,163,214, 7,171,113, 10, 87,147,213,204,242, 67,153,233, 23,100,104,114,
-203, 18, 30,189,129, 54,129, 67, 81,231, 95,136,221, 83, 36,198, 94, 32, 9,168, 32,105, 98, 18, 60, 66, 32, 14,107, 1,229,232,
- 16,198,128, 53, 54, 38,105,211,139, 15,223, 51,127,223,188,251,242,254,185,171,146,223, 5, 99, 35, 21,194, 90,222,105, 43,169,
- 31,177,215,106,180, 93, 53, 52, 36,141, 45,120, 13,206, 82, 55,154,129, 0,205, 58,106, 73, 34, 99, 8, 59,220,234,177,200,126,
- 19,249,170,173,172,177, 76,188, 3,194, 79,104,218, 45, 96, 49,128, 25,237, 85,115, 9, 97,176,105, 85, 24,143, 3,200,142, 20,
- 44,162,114, 45,112, 84,127, 94, 11,235,193,156, 22, 53,136,100,159, 55,156,193, 69,249,193,128, 9, 83,235,162,185,180, 11, 22,
- 8,104, 94,225,112,130,183, 17,184, 43,196,107,178,197,203,108,114,193,240,152,191,244, 9,163,140, 81, 59, 3, 20,118,158, 1,
- 52,129, 31,114,117,154, 82, 93, 88,120, 89,128, 27,236, 54,122, 75, 9, 81,141,172,130,184,169,138, 54,246,145, 21, 25, 72,163,
-169,232, 81, 16,100, 51,151,186,113, 14, 24, 1,185,158,242,185,200, 77, 99, 59,171,220,252, 39, 0, 75,215,178, 26,199, 17, 69,
-235, 93,221, 61,210, 88,150,144, 72, 12,134,128,192, 1, 7, 19,131,241, 15,120,145,165, 87,129,124,131,241,183,101, 17,200, 87,
-100,149, 23,100,151, 64,176, 73, 28, 35,205,179,171,187,158,157,115, 6, 47,103,161, 81, 79,117,221,123,207,169,186,247, 28,253,
-205,119,223, 46,188, 73, 77, 38,133, 60,141,109,139, 0, 60,164,208, 66,219,119, 72, 86,114,218,135,186, 79,225, 62,204,230, 88,
-156,237,114,110, 92, 93,196,125, 18, 81, 17, 13,206, 26,232,162, 60, 68,109,209,235, 11, 84,249,190,239, 65,147,186, 28,221,245,
-171,167,253,215,143,127,220,252,251, 75,102,127,112, 15,182,162,176, 96,117,162,190, 19,229,157,176, 71, 2, 79,105, 79, 39,246,
-167,137, 29, 80,177,130, 39,200,105,227,212,116,227,183,247,241,114,163,134, 94,242, 16,180, 81, 70, 14,133,114, 76,122,216, 13,
-183,157,177,171,229, 93, 60,190, 47, 7, 64, 6,159,177,159,202, 78,110, 38, 82,183,133, 51,170,188, 74, 92,148, 30, 43,213,133,
- 40,126, 54,148, 66,114,138, 12,152,173,187,124,252,228,215,223, 62,126, 0, 63,161,184,135,184,103,235, 26,118,217,148, 19, 50,
- 13, 39,215, 69, 22, 28,221,154, 58,100,126, 35, 82,136,252,196, 70,221, 84, 40,190, 17,241,158,128,132, 44, 48,240,154,215,105,
- 68,111, 61, 27, 94,199,231,207,110, 63,191, 77,245,191,224, 9,220, 16,237,115, 99, 52, 25,122, 0,205, 84, 30,161, 30, 43,165,
-199,153,166,219,201, 22,132, 67,244,180, 70, 3,242, 83, 13, 65,192,137,166,214,157,165,207,214, 79,126,248,254, 39,112, 25, 30,
-153, 43,142,187,207,148,128,197, 70, 67, 0, 96,209,188,165,204,115,110, 20,203, 93, 26,197,200, 88, 68,156, 2,252,179,222,106,
- 67, 93, 77,205, 19, 65, 0,221,142, 50, 14,244, 53,181, 72, 23, 25,171, 20,144,196,177, 83,121, 26,109,154, 1,211, 78,213,118,
-120,165, 3, 13, 62, 65, 72,153,158, 35,190,184,107,138,179,162,117, 22, 95,188,126,253,242,205,219,155,213,213, 59,113,188, 11,
-212,148,139,146,142,214,154,211, 61, 68,104,133, 89,134, 45, 60, 8,207, 45,229, 25, 57,175, 39,117, 88, 84, 22, 88, 74, 17,150,
- 26,120,182,186,180, 25,233, 65, 90,167,130, 64,209,165,160, 53,118,193,198,180,163, 40,169,130,192,206,119, 22,251,177, 76,105,
- 98, 62, 95,114, 40, 50, 22, 79,199,161, 69, 2, 59, 89,181,126,118,243,231,199,167,211,252,254,209,245, 60,126,248, 61, 29,151,
-182,211, 37, 81,198,252,147,155, 54,111,232,136,205,219, 73,189,140, 22, 17,242,116, 17,176,124,130,240, 82, 32,186, 37, 98, 4,
-165,191, 72,177,186,144,234,234,197, 95,105,186,216,110,165,246, 28, 43, 51,131,156,202, 64,109, 4, 36,219,169, 26, 94,167,171,
-112,164,132,174, 65,200,178,141, 75, 72,188,191, 74,191,179,216, 21, 20, 45,194,102, 71, 53, 22,201,221,212,128,220, 80, 30,164,
-227, 1, 34,222,145,167,170, 44, 25, 5, 30, 66, 31, 4,173, 38,192, 61, 43,118, 65, 77,113, 92,234,114,249,229, 42,222,165,191,
-255, 72,142,178, 85, 26,248, 26, 69, 53, 83, 46, 47,143,248,107, 57,156, 73,155,178, 11,108,149,117,154,180,190, 2, 57, 12, 20,
-159,232,170,222,105, 14,109, 15,150, 36,138,247,169,166,166,115, 90,248,209,141,120,226, 69,232, 73,208, 95,165, 77,171, 10, 68,
-247,228,181,192,187, 95, 67,135, 24, 35, 60,234,213,222,238, 70, 80,184,214, 91,214,128, 49,214,184, 41,199, 67,162,121, 0, 22,
-222,120,155,189,137,182,108, 53,109, 47,144, 26, 61,149,115, 17,121,100,123, 2, 8, 19,149, 42,214,228, 80,196, 58, 84, 84,214,
- 12,193,142, 79,154,161,212,158,204, 13, 43,143,159, 43,122,169,246, 73,198, 56, 59,202, 71,209,211,129, 29,115, 39,165,126, 75,
-195, 44,182,154, 14,206,211,189,103, 57,121, 61,184,124,109,123,249,213,163,159,255,217, 2,236,157, 63,188,242, 93, 11, 14,249,
-212, 1, 45,160, 6,209,156,200, 75,131,186, 43, 84,245,218,177,149,214,183,206,202, 51, 25, 31, 0,222,107, 54,153,173,236, 66,
-139,109,117,143,146, 14, 22, 4, 0, 33, 1,170, 2,158, 21,187, 81,227, 71,163, 76,202,121,206,105, 60, 63,248,249,129, 25, 50,
-141,138,155, 61,199,174,161,212,181, 50, 83,227,233,167,108,178,207,188,149,177, 19, 56,251, 2, 40, 96, 28, 56, 12, 21,231, 85,
-135,189,112, 65,165,198, 97, 98,184,249,224, 2,234, 75, 60,172,240,255, 22,246, 14, 33, 22, 58, 64,139,110, 71, 83,215,153, 64,
-172, 8, 15,204,176,150, 18,204,148,133, 4, 84, 78,245,180,101, 64,169, 86, 9,232,242,166, 26,170, 74, 23, 0, 65, 81, 6,206,
-107, 78,154,154, 83, 88,119,205, 6,108, 84, 88,106, 37,117,246,120, 0,139,228,113,100, 88, 38,227,114,182,255, 11, 64,210,181,
-235, 72, 82, 67, 81, 63,235,217,213,221, 51,172,180,210,106, 2, 36, 64, 48, 36,128, 8, 32, 71, 68, 75,206, 23,108,176,159,180,
- 95,176,255, 64, 66, 74,134, 64, 34, 71,204,160,133, 1,209,189, 61,229, 42,151, 31,101,206,169,205, 90, 29,149,237,235,115,207,
-177,125,207,213,223,126,255,141, 95,206,128, 52, 57,173,206, 36,119, 41,155, 85,195,146,167, 52, 79, 98, 84,238, 80, 70,235, 87,
- 29,146,183,126,134, 84,102, 31, 44,208, 15, 68, 69, 13,128,105,154,168, 83, 5, 82,208,138,122,127, 52, 51,254,194,167,177, 52,
-121,255,197,205, 71,207, 63,254,209,253,253,195, 20,119,239,202,244, 16,103, 54,111,143,226,120, 96, 89,241,109, 4,251, 82, 75,
- 33,177, 59,189, 74,251,210,204, 44, 91,160, 73,148,206,201, 85,245,124, 5, 13, 22, 15, 39, 95, 89,229, 42, 57, 69, 0, 83, 88,
-141, 63, 67,249,156,215,247,211,250,201,241,234,172, 47,115, 40,231,156, 33,230,216,228,136,229, 35,101,123,175, 26, 55,159, 49,
-154, 55,234, 50, 19, 38, 22,228,122, 54,232,212,144, 47,199,155,221,195,125,250,253,183,135, 29, 84, 64,172, 29,132, 50,166, 42,
-219, 49,176,180,136, 79,216, 50,249, 52,114,141,207,185,169, 89,188, 88, 38,233,160,149, 51,166,106,235,208,145,161,210, 5,205,
- 95,147,140, 20,101, 88, 93,253, 79,126,124, 50, 60,251,236,235,103,209,253,199, 34, 87,177,149,167,243, 45, 96, 2, 85,201,204,
-115,200,104,114, 13, 42, 39,242,116,181, 53, 18, 76, 9,195, 47,188,168,219, 78,138,245,246,222, 2, 99,110,111,190,122,245,250,
- 39,239, 46, 93,199, 97,224,195,233,212,196,183,168, 32,191,236,121, 94,147,143, 10, 26,153,130, 7, 86,169,122, 87, 50, 89,153,
- 88,135,157, 90,116, 77,119, 84, 76, 73,104, 76, 94, 89, 63,130,220, 1, 77,248, 56,178,200, 89, 27, 21,232,195, 85,122,165,192,
-185, 98,100, 83,212,172, 35, 27, 50,107, 19,181, 52,134, 55,235, 86, 58,191,200,246,248,225,139,151,159,126,247,252,164,204, 31,
-129, 85,190,136, 39,236,205,173,125,181,162,243, 42,169,232,202, 62,186,188,118, 22,216,187, 89,176,213, 70, 17, 64,240,113, 41,
-163,152, 92,242,206,231,191,130,169, 26,115,144,200,101, 37, 26, 30,117, 0, 58,121,246,149,210, 25,210, 56,172, 1, 74, 12, 2,
- 49,229,203, 42,188, 82, 99, 41, 39,240,214, 4,212,198, 88, 48, 2, 30,229, 86,226,234,203,227,155,187, 91,119,190, 63,182,215,
-245,253,207, 19,208,241,212,172,180,248, 84,198,103, 40, 91,158,117, 41, 49, 50,248,249,219, 47,162,234, 8,238,128,143, 70,109,
-158,239, 53,187,171,234,176, 53,238, 26,212,241,122,177, 31,220,254, 2, 66, 84,156, 48, 61, 86,203, 65, 2, 33,143, 74,224,151,
-222, 26, 29, 66,176,205,190,237,114,208, 49,112,231, 97, 53, 65,116,120,250,193,234, 68,172, 74, 44,209,134,224, 44, 67,143,125,
-224, 48,247,185,244, 44,200,161,108,193,111,195, 46,205,137,185, 14, 97,237, 53, 95, 82, 6, 22, 27,215, 77,153,237,170,150, 85,
-214,215, 79,247,255,222,205,111,238, 38, 33,167, 69,109,221, 45,233, 7, 18,233, 2,108,124, 0, 16, 87,242, 61,153,123,218, 0,
-219, 69, 2,252, 98,197,251,156, 98, 17, 6,235, 1,171, 54,130, 12,150, 84, 41,197,130, 99,146,104, 79,239, 8, 97,102,228,238,
- 50,251,184, 61, 68, 72,113,148,147, 14, 80, 34,216,192,172,121,149,140,196,183, 86, 65, 66,167,201,176,167, 83,201,225, 97,237,
- 32,100, 70, 16,191, 52, 61, 38,176,155, 9,148,155,246, 54,114,109, 42,139, 13, 29, 85,239, 33,101, 72, 86,100, 86,122,166, 59,
- 53, 27,189,143,241, 45, 80,156, 73, 13, 49, 43, 27, 80,246, 68,187,206, 11,216, 7,229, 85, 1, 30,156,138,223,133,205,114,134,
-158,213,228, 63, 44, 77,128, 46,166, 1, 53,200,118,222, 10,180,129,151, 9,144, 21,179, 48,131,121,242,249,237,175,127,118,110,
-244,214,224, 59,248,142, 28,179, 83, 63, 69,220,106, 22,106, 97,184, 67,103,155,174,158, 92, 62,238,129,127, 77,218, 65, 94,212,
-218, 33, 13, 0, 4, 32, 93,210, 33,207, 57, 15,177,107,251, 13, 91, 75, 47, 49,133, 64,204, 85, 15,234,226, 35,111,182, 75,160,
- 39,204,144,216, 73, 3, 59, 81, 95, 66,238, 6,236, 28,138,107,236,213,142, 22, 33,203,140,229,236,185, 83, 4,115, 12,102,215,
-183, 60, 99, 45,222, 46,188, 61, 55, 10,241, 98,139,205,105,245,192,248,186,197, 50,245,222,242,217, 86, 84, 59, 30, 71,201, 42,
- 65,155,132, 6,201, 94, 85, 10,129, 77,123, 4,224, 65,182,241, 88,129,154, 41,154, 47,232,182,211, 49,247, 32,171,152, 29, 48,
- 10,185,195,103,198,118, 98,199,236, 52,177,244,218,176,182,189,193, 54, 26, 27, 95,235,193,164,222,164, 12, 25,223, 68, 91,107,
- 63,255, 47, 0, 71, 87,207,235, 70, 17, 69,231,123,214,235,216, 78,244,172, 60,145, 68, 72,128, 4, 1, 36, 64, 41,105,160, 72,
-145, 38,127,131,138,159, 70, 65,195, 95,160,163,160, 64, 17, 18, 5, 5,232,249,161, 60,219,239,121, 63,102,102,103,102, 57,103,
-123,203, 94,207,222, 57,247,156,153,123,207,213,111, 95,127, 23, 32,107, 23, 28, 11,236, 91,237,103, 26, 39,158,179, 44,253, 5,
-177,209, 32,208,207,108,129,193, 19, 73,218, 90, 74,171,252, 44, 86,214, 22,237, 52,180,135,216,212, 6,164, 54, 94, 3, 59,231,
- 38,168, 43,112, 96,223,104,251,201,219,143,254,216, 14, 63,159,111,199, 98, 91,197,203, 64,207,203, 23,228,165,236, 75,197,190,
- 91, 25, 86,246, 1,203,247,117, 30, 5,146, 70, 57,206,165, 44, 80, 56,145, 81,131,210,164,193,219,195,227,162,239,210,117,168,
-118, 21,142,153,238,237,134,242,155, 55,150,195, 33,236,250,205,243, 77,125,186,121, 28,164, 8,181, 79,179,213, 60,201, 97,205,
-177,201,180,153,145,161, 79, 19,190,158, 39,212, 64,126,188,186,182,210,236,199,110,159,184,221,151,159,254,254,231,157, 58,135,
-236, 12, 62,228,193, 34,121, 75,197,201, 79,208,167,231, 73, 5, 57,146, 76,179,147,177, 70, 86,241,168,174,229, 17, 57, 98,175,
-213,102,169,164, 87,231,196,122, 44, 95,240, 50,234,218,251,251, 88,251,206,189,121,189,151,245, 95,142,104,103,110,161,161, 39,
-251, 17, 33,242, 29,173,103, 83,209, 88, 76,108,103,176,120,214,129,179,117, 23,111,123,173, 53, 57,112, 85, 72,245,144,231, 92,
- 3,119,245,237, 79,191,188, 59,156, 14, 27, 80, 93, 32,104, 85, 77, 98, 79, 20,152, 10, 72, 53, 95, 47, 2,147, 73,143,238, 45,
-134,197,138, 20,103, 45, 30,175, 66, 41, 65, 34,187, 71,190,152, 49,180, 64, 83,218,111,120,101, 52, 81, 5, 92, 20,124,111, 66,
-198,145, 65,203,218,129,143,208,221,174,212, 41,173, 72,166,156,145,200,111, 59, 81,250, 18,135,251,171,207, 94,125,253,227, 15,
- 31,126,245,234, 70,148,219,208,227, 77,201,197, 83, 69, 45,227,190,237, 98,151,128, 60,182, 18, 44, 59, 76,128, 71, 49, 38,125,
- 97,215,128,138, 41, 61,164, 52,148,190, 31,198,255, 74,119,207,131,229,237, 51, 48, 69, 69,165,139,191,190, 76,186,154,122, 51,
-117, 0,104, 22, 4,165, 27, 27,223,103,118, 31, 95,180,206, 57,199,138, 15,100, 71,156, 38, 56, 84, 8,146,106,215,238,234,251,
-235,155,195, 62,142,231,173,120,161,110,223,117,151,174, 97, 85,161,232, 64,144, 71,109, 0, 7, 61, 16,113,174,154, 71,189,134,
-187,131,213,184,224,245,208, 3, 32,242,145,166,231,108,134, 51,196,102, 90,216, 34, 60,155, 47, 62,255,251, 84,108, 56,178,141,
-146, 3, 5, 27, 80, 95, 60, 60,231,124, 72, 78,147, 2,230, 38, 86,202,142,133,136, 93, 2, 51, 77, 26,133,236,147,169,103,100,
- 42, 4,132, 40,216,208, 14, 9,175,230, 25, 4,110,113,225, 36, 43,148, 60,170,227,213,234,180,204, 98, 2,114, 56,172,152,231,
-232,103, 8, 51,110,113, 14, 16, 83,151,176,125,225,246,207,198,223,126, 77,227,195, 19, 55,127,240, 49,192,139,179,110, 83,136,
-225,148,212, 93, 31,161,174,176,221,181,223, 53,198,177,186,130, 61,250,134,238,240,172, 8,231,241, 95,163,170, 71, 46,194,226,
-131, 13,178,106, 6,144,141, 85, 78,120, 57,163,101, 7, 80, 65, 94, 87,156, 69, 13, 30,211, 97,229,197,120, 3,253,196,189, 23,
-250,204,226,243,177,206, 23,252,123, 58,195,172, 65,241, 45, 77,195, 13,189, 41,196,233, 88, 65,240, 11, 29, 56,243,113,224,169,
- 78, 23,216,107,175, 87,226,129,180, 22, 59,162,168,161, 64,112, 59, 8, 67, 41, 56,220,177,231, 92,231, 19, 9, 80,181, 49,231,
- 94,134,152, 71, 16,223, 76, 13,207,219,227,186, 40,192,204,128, 82, 18,244, 24, 60, 74, 34,115, 65,237, 48, 14, 4,183,164,103,
- 33,112,255,242,155,231,127,237,221, 63,249,178,213,179, 75,173,223,216, 25,164,102,102, 69, 77,105, 28,253,169,216,194, 84,231,
-173, 78,126,213, 54,167, 40, 7, 14,255, 5, 11,210,120, 64,132,171,131, 94, 50, 52,143,209, 5, 64,193,155, 5, 54, 35, 33, 40,
-198, 89,110,215,190,164,182,120, 96, 28,141,149, 13,183, 91,110, 12, 39,187, 86,146, 38, 60, 26, 71,189, 69, 4,229, 28, 21,146,
- 66, 19,173, 22,156,236,205, 46, 21,193, 2,137, 50, 47, 39, 38,122,153,124, 41, 70, 99, 57, 38, 36,251,150,150,196,128, 20,168,
- 41, 59, 4,195,206, 15,136,116,238, 96,232,101, 59,175,238,189, 81, 38,237, 88,137,196, 66,248,117,205, 50,149,137, 7,116, 96,
-234,196,155,165, 51,119,122,224,137,240,154,174, 33, 8,206,104, 28,226,214,210,212, 96,166,192, 54,205,148, 56,199, 21,225,240,
- 40,134, 34, 86,130,191, 48,253, 47, 0, 71,215,178, 27, 73, 17, 4,235,209, 93, 53,213, 61,110,143,103, 89,175,119,121, 72, 72,
-200,172, 44,173,144, 16, 32, 78, 32, 62,128,255,128,239,226,204, 63,112,230,202,129, 11, 66, 32, 48,107, 99,227,121,244,179, 30,
- 93, 67, 68,223, 44, 31,198,158,238,172,204,136,172,204, 8,253,245,183,159,177,113, 51,248,118,136, 93,151, 74, 48,197, 54,117,
- 94,131,148,150, 7, 79,211,191,189,151, 32,204,156,211, 15,140, 8,222,255,129,157, 77, 26,228, 7,145, 98,140,222, 54, 49, 6,
- 60, 0, 43, 77,179,229,154,231, 62,158,125,121,249,234,211,139, 31,246,221,173, 55,239,148, 22,100,156,247,229, 5,178,129,169,
-144, 66, 85,201,133, 58,170,105, 80, 85, 32,107,142, 69,109,241, 64, 0,107,151, 53,165,169, 72,143,148,101,165,143,100,170,171,
- 93,101,228, 67,251,126, 34,250,223, 41,234, 44,196,236, 65, 89, 6, 61,221, 79, 81, 63,244,151, 94, 94, 63, 63, 59,175,234, 40,
-233,135,224, 41,175,146,112,184, 75,110, 48,227,216,141,114,106, 35,224, 54,222, 21, 82, 99,106,128, 61,145,116,186,171, 15, 94,
-238,110,227,207,191,162,174, 4,167,181, 31,203,136, 16, 86,126,226, 42, 49,162, 37, 22, 64, 60,147, 2,167,200,248,226, 0,253,
- 3,167, 47,145,185,164, 77,253,172, 98, 24,235,138,205, 78, 28, 51, 78,218,245,150,106, 8,157, 60,246,254,243,143,111,182, 47,
- 79,225,176, 35, 76, 93,102, 55, 50,119, 93, 54, 34,214, 52, 15,206,120,121,134,118, 16,236,211, 24,228, 89, 2,187, 2, 21, 80,
- 81, 21, 76, 70,242, 46, 42,133, 72,251,252,139,159,126,252,229,238,237,223, 27,229, 72,183,153,144, 68, 56,195,167,226, 31,101,
-146,157,180,226,115, 87, 84,199, 35, 55,170, 10,206,138,114, 57,182, 12, 46, 73, 75, 51,205, 65, 56, 16,200, 42,205,171,176,136,
-186,115, 10, 51, 11,156, 63,118,149, 53,117,120,109,206, 5,175, 26, 9,240,149,104,168,231, 42,192,138, 14,187,160,207,223,251,
-230,171,155,239,190, 23,219, 87, 79,167,241, 48,118,121,209, 97, 36,214, 35,245, 72, 52,197,210, 56,251,236,146, 38, 49,142, 56,
-154,170,119, 26, 28, 23,232,227, 32,253, 99,236,143,113,220,165,177, 75,125,203,188,251,236,114,173, 95, 44, 10, 17, 72, 48, 19,
- 37,194,168, 72,156, 82, 30,184,226,205,139,198, 73,164,209,203, 73, 82, 0, 99,200, 29,157, 84, 79,171, 54,113,143,115,165, 80,
-155,228, 6,223,114,181,185,185,254,243,254,194, 31,254,113,235,109, 35,159,252,253, 91,223,150,128,229, 40, 81, 38, 20, 85, 89,
- 32,198,240,247,150,182, 21, 21, 94, 80, 86, 21,119, 66,137, 16,193,198,170,165, 28,114, 68,255, 36,139,154, 63,187, 75, 97,175,
- 63,249,253,110,140,195, 19, 88, 22,133,189,201,183,105,109,151, 92,195,142, 43, 40,192,137,247,227,163,220, 39, 38,200,217,227,
- 89, 7, 93,236,204,108, 38,179,146, 39,208, 69,192,213,140, 4, 26,188,106, 44, 48, 48,138, 6, 85,104,128,153,231,148, 80,214,
-107, 78,122, 90,167,217,238, 24,217,213, 93, 38,107,102,174,113,186,130, 2, 63,209,140, 89, 95,125,164,250,223,242,221, 31,175,
-111,116, 99, 93,199,209,169, 83, 71, 29,173, 92,212,243, 1, 5,231, 49, 28,158,186, 7, 36, 87,164,184, 77,195,156,218,230,112,
- 46, 36, 59, 14, 5, 93,139,148,181,165,229,192,142,156,237, 40,227,145,107,127,129, 94,226, 5, 87, 68,143, 34,182, 28, 55,161,
-160, 38,157, 67, 53,205, 6,244,188,207,114, 60,226,189,242,206,164, 67,104,178, 66,231,182, 37,173, 13, 96, 81,200, 71,131,160,
- 13,155,201, 83,127, 18,139, 35,231, 76, 85,176,204, 73, 74,192,193, 49,250,255,136,236,255, 45,244, 35, 96,224, 81,229, 14,156,
-122, 68,152,231,105,198,199, 32, 38, 4,135, 84, 56,217,191, 25, 4,151, 12, 36,167, 62, 22,115, 74,218, 37, 9, 82, 66,142,148,
- 22, 66, 95, 72,201,200, 52,188,212, 58, 7,136, 64,152, 85,226,195, 55,239,222, 94,109,118,127, 77,139,105, 70,217,173, 41,254,
- 34,243, 80,173, 4,199,118,109, 93,174, 74,135, 42,230, 28, 61, 69,140, 78,217,154,181,139,204,206,242, 25,168, 46,126,129, 10,
-155, 44, 21,163,195,100,215,167,217,153, 41,116,154,112,149, 91, 56,217,243,130, 16, 71,146,157, 74, 87, 2,140,142, 57, 69, 54,
- 4,169,102, 97, 74,132,164, 25,230, 6, 37,154,126,231,200, 0,200,186,136, 16, 74, 96, 34,131,177,239,100, 80,207, 93,170, 7,
-148,176, 90,204,213,139,131, 71,198, 15, 43, 4,148,119, 74,175,103,151, 22, 74, 5,222, 3,252, 98, 65, 72, 1,250, 61,192,131,
-141, 57,248, 53, 45,181, 40, 88, 71,107,225,100, 40, 51, 9, 8,205,171, 65, 0,207,101,236,156,144, 76,210, 88, 15, 48,199, 40,
-222,200,247,195,100,164, 60,227, 38, 86,162,140,226,116,114,244,235, 13,253,112,110, 74,169,254, 23,128,163,107,217,145,156,134,
-162, 73,252, 74,170, 83, 93, 69,207, 52, 51, 72,195, 67, 51, 12,219, 17, 72, 32,129, 52, 91,126,128, 37,136,255, 99, 3,223,129,
-132,196, 7, 32,102,129, 68,247,244,131,174,206,211,142,237,216,156,147,117, 73,149, 84,249,250,222,115,236,123,207, 17,223,189,
-125, 59,216,190,162,228,229,137, 93,101, 57,142,115, 96, 79, 90,223,167,217,185,217,209, 44,181,230,236,161,140,198,163, 34, 1,
-117,160,118, 24,141,204,185, 26, 30,198,237,176, 65,234,198, 52,181,164, 36,177, 5, 78,189,190,252,252,251,203,171,227,253, 47,
-221,236, 69,121,174, 40, 91, 13, 10, 34,184,105, 12,185, 80,169,219, 2, 43, 94, 26, 74, 57, 33,207,132, 68,197,248,117, 59,186,
- 45,116, 9,182, 74, 85,190,186,116, 68,107,185,188,111,245, 77,230, 72,244,197,188,118, 58,246,210, 9,176,141,169,212,108, 9,
- 27, 78, 99,188,191,233,243,181,253, 34,152,215, 23, 31,124,186,191, 60,111,212,184, 61, 84,216, 98,216,180,190, 67,164,105, 56,
-254, 38, 60, 6, 24, 47, 11, 79,101,178,243,195,254,240,226,236,247, 63,167,177,239,141,166,125,118,230,168,200, 90, 77,229, 38,
-114, 94, 76,147, 34, 21, 34,210,172,134, 82,209,186,241,137, 76, 62,153, 33, 57, 65,203, 92,151,165, 30,179,234,227, 44, 40,100,
- 34, 76, 4,111, 13,214, 45, 15,234,155,175,143, 66,188,155, 35, 2,138,246,123,165, 60,202,226, 80, 40,193,187, 83, 84, 74,148,
- 65,252,116, 13,232, 38,217,246,186,162,102,250,109,240, 31,229, 0,181,151, 9, 96, 77,109,243,236,203, 95,127,251,227,253,237,
-245, 89,187,171,120,160, 90, 84, 96,162, 19,229,101, 12,184,159, 96, 55,255,110, 27,224,144,134, 87, 11, 92,209,130, 23,119,160,
-166,108, 87, 64, 80,141, 66,153,108, 72,150,240, 26, 8,153,188,119, 66, 9, 30,158, 88,201, 35,138,186,198, 94,150,156,127,110,
-217, 62,170, 54,120, 59,148,160,170,190,151,175,126,254,233,205, 15, 63, 34,144,222, 47,221, 67, 88, 50,207,210,240,138,113,187,
- 28, 86,200,196, 59, 60,141,198,199,148,224, 71,133, 4,228,152,211, 28, 66,103,253, 35,120,140, 95,110,227,112, 90,163,141,254,
- 97,233,134,252,244,229,147,139,207, 90,234, 97, 33,235, 69,149,123, 54, 76,134,222, 91,246,220, 38,208,200,229, 6,201, 35, 44,
-137,119, 8,133, 93,195,163,226, 44,102, 0, 78, 4, 0,207, 84, 54, 87,212,246, 60,107,204,241,219, 87,239, 78,237,228,175, 68,
- 91, 63,179,113,248,247,111,202,242,175, 90,113,160, 32, 7,228, 57,164, 26,148,104,228,188,213, 80, 79, 77,209,254,130,133,137,
-150, 38, 88,148, 2, 47, 43, 73,162,203, 77,254,191,168,143,197,254,245,155,127, 74, 59,119,221, 98,140, 70, 4,222,249,220,101,
- 0,226, 0, 66,155,104,213, 92, 6,236,197,122, 32,141, 6,242, 41,199, 85, 44, 46, 48,133,155, 72,229,120,154, 6, 99, 7,212,
-209,130,233, 34,203,244,244, 81, 4,137, 64,169, 80,166,160,178,225, 57,135, 17,178,198,110,117,137, 68,105, 27,249,226, 73,177,
- 16, 99, 37,102,124,111, 42,154,121,215,166,253, 39,207,125,255,241,243,255,174,110,101,159,146, 27,214,147,173, 26, 87,198, 0,
-168, 12, 66, 8, 12,153,150,126,153,175,173, 64,241,211,230,120, 40,139, 51,227, 31, 93,131, 0, 22,105,244,137, 6,112, 70,211,
- 58, 89,137,199,200, 62, 53, 30, 20,174,244, 76,113, 60,182, 82, 52,226,226,244,112,234,100,150, 14,239,100,172, 83,108,112, 66,
- 93,180, 18,152,151,250, 42,150, 72,159, 14, 99, 57,143,117,182, 88, 44,246,135,151,148, 60, 3,121,193,183,186, 53,206,148, 54,
-163,218, 25,155,134, 17,116,128,244,107,154, 28, 40, 63,219, 19,188,164, 60,213,226, 65, 92,155, 76, 47, 45,144, 89,228, 69, 44,
-177,167,255, 34, 81, 59,106, 11,113,151,170,118, 42, 34,245,241,198, 61,243, 34, 19,144,161,217,154, 1,228, 38,176,132,247,255,
-232,168,239, 94,124,245,215,195, 35,146,145, 52,132, 94, 88,241,106,255, 52,200, 85,108,125, 41,192, 96, 60, 45,113,116, 76, 67,
-164,243,210, 45, 9,163,231, 73, 43,124,234,162,220,213, 10,108,136, 61,220,168,177, 96,122,126,135, 77,116, 17,218,220, 68,212,
- 81, 10,104,234,176,178,217,131,114,101,123,206,174,243, 64, 33, 89, 63,179,105, 20,165, 30,204,206,123,186,219,209,246,209,199,
-233,144, 65,155, 26,118,178,240,206,195, 36,252, 9,115, 5,200,231,216,218,206,190,213,216, 56,236,246, 80,213,177,137,168,148,
-200,158, 6, 21,173,210, 11, 10, 9, 66, 89,210,245,219,155, 32,134,118,221,238, 27, 80,132, 87, 84, 45,141,240, 96, 83,172, 40,
- 7,202, 32,131,112, 27, 26,182, 33, 10, 85, 86, 86, 33,190,165,187,235,116,142, 85,211, 42,176,209,114, 0,172, 40,204, 14, 56,
-220, 83, 22, 54,119,226, 67,172,232,255, 2,144,116, 37,187,113, 21, 81,180, 94, 13,175,222,212,221,177,131, 25, 68,162, 8, 19,
- 11, 41,114, 16, 66, 98, 7, 97,201,134,255, 96,193, 63, 33, 62,129,143, 96,203, 14, 22, 1, 9,164, 88, 33,161,229,182,123,120,
-115, 77,156,243,178,180,221,139,118, 85,221,123,207,185,117,234, 92,245,237,247, 95, 77,105,238, 66,209, 79,156, 84, 56,210,142,
- 50,133, 0,242,233,178,149, 86,192,207,200, 41, 40, 88,166,225, 62,135,228,109, 94,174,179, 70,168,210,117,138,110,144, 86,154,
- 10,101, 45,165, 1,135,172,208,149, 64,121, 52,239,127,215,252, 50,111,255, 24,204, 70,129,119,226, 56,148, 90, 53,180,109, 18,
-178,162,186, 38, 20, 73, 47, 51, 90,240,225,101, 2,136, 88,116, 19, 25,226, 51,129,254, 83, 36,206,191,202, 42, 80,183, 42,220,
-112,184, 40,111,172,252,232,245,246, 66,165,110, 70,156,113,150, 8,141,149, 20, 87, 68,154,249,182,221,221,222,236,110,222,108,
-155,126,252,244,224, 63,209,250,243,234,252,217,217,199,151, 27,234,221, 2, 69, 53, 20,244,170, 84,178, 87,148,175,136, 25,218,
-227,225,209,103,171,245,217,227,191,126, 63, 96, 13,100, 69, 77,110, 39,133, 99,123,213, 83, 76,142,122, 20,144, 11,147, 31, 92,
-206,169, 25, 78,244,162,237,120,121,100,116, 86,121,112, 81, 69, 91, 88, 65, 75, 86,170, 17,134,152,207, 81, 24,241,234,205,221,
-243,167,215, 23, 87,218,119,109, 34, 4,164, 99, 59,128, 26,240,160, 76, 52, 17, 98,139,148,147,205,189,180, 52, 96,137, 36,141,
- 34,155, 54,241,157, 1, 30,187, 1,206,216, 38,127,239,234,167,159,127,221,223, 29,154,186, 70, 17,244, 52,151,101, 54,231, 52,
- 86,156,180,104,109, 20, 10,124, 28, 65, 89, 57, 27,217,195, 89,220, 14, 21,209,196, 42, 3, 44,241, 37,159, 11,234,154,158, 13,
-154,170,189, 44,143,238,109,105, 84,231,150,209,205, 65,244, 10, 68,200,133,153, 90,203,224,237, 74,205,211,176, 59,137,203,199,
-215, 63,252,120,249,245,139,189, 16,175,135,125, 71,147,101, 98,225, 69,211, 41,151,145,175,110,121, 65, 4,144, 22,128,203,188,
- 58, 9,154, 83,119, 34,180,200,135,169,219,251,211, 60,182,187, 56,222,143,199,118, 28,239,195,250,188,124,114,253, 80,157, 59,
-223, 59, 49,113,128, 72,192,185, 11, 50,158, 40,140, 14,168,113, 39,128, 64, 66, 25,179,143,238, 62,133,131,231,108,150,126,226,
-248,162,134, 51, 24,241, 13,120, 5,101,211,166,178,233,242,203,183,219, 57,187, 71,230,191,120,144, 38,119,251, 50,238,217, 90,
- 35, 24,166,198,147, 89, 16, 56, 7, 11, 0, 72,168, 17,184, 17, 17,165,168, 54, 49, 97, 42, 22,187, 94,193,214, 13,151, 74,114,
-202,116, 60, 19,235,167, 87, 47,129, 4,238, 90,148, 93,107, 20,197, 84, 13,152,214,226,132, 49, 77, 40, 18, 45,162,148, 18,139,
- 96,216, 39,164,110, 59,247,236,250,141, 57, 61, 98,143, 0,249,246, 68,126,163,171, 48,205, 66,114,212, 56,194,135,179,194, 29,
-199,252, 33, 43, 26,203, 27,245, 34, 51,194,206, 20, 71,122,166,126,106,109, 77,142,207,231,216, 93, 80,131, 99,103, 30,125,241,
- 36,254, 57,255,251,219,233,168,193,162,186,255,248,190, 51,234, 48, 32,145, 2,223,246, 97,114, 32,241,156,152,213,237,187,191,
- 71,196,159,217, 20,149,204, 11,207,135, 71,178,210,118,169,211, 78,142,177,150,168,195, 46, 71,198, 90, 94,143,201,192,217,122,
- 42,103, 40,251, 94,106,231, 71, 44,197, 20,251,180,104, 0,106,142,114,213, 67, 54,203,108, 39,243,117,239,176, 5,100,241, 10,
- 12,195,224,128,160, 94,112,152, 81,163, 65,245, 6, 64,136, 34, 80,208, 51,225, 63, 73,133, 66, 90,228, 85, 53, 78, 7, 88, 14,
-184,111,239,104,188,180, 40,238, 2,168,254,221,144,198,192, 57,214, 96,169, 64, 80,200,121,128,161, 88, 30,132,142,101,163, 42,
- 50, 31, 0,251,232,140,143,194,217,131,143,124,251, 36,177,102,168,167,209,122,241,240,131, 54,127,241,205, 63,187,109, 29,241,
-219, 18, 20,197,200, 28,168, 93, 42,159,249, 26, 95, 0,235, 55,148,107,157,235,242,172, 84, 25, 49,183,219, 0,203, 99,155, 75,
-105,149,241, 67,145,234, 92,207,146, 61, 8,148,135,119, 26,156, 44, 6, 11, 2, 77, 23,113, 95, 0, 12, 79,105,205,238,191, 24,
- 23,202, 71,175,167,198, 22, 15, 62, 4,244, 92,197,114, 46,138,172,228, 78,101, 52,167, 68, 36,204,169,171, 1,129, 75,164, 1,
-107,230,193,131,124,230,166, 6,163, 77, 77, 65,107, 13,159, 55, 64, 99, 93, 38,241, 19,214,202,241,149, 53,159,153,232,146,222,
-196,158,105,195,146, 17,135, 1,153,114, 10,162, 0, 37, 96,243,144,137,144,109, 48, 93,175,169,171,199,182, 80,173,133,147, 84,
-148,251,105, 14, 43,147,173,188, 14, 43, 59, 7, 75,127, 49, 28,107,215,204,174,227,189, 15, 32,177, 97,159, 10,133,254,127, 1,
- 72,186,150, 28,201,137, 40,104,231,207,118,217,174,234, 70, 93, 61, 51, 32, 90, 72,204, 6, 22, 12, 18,108,184, 15, 27,142,193,
- 93,184, 1, 39, 96,137, 88,194,102, 4, 66, 48,160,233, 30, 84,116,117,185, 92,118,254,156, 73,132,185, 64,165,203, 47, 51, 94,
- 68,250,189, 23,234,254, 48,220,158,167, 28,204,164, 22, 26, 95,101,126,155, 0, 96, 90,107,170,114, 48, 2, 47,199, 24,126, 3,
-247,156,239, 8, 26, 26, 45,180,167, 43,148,170, 53,100,176,145,224,146,122, 89,134,190,147,201,181,115, 83,250,171,102, 91,247,
-170,206,231, 25,187,153,135,103, 73,149, 98, 47,210,218,196,232,177, 93,156, 2,129,203, 72,184, 35, 0, 61,246, 29,195,142, 93,
- 91, 57, 68, 56, 44,235,232, 63,126, 80, 65, 6, 71,218, 58,149, 28,163,157,230,240,251,254,250,245,139,241,203,223, 14,113, 43,
- 78,177, 6,125, 2, 87,179, 42,251,192,193, 32, 23, 89,156,235,242, 60, 92,230,241,254,231,163, 77, 89,170,125,155,244,245, 93,
- 27, 62,249,112,247,233, 7,119,191, 62,232, 95,230,199,191, 12, 45, 86, 13,210, 18,100, 88,140,231,241,239,127,191,250,236,197,
- 79,175,110,127,252, 97,232,203,105,147,187,110, 1, 53,173,193,239, 61,152,164, 96,246, 96,239,181, 81,197,172, 88, 10,229, 88,
- 24, 73,147,137,169,120, 18, 56,238,121,132,232, 53, 32,173, 53, 27, 21,154,164,129, 20,157,190, 63, 29,190,251,254,143,111,239,
- 94,245,250,207, 81,152, 56, 38, 80, 26, 16,115, 78, 97,215,190, 40, 26,122, 21,147,182,176,136,136, 64,160,251,117,236, 43,150,
-173,161, 84,117,117,235,166,176,121,214, 64,203, 62,188, 61, 75, 22, 54, 6,185,122,137,207,216, 21, 58, 65,193, 64,219,123,226,
- 18,117, 4,212,223,121,204, 59, 73, 43, 34, 11, 45, 14, 16,246,185, 2, 35,206, 32,169,205,150,139,129, 47,114, 32, 57,118, 50,
-146, 87,171,242, 85,147,112, 40,109,210,189, 17,143, 45,131,179,241,177, 43,211,187,199,147,214,187, 47, 94,190,252,250,155,253,
-179,143, 14,197,252,230, 18, 64, 10,153, 78,192, 66, 18,117, 71,201,138,107, 67,231, 70,100,164,236,150, 18,120,184,184,114, 10,
-238,120,241,167,232,171, 56,189, 83,211,155,181,116,208,165, 33,228,244, 84, 52,187,205,243,143,183,226, 57,168,213,178, 32,219,
- 87,116, 87,205, 51,248,123,140,187,178, 60,132,252,143, 77, 86,151,201, 22, 19, 71,100,130, 20, 10, 11,184, 91,242,153,227,130,
-248,158, 50,237,160,145,251,120, 43,190, 7,118,232,203,124,132,100,242,199,119, 99,215, 53,253,123, 86,158,216,123, 42,162,105,
-101,120,194, 51,202, 2,112, 40,242,204,158, 77,215, 87,153, 5,136,156,219,219, 52,129,189,230,188,133, 23, 69,175,138,181,227,
-135,140,226, 74, 68, 49,164,163, 15,173,212,120,108, 54, 34,232,121,210, 27,177,208, 19,232,106, 98,205,251, 4,248,186, 38,246,
- 44, 10, 72, 15, 58,206,110, 77, 97,133,187,164,174,206,105,174,233,198,164,199,180,149, 53,226,236, 29,143,117, 31,216,220, 47,
- 56, 71, 32,120, 64,147, 3, 94, 97,145,230,255, 22,125, 22,200,164,232,251, 98,153, 32, 59,140,164, 57,156,137, 71,117,122,253,
-118, 18,195,196,246,128, 68,143,218,226, 40, 57,255,143, 19,195,216, 3, 76, 23, 31,186, 56, 60,136,253, 33, 29, 31, 31,199,155,
-243,245,231, 55,239,203, 10, 24, 33, 71,151, 54, 10, 79, 14, 42, 37,155,188,241,188, 58,226,101, 57,141,221, 5,180,120,194,143,
-180, 26,218,101, 24,140,159,112,138, 56,101, 18,171,204,129, 78,130,185, 2, 4,243, 30,124, 65,156, 0,186, 6,146, 67,238,172,
-209, 80, 50,218, 48,211,129,225,210, 38,140,195,157, 28, 80, 70,100,219,113,178, 66,151, 12,242, 4,155,192,240,238,214,182, 67,
-179,145, 72, 47,108, 59,204,113,211,136,121,225,157,233,226, 75, 40, 27, 64,106,147,121, 27, 81,173, 26,158, 85, 5,216, 94, 6,
-162,221,220, 8,121, 44, 89, 80, 60, 22,172,227,194,150, 74, 1,228, 37, 93, 6, 58,150,214,117, 81, 7,131,231,103,137, 39,254,
-171, 7, 84,233,208, 35,154, 44, 85,106, 98, 86,142,203, 94,202, 65,178, 92, 9,199, 24,202,210,202,170,214,213, 6,116,194, 41,
-193,249, 14,136,142,229, 32,183, 64,223,128,136,183,198,146,114,136, 35,232, 88, 11, 85,199, 15, 53, 30,113, 83,211, 50,155, 65,
-205,226,160,170,161,161,231, 89,230,119, 25, 68,193,229,190,107, 1,214,107,241, 91, 66,152,158,102, 99,122, 96,177, 4,189,209,
- 44,168, 64, 2,140,131,220,138,226, 98, 91, 97, 26,221,174,246, 81, 96, 88, 96,207, 14, 26,190, 88, 47,168,243, 52,145,117,213,
-160,209,121, 94,244,122,229,222, 86, 21, 68,161,106,133, 56, 21,233,105, 9,190,118,102,166, 43,166,219, 55,190,220,202,177, 26,
-107, 31,177,129,144,158,166,185,175,179,171, 3,132,217,201, 94,197, 14,140,206, 6, 78, 59,118, 41,196,255, 4, 32,233,106,118,
-228, 38,194,160,251,207,221,182,103,102,103,181, 67,164, 16, 17,130, 56,128,162,172, 68, 34, 14,192,129, 75, 30,131, 60, 29, 23,
-110, 60, 4, 87, 14, 92,208, 2, 17, 40, 2, 20,101, 66,118,119,102,199,158,177,187,221,221,166,202,121,128,217,245,140,187,191,
-175,170,187,190, 42,245,228,235, 39, 12, 97, 78, 52, 4,198,226,185,147, 21,213,112,146, 83,149, 99,152,147, 43,155,114,152, 22,
- 6, 0, 2,157,184, 60,103,179,229,112, 35,251, 38,218, 81,205,224,156, 74,148,189,170,148,141,246, 12,220,173,201,139,229,163,
- 47,196,207,254,245, 31, 99,181, 20, 6, 72, 34, 10,154,113,106,208, 23,173,107,222, 41,130, 75,153,177,120,111,162,239, 86,197,
- 28, 63, 77,137,212,184, 68, 63,152,243, 35, 19,202, 20, 96, 44, 54, 2,125,189, 58, 16,248, 1,196,177,108, 30,252,245,106,125,
- 76, 55, 22,168,106, 0, 34,233, 38,195,196, 67,160,170, 48,143,188,139, 80, 13,102, 48, 14, 47,206,203,253,233,245,245,171,171,
-237,175, 47,255,187,139,182, 89, 45, 63,168, 15,157,234,119, 99,197, 65, 70,242, 43,108,154,208, 86,235,248,248,203, 7, 87,191,
-171,119,219, 91,192, 18,170,124, 50,167,105,120, 63, 77,215, 16, 94, 8, 4, 77, 39,116,224,223, 76,131, 75,116,210,233, 72, 75,
-255,172, 59,192, 50,105,188, 68, 43,191,168,115, 79, 19,112, 48,201, 18, 96, 97,183,223, 94,222,255,116,179,222,246,109, 50, 11,
- 71, 1,163, 0,144,162,142, 86,197,227, 84,226,103,177,120,223,156, 64, 3, 12, 67, 93, 18,158, 40,118, 86, 73,208,205,113, 23,
-151,143, 63,250,247, 55,243,195,143, 63, 41, 0, 20,173, 5, 19,112,184,139,192, 34,162,157,227,213, 81,185, 12,143,205, 13,253,
-203, 4, 39, 90,231,165,182,152,101,112,180,119, 4,171,107,166, 3, 74, 74,169, 85, 27, 51,125, 4, 11, 2, 36,224, 8,124,137,
- 74,133,202, 27, 95,224,113, 26,192,227, 22,207, 17, 15, 97,243,252,219,203, 23,223,169,205,199,127, 78, 67, 55,244,116,191, 81,
- 76, 12,119, 20,223, 0,142,166, 57,247, 8,203,122, 64,135,153, 80, 16, 81, 87,243, 33,245,111,125,215, 38,191, 79,221,117,113,
-125,235,253, 48,208,111,254,200,161,235,212,139, 15, 63, 95, 62,124,118, 22,168,121, 6, 33,154,205, 10, 60, 79, 27,211, 62,199,
- 62,199, 22,117, 28, 59,143,237, 62, 94,235,116, 72, 98, 79, 15,211,204,172,202,130, 14,190, 53, 13,108, 64,154, 28,157,174,243,
-197, 39,103,195,195,167,255,108,143,231,188,196, 61,185,123,155,179,225,237,176,187,153,146,203,193, 76,179,168,137, 86, 47,120,
-246, 70,224,221,240,218, 26,176, 94,162,235, 99,117, 77, 26,101,132,158, 1, 5,239,245, 13, 51, 90,208, 85,243,170,216,124,118,
-249,203,155,120,183,123,183, 48,248,216, 40,129,199,123,107, 15, 1,197, 88,161,161, 19,241,161, 60,178, 76,166, 86, 5, 52,230,
- 80, 0,141,112, 20,182,125, 63,108,199,212, 1, 1,150, 59,210,125,213, 97,215,152,200,145,135,206,209, 1,222, 70, 9,144, 72,
-117,190,102,200,125,198, 70, 56, 81, 23,232, 59,105,208,239,179,197,159, 52, 52,151, 20,245,250, 98,188, 81, 87,223,255,189,239,
-246,183,178,187, 1, 42, 14,137,202,119, 5,248,163, 60,141,221,153, 88, 22,152,247,119, 36, 80,156,106, 43, 83,235,219, 55,222,
- 28, 85,243, 8,100, 89, 6, 32,190,164, 76, 71,166, 52, 1,173,119,101,159, 40,226, 1,160, 86,129, 78, 57,153,248,184,192, 46,
-169, 26,102, 43, 57,116,145, 41, 25,151, 74,188,231,193, 36, 46, 57,193,159,124,101,164,215,214,169,113, 53, 57, 20,133,181,116,
- 86, 59,160, 95,173,135, 21, 86,130, 48, 77,177,180, 5,227, 10, 74,169,128,195,129, 80,106, 10, 16, 52, 85, 61,133,176,156,174,
-226,201, 44, 5,251,108,162, 3,232, 46, 77, 1, 37,157, 35,152, 0,145,230, 60, 29,122,234,131, 37,148,104,197, 96, 0, 52,223,
- 23,142, 30,237,226, 92, 0,148,163,169,218,149, 11,174, 42,234,111,190,122,121,244,129, 6,166,149, 1, 48, 34,184,180,248,156,
- 9, 94, 27,236,190,146,211, 24, 26, 16,194, 68, 60, 33,170,143, 4,174, 46,106,169,232,183,137, 66,143, 95, 82, 80, 27, 79, 55,
- 86,135, 39, 91,226, 93,152,129,162, 4,146, 69, 59,161,173,240,212,202,213,156,101, 53, 6, 59, 38, 21, 23,188,198, 53,150,118,
-213,150,229, 72,211, 25,171, 4,187,155,142,204,134, 40, 79,137, 65,190,177, 28,153, 26, 5, 92, 63,187,232,161,130, 48, 8,152,
-103,200,104,167,102,170, 51, 35, 62, 82,148,193,245,150, 9, 95,224,148, 40,231, 89,232,138, 62,164, 32, 94,148, 72, 24,192,144,
-114,208, 62,219,158,129, 82, 28,198, 62, 44, 10,219,148,174,143,161, 28,141,162, 28, 32, 24,158,228,128,241,122,254, 39,203,251,
-226, 19, 47,169, 81, 11,141, 73, 3,123,136, 10,128,226,128,230,255, 11,192,209,213,243, 72, 78, 4,209,110,247,135,187,237,249,
-216,133, 97,225,238, 56,145,158, 78,128, 46, 67, 23,144, 19, 67, 64,192, 15, 37, 1,233, 50,180, 18, 34, 66, 32, 2,164, 61,193,
-125,104,197,126,141,199,118,183,221,238,230, 61, 39, 19,142,236,118,213,171, 87, 93, 85,175,212,243, 23, 79, 40, 33, 61, 30,195,
- 24, 8,101,112, 61,228,150, 35,144,135,123,102, 16,135,225, 62,101,158,145, 22,179, 0,237,248,179, 53,237,228,230,250,108, 82,
-237,182,228,157,204,114, 7,254,182,109, 9, 39,217,133, 20,157,187,120, 97,127,157,174,255,202,124,118,132, 41,224,251, 25, 50,
- 29,206, 68,155,150, 16,201, 45,106, 45, 1,178, 10,188,233, 38, 36,142,210, 6,149,241, 85, 50, 59,156,243, 58,222,185,220,107,
- 13,122,154,211, 16, 64,188,230,229,230,112,177,113,253,211, 63,222,191,113,220, 47,219,135, 99,233, 69, 28,122,206,163,216, 25,
- 41,113,176, 9, 4, 49,108, 29, 14, 14,111, 1, 38,236,156,205,253, 24,222, 92, 93,255,217,229,157, 62, 60,170, 79, 81,223,129,
-104, 35,126,224,148,164,149,253, 16, 14,159,181,155,253,147,171, 75, 57,142,111, 83,150, 72,101, 96,140, 28,208,167, 36,189, 16,
-155,165,186, 71,114,183, 14,175, 10, 68,193, 68,213,178, 74, 58,228,141,163,210, 30,116, 92,246, 76,218,245, 13,199,238,165,159,
-197,153,144,221,105,234,131,126,249,249, 33,159,254, 29,169, 51,200,211,174,192, 72,236, 86,204, 31,176, 51, 88, 78,148,100,169,
-121,200, 90,178, 98,196, 69, 26,136,201,253, 78, 10,111,141,171, 31,125,245,211,171,219,159,127,252,229, 99,229, 96,175, 6,166,
-153,121, 23,100, 24,126, 16, 35,157, 85, 32,212, 53, 69, 5, 98,109, 29, 11,164,182,161,115,216,197, 17,180, 28, 91, 32,141, 80,
-163,145, 94, 24,222, 55, 89, 69, 9,130, 86,114, 81, 75,209,205,158,136, 55,102,124, 70,110,155,154,194, 88, 54,159,126,255,221,
-179,111,127,152,221,254, 58,245, 57,142,156,149,205, 84, 83,129, 47, 38,118,254, 23,197,169, 74,209, 83,214, 23, 12, 25, 33,246,
- 8,116, 14,199, 35, 87, 18,158,114, 57,190,159,198,119, 48,129,201,198,210,245,235,152,117, 41,174,241, 95,126,179,207, 7, 0,
-123, 96,204,140,178,132,138,107,219,145,103,222,195, 81,211,114, 76,120, 72,182,202, 28, 87, 6,175,216,225,193, 93,145,221, 68,
-173,174,196,174,127,182,236, 43,155, 63, 42,217,228, 79, 30, 63, 61, 61,253,240,245,213,184,241, 49, 14, 85,152,218,115,144,136,
-127,222, 2, 67,225,178,234, 36,214,114,143,230,150,205,140, 55, 79,222, 86,129, 89,171,144,134,125,138,136, 28,212,157, 33,244,
-150,181, 43, 71, 24, 87,165, 70, 60,254,226,249,101, 23,195,205,157,228,236,103,233,136,159,224, 23,170, 3, 46, 40,142, 52, 46,
- 99, 65, 54, 66, 65,248, 18, 31, 4, 23,132,129, 40,176,111,206,234,211,166,233, 51, 88,156,150,136,163, 0,110, 17,166,117, 4,
- 7, 46, 40, 44, 80,203, 50,125, 69,212,165,211, 42,195,226,116,138,229, 78,219,102,182,205,170, 79, 95,150, 98, 1, 60,153,130,
-194,187,250,247, 87,175, 47,127,123,119,189,139, 83,179,221, 55,245,193, 89,208, 79,227, 77, 93,193,108,135,179, 6,201, 20, 69,
- 5, 43,202, 65,172,225, 11,216,138,132, 34,255,215,119,247,183,211,118, 99,155,139, 86,236,117, 92,202,137,210,210, 84, 51, 17,
- 30,238,149, 7, 94,108,202, 62,138,187,129, 53, 77, 98,154,134, 33, 38,239, 23,187,173,184,155,154, 58, 36,114,168, 53,178,181,
-236, 68,179,103,127, 73, 65,230,217,122,110,254,145,203,198, 58,189,171,244, 86,249, 26, 54,106, 54, 13,143,185,178, 20,161, 89,
-216,152,165,212,134, 67, 23, 44,252,207, 28,113,187, 77,196, 60,239, 53,220,198,151, 60,232, 98,152,100,209, 32,117, 86,147,224,
-174, 41,120, 70,128,169, 37,217, 33,223,148,101,241,107,105,128,237, 75,236,195, 69,178, 56, 88, 96,111,217,138,178,251,250,229,
-223,203,109,101,149, 77, 66, 52,161,112, 20, 34, 9,208, 66,208, 30, 22, 97, 39,141,255,227,230, 31,117,134,143,239,144,110,206,
-218, 81, 25, 3, 70, 48,109,252, 94,174,219,211, 97, 34, 14,244,162, 97, 15,154, 2,182, 78,197,196, 26, 81, 63,229,181,138,205,
-169, 18, 82,191, 46,184, 84,157, 87, 29,203,125,245,152,189, 63,207,125, 61, 45, 75, 50,193,167,216,198,130, 40, 8,100,228, 62,
- 16, 13,122,226, 1, 66, 15, 61, 39,244,193,255,121, 15,168, 77,238,102, 10,148,214,180,147, 42,140, 83,239,178,240,197, 62, 36,
-199,185,177,106,193, 41,101, 13,150,161,220,172,225,131,165,138, 56, 57,223,222, 3, 89,170,185,201,202, 71,139,136,217, 82, 58,
-222, 34, 27, 53,149,167, 6, 49,171,225,130,221, 98,164, 45,160,110, 19,165, 82,149, 52, 17,159,135,101, 11, 61, 15,158,130, 67,
- 38,254, 47, 0, 75, 87,206,227, 72, 17, 70,171,235,236,234,195, 51, 54, 94, 45,247,106,119, 69,194, 34, 33, 96, 67, 18, 16, 18,
- 33, 25,255,137,152,127, 68,184, 17, 36, 28, 2, 1, 2, 33,134, 25,118, 60, 30,183,187,203,213,213, 85,188,103,145, 56,242,213,
- 85,223,241,222,119,170,103, 31,190,183,224,200, 19,172,214, 57, 34,104,166, 56,225,139,205,162,113,131, 67, 58, 0,250,169, 46,
-207,149, 7,118,130, 24,107, 87, 4,109,141,181, 14, 70,102,194, 85, 71, 54,162, 93, 38,117, 4, 7, 84,198,142,182,228,157,126,
-251,221,254, 59,125,255, 67,152,186,202,185,180,201, 28,198,205,104, 22,132,183, 97, 77, 1,157, 77, 3, 45,231,194, 97,213,114,
- 51, 17,174,115,174, 89, 24, 3,237, 79,227, 57,215, 90,177, 26, 65,213,101, 60,204,233, 80,205,112, 66,167, 74, 12, 23,253,227,
-159,126, 86, 99,186,177, 12,227, 0, 77,203, 20, 64,194, 98, 9, 5,212,120,156,211, 0,187,112, 61,134,104,102, 14,240,193, 49,
-225,242, 96,228,171,227, 52,254, 54,202,135,175,117,155,114, 0, 93,176,214,179,239,207,177, 33, 21, 98,248,228,125,167,242,250,
-219, 95,231,121, 60,116,145,101,220, 44,195,149, 38,198,124, 80,165,211,242, 20, 88,179,197,125,106,156, 81,205,118,205, 14,128,
-187,101,236, 29,222,218,197,153, 91,106,116,218, 86, 50,176,145,129,184,255,247,187,155,199,111, 60,127,244,142,153,110,246,113,
-250, 63,187,155, 97,172,106, 89,215, 16, 14,144, 49,144, 69,142, 58,101, 58, 9,204,230,212,148,113,189,196,173,171, 69,255,106,
- 39, 38,247,213,215,223,252,249,215, 31,189,135,234,114, 78, 11, 36,103, 1,113, 17,204,190, 10, 11,100,194, 30, 58, 93,184, 68,
- 28, 0, 69,130,238,209,164,176, 25, 36,192, 69,193,170,140, 73,247,248,243,106, 13,231,104, 56,178, 2,178,217, 24,110, 47,113,
- 35,215,134,194,210,179,179, 77,198, 97,111, 31,173,159,126,241,229,235,159,124,206, 49,144,167,251,145,169, 60, 54, 98, 50, 22,
-202, 78, 33,224, 5,217, 48, 30, 10,227,158, 34, 23,228,225, 20,247, 75,126, 57,132,251,124,248,183,220, 93,205,183,135, 57, 92,
-133,229,192,169,118, 0,227,148,104, 2, 70,249,244,249,131,205, 71,102, 30,241, 75, 21,168, 10,174, 27,236, 28,228,113,222,225,
-240,217,161,191, 28,171,116,171,228,158,241,226, 24,240, 22, 22,175,164, 56,151,129,185, 24, 6,203, 93,225,204, 23,136, 50,136,
- 89,159, 94,249,224,217,174,221,236,174,255, 54, 93, 5,119, 62,233,233,205,246, 97,190,254,241,172,121,198, 28, 11,132, 13, 12,
- 20,230, 8,160,112,196,111, 53,210,177, 60, 81, 51, 69,141,231,176,145,213,167,128,181,172, 47, 23,236,221, 80,149,104,203,147,
-143,223,122,113, 51,221, 93,133,220,230, 19,216,124,204, 58,229, 29,164, 22,103,113, 44,199,196,176,131,231,162,136,243,246,205,
-204,142, 60,186,139,162,134,120, 42, 3,160,114, 16, 45,131, 18, 66,194,221, 66,189, 57,102, 85,231, 6,162, 9,210, 45, 85,103,
-207, 99, 35,133, 57, 39, 66,228, 26, 28,213,177, 74, 52,152, 2,230,226,202, 2,107, 6,163,157,149,219,148,229,246,159,239, 95,
-200,226,155,149,119,160, 89,179, 2,189,247,186, 61,109,237,198, 74,237, 53, 64,180,109, 21, 94,151,149,173, 60,140, 31,172,155,
-246,181,106, 13,231, 44,191,220,143,129, 99,178,218,166, 54, 77, 51,184, 89,178,158,185, 1,212,181,170,245,231,189, 22,194,121,
-189,138,224, 27,203, 50,115,225,145,128,170,148,154, 97,154,154,147,210, 59, 7, 59,187,120,111,241,145,220,131,111, 47, 62, 86,
- 44,117,185,112, 30, 86, 68, 85,173,101,127,178,243,157,102, 14, 78, 47,189,181, 15,250,203,185,164, 30,150, 65,246, 89,199,181,
- 50,222,234, 89,110, 91, 9,131, 31,172, 56,193, 24, 3, 45, 3,201, 16,236,112, 68,178, 72, 34, 44,165,131,254, 36, 46, 98,186,
-100,140,134,139, 81, 45,190, 51,149, 0,142,162, 43,119,166, 25,138,179,194, 83,179, 45,237,103,159,254,146,201, 10,147,209, 86,
-183, 42,136, 99,236, 32,240,209,227, 81,156, 49, 16,255,106, 4,178,169,129,156, 43,230,148,115, 49,222,129,187,233,104,210,160,
-224, 62,143,181,240,135, 52, 36, 91, 92,119,161,125, 2,130,224,124, 19, 51,153, 64,169,163, 86, 85,204,126,205, 85,176,217,224,
- 46, 50,148,106, 85,171, 4,162, 9,237, 63, 41, 63,202, 12,124,214,223,175,240, 55, 23,240, 49,142,253,101,106, 81,152, 38,170,
-177,224, 14, 0, 8, 12,199,156, 0,143, 21,184, 59,107,164, 62,181, 56,152,212, 48, 23,212,223,141,209,104,138, 2, 35,157,112,
-189,192, 16,130, 45,200, 9,188, 78,170, 70,135, 18,227, 22,174, 87,250, 4,121, 90, 41, 49,136,253, 17,119,156, 47,162, 97,117,
-156,190, 47,167, 62,216,138, 51,189, 21, 0, 46,252, 82, 85,119, 64,118,120, 96,198,179, 74, 4,201,181, 71,235,210,127, 2,112,
-116,245,188,149, 19, 81,212,158,111,127,189, 36, 47,129,149, 0, 45, 97,217, 93, 9,241, 41, 10, 68, 71, 77, 69, 71,203,239,161,
-231,183, 80, 64, 65,129, 4, 13,116, 43,173,132, 68,131, 86,187,218, 77,148,151,247, 97,123,236,241,204,112,142,165,116,137, 95,
-252,198,215,247,158, 51,115,238,185,242,195, 79, 63, 24,103,159,194, 17, 40, 58, 82, 82, 80,136,157, 18,106, 12,133, 6,178, 68,
- 13,104,106, 80,133,142, 38,202, 96,184, 26,220,132,210, 33, 82,167,177,242,172,115,224,108,182,172, 27, 51, 0,208,102,132,193,
- 58,159,170,249,232,108,184,218,255, 57, 85,160,116,136,118,133,250,158, 74,185,128, 3, 49, 3, 33,187, 86, 74, 84,162, 26, 35,
- 91,159,217, 14, 82,224, 34, 65,145, 51,150, 38,241, 0, 24,181,216, 75, 57,202, 60, 0, 28,166,128,156, 50, 34,231,130,185, 92,
-180, 23,125,120,250,207,235, 87,205,137, 77, 90, 72, 8,121, 58,249,212, 87,130,214, 77,225,128,162,188,243,110,158,177, 8, 52,
-237, 11, 52,112, 4, 25,112, 30, 0,252,118,127,146, 23,246, 73, 7,132,112,135, 10, 85, 80,186,106,139,128,213,201,210,249,199,
- 95, 61, 48,250,189,191,254,184,149,242,128,213,222, 32,167, 80,108, 26,151, 94, 86,154,195,148,218,161, 4,181, 21,156,190, 84,
-104,195, 35,246, 24,220,236, 57,251,124,212, 52,182,155, 57,126, 90,173,191, 80, 8,227,251, 52, 62,127,209,127,242,244,225, 3,
-243, 38, 13, 35,114, 37,237, 34,253,213, 60,212, 51,181, 8,109,158,187, 60,215, 57,111,203,227,166, 8, 58,203,173,170, 42,189,
- 41,218, 77, 91, 52,239,255,248,211,175, 63,255,242,247,101,109, 76,195,118,102, 10, 40,215, 35,119, 73, 87,127, 58,138,197,168,
-104, 29, 12, 72, 77,135, 51,154,127,101,201, 3,214,181, 71, 90,182, 77,215,224,161, 86, 25,223,197,163, 34,213,114, 83,187, 3,
-112,142, 1,173, 50,231,141, 65,186, 46,242, 82, 34, 56,178,125,120,249,228,251, 31,222,254,242,235,187, 98,185, 29,119,107, 32,
-179, 71, 26, 4,103,230, 43,146,215,161,118,130, 13, 28,233,144, 69, 47,196,110, 94,142,249,212, 79,135,125, 26,222,164,253,237,
-105,216, 77,243,235,197, 14,130,138,238, 25,224,155, 86,137, 55, 62, 92,191,219,124,246,221, 69,180,235,134,119, 47, 57,206, 36,
- 80, 57, 71, 19,154,133,135,186, 97, 34, 65,184,239, 3,199,251,121,217, 31,121,248,146,123, 29,246, 83,244,132,182,124, 75, 5,
-219,145,116, 39, 65,116,177, 62,221,231,143,158,253,247,168,188,221, 1, 20, 3,241, 76, 19,170,241,213, 37,242,235,233,134,174,
-203,220,251, 90,237,111,150,164, 58,165, 70,192,168, 60,209, 76, 15,185, 69,208,126, 1, 37, 18, 89, 56, 41,231,104,159,180,170,
-182, 17,106,233,250,139,143,127,123,117, 58,254,123, 15, 62, 62, 28, 56,121, 41,172,134, 96, 27, 54, 96,209, 28,124,154,114,177,
-224,222,229,139, 80,130,212,131,101,115, 64, 0,248, 56, 5,236, 14, 81, 78, 55,202,160,184, 65, 78,157, 24,191, 7, 13, 49,138,
-200, 53,198,149, 20, 85, 83, 47, 89,217, 64,165,154,212,107,119,219,121,153, 90, 77,201,107, 88,135, 19,240,108, 76,109,175,227,
-179,223, 23,240,133,179,234, 16, 35,245,195,134, 78, 70,116,220, 68,142, 82,180,110,195,221,145,172, 3, 80, 79,201,101,246,206,
-138,174, 4, 42,212,132,235, 98, 56,250,229,165,175, 93,123,177,109, 99,109, 15,248,199, 14,140, 81, 0,116,211,159,131,104, 23,
- 75, 36, 22, 96,156, 82,107, 44,131, 51,156,231,200, 86,171,164, 57, 49, 13,145, 1,236, 21, 2,126, 38,110, 71, 43,246, 16, 41,
-223, 85,192, 18, 20,100,187, 82, 32, 1, 57, 64, 11,142, 2, 94, 42, 32, 22, 73,159, 91, 41, 84,139,187, 83,160,169, 29,251, 44,
-241, 7,248,116, 20,157,180,172, 55,205, 10,237, 75, 42,210, 1,228, 81,240,144,138, 67,238,217, 61,187,172,186, 22,101,129,112,
- 65,139, 85, 4, 43,208, 68,199,244, 54,168, 77,185, 1, 45,125, 39,155,111,190,125,222,123,235, 65, 3,115,243, 22,214, 11,192,
-233,204,218, 0,110, 55,137,109,231,112,229, 89, 11, 14, 77,223, 5, 59,157,251,113, 52,165,159,241, 62, 46, 22, 60, 3, 5,105,
- 84,170,106,172,181, 60, 83,234, 45,158,176, 19, 83, 24,185,125, 87, 90, 51,210,250,198, 34,111,224,209, 9,225,240, 74,242, 80,
-254,102, 44,235,168,140, 1,122,112, 10, 44, 57,177, 37,183,167,133,135, 1, 50, 81,192, 72, 14,224,186,239,138,211, 76,171,234,
-140,196,165,163, 17, 20,249,212, 86, 73,178,196,120, 98,247, 56, 5, 96,180,242,163, 25,156, 1, 95, 1,105,209, 11,176,155, 86,
-173,138, 8,206,184, 87,103,190,154, 98, 28,102,233, 0,140,138,250,142,214,123, 81,140, 8,127,220,182,236,121,114, 84, 46, 78,
-226, 73, 2, 4, 81, 18,153, 76, 91,206,193,198, 98, 80,137,115, 70,144, 1,198, 52,111,253, 38, 0, 57,138,255, 5, 96,233, 90,
-118,220,168,162, 96,223,103,191,236, 25, 39,195,136, 40,128, 34, 2,132,217, 13, 18,130, 85, 62,130, 95, 96,195,191,176,229, 87,
-216,178,224, 19, 88, 32,129, 88, 64,120, 68, 1,194,216, 99,247,243,190,169, 50,108, 70,150, 70,182,102,218,183, 79, 85,157, 62,
-167, 74,221,124,112, 35,244,146, 34, 83, 67, 32,103,220, 62,244, 16, 41, 59, 19,241, 49, 35, 35,217, 42,111, 6, 93,117,154, 45,
- 6, 91,218, 62, 61,152,116, 78, 53, 94, 78,177,206, 12,142,178,233,255, 52, 60,250,177,144,120,187, 21, 24,246,228,253,237, 79,
-131,163, 39,140,140, 62,181, 84,112,168,149,194, 52,213, 18, 56, 13,142,139, 77, 83,126,205,236,170,115,244, 13, 40, 5, 10, 67,
- 36, 36,181, 41,120,128,150, 98,218, 37, 55,108,170,236,202, 10,128, 4,109, 45, 40,255, 87,143, 62,252,241,229,228,150,215, 76,
-156,179,177, 46,241,126,174, 28,110,102,112,116,151,173,114, 80, 1, 41, 46,110, 77, 29, 32, 20, 50, 17,239,142, 78,179, 75,162,
- 81,248,223,126,231,234,194,188, 98,184,157, 97, 39, 84,158,167, 85,150, 20, 90, 91,110,110,175,167,120,245,203,207,227, 28, 78,
-248, 50,106, 14, 60, 50, 6,103,145,132,151, 60,134,206,112,132,100, 57,111, 6,137,115, 22, 83,236,148, 25, 1,191, 40,186,165,
-173, 64, 6,139, 53,144,185, 28,184, 6, 21, 27,126,251,103, 83, 63,254,232,221,116, 28, 15,108,228,199,182, 50, 23,166,118,149,
- 7,127,230,227, 66, 17,112,116, 78,202,238, 68,219,227, 96,163,218,109,223,220, 85,215,111,124,243,245,139, 47,191,250, 86, 67,
-184, 53,245, 28,113, 71, 37,177,114,253,160,165,149, 10,106, 1,138,186,132,238,148,131,224,222, 59,138,190,139,182, 54,165,212,
-114, 99, 84,106,128,199,156,188,228,163,175,200, 89, 31, 72, 79, 25,244, 12,114,144, 30,154,144, 22,112,168,156, 34, 78,119,202,
-177,253,228,246,233,231, 95, 92, 62,126,250, 58,207,211, 58, 14,124,160,194,248,180, 66,107,218,204, 30, 18, 80,137,230, 69,147,
-103,115,116, 9,226,148, 6, 80,214,191,214,245,222,159,238,146,127,185,220,237,227,130,170, 61,148,112,160,223, 58, 61,120, 93,
-153,238, 51,228,198,237,103,143,244,179,102,217, 51, 40,146, 17, 6,160,106,171,230,188,234, 24,195,169, 44, 71,229,142,142,129,
- 73, 3, 74, 55,192, 36,151, 49,104,151, 5,103,157, 32, 82, 42,235,217,243,192,149, 5,226,104,206, 68,132,166,223, 92, 63,127,
-246,253,159,162, 94, 15,126,231,213, 94, 76,227,188, 23,213, 91, 93, 35, 79, 47, 24, 37,195,230, 0, 53, 63,219, 39,182,184, 16,
-228, 70,113,224, 50,113,205,254, 60, 57,131, 98, 7,206, 7,248, 80,124, 20, 93,101,142, 18,109,203,147, 79,223,251,110,175,238,
-254,248, 59,119,245, 4, 30, 35, 36,243,136, 35,243, 5,124, 72,109,133, 51, 68,235,127,197, 7,170,142,107,236, 22, 44, 20,132,
-151,157, 78,177,230, 92,210,188,177,233,152, 77, 71, 39, 17, 46, 73, 17,101, 32, 71, 20,153,112,101, 26,229,136,148,174,158,234,
- 30,191,132, 50,106,192, 9,140,175,171,131,212,228,152, 1,167,142, 22, 98,139,234,182,102,218,175,191,254, 32, 87,217, 41,117,
-238,115, 43,215,218, 11,160,121,109,101,160,209,239,194,157, 23,208, 38,136,252,226, 90,148, 51,102,241,246,208,108, 70,109, 58,
-177,217, 41, 92,187, 33, 12,199,123,185,233, 54, 23,178,132, 41, 49,140, 22, 98, 5,127,118, 27,193,125,232,151, 2,113,210,100,
-111,115,235, 3, 39,180,104, 88,153, 23,145,154,149, 98,101, 89, 37, 84, 2, 74,156, 92, 46,241,179, 40,253, 32,187, 13, 16,175,
-166,249, 67, 17,231,244, 82,167,243,140,195,182,172, 28,106, 22, 38, 50, 4,217, 15, 41, 28,203, 58, 75, 46,212, 79,184,234,185,
-112,158,137, 29,119,147,240,141,148, 19,148,139,103,122,177,107, 98, 23, 68,160, 23,145, 60, 9,112,240,170,213, 76,233, 38,252,
- 84, 18, 58,108,205, 28,253,174, 54,217,246,241,250, 82,248,143,159,255, 62, 29, 0, 0,166, 94,109, 35,135,172,112,219, 86,148,
- 33,184,132,156,205,135,112, 44,217, 29,113,199,132,198, 53,171,216,245, 32,222,117,218,128, 43, 67,114,133,206, 71,223,204, 75,
-106, 65,226, 0,187, 41, 51,220, 8, 34,162,105, 41,215,229,216,156, 69,218, 98,255, 11,222,177, 65,163,186,250,214, 74,102, 15,
-175,163,247,238,172, 42, 26, 58,122,113,217,219, 65,255, 63,164, 73, 69, 69,163,156,237, 97,214,189, 13, 92,137, 18, 49,157,214,
-228, 25,159, 93, 53, 58,117,142,105,174, 76,246, 27,129, 18, 90, 0, 85,232, 73,103,141,219,154, 21, 24, 19,125,161,127, 27,123,
- 82, 37, 91,103, 26,203,211, 47,189,140,186,103, 87,223,131, 38,119, 90,207,237,177, 7,224,204, 80,167,248,127,185,212,186, 58,
- 40,182, 18,130, 77,166,245,106,108, 43, 10, 76,207, 53, 78,167,103,213,255, 43, 0, 73,215,210, 35, 55, 17, 6,251,237,182, 61,
-227,157, 29,178,188,130, 86,136, 72, 81,148, 8, 65, 14, 68,156, 64, 92,184,195,127,226, 47,112, 65,252, 25, 14, 28, 56,112,136,
-114, 34, 18, 18,145, 86, 65,100, 39, 59,227,241,187,221,110,170,156, 57,174, 70, 94,123,218,253,125, 85,221, 93, 85,250,179,207,
- 31,152, 1,163,161,136,157,178, 97,137, 97,217,104,208,222, 66,246,238, 78,133,202,154,162,223, 58,225,181,159,193, 98,150,129,
-107,229, 34,149, 41,183, 99, 47,250,114,246,115,201,163,129,168, 35, 33,130, 99,186,192,128,141,208,188,154,223,123,242,129,216,
-212,127,140, 92,152,203,168, 9,215,152, 93,206,102, 25,149,245, 32, 65,121, 6, 2, 79,109, 67,168, 36,109,113, 70,181,122,161,
- 99,230,209, 31, 64,155,140, 27,100, 77, 56,142,163, 94,215, 11, 25,188, 7,226,142, 54,127,184,119,149,159,199,123, 47, 95,222,
-200,165,195,187, 58,235, 64, 91,245, 16,139, 91,202,161,222,248, 16,142,134, 11,142,104,175, 96, 42, 11, 67,194, 21,173, 31, 1,
-218,116, 87,119,163,187,120,122,159,251,167,201, 22,171, 40,141,118,120,104,166, 93, 51,150,149,126,252,116, 63,134,203,191,158,
-191,213, 83,167, 28,232, 98,220,208, 31, 35, 83,148, 11,208,125, 46,120,181,171, 0, 44,185, 55,239, 0,160,128, 89,102, 9,132,
- 45,141, 73, 62,241,192,108,112, 70,219,247, 23, 87, 88,193,228,208,173,250,254,241,195,126,250,123, 62,250, 4,122, 71,191,151,
- 45, 6,211,105,188, 34,103, 92,198,232,171, 8, 30,132, 90, 36,213,246,209,181,168,231, 95,126,254,243,167, 95,127, 27,155,186,
- 42, 93, 81, 90,122,213,208, 68,148, 78, 6,173, 3,126,203, 2,117, 14,178, 96,173,154,251,157,246,218,166,204, 43, 14, 19,238,
-139,251, 63,206,169,141, 23, 0,106, 78,131,248,199,204, 91, 93,224, 69, 64, 63,246,106, 49,237,209,184, 44, 12,221,152,178,203,
-111,158,125,250,227, 15, 50,223,191,166,174,167, 15,224,110, 73,173,169, 98,171,196, 86,224,233,129, 84,231, 86,160, 31,213, 82,
-189, 17, 75, 55,163,184,157,111,194,249,144, 78,205, 92,255, 23,250,195,178,212,179,155, 88, 47,152,165,129,145, 43,228,216,241,
-220,203,179,239,174,238,127,187, 11,117, 75,171,194,119,232,147, 41,106,138,231, 51, 90,138,194, 65,142, 1,179,167, 70, 45,248,
- 10,166,242,173,180,253,140, 33, 7, 85,232,198, 40, 91, 10, 27, 79,158, 90, 4, 89,218, 37,215, 41,159, 54,159, 92,150, 95, 60,
-122,254,207,191,178, 65,129, 70, 75, 59,191,179, 27,250,104, 87, 85,243,177,105,106, 77,183, 78,214,148,213,169, 13,117,145,126,
-181,248,228,120, 14,186, 97,172, 46, 99,137,134, 17,160, 59, 22,236, 91,160, 69, 50,118,241,250,203, 7,191,223,164,219, 87,199,
- 34, 19, 20, 3,246, 83, 59,209, 10, 13, 52,227,108, 64,177,117,125, 98, 28, 1, 61, 48,102,131, 73,209, 9, 87,212, 33, 96, 62,
-117, 52,235,232,134, 9,220,192,214,242,194, 83, 58,150, 6, 31,232,224,108,243, 25,184, 47, 29,103,157, 11,121,148, 10, 93,216,
-173,118,204,104, 51,168,173, 34, 21, 92, 68,226,126,255,104, 23, 48,116,235,104, 67,155,235,143,175, 14, 47, 94, 52,167,163, 40,
-183, 40,201, 75, 63,177, 46,132,166, 19, 83, 1, 54,156,171, 62, 67, 45,145, 3, 73,175, 88, 83, 47, 84, 7,116,100,151,209,165,
- 53, 51, 37, 99, 55, 50,170, 62,140,175, 79,253,222,138,203, 15, 55,174,146, 53, 26, 68,160,146,142,180,218, 59,134,159, 2,154,
-180, 64, 80,146,241,139,192,106,139, 66, 45,218,181,140,174, 49,128,222,192,242, 41,228,105,212,151, 11,110,143, 90, 95, 77,219,
-169, 41,166,183, 52, 87, 76, 57, 90, 71,204, 6,112,251, 20,134,140,155, 36, 0, 56,105, 13,182, 23,185,117, 18,247,196,147, 70,
-174,101,255,142,126, 10,147, 42, 35,115, 60,125,152, 81,205, 35,151, 95,104,246,105, 11,246,167,130,135,251, 5,152,245, 78, 38,
-111,196,222, 11,220,115, 5, 32,207,192,247,233,226,122,223,125,245,245,225,238,176,248, 77,191,173, 84, 43,131,181,161,200, 24,
-129,108, 82, 89,134, 59,185, 71,101, 44,116, 48,219, 50,103,150,138, 44,245,160,186, 40, 50,115, 2,252, 49, 92,141,116, 6,160,
-116,202,108,169,163, 43, 65,183, 24,255,138,114, 46, 47,206,237,128,135, 85,222,197,206,152,161,152, 65, 59, 38,193,227, 33,184,
- 82,164,239, 69, 26,139,205, 5,254,160,122, 16, 2, 48, 29,234,183, 99,180, 11, 70, 56,226,119, 2, 30,114,137,201,186,142, 27,
-203,196,227, 21,222, 46,103,128, 31, 38,158,221, 82, 43,131, 20,244, 23,176, 67, 68,255, 26,197, 6,212, 73,250, 35,173, 81,134,
- 82, 68, 89,216, 86, 79, 3,165, 66, 1, 48,133,122,147,133, 39, 69,120,236, 87,182,248, 93,106,252, 71,174,203, 36,102, 40,176,
-194,141,116, 88,226,158, 60, 55,182,168, 71,213, 38,164,158,176, 77,153, 28, 23,249, 95, 0,146,174,100, 71,142, 34, 10,230, 82,
-153,181, 79,143,105, 11,204,176,140,192,178,198, 39, 16,134, 3,103, 14, 72, 92,144, 63, 10,241, 9,252, 3,223,192,145, 11, 7,
- 14, 28, 65, 66, 26,143, 44, 25,188,140,167,183, 90,114,171, 36,162, 56,182,212,234, 37,235,229,123, 17,153,241,226,233, 79, 30,
-126, 60, 78, 5,117, 1,216,153,170,143,162,201,148,106,204,120,171,194,111,170,101,137,172, 59, 81,152, 91,113,229, 41,203,139,
- 85, 98,179,245,202,188, 76,235,242, 33, 36,218,161, 0,166,175,246,210, 20, 85,251, 55, 83,216,118,151, 87, 31, 60, 27,194,107,
- 41, 26,224, 65,100,220,140,140, 6,246,202,171, 68, 83, 88,154,168,101,219,164,136, 7,235, 75, 77,243, 16, 21,107,122, 80,200,
-163,217, 0,223,143,116,237, 61,142,113,113,102,224, 24,120, 16, 60,181,148,116, 56, 92,244,118,123,121,115,187, 92, 31,144,110,
-217, 6,199, 27, 92, 73,169,148, 67,224, 88,222,218, 72,172,224, 8,112,228,114,208, 84, 10,181,120, 24, 94,123,112, 1,113,123,
- 23, 31,127,138,250,123,160,144,161,162,202,128,205, 10,138, 62,149, 49,198,238, 92,125,246,228,193, 97,232,255,250, 19, 5,248,
-100, 1, 93, 83, 5,132, 89, 24,160, 74,196,186, 28,108, 2,192,117,158,151, 97, 11,199,108, 88, 14, 98, 71, 70, 97, 71,149, 98,
- 54,193,234,227,137, 38, 14, 95,137,251,248,218,155,111,159,244,170,248,125,220,151, 17, 57, 60, 13,153, 52,158,134, 31,153,206,
-103,247, 68,168,155,210,119,143, 74,123,190,121,243,183,253,225,199, 95,126,250,249, 87, 29,210,253,190,227,201, 22,221,114,104,
-104,192,251,105,205,203,102, 41,129,233,216, 27,224,193,239, 51, 39, 33,129,164,207,181, 86, 30,128,199, 32, 74, 40,247,107,120,
- 64,132,224,235,207, 69,141, 5, 86, 77, 63,206,177, 13,148,215, 52,194,141,146,195,208,139,139,167,223, 92,124,247,212,235,246,
-165,199, 58, 3,144,209, 71,196,112,192,123,142,235,240, 58,210,244,101, 24,197,108,241,225,242,224,231,183,241,180, 11,195,237,
-184,163, 78, 38,228,231,211,238, 69,206,195,194, 97,246, 71,149,157,164, 41, 86, 91,248,183, 97,220,165,143, 62,239, 30,125,127,
- 14,188, 19, 29, 59,117, 41, 12,167,111, 98, 49,239, 67,160,133, 92, 76,167, 28,239,226, 2, 32,204,171,125,228,119, 84, 71,229,
-240, 89,222,158, 50, 29,157,204,234, 84,148,105,136, 38, 56, 54,158,253, 92,241,189,139,251,195,251, 95,220, 60,251, 23,228,221,
-197,108,204,236,130,189, 29, 80, 6,196,135,221,166,206,175,176,244, 41, 24,181,165, 31,172,112,171,141, 61, 32, 52,181, 43,192,
-137, 88, 31, 10,144,104,134, 12,190,213,229,241, 4,190, 65, 25,165,176,249,242,171,135,191, 13,238,250,143,157,162,241,147,125,
- 7,113,137, 76,188,158,201, 84, 33, 17,197,100,108,108,206,240,221, 87,190,202,203, 56,217,136, 29,134,112, 75,190,234,228, 12,
- 86,239, 0, 25, 16,101,200, 6,101,147, 5,112,252,177,149, 60,240, 0, 69,163, 35,146, 1, 21,167,207, 27,208,150,192,191, 74,
- 40,219, 97, 92,163, 79,232, 14,241,111,128,243, 26,188, 51,205,135,114,251,110, 57, 9,247,234, 58, 78, 81,183,109,145,131,202,
- 38, 55,253, 82,177,135, 5, 97, 92, 7,187,241,200,212,133,228,177, 61,184, 81, 89, 98, 65,172, 72,228,242, 84,177,246, 74, 86,
-133, 42,123,124,103,124,113, 55,236, 7,125,222,169,134,202,248,194,103, 23,207,212, 82,161,232, 90, 14,239,181,246,100, 36,229,
-235,199, 68, 23, 49,187, 90,224,219, 72,199,137,227,178,146, 28, 57, 87, 68,217,108, 1,167,146,160, 0, 87,231, 49,224, 28,104,
- 91,230, 22, 95,112, 58, 32,167, 98, 2,176,209,125, 45, 24,142,184, 98, 27,157,152,144,206,217,255, 67,192,143,151, 75,225, 23,
-198, 26,202,236,248,255,148, 0, 35,122,150, 21, 16, 69, 84, 4,177,202,221, 5,162,116,212,248,229,170,168,144,206,120, 85,116,
-102,211,131,175,175,110,174,190,252,199, 13,141, 61,218,136, 71,105,102,172,164,177,101, 84,128, 75,171,109, 58, 50, 1, 89, 43,
-130,223,199,145,102,143,203,166, 76,181,172,121,237, 10,226,162, 81, 16,192, 28,194,136, 63, 53,129, 67,184, 38,201,131,180,155,
- 4,162, 86,225,123,219,198, 35,238,176,129,129,217,216,101, 41, 35,208, 58,136, 25, 61, 1, 39,158, 45,215,197, 60,226, 17, 12,
- 98, 29,163,206, 22,231, 83, 14,227, 20, 80, 70, 68, 1,170,204, 67, 71,202,133,167, 46,154,182, 70, 70, 71, 57, 0,130,152,120,
- 80,142, 18,224, 52, 0, 42,181,206, 40,139, 0,188,179,226,176, 66,173,163, 29, 12,152,170, 95,132,139,109, 61, 97,147,172,141,
-236,179,148,219, 5, 60,197, 82,199, 40, 82,168, 81,139, 81,231,176,130, 70,113,168,137, 58,233,206,211, 29,192,220,211,216, 50,
-103,115,172, 77, 9,240,220,206,225, 4,192,103,139,253,127, 2,144,116, 45, 59,114, 19, 81,212, 85,101,151,159, 61,221, 67,207,
-116, 38, 19, 36,134,144,192, 38, 2, 33,196,134, 13,127,129,216, 32,241, 41,124, 3,136,127,225, 15,178, 3, 36, 4, 10, 11, 80,
- 34,145,160, 76,210,211, 79,219, 85,174, 23,231, 52, 82, 47, 90,234,182,100,217,247,113,110,221,115,207, 85,143, 31,173, 18, 10,
- 78,147, 25, 50,183,172,129,199,168,148,198,210,171,188,162,238, 5,202, 79,228,121, 14,234,115,165,143,175,225,105,129,226, 63,
-145, 67,233, 41,113, 58, 66, 20,253,108, 46,118, 14,192,193,178,182,131, 31,248,218,187, 23,219,213,199, 87,103,139,236,119,111,
-107,106, 88,104,228,157,130,227,225,220,107,209, 70, 14, 52,224, 11,119,143,112,213, 3, 64, 68,193,238,147, 44, 38,220, 42,238,
-102, 88,111, 5, 18,219,113,207,169,245,192,165,243,110,227,217,175,210,200,112,119,139,165,187,122,231,163,231,235,222,174,223,
-164, 88,199,218, 13, 28, 90, 49, 35,249,190,227,212,140, 40,207, 92, 47,216,186,231, 97, 16,153,214,138,155, 17,168,103,228,119,
-233,242,222,242,225,229,142,231, 56, 5, 92, 84,115, 6,115,209,147,222,147,161,168, 28,155,121,124,242,217,117,209, 62,124,246,
-236,181, 12,123,114,214, 1,252, 2,245,233, 6,252,221,240,154,138, 4, 39, 10,252, 32,217,104,220,191,241, 67, 13,139,144,165,
- 36, 66,165,184, 8,178,100,112,131, 11,243, 15, 46,190,254,242,158, 61,222,154, 73,112,145, 57,140,223, 32,183,161, 76,229, 35,
-109,155,229,226,254,148,175,174,127,123,122,248,254,135,159,191,251,241,167, 63,254,124,145, 55, 98,222, 54,108,149,196,176,215,
- 19, 42,144,147, 19,147,241,209,104, 10,231,203,137, 35,247,162, 68,104,207,201, 45,118,220, 82, 67, 34, 90, 91,209,136, 59,224,
- 7, 93, 86,220, 10,157,183,136,128, 77,197, 41, 29,171,242, 37,189,147,131, 36,254,122,249,224,219,111,102,159,126,113,200,228,
-191,227,206, 82, 81,144,243,157, 20, 74, 63, 29, 60,113,220, 6,150,144, 13, 3, 25, 98,168,247,250, 56,188, 28,247,190,223,237,
-195,238,239, 48,108,237,230,159,120, 88, 59,210, 22, 1,146, 35, 15,186, 66, 39, 52, 79, 49,226,230,224,175,238,215,159,124,245,
-126,126, 1,188,207, 1,111, 54,130,185,195,193,147,237,195,129, 23,149,221, 57, 7, 51, 70,241, 99, 40,109, 31, 15, 33,219,115,
-135,234,212,123,170,133,246, 86, 88,146,148, 93,145,145, 98,135,192, 56,230,122, 17,171,203,236,230,201,163, 95,154, 27,123,187,
- 41,213, 56,246, 72, 87,206, 80,235, 34,219,140,219, 84, 63,184,145,153,221,174, 41, 61,159, 21, 25,226, 56, 28, 5, 5, 97, 46,
- 85, 35,119, 93,232,118,130,241,151, 92, 44, 4, 37, 5,135, 65, 14,148,197, 73,189,208,199,235,199,231,111,223,237,126,125,122,
-148,165,171, 45,242, 40,155,196, 3, 89, 77,200,182,106, 27,201,145,182,167, 9, 88,212,224,110,237,155, 46,235, 75,199,213, 12,
-149,192,203, 45,163,226,216, 94,237,148,166,238, 83,176, 40, 99,168, 14, 86, 31,244, 4, 80,232,106,159,170, 66,140,138,193,170,
-172,124, 26, 80, 10, 70, 46,105,208, 0,184,220,192,156,162,227, 86,248,170, 8, 60,189, 43,212,252,189,155,221,155,215,253,250,
- 47,169,117,168,243, 64,125, 94,224, 92,131, 28,194,195,241, 70,226,181,100,101, 98,171, 18, 32, 51,151,117,141, 27, 84,200,230,
- 66,243,172, 52,144, 45, 28, 93, 39,170, 89,187,200,212, 96,253,221,219,193, 28, 93,123,126,182, 64, 60, 64, 82, 27,189, 78,220,
- 94, 49,177, 79, 54,205,203,182,236, 10, 88,112, 19,139, 29,138,233, 0, 92,135,103,213,215,108, 46,180,185, 68,253, 21,203, 33,
-105, 60,134, 25,176,118,213, 0,127, 84,154,118,206,182,153, 23,147,137, 74,169, 35,207,132, 41, 19, 39, 41,134,136, 16, 30, 10,
-146, 31,149,101,171,229, 52,160, 27, 41,139,246,191,250, 15, 41,116,236,223, 19, 69,160,194,132, 7,113, 77,184,160,177,208, 30,
-249, 65,149,227,170, 48, 19, 86,212,211,197,231, 31, 62, 95,174,212,237,171, 28,240, 79, 23,182, 65, 13,100,149, 73,125,115,194,
-164, 89,211,100,190,149,136,236,157, 69, 20,238,148,172,203, 72,176, 55, 9,192, 48,191, 87, 73, 74,186, 76,165,249,101,166, 60,
-172,199, 40, 69, 10, 73,185, 53,192, 71, 70, 85, 77, 92, 27,173, 80,158, 77,206,151,210,146, 35,144,107,134,145,100,102,110, 10,
-178, 27, 59, 59,139, 19, 2, 99,114,165,245, 46, 84, 72, 98, 43,188,144,188, 59, 0,139,197,204,113, 70, 87, 84,181, 63,243,254,
- 40,194, 88, 82, 83,135,131,255,196,251,134,222, 26, 29, 23,161,245,228, 21, 2, 16,105,175,121,129, 80,254, 28, 46,212,167,202,
-107, 39,107,229, 78, 26,123,248,177,206, 6, 92,154, 77, 9, 73, 11,229,149,142,212,117,144,210, 21,212, 42, 87, 84,107, 46,165,
-222, 31,180,243,102, 60,159,233,188,119,169, 49,182,236,116,180, 62,250,255, 4,224,232, 90,118,228, 38,162,168,237,122,184,108,
-183,123, 58, 61,210, 72, 25, 68,164, 25, 2, 11, 64,132, 13, 35,182,136, 5,130, 5,159,195,143,176, 99,199, 71, 32, 86,124, 3,
-172, 2, 1, 34,132, 20,162,100, 50,147,233,153,177, 93,174,135,171, 56,199, 82,175, 90,106, 87,219,190,117,207, 57,117, 95,226,
-252,241, 67,252,169, 14,220, 80, 26,216, 75, 83,228,109, 79, 39, 32, 90,166,237, 79, 64, 84,240,242,181,235, 99, 81,207, 48, 93,
-246,174,103,185,125, 1,128,145,248,106,100,219, 37,120, 79, 99, 71,122, 30,206,155,102,247,147,178,185,255,243,245, 65,196,179,
- 15, 30, 25,145, 94,120,198,255, 74, 18,149,181, 23,104,161,113,215,128,112, 3, 33, 88,225,129, 8,141,213, 65,108, 65, 82,138,
-150,103, 41, 30,158, 61,205,156, 36,198,198,229,180, 32, 24,244, 90,112, 15,226, 81,230, 27, 61,220,143,167,199, 98,119,210, 62,
-255, 47, 31, 46, 65,221, 32,156,153, 80, 31,157,174,175,231, 43,165,217,239,179, 91, 44,232, 57, 49, 87, 16, 78,100,146,236,172,
- 86,140,244, 48,237, 39,143,134,120, 15,220, 7,231, 86,213,122, 14, 7,182, 80, 2, 29, 96,167,195,220,171,242,195, 79,223,247,
-221,246,223,167,247,126,186,146, 29, 83,134,170,117, 34,243,102, 13, 27, 44, 42,196, 9,232,171,152,253,207,169,238, 44,233, 4,
-111, 42,214,136, 44,214,131,228, 28, 45,180, 71,251,205, 87,221,147, 39,119,126, 4, 80, 25,119, 0,219,115,240,135,114,205,165,
-217, 63,108,219,119,206,127,123,122,245,195,143,127,127,247,253, 47,191, 62,251,203,121,215, 26,179,169, 21,165, 2, 76, 40, 0,
- 61, 21,167, 16,129,189, 22, 5,156,133,229, 64, 55, 6, 60,193,232,235,121,237,150, 91, 5, 1,113,186,209,170, 86, 84,178, 80,
-152,141,218, 70,177,144,252,231,122, 83, 29,229,142,103, 31, 59,165,217,139, 27,118, 43,223, 59, 59,253,246,203,246,252,227, 67,
- 49,189,177,119,129,106,175,164,232, 94,155,187, 45, 88,146,111, 39, 78,113,174,228,144,171, 97,137,111,210,252,210,223, 30,252,
-120,157,134, 87,241,246,165,205,183,169,184,225, 47,196,219,216,207,149, 77, 80,113, 21, 92, 9, 95,193, 91,184, 42,245,217,215,
-251,163, 11, 3,166, 79,124,229,228,144,196,180,116,175, 35,139, 70,150, 56,206, 44,154,245,240,104,193,223,214,165,133, 8,224,
- 78,194,115, 99, 91,120,139,117,163,205,236,254,136, 79, 43, 11,125,172, 27,252,195,221,162, 78,154,205, 71,159,255,225,125,152,
- 47,173, 6, 13,171,202,235,118, 14, 75, 31,230,217,187, 49,136,211,221,209, 3, 63, 56,144, 45, 92, 83,233,112, 92,139, 28, 75,
-155,186, 49, 7,176,202, 50, 68,184, 50,199,104,165, 97,111,238,204,168,151,100, 25,175,211,169, 61,219,158, 92, 60,254,249,167,
- 23, 85,180, 77, 22,215, 80,109,236,147, 19,170,129,185,205,172,186,134,123,198, 27,102,158, 5,108,159, 21,130,172, 22, 93, 10,
-108,177,117, 63,224,129,112,120, 37, 36,214, 62,249,155, 42,195, 85, 99, 95, 45, 16, 66, 29, 91,138,245, 37,207,188, 60,127,225,
- 56,196, 66,110,240, 46, 43,205,121, 27,145,245,171,224, 84, 75,153,214,188, 48, 24,154,247,106, 15, 13,189, 95,158,253, 62, 1,
-229, 1,247, 65, 2,169,120,116,142,109,232, 72,233,180,150,209, 8, 30,241,105,136, 70, 48, 35, 85, 57,211,238, 96,129,155,104,
- 76,155,211,198, 24, 53,193,201,173,153,225, 29, 96, 61, 93,222,216,233,110,194, 61, 55,219, 29, 76,107,211, 85,222, 37, 29,157,
-208,163,213,153, 67,141, 28,248, 1,238, 72, 60, 0, 96,231,186,236, 68,219,201,150, 69,155,177,217,117,253,187,125,191,223,213,
-170, 77,179, 26,129,238, 83, 4,197,171, 44,104,170,140, 17, 42, 25,110, 84, 50,219, 25, 28, 61,243,156, 47, 11,250,116,224, 23,
-212,178, 99,132, 66,176, 56, 31,254,131, 93,227, 2,192, 85, 67, 97,164, 53,163,134, 45,237, 64, 75,193,101, 11, 70,137, 5,148,
- 73,140,178,232, 65, 1,141,104,100,232,143, 54,242,226,139,127,234, 45,204,229,126,203, 52,188,100,193,239, 57,240, 38,186,173,
- 82,227, 90, 16,137,139, 85,163,153, 37, 71, 23, 44, 65, 3,198, 42, 97, 84,213,215,245, 50,182,254,164, 8,203, 92,186,192, 98,
- 68,161, 67,217,110, 15,133, 63, 30,112,231, 97, 54,121, 74,217, 36,169,219,186,155,124,102,138,144,210,165, 26, 36, 52, 8, 96,
-186, 19,154, 49,190,134,167,126,182,115, 34,104,205, 64,169, 78,240,185,206, 20,163, 91,154,217,118, 6,238, 76, 21,131,202, 76,
- 21,101, 64,217,143, 28,154,165,152,120, 50,175, 19, 46, 19, 88,226,172,141, 29,114,199, 29,187, 56, 14,113,131,208, 98,147,209,
-194,182, 5,252,149, 16,115, 72, 89, 25,182, 46, 89,176,165, 60, 11, 63, 23, 33,171, 78,141,245,212,143,173, 13,150, 35,110,139,
- 46,150,147,107,176,228, 44,125, 21, 35,200,173,230,232, 99, 80,206,169, 43,203,174, 22,226,127, 1, 56,186,150,221, 58,138, 40,
- 56,253,154,158,199, 29,251,218,215, 4, 57,137, 69, 34,130,144, 64,100, 1,236, 34,248, 1, 36, 86, 44,216,242, 53,108,249, 16,
-214,252, 1, 18, 27,132,178, 64, 74,192,100,227,128,237,248,237,121,118,207,116, 55, 85,119,125,117,165,153,158, 62,231, 84,117,
-159, 83,165,142,158, 29, 81, 32, 95, 44,221, 72, 32, 59,231, 98,171,205, 85,203, 84,122,221,210, 27, 9,133,123,146, 8,121,227,
- 53, 5,189,137,105,166, 80,238, 8, 63, 82, 45, 80,207,118, 80,150,229, 76,119,110, 12,179, 19, 19, 50, 51,123,196,228,146,142,
-207,187, 74, 63,251,244,233, 27, 14, 78,105,155,229,123,164,204,114, 11,123, 73,137, 13, 24,209,188,140,218, 56,202,112, 43,148,
- 79,149,249,187,120,131,178,217,197,192,195, 25, 5, 12, 14, 88,135,244,188,176,183, 54,245, 50,210,213,141,147, 47,119,227,237,
-163,195,184,217,188,119,121,181, 92,220,183,114, 10, 42, 84, 75, 49, 42,187,180,247,168,235, 9, 92, 73,244,209,244,216,177,169,
-213,201, 80,123, 88, 56,112,239, 1,164, 91,125,241, 28, 59,234, 46,114,142,157, 7, 72,188,221,197,207,216,137, 91, 39, 25,112,
-254,114, 87,126,246,113,179,217, 60, 60,126,229,252,253,237, 82,141, 5,182, 92,180,192, 60,198, 34,127,115,144, 50,183, 92,215,
-229, 94,199, 50,143,108, 70, 5,135, 85, 85, 37, 1, 39,156,139,215, 93,250,224,112,239,135,111,115,219,158,222,179, 43, 28,143,
-158,205,188, 94,170, 80, 59, 31, 60, 46,146,125,255,231, 95,174,127,252,233,229,175,191,253,185, 51,187,117, 89,175,128, 97,116,
-114,137, 13,143, 10,177, 35, 41, 17,150,102, 33, 39,158, 39,152,173,195, 28,165, 31,177,137,106,224,117,141, 20, 97,152,141,139,
-130, 98, 82,202, 0,185, 23,185, 71,132,154, 88,175,117,185,111,217,204,100,243, 97,123, 29, 59,211,239,178,124,254,249,193,247,
-223, 85, 7, 71,231, 1,148, 98,220,182,220, 80,218, 51,219,182,183, 71,186, 73, 73, 31,231, 5, 80, 34,111, 93,108,147,187,246,
-253,201,208,183,254, 6, 80,251,237,114,123,177,140,103, 73,247,233, 6, 43, 44,104,124,205, 46,250,168, 44, 87, 39, 27,175,178,
- 81,165, 47,191,217, 28,126, 85,141, 29,111, 38,217,229,202,185,189, 89,208, 48,196,128,232, 99, 29,120, 91, 61,171, 0, 64,212,
-133, 56, 75,193,177,110,124, 91,225,125, 48,157, 66,228,131, 81, 8,138,153, 80,177,157,254, 74, 70, 35,246, 7,235,214,155,170,
-250,228,195,243,191, 78,120, 90,209, 89, 57, 37, 85, 17, 1, 78,109,100,179,242,212, 14,181,221,236,214,187,233, 10, 1,132,140,
- 3,132,146,247, 1,137,145, 35, 52,189, 72, 35, 15,179,192,187,134,109, 67, 16, 39, 80,105,122, 65, 21, 73,160, 83,211,197,143,
-190,126,250,242, 85,184,125,123, 97,104, 98, 73,189,211, 28,120, 63,203,122, 10,103,137,224,229,128,199,173,104, 78, 41,102, 94,
-188, 27, 59, 7,167, 57,195, 72,251,104,147, 91, 89,122, 18,116,198,132,224, 65,111,133, 87, 46, 98,173,180, 71,212,165, 85, 32,
-225,162, 62, 1,114,178,204, 64,198,220,164,188,118,130,173,226,129,183, 65, 84,183, 3,126, 72, 20, 86,157, 83,223, 28, 60, 17,
-170, 25, 94,191,166,182,127, 37,203,104,120,130,139,220,104,140, 40, 41, 95, 35,183, 14, 57,245, 20,123,196,234, 62, 96,128, 55,
- 37,128,103, 14, 68,217,161,142,174, 68,207,158, 7,215, 1, 56, 21,186,193, 46,217,183,133,114,167,111,250,219,155,251,155,211,
-128,144, 47,215,149,222, 41,214, 22,165,160, 88, 37,177,105,108,115, 96,155,104, 55, 15,246, 86, 15,243, 29, 81,155,131,166, 30,
- 87, 67, 86,190,251, 47,158,252,113,119,242,251,217,223,199,255,158,252,115,118,121,121, 53, 81,224,215, 83,236,167,240,212, 35,
-111, 3,150, 49,204,209, 89, 77,184,229,213, 48, 39, 79, 69,110,240,115,182, 49,113, 35,186,101, 10, 41,227,232,164,160,230,170,
-162,181, 23,221, 45, 21, 85,130,165,229, 52, 9,219,252,108,214,228,196, 15,166, 18,219,126,161,233,209,227, 39,195,139, 23,199,
-239,206,181, 53,113,224,120, 34,106,129,215,192,221,171, 0,208,158,155,113,177, 41, 79, 43, 91,230, 76, 38,102, 47,219,243, 90,
-215, 11,231,105,194,136,122, 67,113,191, 12, 47, 22,114, 0,139,117,214,129, 78, 5,187,196,169, 76,249, 92,208, 82,116, 95, 41,
- 58, 59, 8,231,123, 60,175,164,161, 4,152,253,237,208, 68,151,120,103,131,133, 7,159, 9,168,146, 99,170,102,229,170,186,114,
-195,132,255, 3, 98,173, 92,177,144,251,104, 23,124,109,136,191,150, 98, 26,200, 37, 82, 19,169,245,221, 2, 51,240,148,115,166,
-125, 89, 54, 1, 53, 79, 70,161,142,108,251,150, 80, 1,176, 37,104,231,132,207,142,253, 25,115, 35,239,144, 89,228,186,152, 26,
-160, 94, 10, 49,160, 90,206, 89,184,155,170, 85, 46, 77,155,101,141,156,118,129,167, 11, 20,145,126,141, 18, 22, 38, 85,165, 42,
- 43, 80, 46, 40,103, 79, 13,167,177,251, 95, 0,142,174,101, 55,146, 34, 8, 86,215,163, 95,158,135,135, 5, 22, 44,144,109, 89,
-128,118, 87,172,144,184, 32, 56,113,226,202, 15,112,224,135, 16,191,192,133, 31,224,204, 17, 33,113,224,130, 88, 33,193, 34, 89,
- 11,235, 53,158,177,123,166,159,245,108, 34,252, 5,211,211,149,149, 25,145, 29, 25,169, 78,159,158, 8,196, 3,254, 87,162,126,
-178,188,183, 43,137,253,132, 95,243, 64,179, 9, 4,139,249, 38,103,115, 42,218, 90,105,206, 27, 83,138,136,235,171,130,112,210,
-206, 35, 30,203, 15, 40,154,140,112, 55, 88,221,227,230, 36, 87,136,201,246,187,103,151,203,211,197,123,231,175,247,135,240, 50,
-184,181,100,187,208,103,116,241,170, 53, 56, 74,198, 29,194, 51, 77,144,130,140,222,247,157,109,239,240, 6,178, 78,122,237,144,
- 48, 35, 13,178, 1, 40, 17, 46,184, 84,202,246, 26,249, 97, 94,240,208,156,115,125,115,115,114, 52, 60,124,119, 49,101,249,221,
- 22,240, 13, 20,214, 81, 23, 7,168, 92,224,201,169,185, 49,148,108,112,179,147,185,199,222, 34,121, 99,194,180,112,143,206,143,
- 55,226,165,141, 37,189,210,114, 65,111, 87, 6, 22,237, 5,217, 11, 81,214,246,214,232,233,236,253, 7, 39,143, 47,110,254, 16,
-251,253, 22, 20, 70,148, 17, 47,187,140,178, 30,144, 78,139, 73, 39,199,246, 61,205,131, 10, 21,213,210, 12, 86, 84, 6, 41, 57,
-237,218,224,197,230,235,175, 86, 79, 63,188,217,253,118,232,113, 23,108,156,219, 52,134, 57, 55,250,226, 2, 8,251,252,219,239,
-110,190,249,254,167,241,234, 80, 46,165, 92,149, 40,111,168,181,224,193,129,171,138, 12,187, 14,129,180,128,187,193,197,108,150,
-156,138, 75, 65, 79,193,205, 99,182, 96, 59,197,128, 44,123, 36, 21, 83,200,251,207,176, 5, 57, 20, 40, 40,237,185,181,225, 87,
- 35, 83, 25,109, 66,189,234,234, 40,109, 93,125,250,241,241,151, 95, 56,125,244,202,221, 29,232, 8, 43,153,116,195, 76,127, 15,
-144,108,218,119,201,110, 70,206, 1,108,111, 50,113, 24,134,195,188,111,108,119, 27,239, 26,123,120, 21,211,181,117, 99,240,157,
-208,113,230, 70,114, 27,205, 40, 57,239,131,107, 89,100, 3,104,171,139,143, 62,219, 60,249,252,141,177, 12,177, 75, 8, 93, 26,
- 94, 83,254,195,145,130,185, 7, 83,119,161,141,161,195,201, 2, 39, 76,126,167,144, 8,124,207, 33, 70,201,237, 47,214,121, 35,
- 71, 4, 63,229, 22, 11,202,178,233,207,158, 1,136,173,184,148,231,225,217,105,115,113,242,252,159, 30,225,123, 39,109, 20, 99,
- 54,250, 62,136,144, 71,176,125, 17,187,219,113, 90,110,214,103,168,208,195,158,223, 77, 43,133, 34,136,135, 13,154,203, 23,184,
-204, 26,213, 38, 1, 85,112,184, 93, 15,244, 1, 50,158, 50, 40, 11,232, 25,199,211, 79, 30,212,143,223,249,225,199,157, 15,125,
- 85,115, 81,238, 68,215,104,186,214,134,249,254,131, 7,239, 65,146,206, 40,171, 71,170, 79,185,133,137,210, 86, 67, 15, 8,154,
-107, 40,250, 57, 70, 54,212,156, 13,129,250,190,146,110, 90,168,208,243, 10, 39,131, 3,194,115,206, 83, 30, 43,151,234, 81,248,
-178, 82,130, 83,239, 96, 7, 69,222,169,185,141, 38, 55,128, 29, 32, 80, 35,170,186, 56,126,235,129,191,190,181,187, 43, 95,208,
-117,207,151,197,232, 66, 73,185, 40,248,166, 46, 80,144, 77, 81, 86, 65,174,185,148, 65,145, 7,179,176,129,152,198,170, 60,170,
-168,145, 43, 17,182,185,154,141,232,185, 58,103, 94, 85, 0, 7,249, 90,165,125,211,108, 95, 52,255, 93,245,109,107,199, 91, 13,
-168, 57,128,211,222,136,102,240,219,203,105,251,111,119,125,185,251,235,151,230,247, 95,159, 95,254,124,185,253,251, 69, 59,236,
-154,105, 15,142, 80,191,157,111, 86,245,155,175,213, 69, 93,155,165, 82, 72,140,173,160,212, 50,164, 99, 64,184,193,183,109, 86,
- 11,153,216,177,241,149, 5, 21, 5, 80,137,118, 44,199, 56, 83, 54,225,104,200,196, 65,253,148, 29,105, 26,140, 81,228,203, 33,
- 85,138, 24,116,142, 19, 79, 92, 16,169,178,146,182,201,200,249,233,104,173, 54, 31, 61,249,243,131,179,108,215,212,107, 20,140,
-130, 91, 54,116,141, 28, 37,233,192, 12, 96,134,204,139, 74,155,245, 54, 11, 59,206, 40,208,203,113, 97, 17, 86,101,170,151,120,
-255,117, 37, 37,142, 94,120,151, 79,247,110, 64, 25, 29,128, 13,247,159, 72,219, 34,231,187,130, 22,100, 89, 44, 58,128, 65,183,
- 86, 21, 55,134, 76, 90,151,137,195, 66,154,122, 13, 69,221,193, 10,160, 98,145,144,146,178, 96, 56, 4, 38,128,252, 21,112,212,
- 1, 92, 5,117,155, 6,108,105, 84, 38,223,151, 73,214,115, 57, 28, 43, 25,114, 94,212,130, 30,132, 28, 48,237,180, 43,151, 27,
-159,107,122,117,120, 51, 34, 90,189, 80,209,236,231,177, 60, 48, 99,163,136,215,201,154,122, 30,145, 53,230, 26,240,156, 66,202,
- 56,201,136, 40,230,162,160, 66,229, 57, 32, 18, 10, 8,104, 8, 59,230,145, 11,194, 99, 30,145,182,148,224, 50,175,146,115, 38,
-217,255, 2,144,116, 45,187,141, 20, 81,180,171,235,209, 15, 63, 98, 59, 18, 97,130, 19, 96, 3, 35,205,102,128, 45, 18,179, 27,
- 13,255,128,248, 25,190,133, 29, 75, 62, 4,118, 8,177,137, 38, 97, 98,199,196,238,151,187, 30,221,197, 57, 61,107,171, 37,119,
- 87,213,185,231,214,189,247, 28,249,229,246,122,164, 37,219,128,229,159,249,228,132,116, 26,169,205, 56, 80,193, 5, 25, 50,117,
-206,113,248, 45,214, 3, 76,111,168, 99,210, 81,103, 58, 14, 54, 44,244,217,131,252,209,104,171, 39,254,156, 21,194,100, 75, 25,
- 92,229,154, 1,216,222, 55,153, 27,250,240,112,255,100,190,186,124,125,125,123,234, 79, 59, 96,136, 82, 82,210, 83, 53, 5, 46,
- 37, 57,178, 49,170,163, 99, 47,135,115, 29, 71,155, 34, 41,105, 56,173,173, 44, 32, 28,127,132, 22,142,238, 76, 79,122, 25,168,
- 33, 72,233, 57,252,221,150,125,203, 99, 99,219, 83,189,217,250,155,219,121, 80,229, 63,187,230,120, 68, 62, 76, 97, 6, 31,172,
-181, 8,230,122,152, 57,239, 73, 2, 1,183,153, 11,236, 51,136, 32,168,243,175,183,230, 82, 62, 56, 80, 34,147, 32,199,194, 54,
- 18,218, 69,203,250, 17,165, 61,152,104,116,222, 51, 20,221,108, 87,219,151, 47, 30,238,138,170,122,206,116,101,216,128,174,216,
-149,146,142,122, 40, 10,118, 3, 59, 42,126,225,157, 58, 49, 39,124, 68, 48,215,133,185,250,233,231,205,219,183,125,243,254,212,
- 30, 66,125,176,103, 79,129,125, 33,203,219,235, 23,131,249,236,151, 95,223,255,246,251, 31,160,229,235, 37, 75,254, 0, 56, 27,
- 16,197, 38,191,188, 60, 38,214, 81,151,196, 80,253,135,190,126, 36,254,164,137,120,233, 66,129, 15, 0,240,100,248,168, 75, 96,
-242, 85,226,229,138, 55, 6,133, 44, 1,181,203, 92, 21,121, 54,211, 67,228, 76, 5, 40,140,104,135,139, 60,223,188,251, 65,188,
-249,222, 9,117,111,171,202,211, 93, 48, 19,212,119,114, 36,177, 88,254,164,163, 77,135,245,162,214,162,103,253,179, 58,132, 83,
-215, 54,143,178,122, 26,219, 93, 95, 31,188,173, 71,243, 31,120,247, 40, 0,238, 83, 93,132, 67,107, 51,150,175, 69, 51, 30,207,
-241,139,173,249,238,199,203,118, 34, 92,148,101, 20, 38, 78, 62, 85, 9,241,221,120, 38,171,131,171,232,229, 54, 54,129,162,205,
-145,142,100,162, 30, 3,210, 62,196, 63, 63,184, 22,143, 88, 54, 75, 79,226, 83,178, 72,138, 82,166,101,126,206, 2, 40,248,246,
-155,151, 15,139,197,253,135, 67, 26,218,102,207,177,252,199, 90,114, 74,132, 23, 35,200, 58,196,113,148, 85,151,126,178,186,249,
- 52, 61,116,186,141,206,120, 9, 12,180,211,241,140, 50,167,124,105, 55,181, 18, 70,205, 74,131, 5,139, 46,216,235, 23,121,246,
- 71,117,178,175,222,109,255,252,203,236,119,255,206, 98,198,228,132,181, 13, 32,199,192,139,154, 86, 56,142,175,166, 84,220, 55,
-188,247, 55,244, 70, 29, 78,136, 17,125,106, 18, 67,246, 53,104,109, 21,231, 32, 50,128, 45,117,121, 17,164,107,149,205,220, 42,
- 34,190,101, 54, 85, 3, 5,228,216,150, 82,142,101,160,240, 38,101,201,253,164, 77, 66,227, 98, 31, 74,170,250,105,100,245, 26,
- 31, 43, 22, 70, 92,126,126,190,219,185,221,179, 84,170, 92,208, 27,128, 73,143,137, 25, 13,180,176,249,180, 43, 18,178,215, 68,
-201,141, 73, 2, 45,118,124,193,126, 70,172, 42, 11, 95,150,157, 13,193,112,226, 21, 40, 49,155, 36,168,193,156, 23,107,106, 54,
-250,172, 15, 93, 93,221,239, 63, 60,237,159,246,207,205,221,225,244,248,252,180, 63,214,199,182, 13,189,208,126,189,201,151, 55,
-133, 94,155,139,139,229,250,106,190,185,154, 25,144,162,162,200,151,192,119,154,112,164, 61, 14,125, 72,215,147,181,217,152,181,
- 22, 7, 40, 22, 96, 76, 26,155, 22, 32,142, 47, 55, 80,183,176, 23, 75,223, 11,149,230, 13,125, 79,220,144,180, 3, 21,147,242,
- 76,218,143, 94,231,108, 41,231,224,185,200,197, 56, 67,244,162,154,156, 86,105, 49,247,171,219,168,190,125,243,183, 94,148, 29,
-150, 25,201,213, 34, 17, 61,142,225, 88, 83,113,146, 34, 40,161,200,123,205, 68, 73, 47,138, 57, 22, 26,159,145, 42,230,153,100,
- 1,155,148,105,154, 38, 94,129, 59, 98, 91,210, 92, 10, 25,247,168,120,221,111,103, 20,153,147,179, 72, 47, 23,246,228,170,162,
-201,192,121, 50,252, 28, 76,165, 88,140, 77,147,174,164,167, 2, 75, 83,244,114, 25, 17,142, 0,231,227,148, 98,159,115, 9, 60,
- 22, 88,108,228,148,128,130,142, 61,189, 0, 88, 59,249, 13, 8, 28,101,239,240,110,188,236, 75, 39,185, 97, 96, 69,121,166,206,
-167, 78,144, 94, 23,171, 81,107,182, 43, 81,209,144, 99, 72,200,234,140,234,227, 36,236,111, 76,182, 68,204,167,128,189, 25, 18,
-151, 76, 94, 85,125,229,166,235, 70,112,151,148,196, 78,209,145,213,179,217, 26,251, 71, 78,202,177, 14, 25, 49,158,249, 95, 0,
-142,174,109, 71,110, 34, 10,218,221,110,187,219,246,120,102,103,178, 65,236, 74, 17,160,192, 62, 32, 37, 64, 94, 81,164, 60,194,
-115,126,144, 47,224, 11, 16,226, 3,144,120,128, 23,164, 8, 33, 72,196,238,100, 55,115,241,189,111, 84,249, 3,108,141,167,219,
-117,170,220,231, 84,201,237,238, 10,101, 2,148, 33, 14,137,177,244,205,213, 17,232, 91, 90,149,108,162,232,153,243,214,211,147,
- 44,128,147,159,233,147,194,236, 97, 2, 45,187, 63,142, 52, 29,195,230, 23, 40,203,163, 61,114,250, 20,111, 67,119,208,185, 43,
-120,204, 41,163,109,215,219, 55, 15,183,127,252,231,119,187,103, 55, 79,138,225,244,119,123, 31, 28,222, 73,219,198, 81,204,157,
-117,247, 71, 55, 30,104,247,139,171, 15,158,175,169,195,253,249,209, 50,101,191,132,244, 90,248,211, 52, 43,199,185,185, 46,216,
- 36, 57,211,222, 7,132,200, 69,153,131, 6,180, 39, 87,134,120,243, 69,113,249, 88,117, 86,191,253, 48,216,101, 32,140,214,149,
- 65, 73,134,125,228,117, 13,196,183, 53, 36,217, 54,179,126,176, 86,127,243,220,236,196,193,111, 12,123,154, 25, 12, 16, 25, 44,
-197, 44,199,100,137,154, 99,158, 13,173, 43,249,241,107,248,232,106,243,236,219,155,195, 65,253,254,235,221, 28,199,236,162, 42,
-234,124, 98, 80, 18,173,255,243,125, 1,200, 91,146, 88,128, 17,211,126, 18,173,205,190,127,117,249,250,181, 15,231,227,233, 93,
-199, 16,233,247, 88, 2,247, 48, 7,185, 93,125,254,232,201, 79,111,210, 31,126,252,109,108,167, 90,240,248,169,135,166, 96,150,
- 79, 58, 9, 54, 2, 51, 88,129,145,169, 5,246, 85, 28,217,105,144,121,197,177,194,217,209,129, 66, 26,215, 44,227,246,133, 90,
-218,164,192,189, 51, 85, 23,140, 85,195,115,111, 33,136, 0,239, 99,110, 99,181, 91, 51,222, 78,234,213,250,209,119, 47,171,175,
- 95, 28,146,176, 31,186, 19,150, 75,114, 28,106,113,219,103,192, 4,207,189,195, 12,242, 88, 39,173,141,239,237,240,222,247,119,
-115,247,175,253,176,159,187,189, 59, 63,244,227, 91,151, 29,213, 48, 4, 8, 80, 80, 53, 53,241, 98,235, 37,246,201, 37,112,114,
-224,252,114,115, 45, 94,188,220, 53,159,152,254,236, 57,166,194, 46, 6,246, 89,101, 52, 48,167, 3, 50, 22,150, 54,252, 39, 58,
- 78,218,118,236, 25, 70, 38, 98,239,109,199,252, 92,246, 41, 76,168,217, 28,151, 7,100,112,136, 44,208, 47,243, 33,161,187,131,
-105,124,179,245,215,207, 63,253,115, 88, 61,220, 30, 19, 14,218, 64,149,162, 12, 70, 35,188, 31,152,230,171, 64,215,166,176,199,
-175, 85,213, 87,101,106,197,209,255,147,230, 35,163,191,179,108,241,212,139, 74,106, 79, 18,236,216, 26, 17, 53, 71, 81, 37,100,
- 61, 24, 15, 42,185,141,227,187,233,250,105,169, 63,123,252,203,207,119, 89, 63, 57, 67,166, 14, 85,129,237,198, 49,168, 84,109,
-150,244,227,164, 11,161,228,208,241,121,146,248, 35, 60,160,196,208,100,132, 81,174, 16, 52, 21, 45, 72, 19,160,248,156,119,206,
-152, 93,111, 2,243, 50, 81, 13, 51, 91, 10,223, 88,168,238, 20,178,130, 78,100, 12,235, 16, 46, 76,153, 82,106,112, 35,179, 0,
-192, 66, 81, 70,146, 86,201,139,212,245,126,234,197,197, 42,172, 27,123,251, 87,123,104,121, 86,140, 11, 32,189, 86,100, 65, 9,
- 63, 69,176,249,167,156,130,111,217,253, 10, 14,156, 48,186,104, 90,235,197,117, 30,139, 91,130,223,165,246,156, 85,180, 78,197,
-235, 95,120,195,126,198,213, 42,129, 80, 92, 89, 40, 61,213,152,162,218, 21, 77,174,215, 31, 87,213,122,149,111, 85,211,168,122,
- 7, 32, 87,185,145,235, 38,175, 55, 53,106,143, 40,113,187, 66,207,153, 89,163,100,231, 26,240,198, 70, 75,201,200, 23, 30,122,
-210, 39, 0,242,129,209,110,144,192,206,167,189,232, 70,186, 67, 65,159,207, 33,240,148, 30,136,177,240,247, 20,191,139, 62, 37,
-114, 7,202,206,233,201, 20,133,140, 91,165,240,155,197, 23, 12,139, 98, 10, 13,118,175,195,120,113,117, 57,126,249,234,222,158,
-141,114, 28,186,213,192, 97,199,249,226, 44,148, 37, 91,255,232,191, 21, 38, 77,143,107,104, 52,104, 0,240,121, 81, 6,227, 85,
-231,211,122, 37,121,228,153,181,102,200, 80,226, 42, 69, 3, 48,231,128, 43, 2,119,207, 73, 35, 1,183, 34, 61,117,208,144,115,
- 4,221,118,208,202, 88, 6, 81,140,105, 62, 53,115, 83, 52,250,220, 71,136,115,250,119, 39,189,162, 89,143, 76, 19, 80,168, 68,
- 67, 53, 73, 57,128, 61, 31,210,108, 80, 64,164, 66, 57,126,243, 4,222,206, 83,153,170,104, 32,184,178,105,164,135,162,175, 12,
- 61,197,176,255,197,220,198,173, 18,145,109, 38, 88,166,108, 30,243,105,102,255, 4,196, 55, 30, 44, 22, 14,197, 45,149, 90,131,
-166,142, 71,224, 81, 63, 8, 49, 99,187,106,154,245,130, 75,228,185,195, 2,156,180,149, 67,203,114, 89,228,115,198, 9,109,223,
- 36,107,172,154,227,107, 45,255, 23,128,163, 43,217,145,163,136,130,153, 85,149,181,116,118,117,207,216,195,200, 54, 26,139,209,
-192, 28, 0,217, 72, 32,196, 1,129,124, 68,226, 35, 16,255,194,111,240, 47,136, 43, 39,206, 44, 54,198,158, 49,118, 47,211,181,
-100,101, 86, 46, 68,244,125,150,170,202,204,247, 34,242,189, 23,145,127,114,253, 62,232, 17, 61,168,233, 54,207, 78,105,163, 67,
-217, 81, 50, 83,208,127,200,233,101,109, 71, 78, 15, 91, 58, 47,229,149,183, 96,164,119,147, 99, 79,131,205, 70,107, 39, 96,245,
-142,173,177, 3, 99,125,153,109, 66, 24, 67,126,231,156, 25,216, 33,210,205,107,147,110,111, 95,254,254,143,123,124,118,253,209,
-213,131, 70,221,116, 67, 23,122, 80, 69, 19, 6, 96, 54,195, 28, 61,149,162,166, 13, 10, 32, 97,118,212,229, 76, 18,236,220,224,
- 12,166,187, 76,142, 17, 9,197,118,142,179, 95, 38,201, 59,176, 35,252,243, 24, 98,208,167,106, 10,198, 6,160,221,195,197, 73,
-120,242,169,174,117,253,170, 3,228,244,179,139,170,166, 39, 54,103, 42,143,102,247,244,123, 13, 89, 47,196,105,211,126,251,213,
-144,141,123, 16, 72, 18, 61,214,240,145, 61, 20,187, 65,233, 11, 22,177,170, 62, 53, 34, 80, 44,218,114,220,102,223,158,166,167,
-159, 3,176, 92,190,123,209,247,239, 14,185,157,234,188,196,233, 3,123,100,253,182,160, 91,115,104,202,100,145, 34, 87,207,190,
- 60,251,241,135, 89,152,110,255,122, 51,238, 92, 60, 96,159,251,195,237,228, 66,117,241,241,249,175,127,228, 63,253,252,220,116,
- 59,182, 31,148,249, 14, 91,206,130, 17,242, 58,187, 84, 28,239, 12, 44, 46, 19, 93, 40, 26,155,113,180,206, 73,240, 35,130, 4,
-108,119, 58,222,212, 10,132,187,105,218,204,230,245, 58, 59, 41,181,173, 4,145,221, 73,185, 70, 92, 41,235,234, 61, 61,164, 83,
- 79,195, 26,123,249, 65,251,253,119,211,245,213,139, 48,108,251,126, 35, 82, 11,240,138, 61,196,108,205,171, 78,124,118, 10,188,
- 74,147,229,125, 12,155,113,220,203,126,159,204,232,251,173, 59,188,141,187, 87,222,191, 9,254,128, 32,233,205, 20,149,139,147,
- 97,217,199, 42, 89, 86,210, 44, 99,149,178,191,122,142, 50,126,253,205,242,252,201,186,119, 71,227,218,178,224,221, 79, 60,138,
-211, 7, 26, 38, 99, 49, 41,144, 58,176,194, 5,108,238,167, 20, 71,222,117, 12, 27,228,117,193,172, 49,225, 25, 20, 93, 79,166,
- 57, 26,240,235,227,111, 47,132,102,247,169, 66, 32, 95, 61,190, 95, 95, 63,253,229,207, 27, 60, 1, 14,117,156,246,135, 33, 28,
-253,218, 45,151,105, 70, 48,139,233, 88, 33,124,123,240,231, 87,235, 71,165,239,194,158,138,212, 43, 18,126, 73, 79, 53,172, 55,
-104, 17,167, 39,105, 88, 24, 57,124,238,115,138,197, 0,249,168,123,130,174,105,243,244,225,103, 15,126,251, 87,190,188,217,100,
- 28,196,195, 87, 18, 13, 18, 56,165,113,217,137,108,112, 22, 40,110,155,197, 73, 86, 81,214, 42,182, 44, 16,178,146, 15, 82, 82,
-203,160,151, 28,187, 27, 44,206,215,228, 10,142,159,120, 11, 48, 40,114,189, 88, 86, 7,224,107, 46, 45, 2, 92, 5, 88,215,226,
- 7, 16,133,138, 1,104, 27,140,186, 47, 41,120, 81,184,132,188,233, 61,114, 93,100,147, 87,102,182,226,225,189,213,217, 35,255,
-247,127, 98,218,202,101,211,207,121,105, 99, 59,208,199,167, 4, 64, 80, 94,215,193,148, 71, 27, 0, 16,212,177, 65,114,137,173,
-158,199, 80, 81,115, 75, 44,241,229,151,113, 88,165,184, 19,213, 66, 81,189, 5,240,199,115, 22,182, 69, 64,125, 88, 75, 0,254,
- 69, 65,101, 92, 29,232,145, 1, 38,168,212,162, 93,228,170,174, 78,128,171, 1,149,117,177, 0,111, 4,224,163,189, 37,222,121,
-100,248,225, 77,122, 40, 64,178,124,109, 4,223,214, 2,171, 83,175,159,102, 76,163,243, 67, 30,170, 0,224,236, 56,105,155, 24,
-127,168, 88, 39, 88,232, 17,199,244,218,228, 19,223,152,244,130,111, 34, 89,167, 73, 28, 13, 80,186,174,130,138, 72,131,237, 42,
-107,191,120,182,185,184, 12,126,171,115,202,143, 82,211,159,124, 73,169, 74,151, 49, 39, 60, 46, 84,200, 22,243,209,242,107, 6,
- 92, 5,198,231, 76, 8, 30, 84,183, 49,113,122,154,198, 95,188, 9,195, 31,240,130, 85,239,188,210,216,114,173,139,237, 54, 7,
-244, 71,218, 42,202, 9, 39,146,253,148, 32, 60, 50,130,215,136, 36, 70,246, 95, 68,160,206,125,136, 45,185, 28,190,173,165,112,
- 9,190, 68,172, 92, 48,170, 78, 83,228,253, 0,176, 47,248, 76, 77,165,198,140, 93,160,236, 40, 96,235,159,227,181,147, 10, 7,
- 93, 20,163, 23, 53, 30,144, 58, 82,160,143,246,190,241,136,218,236, 93, 31,155, 85,222, 20,108, 79, 1,162,144, 5, 43,133,128,
-153,222,219,177, 20,110,177, 2,149, 67,226,161,144, 79, 49, 80, 30,118,191,138,222,185, 22, 8,218,205,148, 65,146,108,181,147,
-210,106, 73,123,196,228,250, 81, 7, 44, 70,246,191, 0, 28, 93,203,110, 36, 69, 16,172,103, 87,119,215,120,102,253, 96,177, 22,
-140,196, 2,203, 32, 88, 12, 18,226,192, 5, 1, 87,174,156,184,241,101,252, 7, 39, 36, 14,240, 15,172,196, 1,179,107,227,181,
-113, 79, 79, 63,234,213, 68,204,213,150,101,117, 85,102, 70, 70, 85, 86,132,190,120,124,202,201, 94, 69,197, 0,137, 94,134, 48,
-182,200,224,192,234,163,198, 71,208, 78,172,196, 72,185, 4, 42,230, 74, 67,191,180,192,254,138,158, 61, 29,125,131,209, 99, 98,
- 83,101, 12, 29,242,110, 88,124,216, 33,184,166,251,133,103,156, 38,162, 45,196, 87,165,252,223,195,195,111,191, 95,101,255,236,
-243,247,159, 31,159,227,131,239, 0,194,138, 8,184, 40, 36,191, 30,203, 76, 63, 28, 83,109,194, 10, 13,213, 16, 59,108,196, 92,
- 64,170, 93, 27,120,137, 12, 54, 52,247, 70,236, 83, 4, 49, 70,236,163,242,163,229,231,141, 43, 22, 88,167,130,234,115, 23,132,
- 28, 63,126,102,182,239,232,198,182,131,173, 95, 47,225,254,193,240,177,193, 40,129, 38, 51,118,163, 55,103,103,235, 47,182,213,
-246,205,219,125,156,163,119, 52,161,166,210, 10,141,226, 56,255, 45, 44,217,235,156,140,206, 18, 52, 24, 61,162, 25,115, 24,129,
-107,224,137,219,143,222, 59,255,224,195,127, 94,236,250,112, 29,142,114, 23,221,169,212,249,145, 24, 60,130, 94,231, 46,244,147,
-250,244,179,139,159,126,172,218,179,155,241,122, 0,217, 76,175,129, 16, 0, 49,212, 78,108,212,218, 63, 58,251,249,151,242,242,
-197, 75,107,121, 71, 8, 80, 45,227,193, 8, 93,114,194,153,198,175,108,216,169, 7, 70,237,237,195,152, 60,226,104,230,161, 24,
- 53, 88,208, 91, 0,215,193, 25, 68,180,212, 90,113,101,169, 93,133, 64,175, 17,204,162,108,252,137,136,210, 85,190, 49,102, 74,
-147, 63,125,254,212,253,240,117,121,227,244, 42,116,119,232, 15,168, 1, 39, 12,103,160,168,215,169, 5, 21,117,122, 62, 31,192,
-110,223,171,124,139, 10, 46,247,221,180,187,153,239,187,240,234,122, 76,175,150,114, 91,244, 72, 89, 63, 26, 76, 6, 48, 39,158,
-226,176,255,215,106, 37,245,196, 25,148, 50,249,242,237, 55,235,139,203,213,158,128,156,148, 71, 48, 29,238, 86,145,169,169, 40,
-203,123,237, 60,204, 97,182,169,231,187, 34, 30, 96, 33,249,129,227,131,114, 61, 26, 59,185,208,108, 42,238, 80,168, 14,191,208,
- 3,169,212,114,176, 88, 66, 15,163,144, 55, 79,194,230,203,147,244,214,229,159, 87,127, 35, 96,204,160, 99,135, 30, 76,118,102,
- 25,199,172, 1,239,224, 47,183,124,103, 31, 16,238, 15, 67,120,210,124,114,220,212,251,253, 56, 68, 14,217, 41,142,195, 39, 26,
-102,113,138, 27, 75,155,235,188, 58,104,122, 2, 0,154, 72,169, 99,237, 41,155,179,219, 79, 79,143,215,151,223,111,127,253, 35,
-238,111,254,165,212,119,225, 12,221, 18, 81,132,150,220,210, 40, 6,229,217, 78, 18,216, 67, 1, 3, 44, 30,186,198, 64,157,188,
-144,233,179,172, 6,254, 73, 51, 88,191, 1, 74,153, 53,175,250, 91,221, 72, 58,185,231, 33, 41,231, 18,167, 70, 26,181,144, 96,
-167, 92, 3, 14, 69,160,241,115,197,120, 16, 7,147,103, 81,181, 72, 93, 0, 35,175, 44, 69,234,186,185, 58,125, 59,185,163,124,
-117,109,119,247, 72, 72,187, 50, 28,190,105,121,151,134,192,224,203, 36,158,124, 58, 53, 69,135, 16, 17,148, 84,173,235, 34,218,
-165,247, 84,124, 92,144,178,168,152, 82, 30,227,255,238, 51, 24,226, 72,113,173, 5,251, 55, 86,224,149,227,134,131,207, 43,139,
- 92,171,232,179,220, 40, 39,107,141,214,203, 71,145, 86, 88, 65,109, 44,189,169, 74,171,117,160, 18, 54,237,173,198,156, 44, 86,
-197,138, 56, 35,101,115,230, 77, 36,126,160,231,156,239,192, 42, 88,210, 5,126,120,152,169,243,168,243, 20,107,164,122,133,224,
-193, 57,186, 52,170, 9,162,159,163,156,103,214,124,207,109, 1,231, 53,226,187, 61,140,219,162, 20,159,152,225,252,221,199,243,
- 87,223,253,133,181,230,107,234, 90,163,163,152, 93, 3,232, 3, 5,173,144, 35,119, 83,149,188,182, 85,114, 65, 73, 0, 63,216,
- 53,168, 65, 59, 75, 52,180, 30, 59,131,246,137, 79,123, 58, 65,247,206, 35,106, 9, 32,181,249, 24, 30,241, 57,184, 85, 70, 78,
-236,214, 6, 5, 83, 69, 62,217, 70, 61,202, 10,141,225, 17, 8, 93,203,135, 46,189,147, 40,139, 27,128, 67, 53,170,174,166, 38,
-124,163,189, 83,148,241,217,233,172,145,156, 25,204, 6, 8,214,247,129,181,147, 19,184,205, 20,117,235, 75,161, 95,244, 65, 83,
-146,234, 16,220,113, 89, 99, 91,131, 22,243, 78, 47,165,178,149,215,149,166, 61,232, 4, 0, 2,178, 1,117,199,228,102,124,142,
-206,160, 17,218,142,193,155, 41,183,113,162,173, 27,104, 65,156, 12, 31, 33,106,148,141,162, 26,186,225,121, 26, 15,202,201,242,
- 0, 1, 59, 12,212, 70,144,107,128, 99,178,255, 11,192,209,181,236,200, 77, 68, 81,187,202,101, 87,219,238,233,199, 48, 12,211,
- 61, 33,137, 34,162,132, 9, 1,132,196, 67, 2, 9,137, 61, 63,193,142,111,226, 27,248, 11, 54,236,178, 2, 22, 40,210,144,145,
-152,100,232,233,110, 63,235, 97, 23,231,248, 7,102,218,174, 91,247,158,227,123,239, 57,242,209,131, 77, 35,236, 36,160, 63, 53,
- 52,185,124, 29,215, 25,114,169, 83,125,224,170,169,167,118, 4, 31,222,138,136,122,168, 17,135, 21, 27, 58, 6,141,179, 35, 8,
-117,112,131,233, 28,229,194,216,245,112,153,181,195, 65, 56, 4,146,156, 57, 15,132,237,231, 6,247,134, 51,194,205,125,255,219,
-223,127,253,254, 71,147, 47, 62,122,246,244,197,252,116, 94,226,192, 56, 36,150, 15, 67,162, 50, 68,120, 46, 53,112, 49,110,195,
-230,116,249,240,189,205,249,122,126,190, 60, 91,174,215,249, 82,231, 42, 46,233,159,106,128, 30,141, 55, 28,162,161, 8, 6,234,
- 13, 46,175,137,217, 38,193, 83, 88,211, 30,205, 73,209, 61,249, 56,124,251, 92,125,242,168,188,216,204,182,107,117,246,193,201,
-135,219,242,226, 50,123,121,165,126,248,206, 62,219,128,232,182,156, 65, 66,221,173, 6, 18,203,201,239, 7,136, 0, 68, 36, 78,
-197, 64, 77, 94, 27, 8, 58, 56,204, 21,131,218,251,216, 30, 67,146,189,219, 92, 20, 87,159, 61,184,187, 91, 29,118, 93, 22,118,
-243, 1, 16, 4,249,216,241,222, 27,249,197,139,205, 79, 63, 15,171,237,253,221,117, 61, 28, 6,119, 20,134, 58,174, 93,243, 6,
- 25, 60,187,124,178,186,143,150,191,252, 10,144, 92,199,120, 89,236,214, 57,210,213, 48,137, 18,143, 20, 68,166,228,109, 22, 18,
-176, 71,142,108,250, 48,121,224,149,184,239,200, 77,122,146, 98,201,217,179,176, 39,113,140, 91,183,140,103, 50,205,230, 50,203,
-105,231, 57,211, 82, 83,133, 80,203, 60, 20,105,249,253, 55,203, 31,191,250, 55, 61,121,221, 31,247,174, 71,106, 67,152,117,180,
-195, 14,114,242, 48, 55,209,208,139, 54, 14, 85, 26,106,103,246, 67,117,108,171,131, 51, 55,110,255,143,171,110,251,230, 63, 31,
-237,233, 77, 48, 78,159,169,250,145,199, 47,232, 76, 70,171, 13, 81,114,214,166,171,198,190, 13,219, 11,253,242,235,165, 97,155,
- 71,196, 43,126, 67,140, 57, 31,197,137,125, 84, 42,118,126,106,238, 0,142, 10,220,206,117,149,162,102,100,229, 65, 71,219, 93,
-112, 13,184,163,176,102,232,144,199,186, 92,182, 76, 0,169,163,182, 61, 3,146, 59, 34,169, 44, 67,145,249,179,199, 87,215,201,
-236,246,102, 71, 55, 46,196, 55, 74, 54, 95, 4, 69, 72,187, 4,239, 49, 47, 40, 24,103,171, 1,108,212,190,185,137, 68,182,250,
-116, 29,183,199, 35,206, 47,109, 35, 42,110,151,209, 52,127, 56,142, 53, 42,165, 27, 0, 91, 13,149, 36, 44, 87,165, 40,110, 5,
-188,136,103,125,123,189,123,254,101,169, 46,207,255,124, 5, 6,185, 87, 66, 11,154, 5,211, 16, 10,177, 95,184, 20,201,160, 1,
-127,101,190,230,158, 9,224, 26, 14,223, 11, 84,104,164, 86, 94, 4, 80,246,118, 24,142,164, 9,116,233,234, 73, 21,154,185,164,
-159,192, 80, 26, 92,120,129,114, 66, 45, 19,112,108,148, 14, 5, 32,207,212, 98,193, 42, 42, 84,124,215, 81, 72,155,221, 9,193,
- 65, 72, 20, 17,215, 28,148,120, 87,175, 78,243,197,251, 30, 0,231,237, 45,126,147, 9,129,211,145,105, 34,105,102, 52, 91, 3,
-120,209,131,134, 98, 53, 53,231,103,145, 38, 51, 20,176, 68,231, 66,114, 34, 71, 50,210,169, 10,217,210,121, 62, 98,233, 66,152,
-107,162,243,249, 34,229, 54, 38,183, 78,197,162,164,225, 91,164, 66,145,203, 46,142, 50,239,117,153, 34,116,114,170, 1, 75, 74,
- 89,242,147, 82,240, 5,101,220,169,143,129, 35,162,189, 88, 97, 1, 76, 53,222, 43,135,141,241, 63,168,210,213, 7,138,102,224,
- 0,122,196,154,237, 81, 2,129,137, 19,110,111, 83, 98, 35,225,103,247, 5, 46, 95, 42, 13, 82, 29,114, 33,146,225,140,202, 69,
- 20,167, 47, 66,153,122,189,200,214, 87,159,239, 31, 62,181,135,123,141,226,192,237,227, 73, 62, 43,150, 35, 37,247, 12, 91, 16,
-209, 58, 48,244, 76, 25, 1,181,203,193, 55,248,123,218, 73, 51,234, 57, 66, 81, 20,241,200,125,118, 79,121,108,246, 3,112,232,
- 93,159,107,128,169,160, 21,240, 17, 7, 83,173,181,135, 69,186,140, 80,208,184,139, 90,143,157,218, 14,181, 17, 66,142,235,196,
-165, 70, 80,162,111,166,232, 86,175,168,249,155,214,141,239, 37, 21,236,116, 87, 1,183, 31,181, 83, 62, 43,221, 34, 42, 51, 37,
- 42,207, 1, 77,126,144,233,152,175, 91,171,113, 50,133, 1, 34, 5, 64, 7,196, 6,251,205,102, 46,143, 76,192,251,160, 87, 75,
-224,228, 9,219, 42,160,145,200,134, 62,233,164,231,204, 40, 69, 74, 45, 57, 65,172,168,146,195, 6, 76,204,111,213,105, 84,240,
-199,100, 73, 64,165,140, 82, 29, 87, 72, 52, 98,174, 40, 58,150,162,112, 78,162,156,190,248, 95, 0,150,174,166, 55,142, 34, 10,
-118,247,124,246,204,110,236,181, 99, 71, 14,182, 54,150, 33,137,225, 20,133,128, 18,137, 3,226, 0, 87, 36,254, 45, 8,164, 72,
-156, 64, 96, 33, 14,112, 32, 32, 72, 28, 7,140,215,235,249,234,238,153,238,166,106,197,125,119,103,102,167,187, 94,189,215,239,
- 85, 37, 39,199,119, 55,217, 16, 88,195,152, 90,172, 55,220,124,194, 89,152, 48, 99, 99,152,242, 45,144,111,112,148, 47,226, 56,
- 33,110, 4, 64,166, 34, 88, 94,116, 9, 88, 31,232,179,233, 39, 15,154,173, 72, 97, 92, 26,140,231, 36,101, 98,170,235,186, 51,
-120,151, 78,103,202, 34, 1,229, 56,130,202, 93,250,219,249,249,151,223,254,249,211,175,238,194,158, 44,247, 30,237,222,123,175,
- 58, 56,185,181,124, 50,219,125, 80, 47, 79,171,197, 7,122,239,169,212,239,190,188, 62,254,254,247,234,155,159,203,175,126, 40,
-127,124,189,124,101,246,250,236, 80,111, 31, 30,104,189,163,145, 1,197, 85, 67,237,176, 30,172,117, 43,189, 69, 73, 22, 79,160,
-207,130, 1, 59,188, 10,107,103,219,174,175,231,237, 91,135,246,193,161, 60,125,232,238,223, 15, 39, 7,253,209, 29,151,135,149,
-237, 56, 21,152,210, 1, 20, 25,148,244,115,164,198, 0,165,144, 9, 33,122,158,243,176,104, 63, 6,218,255, 36,150, 22,154,216,
- 25, 2, 63,108, 61, 13,202,154,237,189,241,241,211,163,157,219,251,231, 47,210,127, 84,107,117, 55, 7, 59, 95,205,235,157,253,
-207,191,152, 47,223,190, 92,189,240,225,218,136, 94,216, 94,245,131,155,204, 52, 52,126,216,173,238,189,255,206,215,103,229,243,
-231,175,192,109, 43, 68, 5,150,178,121, 4,179, 25, 0,230,208,104,204,255, 87,197,166, 11, 50,187,163, 19, 54, 28, 33,107,202,
-169,165,185,153,179, 28,193, 81,240,169,180, 74,117,113, 43, 17,192,244,156,149,207, 58, 84,192,251, 34, 55, 57,118,104,190, 93,
-205, 63,251,104,241,236,209, 31,210,255,210,175,193,166,192,232,156,160,210, 36,214, 8, 59, 32, 21,245, 66, 70,112,186,108,144,
-126,109,109,227,250, 70, 94,253,213,175,174,176,143,252,245,155,169,249, 59,228,255, 38,193, 77, 13, 77,119, 65,209, 89, 16, 23,
- 70,148, 84, 34, 5,117,205, 10, 23,135, 40,174,188, 56, 58, 72, 31,127,178, 40,142,149,209, 17, 57,166,204, 18, 97, 54,133,159,
-148, 14,218,108, 92, 2,173,234,169, 23,183,145,112,166, 23, 72,108, 58,223,102,161, 83,146,221,177, 50,239, 64,164,112,141,144,
-180,200,181, 38,206,109,178, 87, 73, 0,115, 75,173,202, 74,250,122,202,110,103,179,211,103,103, 23, 55,171,117, 11,122,210, 82,
- 25, 36,208, 59,146,138,223, 98,221,142, 26,171, 83,197,110, 0, 82,171, 93, 21,155,203,254, 34, 21, 15,151,179, 59,235,182,197,
-187,219, 21, 14, 41, 61,160,164, 99,213,103, 68, 2, 94,110,232,203,152, 48, 88,128,147, 33,202,150,164,192, 85,205,114, 46,144,
-251,195, 79,151,175,123,125,246,221, 27,133,128, 91,112,194,118,240, 84, 43,193,186,199,198, 8, 41, 24, 11,117,142,107,193,176,
-176, 24,121, 40, 88,217, 17,207,121, 57,210,245, 26, 9, 49,197, 86, 17,250,147,105, 50,148,216, 45,242, 1,128,178,200, 54,134,
- 22,217,141, 7,190, 90,224, 40,143,128,145,211,107,172, 53,167, 50, 4,121, 85,251,100,192,159, 69,165,182,209,116,147,244,142,
- 61,208,214,100,161,231,104,126,146, 31,250,151, 43, 68,144,105, 22, 21,167, 96, 64,138,148,211, 94, 98,251,215,192, 76, 73,213,
-126, 41, 90,159,143,125, 42, 23, 78,217, 52,178,114,138,200, 92, 20,243,177,142,114,136,160, 92, 97, 75,171,118,140,227,192,233,
-127, 9,158, 63, 74,118,175,243, 72, 7,116,139, 22,229, 85, 16, 57, 88,200, 14,112,173,102,134, 94,230,198,103, 97, 83, 77, 6,
- 96, 17,249,227,148,179, 61, 54,150, 35,125, 43,123, 63,233, 24,154, 41,105,129,127, 25,237, 83, 0, 79, 6,251,200, 0, 27,114,
- 78,170,186,176, 15,240,167,234, 55,113, 58, 77,130,158,171, 84, 83, 85, 24, 65, 70,112,114, 53, 43,241,184,243, 52, 34,107, 72,
-199,109,233,247,239, 86,197,147,143,207,193,238, 64, 37, 18,106,157,167,110,134,187, 5,235, 54, 30, 87,173, 74,118, 13, 79,248,
- 94, 18,168,145,234,179,218,228,216, 32, 53, 15, 36, 25,144, 57, 22,155,149,128, 47, 93,201, 14,124,211,200,220,231,185, 86,128,
-238,206,150,192, 12,107, 55,246,222,180,249,181,243,166,188, 76, 98,166,211,104, 12,187, 97, 76,224,193, 60, 16,112, 66,184,196,
-195,106,112, 7, 71,101,125,236, 40,196,234,194,115,184,220,130, 89, 71,188,219,172, 67, 74,126,131, 63, 49, 49, 92,253, 93, 98,
-105,139, 44,233,250, 87,130, 30, 57, 80,124,192, 52,107,137, 99,177,153,198, 31, 64, 49,182,192,106, 51,155,209, 22,172,180,162,
-183, 45,114,185, 18, 28, 25, 47,111, 94, 33, 33,192,106,149,172,180, 40,225, 57,200,201, 67,200, 16,171,114, 66,166,215, 10, 55,
- 0, 93,233, 19, 72, 61,178, 38,128, 30,199, 33, 41,250,162,181, 27,145,211,242,250, 63, 1, 56,186,150,221, 70,138, 40, 90,175,
-174,126,186,109,231, 33, 24, 6, 13, 4,101, 16, 8,129,196, 6,101, 1, 59,190, 2,137, 5, 18, 11, 62,138, 5,223,192, 47,176,
- 64, 44,137,148, 25,105, 22, 3,210,144,104, 38,137, 19,219,253,170,174, 39,231,218, 43, 75,182,236,238,174,170,123,207,169,186,
-247, 28,229,157,151,116, 26,194,216,128,193,225, 72, 39, 18,232,145,220,147, 16,167, 45, 89,151, 49,170,100,178, 70,229, 26,112,
-220, 82, 83, 37,178,115, 78,226, 73,108,139,197, 56, 91, 45,216, 74,242,253, 44,148, 5,125, 29,137,255, 54,128,237,177, 1, 38,
-148,197,228,198,228, 7, 75,165,122,184,164, 26, 65,109, 89, 25,219,252,245,250,213,159,151,151,191,101,205,242,189, 15,150,235,
-234, 9,171,236, 46,206, 75,183,217,226,158, 55,219,153,164, 26,153,239,120,166, 73,245,150,235,154, 79,170,212, 73, 54,231,237,
-234,203, 79,190, 62,251,184,123,234, 54,217,187,235,187,241,110,122, 28,122,204, 20,170,100, 34,143, 35,242,214,117,142,119, 54,
-101,180,134,196,253,176,195, 99, 93,200,217,144,172,103, 77,226, 55, 72, 6,250,160,135, 47,137, 61, 70,150,122, 65, 7,199, 92,
- 57, 18, 10, 2,112, 9,212,243,226,233, 43, 84,168, 11,140, 98,171, 40,145, 16, 38,143,209,241,183,118,118,237, 41,191,248,166,
- 57,251,244,187,223,127,109, 95, 92,253,123, 63, 13,250,105,251,203,207,226,252,139,219,225,174,143, 29, 0, 11, 7,218, 77, 59,
-234, 83,155,145, 26, 76, 56,201,157,159,244,229,223,189,150, 83,173,228,142,142, 40, 15,202, 69,228, 72,137, 80, 75,141, 48,146,
- 42,134,144,170,129,221,200, 47,155,230,129, 6,136, 15,121, 14,130, 64,141,227,146,103, 76,147,148, 91, 19,165, 43,136, 24, 83,
- 63, 9,101,206, 53,240,179, 9, 41,227,197, 89,187,250,254, 91,119,254,249, 63,190,187,178, 19, 8, 36, 21,166, 71, 42,113,199,
-253, 82,225, 15, 2, 61,102, 37,199,136,109,193,163, 67,191, 55,227,198, 63, 76,108,122, 27, 59, 27,231, 91, 27, 31, 88, 54, 82,
-175, 81,126,168,225,203, 37, 27, 45, 53,187, 33,184,155,131, 24,143, 19,192,152,212,107,122,244, 76,124,117, 81,181, 31,170,177,
-155, 1, 84, 65, 39,137,120, 87, 4, 98,145, 5, 56,249,181, 1,204, 10, 95,204,126,196, 4, 34, 17, 33, 58,161,244, 36,198,142,
-119, 22,211,117,207,194, 8, 2, 70,167, 75,150,147, 79, 65, 41,200, 8,155, 52, 11,105, 79,150,142, 16,129,247,215, 85,235,143,
-236,187,215,143, 42, 37,173,227, 4,222, 61, 83,217,215,104,146, 13,201, 52, 73,239,105,211,174,154, 35,208,235, 6, 67, 85,248,
-238,141,253,227,236,253,159, 78, 79,197,221,127,172, 23, 25,137,105,145, 64, 35,130,184, 34, 83, 51, 73,198, 48,101,162, 10, 57,
- 74,232,200,184,193, 91, 79,110,163,179,120,243,242,118,113,114,243,227, 15, 79, 94, 94, 61,123,241,234,166,144,136,182,139,164,
- 88,195,229,108,105, 3,100,192,106, 23,185,176,201, 49,154,169, 91,204, 54,161, 11, 65,242, 50,149, 98, 37, 25, 31,140, 68,181,
-230,131, 97, 77, 78,246, 21,136,245, 10,127, 57, 4, 83,114, 61,131,183,138, 34,155, 0,190,233,108, 23,191,130,156,166, 6, 38,
- 22,149,155,242,108,136,108, 73,202,214, 17, 17,255,144, 86,138,100,241,191,253,112, 79, 98,139, 77,245,209,115,189,191, 25,182,
-215, 82,244, 98,177, 0, 58, 41, 60,174, 68,135,173,203,164,106,143,163, 51,132,185,228,206,251, 64, 85, 78, 41, 32,136,227, 97,
- 11,201, 86, 46,142,237,218, 25,196,148,232,145, 62,195, 90,104,231,198, 34, 1,167, 55, 88, 15,132,171,243, 2, 0,141, 75, 80,
-170, 66,103, 70,199, 56,138,146, 76,180, 88,137, 64, 76,153,125, 53,217,125,142, 24,103,169,221,223,211,139, 59,110, 75,144, 45,
-178,180, 12, 42,204, 33, 59,200,136, 34,208,203, 0, 40, 49, 41, 89, 72, 29,144, 34,105, 23,156,116,202, 1,197,107,145,187,222,
- 91, 60, 55, 14,220,109,138, 99,166,250, 40, 51,234,214,109,132, 5,220,214,121,106, 62,187,120, 56,121,238,205, 91,217, 44,133,
- 65, 6,175, 14,166,119,219, 24, 58,230, 78,141,158,102,189,245,189, 44,243, 74,137, 85, 16, 27,172,157,149,172,167,105, 11, 56,
-178, 96, 21,203, 68,232,250, 36, 49, 2,117, 82, 69,169,178,138,136, 28,146,140, 29,146, 92, 39, 78,213,129,184,246,196,249,130,
- 20, 16,201, 65, 10,232,183,119, 53,134, 32, 91, 46, 2, 73,109, 59, 16,164, 29, 41,126, 62,238, 98, 46, 67, 46,234,130, 79,150,
-236,186, 93,225,237,152,107,149, 26, 47,188,169, 49, 4,170,176,194,121, 0, 28,218, 9,145,158,149, 67,234, 74,218, 73,195, 74,
-206, 61, 50, 47, 98, 76, 43,230, 41, 40, 3, 56, 26,196, 35,185, 45,107,135,216,153,143,248,164,101,182,212, 42,100, 1,108,193,
-216,153, 21,252,184,110,175,189, 95,141, 51,177,218,210, 97,125, 21,126, 0,119,113,110,169,113, 13,202, 76,209, 20, 98, 97,212,
-145, 63, 64,214, 89, 31,249, 21,150, 79, 60, 74,190,249, 95, 0,146,174,101, 71,142, 34, 8,118,117, 85,245,123,167,103,118,141,
-189, 54,214, 98, 35,144,197,193,226, 96,132,144, 17,226,130, 79,252, 36,226, 63, 16, 63,129, 16, 92, 16,178,132, 95, 98,103,118,
-166,167,171,187,170,235, 65, 68,115, 30,237, 72, 91,147, 21, 25,153,149, 25, 33, 31,220,108, 70,201, 69,241,128,155,229, 81, 26,
-129,189, 3, 90,128, 33, 25,242,217, 44,105,219,231, 52,123,128,116,181,176,171,232, 2,174,246, 76, 9, 26, 20,220, 18,101, 28,
- 95,154, 71,154,172, 6, 74, 35,228,122,106,241,129,165, 51, 67,166, 57,165, 27, 92, 89,110, 16,226, 89, 9,228,173, 41,134,124,
-175, 43,218,157,222,102,165, 86,181, 75,119,111,134, 15,195,254,253,219,225,246,221,105,191,248, 59,212,255,248,150,203, 77,117,
-113,121,117,221, 53, 87,156,197,106, 27,181,181, 67,219,136,236,157, 57,254,246,183,249,253, 40, 15,238,163,244,201,199,159, 94,
-150,253,113,220,159,206, 35, 35, 9,165, 15, 66, 68, 44, 40,188,106, 86,162, 33, 1, 68,217, 5,102, 55,194,131,154,112,194,137,
-117,171,206,129,151, 20,191,152, 22,190,190, 51,217,177, 27, 12,106, 11,102,154,115,165,136, 77,121,166,127,164, 43, 4, 90, 62,
-231,171, 52, 21, 71, 2, 11, 35,146,166, 56, 87,118,216,110,210,139,151,143,159,253,240,252,112,234,190,249,194,124,253,114,156,
-222,152,229, 52,230,167, 76,236,233, 6, 49,162,148,195, 33,217, 0, 22,223, 63,190,127,144, 15,126,250,249,159,201, 89, 5, 40,
-144, 8,106, 14, 10,113,243,130,123,219, 92, 55, 77,124, 9, 88,105,165,206,194,234,151,141,195,224,188, 19,117,104,104,172, 25,
-202, 70,226, 80, 11,122,117, 0,215, 91,145,182, 93,115,113, 81, 22, 77,143, 63, 25, 42,245,213,231,247,126,124,149,110,158,254,
-105,143,239,151,217,112,232,107,101, 48, 64,229,132, 42, 65,204,105, 30, 5, 40,155,165, 33,178,221,251,179, 73,163, 9,167, 41,
-191,187,181,195,191,243,252, 58,197, 61,232, 74, 50, 67, 0,103, 36, 12,219,213, 40,151, 47,222, 43,242,182,220, 3,195,137, 57,
- 54,213,227,183,223,247, 15,159,180, 67,253,191,130, 23,200, 10,126,102,130, 56,241,125, 33, 29,195,161, 6,176, 17,147,121, 19,
-168,249,126, 84,193,208,203, 20,161,201,177, 49, 35,139,129,111, 68,220,213, 29, 11, 53,164, 22, 39,226,169, 84, 19, 27, 54,103,
-100,151, 27, 84,220,151,238,201,179,155,253,238,250,143,191,142,248, 29,230,115, 6,202, 96,139, 5,183,198,131, 67,154, 40,169,
-252,129,255, 45,156, 20,138, 74,155, 79,177,119,168,117,236,235, 67,250,242, 81,221, 47,135,217,198, 82,151, 82,132,172, 13, 72,
- 14,244, 29, 64,149,230, 16, 22,244,102, 64,172,218, 21,116,216, 36,147,244, 4, 67, 85, 60,236,111,159,190,232, 31, 61,255,236,
-151, 95, 39,119,247, 1,192,198,124, 15, 22,159, 40,224,101,184,168,130,220, 45,162,166, 55,180, 63, 11,246, 96,202,200,165, 42,
- 95,243,124, 86, 3, 13,238,175, 71,209, 75, 92,136,188, 74,149, 67,193, 45, 93,217,117,156,128,169,112,175,133, 26,180,215,161,
-232, 72,131,233,227, 27,194, 60, 27,170, 56,224, 8, 57,201, 41,140,157,131, 79,113,140,168, 28,192,203,172,247, 7, 51, 30,138,
- 98,215,110, 31, 78,241, 24,198, 91,220, 86,155,167,245, 57,131,187,131, 69, 38,122, 16,108,157,140,173, 41,168, 21, 91,193, 23,
- 29,165,147, 44, 89,168,251, 54, 86, 86,137,137,201, 59,149, 69,198,165,125,142,101,229,190,168, 0,135, 35,247, 5, 74,147,137,
- 58, 3,122,171,229,140,176,209,124,128,160,158,149,164,104,187, 66, 25,135,154, 70, 53,193,123, 96,184,163,105,108,167,188, 32,
-198, 87,182,116,214,118, 51, 85,125,194,201, 95,120, 41,129, 92,115, 42,168,117,184,142,151,121, 34,123, 85, 32, 33,101, 20,131,
-149,158, 64, 47,164,196,165,140, 82, 37,246,250, 47, 98, 80, 59,220,175,112,117,255,186,252,238,213, 91,176,116,115, 18, 57, 85,
-128,163,115, 39,177,209,203,101,235,250,141,188,222, 21, 87, 59,127, 35,230,205,232,202, 15, 62,242, 13, 34, 44,148,142,195,193,
-183,178, 27,155,180, 58,160,102,162,237, 87, 21, 18,132, 21,231, 26,115,182, 93,155, 57,212, 92, 10,174,211,236, 93,205,203,205,
-217,152,164,202, 65, 45,149,202, 42, 92,188,218,134,187,210,112,114, 13, 28, 62, 47,116,157,167,190,145, 3, 16, 28,240, 65, 19,
-117, 9,198, 72, 51,153,197, 73,195,205, 77, 54, 88,231,188,148,203, 28,171, 10,161, 89,209,119, 52, 32,101,137, 51, 87, 89,178,
-122,161,236,144, 43,168,210,137,244,192, 45, 21,117, 14,171,178,169,142,171,228, 97, 4,228, 2,170,252,200,229,168, 85, 47,221,
-226,210, 32,117,166, 35,106,156, 41, 55,115,237, 20, 5,100, 5,130, 44, 78, 94,115, 84, 6, 33,152,245,168,128,124,165, 23,181,
-232,173, 79, 22, 40,133,192,254, 79, 0,146,174,101, 55,142, 34,138, 86,117,117, 85,191,102, 50,211,142, 99, 99,108, 39, 74,226,
-196,137,242,146, 16, 98,137,132,196,138, 53,191,200,146,207, 96,205, 6, 88,194, 34,114,132, 67,176,103,156,153,238,174, 55,231,
- 52, 59,175, 70,237,122,220,123,206,173,123,207, 81,253,209,105, 21,144,175,144,215, 34, 49, 44, 93,238, 0,221,203, 72, 49,248,
-130,182,183,200, 95,105,208,224,203,129,210, 86,123, 69,125, 72,201, 33,120,246, 14, 35, 35, 27, 96, 33, 75,101, 62,186,145,148,
-185,169, 64, 90,141,106,124, 91, 54,108, 57,213, 56, 0,102,209,253, 31, 93,170, 64, 80,102, 92,162,217,163,238, 26,144,171,149,
- 42, 30,244,205,178,235,187,131,190, 95,119,253,106, 81, 53,171, 99,131,243, 11,104,221,204,235, 78, 45, 17,173,166,160,213,170,
-169,211, 50,130,158,237,255,141, 31,182,183,191,125,144,183,113,117,126,124,130,205,211,251,205, 30,232,171, 45,114, 67,105, 14,
- 79, 77, 46, 85,123,250,196, 72,195, 73, 95, 26,156,114, 34,142,106,192,194,167, 10,209,183,192, 70, 10, 34, 58,240,148,217, 31,
- 16, 48,146,243,128,116,191,155,133, 48, 10, 86, 74, 88,183,195, 13, 44,117,154,221, 94,104, 93,132, 95,192, 34,249,100, 71,208,
- 24,251,160,245,223,124, 53, 93, 60,252,199,222,221,216,109,148, 59, 82, 2,207,243, 62, 34,130,225, 82, 58, 86,107,212,253,167,
- 15, 55,249,240,167,159,255, 94, 84, 56, 84,130, 58, 29,197,220,122, 14, 84,194,121, 0, 36, 20,186, 49, 11,138, 3,224,158,165,
-249,229,151,179,161, 51,106, 82, 64,128,134, 29,144, 20, 84,104, 22,149,169,171,110,161,187, 5, 54, 6,144,221,136, 49,136,133,
-248,238,117,255,227,183,238,222,250, 15,119,115, 53,129,181, 20,236, 31, 21,108,234,162,170, 82, 25, 6, 57, 80,254,161,216,201,
-124,231,135, 77,112, 55,241,110,242,159,110, 67,248,104,227,159,110,252, 4,176,147,216,102, 15,150,184,203,203,137,226,185,131,
- 5, 17,164,224, 34, 45,155, 51, 27, 23, 29,123,211, 4,240,253,229,171,238,226, 77,251, 25, 89,160, 7,236,211,108,198, 23, 51,
-188, 67, 58,209,236,219,139,128,119,145,218,206,193, 17,175,227,139,252,150, 99,228,190, 42,210, 86, 83,100,219,226, 80, 81, 49,
- 2,212, 89,222, 25,176, 92, 10,165, 91, 58,120, 91,138,167,241,125, 82, 84,226,222,162, 56,122,251,242,119,223,223, 92,253,133,
- 36,239, 45,118,128, 79,190, 49,208,202,145,206, 19, 49,236,176, 23, 99, 98,119, 48,176, 61,150, 83,225, 47,182,228,188,124,177,
-126,220,237, 63,150, 27,228, 73, 55, 18,170, 40,195,119,129, 50, 40,160, 78,218,113,104, 62, 20,148,137,167, 87, 34,169,212,172,
-212,149, 74, 59, 59,217,247,241,213, 15,171,243,199,135,191,254,178, 9,159, 57, 89,163,199,194,178, 66, 75,203, 9, 14,117, 53,
- 98,154, 24, 10, 35, 11,107,146,209,212,103,185, 12,147,116, 6, 11, 98,240,243,228,186,201, 33,144, 21, 84, 48,157,170,130,164,
-216,152,206,209,209, 3, 65, 70,216, 76,139, 14,220,136, 50, 20, 27,150,232, 75, 14, 59, 33,249,243,113,222, 69,190,186,228, 48,
-237,183,174,197,135, 70, 55,133, 97,212,215,187,226,202, 14,237, 65,123, 82, 54, 10,184,175,180,114,129,157,174, 67,159,107,224,
- 0, 71,227, 70,181, 66,216, 86,180, 49, 97,159, 64,169, 59,234,212,129, 84, 25,186,133,198,212,209,193,141,255, 57,206, 50,118,
- 10, 60, 6,215,123,237,169,239,217, 34,200,150,192,206,147,215,181, 98,185, 47,216,138, 42,189, 38,211, 94, 88,137, 84,143, 8,
-109,115, 83, 84, 73,103,118, 16,131,145, 99,229, 59, 92, 43,155,173,194, 50, 75, 65,219,100,164,109,121, 13, 52, 3, 2,210, 25,
- 0,253, 58,139, 37,226, 7,214,112, 22, 69, 69, 98, 5,161, 95, 74,160,239,130,130, 90, 85,137,175, 31,234,234, 80,184,178,147,
-205,129,186,127,249,253,248,252,145, 31,175,233, 92,203,231,233,245,147,254,236,197,233,151, 95, 63, 45,222, 60, 43, 47, 47,226,
-243,179,248,236, 81,120,125,238,222,125,113,246,100,121,116,146, 78,139,124,140, 79,169,248,198,184, 92,228,134, 42,188, 9,121,
-211, 18, 47,243, 97,102, 54,135, 15,217, 21,210,230,214, 39,228,211, 49,237,119, 57,153, 53,171,216,192, 84,161,193, 6,198,138,
-227,148,185,171, 65,146, 85, 48, 19,144,104,166, 52,154, 23, 86, 78,110,147, 59, 42, 34,130, 72,108,154, 33,251, 42, 33,144, 36,
- 47,181, 30, 58,225, 50, 11,169, 98,139,216,141,108,134, 91, 12, 20, 52,134,145, 51,210,116,199,145, 46,105, 0,203,118, 35, 84,
-163, 17,111,231,217,172,192,160, 66, 86, 19, 60, 34, 29,248, 5,141,180,216,128, 89, 69, 16, 22,160,170, 42,178,199,222,234, 58,
- 21, 75, 51, 52, 26, 23,135,233, 26, 8, 10,148, 11, 95,133,219,144, 35,149, 32, 92,213,234, 28,100,205,113,195, 0,198,244,159,
- 0, 36, 93,203,142, 27, 85, 20,188,125, 95,253,244,140,199,137,130, 18,133,128,152, 16,177, 64,192, 2,177, 0,132,132,144, 96,
-197, 15, 35,177, 1, 33,148, 69, 96, 17,164, 40, 72,108, 66, 30,243,112, 60,182,187,221,125, 95,221, 77,149, 89,142, 44,141,103,
-220,247,158,170,242, 57,167, 74,221,127,176, 74, 54,160,178, 12,116, 9,162,221,208,120,156,204, 18, 56,157, 96,127,133,118,146,
-201, 21,186,196, 85,200, 5,109, 38,241,231, 24,230,149, 49,120, 1, 69,111,102, 42,159,149, 56,160, 98, 96,218,148,194, 59,250,
-178, 80, 3,136,144,172, 76, 46,101,201, 80, 90, 25,112,145,115, 40,178,106, 58,107,169,191, 24, 34, 32, 85,131,162,191, 84, 83,
-227, 11,215,224, 42, 55,133, 5, 72, 27, 77,199, 29,118,116,108, 93,140,204, 26,196, 61, 58,109,204,202,148,237, 46, 54, 80, 1,
- 9,216,161,241, 8,250,120,125,189,255,103,200,111,150,239, 60,108,170,179,184,222, 93,161,174,114, 7, 92,105,105, 29,160, 91,
-133,226,152, 45, 65, 15,155,160, 3,179, 29, 56,179,223,139, 49,167,175, 17,208,222, 70,134, 37,115,172,159, 40, 0, 89, 2, 64,
- 81,199,144, 14,166,204, 36, 0, 42, 19, 35,217, 87, 60, 46, 51,208,197,144, 54,122,130,138, 90,204,135,208,254, 59, 92,188,244,
-237,171, 3,234,101, 55,203, 1,138, 78,197,203, 24, 14, 12, 22, 5,226,116,116,199,198,103, 33,207,239,223,123,190,182, 63,255,
-180,109,128,239,204, 4,103, 60, 58, 81,133, 13,146, 4, 4,239,193,218,254,103,188,184,134, 32,155,126,180,204, 82,152,128,241,
- 52,130,135,178, 90, 9, 46, 64,230,181, 62, 1,151,170,106,160, 90,108, 80,139, 82, 94, 53,227,226,251,239, 86, 63,126,125, 35,
-229,159,253,110, 67, 55, 11,124,220, 76, 89, 76,212,204,168,199,157, 23, 28,229,215,194,187,184, 77,253,229,136,170,254,118, 39,
-250,139,195,230,239,121,253,194, 79, 7, 14,142,133, 46,233, 20,153, 91, 6,109, 19, 64,212, 4,161,157, 11,180, 92,182,146,185,
-102, 31, 29, 63, 12,227,249,167,230,139,175,154, 88,170,233,246, 4,133, 10,217, 42, 42,118,130,102, 77,155, 91,206,188, 50,100,
- 53, 3, 49,198,253,135, 18, 24,250,228, 15, 34,238,147,107,211,180,205,228, 14, 68,116,118, 14, 64,168,170, 97,100,158, 6,145,
- 40,249,173, 8,145,111, 90, 86,162,106, 40,209, 85, 53,149,183,237,157,207, 30,254,246,194,109,135, 54, 89, 99,123,141, 58,221,
- 91, 70, 87, 13,242, 32,244,228,183,160,101, 28,182,162,235,159,156, 74, 60,199, 68,159, 59,186, 90,221, 93,125,217, 20,211,198,
-113, 99,200,219,172, 25,129, 64, 66,225, 85,240, 92,246, 52, 24, 84,157,232, 5,203, 35,129, 26, 9,140,101, 63,146,216,126,232,
- 58,115, 35, 63,254,225,253,235,185,254,235, 9, 52,200,129,126,133, 16, 36,122,182, 54,243,123,112, 46,154,168, 44,140,109, 59,
-208,216,168,142, 13, 55,166,202,115,169,144, 86,115,189, 55,242,100, 68,177,164,141, 59,119,117,241,154,203,117,214, 91,171,246,
-158,182,163,167,252,246,217,137,102,244, 9,229, 35,224,180, 74,198, 83,179, 91,159, 59,232,199,121, 8,173,162,124, 78,121, 41,
-167, 33,236, 56, 59,221,236,251,238,166,125,126, 8,241,244,214, 39,119, 74,125,245,230,109,235, 33, 76, 77, 45,179, 61, 27,144,
-185,136,118,158, 71,174,118, 49,171, 18, 31,141,117,236,215,114, 60, 14,220, 21, 71,186,144,116, 54, 8,137,185,200,236, 63,114,
-139, 66,210,100, 99,244, 49,174, 52, 21, 3,200, 76,141,255,193,251,160,162,174,161,183, 32, 18,248,189, 37, 51,183,167, 81,213,
-126,112,102,100,170, 67,206,124, 17,211,235, 0,121, 12,158,199, 45,124, 90,178, 9, 57,128,151,232,108,145, 49,190,120, 28, 50,
-212, 58,156,231, 33,159, 87, 96,254,147,132,238, 65,157, 85,228,198,145,131,186,185, 58, 81, 54, 3,142, 44, 83,165, 5,112,213,
-126,243,237, 90,184,201,119,147, 56,255,224,228,209,231, 31,153, 7,239,189, 94, 86,143,205,230,151,110,253,107,127,249,135,127,
-249, 36,110, 31,103,253,239,121,122,122, 54, 61,189,251,238,179, 71,167,198,200,123,179,255,240,170,127,227,138, 11, 91,227,183,
-211, 65,128,211,167,162, 44,237,130,171,136, 44,239,205, 2,108,125,242,146, 17,168,184, 79, 43, 69, 51, 48, 47, 92,233, 22, 33,
-171,114,229, 34,132, 12, 30,216, 6, 60, 67, 50, 14,202,209, 52, 87, 50, 55, 84,234, 26,178, 54, 26,167,217, 55, 53,193,224,209,
-177,196, 50,189,179, 96, 72, 51,109, 60, 37, 4, 84,162, 76, 4, 30, 42,214, 99, 46, 99,131,233,104, 16,181, 29, 91,161,245, 50,
-201, 43,148, 6,202,221, 0,213,165, 80,141,122, 59, 50,187, 44, 58, 46,176,114, 73,178,233, 44,234, 45,232, 79,226,170,160,243,
-177, 51, 86, 59, 19,128,226,190,143, 21,240, 54,171,163, 28,157,189, 5, 90, 98, 80,114, 12,212,132, 43,184,112,138,123,104,254,
- 19,128,163,107,233,141,163, 8,131,211,175,153,158,217,245,122,109, 69, 94,135, 4, 12,129, 75,132,224,134, 0,241, 7,224,140,
-196, 47,229, 39, 32,129,196, 13, 69,194, 39,164, 56, 32, 18,178,218,167,103,122,122,250, 69,213, 28,124, 91, 75,246,246,215,253,
- 85,117,215, 87,165,110,111,150,102, 4,134, 22,244, 88,227,235, 51,197, 95,232, 15,116,224,203,185, 86,150, 83, 70, 21, 31,101,
-233, 60,213, 21, 99, 34,190,127,219,168,121,252,181,107,116, 6, 79,167,193,150,236,240,179,222, 24, 29,233, 22,210,110,240,201,
-141, 85,181, 15, 19, 64, 20, 42,117,126, 54,172, 24,155,134,102,141, 37,125, 22,173, 4, 24, 53,105, 17,219,117, 81,186, 93,121,
-195,200, 87,240,157, 22,204,231,162,177, 98,236, 36,143, 66, 26,159,250,165, 30,121,186,142, 49, 97,235,197, 92,151,110,240,131,
-197,206, 8, 98,231,198,191,254,243,135,225,234,238, 99,123, 35,207,199,145,246,172,198,154,166, 20,135, 3,131, 87, 98, 50, 15,
- 50,170,249,188,155,101,255,156,235, 81, 81,240,198, 93,248,222, 80, 15,130, 69, 68,225, 50,138, 7, 11,165,152, 63,220, 42, 62,
- 55, 21, 26,242,232,196, 56, 35, 38, 16, 50, 40,149,186,191, 25,194, 83, 74,194,139,136,228,233, 77, 31,163, 26, 68,102,138, 98,
-164, 80, 76, 74, 13,228,190,231, 27, 83,152,138,107,196,205,211, 79,238,119,229,215,223,183,139, 11, 63,171, 7, 43, 91, 89, 79,
- 97, 38, 51,153,192,109,193, 45,121,249, 9, 0, 64, 47,224,106, 2,164, 83,117,114,165, 65,141, 88, 84, 71, 99, 42,217, 94,234,
-186,181,118,200,235, 11, 99,175,171,253,108,118,243,217,102,249,211, 15,203,239,190,122, 83,197,251,254,248,152,105,150, 44, 36,
- 19,115, 38,210, 17,134, 49, 68, 51,118,128,223,233, 81,134, 67, 62, 12,121,120, 23,134,135,184,219, 78,195,155,236,222,167,195,
- 46,231, 93, 69, 18, 16,242,212, 87,206,129, 50,242,112,151,243, 0, 30, 21, 55,153,130, 72, 57,115,129,237,144,110, 46,245,203,
-111, 87,234, 41,106, 47,131, 23,162,107,170, 80,199, 58,209,174, 72,242, 89, 26,191,150, 3,190, 61,252, 59,105, 2, 49,118,156,
-221,215, 30, 37, 60,225,208, 10, 94,244,134,202, 60,195,167,169, 42,143,211,145, 98,176, 80,176,135, 28,199, 93,181,174,168, 62,
- 88, 40, 80, 65,177, 26,151,119,151,237,231, 95,252,246,176, 21,248,230, 66,232, 11, 93, 18,206, 11, 83,124,160,247, 34,179, 16,
- 4,253,244,176,116,147,156, 28, 57, 79, 25, 10,168, 38, 48,228,195, 94,189,248,116,113,103, 79,199,248,152,104, 77, 13,150,203,
-100,213,180,226, 66,115,116, 10,120, 34, 36,209, 73, 32, 9,166,249, 37,146, 21,176, 10,236, 47,176,206,211,249,248, 65, 83,125,
-253,227,243,183,219,171, 87,127,188,139,205,164, 90, 53, 77,188,233, 25, 29,243,109,241,201,100, 77,180, 20,212,207,198, 96,128,
- 44,197, 90,244,144,188,178,156,188, 71,145,100, 98,251, 10,223,211,162,161, 1,211,130, 41,185,153, 49,116,157,174, 53, 13, 87,
-169,255,150, 73, 75, 62,158, 81,127, 3, 76, 22, 74,100,212, 3, 80, 89, 74,182,169,142, 33,156,250,192, 6, 96, 14,104,211,193,
-159,208, 44,131,255, 27,160, 66, 47, 62,172,155,182,239,169, 79,225,131,107, 93, 93,233, 88,235,204,120, 18,128,185, 60,129, 23,
- 21, 54,195,217,207,221, 56,149,231,123, 52,234,146,139, 53,115,122,112, 67, 11, 42,236,120,186,254,170,226,218,174, 54, 39,172,
- 10,136,122,182, 35,119, 69,109, 61, 47,163, 18,227, 67, 26, 42,189,105,157, 33,203, 25,199, 12, 61, 68, 27, 58, 78,197,156, 27,
- 26,193, 14, 96,193,130, 73,174, 65, 48,201, 73,196,126,164, 6, 27,172,105, 80, 57, 2,228,185,106,161,153, 28, 54,143,174,103,
-213,152,216, 49,159,171, 54, 12,216, 54, 38, 47, 86,211,122,181,190,254,230,251,211,237,117,120,127,126,210,222,125,249,114,243,
-209,179,127,205,244,243,240,231, 47,251,215,175,251,163,243,227,236,112, 8,178,224, 69, 60,103,119,246,251,237, 63,233,244, 86,
-250,251,219, 39,175, 94, 92, 52,162, 60, 63,250,149,136,174,229,196, 87,160,101, 85,165,172,200, 62,209, 53,161, 56,252, 77, 35,
-186,160, 13, 10,231, 12,120,209, 16,119,104,244,216, 36,168, 0,211, 99, 39,140,125,156,134,131,138,227, 82,246,185,218,165,252,
- 24,183, 81,156,242, 73,119,189, 51,124, 19,167,228,164,230, 20,142, 7, 17,168, 83,196,134, 67,167, 98, 37, 78,128,102, 49,142,
-212,142, 70,234, 45, 3, 3,210,121,227,133, 51, 30,204, 5,200, 41,211, 88, 3, 64,219, 17, 75, 14,124,134,158, 98, 66, 19, 86,
-168,252,214,129, 71,215,217, 36, 84,203, 56, 36, 54, 98,169, 82, 77, 28, 12,196, 82, 11, 27, 44,237, 90,179,163,244,253,124,210,
-245,158,190,177,242, 76, 85,195,208, 93,106,222, 52,114, 13,100,245,191, 0, 36, 93,203,142,220, 68, 20, 45, 87,149,203,101,187,
- 95,243,232,204, 48, 36, 48,201,228,193,104, 80,132, 0,161,108,144,144,216,176, 97,207,119,178,103,195, 14,177, 68, 89,128, 34,
- 5, 80, 2,173, 73,102,166, 31,110,191,170,202,197, 57,102,215, 26,245, 72,110,251,214, 61,231,248,222,123,174, 58, 61, 63,230,
-166, 83, 14,229,135, 12, 23,101, 27,168,138, 72,225,155, 70,203,169,117, 8,123, 46, 41, 12,121,153,133, 34, 3,169, 10, 45, 16,
- 4,231, 88,165,129,139,250, 36, 40,109,167,100, 86,232, 34,119,137, 46,129,137,198,100,117,219,221, 65,178,212,239,121,119,229,
-201,233,217,225,108,122, 86,116,174,107, 45,117,233, 70,226,147,104, 11, 83,122,221,106,107,139, 98,150, 67,170,245,101,171, 51,
- 39,202,177,194, 0,185, 57,207, 14,134, 2, 68, 16,231, 2, 12,184, 51,185,155,114,164, 62,149,222, 2,204, 18, 95,208, 89,149,
-211,111, 32, 95,171,235,254, 54, 44,206,150, 71,199,118, 37,182, 29,242,112,115,196, 87, 30,192, 62, 57,167,149,113,146,176, 57,
- 69,112,199, 84,159,114, 56,133, 47,222,217,221,165,161, 44,144,156, 60, 89,122,154,106, 96, 66,218,177, 93, 36,142,134, 97,100,
-249,130,150,156,116,235,166,126, 17,238,127, 95, 39,217,211,131,159, 22, 85,252, 70,239, 17,106, 98,207,240, 9,251, 16,119, 81,
-180, 28, 18, 64, 72, 65, 55,248, 13,212,215,240,241,249,135,127,175,229, 79,191, 54, 22,120, 67, 43,247,216,211, 94,137,198, 15,
- 17,119, 25,162, 8,170, 42,165, 77, 24, 55, 16,105, 74,108,174, 70,158, 73,142,130, 66,174, 23,172,138,218, 18, 15, 1, 0,137,
- 75,207,157,231, 12,250,139, 7,246,135,239,253,147, 79, 94,245,213,239,213,190,163,187,175,107, 25,165,109, 39,183,163,145, 27,
-180,222,166, 65,166, 11,183,190,190,238,183,107, 87,247,161,222,245,208, 66,219, 85,183, 89, 57,189, 7, 3, 24, 10, 32,147,103,
-207,164,239, 8,229, 78,137,188, 29,205, 42, 53, 11,131,100,228,124,103, 37,118, 85,200,151,226,203, 47,202,242, 35, 67,183, 62,
-203, 38,103, 93, 22,195, 68,166, 19,142,214, 69,150,137, 45, 4, 17, 87,227,176,103, 25,161, 27,194, 14, 1, 46, 58, 15,233, 62,
- 12, 85,226, 32,231,247, 49,237,113,128,112,119,232, 99,131, 39, 96,118, 45,215, 69,117,236, 85,159,120,242, 36,246,165,210, 27,
-211, 45,159, 94,188,150,203, 63,223,190,209,227,104, 12,141,252, 56,225,111, 84,237, 2,206, 39,103, 95,117, 93, 13,129, 6, 23,
-206,226,156,128, 33, 88,192, 3, 45,161,111,110,122,177, 40,191, 58,205,135,127,170, 48, 17, 36,152,172,120,114,233, 39, 43,134,
- 53,237,152, 34,205,131,164, 48, 46,221,104,246,119,155,152,101, 8,116,101, 12,224,199,111,174, 55,203,199, 7,159,125,253,232,
-213, 47,226,221,230, 95, 16,227, 18,164,211, 10, 46,182,193,179, 50, 81,245,222,121,178, 96,154,189,166,177, 0,158,245,209, 73,
-174, 22,176, 9,155,174,249,226, 89, 24, 81, 34,201,245,251,169,200,198,255, 2, 18,166,205, 64, 79,217, 72,244, 6, 34,212, 44,
-245,138,190,193,181, 32,227,171,180,170,131,107, 6,173,107, 71, 87, 54,159, 41,232,193,174,170,251, 53, 97,209,143,171,210,170,
- 91,255,242,175,106,103,167, 23, 79, 63, 56,218,175,215,198,179, 19,137, 91, 53,104,113,233, 92, 90,114,124, 85, 50,243,114,104,
- 82, 65,109,176, 51,209, 64,254,112,218,136,125,210,195,144,227,111,116, 90, 77,172, 21,154,156, 90,149,160,127,165,225,233,230,
- 0, 66, 96,230,151, 78,141, 59,104,108, 99, 67,146,212,236, 1,229, 50, 80,221, 5,207,122,148,162,153,253,142,181, 26,252,154,
-208,141,182,115,158,104, 88, 34, 62, 58,128,136, 31,103, 5, 21,173,222, 99,172, 10,154,117,171,113,153,168, 41,227, 2,172,202,
-208,137,220, 72,121,176, 72,204,129,186,127,249,194, 93, 93,220,185,187, 67,245,240,249,165, 42,213,143,219, 63,126,222,174, 94,
-187,174,140, 56,214, 68,161,200,250, 25,178,188, 6, 14,114,133,202, 16,114, 92,117,179,211,110, 91,169,228,183,251,247,252,209,
-244,164, 90,159,212, 56, 53,172, 63, 89,205,141,170,142,133,182,136, 95, 93,246,220, 73, 48, 65, 46, 0,254, 34, 92,161, 93,102,
-118, 1,241,213,200,116,179,222,206,228,229,243,233,179,171,243,217, 55,159,222,251,238, 34,255,246,217,227,207,159, 28, 62, 92,
- 28, 63,152, 92,205,119,197,155,119, 73, 31,111,222,179,138,140, 52, 44,115,160, 4, 40, 60,104, 14,158, 38, 23, 27, 71,157, 65,
-235,118,194, 53,129,195,255,166,213,190,177,251, 14,113, 30,112,242,145,111,172, 85,177, 66, 62, 23,217, 14,231,192, 78,141,114,
-185,158, 82, 52,123,114,201,249,144, 53,137,209,156,173, 80, 20, 98, 28, 32,224,244,119,110,216,240, 53, 99,177, 38,177,180,152,
- 45,134, 44,207,193,191, 60, 24,212, 0, 49,161,216,228, 83,139, 66,228, 94, 77,231,211,255, 4, 32,233, 90,118,228,168,161,168,
-171, 92,101,215,171, 31,211, 25,134, 76, 52, 48, 18, 19, 65,130,120, 9,132, 4, 18,240, 7, 89,176, 65, 66, 72,136,111, 96,195,
-111,241, 3, 40, 11,196, 34, 27, 54, 36, 67,194, 40,202, 0, 73, 24,230,221, 93,143,238,178,203, 54,231, 20,155,222,149, 84,237,
-242,189,247, 28,251,222,115, 18,142,105,210, 74,154,144,186,183,113, 47, 81,235,170, 88,183,138,194,179,156,149,231, 62, 27,216,
-131,156,198,161,225,184, 89,153, 75,173,166, 62,239, 29,128,175,226,149,212, 44,247,109,133,141,229, 75,236,232, 33,227, 5, 71,
-210,109,125,114,251,189, 79,223,152,190,246,161,122,125, 81,238, 76,145, 42,231,200, 59,189, 21,215,114,243,236, 80, 61,124,124,
-252,232,164,190, 54, 47, 64, 87, 1, 18, 40,163,146,150, 81, 87,150, 85,195,166,212, 9,175,150,121,223, 95,128, 91, 53, 20, 92,
-235,128, 63, 65, 25, 53,234,157, 72,138,222,164,194,157,249,114,205, 9, 36,171, 64, 72,132,236,159,188, 60,239,211,189,123, 7,
-119,111,234,195,147, 43, 35, 95, 65, 78,214,161,224,202,240, 34, 19,223,222,209,244, 68,209, 6, 41,248, 41, 17,152,232, 0, 57,
-233,153,105, 17,226,128,248,142,217, 9,152,138,238,147, 60,217,192,210,196, 9, 74,167,113, 99,158, 15, 94,211,199,218, 5,148,
- 79, 67,241,150,154, 18,227,116, 38,197,238,237,132,165, 44,247,168,159, 71,174,230,193, 57, 91,177, 9,215, 32,181,169,209,177,
-155, 83,152, 8, 79,150, 46,216, 44,244, 81, 70,125,246,255,165,199,217,250,129,162,139,176,163, 36, 33,107, 8,130,135,130, 77,
- 32, 98,113,208, 42, 2, 67, 76,146,197, 28, 44, 56,163,133,231, 76,219, 97, 2,244,243,197,187, 91,223,221,115,197,141,167,155,
-139,191,128, 64, 56,201,144,142, 55, 4, 45, 42, 27, 71,240,221, 26,240,198,152, 54, 30,120,159, 57, 0,108,181,245,186,107,237,
-213,243,104,221,154,245,185,104,234,136, 71,162,198, 93, 33,103,244, 66,245,168,232,226,106,156,232, 69,146, 93, 83,175, 5,212,
- 43,218,108,128,134, 73,216,187, 88,124,254,118, 57, 63, 80,171, 28,192, 61, 74, 42, 90,216, 35, 60,134, 4, 72, 49,161,154, 74,
- 25, 25,246,191,136,144,103,225, 50, 66,173,165,205, 24,135,170,232,204, 70, 87,192, 66, 82,112,186, 29,197, 39, 64,203, 27,188,
-151, 0,233, 34,243,227,100, 33,143,134,236,104,101,168,167, 58,104, 43,231, 66, 47, 14,142, 86, 64, 81,106,138,154,102, 68,106,
-136, 11, 65, 23,128,148,122, 63,168,141, 29, 89,151,203, 37, 5,186, 86,241, 56,255,135,186,219, 1,164, 68, 85,212, 61, 58,188,
-252,253,173,221,119,182, 38, 23,161,217, 8, 53, 72, 10,164, 36, 32,209, 28, 41, 99, 23, 61,144,105,140,178,189,144,238,192, 73,
-154, 73, 69,116,217, 2,184, 65,232,172,147,250,202, 62,254,241,225,157,111,221,215,223,223, 60,254,225,246,233,217,145, 47,155,
-212,103,248, 95, 32,219,114, 26,219,152,189,229,202,130,142, 6, 19, 98,128,159, 66,186,202,197,161,239,145, 88,145, 70,145, 65,
-163,229,198,105, 69,227, 39,225,203, 12,140, 46, 43,102,224, 50,190,213,249,220,137, 62,205, 5,232,203, 90,178, 2,225,195,201,
-124,101,125, 1,160, 47, 43,175, 55,110,104,115, 19,129, 28,118,180,168,193, 58,132, 13,150,167, 72,211,165,108,138, 40, 51,245,
- 79, 79,204,203,116,239,171,253, 91,219,254,114,245,212,133, 34, 23, 83,141, 64,236,216,245,171,141,231,244, 92, 86,120,218,156,
- 17, 84, 0,197,199, 69, 66,233, 51, 74,162, 53, 61,118,140, 74, 98, 5,152,102, 82, 3,226, 16,154, 75,157,129,154,177, 5,198,
- 24, 80,244,204,135, 6,149, 34, 80,244,144,221,151, 83,145,182, 67, 37,134,101,224,213, 96, 54,227,249, 97,109,250,124,108,191,
-105,149, 71,221, 69,178, 83, 54,244,169,191,182, 1, 43, 14,196,219,230,162,164, 47,164,141, 82,188, 51,163, 41, 30, 69,195,145,
- 65,120,230,225,121,158, 31,235, 65, 42, 89,220,216, 13, 31,188,127, 17, 87,147,176,247,230,157, 58, 29,126,185,252,227, 55,219,
-166, 82,168, 72, 35,208,176,170,126, 28,156, 85,252,197,195,174, 13, 73,171,227,209,151,150,242,183,147,186,195, 27,254,124,235,
-213, 99,185,248,230,193, 50, 23,242, 20,149, 40,179, 62, 87, 52,176,110, 73, 45,235, 45, 98,131,158,238,203, 86,116, 94,207, 56,
-191,183, 60,127, 49,148,147,157,143,247,182, 63,187, 91,164,219,127,138,254,153, 48, 39, 98,248, 87,240,116,126,216,169,118, 69,
-245,145, 16,245,151,103,251,191, 30,237,223,127,112,250,124,246,119, 19,173, 82,155, 72,144,195, 89,100,144,185,131,110,150,173,
-247, 27,157, 76, 45, 10, 37, 61, 96, 10, 9,136, 29,148,109, 19, 81, 34, 61,180, 0,151,218, 57, 51, 25, 0,254,229,208, 73, 49,
-103,183, 93,210, 42,101,106, 35,114, 81,101, 64, 12,137,141,199,134, 51,206, 92, 70,201,154, 38, 53,116,159,170,192,203,235,224,
- 39,102, 89,216,120,253,207,174,159,164, 57,181,235,226,100, 70,250, 51,169,251, 78, 87, 67,176,174,235, 18,241,159, 0, 28, 93,
-203,110, 28, 69, 20,173,238,234,174,234,199, 60, 60,100, 72, 0, 7, 35, 35,107,192,176, 32, 1, 41,155,176,130, 5, 32,182, 8,
- 22,240, 29,252, 22, 75,150, 89, 32, 33, 33, 22,128, 37, 99, 33, 1, 2, 18, 20, 27,107,198, 51,238,233, 71,117, 85,117,113, 78,
- 47,189,177,166,235,113,239, 57,117,239, 61, 71,190,122,116, 71, 14,248, 13,214,204,226, 34,140, 51, 54,160,104, 10,225, 60,178,
-145, 66, 40, 47, 39, 44,155, 43, 29, 82,165, 71, 77,228,146,189,131, 73,148,165, 28,101,155, 74,145, 45,233, 46,144,150,101, 73,
-112,155,239,250,232,228,238,195,175, 63, 93,125,249,137, 61, 61, 58, 91, 76,158, 37,230,124,111,206,155,238,220,216, 95,189,187,
- 56,208,235,251,175,185,247, 30,138, 15, 31,189,252,214,225,155, 51,125,239,233, 77, 90,245,142, 66,114,113, 60, 41,102,156,194,
-205,216,193, 35, 23, 72,117,166,116,154,162, 91,110, 42, 85, 31,117,141, 76,183, 32,131, 3, 82,183,108, 20, 13, 35,100, 31,243,
-209, 32,147, 6,233,174,106,186,235, 97,113, 58,147, 50,189,238,124,142, 3,196,254,117,205,233, 20,234,210, 1, 49,112,156, 18,
-248, 79,199, 72, 53, 45, 9,231, 96, 85, 60,118,183,178,190,236,136, 59,216, 63,131, 64, 77, 75, 38,199, 25, 79,132,250, 52,234,
-233,184, 64,127, 17, 14,155, 82,240, 95,140,226,136,248,207, 54,236, 3,104, 43,161,163,115,118,180, 56,164,111,226, 86, 80,232,
-220,197,133,139,216,107, 30,196,226,222,180,202, 15,191,249,246,122, 90,226, 62,151,244,138, 68,208,207, 6,250,115,178,155,134,
-116,147,200,125,220, 71,236, 60,231,250,232,157, 26,187, 2,104, 51, 36,236,116, 64, 26,204,139, 1, 76, 46,207,179,233, 87,159,
- 45,191,248,216,233,217, 15,251,203,127,237, 53, 8,139, 28, 35, 59,191,131,126,176,117,237, 26, 4,116,105,254, 51,109, 39,129,
- 36,154,171,170,185, 25,218,205, 80, 61,119,213,229, 32, 46,135,105,197,232, 33,118,126,111,200,205, 25,104,164,104, 28,123, 19,
-217, 10,153,177,180, 13, 8,143, 8,158, 5, 74,245,182,141, 63, 60, 73, 86, 15, 74,131,208,190, 28,167,213,199,151, 27, 65, 79,
-178, 64,129,215, 36, 21, 76,119, 92, 54,177,211, 33,116, 61, 0,125, 75,167, 69,215, 75,187, 55,206, 37,161, 74,220, 45, 75,249,
-126,199,215,152, 64, 4,206,145,119,144, 8,133,184, 69,229, 39,170,128,134, 2,108, 38,109,202,174,124,165,152, 63,120,231,231,
-171, 77,251, 39,171, 82, 46, 15, 88, 90, 99,196,188,143,111,250, 78,150, 67,133,179, 18, 40,209,168, 53,229, 77, 40,119,199,153,
-206,184,100, 45, 55, 2,108, 88,111,219, 70,191,248,248, 88,215,205, 53, 86, 50, 43,177,179, 38, 81, 56,187, 56,201,200,185, 49,
-251,188, 10,172, 30, 77,212, 84, 63, 22,224, 41,172, 64, 67, 68,124,185,191,141,141,105,226,218,174, 62,154,175, 30,221,253,241,
-123,209,223,174, 39, 73,218, 78, 18,199,140,198, 74, 84, 47,212,164, 19, 45, 21, 84, 28, 69,168, 60, 82, 72,228, 57,131, 24,211,
- 56,217,166, 73, 31,166, 75,250,121,224,111, 55,103,245,204,236,184,178, 47,244, 53, 61,128,211,241, 57,205, 2,143, 41,170,251,
-131,152, 54,157,154,152, 26,188,137, 66,186,209,190, 78, 45,117, 26, 98, 48,116, 80,239, 96, 16,117,187, 77, 55, 52,126,154, 53,
- 82,154,126,251,172,254,171, 82, 89,177,124,123, 97,186, 77,229,168,199,157,244, 8,181, 56, 95, 84,102,164,227,172, 27,116, 54,
- 90,137,122,203,230, 21,156,126,100, 75, 21, 79,100, 68,147, 5,128, 64, 92,126,112,168, 41,104, 35, 55,211, 14, 85, 71,217,175,
- 48,173,123, 6,230, 38,194, 47,240,200, 29, 8, 60,118, 72,165, 25,100,170,217,116,192, 8, 41,216,252,161,135, 30,148,223,248,
-229, 85, 4, 40,185,111,109,170, 53, 32,179, 6,163,146,150, 79,137,130, 23, 1,217,185, 24,135,173, 64,107, 38,216,129,194, 19,
-187,230,170, 84, 97,190,136,102,119, 14, 22,239,190,191,153, 41,215,229,167,247,211,185,127,178,254,237,204,182, 14, 48, 39,208,
-128,153, 42, 54,124, 18,222, 1,112,120, 74,247, 56, 58, 16,203, 62, 5,165,195,126,121,190,175,244, 49,174, 29, 43,218,187,131,
- 98,171,213, 75,235,166,136,253,134,242,191, 90,216,125,230,218, 64, 89,138, 88, 33,138,198, 34,206,129, 46,134, 14,151,215,153,
-236,245,233,209,231,143, 23,171,195, 11,185,255,110,247,207, 89,253,247,239,187,167,117,179,217, 87, 55,174,189,220,246, 55,235,
-118,125, 33,219,159,202,217,243,227, 55,194, 7, 39, 71,121,126,252,203, 31,184,182,183,128,153,133, 72,149,162,237, 64, 66,127,
- 73,172,169, 73, 65,191,134, 26, 36, 17, 55, 48,106,180,231,139,141,194, 23, 15,137,178, 9, 86,148, 46,105,161,139, 82,128, 47,
-164,172,206, 83, 57,136,250,129, 82, 0,136,100,202,211, 21,192,142, 45,236,128,129,186, 16, 17,206, 59, 57,130, 4,211,233, 51,
-222, 26, 62,134,122,171,129,155, 34,239, 77, 54,204,218, 32,210, 68,207,131,243, 69,217,237,254, 23,128,164,107,217,141,163,136,
-162,213,245,234,215, 56,227, 56, 99,199,196, 22, 54,193, 40,200, 96,196,138, 5, 72, 32,146, 15,224, 31, 16,159, 23,137, 29, 27,
- 54,136, 31, 72, 88, 0, 11, 35, 34, 69,177, 29,201,175,153,233,158,126, 84, 87, 85,115, 78,179,179, 37,143,103,166,170,235,222,
-115,110,221,123,142, 58, 56,216,199,254,178,151,192, 42,100, 30, 33,173, 41,172, 13,227, 86, 90, 80,223, 81, 81, 26,138,214,218,
-179,156, 98,227, 41, 22, 25, 17, 38,110,219, 66, 79,131,219, 78, 20,179,220, 26,149, 15,243,121, 47,101,237,103,207, 15, 63,249,
-233,133,126,118,242,242,242,230,183,171,119, 87,245, 80,183,247,155,182, 27,134, 74,186,149,106,218,190,174,235,219,251,139,205,
-250, 58, 81,111, 15,143,223,127,246, 69,254,229,241,113, 94, 60, 94,185, 97, 85, 53,229,246, 44, 47, 41,182, 36,217,169,106,131,
-180, 91,105, 76,172,147,198,184, 82, 80, 95, 46,153,231, 27,250, 18,179,173,139, 18,202,194,109,123,203, 25,122, 35, 50, 32,134,
-230,178,209, 39, 31, 28, 61, 41,222,180, 66, 61, 58,164,241,128,160, 57,107, 72, 16, 76, 29,213,249,233,157,176, 66, 0,239,233,
-140, 53,133,105, 15, 20, 78, 2,192, 50, 87, 84,131, 96, 41,116, 42,204,152,169,250,130,220, 64,245, 16,150,120,120,209, 74, 27,
- 19,150,125,199,158,245, 7, 68, 50,209,131, 34, 32,150, 15, 64, 96,188, 71, 10, 19, 14,189,241, 28,179, 4,146, 95, 70, 63,137,
-247, 47, 62,154,151, 79, 15, 94,254,124, 59,179, 25, 33, 20,208,171, 26,116, 63,227,160,170, 5, 86,167, 3, 93,166, 40, 2, 11,
- 54,139, 79,161,168, 95, 70, 79,213, 82,234,109,228,157, 98,204,165,233,141,211,114,107,177,183,251,227, 15,234,197,247, 87,210,
-253, 89, 95, 92,131,107, 43, 7, 82, 30, 89,133,190,165, 68,163,195,119, 66, 12,237,130, 3, 96,191, 20,109, 31, 58,236,196, 91,
- 81,223, 36,183,151,221,221, 21,123, 10,219, 58,178,174,128, 37, 3,218,238,145, 42,105,231, 8, 28,141,207,207,185,128,145, 25,
-113, 80, 52,194,160,120,169, 36,248,222,223, 19, 95,125, 51,151,143, 73,241,245,124,146,142, 7,218,180, 74,206,153,153,216, 92,
-134, 84,203,142, 23, 29,133,244, 29, 5, 52,134, 64,163,201,190,197,161,195,226,245,205, 36, 11, 46,122, 55, 86, 9,246,142, 6,
-214,236,254,179,162,139,174, 9, 93, 39,202,200,118, 20, 94,141,100,137, 85, 74,239,248,131,195,195,230,195,131, 87,127, 45, 5,
-163, 57,146,192,168, 40, 90, 26,117,153, 84,173, 47,189,108, 7, 16, 2,223, 73,236,178, 73,250,132, 30, 9,120, 83,224,165,146,
-247, 72,158,134,145,224, 69,249,183,167,249, 76, 94, 55,236,186,215, 20,113,144, 89,104, 37,200,139,110,113, 72, 2, 75,176, 66,
-165,149,180,109,104,179,128, 28, 80, 54, 73, 82, 9, 54,255, 35,191,143,114,211,215,105,101,142,191, 59,146,122,239,245,175, 75,
- 19, 87, 10, 15, 40, 50, 96,136, 57,128,167, 1, 80, 7, 12, 86,212,149, 1, 25, 30, 71, 0,224, 12, 97, 13,187,149, 1, 16,224,
- 15,124, 62, 55,107, 42, 25, 14,133, 9, 90,143,233,255, 55,252, 72,224,105,214,245,120,134, 50, 1,166,102,177, 99,192,217,109,
- 93, 59, 78,189, 57,221,225,119,230,233,145,126,132,177,139,203, 62, 49,182, 21, 26,204,172,238,162, 79,189,222, 56,197,250,247,
-112,241,174, 58, 95,202,189,253,244,100,199,129, 22, 55,128, 73,137,238,179, 16, 82, 16, 72,234, 11, 25, 28,218, 66,183,248,247,
-214,176,184,196,188, 40,179,108, 4,119, 73, 12,101,143, 39,121,178, 17,148, 64,249,216, 90,206, 90,132, 34,155, 1, 91,103,188,
-164,229, 5, 1,197, 18,194,184,193,177, 41,120,127,197,177, 71,132,250,104, 91, 99,106,196,116,142, 99,154,212, 13,116,250,137,
-102,233, 16,196,248, 10, 26,220,122,198, 82, 18, 8, 94, 99,243,103, 43, 12,190, 8,232,112,234, 51,149,109,101, 49,217, 25,119,
- 22, 15, 22,159,127, 61,156,157, 94,175,205,211,135, 15,159,236,254,126,127,254,170, 89,213,194, 33,207, 12,192, 82,162,197, 3,
-180, 73,108, 39, 99, 59,117, 17,247, 35,189,141, 0,184, 12, 85, 2,131, 26,221, 52, 84,203,126, 49, 78, 75,199,228,118, 47,211,
- 85,125, 86,177,239, 73,154, 10, 89,161, 47,217,250, 73, 23,236, 84,207, 6,234,158, 83, 28, 68,133,197,217,238,179,231,167,235,
-212,252,114,255,239, 31,213,245, 93,116,124, 87, 37,113,254,132, 81, 15,148,199, 74, 73,223,136,118,109,215, 87,155,100,245,143,
-221,250,251,228,211,241,232,209,199,245,157, 57,127,243, 94,168, 14, 36, 27,216,157,157, 29,126,186,246, 75,100,229, 3,165, 62,
- 65, 27,148, 76,114, 58, 16, 99,205,115, 28,200, 77, 85, 69, 44,104,234,196, 12,105,107, 24,200, 92,194,212,128,149, 52,119,131,
-140,169, 43,244, 18,156, 15, 27,135, 84,141, 44,198, 90, 62,178, 98, 39, 28,155, 77, 61, 56, 7,221,157,102, 96,183,125, 43, 51,
-145,105, 14,204, 46,170,222,107, 26,157,231, 73, 40,130,250, 79, 0,146,174,101, 53,142, 35,138,118,117,117, 85,117,183,102, 70,
- 47, 39, 82,140, 44, 35,108, 99, 28, 98,208,194,132,132,224, 93,246,249,134, 64, 22,249, 68,147,117, 32,155,124, 64, 32, 49,177,
-193,182,228, 40, 99,105,102,250, 85,239,156,211, 89, 9, 33,132, 24,213,173,115,207,173,123,239, 57,242,236,252,212,208, 16,166,
- 86,236, 99,179,193, 68,233,105, 16,154,182, 13, 77, 80,168, 1,151,203, 4, 38,229,219,250, 48,205, 11,149,203,118,105, 24,207,
-213,106,137, 47, 56,164,182,174,193,135, 76,239,251,229,203,199,143,126,250,254,205,114,245,234,227,213,251,105, 92,152,220,240,
- 1, 88,206, 93, 50, 62,119,239,218, 85, 93, 82, 87,111, 80,229,216, 15,105,125, 55,136,126,125,188,127,247,236, 97,245,205,147,
-139, 85,243,224,198,233, 13, 48, 65,155,166,170,246,144, 23, 12, 19,207, 28, 31, 96,212, 40, 33, 73, 57,172,166,146, 67, 37,133,
- 71,197,105, 92, 31, 28,136, 99,170,105, 87, 79, 81,196,193, 87,247, 62,187, 60,185,234, 73,238,169,203,158, 17, 68,134,111,178,
-161,195,239,162, 38,224, 88,124, 99, 80,220, 43,150, 28, 96, 78,192,253,166, 20,156, 93, 33, 52, 87, 36, 89, 92,226,227, 91, 63,
-208,141,203,127, 56, 34, 48,133,114,182,186, 78, 8,222,162, 47, 69,225, 1, 11,114,202,217,219, 72, 21,176,108,123,199,119,130,
- 45,160, 63,210, 49, 17, 71, 25,245, 45,187,173,244,143,210, 7,199,251, 15, 62,127,245, 91,110,114,106,246,145,125, 90, 93, 22,
- 9,236, 81, 39, 74,206, 87, 26,229, 8,203,166, 44, 86, 89,212, 85,101,151, 13, 51,124, 9,164,208,166, 50,236,217, 33,237,121,
-241,229,163,251, 63,255,104, 94,188,184,242,255,254,221, 95,117,249,182,165,241,138, 45, 0,232,161, 79,113, 76,160, 39,118,244,
-182, 87,225, 46, 79,219, 56,140,169, 27,211,240, 46,130, 47,239, 62,229,113, 19, 70,132,216, 93,214, 92, 0,230, 16,111, 23, 57,
- 36, 71,213, 37, 75,201, 86,205,207, 63, 43,174, 85, 92,150,149,179, 63,122,223,133,186, 45, 46,191,221,107,206,155,140,128, 55,
- 21, 97, 76,205,130, 39,146,182, 12,130,106, 24,153, 10,104, 28,211,162,235, 5,133,213, 61,155,161, 40, 35,124, 4,155, 73, 28,
-210,218,130, 98,197,210, 33,223, 20, 84, 21, 24, 98, 28,217,210,137,248,153,155, 91, 29,255,107,190,167,194, 28,235, 18,248,180,
- 8,167, 79,158,190, 46, 79,255,122,123, 13,184,146, 92, 60,182, 52,131, 7,143,235, 19, 85,228,113, 39, 34, 91, 72,243,220,149,
-143, 84,175, 79,226,142,201,134,235, 39, 96,144,202,105,111,214, 69, 58, 61, 95, 61, 11,113,232,250, 76, 47, 78,176,124,160, 94,
- 54,160,237, 61,137,164,216,229, 12,102,138,132,211, 74, 46, 62, 68,225, 41,125,140,172, 89,164, 19,126, 82,181, 75,155,245,230,
- 40,185,231, 63, 28, 57,119,248, 59,242,141,223, 25, 42,230,131,241, 42, 80,139,145,111,222,168, 67,128,182, 92, 54,158, 5,163,
-185, 0,177, 64,109, 65,211,188,138, 27, 11, 90, 31,224,238, 89,110,152,245, 53,187, 45,166,172,188,151, 94, 80, 52, 24,117, 97,
-226, 56, 10, 5,149,170, 98, 81,168, 41,241,129,212,177, 89,131,243,217,210, 57, 42,103, 7,216,193, 17,115,242, 56,202,137,148,
- 5, 25, 74,116,123,217, 68,101,251,241,207,181, 10, 71, 39,207,169,207, 50,148,131,247,149,104, 38,214,127,224,228,118,154, 29,
- 43, 60, 72, 90, 50, 58, 91, 43, 41,163, 41, 81,157, 20, 77, 81, 91, 69, 23,229, 68,207, 58,118, 18, 84, 80,121,138,196,126,220,
- 53,250,120, 84,117,160, 47,103,104,170, 5,138, 30,252,219, 3,187,224,198,233,176, 87,148,220,254,181,227, 48,201,201,176,171,
- 33, 51,202,239, 32, 82,180,160,233, 73,140,201,230,196,241,118, 62, 58, 20, 38,210,100, 46,206,214,100,249, 48, 53, 74,155,165,
- 22,203,226, 64, 55, 39, 23, 95,217,199, 47,251,250,122,229,238, 93,156,191, 15, 87,191,118, 31, 1,201,109, 24,157,178, 93,246,
-244,228, 64,149,196, 63,192, 9, 89,201,231, 47,201,183,154,216, 36,201,174, 76,195, 81, 89,220, 93,126,123, 92,182,108,102, 42,
-115, 45,196,201, 7, 10,167,221,106,193, 97,113, 64,135,116, 54, 59,132, 13,133,252, 41, 74,231, 23, 15,143,239,127,119,249,166,
-140,191,108,222,254,225,119,115,136,204, 66,104, 57,236,138,188,205, 67,231,211,109, 14,182, 2, 61, 65, 96, 59,240, 18, 51,172,
-173,238,110,206,206, 55, 95,127,113,118,243,207,211, 55, 31, 94,199, 21,224, 37,208,134,171, 20, 56, 34,247,201,171, 76,209,212,
-176,135, 26,167, 44, 7,196,183,165,206,185, 67,225,170,138,212, 53,117,158,104, 50, 0, 54,133,171,203,134, 54,194,105,107,180,
- 48, 93,224,218,184, 41,106, 95,164,106,146, 91,167,167, 52,235,153, 56,175, 36, 64,141,204, 98,209,150,166,117,110, 26, 85,173,
-128, 66, 32, 60, 25, 0, 82, 26, 43,233, 4,169, 1,111,255, 9, 64,210,181,244,200, 77,132, 65,183,251,101,183, 61,143,132, 93,
- 86,104,217, 69, 27, 30, 17, 8, 34, 20, 36, 2, 7,174, 8,126, 1, 71,126, 1,255, 14,113,228,192, 33, 71, 36,110, 32,130, 18,
- 2, 81, 96, 51,217,204,174,103,236,182,187,219, 77,213,112, 29,205, 88, 51,110,119,125, 85, 61,223, 87, 37,207, 46, 78, 24,159,
- 81,151,206, 5,163,156,104,170,106, 89,105,233,116,169,143,108,173,179,171,100, 66,213,175,151,216,245, 66, 92, 47, 86,235,166,
-110, 18,170, 11,232, 71,123, 91,220, 94,149,186,208, 85,109,192,148, 62,190,115,239,155,207, 94,172,250,239,159,255,190,161, 55,
- 56, 59, 57, 43,166,179,228,130, 54, 26,210, 23, 99,224, 0,177,232,176,247, 8,186, 32,252,168,200, 97,156,128, 70,226,198,216,
-167,111,159,212,239,189,241,122, 46,150,143,182, 75,157,167,163,149, 1,124, 48,130, 81,170,165,180, 70, 85,218, 38,231,186,200,
-254,245, 98,178,123,144, 63, 80, 14,212, 85, 75, 49, 73, 51,160,130,110,208,224,221,246,163,139, 41, 47,119,204,119, 12, 33,241,
-200, 79,133, 29,219,241, 65, 44, 64,117,123,212, 88,195, 51, 69, 38, 32,178, 3, 84,243,223,161,196, 3, 60,192,150,106,212,140,
-149, 8,244, 91,211, 4,250, 67,186, 55, 49,159,227,206,130,211, 55, 6,101, 64, 27,208, 6, 19,201,124,193,208, 81, 53,198, 48,
-100,134, 23, 14,201,139, 48, 13,120,144,115,128,172, 27,227,193,157, 99,110, 42,125,113,255,244,167,223,194,230, 89,183, 88,180,
- 32,157,190, 28, 33, 58,155, 66, 51,112, 13, 43,107,240, 77, 56, 25,156, 76,194,143, 81,181,109, 3, 0, 65,218,182, 28,200,165,
-141, 55,213, 87, 95,190,249,221,183,226,236,236, 73,122,252,231,240,143, 7, 5,246,168, 46, 62,236,251, 60,132, 50, 79,161,239,
- 65, 59,230,233, 10,224, 19,139, 46,128,174,238, 46,203,112,153,175,247,161,187,138,175, 46, 3, 30,166, 98,152,204,150, 21,232,
- 70,138, 97, 96, 46, 12,187,156,137,150,236, 6,161,111,130,164,247, 75,168, 14, 3, 55, 57,249, 72,139,154,123, 15,204,249,221,
-102,191,158,153,249,234,176, 50, 80,182,108, 54,131,104, 47,220, 1, 34, 5,251, 58, 89, 47, 81,126,167, 6, 72,151,233, 92,131,
- 21,137,121, 63,251, 41,229, 29, 48,165,162,225, 20,143,209,105, 19, 8, 46,189, 31, 56, 85, 84, 65, 30, 67, 55,208, 85, 23,180,
-174,140, 54, 79, 90, 77,101,110, 79, 76,123,247,243,135, 93,223,245, 59, 23,105,233,212, 75,144, 40, 25,160, 81,220, 52,212, 12,
- 85, 30,103,176,231, 48, 1,162,233,145, 95, 50, 22, 76,206,149,101,116,148, 40,193,127, 5, 64,101, 24,247, 47,203,197,167,119,
- 92, 53,238, 19,123, 28, 36,118,195,193,117, 15,202, 94, 50, 61, 22,203, 92,207,108, 98,135,252,248,127,186, 10, 79, 60, 11,115,
-137,125, 5, 66,192, 46,177,121,222,108,182, 71,171,124,255,235,243,231, 94,255,250,240, 90,185,125,147, 93,162, 67, 15,143,252,
- 11,207,105, 62,208, 67, 78, 64,131,154,224,179,194,182,199,180,181, 41, 83,102, 4, 72, 22, 43,233, 0,247,194,229,166,169,214,
- 9, 5, 14,181, 81,172,177,244,235,164, 90,154,163,104,118, 87,210, 19,146,238, 4,224,234, 30,124, 68, 41,109,231,126, 14,209,
-210, 95, 23,240, 82,206,144, 22, 6,104, 51, 66,180,216, 56,168, 91,219, 97,217,150, 16, 66,219,107,255,203,223, 29, 94, 60, 61,
-113,175,133,112,195,148, 96, 77,107,227,152,233,230, 44, 50, 67,225, 80,127,113, 47,231, 81, 45,178,153,212,216, 13, 14, 52,216,
- 30,236,208,163, 2,121,143,213,193,136,173,156,213, 14,194,166,193,109, 13,181, 13,218, 99, 3,138,131,159,134, 9, 16,150, 52,
- 44, 41, 6, 25,177, 80, 12,238, 16,140,226, 6,245, 79,227, 14, 69, 99, 0, 71,158,202, 30,218, 55, 67, 66,143,158,187,137,182,
-103,197,108, 41, 89, 68,176,114,229,102,144, 99, 84,115,166,192, 91,121,124,242, 65,253,197,251,253,173, 20,187,242,124,113,180,
-146, 63,110,255,122, 50,114,210,112, 84,172, 68,236,106,224,153,253, 24,194,138,243,225,184,141,236, 35,160, 49, 16, 83,177, 52,
-219,122,106,182, 68,204,137,154, 58,231,185,226, 32, 75, 25,111,150,242,116,115,245,161, 24, 95,153, 50, 40,223,243, 92,214,219,
-184,112, 37,170, 68, 10, 41,232, 99,245,214, 39,239,252,235,198, 31, 54,127,108, 10,185, 4,115, 68,201, 74,224,131, 96, 31, 57,
-224, 74, 28,130,204,220, 38, 80, 7,204, 9,136, 65,183,153,227,254, 47,163,152, 94, 84, 71,143, 30,188,123,254,236,241,250,231,
-167,253,218, 68,236,246, 33, 23, 38,122, 8, 85,239,156,241, 85, 54, 35,112, 64, 39, 80,250, 14, 23,217, 41,201, 91,136,117, 17,
- 12, 75, 10, 13, 24,234, 65,130, 3,124,216,141,236,150,137,241,130,128,171, 24, 61,147,196, 65,255, 61, 16,203,226,125,114,166,
-229,164,154, 39,206,189,129, 72,248,105,167,132, 92, 88,217,133,229,208,143, 85, 43, 10, 79,103,116,250,182,237,255, 19,128,164,
- 43,217,141,219,136,130,205,222,184,136, 28, 45,177, 44,196, 75, 4, 33, 64, 12,219,176, 29, 31,114,243, 55, 36,167, 92,114,202,
- 49, 95,149,143,201, 33,200, 7, 36, 72,114,176, 5,200, 30,217,128, 34,141, 70, 51,211,100,147,189,164,138,214, 15, 72, 34,155,
-245,170, 94,191, 87,165,206,158, 60, 28, 57,231, 87, 90,222, 94,128, 32, 26,222, 32,182, 86,216,100,235,232,100,125, 84,215,210,
-236,201,178,237, 82, 87,236, 91,221, 17,251,155, 3,165, 27, 27,199, 5, 42, 70, 89,229,152, 43,215, 60,255,241,233,205,105,255,
-235,229,114, 25,213, 94,106, 45,253,217, 6, 39,164,159, 15, 10, 59, 27,160,201, 66, 77,186,103, 46,165,165,223,254, 62,104,167,
- 2,249,116,219,100, 76, 24, 69, 31, 62,117,245,245,179, 47,245, 81,253,213,114,155,122,209,211, 45, 87,107,188, 3, 6, 98,130,
-141, 92, 51, 84,109, 13,146,212, 67, 58,150, 94, 84,227, 78,241,122,190,128,178,102,128,223,199,164,162,207,167,199,139,215, 79,
- 54, 18,152, 39,115, 13,193,104,202,158,129,227,224, 50, 33,115, 25,125, 98,196,116, 50, 12, 60,111,102, 23, 77, 80, 64, 59,129,
- 69, 23,146, 83, 79,102,151, 81, 5,138,118, 94, 0,129,112,152,173,127, 37,127, 12, 56, 62, 48, 79, 49, 19, 94, 40,111,178,155,
-100,220,197,209, 76,192,214, 45,227,194, 61,200,125, 31,193,244,131,211,128,255, 48,140,155, 36, 24,126,125,155, 69,155, 30,189,
-122,252,238,178,249,235,223,208,116,168,184,248, 84, 90,112, 60,188,220, 57, 88, 74,181, 13,239,187, 44,199,223,181,172,232,112,
- 70,239, 40, 3, 76,212, 64,224,227,170,251,229,135,131,159,127,242, 85,241,110,124,251,190,255, 4, 2,171,211, 46, 79,119,211,
-112,131, 7,194, 1, 25,252, 31,110, 27, 65,219,253, 77,244, 65,172,239,196,234,163,236,167,157,191, 5, 95,246,241, 38, 71, 28,
-109,144,132,149, 96, 55,195,207, 55,171,115,104, 8,247, 45,195,188, 72,102, 65, 36, 64, 45,216,150, 24,172, 92,128, 83, 42,177,
-137,233,213, 55,250,233,183, 16, 29,133,228,226, 18,123,166,243,202, 35,115, 51,213,130, 13,104,249, 57, 80, 62,243, 97,129, 94,
- 21, 99, 17,166,209,175, 39,191, 77,137, 49, 73,130,127,220,173, 70,213, 41,220,124, 99, 1,130,204, 17, 60,154, 49,100, 23, 86,
-248,208,130, 0,177,117,179,181, 37,120, 88, 9,197,109,166,163,151, 85, 58,123,243,207,249, 5, 16, 22,180,107,203, 22,208,188,
-104, 7,210,251,159,229, 4,193, 54,113, 79, 6,159,134, 15,220,199,208,140, 31, 17,243,132, 19,119,197,240, 88, 21,251, 14,168,
-206,235,149,239, 78,187,151, 93,190,243,183,211,192, 21, 64, 77,182,148,137,190,153, 67, 13, 64,182, 28, 0, 28,153, 62, 68,106,
- 14,225,169,152, 5,202, 81, 88, 96,251, 30, 78, 96, 9,190,178,250,224,238,221, 87,111,190, 63,185,184, 56,249,251,252, 74,107,
-103,217,109, 17, 28,109,128,178, 69, 65,142, 9,228, 9,191,147,179,143,220,243, 8,220, 81,248, 34,214,100, 14, 49, 54,248, 85,
- 80, 55, 45,183, 91,237, 88,214,192,222, 49,151,109,114, 67, 79, 87,101,134,121,131, 35, 70, 26, 1, 78,138,193,129,197, 40, 45,
- 68,206, 38,134, 80, 82, 8,150, 12, 53,212, 64,176,145,175, 79, 3, 66,131, 4, 85, 80,155, 69,147, 89, 63,106, 57,228,139,109,
-232,219,195,199, 15, 15,143,107,240, 39, 71,219, 18, 80,234,154, 54,130,138,193, 21, 10,156,208,130, 39, 50, 52, 38, 85, 21, 71,
-164,184,193, 38,185,253,162,231, 8, 67,192,208, 4,225, 81,209, 58, 63,211,239, 87,179,206, 73, 77, 3,237, 42,249,212,143,144,
- 40,144,139,168,129,244,135, 45,196, 70,163,142, 75,208,146,141, 55,168,229, 14,106, 4, 56,138,239,118,206, 53, 24,198, 78,201,
-157,206, 85, 79,199, 6,128,179, 6,215, 43,101, 81, 87, 77, 45,187, 35,115,244,224,164,126,253,194,223,191,215,111,174,202,226,
-236,209,131,247,187,213,239,126, 69, 99,116,102, 87,140,204,114, 24, 81,191,107, 35,118, 28,226,135,122,161,241,154,101,124, 2,
- 45,143, 2, 61,239, 12,175,168,104,250, 38,197,103,208, 41,101,133, 42, 29,240, 88, 47,253,179,169, 92,130,213, 2,121, 43,212,
- 24,118,237, 7,246,168,118,189,137,199,223,125,221, 29,183,191,173, 46,207,253, 16,180,108,178,219, 8,131, 15, 9, 5,222,132,
-222,226,181,207,215,113,154, 54, 85,100,134,140, 71,165,135,249,148,184,225, 61,169, 52, 94,155,197,242,249,225,139, 63,254,172,
-151,226,109, 83, 25,250,196, 93,133,161, 45, 11, 72,191,145, 83,221, 56, 27,113,220, 35,214, 1, 9,161,148,178,211, 46,212, 46,
- 57, 40, 48, 48, 16,175,120,211,101, 39,223,139, 69,189, 6,237,237, 39, 91, 2,168,112,182, 39,240, 23, 77,109, 7, 85, 11, 69,
-146, 22, 36, 62,236,117,137,110,175,216, 47,115,167,133,241, 25,186,106,106, 19, 78,211,162,148,117,177,208,110,119, 80, 52,255,
- 11, 64,210,181,236,198, 81, 68,209,174,174,170,238,170,238,121, 56,118, 12,138,145, 21, 12,138,149, 44, 12,130,136, 21, 66,130,
- 13,130,255, 96,195,103,241, 15, 44,145, 88,178, 66, 72,217,241, 76,164, 88, 88,142, 29,207,244,216,253,168,174, 23,231,152,221,
-172,122,170,103,234,222,123, 78,213,189,231,200,147, 39,143,116,187,104,116, 37, 4,135, 84,150,173, 44,128,225, 75,219, 84,170,
-197,175,175, 30,236, 47,215,181, 73,122,201,235, 96,125,168,171, 22, 36,173,105,181, 92, 87,117,156,205, 94,163,230,197,222,168,
-237,217, 7,143,191,202, 63,108, 46,254,234,211, 18, 81, 14,144, 8,234, 10,182,204, 3,110,145, 65,222, 57,182, 83,234,108, 60,
-194,136,118, 33,162, 19,106, 44,202, 32,200, 42,168,206, 38,107,100,120, 55, 77, 55,185,188, 60, 57, 10, 77,121,116,222, 47,118,
- 89,233, 88,161,210,137,152, 26,164, 82, 35, 59,201,118,174,117,110,132,158,133, 24,138, 1,113, 55, 73, 60,202,161,124, 32,205,
-174, 63, 59,174,190,254, 60, 63,180,175,182,219, 32, 44,123,253,131,201,243,132,186, 77,255,157, 16,193,236, 52,245,237,144, 16,
- 39, 4, 76, 16, 61, 79,179, 34,114,197, 46, 24,197,246,231,130,253, 4, 20, 34, 82,158,179,172,220,182, 5,207,113, 53,197, 56,
-105, 53, 94,246, 46,123, 75, 67,144,224,130, 2,239, 69,233,114,201, 17, 39,209,121,103,142,252,200,254,239, 80,237,120, 43,108,
-193,241,145,129, 31,148, 31, 62,123,188,169,246, 94,252,114,107, 81, 32,133,215,141, 22,141,165,134, 42, 13, 96,106, 10,222, 71,
-222,105,214, 20,201, 9,134,183,134,190,215,250, 46,216,143,222, 51,223,125,191,255,205,183,219,162,251,189,127,113,149,183, 5,
-246,201,136,108,190, 11,125,200,161,167,160,235,140, 93,113,147,199, 45,208,185, 0,132,247, 93, 73,190,247, 10,104, 61,221, 92,
-167,240,150,141,237,213,206,243,250,145, 77,101,168,188, 20,151,239,136, 89,121,209,216,115,118,155,199, 50,224,136, 84,148,174,
-139,192, 31, 63, 95,109,210, 59, 71,197,167,159, 88,119,160,192, 99,106,144, 29,182, 7,226, 17,139,178,182,209,206,114,159,202,
-161, 28, 13, 82,108,142, 37,253, 28, 56, 71,145,169, 57, 9,156, 68, 68,213,143, 9,148, 32, 3, 25,163, 84, 34, 60, 80,229,163,
-224,136,145, 15,254,206, 86,140,161, 2, 88,207,176, 87, 7,192, 16,144, 81, 88, 89,139,189,121,255,244,240,250,240,217,223, 23,
-215,189,156,219,229,236,119,168,118, 81,227, 21, 86, 98,102, 83,165,191, 2,204, 55,105,197,113,254,216,245, 64, 84,177,141,136,
-122, 90,102,243,142, 52,241,214, 4,232, 33,235, 60,222,164, 96,223,253,226,180,154,198, 77,129,191,187, 45,139,255,199,150, 1,
-179,214, 69,110, 50, 88, 11, 10,169,162,133,114,166, 86, 43,125,183, 81,132,138, 80,113,134, 32, 7,106,100, 83,240,211,135,238,
-223,221,193,211,197,199,103,199,191,189, 20,111, 47, 54,146,216, 64, 47,188,154,157,228,212, 40,231,246, 36,167,225,147,178, 90,
-218,154,138,108, 36,125, 0, 31,214, 98, 55,154,251,230,218, 58,120,201,115,213,182, 78, 22,235,145, 20, 84,175,153, 70,241, 61,
-162, 1,165,232,115,104, 66,133,250, 53,110,171,213, 8,124, 74,125, 92, 71,155,215,236, 39,192,237,122,234,131,149,173, 40,193,
-179,252,214,177,141,150, 82,229, 52, 31, 75,195,157, 60,255,243, 10, 75, 59, 49,234,120, 57,230,187,130,142,202,198,137, 74, 77,
-161,213,244, 78, 78, 46, 42,115, 11,158, 36,106,138,254,212, 85,200,181, 79, 65,207, 0, 79,145,166,180,148,201,196,179, 60,205,
- 27,217,238,158,217, 96,147,117, 74, 70, 43, 49,196, 20,177, 84,188, 36,125,131, 80, 16,228,144, 98,235, 71,108,167, 49,149, 11,
- 61, 38,103,144,148,115,198, 98, 91,224,119,207,161,177, 91, 81,172,198,130,168, 70,139, 86, 23, 86,233,246, 64, 46, 31, 38,213,
-218,246,236,203,244,228, 81,218,116,113, 48, 75,181,127,116,240, 99,119,254, 70,108,149, 82, 32,119, 53,130, 75,154,148, 57, 95,
-158, 56,226, 25, 34, 47,155,228,189,171, 8,210, 9,221,230, 28, 71,250, 8, 56,216,132, 38,168,118, 62,210,165,206, 97,115,142,
- 70,167,206, 63,119,229, 27, 65,211, 8,246,132, 74,117,171,233, 4,130,136,238, 15,151,239, 63, 61,254,185,127,253,235,140, 13,
- 17, 83, 81,245, 0,104,114,204,212,183, 84, 72, 81,247,180, 29,129, 89,250,251, 54,159,114,198,251,160,158, 83, 50,158, 13,167,
- 60, 44,243, 85,233, 46,237,233,120, 56, 61,255,233,159, 63,218,208,183,148, 33, 54,101,196,147,102,137,236,115,233,188,114,217,
- 13,209,152, 59,105, 56,106, 71,135, 7,228,143,236,230, 27, 0, 74,202,229, 99,131, 77, 67,112,114, 28,252,174,155, 12, 29,246,
-120,200, 49, 21,110,100, 11, 35,103,130,151,211, 44,145,123,234,193,173,182,213, 44,245, 14,127, 7,214, 87, 26, 64,131,130,131,
-117,117,140, 17,136,137,103,131,160,167,205,127, 2,176,116, 45, 59,114, 19, 81,180,108,151,171,202,143,238, 30,146,204,132, 9,
-140, 2, 8, 77,128,129, 21,108, 2, 89, 51,159,132,196, 55,241, 11, 44, 17,176, 67, 72, 32,161, 72, 72, 36, 16, 6,102, 50, 15,
-187,253,168, 42, 87, 21,231, 88,172, 91,114,183,221,183,206, 61,231,250,222,115,139,247, 63,126, 15, 4,189, 65,240,237,140,174,
-171, 42, 19,242,192, 52,185, 73,219, 82,149,166,222,178, 69, 12,223,171,141,198,147, 6,208,175,163,170, 91,219,222, 43, 11,171,
-118, 82,179,173, 43,171,142, 78,207,155, 95,245, 47,223,140,248,174,118,171,254, 31,255,113,235,202, 45,150, 82, 89, 53, 71,174,
-227,176, 32, 8,184, 67,124, 71,214, 86,245, 58,215,195, 92, 43,220, 58, 49,203, 85, 63, 17,236, 44, 44, 47,142, 55,233,190,186,
-247,239,208, 4, 49,170,150,166,148,222, 65,252,113, 32,177,156,242, 41, 78,222,236,141,197,237,131,168,130,155, 22,183,139, 57,
-124, 88,126,249, 44, 63,127,210, 29,111,159,191,186, 5,162, 39,205,118, 16, 41,247, 66,115,175, 26,114,166,228, 2,241,201,205,
-139,205,234,162,194,241,170,139,181, 79, 59, 33,243,107, 16,128,134,253,121,244,125,105, 83,201,161,117,214, 45,153,163,115, 54,
-223,112,124,197,113, 13, 55,126,161, 52,154,109,216, 54,248,153,110,150, 80,206, 97,212,182,143,190, 7,231,194, 39, 68, 88,176,
- 38,155,144, 90,196, 28, 66,111, 50,208,244,183, 31, 53, 15,222, 57,252,238,199,222, 46,169, 52,219,160,243, 86,130, 86, 33,155,
-228, 1, 26,206, 13,173,174,211, 1, 36,148,107, 70,182, 2,250,187,208,232,234,252,163, 55,191,254, 74,157,125,120,147,158,255,
-209,255, 14, 13, 38,160, 76,250,142,130,212,222, 57,206,157,116,113,184,158,247,203,146,192,166,246,144,219, 62,140,214, 78,225,
-114, 72,115, 31,246, 16, 24, 72,154,131,119, 49,141,150,227, 84, 5,174,192,210, 34, 43,221, 89,226,212,151, 22,162, 3,196,175,
-116, 85, 42,145, 12,144, 6, 28, 4,169, 74,228, 77,250,226,105,213, 28,181,126,147,233, 26,145,144, 51, 17,233,162, 80,224, 53,
- 92,125,133, 52, 84, 32, 81,200,117,149, 20, 2,140,125,143,158, 27,101, 22, 26, 1, 5,228,159, 14,128,108,151,171, 52, 93, 66,
-228,250, 16, 22,123,189, 58, 63, 64,153,178, 56,163,240,151, 79,251,181,225, 77,208, 22, 24,241,207,238, 41,176,226, 19,255,232,
-147,207,127,139,102,184,234, 32,171,131, 53,243,100, 0,165, 51,117, 58,235,249, 72, 65, 42,200,234, 54, 1,216,129,202,160,204,
- 32,206, 8,177,171,141, 40,232,247,203,238,117,157,249,122, 2,202, 11,163, 57,235,118,246,110,125, 20,187,113,158, 89,134, 45,
-214,114, 30,238, 95, 38, 18,125,195,201, 7,103,100,196,201,238, 57,175,173,228,186, 72,143, 47, 65,150,130,247,183,206, 66, 32,
- 57,218,105,126, 53, 60,252, 84,127,246,244,228,175,159, 55, 23,175,255, 49,136,237,182, 68, 2,216,201,196,150,161,106,221,131,
- 91, 21, 59, 45, 51,182,101,103, 7,149,148,107,147, 17, 48, 20,143, 23, 15,146,165, 82,144,125,190,202,112, 42, 4,111,104,241,
- 51,123, 81,121, 54,211,226, 17,123,176,161,232,104,162,150,199,180, 53, 67, 30, 57, 58, 90,215, 51, 83,178,242, 50,239,250, 49,
-181,120,222, 94,210, 43,123, 85, 10, 50, 47,125,229,100, 41,238, 23,102, 43,254,188,139, 63,221,108,155,227,205, 41, 18,152, 29,
- 58,246, 86, 3, 2, 71,165,132,108,203,161, 92,173,231, 16,245,214, 7,199,200, 95, 0, 59,210,150, 90,151,206,210,198, 1,146,
-216,177,130,157, 43, 45,115,199,174, 86,174,204,203,214,205,198,248, 89, 74, 64, 6, 57, 23, 38,190,252,240, 56,139, 83, 93,118,
- 16,110,144, 98, 1, 64,234,239,148, 24, 61,247, 69,216,120,237,185,233,136, 46, 74, 52,134,240,186,142, 98,163,154, 70,103,111,
-136,205,225,193,225,227,179,252,131,211,113,153,147,243, 75,217, 62,230,108,233, 15,251,191,251, 72,211,104,110, 96, 91, 16,214,
- 64, 68, 80, 89, 58,229,178,254,158, 65, 13,173,107,193, 86,235,188,172,168,185,131,139, 70,202, 17, 64, 76, 37, 66,235,164,117,
-208, 43, 51,190,220, 22, 98,120,118,185, 92, 8, 92, 39,242,253,107,142, 51, 34, 41,249,194,124,252,228, 45,252, 29,223,246, 87,
- 29,165, 45,232,189, 7,206,150,139,196,193,154,184,220,199,116,220,203, 14, 72,230, 96, 99,142,244, 40, 12, 71,224,161, 80,179,
-133,173,248,244,121, 1,119,142,139, 30,111, 78,118, 39,223,191,120,240,242,226,101,189,171, 71, 57,235,215,184, 20, 2, 53, 74,
- 7, 52,170,148, 75,147, 73,203,222,229,211,196, 33, 58,240, 1,157,170,166,182, 4, 75,170, 78,144,181,121, 46, 74,229,161,219,
-205,172,108,172,217,248,194, 87,132, 69, 61,203, 8, 32, 89,232, 92, 95, 57, 40,195,134, 78, 3,226, 14, 32, 30, 76,148, 37, 23,
-251, 34, 0,166,210,248, 52, 30,184, 78, 46,241, 54,216,255, 4,224,232,218,118,227, 40,162, 96,223,102,102,167,103,189,217, 56,
-142, 45, 91, 4,130, 66, 2,130, 23, 43,178,223, 80,254,128, 63, 64,249, 5,254,133, 47,226,137, 7, 16,226, 38,241, 64, 20, 41,
- 66,225,162,216,217,139,119,119,166,111,211, 77,213,188, 90,107,187,119,166,187, 78, 85,119,245, 41,125,121,249,153,246,157,177,
-141,198, 75,109,205, 56, 3,253,111,108,109,103,150, 93,177,164, 53, 93,189, 80, 93,107,219, 57,132,103, 55,170,118,113,210, 48,
- 98, 71,116, 74, 67, 43, 84,182, 56,213,220, 63,127,124,245,250,219,253,155,213,148,107,231,166, 12, 63, 84,138, 42,249, 32, 13,
- 13,213, 12, 88, 70,201, 2,195,192, 84,173,216,106, 67,139, 35,169, 38,207, 51, 91, 51, 87,244,112, 53, 21, 4,137, 60, 68,223,
-199,232, 14,113,220,127,112,230,138, 57,251,231,174, 77, 61,212,180,228,201,178, 8,149, 7,212,198, 65,233,202,101, 54,113, 59,
- 72, 55, 36, 35,218,207, 63, 60,254,234,178,188,120,242,231,122,188, 61,220, 28, 66,164, 9,102,244, 58,215, 9, 10,146, 61,175,
- 5,187,132,153,232, 84,192, 0,233,136, 48, 28, 41,221, 74,132,133,165,202,116,249, 66,236, 67, 80, 22,134,131,229, 50,114,125,
-211, 66,204,239,197, 48, 12, 40, 64,172,173, 17,160, 15,237, 22,239,114,218,102,122,110, 83, 15, 82, 17,217, 24,198,167, 85, 28,
-181,134,136,102,252,245,123, 54,212, 21, 60,207, 43, 29,125,245,144,214,230,227,171,199,223,255, 92,111, 92,121,120,210,205, 2,
- 32,142, 79, 67, 44, 50, 29,146,248,254,224,204,110,106,104, 54,159,177, 39,112,152,191,124,121,242,205,215,149, 93,188, 57,252,
-242,215,250,253,193, 39, 1,176, 46, 43, 31,119,101,104,243,102, 27,242, 70,184, 93,201,189,176,107, 89,110, 11,208,252,144,242,
-246,111, 35,111,133,191,139,205, 54,131,186, 80,190, 78,221,125, 69,144,152,159,130,167, 5,228,170,210,179, 7, 47, 32, 30,115,
- 25,227,237,168,177, 38,111, 40,202,111,230,169, 79,236,243, 23,215,250,163,167,182,183, 32, 67, 5, 90, 75,207, 11,227, 46,239,
- 67, 4,142,146,185,191,128, 26, 64,126, 93,244,212, 76,167,118, 68,202, 52, 99, 46,197, 22,122, 74, 64, 51,141,255, 49, 80, 21,
-111, 47, 42, 44,179,160,182,124,127,116, 60,236, 2,192, 61,149, 96,125, 26,166,185, 0, 54,182, 31,167, 63, 86,203, 50, 87,247,
- 78,243,236,147,235, 95, 87,217,121, 7,118, 16,122, 20,233,208,170,161, 17,227, 64,243, 60,143,168, 18,126,198,108,139, 84, 24,
-204,237, 3,221,153, 98, 54,249, 90, 49, 89, 26, 87,101, 91,241,165,242,134, 71, 9, 67, 28,143,239, 95,207, 69,216,172,185,135,
-100, 43, 94,168,159, 41,224,148, 33, 42,107,176, 77,211,147,134, 80,116,130,183,109,128,242,204,157,151,140, 81, 38, 96, 96,237,
-211, 85, 0,113,112,179, 11,111,253,197,151,203,167,207, 79,127,255, 81,238,221,187,160, 83, 59,111, 85,171,241, 84,104,212,230,
-110, 52, 70, 52, 0,249, 92, 82,173,195,188, 2, 95,165,143, 6,171,145,231, 97, 13, 13, 41,214, 50, 85, 56, 73,176,122,222,197,
-171,129,248,190,217,118,236, 80,174,182, 75, 47,171, 22,255, 23,224,178, 65,109, 86, 98, 54,224,219, 14,171,166,106,226, 48,199,
- 16,143, 80,149,176, 98, 71,157,204, 94,141,213, 17,152, 59, 94,116,219,113, 59,193, 90,250,237,111, 83,124,189, 26,244,226,226,
-209,131,108, 55, 27,166,218, 90,179, 15, 53, 19, 94, 3,232, 13, 72, 69,175,238,113,127, 9,165,206,180,182,162, 31,162,146, 32,
- 23,117,197, 27, 11, 96,195,137,137, 83, 3,112,213, 37,240, 52, 30,158,167,108, 81,217, 67, 82,222, 41,182,135, 85, 60,149, 10,
-208,131,128,164, 3, 42,254,190,247, 70,104, 7, 4,132,176,198,211,247,202, 22,181, 84,202, 0,238,187,178,104,141, 90, 30,169,
-206, 60, 56,242,139,211,197,241,167, 87,242,217,233, 93, 92,185,205, 93, 73, 33,229,179, 71,231, 63,197,221, 31,225, 95, 70, 22,
-112,171, 14,139, 92, 12,140, 55, 19,188, 58, 39, 61,241, 2, 92,190, 76,237,160,228, 66,230, 22,228,205,232, 29, 8, 62, 6,216,
-177,141,189, 43, 80,231,248, 48, 68,139, 96, 71,200,216, 15,207, 87,249, 93,157, 13,102,108,212,108, 19, 47,170, 3,166,205,121,
-243,228,217,197, 15,187,219,223, 24,208,194,124, 69, 32, 85, 47, 85,207, 83,151,200,202,158,167,134, 20,220,207, 55,208, 57, 76,
- 78, 87,220,166,204,211,173,110, 94,143,161,219,130,214, 76, 26, 55,204,195,126,153, 94,124,247,234,109,181, 80, 71, 49,227, 55,
-110, 98,242,109, 86,118,236,231,133,141,104,216, 50, 12, 83,113,104,234,186,236,107,222,129,102,155,186,186, 0, 70, 68, 16,209,
-199, 37,196,156,163,233,160,236, 66,227,202,205,144,215, 33,117, 18, 12,125,208, 16, 1, 12, 87, 73,227, 70,175,215, 85,133,226,
-204,237, 93, 37,241,121, 61,116,202,214, 59,211, 2,123,247, 80,117,170,186,135, 21,243,191, 0, 36, 93,203,110, 28, 69, 20,173,
-103,119,117,207,244,120,108,227, 8,112,136, 37,243, 8, 9,145, 32, 10,136, 5,107,150, 44, 16, 75,254,128, 95,226, 43,224, 31,
-216,176, 38,202,202,139,200, 88,202,195,246,216,211, 51,213,221,213,213, 85,156,211,200,139,177,100,143,229,169,174, 91,247,156,
-186,247,158,163,159,125,255,133,212,235,194,209,234,162,114,102,173, 79, 26,112, 53, 91,137,181, 89, 22,139,198, 45,105, 7,107,
-171,208, 4, 87,175,107,233, 26,103, 42,179, 45,215, 37,185, 79, 93, 59,225,130, 59,254,242,252,244,211,191,126,111,239, 70,117,
-192, 97, 81,142,186,141, 30, 71,250, 68,151, 64,163, 99,164, 21, 9,104,231,200,161,217,178, 90, 41, 75, 41,185, 72,185,163, 68,
- 47, 8, 85, 16, 75, 81,178, 1, 9,187,163,236,126,200, 99,236,135,228,143, 87,160,128,235,219,205,105,155,176,241,124, 44, 83,
-236,241,162, 99, 24, 91,154,178, 2,179, 53,199, 31, 29,254,244, 93,255,227,183, 87,181,185,184,122,115,221, 33,186,238,193, 5,
- 41,181,155, 71,178,115,176,210, 52, 40,121,135,141,230, 67, 65, 49,184,110,246,178, 37, 18,163,101,146,108, 58, 19,141,141, 28,
-215,212,170,144,164,122,248,153,162,197,139,225,228,161,165, 0, 95, 66,204, 43, 94,245, 7, 67,143,119,177, 79,129, 51,174, 35,
-248, 35,141, 96, 17, 39,145,170,102,188,217,225,120, 60,144, 1, 69,112,163,146,200,236, 13,167,205,240, 62, 93,219,211,167,199,
-175,111, 30,189,185,146, 46,177,178,233, 26,197, 38,234, 98,166, 83,213,132,192,197, 67, 27,176, 52,247,241,204,174,126,251,245,
-228,231, 95,188, 24, 46,218,151,239,198,187,113,184,145, 20, 98,148,209,123,177,223, 38,154,141, 95, 42,177, 77,187,205, 72,239,
-194,109,222, 68, 80, 64,186,212,246,244,207,142,251, 62, 3,178,133, 93,162,252, 46,210,198, 64,208, 64,125,149,158, 19, 3,188,
-230, 22,162,213, 44,105,230,185, 27, 82,104,177, 85,146,142, 85,147,222,139,252,122,151, 30, 61,209,207,159, 47,240, 72,212,161,
-164,110,132,163,109,180,114,133, 29, 73,102, 56, 17,160,105,167, 72, 67, 94, 49,178,179, 58,179,198,136,165, 24,177,246,180,217,
-152, 53,123, 82,140, 62,210, 77,120,199,185,139,160,152,233,144, 61, 52,113, 96,169,211,152,111, 41, 24,172,102,125,202, 60, 55,
- 36, 43,103,244,193,212, 60,121,120,255,201,215, 47,223,190, 71, 38, 90, 41,172,242,228, 83,218, 88,160,134,180,233, 13,206,102,
-100, 32, 51,155,250,244,119, 50, 32, 45,235,100, 60,206, 37, 78,140,142,156,206,158,104,252,100, 4,115, 45,139,134, 41,249,233,
-223,100,191,250,172, 57,154,118, 61,194,124,201,203,117,170,234, 35,220, 11, 60, 52, 74, 34,129,126,196,185, 84, 44,136,151,103,
- 27, 94,252,103, 5,253, 0, 44,130,174,167, 78,110, 2,132,111,140,247,247,246,189,255,240,135,234,217,139,179,139, 87,230,246,
-170,205, 57, 87, 35, 19,134, 94, 42,238,232, 18,155, 54, 29, 91,123,176, 80,253,161, 22, 75,196,166,238, 86,148, 3,174,106,135,
- 12,106, 28,117,214,113,216,166, 1, 80, 61, 3, 83,129,204, 3, 68, 75, 93,246, 69, 35, 10,214,245,189, 47,114, 77,167,140,161,
-196,161,159, 90, 67,101,238,144,213,182,171,139, 61, 78, 79,172,180,169, 23, 19, 8,215, 14,152,101, 24, 52,245,230,136,108,108,
-166, 77,104,113,160,241,253,213, 59, 21,106,119,190,206,108, 6,245, 1,116, 68,213,106, 97, 41,180,181,199,167, 7, 27, 72,179,
-206, 47,120,209,221,255, 29,179, 89, 20,130,130,179, 96,246,200,173,139, 81,134,229, 34, 1,212,135,158,178,238,216, 57, 28,155,
-194, 7, 89,156, 20,179,189, 26,136, 25, 66, 40,117, 30, 47,153,138, 71, 88,165,128,192,159,168,223, 71,109, 27,189,103, 75, 34,
- 14, 36, 91, 56, 91, 21,216,232,211, 98,125,244,224,243,199,234,233,249, 8,208, 10,170, 0, 24,154,237,195,229,217, 7, 71,255,
-248,235,183,211, 70,234,182,164,235,125,110,241,118,172,134, 28,172,168,235, 56,142,115, 21,158,100,138,157, 95,224,175, 30,187,
- 29,152,140, 2,214, 38,150, 28,204, 7, 8, 92, 68,170,246, 57,169, 83,116, 82,238,134,111,110,245, 13,167, 28,169,146,210,229,
-190,142,145,151,190,143, 63,182,149,250,163,189, 12, 72,101,218,238,167, 4,166, 8,116, 54,178,186, 78,169, 42,110,123, 4,191,
-136, 75, 98,215,200,210, 20, 75,119,142,221,161,162, 24,231, 12,195, 47, 57,167,214, 66, 93, 63, 40, 95,252,249,247,229,182,189,
-139, 81,181,125, 72,131, 88,117,192,237, 58,181, 90,150, 45,210,102,115,195,202,228,222, 27,159,186,144, 84,200, 33,116,169,239,
-123, 53,255, 97,221,171,229, 16,204, 48, 37, 18, 58,250,209,234,213, 92, 21,137, 59,176,169,154,125,245,241, 30,169, 2,188,143,
-173, 47, 42,117, 56,157, 57,219, 83,240,247,123,231,101, 5,112,202,154,154,119,147,252, 79, 0,146,174,102, 71,142, 26, 12,186,
-109,119,219,253,179, 51,179,195, 46, 89,237,146, 31, 41, 74, 16, 2,133, 92,200,133,192,133, 19,207,193,137,231,131,119, 0, 9,
- 33, 69,226, 64, 56, 37,145, 16,104,119,179, 25,205,244,204,184,221,118,183,169, 50,183,213, 74, 59,218,113,187,235,171,242,247,
-185, 74,125,241,252,203,229,133,110,214,105,173, 77,217, 53, 45, 21, 56,221,171,171, 18,122, 79,150,173, 41,165,109, 5, 77, 6,
-108, 19,165,225,155, 48,138,165,236,206,116,201,209,248, 54,170,205,114,241,244,108,187,254,245,167,219,155, 8, 29, 17,170,196,
-248, 56, 44, 58,251, 8, 35,179,100, 88, 84,125,161, 45,205,108,120, 41,200,128,172,224,247,248,186, 88,157, 2, 52, 12, 91, 86,
- 24,192,145,170, 50,239, 59,164, 52,238, 35,237, 13, 80, 92,220,253,123,255, 62,184,183,177,204, 73,253,120, 8,231, 33, 52, 97,
-180,109,173,186,197,234,197, 19,245,253,179,187,239,158,190,185, 84,127,246,155,119,123, 46,146, 77, 76,118,194,218,143, 46, 59,
-138,142, 60,112, 44,122, 57, 98,253,254,111,144,214, 81, 24,167,161,149, 98, 71, 83,119, 6,132,229, 62,155, 4,114,102, 56,231,
-192, 95,161,139, 78, 64,162, 1, 85, 24, 8,153, 3, 9, 82,118, 53,103,207,206, 13,115, 12,185, 60,129,249,209,243, 54,162, 36,
- 13, 46, 0, 29,171, 34, 92,211, 1,142,132,195, 39, 15,124,139,218,121, 66,190,215,122,161,213,229,227,110,245,201,250,183,223,
-153,210, 54, 53,139, 74,181,109, 57,149, 86, 3, 95,161,219, 38, 80, 61, 23,167,222,126,253,249,163, 31,126, 76, 95,125,251,143,
-120,251,182,127,117, 61,244,242,184,243,110, 55,249,113,118,187,249,112, 59,171, 77,242,248,225,253, 36,204,156,182,168,217,105,
-231,121,122, 8,204,243,144, 53,199, 57,246,243,225,142, 35,249, 97, 40, 92,182,150,105,242, 0, 49,240,174,215,217,245, 5,155,
- 41,208, 56, 12, 91,153,126,235, 90,176,105, 93,165,150,134,176, 2,181,161, 91,167,151,223,212,237,170,242,109,217, 46, 75,218,
-176,129,186,114,200,138, 98, 74, 26,102,110, 9,182,220, 24,174, 2,245,154,232,144,155, 56, 92,176,141,244,152,239,149,238, 71,
- 31, 11,135,106,140, 23, 97, 91, 2, 94, 33, 31,228,150, 15, 3,184,132, 23,119, 24, 24,158,224,233, 7, 73, 28, 22,117, 33, 27,
- 30,209,204,216,188,118, 60,127,116,127,115,241, 96,243,225, 58,226,207,253, 0,169, 17, 80,106, 29,231,201,107, 82, 40, 72, 49,
-157,189,184,192,250, 82,211, 8,113,218, 16,251,152,218,157, 39,151,115,131, 21,236,109,152,166, 22,148,173,166,128,221,111,196,
-242,162,123,190, 24, 54,238, 0, 8, 44,122,182, 29,114,251,140, 35, 64,202, 49, 96,158, 94,184,138,202,155, 61, 90,108, 23, 8,
- 11,193,224, 54, 69, 43,170, 9,152,167,117,228, 8,217, 81,112,244,235,221,112,245,242,244,242,241,197, 95,175, 99,191,191,173,
-172,154,207,233,244, 9,102,141, 5, 95,157, 24,119, 2,250, 8,129, 21, 22,144,201,153,111,163,154,212, 6, 80, 57, 57, 94, 28,
- 3,189, 81, 60, 14, 4, 74, 98,167, 81, 54, 72, 60, 23,192,189, 62, 28, 11,218,248,242,157,130,170, 16,186,169,244, 82,130, 21,
- 20, 19,157,236, 5, 74,245,204,225, 25, 25, 70, 15,190, 86,248, 19, 81,236, 34, 45,180, 24, 97, 58,207, 11,148,153, 26, 15,219,
- 52,224,223,254,117, 63,142,245,242,225, 71,157,153,222, 59,142, 19,160, 14,166, 3, 52, 76,145, 44,152, 30,189, 8, 5, 93, 67,
-240,213, 79, 1,255,178, 25, 37,180,213,112, 44,181,179, 0, 49,237,226,134,215, 31,193, 15,241, 22, 48,224,194,241, 34,233,132,
-135,112,192, 39, 15, 96,100,105, 90, 37,115,152, 77,143, 58,144,192,160,107, 60, 33,139,149,157,184, 83,198, 56,200,100,140, 50,
- 39, 85,117,149,218,211,121, 93, 46,174, 62,253,108,120,118,255,131, 97,184, 98,132,208,143,199, 80,116,103, 75, 91,137, 95, 32,
-135, 24,246,199,235, 20, 96,203, 35,247,168, 7,153, 60, 45, 61,173, 85, 50,202,230, 3, 61, 39,152,156,158,155, 55,180,239,152,
-243, 41, 27,157, 1, 3, 51, 59,253, 82,212, 90,152,100,235,234,102,255,226,160,254,150,249, 52, 18,255,127, 37, 3,120,152,106,
- 86, 79, 46,110,142,215,127, 12,119,163, 0, 52,242,170, 4,223,126, 6,120,240,172, 61,187, 77, 50, 58, 24,176,218,242,234, 29,
- 74,216,196, 45, 42, 2,231, 35, 9, 95, 3, 79,231, 19,239,118, 51,239, 64,150,193,216,135, 63,191, 10,219,254,186,229,241, 19,
-207,232,108, 1, 82,192,254, 22,217, 94,178,209,135, 80,233,106, 54,154, 23,223, 20, 20, 70,217, 51, 4, 90,115,180,171, 86, 94,
-122, 35,110,104,240,183,183,193,239,167, 36,135, 82, 56, 65, 3, 4,104, 8,199,160,223,170,183, 21, 40,240, 60,117,208, 92, 6,
-132, 32,170,170,167,117,150, 9, 60,235,172,154,150, 84,104, 23,172,253, 79, 0,146,174, 93, 55,146, 42, 10,222,190,143,190,253,
-156,177,141,141, 1,173, 16, 66, 34, 96,165,149, 86,218, 28, 68, 76,142, 4,191, 65,204, 63, 16,242, 11,252, 4, 49, 17, 1, 34,
- 0,132, 48,200,107,216, 93,205,216,158,158,233,231,125, 81,213,196,150,165,153,158,211,231, 84,221, 91,167, 74,111,243, 45,183,
- 65,178,205,193,132, 26,173,189, 17,182,164,112,196,186,202,228,162,222,208,224, 16,132,185,237,175, 76,214,175,235, 43,131,108,
- 54,130, 82, 2,171,152, 29, 28,219,250,250,234,151, 31,194,205,212,130, 54, 15, 34,238, 68,108,129,225, 50,238,154,225, 71,232,
- 14,114,115, 78, 19,173, 50, 75,131,163, 20,176,168,208,251, 48,154, 85,121, 25,120,184,169,100, 89, 98, 16,132, 52,216,132,255,
-204,195,208,103,186,226,140,245,111,186, 49, 28,247,255,170,246,239, 23,117,240,231,117,119,184, 76,166, 70,169,148, 60,179, 62,
- 36,241,170,127, 56,116,195,216,117,185, 9,133,168, 84,177, 79,138,214,186, 92, 23, 2, 61, 74,189,227, 45,161,112,103,206,211,
- 30, 18, 45, 60, 37,218,245, 22, 32,152,130, 65,151, 84, 79, 48, 31, 37,210,155, 3,240,218,175,107,235,115, 42, 35,197,235,153,
- 6,224,162,100, 22, 99, 14,252, 35, 77, 17,136,175,207, 41,238, 11,244,195,166,137, 55,222, 1,204, 45, 46,224,163,160, 40,250,
- 77,224, 98,244,204,242,170,205,103,180, 85, 96,134, 19, 5,230,170, 77,125, 72, 55,127,237,222,121, 62,159, 95,213,243,163,105,
-173,166, 74,173,136,249,192,112,198,173, 54,247, 99,189, 61, 47, 62,255,164,252,234,139, 81,229, 55,203,207,119,221, 27,148,253,
- 50, 46, 50,238,233,128, 48,228,153, 60, 36,127, 31,143, 49,158,146, 3,117,112, 15, 50,244,232,145, 40,220,160, 68,156,239,197,
- 36, 85,241, 8,232,236,199, 40,200,240, 25,156, 78,189, 35, 10,172, 2,209,157,201, 38,163, 23, 23, 37, 87,240, 59, 12,136,213,
- 29,147, 65,175, 84, 87,203, 46, 15,225, 36,142, 46,126,250, 84,159, 93, 0, 72,170,162,166, 79, 58,166,126,178, 5, 42, 68, 54,
- 19,215, 13,140,225,157, 70, 22,214, 51,123,204, 83,114,105, 12, 51, 10,198,105,223, 0, 92,229, 39,165,241,203,166, 62,197,131,
- 1,137, 10, 22, 85,185,106, 51,240, 94, 40,222, 11, 25, 0,220, 19,213, 46,188,131, 15, 96,231,116,245, 98, 55,105,162,174,181,
-125,114,253, 79, 7, 20,212,172, 54, 48, 83,234, 39,177, 77,170,208,217, 73,122,153, 40, 10,137,129,182,192,160,234, 70,142, 41,
-181, 59, 17,212,122, 98,179,172, 39,210,229,178,128,197, 24,197, 36,241,153,129,148,146, 17,150,253,171,201,199,183,207,170,135,
-199,112, 74,162, 41,240,181,179,211,234, 29,205, 8, 69,112,123, 5,220, 15,146, 4, 92, 98, 49, 26, 61, 87,221,124,203,243,215,
- 12,140,100, 6, 43, 0, 61,146,153,157, 20,173, 34, 83,119,123,171,191, 79, 31,127,249,252,235,111,158,125,247,173,125,253,251,
-159,234, 24,172,110, 69, 57, 59, 43, 27,160,162,217, 13,128,157,165,115,111,101,118,142,245, 42, 85,154,178,116,190,193,227,215,
-131,165, 44, 34, 23,235,160, 5,104,182, 69,239,226, 54,113,148,250,236,194, 21,161,194,251, 61, 58, 31, 43,244,224, 71, 17, 92,
- 85, 88,185,245,227, 81,208,125,128,219,183,118,166,165,157, 24, 76,147,244,164, 25,131, 48, 37,157, 3,158,160, 11, 11,213, 84,
-125,216,224,221,106,180,247, 63,253,145,196, 78,126,246,238,251, 79,230,151,119,185, 88,142,149,157,193, 29, 57, 49, 37, 83,159,
-179, 98,171,199,113, 54,187, 26,253,102,116, 12, 98, 76,102,113,149,167,102, 44, 95,108,172,213, 56,133, 83,232, 82,160,175,228,
-255, 82,193,189, 43,248, 80,101,118,196,111,145, 82,191, 20, 92,136, 4,255, 90,240,112,104, 73,230, 36,154,153, 2,247,207, 36,
- 88, 13, 96, 36,222,199,162,105,234,235,143,194,211, 15, 38, 32,226, 7,176,183,209, 51,187, 35,122, 64,244,252, 65,168, 91,102,
-111,104, 38,220,226,147,100, 35,157,254, 66,180,108,244,198,155,138, 11,151, 62,160,181, 17,244, 41,106,182,132,102, 66, 83,148,
- 26,181,108,104,216,198,191, 48, 86,218, 12, 32,153, 65, 57, 59, 13,128, 32,123,153,213,129,233,165,134,183, 28, 62, 94,230, 31,
-154,226,199,163, 3,164, 74,185,207,228, 36, 67,225, 70, 42,238, 0, 19,208,181, 13,105, 59,120,186,209,214, 51,112, 72,225, 91,
-163,124,129, 98,122, 45,209,238,220,122,113,195,123, 25,154, 83, 37,170,253,146, 41,126,123,175,126,113,231,126, 69,187, 96,242,
-194, 20, 59, 80,170, 41,207,131,242,101,175,194, 33, 74,250,128,103,254, 52, 79, 11, 8, 84,109, 84, 95,102, 12,200, 27,128, 62,
- 80, 51,157, 61,216,205,100, 67, 91, 3, 30, 6,124,180,234, 40, 42, 86, 39,243,177, 68,110,182,152, 93, 11, 0,150,216,233,165,
-209,178, 93,172,206,211,228,117, 5, 70, 26, 38, 89,214,203,126,105,235, 50, 70,176,134,255, 4,224,232, 74,118,228, 40,162, 96,
- 46, 85,153, 85,213,219,216, 98, 60, 30,203, 26,132,176,196,193, 50, 50,146, 37,240, 17, 14, 28,248, 6,174,124, 41, 23, 14, 92,
-230, 0, 18,150, 89,198,146, 7,131, 77, 79,119,215,154, 91, 37, 17,245, 1,173, 82, 87,230, 91,226,213,139, 8,253,213,119, 95,
- 20,181,218, 72,116,238,118,179, 51,166, 54,130,170,147, 22, 93,126, 99,144,195,203,100,249, 13,200, 24,188,240, 94,218, 53,103,
- 94,165,218,106, 46,135,211,159, 92,250,237,197, 39,159,253,245,163,251,233,218,159,115,216,190,124,108, 94, 80,246, 17,109, 47,
- 63,218,104, 77,245,119,160, 39,157, 45,234,147, 26,172, 82, 20, 62,163,209,115, 57, 51,160, 9,215,201, 37, 55,114, 21,218,125,
-150,123, 2, 63,126,131, 20,139,189,198,236, 70, 55,124,184,235,218,125, 58,221,138,244,170, 80,191,207,167, 55,199,253,187,241,
-212, 29,186,130,250,117, 45,109, 70,194, 66,107, 53,128,101, 19,245, 97, 1, 93, 73,200, 2, 96,246,148,243, 10,212,166,146, 41,
-209, 66,145,251,124, 29,131,157,206,159,116, 42, 84,244,178, 55,204, 23,248,123,177,206, 28,161,178,121,144,102, 83,202, 69,128,
-133, 64,158,106,239, 82,244,161, 16,148,187,199,185,207, 29,249,208, 41,144,161,234, 10, 98, 81, 46,228,226,161, 29, 37,208,125,
- 80,213, 17,109,174,230, 34,184, 85,184,161, 74, 43,156,212,229,243,251, 93,119,117,243, 38, 54, 43, 33, 27,244,177, 59,188,156,
-222, 41, 61,231,143, 26,251,195,247,103,223,126,125,171,218,215,119,215,255,142,183,115,156,196,120,151,198,137,178, 83, 14,117,
-113,175,167, 67, 28, 58,146, 28,215, 3,231, 69,211,144,199, 94,152, 41,143, 3,121,133,241,144, 67, 68,226, 74,232, 83, 86,153,
-171,192, 83,224,224,157,118, 43,130,236,191,204,177, 53,235, 13,173,116,113,141,137,175, 72, 24,175, 56, 76, 82, 36,225,148,243,
- 93, 59, 63,125,170, 95,188,220,246, 86,231, 45, 26, 95, 54,251,102, 35,105, 20,101,113,104, 36,164,179, 25,166,250,186, 89,184,
-143,148, 21,163,223,149, 54,185,117, 83,145, 98,143,128, 16,110,200,115,160, 39,133,115,165,108, 82,221,205,114,148,190, 23,181,
-145,195, 16, 98, 52,131, 15, 26, 80, 35,144, 6, 23, 11,145, 20,245,136,245, 86, 84,213,252,224,209,218,124,249,205,245,127,253,
- 97, 58, 9, 90,158,251,112,164, 94,135, 50,110,216,147, 30, 95, 49,158, 81, 68, 5,127, 47,215,172, 46,222,123, 75,229,174, 9,
-143,110, 82,129,176, 33,211, 36,144,159,173,185,115,104,144,147,147,190,109,227,213,197,249,199,198,119,190, 35, 2, 30, 41,178,
-184, 0, 51,192, 57,175,113,248, 98,177,170,165,187, 94,145, 26,138, 40,106, 23,164, 95,220,168, 61, 85,196, 53, 26,178, 53, 0,
- 7,197,224, 80,249,252,216,206,127,119,151, 47,119, 23, 79, 30,255,249,155,118,221, 65,213,238,126,133, 95, 84, 40,234, 13, 89,
-170,136,193, 66,199, 82,117,129, 28,236, 38, 90, 20,179,220,152, 74, 58,218,136,171,202,197, 17,151,129, 19, 35,212,184,106,170,
- 93,218, 86, 6, 32,214,166,228,154, 0, 40,104, 27, 90, 56, 13,126,227,163,159,227,144,206,108,137,215,119,158,108, 95, 37, 68,
- 80,236, 44,189, 95,145,172,233,113, 32,200, 51, 77,184, 43,180, 57,143,228, 95, 4,206,191,197,189,244,246,238,116,176,103,159,
-150,171, 42,220,100, 74, 1, 34,237,115, 77,139,188, 13,164, 53, 89,250, 3,115,231, 92, 59,198, 14, 32, 85,240,105,208,225, 32,
- 42, 23, 76, 87, 0, 26,182,193,217, 35, 80, 57, 58, 24, 36, 47,223,227,122,167,133,130,195,203,195,128,158,198,172, 53,173, 47,
-131,155,169,254, 44,208,139, 8,133,115,105,106,127, 89,218,157, 88,159, 21,143, 30, 63, 79,159,191,152, 31,228,211,251,147,104,
-156,112,157, 2,174, 70, 73, 24,119, 15,207, 46,230,233,231,120, 66,215, 50,112, 1,178, 51, 42, 53, 18, 73,104,139,182, 33,115,
- 22,132,234, 78,201,126, 93,208,119,112,150, 53, 25,229, 9,255,212,207, 98,181,161,163, 43,215, 17,169,180,162,231,154, 59,198,
-117,111,227,229, 77,251, 44,150,111, 85,105,209, 70, 76,252, 16, 5,248, 20, 30,110,174,238,169, 95, 78,239,254,145,222, 45,110,
- 59,220,123, 35,205,151, 46,211,212, 38, 68,150,151, 20, 27, 93,163,247, 70, 72, 41,252, 29, 52, 0,220,197, 20,186,166,163, 65,
-230,248, 1,185,158,147, 53, 81,162,170,132,178,214,175,255,120,246,106,255,171,140, 21, 3, 62, 9, 58,124, 26, 0, 74,154, 70,
-209, 4,145, 18, 82, 18,149,132,214,228,146,187,192, 62, 24,125, 76, 25, 39,136,115,194, 19, 23, 19,191, 0,180, 0, 28, 69, 25,
-223, 16,167,170,108, 56,111, 36, 61,202,106,125,104, 11,169,218,170, 0, 50,226,194,163,204,171, 73,186, 80,172, 54,186, 79,232,
-106,150,253, 39, 42, 74,196,255, 5, 32,233, 90,118,228, 38,162,104,189, 93,101, 79,119,103,210,131, 16,132,215, 6,177, 97, 17,
- 16, 18, 11,144, 88, 32,241, 59,124, 4,124, 7,127, 2, 98,207,146, 5, 66, 68, 34, 17, 17, 40, 36,100,122,218,118,219,174, 42,
- 87,113,142,103, 53,234, 77,183,199, 85,117,239, 57,117,239, 61,199,216,157,241,202,219, 27,154, 7,138,234,157,214,187,189,211,
-129,174,220, 94, 98,239,179,141,151,229, 8,103,214,229,176,234,112,216,129,112, 53,148,168,183, 53, 24, 51, 91, 29,119,237,192,
-201, 82, 68, 22,134,117,182, 24,157,182, 27,151, 64, 35,144,138, 77,160,167, 40,173,139,188, 8, 49,135, 88,117, 95,187, 61,107,
-136,216, 84, 0,193,138, 92, 84,227,168,118,108,159, 1,115, 20, 57,112,126,210,229, 20,141,124,149, 29,142, 2, 48,187,110, 42,
-182,123,140,102,146,165,115,180, 25, 93, 89,230,229,240, 52,157, 81, 98, 69,124,156,139,138,121,113, 23,126,237, 36,105,138, 4,
-158, 56,208, 72, 25, 9,217, 78,188, 36, 1,222,212, 8, 85,224, 50,206, 48,150,197, 82,233,115,185,142, 66,181, 7, 0,206,237,
- 12, 3,171,123,146,118, 42,204, 46,200, 72,169, 82,122, 79, 16,121,102, 10,202,131,188,109, 58,100, 42,123, 74,229,131, 61,213,
-197, 24,154, 38,234,130,148, 62,233,121, 42,180, 21,185,172,209, 73, 74, 33, 85,154,212, 84, 47,186,198, 12,177,172,227,240,225,
-123,233,103,123, 53,219,126,239, 44,194,151,224, 48, 83,247,213,151,254,155,207, 94,236,143,127,212,167,191,157,254, 98, 9, 49,
- 95, 10, 48, 2, 13, 43, 82,158,146,156,238, 64,159,214,233, 54,113, 28, 41,201,115,169,253,109, 13, 75, 29,248,107,202, 14,194,
-206, 18,187, 54, 35,232, 75,222, 21, 98, 53,134, 69,116,146,194,239,200,149,196,233,114,211, 51,227,216,199,189,147,136,232, 28,
- 13,121, 72,102, 12,111, 81,119, 87,249,245, 89,236, 30,138, 79,191,232,250,166, 25,199, 28,222, 32, 76, 12,135, 10,228, 76,113,
-122,252, 67,142,127,172,165,200,215,150,206, 41,185,142, 47, 83, 43, 45,217,198,205,193, 72, 80, 34,153,218,157,181,171,233,206,
- 1, 81,129,252,156, 57, 69,134,192, 83,227,146, 57,140, 55,234,192,107, 46,226, 68,179,110, 86,165,155, 97,105, 1, 78, 0,138,
-126,235,250,217, 72,255, 54,254,114,173,255,129, 52, 29,125,153,105,117,195,107,131,105, 13,182,142, 3, 71,162, 36,162, 96,179,
-250,133,147,131,249,164,175, 17,159,144, 81, 52, 8,183, 1, 35,221,172,122, 8,225,219,146,247,215,108,154, 94,231,225,151, 39,
-229,163,199, 71, 55,191, 6, 47,194,185, 65, 38,144, 20, 17,212,133, 22, 79,197,102, 54, 55,144,113, 76,120, 35,200,119,138, 98,
- 98,160,206,125,113,187,109,136, 92, 17,116, 11,186, 3,146,139,168, 88, 95, 62,121, 30,126,148, 31,127,253,201,183,223,191,243,
-195,119,229,197,211,103,200,200, 93,167,213, 92,105,209, 23,216,141,173,236,180, 13, 82, 56,169, 91,202,171, 39, 36,119, 29,210,
- 40,246, 65,120,172, 78,117,197,165, 37,107,218,120, 16, 42, 85, 5,206, 17, 70, 36, 81,203,185, 39,183,154,102, 15, 66, 9,244,
- 32, 67,150, 26, 57,178,157, 87, 17,102,137,211,208, 43, 71, 41,164,220,116,192,172, 55,238, 52, 34, 15,167, 27, 0,239,128, 4,
-143, 83,189, 94, 26, 68,187, 89,141,193,253,254,234,242,211,205,187,159,179,217,226,215,126, 95,154,198, 83,123, 59, 34,150,165,
-220, 91,215, 10,185, 96,215, 85,228, 62, 11,234,161, 1,119,103,188,140,126,192, 74,159, 98,186, 31, 0,203,108, 47, 90, 10,199,
- 70, 50,226, 79, 95,149, 4, 62,189,163,220,174, 92,183, 14, 16, 64, 83,172,195, 89,139,163,161, 99,138,245,129,205,121, 65,188,
-217,134,238,237, 71,254,253, 15,250,195, 75,253,111,209,242,202, 2,148, 25,114,154, 90, 39,101,162,234,192, 29,118,202,167, 16,
-109,236,121, 49,195,174,127, 15,108,102,144,170, 60, 62, 62,216, 64,228, 10, 86,190, 90, 22,191, 88,176, 18,142, 21, 78,132, 88,
- 65, 35, 57,208, 0,228, 93, 47, 59,151,214, 65,149,101,172,143, 6,255, 39, 30,167,220,202,166, 51, 74, 46,102,105,164,191,222,
-239,254, 46,229,121, 1,252, 76, 49, 33,172, 75, 94,215, 22,176,133,245,254,144, 24, 77,240,143, 56,143, 5, 71,244,104,170, 7,
-176,197,182, 48, 44,130,176, 61, 3,207,110,133,154,139, 97,137,166,208,131,205,177,179, 20,220,230, 76, 29,205,208,128,245, 84,
-208,175,109,130, 2,251,184, 49,212, 0,196,185, 94, 0,175,197,189,240, 56, 34,122,209,150, 78,176,133, 35, 15,151,162,205,217,
- 59,132,175,134,237,245,120, 67,123,175,150,146,254, 65,138,167, 7,195,152, 64,125,117, 51,171, 22, 15, 54, 93,226, 67,100,124,
-215,228,124,174,120, 79,229, 8,218,209,138,201,165,150,126,124,211,255, 2,112,116,109, 43,114, 84, 81,244, 92,235,218,149,238,
-233,196, 27, 24, 39, 68,133,128, 35, 8,190,120, 65,130, 31,224,139, 63, 45,232,147, 72, 30,124,144, 6, 13, 73,196, 76,167, 47,
- 85,117,234, 92,170,142,107,213,203, 76, 51, 52, 61,213,167,206,217,123,173,218,123,175,165,159,255,244, 93,163,111,182, 55, 59,
- 75,149,232, 40,186,178,166,204,120, 2, 57, 54,198,143, 93, 83,201,178,161,254,125, 77,115, 73,156, 86,128, 81, 91, 36, 64,205,
- 58, 20,165,168,192, 24,246, 31, 60,126,115, 40, 94,252,114,158,217,119, 65,249, 20,192,201,113,157, 0,108,137, 16, 83,140, 86,
-128,158,225,220, 35,134,128,191,123,133, 93,136, 3,135, 44,195,118, 20,214, 48, 0,148, 44,253,228,139,233,191,215, 20, 43,154,
- 76,184,130,154, 6,234, 70, 97,171,196,224,176, 7, 35,117,116, 64,185,245,160, 38, 90, 33,208, 33, 41, 35,146, 30, 19, 2,147,
-212, 52, 44, 34,217, 71,104,187, 7, 19,167, 94, 59,162, 48, 34, 95,233,104,235,161,215, 57, 90, 91,179, 63, 23, 0,131, 37, 2,
-189,176, 37, 72,172,229,210, 13, 29,121, 52,150,168, 3, 63,161,158,120,202, 5, 45,106,240, 91,174,120,151,167,143,130, 42,216,
- 87,156, 46, 24,216,215,191,176, 21,140,207,224,215, 97, 99,133,127, 8,180,136,171,192, 23, 94, 0, 93,105, 49,193, 80,140, 24,
- 4, 90, 38, 89, 79,171,117, 55, 87, 59,253,228, 89,253,215,171,253,241,126,114,206,134,114,255,197,227,246,231, 31,199,231,223,
-255, 91,218, 23,151, 63, 14,151,151, 41, 58,229,174,201,189, 19,180,151, 65,222,191,204,203, 73,176,137, 97, 38,239, 66,252,137,
- 67,158, 6, 16,178,213, 66, 29,239, 9, 57,227, 76,122,113,245, 75, 51, 35,112,208, 49,117,117,174, 33, 84,167,168, 58,149,141,
-217, 27, 19, 4,135, 84,217,250, 45, 41,189, 23,184, 82,171,177,149, 21,103,164,144, 4,162,176,252,112,103, 30,222, 54,227, 38,
-201, 71,186,227,180,180, 44,106,203,138,115, 57,171, 13, 64, 9,189,175,129,214, 88,160,101, 42,230,248, 60, 9,126, 46,176,222,
- 96,118,226,104,248, 34,136, 56, 74, 61,186,233,194, 70, 58,217, 83,115,102,117, 79,227,101, 51,163, 79,192, 99,113, 26, 36,214,
-135,178, 4, 37, 21,245, 21,110, 80, 39,171, 90, 60,252,230,219, 87,221,238,248,238,144, 89,178, 22,105,192,251, 98, 28,221,160,
-170, 18,244,139,211,144,160,212,184,234, 57,205, 83,129,207, 44,226,228,216,203,135, 91, 70, 49, 58,156, 63, 28,210, 27,166, 11,
- 32,222, 92,205,133,201,174,214,103, 71, 6,246,242, 42,159,126,190,249,196,247,103, 69,207, 39,234, 24,210,104,130,254,136, 88,
- 80,108,204,165,208,180,231, 5,244,218,209, 44, 15,199,140,141, 96,195,250,184,128,182, 44, 72, 97, 89,183,244,208, 83,220, 97,
-100, 48, 23, 28,218, 55,238,253,103,237,167, 95,127,244,246,212,189, 61, 93,203,141,227,195, 40, 36,175,202, 70, 90,153, 82,138,
- 52, 37,142, 16, 34, 97,120, 89,231,106, 50, 0,239, 17, 31,106,128,154,194,162,103,103,249,152, 76, 98,235,243,169, 56,117,237,
-173, 40, 39,121, 50, 37,101,131, 19, 43,184,160, 98, 81,184,156,219, 94, 75, 89,235, 42, 33, 43, 53, 58,109, 26, 3,248, 95, 86,
-128,228,139,159, 53,197,123, 40,174,174,198, 56,208, 38, 11,175, 2,123, 89, 39, 96,145,215,163,223,154, 15, 63,246,247,174, 31,
- 84,172,229, 98, 3,141,169, 37, 22,215, 19, 27,169, 50,207,195,213, 78,137, 78,118,177,119,184,122,211,103,226, 37,234, 34, 1,
- 83,227,216,235, 97,194,162, 71,142,128, 47,154, 26,212,200, 10,125, 44, 0,142,172,106,240,211,167,170,192,126, 83, 37,139, 52,
- 37,226, 7,160, 67,179,221,188,119,251,196,220,125,117,220,110,166, 49,198, 30, 24,236,140, 93,221,183, 97, 85,110,181,217,180,
-159, 61,106, 66,248,149,200,102, 81,227,201,103, 11,150,111,196,176, 20,116, 15,203, 20,118,149,114, 53,145, 19, 28,165, 29,192,
- 35, 2,107,173,188,113, 5,101,241, 28, 85,165, 83, 67,178,190,106,221,178,244,226,253,151,127,159,255, 49,203, 64, 3, 3, 32,
- 67, 5, 4, 52, 91,185,189,221, 99, 71, 30,112,202, 52,226,200,182, 0,164,156,189, 36,145,244,171, 80, 67, 69,119, 58, 49, 84,
- 2,200,173, 77,134, 34,227,138, 86,135,188,251, 84,249,194,183, 7, 70,198,162, 2,159,211, 74,130,198, 44,202,234,230,183,195,
-221,239,253,159, 15,118,237, 34,144, 19,130, 24, 99,200,171,222,143,164, 70,155,143, 0,176, 14,127, 65, 64, 80,200, 42,136, 75,
-201,177,159,244,228, 85,196,151,205,233, 65,205,123, 2, 26, 14,158,235, 40,203,140,128, 56, 37,178,138, 37, 42, 53, 56,211, 82,
- 41,177,155, 47, 51, 80, 84, 1,154,176,236, 55, 23,145,251,150,202, 83,128, 51,178,165,144, 21,219,123,254, 23,128,164,107,203,
-113,163,138,130,221,247,217,221,110, 63,198, 26, 17, 41, 72,188, 18, 69, 12,154, 72, 68,249, 69, 44,130, 21,176, 0, 86,195, 46,
- 88, 0, 75, 96, 19, 8, 34, 2, 34,146, 19,152,145,219,238,199,125, 83,213,124,249,195, 86,187,221,190,247,156,170,123,206,169,
- 82,135,219, 39,213, 25,104,221, 53, 55,242, 86, 31,240,181,155,188, 47,246,182,218, 0, 0,167,143,132,161, 5,130,193, 6, 26,
-129, 61,139,235, 64, 82,119, 64, 23,220,155, 98,155,172,179, 28, 99, 9, 47,239, 55,119, 82,159, 18,104, 53, 96,133,235,215, 71,
- 63,208,236,192, 32,110, 34,132,238, 37, 79,167,182,158,216, 69,113,178, 66, 88, 10,189,176,227, 98, 85, 58,209, 28, 62, 5, 97,
-118,197, 91,100, 46,192,130,121, 32, 22,165,230,213, 20,172, 41,241, 95,214,187, 82,246, 99,246, 29,200,223,185,234, 31, 37,112,
-219, 76,242, 38,242, 34,253, 34, 41, 10,135,144, 90,240,143,164, 6, 47,142, 29,208,129,158,191,128, 39,180,133,119, 88,184, 88,
-133,154,126,136,116, 45,102,135,195,122, 36, 79,153, 41,160, 48, 50, 10,187, 80,147,154, 85, 38, 25,176,125, 72,164, 98,168, 56,
-145, 48,215,190,208,252, 58,226,182, 85,108, 35,146, 45,242,144,197, 35, 5, 61,213, 72, 57, 34,130, 73, 15,248, 3,216,208, 79,
- 7, 58,240,114,172, 37,208, 68,202,203,128,199,167,176,245,214,247,211,233, 82,189,120,255,205,171,207, 77,121,209,152,241,229,
-221,245,235,251,119, 85,245,187,251,235,159,233,239,235,124, 90,135, 2, 23, 15, 22,226,176,149, 23,144, 4,121, 94,234, 25,123,
-148, 6, 76,165,126, 20,142,106,211,108, 59,115, 96,205,108, 52,164, 83,236,234, 0, 83, 93,231,234,242,255,232, 38,229,208,216,
-225, 78,233, 93,201, 83, 66,206,239, 84,156,215,232, 86,234, 61,149,106, 94, 37, 18,137,243,233,219,195, 58,213,148,243, 39, 95,
-138,207,190,221,231, 67,109, 64, 27,241, 45,237,162,123, 78,167, 17,199,170, 8, 72,131, 31,136,168,150,181,169,120,160, 45,217,
-106, 78, 27,148, 40,103, 54,189, 11,170,116,208,235,130,138,187, 62,249,169,114,154, 99, 16,184, 62,208, 57, 47,129,165, 27, 66,
- 94,128,167,103,214, 48, 74,213, 52,136,248,188, 12,146, 5,201, 68,155,236, 94,229,155,227,251, 15, 69,121,124,182, 3, 54,242,
- 8,127,193, 92, 70,154,152, 57,218, 5, 77, 89,107, 5,196, 50, 48,239,123,234, 91,135,141,166,187, 30, 82,184,199,111, 89, 88,
-135, 4,159, 3,140,212,212, 70,100,167,143, 31,189,161, 61,144, 30,243,248,118,218,190,110, 14,246,122, 70, 96, 93,235,120, 37,
- 32, 83, 4,205, 59, 26, 74,254,116,117,103,188,224,206, 45,149, 39,212,218,102, 67, 81,155,148, 65,204, 17, 84, 67,170,215,162,
- 48,115,102, 66,228, 17,106, 12,195,187, 63,229,207,243,211,239,238,190,255,225,201, 79, 63, 62,255,245,183, 63,184,165,122,121,
- 4,146, 0,137, 2, 60,105, 27, 99, 29,182,175,103, 23, 53, 94,218,201,106, 10, 40,179, 13,163, 6, 98,163, 55,164,177,196,133,
-158,165, 22, 73, 39,113,160,116,167,221,160,229, 49, 39, 51, 86,147,110, 26,107, 90, 23,146,154, 74,109,229,220,157,235,216,214,
- 88, 11,101, 46,209,224,121,134,166,223, 10,176,140, 88,143,128,217, 26,155, 14, 32,162,201,233, 34,219,157,124, 16,198, 92,210,
-245, 77,222,222, 31,159,153,211, 47,244, 74,235, 55,118, 96, 33, 84,177,132, 35,169, 14, 20,146,105,206,100, 41,215, 60,177, 1,
- 2,172, 23, 12, 50,215, 15,124, 82,215, 52,213,209,181,181, 15, 20, 0, 65,186,167,246,156, 23,235,108, 56, 23, 19,235, 64,156,
-198, 66,190, 1,215, 67,168,145,170,123,154, 55,182,189,125,246, 92,125,241,213,195,238,144,166, 15, 34, 4, 68, 2, 32, 69, 60,
-224, 22,113,123,208,117,119,242,145,102,242, 74, 52, 46,227,205,177, 61,178,215, 56,178, 95,135,240,140, 14,112, 85, 92, 11,253,
-244,219,210,236,111,163, 8, 26,123,224, 18,253,133,232,220, 72,247, 68,220,135, 17,100, 45,224,118, 66,187,195,219,235,126,201,
-111, 84,217, 7, 68,158, 66, 25,245, 49,199,143,101,223,201, 71,150, 61, 25,145, 34,168, 33,165, 99,177, 26,219, 4,230,192,146,
- 56, 5, 52, 12, 91, 69,228,186, 63,128, 11, 89,120,143,212, 15,209, 78, 42, 75, 69, 63,176, 99,132,113, 79, 48,206,115,105,112,
-157, 38, 33,152,244, 90,238,132,158, 66,228, 5,110, 34, 37, 58, 75,227, 6, 60,174,102,215, 44,141,116, 59,177,157,253, 50,212,
-236, 5,138,158, 77,134, 11, 62,148,228,152,194,102, 4,119, 0, 21, 69,108,141, 60, 0,162, 17,116,106, 91,166, 30, 26,176,224,
- 46, 41, 57,233,167,125,154,203,118,235,130,136,203,210, 34, 78,116,243, 82,225, 99,139, 74, 45, 48,241, 40,106, 37,254, 19,128,
-165,107, 91,145,163,138,162,117,110,117,233,211,213,157,201,196, 97, 28, 34, 4, 12, 33, 16,112, 30,196, 7, 5, 17,191, 64,255,
-210,111,208,143,136,224, 75, 4,209,135,136,195,152, 75, 79, 95,170,171,234,220, 93,171,240,117, 24,250, 86,251,172,189,214,217,
-123,175,173,126,248,241,123,179, 6,164,218, 26,144,177,185, 0,238, 7,219,202,205,178,160,174,110, 55, 74, 58,219,244, 16,174,
-218,244,136,101,218,180,196, 30,105,167, 3,172, 75, 99,204,132, 76, 39,188,237,174,182, 63,255, 20,223,229,242, 68,226,119,135,
-120, 91,122,144,121,171, 27,107, 14, 66,112,181,223,160,185, 46,167,107, 41,232,229, 10, 12, 33,115, 70,210,178,179, 2, 25,149,
-183, 82,221,180,123,136, 39, 8,121,139,215,244,238, 36, 32,214, 38,181,216,230, 59,207,237,201,178,222,145, 31,206, 51,231,221,
- 89,163,167, 21, 26,112,132, 14, 39,220,223,104, 68, 55,208, 2,201,184, 82,101,162, 58,222, 89,140,185, 57,240, 50, 2,159,164,
-216,210, 69,208, 45,165, 70, 67,159,241, 53, 96, 5,188, 35, 54, 27,201,229,104, 29, 13,193, 20, 16,161, 46,248,105,217,152, 97,
-105,237,157, 99,170,217,163,193,238,137,165,207,117,217,224,129,183, 62, 39,240, 18, 98, 40,190,221,145,253,184,248,221,171, 81,
-144, 1,113, 68, 11,193, 86,106, 43, 34,132, 58, 13,250,185, 43,205, 92,177,106, 8, 96,220, 92,168,155,103,251, 47,191,184,187,
-125,245,215,245, 39,127,150,251,223,247,111, 62, 30,238,231,121, 39,170, 41,129, 55, 1,222,231,161,248, 7,154,155,141, 31, 76,
-216,199,121,200, 9, 26, 6, 16, 3,109, 52, 2,222, 20,160, 15, 40, 6,248, 28, 2,111, 62,129, 52,187,153,205, 31,157, 42,224,
-116, 32,161, 28,139,243, 8, 10, 86,129,212,114, 63,238,151, 1,209, 81, 47,171, 77, 25,202, 84, 33,146,174,218,236, 5,120,127,
-206,143,183,213,183, 95,117,226,162, 38, 65,177,108,188,171, 87, 53,141, 43, 58,154,126,165, 22,255,165,169,249,219,165, 34, 88,
- 90,240,203,255, 51, 68,106,112,184,128,231,137, 86, 4, 25,112, 26,134,148, 38, 54, 65, 24,135, 3, 20,112,180,124, 84,113, 86,
-236,232,163,139,149, 86, 97, 18, 35,200, 52, 71,224,198,165, 76,235,219,130,131,217,137,242,232,249,147,230,213,215,175,119,239,
-116, 89,104,117, 56,206,156,159,193,209, 63,211,176,105,226, 70, 82,136, 54, 14, 68, 20, 14,148, 53,136,122, 58, 95,120, 86,143,
-185,108, 90,225, 88,177,113,125,233,154, 71,112, 39, 73, 55,172,170,112,195, 60,235, 44,222, 29,242,246,155,151, 27,125,222,129,
- 11,211, 93,132, 39, 24,137,128,183,174,224,140, 18, 60,113,143,151, 98, 57,184, 28, 43,211,136,197, 3,183, 98, 25,169,139,164,
-140,108,177, 82, 28, 21,109,232,122,178,220, 91, 20,117, 70,178, 25,243, 91,177,121,174,111,191,187,158, 31,204,135,127,102, 14,
-200,174, 68, 5, 42, 25,120, 89,139, 35,133,124,168,154, 70,172,184, 72, 41,178, 37,169, 24,239,237,170,119,185, 29, 1, 89,220,
- 17, 1, 4,160,125, 1,242, 48,159,171,234,160, 49, 29, 21,134, 8, 13,178, 68,131,111,147, 91,160, 2,248,151,209, 29, 73, 83,
- 17,101, 96,185,197,172, 52,131,150,203, 36,245,164,181, 5,227,115,217,180,146, 53,117, 4,103,179, 20, 93, 27,147,255,245,243,
-229,227, 23, 91,121,183, 63,236,161, 40,144,182, 82,140, 93,150,222,249, 50, 74,136, 21, 60, 67,238,107,116, 37,156,106, 94, 18,
-202, 82, 31, 85, 96,129, 60, 32,105,131,123,121,200,132, 40,195, 80, 13, 44,215,227,224, 48, 83,176, 63, 46, 20, 53,196,253,186,
-166, 17,190, 21,237,117,174,215,177,223,182,219,155,207,253,139,219,177,235,163,219, 81,148,139,116, 94, 77, 33,110,147,171, 32,
- 36,131,150, 73, 30,252,112,249,244, 51,196,239,111, 46,173, 1,123,248, 59, 93,109,184,237,144,173, 41,138,227,120, 75,183,128,
-206,213,177, 74, 58, 72,189,169,122,132,166,205, 30,228,197,131,123,148,236, 19, 13, 96, 91,110, 2,108, 71, 9, 65, 34,111,222,
-220, 95, 28, 78,127,116,117,155,128,206,102,164, 44,243,227,229,167, 47,175,218,215,147,251,187,156,145,248, 35,203,115,138,108,
-165, 24,164, 87,132, 72, 95, 42,171,233, 66,199,166, 1, 53,235, 98,193, 3,184, 17,171, 94,172,112,104,137, 1,165,213, 80,196,
- 43,181, 22,237, 35,178,184,248,209,164,167,191,252,250,236,206,189,237,154, 85,117, 65,139, 20, 58,203,121, 83,217, 26,212, 16,
-100, 30,138,102, 0,121,111,160, 53,115, 46, 33,227,228,144, 7,114,161,138,117, 76, 41,188, 56,165,239,156,230, 66, 40, 46, 51,
-224,128, 84,156,102, 8,110, 51,197,188, 22,206,177,165, 28,135, 1,143,205, 26,174, 53, 79,199, 34, 90, 19,149,239,251, 38,156,
-232,113,102,130,156, 76,253,159, 0, 36, 93,201,142, 28, 69, 16,205,202,172, 92,106, 27,106, 4,163, 81, 31,176,100,131,145, 44,
-115, 65,226,140,144,143,240, 3,124, 38,127,225,187,205, 9, 16,139,125, 64,150, 60,118,119, 85,117,109,185,249,189,226, 54, 61,
-106, 85,103,102,101, 70,188,200,136,120, 79,253,252,203, 79,123,217, 57, 0,160,210, 8,219, 87, 50,116,136,213,109,190, 85,171,
-147,182,113,134, 2, 71,187, 32, 89, 68, 64,204,170,181, 69,196, 2,128, 79, 24,110, 42,196,196,132,195,251,233,171, 83,250,152,
-222,188, 94, 22,178,227,194,193, 98, 58,124, 11, 3,211,119,148,210,150, 55, 92, 39, 71, 63, 40,139,100, 74,167, 14,237, 16,137,
-192, 84, 51,177,169, 73, 18, 41,175,239,103,216,139, 13, 47, 50, 15,235, 24,217,185,182,248, 17,163, 73,113,155, 97,245,150, 24,
-243,204, 52, 71, 36,235, 52,217, 18, 69, 58,199,163, 30, 28,251, 76, 75,108,188, 15,137,229, 31,129,181, 74, 86, 25, 60, 73,147,
-138, 47,178, 35, 97, 44,112,206,177, 22, 23, 43, 2,124, 64, 37, 96,195,200,204,153,149, 91,179, 1,216,236, 73, 55,227,173, 80,
-142,177, 94, 96,242, 49,185, 18, 79,194,188, 5, 76, 62,162, 48,236,170,220, 86,210,242,122, 32,112, 19, 32,230, 3,134,137,100,
-180,108, 41,201,132,112,141, 53,148,155,102, 97,174,101, 15,189,184, 8, 29, 14, 46,181,141, 14, 30,145, 52,239, 35,211,238,215,
- 7, 63,190,191,254,247, 48,255, 61, 61,252,187,108, 15, 34,108, 33,124,240,192,101,227, 36, 23, 56,148, 75, 8,163,220, 49, 45,
- 31, 61,133, 9,165, 28, 41,228, 82,172, 49, 94, 4,249,180, 54,234,241,238,163,164,170, 22, 75,239,153,237,135, 85, 88,118, 88,
- 98, 50,102, 97,191, 18,183, 35,220, 73, 24, 5,173,176,162,177,160,113,183,136,241, 9,106,115,201, 68, 82, 49, 9, 18,228, 12,
- 54,191,248,209, 60,122, 82, 45,172, 43, 84,170,147,250,255,219, 24,184, 15, 27,149, 74,101,195, 41,241, 57, 36,227, 38, 17, 26,
-115,130, 18,232, 99, 75, 11,175,239,177, 98, 30,126,253,188,199,107,193, 16,155,194,175, 42,206,145, 20,146, 87, 22,170, 48, 87,
-114,222,236,138, 80, 56, 59,124,119,161,235,173,241, 56,234,112,145, 23,161,114,185,145,226,254,219, 39,255,220,125,247,238,205,
-171,224,153, 97,159, 86, 44,116, 96,165, 4, 75, 25,225,206,125,128,111, 38,242,137, 84, 96,228, 77, 74, 92, 23, 15,176,193,219,
-112, 28, 51,210,141, 30,210,104, 21,237,218,173, 18, 94, 83,184, 11, 14, 31, 0,221,241,154, 53,255,245,209,221, 61,174,159,230,
- 48, 45, 3,118, 96,212,120, 67,212, 58,230,128,216,250,176, 28, 66, 79,228,218,200, 36,173, 56, 72,164, 13, 19, 76,148, 66,103,
-122, 25,203,152,117, 76,218,102, 67,153, 1,133,241,179,107, 2,230,117, 26,252,187,169,121, 84,126,243,253,157,182,167, 63,254,
- 4,218,155,116,143,160,174,149, 77,208, 71,110, 42,119, 14,112, 89, 71, 50,238,193,128,152, 5,187, 2,187,142, 87,229,252,117,
- 4,111,218, 93,173,221, 96,119,123,140,218, 89,196,132, 37, 70, 89, 81, 2,174,232,182, 50,110, 38, 24, 32,196, 21,110,219,144,
- 74,109,146,182,168,200,197,167, 15,186,254,173,110,123, 4, 44,125,206, 83,114, 88,184,196,250, 79, 32,115,132, 25, 89,173,182,
-137,227,162, 67,245,244, 62, 13,191,189,237, 28,207, 14,166,118,193,250,172,179,173,212,114, 52,192,233, 49,176, 46, 10,115,220,
-243,138, 87, 55,230,171, 36, 35, 90, 62,211,237,176,168,157, 18, 5,240, 37,145,242,112,128,168,107,134,137, 87, 83,190,205,101,
-184, 49,206,132,214,101,213,200,246, 70,125,254,229,215,246,241,179,161,239,137, 61, 5, 64,234, 30,140, 39, 96, 94,181,178, 41,
-150,139,169,174,102,246,215,185, 57,125,113,223,233,183,251, 36,120,171,206,142,102, 3, 35, 18,125, 47,152,180, 48, 0,154,216,
- 40, 33,212, 26, 91,209,104, 30, 52,138,134, 33,176, 15, 97, 7,150, 97,141, 91,174, 43,158,216, 50,150,237,166, 6, 64,205,231,
-175, 1,142,242, 16, 24,110,178, 47, 5, 31,132,219, 78,245,243, 59,249,146, 61,118,233,150,245,185, 52, 59,178, 28, 18, 11,101,
- 82, 69,105, 78,152,252,242,160,156, 43,200, 91,143,181, 47, 2, 55,131,136, 76,174, 33,102,165, 94,231,134,127,125,166, 42,205,
- 70,200,172,116,189,151,251, 15,191,254, 46,231,130, 50,203,149,181, 97,233, 0, 10,186,163, 16, 60, 88,134,168,192,121,248,227,
-200, 61,203,218,183, 88, 69,129, 57,121, 50,255,250,180,193,248,196,134, 39,140,162, 56, 55,170,241, 69,115,166, 16,115, 73, 29,
-161,108,216,236,161,212, 32,210,190,215,108, 7, 38,164,207, 53,155, 1,237,129,210, 92, 13, 59,177,235,218,181,102, 55,198,127,
- 18,128,164,171,231,145,163,136,130,253, 53, 51,221, 51,251,113,103, 29, 50, 50,248, 32,176, 28,216, 58, 57, 32, 65,164, 68,132,
-132,252, 80, 2,255, 4, 7, 36, 72, 16,155, 0,163,131, 91,237,221,238, 78, 79,119, 79,119, 15, 85,227, 96,131,213, 74,171,221,
-254,120,175,234, 77,189,122,250,231, 95,126,234,212,246,106,167, 45,194,225, 54,153,194,185, 77, 91,159,129,105,249, 32, 75, 3,
-227,210, 59,180,179,192,100,138, 79, 30,116, 29,196,136,236,183, 40,125, 74,100,179,142,222,106,210,109,118,242,195,175,159, 91,
-102, 16, 42,177,253,101, 35,152,140,232,241, 32,244,126,163,173,151, 61, 34,181,193,111,108,236, 42,201,219, 84, 78, 38, 2, 82,
- 30,250,214,181,151,127,198,120, 31, 90,101,107,170,211, 17, 91, 77,121, 93, 1, 21,194,138, 31,106, 12,134,118,122, 65,197, 64,
-250,127, 57,200, 56,139,167, 57,167, 39,225,113,247, 78,153,149,221,137, 49,171,195, 57,139, 28,254,136, 47,166, 79,190, 37,123,
- 91, 12,189,218,232,248,197, 14,246,106, 51,141, 18,150,200,169,143,242,166,145, 65,153, 45,253, 29,244,156, 57, 20, 52, 2,132,
- 36,164,133, 85,210, 10,116, 89,151,136,168,109,216,159, 12, 6, 29, 89,129, 7,130,166, 30, 18,249,195,207,200, 36,136,186,149,
-131,157, 4,246,198,176,212, 81,169,186,152, 5, 64,107,183, 86, 77, 5,191,152, 83, 44, 34, 79,204,160,211, 82,142,117,186,175,
-135,143,179, 63,198, 57,149,120, 42,113,228, 68, 25,138,125,113, 79,206, 73,165, 60,202,213, 92,225, 92,167, 32, 89, 28, 70, 54,
-194, 25,155,169,125,153, 40,143,209,235,140, 39,240, 72,188, 16,119,214,102, 28, 67, 63, 51,234, 4,193,246,215, 9,130,102, 53,
-134, 65,168,103, 62, 2,212,209, 98, 84,212, 53, 93, 89, 49, 10, 1,192,191,167, 69, 19, 34,115,189,123,165,191,127,183,125, 68,
- 6,186,146,205, 78,181,125,117,157, 49,142,102,164,180, 57,161, 71, 21,235, 48,166,163,201,165,164,255,221,106, 57, 33,203, 50,
- 45, 53, 52,216, 25,100,121,186,161, 22, 44,135,158, 75,204,167,154, 79,237,146,202,236,169, 53, 89,130, 25,159, 50,189, 85,165,
- 9, 97,206,143, 64, 38,146,243, 71, 9, 88,232, 7,128,252, 19,122, 33,158, 55, 47,222,125,247, 91, 6,209, 64, 78, 64,156, 75,
- 7,106,237,114, 98,119, 25,109,144, 47, 19, 9,161,207, 26,231,187,178,127, 6,111,153,239,216,182, 49,203,186,227, 8, 83, 61,
-139, 58,177,105,118, 66,246, 5,217, 37, 44,199, 53,196, 30,184,207, 55, 56, 93, 66, 82,250,205, 87,110,240, 99, 52,180, 24,106,
-176,136,189, 17, 44,226,243,190, 19,176,203,213,210,158, 25,177, 84, 83,216, 58,133,136,235,165,104,217, 86,179,150,241, 40,162,
- 43,177,208, 92, 99, 29,108, 2,198,168, 57, 96, 54,196,135,203,112,173, 94,190,189,249,226,197,238,120, 16,255, 6,240, 93,240,
-244,138, 35,159,232,157,168,117, 80, 3,119,141,226,173,105,183,139, 78,113, 48, 87, 28,230,237,226, 1,208, 91,179, 21,102, 67,
-167, 76, 28,216, 58,232, 49,182, 0, 55,224,169,117,232, 41,239,182,197, 38, 15,144,130, 37,162, 4, 16, 33,201,247,216, 99,128,
- 56,172, 89,172,113, 10,116,172,142,192,208,226, 84, 59, 66,140,176,178,114,228,164,104, 47, 60,188,141,218,188,122, 38,252,159,
-191,203,235, 1, 31,186, 51,184,248,194,198,226, 80,218,113, 41,115,148, 23,153,232,234, 21, 82,168,109,136,211,200, 46,182, 26,
-229,164, 42, 91,209,193,220,244, 82,103,146, 93,122, 29, 22,213, 12,133,147,165,116,189,236,141,123,169, 54,123, 5,254,103,246,
- 55,207,190,249,214,222,253,232,251,141, 80, 15,117, 57,211, 25, 81, 48,161,184,100, 1,181,146, 4, 57,165,195,108,240,226,184,
-156,190,190,125,125, 61, 28,198,251,255,100, 30,180, 5, 93,136,226,156,169,112,154, 65,174,241,227,156,192,142,135,110,193,125,
-126,212,130,102, 65,113,141,185,236, 51,213, 93,159, 59,250, 49,131,165,224,158,227,188,216,242,229,223, 79,119, 31, 31,254,160,
- 53,188,217, 0, 14,197,100, 41,108,235,197,173,189,117,234, 67, 70,174, 2,189,244, 53, 63, 26,246, 84,116, 8, 92,244, 50,164,
- 22,147, 78, 76,107,253,205, 74, 25, 22, 67, 73,175, 32,130,176, 45,221,126,145, 23, 56,220,110, 15, 6,199,158,169,206,232,206,
-244,250, 83,253,244,195,251,191, 46, 97,119,210,206, 53,162, 75,201,173,242,239,228,189, 93, 71,104,116,179,232, 23, 71, 33, 46,
- 34,249, 90, 42,101,254, 36,197, 22,198,217, 94,103, 14,110, 99,117, 24,127,136, 18, 17, 57,239,212,232,116,227,250, 66,137, 67,
- 2,112,203, 55, 58,239,219, 38, 48,191, 22,112, 52,154,186,105,229, 3,231, 55,101, 96,156,142, 15,195, 82, 14,177,251, 95, 0,
-146,174,165, 69,174, 42, 12,222,243,188,143,126, 50, 73,154, 33,138,232,194,160, 46, 92, 8, 17, 65,112,239, 47,200, 58, 63, 52,
-219, 44, 69, 20, 4, 65, 37, 4, 92,152, 48, 51, 61, 61,247,113,222,199,170, 59,251,105,250,222,233,239, 81,117,206,247, 85,169,
-159, 95,191, 2, 62,180,205,100, 41, 26,183, 67,121, 68,176,128, 57,135, 62,210,216,128,107,188, 49,107,242, 3,186, 77,168,121,
- 27, 45,231,198, 12, 64, 12,222,138,114,119, 60, 20,247, 66, 63,121,113, 53,143,229,159,191,106,211, 38,125, 0,140,111, 29, 79,
-206,236,208,148,161, 11,173, 78,180, 50,176,202,182,104, 86,138, 14,194,134,246,218,121, 39,192,200,237,182,220,207, 15, 55, 81,
- 71,180, 2, 35,202, 50, 45, 14,108,133, 83,101, 3, 2,125, 68,102,130, 94, 0,249,102, 74,150,210,209, 19,184,209,102, 80, 86,
-124, 25,160,135, 44, 46,243,176, 62, 52, 14, 52, 51, 36,125,163,229,145, 10,111,160,146,113, 43,204, 72,151,208,210, 1, 1, 20,
- 79, 35, 20,218,120, 73, 67,213, 57, 10, 69, 86,174,233, 71,139, 90,133,144,165,141, 36, 23, 91,135,202,147, 59,199,235, 71, 80,
- 78,227,189,209,168,101,224, 61,146, 19,220, 36,189,162, 2,112, 61, 42,183, 59, 52, 41, 36, 34, 42, 56,254, 31,188,130, 66,202,
-115, 78,173,162, 19,138,189,229,149,126,162,225, 31, 85,247,253,232,155,121,185,164, 24,111,151,243,153, 10,209, 2,229, 28,165,
-107, 4,190, 19,206,215, 52,115,245, 62, 68,212,113,252, 53,170, 31, 96,105, 93, 80, 21, 29,215, 10, 19,192, 28,114,239, 54, 93,
-178, 58, 52,114, 9, 28, 78, 3,212,154, 11, 72,172,158,168, 1, 73, 53, 71, 20,117,122, 52, 36,206,182, 78,171,110, 47,208,114,
-175, 27,144, 50, 10, 66, 41, 1, 20,153,128,173, 40, 50,161, 71, 89,223,159,203,245, 81,252,240,114, 95,158,119, 40, 16,253,174,
-161,230, 98,167, 41, 62, 63,100, 18, 16,238, 1, 3, 41, 10,178, 46, 4, 35,210,145, 50,124,122, 29, 62,246, 25,120, 71,177,168,
-217, 73, 70,190,129, 73,196,236,177,128,249, 18, 56, 6,166,241, 3,187,136, 71, 96,128,160,204, 40,250, 1,137,202, 36, 10,188,
- 6,232,181,112,171,173,246,112,212, 87,159,234,237,247, 63,253,234,238,207,255, 93, 86, 81,136, 75, 4,236,158, 28, 94, 31, 17,
-149, 65,190,192,130,134,101, 89,240, 21, 30,152,122,193,243,241,170,141, 71, 41,174,165, 15, 32,237, 41, 1, 84,119,192,196,154,
-136,175,172,162,227, 8,140, 1, 88, 27,185, 26,209,249,208,242,239,230,244,244,250,240,141,149,227,244, 64, 57, 49,188, 19, 93,
-253, 42, 69,144, 12, 29,183, 57,151, 14, 46,227,233,137,208,160,172,187,226, 99, 45, 27, 41,121,187, 83, 52, 18,212,160,116, 10,
-121, 32, 7, 66,205,227,175,223, 19,238,160,233, 38, 23,226,195,184,209,229,244,229,179,231,159,237,223,253,209,244, 55,119, 45,
- 58,229, 94,154,100,142,253,114,191, 30,148,160, 29,241,196, 86,147, 28, 9,103,181,208,136,207,180, 52,129,227, 89, 42,247,109,
-105, 5,205,144,221, 94,136, 77, 95, 16,115,125,201,201,101,149, 90, 49, 43,223, 27,137, 42, 55,115,198,149,139,121,214, 33,101,
- 19, 16,153, 68, 71, 90,135, 4,240,211, 79, 41,213,214,208,185, 49,200, 71,241, 11,116,197, 75, 62,171,120,252,246,106, 25,127,
-251, 19, 29,155,123, 98,137,174, 39,202, 91,237,204, 44,212, 45,114,135,235, 3,217, 44, 96,133,197, 7, 77, 17,158, 57,139, 49,
-115,237,193,112, 13,168, 6,138,249, 51, 34,206,200,156, 70,245, 98, 90, 68,127, 20, 93, 84, 79,246, 82,132, 54, 41,125,250,234,
-197,230,139,239,110,158,245,193,255,171, 24,233,120, 48,112,100, 4,249,148,186,224, 56,235, 53, 10,211, 70, 39,132,245, 41,120,
- 19, 78,159, 92,159,178,127,239, 57,107, 73,209,120, 13,136, 54,208,157,132, 14, 84, 1,248, 51,180,116, 69,112, 40, 33,205, 21,
- 74,161, 40,214, 36,142,181,131, 52, 15,188, 0,229,160, 10,239, 70,180, 95,106,247,242,247, 15,203,199,240,119,208, 9,239, 85,
-235,185, 3,180,137, 40, 89,245,243,211,215,157,248,101,190,171,154,100, 18,237,108,135,104, 68, 11, 7, 16,231, 37,109, 75,143,
-205,102, 21,144, 69, 89, 80,155, 85,215, 76,148,230, 17, 69, 37,222, 8,168,186, 41,178, 83,160,174, 20,152, 4,220, 8,182, 60,
-125,251,238,199, 55, 31, 63,156, 54, 0,154,219,158, 51,154,185, 29,128, 43, 76, 58,244,232,127, 50,130,116, 27, 3,248,157,192,
-142,121,168, 74,135,133,186, 10,235,225, 39, 88,231,172,162, 76,178,120, 11, 4, 47,140, 9,162, 45,156, 70, 71, 45, 40, 35, 62,
-205, 51, 34,149,228, 46,129,175,112,215, 71,211,186, 97,198, 83,208, 87,174,149,101,162,196, 9, 71,173,165, 69,210,253, 47, 0,
- 73,215,178, 35, 57, 17, 4,237,122,186,220,118,247,244, 12,176,218,129, 5, 36, 24, 14,136,189, 32,205, 21,196, 63,112,226, 3,
-248, 79,110,136, 11, 95, 0, 2, 45,176,210,238, 48,189,211,110,191,234, 73,132, 57,119, 75,237,174,114,102, 70, 84,101, 70,200,
- 31,126,252,254,250,125,159,212,141, 33, 11,223,201,118,102,140, 57, 10,222,153,210,209, 16, 5,121, 63,131, 8,128, 17, 97,205,
- 0, 84,121,141, 78, 33,102, 84, 77,189,110,252, 5, 17, 61, 0,118, 53,159,126,213,229,223,194,227, 31, 20, 67,171, 64, 68, 91,
- 22,204,170, 9,160, 47,235,162,133, 76,109,167, 76,208,116,135,109,149, 43,108,161,113, 90,238, 75,190,196,121, 24,217, 30, 10,
-146, 48, 39, 94,182,162,204, 24,144,140,108,219,253,213,179,238,240,193,177, 57, 90, 99,205,241,168,176, 74,250, 96,220,190, 39,
- 25, 61,228,232,235, 66, 43,120,169, 4,117,161, 38,192, 67, 89,194,148,168,206,150,229, 28,168,147,133, 7,190,208,127,181,110,
- 79, 18,121,169,128,232,108, 71,160, 52,216,204,116,208,110,154,148,131,193, 42, 34,181,235,196,196, 37, 81, 63, 3, 49,111,229,
-120, 48,130, 95, 65,110,139, 33,109,134, 69,168, 79,155, 33,123,205, 46,129,226, 54,127, 0,138,207,240,146,141,182, 55, 46,210,
-175,215,215, 29,114,244,192,107,171,172,101,104,120,110,110, 55,235, 48,112, 23,148, 19,125,142,150, 5,129,174, 26,145,214, 7,
- 20,149, 70,129, 42,212,167,149, 97,165,240, 0, 88, 8, 18,126, 24,216,115, 98,189,244, 99, 94,121, 88,185, 53, 38, 11, 51, 34,
-204,192, 67,105, 71, 33, 58,201,139,120, 64, 89,138,164,243, 58,130, 3, 58, 35,113, 65,189, 22, 30, 80, 63, 46, 53, 30,233,138,
- 13,162,121, 52,168,137, 28,200,172, 57,232, 87, 61,248, 50,119,229,219,111,244,237,203,230,140,124, 12, 92,208, 23,181, 43,170,
- 1,165, 81,117,231,183,213,165,129, 7,246,157, 71,189,182,240, 76,188,208, 59, 86, 0, 88, 21, 77,101,160,115,224, 64, 64, 16,
-203,232, 81,116, 80,139,210,185, 0, 53,115,238, 40,199,244, 78,209,176,118, 27,100, 1,150,102,159, 41, 61,137, 42, 29, 16, 47,
-236, 29,219,212,145,138, 61, 86,218,229,238,147,103, 79,183, 47, 95,253, 59,169, 11, 64, 78, 61, 37,145,189,152,148, 5,113, 2,
- 51, 31,116,110, 22,170,126,143, 73,185, 57,106,191, 81, 8, 95,115, 38, 73,154,132, 13,161,211, 13, 11,193,138,135, 76,113,118,
-244, 40,174, 57,203, 33, 38,145, 2,239, 81,234,216,138, 78, 43, 36,176, 55,235,238,254, 35,212,150,135,153, 30, 47,138, 6,111,
-138,141, 70, 25,233,230,188,245,225,101,228,146, 12, 90, 70,102,106,147, 54, 12, 13,141,180,220, 11,182, 7, 40,170,230, 82,208,
-153, 90,197,155, 69,128, 85, 90, 96,193,180,192,107, 25,198, 21,255,194, 76,135, 23,199,187,207, 15, 79,177,255,231, 45, 64,211,
- 82, 91,150, 86, 67,123,116, 42,183,224,149,178,116, 6,137,162,242,163,137, 90,181,109,127, 44, 77, 91,235,185,240,154, 15, 25,
-196, 93, 24,108,226,130,156, 95,124,159,134,228, 26, 31,177, 47,192,115, 61, 96, 23,138,170, 97,127, 93, 46,187,105,155,114,147,
-162,172, 67,166, 88,164, 94,176, 73, 79,206,151,240,104, 77, 24,148,244,153,114,195,126, 56,251,247, 62,254,236,235,244,231,233,
-175, 87,190, 53,200, 30, 13,184, 72,140,244, 34,203,129,198,191, 72,155, 12, 72,138, 18,231,180,174,175, 61, 22,206,105, 36, 24,
- 67, 9,151, 36,148, 47,132, 68, 77,206,128, 80,133, 10,177,178,225,109,162,181,117,179, 87,254,121, 18,109,123,251,226,121,125,
-247,221,228,250, 82, 78,155,222, 96, 92,179,163,175, 37,222,137, 75,182, 9,229,142,115,170,164,206,248,104,165,112,223,155,245,
-244,161,187,219,237,222,206, 79, 83,246,136, 67,124,183,222, 14, 73, 50,135,165,153, 27, 98, 90,129,136, 35,123,176,116,172, 30,
- 11,125,179, 28,123,126,163, 83, 82, 39,160,145,226,219, 48, 47, 55, 55,238,245,233,254,151,191,127,189, 10, 11,205, 95, 50,128,
-107, 76,139,154,171, 5, 53,251,139,221,157, 94,126,190,208,205, 4,201,234, 66,167, 2,159, 35, 40, 14, 94,197,145, 27,207,247,
-249,127, 73, 85,132, 14,163,189,224,119,121,145, 7,150,102,186, 10, 27,132,146, 9,224,235,104,132, 80, 25,217, 84,131, 52,247,
- 63, 61,124,249, 46,254,126,221,180,107, 71, 78, 71,253, 34, 17,247,128, 32, 45,221,223,171,212, 95,107,164,252,220, 98,219,234,
-117,224,177, 66,173, 60,120, 23,190,168, 46,108, 97,176,148,146,148, 93,159,236,172,114,220, 1,107, 26,250, 23, 55, 85, 35,133,
-238,129,236,141,109, 56, 71, 35, 22, 77,137, 32,194, 66,163, 40,142, 12,218,150,218, 2,216, 22,132, 43,237,142,109, 15,255, 9,
-192,209,213,244,200, 77, 68, 65,187, 63,252, 53,246,204, 78,118,147,133,136, 8,130, 16, 66, 2, 20, 14, 57,112,224, 15,112, 66,
-226, 39,115, 4,137, 67, 16,202,133, 3, 17, 68,201, 70,203,204,122, 60,238,118,127,185,169,154,219, 28, 70,182,236,238, 87,175,
-202,253, 94, 61, 16, 26, 87, 6,208, 57, 68,176,168, 89,187,217,208,137,175, 12,138, 87,197,130, 50, 11,148,236, 7,212, 22,145,
- 29, 12, 91, 90, 64,182,252, 82,134,201, 86, 74,129, 30,131,178,228, 96, 15,119,239,174,191,104, 95,254,252,209,124,120,120,123,
-180, 38,216,155,208, 81,101, 32, 8, 92,108, 32,245, 59,149, 64,157, 32,205,175,216, 74, 1,112,208, 65,137, 17, 58,107, 78,133,
-153,132,246,154, 7,174,201, 26, 96,100,219,245,253,103,235,246,246, 97,251,213, 7,251,185, 17, 59, 22,210,172, 75, 31, 3,246,
-168, 73,199,222, 31,111,199, 63, 84,249,126,186, 53,241,244, 38,204,139, 79,195, 58, 66, 43, 55,245,188,174,214,159,199, 2,180,
- 47,212,101, 5, 84, 29, 64,228, 37,244,141, 19,137,213, 54, 82,181,136,237,196, 22,106, 35, 56,103,197,169, 75,179, 42,235,156,
- 67, 26, 42, 36, 6, 48, 97, 54, 76,248,178,155, 89,158, 69, 15, 46,172,180, 97, 17, 87,222,177, 76, 39, 52, 52,171, 80,214,185,
- 70,149,151,158, 57,154,206, 32, 57, 59, 81,147,190,241, 68,181, 92,101,243, 68,208,180,245, 84,110, 98, 46,110, 82,181,215,235,
- 68,187,177, 26, 55,108, 0,147,161, 30, 10,119, 74,192, 96, 64, 54,171, 6, 29, 96, 9,146,157, 83,117,100, 29,233,152,191,208,
-233,121,185,184, 92, 38,138,163,117, 62,179,199, 76, 67,124, 75, 42, 33,232, 10,163,120,198, 46,104,254, 90,156,177,106, 41,147,
- 6, 2, 28, 56,214,172,216,107,175,216,238, 65, 50,235,181,162, 63, 94, 6, 29,144,172,138, 40,210, 57,100,176,142,239,159,203,
-111, 62,237,239, 20,178,106, 81, 63,213,154, 54,131,144,132, 53,195, 11,241,138, 0,132, 44, 39, 48,106,158,207, 66, 36,213,186,
- 0,127,192,219,104, 0,229,106,101, 3, 37,107, 16, 50, 24, 22,174, 12, 1,111,201, 4, 28,182,150,165,163, 54,207,151,193,115,
-236,202,129, 25, 99,131,240,132,202, 41, 28,153,125, 80, 44, 96,160,234,184,216,137,136, 58,239,191,125,246,167, 60,141,238, 40,
-119,149,176, 71,115, 49,243,185, 25,157,137,113,198,165, 68,182,165, 77, 42,249,165, 6,235,231, 71,232, 14,250, 69,142, 43,244,
- 95,244, 59,154,187, 53,133,198,189, 30, 85,149,230, 4, 37,213, 4, 63,117,156, 75, 37, 61, 79,132,183,208, 67,129, 19,183, 16,
-127,211,221,249,168,247,207,182, 87,225,237,125,230, 76, 35,133,221,202,193,131, 67, 33, 93,140, 39,170, 34, 26, 68,115,112, 23,
-187, 37,232,107, 53, 4, 66,192,170, 32,216,243, 99,250,123, 59,186,183, 38, 61,179,203,183,232, 47,108,104, 6,201, 86,137, 14,
- 40,193,190,121,131,128,218, 63,255,228,199,159,158,252,250,155,124,253, 42, 57, 27,183, 44, 78,109, 66, 11,210,143, 12, 93,153,
-138,115, 48,138,208, 84,185,242,244,219,227,104, 48,177, 14, 65,211,234, 14,111, 7, 12,196,171,250,186,208,115, 94,231,124, 61,
-166, 65,196,243, 94,101,195,131,124,224, 98,232, 76, 59,109,232,103, 61,128,245,215,238,146,173, 16, 77,160,215,202, 44,219,170,
- 63, 85,171, 60,250, 70, 59,118, 92, 46,120,192,110,251,226,233,234, 95,189,198,222,170,192,202,115, 57, 98, 23, 45,162, 74, 23,
- 67, 21,252, 9,203,235, 72,182,105,154, 97, 46,149, 35, 43,132, 14, 18,238, 90,180,108, 0, 2,205,204, 21,155,176,120,182, 11,
- 70,104, 24, 80,205,166,108,144,216,122, 5,188,221, 62,250,184,253,250,203,241,241, 46,141,239, 11,139,149,134,192,193, 70, 65,
-122,155,240, 43,234, 16, 17, 2, 78, 45, 78, 7,145,193, 82, 99,144,162,143,238,252,225,223,191, 15,223,189,124,209, 13,191, 68,
-168,249,114,136,203, 41,207, 29, 51, 8, 40, 63,100, 90, 65, 39, 73,229, 33, 31, 75, 55,150,141,111, 47,159, 4, 86,170,109,224,
- 24,222,152,130,146, 63, 36,113, 94,229, 15,191,255,115,248, 47,222,215,216,202, 16,147, 21,244, 60, 0, 23, 90, 92,100,168,197,
- 9,107,187, 9,225, 30,156, 62, 55,123,228,208,148,124,121,136, 69, 83,225, 95,116,140,181, 50, 66, 29,107, 54,109,177,251, 5,
- 47,179,239, 16,184,145, 69, 67, 0,119,128, 34,199,225,240,176,177, 95, 42, 8, 67,163, 79,230,246,175,233,221, 13,128,111,179,
- 27,202,160, 29, 50, 1,184, 7, 88,248, 1,108, 15, 25,226,161, 69, 62,110,163, 8,229, 36,114,183,221, 1,172, 42,115,198,214,
-210, 45,182, 88, 53, 25, 8,178,165,177,200,232,150, 31, 65,179,180, 84,102, 66,136,121,161,109,166, 42,195,154,173,199, 83, 95,
- 73, 41, 16,236,172, 34,128,128, 74,243, 2, 49,180,193, 5, 6,117,165,162,228, 12,135,224,133,250, 95, 0,146,174,166,199,145,
- 26,136,182,219, 31,237,254, 74,102,146,153, 65, 44, 11,172, 86,139, 56, 48, 18, 90,110,128,144,184,193, 1,132,196, 63,225,103,
- 34, 33, 36, 36, 56,112,155, 5, 41, 44,218,157,201, 36,221,233, 15,187,109,243, 94, 56, 38, 82, 58,110,219, 85,126, 85,174,122,
- 79,254,248,211,247,185, 88, 25, 44, 16,240,123,152, 40,214, 84,241,110,202, 77,136, 57, 22, 82, 39,179,227, 17, 15, 65, 12, 77,
-212,132, 8, 91,241, 70,216, 5,214, 31, 57, 53,224,103,189,209,148, 18, 20,113, 63,220,124, 18,175, 95,180, 97,151, 46, 6,196,
-221,233,136, 64,170,182,190,101, 58, 32, 5, 93,250,188, 85,121,177,202, 67, 52, 21,134, 37,199,104,135,215,222, 29,215, 57,211,
-129,226,220,166,152,217,139,118,243,236,246,113,251,221,171,250,135,191,228,139, 71, 39,134,225, 24,195,212,133,225,190,143,111,
-148,232, 92,218,133,219, 93,253,209,235,236,203,204,126,108,154,247,245,230,185,173, 42, 27, 92,181,206,242, 10, 75,168,217,121,
-117, 12, 76,146, 25,150, 94,226, 11, 18, 88,147,199, 59,178,172, 43, 99,153,179,156, 88, 53,171,235,229,220,131, 24,229, 54,157,
-233, 38,200,229, 66,157,232,130, 98,220,212, 14,213,255, 19,126, 36,182, 8,159, 53,134,196, 8,232, 4, 3, 24, 41,198,161,232,
- 79,217,168, 60,159,179,159,172, 71,129,157,136,165, 96,135,138,234,121,185,153,124,180,154, 53,179,201,107,195, 94,250,188, 8,
- 25,115,192, 19, 57, 82, 48, 74, 96,112, 0,123,224,114,153,199, 41,158,121,201,125,244,251, 48,122, 57, 76,241, 52,177,173,169,
- 58,200,145,217, 64, 0, 98, 57, 1,248,100,153, 33,223, 35,220,118, 86,178,172, 90,204,146,213,246, 13,222, 77,122,172,198,144,
-203,186,192,191, 98, 92,234,144,150,178,142, 88,120, 88, 55,108, 3,199, 17,140,105,194, 63,143,105, 47,211,147, 39,217, 87, 95,
-215,105,173,129,244, 53, 34,187, 77, 80, 76,126, 25,202, 47,224, 49, 44, 52,143, 76,135,105, 18, 9, 71, 22,242,101,103,148, 91,
- 40,170,199,249,165, 23, 17, 15,157, 66,236,231,112,110, 47, 76,231,142, 94,248,247,227, 63, 46, 77,153, 29,129, 92, 2,176,163,
-234,232, 45,204, 4, 32, 49, 13,152,233,142,164, 8, 56,129, 42,155,205,148,140, 3, 52, 18,219,141,108, 63,253,236,119,127, 51,
-238,239, 0,176,237,144,145, 91,114,201,122,173, 15,136,238,108,172,224,143, 34, 37,192,129, 67,169, 40,226,114, 50, 94, 49,115,
-134, 29, 13, 63, 76, 22,203,214, 74, 55,195,161,240, 99,126,148, 5, 38, 92,197,154,151,189,234,208, 80,203,208,149, 24,121, 66,
- 8,246,128,147,241,106,253,242,202, 12,251,131,223, 36,174,135,226,197, 56, 38,208,227,212, 47,152,199, 83, 56,183,202,200,219,
- 24, 42,120,106,152,186,101,182,209,132,138,253, 27,194,226, 59,106, 78,233,146,172,188, 18, 78, 21, 97, 70,101, 76,155,180,109,
-243,182, 88, 16, 19,204,189,232, 78,106, 43,158, 62,189,108,218,203,221,155,210, 79,189, 95,173, 4, 38,153, 5,127, 42,154, 34,
-247, 94,152,134,105, 73, 50,125,201, 51, 81,101, 92, 12,143,110,214, 44, 45,216,199,217,104, 25,179,181,177,244,154, 60,230, 57,
- 59,166, 88, 23, 75,209,142, 37, 68,235,210,162, 23,222,206, 76, 25, 0,107,193,236, 89,223,143,204,214, 47, 14,208, 88,247, 39,
- 25,198, 30,163,249,123,254,240,221,247,190,189,190,127,245,243,111,251,183, 41,147, 5, 76,147, 12,209, 46, 97, 65, 27,167, 16,
- 71,122, 15,164, 31,120,233,199, 86, 91,178,196,177,224, 21,120,149,138, 26,140,232, 42, 94,137, 8,227, 17, 30, 10, 71,219,202,
-204, 85, 94,172,141,177,181, 93,233,171,235, 27,123,251,205,116,249,129,143, 7,229,217,250,231, 11,156, 94,152, 47, 79,149, 45,
- 7,131, 19, 12,100,103, 31,241, 90,185,124,236,128, 78, 6,182,181,196,225,225,254,241,157,139,207,183,155,105, 57,189,101,171,
- 25,201,234,109,160,254, 42,156,224, 74,136,141,168,173, 44, 27, 21, 44, 64, 51, 57, 93, 45,112, 27, 54,132,164,216, 26, 54,203,
-137, 33,215,245,213,243,221,191, 47,127,185,251,117, 49,123, 31,215, 94,132, 81,177, 17,164,150,177,235,226,144,235,103,155,198,
-234, 63,187,227, 9, 91,136,241,193, 2,179,150,148,144,196,203,200,105, 65,184,210, 45,146, 87, 60,216, 12,150, 18, 9, 48, 92,
-221, 80,144, 53, 1, 67,123,210, 19,195, 98, 27, 69, 21, 32, 56,200,126,182,225,230,238,225,139, 63, 78, 71,161, 10, 12, 13,155,
-175, 4,114,169,125,125, 50,108,171, 38,242,156,164, 27,165,110, 7, 28, 71, 97,209,172, 71,118, 57,187,182, 22,114,250, 27, 7,
-115,166, 0, 33, 35,114, 24,232, 76, 14, 21, 3, 52,138,189,160, 72, 88, 71, 50,159, 34, 20,165, 41, 10, 11, 80,102,224,231,108,
- 43,147, 77,161, 70, 40, 81, 99,151,227,112,139,198,203, 67,211,216, 58,137,217,253, 39, 0, 73,215,178, 27, 57, 17, 69,253,168,
-114,217,229,118,119, 72, 39, 51, 65, 36, 25, 17, 36, 52,210,140, 96,129, 88,176, 26, 33, 22, 72,108,216,241, 3,136, 79,224,167,
-248, 1,214,108, 71, 66,108,216, 1, 98, 51,210, 12, 36,221,233,118,183,219,229,122,114,142, 89, 38, 74,210,142,171,234,222,115,
-110,157,123,110,249,253, 15,223, 93, 18,125,224,112,128,210, 15, 65,198, 56, 95, 14, 50,112, 21,214,250, 17, 43, 73, 63,159, 2,
- 32,140,117, 6, 0, 83, 57, 34, 15,252, 63,173,110, 83,100,131,103,207, 13,208, 36,240, 88, 95,159,250,190,187,107,158,126,120,
-121,129, 0,249,111,106,144,208, 61, 2,110,217, 57,250, 80,118, 68,173,156,168, 82,249,128, 61,177, 83,167,147, 4,224,149,210,
- 22,163,159,175, 68, 14,122,189,210,231, 95,190,169,191,249, 35,220,216,233,157,136,111,155,124,175, 57,230,201, 73,196, 99,139,
-101,154, 62, 80,214,164, 77,238,183, 99,150,109,132,122, 35,110,182,205,103, 59,253, 60, 59,255,120, 85,171,101,110,154,203,157,
-195, 31,149, 14, 89,122,234,193,200,188,168, 41,200, 46,102,195, 10, 80, 26,122,109, 88,122,244, 35, 7,226,157, 23, 52, 5,101,
- 67,112, 57,225,237,129,125, 1,178,208,124,159, 87,228,200,101,157,199,231,158, 18,135,192,206, 54,132,136, 15,108, 13, 51, 7,
-132, 23, 97,198,138,147,252, 66, 57,141, 46,211,217, 68, 51, 31, 55,245,108,192, 97, 49,151, 5, 27, 58,208, 32, 57,224,212,176,
- 93, 22,107,142,204,201, 73, 81, 89,213,112,182, 21,226, 26, 53, 9,202, 19,191,142, 2,233,122,220, 39,131, 93,231,104,136, 40,
-251,132,248,104,203, 52,166,226,224,163, 56,102,172,169,119,177,146, 20,122, 8,218,242,226, 84,226,148, 35, 28,176,144,134,231,
-180,160, 39,188,226, 5, 38,162,250,160,144,216,211,128,236,229, 97,100,199,151,201, 3, 24, 50,175,130, 59,113,243,201,167,159,
-127,113,251,234,182,175, 86,197, 33, 47, 4, 54,203,194, 41, 89,137, 51,176, 71, 73,191, 96,193,186, 30,235,219,200,137, 82, 81,
- 67, 38, 29,231,112,151,244, 22, 2,110, 72,131,154,142, 34, 42,131, 47,157,137, 52, 14,180,148,178,196,119, 41, 58, 36,186,156,
-148, 60, 80,192,131, 67, 90, 32,161,148,192,107,177,228,207,100,133,161, 31,142,205, 88,217, 6,223,110, 74,138, 49,222,187,187,
- 8, 47, 94,254,250,215,225,120,232, 65, 93, 0, 79,119, 96,223,136, 40,134,142,162, 89, 45,221, 16,152,127, 76,197,246, 88,156,
-101,229,247,237,169,238, 5,213,168, 62, 44,230,138, 41,136, 88,164,207, 48,150, 24, 11,150,187, 54, 12, 53,193, 41,128,190, 12,
-108,138, 74,196,166,236,124,113,147,125,152,210,203,235,213,197,180, 61, 58, 68, 29,252, 14, 53, 69,105,160,155, 24,221,132,130,
- 11,186,160,236,223,135,128, 96,178,230,228, 16,228,128,184, 72,192, 80, 68,187, 93,165,176,125, 90,246, 64,228,172, 78, 40,189,
-236,234,167, 23,205,249, 85,189,104,235, 75, 89,105, 45,241, 18,193,237,130, 43,149, 89, 63,233,174,175,158, 28,251, 96, 55,174,
- 53, 86, 41,217, 1, 43,210,168, 64,129, 85,105, 97, 42,177,200,193,189,101, 75,148,225, 86,165,157,219,208,128,111,121,141, 14,
-204, 95,186, 78,143,181,106, 65, 46,176,113,132, 23,142,238, 6,199, 52,170,165,108,216,239, 83, 88,142,145,205, 26, 38,132,113,
-112,188, 55,201,246,142,247, 71,219, 24, 31,213,195,113,184,187,126,246,227,183,237,217,223,191,252,246,122,163,124,165,100,169,
- 69,196,126,115,179, 18,225,126, 2, 78, 71,128,226, 16,187, 97,226,248,108,106,136, 41, 33,201,240,202, 26,150, 52, 41,250, 8,
-248,102, 21,216,119,210, 22,237, 34, 86, 67,206, 30,250,148, 42, 93, 46, 63, 90,171,231, 95,245,207,110,179,254, 45,135, 84, 20,
-172,151,185,108,156, 29,131,216, 33, 24,248,204, 83, 19, 54, 22,220, 5,233, 22,228,124,162,129, 51,118, 14, 14,233,233,241,254,
-190, 55,215,239,191, 88,116,118,218, 61,240, 70,203, 87, 81, 42, 32, 51,252,199,108, 47, 13, 67, 4, 83,220,166, 84,211,129, 3,
- 11,133, 21,192, 67,210,149,164, 4,120,237,207,150,185,210,175,126,122,125,216,238,127,175,206,217,184,139, 64,227,168, 3,165,
- 80,116, 95, 72,128,170, 91,121,177, 22,127,110, 30,233, 2,156,140,179,166,200, 15,108,142, 44, 65, 64, 60, 78,169,142,213, 50,
- 38, 77, 93, 1,157, 31, 56,123,153,253,119, 28, 15, 73,184,195,154,162,154,192,145, 56,153,146,162,193, 56, 54, 95,255,252,207,
-202,171,221, 21,112, 31,240,129,174, 56,105,146, 98,137,189,111,177,133, 23,185, 84,103,157,197,209,210,120,153, 44,221,183,160,
-242, 78,116,206,153, 6,159,225,117, 99,216,131,104, 78, 93,226,220, 22, 47, 68, 53,168, 58,153, 36,113,178,234,120, 26,102, 99,
-165, 38,155,202,164, 67,178, 43,132,249,166,176, 3,101, 44,117, 61,206,118,248,164, 26,160, 31,178, 84, 3,221, 70,254, 19,128,
-165,107, 89,145,164,136,162, 25, 17,153,145,145,143,206,202,174,126, 14,211, 13,211, 51, 66,207, 70, 93, 12,174, 68, 68, 92, 41,
-126,128,136,123,193,189,191,229, 55,136,184, 18, 4,113, 51, 48, 61, 11, 81,212,110,230,209, 93,213,249,136,200,200,136,244,156,
-210,109, 83, 13, 85,153, 17,247,158,115,239, 61,231,170, 47,191,249,218,231, 99,212,248, 23,124, 39,176, 43,156,124,157, 73,214,
-158,181, 65,142, 18,169,207,241,218, 23,223,177,153,226, 40,179,194, 29, 15,210, 41,182,204,123,214,232, 0, 33,231,221,230, 34,
-220,112, 55,138,105,123, 29,205,118,255,233,201,209,229,250,100, 79,173, 84, 82, 46,114, 50, 34, 63, 76,138,146,230, 80,224, 9,
- 91,201,250, 94,142,135, 98, 69, 70,179,138,105, 70,112,169,171,253, 71,229,201,135,207,245, 39, 55, 73,153,249,127, 74,250,113,
-233,232,121,180, 55, 83, 31, 51, 54,104,185,108,201, 23,156, 86,202, 86, 42,179,197,220, 23,122,114,241,198, 83,191,117,220, 31,
- 63,115,235,203,252,240,104,101, 76,110,238, 64, 69,250, 57,116, 55,244,124,228,108, 15,155, 80, 52, 40, 21,160,148,115,152,168,
- 69,164, 96, 50,208, 96,101, 65,212, 66, 80,176,187,206, 62, 93, 77,105,106,248,191,242, 83, 76, 96,194, 75, 50,230, 19, 85, 95,
-145,216, 27, 81, 11, 60,156,245, 93, 92,128, 33,132,232, 55,130,133,248, 77, 4, 56, 30,183,252,212,130,131, 75,243, 59,105, 60,
- 46, 28,133, 17,220,250,108,240, 2, 69,164, 11, 62, 75,217,160,173,130, 22,240,130, 59,231,157,242,150, 90,206, 2, 32, 74,128,
- 58, 0, 27,207,118,196, 75, 91, 70,145,134, 13, 64, 55, 35, 8, 2,201,140,252,234,115,176, 81,205,182,120, 24, 69,146, 23,138,
- 26,104,153,153,196,148,146,246, 9,200,103,163, 88, 94,249, 68,215,184,225,222, 3, 96, 87, 81, 31,164,117, 91, 29,156,157,158,
-127,246, 65,252,252,139,254,211,175,158,188, 35, 87,215,191,108,113,108, 15,101, 90,176,214,145,103,236,158, 35,154, 0, 82,114,
- 35, 44,109, 88, 23,128, 43,129, 0,164,233,238,206,223, 16,105, 91, 35, 44,238,140,224,194,170,158, 58, 35, 32,167,176, 73,113,
- 40,102,235,149, 93,156, 99,235, 19,116,131,202,133,142,130,252,225,126,158,123,157, 13,190,191,231,184,225,127,166, 90,148, 74,
- 40,142,158, 46,109, 82, 60, 76,246, 47,207,255, 44,158, 62,127,251,178,176, 58,155,210, 98,100,193, 28,153,146, 70,111,248,161,
-110,158,144, 55,230, 80,189,162,131, 29,178, 7,226, 93,201, 41, 88, 60,130, 32, 86, 49,100, 2,207, 60,178,134, 72,179,154, 66,
- 9, 36,115,112,183,160,163,235,242,124,231,104,164,169,143, 65, 42, 16,236, 28,149,226,173,119,121,219,188,191,206,230,215, 93,
-228,130,246, 68, 78, 56, 94,116, 12, 4, 75,163,160,201, 44,217,134,164,133,219,126,162, 36, 49,174, 82,176, 59,128,133,180,197,
-185, 5,142, 46,228, 42,141,109, 45,142,219,228,236, 97,124,112,148,180,171,184, 74, 66,155, 47,235,131,165, 46, 69,173,147,166,
-162, 93,176,235,228,252,166, 90,251,139,139,125,151, 53,175,187,113, 46, 51,228,102,228, 6,141, 91, 63, 75, 6,134,164,156,220,
-172,129,234, 17, 6, 64,186,139,121, 14,165,141,136, 21, 54,230,200,154,192,104, 99,232, 61,199, 30,180, 85, 3,216,117,129,147,
-231,239, 57, 3, 44, 44,130,167, 3,123,101,207,187,220, 34,104,149,146,155,134,241,113, 36,168,110,233, 54,183,221,233,147,245,
-119,223,154,179,223,127,251,233,251,151,183,119,177, 17, 6, 84,192,131,125,146,225,210,150,143,170,100, 15, 24,199,245,159, 11,
- 23,188,134,252, 14,175, 9,153,135, 67,219,249, 68, 99, 15, 53,224, 33,113, 37, 60,112,198,136,231, 89, 47,141,169,244,113, 81,
- 85,170, 61, 63, 48,239,126, 60, 28, 94,196,113,155, 14, 29,205,113,164, 97,215, 72, 59,208,126,186, 7,208,154,123,142,118, 84,
- 35,215, 61, 2,209,227, 21, 5, 63,112,228,131, 94, 32, 18,233,243,205,246,111,223,157, 62,126,252, 76,235,191,188,187, 13, 30,
-231, 15,161,128,238,179, 64,146, 92,109, 65,166,193, 54, 58, 43, 74,187,225, 10,228, 31,213,151, 33,140, 32,235,117,243,222, 15,
- 87,213,207, 87, 63,150, 13, 72,156,193,181,221,233,173,233,162,116, 79,209,194,232, 55,238, 65,243,168, 17,191, 94,255, 49,216,
- 59,186,100, 4,106,138, 35, 16, 18,128, 66,156,162, 29,192, 2,144, 48, 44, 13,107, 18,178, 14,205, 65, 60,214,202,132,218,241,
-194,104,184,101,203,112,215,110,116,190,110,206, 94,116, 31, 93,109, 69, 77, 93, 36,161, 52,194, 85,193,209,143,189, 36,219, 91,
-240,103,185,205, 66,208, 90, 3, 29, 38,119,211,184, 24,174,175,183, 62,184, 2,168, 37, 51,224, 55,160, 66, 1, 49, 0,151, 91,
-239,237,230,133,164,200, 38,175,214, 42,215,210, 42,145,182,117,113,148,150,187,109, 52, 89, 64,102, 76,193, 35,243,196,115,225,
- 87,153, 54,129, 97, 76,227,100,151, 74, 43,171, 2,213, 31,255, 10, 64,210,181,236,198, 81, 68,209,170,234,174,234,215,244,204,
- 56, 51, 14,118,172,196, 10,142, 32, 68,137, 88, 96,137,236, 96,225, 13, 59, 22,124, 3, 91,118,136,255,225, 43, 96,143,196,134,
- 44,178, 9, 2, 69,177, 32,142,133,147,201,120,218,211,207,234,170,226,156,201,106,188,153,135,187,234,158,123, 78,213,189,231,
- 70,223,255,248, 45, 50, 84,238, 18, 4, 52, 35, 23,152,224,129,181,144,115,206,211,254, 51,162,135, 86,220,112,176, 14,135, 14,
-114, 98, 14,196,173,230,181, 38, 13,155, 84,159,242,136,174,219, 74,182,254,213,131,102,148,133,225,253,106,120,187,246, 31,135,
-197, 39,251, 7, 71,243, 89,153,205,157,198, 46,167,243, 1,118,208, 60,206,160,238,176, 97, 82,192, 27, 18, 3,132,228,244, 32,
- 95, 28,157,188, 75,206,254, 9, 95, 92,116,107,211, 95,178, 76,153,237,106,244, 35, 33,138,209,218,175,240,212,174,146, 27, 86,
-178,138,146,189,101,160,130,217, 12,180,122, 9,114,233, 94,175, 93,175,204,126, 91,124, 94, 29,156,198,139,195,185,246,147, 73,
-101, 34,209, 55,174,222,208,115,201,102, 54,170,216,240, 38, 6,229,166,161, 93, 33, 38, 56,120,205,246, 52, 37, 32, 65, 87, 96,
-214,224,185,156, 34, 4, 89, 35,111,128, 94, 30, 2,142, 86,141,222, 66,225,215,169,109,182, 52, 60, 6, 96,109, 59,182, 32, 88,
-182, 90, 4, 68, 33, 20,173,229, 88, 97,200, 3,213, 67, 19,240,152,153,243, 67, 16, 57,142,246, 30, 44,181, 98, 61, 58,164,183,
-225,242,249, 15,163,130, 4, 91,184, 52,187,188,195,176,241,109,173, 56,194,110, 8, 73, 79,243, 28,144,221, 17, 16,127,205,204,
-132,117,142, 38,154,115,175,128,194,200,224, 25,251,202,251,200, 23, 83,221, 37,146,145, 9,181,207,146, 50, 43, 18, 82,140,116,
-236,176, 85,115,105, 99, 17, 45,246,103,251, 95, 62,154,157, 62,253,232,187,179,245,211,179,243,197,201,159,213,208,191,170,191,
-186,250,181,179,231,219, 34, 87,244,204, 71,228,122,182,212,231,248,131,119,181, 66,199, 60,108,100,109,243,174, 5,148, 23, 21,
-248, 47,240, 69,134,158, 6,195, 24,106, 13,241,221, 33,209,117,193,221,176,107, 28,140,216, 87,212,125,182,114, 98, 28,199, 70,
-236,144, 7,217,128,198,239, 44,209,128, 46,108, 88,244,147,209,241, 90,208,164, 47,193, 74, 7, 3, 60, 93,168,135,167,247,158,
-117,119, 86,215,111,160,170, 64, 67, 88, 93, 83,140,209, 6,192, 0,154,194, 89,170, 50, 75,214,120,122,165,234,192,141, 34,189,
-105,253, 22,194, 47, 5,169,209,248,117,144,161,178, 84, 37, 94,169,109, 53,160, 14,112,207,202, 56,154,255,237,204,154, 84,132,
-236, 60, 27, 99, 96, 57, 62,188, 4, 62, 12,238,237, 32,102,123,199, 39, 97,104,250,213, 0,117, 51, 24,101,160,240, 2, 69, 41,
- 4, 25, 24,215, 76,202, 89, 4, 69,192, 22,125,124, 58, 7,215,131,134, 25,159,123,177,199,190, 57, 49, 95,250,195,165,206,151,
- 33,186, 45,121,190,147,208,178, 12, 57, 4, 4,144, 86,226,144,138,115,150, 49, 1, 76, 37,228, 88, 21, 27,121,116,120,111,111,
- 57,223,188,167,159, 77, 16, 38,207,192,216,114, 59, 6, 44,174,203,150, 82,209, 23,184,109,104,249,225,229, 4,170, 20,207,159,
-207, 64, 21, 22,106, 34,194, 23, 64,166, 76, 60, 2,220,180, 41,178, 94, 10, 5,202,233, 19,216, 65,209,110, 2,189,119,113,115,
-157, 74,197,132,128,119, 87,155,234,242,101,123,250,248,201, 79, 63,220,189,211,255,245,252,231, 23,231,175, 43,215,198,123,160,
-106, 96,234, 90,165, 44, 12,209, 9,111,123,192, 94,232,201, 50, 6, 23,223,112, 88,138, 2,242, 25, 78,220,157,117,140,248,160,
- 85,232,101, 59,245,144,158,137,148,153, 1,154, 77,146,101, 80,183,198,201,193,212, 60,249,186,155, 62, 8,221, 21,189, 54,141,
-109, 63,184,246,185,145,205,121,189,160, 35, 5,126,219,238,138, 10, 72,206, 27, 93,219,155,174, 41,148,104, 66,138,160, 65, 18,
-119, 1,226,217,157,255,251,162,191,209,247, 63, 59, 14,237,133,221,108, 5,135, 30,199, 33,113,124,128, 96, 88, 59,183, 62,136,
- 14,232, 23,118,100,244, 25,128, 33, 78, 59,145,201,195,251,159,254,125,249,224,151,223,255, 8,238, 93, 92,166, 8, 20, 58,176,
-130,240, 15,180,237, 66,162, 46, 98,215,182,254, 56,190,189,104,159, 95, 93,178,226, 68,213, 65,209,156,195, 0,198,121,198, 81,
- 40, 53,152, 98,103,122, 19,242, 81,182,154, 83,190, 56,173, 98, 84, 26,203, 11,110, 81, 74, 66,182, 2, 78,219, 13,240,236,238,
- 90,124,243,219,197, 60,148,255, 25,108, 6, 29,242,148,243, 10, 41, 7,114, 45,179, 85,174, 51,186, 2,235, 9, 47,135,107,155,
-140,244, 99, 65,124, 14,193, 2,196,122, 35,116,107,124,173, 6,145,170,168,247,170,224,140, 94,167,144, 63, 91,203, 44, 51,166,
-137,156,132,104, 83, 20,189,168,193, 43, 16, 57,187, 62,181,209,153, 64, 83, 35, 51,118, 64,143,109,208,229,208, 13,222,231,160,
-133, 82,200, 91,101,248, 95, 0,146,174,165, 71,110, 34, 12,118,219,221,126,142,103, 50,195,102,178, 15, 41,136,135, 54, 7,164,
- 61,160, 32, 36, 30, 23,238,252, 21,110,252, 31,110,252, 9, 56, 1,183, 72, 43, 17, 36,162, 68, 9, 97,149,144,144,221,157,157,
-245,187,221,238, 54, 85,102, 53,167,157,209,200, 30,119,127, 95,149, 93, 95,149,202, 29,205, 5, 25,138, 42, 70,245,255, 56, 21,
- 13, 37, 50,154, 24, 5,156,229,231,205,229,208,215, 50, 89,136, 58,162, 83, 42,160,101,165, 57,156, 96,129,128, 37, 40,173,199,
-114, 24,187,136, 49,117, 89,109, 70,133, 79,160, 97,220,150,227,163,199,215,241, 95,201,201,221,229, 55, 7,249, 39, 7,135, 38,
-115,175,124,119, 69, 81, 52,184,127,181, 27,117,166, 87, 91,165, 78,146,187,199,181,191,255,188,253,232,181,238, 35,127,117, 20,
- 12, 70, 2, 4, 59,202,178,237,104,168,253,177,209, 50, 26,104, 46, 54,154, 56,236, 38, 29,205,108, 81, 0,220, 0,208, 78,224,
-223, 18,237, 44, 85,247, 60, 86,159, 40,167,176,238,229,186, 61,254,234,230,240,203,147,253,249,123,155,159,162,103, 79,118,239,
-106,223,216,254,245,168, 57,104, 66, 11,107, 85,138, 24, 63,110, 5,206, 63,210, 7,194,152,249, 25, 61,227, 73,100,196, 7,246,
- 99, 5, 94, 17,234, 27,225,136,154,131,174, 5, 49,183,153, 15,250, 86, 96,211, 12, 55, 52, 79,203,163,137, 75,172, 5,254,160,
-172,223, 99,211,117,129,105, 38,159, 25,128,174,112, 10, 91, 41,176, 78,244, 34,156,141, 43, 92, 80,134, 54,179, 82,169, 12,224,
-177,238, 67,254,211, 78,165, 34, 67, 88, 78,113,238, 20, 16, 30,182,130, 19,141, 17,166,247,170,151, 29, 21, 25, 64,230, 33, 74,
- 42, 69,244,184, 38,185, 30,140,102,218,239, 58, 81, 33,229,230,232,253,113, 54, 84,224, 9,161,115, 45,175, 8, 74,240,114,187,
- 90, 31, 29,174,206,142,170,237, 89,191, 44,222,221, 63,178, 47,227,235,219,191,189,249, 71, 84, 55,186, 84,159, 31,186,245,240,
-242,205,168, 64,217, 0,177,166,174, 15,214,204,133,197,241,130,238, 74, 98,165,113, 70, 88,212, 84, 99, 73,225,143,114,209,144,
- 49, 88,174,107, 39, 3, 68,203, 49, 34,127, 75,169,164,104, 44,118, 16,103,199, 73, 51, 20,253,170,200,152,195,217,141, 28,237,
- 7,148, 72, 93,247,190,163,197, 46, 39,173,122, 75,109, 66, 38, 88,235,167,121, 14, 78, 5,224, 92,239, 63,171,223,234, 50,231,
-128, 88, 95, 83, 38,198,204, 27,133, 78, 89, 43,182,219,168, 17,197,232,195,212, 37, 40,190,209,144, 20,224, 91, 97,208,140, 32,
- 94,166,208, 17,138, 7,206, 62, 29,141, 96,198, 44, 10,173,220, 98, 33, 69,195,158,141,150, 55,116, 88,109,130,114,242, 42,113,
-140,151,198, 41,181, 65,121,177,251,109,181,252,248, 65,145,191,208,104,219, 12, 6,225, 40, 28,237, 22,124, 49, 99, 54,167,152,
- 78, 81, 12,178,195, 91,169,154, 71, 79,103,251, 72, 41,115,108, 90,188, 14, 67,193,244,107, 41,175,230, 88, 8,170, 46,230,113,
-178,110, 30,210, 73,102,191, 61,188,173, 25, 63,234, 43, 91,237,116,116,126,178, 61,206, 62, 77,254,120,162, 47,175,198, 78, 53,
-121,210, 77,233, 74,113,132,126, 24,204,224,226, 68,243,222,225, 34, 5, 87, 3,125,142, 25, 43,238,121,122,121, 0,200, 53, 82,
- 92, 53,196,125,220,185, 14,229,115, 23,105,237,104, 52, 66,123, 67,134, 72, 38,210,129, 21, 53,198,180,192, 18,255,118,162,137,
-191,126,120,250,253,119, 50,219,255,252,252,135,167,111, 47,107,213,240,164, 40,245,147,129,167, 89,235, 48,106,127, 75, 61,211,
-152, 37,113, 47,169,247,232, 58,171,105,191, 20,166, 52,242,240, 67, 46,123,108,198, 94,232, 69,176, 97,212, 38,233, 76,188, 81,
- 34,197,250, 11,150,201, 73,242,224, 11,123,239,212, 87,173,165,212, 10, 21, 98,152,244,156,245,132,166,208,128, 33,199, 56, 84,
-229,155, 14,203,152,160,200,148, 86,214, 73,145, 96, 5,118,125, 47, 41,159,180,252, 38, 78,115,153, 88,253,250,231,249,106,251,
-237,103,167, 15,109,249,168,107,247,116, 31,109,152,218, 75,121,106, 59,169, 2,139,198, 74,206, 84,105, 67, 81,160,241,139,225,
-224,206,217,139, 87, 31,252,248,203,239, 59,123,177,202, 83,222, 41,205, 19,167,109,132,110, 19,205,242,104, 20,187,189,168, 90,
-217, 10, 61, 68, 81,198, 9, 54, 57,120,215,237,122, 73,149,239,194,135,124, 96, 62,161,208,224,192,201,145, 37,118,171, 88, 72,
- 57,165, 65, 76,156,195,116, 62,122, 21, 87,168,162, 67, 16,175,214,147, 76, 63,124,124,185,241,203,139,149,170,198,166,104,169,
- 75,214,232,254,131,195, 69, 40, 1,213,239,196,106, 15,204,152,226,180,108,148, 36, 28,232,110,246, 11, 5, 90, 14,188,137,239,
-154,180,125, 3,124,226,252,134, 18, 74, 14,204, 88,234, 56,154,112,218, 4,203, 22,224,125,204, 40,210, 78,108, 81, 15,162,138,
- 77, 70,185,182, 21,110, 1, 44, 9, 22, 16, 20,122, 24, 87, 96,104, 32, 13,168,109, 54,113, 7,109,210,236, 58,249,159, 0, 28,
- 93,203,110, 28, 69, 20,173,234,234,170,126, 78, 15,201, 36,142, 3, 73,196, 67, 81,136,131, 34,136,120, 45,144,144, 88,176,204,
- 42,108, 88, 69,136, 21, 95,198, 7,240, 15, 44, 64, 94,176,136,132, 64,178, 98, 91,188,108,143,123,166, 95,213, 93,221, 93,156,
-211,203,145, 71,237,153,154,170,123,207,189,117,207, 57,234,229, 15, 47,112,234, 20, 29,243,216, 88,242,139,191, 95, 48, 36,222,
-119,202,240, 86, 6, 24,148,114,122,101, 73,189, 91,156,167,201, 79, 65, 3, 72,186, 83, 93, 30,166,200,179,161, 47,201,222,115,
-244, 69,117, 85,204,174,170, 67,188,148, 70,175,141, 64,133,120,126, 49, 92,190,190, 4, 0, 77,175,134,163,249,214,179, 36,126,
- 34,223,248,200,172,223, 87,119, 30,155,213,199, 85,246,249,153,123,247,247,118, 44,155,173,114,151, 40, 87,232,132,138,226,216,
-249, 22, 11,138, 13, 77, 66, 95,198, 62,201, 52, 74, 21, 3, 78, 58,177, 86, 50, 13, 52,205,127,125, 18,178,184,119,186,165, 96,
-190,141,162,198,136,204, 37, 2, 33, 59, 27,174,246, 99,209,221, 60, 26,239, 63,137,214,171,131, 96,231,219,198,213,125,215,202,
-122,235,120, 6, 45,157,224,103,171,252,162,160, 18,206,180, 66,159, 22,229, 69,135,239,220,143,192, 30,216,208,218, 79, 88,133,
- 22, 27, 75, 41, 43,188,173,176,183,128,180, 1,254, 68,207, 94,190,116,251,217, 37,192, 29,222, 87,174, 65,245,131, 44,207,122,
- 24,225, 73, 54, 66, 2, 17, 1,221,162, 76,157,107, 26,203,144,231, 20, 72, 90,114,147, 30, 75,250, 25, 69, 50, 22, 78,210,128,
-128,222, 74,223, 82, 75,250,122,239,250,218,231,154,210,163, 86,210,120, 45, 2,174, 44, 56,245, 9,152,114,131, 3,221, 34, 69,
-150,210,130, 19,147, 35, 42,118, 74, 20, 5,173, 69, 28,221, 28, 30,190,253,233,163,249,147, 47,110,124,243,162,251,250,121,247,
-240,209,223,250, 78,221,215,219,203,243,249,159,157,236,175,132, 13,119,109,149,230,155,231,197,137,107,127,221,101,169, 65,225,
-157,107, 31, 41,189, 81, 38,231,232,176, 78,120,241, 23, 80, 67,143, 61, 13,206,136,113,182, 50,154,226, 64, 47, 42,101, 28, 32,
- 83,235,169,234, 41,194,235, 88,112,224,193,156,208, 71, 92,236,103,179, 11, 81,216,247,158,206,238,162,243, 59, 63,161, 26, 4,
-170,119,150, 45, 70, 57, 0,199, 8, 58, 38, 25,178, 2,124,178,232,208,197,226,193, 7,233,244,224,179, 95, 94, 93, 4, 99,109,
- 10,146, 94,107,202,161,136,100,162,214, 54,189,178,114, 58, 7, 2,180,186,165,195, 62, 12, 19,191,113, 70, 17, 42, 0, 85,164,
- 10,219, 56, 58,155,166, 64, 3, 81, 86,226, 29,162,149, 40, 75, 88, 97,207, 11,167,120, 14,199, 76,242, 62, 99, 67,194, 92, 56,
-179,228, 28, 17,194,203,211, 38,121,240,230,135, 98,216,249, 29, 47, 51, 20, 64, 52,163,135,201,189, 39, 19, 90,152,194, 83, 56,
-118,149, 7, 73, 22,224, 17, 55, 1,224,102, 89,196, 50, 59, 64,244, 99,115,150,171, 84, 47,194,156, 75,231,137, 88, 65,115,214,
-114, 89, 62, 36, 99, 33,167,197,249, 47,162, 11, 16,240, 24,254,145,171,211, 66,223,187, 29, 4,242,224,244,122, 77, 38, 90, 20,
-208,215, 52,136, 19,109,227, 36, 85,125,170,104,104,235, 76, 14,200, 23, 77,189, 52, 28,190, 42,169, 50, 56, 20, 52, 28, 32,231,
- 77,246,156,232,154, 18, 45,219, 94,137,138,220,189, 62, 27,166,221,164,133,109,255, 45,251,139,174,116,155,239, 94,222,253,254,
- 91,173,175,126, 62,255,241,245,233,159,101,189,227, 12,122,140,159,218, 72,235,144, 70,200,159,197, 15,178, 70,124,193, 89, 14,
-189,109,189,172, 70,100,108,110,188,128, 86, 87,206, 4,212,163,160, 71,151, 66,253, 38, 82,146,255,162,181, 54, 89,100, 18, 89,
-220, 46,242,167, 95,245,111, 29, 13, 87, 13,181,198,102,129, 3,138,128,106,168, 0,185, 31,156, 9, 53,158, 8, 84,104, 7, 93,
- 89, 64,181, 45, 47,169,177, 57, 6,223, 68,234,186,159, 19,156,139,174, 70,144,105,187,217,186,134, 67,200, 66,252,247,234,248,
-236, 96,243,248,254,221,253,118,123, 50,118, 9,221,154,236, 16,236,105, 27,172, 42, 35, 90,203, 97,100,202, 93,118, 0, 35,155,
-195,135,103,219,247,126, 58, 62, 62,217, 30,199,128,217, 70,197, 17,245, 36, 45,130,179,162,149, 58,202, 58, 19,248,202,204,128,
-106,207,110,221, 91, 23,191,149, 23, 29,189,175, 98,142,121,227, 68,227, 83,132,156, 96, 74, 69,166,167,132,130,223,161, 74,108,
- 99, 44, 78, 89, 27, 46,110, 17,209,220, 24,210,170, 45,239,181,243,228, 29,151,124,249,199,244,244,175,193,197, 33,224,244,202,
- 40,229, 73, 11,116, 46,177,216,249,163, 16, 43,165, 7, 36, 10,175,244, 28,148,157, 8,199,149,139,137,118,226, 81,236,169, 37,
-214,210, 27,100, 74,226,156,206,161,128,126, 14,127, 25, 38,149, 6,249, 62,234, 85,191, 82, 69,131, 0,130,143, 46, 17,188,176,
- 42, 70,173, 35,192,152, 64,163,170,230,157,114,104, 85,142,168,221,167,145,219, 15, 9, 94,246, 72,249,244, 73, 87,227,255, 2,
-144,116, 53, 59,114,212, 96,208,109,187,219,237,158,233,217,153, 44,176, 11, 1, 14, 89, 18,105, 5,138,224, 0,130, 35,220,243,
- 2,188, 30,111,192,133, 87, 8, 8, 14, 16,148, 72, 8,162, 4,146,141, 8,251, 51, 63,237,110,183,187,221,166,170,115, 92,237,
- 30, 86, 51,254,190,175,202,159,171, 74,207, 70,175,220, 36,198,140,234, 14,190, 25,227, 98,151,229, 4, 52, 72,235, 65, 64, 83,
-204,189, 18, 96,164,197,200, 98, 2, 16,142, 91,185,224, 2, 24, 29,204, 59, 7, 52,206,213,200,160,146, 15, 96,117,204, 4,191,
- 52, 78, 23, 96, 6,152, 3, 55,114,101,251,131,238, 14,215,191,191,220, 47, 30, 95, 86,171,112, 34,115, 27,139, 65,243,245,126,
- 24,204, 11, 6,107, 84, 55, 75,185, 73,226,173,160,188, 70,159, 43,202,222,208,166,191, 82,154,202,198, 44,246,150,207, 87,172,
-172, 92,192,148,115,229, 44, 28, 52,248,170, 18,102,155,189, 62,218,224, 27, 4, 83, 2,161, 48,185,157,173,125,179,206,136, 85,
-124, 45,219,171, 88,191,187,191,255,109,186,247,149,122,242,253,250,209,143,241,217,127,237,214, 55,205,196,188,114,153, 49,183,
-215,225,175, 5, 99,242,112,250,146, 10, 70,101,123,195,124,104, 32,131,237,184, 67,201,242, 46, 62,165, 57,227,166,109, 99, 57,
-169, 3,159,190,160,149,139,157, 72,101, 27,209,164,209,141, 40,164, 83,170,193, 12,188,162,165, 28,200, 76, 87,208,215, 50,186,
-108, 88, 2, 12, 73, 59,205, 85,143,102, 99,185, 76, 69, 55, 56,212, 9,216,185, 7,220, 6,125, 18, 20,130, 42,199, 24, 50,165,
-150,128, 22, 32, 14, 19, 21, 73, 81, 28, 99,170,203,182,204,215, 75, 12,136, 41,225, 67,215,192,108,153, 67,141, 90,111,192,166,
-187,169, 58, 62, 53, 31,212,242,211,251,221,217,151,251, 59,245, 85,191,250,247,106,215,253,243, 23,160, 62,168, 97,140,161, 0,
- 3, 88, 52, 9, 8, 90, 68,151,212,189,211,238, 61,249,244,133, 46,243, 82,103,212,150, 79,139, 92,206, 73, 99, 68,189,124,229,
- 3, 36,104,113,160,123,252, 64, 11,124,156,144, 89, 29,201,199,254, 50,164, 27, 77, 22, 77, 21,204, 28,233,211, 40,110,131,151,
- 66,188,154, 24,118,130,143,151,143, 90,146, 66,127,143,204,203, 19, 13,138,153,170,175, 46,208,134,190,158,109,168,120,181,142,
- 70,207,157,179, 40,140,216,188,127,242,199,202,247,224,242,195,224,195,162, 92,148, 18, 39, 90,197, 6,172,164, 35, 39, 25, 49,
-223,183, 65, 14,182,182,188,193, 61, 24, 67,247,193, 29,106, 11,103, 61,179, 33,101, 21,102, 61, 23, 65,204, 57,124, 71, 14, 35,
-149,150,165,207, 90, 26,121,130,152,160, 64,223, 80,179,233, 0,210,160, 39,125, 4, 66, 79, 35,203,232,194,207, 23,238,235,187,
-235,250,114,187, 3, 72,221, 2, 8,129,214, 8, 46,169,164,100, 3,103,188,147,200,214, 82, 20, 45,183,219, 21,179,149,149, 94,
- 79,178, 22, 92,152,141, 20,189, 36, 67,237, 7, 51,118,152,121,155,222, 68,251,100,102, 14,181, 13, 35, 45, 74, 37,183, 87,104,
- 47,234,104, 66,255, 72,105,218,223,228,246,226,252,188,201,235,227,167, 47, 79, 72,220,228, 94, 87,109, 10,235, 17, 31, 79, 69,
-189,158,143,198,234,169, 63, 80,250, 55, 48,179, 92,143,213, 98,234,123, 66,115,207,103, 18, 86,148, 76,245,152, 47,153, 81,172,
-147,215, 12, 50,118,166,237,253,176,181, 95,124,126,246,224,193,234,236,244, 39,241,203,197,179,135, 23,175,246,254,112, 80,186,
- 85, 99, 14, 68, 34,135, 57, 86,131,146,212, 62, 7, 57,221, 79,169,247,148, 58, 43, 31, 71, 53,214,183, 10,252,214,104, 46, 48,
- 2, 88, 87,150, 42, 16,179, 69, 38,175,163,226, 6, 62, 3, 50,200,139,126, 89, 31,153, 79,190, 9,183, 63,114,237,206,100,141,
- 88,110, 99, 95, 57, 28, 37,186, 9,129,232, 2,176, 22, 93,215,140, 99, 21, 51,154,115, 2, 48, 79,186, 27, 18,166,136,106,120,
- 87, 49, 6, 55,236,168,232,137, 18, 13,208, 3, 49, 68,134, 10,164,250,245,244,247,195,223,158,159,223,185,171,228,163,222, 53,
- 0,124, 97,196,255,149, 98, 37,251,126,105,102,147,131,161, 25,245, 58,223,124,120,246,124,255,217,119, 63,252,122,233,255,180,
-245, 66, 4,211,123, 45,218,209, 83, 39,213,210,127, 0,240,188, 4, 38, 16, 94,142,224, 99,139, 13, 53,132,232,122, 86, 70,122,
- 79, 72,234,174,138, 34,102,205,136,142, 96, 34,173,103, 84, 81,102,170, 48, 64, 33,183,142,192, 73,233,118,239, 68,201,206,165,
-173,121,219,110,202, 70,126,252,248,112,123, 59,108,243, 28, 3, 38,229,133, 62, 56,192, 94,204,199,190, 8, 85,199,108,153, 16,
- 8,245, 71,109,151,170, 11, 53,201,172,147, 78, 22, 94, 22, 21,170,194,131, 7,214,170,107,122, 57,133,140, 86,205, 46, 78, 6,
-216,116, 5,132, 29,105,175,134,158, 84, 84,224,248, 56,124, 21,119,167, 58,113,208,107, 94, 35,242, 26, 43,129, 77, 10, 16, 57,
-174, 70, 21,122, 99,200, 27,128,112,148,102,100,236,205,255, 2,144,116, 45,173,149, 20, 97,180, 94, 93,221,183,251,222,155,100,
-146,144, 24,131, 10,227,204, 48,224, 98, 64, 16, 17, 65,221, 40, 8,238,116, 35,136, 63, 64,252, 89,254, 10, 87, 46, 68,102, 41,
-136, 89,102,192, 71,204,227,154,155,219,143,234,174,170,174,246,156, 54,171,132,144,132, 84, 87,127,231,156,170,239, 59, 71,127,
-247,253,215,120,107,250, 62,177,120,225, 65,199,127,253, 56, 56,185, 27, 93,235,117, 96,163, 76,139, 79,232,171,201,228,242,214,
-140,124,199,167, 7, 91,116,183,131,199,170, 77,212,176,216,135,125, 64, 17,137, 41,187,215,189,231,205,211, 98,237,123,232,129,
- 14,202, 72,150, 5,132,128, 37, 25, 53,133,197, 50,183, 43,117,131, 63,127,152,225,177,220,230, 60,220, 3, 18,161,168, 45,104,
-178, 23, 24, 41,156, 19,106,122, 53, 71, 46,141, 60,152, 70,105, 41,241, 80,115,236,176,169, 81,162,138,210, 75,149,147, 6, 89,
- 58,197,217, 69, 90, 58, 58,123, 24,181,164,183, 89,202, 86, 11, 31,161,233, 41,100,170, 64, 59,164,219,176, 60,110, 31,127,178,
- 56,123,167, 82, 40, 81,215,244,108, 27,250,221, 77, 2, 97,235, 39,206,192,146,100, 57, 77, 75, 31, 94, 82,141,106, 27, 6,195,
-161,120,179,163, 3, 82,108,133,219,137,113, 51, 57, 79, 83,251,224,149,219,162,202,177,171, 13,156,186,233,116, 80, 52,144,234,
-239,241, 44, 12,175,160,246,243, 42,233, 1,168,136,215,128,179,211,146, 71,191,137,173,212,160,231,157,193, 15, 38,188, 66, 59,
-198,230, 1, 67,229,208, 78,206, 41, 19,176, 72,178,158,114,176, 80,206,217, 97,117, 38,181, 6, 81, 43,166,140, 31, 60,156, 29,
- 64,136,246, 56, 88, 76,215,190,144,214, 75,125,240,214,219,143, 94,188, 48, 95,125,219,126,246, 69,122,252,225,214, 22,205,195,
-205,250,246,114,232, 91, 32,168,198,214,233,156,114, 42,239,176, 10,127,238, 55,201, 69,239, 91,253,241,153, 58,175, 95, 94,129,
-238, 13,121,185, 98,202, 44,173, 29, 80,253, 50, 82, 46, 9, 29,109, 81,154,153, 58, 44,217, 11,102, 56,142,175,152, 82,128,245,
-225, 0, 17,228, 96,116, 84,146,110,114, 53,163,151, 98, 77,235,134,208, 1,215,109, 15,118, 22,217,146, 60,228, 60,101, 74, 28,
-235,183, 80,128, 99,159, 20,179,131, 89, 6,233,119,170, 68,145,131, 4, 66, 6,138,242, 76, 28, 61,123,247,231, 77,117,249,215,
-102,177,180,115,198,206,174,209,133,237, 69, 62, 41, 38,163, 69, 41,157,241, 28,232, 48,193,136,245, 36,252,146, 54,137,168, 56,
-204, 55,204, 56,163,198,147, 53, 59, 87,100,105,218,129,217,138, 76, 12,103,106,139,206,245, 52,186,204,101,188,239,192,151,203,
- 33, 49,182,190, 68,125,159,141, 99, 68,216,182,241,236,205,147,167,114,114,193,141, 69, 84, 11, 81,226,215, 28, 37, 91, 40,240,
-180,137,193,199,137, 6, 6,123, 82, 22, 12,202, 20, 10,223, 59,166,111, 14, 48, 74, 52, 16, 16,114,190,124, 99,162, 48, 93, 98,
- 70, 30,105, 16,198, 7, 72,143,249, 86, 44,210,132,136,183, 63, 57,211,205, 81, 45, 57,176, 40, 64,189,141,242,143, 14,170,211,
- 67,128,249,162,125,160,219,102, 17,128, 3,113, 96,142, 37,246,129,109, 67, 70,213,168,122,107,202,222,197,133,171, 86, 99, 13,
-141, 82, 78, 45, 94, 61, 84, 94,233,193,215,218,172,217,180,157, 15, 74, 52,247, 55,226, 86,172,202,211,207, 63, 61,255,230, 75,
-121, 88, 92,244, 63,254,122,249,219,182,190, 10,187,127,148,188, 27,255,159,197,207,106, 10, 27, 6, 60,104,202, 89, 53,205,246,
-183,120, 52,158,174, 19, 17,194,102, 50,206,198,147, 18, 16, 73,132,204, 56, 66, 54,133,165, 98,119,100, 97,195,145, 92, 84,154,
-151,103,207, 63,240,111,188,223,220, 59, 25,106,246,113,249, 9,186,152,253,134,115, 76, 53,255, 21,219,221,169,200, 30,119,144,
-105,159,123,188, 87,100, 17,162,141, 0, 39,219,225, 31, 98,167, 65, 40,125, 86,186, 80, 71,122,173, 27,107, 27,151,130, 75,219,
-205,238,201,235, 79,206,207,219,230,239,235,145,160, 0,176,209,198,209, 41, 91, 77,129, 3,187,161, 63, 61,127,237, 46, 60,253,
-225,167,139,223, 95,253,178,127, 82,230, 99, 14,252,218,173,198,146,169, 46,105,204, 1, 81, 26, 42,140,167,246,108,130, 27,138,
-246,244,163,103, 7,254,230,162,187,138,218,114,212, 76, 52,156,222,164,118, 71,225,200,103,239,175,232,130,183,204, 89,110,234,
-110,183,145,245,117,215, 3, 92, 82,101,243,242,240,120, 42,158,255,145,222,123, 53, 28,135,113,171, 76,135,141, 76,133,150, 9,
-103, 82, 41,171, 56,143,249, 7,208, 61,198,108,229,123,166,212, 93, 27, 44,152, 71, 96,124,175,138, 54,175,171,149,237,219,225,
- 1, 26, 81,107,142,151, 0, 69,141, 2,128, 23,107,118, 71,246,163, 15, 58,106, 20,177,232, 67, 9, 92, 41, 56,233, 34, 19,182,
-177,134,204, 7,184, 75, 18,210, 64, 45,160,242, 57, 65, 30, 98, 76, 47, 5,232, 27, 42,176, 53,162, 23,233, 63, 1, 88,186,154,
- 29,185,137, 48,216, 63,254,105,219,227,217,221,217,236, 2, 18, 68, 44, 34, 72, 32,161, 36, 18, 7, 68, 4, 66, 2, 33,193, 9,
-229, 5,184,113,226,200, 59,241, 0,188, 0, 7,114,224, 2, 71, 14, 81,148, 72, 97, 9,129,221,157, 25,143,221,182,219,221,110,
-170, 12,231, 93,205,104,218,237,250,170,186,191,175, 74,127,251,253,151, 17,148,121,162,197,162,162,169, 64, 51, 70, 51, 10, 91,
- 13,163,162,158,234, 7, 3,162,160, 51,134,105,118, 96,166,179, 31,167, 34,193,195, 47,131,245,169,135,166, 3,252, 50,194,101,
- 49,112,236,217,250, 12, 65,233, 92,127, 56,152,158, 11,217,161, 88, 78, 41,106,145, 46,241, 19,116,219, 72,186,213,112,214, 80,
-154,210, 73,230, 78, 75,198,106, 79,218, 24,186,125, 4,186,236,227,127,150,116,121, 72,241,130,125,140,142, 75, 98, 66, 31, 68,
-207,114, 32,138,101,176, 12,165,117,170, 69, 21,105, 34, 11,192,164,187, 92, 10, 57,158, 58,111,116, 41,215, 41, 24,113,158, 15,
- 38,209, 41,158,145,170, 38,155,142,215,174,190,227,238,126, 14, 37,126, 42,253,170,106, 32,163, 18, 63, 79, 3, 54, 97,240, 86,
-122, 15, 69, 63, 81, 34,106,105,175,162,199, 14, 98, 74, 1,175,212,197, 86,204, 21,251,181,129,105, 32, 59, 28,198, 83,116,111,
- 9, 96, 34,244, 50, 85, 60,161,172, 35, 16,255,168, 30, 29, 35,202, 34, 91,140, 68, 48,120, 54,204,146,214,118, 82, 22,100,200,
- 39, 12,132,192,239,112,250, 40,149,187,150, 7,221,140, 23, 84, 9, 10,189, 77, 18, 16,118, 93,101,235,141,204, 76, 66,102, 93,
-106, 85,228, 80, 72,107,159, 67,155,235, 88, 39,253,192, 84,195,180, 59,153,231, 91,111,221,175,190,120, 24, 63,254, 58,188,255,
-225,203,213,102,110,254,174,119,151,173,125,193, 68,222,137,204,171,164, 25,155,112,208, 40, 0,109,155, 29, 86, 94,237,143,121,
-163, 85,214, 15, 47,158,219,238,137, 91,101,196,175,130,152, 67,243,174, 12,220,148,209,147, 64,114, 94,100,207,139, 7, 28,119,
-210,146, 70, 40,242, 5, 15,192, 35,121, 81, 76, 99,153, 14,208, 13,134, 41,241, 93, 74, 76,135,102,246, 55,216, 45, 52,244, 72,
- 34,143, 74,121,191,102,103,211,201, 30,117,110, 24, 38,190,197,108, 28, 93,211, 42,135,180,182,172,232,184, 3, 44, 92,189,105,
- 78, 62,125,239,167, 23,162,217, 95,175,177,246,118,152, 15, 12, 76, 38,177,116, 88, 20, 81, 70,130,103,106,100, 5,113,236,253,
- 33,160, 52, 4, 14, 76,170,222, 67,112, 4, 19,120,110, 59, 71,229,251, 37,116,135,247,183, 74, 67, 87, 26,254,133, 77,170,156,
- 29,174, 68,217, 69,124, 28,222,136,197, 70,153,184,139, 61,124,126, 36,186,222, 63, 15,235,243,139,179, 11,213,140,186,205, 66,
- 33, 13,128, 44, 38,117,197, 38,177, 66,136,163, 76,158, 68,206, 12,227,193,198, 19,153,222, 38,153,144,195,114,200,174, 24,184,
- 44,152,200, 22,197, 64,159,118, 30,203,248,255,170,216, 18,166, 18,228,255,174,157, 0,255, 66,196,142,172,159,173,134,189,136,
- 37,205,243,199, 75, 83,110,111,157, 84,248, 33, 87,109,209,199,132,182,133,140,190, 1,135, 15, 53, 39, 25, 6,105,134, 44,100,
- 54,160, 98,239,218, 18, 27,149,227,207, 2,216,156,140, 12,179,223, 1,210,228, 21,248,105, 23,207,212,107, 95,125,118,241,221,
- 55,245,187,239, 60, 85,191,254,242,231,207,191,255,117,185,221,118,198,221, 4,181, 15,201, 72,231,213, 0, 45, 71,243, 95,197,
-185, 36,172, 51,164, 59, 45,138, 53,160,141, 23,243,204,163,192, 27,203,145,145,153,189, 98, 46, 82,177,168,121, 69,155, 19, 20,
-252,122, 35, 87, 37,104,172, 57,191,247,209,120,251,193,182,219,123,209,105,149,238, 90,201,151,134,135, 38,114, 4,158,205, 10,
- 36, 59,218,141,191, 73, 10, 48, 37,108,114,118, 12,123,215,106,162, 37, 24,208,216,237,129, 24, 59, 11,252, 26, 18,240,168, 17,
-149,119, 56,128, 80,142, 6, 36,188,158,247,219,195,112, 56,254,224,238,235,157,123,218, 88, 11, 24,237, 1,158,187,224, 90,148,
-241,169,247, 60,209, 62,123,227,193, 15, 63, 14,191, 61,126,116, 90,114,248, 46,110, 5,202, 3, 68,225, 56,197,229, 4,144, 29,
- 66, 88, 54,207,188,112,209, 56,124,242,171,159,220,155,174,255,120,134,170,197, 4,168, 30,228, 65,177, 3, 83,122, 71, 91,139,
-153,233,102, 12,174, 99,190,236,108,134, 52,203,171,252, 44,203, 95,145,229, 29,187,185,255,210,188,253,108, 58,237, 83, 55,228,
-123, 29,193,103, 2,157,185, 56,203,173,115, 16,101,178, 56, 38, 55, 69, 38, 75, 20,216, 10,110, 4,168, 12,109,154,117,206,131,
- 20,255, 51, 3, 23,167,171, 86,237,251, 94,230, 77, 33,161,153,102,230, 55,117,116,146,202,139,130, 46,253,198,133,204,164,138,
-110,197,128, 69,232,102,181, 98, 68, 17, 68,175, 53,199,217,146, 83, 85,128,126, 5,230, 68,129,242,131, 64,225,229,168,236,129,
-231,107, 57, 83, 7,192, 37,254, 21,128,164, 43,217,145,163, 8,162, 85, 89,153,181,247,116,207,230,217, 48, 99,201, 66,136, 11,
- 22, 2,201, 71, 16, 39, 44,241,181,220,248, 1, 64, 22, 66,248, 0,226,100,236,182,140,177,103,166,167,187,214,172,202,141,247,
-154,107,119,151,186, 42, 43, 35,226, 69,100,196,123,114,178,130,228,217, 33,223,172, 66,118,231, 60,238,136,220,220,166,203, 17,
- 90, 87,113, 51, 68,233,135,113,135,164,214,195,143, 25, 0,127,107, 68,143, 29,100,144, 87,204, 19,153,136, 53,214, 6,215,119,
- 81,175,136,110, 0, 37, 84,174,246, 82,176, 36, 87,109,125,161, 99, 91, 69,137, 50, 3, 1,249,232,211,229, 56,145,242,173,239,
- 26,151,145,104, 11,107,192,142, 43, 53,241,160, 67, 99,155, 37,120,171,198,187,212,250, 70, 38,135,108, 62,246, 20,186, 76,210,
- 67,159, 57, 30,251, 9, 13,132,223, 14,129, 39, 56,108,121, 73,106,228,125,164, 21,212,145, 60, 65, 8, 46,253, 4,131, 35,127,
- 78,238, 1,218,106, 83,140,196, 88,136,222, 99, 24, 94,166, 99, 60, 93, 62, 25,190,127, 82, 53,235,195, 23, 63,248, 63,127,223,
-189, 90, 55,247, 25, 0,223, 72,106,225, 20,222, 66,180,190,194,109,104,188, 99,171,200,118, 16,193, 29,135, 27, 74,254,197,166,
- 40,150, 54, 12,113, 40,128,124,217, 88, 30,239,105, 11, 96,176, 54,137, 21,231,233, 21, 76, 36, 67,224,106,217, 79,149, 79,123,
-162,170,135, 46,157,128,236, 99,233,169, 4,144,164, 81, 7,175, 22,202,228,216, 32,152,113, 72, 66,198,209, 5, 2, 12,103,118,
- 40,161, 66, 58,156, 88,151,164, 67,144,141,208, 21,124,214,136,189, 1,144, 92, 44,220, 97,118, 61, 60,253, 42, 58,185,218, 93,
- 62, 21,245,202,223, 32, 65,188, 3, 40,178, 70,182,162,226,120,141,233, 17,241,228, 56,184, 32, 53,217,153,198,164,169, 26,108,
-199,182, 54, 65,108,116,251,217,233,121, 61,189, 93,251, 94,120, 96,223,132, 12,141, 53,144,169,231, 32, 26,172, 25,120, 25,254,
- 10,123, 54,161,148, 48, 11,202,196, 35,150,172,121, 8,229,130,188,219,148,127,213, 36,242, 84, 29,115, 65,215, 91, 32, 21,101,
- 41, 76, 60, 3, 75, 86,177,185, 97, 49, 15, 17,185,115,243, 1, 91, 97,221, 52,177, 64, 95,179,159,246,255,118,248,168, 72,162,
-222, 80,234,172, 56,138, 22, 71,167,157, 45,154,215,239,202,222,139, 11,229,103,105,151, 10,127, 1,159, 50, 28,251, 77, 16,199,
- 91,142,134, 58,195, 19,124, 44,187, 41,133, 50,226,214,198, 85,142,235,103,231,246,166,202, 74,189, 20, 41,126,105, 23, 86,234,
-193, 96, 91,122,149, 34, 63,195,163,205,198,170, 48,151, 75,103,144,126, 79,112, 93, 76, 10,224, 25, 67, 66, 88,149, 21,209,240,
-246,239, 31, 87, 23,159, 94,159,101,187, 6,175, 74, 29,193,190,114,206,254,151,212,178,137, 42,191,215,120,192, 79,225,220,207,
-201, 77, 35,183,172,213,114, 0, 7, 43, 45, 41,226, 38, 89,172,163, 36, 3,117,121, 2,107,112,228,204,141,247,196,232,130,112,
- 62,217, 31, 38, 4, 77,156,236, 74, 50,182,113, 6, 32,229,188,107,171,243,244,215,199, 15, 79,206, 30,124,241,215,250,248,213,
-251, 77,172,122, 83, 91,201,154, 95,209, 32, 1,183,209,208,181, 64,162,163,183,205,187,253, 32,148,105, 7, 25,215,166,239,123,
-127,191,157,245,152, 47,203,171,103,223,201,175,191, 52,153,122, 29,125,120,115,247,219,250,254,229, 6, 78,165,221,228,243,142,
- 37,101,106, 30,212,100,211,116, 35,208,130,141, 57, 13, 68,154,169,182,145,213, 28,108, 22,188, 98,193, 45, 65,204, 45, 18,137,
-199,193,115, 85, 18,155,152, 3,136,142, 2,169, 7,137,182, 69, 41, 22,161,170,203,213, 39,159,235,235,111,255,213,189,208, 0,
-151, 19,236, 83,150,156, 33,142, 92, 6,207, 99, 16, 27,122,183, 27,118,249,209,198, 41,217,246,236, 55, 13,134,220,194,190,136,
- 69, 71,244, 13,227, 50,198,213, 7, 0, 18, 73,243,222, 14,117, 82,168, 41,169, 0,211,162,113, 27, 52,188,237,105,246,211, 31,
- 47,190,121,249,236,108,245,160,185,221,132, 62,168,145, 13,186, 62,119, 19,112,223, 48, 93,156,127,252,203,157,251,249,159,231,
-114,129,133,173,198, 86,237,210,176,112,115,181,139, 91,198,110, 88, 92,106,225,196, 39, 54, 99,123,164, 14,122,122,124,181, 40,
-252,122,230,252,107, 78,141,117, 99,145,147, 97, 63, 36, 43, 58, 80,133, 79, 82, 42,199,137,226,224, 50,251, 72,156, 63,178,217,
-229,152, 46,135,179, 19, 77,190, 24,152,212, 22, 40, 34,237,166,184, 58, 36,177,170, 87, 21, 64, 68,213,249, 22,254, 57, 76, 2,
- 14, 31,208,112,156,210, 64, 10, 6,164,131, 25, 76, 15, 89,190, 56, 74, 30,157, 87,117,109,117,126, 58,227,235,187, 27,191,141,
-250,231,205, 27, 29,110, 43,175,125,234, 50, 36, 57,228,237,233, 15,236, 98,152, 84,230, 41,240,145,185, 84, 68,242, 30,219, 90,
-205, 9,194,141, 31, 99,197, 83,175,237,104, 15,162, 28, 24, 10,112,215, 91, 83,215, 34,145,117, 23,108,184, 85,247,101,168,138,
-249, 63, 1, 72,186,150, 29,201,105, 40,106, 39,206,203,169, 84,186,139,110, 26,122, 80, 75,205, 48, 60, 52, 98,129, 52, 72,204,
-134, 29, 27,196,239,242, 1,179, 98,195, 6, 16, 45, 36, 52, 61, 51, 13, 20, 51,253,170,174, 74, 85, 98,199,142,205, 57,197, 15,
- 84,197,137,239,189,231,216,247,158,195, 81, 89,222,254, 5, 61,110, 54, 37,232, 71,145,218,137,250, 86,110, 64,166, 5, 20,158,
- 86,107, 67,131, 81, 96,177, 48, 74,203, 49, 36, 26,212,187,253,164, 88,166,214,156,113,113,134,221, 73,117,204,130,237,172,226,
-245, 59,128, 82,239,202,156, 13,167,206,166,150,205,203, 60, 87,172,166, 66, 36, 3,234,185, 49, 0,123, 37,160,186, 72, 55,233,
- 0,112, 32,203,224, 84,113, 32, 63, 16,168, 66,178, 1, 57,247,236,145,160,142, 80,224,196, 55,182, 11,229, 32,240,101, 82,192,
- 90,138,185,132,230, 16, 81,155, 25, 79,181,239,130, 22, 90, 41, 72, 1,106,137,228,168, 3,138,138, 22,142,210,220, 32, 56,192,
-212,216,168,125, 85,112,222, 19,172, 58,238,236,205, 13,104,181, 57,126,106,190, 59, 43,190,186,126,239,242,197,252,231, 95,147,
-127, 95, 47,183,183,214,250,194, 68,148,168,109, 39, 50, 27, 34, 29,219,167, 98, 63,216, 72,179,220,210,143, 10, 96, 35, 45,242,
-169, 57,140,118, 67, 33,151,148, 58,168, 9, 95, 82,160,181,116, 58, 97,231, 51,227,203, 38, 51, 58,220, 3, 2,105, 58,142,226,
- 89, 41,183, 81,199, 30,105, 44, 43,154,118,140, 83,182,167, 1, 41,178,186, 87, 46,211, 50, 31,149,244, 33, 89,140,101,174, 7,
- 30,222, 7,197,121, 89,239, 10, 94, 72,214,135,243,246,248, 84, 62,126, 38, 78,191,233, 78,207,157, 25,132, 93, 53,247,191, 8,
-219, 42, 21, 75,124,215,217,218,248,249,193, 78, 75, 55,178, 11, 11,168, 91,186, 18, 1, 81,225, 7, 70,211,251, 34,197,227,199,
-172,187,251,172,125, 63, 79,140,159, 37,238,193,129,203, 41,192, 29,202,160,168,162,151,170, 44, 67,203,169, 22,202,114, 97,205,
- 45,165, 79,217, 66,224, 19, 10,192, 78,244,144, 12,236, 99,158,120, 76, 35,188, 25, 20, 34, 59,136, 9,156,244,127,135, 66, 19,
- 99,190,162,131, 21,165,216,146, 17,223, 14,208, 83,121,203,105,110,203, 51,139,116,111, 25,136, 10, 90,130, 22,163, 4, 38, 76,
-134, 85,147, 93,117,243,238,237, 95,224,171, 85,202, 28,211,122, 79,208, 48,234,164,147,199, 33,205,236,198,225,139, 6,138, 49,
-103,186,161, 62, 32, 13,218,167,170, 10,201,146,183,215,114, 70,250, 10,246, 4,180, 61,137,114, 55,243,226, 40, 13, 15, 5,157,
-146,115,153, 83, 21, 22, 47, 60,221,154,168,172,219, 91,159, 5,213, 90,205, 1, 13,217,247,169,170,105, 70,127,253,106,123,245,
-241,233,227, 69,222,197, 77,210, 46, 98, 6,186, 40,121, 24, 84,228, 60,159, 65, 29,160, 11,204, 1,229, 20, 28,103, 21,104, 34,
- 19,105, 75, 44,196,157, 0, 29, 37,105, 83,130, 93,105, 91,165,106, 90,178,160, 42,170,125, 99, 49,145, 36, 15,139,120,111, 11,
-186, 4,236,138,194, 73, 92, 76, 53,172,148, 90, 42,165,117,247,210,191,153,105,247,236,201,211,147,131,143, 46,151,237,203,181,
-170, 2,234,180,208,116,201, 66,133,225,124, 29, 94, 74,147,115,232,217,107,181,234,135,113,189,187,235, 22, 71,213,201, 15,207,
-243,111,159, 79,117,133,204,254,207,230,247,229,187,203,110,186, 49,170, 40, 37,234, 67,196, 63,110, 85, 42,122, 16,228, 64, 57,
- 58, 80,248, 41,166,148,193, 67,178, 96,163, 42,224,187, 50, 41,105,133,141, 19, 22,176, 55, 13, 1,123, 13, 88, 7,253, 1,232,
- 96, 39, 43,188, 6, 89,233, 89, 86,205, 50,125,122,222,157,125,189,150,218,173, 47,154,185, 68,232,210, 8, 97,218,223, 8,211,
-225,225,129,110, 94,224,239, 57, 82, 34, 22,145,184,120,189,141,123, 42,179, 77, 50,225, 87,228,132, 99,230, 43,103,205, 29,138,
-122,225,230,165, 4,194,117,136,117, 64, 43, 73,246, 80,108, 81,141,228,189,127,123,241,114,247,228,123,173,111,227, 8,218, 33,
-120,197,238, 31,162, 55,147, 90,164,230,104,241,211,143,203,109,255,238,164,173, 6,236,136,202, 87, 8, 90, 71,115,167, 34, 3,
- 76, 20, 99,240, 8, 35,101,205,222, 98, 22,108,243,240,211, 47,142,131,184,160, 21,100,198,163, 71, 17, 84, 94,136,225,222, 59,
- 19,171,138, 22,158, 89, 93, 45, 30,205,195,226,115,159,159, 47,203,122, 64, 2,159, 54,118,123,165,145, 87,107,196, 46,187,134,
-251,140,202,250,243,168, 70,110,167, 29, 7,128,170,218,251,129, 77,219,134,158,155,211,100,123, 90, 66, 45,114, 35,190,172,244,
- 39, 31,202,179,195, 55,229,201,159, 2,248,179,224,211,137,208, 10, 51,255,237,213,163, 23,151,231,127,220,221,190, 28,254,110,
-178, 78,243,116, 34,167,206,164,124, 8, 90,201, 66,154, 77, 16,138, 22, 91,160,217,148, 75,177,222,249, 88, 78, 72,140, 49, 73,
-237, 16, 16,253,202,246, 53, 48, 79,143,213,149,174,174,196,124,179, 18,137,254, 79, 0,146,174,101, 71,142, 26,138,186,108,151,
- 93, 85, 93,221, 61,157,153,204, 3, 37, 65, 3,100, 17,134, 89,160,145,178, 96,197,130, 61,223,192,159,241, 25,172, 88, 32,177,
- 64, 40, 72, 44,144, 18,146,129, 4, 33,230,145,164,167, 95, 85,126,148, 31,220, 83,217,181,212, 82,171,203,229,123,239, 57,246,
-189,231, 72, 76,142,227,252,205,207,253, 14,110,127,185, 87, 16,164, 66,191,144,233,222,231,186,245, 25,138, 91,202,184, 33,244,
- 66,212,178, 99,166,240,202, 72,140,228, 91, 75,212, 96, 7, 59,204, 18, 50,159,137,217,173,145,133, 21,205,100,189, 50, 98,191,
-245,193,229,106,170,150,193, 29,121,226,119, 93,175, 96, 3, 52, 36, 19, 74, 8, 97,235,188, 99, 70,150,177, 46, 49, 58, 80, 18,
- 83,171,179, 39, 12,209,239, 32, 67,150, 38, 1,230,124, 56, 88, 26,229, 58,179, 86, 86,247,112,186,233,129, 64, 84,244,140,128,
-182, 80,200,189, 3,238,198,169,154,204,117, 70,142, 41,178,161,116, 86,210, 82,164,176, 99,109, 86,112,178,197,113, 34, 1,165,
-154,254, 46,163, 92,218, 90,191,190,121,206,139,198,207, 63,218, 60,253, 78,126,121,167,175,255, 56,253,243, 87,245,234,217,219,
- 55,111,232,173, 64,109,123,240,197,128,126, 5,130, 72, 85,155,160, 86, 51,129, 20, 14,198,180, 35, 44, 41,160,187,173, 41,190,
-113, 35, 74,219,179, 38,124,214,150,134,232, 77,225, 92, 69, 69,133,171,200, 26,207, 58, 72, 13,103,171, 50,101, 16,193, 69,139,
-154, 75,245,182,218,241,162,158, 18, 33,160,154,164, 37,109,189, 38, 38, 13,223,249,168,188,137,220,180,253,108, 77,127, 54,233,
-121, 49, 59, 58,105,142,159,172, 63,185,216,220,255,204,197,137, 9,157,184,122,177, 7,145, 90, 21,226, 36, 64, 68, 13,233, 25,
-106, 52,156,243,102,216,249,186,169,124, 40,253, 42, 97,122,196, 15, 13,163, 55, 64, 59,217,174,118,153, 15,135,247, 79,238,153,
-213,213, 50,250,185, 46,209, 62,203,247,232,171, 17, 82, 19,186,198, 85, 4, 61, 25,107, 56,101, 46, 34, 82,195,136,195,198, 26,
- 71,193,138,187, 55,220,181,209,146,163,153,184, 31, 66, 43,107,202, 7, 27, 40,164, 88, 47,204,144,209,254, 79,161, 91,229,194,
- 36,136,205, 6,185,133,164, 18,186, 43,167, 99, 38, 36, 48, 56, 54, 43, 49, 12, 76, 10,136, 65,228, 3,118,124,188,248,193,244,
- 70,186,217,172, 31,176,198, 10, 82,158,169, 34,212,226, 43, 89, 89, 90, 24, 93, 52, 68,246,121,142,166, 37, 62,216, 17,240,230,
-199, 60,109,104,203,207,224,239, 72,228, 18, 18, 35, 68,213, 32, 89, 75, 40,139,151, 4, 83, 26, 94, 19,230,182, 12, 45, 7, 77,
-150,180, 28, 49,176,169, 46,186, 48,118,193, 23,157,195, 16, 66,131,115,240,196,142, 7,183,101, 63,253,155, 79,159,156, 76,173,
-115, 74, 6, 77, 89,154, 66, 58,160, 39,142,248, 8,225,198,250, 1,156,191,242, 82,240, 69,132,205,196,128,243,153, 15, 40,254,
-131, 56, 52, 33, 95,162,141,148,102,160, 81, 47,100,116,193,143,131, 15, 18, 82, 3, 49,110,233,129,115, 76,240,237, 19, 91,200,
-227, 17, 0, 33, 88, 51,250, 28,230,220, 82,161,180,219, 91,173,239, 30,158,124,122, 56, 63,229,255, 28, 93, 94,205, 66, 94, 82,
-144, 76, 74, 21,171,206, 18,236, 88, 49, 56, 8,248,213,202, 66,244,249,236,209,193,233,193,193, 87, 23,166,110, 94,178,155, 43,
-243,243,237,250,189,179,111, 7,177,133, 73, 89,236, 50,206,195,225,216, 51,206, 91, 16,166,237,153, 68,195, 36,247, 96, 17,144,
- 9,170, 18,155,211,167,154, 30,114,236, 52,176,101, 3, 77, 44,248, 18, 22,165, 82, 54,193, 93, 68,115, 51, 97,165, 30,164,208,
-250,164,223, 63,124,156,191,248,250, 29,159,243,119,175,139,186,165,232,138, 29, 1, 22, 98,192, 6,221, 76, 97,183,102, 43,153,
-234,140, 28,202,243,206, 19, 55,119, 40, 20,140,173,119, 65, 82, 96, 18, 62,136, 21,108,187, 44,133,167,156,250, 91, 43,139,132,
-217, 34,195, 41, 47, 12,201,186, 81,171,145,167, 59,167,235,244,251,139,155,111,191, 89, 88,166,123, 76, 81,135, 97,153,122,140,
- 64,199,195,143,235,101,124,112,121,253,188,152,164, 97, 2,179,106,140,138,240, 98, 45,106,250, 49, 61,228, 86,140,230, 13,165,
-218,210,123, 15,172, 75,177,217, 44, 30, 78,183,203,219,255,242, 80, 18,250, 22,196, 52, 26,194,147, 10, 94, 43, 51,220,234,242,
-123, 4,220, 31,172,246, 47,174,197,180,232, 76,182,127, 11, 93,150,186,138, 83, 77,140, 51,120, 88,130, 49, 8,215, 55,206,139,
- 70, 66,141, 54, 83, 9,183,104, 67, 43,146,130,167,180, 50,155,174,201,195, 66,170,197,249, 94, 56,155,189, 94, 84,191, 49,241,
-151,187,185, 89, 93,142, 55, 67,132, 72, 59,159,171, 98,190, 55, 63,255,188, 60, 63,123,180,222, 60,254,254,151,167, 63,190,124,
-230,154,126, 15,150,100, 16, 38,118, 84,255,186, 4, 93, 16,248, 87,173,101, 22, 20, 13,182,198,181,147,225,201, 21,169,118, 20,
- 34, 69, 93,244,188,162, 52,146,120, 86, 2, 30, 85,142,128,225, 42,176,255, 5, 32,233,218, 90,219, 56,162,240,206,204,206,204,
- 94, 36, 75,178, 90,219,169,141,237, 80, 2, 46, 9, 4,210, 62, 5, 74,251, 82,242,115,250,123,250,119,250, 84, 40,133,150,166,
- 16,218,138,134, 24, 91, 68,177,236,232,178,151,185,247,124, 27, 61, 46,210,174,102,103,230,156,243,157, 57,231,251, 80,171, 76,
-225, 24,218,246, 57,223, 73,139,149, 24, 82,247, 49,210,189,187, 29, 27, 88,132,189, 55, 22,116, 78,145,124,114,199, 65, 88, 68,
- 23,105,170, 8, 62, 49,195,233,199, 78,119,197,110,172,202, 44,229,132,129, 37,223,140, 92,102, 56, 79, 21,106,144, 55,118,103,
-123,185, 70, 30, 56,113,191,209, 97,234,200,208,150,202, 21,228, 29, 20,248, 94,132, 75, 80,242,160, 71,246,178, 1,141, 32,244,
- 25, 2, 20,223, 61,189, 67,233,135,234, 50,164,179,179,208,149, 53,253,239, 56,112,160, 98, 35, 85,228,250,245,192, 56,219,129,
- 10, 82,162, 56, 15, 60,168,130,174,208, 8,106,244,121,131,232,144,118,155, 82,136, 56, 9,222, 16, 2, 41,123, 46,164,130, 14,
-159, 14,182,111,110,220, 54,136,226,112,117,242,146, 95,254, 80,124,183,170, 23,127,141,223,254,214, 92,255, 26,205,214, 92,239,
- 93,247, 49, 11, 5,180, 51, 53,131,105,163,145, 41, 2, 37, 90,139,172, 71, 19, 49,164, 61, 17,135,161, 42, 34,171, 9,152,145,
-153,148, 52,197,156, 28, 68,172,152,231,108, 20, 56, 65,167,141,149,249, 28,124,161,214, 72, 83, 64,151,160, 12, 20, 87,102,165,
-206, 93, 14,242,116,104, 17, 57,231,113,110,193, 71, 61,171, 89,154,156, 30,217,179,171,244,248,233,118,246,100, 51, 58,217,154,
-192,214, 43,197,222,105, 89, 21,132, 10, 19,141, 97, 32,179, 83,168, 69,235, 57, 50, 3,185,133, 4, 1, 77,139, 75,113,199,107,
-189,141,133, 88,167,142, 92, 32,173, 0,166,130, 18, 50,156,231,163, 43,249,208,136,141,146, 99, 30,125,236, 68, 56,144, 56, 19,
- 68,139,176,129,143,232,200,136, 7, 63, 1, 51,123,238,243, 65,230, 15, 73,121, 48,145,180, 9, 85, 31,209, 69,111, 66,171,154,
- 93, 50,169, 47, 26,110,218,208, 5, 73,118,159,158,132, 12,113,203,102, 93,234,154,104, 6,253, 43, 1, 82, 66,240, 26,144,161,
- 67, 89,186, 24, 8, 14,134,250,153,220, 37, 59,201,202,121,229,243,203,215,111,150, 77,204,167,233, 17,255, 64, 80, 50,107, 14,
- 1,227,200,196,186,214,131, 4, 6, 28,164, 50, 38,123, 64, 91,209,145,161,108,147,214, 49,151,180,201,122, 90, 36, 18,185,187,
- 84,230,166, 32,208,150,151, 93,182, 31,184,247, 65, 23, 97,201,129, 66, 3,196,164, 52,214, 2, 9, 77, 10, 43, 43,238,188,106,
- 51, 73, 64,144,239,178,112, 96,131, 85,135, 52, 33, 90, 44,110,214,111, 46,167,207, 62, 63,102,178, 5,135,148,130,222, 91, 72,
-150,214,148, 80,199,224, 27, 9,251,129, 35,118, 80, 52, 39,239, 10,105,168, 79,167,198, 45, 52,230, 57,184, 97,144,108,255,164,
- 42,135, 80,184,224, 4,204, 96,190, 53,156, 91,114,129,190, 25, 37,144,141, 31, 72, 36,224, 24, 42, 36,229,161, 32, 82,210,139,
-182,253,134,153,223,245,232,238,219,171,203,171,249,197,226,237,103,127, 46,205,251,187,135, 40,214,150, 2,170,189,219, 59, 94,
-132,163,111,206,212,247, 95,155,147,115, 50,106,139,108,123,211,252,178,220, 47,173,217, 24,176,140,116,142,160, 54,159, 15, 2,
- 40, 1, 71,251, 30, 62,140,161,115, 4,125,102, 89,214, 70,178,102, 91,224, 19, 10,243,224, 24, 51,131,218, 93,200, 80,208,255,
-133, 24, 11,133,181, 25, 45, 24, 77,240,154, 19,238,214, 21, 58,236,108, 49,203, 15, 78,207,204,197,171,149, 58,235,236,146, 3,
- 26,214, 94, 52, 66, 90, 47, 64,194, 72,129, 29,130,120, 49,115,170, 23, 61, 1,124, 90, 22,116,107,137,137,100,130,246,191,173,
-146, 37, 87,142,222,153,106, 47, 65,117,139,188,184, 9, 61, 10,170,138,212,146, 53, 54,145, 98,146, 6,165,173,112, 16,185,188,
-243, 55,153,122,126,172,228,173,104, 80, 88, 41, 83, 65,227,203,237,232,100,242,199,173, 93,154,119,245,148, 19, 58,115, 29, 91,
-129,250, 58,211,193, 87,154,181, 37, 3, 52,222, 58,149, 19, 38, 38, 96,109, 30,246,221,139, 39,179, 47,142,238,255,254,183, 87,
- 93,137,118, 45, 20,255,147,225,202,242, 34,176, 73, 40, 68,125,116,254,213,189,126,124,219, 22,235,176,152, 31, 98,233,120, 85,
- 83,116, 86,119,198,143,235, 56,144, 1,131,150, 70, 57,136,110,198,135,196,198, 81,241, 54, 53,149,107, 24,217,199,144,111, 41,
-250,213,233, 80,140,158, 62,186,253,178,248,217, 53,255,109,222, 55, 13, 84, 75, 11,156,107,167,134, 77,147,179, 40,145,222,116,
-247, 15, 43, 50, 85,183,147,139,127,126,124,245,242,197,233,217, 79,175,251,213,135,235,217, 60, 74,180, 52,203,196, 91, 6,128,
-129,146,188,228,233,145,157, 33, 7, 31,184,214, 40,164, 22,163, 81, 40, 66,187, 66, 7, 80,198, 29,193,115,102,233, 67, 38,118,
- 74,251,249,127, 1, 72,186,182,221, 56,138, 40,216,247,153,217,217, 89,123,125,141, 34, 8,146, 19,146, 88,130, 7,120, 10, 72,
- 60,240,153,252, 7,127,129, 16, 8, 17, 33, 5, 97,129, 99,236,128, 47,235,221,217,185,118, 79, 55, 85,203,235, 62,204,206,229,
-244, 57,167,186, 79, 85, 25,213, 83,210,101, 26, 58,141, 94,187, 71, 19, 76, 48, 78, 45, 59, 69,177,114, 55,162,147, 66, 88, 34,
-235, 4, 77,213,131,184,222,118, 8, 1,141,244,182,226, 9,204,195, 48,238, 5, 84,224,206,212,109, 59,186,118,176,104, 72,237,
- 61,165,161, 99,187, 18,139,224,245, 20,247,173, 10, 93, 48,114,140, 77,190,205,212,214,200, 37, 96,159,161,109,101, 78, 87,244,
-222,233, 76, 84, 21,176,226,212, 71,242,152, 29,238,110, 52,153, 50, 59,253,186, 52, 20,162, 48, 0,222,148, 81,163, 78, 6,113,
-185, 20, 89, 86,164,109,235, 12,194,138,204, 78, 58, 67,113,243,135, 35,181, 59,179, 20, 64,119,170,150,210, 61, 43,225,107, 20,
-129,202,171,124,152, 18, 79, 6,204, 68,163,207, 12, 0, 95,116,222, 91, 74,167,218,238,214,168, 60,186,217,234,236, 11,241,226,
- 77, 62, 60,236, 79,117,253,219,187,229,191, 63,235,237,125,119,241, 75, 79, 89, 84,132,238, 34, 54,205,196, 33,169,128,242,100,
-235,144,102, 69,105,177, 52, 12,190, 31,121, 22, 78, 69,224,143, 73, 12,198, 22, 69,232,103,162, 88, 79,227, 76,155,143, 92,114,
- 22,216, 74,207, 98,238,100,176,181,108, 45,121,157,104,195,187,109,238, 76,202, 22, 11, 93,103,149,204, 14, 94,136,147, 79,253,
-226,164, 62,122,117, 57, 63,213,168,162,253,170,108, 46,144, 28, 74,250, 63,149, 58,153,136,235,139, 66, 24, 32,138, 14,203, 24,
- 16, 89,247, 36,229,175,181,205, 41, 23,237,236,106,154,201, 6, 72,118,205,181,237, 99,149,109, 67, 67,137,192, 77,247,228,217,
-190,177, 87, 67, 98,218,166, 44,143,229,190,128,172, 4, 82, 77,152, 34,170, 69,178,154,242,182, 0, 17,185,198,139, 70, 16,135,
-222, 27, 50,201, 84, 2,246, 10, 67,172, 7,154,239, 20, 94,174, 73,175, 28, 58,128,138, 4,136,224,209, 48,142, 0,249,168,171,
-234,142,244, 37,220, 25,197,164,149,244,104,202,226,200, 74,109, 34,147, 11, 82, 31,133, 10, 45, 71, 95, 0,207,150, 65,172, 78,
-170,225,207,235,188, 32, 47,151,126,159, 89,160, 61, 47,234,145,178, 74, 54,213,158,238, 40,212, 28,219,224, 57, 85,101,157,198,
- 67, 34,103, 2, 11,123, 87,116,131,137,126,203,249, 25,153, 13,162,108, 51,145,111, 55,168,223,193,234,109,246, 64,101, 80,252,
-181,141,222,235, 61,211, 69,159,167,126, 52,182, 45,166,101, 35,199, 94,207, 75,212, 56,239, 20, 94, 33,214, 79, 4, 16,191,216,
-148,159,157, 43, 84,173, 88,204, 83,166, 40,228,137,170, 49,251,152, 2, 54,169,213,220, 73,247,220,144,241, 57, 21,173,200,215,
-178,220,165,137,129,218, 21, 26,189, 23,167, 87,249, 11,109,163,201,229,154, 40,246, 33, 38, 14,255, 11,189,179,152, 18,228,185,
-203,255,121, 95,114,202,118,147,242,158, 78,129, 28,133,197,245,247,162,104,186,199,107,155,173,142, 15,239,143, 15, 62, 57,107,
-170,119,239, 15,175,174,231,119,119,166, 80,253,211,167,251, 95,158, 95,157,190,186, 19,233, 31,113,121,121,247, 97, 43,234,174,
-125,223, 11,222,130, 65,185,150,251, 40,133,150,115,165, 19, 5,170,128,193,228,134, 71, 31,220,236, 76, 98, 61, 26,160, 45,252,
-223, 40,201, 84,162, 52,209,206,222,171,209, 42,239,137, 83, 17,195,142,122,133, 52, 28,138,115, 58,246,145,100,109,130, 45,204,
-225, 97,229,143,190,189, 41,207,250, 15,127,196,140,226,184, 7,177,169,101, 55,116,248,214,222, 50,169,232, 73, 54,121, 0,100,
- 87,200, 47,104,190,100,103, 67, 15,100, 45, 44, 77,190,210, 35,137,128,174, 66,255,181,161,198, 56,143,116,200,144, 71,134,167,
-217,129,229, 22,120, 12,247, 93,164,215,105,162,183,189,153,154,219,235,191,215, 95, 63, 57,118, 55,155,122,188,145, 3,226,166,
- 31, 76, 38, 85,249,242,237, 79, 94,182,141, 91,204,185,143,108,211, 49,190, 9, 71,114, 57,107, 10,120,139,196,224,104, 24,150,
- 81,241, 31, 63, 13,135, 95,189, 62, 50,205,175, 35, 2,236,212, 33, 92, 17,161, 99,165,212, 50,164, 71,183,151,242,226,228,217,
-205,236,249, 95, 77,163,202, 30,201, 13,217, 81, 91, 44,111,128, 90,244,190, 29, 96,123,158, 87, 60, 78,113,145, 4, 28,210, 44,
- 11, 52,119, 64, 55,121,155,211,255, 5,160,212, 59,157, 94,190,182,237,217,236,135, 42,188, 93,221, 94,141, 44,114,149,118,189,
- 68,138,147, 29, 18,210,244,168,118,222,246, 46, 41,158,199,180,177,242, 23,125,185,252,254,155,211, 55,214,125,254,221,143,231,
-183,195,239, 7,102,164,187, 64, 4,218, 75,222,140,128,186, 0,166, 94, 84, 74,143,179,201,175,106,244,150,120,169,163,121, 96,
-115, 57,150, 3, 61, 59,144,238,154, 12, 64,100,136,232, 60,194,127, 2,176,116, 45, 61,114,212, 96,208,207,126, 79,207,238, 44,
- 44, 36,104,115,131, 68,202,141,135,196, 29,142,240,187,248, 81,156,185,113, 64, 28,144, 34,180, 17, 73,128,176,203, 62,123,250,
-101,187,221,166,170,197,125,164,177,218,118,185,202,159,191, 42,163, 52,142,207, 12, 31,216,207,155, 77, 58,126,215,185,144,198,
-213,249,110, 28, 64,142,151,132,163,116,225,163,107, 76,207,216,219, 7,223,239,243, 86,251,101,212, 88, 25, 67,194, 54, 60,234,
- 96,102, 94,127,211,127,205,117, 75, 5,178,155,133,149,165, 13,118,209,230,179,192,161, 86, 27,190,197, 15,102,189, 45, 99,169,
-141,122, 24,229,206,140,131,169, 22,224,164,211, 80,142,188,148,209,224,160,180,231, 95,188, 46, 30, 1, 37, 69,252, 80,100, 61,
-219,155, 3, 52, 58,241, 43,145,150,128,122,177, 0, 56,174,123,191,214, 89,118,116, 18,250, 18,235,211,156,249, 9,252, 87,130,
- 48,106,124,105, 73,255, 2,149, 49,117, 15, 18, 24,202,207,217, 45,155,194, 50, 75, 0,235,217,242,225,190, 46,102,134, 34,105,
- 76, 73, 31, 24, 24,214,167,241,159, 5, 90, 95, 29,250,170, 29,191,252,166, 48,223,237,213, 32,254,122, 3, 42,115,232,126,181,
-239,222,186,171, 87, 82,122, 19,124, 8,192,204,114, 6,111, 52, 15,251, 37,176, 26,154,180,203, 26,147, 87,162,187,119, 6,136,
- 98,170, 67,164,195,235, 20, 44, 88,110, 90, 99, 3,214, 70,167,240, 90,236,151,234,169,108, 58,123, 90,151,126, 74,250,160, 63,
-254,106, 57,185, 24,204,233, 44,243,235,234,228, 81,167,108,184,149,247,175,155, 37,219, 1,154,242, 84,251, 18,167,128, 91,200,
- 99,243, 29,107, 54,236,169, 73, 0, 73, 96, 86, 70,135,108, 15, 66, 30, 37,100,138,140,174, 80,204, 63,182,133,163, 17,216, 53,
-214,105, 62, 96,183, 2,251,253,167, 77, 33,143,151, 30,236, 25,195,101, 65,220, 24, 72,215,173,237,153,121,186,108, 54, 85,140,
-194, 51, 12,118, 19, 35, 67,106, 5,139, 5,150,241,195, 6,228,126,197, 58,199,153,239, 40,254,248,178, 66,200,100,140, 25, 58,
- 38,241,237, 50, 38, 44,152, 41,110,151,246, 33, 12,153,152,217,234,238,198,173,178,170,196, 76, 51, 52, 66,140,220,174, 36,116,
- 33, 30, 91,241,252,196,222, 9,128, 72, 86, 87,208,223, 74,230, 52,188, 86, 56, 29,176,131,245, 56, 2,226, 3,211,179, 0,152,
- 77, 38,170,106,197,217, 40, 45,152, 74,142,209,176, 49,229, 0, 77,101,161,214,135,193, 22, 5,150,178,199,255, 86, 19,184,197,
-138,207,132,239, 95,224,200, 96,231,161, 52,224, 32, 96,162,160, 11,138, 14,114, 53,237,168, 28,214, 72,222, 97,167, 85,166, 29,
- 43, 45,123,170,212,121,115,217, 47,141,165,194, 1,125,146,229, 30,210, 67, 71,136, 52,246,213, 71,134,104,180,130, 54, 67, 11,
- 43,165,116,146, 93,232,178,130,225,219, 97,187,189,226,125, 7,115, 54, 98, 16,140,125,197,216,221, 22,182, 78, 35,121,204, 88,
-250, 63,138, 98, 11,127, 3, 89,149,172, 58,131,154, 64,137,208,111,156, 21, 90, 43,193,166,195, 77,124,184,182,250,207,243,182,
- 62,127,249, 76,188,172,183,123,219,183, 28,158,255, 45,189,127, 56,190,194, 71,158,166,137, 69, 98, 3, 2, 76,111, 5,108,252,
-132,233,116,245,162,122, 97,238,173,200,249,160,103,221, 97,221,197,225,200, 97, 26,203,234, 20,100,136,152, 5, 59,254, 34, 59,
- 60, 90,197, 92,120,145,209,132, 83,101,169,214,114,198, 8, 11, 62, 97,168, 75, 19, 27, 85,159,198,179,143, 14,250,226,219,191,
- 15,159, 31,253,191,133, 81,160, 73, 30,200,222, 51,205, 40, 54,160, 7, 65,205, 89,116,222, 85,171, 27,217,113,203, 2,110,132,
-212, 55,166, 6, 71, 96,252, 95,131,205,247,120, 7,168, 3, 61, 98,101,121, 2, 87,234,124, 25,129, 5,150, 49,179,194,221,196,
- 45,121,181,182, 57,142, 88,103, 3,142,159,252,182,179, 55,119,225,147,243,100,130,138, 70,215, 54,221,165,212,212,106, 81,213,
-239,143,239, 14,205, 76,208, 59,225, 76, 49, 78,178, 83,186,225,173, 20,219,199,189,104,118, 37, 32,172, 43,215,116,191, 28,210,
-179, 23, 47,196,213, 31,239,227, 12,198, 66,187, 13, 32,252, 50, 39, 59,198, 42, 83,103, 79,158,190,169,190,184,188, 7, 67,185,
- 41,178,218, 73,108, 87,133, 19, 11, 83, 2, 49, 23,193, 94,233,148,199,187, 98, 72, 70,111,213, 62, 2,142,228, 74,119,180,201,
-100, 45, 95,187,174,144,229, 79,158,183,119,159, 85, 63,174,241,231,227,149, 8,139,149,115,110,250,217,180, 46,208,239,158, 77,
- 33,140, 66,195, 38, 42, 36, 13,212,161,173,244,188, 76,185,115,169,253,224,151,175, 47, 94, 87,254,251, 31,126, 58,235,167,203,
-221, 89, 59,168, 44,235, 98, 73,239, 29,166, 70,165,142, 47,132,129,165,153, 14,123,171, 70,159,235, 97, 96, 54, 50,251,189,189,
- 99,112, 48,232,249, 92,128,167,172,241, 63, 1, 72,186,146, 29, 57,138, 32,154,149,107,173,221, 61,214,216, 8,164, 97, 59,250,
- 0, 7,144,124,240,137, 31,225,167,248, 33,254,128,229,138, 4,146,133, 25,218,179,244, 76,109,153,149,171, 95,148,213,151, 62,
-116,171, 74, 81,153, 17, 47, 42, 95,188, 39, 87,122, 33,153,182,224, 84, 83, 77, 83,214,115,142,184, 16,146,129, 67, 15, 30,213,
- 57,215,106, 25, 3,160, 31, 48,185, 34,164, 50,212,206,250, 74, 88,235,251, 42,121,177,230,165, 81, 11,147,195, 26,212,236,114,
- 29,201,217,226,132,170,162, 16,190,206,208, 57, 45, 47,154,157,218, 28,240, 93,183,125,193, 90, 99,107,101,129,159, 55,161, 94,
- 96, 47, 39,219, 52,134,175, 74,110,106, 50,188, 51,128,232, 64, 63,105, 87, 69,229,252,131, 45,163, 22, 39,173,148, 79,181, 99,
-149, 33, 47, 74, 65, 30,175,136, 80, 61, 11, 26, 8,173,170,176,214, 36, 89,126,220,125,191, 52,217, 96, 75, 45,182,209, 34,209,
- 16,126,148,251,208,201,162,145, 37, 25, 29, 19, 6,175, 58,229, 36,127,158, 34,151, 73, 18, 77,147,196,103,128,240, 67,142,232,
-249,201,207,212,132, 17, 72, 72, 61,221, 70,174, 23,109, 82,221, 70,217,223, 29,126,146, 95,247, 42,166, 35,153, 4, 88,177,221,
-213, 88, 62,151,123,149,221, 80,252, 67,228, 47,203,227, 92, 37, 52, 28,209, 62,180, 64,124,169, 13,173, 69,133,223,108,205,154,
-196, 17,193,114, 64, 42, 95,204, 24,100,183, 93,221, 40,236, 15,217, 93,114,179,136,134,235,176,185,192,248, 45,170,106,154,238,
-143,168,239, 68,115, 55, 36,218,187,235,238, 99,223, 73, 20, 66,114, 25, 70,128,148,146,100, 91,198, 86,100, 56, 50,148,104,229,
- 56,151,227, 62,216,224,119,123, 64,189, 10,119,228,243,145, 57,164,104,133, 54,169,105,158, 63,136,181, 59,124,117, 82,110,113,
- 30,173,114, 34,242, 79,110,120,140, 58,121,207, 77,204,138, 12,174, 4, 35, 76, 33, 62,217,112, 83, 83,135,155,140,164, 45,147,
- 36,176, 59, 62, 72,231,200, 68,250,158,228,103,216, 99, 88,239, 72,191,128, 93,184, 78,101, 7, 48,108,115, 21,186, 48,181,178,
-128, 14, 2,171,219,211,144,214, 62,175,207, 84,100, 36,101,205, 72,109,237,211, 65,107, 27,217,103, 95,222,252, 25,211,249, 28,
- 62,127,161,105, 56,196, 0,121, 12, 7,177,161,159, 47,162,198,174, 66,229, 53, 60,144, 11, 99,224, 83,174, 55, 46,209, 50, 22,
-192, 59, 69, 47, 77,144,100, 35,169,103, 50, 58, 7,108, 9, 84, 97,241,152, 58, 94,174,170,198,166, 3,143,104,184, 72,107,209,
-187, 69,138,231, 94, 16,175, 60,160,174, 71,116, 1,122,144,149,144, 8, 2,217, 85, 51,148,186,228, 55, 1, 32,196,218, 53, 85,
- 43, 32, 48, 19, 61, 63,221, 80,151,193, 30, 18, 29,146,202,157,190, 79,252,230, 42, 45,132,220,113,225, 68,108, 99,116,205,204,
- 4,114,143, 89, 59, 78, 10,118, 49,118,168,108, 68, 86,203, 68,159,163,173,135, 86,134,136,153,136,123, 32, 35, 33, 98,137,146,
- 50,253,152,104, 96, 8,127, 65, 54, 32,150, 26, 17, 43,121, 77, 60, 59,100, 67, 22,163, 91, 66,120, 44,249,127,154, 51, 62,100,
-102,199, 52,137,120,158,253,106,195, 35,141, 26,226, 57, 20,165,170, 1,187,185, 18, 91,136, 46, 7, 23, 3,126,131,135,216,230,
-130, 59, 93, 75,153,201,175,182, 88, 94, 22,142,196,128, 98, 21, 16,174, 64, 19,103, 45, 77,221,226,246,164,178,164,188,198, 91,
-164, 70,238, 16,116, 64,169, 54, 99,121, 1,208,152, 90,244,199, 94,125,243,253,221,205,235,177,250,143,109,239,115,101,100,170,
-189,232,116,155,125,157, 13, 32, 93,122, 26,105, 96, 34, 0,158, 47,202,200,109,217,188,235, 25, 71,219, 79, 2,160,135,146,230,
-167,168,121, 55,209,112,139,110,230,253,237,149,100,147, 9, 72,248,157,184,191, 68,221,153,107, 31,111,203,218,181, 57,174, 40,
- 22, 81,245, 21,170,161,235, 39,231, 18, 59, 93,233,218,242,186,218, 80,123, 7,220,216,209, 78,236,159,116,247,170, 39,154, 19,
- 57,153,207,108, 61, 21,242, 12,196,198,164,220,140,180, 79, 68,193,156,151,163, 16,115,178,111,223,152, 97,120,127, 30,239,101,
-209,196,149,208, 42,157,179,238, 80, 75,101,251,234,229,248,197,143,231,119,158, 53,127, 69, 92, 62,100, 65, 60,104, 54,187,186,
- 38,238,180,234,246, 86,195,104, 58,214,143,235,181,206, 78,214, 13,113,129,100,172,108, 36, 50, 22,214,173,189,254,118,120,184,
-105,126,117,143,191, 61,123,244, 7, 92,132, 53,198, 39,128, 82,134,142, 8, 24,184,225, 36,176,109,242, 62, 3, 66,167,215,210,
-163,210,165,108, 93, 54,108, 89,124,254,251,221,119,167, 63,126,254,225,205, 47,191, 87,234,242,175,169,119, 37, 90,128,187, 75,
-193,195,192,126, 69,117,177,100,116,124, 24,163,181,193, 30,213,138,192,136, 7,233, 11, 95,186,173,159, 24,105,186, 13, 58,133,
-240, 81, 0,146,174,165, 55,110, 27, 12,138, 47,145,210, 90,107,215, 27,167,175,156, 10, 52,237,161, 64,145, 99,127, 66,127,108,
-127, 72, 46,189, 7,104, 79,109,128, 24,177,157,125,104, 41,138,207,206,168,103, 47, 12, 73,252, 56,156, 33,249,205,232,178, 90,
-225, 46,166, 95,186,197,172, 71, 12, 86,173,253, 37,197,109, 71,227,232,230,156, 86,123, 58, 59,227,158,185, 45, 24,252,156,205,
- 82,231,238, 25,120,193, 4,218, 28, 99,150, 47, 0,154,154, 83,156, 29,232, 43,214, 95,161, 78,244, 65, 13, 69,183,163,100,123,
- 9,240,233,156,176,156, 26,185, 46,137,105, 77, 16,121,221,189, 93,217,213,111,197, 37, 64,187,103,140,233, 4, 89,122, 9, 12,
- 92, 22,142,205, 52, 75,110, 35,163, 6,202,100,138,144,125,104,224, 22, 12, 61,112,144, 88,169, 11, 99, 25, 6,201,144, 84, 76,
-235,178,133,214,196, 26, 20, 83,146,105,250, 91,139,222, 59,117, 2, 11, 84,153, 33,174,140, 72,154,176, 86,247,108,144,136, 0,
-252, 40,167, 84, 30, 68,251, 18,229,176,105, 87,159,229, 94,116, 76,115, 25, 81,104, 76, 60,159,169,242,232,142, 90,164, 63, 78,
-202,211,212,180, 30, 74,255, 57,117,241, 44,129,200,152,175,119,110,220, 47,195,143, 29,143,204, 12,192,135,217,236,118, 13,229,
-213,165,181, 7, 59,227,159,246,188,213, 75,203,246,169,207,151, 66,160, 99,131, 3,128, 99,181, 65, 60, 2, 73,109, 90, 84, 62,
-141,121, 14, 86,105, 40, 11,131,103,103, 90, 11, 6,127,172, 37,101, 39,153, 41,103,166,202,160,201, 90,216, 8, 95,248,218,202,
- 66,247,232,154,140,105,195,202,172,144,174,239, 37,180, 75,162,193,241,152,193, 58,125, 13,144, 94,158,217, 64,131,105,246,170,
- 63, 93,211,201,221,127,253,250,238,239,232, 25, 85,139, 33, 57,107,230, 12,246, 70, 40,192,139, 43,148, 1, 64, 48,197,189,226,
- 10,250,236,202,118,171,155,153, 23, 45, 87,193,228,187, 44,143,204,125,206, 96, 31, 79, 60, 40,165, 37, 93,211, 1,159, 60, 39,
- 82, 95,213,204, 12, 36,206, 53,102,154,242, 9,125, 41,244, 73,111,212, 82,220, 2,130, 74,128,102,198,114,101, 52, 27, 8,204,
-216,245,120,215,111,238,159,206,145, 97,101,234,142,198, 89,139,137, 78,148, 29, 72,100, 24,118,147, 87,224, 47, 1, 72,149, 49,
-128, 86, 14,167,100,120, 18, 40,188,149, 65, 58,252, 38,165, 10,129,211, 67,255,142, 40, 41, 45,174,213,179, 25,178, 55,207, 98,
-136, 32,203, 97,164,107, 92, 39,119,121,200,253,120,170,144,172,180, 88, 25,186, 27,207,244,189, 28,233, 99,119,232,114,232, 59,
-134,243,197,233,112,176,188,220,179, 56, 49, 60,136, 97, 79,235, 72,113,164,197, 91, 55, 48, 99,152,187,228,220,127, 97,196, 48,
-189,127, 55, 59,127,124, 12, 26,220,208,207,129, 13, 66,153, 38,254,249, 66,138, 88,213,198, 43, 91,209, 62,210, 57, 31, 84, 12,
-229, 12, 82,235, 80,193,255,219,215, 73,110,223, 84,138, 5, 69, 79,124, 87,161,141,241, 53,153,239, 51,225,173,233,245,220,190,
-146,140, 17, 8,241,227,179,120, 14,233,180,250,151,185, 94,148,233,245,150,149,215,120, 39, 0,210,176, 19, 49,144,197, 52,171,
- 45, 32,237,156,130, 19, 50, 43,144,105, 20,242,237,220,240,215,228,104,200, 44, 50,131,188, 49,117,124, 87,104,159,220,109,141,
-235,219,137, 55, 88, 23,219,221, 70,250,223,128,152,118,131, 43,253,114,248,214,189,250,245,151,127,190,127,247, 41, 92, 65, 28,
-245,178, 55,210,126, 97, 52, 45, 86,195, 35, 86,187, 25,162, 99, 69,105,162, 82,118, 2, 32, 48, 45, 89,250,243,174,241,176,164,
-143, 46, 26,157,240, 24,235, 26, 50,139,195,161,246,162, 90, 32,186, 22, 97,171,167,154,235, 20, 0, 78,174, 88,109,234,106,114,
- 93,121,125,188,211,231,194,178,135,162, 57, 50,149,194,150, 1,184,207, 6, 88, 98,193,109,191,134, 29,232,173,187, 21, 87,209,
- 3,171,129,212,124,193, 30, 69, 40, 42,251,133,133,166, 11,123,153,247, 67,157,215,203,252,230,167,159, 95,135,199, 63,253,194,
- 56,245,133,151, 53,155,113, 77,140,217,222, 30,166,239,222,125, 56,155,151,246,113, 84, 55, 3, 40,224, 34,231, 67,131,110,212,
-204, 63,218,164,114, 94,156,217,155,130,185, 37,119,236, 86,189, 46, 60,110,101,155,199,172,111, 36, 24,176,119, 63,168, 15,111,
-220,251,240,229, 95,255,153, 57,240,214, 49,161,189,211, 22,234,173, 69, 47,120, 11,112, 11,143,187,144, 32,104, 38,220,239,121,
-133,174,163,187,114,150, 91,127, 64,188,246,237,253,239,111,197,227,250,219, 31,127, 29,119,123,223,158,100,194,236,141,197,220,
-120,201, 19,157, 57, 37, 9, 41, 15,189,167, 45, 10,113, 74,154,197,201,148, 24,212,203,130,129,192, 99, 41,229,151,255, 4,224,
-232, 90,118, 43,169,161,160, 31,237,182,251,145,155,155, 64,162, 65,179, 64, 32, 13,179, 99,135,196, 15,176,225,127,249, 5, 54,
- 72,236, 88, 17, 52, 18, 25,129, 6,134, 73,210,125,187,219,143,182, 77, 85,111,163,228,230,218, 62,143, 58,246, 57, 85, 28,137,
-138,211, 70, 50, 67, 2,216, 37, 96,227,224,160, 49,233, 28,188,221, 54, 24,244,167, 54, 90,156,137,241,117, 5,156,154, 61,176,
- 66,215,192, 92,121,121, 71, 37,159, 37, 81,119,224,210,192,164,107,217,248, 62, 45, 77, 62, 68, 54, 66, 66,126, 71,170, 64,161,
- 13,143,155,144,119,244, 25,213, 24, 39, 15, 18, 57,159, 74, 87,102,182,123,236,131, 9, 65,217,205,152,222, 56,118,175,235, 84,
- 44, 53,235,241, 89,148,153,128,181, 57,111,199, 38,238, 35,239,117,251,200,209,105,132,250,237,184, 70, 96,223, 98,107, 80,119,
- 34,140, 33,154,182,136,122, 9, 33,139, 92,198, 45,101, 97,202,156, 11, 21,103, 85, 2,222,182, 89,244,166,214,147, 72, 64,247,
- 66,103, 67,241,108, 10, 57, 38, 82, 28, 34,234,116, 40,147, 23, 71, 86, 59, 56, 27,153,158,148,236,135,155, 13,208, 65, 18,137,
- 3, 1,226,156,116,114,199, 77,226, 98, 16,171,183,245,184,112, 41, 36, 86, 86,219, 36, 6, 36,166, 88,254,130,153, 63, 1,158,
-169, 38,145,135,134, 53,253,162,129,128,247, 43,149,218,168,146,219,117,104, 7,242,248, 70,128, 13,132,207,214, 32, 36, 15,216,
- 43, 4,122, 42,221,145,220, 8,177,211,248, 35,170,143,114,192,142,153,150, 76, 93, 62, 73,118,249, 53,110,166,222, 51,121, 45,
- 41, 24, 75,153,233, 4, 35, 92,121, 3,131,159, 32,206,162, 28,191,139,250, 99,143,188, 2, 20, 83,133,219,116,155,234, 85,123,
-190, 86,127,188,148,185,202, 19, 22,143, 2, 17,117, 5, 53, 44, 98,174,168,118, 2,187, 15, 40,217,128,202,162, 61, 8,186,146,
- 1,254,209, 10, 78,218, 9,159,243,156,212,214,214,188, 3,155,162, 78, 17, 83, 92,177,135,131,221, 63,194,238,138,178, 53, 81,
- 4,186,102,146, 22,148,106,108,244,123,127,244,124,147,207,145, 79,200,135,166, 71,101, 87, 33,162,193,226, 56,157,115, 26,132,
-124,213,125,248,125,184, 61,245,200,202, 90,103,178,217,213,146, 91,215, 41,135,211, 27,105,125,108,243,200,142,234,161,250, 30,
-121, 30, 43,226,109,227, 77,163,245,124, 53,153,137, 76,134, 30,201,184, 94,138, 76, 81,132, 81,156,117,190, 94,129,248,100,128,
-235, 99,163, 45,252,106,124,214,177,179,140,210, 43, 28,147,106,238,124,180,162,251,158, 74, 14,217, 14,123,130,209,223,218,175,
-238, 23, 33, 81, 25,223,230,254, 76, 98,134, 76, 14, 76,124,233,204,145, 37,138,111, 34, 6, 22, 24, 29,169, 20,201,177, 64,250,
- 2, 62, 22, 81,195,148, 93,238,254, 96, 35,165, 98, 13,162, 76,174,158, 13,255,216,174, 12,100, 67, 82, 27, 79, 65, 9, 28, 62,
- 98, 16,210, 67,207,123, 2, 73, 17,194,194,169,176, 72, 98,150,194, 30,127, 10,157, 17,187,194, 98,172, 80, 52,183, 36,167,203,
-190,236,233,233,120,166, 31,240,103,146,234,210,240,222,103,124,187,189, 82,159,150, 68, 12, 28, 71,231, 68,205,206, 95, 86,204,
- 61,148,206, 72,121,158,213,234,149, 36,191, 20,161, 66,154, 1,249,210, 21, 76, 75,209,178, 43, 67, 78, 25,216, 46, 11, 63,107,
-250, 46, 37, 89,211,216,219,187,218,221,234,155,111, 94,255,251,197,143,239,197,117,147, 30,107,127,242,103, 85,210,122, 64,159,
- 16,122, 18, 26,102,239,168,116,132, 74, 43,250,139,168,254, 41,214, 22,134,218,151, 69,214, 48, 45,168,152,176, 70,178, 15, 97,
- 41,157, 3,170,195,138,237, 33, 93,174, 3,131,112,212,174, 38, 27,184,209, 72, 57, 17,117,248, 90, 12,109,102, 7,234, 64,178,
- 32, 78, 27,111,200,218,143, 60, 8, 28, 68,111,214,207,248, 31, 41, 0,211, 2, 9,218, 57, 95,172,190, 96,143, 93,236, 56, 9,
-215,240, 53, 49, 20, 61,200,147, 23,207,107,253,254,219, 47,191,123,243,242,254,215,199, 28, 53,146, 7,204, 72,253,195,153,248,
- 70,156,206,183,111, 31, 62,220,253,246,247, 67,123, 66, 93,110,204, 57,250,172,156,237,201,227,141,104, 99, 44, 91,206,249,184,
-135, 58,151,130,101,185,157, 16,255,234, 30, 72, 94,177,227, 20, 59,177,125,246,117,255,231,231,195,207,235,203, 35, 78, 73,176,
-241, 80, 31,220, 50,161,108, 27,206,137, 4, 90,250,120, 73,230, 16,245,126, 12,205, 30,106, 90,182,203,134, 83, 40,124, 61, 27,
- 91,209,142,115,220,220,127,191,252,240,234,205, 79,239,238, 31, 62,189,123,173,235,136,108,105, 38, 24, 14,106,250,105, 59, 59,
- 34, 48,191,193,201, 27,147,214,224,144, 8,179,147,151, 66, 42,181, 39,223,216,152, 41,254, 41,255, 23,128,163,107,217,145,164,
- 6,130,126,148, 93,174,234,154,174,105,208, 14,106,193,238, 17,238, 28,184,112, 70,226, 67,249, 12,190, 2, 14,136, 19, 2,105,
-197, 72,244,238,116, 87,215,195, 46,191,136,104,105, 46, 45,205, 76,181, 92,118,102, 68, 58, 51,162, 49,136,227,138,141, 48,136,
-101, 9,223,115,245,146,162,128, 33, 79,126,246,153, 98, 77, 96,250,251, 53, 42,246,203, 4,192,183,165,165, 39,174, 40,119, 67,
-147, 41, 67, 11, 90,128, 55,223,232, 66, 25,127, 77, 35, 72, 60,168, 94,140, 58,218,124,170,123,223,202, 56, 31,138, 85, 33,187,
- 78, 42, 60, 98,143,170, 52, 7,142,201,205,222, 34,119, 22,135,120,107, 39, 66, 39, 28, 95,228, 8,165,121,196, 57, 10,207,243,
- 2,218,200, 25,186,192,254, 59, 16,163,156,251, 60,168, 22,145, 57, 31, 3,208, 66, 40,129,118, 86,166,225,148,249, 80, 53,232,
- 1,152, 16,142,151, 10, 88, 42, 42, 81,178,163,137, 30,213,182, 69,226,125,180,221, 0,164, 82,177, 41, 40, 11,192,237,189,118,
- 58,106,225,108, 81, 51,123,106, 20,203,247, 44, 60, 26,129,205,173, 35,109,214,228,221,200, 81,101, 59, 55, 43,109,131,145,119,
-101, 67, 85, 54,236, 42,113,199, 95, 43,209, 71, 97, 82,106,154,122, 76,230, 6,212, 67,173,171,202,201, 99, 68,196,151, 58, 52,
-182,220,104, 74,188, 63,250,136, 40, 5, 9,136, 81,217, 89, 77,167, 40,128,203,216,108, 7,144, 89,201, 30, 54, 83,159, 1,134,
-131, 91,231, 50, 74,219,183,244,208, 76,138, 46,162, 96, 25, 77, 3,210, 76, 39,151,117,203,181,167,218,156, 6,145, 2, 23,147,
-212,134, 71,130,147,102,109,189,152,193, 12,144,148, 34,222, 6, 72,132,243,183,135,197,188, 28,235,119,231, 44,166,109, 93,106,
-122,210,156,214,193, 75, 52,188, 57,103,205, 39, 40,208,141,234,114, 6,202,149, 93,186, 33,108, 97, 65,168,163,146, 34, 51, 88,
-218,192, 14,176,145,118, 68,109, 49,217,130, 92,131, 99,117,105,205, 36,243,206,161,199,213, 19,238, 27,157, 0,218, 62,227, 52,
- 48,176,110, 53,136,251, 14,164, 78,193, 72,215,177,242, 78,231, 91, 54,165,136, 33,147,179, 62,157, 6,243,238,240,223,239, 77,
-113,247,157,174,150, 3,187, 94, 52, 34, 85, 49, 25, 81, 96,210,230, 9, 63,206,106,186, 80,172,181,246, 32,254,126,163,130,131,
- 0, 11, 50, 8,235, 42,175,166,186, 67,203, 98,106, 44,227,184,152, 88, 2, 45,213,229,163, 98,180, 81, 89, 7,232,119,144,102,
- 41, 22, 11,140, 72, 58,100, 6,213, 98,251, 81, 71,175, 90, 23,105, 3, 88,116,154,205,203,123,253,242, 33, 9,125,202,195, 87,
-156, 63, 16,153,122,151,108,116,121,204,159,114,136, 55, 98, 55, 2, 27,106,182, 78, 83,206,150,154,236, 8,172, 65,178, 18, 79,
- 9, 39,100, 74,128,131, 84, 54,240,239,200,145,171,125, 97, 3,252,198, 45, 74, 99, 17,234,216, 33,118, 99, 51, 38, 49, 7, 90,
- 7, 24, 86, 99,132,227,144,101,150, 26,187,135,134,241,197, 83,173,136, 61,218, 53, 93,103, 32,225,114, 79, 73,238, 13, 78,185,
-231,147, 20, 16, 47, 78, 38, 61,163,168,126, 17,175, 50,142, 81, 14, 58,223,178,122, 19,220,107, 86,155, 75, 19, 76, 80,171, 54,
- 85, 49,205,247, 25,196, 34, 68,185, 1, 89,108,188,147, 0,127,192,209,230, 93,123,149,186,227,133, 47,157,185, 52,109,138,144,
- 63, 99,167,114,183,159, 79, 95,124, 62,255,252, 17,148, 42,254,171,246, 20,194, 39,219,119,248, 5,169, 7, 64,144,253,222,105,
- 69,179,184,100,227, 2,152,163, 39,144,112,171, 26,128, 51,243,233,146, 41,116,210,123, 47,104,194,141,221,129, 64, 22, 53,130,
-190,239,250, 0,196,150,217, 94,186,230,149, 93, 69,181,147,193,208,218, 50,173,230, 32, 31,222,243,217,199,189,125, 54,215,161,
-190,238, 65, 52,163, 56,145,170, 20, 28,122, 22, 95, 13,171,171,224, 3,138,159,118,167, 1, 0, 91,207,254,185,157, 13, 95, 69,
- 57,176, 84,138,251, 58, 55,239,111,230,135,239,223,137,244,199,117,185,119, 29,222,138, 18, 83, 68,196,241,199,248,252,225,252,
- 38,191,253,251,242,143,248,242,181,181, 3,255, 17, 24,143, 22, 7, 64,102,231, 58, 55,115, 70, 80,114,232,121, 78,224,142, 67,
- 75, 33, 41,202,222,179,246, 14,128,176,129,116,143,231,254,227,201,254,186, 47,127, 93, 95,145,230, 43,211, 51,239, 41,167,172,
- 12, 85,227,170,125,120, 13,167,218, 24, 89, 89, 27,109, 5, 91, 4, 16,205, 22, 44,207,181,231, 64,208, 51, 16, 90,166,158,195,
-210, 77,194,127,253,205,111, 63,189,255,241,151, 63,251,163,185,129,244,168,109,145,174,107, 56, 52,217, 70,230, 24,100,111,213,
-183,217,119,193,227,101,128,202,223,150,128, 69,127,178, 22, 64, 46,214, 78,152,255, 5, 32,233,234,121,228,182,161, 32, 41,146,
-146,168,175, 59,251, 12, 24,112, 42,219,141,221, 6,105,211,165,140,127,178, 11,255, 2, 23,169, 2, 24,118,151, 34,198,101,189,
-186,149,196,111,102, 70,238,118,113, 88,232,196,143,247,102,200,247,102,244,109, 3,179, 63,144,162, 54,127,163, 78, 38,239,138,
- 60,203,182,100,194, 24, 93, 14,135,221, 24,247,112,176,116, 30, 17, 67, 2,131,206, 19,136, 14,109,122,250, 77,136,169, 58,100,
- 87,160,240, 86,239, 94,246, 51,214,222,105,213,184,172, 30,168,253,146,109,103, 49,142, 77,231,133, 28,213, 45,184, 61,155, 81,
-197, 86, 81,145,172, 17,207,226, 78, 46,122,217,243, 36,103,137,180, 64,209,157, 32,116,223,230, 82,132,230,169,159, 64, 42,194,
- 60,169,126,196,223,156,233, 52,123,129, 4,173,129,126,210,218, 78, 12,154,229,166,153,142, 26,206,164, 10,120,142, 69,167,146,
-241,244, 94, 63, 84,154,232, 87,208,140, 38,167, 93,212,243,242, 15, 31,193, 94,202, 93,245, 92, 79,166, 2,168,211,118, 88, 28,
-162, 53, 20, 59,207,108, 70,140,173,211, 4, 61,207, 98,170,128, 50, 9, 80,160, 4,208, 84, 37,244, 33,131, 48,206, 98,167, 70,
-118, 5, 97, 13, 51,118,210,120, 29, 91,147,202,203,231,145, 42, 30,170, 92, 1, 63, 3,164, 83, 55,233, 1, 65, 52,214, 2, 66,
- 46,235,201, 71, 0,239, 94,240,224,244,144,187, 56,237, 15,170, 6, 49, 1, 24, 11,136,183,199,210,245,251, 0, 4,175, 53, 73,
- 30,141,144, 48,175,245,185,165, 10,145, 71,252, 56,109,195, 14, 96,159,150,215,216,162, 57, 37,119, 11,255, 71,196, 78, 64, 83,
- 22,170,182,121,227,231, 67, 99,103,215, 43,115, 92, 16,147, 69, 0,109,126,200, 9,251, 89, 36, 79,201,213,100,139, 12, 18,175,
-142, 0, 71,185, 63,218, 18,138,115, 33, 22,201, 11, 57,226, 80,170,173,129,176,241,242, 6,192,219,213, 3,145, 2,193, 43,201,
- 39,154, 49, 61, 13,148,191, 7, 94, 66,194, 4,181, 2, 50,200, 52,105, 54, 32,213, 60, 80, 40,167,239, 97,161,147, 20,207, 28,
- 41,133,193,186,146,216, 17, 19,119,163,232,151,249,123,110, 30, 47,110,233, 31, 64,167,217, 27,121, 92,151,234,124, 55,107, 67,
-236,110,168,219, 30, 66,140,218, 22, 53, 53,225, 63, 67,149,139,206,105, 73,233, 30,176, 53,235,251,222,101,213, 71, 7,198,205,
- 60,198, 41, 14,209,227,245, 91,175,227, 56, 36, 96,238, 70,155,112, 4,254, 20, 64, 65,107, 43,215, 72,153, 24,246, 48,108,121,
- 54, 44, 32, 65, 42,156,134,251,223,127,237,197,253,234, 86,192,234, 71,106, 15,225,149,207, 30,229, 83,206, 0, 1,119,100, 60,
-213, 99,205, 0,101, 78,128,240,202,148,127, 30,190,139,179, 98,139,250, 51, 66,242,252, 45, 10,139, 88,200,147,151,170, 0, 69,
-132, 46,187,244,149,233, 1, 35,172,140, 26, 12, 7, 36,208, 68, 19,243, 9,152,194,235,164,200, 78, 92,214, 82, 98, 76,241,220,
-149, 45, 32,200,149, 0,180, 72, 11,188, 91,146,125,193,218,154, 56,164,101, 43, 49,148, 22,123, 38,203, 13, 84, 6, 52,122,173,
-236, 5,188,177, 74, 6,252,177,174,200, 78, 20,235, 93,183,104, 50,152, 95, 13,224,234,142, 69,180, 88, 50,120,178,162,112,158,
- 0,190,196,244, 89, 35,211, 44,177,161,244,162, 82,171, 86,173,108,218, 95,244,246,238,249, 47,251,235, 15, 95,134,247,217,127,
-211, 72, 5, 29,168, 19, 38, 59,241,110,187,234,160, 38,160, 58,231, 87, 95,135, 0, 36,191, 29,160, 27, 13, 70,188,164, 27, 53,
-139,150,131,119, 14,222,128,130,184, 26,189,175,179,214,123,216, 1,163, 50,213,142, 61, 23,182,186, 43, 83,234, 89,219,241,208,
-134, 45,181,251,200,222, 11,164, 4,107, 20,109, 12, 53, 37, 29,176,139,196, 89, 32, 17,232, 42, 70, 8,216,100, 63,212,220, 73,
- 36, 34,160, 76,246,128,131,138,107,196,220,164, 17, 37,218,142, 26,118,146, 42, 8, 70, 92,196,155, 87,239,254,248,173, 94,191,
-252,203, 87, 71,242, 45, 28,180, 0,190,114, 63,155,225,237,231,191,253, 85,254, 51,166, 69,201,197, 88,140,185,166, 70, 42,118,
- 26,118, 31,189,181,226,225,239, 76,167, 70,189, 84,124,213,158,253, 62,137,210, 7,146,253,153,203,203,250,253,161,126, 58,126,
-124,197,162, 88, 99, 26,157, 0,205, 64, 34, 37, 72,228,213,103,139,100, 76,111,142,100,145,205, 72,236, 16,105, 41,236, 82,154,
-171,236, 58, 12,131,102,220, 98, 21,106,193,202,164,165,208,166,197,227, 95,127,190,122,255,241,219, 75, 23,158,234, 20,172,152,
-171,106, 66,142,200,149,116,163,144, 3,126, 94, 18, 98,177, 53, 14,155,250, 10,100,184, 99, 32, 28, 72, 2,136, 32,155,199,255,
- 23,128,163,107,217,141,227, 6,130, 36,135, 28,114, 30,218, 21,100, 25, 22, 18,228, 16, 32, 9, 16,223, 12,228,230,187,115,204,
- 79,251, 11,114, 74, 14, 1,108,196, 65, 16,172, 32,107,181, 59,124, 13,201, 73,213, 92,116, 16,102, 23, 18,134,221, 93,213,236,
-174, 66,194,153,179,143,244,102,202,142, 83,228, 57,230, 24, 67, 0, 73,154, 11,130,197, 0, 59, 47,225,170,172, 21,190, 46,117,
-225,204,145, 92,218, 66,171, 1,162,233,182,160,248,160,216,172, 55, 13, 57,162,173, 47,248,133, 41,215,118,123,192,241, 22,188,
-254,107, 21,120,188,222, 4, 61,209,109, 4, 60,127,234,198, 25, 20, 53,198, 52,116,129,250,104, 40,139,224,176, 25,128, 86,154,
-100, 39, 0, 37, 84,178,161,118,118,139, 39, 49,142,171,158,100, 62,201,120, 99,122, 10,165,117, 32,203,229, 14, 97,166, 13, 39,
- 99, 23, 13, 50,136,175,200,149,146,209,185,234,209, 80,187,191, 56, 93, 71, 42, 4,169,181, 4,203,123, 72,119,161,239, 35,142,
-101,200,180,187,160,215, 55,185, 7,231, 51,216,207, 94,235, 34,245, 52,118,218,243,202, 17,161, 78, 98,216, 35, 73,244, 69,101,
-212,172, 73, 1, 88,138,231,160, 16,220,244,191, 14,213, 82,157, 24,208, 9,101, 69,134,176,175, 16,232,166, 61, 21,186, 80, 95,
-192, 28,162,212,189,227,221, 63,200, 93,234,233,212,101,214,216, 81,201,133, 93,165,213, 1,133, 24, 86, 46,124,145,106, 7,135,
- 83,104, 19,254, 27, 11,212, 71,147, 84, 36,160, 1, 37, 38,202,199,185,187,107, 94,211,113,180,123, 42,188, 18, 29,172,184,106,
- 9, 28, 70, 67, 84, 54, 78,118, 42,136,180,236, 68,116, 34,123,211,163,102,117,165,229,172,123, 51,248,249,226,189,116,156, 76,
- 91,144,243, 95,109, 62,159,190, 36,122, 58, 73, 46,107,207,134,215, 32, 20, 43, 45,136,106, 65,193, 80,110,174,226,253, 75,229,
-216, 43,160,125, 42,199, 49,203, 94, 81,210, 87, 10,242,212, 11, 80, 95,108, 1,169,132,105,139, 29, 52,161,194,190,245,216,128,
-254, 87, 60,136, 3,195, 65,250,178,171,205,208,123, 22, 57,125,239,201,208, 93, 86,137, 67, 15,138,177,153, 65,140, 70, 3, 32,
-249,179, 45,207,167,254, 62,169,134, 18,126, 61,206, 93,202, 15,120,114,214,249,204, 25,167,204, 63, 79,206, 18, 63, 61, 39,222,
- 10, 96,192, 21,152,105,200, 40,198, 40,201, 42,232, 39, 54, 69,192,197,106,149, 47,143,155,118,198, 90, 21, 70,145,207,114, 11,
- 40,179,220,236, 88,175, 90, 57, 29,114,233,246,129,240, 7, 84, 79, 29,151, 77,198, 99,115,212,113, 56,100, 47,126,254,233,240,
-203, 59, 46,194, 80,149, 10,133,156,237,114, 45,246, 75,109,130,119,160, 23, 14,125,208,208, 68,110,248,232,184,209,206,145, 22,
-151,224,132,156,245,167,255, 9, 21,232, 42, 23, 77, 81,223, 54,121,209,220,216,166, 6,152,100,177, 12,128,117,192,150,148,222,
- 86,210,107,218,202, 27,133,195,133,196,183,181, 50,129, 2,130, 83, 75, 87,115,162,158,154, 65,184, 37,196,118, 0,174, 7, 23,
- 23,244,245, 96, 86, 85,224, 61,106,229, 40,117, 35,221,214,180,146, 68,174, 68, 26,161, 34, 16,208, 56,205, 29, 3,151, 85,216,
- 34,226, 56,141, 96,235,149, 32,153, 7, 22,200, 18,184, 14, 71, 68, 39,141,112,171, 13, 16,102, 50,212,137,164,110,138,146, 3,
-138, 33,178,123, 61,140,250,245, 15, 71,249,227,135, 63,222,188, 45,203, 51,226, 37,211, 65,210, 4,192,184, 52, 57,187,108, 49,
- 3, 36,159,213, 85,173, 67,223,165,163, 69,248, 5,155,241,250,240,156,173, 32, 35,235, 99,181, 55, 8, 24,160, 71,159,112,162,
-106,119,201,115, 42, 79,150,151,235, 28,101,206,120,207,125,148, 49, 7, 75,145,222,177, 82,230, 14,143, 35, 96, 54, 35,113,188,
-108, 67,149,173, 20,248,199, 97,178,182,112,171, 69,221,174,116,194,104,219,122, 68, 41,234,251, 86,158, 93,155, 18,216,230, 20,
-251, 2,198, 52,104, 39, 13,144, 10, 0, 89,205, 50,190,136,225,183, 95,191, 21,195, 95,255,125,125, 18,206, 34, 0,215,207, 34,
- 33,230,238,187,105,250,254,159,203,195,151,211,231,249,187,238,118,192,121,202,117,228, 66,156, 67,206,162,110, 94, 22,235,216,
- 29, 38, 78, 34, 32,255,168,115, 68, 22,160,241,198,193, 81,197, 62, 73,245,102,184,134, 91,243,177,248, 63,217, 93,247,101, 40,
-136,190,101,211, 0,238,244, 32,167, 42, 13,216,229,196,251,236,253,230, 95,114,149, 98,164,227, 6,151, 46, 87, 97, 81,151, 93,
-163,142, 53, 50, 23,225, 98, 15,252,106,138,122,201,203, 55,119,159,222,222,191,255,253,239,127, 71,160,129,201,111,203,130,130,
- 74,105,249,232, 37,251,168,120,183,243, 44, 82,104,158,114,148,179,223,192,101,187, 13,228,108,218,128, 81,214,255, 5,224,232,
- 90,118,236, 38,162, 96, 63,237,182,125, 95, 19,164,137, 80,144, 88, 0, 18, 36,236,178,207, 6,164,124, 52, 75,254, 0,177, 64,
-138,148,101, 20, 17,148,153,123,175,237,118,191,169,242,254,142, 61,238,199, 57, 85,221,231, 84, 97, 49, 93, 37,146,105, 14,165,
- 55,245, 9,232,145,151,251, 52,120, 70,176, 48,108, 97,246, 55,138,190,133,216,120,169,192,102, 57,225,107, 96,249, 86,209,155,
- 12, 41, 98,194, 21,130,207,215, 91, 29, 1, 91, 36, 57,145,205,210,164, 70,175, 75,164,192,138,132, 46,181, 31, 0,116,125,237,
-204, 9,104, 50,141,108,114,167,250,108,230,205, 94,178,132,242,125, 63, 76,224, 75,248,166, 50,184,187, 92,213, 20,123,159,121,
-228, 18, 23, 10,253, 96,237,179,171, 86,101,141,209, 16,164,251, 60, 54, 1,112, 66,160, 38, 34, 52,251,177, 39,205, 73, 88,151,
- 81, 68,179,170,140, 88, 30, 24,105,196,218, 82,168,237, 64,167,200,220,243, 90, 76, 38,196, 59,228,149,196, 13,169, 52, 18, 12,
- 34, 31,157,154, 16,219, 58, 71,165, 53, 67,215, 42,246,205,218, 98,102,218,185,177,146,173,141,216, 82,136,188,162,123,224,187,
-176,115, 43,160, 71,166, 40,171, 69,188,126,194, 7,226,103,106,207,219, 46,226, 75, 44,128, 44, 9,213,148, 11, 6,246,110,172,
-165, 61, 22,187,101, 10, 81,247, 70, 81, 55,118, 23,211, 7,174, 34, 9,117,122, 55,154,163, 67, 59, 53,219, 64,127, 74,152, 22,
- 36,135, 35,229,140,123, 26,158, 18,153,130, 14, 33,150,139,218,215,142,170,160, 42,130,149, 94,140,160,206, 53,203, 27, 43,242,
-116,166, 99, 56,198, 28, 33,124, 99,213,198,193,198,217,203,203,185,123, 24,218,108, 0, 3,181,216,243, 8,254,163,238, 89,213,
- 73,208,128,143,183,109, 88, 26, 61,155, 42,121, 33,131, 8, 45, 41, 17,192, 83,135,134, 79,145, 43,130,200,222,233, 86,133,142,
- 91, 89, 21,135,127,197,238,140, 96, 98,117, 70, 58, 80,180, 4,241,138,250, 71,188,215, 46, 75, 36,204, 12,187, 48, 50,208,106,
-192,214, 80,251,121, 89,143, 41, 7, 83,147,216,141,211,143,245,223,199,239,242,197,240,234,106,210,248,162, 8,192,164,124,223,
-109,119,233,140,101, 31,127, 91,157, 53, 64, 59,200,216, 92, 54,120, 45,219,107,177, 13, 10,187,238, 86, 44,162, 19,198,141, 78,
-125, 72, 53,100, 27,161, 1,204, 20,177, 82,179,213,178, 55, 15,127, 62,184,206,131,196, 29,229,183,117,251,146,237,118,145,151,
- 89,131, 6, 32,194,229,114, 60, 92, 94,189,254,185,255,253, 29,198,226, 99,122,158,119,174,161,118,101,176,200,130, 23,145,118,
-233, 24,107, 72,109, 48, 77, 44,152,161,189,184, 76,148, 36, 64,202,102, 65, 68,195,104, 83,106,170, 82,219,134,142,244,171,162,
-191, 93, 48,244, 2,225, 97, 26, 81,155, 88, 88, 58, 96,128,112,159,115, 66,212, 30, 27, 96, 81,219,165,208,104,248,173,185,139,
-120, 54,147,117,158, 1,171, 0,220,120, 74,144, 15,216,123, 64, 50, 44, 0,107, 43,150, 48,127, 23,233,197, 13,128,174, 65, 78,
-203,202,117, 67, 87,141, 47,108,113,163,239, 84,174,242,191,128, 17,175, 52, 25,192, 36,110, 84,205,186,233,184,180,124, 23, 94,
-155, 3, 41,114, 38,238,237,240, 96,107,198, 36, 31, 58, 58,131,246,120,114,147,166, 60,188,252, 38,254,240,254,159,211,155,251,
-237, 51, 88,174, 46,190, 31, 20,175,132, 24,143,176, 18, 14,213,205,120,213,216, 5, 57, 10, 49,219,101,117,197, 96,250,188, 6,
-223,190,202,110, 3, 7, 49,224,217,165,216,181,110,170,166,102, 65,238, 40, 77,235,173, 93,251,181,101,128,149,171, 82,238, 38,
-131,117,156,245,182,223, 54,146, 45,179,138, 63,241, 40,129,190, 93,114, 2, 98, 27,188,160, 36,241,110,105, 51,179,144, 52, 95,
-203,227,171,120, 57, 95,114,188,107,231,170,221,128,171, 45,136, 57,213,111,141,166, 95, 29, 38, 67, 45,207,249,251, 23, 63,253,
-246,230,176,124,252, 84, 86,170,164,176,183,206,209, 49,237,124,124, 57, 78,191,124,254,240,100,199,175, 54, 30, 48,182, 64, 71,
-157,146,161,163, 89, 11, 30, 57,119,225,204, 18, 86,202, 30, 18, 64, 28, 1,229, 3,221,227,221,184,153, 5,235,117,208,250, 81,
-255, 81,226,223, 0,192,186, 30,252,156,213,245, 94, 85,160,183, 41, 48, 82,204,238,212,132, 67,164,194,254,180,121, 0,110,163,
-242, 2,107,168, 26,237,245, 12, 79,254,114, 2, 42, 3,210,226,205, 80, 32,129,239, 9,133, 18,182,217,252,215,175,199,183,127,
- 74,121,170,224, 68,186, 78,231, 45, 32,245,241,124, 78,165,187,160,191, 76, 13, 83, 12,250, 72,222,199,238, 94,149, 93, 26, 17,
-219,188,206,126,251, 95, 0,142,174,101, 71,114, 34, 8,214,203,174,242,184,221,211, 59, 52,218,101, 15,112,128, 19,119, 14,252,
- 2,240, 7, 72,252, 52, 8,137, 3, 7, 4, 2, 33,118,118,198,238,182,235, 93, 38,194,183,150, 90,234, 25, 87,149, 51, 35, 50,
-179, 34, 76,180,229, 86,114,187,143, 21, 33, 72,233, 96,198, 37, 35,250,228,244,156,239, 37,103,183,237, 55,170,186,111, 75, 65,
- 80,138, 81, 6,166,160,142, 58,233, 8,120,178,217,106, 88, 88,194,211,100, 48, 22, 4,107,172, 3, 61, 9, 63, 82,245, 91,126,
- 34,165, 1, 23, 67,250,205,130, 3,229,189,122, 4,192,112, 32, 35,106, 52,171,212, 15,231,146,212,234,216,255,236,107, 28, 54,
-205,122,182,178, 88, 3, 38, 16,196,179, 7,137, 48, 72,254,136,231, 64,166,202, 85, 89,199,123,172, 55,173, 65,215,246, 67,143,
- 19, 89,101, 37, 9,162, 51,160,109,148, 31,155,180, 88,162,216, 88,253, 56, 94, 58, 10, 63, 97, 55,204,198,137, 33,196, 76,156,
- 82, 1,246, 18,148,158,152, 78,145,197,155, 45,210, 2,196, 84, 28,119, 13,114,242,136,179, 43, 50,254, 69,144, 63, 57,226, 43,
- 73,149, 30, 42, 89, 74, 26, 63, 70,149,177,191,120,149,140, 24,216, 3,171,156, 27,244,141, 90, 92, 78, 17,215,145,210,171,179,
-108, 14, 88,203, 30,115,167, 8, 7,185, 82, 50,193,240,157,235, 40,151, 99, 15, 27, 26,150, 19,168,132, 6,102,195, 26,177,223,
-176, 44, 28,159,225,172, 17,165,212, 64,133, 83, 48,143,136, 89, 42, 4, 26, 0, 61,245, 26, 32,197, 97,153,148, 71,116,195,114,
- 99,223, 1,242,202, 36,226, 96, 98, 72,192, 72,125,236, 90, 54,105, 64, 10,165,240,181, 2, 47, 47,174, 34, 85, 63,169,203,233,
-249,111,228,126,122,191,170,226, 71, 35,199,254, 68,175,180,144, 88,203,164,153, 96, 23,145,129,143, 91,195, 61,111,195, 0,164,
-114, 0,181,210, 17,155,234,176, 54,203, 15,136, 86,209, 11, 29,144,242,168, 18, 78, 19, 32,154, 20, 48, 79, 34,210, 20,172,224,
-170, 56, 93,229,154, 8,138,143,121,102,143, 86,112, 28, 66, 83,184,133, 53,160,158,130, 46,213, 58,247, 38, 60,190,161,246,243,
- 69,174,153,182, 46,187, 5,128, 29,168, 32,154,199, 86,239,250,157,206,243,249,133,130,167,136,209,234,184,193,161,192, 52, 69,
-113, 61, 77,112, 1,122, 0,123, 7,249, 16,235,172, 57, 64, 57,149, 9,188, 83,234,172,156, 30, 7, 41,182,132, 36, 12,172,217,
-125,168,235, 21, 15, 9,136, 76, 92,151,241,131, 35,107,252, 28, 97,168,246,242,244,217,119,223, 95, 63,255,226, 63,209,254, 12,
-243,124,216,199, 31,147, 48,164, 30, 12, 49, 28,240,164,220,154, 36,182,167, 73,107, 71,199, 25,222, 27, 56,172,167,216,146, 78,
- 37,229, 29,188, 19, 47,111,160,217, 17, 63,116, 22, 20, 58,169, 67, 99,180,178, 23,192, 50, 80,218,169, 28,226,149,167, 37, 35,
- 72, 63, 69,205,117,226,121,225, 28, 34,199, 82, 37,199,116,107,166, 34, 97,144, 2,120,141, 61, 40,188,136,244,235,225,240,107,
-175, 56, 90,180, 1, 29,231,230, 77,219,168, 36, 19, 65,239,103, 10, 17,176,130,129,179,146,115,102,227, 94,197,176,171,149,186,
-159,122,214,203, 98, 58,159, 13,242,153, 82, 15,172, 33,151,128,179, 56, 90,214,196, 45,224, 7, 96,128,222, 79,226, 46,246,241,
-186,190,191,190, 53,223,254,240,235,244,205,203,125,177,157,160,115, 24,176, 8,208, 26,146, 85, 4,207,244,123,162,213,252,238,
-179,187,157, 86,115,107,197,179,210,157,121,255, 48,203,110,165,157,240,230, 28, 0,206,234,135,154,177, 89,117, 4, 42,193,102,
-173, 23,113,222, 18,120,217,242, 58,169, 83, 10,165, 15, 17,155,144, 12, 91, 97,173,205,141,175, 40, 62, 88,202,159,111,178,167,
-102,193,142,252,108, 57, 24, 4,184,110,179,127,245,214,234,208, 62,118,250,217, 33, 85,232,120,110, 83,170,110,218, 85, 92,245,
-165, 87,131, 17,115,214,202, 81,227,189,203,238,199,159,190, 52, 15,191,255,245,239,179, 4,157,191,177, 35,219,128, 2,122,227,
-158,222,253,225,199,127,210,111,211,104,217,252,238, 17,187,177,202,194,139, 54,142, 64,136, 87, 94,146,101,117, 44, 58,221, 69,
- 58,241, 68,252,213, 6, 36,230, 95,138,197,154,124,245,182,253,178, 47, 63,191,110,247,161,157, 34,133,212,177,237,160,114,154,
-247, 25, 24,150,120, 25,156,247,192, 17,150, 56, 48,131,164,126,140,162, 86,113, 72, 18,177,189, 2, 22,185, 71, 86, 59, 40, 65,
-218, 56,227, 80, 29,165,138, 20,184, 93,221,190,190,156,173, 67, 90,152, 41, 56,224, 0,252,147,223,232,206, 89,204,136, 28,249,
-169, 10, 13,209, 56, 47, 44, 27, 24, 43,222, 47,247, 25, 59,212,165,221,247, 85,254, 47, 0, 71, 87,146, 27,199, 17, 4,107,239,
-101,122,200, 25,145,146, 37, 64,128, 32, 3, 62,217,208,197, 63,208, 69, 79,214, 19,244, 4, 65,130, 12,216, 39,219,176,196,109,
-122,169,189, 28,209, 0,193, 3,135, 32,186,139,153, 89,145, 85,145, 17,200,179,108,183, 46, 33, 6,190, 7,192,159,118,161,208,
-232,140, 48, 28,242, 1,159, 4,181, 16,186,162,158, 1,252,237,205, 53,250, 58, 95, 66, 70,141, 68, 16,154, 33, 83,154,109,241,
-141, 60,189,161,214,202,131, 15,236,216, 93,159,220,126,110,157, 41,153,165, 38,141,111, 8, 6,153, 85,105,188,186,192,215,228,
-176,192,120,108,128, 83,128,107,141, 7, 95,141, 26, 40,229,169,238, 16,106,141,103,223,128, 43,168,148, 38, 33, 57, 92,197, 6,
- 2, 36, 92,144, 54, 22,117, 48,236,170, 37,156, 35,211, 5,141,102, 44,198,106,202, 64,160,131, 11,187,160, 1, 45, 55,120, 4,
-158, 9, 68, 21,138,186,184,138,229, 33, 1,229, 26, 64,141, 12,248,139,218,202, 28,229,113, 48,182,142,161,242,112,195, 81, 46,
-218,211, 8,175,238, 74,197, 26, 48, 77, 95, 87,250,242, 80,198, 2,176, 67,179, 59,160, 36, 24, 22, 13,157, 44,194,177,207,109,
-176, 8, 24,119, 0,234, 47,163, 5, 32,204,102, 13,115,211,151, 38, 93,179, 28,159, 48,212,122, 61, 73,193,146,183,213, 17,144,
-207,231,105,178,243,136, 4,141, 40,117,188,114, 97,165,145,114, 46, 27,126, 7,121,222,204,200,190,193, 46, 88,243, 31, 60,193,
- 62,159,196, 35,231, 84,164, 24,196, 18,139,203, 58,112,214, 66,208,214, 22, 5, 54,147,113,136,252, 17,244,139,236, 69, 93,242,
-178,101,192,234,177, 59, 94,176,186, 36, 68,181, 23,135,235,214,125,122, 58,145, 86,208,221,107,235, 91, 29,232,162,130,103,236,
-144, 79, 36,125,176, 94, 3, 94,241,150,127, 13,164,231, 33,172, 35,213,184,128,236,105,151,179,201,109, 69,237,240, 65,208,215,
- 5, 81, 25,239,241,159, 37,225, 20,189, 75, 34,131, 82, 29,170,246,169, 62, 40,186,185,143, 60,202, 39,107,142, 22,150,149,178,
- 51,180,168,115,180, 53, 23, 60, 67,173,167, 9, 5,174, 60, 44,197, 92,115, 36, 7,117, 64,175,156, 35,234,164, 6,158, 40, 53,
- 44, 70,122, 63, 12, 1,208, 29, 64,241, 41, 24,250,210,144,200, 2, 84,117, 1,232,192,207, 13,237, 73,132,184,198, 38, 16, 73,
- 68, 80, 50, 13,201,144,225, 95, 57,102, 63,225,201,143,182,146,188,133,140,230, 69, 92, 26,186,201,227,239,175,255, 9,125,107,
-127,122,255,254,252,238,183,236,142,255,136,167,187,205,223, 83,208,130,175,102,246,153,210,186,223,169,134,157, 51, 58,137,221,
-170,157,197, 61, 43, 50, 93,209,251,197, 40,132,229,229,170,140,251, 16, 53,246,113,201,209,154,188, 91,209,231, 96, 72,161,214,
- 21,251,122,206,120,204, 66,129,117,228, 80,115,104,246,139, 2,156, 92, 83,203, 55, 28,229, 65,187,155, 88, 20,176, 76,141,244,
-207,226,149, 68, 37, 18, 49,144,165,167, 66, 79, 79, 76,106, 14,169,128,194,189,166, 48,235,180, 26,118,222, 0, 80,228,120,102,
-244, 1, 41,208, 38, 22, 27,204,134,237,146,238,197, 77,123, 0,254, 60,239,166,190,137,146,228,101, 35, 97,178,158, 41,183, 44,
-149, 29,107,215,174, 6, 83,142,244,179,225,202,158,247,246,232,213,115,243,246,195,231,233,247, 63,131, 63,217,216, 3, 75, 7,
-192, 26,141, 14, 31,219,187,225,209, 0,234,198,170,132, 69,246, 9, 52,198,232,140, 11, 58,192,176, 33,198,177,122,249,162,230,
-120, 52,104,120,117, 91, 12, 90,182, 17, 81,113, 88, 51,144,128,239,138,143,213,166, 57,138, 88,131,238,169,234,125,133, 52,190,
- 32,217, 37,101, 70,250, 84,121,155,137,162, 82, 99,149,211, 24, 51,189,233,221,116,123, 37,196,223,164,179, 0,133,144,180,210,
-183,237,210,247,233,245,225,230,143,127,117,121, 89,232,189, 68,189,239,232, 26,157,122,159,145,199, 40,158, 30,211,207,175,127,
-121,247,107,153,191,124,165,196, 16, 58,114,116, 40,138, 87,186,207, 94, 78,189,123,243,215,215, 37,139,251,160,187,147,125,222,
- 33,224,176,213, 81,130,252,168,141, 88, 19,202, 59,135,240,177,232, 5,224,245,160, 34, 0, 95,155,147, 61,147,249, 22,222,190,
-200,223, 38,251,241,110,221, 92, 58, 10,192, 54,108,248,105, 67,195,103,118,219, 54, 69,197,115,196,166,236,195,174,134,205,105,
-184,146, 58, 35,123, 45, 35,243, 73,161,208,120,236, 5, 90,142,149, 10,130,137, 34,173,237,200,170, 68,180, 55,160,144,232,241,
-128,119,199,142, 30,234, 52, 12,143, 78,153,157, 3,142,170, 13, 56,139,102, 14, 17,238,111,240,222,232,138, 57,196, 15, 60,229,
-104,158,165,111, 17, 71,238,127, 1, 56,186,122,222,198,141, 40,184,223, 43,138,164, 37,159,239, 96,228, 3,200, 33, 8, 82,164,
-189, 50,125,128,212, 41,242,199,147, 38, 8,140, 84,119, 9,206,177,100,137,228,146,251,121, 51,170,172,194, 16,168,229,219,121,
- 51,187,239,189, 49,172,126, 75,244,112,198,211, 71,200, 18, 53,200,124, 17,127,209, 77,182,198, 88, 86,176, 92, 91, 23,197,114,
-158,168, 95, 91, 28, 67,199, 78, 86,246,142, 42, 0,225,115,163,215, 16,180,187,196,143,165,143, 25, 94, 49,231,133, 89, 5, 89,
- 93, 86, 31,216, 42, 81, 0, 84,234, 21, 26, 46,251,233,120,126,140, 3, 7,195,148, 9,137,223,170,113,148,216,185,144,216,167,
-205,244,134, 14, 40,205, 2,250,228, 0,121,107, 0,228, 33,215,131,217,109,151,219, 84,187, 44, 6,153,102, 72, 67,199,189, 3,
-190,130,157,214,122, 97, 22,108, 12, 75, 85, 28,111,213,234, 60, 95,135, 40,100,217, 34,107, 7,183, 44,174, 37,124,222,196, 29,
-182,101,111,169, 74,192,155,147,237, 35, 2, 83,131, 71,178,220, 83,139,152,192,160, 4,242, 4,167, 37,208,111, 50, 93, 89, 55,
-220,250,153, 86,211,131, 88, 51, 48,172, 26,119,217, 32, 88,194, 94,220,252,123,120, 63,231,128,197,160,254,236,229,233,147,104,
-175, 2,209,197, 57, 15,126, 71,161, 37, 78,224, 25, 28, 89,146, 26,132, 10,242,129,232,119, 72, 60,142,182, 34, 25,218,154, 54,
- 16,236,215,189,245,182, 23,111,187,137,142,146,109,208,108, 42,109,160,162,216,105,133,198,204,192,114,104, 96,149,104, 7,250,
- 89,222,107,206,194, 91,123, 31,103,132,185,200,118,151,183, 92, 74,200, 32,197,107,217, 53,182,148, 70, 7,190, 12, 38, 33,161,
- 24,163, 11,224,197,234, 94,247, 34,255, 95, 78,214, 88,182,170,103,157, 15, 9,202, 19, 73,136, 39, 93,224,220, 28, 3,239, 8,
-107,200,101,226,214,225, 93, 85, 1, 23,192, 58,201, 37,151,173,174,208,171,117,201, 47,154, 71,167, 75, 2, 37,112,154, 13,152,
-178,180,203,178,113,240,221, 42, 0,243, 44,171,203,252,158,169,242,188,108, 87,216,211,164,110,125,159,185,227,144,174, 35,242,
- 61,200,244, 27, 44, 72, 19,111,199,215, 60,128,244, 53,218,203,138,244,206, 46, 27, 50,120, 91,156,190,239,109,153,221,232,150,
- 50, 36,177,106,123,149,107,218,177,136, 71,181,126,200,136,251,118,199,146,237, 30, 20, 21,137,158,227, 88,243, 53, 45,177, 79,
-188,196, 31, 54, 91,104,138,205,139,172,101,141, 32,173,185,238,189,157, 59, 53, 84,144,253, 60, 46,221,219,119,239,127,253,197,
-191,255, 1,248,248, 28,175, 19,173,182,236, 72,227, 9,137,188, 30, 57, 59,140, 77, 89, 8,179,174,153, 36,121,248,130, 52, 6,
-160,102,127, 0,135,233, 88, 22,189,241,115, 14,156,115, 23,140,198,194, 88, 15, 80, 6, 53,177,171,143, 57,128,155,128, 64, 34,
- 1,180, 89,213,104, 0,244,172,108,128,114,207, 54,241, 18,145, 51, 82,245,169,230, 9, 50, 10,192,165,125, 71,223, 43, 90, 10,
-156, 93,122, 3, 37, 11,149, 6, 57, 91,241,255,219,210, 42,182,239,186,213, 51, 2,149,222,237,160,146, 54,148,176, 70,115,174,
-172,201,104,117,137,114, 46, 44,115, 0, 4,207,136,130,169,176,227, 45, 84, 4, 74,189,208, 65,140, 62,227,145,103,194,193,241,
-144,171,232,218, 33, 24, 30, 58, 58,246, 58, 9,237, 44, 31,235,227,241,193,252,244,243,211,195,135,167,244,111,139, 72,249, 96,
- 0,119, 92, 11,150, 96, 70, 93,189,146,171, 74,123, 86,157, 65,143, 0,136, 93,208,107,200,122,116, 13, 81,146, 1,204,237,230,
-124, 41, 11,176,206,226,169,148,159,217,215, 26, 55,214,220,101,164, 43,164, 5,203,187, 2,144,190, 23,188,160,132,156,193, 54,
-124,150, 15,154, 29, 29, 7, 68,200,252,163,217,184,201,121,192,230,170, 7, 57,210, 30,140, 94,100, 20, 68, 72, 29,160,189, 32,
- 72,223,125,255,213,223,207, 94,185,245,232, 29, 30, 14,223,110,207, 82,142, 74, 3,156, 95,192, 61,190,249,253,183, 31, 69,121,
- 58, 61, 67,232, 27, 2, 63,116,205, 42, 78,157,252,250,254,219, 63, 63, 30, 62,197,167,241,209,131, 59,128, 47,206,190,244,100,
- 47,157,235,228, 22, 64,108,195, 93,207, 11,108, 30,255, 38, 94, 50,209, 73,201,142,118,235, 1, 79, 0,165, 67,254, 99,249,231,
- 63, 22, 38,180,204, 92, 84, 42, 40, 35,226, 1,191,204,115,182, 19, 40, 17, 66,180, 85, 43,183,137,227, 31,101,230, 85,153, 41,
-197, 32, 98,247,224,112,120,127, 26,235, 87, 32,163, 36, 40, 15, 22,165,203,110,182,181,187, 77, 82,110,114,153, 30, 14,219, 94,
-237,233, 34,111,134,138,204,205,169,225, 45,239,188, 41,135,163,185, 76,156, 15,165, 70,232,241,156, 47, 19,128,124,208, 30,122,
- 6,203, 79,158,251, 69, 0,142,174,101, 71,142, 34, 8,118,117,189,250, 53, 51, 59,227,149,133,224,194,205,230, 0, 7, 75,136,
- 27,248,110,127,185,111, 8, 36,100,201, 18, 39,131,196,194,206,184,167, 31,213,245, 36,162,207, 59,210,246,212, 84,102, 70,100,
- 71, 70, 2, 28,139,173, 61, 4,181,157, 66,253,116, 19,101,227,197, 84,103,117, 79,203,237,115, 51,235, 96,102,208,152, 41,117,
-193,254,147,192, 42, 2, 7,173,144,105,188, 54,133,110,240,156,121, 41,117, 99,137,231,217,178,173,194,173,200,198, 9,250, 18,
-214, 38,112,243, 91,211,165,136, 59,175,197,139, 97,243,196,112,136,108,252,239,218, 30,129,108,244, 45,175,218,168,174,238,117,
-115,162,248,130, 77,227, 81, 90, 74,118, 19, 21,147, 50,187,181, 34, 21,136,213,124,202,185,110,197,152,234,115,146,184, 44,121,
-203,157, 4,136, 46,107,165,142,138,194, 66, 32, 33,185,229, 57, 27, 26, 96, 5,156,145,192,161,116, 64, 79,125,238,235,202,186,
- 26,188,113, 3,150, 33, 11, 6,163,214,131, 65, 12,249,109, 98, 98, 19,181, 56, 33,116,105,132, 17,169, 43,229, 98,105,118, 38,
-144, 87,239, 71,126,177,134,226,120,252, 25,121,151,210, 89,112, 17, 46,168, 5,248,143, 10,160,150,162,138, 16, 77,187,191,245,
- 93,169, 3, 67, 84,244,142,130,103, 81,183,243,204,221, 53, 18,135, 29, 43,182, 33, 10, 88,140,200,193,105,156,225,102,227,128,
- 42, 79, 83, 93, 42, 76,135, 38,104,238,118, 53,168, 2, 20,165,160, 76, 37,107,164, 32,153,160, 11, 55,229, 26,141, 2,237, 3,
- 60, 69,101, 13,244,245, 80, 40,195,220, 84, 36,118, 95, 39, 5, 70,236,203, 62,214, 59, 33,175, 0,196,211,126,179,211,114,107,
- 30, 17,112, 95,190,200, 0, 16,192,145, 26,174,106,202, 72,189, 53,181, 90, 58,229, 53,239,243,218, 3, 7, 1,131, 23,157, 98,
-147, 55,148,118, 51, 75,230, 3,230,160,234, 20,219, 18,124,103,203, 2,176,194, 89,206,137, 43, 25,105, 12,137,227,138, 46,115,
-155, 23, 55, 95,167,158,141,114,206, 52,165, 93, 81,196, 61,164,251,164,103,205,237,131, 40,130, 28,146,151, 93,210,143,186,234,
-173,248, 28, 79, 98,210,246, 82, 1, 48,148,231,150,150,240, 72, 29, 11, 56,193,127,235,246,160, 2, 37,189, 5,119, 58, 15,244,
-142,115,128,157,121,157, 42,215,150,115, 89, 22, 16,166,170,215, 62, 48, 65,150, 22, 5, 43,101,235,129, 49, 18,231,201,146, 69,
-208, 4, 13,200,160, 86, 83, 58, 96, 37,174,217, 93, 15,229,171, 31,127,120,249,211, 47,151,243,229,239,188, 92,183,117, 45, 8,
- 49,190,193,164,159, 5,211, 58, 81,144,228,224,147,192,143, 14, 76,222,176, 58,131,229,210,191,144,179, 9,123, 21,207,108,208,
- 69, 48,217, 66,215,205, 53, 0,234, 36,132,110,114,108, 41, 74, 78, 62, 9,205,209, 95, 1,228, 76, 59, 53,160,163,178, 47,162,
- 42,137,239,159, 19,149, 38, 68,215,133,118, 78,212, 1, 35,191, 9,183,228, 67,166,137, 84, 88,138,156, 40, 87,227, 70, 39,176,
-232, 59, 3, 8, 15,162, 16, 0,185,196,224,105,247,140, 76, 11, 98, 0,192,135,186,186,236, 47, 30,198, 93,111,192,142, 70,158,
-198, 28, 54, 42,235,121,218,138, 22, 64,108,254, 16,143,208,106, 20,145, 96,135, 90,118,188,155,120, 30,117,230, 28,242,227,195,
-165,188,250,249,183, 23,111,255,154,130, 97,235,184, 45,149,115,249,190,160,202,225,119, 1, 14, 90, 71, 79,243,162,235,152,210,
-161, 7,197,243, 98, 68, 53,180, 83, 28,101,154,146,233,189, 26,149,136,215,202, 54, 49, 68,239, 64, 6, 65, 42, 64, 98, 1, 53,
- 4,229,239,142,211,231,220,217, 16,213, 5,217, 96,149,247,144, 30, 58,215, 44, 56,111, 26,190, 44,184,200,224,234,238,168, 57,
-110,128,115, 59,128,252, 60, 86,195,215,220,103,139,164,104,168,156,163,146,225,166,228,226,255,252,254,205, 55, 31, 62, 61,120,
-255,175,218,240, 29,100,213,138, 54,136,201,231,155,158, 69,236,223,191,251,238,213,235,233,254,251,199,140,171,206, 53, 84, 41,
- 52,213,253,217, 31,135,161,169, 95, 63, 61, 93, 27, 50, 89, 73,177, 37, 8,142, 0,122, 56,161, 0, 59,148,163,222,200, 69, 4,
- 1,134,102, 84, 75, 21,108,197,222,184, 40,233, 89,249,169,116,223,190,108,254,208,211,175,119,186,217,247, 92, 35,146,232,151,
- 6, 92, 0, 52,195,141,148,146,166,162,230,172, 56, 5,139,186,198,117, 64, 20,193,169, 57,148,169,138,134,182,111, 53,251, 91,
- 9, 8,166, 54,224, 77,133,198,104,248,136, 19,124,165,207,125, 59, 17,121,243,234, 27,128,221,193, 88, 57,113, 95, 28, 67,212,
- 3, 66,216,194,247,207, 8,109,219,181, 50,205,155, 67,114,213,185, 25,172,242, 27,251, 25,217,202,227,246,191, 0, 28, 93,201,
-170, 28, 71, 16,172,165,171,170,171,123, 70,111,222,198, 3,161,163,193, 96,140, 78, 62,200, 7, 95,141,175, 62,250,171, 5,190,
- 25,124, 52,182, 37, 63,105,150,222,107,117, 68,195,192, 48,115, 24,122,186,171, 50, 34, 43, 51, 35, 88, 63, 91,177, 11, 65, 7,
- 98,154,145, 30,143,212, 41, 43,110,171,224, 0,141,119, 95,204, 43, 62, 53,230, 54,173,233,116,112,211, 48,230, 53, 15,137,134,
-109, 53,146,101, 84,246,112,148, 45,143,130, 89, 62,149, 1,164,147,247, 10,107,116,212,234,145, 98,133, 13, 41,117, 82,253, 42,
-229,147,188, 83,135,106, 29, 66,110,183,237,173,138, 88,238, 41, 96,115,124,229,211, 28,250,146,242,225,177, 70,167,150,140,180,
- 35, 70,228,232,148,214,241,206,130,147, 52,229,203, 20, 14,193,197,134,106,216, 64,151,176, 31, 90, 79,101,235,164,158,151,178,
- 72,150, 13,157,162, 6,114,181,249,228, 21, 96, 37,172,172,139, 82,211, 8, 97, 74,105,179, 85, 18, 85, 48,239, 70,220, 56,251,
-143,196,195,233, 30,187, 31, 87,146,167,218, 24, 78, 90,210,136, 57, 50, 57,167,113,145,247, 82,220,112,253,236, 29, 3,120,112,
- 72,149, 86, 33,105,206, 14,233, 45,101,190, 16,101, 1, 47,185, 37, 50, 47,234,104,203,212,100,188,154, 76,209,244,171,104, 30,
- 40,228,166, 19,193,155,167, 58,146,149,243, 68,207,247,195,193, 45,106, 65,208, 51,171,160, 28,106,237,186,132,219, 93,176, 19,
- 84,131, 64,185, 89,159,173,182,219,156, 34, 59,100,182, 13, 48,169,239,108, 25, 20, 59, 35,192, 4,232,193, 48,187, 67,155, 3,
-112,139,237, 73,156,122, 45,105,186, 72,164,254, 77,199, 90,100,191,250,171, 41,106,177,233,175,206, 55,167,227,215,192,190,237,
-186, 88,186, 66,152,160, 99,171,141,175,110, 53, 60,117,208,194,118,117, 29,139,236,177,139, 27, 26,208, 40, 54,110,197,177,206,
- 3,201, 33,158, 21, 13, 20,199,118,219,228, 54, 4, 10,144,109,106,185,114,174,116,142,107, 5, 21,160,158,249,238,207,182,171,
-157, 99,161, 58, 33,166, 42, 70,203, 43,227, 92, 54, 21,241,100,103,234, 70,211, 93,233,173,196,122, 19, 79, 38,127, 58, 54,194,
-107, 3,250,179, 37,107, 82,146,206,135, 35,210, 92,161,238, 31,179,187,217,117,192,253, 98,187, 64,217,187,121,124, 41,193,183,
- 92,115, 75,237, 43, 51,220, 94, 89,231, 98,136,140,116,236,242, 0,148, 53, 30, 89,133, 57,115,252,244,122,138, 72, 16, 12,253,
- 56, 75,152, 75,243,248,237,175, 63, 61,127,255,254,179, 80,127,206,151, 69,208,161,160,149,101, 1,140, 82, 2, 12, 59,217,236,
-241, 29,107, 44, 49,194,237, 19,183, 52, 97,231, 54,222,246,201, 12, 89,247,100, 36,237,178,190, 37, 98,103, 54,156, 66, 98,229,
- 13,161,151, 99, 48,204, 18,115, 6,241,211,128,219,168,116,240,130, 13,109,248,149,132, 39, 0,220, 97,114,181, 14,187,123, 65,
- 74, 72, 81, 10,110,203, 18, 87, 0,248, 90,166, 85, 43,240, 20, 81,219, 30,185, 80,216, 94,107,227, 12,232, 4,235, 2, 23, 69,
- 13,116, 25, 64, 57,228, 44,233, 5,198,214,155, 12, 92, 9, 69,175, 23, 10,228,211,233, 7, 81,124, 2,156,196, 3,190,228, 76,
- 14,126, 11,124, 65, 25,221, 28,189, 3, 91,238,181,152,123,113,111,196,220, 82,102,167,191, 15, 71,163, 30,190,121,190,189,255,
-229,143, 55,223,157,135,155, 40,171,199, 95, 6, 59,223,179, 76, 86,154,167,219, 4,192,214, 26,132,155,103, 1,215,254,182, 77,
-201, 14,216,166,198, 46, 91,246,125,123,151,104,191,228,168,176, 38,104,171,101,219, 50,196, 21,108, 92, 25, 54,242, 4, 82,221,
- 86,215,171, 14, 25,113,112, 68,136,199, 34,121,212,151,241,141,116, 8, 58, 14, 96,168, 92,181, 30, 0, 78, 83,234,142,237,254,
- 98,197,119, 47,226, 29, 24,160, 24,164,162,116,144,102, 73,188,182,216,255,231,255,222,190, 59, 63,148,167,215,244, 73,188,108,
-126,233,145,111, 82,237, 14,168,243,217,124,248,225,199,223,126,238,197,249,227,120, 25, 21,155,200, 56, 87, 19, 39,164,119,233,
-233,237,211,191,203,243, 57,255,222,246,186,141, 61,155, 41, 40,203,177, 57, 74, 66, 80, 4,205,222, 14, 35,222,240, 95,213, 60,
- 83,154, 94, 23,123, 85,213,217, 37,207,193,182, 71,127,156, 62,222,192,112,177, 10,193,124,130,174,180,138,163, 93,113, 2,238,
-115, 60, 8,228, 83,148, 91,172, 77,182,187, 62,235, 22, 0,236,133,106,201, 71, 37,246,147,176, 66, 43,115,149, 77,203, 46, 17,
- 44, 46,151,230,146,218,164, 73, 41,140,163,155,227,157,248,251, 31,128, 91, 83, 58, 85, 94,106, 59, 31,177, 86,213,129,146, 78,
-174, 20,109,117, 59,186,116,138, 54, 82,100,163, 67,232,136,213,113,134, 59,176, 40,221,169,255, 5, 32,233, 74,118,221, 40,162,
-104, 85,215,208,163,109,158,227, 64, 80, 36, 80, 34,177, 9, 40, 31, 16, 36, 4, 98,207, 30,126, 18,137, 15, 97, 1, 91, 36, 18,
- 6, 41,128,157,247,220,109,119,117, 13,174,226,156,206, 7,184,221, 93,195,189,231,220,225, 92, 29,202,102,104, 46,211,109,203,
- 42, 62,245,160,125, 44,169, 62, 30,177, 4, 61,222, 85, 87,176,107, 23, 88,143,222,153, 24,211,195,100, 2, 5,229,224, 51,202,
-236,176,202, 64, 92,122,192,171,224,132,230, 46,227,186,123,118, 60, 88,183,108, 75, 61, 63,105, 92,199,198,116, 54, 34,236,234,
-219, 80,194,168, 14,117,221, 2, 84,105,152, 92,115, 45,229,192, 80,146, 97, 93, 33, 54,181, 82,107,195, 76,224, 4, 55,192, 26,
- 61, 85,197,112, 65,164, 15, 64,220,153, 35, 74,128,223, 23, 14,111, 30,153,135,162, 60, 16,181, 11, 35, 7, 23,168,148, 47,141,
-226,186,202,166,146,100,227, 93, 98, 51,172, 96,141,170, 81, 20, 3,231,132, 63,156,143,142,202,192, 56,248,160,169,140,150,181,
- 56,133, 0, 29, 25,240,142, 73, 84,177, 22, 57,219,133, 17, 72,193, 17,167,184,156, 56,153,184, 61,213,162, 25,168, 1,194, 95,
- 90,166, 64,237,101, 21,187, 85,108,193,194, 54,193, 22,118,131, 4,186, 11, 21,192,158,162, 0, 51,168,124, 3, 60, 1, 60,183,
- 50,205, 84, 88, 12,201,196, 29,206,189,242, 6,204, 68, 82, 44,172, 5,221, 7,105, 81,109,103,129,110,237,206,231, 9,255,169,
- 53,217, 93,100, 21,163, 86, 19, 7,185, 21,117, 7,108,131,215,246,148,159,175,240,224,194, 2,185, 82, 37,198, 8,170,188,100,
- 13,139,135,159,185,202,130, 66,164, 56,219,101, 6,155,131, 29, 48,218,231,147, 42,106,111,236, 91,207,178,130,202, 4, 86,229,
-194, 12, 42,166,172, 96,160,146, 6,219,109, 42, 15,227,207,166, 23, 77,225, 99,170,182,194,130,113,100,161,154, 65,185,113, 41,
- 34,136,173,129,209, 27,227,114, 18, 6, 60, 32,148, 58, 48,188, 27, 22,246,206, 0,119,192, 73,123,139,123, 34, 0,215, 28,229,
- 11, 8,222,239,212, 90,237,158, 87,251,174,139,236, 21,224,117, 93, 74,108,172,222, 3,237,132, 59,131, 63,224, 28,140, 75, 76,
-122,228,116,131, 18,217,204,153,153,135,128, 37, 96, 44,187,206,236,219, 55,147,226, 40, 71,207,218, 93, 99,177, 24,203, 22,174,
-103,147,254,243,226,144, 40, 81,175,123, 71,181,119, 86,132,129,185,218,235,176,248, 45,117, 47, 89,198,162,112,185,212,243,167,
-143,191,253,234,240,233,103,240, 75,199, 56,178,199,241, 70,207, 19,152,249,124,191,255, 12,201,172, 74, 51,106, 96,156,133, 5,
-145, 11, 37,184,227,123, 61, 30,179,166,197,214,146, 20,197,124, 14,107,247,224,252,230, 40,151,186, 48,192, 17,216, 57, 46, 87,
- 86,228,176,141,224, 21, 1, 70, 95, 95, 77, 2,157,110, 88,104,138,207,193, 39,193, 49,137,144, 97, 4, 89,173, 0,191,203,206,
-222,212,204,249, 66, 97,202, 96,109,145,239,176, 45, 21,252, 43,219, 47,250,208, 9,234, 24, 38,199, 46, 66, 63, 41, 92, 45,247,
- 0,114,206, 1, 61,212,202,159, 4,136,107,140,149,135, 15,187, 6,214, 66,122,106, 7,225, 12,203,154,242,201,108, 92,146,140,
- 41,225,128,156,117, 46, 3,108,124,237,141, 36, 81,219,196,161,239, 62,122,241,244,254,227, 47,127,201,159, 63, 28, 79,189,189,
-230,219,208,202,102,102,151,206,194, 49, 58, 14, 71,122,179,171, 62,220,155,244, 72, 53,237,166,216, 71,233, 28,195,159,203, 39,
-103,103,244,233,221,125,250, 59,171,127,109, 22,181, 23,204, 65, 81,173,144,201,247, 8,132,121, 60,203,132, 39, 10,160, 54,155,
- 97, 3,148, 99,120, 9, 16,171,242, 11,240,141, 75,206,245,176,131, 62, 39, 5,210,130,123,198,254,198,204,161,160,109, 43,210,
-113, 12,251,195,238,241, 94, 10, 63,151, 58,201,196,113, 69, 74,193,229,213,238,126,188,123,246,246,213,119, 47,127,250,209,143,
-111,126,215,173,241, 12, 24, 44, 50,110,191,254,230,139, 31,190,239,132,254,249,252,199, 95,249,102, 25, 26, 88,165,212,129, 71,
- 53,168,251,254,217, 63,111,196, 85,176,179, 8, 30,113,169,157,103, 79,108,131,197,156,143,194,246,216,138, 2,127,218, 39,102,
- 8,101,127, 78,108, 17, 1, 55,205,231,186,139,250,201,139,195,235,205,235,223,174,115, 46,122,195,249,214,247, 0, 84, 56,100,
- 65, 82, 76,198,174,234,117,176,223,216,110, 85,181,107, 90,198, 51,169,131,107, 87,241,254, 83,145,158, 77,156,120,180,111,169,
- 68,100,193,229,128,253, 68,109, 27, 22, 96, 7, 27, 41, 28, 62,139,244,252,215,211,173, 21,243, 38,181,137, 50, 64,193,132,108,
- 82,158,122, 15,191,162,133,218,238,110, 94, 39,202, 99,126,144,111, 99, 13,188,215, 73,184,207,144,120,127,186,255, 5,224,232,
- 90,122,228, 38,194, 96,219,253,240, 99,108,207,206,108, 2, 90,164, 21, 73, 86, 4, 1, 7, 34,133, 83, 56,112,226,204, 47,229,
- 39,112, 66, 92,185,129,224,128, 2, 10, 36, 10,154,101,231,225,105,187,221, 47,170,230,186, 90,105,215,109,119,125, 85,223,163,
- 62,133, 72, 91,215, 83, 49,150,220,109,102,113,154,235, 99,159,240,112,133,128,198, 50,227,102,209, 78, 61,228, 92,116,210,157,
- 19,253, 4,193, 52, 20, 24,106,196,101,175,240,176,170, 73, 11,225,132, 56,212,210, 36, 83,123, 93,171,198, 53,178,131,248, 95,
-124, 69, 11,145, 64, 39, 93, 85, 92,225,137,128, 43,166,128,120, 24,214, 8, 61,231,251, 58,117, 99,215,211,141, 27,122,128,203,
-252,240, 69,224, 64,230,133,234,161, 48,185,116,199, 50, 52, 94,179,149,132, 5,124, 57,155, 11, 17,225,154,167,128, 95, 0,142,
-217, 32, 64, 63, 14,244,139,179,172,107,230,132, 64, 74, 95,133,203,148, 54,254,238,138,247, 53, 87,186, 32, 62,148,201,113,178,
- 60,111, 88, 94,208,172, 7,182, 96, 49, 2,124, 57,224,176, 78,228,201, 0,180,186, 13,158,251,195,184, 57, 94,115,181, 55,135,
-115, 46,190,214,130,163,197,115,145,142, 43,132,113, 47, 67,167, 33,234,228, 44, 0,244,224, 37,148,191, 21, 36,150,112,237, 80,
-142,218,221,159,149,234, 64,227,200,191,185,239,167, 16, 19,228, 91, 4,167,209, 42,112, 36,142,115,234,142,131, 78,138, 29,120,
-206,207, 96, 15, 8,150,213, 89,207, 50, 84,113,198,195,103, 40,185, 42, 64, 23,135,229,148, 47, 29,211,204, 79,226,109,227,114,
-196, 92,198,110, 65, 16,172,101,228,156, 19, 56,166, 39,108,200, 42, 50,137, 30,112, 96, 9,145,213,106,159,247,117, 9,188,145,
-242, 56,143, 80,234,156,129,203, 7,220,234,165,140,134, 13,148, 80,243,181,231,164, 54,239, 86, 16, 71,246, 0,137,118, 42,217,
-119,188,162,123,124, 91, 46,187, 37,218, 89, 31, 64, 45,197, 33, 66,206,198,212, 23,246,158,253,138,202, 7,188, 58,200,238,116,
- 20, 51, 2,129,194, 53, 20,215,100,170,180, 99, 97,138,230, 50,199, 83,116, 34,175, 5,222,225,210,228, 86,115,141,106, 0, 19,
- 89, 65,228,196,167,207,118,211,143,101,119,114,156,255,229, 5,201, 52,232, 84,224,197,236, 56, 81, 53,139,252, 19,224,106,159,
- 6,246,222, 40,206,233,140, 39,211, 2, 3, 19,123,175, 35, 91, 79,207, 38,224,231,181,118,149, 53,129,115,128, 16,165,114, 5,
- 52,203, 42,208, 88,175,136,117,255,205,151,143, 94,189,176,221,246,117, 0, 7, 96, 63,117,201, 92, 47,141,238,147, 98,121,116,
-190,116,158,250, 75,174,113,133,207,140, 27, 85, 19,157, 30,153,144,129,220,229,123,154,178, 93, 68, 26,196,165,162, 76, 2, 97,
-240,117, 84, 56, 94,118,146,225,175,210, 46, 51, 81, 75, 71,201, 61,228, 92, 72, 71,112,241, 42,136,102, 78,141, 52, 15, 37,152,
- 61,216, 57, 51,227, 66,186,153, 43,126, 35,248, 20, 94,159,197, 83,151,133,163,228, 13, 26,208,239,183,130,238,173, 97, 46,140,
- 77,231, 90,121, 43,152, 37,228,191, 80,112,117, 96,116,226, 77, 2,154, 65,147,204, 22,188, 43, 90,191,116,179, 96,139,106,193,
-108,162,166,231, 26,183,109,113, 36, 98, 5,180,205,106, 64, 52, 46,171,170,135,182, 26, 6, 77,254,179, 90, 30,111, 30, 95, 63,
-185,251,227,238,213, 47,233, 54,228,253,101,101,224,214,168,120, 16, 39, 64, 86,225,182, 75, 85,223, 42,243,217,117,254, 96,251,
-206,244,127,166,243,125,136,199, 96,195,163, 94, 60,199,167,172,159,143,183, 55,195,238,238,247, 55,195, 78,252, 61,164, 19,104,
-253,186, 53,167, 98, 90, 64,170,206,197, 3,160,218, 76,173,209, 59,187,232,200, 11, 1,248,161,198, 41, 16,233,197, 67, 44,229,
-106, 1, 5,216, 95,129,234,212,221,156,164,167,179,184,157,162, 14,170,191,137,231,255,236,211,237,231,136,110, 92,142,148, 91,
- 28,139, 1,250, 24, 25,122,237, 38,121,248,235,245,183, 95,223, 92,221,124,241,195,247,242,221,191,111,155,169,249,244,195,103,
- 47,191,123,249,226,171, 70,164,159,236,207,111,195,152, 12,148,185,139, 96,175,105,159,221, 33,174, 63, 94, 3, 64,246,239,255,
-233,105,182, 61, 76,208,243,244,137, 99, 5,135, 75,155, 31,178,255, 72,171,227, 88,233,122,114,147,171,228,102, 12,117,178, 62,
-173,167, 6,114,233,234,201,173, 28,220,175,187,227, 20,128, 57,131, 93,188, 76,141,242,151,212,122, 85,151, 11,247, 14, 33, 32,
- 79,160,217,106,157, 74,197, 52,157,198,157,212,108,160,224,138,185, 51,211,105,222, 3,193,202,180,194,197,196, 7, 79, 47,116,
- 64, 54, 0,156,165,213, 30, 88,207,234,157,147,159,252,118,146, 67, 45,171, 90,178,160, 43, 58,208,126,221,118, 67, 56,143,125,
-218,204,235,177,177,181, 55,218,140,107, 85,238,160,178,218, 48,151,109, 6, 31,156, 70, 81,169,255, 5, 32,233,106,122, 35, 39,
-162, 96,183,251,203,109,123, 38,153, 36, 98,181,104,247,128, 8, 39,110,187,136, 5, 33,113,128, 35,127, 26,137, 27, 39,110,136,
- 15, 65,144, 34,177, 75,216, 76,102,198, 99,187,237,254,160,202,220, 70,202,140, 35,217,126,239,213,235,247,170, 74, 7,231, 40,
-195,141,151, 1, 89, 52, 25, 83, 71,224,202,202,201, 33,112,233,116,160, 83, 73, 81, 61, 30,141, 72,155,147,127,168,230,161, 26,
- 54, 50,100,131, 52,135, 7,162, 98, 33,125,221, 1,220,102, 63,200,170, 43, 25,173,126, 83,209, 37, 75, 0,221,113,125, 2,255,
-222, 62, 67,159,140,116, 69, 43, 44,158,230,177,140,165,118,232,114,166, 6, 34,167,160, 11, 89,148,192,164,214,166, 88, 16, 46,
-195, 28, 54,101, 72,169, 57, 71, 51,218,184,229, 94, 22,170,138, 52,211, 17,133,131, 27,183,128, 36,189,157, 0, 81, 43, 59,162,
-108,228, 57, 0,230,161,209, 17, 3, 66,255, 89, 44, 83, 35,246,177,217,225, 77, 87,130,155, 61,171, 18, 64, 6,134,161,255,139,
- 28, 51, 79,192,106,202, 67, 87,179, 21, 13,189,113,241, 5, 21, 92,165, 23,158,143, 22,142,224,129,199,198,121,150, 13, 98,148,
-219, 19,149,241,128, 38,133,109, 86, 59, 69, 23,240, 0,250,163,144, 54, 82,206,135,148, 90, 66,191,133,201, 34, 33, 49,170,179,
-118,128,211,203, 72,213,159,154,211, 76,191,232, 61,185,249, 74, 77,210, 79,233,176,211,184,211,221,152,122,198,101, 12,148,191,
- 55,212,169, 71, 74,243,104, 22,242, 58, 41, 77, 1, 16, 33, 47,195,214, 69, 98, 86, 82,112, 1,125, 22, 84,113,153,252,255,212,
-236,232,104, 38,111,128,220,169,148, 89,184,159,109,100, 92,108,197,209, 24,208, 99, 68,215,213,249, 69, 76, 8,173, 67, 76,163,
- 17, 45,210,174, 49, 36,102,170,206, 8,155,212,192, 65, 1,171, 87, 92, 87, 53, 41,174,130,203,116,195, 20,231, 35,199,241,121,
-175,228,144,208,228, 17, 58,206,229, 18, 29,208, 84, 17,117,246, 49,105,138,188,199, 89, 85,179,168,171, 17,152, 93, 83,102,150,
-147,252,184,158,182, 91,146,231,197,232,121,194, 3,204,118, 89,243,165, 7,170,167, 2,175, 45,226,132, 34, 94, 62,248, 48,108,
- 27, 69, 98, 85,114,114, 26,185, 21,142,139, 46, 35, 42, 69, 57,249,210,234, 43,116,248, 60,216, 66,241, 90,144, 36, 99,157,208,
-237,140,122,172,122,229,110,182,168,219,151,253, 73, 58,155,134,234,200, 53, 40, 45,204,116,193,163, 78,137,251,148,231, 37, 68,
-196,132,255,238,115,247,250, 13, 57,168,115,207,201,176, 76,171,201, 55,247,161,216,128,173, 26, 57,180,200,230,208, 83,172, 7,
- 76, 40,253,132,187,171,177,146,160, 2, 48,157, 74, 19,191, 68, 47, 14,174,184, 89,218, 85, 80,195, 27,159, 87,215,202,236, 50,
-178,150, 72,180, 17,215,148,203,205,129, 14,188,138,226,202, 18,233, 76,175, 83, 32,242, 80,129,231, 18, 55, 12,233,181, 38,205,
-194,152, 20,225,172,233,199, 69, 22, 74,212, 79, 74,116,148,156, 64,139, 72, 2,104, 9,161, 43,238,200, 13, 0,160, 72,153, 66,
-255,192, 45,247,234, 96, 73, 71, 25,150, 58,240,188,212, 70, 20, 41, 0, 61,246, 73,244, 67, 82, 43,143,206, 27,165,149, 71, 8,
- 38,225,240,233,202, 58, 79,199,112,123, 49,251,218, 95, 61,191,118,183,175,126,217,125,246,227,176,171,250,195,230, 98,225, 50,
- 50,202,126, 10,103,105, 82,238,110,253,229,199,221,191,207,111,222, 89,127,127, 24,254,122,252,115,140,231, 64, 75,135, 16, 76,
-169, 99,156,154,205,193,123,253,197,213,237,167,221,205, 15,247, 31,253,250,116,183,228, 63,236,126, 71, 31, 61,145,143, 90, 82,
- 16, 15, 79,183,159,102, 92, 91,180,132, 30,139, 68, 91,161,243,128,148, 48, 25,213, 68, 50, 64,154, 49, 47, 65, 12,126,217,106,
-180,103, 18,192, 87, 29,145,156,197, 83,149, 95,127,253, 66,136, 83,100, 95,149,208,176,114,191,233, 64,238,161,243,234,244,176,
-191,255,233,231,175,190,121,243,229,171,111,223,135,185, 75,222, 55,189, 16,123, 49,124, 31,239,222,207, 1,249, 19,205,178,226,
-221, 70,130, 71,144,184,216,250,246,239,254,230,109,252,103,167,209,163,205,146, 35,146,200, 39, 15,204,101,103,105, 84, 85,200,
- 5,207, 76,192,239, 42,177, 13,238, 34,164,147,156, 78,241,220,188,124,121,253,201,213,111,234,237,239,180, 77,169, 55,104, 1,
- 56, 95,193,189, 95,102,202, 34,161,214,215,200, 52,106,203,149, 31, 73,207, 20, 14, 33,128, 10, 5,185,249, 22, 56,195,100,237,
-164,241, 37,121, 5,172,192,115,203, 49, 79, 66,182, 86,168, 26,127,142,143,248,177,212,187,113,235,174,239, 30, 95,228,210, 95,
-111, 11, 96, 42, 74,187, 23,180,249, 44,237,185,156, 78, 6,152,213,180,136,115,115,230,238,132,104, 72,238,232, 54, 93, 25,129,
- 47,148,169,155,202,213,255, 9, 64,210,149,236,200, 81, 68,193,172,204,172,204,218,186,122, 54,240, 96,131,128, 3,210,248,128,
- 5, 66, 32, 46,136, 3, 95,205,153, 19,200,130, 3, 18, 39, 12, 18, 96, 13,214, 96,247, 82,123,229, 70, 68,249, 58,234,195,116,
-117,189,120, 47, 50,227, 69,232,219, 98,153,215,194, 21, 1, 95,219, 75,109,235,213, 58,212, 41,254,102,129, 56,182,207,150,105,
-167,153,199,138,167, 52, 79, 53,186, 79,233, 18, 55,202, 48,175, 2,125,192,251,101, 33, 49,113, 79,158,178, 87, 97, 76,181, 5,
- 74,106, 47,235, 90,210,190, 90, 73,183, 55,113, 23,175,175,108, 58,201, 6, 80,199,165,107,147,229,204, 48,199,252,163,119, 64,
-107,169, 37,230, 91, 23,215, 25,164, 78,101,171, 90,103, 81,118, 58,171, 99,159, 87,235,160,185, 29,149,179, 72, 65, 19, 75,129,
-142, 93,162, 99,137,147,159, 42,137,121,189,255, 47, 94,212, 49,204, 38, 78,217, 40, 19, 15, 24,123,193,251,211, 64, 81,241,194,
- 24, 83,106,117,137,193, 24,214,171,204,205,145,183, 38,164,143,124,184,193,112, 83,128, 38,148, 13,229,123,105,165,184, 68,239,
-189,115, 83,202, 71,158,162, 5, 74,175,149, 28,132, 47, 3,245,196,130, 17, 36,203,204, 84, 34, 14,126, 24,140,156, 23, 83, 42,
-170,108, 2, 25,166,238, 71, 45, 34, 26, 74,120,124,239,179, 62,151,205,236,151,188,168,117,106, 10, 96,109,236, 10,207,212,226,
-128,255, 33, 45,232,122, 0, 17, 43,164, 85,251, 57,239,105,165,158,236, 96, 12,234, 38,247,203,132,247, 79, 37, 70, 25,198,194,
- 90, 87, 76, 60, 65,244, 96, 71,148,215,206, 25, 53, 63,117,229,162,167, 61, 6, 79,105,162,155, 2, 31,173,226, 53,146, 50,189,
-157,252, 61, 6,207,236,140,151,129,113,171, 19, 91, 66,210, 97,230,138, 74,180, 91,158, 11,149,149,129, 2,199, 82,209,158, 42,
-113,127,135,199,209, 3, 5, 13,249,254,188, 62,232, 21,116,240, 56,178,191,102,220, 16, 24,192,146, 44,125, 32, 66,206,140,185,
-140, 66,110, 13,188, 69,119,224,229,210,102,135,126,136,226,210,138,209, 82, 16,169,107,222,180, 22, 42, 99, 16, 32,190,111,201,
-250,113,215,121,147,202,139,198,138, 11,119,115,113,248,234, 89,241,252,167, 1, 32,150,152,210,228,185,169,149,104,228,172,215,
-145,251,109,225,141, 75, 55,213, 14,221, 21,244, 53,250,184,101,201, 97,106, 38,238,205,157,113,239, 1, 69,175, 64, 32,179,119,
-153,133,152,164,200, 99,237,196,209,173,231, 50,150, 55,159,126,254,232,139,187,225,227, 39,139,240,175, 24, 60, 73,255, 6, 90,
- 85,160,213,242, 98,140,191,198, 91, 31,119,134, 24,109, 14, 51,126, 51,155, 41,183,204, 84,254,198,248,168,167,238,141, 54, 88,
- 34,175,222,250, 3, 99,114, 15, 11, 13, 73, 49,197,111,143, 13,152, 58, 59, 38,136, 40, 73, 75, 48,238,207,161,180,217, 5,230,
- 16, 6, 10, 59, 35,106,169,142,246, 65,130,212,219,173,143, 10,231,198,164,151,108,181,139,164, 33,217,234,214,164,150, 99,210,
-167, 8,132, 1,105, 19,168,132, 42,209, 97,104,136, 1,255,118, 4,101, 33, 51, 58,245,153, 92,162,234, 25,216,199,101, 40,224,
- 87,164, 11,205,196,140,123,148,175, 64, 15, 4,122, 90,158,185,163,171,163, 84, 77,219, 40,142,178,173, 2,244,232, 70,182,215,
-246,230,195,253,112,253,205,207,151,119, 47, 6,244,165,127,234, 98,209,129,114, 78,211, 46,103, 76,109,135,203,175, 31, 55, 79,
- 63,120, 17,211, 31, 99,127,120,184, 63, 6,215,201,161,100,120, 66,146,148, 73, 59, 69,153,253,241,220,117, 38,205,191, 94,230,
-230,187, 39,223,190, 95,127,246,253,159,234,213,223,191,155, 98, 14, 49, 55, 75,200, 79,121,135, 70, 47, 85,139, 50, 86, 52, 0,
- 79, 65,197,162, 31, 23, 67,185, 75, 64,173,249, 78, 58, 12,170,166,212, 60,230,229, 62,134, 76,152,118, 90,213, 29, 83, 54,150,
-119, 31,229, 66,252,181,177, 40,116, 31,238,101, 5,203,104,161, 66, 23,228,139,247,247,231, 31,159,183, 95,190,124, 71,214, 96,
- 68,113, 58,224,135,119,175, 15, 24, 43,136,217,168, 91,116,240, 16,228,126,163,216, 34,218,246,106,236,218,202,254, 86,114, 31,
- 80,226, 69, 11, 98, 89, 65,150,240,120,188,191,106,252,250, 58,109,215, 36, 3, 33, 30,196,148,146, 32,167,132,121,116,251,248,
-233, 39,247,249,225,151,211,155,137, 94, 88, 74,165, 9, 21,180,228, 43,176, 2, 99,224,150,247, 5,120, 5,124, 52, 73, 22,165,
-167,242,193,234, 22, 35, 33, 87, 12,168,234, 45,121,219, 65,182,173,103, 94,246,246,153,104, 35, 70, 99,177,212, 34,163,188, 93,
-223,106, 89,209,250, 80,228,207,126, 0, 95,181,255,210,101,211,236,196,232,246,248,228, 78, 19, 92, 42,148,194, 46, 4, 87, 50,
-200, 9,148,158,139,151,205,149,172,245, 12,152, 77,197,190, 51, 35,222,172,255, 5, 32,233, 74,118,219, 56,162, 96,207,244, 58,
-156, 17, 69, 42,138, 35, 3, 10, 96, 56,128, 45,192,151,192,112,150, 99, 62, 34, 95,153, 91,254, 33, 64, 78,185,248,226,115, 54,
-216, 80,108, 81,228,112,182, 94, 83, 53,190, 16,224,129, 24,178,249,186, 94, 85,247,123,245, 0,176, 13,207,228,236,162,250, 75,
-108,169, 44,135, 60, 57, 97,219, 46,143,103, 40,129,125,112, 30, 84,141, 67,250, 52,107, 32,165, 49,147,143,141,214, 75, 45, 23,
- 85, 57,118, 75,103,229, 11,237, 50,161,149,205,165, 76, 75,197, 89,205,166,174,219,213, 17,213,149,176, 11, 95,141, 44, 4, 51,
-202,225, 99,105,231,221, 80,103, 99,116, 54, 67, 9,110, 29, 73,230,149,167, 67, 23, 36,237,168, 32,204,181,108, 34,239, 57,177,
- 71,228,192, 42,171,184,233,205,188,142,176,104, 56,237,112,226,168,106,173, 84,236, 75,123,157,103,155, 79, 3, 40,176,144,150,
- 71, 15,113, 46,195, 63, 41,111,165, 85,245,227, 41,250,102,218, 10,135, 84, 3,238, 82,185,226,238, 3,228,254,178, 3,164,101,
- 2,219,196,182, 61,109, 45, 4,210,106,126,196,107,227,180, 20, 97, 56, 64,111,157, 63,201, 62, 81,161,215,137,107, 97,157, 64,
-211,169, 84,141, 6,112, 2,242, 41, 58,176,146,192, 58, 27, 71,215, 30, 48, 34,136, 52,172, 21, 18, 53, 2,199,131,220,131,242,
- 23, 25,217,241, 89, 62,143,170,147, 28, 97,164,216,126, 11, 98,139,197,218,241,141, 75, 16,197, 10,128, 46,173,232, 76, 53, 0,
- 90,165, 12,120, 46,205,159,243, 57,179,123,166,118,238, 0,186, 22, 52,114, 82,160,131, 33,239, 87,105,187, 71, 95, 42,158,168,
- 35,243, 34, 55,112,227, 9,213,167,152, 23,128, 78,239,231,186,221,108, 68, 57,124,144,245,101, 2, 69,196,178, 9,218,107,178,
-137,206,214,210,145, 73, 37, 99,104,186,216, 71, 0, 86,169, 11, 18, 37,187,162, 88,234, 38,231, 81,206,103, 57,185, 37,208,167,
- 79,225,167,129,177,234, 17,107, 39,231,227, 60,157, 75,139,133, 51,114, 14,193,101,210,195,235, 26,112, 41,188,163,237, 21,126,
- 0, 18,190,165, 97,156,114,174,240, 32, 18,108,122, 43,147, 74, 27, 41,175,191, 86, 95,118,234,234,101,155,174, 33, 68, 63,254,
-252,211, 23,207,182,187,223,222,181,247,231,251,105, 60,252, 53,150,250, 49,237,155, 51, 18,226, 39,233, 59,163,171,105,214,198,
- 35, 70,188, 75,139,176, 38, 34, 50, 74,213, 25, 14,146, 67, 90,130,180, 29,102,112,232, 65,166,241, 92,111,130, 19,213,222,238,
-170, 23, 47,119, 63,190,190,120,246, 13,152,248, 81, 76, 51, 24,105, 33,123,162,229, 15,228,100, 34,133,103, 73, 27,245, 27,207,
-100,212,122,236,190,226,252,122,151, 41,214, 91, 25, 78,234,225, 65, 59,232,192,178, 94, 35, 40,188,242,138, 97, 49,185,208, 85,
-167,140, 61,125,211, 33,155,196,194, 62, 67, 44,234,200,154, 72,159,129,130,214,212, 96,236, 85,218,176, 64, 84, 61,132,124,146,
-106,168,124, 27,227, 80, 71,142, 64,102, 31, 7,210, 85, 68,220,205,180,178, 1,217,196,151,153,165,196, 14, 65,120,213,200,228,
- 15,128,178,210, 92, 80,114,145,137,246, 82,241,174, 39,132, 30, 58,152,201, 7, 59, 43,228, 69,209,160, 1,193,203, 1, 8,142,
-165,113,117,210, 98, 6,139,180,114, 99,170,104,140,122, 82, 83,232,201,108,117,188,184, 49, 87,207, 95,124,120,250,253, 31,227,
-221, 18,143,122, 57, 52,149,171, 45, 1, 99,158,253,114,230, 49,230, 15, 55,238,219,231,127, 15,211,219, 19,196,194, 49,249,137,
- 67, 45, 35,216,210, 60,149,172, 35, 30,213, 70,147, 77,136,192,148, 42,121,253,241,124,234,252,175,223,237,223, 40,247,250,151,
-147, 24, 31,222, 73, 77,243,219,212, 77,247,122,218,158,128, 91, 25,144, 81,129, 69, 73, 57,214,150, 3,153,245, 8,157,131,132,
-177,147, 46,157,193, 26,195, 30,128, 5,249,160,201,194,186, 44, 66, 63,220,222, 62,189,185,109,132,248,143,141,143, 28,253,148,
-233,123,161,214,182,254, 65, 39,171,237, 14, 57,250, 48, 63,246,149, 86,177,200,234,140, 92,232, 21,253,171, 37, 80, 58, 29,145,
- 20, 39, 25,117,189,128, 43, 47,136,255,209,117,135,251, 35,232, 23, 99, 57,206,173,189,202,216, 89,126,236,240,175, 54,155,135,
-172,162, 79,128, 58, 48,179,168, 92, 59,143,147, 26,178,236,110,159,188,186,187,123,191, 89,126, 31,254, 61, 68, 4, 84,166,227,
-117, 98, 65, 22,239, 4, 62, 87, 19,179,180, 10, 15,130,130,134, 46, 67,220, 92, 84, 9, 72, 52, 91,132,108,134,156, 55, 52,148,
- 32,133,192, 38,128, 54, 8, 6,127,138,104,148,248, 36,165,141,217, 33,157,208,169, 91,132,205,165,189,250, 51,191,121,251,126,
-188, 73, 78, 90,171,219,220, 39, 54,245,104,191,173, 89,110, 92, 28,116,232, 82, 76, 99, 9,225,222, 55, 60,223, 87,165,182,195,
-181,216,232,230,194,225,249,195,255, 2,144,116, 45, 61,142, 19, 97,176, 95,182,219,237,100, 50,155,153, 12, 3,136, 97, 37,132,
- 4,135,133,189,140,132,180,218, 3,127,153,127,128,184, 32, 33,193, 9,137, 27,210, 34, 96,197, 60,147, 56,118,187,219,221, 77,
-149,247, 20, 77,164, 76, 98,187,251,171,239, 81, 93,101,168,176, 20,231, 58, 32,230, 97,161,202,253,161,214,199, 72,106,166,117,
-227, 52, 77,177,213,167, 80,205,135,140,183,165,149, 19,242, 9, 43,169,184,105, 92,174,116,225, 71, 26,148, 9, 13, 42,105,239,
-197, 90, 13, 72,150,213,121,125,148,186, 37,106,205,174, 1,198, 87, 66,110,218,199,202,127,164, 67,135, 12, 84, 20,217,216,190,
-243,184,222, 70, 90,178,158, 17,200, 36, 82,106,170,247,102,147,102,206,142,145, 71,163, 46, 75, 6,101, 1,123,154,101,138, 61,
-146, 80,124, 52,236,107, 13,220, 26,177,131,200, 81,152,234, 30,225,175,110, 66,175,175, 91, 54,196,169, 42, 24,173,181, 0, 92,
- 73,253,242,178,118,165, 12, 60, 97,170,168,183,131,130,178,226, 4,195, 35, 44,230,140,103,223, 56,138, 98,205,153,210, 92,156,
- 97, 11, 82, 7,169, 1,133, 63,216, 53, 38,185,155, 74,222,168,159, 54,128, 65, 74, 72, 68,250, 64,196,217,205,128,194, 46, 70,
- 18, 85, 85,181,136,147,144,182, 76,127, 34,220, 84, 96, 56, 15,203,106,211, 68, 29,140,119,134,190,197,244, 50,166,166,186, 32,
-243, 49,101,236,216, 65,148, 75,139, 45, 77, 38,225,168, 16, 28,226, 40,232,196, 83, 7, 13,108, 43, 37,175,242, 66, 14,173,198,
- 69, 75,103, 19,216,103,103, 39, 57, 3, 19,151, 23, 79,133,145,170,201,158,188, 95, 18,251,142, 81,219,185,212,185,138, 52, 68,
- 51,101, 43,227,148,253,168,206, 63, 65,141,119, 32,247, 82, 35, 25,212, 8,194, 60, 29,166,122, 60, 33, 58, 80, 9, 71,126, 75,
-161, 38,141, 54, 6,113,137, 60, 18,201,154, 86,165, 28, 69, 31,205, 96,204, 16, 79,125, 25,106,213, 30,128, 89, 81, 15, 64, 62,
- 33,157, 60, 34, 47, 93,212,191,177,184, 31,148,176,228, 99,138,203, 11,181,196, 59, 69, 83,232,182, 20, 87, 16,212,213, 58,219,
-149, 50, 87,114, 39,220,250,202,116, 95,116,213,205, 58,168,114,186,127,232, 54,211,237,155,253,237,155,149, 31,234,247,239,182,
-239, 7,117,183,223,221, 63, 14,216, 72,247, 99, 56, 77,169,159,163,188,119, 99,228,212,118,110, 18, 93,143, 42, 97,233, 37,154,
-176,133,239,156, 94,139, 6,213, 96,231,218,221, 77,181,221,213,155, 46,189,188, 9,171,237,131,144,143,121, 60, 76, 52,185,206,
-108,182, 80,147,141, 3,213, 68,127, 13,108, 69,191,148, 24,137,178, 9,203, 32,196,112,240,174,120,114,156,204,246, 68,225, 28,
- 77,171, 42,124, 95, 33, 74, 19, 84,121,169,115, 67,197,176, 15,125, 27, 84,172, 13,207,179,164, 94, 68,143,220,135, 6,151,154,
- 54, 23, 52,133,149,131, 8,120,240,138, 46,105,146,214,113, 98,112,153, 35,176,129,200,142, 69, 98, 7,132,192, 68,219, 86, 95,
- 70,143, 52,138,234,153,100,224, 96,229,227,127,117,116,228, 66,228,150,207,200,211,145, 51, 36, 53,164,231, 67,244, 71,228,123,
- 88,196,117,131, 61, 82,166, 13, 3, 14, 86, 24, 69,108, 22, 13,121, 92, 43,162, 30, 50, 76, 81,144,150, 59,189,170, 12,210, 22,
- 60,125,181,222, 94,111,174, 86, 95,125,249,235,217,235, 63,101,189, 47,239,214, 76, 18,102,220, 5, 96,204, 49,233,125,166,119,
-225,219,139,213,215, 31,255,126, 24,254,221, 63, 61,248,193, 83, 59,149,205,207,153, 83, 30,137, 31,148,129, 49, 25, 79,214, 79,
- 53,162, 42,106,111, 30,138,174,253,209, 63,207, 63,125,187,243,243,171,183, 63,252, 86,134,191,127, 25, 80,202,123,115,214,122,
-124,123,126,210,189,245,225, 24,206, 87,181, 25, 53, 79,148,119, 58,180, 58,196,124, 70,243,199, 12, 0,125,182,241, 90,212, 88,
-197, 60,229, 66,165,242,249,245,247,159, 82,179,225,132,200,192, 19, 6, 88,183,108, 42,180,145,194,247,108, 70, 82, 64,169,169,
-219,121, 31,129, 94, 64, 66,220,248, 52,153, 69, 11, 40, 32, 9,167,145, 56,222,161, 37,227, 72, 53,212,117,173,170, 75, 15, 0,
-107,114,161,128, 95, 26,242, 35, 89, 76, 77, 59,242, 44, 16,176, 50,108,108, 55,162,200,174,122, 77, 27,240,232,227,238,243,207,
- 94,222,126,243,143, 29,127, 28,255,122,136,129, 6, 59,146, 50,132, 28, 72,154, 23,128,186,228,239, 22, 1, 49,165,217,221,113,
- 9, 91, 85, 29, 79, 85,182,101, 75, 98,204,135, 51, 32, 84,247,225,101, 89,142,101, 16, 70,170,134, 93,210,113,138, 77,160,105,
-167,188, 32, 35, 49, 39,183,158, 7,245,221,207,255, 93,169,238, 15,119, 54,162, 78, 87,179,181,206, 81, 33, 78, 84,186, 59, 6,
-182,181,101,131, 13,176, 42,117, 56,247,200,214,207,154, 33, 62,137,168,207, 77,168,203, 97,156, 58,151,154,255, 5, 96,233, 90,
-118,227, 54,130,224,188,248,230,114,215, 81, 28, 73,128, 15,202,201,129, 15, 54, 16, 32, 57, 37,191,155, 47,201, 7, 36, 64,144,
-131, 79, 1, 98,192, 48,164,104, 95, 36,135,156,103,170, 40, 95, 4, 65, 43, 44,150, 59, 61,221, 85, 51,221, 85,166,108,123,246,
-151, 96, 63,130,199,156, 16,170,167,221,208,212,255,117, 72, 77, 46, 62, 46,192,112,223, 96,195,239,204,105, 21,107,219,162, 70,
-213,180,185, 59,241,196,169, 81, 52, 48, 85, 85,239, 11,148,160,107,168,234, 48,180,136,165,118,220, 23, 7,148,115,212,142, 3,
-138,250,166, 29, 81,228,198, 22,229, 43, 60,172, 92,233,220, 73,129,221,118,162, 91, 16,225,164,141, 19,109,103,196,190, 97, 94,
-225,201,239, 49, 91, 45,177,102,158,146, 25,185,174,185,163, 56,249, 36,103, 59, 23,248,250,194,180,120, 97,246, 10,184,255,121,
-169,250,107, 4,160,184,128, 64,229,208, 18,138,129,109,233,163, 91, 69, 73, 45,157, 99, 41, 6, 54, 58,130,233,165,224, 76,106,
-232, 60,215, 58,217, 1,135, 33, 76, 22,125, 90, 68,217,227,133,205,149, 39,209, 99,143, 36, 57,209,128, 86, 88,106,241, 20, 60,
-227, 22,150,141,201, 52,176,198, 58,141, 88, 64, 43,170, 5,155, 90,218, 98,179,251,174,120, 73,129,212,184,236,131,193,159, 42,
-159,148, 52,103,122,182,232, 41, 15,145,174,161, 75,220,238, 96,145,153,128,230,118,117,133,218, 86,122, 90,175,172, 57, 0,230,
-139, 56, 55,218,163,180, 83,148, 29, 48,113,246,168, 81, 84,131,193,199, 0, 36, 88,183,211, 98, 67,177, 73, 74,168,211, 72, 83,
-115, 74, 21,160, 61,106, 90, 12, 42,124,235,103,234,175,230, 24,129,253,228,181, 68,122,233,131, 62, 77,246,170, 76,169,123, 63,
- 11,125,244, 62,214,163,231, 60, 0,146, 92,165, 88,189,106, 77,215, 48,246,249, 38,108,159,196, 41,175,172, 93, 41, 22,239, 86,
-239,232,176,149,221,132,221,162, 92,100,186,151,108,170,215,108, 80, 65,194,148, 40,169,250, 21,192,150, 22,244,169,218,134, 61,
-229,166, 6,126, 45, 85,173,217,167,237,119, 42,222,113,148,120, 87,152,225,181,106,106,109,110,196,183,175,155,226, 94,164,239,
-148,173,156, 90, 65, 57,228, 56,173,114,158,116,117,172,219,238,225,135,238, 65,200,175,231, 36,162,216,126,150, 66,220,125, 61,
- 22, 71, 26,163,202, 76,224,129, 54, 15,167, 15,226,197, 13,149,192,251,121,195,222,203,246,255,120,135,115, 0,178,182,125, 82,
-236, 28,231,153, 9, 55,160,167, 35,204,246,230,196,143,153, 22,165,155,183,148,166, 41,236, 54,158, 44, 12,158,166, 23, 91, 7,
-111, 78, 11,117, 52,115, 9,220, 41,184, 62,155,129, 41,104,160,170, 1, 61, 76, 29,147, 21, 17,172, 23,181,179,243,206, 80,195,
- 26, 20, 78, 16,121,243, 42, 41, 37,132, 23,190,168,236, 47,185, 92,196, 42,227,196,107,127, 89, 60,178,111, 66,159, 69,244,202,
-123, 16, 60, 63,131,230,112,148, 60,180, 11, 79,167,195,214, 14, 36, 67, 16, 83, 94, 45,197,103,176,113,241, 73, 52,106, 61, 98,
-124, 17, 10,180,218, 48, 98, 29, 77,178,120, 83, 60,178, 89,189,104,242,139,175,158, 2,105,170,106,147,177,190, 3,241, 94,219,
-161,222,175,101, 87,220,191,187,123,186,253,249,175,254,251,143,151,181, 50, 95, 6,138,104,130, 60,230,169,124,214, 35,146, 70,
- 14, 83,119,200, 55, 15, 55,255,174,242,143,233, 40,243, 24,228,113,196,194,206,168,115,187,181,125, 90, 18, 40,188, 7,114, 9,
-113, 6,133,199,175, 84,217, 1,202, 64,173,209,182, 89,100, 74, 79,127,254,242,102,127, 93,223,254,246,233,111, 29,206,200,192,
-197,218, 38,118,127, 9, 61,184, 18,107,224,118,126,179,219, 44, 47,193, 52, 0, 25, 8, 1, 48, 34,206, 53,135,144,173, 11,243,
- 94,230,133,106,193, 93, 37,126,124,255, 70,136, 47,145, 87,189, 84,198,167, 96,242,156,115, 52,154,118, 93,190,142,108, 31,167,
- 36, 86,164, 33,175,176,225,197,184, 28,169, 53,207, 52,252,162, 37, 30, 34,186, 8, 14,143,214,176, 53, 75, 34,124, 67, 50, 51,
- 13, 67,196,160,159,207,253, 61,170,124, 51, 57,169, 42, 87, 23,217,140,201,218,149, 15, 50, 91,215,250,219,159,126,189,253,240,
-246, 81, 93, 63,206,159, 93,184, 52,216,185,238,146,157,228,196,130,119, 52, 2,104,182,249, 1, 94,210, 32,138,102,212,114,205,
- 70,208,134, 8,160, 8, 84,164,160,205, 50, 7, 65, 17, 90, 85,172,123,228,113,189, 13, 15, 10, 49,114, 8,162, 66,114,223, 99,
-167, 7,245,212, 15,186,200,239,127,255,244,225,159,243,231,174,177,200,120,105, 0,111, 54, 21,210, 0,168, 93, 79,173,251, 29,
- 34, 43,236,198, 3,200, 15,248,181,213, 37, 34,153,150, 35, 96,239, 6, 53,195,139,107, 17, 64,219,254, 23,128,165,171,233,141,
-219,134,130,252, 18, 69, 74,222, 93,103,107, 59,253, 10,144,158,138,164, 8,122,234,181,183,254,242,246,212,131, 17,228, 7, 20,
- 45, 96,164,104,227,120,237,221,149, 40, 74,252,232,140,220,187, 37,120, 73,241,189,153,199,247,102, 12, 91, 41, 56,129, 3,200,
- 90,128,182, 54,105, 63,181,113,222,204, 15,203, 84, 74,186, 8, 93, 61,179,103, 31, 95,244, 69,183,208,219,111,137, 72,118,174,
-239, 75, 9,148, 75, 17,214, 76,136, 7,178,185,190, 36, 33, 68, 58, 68,124,189,143, 29,168, 42, 64, 57,162,234,139,194,227,201,
-227, 96,119, 62,206, 20, 88,114, 91,176,154,179,161, 67,163,143, 13, 64,183,175,187, 27, 63,157,105,109, 32,242,128,197,101,229,
-153, 74, 98,172, 85,235, 37,207, 3, 34,183,246,139,200,219,165, 2,208,176, 35, 82,215, 33, 31,173,178,160,232,145, 32, 70,119,
-179,104,231, 25,231,220, 25, 75,119,203, 76,167, 68, 11,146,204,169,107,100, 74, 77, 27, 37, 60,215, 37, 44, 2,135,184, 37,237,
-120, 50,210,143,165, 57, 38,254, 22,228, 68,111, 12, 75, 23, 22, 4, 49,150,208,101,206, 25, 70, 18,170,220,209,112, 30,223,194,
-128,127,171,198, 58, 27,240,138,193,253,175, 67, 76,255, 63,224, 52, 54,184,177,182, 77, 37,234, 12, 88,184,234,156,233,116,190,
-108, 60, 34,139, 43,249,209, 2,231,226,220,226, 60, 26, 75, 21,217,180,161, 42,111,245,178, 54,124,237,194, 19,137, 23,100,208,
- 11, 59, 40,105, 61, 34, 60,242, 1,125, 43,188,163,133, 44,150, 40, 55, 88,103,124,230,170, 90, 73, 5, 61,138, 94, 37, 39, 31,
-106,251, 4, 62, 3, 44, 79, 99, 32, 44,127, 29,214,174, 36,159,243, 89, 70,189,140,192, 33,180, 81, 86, 27, 71,220,203,107, 80,
-150, 30, 87,245, 0, 65, 5, 91,100,147,146, 53, 77,228,240, 25, 82, 36,122,110, 38,142,213,141,115, 24, 57,182,147,176,247, 28,
- 61,148,188,106,166, 93,116, 30,168,120, 71,255,208,153, 66,170,171,194,123,107, 56,161, 34,179,220, 9,181, 3,186, 87,242,202,
-182,123,209,121,211,246,202,189, 84,219,125,221, 58,107, 95, 40,115,101,210,158, 10,206, 58,146, 33,153,174,231,205, 25,114, 76,
- 50,249, 1, 12,251, 64, 11, 16, 48,121,141,148,214, 1, 15, 40,181,242,225,118,162,213,189, 60,137,188, 91, 33, 52,249,146,168,
-119,171, 80,204,137, 30,148, 2,219, 85,232,131, 33,186,133, 90,205,145, 51,110, 32,236,134, 86, 46, 56, 30, 28, 35, 18,207, 86,
-210,207, 98,238, 11,239,221,229,250, 30, 35,115,226, 13, 4,187, 30,159,231,155,212, 68, 75, 61,169, 40, 84, 81,151, 85, 93, 33,
-137,100, 41, 29, 82,120, 89, 42,194,152, 11,226, 59,208,187, 67,160, 81,113,209,216, 17,159, 87, 93, 55,160, 50, 33,129, 64, 56,
-135, 68,135,249, 72,111,242, 85, 83,242, 84,176, 3, 35,210, 74,207,122, 62,125,224, 18,191,240, 10,112, 47,147,107,197,233,200,
- 85,197, 35, 83, 6, 81,161,223,223,229, 42,105, 80, 79, 50, 72,103,240,249, 29, 3, 59, 54, 37, 65, 33, 2, 23,120,180,230, 90,
- 10, 78,126,246, 42,247,178,105,144, 84, 92,227,217, 91, 86,110,172,151, 11,226,124,254, 66,237, 47,191,190,120,245,234,238,203,
- 95,254,202,215,255,142,247, 62, 15, 54, 54, 83,187,168, 18, 74,238,105,161,170,158, 76,148, 33, 92,253,252, 58,244,221,237,225,
-120, 8,143, 77, 57,142,248,229,172, 31,254, 61, 97,123, 57,159, 44,130, 57, 97,103,210, 50,202,146,232,231, 83,121,233, 15,204,
- 12, 30,217, 87,177, 27, 15,209,213,223,126,188, 22,191,190,125,247,199,237,239,125,125,172, 91,187,156, 69,246, 53, 4,213, 33,
- 81,184,131,111,244,228,243,116,204,237, 83,246,170,167, 63, 11,171,197,139, 88, 59, 76,245, 73,181, 38,127,190,171, 95,249,155,
- 55,223,239, 69,253, 0,126,165,207, 89,204,100, 43, 96, 39,172,234, 80, 23, 66,211,155,171,193,206, 79, 20, 72, 69,206, 77,146,
-228,142,152, 0,132,163,165,192,152, 98, 23, 42,235,160, 7,150,189, 16, 34,179,254,244,237,171,235, 63,223,155,249,169,148, 22,
-129, 61, 8,237, 71,139, 37, 5, 18,138, 33,219,168,163, 5,179, 26,202,203,230,155,183,111, 94,191,251,225,163,250,248, 33,220,
-255,147,230, 62,128, 26, 35, 36, 57,202,249,114,192, 2, 20, 61,231,192, 59,238, 42,172,173,103, 21,198, 41,181,194,117,173,178,
-136,195,216,127,145,118,189, 5, 6, 43, 93, 18,165,137,149,148,115,245, 13, 97, 87, 4, 32,149,237, 11, 69,110,144,187,195, 70,
- 3,135,126,247,254,248,211,109,254,220, 93,124,218, 74,181,145,172,184,142,248, 21,201,180,141,182,210,129, 47,206, 56,168, 58,
-182, 64, 8,120,254,114,212, 75, 83,152,207,156,166, 27,149, 75,113,216, 54,182,109,186,255, 4, 32,233, 90,118, 36, 39,130, 96,
- 85,185, 30,118,181, 61,175,101, 37,102,197, 30,128, 3,172,184,128,180,203,141, 19,154,207,224, 95,248, 62, 56, 51,210, 46,226,
-128, 52,160,101,152,221,153,110,183,237,118, 61,137, 48,199,150, 90,221,150, 93,153, 25,145,206,140,208,224, 18,200, 71, 14,249,
- 62,118, 30,132, 99, 57,229,210,156, 89, 60,161,176,119, 22,148,166, 31, 70, 51,186, 28,138, 60, 63,222, 27,110,179,119,237, 97,
-139, 45, 23,128, 16,122, 80,196, 52,201,246,162,167,212, 20,152,121, 53, 22,213,104,185,192, 89,222, 38, 37,154,166, 85,160,207,
-214, 43, 46, 14,228,226,179,151, 19,245, 56, 70,100,219,246,233, 2,149, 7,255, 21, 15,225,195,195,220,123,240,237, 68,196,164,
- 21, 10,223,244, 24, 54,193, 23,142,115,138,118,161,249,215,147,141, 50,162, 76,176,185, 16,244,161, 41, 59,112, 97, 95,123,156,
-237,180,198, 82,193, 92, 29, 48,186,154,130,240,141,225,118,109,155,174,148, 1,211, 85,173,213,145,162, 54, 96,191,117, 81,187,
- 46,162, 82,121,100,122,164,232, 46, 94, 46,136, 97,203,206,113,226, 46, 56,127,109,143,186, 65, 12,136,167,179,215,101,112,164,
-125,153,235, 59,106, 37, 33,174,146, 62,161,120, 34,169,165,143,131, 9,113,183, 74,182, 94,193,174,242, 10,204, 37,250,181, 17,
-157, 94,136,127, 17,167, 45, 8, 16,146,142,244,170,106, 99, 87, 77, 41,172,255,181, 47,139,222,225, 22, 46,106, 65,238, 80, 92,
-125, 2, 44,167,165, 90,148,163, 4, 25, 62, 1,198,208, 38,161, 0,184,168,200, 87,129, 28,167,225,222, 12,206,181, 66, 62,159,
- 66,173, 17,151, 84, 86,124,125, 49,213,114,146,117,169,237,149,158,167,152,143,149,234, 8, 6,191, 35,179,250,107,253,251,159,
-234,116, 4, 97,236, 26,131, 82,220,138,124,224,142,206,122, 89,155, 99,173, 29,117, 88,213,137,251, 88, 37,176,184,166, 17, 37,
- 59, 30,116, 30,142,228,175,184, 41,121, 18,125, 95,103,199,181, 73,206, 10, 1,210,171,140,171, 5, 69,159,105,198, 39,188,139,
- 11, 71,211,117,215, 73, 61,112,223,174,251, 76,244,214, 1,116,248, 43,119,249, 76,202, 79,116, 24, 42, 57,202,208,162,164, 2,
-224, 74,106, 77, 6,132, 74,131,170, 75,165,117, 65,121, 86,201,253, 63,197, 87, 23,123,154, 89, 3,196,130, 19,210, 13,226, 9,
-144, 71,208,128, 71,167,178,108,106,160,205,166,194,119,226,102, 26,229,151, 55,189, 73, 17,185,162, 36,206, 16, 26, 85, 30, 36,
- 21,112,182,249, 24,165,117,102,252, 23, 49,211,203, 90,166,109,124, 22, 17,183, 19,106,101,251,133, 91, 20, 52, 3,218, 76, 5,
- 43,213, 8, 56, 72,179,101,140,178, 9,126,214,196,183,250, 92, 89,151,148, 39,223, 88,132, 92,241, 97,226,212,223, 12,102, 94,
-193,132, 36, 51,143,137, 72,150, 8, 17,230,120,224,244,109,206,198,160,234,178, 27, 20, 29,112, 37,135, 12,145, 49,247,224,154,
-137, 90,186,229,223, 77,100,128, 38,194, 72,232,244,138, 71,233, 72, 2,135, 67, 31,143,162,119,128,158, 39,106,116, 7,212, 49,
- 1, 14,182, 22,182,209, 44, 43,127,179,120,170,185, 92,244,218, 94,136, 83,161, 18, 55, 69,237,145,238,187,180, 18,106,149,171,
-103,157,254,226,230,221,243,175,127, 75,198,231, 59,238, 98,116, 8,227,148,183, 58, 79,131, 36,170, 48,229,189,136, 95, 14,231,
-215,215,119,227, 50,141,163, 1,130, 85, 56, 7,107,157, 11, 27, 85,212,169, 78, 11, 69,249,150,134,195,115, 93, 50,132, 14, 85,
- 33, 77, 94,121, 65, 59,128, 71, 68,189, 72,103, 31,238,119, 47,253,237, 79,223,223,252,252,238,229,253,251, 95,135,110,208,122,
- 33, 50, 1,183,243,168,103, 93,255, 72, 13,252, 48, 0, 44,199, 33, 81, 76, 13,135, 27,113, 14,246,233, 40, 67,185, 56, 35, 30,
-155,143,223,189,121,197,174,227, 50,210,109, 79, 34,218, 54,139, 59, 54,187, 11,169, 28,119, 97,136, 12,114,176, 60, 60,235,156,
-193, 91, 17,228,129, 83,205, 96, 69, 70,110,253,110,122, 58,149,176,195,163, 87, 21,241, 25,238, 95,124,245,250,207,183,223,204,
-211,173,102,249,182,179,205, 54, 36,117,108, 63,198, 99,195,149,225,152,214,203,235, 87,159,255,112,243,233,139,243, 91,113,247,
-199,233,253, 24, 98, 71,216,158,214, 52,175,236,190, 53,182,156, 2, 85,122,233, 74,118,153,205, 82,165,201,231,217,182, 45,184,
- 65, 41,180,239, 27, 6,147,102,186, 27,129, 30,101,142,116, 6,246, 93,101,146,198,137, 21,245, 4, 97,128,218,211, 84,123,116,
-118,114,242,108,104,191,125, 59,254,248,203,131,116,226,119,239,192, 36, 26, 84, 50,190, 41,146,213, 3,249, 25,225, 11, 78, 87,
-107, 99,121, 46, 78, 15,219,108,111,202,131,111,212,226, 75,137,225, 72, 91,168,213,117,182, 51, 19,192,216,127, 2,112,116,118,
-171,146, 19, 81, 20,174, 74,165, 42,157,206,233,238,115,230, 28, 70, 17, 84, 16, 69, 65, 80, 16, 28, 16,230, 66,241,214, 7, 80,
- 95,192, 11,223,209, 39, 80,188, 19,230, 70,116, 96, 64,240,252, 72,119,167,147,170, 84, 82,174, 47,208,244, 85, 55, 36, 84,237,
- 93,107,237,218,123, 45,247,243, 79,223, 23,227,129,208,244, 75,247, 0, 28, 83,143,136,150, 36, 55, 9,195,183,231,212, 44, 73,
- 32,119,234,183, 33,220, 91,241,160,188,217, 14, 92, 22,152,164,127, 13,147, 88,120, 8,173, 18,159, 32, 68, 9,117,232,230,197,
-183,183,235,224,162,105, 20,224,190,107,219,210,184, 6,199,226,141, 86,225,138,254,213, 88,215,141, 11,136,231, 43,106, 70, 69,
-233, 92,185,102,110, 49,114, 45,135, 94,244, 7,253,201,168, 4,230,185,111, 17, 7, 31, 70,119, 78, 4,242,228, 76, 18, 76, 31,
- 3, 34, 64,142,242, 43,214, 20, 20,249,133, 72,115,112,155,201, 15,130,236,151, 76,237, 37, 42,216, 3,174, 8,200, 2,213, 97,
-106, 82, 67, 92,120, 91,119,202,164, 38, 71,186,155,107,250, 30, 86, 85,223,224,113, 49, 93,144,216, 39,245, 57,144, 30,147,212,
- 90,143,181, 10,109, 49,146, 92,232,196,247,107,109, 26,181, 37,139,148,230, 80,139, 90,196,171,115,162, 11, 84,105, 42,135,122,
-167, 12, 9, 65,212, 47,240,156,194, 97, 3, 72, 88, 97,197,132,142,148, 19,223,106,156,162, 26,250,228, 4, 96, 17,149,195, 72,
- 68, 57, 69, 27,144, 41, 26, 75, 31, 15, 38, 58,202,251,136, 32, 40, 63,172, 98, 48,136, 16, 41,217,142, 12,201,164,161, 18, 79,
- 49, 46,139,109,142, 21,226, 32,193,196,234, 84, 48, 50,205, 54,197, 65,235,228,211, 92, 82,153,155,119, 9,131, 95,205,178, 5,
-180, 83,146,211,233, 71,127,133, 13,112,227, 5, 59, 8,229, 70,133, 48,157, 49, 98,200,243,153,254,194,252,152, 21, 82, 39, 68,
- 34,230, 26, 71, 8, 83, 30, 13,179,241,131, 29, 42, 12,152,180,255,240,219,177,165,222, 25,120,210,198,111,182, 97,179,183,203,
- 45,250,179,135,107,119,253, 78,181,223,215, 55,207,237,213,123, 27,119, 88,184,163,216,214,165,117, 84, 20,180,184, 84,186,237,
- 66, 83,218, 30,165,207, 41, 97,158,142, 59,227,110, 45,143,156, 13, 99, 11,122, 42,116, 72,152, 1, 7, 69,111, 86,174, 68, 82,
-103, 53, 23,220, 84,214,154,191,144,219,140, 78, 17,163, 6,226, 63, 88,206,173,104, 19, 13, 6,108, 48,249,140,171,240, 40,175,
- 77,177, 29,243, 12,189,109,191,142,193,103,230,227,168,207,156,192,245, 72,175,174,237, 47,122,164, 5,145, 24, 42, 90, 19,146,
-222, 40,183, 38,186,254,233,125, 73, 8, 71, 48,104, 54, 42, 1,122,164,224, 45,194, 29, 41,105, 69,196,170, 75, 21,107, 17, 67,
- 29, 95,220,227, 14, 34, 87,115,140,218, 97,198, 81,213,193,223, 28,251,162, 85,193, 68,187,160, 89,176, 18,182, 8,198,205,125,
- 20, 94,241,199,232, 21,208,226, 34,250, 66, 81, 48, 22,152, 12,179,161,188, 40,197,159, 98,142,243,220,101,223, 56,209, 63, 87,
-109,173,221, 98,105,184,209,193,222,185, 25, 13,246,180, 15,243,221,199,239,219,207,190,123,117,243,226,205,216,187,248, 48, 86,
-125, 85,225, 70, 51, 79, 33, 86,194, 19,151,226, 16,240, 75,249, 36, 34,252,226,230,173,103,207,126,239,159,222,140,143, 24, 1,
-150, 33, 10,246,136, 57,187, 56,184, 62,214, 12, 33,181, 92, 51, 11, 27, 79,212, 20,180, 7, 39,166,147, 46, 43,155,199,185, 72,
- 60, 27,211, 63,115,254,224,237,235,135,225,211,223,254,122,117, 37, 52,112,169, 39, 65, 43, 46, 56,235,176, 73,126, 73, 32,132,
-117, 66, 16,242,207,208, 58, 45, 36,173,157,195, 93,214,222, 20,144, 59,253,187,252,240,227,151,183,183,247,105,122, 16,178, 50,
- 99, 94, 3,189,112, 84,206,193,114,232,162,224, 65,215, 19,138, 63, 43, 37, 67,210,149,156,107, 46,206,250,132,104,153,173, 71,
-184,175,199,178,107,202,229,104,243, 88, 62,252,162,185,251,228,249,253, 63, 33,222, 63,185, 56,159,226,252,120,124, 74,121,232,
-171,209,135,253,225,238,163,175,191,249,252,171,151,211,141,249,115,250,251,143,203,113,154, 78, 78,232,183,231, 30, 39, 79,125,
- 85,254,107, 5,172,120,199,174, 34,245, 30,118,136,207,116, 10, 44,167,205,205,116,138, 16,152,158, 77, 48,164,227,118,219,163,
-248,217,136,178, 89,158,103, 17,254, 81,180, 9,182, 50, 46, 42, 36, 82,119,135,238, 16,174,191,125,157, 95,254,242,116,154,202,
-235, 93,195, 56,165,232,132, 96,164,128,133,215,127,171, 78,185, 79, 40,214,215,217, 40, 52, 15,230,178,221, 5,159, 92, 16, 1,
-215,214, 93, 58,127,244,182,180,231, 86, 25,184, 75,118,155,226,255, 2,144,116, 45, 59,114, 20, 65,176,222,213,143,121,236,174,
-133,141,199, 90,224, 98,139, 3, 66,248, 55,184,112,229,194,103,114,228,192,141, 51, 23, 16, 8, 25, 36,144,151,149, 89,239, 76,
- 79,215,116,189,186,137,104,159,119,118,186,167,171, 51, 35,162, 42, 51,210,208,134,138, 13,156,130, 51, 63, 90,207,193,111,114,
-186,148, 25,164,208,196, 27,223,158,182, 89,159,119, 42,166, 22, 55,165,110, 6, 16, 6, 8, 3,219,180,250, 17,193, 28, 64,241,
- 84, 65,194,167,161,156,111, 88,148,182, 29,244,120,235, 26, 13,157,169,244, 86, 65, 25, 85,186, 56,119,174,199, 61, 1,225,170,
- 85, 44,210,141, 64,166,105,191,128, 26, 39, 8, 12,215,187,121, 25,200, 96, 93, 63, 61, 84,159, 73, 16, 20,160, 67, 46, 62,136,
-212,211, 10,121, 65,110,119, 49, 14, 35, 27, 82, 52, 36,138,203,238,132,151,180, 6,117, 86, 55, 32,199, 91,118, 17,245,231,121,
-212,125, 59, 55, 46, 64, 96,217,246,106, 25,135,153,246,242, 27,145, 71, 13,100,215, 94, 25,173, 18, 40,110, 39,253, 14,249, 26,
-210,102, 97, 14,206,141, 74,185,180,142,227,157, 32,133,247,116, 49,160, 13, 98,102, 93,184,236,245, 2,249,103,103,230,194, 11,
-231,247, 84, 90,179,104,206,175,115, 98, 25,216,195,212,209, 25,133,133,189, 51,159, 63,162, 1,172, 8,106,169, 3,245,176,244,
- 23, 13, 90, 92, 23,207,126,102,197,126,176,190, 70, 90, 29,224,177,178,110,135,155, 69, 8,196, 80, 30, 33,172, 13,231,166, 33,
-199, 3,254,158,182,250, 33,201, 73,211,208,210, 44,171,207,149,152, 88,163, 36, 72,242,202,158,172, 53, 64,195,113,184, 17, 27,
- 72,147,157, 76,147,245,169,230,225, 52,118,170,180, 34, 2,200,255, 83,229,193,142, 0, 82, 80,129,106,145,236,216, 24,234, 23,
- 44, 14,253,242,196, 20,105,154,218, 84, 13, 46,194,253, 95,252,130,100,135,149,250, 64,110,211,201,194, 29,223,179, 5,164,156,
-132, 15,218,207, 37, 32, 7, 64,137,209,162, 83, 75,112,110, 60, 75,173,119, 74, 94,122, 57, 54,114,163, 69,191,149,110,103,154,
- 94,239, 15,234,234, 74, 55,128,110, 3, 85,226,230,173,164,201,114, 99, 89, 80, 14, 18,196,237, 65, 54, 96,176,183, 15, 2, 12,
- 32,198,153,186,129, 45, 78,116,149,160, 39,199,106,107, 96,106,221,175, 59, 39, 31, 74, 91, 72,168, 89,242,198,227,205, 73,177,
- 16, 63, 84,209,211,102,217, 71, 62, 76,158,165,108,215,122,246,160, 21,205,112,215, 49, 44,121,221,199,215,107,193, 35, 13, 32,
- 74, 33, 82, 10,223,242, 59, 63,212, 35,229,200,210,125,208, 36,150,211, 10,202,111,220,134,162,141,116, 13, 81,175, 23, 64,184,
- 0,123, 75, 12, 17,242,156,202, 26,127, 79, 42, 31,133,103,177, 2, 82,118, 2,111,161, 64,144,179,207, 60,126,159, 22, 31,243,
-114, 41,208,210, 39, 44,227, 59,186,147, 78, 81, 52, 72, 25,116,147, 1, 16, 45, 27,161,166, 32, 78, 35,251,200, 51,253,124, 10,
-101,224,162, 31,161,240,230,243,178, 14, 60,183,129,176,143,203,141,149,231, 28, 72, 14, 3,128,110,230, 24,112,142,199,234,160,
-225,140, 1,161, 97,163, 58,125, 54,124,191,216, 39,224, 1,178,235,205,179, 79,158, 60,124,245,205,239,254,197,253,187,127,180,
- 25, 54,116,117, 35,243,133,176, 75,134,246, 64, 44,206,196, 69,172, 29,101,109,234, 71,135,235,187,148,126, 59,221,141,117, 90,
-234, 16, 32, 11,156, 29,145, 94,105,120,127,210,186,223, 50,127, 26,118,216,203,176, 30, 87,131,221, 41, 30, 87, 95,250,212, 0,
-220,178, 82,155, 22, 42, 35,134,115, 62,254,244,245,235, 47,190,255,241, 69, 14,111,228,181,157, 85, 46, 30, 28, 44,167,136,247,
- 8,228,180,248, 51,189,116, 69,139,255,106,221,118,153,218,139, 57, 74,249, 86, 15,200, 77,225,242,249,167,175, 94,190,186, 18,
-245, 87,153,192,244,102,197,193, 66,146,238,144, 45,150, 11, 84,181,172,187,224, 88,105,207,247, 2, 16, 15,196,187,112,150, 36,
- 62,160, 56,170,199, 35,254,102,109,109, 0,117,172, 54, 42,235, 55,254, 48,205,162,164,187, 63,111, 95,234,111,191,251,242,120,
-121,125,255,230,252,254,145,245,215,125,231,158, 29,250,231, 7,173,196, 73,136,159,197, 95,191,228,123,196, 0, 2, 83,147,181,
- 15, 41, 65, 61,118,109,134, 10, 48,136, 84,233, 27, 69,154, 50, 27,221, 8,118,105, 3,181,173,167,255,160,140, 50,117,220, 55,
-107,111,184,222, 93,203, 38,206, 18, 40, 88,216,158, 95,171,233,178,218, 53,211,104,194, 34,174,221,238,234,144,235,237, 15,127,
-127,252,199,241,237,212,252,251, 84, 15,102,254,140,219,117,134, 39,129, 52, 99, 50,114,116,247, 8,220,102,222, 59, 30, 58, 45,
-115,244,207,249,213, 27,128, 93, 50, 35,231,175, 10, 78,202, 16,109,140,221, 89, 70, 32,136,251, 95, 0,146,174,108, 71,146, 26,
- 8, 86,249, 40,187,142,174,158,222, 89,113,136,167, 69, 2, 86, 72,124, 1, 63,192, 27,127, 15, 72, 72,104,197, 50,128,208, 72,
-211, 83,151, 93,229,139,136,218,199, 86,119,171,213,101, 59, 51,194, 25, 25,137,228,128,189,146,192,248,119, 29,205, 12,208,160,
-149,246,125, 26, 86,128,216,171,210,229, 5,201,244,112, 89,141,226,228,166, 84, 32,188, 73, 1,216,124,190, 40, 96,153,116, 25,
-125, 18,173,112,220, 89, 73,183, 99,110, 43,163, 3,158, 99, 12,114, 52, 1,156,238,205,174, 82,175,143, 65,118,142,213, 7,144,
- 47, 70, 58,179, 6,182,243,225, 0, 0, 99,231,214,165, 89,132, 37, 25,160,187,178,118, 78, 63,139,210,136,152,220,177, 1, 10,
-121, 35,169, 97,186,219, 54, 20,195,130,164,226,120, 70,192,227,213, 52,216,114, 34, 32, 30,166,141, 86, 93,162, 7,195, 74, 6,
-132, 92,177,229,209,141,199, 20,248,140, 46,141,104,194,209,117,182, 45,196,218, 75,210,150,115, 4,106,222,128,151,202, 70,197,
-149,200, 2, 48,235, 12,245, 14,207,203, 55, 32,198, 44,177,177,217,231,149, 28,130,230, 90, 93,166, 32,228,142, 24,127, 32,156,
- 12,117,116, 56,219,188, 55, 3,240, 5,227, 73,231,216,164, 6,176, 79,241, 30,143, 18,128,178,211, 12,250,232,229, 3, 85, 37,
-200, 57,156, 77,125,113,194,115, 54,135, 40,137, 14,106, 28,175, 73, 40,137,124, 31, 60,176,106,174,101, 35,176, 97, 38, 91,238,
- 30,127,143,179, 37,176,164, 17, 75,113,108, 86,201,187,194,234,128,110,150,125,226,244,249, 98,197,124,202, 25,214, 82,166, 24,
-134, 76,199, 19, 16,156,141,101,175,102,150, 72, 12, 91,162, 54, 9,251, 14,152, 65, 87,187, 60,173, 29, 56,185, 26,168, 44,209,
-172, 30, 48,119,162,117, 53,208, 95,120, 13,236,247,212,205,194,126, 88, 33, 56,244,135,205,206,134,227, 73,171,208,177,209, 51,
- 78,108,249,225,235, 75, 93,245,185,222,217, 99,192, 46,157,177, 26,129,218, 31,196,240, 57, 54, 82, 61,220, 84,247, 64,141, 64,
-238,101,176,165,110, 3, 73,138, 37, 22, 38, 76, 38,216,103,198, 57,235,162,192,122,155,250, 20,124,155, 83,139, 72, 25, 68, 98,
-252,229, 26,237,231,157,121, 60,105,225,105, 87,198, 82, 13, 77,216,233,228, 66,223,172,150,108,188, 62,187, 80, 41, 88,228, 61,
- 19, 47,158, 78,191,121, 89, 22, 54,138,126,170,214, 82, 98, 4,202,148,104,236,136,216,141, 95,161, 13, 55,160,108,226, 88, 66,
-201, 27, 48, 50, 4,233, 79,255,153,138, 65, 63,178,236, 10, 92, 86, 5, 74, 71,217,200,108, 10,175, 8, 74, 95,249, 82, 57,183,
- 3,201,243, 25, 13,156,217,132,197,119, 18,191, 79, 65,122,235,121,161,132,184,108, 98,186, 74,247, 18,234, 93, 88,143,109, 81,
-246,117, 95, 76,217,183,170, 9, 5,100,240,240, 28,238,196, 97,162, 8,124,133,141,241, 13,240, 56, 72,222,182, 39, 98, 7,202,
- 50,237,153,239,128,154, 71,234, 13,137, 89, 53, 19, 31,101, 64,192, 24,248,156,229,187,192,240,137, 94, 60, 61, 62, 11,104,114,
- 12, 95, 93, 46,239,126,248,243,237,143,127,228,239,214,244,143,237,112, 28, 70,187,223,107, 58, 12,182, 21,133, 96,171, 13, 20,
- 87, 34,130, 92,164, 11,254,175,161,249,214,118,243,226,166,196, 26, 92,100,222,197, 62,151, 56, 29,134,189,152, 57,167,121,137,
-253,236, 23,122,242, 91, 67, 81,241,182,182,205, 98, 88, 67,167, 11, 66,202, 57,115,242, 27,152, 78,173,158,255,219,190,124,255,
-251,237,139,219,211,175,191, 61,150,146,215, 40, 31,155,149,210, 46,106, 43,105, 67,180,196,114, 83,108,163, 5, 21,247,133,181,
- 75, 41,205, 85,200,105,241, 49,254,252,211,215, 85,181,132, 57,158, 94,151,115,181,209, 99,147,245,110, 16, 11, 79,168, 70, 32,
-207,190, 5,197,198,245, 61,178,125, 18,219,195, 99,149, 79, 43, 46,146, 46,122, 62,114, 16,171,228, 68, 50,206,246, 0,195,104,
-107,241, 50,237, 79, 31,170,199,233,106,222, 94,191, 71,142,111, 79,117, 44, 88,213,135,234,254,241,248,251,200,139,207,133,210,
-150, 93,203,112,207,199,186, 51, 91, 3, 35,121,164,245, 2,146,132,127,219,183, 55,219,181,157, 1,108,105, 65,209, 68,234,240,
-125,125, 60, 31, 11, 32,175, 95, 23,132, 57, 17,128,110,196,181,110, 20, 78, 92, 86, 59,229,108,199,168,156, 80, 15, 69,235,182,
- 69,206, 51,223,252, 59,191,251,101,105,158,252,199,139,117, 93,249,236,202, 81, 28,145, 3,128,232, 78,155, 7, 4,184,202,247,
- 8,211, 25,187, 86,243,185, 3,126, 35,242,170, 87,143, 99, 36, 15,192, 4, 61,108,121, 65, 78, 43,186, 41,143,136, 26,198,233,
- 80,255, 47, 0, 73, 87,174,228, 72, 17, 5,187,206,190, 37,205, 73, 16, 16,107, 97, 96,173, 5, 46, 63,128,189, 95,180,255,135,
- 65, 4, 6, 56, 28,193, 26,236,174, 70, 26,245, 89, 87, 23,153,189,222, 68, 40,164,145,170,235,189,151,249,174, 4,162,214, 17,
- 52, 51,180,189,172,198,114,225,244, 11,222,209, 45,199,170,184,112,142,246, 41, 78,215,182, 2,142, 24, 91, 41, 6, 93,155, 82,
-111,171, 95,131, 0, 63, 45, 78,194, 92, 98, 95,145,214,182,134,173, 70, 65, 13,115,105,112,107, 14, 93, 3,126,120, 56, 58,132,
-251,227,201,194, 65,154,153,122,231, 1,244,197, 50,179,217,173,237, 10, 34,231,138, 87,234, 75,178,128, 12,224,182, 5, 55,201,
-210,172,240,180,217, 3,158,106,149, 98,233,156,247,118, 99,115, 6, 32, 16, 14,164, 10,227,106, 65, 72,239,179,180, 54, 53,109,
-177,204,114,120, 41,186,211,216, 95,213,120,135,176,227, 79,147,112,217, 89, 54, 93,105,218, 2, 2, 88, 53, 57,186,143,131,146,
-117,176,137,211, 82,190, 7, 39, 86, 53,101, 47,217,227,179,177,159, 23,252,205, 1,135, 72, 68, 54,166,113, 22,174,181,247,187,
-103,113, 37,254,134, 37, 91,195, 66, 61, 59,208, 76, 22,175, 23, 93,117, 32, 4, 41,213, 66, 1,195, 3, 44, 21,172, 48,179,186,
-234, 44,219,197, 60,229, 92, 15,166,144, 33,249, 62, 38, 7,243, 72,165, 69,140, 33,177,244, 76,140, 81,178, 37,112, 63, 64, 29,
-166, 85,119, 8, 28,212,233,202,102,204,193, 28,231,160, 84, 53,113, 48, 46, 84,251, 24,230,200,124, 39,136, 94, 26, 86, 60,128,
-100,235,146,210,207,107,186, 20,246, 17,255,171, 12,125, 18,212,230,233,182,226,146, 74,106,204,133, 99, 94, 6, 33,199,178,209,
- 77,182,211,153,186, 56, 27, 85,165, 96,122, 66,223, 36,155, 42,185, 8,129,219, 64,120, 84,147,130, 61,115,153,161,150,219,203,
- 86,188,194, 32, 3, 55,253,116,226,118,230, 42,126,209, 20,249,172,234,227, 62,106, 10,242,226, 13, 39, 19, 31, 41, 26,220, 86,
- 86,119,169,121,192, 35, 86,245, 41, 29,224,220,241, 61,172,137,192,119,189,202,173,219,123,145,120, 76,108, 80,130,155, 16, 53,
-115,166,233,138,151, 89, 52,165, 56,125,189,109,156,123, 37, 66,103, 29,196,239,112, 27,238, 85,239,254, 26,190,176, 18,136,152,
-121,225, 46, 62,238, 40,224, 24,212, 78,207,217,241, 45,246,185, 83,120,220,189,238, 58,211, 71, 51,155,157,190,144,246, 93, 93,
-207,236,123, 44,185,141,128,208,127, 23,223,219,223,181,114,184,137,168,168,102, 69, 4,145,131, 74, 13, 21, 91, 33,225,120, 60,
- 75, 29, 0,147, 97, 23,124, 7,239,202, 48,168,162, 68,200,245,179,199,235, 50,178, 75,143,205,238, 75,230, 44,115,250,178,199,
-187,136,147,152, 35, 59,105,156,203,114, 13, 96, 63,240, 75,190, 1, 38,230, 5, 74, 55, 86, 70,169,186,237,115,128,179,163,238,
- 48,144, 93,176, 96,224,193, 12,201,202,109,228,215, 12, 5,119,152,238,177,102,222,117,164, 84,102, 3, 17,108, 2, 63, 29,254,
-106, 18,236, 2, 16,204,238,104,166,127, 31, 77,108,242,214,249,218,164,246,171,186,121,122,251,233,187,159,255, 18,207,226,252,
-103, 5, 50,199,123,109, 62,227,177,168,229,117,115,167, 8, 55,127, 6, 20,189,224,231, 92,214,193,156, 70,255,240,166, 86,149,
- 90,174, 31,124,166,176,210,204,237,104,179,137, 83, 31, 87, 95, 3, 5, 0,230, 74, 85, 46,149, 14,136,102, 5, 15, 10, 14, 68,
- 44, 44, 24,186,150,223,174,206,204, 58, 1,154,129, 65, 72,152,231,100,166, 63,222,253,248,211,251,223,126,125, 19, 41,157, 25,
-207, 60,135,138,203,213,165,214, 46, 51, 53,163,213,234,243, 29, 80, 15,149, 57,197,156,183,228,194,236,202,167,227,219, 31,158,
-139,226,247, 36,110, 64,228,128, 17,187,150,233,170, 16, 65, 96, 65,220,182, 67,189, 48,242,106,166,107,152,168,148,123,105,142,
-221,211,128,245,139, 14,116,114,153,173,220, 26,204, 26,167, 21,141,229, 68, 25,192, 85,241,186,165,229,150, 63,250,216,124,204,
- 10,215,126,221,213,118, 44,187, 93,247, 61,253,220,102,192, 1,121,234,182,204,139, 79, 19,238, 97, 71,177, 95,152, 96,117, 56,
-125,125,127,232,106,219,125, 63,139,242,159, 23,243,225,242,237, 8, 12,195,253,132,112,243, 94,151,237,125,249,239,163, 25, 0,
- 51, 15,224,180,176,211,246, 33,154, 42,111, 35, 53, 19, 98,107, 27,247,128, 15,242,223, 12,235,221,223,215,240,203,127, 47,186,
-190, 62,203,160, 76,255,105, 53,224,191, 68,150,102, 88,110,112,204,119, 32,107, 25,128, 28,116,172, 88,202, 20, 27, 3,116,208,
-155, 38,171,184,242, 22,131,237, 58,121,204,159, 29,162, 98,193, 5,185, 37, 30,153,172,189,214,255, 11, 64,211,213,244,184,109,
- 67, 65,126,136, 20, 41, 89,222,100,145, 6,109,138,162,135,182, 64, 15,249, 15, 65,175,253,253,189,245,216, 54,200, 54,200,238,
-122, 45, 75, 20, 63, 59,195, 34,123,242, 97,109, 89, 22,249,222,204,227,123, 51, 72,184, 19,248, 92,165,136, 72,144, 84,228, 29,
-240, 12,199, 21, 0,209, 77,121,219, 0, 49,252, 82, 54, 32,150, 19, 0,142, 51,141,122,145,170,133,149,191,197,194,249,212,108,
-144,104, 45,152, 93,156,104, 97,172,219, 16,175, 54,126, 50, 51,232,188,218, 53,144,247, 29,146,207,108, 31,165,152,152,177,163,
-162,108,198,245, 98, 47,154,142,166, 22,203, 36, 6,243,140,192,141,253,164,243,205,140,249, 96,121,180,222,182, 90,185, 57,145,
-157,128,243,199,117, 28,101, 74, 57, 34,152, 89,157, 86,147, 47,217,164, 43,242, 42,128, 81,181,163,220,162,207, 7,141,131,163,
- 38,241, 8, 34, 3,149,208, 73,108, 1,180,141,172, 66,143,216, 17,116,213,145, 8,225, 99, 51,195, 42, 85, 84,236,139,241, 20,
- 47,111,230, 0, 72, 86,207,184,113,196,146,146, 61,143,205, 82,165,181, 50,168, 59, 86,160, 88, 66,123,161,128,160, 50, 67, 39,
-196,216,150,134,206,213, 88,238,121, 69, 72, 90,135,222, 78,227, 44, 89,210, 20,216, 14,245,212,138, 95, 26,107,197, 0, 72,165,
-104,190, 67, 70,218,224,152, 57,114, 92, 29, 11,179, 50,206,130,231,208,199,207, 73,119, 12, 25,155, 67,131, 36,203,225, 65, 2,
-216,236,248, 60,211,123, 36,104,100, 49,164,164,215,163, 43,207,108, 67, 4,176,139, 71,152,181,222,198,248,132,252, 3,246,121,
- 32,192, 20,242,131, 91,192,110,163,140,229, 38,232,244, 24, 26,168, 27, 91,161, 11,222,187, 10,241, 78,104, 75,211, 60,246, 63,
- 54, 54,115,233, 40,147, 10, 52, 44,153,168,158,153,227,104,246,156,135,188,205,184,120, 57,171,182, 42,118,169,214, 21,217,146,
-147,178, 78, 33,247, 84,121,174,224, 56,248, 61,207,192,155,247,154,189,229,179, 88,220, 48, 47,218,190,209,242, 68,215, 84,122,
- 88,207, 69,117,243, 80, 81,145,210,168,162,213, 70, 60, 40, 4,254,192,174, 84, 86,167, 89, 42, 44,228, 73, 32, 76,212,209,165,
-104, 89,243,253, 60, 72,246,250,213,214, 11, 47,244, 9,236, 85, 26,195, 29,221,149, 30, 73, 29, 40,212,204,166,197,175,234,190,
- 61,154,179, 28,235,191, 58, 98,247, 41,114, 86,213, 17,111, 29,217, 1, 91, 80, 45,165,193,232, 34, 73, 63, 66, 86,216,169,149,
-209,250, 41,137, 18,199, 65,177, 87, 49, 22,157, 51,117, 6,114, 31,246, 7,184,247,204,161,101,103,193, 44, 50,170,128,173, 35,
- 67,226,241,242,100, 20,184, 43,177,173,163,126,198,110, 66, 86,163,195,230,176,149,100,168,197, 16,174, 92,218,160,228, 5,228,
-107,107,103,150,169,121,100, 93,188,138, 81, 76, 79,241,113, 67, 74, 65, 74, 68,142,233, 74, 15,216,103, 28,188,164,225, 15,167,
-156,170,152, 58,211,193,107, 7, 88, 59,116,111, 91,230, 83, 97, 61, 29,154, 64, 8,205,189, 63,255, 64,156,125,186, 59, 77, 63,
-125,120,112,191,255,141,111,120,252,227,230,255, 21,144,136, 78,244, 45,185,137, 29,182, 71,220, 65,137,107, 48,129,167, 3,215,
- 49,155, 83, 46,202,226, 34,183, 45,221, 50,109,214, 74, 78,189,193,174,130,242,111,217, 48,143,106,203,243, 68, 59, 23,250, 68,
- 99,253, 82, 62, 69, 81,238,162,221, 14, 92,198,114,152,150,253,231,205,148, 58,114, 44,112,127,121,255,179, 51,246,156,242,191,
-109,116, 41,110, 0, 38,122,183,141, 62, 90,212,250, 25,144, 81, 71, 73, 63, 63,182,123, 32,142,180,112, 80,185,230,183, 95,127,
-209,126,175,219,167, 70, 57,200,131,250,204,124, 2,153, 25,154, 54, 63,184,219,204,245,130,203,241,120, 75,119,133, 94,158,145,
- 99,127,214, 62,192, 71,142,184, 75, 42, 2,229,129,201, 16,255,128, 59, 5,166,153, 25,188, 4, 7, 58,163,192,182,198, 67, 38,
-208,245,216,180,192,175, 84,219,203,182, 34,240, 93, 5, 16,120,232, 96,140,254,215,103, 53, 46,230,205,219,111, 23,255, 46,202,
-239,255,252, 98, 62, 62,148,135,184,139,120,113,126, 47, 41, 31,193,176, 65,221,190,142,174,188,168,215,127,137, 31, 75,138,223,
-181, 50, 31,233,222,250,111,220,236, 29,181,138,106,184, 11,135,250,120,171,127, 60, 94, 31,195,165, 12,207,198,249,123,227,117,
-126, 85,237,254, 74,173,138, 46,237, 90,226, 98,248,171,159, 5,208, 19, 21,243, 18, 71,179, 17,126,144,222, 10,167,168,181, 5,
- 1,200, 99,166,206, 79,200,160,124,158, 70,187,148, 94, 67, 76, 23, 85,173,255, 9,192,209,181, 44,199,109, 3, 65, 16, 15, 2,
- 32,119, 41,201,170,196, 41,199,149,164,114,243, 23,228,154,156,252,241,190,230,154,114, 14,118, 41,101,151, 30, 20, 31, 32, 72,
- 60,210,205,147, 78,187,218, 93, 14,122,186, 49, 51, 61,186,166,149,123, 22,249, 52,156,130,192,162,175,137,168,119, 66,190,220,
-226,215,108, 66, 3, 93, 97,219, 81, 14,118, 97, 97,231, 56,252, 97, 86,221,120,207, 18,112, 52,233,142,221, 42,224, 94,141,165,
-153,151,187,120,217,214, 33,182, 87,111,251, 30,162,213, 92,141,149,179, 55,111,169, 47,204, 11,203, 48,115, 86,111, 46,195,220,
-188,226,120,106, 15,158,237,185,135,166, 0,118,138, 90, 21, 34,239, 0,107, 3, 97,180, 26,217, 43, 27, 17,157, 1,182, 77,221,
- 72, 27,167,166,134,208,170, 30, 40, 47,161,232, 42,192, 8, 44,222,113,171, 99,221, 54,240,151,183,119, 37, 45, 64,160, 94,214,
-101,142, 23,111, 22,195,133,181,182, 74,195,155, 85,112,194,206,178,159, 37,207, 82,221,158,125,112, 74,131,202,115, 59, 17,176,
-100,104,212, 74, 69,202, 38, 26, 95,218,204,127, 12,228,173, 22,225,182,201,103,218,187,146,239, 1, 42, 68, 47, 99, 98, 95, 35,
-157, 33,201,159,228,133, 62,102,233, 5,156,156, 94, 10,110,146,229,220, 47,197,206, 6,121,218,208, 32,145, 68,227,165, 3, 69,
-198,105,109,124, 39, 71,250,232, 20,214, 24, 56,253, 74,195,100, 78, 45, 12,185, 2,144,246,144,123,101, 38,100,179, 58,175,181,
- 5,120, 24,186,151, 39,252,232, 71,113, 65,245,215,249, 63,164,178, 37, 27,110,143,206,221,243,177,202, 2,116, 95, 16,250, 11,
-190, 65, 93, 58, 61,199,121,221,236, 61, 66, 91,237, 27, 39,179, 6, 67,183, 19, 96, 38, 36,250, 65,127,123, 57,211, 48,125,171,
-218,106,206, 5,114,198,126,227,222,201,200, 11,153,227,208,160,163, 72,114, 58, 7,246,158,249, 12,125, 69,247,187, 22,108, 93,
- 54,218, 38,128,213, 61,126, 19, 7,234, 13, 62, 70, 87,179,203,207,189,117,106,112, 86,227,128,209, 90, 8,192,179, 73, 7, 24,
-240,138,118,128,188,126,225,177,147, 28, 17, 63,175,101,206,243,201,150,184, 74, 38, 94,216,221,207,171,121, 82, 50,144,191,227,
- 92,129,163,104,144,197,235,171,246, 92,140, 71,193, 45, 88,101,163,141, 18,123,155,217,128,166, 89,109,229, 93, 57, 94,235, 8,
-194,231,117, 44,107,151,226, 44, 93,210, 20,185, 21,226,134, 24,199, 62,170,149,245, 77,113,197,123, 53,128,117,188, 7,157,209,
- 43, 99,126,247,178,246,162, 32,186, 2,189,219,249,105, 82, 13, 92,167,206,125, 40,203, 81,236, 90,160,153, 17, 68,120,150,143,
-154,221,243, 58,165,192, 16,170,187,139, 51,161, 57,107,136, 43,129, 63,250,145,247, 45,146, 39, 12,223, 56,165,169,178,211,100,
- 21, 27,178, 59, 36, 83,172,251, 19, 0, 91,234,158,219,236, 71, 64, 18,148,236, 65,194,152,105,120,200,124, 20, 18,189,245,185,
-178,236,204, 87, 28, 58, 87, 34, 34, 8, 89,227, 17,129,173, 56,103, 61,161, 32, 41,229,174,161,125,147,191, 87, 93,151,174,239,
-255,248,122,243,215, 3,152,203,242,249,218,214,165, 70, 29, 60,221, 56,203,200,190,174, 6,153, 55, 64,103, 56, 72,154,137,155,
-230,186,190, 91,198,249,145, 86,254,103, 13, 19, 90, 98, 61,199, 34,130, 81,227,194, 93,189, 80, 67, 61,167, 12,167, 23, 85,175,
- 38,152, 92, 87,102, 12,115, 78, 26, 4, 86, 79, 14, 46,132, 69, 86, 96,253, 23,159,236, 41,153,206,228,180, 60,125,251,233,183,
- 47,119,221,187,239,255,254,253,195,123,164, 81, 25, 86, 36,121,227, 6,186,240,210, 12, 58,229,155, 31, 69,216,119, 51,131,146,
-212, 1,225,152, 67, 39,110,254,252,248, 43,200,251,118,188, 66, 64, 9, 28,211,157,171,187, 88,152,168, 52,118,224,201,134, 44,
-215,180,168, 80, 32, 15, 32,237,192,117, 78, 35, 42,214,166,216, 9,158,104, 63, 17,205,217, 26,143, 96, 41,220, 32,134, 0,239,
- 32,186, 10,215, 43, 78, 78, 12, 69, 65,151, 33,235,226,193,241,101, 59,244, 0, 36, 66,248, 30,145,167,139,143,249,161,132, 55,
-189,107,172,239,149,191,180,239,126,255, 69,136, 15,159, 62,167,127,190, 46,147,120,205,102, 26,174,222,196, 43,136,137,209,214,
-251, 6,137, 1,100, 76,216,145,115,132, 26, 71,222,125, 1,253,193,119,124, 20,254,219,162,117,187,171, 35,229, 7,169, 72,108,
- 33,163,111,237, 30, 57, 40,202,177,200,220,204, 98, 7, 59,180, 8,105,188,141, 7,139, 51,238,188, 37, 29,252,174,156,104,172,
-138,207, 26, 0,222, 21, 26,138, 18,100,202, 70,131, 33,103,144,209,187,139,152,199, 12,148, 80,161,224, 65,185,212,236,255, 11,
- 64,210,181,244,200, 77,132,193,126,186,253, 90,143, 20,118, 34, 72, 36,200,129, 95, 0,167, 92,184,242,211,249, 5, 32,148, 11,
-138, 20, 9, 9,208,106,214,227,177,221,111,170, 58,123,157, 29,207, 76,219,223,163,186,235,171, 50, 61, 58, 15,125,228, 66,137,
- 68, 43,206,131,226,251,139,140, 27,250, 68, 59,224,169,156, 30,246, 63,125,250, 62,160,220,134,238, 17,181, 66,113, 48, 72,249,
- 6, 29,234, 78, 7,238,174,233,110, 94, 84,239, 99,112,175,178, 94,104,246, 89,189, 67, 73, 31, 7,117, 44,207,182, 79,151,188,
- 3, 73, 0,142, 23,148,135, 45, 15,113,184,199, 1, 49, 19,198,138,128,169,192,255,104,115,156,120,112, 86, 76,186,221, 28, 79,
-241,240, 33, 44, 86,109, 97,252,215,140, 49,189,176, 90,115, 3, 2, 17, 95,215,236, 71, 14, 11,169, 28,251,108,163, 45,250,148,
- 97, 1,188, 85, 47,183, 24, 18, 18,225,134,251, 58,168,204,163,139,117,145, 79,100,139, 34,234,107,179, 70, 83, 88, 57,114, 55,
-124, 47,230, 51,114, 30,144, 86, 1,164, 97,223, 61,167, 55, 1,123,154, 22, 99,218,122,231,176,142, 91,165,248, 33,190,101,199,
- 40, 11, 36,154,161, 84,146, 88, 51, 81,196,134,194,241,121,240,201,242, 88, 92,225,254, 34,123,154,160,154,150,228,149, 20, 66,
-228,114,169,210, 24,208,247,142, 8, 44,218, 4,100,153,194,168,231,106,168,168, 51,137,240,160, 78, 65,126, 99,142,179, 56, 82,
-191,212,174, 17,123,138, 94,146,146, 12,176, 36,247, 29,111, 40,225, 72,230,209, 13,232,164, 92,232, 57,205,229, 55, 87,158,214,
-203,174,139,191,227,218,212, 9, 84, 42,102,217,101, 29,105, 85, 90,233,254,156,216, 82,142,217, 56,233,111,228, 43, 8,138,126,
-178,245, 66,126,197,235, 21,207,183, 50, 57,116,150,219,139,153,254,204,133,188, 8,180,246, 20,155, 21, 20, 57,236, 0, 18,104,
-100, 91, 44,213, 69, 1,146,208,225,117,212, 23, 66, 90, 25,156,156,156,213,239, 57,250,182,124, 35, 81,223,204,115,226, 86,241,
- 76, 30,131,180, 99,155,241,148,140, 47,196, 27, 90, 15,114,118,114,219, 83, 33, 35,174,107,135,180,205, 67,195,242,179,124, 19,
- 39, 35,187,223,235,130,229,197, 90, 53, 31, 64,192,156, 38,195,215,252, 92,115, 35,191, 83, 23,175,126,157, 72, 50,109,246, 88,
-144,173,196,139,240,111,162, 7, 83,251, 79, 86, 2,238,250, 35, 23,189,112, 55, 68,243, 24,215,200,150, 11,106,115, 77,163, 56,
-112, 20,184, 63,153, 98, 50,220,160, 37,220,255,234,110, 64,183,161,148,240, 53, 10,235, 8, 18,255, 30,203, 74, 87,142,228, 83,
-240, 52,213, 70,115, 20, 26, 57,135,116, 86, 19,203,121,202, 21,120, 77, 8, 23, 16,176,205,178, 80,172,167,166,138, 17,167, 68,
- 37,158, 58,137, 8, 62,196, 63, 40,199, 14, 40, 83,160, 51,206,135, 66, 28, 85,190,127, 35, 43,102,227,233,195,153,217,170,166,
-166,212, 22,201,249,101,150,231,238, 82,165,240, 50, 71,184, 51, 83,126,147, 90, 71, 1,174,114,172,106, 30,175,191, 60,139,248,
-238,115,249,245,203,166, 85,247, 25, 40, 85,230, 62, 97,149, 71,171,214,162, 15,154,231,200, 16,148, 69,126, 10,128,203, 42, 60,
- 37, 26,140, 69, 35,253,220,223,239, 47,175,251,181,151,150, 98, 9, 84, 44,174, 33, 35, 80, 80,217, 79, 17,111,198,236, 58,237,
-119,155, 15,227, 66,212,162,207, 3, 15, 82,118,142,246,106,170,178,242,113,233,151, 76,181,234,130, 98, 34, 81,233, 87, 31,191,
-119,226,195,119,239, 62,253,213, 25,142, 96, 22,131,213,121,141,233,236,182,233,156,233,230,167,253,154, 41,114, 75, 67, 32, 30,
-161,222,191,236, 31,127,254,233,195,123,202,166,202,180, 16,126,101,170, 98,211, 96,240, 36, 31, 21,235, 29,129,114, 73,190,161,
-194, 39,253,160,125,108,244, 77,165, 1,137, 10,197, 13,203,102,155,194, 84,226,137, 78, 72,164,122, 41,125,110, 60,174,192, 13,
-162,115, 8, 15,204, 79,253, 48,209, 43,117, 75,244,251,205,210,211,148,147, 90, 67,128, 48,105, 67, 99, 56,244,198, 93,166,238,
-237, 15,215,225,237,143,175,105,254,237,143,250,251,167, 63,133, 61,175,111, 6, 97, 23, 45,167, 66, 58,160,106, 39,167, 28, 72,
-158,199,245,216,190,237,129, 73, 37,143,236, 59, 17, 20,167, 73, 0, 52,139, 87,127,151,240, 40,232,122,173,157,229,161,205, 4,
-108,207,129,125, 58,124, 1,223,170, 1,191, 5, 89,143, 93,136, 36,191, 36,232,234,196,136,102,194,122, 78,131,227,154,217, 15,
-238, 22,234,132, 90,135,220,159,122,246,111, 66,248,208,158,230, 56, 80,202, 4,168, 16, 77,174,118,241,127, 1, 72,186,146, 92,
-183,141, 40,216, 51,217, 18, 37,218, 63, 65,128, 36,112, 16,100,147, 3,228, 0,201,222, 39,246, 5, 12, 95, 32,139,192,240, 34,
-187,111,228, 3, 95, 18,199,158,216,169,106, 47,181, 17,165,102,191,161,222, 80,101,182,172,218, 6, 47,226,104,144,142,235, 27,
-228, 69,176, 93,190, 44, 36,148, 45, 59, 71,153,148,115,145,147, 38,110,113,207, 29,222, 95, 97,143,179,226, 69,175, 42,154,126,
-191,236, 62, 60,128, 0,206,198, 15,250,201, 2,240, 57, 60, 5,238,134, 26,224,200,188, 83,247,208,240,153,204,208, 84,236,170,
-129,199, 84,186, 47,205,242, 56, 77,207, 10,197,202,102,119,229,124, 28,160,240, 86, 95, 41, 95,121,140,150,155,216,118, 99,183,
- 27,134,166,248,131, 97, 60, 20,143,135,155, 92,100,194,225, 39,119,216,217,102, 42, 3,156, 39,187,135,224, 70,215,109, 72, 53,
-138, 60,133, 60,114,152,216,154, 35,164, 59,174, 67,215,193,130,214,124, 65,140, 24,145,147,183,194,250,149,149,150,186, 70,114,
- 44, 4,105,168,124,157, 73,203,143,124, 64,172, 28, 69,196, 7,227,113,110,217, 38,129,128,179,203,178,123, 18, 48,201,163,231,
-158, 60,140,152,197, 2,123,239,133,221,216,109,164,197, 71,132, 64, 98, 11,182,242, 88,196, 73, 83,141, 70, 51, 0, 0, 7,224,
- 74, 13, 22, 54, 30,144, 77,215,118, 70, 8,109,148, 87,153,152,245,100,237,119, 63,235,202,105,158,153, 35, 8,117, 56,137,201,
-246,117,173,214,134, 85,110, 30,192, 81,221, 35, 57, 63, 4, 41,102, 31,105,218,163, 89,230, 62,150,101,132, 37,195, 67,175, 8,
-158,234,101, 79,195,181,235,215,245,174,246, 87, 66, 50, 60,155,194,115,164, 39,118,234,224,156,200, 22, 59,163,185,175, 15, 44,
-137,176, 87, 0,127,113, 17,235,220,142, 76, 71, 68,193,232,138,217, 56,190, 72,182,121, 41,178, 37,187, 70,161,185,176, 47,251,
-221,213,185,190,136, 11,183, 94,135, 65, 0,146,104,124,223,128,131,146, 74,219,154,225,251, 75,115,238, 20, 75, 63,106,226,208,
- 95, 83,180,163, 44, 40, 27,161, 73,249, 33,153, 89, 52,114, 7, 89, 40, 43, 41,187,190, 57, 52, 82, 23,193,217, 23,209,107, 69,
-214, 13, 81,217,132,145,108,119, 59,224,164,130, 96, 94, 52,183,233,154, 42,176, 96,197,187,137, 46, 85,246, 73,225,253,190, 53,
-172, 91,202,139,223,188, 11,189,144, 30,132,139,191,142,233, 52,236, 46, 82, 76,169, 82,216, 24,174,131, 90, 45,109, 17,160, 9,
-139, 10, 78,237,225,149, 53,102, 12, 65, 58, 44,164,118,112,176,171,230,128, 29, 76,230,178,205, 47,181, 78,149, 10,216,213, 30,
- 43,155,111, 60,200, 71, 49, 81, 44,176, 60, 97,226,166, 28,112, 79,229, 30,204,126,139, 92,188,194,205,103, 11,130,227,234,128,
- 68,142, 52,124,176,223,140,124,206,114, 7,178,161,171, 99, 27, 97,166, 59,151,113, 73, 95,196, 72,199, 38,238, 53, 51, 83,206,
-137,165,152,166, 79, 46,174,116, 89,162,225, 36,254,127, 60, 61,226,144, 46,242,183,178, 12,191,255,249,207,191,127,124,253,170,
-116,125,238, 88,113, 40,150,201, 0, 76,225,134,112, 30, 1, 57,112,203, 19, 60, 8,177, 20, 25, 84,235,127, 48,242,101,149,122,
- 9,184,112,119, 55, 79, 34,251, 45,204,134, 11,165,202, 46,226, 85,113, 96,127,199,227, 84, 61,221, 58,151, 77, 32,187,154,189,
-138,178,237, 2,142,104, 4, 2, 63,200,103, 10,180,123,100,238,214, 34,248,108,192,224, 28,214, 44, 36, 68,186,189,251,249,135,
- 79, 39, 57, 46,170, 27, 76,238, 56,144,236, 35,209,175, 6,166, 16,121,159,145,174, 26,229,143,209,144,184,241, 36,244, 95,239,
-127, 20,226, 75, 92,158,165,179, 12,110,181, 34,111, 63,184,173,195, 42, 41,217, 68,116, 66,102, 82,112,139, 46, 45,136,190,112,
- 22,144,181, 11, 4,210,169, 71,154, 43, 1,180, 57,243,156,197, 76,181, 66,132,225,213,198,196,230,151, 70, 50,220,166,209,112,
-245,165, 10,177,238, 90,221,245,194, 37,168,122,220, 3, 78, 50, 16, 5, 27,127, 54,238,123, 53,140, 79, 63,253,250, 78,190,249,
-229,195,199,199,223,207,159,183,240,184,190, 53,222, 95,225,127,220,106, 40,177,227, 54,235,223, 44, 73,225,207, 35, 57, 73,173,
-202,232, 53, 34,217, 0,207,150, 1,215, 35, 87, 93, 96,109,154,227,142,184,128,158,147, 49,128, 34, 44, 60,198, 84, 46,157, 98,
- 82, 19, 72, 82, 27, 57, 39, 39,158,100,157,136,158,128, 5, 21, 64,250, 77,182,165, 69,100, 14,222, 2,167, 53,193, 8,101,169,
-118, 39,230, 84,201,110,124, 70,166, 91,195,249, 96, 49,141, 26,180,154, 61,203,255, 5, 32,233, 90,118,228,182,129, 32,197,167,
-164,145,118,118,189, 64, 0,199,200, 41,183,196,200, 33,255,255, 7,201, 15,216,134, 29, 32, 8,130, 61, 56,179,155,157,145, 72,
-138, 47, 87,209,215, 57, 12,102,248,232,174,102,119, 85,105, 13,148,115, 56, 26,227, 53, 18,239, 40, 38, 0,124,162, 11, 53,239,
-178, 43,102,247,183, 41, 34,172, 20,156, 30,147,128, 53,236,238,134, 51, 2,141,214,153,243,233,202,101,196,129, 85,142,215, 50,
- 83, 3, 21, 16,109,200,246,168, 11,110,170,173, 51,254,176, 1,210, 65, 97,119, 7,104, 59, 38, 19,196, 43,112, 79,161, 84,152,
-106, 91,116,237, 85,157,145, 45, 80, 42, 61,232,250,124,155, 84, 60, 70,160, 40,143, 66,183,153,127, 43,223, 63,177, 49,131,181,
- 37, 33,155,238, 28, 56,146, 59, 50, 71,201,243,200,231, 78,252,122, 32, 36,121, 98,109, 32, 36, 91,115, 37,225,178, 32,148, 12,
-198, 91, 89,200,121,151,231, 57,177, 3,163,238, 87,157, 8, 30,236,144, 70,234,208, 51, 53,178, 67,195, 6, 90,211,125,190,157,
- 84,143, 72,198, 77,165, 47,174,228,180, 85,227, 16,135, 26, 13,112,252,215, 88,149,234,207, 1,130, 34, 97,204, 81,153,107,165,
-163,190,111,241, 24,248, 48,105, 21, 86,196,152,137, 13, 13,217,237,212,143, 56, 72,211, 35,202, 88,113,221,176, 71,153,235,172,
-218, 4,204, 38, 56, 24,207,217, 14,187, 56,234,126,251, 35,237,128, 44, 86,201,128,221,106,172, 25, 43,192, 13,159,157,247, 73,
- 38, 15,252, 86, 98,229, 45,165,237, 45,190, 60,237, 46,139,255,244, 58,149,227,120, 57,200,255, 1,150, 73,119,118,104,233,217,
-251,182,215,238, 59, 86,197, 20,235, 78, 15, 9,212,126, 62, 6, 0,110,164, 73, 73,145, 58,162,221, 82, 29,105, 59,161,177, 31,
- 12,136, 16,232,127,125,243,156, 36, 53,179,125,173, 20, 35,199,254, 75, 87,205,139, 46,247, 3,135,208,173, 24, 23,121, 66,181,
-179,138, 59,197, 49,173,113,182,195, 42,249, 92,131, 37,155, 85, 39, 70, 99, 73,156, 72,166,216, 12,180,143,111,174, 61,232,138,
- 98, 37, 37,145,233, 64, 72, 5, 24,122,104,148,190,174, 8,159, 56,244,245,251, 52,187,160,252, 8,229, 69,216,172,164,204, 35,
-242,234, 94, 16, 7, 88,170, 10,114, 7,186,102,123,203, 36, 41,244, 7, 1, 26,115, 24,117, 2,182, 34, 7,167, 75, 65,116,201,
- 1,114,227,136,226, 16, 44, 15, 47,100,231,197,114, 16,158,150,130, 20,199, 14, 10,133,105,119,255,164,186, 90,193, 14, 33,114,
-183,136, 56, 92, 53,144,111,193,205, 67,109,204, 14,236, 81,213,165,149,133, 54,136, 8, 10,219, 81, 17,133,149,247,153,242, 63,
-226,255, 77,211,120,176, 37,164,137,240, 26, 79,200,150, 51, 51,102, 34,159, 86,135,141,237, 3,156,105,128, 92, 36,174,148, 24,
- 15, 73,181,185, 54, 47,137,107, 75,242,128,114, 23,182,137, 68,247, 57,100,193, 72,117,179, 74,130, 78,167, 61, 8, 50, 15, 57,
-108,206, 37,193,135,154,249,171, 93,196,176,210, 67,130, 15,127, 57,181,143,159,223,125,186,206,102,255,139,110,244,228, 48,200,
- 16,231,168, 61,149,130,141,197,175,121, 19,182,116,105, 47,143, 27,170,230, 74,157,122,212,120,184,157, 84,248,204, 54,109,225,
-235,115,249,249,237,252, 78,221,254,241,187, 91,150,129,214,110,148, 0, 19,116, 70, 12,121, 66, 8, 91,251,110, 4,160, 26, 58,
- 22,144,242,140, 48,186, 74,113,195,181, 82, 28,137,111, 71,117, 6, 69,109, 69,196, 51, 15,180, 48, 44,203, 16,129,162,211, 16,
-145, 6, 4,101,186, 57,240, 72,245, 4, 67,193,188, 76,247, 18, 5, 32, 26,226,211,237,215, 95,126,255,237,253,143,162,254,157,
-178, 35,194,245,155,188,105,146,233,144, 96,113, 39, 17, 89, 67,223, 34,156,208,202,201,103,172, 85, 54,116,141, 22, 8, 7, 0,
- 6,227,161, 8,241,115,217, 90,113,162,207, 86, 10,190,228,144, 93,125,176, 77,190,177,154,103,231,131, 78,106,188,239,188, 85,
-161, 1,198,196, 45,237,216,195, 98, 5,202,210, 59,247,248,195,227,195, 79,239, 63, 92,238,255,252,227,233,203,151, 79,116,134,
- 62, 45, 66,217, 43, 74, 19,211, 98, 19,147,209, 59,138,213, 23, 64, 93,119,126, 34, 45, 60,173,179,164,118, 34, 5, 64,104,246,
-110, 72,169,174,180,141,167,166, 85,180, 19,219, 78,156, 28, 31,223,100, 64,134, 16, 13, 11, 48,205,199,219,139,245,103,128, 13,
- 47,252, 73,119, 29, 53, 25, 22,138, 2,145,139,171, 21, 74, 45, 28,231, 20,143, 41, 17, 22,226, 92, 26,190,104,208, 52, 92,120,
-139,100,112,149,233, 68, 3, 14, 23, 90, 62,103,115,251, 38, 0, 73,215,178, 27, 53, 16, 4, 61, 79,123,108,239, 6,146, 32,110,
- 40, 66,136,127,225,204, 31,115,227,198, 5,129, 4, 39, 78, 16,148,176,241,174, 61,158,241, 60,168,114,246,184, 90,201,235,121,
-116, 87,205,116, 87,233,148, 78,130, 13, 16,221,168,242, 82, 10,230,215, 27,154, 4, 30,175,221,211,148,167,116, 24,219,135,209,
-217,185,180,171, 3, 63, 62,197,120, 29,129, 28, 86,127,196,246,234, 94,197,186,117,219, 82,131,182, 93, 53,216,219,120,217,118,
- 91, 88,191, 67,222, 8,104,109,253,160,244,217, 33,109,117,155, 15,193,144,213,243, 79,166,168, 87,172, 21, 47, 7, 76,104,155,
- 30,206, 9,212,118,116, 33,150,116, 42,102,165, 28, 65,213, 79,128, 59,133, 91,143,195, 83, 49, 85,201,178, 75, 87, 34, 67, 0,
-117, 1, 36, 43,158, 40, 8,111, 95, 42,112, 54, 57,141, 87, 71,238, 78,240,111, 63, 52, 87,133,178,238, 50,180,188,141,185, 81,
-197, 72, 74, 63, 87,147,232,195, 37,124, 1,222, 48, 74, 83,247, 38,155,118, 76, 18, 11, 76,129,143,111, 92, 11,190,169,125,155,
-237, 40,119, 3,199,224, 87,162,253,129,170,128, 1,163,140,164,163, 55, 66, 85, 3, 34,183,166,205,164,108, 53,213,205,159,253,
- 58,148,201,217,208,242, 93,239,205, 82,154, 7, 17,174,167,164, 45,128, 32, 66, 82, 15,142,138,101,132,173,199,221, 88,123,100,
- 7,112, 2, 65,155, 76, 94, 60, 14,166,139,244, 17,155,144,165,217,149, 19, 47, 52, 2, 2,122,142, 30, 28, 24,248,144,130, 70,
-227, 37,198, 62,250, 80,214, 8, 52, 57,149, 24, 2, 8, 91, 73,142,189,163,105, 86,126, 66,224, 89, 16, 10, 98, 48, 45,101,172,
-194, 65,119, 70, 41, 5, 42, 20,242, 2,170, 59, 34, 76,107, 54,253, 97,120,128,122, 22,246, 89, 81, 96, 13, 97,197,129, 36,248,
- 99,144, 78, 82,218, 60,224,171,186,203,109, 43, 26,253,208,241,241, 58,201,165, 49,131,109, 70,193,165, 62, 90,221, 43, 49,170,
- 66,145, 22, 42,183,107,236,115,199,115,115, 76, 69, 3,228,194,190, 61, 26, 6, 2,173,240, 9,192,171,212,192,238, 88,244,206,
-162, 68, 35, 13, 91,202,137,217,201,186,119,177, 54, 30,179, 72,150,205,224,121,219,179, 84, 0,181,111,247,160,239, 37,157,170,
-111,104,122, 40,116,216,135, 85, 90,252, 24, 17,122,213,172,132,153,196,174,253, 68, 61,255,228, 88, 43,169, 12, 43,205,120, 55,
- 74, 17,114, 30,214, 35, 33, 37,187, 23, 83,226, 89,136,198, 84,251,174, 32, 56,152, 54,224, 46,228,196,133,119,151,187, 89,103,
- 32,237,125, 98,143,149, 96,149,106,197,226, 76,247, 86,184,186, 2,167,196,144,150,122,137,136, 51, 72, 18, 60, 90, 0,238,205,
-255, 82,157, 65,218, 89,134,233,127, 87,146,169,160, 11, 72,167,226, 53, 29,173,199,227,126,126,132, 68, 91, 0, 69,120,229,221,
-132,182,224,189, 10, 91,238,124,105,250,149, 87,169,219,222,190, 69,243,247,218,236, 24,125,231, 41,138,247,197,174,178,104, 5,
- 31,191,251, 3,182,166, 14,129,153, 5, 99, 53,139,203,235, 31, 63,111,110,239, 30,211, 89,131, 59,176, 61, 28,239,249,136,169,
-193,138, 55,117,122, 82,135,192, 22, 8,123, 70,204, 5,246,163, 53, 88, 86, 1,161, 87,173,136, 39,139, 75,167, 63, 63,126,221,
-189,185,125,161, 14,191,122, 36,192,137,174,174, 62, 23,135,159,118, 24, 88, 10,205,166,250,108,108, 85,144,151, 26,218,142, 2,
- 53, 21,106,212,173, 87,141,156,145, 19, 3, 72,191, 29, 50, 77,129, 49, 40,188,214,109,228, 73, 94,178,235, 25,200, 1,222,129,
- 48, 22, 71,183,156,188,198,197,202,101,109,110, 15, 84,230, 10,211,220,235,246,195,199,183, 77,243, 61, 76,127,217, 58, 21, 9,
- 83,120,174,206,244,152,176, 24, 17,217, 36,241,128,102, 31, 31, 86,215,178,223,244,114,105,101, 64, 44,201, 30,177, 45,158, 4,
- 99, 63, 64,109,161, 9, 24,240, 20, 21, 66,103, 1, 84,197, 22, 86,102, 78,252,141,162, 30, 16,201, 69,164,173, 88,142,216, 14,
-103,208, 47, 49,128,177,183,214, 30,245,155,119,119,135,241,253,167, 47,229,243,215,111,127, 46, 63,219,235, 94, 15, 47,128, 84,
-186, 88,238,245,191, 46,142, 35, 0,198,195, 75,117, 69,125,171, 75, 38,252,172,131,124,118,204, 46, 85,168,101,118, 8, 24,231,
- 30,144,187, 25,180, 95, 12,246, 16, 8, 95, 91,137,177,217,221,200,202,181,174, 3,226,216,196,188, 90,163, 15, 1, 9,173, 11,
- 52, 59,166, 94,137,136,134,109,210,120, 61,211,202,136, 77, 3,130, 23, 40, 27,215,242, 0,197,131,116,101,128,180,146, 88, 17,
-191, 81,190,161,176,171,241,156,100,144,161,219,210,252, 95, 0,146,174,165, 55,146, 26, 12,182, 31,221,237,118,207,236,100, 38,
-123, 88, 16, 71,196, 1,164, 21, 92,118, 15,252,101,126, 7, 8,137, 59, 18,136, 95,176,217,201,204,244,203,237, 39, 85,206, 33,
- 82, 18, 41, 73,199,109,127,174,250, 30, 85,154, 14, 40,190,102, 48,193,130,227,234, 98,246, 53,166,108,162,114, 12, 9, 86, 92,
- 94, 92,233, 71,127,200,225, 70,119, 97, 60, 77,112,182,157,230,219,122, 85,250,162,165,232, 64,255,116,215, 17,208,109,155, 17,
-125,182,234,121,112, 65, 12, 13,153,148, 82,224,110, 25, 49, 69,112,254,154,130,193, 88, 85,191, 58, 44,186,197,110,110,135,132,
-151,122, 50,202, 59,229, 87,191,108,161, 55,173,148, 6,219,117,233, 57, 97,232,248,195,133,253,137, 1, 56, 45,107,218,190, 74,
-242, 84,137,147, 35, 18, 46, 75,252, 89,175, 91,146,184,134,174,111, 61,203, 48,153,255,148, 67, 84,215,189,206,122,218,154, 17,
-108, 82, 70, 60, 30, 22,255,192,201, 12,241, 86,221, 51, 77, 45,153,135,140, 40, 21, 7,170,125,168,202,113,198,173,241, 20,160,
-147, 5,145, 73,177, 54, 31,114, 66, 76,167,232, 99, 77,246,250,196, 62,177, 52, 80,253, 22,155,133,196, 37,119,201,168,119,236,
-128,142,184, 63, 59,188, 68,166,132, 69,218, 75,111,197,146, 11, 14, 58, 89, 80,202, 35,149, 2, 65,197, 20, 24, 6, 40, 33,104,
-118,148,222, 9, 93,123, 19, 1,105,149,201,210,244, 56, 21,120,240,120,193,178, 41,121,245,209,128,144, 91, 44, 75, 46,229, 30,
-180,244, 97,114,148, 29, 1,160,138,192, 95,110,147,199,213,131, 53,148, 35, 69,199,150,188,156, 6, 93,167,169,130,154,179, 31,
-175, 77,120, 82,108,198,227, 20, 11,141, 61,195,202,138,117,168,169, 11,196,190, 5,251,132,147, 67, 41,238,156,102, 13,187,242,
-199,146,103,192, 13, 78, 81,102, 14,130, 81,181,181,177, 37,155,182,237,245,248, 92, 58, 73,233,126,186,204,130,174, 57, 37,198,
- 88, 46,172, 72, 52, 59, 91, 19,154, 30,161, 25,203,217,151, 54,215,182,118,124,206,202,231,155,236, 46, 11,251, 25,251,180,208,
-186, 2, 8,132,134,136,134,105, 26, 48,127,230, 71,170,147,198,155, 74, 47,219,100, 17,218, 29, 46, 12,142,177,100,219,208, 46,
- 12,216,119, 6,250, 84,154,130,108,172,191, 54,138,179,106,248, 62,253, 6,123, 58, 85,179,147,213, 87, 83,108, 60,143,103,163,
- 36,167,150, 65, 9, 84,117, 88,194, 33,140,153,106, 63, 9, 65, 28,241,189,138,239,244,249, 86,239,129, 42, 96,224, 1, 30,185,
-229, 21,246, 33,184, 16, 86, 41, 80,226,190, 91,167, 16, 22,206, 82,138, 90, 60,245,115,123,243,113,112, 37,225, 86, 5, 73, 94,
-112,107,120,175,164,197, 69, 18,153,127,237, 67,113,137,186,241,131,103,231,221,221, 81, 51, 69, 7,191, 19,138,234,188,171, 30,
- 47, 69,165,151,218,180,217,213, 84, 12, 54,220,150, 56,190,228,170,103,228, 88, 51, 77,182, 10,235,119,181,212, 0,204,104,116,
-197,236,149,216,112, 28,143,185, 17, 53,205,219,135,199,239,223,124,251,211,203,116,206,241,213, 34,248, 26,132, 9,128,183, 34,
- 30,251,142,104, 41,238, 86,222,118, 92, 34, 1,216, 57,136,107,219,214, 2,179,163,152,209, 61, 21, 43,245,237,191,245,203,175,
-167,143,230,248,207,252, 85,224,220,216, 75,217, 30, 10,187,213,129,115,128, 90, 29, 68,153,129, 83, 99,122, 47, 88,112,223, 50,
-141,115,129, 28,111,173,122,199,201, 27,103, 16, 55, 12,157,194,133, 87, 70,179,221, 86, 61,222,219,167, 50,154,117,200, 26, 7,
-120, 42,249,164,180,112,150,179,251,170, 55,165,223, 18,238,190,213,108,175,175,241,211,231,143,191,252,252,220,228,191,217, 74,
- 3, 66,202, 67, 4,218,236,153,124,159,241, 37,226, 3, 71,199, 89,250,102,119, 1, 11,243,133,170,207, 8,223,120, 67, 1,228,
-157, 80,204,209,220, 36,158,193,238,170,190,231, 20, 53, 91,241,148,220,232,154,236, 6, 26, 61,208,121, 97, 84,233, 65, 57, 25,
- 49,166, 48, 43, 26, 36, 39, 44,179,182,231,230,251, 31,191,187,202, 31,126,251,235,250,199,159,255, 94, 70,224,157, 3, 93,210,
- 54,153, 94,154,109,144,254,108,187,106,223,190,232,149,136,142,227,162,231, 3,109,169, 10,130, 40, 66,130, 80, 79,236, 16, 2,
- 78,212,161,159, 88, 48,213, 45, 63,218,141,206, 26,160, 36, 86,124, 1,227, 12,120,172, 48,225, 87, 15,154,174,185,174, 93,187,
-120,212,216, 17,116,176,122,156,213,162,246,227,163, 76, 8, 82, 6,145, 86,223,115, 58,137,118,111,131,127, 21, 11,208,141,110,
-152,255, 64, 84,101,143, 41,179,209,160,134, 59, 0,123, 35, 39, 27,202,255, 2,176,116, 53, 45,146, 20, 65, 52,191, 51,171,186,
-122,102, 68, 6,241, 3,132, 5, 15,130, 7, 97,253, 29,226,207,221,251,122, 22, 15,162,236, 77,193,139,238,236,246,204, 84, 87,
-101,101,102,101,166,239,213, 8,115, 24,232,166,235, 35, 35, 35,222,203,136,120, 97,182,246,196, 17,101, 94, 69, 14, 19, 99, 34,
-222,136, 6,166,150,235, 33,187, 33, 99, 10,156,145,226, 83, 11,128,108,103,243,153, 93,151,107, 45, 19,184,174,189, 95,180,114,
- 29,159, 8, 86,164,118,248, 7,113, 55, 94,175, 98,240,253,131, 25, 1, 23, 71,246,198,140,237, 41,164,102,252, 0,200,108, 43,
-118,227, 78, 31,219, 93,180, 88, 57,128,243,139,152,117,173, 28,192,136,197, 68,152,106,107,220, 82, 84,193, 37, 69,113,218,158,
- 99, 29,118,235,210, 14, 32,152, 68,193,229, 74,145,102,130,203,233, 64,140,215,136,119, 43,221, 13, 21,218, 61,204,175,143,150,
-131, 96,172, 29,229,205, 96,105,240, 62, 59,128, 35, 53, 49, 75, 26,130,210, 67,226,190, 0,202,187,165, 60,189, 41, 88,163,160,
- 67, 65, 60,193,102, 22, 1,252,207, 51,147,168, 97,109,243, 33, 8, 94, 0,107, 0,254, 16,128,176,152, 64, 19, 8, 14,226,180,
-215, 71, 60,240,216,125,161,106,190,208,185, 73, 59,140,236,115,100, 35,146,179,131,115, 60,229,133,187,181,106,112, 5,236, 16,
-100,149, 53,227,141, 1, 38, 5,120,147,106, 89, 2, 69, 41, 89,193, 34,105,129, 23,134,229,162, 84, 2,208, 38,158, 54, 33,212,
-134,205,139,231, 36, 16, 5,176, 45,103, 17,240,123,133, 25, 64,150, 87,111,107,100,179, 1, 48,152, 92, 88,248,153,202,163,110,
- 81, 47,238,218, 57,182, 52,214,249, 10,124,156, 88, 12, 68,213,216, 2, 0, 57,248, 6, 96, 90, 89,213,110, 97,208, 48,191,149,
- 50,119,204, 35, 82,181, 69,165, 98,188, 4, 95,215, 85,242, 64,184,164,113, 54, 98, 96, 95,180,198, 93,157,123,141,216, 70,184,
-164,158, 88,113,164,130,117,216, 21, 62, 32,184,139,118,226, 44, 11, 10,140, 5,142, 64,252,191, 76,155,226, 94,237,101,114, 48,
-107,253, 72,165,168,236,200,115, 43, 4, 0,172,239,246,130, 30,241,230,121,244,207, 10,110, 42, 34,242, 99,250, 48,138,234, 71,
-128,119,197,170, 66,152, 23,200,197, 35,209, 46,139,120, 34,199,162,178,213,138,147,189,192, 2,130,196,255,138,103,239,184,168,
-158,119, 78, 72, 50, 20, 96, 38, 45,144, 71,146,149,122,253,236,139, 58, 58, 98,116, 78, 69,177, 13,180,239,182,187,220,240,104,
-108,148, 70, 28,201,157,199, 59,178, 36,159, 46,222, 46,125,187, 91, 28,185,144, 90,162,230,107,161, 82, 69,110, 23, 86,194, 24,
- 10, 24,101,241,192,217,219,240,184, 51,238, 36, 18,179,178,142,119,149,112,117, 10, 65,121,101,189,181,105,210,192,192, 1, 30,
-153,223, 5, 99, 41,235,165,176,217, 20, 64, 86,108,185, 48,233,131, 47,128, 44, 12,149, 16, 30,247, 30, 14,228,254,201, 49,112,
-228,200, 45, 48,185,202,148,194, 17, 32,245,241,146,237, 81,254,249,162,160,195,114,155, 93, 98, 87, 95,222, 63,127,245,234,143,
-241,230,117, 89, 31, 30,235,149, 24, 43,210, 9, 70,253, 36,131, 9, 60,132,134, 45,150, 27,132, 46,173,158, 84,118,102,110, 91,
- 75,203,137, 29, 3,171, 6,124,252,251,175,119,191,125,254,195,247, 95,126, 23, 63,254,146, 31, 88,212, 43, 71, 30,180,112,197,
-176,235,224, 48, 3, 51,217, 8,156, 48, 36, 39, 67,228,193,206,104, 99,108,251, 2,240,160,123,112,218, 53, 32, 20,112, 56, 31,
- 90, 27,128,202,220,237,109, 75,118, 26,114, 45,216, 0,128, 74,194,147, 71,180,118,103, 57,190,192, 47,136,175,249,253,126,223,
- 62,253,241,167,111,132,120, 23,159,102,162,236, 88,240,215, 19, 5,217,193,144, 26, 75,121,179,165,198, 4,189, 61,127, 27,102,
-108, 90,255,200,186,124,106, 4,177,225, 77, 49,147,141,125, 1,150, 19,149,249, 71,168,123,191, 3,182,128, 7,158, 57,168,169,
-193,212, 55, 99,102, 22, 81,110,216,116, 36,145, 90,101, 78, 45,111,119,110, 60,219,179, 58,125,241,234,235,217,125,251,230,237,
-159, 63,255,254,235,136,155, 11, 68,125,235, 2,112, 33, 62,120,119, 30,119,102,197, 75, 92,199, 51,149, 8,214,240, 12,143,109,
- 16,232, 92, 74,108,169, 1, 25, 55, 3,107, 46, 67, 86,224,232, 84, 61,227,192,113, 19,227,138,176, 52, 77,117,107, 14, 44, 29,
-209, 47,139,109, 96, 25, 75,134,145, 88, 7,111,127,174, 91, 15,230,223,186,141,158, 26,220, 74,166,105, 10,100, 40,157, 26,215,
-120,223, 64, 23,251,164,199,147, 10, 20, 96, 82,213, 5, 66, 60, 5,234, 62,176, 89,130,170,213, 25, 20,193,167, 32,255, 19,128,
-164,107,215,145,164, 8,130, 93,239,238,158,217,221,227, 22, 9, 9, 4, 8, 9,204, 51,206,194, 70,247, 11,152, 56,248,124, 18,
-159,192, 39,224, 97, 97, 98,129,116,194, 65,194,224,116,203,204,214,116, 87,119,117,189,136, 40,140, 29,105, 87, 51,179, 51,157,
-217,153, 25, 89,153, 17,234,251, 31,222, 56, 42, 54,156, 50, 21, 84, 50,153, 10,224,249,133,157,125,124, 82,203,244,210,212,222,
- 18, 23,170,169,198,167, 40, 52, 51, 69, 49,230, 61,224,202,164,124, 32,102,155,251,128, 66,110,214,179, 17,156,103,127,116, 40,
-231,226,125,194,111,205,225,233, 47,182, 35,233, 7,235, 57,216, 43, 67, 65, 74,176, 99,229, 72,203, 38, 35,128,232,140,248,207,
-251,137,103, 95, 40,120,169,150,178, 77,121,116,211,234, 77,121, 22, 8,162,100,183, 12,135,136,114, 71,161, 16,245,116,168, 41,
-231,127,236,128,108,184,175,212, 23, 85,231,204,147, 69,110,143,164, 92,197,203, 59,120,254, 41,114, 6,164, 56, 77,214,150,137,
-146,109, 77,143, 39,161, 38, 68,216,217, 32,201, 79,164,171, 80, 93,165, 57,126, 80,219, 70,103, 28, 80,144,201,107, 30, 22,150,
- 75, 7, 1,159,154,152,134,136, 14, 11, 25, 79,250,192, 73,159,131,222, 68,113,214,172,184, 32, 8,244, 0,124, 65, 24, 67,152,
- 69, 37, 86,110,235, 3,177, 52,106, 59,178,131,196,115,197,131,249, 72,104, 42,165,119, 77, 56, 41, 2,126, 40,111, 32, 56,144,
-133, 2,138,148,175, 8,120, 58,166, 26, 52, 62, 66, 93,120, 48,181, 7,158,143,121,164,113, 20,153,246,114,217,117,185, 34, 55,
-215, 12,243,240,248,225,240, 91, 92, 72,120, 56,252, 79,177, 58,122,132,208,205, 55,135,244,177,150,224,131, 1, 44, 67,188,182,
-226,213,157,149,254,109, 25, 93, 34, 55, 89,202,163, 52, 19,165,189,213,102,254,229,188, 41,251,222, 8, 30,117,201,205,146, 20,
- 27, 79, 98,189,203,147, 11, 18,140, 38, 82, 86, 42, 55, 87,229, 68, 61,181, 7,171,102,215,202, 75,169, 17, 21, 79, 89,147,121,
- 89,118,142, 22, 50,227, 74,214,227,172,186, 88,195,177,209,193,171, 64,241, 33,252, 31, 14, 30, 87,139, 12, 44,217, 50,233,236,
- 96,236,182, 11, 66, 26,196, 65,198,143,206, 4,150,184,232, 34,251, 4,137,129, 37, 41, 60,210, 97, 0,247, 75,249,190,149,186,
- 87,156,157, 33, 77, 45, 9, 96, 43,110,220, 68, 46, 75,114,197, 17,247, 81, 16,146,140,145,217,136, 98,152, 24,168, 8, 82,145,
- 96, 25,237, 9, 62, 80,106,118, 33, 33,174,157, 18, 80,115,243, 43, 37, 50,199, 80,203,146, 27, 85, 85,112,183, 33, 34,170,145,
-115,167,134,219, 33,158, 54, 24, 39,174,206, 35,180,251,227,150,128, 70,219,190, 21,127,205,171,175,242,170,226, 51,128, 43, 18,
-169,180,110, 32, 85, 82, 34,103,105,144, 42,237, 20,159,115, 48,234, 90,166,216, 22,158, 18, 26,132,173, 4, 84, 80, 56,233, 7,
- 11,164,206, 80,233, 58,116, 65,160, 15,125,206,125,237,193, 93,247, 93, 90,211, 79,107, 76, 95, 9, 56,244,192,246, 62, 15,238,
-248,167,200,229, 57,119,182,136,149,237,241,113, 31,191,250,226,242, 78,223,196,251,194, 55, 61,128, 53,233,228,184,235,216,127,
- 52,114, 91,185,168,205, 93,130,124,222, 13,193,181, 65,254,209,168,170,198,188,150,250,180,196, 79, 94,127,244,113,254,251,183,
-221, 91,135,235, 89, 90, 23,101,160, 17,184, 61,160,141,218, 5,188,161,184, 89,107,138, 32, 1,190,115,115, 14,129,108,184,171,
-242,222,232, 3, 21,190, 50, 15, 18, 73,186,217, 73,135,144, 62,251,249,151,191,214,248, 36, 79,148,255,113, 39,133, 68,224,110,
-194,179, 71, 69,209,180,232,183,203,251,237,219,239, 94,189,249,230,195,186,254,158, 42,151,224,200,158,123, 59,218,243,145, 99,
- 66,192,200,240, 68, 88,150, 93, 64,182,100, 96, 45,188, 20,249,144,141,115,248,204,141,140,123, 28,190, 69,157, 20, 20, 64, 11,
-183, 62, 80, 70, 77,141,172, 82, 98,160, 8,159,135,185,185,143,134, 90,142, 74, 82,249,200, 11,239,247,186, 75, 56,226,248, 66,
-220, 63,220,125,249,245,167, 23,241,249,143, 63,189,253,245,207, 63,228,164,167, 60, 75,242,129, 13,137, 26,247,245,156,146, 62,
- 19,151, 29, 81,142,197,178,170,227,132, 38,217, 32,129, 86, 9, 40, 19,210,142,192, 3, 97,189,136, 23, 0, 64,250,241, 69,181,
-133,131,200,109, 30,181,164,106,111, 94, 4, 76, 56,220, 70,141, 48, 20,183, 13,208, 56,160,128, 69, 84, 85, 22,197, 9,252,146,
- 98, 74,228, 48,227,210, 31, 82, 93, 19, 19,139,113, 83, 86, 90, 52,152,141, 77,229, 43,190, 33,220, 76, 52,185,227, 43,250, 98,
-213,210,226, 59,113,192,113,234,127, 2,144,116, 45, 59, 82,228, 64,176,236,178, 93,175,238,158,225, 49, 66,163,229,192,101, 1,
- 33,129,196, 71,172,118,255,129, 35, 7,254,140, 31,224, 79, 56,129,132, 4,104, 37, 96, 22, 52,221,213,245,180, 93,182, 55,194,
-156,123,164,234,233,114,166, 35, 51, 35, 35,202, 87,111,254,193, 49, 65,169, 25,212, 12,136, 4,116, 65, 41, 58, 84,106, 40, 48,
-197,104,185,122,176, 26,146,238, 86,220,174,150,146, 62,174,216,144,119, 87,121, 65,101, 93,157,155,201,186, 50,128,115, 91, 67,
-119,178, 14, 96,212,236,144,252,106, 93, 76,157, 70, 6,149,134, 38, 82, 36, 49,187,220, 28,231,130, 87, 63,110,182, 88, 15, 83,
- 15,200, 54,144,202,191, 34,131, 23, 72,177, 35, 94,106,178, 43,137,103,138,131, 4, 73, 85, 26, 78,115,149,164, 52, 84,172,246,
-237, 20, 46,103,194,229,153, 59,104,157, 16,119,154,176, 95,185,207,235, 90,165, 19, 10,195,182,105,220,185,144,123, 90,140,150,
-221,174,147,242, 2,199, 73,103,194, 23, 29,228,227, 14,231,170, 52,154,211, 52, 74, 99,149,244, 94,225,202, 99, 75,156,151, 74,
- 42, 45,104, 73,183,227, 80,219,132, 58,156, 61, 46,146, 94,202, 9,224,210,147,113,140, 12, 41, 35,135,196, 50, 55,254, 74,154,
-209, 82, 32, 19,184,202,224, 90, 19,156,218, 0,137, 54, 26, 17,197,132, 86, 53,153,117,129, 83,162,168,245,163,217,146,145,156,
-164, 87, 0, 34, 56, 3,124,127,158,157, 4,165,105, 71,180, 2, 31, 82,199, 62,101,151, 8,160,144,145, 92,217, 24, 34, 42, 10,
- 4,187,118,177,199, 13,220, 7,191,166,129,100, 93, 92,238, 21, 42, 18, 59, 14,156, 66,203,105, 5,106,231,222, 58,234,159, 90,
-205,168, 35,251, 94,152,234,241,213,193,126,255, 48,103,252, 23,243, 36, 95, 71,148, 78, 36,138, 73, 27,240, 96,151,245, 86, 19,
- 7, 54,100,108,255, 30,106,210, 85,143,210,116,194,176,116,145,170, 50,200, 38,205,157,178,235,100, 68,136,170,182, 10, 50,238,
-240, 61, 53,125,143,113, 93, 82,171, 16,255, 40,149,140, 74, 74, 67,114,157, 83,144, 93, 78,153, 5,132,145,160, 11, 61, 16,132,
-151,220,226,207,148, 76, 97, 35, 61,172,221, 70,158,161,224,204,133,215, 97,182, 2, 32, 57,157,201,159,161,206, 21, 86,149,141,
- 87,168,177,142, 42,155, 68,201, 16, 0,164,136,200,217, 92,202,113,196, 34, 53, 91,171,138,144,182, 46,133, 44, 27, 78,197, 26,
-142, 45, 11,210,133,144,223, 23,233,133,231,106, 48,137,227,184, 23,144, 41, 34, 61,218, 40, 73, 73, 69, 50, 60, 20, 96,125, 8,
-103,165,202, 35,130, 82, 0,230,173,103, 54,125,131,109,126, 89, 73,115, 88, 84,101, 99,116,125,114, 67, 48,179, 60,167,120,242,
- 98, 95,200,133, 3,116, 32, 13,162,233,218, 23,150,186,203,197, 54,123,179,164,172,220, 65,195, 10,220,231,115, 40, 71,111, 34,
- 94,182,207,204, 29,199, 36,206, 57, 33,181,237, 56, 86, 21,217,229, 90,101,240,158, 45, 98, 41,176,192, 36,149, 25, 67,173,230,
- 95,146, 28,169,216,118,234,148,168,200,184, 22,172,142, 84,208,251,248,232, 69,181,200, 7, 55,255, 30,131, 30, 16,208,246,164,
-215,224, 44, 13,152,138,122, 70,190, 63,142, 65, 57, 33,195, 50,157,112,253,120,133, 34,176,188,213,113,160,208, 40, 10,188, 79,
-231,161,187,126,246,164,251,185,108, 95, 44,158, 81,117,113,223,226, 40, 20,113,159,180, 41,187,170, 72, 53,159,181, 99,230, 12,
-138, 44, 94,220, 0,181,217,233,186, 33, 31, 15, 47,173, 1,190,187,207,177,138, 0,192,156,174, 30, 94,255,113,245,236,230,171,
-250,113,123,252,121,123, 92,188,189, 25,156,103, 74, 88,151,105,153,251,217,205,254,239,191, 94,190,126,243,180, 16, 95,151,211,
-127, 2,175,120,142,197, 41,133, 62,218,145,139,114, 2,249,201,102,155, 45,147, 21, 59, 38, 42,122, 81,246,117,205, 74,126, 38,
-183,213, 50, 31, 50,160, 74, 83,108,167,202, 22, 37,175,164,250, 29, 5,187,233, 40, 24,105,181,231,184,232,183,166,101,164,232,
- 42,247,197,216,179, 41,211, 46,169,187,234,250,225,159,125,249,252,237,187,207, 31,191,189,175,239, 53, 23, 21, 32, 15,126, 50,
-238,229,249,125, 61, 5,111,187,118, 44,106,132, 55,178,251, 9,208,225, 48, 91,150, 52, 37, 87, 66, 20, 93, 37, 21,249, 83, 52,
-101,162,109,118,222,129,188, 68,189,131, 20,168, 47,113, 23,107,177, 20,146, 50,132, 89,141, 19, 39,237, 23, 82, 54,146,163,211,
-220, 96, 35,179, 78, 31, 16,143, 99, 2, 52,175,179,242,208,217, 59,128,111,160,152, 77, 26, 36,232,141,126, 67,228,223,156, 1,
-191,183,164, 80,249,225, 24,155,128,143,207, 94, 28,200,118,150,213,102, 16,116,219,255, 2,144,116, 53, 45,146, 20, 81, 48, 63,
-170,178, 42,171,171,107,237, 93,216, 93,212, 61, 40,130,232, 44, 8, 43,232, 77, 16, 79,123, 89,132,189, 8,130, 39,255,166,224,
-193, 63,224, 77, 65, 16, 68,144,101,157,177,103,186, 43,179,243,219,136, 26,152,203, 12,195, 76,245,171,204,247, 34, 50,223,139,
-208, 63,252,248,210,224,137,120, 13, 22, 56, 19,133,184,197, 99, 66,246, 11, 8, 60,222,165, 95,217,242, 15,196,157, 98,194, 15,
-149, 11,204,103,131,147,139,215, 39,235, 91, 31,145, 93, 56, 38, 6, 88,215,217,125,223,141,250,108,199,114,176, 53,209,236,189,
- 62,113,120,244, 7,228,250, 72,145, 29, 72,155,112,180,152, 13,224, 21,170,157,177,159,123,163, 58,215,244, 30, 12, 41,216, 28,
-241,219,101,208,227,141,165,225,141, 75,180, 10,170,180, 22,204,125,244,211,253,252,113,243, 94,155, 81, 81,163,101, 64,148,147,
-176, 67,148,155,137, 20,214,219,195,186,239,172, 24, 70, 51, 41,118, 58,114,252, 71,163, 8,209,140,188,179,105, 0,173,146, 60,
- 79, 96, 38, 64,162,125,135,159, 37,179,238,129,124, 86,142, 54,119,108,180, 80, 14, 88,210,241,152,189, 24,170, 47,202, 65, 69,
- 54, 59,101,118,209, 79,154,114, 36, 69,178,137,148, 39,191,160,137, 40,153, 74,107,106,110,163,136, 59,138,141, 55,196, 28,197,
-165, 27,196,165, 83, 7,182,135, 49,143, 55, 43,193,147, 41,131, 57,130,140,116, 38, 83,186, 48, 96,207,147,136, 85, 54,215,115,
- 24, 48,145, 65, 2,142,214,144, 68,188, 1,151,202,237,182, 21,135,100, 31,101,167, 79,221, 90,198,214,206,218,161,230, 6,100,
-125,229,252,169, 56,164,199,116, 87,169,140,136,124,189,218,186, 79,101,141, 52,162,185,142,182,174,151,219,236,250,229, 74, 15,
-226,252, 91, 38,109, 67, 25,228, 92,152,151,138,106,155,178,166,255,170, 56, 53,177,103, 23, 11, 85,211, 2,184, 14,243, 75,117,
- 91,127, 40,245, 93,120,184, 5,180,219, 63, 40, 51,128, 14, 32,221,174, 24, 20,182,123, 7, 67, 77, 52, 85, 56, 92,138,247, 66,
-196,206, 1, 2, 38,232, 30, 57,136,165,132,199, 26,150,210,187, 85,210, 64,133, 29, 59, 52,111, 5,217,162,160, 58,181,169,182,
-227, 90, 14,215,226,113,216,145,200, 35, 97,252,233, 28,197,118,234,181,169,196, 0, 7,172,149,160,141, 10, 86,146,242,137,165,
-120,197, 1, 37, 96, 69,236, 89,150, 67, 83, 1, 84,162,236,169,133,152, 40,114, 65, 7,147,198,233, 42, 10,119,209,237, 97,235,
-144,139,156,233,229,209, 61, 95, 85,186,208,199, 46, 34,235,161,118,215,202,139, 83,124,229,202, 1,105,144, 80, 31, 46,111,115,
- 60, 70,113,141,136, 25,185,146, 33,227,193,142, 43,149,220,253, 81, 30,239,232,221,145,162,154, 92, 79,193, 91, 84,183,208,216,
-245,177,141, 17, 54, 94,244, 74,235,171, 31, 76,218,172,128, 64,137,207,116,209,237,251,124, 1, 51,137,129,170,104,122, 67,235,
-154, 55, 62,216,229,140, 95,229,244,229,134,217, 21, 47, 84, 17,117,236, 0,196, 25,196,179, 83,194,107,222, 41, 33,210, 30, 57,
- 3,219,202,202,186,136,121, 81, 20, 49,152, 65,218,211,152,195,179, 47,159,221,252,243,232,223, 55,127,203, 1,235, 43, 88,128,
-182, 21, 52, 58,198, 44,221, 82,202,105,162,211,192,181,196, 62,153, 65,129,106,188, 76,156,221, 53,160,219,226,180,156,238,142,
-167,195, 71,159, 60,127,186,252,229,142,119, 61,144, 12, 10,243,156,245, 28, 0, 8,177, 98,213,254,194,214, 54, 90, 84,168,169,
- 7, 58, 2,160,218,177,174, 78, 90,245, 88, 28,160,120, 7,163,166,162,102,148, 99, 7,148,124,243,251, 23, 95,203,215,223,126,
-246,226,197,213,163,167, 31,188, 59, 60,158,215,110, 94, 22,187,223,237,150,253, 87,207, 63,253,254,187,111, 94,189,190, 82,244,
-248,251,163,172, 89,251,160, 86, 4, 54, 6, 96, 1, 95,226,109, 36,217,202,212,154, 19, 78, 51, 94, 52, 10,162, 61,166,216,228,
- 53, 80, 3,227,134, 19,186,123, 39,178,181,113,150, 93,108, 61,206,133,204, 3, 91, 28,187, 38,111,218,146, 84, 33,227,237, 16,
-120,183, 10, 43,182,129, 17,187,222, 28,212,251, 31,127,120,120,239,243,159,127,121,243,211,159,191,210,232,202,207,113,151,131,
- 27, 29, 97, 13, 79,197,128, 79, 64,203,108,166, 69, 15, 91,112, 34,168, 73,144,101, 70, 5, 9,170,242,212,170,244, 62, 0, 83,
-178, 29, 14,236, 47,113, 43,248, 40, 17,234, 68, 71,175, 6,202,153,114, 92, 61, 80,144,201,227, 24,235, 0, 70,133,213, 14, 74,
-114, 49,146,226,224, 78,137,135,237,140,244,109, 98,185,165,131,218, 48, 81,154, 65,177,225, 32,143,248,239, 88,210, 29, 59, 18,
-232,176, 27, 52,240,247,132,239,131,142, 52, 40, 75,219,148, 76, 24, 12, 24,105, 42,255, 11, 64,210,213,243, 72, 82, 67, 65,187,
-109,183,221,221, 59,195,238,138, 69,160, 37, 2, 17, 33, 2, 66, 66,254, 2, 18,186, 63,120,191,128, 0, 2,226,147, 32, 65, 4,
- 36,144,160,213, 73,220,233, 52, 55,215,243,209,237,182,219,110, 83,229, 13, 38,153,209,104,166,221,237,247,170,252,234,213,211,
-236, 40, 90,166,108, 22, 14,170,113, 78,113,166, 73, 92,140,155,177, 69,108, 36,250, 84,150, 66,177, 40, 7,144, 83, 43, 45, 40,
-144, 48,227,110,195, 67, 50, 32,107,103, 39, 7,101, 25,229, 82, 47,175,136,152,115,254,200,211,119, 22,215, 71,116,122,236,189,
- 74, 87,191,250, 46, 34, 40,180,235,234, 99,190,181,134,106,223, 0,254, 97,183, 75,192, 13, 90,205,164,230,139,213, 14, 23,100,
-178, 61,165, 60,137, 14, 16,186,108, 39,229, 89,209,148, 93, 25,230, 15, 75, 9,158, 67, 48, 43,221, 0,173,191, 7,176,245,171,
- 26,140,238,145, 74,144, 67,237, 22,240,112,226, 82,229, 29, 32,161,217,229,161, 49, 46,225,231, 74,115,159, 36,253,210,135,194,
-186,204, 66,243,114,100, 57, 48,255, 18,180,100, 53, 67, 58, 30,199, 48,232,203,165, 56,211,208,184, 8, 27, 13,175,161,112,192,
-236,135,118,113,107, 71,245,114, 66,226,112,134,181, 94,214, 0, 90,158,140,251, 94,168, 72,223, 13,179, 18,226,226,205,153, 65,
-187, 40,158,169,166, 92,109,186, 77, 1,246, 17,115,213,188,103, 30,215, 34, 86,234,160, 84,192,111, 33, 75,105, 90,158, 2, 93,
-156,177,251,187,101, 68, 90, 72,181,233, 18,105, 29,128, 1, 15,138,111,166, 48, 93, 52,199,152,231,124,198,246, 74, 23,151,124,
-144, 55,209,149, 20, 34, 18,249,202,137, 1,235,137, 30,242, 98,204,235, 76,218, 24,251,109,215, 38,112,103,240,157, 24,118, 55,
- 0, 20,248, 20,200, 96, 41, 83, 22,125, 27,136, 72,131, 14, 15,188,120, 90,129,167, 38, 2,253, 41, 19, 60,205,121,135,129,253,
- 70,177,107,194,108,244, 93,106, 69,203,246,102,217,128, 90,115, 8, 25, 11,249, 91,211,133,130, 27, 78,111, 87, 22, 44,197, 94,
- 80, 32, 18, 43, 4,125,110,160, 39,222, 0,178, 90,144,159,109, 33,246, 40,186,170,141,158,213, 15,128,213, 11,203,216,197, 96,
- 85, 58, 74,237, 18,249,127,174,154, 73, 42,224, 69,170, 45,168, 20,121,243,168, 65,105,150,149, 54, 54,106,214,230,149,140,191,
- 33,137,220, 40, 38, 6, 18,161,103, 6, 7,158, 59,246,148, 99, 55,179,200,183,110,108,234,182,114,163, 56, 27,209,130,253,144,
- 13, 81, 58, 73,209,213,250,144,168,137,126,207, 81, 72,212,184,240,222,226,217,104,102, 0,135,121, 2, 20, 98, 23, 39,194,214,
- 65, 31, 75, 25, 82, 4,103,152,199,230,237, 69, 68,191,217,107,118,123,181,214, 58,115,123, 43,177, 44, 14,188,227, 92, 38,154,
-232,146,141, 32, 16,223,204,146,201, 26,223,205,136, 81, 27,133,197,139,170, 98, 67, 74,124,167,122,194,238,170,137,125,137,213,
- 74, 84, 84, 71, 6, 89,189,195, 42,108,167, 43,102,230, 81, 59,253,143,171,228, 83, 86, 99, 36,160, 38,186,208,243,168,162, 26,
- 8,121, 19,111, 55, 91,100, 8,226,240, 52, 62, 28, 94,125,245,245,119,127, 31, 31,203,235, 39,243,185, 30,129,123, 7,171,104,
-122, 54,251,195, 58,196,112,252,152,138, 2,235,227,133, 35, 1,249,223,236,148,199,208, 7, 19,237, 78,254,251,223,171,159,255,
-249,254,199,111,126,184,247, 63, 29, 95, 31,201, 92,217, 41,140,197,176,224,164,169,233,228,208,116, 44,130,176,217, 99,235, 55,
- 19,233,246,143,109,175, 74,199, 94, 19,253, 41,224, 85, 90, 2,182,173,202,250,244,102,252,243,221,239,159, 60,190,249,226, 51,
-243,237, 11, 39,220,163,216, 30,158,253,201, 42, 57, 57, 11,241, 36, 46,127,132,119,103,125, 29, 11, 0, 43,226,195, 33,226, 6,
- 77,130,102,198,137, 14,212,162,170, 30, 11, 79,232,216, 51, 36,120,252,214, 57,236,183,245, 66,113,165,229, 92, 62,149,199, 70,
-236, 86, 36,185,154, 0, 40,223, 82,213, 87,154, 41,178,145, 41, 37,194,121, 65, 75, 2,197,197, 71, 72, 52, 88,112,219,108,183,
-122, 55,236,191,124,249,203,251, 95,255,250, 77, 32, 68,219, 27, 36, 11,115, 17,105, 31,210,218,143, 9, 8,246,106, 27,229,103,
- 53,237,155,150, 50,132,152,154,237,109, 28, 58,195,169, 58, 96, 67,158,189,114,215,109,163,123, 60,226, 87,234,189,195,167,241,
- 46, 15, 64,192,124, 10,207,162,239, 75,135, 92,108, 42, 59,159,125,164,229,130,110, 3, 40,229,114,212, 5,132, 18, 28,116,153,
-115,135,208, 99, 21, 82, 76,100, 45,158, 45,219, 91, 71,127, 40, 68,239,211,178,182,184,197,162,186,233, 48,130,229,209,132,253,
- 34,114,219, 46,108,145,112,116, 96,154,205,172,123,245,191, 0, 28, 93,203,142,228, 52, 20,245, 43,137,147,174,154, 30, 96,211,
- 98, 52, 18,176, 2,150,240, 43,124, 2,159,136,196, 63, 32,182, 45, 33, 49,154,161, 23, 13, 12, 51,221, 83,174,196,137, 29, 63,
-194, 57,174,101,171,170,229,196,246,245, 57,215,247,158,163,127,250,249, 7, 49, 58,193,218, 70, 0, 85,166, 72,214, 1,167,219,
- 21, 47, 43, 26,159,216,251, 46,152,234,157, 17,136, 14,173,124,202,173, 90, 7,112,218,128, 20, 55,183,109, 21,169,175, 79, 55,
-147,161, 78,203,168,234,244, 89,157,172, 88,142,121,168, 32,234,130, 69, 51,125, 58, 9, 11,114,149,252, 39,214,103,236,128,211,
-177,204, 84,187, 25,214,213,105,221,177,123,154,197,223,234,211,190, 82, 70,192,210,138, 50,225, 7, 67, 71,221, 73,252,111,234,
-214, 57,156, 68, 47, 58,102,106,176,197, 44, 31, 60,182, 54, 37, 77,129,252, 10,124, 89, 41,154,156,251, 81, 77,188, 14,162,145,
- 83, 72,183,114, 3,178,193,132, 35, 36, 79,227,208, 76, 57,196, 4, 4,170, 39, 26, 6,116, 32,126,172,185,163,234, 28, 9, 60,
- 0,126,214, 25,177,166, 82, 42,223,215,146, 78, 43,195, 3,209, 38,109, 11, 42,117,141,120,187,153,233,100, 87, 40, 73,167,232,
- 14,140,247,138, 33, 19,155, 70,125,166,237, 37, 40,188,100,254,127, 8,134, 18, 25, 85, 2, 35, 28,173,220, 66,104,118,208,130,
-109, 10, 6,153, 34,232,249,216,116,238,232, 21,193,254,102,185, 81, 43,151,130, 34, 37,230,167,188, 57, 74,183,104,103, 86, 0,
- 17, 28,244,162,172,224,194,155,120, 70,192,141,123,127, 88, 13,250,157, 98,217,253, 92, 2, 6, 63,109,149,173, 41,160, 18,216,
-132,145,202, 5,245, 8,171,248,234,115,165,118,231,194,188,247,196, 91, 32,118, 56,115, 2, 17,183, 82,205, 12, 54, 3,192,158,
- 15,107,154, 84, 0,206, 65,246,116,215,170, 41, 40,114,218, 69, 63, 82, 96,155, 23, 8,132,235,152,123, 99,130,169, 56,226, 18,
-139,254, 89,176,164, 4, 43,174,168,214,198, 43, 10,246,238, 81, 7, 36, 28,160, 36,160, 46,154, 9,213, 3, 36,147,173,249,192,
- 7, 0,174,169, 82,239, 78, 54,249,221, 14,187,152,237,203,236,189,145,173,228, 59,183,246, 49,123, 88, 4,137, 66,215,164,194,
- 76, 61,135, 69, 95,227,210,140, 21,176, 99,129, 59, 91, 61, 6,237, 61, 34, 78, 77,205, 34,235,204,228, 45, 48, 50, 21, 31, 76,
-179,211,232,177,126,240,213, 61, 39, 60, 93,174, 52,136,222,113,186,129,146, 14, 85, 44,145, 26,192, 6,175,141,230, 25,181, 18,
-140, 45, 51,129,174,136, 41, 39, 74,115,198, 93,132,156,241,154,197,179,136,115, 74,238,136,142,135,118,225,133,165,237, 76,119,
- 82,213, 44, 25,164,238,130,191, 81,134, 68,118, 8,250,173,146,157,205,240,150, 30,224, 49,202,152,171,235,164, 94, 15,192, 43,
-182, 30, 5, 6, 55,213, 48, 38,158,106,104, 85,143, 86,138,165,101,222,219, 74,101, 54,226,210,130, 62,233, 53,115,146, 32,249,
-148,168, 7,111,177,138,209, 46, 15,244,250, 16,147,178, 64, 3, 55,212,221,162,140,128,166, 27,210,151, 63,202, 87,223,223,189,
-253, 61,123,247, 31, 59,244, 55, 83,230,108,207, 75, 31,142, 35,102,172, 25,138,232, 0,102, 70, 79,133,119, 12, 97,207, 76,173,
- 97, 95,109, 67,138,251, 95,151,191,247,211,183,223,189,254, 98,192,106,203,190,200,179, 60,206,246,102,100,229, 46, 75,223,219,
- 33,124,238,217,153,140, 15,246, 36,117,236,250,238,197, 93,255, 18,163,120,149, 89,156,138, 21, 25, 98, 71,246,187, 92,221,191,
-238,241,241,254,242,225,254,195,211,195, 27,255,241,157,187,190, 93, 31,238,151, 55,127,248,119,239,195,227, 67,124,255, 20,254,
-137,121,171,105,165, 8,212,118, 45,197,211, 29, 7,172, 63, 52, 33, 86, 67,187,230,118,244,201, 44, 45, 86, 90,195, 3,212,215,
- 44, 4,149,214,100, 76,217, 85,169,214, 64, 77,221,224, 85,102, 39,120, 47, 5,202,230, 13,120,119, 26,216,129,145, 48,251, 27,
-181,125,154,138,157,156,110,165,190,235, 95,127,253,205,159,151,187, 95,126,253,173,158, 62, 78,242,150,174,173,163, 78,174,175,
- 38, 54, 44, 40, 34,240,176,185, 41, 73,209,244,214,215,141,226,243,180,191,192, 4, 5, 38,124, 89, 31, 83,148,102,113,156, 1,
-180, 4, 68, 86,125,126,169,135, 80,166, 4,160,118, 6,141, 51,224,142,222, 24,236, 35,222, 34,208, 39, 23, 27, 25,241, 68,173,
- 83, 29, 45, 72, 86, 2,215, 90,115, 92,118, 9, 54,112, 19,170,147,216, 52, 33,182,206,249,189,170,206,200,160,204,136,169,235,
- 84,142,222, 90,188,160,221,247,224,253, 20, 48, 55, 75,135, 17,197,195,235, 89, 70,243,220,253, 47, 0, 73,215,178, 34,199, 17,
- 4,187,222,221, 51, 61,203, 72, 72, 70,224,131, 15, 6,129,116, 17,250, 8,255,134,192,255,230,175,208,167, 72, 96, 31,132,193,
- 62,120,188,238,233,169,174,119, 57,162,116, 91,118, 97, 31,181, 89,153, 17, 89,153, 17,234,211,175,191,224, 43,251,189, 10,159,
-100,223,214, 16,130, 50,248,201,100, 5,143,192,181,254,174, 43, 8,164,169, 0,243, 89, 28,121,183, 18,208,169, 28,137,249,142,
- 62, 54,220, 21,209, 84,104,181, 8,142, 39, 73, 21,178,233,188, 60,102, 98, 36, 42, 50,101, 63, 47,153, 30, 25,108, 0, 24,212,
-252, 4,112,131,202, 26,196, 61,115, 91, 14,223, 20, 68,188,210,150, 38, 6, 99,105, 89, 53, 33,144, 8, 72,193,129,162, 8,124,
-102, 83,123,136,220,155,137,146, 77, 13, 77, 67, 62,121, 98,127,120,177,118,102, 39,102,106,167,106,204, 56,126, 0,115,139, 44,
-100,218,226,174, 86, 88, 43,207,107, 95,158, 92,193,191, 65,233, 66,177, 0,109, 22,173, 4,248,150,165, 31, 43,170,126, 59,138,
-184,180,110, 28, 91,188,138,226,206,124,175, 1,225,230,130,228, 2, 92, 53,242,245,144, 88, 76,124, 65, 69,204, 58,139, 75,106,
-139, 3,241,176,108, 71,168,149,207,166, 73,115, 22,148, 2, 1,224,141,199,232, 86, 56,170, 86, 13, 37, 9,133, 88, 43, 74, 14,
-133, 38,182,244,162,230,227,171,166,167, 43, 62,129, 0, 46, 81,210,141,249,168, 40,126, 41,248,144, 18,144,134,164, 42,104, 70,
-222,222,213,189, 83,245,230,232,161,112,150, 71,114, 32,160,183,114,171, 49,170, 7,247,176,136, 23,251, 69,224,234, 11,143,179,
- 76, 54,202, 51,192,113,208,128,122,126,139, 63,253,124,122,163,108,216,111,181,241,189, 68, 80, 43, 24, 0,136,110,226, 52,111,
-162,104, 46, 16, 37,107,157,243, 19, 85,221,169,140,201, 37,105, 98, 50, 99, 88, 32, 65, 77, 22, 43, 87, 78,168,209,224, 80,247,
-110,185,240,220, 23, 32,235,202,158, 61,221,100,134, 3, 30, 69, 26,216, 1, 4,152,236,201,114,108,155, 42,236, 52,133,225, 6,
- 45,141, 30,145,253, 19,115,106, 21,195,139,129, 59,167, 8, 51,145, 5,136, 4, 7,128, 56,219,194,254, 22, 31,155,233, 18, 5,
-232,133,107, 15, 42,217,190, 11,226,177, 86,130, 13, 21,190,231,148, 38,185,229,170, 41, 30,119,224,119,194,177, 1,130, 24, 42,
- 81,182, 3,213,237, 72,158,243,205,145, 96, 69,245,128, 98,192,237, 2,181,171,238,107, 98,137, 2,131, 42, 49,212,122, 55,211,
-214,147,231, 76,107, 66,210,207, 53,121,117,107, 58,164, 26,254,108,226,198, 49, 75,127,147,207,184,107,147, 89,219,201, 92, 28,
- 0,168,162,161, 11, 48, 6,168,143, 46, 43,240, 78,119,190,115,170, 71, 83,253,129,171, 83,227,185, 25, 73,231,154,166, 17, 31,
- 18,168,249,129,143,135,210,162, 24,139,242, 28,253,151,195,181,155,107, 68, 34, 20,113, 50, 67,126, 88,176, 75, 67,169,200,225,
-108, 98, 4,109,249, 40,240,197,200, 36, 77, 90,191,155,222,168,233,188,206,237, 36,236,220,104, 25,161,155,123,133, 84, 24,204,
- 35,190,126,251, 36,221,143,127,124,141,165,110, 82,236,147, 49,161, 90,208,146, 48,118,137, 69, 81,155, 50,220, 47,178,218,144,
-219,131, 53,227,196,143, 25,220, 76,183,252,120,254,242,247, 95,219,233,221,135,247, 31,175, 46,164,252, 44,120, 25,198,174,218,
-213, 90, 14,133, 77,210,157, 37,149,133,112,250,184,105,179,187, 92,186,126,221,197, 25,127, 12,213,217, 65, 42, 81,213,168,148,
- 51,113, 92,134, 93,187,140, 3,143, 42,167,127,167,253, 86, 30,177,164,255, 16,239, 71,185,151, 45,113,109, 51,221,155,247, 19,
- 8,230,158,219,177,229,180, 13, 59,147,161, 15, 4,176,200,127,189, 48,134,244, 69,115,253, 80,141, 73,252,105, 12,196, 35, 6,
- 79,156, 17, 64,138, 0,116,163, 70, 1,210,200,202,177, 13, 58,252, 86, 78, 98,213, 59, 39, 80, 41, 4,126, 37, 79, 3, 46, 65,
-202, 18, 47,228, 15,111,174,211,203,143,191,125,254,231,155,255,125,158,215,198,254, 10,157,141, 30,168,255,148,251,175, 99, 8,
-122,166,146,141, 29, 3, 95,217,148,139,122, 33,114,162, 29,157,160,130,214, 33,180, 27, 86, 37, 75,112, 20,172, 35,102, 4,113,
-143, 75,214,224, 10,136,134,153,187, 16, 71,102, 10, 41,194, 25, 5, 38, 40, 15, 46,107,228, 57, 71, 95, 16, 84,158, 25,215, 2,
- 47,182, 49,174, 63, 23,138, 60,141,145, 11,238,103,139,137,166,129,137,203,224,137, 15,204,126, 82, 13,213, 96,177,138, 6,194,
- 37,135,120, 36,141, 4,215, 81,112,245,178,206,249,127, 1, 72,186,154,222,168,145, 32,218,159,110,219,201, 36, 33, 98, 87,144,
-160,160, 93, 16, 66, 8,110,252, 17, 46,251, 95,247,180,135, 61,237, 79, 88, 36, 46,104,247, 0, 82, 96,102,226,113,183,171,187,
-221,188,103, 14, 57,141, 52,158,216, 93,175,234,185,170,222,179,127,124,120, 73,162,161,220,194,201,130, 83,235,232,147, 94, 39,
- 55,247, 43,146,194, 58,199,156,210,146,246,133,188,134,202, 91, 64,231,113,112,116, 3, 66,224,129, 91,140,150, 51, 57,142,160,
-149, 93,238, 89, 4, 87,145,153,107, 68,192,114,229, 37, 82,173,155,157,121, 59,173, 49,225,252, 35,140,182,247,215,197,231,137,
- 68, 28,177,134,191, 38, 50,129, 43, 32,251,234,239, 72,200,115, 57,247,219, 50, 61, 14,251, 32, 22,104,153,216,105,178,156,185,
- 20,234, 48, 88, 59,224, 25,142,248,124,245, 28, 75, 57,167, 89,184, 53, 33, 32,226,198, 21, 21,159,174,166, 13,221, 14,193, 21,
- 58, 4, 4,232,162,244,206, 83, 87, 61, 16, 95, 58,241,116, 84, 65,254,109,150,117,169,113,166,113,134,103, 0, 93, 74, 14, 36,
- 63, 63,228,185,178,251,222,115,196, 79, 34,158, 4,125,135, 43,126, 57, 42, 91,148,249,163,105,251, 30,152,228,185, 9, 79,219,
- 16,124, 72, 60,163,226,190,233, 88, 26,247, 26, 57, 64, 58,138,144,115,252,208,209, 36, 10, 23,231, 38,178,160,168,110,155,251,
- 59, 67, 55, 42,154,220,117,220, 70,100,190,156,106,206,129, 83,188, 32,217, 81, 78,224, 18, 92,169,137, 54,184,249,161, 10,178,
- 49,162, 57,172,178,128,104,196,111,155,253, 39,223, 88, 73, 71, 42,138,130,164, 76,115, 70,225, 74,130, 49, 14,192,110,189,182,
-178,196, 82,234,237,203,219, 87,251,245,235,241, 63,196,126,199, 86, 50, 98,195,113, 42, 6,105,180, 35, 60, 34, 10,105,147, 96,
-117, 15,158,199,158, 24,174, 16,112,175,245, 86,152,115, 43,128, 99, 56,172,175, 61,221,123, 56, 74,202,175, 9,155,168,159,227,
- 18, 70, 67,194,164,161, 18,253, 53,232,126, 12, 80,109, 67,139, 32, 44,128,253, 62,231, 77, 52,204,109, 2,192,138,254, 54,250,
-193,106,154, 76,115,123, 41,207,171,166,199, 51,147,207,166,247, 19, 27, 87,137, 19, 93,121,169,146, 95, 20,165, 46,169,175, 3,
-184,204,108, 20, 48,254, 36,117,236,217,211, 50,214, 85,196, 74,218, 92,183,106, 38, 7,215, 73, 64, 22, 51,125,193, 87, 26, 48,
- 57,153,140, 79, 90,151,161,214,200,196, 87, 51, 33, 56,225,234,192,126,179,204,157, 80,218,151, 62,162, 11,231,113, 27, 14, 56,
-130, 35,223, 43,189,167,144,255,151, 61,169, 63, 30, 93, 40, 62,140, 40,112,116, 26,168, 75,216,198, 33,141, 84,166, 29,113, 40,
-112,172,132,147, 84, 2, 66, 25, 52, 95,187,121,229, 11,149,140,217,115,196,163,203, 22,240,248, 80,248,206, 29,191, 74,184,210,
-193,251,193,153, 72,212, 43,102,235,111,105,142,247, 60,162, 66, 15,199,139,146,231, 92,205,229,182,211,139,111,251, 57, 78,147,
-204,102, 28, 75, 47, 44, 53, 14,234,120,173,174, 76,191,134,196,193,220, 1, 7,190,106,215,219, 75, 38,150,221,238,112,243,230,
-242,241,211,155, 79, 31,231,233,255,111,197,184, 8,148,159,193,111, 27,210,124, 8,230, 92, 23, 20,245,186,164,171,131,238, 71,
- 74,113, 74, 97,215,253,148,109, 63,132,254,120,250,248,239,231,253,124,247,244,249,251,223, 95,159, 43,125, 18, 90,233, 81,235,
-147,175,152, 24, 98,126,237, 46,252,245,245,217,227, 95, 31, 61,187,189,122,242,238,242,151,223,118, 79,238,118, 55, 23, 87,187,
-209,184, 76, 25, 36,201,225,104,234, 65,163,136, 6, 27,159, 99,162, 18,246,170,114, 2, 50, 41, 46,128, 22,160,102,139, 7,212,
- 12, 40, 83, 43, 30, 65, 1, 93,138, 28,104,195,185, 70,218,193, 45,192, 83,197,199, 54,208,119, 21, 20, 91,141,180,250,226,222,
-170, 98, 63, 29, 41,208, 20,158,138,109,110,118,107,226,180,230,168,243, 76, 82, 94,105,135,198,183, 9,168, 56, 19,125, 83,117,
-102,103, 17,100,218,247,200, 74,215,195,243, 23,111,255,250,180,251,243,239,127,198,187, 4,156, 6,119,149, 8, 68, 54, 78, 74,
-119, 65,167,116,170, 35,161, 58, 70,158,192,173, 91,218, 61,138, 49,156, 43,212,111, 14, 56,167,211,241,204, 6, 81,145,221,167,
- 3,208,165,128, 47,106, 17,148,250,200, 14,244, 88, 85, 94,197,131,229,246, 45, 85, 22,241, 79,224,104, 78,125, 61, 27, 80,223,
-110, 63, 3, 12,150, 92, 82, 47,107,168,192,214,211,196, 37,120,190,225, 51,172, 24,192, 7, 43, 78, 84, 75,150,210,112, 43,176,
-198,113,104,228,208,164,121, 84,227,134,236, 46,100, 11,164,207,200,220,197, 74, 93,238,165,253, 16,128,165, 43,217,145,163,136,
-130,149, 89,185,212, 50,238,217,220, 30,141,145,140,198, 22, 96, 14,246, 9, 16, 95,194,141,239,227, 39,184,115,231, 96, 9, 33,
- 64,128, 4,150,144,103,220,221,181,229, 78, 68,218,215,145,106,170, 43,151,120,241, 50,227,189,104,191,251,254,117,110, 17,148,
-222,231, 14, 43, 57,131,236,196,228,218,230, 65, 83,124, 5,156, 96,251, 88,141,191, 21, 53,226,245,105, 14, 42,174, 70, 31,230,
-153,221, 29,250,185, 48, 68, 34,140,210,247,167,106,220,170, 22, 23,224,173,144, 5,109, 25,193,201,133, 97,240,121, 9, 1, 65,
-225,152,102,236,251,251,213,136,139, 35, 50,235, 56,109, 66,135,149,115, 31, 93, 14,188,106, 3, 22,129, 15, 45, 31,220,170,211,
-140, 20, 10, 17, 48,103,222,176,176, 33, 51,243, 23, 30,145, 42, 86, 90, 74,133,241,100,113,145,149, 87, 45,105, 38,171,223, 59,
-150,179,165, 17,156,191, 27,229,104, 58,129, 25,193,108, 37, 30,210,203, 66, 20, 55,141, 30, 52,159, 2, 73, 28,176, 0,120,214,
- 26,175,145,123, 37,140,114,183, 99,241, 56,173,168,148,100, 27, 44, 60,189, 58,228,152, 65,187,150,159, 25,217,137, 12, 20, 19,
-248, 39, 23,131,196, 5,180,173, 67, 24,102,145,102,105,172, 28, 11,189,165,197, 0,160, 72,154,120, 39,232,160, 27,120,190,207,
- 30,193,153,190, 50,217,168,192, 59, 31, 65,223, 92,182,177, 6, 19,102, 85,196,125, 21,125, 83, 19, 95, 10, 83, 38,172,115,239,
- 2,251,115,234, 3, 66, 41, 50, 28,252, 80, 90, 16, 81,202,169, 18, 89, 32,224, 45, 32,105,117,158,118, 52, 57,232, 57,176,128,
-101, 41,113,232,212,217, 17,216, 19,167,153, 70, 40,248,236,105,137,231,251,203, 47,143,199,255,242,219,220, 87,171,129, 54,183,
- 90,116,165,114,170,170, 72,103, 17, 40,102, 48,138,246,170, 1, 54, 33,224,155, 71, 13,128,157,215,162, 67, 54,116,185, 70,144,
-161,170,217, 88,228, 4,236,189,200,250,170, 86, 0, 88,155,228, 36,237,173, 89, 79,203,106,163, 24,232,209,134,105, 76, 94,214,
- 70,207,113, 94, 17, 80,133,228,117, 46,219, 63, 69,124, 51,222,234, 89,208, 84,143, 83, 74, 77,163, 65,168,104,104,225, 88,150,
- 92,125, 7,121, 20,212, 82,180, 40,131,107, 35,198, 43, 91,177,104,210,240, 85,114, 25,108, 96, 58,108,208, 45,183,226,221,130,
-176,105, 54, 60,145, 41,214,162,239, 14,237,237, 51,144, 20,236,178, 73,211,150, 84,240, 11,213,150,136,127, 5,255, 1,235,150,
-213,101, 30, 83,130,240,134, 0,196,142,115,213,201, 90,178,177,213, 81,151, 3, 50,219,229,132, 23, 56, 9, 68,127, 68, 39, 29,
- 67,249,165,161, 81,146, 86,148, 44,203, 70,143,209,179,177, 12,173, 39, 34,207,108, 50,197,101, 98, 97, 10,136,136,131, 84, 74,
-139, 50,108,105,170,190,130, 76,126, 18, 25, 59,117, 19, 70,247,248,113,173,236,164,160,233, 12,128,158,122, 16,202,219,177, 15,
- 1,134, 99, 83,123, 21, 84,252, 74,226,163, 39,159,173, 81,114,168,100, 31,241,213, 26, 74, 42,131, 85,136,167,182,183,186, 47,
-227, 8, 6, 71, 30, 79,191,184, 6,220,103,126,124,183,123,126,119, 51, 29,186,183,239,254,145,219,105, 4,191,198,160,135,101,
-114,136,114, 30,172,206,211, 6,165, 43, 93, 88,129, 33,138,197, 6,241,136,205, 15, 96, 4,161, 90,223,252,253,230,167, 63, 79,
- 23, 87,223, 62,251,236,213,147, 79,190,184,188,126, 90,236,217,112,113,211,159, 63,217,239,159,237,239, 94,158,191,248,122,188,
-253,198,156,127, 37,221,167,191,255, 50,255,250,219,246,215, 31, 74,134,235,199, 47, 95,236,118,183, 87, 79,245,138,100, 73, 30,
-144,178,131, 10,117,253, 0, 6,232,104, 80,148, 57,251,115,216,214, 68, 43,168, 57,199, 57,178,190,163, 78,153,120,104,194, 67,
-114, 60,216,197, 88, 53,234,132,132, 66,115,213,238, 50,118, 94,243, 65, 22, 12, 30,139, 37, 24,232,162, 68,197,172,249,104,156,
-174,102,128,137, 8,150, 29,161,162,146,224,193,148, 67,144, 7, 87,153, 13,118, 63,249,131,162, 3,146,105,110, 63,191,249,119,
-125,254,195,143, 63,223,151,119,123,219, 55,136,219,128, 99,160, 38,149, 1, 60, 20, 97,145,171, 65,174,170,149,176, 96, 31, 54,
- 56, 48, 80,115, 57,132,152,172,199,150, 5,141,239,197,174,200, 51, 79, 41,240, 92,134, 11, 94,145,219, 65, 11,109, 16,146,237,
- 68,109,137,211,198, 83,222,232,173, 11,154,202,131, 13, 48,149, 66, 55, 69,106, 60,185,187, 60,205, 59, 3, 77,108, 17, 81,250,
- 93,155, 23,123, 98, 91,115, 95,207,111,153,126, 56,204,235,194, 50,149, 24,173, 9,200, 42,232,222, 1,124,174,162,154, 69,130,
-229,113,121, 17, 30, 90,188,236,127, 1, 72,186,154, 30,187,105, 40, 26,127,196,249,122, 31, 76,167, 48,180,176, 24,132,144, 96,
-209, 5, 8, 9,137, 21, 11, 86, 8,137, 45,255, 12,126, 11, 43, 54,237,174, 42,176, 64, 2, 81,132, 4, 26, 68, 81,251, 94, 94,
- 18,199,142,237,152,115,194, 15,120,147,196, 99,223,123,238,245,185,231, 96, 91, 39, 87,229, 6,105,114, 90,202,172, 55, 63, 33,
-126, 16, 7,185,122,196, 17,163,115,224,232, 29,128,164, 85,150, 40,173,226,213,135,119,117, 19,174, 22, 63,102, 67, 57,183, 54,
- 80,152,160, 75,117,192,209,161, 49,146, 73, 19, 75,132,180,244, 65,121,156,248,144,154,147,102, 16,156,202,179, 92,154,216,187,
-101, 30,246,197,232,197,195,209,143,139,222, 70, 28, 67, 85, 68,155, 86,108, 53,210,230,118,197,100,149,218,167, 57,109,227,221,
- 65,157,181,223,215,161,154, 83, 37, 56,180,203,203, 93, 41,187,138, 98,254,189,145,141, 33,173, 93,217, 66, 43,111,174,141,113,
-111, 32,146,142,106,190, 47, 12,229,107, 87, 94,152,237,241,155, 61,208, 82, 75, 93,128, 76, 71,194,136,231,170, 57,144,162,139,
-199, 11,124, 88,157, 87, 21,228, 72,219,101, 32, 45, 33, 3,234, 32,173, 12, 91,191,193, 83,130,184, 37, 25, 11, 79, 34, 87,133,
-158,241,133,155,145,237,105, 94,132, 26,185, 23,169,205,255, 19, 48, 10,206,154,146,149, 29, 12,192,196, 34,231, 84,180, 50,188,
-170, 75, 90,220, 52, 73, 5,230,114,250,119,162, 22,102, 19,102,187, 16, 53,106, 18,248,108,253,114,205, 26, 56, 75,209,203,146,
-146, 60,171,220,201,139, 29,108,174,151,121, 46, 61,163, 70, 20,245, 84, 76, 82, 13, 43, 41, 24,134, 29, 37, 78,142,232, 70,202,
-127,162,221, 45,189,195,119,229,186,214,129, 78,133, 8, 99,242,116, 9,244, 54,177, 5,233,172,222, 32,176, 34,219, 72, 43, 71,
- 68,135,150,221,187,128, 26, 50,106,195, 43,119,236,216,148, 38, 13,248,142,195,128,183, 45,134,132,108,136, 51,230, 40,154, 29,
-194, 72,130, 15, 82, 24,169,132, 13, 2,172, 38, 67, 26, 85,170,217,100, 17,200,222,146, 30,161,159,188, 52,234,250,152, 78, 35,
-243, 16,166, 33,112,208, 76,118,161,168,172,167,154,157,218,158, 66, 51, 20, 84, 41, 43,199, 85, 3, 22, 55,149,115,173,116,196,
- 82, 38,114, 11,116, 67,243,152,194,166,190, 72,157,222,180, 35,165, 28,173,220,107, 66,200,115,200, 28,147, 95, 35,105,253,202,
-121,122,234,106, 71, 25,108,132, 55,218, 80, 52, 65, 78, 52, 12, 65,249,168,105, 83,152, 67,175, 1,126, 29,118, 40,170,156, 57,
- 77, 40, 18,234,168, 28,234, 52,160,216, 98,169,133,176,137,141,159,127, 1,118,232, 36,142,195, 38,109,169,232,232, 75, 69, 51,
-156,196,171,146,110, 53,243,142, 14,197,189, 80, 93, 52,246, 26,239, 84,213, 3,192, 45,160, 18, 5, 60,129, 49,245, 97,229, 45,
- 70,149,250, 40,219,206, 0, 18,179,151,232, 86, 68,243,203, 78, 54, 62, 29,176, 90,123,222,181,146,163,144,104,248,133,244, 94,
-174,200,181,185, 11,233,101,166,167,123,163,232, 39,188,110,222,115,120,237,227,214,145,247,219,184, 2,167,156, 54, 1, 50,189,
-178,105, 66,105, 19,212,164, 23,209,117,165,199, 31,180,193,100, 44,136,158, 94, 12,205,238,183,155, 7,215, 95,126,253,222,241,
-241,189, 39,223, 61,189,155,239,194,195,195,235, 46, 11, 82, 42,115,181, 79, 76, 31,113, 80, 46, 30,112,142, 73, 1, 22,106,175,
-115, 23,243, 88,182,149,121,208,185,223,255,122,246,237, 55,191,118,111,221,126,246,225, 71, 95,125,254,201,253,155, 21,201,142,
-142,145,227,122,113,197, 47,223, 15,143,127,124,250,243, 15,207,254,232,255,182,214,158,235,179, 28,204, 85,170,110,223,126,247,
-253, 15,110,190,248,244,157, 71,143, 62,126,243,170,126,254,231,243,225,164,220,105,246,101, 83, 97,217, 1,228, 81,215, 23,217,
- 28,163,237,163,217,229,121, 34, 0, 63, 32,151,155, 21,123, 18,168,174,140,209, 77,121,153, 57,173,154,218,176,179,198,156,214,
-117,135, 45,166,147,116,164,144, 99, 45,200,121, 23,172, 20,207, 5,201,137,153,229, 80,180,155,106, 23,254, 3, 37, 97, 39, 18,
- 36,125, 37, 73, 42, 77,212,249,139,130,170,247, 66,220, 59, 30,187,171,219, 39, 63,217,115,184,187, 62, 52,169,165,254, 27,224,
-140, 1, 30, 19,168,184,203,241, 21,237, 35,101, 19,125, 97,210, 56,152,235,242,100,154,101, 65,225, 68, 13,236,112, 48,136,121,
-213,107,147,140,181, 31,229,178, 51,216, 66, 93, 64, 14,174,101, 16,135,189,114,226,112,137,254,168,124, 35, 61,135,185,163,178,
-186,156, 74,133,132,112, 14, 47, 0, 84, 16,158,144, 99,234,194, 69, 20,206,162, 5, 90,172, 40, 82, 61, 93, 98, 96,231,219,166,
-210,149,216, 13, 64,118, 61,133,254, 0,199, 44,109,132,236, 25, 37,244, 42,205,232,108,133,223,163,140, 46, 47, 41, 84, 43,105,
- 65, 36,143, 85, 90,254, 39, 0, 73, 87,179, 27, 73, 13, 6,221,118,187,221,238,206, 76,102,179, 73, 16, 43, 4, 28, 22,237,129,
- 60, 2, 28, 17, 60, 5,207,199, 3,112, 91,137,156,184, 32,126, 14, 72,104, 47, 8,177,226, 71, 90,133,201, 76,207,116,187,109,
-183,109,170, 58,167,220, 70,138,219,174,175,202,254,190,170, 58,205, 58,217,228,221,144, 23,163,164,119,245, 28, 38, 78, 38,128,
-113, 80,211,178, 44, 22, 54, 51,134,104,135, 46,111, 71,190,250,142,185,151,216,149, 23, 32, 71,193,250,209, 54,197,203,103,117,
- 87,166, 33, 14, 99,238,180,110, 24, 40,188, 31,211, 78,207, 23,218,204, 78,240,109, 91, 97,187, 62, 94,110,196, 67, 83, 32,147,
- 83, 10,226, 16, 53, 64,115, 39, 14,123,144, 52,224, 75,115, 64,137, 44,128, 10,201, 46, 31, 80,152, 45,150, 51,204, 40,117,153,
-150,209,236,251,246,124,168, 12, 59,153, 0,210,169,118,207, 32, 17,187, 93, 2,215, 75,132,157, 94,183,210,153,230, 66,185, 22,
- 75,218, 40, 27,113, 80, 79, 88,129, 74,217, 70, 7,148,132, 14,188, 7, 84, 10,122, 50, 48,198, 56,155,124,177, 44,215,168,155,
-180, 86,162,109, 31, 31, 47,151,154, 33, 44,107, 3,235,122,185, 66,127,159,193,182,125, 98,119,120,203,168, 94,192, 35, 68, 70,
- 88,131,157,193, 93, 13, 5, 2, 40, 97,204,178,171,155,204, 36, 8,126,159, 74,216, 20, 7,112, 68,203,113,253, 66, 15,117,165,
- 83,177, 28, 86,228,236,203,184,122, 30,182,180, 94,175, 7, 54, 65,129, 45, 66, 13,202, 62, 85,103,200,174,213,250, 16, 80,232,
-178, 31, 92, 96,159,160,211, 57,128, 87,120, 3, 45,155, 26, 32, 74, 24,128, 20,144, 54, 13,212,172, 42,158,133, 92,178, 35,150,
- 46,191, 32,126,224,140, 13,179,230, 35,232, 0,136,237,187,227,113,121,185, 43,251,203,249, 33, 86, 13,160,156,247,182, 14, 7,
- 88,114,155,244, 69, 56,205,152, 52,209, 41,208,206, 4, 78, 15, 69,138,149,223,208,156, 20,251,140,247,221,128,174, 78,181,158,
- 65, 33, 12, 95, 18,204,210,229, 41, 65, 61, 96, 38, 15, 25,153,164, 83, 27,127, 39,173,118, 24,192, 93, 96,175,159, 24,217, 70,
-141, 39,181,166,149,158,138,220,230,202,227, 16,204,140, 40, 2,153,155,113,202, 23,173,141,130, 68,165,199,192,127,158,173, 49,
-154,206, 3,153, 70, 3,156, 86,168,146, 21,167, 88, 24, 4, 42,167, 30,114, 60,247, 28,157, 54, 88, 19,240,178,121,167,204, 88,
-146,103,204, 34,192, 50,226,175,102, 94, 28,118,240, 42,139,233, 29,253, 24,128, 72,146,147, 60, 99,116,116, 52,225, 61,110, 6,
- 32, 15,139, 99, 83, 14,223, 3,210, 32,194, 73,120,253, 4, 1,162,121, 20, 5,116,184,165,155,206, 77,173, 39, 85,157,193, 96,
-172, 8,114,129, 14, 44,177, 49,198, 52,245, 60,213,236,245, 98,176, 83,167,169,124, 83, 72,183,165, 10,170, 15,229, 92, 51, 30,
-100,177,224, 77,150, 46,106, 20,153,203, 13,237,197,229,248,116, 71,185, 38, 72, 24,124,186,158,126,102,116,185,202,229,236, 84,
-175,184,128, 57, 71, 38,232,100,161,159,146, 45,214,151, 85,185,190,181,114,221,153,108, 39,102, 62,217, 3, 29,232,170, 25,182,
-114,220, 50,215,182,237, 24, 33, 54, 31,241,175, 88,213,156, 65,213,186,171,248,229, 23,175,238, 94,125,126,255,250,247, 95,222,
-190, 61, 60, 12,213,206,103,221,208, 14, 12,194,164, 22,131, 1,135, 71, 1,207,155, 89,230, 54, 78,149,112,117,161,211,180,172,
- 95, 92, 95,109,230,248,247,233,205, 55,175,223,220,223,191,223,117,215,238, 66, 13,251, 52, 29,247,113, 58, 78,167,253,212, 46,
- 91,211,118,207, 55, 47, 46,119, 31, 47,205,241, 38,185,152,254,114,127,252,246,227,207,223,126,127,251,217,221, 39, 95,127,245,
-225,203,143,238,134,254,221,191,242,207,122,154, 42,187,128, 90, 58,215,217,211, 82, 79,227, 56, 22, 63, 69,157, 50, 20,205,228,
-138, 59,196,122, 44,170,199, 57,163,183,108,117, 96,247, 85,101,101,212, 85,164, 11, 79, 88, 31,254,217,187, 64, 81,195,208, 29,
- 38, 4,176, 9, 82, 44,156,251, 20, 28,106,129, 82, 75, 16, 90,231,165, 26,249, 56, 47, 61, 93, 54,231,213,200, 8,223,138,222,
-149,189,184,250,244,131, 95,255,185,253,238,167, 31,120,147,134,223,155,133,116,242,244,158, 52,116, 30,150,160, 93, 28,251, 55,
- 64, 45,156,200, 37,108,217,123,204,224, 4,237, 51,168,177, 55, 99, 31,159, 63, 6, 99,182,113, 55,105, 11, 57,160,141, 94,103,
-215, 4, 51,106,135,243, 84, 25,101, 45,148, 87, 59,207,143,133, 21, 24,232,105,118,238,177,233,174, 41,152, 23, 95, 51, 70,190,
- 42, 10, 27, 41,129,112, 87,238, 24,148,105, 20, 13,168, 53, 42, 88,237,212,150,211,240,168,234,250, 20, 54, 30,128, 46,103, 57,
- 66, 96,123, 84, 94,149,250,246,148,130, 5, 97,196,206, 12, 28, 23,166,187,239,128, 3,149,203,255, 2,144,116,109, 43,114, 27,
- 81, 80,173,190, 74,154,213,172, 25, 59,236, 67, 8, 6, 99,112, 30, 18, 66, 48,248, 55, 12,249,209,252,130, 95,252, 15, 6, 39,
- 47,235, 60, 24,178, 27,207,234,214, 23,117,119,170,100, 88, 88,152,129, 65,211, 35,157, 83,117, 46, 85,242,253, 31,111,122, 51,
-129,149,198,201, 81,218, 9, 15,239,228,165,228, 47,235,187, 70,134,133, 88, 49,168, 99, 41, 91, 79,224, 21, 34, 53, 33, 1, 83,
- 0, 71, 2,230,128, 59, 89,154,207,176,202,176, 11,218,239, 85,101,216, 78,234,185,254,163, 30,242,208,208, 29, 46,205, 79,107,
- 31,168,170,252,232,151, 5,168,206,108,174,222,166,140, 12, 5,196,176,205, 27, 43,191, 34,100, 0,168, 80, 87,144,141,190,176,
- 72,147,242, 33,188, 15,222,189, 79, 86,159, 57, 51, 87,141, 43,248,206,170, 61,172,173,201, 56,228, 85,218, 60, 54,135,104,109,
- 29,113, 42, 23,112,191,164, 1, 84,163, 60, 13, 61, 14, 73,202,206,170, 30, 73, 50,171, 78,233,106, 89, 27, 62, 81, 50, 28, 8,
- 90, 32,198, 47,199,108,153, 62,224, 17, 46,132, 75,165,252,227, 44, 26, 80,222,202,198, 80,229, 16, 21,165,129,232, 3, 38, 1,
- 52,233, 95, 83, 78, 10, 95, 86, 83, 48, 46,115, 43,168,104, 54, 10, 40,248, 41,191,107,219,112, 96,166, 25, 56, 44,194, 41, 86,
-100, 17, 43,220, 49, 65,195,167,134, 47,178,177,152,128, 85,101, 94,107,222, 10, 85,148,130,200,251,188,221,120,185, 53,249, 42,
-163, 7, 75,221, 60,199,209, 42,215, 14, 54,173, 39, 60,228, 19, 82, 75,246,123,148,147, 74,131, 95, 86, 51,148, 9, 23, 82,150,
- 22,153,191,196, 68, 63, 8,196,131,111, 94,187, 73,248,145,226, 93, 96,106, 91, 42,239,126,254,225,102,123, 92, 0, 7,169,136,
-132,208,193,171,193,147, 60,113, 40, 29, 7, 70,103,209,214, 80,201,195, 30,243, 24,192,140,128,119,225,145,205,205,232, 82, 27,
- 89,106,183, 89,173, 20,109,210,188,255, 89,177, 2, 55, 18, 20,112,217,119,224, 95, 0, 81, 14, 27, 94, 35,237, 30,124,204, 87,
-132,118,177, 31,131, 40,114, 7,139, 4, 62,192, 81,177,209,210,108, 13,149,198,216, 22,162, 27, 99,182,185,181,123,153, 67, 93,
-232, 63, 92,102,118,124, 2, 98, 27, 48,234,127,109,221, 41, 58,130,124, 78,185, 79, 4,113, 36,130, 39, 4, 90, 21,151,182,128,
-147,114,214, 41,169,107,145,115, 72,145, 62,212,194,171, 52, 31,134, 93,169, 73,180,133,231,216, 84, 94,143, 29,209, 69,120, 74,
-144,132, 18, 10,112,253, 18, 40, 85,189, 34, 57, 71, 64,121, 60,110, 76,171,184,162,126,229,170, 66, 66,126, 6,201,187,213, 74,
- 3,243, 88,192,131,164,139, 86, 10,113,192,172,236,248, 32,244, 10,105, 41, 9,151, 84, 75,197, 88,214,125,141, 42,146,133, 2,
-220,211,192,241,197,144,216, 24, 28, 75,196, 61,168,143,119, 65,249,172, 54,188,233, 56,225, 56, 3,144,119,192, 96,136, 65,148,
-138, 24, 5, 87, 94,124,145,142, 47,130,213,152,122, 76,143, 82,215,130,189,107,238, 52, 33,251,179,244,207, 2, 3,117, 28,180,
-163,170,170, 3, 3, 0,183, 84,141, 29, 1, 33,232, 67,239, 4,215,122, 51, 3, 33, 45,213, 99,153, 69,187,220, 62,247,191,254,
-254,250,183,215, 63,197, 32,238,239,255,221,191,109, 46,225, 93,171, 17,202, 50,208, 34,229,188, 87,252, 51,184, 88, 5, 50, 58,
-120,186,210,103,205,126,219, 89, 58,243, 76, 69,196,160,245,225,169,254, 83,246, 7, 55, 60,117,231,230,114, 57, 93,158,191, 24,
- 47,174, 85,192,160,108,183, 84, 32, 61,167,111,207,114,236,250,144,202,253,151, 79, 31,255,254,250,245,179,186,251,241,229, 47,
-175,206,141, 65,234,142,135, 69, 26,229, 27,129, 41,217, 85,207, 58,122,170,222, 9,220, 27,133, 75, 24,100, 76, 87, 17, 17, 54,
-175, 84,130,236, 0, 97,168,109,138, 51, 42,120,247,251, 48, 92, 50,237, 33, 66,199, 74,150,162,221, 5, 87,159, 73, 71, 0,178,
-230, 66, 65, 35,240,236,208, 10,106,205, 85,122,170,179,223, 7,202,200,136,121,247,234, 70,221,189,253,243,195,151,191, 30, 62,
-155,179, 3,100, 67,134,136, 44, 6,113,151,183,239,216, 64, 14, 39,106, 46, 94, 59, 36,163, 98,185, 93,216,172,129,133,222,206,
-153,200,125,226, 21, 63,246,174,236,150,139,157,180, 65, 80, 63, 33, 43,216,136,160,211, 34, 65,141, 93, 17, 70, 3, 6, 58,224,
- 45,213, 82, 31,201, 89,100, 36, 16,237, 64, 35, 38, 97, 11,240, 33, 61,191,246,202,129,197,120,170,205, 52,224, 19,217,100,110,
- 6,169,119, 27, 91,106,104,135,200,225, 5,217, 5, 79,167, 1, 81,198, 77, 40, 2,225,164, 76,165,172,240,158,129,187, 90, 81,
- 22,105, 65,106, 34,216, 67,254, 95, 0,146,174, 92, 71,138, 24, 10,182,207,190,220,195, 2, 18, 2,145, 0, 1, 72,136,100,197,
-103,144,241,183,196, 4,100, 72, 16, 17, 18,112,105,145, 88,102,166,167,237,110, 95, 84, 53,217, 38,171,157, 29,219, 85,245,174,
-122,234,205,219,103, 37, 35, 14, 82, 61, 51,204, 51,168,220,215,139, 93, 57,210,121, 60, 72,125,134,178,193, 23,125, 6,243,120,
-196,249, 52, 75,173, 75,197,103,116,185,120, 13,169,189, 22, 26, 32,211,201, 9,231, 64,101,214,107,111, 82,228, 82, 99, 17,153,
- 77, 52,197, 39,168,111,135,183,185, 92,148, 95,153,200, 50,140,125,103,249, 71, 31,103, 21,221, 73,118,137,141, 7, 9,136, 12,
-221,178, 45,184,129, 37, 25, 90, 3, 6,110, 52, 98,163, 58,164, 56,164, 26, 19,134, 22,113, 49, 87,101, 65,151, 68,183, 41, 92,
- 65,192,234,163, 54,140,125,110,157, 96, 8, 45, 20,190,190, 78,220,183, 45, 96,118,192, 51, 20,238,160,184, 73,201, 72,117,144,
-166,213, 70,114, 30,207, 86, 64,125,105, 58,250,118,131, 57, 88,215,225, 98,161,141,221, 83, 96,247, 32,232, 72,175,109,214,204,
-198, 26,182,205,225,118,209,114,154,163,206, 43, 7,123, 26,142,132,172,244, 71,209,170,213, 29, 21, 46, 13,223,217,167, 71,240,
-150,116,240,101,151, 22,110,172, 81,172,144,208,248,146,140, 36,198,130,127,108,155, 21,107, 64,133,189, 51,218,147, 96,138,143,
- 17, 58,252,196,156,113,252,187,228,113, 41,183,220,205,193,105,255, 51, 45,122, 74,115,202,107,115, 97, 88,101,104,252,149,232,
- 16,126,206, 80, 89,162,205,156, 80,219,205, 73, 32,248, 84, 42, 61,141, 38,241, 78,113,235,131, 63, 90,238,227, 25,236,245,195,
-251,227,205,205, 41,122,196, 25,204,236,138, 66,113, 97,136,236, 45,101, 27, 69, 42, 24, 2,228,194, 22, 48, 7, 86,224,118, 65,
-102, 48, 71,220, 30,186,119, 66,124, 84, 40, 70,203,156, 38,157, 11,200,214, 36, 70, 16,147, 98,213, 45,149,154,153,138,158, 33,
-234,113, 47, 16, 31,200,141,165, 58,154,248, 2,208, 57,201,113,106,152, 3, 1,183,250, 8,189,145, 35,126,194,233,107,206,120,
- 31, 21,136,202, 47, 44, 98,111,180,240, 5,117, 42, 19, 24, 55, 37,193,168, 98, 93,232,233, 6,105,158,233,140,182,225, 65, 48,
-161, 14, 34, 88, 68, 10, 49,109, 0,134,221,123, 96, 3,115, 0,189,247, 95,196,217,205,186, 68,150,224,252,204, 81, 71,181,196,
-203,188, 91,194, 6,182, 67, 21, 47,146,111,206,171,236,189, 92, 16, 36, 29,101,184,228, 18,184, 16, 2,122, 39,142,218, 77,102,
-135, 74, 49,208, 39,180,210,198, 95, 1, 90,216,251, 56, 24, 38,223, 44, 48,109,101, 89,120,118,204,249, 73,182,137, 3,168, 18,
- 93,137,172,149, 8,213, 55,174,116,212,135,125,255, 18,142,124,208,208,150, 96,114, 73,243, 22,104, 42,208,178,116,130,146, 77,
-182,156,113,118,108, 25,216,183,126,179, 20,206, 20,176,181, 81,119,118,218, 45,255, 56, 12,190, 55,116, 67,244,119,146, 1,230,
- 48, 54, 67,215, 33,142,174, 19,141,151,105,112, 15, 92,239,133,190,226,210, 4, 59,200,193,236, 94,160,144, 37,108,177, 5,202,
- 65, 4,159,166,123,233,213,245,243,235,215, 47,197,212,253,254,241,253,120,252, 83, 67, 98, 63,144, 78, 45,167,196, 4,253,197,
-117, 5, 99,226,182, 89,118,205, 33,208,167,199,149,112, 26, 60, 39, 29,180,250,112,104,156,114,135, 56, 12, 45, 48,122,228, 68,
-209,124,235,192,132,245, 14, 91,131,184,156, 28,210, 5,239,119, 84, 7, 37,206,189,248,242,245,215,135,207, 63,135,112,247,217,
-147,199, 79, 31, 64, 22,196,149,117,102,112,157,224,200, 64,150,108,114,179, 42,104, 77,111, 81, 79,209,161,112,147, 85,102, 49,
- 25,239, 15,112,131, 8, 67, 89,150,186, 98,187,155,201,114,204,104,223,208,222, 52, 30,167,169,128, 71, 80,237,122, 46, 28,177,
-192,177,115,131,122,221,216,245, 83, 87,154,207, 20,113,182, 52,255,135,142,185, 59, 60,125,245,226,211,183,123,239,222,127,188,
- 26, 75,239,134, 2,228,160,159,157,221,123, 0, 44,180,204, 6,141,129,239, 16,218, 99,204,202,233,185, 5, 75, 90, 67, 83,233,
-166,111, 44,254,132, 13,221,190,164, 64, 77,255, 65,251, 96, 92, 51, 41,206,142,136,148, 71, 49, 85,206,195,239, 83, 49, 92, 82,
- 57, 78,138,117, 63,200,231, 45,235, 11, 71, 42, 57,220, 44, 99, 9,107,231, 67, 89,192, 63, 35,225, 26,247, 26,250, 13, 55,238,
- 82,111,215, 4,140,171, 56,138,208,118,129, 80, 15, 41, 11, 86, 1,235, 5, 27,214,118,173, 85, 45, 32, 80,197,109, 88, 43, 0,
- 9, 66,242, 6,248,143,232,240,159, 0, 36, 93,187,110, 20, 65, 16,156,217,121,236,251,206, 8, 11, 68, 6,194, 56, 32, 66, 4,
- 4,252, 3, 1,127,201, 87,240, 25, 68,200,152, 8,201, 22,182,239,246,246,118,231, 77,213, 18,222,157,100,107,103,103,186,171,
-123,170,171,212,215, 47,239,216,134,228, 52,123,164,129, 65, 21, 23,187, 80,214,134,158,206,235,124,183, 82,107, 4, 43, 46,236,
-210, 69, 61,213, 56,147, 75,197,194,212, 69,182, 4,232,191,134, 29, 23,216,252,176,142,140,103, 69, 42,168, 95, 60,118,188,116,
- 0,253,154,243, 35, 8, 55,138,170,228,108, 83,208, 30,132,196, 71, 29,128, 73, 43,143,224,103,179,246,143,198, 61,136,190,211,
- 97,112, 52, 97, 20,103, 32, 30,237,133, 29,228, 65,233,190, 65, 76, 68, 60,227,253, 56,254,219,211,148,240,126,187,222, 4,206,
- 76, 33, 6, 55,154, 77, 15,192,235,189, 80,118,108,108, 83,214,140, 83,209, 25,161,250,198,208,246, 25,136,139,204, 81, 64, 11,
- 68,247,178,147,113,176,236, 21, 96,213,121,105, 82, 41,242, 98, 2, 22, 48,114,202,137, 71, 16,143, 79,119,202, 53, 87,244,103,
-178,182, 65, 69, 65,205, 4,236,238, 74,119, 8, 40,210,238,145,112,232, 24,207, 43, 44,102,132,100,105,184,145, 17,214,105, 30,
- 79,196, 29, 20, 59,251, 42, 48,231, 8,106,218,109, 82, 91,188,115, 69, 72, 82,118,246, 60,172,153, 6,148,225, 36, 16, 21, 29,
-187, 35,154,154,193,164,139,234,188, 84,113, 29,231,199,178, 82,217, 85,217,182,242,193, 45, 13, 13,185,232, 98, 81,166,163,198,
-105,187,115, 20,187,193, 27,119,231,132,245, 71, 36,165, 15,100,164,204, 41, 57,236, 0, 81, 88, 75,141, 29,226,220, 48,188,125,
-117, 57,174,127,206,118, 18,137, 66, 29, 72,205,125, 75, 46, 39,117,155,168,166,154, 36,112, 31,162, 7, 86,207,146,224,146,167,
-232,176,116, 93,101, 99, 82,164,173,208, 69, 9,136,214, 22,169, 14, 20,159, 39,127,147,164,125, 10, 53, 38,178,186,162,164,229,
-113,113,248, 51, 43, 63, 21,167,242, 49, 39,195, 6,139, 56,150,212, 81,155, 70,224,231, 44,129, 71,144, 34,207,149,198,177, 14,
- 60,232, 57, 79,185,116,217,215,100, 92,228, 42,114, 80,213, 39, 60,253,162,163,150,233,124,244, 26, 27, 7,171, 71,223,128,205,
- 95,109,165,241, 41, 34, 72, 38, 13,165,146, 19,117,156,129,228,201, 8,115,164,211,121, 74,172,210,192,102, 58,120,106,186, 35,
-224,207, 84, 15, 71, 30, 5,174,143,129, 5, 74,156, 25, 43, 21,114,216,137,205,193,158,126,231,188,190, 4, 72, 48,185,233, 71,
-172, 15,175,120, 83,163,211,136,111,137, 33,240, 56,101,143,210,204, 59,131, 64,130,227,142,116,150,101,143,115, 84, 90, 23, 17,
- 79, 23, 68,123, 32,236,222,199,142, 21, 92,232,133,251,175, 3,105,100,155,107,217,241,118,112, 31, 73, 69, 99,199,133,156, 71,
-196, 42,213,237, 82,133, 2,207, 26,138,151,163, 94,160,155,137, 58,211, 99, 27,111, 94, 57, 83,154,146,176,114,156,252,151,197,
- 52,156,135, 82, 21, 99, 9,160, 71,196, 38, 24, 34,118, 55,234, 5,251, 76, 34,184,144, 40,215,151,166,147,180,207, 52,155, 54,
-115, 82,114,142,100, 66, 47, 7, 20, 80, 30,192, 88, 63,237,118,242,253,245,155,207,159, 62, 24,243,252,246,246,233,238,225,225,
-228,206, 59, 0, 53, 49,250,176, 88,193,146, 26,233, 34,224, 29,114, 61,182,169,134, 21, 63, 91, 90,168, 36,218, 29,168, 81, 85,
- 46, 76, 28,220, 77,130,109,223, 78,183,148, 11,210, 14,184,116,163, 85,109, 50,178,165,173, 7,147,245, 62,221,159,214, 31, 55,
-247, 63,127,133,139,254,245,213,245, 11,132, 48,148,205,121,142,155,184, 12,181,187, 37, 82,123,146,205, 76, 70,173, 17, 84, 94,
- 59,158, 10, 79, 23,160,138,163,168, 47,202,232,113, 95, 26,105, 37,111, 14, 55,221,104, 69,211,129,138,156, 66,178, 92,200,168,
- 65, 6, 93, 55, 6,146,192,241, 48,200,105,202,137, 16,216,221, 98,175,115,144,109, 39, 47,175, 94,158,186,143,223,190,223,252,
-245,191,205,112,129,215, 10,172, 92,232,233,182,169,238,146,233, 67,165, 13,142,204, 33,144,139, 58, 30, 19, 80,107,235,172,105,
- 28, 13, 0, 20,189,200,148,225, 40,223,200, 9,110, 59, 59,102,105,122,200,212,170,183, 66,234,110,199,107, 58, 26,204, 2,145,
-196,252,200, 98, 75,161,114, 56, 32, 59,215,203,133, 52, 75,110,168, 25, 13,124, 59,138,160, 55, 18, 38, 14, 47, 96,147,199,126,
- 99,219,113,221,188,186, 34, 13,156, 81,204, 59,242,206, 53, 21,123,163,247, 3, 2, 75, 20, 56, 0, 97,226, 60, 58,170,199,152,
-102,228, 7, 81, 63, 36,206, 62,107,253, 79, 0,142,206,102,199,114, 26,136,194,137, 99,199,206,237,155, 75, 55,221,179,128, 97,
- 57, 35,196,108,144,120, 8, 36, 94,128, 13,239,202,130,229,136, 13,107, 22, 8,137, 13, 51, 35,186,231,254, 36,142,157,216,156,
- 47,251,238,200, 55,169,159,115,202, 85,167,186,159,127,121,215, 40, 31,153,219,217,177, 25,198,220,148,180,135,185, 82, 67, 45,
-139, 64, 73,149,229,201,193, 94,154,107,106,197,240,187, 40, 52,143, 6, 94,242, 74,163, 13, 82, 56,150, 86,121, 75, 15, 70,184,
- 40,204,196,103, 74, 35,195,226,134, 60,164, 84,194,166,192, 99, 22,119,125, 62, 40,124,234,121,206,198, 57, 77,219,167,120,105,
- 87,215,197, 58,103, 90, 34,186,102,102,177, 17, 67,229,172,171, 23, 56, 95,105,135,211,201, 98,254,184,180,206,217, 74,251,137,
- 17, 45,239,220,120, 96,126, 84,230, 43, 2,231, 71, 51,122, 69,156,169, 58, 25,250,170,119,154, 13, 55,168,199,241, 30,217,117,
-156,209,160,166,165,247,221, 7,125, 0,180, 3, 44,227,107, 27,255,229,149,234, 43,155,246,154, 92, 79,126,163,204,176,119,133,
- 32, 4,211,161,124,178,246,189, 85,252, 87,124,101, 32, 7,246,172, 15,194,186, 19, 46,220,104,110,139, 66,230,114, 73,172,136,
-230,252,108, 99,227, 16, 89,215, 67,178, 49, 17,137,106,186, 65,113, 68,182, 35,161,107,178,239, 15,222,124,111,183, 40,103, 73,
-180, 38,174,136,182,204, 10,150, 81,177,124,137, 75, 81, 32, 44,113,251,204,187,153,215,115,206,140, 3, 0, 10,207,125,187,156,
-170,146,117,140,172,243, 97, 54,106,166, 75,187, 8, 44,187, 22,238, 78,227, 13,192, 69,120, 1,176,172,240, 62,152,249,122,218,
-238,103,247, 60,217,183, 79,135,175,182,143,179,141,130,121, 58,168, 17, 42, 56,208, 5,227, 95, 41,241, 90,241,239,100, 29,189,
-165, 74,165, 12, 0,148, 24,246,158,108, 36,182, 45, 42,104,122,246,190, 37,175,206,212,149,244,131,210,146,154, 93,149, 32, 35,
- 78,164, 48,107,203,141, 9, 96,249, 26,131,196, 10,245,133, 92,149,196,205, 4,135, 99, 6, 44, 11, 75, 43,253,228,114,187, 99,
- 92, 44, 71, 54,198,181,226,170,161,108, 76,242, 50, 85,209,204,108,151, 92, 39,154,145, 54,134, 72,217,106,152, 46,156, 56,237,
-253, 76,134,245,216, 10, 45,109,125,161, 16,177,138,133, 71,249,125,214,171, 90, 82, 66, 14,168, 64,107,148, 72,155,207,194,116,
-203, 75,108,236, 96,211,165,108,147, 24,221,190,133, 73,121, 54,213,120,221, 53, 24,216,115, 34, 14,224,230,100,141,210,241, 69,
- 84,174,207,202,167, 67, 19,142,138,252, 54,132,170,112, 80,157,167,234,237,100, 85, 8,141, 58, 43,235, 82,204,115, 71,111,183,
-208,103,239, 81,251, 66,225,187, 25,160, 49,250, 35,202, 68, 92, 71, 12,221,169,214,113,231,147, 15,117, 29,250,109, 83, 96,242,
-138,227,198,119,237, 72,154,239,167,224, 28,203, 31,234, 62, 65, 95,134,129,193, 12,170,157, 45, 74,251,226,162, 69,135,218,185,
-236,138,117,210,127, 4,133,220,149, 35, 17,120, 31, 58,185,203, 23,163, 17, 47,111, 30,117, 66, 5, 65, 90,128, 21, 47,242,157,
-227,247,245,117, 63,116,177,119, 70, 56,214,204,204,231, 35, 98, 65,227,214,217,143,221,219,111,191,254,241,167,239,191,121,248,
-242,250, 33,254,253,225,223, 73,102, 39, 88, 39, 54, 38,134,231, 5,106,243, 48,245,163,147,173,138,246,150,133,148, 36,247,112,
-202, 72,113,230, 34,155, 81, 47,196, 21, 80, 96,170,194,114,178,173,126,141, 1, 89, 98, 49, 7, 87, 83, 41,197, 94,156,139,190,
-211,105,142,211, 95,159,254,121,255,254, 99,124, 30,223,125,247,230,245,235,187,229,252,194,252,180,111,182,155, 71,155,159,205,
- 14, 30,193, 69,130,140,156,149,123, 26,182, 64,140,198,190, 82,242, 15,135,167,134,125,134,123,105,152,237,232, 12, 0, 89,100,
-137, 20,102,216,218,146,216,123, 33,210, 87, 89,148, 8,194,189,238,130,110, 16, 54,171,120,213, 30,195,211,195,227,253,155, 31,
-126,253,237,191,223,255,252,227,248,200,229,180, 16,107,107,105,120,226,186,114, 80,208,245,135,165,174, 2,169,178, 1, 69,160,
-224,142,215,205,159,186, 20, 14, 53, 20,202, 21,125, 24, 87, 83,118,149, 60, 65,192,243,233,174,139, 19, 34,123, 22, 97, 79, 87,
-246, 2,178,149, 3,137,111,200, 4,194, 76,103,119,180,140,217,244, 76, 50,137, 9,121, 65,147, 57, 51,156,177, 23,150, 10,107,
-169,232, 30, 42, 13,250,249,203, 18,233,224, 17, 46,172,220, 14, 97, 44, 89,246, 17,110,249, 86,228,242, 73, 36,152,202, 91,110,
-245, 37,169, 15,246,192,148,169, 91,209,226,173,135,101, 75,255, 11, 64,210,149,228,184,113, 4,193,218,151,230, 52,103, 32, 91,
- 16,180, 24, 2,102,110,190,232, 1, 6,116, 20,160,247,234, 21, 58,250,102,248,102, 65,208, 69,203, 64,100,111,213,181, 57,162,
-117,228,128, 67, 54,171,171, 50, 35,178, 51, 35,244,187,247, 15,243, 94,103,132,180,137,230,202, 75, 74,217, 36, 28,165, 66,124,
- 95,212, 8,168,237,212,101, 58,203,243,176,122,128,144,125, 91,131, 33,147,178, 78,172,116, 23,195,187, 8,127,134, 38, 47, 77,
- 1,250, 71,223, 40,119,131,253, 20,167,217, 78,248,140,213, 39,108, 91,128,126,151,214,105, 9,192,238,195,198,185, 28,179, 32,
- 49, 32,198,117,119,184, 54,178,139, 15,108, 29, 41, 27, 72,132,206,154,162, 12, 64, 92,250,169,176,118, 96, 83, 51,205,172, 52,
- 13, 69,131, 27,246,222,218,201,135,104,217, 12,225, 54,223,220,137,131,115,183, 22,127, 4,102,240,222,104, 10, 57, 14,129,179,
- 13, 94,223,176, 87, 24,135,209, 0,234, 90, 86,250,245,147,128,159, 76,113, 33, 79, 33, 20, 4, 50,122, 79,101, 10,139,179,194,
-140,176,225, 29,101,173,113, 37, 26, 8,145, 22, 50,108, 21,225,190, 97, 29,199,217,177,118,196,114,186,137, 96,189,212, 49,174,
- 4,244,166, 17, 23,193, 41, 53, 37,204,113,119, 41, 97,134,100,133,108,160, 56,251, 99,129,201, 1,215,232,195, 19,250,204, 9,
-159,106,105,186,162,151,218,102,128,101,132,227,152,127, 56,100,103, 62,214, 49, 36, 20,166, 46,200, 78,227, 70, 25,149,117,249,
-113,245,101,150, 19, 88, 79,145, 6,219,130,158,166, 28, 48,218, 64,142,166, 43,155,158,118,189, 96, 63, 6,153,177, 24,248, 79,
- 65, 29,208, 60,115, 62, 46,206,226,218,213,171,123,249,192, 96, 71,169, 0, 48, 81,103,228, 8, 28, 22,187, 26,155, 70,100, 2,
- 3, 80,212, 53, 85, 56, 59,156, 12, 18, 6,107, 93,101,170,249,232,178, 72,200,206, 88, 38, 44, 57,101,158,173,214,107,167, 26,
-253, 89,179, 9, 23,100,201,229,178,182,202,198, 51, 89,127, 82, 36,184,210,181,155,218,196, 59,126,101,225, 83,194,163, 7, 82,
-128, 39,226,188,203,235,190, 81,150,156,226,156,184, 19,253,130,211,193,226,120, 3, 63,108,148,220,100,167,110,106,121,167, 70,
- 36, 21, 55, 54, 81, 43,187,161, 55,105,196, 68, 75,248, 76,239, 36, 65,147, 97,224,231,239, 28,112,145,224,225,186,167,201,224,
-147, 65,172, 75,146,171, 85,128, 56,129, 86,123,212,242,194,121, 77, 59, 22, 80,103,132,169,204, 89, 64, 36,141,105,145,121, 49,
- 49,249,147,115,192,194, 32,222,225,142, 6,223,184,209,202,105,202, 25, 43, 58,106,212, 49,176,240, 8,244, 4, 30, 14,244,109,
-143,137,164,161,247,129,252,215, 82,245, 59, 47, 56, 98,103,203,250, 27,181,109, 92,212, 8,141,162, 69,107,111,172, 56,215, 37,
-210,248, 10,161,188, 86,175, 6,173, 2,200,179,106,183,221, 42, 14,188,222,130, 17,121, 29,192, 77,249, 12, 71, 30,224,179,128,
-188,114,230, 62,240, 13,136,242, 78, 31,118,236, 22,136,151,151,101,162,226, 64,159,151, 34, 52,141,236,202, 89, 59,131, 8,223,
-124, 11,136, 57, 55,135,228, 55,104,110, 81, 6,104,180, 18,222,136, 70, 81, 38,146,206, 80,232, 96,215,151,250,248, 88,202, 99,
- 19,223,141,203, 47, 94, 63,251,235,237,155, 63, 94,190,116,118,190, 92,190, 21,176,180,209,223,177,174, 91,231,150,177, 97,231,
- 74, 83, 69, 36,144, 12,220,102,132,190,161,173, 56, 82, 31,190,128,194,223,234, 4,172,207,211,162,246,182, 2, 69,172,148, 18,
-218,104,156,116,213, 96,178,155, 59,113,188,249,206, 69, 31,253, 87,241,248,239, 63,159,191,252,135, 40,242,252,207,251, 39, 0,
-102,233, 43,101,135, 83,100, 91, 4,118,153,190, 22,100,165,194,133,232,171, 87, 32,113, 0, 88, 3,226,179,179, 62,130, 71, 27,
- 57, 81,150,132,155,149,150, 2,189,177,224, 39, 40,143,184, 54, 92, 30,203,247, 52,145,233,117,165,143, 37, 80, 29,229,196, 71,
- 86, 3,204,160, 94, 63,220,127,186, 62,255,240,241,239,203, 29,189,172,109, 45, 0,166, 32,171,121,148,177,114,218,159, 91,215,
-171, 93, 24, 36,144,184,111, 32,206, 72, 11,226,183,194,106, 0, 80,116,100,205,246, 20, 51,173, 60, 9, 30,129,152,195,239, 56,
- 78, 35,159,221, 26,141,168,229,244,224,156,207, 88, 42,188, 10, 37, 32, 89,142, 38, 28, 90, 56,224,194,182, 55, 42,252, 13,251,
-173, 48, 11, 72, 98, 70,250, 46, 8,176, 84,204,150,184,151,117,195, 81,114,219,254,203, 66, 30,233, 19, 8,175, 46, 96, 93, 62,
- 41,249,147, 79,124,133,197,157,206,154,113, 43,146,142,149,164,157, 94, 47,201, 85,109,229,186, 0,171,252, 47, 0, 73, 87,215,
- 35, 55, 17, 4, 61,223, 51, 30,239, 94, 54, 4,161, 4, 17,164,132, 8,137, 39,196, 79, 65,252, 78,254, 6,239,240, 10, 18, 2,
-164, 40, 10,218,187,141,237,181, 61, 51,158,161,202,188,157,180, 39,173,189,238,233,174,110, 87, 87,169, 31,127,250,198, 60,214,
- 0,168,149,103, 73,214, 50,205, 17, 76, 65,146, 70,229,234, 76, 81,159, 16, 83,211,237,214, 18,206, 36,247, 81,218,214, 7,199,
- 37, 50, 30, 61,154,175, 5,190,144,195,233,236,235,138,216, 91, 43, 14,186, 51,199, 58,143, 22,232,167, 87,228,133, 74,184, 36,
-202,134, 11,164,108,248, 78,252,229,237, 54,163,204,213,254,182, 0,172, 77,129,212,111, 47, 72, 28,224, 62, 46,128,107, 58,136,
-141, 66, 47,254,112,145, 7, 90,232,171, 99,142,110,136, 35, 82, 74, 29, 55,245,202,201,134, 24,207, 50,116,174, 19, 23,165, 67,
-238, 57, 51,241,189, 50, 36,105,139,160,241, 75, 33,181,247, 8, 25,181,227, 52,184,103,186,144, 52,207,174, 88, 56, 82,227,217,
-230, 90,252, 15,144, 82,230,219, 23,196,114, 90,154, 69, 41, 69, 86,222,105,149,167,181,158, 41,177,219, 12, 85, 7, 45,215,118,
- 72,213,231,120, 24, 87, 59, 54,244, 20, 92, 1, 74,135, 47,162, 59,166, 52, 37,114,147,135, 84, 67, 92,165,160,245, 39, 81, 69,
- 71, 2, 16,213, 12, 58, 0, 20,106, 32,161,191,155,201,120,104, 75, 1,246,101, 90, 68,169,211,162,142, 25, 93,207,125,169, 40,
-198,228, 90,233,146, 12,213, 3, 76,215,171,101,202,233,182, 51,108,235, 66, 61, 4, 53,145,254,135,108,183,115,198,138,128,216,
- 18,238,119, 89,205,156, 23, 79,131, 99,185,114,153,252, 19,141,233,196,187, 87,254,219,110,191,187,201,158,248,182, 73,156,173,
-142,226, 16,105, 71,194, 69, 52, 83,152,156, 70,235,137,202,103,137,221,159,246, 40, 94,200, 35,200, 52, 89,167, 71,178, 98,168,
-217,152, 72, 69, 35,149,175,113,239,169,187, 21,117, 3,112,238,238,179, 33,148,195, 13,109,220,197,167,231, 14, 96, 23,229, 15,
- 36, 96,242,138,172, 52,115,234,189,149,196,201,227, 78, 91, 29, 52, 65,211,212,197, 81, 0, 89, 83, 69,152,212,229,182,172,123,
- 66,116,108, 37, 19,248,181,252,212,153,185,208,236,232, 80,123,236, 14,253, 47,206,239, 38, 96,180,189, 92,209,119, 8,117,104,
- 81,206,165,187, 23, 28,131,198, 13,195, 6,196,192, 49, 17, 95,169,177, 69, 66, 66,180, 1,217,193,113, 35,122, 29,107,220, 84,
-153, 57, 43, 90,241,192, 2, 85, 72, 26,223,173, 41,209,203, 22, 41, 50,161,188,194,247,216, 33, 80,231, 47,118, 3, 62, 5, 72,
-178,232,110, 41,152,214, 34,243,164, 91, 43,170,186,184, 15, 61, 14, 78, 67,140,163, 49, 83, 1,145,240,160, 34, 23,118, 55, 46,
-237,227, 42, 23,171,165, 67,151,168, 80,231,159,155,139,108,210, 85,196,106, 47,100,236,209,231, 35,133,180, 96,245,233, 34,241,
- 8,200, 31, 27,252, 89,225,244,107,125, 6, 72, 45,195,169,126,225,211,154, 37,138,180,181, 92,105,192,207,238, 14, 55,129,207,
- 70,238, 82, 57,131, 42,160,184,202,215,203,129, 52, 1, 62, 52, 10,137,161,237, 70, 91,209,255,191, 40, 99,232,136,123, 80, 31,
- 5, 95,143, 23, 18, 51,169,207, 3,176,113,173,183,177,102,228,203,143,202, 63,189,252,242,245,247, 63,188,125,243,250,213,150,
-218,159, 31,222,255,251, 55, 77,165, 80,154,206,145, 19, 58, 81,213,184, 0, 21, 21, 4,135,152,140, 55, 81,212,181, 80,154,129,
- 43,201,229, 9,125, 24,109,228,244,206, 77,243,157,174,159,201, 19,191,133, 67,208, 71, 28,108,166,251, 37,181, 1, 64, 57,202,
-127,174,239,127,251,245, 26,235,231,111,222,125,245,240,124,206,219, 53, 63, 2,213,234,118, 78, 72, 64,149,182, 18, 21, 13,173,
-226,128,134,133, 67, 60, 52,215, 83, 63,203, 5,190,179,145,145,246, 98,133,174, 33, 20, 55,203,148,173, 73,137, 10, 38,173,140,
- 18,248, 97,254,192, 15, 54,195,251, 30,171,227, 28, 44,148,175,223,190, 44, 47,190,251,249,151,191,126,127,252, 67,191, 8,253,
- 68,159,197,123,116, 20,188,203, 22,137,126, 25,140,245, 1, 33, 72,237,166,221, 13, 46,156, 99,216, 78,157, 92, 75, 64,220,102,
-103, 41, 95, 91,240, 7,218, 51,167, 45, 71, 1,178, 13, 78, 6, 52, 72,165,158,124, 52,104, 50, 36,160,194,179,125, 27,144,133,
-170,207, 72, 42, 39, 60, 83,187, 32, 61, 0,254, 93, 28, 71,182,172,177,146,118, 79,235, 66,141,116, 81,187,101,158,203,116,165,
-181, 49, 15,196,186,122, 52,163, 20, 49,199,181,169,112,219,199, 59,208, 45,238,223,242,144,237, 91, 46,171, 1,146,161,189,102,
-162, 92, 71,247,145,238,212,147,226,232, 34,253, 39, 0, 73,215,182, 27,183, 13, 5, 41,222, 41,201,181,235, 20, 70, 81,180, 72,
-242, 16, 20, 5, 10,180, 64,251, 5,249,132,124,100,126, 33, 95,145,135, 2,125,203,115,128,160, 13,106,239,234, 70,145, 20,217,
- 25, 25,126,179, 23,235, 93,137, 60,103, 70,156, 51,163,222,190,123, 29, 75,211,161, 48,217, 80,150,174,111,116, 73,101, 8,103,
-221, 77, 93,211,142, 45,230, 1, 71,109, 48, 33, 99,171,229, 72,227,228, 14,108,116,217,221, 1, 14,192, 83,212,198,136,249, 72,
-187,219,206,226,107, 89, 93,114,216, 50,213,212, 64, 97, 50,248, 28, 19,250,208, 46,175, 70,114,144, 7,208, 87, 92,115, 91,177,
- 91, 44,101, 39, 81, 59,160, 50,144,116,208,247,137, 81, 32,146, 19,109, 6, 24,129, 96,173,120,109,149,236,123,195,153,201, 71,
-115, 4, 73,247,100, 1, 54,171,194,156,228, 80,121,152,234,228, 77,227, 51,111,138,206, 15,187,187, 29,200,221,122,227,253,136,
-237, 83, 57,155,165,209,205, 45,159,141, 97,127,105,143,150,140,206,193,217, 38,142, 70, 68, 9, 42,129, 27, 43,167,156, 26,157,
- 93, 25,173,133,165,154, 2, 48,126,197,189,150, 52,167,115,119,212, 19, 54,158,118,161, 48,115,190, 29,251, 2, 11,120,192, 26,
-227,216,185,164, 24,118, 38, 44, 70,217,180, 28, 4, 83,129, 89,186, 76,160,103,220, 56, 35, 38,228,115,200, 26,112, 66,246, 12,
- 35, 64, 3, 88, 40, 22,231, 76,194, 0,120, 0,102,181, 4,236, 87,106,175,155,194,141, 20, 17,197,109, 95,214, 45,170,109,205,
-123,190,128,147, 41,103, 55,121,160,198,104,177, 2, 1,236, 25, 21, 76,158,158,233,123, 6,148, 46,116,136, 49,104, 76,224,223,
-224,130, 40,210, 13, 29, 42,179,223,214, 31, 95,220,252,122,183, 94,210,172, 26, 9, 7,170, 11,149,189,140,136,236,196,136,101,
- 76,165, 96,237,165, 92, 27,181,102,174, 28, 0,154, 81,230,141, 60, 57, 13,156,218,103,130, 37, 48, 83,212,221,130,247,231,131,
-213,124, 5,154, 55,232,136, 51, 22,215, 23,194,188,101,106,201,156,134,190, 69,196,204,136,219, 12, 52, 77,203, 69,225,128,208,
- 39, 0, 62, 92, 49, 86,255,231, 23,112,120, 99,107,255,132,212, 47, 18, 23,105,197,223,112,201,175,226,120,210,252, 70, 27,141,
- 68, 40, 64, 93,207,168,213, 5, 77, 85, 22,144, 31,202,231, 52, 81,240,225,208,213, 87, 78,161,235,184, 43, 67,131, 76,194,161,
- 90,168,200,172,180,236,164, 82, 77, 63,219,198,214,250,117,105,107,230,217, 91,212, 45,143,168, 31, 60, 45,117,157, 1,115, 42,
- 86,154, 91, 54,168, 62,227, 23, 6,107, 79, 8,117, 27, 64, 31,246,107, 10,170,151, 93, 8, 62, 74,139, 75, 52,130,172, 41,203,
- 44, 41, 38,167,131, 15,228,111,129, 19,136,146, 29,179,143,213,164, 43,157, 50,122,165, 80,223,216, 41,132, 27, 89, 76,253, 25,
-195,100,233, 19, 22,178, 82,138, 42, 60, 20, 76, 39, 70, 5, 94,217, 56,167,164, 80,187,111,198,142, 42, 83,186, 20,112,194,108,
- 5, 94, 2, 16,244,148,247,146, 78,122,218, 26,248,129,147, 25,104,238,187,193,122,181,248,137, 28,208,172, 75,166, 76,169,153,
- 78,127, 67, 23, 9,160,125, 0, 94,186,217, 4,234, 8,169, 31, 48,148,108,160,230,181,238,124, 42,143,130,197,105,124,186,111,
-212,122, 41,243,211, 33, 46, 90,253,119,255,240,234,247, 63,127,254,237,151,151,229,169,253,187,127,190, 60,174,141, 70,215,206,
-164,106,120,124,117,102,219,108,201,251,150,209,120,179,188,142,252,148,179,236, 60,202,199, 92,231,206,146, 47,233, 82,124,117,
-215,148, 44,143, 14, 12,201, 6,254,147,206, 84,210,118, 6, 52,104, 68,197,159,254,254,244,229,235,231,225,205,171,215, 15,223,
-167,199,109, 71,117,182,153,143,159, 14,158,207,213,179, 69, 83,198,201,163, 45, 74,189,141,244, 12, 41, 40, 43, 64,135,203,244,
-187, 38,194, 65, 5, 65,123,207, 11,199,163,208,157,211, 68,189,113, 93,218,113, 47, 76, 54, 21, 69,249, 78,135, 59,245,240,211,
-119,238,135, 63,222,127, 88, 62,126,250, 11,205,218,163,173,246,104,176, 99,113,196,227, 29, 32,228, 40,209,132,154, 55,124,210,
-207,188,157, 6,254,156,250, 73,173,245,120,178,221,125,174,183,248,124,128,240,194,246, 46,120, 58, 7, 25, 52, 85,223,182,166,
- 43, 24, 47, 74,147,150,179, 59,202, 32, 6, 53,225,243, 99, 9,156,246,113,120, 91,121, 28,218, 50, 76,103, 89, 43, 22,220,210,
- 42,227,141, 91,218, 0,142,129, 51, 85,205, 97,160,133,147, 96,176,161,223,227,120,134, 7,179, 43,199,234, 64, 98, 14,218,137,
-154, 51, 52,126,139, 77,244,109,195,142,220, 40,103,151,220, 21,128,102, 83, 41,103, 56, 64,219,211,255, 2,144,116, 37, 59,142,
- 20, 81, 48,247,165, 22,219, 51, 64,163, 57, 64, 75,112, 4, 46,220,248, 7,110,252, 40, 31,194, 13, 9, 9, 78, 92, 70,163,153,
-129,161,151,114, 85,102, 85, 46, 68,184,111,125,112, 91, 46, 59, 51, 94,188, 45, 66,255,242,243, 55, 7, 40,115, 25,122, 45,201,
-227,202,148,252, 94, 81,137,167, 41, 46,138,226, 45, 43,141,192,151,119,180,173,148, 55,151, 82, 3,132, 1,242, 30,135, 7,158,
-225,160,130, 22, 76,135, 3,109, 7, 25, 29, 87,171,210,114,157, 17, 61,106,246, 17,100,112, 9,184,231,228, 13, 35, 80, 94,246,
- 1, 56,160,118, 58, 17,128,236,104, 54,225,151, 50, 36,253, 96,205, 42,148, 7, 5, 14, 61, 36, 39, 15,249,202,225, 57,169,169,
- 18, 89,202, 70, 80, 69, 78,197, 26,159,230,206, 81, 13, 89, 69, 6,128, 54,227, 70,117, 13, 52, 41, 56,182, 83,115,178,182, 33,
-186, 50,141,202,214,160,130,158,193, 76,124, 28,128,115, 32, 44, 96,163,212,160,195, 21, 80, 6, 79,198, 31,142,232,123,222,173,
-201, 20,226, 7, 24,218,155,236,195,139,192, 62, 93, 96,114,185,102, 9, 2, 57, 39,174, 28,114,238,103,111, 52, 3,245, 55,255,
-103,245, 50,243,196,206,181, 66, 22,102,228,104,120,134,241, 14,246,249,120, 6, 9,158,164,204, 61, 2,157, 88, 47, 18,233, 54,
- 61,137,196, 89, 81,182,178,111,187,216, 72,194,105,152,189,116,176,250,140,179,153,104,104,143, 96,158, 82,123,104,242, 54, 57,
-134,200,220,232,125,188,246, 26, 0,239, 36,184,101, 93,241, 33,174, 93,174, 7, 77,179,249, 83,201, 70, 55,144,222, 79, 82,115,
- 73,186, 5, 64, 72,211,199, 99,181, 25,220,171,179, 23,212,244,249,205,248,195,235,125, 5, 65,208, 0, 34,192,147, 28,103,138,
-211,155,118, 19,249,218,184,143, 69,133,137, 70,221, 66,197, 46, 40,181, 10, 55,203, 25,118,119,170,229,153, 67, 17,200,116,105,
-127, 70, 67, 43, 54,133, 26,203, 58, 71, 91,139,216, 11,174, 92,246, 28,235,233, 8,129,143,172, 11,225,173,194, 70,237, 47, 41,
-244, 2, 6,197,166, 5,105, 10,135,138,175,236,119,244,205,128,160,105,252, 1,222,186, 32, 35, 17, 44,113,176,162,213,113, 97,
-248,194, 12,146,194,241, 8,245,216,212,213,109, 20, 62, 19,200, 81,109,146, 10,231,240, 95, 81,234,109, 81,156,170, 79,130, 62,
-127, 8, 24,158,137, 11, 46,246, 82,169,188, 7, 40,218, 39, 32, 68,167, 4, 70, 39, 18, 29,156,167, 2,158, 3,213, 60, 24,173,
- 56,181,151, 81,104,228,183, 22,233, 24, 24,126, 84, 45, 2,158,219, 0, 22,114, 6, 75,163,105, 4,245, 6, 44, 59,143, 60,134,
- 54, 38,238,250, 90,170,108,129,153,227,201,220,232,104,145,102,174, 56, 87,166,131,141,224,252, 93, 87,213, 55,119,145, 85,198,
-242, 41, 76, 66,167,106, 9,218,226, 78,219,193,122,112, 78,192,213,140,252, 94,187, 9,201, 48,203, 38,108,154,211, 18,105, 64,
- 42, 19, 61,229, 30,104,208, 60,180,205,154,105,112,199, 42, 95, 37,117,138, 92, 73, 55,209, 1, 55,250, 37,218, 11,130, 62,248,
-141,160,164, 6,200, 66, 96,153,152, 5,203,207,144, 36, 32,129,118, 52,238,242, 66,220, 58,241, 20,156,112, 92,144,149,136,163,
-180, 48,112, 84,214,224,108, 34, 55,107,233,197, 94, 90, 59,114,221,254,169,253,193,248,116,190,188,254,241,167,239,238,191,255,
- 98,249,120,188,253,251,109,173,153,174,218,243, 32,192,112,139,170, 3, 62,174, 70, 72,234, 49, 16,130, 51, 0,188,114, 43, 82,
- 89, 63,116,224, 90,252, 84, 29, 43, 25, 1,236,212,148,234,232,210,200,165,244, 12, 38,129,255,223,164,227,148,151, 23, 99,249,
-243,195,187,247, 31,252,253,155,111,239, 63, 87,233,191,143,244, 32,189, 42, 78, 52, 56,110, 19, 47, 79,130, 99,198, 35,199,244,
- 99,208,113,164,224, 59,190,117,170,102,178,109,126,164,141, 78,194,128, 54,220, 21, 16,168,186, 26,142, 49, 35, 93,220, 1, 1,
-186,102,151, 93,183, 39,117,186,139, 95,127,249,213,239,127,185, 95,127,251,195,221,109,226, 28,152, 89,225,212, 40, 16,107,166,
- 11,233,160,102, 55, 40,183,243,122, 89,229,140, 8, 0,214, 49, 83, 1,207,225,153, 71, 85,195, 24,228,236,145,182,229, 54, 26,
- 15,182,163,156,165,180,214,100, 46, 77,143,156,132, 22,145,230,164,101, 84,251,232,194,202,154, 6, 59,124, 56,209, 49, 62,117,
-147,251,238, 3,120,162,160, 97,238,158, 2,216,185, 66, 66,237,186, 88,211, 90,205,214, 94, 68,221, 21, 40, 13,162,164,225,134,
-214, 32, 31,193,218,214,248, 76,185, 3,164,243, 7, 23,232, 73, 19, 64,193, 54,228,173, 37,225, 59, 47,187,126, 66,188, 80,148,
-252,160,148,159, 87,255, 11,192,209,149,236,200, 81, 68,193,220,179, 50,171,171,187,103, 48, 70, 28,240, 5,100,201,150, 56,113,
-241, 47,112,230, 79,249, 14,142,156, 16,226,130, 37, 22, 25,141,167,107,186,182,220,136,200,251,168,213, 93, 83,249, 34, 34,223,
-123, 17,250,199,159,222,138,125,141, 14,196,250,120, 94,226, 64,155, 48, 94,233, 84, 48,125,222,108,153,101,237,151,253,138,171,
- 84, 56,117, 70,151, 3,255, 86,106,116, 87,135, 13,132, 60,166,211,222,122,202, 15, 78,181,139,219,214, 52, 61, 24,128,183, 39,
-212,116,136, 24,176, 87,142,137,160, 34,108,194,142,119,121,128, 19, 86,206,140,175,169,110,245, 63, 77, 43,229, 83,205, 92, 12,
-232,190, 63,244, 40,161,239,134, 75,120, 6, 92, 76,109, 15, 16,251, 78,175,174, 13,129, 89,145,237, 44,252, 48,184, 81,169, 56,
- 66,242,244,140,165,233, 18, 39, 16, 24, 0,234, 24, 98, 8, 61, 57,109, 56,241,171, 0, 76, 44,216,114,228, 68,155, 9, 12, 37,
-160,169, 40, 35, 26, 57,227,218,232,222,104, 24, 55,156,132, 14,201,208,157, 32,112, 48, 94,155,124,159, 25, 90, 0, 94, 21, 32,
-125,148,185,211,116, 92,243, 28, 15,188,166,103,143, 86, 50,202, 19, 79,166,177, 85,214,216, 73,233,110,181, 5,252,105,212,246,
- 1, 44, 26, 68, 66,174,236,153, 83, 63, 89,227,153, 68,193,181, 76, 8,107, 25,101,102,218,131,197, 95, 49, 47,241, 96,216,123,
- 61,240,219, 53,109,180, 32,224, 33,129,150,245, 88,119,117,128,212,149,210,121, 30,234, 97, 10,173, 46,123,201,123,178,169, 39,
- 9,216, 59,135,242,128, 82,121, 41,250, 64,189,167,191,100,189,113, 23, 94, 51,158, 25,154,210,228,141, 67,152,143, 95, 15, 63,
- 92,215,167,251, 46,162,247, 16, 26,228,167,236, 83,109,128,191,196, 6,105,235, 9,141, 52,155,110,125, 74,180,176, 63,167,110,
-140,252, 76,247,186, 0,134, 70,185,207,130,238,133, 94, 28,155,220, 63, 87,192,118,206,230, 14,100, 59,152,213,177,176,201,195,
-226,190,243, 2, 25, 15, 88, 86, 72, 9, 9,238,203,144,120, 40,143,156,122, 35,184,168, 99,195, 43, 85,237,144,118,128,103,144,
-219, 65, 99, 91, 6, 17,223, 32,205, 65,187, 1, 55, 61, 95, 79, 49, 44,139,235,174, 16,118,142, 15, 24,167, 54,199,122, 95,233,
-232,174, 73, 66,218,142,250,150,100, 31, 86,195, 91,206, 88,209,252,194, 34,222, 98,233,233,134, 6,200,197,209, 54,227,133,211,
-208,113, 16,114,160, 1, 7, 68,215, 37,243,202, 47, 88,223,172,173,180, 76,131,202,196, 75,150, 60,195,105, 7,149,140,145, 74,
- 12,166, 6, 25, 35,180,130, 63,188,240, 36, 20, 1, 47,235,190, 26, 98, 59, 47, 59,173, 86,108, 6,107,174, 96,129,249, 7, 26,
- 95, 26,178,147,147, 26,206, 92,143, 50,103, 33,199, 56,121, 27, 55,156, 18, 53, 1, 13,129, 97, 16,243,128, 34, 19, 70, 32,100,
-148,117, 45, 92,192, 59, 41,254,254, 75,229, 85,159,118, 40, 62, 20,175,248,198, 70,114,234, 11,149,253, 81,109, 83, 29, 80, 82,
- 47,204,189, 65,249, 31, 20, 33, 64,208, 19, 33,143, 87,229, 95,137, 83,132,118,181,204, 62, 59,187,240,200,117, 52,195,145, 4,
-182,104, 13,205, 52, 27, 15,217,192, 36,195, 62, 7, 88,117,237,222, 8,142,134,204, 56,248,138,214, 1, 40,175,207,121,251,167,
-228,143,102, 88,190,156,190,248,240,225,251,119,239, 95,151,185,252,253,251, 83,186,229, 53, 66, 92, 43, 43,152,183,245,188, 30,
-150,251, 89, 40, 37,205,245,100,214, 23,124,240,206,224,187, 70,171, 6, 83, 64,186,244, 11,116, 23,206,136, 29,171,128,128,242,
- 68,201, 0, 88,189,242, 2,123,114,122,241,226,227, 31,127,253,249,201,124,251,230,205,245, 97, 61,238, 11,160,116,158, 15,240,
- 32,223,132,159,105,200, 57,125,195, 88,105,235, 44, 71,220, 32,119, 44, 14, 27,141,252,250,139,195, 99,180,113,115,223,108,183,
- 6,136,130,122, 59, 22, 54,186, 41,143,130,155,130, 24, 95,157,191,250,238,221,111,159,222,254,252,203,175,155,252,215,202,139,
-219, 5, 85,132,205,243,216, 82,179,165, 58,205,156, 6,230,116, 40,111, 60,126, 35,189,147,162, 43, 54, 50,125,172, 93, 27,144,
-158,201, 18, 58, 26,206, 53,136,108,108, 84,193,156,115, 27,159, 82, 3,193, 59,131, 21, 64, 94,104,143, 87, 62, 67, 2,191, 6,
-114,140,211,174, 39, 48,200,185, 66, 65,225,219,107,194,174,168, 51, 59,163, 47,220, 3, 15,220,181, 95, 10,216,224, 0, 62,196,
-145,107,202,238, 52, 23, 78,128,138, 29, 5, 20,252,221,213, 61,122,176,242,172,134,207,125,244, 14,218,120,117, 86, 22,183,210,
-204,220,190,176,153, 12,114,223, 29,124, 50,128,165,253, 47, 0, 71,215,178, 35, 57, 17, 4, 93, 79, 87,217,253, 96,182,165,229,
-130,196, 92, 64, 90, 16,135, 61,240, 9,124, 0, 31,203,141,207,224,188, 23,196,172, 86, 98,192,211,109,187, 92, 47,215, 70, 88,
-154,203, 72, 45,181,221, 85,149, 25,145,149, 25,161,126,255,237,167, 61, 59,156, 10,233, 30, 26,137, 94,136, 87,156,231, 71, 16,
-120,200,181,172,251, 99,167,107, 18,239,101,216,226,199, 55,170,189, 70,148,227, 48,130,147,241, 63, 61,200,155, 1, 42, 72,224,
-136,157, 53,241,252,141,179,236,158, 85, 43, 98,231, 86,143,174,232, 20,198, 42,150,206,101,240,134, 55,249,150,172,240,166,101,
-145,198,220,205,120,117, 57,170,110, 98,233,179, 37, 50,122,176, 24,162,232, 98, 56, 17,186,175, 94, 46,166,158,138, 63,119, 98,
-233,199,174, 12,163,108,126, 52, 91, 1,176, 79,209, 32,151,235,161, 81,214,137, 19, 13,120, 11,139, 3,160,199,190,217,203, 80,
-174,128,198,253,101,108,126,192,106, 81,104,142, 22,204,218,211, 75,137,173,233,120, 41, 10,142, 90,131, 16, 68, 7,102,110, 86,
- 26,107,112, 96, 20, 0, 37, 1, 97,185, 93, 39,117,216,191,116, 0,171,149,165,120, 44,222, 94,210,178, 71,144, 80, 65,207,109,
-193,136, 94,165,225, 16,128,172,138, 67, 83,141, 92, 35,118,137, 50,149,145,173,178,158,109, 5, 32,194, 58,177, 28,157,104,165,
-151, 21, 35, 79, 87, 0, 25, 92,169,255, 31, 29,188,128, 70, 72,246,157,122,200,205,205, 46,223, 19, 34, 83,212,154,174,114, 8,
-189,106, 42,185, 81,103,174,109, 57, 81,100, 28, 40, 29,120, 41,114,206,159,215,233,185, 0,232,130,213,129,182, 97,121,230,146,
-103,214, 9,233,252, 77,177,189, 33, 78, 77,124,120,126,255,115,187,255,187,109, 78,247,210,101,222, 81, 92, 89, 65, 58,138,177,
- 30, 63, 63,187, 6,113,234,102,202, 30, 82, 34,233, 81,122,169, 11, 24,161,138, 41,170,109,213, 75,222,135,196,238,120,185, 29,
-157, 30,200, 14,141, 62,146,161, 25, 27,235,178,139,180, 30,222, 58,135, 20,145, 12, 44,105,229,136,231,110, 43, 53,123, 90,177,
-135, 45, 33,133,145, 11,123, 63,232,141,210,221,143,241,215,229, 11,151, 36, 92,247,109, 1,183,221, 11, 50, 65,163, 50,231,220,
-183,117,105,217,182,120,200,182,227, 87,107,155, 78, 73,168, 84,242,112,212,121, 26, 71, 27,234, 6,190,143, 72,129,116,162,179,
-215,244, 12, 87,118,228, 29,179,114, 64,221, 72,230,216, 4,215,210, 81, 4,130,185, 93, 33,255,236,253,208,115, 36, 79,210, 63,
-193,225, 25,186, 91,243,223,198,118,109,108, 75,140,248,240, 69,141,206,235,147,190, 40,108,122,196, 18,174,152,169, 70, 14,236,
-205, 26,146,183,186, 12,125,237, 37,253,178,189,114, 6,136,172, 34, 23, 32,250, 55,122, 22,154,254, 12,170, 14,118,210,111,219,
-211,174,220, 9, 95,167, 78,245,201,137, 11, 13,106,252,187, 65, 59, 65,185, 11, 28, 30,215,227, 57,243, 85,213, 11,192, 59,254,
-211,174,210, 90, 20,209, 88, 92, 98,102, 25, 24,127,194,121,150, 41,134, 30,233, 18,252, 88,219,147, 48,125,246, 89,110, 83,221,
- 84, 30,223,237,131,209,245,234, 70,213,128,203, 29,197, 90,104,144,219, 29, 86,175,146,244, 0,207, 23,164,100,219, 33,183, 63,
- 88, 27, 59, 85,104,141, 66,197, 54,154,223,130, 63,228,195,225,155,166,145,156,126,120,180, 28,150, 90, 94,181,191,223,110, 63,
-124,252,245,227,243,205, 78,255, 76,159,255,190,203, 37, 32, 73,172,128,240,177, 88, 90, 1,212, 18,216, 59, 85,217,213,145, 10,
-126,170, 64,209, 87, 10, 5,240, 6,198, 32,164,108,115, 57, 97,239,100,100, 62, 67,227,197, 7,246,141,180, 33,177,181,199, 81,
- 75,236,245,229,203,203,203,229,199, 95,222,159,246,207, 45,133,178,102,111, 61, 29,175, 88, 25, 22,142,146,207,116, 65,119, 64,
- 39, 19,139,162,146,131,221,192, 2, 93,153, 59, 61, 43, 0,139,146, 19, 82, 47, 11, 28,120,227,196,251, 22,107, 16,118,149,118,
-242,187, 15,223,175,242,249,143, 63, 63,253, 53,125,146, 35,104, 35,136, 82,227,140, 7,194,110, 48, 70,130,211,117,225,172,216,
- 4, 77, 83,177, 42, 57,234,170,240,145,234,213, 62, 88,179,136, 77,140,217, 3,180,141, 0,154,163, 51,198,153,167,203, 9, 88,
- 25,232, 94, 32,131, 72, 48, 45,143,252,197, 16, 54, 91, 99, 69,111,223,158,118,153, 17, 22, 98, 61, 59, 74,205,251, 98, 78, 73,
-110, 38,166,192,104,212,183, 96,104,180, 73, 1, 36,131, 69,168, 54,103, 22,225, 43,176,154, 53,129,109,199,186,230,165,228, 5,
-121,178, 36,236,141, 32, 12, 69, 86, 17,167,243, 12,140,159, 55, 68, 78, 68,180,105, 9,101,146,148,160,199, 1,164,158,207,210,
-150,175, 2,144,116, 37, 59,146, 19, 81, 48, 23,231, 98,151,171,166,213, 53, 35,154, 85, 8,113,229,198,129, 11, 39,238,156,249,
- 70,126,131, 15,224,130,196, 1,113, 30, 49, 51,162,167,171,108,167,115, 39,194,124, 64,169,228,180,243,189,136,183, 68,232,159,
-127,249, 54, 77,186,228,186,185, 20,129, 93, 83,161,197, 29,191,108,176, 91, 71, 13, 41, 96,246, 65,251,213,215, 29, 60,189,115,
- 66,145, 11,164, 81,241,164,221, 38,237,156,178, 1,218,196, 21,123,224, 84,158,208, 41,224,131,197,137, 26,138,183, 33,138,208,
- 52, 65, 83,164,202, 56, 34, 76,156,156,216, 75,222,154,165,167, 35,135,135, 79, 27, 61,144, 60, 0, 90, 62,154,144, 19, 75,135,
-217,139,188,134,113, 30,175,166,101,164, 74,250, 27, 14,167,169,244,163, 41, 49,150, 56,142,110, 6,219,152,108, 26,202,165,217,
-151,201,130, 31,121, 92, 42, 92,231,108, 88,148, 5, 46, 3,102, 49,204,111,170, 80, 47, 76,210,151, 79, 82, 81,166,104,219,207,
-157,154,206,220,171,217,233,139,102,216,127,215,236, 37,148, 67, 84, 37,154,109,175,172, 35, 81, 43, 28,199,216,169,236,162, 89,
- 29, 73, 11,117,156,108,158,172,100,231,144,188,152, 86,175,138, 99, 63, 23, 74, 29,135,195,134,232, 48,140,107, 13, 0,221, 58,
-186, 47, 33, 69,180,157,210, 22, 14,193,145,179,252, 57, 19, 91,111, 82, 45, 68,238, 0,185, 73,103,214,142,233,192,136, 56, 89,
- 55,117, 11,212,215,102, 91, 65,150, 28,169, 93, 62, 47,236,216, 73,199,133,172, 80, 57, 17,219, 58,231, 19,123, 32,239,120,224,
-108, 61,200, 9,135,170, 88,251, 7, 25,255, 8, 94,239, 64,189,219,210,250, 93,255,248,245,211,167,195,219,143,142, 69, 53,241,
-144,141,215,179,171, 52, 32,161, 85, 42,160,110,165, 99, 50, 46,248,126,168,177, 30,217,167, 70, 67,223,186,123, 13,139, 56,135,
-238, 39,129,235,179,198, 30, 42,165,209,245,166, 19, 94,164,208, 33,214,203,210,147, 87, 53,214,225, 69,133,129,138,247,132,214,
-237, 72,156, 32,126, 92,209,215, 84, 33,123,166, 38,110, 95,218,142,127,149,108, 10,117, 46, 11, 32, 34,178,231,183, 38,123,185,
-209,140, 17,188,151, 91,228, 1,143,134, 72,165,144,181,241,131, 53,106, 10,210,123,150,209,205,142, 8, 14,232,124, 76,133,209,
-244, 2,220, 71,145, 26, 89, 93,138, 66, 20,198, 41,224,205,131,218,140,154, 19,207, 30, 16,209, 58,150,131,216,163,167, 32, 69,
-127,212,180,145, 25, 37,119,251,103, 14,198, 40,142,253, 1,196, 78,131, 62,169,215,163,197,233,216, 84,198,228,184, 40,216, 57,
- 26, 9,238,230,196, 33,247, 5, 76, 42,240,192,173,254,111,197, 65, 99, 60,174, 3,107, 71,171, 35,228, 12, 11,200, 63,130,170,
- 2,174,155,179, 22,231,141, 35, 20,156,226,113, 14, 97, 55, 83, 32, 31, 87,129, 42, 64,153, 82,162, 35, 39, 2,144,132,204,164,
-173, 0, 95, 57,107,238,196, 95,247,177,156,138,151,167,209, 15,186,168, 89,185,121,234,250,124, 25,192,120, 10, 16, 97,222, 59,
-176, 42,224,115, 41, 17,168, 70, 77,200,198,131,182,106,216,251, 6,188, 54,226,152, 76,167, 60, 22,149, 53, 40, 71,102,169, 20,
-164, 29,171,139,154, 7, 76,255, 96,118, 30, 11, 61,186,169,128, 99,184, 1,194,231,144, 67, 63,252, 83,128,108,164, 0, 35, 67,
-196,249,208,234, 7,237,255,125,243,213,151, 63,252,244,221,155,207,206,239,254, 89,223, 45, 43,190,194,199,208,155,205, 27,231,
-134,134, 19,112, 2,129,136, 27,145, 49,108, 79,154,131,216, 77,197,169,117,239, 65, 77,128, 76, 57, 98,231, 12,190, 30,106,216,
- 5, 89,222, 63, 63,191, 15,139,189, 69,185,164, 38,195,223,127,189, 92,175,159,127,243, 20,150,231, 91, 14, 8,123,181, 81, 41,
-155,143, 64,134,133, 55, 86,104,137,213, 14, 29,177,194,230, 48, 0, 44,171,159, 93,166, 85,197,178,245,142, 92, 87, 44,245, 35,
- 45, 66, 48,248,147,114,103,241,244,201, 23,230,213,247,191,254,246,246,143, 63,127,247,175, 17,122, 61,162,146, 97, 25, 68, 2,
- 23,179, 52, 7,202,161,141,221,201, 14, 38, 59,224,200,239, 93, 79,199,118,216, 52, 81,194, 10,188, 14,152, 15,108,200,106,231,
-187, 17,143,198,169, 66,235, 13,115, 27,236, 21,136,243, 68,113,149, 87,166, 41, 55, 9,119, 2, 95, 57, 9,118, 36,105, 70,210,
- 87,160,190, 67, 26,213,112, 76,183,170, 64, 65,110, 21, 7, 78,157,168,216, 98, 94, 29,167,129,236,186, 22, 58, 86, 2, 59,112,
- 91,168, 68,213, 42,107, 30,116, 1,234, 69,200, 27,194,208,205,164, 8, 72, 45, 54,124,239,154,211,143,250,158,170,199,179, 11,
-131, 60,120, 55,184, 2,117,104,179,148,255, 9,192,209,181,236, 72, 78, 4, 65,219, 85,229,170,178,221,237,110,177,195, 10,241,
- 56, 44,104, 17, 23, 36, 14,115,225,199,225,176, 92, 57, 33,113, 65,226,192, 5,105,133,230,194, 48,211,126,116,189,109, 34,252,
- 1,253,176,171, 42, 50, 34, 43, 51, 67,226,157,216,106,225,192,201,127,165,186,128,177,237, 11, 80,200,140,160, 76,181, 90, 53,
- 61,214, 14,159,155,126,162, 16, 93,182,222,170, 5, 66,116, 80, 1, 12, 89,150, 83,201,246, 30,231,225,130,157,218,208,133, 41,
- 55,160,205,180,236,201, 9,112,218,158,124,186,137,202,104,205,241,250,126,105,246,169, 19,125,102,118, 87,113,178,245,198,108,
-165,127,241, 28,202,133,216, 63, 96,185,180,108,193, 98, 92,117, 98, 51, 16, 34, 60,253, 60,121,163, 0, 97,218,165, 82,169, 32,
-183, 8,110,130, 95,148,199,154, 39,155,113,242, 13,167,186, 41, 44,106,176, 3,237,193, 32,168,129,195,157,144,228, 20, 71, 97,
-196,145,112, 42,108, 10,164, 21, 51, 37, 79, 8, 21,120, 90,103,243, 4,109,238, 25, 28,235, 8,102,191, 99,201,242,176,103,135,
-192, 20,154,104,218,118, 91,180, 15, 55, 97,240, 6, 74,161,187, 14,208, 92,179, 45, 58, 29,212,135,131, 57,121,125, 91, 56,122,
- 43,103, 35, 64,248,200,228,129,229,217, 11,127,222, 58,102, 79,200,213, 43, 58, 10, 67,104,225,255,178,238,250,168, 20,134, 34,
-162,135, 77, 47,154,185,180, 8,174, 38, 87,175,147,122, 22,238,236,135, 86, 66,251, 58,231,143,250,252,138, 85, 77,251,110,180,
-175,231,251, 90, 64,249, 58,168,196,201,234,180, 69,149, 23, 72,234, 26, 36,131,134,201, 81,133, 60,137,139, 52, 67,149,240, 36,
-188,136,212,180, 39,155,218,252,244,165, 95,161, 16,238,181,236, 72,253, 75, 99,194,230,112, 0, 33, 15, 10,132,130,206,213,152,
-177, 98, 16,185,137, 53,137, 0, 96, 93, 76,177,142,105,127,232,216,201,236,197, 49,103,178,187, 35,145, 54,170,242, 44,253, 9,
-107, 27,150, 32,223,204, 34,248,166,238, 54,246, 76,215,213, 73, 65,133, 75, 1,109, 9, 26,229, 89, 32, 26,153,253, 46,140,244,
-236,255,173, 87,224, 64,168,238,166, 50,158,131,140,154,150,253, 28, 0,149, 73,179,236,119, 0, 18,214, 91,211,237,238, 38,196,
- 37,214,208, 75,216,183,253,182, 63, 87, 51,175, 71,196,206, 27,195, 45,143,130,137, 31, 68,252,195,162,173,211, 45,158, 84, 58,
- 78, 14,130, 10,134,170, 90, 0, 4,231,130,195, 72,251,178,101,151,248,154,150,121,173, 93,231,113,149,161,175, 57, 82,111,111,
-109, 82, 45,150,131, 25, 59,240, 38,201, 28,166,105, 76,204, 52,210,242, 88, 91,173, 62,137,137,111,156, 16,217, 56,206,120, 85,
-148,135, 64,203, 88, 65,184,199, 24, 13,104,136, 44,121, 1, 71,247, 15,182,154,214, 26,172,105,144,217, 2,236,192, 77,123,211,
-131,208,172,201,128, 41, 32,120,239, 13,103, 26,224,131, 39, 99, 56, 67,131, 99,114, 55,230,139, 37,226,210,219,118,215,173,120,
- 73,144, 28,246,218, 84,231, 51,135,120,211,190,130, 19, 28,124, 29,150, 89,223,161, 96,166,151,117,190,223,103,236,198,168,206,
-248, 40,189,101,157,206,106,137,238, 44, 70,171,194, 98, 36,128, 22,180,204,215, 77, 39, 65, 87,246,144,244,166, 8, 32, 80, 72,
- 44,200, 96,147, 7,139,143, 57,254,245, 32,237,158,168,178,225,252,128, 99, 64,202,229,154,117,152,137,246,205,208, 89,101,250,
-199,205,207,245,233,201, 92,222,253,248,248,197,227, 15,239,126,249,240,215,207, 31,126,127, 90,125,157,123,105,142, 58, 9,236,
-108,232,226, 1, 27,108,115,192,244,114,120,120, 23,250, 58,131, 9,141,136,151, 90, 94, 17,204, 23, 57,215,254,254,223, 44,188,
-120,252,246,171,183,223,189,249,254,155,175,175,253,217, 60,136,219, 61, 93,188, 27, 63,254, 57,129,215, 89, 78, 37, 42, 9,162,
-181,222,174, 96, 91,180,117,139, 56,137,175, 12,238,236, 77,137,133, 21, 41, 83, 94,217,252,190,213, 32, 93, 78,211,249, 17, 1,
-217,181,246,211, 58,235, 86,219,246,250,217,216, 95,223,255,244,219,199, 95,255,254,195, 60,200, 1, 71, 49, 26,225,188,187,180,
-160, 8,224,182,214,118,133,101,228, 77, 47, 98, 17,221, 90,202,120,110, 63,191,145, 49,128, 73,235,202,154,224, 12,147, 80,224,
- 44,150, 77,140, 58,129, 89,218,169,207, 90,157,247, 48,238,237,171,240,145, 93, 77, 94,117, 8,227,186,219,171, 69,109,178, 4,
- 94,184,117,178,177, 81,182, 93,237,116, 72, 47,113,143,167,109,168, 98,242, 80,115, 10,123,241, 78, 79, 44,250, 18,240, 90, 19,
-140,204, 24,208, 41, 55,249, 88, 78, 16, 18,174, 81,227,157, 41,113, 40,141,152, 92,163, 3,116, 69,177,128, 97,128,217,146, 88,
-140,158,210, 34,246, 24, 44, 32, 12, 18, 3, 98, 4, 52,111, 74,219,255, 2,112,116,245, 60,178,211, 80,212,241, 71,236, 56,153,
-157,221, 89, 9,104,144, 30, 13, 13,210,163, 1, 81,208, 33,138, 87,240, 87,105,104,232, 95,133,160,161,128, 14, 9,137,234,177,
-210, 14,187, 51,147,196, 95,177, 57, 39,253,104,102,226, 92,223,123,142,125,239, 57, 96,233,120,149, 8,123,119, 18,253, 69,228,
-171, 6,174,238,168, 68,123, 82,227,154, 22,222,111,228, 10, 4,183, 51,184, 28, 58,100, 78, 10, 64,117,219,124,219,202,199,216,
-241,169, 28,124,158,228, 3,232,113, 0, 48, 25, 37,219,246,105,199, 0,238,103,250,117,170, 8,200, 62,214, 64,107,216, 59,147,
-177, 58, 5, 80,178,203, 28,210,196, 50,182,250, 60, 0, 34,129,158,145, 47,174,133,190,224, 55,122, 75, 19,133,141,120, 4,234,
-153, 28, 44,152, 5, 8,153,105, 74, 78,109,163,237,163, 83,246, 50,138,163, 81,135,116,100,227,168, 28,250,163, 74, 65, 28,234,
-102,139, 7,223,145, 83,164,223,119,227, 25,166,242, 52,149,232, 64,210,121,219, 71,117, 38,222,138,111,126, 59,103,234,173, 0,
-164,107, 80, 7, 32, 25, 20,133, 25, 88, 82,128,169,161, 34,176,149,129, 19, 92, 36,158,187, 56, 34,125,136,176,150,150, 6, 66,
-186,188,114,132, 66, 60,112,103,174,181,152, 93,203,191, 91,205,204, 19, 70,106,213, 3,138,178, 25,184, 23,253,156,197, 48,156,
- 83,209, 14, 12,199,200,152, 64,138, 44, 88, 23,207,182,219, 70, 55,111, 94,211,167, 12,184,203,243, 51,235,251, 83, 69, 61,111,
-231,176, 18, 43,128,213,136, 16,105,101,176,246, 79,235,230, 81, 2, 34,231,140,181,155, 11, 74, 97,163, 60,225,116,145, 67, 16,
-252,144, 64,213, 2,166,105, 47,142, 77,145,146, 74,228, 57,160,198,209, 27,168, 63,109,168, 7,166,214,139, 51, 35, 42,176,124,
- 4,210,208, 20,129,144, 93, 80,148,216, 64,200,230,150, 6, 39,212, 34,216,173,202,196, 95, 86, 2,100, 64, 39,170, 96,225,247,
-182,200,118,255, 74, 78,194,171,209,238, 76, 45,214,201,138,203, 67,121,229,129, 40,184,141,136,200, 88,215,173, 96,181, 98,215,
- 61,230,245,130,204,197, 20, 98, 50,149,177, 59, 77,195, 44,189,223, 97, 35,209,176,206,103, 11, 26, 66,104, 20, 80,224,217, 9,
-211, 52, 7,157,153,198,157,201, 82,173, 6,111,181, 49, 22, 29,197, 81, 21, 79,141, 0, 97,148,203,108, 94, 1,120, 3,209,157,
-123, 54,211,181, 10,134,137, 55,166,218, 0, 98,147, 37,224,170,145,148,181, 72,109,240,149,141,230, 20, 89, 84, 84, 68, 6, 93,
-244,205,198, 73,222,247, 49, 52,141,224, 25, 26,106,143, 5, 27,163,175,235,208,201, 65, 3,115, 81,181,120,173, 19,171,148,162,
-133, 99,107, 30,193,212,118, 5, 10, 65, 37,101,106, 79, 35,229, 72,155, 91, 84,190,148, 78, 95,181,240, 4,110, 34,242,222,139,
-249,113, 16, 27,216,192,140,154,141, 58,239,140,203,194, 81,207, 67, 30,217,120,101,195, 46,204,150, 77,218,221, 66, 57,197,132,
-128,189,171, 83,111,169, 39, 6,216,227, 83, 50,163,155, 27,242,195, 22, 66, 4,252,234, 80,145, 69,190, 83,143, 86,202,126,212,
-169, 69,141, 72,101,183,247, 40, 90,112,117, 1,213, 3,206,243,197, 46,142, 61, 40,138, 83, 72,120,215,149,166, 9, 26,196, 72,
-210,237,147, 1,211,237, 76,115,135,150,228,130,123, 11,115, 54, 8, 12, 78, 64, 33, 55, 75,149,100,157,246,134, 88,148,194,121,
-173, 75, 1,180,214,135,127,204,241,179,119,239, 62,255,238,219, 55, 63,254,244,251,251, 95,255, 10,233, 98,237,208,118,135,111,
-182,172,243,236,152,198, 23, 96, 79, 72, 42,168,235, 72,246, 53,105,123,240,192,132,249,195, 44,141,253,230,203, 47,190,255,225,
-237,215, 95,125, 42,196,127, 66,220,132,248, 87,136,149,142,140, 31,158,254,254,243,252, 18,216,153,215, 18, 39,127, 28,171, 63,
-109, 21, 57,115,165, 40,233, 15,136,144,111, 27, 53,179,193,203, 35,214,170,137,104, 16, 25, 53,242,224, 73, 78,186, 1, 98, 12,
-125, 27,235,225,120,252,232,205,219,247,191,229,159,127,249,195, 25,225, 62,153,240,197,203,125, 30,205,182, 84, 16,142,118,239,
-193,244, 60, 21,202,139,185, 12,155,233,162,149,195,229, 57, 29,192, 8,189, 29,123,112, 45, 89, 38, 27,250,123, 44,164,117, 96,
-210,106,210,146,147,148, 39, 16,205,219, 38,166,236,121,143, 2,176,179,137,167,254,104, 69,112,125, 5, 8, 28,101,168,160,174,
-253, 43,205,221,139, 92,177, 51, 56,254,140, 61,191,224, 63,134,193, 26,178,235, 21, 43,133,200,196, 99,181,196,176,104, 17,165,
- 49,216,187,113,151,158,187,214,228,175, 83,232,158, 81,192,151, 66,163, 83, 87,138, 40, 47, 11,168,175,230,148,153, 5,193, 53,
- 6, 25,108,230,128,197, 54, 4,202,211,209,239,163,254, 47, 0, 73,215,178, 27, 57, 17, 69,235,237, 42,151,187, 39, 19, 6, 4,
-131,196, 2, 17, 4, 11, 88,178, 68,176,102, 5, 11,190, 3,137,111,227, 35, 96, 5, 2, 33,216,176, 28, 49,147, 76, 38,233,182,
-203, 46,151,203,197, 57,205, 50, 73,119,199,109,223,123,235,220,215, 57,250,219,111, 62, 65,138,119, 79, 93,226,198, 37,232, 5,
-168, 90,246, 75,193, 93,122,147,143,105,228, 8,248,242,160, 6, 78, 20,102, 18,103, 34,118,112,137, 79,217, 81, 46,207,188,107,
- 14,118,198,253,233, 67, 76, 1,103,169, 31,154,201,186,134,173,177, 88, 88,154,139, 90, 88,146,227,155,177,182,199,236, 97, 50,
-143,194, 60,101,129, 54,112, 86, 18, 17, 34,195, 61, 53,103, 98, 89, 26,164,156, 57,130, 97,135,195, 94,178,255,247,132, 84, 93,
-187,114, 69,169, 28,145,209,144, 28,195,236,182, 5,164,188,237,216,227, 45, 62,192, 34,241,245,240,106,215,251, 67, 71,122,192,
-106, 96,193, 48, 80,252, 30,207,140,108,239,117, 97,235, 30,215,133,192, 32,201, 71,197,205, 85, 92,223, 10,184,103, 73, 51, 94,
-114,199, 81, 16,130,193, 66,146,114, 36,157, 48,245,137, 4, 22,148,231,160,240, 35,233,241,121,205, 26,192,215, 94, 90,202,172,
-208,224,104, 48,236,190, 95,136,223,129,193,124,159, 1,187, 96,107,129,252, 51, 92,223,171,184,118,242,210, 20,230,201, 86,140,
-190,112,193,155,186,163, 82, 52,153, 40,216, 32,205, 3,185, 10, 5, 14,182,115, 59, 3,230,109, 25, 32,208,238, 43,238,251,220,
-201,180,226,196, 45,156, 66, 71,130, 22,250,156,146, 88,112, 14,197, 60,100,183,173,251, 52, 89, 30,237,192, 50,141, 18, 83,165,
-121,124,168, 87, 38, 46, 72, 69, 56, 61,210, 38,120, 25, 44,238,240,197,167,207, 14,175, 95,157, 84, 50, 46,144,239,209,110, 54,
-113,136,133,134,141, 44,230,178, 5,200,116,176,176, 45, 9,252,142, 68, 42,159,184, 63,135,167,151,107,147, 39, 0, 8,178,174,
- 23, 67, 56,140,176,206,142,170, 33, 35,244, 88, 8,154,223, 42,220,135,120,117, 33,251, 8,129,165,252,178,240,230, 85, 56,184,
-119,227,193, 24,235, 17, 47,102,131, 80,230,174, 10,206, 2,192, 99, 74, 41,226, 25, 21, 78,126,224,124,109,254, 9, 43,184,100,
-112,199,165,247, 28, 81,129,247, 74, 96, 99, 4, 35, 67, 26,170,165, 86, 23, 21, 98,150,181, 44,157,119, 7,121, 58,194,147, 17,
-143, 37,171,233,149,171, 34, 98, 32,101, 98, 33, 32,161,142,111,100,207,188,233,183, 57,159, 71,146, 47,142,142, 28, 69,236,240,
-121, 44,194, 90,106, 0,235, 43, 88, 25, 91, 91,171,236,143,209,165,222, 32,218,183,192,214, 13,210,109, 10, 9,100,252,172, 45,
-183, 89, 41,107, 86, 17,166, 55, 64, 51, 68,192, 29, 14, 70, 10,137, 72,249,118, 27, 54,110, 63, 3,114,196, 94, 68,238,175,179,
-185,204, 34,239, 26,184, 91,111,251,227, 78, 98, 31,167, 13,208, 90,211, 1,127,114,106,208,212,133, 47, 36, 35,141, 22,246,108,
-165,235,162,130,139, 31,119, 50,148,115,150,125,207,235,121, 70, 38,211, 56,108, 52, 60,215, 7,143,156,163,183, 17,145, 68,134,
-224,168,134, 26,141,236, 66, 22, 46, 71,171, 19, 9,166,251, 75,165,144, 20, 25,149,247,143, 61, 27, 30,107, 43, 48,106,243,100,
-234,151,197,114,133, 30, 81,195, 94,142, 91,106,106, 81, 32, 8,249,143, 48, 90,167,252,191,178, 4,139, 80, 27,213, 47,155, 94,
-119, 74,184, 76,109, 77,101,187,215,250,206,244,254,179,207,111,190,254,242, 70,140,234,247,159, 95,190,153, 19, 92,194,153,125,
- 26,173,167, 28, 53, 55, 62,144, 34, 34, 44,247,118,134,101,140,227,227,120,123,255,241,205,135, 63,254,240,213,119,223,191,243,
-254,243, 59, 81,255,154,199,191,215,249,159,117,186, 75,231, 23,226,254,118,254,243,229,139,219,173,222, 86, 61,145,242,124,245,
-217, 38,216,182,166, 78, 64, 99,255,176, 33,130,159, 37,229, 24, 79,112,227,182,158, 21,243, 80,106, 80, 33,106,236,213,117,122,
-208,241,218,217,172,250,247,204, 7,239,126,244,203, 31,215, 63,253,246,171, 85, 39,123,237,225,168,212,145, 32,157, 6,190, 14,
- 39, 70,240,116,151,205, 27,220, 39,142,186,144, 95,198,247, 67, 73,139, 26, 14, 72,232,185, 33, 6,156,208,210,225, 72,110, 45,
- 47,194,234, 68,216,187, 14,105, 0, 73, 77,120, 3,129,172, 88,174,189,154, 88, 76, 0, 66,104,110,231,169, 56, 15,230, 95,224,
-149, 92,159,146,111,146,245,157, 7, 56,190, 54,150,116,121,178,173,170,156,151, 83, 27,119, 42, 75, 87,137, 60,121,203, 11,129,
- 98, 93, 21,240,131, 45,192,207,219,163, 90,144, 23,113,151,218,218,154, 39, 45,230, 21,255,116, 55,112,234,107,171, 22, 65, 5,
- 38,188,246, 52, 39,192,101, 50,107, 23,153,149,220, 89,110,254, 79, 0,142,174, 36, 71,138, 24, 8,122,183,203, 53,221, 51, 98,
- 88, 78, 92, 16,130, 3, 72,128,196, 1,241, 1, 30,128,248,199,188,137,215,112, 70, 28, 57, 1,130, 97, 29,232,233, 90, 92, 94,
-138,136, 58,142,212,154,118,185, 51,211, 17,229,204, 8,253,250,205, 99,112, 82,240, 78,246,181,148,130,221, 28, 92, 13, 99,160,
- 27,165,225,164,128,181, 26,167,234,206, 46,211, 76,131, 91, 51,107, 22, 2, 48,110, 84, 63,158, 34, 14, 43,117, 50,167,197,170,
- 77,123, 28,161,159, 0,217, 59,235,226, 94,200, 48,250,178,100,252, 26,154, 82, 78, 38, 83,214, 53, 33,225,174,230,169, 4,103,
-230,107,109, 92, 43,170,160,176, 32,213, 56,153,135,244, 82,217, 83,158, 4,180,125, 97,161,230,232, 29,123, 28, 64,115, 24,248,
-194,161,180,239,186,146, 67,153, 38, 80,177,216,221, 48,222,226, 88, 4, 8,169, 49,235, 28,212,112,102, 41,201,175,195,106, 61,
-142, 81, 96,230, 98, 93,182, 29,141, 24,144,101,173,219,204,127, 16, 44,116,175,200,114, 11, 25,169, 18,158,131, 67,135, 40,164,
- 84,108,193, 9, 16, 57, 59, 39, 11,181, 12, 2,199,128, 81,251, 84,118,170,114, 8, 26, 96, 36,114,158,195, 97,189, 85,216,117,
-215,184,228,230,184,107,149, 35, 65,156,125, 81,244,221,108,116,234, 46,130, 88, 64,168,121, 94,163, 38,189, 33, 2, 23, 22,193,
- 11, 82, 73,109, 21,145, 43,197,198,104,238, 94, 89,127, 64,202,104,198,125, 76,165, 21,246, 65,147,158,153,190, 38,149, 14, 51,
-152,138,244, 43, 34,131,252,119, 6,214,174,170, 3,104,153, 23,202,222, 2, 94, 15,236,148,162,150, 94,173, 3,223, 4, 83, 25,
-235,168,179, 92,186,135, 15,110,221,185,250,122,221,165,241,140, 42,145,189,246,190,151,114, 15,144,176,233, 66, 34,105,144,154,
-138, 77,155,212,227,197, 97,235, 80,199,155,153, 54, 37,246,137,138, 47,235, 0,154, 37,125, 49,211,196,174, 32, 65,101, 2, 67,
- 5, 16,185, 25, 83, 80,150, 77, 70,148, 38,207,234, 81, 42, 47, 38,221,222, 38,151,125,162, 61, 85, 81,139,219, 70, 28,216,242,
- 79, 81, 15, 20,228,182, 56,138,183, 33,138, 65, 19, 58,108,230,237, 48,179, 47, 35, 80, 63, 33, 32,183, 20,135,199, 80,160, 27,
-107, 19,149,154,168, 14,231,217, 29, 73, 53, 49, 14, 2, 26,138,196, 32, 95, 37,111, 94,168,214,168, 57,132,195, 17, 98, 4,152,
-206,145,157, 60,132,241,209, 83,105, 14, 95,182,115, 72, 81,187, 20, 15,226,189,175, 52, 82,139,214, 73,252,208,214, 91,172,202,
-156,137, 50,208,103,173,101,182,223, 73,208,111,139, 13,115, 14,212,105,217,175,181,179, 50, 71,124,152,173,216, 32,153,170, 71,
- 24, 2,219, 90, 28,192, 64, 15,180, 96,138,188,106, 93,115,202, 72, 5, 45, 3, 47,103, 16,234,168, 26,212,250,217, 33,228, 78,
-180, 11,186, 43, 53,244, 8,120,233,233,154, 37, 34,144,118,113,167,198,243,245,250, 17,208, 55,129,108,131,182, 39,206,133,153,
-169,105,111, 59, 0, 62,195, 70, 32,117,138, 53, 72,129,131,103,103, 0, 47,131, 15, 52, 30,231,187, 73,225, 60,223,201,172,193,
- 80,185,211, 70,206,101, 34, 52,183,209, 95,217, 1,161,177,237,184, 94, 39,155,200,175, 42,181, 36,138,160, 38, 73,163,101,202,
-184,185,205,205,170, 29, 18,157, 2,121, 3, 68,181, 35,250,239,208,137, 1,165,180,177,137, 13, 15,154,121, 41, 88,210, 33, 47,
-191,180,249,227,187,243, 71, 79,238, 63,127,116,183,214,116,249,249,251,223,195, 80,188, 60,195,127,230, 93, 7,206,164, 37, 71,
- 2,213,223, 63,211,245,114,124,245,226,217,197,197,203,187, 64,237,245, 67, 26,191,204,227, 63, 20, 45, 13, 52,129,199,252,158,
-203,101, 61,124,154,126,253, 85,161, 97, 57, 77,142,188, 28, 90, 70, 62, 16,149,181,220,150, 46,136,207,131,184,162, 49, 18,205,
- 50,253, 17,188, 76, 81, 86,108, 47, 39, 48,173,149,123,184, 6, 0,211,120,239,201,211,143, 63,110,190,125,247,254,210,127, 59,
-177,248, 73,165,230,101,179,159, 60,111,151, 53, 17, 13,141, 6,229,102,173,137,132,104,179,229, 29,118,143, 15, 6,112,203,243,
-196,151, 0,173,239, 79,122,170,203,177,248, 87, 23,207, 7, 32, 3, 4,115, 4,176,164,160,166,222,245,180,226, 43,125,110, 40,
- 90,180,194, 38,196, 43, 1, 44,153,130, 2,133, 46,142, 20,181,244, 96,202,107,175,176,255,248,174, 44,218,166,224,190,122,238,
-235,102, 78, 82, 80, 78,181,105,115, 30,192, 75,104,217, 87, 1,214, 13, 85,167,235,232,113,156,150,201,255,243, 14, 53, 93,166,
-165,202,195, 41, 69, 18,228,132, 63, 87, 49, 76,153, 61, 41,219,236, 55,128,155,112,203, 92,254, 11, 64,210,213,180,202, 81, 68,
-209,174,239,174,238,153,113, 34,121, 38, 32,184, 84, 72, 66, 86,242,240, 31,184,114,231,198,181,110,252,101,254, 13,255,132,171,
-132, 16, 8,130, 24, 94,124,239, 77, 79, 85,119,215,151,231, 84,118, 3, 3, 51, 77,117,221,123,207,169,186,247, 28,245,203,207,
-223,229,130,212,177,175,215, 70, 24, 14,178,139, 8,185,152, 56, 68,221,221,227,180, 2,148,195,211, 16,137,186,163, 22,235,196,
-202,146,145,142, 45,173,170, 92,181, 20,234,157,109,151,163,250, 18, 20,196, 77,148,137, 65,118,166,231,136,242,122,232,231,147,
-248,158, 93,162,226,138,252,168, 54, 91, 39, 20, 17,254, 93,180,212,200,105,212, 80,154, 50, 16, 7,248,116, 48, 8,101,118, 97,
-210, 33, 24, 91,109, 70, 77, 69,224, 18,174, 33,178,205,122,250,239,152,253,165,250,141,244,121,144, 17,121,222, 78, 30,245, 13,
- 25,214, 89,228,169,147,175,245, 72,175, 7, 73,185,112,100,129,207, 98,189, 40,192,218,115, 2, 78,109,125,162, 67, 24,202, 5,
- 16,140,128,249,209, 2,142, 61, 70, 91,229, 57,142,162,255, 23,133,123,186,154, 13,240,105, 97,117, 29, 24,234, 20, 51, 69,189,
- 7,156,199,246, 71,189,215,214,114,124,152,215,137,141, 94, 95,181, 91,105, 37,207,233, 15,208, 69, 3, 34, 9, 40,205, 56,194,
- 10,208,246,116,160,104,179, 25,158,214,182,200, 66, 89, 7,222,144,238, 11,202,202,154,123,174, 19,129,210, 89, 17,136,114,163,
- 5,161, 77,113, 49, 33, 95,194, 70,199,212,114,105, 32, 57, 72,222, 32,224, 26,153,117,167,188, 70,179,197,177,177, 68,172,154,
-125,251,134,167,250, 73,210, 78,175,228,207,160,140,206, 71, 59, 48,235,139,151, 55,207,214, 15, 15,165,126, 49,178,235, 9, 28,
- 43,155,196,241,239, 93,215, 37, 17,232, 37,124,110,118,161,104,218, 78,149, 58,177,126,202, 41, 33,134,134,251, 72,143,166,150,
- 4,112, 3,125, 0, 34, 86,162, 57,144, 91,161, 64,250,155, 67, 62,158,110, 14,134, 50,142,147, 72, 28, 99,115,120, 82,233,134,
-112,238,154,249,146, 75, 64,165,241, 1, 8,162,104,211, 39,203, 53, 37,218, 19,214, 74,245, 51, 14, 4,232, 33,103,122,240,173,
-150,146,241, 96, 97,185,126,196,130, 73, 44,133,228, 62, 96, 91,136, 59,128,144,241, 80, 97, 38, 79, 84,234,100,193, 89,132,222,
-177, 26,195,141, 7,116,164, 94,130, 53,200,237,210, 57, 63, 82,178,139,106, 49, 67,215,213, 20,118, 28,187, 96,179,205,216, 62,
-192,129,136, 68,218,188,105,122,121,153,157, 7, 9,226,232,164,179,180,124,195,235,176,102,180, 94,239,136, 52, 87, 38, 37,121,
-217, 50,209,113, 73, 14,246, 4,140,134, 71,229, 5,171, 26,119, 54,143,143,192,144,211, 52,172, 14,121,104, 4,154, 64, 29,219,
-228,209, 80,110, 13,165,132, 7, 54,170, 26, 9,156, 39,136, 32,216, 34,139,170,168,157,155, 54, 95,176,225, 71,165,100,100,151,
-237, 34,123, 79,148,116,171, 4,108,199,218, 81, 69,225, 64,135, 48, 20,240, 26,233,194,106,217,248, 45, 78,212, 86, 69,140, 0,
-159, 88, 7,222,128,119,230,244,228, 68, 77,244,142,212,135, 90, 14, 6,148,203, 62, 82,151, 3, 12, 22,165, 18, 47, 6, 9, 69,
-225, 39, 0,122, 42,197, 33, 88, 31,168, 57,203,235, 41,150,112, 75, 23, 96, 98, 64,209,167,173, 57, 4,133, 2,219,218, 74,124,
- 51,116, 75, 96,130, 79, 14,104,243,190, 66,112,170,254,190,197,127,245,120,127,126,254,244,246,246,213,247,175,191,126,248,240,
-248,238,237,221,150,150, 32, 27,210,142, 79,242,180,167,251,144,228, 53,255,250,211,143,191,253,254,195, 56,190,201,159,254, 10,
-143,255,180,235, 14,180,163,175, 82,132,146,238,114,184, 19,203, 18, 62,254, 29, 46, 15,121, 22, 38, 82,253, 81,202,200,152,164,
- 45,237, 21,255,135,100,175,176, 51,250,117,150, 42, 70,211,167, 9,143,243,164, 17, 8, 74,171,199,153,164,125, 82,135,175,230,
-155, 23,223,190,187,124,243,199,159,111,131,123,127,172,231,210, 71,104,132,179,153, 26, 58,156,145, 25, 41,183,217,186, 10, 51,
-178, 18,176, 91,163,190,129, 3,151,178,243,208, 47, 58,207, 94,157,142, 92, 45,186,138,202,181,152,153,204, 6, 5,193, 55, 77,
- 28, 33, 42,123,212, 52,237,194,236, 17, 76, 74,123, 55,167,114,160, 93, 23,208,137,106,231,180, 86, 47, 47,236,170,203, 99,237,
- 71,215,185, 70,250, 50, 24, 30, 5,240,120,180, 68, 14, 66, 79, 62, 20, 96,180,181,139, 49, 82, 92,116,223,120,143, 53,204,105,
-137,146,117,136,195,144,156,242,138, 79, 82,145, 37,236, 70,135,109,184,238,129,182,244,172,221, 37,152,142,192, 36,189, 20,128,
-165, 69,249, 95, 0,142,174, 93, 85,142, 35, 10,118, 79, 63,167,103,246,222,229, 98, 9, 4,178, 4, 78,140,141,193, 24, 20, 40,
-112,228, 31,176, 35, 59, 16,254, 74,127,134, 18, 69, 2,103,150, 65, 15,144,109,233,238, 99,102,250,237,170, 73, 54, 89, 88,122,
-251,113, 78, 85,247, 57, 85,234,151,223,190, 93,176, 93, 28, 51, 52, 35, 24, 78,134,162, 55,195,153,186,111,149,151, 89,103, 96,
- 67,158,246, 43,144, 87, 71,176, 97, 89,204, 45, 14,139,107,215,137,111, 90, 3, 55,193, 0,214, 77,163,188, 92,235, 45,181,211,
-144, 85, 88, 47,135,147, 81, 98, 6, 95, 66, 28,195,177,193, 16, 78, 87,140,251,162,162, 75, 3,123,207, 64,194,239, 21, 75,105,
-156, 60, 13,188,248,155, 3,226,208,120,227,129,177,193, 9,113,194, 12, 77,171, 88,147,168, 37, 59, 78, 87, 68, 48,160, 36,196,
-202, 60,106, 61,149, 27,103, 17, 63,171,161,228,225,148, 37,223,196,177, 50, 53, 55,111,244, 60, 33,184, 8,250,251, 10,122,125,
- 15,236, 32,203,153, 66, 36,146, 50, 28,200, 94,180,247,166,123, 44, 53,154, 36, 35, 18, 5,115,105,164,183,182, 20, 5,165,211,
- 54,186,201, 49, 64, 18,171, 81, 52,202,100, 42,157, 1, 78,231, 49, 91, 11,206, 89,146,103,205,123, 54, 52, 15,106, 1, 11,192,
- 11, 67, 29, 44,245,174, 52, 37, 49, 0, 14, 78, 54,241,178, 42,106, 28,168,179, 91,243,198,242,147,207, 14,243,194,234,241,148,
- 2,210, 99,210,200, 34,235,191,210,110,235,186, 97,207, 11, 48,181, 45,180,101,141,139, 1, 88, 42, 25,120,131, 42, 93, 10, 72,
-104,241, 32, 67, 99, 76,217,240, 13,245,176,245,243, 66,241,182,149, 69,105,114, 40,250, 12,120,201,210, 21, 5,210, 1, 2, 2,
-246,193,139,250,233,248,252,135,199,254,253,223,159,107,113, 71, 0, 60, 49, 55, 71,187,188, 36,144, 58,193,216,183, 79,248,175,
-148,207, 67,186,216,246,134,216,245,210, 27,210,144,196,158,233, 37, 10,183, 81, 31,134,133, 34, 8,183, 68,212,180,244, 2,183,
-240, 9,193,178, 80, 64,242,216,210, 34,203,222, 74,236,201,116, 41, 39,132,101, 38, 78, 96,209, 57,102, 86,147,162, 7, 80, 86,
-204,174,102,139,153,181, 60, 76,192, 97, 90, 47,136,135, 64,166, 74,217,136,196,174, 98,160,240, 3,226, 73, 63, 48,214, 72,111,
-176,164, 72,216, 49,178, 11,127, 81,251, 85,108,241,166,241,250,208, 60,148, 83,178,172,136, 24,187, 13,224, 34, 56,130, 58,207,
- 89, 42,146,238,230, 45,207,236,190, 85, 51,206,161, 86,128, 19, 22,251,204,177,201, 14,120,130, 42,235, 55,119,172,133, 61,146,
-183, 97,147, 87,205,254, 83, 96, 64,227,229,224,241, 5, 8,143,180,101,107,188, 5, 78,195, 52,208, 65, 3, 83,108,210,222, 74,
-160,169, 56,233, 48,127,130,182,187,157,247,128,248, 11,192, 20, 46, 83, 26,207,171,169,213, 13,233, 18,140,210, 85,203,130, 51,
-185,247,100,130,163, 3,233, 27,147, 2,130, 38, 85,206, 28, 61,148,169, 21,137,176,171, 75, 87,163,216, 45, 32,181, 7, 85,114,
-162, 77,149, 98, 10, 7, 95, 2,126, 90, 98,178,228, 72, 27,226,210,199,225, 64,207,120,121, 16, 24, 93,117,160, 3, 94,208,240,
-130,218,171,180,213, 13,122,186,101,131, 65, 62,181,114, 97,238,194,190, 46, 89,212,145,122,194, 29, 36, 76,179,229,129,250, 86,
-137,158, 11, 84,125, 20,124,184, 19, 21,163, 98, 23,103, 97,199, 6,223,213,187,201, 45, 38,246,126, 99,148, 43, 69,233, 88,227,
-209,150,114, 77, 53,191, 1,213, 62, 62,248,242,199,159,190,255,238,155,175,228,233,148, 78,247,239,254, 57,157,115,185,126,248,
-132, 41,254,249,215,103, 47,126,127, 42,196,171,248,246,117,137, 87,138,220, 71, 35,207, 72, 4,113, 89,240,145,175, 31,227,242,
-223,118,190, 40, 63, 4, 64,222,251,220,119, 11, 96,190,162,128,181, 42, 22, 48,241,141,135,162,179,189, 1, 40,233,184, 81,166,
-210,209, 85, 66,130,182, 56,166, 66, 36,253,249,139,242,228,201,163,143,234,235, 63, 94,254,245,230,237,159,193,206,108, 81,212,
- 66,133, 68, 9, 87,207,154, 10,252,162,225, 75, 41,120,130, 4, 76,238,108,145,172,250, 78, 47,136, 45, 87,201,166,183,135,163,
- 92,211,176,225,200,133,193,218, 89,177,159,236,209, 29, 22,114,194,126, 4,161,219,219,180,181,241, 92, 63, 63,248,219,249,162,
- 1,242,146,244,244,105, 90,150,190, 30, 88,170,132, 40,221,178,114, 62,213,232, 0, 11,193,177,179, 92,131, 26,193,202, 22, 50,
-163, 78, 29, 13,177, 70,125,159,105,149,236,121,119, 75,135, 61,201, 39, 40,129,136,152,250,198, 2, 75, 62,157,136, 57, 93, 64,
-115, 55, 26, 93, 98, 29, 54,140,174,103, 58, 72, 85,113, 41, 8,218, 11, 38,167, 4,106, 87, 0,186,253, 47, 0, 73,215,178, 35,
- 71, 17, 4,171,235,213,213,213,189,179, 94, 27,140,141, 4,103, 46, 72, 8, 9,137,131,101,249,226,131,205,137, 31,224, 15,252,
- 99,252,137,191,193,167,229, 0, 50,150, 49, 59, 59,253,168,174, 71, 58,162,125,155,195,104, 30, 93, 85,153, 17,149,153, 17,230,
-247, 63,126, 36,190, 21,179,252, 55,119, 35,242, 6,126,202,144,182, 12,138, 99,138, 95, 0,115,230,214, 77,118,107, 2,106,139,
-205, 41, 49,219,158,119,227, 0,225, 37, 6, 10, 47,120, 77, 38,242, 40, 74,244,141,178,197,182, 4,250, 74,119, 81,101, 0,205,
-189,204,244,131,115, 59,114,238,222,144,160,144,190, 78, 23,128,191,198,219,189,253, 16,191,180,233,225,135, 85, 22,132,240,181,
- 27,165,158, 65,116,215,196,192, 90, 2,157, 55, 88,140, 54, 72,216, 94,186, 27,160, 22,153, 2, 85,159,180,227,159, 50, 54,102,
-207,153, 13, 43, 62,244,166,209,245, 88,155, 96,211,184,215, 79,166,170,153,118,131,202,111,238,138, 37, 85,241, 22,193, 15,148,
- 68,134,164, 46, 94,249,181,164,206,141, 28,219,220, 87,192,214, 43, 91,230,182, 31,112, 28,168,222,103, 7, 56,195,185,118, 97,
-219, 12,169,108,208, 91, 35, 17, 48,244, 70,225, 4, 72, 89, 65,125,120,251,222,247, 82, 64,119, 19,120,152, 49, 8, 47, 28, 27,
-226,172, 68,208,133,144, 64, 76,108, 62,247,133,173, 26,136, 10,182,199,138,249,164,239,147, 95, 56,123,217,149,122,183,148,234,
-105, 42,108,174, 5, 84,139,254,127, 20,121,219,233, 50,146, 13,245, 4,202,209,108,131,221,169, 87, 21,178, 90,102, 31,238, 1,
- 98,230,132, 56,114,239, 65,121, 42, 56,150,231, 69, 47, 93,245, 12,141,194,169,145,187,113,228, 70,205, 51, 21, 11,158,253,240,
-104,252,251,223, 46, 87,247,128,247,174,189,246, 20,206, 18,234,207, 17,214,177,191,143,118,189,180,191,187, 51, 26,220, 6,188,
- 17,231,255,172,230,139,138, 73,233, 9,132,189,149,237,232, 66, 71,172, 60,185, 74,177, 6,170,127, 89,207, 4,138, 37,156,139,
- 92,211, 50, 10, 31,164,215,106,212, 68, 81, 50, 59, 27,125, 97,243, 79, 55,218,193, 83, 6,104,237, 17,225, 66, 13,180,138, 7,
-144,144,193,231, 66,249, 22,103,109, 71,193, 96, 71, 73, 94,252,178,163,249, 82,121,181,211,240,194, 1, 38,103,113, 84,235, 28,
-220, 53, 27, 0, 59, 63, 85, 29,177,200,149,189,181,120,228,134,109,210, 96,148,172,165,244,128,157, 17,208,156,142,204,115,161,
-116,186,211,238,132,228,230,134, 27,128,183,149,189, 5, 88,172, 9, 80,151, 18,179, 1,199, 55, 93,216, 46, 13, 60,223, 89,234,
-115, 25, 78, 1, 83,197,159,234, 34,148,129,228, 48, 50,168,193,136,247,179, 53,142,181, 87, 16, 89,206,185,214,225,139,188,169,
-229,198, 4, 70,164,189, 71, 44,216,168,170,103, 69, 76, 55, 87, 38,156,241,155,238,208, 29,210,216,188, 41, 43, 60,255,177, 82,
- 63, 98,147,238,152,173,221,121,187,100,144,195, 41,114, 36, 72, 4, 64,205,125,143, 3, 33, 73,165, 17, 91,203, 45,150,194, 91,
-177, 81,142, 58,145,255, 52,196, 71, 4, 39, 86, 98, 27,219,127,237,177, 14, 88,255,175,147,120,150,221,246,222,170, 99,248,187,
-157, 75,153,233, 4, 39,204, 59,180,164,196,247,114, 88,129, 11,207,154, 28,165,128,241,250, 16,175,210,212,232, 64,120, 63, 20,
-203,104, 92,218,168, 20, 97, 15,123,145,204,150, 54,218,235, 74, 85, 35,206,122,162,157,160,166,120,138,128,133,110, 31,107,254,
-203,134,143, 79,190,253,254,215,231, 63,191,254,237,151,209,143,195,181,156,226,233,205,155, 23,175, 94, 62, 81,234,109,190,189,
- 45,101, 69,100,109,155,194,190,204,115, 93,150,182,223,237,203,255, 82,102,202, 57, 52,156, 84, 36,153,129, 57,209,210, 33, 71,
-246,114,200,114,217,210,131, 65, 44,185,224, 9,176, 12, 66, 17,217,140,255,222,156,185, 50, 28,249,213,189, 27,141,251,166, 61,
-126,250,221,197,255,244,231,219,247,183,255,188,139, 95,209,105,217, 25,106,237, 0, 92,116,159,220,121,243,121, 52, 57,118,187,
-146,133,179, 68, 88,168,140,224, 73,247,141, 24,236,217, 1,201,167, 43, 38,139,146, 89,229, 9,246, 32, 58,116, 79, 7,216,156,
- 56, 66, 7, 70,134,116, 97,135, 54,132, 40, 5, 17,189,241, 22, 77,238, 87,170,150,179,229,106, 11,218, 78,204,161, 0,218,149,
-186, 96,121,231, 68, 71,175,176,181,104,140,225,168,216,228, 57,126,157,121,153,185,174,250, 60,121,196,108, 94, 91,210,130, 70,
- 35, 92,114,112, 68, 74,165,219,117, 35,210, 26,218,229, 78,165, 15,108, 50,169, 6,241, 36, 83, 62, 19,244,114,195,225,167,211,
- 31, 5,163,193,116,128,246,104, 89,236, 63, 11,192,209,181,236,200, 81, 4,193,122,119, 85,245,204, 24,176,145,216, 59,178,100,
- 36,206,112,227, 4,223,128,196,135,242, 17,190, 89,226,108, 35, 14,230,130,108,207, 78,119,215,187,136,232,211, 30,118,102,119,
-212,147,149, 25,145,149, 25,161,255,248,253,245, 72,108, 67, 1,231, 94,165,185,215,169, 59, 62,199, 65,125,217, 58, 46, 52,235,
-164,133,143,213,164,126,116, 64, 20,227,230, 20, 91,241,154, 77,226,171, 30, 28,104, 47, 52,158, 12, 96,160, 7,242,175,196,169,
-136,205, 2,224, 24,181, 34,212,151,192, 29,160, 30,217,154,255,194,187, 29,142,176,245, 6,202, 81, 51, 49,142, 26, 56,154, 72,
-156,202,114, 46,165,112, 21, 79, 95, 56, 68, 96,167,187,152,210, 87, 48,120, 84,206,137,108, 32,134,151,180, 76, 88,240,252,198,
- 96,126,142,161,207, 29,103,129, 14, 11,156,240, 82,134,179,226, 9, 8,223, 1,246, 52,125, 61,175,220,232,137,160,197,177, 83,
- 18,214, 33,249,180,185,128,223,225,104,119,113,143,138,218, 12,125, 38, 68,113, 59,119, 60,240, 25,251,169,232,174,244,134,116,
-130,231,200,206, 13, 56, 42, 21,115, 11,161, 89, 77,224, 84, 11,197,175, 29,119,217, 5,215,101,135, 62, 37, 89,249,147, 34, 42,
-180,113,160,172, 64, 1, 48, 71, 25,195,151,105, 64,143,122, 31, 96,120,243, 46,231,210,104,147,245, 60,122, 70, 9,228,100, 86,
- 59, 10, 74,211,248, 92, 81,166,169,228, 92, 43,120,157,236,245,211, 6,172,143,144, 73,114, 30, 19, 85,209,226, 69,237,145,102,
-121,112,244,123, 83,120,115,235,195,228,253,213, 29, 24,210,100,246,160, 51,142,104,104,118,183,156,143, 0,244,167,243,119,158,
- 42,196,215, 79,223,250,237,239,237,186, 91, 90,202, 82,121,195,116, 10, 6, 80,160,127,107, 72,155,224,141, 0, 53, 15, 61, 56,
-193,220, 91,166, 64, 49, 7, 34, 19, 16,237,195, 28,121,126, 58,232, 71,202, 21,197, 97, 82,117, 33,112,171, 11,105, 42, 83,149,
- 45, 72,164, 44, 28,124,239, 40, 35,107,164,239,142, 2,183,205, 72,142,120,164, 37,206, 68, 4, 56, 50, 2, 96, 65,178, 43, 96,
-107, 38,115, 25,208,129, 87,125, 69, 81,148,176,178, 23, 50,217,244, 20,160,131,168,200, 57,151,160, 79,172, 58,170, 35, 7,151,
- 92, 68,192, 3, 55, 13,105, 78,161, 94,246,200,125,231,177, 40, 80,245,192,173,135, 43, 55, 15,169, 85,187,176,113,217,233, 84,
- 21,132,137,125,198,114,201,182, 39, 63, 42, 37, 77, 69,138, 64,188,107, 80,163, 0, 22, 72,250,100, 52,207, 46,156,147,131, 87,
- 89,160, 41,188, 19,159,107,115,236,246, 35,182, 94,250,180,170,145,181, 71, 12, 59, 46, 73, 45,213, 92, 4, 42, 24,128,177,136,
-158,198, 74, 26,132,237, 54,188,225, 13, 3, 64,128,163,239, 23, 98, 30, 33,162,253, 1, 98, 72, 29, 0, 64, 63, 54,209,108,225,
-117, 97,177,217, 27,132, 75,168,146, 68, 95,206,148, 40,143, 68,243, 56, 57,206, 41, 0,206,252,209, 36,107,241, 43,232, 24,197,
-129,245,130, 58,243,130,243,139,175,118,109, 57,248,232, 67,229, 36,176, 65,236, 46,206,171,201,254, 91,102,107,209,130,116, 14,
-133,195,241, 66,169,206,207, 60, 80,168, 41,162,138, 34,173, 41, 77,226,121,111, 63, 17,167,149,171,203,220, 98, 37,191, 85,226,
-153, 19, 91, 50,245, 78,253,107, 41,206, 65, 27,186,103,253, 87,103,227,119, 78, 17,106,226,149, 58,211,169,171,192, 44, 47,169,
-143, 12,236,129, 47,109,255,220,242,191,122, 62,212, 98,126,120,243,253, 47, 63,255,244,235,111, 79, 79,223, 29,226,120,187,253,
-243, 1,100, 72, 82, 43,165,141, 61,117,144, 15, 0, 26,252, 11,228,193, 47,188,214,221, 19,193, 39,199, 31,128,236,240, 50,203,
- 1, 10,110, 22,156, 94, 40,156,114, 25,136, 44,170,236,198,174,210, 53,244, 27,119,192,163,211,155,247,214,107, 35,231,203, 55,
-223,232,235,143,127,190, 43,127,125,124,239,227,176, 40,217,185, 91,127,161,201,180,238,235,145, 58,103,164,187, 8,204, 39,129,
-187, 87,102, 87, 11, 47, 75,153,190,245,215, 87, 16,201,101,139,210,111, 55, 47,166,187,161,118, 75,239,240,215,249,160,113, 24,
- 34, 74,121,180,211, 34, 94, 13,229,189,233, 58, 57,235,222,184, 95,111, 93,209, 81,103, 51, 61, 42,226,112, 61, 3,179,210, 9,
-167, 23, 96,160,217,238, 45,217,125,185, 35, 76,218, 71,241,176,115,213,160,235, 99, 84,250, 3, 36, 64,199,173,150, 34,104,134,
-212,193,101,186,190, 4,154,107,131, 35, 17,208, 87, 54,173,251,188,196, 83,193, 77,210, 32,243, 25,191,176,187,216, 1, 92,169,
-117,142,120,146, 59, 71,237, 19,105, 88,255, 95, 0,146,206,157,199,114, 34, 10,194,221,110,191,218,246,189, 51, 27, 32, 2, 66,
-132, 68, 8, 33, 63,133,128,191, 74, 70,182, 33, 9, 18, 1,210,174, 52, 66,176, 90,198,215, 99,187,237,126, 80,159, 55,157,192,
- 99, 95,187,207,169, 58,221, 85,229,126,249,249,167, 88,216, 42,221, 4, 73, 87,242, 75,155,135, 43, 19,113, 53,196,180, 6,213,
-172,170,121,136, 17,167,169, 47,209,160, 1, 99,118, 89, 23,127,107, 38, 24,190, 94,126, 55,137, 77,246,193, 8, 66,124, 9,188,
-240, 14,136,224,196, 8, 15,212,108,186,198,138,218,138,147,223, 78,176,163, 11, 79,140, 14,200,189,221,243,104,243, 99,175, 55,
-161, 79, 45, 83, 79,112, 74, 36, 75,201, 33,232, 87, 35,107, 46, 9,115,168,202,158,194, 56, 36,193,100,149,239, 20, 4, 50, 99,
-227,133,156, 84,124,134, 62,219,241,196,216, 58,223,142,211, 30, 29,135,189, 90, 68,120,253, 46, 60, 93, 18, 41,107,222,223,115,
- 88,128, 49,245, 78,126, 33,172, 83,173,238,109, 47,111,105,199,155,183, 34, 73,103, 86,121,106,214, 29,203, 87, 19,121, 74, 52,
- 37,167,120, 34,155,247, 76,232, 24,220,163,181, 76,130,164,229, 26, 29,160, 77,177,151,231, 19,154, 27,236,165, 90,102,244,171,
- 21,223, 96,224, 91, 46,129, 44, 39, 62, 73,250, 21,169,206,145,197,100,253,219,250, 82,226, 39, 49,241, 28,242, 26,150,253,120,
- 96, 17,217,116,230,211,182, 20, 17, 66,203,201, 37, 33,180,124,245, 22,183, 90, 85,129,253,200,203,140,220,184,187,208, 40,138,
- 93, 6,134,164, 86, 79,213,138, 54,114, 20,157, 44, 76,143, 84, 17, 78,186,191,181,239, 42,250,177,153,143,135,107,126,248,254,
-171,238,223, 15,175,233,184, 31,189, 40,188,189,129, 75,117,145, 5, 1,172,209, 47,241, 8,135,238,126,251,172, 85,137, 53,211,
-113,217,100,158,252, 86,236,182,111,171,243,171, 57, 25,188,136,190,179, 55,129, 64, 70,184,197, 48,105,187,118,186,130,168, 3,
-155,112,248, 57,232, 71, 36,233,104, 17,184,193, 97,215,159, 43,127, 16,201, 18,106,241,181,157, 84,108,196,116, 6,130, 13,213,
- 91, 84,245,242,203,149,106, 87,217,133,168,177,166, 82, 29,209,215,164, 14, 36,138, 41,144,130,249, 13, 26, 82,108,123,252,165,
-138,112,194,203,174,187,199,170,231, 80,242,116, 51,238,222,228,213,213, 99,177,207,156,102,246, 73,168,249,178,169,232,155, 49,
-180, 71,237,180,200,171, 41,185,155, 64, 89,231,138, 19, 20,211,141,139, 6,162, 55,102,243, 21, 23, 9, 87,103, 20,159,195, 64,
-204,151,119, 56,173,185,169, 18, 46, 3,173,232, 94, 56,172,101,104,184,131,101, 34,162,187,111,153, 61, 98, 99, 71,216,167, 94,
- 76, 79,252, 32,166, 63, 14,219, 38,213,216,234, 36, 88, 54,138,245,218, 78, 87, 13, 86, 80,174,230, 9, 69, 45, 84,185, 98,155,
- 46,151,206,194, 48, 71, 64,190,191, 57, 4,231, 13,147, 62,164,167,194, 27, 66,102, 87,112, 64,205, 55,166, 38,134, 90, 76,215,
-197, 33, 30,231, 44,173, 39,206,245,243,123,133,118,224, 56,175, 80,135,106,141,254,195, 88,167,242, 84,244,165,106,209, 68,220,
- 45, 27, 4, 14, 15,110, 14, 35, 33, 82,183,176, 43, 22,243, 33, 32, 99, 37, 64, 40,109,142,125,165, 22,127,107, 55, 24, 80,205,
-127, 36, 90,170,204,208, 1, 60, 59, 8,230, 98,110,122,168,136,180,221, 16, 93, 71,136,245,121, 33,161,254,178, 17, 19,100,153,
-243,254,154,226,223,165,252,149,242,199,248,242, 71,250,252,143, 33,194,141,141, 28, 45,239,140, 97, 92,196,231, 82,176, 70, 72,
-181, 78, 2, 10,251,108,123,180, 74,237,241,234, 75,135, 56,168, 62, 73,122,103,180,110,219,208, 10,136, 85,254,185, 52,109, 60,
- 90,140,239,111,241, 48,183,170,249,218,213,171, 29,223,165,167,239,190,237,239, 63,254,250, 62,252,246,231,239,227, 29,121, 33,
-209, 99,117,179,152,177,126, 13,219,115, 74, 99,119,189,195,122, 86,197, 10,101,221,186,206,171,208,168,130, 91,162,183,106,204,
-233,206,179, 31, 38,116,168, 28, 34,253, 38,218,173,237,124, 87,183,162, 81,108,234,244, 19,163, 71,110,105,173,124, 55,179,135,
-172,183,236, 59,219,224,199, 80, 89,181,145,165,110, 67, 74,237,242, 37, 56, 52,182, 15,162,174,237,149, 35,233,231,116,246,162,
-219,156,223,167, 72,111,198, 99,118, 34,252, 22,146, 26, 98, 22, 58, 24, 14,180,130,250, 48,142, 42,207,103,231, 65,131,122, 23,
- 51,116,151,227, 78,111, 64,116, 21, 26,117,110, 17,231,172,135, 17,251,216, 76,192, 53, 90,173,217, 68,127,154,193,196,255, 5,
- 32,233,108,150,227,182,129, 32, 76, 0, 36, 0, 46,247, 71,178,236,139, 83,121, 2, 95,252, 40, 46,191,114, 78,121,135, 28,226,
-147, 43,149,131,203, 43, 45, 73, 16, 63,116,127,244, 69, 23,105,181, 36, 1,204,116,115,102,186,221,215, 47,159, 61, 86,122,107,
-159,117, 83,218,244, 93,138,227, 92, 30,104, 1, 91, 98, 82, 62,227,116,163,239,245,190,207,188, 71,218, 19, 97, 45, 14, 77, 57,
-177,155, 45, 31,113,230, 44,228,164,173,227, 73,245,186,182,164,123,228,170, 90,191, 9,252,235,252, 50,180,234, 86,179,137, 72,
-139, 67,221,177,228, 65,238,101, 96,203,139, 83,107, 37, 17,211, 57,149,252, 64, 58, 89, 28,147, 87, 41,190,241,202,255, 98,181,
-164,214, 8,158,104, 9,231,116, 14, 6,253,201,216, 7, 42,153, 74,249,110,192,111, 74, 89, 20,235, 36,220,144,123,161,183,172,
-157,101,235,165,235, 55, 5,254, 29, 85, 95,180,171,244, 32, 22, 55,156,186,137, 65,162,140,101, 98,221,205,219,208, 29, 98, 16,
- 59, 86,244,250, 21,218,182,136, 36,137, 64, 41,197, 4, 18, 1, 33, 92,176,136,236,184,185, 34,108, 67,183, 7, 77,205,104,188,
- 13, 74, 92,126, 78,138,101, 51,214,221,138,222,150,241, 60,226,153, 33,141,193, 99,109, 10,133, 46, 26, 29, 35,211,144, 89, 76,
-149, 89, 75,197, 96, 94,197, 27, 38, 64, 30,229,129,231,168,155, 25,189, 58, 28,130,149,189,151,215,130,233, 76,115,249,205,107,
-133, 59,177, 43, 44, 68,116, 87,162,141,138,156,233,170,163,167,147,104,211,233,238,238,102, 73,137, 19,131,116,173,190, 67, 16,
- 93, 28,102,161,171, 73,185,186,156,152, 66,255,244,199,203,203,247,255,214,107, 54,215,161,191,184,168, 43, 75,169,155,203,221,
-208, 56, 92, 82,135, 82,120, 20, 43,183,126,196, 12, 74, 87,167,208,154,114, 19,113, 94,223, 0,130, 76, 80, 11,138, 8, 55,237,
- 98,180,205, 15, 48,249, 13,213,139, 34,194,166,127, 35,222,165,101,243, 2,180,165, 49, 48, 52, 97,169, 45,236,181, 62,161, 83,
-203,235,108,218,244,178, 83,230,111,138, 27, 67,152,178, 78,111,137, 97,242,132,142,116, 60,181,253, 92, 4,101,246,154, 55,252,
- 77,135, 54,217,241, 55,124, 59, 17,207,152,123,125,182, 35, 54, 29, 17, 31, 19,234,253,163, 32, 22, 78, 88,169,226,155,215, 2,
-233, 8, 37,223,126,232,168,124, 22,191,122, 61,147, 81,164, 43, 68,166, 50, 5,243,170,125,191,225, 53,213,159,143,241, 89, 61,
- 46,157,171, 78,208,191, 20, 55, 46,103,101, 14, 51,210, 32,213,150,158, 94,210,158, 63,108,238, 62,236,227,245, 54,222,194,233,
-233, 67,120,121, 14,215,209, 93,111,211,245, 73,233, 64, 76, 94,123,145, 10,114,243,191,117,224, 42,182,126,250, 49,148,163,167,
-240,176, 50,162,148, 16,244, 53,198,141,130, 25,205, 7, 43, 50, 41,178, 23, 68, 68,142,114,166, 18,204, 32, 40,188, 29, 85,123,
-139, 28, 63,111, 44,168,222, 42, 28,193, 35,116,240,132,198,208,117,142,212, 64, 4, 45, 68,145,232,163,230,145,244,207,149,134,
-141,196, 56,170,115, 76,109,116, 13,165, 79,151, 34, 18, 55, 90, 34,241, 53, 90, 50,240, 90,195,232, 72, 11,188,224, 99,213,149,
-182, 10,150, 20,165,111,139,205, 17,106,130,173,189,118, 64,148,173,213, 21,251, 74,186,238, 16, 30, 65, 11,117, 63,204, 37,186,
-112, 76,145, 50, 27,181,211, 91,185,233,160,147,232,205,161, 76, 67, 97, 84,156, 78,105, 33,125,107,255,127,239, 30, 15,228, 91,
-248, 28,126,235, 14, 7,245,154, 93,163,194,132, 51,170,160,108,199,132, 59, 70,200,126,137,218,133,148,147,152, 77,212,226,105,
-219, 49,153, 92,118, 95,105,137,208,181, 36,175,100, 48, 77, 86,129, 20,125,242,119,125,155,194,243,159, 47,239, 63,126,250,251,
- 95,251,215,183,127,234,101, 14,195, 77, 39,196, 86,131, 12,172, 0,119, 17,231, 84, 44, 9,249,222,253,180,200,123,220, 60,202,
-117,140,121, 12, 27, 43,144,243,136, 67,117, 54,109, 26,199, 82,131,232,217,185,215, 18, 46,151,119, 31,252,134,244,163, 27,247,
-184,123, 37,195, 61, 78, 67,217,204, 20, 79,121,143, 12, 33, 42,225,104, 29, 16,184, 19, 96, 13,152, 81,109,117,201,139, 82,231,
-253, 21,141,168, 88,170,136,243,207,136,191, 74,223,175, 43,109, 15, 24,190, 34, 62, 91,211, 91,232, 7, 93, 98,195,140, 32,107,
- 99,204,140, 96, 48,180, 62,186,100,194,227,135,224,212, 70, 89, 83,201, 46, 85, 20,131, 78,194, 10,173, 42, 66,108,172, 6, 45,
-230, 5,235,235,168,173, 5,209, 7,185,253, 18,128,164, 43, 73,146,219, 6,130, 0,136,141, 91,183, 70, 91, 40, 66, 47,240,255,
- 95,160,147,255, 96, 71,248, 5,210,168, 23,130, 13, 98,117, 38,117,159, 24,178, 9, 84, 85, 38, 80,149,169,229,196, 43,150, 94,
- 56,240, 63,164,157, 38,207, 7,187, 26,245,138, 69,164,115,143,223,232, 95,163, 23,188, 82, 53, 29, 9,236,172,230,130,224,250,
- 24, 57,182, 73,248,208, 79,179,229,172,202,155, 19,224,132,207,207,222, 37, 0,151,212, 52,143,171, 90, 2,198,100, 3, 78, 70,
- 56, 33, 78,207, 70, 41,255, 42, 9,216, 33, 61,144,113,197,113,218, 92, 1,181,153,167, 8,159, 80,140,142, 72,127, 36,170, 12,
- 80,222, 21, 64,198, 76,254,248, 45,190,208,157,112, 38, 71,168, 3, 94,169, 2, 54,239,154,206,212, 6,101,208,227,201,196,147,
-207,146,157, 13, 78,216, 22,214,144,131, 3, 68, 89, 77,222,126,246,111,174,211,106, 51,236,175,202,134,140, 44, 95,187, 87,147,
-227,132, 52, 69,217,182, 76, 69,146,196, 3,152, 33,113,232,159, 53,245,102, 16,102,187, 46,227,217,161, 81,129,166,244, 31, 3,
- 16,172, 39,112,184,167,226,236, 82, 94, 43,240,188,236,247, 24,157,208, 43, 85,238,129, 98,111, 28,249,198,102,119, 57,109, 19,
-224,148, 42, 63,123, 15,128,108,248,207,168,240,219, 81,172, 0, 17,149, 37,108, 90, 55,159,233,142, 7, 26,117, 96,231, 63,115,
-245,160,187,210, 27, 58, 74, 35, 26,194,152, 0,139,221, 47,213, 22,222,178, 58, 69,157,230, 60,139,247, 39,167,128,144,212, 99,
-214, 62,123,132,225,160, 39,218,190,140, 77,220,187,100, 71,121, 41, 7,192,110,101,127,123, 21,120,166,161,202,125,201, 71,147,
- 1,107, 69, 43, 6,171,245,229, 14,110,213, 65, 12,217,245, 69,173,161, 30, 35,225, 63,202, 80, 43,242,126, 12, 67, 86, 35,216,
-124, 43, 15,132,195,131,134, 88,198,210,221, 14, 36,242,134,132, 84,179,213, 3, 62, 46,213,210,152,199,232, 79,205,121,111, 47,
- 98, 50,171, 3,255,141, 8, 77, 94, 17, 54, 85, 70,233, 27, 72,179,220,102, 26,165,202,205, 35,249,181, 81,176,219,125, 1,128,
-194,183,115, 44,171,188,187,199,111,173,156,153, 7, 75, 90,128,106, 80, 41,213, 65,147,132, 33, 30,150,154,191, 88, 69, 47,169,
- 4,101, 19,133, 4,129, 3,172, 96,182, 3, 39,178,185, 77,107,226,124, 2,224, 56, 24,131,230,222, 19,129,182, 41,216,131, 52,
-129,147, 34,142,169, 80,192, 87,205,197,143,181, 63, 40,178,132,236,227,102,201,198,185,158,121,242, 88,205,135,197, 12, 87, 59,
-139,105,124,123, 19,139,192, 14, 21,212, 88,113,191,187, 8, 55, 82,106,188,129,141, 40, 80,113,249,104,196,119,201, 57, 29,117,
- 71, 89, 22,225,104,113,217, 31,247, 70, 93,220,152,193, 22,217, 54,237,197,190, 35,175,171, 36,139,237, 94, 35,180,117,137, 94,
-216, 64,144,148,228, 49, 94,176,101,106,189, 42,251,206, 73, 8,118,100,139,115, 24, 63,247,165, 82, 50, 41,102,158, 96,174,168,
-252, 40, 29,150,206,144, 11, 88, 5, 22, 32, 21, 30, 52,153,254, 16,154,252,198,244, 40, 65,233,217,141,144,138,154, 14,185,179,
- 31,134,198, 21,181, 32, 47, 23,142,188, 19, 22, 82,191, 39,233,188,179,117,204, 44,166,238, 5,105,129,200,177,160, 32,157,224,
- 58, 3,181, 9, 5,200, 56,122,142, 0,249,131,102, 33,150,119, 42, 84,246,226,105,178,227, 22,153, 73, 40, 0, 10, 68,212,212,
- 30,234,211,121,224,211,196,251,141,214,201,129, 77, 12,188,246, 58,199, 13, 21, 5,243, 58,173,167,176, 34,149,207,162,231,143,
-175,244,197,109,167,172,240,175, 62, 77, 54, 9,114, 42,225,212,150,183,193,210,155, 14,127, 15,176, 57, 37,124, 13, 61, 92, 42,
-165, 84,198, 17, 97,102,123,188, 78,151,207,211, 95,127,255, 99,127,252,251, 95,247,245, 90,222,128, 66, 35, 98, 17,123, 43, 29,
-106,166,229, 28,147, 14,176, 14, 80,255, 70,171,174,151, 49,149, 77,239,105, 48,115,121, 77, 38,189,166, 15, 62, 93, 81,218,170,
- 86, 22,159, 51,207, 40, 67,222,120,247,196,130, 82, 31,117,104, 26, 47,252,213, 15,248, 37,151,218,143,189,158, 42, 68, 61,186,
-248,122, 56, 84,175,228, 90, 91, 57,138,170,144, 36, 62, 77,110,167,250,231,227,194,118, 86,196,126, 3,180,156,195,158,244,216,
-118,112, 37,145, 34,121, 97, 79, 50,176, 93, 18,196,181,169, 81,134,199, 48,212, 16,230,105, 76, 73,119, 25, 51,217,245, 81,197,
-156,236, 94,176, 55,196,246,172,107,161,236, 76,178,121, 24, 98, 10,158, 19,243, 52, 6, 25,182, 87, 86,128, 40, 40,153,181,255,
- 47, 0, 73, 87,178,219,198, 17, 5,123,122,153,158,141,155, 69,217,200, 33,129,129, 32, 31,144,255,191,249, 11,146, 75, 2,228,
-224, 0, 57, 88, 14, 44, 90,228,144,179,244,158,170,201, 81, 18, 8,177,123,222,188, 87,245,182,210, 7,238,250,225, 38, 78, 93,
- 69,219,104,183, 20, 86, 69,159,218, 85, 44, 8,176,205,154, 35,103, 37, 82,219, 53, 25, 52,107, 31,173, 89,244,163, 94,224, 38,
- 58, 54,148, 11,139, 15,110, 99,138,197,214,218,168,107,165,224,165,251, 33,195,145,209,187,100,160,100,184,119, 41, 57, 79,120,
-168,139, 95, 88,190,220,122, 16, 57, 83, 77, 17,172,219,228,213, 41,198,165,112, 44, 88,159,220,169, 24,199,109, 30, 51,144,161,
-231,134, 16,170, 32,226,212, 53, 40, 56,240,239, 37,102, 48, 2, 66,130,123,238,218,192,202,253,169, 44, 56, 37, 2, 42,128, 63,
- 76, 71, 92, 74,104,101,106, 17, 89, 92,253, 20,214,111,177,223,165,120,179,176, 91, 24,123,218,129, 35,205, 75, 3,239,193,129,
-166,218,113,252,179,241,184,152, 57, 27,174,117, 97,195, 96,222, 58, 42,153,127,100, 77, 45,192,244,170, 93, 53,174,226, 88, 52,
- 46, 72,139, 13,195,114, 5, 98,172, 41, 39, 66,105,172, 38,137,166, 1, 40,149,234,123, 98, 25,172,224, 42,185,106, 59, 52, 12,
- 19, 19, 76,195, 49, 80,233,217,133,134,115,175,125,152, 47, 75,184, 42, 49,192, 66,189, 11,111,235, 29,247, 73,190, 76,244,173,
-217,206,123,139,240, 70, 84,241, 54, 41, 61,252, 80, 7,127,176,142,195,200,176,128,200, 69,150, 76,100, 11,132,107,143,235,192,
-219,187,122,248,239,210,107, 19, 57,228, 38, 17,184, 76,185,135,160,147,189,178,148,119,207,106, 8,158,237,191,227, 36,106,149,
-159, 17,179,180,222,202,184,234,182,227, 76, 29,243,118,149,156, 46,161,117,248, 10,242,206, 74,165,160,210, 41,252,128, 76,211,
-119,207,242, 13, 16, 97,102,151,158,136, 98,157,248, 29,244,187, 64, 29,163,204,156, 30,130, 97, 94,104,139, 65,108, 49, 32,193,
-223,178, 21,160,162, 6,132, 98,163,237, 67,227, 45, 51, 92, 27,144, 41, 40,138,151,139,107,255,140,230,232,109, 2,142,222,213,
-228, 12,120, 2,184, 9,219,129,101,217, 61,255, 78, 45,243, 28,129, 81,249,111,224,186, 58,188, 45,199, 62, 49,123,147, 56,166,
- 18, 17,217,225,122,130,236,106,144, 51,123,140, 34,239,148,179,121, 23,155,224, 40, 37, 5, 70,150, 1,133, 50,120,140,169,216,
- 25,239, 17,245,117,182,212, 78, 92,149,115,149,164, 86, 11, 28,188,172, 70,211, 29,247,125, 28, 14,189,218,127,164,147,226,120,
- 81,251,237,229,245,183,223,221,159, 47,243, 95,255,252,241,229,235, 69,172,175,240,207,215, 47,234,190, 51,128,147,167,168, 58,
-235,250,214,244,231,253,243,241,221,241,252,254,167,131,249,245,135,247, 31,127,105,135,167, 29, 51, 27,164, 69, 15, 65,133,221,
- 34,220, 87, 74, 49, 93,129, 94,118, 0,142,169,165,237,120,209,112,239, 90,101, 15,176,106, 91,169,254,131,148,123,196, 76, 1,
- 32, 44, 7,214,205, 56, 76, 53,176, 56,167, 71,208,106, 66,104,144,147,252,255, 46,207, 64, 17, 28,254, 24,105,188, 99, 73,235,
-231,233, 58,222,166,171,121,243, 9,134, 78,231,137,167, 54,212,116,220,192, 48,160, 16,153, 57,209, 85,178, 91,190,202, 27, 25,
-173, 99,203, 22, 26, 46,202,187,114, 70,196, 90,207, 94,254,150, 37,119,255,240,218, 20,202, 42, 45, 56,173, 93,250,104, 94, 57,
- 10, 11,206, 47,210,150, 64,225,226,188, 73,187, 1,116, 95, 80,222,195, 37,124, 97,177,165, 87,198,106, 91, 67, 20, 84,151, 17,
-106,210, 70,151,139,107,168,167,133, 96, 3,183, 36, 19,128, 39,184, 60,224, 62, 5,241,188,133, 47,214, 51, 19,144,176,165,212,
- 71, 93,171,227,155,117,173, 94, 77,233, 99,181, 14,176,249, 20,134, 34,199, 26,129, 5,118, 89, 53,170, 57,159,206, 63,255,248,
-247,203,135, 79,159,255, 21,213,250, 12, 67, 81,253, 21,193,175, 15,126, 65, 4, 79, 64,119,243, 29,158, 24, 55,161,128,142, 17,
- 54,135,164, 22, 68, 97,205,209,135,196,199, 79,130,252, 8,100, 80, 82,135,116,151,122, 72, 45, 14,100,116,107, 30,210, 29,217,
- 88,107,135, 98, 39,233, 18,115,163,133, 75, 66,113,108,181,184, 56,216, 16, 42, 4, 4, 95, 44, 47,109,153, 23,171,224,236,114,
- 21,184,251,164, 22, 19, 32, 54, 69, 11,185, 79, 19,176, 99,162,122,182,111,124,179,206, 32, 2, 44,140, 55, 75,192,137, 91,165,
-173, 80,183, 10, 16, 20,191,142,102,214, 14,216,149,212, 37, 61, 74, 59,143, 54,229,144,122, 0,121,202,239,140,204,184, 3,161,
-117,220, 94, 61, 71,142, 10,103, 49,172,182,126,228,187,116,203,185,252, 39, 0, 71,215,182, 35, 55, 17, 68,251,222,109,123,238,
-203,102, 73, 8, 36, 18, 72,252,255, 47,240, 3, 8, 9,133,135, 60,128,208, 66,200, 64,118, 61, 59,118,187,187,221, 23, 78,205,
-195,104,164,209,140,173, 30,187, 78,157,211,174, 58, 5,141,106,107, 39, 0,187, 26,137,120, 73, 55, 35,152,164,155,141,151,100,
- 16, 60,214, 60, 23, 48,132, 69,227,223, 4,169,155,109,160,185,105,173,163, 73,118, 0, 68,219,175,117, 1, 91,222,186, 8,109,
-122,220,117,118, 5, 77, 51,118,126,169,167,172,249,110, 41,214,123, 37,201,168, 48, 0,189,243, 43,166, 3,245,234, 24,196,105,
- 40,252, 11,195,133,220,176,176, 6,145,233, 25,154,156, 82, 27,104, 70, 14,141, 28, 52,213, 43, 50,116, 3,164,229, 91, 39, 13,
-178,174, 82,248,105, 40,113,147, 9,160,188,220,151,177,118, 6,188, 0,185, 11,217, 5, 49, 30, 72, 4, 48, 0, 72, 15, 52,127,
-209,113, 22, 84, 33,115,168, 98, 0,255, 38,227,175,237,178, 82,171, 42, 91,237, 80,171,154,200,145,152,201, 14,236,194, 65,218,
-151,220, 22,165,104, 47,151,204,151, 64, 2,161,207,253,130, 43, 82, 54,139,155,174, 12,164, 98,106,234, 30, 76,207,130,225, 34,
- 69,145, 13,147, 27, 59,101,242,101, 87, 15,130, 13,142, 50,241, 68,181, 44,100,175, 13,189,210, 46,139,225,235, 76, 69,247,185,
-229, 18,218,244, 18, 20, 78, 5, 86,180,232,108,163,240,136,121,233,129,174, 59,220,242, 98,156,178,166,225, 23, 96, 70,235,148,
-130, 12,134,187, 78,180, 67,178, 88,242,228,231,141, 90,175,182,172,163, 2,106, 67,168,246,154,140,155,201, 33,104, 72,228,128,
-102,100, 20,108, 57,185,250,185, 82,109,169,109, 39,211, 23, 8, 55,139, 48, 16,243, 53,127,126,122,254,177,128,252,144,107,111,
-164, 89,165,162,223,201, 92,105,184,138, 88, 52,109,174,234,128,243, 47, 61, 67, 36,210, 80, 97, 41,210,192,247, 65, 92,205, 26,
-183,194, 45,141,199,188,112,114,116, 32,127,133, 29,162,160,109,207,105, 54, 6,228,128,234,206,122,106,177,224, 58,237, 25,185,
-151, 35,142, 32, 9, 0,101,121,177, 88, 49,205,125, 48, 32,173, 34,132, 66,206,125,132,231, 38,105,234,145,147, 8,187, 64, 13,
- 2,212, 9, 54,103, 34,130, 23, 14,149, 69,207, 33, 54, 26,242,142,188,187,152, 70,170,217,128,242, 12,174, 3, 79, 2, 17,137,
- 76,116, 86,166, 99,237, 38, 97,168, 93, 60,107, 83, 45,245, 69, 67,105, 27, 7,162, 64,205,103,212,232, 38,185,234,212, 6, 7,
- 72, 61,200,103, 79,128, 2,145, 27,185,113,197,104,139,163, 88,182, 31,246, 95,245,224,197,223, 49,254,245,244,105,250, 48, 94,
-255,250, 61, 63,254,246,243, 47, 31,211,167,165,254, 59,254,173, 51,114,160,109, 71,223,119,198,245, 22, 75, 51,239,248,107,219,
- 81,245, 56, 80, 38,241,151,194,211,121, 42,143, 23,171,254, 68, 56,181, 39,149,143,114,216,222,189,213,252,237, 67,247,230,245,
-112,255, 48, 32,245,222,157, 78,135,227,129,251, 56,236,128,127,102,127, 0, 79, 50,221,173, 60, 25, 23,109,126, 58,215,106,114,
-220,156, 47,208,248,230,146,174,235, 37,125,241, 35,209,101,255,232, 95,216,127, 79,126,202,237,234,169,218, 54,202, 84,195, 80,
-236,106,120, 80,245,160,202,242,195, 55,253,241,180,253,254,253,221,221,240,254,219,119, 33,253, 51,142,243, 71, 63, 94,145,119,
-235,137,175,163, 97,146, 12,111, 86, 13, 38, 97, 57,248, 70, 5, 67,195, 29, 66,227, 29,245, 85,209,128,112, 23, 37,209, 87,106,
- 97, 21,120, 93,215,220, 21, 8,146,122,146,181,111,194,173, 64, 48,113, 81,228,120, 69, 54,178,144,217,237, 70,194, 20,201, 4,
- 21,193,176,169, 51, 59,208,118, 25,211, 81,220, 4, 40, 20, 29,203,184,113, 17,155, 27,230,102, 44, 52,129, 71, 1, 85,174, 28,
- 12,132, 71,234,192,194,161,146, 33, 83, 79, 33, 45, 4,116, 69,148, 84, 7,217,120,164, 98,140,166,143, 60, 42,160, 4,153, 94,
-155,173, 38,207, 63,160,144, 4,129, 20,194,241,221,158,223,191,122,248,245,143, 55, 63,125, 56, 79,246, 60,108,182, 84,148,128,
-127, 52, 33, 74,101,243,246,185, 35, 75,126, 42, 69,151,253,228,249,192,150,117, 91,207,161,211,157,219,250,136, 91,141,198, 82,
-145,103,133, 82, 67,195,155, 67, 30, 57, 21,136, 84,196,151,166,249,244,197, 88,218,113,112, 34,117, 84,168, 4,149,123,191,154,
- 66,110, 37, 88,136,238,165,216,164, 30, 10, 58, 38, 26, 2, 82,188,162,162,228, 38,161,111,157, 78, 81, 83, 1,113,245,218, 11,
- 41,157,199,138, 37,247,161,172,126,148, 14,208, 85, 39, 61, 38, 86, 99,235,240, 93, 64, 16, 68,161,207, 17,113,243,210,158, 91,
-181, 42,139,104,102, 92, 18,124,170,131,148, 12,231, 0,119,203,185, 34,113, 83,217,104, 91,235,101,109,131, 0,244, 32,127, 36,
- 80,209,231,219, 86,234,148,255, 23,128,164,107,217,117,164,134,130,182,219,110,187,159, 73,110,224, 10, 33, 64,108,216, 32,205,
-138, 37,252, 58, 11,118, 8,205, 15,160, 1,193, 8,105,196,157,153,123, 39,175,238,118,251,209,166, 42,236,162, 36,138,210,109,
-159,115,170,220,167,234,104, 95,183,126,210,141,189,196,240,105, 45,219, 32,129,103, 28,104,228,160,228,181, 10, 39,154,163,201,
- 26,213,109,197, 77,207, 7,172, 1, 46, 88,223,181,121,236,179,172, 0,229, 34,245, 71,118,232,214, 92,102, 49, 13, 26, 1,220,
-230, 3,170,206,162, 22,132, 41, 37,116,244, 82,173, 59,127, 67, 73,247, 32,124,242,127, 48,241,108,122,167,129,184,172, 73,171,
-178,108, 51,156,125,146, 61,229,207,199, 69,214, 10,160, 23, 20,177, 2, 1, 55, 13,170, 58,117, 33,116,156, 72,165,119, 64,252,
-160, 65, 50,222,248, 16, 94, 25,233,103,105,145, 46, 15,211, 42,155,109,176,160, 50,168, 63,203, 89, 2,143,232,170,151,231,133,
-210,199, 29,184, 98,213, 77,245,199, 80,215,253,166,183, 75, 20, 95,138,246,202, 14,164, 9,137,173, 71, 26,110, 80, 19,177, 26,
-128,209,156,247,117, 3,242,246, 60, 78, 65,198, 19,115, 56,226,170,241, 21,147, 22,100, 82,182, 57,224, 83,145, 26,161,123,186,
- 51, 97,179,191,188,199,230,173,233, 91, 98,124, 7, 72,176, 97, 15, 1,111,110,145,174, 27,216,237,105, 38,217, 86, 46,225,125,
-141,229,205,109, 90,159,154, 43, 24,234,176,173, 87,118,227, 39,185,200,123,141,107,243,109, 74,123,100, 96,176,179,230, 60,209,
-137, 19,127,101, 19,102,222, 64,130,162,141, 26,228,124,126,113,159, 81, 45,180,229, 75, 86,124, 26,166, 74, 42,211, 57,247,216,
-160, 72,199,177,154,114,226,108, 68,246,130,235, 24, 55,103, 1,133,128, 44, 30,212,252,177,205,213, 52,170,157, 81, 51,251, 9,
- 19,207, 21, 81,153,244,138,139,118,183, 2,128, 49,131, 69,176,121,175,226,172,143,194, 31,144, 52, 61,204,247,217,172,165,220,
- 18,152,210,210,108, 23,205, 30,204, 77,175,142,110,191, 91, 61,227,170, 68, 2,216,174, 45,187, 71, 10, 16, 25, 0,160, 6,228,
- 2, 4, 84,106,176,124,152,161,228, 49, 91, 90,186,219, 37, 58,124, 89, 2,255,128, 62,182, 21,237, 53,171,132, 68, 6, 24, 2,
- 12, 59, 29,104,122,125, 1,255,198,122, 24,206,103,161, 86,181, 74,118,203, 76,181,172,254, 73, 87,186,152,171,112,200, 33,202,
-152,154, 6, 87, 74,183, 1,176, 13, 59,182, 7,143,226,145,183,241, 74,130,214, 74,227,157, 70,180,116,105, 16,195,126,236,143,
-118,208, 35, 80, 76,143,212,147,188, 63,133,229,215, 63,222,255,242,231,167,183,191,191,126,247,247,245, 36,238,120, 42,205, 85,
- 99, 59,167,187,241,110,236, 29,187,104, 53, 48, 81, 10,105,223, 37, 53,234,228, 13, 21,204,123, 61, 7,179, 7,129, 71, 68,211,
-194,162,202,114, 87,210,226,251,146,162,127, 51,133,167,191, 78,191,129,219,186,156,159, 77,103, 66,101, 76,252, 34, 30,133, 84,
-139,182, 59,189,142,139, 61, 1, 46,136, 21,101,227,124,219,123,142,152,184,116,132, 92,129,246, 92,243,213, 87,157,232,116,190,
- 90, 96,244,198,234,177, 88,193,209, 23, 0,152, 2,244,117,229,112,150, 11, 39,198,172,207,239,252,203,155,234,248,186,195,186,
-253,248,195,247, 63,125,247,237,231,223, 60, 60,126,157,230, 15,111, 95,206, 79, 82,242,190,243,164, 1,249, 92,183,177,189, 75,
- 88,214,137,150,145,236, 49,194, 7,181,138, 85,185, 82,126, 16, 43,111, 26, 58,167,134, 80, 76, 91,230,147,104, 26, 14,229, 48,
- 36, 29, 89,219, 26,247, 90,113,196, 31,245,223,160,120,114, 1,203, 88,178, 26,105,211,215,114,208, 1,157, 66,103, 85,144,125,
-234,187,200,196, 4,145,188, 90,169,146,189, 51, 83, 1, 32,148, 17,220, 8, 16, 33,211,140,229, 51, 52,108,163, 61,167,116,110,
- 80,168, 49,236,217,195, 90,187,240,168, 76,160, 64, 96,189,173,226,223,100,199, 58,205, 82, 13,109, 26,183,118,175,190,122,124,
-248,103,123,245,243,243,229, 54,222, 90, 18, 57,132,165, 59, 45,192,207, 35,211, 68, 45,196,125, 74, 48,248,221,161, 79,190,196,
-164, 76,180, 14, 52, 83, 7,191, 32,220, 93,187, 77,161, 71,176, 26,197, 9,102,197,134,187,108, 73,217,193,178, 61,136, 98, 49,
-182,128,182,131, 14, 40,108,128,134,147,202,224,159,101, 86,166, 81, 86, 69,225, 51,181,248, 31, 68,222,173, 93, 97,175,241, 74,
-191, 72,113, 45, 28, 92, 22,136, 56,242,173, 45, 53, 94, 76, 83,244,142,246,142, 77,109,178,137,230,185,246, 61,194,165,172,105,
- 91,149,199, 13, 11,148, 19, 86, 79, 78,237, 3, 29, 11,193,216, 57,236, 25,181,177, 84,151, 21,168, 5, 25,157,174,218, 88,148,
- 76, 49,190,224, 41,131,147,147, 37, 57,116,243,172,228,150, 15,209,129, 22, 92,245,127, 2,112,116, 45,203,113, 20, 65,176,167,
-159,243,218, 93, 45,146,176,130, 27, 23, 2, 56,249, 3,252,235,220, 57, 16, 56,194,192, 1,130, 8, 28, 1, 7,217,152,181,102,
-118, 94,221,211, 15, 50,247,168,203, 72,234,174,174,202,236,174,202, 68,105, 3, 65,198, 31,138,227,244,136,124, 26,229, 78, 13,
-160,117, 91,239,123, 42,220, 0,195, 94,103,124, 5, 24, 25, 21,105,232, 35,170,103,125,177,190, 54,170,183,167, 67, 1,127,204,
-173,161, 69, 70,131, 18, 61, 27,123,166,217,237, 52,115,248, 61, 82,199,115, 28,217,220,109, 58,160, 55,111,241,249, 13,144, 61,
-249, 80,153, 74,182,170,169,203,117, 80,233,190, 85, 99, 0,223, 14,150, 67, 65, 6,219,179,163, 20, 33,111,128,138, 86,149, 43,
- 84, 67,186,230,210,121,138,137,172,247,149,186,122,255,119,108,187,163,241, 65, 31,241,123, 59,195, 44, 97, 55, 4,207, 32,105,
-137,216, 4, 42, 41,105,117, 9,251,153,106,169,163, 46,192, 55,221, 2,212, 29,102, 96,173,147,106, 61,240,189, 7, 12,222,250,
- 10,204, 10,140,204,239, 13,219,228,138, 94, 5,149,184,236, 85, 30,232,162, 73,138,161,139, 34,237, 64,125, 85, 20, 25,166,186,
-152, 64, 46,194,145,138,238, 54,136, 48, 42,113,226,165, 65, 86, 29,246,108,165,130, 27, 39,153,132,195,105,151,145, 66,205,168,
-255,253, 26, 71,134,244, 62,173,124,108,243,195, 54,128,212, 76, 7,123,229, 32,169,103, 39, 61,200,136,103,227,142,231,125,153,
- 90,123,187,233,170, 3,109,205,235,121,210, 99,141,120, 81, 93,236,233,143,238,194,178,183,101,163,129, 38,142, 88,139, 8,181,
-128, 54,116, 51,228,212,106,166,229, 44, 7,212,232,179,209,114, 28, 26, 64,141, 34, 92,211, 39, 85, 29,219,224, 61, 31,147, 62,
- 37, 20,246,157,214, 45,182,208,252, 5,177,147,168, 58,227,248,224,196, 55,119,128,177,144,252,146, 15,160,178, 47, 21,144,227,
- 6, 44,132,136,218,145, 36, 40, 85,147,182,100,111, 19, 52, 67, 20,239,185,222, 68,231, 89,153, 3,242, 14,219, 87,215,196, 21,
-171,162,207, 53,159,129,240,101, 44,154,246, 23,224, 20, 89, 44,253,157,179, 30,122,202,164,178,111, 29, 72,214,226,120,103, 58,
- 86, 15, 62,116,157, 65,100,233, 96,119, 20, 64,123,243,189, 66,214,232,216,112,137,170, 79,247, 88, 96,151,104, 56,213,162,119,
-167, 52,167,235,114, 11,168, 46,168, 48, 69, 65,144, 74,124,198,210,105, 73, 99,164,206, 90,171, 85,131, 36,125, 62, 8, 42,189,
-239,105,150,239,255,202, 63,255,250,159,255,252,239,187,223, 47,191, 61,143, 31,253,116,186,200,197, 25,208,187,165, 62,246,189,
-123,133,255, 77, 60,165, 62,177, 89, 82,245, 82,206,210,174,206,144, 55,131, 50,205,149,209, 89,190,236,124,243,111,159,181, 51,
-187,199, 81, 66,161, 13, 71,182,114, 62,149, 41, 96,241,143,117,154, 80,122,246, 47, 0,114,220, 3,162,252,171,168, 13, 5,244,
-231,189,145, 75,189,220,197, 43, 98,232,170, 15,128, 34,245,182, 78,200, 42,219,248,168,124, 48,136, 41,227,183,182,178,192,159,
- 7,239,106,108,162,236, 41, 68, 16,252, 72,107,244, 4, 88,201,241,201, 74, 28, 15, 10, 0,207, 86, 42,244,202,201, 59,251, 32,
-205,203, 60, 47,254,199,183, 63,253,242,238,109,123,247,234,205,119,223,190,254,230,251,167,254,235,189,255, 48,132,127,230, 15,
- 99,162,112, 89, 42,246,232, 42,159, 77, 23,105,240,113,229, 64, 26,170,166,183, 85, 79,183, 78,177,154,244, 34,242, 77, 74, 2,
-217, 69,214, 37, 48,165, 1, 38,105,112, 31,185,224,199, 72,220,135,173, 28, 18,135, 40, 65, 12,204,173, 91,140,237, 20,124,115,
- 43,124,176, 42,209,210, 89,140,131,118, 19, 71, 5, 35,231,225,193,194,121, 73, 19,227,206, 9, 59,234,157,128, 68, 25, 49, 75,
-234, 24, 37, 94,222,238, 46, 4, 33, 60, 88,110, 67,201, 86, 67,203, 99, 49, 3, 75, 62,234,180, 56,217,166,154,114,218, 13, 8,
-254,151,119, 15,207,249,245, 15,127,212, 31,151, 63, 27,215,226, 96,230,141,102, 77,198,212,179, 44, 0,172,185,207, 37,197, 92,
-165,254,180, 51, 43, 55,134, 21,150,238,137,108,227,245, 62, 30,129, 36,107,186,111, 57,153,214,212, 25,138,209, 83,225, 66, 44,
-156,188,243,249,212, 3,241,103,142,159, 20, 1, 86,153,219,230,172, 8,169,132, 78,183,252,128,212, 84, 54,133,154,199, 35, 74,
-191, 60,190, 68,123,138,223, 99, 87,108,112, 89, 43, 68,252, 94, 9, 15,138, 89,216, 96,152, 74, 92,146,176, 28, 63,164,184,120,
- 66,198, 83, 96,169, 70, 3, 23, 83, 11, 34,219, 13,172, 10, 71, 70,114, 38,127,150,121,189, 93, 27,173, 40,106,165, 43, 46,147,
-113,183,236,159,136, 69, 34,159, 68, 33, 34,226, 73,111,161, 99,223, 22, 40, 17,152, 82, 84,255, 11,192,209,181,236,216, 77, 68,
-193,182,187,219,238,246,189,190, 30, 6, 72,102, 68,148, 69,196, 46, 34, 72, 89, 34, 62, 1,241, 13, 32,177,224, 55,216,177,227,
- 51, 16, 75,216, 68,172,120,111, 32,201, 2, 9, 69, 17, 8, 33, 33, 22, 48, 25,184,115,253,104,187, 31,110,170, 60,251,171,177,
-219,221,117,170,236,115,170, 84,153,207,237,193, 59, 96,105,156, 14, 64,161,101, 25,230,196,180, 34, 60,161,200,118,249,168, 14,
-154, 65, 66, 89,158,103, 59,111, 81, 88, 47,131,176, 65,237,133,151,214,108,132,194, 3, 41,168, 49,152, 12,239,109, 15, 8, 14,
-116, 45, 98,219, 56, 22,239, 96,106,208, 31,126, 25,208,222, 55,122, 1, 5, 47, 67, 5, 37, 15, 85,174,124,153,199,218,201, 2,
- 52, 37,150,180, 77,221, 65,100, 0, 71,163, 72, 45,179, 97,246, 16, 71,162,154, 20, 46,102, 23, 1,229,165,242,178,155, 53,120,
- 12,254,156, 42,106, 89,249, 42,149,192,216,209, 69,190,164, 17,146, 89,141,237,136, 10, 49,174, 76,247,157,117,178, 39,148,172,
- 43, 89,220, 34,173,132,130,202,181, 27,214,222,119,218, 92, 85,184, 76,139,199,190,212,193, 22, 32,137,107, 15,142, 92, 46, 45,
-174, 99,130,174, 99,231,116, 41, 91,191,133, 35,245,217,236, 61,227, 59, 33,144, 56,165,144,148, 14,153,147, 82, 40, 5, 69, 3,
-226, 51,231, 5,139, 52,122, 72, 57,156,125,190,237,203,121,107,133,145,142,134,253, 69,242,120, 16, 17,224,233,167,232, 11,239,
-174, 93,152,138,109,234,184,240,203, 20, 0, 14,235, 78, 38, 70,241,205, 55,168, 53,102,161,149, 25, 86,240, 36,198, 85, 30, 20,
- 59,209,146,219, 62, 80, 45,161,206,163, 53,102,170, 3,235,200, 41, 52, 13,199, 6, 22, 90, 38,201, 14,204, 29, 56, 95,203,221,
- 44,243,158,241,136, 97, 20,219,204, 61, 0, 42,246, 70,140,166,241,127,151,122,151, 45,174, 89,177,255,113, 41,183,147, 24,152,
- 30,159,169, 11,146,167,219,186, 50,138,111,158, 87,171,110,134, 16, 80,151, 44,199, 29,135, 0,120, 92, 25, 66, 18,216,196,145,
-117, 24, 11, 54, 21, 64, 25, 66,145, 90,108, 78, 90,219,167,113,170, 6,156,222,195,116,134,139,139,154, 89,174, 56, 10, 34, 74,
-212,147,134,109, 89, 64,103, 59,243,237, 39,205,221,176,221,192, 71,249, 8, 57,223,195,174,197,162,173,156, 17, 14,144,113, 58,
- 52, 22,148, 94,112, 92,176, 22, 21, 22, 48,243,115, 99,228,110,175,235,133,243,122, 21, 99, 11, 44,132,152, 26,182,161,245,181,
-188,104, 59, 93, 3,160, 81,110,203,117, 39,204, 30, 36, 97,154,221,213,168,158,252,114,243,248,241,191,207,254, 24,175,242, 95,
-227, 63,241,183,211, 9, 60,163, 49,117,211,172,180, 70,189,213, 53,123,223,101, 6,246, 13, 45, 88,177,172,153, 26,206,200,244,
-100, 80, 61,170,105,158,109, 65,131, 27, 99, 2,237, 69,146,153, 45, 71,100, 67, 43,146,165,179, 80,128,234, 26,164,142,217,184,
- 24,109,155, 86,218, 14, 49,252, 16,168, 0,185,186,112,114,114,237, 95, 77,154,153, 62,202, 50,219, 83, 69,240,187,157,160, 95,
-130, 97,143,249, 66,111,154,172, 42,123, 4,143, 16, 67,226, 75, 41,181, 99,244,252,120,237,167,198,159, 87,244,106, 55, 11, 59,
-152,140,214,115, 76,219,208, 50, 13,160,132, 43, 44,249, 77,147,154,238,162,141, 51,177, 98,185, 41, 94,124,241,244,171,111,158,
-157, 63,184,127,231,225,221,123,119,111,159,139,203, 63,143, 47,142,167,227,180, 6,192, 83,142, 3, 29,254, 50,128,235, 76, 21,
-125,244,102, 22,216, 6, 56,219, 52,112, 83, 12, 48, 13, 96,213, 74, 67,123,133, 92,147,157,114,248,155,206, 36, 26, 39,127, 51,
-183, 97, 14, 83, 17,142, 66,236,112, 40,216,164,150, 32, 86,139,210, 56, 80, 27,143,219, 79,128,161,134,177,105, 37, 8, 59,126,
-178, 43,189,195,158,205, 94, 64,166,157,229, 62,196, 6,100, 57,120,172, 79,189,175, 23,136,243,181, 12,140, 42, 97,139,144,181,
-248, 63, 17,108,111,219, 65, 88,191, 85, 86, 66,175,234, 78,176, 82, 94,118,151,189,122,253,187,171,249,243,239,127,120,237,204,
-180,111,181,213, 80, 47,231,141,195,166, 88,164, 48, 55, 89,215,210,111,166,177, 96, 62, 0,205, 35, 24,122,248,244,163, 47, 63,
-252,248,157,116, 93,173,151,208,194,184,229,178, 72,209,224,126,227,220,116,121, 89, 92,170, 42,105,171,182,200,167, 3, 20,205,
- 9, 5,102,150,170, 19, 53, 61,219, 25,166,176,238, 33, 43,165, 24, 59, 61,226,160,226, 16,212, 18, 43,242,228,209,143, 63,125,
-251,188, 31,220,197,237,179, 55, 31,222,123,240,246, 93,149,253,204,160,135,160,244,174,116, 3, 0, 91,235,213,121,167,202, 73,
- 7, 16, 74,233,219, 84, 23, 98, 76,170, 89, 38,231,202,231,191,255,247,245,163, 95,223,127,239, 13,122, 46, 65, 95,244,105,126,
-133, 95,192, 75,195,192,218, 14,108, 16,202, 28, 63,179,121,110, 93,217, 75, 22,125,155,220,201,169, 32, 63,251,228,231,119, 63,
-184, 15, 54, 79,231,101, 43,174,219,245,127, 1, 72,186,150, 28,201,137, 40,152, 95,167,211,174, 79,247,244,180, 16,171,145,152,
- 77,111, 16, 8,177, 97,193, 41, 56, 4, 98,205, 25, 56, 0, 23, 96,139,132, 56, 1, 75, 4, 18, 18, 32, 86, 35,196,102,166,153,
- 13, 12,173,162,171,203,109, 59,127, 78, 19, 81,236,170, 85,106,171,236,204,247, 94,132,243, 69, 60,131, 32, 73,204,253,243, 80,
- 31,229,166,139,166,211, 42,133, 22,204, 30, 91,171, 95,226, 32, 61, 17, 93,238,128,194, 7, 53, 55,153, 28, 85,118,250, 44,117,
-228,123, 99,103,206,198, 23,210, 98,111,202,210,109,181,116, 94, 79,142,162,221,100,214,126,240,102,169,214,228,169,132,204, 46,
- 81, 13,170,140,140, 63, 37, 20,200, 98,135,221,214,191, 41, 75,144,251, 62, 22,128,185,182, 2,145, 30,186,122,145,199,132, 53,
- 76,169,197,242, 94,136,209, 73,123, 50,160,224,248, 0, 84, 81, 59,161, 64,185, 82, 78,155, 18, 1,183,102,142,108,208, 21, 97,
-200,147, 54,209, 60, 34,161,141,214,115,242, 82,169,167, 66,139,131,105,118, 39,172,112,186, 83,118,227,240, 88,144,182, 0, 41,
-133,184, 10, 81,131,231, 21,195, 49,208, 62,182,107,243,207,121, 72,242,194,118,200, 92, 4,205,145, 65,232, 27,239, 80,232, 76,
- 59,165,194,193,164,174,112,114,125, 69,189,108,226, 67, 27,176, 78, 8, 81, 37,130, 1,144, 6, 3, 42,170,215, 77,198,246, 42,
- 9,121,177,103,103,171, 70,106,252,183,166, 26, 6, 29,248,170, 4,123,173, 5,243, 76,115, 94, 74,166, 8,182,108,239,215,169,
-144,159, 81, 4,136,130, 61,168, 24,216,114,102,159, 86, 82,252,137,181,202,180,168,225, 72,198,158,138, 25, 5,144, 33,187,101,
-229, 92, 41, 71,234, 80, 65,216,200,178, 20,229, 37, 10, 55,176,216,208,236,145, 35, 53, 29,240, 56, 33,124, 84,250,158,200,220,
-142, 98,237,197, 33,216,157,160,103, 19,251,159,192,159, 45, 64, 24,237,236,105,204,196, 62, 3,218,105,230, 1,215,170,184,233,
-122,169,228,176,216,147, 69, 61,116,224, 70, 11, 37,150,116,193,160,243,196, 92,147,165,146,115,145, 97, 6,103, 12,163, 16,141,
-173, 79, 52, 69,238, 98,226,193, 11, 74,104,189, 64,252,182, 46, 47, 52, 83, 17, 20,199, 71,159, 77,110, 20, 25,248,255,195,148,
- 3,130,132,164, 77,176, 51, 56,111, 30, 86,144, 1,164,192, 25,184,107,109, 19,251, 21,107, 80,147,162,160,177,224, 34,198,115,
-226,229, 54,233, 94, 91,183,191, 50,215,198, 7,115, 65, 75,192, 65,238,194, 97,126,253, 82,190,140,211,237,225,246,239,223, 30,
-254,188,127,124,149, 78,211,157,138,126,218, 0,100,174,219,227, 19,179,111,155,119,205,110,104,114,215, 2,231, 75,143,223,141,
-250,195,214, 87,214,203, 70,246,219,163, 25,173, 11, 28,190, 88,213,166,165,143,160,206, 40, 47,145,115,252,120,194, 29,117,228,
-144, 59,196,159, 4,154,203,212, 58, 30, 54, 6,177,227,227,241,104,187,167, 60,103,226, 4,213, 70, 14,236,213,140, 10, 76,155,
- 90,228,158,186, 87, 69,169,228,140,130, 1,160,195,113, 86, 62,235,156, 46,181,187,223, 13,120, 84,227, 17,152, 53,184,172,233,
-218, 86,102, 93,182, 18,128, 73,177, 77, 4, 17,132,235, 74, 71,103, 3,199,230, 58, 29, 84,218, 2, 84,144,245, 37,190,142,226,
- 32,226,213, 54,206,234,185, 11,215, 13, 15,157, 78,107,252,233,197,139, 31,191,127,253,225,205,243,247,222,185,121,254,204,236,
-246,127,197, 60, 31, 15,111,210, 50, 59, 16, 34, 64,214, 11, 4,213,170,252,188,218,136,104, 93, 45, 27, 61, 57, 26, 30,181, 51,
-148,172,234,217,157,148,135, 55, 0,190, 84, 99, 82, 8, 43,176, 63,116, 16,216,166,180,173,213, 60, 92,194, 63, 82,233,128,141,
-196,193, 28,248, 89, 64,183, 21,127,131,187, 3,157,151, 24,151, 36,203,216, 81,163,195,157,154, 11,112, 26,144,223,124,182,118,
-146, 96, 61, 8, 41, 41, 57,143, 22, 48, 91,212, 81,167, 58, 71,219,246,214, 53, 77, 93, 58,192, 74,181,226,107, 85,174,222,190,
- 12,203,251,223,189,146,191, 28,127,255,225,219, 95, 59,239, 62,253,232,134,208, 16,207,174, 91,202,157, 97,147,250, 76,181, 0,
-187,204, 23, 51,158,192, 17,120,168, 36,176,136, 53,164,107,128,124,237, 54, 91,233,114, 57,173,213,186,201, 43,218, 28,170,230,
- 45, 36, 35, 93,186,213,203,210,123,149,106,182, 74, 2, 27, 10, 20, 22, 65, 91, 6,229,129,117, 71,154, 58,183, 77, 45,238,170,
-173,143, 95,126,241, 13, 54,247,103,159,127, 34,247,230,112,251,199,215, 95,253,252,193,199,207,166,149,157, 24,153,175,140, 23,
- 43,168,105, 93,150,199, 83, 65,110,109, 27, 92, 86, 33,227, 77,156, 6,137, 26, 41,241, 48,206,138, 19,206, 40,110,115, 51,219,
-172, 65,152, 89,107, 12, 91, 33,150,129,158,230,186, 55,225, 20, 70,144,215,177, 8, 71, 35, 94, 67, 95, 79,138,158,113, 83,222,
-211,101,162,176,143,125,245,107,251,159, 0, 36,157,207,143, 20, 69, 20,199,171,170,187,170,127,237,252,216, 25,126, 10,108, 76,
- 68, 87, 57,172,152,168, 1, 12,154,120, 50,198, 24, 19,226, 69, 15, 92, 77,220,139,127,128,103, 15, 30, 61,120, 51,196,132, 68,
-189, 17, 57, 24, 99,130, 7, 56, 16, 73, 8,137, 8, 65,118, 89, 64,133, 97,103,153,157,237,238,234,234,238,170, 46,191,111,185,
-206, 97,102, 50, 83,239,189,239,167,235,189,239, 67,114, 6,254, 69,162, 18,124, 38,105,252,211,210,158,241,112,135, 44, 31,182,
-185,145, 52,180,104,165, 46, 61, 36, 1,128,226,185,154,149, 73,143,188,171,147,134,247,169, 61, 28,149, 76,205, 23,248,152, 55,
- 92, 43, 62,196, 39,230,156,239, 5,182,246, 32,241, 43, 4,189, 16, 89,229,235, 52,109, 35,156,241,233, 40,216,174, 58, 89, 56,
- 40, 80,179,208,209,114,215,140,137, 73, 96, 7,130, 27,129, 23,234, 64, 55,105,132, 4,194,250,116, 79,167,200,244,206, 87,228,
- 20,145,161, 94,138,150,110,207,133,156,225, 0,251, 40, 78,242,196,179, 45,201,153, 46,194,136,124, 78, 72,104,251,110,134,240,
-221,163, 75, 97, 7, 79,163, 72, 8,147,117,131, 46,110, 11,171, 33,176, 89, 94,217, 65, 12, 97, 41, 59,104, 27,227,230, 1,228,
- 66, 15,245,160,207,234,186, 17, 8,189, 62, 40,186, 99,181,138, 29, 99,145, 51,109,101,107, 25, 32,178,240, 51,236,222,255,245,
-152,172,184, 23, 54, 36,213,134,147,158,177, 86, 90, 72,244, 0, 98,172,107,131, 36,104,149,207,163, 36,218,210, 80,154,144,240,
- 42,103, 56,203,117, 67, 70, 9,204,150, 22,232, 82, 5,179,176,241, 21,107,144,214, 3, 32, 19,169, 96, 95,116, 60, 71,222,135,
-182,183, 76,246,232, 41,119, 2,138,237,249, 88,219,113,227,166,125,148,149,103, 46,236, 97, 59,108,200,225, 69, 27, 2, 20, 48,
-195,128,211, 40, 33,249,142,171, 58,131, 80,226, 86, 90, 89,119, 62,197, 91,251,170, 11,161,182, 82, 35, 7,178,106,250,174, 18,
-174,214,140,252,162, 28,100, 69, 52, 0,208,229,244,240,142, 27,234, 97,105,107, 23,123,114,247,151,128, 8,196, 27,244, 43, 74,
- 9,131,132,115, 81,193,218, 2,137, 15,181, 43, 52, 5, 89,206,165,146,238,207,120,142, 47, 70, 45, 61, 86, 65,226,238,110, 24,
-169,201, 96, 61,137, 61,240,211,233,134, 70, 89,226,160,138, 26, 69,107,221, 83,148,208, 48,226, 69, 38, 84, 9,216, 33,147,101,
- 75, 51, 23,174,139, 3,210,138,204, 23, 81, 20,117, 90,122, 62,211, 9,216, 67,236,195, 27,182,241, 32, 9,166,110, 0,244,236,
-177, 33,194,123,127, 90,151, 3,224,218, 2, 40,101, 44,242,182,221, 42,210,155,255,149,147,127, 38, 55,103,229,230,227,122,125,
-167,170, 55, 81,196,252,188, 96, 62,233, 0,120, 41, 97,124,140, 50, 61,146,202,141,145, 37, 93,102, 41, 66, 1, 33,188,105,101,
- 3, 72,226,219,100,197, 85,211, 74,187,194,171,168, 41, 77, 82,100,148,175, 4,173,187,224,162,108, 12, 50, 89, 63,163,245, 89,
-128, 25,168, 66,174, 12,121,165,135,228,249, 69,102,249,129,220, 75, 45,173,101, 30,246,198, 73,205,136, 54,108,203,101, 81, 59,
- 21, 4,130,150, 27, 3, 22, 99,238,162,126, 83, 34,179, 2,147,104,172, 67,114,163,194,197,192,110, 37,178,211, 28, 80,149,182,
- 42, 81, 46,247,101,207, 42, 47,159, 93, 0,129, 5,105, 45,138,140,184,102, 86,209, 96,115,135, 47,198,186, 29,198, 98, 20, 3,
-178,233, 65, 78, 39,239, 44,195, 37,229, 63,212, 6, 80,175, 66,158, 27, 88, 19,168, 81,141, 84, 21,121,173,195,226,218,244,206,
-213,141,181, 35,163,236,196,129,253, 47,157, 92, 62,120,232, 8,155,253,171,231,179,157, 92,151, 52,123,110, 68,184, 0, 98,148,
- 77, 81, 67, 72,107, 78,251,131, 61,212,141,165, 3, 7,220, 67,209,101,188,234,209, 46, 74, 28, 48, 50, 62,112,180,139,135, 77,
- 76,155, 0,104, 81,136, 66,105,156, 31,119,162,232,154, 93, 15, 81,232, 1,234, 4,158, 33, 72, 56,185, 97,133, 9,181, 80, 36,
- 10, 1,144, 58, 89, 43, 3, 24,166,253,222,144, 38, 67, 38,170,200, 8,154,120,166, 75,227, 90,248,172,163,230, 27, 59,198,143,
-137,191, 42,102, 17,237, 63,110,189,218, 19, 44,142, 70,186, 57,250,203,134,187,227, 30,252,125,245,222,241, 83, 47,222,191,251,
-232,201,218,116,116, 40, 13,171,238,183,243,215,145, 15, 30, 63,154,228,211,226,221,179, 39, 15, 47, 67,173,186,171, 23,175,109,
- 79,230,244,224,143, 49, 19,236, 99, 61,245,235,215, 63,191,124,250,216,237, 43,183, 79,125,116,188, 11,118, 46,159,191,156,100,
- 9, 96,241,211,213, 15, 51,229, 46,252,120,101,253,207,135, 73,134, 60,194, 62,255,242,172, 31,166, 63,124,115,241,214,141,123,
-186, 48,239,124,112,226,227,213,247, 85,129,108, 80,248,100,184,118, 99,190,177, 62,249,234,220,106,163,105,127,228,161,165,209,
-103, 95,156, 65, 10,107, 27,253,211,183,151, 30,172, 63,133,136,121,239,204,202, 43,111, 46, 61,186,171,255,248,125, 93,101,252,
-254,173,217,153, 79, 86,190,255,238, 90, 28, 73,163,219, 55,222, 94,122,237,173, 3,138,220,176,186, 26,193, 53, 11, 47,156,187,
- 1, 82, 51,149,125,253,244,193,135,107,197,214, 20, 2,132,218,175,150,143,141,118, 26, 3,217,122,244,248,126, 28,169,155,127,
-109, 66, 89,172,188,186,200,104, 32, 73, 88, 51,191,126,233,201,225,165,225,243, 47,136,255, 5,224,232, 90,122,164,168,194,232,
-173,186,117,111, 85,215,163, 27,153,233, 17, 6, 38,168, 81, 17,149, 49, 6, 18, 19, 97, 64, 67,220,136,102, 76, 92,144, 24, 23,
-236, 52, 49, 49,110, 76,116,195,146,184,117,111, 92,233,194, 4,227, 6,212, 5,130, 9, 15,137,130, 70, 34, 35, 50,196, 9, 14,
- 24,102, 28,122,122,186,235,113,171,238,163, 60,223,252,128, 78,245,226,214,121,220, 58,223,249,160,246,160, 52, 21,252,144,159,
- 81, 41, 84, 84, 38, 90, 83, 96,216,209,178,240, 70,154, 56,225, 5,196, 20, 88, 72, 85,137,109,189,144,246,204, 83,247, 80,204,
-135, 33, 88, 38,236, 53,128, 77,248, 8,217,227, 61,225, 37,218, 80,252, 57,168,187, 42, 28, 43,208, 13,141,199, 39, 35, 97, 51,
-161,105, 67,134,166, 54,201,180,216, 86,155, 49, 77, 30, 67,134,212,113,201, 70,222, 8, 68, 27, 11, 48,141,247,144,196, 91, 13,
-191, 96,130,166,160, 40,151,139,146, 78, 90, 81, 51, 96, 45,189, 13,234,181,118, 76, 9,149,214,129, 31,201,162,130,211, 47,101,
- 12,249,220,104, 22,133,109, 99,131,220,171, 68,215,118,100,157,241,112,173,136, 3,161, 59,170,196, 73,215,182, 71,107, 35, 10,
-205,180,196, 1, 54,172,142, 56, 31,242, 40,133,111, 32,232,166,202,150,138,233,184, 12, 30,192,182, 89,191, 27, 7, 86, 82,216,
- 26,110,193,107, 75,128, 79, 65,227,148,180, 76,218,177,168,214, 89,194, 6,141, 11, 21,109,117,240, 65,249, 0, 55, 79,209, 87,
- 3, 99,221,184,208, 64, 86, 42, 97,162, 5,119, 70,240, 92,217,212, 52,229,208, 27,103, 85, 86,143, 2,109, 41,251,170, 92, 16,
-155, 49,197,123, 61,151,183, 53,180,146, 37, 89,231,137,114,211, 41, 1,152,139, 22,184,227, 58,208,237,134,165, 26,128, 31,106,
-128, 42, 3, 24,166, 17, 69,116,152, 7,193, 14, 12,240,203,172,169, 3, 30, 84,220,209,180,128, 97,171, 33, 76, 86, 45, 52, 28,
- 73,199,181, 77,172,115,138,103,130, 69,254,179,253, 72,172,110,173,235,145,196,131, 82, 42,191,129, 15, 24, 66,189,109,208,181,
- 40, 60,167,134,233,195,251,184,181, 77,107,192,132,110, 84,219, 97,212, 22,236, 68, 43, 35, 72, 0, 90, 57,155, 56, 32, 51, 53,
- 17,176,205, 98, 76,138,101,149, 20, 26, 74, 68, 69,241,115, 27,148,138, 38,128,101,196,116, 6, 49,209,194, 11, 68, 65, 27,102,
- 42,108,165,171,184, 54, 80,103, 84,100,213, 10,190,217, 63, 10, 97,196,169,168,167,107,164, 89,111, 42,250,104, 53, 21,217,196,
- 74,209,233,108, 73,133,156, 17,245, 84, 80,154,244,206,128, 47,230,160,234, 96,112,119,180,156, 87,195,123,234,175,241,224,254,
-191,109,174,168,217, 50,242,253,170, 5,197,114,234,180,145,126,214, 21,211, 19,180, 31,206, 87, 28,134, 62,193,147, 38, 97,206,
-120, 14,197, 83, 22,150,170,218, 33, 63,240,199,228,200,117, 96,135,164,131,237,128, 74, 16,144, 0, 94, 72,251, 94, 64,155, 56,
- 48, 18, 50, 1,178,139,154,168,188, 88, 6,106, 40, 92,214,172, 17, 82,215,142,238,253, 61, 6, 62, 5,104,129,152,149,106, 41,
-131,233, 53, 27, 17, 13,113, 91,186, 47,174,123, 34, 20, 84, 57, 72, 97,116, 74, 46,233,146,117, 89, 22,211,106,236,210,244, 20,
-224, 48, 41, 64,166,224, 11, 19,166, 30,205,125,176, 34,128, 60,144, 52, 3,199, 27, 65,145,104,210,155, 52, 16,167,134,156,197,
- 48,120,148,154,240, 18,197,168,106,149,211, 6,104,104, 34, 67, 11, 86,157, 78, 18, 95, 3, 87,161,146, 44, 37, 99, 42,170,135,
-229, 33,125,144, 9,214,187, 81, 22, 77,114,133,211,188,166,212,183,215,151,206,111,172,239,153,216,241,216, 84,242,212,244,195,
-219, 38, 12,179,171,133,183,150,215,166,146, 21, 7, 12, 36,161, 89, 7,145,196,122, 84, 81, 77, 27, 20,135,181, 96, 17, 72,114,
- 62, 54, 82, 6,181,231,172,164, 6, 27, 30, 67, 12,192,166,112, 75,145, 88,159, 27,227, 85, 20, 84,166, 27, 25,120, 50,156,217,
-136,242, 53,110, 76,141,208,173,139, 61,218, 68,100,172,108,106,218, 34, 31, 82,149,150,165, 70, 56, 22,250,224, 0, 42,220, 2,
- 35, 87, 20,184,242,240,251,218,178,142,102, 93, 5, 77, 24, 16, 81,138,176,169,123, 91,250, 38,156,190,124, 59,185,182,126,175,
-155,200, 27, 23,238,204, 31,127,185,183, 43,190,126,241,214,225,183,246,249,169, 92,189, 59,120,230,224,147, 7,143,189,176,248,
-235,210,111,103,111, 79,206, 28, 94,184,180, 16,119,131, 23,231,143,182,145,254,226,163,175, 2,205,242, 42,191,191,244,160, 63,
-179, 50,123,228,137,108, 90,124,115,242,199,227, 31,191,214,207,194,159,127,249,231,236,169,243,175,191,251,234,220,177, 3,111,
-188,147, 66,209,127,255,249,119, 87,127,184,186,125,247,142,155,191,255,125,242,203, 15,241,102, 47,223, 26,120, 0, 89, 27, 54,
- 13,222,122,255,226,149,133,125,135,158,167, 26, 68, 90,180,193,125, 73, 29,118,202,137,159, 78,255,217,159,202,222,126,255,165,
- 60, 31,125,242,193,153,217, 61, 83, 77,217, 92,187,116,231,200,252,211,115, 71, 31,113, 97,248,222,137, 67,181,203,155,161,251,
-244,196,229,253,123,119,194,125, 57,136,221, 86,159,251,250,198,238,189, 19,179,115,219,225,118, 86,150, 71, 7, 94,217, 69,147,
-189, 85,113,250,179,155,147, 59,179,110,155,158, 59,181,248,232,115,125,120,237, 63, 46,172,236,127,243,113,171,224,210, 33,232,
-221,149, 51,171,105, 55,152,121,182, 7,232,249, 95, 0,146,174,231, 69,142, 34,140, 86, 85, 87, 85,255,156,158,237,221,217,221,
- 36,106, 80, 20, 3, 30, 36, 4, 77, 68, 65, 16, 81, 68, 61,121,241, 32,222,189, 11,193,171,127,128,127,128, 10, 57, 9,158, 22,
- 2, 30, 68,188,228,144,131, 98,192, 16, 66,130, 68,208,172,152,100, 55,217,153,157,153,238,174,238,174,234, 42,223,183,158,230,
- 48, 63, 24,186,170,223,247, 94,245,247,189, 39, 25, 13,213,208, 86, 24,130,237, 65,185, 69,111,125,238, 6,240,141, 16, 7, 55,
-183, 81,109, 69, 41,233, 96,152,252, 85,156, 30, 21,133, 39, 4, 92,161, 32,199, 93, 85,202,164,179, 37,141,151,106, 91, 64,228,
-155,137, 39, 43,157, 56,235, 59,197, 10, 20,159, 4,202,237, 36, 17,192,110,156,100,118, 1,171, 14,249, 22,136,123,146,112, 71,
-198, 39, 62, 20,179,116, 9, 50, 13, 85, 80,183,246, 88, 68, 19,232,250,145,156,128,180, 72,117, 74, 17,198, 30, 32, 10,234,204,
-226, 29, 40, 53, 41,125, 9, 38, 19,119, 52, 32,156, 59, 73,244,209, 58,200,118, 30, 59,190, 88, 24, 93, 76,196,124,221, 98,175,
- 71,128,212,110, 0, 33, 93,197,190,194,125,189,136,250, 66, 38,174, 7, 67,204, 71,219,231,210,199,147,160,149,179, 54,100,158,
-148, 46,151,138,124, 56, 35,202, 34, 16,192,106,178,255,160, 25,157,176, 18, 99,195,171, 74, 46, 59, 70, 41,123, 46, 80,241, 99,
- 54,210, 50,119,126, 5,138, 7, 89, 27, 59, 34, 29,203,193, 79,173,130,160, 24, 69,215, 6,101, 45,148, 49, 54,191,147,199, 99,
- 29, 81,190,236,194,116, 82,245,199,218,137,121,159,116,113, 29,177,209,180,228,218,185,108, 56,157,205,107,154,189,229,188,222,
-114,212,154, 0, 22, 78,109, 73,148,235, 30,157,156,143, 39, 53,135,122,237, 0,236,146,146,163,173,228,217,255, 61,110, 96, 44,
-228,133,141, 59,155,196,133, 47, 32, 71,240, 46,216,145,111,200,128,154,129,150, 66,215, 59,200, 84,157,171, 98,195, 12, 71, 94,
-100,102,137,202,205, 39, 75,158,205, 68,148,184,113, 69, 46,225, 2,139,140,197,235,216, 64, 78, 32,114, 18,201, 86,122,211, 82,
- 91, 51,208,221,146,195, 12, 37,160,174, 86,100, 95,112, 34,217,197, 64, 6, 88, 52,165,184,160, 84, 60, 15,113, 35, 92,172, 1,
-157,171,192,176, 85,203,192, 20,136, 96,156,119,174,211, 33,108,184,173, 35, 97,139,172,199,162, 86, 1,223,166,206,117,128, 98,
-156,168, 5,174,246,184,189, 35, 78,205, 50,235,162,135,211,252,240,137,188,113,232, 30,223, 17,247, 22,227,193,195,199,245,122,
-176,220,184,150,140,207,214,137,165, 54,110,222,179, 44,219,156, 2,240,100, 28, 25,145, 43,174, 18, 48, 22, 95,146,165,171, 69,
-125, 53,208, 47,158,178, 18,141,166,199, 32, 41, 13, 88,137, 33, 27, 80,175, 12,136, 35, 39,179,129,174,167,184,131,193,169, 42,
-178, 54,205,192, 92, 68, 30, 5, 79,243,108,248, 48,177,125,166,215, 10, 74,204, 87,124, 58, 6,130,179, 54,149, 46, 51,138, 66,
-246, 12, 74, 23,249,161,201,190, 64,217, 26, 50,242, 48, 11, 77,154,241, 13, 19,175, 85,163, 29, 79, 93,186, 68, 29, 24, 4, 84,
-148,207,129, 44, 6, 98,188,151,158,122,251, 58,155,135, 38, 99,113,237, 80, 4,215,244,108,151, 78, 63,180,200,186,172,151,198,
- 25,202,166, 19,186,235, 28, 10, 42,229, 95, 83, 91, 35,235, 33, 23,248,162,160, 46, 21,157,244, 29,254,137,103,169,210,126, 80,
- 94, 13, 98, 90,155, 94,106,142, 61,225,179, 60,145, 16,162,205,224, 10,147,151,128,163, 89,111,230, 96,242,114, 54,242, 52, 49,
- 97,117,125,127,254,235, 93,177, 85,157,217, 61,179,125, 97,182,179,179,251,220,238,212,178,246,129, 89,206, 23,125,221, 55,163,
-149, 39,253,171, 82,141, 77, 27, 53,182,171, 56,107,200,145,159,145,223, 8,185,246,163,136,104,236,156, 2,100,141, 74,126, 48,
- 14,107, 71,182,223,154, 30, 91, 41,141,101, 10,108,148,224, 46,100,167,211,198,244,156,146,172,119,148,228,128, 17,144, 26, 26,
-225,162,148, 64,242,170, 60,153,163, 86,248,113,155, 79,167,161, 27, 59, 32,210, 52, 34,111,233, 97,195,198, 17,197,193, 55,178,
-170,188, 11,179, 31,175,143, 55,135,131,113,119, 92, 61,144,166,233,227,243,207,190, 84,196, 87,174,254,112,241,147,119,162,116,
- 5, 82, 49, 57, 61,113, 37, 43, 51,230,235,182, 8,221, 95,183,254,125,249,131,115,110,218,230, 60,163,163, 12,190,166,184, 29,
-198, 94,253,248, 18,200,210,163,251,135,125,107,247,190,189, 70,110, 37,198,101, 37,214, 51,154,223,249,103,239,234,111,160, 95,
- 79, 14, 86,111,188,119,225,210,185,237,166,238,190,186,124,229,133,231, 79,189,249,225, 43, 2,220,129,111,134,196, 11,239,201,
- 31, 8,144,195, 91,188,126,249,249, 55, 0,188,187, 55,247,191,251,233,139,223,127,185,255,254,167,175,231, 40,230, 19, 93,109,
- 23,183,254, 88,167,241,120,250,236,230,107,111, 63, 3, 66,125,252,200,238,125,125,251,120,209, 66,164,244,198,177,245,156,177,
- 21, 32, 40,183,225,222,237,163,143, 62,123,113,185,132,162, 47,171, 83, 19,232,109, 40,185,159,191,255,243,252,187, 79,199, 83,
-149, 7,150,151,250, 96,191,214, 17,203, 39,250,108,169,201,233,143,177, 27,215,254,206,166,234,226, 91, 79, 13,224,102, 60,252,
- 39, 0, 71,215,206, 98, 73, 17, 70,171,170,235,217,143, 59,119, 28,103, 71, 93,124,236,128,179,129, 26,153,136,153,153, 24, 8,
- 26, 24,153,152, 26, 8,134, 62, 49, 95, 16, 19,193, 23,198,162, 34, 46, 38, 50, 32, 27,105, 34, 12, 34, 35, 58,178,200, 46,187,
-137,195,122,231,222,233, 71,117, 87,117, 87,123,190,249, 1,183,185,245,250,190,115,234,171,239, 28, 68, 81, 67, 26,148, 82, 82,
-183, 56, 87, 74,123,128,181,198,247, 29, 61, 14,209, 5, 0,251, 80,182,122,210,100,217, 4,182,111,187,134, 39, 26, 57, 97,230,
-251, 2, 11,125,237,197, 98,123,185,199,201, 32,100,236,129,128,182,200,204, 94, 75, 51,102, 21, 48, 71,195,182,221,216, 70, 81,
-235,113,118, 81,110, 66,237,149, 84,121, 5, 20,200, 58, 82, 41, 91, 74,182,222, 77,172,221, 98,125, 40, 43, 71,101,221,224,153,
- 27,200,170, 5, 7,160, 42, 71,236,155,177, 47,148,232, 71,165, 73, 5,156,203, 1,144,196,144,248, 50,189,191,138,231,105, 33,
-235,190,114, 72, 10,150,206,189,164,219,225, 6,112,133, 52,139, 60, 87, 32,138, 36,190, 55,170, 94,225,132,143,110,114, 65, 76,
-205, 76, 34,231,134,169, 28,199, 67, 1,255,215, 60, 45, 93,156,221,130,196,194, 17,236,133,167, 24,160,106,178,254,206,149, 93,
- 38, 30, 99,170, 93, 86,140,145,100, 62,133, 97,158,164,189, 60,210,153,227,105, 29, 16,162,221, 50,139,235, 64, 37, 67,159, 33,
-162,111, 36, 6,209,205,101, 24,235, 96,233, 38, 94,204,160, 0,235,213, 80, 26,138,149,227,122, 32, 29, 68, 61, 96,162,155, 73,
- 22,181,246,102, 24, 83,139, 1, 56,196,169,181, 16, 57, 85,178,186,164, 28,181, 95,171,152,167, 42, 19,153, 3,156, 67, 92,154,
- 51,155,170, 62,130, 29, 3, 55,207,248, 43, 67,174,120, 72,136,146,149,141,255,154,188, 66,100,161,167,137,216,119, 88,227,146,
-129,144,225, 99,136,211, 67,155,153,189, 57,147,255, 37,190,195, 84,165,242, 94, 5, 55,146, 64, 0, 9,222, 43,122,243,130, 21,
- 41, 72,232,173,136,226, 44,164, 82,226, 27, 98, 36,200,205,233,165, 36,245,162, 79, 32,138, 1,168,198,146,246, 66,207,103, 76,
-107,156, 72,211,146,228,162,147, 48,103, 76, 25,207, 22,234,162, 68, 44,151,126,158,129,132,157, 15,100, 22, 33,205,189,172, 45,
- 50, 47, 55,126,224,123, 83, 17,123, 18,152,198,214, 76,142,104,250,165,203,188,182,139,159,154,234,248,183,243, 99,192,192, 59,
-235, 57,109, 90,117,225,131,208, 69,146,220, 85,202, 86, 99,182, 43,138, 9,243,133,204, 87, 10, 4, 98,203,131,196, 62, 38,215,
-213,185,231, 3,230,171,243,188, 29, 61, 15, 85,110,217, 69, 91,190,162,115, 72, 74, 21,125,100,212,217,100,201,247,139,244,119,
- 72, 98,119,118, 37,201, 18,196,128,140,137,188, 30, 38,164,183,220, 68, 83,234,102, 32,195, 19,176, 50, 77,152,131, 3, 1,109,
-209,147, 28,107, 51,214,146, 15, 13,213, 23,149, 6, 34, 37, 95,132,184,208,100,141, 86,100,101, 7,220,144,134,209, 5,221, 11,
-157, 37, 59, 85, 8, 93,122,109,133,156, 74, 16,160, 60,120, 67,174, 28, 64,200, 76, 54, 84, 27,226,128, 74,142,154, 1,251, 45,
-230, 73, 91,132,129, 20, 48,153,200,198, 27, 80, 98,182,102,146,107, 55,235, 49, 14,102, 36,195,161,139, 42, 35, 22,190,193,215,
-163,209, 88,178, 4,234, 85,240,110, 78,219, 11,141, 95,112,178,242,158,197, 69, 81,187,146, 32, 15, 81, 1, 73, 55, 73,226,144,
-100, 70, 22, 82, 97, 55,101,219, 37,232, 71,214,137,246,230,237,219,199,127,201,220,238, 61,190, 91, 30, 60,188,115,176,127,229,
- 33, 80,190,234,110,205,239,212,229,212,159,173, 27,234,139, 20,224,129, 54, 79,180,231, 2, 83,110, 12, 3, 39,144, 24, 50, 65,
-210,103, 84,251,142, 61,136,230,164,128,234,200,121,142, 35,150, 82, 75,207, 72, 10, 69,243,185, 75, 57, 6, 79, 30,240,212, 80,
-115,209, 68, 49,145, 14,166,230,154, 81,199,124,206,105, 54, 39,203, 16,246, 53, 53,161, 40,238,146,214, 56,234,204,208, 5,158,
-181,113, 97, 51, 97, 30,189,113,215,252,188, 58,205, 47,231, 5,227,191, 31,221, 68,194,185,254,254, 87, 56, 10, 67, 63, 12,183,
- 78,246, 46, 47, 73,215, 63,114, 64,150,142, 44, 16, 85,183, 64,210,224, 58,105, 25, 52,207,105,191,249, 92,106, 18, 16, 71,130,
- 44,181, 6,123, 13,213,110,245,202,187, 47,228, 22,169, 76, 97,198, 86, 39,171,175, 63, 61,124,231,147, 55, 47,221,111,190,251,
-226, 80, 10,189, 92, 20, 31,125,243,214,201, 31,183,142,110,252,249,193,235,159,127,118,253, 90, 32,191, 27,178,210,121,242,233,
-131, 47, 63,252,254,229, 87,159, 7, 55,123,251,227,215,242, 48,191,244,220,123, 8, 3, 69,153,249,102,195,194, 3, 29, 1, 72,
-182, 93, 22,125,232,200, 70,104, 6, 18,153,126,248,246,151, 43, 87,119, 94,124,246, 25,159,234,107,111, 28,110,242,178, 91, 37,
- 42, 97, 69,186, 76, 63, 93, 81, 14, 52,224, 82, 66,157,243,242,215, 31,255,121,112,191,220,127,172, 52, 30,152, 73, 93,125, 98,
-231,239,163,123,224,137,143, 60,181,149,172, 32,219,123, 42,179,201,245,105, 59,180,228,233, 12,242,254,191, 0, 28, 93, 77,143,
- 20, 69, 24,174,207,238,234,158,233,153,221,157,101, 65, 98, 8,155, 16,194, 34, 6, 72,144,131, 33, 70, 19, 47, 28,244,160,198,
-131, 7,253, 11, 38,254, 9,127,129,127,192,131, 87, 15, 98, 34, 23,179, 26,163, 70, 89, 34,129, 21,228, 91, 32,172,187, 58,236,
-206,244, 71, 85,117, 87,181,207, 59,115,157,233,206,244, 71,189,207,243, 84,213,251, 60,202,227,125,195,171,130, 43,214,109,232,
-131,173, 83,212, 87, 75,182,106, 94, 58,207, 84,223,205, 5,198, 84,141,223, 57,147,231, 85, 51, 46, 2,136, 22,106, 69,199,218,
- 90,184,204,172,185, 3,214, 23,140,155, 96, 12, 57,146,132, 33, 72, 94, 26,147,208, 31,176,208, 15, 32,224,101, 67, 6,223, 96,
- 82,162, 75,138, 2,223,203,253,172,176,174, 51,168,115, 26,228, 82, 86, 5,215,125, 85,245,228,248,237,115,158, 22,251,182, 54,
- 19, 12, 91,150, 84, 76,186,206, 37,121,153,209, 62, 29,168,127, 49, 52,168,147,170, 2, 13,226,182,201, 18,118, 48,230,117, 93,
- 80,204, 94, 40,187,236,208, 42, 71, 53, 12,217, 68, 59,159,166, 73,157,144,177, 40, 20,118, 93,164,178,104,198,189,201, 27,223,
- 13,220,140, 47,171,188, 66, 41,111,194,204, 91, 90, 21, 86,135,121,172, 65,248, 77,218,207, 61,203,113,109, 35,140,213,110, 12,
-112,201, 91,220,239, 37, 81,121,158,131,185, 43, 93,167,138,210,248,160,156, 45,128, 61, 11,203, 32,127,166,167,104,185,198,142,
- 57,131, 4,149,214, 83,194,179,163, 80,165, 16, 91, 5, 80,135, 40, 46,133,172,234,206,250,105, 35, 44, 45, 37,136, 25, 43, 5,
-174, 26, 7, 68, 91,101,130, 67,204, 39,114,100, 91,218,175, 40, 53, 14,166,102, 55,114,101,137,224,162,158,235,154, 22,189,125,
- 76,116,214, 71,238,117,221,162,152,242,210,178,195, 69,251, 34,237,204,108, 97, 48, 71, 4,220, 5,218, 96, 5, 6, 69, 49,163,
-133, 3, 4,210, 98,127,156,161, 84,181,255,185,102,157,140,178, 64,207,185, 89,120,157,117,203, 60,221, 3,224,246,253, 40,104,
-171, 60,110,229, 20, 4, 74,215, 30,204,146, 2,243, 92, 39, 67,170, 48,136, 53,133, 83, 47, 60,145,231, 82, 20, 64, 60,102,108,
- 80, 20,114, 76,105,225,139,253,152,140, 18,242,162,214, 13,111, 23,137,171, 24,220, 22,151, 48,231, 98,133, 83, 47, 60,196,108,
-171,155,133, 75, 33,208,184, 58, 40, 71, 49, 73, 35, 37, 84, 68,234,189,205,239,250,228,219,159,196,142,223,209,205, 60, 59,144,
- 11,155,188,188,167, 85, 97,239,201, 30, 81,214,174,119, 80, 80,180,108,172, 23,246,253, 50, 5,228,236,104,168, 4, 73, 33,134,
- 45,160,153,246,243,136,132,173, 6,227,200,164,219, 43, 12, 41,217, 5,206,162, 48, 90,100, 20, 47,158, 82,172, 76,214, 75, 55,
-232, 83, 72, 63,199,173,226,195, 16, 71,153,119,178,111,151,140,148, 3,218, 44, 27,124, 14,165,157, 37, 60,136, 84, 46, 28,161,
-240,180,172,223,203,128, 20, 50,175,201, 84,107,172, 82,202,226,145, 57,200,169,178,173,215,114,152,133, 90,136, 73,151,151,188,
- 91, 25,228,125, 52, 77, 23,161, 27,216, 96,201,122,163,210, 48, 40,193, 63, 22,206,106, 96, 1,157, 49, 19,142,114,230,201, 55,
- 20, 18, 48,135,208, 11,100, 70,205,185,170,130,178, 21, 80,134, 77,135,201,208, 53,212,225,205,160, 37, 53,181, 56,162,168, 71,
-181, 98, 87, 94, 12,201,165,147, 67,114,199, 90,103, 65, 6,177, 95,141, 83, 30,199, 9, 3,152,149,185,227,220,228,157, 10, 73,
- 70,157,108,209, 46, 3, 27,138, 62, 2, 18,178,174,228, 6,245, 62, 30, 66,109,173, 83,177,172,201,235, 96,186,253,108,231,206,
-227, 7,253,245,225,145, 35, 47, 95, 94, 93,154,188,114,242,232, 36, 97,251,247,247,230,213,254,227,103,241, 31,240,246,158, 25,
-131,147, 65, 90, 10,112, 44,192,188,246, 97,206,249, 4, 60, 59, 80,132,139, 81, 30,176, 95, 18,156,178,138,119, 96, 50, 3, 7,
- 58,236,168,205,162,233,240, 31, 3,144, 37,198, 82,183,120,192,138,194, 45,189, 14,180,211,131, 38, 2, 24,211,180,162, 31,160,
-167,104,126,134,132,136,204, 13,245, 45,135, 48,114, 26, 52,248,171, 39,197,245,221, 94,174, 13,149, 98, 42,228, 55,127,248,235,
-189,207, 62,152,172, 79,114,214,108,126,189,125,237,183,231,163,141,211,145,186,129, 33, 33,141, 26, 49,161, 4,110,238,137,179,
-199,110,109,222,126,227,147, 75, 79, 31, 61, 71, 41, 44,228,136, 28,252, 64, 66,103, 83, 38,179, 67,167, 78,244,108,251,246,149,
-155,231,222,189,104,247,227,253, 31,239, 29,219,120, 9,143, 52,145,246,241,115,119,231,198,163,147, 23, 54,158, 62,116, 15,254,
-252,251,237,203,231, 70,249,218,247,223,252,194, 73,149,136,134, 39, 80,207,103, 46,158, 30,142,190,251,226,243, 47, 63,254,244,
-125, 89,136, 27, 15,118,113,230, 46,203,207, 95,122,245,215,171,219, 27,167, 15,223,125,248,239,116,175, 90, 63,179,182,253,199,
- 11, 73, 19,146,117, 40, 3,205, 74,129,183,118,225,247,107, 79, 23, 72,195,168, 99,157,182, 59,184, 83, 23, 86,183,174, 62, 57,
-127,233,248,238,108, 86,237, 4, 87,251,233,110,253,214, 71, 39,149,119,122,216,181,121,183,126,118,101,235,231,157,131,158,189,
-246,206,113, 17,168,219, 11,159,139,111, 30,189,181,181,187,121,229,222,235, 31, 30, 53, 46,253, 95, 0,142,174,166, 55,142, 34,
- 10,246,116,207,116,207,204,238,218,107,175,237,120,109,108, 39,177,140, 33, 72, 86,162,152,143, 3, 2, 78, 32,184,113, 67, 66,
- 66, 2,254, 0,119,126, 9, 39, 46,112, 3, 69, 8,229, 68,136,144, 18, 1,138,136, 72,140,192, 72, 96, 39,193,137, 29,199,118,
- 98,239,236,206, 76,207, 87, 83,229,227,106,165,153, 81,127,188, 87,213,253, 94,149,250,232,227,247,104, 90,164,156, 75,235, 52,
- 87, 18,187, 21,252, 80, 69,182,196,240, 2, 70, 54, 84, 89, 15,171,180, 86,212,208,212,248,219,212,165, 9, 17,231,218,212,186,
- 46, 91, 6, 65, 29,105,176,138, 65, 40, 11, 86, 77,213,237,118,228,192,215, 65, 34,141,153, 60, 45,150,224, 57, 48,146,112, 46,
-165, 46, 26,150,104, 0,217,130,113, 10, 11,176, 91,155,218, 20, 97,204, 43, 62,213, 29, 83,153,171,156, 54, 35,228, 61, 53,230,
-251, 42, 18, 97, 26,106, 17, 73,254,160, 89,133,161, 48, 45,205,119,164, 98, 11, 25,205,247,170,202, 8, 64, 44, 0, 49,182, 95,
- 82,230,189,162,239, 79,144, 87, 8, 36, 50, 32, 5,171,203, 41,101, 3,139,213, 7, 4, 11,134, 9,232,211,180, 68, 2, 80,160,
- 16,174, 36, 5,225,100,208, 68,100,147,141,143, 21,139, 1,196, 38, 48, 5,245, 81, 12,229,194,240,149,181, 17, 60,227,148, 88,
- 41,121,217, 56, 63,169,173, 74,107,191, 35, 11, 47, 23,120,151,215,132, 57,178, 17,251, 65,140,159, 14, 2, 68, 96,160, 89,112,
-213, 36,203,240,204,180,176, 3, 11,154,156,100, 22, 99,210, 36,118,196,190,139,198,123, 74, 47, 73,223,183,217,137,203,101, 1,
-188,169,104,222, 2,196, 76,153, 31,229,106,115,250, 69, 0,149,108,247, 71, 42,168,128, 83,117, 44,192,127, 89, 63,203,170, 65,
- 12,103,141,224,133, 5, 28, 38, 67, 25, 22,163,134,202,167, 30, 11, 13, 17,195,216, 88,224, 70,194, 69, 66, 43,171,148, 9, 70,
-178, 57,103,226,116,247,137,237, 16, 64,177,212, 87,120, 21, 77, 8,189,210,178,195,156,185,132, 82, 1, 30,197, 9,144,248,232,
-170, 13,124, 78, 53, 87, 30,171,102, 34,169,232,204, 72,167, 8,118,178,122,128, 13,216,152,128, 36, 73,229,149,192,174, 44,184,
-164, 23, 18,123,227,216,238, 74, 31,168,154, 10, 89, 60,155,149, 44,116,196, 78, 22,222, 73, 13,164, 89, 96,212,128, 44,188,138,
-173,109, 54,159,106,181,110,215,225,141,223, 83,147, 38, 74,233,145, 86,181,166, 66,120,142,200, 48,244, 75, 4, 0, 4, 5,203,
-251, 61,186, 75,122,212, 63,104,232,235,195, 6, 18,228, 27,164,182, 60, 47,100,164,188, 60, 64, 78,196, 28,210,228,199, 98,135,
- 54, 85,133,240, 16, 59, 26, 65,132,108, 31, 7, 61,140, 77, 38,253, 8, 20, 59, 98,107,152,103,187,202,175,180,107, 33, 71,210,
-224, 41,100,143, 2, 85,165,129,230,157,160, 68,139,170, 69, 64,209, 44, 57, 93, 81,242, 76, 53,222, 24,162,104,164, 34, 76, 60,
- 93,153, 64, 77,104, 50,233,183, 84,228,132, 25, 22,181, 28,183,198, 27,167,186, 89, 29, 25, 23, 96,253,213, 2,145,223,239, 56,
- 74, 31, 81,248,210,199,228, 7, 3,109, 37, 11, 2, 43, 63,160, 74,193,233, 80,199,197,176, 20, 60, 51,106, 78,199, 26,208, 12,
-212,146, 62,182, 50, 15,125, 43, 85,139,109,153, 21, 64, 2,246, 80, 48, 89, 56,222,189, 35,239, 82,178,222,181,100, 91,149, 90,
- 83,223,210, 55, 46, 22,109, 97,219, 29,145, 10,221, 32,247,149,149, 70,252, 29,122, 50,240, 41, 32,225,147,162, 7,202, 13, 53,
-112,139,105,123, 20,202,140, 39, 92, 24,197,174, 8,138,199,135,187,119, 55, 15,110,109, 63, 26,238,247,116,188, 56,127,126,185,
- 55,213,235, 78,133, 21,178, 17, 80,247,113,105, 91, 82, 71, 82, 86, 64,227,188,134,111, 52,120, 65, 45, 11, 95, 14,172,149,126,
-225, 3,211,129, 16,105,169, 89,222,136,233,194,162,113,167,165,240,152, 72, 44, 79, 43,189, 60, 10, 28, 89,181,211, 20, 77,235,
- 86,236,122,161,122,178,147, 45,217,152, 56, 12, 84, 39,100,164,110,129,129,165, 19, 97,199, 87, 51,215, 30,205,127,115,112, 18,
- 68,121, 71,209,120,176,202,196,195,205,157,215,223,190, 88,186,176, 28, 23,157, 78,188,179,177,189,178,182,112,248,224,201,153,
-229,185, 56,108, 59, 59, 28,156,100,171,151,198,162,197,231,158,237,101,119,175,110,204,246, 39, 71, 39,217,210,171,115,120,242,
-222,191, 71,231,223,185, 16,116,199,241,172,139,235,203, 91,119,238,255,124,117, 99,251,207,157,185, 11, 11,171,175, 60,223,237,
- 70,223,126,113,253,191,173,195, 75,151,151,198, 38,163, 23,214,250,191, 94,187,253,221, 87, 63,108,255,117,239,179,207, 63, 8,
-251, 51, 90,208,105,129,226,223,214,188,245,238,229,227,161,253,254,235, 31,127,186,114,107,112,120,242,254,135,111,206, 46,180,
- 23, 87,102, 50, 91, 95,249,242,151,228,241,232,147, 79,223,152,158, 46,142, 14, 70,201,179,242,197,181,121,111, 20,190,244,242,
-236,141,235, 91,191,221,188,215, 63,215, 75, 7,118,253,181,197,103, 73,158,164,249,202,226,153,254,217,246,241, 94,121,231,230,
-206,104,223,206,174,246, 30, 62, 56,182, 73,121,255,143,195,127, 54,159,230, 66,119,195,158,145,246,232, 48,155, 91,152, 56, 59,
- 15, 70, 98,189, 25,181,243,119,182,188, 62, 61,177, 20, 15,247,237,193,110,222, 95,152,248, 95, 0,142,174, 45, 69,178, 34, 10,
-230,205,231,205,188,143,238,174,238, 65, 65, 84, 28, 28, 16,193,239, 89,128, 63, 46,195,101,249,229, 22, 68, 65,230, 99, 86, 32,
- 46, 65,127,132, 65,212,161,171,166,238, 43,159, 55,175,113,138,130,254,172,162,243, 17, 39, 34,243,100, 68,243,246,247, 31,230,
-184,204,117, 58, 22, 19,234,198, 66,212,151,137,157,154,203,127,105, 91,138,222,195, 7, 91,235, 30,204, 7, 8, 37,185,218, 44,
-188,208,159,242, 1, 74, 18,136, 97, 88,255,168,239,248, 8,198,150,157,115, 67,180,141, 17, 2, 12, 24, 44, 30,220, 34, 73, 37,
- 33,115,169, 31,126,107,148,139,177,118,124, 57, 79, 71, 22,210,243, 11, 86, 69, 8, 11, 54, 33,168,157, 7,126, 79,207,239,121,
-255,113, 58,111,178,178,208,111,244, 24,102, 81, 61,229, 36,233,150,135, 3,188, 7,179,222,113,191,147,157,159,242,182, 16, 1,
- 53,236, 18,223, 25, 55, 86,159,232,129,227,190, 8,217,241, 38,129,233, 16,160,241, 90, 12, 61, 51, 98,254,228,250, 6,122,143,
-211, 57, 77, 30,236,232,219,106,120,122, 65,130,187,247,224,172,234,228,116,150,222, 81,112,136, 93,114,167,221, 53,241, 81,113,
- 62, 86,150, 56,221, 76,138, 20,111, 73,202, 96,122, 81,144,126, 20,244, 62,132, 53, 38,133,184,235,173,110,142, 89, 95, 39, 54,
- 67, 31, 66,189,207, 41,133, 80, 14, 57,165,231,176,146,121,196,148, 82, 61, 31, 87, 61,175,229, 41,167,205, 63, 47,183, 24, 23,
- 12, 78,153, 83,165,126,115, 58,238,209,139,239, 78, 61,246, 51, 24,146, 26,120,207, 99, 14,218,218, 67,182,205,193,155, 78, 21,
- 33, 29,176, 84,215,141, 18,255,110,119,123,100, 77,122,200,104,119,179, 78,115,166, 6, 50,138, 43, 75,248,238, 29,176, 14,172,
- 5, 16, 64, 68, 50, 17,130,167,174, 86, 93,221,183,223,124,245,207,219, 55,139,140,236,100,238,200, 92, 91,130,208,131, 41,165,
- 51, 91,111,174,110,225, 90, 21,148, 50,249, 26, 28,113, 42, 30,123,114,193, 0,100,128,253,180, 30,235, 5, 5,183,233,107,189,
- 6,166, 14, 58, 18,219, 41,164,147,210,176, 0,133, 45,121,123, 80, 64,134,225,228,145, 78,102,106,166, 90, 69, 23, 99, 16,158,
-152,177,106,171,236, 36, 37,147, 43,240, 21,138, 37,102,245, 80, 45,126,208,191,124,253,201,155,236,126,254,229,250,100, 98,164,
-254, 88,186, 29, 74, 4,211, 21, 75, 96, 66,141, 75, 40, 17,140,252,118,168,223, 19,128,236,201, 1,139,236, 29,107,102, 71,238,
-119,204,213, 0,228,152, 1,129,138,129, 28,154,198, 67,225, 23, 86, 28,181,207,235, 2,102,132,145, 66,245,237, 26, 53,202, 3,
- 84,249, 14,245,147,185,184, 68,117, 15, 94,113,160,252, 12,178, 3,228,135,226,172,241,187, 82,183, 8, 37, 0, 49, 45,159,251,
- 70, 23,166,195, 56,203,125, 24,240,131,160,162,117,196, 2,178, 59, 47,253, 50, 6,237, 41, 0,142,152,186,170,208,200,190, 11,
-210,203,214,147,243, 47, 96, 46,243,178, 47, 94, 31, 3,101, 99, 81,163, 36,202, 86,218,200,105, 12, 75,164,250,171,208, 42, 1,
- 57, 51,228, 18,102,140,142, 45, 26,212, 43,176,124, 50, 55, 84,194, 67, 83, 37, 89,107, 22,153,220, 35,178,224,122,192,138,121,
-112,226, 25,211,245,120,180,129,245,162,167, 59,240,212, 13,242, 22,113,102,177, 39,142,169, 4, 39,123, 40,243,187,176, 71, 5,
-140,204, 87,182,221,227,147, 47,246,100,114,164,160, 79,112, 54, 6,241,184, 20,234,214, 9,187, 49, 91,245, 45, 4,233, 4, 1,
- 25,150,120,142,190,149,159,191,248,236,245, 71, 79, 95,188,122,124,121, 58,179,229,221,249,175,127,207,127, 95,118, 65,177, 32,
- 96,110,168, 85,224,131,102,144,208, 29,162,241,100,134,178, 65,254,239,108,196, 16,198,178,217,250,160,243,177, 97,239, 80,195,
-191, 30,205,150, 41, 85,230,206,210, 35,149, 66,175,210, 48, 40, 10, 59,173, 23, 34,117,236,230, 32,107, 21,230, 75,139,163,104,
-214,140, 35, 52,226,151, 63,253, 33,127,155,114, 41, 27,170,128,125, 40, 91,166,119, 11, 13,254, 83,253, 88, 99,202, 98, 70, 5,
-206,148,132,166,184,219, 68, 35, 34,232, 20,198,137,187,234,207, 31,154,214, 30,105,158, 89,117,169,219, 91, 85,115, 20,168, 66,
-124,117,252, 94,100,138,164,233, 92,199,120,111,249,238, 93,215,231,209, 90,186, 47, 29, 80,211, 37, 15,248, 99, 76, 67,206, 42,
- 0, 51, 69,111,106,201,110, 12,120, 2,238, 71, 29,162,169,145,244, 92, 40, 86,185,228,198,145, 71, 27, 25,161,121,190, 65,245,
- 69,234, 20,243,105, 93, 53,111,195,178,222, 94,142,148,162,215,210, 56,243, 62,231,118,158,247,129, 56,159, 36,179,116,104,155,
-163,217, 84,166,131, 55,147,197,202, 82,194, 30, 0, 69, 34,107,211,131, 60,150, 64,167,115, 18,107,153,127,253,241,207,239,190,
-255,218,118, 92,172,144,169,160,174, 5,155, 54,155, 38,158,233,205,133, 50,245,127, 1, 72,186,150, 29, 57,138, 32, 88,213,245,
-236,199,244, 88,172,144,204, 2, 22, 88,252,143,239,220,249, 67, 78,156,248, 3, 11,203, 7,176,132,100,241, 16, 8,105, 97,215,
- 51,211, 93,239, 34,162,125,107,205,238,106,180, 85,149,153, 17,213,153, 17,234,219,239, 94,213, 28, 5,223, 84, 81,169,240,218,
- 76, 77,237,134, 88,170,125,215,143,114,143, 33,106,212,252,173, 63,230, 37, 34,191,142,186, 95, 84, 11, 56,242,186,211, 40, 85,
- 79, 36, 6, 64, 96,200,235, 44,180,182,116,121,165,134, 55,137,252,164, 38,118, 71, 89,205,119, 44,136,101,147, 91,126,164,238,
- 88, 79, 32,138,195,226,144,163,162,228,160, 10, 29, 57,218,120,114,206, 93, 3,190,196,118,135,253,241,212,123, 70,150,152,168,
- 73,136,133, 65,152,205,128, 8,207,116, 25,171,193,241,174,202,141,121, 25,210,121,180,169,251,185, 12,218, 99,101, 17, 73,244,
-235, 18,179, 22,163,144,225,132, 50, 96,219,197,243,159,162,101, 13,184,144,105, 0,115, 32,146,158,183,185, 17,143,156,114, 92,
-130,202, 30,104, 14, 48,100, 8,249, 24,202,235, 19,173, 4, 4,219, 47,164, 13,117,180,133,166,209,130,198,205, 38,227,124, 37,
-226, 71,153,145, 94, 69,168, 73, 7,221,120,253, 0,202, 85, 31,203,195, 30,183, 22, 93, 2, 36, 6,103,255,119,111, 91,111,225,
-150,110, 72, 89, 25,101, 52,129,176,231, 28, 3, 78,128,228,184,106,160,187,118,221,155,188, 37,161, 20,177, 44,210, 32,130,247,
-169, 6,172, 36,125,225,216,127, 71, 77, 14,187, 32,171,157, 61,206, 17, 18,163, 7, 34,100,166,191,109,192,239,125, 35, 54, 99,
- 99, 58,176,132,108, 45, 53, 15, 56,148,168, 72,166,105, 70,198, 57,213, 1,201, 66,148,251,151,159,245,183,239, 26, 80, 52,205,
- 49,228, 97,213, 35, 3,182,147, 55,165, 2,128, 30,235,162,252,144, 14,198, 71, 39, 38, 94, 22,136,124,163,253,105, 52,101,220,
-100,247,200,188, 77, 83,102, 22,112, 60, 31,246, 5,156,121, 97, 18, 63,166,186,204,113, 75,243,241,142, 24, 16, 17, 20,135,134,
-153,182, 69, 26, 88,137,169, 85,189,247, 43, 85,246,187,176, 32, 77,160, 70, 89,216,116,250,230,235, 55,127,234, 95,127,122, 56,
- 61,115, 84,165, 75,188,241, 23, 32,123, 33,130,147,149, 84,113,142,168, 70, 68,106, 40,226, 78,135, 74,202,144, 88, 14,114,130,
-198,225,208,120, 78, 17,250, 98,134,120,248,143,162, 6, 44,192,215,159,186, 30,207, 20,253, 24,143,233, 1,103,233,199, 61,168,
-228,195,128,159,118,191,144,191, 40,124,156,239,240,183,137,222,148, 82,118, 58,178,149, 10,160,172, 13, 37,124, 29, 77,198,199,
- 37,201,225, 84, 38, 79,191,223, 18,205,236, 20,251, 94,104,245,154, 79, 42,124, 50, 40,181,143,116,151, 95,197, 74, 91,137,170,
-147,243,244,140, 4,239,178,213, 96, 85,151,105, 5,155, 10,209,245,238,187,104, 31,212,164,105,112, 32, 19, 69, 44, 64,228, 34,
-219,127,246, 33, 53,222,139, 9,142, 67,160, 60, 87,206,141, 90,199, 70, 68,118, 67, 97,155,200, 53,112, 48, 42,242,121,193,250,
- 72,183,206, 8,208,109,156, 28,123,242,124, 89,118,107,176,175, 70,122,169,102,187,142, 11, 85,183, 27, 74, 32, 73, 91,192,179,
- 25, 85,201, 1, 49,187,123, 58, 29, 56,121,183, 95, 64, 8,104,192, 13,150, 33, 85, 97,203,144, 88, 7, 36, 66,131,165, 40, 70,
- 92,175,127,191,249,237,253,143,111,127,127,253,190, 62, 60,124,245,242,203, 23,159,127,225,205, 18, 47,151,173,246,160, 38,223,
- 15,165, 98,113,204, 18,161,200,180,189, 97,119, 20,157,114, 72,202, 5,149,157,135,206,102, 36,170, 1,149,130,231, 73,114,212,
- 2,185,192,154,211,196,110, 33,229, 57, 10,135,128, 95,170,183,160,112,156,200,192, 17,186, 59,207,123,126,254,195,207,250,251,
-191,254,120, 58,229,133, 30, 39,235,189,223,106,156, 62, 76, 84,189, 67, 73, 18,122,159, 91,222,232,115, 15, 54, 15, 44, 36,234,
- 13, 57, 66, 37, 80,206, 60, 92,233,246,217,182, 44, 79,177,239,136, 46, 61, 73, 51, 92, 80,190, 81, 22, 98,187, 43,147, 50,227,
-126,190,173,221,204,244, 25,114,236,127,194,118,217,131,199, 86,117,200,221,233,177, 88,190, 50,160, 9, 68, 57, 68,212,164, 25,
- 39, 32, 34,222, 73, 10, 43,188,220,105,253, 83,240,139,200, 24,146, 23, 35, 84,136,161,193,100, 53, 88,248,217, 92,193,234,229,
- 85,249, 66, 63, 98, 69,241, 89, 17, 16, 37, 28, 5, 12,219, 19,223,161,138, 86,216,198, 23,118,156, 56,172, 76,226,188,239,208,
-116, 93,207,179, 6, 73, 66,130, 65, 93,161,103,164,248,231,151,255,206,171,187,127,113, 6,102, 82,161,115,110,191,155,126,163,
- 91,189, 2,180, 70,248,172,249,127, 1, 6, 0,223, 79, 84,236,136,122,237,252, 0, 0, 0, 0, 73, 69, 78, 68,174, 66, 96,130,
+255,216,255,224, 0, 16, 74, 70, 73, 70, 0, 1, 1, 1, 0, 72, 0, 72, 0, 0,255,225, 0, 22, 69,120,
+105,102, 0, 0, 77, 77, 0, 42, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0,255,219, 0, 67, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2,
+ 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,255,219, 0, 67, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,255,192, 0, 17,
+ 8, 1, 15, 1,245, 3, 1, 34, 0, 2, 17, 1, 3, 17, 1,255,196, 0, 31, 0, 0, 1, 3, 5, 1, 1, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 4, 0, 7, 10, 3, 5, 6, 8, 9, 2, 1, 11,255,196, 0,103, 16, 0, 1, 3, 3, 2, 4, 3, 4, 6, 4, 7,
+ 11, 5, 9, 13, 9, 1, 2, 3, 4, 5, 6, 17, 0, 7, 8, 18, 33, 49, 19, 65, 81, 9, 20, 34, 97, 10, 21,113,129,145,240, 35,
+ 50,161,193, 22, 23, 24, 66,177,209,225, 25, 26, 36, 40, 51, 56, 73, 82, 98,232,241, 72,104,105,136,168, 41, 52, 57, 67, 84, 88,
+120,150,178, 37, 38, 68, 83, 87,115,130,135,147,152,181,200,210, 54, 89, 99,114,146,184,213,214,215,255,196, 0, 29, 1, 0, 0,
+ 6, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 5, 6, 7, 1, 4, 8, 9,255,196, 0, 80, 17, 0, 2, 1,
+ 2, 4, 4, 3, 4, 6, 7, 5, 7, 0, 7, 9, 0, 1, 2, 3, 4, 17, 0, 5, 18, 33, 6, 19, 49, 65, 7, 34, 81, 20, 97,113,
+240, 8, 35, 50,129,161,209, 21, 66, 82,145,177,193,210, 36, 51, 98,162,225, 9, 67, 83, 84,114,130,241, 52, 56, 68, 85,116,148,
+211, 22, 23, 24,115,131,146,147,180,181,255,218, 0, 12, 3, 1, 0, 2, 17, 3, 17, 0, 63, 0,159,198,150,150,150,134, 6, 22,
+150,150,190,100,122,143,199, 67, 3, 31,116,203,220, 60, 68,108,181,171,123, 70,219,170,254,224,209, 41,183,140,167, 25,101, 20,
+135,189,241, 73,101,249, 28,165,136,243,170, 77, 69, 84, 74,116,149,133,163,149,185, 15,180,226,185,211,132,158, 97,151,159, 35,
+212,126, 35, 92,108,227, 63,131, 43,145, 85,251,143,120, 54,213, 18,235,236, 86, 37,191, 87,185,237,148,243, 72,170, 67,146,224,
+ 11,147, 81,162,128, 57,167, 69, 42, 5, 75,143,213,230,242, 75, 94, 34, 50,148, 86,158, 42,113, 39, 27,112,159, 14, 38,119,193,
+ 60, 55, 23, 19,212, 81,204,173, 89, 4,134, 67, 34,209,128,198, 87,130, 56,138,188,146, 2, 0,242,151, 49,169, 50,114,101, 1,
+128,179,188, 40,225,158, 7,226,222, 37,108,143,142, 56,150,110, 23,166,172,133,150,142,120,196, 98, 54,173, 44,162, 36,158, 73,
+ 85,146, 56,200, 44,124,193, 4,140, 4,124,232,139, 41, 61,145,109,196, 58,132,173,181, 37,104, 80,200, 82, 72, 32,131,243, 26,
+247,174, 11,240,211,199, 61,219,180,206, 66,179, 55, 36, 79,186,108,118, 29, 68, 54,166, 58, 92,122,228,181,217, 65, 13, 22,219,
+ 47, 30,106,157, 61,174, 95,242, 14, 16,243, 97, 37, 45, 44,128,150,181,219,219, 46,247,181,247, 6,129, 2,231,180, 43, 48,171,
+148,106,139, 65,216,211, 33, 58, 29, 65,232, 57,219,113, 63,172,203,233, 86, 66,219, 88, 74,208,160, 66,146, 14,147,240,211,197,
+174, 19,241, 67, 46, 53, 25, 37, 79,179,102,180,202, 13, 86, 95, 49, 2,166,156,244, 38,219, 9, 97,213,178,207, 29,212,220, 7,
+ 17,201,120,194,158, 38,248, 69,197,190, 22,102, 66,159, 60,166,246,156,166,165,136,165,204, 33, 4,210,212,142,160, 95,115, 12,
+218,119,104, 36,179, 11, 18,134, 72,237, 33,202,244,180,180,181,103,226,173,194,210,210,210,208,192,194,210,210,210,208,192,194,
+210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210,
+215, 13,125,163,254,220, 13,158,224,130,240,159,178,214, 5,156,238,249,111,173, 45,150, 21,116, 81,219,173,155,110,200,219,199,
+ 39,194, 98,116, 8,215, 53,192,138,116,167,170,213,245, 68,151, 17,255, 0,171, 32,177,132, 50,233, 76,186,132, 39,249, 26, 91,
+214, 67,195,217,207, 19,102, 9,149,228,116, 47, 95, 90,224,177, 85, 42,161, 80, 16, 11,200,238, 85, 35, 64, 72, 5,157,128,185,
+ 10, 46,204, 1, 98,226, 46, 38,200,248, 79, 45,124,219,136, 51, 20,203,104, 81,130, 6, 96,204,206,237,114,169, 28,104, 26, 73,
+ 28,128, 78,148, 86, 58, 85,152,128,170,196,119, 43, 75, 80,124, 63, 73,159,141,131, 84, 83,195,103, 56, 94, 20, 82,242,212,138,
+127,240,103,117, 13, 77, 44, 20,171,195,105, 85,127,227,115,194, 91,193,101, 37, 75, 16,146, 20, 1, 1,180,147,204, 58,247,192,
+ 39,183,219,102,184,168,189,173,253,156,222,171, 32,236, 38,233,221, 18,227,210,109, 58,154,110, 6,238, 13,182,188,107,111,132,
+162, 53, 29,138,204,184,113, 36,218,181,233,114, 84, 26,131, 10, 91, 82, 88,144,233, 68,118,234,107,152,244,120,206,205,115,175,
+ 7,248,243, 35,161,151, 49,169,202, 86,166,150,157, 75,200,105,230,142,102,141, 64,185,102,140, 17, 33, 10, 55, 98,138,225, 64,
+ 44,108,160,156, 64,178, 47, 27,188, 58,226, 12,194, 28,174,151, 57,106, 90,186,150, 9, 16,169,134, 72, 82, 71, 38,202,171, 35,
+ 3, 26,179, 27, 5, 18, 50, 22, 36, 42,130,196, 12, 72, 35, 75, 94, 80,180,173, 41, 90, 8, 82, 84, 1, 73, 29, 65, 7,204, 29,
+122,213, 97,139,107, 11, 75, 75, 94, 29,117,182, 91,113,231,156, 67, 76,180,133, 56,235,174, 41, 40,109,182,208,146,165,184,226,
+212, 64, 66, 2, 65, 36,147,128, 6, 78,134, 6, 61,233,107,140, 28, 63,123, 94,236,238, 39,253,160,119,151, 9,219, 61,108,210,
+ 43,219, 63,103, 88,247, 29, 77,157,231, 77, 86, 91,178,239, 43,178,215,171, 80,169,213, 69,219, 84,214,227,166, 57,178,252,106,
+195,236,197,150, 92,117, 83,126,173,247,214, 23,238,178, 89, 3,231,181,219,218,129,127,123, 56, 15, 15,137,177,182,194,209,220,
+115,188,169,221, 85, 85, 13,213, 86,172,210,254,165,254, 47, 78,219,136, 94,225,245, 74, 79,188,123,199,240,222, 95,139,226,126,
+167,184,183,201,250,202,212,182, 30, 7,226,105,179,220,183,134,191, 71,242,179,156,218, 1, 81, 12, 50, 72,136,121, 70, 41, 38,
+ 5,203, 48, 17,183, 46, 39, 37, 28,171,130, 52,149, 12,109,136, 92,222, 32,240,164, 60, 61,154,241, 87,233, 46,118, 69,147, 78,
+105,167,158, 56,228,145,121,162,104,160, 34, 48,170, 90, 84,230,202,138, 36,140, 50, 48, 58,149,138,139,227,180, 26, 90,134, 23,
+247,207,155,251,255, 0,155, 30,209,127,235, 93,227,255, 0,232,210,254,249,243,127,127,243, 99,218, 47,253,107,188,127,253, 26,
+152,127,247, 29,226, 55,254,233,139,255, 0,155,166,255, 0,234, 98, 19,255, 0,226, 11,194,239,253,245, 55,255, 0, 37, 87,255,
+ 0,210,196,207,116,181,166,252, 3,241, 57, 89,226,255, 0,133,157,171,223,235,138,219,165,218, 85,203,250,153, 89,157, 81,183,
+232,178,101,204,165,211,157,166, 93, 53,202, 3,109,195,147, 56,120,175, 33,108, 82,154,113, 69,125, 66,221, 80, 29, 0,214,228,
+106,172,174,163,168,203,171,107, 50,250,180, 17,213, 80, 75, 36, 50,168, 33,128,146, 39, 40,224, 48, 36, 16, 25, 72,184, 36, 30,
+160,219, 22,246, 95, 93, 77,154, 80, 80,230, 84,110,100,163,204, 97,138,120,152,130,165,163,153, 22, 68, 37, 88, 6, 82, 85,129,
+ 32,128, 71, 66, 47,133,165,165,165,173, 92,110, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105,
+105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,105,104, 96, 97,105,105,107,
+ 3,168,110, 45, 6, 60,249,116,122, 75, 21,123,182,183, 5,239,118,155, 75,181, 41,174, 85, 12, 9, 92,174,168,197,170, 85,150,
+166,169,212,105, 67,194, 32,183, 54,108,117,130,164,229, 32, 40, 29, 12, 12,103,154, 90,104,166,239, 21, 38,143, 91,167,219,119,
+ 13,169,123,209, 43,245,152, 83, 39,208,233, 9,165, 83, 46,121,213,134, 41,225,159,126, 83, 12, 88,181,170,177,130,134,188, 97,
+151, 38,251,171, 42,228, 95, 35,139,228, 86, 47,143, 95, 53, 54,130,157,111,109,119, 6, 76, 70,208, 28,118, 91, 44, 90, 40, 45,
+183,221,106, 77, 58, 85,222,220,217, 43, 74,114, 75,108,197,113,213, 99,149,182,214,178, 18, 70, 6, 28, 29, 45, 88,232, 23, 37,
+ 18,231,136,236,202, 36,244, 76,110, 60,135, 33,205, 97, 77,191, 18,125, 54,115, 56, 47, 83,234,212,201,141, 55, 38,149, 80, 64,
+ 82, 10,216,146,211, 78,164, 45, 36,160, 5, 2,111,154, 24, 24, 90, 90, 90, 90, 24, 24, 90, 90, 90, 90, 24, 24, 99,120,143,168,
+110,117, 51,103,174,233, 91, 65, 29,201, 23,200,138,203,116,255, 0,119,109,167,170, 12, 69,114, 67,104,169, 72,165, 50,240, 40,
+118,166,136, 69,226,200, 32,144,175,137, 0,184, 17,174, 20, 60,223, 25, 18, 95,121,199,215,190,238, 72, 83,138, 83,202, 92,139,
+187,156,186,165, 18,178,175,210,126,183, 54,117, 36,133, 36, 40, 16,160, 8, 61, 8, 35, 32,253,218,208,158, 40, 56,198,176, 54,
+ 85,185,246,165,163, 22,151,119,238,105, 66,153, 92, 54,212,151,168,214,187,171, 78, 67,245,249, 12, 43,244,179, 83,148,148,194,
+109, 65,206,185,121,108,167,148, 47,157, 60,116,224,190, 27,204, 99,139,140, 56,175,196,124,203,131,114,188,170, 14, 66,193, 75,
+ 56, 17, 77, 38,167,144,114, 96,182,185, 42,165,190,146, 16, 51, 50, 70,132,233, 84,102,199, 72,120, 15,198,220, 77,151, 75, 55,
+ 7,112,151,134,185,103, 26,102,153,172,252,246,158,170, 2,101,134, 61, 49,198,121,211,223, 68,116,145, 17,172, 23,210,170,242,
+ 53,139, 51,170,227,143,215, 53,223,196,133,153,238,191,194,219,167,117,237,195, 59,196,247, 52,214,107,151, 20, 5,201, 13, 99,
+196, 83, 45,200,148,149, 45, 41, 42, 0,144, 49,147,140,231, 88,195, 91,199,188,114, 93,109,134, 55, 39,112,100, 60,226,194, 90,
+101,171,158,186,235,142, 44,159,133, 40,109, 50,201, 90,179,216, 0, 78,177,155,198,244,186,247, 18,225,151,114, 93,181,137,181,
+218,221, 69,209,207, 34, 82,202,131,105, 39, 13, 68,134,194,112,136,145, 17,156, 33,166,210,148, 36,118, 25, 36,157,221,188, 47,
+ 45,145,246,104,112,186,239, 19, 59,221, 70, 93,217,123,214,159,133, 73,179,173, 8,106,140,213,106,227,187, 42,177, 94,153, 78,
+181,233, 18, 37,182,177, 72,167,177, 22, 51,207,212,167,150,214, 25,110, 59,132, 37,229,170, 52,119,121, 7,194,159, 15,120,203,
+198,222, 60,159,134,248, 23,136, 51,106,108,146, 23, 75,212, 85,212,201, 45, 66,164,141,162, 37, 49,195, 36, 81, 52,243,178,187,
+ 44, 97,214, 56,145, 92,188,204,177,150,110,196,241,107,196,110, 10,240, 51,128, 32,226,126, 62,225,252,162,167, 58,153, 28,251,
+ 61, 37, 52,112,211, 51, 70,161,230, 97, 36,209,203, 42,211,192,172,138,210, 20,105, 37,118,141, 82, 21,105, 2,174,163, 72,218,
+189,222,170,162, 69,126, 85,135,123,206, 76,183, 23, 46, 77, 77,218, 13, 81,227, 33,199,137, 91,146, 29,120,199, 37,106, 82,148,
+ 73, 81,238, 73, 58,203,118, 91,127, 55, 47,135,155,149,114,173,233, 18, 19, 1,201, 8, 23, 5,159, 86, 18, 27,166,212,210,217,
+229, 80,122, 50,192, 84, 10,130, 81,144,135,219, 1,196,246, 80, 91,101, 77,171,150, 85, 47,164,143,198, 35,151, 97,170, 81,118,
+183, 97,169, 54,130, 37,133,179,102, 61,111, 92, 53, 14,120, 40, 95,195, 22, 93,192,171,133,185, 46, 62,166,176, 22,235, 65,161,
+204, 74,144,218, 6, 18, 59,121,195,151, 16, 59, 31,237,121,225,250,232,188,108,251, 74, 62,216,241, 35,181,232,138,205,221,106,
+ 37,246,165,173,185,210, 97,201,126,152,244, 42,139,108,182,186,213,159, 85, 16,103, 34, 50,222,109, 50, 33,200,136,182, 92, 7,
+194, 14,201,234,207, 16,126,128,222, 38,248, 71,147,143, 16,120, 59,138,106, 38,207, 50,127,174,217,162, 46,210, 29,204,124,216,
+156,104,105,141,227, 9, 42, 77, 79, 51,176,134, 89, 64,146,237,200,222, 28,127,180, 43,194,191, 25, 51,195,225,207, 24,112,181,
+ 60, 89, 30,113,245, 32, 50,202, 17, 98, 29, 36, 17, 76,191, 88,176,139, 72,205, 19,193, 81, 10, 35, 77, 20, 76, 99, 32,118, 27,
+ 96,248,137,177,183,250,218, 21,123,106, 66,161,213,225, 37,166,235,214,228,213,160, 84,232,242,156, 78, 64,113, 41, 56,147, 13,
+101, 43,240,159, 71,192,224, 65, 7,149,105, 90, 19,106,226, 39,139,222, 29,184, 78,110,198,145,196, 38,229, 82,246,206, 6,226,
+214, 42, 20, 27, 86,171, 91,137, 84, 93, 38, 85, 78,151, 17,153,211, 89,157, 82,131, 5,214,105, 13,162, 43,237,171,196,148,182,
+ 91, 86, 72, 74,138,129, 26,224,102,199,110,133,115, 99,247, 86,135,116,199, 84,134, 26,129, 81,250,170,231,166, 5,148, 9,180,
+119, 95, 17,234,144,223,108, 28, 41,230,185, 75,173,103, 33, 47,197, 65,236, 8, 56,167,210,118,170,198,173,240,251,194, 53, 82,
+ 35,168,126, 52,237,202,189, 36,178,235,106, 10,109,214,222,179,169,238, 54,226, 20, 58, 41, 37, 10, 4, 31, 67,171, 87,232,151,
+199,112,248,245, 61, 22, 67,196,119,203,243,234, 9,141, 61,127,179,133, 66,234,105,230,150, 10,168,209,213,213, 57,175, 11,164,
+177,216,133,120,223, 78,133,116, 11, 85,125, 48,120, 26,127,163,229, 30, 99,196, 92, 52, 23, 49,200,107, 97, 90,156,188, 84,150,
+112,140, 42, 96,138,162,146, 87, 70, 70,147,148,147, 35,197, 32, 96, 89, 36,143, 86,182, 71, 38, 80,214, 61,247,102,238,101,169,
+ 68,190,118,250,231,162, 94, 86,117,203, 5,186,157, 2,229,183,106, 17,170,180, 90,196, 7, 74,146,220,186,125, 66, 35,138,110,
+ 83, 5, 72, 80,230, 66,136,202, 72,238, 8,214, 89,168, 64,112,175,237,189,221,253,134,225,159,102,120,123,225,163,133,105,251,
+189, 82,218,155, 26, 53, 58,249,186, 43,172, 93, 53, 88,104,168, 59, 62,163, 61,244, 83, 40, 54, 52,101, 57, 18,156,216,146, 0,
+149, 42, 82, 84,242,185,200,142,216, 71, 50,250, 53,193,103,210, 48,176, 55,151,114, 45,253,161,226,123,106,154,216,235,138,230,
+171,179,111,210,175,154, 45,102, 69, 70,198, 98,189, 45,246,226, 66,166, 92,208, 43, 49,218,153,107, 54,228,197,120, 94,244,183,
+101, 50,219,175, 32, 72, 17,218, 11,121, 61, 57,156,120, 63,198,153,119,233, 74,154,108,168,214, 80, 80, 73, 45,180,205, 3,212,
+154,116,102,229,204,244,233, 33,144,107,140, 7,210, 20,181,143,217, 29,185,103, 35,241,187,128,243, 63,209, 20,149, 89,184,162,
+204,179, 40,225, 7, 84, 53, 9, 74, 42, 93, 19,153, 2, 84,188, 98, 35,203,145,140,122,139,232,184,251,102,226,253,250,171,113,
+ 37,195,245, 6,251,107,107,171, 91,211,182, 52,173,200,122,165, 79,163, 51, 98,207,189,104, 17,110,183,106,213,101, 50,154, 93,
+ 53, 20, 39,167, 9, 42,157, 33, 82, 99,134, 90, 13,243,184, 95, 72, 64, 60,195, 47, 80, 32,128, 65, 4, 17,144, 71, 98, 53, 2,
+158, 50, 84,211,191, 72, 26,128,243, 1, 10, 14,113, 65,195,147,232, 82, 80,159,137,193, 34,193, 91, 78,246,248,156, 5, 45,144,
+174,224,164, 16,122, 13,118, 87,143, 15,111, 68, 62, 31,247, 89,238, 25,120, 83,218,134, 55,231,120,232,117, 24,214,189,203, 90,
+170, 59, 86,145,107, 83,239, 39, 22, 24,122,204,183,168, 86,222, 39,222, 53,230, 36, 56,219, 82, 84,212,136,236,177, 41, 11,138,
+145, 33,196, 56, 91, 91, 48,240,167, 51,118,225, 88,120,116,201,154,212,103,249,106,102, 51,243, 57,112,197, 76,172, 19, 86,169,
+ 89,130, 8,193,123, 6, 98, 25,182, 0, 19,182, 17,203, 60, 97,202,145, 56,190,163,137,196,121, 61, 47, 14,230,178,101,148,252,
+190,100,210,213,186,151,211,162, 37, 82,237, 35, 4,185, 84, 5, 84, 92,179, 1,190, 36,133,165,168,139,220,190,218,255, 0,106,
+111, 13,237, 80,239,190, 41,184, 29,183,169, 27, 89, 90,168, 69,138,228,225, 66,187,237, 23, 16,167,193,117, 20,246, 46, 35, 90,
+169, 70,163, 85,156,101, 14,120, 77, 84, 34,149,172,182,172, 54, 74, 84, 7, 85, 46,223,109,143, 13, 22,231, 5,182, 47, 26,148,
+171,102,247,187,237, 43,183,112,233,251, 83, 88,178, 40,166,138,205,225,100, 95, 50, 40, 85,218,228,250, 85,194,221, 66,123,108,
+120, 76, 51, 65,115,145,214,150,161, 37,154,132, 89, 13, 39,195,116,242,177,215,248,105,197,180, 35, 47,120,168,226,205,105,243,
+ 57,189,158, 25,168,170, 33,169,137,167,177, 60,146,241,185, 8,246, 6,193,244,130, 65, 0,146, 8,196,131, 46,241, 91,131, 43,
+206,100,147, 87, 77,147,212,229, 48,251, 76,240,215,211, 79, 73, 50,211,220, 14,112,142, 68, 5,227,187, 45,202,106, 32, 16, 72,
+ 0,223, 29,148,210,212, 92,183, 35,233, 31,162,243,160,209,233,124, 25,112,161,184,187,163,185, 51, 34, 63, 58,227,131,120, 83,
+170,147,233,118,147, 44,202,113,150,152,250,163,111,196,153,119, 10,221,142, 27,116,188,153, 48,153, 96,159, 12,248,202, 37, 72,
+198,248, 54,250, 69,151,109,251,190,214,214,200,241,107,178, 86,230,220,166,238,185, 96,217,113, 46,235, 45, 87, 21, 53,219, 86,
+231,169,204, 77, 62,159, 26,239,181,110,153, 50, 30, 76, 37,212, 94,142,195,174,178,251, 78, 69, 46,135, 23, 29,196,133, 99,108,
+248, 71,199,171, 65, 85, 94,249, 46,143, 99, 86,119,128,205, 7,180,136,210,247,113, 0,144,200, 87, 98, 84, 91, 83,129,116, 86,
+ 4, 95, 68,120,211,225,211,102, 52,121,116,121,233,147,219,157, 99,142,160, 83,212,123, 33,145,237,166, 51, 80, 99, 17,134,243,
+ 0,198,250, 99, 38,210, 50,144,109, 43, 29,120,113,198,217,109,199,157, 90, 91,105,164, 45,199, 28, 89, 9, 67,109,161, 37, 75,
+ 90,212,122, 37, 33, 32,146,124,128,215, 14,253,164,222,219,221,157,224, 86,233, 59, 61,101,218, 15,111, 86,249, 34,155, 14,165,
+ 92,161, 49, 88, 69, 18,210,176, 89,169,199,110,101, 41,155,170,176,220,103,222,151, 90,126, 19,172,190,154,124, 86,130,209, 30,
+ 75, 79, 63, 37,143, 17,182,220,230, 77,175,244,142, 56,132,142,220,122,222,253,112, 91,245, 86,205, 92,140,191, 79, 85,221,100,
+ 38,245,165, 74,102, 61, 69,151, 99,183, 46,153, 83,187,226,187, 77,174,184,128,224, 80,100, 59, 27,198, 13,148,165,214,201,230,
+ 8,229, 94, 22,113,190,113,150, 83,230,244,153, 69,168,170,198,168,121,147, 65, 20,147,169, 23, 6, 24,228,145, 93,245, 13,211,
+ 97,172, 88,173,193, 4,175,156,120,191,192, 25, 38,109, 81,146,214,231,119,174,163, 58,103,229, 65, 81, 52, 84,237,123, 17, 52,
+177, 70,232,133, 78,207,185,229,155,135,210, 65, 2, 71,219, 95,199,191, 8,187,217,187,147,118, 59,104, 55,194,208,220,189,198,
+166,208,234, 87, 13, 70,153,102, 59, 46,189, 76,133, 76,164,205,137, 79,158,183,238, 88, 81, 85, 78, 18, 91,151, 54, 58, 11, 41,
+148,167, 73, 89, 33, 4, 37, 68,109,254,160, 19,244,127,110,123,126,214,227,115,113,175, 26,237, 82, 45, 14,212,183,182, 43,113,
+ 46, 74,213,102,160,164,196,131, 73,183,233, 85,139,126,167, 62,165, 57,121, 34, 52, 86, 32, 48,235,174, 30,161, 9,104,247,198,
+186,103,185, 63, 72, 83,125,183,147,120, 38,237, 23,179,215,133,198,183, 45,182,164, 77, 98,145,112,222, 16,174, 10,229,197,113,
+192,167, 58, 82,245,199, 30,212,183,230, 68,102,215,162, 45, 1, 42, 11,168, 75,116,161,181,165, 79,248, 14, 57,225, 53, 36,226,
+ 95, 8,115, 26, 94, 38,172,201,120,104, 61, 93, 6, 89, 75, 4,245, 53,117,114,195, 4, 81, 25, 67,146,100,145,185,104,163,202,
+ 74,160,212,224, 2, 73, 32, 18, 34,220, 41,227, 94, 89, 89,194,148, 57,247, 21,178, 81,102, 57,181,101, 69, 61, 45, 29, 20, 83,
+212, 77, 48,132,160, 2, 56,151,153, 35,155,184, 12,231, 66, 18, 85, 64, 4,128,101,135,165,168,156,219,158,223, 30, 44,184,114,
+221, 75,123,111,253,161,252, 36, 55,183,244, 42,247,131, 37,117,235, 78,155, 93,160, 92, 80,232,239,201, 68,119,171,244,186,109,
+102,169, 54,159,121,211,227, 40, 44, 58,212, 57,113,220,230, 73, 71,139,226, 0,218,186, 89,198, 87,182,211,135, 30, 14,235, 27,
+ 75, 6,163,102,223, 59,171, 70,222, 93,176,167,238,197,161,117, 88, 18, 40, 31, 82,200,182,106,181, 25,180,248, 5, 70,177, 61,
+135,125,225,126,226,183, 10,124, 49,200,151, 18,149,128,224, 82, 83, 20,171,240,211,140,105,171,114,250, 40,178,177,152,182,106,
+143, 37, 52,148,179, 67, 60, 19,172, 66,242, 24,230, 71,208, 74, 13,202,146, 26,219,128, 70,248,152,209,120,173,192,245,116, 57,
+149,124,217,177,202,215, 39,120,227,171,138,178, 9,169,234, 41,218, 83,166, 46,100, 14,156,192, 28,236, 25, 67, 45,246, 36, 29,
+177,217,173,112,163,112,253,133, 28, 55, 95,188,105,212,248,162,173,202,171,215,108,187,186,163, 93,190, 47,125,152,175,202,157,
+ 87,160,214,183, 90,175, 85,141, 82,118,228,122,179, 46,114,165,201,181,228, 73,126,179, 50,101, 17,245, 57, 25,115, 93,105,180,
+ 56, 41, 5,116,160,202,240,191,237,190,220,158, 50,248,231,219, 77,158,218, 29,130,147,111,112,189, 93,145,119,193,184,247, 10,
+229,165,214,170, 87,151,189,209,182,206,237,185,233,142,205,168,210,100,170,143,106, 52,237,203, 71,166, 71,110, 59,134, 83,174,
+180,249, 30, 48,117,228, 33,185, 31,161, 92,200, 74,187,115, 37, 42,199,166, 64, 58, 74,170, 30, 49,240,218,181,169, 26,169,242,
+ 74,252,226,140, 25, 82, 41, 81,156, 65, 43,200,129, 36, 40, 91,149, 48,104,217,133,136,150, 59,130, 25, 75, 17,133,169, 38,224,
+127, 20,232, 22,181,105, 35,207,242,236,146,184,136,164,154, 23, 84, 53, 16,164,110, 94, 33, 32, 83, 44, 44,178,170,155,131, 20,
+182, 33,149,130,131,134,126,151,176,123, 71, 74,180, 27,176,226,237,253,162,205,158,136,126,226, 45,102,173,218, 59, 86,224,136,
+ 80, 27, 49, 69, 13,184, 98, 40,143,200, 0,228, 13,114,224, 99, 24,212, 4,189,180, 92, 57,109,223, 10,156,122, 93,182,174,205,
+192,141,105,218,119, 45,169,102,238,133, 50,218,161,145, 14,159,102,213,171,255, 0, 88, 69,169,211,168,140,199,193,165, 66, 53,
+106, 19,243,227,176,217, 74, 34,138,178, 89,140,150,163, 54,195, 77,254,136, 21, 90,173, 54,133, 75,169, 86,235, 51,225,210,168,
+244,120, 19, 42,149, 90,165, 66, 67, 81, 32, 83,105,180,248,238, 75,157, 62,108,183,214,148, 70,136,204, 86, 93,113,199, 22,160,
+132, 33,181, 41, 68, 0, 78,191, 57, 62, 35,175,107,151,218,161,237, 50,184, 37,109,235, 50,196, 29,229,220,202, 77,141,183,190,
+ 43, 14,184,170, 30,215, 90, 80,163, 80, 97,220,243, 97, 43, 10,140,219,118,133, 14,117,126,160,198, 73,109,217, 50,144,146,162,
+ 19,155, 39,192, 39,174,139, 62,226, 12,218,122,167,135, 34,160,161,145,235, 29,217,140, 69,217,213,208,184, 38,197,194, 71, 52,
+154,236, 88, 42,184,189,156,131, 86,125, 35,211, 47,155,135,120,111, 38,167,164, 73,184,135, 50,204, 35,142,133, 17, 84, 74, 17,
+ 81,146, 64,132, 0, 66, 51,201, 4,122, 1, 10, 89,144,218,233,113, 61,206, 11,119, 14,189,187, 28, 40,240,239,185, 23, 75,138,
+118,228,190,118, 83,107,110,250,243,171, 32,173,202,197,203, 99,208,235, 85, 53,168,134,209,146,102,205,124,159,129, 61, 79,234,
+167,176,217,253, 55, 59, 75,100,210,182,231,110,237, 11, 38,133, 20, 65,162,218,246,245, 30,223,164, 66, 7,152, 68,165, 81,169,
+241,233,212,232,193, 88, 25, 13,196,142,210,123, 15,213,211,141,170, 34,178, 72,102,172,170,154,158, 62, 77, 60,178, 59, 34,126,
+202, 51, 18,171,255, 0,106,144, 62,236,116, 69, 12, 83,193, 69, 71, 5, 76,188,250,152, 98,141, 36,127,219,117, 64, 29,191,238,
+ 96, 79,223,133,168,165,123,119,125,170,238,209, 91,175,240, 39,195,117,192,235,151, 29, 77, 14, 81,120,135,190, 40, 15,243,187,
+ 74,135, 49, 41,105,123, 57,111, 76,138,162,181,214,165, 33,194, 46, 23, 26, 41, 49,152, 90, 40,225, 78, 63, 38,166,204, 61,237,
+246,205,251, 82,224,240, 79,182,174,108,238,209, 85,161,203,226,135,116, 40,142,253, 82,227, 78, 37,255, 0,226,146,206,156,167,
+161,191,184, 53, 54, 18, 8, 53,247,252, 41,108, 80, 99, 56, 82, 61,229,165,212,159, 75,177,161, 8,147,185, 93,236,136,246, 94,
+213,106,214,149,199,198,255, 0, 17,212,217,179,238, 10,173,173,115,221, 27, 61, 64,185, 22,228,217,136, 85, 70,147, 62,106,247,
+ 98,229, 19,146,183,100,220, 18,214,234,221,164,120,203, 82,154,110, 66,170,174, 5,201,122, 11,177,110, 14, 3,225,236,179,135,
+178,212,241, 23,140, 33,215, 71, 11,133,202,168,154,193,235,170,175,228,151, 73,191,212,196,192,178,146, 8, 37, 76,132, 21, 68,
+ 89,105, 31, 17,120,151, 54,226,108,214, 79, 12, 56, 34,126, 93,116,209,151,206, 43,214,229, 40, 41, 45,231,132, 50,145,245,242,
+169, 10,202, 8, 32, 50,196, 8,105, 29,161,210,223,163,211,255, 0,132, 11,255, 0,169, 75,243,255, 0,199,236,141,116, 43,233,
+ 74,255, 0,148,224, 99,255, 0,154,226, 91,255, 0,107, 96, 53,207, 95,163,211,255, 0,132, 11,255, 0,169, 75,243,255, 0,199,
+236,141,116, 43,233, 74,255, 0,148,224, 99,255, 0,154,226, 91,255, 0,107, 96, 53,106,102,159,250,197,112,231,255, 0, 5, 39,
+255, 0,208,175,197, 59,147,255, 0,234,195,197, 95,252,124,127,255, 0,161,150,227,167,222,201,206, 30,246, 78,244,224, 27,134,
+234,253,209,181,155,125, 93,172,206,219,232,206,205,170, 85,108,219,118,161, 80,150,239,214, 85, 36,151,101, 76,151, 78, 91,146,
+ 29,229, 74, 71, 50,212, 78, 0,235,174,142,127, 36,254, 28,127,249, 20,218,239,253, 65,181,127,255, 0, 21,168, 67,236,206,242,
+251,107,106, 27, 11,183,118,135, 14,118,230,248,218,123, 35, 96,219, 49,169,246,138,246,239,108,225, 81, 63,132, 20,246, 12,185,
+ 95, 92,181,113, 85,232,203,170, 93,234,124,188,224,255, 0, 4,146,236, 21, 45,180,166, 60,100, 57,144,172,147,102,189,184,158,
+209,254, 22,247, 41, 54,175, 17, 19,170,123,167, 72,160, 84, 35,193,188,246,187,121,108,216, 86,109,253, 75, 99,149,165,201, 68,
+ 43,134, 21, 2, 5, 86,143, 93, 49, 75,106,105, 85, 86,234, 49,190, 62,117, 68, 87,136, 87,168, 78,113,225, 63, 21,230,217,158,
+127, 91,147,241, 53, 5,117, 75, 84,212,207,236, 81, 87, 72,103, 68,121,153,145, 24, 4,229,164,150,101, 82,174,202,138,219,115,
+ 58, 98,193,200,252,101,224,252,151, 41,225,202, 12,239,133, 51, 44,186,145, 41,105, 96,246,233,178,248,197, 59,201, 28, 17,171,
+186,157,124,201, 35,186,179, 6, 68,121, 25, 70,174, 95,164,237,173, 75, 62,218,177,233, 17,168, 22,157, 22,153,111,209, 33, 37,
+105,135, 73,163,193,139, 77,167, 68, 67,142,173,231, 17, 26, 20, 54,144,211, 9, 83,206, 56,178, 16,144, 10,156, 82,143, 82, 78,
+178, 93, 49, 28, 53,113, 19,183, 28, 85,108,189,139,190,123, 87, 80,118,125,159,125,210, 5, 74, 19,114,219,105,138,157, 46, 99,
+ 18, 31,167,214, 40, 85,152,204,188,226, 34,214, 96, 85,226, 78,135, 45,180, 56,227,105,126, 18,252, 55, 93,108,161,197, 62,250,
+231,250,168,106, 41,170,106, 41,234,227,104,170,224,119, 73, 85,193, 14,178, 43, 21,117,112,119, 12, 24, 16,215,222,247,190, 58,
+ 70,146,122, 90,170, 74,106,154, 41, 18,106, 58,136,209,225,120,200, 40,209, 58,134,141,144,141,138, 50,144, 84,141,172, 69,176,
+180,180,180,180,134, 54, 48,180,180,180,180, 48, 48,180,180,181,192,111,104, 5,251,125, 80, 56,143,220,198, 45,253,213,169, 89,
+ 9,183, 54,167,110,238, 27,118, 11,123,151,122, 90, 50,220,172,139,138,158,153, 72,178, 45,251,125,102, 37,197,116, 63, 9, 82,
+ 82,182, 38, 6, 89, 68,111, 26, 95,138, 30,142,216, 47, 57, 30, 78,249,221, 99, 81,164,226, 6, 84, 47,168,169,111,215, 68,181,
+129, 7,171,130, 78,246, 0,236, 78,216,215,169,168, 20,209,243, 10,234, 23,181,175,110,196,255, 0, 44,119,231, 75, 81,244,103,
+138, 29,229,219,186,190,226, 38,204,169, 55,100, 67,220,238, 34,247, 45,250,213,217,125, 65,164,205,147,104,206,165,216,118, 61,
+ 94,129,106,212, 95,186,100,197,162, 91,207, 73,151, 86,156,153, 30, 59,169, 82,141, 53,244,196,109,181, 55,135,114,241,198,191,
+ 22, 21,107, 15,123,247, 58, 21,239,182, 80, 41,252, 61,195,225,246, 85, 90,221,164,217,177,110, 10,125,254,238,232, 42, 29, 18,
+168, 34,221, 38,172, 62,174,129,245,162, 36,204, 82,163, 52,225, 82,101,134, 98,190,203,109, 37,110, 59,183, 5,230, 62, 70, 90,
+152, 57,114,114,192, 44,206, 14,169, 36, 72,144, 16,168,246,213, 43,132, 6,228, 91,204,218, 84,223, 8, 12,198, 29,193, 70,184,
+191, 64, 58, 0, 88,157,200,232,162,231,111,112,185,199,119, 52,181, 31,219,163,138, 13,215,187,247, 63,109,175,153, 87,125, 18,
+185,126,217, 23,151, 19, 82,104,252, 60,211, 45,201, 52,233,150, 71,240, 34,193,174,162,217,167,220,143,211,222, 93, 66,233,145,
+ 84,147, 75,108,134,220, 72,230,113,130,136,203, 97, 74,115,194,187,218, 60,116,241, 71, 94,159,183, 22,253, 63,112, 54,166,175,
+ 63,117,119, 39,104,237,104,115,229, 80,109,233,245, 11, 49,235,225,117,154,109,106,149, 86,182, 45, 90,232,117,138, 91, 85, 35,
+ 79, 91,126,254,228,106,167, 37, 61,109,158, 66,226,214,144,220, 23,153, 8,213,214,162, 27,132,212,225,139,174,147,174, 69, 33,
+ 78,131,172, 1, 25,109,118, 10,194,252,179, 32, 1,136, 25,140, 58,136, 42,221,108, 45, 99,125,129,245,219,115,107,117, 29,237,
+142,245,233,107,147,209,223,222, 43, 46,151,189,123,171, 87,168, 91,247, 45,193, 96,238,236,107, 86,163,184, 18,175, 13,204,135,
+ 26,223, 51,155,219,155,122,229,185,225,109, 4,121,171,160, 11, 66,149, 6,229,173, 86, 75, 18,101,144,211, 81, 94, 47, 30, 86,
+130,245,116,153,197,253,205,104,175,125,224,212,119, 98,196,186,104,182, 78,217,238,236,253,159,220, 25, 80,109,250, 84, 61,204,
+189,109, 75,111,110,106,180, 88,240, 28,129, 37, 16, 46,122,140, 59,158,240,173,209,164, 71,165, 4,181, 37,202, 9,253, 10, 30,
+ 67,199, 90, 31,253,157,169,144,255, 0,100,153, 42,109, 96,108, 24, 93,173, 25, 33,108, 27, 96, 37, 66, 3,232,144,141, 71,151,
+101, 98, 20,246,180, 31,222, 41, 75,252, 58,110, 5,250,122, 30,151, 3,109,247, 24,234,110,150,185,121,125,113, 27,190,246,141,
+ 14,226,220,138, 85,122,149, 95,137, 79,221, 29,192,219, 42, 86,219,187,104, 69,247, 57, 66,135,195,181,213,186,212,122,171,149,
+122,104, 85, 74, 93, 76, 92,212, 56,173,120, 13,169,182, 94,140,242,153, 95,134,178, 36,161,188,127,125,171, 86,214,225,238, 11,
+ 22,199, 16, 84,107,178,163,121, 39,108,124, 29,207, 68,141,169,183,108, 72,233,163,237,245,233, 92,170,211,106, 53,186,204, 89,
+ 52,202, 39, 35,139,138,182, 99, 49, 2,101, 90, 83, 81,212,194,240,184,239, 73, 25,143,134,171, 36, 66,194,104,254,198,161,110,
+ 97, 23, 14,138,202,199, 64, 11,164, 54,162,119, 6,214, 93, 86, 98,161,171, 35, 6,218, 79, 91,118,238, 9, 4, 11,239,126,158,
+238,246,218,253,134,210,215, 23,168,252, 66,238,173,122,152,237,253, 54,243, 85,110,231,171, 76,225,138,243,161,236,203, 18,102,
+193,102,123,213,219, 34,129, 34,173, 62,218,133, 2,172,137,173,218,242, 46,180,203,140,244, 86, 80,236, 39,101,213,208,220,211,
+ 33,228,132,186,236, 80,248,135,221,139,146,237,218,187, 18,214,222,123,102,243,129,185, 51,246,200,220,219,133,110,217,182,220,
+151, 54,246,175,118, 89, 27,207,114,220, 59,126,196, 88,238, 61, 5,154,162,127,128,148, 71,161,179, 83, 67,181, 56, 13,161,255,
+ 0,172, 27,152,151,144, 18,105,120, 98,178, 37,118, 51,199,104,151, 83,147,204, 1,108,138,237,184, 67,125, 33,173,125,181, 16,
+ 66,106,107,129,133,173,141,136, 1, 79,155,167, 77,247, 32,119,239,248,119,182, 58,147,171, 69,118,187, 74,182,233,114,107, 21,
+153,105,135, 2, 47,132,149,185,225,188,251,206,189, 33,212, 71,139, 18, 28, 72,205,173,217,211,223,148,235, 45, 49, 29,148, 45,
+231,222,121, 13, 52,133,184,180,164,182, 60, 63, 94, 23, 13,249,180,118,173,203,117,202,141, 58,225,125,219,146,149, 84,168, 68,
+134,221, 57,154,140,139,106,235,174,219, 34,165,238, 12,168,183, 13,217, 13, 81,219,121,198,219,253, 26, 28,125, 73,108, 37, 1,
+ 41, 13, 62,232,111,214,218, 88, 87, 53,221, 90,189,235,241,103, 84, 54,214, 35,223,192,237,191,166,243,212, 43,146,234,168,162,
+210,230,214,174, 85,210,219,108, 4, 84, 20,139,146, 5, 54, 10,228, 56,219,108, 55,239, 43,109,212,137,238, 41, 44, 50,192,240,
+207, 45, 59, 88,201, 19,178, 27,116,186,146, 13,137,182,215, 29, 72, 27,117,198,210,176,101, 86, 29, 24, 3,251,247,199,221,233,
+222,106,181,159, 75,167, 84,174,234, 93, 66,210,177,231, 69,184,235,115,168,180, 74,161,155,188,183, 37,187,104, 81,151, 91,175,
+ 70,163, 80, 40,200, 81,166, 32, 83, 84,169, 82,149, 18, 91,178,216,139, 78, 83, 11,126,159, 42,107, 42,103,136,187,179,237, 34,
+226,147,119,235, 63,197,223, 8,251,124,189,158,219,184, 97, 16, 40,176,233,212,196, 92,251,157, 84,166,150,212,167,102,185, 76,
+180, 34, 77,106,221,117,114, 22, 2, 25,135, 45, 15, 52,181, 45,110,204,125, 71,175,108,182, 23,109,174,187,130,169, 84,222,157,
+223,125,186,149,249,123, 65,247,101,210, 60,100,212,104, 54, 69,155, 36, 7,224,237,133,176,149, 2,203,148,166,146,166,158,173,
+205,109, 3,235,170,160, 43, 86, 98, 69,134,211, 59, 51,104,216,150, 77,129, 77,110,141, 99, 90, 54,213,159, 74,109, 41, 66,105,
+246,205, 18,155, 68,137,132,126,169, 91, 20,232,205,165,197,117, 57, 82,129, 81, 36,146, 73, 39, 78,217,109, 94, 95,150, 60,146,
+ 85, 80,254,145,169, 22,208, 11, 40,141, 58,223, 82,180,114, 93,186, 91, 96, 71, 98,164, 27,234,212,195, 81, 80, 21, 35,159,217,
+227,223, 81, 0,150, 61, 45, 98, 25,108, 58,223,168,247, 17,136,175,109,165,111,136, 46, 22,110, 90,253,251,188, 55,190,238, 65,
+226, 39,118,227, 73, 22,188, 43,214,173, 93, 15,170,216,230,151, 29, 53, 11,198, 13, 89,199, 26,118,108,119, 24,169, 38,135, 69,
+ 37,232,207,174, 19,213,119,127,239, 68, 64,213, 43,151,138,189,231,148,233, 93,203,191,247,220,103, 10,148,232,142,246,226, 85,
+105, 32, 96,149, 21, 51, 79,141, 84,100, 37, 35,175, 68, 55,129,142,128,107,190, 92, 81,109,158,214,113, 35, 67,184,108,237,202,
+102, 60, 43, 2,198,163,212, 42,247, 21,248,211, 49,155,173, 80, 37,183,202,252,118,173,218,155,209,221, 83, 79,170,117, 53,160,
+227, 77, 36,169,228, 67,121, 32,178,242,233,207, 57,194,234, 71, 15,220, 39, 90, 75,109,193, 77,191,119, 2,124, 94, 96,220,151,
+161,219,182,108,103,243,144, 18,185, 21,119,174, 89,106,100,163, 0,129,224,171,201, 60,131, 83,252,135, 54,165,204,160,150,105,
+ 50,197,106,184,152, 41, 60,176,194,223,170, 17,180, 5, 22, 29, 67, 58,155,146,119,189,240,193, 93, 73, 45, 59,170, 45, 73,228,
+176,184, 26,172,111,176, 36,139,220,223,181,129,216, 91,107, 91, 29, 21,246,100,113, 47,186, 91,235,125,110, 4, 59,162, 92, 75,
+222,214,164, 89,244,136,116,189,196,146,195,109, 87,221, 69, 6,164,227, 77, 68,157, 83,101,164,170,228,142,252,250,245, 93,166,
+ 94,150, 12,132,127, 7, 30, 90, 93,113,183, 73, 87,102,245,197, 62, 8,247, 59,106,118,179,113, 23,103, 90,182, 36, 75, 2, 30,
+235, 85,168,116, 25, 13,199,172,212,107, 14, 87, 43,209,216,152,205,189, 33,239,126, 9,109,170,147,105,114, 75, 75, 16,216,138,
+219,177, 93, 46, 62,219,134, 27, 74, 71,107, 53, 4,226,104,132,121,180,197, 40,197, 20,114, 5,101, 80, 0, 13,113,230,112, 20,
+149, 23,107,139, 2,109,109,247,185, 47,153,107, 22,165, 75,205,206,101,184, 39,115,107,116, 27,128,122, 88,239,235,233,133,165,
+165,165,168,254, 55,240,180, 29, 66,161, 2,147, 6, 93, 78,169, 50, 45, 58,157, 2, 59,178,166,206,154,251,113,162, 68,140,194,
+ 11,143, 72,147, 33,229, 4,178,202, 80,149, 21, 41, 68, 0, 6, 73,209,154,212,158, 53,182,250,255, 0,220,189,141,169,219,187,
+118,235,139,169,181, 89,166,213,106,148,134,158, 12, 59,113, 81, 32, 51, 52,201,162,180,181, 16,149, 58,102, 59, 6, 74, 80,165,
+ 0,225,167, 6,243,149, 0, 88,184,159, 52,173,201, 56,123, 58,205,242,220,170, 76,242,191, 45,166,150,104,105, 34,254,242,162,
+ 68, 66,203, 18,216, 19,118, 35,162,171, 57, 23, 8,172,214, 82,253,194,249, 85, 14,121,196, 89, 38, 79,153,230,209,228, 89,126,
+101, 83, 12, 51, 86, 75,253,221, 60,114, 56, 87,149,174, 85,108,160,245,102, 84, 6,197,221, 86,236, 52,131,138, 95,104, 4,186,
+199,214, 54, 22,197, 77,122, 13, 40,151,161,213,183, 5, 41, 91, 51,234, 13,245,109,214,109,116, 44, 5, 64,138,174,191,225,138,
+ 1,245,164,254,133, 45,116,112,232,102,217,108,157,245,187,134,183, 88,166,198,146,138, 37, 30, 21, 78,171, 88,184,102, 54,243,
+205,188,244, 72,207, 77,118, 44,101, 40,243, 79,168,186,180, 97, 88, 36, 32,185,206,226,129, 32, 43,100, 54, 19,129,203,238,248,
+173,181, 55,114, 41,115,173, 91,118, 27,233,241,105,111,225,154,189, 85, 72, 80,230,100,242, 40,251,132, 63, 37, 44,159, 21, 64,
+225,180,167, 62, 34,123,107,102,109,165,171,100,219,108, 91, 52,106, 68, 40,116,214, 97, 24, 34, 35, 12, 33,184,233,142,182,203,
+107,104, 54, 7, 80,164,169, 92,196,228,168,168,149, 18, 73, 58,227, 46, 26,240,155,196, 15, 27,243,131,198,254, 48,212, 79,148,
+100,169,175,216,178,205, 50, 64,197, 79,217, 84,129,142,186, 74, 91,129,173,223,251, 93, 72, 91,234, 0,172,216,237, 78, 38,241,
+115,195,223, 3, 50, 97,192,254, 13, 83, 65,156,103,114, 20, 53,217,166,164,168, 64, 71,218,103,168, 81,162,174,168,169,109, 8,
+159,217, 41, 75, 17,164,144,208,226, 44, 52,185, 13,195,169,211,165,188,142,118, 98,207,137, 33,212, 30,203,109,137, 13,184,226,
+ 8,249,165, 36,125,250,127,189,191, 59, 1,126,241, 15,193, 94,202,238,238,208,211,167, 93,244,109,151,184,170,119,101,215, 68,
+161,176,236,233,235,179,175, 10, 4, 24,142, 93, 76, 66,140, 20,185, 76,211, 95,167, 69, 50, 66, 18,165,179, 30,166,244,130, 3,
+ 76, 60,164,211,226,127,101, 42, 59, 29,186,181,187,117,109, 62,187,118,168,251,213,155, 78,162,182,200,106, 93, 34, 91,202, 95,
+186,135, 57, 66, 85, 38, 43,203, 84,119, 64,193,253, 26, 87,128,151, 18, 75,183,195, 79, 26, 53,221,151,166,139, 34,240,164,187,
+122,109,226,148,224,141, 17, 46,182,154,189, 13,183,212,165, 72,102, 2,165, 31, 10,109, 61, 74, 90,213,238,238,148, 4, 41,106,
+ 40,113, 41, 37, 5,151,232,189,226,236,127, 70,191, 20,115,188,175,140,233,189,135,151, 83, 26, 73, 43,163, 50, 69, 61, 47, 62,
+ 45, 50,104, 12,254,207, 83, 5, 76,154, 39,141, 95, 65, 49, 74, 20,198,204,234,241,244,170,240,114, 79,164,247,132,249, 46, 99,
+193,117, 94,220, 37,165,149,227,137, 29, 21,229,130,168,211,204, 26, 46, 97, 84,246,154, 89,233,163,215, 79, 35, 71,204, 2, 88,
+139, 9, 21, 81,160, 87,169,110,253, 27, 78, 31,247, 14,201, 78,246,241, 53,120, 64,159,107,237,173,207,108, 82,237,139, 90, 69,
+ 85,167,160,179,114, 68,163, 76,149, 92,175,220,241,144,248, 79,137, 70,138, 26,139, 29,153, 56, 45,188,228,137, 73,109, 71,193,
+ 94,122, 95, 89,143,236,147,185,110, 37,110, 61,103,134,205,190,118,245,118, 71,214, 47,186,246,201, 80, 28,168, 63, 81,230,241,
+ 76,135,214,152, 94,233, 38,103,139,215,198,113, 69,124,221,121,181,134,239,223, 25, 43,190,109,119, 54,195,105,109,159,226,243,
+110, 28, 97, 16,106, 24, 17,153,172,214,169,236, 0,134,169,158, 5, 63,244, 20,106, 55, 34, 82, 21, 29,165, 56,167, 82, 2, 22,
+180,183,204,210,189, 25,241,187,233,237,225,100,220, 3,152, 80,112,253, 92, 57,166, 99,153, 70,182,130, 10,152,234,164,119, 86,
+ 89, 18, 33,201, 5, 97, 70,145, 87,153, 52,237, 25, 88,195,132,133,228, 42, 7,154, 94, 3,127,179,211,197,122, 79, 17,114,220,
+207,136,233,166,203, 50,220,174, 70,250,249,233,164,165,141, 17,213,163,121,155,158,193,230,117,141,219,151, 5, 58,200, 30, 82,
+133,230, 72,149,201,211,219,222,171, 18,185,121,221,181,168, 8, 8,131, 86,185,107,149, 40,105, 74,121, 64,139, 58,167, 42, 76,
+127,132,143,135,244, 78, 35,167,207, 77, 71,183,193, 83,207, 4, 92, 7,166,161,226,120,232,185,171,137, 62, 46,121,194, 5,131,
+ 73,240, 82,160,174,160,134, 66, 7,221,173,145,216,173,173,169,238,230,227,208,109,120,108, 60,170,120,148,204,234,252,180, 33,
+ 69,184,116,136,238,161, 82, 57,156, 72,194, 30,120,132,178,214,123,173,224,113,202,149, 17,210, 31,105, 23,179, 6, 31,180, 15,
+107, 54,119,111,211,186, 82,118,157, 59, 83,112, 85,238, 6, 95,131,103, 71,187, 17, 86, 21,122, 52,122, 72,130, 99,187,113, 83,
+133, 57, 44,166, 58, 86,149,165, 78,133, 5, 20, 20, 12, 5,107,144,127,217,239, 11,228,156,117,155,248,159,196, 50, 53, 6, 69,
+ 81, 49,167, 14, 35,118, 89, 36,209, 81, 36,238,145,198, 25,217, 98,121, 98,141, 74,171, 13, 82, 58,223,200,246,236,191,246,140,
+186,241, 7,135,185, 87,133,124, 53, 18,230, 60, 67, 79, 0,168, 49,153, 35, 86,142, 62,101, 52,112, 70,242, 72,200,138,210,199,
+ 20,210,176,118, 83,166, 56,218,223, 88,151,102,125,130,112,118, 42,169,192, 62,220,155, 3,248, 58,253,211, 14, 69,121,189,216,
+141, 20,197,250,250, 61,248,229,122,168, 93,114,229,109, 39,197, 75,206, 82, 17, 78, 84, 37, 57,240,170, 2, 88, 75, 71, 8, 80,
+ 17,173,246,250, 13,156, 87,180, 78,224,103,100, 28,162, 63, 88,110,202,179, 25,220,245,218, 78, 69,118, 49,221,175,121,170, 25,
+141,184,237, 53, 69,181,220, 41,161, 42,215, 76,222, 83,227, 38, 98, 92, 68,140, 74, 75,192,117, 38,227,250, 54,119,189,161, 79,
+164, 73,216, 46, 46,110,123, 78,180,253, 25,154,101,232,154,149, 18,165, 73,135, 95,154,143, 16, 72,168,192,114,215,185, 18,237,
+ 62, 19,168, 82, 1,129, 35,223, 2, 20,149, 45, 50,202, 86, 27, 67,243,193,111,209,227,219,173,146,220,107,127,118,119,231,112,
+164,239, 85,205,109, 84,218,174, 81,173,207,169, 81, 69,178, 35, 87, 35, 60,153, 16,234,149,118, 37,204,149, 42,232,125,153, 9,
+ 75,205, 33,229,199,142, 93, 0,191, 29,240,156, 31, 80, 50,110, 36,240,255, 0,133,248,167,136,120,250,159,140,167,206,102,204,
+197, 81,139, 47, 20,147,199, 51, 60,242, 9, 52, 75, 52,159, 86,209,161, 80, 35, 44, 16, 5,210,199,204,186, 91,202,188,243,133,
+252, 73,226,222, 17,225,159, 14,106,120, 26,159, 34,131, 42, 52,130,108,204,214,211, 75, 2,165, 60, 92,190,100, 48, 71,245,171,
+ 35,134, 38, 64,165,201,109,106, 60,175,173,120,101,186,226,227, 30,216,222, 31,145,113,169,212,222, 13,238, 7, 6,204,215,213,
+ 43,196, 18, 19,114,181,106,109,123, 85, 19, 47,197,202,132,164,212,146,231,141,205,215,196, 74,201,235,211, 90,121,178,118,150,
+251, 86,248,244,118,209,176, 55, 14,149,181, 28, 67, 63,187,123,137, 77,165, 94, 87,124,150,160,183, 79,191, 68,251,137,138,172,
+ 71,101, 79,167,202, 75, 85,121,111,253, 99, 25,144,182,148,167, 95,150,150,144,124, 71, 18, 12,191, 55,139,216,145, 27,114,184,
+246,164,241,181, 23,126,103,210, 85, 77,220,141,186,220, 36,237,202,118,242, 36,168,229, 86, 2,232,107, 69, 32, 92,230,240,109,
+ 65,169, 66,136,128, 94,247, 2,166,125,229, 68, 33,194,145,159,188,127,251, 8,246,135,139,155,230, 86,246,237,181,237, 81,216,
+221,230,170,248, 18,174,153,244,186, 83, 85,171, 78,238,170, 68,109,180, 49, 90,169, 81, 81, 50, 35,244,171,136,165,166,146,236,
+232,146,128,119,194, 75,143, 69,117,254,103, 75,214, 91,226,215, 8, 67, 22, 85,150,205, 86, 35,138,175, 35,134,138,121,205, 36,
+147, 69, 73, 85, 26,176,229,203, 3,162,251, 69, 57,230, 48, 97, 30,180,109, 10,167,202,197,149,139, 52,240,103,141,106, 37,205,
+243, 72,104,140,147, 80,241, 4,245,244,244,226,182, 40, 37,173,163,149,163, 60,200,170, 35,145,189,154,161,121, 42, 80,203,203,
+117,214,204, 6,181, 8,220,174,226, 71,130,207,107,101, 91,105,167,218,220, 83,113,207,179,208,246,122,238,169,208,173,233,177,
+183, 54,243,164,208,173,170,181,102,101, 69,135,109,234, 98,103,201,178, 88, 45,207, 85, 69,134,150,209, 67,168, 82, 61,221, 78,
+173, 73,109,181,173, 58,117,197, 87, 1,155,253,192,167,179,178,235,160,238,229,199,101,215,173,141,200,226,147,102,174,107, 61,
+ 22, 93, 90,117, 86, 35,117, 8, 59,103,187,240,170,243,222, 92,168, 76,160, 38, 69, 61,202, 40,109,109,115,248,137,137,146,174,
+ 80,141,116,161,143,163,193,196, 46,228,213,168, 20,254, 34,120,219,187,111,155, 38,221,113,180,211,233, 77,199,185,174, 25,241,
+ 97,167, 8,114, 37, 29,203,202,228,122, 53,190,165, 48, 57, 82,234, 35,200, 8, 29, 60, 21,142,154,234,183, 19,126,200,187, 31,
+124, 56, 36,218,238, 11,108,125,198,175,109,125,165,181, 87,181, 22,242,163, 87, 39,211,158,220,106,188,245,210,168,215, 85, 46,
+ 68, 42,129,170,215,224,171,196,147, 34,233,147, 37,110,182,234, 91,105, 81,195, 44, 70,109,146,148, 54,214,158, 34,228,185, 53,
+ 87, 15, 81, 71,196,212, 85,249,107, 87, 71, 81, 94,180, 57, 43, 81, 65, 18, 68, 85,227,149, 89,109, 43, 77,170, 53, 86, 9, 12,
+154,144,144, 89, 2,128,238,210,120, 95,158,231,148,156, 75,152, 73,194,149,249,118,106,153,124,148,217,123,102, 25,242,215, 84,
+ 77, 36,193,146, 72,157, 90,240,164, 26,100,118, 66,243, 71,165,192, 96,175,172,152,216,127,163,207,182, 54, 85, 63,129, 26, 5,
+213, 18,131, 1,186,245,225,121, 94,117, 27,146,168, 35, 51,239,213,105, 84,250,195,212,170,127,190, 73, 8, 11,121,152,244,248,
+205, 54,202, 20, 74, 90, 10, 95, 32, 5,107, 39,133, 62,218,203,122,129,108,123, 96,109,245,210, 41,177,105,109,213,209,195,221,
+118,176, 97,180,134, 12,218,147,149, 56,208,159,168, 62, 91, 3,158, 81,133, 78,134,130,179,241, 17, 25, 57, 61, 53, 47, 47,103,
+175, 7, 75,224,115,135,139,127, 97,141,234,237,254,138, 5, 74,189, 81, 77,202,253, 13,187,113,201,102,185, 84,122,164,166,141,
+ 41,170,164,208,194, 90, 47,114, 3,239, 11, 42, 8,230, 56,206, 53,160, 92,119,251, 21,218,227, 43,139,138, 79, 20,201,223,169,
+214, 59,244,232, 27,125, 4,217,141,109,212,106,251, 11, 22, 36,247, 38,120,191, 94,185,121,196, 82, 76,164, 44, 39,151,221, 15,
+128, 83,205,151,129,228, 17,110, 24,227,108,134,131,196,238, 46,226, 60,195, 51,120,242,140,217, 51, 4,134,110, 92,238, 92, 77,
+ 42, 52, 0,198,177,153, 20,104, 81, 96,232, 2, 5, 0,233,176, 24,151,241,111, 0,241, 22, 99,225, 63, 5,112,190, 91,148,164,
+153,214, 76,249,107,207, 8,150,157, 4,109, 4, 46,181, 12, 36,105, 22, 38, 58,216,234, 40,236, 92,177, 35, 85,201,196, 94,166,
+255, 0, 4,227,251,102,171,138,226,141, 80,145,106,127, 43,106,227,151,155,183,111,130, 40, 41,134,253,197, 45,203,106, 77,100,
+206, 72,103,248, 45,250, 74, 26,201, 88, 17,189,203,148,159,208,106,118,219,255, 0, 77,225,202, 23, 11,155,155, 59,120,151,101,
+141,146,115,108, 43,142,220,242,235, 79, 83, 77, 2, 85,186,237, 13,231, 25, 76, 37,173, 94, 28,153, 78, 35,192,250,189, 49,242,
+243,146, 21, 28, 67, 5,242,214,185,225,237, 10,246, 37,236,223, 28, 51,160,110, 93, 50,230,159,180,155,231, 14,139, 6,141, 84,
+188,169, 20,168,245,170, 53,231, 14,149, 20, 69,166, 34,238,183, 93,151, 24,202,168, 48,195,108,176,204,230, 36,178,250, 35, 54,
+134, 94, 76,166,217,142,134,185,163, 99,253, 27,221,214,159, 80,165, 91,187,205,197,181,110,187,181,116,121, 33,246,109, 11, 90,
+155, 92, 73,125,180,171, 33,152,105,184, 43,142,194,160,169, 67,169,117,184,146, 84,156, 20,165, 25, 60,195,123, 59,206,248, 23,
+142, 41, 56, 79, 52,204, 56,182,110, 23,174,225,202,104,160,154,140, 82, 79, 49, 38, 34,167, 93, 35,197,104,209,156,173,149,152,
+146, 20, 70, 93, 84,165,153,191, 32,200, 60, 65,240,254,183,140,178,156,183,130,224,226,234, 14, 40,171,154,162, 10,227, 91, 4,
+ 0, 9,129, 81, 29,108,114,131, 35,162, 6,187,162,128, 11, 25, 66, 51,137, 46,188, 20,224,130, 37,122,161,107,241,207, 22,205,
+ 68,229,213,151,193,189,253, 34, 59,113,121,149, 53, 84, 40, 55,206,223, 79,185,147,150,134, 72, 22,172,106,177,123, 29, 60, 36,
+ 57,159,135, 58,112,125,151, 27,107,197,206,231,238,109,253, 66,224,219,124,109,173,154,220,132, 90,144,164, 85,209, 87,159, 18,
+ 13, 86,231,182,219,170,182,183,153,164,123,205, 6,114,159,102, 44,244,195,114, 64,108, 32,164, 58,218,149,148,246,148,183, 0,
+ 30,195,186,103, 4, 59,219, 95,221, 41, 91,210,238,236, 81,174, 43, 18,191, 97, 78,179,235, 27,115, 6,133, 5,234,101,126, 92,
+ 7,229, 25,178,149,117,212, 19, 61,159,118,131,224,173,133,199, 8,117, 50, 23,206,113,240,235, 95,184,128,250, 57, 52, 5,238,
+ 92,237,211,224,251,126,238,109,132,155, 34,168,253, 90,157,107, 61, 18,125, 66, 21,175, 38, 90,150,227,236,218, 87, 93, 26,179,
+ 18,165, 71,166,165, 75, 33,152,239, 9,107,109, 10, 40, 18,121, 2, 82, 39,213,158, 45,112, 93,125,119, 19,229,145,230,113,193,
+ 73,155,199, 76,244,245,181, 20, 18,212,211,115,163, 69, 71,134,162,150, 72,214, 70, 81,203, 66,172, 80,165,217,219, 82,178,174,
+170,226,135,193,142, 59,203,114,254, 18,205,101,202,100,158,183, 36,150,174, 58,154, 26, 92,198, 42, 74,174, 68,178, 51,199, 61,
+ 45, 92, 82, 52,106,228, 72,225,215,152, 30,200,138, 85,149,155, 79, 63,120,152,246,113,123, 73,247,246,235,219,109,167,226,139,
+140,141,138,188,175,178,213,122,187,181,118, 29,241,126, 64,166,221,115, 99, 73, 93, 54,159,112, 78,182, 41,145,237, 56,210,106,
+ 13, 56,228,106,115,110, 33, 60,254, 41,132, 84,218, 23,238,207, 41,173, 31,246,169,108, 70,229,240,207, 70,224,147, 98,119,114,
+163, 71,170,222,187,125,195,213,118,150,252,234, 12,137, 18,233, 70,139, 43,118,239, 89,244, 56,177,164,203, 97,167, 29, 12, 68,
+146, 91, 60,200, 72, 79, 32, 74, 71, 40, 26,238, 94,204,253, 30, 26,228,253,212,164,238,167, 22,156, 77, 94,219,207, 82,164, 79,
+131, 56,192,167, 63, 93,167, 79,170,174,154,224,118, 27, 85, 91,234,181, 93,149, 83, 76, 20,173, 8, 10,106, 34, 99, 59,203,144,
+220,182,137,206,183, 63,218, 81,236,103,137,199,254,225,237,141,254,141,242,159,182, 63,197,206,219,177,183,108, 80,227,216, 76,
+ 93,200,157, 30, 61,114,165, 89,102,162,106, 82,110,248, 10,142,176,154,138,153, 45, 22,157,230, 12, 37,207, 23, 42, 41,211, 54,
+ 91,226,118, 67,149,113, 15, 14, 82, 84,113, 37, 61,110, 65,151, 37, 76,179, 61, 46, 80,244,112, 67, 83, 36, 82,198,139, 2, 70,
+ 26, 87, 71,230,182,191,169, 81,168, 7, 46,218,138,163,238,105,225, 55, 17,103, 28, 53,197, 21,180,220, 43, 85, 67,196,121,172,
+148,176,195, 29,102,117, 29,117, 68,244,145,205, 12,142,213, 15, 41, 72, 99,120,249, 43,203,250,242,218, 47, 24,141,116,134,125,
+234,246,125,236,206,223,237,103, 9,155, 11, 64,179,173,250,125, 38, 3, 59, 97,100,212, 92, 17,163, 54,202,230, 85,234,214,237,
+ 54,167, 88,172, 76, 82, 19,151,234, 82,234, 82,100, 72,125,213,100,173,199,207,100,132,164,111, 48, 24, 24, 29,135, 65,166,203,
+102,236, 37,237,126,216, 88,187,122,185,202,169,155, 50,212,183,173,113, 82, 83, 9,138,169,233,160, 82, 33,210,147, 53, 81,146,
+234,196,117, 58,152,129,101,176,181,132, 21,242,133, 40, 12,150, 11,143, 78, 49,236,142, 6, 56,109,189,119,206,237,247,106,133,
+ 98, 35, 63, 80,109,189,164,235,165,183,175,125,198,171, 71,147,252, 28,183,209,200,180,173, 16, 18,168,242, 38, 84, 93, 65,230,
+143, 77,165,203,121,176,183, 80,219, 78,115,121,134,183, 63,207, 30, 26, 53,122,250,236,222,165,132, 99,114,242,188,210, 27, 18,
+ 91,123,146,215, 98,214,176,185,107, 0,113,212, 98,122, 30, 27,225,232,231,174,100,203,178,252,150,145, 76,135, 96,145, 71, 12,
+ 64, 48, 1,118,178,133,178,170,222,230,193, 65, 36, 12,113, 23,233, 10,251, 69,127,139,219, 56,240, 51,180,149,207, 14,246,220,
+ 58, 76, 90,158,253,213,105,238,225,251,107,110,170, 45,166, 69, 35,111,195,236,175,154, 61, 90,224, 64, 68,138,131,100,165, 72,
+161,165,182, 28,109,216,245,192,166,197,250, 63, 62,207,199, 44, 27, 45,238, 46,247, 46,142,166,111, 45,207,164, 38, 30,218,192,
+168, 71, 90, 31,183,118,209,231,218,148, 43,105,105,228, 15, 10,125,126, 68,104,146, 26, 88, 10, 34,147, 18, 26,217,112, 38,161,
+ 37,189,113, 27,217,255, 0,195, 62,227,251, 81,184,218,174,223,155,197, 50,161,115,219, 13, 92,234,221, 61,253,186, 37, 37,214,
+218,174, 63, 83,168,185, 34,149, 99, 68, 49,148,129, 0, 85, 37, 71,114, 43, 76, 50,166,145, 6,141, 74,151,238,188,134, 52,102,
+151,250, 18,218,182,237, 58,213,161,211,168,148,168,145,160,194,167,196,143, 18, 60, 88,140,183, 30, 52,118, 35,180,150,153,143,
+ 29,134, 82, 16,203, 8,109, 41, 74, 16,144, 18,148,164, 37, 32, 0, 53,117,113,253,101, 39, 0,112,165, 23,134, 89, 44,193,243,
+ 42,197, 90,140,226,116,234,236,225, 88, 67,126,160, 61,151,202,108, 86,153, 34, 86,213,206,123,208,254, 27, 80,214,248,145,198,
+ 53,254, 44,103,208, 52,121, 85, 11, 61, 54, 73, 76,251,132, 68, 44,166,123,116, 38, 59,183,152, 92, 53, 84,146,178,149,228, 32,
+ 25, 10, 82, 18,144,148,140, 4,128, 0,244, 3,160,215, 62, 61,164, 30,208, 29,190,246,125,108, 68,221,193,174,166, 21,195,185,
+183, 74,103,208,246,111,110, 92,144, 91,126,238,186,153,142,218,156,168, 84,144,203,169,118, 61,155, 75, 18,162, 72,171, 73, 65,
+ 65, 8,121,152,108,172, 76,155, 21, 42,223,186,157, 78,157, 69,167, 84, 43, 21,138,132, 42, 77, 34,147, 10, 85, 74,169, 84,169,
+ 74, 98, 13, 58,155, 78,130,195,146,166,207,159, 54, 83,137,106, 28, 38, 99, 52,235,142,186,226,146,134,208,218,150,181, 4,130,
+ 71, 9,184,174,225,239,128,223,109, 5,235,103,196,178,120,186,133, 90,187,118, 26,145,116,193, 93,191,180, 87, 53,159, 80,147,
+ 34,153,115,212,232,158,253, 88,147, 10,183, 72,146,245, 74,148,212,218, 52, 38,155,157, 7,154, 22,102, 37, 42,117, 74,117,156,
+212,252, 35, 69,149,207,156, 82,213,241, 20, 21, 13,195, 52, 45,174,178, 72, 34,146, 64,163, 75, 24,163,145,145, 78,133,154, 64,
+177,177,184,109, 37,180,144, 64, 34,228,227, 92,195, 55,166,201, 42,232,248, 98,122,101,226,188,193,116, 80,199, 81, 52, 81, 22,
+ 98,202, 37,146, 53,145,135, 49,160,137,154, 69, 91, 50,235, 85, 12, 10,155, 24,223,112, 43, 69,217,158, 45,184,165,187,120,165,
+246,138,241, 35,182,116,170,123, 23, 91,119, 61, 74,223,220,203,198,221,164,212,247, 82,240, 90,154,145, 18, 4,155,122, 83,169,
+ 76, 13,179,165,195,106, 27, 94,232,150, 88,134,243,109, 69,164,194,109, 80,163,204,105,153,125,220, 94,209,127,103,156, 61,184,
+186,232, 52, 94, 47, 56,125,117,247,237, 26,244, 24,113, 99,110, 45,186, 93,145, 37,234, 60,166, 35,176,203,104,151,241, 45, 78,
+ 41, 9, 74, 64,234, 84, 0,215, 43,127,189,146,225,251,255, 0,151,141,236,252,108, 47,255, 0,212,117, 98,186, 62,141, 70,193,
+ 80,109,171,134,184,206,250,111, 75,206,209,168,117,106,171, 77, 58,108, 79, 9,215, 41,240, 31,150,134,220,228,180,193,240,212,
+166, 64, 56, 32,224,156, 28,234,227,226,156,231,194,238, 48,205, 41, 42,234,248,179, 49,165,167,161, 88,226,165,164,134,136, 37,
+ 61, 52,107,164,104,141, 76,102,218,138,130,204,119, 54, 10, 44,136,138, 40,222, 15,200,252, 93,224,124,162,178,142,139,131, 50,
+202,202,154,247,146,106,202,201,235,245,213, 85, 72,218,137,121, 92, 72, 47,160, 51, 4, 81,176,187, 49,187,187,179,241,151,216,
+125,188,123, 87,177,188,108,155,223,120,111,251, 87,109,173, 15,226,150,243,164,127, 8,239, 10,196, 74, 37, 35,235, 57,181,155,
+ 69,248,144, 61,246,107,137, 71,189, 56,212, 57, 74, 66, 51,149, 6, 20, 64,192, 58,156, 37,241,179, 92, 40,241,203,106,237, 46,
+225,220,246,214,221,239,165,175,107, 85,218,191,118,150,241,196,122,245, 54, 52,165,184,202, 93,157, 69,169, 68,120, 38,161, 71,
+146,245, 54, 31,189, 67,112,189, 2,106,233, 81,140,168,239, 42, 43, 5,184, 0,123, 51,184, 59,180,120,227,226, 73,123, 35,122,
+ 92,215, 45,167, 72,254, 47,238, 75,185, 21, 91, 80,210,133, 79,223,104,181, 43,126, 19, 17,149,245,197, 62, 75, 62,234,182,234,
+239, 21,254,143,159,153,164,114,168, 12,131,250, 11,240,185,177,214,207, 9,155, 29,181,187, 7, 78,186,100,213, 41,118,141, 53,
+ 54,133,175, 62,230,151, 77, 98,183, 95,122, 59, 21, 90,234,227,165,168,172,176,212,202,144,167,198,170, 72, 83,113,218, 4, 70,
+167, 60,241, 64,109,167, 22, 49,227,201,203,105, 56,158,154,191, 47,204,234, 97,226,113, 20, 74,241,160, 40,145,211,114,230, 28,
+196,153, 44,218,218,229, 29,117,125,130,110, 45,140,253, 29, 23, 52,173,225, 42,188,187, 50,202,105,103,225, 38,158,102, 73,100,
+ 43, 36,146, 85,137, 41,207, 41,224,123,174,133, 0, 58, 57, 91,243, 2,216,220, 12, 63,180,219,118,145, 74,138,212, 72,144,152,
+ 67, 77, 33, 40, 72, 13,164, 97, 41, 24, 0, 0, 58, 12, 1,168,214,125, 36,238, 26, 44,170,175, 15, 59,113,196,205, 42,137, 14,
+ 22,224,216, 59,137, 73,176,171, 53,136,200, 98, 51,213, 75, 2,242,167, 86,221, 76, 42,145, 5, 42,168, 46, 29,213, 78,163, 42,
+ 16, 60,230, 50, 42,243,249, 18, 18,251,170, 18,111, 4, 30,160,228,122,141, 71, 19,233, 42,111, 69,183,107,112,145,182,219, 37,
+239,241,156,189,119, 91,118,169,119, 3, 20,143, 17,179, 37,155, 43,111,169, 53,105, 85,170,210,208, 57,148,210, 5,199, 87,180,
+163, 53,144,128,239,189,200, 40, 89,247,119, 16,170,219,194,167,174, 95, 16,120, 99,216, 11, 9, 94,160, 7,211,125,224, 42,220,
+240,214,234,188,157,100,223,109,175,219, 22,175,140, 41,151,191,134,156, 91,250, 68, 41,133, 41,137,143, 85,182,168, 14,158,207,
+166,253, 27,157,160, 45,183,222,221,240,212,253, 25, 45,199,171,212,118,115,136, 29,176,151, 33,247,169, 54,142,229, 80,110,122,
+ 75,110,168, 41,184,138,190, 45,181, 67,159, 26, 49, 42, 42, 67, 62, 61,152,135,139,120, 8, 14, 76, 91,137,202,221,112,234, 82,
+ 58,139,207,209,155,219, 90,149, 31, 99,247,187,115,230, 71,118, 60, 91,231,115,160,208,105,106,117,183, 80, 38,192,177,109,214,
+ 20,185,241,212,165,114,187, 24,213,110,170,156,110,100,164, 31, 22,152,242, 20,163,202, 2,101, 13,163,120,178,105,219,196, 78,
+ 41, 52,214,229,243,208, 27,116,230, 8, 34, 19,125,252,208,250,189,247,193, 60, 25, 90,149,240,199,132, 5, 93,249,190,206,228,
+ 95,175, 40,212, 76, 97,251,185, 38, 61, 63,225,181,182,194,210,210,210,213,119,139, 59, 11, 75, 75, 75, 67, 3, 11, 86,231,168,
+244,137, 50,219,159, 34,151, 78,126,123, 74,105,109, 77,122, 12,103,101,180,182, 20, 20,202,155,146,182,138,208,164, 40, 2,146,
+ 20, 10, 72,200,193,213,199, 75, 89, 4,141,193,177,247, 96, 98,222,186, 77, 45,198,165,199,114,155, 79,113,137,239,123,196,230,
+ 87, 14, 50,154,153, 32, 41, 11, 15,203,109, 77,226, 67,220,237,182,121,150, 10,178,128,115,144, 52,195, 92,219,245,176,182,149,
+122,185,103,220,245, 58,117, 38,177, 14,165, 62,137, 88,166,205,183,100,165, 18, 94,180,182,226, 54,233, 43,153,126,224, 91,159,
+ 5,155, 45,232,238,197, 88, 82,208,167,241, 10, 62,100,128,214,182, 39, 90,175,186,220, 34,237,174,239, 92, 87,189,203,114,202,
+174,179, 62,249,180,173,155, 70,114, 96, 73, 97,182,233,177,104, 55, 4, 90,205, 74,117, 39,196, 97, 70, 44,234,189, 58,155, 70,
+165,212,213,146,151,233,244,134, 89,229, 24, 36,239,229,230,133,166, 97,152,203, 44,112, 21,216,197, 98,193,245, 40, 4,130, 13,
+194,173,216,141,137,210, 0, 32,219, 9, 75,204, 10, 12, 42,165,129,253,111, 75, 29,135,199, 97,247,227,225,226,159,135, 84, 56,
+170,163,213, 95,119,172, 38, 13,219, 88,247,105, 22,125, 85,171,145, 66,203,155, 66,162,214, 18,136,138,166,123,195,149, 5, 46,
+227,166, 8,173,167, 43,148,194,220,113,158,102,153,112,164,250, 39, 17,220, 62, 92, 21, 58, 93, 58,145, 81,141, 34,185, 94,151,
+ 97,212,226,211,133,167, 80,106,170,170,149,249,112,215, 45,203,118, 92,198, 28,166,133,197,168, 51, 86,164, 85,125,241,199,121,
+ 87, 1,181,165,233, 10,109, 15,161, 74,182,220, 60, 32,109,125,201,123,215, 47,185,174, 86, 27,170, 87, 55, 43,109, 55, 45,216,
+204, 61, 29, 48, 33,205,219,106, 84,138, 75, 84, 24, 49,212,193, 12, 91,213, 70,167, 84,156,170,176, 58,201,118,122,151,204, 20,
+134,139,116,232, 92, 31,109,165,187,120,209,239,138, 92,218,235, 53,202, 30,226,110,142,227, 66,113, 79, 68,117,145, 63,115,169,
+177,233,206, 81,214,211,177,136, 85, 10,144,168, 20,183,233, 12,118,138,245, 57, 11,202,185,222, 14, 56,145,195,220,178, 86,106,
+161, 46,139,128, 74,144, 27, 78,161, 30,201,246, 67,125, 94,175,251,237,109,176,143,246,189, 67,202,133,111,239,189,175,107,245,
+235,111, 53,190,235,247,192,151, 23, 20,214,213,149,120,238,245,161,112, 90,149, 90,123,118, 93,223,110,218,116,155,146, 37, 34,
+165, 34,213,175, 92, 87,142,216, 91,119,181, 10, 5,199, 93,102, 0, 98,139, 83,155, 86,172,154, 91, 40,230,144, 74,145, 17, 79,
+169,147, 50, 58, 23,100,166,241,143,176,110, 91,118,252,155,150, 60,202,122, 85,111, 48,244,196,211,236,186,197,114,218,166, 92,
+206, 88,209,239, 59,138,199,163,207,137, 73, 87,214, 85,120,214,244,153,202, 90, 88,103,194,117, 48,100, 69, 14, 42, 91,110,197,
+ 77,226,167,194, 53, 62,224,168,214,164, 92,187,177,184,117,202, 93,207, 86,176,238,171,166,132,252, 75, 34, 52, 75,138,247,219,
+171, 22,218,178,232, 23,101, 70,124, 75, 81, 19, 90,146,100, 90,180,154,171,241, 99, 73, 98, 19,149, 8,201,195, 8,139,207, 29,
+204, 89,174, 3, 54,230, 28, 89, 84,218, 93,213,112, 83,169, 85, 8, 13,183, 62, 50,109,173,179,153, 84,126,170,109,166, 45,137,
+213, 38,111, 9,246, 59,149,202,124, 73, 44,199, 68,199, 96,199,169,183, 24, 77, 91,133, 9, 76, 55, 93,134,181,227, 28, 52, 99,
+ 65, 52,210, 44,161, 35,212, 99, 50, 88,176,141, 85,236, 90, 50, 67, 23,214,214,210, 86,214,179,139,144, 10, 77,101,201, 85, 4,
+ 92,245,183, 75,220,116, 61,133,133,239,123,246, 56,201,110, 78, 45, 54,210,143, 71,187, 69, 26,206,190,106, 23,221,159, 10,239,
+174, 77,176,164,109,229,114,157, 93,162,200,181,109, 26, 5,194,253,122,230, 66,160, 17,111,208,220,164,222, 86,170, 68,245, 41,
+ 75, 91, 85,192,134, 91,117,109,188,218, 1,107,139,222, 30, 41,208,160, 38,182,212,154, 96, 81, 98, 34,164, 83,236,138,173, 86,
+132,229,233, 73,143, 2, 77, 86,210,160,202,167, 82,150,229,102,224,167, 57, 85,155,240,177, 28,130,105,117, 4, 48,181,191, 26,
+ 67, 73,200,239, 78, 20,232,247, 93,227,184,151,181, 59,113,239,187, 58,175,186, 16,107, 20, 59,177, 20, 6,109, 25, 81, 38, 91,
+ 85,235, 26,194,177,234,148, 36, 49,113, 91, 83, 67, 13,174, 54,221, 80,228,162, 75,124,147, 24,118, 76,180,176,251,104,120,114,
+ 97, 71,129, 29,185,102, 75,134,157,116, 87,233,212,215,107,237,221,142,192,102,217,219, 23,234, 46,220,107,153, 26,125, 70, 66,
+175, 41, 86, 50,235,200,165, 73,156,220,169, 11,130,138,162, 26, 67,243,150, 16, 68, 68,166, 32,196, 67,134,204, 81,243,102,154,
+ 55, 96, 25,172, 90,225,180,141, 75,126, 89, 22, 86,190,141,141,197,203, 50,155, 12, 6,246,205, 70,202,164, 3,177,176,251,143,
+218,190,227,175,167, 96,112,231, 92,188, 65,108,253,156,237, 21, 85,234, 37,205, 77,117, 54,204, 75,162,127,188,109,197,114, 52,
+173,190,178,220,185,255, 0,131,148,235,130,242,141, 38,152,219,246,149, 21,117,198, 37, 41,160,227, 97,192,213, 50, 76,191, 5,
+ 44,199,113,212,227,232,226,211,100, 21, 21,169,244,186, 61,249, 82, 97,202,109,126,252,241,169,187, 81,118,165, 40,183,173,245,
+ 24,119, 77,250, 28,149, 70,101, 47, 81,162,201,144, 35, 61, 61,165, 56, 94,122, 73,102, 57,144,174,112,155,149,235,194,253, 54,
+254,147, 62, 77,127,114,247, 1, 75,185,109,201,150, 53,252,136,169,180, 27, 69,243,183,234,190,107,183,181, 30,208,169,151,173,
+119, 21, 76,139, 79, 23, 21, 86,150,196,154,122,162,203,114,155, 49,212, 72,121,217, 74, 76,164, 52,251,165,194,237,235, 26,209,
+179,173,109,147,172, 76,141, 81,133,182, 87,238,208, 87, 46,106,213,219, 71,163, 71,122,208,188,167,211, 39,166, 53,106,131, 47,
+109,107,104,172, 50,153,222,250,242,158,167, 46,147, 80, 97,184,166, 59, 47,172,204, 15, 66, 37, 60, 57, 12,220,152,228,168,144,
+ 77, 35, 16,197,159, 68,106,161, 88,234,102,104,191,104, 88, 1,114, 84,173,192,114,193,114,237, 84,161,152, 32, 33, 64,176, 2,
+228,155,141,128, 13,233,248,131,216, 12,110,107,245,216,236,216,210,174,155,102, 19, 51, 24,254, 12, 74,185,104,144, 74,126,174,
+102,127,139, 76,118,175, 5,151, 65,108,123,159,142,181,183,206, 74,121,146, 94, 82,148, 50, 14,180,215,116,165,219,144, 32,213,
+182,215,234, 10, 53,122,167, 42,135, 42,149,118,221,213, 70,214,169, 21,107,134,188,202,229, 86,106, 18, 4, 96,219,174,148,212,
+ 36,135,144,147, 32, 54,202,144, 24,109,164, 55, 29,160,157,199,135,107, 57, 22,193,139,100,166,162,160,236,107, 61,139, 88, 85,
+154, 99,195, 80,113,154, 42,105, 34,162,212,101, 58,174, 69,115, 39,197, 74, 10,206, 14, 19,204,123,235,144, 59,209, 19,116,167,
+ 75,115,110,234, 52,115,107,213, 46,219,210,159, 99,220,151,204, 58,236, 73,212,214, 41,117,135,213, 18,124,250, 47,142,152,243,
+ 99,207,171, 72, 8,129, 8,201,140,219, 77, 59, 90,111,154, 74,212,166,148,189, 76,174, 26,121,106,106, 29,239, 34, 68, 9, 80,
+110, 46, 9,181,201,219,183, 91,237,190,248, 60,236,234,136, 7,148,183, 95,203, 29, 10,217,141,236,135,113,237,133,155, 34,137,
+104, 94, 55, 7,131, 64,143, 79,110,109, 18,136,236,138, 4,185, 20, 96,229, 38, 91, 17,174, 7,228, 6, 36,186,204,216, 18, 99,
+188,239, 63, 35,146, 34,186,166, 84,235, 74,109,197,229,117,203,231,113,228, 81, 38, 76, 27,115, 80,181,169, 66, 35,130,109, 86,
+161, 91,167,203,170,192,109,238,102,132,198,233, 52, 53, 63, 33,184, 44,146,133,204,125, 1, 82, 99, 70,241, 95,139, 22, 83,173,
+ 37,181,115,182,167,188,183, 37,129, 6,159,182,219, 79, 95,118,221,177,236,232, 45,208,224,166,152,212, 39, 19, 54, 68, 95,130,
+ 92,184,146,164, 69, 83,145,233,254, 40, 83,113,195,107, 72,113,182, 68,151, 7,140,251,152,109,170, 91,157,184,213,165,133, 85,
+ 47,171,178,127, 33,230, 75,114,171,213, 23, 35,250,156,199, 84,159, 15,147, 25,200, 41,229,229,200, 61, 52,228,156, 45, 83, 33,
+ 46,213, 9, 12,109,184,184, 98,214, 61, 46, 54,177,183, 93,246,239,141,118,204, 17,118,208, 89,135, 93,192, 23,247,125,248,187,
+241, 61,191, 16,171, 20,120, 91, 43,100, 59, 38, 45, 50,223,155,227,110,163,143,165,182,103,212,183, 14, 41,104,204,160,206,247,
+ 98, 91,122,157, 79, 90, 99, 41,149, 50,183, 97,190,216,132,184, 46, 57, 2, 52, 39,156,210, 5, 41, 40, 66,220, 89, 66, 27,109,
+ 42, 90,220, 95,192,219,105, 72,202,150,226,212,112,218, 7, 82, 73, 32, 0, 59,247,214,204, 79,218,105, 60, 77, 67,171,238, 54,
+206,186,245, 31,112, 40,173, 83,169, 53,218, 12, 24,116,183,153,221, 11,113,130,220, 51,122, 91, 76, 85, 22,150, 26, 76, 26,164,
+146,195, 50, 28, 10, 83,241,203,235,111,199,134,228, 45,102,150, 23,179, 43,113,174,103,163, 78,220,186,172, 10, 83, 3,192,117,
+104,185,234,127,195, 25,237, 41, 32,164,174, 53,175, 72, 83, 84,104,143,114, 21,146,164,150,212, 20,190,185,198, 4,179, 46,173,
+203, 50,156,190, 58,121,100, 74, 87,131,103, 86, 97,169,159, 98, 92, 0, 11,184,125,138,176, 91,105, 32,109,107, 6,154,136,106,
+106,106, 25,213, 76,161,250, 16, 54, 3,176, 36,216, 2, 58, 17,126,183, 62,252, 48, 60, 43,109,125, 79,127,119,214,218,118,158,
+185, 44,218, 22,100,195, 85, 21,152, 78,173,176, 24,129, 33,164,215, 46, 72, 51, 89, 87,232,220,113,192,221, 34,148,242, 50,174,
+121,115,101, 55,205, 29,104,115, 82, 78,211, 25,177, 59, 3,102,236, 21,187, 50,139,108,185, 46,165, 62,173, 33,153, 53,170,245,
+ 73, 17,145, 54,114,162,180, 89,135, 17,150,162,180,148, 67,165,176,133, 61,224,176, 57,202, 21, 37,197, 41,197,149,100, 62,122,
+131,113, 6,106,185,165, 96,104,175,236,208, 11, 33, 34,197,137,182,166, 35,168,189,128, 0,244, 85, 23,220,156, 61, 80,210,154,
+104,136,127,239, 28,220,251,189, 7,243, 39,212,156, 45, 45, 45, 45, 48,227,119, 11, 95, 8, 4, 16, 70, 65,232, 65,215,221, 45,
+ 12, 12, 83, 67, 45, 53,146,219,104, 65, 61,202, 82, 1, 63,128,213, 77, 45, 45, 12, 12, 51,123,215,177,246, 78,250, 90,142,219,
+ 55,132, 15, 17, 77,169, 82, 41, 53, 88,229, 45, 85, 40,211,185, 57, 19, 46,159, 36,164,248,107,198, 2,208,160,166,221, 72,229,
+113, 10, 24,199, 21, 55, 95,128,189,229,176,101,201,126,218,136,213,251, 65, 75,139, 49,164, 82,249, 99, 86, 27,103, 36,161, 50,
+233, 82, 22, 57,221, 9,192,203, 14, 59,205,140,242,163, 60,162, 65,250,242,180, 33,192, 82,180,165, 96,247, 10, 0,143,219,170,
+147,196,127, 5, 56, 23,196,226,149, 89,229, 28,148,121,204, 74, 17, 43,169, 25, 98,168,208, 62,202, 73,169, 94, 41,209,127, 84,
+ 75, 27, 50, 11,136,217, 1, 55,183,188, 54,241,191,143, 60, 47, 87,165,200,171, 99,172,201,165,114,239, 65, 86,173, 45, 54,179,
+246,158, 61, 46,146,192,237,250,198, 41, 21, 92,216,200,174, 64,180, 88,213,177,251,198,219,222, 2,182,186,252, 11, 10,228,255,
+ 0,246, 90,178, 91,207,151,233,189,211,147, 31, 62,108,117,239,167,207,108,248, 36,222, 91,238,100,115, 87,165,127, 3,105, 10,
+113, 62, 60,170,176,241,106, 37,172,142,111,119,166, 48,172,135, 49,156,120,203,100, 12,103,174, 48,100, 58,105,148,245, 30, 99,
+ 13,130,123,231,195, 26, 33,168,236, 50, 48,211, 77,182, 63,217, 72, 31,208, 53, 83,100,223, 67,239, 15,232,107, 82,167, 52,206,
+115, 28,238,154, 50, 15,179,179, 69, 4,111, 99,246,100,120, 99, 18,149, 61,249,111, 17,244, 97,139,115, 58,250, 99,248,133, 95,
+ 67, 37, 46, 85,146,229,217, 29, 76,128,143,104, 85,150,162, 68,184,251, 81,164,210, 24,131, 14,220,200,229, 95,240,156,107,150,
+193,112,227,103,236,125, 9,184, 52,136,161,218,131,220,143, 84,106,146,130, 29,168, 84,101, 37, 56, 15, 74,120, 32, 14, 80, 10,
+130, 27, 64, 13,182, 9, 8, 72,201, 39,100,244,180,181,212,185, 94, 87,151,100,153,125, 38, 85,148,209, 71,151,101,180, 40, 35,
+134, 24,148, 36,113,160,232, 21, 70,221,110, 73,234,204, 75, 49, 36,147,142, 85,205,115, 92,203, 59,204,106,243,108,222,182, 76,
+199, 50,175,115, 36,211,204,197,228,145,207, 82,204,119,233, 96, 7, 69, 80, 21, 64, 0, 0,180,180,180,181,191,134,252, 45, 45,
+ 45, 45, 12, 12, 45, 45, 45, 45, 12, 12, 45, 45, 45, 45, 12, 12, 45, 45, 45, 45, 12, 12,104, 15, 16,151, 95, 24, 54,239, 17,123,
+ 83,103,109, 12, 84,212, 54, 75,118, 69,182, 47, 27,216,219,148, 90,131,187, 24,189,180,184,101, 92,219,132, 23, 42, 76, 82, 37,
+139,234,202,151, 77,160,210,125,241,138,135,213,181, 58,116,137,140,248, 9, 90, 64,231,117, 43,136,239,106,117,199, 89,185,105,
+117, 10, 52,219, 42, 68,189,220,218,235, 50,177, 79,135,177,151,213,106,118,216, 64,186,248,146,182,109, 10,197, 94,196,168,220,
+ 27, 33, 79,182,247, 3,109, 33,236,132,171,166,163, 88,171, 53,117,221,106,132,229, 62, 29, 72,212, 41,241, 36, 73,106, 28,131,
+ 84,132, 47, 28,201, 10,199,108,140,227, 84, 76, 88,197, 69, 69,150,202,143,115,203,215,203,250,134,165, 20, 60, 69, 77, 73, 4,
+113, 75,195,212, 85,111, 18,196, 57,143, 18,150,102,142, 70, 98,238, 24, 50,182,184,244, 70,234, 2,130, 99, 89, 13,218, 73,249,
+209, 44,195,134, 42,235,106, 36,154, 46, 37,175,163,142, 87,148,152,210,102, 8,171, 36,106,161, 35, 42,200,203,203,148, 73, 42,
+ 49, 44, 87,154,209,139, 36,116,252,158, 18,111, 54,228,113,174,250,120,178,217,207,122,222, 77,206,102,216,218,235, 50,169,182,
+183,141, 11, 96,170,118,165,187, 86,174, 81, 46, 93,174,102,187,109,151, 87,181,116,241,125,223,117,200,235,187,229, 59, 34,206,
+174, 87,232,109, 83,149, 52, 24,150,188,232,144,226,189,121,221,222, 37,189,160,182,229,237,191,208,108, 59, 58,250,169,203,183,
+173,190, 38,157,179,108,216,155, 3, 85,170, 88,180,107, 78,206,216,154,213,197,195,166,226,216,251,164,154, 35,177,247, 99,117,
+ 46, 45,225,139,109,211,166, 90,113,234, 19,223, 67, 85,233,113, 87,111, 66, 52,228,205,149,220, 51, 22, 58,149,204, 89, 65, 80,
+ 24, 4,167,168, 30,131,211, 95, 12, 72,196,133, 22, 91, 42, 29, 1,229, 25, 3,211, 75,197,197, 20,136,176,163,240,229, 36,235,
+ 18,176, 33,145, 44,210, 60, 84,241,180,133, 86, 48,170, 73,131,152, 2, 42,144,206,124,197, 76,130, 93,105,120, 70,177,218,103,
+143,138, 43, 96,121, 93, 72, 43, 36,132,172,105, 45, 76,169, 24,102,149,157,128, 21, 28,178,100,103, 82,136, 60,129,132, 70, 29,
+ 28,224,214,249,226, 54,181, 83,222,219, 55,136, 39, 43, 85,241,100, 94,246,107, 27,119,127, 86,246,245,141,190,145,120, 91, 23,
+102,204,109,181,247, 91,109,168,212,184, 17,169,213,150, 40,215,245,201,118,208,253,234, 19, 64,161,116, 5, 67,154,165,207,141,
+ 37, 70, 41, 62,217,106,175, 29, 60,104,113, 79, 93,164, 80,248, 84,226,128,108,102,199,212,235,214, 38,211,193,135,178, 27,169,
+ 46,147,113, 46, 44,255, 0,115,185,183, 61, 15,199,182, 20,196,245, 87, 38,211,216, 92, 23,154, 60,130,143, 6,156,148,254,148,
+200,113,217,206, 33,150,155, 57, 67,105, 73,237,144, 49,211,211, 67,187, 77,128,242,138,221,136,195,139, 61,212,180, 5, 19,247,
+157,111,240,175, 28,175, 11,103,243,113, 12, 25, 5, 53, 85, 91, 66,177, 70,164,152,227,133,180, 34, 75, 44,105, 26,133, 87,155,
+ 75, 19,164, 5, 65, 35,170, 0,166,216,110,227, 15, 15,159,139,248,110, 14, 25,168,226, 74,186, 58, 36,153,165,149,192, 89,101,
+157, 4,143, 36, 48,202,242,146,204,144,234, 80, 53, 18,206, 99,141,156,150, 92,126,116,252, 63,207,246,190,240,179,111, 84, 45,
+109,128,218, 78, 44,118,210,133, 86,172, 61, 95,169,195,163,240,195,113, 77,114,125, 93,248,145, 32,174,108,185,213,189,175,149,
+ 33,245,136,112, 98,182,132,169,210,134,210,214, 16,148,229, 89,216, 95,229,123,244,129, 63,242,126, 52, 63,251,173,204,255, 0,
+254, 61,169,231,253, 81, 76,255, 0,200, 99,127,246, 73,254,173, 47,170, 41,159,249, 12,111,254,201, 63,213,169,173, 79,140,244,
+149,147,203, 85, 89,225,206, 77, 85, 85, 49,212,242, 73, 10,188,142,118,221,157,162, 44,199,110,164,147,211,211, 16, 58, 95, 2,
+107,104,105,226,164,162,241, 71, 60,163,164,128,105, 72,162,157,227,141, 23,246, 81, 18, 80,170, 58,236, 0, 27,226, 37,155,115,
+253,212,126, 49,125,153,188,113,237,174,247,198,222,153, 59,193, 46,175, 96, 72,219,250, 22,228,109,202,182,202,225,187,172,138,
+ 21, 82,137,114,222,246,157,180,203,246,205, 29, 85, 20,205,129, 74,154,216, 8, 67,198, 83,220,180,197, 40, 34, 90,211,174,108,
+123, 29, 56, 93,226,149, 28,122,109, 85,237, 78,219,189,198,219,219,123,106,234,245,201,187,145,114,220,214,181,114,217,129, 10,
+149, 34,223,173, 81,102, 90, 18, 69,110, 36,113, 58,173, 81,126, 98, 97,251,154, 2,223,101, 46, 57, 49, 77,165, 17, 22,226, 63,
+ 64, 22, 96,195,143,159, 6, 51, 45,115, 12, 43,145, 0,100,124,245, 69,170, 85, 61,151,140,134,162, 50,135,137, 36,184,148, 36,
+ 40,147,243,198,154,161,241,114,174,151, 42,226,204,162,135,135, 40,168,169, 56,157,157,130, 68,186, 35,166,230,211, 71, 75, 40,
+ 72,213, 66, 72,165, 35, 14,129,130,132,145,152,182,181, 58,112,239, 63,130,212, 85,153,191, 6,103, 85,252, 79, 95, 95, 91,194,
+ 43, 26,151,149,181,201, 87,201,170,146,174, 18,242,179, 23,141,131,202, 81,202,150, 47, 18,162,175, 45,134,178, 91, 28,254, 11,
+ 94, 39,235,248,104,231,255, 0,249,185, 70,127,110,177,109,192,143, 34, 93,135,122,196,136,195,210,165, 74,180,238, 40,241,163,
+ 71,105,111, 72,145, 33,234, 68,198,217, 97,134, 91, 73, 83,175, 45,197, 37, 41, 74, 65, 82,148,160, 0, 36,235, 46,210, 35, 32,
+131,216,244, 58,169, 35,115, 27,163,129,114,132, 31,220,111,139,166, 68, 18, 35,161, 54, 14, 8,253,226,216,132, 15,176,167,134,
+142, 35,182,159,142,131,114,110,159, 15,251,217,182,150,232,218, 43,214,152,107,251,129,181, 87,213,153, 69,250,202, 85,110,207,
+118, 45, 59,235, 91,142,131, 25,143,127,113,168,178, 84,219, 62, 39,136,180,199,112,165, 36, 33, 68,117, 47,219,205,195, 55, 28,
+251,238, 54, 30,243,225,142, 29, 70,225,177,182, 89, 85,139,166,109,187, 96,220, 82, 40,155,167, 77,220,121,146, 24,110, 13,239,
+ 72,138,151, 99, 46,172,220, 26, 44, 70, 24,129,245,108,167, 42,145,159,169,206, 83,113, 11, 78,151, 83, 34,132,192,132,135, 60,
+100,198,101, 46,147,146,224, 64, 11,207,219,162, 84,132,172, 20,173, 41, 82, 79,112,160, 8, 63,113,213,149,152,120,159,153, 87,
+113,173, 39, 27,140,170,149, 43,105, 34, 16,136, 36, 15, 44, 37,116, 73, 27, 19,114,172, 24,164,140, 1, 7,202,108,119,232,106,
+156,179,194, 76,171, 47,224, 42,222, 1,108,226,174, 74, 26,217,140,230,162, 50,144,206,175,174, 41, 20, 11, 43,161, 85,120,148,
+144, 65,212, 46, 54,216,136, 25,208, 61,170, 30,218,237,168,164, 39,110,107,112,119, 42,161, 86,167,180,154,124, 73,123,145,195,
+123,147,175,152, 73, 79, 52,102, 82,236,185, 86,131, 14,213,229, 7, 80,172, 61, 80,106, 99,238,173, 39,196,113,206,163, 77,149,
+151,192,119,180,211,218, 97,189, 44,110, 46,255, 0, 64,220,170, 74,107, 38, 36, 90,246,237,239,133, 26, 85,175, 26,139,111, 48,
+234,221,106,157,101, 88, 47,198,128,235,144, 71,143, 49,200,112, 41, 20,248,116,144,252,135, 28,117,248,190, 58,222, 95,232, 6,
+237, 2,142,250,185,220,129, 29, 74,245,240,211,253, 90, 50, 61, 62, 20, 79,251,222, 43, 45, 99,205, 8, 0,254, 56,212,132,120,
+202,153,122,212, 79,195, 92, 13,149,240,246,109, 84,165, 90,170, 40,213,156,106,234, 81, 86, 56,128,223,205,165,153,208,176, 5,
+209,237, 99, 26, 62, 5,190,100,244,176,113, 87,136, 57,191, 19,100,212,110,174,148,114,202,202,135, 79, 64,238,210,202, 78,215,
+ 82,200,169, 32, 82, 66, 58, 94,248,215,190, 20,248,114,178,184, 89,217, 43, 15,102, 44, 56, 70, 37,191,100,208,163,210,163, 45,
+222, 85, 76,168, 74, 82,220,153, 87,173, 84,156, 72, 1,218,172,250,188,153,211, 37, 41, 41, 74, 21, 34,123,133,180, 33, 28,168,
+ 78,200,105,105,106,151,168,168,158,174,121,234,170,101,105,234, 42, 93,164,145,216,221,157,220,150,102, 98,119, 44,204, 73, 39,
+185, 56,189,233,169,169,232,233,169,232,233, 97, 90,122, 90, 84, 88,227,141, 5,149, 35, 69, 10,136,160,108, 21, 84, 0, 7, 96,
+ 48,180,180,180,180,142, 23,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,
+210,210,210,208,192,194,210,210,210,208,192,194,210,210,210,208,192,194,214, 53,117,217,246,213,239, 67,171,219,183, 69, 34, 21,
+ 94,149, 91,165, 79,163, 84, 24,146,195,107,113,112, 42,113, 93,135, 45,182, 95, 41,231,142,178,203,206,114,173, 5, 42, 66,136,
+ 82, 72, 80, 7, 89, 46,150,178, 24,169, 5, 77,136,238, 48, 8, 7, 98, 46, 49,196,171,235,133,221,241,219,202,252,170, 5, 5,
+186,133,255, 0,110, 54,227,142, 91,183, 24,180, 43, 87, 5, 89,218, 66,156, 34, 28, 91,130,109, 22,174,210, 93,171,176,128, 27,
+113,199, 24,105,215,249, 3,170, 47, 40,169,247, 49, 56,124, 52,111,189,235, 81,137, 67,173, 91, 85,184,244, 57,175, 52,212,250,
+127,240, 58,177,105,211,231, 52,181, 0, 89,174,220, 21,122,163,202, 77, 11,186,164,199, 97, 13, 46, 66, 17,224,173,197,178,183,
+ 24,123,188, 58, 90,146,167, 20, 85,172, 74,141, 2, 59,168,182,162, 91,115,107, 92,168, 54,223,184,232,119,216, 13,176,222,114,
+248,203, 92, 57, 11,126,155,126, 7,249,225,157,217,141,156,160,236,245,178,138, 85, 60, 53, 50,183, 53, 12, 57, 94,173,134, 82,
+202,230,190,210, 57, 90,139, 21,176, 63,193,105, 44, 36,169, 17,217, 29, 0, 37,106,202,214,163,167,139, 75, 75, 81,233,166,150,
+162, 87,154,103, 50, 73, 33,185, 39,231, 96, 58, 0, 54, 3, 97,182, 55,149, 85, 20, 42,139, 42,244,194,210,210,210,210, 88, 54,
+ 22,150,150,150,134, 6, 32,111,253,251,111,253, 25,127,246,206,255, 0,117, 13, 84, 31, 77,167, 61,189,153,157,251,127,142,111,
+251,168,234, 6,201, 25, 61, 71, 79,216,116, 66, 7, 92,227,160,237,253, 29,191, 61,180,202,213,149, 2,195, 94,231,220,191,150,
+ 52,249,178,126,215,224, 63, 44, 79, 25, 63, 77,151, 39,255, 0, 6,119,218,127,150,103,111,251, 41,107,223,247,236, 95,244,103,
+255, 0,219, 47,253,212,245, 4, 4, 2, 7, 95, 63, 47,223,170,169, 25, 61,186,122,250, 31, 81,243,210,126,219, 83,255, 0, 19,
+240, 95,203, 24,230,201,127,181,183,192, 98,119,163,233,176,103, 24,246,104, 30,163,167,248,229,121,231, 24,255, 0, 53, 62,250,
+168, 62,154,225, 35,175,179, 71, 31, 47,229,149,254,234,154,130, 42, 65,207, 67,215,212,255, 0, 96,209, 9,238, 1, 57,207, 66,
+113,249,198,136,213,245, 67, 97, 37,143,253, 43,249, 99, 60,217, 45,187,126, 3,242,196,238, 7,211, 87,201,199,247, 52,251,255,
+ 0,207, 39,240,255, 0,146,174,190,171,233,171,114,130,127,185,167,159,151,242,200,255, 0,117, 93, 65, 69, 9,235,159,151, 79,
+207,231,190,171, 4,115, 15,151,207,215,229,233,211, 26, 76,230, 21,118, 63, 93,254, 85,254,156, 37,237, 18,245,215,248, 15,203,
+ 19,165, 79,211, 89, 73, 4,159,102,170, 83,233,158, 50,135,207,254,106,191, 45, 18,215,211, 80,241, 19,205,253,205, 94, 80,123,
+127,142, 62,115,255, 0,101,109, 65, 56, 67,100,168, 18,128,163,223,185,239,242, 25,237,223, 87, 54,211,203,202, 0, 0,118, 29,
+ 49,229,158,131,238,210,103, 49,173, 22,250,254,191,225, 79,233,198, 13, 68,189,155,240, 31,150, 39, 74,159,166,146, 79,127,102,
+191, 47,111,249, 99,122,255, 0,213, 99, 85, 71,211, 69,207,250, 54, 71, 94,199,249, 98,244,199,175,249,172,106, 11,137, 0,145,
+159, 63, 79,199,240,209, 41, 7,203, 0,118, 57,237,143, 77, 96,230, 85,191,241,191,202,159,211,140,123, 76,223,183,248, 15,203,
+ 19,158,254,253, 11,254,141,175,251, 98,127,186,206,189,143,166,127,144, 15,247, 54,241,159,249,225,255, 0,186,214,160,208,144,
+ 8,234,123,244,199,237,253,218, 36, 39, 29,124,250,119, 29,189,116,145,205, 43,199,251,255, 0,242, 39,187,252, 56,199,180,205,
+109,218,196,123,135,229,137,201,143,166,116, 79,250, 55, 15,111,252,240,187,127,217,107, 94,199,211, 56, 39,191,179,119, 29, 51,
+254,120, 95,111,127,241, 91,233,219, 80,111, 66,135,111, 60,254, 7, 24,209, 8,238,125, 72,239,223, 31,119,231,182,138,115, 90,
+253,254,190,214,255, 0, 10,127, 78, 11,237, 51,116, 50, 88,250,233, 31,150, 39, 26, 62,153,166,112, 71,179,131, 57,237,142, 48,
+ 63,221,115, 94,135,211, 49, 57, 0,251, 55,241,156,227,252,112, 51,219,254,171,154,131,194, 82, 70, 48, 64,232, 51,143, 33,242,
+252, 52, 66, 49,158,191, 96,244,255, 0,142,136,115,108,195,114, 42, 46, 7,248, 19,250, 48, 95,107,159,246,255, 0, 5,252,177,
+ 56, 65,244,203, 15,159,179,135, 31,245,191,207,255, 0,149,221,122,254,252,175,166,127,185,197,246,143,229,127,219,211,254, 75,
+218,132, 10,112, 10,114,160, 9, 29, 7,168, 61,127,167, 94,243,144, 72,238,122,100,244,207,207, 69,253, 47,152,255, 0,204,127,
+146, 63,233,198, 13, 93, 64,255, 0,121,248, 47,229,137,189,127,126, 89,255, 0, 71, 16,255, 0,239,127,229,235,254,107,186, 95,
+223,150,127,209,197,255, 0,107,255, 0,247, 93,212, 32,130, 70, 78, 83,156,121,142,227,167, 97,235,175,129, 39, 36, 96,158,227,
+228, 15,174,116, 63, 75,230, 63,243, 31,228, 79,233,198, 61,174,163,175, 50,254,235, 47,229,137,191,255, 0,126, 86,112, 79,247,
+ 56,187, 99, 63,227,127,235,216,255, 0,154,238,144,250,101,100,228, 15,103, 9,200, 56,255, 0, 59,241,143,159, 95,228,189,168,
+ 65, 28, 19,201,158,160, 12,125,189, 71, 93,124,228, 56, 61, 58,142,199,215,215, 67,244,190, 96,127,246,143,242, 39,244,227, 34,
+170,163,188,157, 61,195,242,196,224, 26,250,101, 42,117,105, 66,125,155,238,173, 74, 90, 16,134,216,226,229,114, 31,117,110, 45,
+ 45,180,204,120,237,112,184, 87, 34, 67,142,173, 8,109,180, 2,183, 28,113, 40, 64, 42, 80, 26,145,125,139,237, 28,187,106,123,
+107, 97, 92,219,161,195,163, 59, 99,184,215, 61,173, 2,228,186,182,189,141,220, 55,106,172, 25, 85, 68,137, 81,173,154,141,204,
+118,206,154,106, 53,248,244,231,225,154,131,105,167, 50,136,178,214,252, 70,220,146, 35,151,215,249,251,123, 18,120, 79,167,111,
+111, 18,114,247,186,251,163, 49, 85,218,222, 24,163,210,111, 53,194,156,128,245, 62,228,222, 74,163,175, 29,169,183,157, 96,172,
+ 9,108, 83,222,131, 80,184,101, 52,174,132,209, 41,225, 89, 75,196, 25,105, 85,110, 39,101, 73,126,161, 41,197,174, 75,239,169,
+114,139,171,241, 63,239,176,162,251,170, 86,121,157, 65, 89,113, 67, 7, 35,169, 4, 18,115, 82,113,247,137,217,238, 79, 87, 22,
+ 91,147,230, 34, 26,136,198,185,156, 69, 79, 33, 23,221, 80, 44,145, 56, 6,222, 98,116,157,153,122,110, 71, 99,125, 27, 60, 13,
+161,241, 3, 47,175,226,174, 50,162,122,236,146, 71, 48, 81, 64, 36,150, 14,107, 70,214,150,114,244,239, 20,133,117,222, 36, 93,
+ 65,110,172, 77,203, 45,186,186,215,180, 61,151,139, 72, 78,210, 40, 56,230, 50,147,125, 47,149, 37, 77,151, 65,231,254, 5, 97,
+ 72, 9,229,201,242,231, 29, 51,240,235, 38,139,199, 80,146,160,145,181,193, 5,104, 75,168,255, 0,223,202, 78, 90, 39,195, 82,
+214, 13,164, 11,120,116,164, 96,142,161, 65, 94,120,215, 37, 97,212,227,199,149, 78, 9,151, 17,105,146, 42, 43,109,228,184,158,
+ 66,150,152, 96,162, 49, 81, 60,133,229, 15, 16,124, 93, 73, 25,192,198,117,127,135,119,198,133, 85,181,154, 92,152,232, 50, 28,
+186,224, 45, 77,133,168,134,145, 77,106,160,134,156, 25,228,241,210,136, 43, 91,107, 60,205,168,199, 90, 80, 50,188, 26,248,120,
+191,199, 91,223, 62,222,224, 91,217,168,122, 27,111,255, 0,163,123,205,183,183,173,183,183, 70,215,125, 26,252, 47,211,253,139,
+131,216, 17, 28,143,189,110,104,215, 17,164,174,118, 53,123,111, 17, 95, 80, 78,224,219, 29,102,143,198,144,125,124,131,109, 74,
+ 72, 74, 85,145,120,165,105,198, 84,135, 7, 50,109,142,133, 46,164,167, 31,102,112, 78, 53,145,195,226,200, 74,117, 13, 42,195,
+ 67, 36,164, 41,197, 27,185, 11, 13, 21, 41, 73,194,147,252, 30, 10, 94, 8, 28,197, 41, 32, 5,103, 39,166,121,115, 2,240,167,
+ 70, 20, 80,180,187,134,229,185, 73,145, 29,134,150,242,101, 73,157, 30, 64, 97,134,152, 42,230,117,245, 61, 19,152,140,164, 39,
+ 42, 42, 1, 32,105,211,165, 85, 16,235,177,228, 37,200,205, 55, 48,170, 47,130,211,169,144,168,175,186,194,157, 76, 57, 13,129,
+240,203, 11,104,243,140, 39,147,168, 74, 84, 64,202,195,197,222, 56, 99,182,126, 45,113,183,178,209,131, 98, 7, 66,105,253,247,
+233,115,110,128, 3,138,247, 55,240, 35,129, 40,195, 21,225,118,129, 72,107, 19, 85, 94,119, 82,194,219,213, 27,146,171,175, 96,
+ 71,152,124, 11,113,237, 58,246,213,110,191,179,158,220,176, 55, 74, 7, 3, 3,126,182, 34,238,121,155,106,229,220,202, 87, 17,
+ 78, 89, 19,118,199,113,165,190,239,212,246,205,239,105,183,176,245,193, 6,220,171, 67, 74, 62,167,174,138,129,141, 46,106, 28,
+166,201,143, 6, 89,138,153,124,121, 63, 76,188,131,211,217,192, 8,233,212,113,129,228,124,255, 0,205,115,211, 93,240,187,108,
+ 11, 23,121, 44, 27,215,104,183, 62,212,167,238, 22,218,110, 61,183, 91,177,239,203, 66,160,208, 85, 46,224,160, 85, 98, 2,253,
+ 61,213,161,121,131, 48, 56,162,244, 73, 72, 34, 68, 57,212,248,242,227, 45,183,153,109, 73,252,231,120,230,246,106,239,183, 6,
+ 60, 82, 94,220, 62, 83,108,205,193,221, 91, 81,182, 13,241,179, 87,213,187,104,220, 55, 36,155,231,104,106,242,164, 10, 21, 78,
+166,154, 13, 41,239, 10,232,165,186,219,212,154,235,124,169,228,168,210, 87, 32, 1, 30,100,114,171, 79,131, 60, 72,204,115,136,
+ 37,165,205, 43, 2, 87, 83,141, 66, 67, 28, 72,146,161, 61,172,129, 53,165,192,178,216, 50, 16, 84, 54,151,115,201,126, 41,240,
+ 67,240,133, 90, 87,229,108, 70, 77, 84,193, 66, 19,169,160,115,246, 86,238, 90, 66,143,111, 41,114, 72,109,181, 29, 64, 44,156,
+255, 0,191, 47,234, 71,247, 56, 71, 65,159,243,192,245,237,255, 0, 37,221,124,254,252,192,255, 0,251,184, 58,127,233,129,251,
+191,146,230,161, 89, 94,176, 47,187, 81,114, 17,117,216,247,149,174, 99,171,195,147,252, 35,181,171,244, 20,198,115,152,128,219,
+235,171,211, 88, 13, 56, 84, 8, 9, 81, 4,144, 64, 7, 88,123, 74, 75,159, 19, 69, 14,164, 21, 0,180, 45, 46, 36, 20,146, 20,
+ 9,109, 68, 2, 15,124,246,212,249, 51,218,185, 55,142,181, 92,123,132,103,248, 46, 42, 15,110,150,246, 51, 0,111,208,133,191,
+238,181,241, 56, 81,244,203,137,239,236,225,192, 29,201,226,255, 0,215,254,171,186,248,126,153,120, 29, 15,179,135,175,203,139,
+254,159,143,242, 93,212, 32, 71,158, 48, 9,235,223,204,253,191,118,188,167, 39,161,193,199, 83,242, 36,159,221,165,127, 75,230,
+ 63,243, 31,228, 79,233,193,189,170,162,223,222,111,255, 0, 72,252,177, 56, 1,244,203,201, 56, 30,206, 14,191,250, 95,255, 0,
+186,238,190, 43,233,152, 4,128,127,185,195,159, 80, 56,191,234, 62,223,241, 93,212, 32,142,124,128,239,248,116,243,251,245,224,
+ 2, 84,115,211, 3,186,122,117, 63,111,200,157, 15,210,249,143,252,199,249, 19,250,113,159,106,159,254, 39,224, 63, 44, 78, 11,
+251,242,241,128,127,185,197,247,127, 43,254,191,183,133,221, 47,239,203,198, 79,253,206, 35,129,231,252,175,186,125,255, 0,226,
+187,211, 80,130, 66, 58,149, 12,115,116, 4,159, 63,159,111,206, 53,240,167,226,206, 58,142,135, 29,189, 58,232,126,151,204,127,
+230, 63,200,159,211,129,237,117, 31,183,248, 47,229,137,190, 15,166, 96, 9, 35,251,156, 36, 99,204,241,125,223,236,255, 0, 21,
+237,123, 31, 76,184, 28,127,220,226,239,156,127,141,247,167,127,249, 47,106, 16, 24,207,151,108,247,244,199, 92,126,124,181,244,
+117,192,232, 61, 63,183,166,135,233,124,199,254, 99,252,145,255, 0, 78, 49,237, 85, 23, 31, 89,248, 47,229,137,191,143,166, 88,
+ 79,250, 56,122,245,233,252,175,255, 0,163,252, 87,122,235,233,250,101,100,119,246,112,227, 63,243,191,235,248,127, 37,221, 66,
+ 19, 3,190, 50, 71, 94,159,213,159,150,190,247, 32,249,119,193, 25,253,190, 93,244, 63, 75,230, 63,243, 31,228,143,250,112, 61,
+170,163,254, 39,224,191,150, 38,238,126,153,113, 31,232,224, 56,245,254, 87,248,253,159,201,119,166,169, 43,233,153, 17,254,141,
+252,140,227, 63,203, 3, 30, 93,255, 0,205,115, 80,137, 32,156,156, 0, 51,142,224,117,245, 61,123,245,213, 5, 32, 17,128, 51,
+158,253,127, 63,145,172,254,151,204, 44,127,180,111,255, 0, 68,127,211,140,251, 84,255, 0,183,248, 15,203, 19,121, 63, 76,212,
+130,113,236,221, 39, 7, 31,231,129,248,255, 0,201,111, 95, 15,211, 55, 35,183,179,120, 30,153,255, 0, 60, 47,217,254,107,125,
+245, 7,245,128, 51,129,133,119,198, 14, 62,255, 0, 77, 10,172,140,244, 29,122,244,245, 31,111,111,237,209,151, 54,175,239, 83,
+123,255, 0,129, 63,167, 25,246,169,251,191,224, 63, 44, 78, 33, 95, 76,228,167,253, 27,185, 30,191,203, 11,253,214,245, 72,253,
+ 51,220, 28,127,115,115, 63,245,194,255, 0,117,175, 77, 65,216,247,233,128,113,149, 30,227, 30,127,111,150,188, 16,112,114, 0,
+207, 92, 14,248,249,244,232, 59,232,227, 53,175, 32, 30,127, 95,240,167,244,224,235, 81, 49, 23, 50,126, 3,242,196,226, 85,244,
+208, 57,127,209,181,145,235,252,176,255, 0,221,103, 84,207,211, 67, 35,253, 27, 63,135, 24,191,238,177,168, 57, 45, 35, 56,193,
+193, 29,252,191, 31, 95,234,208,235, 73, 57,230, 30,125,255, 0,163, 74, 46,103, 90,127,223,127,149, 63,167, 0,212,205,183,155,
+175,184,126, 88,156,137,250,105, 24,200,254,230,199,108, 99,252,113,123,255, 0,217, 99, 84,213,244,210,249,127,209,175,159,250,
+227,126,239,228,175,168, 52, 41, 61, 72, 62, 89,255, 0,142,168, 41, 56, 62,164,103, 31,126, 58,232,227, 50,173,255, 0,141,127,
+251, 83,250,113,145, 81, 41,232,255, 0,128,252,177, 57,179,244,211,113,219,217,173,147,233,252,177,255, 0,221, 95, 94, 15,211,
+ 80,198,127,238,106,246,242,254, 88,253,127,254,213,181, 6, 5,142,164,147,229,220,116,200,251, 71, 97,211, 84,150, 6, 51,159,
+179,211,246,104,227, 48,172,218,243, 94,253,244,175,244,227, 62,209, 55,237,254, 3,242,196,231,207,211, 85, 32,103,251,154,121,
+199,252,242,113,255, 0,229, 87, 84,149,244,214, 72,255, 0, 70,150, 71,254,153, 61,191,236,169,168, 45,169, 56,237,219,247,143,
+ 95,191, 67, 44,117, 35, 3,175, 92,104,195, 48,171,190,242,237,255, 0, 74,254, 88, 56,158, 75,253,187,253,195,221,238,196,233,
+215,244,215,249, 15,254, 13, 12,143, 95,229,149,251,191,146,159,174,168, 31,166,202, 57,185, 71,179, 56,159, 60,255, 0, 44,190,
+159,179,133, 62,250,130,147,205,243,116, 35,207,203,167,159, 76,103,203,250,244, 42,153, 60,221,200, 3,183,150, 62,206,158,154,
+ 88, 86,212,216,125,109,255, 0,237, 95,203, 6,231, 73,183,159,240, 24,157,183,247,236,196,140,143,102,104,199,110,188,102,224,
+231,211, 31,201, 71, 94, 15,211,105,229,239,236,204,199,253,115,191,221, 71, 80, 71, 82, 0,206, 51,208,227,167, 94,222,154, 25,
+105, 72, 7, 35,174,124,242,122,252,243,246,104,235, 89, 57, 27,203,191,192,126, 88,199, 58, 77,183,189,253,195, 19,188,254,253,
+183,254,140,191,251,103,127,186,134,150,160,120, 80, 60,142, 63,111,239,210,209,253,170,163,254, 39,224,191,150, 13,205,147,246,
+191, 1,249, 99,234, 65, 0, 3,249,235,162,146, 15, 64,123,244, 31,156,106,138, 70, 79,203,207,243,246,232,132, 12,159,179,175,
+223,157,105, 22,185,191, 75,116,194,120,174, 1, 61,189,113,249,249,106,176, 0, 96,121,121,254,253, 83, 70,122,244,200, 36, 12,
+231,183,231, 58,174,144, 14,115,158,131, 61, 52, 76, 12,123, 74, 74, 73,234, 49,249,252, 52, 66, 7, 76,250,254,204,106,130, 50,
+ 71, 92,224,158,153,235,223,231,231,253,154, 41,180,246, 7,203,169,252,253,186, 65,141,205,241,131,176,191,166, 43,163, 29,135,
+197,143, 79,159,217,162,144,140,142,131, 3,207,237,253,231, 84, 17,208,244, 3,175,125, 20,140,253,223,191, 68, 98, 69,192,194,
+ 36, 91,248,227,210, 7, 98, 79, 83,230,122,244,253,253,180, 72,193, 3,207,211,167,159,110,218,164,145,147,246,117,209, 9,237,
+140,128, 1,200,251, 71,223,219, 73, 49,185,233,108, 99, 21, 18, 0,193,193,235,223, 61,241,233,162, 83,140, 14,157, 60,134,124,
+191,118,168,164,115, 31,219,247,116,237,162, 80,158,163,167, 65,235,162,147, 97,115,219, 4,244, 23,177,255, 0,199,207,250, 98,
+170, 64,242, 3,229,162, 82, 9,192,249,119,249,252,245,118,183, 45,171,130,238,172, 83,173,203, 86,135, 85,184,238, 26,180,164,
+196,164, 80,104, 52,233,117,122,213, 90, 99,129,106, 68, 58,109, 46,158,203,143,206,146,164,161,100, 33,180, 40,242,182,165, 16,
+ 2, 73,213,222,187, 99, 94,182,156,151, 98, 93, 54,117,215,108, 74, 96,148, 63, 30,227,182,235,180, 39, 90, 90, 78, 20, 28, 77,
+ 82,158,215, 41,230, 7, 90,109, 60, 43, 32,137,165, 81, 43, 11,133, 36,106,181,237,123,117,183,107,224,250, 36,229,180,162, 54,
+ 49, 41,179, 56, 83,164, 27, 94,197,173,164, 27, 88,218,247,182,248,198, 80,144,123,128, 8,207, 65,220,156,249,122,157, 86, 70,
+ 62, 33,143,179,215,239,252, 63,110,188, 32, 18, 50,217, 14, 1,220,161, 73,115,211,185, 65, 56,237,162, 27, 73, 86, 58,128,125,
+ 7,127, 95, 61,101,136,223,126,191,127,195, 26,250,131, 11,131,127,120,239,138,168, 73, 56,233,212, 12, 30,190, 64,234,179,125,
+ 79,108,128, 65, 3,191,221,251, 53,245, 40,236, 58,103,190,122,253,191,187, 85,144,140, 43,169, 3,207,228,114, 15, 95,217,164,
+240, 49, 84, 39, 42,193,232, 59,129,129,148,140,118,207,225,175, 74,108,245, 4,242,143, 47, 81,233,175,160,149,103, 24, 10,245,
+ 30, 99,243,231,175, 67,174, 2,178, 51,230, 48,123,121,159,195,246,235, 24,199,195,174, 40,165, 56,206, 85,212,156,142,157,254,
+204,246,215,148,164, 2, 50,163,223,238,235,242,243, 58,172,224,201, 29,122,122,142,157, 51,140,159,151, 93, 92,168,148, 58,189,
+195, 84,167, 81, 40,116,202,141,102,177, 88,152,213, 58,145, 73,165, 65,153, 85,171, 85,170, 18, 20, 16,196, 10, 77, 42, 3, 46,
+ 72,169,206, 90,136, 8,101,134,214,226,179,209, 58,195, 50,162,150,118, 10,171,185, 39, 96, 48, 91,133, 2,231, 97,181,254, 54,
+183,239,197,153, 93,240, 57, 64, 30,106, 3,174, 51,128, 61, 53,233, 88, 67, 69,215, 84, 27,101, 56,241, 29, 89, 8,105, 40,238,
+165, 21,172,129,140,103, 82, 39,224,247,232,242,113, 5,186, 44,209,175,126, 45,110,120,252, 41,109,245, 65, 45, 76, 98,212,168,
+192,137,115,111,205,126, 34,210,167, 80,219, 22, 95,189, 38, 13,132,167, 80,143,133, 85,151,221,152, 18,178, 69, 47,152, 99, 82,
+ 25,217,126, 4,125,158,220, 32, 70,111,248,177,225,226,214,187,174,202, 84,112,204,221,208,222,132,198,220,171,212,205,121,104,
+ 12, 72,241,238, 54,151, 77,163,211,164, 45, 56,103,220,169,241,154,109, 74,229, 79, 82, 64,134,103, 28,115,148,101,101,145, 24,
+213,204,187, 89, 14,215,247,144, 9,248, 27, 91,212,226,216,224,191, 5,184,251,142, 12,111,150,229, 38,134,142, 80, 8,158,164,
+ 20, 4, 18, 0,100,140,217,216, 94,195,204, 99,185,176, 23, 36, 3,170,254,203, 46, 26, 46, 77,165,224, 39,102,233,180,203, 98,
+123, 55, 94,240,135,247,210,247,144,229, 50, 82, 28,149, 42,249, 17,191,130, 80, 39,169,184,229, 79,197,133, 96,194,183,154,100,
+100, 99,197,117, 73, 37, 43, 81, 86,234, 87,236,203,238,132,204, 33, 46,221,170, 32,138,139, 45, 45,243, 6, 98, 99, 20,165,137,
+143,123,195,179, 60, 34, 27, 65,240,249, 15, 57, 79, 42,214, 17,130, 72, 35, 99,155,223, 42,234,221,136,202,101,194,143, 66,171,
+184,105,112,211, 76, 5,132,211,101,181, 28,123,180,100, 71, 82, 83,238,168, 82, 80,227, 9, 67, 73, 8, 14, 54,132, 97,180, 20,
+130, 37, 39,125, 42,234,171,170,153, 34,124,151,131,206,170, 19, 32, 54, 57,101,207,141,200,137,172, 48, 57,190, 37, 8,222, 27,
+165, 60,170, 39, 42, 9, 10,109, 42, 35,158,243, 89,104,243,106,250,186,249, 38,156,203, 86,236,231,104,202,139,157,149, 87, 85,
+236, 1, 10,190,110,130,198,230,248,244,231,129,168,248,183,129,184,107, 38,225,202, 14, 30,163,155, 47,200,105, 99, 77, 38, 89,
+121,146,114,215, 68,146, 59, 8,236,178, 22, 87,121, 1, 82, 69,181, 95, 73, 7, 26, 81, 90,169, 61, 79,168,208,167,204, 91, 44,
+184,170,148,168, 83, 66, 11,141, 70,124, 78,167, 84, 35, 51, 29,198, 66,130, 11, 8,121,168,165, 36,146,181, 41, 14, 44, 21, 40,
+224, 88,100, 92,178, 84,252, 41, 12, 58,134,169,236,223, 20, 56, 17, 31, 91,158, 31,213,209,106, 45, 85,162,212, 38, 53,239, 67,
+159,220,194,222,100,171, 9, 37, 41,111, 45,133, 37,120,214,238,238, 21,145,110,110,237, 53,104,141, 18,147, 65,187,160,213,226,
+ 84,226, 75, 44, 52,154, 77, 70,163,111,200,247,152,240,235,208,227,114,167,192,113, 14, 20, 25, 44,164, 59, 28,191,226, 56,135,
+145,206,141,115, 74,240, 69, 70,139, 58,226, 93, 94,157, 42,151, 38,217,171,209,163,191, 18, 75, 72, 91,241,167,211,107,148, 86,
+235, 13,120,141,225, 15,143,117,147,200,218,176,158,118,242,164,158, 78,241, 42,202,121,105,230, 69, 46, 37,138, 83,229, 96, 54,
+ 39, 96, 53, 11, 27, 48,191,217, 61,150,247, 32, 99,163,184, 11, 53,202,248,178,154, 72,228,131,244,126,105, 66,170,147,211, 72,
+202,218, 17,229, 26, 94, 18, 8, 15, 27, 23,116, 14,187, 34, 6, 89, 17, 67,170, 54,206, 82,238,185,177,160,198, 76,229,153, 13,
+208,110, 74, 4,198,235, 44, 56,149,128, 69,106, 35, 41,155, 33, 8,201, 46, 37,233,173,153, 1,226, 91, 60,203, 41, 39,176,223,
+221,171,219,215,238, 40,178, 42,213,233, 10,163,209,233,181, 8,142, 38,114, 84,251,110,185, 54, 35,209, 31, 13,197, 91,138, 79,
+143,206,150,212, 57,242,124, 38,229, 16, 84, 73,240,213,204, 75, 50,143, 87,173, 84,164, 89, 20,181,168, 46,225,151, 26,159, 71,
+109, 65, 14,184,229,111,223,226,166, 53, 41,224,179,148, 64,114, 79,132, 90,113, 73,200,104,184,146,174,118,146, 79,101,175,201,
+205,219,204,155,102,128,180, 26,125, 18, 28,150, 98,195,105, 10, 14, 85, 92,139, 49, 44, 74,113, 69,160, 66,149, 34, 98, 36, 58,
+ 20, 83,202,178,235,104, 56, 3, 26,125,225,170,120,167,231,215, 85,141,112,211,105, 68, 66,108, 25,200, 98, 1, 35,204, 2,129,
+118, 32,139,221, 73,211,171, 88,164, 60,112,168,124,170,167, 38,200,178,103, 72, 51, 44,237,231,149,166, 81,253,213, 50, 10, 79,
+172, 10, 67, 42,201, 44,175, 42,128,126,168, 90, 67,176, 82, 27, 44,157,124, 91, 86,163,172,210, 40,209, 33, 66,112,182,149, 48,
+228,143, 4,186,243,202,144,134,136, 71, 50, 71, 59,195,196, 43,253, 81,128,121,143, 54, 9,213, 9,123,191, 49,153,245, 55, 35,
+206,109,168,116,233,113, 41,236,173,165,115,203,126,108,150, 24,126, 66, 34,165,149,164, 32, 41,215,163,182,233, 78, 22,166,155,
+ 90,143, 48,108,145,165, 85, 75,154, 37, 70,161, 46,164,219,243,155,165,183, 95,162, 83, 41,204,184,183, 31,120, 38, 3,190, 45,
+101,232,203,231, 40, 76,115, 83, 50,127, 74, 20,164,143,112, 40,242, 9, 31, 98, 92, 79, 79,129, 78,140,203, 11,121,138,245, 72,
+215,101,185, 49,196, 39,158, 19, 18, 21, 36,165,158, 84,115,163,196,105,234,116,116, 44,252, 60,143,172,114,249,234,105,237,243,
+234, 88,226,151,149, 96, 84, 34, 93, 22,215, 29,128, 4, 3,181,141,183,216,168,177,185,166,163,240,166,136, 67, 12,245,145, 53,
+ 84,238, 0,153,166,177, 96,204, 18, 87, 55,144,155,186, 70,146, 43, 45,216,107,212, 1, 59, 91,122,169, 91,167, 70,186,227,184,
+197,203, 10,131, 87,163,189, 10, 69, 85,214,171,148, 90, 69,113,166, 35, 70, 56,136,137, 81,234,204,184,151,100,173,214,164,200,
+104, 6,254, 24,254, 26,193, 30, 33,214,177,238,127, 2, 62,206, 30, 34,208,151,119,167,131, 14, 31,170, 51,171, 76, 70,150,170,
+189, 2,208,133,100, 93, 16,152,156,135, 92, 15,166,232,176, 13, 54, 74,101,165,135, 57,220, 33, 69, 97,249, 39,169,192, 0, 26,
+ 93,210, 95,153, 46,142,195, 48,212,207,240,138, 76,170,188,247,144, 86,212,166, 41,209, 88, 17,109,147,200,217,240, 91,113,230,
+ 10, 86,128,162,166, 98,165, 96, 97,201, 9, 78,178,250, 69, 65,249,177,152,150,228,245, 53, 78,141,239,234,159, 40,211,220,125,
+234,189,102,123,128,204,166,210,121, 79, 70,152, 89, 40,114, 90,121,185, 11, 65,166,199,232,221,121,189,200,179, 42,152, 93, 92,
+ 75,230,181,135,235, 18,204, 69,152,107,221, 75, 2, 72,234, 69,174, 46, 14, 32, 60, 65,225, 38, 67, 80,102,246,156,185, 96,142,
+ 64,186, 65, 26,216, 43, 6, 40, 6,149,221,157,212, 46,150, 93, 69, 68,110,116,131, 41,199, 40, 55,231,232,175,112, 39,186, 52,
+233,149,158, 27,247,143,120, 56,116,174,173,153, 18, 34,210,174, 57,144,247,130,194,102, 74,185,149, 26, 52,200, 23, 10,162, 86,
+ 96,176, 86,182,130,146,213, 93,197,161,183, 1, 8, 39,149, 38, 53, 60,110,123, 1,189,162, 92, 20, 64,171,222, 82,246,226, 47,
+ 16,123, 65, 75, 15, 72,127,116,120,126, 77, 82,239, 20,202,115, 40, 46,174,117,219,183,111, 65, 69,126,215, 97, 8,232,243,169,
+139, 58, 27, 74, 74,185,166,114,142, 99,250, 18,209, 46,181,183,224, 68,113,102, 52,106,107,177, 37,200, 76, 89,105,113,113,218,
+ 56,118, 12, 55,101, 50, 10,230, 23, 86, 85, 37,215,208, 22,167,192, 67, 77,169, 69,206,125,108,205,177,123,137, 81,132,228, 77,
+240,230, 79,154,105,244,170, 68,172, 70,170, 45, 44,243, 23,229,205,128,165,133,198, 42, 67,110, 60,176,176,144,220, 86,155, 75,
+156,175,184, 82, 37,249,111, 22, 85, 64,218, 42, 36, 46,150,235,171, 86,247,176,186,185, 5,172, 47,228,140,198, 46, 44, 72,234,
+121,147,139, 60, 39, 92,176,153,168,117, 68,140,198,218, 71,144, 3, 98,138, 64,212,159,103, 84,140,214, 0, 32, 12, 28,131,124,
+126, 50,105,198, 21,146, 20, 2,150,143,132,228, 7, 26, 81,109,214,212, 65,248, 92, 74,194,146,164,156, 20,169, 37, 42, 0,131,
+165,219,161,234, 58, 18, 58,228,124,254, 71, 95,166,111,180,163,216, 17,194, 7, 31,240,238, 45,193,218,248,212,110, 26,248,173,
+144,137, 82,206,229, 89, 52, 54, 25,176,183, 2,186,219, 40,113, 49,183,135,111,169, 74,106, 53, 73,215,223,228, 75,245,122,111,
+187,214,152, 50, 20,235,206, 84, 2, 61,217,127,158,255, 0, 24,156, 20,241, 33,192,134,239,206,217, 30, 38, 54,238,125,139,118,
+182,211,245, 43,118,166,211,159, 90,217,123,137,109, 53, 37,113,155,187,182,234,235,101,180,177,115, 80,148,226, 64,116, 0,220,
+200, 46,171,221,234, 49, 34, 72, 30, 25,177,178,252,214,159, 48,137, 36,141,135,159,161, 6,234, 78,231, 77,251, 48, 0,221, 90,
+199,202,197,117, 32,214,105,170,234, 26,172,186, 65, 29, 84,101, 65, 54, 87,177, 10,215, 32, 13,141,138,150,236, 14,199,245, 75,
+111,141, 87,232, 7, 78,223, 46,186,240,164,147,156, 28, 3,215, 4,145,249,235,175, 68,129,142,189, 7, 76, 99,191,151,125, 32,
+ 65, 39, 61, 71, 76, 36,140,103,167,252,116,233,141, 78,248,166, 18, 9,199, 92,122,143, 95,234,239,175,161, 36,250,244,200, 30,
+ 93,115,158,191,142,170,121,127,171,248,116,215,196,144, 1,202,147,156,231,167, 92,228,232, 96,111,143,129, 56, 33, 89,201, 25,
+230,243,242,215,164,117, 4,143,135, 25, 61,115,251, 63, 29,125,233,140,254,206,216,252,245,215,209,215,246, 12, 1,220,121,253,
+253, 52, 48, 58,123,176,136,207, 68,245,233,231,142,164,103,246,106,130,219,198, 9,242, 61, 70,124,244, 78, 14, 58,140,121, 2,
+ 70, 49,246,252,191,175, 84,207,110,131, 39,246,103, 63,212,127,167, 88, 6,255, 0, 17,140,224, 37,160,224,249,103,215,184,207,
+168,252,247,208,170, 64, 0,231, 36, 18,123,250,252,190, 90,184, 57,205,158,184, 61, 58,231,190,125, 58,121,245,208,238, 32,242,
+231, 4,117,232, 58,231,175,203,236,214, 65,232,122, 99, 32,158,221, 78, 45,197, 1, 39, 32,245, 29, 49,158,152,199,174,188, 20,
+231, 36, 28,121, 28,159,179,207,240,209, 42, 73,234, 20, 7, 79,245,123,146,126,126, 67,174,168,242, 12, 40,100, 99,166, 0,243,
+235,158,231, 75,169,184,235,131,168, 34,219,109,243,243,111,195, 3, 40, 3,212,147,129,248,125,186,160, 70, 70, 63, 35, 70, 41,
+ 35, 56, 30,153, 63, 44, 13, 12,180,144, 73, 3,167,246,126,206,186, 81, 79,108, 24,216,116, 23,254, 71, 0,184, 0, 32,116,206,
+122,159,217,215, 31,158,154,162,160, 78, 58,100,103,175,175,221,163, 20,147,230, 7,221,216,158,250, 25, 89,201,230, 56, 39,183,
+207,211, 31,119,244,105, 92, 1,208, 95,113,129, 22,128,114, 64,199,200,249,250,140,104,117, 35,166, 6, 1,239,246,103,200,244,
+209,138,206, 65, 56,207,160,242,208,199,169,200,207, 95, 92, 14,221, 63,118,149, 7,160, 39,167,207, 95,158,248, 54, 5, 87, 76,
+228,103, 25,253,159,187, 66,172,116,206, 15, 78,216,253,164,244,237,211, 70,172,100,142,152,235,220, 30,253,124,255, 0, 62,122,
+ 25,196,228,156,100, 1,208,227,182, 79,228,104,248, 50,250, 91,127, 92, 91,215,128,112, 14, 73, 39,167,161, 29,123,232,115,223,
+168,235,158,191,184,104,199, 19,144, 83,211, 62,126,189, 61, 63, 13, 12, 80, 70, 78,114,125, 15,225,223, 58, 89,122, 97, 81,107,
+ 3,210,216, 29,105,243, 25,206,133, 90, 72, 39,183,153,251, 62,223,150,116,105, 25,251,186,250,103,228,126, 90, 25,105,206, 73,
+200, 62,126,125, 59,253,250, 85, 79, 91,157,176, 69,216,144,119,183,250, 96, 34, 48,113,165,175,107, 73, 39, 35,175,224, 52,180,
+174, 15,113,220,216,227,234, 49,143,233,209, 40, 24, 3,231,215,243,247,106,128,198, 6, 1, 31, 35,223, 85,211,204, 59,128, 49,
+233,223, 61, 58,233, 18,118, 3,231,221,140,226,178, 60,250,253,223,191, 85,209,220,253,157,189,127, 63,191, 84, 81,143, 33,215,
+204,234,178, 6,122,231,177,237,249,242,254,173, 16,157,137,190, 6, 8, 78,112,112, 70, 7,124,143,196,244,243,233,162, 27,234,
+126,239,234,213, 4,125,189,188,191,126,189, 18, 64, 86, 14, 8, 30,125, 1,207,244,255, 0,102,181,216,133,193, 78,224,142,199,
+ 7, 54,115,211, 61, 62,206,158,126, 99, 69,164, 14,128, 16,123, 15,151,236,213,189,146,233, 74, 78, 19,142,153,251,112, 63,171,
+ 71, 55,223,162,122,140, 28,224,246,249,233, 34,215,194, 71,174, 43,165, 61, 65, 57,232,123, 99,191,167,237,209, 9, 0,142,169,
+249,103, 39,175,175,217,170, 64, 18, 71,145,233,231,230,123,231,229,170,232,200, 36,116, 29,135,203,168,243, 62,103,182,176, 73,
+ 61,123, 96,167, 21,209,156, 1,208, 14,195,241,243,249,104,148, 3,216,156,228,224,103,250,117, 65,160, 72, 29, 58, 3,231,163,
+ 16, 58,231,175,203,211,211, 73,191,175,207,108, 99,107,145,181,206, 58,159,236,114,180, 36,215,120,223,178,238,166, 92,121,134,
+ 54,178,207,191,175,249, 50,154, 42, 65,101,248,212, 39,104, 52,196,151, 17,213,181, 46,101, 96,132,144, 65,248, 62,103, 82,170,
+147,119, 79,171, 52, 99,214, 12, 27,130, 56,200, 92, 43,154,147, 73,175,197,113, 32,149, 96,181, 85,136,238, 83,215,166,114, 61,
+117, 30,111, 98, 93, 13, 12,206,226,110,249, 80, 74, 93,129,102,217,118,147, 11, 61, 22,147, 89,172,205,170, 73, 66, 84, 58,128,
+180, 66,104, 17,242,215,110, 85, 89, 62, 34, 74, 78, 18,162, 18,178, 78, 2, 72, 24,243,252, 53,207,158, 33,214, 52,188, 67, 60,
+ 91,218,146, 56,163, 6,254,160, 73,191,190,242, 16, 55,233,143, 67,190,140,252, 57, 24,240,222, 10,185, 97, 89, 6,113, 87, 87,
+ 57, 12, 1, 4, 44,130,152, 2, 8,181,138,211,143,223,140, 91,113,184, 80,224,223,122, 90,127,248,197,225,195,111,141, 78, 74,
+ 74, 28,185,236, 6,100,109,189,210,202,149,255, 0,194, 25,155,109, 45,182, 30,116, 14,184,114, 58,193, 35, 36, 29,114,235,126,
+ 61,136,232,153, 30,101,195,194, 78,234, 11,142, 74, 18,167, 81,180, 59,192,184, 84, 27,145,224,126, 38,225,219, 27,129, 13, 41,
+129, 85,124,254,171,109, 79,106, 42,220, 56, 5,240, 78, 79, 93,141,126, 51,110,161,151, 93, 72, 82,213,250, 21,147,128,162,159,
+242,172,156,116, 75,192, 96,143,245,128,214,109,101, 34,179,125, 87, 98,219,150,188, 73,117, 58,171,235, 8, 75,113, 88,113,228,
+190,130,160,148, 6,130, 7,194,176,163,212,158,137, 41,207,108,226, 37, 67,197, 89,254, 85, 44,107, 65, 92,242,128,109,202,127,
+172,140,251,130, 53,244,131,234,154, 77,174, 21,133,241,105,113, 79,128,254, 26,113,109, 13, 76,249,182, 65, 22, 83, 80, 16,177,
+174,164, 11, 73, 52,123,127,120,210, 70,162, 57,108,123, 78,146,165,250,169,223, 16,133,191,246,226,251,218,171,186,173, 97,110,
+ 77,165,112,216,183,165, 5,229, 49, 86,182,110,106,115,212,202,172, 69, 5, 40, 7, 80,219,163,150,100, 37,129,150,164, 48,167,
+ 88,117, 63, 19,110, 40, 29, 97,233,193,243, 24, 29,250,143,184,116,215,232,143,190, 62,204, 45,147,226, 95,110, 34,219, 28, 90,
+ 85,225, 64,173,211, 34, 4,217, 87, 45, 7,192,123,116,108, 57, 14, 35,197, 13,193,172,182,131,239, 52,194,172,248,180,249,101,
+232,171,201,194, 80,172, 40,106, 85,157,236, 48,246, 94, 89, 49, 96, 11,150,111, 16, 59,185, 80, 43, 83, 18, 93,168,222, 84,251,
+ 54,159, 41,214,155,241, 92, 81,129, 64,166,133,196, 36,117, 74, 67,170,207,108,116,206,173,202, 63, 17, 40,214,142, 55,205,233,
+ 13, 21,112,217,227, 87,141,135,185,128, 46, 29, 67,117,210,202, 74,244,212,246,213,142, 20,207,126,143,124, 95, 14,119, 61, 31,
+ 6,200, 56,195, 36, 55,104,107, 68,114, 83, 2, 59,199, 46,168,204, 70, 69,177,250,200,100,120,157,124,223, 84, 73,137, 96,225,
+130, 70,121, 22, 8,237,202,133, 96,250, 28,227, 72,168, 32, 0, 58,146,113,140, 31, 63,151,222, 53, 61,230,125,146,190,201, 76,
+ 62,208,225,254,252, 87,128,217,112,248,251,193,118,173,197, 4, 39,152,242,173, 11, 29,115,211, 32,117,193,211, 69,186, 94,193,
+159,103, 5,247, 75, 55, 6,222,220,187,247,177,170,142,168,178, 84,212, 27,150,141,124,210, 39, 70, 74,144,228,182,226,199,187,
+233,222, 60, 23, 11, 1,196, 7, 82,242,195,107,113, 42,240,151,142, 83,177, 77,226, 46, 75, 83, 47, 41, 81,193,177, 55,242,216,
+ 0, 46, 73,185, 22,183,223,238,190, 25,235,190,143,254, 42,229,177,123, 69, 87, 14,170,171, 21, 80, 22,161, 11, 51, 57, 1, 84,
+ 2,160, 93,137, 3,114, 63,142, 35, 1,192, 79,179,155,127,248,252,190,165,208,246,210,151, 26,220,219,219, 90, 68, 49,185,187,
+209,119,179, 45,157,189,219,184,210,112,227,112,228, 57, 29, 33,219,162,244,145, 27,153, 80, 40, 80, 57,165, 61,128,236,151, 33,
+196, 10,146, 38,173,194, 71, 5, 92, 32,251, 61,109,198,127,137, 11, 71,248,111,187,134, 47,186, 92,156, 68, 95,208,233,213, 77,
+203,169,188,166,210,220,230, 45,176,210, 20,198,221, 91, 60,222, 42,147, 78,163,161, 14,132, 16,169, 50,102, 40, 41,100,251, 2,
+ 70,221,108,222,222,208,118, 35,135,219, 98,141,182,187, 99,183, 80,221, 22,253,169, 5,240, 28,175,120,202,109,117, 43,158,224,
+172,168, 42, 69,193,113,212,166, 35,154,109, 86, 73,117,239,122, 88, 75,220,172, 22,219, 70, 15, 39,112, 35,202,153, 34,108, 9,
+ 83, 16,228,242,167, 30,167,205, 67,209,101, 60,247, 40, 75,203,132,133,184, 16,103,115, 6,213,204,193,117,183,249,130, 73, 35,
+ 5, 53, 87, 20,120,131, 91,154, 84, 73, 73, 68,198,158,137, 73, 10, 65,221,198,214,239,181,250,134,185,234, 8, 61,113,217, 30,
+ 12,253, 20, 41, 50,184,169,243,158, 45,133,115, 76,244, 44,114,114,236, 90, 10,109,118,101, 69, 7,109, 69,110, 68,166,247, 32,
+244, 91, 5,122, 46, 93,207,151,112,185, 82, 84,201,237, 85,196,152,174,184, 88,241, 23,239,197, 8,146,129,239,112,210,195,217,
+143, 82, 97,220,134,151,240, 7,148,160,230, 82, 64, 42,108, 46, 11,170, 52,200,142, 42,108,229, 75,154, 25, 10,128,251,176,220,
+ 69, 62,231,164,248,160, 73,129, 34, 43, 32,148, 79,109,191, 21,101,149, 97,198,164, 54, 36, 52,149, 5,184, 19, 97,136,251,117,
+212, 9,207, 47,222, 75, 83,204, 70,166,198,109, 84,203,178,149, 49, 96, 25, 28,237,178,132,166, 28, 66,181,167, 45,188,144, 84,
+217, 47, 45,181,163,161,199,231,178,168,238, 61, 67,174,165, 50, 30, 68,210,138,101, 69, 41, 66,226,214, 24,154,175, 18, 68, 23,
+ 25,200, 16, 43,237, 53,206, 89, 40, 41,101,229, 18,227, 11, 67,153,107, 85,228,149, 94,103,214, 88,177,181,218,251, 49,190,198,
+219, 19,126,194,199,107,117, 59, 14,220,202, 56,115, 41,161,100,166,134, 46, 65,164,220,199, 24, 80,202, 6,149, 99, 29,208, 93,
+ 86,200,179, 38,148,109, 12,205,160, 36,107, 36, 87,151,170,161,165, 46,223,113,167,151, 78,170, 42, 43,148,218,139,143,133, 60,
+212,244, 50,100,136,203,150,242,135,136,250, 60, 22,164,198,112,144,183, 19, 29, 76, 58,165, 45, 0,185,112,131, 94,118, 83,239,
+ 68, 41,110,145, 84,110, 85, 61, 77, 75,109,178, 94,166,215,169,104, 8, 67,209,226,188, 8,118, 28,136,175, 69,146,129,147,227,
+180,167,144,130,160, 73, 24,237, 74,148, 41,180,184,241,225,200,118,224,181,231, 71,136, 98, 84,161,159, 30,183,110, 75,101,207,
+122,101,135, 67,139, 34,171, 78, 67,173,161, 72,116, 98, 92, 85,128,204,132, 60,193,241, 18, 44,199,101, 84, 85,252, 43,112,177,
+ 42, 84, 4, 52, 95, 52,245, 4,179, 84,167,160, 46, 60,163,202, 84, 82,137,173,158,119, 35, 43, 36, 50,180, 41,160, 2, 22, 0,
+ 48,114,196,178,177, 80, 55,211,178,238, 64,223,114,118,234, 70,226,196,234,190,160,112,250, 40,232,234, 98, 13, 29,180, 72, 74,
+135, 58,129, 51,142, 88, 77,113,191,149, 76,133, 66, 76,142, 54, 49,137, 46,240,201,115,180,187,121,113,159,112,167, 74,168,126,
+134,164, 39, 75, 21,246,192, 76,150, 24,152,101, 59, 6,160, 22,251,164, 23, 22, 86, 34,169, 37, 64, 41, 77,186,215,114,156,150,
+ 43,139, 43, 97,169, 85,218,101,105,162, 25, 69,219,106, 92, 52,234,159, 51,106,114, 59,213,187, 98, 11,114, 96,186,162,129,133,
+ 58,105, 47, 71, 91,228,165, 74,112,210, 83,241, 18,146, 11,135,106,214, 98, 78,172, 73,102, 43,177,164, 67,184,105,116,249, 76,
+184,164, 4, 42, 59,240, 23,245, 98,155,113,151,208, 49, 37,216,174, 66, 88, 82,250, 45,200,200,202,137, 72, 26,161,196, 82,249,
+ 44,237,191,114,123, 77,202,228,191, 13, 50,108,176,183, 27, 75,109,213, 41, 83,161, 73, 7, 42, 42, 37,230,219,111,224, 71, 41,
+ 82,129, 72, 56, 26, 82,178,211, 80,176, 96,117, 33, 87, 27,130, 65, 15,123,139,250, 43, 17,247,133,176, 59,154,251, 35,230,229,
+ 30, 34,101,181, 84,209,154,121,115, 5,168,137,162, 38,222, 89,169,228,145, 35,177, 23,211, 13, 74, 42,128,222, 98,209, 33, 93,
+247, 45,207, 13,114,155,103,122, 54,250,161, 33,214, 94,250,215,234,202,139,111,115, 54,235, 9,117,115, 33, 84, 25,247,117,161,
+ 36,186, 75,171,142,226, 92, 32,132,169, 8,234, 2,250,244,178,232,151, 46, 85, 85, 97, 46,180,218,152,141, 41,185, 10, 82,146,
+133, 56, 87, 49,135, 28, 75,206, 54,128, 82,149,182,149,114,148,252, 73, 40, 42, 25, 63,173,202,173,165,149,245, 27, 59,105, 37,
+133,198,106, 75, 46,199, 11,153,201,226, 56,179, 68,204,101, 51,206,133, 4,148,184,138,122, 64,229,229,233,145,221, 56, 61, 81,
+185, 75, 51, 27,159, 80,109, 41,125,186,148, 24,239, 53, 37,180,135, 92,106, 52,136,171,113, 78,165, 68,140, 37, 16,223, 89, 4,
+156,167,195, 25, 30,171,240,236,165,105,234,169,128, 26,161,150,226,251, 18, 25,116,220,216,131,250,167,125,192, 39,222,113, 12,
+241,161, 4,252, 89,144,102,166, 63, 45, 69, 19,211,173,192, 32, 52, 53, 5, 73,183,217, 0,172,167, 96,196,253, 93,251,227, 89,
+170,116,137,115, 41,150,180, 88,239, 52,228,155,128,190,219,171,105, 45,132, 20, 84,125,242,101,110, 97,109,192, 60, 15, 6, 4,
+169, 41, 7,205,101, 42, 4, 30,100,235, 48, 98,100,183,170,109, 55, 77,129, 26, 53, 90, 77, 38,159, 64,165, 69,109,165, 59, 30,
+ 52,118, 31, 90,205,199, 80, 1,144, 68, 88,139, 74, 3, 44,182, 0,117, 80,218,100,243, 23, 20, 81,245,170, 20,128,229,191, 57,
+231, 18,227,180,170, 21, 94, 83,170,231,105, 13,211, 41, 41,129, 19,194, 45,180, 74, 72,152,162,162,165,171, 24, 90,155, 91,121,
+ 64, 1, 10,190, 89,208,106, 49,147, 38,123,140,190, 42,215, 59,205, 63, 4, 41, 77, 7,232,116,248, 77, 39,221, 90,229, 3, 45,
+ 60,220, 25, 11,121, 77,164,169,180,203,154, 2,178,180,171, 50, 56, 55,242,106, 47,163,123,251,137,182,215, 39,127,128, 23, 32,
+147,183, 70, 90,252,198, 22,163,102,103,142,115, 15, 52,168, 39, 72, 47, 37, 68,133,131, 88,139,196,145, 68,178, 49, 42, 54, 4,
+ 38,158,106, 17,126,147, 14,157, 74,146,213, 34,214,106,160, 3,145, 23, 72, 93, 65,214,154,147, 60, 45,214,208,171,150,181,227,
+ 40,145, 58,176,135, 20, 0, 88, 40, 71,191, 85, 50,133, 16,199, 40,204,233,149,217, 16, 81, 74,106,213,167,196, 41,166, 68, 93,
+ 61,218,202,202,222,163, 83, 36,180,202,163, 63,224, 83, 73, 82,235, 51,209, 30, 63, 41, 12,169, 45,248,223, 4,213,169, 74, 90,
+ 53,128,211,101, 42, 82,164, 55,109,135, 89,147, 41, 74,163,196,152,181, 2,229, 14,132,196,169,105,114, 84,194,235, 37, 15,213,
+165,203, 74,222,142,144, 8, 75,184,116,146, 25,235,123, 77,126, 53, 26,159, 50,222,163, 82, 34, 87,170,209, 34,199,165,211, 98,
+196,145, 42, 52, 27, 97,182,148, 76,169,143,206,119,244, 45, 5, 21,254,145, 74, 46, 58,167, 16,167, 2, 71, 51,139,214,220,104,
+ 21,172, 65, 37,238, 69,201, 58,119, 82, 55, 23, 34,254, 81,127, 40,177, 82, 54, 23, 48,154,250, 57, 42, 21,105,164,129,171,170,
+ 20,141, 98, 87, 0,144,254, 73, 38,170, 44,234,129, 19, 88,176,146, 78, 89, 34,103,179,171,162, 77,157, 81,164,143,123,163, 8,
+ 73,114, 60, 56, 14, 56, 25,153, 92, 82, 27, 64,113,230,129,159,116,212,234,141,165, 30, 35,232,150,149, 34, 26,138, 67, 35,195,
+229,195, 64,160,161,215,163,214,229, 61,114,193,118, 3, 18,169,144,234,116,244, 83,105,213, 73,128, 42,170,162,244,180, 53, 84,
+173, 73,139, 52,114,195,114, 72, 17,209, 13, 46,130, 91, 66,252, 80,144,164,132,233,150,102,139, 89,170,162, 58, 42, 11,109, 2,
+156,194, 86,221, 33,181,251,181, 38, 42,218, 67, 77,174, 97,127,153, 78,214, 92, 14, 2,191, 29,239, 13,182, 62, 55, 80,210, 57,
+121,206,113, 74,153, 54,127,189, 8,203, 67,140,225,184,143, 85,220,123,222,211, 87,121,197,162, 59, 80,232,138, 96,225,196, 37,
+231, 93,231,158,158,124,173,226,166, 18,183, 1,113, 59,104,206, 7,217,212,166,214, 54, 39,125,193,177,184,189,190,201, 2,219,
+129,115,109, 36, 64,115,202, 58,106,133,145,131,199, 51,172,111, 27,220,150, 84, 18, 57, 32,181,236, 38,119,102,187, 2,172,173,
+245,138,161,227,115, 42,109, 53,183, 89,113,151,211, 75,165,167, 49, 32,171,220, 30, 90, 20,243,205, 83,164, 33,100, 75, 87,189,
+190,190,121, 21, 18,250, 71, 48, 94, 91,105, 75, 43,121, 74,230,229, 45,103, 23,124, 32,112,213,237, 11,217, 74,166,193,241, 37,
+103,179,117, 80, 93,247,138,133,163,115, 83, 94, 17,183, 11,108, 46,100,165,216,113, 47, 43, 30,236, 12, 41,116, 27,141,183,211,
+202, 18,144,184,181, 22,208, 98,204,139, 46, 18,220,104,135, 30,225, 76, 56, 81,105,212,133, 48, 41,180,229, 70,162,206,126, 38,
+ 92, 98,148,206, 66,164,193,166,164, 45,105,171,200, 68,140,120,203, 37, 97, 47, 60,174,114,244,144, 80, 29,171, 42,165, 30,155,
+ 49, 51, 37,181, 81, 79,132, 15,185,196,151,151,234,114, 30, 44,248, 41,113,104, 4,248,238,184,148,190,180,184, 74,188, 52,182,
+ 16,234,154, 81, 58,124,203,115, 9,169, 39, 2, 57, 12,104,246, 82,172, 26,204,163, 72, 34,253, 44, 52, 92, 91,236,149, 12,133,
+109,183, 62,241,103, 9, 69, 81, 77, 83, 52,208,150, 44, 27, 66,145,121, 36, 63,181, 37,206,204,250,129, 61,116,169,212, 89,131,
+ 43,201,249,104,123, 74,253,155,155,225,236,203,226, 10,102,204,110,202, 63,132, 86,125,198,138,149,127,100,183,134,155, 1,112,
+237,173,219,177,225,202, 67, 75,152,211, 60,203, 77, 6,247,167,123,204, 54,107,180, 85,184,167, 33, 62,251,114, 35,170, 69, 54,
+ 84, 73, 46,115,200, 36,167, 25,234, 60,137, 61, 71,217,242,198,191, 92,191,104, 95, 2, 27, 99,237, 47,225, 82,247,225,235,116,
+208,197, 6,191, 47, 55, 54,209,110, 43, 17, 27,149, 84,218, 45,211,165,197,120, 90,215,101, 56,171, 11,149, 13, 70, 66,225,214,
+ 96,115,165, 21, 26, 85, 74, 92, 66,166,214,227, 79, 55,249, 64,239, 46,206,238, 55, 15,155,187,185,155, 17,187,212, 5, 91, 27,
+163,180, 55,157,106,194,190,104,165,101,216,241,171,116, 57, 30, 18,166,211, 37, 16, 5, 70,131, 54, 18,226, 79,167, 74, 70, 81,
+ 42, 5, 78, 52,132, 18, 28, 26,183,178,186,229,171,129, 84, 73,169,212,119, 35, 85,129, 0,134,181,188,202, 72, 5,128,210,110,
+164,121,139, 34,115,126, 99,150,201,150, 78,208,177,215, 21,236,173,125, 91,218,250, 75,126,181,187, 55,113,190,246, 44, 91, 95,
+135,148,129,156,147,147,205,212, 31,144,244, 3, 58,243,202,158,132, 96,121,118,234, 51,223,167,152,213, 84,132,144, 83,212,144,
+122,231,250, 71, 93,121,229, 7,168,206, 61, 58,103,231,212,233,216,126,242, 48,223,133,202,123,243, 12,118,207,203,183,111, 61,
+ 32, 14,126, 17,140, 14,161, 90,245,202, 0,199,235, 2,114, 60,191,110,190, 5, 15,139, 57,201, 32,114,253,216,239,161,239,192,
+233,108,123, 39,162,135, 78,189, 62,195,246,249,106,136, 10, 78,112, 73, 80, 61,113,230, 62, 64,254,122,234,166, 18, 83,202,122,
+103,184,207, 81,130, 49,223,236,215,174, 80, 6, 9,201,199, 47,111, 46,189, 71,203, 89,192, 63, 27, 96, 53, 1,149, 31, 49,140,
+143,183,211, 84, 10,122,103,152,159, 49,204,115,211,229,233,253,186, 57,109,140, 0, 0, 42, 35,161, 61,188,137,207,221,161, 86,
+ 58,145,216,118,198, 58,231, 30, 93,116, 48, 63,158, 1,112, 96,228,246, 63,119,203, 84, 21,220, 28,101, 35,160,235,242,245, 31,
+102,138, 90, 22,121, 72,232, 51,231,247,231,247,104,117, 39, 61, 58, 2, 59, 96,249,104,234, 64,191,160,198, 65, 55,247,255, 0,
+ 60, 14,160, 50, 60,137, 24,206, 58,103,203, 61, 58,234,146,135,124,156,121, 99,160, 31, 51,219,236,252,116, 73,206, 49,128, 51,
+231,231,251,123,106,130,209,216,142,152, 32,159, 63,195, 75, 14,184, 84, 94,215, 29, 79,250, 96, 55, 19,215, 9, 7,190, 79,166,
+113,212,157, 10,180,231,174, 51,219, 30,163,230, 61,124,245,112, 94, 8, 35, 56,199,150, 58,254, 63, 97,208,174, 36,246, 79, 78,
+132,250,231,203,175,160,237,165,148,155, 11,141,240, 1, 23,176,233,128,148,158,253,122,158,192,247,206,126,126, 93,116, 42,219,
+ 61,126, 33,142,248, 29,128,238, 64,251,180, 98,130, 72,235,144,115,140, 99, 39,215, 61,190, 90, 29,105, 56, 32,252,142,124,190,
+223,195, 58, 58,223,238,254, 95, 39, 6,192,106, 72, 24,199,207,169,245, 30, 90,160,176, 6, 79, 92,227,183,145,249,118,249,104,
+165,167, 61,148, 78, 62, 93,254,239, 93, 12,179,220, 30,157, 60,198,115,242,249,127,110,150,193,148,246,192, 42, 80,207, 64,115,
+230, 7, 95,188,250,119,213, 21, 12,100, 99, 63,179,231,162,150,129,220, 12,103, 57, 35,191,246,104,101, 2, 7, 81,158,249, 35,
+174,127,183, 74, 39,124, 40,187,129,129,212, 62, 68,122,250,125,199, 84, 23,140,143, 92,117,213,117, 19,215,184, 4,231,175, 66,
+ 79,245,106,130,251,142,158, 93,255, 0,118,149, 29,122, 95, 24, 34,198,227,107,126,239,159,158,216, 20,140, 18, 59,227, 75, 95,
+ 85,250,199, 75, 75, 13,192, 56, 53,129,222,221,113,224, 31, 34, 70,125, 6,170,115,117, 4, 36,146,112,146, 71,252, 62, 67, 84,
+ 57, 57,156, 74,190, 46,131,167,126,189, 72,198, 14,138, 73, 72, 0,249,103,174,123,247,243,198,181,201, 39,189,191, 44, 27,238,
+190, 43,164,129,129,211, 63,236,245,233,243, 58, 32, 97, 35, 36,140, 31, 65,231,246,249,232,100,242,133, 16, 14, 78, 58,158,157,
+ 7,144, 58, 37, 4, 36, 28,167,155, 7,168,239,223,182,147, 44,119, 29,113,140, 86, 9, 88, 80, 33, 67,148,142,189, 58,147,229,
+223,183,125, 16, 27, 14, 36, 37, 73,206, 14, 71,113,233,215, 84,146,114, 59, 96,121,126,113,162,219, 33, 61, 20,122,227,203, 61,
+135,228,105, 51,107,111,211, 4, 38,221, 6,253,190,126, 24,172,132,132,167, 25,192, 31, 46,167,238,209,141,168,114,132,252,186,
+ 31, 95,234, 58, 17, 41, 24, 32,168,146,115,128, 59,159,179,174,138,108, 18,115,203,216, 12,131,215, 0,103,174,144,194, 71,174,
+ 42,227,160,207, 92,117,206, 62,223, 33,242,209, 40,194,176, 79, 64,124,186,245, 61,190,239,236,213, 16, 1, 81, 29, 64,242,237,
+249,245,209, 45,130, 6, 1,237,228,113,147,251, 59,104, 99, 7,241,193, 13,224,100, 14,158,159,183, 68, 33,125,121,112,122,103,
+ 36,117, 25,207,111,219,170, 8,237,156, 12,250,116,207,217,159, 61,101, 86,165,169,113,222,213,218, 85,175,104,208,234,151, 29,
+199, 92,154,205, 58,143, 67,162, 64,145, 83,170,213,103, 62,174, 86,162,193,129, 17,181, 57, 37,226, 79, 92, 12, 36, 30,101, 16,
+144, 78,144,150, 68,141, 93,157,130, 34,110, 73, 54, 0, 1,212,158,192, 96, 14,194,219,159, 78,228,237, 97,234, 73,216,119, 56,
+239, 95,177,184, 52,198,205,241, 34,250, 82,145, 37,219,203,111,154,116,243, 97, 74,140,138, 52,229,161, 36,121, 36, 56,165, 99,
+ 62,127,102,186,125, 58,178,168,165,224,240,108,180,227,106, 45,243,168,133, 3,219,224, 41,253, 99,156, 28,124,181,130,123, 43,
+ 61,153,123,231,176,246, 46,230, 76,226, 66, 69, 19,109, 99,238,172,123,102, 85,189,105, 61, 82,102,161,115, 83, 77, 53, 47, 41,
+114,110, 56,241, 22, 91,166,201, 83, 79, 37, 41, 96, 41, 78, 35, 7,156,131,211, 91,183,187, 60, 21, 87,216,164,202,171,216, 55,
+ 44, 43,172,211, 80,185, 34,157, 13,254, 73,133,108,167,153, 73,110, 58,212,124, 76,167,200,119,206,185,175,140,211,219,115,250,
+250,186,121,150,106, 87, 41,102, 86, 4,217, 99, 69, 62, 95,180, 64, 96, 69,237, 98, 6,161,177, 7, 30,160,125, 30, 51, 92,167,
+ 42,240,231,133, 50, 92,240,205,148,102, 10, 42, 3,172,240, 74,138,188,202,201,222, 50,206,202, 2,106, 70, 70,243, 90,193,183,
+223, 26, 33, 89,187, 38, 56,211,173, 73, 82, 68,134, 29,100, 33,180, 43,195,241,146,165,129, 30,115, 42, 79, 82,234, 84, 82, 20,
+ 61, 53,220,158, 22,104,113,246,115, 98,169, 87, 66,163,180,230,226,223, 48,159,157,245,162,217,109,215,233, 84,130, 15,134,212,
+ 53,167, 42, 99,197, 78, 84,181,167,226,199, 98, 53, 30, 10,163,245, 54,234,111,196,144,202,209, 82,166, 75, 80,109,137, 72, 83,
+ 78, 49, 38, 59,153,147, 79,146,210,250,165,126, 35,100, 96,227, 24,215,127,118,138,242,164,110, 62,192,109,157,106,149, 47, 30,
+229, 76, 54,197, 89, 17,150, 68,186,101, 86, 23, 51,106, 97,104, 7, 45,130, 23,217, 88,202,117, 28,118, 20, 81, 23,136,105,153,
+198,204, 58,139,149,189,143,111, 45,236, 65,254, 3, 29, 5,199,185,104,158, 14, 29,203,164, 80,217,101, 77, 86,170,133, 93,209,
+180,199,170, 20, 96, 14,241,187, 6, 37,127, 93,148, 45,136,181,242,106,229,223, 42,176, 31,122, 91,235, 11,114, 43,173, 63, 43,
+152,169,199,159,143,135,153, 45,243, 30,101,243,182,162,159,187,215, 88,194,171,109, 42, 52, 22,155,105,229, 73,168, 62, 22,203,
+206, 5, 45,198,219, 49,203, 37, 62, 31, 54,124, 70,223, 9,248,135, 92, 47,174,172,242, 97, 74,133, 54,150,235,136, 92,152,237,
+ 58,252, 89, 13, 45, 92,139, 46, 50,219,136, 74, 20, 9,248, 28, 41, 32,143, 62,190,122,188, 83, 18,164, 54,242,101, 71, 65,114,
+ 44, 22,132, 53, 40,114,187, 30, 75,239, 23, 82, 65, 72,234,224, 65, 70,125,121,117, 30, 87, 45,172,129,168,158,155,237,126,135,
+115,211,189,187,236, 62, 56,127,142,130,130,138,154, 49, 79, 24,120,134,234,170,193,123,180, 96, 91,169, 10, 66, 18, 15,151, 77,
+128, 4,226,231, 71,140,106,110,203,144, 95, 44, 50,131, 42, 92,249, 46, 56,161,202,196, 32,136,201,141, 24, 96, 36,190,183,201,
+194, 51,149, 21, 28,117,214,187,111,102,251,181, 33,243,106, 81,228, 61, 14, 37, 33, 97,130,251, 50, 21, 30, 63, 51,105,194,152,
+ 98,106,148, 82, 95, 81,200, 60,195,245,138,142, 20, 14, 19,125,222, 75,250, 78,218,216,238,219,180,169,142, 42,187, 85,231,169,
+204, 91,107,109, 14,183, 50,106, 86,182, 24,105,167,112,133,173,168,202, 43, 80,230, 79,199, 45, 56, 33, 67, 58,228,228,187,229,
+250,132,217, 47, 75, 67,178, 96, 58,242, 83, 61,164, 56,226,208,226,208,181,175,198,125, 46,167,157, 35,226,117, 68, 43,152, 40,
+ 32, 32, 40,140,101,246, 58, 73, 18,147,146,135, 76,211,128,242,145,107,170,177,186,198, 9,237,250,205,184,185,216,218,219,233,
+112,238, 72, 56,183, 63,169,204,229, 28,252,143,135,165, 49, 82, 40, 35,235,170, 18,203, 36,204,173, 96,202,132, 24, 98, 13,183,
+146, 66,118, 56,218,122,181,245, 81,114,145, 37,110, 60,103,198, 97,207,125,165, 84, 31, 79,131, 90,163,190,219, 97, 10,108, 48,
+ 26, 9,169, 66, 90, 80,227, 47,128, 80,181, 33,204,169, 42, 79, 34,145,144, 27,238, 36,202, 77, 46, 61, 71,146,158, 91, 77, 34,
+ 80,129, 80,121,196,192,149, 37,107, 67,234,250,134,230,105, 96,211,223,104,169, 92,205,169, 77, 58,128, 83,145,140, 41, 90,141,
+ 75,174,173, 77,251,204, 9, 44,170,156,220,176,219,244,224,164,200,165, 79,117,183, 20,184,138, 75,160,173,218,100,118, 89, 33,
+ 75, 40,230, 73, 95, 94, 82, 7, 38,179,218,117,105, 35,154,151, 61,164,211, 34, 50,180, 74,121,186,147,237,205,163, 21, 60,162,
+ 29,110, 35,204,164, 37,216,238, 48,180,134,146,248, 5,180,189,243,232,211, 62, 92,169,112,162,228, 27,221,109,123,121,123, 16,
+109,110,225, 46, 44,215,186, 62,199,161,242,220,190,156, 36,113,114, 47,203,109,107,162,234,192,145,231, 26, 47,177,110,190, 75,
+ 27, 13, 65,145,137, 24,220,138, 82,100, 86,167, 67, 85, 85, 5,217, 21, 54, 83, 26,153, 91,143, 41, 84,218,173, 77,175, 19,157,
+ 16,100, 78,167,184,142,105,169, 96,169, 46,243, 41,104,121,178, 22,223, 34,202,155, 23,250,140,137, 20,138,148,138,125, 82, 20,
+234,253, 56, 69,122, 35,244,247, 86,135, 43,244,199,152,112, 33,197, 60,228, 96,159,173,226,132, 50, 84,121,113, 53,165,176,135,
+ 82,167, 71,194, 53,242, 20, 11,121, 84,166, 35,198,155, 38, 4, 37,169, 19, 41,142,209, 42, 19,225,165,233, 62, 34, 25,142,226,
+ 80, 30,113, 17,157, 66,149,252,196,164, 18,216, 82, 84,115,167, 38,148,205,126,152,227, 49, 97,220, 38,171, 81, 86, 91, 68, 26,
+187, 13,248, 14, 69, 97, 62, 35,143,138,156,112, 22,101, 41, 15, 18, 22,226, 10,194,136,230,230,233,134,127, 42, 6, 37,206,199,
+117,101, 43,181,186,143,180, 75, 2,110, 73, 96, 5,128,176, 42, 44,157, 77, 28, 1,181, 71, 86,166, 56,195,160,133,227,150, 34,
+ 10, 48, 60,200,165, 70,147,146,168,163,204, 71, 45, 85,148, 2,193, 25,163,195,167,111,214, 86,203,172,196,137, 45,186,155,174,
+161, 10,167, 73,203, 62,227, 94,136,211,232, 33,202,160, 82,127,192,238, 54, 24, 88, 10,120, 37, 1,208,149, 43,151,151,153,182,
+170,166, 34,105,117, 25,181, 40,161, 79,194,159, 53, 78,221,148, 2,130,244,202, 62, 11,173,203,168,196,140,210,177,239,188,139,
+ 79,188, 52,148,143, 25, 25,113,159,210,140,171, 8,167, 26, 85, 94, 65,131, 35,235, 11,102,226,130, 87, 49,132, 48,166, 27,155,
+ 34,167, 24, 20, 49, 81,133, 37, 81,151, 26,170, 90,112, 31, 21,124,188,252,170, 13,201, 72, 73,201,204,105,149, 74,157, 57,200,
+147,110, 38,154,139, 18, 67,205,195,153,115, 70,104, 51, 79,155, 83, 70, 23, 21, 85, 85, 0,161, 70,146,242,249, 2, 78, 76,126,
+101,128,219,173,128,148,235, 34, 80,196, 0,231, 83, 92, 1,220, 90,204, 10,145,112, 0,185, 42, 1, 2,236,108, 45, 99,136,197,
+109, 57,134, 90,147, 78, 60,243,173,165,136,149, 15, 48,189,215,148, 86,241,202,190, 93, 81,152,134,165,148, 13, 11,202,242, 35,
+169,110,248,110,177, 16, 67, 42,158,104,128,170, 20,215, 22,194,141,110,142,176,131, 25,131,225, 54, 11,133, 84,196,180, 99,164,
+ 18, 82,252, 36, 58, 2, 73, 90,181,243,137,137,169, 94,219, 91, 8,140,165,159, 30,241,143, 84, 66,139,156,202,240, 96,192, 62,
+ 18,156, 82,206,124, 78, 89,140,129,203,241, 21, 30, 76, 19,163,109,106, 99,148,203,129,215,161, 22,149, 70,170, 36, 45,108,171,
+ 31,224, 53, 5,243, 58,217,101,215, 79,193, 25, 79,185, 33, 32, 39, 1,165,190, 66, 50,135, 15, 45,187,123,227, 46,167, 87,178,
+ 45,198, 26,115,194,143, 66,171,214,144, 26, 91,156,200,171, 26,148,118, 84,145, 31,151, 10, 8,167,198, 11, 4, 31,135,197,207,
+235, 37, 39, 74,201, 56, 20,179, 48,220, 2,160, 89,137, 27, 48,218,251, 92,218,224, 27,108,182,181,237,189, 90,213,112,199,197,
+185, 37, 66, 63, 50, 26, 82,245, 33,186, 21, 2, 41, 29,149,214,224, 41, 89,127, 85, 64, 0,155,129,164,168,195,121,106,210,157,
+ 49, 16,180, 67,123,221,105, 23,132,151, 98,143, 8,133,181, 9,233, 2,160,114,132,149, 41,152,202, 77, 80, 0,122, 20,224,133,
+140, 19,174,145,216, 85, 22,174,139, 58,117, 20,167,255, 0,116, 45,215,218,183, 92,253, 48,116, 59, 66,168, 71,135, 84,162,201,
+ 91,137, 33, 46,115, 83,165, 76,101, 96,101, 41, 92, 44,103,200,106,117,145,110,169,112,231, 15, 1,196,123,195, 84,153, 12,178,
+ 20,148, 41, 94, 28, 38,226,200,119,157,100,120, 95,165,138, 1,112,228,146,114,114,161,173,186,219, 8, 70,145, 86,150,137, 9,
+ 45, 70,158,138, 76, 55,148,216, 65,109, 45,150, 86,152,239,128, 57, 65, 12, 75,229,234,122,225,213,148,244,209,114,119,104,171,
+ 4,128,125, 92,254, 87,191, 96,110,192,158,223,104, 2,109,189,142,214,189,197,123,226,102,115, 14,101,151,130,175,170,167, 41,
+126,116, 54, 59,220, 24,181, 41, 23,243, 93, 94, 65, 97,177,125, 39,160, 56,182, 92, 20, 69, 77,185,225,210,208,218, 12,121,177,
+214,245,101,132,175,147, 20,200,207,169, 77, 67, 12,161, 64,187,239, 14, 55, 24, 58, 82,112,164,176,232,229, 32,231, 94, 29, 77,
+ 69,138,133, 70, 29, 29,163, 30,174,236, 24, 12, 74,171,176,182, 29, 93, 18,157, 80, 46,135, 10, 99,172, 22,209, 86,126, 34, 28,
+247, 86, 74,249, 90, 42, 50,212,149, 37,164,133, 61,149, 74, 50, 96,174,108,231,227,148, 73,104, 70, 98, 34, 90,232,251,142, 52,
+174, 65, 30, 63, 46, 28,230,126, 90,201,119, 25, 60,138,113, 64,225,189, 82,183,173,152,148,155,102,178,203,203, 68,215,166, 72,
+114,183, 95,156,227,173,149, 84,171, 51, 30, 74, 27, 67, 12,173, 36, 52,203, 81,219,102, 60, 68,130,144,203,109,165, 36,133,120,
+138,212,193, 31, 77,212,144, 72, 34,198,251, 27,245, 44, 15,154,214, 6,230,224,239,182,149, 3, 21, 18,113, 76, 43, 65, 3, 50,
+137,214, 49, 12, 40,135,117,121, 29,209,158, 71,223, 75, 42, 46,136,204,108, 8,145,132, 74,193,144, 72, 75, 74,213, 54, 21, 45,
+ 76, 91,246,218, 94,139, 17,193, 28, 86, 29, 14, 46,115,208,212,249, 67, 77, 64,167, 72,144, 20,185,149,135,226,180,158,101,145,
+202,195, 40, 83,141,144,227,200, 2,245, 21,216, 52, 92,248, 96, 70,161, 83,252,103, 98,197,145, 15,156,115, 78,109, 49, 66,157,
+109, 1,110,205,152,167, 16,175,119, 65,203,206,130,172,229, 69, 42, 23, 85,184,213, 38,116,122, 77, 49, 30,243,112, 48,191,122,
+156,175, 0,120, 52,218,131,205, 97, 18,106, 83,146,149, 4,194, 76, 0,146, 91, 88,241,164,101, 41,109,188,184, 10,126, 34,216,
+ 84, 0,137,213,234,155,149, 73,236,160, 76, 76,164,176,212,104,116,198,150,183, 7,131, 18, 42, 93,229,167,198,253, 69, 23,214,
+ 76,149,151, 57, 71,195,200,157,109, 69, 33, 82,243, 60,133,180,234,176,248,250,244,211,107, 91,226, 72,211,167,112,188,181,209,
+ 76,160,213,204,197,106, 0, 96, 24,179, 79, 82,204, 72, 51,121,144,128, 10,249, 98,149,218,225, 28,149, 89, 27,152,205, 94,144,
+220,249, 80,209, 79,171, 70, 91, 20,181,184,135, 92,141, 50, 72, 14, 84, 76,118, 19, 36, 34,177, 25,151, 21,138,119,187,114, 19,
+ 21, 68, 12,117,150,149,132,150,213,150, 54, 98,220,136, 16,188,119,163, 67,101, 5,113,196,105, 72,165,185, 82,119,197, 5,126,
+248,228,114,219,144,233,141, 70, 67,104,106, 56, 82,124, 82, 79,136,218, 88, 9,105, 88,156,247,222,169, 82,227,191, 45,232,212,
+218, 11, 78, 71, 98, 59,143,161,113, 39, 84, 75, 46,153, 13, 76,172, 45,229,243, 37,135, 29,104,251,180, 52,101,110, 6,210,236,
+148,169, 74, 12,138,140, 74,153, 50, 51,206, 33,177, 76,164,162, 59, 73,171, 73, 72,104, 78,168,197,125,231,124, 63, 6, 48,109,
+102,142,200, 60,234, 28,229, 82, 93, 7,244,104,105, 39, 91,241,105,141, 99, 37,254,169,195, 11, 90,214,220,144, 53, 30,151,233,
+216, 2, 62,226,207, 81, 79, 37, 64, 53, 1,150,150,100,144,129,164,144,145, 57, 33,117, 0, 73,102,157,197,144,162,146,201,229,
+185, 91, 7,133,199,163,200,101, 79,198,131, 70,106, 76,183, 83, 33, 17, 40,212,166, 60, 24,241,189,234, 27,101,247,106, 85,121,
+ 13, 51,138, 77, 9,190, 85, 34, 58,146,217, 82,185,213,225,182,227,202,108, 33,244,163, 51, 30,132, 13,122,179, 61, 46,206,167,
+178,218,106, 21, 83, 17,198,105,113, 16,255, 0,130,203, 84,152, 48,121,220,112, 58, 60, 70,144,219, 72, 14,202,154,226, 91, 75,
+137,117,229,164, 37,133,166, 84,233, 54,205, 18,152, 42, 78, 72, 74,100, 38,109, 70,157, 75,167,176,101,215,110,185, 45,168,183,
+ 26, 21, 45,132, 58, 22,233, 81, 25, 47, 73, 45, 70,101, 9, 42,121,228, 37, 28,165,217,183, 32,206,171, 85,105,149,250,165, 82,
+149, 14, 75, 94, 12,218, 69,174,167, 26, 93, 42,136,182,199, 51,171,157, 33,213,135,234, 53, 63, 17,100,187, 57, 41,104, 33, 40,
+ 8,142,218, 24, 74,121,221,169, 86, 22, 72,193,212,205, 96,202, 46, 67, 48,184, 22, 31,101,130,133,184, 4, 88, 49, 35, 72,181,
+216, 86, 28, 81, 1,116,150, 73, 25,169,242,225,205, 66,229, 73,146,164,163,105,104,209,130,181,131, 0, 76,135, 75, 68,143,118,
+149,228,145, 98,129, 95,138, 36,233,202,152,138,141, 93,169,141, 69, 80, 30,227, 5,244, 43,222, 82,165, 36,243, 74,171,176,208,
+ 41,106,160,226,222, 82, 83, 28,169, 98, 40, 10, 73, 90,220,201, 68, 52,254,150,111, 2,144,225,187,179,158,209,187, 10,132,211,
+ 79,213,165, 82,118, 15,137, 25, 20,246,210,148, 75, 91,140,190,246,200, 95,117, 36, 32,115, 57, 41, 10,102,175,109,202,146,122,
+ 41, 18,232,108, 40,225,134,134,166, 17, 71,172, 75,173,183,254, 28,202,224,136, 19,125,223,220,189,237,247, 37, 21,179, 37,214,
+ 81, 80,121,191, 1, 45, 16,166,130, 31,105, 33,106, 75, 76,149, 56,163,206,177,200,205,113,141,195,133, 51,141, 78, 12,248,147,
+225,150,176,148, 59, 23,119,182,166,230,182,237, 57, 15, 97,150,105,151,140, 70, 87, 85,176,107,200, 50, 27,253, 3,177,111, 58,
+ 93,191, 49,181, 28, 41, 2, 57, 60,193, 74,200,158,100,149,102, 22,210,191, 88,166,198,203,123,107, 2,250, 84, 17,179, 17,170,
+ 37, 36, 88, 6, 45,176, 1,135, 60,241, 94, 80,210,197, 55, 50, 52,167,146, 27, 38,149,177,141,119,250,189, 44, 46, 13,254,219,
+ 16,222,117, 4,220,220,223,242, 16, 41, 10, 0,121,103, 35, 29, 63, 35,174,144, 0,146,129,231,232,122,252,251,246,242,213,103,
+105,213, 58, 52,201,244, 90,252, 69,192,174,208,170, 53, 26, 21,114, 3,128,135, 96, 86,232,211, 30,166, 85,233,238,115, 96,133,
+177, 82,139, 41,165,103,205,147,175, 33, 3, 57, 79,194, 14, 78,124,199,203,236,212,253, 72, 96, 25, 78,160, 70,198,251, 27,216,
+220, 31, 76, 83,251,247, 22, 56,241,142, 65,215,160,207, 76,143, 35,229,243,210, 78, 79,144, 72, 39,250,186,145,142,218,250, 74,
+136, 25,198,115,208,129,220,124,245,247, 36,146,124,191,217,244,236,126,205,103,127,191, 3, 30, 72,200,230,229,206, 58,121, 15,
+199,215,251,117,236, 5, 31,245, 72,242, 7,190, 62,223, 76,233,114,133,144,114,164,245,198, 7, 65,219,215,238,215,190, 92,127,
+ 56,224,103, 31, 47,191,211, 67,221,233,129,138, 43, 71,124,156, 15,196, 14,221,186,244,208,171, 3, 3,191,166, 64,201,249,119,
+249,234,232,212, 41,147, 22,132, 71,105, 74, 46,186,134, 91, 32, 16, 29,125,194, 18,211, 12,249,188,250,213,209, 40, 72, 43, 89,
+ 56, 72, 39,166,186, 71,195,191,178, 43,142,110, 36, 99,196,171,219, 27, 61, 83,178,237, 25, 97,151, 26,188,247, 98, 90, 54,206,
+131, 38, 59,229, 63,225, 52,182,171,241,205, 66,178,148, 52,175, 16,166, 60, 5,115, 36, 97, 43,202,147,157,121,171, 41,169,236,
+ 37,148, 43, 55, 69,234,199,224,162,228,159,112,198,205, 37, 29, 93,124,188,138, 26, 89, 43, 38, 29, 86, 36,103, 32,122,182,144,
+116,143,123, 88,123,241,204, 5,140,156, 36,231, 29,252,135,224,124,251,232,117, 0, 14, 70, 1, 7, 7,183,159,203,207,166,117,
+177,124, 80,240,223,126,112,157,189,183,214,195,110,107, 49,211,119,216, 53, 54, 96,207,155, 77, 84,151,104,213,200,115,224,199,
+169,209,174, 75,118, 76,184,204,185, 50,223,157, 79,148,219,177,157,113,166,212, 74, 28, 66,144, 20,218,181,174,203,234, 48, 7,
+159, 79, 94,255, 0,111, 83,141,108, 83,203, 28,200,146,198,218,163,144, 2, 58,142,190,160,216,223,220, 69,240,155,199, 36, 18,
+203, 12,200, 98,158, 22,100,116, 59, 50,178,157, 44,164, 14,132, 16, 65,247,140, 12,160, 58, 18,122, 12,253,253, 63,179, 67,171,
+168,200, 61, 58,140,249,227,207,167,231,182,138, 63,173,208, 17,223,167,203, 25,201,252, 53, 69, 64, 1,142,253,115,246, 15, 67,
+173,144,108, 65,244,198, 70,227,125,199,254, 48, 26,129,245, 28,189,186,140,125,224,250,245,208,171,192,201, 25, 7,255, 0,104,
+122,103, 69,184, 70, 72, 57, 0, 30,195, 29,124,186,126, 31,179, 66, 47, 62,163, 30,158,121,249,116,210,202, 73, 23, 56, 0,108,
+ 61, 54,192,202,193,193,193, 4,247,206,116, 58,199,159,175, 67,233,162, 87,235,229,140,122, 96,250,252,244, 58,129,201,200,200,
+251,113,131,219, 56,209,199,198,216, 54, 6, 88, 0,100, 39,175,203,167,231,251, 52, 43,131, 39, 36, 2, 64,236, 58,254, 63, 61,
+ 22,231, 76,100,244,201,251, 60,134,132, 80, 30,188,221,127,104,193,245,251, 52,170,155,223,107, 91, 25, 22,223, 2, 44, 12, 18,
+ 70, 49,219,212,117,237,161, 87,243,234, 15,111, 44, 31, 92,249,249,232,197,140,103,249,222,127,105,251, 6,133,115, 24,236,123,
+246,244,239,223,229,165,147, 10,139, 27,123,190,126,126,252, 12,188,246,199, 76,103, 62,152,254,142,154, 13,206,249,201, 78, 51,
+156,140,231,211, 31, 46,250, 49,194, 2,122,244,243,207,151, 79, 93, 90,212,167,148,162, 20, 50,159, 34,158,248, 35,184,244,210,
+152, 2,247, 55,232, 48, 59,171, 82, 85,220,156,231,177,199, 79,179, 75, 84,137, 89, 82,129, 64,192, 61, 9,238,125,123,157, 45,
+ 11,159, 92,102,195,211, 7, 1,145,228, 49,230,115,215,175,153,251,245, 85, 41,199, 65,212,158,255, 0,159, 77, 82, 78,114, 7,
+145,207, 79, 35,223,203,237, 26, 37, 0,231, 61, 49,231,219,242, 53,130, 1,198,113, 85,164, 37, 39, 24, 29, 70, 51,230,123,121,
+232,129,156,245, 31, 8, 29,193,235,233,231,223,190,169,163, 29,176, 58,117, 7, 26,244,121,242, 2, 82, 20, 60,250,224,142,189,
+251,246,210, 76, 0,248,223, 3, 5, 39, 29, 51,146, 59,252,240,123,103,174,138, 64,206, 8, 35, 31,183,240,208,109, 54, 70, 78,
+ 78, 73,235,147,144, 6, 78, 6, 51,215, 70,163, 57,233,142,157,199,203,229,162, 27,218,255, 0,203,124, 17,187,155,224,134,240,
+161,156,231,174, 64,235,211, 29, 63,164,104,132,168,143, 60, 14,199, 24,243,245,249,127, 86,168,160, 96,103,207,203,243,246,141,
+ 16,132,224,228,245, 7,174, 63,160,231,215, 73, 16, 5,253,223, 39, 9, 28, 86, 71,127, 62,223,143,231, 58, 44, 1,220,122, 99,
+160,192,252, 52, 58, 82, 7,219,143,207,238,213, 86,242,162, 60,134,112, 57,142, 0,243, 42, 62,128, 12,232,167, 5, 97,182,231,
+108,101, 54,149,175, 93,188,238, 42, 37,171,108, 82,103,215,174, 43,142,169, 10,139, 68,162,210,216, 92,170,133, 82,169, 80,121,
+ 49,225, 64,134,195, 96,151, 31,113,229,164,118,194, 70, 84, 72, 0,157, 78, 55,217,195,236,235,180, 56, 5,219,136,183,189,229,
+ 6,143,114,241,101,120,210,144,245,197,112,186,195, 83, 99,109,101, 38,115, 41,113, 22, 77,152,167, 82, 66, 42, 9, 66,147,245,
+132,212, 0,227,174,130,132,144,210, 64, 58, 65,236, 48,224, 78,145,183,150, 91, 28,115,238,229, 25, 47, 93, 23, 10,101,211,120,
+127,163, 84,163,165, 73,163,211, 57, 87, 30,165,184, 46, 48,226, 73, 76,201, 4, 45,184,107, 35, 40,101, 37,105, 33, 78,103, 93,
+206,171,207,168, 77,158,242,214,234,165,120,206, 45,240,239, 57, 83,188,203, 36,252, 62,157, 9,239,170, 51,196, 46, 48,105, 37,
+147, 42,160,151, 76, 16,146, 37, 96,109,169,129, 27, 92,118, 83,208,119, 32,181,143,145,135,112,125, 25,188, 13,143, 54, 16,113,
+223, 19, 82,137, 17,172,244, 16, 72, 60,170,157,125,165,213,191, 93,246, 49,126,194, 16,247,212,254, 92,102,175, 95,155, 82, 46,
+162,100,151,208,236,151, 84, 86,135,157, 83,143, 45, 96,146, 94,142,181, 28,149, 31,231, 39, 61,245, 66,141,115,205,137, 57,175,
+ 1,247, 75, 76, 35,195, 76,148, 41, 72,125, 46, 37, 67,149, 50, 80, 63, 89,178,122,100,246, 29,245,245,218, 59,147,164, 45, 78,
+ 62,215, 50,202,148,134,101,254,133,244, 62,145,140,180,188,124, 11, 56,232, 71, 67,171, 83,148,233, 49,170, 13,190,247,248, 44,
+245,182, 90,104, 56,144,150, 39, 33, 63, 10,154,125, 67,225,241, 20,158,202,245,193,243,213, 56,106, 88,146,193,203,105,235,239,
+ 59, 19,191,201,199,127,158, 23,202,218,157,233,146, 24,236, 81,136, 80, 46, 1, 43,107,143, 46,174,130,197,183, 3,169,212, 47,
+102, 23,138, 45,142,166,222, 16, 42, 27,183,108,211, 81, 10,232,163, 70,247,155,186,155, 13,174, 83, 92,132, 0, 8,170,165,134,
+192, 6,115, 39, 5,106, 72,203,136, 86, 73,233,166,207,131,205,208,115,108,174, 89,118,133,206,234,163,216, 59,146,166, 20,169,
+ 42, 82,136,161, 93, 77,252, 49, 42, 33, 4,225,182,215,204,148,185,216, 20,171, 61,198,186, 27,110,114,132,166, 53, 69,148, 59,
+ 30, 90, 23, 25,101,236,171,154, 43,201,240,223,133, 36, 17,241, 35,145, 74,229, 39,161,215, 63,238,253,167,145,106,238,109,193,
+110,177, 27,154,158,103,166,165, 71,109,208, 75, 65,135,207,188, 66,117,149,227,252,159, 41,228,233,219, 3, 75,181, 66,188,109,
+ 27,157, 72,221, 61,223,199, 99,123,219,220, 65,219,108, 51,192, 88,210, 85,228, 53,174, 76,116,104, 30,157,201,185,229, 35, 0,
+ 2, 19,125,224,147, 75, 37,239,101, 33, 13,213, 69,250,103,114, 80, 10,102,173, 46, 58,164,199,113,180,212,163,184,159,141, 18,
+ 38,180,144, 27,150,219,136,255, 0, 40,194,218,193,244,234, 52, 13, 53,152, 76, 85,228, 75,126, 75,175, 83,218,112,212,170, 11,
+111, 28,170,135, 77,132,169, 78,242,115, 15,209,175, 45,242,143,153,236,117,227, 97,231, 85,171,148, 38,109,155,155,154, 91, 20,
+248,232,126,139, 84, 87,199, 38, 34, 85,134,223,163, 74, 82,186,185, 28, 40,126,141, 95,205, 7, 30, 67, 69,110,125, 33,219, 19,
+109,119, 58,172, 90, 66, 93,116, 66,166,211,214,225, 63,160,250,214, 82, 3,169, 64,233,241,150, 27,112, 39,168, 3,155, 62, 88,
+ 58,244,144,243,106,233,148, 11,197, 35,128,123,129,109,205,246,238, 6,199,184,235,108, 71, 42,184,155,216,242,188,198,154,162,
+ 95,237,180,208,232,140, 11, 90, 66,236,136,172,189,245, 3,160,145,212, 16,122,249, 73,227,159, 17,187,137, 50,231,190,101, 63,
+ 18,112,228,140,252,162,176, 30, 62, 10,228, 73, 82,164, 22, 95, 72, 63, 2, 91, 10, 66, 22,112, 8, 82, 66,185,126, 28, 29, 79,
+145, 81, 80,168, 42, 68,213, 63, 12, 37,188, 63, 45,130,209,128,132,156,150, 26, 75,203, 73, 74,254, 39, 10,138, 92, 67,124,164,
+229, 42, 25, 25,186,221,245, 35, 87,185, 43, 18,155, 90,227, 77,126,164,251,143, 7,129,118, 51,188,178, 11,120,144,148,242,135,
+ 91,232, 71, 50, 10, 92, 36, 36, 39,211, 88,139,213,131, 77,117,196,212, 27, 16,219, 83,220,225,196,169, 47,211,101,161, 71,194,
+ 11, 92,133, 4,174, 9, 66,203,105,113,183,145,240,248,193,124,202,108,130, 38, 34, 59,179, 29,137,125,253,230,246, 63,127,165,
+250, 13,186, 11,218,248,225,108,186, 60,159, 36,202,104, 33, 80,239, 79, 18, 6,232, 36, 44,108,206, 88,216,171,134,102, 58,137,
+189,193,232,183,182, 51,138,107,197,167, 35,145, 32,194, 75,137, 45,162,170,204,129, 26, 59,172, 0, 57, 16,250, 88, 42, 67,173,
+168, 44,132, 33, 97,105, 81, 89,194,193,192, 15, 21,183, 34, 93,189, 17,133,173,196,213, 88,150,133,188,239, 51, 44,199,149, 29,
+ 45,142, 86,210, 82,135, 2, 38, 68,112,144,144,148,168, 41, 39, 32,133, 0, 2, 89,200, 80,154,117,109,186,212,100,199,139, 80,
+101, 13, 33,216, 78,199,114, 51,238, 37, 74, 91, 78,189, 27,148,178,231, 80,164,172,130, 9, 41,201,238, 14,179,250, 11, 83,227,
+182,194,154,145, 2,161, 25,212,187, 44,196, 66,213, 18,124,111, 5,107,100,166, 20,148,169,198,211, 12,115,175,153, 42, 74, 80,
+ 70, 78, 78, 51,166,186,192,172,178, 6,109,136,220,117,189,189,227,117,177, 30,160, 27,119,233,139, 14,158,162, 39,142, 0,101,
+ 66, 93,128, 10,247, 70,216,130,108,214,176, 96,108, 65,243, 95,175,187, 27, 7,111,210, 27,168,182,211,116,199,151, 78, 75,232,
+110, 83,209,169,177, 26,125, 10,125, 72, 91,143,187, 34, 34,142, 34,172, 0,129,128,132, 45, 73, 72, 9, 43, 56, 80,206,163,202,
+184,216,125,223, 26,158,154,225, 56, 80,114,142,180, 69,150,162,178,150,227, 46, 61, 62,106,200, 76,129,146, 74, 91,146, 28, 87,
+ 54, 67,121, 73,211, 37, 69,159, 9, 83, 19, 42,175, 34,171, 13,106, 74,227,154,156, 84,200, 79,185,120,108,229,135, 25,169, 81,
+213,250, 96,176,134,208,128, 65, 64,248,130,145,141, 58,116, 74,219,236,148,159,175, 97, 86, 33,180,182, 20, 87, 17,108,199,169,
+180,216, 91,106, 47, 79,130,128, 61,245,230,208,113,204,207, 34,215,156,148,247,212, 94,170, 25,163,109,148, 76,140, 5,245, 41,
+218,254,142, 8,213,107,116, 44, 47, 97,229, 55,198,205, 75, 85, 29, 71,255, 0, 73, 68, 85, 96,178,164,159,111, 98,202,179, 71,
+229, 98, 69,134,130,202, 77,238, 0, 83, 96,239, 82,107, 84,106,164,152,205,214, 16,245, 17, 75,247,101, 22, 43, 1,232, 83,105,
+203,136,165, 50,229, 98, 34,151,202, 17,226, 61,202,145,202,178, 48,162,146,142,250,216,251,105,128,186, 36,170,100,211, 22, 67,
+ 77,176,209,122, 60,214,153,145, 30,167, 10, 65,240,214,164,164,158, 79, 13, 73, 45,115, 37,224,181, 33,120, 81,230, 79, 42,131,
+ 59, 69, 16,106,201,139, 50, 64,129, 87,142,243,161,150,146, 80,211,168, 90, 71,134,148, 54,236, 25, 3,150, 43,129, 5,101,229,
+ 41, 92,199,162, 51,130,112,245,208,236,136, 14, 52, 88,165, 63, 50,139, 34, 51,197,246, 98, 51,239, 14, 83,216, 91,139,113,121,
+ 76, 73,110,172, 58,223, 48, 72, 13,160,134,135,112,144, 6,154,194, 70, 23,117,229,143,129,216,236, 71, 80, 47, 96,118,184, 4,
+222,231,114, 6, 41,222, 44,205,105, 4, 73, 28,205, 45, 7, 45,193,177,250,212,141,149,187, 31, 44,137,107,144,124,172,109,102,
+184,117, 1,243, 59, 82,158,154, 90, 88,167,200,142,181,210,164,169,181, 70, 81, 89,144,237, 61,164, 97, 8,142, 95, 89, 89,114,
+156,227,128, 6,143, 58,148,202,185,146,172,161, 73, 41, 58,230,163,187, 82,190,163,190,164, 15,240, 15,170, 97, 12,245, 79, 47,
+184,169, 46, 41,174,193, 14,169,111,140,231,161, 40,198,122,227, 89, 5, 18, 3,176,154,143, 6,166,202, 9, 1, 73,143, 61,174,
+116,199,117, 99, 11,126, 47,134, 18, 84,193,229, 10, 37, 10, 37,180,225, 64, 40, 28, 13,100,168,166,120,245,217, 15,133,120,168,
+146,220, 87,219, 46, 28,171, 6, 52,112,158,128,225, 60,175, 70, 87,197,205,140, 40, 16,112, 64,214, 42,193, 90,101, 10,126,211,
+169,184,233,123, 31,188,110, 72,220, 3,125,207, 67,138, 55, 49,206,155,219,234, 42,132,129,216,197, 32, 46, 15,145,195, 50, 2,
+235,191, 86, 80, 85,250, 18, 70,227, 86,166, 57,149,157,109,178,148,183,224, 71, 1,183, 35,200,142,217, 40, 25, 72,109,212,201,
+ 82,185, 20,122,144,165,158,100,158,128,171, 25,198, 50,253,209, 40,136, 75,137, 56, 90, 16,244,102,139,216, 60,229, 92,174, 20,
+160, 14,224, 59,241,225, 62,105,200,244,214, 51,107,195,108,165,151, 16,146, 22, 20,133, 20, 2, 74, 64,121, 60,138, 65, 87, 76,
+ 96,117,207,114, 8,243, 3, 79, 5, 53,182,146, 64, 57,193,111,145, 35,178, 84, 80,226, 28,232,165,126,162,177,219, 31,234, 19,
+220,105,223, 44,132,121, 88,223, 77,198,253,250,119, 62,253,247,252,113, 75,113, 30,119, 60,175, 32, 4,249,186,239,191, 91,252,
+ 54,176,222,214,184,191,174, 50, 89, 20,195, 81,143, 72,144,180,173, 79,134, 84,226,176, 3,206, 10,131, 10, 49,156,120,149, 12,
+182, 3, 33,100, 31, 37,188, 73,238, 14,172, 46, 81, 36,215,106, 78,136, 82, 13, 46,159, 29,244,173,218,140, 98, 3,147, 86,130,
+148, 42,159, 79,101,212,148,184, 90, 82, 9,117,242, 64, 39,157,182, 86, 64, 39, 89,163,142, 4,210, 26,113,106,112, 18,169,104,
+109, 13,148, 32,151, 20,219, 9, 95, 85,156,163, 43, 88, 5, 64, 16, 3,157, 50, 73,215,199, 43, 45, 65, 83,113, 91, 14,161,136,
+145, 25, 84,196,198, 1,231, 22, 91, 74, 20,150,219,107, 33, 42,116,156, 18,165, 16, 57, 84, 58,142,131, 82, 86,141,140,129, 80,
+ 14, 99, 42, 29,250, 93,128, 39, 98, 55,238, 64,233, 99,214,219, 98,176,130,186,186, 61, 66,153, 3,200, 12,138,151, 0,172,107,
+174,228,216,130, 24,139,170,168, 32,128, 73,218,246, 35, 9,159, 71,167,209,161,120, 20,248,236,194,134,100,203, 91,178, 29, 95,
+186,251,203,202, 90, 28,149, 81,118, 76,215,143,188, 39,196, 74,202,151, 33, 97, 35,155,151,196, 40, 72,195, 37, 84,174, 73,169,
+ 84,154,106,129, 77, 18,105, 49, 10,229, 68,157, 80,241,218,102,167, 32,224, 55, 84, 90, 25,111,222,102,198, 15, 5,251,154, 64,
+109, 11,229, 46,180,231, 39, 33, 15,133, 74, 59,117,246,189,234,168,242, 95,136,212,199, 36,199,182,218,105,167,105,241,249, 74,
+146,211,181,151, 92, 73, 53, 87, 2,149,206,150, 9, 76, 54,221, 64, 80,109,197, 32, 43, 88,189, 94,149, 6, 43,205,191, 86,230,
+247,217,135,221,162,211,216,142,170,140,185,124,205,173, 45, 70,131, 10, 58,124,106,140,226, 75,124,160, 0,202, 50, 8, 82, 18,
+ 57,198,220, 72,224,134,210, 45,176,191, 96,122, 95,208, 6,189,206,219,216, 29,247,196,207, 33,174,134,153,155,219, 85,171,171,
+156, 48,220,187, 89,207, 83, 96, 67, 75, 32, 91,221,193, 17, 45,216,175, 48, 50,178,224, 84, 74, 44,154,236,184,109, 72,113,234,
+237,116,165,197,177, 54, 82,143,185,194,138,164,184,249, 16,105,241,143, 44,103,208,121, 50,164,146,226,240,182,220,119, 4,235,
+ 37,164, 65,153, 92, 80,137,106, 70,139, 82,125,151,164,197,155, 93,168,123,196,123, 46,150,251, 8,240,252, 17,238, 40, 42,185,
+170,222, 34,155, 80,141, 16,150, 88,230, 75,114,101, 51,130,141,103,113,118,222, 84,228,199,126,232, 95,240,106,136, 16,215,189,
+218, 86,235,201, 53,185, 52,220,146, 81,114, 92,236, 97, 49, 90,112,128, 36,194,166, 1,146,181, 52,236,199,138, 84, 53,147, 85,
+149, 73,182, 92,129, 6,223,109, 81,169,207,198,147, 79,163, 83, 41,232, 5, 82, 81, 29,145,152,108,180,165, 54, 91,134,211,156,
+200,113,210, 18,218, 3,193,103,153, 99, 39,101,145,165, 85,144, 39, 49,211,208,128,187,218,251,146, 58, 53,134,171, 94,215, 4,
+ 88,173,147,175,226,120,170,103,246,122, 6, 21,149, 44, 27, 66,168,189, 44, 37, 67, 23, 6, 68, 33, 36, 54, 58,210, 58,127,236,
+202,171,173,165,149, 12,145, 11, 77, 10,223,167, 90, 47,203,153, 93,154, 39,203,117,178,229, 86,225,153, 22, 43, 10, 90,217, 97,
+108,173,148, 73,109,194,197, 34,138,149,128, 98,176,158, 86, 18,160,180, 32,169,197, 18,171,243, 12, 71,188, 39, 42,174,205, 61,
+ 18, 45, 72,169, 45, 52,144,181, 82, 30,158,238, 86,184,179,219,134,160,218,163, 82,146,160,225,109, 14, 58,219,178, 20, 76,135,
+249, 18, 91,109, 56,227,176, 25,153, 75,137, 81,185,166,184,212, 78, 68,193,165, 81, 33, 56, 20,195, 85, 39, 10, 11, 82,165, 48,
+193, 47, 87,234,137,240,209,202,128,158, 72,168, 70, 91, 66, 74,214,240,187,209,162, 25,147, 29,241, 80,243, 20, 40, 45,185, 21,
+234,107,146, 57,170,243,146,235,172,178,227, 19,125,225,132, 36,196, 91,197, 42, 68,112,151, 28, 82, 94, 80,113,210, 62, 13, 58,
+210,106, 66,183, 75, 35, 17,168,117, 97,109,198,228, 16,111,212,237,190,224, 90,197,113, 23,172,103,117,158,190, 74,182,147, 48,
+ 80, 99,105, 64,211, 10, 1,101,209, 78,168, 99, 38,107,105,141, 52, 17, 20, 68,221,110,162, 55, 14,212, 81, 18,171, 73, 69, 54,
+151, 80,170,193,183,229,135,231, 85, 42,149, 41, 47, 79,143, 80,247, 20, 52,203, 16, 98,229,240,126,168,115,170, 31,125, 39,149,
+208,202, 26, 10, 40,231,230,113,232, 15, 68,139, 87,166, 53, 26, 60,198, 94,122, 51, 68, 71,148,250,148, 25,103, 63,162, 83,229,
+ 41, 41, 99, 37, 69, 44,160, 37, 60,201,103,152,129,206, 20, 27,135, 43, 8,141, 22,153, 2,220,110, 28,171,174,170,134, 89,142,
+153,169, 66, 35,209, 88,108,174, 57,126, 80,125, 99,220, 96,135, 91,113, 92,141,161, 33,199, 27, 75,101, 92,216, 34,241, 2, 53,
+ 62,152,134,101, 34,161, 49,233,206,169,137,117, 56,178,156, 90,231, 45,245,190, 29,112,130,215,199,159, 17, 9,113, 10, 64, 72,
+240,130, 80, 82, 83,212, 76,105, 31,217,222, 25, 64,230,104, 8,110,162,224, 1,102,223, 85,193, 99,246,172,183, 96, 73,103, 47,
+101, 81, 84,230, 84,205, 52, 18,164,134, 72,163,156,202, 35,140,221,164,118, 98, 85,165,150,214,109, 39, 74,162, 72,246, 71,229,
+ 5, 65, 26,139,159,203,207,219, 83,176,204,240,223,237, 79,227, 35,111, 41,204, 69,139, 67,175,238, 80,222, 59, 98, 36, 38,195,
+113,161,208,183,162,149, 7,112,132, 52,182,144, 3,101,170,213,102,182,215, 40,232,148,176,158,221,135, 48, 73, 36,100, 96, 99,
+184, 61,250,246,212,159, 62,150, 45,137, 6,222,246,135,108,254,224, 66, 67,137,123,117, 56, 94,183,220,168,135, 22,209, 74,230,
+ 88, 87,181,215, 66,109,109,161,180, 2,209, 52,250,172, 0,176,165, 45, 68,165, 61, 64, 1, 34, 48, 64,228, 21, 18, 15,251, 56,
+236,115,211, 86, 37, 3,171, 82, 68, 23,236, 70, 90, 53,182,195, 76,108,209,131,111, 66, 22,227,189,136,190,247,199, 60,230, 49,
+152,171,170, 80,253,162,193,143,184,200,162, 66, 62,237, 86,255, 0, 76,120, 41,206, 48,160,113,145,142,217,207,150, 15,125,123,
+ 0,227,148, 14, 92,116, 63,209,247,244,215,220, 39, 25, 35,191, 83,230, 71,159,125, 87,109,178,242,146,134, 70, 92, 87, 96,172,
+ 36, 4,128, 84,165, 45, 71,162, 80, 0, 36,146,112, 0,201,233,173,195,210,228,218,223,187, 26, 93,174,118,199,134, 90,117,213,
+ 33,166,208,167, 28, 90,185, 80,132, 2,165, 40,158,192, 1,174,165,240, 33,236,163,226, 11,141,133,195,187,161,181, 31,108, 54,
+ 57,185,170,102,161,188,215,148, 9, 46,210, 42,138,140,234, 81, 54,157,182,214,243, 78, 53, 39,113, 42,232,234,133, 62,203,140,
+ 81,226,186,164,251,205, 65, 68, 45,141,111,127,178,155,217, 11, 7,117,232,244, 30, 38,184,174,161,203,107,103,231,248, 21,109,
+173,218, 73,190,241, 78,168,239, 51, 13,168,169,155,182,242,228, 90, 36, 81,246,136,186,131,238,144,210, 90,151,113,134,203,171,
+ 91, 20,149, 36,203,150,181, 2, 36, 72,241, 41,180,202,125, 62, 5, 42,149, 74,131, 14,149, 68,162, 82,162, 70,166,209,168,180,
+168,109, 37,152, 52,202, 93, 50, 19, 72, 98,155, 79, 98, 58, 66, 90, 97,150,208,219,105, 24, 66, 83,166, 25,243, 9, 42, 36, 48,
+211, 63, 42, 59,216,200, 44, 75, 90,215, 17,131,112, 7, 91,187, 2, 54,178,171, 92,178, 89,124, 43,192, 18,102, 49, 69,153,103,
+ 74,240,208,200, 3, 69, 2,157, 18, 76,166,196, 60,141,179, 69, 19, 15,178, 22,210, 56, 58,131, 70,186, 89,244,203,132,143,102,
+ 23, 8,220, 37,199,165,207,176,182,222, 37,237,184,240,218, 71,188,239, 38,234, 68,167,221, 55,203,178, 8, 5,199,104, 48,157,
+143,245,101,141, 16,184, 57,155,143, 75,138,210,217, 36,230, 83,228,243,158,151, 69,160,187, 49,126, 36,133, 58,235,129, 35, 46,
+ 60, 86,226,143, 94,131,153, 68,246, 24, 3,200,118,213,202,135, 74,248, 27, 28,132,168,164, 41, 71, 3, 60,167,178,137,239,204,
+123, 15, 64, 52,232,211,232,248, 74, 64, 64, 35, 29, 71,146, 73,235,146,113,212, 96,254,205,107, 90, 40, 75,114,198,159, 86, 38,
+236,109,251, 76, 73, 38,219,253,162,109,208, 91, 22,226, 81, 83,208,192,148,180,116,233, 71, 78,189, 18, 53, 84, 94,219,144,182,
+187, 30,236,110,205,212,155,226, 36,191, 73,131,133,184, 14,237,254,198,241,107, 70,166, 37,170,205, 10,172,246,199,238, 12,230,
+ 90, 72, 51,232,213, 6,101, 92, 59,127, 50,122,210, 50,227,241,167, 51, 87,134,218,213,158, 86,166, 6,193, 0, 1,168,116,169,
+ 41, 33, 39,204,245,237,215, 39,203,251,117,250, 82,251,111,182,226,159,122,123, 47,248,158, 68,212,183,205,103,209,237,109,192,
+166, 56,164,149,248, 53, 59, 98,234,166, 45,165,183,223,145, 74, 98,100,132,103,253, 85,145,219, 95,154,217, 61, 0, 4, 2, 74,
+134, 8, 61, 7, 49,198, 52,227,147, 73,255, 0,165, 66, 15,216,112,195,220, 36, 0,159,222,225,201,223,169,197, 33,199,180,137,
+ 77,196, 45, 34, 0, 5,116, 17, 74, 69,250,190,167,136,155,109, 98,194, 32,222,246, 36,247,192,206,116, 56, 35,174, 1,207,238,
+253,186, 25, 65, 61,243,212,246,243, 7, 26, 53,192, 0,199, 55, 83,220,158,189,254, 95,142,132, 88, 87, 83,128, 65,237,142,152,
+192,193, 56,199,174,159,241, 15,192, 46, 18, 50, 66,124,241,246,227,185,249,232, 98, 58,147,216,252,251, 39,236, 30, 90, 53,207,
+ 47,191, 65, 58, 65,207,175,110,189,250, 16, 14, 52,178,244, 30,252, 20,218,254,159,207,182, 5,112,227, 39,190, 51,142,131, 31,
+120,199, 78,154, 17, 68,242,243, 31,159, 40,251,126,126,154, 37, 72, 61,249,137,198,122,121,118,238,122,245,213, 5,161, 68,100,
+ 16,191, 34,124,135,231,247,232,227,183,207,254, 48,111,134, 5, 42, 36, 16, 71,124,114,231,182, 61,126,122, 29, 68,103, 25,234,
+ 1,232, 6, 0,235,229,162, 84,147,145,215,246,116, 0,106,130,240, 62,121,237,229,142,217,251,124,180,162,141,133,183, 31, 63,
+ 61,177,144, 1, 62,151,192,138, 73, 25,229, 57,201, 57,255, 0,103,240,208,221,251,232,197, 2, 50, 70, 0,235,156, 30,227, 61,
+ 50, 61,116, 50,192, 29,129,245, 39,203,236,252,116,170,117,249,219, 10, 40, 4,116,183,200,197,185,230,249,199, 41, 42,198, 70,
+ 82, 58,103, 25,238, 71,150,116, 51,141,184, 1,235,202, 2,112,144, 0, 36,143,159,167,158,174, 42, 0, 30,132,158,249,207,174,
+132,121,178,164,158, 85,169, 7, 39, 24,254,119,219,234, 51,165,176,110,158,235,226,222, 82,148,255, 0,148, 36,147,212, 99,211,
+208,244,239,165,175, 69,181,182, 0, 82,148,225, 61, 73,192,233,242,239,165,161, 99,233,140,227,210, 7, 92,249, 15,233,252,157,
+ 20,130, 49,129,223,185,251,245, 65, 32,224, 12,117,234, 63, 19,255, 0, 13, 86, 64,238,124,199, 76,122,104, 96, 96,148,167, 3,
+175, 66,127, 28,126,227,253, 90,168,210, 0,200, 56, 61,207, 79,158, 58,231,243,223, 84,210, 73,233,142,131,166,126,239,219,162,
+ 91, 73, 57,233,223,215,207,166,147,112, 55, 61,255, 0,241,129,143, 96,121,224,159,199,161,251,180, 91, 63, 23,113,203,215, 25,
+238,123, 13, 83,109, 35,160,235,215,175,223,141, 18,148,131,208,116,233,158,223,102,147,193, 77,141,238,118,193, 72, 79,216,122,
+118,249,250,227,203,207, 85,146, 1, 56, 61, 61, 49,251, 7,109, 14,216,230,198,125, 50,122, 99, 68,160, 2, 64,198,125, 63,225,
+164, 90,192,144, 62,122, 97, 28, 86, 29, 14, 58,140,121,159, 62,158,186,218,174, 11,120,121,159,197, 23, 18,123, 87,179,145,130,
+147, 79,185,110, 40,206,220,178, 66, 73, 76, 27, 74,150,164,207,184,229,172,143,213, 6,158,202,219, 7,253,105, 35, 90,172, 1,
+206,113,144, 59,143,159,245,234, 71,254,193,173,178, 98,146,141,245,226, 34,165, 22, 63,188, 82,169,144,118,234,211,150,250, 66,
+158, 98, 93, 83, 19,235,142, 70,200,253, 26,253,223,221, 91, 42, 24, 61,198,152, 56,151, 50, 57, 86, 77, 91, 84,173,166, 80,186,
+ 80,142,161,155,107,143,122,130, 91,254,220, 76, 56, 7,134, 79, 24,113,142, 65,195,218, 75, 67, 95, 58,243,173,255, 0, 2, 48,
+101,152, 92,116,213, 26, 20, 7,179, 48,196,149,103,214, 45,203,102,139, 77,179,109,136,172, 83,237,139, 54,149, 2,215,182,224,
+ 65, 9,106, 37, 62,145, 72,142,136, 76,165, 49,147,211, 5, 45,100,145,212,231, 39, 86,118,235, 42,143,200,227, 47, 37,210,234,
+ 18, 24, 83,124,167, 5,120, 37, 7, 39,169, 39, 31,142,154, 22,235,241,228,173,213, 7, 98,188,149,229,164,178,233,228, 89, 82,
+186, 30,101,122, 21,107, 39,167, 33,181,182,204, 85, 70,113,109, 7, 2,195,161,204,169,167, 50, 20, 18,130, 15,196, 61, 53,201,
+ 85,114,187,206,236,205,119,148,147,111,221,239,252,122, 91,240,246,231,132, 50, 26, 12,191, 43,166,165,142, 30, 84, 80,168, 93,
+ 32, 13, 58, 85, 84,105,177,176, 1,109,176, 91, 3,211, 99,135,136,196,145, 38, 52,105,210, 76,121, 79,186, 10, 76,117,169, 45,
+200, 65, 31,170,160, 65,233,140,104,132,199, 66,144,161, 62, 50,221,107,148,150,150,164,248,168,109, 67, 33, 74, 86, 6, 71,200,
+131,160, 41,209,224, 56, 99,202,116, 72, 15, 50,217, 66,222,125, 75, 64,192, 24, 0,163,205, 35,215,229,172,162, 35,108, 56,218,
+125,222,104, 97,121,193, 42, 81,113, 50, 18,162, 73, 1,181,118, 3, 58, 69,199,148,148, 66,227,107,244,216,237,190,219,127, 28,
+ 18,170, 83, 9, 43,230,178, 30,161, 74, 4,185, 54, 11,164,181,128, 27, 95, 77,200, 59,139, 97, 81,169,202,247,134,228, 67, 90,
+ 39, 71, 36, 55, 34, 19,199, 15, 6,193, 24, 91, 89,234,160, 7,109, 86,220,221,191, 69, 90, 85,181,115, 68, 96, 46, 68, 6,140,
+ 7,138,147,149,150, 82,160,166,208,188,140,168, 39, 39, 25,242,233,167, 58,137, 71,166,201,142,194,201,142,212,216,196, 6,229,
+ 50,121, 11,153, 61, 65, 3,161,199,207, 78,207,240,125,201,244,162,195,141,165,106, 65, 67,236,188,216,248, 92, 90, 48, 74, 84,
+ 7, 98, 83,144,126,221,106,152,228,100,145, 44, 64,101, 22,223,184,183, 79,141,173,235, 98,111,138,187,136,120,137, 99,171,130,
+101, 58, 30, 38,100,109, 86, 82,202,195, 78,228, 88, 56, 32,141,236,172, 58, 16,109,124, 91,182, 90,193,101,183,152, 82, 35,165,
+ 30,248,200,113, 65, 41, 9, 79,140, 82, 57,198, 49,211,152,245,251, 78,155,223,104, 77, 33,251, 91,135,122,140,200,202, 44, 42,
+ 69,199, 77,109, 75, 9, 39,197,247,120, 85, 7, 27,105,208, 6, 86,128,176,147,145,219,151, 56, 58,220,141,174,167, 53, 29,232,
+216, 70, 58, 14,152,232,133,143,214, 72, 31,205, 26, 97,253,170,148,143, 23,133, 86,229, 70, 46,101,187,202, 15, 56,105, 57, 89,
+ 75,148,154,162, 84, 79, 78,191,171,143, 92,159, 93, 75, 50, 90,104,205, 42,203,166,242, 70,111,241,189,135,243,239,235,142,124,
+204,184,154,105,248,255, 0, 33,161,119,211, 75, 85, 83, 4,100,118,176,147, 86,254,237,133,254, 24,136, 5, 65,227, 38, 82,145,
+202,226, 39, 41,110,184,151,185,156,241, 27, 46, 17,149,180,210, 23,200,250, 75,169,109, 32, 45, 42, 64,235,207,202,174,244,225,
+ 84,213, 6, 69, 67,223,225,189, 84,158,167,131,113,207,129, 29,150,216,138, 80,148,182,153,212,240,151, 19, 0,248,133,126,240,
+180,243,120,152, 79,110,128, 7, 61,166, 95, 74, 93, 83,147, 93,247,105, 92,175, 73,101,190, 69, 71,105, 74,202,153, 10,108,130,
+212,142,100,163, 40, 88,230, 36,130,160, 83,202, 52, 77, 26, 68,232,229, 30, 27, 79,123,184, 37, 79,205,166,196,101, 85,116,182,
+ 73, 71, 35,108, 72, 90, 68,166,220, 46, 4, 56,180, 23, 84,209, 5, 97, 7, 3,149,225,214,234,123,129,216,253,221,239,113,176,
+ 23, 3,174,219, 95,167,161,116,245, 3,200,177,221,159,162,132,176, 97,182,229, 73, 27,128, 53, 11,223,179, 1,176, 39, 14, 61,
+179,110, 49, 87, 92,138,164, 73,146,233,178,165,150, 16,227, 84, 69, 42, 50, 94,109, 10, 71, 71, 96,168, 22, 37,159,133,105, 75,
+193, 9, 83,132,168, 41, 95, 14,158, 74, 45, 26,235,147, 34, 76,184,244,134,171, 40,104,204, 83,146, 41,175, 68,162, 76,140, 26,
+117, 76,161, 51,233,207, 31, 0,115,161,149,165, 62, 10,135, 57, 87,234, 12,157, 54,148,138,123, 5, 81,133,159, 38,108, 39, 22,
+195,242,231, 68, 66,152,157, 2, 68,128,208, 83,174, 57, 5,247, 3,144, 18,140,142,105, 41, 91,107, 89, 89, 79,134, 84,158,109,
+108,157,156,170,253, 2, 24,110, 77, 1, 74, 65,106, 28,151,106, 52, 57, 77,206,132,236,118,255, 0, 72,150,159,167,169, 41,148,
+219,202,116, 37,124,170,241, 18,165, 16, 50, 10,136,212,110,190, 89, 0,102, 91, 57, 54, 10,173, 96,125, 45,246,150,247,176,217,
+ 88,139,245,185,184,195,137,205,164,100, 34,153, 99,169,146, 43, 14, 92,202, 82, 66,118,230,106, 62, 73, 25, 71, 75,134,111, 41,
+ 23, 70, 4, 1,238,148,138, 91, 79,179, 2,163, 42,161,107, 43,221,217,145, 13, 23, 52, 5,211, 28, 76,196,148,190, 35,243,188,
+223,129, 37,188,163,195,105,198, 94, 1,193,212, 37, 68,105,199,141,108,212,103, 60,153,146,233, 80,100,164, 73,113, 42,158,134,
+163,128, 66,210,128,223, 59,193,178, 90, 87, 40, 29, 82, 74,185, 79, 84,231,174,179,235, 33,170, 93, 82, 77, 65,154,147, 17, 46,
+ 76,178,176, 41, 85, 40,140, 45,104,144,248, 64, 74, 13, 62,115,105,115, 41,101, 46,164,185,225,171,144, 31,132,142,153,120,104,
+155, 91,103, 58,196,127,118,165, 59,108,201,150,211, 50,140,139, 86,167, 83,165,188,209, 10, 66, 17, 17,112, 22,243,140, 60, 16,
+ 72, 81,231, 97,105,115,147,153, 93,245, 22,146,172,134,180,138,209, 72, 58,244, 55,189,174, 71,217, 35,212,143, 54,251,139, 30,
+173,181,252,117, 14, 86,239, 28,240, 77, 72,225, 81,117, 42, 44,182, 50, 45,220,171, 22,130, 84,251, 42, 72, 28,237, 90, 65, 85,
+ 58, 66,227, 1,178,236,216, 17,129,148,194,170,116,121,146, 79,188, 38, 93, 38, 95,133, 10, 82,217, 78, 91, 18, 24,229,114, 60,
+196,167,194, 87,134, 28,105, 10,115,149, 65, 71, 7, 26,218,107,126,109, 90, 10,162,154,132,152, 21, 33, 32, 55,133, 48,201,165,
+212, 26, 80, 33, 63, 20,102,159,113,167,222, 82, 65, 82,130, 11,105, 73, 39,225,199, 46,172,180, 45,177,175,198,113,230,233,151,
+117, 62,124, 98,178,148,183, 92,183,144,196,137, 9, 81,248,202,103, 82, 28, 65,109, 73,194,146, 20, 24,229, 74,149,158, 83,170,
+151,157, 90, 22,218, 91,117,139,187,113, 17, 73,181,172,155, 85,134,101,215,110,181,213, 99,253, 77, 72, 98, 68,134,161, 70, 15,
+171,149, 18, 12,199,165, 63, 30, 59, 44, 48,211,146,228, 58,240, 75, 8,112,149, 16,164, 80,243, 60,247, 50, 62,199,125,199,193,
+ 73, 23,219, 99,125,143, 82, 0,239, 80,241, 39, 21, 71,196,149,209, 83, 82,212,174,107, 81, 80,226, 56,226, 80,230,162, 70,147,
+234,226,138, 33, 50, 71, 80,238,238, 21, 99,138, 13,122,152,170,128,194,195, 15, 28,122,147,162, 40,105,244, 58,132, 37,223, 18,
+ 3,231,194,234,242, 86, 28,114, 59,165, 43, 30, 26,249,214,164,228,128,219,188,202,202,185,192,213,242, 37, 81,151, 30,143, 37,
+197, 57,226, 48, 3, 43, 43, 9, 11, 44,184,174,102,157, 83, 95,206, 90, 22, 66, 70, 64,200, 86,124,137, 13, 21,189,112, 82, 46,
+ 11,114,151,114, 91,117,216,119, 21,175,113, 83, 33, 86,232,117,120,238,174, 76,106,173, 26, 82, 67,145,101, 66,125,192, 11,141,
+ 45, 4,130,146,128,164, 41, 37,183, 57, 92, 66,210, 3,147,114,251,147,205, 46, 54, 83,202,178, 2, 20,226, 80,132,161, 96,169,
+ 73, 10, 36,120,173,129,204,140,147,204, 20, 64,198, 59,150,162, 37,117, 42, 5,134,194,253,108, 65,216,110,125, 71, 75, 11,250,
+ 92,139, 85, 45, 11, 75, 83, 85, 72,209,180, 51,196,206,140,172, 25, 25, 24, 29, 14,146, 35, 0,209,184, 32,134, 82, 46, 24, 18,
+ 55, 26, 78,240, 90,213, 31,208,130, 86, 9, 4, 18,130, 72, 73,229, 80, 42,230,108,126,177,199, 46,112, 65, 25,207, 93, 58,209,
+ 39,130, 16,145,159,214, 81, 60,157, 65,194, 72, 0,114,156,158,128, 96, 14,165, 71, 30,128,234, 46,217,220,212,153,116,202,237,
+193,112,215,105,214,197,177,108, 64,126,171, 91,175,213, 37,166, 53, 46,151, 79,136, 18,100, 76,145, 41, 67,244, 76, 39, 45,163,
+148, 5, 41,199, 22,134,154, 11, 82,210,147,121,177, 56,210,225,140,221, 20,202, 80,185, 43,180,231, 43, 85, 4,209,236,251,142,
+240,181,165,219, 54,109,110,224,123,244, 52,198,233,213,121,111, 56,150,164,191, 39, 34, 8,154,220, 70,223,145,203,133,133,114,
+ 37, 82, 44,159, 40,174,158,140, 87,178, 8,168, 83,237, 72, 72, 38,202, 69,200, 91,220,219, 97,125,133,250,145,136, 77,103, 11,
+113, 14, 98,249,179,100,188, 59, 93,159, 12,160, 94,161,169,105,165,154, 56,137, 78, 96, 87,150, 53,100, 83,203, 28,198, 91,150,
+ 88,129,148,174,133, 36,110,229,114, 79,128,205, 58,148,133, 31, 26, 20,100, 59, 45, 60,196,132,212, 39, 20,202,122, 50, 84, 70,
+ 84, 27, 10,142,218,188,129,109, 73,206, 70, 5,137,201, 14, 46, 63, 35,110,172, 30, 98,236,137, 60,136, 43, 66,208, 65, 73, 5,
+196,225,111,114,171,166, 73,229, 9, 25,193, 3, 88, 95,215,200,158,183, 30, 67,206, 41, 43,116,248,202,117,107,231, 82,249,143,
+ 62, 86,165,101, 75, 43, 42,230, 4, 2, 9, 87, 55,198, 14,178, 38, 92, 98, 67, 32, 20,251,201, 8, 88,240, 16,146,164, 41, 67,
+178,192, 65,194,147,145,216,231, 10,198,125,116,226,139,237, 51,153,109,101,216, 45,137,176, 85, 0, 40, 38,219,249, 64,243, 91,
+246,186, 2, 70, 32,113, 80,251, 44, 81, 44,131, 83,130, 89,141,129,187, 49,212,196,131,181,139, 18, 64, 38,192, 90,228,140, 52,
+ 23, 71, 18,155, 27,182,247,133, 23,109,175,221,230,219,141,180,184,238, 72,209,228,209,169,247,213,194,220, 10,181, 86, 20,201,
+ 78, 65,135, 62, 60,103,163,251,172, 38, 37, 75,102, 75, 81,164,214, 36, 66,142,250,153, 91,141,169,214,146, 84,119, 30,147, 66,
+165, 80,195,147, 41,232, 38,166,235,108, 25,149,121, 74, 76,250,173, 65, 50, 26, 67,141,184, 37,252, 94, 36, 34,194,208,182,218,
+140, 81, 20,180, 82, 89, 10,109, 73, 89,131, 15,180, 99,113, 31,190,120,217,226,105,247, 21, 37, 48,237,189,193,122,201,132,220,
+231, 27, 90,216,183,172, 58, 52, 11, 98, 37, 40,182,149, 41, 9,140,210,225,202, 12,167,155,149,105,150,162,177,158,154,222,143,
+101, 55,180,158,109,129,120, 91, 92, 38,241, 1,118, 84,165,108,197,201, 83,133, 67,218, 59,194,177, 84,117, 3,105,238, 58,130,
+145, 22,145,102,215, 42, 78,168,190, 54,130,167, 53,198, 99,180,128,239,129, 65,155, 33,153, 40, 74, 41,207, 76, 66, 18,163,204,
+ 18,106,169,105,103,136, 44,113,146,169, 37,205,135,152, 11, 55, 64, 21,137,251, 98,218, 65, 1,129, 26,156,119,103,137,223, 65,
+ 12,230,155,192,222, 23,241, 67,129,120,142,163, 57,207,166,202,105,115, 92,243, 34,120, 80,201, 36, 83,210, 71, 89, 57,203, 94,
+ 45, 47, 81, 37, 18,146,173, 69, 62,179, 89,161,231,164,145, 39, 16,209, 79, 40,202,229,206,203, 50, 92,167,210,208,107, 18,249,
+ 17,239,226, 44,119,234, 17,224,182,163,206,183, 36, 8,104, 87,141, 37, 68, 5, 37,149,169, 33,190,156,196,116, 73, 21, 52,233,
+ 79,123,195,137,167, 34,158,186,130, 89,101,234,213, 77, 81,234, 87, 35, 64,168, 41,152,136,167, 35, 45,198,233,144,132,186,180,
+161,158,159,161, 42, 57,214,118,211,109, 82,144, 99,162, 60,122,107, 81,146,184,210, 98, 6,209, 25, 12,173,165,168, 41,185, 13,
+180,145,149,165,224,224, 89, 57, 61,193, 61, 53,141, 63,114, 33,233, 11, 85, 22, 2,170, 6, 42, 84,212,185, 46,120, 80,168,201,
+117, 77,148,182, 88,156,160,181, 73,125, 4,163, 41,105, 11, 32, 40,146,226, 20, 64,212,177, 40,249,104,218,136, 93, 29, 1,247,
+238, 71,235, 92,237,232, 58, 18, 54,181,252,231,165,168, 98,130, 44,186,134,201, 24, 5,166,121, 54, 99,112, 87, 94,233, 10,130,
+202,186, 81,249,136, 78,144,193,201, 44, 84,122, 5, 38, 28, 86,234,113,156,144,169,205,161,212, 57, 82,170,201, 76,201, 45, 60,
+163,153,137,113,197,182,159,113,143,202,130, 20,219, 0, 33, 33, 33, 36,173, 0,232, 37,215, 92,148,250,153,181,195,113, 24,204,
+ 83,252, 40,144,178,220,218,116,212, 96,205, 77,188,203,169,196,146,181,168, 6,221,112, 41,150,139,220,205,165, 69, 32,139, 44,
+136,107,113,106,122,179, 49,215,100, 48,241,113, 20,248,234,113,186,107, 6, 70, 20,166,155,136, 28,230,125, 10, 89, 0,151, 66,
+148,164,164,149, 30,184, 24,253,199,122, 66,165, 47,234,152,208, 81, 88,170, 60,133,169,134,151, 37, 17, 89,142,182,144,160,195,
+138,116, 16,184,175,115,146, 26,228, 35,152, 2,144, 10, 70,182, 97, 64, 14,163,229,113,223,173,246,245,220,141,236, 46,119,233,
+208,144,112,239, 75,150, 79, 93, 50,162,150,205,103,109, 68,106,254,230, 52,186,181,201,144,170,200,168, 55, 28,194,177, 0, 89,
+ 74, 58, 49,195,130,197, 46,151, 71,143, 89,156,136, 50, 16,226,147,239, 45,220,146,230, 75, 91,181, 22,228,134, 85, 46, 53, 65,
+ 42,116,169,215, 27, 81,116, 21,143,136, 56,176, 83,223, 69,209,101,194,118,104,120,212,188,105, 41,116,182,242, 25, 83,206,149,
+ 54,218,214,160,181,186,242,194,131,168,108,182, 83,205,250,200,108, 3,147,240,233,134,126, 83,142,181, 21,235,160,213, 20,137,
+105,109,136,245, 1, 33,149, 69,131, 86, 73, 74,228,162, 18,225, 47,194, 98, 66,176,143,133,208, 29, 73, 36,133, 44,128, 52,237,
+ 91, 17,157, 91,145, 84,244,169,143,180,227, 68, 21, 75,109,133,243, 33,111,129, 20, 74,114, 56,241, 39,182, 84,174, 82, 70, 20,
+165,173, 69, 57,239,167,120,101, 42,241,198, 6,146, 55,181,138,219,126,164, 14,187, 16, 5,245, 16, 5,201, 45,115,133, 51, 76,
+165,169, 40,229,154,170,189,170,102,150,227, 88, 37,145,130, 42,169, 88,221,140,154,183, 83,169, 71, 40, 43,236,138, 6,155,195,
+227,233,107,174,155, 39,136,190, 10, 30, 97,107,118,164, 56,127,220, 70,158,146,160, 16,217,132,155,246,143,200,210,154, 35,155,
+222, 4,191,120, 37, 71, 9, 82, 86, 10, 64,235,168,152,132,228, 28,164,164, 19,215,231,143, 77, 73,155,233, 79, 95,204, 87,248,
+240,217,189,185, 66,217,147, 47,105,120,111,164,154,148,182,157, 83,138,126, 70,226,221,245,186,220, 86,150,133,146, 80,148, 83,
+104,144,212,158,249, 18,186,147,129,168,234,237,246,223,222, 27,165,119,219,150, 21,133,110, 86,174,219,186,237,172, 68,160, 91,
+118,213,189, 79,122,169, 91,174, 86, 39, 44, 34, 53, 58,153, 1,128, 75,239, 43,226, 82,212, 74, 91,101,180, 45,231,150,219, 72,
+ 90,211, 98,229, 79,202,203,150, 89, 92, 34,171, 76, 88,147,176, 28,199, 55,185,216, 11,111,185,252, 49,198, 60, 76,139,250,126,
+189, 32, 28,197,102,132, 46,145,114,196,195, 16, 0, 0, 1, 44, 73,181,128, 4,182,214, 7,108, 96,193, 42, 89, 72, 66,114, 71,
+100,165, 36,149, 99,176, 0,119, 58,237,167,177,211,217,215, 3,138,221,197,169,239, 54,241,210, 85, 43,135, 45,155,171,194, 77,
+122,148,248, 83,108,110,166,227, 37, 13, 84,169, 27, 94,149,140, 21,219,145, 99, 42, 44,251,145, 77,156,169,135,162, 82,185,144,
+185,207, 4,246, 39,129,175,163,187,181, 22, 69, 46,141,184, 92,116,214,164,223, 87,121,101,186,140,141,132,177,171,110,211,108,
+ 90, 17, 41, 14, 34,153,125,223, 20,181,162,117,229, 60, 3,201, 42, 45, 53,216, 84,224,161,200,151,229, 4,149, 43,177, 76, 91,
+ 27,113,181,244, 24,150, 14,210, 88, 54,166,216,237,189,188,185, 31, 81,216,214, 37, 26, 21, 6,221,166, 25,110,243, 75,144,204,
+ 24,141,132,174,107,238,225,201, 18, 29, 43,126, 67,129, 42,121,215, 23,130, 27,243, 44,205,164,167, 43, 26, 24,161, 39,118, 99,
+165,220,118, 10,191,105, 84,157,152,182,150,181,202,117, 86, 19,158, 18,240,238,182,106,218, 90,236,242, 5,138,150, 59, 56,166,
+ 62,103,145,133,180, 9, 71,217, 84,185, 12,200, 75, 22,182,135, 80, 11, 12,100, 74,154,169,242,176,132, 54,203,109, 54,195, 44,
+ 71,140,203, 81,226, 70,137, 29,164,179, 10, 4, 72,236,165, 45,195,134,212,102, 91, 75,109,182,148,182,219, 76,161, 8, 74, 80,
+ 18,144,232, 90,112, 2,249, 93,117, 25, 66,146,209, 71, 66, 22,162,163,134,241,211,245,150,177,159,152, 58,106,104,113, 92, 82,
+188, 39, 22, 57,159,117,107,144,172,114,134,208,144, 20,235, 77,249,242, 37, 62, 27, 96,249,156,159,144,217, 59, 62,158, 23, 33,
+162,160,146, 26, 67, 60,168,236,129, 33,209,134,130,134, 48, 2, 26, 35, 31, 51,211, 77,180, 46,116, 52,199,224, 54,176, 30,128,
+ 14,214, 29,134,219,219, 98, 14, 47,113, 78, 21, 72, 3, 87,123,254,238,135,222,126,240, 59, 91, 14,157, 22,158, 26,105,164,172,
+ 5,168, 4,243,159,213,231,121,125,145,208, 99, 30, 93, 60,129,211,139, 26, 35,109, 54, 49,133, 17,220, 16, 79, 83,232, 60,250,
+246, 31,187, 86,138,100, 68,165, 73, 8,229, 81,142, 64, 42, 86,112,183, 22,144, 21,130, 15, 85, 36, 19,242, 28,218,203,218, 78,
+ 49,240,169, 41, 70, 66, 74,122,165, 68,142,170,207,160, 57, 72,251,254, 88,216, 14, 90,230,251, 15,244,249,254,125, 48,211, 87,
+166, 54,210, 5,205,133,251,123,192,239,235,247, 3,211, 99,142, 83,123,105,234,144, 40, 62,204, 78, 45,213, 56,172, 10,158,223,
+193,161, 68,109,166,214,234,222,168,213,110,106, 44,120, 49,210,219,105,230, 42, 83,161,103,253,144,131,228, 53,249,148, 74,163,
+ 86, 33,178, 31,157, 73,168, 68, 97, 73, 37, 15, 75,136,244,102,150,130,114, 10, 29,117,176,149,119,242, 39, 7,166,117,250,228,
+239, 21, 54,139,113, 81,162, 91, 21,234, 77, 58,187, 2,167, 53,185, 83, 41, 53,168, 81, 42,144, 36, 71,167, 16,227,102, 68, 9,
+141, 45,167,146, 37,173,178,146,164,171, 5, 25,232, 70,154, 39,182,131,105, 43,148,145, 68,173,237, 86,217, 86,168,230, 58,226,
+138, 93, 86,195,181,102,211,147, 24,131,204,194, 99,191, 75, 41,109,188, 19,219,175, 94,132, 30,186,205, 29,108,244,181, 21, 13,
+ 12,113,200,178,104, 7, 83, 48, 55, 91,237,178,176,177,213,114,119, 55,218,198,215,196, 43,137,120, 6,163,136,230,167,205,151,
+ 49, 90, 53, 72, 22, 32,134, 2,250,180,203, 43,106, 45,205, 75, 41, 46, 64,178,159,179,125,239,183,228,250,227,101, 60,188,224,
+140,142,128,244,207,144,199,168,198, 48,126,122, 21,192, 0, 3,155, 35, 57,233,215,215,166,191, 65, 78, 47,125,129,220, 19,241,
+ 21, 2,167, 90,218,170, 35,252, 48,110, 99,233,144,252, 74,205,131, 29,202,134,222,212,103,172, 18,132, 92, 59,119, 53,242,134,
+ 99, 45,220,115, 59, 76,122, 43,169, 25, 41,109, 88,229, 48,230,227,131,217,183,196,255, 0, 1,119, 35,112,119,146,205, 19,108,
+ 74,180,247, 33,217,251,193,104,151,171, 59,105,118,144,165,248, 44, 49, 88, 13, 5,219,245,162,132,229, 84,234,138, 35,202, 73,
+200,108, 58,145,204,100,244,217,164, 82,178,199, 50, 26,105, 9, 0, 92,221, 24,250, 43,250,158,193,130,177,236,164, 11,226,164,
+206,184, 91, 56,200, 65,146,174, 1, 45, 32,219,159, 17, 47, 24,222,195, 93,194,188,123,216, 93,212, 33, 36, 42,187, 28,115,229,
+210,158,163,169, 24, 62, 96,119,253,255, 0,215,160,212, 66,187,167, 24,232, 58,249,116,198, 49,219,174,141,117, 3,152,133,229,
+ 39, 56, 41,199, 80,122,227, 65,120, 97,165,169, 73,201, 43,238, 14, 79, 41,235,146, 61, 52,244, 14,192, 1,182, 35,160, 31, 92,
+ 14,231, 32, 73, 74,186,231,203, 24,251,137,244,208,101, 3,148, 32, 40,165, 57,236, 60,201,209,133, 63, 26,186,168,231,201, 71,
+225, 29,187,121, 13, 81, 86, 50,122, 16,115,246, 12,124,177,163,142,222,236,103, 3, 40, 3,211, 29,186, 30,189,241,215, 57,208,
+203, 24, 36, 15, 67,140,252,199,207,203, 69, 47,208,103,166,115,229,147,129,215, 62,186, 25, 64,244,230, 29,124,143,175,113,215,
+212,233, 85,189,129,245,235,243,240,198, 69,172,126,125, 48, 42,129,193, 30,127,147,161, 85,246,156, 17,215,204, 2, 8,199,217,
+162,148, 58,146, 20,122,103,207,167,159, 83,161, 92, 42,235,233,230, 71,159, 95,232,210,139,215,173,176,170,143, 95,157,176, 50,
+206, 15, 76, 31, 80, 71,224,126,220,104, 85,168,227, 28,189,125, 61,126,206,154, 37,100,103, 3,200,156,244,243,249,232,117,227,
+ 57,235,233,242,251,180,182, 50,126, 54, 56, 25, 99,175,159, 81,231,229,242,210,215,178,172,119,200,244,198, 14,127, 31, 61, 45,
+ 40, 47, 97,229,191,200,255, 0, 79,155,224,126, 56,162,144, 64, 30,191,143,158,170,163, 62,125,137,232,115,220,250,106,159,236,
+213, 69, 35,156,131,204, 71,166, 63, 63,156,233, 54,219,160,220, 99, 35,227,108, 20,131,208, 14,228,121, 99,231,251,116, 80, 56,
+ 35,184,249,250,104, 22, 57,146, 8, 81,234, 59, 31, 80, 60,243,247,232,209,216,117,207,207, 68,223, 77,200,244,254, 88, 24, 45,
+ 24,207, 92,231,203, 69, 35,207,183,239,208,173,124,207, 92,126,127,118,138, 64,232, 79,221,249,252,249,105, 44, 16,142,190,251,
+ 15,145,130, 80, 58,103,215,250,244, 66, 49,140,129,215,212,247,207,245,106,146, 48, 57, 79,150, 7,252,116, 64,193,232, 49,223,
+ 31, 97,210, 44, 79, 91,236,127,211,253, 48,153,183, 97,138,128, 40, 5,103,208,224,119,235,169,123,123, 41,104,112,173, 78, 2,
+173,121, 73,134,167,220,191,111,139,158,183, 80,116, 97, 14, 1, 26, 65,131, 29, 41,199,146, 91,142, 0, 58,136,106, 65,193, 4,
+140,224,156,227,211,175, 77, 75,111,217,163,113,199,172,240, 9,183,233,105,231,146,187, 86,241,187, 45,249,133,131,143, 9,213,
+ 78,114, 75, 97,196,121, 2,219,168, 32,158,224,244,213,121,226, 65,147,244, 28, 33, 13,148,206,186,191,254, 57, 45,142,131,250,
+ 49, 71, 12,158, 42,209,137,118,101,162,169, 41,214,225,249,148,226,226,196, 27,233, 45,211,181,251, 99,118,128, 83,114,214,210,
+153,146,220,116,144,235,125, 10,212,129,205,144, 20,161,156,249,105,224,180,100,161, 50, 35, 25,130, 74, 80, 57, 85,206, 20,176,
+ 26,230,198, 22,164, 30,253,198,153, 40,181, 49,238,232, 92,122,195, 47, 73, 82,210,211, 81,100, 39,149,110,184,178, 82,218, 1,
+ 61,252,180,248,219,242,107, 80,222,162, 71,155, 77, 98,169, 61,192,124,102, 35, 56,130, 91,108,254,170, 94, 72,254,110, 58,245,
+215, 54,213, 70,193,217,152,217,148,130,111,182,219,117,233,112,127, 28,123, 9,151,215,172, 84,113,194,236,164,181,215,237,232,
+114,116,222,246,144, 11,142,228,222,194,248,216, 58, 84,210,135, 89,145,227, 49, 81,108,184, 26, 12,189,132,132,180,123, 21,146,
+ 58,249,103, 78, 29, 49,216,145,157, 46,202,141, 0, 50,165, 99,153,162,151, 0, 10,255, 0, 80, 14,216,207, 93, 55, 22,253, 58,
+116,249, 14,180,186, 68,194,162,227,110, 41, 40,100, 22,154, 72,236,208, 41,238, 63,167, 78,237, 50,222,105,197, 50,210,160,203,
+ 5, 43,248,209,238,139, 82, 16,172,254,170, 84, 6, 15, 64,123,246,209, 97,137,100, 58,121,100, 21, 38,219,129,125,253,251,159,
+203,124, 66, 51,202,138, 53, 13,169,202,221,119, 10,203,112,189, 71,216, 96, 1, 27,139,233,177,239,124, 60, 54,123, 86,252,196,
+161, 45,162, 50,155,229, 7,170, 74, 10,129,238, 6, 71,112,116,252,211,104,240,209, 29, 41,140,174, 68, 20,228, 53,207,204,217,
+ 24,234, 19,232,174,250,105,109, 74, 83,112,209, 24, 57, 24, 70, 14, 44, 8,200,152, 24,136,167,206,112,124, 36,200, 90, 75,189,
+ 71,243,115,233,167,174,148,195,204, 73,247,101,182,182, 20,172, 18,219,237, 41, 33, 67,200,161, 67,203,168,237,167,136,114,230,
+101,187, 11,252, 13,192,191, 66,125,255, 0,150, 57,147,139,234,195, 84,202, 96,169,114,138, 75, 0,206, 26,224,108, 77,134,219,
+119, 54,216,237,113,131,109,233, 2,149, 48,165, 68,165, 30, 38, 65, 7,177,206, 58, 19,172, 11,142,250,104,187,248, 72,189,156,
+100,243,201,160,212,173,234,211, 33, 37, 75, 0, 55, 52,196,120,156,116, 8,228,153,212,158,131, 26,214,142, 52, 56,200,162,240,
+178,104,182,149, 18,205,170,110, 30,239, 93,144, 68,251,106,214,167,179, 37,200,145,162, 56,240,138,204,250,159,186, 52,167, 29,
+ 74,229, 97, 13,180,210, 74,150, 65,201, 72, 25,215, 24,110,255, 0,109,214,236, 89,181,169,123, 63,196,206,212,209,225,216,219,
+139, 33, 54,133,121,152,140,200,163, 86,236,207,172, 95, 67, 44,213, 92, 50, 29, 90, 28,247, 39,220,142,243,241,228,161, 37,109,
+ 48,160, 22,133, 16,160,237,150,210, 77, 74, 30, 57, 24, 4,148, 29, 42, 55,123,122,233, 0,155, 3,252,176,190, 77,224,151, 30,
+113,173, 21, 7, 27,228,116, 52,241,195,151,149,172,136, 84,213,193, 77, 53, 92, 16, 72,162, 73, 41,163,149,129,100, 44, 12,107,
+ 36,134, 56,222, 75, 34,185, 39, 28,240,171, 81, 92, 18,235, 15,189, 50, 83, 15,182,251,205,242,193, 1,135, 11,172,188,227,129,
+215, 90,116, 41, 15,167,152, 55,128,160,127, 87,190,113,171,197,186,251, 84,199, 27,110,231, 91, 11, 8,109,105,102,164,211,204,
+152, 75, 4,120,205, 50,166, 93, 67,142, 51, 33,194, 84,147,146,190, 85, 0, 82,178, 59,103,187,207, 96, 84,168,155,135, 92,164,
+148,251,168,139, 80,118, 74,101, 49,206,195,115, 26, 83,165,196,200, 97,164,164,165, 44,172,160, 41, 39, 56, 83,110, 36,144, 0,
+213, 45,183,165,251,180,225, 57,214, 41,211,231, 46, 59,134, 32,155, 57,137, 75, 47, 56,165, 48,251,207, 7, 20,216, 97,211,207,
+ 28, 22,210,121,212,147,204,148,242,228,105,122,137, 21, 98, 46,198,247, 22, 0, 1,112,118, 0, 3,218,222,150,216,220,157,247,
+199, 91,101, 89,173, 61, 78, 87, 77, 84, 36, 38, 42,136, 21,215, 65,180,182, 96, 28, 89,154,203,123,157,181, 30,246, 5,126,214,
+ 30, 11, 94,207,114,229,117,201,237, 69,164,202,120,197,143, 54, 85, 82,157, 37,183,147, 22, 59,235,108, 65,134,165, 70,194,224,
+ 61,226, 33, 45,144,231, 55, 47,196,226,209,149,116,219,107, 39,110,107,207,161,154, 43, 53, 69,192,105,220, 59, 45, 51,224, 51,
+ 86, 64,151,226,135,152,104,200, 64, 67,211, 90, 7, 24, 74, 94, 41,111, 9,230, 0,233,156,176,182,201, 77,169, 18,170,137,115,
+223, 42,193,152,112, 99, 91,243,158,143, 35,199, 74,144,226, 36, 74,147, 13,192,137,144, 80,224, 4,151, 2,137, 82,194, 64, 37,
+ 56, 27,217,102, 90,215,133, 41, 49, 27,133, 84, 98,165, 57,224,159,142,189, 5,146, 26,113, 35,153,236,152,138,109, 46,169, 69,
+ 25, 87,137,133,140,117, 36, 18, 53, 10,175,145,203, 5,138, 80,109,208, 48, 59, 17, 96, 8,190,160,123,246, 0,108, 20, 27, 91,
+ 12, 57,247, 17, 10,106,116,134,130,190,154, 78, 89, 80,156,196, 87, 1,193, 91, 30, 97, 18,163,152,205,238,197, 65, 6,218, 88,
+ 22,108, 90,237,237,189,152,234,185, 95,164, 89,245,210,228,149, 56,245, 82,107, 53, 74,100,246, 35, 52,164,165,243, 25, 77,135,
+115,204,242, 70,121, 29, 74,177,211,148, 96, 43, 79, 29,187, 98, 95,172, 58,106, 17,164, 80, 67, 45, 56, 12, 74,109, 70,100,217,
+240, 85, 24,171,153, 44, 69,113,113, 82,236, 53, 20, 4,149, 21, 41, 69, 5, 39, 41, 86, 6,179,123,118,157, 92,141, 29, 16,156,
+183,161,203,117,169, 45, 41, 85, 8,181, 70, 27,109, 47,173,212,248,236, 71,106, 84, 99,132,175, 36, 36,133,242,100,225, 68, 4,
+141, 58,241, 37,169, 36,181, 81,162,206,163,163,196, 75,109,173,245,177, 34, 3, 69, 39,152,189,239,177, 10,146,225, 89, 79,232,
+208,128, 73,194,129, 72, 61,117,169, 79, 70,103, 39,152, 2,179,118,234, 61,230,215,211,210,196,129, 98, 64, 29,141,241, 79,103,
+220,101,153, 30,114, 70,144, 85, 43, 2, 13,228, 73, 14,130, 64, 58, 33,230, 2,133,252,192,233,140, 21,185, 0,130, 72,108,110,
+143, 14,191, 8,188, 39,209, 80,234, 30, 65,115,252, 6,171, 17,212, 71, 73, 7,149, 40, 68,198,155,113,192, 74, 65, 61,137, 39,
+175,124,235,131,126,216,205,247,152,111,141,190,225,194,146,243,176,233,118,141, 10,155,186,215,228, 17, 33,165,138,133,245,119,
+ 54,244,107, 38, 20,208,210,212, 86,213, 50,201, 6, 83, 77, 44,254,130, 77,220,242,193, 10, 9, 34, 68, 98,167, 69,113,239,115,
+ 98,162,209,150,227,169,100,164, 50,250, 30,142,153, 10, 67,104, 47,161,113,185,149,250,217,193,234, 7,124,117, 58,132,167,180,
+ 11,114,157,191, 56,207,226,110,235, 91,220,193,123,191,119, 82,161,167, 35, 13,210,109, 57,205,218, 52,134, 80,174, 65,250, 54,
+233,246,252,102,210, 48, 48,150,250,247, 58,147, 81,229,101, 16,136,212, 49,107,111,110,151,247,223,215,107,145,238, 29,206, 45,
+ 63,161,246, 88,153,247,139,149,156, 79,155,208, 8,233,184, 47, 46,150,174, 32,203, 38,147, 89, 80,241, 82,211,189,164,119, 95,
+ 36, 18,213,200,157, 74, 75, 28,114, 11, 50,130, 59,157,236,172,221, 24,215,231, 13, 23, 37,147, 81,118, 25,168,236,189,253, 46,
+152,218, 93,144,151,101, 53,102,223,141,191,116, 91,190, 19,107, 28,209, 97, 71,172, 69,186,152, 65,253, 80,165, 4,167, 7, 26,
+218,107,158,228,161,191, 61,218,125, 49, 94,245, 40,172, 37,210,202,148, 67, 42, 11,229, 81,117,224, 57, 60,114, 15, 92, 2,160,
+149, 14,100,228,234, 49,124, 2,239,229, 79,110, 55,233,155, 77,234,234,233,116, 45,237,130,141,181,173,200,114, 66, 99, 70,106,
+181, 46,104,159, 98, 79,117,194,147,225, 52,221,203, 17,152,171,112, 17,134,171,110,142, 96, 9,204,138,108,186, 50,226,248, 65,
+230, 94, 18,210,234,138,218,116, 40, 56,144,201,253, 42,228, 2,144, 82,232,125, 39,155,155,185, 24,199,163, 70,113, 75, 61, 53,
+ 66,211, 24,192,102, 80,250,173,177, 4,158,128,236,109,107, 27,244,244, 55,216,120,245,195,212, 92, 51,226,119, 20,241, 60, 83,
+ 51,208,241, 68,223,164, 41, 96, 4,170, 44,179, 42,251,111, 53,134,197,189,176, 77, 41,141,108,170,146,160, 98, 5,181, 97, 28,
+ 75,220,181, 26, 38,200,211,104,247, 69, 74,235,183,182,170,177,190,251, 65, 11,117,110,107, 14,159, 10,179,117, 91,182, 75,207,
+220, 78,183, 82,133, 14,168, 4, 79,171,216,186,153,183, 21, 41, 82,210, 98, 36, 41, 9,115, 46,170, 58, 78,196,185,236,244,224,
+218,187,107, 59,115,220,156, 71,239,126,228,237,173, 2,138,187,170,107, 84,230, 45, 75, 86, 5,193, 65,109,135,229, 52,252, 91,
+142,223,106, 82,213, 70,114, 67,192,198,106, 35, 40,154,243,242, 91,140,151, 91,112,244,112,233,245, 17, 14, 44,120,174, 52,203,
+140, 76,104,179, 45,183, 16,135, 25,122, 52,130,142,120,210,155,117, 36, 60,203,137, 64, 5,181,165, 73, 88, 7, 57,232, 53,131,
+111, 20,122,181,183,183, 23,101,181,105,248, 52,138, 5, 74, 76, 74,251,148,250,116, 97, 1, 16,222,167, 60,106, 47, 70,165, 53,
+ 21, 77,181, 6,159, 41,244,182,244,150, 67,100, 56,236,116,184, 10, 10,220, 42, 89, 95, 56,135, 46,142, 10, 39,138, 88, 81,180,
+202, 38, 14, 74,164,134,226, 72,138, 50,168,146, 61,200, 73, 86, 72,223,161, 85,177,213, 91,112,255, 0,139,220, 97, 77, 6, 89,
+195,156, 53,196, 21, 60, 22,207,152, 77, 60,242,208,138, 52, 21, 75, 82,148,144,150,121, 38,162,154,174,158,178, 4,129,185,117,
+ 52,245, 41,169, 36, 80, 81, 94, 4,118, 96,232,187,243,188, 52, 58, 53,183, 22,179,113, 84,169, 53,196, 81,160,251,245, 41,201,
+ 62,244,245, 37, 30, 24, 17,105,181, 9, 10,121,208,245, 77,152, 9,140,153, 37,110, 58,225,146,151,148,235,139,112, 41,106,217,
+189,151,227, 46,253,131,118,219,180,250,252,122,125,201, 79,118,165, 17,114,150,164, 24,178,216,166,197,117, 15,212, 36, 41,109,
+252, 46,145, 13,149,146, 84,156, 16,146,163,211, 58,229, 18,107,239, 62,242,147, 37,199, 31, 91,206,242,186,241,117,192,165, 58,
+115,211, 39,155,149,210,121, 78, 15,117, 43,161,198,175,245,237,208,133,180,123, 77,185, 27,181, 83,195,175,211, 41, 12,109,245,
+155, 17,197,165, 15, 85, 55, 47,117, 95, 93,149,109, 82, 48,149,164,169,198,162, 73,174, 84, 86, 89,234,134,109,247, 20,190, 92,
+115, 20, 34,161,174,138,166, 35, 73, 52,177, 73, 35, 11, 42,177, 35,177,251, 38,224,129,110,227,176,216, 3,139, 63, 49,225,124,
+159, 58,137,168,171, 50,122, 67, 83,155,200,176,199,104,150, 37, 89,170,228, 17, 68, 21,129,214,136, 36,145, 64, 37,137, 84, 80,
+ 88,147,124,113, 55,116,247, 70, 69,253,187,251,165,124,248,206, 6,183, 3,113, 47,219,205,230,124,103, 29,108, 53,115, 87, 43,
+ 21, 40,234, 47,172,146,232, 75, 18, 90, 9, 39, 39, 13, 39, 9,232, 14,172, 14,214,153,120, 48,183, 78, 92,152, 57,157, 10, 37,
+ 43,109,167, 26, 13,184,150,207, 80,131,206,176,172, 30,169, 9, 5, 24, 32,105,155,145, 77,159, 79,177, 55,214,248,122, 99,102,
+ 14,214,238, 37, 54,195,167, 33,244, 45,181,207,144,221, 5,213,204, 44, 21, 16,151,138, 88,241,164,244, 32,167,198, 64, 82, 64,
+ 41,200, 53, 27,141, 40,118,147, 76, 15, 45,169, 62, 12, 25,243, 2, 86, 20,234, 16,197, 62, 19, 65,165,164,117,229,247,167,138,
+ 73, 61, 22,177,202, 7, 66, 69,171, 7, 12,211, 48,141, 68, 97,196, 42, 34,118,176,243,125, 68, 82, 27,237,230, 26,101, 64, 77,
+183, 59, 94,221,125, 38,200,188, 76,203,114,202, 54,165,142, 67, 20,116, 65, 22, 8,217,183, 68, 90,250,204,182, 21, 7,236,171,
+ 60,153,116,228, 2, 70,148, 58,202,134,186, 15,209, 95,217,213,187,149,126, 36, 56, 44,216,253,206,187,174, 26,157,110,227,126,
+218,126,193,186,149,240,199, 84,155,163,109, 39,191,101, 84, 39,204,125,144, 23, 80,149, 50,149, 75,163, 76,121,231, 85,202,227,
+245, 23,148, 15, 58,213,173,192,169,181, 57,184,233, 69, 62, 75, 17,217,117,148, 54, 25,157, 8, 41, 77,184, 20, 57, 18, 85, 21,
+196, 40, 55,148, 36,167, 33,106,235,158,185, 26,226,103,176,146,232,171, 73,224,105,202, 90,107, 52,248, 49, 97,111,182,232,183,
+ 25,185,145,221,148,239,233,169,118, 36,151, 91, 74,223,144,136,236, 44, 74, 46, 41, 40,108,169, 68,173,101, 73,230, 86,187, 41,
+ 49,154,218,209,205, 42,173, 52, 52,180,165, 74, 68, 70, 98, 69,116,182, 9, 42, 83, 15,150, 84, 82,172,173, 43,228, 0,100, 3,
+231,140,166,170, 86,154, 21,107,179,160, 10, 88,238,110,160,139,147,114, 77,254, 59,238,122,227,195,207, 25,248,114,151,135,188,
+100,241, 27, 44,203,158, 10, 60,158,155, 59,204, 26,142,156, 69,166, 56,105,158,169,228,130, 24,163, 88,121, 65, 97,137,146, 53,
+ 32,147,100, 5,141,201,182, 5, 94, 69,230, 10, 94,145, 46,158,251, 79, 45,104,148,212, 6, 23, 14, 74,219,229, 12, 45,182, 36,
+ 58,225, 37,149, 97, 25,231, 83,121, 7,151,152,115,103, 88,171,145,168,116,244,134, 97,194,115,222,240,219,142,210,234,106,145,
+ 26, 99, 65,211,209,246,222,146, 74,159,116, 16, 64, 41,113, 93,130, 80,224, 61, 53,146,220, 18, 42,169, 71,189, 65,175, 23,224,
+ 43,196,110,100,138,180, 52, 73,141, 20,132,150,219,121,201, 49,146,211,140, 32,184, 66, 20, 84, 8, 65, 74, 73,198,117,138, 87,
+ 28,148,234,162, 34,187, 74,117,192,134,195,141, 85,221,124,204,165, 74, 66, 64, 8,106, 33,105, 1,113,212,225, 81, 86, 31, 66,
+ 49,205,221, 67, 11,214,189,142,171, 48,185,237,109,186,218,221,251, 94,219,220,117, 0,118,198,190, 89,205,228, 83,161,104,226,
+136,234,212,180,224,194,199, 64, 4, 7,140,136,249,140,128,157,144,137, 21, 72,107,233, 54, 57, 45, 21,111, 50,239,128,212,167,
+155,106, 99,237, 53, 50, 5, 82, 58,170,112,130, 22,133,248,114,226,201, 82, 20, 84,194, 84,162, 75, 79,133, 20,150,202,144,180,
+144, 70,158,219, 70,151, 29,231,155,118, 60,104,204, 22, 63,193,222,142,151, 20,169, 10,146,203,194, 58,208,195,190, 63,232,220,
+ 83,255, 0, 26, 27, 64, 12,165, 9, 10,230, 9, 32,105,148,162, 91,141, 33,248, 83, 89,126, 99, 48,230,182, 20,180,198,150,244,
+129, 79,113, 60,188,170,101,153,170,115,222, 32,173, 37, 93,149,240, 99,149,124,169, 9, 89,109,184,249,226, 98, 31, 5,220, 21,
+239,191, 17, 15,200,136,155,150,213,178,166,210,246,246, 59, 73,141, 4, 86, 55, 54,239,228,181,236, 42, 83, 8, 90,185, 31,124,
+220, 21, 40,178,202, 18,149,144,213, 45,220,101, 41, 86,157,232,209,181,169, 10,100,111, 40, 23, 59,177, 54,181,129, 23, 4,146,
+ 58, 1,212,220, 92, 98, 11,198,117,212,212,212,243, 58,213, 20, 77, 12,210, 54,146, 52,132, 30,109, 96, 29,244,170,155,187, 57,
+ 42, 0, 96,197, 77,204, 4,253,172,219,203, 47,139, 95,105,175, 18,183,101,176,204,138,245, 61,141,200,141,179, 22, 18, 41, 9,
+ 93, 86, 93,102,147,182,162, 46,222,210,152,166, 51, 24, 19, 62,108,219,142, 29, 80,176,134,211,151, 87, 57, 0, 2, 78, 76,168,
+189,147, 30,205, 59,119,129,141,189,137,185,219,145, 71,167,212,120,177,191,168, 72,110,225,150,239,131, 57,157,155,182, 42,104,
+109,241,183, 54,188,132,130,150,171,238,183,225,154,253, 69,162, 22,251,224,192,105, 98, 36,114, 29,230,127,176,159,128, 53, 76,
+144,190, 60,247,198,152,229, 94,166,106,149, 39, 54, 34, 21,106, 58, 84, 43, 87,116,135,159, 77,209,188,211,162, 60,140, 58,227,
+ 18,159,150,197, 29,103, 9, 19, 37, 74,154,140,150,153, 34, 80,232,121,231, 86, 94,194,151,206, 84,165,229, 89, 83,132,156,149,
+100,255, 0, 59,169,238,117, 52,214,174,144,192, 15,246,106, 75, 42,129,210, 73, 19,102,115,254, 20, 96,116, 95,171,221,172, 52,
+163, 53, 11,192,252, 48,106,170,102,226,204,206, 29, 53, 57,147,188,180,145, 48,254,234, 41, 9,101,148,237, 96,238,166,209,126,
+196, 86, 97,188,158, 91,213,199, 90, 49,104, 79,128,238, 30,144,121, 9, 61,192,192,201, 10,245,242,251,181,174, 71,196,148,241,
+192, 74,219,247,143, 25,101,101, 88, 83,109,158,100, 32,143,231,159, 20,183,140,231,245,116,231,222,179, 3,236,178,194, 18,160,
+158, 67,240,159,214,231, 63, 8,200,245,230, 7,246,107, 16,183,233,171,125,220,148, 41, 94, 26,193, 82, 72, 56, 30, 24, 42, 25,
+ 7,182, 93, 82,127,254,159,144,211, 69, 97,106,138,152,227, 83,176,254, 38,222,238,150,252, 15, 81,139, 78, 53, 68, 46, 72,176,
+ 83,107,124, 58,253,247,191,243,198,113,108,211, 19,227,169,194,215, 63,134,203, 99, 5, 93, 27,101,146, 22,246, 14, 62, 37, 45,
+242, 7,255, 0, 71, 91, 55,104, 83,196, 88,200, 91,141, 21, 62,226,125,225,196,142,201,144,233, 1,182,178,161,208, 1,200, 7,
+158, 18,112, 52,218,218, 20, 34, 11, 72, 82, 48,167, 29, 66, 86,162, 9, 37,168,227,198,115, 36,249,169,100, 15,158,126,122,216,
+ 74, 93, 56,165,176,160, 48, 80,160,230, 79, 96,234,193,228, 24,207, 80,150,250,245,243, 58,216,145,194,132,133, 59,122,123,247,
+233,252, 61, 58,123,176,171,188,113,197,169,205,134,223,126,214, 23,251,250,216,250, 19,223, 23,184, 45, 45, 45,164,250,130,146,
+ 81,130,165, 58, 79,198,161,205,211,205, 71, 39, 29,135,217,171,242, 82,161,202,146, 14, 66, 64, 79, 92, 18,112, 18,132, 16, 7,
+ 82, 71,151,110,167,174, 79, 64,225, 49,204, 6, 74,148, 8,194, 60,151,142,203, 80, 0,244,206, 50, 62, 95,110,173, 87,197, 93,
+ 84, 74, 17, 76,101,242,212,170,171, 93, 62,154, 51,254, 77,126, 25, 50,166, 56,148,245, 8,102, 57, 81, 78, 59,184,180, 13, 2,
+252,184,139,157,194,142,158,167,111,226,127,215, 17,237, 18, 87, 87, 69, 75, 8, 13, 45, 67,233, 30,130,251,146,127,194,160, 22,
+111, 64, 9,233,134, 94,191, 60,214,174, 57,178,155, 80, 92, 88,138,250,178, 34,146, 73, 75,205,197, 89,247,133,181,215,245, 87,
+ 40,172, 41, 93,185, 91, 30, 93,117,113,101,178,148, 36, 20,167, 60,185, 33, 32,115,124,125,242,123, 32, 17,235,228, 58,103, 58,
+ 6,155, 5, 49,217, 1, 3, 41, 72, 72, 43, 80,202,251,124, 13,167, 57,231,230, 87,116,142,188,202,202,181,122,119,157,164,242,
+182,128, 48,114, 74,210, 29, 82,148,174,231,149, 4, 14,112,122, 96,156, 36, 12,232, 82,130, 20, 22,181,207, 83,241,235,252,127,
+134, 38,117,241,198,136,144, 66, 60,145, 40, 65,126,182, 80, 5,205,187,158,167,191,125,177,107,145,209, 56, 56, 42,192, 31, 7,
+ 50,136, 81, 39,245,114, 6,113,145,215,212,143, 62,186,109,183, 18,195,178,183, 58,203,185,118,235,114, 45, 74, 13,245, 98, 93,
+244,185, 20,123,178,204,185,224,179, 84,161,215, 41,210,208, 90, 83, 50,227,188,143,209,202, 66, 15, 51, 50, 26, 45,202,140,234,
+ 80,244,119, 91, 90, 65, 46, 20,133,132,149, 18,121, 66, 82,146,158,167,227, 3, 9, 11,231,233,205,133, 28,116,233,240,231,231,
+171, 4,167,130,146, 70,115,130, 7, 41,230, 1,190, 97,133,140,168,119,230, 25, 87, 47,167, 66,115,128,228,164, 50,233, 32, 21,
+ 35,161, 23, 7,226, 15, 81,234, 45,238,196, 78,170, 0,218,129, 93, 72,247, 12, 8, 22, 32,141,193, 7, 98, 10,220, 16,110, 45,
+112,118,216,254,127, 62,215,111,101, 5,107,129, 75,173,157,208,218,223,173, 46,126, 22, 47,170,217,166,219, 21, 73,139,114,161,
+ 95,218,219,154, 98, 29,148,206,220,223, 83, 66, 63,194, 24, 91, 77,191,245, 45, 81, 88, 76,246, 99,150, 29,196,198,148, 28,226,
+ 11,202,192,207,250,185,206, 65,252, 7,207,183,227,175,213, 99,121,118,187,111,119,183,109,239,125,163,221, 75,114, 53,215,183,
+ 27,137, 66,147,110, 93,212, 9, 73, 66,132,168, 18, 70, 89,155, 1,197, 28,211,235,208,230, 33,137,116,249, 72, 41, 92,105,113,
+154, 90, 84, 7, 50, 85,249,178,113,225,194, 13,235,193, 55, 17,215,238,197, 93,238,191, 80,167, 82,159, 69,111,111,238,242,201,
+110, 45,251,182,117,197,186,245,165,117,196,233,203,239, 75,138,218,226,212, 26, 24, 84,122,141, 58, 75, 74, 74, 64, 71, 51,238,
+ 85, 86,192,138, 57,152,176,223,150,204,110, 72, 29, 81,137,234,203,216,159, 51, 46,237,118, 86, 99, 65,113,143, 12,174, 75, 50,
+215, 81, 41, 25,101, 83,105, 43,215,145, 46,237,160, 27,127,116,226,230, 50,126,201, 86, 67, 97,203,213,166, 30, 57, 89, 86, 50,
+ 57, 63, 91, 35,175,110,154,250,115,156,144,122,249,254,255, 0,158,190,132, 99,161, 63, 14, 7, 46, 51,204,122,121,244,234,117,
+245, 72,229, 29, 50,113,234,114, 6,127,226, 52,254, 46,118,196, 36, 11, 11,116,192,142, 40,231,160, 24, 29,207,175,231,166,135,
+ 82,137,238, 64,232,124,241,143,179, 68, 44, 19,211, 24,237,156, 99,160,245, 31,126, 52, 50,128,235,212,121,128, 78, 49,215,207,
+246,105, 68, 59, 91,211, 6,181,253,109,251,240, 59,128, 1,240,171,174,122,121,121,246,207,159,246,104,101,244,200,243, 35,246,
+ 1,147,162, 21,140, 28,140,254,113,161,148,112, 8,235,215, 56,237,248,125,154, 85,112,176,189,136, 39, 3,168, 0, 15,145, 62,
+ 99,204,143, 35,249,242,208,203,229,235,235,211,242,126,225,162, 87,140,117,249,224,122,159,158,135, 88,233,231,247,118,251,254,
+237, 44, 58,142,248,193,237,183, 67,243,247, 96, 69, 12, 31,183,175,217,165,175,171,198,113,140,126,255, 0,187,241,210,210,202,
+ 77,133,197,207,221,131, 99,202,112, 72, 7,242,117, 92, 15, 35,128, 60,190, 67,250,245, 69, 3, 39,236, 25,209, 40,239,246, 15,
+207,219,164,143,175,174, 6, 42,164,124, 64, 14,131,166, 15,207,236,243,242,209, 35,215, 56,198, 62,220,124,191, 62,122,164,143,
+ 51,208,255, 0, 72,235,253, 31,213,170,160,100,227, 56,233,145,243,252,254,237, 17,175,109,186,223, 3, 4,160,140,231, 62, 93,
+207, 79, 77, 22,130, 49,143, 63,233,251, 52, 26, 72, 30, 64,143,179,183,217,162, 1, 74,146, 72, 61, 65,252,115,142,159,159, 93,
+ 35,140, 48,184,235,108, 20,140, 18, 1,239,158,135,203,239,209,169, 7,166, 14, 79,145,253,186, 1,158,132, 17,149, 14,196, 19,
+140,124,243,251,180,122, 72, 79, 76,145,211,160,233,147,164, 9, 36,220,225, 54, 29,199,206,216, 33, 4,224,142,153, 29, 85,219,
+183,166,164, 73,236,110,220, 31,173,246,111,125,182,170, 68,175, 13,251,106,189, 68,191,169,177,199,196,183, 33, 84,227, 24, 21,
+ 2,134,250,229, 41,151, 17, 57, 35, 63,229, 6,117, 29,198,252,179,144,122, 1,230, 79,219,211, 93, 44,246, 85,110,228, 13,175,
+226,214,210,164,215,229, 24,246,198,234,192,168,237,157, 95,227,228,108, 75,174, 32, 59,111,188,224, 39, 4, 38,172,195,104, 4,
+246,247,157, 70,120,186,135,219,242, 26,232,130,234,146, 37,230, 46,215,221, 14,166,255, 0, 32, 97,247,226,198,240,131,136,227,
+225, 95, 18, 56, 87, 54,157,180, 83,123, 64,167,148,237, 97, 29, 72, 48,220,223,107, 43,186, 57,255, 0,166,248,146, 36, 30,101,
+188, 76,200, 92,160,148,190,196,228, 14, 82,218,114, 10, 92, 8,242, 87, 93,108,205,136,136, 94, 60,105,208,170, 83, 26,151, 9,
+191, 29, 82,222, 74,157, 92,231, 64, 7,195, 90, 79, 64,192,244,244, 26,103, 63,131,149,104,117, 26,148, 68,184,195,109, 83,228,
+173,134,209, 44, 2,226,202, 22, 82, 16,178, 79,234,114,242,159,179, 79,213,149, 33,113, 88, 77, 61,112, 27,121,229,248,106,149,
+ 58, 39, 41,101,148, 19,213, 63, 32, 79, 66, 62,237,115, 51,211,150,121, 6,155,219,175, 91,109,181,133,253,226,219,123,241,235,
+ 75,241, 11, 79, 76,188,137, 11, 48, 93,149, 89,118, 13,107,151, 89, 1,176, 11,212, 3, 98, 79, 75,219, 27, 67,183,181, 74,244,
+214,231, 56,229, 74,158,135, 38, 41, 14, 18,160,166,156, 74, 16,156, 36, 32,118, 65, 62,159,191, 89,190,241,113, 11,110,112,191,
+176,215,206,245, 95, 6, 20,202, 61,145, 74, 92,138,101, 45, 18,130,100, 92,247, 68,212,150, 40,116, 70,185,198, 84, 94,156,164,
+120,132, 3,202,211,110, 40,118,198,137,219,165, 83,139, 76,133, 80, 28, 90,114,210,212,240,109, 10,241, 74, 15, 76,167,253, 94,
+159,126,117,202, 47,164, 21, 92,174, 69,225,135,102, 32,209,169,178,160, 90,181,125,216,152,229,206,180, 71, 8,142,167,224, 81,
+ 11,148,102, 36,173,177,132,143, 17,201, 42, 66, 85,208,148,156,117, 26,113,203,168, 3, 58,157, 54,103, 33,125,118, 36, 94,196,
+237,222,227,213,182,195, 70, 89, 79, 69,197, 92, 91,144,112,245,125, 61,168, 43,234, 1,157,252,177,147, 20, 49, 60,207, 26,149,
+ 58,245, 75, 28, 77, 18,149, 55, 93, 87, 27,139,227,130,123,191,198,175, 16, 27,247,184, 53, 45,208,191,119, 70,231, 85, 90,163,
+ 41,199,233,180,154, 61,106,117, 46,133,107,211, 84,247, 52, 26, 77, 22,153, 17,228, 34, 20,118, 27, 40, 72, 87, 47, 57, 41, 37,
+106, 42, 36,235,167, 28, 15,251,109,119,107, 98,106,116,123, 7,136,169,179,119,107,102, 31,113,136, 72,172, 74, 90,101,223,214,
+ 83, 75, 33,180, 78,165,212, 93, 60,213,120,109,143,137,113,159, 82,138,146,217, 13,173, 11,198,163,142,186,235,108,188,164,169,
+213,165,121, 56, 0,143,231, 19,148, 16, 58,242,145,159, 46,186, 6,109,204,220, 84,151,229, 73, 75, 76,165, 69, 13,186,181,124,
+ 13,149,252, 65,167, 20,122, 32, 43,175, 41, 61, 51,208, 28,156, 25, 60, 92, 63, 80, 37, 67, 1, 49, 19,208,129,189,141,182,255,
+ 0, 21,246,184, 55, 7,184, 56,236,142, 32,151,195,140,255, 0,133,223,133,248,147,134,104, 42, 50, 10, 88,196,113,162,172,112,
+123, 24, 69,210,178, 83, 74,129,100,164,145, 7,247,111, 27, 39, 75, 54,164, 44,167,244, 98,220,125,244,218,109,207,181, 44, 93,
+211,218,219,134,218,187, 42, 87, 53, 36, 51, 69,220, 10, 51, 17,100, 76, 69,191, 35,149,215, 40, 82,159,113, 5,234, 52,228, 57,
+209,198, 86, 27,121,151, 16,161,243, 44, 38,219,240, 59,195,109,247,187, 50,119,219,118,236,200,251,153,118, 75,170, 65,173, 67,
+182,174,118,154,153,103,210,171, 16,188, 32,197, 90, 69, 61,192, 77,102, 97, 83, 13, 41, 94, 54, 91, 36,117, 74,129, 58,135, 95,
+ 6,188,107,223,252, 45,110, 43, 52,233, 52,170,149,203, 96,222, 20,101,215, 83,103, 60,250,190,174,187,227,193, 5,199, 38, 91,
+143, 44,148,196,174,178,208,123,149, 72,234,165, 37, 41, 87, 50, 84, 70,166, 95,193, 71, 19,251, 57,196,190,221, 82,183, 35,102,
+111, 8,119, 37, 13,224,211, 21,170, 59,206,165,155,154,207,170,129,201, 34,143,114, 82,138,185,226,186,219,193, 72, 75,184,240,
+221, 9,202, 85,215, 26,134,231,185, 70,123, 75,158, 38,105, 42,145, 71,202, 88,163,146, 50, 90, 29, 18, 16,197, 88, 92,133,119,
+146, 38,219,245,140,108,190,102, 70, 11,198, 92, 75,194, 16,120, 95, 13,105,224,204,246,176, 46,111, 21, 85, 20,213, 74,239, 79,
+ 89,200,142, 74,121, 30,138,165, 99, 8,209,242, 82,106, 70, 89, 32,229,195, 52, 53, 48, 77, 24, 84,168, 68, 26,105,237, 7,217,
+ 19, 64,220,153,215, 20, 88,210,156,133, 88,145, 38,124, 79,119,101, 69,163, 18,166,128,243,109, 37, 40, 1, 44,161,169, 41,117,
+174,100,245, 74, 25, 74, 0, 3, 3, 90, 51, 69,177,226,173,138, 60,234,204,122, 85, 38,221,129, 41, 51,103,211,161,176, 94,110,
+ 91,208,250,114, 84,204,148,115, 56,210,150,121,194, 65, 70, 22, 18, 73, 35, 82, 72,226, 42,210,160,110,117,160,197,162,168,115,
+ 29,188,213, 74,168, 86, 45, 9, 77, 65,126, 76, 10,156,120,126, 17,171,208,229, 78,105, 60,176,167,150, 84,151,226,161,194, 60,
+101, 71,113,182,200, 89, 26,226, 82, 54,226, 82, 43,245, 56, 55, 19,146,165, 82,168,173,189, 53,234,122,121,219,167,174, 92, 53,
+ 21,161,215,162,173,172, 60,148, 33, 24, 82, 73, 88,113, 92,185,201,201, 27,117,108,244,241,194, 26, 80, 4,200,175,177, 5,212,
+177, 33,144,129,246, 88,144, 74,234,211,113,184,242,225,135,128,248,146,174,159, 42,143, 44,172,115, 72,249,120, 15, 20,146, 35,
+ 63, 50,152, 72,218, 26, 20, 93,164,179,172,144,173,201, 8,234, 67,105,179, 12, 29,182,244,136,190,236,139,162, 43,211, 44,218,
+ 8,144,234,232,245, 56, 11, 17,235, 21,134,156,116,152, 20,134, 80,176,164, 56,209, 72, 43,143,200,135, 22,133,101, 74,113, 57,
+214,238,237,187,251,130,203, 76, 67,151, 72,167, 84, 98,133,170, 91,213, 42,148,233, 12, 76,138,192, 82,148,219,210, 68,113,202,
+170,138,219,193, 89, 73, 67,106, 72, 42, 40,200,248,181,222,133, 7,252, 38, 61, 94,168,236, 48,218, 34,198,106,222,121,215, 12,
+ 42, 5,177, 73, 72,109,202,131, 44, 54,165, 4,166,172,236,131,241, 5,128, 23,219,155,149, 1, 39,109, 54,169, 47,214,159,141,
+ 78, 48, 42, 53, 11, 73,106,126, 99,142,173,244,196,145,119,169,196,182,166,100,201, 84,167, 3,137,162,161,194, 72,100, 6,202,
+154, 9, 82,143,134, 60, 50,195, 58,115, 25,121,138, 2, 2, 5,250,155,236, 2,134,216,220, 95,168,238, 13,133,186, 73,115,220,
+216,213, 80, 74,207, 75, 13, 76, 72,128,234,144,106, 49, 40, 80,161, 99,149, 74, 52,149, 4,141,198,181, 87,112,116,142, 90,187,
+151,130,212,169,221, 85,192, 81, 71,162, 69,143, 17,233,177, 66,234,213,121,210, 29,109,249,104, 83,136, 47,211, 99,197,142,149,
+ 42, 58, 27, 13,132,100,161, 42, 4, 36, 14,234,214,192, 82,168,207, 6,100, 72,146,243,115, 36,115, 37,223,120, 83, 66, 40,134,
+150,151,200,182,225, 67,103,224,109,191, 19,152,143,214, 95, 97,205,166,202,221,175,203,122,100, 42,117, 14, 27, 48, 96, 45,217,
+109,187, 93,144,132, 73,164,149, 65, 11,113,200,212, 8,170, 80, 21,149,224, 37, 41,120,242, 70, 10, 10, 9, 83,160, 99, 78, 43,
+116,232,146, 18,162,237, 86,169, 54, 43, 79, 52,133, 63, 42,172,182,163, 42, 83,190, 32,120,165,166, 16,210, 27, 75, 65, 69,178,
+ 18,158, 64,162, 82, 50, 81,157,111, 81, 68, 21,129, 8, 22,227,101,189,237,123,109,114, 1,185,236,109,232, 47,107,226,137,226,
+141, 77, 41, 30,203, 30, 87, 20,158, 96,168, 26,121,138, 19,111,172,118,118,179, 18,159,221,137, 20, 88,110,150, 85,193, 53, 73,
+145,226,170, 46,101,196, 76,164,184, 28,240, 12,134,153, 95, 43, 10, 74,155, 46,181,207,144,121,194, 7, 62, 9, 82,143, 47,108,
+234, 4, 62,210, 58, 72,219,158, 58,184,155,183, 37, 40,183, 29,237,225,189,234, 44, 58, 57,127,200,220,181, 35,117,198, 37, 8,
+ 56,229,118,159, 89, 74,128,242, 87, 67,131,157, 78,142,170,138, 83,209,158, 69, 30, 52, 6,160, 54,228,136,114, 46, 38, 99, 50,
+181,206,146,133,248, 78, 67,166, 72,113, 37, 82, 16,149,149, 37,199,134, 91, 66,242, 26, 11, 88, 90,147, 16,207,164, 3,178,234,
+161,113, 5,183,251,173, 73,167,134,104, 59,189, 97,210,168, 85, 9, 52,211,200,236, 43,223,109,162, 38,218,168,185, 41,231, 21,
+137, 21, 23,168, 70,202,152,128, 87,226, 56, 92, 95,235,114,171, 51, 28,157, 98,150,190, 8,100,110, 92, 83,221, 79,199, 69,239,
+185,177,177, 27, 15,128,189,142, 45, 63,163,127, 17,212,112,127, 20,113, 29, 53, 38,185,106,243,156,177,196, 81, 58,133,230,212,
+ 82, 85, 83, 84, 44,108,169,172,160, 52,166,171, 97,169,163, 3, 91,114,200, 24,226, 4,154,196,244,219,106,220, 88, 18, 36,123,
+230,213,238,117, 58,151,184,116,120,110,184,212,168,118,117, 66, 76, 20,196,186,144,180, 43,157,136,145,234, 12,197, 91,146, 81,
+132, 70,114, 83, 75, 43, 75,110,100, 74,151,217,207,198,213, 39,137, 54,238, 61,133,221, 10,180, 42,127, 21,123, 72,167,219,169,
+193,146,168,241, 90,223,139, 2, 44,118,170, 52, 45,207,178, 66, 74, 81, 80,184, 88,183,166,211,141,199, 76,103,157,106, 33, 53,
+232,129,216,210,102,162, 20, 59,161,215,121,234, 81, 43, 84, 91,170,177,103,222,204, 45,171, 98,241,138,155,114,161, 89, 69, 74,
+148,180, 59, 78,143, 92,122,151, 17,151, 83,112, 82,132, 69,184,196,200,129,133, 59, 38, 25,125,133,176,243,141,180,149,244, 87,
+132,222, 13,248,140,184, 47,203, 39,113,120,121,171,199,191,238, 93,185, 98, 53,251,111, 91,251, 99, 85,166,215,175, 87, 41,240,
+ 42,241,155,165,214,182,154, 47,191, 41, 91,145,104,211,234, 42, 83, 92,148,103, 83, 85,163,199,117, 84,250,197, 33,136,225, 97,
+185,206,113,194,121,109,101, 27, 45,125, 80,163,171, 2, 95, 99, 38, 41,121,134,115,162, 78, 66,144,133, 38,141,138,205,202, 84,
+102,150,120,231,139,150,134, 90,104,163,158, 75,196,249,142,105,226,180,212, 89,118, 93,165,163,138,170,138, 74,220,202, 74,236,
+184,209, 80,208,200,239, 65, 46, 97, 87, 27,213, 71, 85, 72,252,182,203, 23, 53,133,225,134, 42, 12,195, 41,170,210,211, 69,154,
+203, 85,150,205,166,227,165, 61, 6, 5, 54, 97, 74,156, 18,227, 69,110, 35,140,180,165,169,249, 82,156, 67, 13, 71,138,218, 85,
+241,185,226,184,218, 91, 31, 9, 82,214, 50,122,244, 11,114,111, 27,114,131,182,251,199, 34,255, 0,136,154, 45,247,176,245, 58,
+ 22,218,111, 22,216,181, 81,143, 85,184, 45,221,195,188, 89,183,161, 89, 20, 42,100,159,117, 96, 92,148,187,141,187,194,223,118,
+133, 84,102, 59,113,170, 72,126, 72,105, 41,114, 12,164, 55, 75, 99,119,122,224,174, 51,245, 7, 19,219, 89,112,112,215,186,220,
+ 60,220,144,175, 61,215, 77,193,108, 87,174,237,159,151,101,211,226, 77,189, 33,110,173,151, 93,162, 70,144,154,221,142, 81, 76,
+164, 63, 80,165, 60,241,153, 77, 68,215, 72,114,100, 8,147, 31,135,146,113, 71,183, 59,103, 34, 92, 13,253,110,235,173,110,165,
+205,184,176,173,202,147,143,193,221, 91, 86, 92, 45,209,191,156,186,104, 59,129,181, 86,205,199,245, 20,121, 48,102,109,181,175,
+123,214, 32, 86,104, 82, 40,181, 28,208,209, 13, 52, 53,191, 38,135, 86,101,109,214, 19, 84,229,188, 53, 74,207,159,161,161,167,
+175,150, 56, 86,121,140,113,211, 67,100, 55, 51,107,101,157, 73,146, 72,180,145, 11, 42,168,147,153,162,197,146,162,201, 56,112,
+210,113,141, 46, 79,196, 20,245, 18, 53, 58,173, 84, 67, 46, 95,106,106,245, 73, 41,170, 2,208,207, 24, 52,245, 80, 86, 80, 37,
+ 72,165,150,158,114, 90,122,170, 9,135,212,151, 87,227, 20,104, 45, 87, 24, 85, 86,218,241, 42,148, 71,110, 43,170,211, 76,212,
+ 52,150,132,106,245,151,114, 85,109, 11,162,129, 84,104,168,251,149,106,157,112,209, 42,113,229, 48,188, 58,218,227,142,108, 33,
+ 77,169, 90, 21,237, 94,168,222, 22,133,223,195,254,202, 10, 93, 82, 93,177,180, 43,183,183,154,236,164, 81, 20,153,146, 98,238,
+125,229, 73,129, 91,163,213,175,116, 52,191, 22, 53, 66, 29,188,253,173, 71,167, 81, 57, 76,150,133,213, 81,149, 33, 81,220,148,
+211, 74,150,182,225,218, 92, 50,112,247,195,165,153, 77,165, 90,219,117, 99, 91,150, 60, 43,174,244,174,223, 49,109, 27,134,228,
+218,202,205,255, 0,107,212,149, 18,116,251,243,114,104,207,201,168, 51,121, 72,220, 7,211, 38,169, 13,184,115,170,215,251,244,
+217,244, 88,238, 70,155, 37,169, 49,121, 20,212, 93,185,118,222,225, 46,203,225,223, 98,183, 23,120,253,160,252,116, 84, 55,118,
+117,213,191, 91,223, 72,247, 69,219,219,105,184, 23,221, 98, 20,254, 44,230,237,204, 42,236,138,109, 42, 84,217,212,251,153,118,
+ 17,144, 93, 52,138,101,143, 85,175,174, 58,252, 58,125, 67, 79,254, 28, 54, 93,153,214,174,113, 79, 20,121,133, 44, 97,185,112,
+ 9,150,105,100, 73, 41, 86, 94, 92, 38, 35, 21,167, 43, 81, 29, 57,169,144, 44, 20,142, 37,170,101,154, 49, 70,106,111,238, 14,
+168,151,137,248,115,244,207, 19,210,215,101,116,144,212,140,186,131, 48,134,146, 36,164,139, 59,164,121,107,219, 53,204, 26,181,
+229,163,139, 38,160,162,201,235, 36,205,169, 85,235,234,125,154,190, 36,140, 9,162,154, 90, 72,169,213, 45,253,208,118,151, 97,
+ 90, 91,181, 38, 13,167,103, 94,215,213,102,231,174, 55, 49,215, 31,172,238, 77,247, 17,216,119, 14,228, 45, 49,233,233, 9, 77,
+ 46, 21, 66, 69,159, 70, 41,134,135, 99,193,140,211, 84,180,200,231,102, 82,155, 18,155, 83,131,120, 85,111,219,154, 3, 50,105,
+148,169, 19,160,193,160,214,170,113,194,103,214, 98,211,229,168,183, 62,159, 72, 66,178, 89,147, 84, 14,152,173,252, 45,248, 13,
+ 54,178, 84,149,147,169,133,123, 64,189,146, 86,255, 0, 13,187,109,182,187,145, 64,219,248,219,185, 14,215,178,234,116, 13,218,
+222, 42,148,217, 2, 53, 42,184,204, 22,226,237,117,131, 14,206,132,240,114,194,225,222,157, 83, 53,138,149,106,161, 29, 14, 73,
+171, 86, 42,171,153, 89,124,169,230,121, 34,177,182, 91, 65,116,111, 46,243,196,218,253,171,247,251,206,183,116,213,106,146,228,
+110, 45, 77,182, 89,136,139,118, 28,148,197,186,119, 9, 54,243, 47, 6,109,107, 54,152,143, 26, 45, 38, 35,139,255, 0, 5,141,
+ 9, 78,190, 85, 41,232,140,170,115, 83, 86,212,245, 25,140, 21,212, 63,162,231,161,141, 36,125, 43,202,166, 45, 35,172,211, 73,
+ 10, 63,152,169, 40,176, 6,149,220,186,195,120,162,104,238, 34,191,184, 15, 62,224,252,219,132,178,206, 51,225,190, 45, 60, 75,
+193,102,174,190, 55,168,174,180,249,164,116,185,109, 52,249, 86, 93, 75,153, 84,195, 32,246,103,141,107, 43,115,158, 82,101,249,
+ 74,150,205,227,150,183, 49,167,173,118,253, 35, 52,143, 98,189, 5, 54,159,179,243,109, 77,101, 98, 4,221,196,190,119, 71,112,
+ 90,102,181, 21, 8,139, 91,164,212,174, 88,182,196, 10,140, 85, 56, 18,219,240,220,254, 9,200, 41,115, 33, 74,231, 82,146,146,
+218,155, 42,234,187,209, 27,163,184,237, 90, 72,168, 42,130,200,240,165, 64,143, 38, 82,158,160,173, 74, 13, 9, 84,182,157,124,
+ 46, 93, 57, 73, 90, 10,152, 73, 43,100,172, 41,160,180,115, 32, 49, 27, 9, 77,177,109, 93,139,217,139, 99,111,227, 72,143,183,
+214,214,217,218,118,173,163, 6,173,153, 19, 88,131,108,210, 99,208,101, 65,174,135, 83,148,212,157,159, 79,150,244,181, 20,148,
+123,204,229, 43,177, 57,114,208,124, 17, 57,202, 83, 14,170, 36, 5,137, 85, 10, 36,185, 75, 84, 55, 96,202, 71, 42,132,120,171,
+113,106,241,219,116,146,219,173, 15, 11,186, 85,148,168,114,194,132,136,200,173, 31,158, 54, 80, 65, 3,168, 34,224,129,232, 65,
+213,184,220,116, 23,199, 0,113,150,101, 55, 20,241,127, 20,113, 19,235,165, 25,245,125, 85, 67,198,196,108,179, 84,182,152,185,
+133,129, 73,145, 89, 34, 14,220,203, 72, 8,103,229,150, 86,247, 81,110, 91, 49,167, 78,161,215, 37,212,219,113,213,165,218, 85,
+ 69,240,244, 26,132, 54,129, 11, 49,228,181, 29, 46, 66,168,140,245, 75,156,193,124,161,183, 27, 28,201, 86,190, 81,155,125,104,
+135, 34, 12,114,220,121, 41, 40, 98,157, 53,228,170, 35,114, 20,230, 86,221, 26, 80,200,167, 40,169,103,158, 59,169, 8,202,112,
+128,131,144, 60,211,163, 71,152,183,230, 83,229,191, 4,133,169,153, 76,134,179, 60,198, 89,109,232, 14,212,225, 62, 86,221, 65,
+ 13,185,148,165,196,101, 78, 32,243, 37,209,130, 19,153,208,146,134, 81, 41, 19, 11, 49,214, 86, 24,121,165,178,165, 69,168, 40,
+ 31,135, 1, 64,169, 46,149, 41, 36, 40,254,144, 5, 36,146,188,100, 38,134, 48, 25,152,141,172, 46, 77,136,220, 27,250,141,253,
+222,226,122,130,193, 89, 80, 41,169,164,139, 72,146, 84, 43,112,200, 85,236, 84, 40, 87, 84, 1, 94,219, 21,144, 93,244,155, 22,
+ 69,101,209,125,183,168,209, 97,190,250,204, 70,152, 5, 64,200,140,166,150,203,176, 87,241,151, 94,136,160,178,134,218, 89,230,
+ 82,128,202,114,162,164,100, 2, 53, 28,111,107, 60, 59,251,143, 63,104, 23, 11,126,205,170, 3, 53,106, 46,201,109,173, 53, 27,
+255, 0,189,117,166,249,216,137, 90,147, 49, 18,105,172,202, 66,146,174, 71, 98, 81, 45,102,106, 49, 24, 42,193, 53,155,189,229,
+160, 5,197, 73,215,123, 47,141,211, 98,142,167,173,155, 89,193, 42,229, 25,106, 76,148,165, 47, 71,180, 91,112, 5,120,181, 23,
+ 14, 83, 34,182, 58,174, 44, 18,162,180, 43,149,249, 92,173,165, 40,113,184,160,218,118,243, 51,158,189,219,161, 64, 93,228,170,
+ 58,109,137, 55, 99,177,210,229,194,253,186,103, 61, 86, 93, 46, 69, 85,196,248,174,194, 85, 90, 68,169, 42, 65, 86, 20,243,235,
+ 89,234,113,167, 76,190, 73, 36,154, 36, 66, 2,174,204,196,216,168, 96, 86,235, 97,187,142,171,113,179, 0, 79, 96, 43, 78, 39,
+200,167,207,168, 64,172,169, 48,195, 60,176,243, 35, 59,153,169,213,129,145, 9,184, 40,178,128, 35,189,201,120,217,238, 72, 33,
+152, 74, 45,191,110,218, 20, 10, 5,159,104, 82,163, 80,109, 43, 50,145, 78,182,173,138, 20, 36, 37,152,116,202, 37, 38, 58, 33,
+ 65,136,219,104, 24, 24, 97,176,165, 43,186,214,165, 45, 89, 82,137,214, 66,192, 44, 56, 50, 64, 66,255, 0, 84,246, 74, 22,174,
+188,167,230, 79,109,121, 92,114, 87,226,132,243, 5, 16,162,145,156, 45, 62, 69, 56,238,161,231,246,106,239, 2, 58, 29,109,109,
+140, 45, 4,158,231,170, 65, 29, 58, 31, 49,251,181, 41, 93,150,200, 52, 42,216, 5,236,161, 64, 0, 1,233,167,107, 95,107, 15,
+118, 6,132,133, 20,133,242, 45,129, 0, 88, 1,181,128, 29, 5,187, 14,150,219,160,198, 15, 92,140,185,115,138, 64, 42, 71,192,
+ 48, 51,148,245, 42, 81, 7,237,199,237,198,179, 75, 74,130,162,174,110, 64,124, 66, 48,124,213,215,155,149, 64,142,249, 35,240,
+215,148, 83, 60, 73,124,161, 36,156,132,103,190,121, 71, 64,125,124,254,243,173,128,177,237,177,134,150,166,134, 7, 42,186,224,
+143, 44, 12,121, 14,154, 67,202,160,201,111, 49,218,255, 0, 63,127,239,196,120,213, 0, 90,237,117,185, 55,251,239,238,249,252,
+ 47,182,197,185,224,181,226,148, 36, 57,202,148, 5,148,228,167,152, 5, 58, 79, 79, 76, 14,157,180,226, 8,126,236,203,104,229,
+ 60,234, 39, 41, 0,168,144,160, 20,178, 64, 31,173,203,129,242,206,178,138, 93, 27,145,148, 5, 35,225, 35, 39, 61,212, 7,196,
+ 78, 60,251, 1,143, 61,123,145, 19,153, 69, 69, 4, 41,106, 8, 66, 83,212,227, 32, 37, 32,103,190, 59,159, 85,124,134,144,177,
+221,137,249,239,127,225,134,106,140,228, 77, 49,141, 79,213,198,127,211,243, 54,237,139, 84,118, 89,109, 14, 61, 41,212, 70,139,
+ 13,135, 37,204,148,176, 18,212,104,172, 36,184,227,206, 40,246,108, 37, 56,249,146, 7,158,181,250,179, 86,126,239,172,200,171,
+165,165, 49, 78,105, 40,133, 70,101,239,129, 48, 41,109,171,225, 88, 0,126,146, 83,234,203,139, 61, 57, 66,130,124,177,167, 30,
+243,170, 10,151, 53,173, 13,126, 37, 62, 51,173,185, 94,117, 25,228,155, 49,165, 7, 24,164,151, 19,254, 82, 35, 74, 8, 47, 36,
+116, 83,129, 32,146, 1, 26,196,209, 13,152,192,120,189, 72, 36,248,109,160, 56, 2,128, 5, 63,163, 79, 92,103, 3, 39,160,236,
+ 58,233, 61, 70,161,194,166,241, 70,119, 63,180,195,227,217,127, 22,248, 41,196,175,135,160, 90, 56,228,204, 39, 66,107,106,150,
+209, 41, 6,241,194,108, 75, 91, 99,174, 91, 3,191,217,140, 1,191, 54, 69,192, 76, 50, 27,111, 13, 54, 73, 64, 9, 75,139, 82,
+155, 0, 43,169, 44,128, 9, 62, 93, 64,193, 61,206,129,152, 95, 41, 82,138,208, 22, 65, 72, 12,164, 32,165, 0, 36,148,163,152,
+144,217,234,147,145,223, 36,228, 96, 13, 93,159, 83,174,103,149, 32, 40,182,126, 55, 51,206,132,145,201,240,161, 7, 35, 62, 99,
+ 32,129,158,249,214, 55, 45,212, 37, 96, 41, 41,120,167,152, 0,148, 0,129,149,167, 39,148,225, 32,224,247, 61, 71,166,116,224,
+158, 91,109,185, 27,219,231,253,127,117,240,237, 35,179,146, 77,153,143,253,199,183,115,176,223,225,139, 75,238,163,147,144, 21,
+ 40, 96,142,116,142,164,165, 71,170,222, 82,187, 31,136, 4,140,243, 1,229,215, 88,252,183, 65, 72, 11, 82, 74,126, 16, 8, 28,
+184, 82, 72, 9, 66, 86,188, 18, 18,124,176, 62,100,224,157, 92, 39, 56,224, 82,146, 23,204,162,174, 95, 9, 9, 79, 55, 83,240,
+ 40,169, 64,252, 33, 36,252, 92,160,245,192,214, 45, 49,208,142,112, 21,241,171,170, 65, 78, 85,128, 50, 82, 74,129,229, 60,160,
+143,187,169,234, 53,176,135,175,112, 15,243, 31,187,175,201,195, 45, 82, 13,247,235,252, 62,255, 0,187,182,253,175,139, 84,247,
+ 82,160,163,130, 9, 39, 36,167,159,175,196, 10,138, 66,176, 19,215,191,145, 57, 25,215, 6, 61,188, 92, 35, 69,226, 19,132,201,
+ 91,199,110, 82,195,187,161,195, 10,102, 93,241, 28,140,192,126,125,115,105,170, 47, 48,214,226,219,142,184,128, 86,242, 33, 44,
+195,173,196, 64,207, 34,224, 76,242,116,235,186,178,222, 24, 37, 41, 81,237,144, 82,160, 20, 48, 84, 0, 3,162,199, 82, 58,245,
+ 31,127, 70,250,191, 79,164,215, 96, 84, 40, 85,216,173, 79,160,215, 96, 84, 40, 53,232, 14,182,151, 35,203,161,214, 98, 61, 73,
+173, 66,121,165,116,117,135,105,115,166, 54, 71,126, 85,224, 28,246,216, 14,203,105, 35, 63, 89, 25, 12,191, 17, 98, 47,238, 61,
+ 15,184,145,176, 59,197,243, 92,186, 44,214,138,175, 46,156,218, 42,180, 41,114, 7,145,137, 5, 36,183,172,110, 22, 65,210,229,
+109,238,199,229,128, 82, 2,137,239,143, 49,212, 31,152,199,126,154,248,172,145,219,166, 51,147,251,191, 13, 61,188, 74,237, 67,
+251, 7,196, 22,245,108,212,198, 21, 21, 91,103,185, 87,117,161, 21,133,168,173, 72,164, 83, 42,242, 5, 1, 65, 71,170,194,232,
+ 46, 83, 92, 10,235,144,230,114,115,146,198,169,106, 88, 4, 43,155,166, 71, 76,119,245, 30,186,153,211,202,179,197, 12,202,124,
+178,168, 97,235, 98, 1,254,120,230,119,142, 72,157,226,149,116, 75, 17, 42,227,209,212,233,101,251,152, 17,138, 46, 16, 70, 51,
+235,156, 28, 99,251,116, 42,177,142,195,148,103, 30,125,187,147,243,213,117,168, 30,224, 12,142,248,206, 79,217,161, 87,208, 31,
+ 60,156,126,255, 0,221,173,192, 44, 0,244,192, 29,190, 56, 29, 89,193,233,255, 0, 14,253, 52, 34,142,113,223,207,184, 3,240,
+209,107,237,223, 29, 71,231,243,233,161,156, 32, 2, 51,147,231,142,191, 62,154, 85, 7,124, 42, 44,119,192,171, 35,203, 63,126,
+113,231,228,117, 69,125,179,147,255, 0, 31, 93, 87, 95, 55,158, 49,229,249,245,208,235,199,207, 62, 94,159,126,149, 2,228, 99,
+ 29, 0, 3,231,255, 0, 24, 21,103,175,216, 49,159, 93, 45, 37,254,183,221,211, 75, 74,139,128, 0, 31,142, 13,143,168,198, 79,
+124,227,238,199, 79,219,162,145,140,118,235,230,113,251,254,205, 8,223, 83,147,145,208,244,251,241,215, 69, 35,177,235,231,219,
+247,232,141,107, 47,108, 12, 18,142,199,167,223,235,249,253,250,169,158,221,250,124,254,126, 94,154,164,140,245,233,211,215,247,
+124,245,237, 36, 40,144, 15, 99,131,223,161,210, 78, 54,248, 96, 99,223,140,142,249, 24, 0,103, 25,202, 78,139,108,149,129,212,
+ 0,124,241,215,168,233,211,239,253,154, 16,180, 1, 56, 0, 36,228,159, 79, 44,147,243,254,189, 86,109, 65, 36, 14,184,198, 2,
+143,203,212,253,218, 64,155,117,192,193,237, 39,151, 3,175, 66,123,119, 63, 63,144,209, 8, 95, 51,137, 73, 78, 57,115,241, 30,
+221, 60,178,126,122, 8, 60,140,148,130, 85,216,224,117, 87,159,124,253,167,240,209, 63, 11,137,248,186, 28,252, 35,168,207,219,
+248,233, 22,234,113,131,235,243,233,139,187, 64, 43,162,136, 63, 49,147,235,233,247,106,247, 70,169,212,104, 85, 90,117,110,145,
+ 41,200, 53, 90, 68,248,117, 58, 92,198,148, 80,236, 90,141, 62, 75, 82,225, 74,109, 67,170, 84,137, 44,180,175,184,141, 88,152,
+ 10,229, 79, 96, 48, 57,177,219, 35,167, 79,219,162,211,156, 40,118, 30, 71,184,249,245,242,233,162,144, 24, 21, 97,112,118, 32,
+239,132, 15,196,169, 30,155, 16, 71,112, 71, 67,137,193,240,233,185, 20, 62, 44,120,124,219, 61,240,167, 76, 71,191, 84,105,140,
+ 81, 55, 14,155, 5, 64, 73,165,223,148, 54,155,135, 89,139, 53, 8, 57,103,197,121,191, 25, 25,253,100, 72, 65, 4,131,173,161,
+180,210,245, 40,183, 10, 44, 52,248, 14,171,153,247, 36, 40,150,208,211,100, 16,181,171,201, 93, 7, 79, 83,168,161,123, 40,248,
+226,137,194,214,237,191, 97,110, 76,199, 6,196,111, 20,202,117, 42,239,113,106, 82,155,179,174, 82, 83, 18,135,123,178,146,127,
+ 69, 25, 42,113, 12, 78,199,254, 43,149,211,158, 67,169,140, 46,220,104,182,207,128,184,210,104, 79,178,197, 70,159, 80,128,226,
+ 36, 70,171, 65,146,132,189, 18, 92,121, 77,168,165,248,174, 52,182,212, 10, 73, 7,155, 84, 39, 16,240,233,203,115, 25, 99, 88,
+201,130, 67,170, 35,216,169, 61, 47,220,173,244,155,247,243, 17,102, 24,239,143, 11, 60, 80,110, 39,225,218, 88,107,103, 15,152,
+229,170,144,213, 33, 98, 60,234, 0, 89,236, 55, 34,117, 93, 98,219,115, 3,198, 8,209,135, 82,196,175,212,218,113,133,198, 84,
+117, 38, 71, 32, 67, 78,101, 4,182,142,157, 7,255, 0, 22,125,124,255, 0, 13,121,226,147, 97,169,220,100,236, 45,251,195,253,
+214, 96, 83, 89,184, 96, 55, 58,221,184,156, 71,138, 45,139,210,151,207, 34,220,169,161, 93,196,113, 36,248, 82,113,221,137, 11,
+244,198,172,116, 62,102,100,181, 29,160, 61,231,149, 60,142, 99,224,101,164,246, 3, 29,128, 25,233,173,128,164, 74, 18, 99,198,
+ 73,116,183, 25,181,114, 60,178, 57, 76,151, 16, 50,162,162, 14,124, 60,129,246,235, 82,158, 2,165,118,210,203, 98, 45,216,245,
+190,219, 94,253, 7,223,139, 66,108,214,122, 57,232,179, 76,177, 18,150,182,141,214,104,102,243, 49, 73, 35, 33,209,244,220,171,
+217,133,180,176,210,230,225,188,151,199,230,211,196, 86,208,238, 55, 15,155,153,121,237, 22,231, 81,100,219,215,221,143, 82,149,
+ 79,168, 71,125,106,110, 52,230, 88, 90,132,122,157, 46,106,128, 76,202,124,136,220,143, 71,121, 63, 11,141,186,146, 8, 36,141,
+107, 90,238,137,210, 99,242, 84,194, 39,208,228,243, 69,156,165,101, 50, 16,209, 35,156,184, 17,212, 56,158,138, 66,198, 72,229,
+ 26,253, 19,125,160,126,206, 29,169,246,133, 88,112,226,214,219,129,100,111, 5,191, 18, 68, 91, 19,116,219,132, 28,148,220, 38,
+208,181, 53, 65,186, 99,180, 66,170,182,233,119, 30, 25, 39,198,138, 86,165, 50,121, 74,144, 97, 29,196,223,179,219,138,238, 14,
+171, 85, 42, 30,238,109, 69,202,253,158,137,146, 26,165, 95,150,229, 61,202,229,149, 91,134,219,133, 41,155, 18,173, 13,165, 6,
+ 91, 82, 48,172, 57,202,180,231, 5, 26,179,178, 42,250, 57,225, 72,106,149, 86,169, 74,233, 44,116,220, 29,175, 27,118,123,216,
+133,216,130, 59,142,146,250,158, 42,173,226,215, 74,204,190,189,178,218,167,133,214,182,141,111, 32, 18,142,242, 68,219, 84,208,
+202,162, 69,119,250,199, 68, 58, 38, 17,181,158, 86, 98,205, 98,245,184,155,179,246,190,133,117, 81, 43,212, 69,205, 93,107,111,
+171,201,247,180,220, 22,125, 75,170,221,143, 77,172, 67, 70, 41, 51,212, 66,147,225, 62,180,195,146,121,152,117, 41, 82,145,153,
+ 39,123, 14, 56,116,186,118,163,136, 57,119,139, 91,231,181, 82,105,117, 56,211, 85,187, 59, 81, 50,174,154, 46,225, 86, 41,142,
+178,236, 71, 96, 81, 44, 39,154, 15, 79,169,138,138,154,146,169,140,169,198,154,240,202,146,121, 8,214,156,123, 19,246,162,147,
+184,219,245,181,214,173, 74,157,114, 91,212, 68, 94,177, 46, 9, 87,209,164, 82, 35,166,152,213, 40, 26,147,148,152, 53,249, 12,
+182,135,161, 77, 92,118,163,188,212,150,221, 87, 43,171, 72, 10, 95, 41,212,194,248,217,224, 59, 96,239,203,211,110,184,157,163,
+220,219,119,195,142,224,236,189, 90, 53,199,112,238,141,180,213, 54,131, 86,184,173, 90, 80,241,158,162,204,105,137, 44, 68,247,
+146,216,120, 38, 83,136, 82,185, 95, 91,106, 14, 36,132,105, 42,177, 85, 95, 69,196, 84,180,235, 13, 45, 13, 59, 8,229, 63, 84,
+100,153,228, 44,254,209,101,229, 8,180, 29, 45, 34, 57,120,102, 98,238, 84, 54,248,177,115, 46, 32,224,110, 24,171,225,142, 26,
+226,122,217,198,119,199, 25, 21, 76,116,245,242, 71, 93, 93, 67,144, 67, 83, 72,217,122,208,154, 38,146,170, 74,254,122,137, 97,
+203,171, 80,123,126, 86, 13, 50,114,230,134, 52, 43,104,160,110, 52,106,229, 82,239,218, 10,165,197, 42,143, 92,155,112, 63, 79,
+182,109,170,172, 86, 42, 53, 42,212, 72,110,166, 83, 17, 83, 38, 18,137,166,133, 50,164,172, 60, 85,240,145,228,123, 92,248,153,
+225, 90,117,139, 14,223,186,217,144,212,184,247, 13, 37,217,245,234, 50, 30, 68,154,188, 47,118, 5,245,153, 13, 36, 5, 84,225,
+248, 64, 45,114, 16,133, 4,120, 5,183,210,145,135, 23,170, 17,120,166,246,122,210,239, 8,251,245, 73,221, 42,108,202,125, 54,
+ 85,110, 12,136,116, 25,110, 42,164,252,181,186,183, 36, 84,100, 71,157,200,243,176,212,251, 97, 40,154,128, 27, 80, 87, 42, 0,
+ 73,215, 28,248,248,246,138,238,223, 31, 27,209,100, 13,189,190,175, 61,174,217, 13,133,184,168,247,110,220, 46,215,168, 72,182,
+ 43, 50,175, 26, 23,136,134,174, 58,133, 66, 41, 14,213, 96, 61,144,143,113,148, 85, 17,198,121,155,117,149,165, 68, 30, 78,240,
+151, 41,171,203,168,248,214,139,140,242,218,147, 61, 39, 46,146,154,176, 74, 94, 58,115, 70,238,237,110,102,210,194,237, 49, 74,
+101,167,176,152,106,242, 71,253,233, 17,120, 7,226,111,137,188, 85,195,180,126, 29,112,252,188, 55,150, 71, 72,245, 89,147,103,
+144, 54, 91, 11,230, 13, 18, 65,236,212,236,144, 84, 78,202,220,184,170, 37,144,199, 57,137, 21,156, 76,199,149, 3,245, 94,101,
+153, 14, 91, 11,118,106, 60, 38, 42, 50, 98,248, 52,232,255, 0,224, 76,210,169,176,210, 23, 58, 67, 75, 75,170,196,215, 65, 90,
+ 66,200, 82,134, 70, 57,121,122,190,116, 74, 93, 58,224,113, 52,104,137,117, 22,180, 38, 41,236, 84,166,201,117,250,127,189,196,
+138,202,165, 63, 77,135, 61,213, 5, 70,128,166,194, 12,199, 18,144,165,140,160, 16,130,179,166,155,101, 55,170,133,187,214,166,
+214,220, 55, 67, 20, 74, 22,231,223,150, 76, 91,182, 85,181, 1,133, 66,160,215,231,197,159, 82,164,204,170, 90, 80,221, 39,244,
+ 42,118,154,185, 47,211,155, 89,114, 42,164,175,221,144,228, 84, 39,195,216, 74,124, 72,107, 67,204, 60,133,205, 66,221, 76,153,
+140,248,200,105, 21,106,162,212,144,195,107,125, 39,244,116,228, 20,254,149, 32,124, 73, 74, 16, 82,160,149, 5, 73,200, 40,225,
+ 8, 33,133,138,157,182, 82, 3, 95, 73,181,137,216,116,212, 13,238,110, 49, 90,230,167, 55,225,188,207, 50,225,188,237,100,164,
+205,114, 10,186,138,102, 10, 67, 66,181, 20,181, 15, 75, 52,145, 56, 33,102, 11, 36, 14,177,206, 9, 14, 84, 59, 29,188,174, 84,
+ 59,173,112, 93,143, 85,131, 21,160,229,114, 44, 58, 45,153, 66, 12, 7, 27,139, 74, 91,136,101,170,139,205, 35,148, 83,216, 89,
+109, 47,175,160, 45,198, 97,150, 17,149, 40,129,153,191, 33,138, 45, 46, 76, 10,157, 73, 53,234,220,249, 45, 83,233,211, 28,109,
+ 44, 82,226, 34,114,131, 18, 43, 40,129, 31,153, 48, 97, 70, 47, 36,186,181,120,174, 58,242, 82,209, 95, 50,212, 18,208, 73, 83,
+ 80, 80,204,199,127,194, 85, 21,242, 79,187, 56,168,170,169,212,221,108, 50, 91,138,234,193,240,227,178,130, 24,101, 57,229,108,
+ 41, 75, 86, 74, 20, 9,139,172, 74,165, 58,245,126,172,220, 89,142, 26,131,177,226,196,130, 86,202, 30,125,154,122,189,198,155,
+ 17,167, 0, 8,166,198,149,239, 78, 60,238, 79,139,135, 31, 80, 75,139, 70,183,210, 72,208, 37,152, 14,131,107,157,246,216,129,
+183, 77,134,221,141,183, 54,195, 12,185,100, 85,145,194,212,139,125, 68,121, 69,150, 73, 36, 70, 28,168,213,141,221, 80, 38,242,
+239,121, 25,155,153,118, 55,137,194,174, 84, 41,148, 85,183, 64,162,120, 21, 9, 84,184, 49,145, 29, 46, 45, 79, 64,165, 64,110,
+ 50,132,154,165, 69,214,148, 82,194,220, 74,138,147, 28,101,231,150,232,192, 66, 9, 86,185, 17,237, 36,216, 24,156, 79,108, 45,
+ 91,106,157,145, 17,119,146,170, 52,251,163,110,235,115,214,150, 35,192,191,179, 38, 60, 55, 42, 47,160, 19, 2,219,168,211, 29,
+118,157, 56,164, 20, 50,202,227,203, 3,158, 10, 73,232,220,233,143,193,167,180,203, 82, 67,210, 37,192,145, 88,170, 20, 52,150,
+230, 54,253, 90,120,113, 41,119,149, 69, 38,115,235, 1, 12,182, 7,193, 25, 9, 82,185,130, 82,117,175,119,139, 85,218,217,157,
+245,121, 66, 42,143,213, 32,176,154,170,185, 28,143, 69, 75, 2,115,178,106, 74,141,250,175, 22, 25,108,248, 12, 35, 8, 91,142,
+ 54,181,252, 5,122, 88,213,203, 28,145, 75, 78,229, 37,167, 97, 34,183,236,148, 33,148,223, 96, 69,197,183,176, 63,102,214,216,
+ 58,240,190, 68,114,250,243,152, 23, 19,199, 8,114,242, 72, 72,231, 22,188,108,205,176,101,137,213,157,138,160, 37,149,131,121,
+245, 2, 96,171,183, 20,137,123, 31,191,149, 91, 47,123,232, 85, 27, 62, 93, 6,181, 34,220,190,237,155,214,132,186,220, 88,179,
+217,150,220, 71,128,149, 75,125,138,149,169, 90, 75,203, 96,211,110, 42, 91,143,176,165,184,194,229,195,126, 59,201,121, 83,127,
+216,175,102,198,192,241,189,192, 78,211, 93,151,173, 66,131, 11,121,110, 27,122,109, 78,202,226,103,134,152,244,170, 29,255, 0,
+106, 75, 77, 80,127, 7,147,118,200,183,170, 81,169, 27,137,124, 65,102, 20, 38,171, 53, 4, 24,110,205,241, 18,226,164,123,227,
+ 13,202,211, 37,186,124, 33,108, 79, 16, 66,211,103,113,182,182,139,118, 84,173, 7,156,166,216,183, 99,192, 67,187, 32,202, 95,
+ 52,202,236,231,238, 88,201, 46,213,173,214,193, 83,203,133, 49, 50, 99,173,245,243, 52,203, 11,115,159, 93, 2,225, 42,126,233,
+240,185,105, 84,108, 74, 45, 95,108, 43, 59, 35, 69, 97,250,141, 10,138,230,217, 90,251, 48,139, 9,233, 47,173, 83,167, 92, 23,
+133,177, 85, 69, 46,182,212,244, 48,183, 86,228,216,112,223, 43,138, 95,241, 29,230,228, 19,170, 78, 41,201,115, 12,218,154,183,
+ 54,203,228, 66,244,207, 79, 57, 83,174, 48,118,211, 36,113,139, 51,236,182,144,200,197,209, 89, 4, 74, 66, 18,100,220, 71,196,
+ 25,253, 47,135,176,101, 60, 41,197, 99, 32,207,114, 92,228,102, 52,138,194,116,168,154, 25, 34,146, 41,169,214,165, 68,180,176,
+199, 36,210, 6,122, 3, 28, 20,213, 45, 28,143, 83, 37, 84,238, 34,143, 74,120, 89,225,111,121,247,111,121,238, 89,155,225,184,
+220, 82,237,142,251,112,146,253, 17,207,229,239, 14,200,188, 40,150,199, 16, 91, 53,100,203,106,223,161,219, 59,177,105,238, 28,
+ 8,141,191,184, 84,122,123,188,237, 86, 66, 93,102,187, 65,135, 61,155,146,157, 54, 68,117, 85,170, 29, 5,246,132,237, 76,171,
+ 94,215,181, 54,235,103,182,227, 99,237,219, 50,147,100,221,151,117,186,253, 38,155, 38,143,114, 90, 87, 4,106,212, 53,220,242,
+118,242,194,180,160,179, 75,166, 81, 39, 84,235,112, 68,217,140, 61,226, 50,212,247, 22, 89,118, 35, 77,235, 83,184,202,246,199,
+112,111, 70,219,122,181, 6,171,108, 65,226,231,125,105,213,122,204, 75, 11,108,236, 27,130,252,141,176,118,155, 98, 2, 33,193,
+175,238,213,251, 13, 81, 98,223, 52,197,206, 75,206,187, 71,165, 38,170,196,168,241,155,138, 85, 9,111, 46, 98, 52, 47,111,189,
+188,183, 37,209,109, 10,103, 17, 22, 2,110,109,194,146,227,138,131,118,219,246,163,116, 11, 98,132,235,103, 52,122, 75,118,253,
+157, 38, 77, 80, 90, 17,210,101,178,248,116,206,118, 75, 83,212, 28,101,175, 1,149,162, 45,226,190, 70,185,231, 0,203,149,228,
+121,123,231,153,198,105, 91, 28,230, 88, 16, 36,112,211, 70,154,212, 24, 39,149,165, 18, 74,198, 72, 89, 35,105,100, 12, 41,231,
+158,112, 57,145,137,231, 10,100, 94, 51,241, 87, 23,112,111, 30,211,112, 52,153, 38, 73,225,242, 10, 90,124,155, 50,146, 42,116,
+ 99, 45, 52,112,243,178,218,153, 12, 21, 85, 52,171, 42,205, 88,212,181,201, 75,149,209, 37, 91, 81,100,148, 51, 81, 75, 49, 50,
+ 6,217,173,183,155,188, 84,118,173,158, 32,172,235, 87,118, 54,166,179,183,149,203,134,222,225,242, 30,215, 80,233, 54,151,241,
+165,100,213,106,245,122,156,138,221,227, 2,160,150, 46, 42,164,235,130,161, 57, 86,251,132, 51, 77,169, 64,173,174,167, 38, 59,
+ 85, 4, 56, 26, 3,109,118,123,135, 41,252, 96,110,135, 23,245,109,254,221,189,165,168,219,173, 91,123, 97, 87,216,251,190,175,
+183,219, 85, 99,219,212,155,126,209,183,217,137,183, 10,131, 66,169, 76,169,205,176,225, 70,165,194, 83,180,116,125, 88,219,175,
+148,178,243,175,199, 75,173, 59, 29, 61,249,246,206,238, 94,228,237, 61,211,181,155,117, 97, 50,205, 62,247,110,151, 14,183,114,
+ 57, 71,149,102, 55,111,211, 40,145,161,125, 74,213, 25, 54,141,222,227,180,202,188,130,169, 82, 23, 30,151, 57,136, 16,218, 83,
+108, 72, 50, 38, 25, 64,114, 67,110, 47,253,229,176,174, 10,205,199,103,238,253,237, 99, 85,238,119,154,122,231,157, 75,174,215,
+ 74,238, 7, 25, 46,152,207,214,220,157, 58, 73,170, 74,109, 18, 30, 75,110,190, 29,121,180, 44,165, 42, 9,232, 21,240,162,151,
+ 56,225, 46, 16,143, 36,205,178, 88,214,186,130,176,206,181, 50,212,206, 37,168,141, 97,228, 37, 63, 46, 9,201, 90, 37, 96,103,
+142, 25,155, 74,243, 26,157, 97,150, 33,237, 83,203,114,127,162,199,141,220, 86,188, 75, 85,151,241,125, 31, 2,167, 23,193, 83,
+150, 54, 91, 79, 78,166,152,101, 85,109, 75, 81, 85, 61, 59, 60, 98,150,158,166,174,122, 58, 72, 42,106,150,136,102, 51,123, 10,
+ 85,205,152, 73, 43, 44, 16,206,123,218, 61,196,127, 12, 59,235,177, 53, 46, 29,169, 86,189, 55,136,234,109,215, 88,166, 26,197,
+ 38, 53,233,116,109,198,223, 91,198,222, 80,171,209,234,119, 5,221, 67,164, 25,151, 10, 5, 85,136, 33,154, 93, 49, 37, 18, 15,
+233,100,202, 97,150,139,131,132,251, 87,179,251, 79,179,194,224,147,101,216,244,202, 5, 90,229,159, 17,119,149,211, 72,110, 69,
+ 46,248,110,163, 29,217, 43,129, 66,171, 79,122,116,167, 35, 90, 76, 72,147, 37,216,236, 37,215, 98,203,117,126,245, 45, 50,100,
+114,186,222,133,219, 60, 77,113, 16,220,102, 29,123,136, 11,214,170, 86,194,217,230,148,229, 46, 98, 20,211,128,115, 50,125,254,
+146,190,100,228,116,200, 4, 30,163, 7,187,151, 72,226,234,249,165, 72,105,119,173, 54,145,119,199, 91,105,138, 42,209,169,240,
+173,203,214, 44,100,188,211,178, 16,205,110,152,208,135,112, 48,176,215,197, 10,171, 13,109,124, 69,109,200, 97, 95, 24,214,226,
+126, 46,204,248,131, 53,169,253, 34,207, 26, 53,144, 71, 4, 79, 21, 56, 17,133, 22,229,150,231, 57, 26, 1, 47, 34,187, 2, 44,
+ 52,198,170,139, 50,202,126,130,126, 47,120,111,192,109,194,252, 57,154,229,220, 65,148, 9,205,116,180,137,154,214, 10,186,170,
+162, 10,137,109, 91, 69, 71,150,198,235, 25, 10, 22, 25,169,163,100, 69,105,125,166,116, 70,126,237,240,173,188,242,233, 18,100,
+237, 93,235, 42, 60,202,109,114, 92,138,190,220,221,209,196,104,148,181, 76, 74, 16,170,157,149, 92,105,110,132,210, 43,242, 74,
+ 19, 42,158,164,115,198,158,234, 36, 48,143, 6, 66,144,210,247,177, 85,202,124, 85, 41, 50, 23,238,234, 96,171,220, 84,131,201,
+ 81,167,186,242, 66,220,103,194,112,116,136,167, 49,204,218,135, 38,114,149, 36,142, 82,142, 24,109,205,249,100,111,109,188,154,
+141,169, 87,121,132, 69,149, 25,154,133, 12, 70,102, 35,244,170,162,202,228,211,227,215,160,171,156, 70, 90,220,109,197,198,112,
+ 60, 25,150,134, 86, 98, 60,242,193, 74, 54, 70, 21,203,185,137, 49, 41,209, 55, 38,242,181,228,211, 26, 17,157,129, 46,114, 42,
+180,121, 76,135,128,240,207,214,112,156,148,134, 86, 18, 75, 79, 49, 33, 50,163,165,120,248,146, 57, 73,105,106,159,147, 26, 7,
+ 37, 20,121, 74,249,129, 29,199, 81,176, 38,192,147,176,176, 11,229, 39, 28,113,196, 92, 57, 81,148,103, 21,249,110,121, 69, 46,
+ 69,155, 81,200,201, 87, 73, 60,114, 67, 44, 19, 46,155,235,139, 65,117, 46,165, 73, 11, 30,131,175, 80,250,185, 64,199, 74,170,
+247,117,187,111, 83,215, 94,171,203,137, 65,135, 79, 67,143,174,161,207, 41, 13, 62,140, 15, 16, 83, 24,105,167, 37, 84, 28, 81,
+ 82,130,227, 69,105,245, 45, 71, 41, 66,191, 91, 76,133, 87,124,171,187,130, 29,167,217, 76,213,237,251,106, 66,189,205,119,162,
+ 28, 98, 37,199, 86,142, 16,162,185, 54,235, 12, 41,106,181,161,242, 45, 99,199,119,154,162, 48, 80, 81, 16,158,154,182,205, 62,
+117, 86,178,221, 66,238,151, 81,166,214,156, 82,227, 66,168, 73,171, 77,171,198,152, 82,188,180,236, 27,145,222, 95,115, 36,148,
+242, 70, 81,136,160, 29, 56, 67,138, 29, 54, 42,202,179,153,139, 37,154,143, 44,138, 93, 90,115, 13,179, 42, 84, 55, 84,228, 58,
+130,154, 32,177, 34,167, 76,116,248, 83,164,158, 85, 21, 58, 66, 29,194,202, 84,242,134, 53,191, 74, 37,168,148, 34, 92,139,239,
+126,187,219,125,133,150,228,146, 47, 98, 55,179, 1,136, 86,103, 62, 91, 69, 8, 36,153,106, 8, 60,182,111, 58, 40,216,157, 54,
+ 98, 36, 0,234,243,171, 58, 3,101,229,106,179, 43,139,104, 91, 70, 44,120,176,217, 45, 59, 21,146,164, 50,232, 71, 43,133,111,
+117, 90,230,100,144,252,149, 40,149, 41,210, 74,150,181, 21, 44,149,171, 39, 97,160,209,196, 74, 98,138,211,204, 1,101, 39, 41,
+232,160, 84, 80, 91, 86,122, 5,117,207,217,171, 93,167, 74,230,109,190,118,227,151, 50, 18, 67, 73, 80,101,207,212, 10, 45,182,
+190,169, 65, 32, 16, 14, 72, 61, 50,113,157, 59,206,211,128,167,184,215,134, 84,218,139, 67, 9,202,136, 9, 81,207,134, 79,235,
+ 28, 17,243,252,113,169,165, 53, 56,166, 68,176, 35, 72, 23,245, 29, 5,183,191, 78,155,254, 24,174,234,171, 13, 76,138,146,157,
+228,111, 49,216, 94,228,111,219,173,201, 22,181,250,250,130,207, 61, 76, 83, 78,129,201,136,206, 30,102,214, 63,241, 74, 61,219,
+ 81,242, 79, 81,141, 92, 33, 83, 11, 11, 43, 74, 70, 79,235,128, 48,146,159, 95,183, 89,187, 48, 16,248,113,190, 78,100,130, 82,
+160,176, 65, 32, 28, 5, 99,215,168,252, 53, 65,216,162, 34,146,199,235, 39, 31, 2,200,193,233,215,144,231, 79, 81,206,164,117,
+233,252,125,253,240,213, 89,206, 82,241,176,243, 14,190,132,117, 7,227,110,189,143, 94,183,197,134,155, 9, 14, 77, 73, 35,160,
+115, 31,105,236,123,140,118,214,207,217,208, 91, 67, 45, 2, 19,212, 36, 12, 14,163,212,156,142,135,247,233,135,163, 69, 10,155,
+158, 95,135,196,200, 0,103, 57,200,252,115,173,138,183, 84,150, 18,214, 79, 47, 42, 82, 64,200,200,192, 25, 63, 34, 51,173,102,
+107,129,181,255, 0,158, 33, 53,234,201, 4,224,108,194,246,251,207,207,175,124, 57,232,109,180, 51,202, 72,248,130,113,142,248,
+ 78, 0, 31, 35,235,246,233,191,188, 42,206, 66,108,193,167,132,253,103, 41,181, 0, 71,255, 0, 2,140,174,134, 73, 35,245, 92,
+ 39, 33, 30,121,235,229,171,141, 90,228,106, 11, 32, 52, 80,236,183, 73, 12, 70, 4,229, 74, 7, 30, 43,152, 63, 3, 41, 29, 84,
+123, 28,224,100,235, 5, 13,173,197, 57, 46, 67,138,125,249, 46,120,146, 95, 88,253,117,156, 97, 40, 39,245, 91, 0,225, 35,176,
+ 29,180,142,179, 80,220,168,205,149,126,211, 15,223,164, 16,122,250,158,195,208,145,134,108,155, 45,116,149,107,106,210,241, 41,
+186,161,255, 0,120,194,221, 71,236, 47,127,218, 35, 79, 77, 86,176, 66,163, 8,205,225,197, 43, 56, 37,105, 65, 56, 36,252, 75,
+ 82,212,174,171,112,149, 28,156,245,207, 93, 15, 45,216,241, 57,146, 57, 27, 56,200, 72,192, 89, 78, 15, 85,168,159,128, 99, 39,
+226, 63, 33,223, 89, 20,167,114,130, 10,130, 80, 72,248, 26, 31, 30, 65, 0, 16,165, 3,208,231,174, 61, 61, 53,129,212,188, 52,
+ 7, 20, 82,214, 78, 74,148,226,186,164,228, 18, 84,181,103, 36,244,238,122, 30,157, 53,185, 26, 44,106,170,160, 1,238,236, 54,
+253,214,249,247,206,169,100,122,153, 25,234, 36,251, 71,160,233,212,122,216,124,236,119,197,146,116,196, 43,156, 23, 20,234,176,
+ 66, 83, 24, 44, 50, 18, 79, 66,235,132,167,159, 61, 50, 50, 18, 9,206, 15, 83,172, 58,116,165, 37, 64, 4,182,218, 73,199, 59,
+139, 10, 82, 73, 66,186, 33, 13, 30, 94, 96,174,108,228,231,168,198,123,139,140,202,131, 79, 30, 70,148,227,238, 33, 74, 65,102,
+ 43, 97,196, 54,147,211,226, 81, 41, 74,129, 0,103,226, 56,236, 70, 51,172, 78,114,228,243, 5, 43,193,100,115,243, 36,120,134,
+ 75,201,194,128, 42, 71, 54, 17,204, 60,206, 74,114,122, 18,116,112,214,210, 59,223,241,219,240,190,226,251,116,251,158,201,176,
+ 10, 23, 73, 61,143, 95,141,182, 61, 58, 16,167,226,118,197, 23,220, 24, 42, 82,202,147,250, 50,234,130,146,217, 45, 36,168,133,
+ 45, 94, 71,175,197,215,174, 49,223,174,177,233, 50,208, 66,131,105, 61,214, 66, 64, 78,114, 64, 32,244, 61, 27, 42, 36,100, 30,
+ 80, 0, 29,250,232,185,104, 66, 49, 33,199, 21,150,220, 43, 66,158, 90,158, 9, 94, 72,229, 74, 84,180,165, 36,173, 63,234,146,
+156,146, 6,173,114, 20, 80,180,165, 72, 80,112, 20,145,206,164, 41, 92,139, 1, 96,182,144,172, 56,130, 20, 14, 50, 0, 39, 56,
+233,141, 46,141, 98, 54,244,254, 95, 29,247,198,133, 76, 90,206,166, 58,175,233,178,237, 97,238,254, 93,189,215,178,204, 42, 33,
+ 93, 64, 42,248,136, 81, 57,235,147,209, 95,205, 61, 51,156,117,229,239,140,107, 16,158, 7, 42,147,206, 74,138, 85,241,171,148,
+ 17,140, 96,145,216, 96, 12,125,253, 6,178,233, 89, 1, 42, 89, 0,224,140, 40, 16,146,179,204,164, 55,201,216, 60,158,153, 29,
+114, 59,100,118,197,106, 10,207, 40, 35,170, 73,230, 36,114,149,103,155,161, 9, 87, 86,241,147,231,213, 88,193, 58, 92, 49,218,
+223,135,110,159,187,221,238,253,216,103,145, 0, 34,219,123,186,124,143,147,136, 13,251,114,237,134,237,143,105, 46,242, 73, 13,
+ 22,133,233,109,109,125,248,227,197, 1, 40,126, 69,118,199,166,197,148,182,249, 0,241, 0,122,146,174,101, 31,136,168,158, 98,
+ 78,117,200,194,180,168,126,137,101, 88,239,233,246,107,183,127, 72, 24,180,175,104, 99,158, 27,161,215, 19,195,254,205, 37,246,
+129,255, 0, 34,180,195,184,124, 52,148, 17,150,202,152, 45,175,169,201, 11, 7, 0, 99, 92, 70, 83,105,199, 81,140,246,229,242,
+249, 29, 75,178,155,181, 13, 41, 59,217,109,211,176, 36,116,235,219,242,199, 51,241, 50, 44,124, 69,158, 34,159, 47,181,212, 31,
+255, 0,116,172,199,247, 18,113, 76,168, 40,116, 72, 29, 62, 47, 63,188,117,208,235, 35, 24,207, 92,244,254,221, 86, 40, 35, 62,
+152,207, 95,232,251,116, 51,133, 67,168, 78, 71, 81,243,251,244,236, 6,194,221, 48,206,160, 29,173,211,161,253,216,162,179,229,
+143,191,211,175,217,170, 11, 0,227,176,245,245,199,175,207,160, 58,244,188,254,177,201, 82,124,188,177,231,246, 29, 81, 39, 39,
+ 58, 93, 70,194,221, 63,158, 20, 24,164,230, 60,136,232, 72,244, 39,183,109, 12,178, 9, 61,242, 59,122, 30,223,214,116, 74,241,
+130, 73, 3, 7,167,246,245,213,189,240,234,136,240,212,148, 97, 95, 22, 70, 74,128,236, 58,249,233, 68,235,140, 3,126,155,227,
+193, 36,156,254,113,165,175, 10, 63,237, 99,238,206,116,180,125, 62,182,191,207,191, 25,199,180,146, 15, 65,159,151,174,171,165,
+ 93,142, 58,142,227, 61, 70,135, 31,120,254,145,251,117, 92, 96,245, 30,127, 46,250, 37,188,191, 15,195,231,231,124, 12, 86,241,
+ 19,156,117,235,231,142,159,126,136,111, 10,193, 74,187, 28, 99, 24,201, 62,191,136,252, 53, 65, 9, 0,131,220,244,251, 58,232,
+164,225, 61,178, 7, 94,221,254,236,246,210, 76, 24,139,124,252,223, 25,219,239,197, 69,160,168,119,233,221, 93, 78, 6, 49,216,
+125,186, 33,164,115, 36, 40,247, 29, 66, 71,160,233,235,170, 64,133, 15,207,113,215, 69, 36,242,224,244,244, 35,208,105, 34, 0,
+ 39,190, 49,143,104,101, 42,238, 57, 85,215,168,198, 72,251,188,244,123,104, 72, 72, 24,201, 79, 78,191,187,166,132, 65, 39,226,
+ 72, 25,244, 39,167,152,251,180, 90, 22,144, 1, 87,195,147,231,252,236,250,124,244,153, 23,216,158,159,233,140, 17,124, 28,214,
+ 58,114,244, 24, 61, 62, 93,191,167, 70, 32, 12,103, 39,230, 60,137,199, 94,154, 13,178, 23,215,168, 29,253, 59, 99,250,245, 93,
+ 11, 73, 95, 47,114, 62,127,102,127,103,150,147,194, 39,221,190, 13,108,129,145,140,228, 16,160, 70, 82,164,158,133, 36,121,130,
+ 9,200,212,133,253,149, 30,214, 40,187, 66,197,191,195, 39, 20,245,169, 15,236,235,143,162, 14,220,110,140,213,189, 54,163,181,
+211,100,184, 17, 30,135,114, 58,162,165,203,177,148,226,240,211,164,149, 65,206, 21,150, 70, 83, 30,118,242, 14,122,121,126,206,
+218, 33, 39, 37, 68,227,168,229, 32,128, 82, 65,232, 65, 7,184, 56,237,231,157, 55,102, 89,109, 54,103, 78,208, 84, 37,251,171,
+ 11,106, 86,236, 71,240, 32,236, 71, 81,211, 14,249, 22,123,153,112,230, 99, 22,103,149,205,202,158, 63, 43, 43, 92,199, 44,100,
+130,209, 74,160,141, 72,214, 29,195, 41, 1,144,171, 0, 71,233,189, 78,163,199,149, 6, 5,118,137, 50,159, 88,161, 86, 97,179,
+ 50,145,112,209,228,179, 81,164,214, 32,202, 66, 93,106,101, 62,161, 25, 74,109,214,150,210,146, 82, 66,186,115,105,198,165,210,
+220, 45, 54,156, 0,210, 18,130, 16,156,144,132,160,130,113,234,163,215, 63,102,191, 63,142, 13, 61,168,188, 90,112, 88, 35, 91,
+187,121,119,179,119,109,106,165, 54,185,123, 83,184, 1,218,213,172,195, 74,112, 25, 31,193,231,222,112,191,110, 58,164, 21,224,
+ 48,176,215, 49, 7,195,198,117, 59, 45,161,226,130,149,124,109,157,131,126, 59,105, 34, 25,190,109, 42, 53,196,184,241, 30, 15,
+198,138,237, 78, 35, 82, 31,140,211,167,245,219, 66,220, 41, 7,190, 19,170,167, 56,203,165,200,101,140, 85,149,104,230,213,203,
+101,189,155, 78,155,220,117, 82, 3, 46,198,227,123, 43,181,137,199, 98,248,121,226, 4, 60,107, 28,144, 81,211, 52, 25,134, 94,
+168,243,195, 33, 13,165, 88,233, 15, 20,151, 2, 68,212, 8, 23, 84,117,184,212,128, 27,157,174,166,211,138,218,110, 68,166,202,
+ 12,226,136,177,129,232,166,216, 72,248,148, 83,159,213, 41, 3, 58,199,247,101,136,115, 44,202,189,191, 58, 53, 62,165, 75,147,
+ 13,232,255, 0, 85, 84,225, 70,168,193,124, 22,212, 1, 92, 57,109,173, 42, 25,207, 92,107, 7, 94,247, 82,222, 44,120, 49, 37,
+ 54,166,153, 62, 27, 97,162,180,183,147,212, 19,228,122,244,251, 53,166, 60, 82,241,139, 69,219,203, 98, 69, 54,140,180, 86,247,
+ 30,234,150,139, 66,201,183, 25,149, 29,233,234,185, 42,196, 70,134,169,113,219, 89,247, 70,154, 91,161,107, 46,114,242,132,100,
+244,206,153,205, 97,168, 2,158, 4, 44,100,219,125,135, 64, 78,228,219,222, 73,244,222,221,174, 76,131, 35,204,179,124,218,130,
+135, 45,164, 51, 85,202,227, 76,106, 62,206,255, 0,109,219,126, 90, 70,190,103,145,136, 84, 93, 78, 72, 23,191, 48,247,123,113,
+ 54,107, 98,106,146,105, 9,180, 41, 21,123,162,141, 80,151, 62,153,110, 91,228, 81,105,212,218,178,156,241, 34, 77,169, 72,130,
+226, 75, 2, 57,229, 90, 91, 71, 95, 19, 25, 61, 49,174,102,239,183, 16, 27,245,196,245, 64, 82,110,171,182,181, 46,217, 96, 6,
+ 35,218,212,137, 51, 32,219,108,198,105, 92,201, 85, 69,199, 30, 6,166,164,128, 10,220,112,144, 72,251, 53,214,202, 31,178,178,
+163,118, 58,154,214,227,110,196,250,141,229, 94, 90,234,215, 82,232,240, 89,168, 70,166, 84,170, 4,190,168, 41,121,249, 0, 76,
+ 90, 29,119,151, 56, 9,248, 73, 25,214,146,202,219, 91, 51,104,184,161,111,104, 55, 2,101, 83,114, 54,198,194,191,169, 77,110,
+ 68,221,177,164, 63, 85,175,214,237, 88,241,211, 82,147, 76,141, 78,128, 22, 91, 87,142,150, 98,205, 74, 85,132,248,171,248,142,
+ 53,173,150, 83, 84, 83,203, 81, 44,142,139,160, 27, 2,160,233, 3,114,117, 16, 12,141,127, 70, 80, 9, 35,125,241,233,239,130,
+ 41,224, 38,103, 13,117, 54, 67,153,205,226, 87, 28,112,190, 95, 45,125, 92,210, 83, 86,187,242,226, 42,178,174, 80,149,113,165,
+ 44, 65,229,100,134, 4,141,150,122,141, 81, 51, 73,162,237, 30,168,196,225,210,109,131,180,183,158,251, 93,182,173, 90, 77,131,
+ 96, 89,181, 75,242,173, 86, 98, 49,102, 9,183, 41, 18, 99, 82,213, 61,169,147, 28,108, 26,115,213,233,208, 41,241,139, 73, 89,
+155, 50, 88, 98, 57, 82,144,225, 71, 44,173,110, 47,174,107,174,254, 98, 13, 58,249, 85, 6,131, 87,171, 39,220, 44,241,181,244,
+153,180,166, 32, 5,149,154,122, 42,162,227, 19, 75,165,128, 71,188, 56,178,174,115,204, 82,145,128, 36, 3,237,235,223,234,222,
+215,112, 55,182,219, 31, 86, 98, 61,181,187,220,112, 95,208,183,126,253,180, 97, 54,220, 21,109,191, 13,155, 89, 33,113, 54, 95,
+106,218,165, 50, 18, 40,148,150,231,154,107,198, 55, 42, 67,242, 41,179, 93,113, 42,113, 74, 86,162, 97,177, 48,209, 39,113,161,
+ 58, 64, 13,211,225, 75,148, 51,140, 36,165,190, 84,143,159, 65,171, 75,135,178,168,107,242, 90,172,214,180, 51, 59,234, 16,134,
+ 17,190,133, 64, 20, 55,158, 54, 2, 70,146,225,136, 0,174,157, 43, 97,185,243, 63,233, 63,244,231,241, 66,159,196,102,225, 15,
+ 14, 51, 37,224,188,143,132, 9,142,161,114,156,207, 55,165,122,154,211,180,201, 83, 95,148,230, 89,116,181,212,212,192, 8,224,
+ 5,150, 25,142,186,190, 84,124,245,138, 25,117,109,141,230,157,201,225, 47, 99,174,184,147, 81, 37,251, 42,185,185, 27,109,239,
+116,234,109, 66,219,122, 4,155, 82,247,170, 85, 97,120, 77, 63, 82,121,198, 42, 45, 83,110,106, 65,247,182, 36,165, 14,184,226,
+150,194, 25, 9,113, 3,110,182,151,139,125,212,183,132,104, 23,139,113, 55, 18,137, 24, 33, 42,171,202,150,138, 77,231, 10, 58,
+ 80,148, 41,215,106,105,101,113,238, 23, 2, 0,109, 6, 99, 41,127,224, 0,190, 84,115,174, 89,251, 50,110,182,111,109,161,226,
+ 3,101, 36, 58,211,149,138, 21, 94,218,222,203, 78, 35,202, 81, 46, 82,231,199, 69,129,126,193,167,180, 63, 93,214,103,194,179,
+170, 50, 48, 15, 42,103, 21,168, 17,147,174,130,217,182, 49, 51,154, 91,177,188,102,144,164, 58, 35,144,191,242,169, 25, 99,159,
+148,124, 72, 7,226,207, 80, 49,207,131,216, 83, 92, 69, 69, 29, 6, 99, 95, 73, 34,235, 8,250,148,236, 9, 14, 17,197,138,133,
+ 2,215,210,116,217,110,164, 91, 97,105,119,134, 62, 33,208,248,151,225,118, 89,196, 28, 81, 28, 85,249,213, 91,213,189, 89, 99,
+ 36,143,237,143, 83, 41,169,117,146, 89,165,169, 6,105,139, 75,170, 73,228,145,245,134,150, 73, 9, 44,122, 97,110,111,221,149,
+120, 67,165,189, 58,161, 34,214,201,105,134,233, 55,148, 69, 83, 11, 50,221, 90, 92, 68, 40,213, 72,110,200,135, 46, 73, 41,108,
+171, 14,167,245, 84,130, 65,200,211,166, 94,171, 84,102, 51, 47,194,143, 89,131, 9, 5,184,240,105, 85, 40,147,218, 74,222, 40,
+ 89, 97,227, 2, 67,137, 97, 78,252, 5,254,110, 85,114,132, 39, 9, 72, 32,233, 93, 14,201,122, 65,143, 22,156,212, 69, 86,100,
+ 46, 44,135, 38, 57,135, 33,219,180,231, 22,234, 83, 60,161,192, 10,170,170, 8,144, 33,178, 71,233, 29, 30,242,191,208,181,133,
+191,182,125,129, 22,137, 24,184,219, 16,105,244,122,116,229, 24,172,196,140,227, 51,106, 82, 37,172, 0, 92,153,226, 37,249,213,
+ 57, 83, 22,165, 18,225, 82,222,113, 69, 74, 9, 71,234, 68, 9,208,198,209, 94,219,218,228, 15, 83,112, 65,184, 62,227,110,189,
+109,178,169, 62, 83, 5,218,149,249, 37,181, 42,198, 87, 89, 80,199,253,217, 86, 70, 70, 98,204, 20,146, 89,197,201,101, 22,230,
+ 59,242, 41,215, 69, 77, 73,128,236, 67, 18, 58,167,154,138,231, 60, 4,102,158,150, 80, 82,130,218,157,115, 45,198,101,174, 84,
+165, 1, 68,114, 52,130,156, 99, 89, 45, 34,212,134,228, 73, 16,146,227,205,181, 1,201, 78, 77,171, 38, 42,218,143,227,144, 4,
+201, 12,201,115, 36, 71, 12, 32,165, 43, 3,226,248,212,144, 10,146, 53,126,180,172,233, 73,154,154,212,168,202, 93,197, 80, 97,
+136,104,140,211,242,100,192,162,196,109,194,166, 41,208,221,148,163,201,135, 23,227, 62,232, 78, 95,127, 36, 0,218, 27, 1,238,
+160, 90,138,170,136,112, 34,196,122,116, 24,179, 26, 97,224,201, 66,151, 91,158, 22,121, 26, 8,112, 2,184,136,155,133, 28, 30,
+ 89, 15, 32, 1,204,132,117,220,138, 25,100, 69,141, 33, 42, 95,185,185, 36,108, 64,216, 41, 3,125, 76,119, 96, 54,234,214, 58,
+ 53,249,220, 11, 78,232,142,144,194,128, 23,101, 1, 6,175,214, 62,103,112,219,249, 82,197, 84,238,108, 17,110, 52,139,118, 47,
+ 29,184,225,215,110, 42,187,173,184,204,207, 72, 80, 85,167,183,182, 36, 9,173, 70,184,111,106,192, 66,170,116,219,106,146,227,
+200, 80,164, 50,235, 10, 77, 66,191, 84,117, 10,106,153, 79,228, 73,241, 36,174, 36,119,184, 21,190, 59,243,185,156, 69, 84,159,
+170,238, 77,125,233,212, 64,224,114,153, 96, 80,157,149, 74,219, 91,113,168,200, 9,139, 79,161,218,173,191,225,204,247,118,130,
+ 18,103,207, 18,106, 18, 92, 10,125,231,194,214, 80,151,139,218, 61,196, 11, 91,199,196,197,237, 22,149, 81, 84,157,189,217,229,
+191,180,182, 2, 88, 11, 17,100, 68,160,212, 84,221,239,112,178,210, 9,241,102,214,111,225, 52,151, 48, 84,168,148,168, 76,161,
+ 74,109,180,160,115,231,137,235,103,118, 56,127,147,104,217, 55,156,251,107,111,175,235,178,220,141,117, 86,109, 75,154,123,113,
+238, 29,183,163, 87, 2, 87,106,211,239, 74, 50,150,145, 64,189,234,148,231, 29,158,154, 36,149,174,165, 75,167,166, 52,138,188,
+ 24,138,159, 21,133,236, 83,112,252,185,180,169, 8,169, 20,176,234, 0, 18, 88, 7,176, 39, 89,211,114,119, 4, 70,189, 44,161,
+148, 22,190,159, 75,188, 43,225,207, 12,190,140,158, 22,229, 62, 49,120,177, 11,207,199,124, 79, 74, 43, 96,166,138,138, 92,199,
+ 54,166,167,120, 99,153, 50,252,166,134, 37,121,162,150, 40, 36,137,243,154,231,228, 65, 75, 44,172,185,141,117, 61, 12, 49,202,
+ 64,184,109,119,103,132,181, 74,129, 79,134,194,135, 43,190,237, 21,191, 29,100, 96, 37, 40,117, 73, 82, 99, 35, 32,124, 88, 42,
+ 63,170, 53,226,221,219, 54,154,144,210,159,144,184,110,188,191, 9,111, 50,130,176,158,110, 80, 84,251,171,202,128, 1, 93, 73,
+229, 25, 56, 37, 0,140,233,155,215,238,236,178, 81,245, 6,230,196,184, 38, 72,117,114,146,204, 10,157, 18,124,222, 68, 55,238,
+229, 13,192, 85, 62, 51,171,139,134,207, 35, 41,140,233,231,202,146,147,144,117, 96,166,239,230,251, 91, 78,170, 52,187,154,100,
+238, 69,175,198,143, 95,161, 83,106, 18,154,101, 79,165,231,152,117,164, 67,133, 45,134,212, 82, 91,194,156, 5, 45, 44,164, 2,
+ 66, 84,155, 34,147,133,243, 36,165, 20,116,217,188, 35,151,238,126, 97, 4,254,177,125, 68,239,211, 82,223,173,172, 0, 24,167,
+179, 47,246,170,125, 30,232,243,104, 31,139,124, 24,227,142, 30,161,169,102,142,147, 50,172,203, 50,121, 41,229, 42, 69,218, 3,
+ 30,118,241,202, 0,243,200, 41, 94,165,129, 22, 42, 88,227,163,116,203, 17, 8,185, 93,183,106,208,252, 38,221, 75,239, 69, 82,
+148,212, 98,226, 86,217,118, 44,165,167, 9, 65,101,223, 60,148,144,181, 96,168, 43, 0,252,174, 91,214,181,183, 10,117, 86,179,
+ 50,153, 73,166, 83,194,214,252,233, 83,209, 26, 43, 44,162, 64,140,219,206, 58,234,210,112,235,191, 11, 64,100, 44,244, 4,168,
+145,172,123, 98,119,186,189,184,148,118,141, 70,148,197, 50,191,111,207, 66,201,167,161,249, 52,249,241, 42,212,229, 7,204, 15,
+126, 66, 92,110, 3,140,161, 73,118, 19,202, 81, 97,108,148,161,199, 27, 91, 78,107, 86,119,238,216,221, 43,230,252,250,182, 13,
+ 58,183, 46,147, 70, 13, 38, 4, 56,116,185,179,162, 69, 46,180,223,141, 81,142,184,140, 41,147, 41,114, 84,242, 75,171, 82, 84,
+194, 91, 72,230, 64, 90,214,181, 33,200,201,170, 43, 89, 94,208, 24,128, 15,166, 66, 20,216, 3,112,111, 96, 88,110, 78,159,118,
+155,220, 99,160, 60, 98,250, 99,112,207,134,255, 0, 71, 46, 29,250, 64,120, 83,195, 50,248,169,148,241,245, 69, 30, 93,144,193,
+ 67, 79, 83, 28, 82,215, 85,189,122,153,115, 32,105,154,178,134, 26,105,168,101,163,146,156,211,189, 75,102,130, 44,173, 68,114,
+ 77,207, 71,110, 15, 18, 59, 61, 18,251,183, 45,234,180,107,233,187, 1,250,171, 17,238,235,214,213,164, 83,170,247, 53, 22,146,
+247, 59,114, 43, 22,149,141, 85,159, 17,119,100,134, 63, 68,234,163,187, 34, 18,164, 53,206,152,138,117,244,161,183, 58,193, 87,
+225, 15,135,235,154,206,165, 93,187, 71,198, 37,215,186, 16,174, 74, 84,106,197,183,252, 7,217, 27,135,115, 66,233,111,133,248,
+ 82,110, 88, 27,108,185, 18, 44, 98,226,138,217, 76, 74,176, 98,168,211,208, 31, 14, 67,113, 0, 40,199,138, 77, 58,219,219, 50,
+244,105,201,133,114, 94, 12, 56,227, 82,225, 41,246,106, 20,107,126, 74, 1, 10, 21,105,145, 29, 83, 87, 29,105,183,135, 90, 99,
+ 14, 24,108,168,230,161, 33,210,145, 21,121,134,197,241,157,196,167, 13,119,204,187,239,101,247, 94,228,180,103, 85, 93, 74,238,
+122, 27,239, 11,130,196,190, 89, 74, 3, 65,139,247,111,234,106, 52,187,152, 37,129,200,203,193,152,211, 98, 54, 3,112,101,197,
+108, 4,133,235, 56, 58, 10,228, 87,202, 71,178,152,134,242, 75,119, 19, 27,222,225, 88,150, 31,254, 96, 54, 34,214,141,213,129,
+ 30, 77, 63,251, 74,190,146, 28, 63,196,245, 21, 94, 41,241, 81, 90,138,137,238,120,103,135,232,114, 90, 51,145,166,250,161,204,
+ 42,243, 28,191, 56,115, 80,172, 17, 36,201,106, 30,171, 49,165, 99, 58,215,215,101, 85,180,199, 46,155,165, 84,250,206,231,112,
+167,186, 84,202,229, 58, 84, 41,147,169,133,248,238,197,175, 91,119, 93, 18,221,187,232,146, 84,224,168,218,183,125,171,122, 80,
+169,146, 69, 62, 91, 77,165,197, 50,182,199,186,202, 90, 37,197,125,153, 76,161,221, 73, 67,102,161,181,186, 27, 75, 97,238,133,
+149, 75,174, 53,111,223, 86,211, 87,109, 54,213,185, 35, 77,146,237, 17,137, 14,200,167, 84,169, 77, 86, 23, 24,190,212,104, 85,
+ 56,114,217, 98, 72, 75,241,159,101,166,228, 0, 16,240, 9,226,206,213,123,125,246,154,253,183, 26,179,248,203,225,125,202,139,
+ 46,178,168,179,235,251,104,229, 22,255, 0,179,166, 52, 82,164, 41,247,246,211,115,158,110,161, 69,150,180,149,143, 14,155, 84,
+150,134,210,172, 54,180,249,236,206,213,123, 69, 61,143,214,236,216, 85,123,123,115, 55,238,195,166,195,122, 53,197, 19,108, 46,
+ 26, 79, 16, 44,236,253, 26,226,128,250,223,131, 85,141,183, 84,234,188,232,106,173,199, 90,212, 89,142,137, 15, 83, 81,144,125,
+209,101, 40,228,141, 47, 10,102,180,149, 86,154,156, 24, 92, 29,108,129,135,154,226,204, 2, 44,137,115,111, 54,226,254, 93,182,
+ 24,147,120,185,244,188,240,119,233, 7,195,249, 54,103, 93, 17,224,159, 17,114, 33,203,106,209, 45, 37, 92,121,173, 8, 71, 34,
+150,170, 58,150,200,101,166,150, 41,220, 61, 44,139, 5, 76,112,171,213, 71, 20,136, 39, 4,118, 6, 29,186,134,194, 27,148,195,
+193, 62, 44, 68,187, 21,106,102, 84, 30, 70, 85,205,142, 80,158, 87,201, 81, 7,153,192, 0,192, 80, 64,211,149, 66,165,180,203,
+136, 67,104,240, 27, 90,130,130, 17,226, 37,166,148,162, 1, 67, 73, 94, 66, 83,252,227,140, 39, 39,160,215, 35, 46,223,110, 95,
+179,178,219,105,233,244,219,195,120, 47,233,139, 89,112, 67,182,118,102,191, 77,247,149, 21,115, 41,196,213,175, 41,244,200,241,
+ 80, 85,142,139,201,194,137, 9,207, 77,115,159,136,255, 0,164,222,229,137, 30,163, 15,134,190, 13,228, 85,153, 9, 87,213, 91,
+165,191, 87,204,167, 45, 40,174, 45, 76,182,204,169, 86, 14,216,198,101,228,255, 0,133,202,109,178,212,219,137,132, 41,194,148,
+158, 96,180,131, 37,202,248,118,182, 90,133,138, 42,118,185,221,117,133, 75,133, 32, 29,216,168,185,189,236, 14,163,109,129, 0,
+219,143,243, 63, 16,184, 90,150, 55,105,115,232, 42,165, 31,169, 77, 42,212,177, 32, 14,130, 18,226,224, 0, 53, 57, 0,216,238,
+ 55,196,195, 45, 68, 22,211,205,146,176,133, 54,151, 20,132, 15,133,229,231,144, 40,224, 37, 5, 65, 39,151,155,148, 18,158,152,
+235,167, 48, 77, 75,205,166, 35, 10,241, 36,158, 64,164, 52, 60, 79, 9, 9,207, 48, 83,160,114,149,103,148, 96,103,182, 73,215,
+230, 7, 43,219,203,237, 79,157,190,246,230,253, 61,196,180,212, 75,181, 94,156,213, 51,101,233,182,221, 22,223,225,210, 69, 2,
+168,227, 11,169,218,181,125,167,162,176,212,122,212, 25, 8,142,218,126,176,154,244,170,211, 68, 7, 88,168,182,234, 82,177,213,
+203,167,233, 12,113,211,199,133,235,182,188, 54,240, 99,176,227,101,238,251,254, 37, 46,135, 81,183,246,214,113,190,247, 95,112,
+ 47, 39, 98, 37,203,129, 54,157,199, 86,136,195, 22, 53,140,193,106, 91,252,225,149,204, 98, 19, 75,118, 84,180,165, 7, 18,169,
+178, 74,170, 69, 51, 56, 73,209, 23, 81,210,224, 42,219,115,204, 50, 5,109, 34,219,149, 87, 3,115,219, 16, 36,241, 71, 32,204,
+ 22, 85,167,138,163,219, 12,129, 32,128, 37,228,152,177, 1,116, 88,216, 92,246,107, 17,218,230,195, 19,125,171, 92,246,205, 30,
+ 90, 32, 84,171,244,168,149, 5, 16, 61,205, 83, 89,247,180,147,216, 56,218, 23,148,121,247,198,178,122,125, 22, 5,114, 40,154,
+138,154, 22,210,134, 80, 99,180,183,112, 79,162,136, 1, 95,118,123,235,152,220, 17,123, 63,247, 3,103,237, 26, 77,219,197, 85,
+255, 0, 51,114,119,174,160,202, 42, 21, 90, 12, 74,180,170,149,181,104,202,120, 37,197,211,222,171, 73, 81,114,229,171,182,181,
+ 40, 63, 37, 88,100,184,149,120, 41,228,194,143, 75,153,101, 48,185, 91,107,153,134,155, 1, 8,109,165, 41, 41, 74, 64, 1, 32,
+ 4,224, 99, 3, 80,103, 78, 51,204,101,157,185,180, 57, 21, 10,146, 34, 81, 20,149, 19,184,236,206, 95,148,177,131,216,104, 15,
+110,168,167,108, 60,209,182,123, 57,246,138,169,146,133, 91,117,142, 38,105,152,127,215, 43, 89, 24,145,251, 10, 7,241,197, 84,
+154,117, 14, 91, 72, 18,147, 35, 46,114, 97,104, 83,107, 42, 39, 25, 0,249,254,115,167, 66, 11,229, 77,120,141, 0,191,209, 21,
+ 33, 25,229,241, 84, 82, 74, 83,146, 59,103, 90,221, 94, 77, 82,101,118,154,148,130,244, 86,221,202,228,255, 0, 60, 39,160,229,
+ 89,254,119,200,247,211,203, 6,164, 88,105,150, 65,236,148,131,147,213, 56, 24,206, 62,221, 45,195,237,153,206, 43,169, 51,119,
+ 73,100,164,125, 34, 72,211, 64, 97, 96,110, 1,191, 81,243,214,210, 12,210,138, 24, 41, 40,102, 89, 57,178,213, 33,105, 1, 32,
+244, 32,111, 96, 45,125,246,219,221,139,140, 97, 48, 58,236,154,131, 46,153, 46,146, 87,204,146, 82,132, 15,242,109, 36,167,167,
+132, 6, 59,119,206,190,200,170,100,132,160, 21, 41, 56, 1, 36,134,210,133,100,156,114,158,195,191,225,170,166,170,211,105,248,
+149,212,255, 0, 59, 56, 36,156,100, 15, 64,113,246,235, 24,171,213,226, 60, 10,142, 60, 84,244, 75,137,232,164,103,245, 65, 82,
+ 71, 80, 58,100,117, 7, 79,209, 82,242,147, 69, 59,116,245, 27,159, 93,250,111,240,235,241,195,116, 85,144, 77, 56, 50,195,229,
+ 27,121,122, 40, 22, 2,202,123, 1,254, 33,247,226,229, 38, 74,212,210,138,159, 75, 96, 2, 2, 89, 3,156,146, 72,192, 46,118,
+242,234, 6,176,138,131,208,130,143, 59,105,144,180,243, 97,114, 84,183, 74, 71,117, 30, 85,124, 41, 72, 32,103,160,201,234, 15,
+ 82, 53,100,169,214,165, 52,218,131, 78,182, 91, 7, 5,229,115, 43, 41, 62,101, 9,253, 85, 99, 29,115,128,122, 16, 53,132, 78,
+168,190,250,242,169,137, 87, 33, 4, 48, 26, 80,111, 0, 28,172,132,175,226, 56, 4,128,162, 71,159, 77, 32,237, 34, 54,153, 1,
+ 86, 59,239,247,110, 15,243,248,219,221, 40,164,162, 89, 84,201, 21, 66,136,191,195,112,122,116, 32, 11,143,131, 90,221, 78,196,
+ 28, 93,170, 53, 86,220, 45,182,214,121,193, 56, 75, 24,202, 63,156,175,242,120, 8, 79,194, 49,147,208,172,140,107, 28,144,185,
+ 14,165,196,243, 54,128,227,107, 95, 40, 1,247,148, 10, 82,160,148, 36,114,161,156, 18,146,126, 53, 99, 7,225,193, 26, 21,201,
+165,223,209,170, 87, 43, 69,196,145,224,199,109, 32, 21,142, 84, 37, 68,147,135, 50, 73, 61, 7,235, 99, 61,180, 42,150, 9, 83,
+110, 45,199,193, 66,138, 91, 83,156,173,178, 57, 84,149, 20,132, 36, 4, 47, 4,158,234, 33, 74, 7,212,107, 34, 85, 36, 91,174,
+195,111,187, 14, 2, 4,136, 88, 88, 50,239,114, 9,216,252, 64,239,107,131,210,253,111, 96,106,135, 9,241, 91, 90,152,154,224,
+ 81, 10,117,183, 66,150,132,132, 32,132,199, 90, 18, 18,211, 62, 25,202,136,229, 86, 80, 71, 55, 78,180, 86,211,138, 90,218,109,
+210,132,173, 42, 40,195, 97,226,160,188,146,149, 61,202, 17, 24,252, 7, 4,147,128,148,146,114,179,143,162, 72, 66, 20, 93, 82,
+ 91, 32,243,151, 0, 13,184,226,121, 87,250, 54,210,216, 3, 57, 40,248,112, 84, 48,188,119,233,112,142, 86,234, 29, 75,124,173,
+161,158,235,112,133, 50, 75,156,174, 56,246, 66,135, 48, 3, 10, 10, 0,128, 64, 10, 4, 29,108, 70,250,118,191,227,252,183,237,
+110,134,223,125,175,163, 80,140,221,139, 15, 94,194,214,251,186,251,205,239,140,110,108, 82,150,189,228, 33,212, 54,225, 10,142,
+ 29,108, 40,168, 1,209, 40, 65, 63, 3, 28,169, 5, 42,200,193, 95, 80, 71,124, 14,168, 18,210, 86, 21,203,202, 82,160, 8, 0,
+169, 41, 24, 9, 81, 60,184, 87,196,165,224, 12, 28, 28,231,190,156,202,203, 43,100, 60,180,187, 46, 83,142,128, 90, 68,167, 20,
+ 70, 74,148,144,167, 1,235,149, 35,157, 71,249,216, 72, 0, 37, 61,155,106,154, 76,153, 41,136,149, 4,169,231,163,196, 66,202,
+129, 9,117,245, 33,158, 98,160,112, 71,136,224, 32,158,132,126, 26, 84, 48, 2,250,134,223,233,191,126,157,125,253,112,216,241,
+ 18,202,161, 65, 55, 29, 0,222,246,181,135,238, 29,126,252, 64, 99,219,127,112,181,112,123, 74,183,173,166, 28, 82,255, 0,130,
+214,206,212, 89,178, 82,176, 66, 90,159, 67,176,105, 47, 75, 67, 68,147,204,215,137, 82, 24, 35,204, 30,154,228,170,206, 51,216,
+231,166, 58, 99,237,251, 53,183, 60,121,238, 60, 93,220,227, 99,138,189,200,132,233,122,157,114,111,133,244,154,114,249,150,180,
+154,125, 6,168,171, 94, 25,104,172,228, 50, 89,161,161, 72, 29,130, 92, 0,116, 26,212,101,246, 56, 61, 59, 96,227, 63,241,212,
+247, 43,140,165, 5, 18,176,179, 8,144,144,122,130, 84, 18, 62, 32,155, 28,114,150,121, 50, 85,103,185,197, 66, 29, 81,207, 87,
+ 80,202,123, 21, 51, 57, 82, 15,189,108,126,252, 8,178, 15, 79, 76,232,117,245, 36,142,192,224,252,191,179, 85,214,174,254,137,
+207,231,246,104,101,224, 28,231,161,235,248,233,200,126,252,104, 1,220,109,129,221,230,199, 97,142,189,189, 51,215, 63,159, 61,
+ 14, 64, 0, 96,247, 29,126, 71, 68,169, 89, 62,120,252,245,208,202,238, 79,204,253,154, 92,108, 5,240, 48, 58,192,202,135, 67,
+215,243,231,249,198,133, 81, 3, 57,249,224,119,237,229,162, 28, 39,169,249,249,126,125, 52, 26,200,251,199,127,179, 74, 45,198,
+227,126,216,200,253,248,160,178, 50, 58, 3,211,207, 63,184,253,186, 90,240,163,147,159,195,236,210,210,184, 24,175,170,168, 61,
+ 49,215,167,225,161, 16,112,122,156,116,213, 97,248,103,161,251, 51,164,216, 90,227,174,173,255, 0, 60,100,245, 38,214,190, 14,
+ 73, 56, 0,142,152,239,145,247,116,213, 66,176, 7, 82,172,142,216,249,246,207,222, 52, 58, 84, 83,211, 29, 7,111,236, 58,242,
+ 80,162,174,101, 47, 8, 61,128,206, 71,222, 7,174,116,131,222,222,236,101, 69,254,127,150, 46,141,168, 96, 0, 57,137,206, 73,
+254,145,243,192,215,213, 44,173, 73, 8, 39, 9, 56, 87,124,103,247,245,254,141, 80,105,188,242,146,174, 81,158,128,117, 61, 49,
+215, 25,244,209,205,167, 57,192,206,127,164,117,237,249,237,164,172, 79,207,166, 48,109,219, 21, 90, 56, 35, 35, 32,143, 46,221,
+ 61,125, 15,125, 28, 57, 72, 79,160, 62,127,205,251, 62,125,244, 50,121,112, 0,252,253,190,154, 37,176, 85,142,192,124,135,244,
+231,207,166,177, 97,123,227, 24,184,178, 15, 76,159, 82, 63,163,247,234,184, 24, 57, 24,201, 57, 7, 31,135,219,161, 16,175, 35,
+231,219,250, 49,162,146,113,220,245,232, 65,198, 59,246,199,175,246,233, 22, 22, 36, 97, 50,187,220,155,223,231,255, 0, 56, 37,
+ 43, 8,199, 58,186,159, 32, 59,244,249,104,146,238, 70,113,140,249,250,227,183,159, 77, 4,113,144,190,153, 63, 44,227,184,200,
+252, 53, 81, 36,116, 32,231, 29,201,251,125, 7,150,146, 98, 58,223,225,130,219,221,123,117,193, 41,119, 24,248,249, 64, 32,224,
+227,175, 94,160,122,244,206,167, 39,236,166,220,118,247,115,129,157,165,148,252,148, 73,171, 88, 74,169,237,245, 93, 33, 73, 46,
+ 54,186, 44,133, 38, 1,113, 61, 74, 65,132,228,126, 92,227, 35,168,212, 42,118,215,108,110,189,211,185, 98,219, 86,181, 49, 83,
+231, 73, 5,229,186,227,137,139, 78,167,194, 66,128,145, 85,173, 84, 93, 79,135, 74,164,183,252,247,156,234,162, 66, 26, 67,174,
+148,160,203, 23,217, 2,214,215,112,241,106,238,110,209,215,119,102,143, 34,181, 87,151, 2,239,168, 76,172, 75,110,139,108, 53,
+ 53,136,201,133, 34, 21,179,239,238, 5,184,218, 82,218, 11,139,119,149,215, 15,196, 91, 66,126, 17, 4,227, 9,104,167,142,154,
+137,228, 6,169, 95, 86,155, 95, 74, 21, 96, 75,158,136, 11, 5, 3, 81, 26,142,194,230,246,184, 60, 26,124,214,135,136,167,204,
+ 41,105,100,124,178, 88, 36,167,158, 80, 44,129,137, 73, 35, 0,159,180,193,212, 2, 20, 18,129,238,218, 65, 23,235,214,231, 75,
+174,219, 59, 83,184, 21,235, 93,151, 30,184,224, 91,147, 13, 27,193,104,188,236,105,178, 18, 35, 38,162,134, 82, 50,234,163, 33,
+213,188, 0,207, 86, 70,181,171,102,120, 8,183,217,222,155,115,124, 46, 59,138, 53,229,105,208,108, 90,123, 86, 21, 10, 66,223,
+155, 42,179,121,215, 33,166, 69,211,124,221,210, 95,234,244,211, 45,231, 83, 25,177,128,216,198,122,164,107,107,162,239,150,195,
+ 32,148, 57,188,187,110,233,193, 75,141, 34,227,167, 60,130,146, 48,180, 45, 33,226, 20, 8, 39, 35,207, 26, 14,226,227, 7,134,
+ 29,183,182,107,183, 12,173,200,163,213,169,246,180, 23, 39,205,163, 89,141,125,115, 86, 84,102,186,172, 83,169,144,129, 84,133,
+127,178,128,126,237, 65,225,142,150,158, 82,226,162, 33,169,116, 0, 89,111,114, 69,200, 23, 59,157,133,183, 61,135, 91, 99,179,
+242,190, 62,226, 28,135, 33,205,114,204,161,165,203, 70,109,205,246,202,132, 82, 30, 74, 87,138, 56,249, 76,250,117, 70,177, 5,
+155, 76,136,234,116, 85, 84, 45,129,101, 97,144,207,224,179,103,238,181, 56,183, 81,123,208,158,152,250,158,156,245,169,125,220,
+ 20,116, 60,235,202, 42,121,197, 48,137, 42, 66,150, 73, 60,184, 78, 0, 56,244,208, 91,129,114,240,113,236,166,216,187,155,114,
+235, 20,202,117,183, 21,229,201,153, 69,162,189, 37,138,222,236,111, 13,232,227, 74, 84, 26, 29, 62,109, 77, 74,149, 44, 56,247,
+ 39,140,233, 40,139, 17,165, 41,231,112, 0,207, 27,248,128,250, 66,114,226, 82,170, 52,190, 16,184,115,190, 43, 19, 3, 14, 52,
+141,201,220,155,106,174, 41, 84,247,112, 66,100,195,183, 41,209, 86,185, 78,160, 14, 96, 30,113, 8, 56,248,186,103, 81,143,226,
+ 11,136,157,247,226,127,114,100,238, 30,253,238, 45,126,244,188,158,105,214,162,199,173, 62,168,205, 81,169,238, 40,172,211,168,
+ 86,223,192,221, 6,154, 50, 7, 43, 76,160,168, 1,206,181,158,186,127,203, 56,124,207, 46,161, 18,211, 34,253,166, 54, 14, 6,
+215,180,103,204, 24,247, 50, 42,129,179, 89,197,215, 20,239, 27,253, 36,248,135,244, 13, 71, 12, 80,113, 94, 97,196, 20,179,105,
+ 38, 7,168,168,108,188, 50,127,118,243,135, 96,181, 38, 34,111, 20, 96, 58,169,220, 60,100, 95, 24, 39,180,115,137,253,201,226,
+247,127,170,251,223,186, 82, 27,254, 16, 94, 74,118,124, 26, 44, 87, 92,118,155,105, 91, 81,121,162, 91, 54,141, 31,196, 63, 13,
+ 58, 13, 59, 9,230,192, 47, 62,243,210, 23,241,186,117,175, 92, 57,196, 97,202,237,211, 57,208,178,252, 42, 34,147, 24, 1,211,
+ 46,149, 5, 18, 60,253, 6,173,251,228,231, 53,219, 29,128, 65,247, 42, 12, 6, 79, 41,200, 5, 73, 4,129,215,191,174,178, 14,
+ 26,216,118, 93,122,230,134,202,121,164,204,167, 68,139, 29, 9,238,183,223,119,194,101, 41,207,153,113,104, 31,126,172,212,141,
+ 41,120,124,197, 24,209, 26, 34,128, 46,118, 28,192,119, 59,147,183, 82, 73, 39,169, 36,239,142, 53, 53,117, 21,115,214, 86, 85,
+ 74,211,213, 84,180,178, 72,231,118,103, 42,204, 73,176,238,123, 0, 0,232, 0, 27, 98,109, 63, 71,223,128,234,125,203,195, 15,
+ 16,156, 74,220,244,174,123,199,114, 99,200,218,237,155,145, 45,177,136,116,123, 98, 92, 90,221,217, 83,134,149,167,225, 85, 82,
+187, 18, 29, 56,186, 15,197, 30,152,164, 14,138, 57,216,168,246, 17,161,213, 31,142,228,117, 50, 90,146,235, 97, 10,230, 75,225,
+ 8, 56,228,115,185, 67,169,229, 41,229,239,204,112, 8, 58,236,151, 0,219, 99, 15, 98,184, 76,225,239,107,105,113, 83, 17,187,
+ 99,109,109,231,167,180,148,132, 41, 85,138,164, 38,234,181,105, 14,116, 28,206,174,124,199,201, 39,174,123,233,168,226, 23,134,
+171,150, 93,110,226,220, 91, 38, 61, 58,161, 65,144,255, 0,214,146,168, 44, 62,182, 43,237,206,148,240,247,152, 52,168, 9,103,
+146,167,207, 53,197, 58,202, 3,136, 63,166, 80, 94, 2, 65, 52,151, 19,209, 54, 99, 28, 89,138, 38,170,131,118,127, 82,142,117,
+ 40, 61, 55,137, 74,160,247, 13,239,215, 29,145,225,180,210,240,102, 89, 6, 69, 36,194, 24, 42,163, 73,100,212,214, 95,105,101,
+ 94,110,228,237,169,174, 22,254,128,108, 0, 3, 82,108,234, 84,116, 52,134,210,201, 41,147, 33, 50, 29, 8,240,203,143,186, 2,
+ 0, 83,220,201,207, 58, 67, 40, 7, 36, 0, 19,132,156,107, 99,104, 52, 8,210, 93, 98,116,150,210, 36,193,113, 47, 65, 13,129,
+225,199,203,101,135,198, 79,235, 74,113,133, 41, 10, 89, 5, 32, 16,148,242,167, 36,170, 87, 15, 59,203, 71, 82, 20,230,223, 76,
+148,128,134,151,205, 74,153, 75,168, 33,105,194, 64, 39, 19,144,162, 0, 37, 71, 41, 4, 99, 28,189,244,241,218,123, 83,186, 79,
+ 41,180, 35,109,238,133, 20,114,133, 45,113,162, 37, 61, 14, 28, 74,221,114,104, 72, 79, 81,147,216,245,198,162, 81,100,213, 74,
+ 64,146,146, 66, 91,182,134,244, 22,232, 13,237,215,211,210,214, 24,178, 78,125, 70,186,229,108,198, 24,237,177,102,158, 32, 0,
+ 54, 4, 18, 91, 96, 64, 3,222, 5,177,113,161,208, 12,134, 16,211, 10, 90, 34,143,242,202,115,224,151, 49,158,230, 50, 29, 74,
+147,238,236, 18,160, 10,191, 89, 64,114, 35, 1, 74, 86,178,171,163,112,237,237,158, 85,185, 95,170,208,239,234,203,242, 38,132,
+ 82,227,109,214,216,222,251,153, 34, 51,212,224,196,176,253,106,153, 99,209,229, 46,149, 79, 64,228, 45, 41,208,217,144,176, 88,
+142,149,168, 40, 7,150,209,216, 45,211,158,164, 57, 54,149, 73,183,217, 80,229, 46,213,234, 77, 72,113, 41, 0,142,127,114,166,
+182,234,138,136, 63, 8,231, 66,124,250,119,214,136,251,111,106,123,151,194, 15,179, 87,116,183, 91,103,247, 82,225,178,183, 81,
+ 55, 54,223, 91, 16,111, 43,121,168,212,249,212,202,101,201,112,177, 6,177, 22,136,227,168,117,112,106, 47,198, 43, 67,115,185,
+253,229,144, 74,152, 83, 75,194,132,166,147,135,179, 55,167,146,177,104,218, 8,163, 49,131, 44,171,101, 82,242, 36,105,101, 37,
+ 93,174,238, 0,210, 13,137,213,184,190, 34, 25,199,137,124, 27,150, 48, 25,157, 89,207,105, 98, 73,154, 90, 74, 25,209,101,153,
+ 68, 78,197, 69, 87, 38,162, 8,201, 42, 11,115, 17,137, 23, 64, 22,225,150, 51,124,116,238, 62,206,240, 93,121,221, 53,125,139,
+ 98,254,183,183,166,236,173,213, 46,123, 18,139,190, 78, 91,107,223,205,183,143,115, 74,157, 85, 27,132,254,217,209, 34,200,137,
+176,244,148, 57, 59,154,223,149,118,189, 34,254,168, 6,195,212,202, 37, 1,178,229,101, 17,220,184, 46,123,134,236,174, 85,110,
+107,134,183, 87,184,110, 58,228,233,117, 42,229,201, 93,156,253, 74,191, 90,168,206,125,114, 39, 77,169, 84,100,184, 86,235,239,
+ 72, 90,214,224, 4, 37, 74, 86, 72, 39, 36,218, 42,181, 73,149,138,165, 74,181, 92,157, 58,167, 88,172,212,165, 86, 43, 53,106,
+148,217, 85, 42,173, 98,179, 80,115,198,159, 87,171,212,230,186,183,234,149, 55,158, 37, 78,200,125,199, 29,112,245, 90,142, 6,
+128,109,101,110, 97, 36, 6,179,241,128, 71, 49, 62,185,242, 26,176,114, 30, 31,163,201, 33,178, 14,117, 76,191,106, 66, 5,197,
+194,141, 9,251, 40, 52,128, 22,229,136, 85,214,206, 85, 72,164,252,120,250, 73,120,157,244,128,204,169, 36,227, 28,238, 99,195,
+217, 60,113, 67, 69,150,137,165,120, 17, 41,193, 88,102,171,119, 98,213,213,195, 83,191,180, 77,245,112, 73, 61, 64,160,130,138,
+ 25,228,133,136, 90,148,234, 57, 93, 9,121, 9, 80, 90, 91,144,148,188,144,176,114,149,165, 14, 2, 18,224, 80, 4, 40, 96,130,
+ 50, 8, 58,204,169,155,143,113,209,211, 21,169,110,192,185,160, 68, 11, 17,232,183,173, 53,187,170,154,198, 82, 82, 61,205,249,
+174, 9,212,229, 15,255, 0,131, 48, 54, 63,248,163,211, 24, 96,228, 10, 88,201, 41, 7,162,137,244,238, 63, 57,213, 53,164, 43,
+ 36, 14,185,200,252,159,150,159, 39,166,130,161, 52, 77, 10,202,163,166,160, 13,137,238, 13,174,167,222, 44, 71, 99,138,111,135,
+120,167,136,248, 74,170,106,190, 27,206,170, 50,105, 42,192, 74,133,134, 66,176,213, 68, 13,249, 53,148,230,244,245,180,228,253,
+170,106,184,166,129,255, 0, 94, 54, 24,116,231,239,189,238,150, 89,133, 64,254, 15,237,252, 36,248,206,123,141,131, 77, 48, 29,
+151, 33,230,210,209,151, 80,170, 84,195,206,184,250, 26, 64,229, 8, 74, 50,160,149, 45,107, 8,109, 8,177,171,117,119, 10,108,
+ 7,169,170,189,110,207,170,159, 74,208,253, 57, 21,201,173, 71,113, 46,161, 40,144,133, 73, 74,196,165, 54,232, 78, 92,111,222,
+ 60, 37,149,168,148,124, 74,206, 0,166,219,230, 33,120, 36,117,206,124,251,143,219,175,170, 91, 74, 90, 19,207,241, 32, 19,200,
+147,240,156,250,254,205, 37, 29, 21, 36, 32,133,167, 64, 24,223,236,130,111,182,228,145,114, 71, 98, 73, 54,218,248,156,102,190,
+ 58,120,209,157,242, 99,172,241, 87, 62,130,146,154,148, 80,197, 71, 69,153,213,101,153,108, 20, 34, 40,225, 52, 84,185, 86, 89,
+ 37, 30, 91, 75, 70,241, 68,139, 37, 45, 45, 36, 84,242,232, 13, 44,108,196,177,172,227,188,193, 37, 92,169, 75,105, 8,109,150,
+208, 16,219,109,131,209, 13,161, 0, 37,180,228,147,128, 7, 82, 79,114,117, 72,146,163,205,129,140, 14, 81,216,140,129,158,184,
+237,223, 94, 84,177,158,216, 4,224, 31, 32, 73,237,246,107,233, 9, 80, 79, 50,129,198, 79,194, 64, 35,215, 61,126,205,109, 95,
+111, 47,109,189,216,170, 85, 2,233, 91,105, 10, 6,221, 0, 3,160, 30,158,131,165,177,229,212,133,160,131,128,125,112, 51,211,
+236,243,208,105, 11,230, 60,201, 8,109,191,139,226,248, 78, 71,159,207,251,116,122, 20, 20, 50, 7,145,200, 61,199,151, 95,191,
+ 67,169, 36, 55,151, 49,215,161,201, 4,252,137, 0,246,233,161,179,111,219, 6,177, 6,221,251,126,255, 0,227,138,110,123,186,
+192, 82,130,150, 8,200,194, 73, 3,182, 73, 31, 61, 75,227,232,215,112,195, 99,223,219, 35,198, 38,227,110,133,131,105,238, 13,
+175,184,202,183,248,125, 93,173,121, 80, 32, 92, 54,253,118,207, 69, 45,203,170,246,167, 78,131, 84, 97,109,174, 60,137,213,122,
+ 35, 78,132,242,171, 48, 16,160,164,173,180, 40, 68, 24,149,143, 8, 54,158,138, 74,147,205,144,144,181, 99, 24, 3, 29, 15,109,
+ 77,123,217,103,184,103,103,189,143,246,187,116, 6,164, 81,171,123,149,186,219,227, 85,173,205, 79, 52,105,170,164, 82,174,168,
+214,139, 78,199,144,180,167,195,143, 48, 82, 93, 67, 79,160,169, 10,102, 26,210,135, 57,138,185, 98,156, 99,155,193,146,101, 73,
+ 89, 80, 12,138, 37, 10,177,139, 6,150, 66,173,201,141, 9,232, 76,161, 9, 36, 16,136, 25,200, 33, 72,197,129,225,126, 86,115,
+110, 47,162,164, 72,185,210,136,228,101, 7,117,187, 20,132,234,244, 26,101,111,190,214,223, 28,193,223, 63, 97, 79, 4,115,184,
+194,185,209,179, 27,239,185, 54,175, 14,116,135,150, 47, 93,165,163, 83,105,149,186,237,191,122,205, 66,164,162,196,218,237,215,
+185, 31,144,220,155, 36, 48,243, 62, 60,137,208, 39,207,167, 56,164, 69,140,229, 65, 78,120,204,111, 6,212,251, 26,125,155,123,
+125, 58,216,185,109,203, 55,136,138,110,227, 80, 37,198,122,216,220, 26, 55, 21,119,221,175,121,219,245,200,177,194,145,114, 81,
+170, 86,149, 42, 2,105, 21,166,212, 60, 80,227, 40, 75, 45,172,132,134,150,223,194,108, 27, 71,113,203,157, 91,184, 42,197, 34,
+ 81,147,122, 93, 21, 71, 34,115, 36, 46, 82,152,170, 10,100, 82,181,243,128,150,154, 17, 84,177,200, 6, 11,105, 81, 80, 1, 58,
+222,155, 74,229,118,163, 38,164,121, 90,136,212, 8,204, 83, 34,180,202,131,110,158, 98, 36, 84,159, 83, 97, 28,172, 45, 43, 91,
+109, 37, 72,230, 95, 43, 74, 4,164,144, 53, 71,103,220, 99,198,175, 58,200,217,245, 68, 48,132, 0,197, 3,242, 22,221, 8, 44,
+154,100,147,169, 93, 83,188,174, 86,218,156,144,111,212,220, 79,225, 79, 9,228, 78,100,161,201,225, 89, 2,172,143, 33, 82, 89,
+164,178,130,234, 9,180,107,204, 58,149, 35, 85, 80,157, 55, 14,113,212,219, 99,136,234,228,106,101, 18,155, 87, 66, 43,171,106,
+ 35, 20,230,230,213, 86,165, 86,106, 81,233,145,219,143,245,157, 94,162,202, 82, 39,213,158, 8, 74,228, 72,240,144, 31,125,213,
+185,225,160,171,151, 78,181,189,187, 22,141,226,232,140,220,143,169,234, 75,115,193,110, 28,247, 27, 75, 82, 94,236, 27,137, 40,
+ 30, 71, 22, 72,232,147,202,162,122, 0, 78,185, 81, 30,244,240, 36, 85, 11, 97, 75,143, 66,134,205, 38, 36,144,114,151,170,110,
+182,100, 75, 96, 4,171,162,144,234,163,165, 65, 32,245, 74,178, 8, 26, 10, 61,219, 41,136, 17,203,239, 31,124,142,204,154,156,
+175, 13,210,158, 95,136, 52,201,108,142,169, 62, 50,148,126, 69,191,150,148,202,184,199, 54,167,208, 37,169, 53,106, 7,153,101,
+243, 27, 0,162,250,143,152, 27,234, 59,146, 0,182,199, 21,248,142,186,130, 68, 16, 73,204, 22, 91,197, 37,200, 58,148,200, 0,
+ 63,105,108,186, 23, 99,179, 29,212,244, 27,233,106,113,119,182,151,183, 20,183,231, 10, 22, 90, 95,184,110,205,174,179, 85,117,
+110, 45,213, 17,214, 92,183,173,234,168,126, 51, 38,204, 66,193,230,145, 91,105, 50,153,247,130, 7, 35, 78, 18,214, 74,210,172,
+108,130,235,136, 99,157,106, 88,230, 57, 24,206,126, 30,184, 29,122, 99, 35,174,184,239,193,253,153,180, 27, 99,196,214,228,110,
+244, 17, 42,218,187,248,132,179, 97,219,181,104, 40,144,201,180,230,222, 73,172,174,167, 38,226,195,235, 46,192,175,213,208,195,
+104,125, 33, 94,236,228,180, 23,194, 91,114, 74,129,232,125,205,113, 42, 50,221, 64,113, 73, 41, 74,147,200, 62, 21,165,105, 39,
+ 60,201, 61,142, 2,178, 62, 90,181,184,106,180,102,212,111, 59, 48, 18, 60,132, 50, 0, 46,130,202, 66,144, 55,247,134, 61, 71,
+223,105,215, 25, 75,194, 85,210,100,173,193,144,212,211,209, 46, 91, 68,149,130,172,222, 99,154, 8,239, 94,118,188, 98, 35, 41,
+ 2, 1, 17,229,242, 66,157,152,184, 14,149, 74,248,109,178, 71,136, 2,123,168,115, 2, 14, 14, 57,186,118, 32,228, 31, 62,191,
+ 45, 97, 51, 47, 98, 23,151, 29, 87,134,165, 30, 85, 12,144, 73, 56, 9, 36, 28,115,140,128, 50, 48,190,217,242,214,190, 84,238,
+181,120,174, 53,206, 10,138, 20,251,121, 81,248,208, 14, 28,111, 62,153, 35,167,145, 94,177,148, 93,188,217,104,175,152, 41, 36,
+165, 46, 12,115, 32, 15,137, 25, 36, 18,180, 96,127,181,202,144,175, 93, 74, 99,129, 80,108,110,126, 63, 15,221,249,252,113, 22,
+167,164, 88,198,195, 87, 75,254, 23,239,215,227,252,142, 54,149,187,161, 46,158,100,184, 10, 85,203,158,101, 4,148,156,144,121,
+194,199,192,114, 21,229,141, 90, 42,114,158, 91,107,145, 76, 8,113,208, 10,213, 17, 74, 45,161,212,100,229, 76, 41, 32,144,224,
+234,174, 78,161, 92,159, 14, 20,113,166, 18, 37,213,201,202, 92,120, 40, 0, 57, 92, 36, 41, 65, 39, 56, 67,160,145,146, 15, 76,
+158,152, 57, 32, 19,157,102,144,110, 4,175,225, 82,207, 50, 70, 72, 4,148,117, 57,200,207, 83,144, 6, 64,237,203,243,234,149,
+ 69, 58, 78,154, 36, 23,244, 61,193,236,111,235,211,249,140,110, 67, 81, 45, 20,162,104, 13,237,177, 83,114,174, 63,101,198,215,
+ 30,253,136,189,193, 83,190, 47,109,215,101,185,200,130,228,102,194, 92, 90, 75,164, 58,231, 42,146, 73,229, 80,113, 35, 60,189,
+138,136,248, 74,128, 86, 58,234,234,212,199,221, 1, 78,200, 88, 33, 68, 16,142,102, 27, 82, 21,132,242, 40, 55,146, 82,112, 59,
+ 17,133, 39, 33, 64,231, 88, 13,198,183, 11, 6,169, 79, 9, 91,204, 2,185,108,130,176,149,181,132,149,201, 71,135,250,206,161,
+180,146,226,123,173, 0,158,139, 29,113,232,181,233,174, 28,169, 77,128,142, 71, 27, 45,169,120, 83, 43, 79, 55, 50,121,143,249,
+ 64, 84,147,211,161, 24,193,202,134, 98,211, 43, 81,204, 98,153,246,107,216,216, 88,131,109,238, 59,250,223,241, 6,248,157, 80,
+188,121,165, 42,212, 83, 34, 68,192,217,212,145,169, 24,117,235,185,235,117, 35,175,186,197, 67,227, 22, 64, 10, 60,141,168,243,
+128, 10,146, 74,212, 91, 65, 32, 37, 74, 41, 42, 91, 32,227,252,152,234, 9,207, 49, 35, 87,149, 84, 92,140,217, 90, 25, 74, 60,
+117, 4, 33, 47,165,213,199,195,201, 42,109,160,129,149,198,144,226,142, 19,206, 49,147,240,163,148,243,105,158,139, 82, 82,138,
+ 1,113, 92,142, 19,203, 33,183,156,229, 70, 87,204,203,109,242,184,163, 29,174,101,225, 33, 28,203, 82,148,148,148,231, 35, 87,
+196, 84,214,134,138,188, 73, 40,112,151,217, 83,209,203,109,180,180,164,252, 94, 34, 22,162,183,100,103, 28,223,168, 83,130,148,
+143,136,157, 47, 28,195,190,192, 88, 95,247,119,235,183,190,247,177,191, 77,244, 42,224,209,114, 95, 93,183,232,119,183,196,245,
+ 29, 59, 16, 63, 12,178,167, 82,117,101,214,158,116,143, 5, 24, 90, 23,206,135,176,149, 30,171, 28,152, 67,133,148, 37, 68,130,
+ 72, 82,136,233,216,106,111, 20,187,199, 75,216, 78, 31,183,187,123,107, 14, 3, 11,107, 54,178,243,187,194, 90, 57,118, 69, 74,
+ 29, 37,232,118,227, 17, 80,181, 15, 26, 67,151, 45, 70,140,218, 83,159,252, 98,186,121,105,253,153, 86, 47, 7, 9,115, 32, 43,
+ 45, 41,124,222, 48,200, 88, 62, 39, 83,200,159,140,117, 57, 42,192,233,231,168,229,253, 33,126, 36,209,101,112,247,183,156, 51,
+ 81,166, 20,220,123,253,118,139,190,234,105, 14,114,189, 19,107, 54,170,107, 47, 14,101, 54,172, 24,245, 77,192,149, 76,140,166,
+ 92,229,230,106,223,125, 65, 36, 5, 99,118,157, 26,170,122,122, 52, 39, 85, 75, 0,125, 66,117,118, 29, 62,202, 6, 59,122,116,
+190,198, 41,159, 87,166, 83,147,230, 89,163, 16,134,138, 38,100,189,183,152,128,144,169, 29,124,210,178, 41,223, 96, 73,219, 16,
+244, 92,153, 82,150,236,202,131,161,234,140,247,159,157, 80,125, 32, 97,234,132,215,151, 38,107,224, 96,116, 92,167, 94, 87,207,
+155, 66,172,131,211,207, 61,115,246,127,110,136,115,169, 29,135,115,161, 87,230,174,152,245,239,216,121,254,124,181,105,160, 0,
+ 11,108, 63, 45,182,199, 34, 42,236, 13,205,207,174,253, 14, 6, 86, 50,113,249, 63, 47,150,135, 81, 10,242,192,235,159,159,204,
+250,104,133,250,130, 20, 72,252,244, 26, 21, 71,161, 62,125, 79,223,165, 20, 18, 70, 21,192,234, 32,117,249,224,103,231,246,124,
+180, 51,131, 57,234, 1, 4,245,209, 90, 17,194, 14,122,247, 57,199,203,231,165,199, 81,129,129, 85,211,167, 82, 79,115,242,244,
+199,166,116, 42,200,207,108,117,199,219,215,207, 68,185,242,238, 7,159,111, 95,223,160,150, 79,126,152, 61,193,243, 61,127, 63,
+118,148, 65, 97,210,247,249,255, 0, 92, 12, 82, 36, 2,122,129,247,254,255, 0, 61, 45, 81, 95,235,119,242,252, 62, 95,159, 93,
+ 45, 31, 3,108, 86, 29,251,103,229,162, 52, 42, 87,219, 61, 15,145,199, 76,131,229,170,129, 68,158, 94,108,116,207,111,159, 94,
+190,189,244, 71, 2,221,108, 70, 14,195,173,190, 63,195, 7, 54,123, 21,125,223, 63, 67,162, 7, 95, 35,246,121,232, 38,240, 58,
+100,147,243,252,247,254,173, 22,149,245,244, 62, 94,126, 95,102,146,193, 58,116, 56, 41,161,203,212,156, 99,200,252,243,216,104,
+214,200,243, 0,253,248, 39, 64,165, 89, 29,191, 17,231,231,131,157, 86,108, 20, 44,168,172, 16,172, 1,159, 47,179,238,210,109,
+233,109,135,242,198,113,112, 10,193, 1, 67, 4,249,129,223,237, 35,243,215, 68,167, 3,168,200, 39,161, 29,191,102,122,118,208,
+169, 81, 32, 12, 12,140,119,237,140, 1,140,143, 60,232,128,172,100,156,100, 96,228, 96,147,246, 99,229,253, 58, 79, 24,193,141,
+168,119, 61,113,211,239,233,131,248,104,132, 28,224,245, 56,235,243,233,235,143, 45, 0,133,103, 3,168, 4,250, 14,255, 0,105,
+213,126,108, 17,133, 41, 57,207,234,250,255, 0,195, 72, 55, 94,183,198, 45,251,240, 96,194,212, 65,206, 15, 99,156, 99,167, 83,
+223,166,178,107, 86,133, 46,228,174, 83,168, 84,230,131,242,231,203,102, 43, 41, 89,195, 69,215, 20,122,190,224,255, 0, 37, 29,
+ 13,165,110, 56,175,230,182,210,136,235,140,226,141,149,172,148, 40,242,164,140,243, 0,115,229,231,167, 83,107,106,201,163,215,
+ 27,102, 59,168,106,161, 80, 68,168, 17,165,168, 14,120,254,244,202,121,148,223, 55,119,212,203,110,165, 63, 53,159, 44,231, 74,
+177,164,138,154,105, 34, 0,200,138, 72,248,250,159,147,183, 77,240,231,146,208,195,153,231, 25, 94, 91, 81, 57,166,167,174,158,
+ 24,157,199, 85, 87,117, 86, 43,125,181, 16,108,183,219, 81, 23,218,248,222,138,101,205,111,109, 53,188,139, 14,206, 6, 92,185,
+106, 97,219,158,165, 20, 33,169,181,218,147,105,229, 75,211,229, 39,172,106,107, 74, 42, 76, 88,249,229,105,177,148,165, 78,169,
+197,168,202, 52, 58,189,201, 45,107,152,251,134, 43,136,241, 26,136,133, 56,212, 96, 73,206, 22, 82,160,183,187,255, 0, 56,129,
+159,230,233,172,181,109,231,101, 77,113,174, 96, 84,151, 11,234, 90,143, 58,214,238,114,165,184,181, 28,173,106, 39,185,234,115,
+211,167, 77,109, 61,163, 22, 44, 22, 27, 91,137, 83,171, 74,128, 82, 1,207,234,158,188,201, 56, 29,255, 0, 15,232,173, 43,102,
+142,152, 57, 86,230,207, 39,153,152,245, 98,109,185,219,238, 30,131, 97,176,176,238, 92,135,135, 96,160,165,130,158,154,139,217,
+233,169,194,164, 80, 40,217, 20, 91,173,247,102, 39,119, 98,117, 51, 18,204, 75, 18,113,157, 88, 27, 77, 6,162,243, 10, 91, 45,
+173,210, 17,204,134,249,192, 79, 80, 63,214,237,246,249, 13,116,123, 98,182, 58, 4, 74,205, 30,167, 79,136,195, 21, 8,242, 27,
+109,110,132, 5, 41, 73, 87,235,167, 43, 4, 56,130,140,228, 96,131,208, 99, 90,225,182, 40, 67,142, 48, 16,148,176,211,139,108,
+165, 13,164, 41,196,146, 1, 0, 28, 0,122,103,200,227, 93, 65,218,186,205,175,107,194, 23, 45,203, 58, 29, 22,218,182, 96, 72,
+174,220,149,170,131,237,177, 22,155, 74,165,199, 84,185,211,101,200,116,132,182,210, 35, 52,242,142, 78,112,156, 0, 78, 6,171,
+ 12,238,173,234,222, 88,228,156,164,106, 9, 35,215,160, 2,195,177, 61,189, 58, 92,224,103,185,230,105,150, 32,167,167,102, 26,
+193, 82, 7,165,183, 6,219, 90,219, 1,190, 56,205,197,103,181,207,127,173, 13,203,184,118,215,133,170,141, 31,104,108,203, 18,
+227,169,219,114,110, 38,173, 59,114,175,120,222, 85,138, 12,199, 41,181,154,156,153, 53,154,123,241,232,148,133, 84,163, 74,110,
+ 60, 86, 88, 82,220,105,176,227,238,146,190, 68,232,182,233,123, 64,184,141,223,154, 60,154, 6,249, 57,181,123,167, 78,146, 84,
+227, 18,107,187, 67, 98, 81,110, 42,116,165, 0,145, 34,159,117,218,148,120,114, 99,114,227,163,101, 42, 70, 84,115,229,173, 86,
+221,155,170, 61,231,185, 27,133,121, 69, 66, 4, 43,174,251,188, 46,104, 37,150,148,210, 87, 78,184, 46,106,173, 86,152,226, 26,
+ 95, 86,138,160, 76,140, 84,147,241, 37, 74, 32,128, 65, 26,194,202,138, 27, 72, 66, 66,146,164,249,147,216,250,231,207, 87, 69,
+ 31, 7,240,224,142,134,170,163, 33,165,108,202, 5, 70, 19,180, 17,154,132,144, 1,186,205,167,154,132, 27,219, 75, 46,158,139,
+101,216,113, 46,113,196, 25,150,101,152,213,213, 75, 88,211,164,146,185, 69, 33, 74, 4,212,116, 0, 45,109,150,194,253, 77,174,
+196,146, 78, 25, 29,226, 14, 57,121,205,113,232,130, 3,142,211,225,184, 35,161,210,251, 60,158, 24,194,153,113, 74, 39,194,232,
+ 48, 51,240,246,211,245,236,251,162,194,185,248,143,179, 45,121, 83, 19, 21,250,213,203,107,181, 9,165, 71,118, 87,191,186,213,
+102, 27,130, 3, 81,152, 66,148,243,239, 41, 41,105, 3, 24, 5,238,101,124, 41, 58,101,247,161,159, 22,181, 69,168, 39, 42,110,
+109, 13,166,193,234, 48,228,124, 36,164,245,239,145,174,129,251, 9,174,186, 5,165,237, 66,225,233,203,134,153, 75,169,179, 93,
+122,232,183,105,102,171, 29,185, 77,211,107,245, 27,114,161,245, 77, 90, 19,110,130,148, 84,153,121,149, 6, 86, 70, 82, 94, 37,
+ 63, 16, 4, 76,106,145,166,225,202,216,163,115, 19,154,118, 0,141,244, 17,182,175, 48,111,179,107,216,131,211,124, 55,240,245,
+ 50,102,121,237, 29, 36,238, 33, 74,218,128,140, 64, 27,115, 13,172,189, 64, 38,246, 91,130, 3, 17,112, 70,216,253, 60,108,203,
+170, 61, 38,218,163, 69,169,210,215, 6,123, 52,168, 12, 42, 18, 30, 74,149, 13, 45,197,109, 30, 2,136,232, 84,156, 96,142,195,
+ 24,211,173, 99,205,135, 95, 67,163,195, 82,216,105,226,174, 71,124,148,149, 2, 51,235,129,141,105, 44, 90,227,175,203,110, 58,
+159, 60,234,145,200,227,139, 86,113,133,225, 74, 81,201,236,156,159,187,231,170, 28, 4,113, 50,246,254,220,188, 78,211, 27,167,
+174,157, 67,217,253,200, 98,198,160, 62,226, 84,149,213,154,110, 59,134, 85, 65, 74, 80,193, 38, 67, 46,128,145,156, 36,167, 56,
+206,171,117,160,130,138,122, 97,237, 82,206,210, 2,164, 74,193,245,233, 0,234, 42, 2,170,144,127,100, 1,189,173,233,213,116,
+ 57, 94,103,152,229, 89,246,102,140,213, 17,228,201, 12,179, 73, 36,128, 58, 9,234, 18,153, 52, 40,182,162,210, 72,183, 8, 0,
+ 85, 5,141,128, 24,234, 84, 22, 97,190,160,211,140,160, 37, 73, 9, 37, 39,151, 35,203, 4,118, 61, 53,114,153, 78,153, 71,107,
+235, 40, 14, 61, 50,158,222, 60, 88,104, 36,186,207,108, 43,161,248,155, 29, 63, 29, 97, 20,201,202, 47,103,152,116,235,202, 79,
+126,158, 94,167,229,242,211,203,110,200,247,142, 86,186, 45, 43, 28,139, 74,199, 69, 36,140, 40, 28,142,185,211,232,142, 26,149,
+210,124,143,250,172, 54, 32,246,233,212,123,143,108, 87, 57,193,168,203, 88, 74,126,186, 30,174,140,110, 24, 27, 95,115,186,183,
+163, 11, 88,251,182, 38, 90,149,147, 81,103, 43,113, 42, 36,101, 41, 4, 97, 63,236,131,246,106, 57,159, 74,191,116, 98, 90,254,
+207, 59, 39,109,189,229, 13,212,183,107,126, 44,232,173, 70, 10, 79,139, 34,151,103,194,170,220, 21, 37, 33, 4,228,182,151, 83,
+ 3,152,129,211,196, 79, 81,158,178, 30,102,146,109,219,145, 41, 96, 40, 65,169, 43,197,142,145,209, 8,117, 68, 7, 25, 3,237,
+ 80, 32,127,181,168, 24,253, 41,190, 42,105,187,177,198, 54,217,240,225,110, 85, 81, 54,139,195,101,145, 34,125,214,152,206, 7,
+ 99,181,184,187,128,182, 37, 59, 9,124,170,199,189,197,183, 98, 83,146,176,122,161, 83, 8, 58, 74, 58,202,145, 17,201,101, 26,
+102,168,170,131, 88,244, 90,105, 22,173,158,223,176,226, 5,136,155, 90,243, 32,234,192, 98, 1,158, 71, 76,139, 85, 95, 79,189,
+ 36,176, 18,155, 91,205, 48,228,232,235,246,147, 91,189,183, 39,148,198,196, 2,113, 23,105, 12,224,142, 92,114,128, 57,115,230,
+ 60,193, 31,158,218,166,220,116, 96,148,167, 35,185, 0, 30,135,231,131,219, 70, 58, 91,112,228,147,129,219,200,129,212,245, 26,
+163,239, 1,162,164,182, 58, 16, 2,148, 48,123,246,233,248,234, 69,123,110, 78,199,253, 49, 95,238,192, 91,182, 41,184,218,146,
+112, 2, 85,145,205,128,115,240,232,117,175,166, 2,185, 84,122,144,123,252,146, 48, 58,249,126, 26,246,165,183,205,207,226,242,
+ 41, 68, 0,146,160, 57,188,186,141, 8,236,164,182,248, 10, 66, 79, 40,192, 24,234, 78, 51,205,246,235, 5,182,178,131,140,233,
+ 61,206, 62, 37, 37,100,130, 84,143, 85, 20,247,251, 9,215,196, 52,218, 22, 28,108, 23, 20, 73, 10, 73, 32, 16, 58,117, 3, 29,
+117,111, 83,203,146,247, 41,116,161,190, 96,162,140,245, 64, 79,113,246,247,209,173,134,220,112, 58,130,174, 68,156, 21, 96,167,
+ 56, 29,142,124,186,235, 23, 38,226,214,237,108, 24, 0, 8,223,231,108, 84,202, 80,181, 45, 75, 37, 10,236,140, 14, 84, 19,208,
+ 21, 19,249,206,145,240, 91, 89, 35, 4,168, 2,181, 39, 36, 1,143, 63,207,219,175, 14,180,248, 91,135,225, 44, 44, 19,203,230,
+113,158,202, 35,190,147, 72, 75,188,184, 10, 97,180,167,149, 94,101, 68,116,193,200,235,219, 67,113,176,234, 62,253,255, 0,241,
+140, 88, 27,158,199,247, 99,223,138,128,176, 16, 74,202,192,200, 64,234, 51,216,159,151,174,144, 56,112,168,255, 0,226,210, 65,
+ 39,211,169,193, 30,191,219,161,201, 91, 97,101, 11,229, 33,124,169,112,164, 97, 67, 25, 41,193, 29, 62,221, 18,149, 30, 64, 28,
+ 41, 83,138,201, 81,233,203,131,211, 7,167, 95,158,178,160,129,238,248, 99, 4, 11,219,211,111,159,187, 23, 91,122,216,174,223,
+151, 45,171,103, 91, 30, 48,173, 94, 23, 45, 2,211,161,169,134,124,101,166,185,117,214,160,219,116, 71, 18,206, 63, 72,148,213,
+170,176,202,135,110, 84,156,234,116,188, 70, 90, 86,214,200,237,141,191,195,253,145, 22, 45, 26,196,217,203, 30,212,219, 59,118,
+140,216, 15, 52,105,182, 85, 52,210,220,144,228,146, 7,188, 57, 58,187, 14,173, 81,121,213,101,199,100, 86,221,117,213, 5,175,
+ 81, 5,246,122, 41,151,120,231,225, 49,165, 45,167, 25, 70,253,237,171,138,109, 68, 6,138,152,185, 35, 72, 66, 58,164,128, 60,
+ 86, 81,140,142,248, 24,212,167,184,174,185,213, 80,146,133, 73, 46,189, 42,116,101,176,243,171,116,136,206,165, 92,181, 24,242,
+ 29, 66,122, 56,175,137,244, 12,128,174,102,202,115,202, 19,170, 83,197, 9,101,168,206,184,107, 46, 36,242, 99,215, 57,177, 27,
+176, 33,119, 7,246, 0,242,159,241,145,183,126,148,250, 56,229,176,205,157, 87,230, 36, 3, 52, 82, 67, 18,237,186, 42,142,113,
+ 96, 78,222,114, 22,253,238,138, 65,198,134,236,221,125, 48,227, 85,230, 51, 33,182, 20, 46,139,193, 78, 71,146, 11,172,173, 49,
+107,213, 39, 22,218,176, 65,104, 45,181, 17,240, 28,231, 10, 57,192,214,224, 91, 87, 56, 52,186,124, 87, 37, 60,195, 17, 27,114,
+181, 86,168, 52,165, 33,208,211,232, 84,135, 35,180, 82,172, 45,194,149, 57,206, 62, 17,225,181,156,149, 19,174,110, 88, 21,191,
+119,114,244,165,183,202, 67, 27,155,118,199, 87, 58,178, 4, 89, 50, 96,212,208,176,140,117, 30, 4,208, 18, 6,122, 47,168, 24,
+193,216,148,220,233, 17, 19, 8, 58,234,126,185,152,195,115,214,218,208, 94, 77, 49, 13,178,244,133,248,196, 0,223,193, 29,180,
+ 33, 36,116, 68,133,242,242,101, 71, 81,250,188,185,106, 15, 67,113, 99,239,183,107,245,232, 9,183,107,219,224, 58,227, 63,165,
+142,190,158, 48, 77,158,254, 98, 55,217,118, 36, 14,246, 5,200, 7,112, 64, 22, 35,166,219,210, 47,185, 82,233, 80,131,107,114,
+ 60,217, 83, 30,159, 55, 1, 97, 10,126, 99,143, 59,200, 93, 39, 36,248, 79, 52,216, 74,146, 85,208,149, 28,227, 87, 58,150,229,
+ 67,154,202, 4, 96, 35, 72,171, 77,110, 44, 73,100, 36,180,229, 58,157,136,136, 91,136, 10,230,111,157,193, 37,215, 17,208,101,
+244,168,228,117,214,181, 64,187,158,122, 93, 82, 99, 15, 54,251, 37,214,153,128, 31,117, 72,105,199, 39,177,225, 23,146,164,156,
+ 48,194, 20,135,157, 91,128,140, 41,148,243,100, 17,156, 82,117,230,220,185,110, 46,150,234,204, 86,210,213, 38, 18,207, 68,178,
+246, 20,194,221,232, 57,159, 45, 69, 67,133, 75, 72, 8, 74,217, 4,243, 28,107, 65,114,134, 28,192, 19, 72,150,215,216,116,216,
+247, 29,143,240, 35,215, 20,246,103,146, 44,245, 78,252,176,174,237,171, 80, 54,208, 8, 14, 67, 30,182, 4,169, 0,130, 8,141,
+150,215, 27,108,165, 82,240, 65, 91,130, 60,226,182,132,167,101,192,151, 29,238, 83, 25, 20,197,120, 81,158, 74,218, 87,253,240,
+ 30, 74,156, 5, 56, 40, 82,144, 70, 78, 52,237, 90, 94,211,206, 31,238, 61,215, 87, 13,251,187,120,211,246, 99,125,216,166,219,
+ 53, 27, 46, 70,225,213,169,180,173,188,223,218, 29,126, 20,116,211,238, 11, 14,254,117,214,224,219,183,114,235, 2,165, 77,157,
+110,215,151, 5,255, 0,172, 41,143, 26,124,233,201, 95,132,215, 47,235,155,134,253, 49,169,137,139, 33, 17,217, 13,120,112, 82,
+ 15, 49,240, 35, 44,163,195,112,169, 32,252,110,120,100, 14,255, 0, 6, 84, 78,117,197,111,105,134,220,238, 93,231, 65,219, 45,
+247,167,109,213,197, 90,217,251, 58,155,114,237,149,225,186, 16,105,102,169,111,209,111, 26,133,206,237,223, 6,220,186, 37, 68,
+ 46, 57, 71, 74,105,117,120,239,199,126, 99, 76,195, 90,234,170,101,153, 10,125, 14,182,139, 3,128,178,227, 14,113,200,102, 49,
+197, 94,146, 41, 26,186, 58, 14,100, 76, 1, 54,102, 4, 50,105,239,205,107, 48,109,241, 25,226,106, 58,222, 29,225,154,236,230,
+154,152, 85, 54, 88,209,177,136, 41, 60,216,218,101,137,193, 42, 24,198,232,143,175, 85,138,168,137,139, 93, 73, 6,112,183, 37,
+ 78,163, 2, 75,208,150,135,161,212, 82,216,153, 17,169,141,173,151,176,166,195,172,115, 50,232, 25,142,243, 42,192, 88,248, 20,
+135, 67,169, 82,146, 1,214, 30,110,102,229, 6,164, 37,229,248, 15,167,153, 14, 21,167,199,131, 45,149, 41,178,218,193,232,133,
+ 37,208,234, 20,133, 14,138, 74,146,161,200,172,136, 53,240,131,237,106,226,159,133, 24, 84, 59, 53,218,219, 59,239,178, 52,133,
+176, 33,109, 62,233,213, 42,115, 87,110, 83,210, 19,207, 27,108,183, 21,133,187, 86,176, 89, 90, 16,222, 98,161, 83,232,235, 9,
+248,233, 74,207, 48,145,223, 13,254,212,238, 15,184,152,159, 78,162,209, 47,183, 54,118,249,175,188,219, 14,237, 94,249, 74,164,
+218,245, 37, 92, 79,169, 49, 99, 27, 63,112,216,112, 91,183,164,105,106, 74, 80,226, 84,253, 38,123,107, 83, 14,125, 94,162,183,
+ 66,108,186,204,183, 48,166,102,149, 71, 62,156, 30,169,168,233, 30,174,159,105, 0, 23, 14,192, 50,168, 43,245,131, 77,196, 95,
+135,248,215,135,243,244,142, 40, 42,125,147, 48, 63,251, 60,246, 73, 9, 31,170,141,253,220,164,236, 80, 35,107,102, 86, 28,176,
+ 93, 65,235,149, 54,227,231, 82,252, 98,143,120,111, 30, 50, 3,153, 10, 74,242,148,190,207, 95,141,149, 1,219,201, 64,160,158,
+157, 92, 10, 45,120, 41, 72, 30, 42,210,211,129, 60,138, 36, 39,194, 40, 56, 9,201,199, 34, 15,194, 82,125, 71, 47, 98, 51,173,
+ 78, 57, 42, 4,150,225, 74, 68,136, 85, 24,204, 38, 66, 27,148,194,153, 91,140, 60,112,210,188, 53,165, 42, 92, 71, 18,144, 65,
+ 31, 2,199, 43,141, 41, 93, 9,204,232,245,213, 45, 41,192, 82, 28, 24, 15, 5,245, 67,125, 1,240,211,143,214, 37, 36, 97, 93,
+148, 8, 56, 7, 58,212, 89, 53, 45,155,126,155,250,244,189,247,220,131,214,195,222, 7, 80, 36, 83, 0,111,109,143, 66, 55,176,
+233,219,176,244,244,232,113,182,208,103, 41,109, 2,130, 8, 28,170, 10, 7, 24, 72, 25,194,155, 35,170,130,179,216, 16,115,215,
+ 3, 58,111, 43, 10,114,143, 57, 62, 8, 83,116,247,138,158,104, 35, 42,247, 7, 50, 75,237, 35, 36,226, 62, 87,206, 17,241, 16,
+ 21,132,140, 32, 1,125,182,231,180,168, 76, 58, 9, 40, 84,116,130,133, 30, 98,133, 5, 4,164,144,145,213, 29,122,131,213, 61,
+ 0, 36, 29, 13,118, 6,157,142,165,164,161, 74, 66,131,137, 36, 16, 75,137, 11,198, 66, 58, 1,225,133,117, 7,177,199, 76,105,
+179, 52,167, 21, 20,206, 20, 94, 88,188,203,247, 14,159,247, 13,175,219, 99,141,204,138,188,229,245,233,172,222,154,164,132,144,
+123,143, 71,223, 96, 84,155,244, 59,106, 94,135,127, 84,218,177, 40, 8,109, 77,171,152, 21,173,176,163,224,169, 71,153, 72,125,
+ 10, 73,232,160, 71, 80,122,228,147,140,224,235, 37,102,160, 10, 82,164,185,132, 45, 57, 74,215,202,149, 96,228, 37, 5, 93, 73,
+ 30, 65, 68,115, 96,128, 73,233,134, 98,157, 41, 13, 56, 75, 78,101, 30, 32, 41,200, 60,139,109,106, 31,174,223, 79,137, 36, 30,
+189,207, 76,140,117,214, 72,221,101, 45,182,162,165, 36, 32,100,243, 41, 75, 81, 70,115,204, 0,245,193,235,219, 60,157,117, 24,
+134, 67,166,254,131,225,214,223,195,240,185, 63, 9,141,122, 6,118, 85, 58,239,247, 92,246,191,191,212,255, 0,166, 51, 26,229,
+207, 71,161, 82,171, 21,250,253, 86, 21, 10,222,160,210,170, 53,218,245,110,162,164,183, 78,161,208,104,176,228, 85, 43,117,153,
+206, 45, 73, 9,137, 18,151, 18, 91,238,228,225, 72,142,160,158,165, 57,252,241,248,236,226,198,175,198,143, 19,187,139,190,210,
+211, 34, 37,167, 54, 67, 54,134,209, 80, 36, 40,149, 91,187, 67,106, 59, 42, 29,153, 29,224, 82, 63,247, 86,123, 78,203,172, 84,
+ 21,128,163, 54,224,117, 10,232,210,117,219,143,110, 55, 31,168,247, 9,220, 13,237, 45,117,106,153, 60, 65,155,196,245,118,153,
+ 33, 73,250,186,148,129, 22,167,110,108,123, 50,218, 88,204,249,174, 8,181, 59,157,180,158,102, 99, 49, 2,144,247, 42,222,154,
+216,140, 58,201, 42, 87, 55, 92,245, 24,242, 62, 93, 51,208, 99, 86, 23, 10,101,174,168,115, 74,133,179,204,161, 98, 4,110, 35,
+184, 38, 79,255, 0, 83,109, 63,224, 1,129, 34, 76,115,135,139, 28, 75, 29, 69, 68,124, 51, 69, 46,168,168, 95, 93, 91, 41,184,
+105,192,178, 67,126,252,133, 36,200, 55,250,214,208, 64,120,119,164,226,207, 66, 6, 58, 99, 61,253,127,110,168, 40,146, 14, 79,
+145, 3,176,234,117,236,175, 32,140,119,245,254,173, 14,178, 50, 7,166,115,251, 53, 54,197, 56, 6,195,215,223,143, 26, 25,222,
+163,190,112,127,103, 95,199,190,136, 80, 4, 28,249,117,233,242,208,171,236, 62,223,191, 74,170,144, 55, 30,252, 27, 3,172, 12,
+ 19,233,219,241, 26, 21,194,122,100, 96, 15, 50,122, 99,167,203, 68, 45, 88, 7,168,198,127, 12,119,207,207, 39,246,104, 39, 14,
+ 65,238,122,244,207, 92,117,243,209,240, 49, 73,194,122,158,135,167, 78,221,191,225,160,214, 70, 49,230,127,175, 85,214,124,179,
+246,254,237, 12,162,115,131,131,230, 15,203, 74,168,176, 3,231,255, 0, 56, 24,164,161,156,124, 57,251,241,165,175, 42, 81, 4,
+128,123,105,104,248, 61,215,161,234, 61,195, 9, 4, 17,131,140,142,223,159,183, 85, 65,193, 7,254, 56,208,233, 56, 57,252,117,
+ 84, 28,245,242,237,243,207,245,104, 16, 14,221,176,115,176,176,216,246,251,173,130,144,113,212,117, 31,209,147,251, 52, 64, 81,
+ 7, 3, 57,199, 92, 12,227,237,208,169, 35,151, 56,237,220,122,227,174,171,161, 97, 64, 96, 17,233,247, 31,233,206,144, 35,125,
+251,225, 50, 15,218,181,186,127, 44, 28,217, 61,137,207, 79,219,211, 69,160,115, 4,228,115, 96,228, 12,227,183,110,191,142,129,
+ 66,176,164,143, 53, 1,246,117,209,136, 61,199,167, 81,162,144, 13,182,219, 5,193,232, 56,201, 61,187,103,231,233,170,157, 57,
+128,201,237,219,190,122,158,195, 61,244, 58, 14, 70, 85,219,229,220,254, 78,137, 78, 6, 9,248,142, 58, 30,199,229,215, 73,176,
+ 32,251,176, 49, 85,178, 80, 71, 49, 24, 29,179,128,122,159,234,206,170,161,228,172,227, 5, 63, 51,208,106,130,129, 57, 36, 12,
+ 43,246, 12,103,250, 53,245, 33, 41, 28,169, 39,168,200, 39,169,243, 62,154,215,113,110,214,192,193, 69, 75, 80, 41, 11, 40, 72,
+242, 79,235, 44,117,198, 14,142,138, 84,193, 74,208,181,165,208, 82,164,172, 44,165,214,212,133, 5,182,227,107, 79, 84, 56,149,
+ 0, 82, 71,108,122,116,213,184, 21,116, 32, 12, 36, 16,175, 92,121, 99,240, 58, 41, 11, 82,192,198, 50,156, 1,158,159,143,207,
+ 73,144, 8, 32,238, 14, 5,200, 32,131, 98, 8, 32,251,198,227,247, 28,108, 53,141,190,213,107,108,134, 43,180,182,171,204,124,
+ 41, 19, 35, 60,136, 85, 18,145,128, 11,205,175, 13,186,160, 60,210,164,149, 28,156, 13,108,141,181,197, 54,220, 70, 82,197, 66,
+151,116,195,121, 72,202,146,221, 49,185,109,229, 32,244, 75,141, 75, 60,221,199, 95, 93,115,201, 4,164,124, 94,189,207, 82, 7,
+168,253,186, 37,176, 66,144, 22, 84,164,142,169, 32,227,161,236, 8,243,244,251,245, 28,174,225,188,174,181,153,164,137,162,103,
+235,203,114,160,244,191,151,117, 31,114,140, 91,121, 55,141,220,125,147,211,199, 74,107,169,243, 88,225, 80,170,107, 41,214, 89,
+ 52,139, 90,242,161,142, 87, 35,177,119,115,110,248,235,133,191,199,206,218,219, 45, 52,170,125,157,118,214,229, 55,146,132,186,
+136,148,166,213,201,219,244,179,102,224, 18, 71,250,170, 3, 29,180,196,241, 5,199, 86,232,111,197, 1,251, 8, 50,221,147,182,
+143, 56,211,211,237, 58, 60,167,100, 74,185,156,140,226, 94,138,213,215, 87, 83,109,251,229, 61,183,144,219,158,226,195,104,140,
+227,141,161,111,151,249, 82,145,162, 3,148,130, 92, 5,192, 20, 20,148,231,148, 55,212,227, 4, 14,186, 61,162, 86,176,146,225,
+ 80, 56,228,194,113,201,219,161,207,235,116, 56,211,117, 47, 5,112,245, 21, 84,117,201, 69,207,170,132,134, 71,149,218, 77, 12,
+ 8, 33,149, 73,229,134, 82, 46,173,163, 82,145,169, 72, 32, 28, 53,241, 15,138,188, 97,196,116,243, 82,213, 84,195, 69, 77, 80,
+ 10,200,180,176, 44, 69,212,245, 83, 35, 25, 38, 10,219,134, 85,145, 85,193, 42,192,169, 32,158,135, 75,235,241, 20,165,243,156,
+130,149,228,227,191,234,252,191,175, 69, 53,226, 20,169,146, 9, 42, 80, 87, 50,134, 0, 79, 79,192,118,208,142, 44, 52,130, 84,
+175,137, 56,248,146, 49,143, 64,122,117,233,170,145,222, 81, 66, 66, 73,248,178, 73, 87, 82, 79,108, 12,246, 29, 53, 36, 61, 54,
+ 29, 62, 70, 43, 94,183, 35,123, 91,175,205,241,136,238,148, 54,166, 91, 20,250,139, 88, 47,209,166,170, 59,233, 79,254, 76,255,
+ 0, 80,172, 99,160,230, 39,240, 58,198,120,103,221, 57,187, 25,196,150,199,238,244, 21,134, 94,176, 55, 62,210,175,186,181, 28,
+ 15,112,143, 87,142,138,146, 84,113,217, 84,215,101, 39,255, 0,165,167,117,218,108,106,205, 62,177, 68, 90, 2, 93,157, 79,120,
+165, 71,245, 68,134, 82, 86,218,243,228,123,254, 61,245,167, 85, 38, 11,109,188,210,135,233,152, 91,140,184,160,122,120,145,212,
+ 83,145,142,255, 0,171,251,117,187, 66, 18,104,170, 41, 36,251, 18,234, 83,255, 0, 68,162,196,254,253, 93,251,227, 20,149, 82,
+101,249,133, 45,100, 91, 73, 4,145,202,189, 62,212,108,174, 63, 16, 49,250,180,211,238,200,245, 37, 67,171,211,156, 15,194,174,
+ 65,129, 89,167, 45, 4, 20,189, 10,173, 21,153,145,214,133,121,160,178,242,122,249,231,190,180,239,217, 89,188,242,168, 28,101,
+113,223,195, 53, 74,165, 21,248,241,110,200, 59,151,105, 48,148, 54,212,150, 99, 85, 66, 25,171, 70, 90,211,133, 72, 8,121,198,
+149,215, 37, 35, 61,129,214,138,112,241,237, 18,181,246,247,217, 85,195,199, 23, 55,221,185, 92,188, 87,110,170,222,216,155,158,
+135, 70,113,168, 85, 74,133,213, 66,154,237,182,137,209,228,212, 2, 90,247, 81, 18, 12,119,150,178,172, 40, 40,165, 36,172, 99,
+ 92, 76,225,195,218, 43,112,108,191,180, 68,241,163, 87,137, 53,218, 13,213,121, 85, 13,251,109, 69,117, 79, 59,252, 93,220,210,
+ 61,214, 85, 57,148,140, 9,179,169,240, 12, 87, 90, 24,253, 35,176,207, 39, 85,140,213, 94,201, 95, 89, 89, 81, 50, 68, 88,229,
+ 41, 44, 77, 97,114,211,137, 33, 50, 70,130,251,177,141, 24, 11,126,210,130,124,216,234, 92,247,139,178,110, 30,135,135, 86, 26,
+240,171,156,212, 69, 53, 68, 96, 18, 70, 89, 60, 14, 18, 89, 46, 45,161,102,104,166, 0, 18,247,167,107, 0, 6,255, 0,166, 5,
+ 42,103, 57, 65, 82,185, 64, 32,133,247,194,134, 58, 28,253,191,183, 79,189,167, 40,130,133, 15,136,130, 15, 48,207, 92,244,234,
+ 62,127,191, 90,215,182,213,122, 45,249,108, 90, 55,197,175, 49, 85, 11, 94,248,160,211,110, 91,114,123,145,228,195, 92,170, 77,
+ 82, 51,114,163, 41,232, 51, 90,109,232,174,134,220, 0,165,196, 37, 67, 29,181,181, 22,173, 32,176,218, 22,172, 0, 58,144, 15,
+ 48, 35,161,232, 51,211,182,149,165,204, 0,210,250,182, 96, 8, 55,216,131,107, 17,234, 8,177, 7,208,223, 12,252,106,244,209,
+ 69, 44, 79,229,112, 89, 74,158,160,131,165,148,142,161,131, 2, 8,234, 8, 32,216,139, 99, 84,189,166, 92, 73, 94, 92, 36,240,
+ 71,190, 60, 72,109,253,170,139,190,243,218,251, 81,202,181, 6,152,247, 63,185,197,151, 53,246,105,136,172, 84, 2, 7, 50,224,
+ 67, 84,180,200,117, 35, 4,165,140, 2,158,227,242,123,220, 13,193,188,183,102,246,187, 55, 70,255, 0,174,202,185,175,125,193,
+184,106,119,117,217, 95,154,225, 92,154,165,106,179, 33, 82,165,200, 61,127, 70,202, 74,130, 26, 64,248, 91,109,180, 33, 32, 37,
+ 35, 95,176,103, 17, 91, 65, 79,226, 3, 96, 55,155,100,106, 73,104,195,221, 29,180,188, 44,162,167,194, 11, 49,228,215,104,147,
+ 33, 65,146,176,160, 71, 43, 83, 28, 97,207,145,107, 58,252,126,111,173,183,174,109,101,223,114,237,205,200,243, 14, 87,172,107,
+134,183,104, 86, 21, 21,196,191, 31,235, 27,118,163, 34,153, 41,108, 62,142,143, 50,181,199, 42, 74,135,250,248,242,211,205, 11,
+ 23,205,103,169,168,185,146,170,158, 46, 83,159, 68,102, 90,132, 67,211,202, 69, 43,202,122,183, 50, 37, 98,121,105,106, 87, 55,
+ 74,198,201,233,231,141, 79,232,234, 57,204, 82, 16, 6,132,158, 85, 50, 83,153, 27,174,169, 99, 74,129, 10, 55,149, 68, 19,180,
+118, 47, 41, 56, 67,100,168,171,151,155, 61, 79, 95, 60,122, 15, 61, 35,130,164,243, 43,195,200,232, 85,144,149, 30,190,103,160,
+235,163,138, 10, 81,148,161, 61, 1, 57,207,196, 1,237,229,215, 58,179, 73, 73,100, 1, 32,169,109,175, 10,108,133,117, 65, 61,
+ 64, 35,211,190,164, 33, 71, 78,184,138, 6, 12,221,108,127,211,249, 99,203,205, 18,188,146,148,164, 30,157,114,114, 49,212,122,
+121,235,227,237, 45,212, 2, 7, 84,167,184, 57,230,251,255, 0,214,210,105,196,231,225,201, 72, 78,112, 71,161,193,239,249,235,
+162,163, 54,227,231, 9,229,102, 56, 25, 86,126, 37, 18, 58,142,158,154, 26, 64,223,165,177,147,211,115,112, 58,252,252,223, 22,
+213, 70,117,150,146,176,201, 81, 88,230, 39, 35,152, 1,253, 61,115,159,248,104,168,146,144,231,232,202,255, 0, 85, 56, 40,229,
+ 0, 30,157, 78,124,245,114, 83, 5, 65, 72, 11,202,122,142,131, 4, 30,196,245,208, 41,136,220, 55, 57,130, 80,160,172,229, 74,
+ 5, 71, 24, 57,192, 61,188,255, 0, 13,102,195,174, 10, 13,246,245,219,231,231,243,194, 75,106, 66,138,139,202,121, 62, 73, 39,
+ 41, 64,244,249,235,195,175,165, 29, 16,164,129,215, 3,176, 10,244,237,242, 58, 13,247, 86, 20,162,210,241,205,219, 9,199, 76,
+118, 57,252,252,244, 57,121,183, 22, 18,162,114, 8, 46, 36,167,166,122, 30,132,122,147,160, 1, 61,122,224,218,109,176, 59,124,
+252,244,193, 73, 62, 42,249,210,160,160, 6, 10, 58, 4,243,117,237,215,174,169,202,116,144,148,163, 9, 35, 41,232,112, 73, 35,
+ 26,244,226,149,225, 44, 52,218, 83,202, 50, 6,112, 73, 3,166, 20, 60,186,106,200, 38, 56, 22,159, 25, 41, 42, 74,136,229, 35,
+ 39,237,230, 7, 25, 25,253,154,205,172, 79, 99,140,129,115,240,254,120,124,184,115,189,156,218,173,243,217,253,196,140,226,154,
+114,201,221, 29,189,186,157,144, 2, 28, 76,104,148, 91,202,137, 62,170,234,144,226,146, 10, 19, 71,106,164, 78, 72,192,235,229,
+214, 89,252, 84, 79,135, 38,165, 91,167, 64,144,125,222, 21, 90, 83,212,194, 9,203,148,103,102,202,149, 75,147, 29,226,231,198,
+199,134,165,180, 86,174, 83,250, 48, 82,145,204,117, 12,134, 36, 32, 58, 89,144,219,141, 68,148, 28, 97,215, 25,112,135,124, 41,
+ 13,150, 30, 13,148,156,182,191, 13,197,224,142,160,224,143, 93, 73,106,193,222, 9,123,221,195,158,213,110, 37, 84, 5,220,177,
+173,145, 99,221,170, 9, 90, 82,245,211, 97, 33,139, 66,186,235,106,113, 41, 18, 89,144,221, 38,151, 80,109,206,169,241,170, 79,
+ 3,133,165, 68,213,126, 32,229,133,243, 12,131, 53, 81,228,136,205, 3,157,175,169,213, 36,139,223,107, 71, 40,244, 5,135, 82,
+109,142,146,250, 55,230, 49,199,158,230,217, 92,205,165,166,142, 42,152,199,111,171, 99, 12,173,241,188,212,235,255, 0,117,239,
+229,177,215, 10, 45,116,211,119, 43,112,233,170, 37,182,230, 76,183, 43,177, 16, 48, 67,141,212,104,203,167, 84, 84,210, 85,250,
+200,247,186, 39, 42,135, 76,169,127, 17,201, 25,126, 41,181,229, 37, 94,246,130,227,139, 83, 98,158,134,210,180,160,134,139,132,
+169, 8,228,234, 57,157, 60,196,119, 33,160, 58, 3,173, 54,220,106,162,232,187,147, 64,173, 32,128,221,114,157, 86,182,101,168,
+ 2,112,236, 98,110, 58, 71, 42, 0,200, 82,156,139, 85,108,168, 12, 37, 47, 14, 99,215, 89,237, 42,241,122, 42, 89,121,149,120,
+143, 68,240,228, 71, 67,193, 97, 42,112, 20,248,104, 82,146, 14, 81,149, 36, 43, 61,130,149,202, 79, 77, 54,154, 98,201, 79, 48,
+ 93,157, 23,215,245, 64,140,254,242,183,247, 3,113,214,216,234,185,107, 85, 90,190,153,200,103,134, 73, 8,185,181,196,141,207,
+ 0,122,217, 95, 77,199,166, 54, 18,161, 94,151, 79,143,238,201, 90,156, 74, 11,144,195, 67, 45,167,222,100,242,185, 41,107, 79,
+ 47, 68,161,128,211, 94, 17, 4,143,139,237,214, 33, 94,188,163, 65,166, 48,194, 95, 91,117, 54,202,144,132, 54,165,128,183, 95,
+199,188,184,162,159,133, 33, 12,114, 39, 3,184,113, 99, 62, 90,108,110,125,200,155, 57,192,243,237, 54,135, 98, 37, 65,105,104,
+184, 83, 38, 67,170, 74,157,117,106, 82, 65,231, 43, 42, 36,158,164, 28,103,182,152, 91,179,113, 22,203, 82, 31,144,227,141,177,
+ 29,133, 60,243,188,138,117,126, 27,202,229, 79,134,132,140,173,213,186,224, 64,230, 35, 28,249, 82,146,156,168,109, 83, 80,180,
+133, 70,155,131,247,250, 91,173,253,215,233,123,143,190, 31,153,230, 40,116,234, 94, 76,155, 11, 13,199,112,250,136, 0, 48,181,
+193, 30,164,142,215, 14, 21,209,121,205, 91,172,198,128, 37,214, 37,203,151, 18,147, 71,162, 69, 74,158,159, 91,173, 84, 31, 76,
+ 74, 61, 38, 10, 82, 57,149, 46, 76,199,210,132, 36,116, 79,141,204,122, 13, 72,111,103,182,153,253,140,217, 59, 59,105,234,166,
+ 43,245,214, 40,146,102,238, 75,165,136,243,169,213, 75,230,241,120, 86, 47, 54, 36,211,230,178,227, 21, 26, 75, 53, 55, 26,167,
+ 24,207,180,236,119, 35,210, 16, 22,218,146,117, 21, 91, 99,137, 58,134,192,111, 54,211,110, 76,122, 84, 42,181,197,100,221,246,
+174,224,205,167, 84,216, 19,169,212,123, 66, 37, 89, 42,151, 77, 97,181, 39,195,159,114, 79,128,212,245,169,240, 22,212,111,116,
+105, 13,225, 69, 58,152,173,218,236, 42,179,108, 87,233, 14,186,253, 46,181, 6,157,112, 82, 30,120, 56,211,238,209,110, 10,124,
+106,204, 5, 62,219,128, 41, 18, 61,194,107, 60,193, 64, 44, 45, 4, 30,186,117,106,119,163, 48,188,177,253, 92,232,116, 31,218,
+177, 26,182, 29, 0, 5,108,118, 44, 24,145,181,142, 35,114,231,116, 85,239,152,101,148,181,162, 92,195, 43,146, 35, 87, 18,135,
+188, 13, 42, 22,128, 23, 42, 35, 98, 66,200, 24, 35, 57,137,208,164,161, 30,202,120, 41,197,183,177,147, 96, 55,194,117, 82,245,
+225,250,163, 11,134,125,197,158,169, 14,206,182,216,166, 75,169,236, 93,114,190,156,248,141,189,108,196, 90,166,237,169,121,196,
+181,250,106, 40,147, 79, 30, 49,116, 81,219, 78,117, 26, 30, 33,248, 90,223,142, 22,238, 53, 90,251,235,183, 21, 75, 77,169,146,
+228, 66,162, 92,232, 13, 87,118,250,239,240, 22,241, 75,150,189,233, 78, 11,167,214, 10,153, 99,198, 17,203,141,204,109,181,161,
+ 79, 69,104,144, 53, 62, 58,210, 27,142,235,239, 21,135, 25, 12,160, 78,108, 32,130, 2, 20,150,218,156,215,108, 60,148,173, 41,
+ 88, 7, 42, 65, 24, 28,201, 25,193,174,203,122,131,116,219,213,139,110,241,182,232, 55,173,161,112, 70, 84, 43,170,207,186,169,
+ 84,234,253,183,113,211,152,109, 97, 46, 84,104,245, 86, 28,142,237, 70, 59, 5,226,196,128,132,200, 66, 22,182,154,125,146, 80,
+180,201,178,222, 38,170,167,211, 29, 71,246,200, 86,223,104,218, 69, 29, 1, 87,177,189,186,233, 96,214, 30, 85, 40, 0, 56,170,
+184,143,195,156,143, 60, 18, 84, 69, 23,232,156,193,247, 18,194,160, 70,237,183,247,176,221, 84,146, 79,219, 83, 27,110, 29,203,
+146,109, 13, 30, 23, 61,163, 28,100,240,219, 38,149,107,237,182,228, 73,189,236,148, 58,150,218,218, 61,216, 67,151,221,136,166,
+144,210, 25,240, 41, 6,169, 45, 53, 11, 53, 66, 58, 57, 80,186, 76,248, 97,190, 98,160,218,142,164,109,178,158,214,237,167,175,
+ 65,161,127, 41,109,181,191,248, 74,174, 85,212,196, 72,247,141,118,159, 86,189,184,118,184, 38, 56,243,200, 67, 20,205,205,163,
+ 65, 92,187,103,244,108,243,134, 42,113, 37,120, 42,121, 41,114,160, 80, 84,117,167,220, 73,251, 19,182,242,247,150,245,217,194,
+ 29,220,173,162,186,165, 45,185,180,237,176,187,166,214,235, 27,115, 85,154,242,203,141, 53,105,221,169,247,138,213,131, 33,111,
+ 58, 60, 24,243, 19, 85,132,218, 80, 19,227,198, 71,195,173, 7,218,190, 57,120,161,246,121,238,117,107,135, 46, 42, 54,246,212,
+222,125,182, 66,215, 76,220,221,149,190,133,155,115,191, 81,182,165,170, 84, 41, 82,173,155,198,146,212,216, 50,159,240,155,121,
+200,241,235, 44, 76, 97,206, 80,135,152,140,178,151, 90,121,170,146, 44,222, 17, 46, 79, 77, 21,101, 90,144,210, 68,210, 26, 90,
+141, 23, 26,157, 24, 36,177, 72,226,224,221,193, 66, 60,166,100, 39,106,230,105,184,247,129,158, 20,172,144,102, 25, 56, 96,130,
+ 73, 11, 77, 13,172, 72, 85,114, 4,208,176, 63,238,220,198, 0, 12,193, 90,219,205,107,111, 55, 22,222,185,109,106, 77,203,105,
+ 92,212, 27,170,209,172,183,227,209, 46,123, 90,179, 79,185, 45,186,219, 47,160, 44, 55, 78,175, 80,230, 63, 25,215,130, 20, 20,
+227, 72,116,188,206, 64,121,180, 19,141,103,175, 87,204,134,148,133, 47,152,148,124, 42, 90,135, 81,202, 0, 79, 42,142, 57,128,
+233,159,246, 64, 39, 57, 58,138, 47, 16, 27, 71,120,112, 95, 98,211, 61,164, 94,203, 13,207,174,217,124, 50,238, 29,187,102,110,
+ 70,229,240,243,119,189, 42, 85,155, 77,162,222,245, 72, 16, 41,117, 22,108,155,169,231, 90,184,109, 7,235, 46,162,151, 58,152,
+243,203,175,208,101,130,245, 6,171, 58,144, 89,145, 18, 68,155, 3,127,214,247,155, 98,118,115,120,231, 91,109, 90,114,247, 99,
+108,236,173,194,145,108,177, 83, 77, 90, 45,188,253,219, 67,139, 87,122,147, 14,164,243,190, 44,248, 45,185, 37, 98, 59,143,101,
+242,194,155, 18, 15,188, 7, 73,143,214,196, 35,167,138,170, 9,185,212,211, 51, 37,153,116, 75, 28,128, 41, 49, 75, 29,205,152,
+ 95,170,150, 83,177,218,235,123, 43,134,115,213,207,218, 72,189,141,233,170,169,213, 93,148,221,209,145,142,149,120,220, 40,189,
+200,177, 4, 41, 27, 0, 8,185,198,215,109,149, 22, 37,219,112, 75,167, 73,165, 92, 21,191,118,183,110, 26,195, 20,107, 85,228,
+ 68,174, 84,165, 82,105,206,202, 98, 44, 87, 92,162,212, 48,165, 45,180,169,192,152,142,168,161, 4, 36, 36,229, 99, 64, 56,226,
+223, 77,219,218,203, 74,243,176,184,111,131,100,212,184,131,106,210,106,188,182,174,237,198,176,104,236,108,117, 26,191,107,238,
+ 45,231, 67,159,114, 83,238, 42,188, 53,220, 59,203, 46,201,218,125,206,169,219, 54,146, 99,166,100,164,216,146,234, 18,227,161,
+ 2,157, 2,167,204, 14, 62, 61,170,123,199,195,134,245,239, 23, 13,187,105,102,194,182,165, 83,246,238,171,105, 84,183, 81, 53,
+244,170,245,137, 87,220,107, 45,183,233,117,187, 54, 41,166, 73,133, 64,143, 76,250,217,135,130,156, 67,211,229, 61, 20,165, 50,
+ 32,160,164,235,150,155,127,199,229, 2,218,166,220, 17, 47,141,155,184,239,201,213, 27, 39,106,105,180,122,212,125,229,250,134,
+170,214,227,109, 78,199,111,230,200, 68,190,174,249,149,109,181,172,187,121, 82,106, 16, 56,129,184, 42,147, 41, 97,218,124,229,
+ 79,183,224, 36,215,213, 28,203,110, 70,206, 69,195,144, 85, 69, 5, 70, 98,154,105,203, 23, 84, 82, 9,145, 88, 2,188,203, 43,
+ 29, 22,223, 64,107,155,217,130, 11,134,211,227, 63, 18,206, 91, 83, 89,150,100, 83,153,115, 5, 2, 9,166,100,112, 41,101, 77,
+ 75, 50,195,172,141, 83, 43,150, 83, 39, 47, 66,149,186, 60,183, 82,141,110,225,240, 39,196,221,155, 81,191,231,222,141, 89,213,
+ 55,237, 88,247,245,205,127,221,171,222,173,181,185, 61,226,240,182,175, 86,237, 91,186,211,159, 89, 98,236,113,202,246,245, 75,
+190,106,209,152,110,218,100, 61,112, 84, 36,212, 28, 91, 16, 22,220,105,170,139,127,159,236,242,222,186, 77, 26,239,166, 87,232,
+112,233,215,213,183,115, 90,106,118,188, 55, 27,106, 92,217,154, 61,128,237, 3,137,199,119, 10,177,114,223, 77,221,139, 75, 53,
+122, 53,223,195, 53,253, 73,112, 71,241, 98,181, 54,200,172, 83,221,113,115,223,163, 51, 57,230,147,199, 5,183,187,182,199, 20,
+139,188,118,233,203, 98,159, 84,186,183,115,137, 91, 34, 52, 27,238, 84,170,188, 61,236,220, 94, 32, 44,203,171,108, 40,237, 75,
+107,110, 95,141, 88,160, 80,145, 95,186, 77, 97,137,205, 83, 25,174,211,162,188, 99, 84, 40,149, 52, 64,143, 46,157, 75,218, 83,
+101, 77,186,105, 19,162,236, 45,249,108,218, 84, 43,254,198,220, 58,109, 34,211,226, 14,155, 2,237, 19,173,203,215,141, 77,199,
+186,173,217,247,125, 99, 98,170, 16,170,182,125,110,232,227, 78,236,167,187, 2, 77, 5,212,166,211,181,219,161, 84, 87, 88,151,
+ 81,153, 91, 22, 42,173, 58,216, 2, 66,109,243,176,249,247,227,159,188,172,197,153,181, 23,220,146, 73, 36,158,189,183, 55,238,
+119,191, 83,134, 79,133, 94, 26, 54,163,119, 40, 23,245, 15,114,220,191,142,226,213, 56,139,225,227,133,189,165,172,237,181,249,
+ 97,155, 30,221,191,119,242,131,196, 96,167, 93,151,172, 39,236,250,202, 55, 62,208,102,241,218,107, 53,128,138, 37,126,130,149,
+ 83,107, 53, 9,204, 84,230, 17, 17,189, 55,212,190, 3,248,146,172,211,160,212,169,214,189,181, 33,186,142,219,211,247, 54, 44,
+ 95,227, 14,196,106,162,186,125, 98,181,178,180, 58, 45,166,105,207, 92, 9,120,110,100,217, 28, 70,108,107,177,109,190, 79,173,
+221, 99,115, 41,203, 76, 94, 97, 37, 17,242,109,137,226,246,211,217,104,251,163, 81,127,101, 62,187,186,171,187,235,180,188, 70,
+108,210,237,235,249, 22, 93,137,180,219,153,179, 84,221,245,137,101, 55, 93,179, 23, 99,212,230,110, 13,155, 14,126,244, 71,153,
+ 30,155, 22,183,110, 58,135, 44,136,172,191, 58, 84,105, 79,178,151,218, 87,181, 90,244, 52,109,183, 49,108, 26,164,171,191,110,
+ 45, 11, 30,153, 2,181,115,110, 83,149,219, 97,171,198,196,221, 46, 9,183, 14, 21,126,223,177, 98,217, 80,152,183,109,137, 17,
+184, 39,182,216,149, 73,247,169,115, 94,157,126,212, 38,174,188,170,109, 62,145, 66,136,100, 17, 21, 93, 71,204, 47,211,227,220,
+219,115,111,195,225,108, 1,107, 11,252,252,239,134,106, 63,179,199,115,133,155,125,215,171,187,135,179,118,237,197,106,110,150,
+201,109,205, 10,223,153,185,246, 52,250, 21,249, 15,122,172, 61,215,189,169, 23, 85,173,123,210,110, 87,226, 85,161,161,221,180,
+ 69, 50, 35, 16,154,153,245,133, 70,101, 86, 39,143, 18,101,191, 50, 43,173, 61,131,193, 94,250,238,142,241,110, 54,200, 89,144,
+172,105,247,150,215, 94, 63,197,253,209, 54,126,230, 88,150,253,156,245,230,245,238,157,187,165, 91,118,205,231,112, 87,162,211,
+175, 26,213, 74,234, 15,179, 73,139, 75,126, 92,138,179, 48,164, 75,167,183, 38, 43, 46, 58,157,172,107,218, 71,106,187,184,205,
+ 93,151, 6,202,110, 37,197,110,209,175, 29,134,190,172,246, 39,241, 13, 5,253,203,160, 93, 60, 62,109,135, 18,118,213,139,112,
+ 73,220, 10,142,200, 73,165, 84,170,177,119, 63,136, 8, 23, 60, 70,218,180,225,210,217,143,182,241, 40,114,169,117, 3, 80,155,
+ 86, 12, 7, 9,252, 89,216,124, 52,223,247, 21,199, 92,217,203,159,115,109, 71,183, 27,106,119, 94,200,183,218,221,216, 86, 93,
+205,110,222, 91, 37,184,134,249,219,247, 46, 91,196,109, 93, 86, 53,227, 71, 49,101, 84,161,213,227,179, 69,164, 59, 61,217, 13,
+ 76,139, 38,154,150, 85, 17,245,109, 21,212, 94,194,230,253,122,118,237,252, 63,118, 51,229,219,231,249, 97,202,188, 61,155,155,
+199,118,239,117,185,183,155, 45,111,219, 48,169,151,253,165,181,247, 29,144,197,255, 0,186, 86, 69,154,185,177,175,167, 54,191,
+110,233, 53, 41,149, 43,218,189, 9,184,108,215,247,190,249,155, 69,160, 50,234,210,253, 65,250, 53, 77,200,172, 42,159, 74,151,
+ 45,166,227,134, 30, 29,118,127,120,246,186,191, 46,244, 59,148,198,229, 93, 91,162,198,209,109, 69, 98,214,187, 45,122, 85,145,
+109,220,147, 54,155,112,111,218, 69, 66,255, 0,180,170,251,125, 80,157,121, 82,101,220,150,181, 18,154,240,167,215,104, 46, 83,
+162, 85, 36,212, 19,245,147,172, 55, 5,237,158,182,189,170,118,111,241,175,183,251,177,186, 92, 50,213, 47,138,213,133, 67,216,
+ 27,113, 74,181,183,186, 14,223, 84,174,122, 47, 11,119,174,202,223, 59, 29, 14,226,170,191,178,245,148,204,114,158,230,219,222,
+ 52, 89,210, 61,212, 74,157,109,221,244, 74,100,119,233,207,218,140,207,171,105,175, 15, 60, 86,219, 59, 19,183, 23, 37,185, 55,
+107, 42,215,157,246,197,244,141,202,218,155,189,189,196,135,110,218,246, 85,232,222,219,222,187,117, 26,163,120, 88,142,109,229,
+ 70, 70,225, 69,136,139,192, 85, 33, 71,143, 94,160, 33, 53, 10, 36,116,205, 53, 8, 43,126, 27,135, 2, 45, 74,111,229,107,222,
+224,251,173,219,227,235,252,241,159, 47, 99,243,255, 0,140,109,229,209,192, 61,139, 67,254, 54, 13, 55,134, 30, 56,238,159,226,
+247,134,189,165,221,155, 88, 82,239, 26, 58,127,141, 58,134,224, 29,184,254, 17,110,133,181,238,252, 37, 74,228,217,202, 39,240,
+190,165,239, 17, 99,253,100,191,208, 49,227,221, 17,185, 92,241,117, 46,135,178,187, 35, 81, 28, 31,213, 31,183,183,186,171, 31,
+122,172,157,204, 93,241,102,218,215,157,151, 58,233,188,119, 54,204,184,111, 91, 90,206,160,237,157, 94,102,218, 53, 31,110,232,
+ 55, 5,201, 73,181, 97, 62,229, 82, 21,212,253, 17,170,156,202,136, 53,143, 5,170,122,233,238,255, 0, 21,182, 21,251, 73,221,
+ 38,109, 61,163,187,173, 42,230,243,109,206,204,217,215,189, 66,226,221,186, 53,235, 74,102,187,180, 15, 88,202,106,225,181, 40,
+212,205,160,161, 61, 71,164,207,141,102,114, 42,155, 50,125, 77,232,203,169,120,130,166,250, 89,240,157,111,237,173,252,177, 83,
+ 70,217,139, 67,114,246,121,205,192,178,182,194,199,221,235, 38,179, 78,133,124, 51,107,215,171,138,221, 10,189,205, 93,167, 93,
+ 54,173,114, 93,149, 85,143,101, 93, 20, 42,173,118, 11,240,157,147, 78,174, 70,121,218, 70, 95,139,225,190, 91,109, 66, 82,230,
+223, 59,143,119,166, 50, 8,184, 3,231,127,135,166, 49, 78, 42,118,162,139,177,156, 68,238,246,208, 80, 63,132, 77, 83,182,246,
+242,168, 91, 74,166, 93,239, 65,153,117,219,117, 40, 41,100, 86,172,219,150,169, 75,166,194,137, 94,175, 81, 43, 42,159, 72,151,
+ 83,133, 10, 28, 42,156,138, 35,149, 8, 81, 34,197,146,211, 13,173, 88,184,129,221,147,190, 91,193,122,238,130, 40, 10,181,162,
+ 92,146,233,172,210,109,231,107, 47, 92,147, 40,244, 11,118,135, 75,181,237,216, 53, 75,142, 68, 40,170,184,107, 72,161, 81,105,
+222,253, 60, 68,134,137,147, 11,242, 90,133, 13,183, 81, 21,165,172, 21, 55, 58, 70,221,186,116,193,180,169,223,215, 31,255,217,
};
+
diff --git a/source/blender/src/toets.c b/source/blender/src/toets.c
index 626aec10a2e..caca9974d4e 100644
--- a/source/blender/src/toets.c
+++ b/source/blender/src/toets.c
@@ -73,6 +73,8 @@
#include "BIF_editseq.h"
#include "BIF_editsound.h"
#include "BIF_editmesh.h"
+#include "BIF_imasel.h"
+#include "BIF_editparticle.h"
#include "BIF_interface.h"
#include "BKE_object.h"
#include "BIF_poseobject.h"
@@ -108,6 +110,9 @@
#include "BIF_poseobject.h"
+#define VIEW_ZOOM_OUT_FACTOR (1.15f)
+#define VIEW_ZOOM_IN_FACTOR (1.0f/VIEW_ZOOM_OUT_FACTOR)
+
/* ------------------------------------------------------------------------- */
static int is_an_active_object(void *ob) {
@@ -155,6 +160,7 @@ void persptoetsen(unsigned short event)
float phi, si, q1[4], vec[3];
static int perspo=1;
int preview3d_event= 1;
+ short mouseloc[2];
float new_dist, orig_ofs[3];
@@ -243,14 +249,20 @@ void persptoetsen(unsigned short event)
if(G.vd->persp==2) {
G.vd->camzoom= MAX2(-30, G.vd->camzoom-5);
}
- else if(G.vd->dist<10.0*G.vd->far) G.vd->dist*=1.2f;
+ else if(G.vd->dist<10.0*G.vd->far) {
+ getmouseco_areawin(mouseloc);
+ view_zoom_mouseloc(VIEW_ZOOM_OUT_FACTOR, mouseloc);
+ }
if(G.vd->persp!=1) preview3d_event= 0;
}
else if(event==PADPLUSKEY) {
if(G.vd->persp==2) {
G.vd->camzoom= MIN2(300, G.vd->camzoom+5);
}
- else if(G.vd->dist> 0.001*G.vd->grid) G.vd->dist*=.83333f;
+ else if(G.vd->dist> 0.001*G.vd->grid) {
+ getmouseco_areawin(mouseloc);
+ view_zoom_mouseloc(VIEW_ZOOM_IN_FACTOR, mouseloc);
+ }
if(G.vd->persp!=1) preview3d_event= 0;
}
else if(event==PAD5) {
@@ -466,6 +478,10 @@ int blenderqread(unsigned short event, short val)
activate_fileselect(FILE_LOADLIB, "Load Library", G.lib, 0);
return 0;
}
+ else if(G.qual==LR_CTRLKEY) {
+ activate_imageselect(FILE_LOADLIB, "Load Library", G.lib, 0);
+ return 0;
+ }
break;
case F2KEY:
if(G.qual==0) {
@@ -506,6 +522,15 @@ int blenderqread(unsigned short event, short val)
activate_fileselect(FILE_MAIN, "Data Select", str, NULL);
return 0;
}
+ else if(G.qual==LR_CTRLKEY) {
+
+ memset(str, 0, 16);
+ ob= OBACT;
+ if(ob) strcpy(str, ob->id.name);
+
+ activate_imageselect(FILE_MAIN, "Data Select", str, 0);
+ return 0;
+ }
else if(G.qual==0) {
extern_set_butspace(event, 1);
}
@@ -716,6 +741,9 @@ int blenderqread(unsigned short event, short val)
}
}
}
+ else if(G.qual&LR_CTRLKEY && G.qual&LR_SHIFTKEY){
+ PE_set_particle_edit();
+ }
break;
case BACKSPACEKEY:
diff --git a/source/blender/src/toolbox.c b/source/blender/src/toolbox.c
index d888eb22667..f517eec055c 100644
--- a/source/blender/src/toolbox.c
+++ b/source/blender/src/toolbox.c
@@ -305,7 +305,7 @@ short sbutton(char *var, float min, float max, char *str)
getmouseco_sc(mval);
- if(mval[0]<150) mval[0]=150;
+ if(mval[0]<250) mval[0]=250;
if(mval[1]<30) mval[1]=30;
if(mval[0]>G.curscreen->sizex) mval[0]= G.curscreen->sizex-10;
if(mval[1]>G.curscreen->sizey) mval[1]= G.curscreen->sizey-10;
@@ -313,11 +313,11 @@ short sbutton(char *var, float min, float max, char *str)
block= uiNewBlock(&listb, "button", UI_EMBOSS, UI_HELV, G.curscreen->mainwin);
uiBlockSetFlag(block, UI_BLOCK_LOOP|UI_BLOCK_REDRAW|UI_BLOCK_RET_1|UI_BLOCK_ENTER_OK);
- x1=mval[0]-150;
+ x1=mval[0]-250;
y1=mval[1]-20;
- uiDefButC(block, TEX, 32766, str, x1+5,y1+10,125,20, var,(float)min,(float)max, 0, 0, "");
- uiDefBut(block, BUT, 32767, "OK", x1+136,y1+10,25,20, NULL, 0, 0, 0, 0, "");
+ uiDefButC(block, TEX, 32766, str, x1+5,y1+10,225,20, var,(float)min,(float)max, 0, 0, "");
+ uiDefBut(block, BUT, 32767, "OK", x1+236,y1+10,25,20, NULL, 0, 0, 0, 0, "");
uiBoundsBlock(block, 5);
@@ -326,6 +326,7 @@ short sbutton(char *var, float min, float max, char *str)
if(ret==UI_RETURN_OK) return 1;
return 0;
+
}
short fbutton(float *var, float min, float max, float a1, float a2, char *str)
@@ -892,6 +893,7 @@ static TBitem tb_object_select_grouped[]= {
{ 0, "Objects on Shared Layers|Shift G, 6", 6, NULL},
{ 0, "Objects in Same Group|Shift G, 7", 7, NULL},
{ 0, "Object Hooks|Shift G, 8", 8, NULL},
+{ 0, "Object PassIndex|Shift G, 9", 9, NULL},
{ -1, "", 0, do_view3d_select_object_groupedmenu}};
static TBitem tb_object_select[]= {
@@ -919,8 +921,8 @@ static TBitem tb_face_select[]= {
static TBitem tb_mesh_select[]= {
{ 0, "Border Select|B", 0, NULL},
{ 0, "SEPR", 0, NULL},
-{ 0, "(De)select All|A", 2, NULL},
-{ 0, "Inverse", 3, NULL},
+{ 0, "Select/Deselect All|A", 2, NULL},
+{ 0, "Inverse|Ctrl I", 3, NULL},
{ 0, "SEPR", 0, NULL},
{ 0, "Random...", 5, NULL},
{ 0, "Non-Manifold|Shift Ctrl Alt M", 9, NULL},
@@ -929,7 +931,7 @@ static TBitem tb_mesh_select[]= {
{ 0, "Triangles|Shift Ctrl Alt 3", 11, NULL},
{ 0, "Quads|Shift Ctrl Alt 4", 12, NULL},
{ 0, "Non-Triangles/Quads|Shift Ctrl Alt 5", 13, NULL},
-{ 0, "Group From Selection|Shift G", 21, NULL},
+{ 0, "Similar to Selection|Shift G", 21, NULL},
{ 0, "SEPR", 0, NULL},
{ 0, "More|Ctrl NumPad +", 7, NULL},
{ 0, "Less|Ctrl NumPad -", 8, NULL},
@@ -1060,9 +1062,9 @@ static TBitem tb_mesh_edit_face[]= {
{ 0, "SEPR", 0, NULL},
{ 0, "Convert to Triangles|Ctrl T", 2, NULL},
{ 0, "Convert to Quads|Alt J", 3, NULL},
-{ 0, "Flip Triangle Edges|Ctrl F", 4, NULL},
-{ 0, "Set Smooth|W, Alt 3", 6, NULL},
-{ 0, "Set Solid|W, Alt 4", 7, NULL},
+{ 0, "Flip Triangle Edges|Ctrl Shift F", 4, NULL},
+{ 0, "Set Smooth|Ctrl F, 3", 6, NULL},
+{ 0, "Set Solid|Ctrl F, 4", 7, NULL},
{ -1, "", 0, do_view3d_edit_mesh_facesmenu}};
@@ -1070,13 +1072,13 @@ static TBitem tb_mesh_edit_normal[]= {
{ 0, "Recalculate Outside|Ctrl N", 2, NULL},
{ 0, "Recalculate Inside|Ctrl Shift N", 1, NULL},
{ 0, "SEPR", 0, NULL},
-{ 0, "Flip|W, 9", 0, NULL},
+{ 0, "Flip|Ctrl F, 1", 0, NULL},
{ -1, "", 0, do_view3d_edit_mesh_normalsmenu}};
static TBitem tb_mesh_edit[]= {
{ 0, "Exit Editmode|Tab", TB_TAB, NULL},
-{ 0, "Undo|U", 'u', NULL},
-{ 0, "Redo|Shift U", 'U', NULL},
+{ 0, "Undo|Ctrl Z", 'u', NULL},
+{ 0, "Redo|Ctrl Shift Z", 'U', NULL},
{ 0, "SEPR", 0, NULL},
{ 0, "Extrude|E", 'e', NULL},
{ 0, "Duplicate|Shift D", 'D', NULL},
@@ -2094,7 +2096,7 @@ void toolbox_n(void)
}
}
}
- else if (G.f & G_FACESELECT) {
+ else if (FACESEL_PAINT_TEST) {
menu3 = tb_face_select;
}
}
diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c
index 2769f19f9bb..3a438f7331a 100755..100644
--- a/source/blender/src/transform.c
+++ b/source/blender/src/transform.c
@@ -48,6 +48,7 @@
#include "MEM_guardedalloc.h"
#include "DNA_armature_types.h"
+#include "DNA_action_types.h" /* for some special action-editor settings */
#include "DNA_ipo_types.h" /* some silly ipo flag */
#include "DNA_listBase.h"
#include "DNA_meshdata_types.h"
@@ -74,12 +75,20 @@
#include "BIF_toolbox.h" /* notice */
#include "BIF_editmesh.h"
#include "BIF_editsima.h"
+#include "BIF_editparticle.h"
#include "BIF_drawimage.h" /* uvco_to_areaco_noclip */
+#include "BIF_editaction.h"
+#include "BKE_action.h" /* get_action_frame */
#include "BKE_global.h"
#include "BKE_utildefines.h"
#include "BKE_bad_level_calls.h"/* popmenu and error */
+#include "BKE_particle.h"
+#include "BSE_drawipo.h"
+#include "BSE_editnla_types.h" /* for NLAWIDTH */
+#include "BSE_editaction_types.h"
+#include "BSE_time.h"
#include "BSE_view.h"
#include "BLI_arithb.h"
@@ -262,16 +271,26 @@ void convertViewVec(TransInfo *t, float *vec, short dx, short dy)
}
else if(t->spacetype==SPACE_IMAGE) {
float divx, divy, aspx, aspy;
-
+
transform_aspect_ratio_tface_uv(&aspx, &aspy);
-
+
divx= G.v2d->mask.xmax-G.v2d->mask.xmin;
divy= G.v2d->mask.ymax-G.v2d->mask.ymin;
-
+
vec[0]= aspx*(G.v2d->cur.xmax-G.v2d->cur.xmin)*(dx)/divx;
vec[1]= aspy*(G.v2d->cur.ymax-G.v2d->cur.ymin)*(dy)/divy;
vec[2]= 0.0f;
}
+ else if(t->spacetype==SPACE_IPO) {
+ float divx, divy;
+
+ divx= G.v2d->mask.xmax-G.v2d->mask.xmin;
+ divy= G.v2d->mask.ymax-G.v2d->mask.ymin;
+
+ vec[0]= (G.v2d->cur.xmax-G.v2d->cur.xmin)*(dx) / (divx);
+ vec[1]= (G.v2d->cur.ymax-G.v2d->cur.ymin)*(dy) / (divy);
+ vec[2]= 0.0f;
+ }
}
void projectIntView(TransInfo *t, float *vec, int *adr)
@@ -280,13 +299,20 @@ void projectIntView(TransInfo *t, float *vec, int *adr)
project_int(vec, adr);
else if(t->spacetype==SPACE_IMAGE) {
float aspx, aspy, v[2];
-
+
transform_aspect_ratio_tface_uv(&aspx, &aspy);
v[0]= vec[0]/aspx;
v[1]= vec[1]/aspy;
-
+
uvco_to_areaco_noclip(v, adr);
}
+ else if(t->spacetype==SPACE_IPO) {
+ short out[2] = {0.0f, 0.0f};
+
+ ipoco_to_areaco(G.v2d, vec, out);
+ adr[0]= out[0];
+ adr[1]= out[1];
+ }
}
void projectFloatView(TransInfo *t, float *vec, float *adr)
@@ -295,7 +321,14 @@ void projectFloatView(TransInfo *t, float *vec, float *adr)
project_float(vec, adr);
else if(t->spacetype==SPACE_IMAGE) {
int a[2];
-
+
+ projectIntView(t, vec, a);
+ adr[0]= a[0];
+ adr[1]= a[1];
+ }
+ else if(t->spacetype==SPACE_IPO) {
+ int a[2];
+
projectIntView(t, vec, a);
adr[0]= a[0];
adr[1]= a[1];
@@ -350,12 +383,58 @@ void convertDisplayNumToVec(float *num, float *vec)
static void viewRedrawForce(TransInfo *t)
{
- if(t->spacetype==SPACE_VIEW3D)
+ if (t->spacetype == SPACE_VIEW3D)
force_draw(0);
- else if(t->spacetype==SPACE_IMAGE) {
- if(G.sima->lock) force_draw_plus(SPACE_VIEW3D, 0);
+ else if (t->spacetype==SPACE_IMAGE) {
+ if (G.sima->lock) force_draw_plus(SPACE_VIEW3D, 0);
else force_draw(0);
}
+ else if (t->spacetype == SPACE_ACTION) {
+ if (G.saction->lock) {
+ short context;
+
+ /* we ignore the pointer this function returns (not needed) */
+ get_action_context(&context);
+
+ if (context == ACTCONT_ACTION)
+ force_draw_plus(SPACE_VIEW3D, 0);
+ else if (context == ACTCONT_SHAPEKEY)
+ force_draw_all(0);
+ else
+ force_draw(0);
+ }
+ else {
+ force_draw(0);
+ }
+ }
+ else if (t->spacetype == SPACE_NLA) {
+ if (G.snla->lock)
+ force_draw_all(0);
+ else
+ force_draw(0);
+ }
+ else if (t->spacetype == SPACE_IPO) {
+ /* update realtime */
+ if (G.sipo->lock) {
+ if (G.sipo->blocktype==ID_MA || G.sipo->blocktype==ID_TE)
+ force_draw_plus(SPACE_BUTS, 0);
+ else if (G.sipo->blocktype==ID_CA)
+ force_draw_plus(SPACE_VIEW3D, 0);
+ else if (G.sipo->blocktype==ID_KE)
+ force_draw_plus(SPACE_VIEW3D, 0);
+ else if (G.sipo->blocktype==ID_PO)
+ force_draw_plus(SPACE_VIEW3D, 0);
+ else if (G.sipo->blocktype==ID_OB)
+ force_draw_plus(SPACE_VIEW3D, 0);
+ else if (G.sipo->blocktype==ID_SEQ)
+ force_draw_plus(SPACE_SEQ, 0);
+ else
+ force_draw(0);
+ }
+ else {
+ force_draw(0);
+ }
+ }
}
static void viewRedrawPost(TransInfo *t)
@@ -368,6 +447,14 @@ static void viewRedrawPost(TransInfo *t)
allqueue(REDRAWIMAGE, 0);
allqueue(REDRAWVIEW3D, 0);
}
+ else if(ELEM3(t->spacetype, SPACE_ACTION, SPACE_NLA, SPACE_IPO)) {
+ allqueue(REDRAWVIEW3D, 0);
+ allqueue(REDRAWACTION, 0);
+ allqueue(REDRAWNLA, 0);
+ allqueue(REDRAWIPO, 0);
+ allqueue(REDRAWTIME, 0);
+ allqueue(REDRAWBUTSOBJECT, 0);
+ }
scrarea_queue_headredraw(curarea);
}
@@ -492,6 +579,14 @@ static char *transform_to_undostr(TransInfo *t)
return "Bone Width";
case TFM_BONE_ENVELOPE:
return "Bone Envelope";
+ case TFM_TIME_TRANSLATE:
+ return "Translate Anim. Data";
+ case TFM_TIME_SCALE:
+ return "Scale Anim. Data";
+ case TFM_TIME_SLIDE:
+ return "Time Slide";
+ case TFM_BAKE_TIME:
+ return "Key Time";
}
return "Transform";
}
@@ -516,11 +611,11 @@ static void transformEvent(unsigned short event, short val) {
Trans.flag |= T_SHIFT_MOD;
Trans.redraw = 1;
break;
-
+
case SPACEKEY:
if ((Trans.spacetype==SPACE_VIEW3D) && (G.qual & LR_ALTKEY)) {
short mval[2];
-
+
getmouseco_sc(mval);
BIF_selectOrientation();
calc_manipulator_stats(curarea);
@@ -531,7 +626,7 @@ static void transformEvent(unsigned short event, short val) {
Trans.state = TRANS_CONFIRM;
}
break;
-
+
case MIDDLEMOUSE:
if ((Trans.flag & T_NO_CONSTRAINT)==0) {
@@ -541,7 +636,6 @@ static void transformEvent(unsigned short event, short val) {
setLocalConstraint(&Trans, (CON_AXIS2), "along local Z");
else if (Trans.mode==TFM_ROTATION) {
restoreTransObjects(&Trans);
- initTransModeFlags(&Trans, TFM_TRACKBALL);
initTrackball(&Trans);
}
}
@@ -578,7 +672,6 @@ static void transformEvent(unsigned short event, short val) {
/* only switch when... */
if( ELEM3(Trans.mode, TFM_ROTATION, TFM_RESIZE, TFM_TRACKBALL) ) {
restoreTransObjects(&Trans);
- initTransModeFlags(&Trans, TFM_TRANSLATION);
initTranslation(&Trans);
Trans.redraw = 1;
}
@@ -587,7 +680,6 @@ static void transformEvent(unsigned short event, short val) {
/* only switch when... */
if( ELEM3(Trans.mode, TFM_ROTATION, TFM_TRANSLATION, TFM_TRACKBALL) ) {
restoreTransObjects(&Trans);
- initTransModeFlags(&Trans, TFM_RESIZE);
initResize(&Trans);
Trans.redraw = 1;
}
@@ -598,12 +690,10 @@ static void transformEvent(unsigned short event, short val) {
if (Trans.mode == TFM_ROTATION) {
restoreTransObjects(&Trans);
- initTransModeFlags(&Trans, TFM_TRACKBALL);
initTrackball(&Trans);
}
else {
restoreTransObjects(&Trans);
- initTransModeFlags(&Trans, TFM_ROTATION);
initRotation(&Trans);
}
Trans.redraw = 1;
@@ -624,21 +714,31 @@ static void transformEvent(unsigned short event, short val) {
case XKEY:
if ((Trans.flag & T_NO_CONSTRAINT)==0) {
if (cmode == 'X') {
- if (Trans.con.mode & CON_USER) {
+ if (Trans.flag & T_2D_EDIT) {
stopConstraint(&Trans);
}
else {
- if (G.qual == 0)
- setUserConstraint(&Trans, (CON_AXIS0), "along %s X");
- else if ((G.qual == LR_SHIFTKEY) && ((Trans.flag & T_2D_EDIT)==0))
- setUserConstraint(&Trans, (CON_AXIS1|CON_AXIS2), "locking %s X");
+ if (Trans.con.mode & CON_USER) {
+ stopConstraint(&Trans);
+ }
+ else {
+ if (G.qual == 0)
+ setUserConstraint(&Trans, (CON_AXIS0), "along %s X");
+ else if (G.qual == LR_SHIFTKEY)
+ setUserConstraint(&Trans, (CON_AXIS1|CON_AXIS2), "locking %s X");
+ }
}
}
else {
- if (G.qual == 0)
- setConstraint(&Trans, mati, (CON_AXIS0), "along global X");
- else if ((G.qual == LR_SHIFTKEY) && ((Trans.flag & T_2D_EDIT)==0))
- setConstraint(&Trans, mati, (CON_AXIS1|CON_AXIS2), "locking global X");
+ if (Trans.flag & T_2D_EDIT) {
+ setConstraint(&Trans, mati, (CON_AXIS0), "along X axis");
+ }
+ else {
+ if (G.qual == 0)
+ setConstraint(&Trans, mati, (CON_AXIS0), "along global X");
+ else if (G.qual == LR_SHIFTKEY)
+ setConstraint(&Trans, mati, (CON_AXIS1|CON_AXIS2), "locking global X");
+ }
}
Trans.redraw = 1;
}
@@ -646,21 +746,31 @@ static void transformEvent(unsigned short event, short val) {
case YKEY:
if ((Trans.flag & T_NO_CONSTRAINT)==0) {
if (cmode == 'Y') {
- if (Trans.con.mode & CON_USER) {
+ if (Trans.flag & T_2D_EDIT) {
stopConstraint(&Trans);
}
else {
- if (G.qual == 0)
- setUserConstraint(&Trans, (CON_AXIS1), "along %s Y");
- else if ((G.qual == LR_SHIFTKEY) && ((Trans.flag & T_2D_EDIT)==0))
- setUserConstraint(&Trans, (CON_AXIS0|CON_AXIS2), "locking %s Y");
+ if (Trans.con.mode & CON_USER) {
+ stopConstraint(&Trans);
+ }
+ else {
+ if (G.qual == 0)
+ setUserConstraint(&Trans, (CON_AXIS1), "along %s Y");
+ else if (G.qual == LR_SHIFTKEY)
+ setUserConstraint(&Trans, (CON_AXIS0|CON_AXIS2), "locking %s Y");
+ }
}
}
else {
- if (G.qual == 0)
- setConstraint(&Trans, mati, (CON_AXIS1), "along global Y");
- else if ((G.qual == LR_SHIFTKEY) && ((Trans.flag & T_2D_EDIT)==0))
- setConstraint(&Trans, mati, (CON_AXIS0|CON_AXIS2), "locking global Y");
+ if (Trans.flag & T_2D_EDIT) {
+ setConstraint(&Trans, mati, (CON_AXIS1), "along Y axis");
+ }
+ else {
+ if (G.qual == 0)
+ setConstraint(&Trans, mati, (CON_AXIS1), "along global Y");
+ else if (G.qual == LR_SHIFTKEY)
+ setConstraint(&Trans, mati, (CON_AXIS0|CON_AXIS2), "locking global Y");
+ }
}
Trans.redraw = 1;
}
@@ -727,8 +837,13 @@ static void transformEvent(unsigned short event, short val) {
Trans.redraw= 1;
break;
}
+
+ // Numerical input events
Trans.redraw |= handleNumInput(&(Trans.num), event);
+
+ // Snapping events
Trans.redraw |= handleSnapping(&Trans, event);
+
arrows_move_cursor(event);
}
else {
@@ -754,6 +869,10 @@ static void transformEvent(unsigned short event, short val) {
break;
}
}
+
+ // Per transform event, if present
+ if (Trans.handleEvent)
+ Trans.redraw |= Trans.handleEvent(&Trans, event, val);
}
int calculateTransformCenter(int centerMode, float *vec)
@@ -764,13 +883,13 @@ int calculateTransformCenter(int centerMode, float *vec)
Trans.state = TRANS_RUNNING;
Trans.context = CTX_NONE;
+
+ Trans.mode = TFM_DUMMY;
initTrans(&Trans); // internal data, mouse, vectors
createTransData(&Trans); // make TransData structs from selection
- initTransModeFlags(&Trans, TFM_DUMMY); // modal settings in struct Trans
-
Trans.around = centerMode; // override userdefined mode
if (Trans.total == 0) {
@@ -800,6 +919,8 @@ void initTransform(int mode, int context) {
Trans.state = TRANS_RUNNING;
Trans.context = context;
+
+ Trans.mode = mode;
initTrans(&Trans); // internal data, mouse, vectors
@@ -810,8 +931,6 @@ void initTransform(int mode, int context) {
else
Mat3One(Trans.spacemtx);
- initTransModeFlags(&Trans, mode); // modal settings in struct Trans
-
createTransData(&Trans); // make TransData structs from selection
initSnapping(&Trans); // Initialize snapping data AFTER mode flags
@@ -823,7 +942,8 @@ void initTransform(int mode, int context) {
/* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */
/* EVIL2: we gave as argument also texture space context bit... was cleared */
- mode= Trans.mode;
+ /* EVIL3: extend mode for animation editors also switches modes... but is best way to avoid duplicate code */
+ mode = Trans.mode;
calculatePropRatio(&Trans);
calculateCenter(&Trans);
@@ -880,6 +1000,22 @@ void initTransform(int mode, int context) {
case TFM_BONE_ROLL:
initBoneRoll(&Trans);
break;
+ case TFM_TIME_TRANSLATE:
+ initTimeTranslate(&Trans);
+ break;
+ case TFM_TIME_SLIDE:
+ initTimeSlide(&Trans);
+ break;
+ case TFM_TIME_SCALE:
+ initTimeScale(&Trans);
+ break;
+ case TFM_TIME_EXTEND:
+ /* now that transdata has been made, do like for TFM_TIME_TRANSLATE */
+ initTimeTranslate(&Trans);
+ break;
+ case TFM_BAKE_TIME:
+ initBakeTime(&Trans);
+ break;
}
}
@@ -960,6 +1096,8 @@ void initManipulator(int mode)
Trans.context = CTX_NONE;
+ Trans.mode = mode;
+
/* automatic switch to scaling bone envelopes */
if(mode==TFM_RESIZE && G.obedit && G.obedit->type==OB_ARMATURE) {
bArmature *arm= G.obedit->data;
@@ -969,8 +1107,6 @@ void initManipulator(int mode)
initTrans(&Trans); // internal data, mouse, vectors
- initTransModeFlags(&Trans, mode); // modal settings in struct Trans
-
G.moving |= G_TRANSFORM_MANIP; // signal to draw manipuls while transform
createTransData(&Trans); // make TransData structs from selection
@@ -981,7 +1117,7 @@ void initManipulator(int mode)
/* EVIL! posemode code can switch translation to rotate when 1 bone is selected. will be removed (ton) */
/* EVIL2: we gave as argument also texture space context bit... was cleared */
- mode= Trans.mode;
+ mode = Trans.mode;
calculatePropRatio(&Trans);
calculateCenter(&Trans);
@@ -1176,20 +1312,24 @@ static void protectedQuaternionBits(short protectflag, float *quat, float *oldqu
/* ************************** WARP *************************** */
-/* warp is done fully in view space */
void initWarp(TransInfo *t)
{
float max[3], min[3];
int i;
- calculateCenterCursor(t);
+ t->mode = TFM_WARP;
+ t->transform = Warp;
+
t->idx_max = 0;
t->num.idx_max = 0;
- t->transform = Warp;
t->snap[0] = 0.0f;
t->snap[1] = 5.0f;
t->snap[2] = 1.0f;
+ t->flag |= T_NO_CONSTRAINT;
+
+/* warp is done fully in view space */
+ calculateCenterCursor(t);
t->fac = (float)(t->center2d[0] - t->imval[0]);
/* we need min/max in view space */
@@ -1206,15 +1346,15 @@ void initWarp(TransInfo *t)
VECCOPY(min, center);
}
}
-
+
t->center[0]= (min[0]+max[0])/2.0f;
t->center[1]= (min[1]+max[1])/2.0f;
t->center[2]= (min[2]+max[2])/2.0f;
- t->val= (max[0]-min[0])/2.0f; // t->val is free variable
+ if (max[0] == min[0]) max[0] += 0.1; /* 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 */
}
-
int Warp(TransInfo *t, short mval[2])
{
TransData *td = t->data;
@@ -1243,7 +1383,7 @@ int Warp(TransInfo *t, short mval[2])
Mat4MulVecfl(t->viewmat, cursor);
VecSubf(cursor, cursor, t->viewmat[3]);
- // amount of degrees for warp
+ /* amount of degrees for warp */
circumfac= 360.0f * InputHorizontalRatio(t, mval);
snapGrid(t, &circumfac);
@@ -1264,21 +1404,24 @@ int Warp(TransInfo *t, short mval[2])
circumfac*= (float)(-M_PI/360.0);
- for(i = 0 ; i < t->total; i++, td++) {
+ for(i = 0; i < t->total; i++, td++) {
float loc[3];
if (td->flag & TD_NOACTION)
break;
- /* translate point to center, rotate in such a way that outline==distance */
+ if (td->flag & TD_SKIP)
+ continue;
+ /* translate point to center, rotate in such a way that outline==distance */
VECCOPY(vec, td->iloc);
Mat3MulVecfl(td->mtx, vec);
Mat4MulVecfl(t->viewmat, vec);
VecSubf(vec, vec, t->viewmat[3]);
dist= vec[0]-cursor[0];
-
- phi0= (circumfac*dist/t->val); // t->val is X dimension projected boundbox
+
+ /* t->val is X dimension projected boundbox */
+ phi0= (circumfac*dist/t->val);
vec[1]= (vec[1]-cursor[1]);
@@ -1291,7 +1434,7 @@ int Warp(TransInfo *t, short mval[2])
Mat4MulVecfl(t->viewinv, loc);
VecSubf(loc, loc, t->viewinv[3]);
Mat3MulVecfl(td->smtx, loc);
-
+
VecSubf(loc, loc, td->iloc);
VecMulf(loc, td->factor);
VecAddf(td->loc, td->iloc, loc);
@@ -1312,14 +1455,38 @@ int Warp(TransInfo *t, short mval[2])
void initShear(TransInfo *t)
{
+ t->mode = TFM_SHEAR;
+ t->transform = Shear;
+ t->handleEvent = handleEventShear;
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
- t->transform = Shear;
+
+ t->flag |= T_NO_CONSTRAINT;
}
+int handleEventShear(TransInfo *t, unsigned short event, short val)
+{
+ int status = 0;
+
+ if (event == MIDDLEMOUSE && val)
+ {
+ // Use customData pointer to signal Shear direction
+ if (t->customData == 0)
+ t->customData = (void*)1;
+ else
+ t->customData = 0;
+
+ status = 1;
+ }
+
+ return status;
+}
+
+
int Shear(TransInfo *t, short mval[2])
{
TransData *td = t->data;
@@ -1332,7 +1499,11 @@ int Shear(TransInfo *t, short mval[2])
Mat3CpyMat4(persmat, t->viewmat);
Mat3Inv(persinv, persmat);
- value = 0.05f * InputHorizontalAbsolute(t, mval);
+ // Custom data signals shear direction
+ if (t->customData == 0)
+ value = 0.05f * InputHorizontalAbsolute(t, mval);
+ else
+ value = 0.05f * InputVerticalAbsolute(t, mval);
snapGrid(t, &value);
@@ -1352,7 +1523,13 @@ int Shear(TransInfo *t, short mval[2])
}
Mat3One(smat);
- smat[1][0] = value;
+
+ // Custom data signals shear direction
+ if (t->customData == 0)
+ smat[1][0] = value;
+ else
+ smat[0][1] = value;
+
Mat3MulMat3(tmat, smat, persmat);
Mat3MulMat3(totmat, persinv, tmat);
@@ -1360,6 +1537,9 @@ int Shear(TransInfo *t, short mval[2])
if (td->flag & TD_NOACTION)
break;
+ if (td->flag & TD_SKIP)
+ continue;
+
if (G.obedit) {
float mat3[3][3];
Mat3MulMat3(mat3, totmat, td->mtx);
@@ -1395,6 +1575,23 @@ int Shear(TransInfo *t, short mval[2])
void initResize(TransInfo *t)
{
+ t->mode = TFM_RESIZE;
+ t->transform = Resize;
+
+ t->flag |= T_NULL_ONE;
+ t->num.flag |= NUM_NULL_ONE;
+ t->num.flag |= NUM_AFFECT_ALL;
+ if (!G.obedit) {
+ t->flag |= T_NO_ZERO;
+ t->num.flag |= NUM_NO_ZERO;
+ }
+
+ t->idx_max = 2;
+ t->num.idx_max = 2;
+ t->snap[0] = 0.0f;
+ t->snap[1] = 0.1f;
+ t->snap[2] = t->snap[1] * 0.1f;
+
t->fac = (float)sqrt(
(
((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1]))
@@ -1403,13 +1600,6 @@ void initResize(TransInfo *t)
) );
if(t->fac==0.0f) t->fac= 1.0f; // prevent Inf
-
- t->idx_max = 2;
- t->num.idx_max = 2;
- t->snap[0] = 0.0f;
- t->snap[1] = 0.1f;
- t->snap[2] = t->snap[1] * 0.1f;
- t->transform = Resize;
}
static void headerResize(TransInfo *t, float vec[3], char *str) {
@@ -1506,7 +1696,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
if (td->ext) {
float fsize[3];
- if (t->flag & (T_OBJECT|T_TEXTURE)) {
+ if (t->flag & (T_OBJECT|T_TEXTURE|T_POSE)) {
float obsizemat[3][3];
// Reorient the size mat to fit the oriented object.
Mat3MulMat3(obsizemat, tmat, td->axismtx);
@@ -1520,7 +1710,7 @@ static void ElementResize(TransInfo *t, TransData *td, float mat[3][3]) {
protectedSizeBits(td->protectflag, fsize);
- if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't rotate objects itself
+ if ((t->flag & T_V3D_ALIGN)==0) { // align mode doesn't resize objects itself
/* handle ipokeys? */
if(td->tdi) {
TransDataIpokey *tdi= td->tdi;
@@ -1628,11 +1818,14 @@ int Resize(TransInfo *t, short mval[2])
for(i = 0, td=t->data; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
+
+ if (td->flag & TD_SKIP)
+ continue;
ElementResize(t, td, mat);
}
- /* evil hack - redo resize if cliiping needeed */
+ /* evil hack - redo resize if cliping needed */
if (t->flag & T_CLIP_UV && clipUVTransform(t, size, 1)) {
SizeToMat3(size, mat);
@@ -1661,22 +1854,25 @@ void initToSphere(TransInfo *t)
TransData *td = t->data;
int i;
- // Calculate average radius
- for(i = 0 ; i < t->total; i++, td++) {
- t->val += VecLenf(t->center, td->iloc);
- }
-
- t->val /= (float)t->total;
+ t->mode = TFM_TOSPHERE;
+ t->transform = ToSphere;
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
- t->transform = ToSphere;
-}
+
+ t->num.flag |= NUM_NULL_ONE | NUM_NO_NEGATIVE;
+ t->flag |= T_NO_CONSTRAINT;
+ // Calculate average radius
+ for(i = 0 ; i < t->total; i++, td++) {
+ t->val += VecLenf(t->center, td->iloc);
+ }
+ t->val /= (float)t->total;
+}
int ToSphere(TransInfo *t, short mval[2])
{
@@ -1716,6 +1912,9 @@ int ToSphere(TransInfo *t, short mval[2])
if (td->flag & TD_NOACTION)
break;
+ if (td->flag & TD_SKIP)
+ continue;
+
VecSubf(vec, td->iloc, t->center);
radius = Normalize(vec);
@@ -1726,6 +1925,7 @@ int ToSphere(TransInfo *t, short mval[2])
VecAddf(td->loc, t->center, vec);
}
+
recalcData(t);
@@ -1741,13 +1941,18 @@ int ToSphere(TransInfo *t, short mval[2])
void initRotation(TransInfo *t)
{
+ t->mode = TFM_ROTATION;
+ t->transform = Rotation;
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = (float)((5.0/180)*M_PI);
t->snap[2] = t->snap[1] * 0.2f;
t->fac = 0;
- t->transform = Rotation;
+
+ if (t->flag & T_2D_EDIT)
+ t->flag |= T_NO_CONSTRAINT;
}
static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3]) {
@@ -1763,10 +1968,20 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3]) {
VecAddf(td->loc, vec, t->center);
+ VecSubf(vec,td->loc,td->iloc);
+ protectedTransBits(td->protectflag, vec);
+ VecAddf(td->loc, td->iloc, vec);
+
if(td->flag & TD_USEQUAT) {
Mat3MulSerie(fmat, td->mtx, mat, td->smtx, 0, 0, 0, 0, 0);
Mat3ToQuat(fmat, quat); // Actual transform
- QuatMul(td->ext->quat, quat, td->ext->iquat);
+
+ if(td->ext->quat){
+ QuatMul(td->ext->quat, quat, td->ext->iquat);
+
+ /* is there a reason not to have this here? -jahka */
+ protectedQuaternionBits(td->protectflag, td->ext->quat, td->ext->iquat);
+ }
}
}
/**
@@ -1915,6 +2130,9 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
if (t->around == V3D_LOCAL) {
VECCOPY(center, t->center);
}
+ else {
+ center[0] = center[1] = center[2] = 0.0f;
+ }
VecRotToMat3(axis, angle, mat);
@@ -1922,6 +2140,9 @@ static void applyRotation(TransInfo *t, float angle, float axis[3])
if (td->flag & TD_NOACTION)
break;
+
+ if (td->flag & TD_SKIP)
+ continue;
/* local constraint shouldn't alter center */
if (t->around == V3D_LOCAL) {
@@ -2054,21 +2275,24 @@ int Rotation(TransInfo *t, short mval[2])
void initTrackball(TransInfo *t)
{
+ t->mode = TFM_TRACKBALL;
+ t->transform = Trackball;
+
t->idx_max = 1;
t->num.idx_max = 1;
t->snap[0] = 0.0f;
t->snap[1] = (float)((5.0/180)*M_PI);
t->snap[2] = t->snap[1] * 0.2f;
t->fac = 0;
- t->transform = Trackball;
- t->flag |= T_NO_CONSTRAINT; /* making sure the flag is always set */
+ t->flag |= T_NO_CONSTRAINT;
}
static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float angles[2])
{
TransData *td = t->data;
float mat[3][3], smat[3][3], totmat[3][3];
+ float center[3];
int i;
VecRotToMat3(axis1, angles[0], smat);
@@ -2079,10 +2303,22 @@ static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float a
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
+
+ if (td->flag & TD_SKIP)
+ continue;
+
+ VECCOPY(center, t->center);
if (t->around == V3D_LOCAL) {
- if (t->flag & T_OBJECT)
- VECCOPY(t->center, td->center); // not supported in editmode yet
+ /* local-mode shouldn't change center */
+ if (t->flag & (T_OBJECT|T_POSE)) {
+ VECCOPY(t->center, td->center);
+ }
+ else {
+ if(G.vd->around==V3D_LOCAL && (G.scene->selectmode & SCE_SELECT_FACE)) {
+ VECCOPY(t->center, td->center);
+ }
+ }
}
if (t->flag & T_PROP_EDIT) {
@@ -2091,8 +2327,10 @@ static void applyTrackball(TransInfo *t, float axis1[3], float axis2[3], float a
Mat3MulMat3(mat, smat, totmat);
}
-
+
ElementRotation(t, td, mat);
+
+ VECCOPY(t->center, center);
}
}
@@ -2157,10 +2395,14 @@ int Trackball(TransInfo *t, short mval[2])
void initTranslation(TransInfo *t)
{
+ t->mode = TFM_TRANSLATION;
+ t->transform = Translation;
+
t->idx_max = (t->flag & T_2D_EDIT)? 1: 2;
+ t->num.flag = 0;
t->num.idx_max = t->idx_max;
- t->transform = Translation;
+
if(t->spacetype == SPACE_VIEW3D) {
/* initgrabz() defines a factor for perspective depth correction, used in window_to_3d() */
if(t->flag & (T_EDIT|T_POSE)) {
@@ -2171,7 +2413,9 @@ void initTranslation(TransInfo *t)
Mat4MulVecfl(ob->obmat, vec);
initgrabz(vec[0], vec[1], vec[2]);
}
- else initgrabz(t->center[0], t->center[1], t->center[2]);
+ else {
+ initgrabz(t->center[0], t->center[1], t->center[2]);
+ }
t->snap[0] = 0.0f;
t->snap[1] = G.vd->gridview * 1.0f;
@@ -2241,6 +2485,9 @@ static void applyTranslation(TransInfo *t, float vec[3]) {
if (td->flag & TD_NOACTION)
break;
+ if (td->flag & TD_SKIP)
+ continue;
+
if (t->con.applyVec) {
float pvec[3];
t->con.applyVec(t, td, vec, tvec, pvec);
@@ -2316,18 +2563,22 @@ int Translation(TransInfo *t, short mval[2])
void initShrinkFatten(TransInfo *t)
{
+ // If not in mesh edit mode, fallback to Resize
if (G.obedit==NULL || G.obedit->type != OB_MESH) {
- initTransModeFlags(t, TFM_RESIZE);
initResize(t);
- return;
}
-
- t->idx_max = 0;
- t->num.idx_max = 0;
- t->snap[0] = 0.0f;
- t->snap[1] = 1.0f;
- t->snap[2] = t->snap[1] * 0.1f;
- t->transform = ShrinkFatten;
+ else {
+ t->mode = TFM_SHRINKFATTEN;
+ t->transform = ShrinkFatten;
+
+ t->idx_max = 0;
+ t->num.idx_max = 0;
+ t->snap[0] = 0.0f;
+ t->snap[1] = 1.0f;
+ t->snap[2] = t->snap[1] * 0.1f;
+
+ t->flag |= T_NO_CONSTRAINT;
+ }
}
@@ -2364,6 +2615,9 @@ int ShrinkFatten(TransInfo *t, short mval[2])
if (td->flag & TD_NOACTION)
break;
+ if (td->flag & TD_SKIP)
+ continue;
+
VECCOPY(vec, td->axismtx[2]);
VecMulf(vec, distance);
VecMulf(vec, td->factor);
@@ -2384,13 +2638,17 @@ int ShrinkFatten(TransInfo *t, short mval[2])
void initTilt(TransInfo *t)
{
+ t->mode = TFM_TILT;
+ t->transform = Tilt;
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = (float)((5.0/180)*M_PI);
t->snap[2] = t->snap[1] * 0.2f;
t->fac = 0;
- t->transform = Tilt;
+
+ t->flag |= T_NO_CONSTRAINT;
}
@@ -2451,6 +2709,9 @@ int Tilt(TransInfo *t, short mval[2])
if (td->flag & TD_NOACTION)
break;
+ if (td->flag & TD_SKIP)
+ continue;
+
if (td->val) {
*td->val = td->ival + final * td->factor;
}
@@ -2512,6 +2773,9 @@ int CurveShrinkFatten(TransInfo *t, short mval[2])
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
+
+ if (td->flag & TD_SKIP)
+ continue;
if(td->val) {
//*td->val= ratio;
@@ -2533,12 +2797,17 @@ int CurveShrinkFatten(TransInfo *t, short mval[2])
void initCurveShrinkFatten(TransInfo *t)
{
+ t->mode = TFM_CURVE_SHRINKFATTEN;
+ t->transform = CurveShrinkFatten;
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
- t->transform = CurveShrinkFatten;
+
+ t->flag |= T_NO_CONSTRAINT;
+
t->fac = (float)sqrt( (
((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1]))
+
@@ -2550,16 +2819,17 @@ void initCurveShrinkFatten(TransInfo *t)
void initPushPull(TransInfo *t)
{
+ t->mode = TFM_PUSHPULL;
+ t->transform = PushPull;
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 1.0f;
t->snap[2] = t->snap[1] * 0.1f;
- t->transform = PushPull;
}
-
int PushPull(TransInfo *t, short mval[2])
{
float vec[3], axis[3];
@@ -2595,6 +2865,9 @@ int PushPull(TransInfo *t, short mval[2])
if (td->flag & TD_NOACTION)
break;
+ if (td->flag & TD_SKIP)
+ continue;
+
VecSubf(vec, t->center, td->center);
if (t->con.applyRot && t->con.mode & CON_APPLY) {
t->con.applyRot(t, td, axis);
@@ -2627,12 +2900,17 @@ int PushPull(TransInfo *t, short mval[2])
void initCrease(TransInfo *t)
{
+ t->mode = TFM_CREASE;
+ t->transform = Crease;
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
- t->transform = Crease;
+
+ t->flag |= T_NO_CONSTRAINT;
+
t->fac = (float)sqrt(
(
((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1]))
@@ -2698,6 +2976,9 @@ int Crease(TransInfo *t, short mval[2])
if (td->flag & TD_NOACTION)
break;
+ if (td->flag & TD_SKIP)
+ continue;
+
if (td->val) {
*td->val = td->ival + crease * td->factor;
if (*td->val < 0.0f) *td->val = 0.0f;
@@ -2720,12 +3001,16 @@ int Crease(TransInfo *t, short mval[2])
void initBoneSize(TransInfo *t)
{
- t->idx_max = 0;
- t->num.idx_max = 0;
+ t->mode = TFM_BONESIZE;
+ t->transform = BoneSize;
+
+ t->idx_max = 2;
+ t->num.idx_max = 2;
+ t->num.flag |= NUM_NULL_ONE;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
- t->transform = BoneSize;
+
t->fac = (float)sqrt( (
((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1]))
+
@@ -2735,6 +3020,29 @@ void initBoneSize(TransInfo *t)
if(t->fac==0.0f) t->fac= 1.0f; // prevent Inf
}
+static void headerBoneSize(TransInfo *t, float vec[3], char *str) {
+ char tvec[60];
+ if (hasNumInput(&t->num)) {
+ outputNumInput(&(t->num), tvec);
+ }
+ else {
+ sprintf(&tvec[0], "%.4f", vec[0]);
+ sprintf(&tvec[20], "%.4f", vec[1]);
+ sprintf(&tvec[40], "%.4f", vec[2]);
+ }
+
+ /* hmm... perhaps the y-axis values don't need to be shown? */
+ if (t->con.mode & CON_APPLY) {
+ if (t->num.idx_max == 0)
+ sprintf(str, "ScaleB: %s%s %s", &tvec[0], t->con.text, t->proptext);
+ else
+ sprintf(str, "ScaleB: %s : %s : %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+ }
+ else {
+ sprintf(str, "ScaleB X: %s Y: %s Z: %s%s %s", &tvec[0], &tvec[20], &tvec[40], t->con.text, t->proptext);
+ }
+}
+
static void ElementBoneSize(TransInfo *t, TransData *td, float mat[3][3])
{
float tmat[3][3], smat[3][3], oldy;
@@ -2761,7 +3069,7 @@ int BoneSize(TransInfo *t, short mval[2])
float size[3], mat[3][3];
float ratio;
int i;
- char str[50];
+ char str[60];
/* for manipulator, center handle, the scaling can't be done relative to center */
if( (t->flag & T_USES_MANIPULATOR) && t->con.mode==0) {
@@ -2809,11 +3117,14 @@ int BoneSize(TransInfo *t, short mval[2])
Mat3CpyMat3(t->mat, mat); // used in manipulator
- headerResize(t, size, str);
+ headerBoneSize(t, size, str);
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
+
+ if (td->flag & TD_SKIP)
+ continue;
ElementBoneSize(t, td, mat);
}
@@ -2834,12 +3145,17 @@ int BoneSize(TransInfo *t, short mval[2])
void initBoneEnvelope(TransInfo *t)
{
+ t->mode = TFM_BONE_ENVELOPE;
+ t->transform = BoneEnvelope;
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
t->snap[1] = 0.1f;
t->snap[2] = t->snap[1] * 0.1f;
- t->transform = BoneEnvelope;
+
+ t->flag |= T_NO_CONSTRAINT;
+
t->fac = (float)sqrt( (
((float)(t->center2d[1] - t->imval[1]))*((float)(t->center2d[1] - t->imval[1]))
+
@@ -2891,8 +3207,17 @@ int BoneEnvelope(TransInfo *t, short mval[2])
for(i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
+
+ if (td->flag & TD_SKIP)
+ continue;
- if(td->val) *td->val= td->ival*ratio;
+ if (td->val) {
+ /* if the old/original value was 0.0f, then just use ratio */
+ if (td->ival)
+ *td->val= td->ival*ratio;
+ else
+ *td->val= ratio;
+ }
}
recalcData(t);
@@ -2911,6 +3236,9 @@ int BoneEnvelope(TransInfo *t, short mval[2])
void initBoneRoll(TransInfo *t)
{
+ t->mode = TFM_BONE_ROLL;
+ t->transform = BoneRoll;
+
t->idx_max = 0;
t->num.idx_max = 0;
t->snap[0] = 0.0f;
@@ -2919,7 +3247,7 @@ void initBoneRoll(TransInfo *t)
t->fac = 0.0f;
- t->transform = BoneRoll;
+ t->flag |= T_NO_CONSTRAINT;
}
int BoneRoll(TransInfo *t, short mval[2])
@@ -2979,6 +3307,9 @@ int BoneRoll(TransInfo *t, short mval[2])
for (i = 0; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
+
+ if (td->flag & TD_SKIP)
+ continue;
*(td->val) = td->ival - final;
}
@@ -2994,6 +3325,85 @@ int BoneRoll(TransInfo *t, short mval[2])
return 1;
}
+/* ************************** BAKE TIME ******************* */
+
+void initBakeTime(TransInfo *t)
+{
+ t->idx_max = 0;
+ t->num.idx_max = 0;
+ t->snap[0] = 0.0f;
+ t->snap[1] = 1.0f;
+ t->snap[2] = t->snap[1] * 0.1f;
+ t->transform = BakeTime;
+ t->fac = 0.1f;
+}
+
+int BakeTime(TransInfo *t, short mval[2])
+{
+ TransData *td = t->data;
+ float time;
+ int i;
+ char str[50];
+
+
+ if(t->flag & T_SHIFT_MOD) {
+ /* calculate ratio for shiftkey pos, and for total, and blend these for precision */
+ time= (float)(t->center2d[0] - t->shiftmval[0])*t->fac;
+ time+= 0.1f*((float)(t->center2d[0]*t->fac - mval[0]) -time);
+ }
+ else {
+ time = (float)(t->center2d[0] - mval[0])*t->fac;
+ }
+
+ snapGrid(t, &time);
+
+ applyNumInput(&t->num, &time);
+
+ /* header print for NumInput */
+ if (hasNumInput(&t->num)) {
+ char c[20];
+
+ outputNumInput(&(t->num), c);
+
+ if (time >= 0.0f)
+ sprintf(str, "Time: +%s %s", c, t->proptext);
+ else
+ sprintf(str, "Time: %s %s", c, t->proptext);
+ }
+ else {
+ /* default header print */
+ if (time >= 0.0f)
+ sprintf(str, "Time: +%.3f %s", time, t->proptext);
+ else
+ sprintf(str, "Time: %.3f %s", time, t->proptext);
+ }
+
+ for(i = 0 ; i < t->total; i++, td++) {
+ if (td->flag & TD_NOACTION)
+ break;
+
+ if (td->flag & TD_SKIP)
+ continue;
+
+ if (td->val) {
+ *td->val = td->ival + time * td->factor;
+ if (td->ext->size && *td->val < *td->ext->size) *td->val = *td->ext->size;
+ if (td->ext->quat && *td->val > *td->ext->quat) *td->val = *td->ext->quat;
+ }
+ }
+
+ recalcData(t);
+
+ headerprint(str);
+
+ viewRedrawForce(t);
+
+ helpline (t, t->center);
+
+ return 1;
+}
+
+
/* ************************** MIRROR *************************** */
void Mirror(short mode)
@@ -3011,8 +3421,6 @@ void Mirror(short mode)
Mat3CpyMat4(matview, Trans.viewinv); // t->viewinv was set in initTrans
Mat3Ortho(matview);
- initTransModeFlags(&Trans, TFM_MIRROR); // modal settings in struct Trans
-
createTransData(&Trans); // make TransData structs from selection
calculatePropRatio(&Trans);
@@ -3078,6 +3486,9 @@ void Mirror(short mode)
for(i = 0 ; i < Trans.total; i++, td++) {
if (td->flag & TD_NOACTION)
break;
+
+ if (td->flag & TD_SKIP)
+ continue;
ElementResize(&Trans, td, mat);
}
@@ -3093,6 +3504,512 @@ void Mirror(short mode)
viewRedrawPost(&Trans);
}
+/* ************************** ANIM EDITORS - TRANSFORM TOOLS *************************** */
+
+/* ---------------- Special Helpers for Various Settings ------------- */
+
+/* This function returns the snapping 'mode' for Animation Editors only
+ * We cannot use the standard snapping due to NLA-strip scaling complexities.
+ */
+static short getAnimEdit_SnapMode(TransInfo *t)
+{
+ short autosnap= SACTSNAP_OFF;
+
+ /* currently, some of these are only for the action editor */
+ if (t->spacetype == SPACE_ACTION && G.saction) {
+ switch (G.saction->autosnap) {
+ case SACTSNAP_OFF:
+ if (G.qual == LR_CTRLKEY)
+ autosnap= SACTSNAP_STEP;
+ else if (G.qual == LR_SHIFTKEY)
+ autosnap= SACTSNAP_FRAME;
+ else if (G.qual == LR_ALTKEY)
+ autosnap= SACTSNAP_MARKER;
+ else
+ autosnap= SACTSNAP_OFF;
+ break;
+ case SACTSNAP_STEP:
+ autosnap= (G.qual==LR_CTRLKEY)? SACTSNAP_OFF: SACTSNAP_STEP;
+ break;
+ case SACTSNAP_FRAME:
+ autosnap= (G.qual==LR_SHIFTKEY)? SACTSNAP_OFF: SACTSNAP_FRAME;
+ break;
+ case SACTSNAP_MARKER:
+ autosnap= (G.qual==LR_ALTKEY)? SACTSNAP_OFF: SACTSNAP_MARKER;
+ break;
+ }
+ }
+ else if (t->spacetype == SPACE_NLA && G.snla) {
+ switch (G.snla->autosnap) {
+ case SACTSNAP_OFF:
+ if (G.qual == LR_CTRLKEY)
+ autosnap= SACTSNAP_STEP;
+ else if (G.qual == LR_SHIFTKEY)
+ autosnap= SACTSNAP_FRAME;
+ else if (G.qual == LR_ALTKEY)
+ autosnap= SACTSNAP_MARKER;
+ else
+ autosnap= SACTSNAP_OFF;
+ break;
+ case SACTSNAP_STEP:
+ autosnap= (G.qual==LR_CTRLKEY)? SACTSNAP_OFF: SACTSNAP_STEP;
+ break;
+ case SACTSNAP_FRAME:
+ autosnap= (G.qual==LR_SHIFTKEY)? SACTSNAP_OFF: SACTSNAP_FRAME;
+ break;
+ case SACTSNAP_MARKER:
+ autosnap= (G.qual==LR_ALTKEY)? SACTSNAP_OFF: SACTSNAP_MARKER;
+ break;
+ }
+ }
+ else {
+ if (G.qual == LR_CTRLKEY)
+ autosnap= SACTSNAP_STEP;
+ else if (G.qual == LR_SHIFTKEY)
+ autosnap= SACTSNAP_FRAME;
+ else if (G.qual == LR_ALTKEY)
+ autosnap= SACTSNAP_MARKER;
+ else
+ autosnap= SACTSNAP_OFF;
+ }
+
+ return autosnap;
+}
+
+/* This function is used for testing if an Animation Editor is displaying
+ * its data in frames or seconds (and the data needing to be edited as such).
+ * Returns 1 if in seconds, 0 if in frames
+ */
+static short getAnimEdit_DrawTime(TransInfo *t)
+{
+ short drawtime;
+
+ /* currently, some of these are only for the action editor */
+ if (t->spacetype == SPACE_ACTION && G.saction) {
+ drawtime = (G.saction->flag & SACTION_DRAWTIME)? 1 : 0;
+ }
+ else if (t->spacetype == SPACE_NLA && G.snla) {
+ drawtime = (G.snla->flag & SNLA_DRAWTIME)? 1 : 0;
+ }
+ else {
+ drawtime = 0;
+ }
+
+ return drawtime;
+}
+
+
+/* This function is used by Animation Editor specific transform functions to do
+ * the Snap Keyframe to Nearest Frame/Marker
+ */
+static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, Object *ob, short autosnap)
+{
+ /* snap key to nearest frame? */
+ if (autosnap == SACTSNAP_FRAME) {
+ short doTime= getAnimEdit_DrawTime(t);
+ double secf= FPS;
+ float val;
+
+ /* convert frame to nla-action time (if needed) */
+ if (ob)
+ val= get_action_frame_inv(ob, *(td->val));
+ else
+ val= *(td->val);
+
+ /* do the snapping to nearest frame/second */
+ if (doTime)
+ val= (float)( floor((val/secf) + 0.5f) * secf );
+ else
+ val= (float)( floor(val+0.5f) );
+
+ /* convert frame out of nla-action time */
+ if (ob)
+ *(td->val)= get_action_frame(ob, val);
+ else
+ *(td->val)= val;
+ }
+ /* snap key to nearest marker? */
+ else if (autosnap == SACTSNAP_MARKER) {
+ float val;
+
+ /* convert frame to nla-action time (if needed) */
+ if (ob)
+ val= get_action_frame_inv(ob, *(td->val));
+ else
+ val= *(td->val);
+
+ /* snap to nearest marker */
+ val= (float)find_nearest_marker_time(val);
+
+ /* convert frame out of nla-action time */
+ if (ob)
+ *(td->val)= get_action_frame(ob, val);
+ else
+ *(td->val)= val;
+ }
+}
+
+/* ----------------- Translation ----------------------- */
+
+void initTimeTranslate(TransInfo *t)
+{
+ t->mode = TFM_TIME_TRANSLATE;
+ t->transform = TimeTranslate;
+
+ /* num-input has max of (n-1) */
+ t->idx_max = 0;
+ t->num.flag = 0;
+ t->num.idx_max = t->idx_max;
+
+ /* initialise snap like for everything else */
+ t->snap[0] = 0.0f;
+ t->snap[1] = t->snap[2] = 1.0f;
+}
+
+static void headerTimeTranslate(TransInfo *t, char *str)
+{
+ char tvec[60];
+
+ /* if numeric input is active, use results from that, otherwise apply snapping to result */
+ if (hasNumInput(&t->num)) {
+ outputNumInput(&(t->num), tvec);
+ }
+ else {
+ short autosnap= getAnimEdit_SnapMode(t);
+ short doTime = getAnimEdit_DrawTime(t);
+ double secf= FPS;
+ float val= t->fac;
+
+ /* apply snapping + frame->seconds conversions */
+ if (autosnap == SACTSNAP_STEP) {
+ if (doTime)
+ val= floor(val/secf + 0.5f);
+ else
+ val= floor(val + 0.5f);
+ }
+ else {
+ if (doTime)
+ val= val / secf;
+ }
+
+ sprintf(&tvec[0], "%.4f", val);
+ }
+
+ sprintf(str, "DeltaX: %s", &tvec[0]);
+}
+
+static void applyTimeTranslate(TransInfo *t, float sval)
+{
+ TransData *td = t->data;
+ int i;
+
+ short doTime= getAnimEdit_DrawTime(t);
+ double secf= FPS;
+
+ short autosnap= getAnimEdit_SnapMode(t);
+
+ float deltax, val;
+
+ /* it doesn't matter whether we apply to t->data or t->data2d, but t->data2d is more convenient */
+ for (i = 0 ; i < t->total; i++, td++) {
+ /* it is assumed that td->ob is a pointer to the object,
+ * whose active action is where this keyframe comes from
+ */
+ Object *ob= td->ob;
+
+ /* check if any need to apply nla-scaling */
+ if (ob) {
+ deltax = t->fac;
+
+ if (autosnap == SACTSNAP_STEP) {
+ if (doTime)
+ deltax= (float)( floor((deltax/secf) + 0.5f) * secf );
+ else
+ deltax= (float)( floor(deltax + 0.5f) );
+ }
+
+ val = get_action_frame_inv(ob, td->ival);
+ val += deltax;
+ *(td->val) = get_action_frame(ob, val);
+ }
+ else {
+ deltax = val = t->fac;
+
+ if (autosnap == SACTSNAP_STEP) {
+ if (doTime)
+ val= (float)( floor((deltax/secf) + 0.5f) * secf );
+ else
+ val= (float)( floor(val + 0.5f) );
+ }
+
+ *(td->val) = td->ival + val;
+ }
+
+ /* apply nearest snapping */
+ doAnimEdit_SnapFrame(t, td, ob, autosnap);
+ }
+}
+
+int TimeTranslate(TransInfo *t, short mval[2])
+{
+ float cval[2], sval[2];
+ char str[200];
+
+ /* calculate translation amount from mouse movement - in 'time-grid space' */
+ areamouseco_to_ipoco(G.v2d, mval, &cval[0], &cval[1]);
+ areamouseco_to_ipoco(G.v2d, t->imval, &sval[0], &sval[1]);
+
+ /* we only need to calculate effect for time (applyTimeTranslate only needs that) */
+ t->fac= cval[0] - sval[0];
+
+ /* handle numeric-input stuff */
+ t->vec[0] = t->fac;
+ applyNumInput(&t->num, &t->vec[0]);
+ t->fac = t->vec[0];
+ headerTimeTranslate(t, str);
+
+ applyTimeTranslate(t, sval[0]);
+
+ recalcData(t);
+
+ headerprint(str);
+
+ viewRedrawForce(t);
+
+ return 1;
+}
+
+/* ----------------- Time Slide ----------------------- */
+
+void initTimeSlide(TransInfo *t)
+{
+ /* this tool is only really available in the Action Editor... */
+ if (t->spacetype == SPACE_ACTION) {
+ /* set flag for drawing stuff*/
+ G.saction->flag |= SACTION_MOVING;
+ }
+
+ t->mode = TFM_TIME_SLIDE;
+ t->transform = TimeSlide;
+ t->flag |= T_FREE_CUSTOMDATA;
+
+ /* num-input has max of (n-1) */
+ t->idx_max = 0;
+ t->num.flag = 0;
+ t->num.idx_max = t->idx_max;
+
+ /* initialise snap like for everything else */
+ t->snap[0] = 0.0f;
+ t->snap[1] = t->snap[2] = 1.0f;
+}
+
+static void headerTimeSlide(TransInfo *t, float sval, char *str)
+{
+ char tvec[60];
+
+ if (hasNumInput(&t->num)) {
+ outputNumInput(&(t->num), tvec);
+ }
+ else {
+ float minx= *((float *)(t->customData));
+ float maxx= *((float *)(t->customData) + 1);
+ float cval= t->fac;
+ float val;
+
+ val= 2.0*(cval-sval) / (maxx-minx);
+ CLAMP(val, -1.0f, 1.0f);
+
+ sprintf(&tvec[0], "%.4f", val);
+ }
+
+ sprintf(str, "TimeSlide: %s", &tvec[0]);
+}
+
+static void applyTimeSlide(TransInfo *t, float sval)
+{
+ TransData *td = t->data;
+ int i;
+
+ float minx= *((float *)(t->customData));
+ float maxx= *((float *)(t->customData) + 1);
+
+ /* set value for drawing black line */
+ if (t->spacetype == SPACE_ACTION) {
+ G.saction->timeslide= t->fac;
+
+ if (NLA_ACTION_SCALED)
+ sval= get_action_frame(OBACT, sval);
+ }
+
+ /* it doesn't matter whether we apply to t->data or t->data2d, but t->data2d is more convenient */
+ for (i = 0 ; i < t->total; i++, td++) {
+ /* it is assumed that td->ob is a pointer to the object,
+ * whose active action is where this keyframe comes from
+ */
+ Object *ob= td->ob;
+ float cval = t->fac;
+
+ /* apply scaling to necessary values */
+ if (ob)
+ cval= get_action_frame(ob, cval);
+
+ /* only apply to data if in range */
+ if (sval > minx && sval < maxx) {
+ float cvalc= CLAMPIS(cval, minx, maxx);
+ float timefac;
+
+ /* left half? */
+ if (td->ival < sval) {
+ timefac= (sval - td->ival) / (sval - minx);
+ *(td->val)= cvalc - timefac * (cvalc - minx);
+ }
+ else {
+ timefac= (td->ival - sval) / (maxx - sval);
+ *(td->val)= cvalc + timefac * (maxx - cvalc);
+ }
+ }
+ }
+}
+
+int TimeSlide(TransInfo *t, short mval[2])
+{
+ float cval[2], sval[2];
+ char str[200];
+
+ /* calculate mouse co-ordinates */
+ areamouseco_to_ipoco(G.v2d, mval, &cval[0], &cval[1]);
+ areamouseco_to_ipoco(G.v2d, t->imval, &sval[0], &sval[1]);
+
+ /* calculate fake value to work with */
+ t->fac= cval[0];
+
+ /* handle numeric-input stuff */
+ t->vec[0] = t->fac;
+ applyNumInput(&t->num, &t->vec[0]);
+ t->fac = t->vec[0];
+ headerTimeSlide(t, sval[0], str);
+
+ applyTimeSlide(t, sval[0]);
+
+ recalcData(t);
+
+ headerprint(str);
+
+ viewRedrawForce(t);
+
+ return 1;
+}
+
+/* ----------------- Scaling ----------------------- */
+
+void initTimeScale(TransInfo *t)
+{
+ t->mode = TFM_TIME_SCALE;
+ t->transform = TimeScale;
+
+ t->flag |= T_NULL_ONE;
+ t->num.flag |= NUM_NULL_ONE;
+
+ /* num-input has max of (n-1) */
+ t->idx_max = 0;
+ t->num.flag = 0;
+ t->num.idx_max = t->idx_max;
+
+ /* initialise snap like for everything else */
+ t->snap[0] = 0.0f;
+ t->snap[1] = t->snap[2] = 1.0f;
+}
+
+static void headerTimeScale(TransInfo *t, char *str) {
+ char tvec[60];
+
+ if (hasNumInput(&t->num))
+ outputNumInput(&(t->num), tvec);
+ else
+ sprintf(&tvec[0], "%.4f", t->fac);
+
+ sprintf(str, "ScaleX: %s", &tvec[0]);
+}
+
+static void applyTimeScale(TransInfo *t) {
+ TransData *td = t->data;
+ int i;
+
+ short autosnap= getAnimEdit_SnapMode(t);
+ short doTime= getAnimEdit_DrawTime(t);
+ double secf= FPS;
+
+
+ for (i = 0 ; i < t->total; i++, td++) {
+ /* it is assumed that td->ob is a pointer to the object,
+ * whose active action is where this keyframe comes from
+ */
+ Object *ob= td->ob;
+ float startx= CFRA;
+ float fac= t->fac;
+
+ if (autosnap == SACTSNAP_STEP) {
+ if (doTime)
+ fac= (float)( floor(fac/secf + 0.5f) * secf );
+ else
+ fac= (float)( floor(fac + 0.5f) );
+ }
+
+ /* check if any need to apply nla-scaling */
+ if (ob)
+ startx= get_action_frame(ob, startx);
+
+ /* now, calculate the new value */
+ *(td->val) = td->ival - startx;
+ *(td->val) *= fac;
+ *(td->val) += startx;
+
+ /* apply nearest snapping */
+ doAnimEdit_SnapFrame(t, td, ob, autosnap);
+ }
+}
+
+int TimeScale(TransInfo *t, short mval[2])
+{
+ float cval, sval;
+ float deltax, startx;
+ float width= 0.0f;
+ char str[200];
+
+ sval= t->imval[0];
+ cval= mval[0];
+
+ switch (t->spacetype) {
+ case SPACE_ACTION:
+ width= ACTWIDTH;
+ break;
+ case SPACE_NLA:
+ width= NLAWIDTH;
+ break;
+ }
+
+ /* calculate scaling factor */
+ startx= sval-(width/2+(curarea->winrct.xmax-curarea->winrct.xmin)/2);
+ deltax= cval-(width/2+(curarea->winrct.xmax-curarea->winrct.xmin)/2);
+ t->fac = deltax / startx;
+
+ /* handle numeric-input stuff */
+ t->vec[0] = t->fac;
+ applyNumInput(&t->num, &t->vec[0]);
+ t->fac = t->vec[0];
+ headerTimeScale(t, str);
+
+ applyTimeScale(t);
+
+ recalcData(t);
+
+ headerprint(str);
+
+ viewRedrawForce(t);
+
+ return 1;
+}
+
/* ************************************ */
void BIF_TransformSetUndo(char *str)
diff --git a/source/blender/src/transform_constraints.c b/source/blender/src/transform_constraints.c
index ccba909cd6d..99e5123a953 100755..100644
--- a/source/blender/src/transform_constraints.c
+++ b/source/blender/src/transform_constraints.c
@@ -594,12 +594,21 @@ void BIF_setSingleAxisConstraint(float vec[3], char *text) {
Mat3Ortho(space);
Mat3CpyMat3(t->con.mtx, space);
- t->con.mode = (CON_AXIS0|CON_APPLY);
+ t->con.mode = CON_AXIS0;
+
getConstraintMatrix(t);
+ startConstraint(t);
+
/* start copying with an offset of 1, to reserve a spot for the SPACE char */
- if(text) strncpy(t->con.text+1, text, 48); // 50 in struct
-
+ if(text)
+ {
+ strncpy(t->con.text+1, text, 48); /* 50 in struct */
+ }
+ else
+ {
+ t->con.text[1] = '\0'; /* No text */
+ }
t->con.drawExtra = NULL;
t->con.applyVec = applyAxisConstraintVec;
@@ -618,11 +627,21 @@ void BIF_setDualAxisConstraint(float vec1[3], float vec2[3], char *text) {
Mat3Ortho(space);
Mat3CpyMat3(t->con.mtx, space);
- t->con.mode = (CON_AXIS0|CON_AXIS1|CON_APPLY);
+ t->con.mode = CON_AXIS0|CON_AXIS1;
+
getConstraintMatrix(t);
+
+ startConstraint(t);
/* start copying with an offset of 1, to reserve a spot for the SPACE char */
- if(text) strncpy(t->con.text+1, text, 48); // 50 in struct
+ if(text)
+ {
+ strncpy(t->con.text+1, text, 48); /* 50 in struct */
+ }
+ else
+ {
+ t->con.text[1] = '\0'; /* No text */
+ }
t->con.drawExtra = NULL;
t->con.applyVec = applyAxisConstraintVec;
@@ -840,24 +859,40 @@ void postSelectConstraint(TransInfo *t)
t->redraw = 1;
}
-void setNearestAxis(TransInfo *t)
+static void setNearestAxis2d(TransInfo *t)
+{
+ short mval[2];
+ short ival[2];
+
+ getmouseco_areawin(mval);
+ ival[0]= t->imval[0];
+ ival[1]= t->imval[1];
+
+ /* no correction needed... just use whichever one is lower */
+ if ( abs(mval[0]-ival[0]) < abs(mval[1]-ival[1]) ) {
+ t->con.mode |= CON_AXIS1;
+ sprintf(t->con.text, " along Y axis");
+ }
+ else {
+ t->con.mode |= CON_AXIS0;
+ sprintf(t->con.text, " along X axis");
+ }
+}
+
+static void setNearestAxis3d(TransInfo *t)
{
float zfac;
float mvec[3], axis[3], proj[3];
float len[3];
int i, icoord[2];
short coord[2];
-
- t->con.mode &= ~CON_AXIS0;
- t->con.mode &= ~CON_AXIS1;
- t->con.mode &= ~CON_AXIS2;
-
+
+ /* calculate mouse movement */
getmouseco_areawin(coord);
mvec[0] = (float)(coord[0] - t->con.imval[0]);
mvec[1] = (float)(coord[1] - t->con.imval[1]);
mvec[2] = 0.0f;
-
-
+
/* we need to correct axis length for the current zoomlevel of view,
this to prevent projected values to be clipped behind the camera
and to overflow the short integers.
@@ -920,6 +955,25 @@ void setNearestAxis(TransInfo *t)
sprintf(t->con.text, " along %s Z axis", t->spacename);
}
}
+}
+
+void setNearestAxis(TransInfo *t)
+{
+ /* clear any prior constraint flags */
+ t->con.mode &= ~CON_AXIS0;
+ t->con.mode &= ~CON_AXIS1;
+ t->con.mode &= ~CON_AXIS2;
+
+ /* constraint setting - depends on spacetype */
+ if (t->spacetype == SPACE_VIEW3D) {
+ /* 3d-view */
+ setNearestAxis3d(t);
+ }
+ else {
+ /* assume that this means a 2D-Editor */
+ setNearestAxis2d(t);
+ }
+
getConstraintMatrix(t);
}
diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c
index 18fc8c5862a..78284e11e74 100755..100644
--- a/source/blender/src/transform_conversions.c
+++ b/source/blender/src/transform_conversions.c
@@ -58,8 +58,10 @@
#include "DNA_meshdata_types.h"
#include "DNA_meta_types.h"
#include "DNA_modifier_types.h"
+#include "DNA_nla_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
+#include "DNA_particle_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
@@ -70,6 +72,7 @@
#include "DNA_property_types.h"
#include "DNA_vfont_types.h"
#include "DNA_constraint_types.h"
+#include "DNA_listBase.h"
#include "BKE_action.h"
#include "BKE_armature.h"
@@ -84,10 +87,13 @@
#include "BKE_global.h"
#include "BKE_ipo.h"
#include "BKE_lattice.h"
+#include "BKE_key.h"
+#include "BKE_main.h"
#include "BKE_mball.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_softbody.h"
#include "BKE_utildefines.h"
@@ -97,7 +103,9 @@
#include "BIF_editconstraint.h"
#include "BIF_editarmature.h"
#include "BIF_editmesh.h"
+#include "BIF_editnla.h"
#include "BIF_editsima.h"
+#include "BIF_editparticle.h"
#include "BIF_gl.h"
#include "BIF_poseobject.h"
#include "BIF_meshtools.h"
@@ -108,9 +116,11 @@
#include "BIF_toolbox.h"
#include "BSE_view.h"
+#include "BSE_drawipo.h"
#include "BSE_edit.h"
#include "BSE_editipo.h"
#include "BSE_editipo_types.h"
+#include "BSE_editaction_types.h"
#include "BDR_editobject.h" // reset_slowparents()
#include "BDR_unwrapper.h"
@@ -119,6 +129,8 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "editmesh.h"
+
#include "blendef.h"
#include "mydevice.h"
@@ -128,6 +140,8 @@ extern ListBase editelems;
#include "transform.h"
+/* local function prototype - for Object/Bone Constraints */
+static short constraints_list_needinv(TransInfo *t, ListBase *list);
/* ************************** Functions *************************** */
@@ -511,6 +525,7 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
{
Bone *bone= pchan->bone;
float pmat[3][3], omat[3][3];
+ float cmat[3][3], tmat[3][3];
float vec[3];
VECCOPY(vec, pchan->pose_mat[3]);
@@ -518,6 +533,8 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
td->ob = ob;
td->flag= TD_SELECTED|TD_USEQUAT;
+ if(bone->flag & BONE_HINGE_CHILD_TRANSFORM)
+ td->flag |= TD_NOCENTER;
td->protectflag= pchan->protectflag;
td->loc = pchan->loc;
@@ -530,21 +547,34 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
QUATCOPY(td->ext->iquat, pchan->quat);
VECCOPY(td->ext->isize, pchan->size);
- /* proper way to get the parent transform + own transform */
+ /* proper way to get parent transform + own transform + constraints transform */
Mat3CpyMat4(omat, ob->obmat);
- if(pchan->parent) {
- if(pchan->bone->flag & BONE_HINGE)
- Mat3CpyMat4(pmat, pchan->parent->bone->arm_mat);
- else
+
+ if(pchan->parent) {
+ if(pchan->bone->flag & BONE_HINGE)
+ Mat3CpyMat4(pmat, pchan->parent->bone->arm_mat);
+ else
Mat3CpyMat4(pmat, pchan->parent->pose_mat);
-
- Mat3MulSerie(td->mtx, pchan->bone->bone_mat, pmat, omat, 0,0,0,0,0); // dang mulserie swaps args
+
+ if (constraints_list_needinv(t, &pchan->constraints)) {
+ Mat3CpyMat4(tmat, pchan->constinv);
+ Mat3Inv(cmat, tmat);
+ Mat3MulSerie(td->mtx, pchan->bone->bone_mat, pmat, cmat, omat, 0,0,0,0); // dang mulserie swaps args
+ }
+ else
+ Mat3MulSerie(td->mtx, pchan->bone->bone_mat, pmat, omat, 0,0,0,0,0); // dang mulserie swaps args
}
else {
- Mat3MulMat3(td->mtx, omat, pchan->bone->bone_mat); // huh, transposed?
+ if (constraints_list_needinv(t, &pchan->constraints)) {
+ Mat3CpyMat4(tmat, pchan->constinv);
+ Mat3Inv(cmat, tmat);
+ Mat3MulSerie(td->mtx, pchan->bone->bone_mat, cmat, omat, 0, 0,0,0,0); // dang mulserie swaps args
+ }
+ else
+ Mat3MulMat3(td->mtx, omat, pchan->bone->bone_mat); // Mat3MulMat3 has swapped args!
}
- Mat3Inv (td->smtx, td->mtx);
+ Mat3Inv(td->smtx, td->mtx);
/* for axismat we use bone's own transform */
Mat3CpyMat4(pmat, pchan->pose_mat);
@@ -593,7 +623,11 @@ static void bone_children_clear_transflag(ListBase *lb)
Bone *bone= lb->first;
for(;bone;bone= bone->next) {
- bone->flag &= ~BONE_TRANSFORM;
+ if(bone->flag & BONE_HINGE)
+ bone->flag |= BONE_HINGE_CHILD_TRANSFORM;
+ else
+ bone->flag &= ~BONE_TRANSFORM;
+
bone_children_clear_transflag(&bone->childbase);
}
}
@@ -614,6 +648,8 @@ static void set_pose_transflags(TransInfo *t, Object *ob)
bone->flag |= BONE_TRANSFORM;
else
bone->flag &= ~BONE_TRANSFORM;
+
+ bone->flag &= ~BONE_HINGE_CHILD_TRANSFORM;
}
}
@@ -634,8 +670,10 @@ static void set_pose_transflags(TransInfo *t, Object *ob)
if(t->mode==TFM_TRANSLATION) {
if( has_targetless_ik(pchan)==NULL ) {
- if(pchan->parent && (pchan->bone->flag & BONE_CONNECTED))
- t->mode= TFM_ROTATION;
+ if(pchan->parent && (pchan->bone->flag & BONE_CONNECTED)) {
+ if(!(pchan->bone->flag & BONE_HINGE_CHILD_TRANSFORM))
+ t->mode= TFM_ROTATION;
+ }
else if((pchan->protectflag & OB_LOCK_LOC)==OB_LOCK_LOC)
t->mode= TFM_ROTATION;
}
@@ -730,6 +768,7 @@ static void pose_grab_with_ik(Object *ob)
{
bArmature *arm;
bPoseChannel *pchan, *pchansel= NULL;
+ Bone *bonec;
if(ob==NULL || ob->pose==NULL || (ob->flag & OB_POSEMODE)==0)
return;
@@ -747,6 +786,14 @@ static void pose_grab_with_ik(Object *ob)
}
}
if(pchan || pchansel==NULL) return;
+
+ /* rule: no IK for solitary (unconnected) bone */
+ for(bonec=pchansel->bone->childbase.first; bonec; bonec=bonec->next) {
+ if(bonec->flag & BONE_CONNECTED) {
+ break;
+ }
+ }
+ if ((pchansel->bone->flag & BONE_CONNECTED)==0 && (bonec == NULL)) return;
/* rule: if selected Bone is not a root bone, it gets a temporal IK */
if(pchansel->parent) {
@@ -1113,10 +1160,15 @@ static void createTransCurveVerts(TransInfo *t)
if((nu->type & 7)==CU_BEZIER) {
for(a=0, bezt= nu->bezt; a<nu->pntsu; a++, bezt++) {
if(bezt->hide==0) {
- if(bezt->f1 & 1) countsel++;
- if(bezt->f2 & 1) countsel++;
- if(bezt->f3 & 1) countsel++;
- if(propmode) count+= 3;
+ if (G.f & G_HIDDENHANDLES) {
+ if(bezt->f2 & 1) countsel+=3;
+ if(propmode) count+= 3;
+ } else {
+ if(bezt->f1 & 1) countsel++;
+ if(bezt->f2 & 1) countsel++;
+ if(bezt->f3 & 1) countsel++;
+ if(propmode) count+= 3;
+ }
}
}
}
@@ -1146,11 +1198,15 @@ static void createTransCurveVerts(TransInfo *t)
head = tail = td;
for(a=0, bezt= nu->bezt; a<nu->pntsu; a++, bezt++) {
if(bezt->hide==0) {
- if(propmode || (bezt->f1 & 1)) {
+
+ if( propmode ||
+ ((bezt->f2 & 1) && (G.f & G_HIDDENHANDLES)) ||
+ ((bezt->f1 & 1) && (G.f & G_HIDDENHANDLES)==0)
+ ) {
VECCOPY(td->iloc, bezt->vec[0]);
td->loc= bezt->vec[0];
VECCOPY(td->center, bezt->vec[1]);
- if(bezt->f1 & 1) td->flag= TD_SELECTED;
+ if(bezt->f1 & 1 || G.f & G_HIDDENHANDLES) td->flag= TD_SELECTED;
else td->flag= 0;
td->ext = NULL;
td->tdi = NULL;
@@ -1163,7 +1219,8 @@ static void createTransCurveVerts(TransInfo *t)
count++;
tail++;
}
- /* THIS IS THE CV, the other two are handles */
+
+ /* This is the Curve Point, the other two are handles */
if(propmode || (bezt->f2 & 1)) {
VECCOPY(td->iloc, bezt->vec[1]);
td->loc= bezt->vec[1];
@@ -1173,12 +1230,14 @@ static void createTransCurveVerts(TransInfo *t)
td->ext = NULL;
td->tdi = NULL;
- if (t->mode==TFM_CURVE_SHRINKFATTEN) {
+ if (t->mode==TFM_CURVE_SHRINKFATTEN) { /* || t->mode==TFM_RESIZE) {*/ /* TODO - make points scale */
td->val = &(bezt->radius);
td->ival = bezt->radius;
- } else {
+ } else if (t->mode==TFM_TILT) {
td->val = &(bezt->alfa);
td->ival = bezt->alfa;
+ } else {
+ td->val = NULL;
}
Mat3CpyMat3(td->smtx, smtx);
@@ -1188,11 +1247,14 @@ static void createTransCurveVerts(TransInfo *t)
count++;
tail++;
}
- if(propmode || (bezt->f3 & 1)) {
+ if( propmode ||
+ ((bezt->f1 & 1) && (G.f & G_HIDDENHANDLES)) ||
+ ((bezt->f3 & 1) && (G.f & G_HIDDENHANDLES)==0)
+ ) {
VECCOPY(td->iloc, bezt->vec[2]);
td->loc= bezt->vec[2];
VECCOPY(td->center, bezt->vec[1]);
- if(bezt->f3 & 1) td->flag= TD_SELECTED;
+ if(bezt->f3 & 1 || (G.f & G_HIDDENHANDLES)) td->flag= TD_SELECTED;
else td->flag= 0;
td->ext = NULL;
td->tdi = NULL;
@@ -1228,7 +1290,7 @@ static void createTransCurveVerts(TransInfo *t)
td->ext = NULL;
td->tdi = NULL;
- if (t->mode==TFM_CURVE_SHRINKFATTEN) {
+ if (t->mode==TFM_CURVE_SHRINKFATTEN || t->mode==TFM_RESIZE) {
td->val = &(bp->radius);
td->ival = bp->radius;
} else {
@@ -1312,6 +1374,159 @@ static void createTransLatticeVerts(TransInfo *t)
}
}
+/* ******************* particle edit **************** */
+static void createTransParticleVerts(TransInfo *t)
+{
+ TransData *td = NULL;
+ TransDataExtension *tx;
+ Base *base = BASACT;
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleSystemModifierData *psmd = NULL;
+ ParticleEditSettings *pset = PE_settings();
+ ParticleData *pa = NULL;
+ ParticleEdit *edit;
+ ParticleEditKey *key;
+ float mat[4][4];
+ int i,k, totpart, transformparticle;
+ int count = 0, hasselected = 0;
+ int propmode = t->flag & T_PROP_EDIT;
+
+ if(psys==NULL || G.scene->selectmode==SCE_SELECT_PATH) return;
+
+ psmd = psys_get_modifier(ob,psys);
+
+ edit = psys->edit;
+ totpart = psys->totpart;
+ base->flag |= BA_HAS_RECALC_DATA;
+
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++) {
+ pa->flag &= ~PARS_TRANSFORM;
+ transformparticle= 0;
+
+ if((pa->flag & PARS_HIDE)==0) {
+ for(k=0, key=edit->keys[i]; k<pa->totkey; k++, key++) {
+ if((key->flag&PEK_HIDE)==0) {
+ if(key->flag&PEK_SELECT) {
+ hasselected= 1;
+ transformparticle= 1;
+ }
+ else if(propmode)
+ transformparticle= 1;
+ }
+ }
+ }
+
+ if(transformparticle) {
+ count += pa->totkey;
+ pa->flag |= PARS_TRANSFORM;
+ }
+ }
+
+ /* note: in prop mode we need at least 1 selected */
+ if (hasselected==0) return;
+
+ t->total = count;
+ td = t->data = MEM_callocN(t->total * sizeof(TransData), "TransObData(Particle Mode)");
+
+ if(t->mode == TFM_BAKE_TIME)
+ tx = t->ext = MEM_callocN(t->total * sizeof(TransDataExtension), "Particle_TransExtension");
+ else
+ tx = t->ext = NULL;
+
+ Mat4One(mat);
+
+ Mat4Invert(ob->imat,ob->obmat);
+
+ for(i=0, pa=psys->particles; i<totpart; i++, pa++) {
+ TransData *head, *tail;
+ head = tail = td;
+
+ if(!(pa->flag & PARS_TRANSFORM)) continue;
+
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, mat);
+
+ for(k=0, key=edit->keys[i]; k<pa->totkey; k++, key++) {
+ VECCOPY(key->world_co, key->co);
+ Mat4MulVecfl(mat, key->world_co);
+ td->loc = key->world_co;
+
+ VECCOPY(td->iloc, td->loc);
+ VECCOPY(td->center, td->loc);
+
+ if(key->flag & PEK_SELECT)
+ td->flag |= TD_SELECTED;
+ else if(!propmode)
+ td->flag |= TD_SKIP;
+
+ Mat3One(td->mtx);
+ Mat3One(td->smtx);
+
+ /* don't allow moving roots */
+ if(k==0 && pset->flag & PE_LOCK_FIRST)
+ td->protectflag |= OB_LOCK_LOC;
+
+ td->ext = tx;
+ td->tdi = NULL;
+ if(t->mode == TFM_BAKE_TIME) {
+ td->val = key->time;
+ td->ival = *(key->time);
+ /* abuse size and quat for min/max values */
+ td->flag |= TD_NO_EXT;
+ if(k==0) tx->size = 0;
+ else tx->size = (key - 1)->time;
+
+ if(k == pa->totkey - 1) tx->quat = 0;
+ else tx->quat = (key + 1)->time;
+ }
+
+ td++;
+ if(tx)
+ tx++;
+ tail++;
+ }
+ if (propmode && head != tail)
+ calc_distanceCurveVerts(head, tail - 1);
+ }
+}
+
+void flushTransParticles(TransInfo *t)
+{
+ Object *ob = OBACT;
+ ParticleSystem *psys = PE_get_current(ob);
+ ParticleSystemModifierData *psmd;
+ ParticleData *pa;
+ ParticleEditKey *key;
+ TransData *td;
+ float mat[4][4], imat[4][4], co[3];
+ int i, k, propmode = t->flag & T_PROP_EDIT;
+
+ psmd = psys_get_modifier(ob, psys);
+
+ /* we do transform in world space, so flush world space position
+ * back to particle local space */
+ td= t->data;
+ for(i=0, pa=psys->particles; i<psys->totpart; i++, pa++, td++) {
+ if(!(pa->flag & PARS_TRANSFORM)) continue;
+
+ psys_mat_hair_to_global(ob, psmd->dm, psys->part->from, pa, mat);
+ Mat4Invert(imat,mat);
+
+ for(k=0, key=psys->edit->keys[i]; k<pa->totkey; k++, key++) {
+ VECCOPY(co, key->world_co);
+ Mat4MulVecfl(imat, co);
+
+ /* optimization for proportional edit */
+ if(!propmode || !FloatCompare(key->co, co, 0.0001f)) {
+ VECCOPY(key->co, co);
+ pa->flag |= PARS_EDIT_RECALC;
+ }
+ }
+ }
+
+ PE_update_object(OBACT, 1);
+}
+
/* ********************* mesh ****************** */
/* proportional distance based on connectivity */
@@ -1445,9 +1660,14 @@ static void get_face_center(float *cent, EditVert *eve)
}
}
+//way to overwrite what data is edited with transform
+//static void VertsToTransData(TransData *td, EditVert *eve, BakeKey *key)
static void VertsToTransData(TransData *td, EditVert *eve)
{
td->flag = 0;
+ //if(key)
+ // td->loc = key->co;
+ //else
td->loc = eve->co;
VECCOPY(td->center, td->loc);
@@ -1489,43 +1709,33 @@ static void make_vertexcos__mapFunc(void *userData, int index, float *co, float
VECCOPY(vec, co);
}
-/* hurmf, copy from buttons_editing.c, i have to sort this out what it means... */
-static void modifiers_setOnCage(void *ob_v, void *md_v)
+static int modifiers_disable_subsurf_temporary(Object *ob)
{
- Object *ob = ob_v;
ModifierData *md;
+ int disabled = 0;
- int i, cageIndex = modifiers_getCageIndex(ob, NULL );
+ for(md=ob->modifiers.first; md; md=md->next)
+ if(md->type==eModifierType_Subsurf)
+ if(md->mode & eModifierMode_OnCage) {
+ md->mode ^= eModifierMode_DisableTemporary;
+ disabled= 1;
+ }
- for( i = 0, md=ob->modifiers.first; md; ++i, md=md->next )
- if( md == md_v ) {
- if( i >= cageIndex )
- md->mode ^= eModifierMode_OnCage;
- break;
- }
+ return disabled;
}
-
/* disable subsurf temporal, get mapped cos, and enable it */
static float *get_crazy_mapped_editverts(void)
{
DerivedMesh *dm;
- ModifierData *md;
float *vertexcos;
- int i;
-
- for( i = 0, md=G.obedit->modifiers.first; md; ++i, md=md->next ) {
- if(md->type==eModifierType_Subsurf)
- if(md->mode & eModifierMode_OnCage)
- break;
- }
- if(md) {
- /* this call disables subsurf and enables the underlying modifier to deform, apparently */
- modifiers_setOnCage(G.obedit, md);
- /* make it all over */
+
+ /* disable subsurf temporal, get mapped cos, and enable it */
+ if(modifiers_disable_subsurf_temporary(G.obedit)) {
+ /* need to make new derivemesh */
makeDerivedMesh(G.obedit, CD_MASK_BAREMESH);
}
-
+
/* now get the cage */
dm= editmesh_get_derived_cage(CD_MASK_BAREMESH);
@@ -1534,10 +1744,8 @@ static float *get_crazy_mapped_editverts(void)
dm->release(dm);
- if(md) {
- /* set back the flag, no new cage needs to be built, transform does it */
- modifiers_setOnCage(G.obedit, md);
- }
+ /* set back the flag, no new cage needs to be built, transform does it */
+ modifiers_disable_subsurf_temporary(G.obedit);
return vertexcos;
}
@@ -1560,17 +1768,17 @@ static void set_crazy_vertex_quat(float *quat, float *v1, float *v2, float *v3,
}
#undef TAN_MAKE_VEC
-static void set_crazyspace_quats(float *mappedcos, float *quats)
+static void set_crazyspace_quats(float *origcos, float *mappedcos, float *quats)
{
EditMesh *em = G.editMesh;
EditVert *eve, *prev;
EditFace *efa;
- float *v1, *v2, *v3, *v4;
+ float *v1, *v2, *v3, *v4, *co1, *co2, *co3, *co4;
long index= 0;
/* two abused locations in vertices */
for(eve= em->verts.first; eve; eve= eve->next, index++) {
- eve->tmp.fp = NULL;
+ eve->tmp.p = NULL;
eve->prev= (EditVert *)index;
}
@@ -1578,44 +1786,49 @@ static void set_crazyspace_quats(float *mappedcos, float *quats)
for(efa= em->faces.first; efa; efa= efa->next) {
/* retrieve mapped coordinates */
- v1= mappedcos + 3*( (long)(efa->v1->prev) );
- v2= mappedcos + 3*( (long)(efa->v2->prev) );
- v3= mappedcos + 3*( (long)(efa->v3->prev) );
-
- if(efa->v2->tmp.fp==NULL && efa->v2->f1) {
- set_crazy_vertex_quat(quats, efa->v2->co, efa->v3->co, efa->v1->co, v2, v3, v1);
- efa->v2->tmp.fp= quats;
+ v1= mappedcos + 3*(long)(efa->v1->prev);
+ v2= mappedcos + 3*(long)(efa->v2->prev);
+ v3= mappedcos + 3*(long)(efa->v3->prev);
+
+ co1= (origcos)? origcos + 3*(long)(efa->v1->prev): efa->v1->co;
+ co2= (origcos)? origcos + 3*(long)(efa->v2->prev): efa->v2->co;
+ co3= (origcos)? origcos + 3*(long)(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*( (long)(efa->v4->prev) );
-
- if(efa->v1->tmp.fp==NULL && efa->v1->f1) {
- set_crazy_vertex_quat(quats, efa->v1->co, efa->v2->co, efa->v4->co, v1, v2, v4);
- efa->v1->tmp.fp= quats;
+ v4= mappedcos + 3*(long)(efa->v4->prev);
+ co4= (origcos)? origcos + 3*(long)(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.fp==NULL && efa->v3->f1) {
- set_crazy_vertex_quat(quats, efa->v3->co, efa->v4->co, efa->v2->co, v3, v4, v2);
- efa->v3->tmp.fp= quats;
+ 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.fp==NULL && efa->v4->f1) {
- set_crazy_vertex_quat(quats, efa->v4->co, efa->v1->co, efa->v3->co, v4, v1, v3);
- efa->v4->tmp.fp= quats;
+ 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.fp==NULL && efa->v1->f1) {
- set_crazy_vertex_quat(quats, efa->v1->co, efa->v2->co, efa->v3->co, v1, v2, v3);
- efa->v1->tmp.fp= quats;
+ 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.fp==NULL && efa->v3->f1) {
- set_crazy_vertex_quat(quats, efa->v3->co, efa->v1->co, efa->v2->co, v3, v1, v2);
- efa->v3->tmp.fp= quats;
+ 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;
}
}
@@ -1634,10 +1847,15 @@ static void createTransEditVerts(TransInfo *t)
EditVert *eve;
EditVert **nears = NULL;
float *vectors = NULL, *mappedcos = NULL, *quats= NULL;
- float mtx[3][3], smtx[3][3];
- int count=0, countsel=0;
+ float mtx[3][3], smtx[3][3], (*defmats)[3][3] = NULL, (*defcos)[3] = NULL;
+ int count=0, countsel=0, a, totleft;
int propmode = t->flag & T_PROP_EDIT;
- int mirror= (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR);
+ int mirror = 0;
+
+ if ((t->context & CTX_NO_MIRROR) == 0 || (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR))
+ {
+ mirror = 1;
+ }
// transform now requires awareness for select mode, so we tag the f1 flags in verts
if(G.scene->selectmode & SCE_SELECT_VERTEX) {
@@ -1697,10 +1915,23 @@ static void createTransEditVerts(TransInfo *t)
if(propmode==0) {
if(modifiers_getCageIndex(G.obedit, NULL)>=0) {
if(modifiers_isDeformed(G.obedit)) {
- /* disable subsurf temporal, get mapped cos, and enable it */
- mappedcos= get_crazy_mapped_editverts();
- quats= MEM_mallocN( (t->total)*sizeof(float)*4, "crazy quats");
- set_crazyspace_quats(mappedcos, quats);
+ /* check if we can use deform matrices for modifier from the
+ start up to stack, they are more accurate than quats */
+ totleft= editmesh_get_first_deform_matrices(&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= get_crazy_mapped_editverts();
+ quats= MEM_mallocN( (t->total)*sizeof(float)*4, "crazy quats");
+ set_crazyspace_quats((float*)defcos, mappedcos, quats);
+ if(mappedcos)
+ MEM_freeN(mappedcos);
+ }
+
+ if(defcos)
+ MEM_freeN(defcos);
}
}
}
@@ -1716,7 +1947,7 @@ static void createTransEditVerts(TransInfo *t)
}
}
- for (eve=em->verts.first; eve; eve=eve->next) {
+ for (a=0, eve=em->verts.first; eve; eve=eve->next, a++) {
if(eve->h==0) {
if(propmode || eve->f1) {
VertsToTransData(tob, eve);
@@ -1736,11 +1967,22 @@ static void createTransEditVerts(TransInfo *t)
}
/* CrazySpace */
- if(quats && eve->tmp.fp) {
+ if(defmats || (quats && eve->tmp.p)) {
float mat[3][3], imat[3][3], qmat[3][3];
- QuatToMat3(eve->tmp.fp, qmat);
- Mat3MulMat3(mat, mtx, qmat);
+ /* use both or either quat and defmat correction */
+ if(quats && eve->tmp.f) {
+ QuatToMat3(eve->tmp.p, qmat);
+
+ if(defmats)
+ Mat3MulSerie(mat, mtx, qmat, defmats[a],
+ NULL, NULL, NULL, NULL, NULL);
+ else
+ Mat3MulMat3(mat, mtx, qmat);
+ }
+ else
+ Mat3MulMat3(mat, mtx, defmats[a]);
+
Mat3Inv(imat, mat);
Mat3CpyMat3(tob->smtx, imat);
@@ -1765,10 +2007,10 @@ static void createTransEditVerts(TransInfo *t)
MEM_freeN(nears);
}
/* crazy space free */
- if(mappedcos)
- MEM_freeN(mappedcos);
if(quats)
MEM_freeN(quats);
+ if(defmats)
+ MEM_freeN(defmats);
}
/* ********************* UV ****************** */
@@ -1813,26 +2055,25 @@ static void createTransUVs(TransInfo *t)
{
TransData *td = NULL;
TransData2D *td2d = NULL;
- Mesh *me;
- MFace *mf;
MTFace *tf;
- int a, count=0, countsel=0;
+ int count=0, countsel=0;
int propmode = t->flag & T_PROP_EDIT;
+ EditMesh *em = G.editMesh;
+ EditFace *efa;
+
if(is_uv_tface_editing_allowed()==0) return;
- me= get_mesh(OBACT);
/* count */
- tf= me->mtface;
- mf= me->mface;
- for(a=me->totface; a>0; a--, tf++, mf++) {
- if(mf->v3 && mf->flag & ME_FACE_SEL) {
- if(tf->flag & TF_SEL1) countsel++;
- if(tf->flag & TF_SEL2) countsel++;
- if(tf->flag & TF_SEL3) countsel++;
- if(mf->v4 && (tf->flag & TF_SEL4)) countsel++;
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ if (simaUVSel_Check(efa, tf, 0)) countsel++;
+ if (simaUVSel_Check(efa, tf, 1)) countsel++;
+ if (simaUVSel_Check(efa, tf, 2)) countsel++;
+ if (efa->v4 && simaUVSel_Check(efa, tf, 3)) countsel++;
if(propmode)
- count += (mf->v4)? 4: 3;
+ count += (efa->v4)? 4: 3;
}
}
@@ -1843,26 +2084,25 @@ static void createTransUVs(TransInfo *t)
t->data= MEM_callocN(t->total*sizeof(TransData), "TransObData(UV Editing)");
/* for each 2d uv coord a 3d vector is allocated, so that they can be
treated just as if they were 3d verts */
- t->data2d= MEM_mallocN(t->total*sizeof(TransData2D), "TransObData2D(UV Editing)");
+ t->data2d= MEM_callocN(t->total*sizeof(TransData2D), "TransObData2D(UV Editing)");
if(G.sima->flag & SI_CLIP_UV)
t->flag |= T_CLIP_UV;
td= t->data;
td2d= t->data2d;
- tf= me->mtface;
- mf= me->mface;
- for(a=me->totface; a>0; a--, tf++, mf++) {
- if(mf->v3 && mf->flag & ME_FACE_SEL) {
- if(tf->flag & TF_SEL1 || propmode)
- UVsToTransData(td++, td2d++, tf->uv[0], (tf->flag & TF_SEL1));
- if(tf->flag & TF_SEL2 || propmode)
- UVsToTransData(td++, td2d++, tf->uv[1], (tf->flag & TF_SEL2));
- if(tf->flag & TF_SEL3 || propmode)
- UVsToTransData(td++, td2d++, tf->uv[2], (tf->flag & TF_SEL3));
+ for (efa= em->faces.first; efa; efa= efa->next) {
+ tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ if (simaFaceDraw_Check(efa, tf)) {
+ if(propmode || simaUVSel_Check(efa, tf, 0))
+ UVsToTransData(td++, td2d++, tf->uv[0], simaUVSel_Check(efa, tf, 0));
+ if(propmode || simaUVSel_Check(efa, tf, 1))
+ UVsToTransData(td++, td2d++, tf->uv[1], simaUVSel_Check(efa, tf, 1));
+ if(propmode || simaUVSel_Check(efa, tf, 2))
+ UVsToTransData(td++, td2d++, tf->uv[2], simaUVSel_Check(efa, tf, 2));
- if(mf->v4 && (tf->flag & TF_SEL4 || propmode))
- UVsToTransData(td++, td2d++, tf->uv[3], (tf->flag & TF_SEL4));
+ if(efa->v4 && (propmode || simaUVSel_Check(efa, tf, 3)))
+ UVsToTransData(td++, td2d++, tf->uv[3], simaUVSel_Check(efa, tf, 3));
}
}
@@ -1875,7 +2115,7 @@ void flushTransUVs(TransInfo *t)
TransData2D *td;
int a, width, height;
Object *ob= OBACT;
- Mesh *me= get_mesh(ob);
+ EditMesh *em = G.editMesh;
float aspx, aspy, invx, invy;
transform_aspect_ratio_tface_uv(&aspx, &aspy);
@@ -1896,7 +2136,7 @@ void flushTransUVs(TransInfo *t)
/* always call this, also for cancel (it transforms non-selected vertices...) */
if((G.sima->flag & SI_BE_SQUARE))
- be_square_tface_uv(me);
+ be_square_tface_uv(em);
/* this is overkill if G.sima->lock is not set, but still needed */
object_uvs_changed(ob);
@@ -1950,6 +2190,383 @@ int clipUVTransform(TransInfo *t, float *vec, int resize)
return (clipx || clipy);
}
+/* ********************* IPO EDITOR ************************* */
+
+/* for IPO Editor transform - but actual creation of transform structures is not performed here
+ * due to bad globals that would need to be imported specially for this
+ */
+static void createTransIpoData(TransInfo *t)
+{
+ /* in editipo.c due to some globals that are defined in that file... */
+ make_ipo_transdata(t);
+}
+
+/* this function is called on recalcData to apply the transforms applied
+ * to the transdata on to the actual keyframe data
+ */
+void flushTransIpoData(TransInfo *t)
+{
+ TransData2D *td;
+ int a;
+
+ /* flush to 2d vector from internally used 3d vector */
+ for (a=0, td= t->data2d; a<t->total; a++, td++) {
+ /* we need to unapply the nla-scaling from the time in some situations */
+ if (NLA_IPO_SCALED)
+ td->loc2d[0]= get_action_frame(OBACT, td->loc[0]);
+ else
+ td->loc2d[0]= td->loc[0];
+
+ /* when the icu that point comes from is a bitflag holder, don't allow adjusting values */
+ if ((t->data[a].flag & TD_TIMEONLY)==0)
+ td->loc2d[1]= td->loc[1];
+ }
+}
+
+/* ********************* ACTION/NLA EDITOR ****************** */
+
+/* This function tests if a point is on the "mouse" side of the cursor/frame-marking */
+static short FrameOnMouseSide(char side, float frame, float cframe)
+{
+ /* both sides, so it doesn't matter */
+ if (side == 'B') return 1;
+
+ /* only on the named side */
+ if (side == 'R')
+ return (frame >= cframe) ? 1 : 0;
+ else
+ return (frame <= cframe) ? 1 : 0;
+}
+
+/* fully select selected beztriples, but only include if it's on the right side of cfra */
+static int count_ipo_keys(Ipo *ipo, char side, float cfra)
+{
+ IpoCurve *icu;
+ BezTriple *bezt;
+ int i, count = 0;
+
+ if (ipo == NULL)
+ return count;
+
+ /* only include points that occur on the right side of cfra */
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ for (i=0, bezt=icu->bezt; i < icu->totvert; i++, bezt++) {
+ if (bezt->f2) {
+ /* fully select the other two keys */
+ bezt->f1 |= 1;
+ bezt->f3 |= 1;
+
+ /* increment by 3, as there are 3 points (3 * x-coordinates) that need transform */
+ if (FrameOnMouseSide(side, bezt->vec[1][0], cfra))
+ count += 3;
+ }
+ }
+ }
+
+ return count;
+}
+
+/* This function assigns the information to transdata */
+static void TimeToTransData(TransData *td, float *time, Object *ob)
+{
+ /* memory is calloc'ed, so that should zero everything nicely for us */
+ td->val = time;
+ td->ival = *(time);
+
+ /* store the Object where this keyframe exists as a keyframe of the
+ * active action as td->ob. Usually, this member is only used for constraints
+ * drawing
+ */
+ td->ob= ob;
+}
+
+/* This function advances the address to which td points to, so it must return
+ * the new address so that the next time new transform data is added, it doesn't
+ * overwrite the existing ones... i.e. td = IpoToTransData(td, ipo, ob, side, cfra);
+ *
+ * The 'side' argument is needed for the extend mode. 'B' = both sides, 'R'/'L' mean only data
+ * on the named side are used.
+ */
+static TransData *IpoToTransData(TransData *td, Ipo *ipo, Object *ob, char side, float cfra)
+{
+ IpoCurve *icu;
+ BezTriple *bezt;
+ int i;
+
+ if (ipo == NULL)
+ return td;
+
+ for (icu= ipo->curve.first; icu; icu= icu->next) {
+ for (i=0, bezt=icu->bezt; i < icu->totvert; i++, bezt++) {
+ /* only add selected keyframes (for now, proportional edit is not enabled) */
+ if (BEZSELECTED(bezt)) {
+ /* only add if on the right 'side' of the current frame */
+ if (FrameOnMouseSide(side, bezt->vec[1][0], cfra)) {
+ /* each control point needs to be added separetely */
+ TimeToTransData(td, bezt->vec[0], ob);
+ td++;
+
+ TimeToTransData(td, bezt->vec[1], ob);
+ td++;
+
+ TimeToTransData(td, bezt->vec[2], ob);
+ td++;
+ }
+ }
+ }
+ }
+
+ return td;
+}
+
+static void createTransActionData(TransInfo *t)
+{
+ TransData *td = NULL;
+ Object *ob= NULL;
+
+ ListBase act_data = {NULL, NULL};
+ bActListElem *ale;
+ void *data;
+ short datatype;
+ int filter;
+
+ int count=0;
+ float cfra;
+ char side;
+
+ /* determine what type of data we are operating on */
+ data = get_action_context(&datatype);
+ if (data == NULL) return;
+
+ /* filter data */
+ filter= (ACTFILTER_VISIBLE | ACTFILTER_FOREDIT | ACTFILTER_IPOKEYS);
+ actdata_filter(&act_data, filter, data, datatype);
+
+ /* is the action scaled? if so, the it should belong to the active object */
+ if (NLA_ACTION_SCALED)
+ ob= OBACT;
+
+ /* which side of the current frame should be allowed */
+ if (t->mode == TFM_TIME_EXTEND) {
+ /* only side on which mouse is gets transformed */
+ float xmouse, ymouse;
+
+ areamouseco_to_ipoco(G.v2d, t->imval, &xmouse, &ymouse);
+ side = (xmouse > CFRA) ? 'R' : 'L';
+ }
+ else {
+ /* normal transform - both sides of current frame are considered */
+ side = 'B';
+ }
+
+ /* convert current-frame to action-time (slightly less accurate, espcially under
+ * higher scaling ratios, but is faster than converting all points)
+ */
+ if (ob)
+ cfra = get_action_frame(ob, CFRA);
+ else
+ cfra = CFRA;
+
+ /* loop 1: fully select ipo-keys and count how many BezTriples are selected */
+ for (ale= act_data.first; ale; ale= ale->next)
+ count += count_ipo_keys(ale->key_data, side, cfra);
+
+ /* stop if trying to build list if nothing selected */
+ if (count == 0) {
+ /* cleanup temp list */
+ BLI_freelistN(&act_data);
+ return;
+ }
+
+ /* allocate memory for data */
+ t->total= count;
+ t->data= MEM_callocN(t->total*sizeof(TransData), "TransData(Action Editor)");
+ if (t->mode == TFM_TIME_SLIDE)
+ t->customData= MEM_callocN(sizeof(float)*2, "TimeSlide Min/Max");
+
+ td= t->data;
+ /* loop 2: build transdata array */
+ for (ale= act_data.first; ale; ale= ale->next) {
+ Ipo *ipo= (Ipo *)ale->key_data;
+
+ td= IpoToTransData(td, ipo, ob, side, cfra);
+ }
+
+ /* check if we're supposed to be setting minx/maxx for TimeSlide */
+ if (t->mode == TFM_TIME_SLIDE) {
+ float min = 0, max = 0;
+ int i;
+
+ td= (t->data + 1);
+ for (i=1; i < count; i+=3, td+=3) {
+ if (min > *(td->val)) min= *(td->val);
+ if (max < *(td->val)) max= *(td->val);
+ }
+
+ /* minx/maxx values used by TimeSlide are stored as a
+ * calloced 2-float array in t->customData. This gets freed
+ * in postTrans (T_FREE_CUSTOMDATA).
+ */
+ *((float *)(t->customData)) = min;
+ *((float *)(t->customData) + 1) = max;
+ }
+
+ /* cleanup temp list */
+ BLI_freelistN(&act_data);
+}
+
+static void createTransNlaData(TransInfo *t)
+{
+ Base *base;
+ bActionStrip *strip;
+ bActionChannel *achan;
+ bConstraintChannel *conchan;
+
+ TransData *td = NULL;
+ int count=0, i;
+ float cfra;
+ char side;
+
+ /* which side of the current frame should be allowed */
+ if (t->mode == TFM_TIME_EXTEND) {
+ /* only side on which mouse is gets transformed */
+ float xmouse, ymouse;
+
+ areamouseco_to_ipoco(G.v2d, t->imval, &xmouse, &ymouse);
+ side = (xmouse > CFRA) ? 'R' : 'L';
+ }
+ else {
+ /* normal transform - both sides of current frame are considered */
+ side = 'B';
+ }
+
+ /* Ensure that partial selections result in beztriple selections */
+ for (base=G.scene->base.first; base; base=base->next) {
+ /* Check object ipos */
+ i= count_ipo_keys(base->object->ipo, side, CFRA);
+ if (i) base->flag |= BA_HAS_RECALC_OB;
+ count += i;
+
+ /* Check object constraint ipos */
+ for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next)
+ count += count_ipo_keys(conchan->ipo, side, CFRA);
+
+ /* skip actions and nlastrips if object is collapsed */
+ if (base->object->nlaflag & OB_NLA_COLLAPSED)
+ continue;
+
+ /* Check action ipos */
+ if (base->object->action) {
+ /* exclude if strip is selected too */
+ for (strip=base->object->nlastrips.first; strip; strip=strip->next) {
+ if (strip->flag & ACTSTRIP_SELECT)
+ if (strip->act == base->object->action)
+ break;
+ }
+ if (strip==NULL) {
+ cfra = get_action_frame(base->object, CFRA);
+
+ for (achan=base->object->action->chanbase.first; achan; achan=achan->next) {
+ if (EDITABLE_ACHAN(achan)) {
+ i= count_ipo_keys(achan->ipo, side, cfra);
+ if (i) base->flag |= BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA;
+ count += i;
+
+ /* Check action constraint ipos */
+ if (EXPANDED_ACHAN(achan) && FILTER_CON_ACHAN(achan)) {
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
+ if (EDITABLE_CONCHAN(conchan))
+ count += count_ipo_keys(conchan->ipo, side, cfra);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* Check nlastrips */
+ for (strip=base->object->nlastrips.first; strip; strip=strip->next) {
+ if (strip->flag & ACTSTRIP_SELECT) {
+ base->flag |= BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA;
+
+ if (FrameOnMouseSide(side, strip->start, CFRA)) count++;
+ if (FrameOnMouseSide(side, strip->end, CFRA)) count++;
+ }
+ }
+ }
+
+ /* If nothing is selected, bail out */
+ if (count == 0)
+ return;
+
+ /* allocate memory for data */
+ t->total= count;
+ t->data= MEM_callocN(t->total*sizeof(TransData), "TransData (NLA Editor)");
+
+ /* build the transdata structure */
+ td= t->data;
+ for (base=G.scene->base.first; base; base=base->next) {
+ /* Manipulate object ipos */
+ /* - no scaling of keyframe times is allowed here */
+ td= IpoToTransData(td, base->object->ipo, NULL, side, CFRA);
+
+ /* Manipulate object constraint ipos */
+ /* - no scaling of keyframe times is allowed here */
+ for (conchan=base->object->constraintChannels.first; conchan; conchan=conchan->next)
+ td= IpoToTransData(td, conchan->ipo, NULL, side, CFRA);
+
+ /* skip actions and nlastrips if object collapsed */
+ if (base->object->nlaflag & OB_NLA_COLLAPSED)
+ continue;
+
+ /* Manipulate action ipos */
+ if (base->object->action) {
+ /* exclude if strip that active action belongs to is selected too */
+ for (strip=base->object->nlastrips.first; strip; strip=strip->next) {
+ if (strip->flag & ACTSTRIP_SELECT)
+ if (strip->act == base->object->action)
+ break;
+ }
+
+ /* can include if no strip found */
+ if (strip==NULL) {
+ cfra = get_action_frame(base->object, CFRA);
+
+ for (achan=base->object->action->chanbase.first; achan; achan=achan->next) {
+ if (EDITABLE_ACHAN(achan)) {
+ td= IpoToTransData(td, achan->ipo, base->object, side, cfra);
+
+ /* Manipulate action constraint ipos */
+ if (EXPANDED_ACHAN(achan) && FILTER_CON_ACHAN(achan)) {
+ for (conchan=achan->constraintChannels.first; conchan; conchan=conchan->next) {
+ if (EDITABLE_CONCHAN(conchan))
+ td= IpoToTransData(td, conchan->ipo, base->object, side, cfra);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /* Manipulate nlastrips */
+ for (strip=base->object->nlastrips.first; strip; strip=strip->next) {
+ if (strip->flag & ACTSTRIP_SELECT) {
+ /* first TransData is the start, second is the end */
+ if (FrameOnMouseSide(side, strip->start, CFRA)) {
+ td->val = &strip->start;
+ td->ival = strip->start;
+ td++;
+ }
+ if (FrameOnMouseSide(side, strip->end, CFRA)) {
+ td->val = &strip->end;
+ td->ival = strip->end;
+ td++;
+ }
+ }
+ }
+ }
+}
+
/* **************** IpoKey stuff, for Object TransData ********** */
/* storage of bezier triple. thats why -3 and +3! */
@@ -2043,31 +2660,84 @@ static void ipokey_to_transdata(IpoKey *ik, TransData *td)
/* *************************** Object Transform data ******************* */
-static void ObjectToTransData(TransData *td, Object *ob)
+/* Little helper function for ObjectToTransData used to give certain
+ * constraints (ChildOf, FollowPath, and others that may be added)
+ * inverse corrections for transform, so that they aren't in CrazySpace.
+ * These particular constraints benefit from this, but others don't, hence
+ * this semi-hack ;-) - Aligorith
+ */
+static short constraints_list_needinv(TransInfo *t, ListBase *list)
{
+ bConstraint *con;
+
+ /* loop through constraints, checking if there's one of the mentioned
+ * constraints needing special crazyspace corrections
+ */
+ 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)) {
+ /* (affirmative) returns for specific constraints here... */
+ /* constraints that require this regardless */
+ if (con->type == CONSTRAINT_TYPE_CHILDOF) return 1;
+ if (con->type == CONSTRAINT_TYPE_FOLLOWPATH) return 1;
+ if (con->type == CONSTRAINT_TYPE_CLAMPTO) return 1;
+
+ /* constraints that require this only under special conditions */
+ if (con->type == CONSTRAINT_TYPE_ROTLIKE) {
+ /* CopyRot constraint only does this when rotating, and offset is on */
+ bRotateLikeConstraint *data = (bRotateLikeConstraint *)con->data;
+
+ if ((data->flag & ROTLIKE_OFFSET) && (t->mode == TFM_ROTATION))
+ return 1;
+ }
+ }
+ }
+ }
+
+ /* no appropriate candidates found */
+ return 0;
+}
+
+/* transcribe given object into TransData for Transforming */
+static void ObjectToTransData(TransInfo *t, TransData *td, Object *ob)
+{
+ Object *track;
+ ListBase fakecons = {NULL, NULL};
float obmtx[3][3];
- Object *tr;
- void *cfirst, *clast;
+ short constinv;
- /* set axismtx BEFORE clearing constraints to have the real orientation */
+ /* axismtx has the real orientation */
Mat3CpyMat4(td->axismtx, ob->obmat);
Mat3Ortho(td->axismtx);
- /* then why are constraints and track disabled here?
- they dont alter loc/rot/size itself (ton) */
- cfirst = ob->constraints.first;
- clast = ob->constraints.last;
- ob->constraints.first=ob->constraints.last=NULL;
-
- tr= ob->track;
- ob->track= NULL;
-
- where_is_object(ob);
-
- ob->track= tr;
-
- ob->constraints.first = cfirst;
- ob->constraints.last = clast;
+ /* hack: tempolarily disable tracking and/or constraints when getting
+ * object matrix, if tracking is on, or if constraints don't need
+ * inverse correction to stop it from screwing up space conversion
+ * matrix later
+ */
+ constinv= constraints_list_needinv(t, &ob->constraints);
+ if (ob->track || constinv==0) {
+ track= ob->track;
+ ob->track= NULL;
+
+ if (constinv == 0) {
+ fakecons.first = ob->constraints.first;
+ fakecons.last = ob->constraints.last;
+ ob->constraints.first = ob->constraints.last = NULL;
+ }
+
+ where_is_object(ob);
+
+ if (constinv == 0) {
+ ob->constraints.first = fakecons.first;
+ ob->constraints.last = fakecons.last;
+ }
+
+ ob->track= track;
+ }
+ else
+ where_is_object(ob);
td->ob = ob;
@@ -2084,19 +2754,22 @@ static void ObjectToTransData(TransData *td, Object *ob)
VECCOPY(td->center, ob->obmat[3]);
- if (ob->parent)
- {
+ /* is there a need to set the global<->data space conversion matrices? */
+ if (ob->parent || constinv) {
float totmat[3][3], obinv[3][3];
- /* we calculate smtx without obmat: so a parmat */
+ /* Get the effect of parenting, and/or certain constraints.
+ * NOTE: some Constraints, and also Tracking should never get this
+ * done, as it doesn't work well.
+ */
object_to_mat3(ob, obmtx);
Mat3CpyMat4(totmat, ob->obmat);
Mat3Inv(obinv, totmat);
Mat3MulMat3(td->smtx, obmtx, obinv);
Mat3Inv(td->mtx, td->smtx);
}
- else
- {
+ else {
+ /* no conversion to/from dataspace */
Mat3One(td->smtx);
Mat3One(td->mtx);
}
@@ -2177,39 +2850,341 @@ static void clear_trans_object_base_flags(void)
}
}
+/* auto-keyframing feature - for objects
+ * tmode: should be a transform mode
+ */
+void autokeyframe_ob_cb_func(Object *ob, int tmode)
+{
+ IpoCurve *icu;
+ char *actname="";
+
+ if (G.flags & G_RECORDKEYS) {
+ if (ob->ipoflag & OB_ACTION_OB)
+ actname= "Object";
+
+ if (U.uiflag & USER_KEYINSERTAVAI) {
+ if (ob->ipo || ob->action) {
+ ID *id= (ID *)(ob);
+
+ if (ob->ipo) {
+ icu= ob->ipo->curve.first;
+ }
+ else {
+ bActionChannel *achan;
+ achan= get_action_channel(ob->action, actname);
+
+ if (achan && achan->ipo)
+ icu= achan->ipo->curve.first;
+ else
+ icu= NULL;
+ }
+
+ while (icu) {
+ icu->flag &= ~IPO_SELECT;
+ if (U.uiflag & USER_KEYINSERTNEED)
+ insertkey_smarter(id, ID_OB, actname, NULL, icu->adrcode);
+ else
+ insertkey(id, ID_OB, actname, NULL, icu->adrcode, 0);
+ icu= icu->next;
+ }
+ }
+ }
+ else if (U.uiflag & USER_KEYINSERTNEED) {
+ short doLoc=0, doRot=0, doScale=0;
+
+ /* filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D) */
+ if (tmode == TFM_TRANSLATION) {
+ doLoc = 1;
+ }
+ else if (tmode == TFM_ROTATION) {
+ if (G.vd->around == V3D_ACTIVE) {
+ if (ob != OBACT)
+ doLoc = 1;
+ }
+ else if (G.vd->around == V3D_CURSOR)
+ doLoc = 1;
+
+ if ((G.vd->flag & V3D_ALIGN)==0)
+ doRot = 1;
+ }
+ else if (tmode == TFM_RESIZE) {
+ if (G.vd->around == V3D_ACTIVE) {
+ if (ob != OBACT)
+ doLoc = 1;
+ }
+ else if (G.vd->around == V3D_CURSOR)
+ doLoc = 1;
+
+ if ((G.vd->flag & V3D_ALIGN)==0)
+ doScale = 1;
+ }
+
+ if (doLoc) {
+ insertkey_smarter(&ob->id, ID_OB, actname, NULL, OB_LOC_X);
+ insertkey_smarter(&ob->id, ID_OB, actname, NULL, OB_LOC_Y);
+ insertkey_smarter(&ob->id, ID_OB, actname, NULL, OB_LOC_Z);
+ }
+ if (doRot) {
+ insertkey_smarter(&ob->id, ID_OB, actname, NULL, OB_ROT_X);
+ insertkey_smarter(&ob->id, ID_OB, actname, NULL, OB_ROT_Y);
+ insertkey_smarter(&ob->id, ID_OB, actname, NULL, OB_ROT_Z);
+ }
+ if (doScale) {
+ insertkey_smarter(&ob->id, ID_OB, actname, NULL, OB_SIZE_X);
+ insertkey_smarter(&ob->id, ID_OB, actname, NULL, OB_SIZE_Y);
+ insertkey_smarter(&ob->id, ID_OB, actname, NULL, OB_SIZE_Z);
+ }
+ }
+ else {
+ insertkey(&ob->id, ID_OB, actname, NULL, OB_ROT_X, 0);
+ insertkey(&ob->id, ID_OB, actname, NULL, OB_ROT_Y, 0);
+ insertkey(&ob->id, ID_OB, actname, NULL, OB_ROT_Z, 0);
+
+ insertkey(&ob->id, ID_OB, actname, NULL, OB_LOC_X, 0);
+ insertkey(&ob->id, ID_OB, actname, NULL, OB_LOC_Y, 0);
+ insertkey(&ob->id, ID_OB, actname, NULL, OB_LOC_Z, 0);
+
+ insertkey(&ob->id, ID_OB, actname, NULL, OB_SIZE_X, 0);
+ insertkey(&ob->id, ID_OB, actname, NULL, OB_SIZE_Y, 0);
+ insertkey(&ob->id, ID_OB, actname, NULL, OB_SIZE_Z, 0);
+ }
+
+ remake_object_ipos(ob);
+ allqueue(REDRAWMARKER, 0);
+ }
+}
+
+/* auto-keyframing feature - for poses/pose-channels
+ * tmode: should be a transform mode
+ * targetless_ik: has targetless ik been done on any channels?
+ */
+void autokeyframe_pose_cb_func(Object *ob, int tmode, short targetless_ik)
+{
+ bArmature *arm= ob->data;
+ bAction *act;
+ bPose *pose;
+ bPoseChannel *pchan;
+ IpoCurve *icu;
+
+ pose= ob->pose;
+ act= ob->action;
+
+ if (G.flags & G_RECORDKEYS) {
+ if (!act)
+ act= ob->action= add_empty_action("Action");
+
+ for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) {
+ if (pchan->bone->flag & BONE_TRANSFORM) {
+ /* clear any 'unkeyed' flag it may have */
+ pchan->bone->flag &= ~BONE_UNKEYED;
+
+ /* only insert into available channels? */
+ if (U.uiflag & USER_KEYINSERTAVAI) {
+ bActionChannel *achan;
+
+ for (achan = act->chanbase.first; achan; achan=achan->next){
+ if (achan->ipo && !strcmp (achan->name, pchan->name)){
+ for (icu = achan->ipo->curve.first; icu; icu=icu->next){
+ /* only insert keyframe if needed? */
+ if (U.uiflag & USER_KEYINSERTNEED)
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, icu->adrcode);
+ else
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, icu->adrcode, 0);
+ }
+ break;
+ }
+ }
+ }
+ /* only insert keyframe if needed? */
+ else if (U.uiflag & USER_KEYINSERTNEED) {
+ short doLoc=0, doRot=0, doScale=0;
+
+ /* filter the conditions when this happens (assume that curarea->spacetype==SPACE_VIE3D) */
+ if (tmode == TFM_TRANSLATION) {
+ if (targetless_ik)
+ doRot= 1;
+ else
+ doLoc = 1;
+ }
+ else if (tmode == TFM_ROTATION) {
+ if (ELEM(G.vd->around, V3D_CURSOR, V3D_ACTIVE))
+ doLoc = 1;
+
+ if ((G.vd->flag & V3D_ALIGN)==0)
+ doRot = 1;
+ }
+ else if (tmode == TFM_RESIZE) {
+ if (ELEM(G.vd->around, V3D_CURSOR, V3D_ACTIVE))
+ doLoc = 1;
+
+ if ((G.vd->flag & V3D_ALIGN)==0)
+ doScale = 1;
+ }
+
+ if (doLoc) {
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_X);
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_Y);
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_Z);
+ }
+ if (doRot) {
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_W);
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_X);
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_Y);
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_Z);
+ }
+ if (doScale) {
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_X);
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_Y);
+ insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_Z);
+ }
+ }
+ /* insert keyframe in any channel that's appropriate */
+ else {
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_X, 0);
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_Y, 0);
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_Z, 0);
+
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_W, 0);
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_X, 0);
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_Y, 0);
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_Z, 0);
+
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_X, 0);
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_Y, 0);
+ insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_Z, 0);
+ }
+ }
+ }
+
+ remake_action_ipos (act);
+ allqueue(REDRAWMARKER, 0);
+
+ /* locking can be disabled */
+ ob->pose->flag &= ~(POSE_DO_UNLOCK|POSE_LOCKED);
+
+ /* do the bone paths */
+ if (arm->pathflag & ARM_PATH_ACFRA) {
+ pose_clear_paths(ob);
+ pose_calculate_path(ob);
+ }
+
+ }
+ else {
+ /* tag channels that should have unkeyed data */
+ for (pchan=pose->chanbase.first; pchan; pchan=pchan->next) {
+ if (pchan->bone->flag & BONE_TRANSFORM) {
+ /* tag this channel */
+ pchan->bone->flag |= BONE_UNKEYED;
+ }
+ }
+ }
+}
+
+/* very bad call!!! - copied from editnla.c! */
+static void recalc_all_ipos(void)
+{
+ Ipo *ipo;
+ IpoCurve *icu;
+
+ /* Go to each ipo */
+ for (ipo=G.main->ipo.first; ipo; ipo=ipo->id.next){
+ for (icu = ipo->curve.first; icu; icu=icu->next){
+ sort_time_ipocurve(icu);
+ testhandles_ipocurve(icu);
+ }
+ }
+}
+
/* inserting keys, refresh ipo-keys, softbody, redraw events... (ton) */
-/* note; transdata has been freed already! */
+/* note: transdata has been freed already! */
void special_aftertrans_update(TransInfo *t)
{
Object *ob;
Base *base;
- IpoCurve *icu;
- int redrawipo=0;
+ short redrawipo=0, resetslowpar=1;
int cancelled= (t->state == TRANS_CANCEL);
+
+ if (t->spacetype==SPACE_VIEW3D)
+ EM_automerge(1);
+
+ if (t->spacetype == SPACE_ACTION) {
+ void *data;
+ short datatype;
+
+ /* determine what type of data we are operating on */
+ data = get_action_context(&datatype);
+ if (data == NULL) return;
+ ob = OBACT;
+
+ if (datatype == ACTCONT_ACTION) {
+ /* Update the curve */
+ /* Depending on the lock status, draw necessary views */
+ if (ob) {
+ ob->ctime= -1234567.0f;
+
+ if(ob->pose || ob_get_key(ob))
+ DAG_object_flush_update(G.scene, ob, OB_RECALC);
+ else
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
+ }
+
+ remake_action_ipos((bAction *)data);
+
+ G.saction->flag &= ~SACTION_MOVING;
+ }
+ else if (datatype == ACTCONT_SHAPEKEY) {
+ /* fix up the Ipocurves and redraw stuff */
+ Key *key= (Key *)data;
+ if (key->ipo) {
+ IpoCurve *icu;
+
+ for (icu = key->ipo->curve.first; icu; icu=icu->next) {
+ sort_time_ipocurve(icu);
+ testhandles_ipocurve(icu);
+ }
+ }
+
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
+ }
+ }
+ else if (t->spacetype == SPACE_NLA) {
+ synchronize_action_strips();
- if(G.obedit) {
- if(t->mode==TFM_BONESIZE || t->mode==TFM_BONE_ENVELOPE)
+ /* cleanup */
+ for (base=G.scene->base.first; base; base=base->next)
+ base->flag &= ~(BA_HAS_RECALC_OB|BA_HAS_RECALC_DATA);
+
+ recalc_all_ipos(); // bad
+ }
+ else if (t->spacetype == SPACE_IPO) {
+ // FIXME! is there any code from the old transform_ipo that needs to be added back?
+
+ /* resetting slow-parents isn't really necessary when editing sequence ipo's */
+ if (G.sipo->blocktype==ID_SEQ)
+ resetslowpar= 0;
+ }
+ else if (G.obedit) {
+ if (t->mode==TFM_BONESIZE || t->mode==TFM_BONE_ENVELOPE)
allqueue(REDRAWBUTSEDIT, 0);
/* table needs to be created for each edit command, since vertices can move etc */
mesh_octree_table(G.obedit, NULL, 'e');
}
- else if( (t->flag & T_POSE) && t->poseobj) {
+ else if ((t->flag & T_POSE) && (t->poseobj)) {
bArmature *arm;
- bAction *act;
bPose *pose;
bPoseChannel *pchan;
short targetless_ik= 0;
-
+
ob= t->poseobj;
arm= ob->data;
pose= ob->pose;
/* this signal does one recalc on pose, then unlocks, so ESC or edit will work */
pose->flag |= POSE_DO_UNLOCK;
-
+
/* if target-less IK grabbing, we calculate the pchan transforms and clear flag */
- if(!cancelled && t->mode==TFM_TRANSLATION)
+ if (!cancelled && t->mode==TFM_TRANSLATION)
targetless_ik= apply_targetless_ik(ob);
else {
/* not forget to clear the auto flag */
@@ -2219,81 +3194,15 @@ void special_aftertrans_update(TransInfo *t)
}
}
- if(t->mode==TFM_TRANSLATION)
+ if (t->mode==TFM_TRANSLATION)
pose_grab_with_ik_clear(ob);
-
- /* automatic inserting of keys */
- if((G.flags & G_RECORDKEYS) && (!cancelled)) {
- act= ob->action;
-
- if (!act)
- act= ob->action= add_empty_action("Action");
-
- for (pchan=pose->chanbase.first; pchan; pchan=pchan->next){
- if (pchan->bone->flag & BONE_TRANSFORM){
-
- if(U.uiflag & USER_KEYINSERTAVAI) {
- bActionChannel *achan;
-
- for (achan = act->chanbase.first; achan; achan=achan->next){
-
- if (achan->ipo && !strcmp (achan->name, pchan->name)){
- for (icu = achan->ipo->curve.first; icu; icu=icu->next){
- if (U.uiflag & USER_KEYINSERTNEED)
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, icu->adrcode);
- else
- insertkey(&ob->id, ID_PO, pchan->name, NULL, icu->adrcode);
- }
-
- break;
- }
- }
- }
- else if (U.uiflag & USER_KEYINSERTNEED) {
- if ((t->mode==TFM_TRANSLATION) && (targetless_ik==0)) {
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_X);
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_Y);
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_Z);
- }
- if ((t->mode==TFM_ROTATION) || ((t->mode==TFM_TRANSLATION) && targetless_ik)) {
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_W);
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_X);
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_Y);
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_Z);
- }
- if (t->mode==TFM_RESIZE) {
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_X);
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_Y);
- insertkey_smarter(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_Z);
- }
- }
- else {
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_X);
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_Y);
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_SIZE_Z);
-
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_W);
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_X);
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_Y);
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_QUAT_Z);
-
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_X);
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_Y);
- insertkey(&ob->id, ID_PO, pchan->name, NULL, AC_LOC_Z);
- }
- }
- }
-
- remake_action_ipos (act);
- allspace(REMAKEIPO, 0);
- allqueue(REDRAWACTION, 0);
- allqueue(REDRAWIPO, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWTIME, 0);
+ /* automatic inserting of keys and unkeyed tagging - only if transform wasn't cancelled (or TFM_DUMMY) */
+ if (!cancelled && (t->mode != TFM_DUMMY)) {
+ autokeyframe_pose_cb_func(ob, t->mode, targetless_ik);
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
}
- else if(arm->flag & ARM_DELAYDEFORM) {
+ else if (arm->flag & ARM_DELAYDEFORM) {
/* old optimize trick... this enforces to bypass the depgraph */
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
ob->recalc= 0; // is set on OK position already by recalcData()
@@ -2301,91 +3210,26 @@ void special_aftertrans_update(TransInfo *t)
else
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
- if(t->mode==TFM_BONESIZE || t->mode==TFM_BONE_ENVELOPE)
+ if (t->mode==TFM_BONESIZE || t->mode==TFM_BONE_ENVELOPE)
allqueue(REDRAWBUTSEDIT, 0);
-
+
+ }
+ else if(G.f & G_PARTICLEEDIT) {
+ ;
}
else {
base= FIRSTBASE;
- while(base) {
+ while (base) {
if(base->flag & BA_DO_IPO) redrawipo= 1;
ob= base->object;
-
- if(modifiers_isSoftbodyEnabled(ob)) ob->softflag |= OB_SB_REDO;
+
+ if (modifiers_isSoftbodyEnabled(ob)) ob->softflag |= OB_SB_REDO;
/* Set autokey if necessary */
- if ((G.flags & G_RECORDKEYS) && (!cancelled) && (base->flag & SELECT)){
- char *actname="";
-
- if(ob->ipoflag & OB_ACTION_OB)
- actname= "Object";
-
- if(U.uiflag & USER_KEYINSERTAVAI) {
- if(base->object->ipo || base->object->action) {
- ID* id= (ID *)(base->object);
-
- if (base->object->ipo) {
- icu= base->object->ipo->curve.first;
- }
- else {
- bActionChannel *achan;
- achan= get_action_channel(base->object->action, actname);
-
- if (achan && achan->ipo)
- icu= achan->ipo->curve.first;
- else
- icu= NULL;
- }
-
- while(icu) {
- icu->flag &= ~IPO_SELECT;
- if (U.uiflag & USER_KEYINSERTNEED)
- insertkey_smarter(id, ID_OB, actname, NULL, icu->adrcode);
- else
- insertkey(id, ID_OB, actname, NULL, icu->adrcode);
- icu= icu->next;
- }
- }
- }
- else if (U.uiflag & USER_KEYINSERTNEED) {
- if (t->mode==TFM_RESIZE) {
- insertkey_smarter(&base->object->id, ID_OB, actname, NULL, OB_SIZE_X);
- insertkey_smarter(&base->object->id, ID_OB, actname, NULL, OB_SIZE_Y);
- insertkey_smarter(&base->object->id, ID_OB, actname, NULL, OB_SIZE_Z);
- }
- else if (t->mode==TFM_ROTATION) {
- insertkey_smarter(&base->object->id, ID_OB, actname, NULL, OB_ROT_X);
- insertkey_smarter(&base->object->id, ID_OB, actname, NULL, OB_ROT_Y);
- insertkey_smarter(&base->object->id, ID_OB, actname, NULL, OB_ROT_Z);
- }
- else if (t->mode==TFM_TRANSLATION) {
- insertkey_smarter(&base->object->id, ID_OB, actname, NULL, OB_LOC_X);
- insertkey_smarter(&base->object->id, ID_OB, actname, NULL, OB_LOC_Y);
- insertkey_smarter(&base->object->id, ID_OB, actname, NULL, OB_LOC_Z);
- }
- }
- else {
- insertkey(&base->object->id, ID_OB, actname, NULL, OB_ROT_X);
- insertkey(&base->object->id, ID_OB, actname, NULL, OB_ROT_Y);
- insertkey(&base->object->id, ID_OB, actname, NULL, OB_ROT_Z);
-
- insertkey(&base->object->id, ID_OB, actname, NULL, OB_LOC_X);
- insertkey(&base->object->id, ID_OB, actname, NULL, OB_LOC_Y);
- insertkey(&base->object->id, ID_OB, actname, NULL, OB_LOC_Z);
-
- insertkey(&base->object->id, ID_OB, actname, NULL, OB_SIZE_X);
- insertkey(&base->object->id, ID_OB, actname, NULL, OB_SIZE_Y);
- insertkey(&base->object->id, ID_OB, actname, NULL, OB_SIZE_Z);
- }
-
- remake_object_ipos (ob);
- allqueue(REDRAWIPO, 0);
- allspace(REMAKEIPO, 0);
- allqueue(REDRAWVIEW3D, 0);
- allqueue(REDRAWNLA, 0);
- allqueue(REDRAWTIME, 0);
+ if ((!cancelled) && (t->mode != TFM_DUMMY) && (base->flag & SELECT)) {
+ autokeyframe_ob_cb_func(ob, t->mode);
}
base= base->next;
@@ -2395,13 +3239,14 @@ void special_aftertrans_update(TransInfo *t)
clear_trans_object_base_flags();
- if(redrawipo) {
+ if (redrawipo) {
allqueue(REDRAWNLA, 0);
allqueue(REDRAWACTION, 0);
allqueue(REDRAWIPO, 0);
}
- reset_slowparents();
+ if(resetslowpar)
+ reset_slowparents();
/* note; should actually only be done for all objects when a lamp is moved... (ton) */
if(t->spacetype==SPACE_VIEW3D && G.vd->drawtype == OB_SHADED)
@@ -2488,7 +3333,7 @@ static void createTransObject(TransInfo *t)
CFRA= (int)(ik->val/G.scene->r.framelen);
do_ob_ipo(ob);
- ObjectToTransData(td, ob); // does where_is_object()
+ ObjectToTransData(t, td, ob); // does where_is_object()
td->flag= TD_SELECTED;
@@ -2511,7 +3356,7 @@ static void createTransObject(TransInfo *t)
where_is_object(ob); // restore
}
else {
- ObjectToTransData(td, ob);
+ ObjectToTransData(t, td, ob);
td->tdi = NULL;
td->val = NULL;
td++;
@@ -2519,7 +3364,7 @@ static void createTransObject(TransInfo *t)
}
}
else {
- ObjectToTransData(td, ob);
+ ObjectToTransData(t, td, ob);
td->tdi = NULL;
td->val = NULL;
td++;
@@ -2556,6 +3401,23 @@ void createTransData(TransInfo *t)
sort_trans_data_dist(t);
}
}
+ else if (t->spacetype == SPACE_ACTION) {
+ t->flag |= T_POINTS|T_2D_EDIT;
+ createTransActionData(t);
+ }
+ else if (t->spacetype == SPACE_NLA) {
+ t->flag |= T_POINTS|T_2D_EDIT;
+ createTransNlaData(t);
+ }
+ else if (t->spacetype == SPACE_IPO) {
+ t->flag |= T_POINTS|T_2D_EDIT;
+ createTransIpoData(t);
+ if (t->data && (t->flag & T_PROP_EDIT)) {
+ sort_trans_data(t); // makes selected become first in array
+ set_prop_dist(t, 1);
+ sort_trans_data_dist(t);
+ }
+ }
else if (G.obedit) {
t->ext = NULL;
if (G.obedit->type == OB_MESH) {
@@ -2575,7 +3437,7 @@ void createTransData(TransInfo *t)
createTransArmatureVerts(t);
}
else {
- printf("not done yet! only have mesh surface curve\n");
+ printf("not done yet! only have mesh surface curve lattice mball armature\n");
}
if(t->data && t->flag & T_PROP_EDIT) {
@@ -2617,6 +3479,17 @@ void createTransData(TransInfo *t)
createTransPose(t, base->object);
}
}
+ else if (G.f & G_PARTICLEEDIT) {
+ createTransParticleVerts(t);
+
+ if(t->data && t->flag & T_PROP_EDIT) {
+ sort_trans_data(t); // makes selected become first in array
+ set_prop_dist(t, 1);
+ sort_trans_data_dist(t);
+ }
+
+ t->flag |= T_POINTS;
+ }
else {
createTransObject(t);
t->flag |= T_OBJECT;
@@ -2630,3 +3503,4 @@ void createTransData(TransInfo *t)
G.scene->recalc |= SCE_PRV_CHANGED; /* test for 3d preview */
}
+
diff --git a/source/blender/src/transform_generics.c b/source/blender/src/transform_generics.c
index abe2778518d..d0ca1f4cd74 100755..100644
--- a/source/blender/src/transform_generics.c
+++ b/source/blender/src/transform_generics.c
@@ -44,6 +44,7 @@
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_object_force.h"
+#include "DNA_particle_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "DNA_scene_types.h"
@@ -54,12 +55,18 @@
#include "BIF_resources.h"
#include "BIF_mywindow.h"
#include "BIF_gl.h"
+#include "BIF_editaction.h"
#include "BIF_editarmature.h"
#include "BIF_editmesh.h"
+#include "BIF_editnla.h"
#include "BIF_editsima.h"
+#include "BIF_editparticle.h"
#include "BIF_meshtools.h"
#include "BIF_retopo.h"
+#include "BSE_editipo.h"
+#include "BSE_editipo_types.h"
+
#ifdef WITH_VERSE
#include "BIF_verse.h"
#endif
@@ -75,6 +82,7 @@
#include "BKE_group.h"
#include "BKE_ipo.h"
#include "BKE_lattice.h"
+#include "BKE_key.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
#include "BKE_object.h"
@@ -85,6 +93,7 @@
#endif
#include "BSE_view.h"
+#include "BSE_editaction_types.h"
#include "BDR_unwrapper.h"
#include "BLI_arithb.h"
@@ -139,7 +148,7 @@ void getViewVector(float coord[3], float vec[3])
static void clipMirrorModifier(TransInfo *t, Object *ob)
{
ModifierData *md= ob->modifiers.first;
- float tolerance[3];
+ float tolerance[3] = {0.0f, 0.0f, 0.0f};
int axis = 0;
for (; md; md=md->next) {
@@ -147,6 +156,7 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
MirrorModifierData *mmd = (MirrorModifierData*) md;
if(mmd->flag & MOD_MIR_CLIPPING) {
+ axis = 0;
if(mmd->flag & MOD_MIR_AXIS_X) {
axis |= 1;
tolerance[0] = mmd->tolerance;
@@ -159,28 +169,70 @@ static void clipMirrorModifier(TransInfo *t, Object *ob)
axis |= 4;
tolerance[2] = mmd->tolerance;
}
- }
- }
- }
- if (axis) {
- TransData *td = t->data;
- int i;
+ if (axis) {
+ float mtx[4][4], imtx[4][4];
+ int i;
+ TransData *td = t->data;
- for(i = 0 ; i < t->total; i++, td++) {
- if (td->flag & TD_NOACTION)
- break;
- if (td->loc==NULL)
- break;
+ if (mmd->mirror_ob) {
+ float obinv[4][4];
+
+ Mat4Invert(obinv, mmd->mirror_ob->obmat);
+ Mat4MulMat4(mtx, ob->obmat, obinv);
+ Mat4Invert(imtx, mtx);
+ }
+
+ for(i = 0 ; i < t->total; i++, td++) {
+ int clip;
+ float loc[3], iloc[3];
+
+ if (td->flag & TD_NOACTION)
+ break;
+ if (td->loc==NULL)
+ break;
+ if (td->flag & TD_SKIP)
+ continue;
- if(axis & 1) {
- if(fabs(td->iloc[0])<=tolerance[0] || td->loc[0]*td->iloc[0]<0.0f) td->loc[0]= 0.0f;
- }
+ VecCopyf(loc, td->loc);
+ VecCopyf(iloc, td->iloc);
+
+ if (mmd->mirror_ob) {
+ VecMat4MulVecfl(loc, mtx, loc);
+ VecMat4MulVecfl(iloc, mtx, iloc);
+ }
+
+ clip = 0;
+ if(axis & 1) {
+ if(fabs(iloc[0])<=tolerance[0] ||
+ loc[0]*iloc[0]<0.0f) {
+ loc[0]= 0.0f;
+ clip = 1;
+ }
+ }
- if(axis & 2) {
- if(fabs(td->iloc[1])<=tolerance[1] || td->loc[1]*td->iloc[1]<0.0f) td->loc[1]= 0.0f;
- }
- if(axis & 4) {
- if(fabs(td->iloc[2])<=tolerance[2] || td->loc[2]*td->iloc[2]<0.0f) td->loc[2]= 0.0f;
+ if(axis & 2) {
+ if(fabs(iloc[1])<=tolerance[1] ||
+ loc[1]*iloc[1]<0.0f) {
+ loc[1]= 0.0f;
+ clip = 1;
+ }
+ }
+ if(axis & 4) {
+ if(fabs(iloc[2])<=tolerance[2] ||
+ loc[2]*iloc[2]<0.0f) {
+ loc[2]= 0.0f;
+ clip = 1;
+ }
+ }
+ if (clip) {
+ if (mmd->mirror_ob) {
+ VecMat4MulVecfl(loc, imtx, loc);
+ }
+ VecCopyf(td->loc, loc);
+ }
+ }
+ }
+
}
}
}
@@ -198,6 +250,8 @@ static void editmesh_apply_to_mirror(TransInfo *t)
break;
if (td->loc==NULL)
break;
+ if (td->flag & TD_SKIP)
+ continue;
eve= td->tdmir;
if(eve) {
@@ -215,21 +269,127 @@ void recalcData(TransInfo *t)
#ifdef WITH_VERSE
struct TransData *td;
#endif
+
+ if (t->spacetype == SPACE_ACTION) {
+ Object *ob= OBACT;
+ void *data;
+ short context;
- if (G.obedit) {
- if (G.obedit->type == OB_MESH) {
- retopo_do_all();
-
- /* mirror modifier clipping? */
- if(t->state != TRANS_CANCEL)
- clipMirrorModifier(t, G.obedit);
-
- if(G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR)
- editmesh_apply_to_mirror(t);
+ /* determine what type of data we are operating on */
+ data = get_action_context(&context);
+ if (data == NULL) return;
+
+ if (G.saction->lock) {
+ if (context == ACTCONT_ACTION) {
+ if(ob) {
+ ob->ctime= -1234567.0f;
+ if(ob->pose || ob_get_key(ob))
+ DAG_object_flush_update(G.scene, ob, OB_RECALC);
+ else
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
+ }
+ }
+ else if (context == ACTCONT_SHAPEKEY) {
+ DAG_object_flush_update(G.scene, OBACT, OB_RECALC_OB|OB_RECALC_DATA);
+ }
+ }
+ }
+ else if (t->spacetype == SPACE_NLA) {
+ if (G.snla->lock) {
+ for (base=G.scene->base.first; base; base=base->next) {
+ if (base->flag & BA_HAS_RECALC_OB)
+ base->object->recalc |= OB_RECALC_OB;
+ if (base->flag & BA_HAS_RECALC_DATA)
+ base->object->recalc |= OB_RECALC_DATA;
+
+ if (base->object->recalc)
+ base->object->ctime= -1234567.0f; // eveil!
+ }
- DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA); /* sets recalc flags */
+ DAG_scene_flush_update(G.scene, screen_view3d_layers());
+ }
+ }
+ else if (t->spacetype == SPACE_IPO) {
+ EditIpo *ei;
+ int dosort = 0;
+ int a;
+
+ /* do the flush first */
+ flushTransIpoData(t);
+
+ /* now test if there is a need to re-sort */
+ ei= G.sipo->editipo;
+ for (a=0; a<G.sipo->totipo; a++, ei++) {
+ if (ISPOIN(ei, flag & IPO_VISIBLE, icu)) {
+
+ /* watch it: if the time is wrong: do not correct handles */
+ if (test_time_ipocurve(ei->icu)) dosort++;
+ else testhandles_ipocurve(ei->icu);
+ }
+ }
+
+ /* do resort and other updates? */
+ if (dosort) remake_ipo_transdata(t);
+ if (G.sipo->showkey) update_ipokey_val();
+
+ calc_ipo(G.sipo->ipo, (float)CFRA);
+
+ /* update realtime - not working? */
+ if (G.sipo->lock) {
+ if (G.sipo->blocktype==ID_MA || G.sipo->blocktype==ID_TE) {
+ do_ipo(G.sipo->ipo);
+ }
+ else if(G.sipo->blocktype==ID_CA) {
+ do_ipo(G.sipo->ipo);
+ }
+ else if(G.sipo->blocktype==ID_KE) {
+ Object *ob= OBACT;
+ if(ob) {
+ ob->shapeflag &= ~OB_SHAPE_TEMPLOCK;
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ }
+ else if(G.sipo->blocktype==ID_PO) {
+ Object *ob= OBACT;
+ if(ob && ob->pose) {
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ }
+ else if(G.sipo->blocktype==ID_OB) {
+ Base *base= FIRSTBASE;
+
+ while(base) {
+ if(base->object->ipo==G.sipo->ipo) {
+ do_ob_ipo(base->object);
+ base->object->recalc |= OB_RECALC_OB;
+ }
+ base= base->next;
+ }
+ DAG_scene_flush_update(G.scene, screen_view3d_layers());
+ }
+ }
+ }
+ else if (G.obedit) {
+ if (G.obedit->type == OB_MESH) {
+ if(t->spacetype==SPACE_IMAGE) {
+ flushTransUVs(t);
+ if (G.sima->flag & SI_LIVE_UNWRAP)
+ unwrap_lscm_live_re_solve();
+ } else {
- recalc_editnormals();
+ retopo_do_all();
+
+ /* mirror modifier clipping? */
+ if(t->state != TRANS_CANCEL)
+ clipMirrorModifier(t, G.obedit);
+
+ if((t->context & CTX_NO_MIRROR) == 0 && (G.scene->toolsettings->editbutflag & B_MESH_X_MIRROR))
+ editmesh_apply_to_mirror(t);
+
+ DAG_object_flush_update(G.scene, G.obedit, OB_RECALC_DATA); /* sets recalc flags */
+
+ recalc_editnormals();
+ }
}
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) {
Nurb *nu= editNurb.first;
@@ -314,10 +474,8 @@ void recalcData(TransInfo *t)
else
where_is_pose(ob);
}
- else if(t->spacetype==SPACE_IMAGE) {
- flushTransUVs(t);
- if (G.sima->flag & SI_LIVE_UNWRAP)
- unwrap_lscm_live_re_solve();
+ else if(G.f & G_PARTICLEEDIT) {
+ flushTransParticles(t);
}
else {
for(base= FIRSTBASE; base; base= base->next) {
@@ -376,38 +534,6 @@ void recalcData(TransInfo *t)
}
-void initTransModeFlags(TransInfo *t, int mode)
-{
- t->mode = mode;
- t->num.flag = 0;
-
- /* REMOVING RESTRICTIONS FLAGS */
- t->flag &= ~T_ALL_RESTRICTIONS;
-
- switch (mode) {
- case TFM_RESIZE:
- t->flag |= T_NULL_ONE;
- t->num.flag |= NUM_NULL_ONE;
- t->num.flag |= NUM_AFFECT_ALL;
- if (!G.obedit) {
- t->flag |= T_NO_ZERO;
- t->num.flag |= NUM_NO_ZERO;
- }
- break;
- case TFM_TOSPHERE:
- t->num.flag |= NUM_NULL_ONE;
- t->num.flag |= NUM_NO_NEGATIVE;
- t->flag |= T_NO_CONSTRAINT;
- break;
- case TFM_SHEAR:
- case TFM_CREASE:
- case TFM_BONE_ENVELOPE:
- case TFM_CURVE_SHRINKFATTEN:
- t->flag |= T_NO_CONSTRAINT;
- break;
- }
-}
-
void drawLine(float *center, float *dir, char axis, short options)
{
extern void make_axis_color(char *col, char *col2, char axis); // drawview.c
@@ -442,15 +568,17 @@ void drawLine(float *center, float *dir, char axis, short options)
void initTrans (TransInfo *t)
{
-
/* moving: is shown in drawobject() (transform color) */
if(G.obedit || (t->flag & T_POSE) ) G.moving= G_TRANSFORM_EDIT;
+ else if(G.f & G_PARTICLEEDIT) G.moving= G_TRANSFORM_PARTICLE;
else G.moving= G_TRANSFORM_OBJ;
t->data = NULL;
t->ext = NULL;
t->flag = 0;
+ t->num.flag = 0;
+
/* setting PET flag */
if ((t->context & CTX_NO_PET) == 0 && (G.scene->proportional)) {
@@ -463,6 +591,8 @@ void initTrans (TransInfo *t)
t->con.imval[1] = t->imval[1];
t->transform = NULL;
+ t->handleEvent = NULL;
+ t->customData = NULL;
t->total =
t->num.idx =
@@ -491,6 +621,8 @@ void initTrans (TransInfo *t)
if(t->spacetype==SPACE_VIEW3D) {
if(G.vd->flag & V3D_ALIGN) t->flag |= T_V3D_ALIGN;
t->around = G.vd->around;
+ } else if(t->spacetype==SPACE_IMAGE) {
+ t->around = G.v2d->around;
}
else
t->around = V3D_CENTER;
@@ -541,6 +673,10 @@ void postTrans (TransInfo *t)
MEM_freeN(t->data2d);
t->data2d= NULL;
}
+
+ if ((t->flag & T_FREE_CUSTOMDATA) && t->customData != NULL) {
+ MEM_freeN(t->customData);
+ }
if(t->spacetype==SPACE_IMAGE) {
if (G.sima->flag & SI_LIVE_UNWRAP)
@@ -582,7 +718,7 @@ static void restoreElement(TransData *td) {
if (td->val) {
*td->val = td->ival;
}
- if (td->ext) {
+ if (td->ext && (td->flag&TD_NO_EXT)==0) {
if (td->ext->rot) {
VECCOPY(td->ext->rot, td->ext->irot);
}
@@ -677,6 +813,19 @@ void calculateCenterCursor(TransInfo *t)
calculateCenter2D(t);
}
+void calculateCenterCursor2D(TransInfo *t)
+{
+ float aspx=1.0, aspy=1.0;
+
+ if(t->spacetype==SPACE_IMAGE) /* only space supported right now but may change */
+ transform_aspect_ratio_tface_uv(&aspx, &aspy);
+ if (G.v2d) {
+ t->center[0] = G.v2d->cursor[0] * aspx;
+ t->center[1] = G.v2d->cursor[1] * aspy;
+ }
+ calculateCenter2D(t);
+}
+
void calculateCenterMedian(TransInfo *t)
{
float partial[3] = {0.0f, 0.0f, 0.0f};
@@ -684,7 +833,8 @@ void calculateCenterMedian(TransInfo *t)
for(i = 0; i < t->total; i++) {
if (t->data[i].flag & TD_SELECTED) {
- VecAddf(partial, partial, t->data[i].center);
+ if (!(t->data[i].flag & TD_NOCENTER))
+ VecAddf(partial, partial, t->data[i].center);
}
else {
/*
@@ -709,7 +859,8 @@ void calculateCenterBound(TransInfo *t)
for(i = 0; i < t->total; i++) {
if (i) {
if (t->data[i].flag & TD_SELECTED) {
- MinMax3(min, max, t->data[i].center);
+ if (!(t->data[i].flag & TD_NOCENTER))
+ MinMax3(min, max, t->data[i].center);
}
else {
/*
@@ -740,7 +891,10 @@ void calculateCenter(TransInfo *t)
calculateCenterMedian(t);
break;
case V3D_CURSOR:
- calculateCenterCursor(t);
+ if(t->spacetype==SPACE_IMAGE)
+ calculateCenterCursor2D(t);
+ else
+ calculateCenterCursor(t);
break;
case V3D_LOCAL:
/* Individual element center uses median center for helpline and such */
diff --git a/source/blender/src/transform_manipulator.c b/source/blender/src/transform_manipulator.c
index 773ae3d17ec..b0bcf6da297 100644
--- a/source/blender/src/transform_manipulator.c
+++ b/source/blender/src/transform_manipulator.c
@@ -53,6 +53,7 @@
#include "DNA_mesh_types.h"
#include "DNA_meta_types.h"
#include "DNA_object_types.h"
+#include "DNA_particle_types.h"
#include "DNA_screen_types.h"
#include "DNA_scene_types.h"
#include "DNA_space_types.h"
@@ -63,6 +64,7 @@
#include "BKE_global.h"
#include "BKE_lattice.h"
#include "BKE_object.h"
+#include "BKE_particle.h"
#include "BKE_utildefines.h"
#include "BLI_arithb.h"
@@ -76,6 +78,7 @@
#include "BIF_space.h"
#include "BIF_transform.h"
#include "BIF_editmesh.h"
+#include "BIF_editparticle.h"
#include "BSE_edit.h"
#include "BSE_view.h"
@@ -311,18 +314,22 @@ int calc_manipulator_stats(ScrArea *sa)
if( (bezt->f1 & SELECT) + (bezt->f2 & SELECT) + (bezt->f3 & SELECT) > SELECT ) {
calc_tw_center(bezt->vec[1]);
totsel++;
+ VecSubf(normal, bezt->vec[0], bezt->vec[2]);
}
else {
if(bezt->f1) {
calc_tw_center(bezt->vec[0]);
+ VecSubf(normal, bezt->vec[0], bezt->vec[1]);
totsel++;
}
if(bezt->f2) {
calc_tw_center(bezt->vec[1]);
+ VecSubf(normal, bezt->vec[0], bezt->vec[2]);
totsel++;
}
if(bezt->f3) {
calc_tw_center(bezt->vec[2]);
+ VecSubf(normal, bezt->vec[1], bezt->vec[2]);
totsel++;
}
}
@@ -427,9 +434,30 @@ int calc_manipulator_stats(ScrArea *sa)
/* restore, mode can be TFM_INIT */
Trans.mode= mode;
}
- else if(G.f & (G_FACESELECT + G_VERTEXPAINT + G_TEXTUREPAINT +G_WEIGHTPAINT)) {
+ else if(G.f & (G_VERTEXPAINT + G_TEXTUREPAINT + G_WEIGHTPAINT + G_SCULPTMODE)) {
;
}
+ else if(G.f & G_PARTICLEEDIT) {
+ ParticleSystem *psys=PE_get_current(OBACT);
+ ParticleData *pa = psys->particles;
+ ParticleEditKey *ek;
+ int k;
+
+ if(psys->edit){
+ for(a=0; a<psys->totpart; a++,pa++){
+ if(pa->flag & PARS_HIDE) continue;
+ for(k=0, ek=psys->edit->keys[a]; k<pa->totkey; k++,ek++){
+ if(ek->flag & PEK_SELECT){
+ calc_tw_center(ek->world_co);
+ totsel++;
+ }
+ }
+ }
+ /* selection center */
+ if(totsel)
+ VecMulf(G.scene->twcent, 1.0f/(float)totsel); // centroid!
+ }
+ }
else {
/* we need the one selected object, if its not active */
diff --git a/source/blender/src/transform_numinput.c b/source/blender/src/transform_numinput.c
index 730d25545bd..730d25545bd 100755..100644
--- a/source/blender/src/transform_numinput.c
+++ b/source/blender/src/transform_numinput.c
diff --git a/source/blender/src/transform_snap.c b/source/blender/src/transform_snap.c
index 5b4ead1f519..d62d49c2de8 100644
--- a/source/blender/src/transform_snap.c
+++ b/source/blender/src/transform_snap.c
@@ -56,6 +56,8 @@
#include "BIF_mywindow.h"
#include "BIF_resources.h"
#include "BIF_screen.h"
+#include "BIF_editsima.h"
+#include "BIF_drawimage.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
@@ -96,32 +98,69 @@ void drawSnapping(TransInfo *t)
{
if ((t->tsnap.status & (SNAP_ON|POINT_INIT|TARGET_INIT)) == (SNAP_ON|POINT_INIT|TARGET_INIT) &&
(G.qual & LR_CTRLKEY)) {
- float unitmat[4][4];
- float size;
- char col[4];
-
- glDisable(GL_DEPTH_TEST);
-
- size = get_drawsize(G.vd);
-
- size *= 0.5f * BIF_GetThemeValuef(TH_VERTEX_SIZE);
+ char col[4];
BIF_GetThemeColor3ubv(TH_TRANSFORM, col);
glColor4ub(col[0], col[1], col[2], 128);
- glPushMatrix();
-
- glTranslatef(t->tsnap.snapPoint[0], t->tsnap.snapPoint[1], t->tsnap.snapPoint[2]);
-
- /* sets view screen aligned */
- glRotatef( -360.0f*saacos(G.vd->viewquat[0])/(float)M_PI, G.vd->viewquat[1], G.vd->viewquat[2], G.vd->viewquat[3]);
-
- Mat4One(unitmat);
- drawcircball(GL_LINE_LOOP, unitmat[3], size, unitmat);
-
- glPopMatrix();
-
- if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ if (t->spacetype==SPACE_VIEW3D) {
+ float unitmat[4][4];
+ float size;
+
+ glDisable(GL_DEPTH_TEST);
+
+ size = get_drawsize(G.vd);
+
+ size *= 0.5f * BIF_GetThemeValuef(TH_VERTEX_SIZE);
+
+ glPushMatrix();
+
+ glTranslatef(t->tsnap.snapPoint[0], t->tsnap.snapPoint[1], t->tsnap.snapPoint[2]);
+
+ /* sets view screen aligned */
+ glRotatef( -360.0f*saacos(G.vd->viewquat[0])/(float)M_PI, G.vd->viewquat[1], G.vd->viewquat[2], G.vd->viewquat[3]);
+
+ Mat4One(unitmat);
+ drawcircball(GL_LINE_LOOP, unitmat[3], size, unitmat);
+
+ glPopMatrix();
+
+ if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
+ } else if (t->spacetype==SPACE_IMAGE) {
+ /*This will not draw, and Im nor sure why - campbell */
+
+ /*
+ float xuser_asp, yuser_asp;
+ int wi, hi;
+ float w, h;
+
+ calc_image_view(G.sima, 'f'); // float
+ myortho2(G.v2d->cur.xmin, G.v2d->cur.xmax, G.v2d->cur.ymin, G.v2d->cur.ymax);
+ glLoadIdentity();
+
+ aspect_sima(G.sima, &xuser_asp, &yuser_asp);
+
+ transform_width_height_tface_uv(&wi, &hi);
+ w = (((float)wi)/256.0f)*G.sima->zoom * xuser_asp;
+ h = (((float)hi)/256.0f)*G.sima->zoom * yuser_asp;
+
+ cpack(0xFFFFFF);
+ glTranslatef(t->tsnap.snapPoint[0], t->tsnap.snapPoint[1], 0.0f);
+
+ //glRectf(0,0,1,1);
+
+ setlinestyle(0);
+ 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);
+
+ glTranslatef(-t->tsnap.snapPoint[0], -t->tsnap.snapPoint[1], 0.0f);
+ setlinestyle(0);
+ */
+
+ }
}
}
@@ -169,12 +208,12 @@ void initSnapping(TransInfo *t)
{
resetSnapping(t);
- if (t->spacetype == SPACE_VIEW3D) { // Only 3D view (not UV)
+ if (t->spacetype == SPACE_VIEW3D || t->spacetype == SPACE_IMAGE) { // Only 3D view or UV
setSnappingCallback(t);
if (t->tsnap.applySnap != NULL && // A snapping function actually exist
(G.obedit != NULL && G.obedit->type==OB_MESH) && // Temporary limited to edit mode meshes
- (G.vd->flag2 & V3D_TRANSFORM_SNAP) && // Only if the snap flag is on
+ (G.scene->snap_flag & SCE_SNAP) && // Only if the snap flag is on
(t->flag & T_PROP_EDIT) == 0) // No PET, obviously
{
t->tsnap.status |= SNAP_ON;
@@ -197,17 +236,17 @@ void setSnappingCallback(TransInfo *t)
{
t->tsnap.calcSnap = CalcSnapGeometry;
- switch(G.vd->snap_target)
+ switch(G.scene->snap_target)
{
- case V3D_SNAP_TARGET_CLOSEST:
+ case SCE_SNAP_TARGET_CLOSEST:
t->tsnap.modeTarget = SNAP_CLOSEST;
t->tsnap.targetSnap = TargetSnapClosest;
break;
- case V3D_SNAP_TARGET_CENTER:
+ case SCE_SNAP_TARGET_CENTER:
t->tsnap.modeTarget = SNAP_CENTER;
t->tsnap.targetSnap = TargetSnapCenter;
break;
- case V3D_SNAP_TARGET_MEDIAN:
+ case SCE_SNAP_TARGET_MEDIAN:
t->tsnap.modeTarget = SNAP_MEDIAN;
t->tsnap.targetSnap = TargetSnapMedian;
break;
@@ -224,7 +263,7 @@ void setSnappingCallback(TransInfo *t)
t->tsnap.distance = RotationBetween;
// Can't do TARGET_CENTER with rotation, use TARGET_MEDIAN instead
- if (G.vd->snap_target == V3D_SNAP_TARGET_CENTER) {
+ if (G.scene->snap_target == SCE_SNAP_TARGET_CENTER) {
t->tsnap.modeTarget = SNAP_MEDIAN;
t->tsnap.targetSnap = TargetSnapMedian;
}
@@ -328,6 +367,8 @@ void CalcSnapGeometry(TransInfo *t, float *vec)
if (G.obedit != NULL && G.obedit->type==OB_MESH)
{
/*if (G.scene->selectmode & B_SEL_VERT)*/
+
+ if (t->spacetype == SPACE_VIEW3D)
{
EditVert *nearest=NULL;
float vec[3];
@@ -358,6 +399,27 @@ void CalcSnapGeometry(TransInfo *t, float *vec)
t->tsnap.status &= ~POINT_INIT;
}
}
+ else if (t->spacetype == SPACE_IMAGE)
+ { /* same as above but for UV's */
+ MTFace *nearesttf=NULL;
+ int face_corner;
+
+ find_nearest_uv(&nearesttf, NULL, NULL, &face_corner);
+
+ if (nearesttf != NULL)
+ {
+ VECCOPY2D(t->tsnap.snapPoint, nearesttf->uv[face_corner]);
+ //Mat4MulVecfl(G.obedit->obmat, t->tsnap.snapPoint);
+
+ t->tsnap.status |= POINT_INIT;
+ }
+ else
+ {
+ t->tsnap.status &= ~POINT_INIT;
+ }
+ }
+
+
/*
if (G.scene->selectmode & B_SEL_EDGE)
{
diff --git a/source/blender/src/unwrapper.c b/source/blender/src/unwrapper.c
index d92508f7729..5cf5f3dc70b 100644
--- a/source/blender/src/unwrapper.c
+++ b/source/blender/src/unwrapper.c
@@ -49,13 +49,16 @@
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_utildefines.h"
+#include "BKE_customdata.h"
#include "BLI_arithb.h"
#include "BLI_edgehash.h"
+#include "BLI_editVert.h"
#include "BIF_editsima.h"
#include "BIF_space.h"
#include "BIF_screen.h"
+#include "BIF_editmesh.h"
#include "blendef.h"
#include "mydevice.h"
@@ -188,45 +191,52 @@ void select_linked_tfaces_with_seams(int mode, Mesh *me, unsigned int index)
}
/* Parametrizer */
-
-ParamHandle *construct_param_handle(Mesh *me, short implicit, short fill, short sel)
+ParamHandle *construct_param_handle(EditMesh *em, short implicit, short fill, short sel)
{
int a;
MTFace *tf;
- MFace *mf;
- MVert *mv;
- MEdge *medge;
+
+ EditFace *efa;
+ EditEdge *eed;
+ EditVert *ev;
+
ParamHandle *handle;
handle = param_construct_begin();
- mv= me->mvert;
- mf= me->mface;
- tf= me->mtface;
- for (a=0; a<me->totface; a++, mf++, tf++) {
+ /* we need the vert indicies */
+ for (ev= em->verts.first, a=0; ev; ev= ev->next, a++)
+ ev->tmp.l = a;
+
+ for (efa= em->faces.first; efa; efa= efa->next) {
ParamKey key, vkeys[4];
ParamBool pin[4], select[4];
float *co[4];
float *uv[4];
int nverts;
-
- if (mf->flag & ME_HIDE)
- continue;
-
- if (sel && !(mf->flag & ME_FACE_SEL))
+
+ if ((efa->h) || (sel && (efa->f & SELECT)==0))
continue;
- if (implicit && !(tf->flag & (TF_SEL1|TF_SEL2|TF_SEL3|TF_SEL4)))
+ tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+
+ if (implicit &&
+ !( simaUVSel_Check(efa, tf, 0) ||
+ simaUVSel_Check(efa, tf, 1) ||
+ simaUVSel_Check(efa, tf, 2) ||
+ (efa->v4 && simaUVSel_Check(efa, tf, 3)) )
+ ) {
continue;
+ }
- key = (ParamKey)mf;
- vkeys[0] = (ParamKey)mf->v1;
- vkeys[1] = (ParamKey)mf->v2;
- vkeys[2] = (ParamKey)mf->v3;
+ key = (ParamKey)efa;
+ vkeys[0] = (ParamKey)efa->v1->tmp.l;
+ vkeys[1] = (ParamKey)efa->v2->tmp.l;
+ vkeys[2] = (ParamKey)efa->v3->tmp.l;
- co[0] = (mv+mf->v1)->co;
- co[1] = (mv+mf->v2)->co;
- co[2] = (mv+mf->v3)->co;
+ co[0] = efa->v1->co;
+ co[1] = efa->v2->co;
+ co[2] = efa->v3->co;
uv[0] = tf->uv[0];
uv[1] = tf->uv[1];
@@ -236,16 +246,16 @@ ParamHandle *construct_param_handle(Mesh *me, short implicit, short fill, short
pin[1] = ((tf->unwrap & TF_PIN2) != 0);
pin[2] = ((tf->unwrap & TF_PIN3) != 0);
- select[0] = ((tf->flag & TF_SEL1) != 0);
- select[1] = ((tf->flag & TF_SEL2) != 0);
- select[2] = ((tf->flag & TF_SEL3) != 0);
+ select[0] = ((simaUVSel_Check(efa, tf, 0)) != 0);
+ select[1] = ((simaUVSel_Check(efa, tf, 1)) != 0);
+ select[2] = ((simaUVSel_Check(efa, tf, 2)) != 0);
- if (mf->v4) {
- vkeys[3] = (ParamKey)mf->v4;
- co[3] = (mv+mf->v4)->co;
+ if (efa->v4) {
+ vkeys[3] = (ParamKey)efa->v4->tmp.l;
+ co[3] = efa->v4->co;
uv[3] = tf->uv[3];
pin[3] = ((tf->unwrap & TF_PIN4) != 0);
- select[3] = ((tf->flag & TF_SEL4) != 0);
+ select[3] = (simaUVSel_Check(efa, tf, 3) != 0);
nverts = 4;
}
else
@@ -255,12 +265,11 @@ ParamHandle *construct_param_handle(Mesh *me, short implicit, short fill, short
}
if (!implicit) {
- for(medge=me->medge, a=me->totedge; a>0; a--, medge++) {
- if(medge->flag & ME_SEAM) {
+ for (eed= em->edges.first; eed; eed= eed->next) {
+ if(eed->seam) {
ParamKey vkeys[2];
-
- vkeys[0] = (ParamKey)medge->v1;
- vkeys[1] = (ParamKey)medge->v2;
+ vkeys[0] = (ParamKey)eed->v1->tmp.l;
+ vkeys[1] = (ParamKey)eed->v2->tmp.l;
param_edge_set_seam(handle, vkeys);
}
}
@@ -271,17 +280,36 @@ ParamHandle *construct_param_handle(Mesh *me, short implicit, short fill, short
return handle;
}
+
+extern int EM_texFaceCheck(void);
+
void unwrap_lscm(short seamcut)
{
- Mesh *me;
+ EditMesh *em = G.editMesh;
ParamHandle *handle;
short abf = G.scene->toolsettings->unwrapper == 1;
short fillholes = G.scene->toolsettings->uvcalc_flag & 1;
- me= get_mesh(OBACT);
- if(me==0 || me->mtface==0) return;
+ /* add uvs if there not here */
+ if (!EM_texFaceCheck()) {
+ if (em && em->faces.first)
+ EM_add_data_layer(&em->fdata, CD_MTFACE);
+
+ if (!EM_texFaceCheck())
+ return;
+
+ /* select new UV's */
+ if ((G.sima==0 || G.sima->flag & SI_SYNC_UVSEL)==0) {
+ EditFace *efa;
+ MTFace *tf;
+ for(efa=em->faces.first; efa; efa=efa->next) {
+ tf= (MTFace *)CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+ simaFaceSel_Set(efa, tf);
+ }
+ }
+ }
- handle = construct_param_handle(me, 0, fillholes, seamcut == 0);
+ handle = construct_param_handle(em, 0, fillholes, seamcut == 0);
param_lscm_begin(handle, PARAM_FALSE, abf);
param_lscm_solve(handle);
@@ -304,17 +332,16 @@ void unwrap_lscm(short seamcut)
void minimize_stretch_tface_uv(void)
{
- Mesh *me;
+ EditMesh *em = G.editMesh;
ParamHandle *handle;
double lasttime;
short doit = 1, escape = 0, val, blend = 0;
unsigned short event = 0;
short fillholes = G.scene->toolsettings->uvcalc_flag & 1;
- me = get_mesh(OBACT);
- if(me==0 || me->mtface==0) return;
+ if(!EM_texFaceCheck()) return;
- handle = construct_param_handle(me, 1, fillholes, 1);
+ handle = construct_param_handle(em, 1, fillholes, 1);
lasttime = PIL_check_seconds_timer();
@@ -397,13 +424,12 @@ void minimize_stretch_tface_uv(void)
void pack_charts_tface_uv(void)
{
- Mesh *me;
+ EditMesh *em = G.editMesh;
ParamHandle *handle;
- me = get_mesh(OBACT);
- if(me==0 || me->mtface==0) return;
+ if(!EM_texFaceCheck()) return;
- handle = construct_param_handle(me, 1, 0, 1);
+ handle = construct_param_handle(em, 1, 0, 1);
param_pack(handle);
param_flush(handle);
param_delete(handle);
@@ -422,14 +448,13 @@ static ParamHandle *liveHandle = NULL;
void unwrap_lscm_live_begin(void)
{
- Mesh *me;
+ EditMesh *em = G.editMesh;
short abf = G.scene->toolsettings->unwrapper == 1;
short fillholes = G.scene->toolsettings->uvcalc_flag & 1;
- me= get_mesh(OBACT);
- if(me==0 || me->mtface==0) return;
+ if(!EM_texFaceCheck()) return;
- liveHandle = construct_param_handle(me, 0, fillholes, 1);
+ liveHandle = construct_param_handle(em, 0, fillholes, 1);
param_lscm_begin(liveHandle, PARAM_TRUE, abf);
}
diff --git a/source/blender/src/usiblender.c b/source/blender/src/usiblender.c
index 10fcfeb45aa..16d55202a39 100644
--- a/source/blender/src/usiblender.c
+++ b/source/blender/src/usiblender.c
@@ -74,6 +74,7 @@
#include "BKE_blender.h"
#include "BKE_curve.h"
#include "BKE_displist.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_exotic.h"
#include "BKE_font.h"
#include "BKE_global.h"
@@ -81,6 +82,7 @@
#include "BKE_mball.h"
#include "BKE_node.h"
#include "BKE_packedFile.h"
+#include "BKE_texture.h"
#include "BKE_utildefines.h"
#ifdef WITH_VERSE
@@ -94,12 +96,14 @@
#include "BIF_interface.h"
#include "BIF_usiblender.h"
#include "BIF_drawtext.h"
+#include "BIF_editaction.h"
#include "BIF_editarmature.h"
#include "BIF_editlattice.h"
#include "BIF_editfont.h"
#include "BIF_editmesh.h"
#include "BIF_editmode_undo.h"
#include "BIF_editsound.h"
+#include "BIF_filelist.h"
#include "BIF_poseobject.h"
#include "BIF_previewrender.h"
#include "BIF_renderwin.h"
@@ -190,6 +194,9 @@ static void init_userdef_file(void)
if(U.pad_rot_angle==0)
U.pad_rot_angle= 15;
+ if(U.flag & USER_CUSTOM_RANGE)
+ vDM_ColorBand_store(&U.coba_weight); /* signal for derivedmesh to use colorband */
+
if (G.main->versionfile <= 191) {
strcpy(U.plugtexdir, U.textudir);
strcpy(U.sounddir, "/");
@@ -358,6 +365,14 @@ static void init_userdef_file(void)
/* set default number of recently-used files (if not set) */
if (U.recent_files == 0) U.recent_files = 10;
}
+ if (G.main->versionfile < 245 || (G.main->versionfile == 245 && G.main->subversionfile < 3)) {
+ bTheme *btheme;
+ for(btheme= U.themes.first; btheme; btheme= btheme->next) {
+ SETCOL(btheme->tv3d.editmesh_active, 255, 255, 255, 128);
+ }
+ if(U.coba_weight.tot==0)
+ init_colorband(&U.coba_weight, 1);
+ }
/* GL Texture Garbage Collection (variable abused above!) */
if (U.textimeout == 0) {
@@ -443,7 +458,7 @@ void BIF_read_file(char *name)
if(retval==2) init_userdef_file(); // in case a userdef is read from regular .blend
- G.relbase_valid = 1;
+ if (retval!=0) G.relbase_valid = 1;
undo_editmode_clear();
BKE_reset_undo();
@@ -527,8 +542,10 @@ int BIF_read_homefile(int from_memory)
static void get_autosave_location(char buf[FILE_MAXDIR+FILE_MAXFILE])
{
char pidstr[32];
+#ifdef WIN32
char subdir[9];
char savedir[FILE_MAXDIR];
+#endif
sprintf(pidstr, "%d.blend", abs(getpid()));
@@ -626,19 +643,19 @@ static void readBlog(void)
tmps[2]='\\';
tmps[3]=0;
- fsmenu_insert_entry(tmps, 0);
+ fsmenu_insert_entry(tmps, 0, 0);
}
}
/* Adding Desktop and My Documents */
- fsmenu_append_seperator();
+ fsmenu_append_separator();
SHGetSpecialFolderPath(0, folder, CSIDL_PERSONAL, 0);
- fsmenu_insert_entry(folder, 0);
+ fsmenu_insert_entry(folder, 0, 0);
SHGetSpecialFolderPath(0, folder, CSIDL_DESKTOPDIRECTORY, 0);
- fsmenu_insert_entry(folder, 0);
+ fsmenu_insert_entry(folder, 0, 0);
- fsmenu_append_seperator();
+ fsmenu_append_separator();
}
#endif
@@ -649,16 +666,16 @@ static void readBlog(void)
char *line= l->link;
if (!BLI_streq(line, "")) {
- fsmenu_insert_entry(line, 0);
+ fsmenu_insert_entry(line, 0, 1);
}
}
- fsmenu_append_seperator();
+ fsmenu_append_separator();
/* add last saved file */
BLI_split_dirfile(G.sce, name, filename); /* G.sce shouldn't be relative */
- fsmenu_insert_entry(name, 0);
+ fsmenu_insert_entry(name, 0, 0);
BLI_free_file_lines(lines);
}
@@ -735,11 +752,17 @@ static void do_history(char *name)
void BIF_write_file(char *target)
{
Library *li;
- int writeflags;
- char di[FILE_MAXDIR];
+ int writeflags, len;
+ char di[FILE_MAX];
char *err;
- if (BLI_streq(target, "")) return;
+ len = strlen(target);
+
+ if (len == 0) return;
+ if (len >= FILE_MAX) {
+ error("Path too long, cannot save");
+ return;
+ }
/* send the OnSave event */
if (G.f & G_DOSCRIPTLINKS) BPY_do_pyscript(&G.scene->id, SCRIPT_ONSAVE);
@@ -751,7 +774,7 @@ void BIF_write_file(char *target)
}
}
- if (!BLO_has_bfile_extension(target)) {
+ if (!BLO_has_bfile_extension(target) && (len+6 < FILE_MAX)) {
sprintf(di, "%s.blend", target);
} else {
strcpy(di, target);
@@ -884,6 +907,8 @@ void BIF_init(void)
BIF_resources_init(); /* after homefile, to dynamically load an icon file based on theme settings */
+ BIF_filelist_init_icons();
+
init_gl_stuff(); /* drawview.c, after homefile */
readBlog();
BLI_strncpy(G.lib, G.sce, FILE_MAX);
@@ -937,6 +962,7 @@ void exit_usiblender(void)
free_blender(); /* blender.c, does entire library */
free_matcopybuf();
free_ipocopybuf();
+ free_actcopybuf();
free_vertexpaint();
free_imagepaint();
@@ -965,7 +991,9 @@ void exit_usiblender(void)
if (!G.background) {
BIF_resources_free();
-
+
+ BIF_filelist_free_icons();
+
BIF_close_render_display();
mainwindow_close();
}
diff --git a/source/blender/src/view.c b/source/blender/src/view.c
index c501dbb8f73..d23b6f1d8f4 100644
--- a/source/blender/src/view.c
+++ b/source/blender/src/view.c
@@ -68,11 +68,12 @@
#include "BKE_object.h"
#include "BKE_utildefines.h"
+#include "BIF_editparticle.h"
#include "BIF_gl.h"
-#include "BIF_space.h"
-#include "BIF_mywindow.h"
#include "BIF_previewrender.h"
+#include "BIF_mywindow.h"
#include "BIF_retopo.h"
+#include "BIF_space.h"
#include "BIF_screen.h"
#include "BIF_toolbox.h"
@@ -152,6 +153,11 @@ void initgrabz(float x, float y, float z)
* (accounting for near zero values)
* */
if (G.vd->zfac < 1.e-6f && G.vd->zfac > -1.e-6f) G.vd->zfac = 1.0f;
+
+ /* Negative zfac means x, y, z was behind the camera (in perspective).
+ * This gives flipped directions, so revert back to ok default case.
+ */
+ if (G.vd->zfac < 0.0f) G.vd->zfac = 1.0f;
}
void window_to_3d(float *vec, short mx, short my)
@@ -538,7 +544,7 @@ void viewmove(int mode)
float reverse, oldquat[4], q1[4], si, phi, dist0;
float ofs[3], obofs[3]= {0.0f, 0.0f, 0.0f};
int firsttime=1;
- short mvalball[2], mval[2], mvalo[2];
+ short mvalball[2], mval[2], mvalo[2], mval_area[2];
short use_sel = 0;
short preview3d_event= 1;
@@ -556,6 +562,7 @@ void viewmove(int mode)
QUATCOPY(oldquat, G.vd->viewquat);
+ getmouseco_areawin(mval_area); /* for zoom to mouse loc */
getmouseco_sc(mvalo); /* work with screen coordinates because of trackball function */
mvalball[0]= mvalo[0]; /* needed for turntable to work */
mvalball[1]= mvalo[1];
@@ -728,9 +735,10 @@ void viewmove(int mode)
}
}
else if(mode==2) {
+ float zfac=1.0;
if(U.viewzoom==USER_ZOOM_CONT) {
// oldstyle zoom
- G.vd->dist*= 1.0+(float)(mvalo[0]-mval[0]+mvalo[1]-mval[1])/1000.0;
+ zfac = 1.0+(float)(mvalo[0]-mval[0]+mvalo[1]-mval[1])/1000.0;
}
else if(U.viewzoom==USER_ZOOM_SCALE) {
int ctr[2], len1, len2;
@@ -742,14 +750,17 @@ void viewmove(int mode)
len1 = (int)sqrt((ctr[0] - mval[0])*(ctr[0] - mval[0]) + (ctr[1] - mval[1])*(ctr[1] - mval[1])) + 5;
len2 = (int)sqrt((ctr[0] - mvalo[0])*(ctr[0] - mvalo[0]) + (ctr[1] - mvalo[1])*(ctr[1] - mvalo[1])) + 5;
- G.vd->dist= dist0 * ((float)len2/len1);
+ zfac = dist0 * ((float)len2/len1) / G.vd->dist;
}
else { /* USER_ZOOM_DOLLY */
float len1 = (curarea->winrct.ymax - mval[1]) + 5;
float len2 = (curarea->winrct.ymax - mvalo[1]) + 5;
-
- G.vd->dist= dist0 * (2.0*((len2/len1)-1.0) + 1.0);
+ zfac = dist0 * (2.0*((len2/len1)-1.0) + 1.0) / G.vd->dist;
}
+
+ if(zfac != 1.0 && zfac*G.vd->dist > 0.001*G.vd->grid &&
+ zfac*G.vd->dist < 10.0*G.vd->far)
+ view_zoom_mouseloc(zfac, mval_area);
/* these limits are in toets.c too */
if(G.vd->dist<0.001*G.vd->grid) G.vd->dist= 0.001*G.vd->grid;
@@ -799,6 +810,49 @@ void viewmove(int mode)
BIF_view3d_previewrender_signal(curarea, PR_PROJECTED);
}
+
+void view_zoom_mouseloc(float dfac, short *mouseloc)
+{
+ if(U.uiflag & USER_ZOOM_TO_MOUSEPOS) {
+ short vb[2];
+ float dvec[3];
+ float tvec[3];
+ float tpos[3];
+ float new_dist;
+
+ /* find the current window width and height */
+ vb[0] = G.vd->area->winx;
+ vb[1] = G.vd->area->winy;
+
+ tpos[0] = -G.vd->ofs[0];
+ tpos[1] = -G.vd->ofs[1];
+ tpos[2] = -G.vd->ofs[2];
+
+ /* Project cursor position into 3D space */
+ initgrabz(tpos[0], tpos[1], tpos[2]);
+ window_to_3d(dvec, mouseloc[0]-vb[0]/2, mouseloc[1]-vb[1]/2);
+
+ /* Calculate view target position for dolly */
+ tvec[0] = -(tpos[0] + dvec[0]);
+ tvec[1] = -(tpos[1] + dvec[1]);
+ tvec[2] = -(tpos[2] + dvec[2]);
+
+ /* Offset to target position and dolly */
+ new_dist = G.vd->dist * dfac;
+
+ VECCOPY(G.vd->ofs, tvec);
+ G.vd->dist = new_dist;
+
+ /* Calculate final offset */
+ dvec[0] = tvec[0] + dvec[0] * dfac;
+ dvec[1] = tvec[1] + dvec[1] * dfac;
+ dvec[2] = tvec[2] + dvec[2] * dfac;
+
+ VECCOPY(G.vd->ofs, dvec);
+ } else {
+ G.vd->dist *= dfac;
+ }
+}
/* Gets the lens and clipping values from a camera of lamp type object */
void object_view_settings(Object *ob, float *lens, float *clipsta, float *clipend)
@@ -1027,18 +1081,10 @@ void obmat_to_viewmat(Object *ob, short smooth)
/* dont set windows active in in here, is used by renderwin too */
void setviewmatrixview3d()
{
- Camera *cam;
-
if(G.vd->persp>=2) { /* obs/camera */
if(G.vd->camera) {
-
where_is_object(G.vd->camera);
obmat_to_viewmat(G.vd->camera, 0);
-
- if(G.vd->camera->type==OB_CAMERA) {
- cam= G.vd->camera->data;
- //if(cam->type==CAM_ORTHO) G.vd->viewmat[3][2]*= 100.0;
- }
}
else {
QuatToMat4(G.vd->viewquat, G.vd->viewmat);
@@ -1393,9 +1439,12 @@ void centerview() /* like a localview without local! */
}
}
}
- else if (G.f & G_FACESELECT) {
+ else if (FACESEL_PAINT_TEST) {
ok= minmax_tface(min, max);
}
+ else if (G.f & G_PARTICLEEDIT) {
+ ok= PE_minmax(min, max);
+ }
else {
Base *base= FIRSTBASE;
while(base) {
diff --git a/source/blender/src/vpaint.c b/source/blender/src/vpaint.c
index 1fbc8d43920..4e1c6cd59a6 100644
--- a/source/blender/src/vpaint.c
+++ b/source/blender/src/vpaint.c
@@ -103,14 +103,14 @@
#define VP_ADD 1
#define VP_SUB 2
#define VP_MUL 3
-#define VP_FILT 4
+#define VP_BLUR 4
#define VP_LIGHTEN 5
#define VP_DARKEN 6
#define MAXINDEX 512000
VPaint Gvp= {1.0, 1.0, 1.0, 0.2, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT+VP_SPRAY, 0};
-VPaint Gwp= {1.0, 1.0, 1.0, 0.2, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT, 0};
+VPaint Gwp= {1.0, 1.0, 1.0, 1.0, 25.0, 1.0, 1.0, 0, VP_AREA+VP_SOFT, 0};
static int *get_indexarray(void)
{
@@ -177,7 +177,7 @@ void do_shared_vertexcol(Mesh *me)
mface= me->mface;
mcol= (char *)me->mcol;
for(a=me->totface; a>0; a--, mface++, mcol+=16) {
- if(tface==0 || (tface->mode & TF_SHAREDCOL) || (G.f & G_FACESELECT)==0) {
+ if((tface && tface->mode & TF_SHAREDCOL) || (G.f & G_FACESELECT)==0) {
scol= scolmain+4*mface->v1;
scol[0]++; scol[1]+= mcol[1]; scol[2]+= mcol[2]; scol[3]+= mcol[3];
scol= scolmain+4*mface->v2;
@@ -207,7 +207,7 @@ void do_shared_vertexcol(Mesh *me)
mface= me->mface;
mcol= (char *)me->mcol;
for(a=me->totface; a>0; a--, mface++, mcol+=16) {
- if(tface==0 || (tface->mode & TF_SHAREDCOL) || (G.f & G_FACESELECT)==0) {
+ if((tface && tface->mode & TF_SHAREDCOL) || (G.f & G_FACESELECT)==0) {
scol= scolmain+4*mface->v1;
mcol[1]= scol[1]; mcol[2]= scol[2]; mcol[3]= scol[3];
scol= scolmain+4*mface->v2;
@@ -250,7 +250,9 @@ void make_vertexcol(int shade) /* single ob */
shadeMeshMCol(ob, me);
else
memset(me->mcol, 255, 4*sizeof(MCol)*me->totface);
-
+
+ if (me->mr) multires_load_cols(me);
+
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
allqueue(REDRAWBUTSEDIT, 0);
@@ -327,7 +329,7 @@ void clear_vpaint_selectedfaces()
ob= OBACT;
me= get_mesh(ob);
- if(me==0 || me->mtface==0 || me->totface==0) return;
+ if(me==0 || me->totface==0) return;
if(!me->mcol)
make_vertexcol(0);
@@ -698,7 +700,7 @@ static unsigned int mcol_darken(unsigned int col1, unsigned int col2, int fac)
static void vpaint_blend( unsigned int *col, unsigned int *colorig, unsigned int paintcol, int alpha)
{
- if(Gvp.mode==VP_MIX || Gvp.mode==VP_FILT) *col= mcol_blend( *col, paintcol, alpha);
+ if(Gvp.mode==VP_MIX || Gvp.mode==VP_BLUR) *col= mcol_blend( *col, paintcol, alpha);
else if(Gvp.mode==VP_ADD) *col= mcol_add( *col, paintcol, alpha);
else if(Gvp.mode==VP_SUB) *col= mcol_sub( *col, paintcol, alpha);
else if(Gvp.mode==VP_MUL) *col= mcol_mul( *col, paintcol, alpha);
@@ -712,7 +714,7 @@ static void vpaint_blend( unsigned int *col, unsigned int *colorig, unsigned int
alpha= (int)(255.0*Gvp.a);
- if(Gvp.mode==VP_MIX || Gvp.mode==VP_FILT) testcol= mcol_blend( *colorig, paintcol, alpha);
+ if(Gvp.mode==VP_MIX || Gvp.mode==VP_BLUR) testcol= mcol_blend( *colorig, paintcol, alpha);
else if(Gvp.mode==VP_ADD) testcol= mcol_add( *colorig, paintcol, alpha);
else if(Gvp.mode==VP_SUB) testcol= mcol_sub( *colorig, paintcol, alpha);
else if(Gvp.mode==VP_MUL) testcol= mcol_mul( *colorig, paintcol, alpha);
@@ -839,7 +841,7 @@ static void wpaint_blend(MDeformWeight *dw, MDeformWeight *uw, float alpha, floa
if(dw==NULL || uw==NULL) return;
- if(Gwp.mode==VP_MIX || Gwp.mode==VP_FILT)
+ if(Gwp.mode==VP_MIX || Gwp.mode==VP_BLUR)
dw->weight = paintval*alpha + dw->weight*(1.0-alpha);
else if(Gwp.mode==VP_ADD)
dw->weight += paintval*alpha;
@@ -862,7 +864,7 @@ static void wpaint_blend(MDeformWeight *dw, MDeformWeight *uw, float alpha, floa
float testw=0.0f;
alpha= Gwp.a;
- if(Gwp.mode==VP_MIX || Gwp.mode==VP_FILT)
+ if(Gwp.mode==VP_MIX || Gwp.mode==VP_BLUR)
testw = paintval*alpha + uw->weight*(1.0-alpha);
else if(Gwp.mode==VP_ADD)
testw = uw->weight + paintval*alpha;
@@ -1087,7 +1089,7 @@ void weight_paint(void)
float vpimat[3][3];
int *indexar, index, totindex, alpha, totw;
int vgroup_mirror= -1;
- short mval[2], mvalo[2], firsttime=1, mousebut;
+ short mval[2], mvalo[2], firsttime=1;
if((G.f & G_WEIGHTPAINT)==0) return;
if(G.obedit) return;
@@ -1160,9 +1162,6 @@ void weight_paint(void)
mvalo[0]= mval[0];
mvalo[1]= mval[1];
- if (U.flag & USER_LMOUSESELECT) mousebut = R_MOUSE;
- else mousebut = L_MOUSE;
-
/* if mirror painting, find the other group */
if(Gwp.flag & VP_MIRROR_X) {
bDeformGroup *defgroup= BLI_findlink(&ob->defbase, ob->actdef-1);
@@ -1188,7 +1187,7 @@ void weight_paint(void)
}
}
- while (get_mbut() & mousebut) {
+ while (get_mbut() & L_MOUSE) {
getmouseco_areawin(mval);
if(firsttime || mval[0]!=mvalo[0] || mval[1]!=mvalo[1]) {
@@ -1235,7 +1234,7 @@ void weight_paint(void)
/* make sure each vertex gets treated only once */
/* and calculate filter weight */
totw= 0;
- if(Gwp.mode==VP_FILT)
+ if(Gwp.mode==VP_BLUR)
paintweight= 0.0f;
else
paintweight= editbutvweight;
@@ -1249,7 +1248,7 @@ void weight_paint(void)
(me->dvert+mface->v3)->flag= 1;
if(mface->v4) (me->dvert+mface->v4)->flag= 1;
- if(Gwp.mode==VP_FILT) {
+ if(Gwp.mode==VP_BLUR) {
MDeformWeight *dw, *(*dw_func)(MDeformVert *, int) = verify_defweight;
if(Gwp.flag & VP_ONLYVGROUP)
@@ -1269,7 +1268,7 @@ void weight_paint(void)
}
}
- if(Gwp.mode==VP_FILT)
+ if(Gwp.mode==VP_BLUR)
paintweight/= (float)totw;
for(index=0; index<totindex; index++) {
@@ -1360,7 +1359,7 @@ void vertex_paint()
float vpimat[3][3];
unsigned int paintcol=0, *mcol, *mcolorig, fcol1, fcol2;
int *indexar, index, alpha, totindex;
- short mval[2], mvalo[2], firsttime=1, mousebut;
+ short mval[2], mvalo[2], firsttime=1;
if((G.f & G_VERTEXPAINT)==0) return;
if(G.obedit) return;
@@ -1372,9 +1371,9 @@ void vertex_paint()
if(me==NULL || me->totface==0) return;
if(ob->lay & G.vd->lay); else error("Active object is not in this layer");
- if(me->mtface==NULL && me->mcol==NULL) make_vertexcol(1);
+ if(me->mcol==NULL) make_vertexcol(1);
- if(me->mtface==NULL && me->mcol==NULL) return;
+ if(me->mcol==NULL) return;
/* ALLOCATIONS! No return after his line */
@@ -1403,10 +1402,7 @@ void vertex_paint()
mvalo[0]= mval[0];
mvalo[1]= mval[1];
- if (U.flag & USER_LMOUSESELECT) mousebut = R_MOUSE;
- else mousebut = L_MOUSE;
-
- while (get_mbut() & mousebut) {
+ while (get_mbut() & L_MOUSE) {
getmouseco_areawin(mval);
if(firsttime || mval[0]!=mvalo[0] || mval[1]!=mvalo[1]) {
@@ -1456,7 +1452,7 @@ void vertex_paint()
mcol= ( (unsigned int *)me->mcol) + 4*(indexar[index]-1);
mcolorig= ( (unsigned int *)Gvp.vpaint_prev) + 4*(indexar[index]-1);
- if(Gvp.mode==VP_FILT) {
+ if(Gvp.mode==VP_BLUR) {
fcol1= mcol_blend( mcol[0], mcol[1], 128);
if(mface->v4) {
fcol2= mcol_blend( mcol[2], mcol[3], 128);
diff --git a/source/blender/src/writeimage.c b/source/blender/src/writeimage.c
index ca3a312f98b..cb3d4158ec1 100644
--- a/source/blender/src/writeimage.c
+++ b/source/blender/src/writeimage.c
@@ -151,6 +151,11 @@ void save_image_filesel_str(char *str)
case R_PNG:
strcpy(str, "Save PNG");
break;
+#ifdef WITH_DDS
+ case R_DDS:
+ strcpy(str, "Save DDS");
+ break;
+#endif
case R_BMP:
strcpy(str, "Save BMP");
break;
diff --git a/source/blender/verify/intern/Makefile b/source/blender/verify/intern/Makefile
index 74430193c79..c05f035caf2 100644
--- a/source/blender/verify/intern/Makefile
+++ b/source/blender/verify/intern/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/blender/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_2_C_WARNINGS)
# path to our own external headerfiles
diff --git a/source/blender/yafray/intern/Makefile b/source/blender/yafray/intern/Makefile
index a00a1fed73f..f7f6ccb559f 100644
--- a/source/blender/yafray/intern/Makefile
+++ b/source/blender/yafray/intern/Makefile
@@ -33,10 +33,6 @@ DIR = $(OCGDIR)/blender/yafray
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
diff --git a/source/blender/yafray/intern/api.cpp b/source/blender/yafray/intern/api.cpp
index f59c5e1f73e..f59c5e1f73e 100755..100644
--- a/source/blender/yafray/intern/api.cpp
+++ b/source/blender/yafray/intern/api.cpp
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp
index c8c0b3c6bb1..c8c0b3c6bb1 100755..100644
--- a/source/blender/yafray/intern/export_File.cpp
+++ b/source/blender/yafray/intern/export_File.cpp
diff --git a/source/blender/yafray/intern/export_File.h b/source/blender/yafray/intern/export_File.h
index 5d2e0c53a21..5d2e0c53a21 100755..100644
--- a/source/blender/yafray/intern/export_File.h
+++ b/source/blender/yafray/intern/export_File.h
diff --git a/source/creator/Makefile b/source/creator/Makefile
index f68855af96f..02c22aa4da8 100644
--- a/source/creator/Makefile
+++ b/source/creator/Makefile
@@ -38,10 +38,6 @@ CSRCS = creator.c
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
CPPFLAGS += -I../blender/render/extern/include
diff --git a/source/creator/buildinfo.c b/source/creator/buildinfo.c
index feda7484f79..69d3b090086 100644
--- a/source/creator/buildinfo.c
+++ b/source/creator/buildinfo.c
@@ -38,6 +38,7 @@
#ifndef WIN32
char * build_date=BUILD_DATE;
char * build_time=BUILD_TIME;
+char * build_rev=BUILD_REV;
char * build_platform=BUILD_PLATFORM;
char * build_type=BUILD_TYPE;
#else
diff --git a/source/creator/creator.c b/source/creator/creator.c
index d63e69255eb..1feaf075e1c 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -159,6 +159,7 @@ static void print_version(void)
printf ("Blender %d.%02d (sub %d) Build\n", G.version/100, G.version%100, BLENDER_SUBVERSION);
printf ("\tbuild date: %s\n", build_date);
printf ("\tbuild time: %s\n", build_time);
+ printf ("\tbuild revision: %s\n", build_rev);
printf ("\tbuild platform: %s\n", build_platform);
printf ("\tbuild type: %s\n", build_type);
#else
@@ -216,6 +217,8 @@ static void print_help(void)
printf (" -R\t\tRegister .blend extension\n");
#endif
printf (" -v\t\tPrint Blender version and exit\n");
+ printf (" --\t\tEnds option processing. Following arguments are \n");
+ printf (" \t\t passed unchanged. Access via Python's sys.argv\n");
}
@@ -314,6 +317,12 @@ int main(int argc, char **argv)
exit(0);
}
+ /* end argument processing after -- */
+ if (!strcmp( argv[a], "--")){
+ a = argc;
+ break;
+ }
+
/* Handle long version request */
if (!strcmp(argv[a], "--version")){
print_version();
@@ -500,6 +509,10 @@ int main(int argc, char **argv)
if(argv[a][0] == '-') {
switch(argv[a][1]) {
+ case '-': /* -- ends argument processing */
+ a = argc;
+ break;
+
case 'p': /* prefsize */
a+= 4;
break;
@@ -673,9 +686,19 @@ int main(int argc, char **argv)
break;
}
}
- else {
- BKE_read_file(argv[a], NULL);
- sound_initialize_sounds();
+ else {
+ if (G.background) {
+ BKE_read_file(argv[a], NULL);
+ sound_initialize_sounds();
+
+ /* happens for the UI on file reading too */
+ BKE_reset_undo();
+ BKE_write_undo("original"); /* save current state */
+ } else {
+ /* we are not running in background mode here, but start blender in UI mode with
+ a file - this should do everything a 'load file' does */
+ BIF_read_file(argv[a]);
+ }
}
}
@@ -704,6 +727,7 @@ static void error_cb(char *err)
static void mem_error_cb(char *errorStr)
{
fprintf(stderr, errorStr);
+ fflush(stderr);
}
void setCallbacks(void)
diff --git a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
index 80db437bcd9..0c42a35c808 100644
--- a/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
+++ b/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
@@ -605,7 +605,9 @@ extern "C" void StartKetsjiShellSimulation(struct ScrArea *area,
ketsjiengine->SetUseFixedTime(true);
- ketsjiengine->SetTicRate(blscene->r.frs_sec);
+ ketsjiengine->SetTicRate(
+ (double) blscene->r.frs_sec /
+ (double) blscene->r.frs_sec_base);
// the mainloop
while ((blscene->r.cfra<=blscene->r.efra)&&(!exitrequested))
@@ -663,4 +665,4 @@ extern "C" void StartKetsjiShellSimulation(struct ScrArea *area,
} while (exitrequested == KX_EXIT_REQUEST_RESTART_GAME || exitrequested == KX_EXIT_REQUEST_START_OTHER_GAME);
if (bfd) BLO_blendfiledata_free(bfd);
-} \ No newline at end of file
+}
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
index caf3d120fab..463f06869d6 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
+++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
@@ -452,4 +452,27 @@ RAS_IPolyMaterial* KX_BlenderRenderTools::CreateBlenderPolyMaterial(
return NULL;
}
+void KX_BlenderRenderTools::MotionBlur(RAS_IRasterizer* rasterizer)
+{
+ int state = rasterizer->GetMotionBlurState();
+ float motionblurvalue;
+ if(state)
+ {
+ motionblurvalue = rasterizer->GetMotionBlurValue();
+ if(state==1)
+ {
+ //bugfix:load color buffer into accum buffer for the first time(state=1)
+ glAccum(GL_LOAD, 1.0);
+ rasterizer->SetMotionBlurState(2);
+ }
+ else if(motionblurvalue>=0.0 && motionblurvalue<=1.0)
+ {
+ glAccum(GL_MULT, motionblurvalue);
+ glAccum(GL_ACCUM, 1-motionblurvalue);
+ glAccum(GL_RETURN, 1.0);
+ glFlush();
+ }
+ }
+}
+
unsigned int KX_BlenderRenderTools::m_numgllights;
diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
index dc638d1a43a..a79302a283e 100644
--- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
+++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
@@ -100,7 +100,10 @@ public:
void* tface);
bool RayHit(KX_ClientObjectInfo* client, MT_Point3& hit_point, MT_Vector3& hit_normal, void * const data);
+
+ virtual void MotionBlur(RAS_IRasterizer* rasterizer);
};
#endif //__KX_BLENDERRENDERTOOLS
+
diff --git a/source/gameengine/BlenderRoutines/SConscript b/source/gameengine/BlenderRoutines/SConscript
index 984b700abd6..984b700abd6 100755..100644
--- a/source/gameengine/BlenderRoutines/SConscript
+++ b/source/gameengine/BlenderRoutines/SConscript
diff --git a/source/gameengine/Converter/BL_ActionActuator.cpp b/source/gameengine/Converter/BL_ActionActuator.cpp
index 2a7503d610d..b38599685af 100644
--- a/source/gameengine/Converter/BL_ActionActuator.cpp
+++ b/source/gameengine/Converter/BL_ActionActuator.cpp
@@ -43,6 +43,7 @@
#include "KX_GameObject.h"
#include "STR_HashedString.h"
#include "DNA_action_types.h"
+#include "DNA_nla_types.h"
#include "DNA_actuator_types.h"
#include "BKE_action.h"
#include "DNA_armature_types.h"
@@ -384,7 +385,7 @@ bool BL_ActionActuator::Update(double curtime, bool frame)
/* Find percentages */
newweight = (m_blendframe/(float)m_blendin);
- blend_poses(m_pose, m_blendpose, 1.0 - newweight, POSE_BLEND);
+ blend_poses(m_pose, m_blendpose, 1.0 - newweight, ACTSTRIPMODE_BLEND);
/* Increment current blending percentage */
m_blendframe = (curtime - m_blendstart)*KX_FIXED_FRAME_PER_SEC;
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index 0e2a009a192..fde54025fc7 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -1913,10 +1913,14 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
eulxyzPrev[0]=blenderobject->rot[0];
eulxyzPrev[1]=blenderobject->rot[1];
eulxyzPrev[2]=blenderobject->rot[2];
- tmp.scale((float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec);
+
+ double fps = (double) blenderscene->r.frs_sec/
+ (double) blenderscene->r.frs_sec_base;
+
+ tmp.scale(fps, fps, fps);
inivel.push_back(tmp);
tmp=eulxyz-eulxyzPrev;
- tmp.scale((float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec);
+ tmp.scale(fps, fps, fps);
iniang.push_back(tmp);
blenderscene->r.cfra=blenderscene->r.sfra;
update_for_newframe();
diff --git a/source/gameengine/Converter/BL_SkinDeformer.cpp b/source/gameengine/Converter/BL_SkinDeformer.cpp
index d8e5a255a7c..e9ec6f9116b 100644
--- a/source/gameengine/Converter/BL_SkinDeformer.cpp
+++ b/source/gameengine/Converter/BL_SkinDeformer.cpp
@@ -175,7 +175,7 @@ void BL_SkinDeformer::Update(void)
for (int v =0; v<m_bmesh->totvert; v++)
VECCOPY(m_transverts[v], m_bmesh->mvert[v].co);
- armature_deform_verts( par_arma, m_objMesh, NULL, m_transverts, m_bmesh->totvert, ARM_DEF_VGROUP, NULL );
+ armature_deform_verts( par_arma, m_objMesh, NULL, m_transverts, NULL, m_bmesh->totvert, ARM_DEF_VGROUP, NULL, NULL );
RecalcNormals();
/* Update the current frame */
diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
index 44e62f1601a..47d8f186653 100644
--- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
+++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
@@ -229,6 +229,11 @@ struct BlenderDebugDraw : public btIDebugDraw
}
}
+ virtual void reportErrorWarning(const char* warningString)
+ {
+
+ }
+
virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,float distance,int lifeTime,const btVector3& color)
{
//not yet
@@ -791,7 +796,7 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
if (icu1)
{
float curVal = position.x();
- insert_vert_ipo(icu1, frameNumber, curVal);
+ insert_vert_icu(icu1, frameNumber, curVal, 0);
#ifdef TEST_HANDLES_GAME2IPO
testhandles_ipocurve(icu1);
#endif
@@ -800,7 +805,7 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
if (icu1)
{
float curVal = position.y();
- insert_vert_ipo(icu1, frameNumber, curVal);
+ insert_vert_icu(icu1, frameNumber, curVal, 0);
#ifdef TEST_HANDLES_GAME2IPO
testhandles_ipocurve(icu1);
@@ -810,7 +815,7 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
if (icu1)
{
float curVal = position.z();
- insert_vert_ipo(icu1, frameNumber, curVal);
+ insert_vert_icu(icu1, frameNumber, curVal, 0);
#ifdef TEST_HANDLES_GAME2IPO
testhandles_ipocurve(icu1);
#endif
@@ -819,7 +824,7 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
if (icu1)
{
float curVal = eulerAngles[0];
- insert_vert_ipo(icu1, frameNumber, curVal);
+ insert_vert_icu(icu1, frameNumber, curVal, 0);
#ifdef TEST_HANDLES_GAME2IPO
testhandles_ipocurve(icu1);
@@ -829,7 +834,7 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
if (icu1)
{
float curVal = eulerAngles[1];
- insert_vert_ipo(icu1, frameNumber, curVal);
+ insert_vert_icu(icu1, frameNumber, curVal, 0);
#ifdef TEST_HANDLES_GAME2IPO
testhandles_ipocurve(icu1);
@@ -839,7 +844,7 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber)
if (icu1)
{
float curVal = eulerAngles[2];
- insert_vert_ipo(icu1, frameNumber, curVal);
+ insert_vert_icu(icu1, frameNumber, curVal, 0);
#ifdef TEST_HANDLES_GAME2IPO
testhandles_ipocurve(icu1);
diff --git a/source/gameengine/Converter/SConscript b/source/gameengine/Converter/SConscript
index f5e382b471e..f5e382b471e 100755..100644
--- a/source/gameengine/Converter/SConscript
+++ b/source/gameengine/Converter/SConscript
diff --git a/source/gameengine/Expressions/SConscript b/source/gameengine/Expressions/SConscript
index 809ac31371e..809ac31371e 100755..100644
--- a/source/gameengine/Expressions/SConscript
+++ b/source/gameengine/Expressions/SConscript
diff --git a/source/gameengine/GameLogic/SConscript b/source/gameengine/GameLogic/SConscript
index 7a2c3d91e72..7a2c3d91e72 100755..100644
--- a/source/gameengine/GameLogic/SConscript
+++ b/source/gameengine/GameLogic/SConscript
diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
index 0f6bec30437..cc5c392d51a 100644
--- a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
+++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
@@ -570,4 +570,27 @@ void GPC_RenderTools::applyTransform(RAS_IRasterizer* rasty,double* oglmatrix,in
}
}
+void GPC_RenderTools::MotionBlur(RAS_IRasterizer* rasterizer)
+{
+ int state = rasterizer->GetMotionBlurState();
+ float motionblurvalue;
+ if(state)
+ {
+ motionblurvalue = rasterizer->GetMotionBlurValue();
+ if(state==1)
+ {
+ //bugfix:load color buffer into accum buffer for the first time(state=1)
+ glAccum(GL_LOAD, 1.0);
+ rasterizer->SetMotionBlurState(2);
+ }
+ else if(motionblurvalue>=0.0 && motionblurvalue<=1.0)
+ {
+ glAccum(GL_MULT, motionblurvalue);
+ glAccum(GL_ACCUM, 1-motionblurvalue);
+ glAccum(GL_RETURN, 1.0);
+ glFlush();
+ }
+ }
+}
+
unsigned int GPC_RenderTools::m_numgllights;
diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.h b/source/gameengine/GamePlayer/common/GPC_RenderTools.h
index b7f73df3c34..e1f2a869c22 100644
--- a/source/gameengine/GamePlayer/common/GPC_RenderTools.h
+++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.h
@@ -149,6 +149,8 @@ public:
int applyLights(int objectlayer);
bool RayHit(KX_ClientObjectInfo* client, MT_Point3& hit_point, MT_Vector3& hit_normal, void * const data);
+
+ virtual void MotionBlur(RAS_IRasterizer* rasterizer);
protected:
/**
* Copied from KX_BlenderGL.cpp in KX_blenderhook
@@ -173,3 +175,4 @@ protected:
#endif // __GPC_RENDERTOOLS_H
+
diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
index b0eb1d9c2ca..23447d36401 100644
--- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
+++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp
@@ -34,10 +34,6 @@
#include <iostream>
#include <math.h>
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
#ifdef __linux__
#ifdef __alpha__
#include <signal.h>
@@ -290,7 +286,7 @@ int main(int argc, char** argv)
bool fullScreenParFound = false;
bool windowParFound = false;
bool closeConsole = true;
- RAS_IRasterizer::StereoMode stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
+ RAS_IRasterizer::StereoMode stereomode;
bool stereoWindow = false;
bool stereoParFound = false;
int windowLeft = 100;
@@ -301,7 +297,7 @@ int main(int argc, char** argv)
GHOST_TUns32 fullScreenHeight= 0;
int fullScreenBpp = 32;
int fullScreenFrequency = 60;
-
+
#ifdef __linux__
#ifdef __alpha__
signal (SIGFPE, SIG_IGN);
@@ -334,12 +330,9 @@ int main(int argc, char** argv)
GEN_init_messaging_system();
// Parse command line options
-#ifdef WIN32
#ifndef NDEBUG
printf("argv[0] = '%s'\n", argv[0]);
#endif
-#endif //WIN32
-
#ifdef WIN32
if (scr_saver_init(argc, argv))
@@ -370,11 +363,9 @@ int main(int argc, char** argv)
;)
{
-#ifdef WIN32
#ifndef NDEBUG
printf("argv[%d] = '%s' , %i\n", i, argv[i],argc);
#endif
-#endif //WIN32
if (argv[i][0] == '-')
{
switch (argv[i][1])
@@ -397,11 +388,9 @@ int main(int argc, char** argv)
SYS_WriteCommandLineInt(syshandle, paramname, atoi(argv[i]));
SYS_WriteCommandLineFloat(syshandle, paramname, atof(argv[i]));
SYS_WriteCommandLineString(syshandle, paramname, argv[i]);
-#ifdef WIN32
#ifndef NDEBUG
printf("%s = '%s'\n", paramname, argv[i]);
#endif
-#endif //WIN32
i++;
}
else
@@ -412,7 +401,7 @@ int main(int argc, char** argv)
}
else
{
- SYS_WriteCommandLineInt(syshandle, argv[i++], 1);
+// SYS_WriteCommandLineInt(syshandle, argv[i++], 1);
}
}
}
@@ -533,13 +522,16 @@ int main(int argc, char** argv)
printf("error: window size too small.\n");
}
- if (error)
+ if (error )
{
usage(argv[0]);
+ return 0;
}
- else
+
+ if (!stereoParFound) stereomode = RAS_IRasterizer::RAS_STEREO_NOSTEREO;
+
#ifdef WIN32
- if (scr_saver_mode != SCREEN_SAVER_MODE_CONFIGURATION)
+ if (scr_saver_mode != SCREEN_SAVER_MODE_CONFIGURATION)
#endif
{
#ifdef __APPLE__
@@ -547,6 +539,7 @@ int main(int argc, char** argv)
SYS_WriteCommandLineInt(syshandle, "nomipmap", 1);
//fullScreen = false; // Can't use full screen
#endif
+
if (SYS_GetCommandLineInt(syshandle, "nomipmap", 0))
{
GPC_PolygonMaterial::SetMipMappingEnabled(0);
@@ -768,7 +761,7 @@ int main(int argc, char** argv)
printf("error: couldn't create a system.\n");
}
}
-
+
return error ? -1 : 0;
}
diff --git a/source/gameengine/Ketsji/KXNetwork/SConscript b/source/gameengine/Ketsji/KXNetwork/SConscript
index 2297b96c19e..2297b96c19e 100755..100644
--- a/source/gameengine/Ketsji/KXNetwork/SConscript
+++ b/source/gameengine/Ketsji/KXNetwork/SConscript
diff --git a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
index fcc793ec5c9..6ea13f3a5e3 100644
--- a/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
+++ b/source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
@@ -853,7 +853,8 @@ static btCollisionShape* CreateBulletShapeFromMesh(RAS_MeshObject* meshobj, bool
//map_gamemesh_to_bulletshape.insert(GEN_HashedPtr(meshobj),collisionMeshShape);
if (!polytope)
{
- concaveShape = new btBvhTriangleMeshShape( collisionMeshData );
+ bool useQuantization = true;
+ concaveShape = new btBvhTriangleMeshShape( collisionMeshData, useQuantization );
//concaveShape = new btTriangleMeshShape( collisionMeshData );
concaveShape->recalcLocalAabb();
diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h
index f3bf529a37d..db910a46a81 100644
--- a/source/gameengine/Ketsji/KX_GameObject.h
+++ b/source/gameengine/Ketsji/KX_GameObject.h
@@ -416,7 +416,7 @@ public:
void
UpdateIPO(
float curframetime,
- bool resurse,
+ bool recurse,
bool ipo_as_force,
bool force_ipo_local
);
diff --git a/source/gameengine/Ketsji/KX_IpoActuator.cpp b/source/gameengine/Ketsji/KX_IpoActuator.cpp
index b72e29e955f..e7f1dea7bbf 100644
--- a/source/gameengine/Ketsji/KX_IpoActuator.cpp
+++ b/source/gameengine/Ketsji/KX_IpoActuator.cpp
@@ -66,7 +66,7 @@ STR_String KX_IpoActuator::S_KX_ACT_IPO_FROM_PROP_STRING = "FromProp";
class CIpoAction : public CAction
{
float m_curtime;
- bool m_resurse;
+ bool m_recurse;
KX_GameObject* m_gameobj;
bool m_ipo_as_force;
bool m_force_ipo_local;
@@ -78,7 +78,7 @@ public:
bool ipo_as_force,
bool force_ipo_local) :
m_curtime(curtime) ,
- m_resurse(recurse),
+ m_recurse(recurse),
m_gameobj(gameobj),
m_ipo_as_force(ipo_as_force),
m_force_ipo_local(force_ipo_local)
@@ -90,7 +90,7 @@ public:
{
m_gameobj->UpdateIPO(
m_curtime,
- m_resurse,
+ m_recurse,
m_ipo_as_force,
m_force_ipo_local);
};
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
index e76e28bcb7b..f8826245aab 100644
--- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
+++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
@@ -966,6 +966,9 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
scene->CalculateVisibleMeshes(m_rasterizer,cam);
scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+
+ m_rendertools->MotionBlur(m_rasterizer);
+
}
@@ -1463,3 +1466,4 @@ void KX_KetsjiEngine::GetOverrideFrameColor(float& r, float& g, float& b) const
b = m_overrideFrameColorB;
}
+
diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp
index 7a937d5e349..1a3a0490d21 100644
--- a/source/gameengine/Ketsji/KX_PythonInit.cpp
+++ b/source/gameengine/Ketsji/KX_PythonInit.cpp
@@ -618,7 +618,31 @@ static PyObject* gPyMakeScreenshot(PyObject*,
Py_Return;
}
+static PyObject* gPyEnableMotionBlur(PyObject*,
+ PyObject* args,
+ PyObject*)
+{
+ float motionblurvalue;
+ if (PyArg_ParseTuple(args,"f",&motionblurvalue))
+ {
+ if(gp_Rasterizer)
+ {
+ gp_Rasterizer->EnableMotionBlur(motionblurvalue);
+ }
+ }
+ Py_Return;
+}
+static PyObject* gPyDisableMotionBlur(PyObject*,
+ PyObject* args,
+ PyObject*)
+{
+ if(gp_Rasterizer)
+ {
+ gp_Rasterizer->DisableMotionBlur();
+ }
+ Py_Return;
+}
STR_String gPyGetWindowHeight__doc__="getWindowHeight doc";
STR_String gPyGetWindowWidth__doc__="getWindowWidth doc";
@@ -645,6 +669,9 @@ static struct PyMethodDef rasterizer_methods[] = {
{"setMistColor",(PyCFunction)gPySetMistColor,METH_VARARGS,"set Mist Color (rgb)"},
{"setMistStart",(PyCFunction)gPySetMistStart,METH_VARARGS,"set Mist Start(rgb)"},
{"setMistEnd",(PyCFunction)gPySetMistEnd,METH_VARARGS,"set Mist End(rgb)"},
+ {"enableMotionBlur",(PyCFunction)gPyEnableMotionBlur,METH_VARARGS,"enable motion blur"},
+ {"disableMotionBlur",(PyCFunction)gPyDisableMotionBlur,METH_VARARGS,"disable motion blur"},
+
{"setEyeSeparation", (PyCFunction) gPySetEyeSeparation, METH_VARARGS, "set the eye separation for stereo mode"},
{"getEyeSeparation", (PyCFunction) gPyGetEyeSeparation, METH_VARARGS, "get the eye separation for stereo mode"},
diff --git a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
index d92742d8799..fba2ecc223b 100644
--- a/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
+++ b/source/gameengine/Ketsji/KX_VehicleWrapper.cpp
@@ -61,9 +61,9 @@ PyObject* KX_VehicleWrapper::PyAddWheel(PyObject* self,
aDir[0] = attachDir[0];
aDir[1] = attachDir[1];
aDir[2] = attachDir[2];
- aAxle[0] = attachAxle[0];
- aAxle[1] = attachAxle[1];
- aAxle[2] = attachAxle[2];
+ aAxle[0] = -attachAxle[0];//someone reverse some conventions inside Bullet (axle winding)
+ aAxle[1] = -attachAxle[1];
+ aAxle[2] = -attachAxle[2];
printf("attempt for addWheel: suspensionRestLength%f wheelRadius %f, hasSteering:%d\n",suspensionRestLength,wheelRadius,hasSteering);
m_vehicle->AddWheel(motionState,aPos,aDir,aAxle,suspensionRestLength,wheelRadius,hasSteering);
@@ -152,6 +152,7 @@ PyObject* KX_VehicleWrapper::PyApplyEngineForce(PyObject* self,
if (PyArg_ParseTuple(args,"fi",&force,&wheelIndex))
{
+ force *= -1.f;//someone reverse some conventions inside Bullet (axle winding)
m_vehicle->ApplyEngineForce(force,wheelIndex);
}
Py_INCREF(Py_None);
diff --git a/source/gameengine/Network/LoopBackNetwork/SConscript b/source/gameengine/Network/LoopBackNetwork/SConscript
index 987603f1a49..987603f1a49 100755..100644
--- a/source/gameengine/Network/LoopBackNetwork/SConscript
+++ b/source/gameengine/Network/LoopBackNetwork/SConscript
diff --git a/source/gameengine/Network/SConscript b/source/gameengine/Network/SConscript
index 0778418045f..0778418045f 100755..100644
--- a/source/gameengine/Network/SConscript
+++ b/source/gameengine/Network/SConscript
diff --git a/source/gameengine/Physics/BlOde/SConscript b/source/gameengine/Physics/BlOde/SConscript
index 90e949d2d86..90e949d2d86 100755..100644
--- a/source/gameengine/Physics/BlOde/SConscript
+++ b/source/gameengine/Physics/BlOde/SConscript
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index a131054f5e5..5a45ce020cc 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -104,12 +104,13 @@ public:
};
+
void CcdPhysicsController::CreateRigidbody()
{
- btTransform trans = GetTransformFromMotionState(m_cci.m_MotionState);
+ btTransform trans = GetTransformFromMotionState(m_MotionState);
- m_bulletMotionState = new BlenderBulletMotionState(m_cci.m_MotionState);
+ m_bulletMotionState = new BlenderBulletMotionState(m_MotionState);
m_body = new btRigidBody(m_cci.m_mass,
m_bulletMotionState,
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
index bc69fe85eff..99c3e5f77c7 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
@@ -1137,6 +1137,74 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
break;
}
+ case PHY_CONE_TWIST_CONSTRAINT:
+ {
+ btConeTwistConstraint* coneTwistContraint = 0;
+
+
+ if (rb1)
+ {
+ btTransform frameInA;
+ btTransform frameInB;
+
+ btVector3 axis1(axis1X,axis1Y,axis1Z), axis2(axis2X,axis2Y,axis2Z);
+ if (axis1.length() == 0.0)
+ {
+ btPlaneSpace1( axisInA, axis1, axis2 );
+ }
+
+ frameInA.getBasis().setValue( axisInA.x(), axis1.x(), axis2.x(),
+ axisInA.y(), axis1.y(), axis2.y(),
+ axisInA.z(), axis1.z(), axis2.z() );
+ frameInA.setOrigin( pivotInA );
+
+ btTransform inv = rb1->getCenterOfMassTransform().inverse();
+
+ btTransform globalFrameA = rb0->getCenterOfMassTransform() * frameInA;
+
+ frameInB = inv * globalFrameA;
+
+ coneTwistContraint = new btConeTwistConstraint( *rb0,*rb1,
+ frameInA,frameInB);
+
+
+ } else
+ {
+ static btRigidBody s_fixedObject2( 0,0,0);
+ btTransform frameInA;
+ btTransform frameInB;
+
+ btVector3 axis1, axis2;
+ btPlaneSpace1( axisInA, axis1, axis2 );
+
+ frameInA.getBasis().setValue( axisInA.x(), axis1.x(), axis2.x(),
+ axisInA.y(), axis1.y(), axis2.y(),
+ axisInA.z(), axis1.z(), axis2.z() );
+
+ frameInA.setOrigin( pivotInA );
+
+ ///frameInB in worldspace
+ frameInB = rb0->getCenterOfMassTransform() * frameInA;
+
+ coneTwistContraint = new btConeTwistConstraint(
+ *rb0,s_fixedObject2,
+ frameInA,frameInB);
+ }
+
+ if (coneTwistContraint)
+ {
+ //m_constraints.push_back(genericConstraint);
+ m_dynamicsWorld->addConstraint(coneTwistContraint);
+ coneTwistContraint->setUserConstraintId(gConstraintUid++);
+ coneTwistContraint->setUserConstraintType(type);
+ //64 bit systems can't cast pointer to int. could use size_t instead.
+ return coneTwistContraint->getUserConstraintId();
+ }
+
+
+
+ break;
+ }
case PHY_ANGULAR_CONSTRAINT:
angularOnly = true;
diff --git a/source/gameengine/Physics/Dummy/SConscript b/source/gameengine/Physics/Dummy/SConscript
index e24b150531f..e24b150531f 100755..100644
--- a/source/gameengine/Physics/Dummy/SConscript
+++ b/source/gameengine/Physics/Dummy/SConscript
diff --git a/source/gameengine/Physics/Sumo/SConscript b/source/gameengine/Physics/Sumo/SConscript
index be7922efd44..be7922efd44 100755..100644
--- a/source/gameengine/Physics/Sumo/SConscript
+++ b/source/gameengine/Physics/Sumo/SConscript
diff --git a/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.cpp b/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.cpp
index 1992bbe3421..1992bbe3421 100755..100644
--- a/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.cpp
+++ b/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.cpp
diff --git a/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.h b/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.h
index cc980f3961d..cc980f3961d 100755..100644
--- a/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.h
+++ b/source/gameengine/Physics/Sumo/SumoPHYCallbackBridge.h
diff --git a/source/gameengine/Physics/common/PHY_DynamicTypes.h b/source/gameengine/Physics/common/PHY_DynamicTypes.h
index 3952377181a..68b60192fbc 100644
--- a/source/gameengine/Physics/common/PHY_DynamicTypes.h
+++ b/source/gameengine/Physics/common/PHY_DynamicTypes.h
@@ -81,6 +81,7 @@ typedef enum PHY_ConstraintType {
PHY_POINT2POINT_CONSTRAINT=1,
PHY_LINEHINGE_CONSTRAINT=2,
PHY_ANGULAR_CONSTRAINT = 3,//hinge without ball socket
+ PHY_CONE_TWIST_CONSTRAINT = 4,
PHY_VEHICLE_CONSTRAINT=11,//complex 'constraint' that turns a rigidbody into a vehicle
PHY_GENERIC_6DOF_CONSTRAINT=12,//can leave any of the 6 degree of freedom 'free' or 'locked'
diff --git a/source/gameengine/Physics/common/SConscript b/source/gameengine/Physics/common/SConscript
index 91c5101675e..91c5101675e 100755..100644
--- a/source/gameengine/Physics/common/SConscript
+++ b/source/gameengine/Physics/common/SConscript
diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h
index 8ecc9e7ad05..560c6741260 100644
--- a/source/gameengine/Rasterizer/RAS_IRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h
@@ -48,7 +48,6 @@ class RAS_IPolyMaterial;
*/
class RAS_IRasterizer
{
-
public:
RAS_IRasterizer(RAS_ICanvas* canv){};
@@ -398,7 +397,15 @@ public:
virtual bool QueryLists(){return false;}
virtual bool QueryArrays(){return false;}
+
+ virtual void EnableMotionBlur(float motionblurvalue)=0;
+ virtual void DisableMotionBlur()=0;
+
+ virtual float GetMotionBlurValue()=0;
+ virtual int GetMotionBlurState()=0;
+ virtual void SetMotionBlurState(int newstate)=0;
};
#endif //__RAS_IRASTERIZER
+
diff --git a/source/gameengine/Rasterizer/RAS_IRenderTools.h b/source/gameengine/Rasterizer/RAS_IRenderTools.h
index fa3c777553d..114783b9a47 100644
--- a/source/gameengine/Rasterizer/RAS_IRenderTools.h
+++ b/source/gameengine/Rasterizer/RAS_IRenderTools.h
@@ -174,6 +174,10 @@ public:
struct RAS_LightObject* lightobject
);
+ virtual
+ void
+ MotionBlur(RAS_IRasterizer* rasterizer)=0;
+
virtual
class RAS_IPolyMaterial*
CreateBlenderPolyMaterial(
@@ -195,3 +199,4 @@ public:
#endif //__RAS_IRENDERTOOLS
+
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp
index c8ed2dd6960..26b00f02e7d 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp
@@ -108,7 +108,7 @@ static OSStatus bglInitEntryPoints (void)
// Frameworks directory/folder
err = FindFolder (kSystemDomain, kFrameworksFolderType, false,
- &fileRefParam.ioVRefNum, &fileRefParam.ioDirID);
+ &fileRefParam.ioVRefNum, (SInt32*)&fileRefParam.ioDirID);
if (noErr != err) {
DebugStr ((unsigned char *)"\pCould not find frameworks folder");
return err;
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
index 7270a6d2a99..ed4cfb2ae42 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
@@ -62,7 +62,7 @@ void RAS_ListSlot::DrawList()
}
}
if(m_list != 0)
- glNewList((GLuint)m_list, GL_COMPILE_AND_EXECUTE);
+ glNewList((GLuint)m_list, GL_COMPILE);
m_flag |= LIST_BEGIN;
return;
@@ -76,6 +76,7 @@ void RAS_ListSlot::EndList()
glEndList();
m_flag = m_flag &~(LIST_BEGIN|LIST_MODIFY);
m_flag |= LIST_END;
+ glCallList(m_list);
}
}
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
index 53ec7a02e6f..85250fcd552 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
@@ -82,7 +82,9 @@ RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* canvas)
m_setfocallength(false),
m_noOfScanlines(32),
m_useTang(false),
- m_materialCachingInfo(0)
+ m_materialCachingInfo(0),
+ m_motionblur(0),
+ m_motionblurvalue(-1.0)
{
m_viewmatrix.Identity();
@@ -1979,3 +1981,15 @@ void RAS_OpenGLRasterizer::SetPolygonOffset(float mult, float add)
else
glDisable(mode);
}
+
+void RAS_OpenGLRasterizer::EnableMotionBlur(float motionblurvalue)
+{
+ m_motionblur = 1;
+ m_motionblurvalue = motionblurvalue;
+}
+
+void RAS_OpenGLRasterizer::DisableMotionBlur()
+{
+ m_motionblur = 0;
+ m_motionblurvalue = -1.0;
+}
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
index d95ced658ce..6728905aa57 100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
@@ -91,6 +91,10 @@ class RAS_OpenGLRasterizer : public RAS_IRasterizer
int m_noOfScanlines;
bool InterlacedStereo() const;
+ //motion blur
+ int m_motionblur;
+ float m_motionblurvalue;
+
protected:
int m_drawingmode;
TexCoGen m_texco[RAS_MAX];
@@ -293,8 +297,22 @@ public:
const RAS_TexVert& v2,
const RAS_TexVert& v3,
const MT_Vector3 &no);
-
+
+ virtual void EnableMotionBlur(float motionblurvalue);
+ virtual void DisableMotionBlur();
+ virtual float GetMotionBlurValue(){return m_motionblurvalue;};
+ virtual int GetMotionBlurState(){return m_motionblur;};
+ virtual void SetMotionBlurState(int newstate)
+ {
+ if(newstate<0)
+ m_motionblur = 0;
+ else if(newstate>2)
+ m_motionblur = 2;
+ else
+ m_motionblur = newstate;
+ };
};
#endif //__RAS_OPENGLRASTERIZER
+
diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
index 039bc3db8df..039bc3db8df 100755..100644
--- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
+++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/SConscript
diff --git a/source/gameengine/Rasterizer/SConscript b/source/gameengine/Rasterizer/SConscript
index 2097540ed7e..2097540ed7e 100755..100644
--- a/source/gameengine/Rasterizer/SConscript
+++ b/source/gameengine/Rasterizer/SConscript
diff --git a/source/gameengine/SceneGraph/SConscript b/source/gameengine/SceneGraph/SConscript
index 23c1c24c297..23c1c24c297 100755..100644
--- a/source/gameengine/SceneGraph/SConscript
+++ b/source/gameengine/SceneGraph/SConscript
diff --git a/source/gameengine/SceneGraph/SG_Node.h b/source/gameengine/SceneGraph/SG_Node.h
index ef5af717d60..7ba13cc0a87 100644
--- a/source/gameengine/SceneGraph/SG_Node.h
+++ b/source/gameengine/SceneGraph/SG_Node.h
@@ -173,7 +173,7 @@ public:
void
SetSimulatedTime(
double time,
- bool resurse
+ bool recurse
);
/**
diff --git a/source/kernel/gen_messaging/intern/Makefile b/source/kernel/gen_messaging/intern/Makefile
index cd6afa19a3f..8b204800650 100644
--- a/source/kernel/gen_messaging/intern/Makefile
+++ b/source/kernel/gen_messaging/intern/Makefile
@@ -36,10 +36,6 @@ DIR = $(OCGDIR)/kernel/$(LIBNAME)
include nan_compile.mk
-ifeq ($(OS),$(findstring $(OS), "beos darwin freebsd linux openbsd solaris windows"))
- CFLAGS += -funsigned-char
-endif
-
CFLAGS += $(LEVEL_1_C_WARNINGS)
# path to our own external headerfiles
diff --git a/source/nan_compile.mk b/source/nan_compile.mk
index d356d13be42..ae2717e3b5c 100644
--- a/source/nan_compile.mk
+++ b/source/nan_compile.mk
@@ -65,8 +65,8 @@ DBG_CCFLAGS += -g
ifeq ($(OS),beos)
CC = gcc
CCC = g++
- CFLAGS += -pipe -fPIC
- CFLAGS += -pipe -fPIC
+ CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
REL_CFLAGS += -O2
REL_CCFLAGS += -O2
NAN_DEPEND = true
@@ -81,11 +81,11 @@ ifeq ($(OS),darwin)
CC = gcc
CCC = g++
ifeq ($(CPU),powerpc)
- CFLAGS += -pipe -fPIC -ffast-math -mcpu=7450 -mtune=G5
- CCFLAGS += -pipe -fPIC
+ CFLAGS += -pipe -fPIC -ffast-math -mcpu=7450 -mtune=G5 -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
else
- CFLAGS += -pipe -fPIC -ffast-math -march=pentium-m
- CCFLAGS += -pipe -fPIC
+ CFLAGS += -pipe -fPIC -ffast-math -march=pentium-m -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
endif
REL_CFLAGS += -O2
REL_CCFLAGS += -O2
@@ -103,8 +103,8 @@ ifeq ($(OS),freebsd)
CCC = g++
JAVAC = javac
JAVAH = javah
- CFLAGS += -pipe -fPIC
- CCFLAGS += -pipe -fPIC
+ CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
REL_CFLAGS += -O2
REL_CCFLAGS += -O2
CPPFLAGS += -D_THREAD_SAFE
@@ -140,8 +140,8 @@ ifeq ($(OS),linux)
CC = gcc
CCC = g++
# CFLAGS += -pipe
- CFLAGS += -pipe -fPIC
- CCFLAGS += -pipe -fPIC
+ CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
# CCFLAGS += -pipe
REL_CFLAGS += -O2
REL_CCFLAGS += -O2
@@ -158,8 +158,8 @@ endif
ifeq ($(OS),openbsd)
CC = gcc
CCC = g++
- CFLAGS += -pipe -fPIC
- CCFLAGS += -pipe -fPIC
+ CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
REL_CFLAGS += -O2
REL_CCFLAGS += -O2
NAN_DEPEND = true
@@ -173,10 +173,14 @@ endif
ifeq ($(OS),solaris)
CC = gcc
CCC = g++
+# CC = cc
+# CCC = CC
JAVAC = javac
JAVAH = javah
- CFLAGS += -pipe -fPIC
- CCFLAGS += -pipe -fPIC
+ CFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -fPIC -funsigned-char -fno-strict-aliasing
+# CFLAGS += "-fast -xdepend -xarch=v8plus -xO3 -xlibmil -KPIC -DPIC -xchar=unsigned"
+# CCFLAGS += "-fast -xdepend -xarch=v8plus -xO3 -xlibmil -xlibmopt -features=tmplife -norunpath -KPIC -DPIC -xchar=unsigned"
REL_CFLAGS += -O1
REL_CCFLAGS += -O1
NAN_DEPEND = true
@@ -197,8 +201,8 @@ ifeq ($(OS),windows)
ifeq ($(FREE_WINDOWS),true)
CC = gcc
CCC = g++
- CFLAGS += -pipe -mno-cygwin -mwindows
- CCFLAGS += -pipe -mno-cygwin -mwindows
+ CFLAGS += -pipe -mno-cygwin -mwindows -funsigned-char -fno-strict-aliasing
+ CCFLAGS += -pipe -mno-cygwin -mwindows -funsigned-char -fno-strict-aliasing
CPPFLAGS += -DFREE_WINDOWS
REL_CFLAGS += -O2
REL_CCFLAGS += -O2
diff --git a/source/nan_definitions.mk b/source/nan_definitions.mk
index efc3c050527..7fa3eb98e00 100644
--- a/source/nan_definitions.mk
+++ b/source/nan_definitions.mk
@@ -102,7 +102,7 @@ endif
else
export NAN_FTGL ?= $(LCGDIR)/ftgl
export NAN_FFMPEG ?= $(LCGDIR)/ffmpeg
- export NAN_FFMPEGLIBS ?= $(NAN_FFMPEG)/lib/libavformat.a $(NAN_FFMPEG)/lib/libavutil.a $(NAN_FFMPEG)/lib/libavcodec.a
+ export NAN_FFMPEGLIBS ?= $(NAN_FFMPEG)/lib/libavformat.a $(NAN_FFMPEG)/lib/libavcodec.a $(NAN_FFMPEG)/lib/libswscale.a $(NAN_FFMPEG)/lib/libavutil.a
export NAN_FFMPEGCFLAGS ?= -I$(NAN_FFMPEG)/include
endif
@@ -111,7 +111,7 @@ endif
endif
export WITH_OPENEXR ?= true
-
+ export WITH_DDS ?= true
ifeq ($(OS),windows)
export NAN_WINTAB ?= $(LCGDIR)/wintab
@@ -136,9 +136,9 @@ endif
else
ifeq ($(OS),linux)
ifeq ($(WITH_OPENEXR), true)
- NAN_OPENEXR?=$(shell pkg-config --variable=prefix OpenEXR )
- NAN_OPENEXR_INC?=$(shell pkg-config --cflags OpenEXR )
- NAN_OPENEXR_LIBS?=$(addprefix ${NAN_OPENEXR}/lib/lib,$(addsuffix .a,$(shell pkg-config --libs OpenEXR | sed -s "s/-l//g" )))
+ NAN_OPENEXR?=$(shell pkg-config --variable=prefix OpenEXR )
+ NAN_OPENEXR_INC?=$(shell pkg-config --cflags OpenEXR )
+ NAN_OPENEXR_LIBS?=$(addprefix ${NAN_OPENEXR}/lib/lib,$(addsuffix .a,$(shell pkg-config --libs OpenEXR | sed -s "s/-l//g" )))
endif
else
export NAN_OPENEXR ?= /usr/local
@@ -146,7 +146,7 @@ endif
endif
endif
ifeq ($(WITH_OPENEXR), true)
- export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR
+ export NAN_OPENEXR_INC ?= -I$(NAN_OPENEXR)/include -I$(NAN_OPENEXR)/include/OpenEXR
endif
endif
@@ -356,11 +356,7 @@ endif
export FREEDESKTOP ?= true
export NAN_PYTHON ?= /usr
- ifeq ($(CPU),ia64)
- export NAN_PYTHON_VERSION ?= 2.2
- else
- export NAN_PYTHON_VERSION ?= 2.3
- endif
+ export NAN_PYTHON_VERSION ?= 2.5
export NAN_PYTHON_BINARY ?= $(NAN_PYTHON)/bin/python$(NAN_PYTHON_VERSION)
export NAN_OPENAL ?= /usr
export NAN_FMOD ?= $(LCGDIR)/fmod
@@ -380,7 +376,7 @@ endif
ifneq ($(NAN_USE_FFMPEG_CONFIG), true)
export NAN_FFMPEG ?= /usr
- export NAN_FFMPEGLIBS ?= -L$(NAN_FFMPEG)/lib -lavformat -lavcodec -lavutil -ldts -lz
+ export NAN_FFMPEGLIBS ?= -L$(NAN_FFMPEG)/lib -lavformat -lavcodec -lavutil -lswscale -ldts -lz
export NAN_FFMPEGCFLAGS ?= -I$(NAN_FFMPEG)/include
endif
diff --git a/tools/Blender.py b/tools/Blender.py
index 612ab57737d..58f5ea7b661 100644
--- a/tools/Blender.py
+++ b/tools/Blender.py
@@ -191,12 +191,15 @@ def buildinfo(lenv, build_type):
"""
build_date = time.strftime ("%Y-%m-%d")
build_time = time.strftime ("%H:%M:%S")
+ build_rev = os.popen('svnversion').read()[:-1] # remove \n
+
obj = []
if lenv['BF_BUILDINFO']==1: #user_options_dict['USE_BUILDINFO'] == 1:
if sys.platform=='win32':
build_info_file = open("source/creator/winbuildinfo.h", 'w')
build_info_file.write("char *build_date=\"%s\";\n"%build_date)
build_info_file.write("char *build_time=\"%s\";\n"%build_time)
+ build_info_file.write("char *build_rev=\"%s\";\n"%build_rev)
build_info_file.write("char *build_platform=\"win32\";\n")
build_info_file.write("char *build_type=\"dynamic\";\n")
build_info_file.close()
@@ -205,6 +208,7 @@ def buildinfo(lenv, build_type):
lenv.Append (CPPDEFINES = ['BUILD_TIME=\'"%s"\''%(build_time),
'BUILD_DATE=\'"%s"\''%(build_date),
'BUILD_TYPE=\'"dynamic"\'',
+ 'BUILD_REV=\'"%s"\''%(build_rev),
'NAN_BUILDINFO',
'BUILD_PLATFORM=\'"%s"\''%(sys.platform)])
obj = [lenv.Object (root_build_dir+'source/creator/%s_buildinfo'%build_type,
@@ -328,7 +332,7 @@ def AppIt(target=None, source=None, env=None):
commands.getoutput(cmd)
cmd = 'chmod +x %s/%s.app/Contents/MacOS/%s'%(builddir,binary, binary)
commands.getoutput(cmd)
- cmd = 'find %s/%s.app -name CVS -prune -exec rm -rf {} \;'%(builddir, binary)
+ cmd = 'find %s/%s.app -name .svn -prune -exec rm -rf {} \;'%(builddir, binary)
commands.getoutput(cmd)
cmd = 'find %s/%s.app -name .DS_Store -exec rm -rf {} \;'%(builddir, binary)
commands.getoutput(cmd)
@@ -391,12 +395,13 @@ class BlenderEnvironment(SConsEnvironment):
# debug or not
# CXXFLAGS defaults to CCFLAGS, therefore
# we Replace() rather than Append() to CXXFLAGS the first time
+ lenv.Replace(CXXFLAGS = lenv['CCFLAGS'])
if lenv['BF_DEBUG'] or (libname in quickdebug):
lenv.Append(CCFLAGS = Split(lenv['BF_DEBUG_FLAGS']))
- lenv.Replace( CXXFLAGS = Split(lenv['BF_DEBUG_FLAGS']))
+ lenv.Append( CXXFLAGS = Split(lenv['BF_DEBUG_FLAGS']))
else:
lenv.Append(CCFLAGS = lenv['REL_CFLAGS'])
- lenv.Replace(CXXFLAGS = lenv['REL_CCFLAGS'])
+ lenv.Append(CXXFLAGS = lenv['REL_CCFLAGS'])
if lenv['BF_PROFILE']:
lenv.Append(CCFLAGS = Split(lenv['BF_PROFILE_FLAGS']),
CXXFLAGS = Split(lenv['BF_PROFILE_FLAGS']))
diff --git a/tools/btools.py b/tools/btools.py
index f3ad7983e74..eb8f844df4d 100755
--- a/tools/btools.py
+++ b/tools/btools.py
@@ -29,6 +29,7 @@ def validate_arguments(args, bc):
'BF_PTHREADS', 'BF_PTHREADS_INC', 'BF_PTHREADS_LIB', 'BF_PTHREADS_LIBPATH',
'WITH_BF_FMOD',
'WITH_BF_OPENEXR', 'BF_OPENEXR', 'BF_OPENEXR_INC', 'BF_OPENEXR_LIB', 'BF_OPENEXR_LIBPATH',
+ 'WITH_BF_DDS',
'WITH_BF_FFMPEG', 'BF_FFMPEG_LIB', 'BF_FFMPEG', 'BF_FFMPEG_INC',
'WITH_BF_JPEG', 'BF_JPEG', 'BF_JPEG_INC', 'BF_JPEG_LIB', 'BF_JPEG_LIBPATH',
'WITH_BF_PNG', 'BF_PNG', 'BF_PNG_INC', 'BF_PNG_LIB', 'BF_PNG_LIBPATH',
@@ -53,7 +54,8 @@ def validate_arguments(args, bc):
'BF_PROFILE_FLAGS', 'LCGDIR', 'WITH_BF_VERSE',
'BF_VERSE_INCLUDE',
'VERSE_BUILD_BINARY', 'VERSE_BUILD_DIR', 'VERSE_REGEN_PROTO',
- 'BF_TWEAK_MODE'
+ 'BF_TWEAK_MODE',
+ 'WITHOUT_BF_INSTALL'
]
arg_list = ['BF_DEBUG', 'BF_QUIET', 'BF_CROSS', 'BF_UPDATE',
@@ -162,6 +164,8 @@ def read_opts(cfg, args):
('BF_OPENEXR_LIB', 'OPENEXR library', ''),
('BF_OPENEXR_LIBPATH', 'OPENEXR library path', ''),
+ (BoolOption('WITH_BF_DDS', 'Use DDS if true', 'true')),
+
(BoolOption('WITH_BF_FFMPEG', 'Use FFMPEG if true', 'false')),
('BF_FFMPEG', 'FFMPEG base path', ''),
('BF_FFMPEG_LIB', 'FFMPEG library', ''),
@@ -293,6 +297,7 @@ def read_opts(cfg, args):
(BoolOption('BF_BUILDINFO', 'Buildtime in splash if true', 'true')),
(BoolOption('BF_TWEAK_MODE', 'Enable tweak mode if true', 'false')),
+ (BoolOption('WITHOUT_BF_INSTALL', 'dont install if true', 'false')),
) # end of opts.AddOptions()